Tizen 2.1 base tizen_2.1 2.1_release submit/tizen_2.1/20130425.071228
authorJinkun Jang <jinkun.jang@samsung.com>
Tue, 12 Mar 2013 16:51:29 +0000 (01:51 +0900)
committerJinkun Jang <jinkun.jang@samsung.com>
Tue, 12 Mar 2013 16:51:29 +0000 (01:51 +0900)
650 files changed:
ABOUT-NLS [new file with mode: 0644]
AUTHORS [new file with mode: 0644]
BUGS [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
PROJECTS [new file with mode: 0644]
README [new file with mode: 0644]
THANKS [new file with mode: 0644]
TODO [new file with mode: 0644]
VERSION [new file with mode: 0644]
acinclude.m4 [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
autogen.sh [new file with mode: 0755]
checks/ChangeLog [new file with mode: 0644]
checks/Makefile.am [new file with mode: 0644]
checks/Makefile.in [new file with mode: 0644]
checks/armdetach.test [new file with mode: 0755]
checks/armdetachm.test [new file with mode: 0755]
checks/armencrypt.test [new file with mode: 0755]
checks/armencryptp.test [new file with mode: 0755]
checks/armor.test [new file with mode: 0755]
checks/armsignencrypt.test [new file with mode: 0755]
checks/armsigs.test [new file with mode: 0755]
checks/clearsig.test [new file with mode: 0755]
checks/conventional-mdc.test [new file with mode: 0755]
checks/conventional.test [new file with mode: 0755]
checks/decrypt-dsa.test [new file with mode: 0755]
checks/decrypt.test [new file with mode: 0755]
checks/defs.inc [new file with mode: 0755]
checks/detach.test [new file with mode: 0755]
checks/detachm.test [new file with mode: 0755]
checks/encrypt-dsa.test [new file with mode: 0755]
checks/encrypt.test [new file with mode: 0755]
checks/encryptp.test [new file with mode: 0755]
checks/genkey1024.test [new file with mode: 0755]
checks/mds.test [new file with mode: 0755]
checks/mkdemodirs [new file with mode: 0755]
checks/multisig.test [new file with mode: 0755]
checks/options [new file with mode: 0644]
checks/plain-1-pgp.asc [new file with mode: 0644]
checks/plain-1.asc [new file with mode: 0644]
checks/plain-1o.asc [new file with mode: 0644]
checks/plain-2.asc [new file with mode: 0644]
checks/plain-2o.asc [new file with mode: 0644]
checks/plain-3.asc [new file with mode: 0644]
checks/plain-3o.asc [new file with mode: 0644]
checks/pubdemo.asc [new file with mode: 0644]
checks/pubring.asc [new file with mode: 0644]
checks/pubring.pkr.asc [new file with mode: 0644]
checks/seat.test [new file with mode: 0755]
checks/secdemo.asc [new file with mode: 0644]
checks/secring.asc [new file with mode: 0644]
checks/secring.skr.asc [new file with mode: 0644]
checks/signdemokey [new file with mode: 0755]
checks/signencrypt-dsa.test [new file with mode: 0755]
checks/signencrypt.test [new file with mode: 0755]
checks/sigs-dsa.test [new file with mode: 0755]
checks/sigs.test [new file with mode: 0755]
checks/verify.test [new file with mode: 0755]
checks/version.test [new file with mode: 0755]
cipher/ChangeLog [new file with mode: 0644]
cipher/Makefile.am [new file with mode: 0644]
cipher/Makefile.in [new file with mode: 0644]
cipher/algorithms.h [new file with mode: 0644]
cipher/bithelp.h [new file with mode: 0644]
cipher/blowfish.c [new file with mode: 0644]
cipher/cast5.c [new file with mode: 0644]
cipher/cipher.c [new file with mode: 0644]
cipher/des.c [new file with mode: 0644]
cipher/dsa.c [new file with mode: 0644]
cipher/dsa.h [new file with mode: 0644]
cipher/dynload.c [new file with mode: 0644]
cipher/elgamal.c [new file with mode: 0644]
cipher/elgamal.h [new file with mode: 0644]
cipher/idea-stub.c [new file with mode: 0644]
cipher/md.c [new file with mode: 0644]
cipher/md5.c [new file with mode: 0644]
cipher/primegen.c [new file with mode: 0644]
cipher/pubkey.c [new file with mode: 0644]
cipher/rand-internal.h [new file with mode: 0644]
cipher/random.c [new file with mode: 0644]
cipher/random.h [new file with mode: 0644]
cipher/rijndael.c [new file with mode: 0644]
cipher/rmd.h [new file with mode: 0644]
cipher/rmd160.c [new file with mode: 0644]
cipher/rndegd.c [new file with mode: 0644]
cipher/rndlinux.c [new file with mode: 0644]
cipher/rndunix.c [new file with mode: 0644]
cipher/rndw32.c [new file with mode: 0644]
cipher/rsa.c [new file with mode: 0644]
cipher/rsa.h [new file with mode: 0644]
cipher/sha1.c [new file with mode: 0644]
cipher/sha256.c [new file with mode: 0644]
cipher/sha512.c [new file with mode: 0644]
cipher/smallprime.c [new file with mode: 0644]
cipher/twofish.c [new file with mode: 0644]
config.h.in [new file with mode: 0644]
configure [new file with mode: 0755]
configure.ac [new file with mode: 0644]
debian/README.Debian [new file with mode: 0644]
debian/Upgrading_From_PGP.txt [new file with mode: 0644]
debian/changelog [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/gpg-convert-from-106.1 [new file with mode: 0644]
debian/gpgsplit.1 [new file with mode: 0644]
debian/lspgpot.1 [new file with mode: 0644]
debian/patches/00list [new file with mode: 0644]
debian/patches/15_free_caps.dpatch [new file with mode: 0644]
debian/patches/16_min_privileges.dpatch [new file with mode: 0644]
debian/patches/24_gpgv_manpage_cleanup.dpatch [new file with mode: 0644]
debian/patches/25_de.po_fixes.dpatch [new file with mode: 0644]
debian/patches/28_multiple_message.dpatch [new file with mode: 0644]
debian/preinst [new file with mode: 0644]
debian/rules [new file with mode: 0755]
doc/ChangeLog [new file with mode: 0644]
doc/DETAILS [new file with mode: 0644]
doc/FAQ [new file with mode: 0644]
doc/HACKING [new file with mode: 0644]
doc/Makefile.am [new file with mode: 0644]
doc/Makefile.in [new file with mode: 0644]
doc/OpenPGP [new file with mode: 0644]
doc/README.W32 [new file with mode: 0644]
doc/TRANSLATE [new file with mode: 0644]
doc/faq.html [new file with mode: 0644]
doc/faq.raw [new file with mode: 0644]
doc/gnupg.7 [new file with mode: 0644]
doc/gnupg1.info [new file with mode: 0644]
doc/gnupg1.texi [new file with mode: 0644]
doc/gpg.ru.1 [new file with mode: 0644]
doc/gpg.ru.sgml [new file with mode: 0644]
doc/gpg.texi [new file with mode: 0644]
doc/gpgv.texi [new file with mode: 0644]
doc/gpl.texi [new file with mode: 0644]
doc/highlights-1.4.txt [new file with mode: 0644]
doc/opt-homedir.texi [new file with mode: 0644]
doc/samplekeys.asc [new file with mode: 0644]
doc/see-also-note.texi [new file with mode: 0644]
doc/specify-user-id.texi [new file with mode: 0644]
doc/stamp-vti [new file with mode: 0644]
doc/texi.css [new file with mode: 0644]
doc/version.texi [new file with mode: 0644]
doc/yat2m.c [new file with mode: 0644]
g10/ChangeLog [new file with mode: 0644]
g10/Makefile.am [new file with mode: 0644]
g10/Makefile.in [new file with mode: 0644]
g10/apdu.c [new file with mode: 0644]
g10/apdu.h [new file with mode: 0644]
g10/app-common.h [new file with mode: 0644]
g10/app-openpgp.c [new file with mode: 0644]
g10/armor.c [new file with mode: 0644]
g10/build-packet.c [new file with mode: 0644]
g10/card-util.c [new file with mode: 0644]
g10/cardglue.c [new file with mode: 0644]
g10/cardglue.h [new file with mode: 0644]
g10/ccid-driver.c [new file with mode: 0644]
g10/ccid-driver.h [new file with mode: 0644]
g10/cipher.c [new file with mode: 0644]
g10/compress-bz2.c [new file with mode: 0644]
g10/compress.c [new file with mode: 0644]
g10/dearmor.c [new file with mode: 0644]
g10/decrypt.c [new file with mode: 0644]
g10/delkey.c [new file with mode: 0644]
g10/encode.c [new file with mode: 0644]
g10/encr-data.c [new file with mode: 0644]
g10/exec.c [new file with mode: 0644]
g10/exec.h [new file with mode: 0644]
g10/export.c [new file with mode: 0644]
g10/filter.h [new file with mode: 0644]
g10/free-packet.c [new file with mode: 0644]
g10/getkey.c [new file with mode: 0644]
g10/global.h [new file with mode: 0644]
g10/gpg.c [new file with mode: 0644]
g10/gpgv.c [new file with mode: 0644]
g10/helptext.c [new file with mode: 0644]
g10/import.c [new file with mode: 0644]
g10/iso7816.c [new file with mode: 0644]
g10/iso7816.h [new file with mode: 0644]
g10/kbnode.c [new file with mode: 0644]
g10/keydb.c [new file with mode: 0644]
g10/keydb.h [new file with mode: 0644]
g10/keyedit.c [new file with mode: 0644]
g10/keygen.c [new file with mode: 0644]
g10/keyid.c [new file with mode: 0644]
g10/keylist.c [new file with mode: 0644]
g10/keyring.c [new file with mode: 0644]
g10/keyring.h [new file with mode: 0644]
g10/keyserver-internal.h [new file with mode: 0644]
g10/keyserver.c [new file with mode: 0644]
g10/main.h [new file with mode: 0644]
g10/mainproc.c [new file with mode: 0644]
g10/mdfilter.c [new file with mode: 0644]
g10/misc.c [new file with mode: 0644]
g10/openfile.c [new file with mode: 0644]
g10/options.h [new file with mode: 0644]
g10/options.skel [new file with mode: 0644]
g10/packet.h [new file with mode: 0644]
g10/parse-packet.c [new file with mode: 0644]
g10/passphrase.c [new file with mode: 0644]
g10/photoid.c [new file with mode: 0644]
g10/photoid.h [new file with mode: 0644]
g10/pipemode.c [new file with mode: 0644]
g10/pkclist.c [new file with mode: 0644]
g10/plaintext.c [new file with mode: 0644]
g10/progress.c [new file with mode: 0644]
g10/pubkey-enc.c [new file with mode: 0644]
g10/revoke.c [new file with mode: 0644]
g10/seckey-cert.c [new file with mode: 0644]
g10/seskey.c [new file with mode: 0644]
g10/sig-check.c [new file with mode: 0644]
g10/sign.c [new file with mode: 0644]
g10/signal.c [new file with mode: 0644]
g10/skclist.c [new file with mode: 0644]
g10/status.c [new file with mode: 0644]
g10/status.h [new file with mode: 0644]
g10/tdbdump.c [new file with mode: 0644]
g10/tdbio.c [new file with mode: 0644]
g10/tdbio.h [new file with mode: 0644]
g10/textfilter.c [new file with mode: 0644]
g10/tlv.c [new file with mode: 0644]
g10/tlv.h [new file with mode: 0644]
g10/trustdb.c [new file with mode: 0644]
g10/trustdb.h [new file with mode: 0644]
g10/verify.c [new file with mode: 0644]
gnupg.spec [new file with mode: 0644]
include/ChangeLog [new file with mode: 0644]
include/_regex.h [new file with mode: 0644]
include/assuan.h [new file with mode: 0644]
include/cipher.h [new file with mode: 0644]
include/compat.h [new file with mode: 0644]
include/distfiles [new file with mode: 0644]
include/dynload.h [new file with mode: 0644]
include/errors.h [new file with mode: 0644]
include/host2net.h [new file with mode: 0644]
include/http.h [new file with mode: 0644]
include/i18n.h [new file with mode: 0644]
include/iobuf.h [new file with mode: 0644]
include/keyserver.h [new file with mode: 0644]
include/memory.h [new file with mode: 0644]
include/mpi.h [new file with mode: 0644]
include/ttyio.h [new file with mode: 0644]
include/types.h [new file with mode: 0644]
include/util.h [new file with mode: 0644]
intl/ChangeLog [new file with mode: 0644]
intl/Makefile.in [new file with mode: 0644]
intl/VERSION [new file with mode: 0644]
intl/bindtextdom.c [new file with mode: 0644]
intl/config.charset [new file with mode: 0755]
intl/dcgettext.c [new file with mode: 0644]
intl/dcigettext.c [new file with mode: 0644]
intl/dcngettext.c [new file with mode: 0644]
intl/dgettext.c [new file with mode: 0644]
intl/dngettext.c [new file with mode: 0644]
intl/eval-plural.h [new file with mode: 0644]
intl/explodename.c [new file with mode: 0644]
intl/finddomain.c [new file with mode: 0644]
intl/gettext.c [new file with mode: 0644]
intl/gettextP.h [new file with mode: 0644]
intl/gmo.h [new file with mode: 0644]
intl/hash-string.h [new file with mode: 0644]
intl/intl-compat.c [new file with mode: 0644]
intl/l10nflist.c [new file with mode: 0644]
intl/libgnuintl.h.in [new file with mode: 0644]
intl/loadinfo.h [new file with mode: 0644]
intl/loadmsgcat.c [new file with mode: 0644]
intl/localcharset.c [new file with mode: 0644]
intl/localcharset.h [new file with mode: 0644]
intl/locale.alias [new file with mode: 0644]
intl/localealias.c [new file with mode: 0644]
intl/localename.c [new file with mode: 0644]
intl/log.c [new file with mode: 0644]
intl/ngettext.c [new file with mode: 0644]
intl/os2compat.c [new file with mode: 0644]
intl/os2compat.h [new file with mode: 0644]
intl/osdep.c [new file with mode: 0644]
intl/plural-exp.c [new file with mode: 0644]
intl/plural-exp.h [new file with mode: 0644]
intl/plural.c [new file with mode: 0644]
intl/plural.y [new file with mode: 0644]
intl/printf-args.c [new file with mode: 0644]
intl/printf-args.h [new file with mode: 0644]
intl/printf-parse.c [new file with mode: 0644]
intl/printf-parse.h [new file with mode: 0644]
intl/printf.c [new file with mode: 0644]
intl/ref-add.sin [new file with mode: 0644]
intl/ref-del.sin [new file with mode: 0644]
intl/relocatable.c [new file with mode: 0644]
intl/relocatable.h [new file with mode: 0644]
intl/textdomain.c [new file with mode: 0644]
intl/vasnprintf.c [new file with mode: 0644]
intl/vasnprintf.h [new file with mode: 0644]
intl/vasnwprintf.h [new file with mode: 0644]
intl/wprintf-parse.h [new file with mode: 0644]
intl/xsize.h [new file with mode: 0644]
keyserver/ChangeLog [new file with mode: 0644]
keyserver/Makefile.am [new file with mode: 0644]
keyserver/Makefile.in [new file with mode: 0644]
keyserver/curl-shim.c [new file with mode: 0644]
keyserver/curl-shim.h [new file with mode: 0644]
keyserver/gpgkeys_curl.c [new file with mode: 0644]
keyserver/gpgkeys_finger.c [new file with mode: 0644]
keyserver/gpgkeys_hkp.c [new file with mode: 0644]
keyserver/gpgkeys_ldap.c [new file with mode: 0644]
keyserver/gpgkeys_mailto.in [new file with mode: 0755]
keyserver/gpgkeys_test.in [new file with mode: 0755]
keyserver/ksutil.c [new file with mode: 0644]
keyserver/ksutil.h [new file with mode: 0644]
m4/ChangeLog [new file with mode: 0644]
m4/Makefile.am [new file with mode: 0644]
m4/Makefile.in [new file with mode: 0644]
m4/autobuild.m4 [new file with mode: 0644]
m4/codeset.m4 [new file with mode: 0644]
m4/gettext.m4 [new file with mode: 0644]
m4/glibc21.m4 [new file with mode: 0644]
m4/iconv.m4 [new file with mode: 0644]
m4/intdiv0.m4 [new file with mode: 0644]
m4/intmax.m4 [new file with mode: 0644]
m4/inttypes-pri.m4 [new file with mode: 0644]
m4/inttypes.m4 [new file with mode: 0644]
m4/inttypes_h.m4 [new file with mode: 0644]
m4/isc-posix.m4 [new file with mode: 0644]
m4/lcmessage.m4 [new file with mode: 0644]
m4/ldap.m4 [new file with mode: 0644]
m4/lib-ld.m4 [new file with mode: 0644]
m4/lib-link.m4 [new file with mode: 0644]
m4/lib-prefix.m4 [new file with mode: 0644]
m4/libcurl.m4 [new file with mode: 0644]
m4/libusb.m4 [new file with mode: 0644]
m4/longdouble.m4 [new file with mode: 0644]
m4/longlong.m4 [new file with mode: 0644]
m4/nls.m4 [new file with mode: 0644]
m4/noexecstack.m4 [new file with mode: 0644]
m4/po.m4 [new file with mode: 0644]
m4/printf-posix.m4 [new file with mode: 0644]
m4/progtest.m4 [new file with mode: 0644]
m4/readline.m4 [new file with mode: 0644]
m4/signed.m4 [new file with mode: 0644]
m4/size_max.m4 [new file with mode: 0644]
m4/stdint_h.m4 [new file with mode: 0644]
m4/tar-ustar.m4 [new file with mode: 0644]
m4/uintmax_t.m4 [new file with mode: 0644]
m4/ulonglong.m4 [new file with mode: 0644]
m4/wchar_t.m4 [new file with mode: 0644]
m4/wint_t.m4 [new file with mode: 0644]
m4/xsize.m4 [new file with mode: 0644]
mpi/ChangeLog [new file with mode: 0644]
mpi/Makefile.am [new file with mode: 0644]
mpi/Makefile.in [new file with mode: 0644]
mpi/alpha/README [new file with mode: 0644]
mpi/alpha/distfiles [new file with mode: 0644]
mpi/alpha/mpih-add1.S [new file with mode: 0644]
mpi/alpha/mpih-lshift.S [new file with mode: 0644]
mpi/alpha/mpih-mul1.S [new file with mode: 0644]
mpi/alpha/mpih-mul2.S [new file with mode: 0644]
mpi/alpha/mpih-mul3.S [new file with mode: 0644]
mpi/alpha/mpih-rshift.S [new file with mode: 0644]
mpi/alpha/mpih-sub1.S [new file with mode: 0644]
mpi/alpha/udiv-qrnnd.S [new file with mode: 0644]
mpi/config.links [new file with mode: 0644]
mpi/generic/distfiles [new file with mode: 0644]
mpi/generic/mpi-asm-defs.h [new file with mode: 0644]
mpi/generic/mpih-add1.c [new file with mode: 0644]
mpi/generic/mpih-lshift.c [new file with mode: 0644]
mpi/generic/mpih-mul1.c [new file with mode: 0644]
mpi/generic/mpih-mul2.c [new file with mode: 0644]
mpi/generic/mpih-mul3.c [new file with mode: 0644]
mpi/generic/mpih-rshift.c [new file with mode: 0644]
mpi/generic/mpih-sub1.c [new file with mode: 0644]
mpi/generic/udiv-w-sdiv.c [new file with mode: 0644]
mpi/hppa/README [new file with mode: 0644]
mpi/hppa/distfiles [new file with mode: 0644]
mpi/hppa/mpih-add1.S [new file with mode: 0644]
mpi/hppa/mpih-lshift.S [new file with mode: 0644]
mpi/hppa/mpih-rshift.S [new file with mode: 0644]
mpi/hppa/mpih-sub1.S [new file with mode: 0644]
mpi/hppa/udiv-qrnnd.S [new file with mode: 0644]
mpi/hppa1.1/distfiles [new file with mode: 0644]
mpi/hppa1.1/mpih-mul1.S [new file with mode: 0644]
mpi/hppa1.1/mpih-mul2.S [new file with mode: 0644]
mpi/hppa1.1/mpih-mul3.S [new file with mode: 0644]
mpi/hppa1.1/udiv-qrnnd.S [new file with mode: 0644]
mpi/i386/distfiles [new file with mode: 0644]
mpi/i386/mpih-add1.S [new file with mode: 0644]
mpi/i386/mpih-lshift.S [new file with mode: 0644]
mpi/i386/mpih-mul1.S [new file with mode: 0644]
mpi/i386/mpih-mul2.S [new file with mode: 0644]
mpi/i386/mpih-mul3.S [new file with mode: 0644]
mpi/i386/mpih-rshift.S [new file with mode: 0644]
mpi/i386/mpih-sub1.S [new file with mode: 0644]
mpi/i386/syntax.h [new file with mode: 0644]
mpi/i586/README [new file with mode: 0644]
mpi/i586/distfiles [new file with mode: 0644]
mpi/i586/mpih-add1.S [new file with mode: 0644]
mpi/i586/mpih-lshift.S [new file with mode: 0644]
mpi/i586/mpih-mul1.S [new file with mode: 0644]
mpi/i586/mpih-mul2.S [new file with mode: 0644]
mpi/i586/mpih-mul3.S [new file with mode: 0644]
mpi/i586/mpih-rshift.S [new file with mode: 0644]
mpi/i586/mpih-sub1.S [new file with mode: 0644]
mpi/longlong.h [new file with mode: 0644]
mpi/m68k/distfiles [new file with mode: 0644]
mpi/m68k/mc68020/distfiles [new file with mode: 0644]
mpi/m68k/mc68020/mpih-mul1.S [new file with mode: 0644]
mpi/m68k/mc68020/mpih-mul2.S [new file with mode: 0644]
mpi/m68k/mc68020/mpih-mul3.S [new file with mode: 0644]
mpi/m68k/mpih-add1.S [new file with mode: 0644]
mpi/m68k/mpih-lshift.S [new file with mode: 0644]
mpi/m68k/mpih-rshift.S [new file with mode: 0644]
mpi/m68k/mpih-sub1.S [new file with mode: 0644]
mpi/m68k/syntax.h [new file with mode: 0644]
mpi/mips3/README [new file with mode: 0644]
mpi/mips3/distfiles [new file with mode: 0644]
mpi/mips3/mpi-asm-defs.h [new file with mode: 0644]
mpi/mips3/mpih-add1.S [new file with mode: 0644]
mpi/mips3/mpih-lshift.S [new file with mode: 0644]
mpi/mips3/mpih-mul1.S [new file with mode: 0644]
mpi/mips3/mpih-mul2.S [new file with mode: 0644]
mpi/mips3/mpih-mul3.S [new file with mode: 0644]
mpi/mips3/mpih-rshift.S [new file with mode: 0644]
mpi/mips3/mpih-sub1.S [new file with mode: 0644]
mpi/mpi-add.c [new file with mode: 0644]
mpi/mpi-bit.c [new file with mode: 0644]
mpi/mpi-cmp.c [new file with mode: 0644]
mpi/mpi-div.c [new file with mode: 0644]
mpi/mpi-gcd.c [new file with mode: 0644]
mpi/mpi-inline.c [new file with mode: 0644]
mpi/mpi-inline.h [new file with mode: 0644]
mpi/mpi-internal.h [new file with mode: 0644]
mpi/mpi-inv.c [new file with mode: 0644]
mpi/mpi-mpow.c [new file with mode: 0644]
mpi/mpi-mul.c [new file with mode: 0644]
mpi/mpi-pow.c [new file with mode: 0644]
mpi/mpi-scan.c [new file with mode: 0644]
mpi/mpicoder.c [new file with mode: 0644]
mpi/mpih-cmp.c [new file with mode: 0644]
mpi/mpih-div.c [new file with mode: 0644]
mpi/mpih-mul.c [new file with mode: 0644]
mpi/mpiutil.c [new file with mode: 0644]
mpi/pa7100/distfiles [new file with mode: 0644]
mpi/pa7100/mpih-lshift.S [new file with mode: 0644]
mpi/pa7100/mpih-rshift.S [new file with mode: 0644]
mpi/power/distfiles [new file with mode: 0644]
mpi/power/mpih-add1.S [new file with mode: 0644]
mpi/power/mpih-lshift.S [new file with mode: 0644]
mpi/power/mpih-mul1.S [new file with mode: 0644]
mpi/power/mpih-mul2.S [new file with mode: 0644]
mpi/power/mpih-mul3.S [new file with mode: 0644]
mpi/power/mpih-rshift.S [new file with mode: 0644]
mpi/power/mpih-sub1.S [new file with mode: 0644]
mpi/powerpc32/distfiles [new file with mode: 0644]
mpi/powerpc32/mpih-add1.S [new file with mode: 0644]
mpi/powerpc32/mpih-lshift.S [new file with mode: 0644]
mpi/powerpc32/mpih-mul1.S [new file with mode: 0644]
mpi/powerpc32/mpih-mul2.S [new file with mode: 0644]
mpi/powerpc32/mpih-mul3.S [new file with mode: 0644]
mpi/powerpc32/mpih-rshift.S [new file with mode: 0644]
mpi/powerpc32/mpih-sub1.S [new file with mode: 0644]
mpi/powerpc32/syntax.h [new file with mode: 0644]
mpi/powerpc64/distfiles [new file with mode: 0644]
mpi/sparc32/distfiles [new file with mode: 0644]
mpi/sparc32/mpih-add1.S [new file with mode: 0644]
mpi/sparc32/mpih-lshift.S [new file with mode: 0644]
mpi/sparc32/mpih-rshift.S [new file with mode: 0644]
mpi/sparc32/udiv.S [new file with mode: 0644]
mpi/sparc32v8/distfiles [new file with mode: 0644]
mpi/sparc32v8/mpih-mul1.S [new file with mode: 0644]
mpi/sparc32v8/mpih-mul2.S [new file with mode: 0644]
mpi/sparc32v8/mpih-mul3.S [new file with mode: 0644]
mpi/supersparc/distfiles [new file with mode: 0644]
mpi/supersparc/udiv.S [new file with mode: 0644]
po/ChangeLog [new file with mode: 0644]
po/LINGUAS [new file with mode: 0644]
po/Makefile.in.in [new file with mode: 0644]
po/Makevars [new file with mode: 0644]
po/POTFILES.in [new file with mode: 0644]
po/Rules-quot [new file with mode: 0644]
po/be.gmo [new file with mode: 0644]
po/be.po [new file with mode: 0644]
po/boldquot.sed [new file with mode: 0644]
po/ca.gmo [new file with mode: 0644]
po/ca.po [new file with mode: 0644]
po/cs.gmo [new file with mode: 0644]
po/cs.po [new file with mode: 0644]
po/da.gmo [new file with mode: 0644]
po/da.po [new file with mode: 0644]
po/de.gmo [new file with mode: 0644]
po/de.po [new file with mode: 0644]
po/el.gmo [new file with mode: 0644]
po/el.po [new file with mode: 0644]
po/en@boldquot.gmo [new file with mode: 0644]
po/en@boldquot.header [new file with mode: 0644]
po/en@boldquot.po [new file with mode: 0644]
po/en@quot.gmo [new file with mode: 0644]
po/en@quot.header [new file with mode: 0644]
po/en@quot.po [new file with mode: 0644]
po/eo.gmo [new file with mode: 0644]
po/eo.po [new file with mode: 0644]
po/es.gmo [new file with mode: 0644]
po/es.po [new file with mode: 0644]
po/et.gmo [new file with mode: 0644]
po/et.po [new file with mode: 0644]
po/fi.gmo [new file with mode: 0644]
po/fi.po [new file with mode: 0644]
po/fr.gmo [new file with mode: 0644]
po/fr.po [new file with mode: 0644]
po/gl.gmo [new file with mode: 0644]
po/gl.po [new file with mode: 0644]
po/gnupg.pot [new file with mode: 0644]
po/hu.gmo [new file with mode: 0644]
po/hu.po [new file with mode: 0644]
po/id.gmo [new file with mode: 0644]
po/id.po [new file with mode: 0644]
po/insert-header.sin [new file with mode: 0644]
po/it.gmo [new file with mode: 0644]
po/it.po [new file with mode: 0644]
po/ja.gmo [new file with mode: 0644]
po/ja.po [new file with mode: 0644]
po/nb.gmo [new file with mode: 0644]
po/nb.po [new file with mode: 0644]
po/pl.gmo [new file with mode: 0644]
po/pl.po [new file with mode: 0644]
po/pt.gmo [new file with mode: 0644]
po/pt.po [new file with mode: 0644]
po/pt_BR.gmo [new file with mode: 0644]
po/pt_BR.po [new file with mode: 0644]
po/quot.sed [new file with mode: 0644]
po/remove-potcdate.sin [new file with mode: 0644]
po/ro.gmo [new file with mode: 0644]
po/ro.po [new file with mode: 0644]
po/ru.gmo [new file with mode: 0644]
po/ru.po [new file with mode: 0644]
po/sk.gmo [new file with mode: 0644]
po/sk.po [new file with mode: 0644]
po/stamp-po [new file with mode: 0644]
po/sv.gmo [new file with mode: 0644]
po/sv.po [new file with mode: 0644]
po/tr.gmo [new file with mode: 0644]
po/tr.po [new file with mode: 0644]
po/zh_CN.gmo [new file with mode: 0644]
po/zh_CN.po [new file with mode: 0644]
po/zh_TW.gmo [new file with mode: 0644]
po/zh_TW.po [new file with mode: 0644]
scripts/ChangeLog [new file with mode: 0644]
scripts/autogen.sh [new file with mode: 0755]
scripts/build-w32 [new file with mode: 0755]
scripts/compile [new file with mode: 0755]
scripts/config.guess [new file with mode: 0755]
scripts/config.rpath [new file with mode: 0755]
scripts/config.sub [new file with mode: 0755]
scripts/depcomp [new file with mode: 0755]
scripts/distfiles [new file with mode: 0644]
scripts/gnupg.spec.in [new file with mode: 0644]
scripts/install-sh [new file with mode: 0755]
scripts/mdate-sh [new file with mode: 0755]
scripts/missing [new file with mode: 0755]
scripts/mk-w32-dist [new file with mode: 0755]
scripts/mkdiff [new file with mode: 0755]
scripts/mkinstalldirs [new file with mode: 0755]
scripts/texinfo.tex [new file with mode: 0644]
scripts/w32installer.nsi [new file with mode: 0644]
tools/ChangeLog [new file with mode: 0644]
tools/Makefile.am [new file with mode: 0644]
tools/Makefile.in [new file with mode: 0644]
tools/bftest.c [new file with mode: 0644]
tools/clean-sat.c [new file with mode: 0644]
tools/convert-from-106 [new file with mode: 0755]
tools/gpg-zip.in [new file with mode: 0644]
tools/gpgsplit.c [new file with mode: 0644]
tools/lspgpot [new file with mode: 0755]
tools/mail-signed-keys [new file with mode: 0755]
tools/make-dns-cert.c [new file with mode: 0644]
tools/mk-tdata.c [new file with mode: 0644]
tools/mpicalc.c [new file with mode: 0644]
tools/ring-a-party [new file with mode: 0755]
tools/shmtest.c [new file with mode: 0644]
util/ChangeLog [new file with mode: 0644]
util/Makefile.am [new file with mode: 0644]
util/Makefile.in [new file with mode: 0644]
util/argparse.c [new file with mode: 0644]
util/assuan-buffer.c [new file with mode: 0644]
util/assuan-client.c [new file with mode: 0644]
util/assuan-connect.c [new file with mode: 0644]
util/assuan-defs.h [new file with mode: 0644]
util/assuan-errors.c [new file with mode: 0644]
util/assuan-logging.c [new file with mode: 0644]
util/assuan-socket-connect.c [new file with mode: 0644]
util/assuan-socket.c [new file with mode: 0644]
util/assuan-util.c [new file with mode: 0644]
util/cert.c [new file with mode: 0644]
util/compat.c [new file with mode: 0644]
util/dotlock.c [new file with mode: 0644]
util/errors.c [new file with mode: 0644]
util/fileutil.c [new file with mode: 0644]
util/http.c [new file with mode: 0644]
util/iobuf.c [new file with mode: 0644]
util/isascii.c [new file with mode: 0644]
util/logger.c [new file with mode: 0644]
util/membuf.c [new file with mode: 0644]
util/memory.c [new file with mode: 0644]
util/memrchr.c [new file with mode: 0644]
util/miscutil.c [new file with mode: 0644]
util/mkdtemp.c [new file with mode: 0644]
util/pka.c [new file with mode: 0644]
util/regcomp.c [new file with mode: 0644]
util/regex.c [new file with mode: 0644]
util/regex_internal.c [new file with mode: 0644]
util/regex_internal.h [new file with mode: 0644]
util/regexec.c [new file with mode: 0644]
util/secmem.c [new file with mode: 0644]
util/simple-gettext.c [new file with mode: 0644]
util/srv.c [new file with mode: 0644]
util/srv.h [new file with mode: 0644]
util/strgutil.c [new file with mode: 0644]
util/strsep.c [new file with mode: 0644]
util/timegm.c [new file with mode: 0644]
util/ttyio.c [new file with mode: 0644]
util/w32reg.c [new file with mode: 0644]
zlib/ChangeLog [new file with mode: 0644]
zlib/Makefile.am [new file with mode: 0644]
zlib/Makefile.in [new file with mode: 0644]
zlib/README [new file with mode: 0644]
zlib/adler32.c [new file with mode: 0644]
zlib/algorithm.doc [new file with mode: 0644]
zlib/compress.c [new file with mode: 0644]
zlib/crc32.c [new file with mode: 0644]
zlib/deflate.c [new file with mode: 0644]
zlib/deflate.h [new file with mode: 0644]
zlib/infblock.c [new file with mode: 0644]
zlib/infblock.h [new file with mode: 0644]
zlib/infcodes.c [new file with mode: 0644]
zlib/infcodes.h [new file with mode: 0644]
zlib/inffast.c [new file with mode: 0644]
zlib/inffast.h [new file with mode: 0644]
zlib/inffixed.h [new file with mode: 0644]
zlib/inflate.c [new file with mode: 0644]
zlib/inftrees.c [new file with mode: 0644]
zlib/inftrees.h [new file with mode: 0644]
zlib/infutil.c [new file with mode: 0644]
zlib/infutil.h [new file with mode: 0644]
zlib/trees.c [new file with mode: 0644]
zlib/trees.h [new file with mode: 0644]
zlib/uncompr.c [new file with mode: 0644]
zlib/zconf.h [new file with mode: 0644]
zlib/zlib.h [new file with mode: 0644]
zlib/zutil.c [new file with mode: 0644]
zlib/zutil.h [new file with mode: 0644]

diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644 (file)
index 0000000..dd2659f
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,769 @@
+Notes on the Free Translation Project
+*************************************
+
+Free software is going international!  The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages.  A few packages already provide translations for their
+messages.
+
+   If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site.  But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+   Installers will find here some useful hints.  These notes also
+explain how users should proceed for getting the programs to use the
+available translations.  They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+   When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used.  The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+Quick configuration advice
+==========================
+
+If you want to exploit the full power of internationalization, you
+should configure it using
+
+     ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed.  So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation.  Future versions of GNU `gettext' will
+very likely convey even more functionality.  So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+   So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language.  Most such
+packages use GNU `gettext'.  Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+   By default, this package will be installed to allow translation of
+messages.  It will automatically detect whether the system already
+provides the GNU `gettext' functions.  If not, the included GNU
+`gettext' library will be used.  This library is wholly contained
+within this package, usually in the `intl/' subdirectory, so prior
+installation of the GNU `gettext' package is _not_ required.
+Installers may use special options at configuration time for changing
+the default behaviour.  The commands:
+
+     ./configure --with-included-gettext
+     ./configure --disable-nls
+
+will, respectively, bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+   When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this.  This might not be desirable.  You should use
+the more recent version of the GNU `gettext' library.  I.e. if the file
+`intl/VERSION' shows that the library which comes with this package is
+more recent, you should use
+
+     ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+   The configuration process will not test for the `catgets' function
+and therefore it will not be used.  The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+   Internationalized packages usually have many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language.  Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package.  However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination.  Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code.  For example, let's
+suppose that you speak German and live in Germany.  At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+   You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries.  For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil.  The
+country code serves to distinguish the dialects.
+
+   The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc.  On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'.  You can get the list of
+locales supported by your system for your country by running the command
+`locale -a | grep '^LL''.
+
+   Not all programs have translations for all languages.  By default, an
+English message is shown in place of a nonexistent translation.  If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'.  GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries.  For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+   Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003).  During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+   In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect.  For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+Translating Teams
+=================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list.  The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+   If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended.  For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+     subscribe
+
+   Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around.  If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+   The English team is special.  It works at improving and uniformizing
+the terminology in use.  Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+Languages are not equally supported in all packages.  The following
+matrix shows the current state of internationalization, as of January
+2004.  The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+     Ready PO files       af am ar az be bg bs ca cs da de el en en_GB eo es
+                        +----------------------------------------------------+
+     a2ps               |             []             [] [] []                |
+     aegis              |                               ()                   |
+     ant-phone          |                               ()                   |
+     anubis             |                                                    |
+     ap-utils           |                                                    |
+     aspell             |             []                                     |
+     bash               |                      []       []             [] [] |
+     batchelor          |                                                    |
+     bfd                |                            []                   [] |
+     binutils           |                            []                   [] |
+     bison              |                            [] []                [] |
+     bluez-pin          | []                      []                   []    |
+     clisp              |                                                    |
+     clisp              |                               []    []          [] |
+     console-tools      |                         []    []                   |
+     coreutils          |                      []    [] []                [] |
+     cpio               |                            [] []                [] |
+     darkstat           |                []          ()                   [] |
+     diffutils          |                      [] [] [] [] []          [] [] |
+     e2fsprogs          |                         []    []                [] |
+     enscript           |                      []    [] []        []         |
+     error              |                      []    [] []        []      [] |
+     fetchmail          |                      [] () [] [] []             [] |
+     fileutils          |                            [] []                [] |
+     findutils          |             []       []    [] [] []          [] [] |
+     flex               |                      []    [] []                [] |
+     fslint             |                                                    |
+     gas                |                                                 [] |
+     gawk               |                      []    [] []                [] |
+     gbiff              |                               []                   |
+     gcal               |                      []                            |
+     gcc                |                            []                   [] |
+     gettext            |             []       []    [] []                [] |
+     gettext-examples   | []                   []       []                [] |
+     gettext-runtime    |             []       []    [] []                [] |
+     gettext-tools      |                      []       []                [] |
+     gimp-print         |                         [] [] []        []      [] |
+     gliv               |                                                    |
+     glunarclock        |                            [] []                   |
+     gnubiff            |                               []                   |
+     gnucash            |                         []    ()        []      [] |
+     gnucash-glossary   |                            [] ()                [] |
+     gnupg              |                      [] ()    [] []          [] [] |
+     gpe-aerial         |                         []                         |
+     gpe-beam           |                         []    []                   |
+     gpe-calendar       |                         []    []                   |
+     gpe-clock          |                         []    []                   |
+     gpe-conf           |                         []    []                   |
+     gpe-contacts       |                         []    []                   |
+     gpe-edit           |                         []                         |
+     gpe-go             |                         []                         |
+     gpe-login          |                         []    []                   |
+     gpe-ownerinfo      |                         []    []                   |
+     gpe-sketchbook     |                         []    []                   |
+     gpe-su             |                         []    []                   |
+     gpe-taskmanager    |                         []    []                   |
+     gpe-timesheet      |                         []                         |
+     gpe-today          |                         []    []                   |
+     gpe-todo           |                         []    []                   |
+     gphoto2            |                         [] [] []                [] |
+     gprof              |                            [] []                [] |
+     gpsdrive           |                               ()    ()          () |
+     gramadoir          |                               []                   |
+     grep               |             [] []    []       [] []             [] |
+     gretl              |                                                 [] |
+     gtick              | []                            ()                   |
+     hello              |                      []    [] [] []          [] [] |
+     id-utils           |                            [] []                   |
+     indent             |                      []       []             [] [] |
+     iso_3166           |          []    [] [] [] [] [] [] []          [] [] |
+     iso_3166_1         |                      [] [] [] [] []             [] |
+     iso_3166_2         |                                                    |
+     iso_3166_3         |                               []                   |
+     iso_4217           |                      []    [] []                [] |
+     iso_639            |                                                    |
+     jpilot             |                         [] []                   [] |
+     jtag               |                                                    |
+     jwhois             |                                                 [] |
+     kbd                |                         [] [] [] []             [] |
+     latrine            |                               ()                   |
+     ld                 |                            []                   [] |
+     libc               |                      [] [] [] [] []             [] |
+     libgpewidget       |                         []    []                   |
+     libiconv           |                      []    [] []             [] [] |
+     lifelines          |                            [] ()                   |
+     lilypond           |                               []                   |
+     lingoteach         |                                                    |
+     lingoteach_lessons |                               ()                () |
+     lynx               |                      [] [] [] []                   |
+     m4                 |                         [] [] [] []                |
+     mailutils          |                      []                         [] |
+     make               |                            [] []                [] |
+     man-db             |                      [] () [] []                () |
+     minicom            |                         []    []                [] |
+     mysecretdiary      |                            [] []                [] |
+     nano               |                      [] () [] []                [] |
+     nano_1_0           |                      [] () [] []                [] |
+     opcodes            |                                                 [] |
+     parted             |                      [] [] [] []                [] |
+     ptx                |                      []    [] []             [] [] |
+     python             |                                                    |
+     radius             |                                                 [] |
+     recode             |             []       []    [] [] []          [] [] |
+     rpm                |                         [] []                      |
+     screem             |                                                    |
+     scrollkeeper       |             []       [] [] [] []                [] |
+     sed                | []                   []    [] []             [] [] |
+     sh-utils           |                            [] []                [] |
+     shared-mime-info   |                                                    |
+     sharutils          |                      [] [] [] [] []             [] |
+     silky              |                               ()                   |
+     skencil            |                            [] ()                [] |
+     sketch             |                            [] ()                [] |
+     soundtracker       |                            [] []                [] |
+     sp                 |                               []                   |
+     tar                |                         [] [] []                [] |
+     texinfo            |                            [] []             []    |
+     textutils          |                      []    [] []                [] |
+     tin                |                               ()        ()         |
+     tp-robot           |                                                    |
+     tuxpaint           |                      [] [] [] [] []     []      [] |
+     unicode-han-tra... |                                                    |
+     unicode-transla... |                                                    |
+     util-linux         |                      [] [] [] []                [] |
+     vorbis-tools       |             []          [] []                   [] |
+     wastesedge         |                               ()                   |
+     wdiff              |                      []    [] []                [] |
+     wget               |                []    []    [] [] []             [] |
+     xchat              |                      []       [] []             [] |
+     xfree86_xkb_xml    |                         [] []                      |
+     xpad               |                                                 [] |
+                        +----------------------------------------------------+
+                          af am ar az be bg bs ca cs da de el en en_GB eo es
+                           4  0  0  1  9  4  1 40 41 60 78 17  1   5   13 68
+     
+                          et eu fa fi fr ga gl he hr hu id is it ja ko lg
+                        +-------------------------------------------------+
+     a2ps               | []       [] []                      ()    ()    |
+     aegis              |                                                 |
+     ant-phone          |             []                                  |
+     anubis             |             []                                  |
+     ap-utils           |             []                                  |
+     aspell             |             [] []                               |
+     bash               |             []             []                   |
+     batchelor          |             [] []                               |
+     bfd                |             []                                  |
+     binutils           |             []                         []       |
+     bison              | []          []                []    []          |
+     bluez-pin          |          [] [] []          [] []                |
+     clisp              |                                                 |
+     clisp              |             []                                  |
+     console-tools      |                                                 |
+     coreutils          | []       [] [] []                   [] []       |
+     cpio               |             []    []       []             []    |
+     darkstat           |             () []          [] []                |
+     diffutils          |          [] []    [] []    [] []       []       |
+     e2fsprogs          |                                                 |
+     enscript           |             []          []                      |
+     error              |          [] [] []          []                   |
+     fetchmail          |                                        []       |
+     fileutils          | []          [] []          []       [] []       |
+     findutils          | []       [] [] [] []    [] [] []    [] [] []    |
+     flex               |             [] []                         []    |
+     fslint             |             []                                  |
+     gas                |             []                                  |
+     gawk               |             []       []                []       |
+     gbiff              |             []                                  |
+     gcal               |             []                                  |
+     gcc                |             []                                  |
+     gettext            |             []                         [] []    |
+     gettext-examples   |             []                         []       |
+     gettext-runtime    |          [] []                []       [] []    |
+     gettext-tools      |             []                         [] []    |
+     gimp-print         |             []                         []       |
+     gliv               |             ()                                  |
+     glunarclock        |          []    [] []       []                   |
+     gnubiff            |             []                                  |
+     gnucash            |             ()                      []          |
+     gnucash-glossary   |                                     []          |
+     gnupg              | []       [] []    []          []    [] []       |
+     gpe-aerial         |             []                                  |
+     gpe-beam           |             []                                  |
+     gpe-calendar       |             []             [] []                |
+     gpe-clock          |             []                                  |
+     gpe-conf           |             []                                  |
+     gpe-contacts       |             []             []                   |
+     gpe-edit           |             []                []                |
+     gpe-go             |             []                                  |
+     gpe-login          |             []             []                   |
+     gpe-ownerinfo      |             []             [] []                |
+     gpe-sketchbook     |             []                                  |
+     gpe-su             |             []                                  |
+     gpe-taskmanager    |             []                                  |
+     gpe-timesheet      |             [] []             []                |
+     gpe-today          |             [] []                               |
+     gpe-todo           |             []                []                |
+     gphoto2            |             []             []          []       |
+     gprof              |             []                []                |
+     gpsdrive           |             ()                      () ()       |
+     gramadoir          |             [] []                               |
+     grep               | []       [] [] [] [] [] [] [] []    [] []       |
+     gretl              |             []                      []          |
+     gtick              |          [] [] []                               |
+     hello              | []    [] [] [] [] [] [] [] [] []    [] [] []    |
+     id-utils           |             []             [] []    []          |
+     indent             | []       [] [] [] []       [] []    [] []       |
+     iso_3166           |    []       [] []       [] [] []    []          |
+     iso_3166_1         |    []       [] []          [] []                |
+     iso_3166_2         |                                                 |
+     iso_3166_3         |                                                 |
+     iso_4217           | []          []    []       []       [] []       |
+     iso_639            |                                                 |
+     jpilot             |             []                         ()       |
+     jtag               |             []                                  |
+     jwhois             |             []             [] []    []          |
+     kbd                |             []                                  |
+     latrine            |             []                                  |
+     ld                 |             []                                  |
+     libc               |          [] []    []       []          [] []    |
+     libgpewidget       |             [] []          [] []                |
+     libiconv           | []       [] [] [] []    [] [] []    []          |
+     lifelines          |             ()                                  |
+     lilypond           |             []                                  |
+     lingoteach         |             []                []                |
+     lingoteach_lessons |                                                 |
+     lynx               | []                         []       [] []       |
+     m4                 |             []    []          []       []       |
+     mailutils          |                                                 |
+     make               |             []    [] [] []             [] []    |
+     man-db             |                                     () ()       |
+     minicom            |          [] []             []          []       |
+     mysecretdiary      |             []                []                |
+     nano               |             []    []          []    []          |
+     nano_1_0           |             []    []          []    []          |
+     opcodes            |             []                                  |
+     parted             |             []    []                   []       |
+     ptx                | []       [] [] [] []       [] []                |
+     python             |                                                 |
+     radius             |             []                                  |
+     recode             |             []    [] []    [] []    []          |
+     rpm                |             []                            []    |
+     screem             |                                                 |
+     scrollkeeper       |                            []                   |
+     sed                | []       [] [] [] []       [] []    [] []       |
+     sh-utils           | []       [] [] []          []       [] []       |
+     shared-mime-info   |          [] []             []                   |
+     sharutils          | []          []    []       []          []       |
+     silky              |          () []             ()       ()          |
+     skencil            |             []                                  |
+     sketch             |             []                                  |
+     soundtracker       |             []                      []          |
+     sp                 |             []                         ()       |
+     tar                | []       [] []    []    [] [] []    [] []       |
+     texinfo            |             []       [] []             []       |
+     textutils          |             [] [] []       []          [] []    |
+     tin                | []          ()                                  |
+     tp-robot           |             []                                  |
+     tuxpaint           |          [] []       []    [] [] [] [] [] []    |
+     unicode-han-tra... |                                                 |
+     unicode-transla... |             [] []                               |
+     util-linux         | []       [] []             []       () []       |
+     vorbis-tools       |             []                                  |
+     wastesedge         |             ()                                  |
+     wdiff              | []          [] [] []       [] []                |
+     wget               | []       [] []    []    [] []          []       |
+     xchat              | []       [] []                                  |
+     xfree86_xkb_xml    |             []             []                   |
+     xpad               |             [] []                               |
+                        +-------------------------------------------------+
+                          et eu fa fi fr ga gl he hr hu id is it ja ko lg
+                          22  2  1 26 106 28 24  8 10 41 33  1 26 33 12  0
+     
+                          lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
+                        +-----------------------------------------------------+
+     a2ps               |             []       []    ()     ()     []   [] [] |
+     aegis              |                      ()                       () () |
+     ant-phone          |                      []                       []    |
+     anubis             |             []    [] []           []          [] [] |
+     ap-utils           |                      []           ()          []    |
+     aspell             |                      []                             |
+     bash               |                                          []   [] [] |
+     batchelor          |                                               []    |
+     bfd                |                                               []    |
+     binutils           |                                                  [] |
+     bison              |             []       []                  []   [] [] |
+     bluez-pin          |                      []           []          []    |
+     clisp              |                                                     |
+     clisp              |                      []                             |
+     console-tools      |                                                  [] |
+     coreutils          |                                   []             [] |
+     cpio               |                      []           []     []   [] [] |
+     darkstat           |             []       []                  []   []    |
+     diffutils          |             []       []           []     []   [] [] |
+     e2fsprogs          |                                   []                |
+     enscript           |                      []                  []   [] [] |
+     error              |                      []                  []   []    |
+     fetchmail          |                      []           []     ()      [] |
+     fileutils          |                                   []          [] [] |
+     findutils          |                      []           []     []   [] [] |
+     flex               |                                   []     []   [] [] |
+     fslint             |                      []                       []    |
+     gas                |                                                     |
+     gawk               |                                   []     []   []    |
+     gbiff              |                      []                       []    |
+     gcal               |                                                     |
+     gcc                |                                                     |
+     gettext            |                                   []          [] [] |
+     gettext-examples   |                      []           []          []    |
+     gettext-runtime    |                      []           []          [] [] |
+     gettext-tools      |                                   []          []    |
+     gimp-print         |                      []                             |
+     gliv               |                      []                  []   []    |
+     glunarclock        |             []       []                       [] [] |
+     gnubiff            |                      []                             |
+     gnucash            |                      []              []  ()      [] |
+     gnucash-glossary   |                      []              []             |
+     gnupg              |                                               []    |
+     gpe-aerial         |                      []              []       [] [] |
+     gpe-beam           |                      []              []       [] [] |
+     gpe-calendar       |                      []              []       [] [] |
+     gpe-clock          |                      []              []       [] [] |
+     gpe-conf           |                      []              []       [] [] |
+     gpe-contacts       |                      []              []       [] [] |
+     gpe-edit           |                      []              []       [] [] |
+     gpe-go             |                      []                       [] [] |
+     gpe-login          |                      []              []       [] [] |
+     gpe-ownerinfo      |                      []              []       [] [] |
+     gpe-sketchbook     |                      []              []       [] [] |
+     gpe-su             |                      []              []       [] [] |
+     gpe-taskmanager    |                      []              []       [] [] |
+     gpe-timesheet      |                      []              []       [] [] |
+     gpe-today          |                      []              []       [] [] |
+     gpe-todo           |                      []              []       [] [] |
+     gphoto2            |                                               []    |
+     gprof              |                                          []   []    |
+     gpsdrive           |                      ()    ()                 []    |
+     gramadoir          |                      ()                       []    |
+     grep               |                                   [] []  []   [] [] |
+     gretl              |                                                     |
+     gtick              |                      []                       [] [] |
+     hello              |    []       []    [] [] [] []     []     []   [] [] |
+     id-utils           |                      []                  []   [] [] |
+     indent             |                      []                  []   [] [] |
+     iso_3166           |          []                [] []                    |
+     iso_3166_1         |                      []    []                       |
+     iso_3166_2         |                                                     |
+     iso_3166_3         |                      []                             |
+     iso_4217           |          []          [] [] []     [] []  []      [] |
+     iso_639            |          []                                         |
+     jpilot             |                      ()    ()                       |
+     jtag               |                                                     |
+     jwhois             |                      []           []     []   [] () |
+     kbd                |                      []           []          []    |
+     latrine            |                                               []    |
+     ld                 |                                                     |
+     libc               |                   []       []     []     []         |
+     libgpewidget       |                      []              []       []    |
+     libiconv           |                      []           []     []   [] [] |
+     lifelines          |                                                     |
+     lilypond           |                                                     |
+     lingoteach         |                                                     |
+     lingoteach_lessons |                                                     |
+     lynx               |                      []                  []      [] |
+     m4                 |                      []           []     []   [] [] |
+     mailutils          |                                   []          [] [] |
+     make               |                      []           []     []      [] |
+     man-db             |                                               []    |
+     minicom            |                                   []     []   [] [] |
+     mysecretdiary      |                      []                  []   []    |
+     nano               |             []       []           []          [] [] |
+     nano_1_0           |             []    []    []        []          [] [] |
+     opcodes            |                      []                       []    |
+     parted             |                         []        [] []  []         |
+     ptx                |                   [] []    []     [] []  []   [] [] |
+     python             |                                                     |
+     radius             |                                   []             [] |
+     recode             |                                   []     []   [] [] |
+     rpm                |                                   [] []          [] |
+     screem             |                                                     |
+     scrollkeeper       |                   [] []           []          [] [] |
+     sed                |                                   []     []   []    |
+     sh-utils           |                   []                             [] |
+     shared-mime-info   |                      [] []                          |
+     sharutils          |                      []                          [] |
+     silky              |                                                  () |
+     skencil            |                                      []  []         |
+     sketch             |                                      []  []         |
+     soundtracker       |                                                     |
+     sp                 |                                                     |
+     tar                |             []    []       []     []     []   []    |
+     texinfo            |                   []              []          [] [] |
+     textutils          |                   []                             [] |
+     tin                |                                                     |
+     tp-robot           |                      []                             |
+     tuxpaint           | []          []       [] []        [] []  []   []    |
+     unicode-han-tra... |                                                     |
+     unicode-transla... |                                                     |
+     util-linux         |                      []                  []      [] |
+     vorbis-tools       |                      []                       [] [] |
+     wastesedge         |                                                     |
+     wdiff              |             []                    []     []   [] [] |
+     wget               |                                   []          [] [] |
+     xchat              |    []                []                          [] |
+     xfree86_xkb_xml    |                      []                          [] |
+     xpad               |                      []                       []    |
+                        +-----------------------------------------------------+
+                          lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru
+                           1  2  0  3 12  0 10 69  6  7  1  40 26  36   76 63
+     
+                          sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
+                        +-----------------------------------------------------+
+     a2ps               |    []    []       [] []                             | 16
+     aegis              |                                                     |  0
+     ant-phone          |                                                     |  3
+     anubis             |                   [] []                             |  9
+     ap-utils           |                      ()                             |  3
+     aspell             |                                                     |  4
+     bash               |                                                     |  9
+     batchelor          |                                                     |  3
+     bfd                |          []       []                                |  6
+     binutils           |          []       []                  []            |  8
+     bison              |          []       []                                | 14
+     bluez-pin          | []       []                    []                   | 14
+     clisp              |                                                     |  0
+     clisp              |                                                     |  5
+     console-tools      |                                                     |  3
+     coreutils          |    []    []       []                        []      | 16
+     cpio               |          []                           []            | 14
+     darkstat           | []    [] []                           ()    ()      | 12
+     diffutils          |          []       []                        []      | 23
+     e2fsprogs          |          []       []                                |  6
+     enscript           |          []       []                                | 12
+     error              | []                []                        []      | 15
+     fetchmail          | []                []                                | 11
+     fileutils          |    []    []       []                  []    []      | 17
+     findutils          | [] [] [] []       []                  []            | 29
+     flex               |          []       []                                | 13
+     fslint             |                                                     |  3
+     gas                |                   []                                |  3
+     gawk               |          []       []                                | 12
+     gbiff              |                                                     |  4
+     gcal               |          []       []                                |  4
+     gcc                |                   []                                |  4
+     gettext            | [] []    []       []                        []      | 16
+     gettext-examples   | []    [] []       []                  []            | 14
+     gettext-runtime    | [] [] [] []       [] []               []    []      | 22
+     gettext-tools      | [] [] [] []       []                  []            | 14
+     gimp-print         | []       []                                         | 10
+     gliv               |                                                     |  3
+     glunarclock        |       [] []                    []                   | 13
+     gnubiff            |                                                     |  3
+     gnucash            | []                                          []      |  9
+     gnucash-glossary   | []       []                                 []      |  8
+     gnupg              | []       []       []                        []      | 17
+     gpe-aerial         |          []                                         |  7
+     gpe-beam           |          []                                         |  8
+     gpe-calendar       | []       []                    []           []      | 13
+     gpe-clock          | []    [] []                                         | 10
+     gpe-conf           | []       []                                         |  9
+     gpe-contacts       | []       []                                 []      | 11
+     gpe-edit           | []    [] []                    []           []      | 12
+     gpe-go             |                                                     |  5
+     gpe-login          | []    [] []                    []           []      | 13
+     gpe-ownerinfo      | []    [] []                                 []      | 13
+     gpe-sketchbook     | []       []                                         |  9
+     gpe-su             | []    [] []                                         | 10
+     gpe-taskmanager    | []    [] []                                         | 10
+     gpe-timesheet      | []    [] []                                 []      | 12
+     gpe-today          | []    [] []                    []           []      | 13
+     gpe-todo           | []       []                    []           []      | 12
+     gphoto2            | []       []                           []            | 11
+     gprof              |          []       []                                |  9
+     gpsdrive           | []       []                                         |  3
+     gramadoir          | []                                                  |  5
+     grep               |    [] []          [] []                             | 26
+     gretl              |                                                     |  3
+     gtick              |                                                     |  7
+     hello              | []    [] []       [] []                             | 34
+     id-utils           |          []       []                                | 12
+     indent             | []    [] []       []                                | 21
+     iso_3166           | [] [] [] []       []    []     []                   | 27
+     iso_3166_1         | [] []             []                                | 16
+     iso_3166_2         |                                                     |  0
+     iso_3166_3         |                                                     |  2
+     iso_4217           | [] []    []       [] []               []            | 24
+     iso_639            |                                                     |  1
+     jpilot             |          []       []        []        []    []      |  9
+     jtag               | []                                                  |  2
+     jwhois             |          ()       []                        []      | 11
+     kbd                |          []       []                                | 11
+     latrine            |                                                     |  2
+     ld                 |          []       []                                |  5
+     libc               | []       []       []                  []            | 20
+     libgpewidget       | []    [] []                    []                   | 13
+     libiconv           | [] [] [] []       [] []        []     []            | 27
+     lifelines          |          []                                         |  2
+     lilypond           |          []                                         |  3
+     lingoteach         |                                                     |  2
+     lingoteach_lessons |                                       ()            |  0
+     lynx               |          []       [] []                             | 14
+     m4                 |          []                           []            | 15
+     mailutils          |                                                     |  5
+     make               |          []       []                  []            | 16
+     man-db             |          []                                         |  5
+     minicom            |                                                     | 11
+     mysecretdiary      |          []       []                                | 10
+     nano               |       [] []       [] []                             | 17
+     nano_1_0           |          []       [] []                             | 17
+     opcodes            |          []       []                                |  6
+     parted             |          []       []                  []            | 15
+     ptx                |          []       []                                | 22
+     python             |                                                     |  0
+     radius             |                                                     |  4
+     recode             |    []    []       []                                | 20
+     rpm                |          []       []                                |  9
+     screem             |          []                           []            |  2
+     scrollkeeper       | []    [] []                                         | 15
+     sed                | [] [] [] []       [] []                             | 24
+     sh-utils           |    []             []                                | 14
+     shared-mime-info   |       [] []                                         |  7
+     sharutils          |       [] []       []                        []      | 17
+     silky              | ()                                                  |  3
+     skencil            |          []                                         |  6
+     sketch             |          []                                         |  6
+     soundtracker       | []       []                                         |  7
+     sp                 |                   []                                |  3
+     tar                | [] []    []       []                  []            | 24
+     texinfo            |          []       []                  []            | 14
+     textutils          |    []    []       []                        []      | 16
+     tin                |                                                     |  1
+     tp-robot           |                                                     |  2
+     tuxpaint           | []       []       []           []     []            | 29
+     unicode-han-tra... |                                                     |  0
+     unicode-transla... |                                                     |  2
+     util-linux         |          []       []                                | 15
+     vorbis-tools       |                                                     |  8
+     wastesedge         |                                                     |  0
+     wdiff              | []       []       []                                | 18
+     wget               | [] [] [] []       [] []               []    []      | 24
+     xchat              | [] [] [] []                           []            | 15
+     xfree86_xkb_xml    | []    []          [] []               []            | 11
+     xpad               |                                                     |  5
+                        +-----------------------------------------------------+
+       63 teams           sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu
+      131 domains         47 19 28 83  0  0 59 13  1   1 11  0  22    22    0  1373
+
+   Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect.  This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+   For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer.  There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+   If January 2004 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites.  The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+Using `gettext' in new packages
+===============================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package.  Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library.  This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+   Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations.  The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project.  Therefore the information given above
+applies also for every other Free Software Project.  Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..fafddc2
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,146 @@
+Program: GnuPG
+Maintainer:  Werner Koch <wk@gnupg.org>
+Bug reports: <bug-gnupg@gnu.org>
+Security related bug reports: <security@gnupg.org>
+
+
+Authors
+=======
+
+Ales Nyakhaychyk <nyakhaychyk@i1fn.linux.by> Translations [be]
+
+Birger Langkjer <birger.langkjer@image.dk> Translations [da]
+
+Maxim Britov <maxbritov@tut.by> Translations [ru]
+
+Daniel Resare  <daniel@resare.com> Translations [sv]
+Per Tunedal    <per@clipanish.com> Translations [sv]
+
+David Shaw <dshaw@jabberwocky.com> Assigns past and future changes.
+    (all in keyserver/,
+     a lot of changes in g10/ see the ChangeLog,
+     bug fixes here and there)           
+
+Dokianakis Theofanis <madf@hellug.gr> Translations [el]
+
+Edmund GRIMLEY EVANS <edmundo@rano.org> Translations [eo]
+
+Florian Weimer <fw@deneb.enyo.de>  Assigns past and future changes
+    (changed:g10/parse-packet.c, include/iobuf.h, util/iobuf.c)
+
+Gaël Quéri  <gael@lautre.net>  Translations [fr]
+    (fixed a lot of typos)
+
+Gregory Steuck <steuck@iname.com> Translations [ru]
+
+Nagy Ferenc László <nfl@nfllab.com> Translations [hu]
+
+Ivo Timmermans <itimmermans@bigfoot.com> Translations [nl]
+
+Jacobo Tarri'o Barreiro <jtarrio@iname.com> Translations [gl]
+
+Janusz Aleksander Urbanowicz <alex@bofh.torun.pl> Translations [po]
+
+Jedi Lin <Jedi@idej.org> Translations [zh-tw]
+
+Jouni Hiltunen <jouni.hiltunen@kolumbus.fi> Translations [fi]
+Tommi Vainikainen <Tommi.Vainikainen@iki.fi> Translations [fi]
+
+Laurentiu Buzdugan <lbgnupg@rolix.org> Translations [ro]
+
+Magda Procha'zkova'  <magda@math.muni.cz> Translations [cs]
+
+Meng Jie <zuxyhere@eastday.com> Translations [zh_CN]
+
+Michael Roth  <mroth@nessie.de>  Assigns changes.
+    (wrote cipher/des.c., changes and bug fixes all over the place)
+
+Michal Majer <mmajer@econ.umb.sk> Translations [sk]
+
+Marco d'Itri <md@linux.it> Translations [it]
+
+Matthew Skala <mskala@ansuz.sooke.bc.ca>  Disclaimer
+    (wrote cipher/twofish.c)
+
+Niklas Hernaeus <nh@df.lth.se> Disclaimer
+    (weak key patches)
+
+Nilgun Belma Buguner <nilgun@technologist.com> Translations [tr]
+
+Nils Ellmenreich  <nils 'at' infosun.fmi.uni-passau.de> 
+                                      Assigns past and future changes
+    (configure.in, cipher/rndlinux.c, FAQ)
+
+Paul Eggert <eggert@twinsun.com> 
+    (configuration macros for LFS)
+
+Pavel I. Shajdo <pshajdo@gmail.com> Translations [ru]
+    (man pages)
+
+Pedro Morais <morais@poli.org> Translations [pt_PT]
+
+Rémi Guyomarch        <rguyom@mail.dotcom.fr> Assigns past and future changes.
+    (g10/compress.c, g10/encr-data.c,
+     g10/free-packet.c, g10/mdfilter.c, g10/plaintext.c, util/iobuf.c)
+
+Stefan Bellon   <sbellon@sbellon.de> Assigns past and future changes.
+   (All patches to support RISC OS)
+
+Timo Schulz     <twoaday@freakmail.de> Assigns past and future changes.
+   (util/w32reg.c, g10/passphrase.c, g10/hkp.c)
+
+Tedi Heriyanto <tedi_h@gmx.net> Translations [id]
+
+Thiago Jung Bauermann <jungmann@cwb.matrix.com.br> Translations [pt_BR]
+Rafael Caetano dos Santos <rcaetano@linux.ime.usp.br> Translations [pt_BR]
+
+Toomas Soome <tsoome@ut.ee> Translations [et]
+
+Trond Endrestøl <Trond.Endrestol@fagskolen.gjovik.no> Translations [nb]
+
+Urko Lusa <ulusa@euskalnet.net> Translations [es]
+Jaime Sua'rez <jjsuarez@iname.com> Translations [es]
+
+Walter Koch <koch@u32.de>  Translations [de]
+
+Werner Koch  <wk@gnupg.org>  Assigns GNU Privacy Guard and future changes.
+    (started the whole thing)
+
+Yosiaki IIDA <iida@ring.gr.jp> Translations [ja]
+
+
+
+Other authors
+=============
+
+This program uses the zlib compression library written by
+Jean-loup Gailly and Mark Adler.
+
+Most of the stuff in mpi has been taken from the GMP library by
+Torbjorn Granlund <tege@noisy.tmg.se>.
+
+The Rijndael implementation (cipher/rijndael.c) is based on the 
+public domain reference code provided for the AES selection process.
+The Rijndael algorithm is due to Joan Daemen and Vincent Rijmen. 
+
+The files cipher/rndunix.c and cipher/rndw32.c are based on rndunix.c
+and rndwin32.c from cryptlib.
+Copyright Peter Gutmann, Paul Kendall, and Chris Wedgwood 1996-1999.
+
+The RPM specs file scripts/gnupg.spec has been contributed by
+several people.
+
+The files below scripts/conf-w32brg/ is a contribution to GnuPG by
+Brian Gladman and not to be considered a proper part of GnuPG.
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
diff --git a/BUGS b/BUGS
new file mode 100644 (file)
index 0000000..4065056
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,12 @@
+Please see
+
+    http://bugs.gnupg.org/
+
+for a list of known bugs in GnuPG.  We don't distribute this list with
+the package any longer because a more current one with notes in which
+version the bug is fixed can be found online.
+
+For security related bugs, please contact <security@gnupg.org> which
+directs mails only to the core developers.  If you need to encrypt the
+report you should use the public keys of the maintainer and of 2 or 3
+other active developers (consult the ChangeLog and AUTHORS).
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..3912109
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program 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 2 of the License, or
+    (at your option) any later version.
+
+    This program 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, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..dc0a717
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,2036 @@
+2006-12-06  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.6.
+
+2006-12-04  Werner Koch  <wk@g10code.com>
+
+       * README: Add hint on hjow to set CC_FOR_BUILD.
+       * configure.ac (CC_FOR_BUILD): New.
+
+2006-12-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note the CVE for bug#728, --s2k-count,
+       --passphrase-repeat, and the OpenSSL exception.
+
+2006-11-29  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.6rc1.
+
+2006-11-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: --enable-minimal leaves out gettext and all
+       resolver functions (SRV, PKA, & CERT).
+
+2006-10-02  Werner Koch  <wk@g10code.com>
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Add case for mingw32
+       and allow setting the variable on the command line.  Fixes bug 518.
+       Also use HOST instead of TARGET.
+       
+       * README: Add information about the forthcoming GnuPG 2.0.
+
+       * configure.ac (AB_INIT): New.
+
+2006-09-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Move strsep to AC_REPLACE_FUNCS so it will end up
+       in libcompat.
+
+2006-08-01  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.5.
+
+2006-07-31  Werner Koch  <wk@g10code.com>
+
+       * README: Updated info on the key used to sign the tarball.
+
+2006-07-28  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.5rc1.
+
+2006-07-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Fix resolver autoconf code so it works (fails)
+       properly with uClibc.
+
+2006-06-25  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.4.
+
+2006-05-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --disable-optimization.  This is handy for
+       debugging so the compiler doesn't rearrange things and eliminate
+       variables.
+
+2006-05-22  Marcus Brinkmann  <marcus@g10code.de>
+
+       * configure.ac: Remove check for noexecstack and invoke
+       CL_AS_NOEXECSTACK instead.
+
+2006-05-16  Werner Koch  <wk@g10code.com>
+
+       * README: Removed note for OSF5 as this is the default now.
+       Reported by Joerg Honegger.
+
+       * configure.ac [osf5]: Fixed warning name to ptrmismatch1.
+
+2006-04-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note SHA-224 and DSA2.
+
+       * configure.ac: Remove --enable-old-keyserver-helpers.  Comment
+       out --enable-m-guard for now.
+
+2006-04-12  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Print version at end of run.
+       (svn_revision): Posix adjustment.
+
+2006-04-07  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Use new method to include the SVN revison.  Now it
+       is the actual global revision number.
+
+2006-04-04  Werner Koch  <wk@g10code.com>
+
+       * NEWS: Fixed old news entry to point to rfc4398 which has been
+       published just before 1.4.3.
+
+2006-04-03  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.3.
+
+2006-03-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * README: Some more notes about building fat binaries.
+
+2006-03-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * README: Missing some instructions on building a fat binary.
+
+2006-03-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Improved --disable-endian-check that doesn't
+       involve changing #ifdefs in the rest of the code.
+
+2006-03-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --disable-endian-check for building fat
+       binaries on OSX.
+
+       * README: Add note on how to build a fat binary on OSX.
+
+2006-03-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Allow the DNS stuff to work on OSX by trying the
+       Apple-specific BIND_8_COMPAT.
+
+2006-03-09  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.3rc2.
+
+2006-03-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note CERT retrieval.  Tweak PKA and backsig language to
+       match current code.
+
+       * NEWS: Note --auto-key-locate and that keyservers can handle
+       binary data now.
+
+2006-03-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Fix accidental enabling of SHA-384/512.  Noted by
+       Nelson H. F. Beebe.
+
+2006-02-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Try linking the UINT64_C test program (rather than
+       just compiling it) as UINT64_C looks like a (missing) function,
+       causing a false positive.  Noted by Claus Assmann.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       Released 1.4.3rc1.
+
+2006-02-09  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Check for fcntl and ftruncate.
+
+2006-01-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add define for EXEEXT so we can find keyserver
+       helpers on systems that use extensions.
+
+2005-12-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add switch for DNS CERT.
+
+2005-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Split PKA checking off from DNS SRV checking.
+       Currently PKA is only enabled if HTTP or HKP is enabled which is
+       not necessary.
+
+2005-12-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note --fetch-keys.
+
+2005-12-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: UINT64_C test needs #include <inttypes.h>.
+
+       * configure.ac: Some cleanup so we don't build files that are
+       completely ifdeffed out.  This causes a warning on Sun's cc.  Do
+       sha512.c and the internal regex code as well for consistency.
+
+2005-11-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note backsigs, the xxxxx-clean options, and the
+       xxxxx-minimal options.
+
+2005-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for a getpagesize() declaration.
+
+2005-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Clarify the cURL keyserver changes, and add a note about
+       gpg-zip.
+
+       * configure.ac: Remove the backsig configure options since this is
+       all done at runtime now.
+
+2005-10-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Did some backsig testing with the PGP folks.  All
+       is well, so I'm turning generation of backsigs on for new keys.
+       Checking for backsigs on verification is still off.
+
+2005-10-05  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Changed identification file name to g10/gpg.c
+
+2005-10-02  Marcus Brinkmann  <marcus@g10code.de>
+
+       * configure.ac [!$try_gettext]: Invoke AM_PO_SUBDIRS.
+
+2005-08-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for getpwnam, getpwuid, and pwd.h.
+
+2005-08-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Remove hardcoded -I and -L for /usr/local on
+       FreeBSD.
+
+2005-08-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Call GNUPG_CHECK_USTAR and generate tools/gpg-zip.
+
+2005-07-28  Werner Koch  <wk@g10code.com>
+
+       * configure.ac (USE_DNS_PKA): Define in addition to USE_DNS_SRV.
+
+2005-07-27  Werner Koch  <wk@g10code.com>
+
+       Replaced in all directories all calls to m_free, m_alloc,
+       m_realloc, m_strdup by calls to xfoo functions.  This is to ease
+       porting to gnupg 1.9.
+
+       * README.CVS: Renamed to README.SVN.
+
+2005-07-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS, configure.ac: Switch over to using curl or fake-curl by
+       default.  Add --enable-old-keyserver-helpers to not use curl.
+
+2005-07-26  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.2.
+
+2005-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add a define for FAKE_CURL.
+
+2005-07-19  Werner Koch  <wk@g10code.com>
+
+       * configure.ac [W32]: Always set DISABLE_KEYSERVER_PATH.
+
+2005-06-21  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.2rc2.
+
+2005-06-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note key cleaning commands.
+
+2005-06-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add check for no-pointer-sign warning keyword, and
+       disable.  This is gcc4 specific.
+
+2005-05-31  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.2rc1.
+
+       * README: Add a note on GnuPG 1.9.
+
+       Updated FSF address in all files.
+
+2005-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note command completion and the new curl-based HKP helper.
+
+2005-04-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Remove --disable-old-hkp - use new HKP handler for
+       --with-libcurl or --enable-fake-curl.
+
+       * configure.ac: Add --disable-old-hkp option that can be used
+       along with --with-libcurl to build the curl version of HKP.
+
+2005-04-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for memrchr()
+
+2005-03-31  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: New option --disable-agent-support. Define
+       ENABLE_AGENT_SUPPORT as AC_DEFINE and AM_CONDITIONAL.
+       Disable support for card and agent with --enable-minimal.
+       (AC_REPLACE_FUNCS): Add isascii.
+       (g10defs.h): Define PATHSEP_C and PATHSEP_S.
+
+       * README: Changed the instruction on how to verify a signature to
+       show a .sig extension and not the .asc we used to use ages ago.
+
+2005-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Move the LDAP detecting code to m4/ldap.m4.
+
+2005-03-15  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.1.
+
+2005-03-11  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: New option --enable-noexecstack. 
+
+2005-02-16  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.1rc2.
+
+2005-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --enable-fake-curl option to help test no-curl
+       HTTP.
+
+       * NEWS: Note Mister/Zuccherato CFB countermeasures.
+
+2005-02-04  Werner Koch  <wk@g10code.com>
+
+       * configure.ac (GNUPG_CHECK_GNUMAKE):  Removed. Not needed for
+       decent automakes.
+
+2005-02-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Fix typo.
+
+2005-02-03  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.1rc1.
+
+2005-01-22  David Shaw  <dshaw@grover.jabberwocky.com>
+
+       * configure.ac: Define FTPS flag if we're using curl, and FTPS is
+       available.
+
+       * README: Fix some typos (noted by Norihiko Murase), update to
+       1.4.1, and tweak some descriptions.
+
+       * NEWS: Note FTPS.
+
+2005-01-18  Werner Koch  <wk@g10code.com>
+
+       * configure.ac (HAVE_W32_SYSTEM): Define it.
+
+2005-01-18  David Shaw  <dshaw@grover.jabberwocky.com>
+
+       * NEWS: Note --rfc2440-text import/export-unusable-sigs and
+       gpgkeys_curl.
+
+       * configure.ac: gpgkeys_mailto is disabled by default.  Define
+       HTTPS flag if we're using curl, and HTTPS is available.
+
+2005-01-17  Werner Koch  <wk@g10code.com>
+
+       * README: Updated for SHA1 checksums.
+
+       * configure.ac: Make --without-included-zlib work as
+       expected. Reported by Norihiko Murase.  Same for
+       --without-included-regex.
+
+2005-01-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Use new GNUPG_CHECK_LIBUSB macro.
+
+2004-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Better implementation for the SRV check.  We don't
+       need to actually check all the header files individually since the
+       SRV test compile uses them together.
+
+2004-12-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Use new LIBCURL_CHECK_CONFIG macro for
+       all libcurl stuff.  This simplifies, and we don't need the
+       automake conditional stuff any longer.
+
+2004-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: --enable-ftp is on by default, --with-libcurl is
+       off by default.  If we have neither of --enable-ftp or
+       --enable-http, don't even check for curl.
+
+2004-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add check for --enable-ftp.  It is disabled by
+       default for now.
+
+2004-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Call the new GNUPG_CHECK_READLINE macro for
+       readline stuff.
+
+2004-12-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add a --with-ldap=DIR so people can add to the
+       search path.
+
+2004-12-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for arpa/nameser.h.
+
+2004-12-16  Werner Koch  <wk@g10code.com>
+
+       * THANKS: Added John Clizbe for help testing the 1.4.0a W32
+       binary.
+
+2004-12-16  Werner Koch  <wk@g10code.com>
+
+       Released 1.4.0.
+
+2004-12-14  Werner Koch  <wk@g10code.com>
+
+       Released 1.3.93.
+       
+       * Makefile.am (AUTOMAKE_OPTIONS): Add filename-length-max=99.
+
+2004-11-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Autodetect wldap32 on Windoze.
+
+2004-11-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * README, configure.ac: Add --enable-backsigs to enable the
+       experimental backsigs code.
+
+2004-11-04  Werner Koch  <wk@g10code.com>
+
+       * AUTHORS: Use Maxim Britov.  I am not that accustomed to the
+       Russian way of writing names.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       Released 1.3.92.
+
+2004-10-26  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: New option --disable-gnupg-iconv, define
+       USE_GNUPG_ICONV.
+       (AC_CANONICAL_TARGET): Replaced by AC_CANONICAL_HOST. Changed all
+       reference to TARGET to HOST.  Made sure that i586-mingw32msvc gets
+       detected as mingw32.
+       (UNIT64_C): Don't include inttype.h uncoditional but use a test to
+       ensure that it gets into conftest.h.
+       (AH_TOP): New. Prevent double inclusion of config.h.
+
+2004-10-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * acinclude.m4: aclocal 1.9 wants quoting on AC_DEFUN arguments.
+
+2004-10-21  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Remove the check for asprintf
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       Released 1.3.91.
+
+       * README: Mentioned --enable-selinux-support.
+
+2004-10-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note gpgkeys_finger, keyserver timeouts, and the direct
+       trust model.
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (DISTCHECK_CONFIGURE_FLAGS): New.
+       (AUTOMAKE_OPTIONS): New.
+
+       * configure.ac: Check whether vasprintf needs a replacement.
+
+2004-10-13  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Actually name the option --disable-finger and not
+       http.  Add option --enable-selinux-support.
+
+2004-10-11  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: New option --disable-finger.
+
+2004-09-17  Werner Koch  <wk@g10code.com>
+
+       * configure.ac: Don't check for usb_create_match or
+       use_get_string_simple anymore.
+
+2004-09-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Give warning when using capabilities.  Check for
+       usb_get_string_simple for old libusb reasons.
+
+2004-09-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note HTTP basic auth.
+
+       * configure.ac: Check for usb_get_busses since very old stable
+       libusb doesn't have it.
+
+2004-09-09  Werner Koch  <wk@g10code.com>
+
+       * README: Doc --disable-card-support and --without-readline.
+
+       * configure.ac: Check for readline.  Make enable-card-support the
+       default.  New option --without-readline.  Allow the use of either
+       the development or the stable libusb.
+
+2004-07-27  Werner Koch  <wk@g10code.de>
+
+       * configure.ac (AM_GNU_GETTEXT_VERSION): New.
+       (min_automake_version): New.
+
+2004-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Try for wldap32 on Win32 platforms.
+
+2004-05-22  Werner Koch  <wk@gnupg.org>
+
+       Releases 1.3.6.
+
+2004-05-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note --sig-keyserver-url and the ability to use a
+       preferred keyserver in a regular data sig to fetch the signing
+       key.
+
+       * configure.ac: Replacement function for timegm().  No need to
+       check for setenv() any longer.
+
+2004-05-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note HTTP key fetching.
+
+       * README: Update version and note that HKP is no longer build in.
+
+       * configure.ac: Handle --disable-http and other code to properly
+       build gpgkeys_http.
+
+2004-05-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note the addition of preferred keyserver support,
+       --ask-cert-level, --keyid-format, and the removal of
+       show-long-keyids, the quasi-1991 partial length encoding,
+       --export-all, and include-non-rfc.
+
+       * acinclude.m4 (GNUPG_SYS_NM_PARSE): Remove a leftover slash in a
+       sed expression.
+
+2004-05-01  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4 (ac_pipe_works): Fixed BRE syntax \? -> \{0,1\}.
+       Reported by Todd Vierling.
+
+2004-02-26  Werner Koch  <wk@gnupg.org>
+
+       Released 1.3.5.
+
+2004-02-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * README: Update copyright.
+
+       * NEWS: Note --max-output, --list-config, --min-cert-level, AIX
+       fix, new http-proxy keyserver-option, new LDAP server code, TLS,
+       LDAPS, and --show-session-key with --symmetric.
+
+2004-02-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for timegm().  Replacement functions for
+       setenv() and unsetenv().
+
+2004-02-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for ln -s and add GPGKEYS_LDAP conditional,
+       both for making gpgkeys_ldaps symlink to gpgkeys_ldap.
+
+       * configure.ac: Simplify the LDAP checking code since OpenLDAP is
+       far more mature these days and dependencies are cleaner.  Add
+       checks for ldap_set_option and ldap_start_tls_s.
+
+2004-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note --enable-key-cache, the OpenBSD/i386 and HPPA fixes,
+       and Elgamal removal.
+
+       * README, configure.ac: Add --enable-key-cache=SIZE configure
+       option.  This sets the key/uid cache size.  Default is 4096.
+
+2004-01-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Include stdio.h when checking for bzlib.h. Solaris
+       9 has a very old bzip2 library and we can at least guarantee that
+       it won't fail because of the lack of stdio.h.
+
+       * THANKS: Added Phong Nguyen, who found the Elgamal signing key
+       problem.
+
+2003-12-23  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Use -Wformat-nonliteral in maintainer-mode.
+
+2003-11-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note --disable-rsa.
+
+       * configure.ac: Add --disable-rsa.
+
+       * README: Add --with-zlib, --with-bzip2, --without-bzip2,
+       --disable-rsa, and --enable-minimal.  Update gettext version.
+
+       * README: Update version number.  Add BZIP2.  Remove Elgamal
+       sign+encrypt.
+
+2003-11-27  Werner Koch  <wk@gnupg.org>
+
+       Released 1.3.4.
+
+2003-11-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note that we won't encrypt to an Elgamal sign+encrypt key
+       any longer.
+
+       * configure.ac: Use MSG_NOTICE instead of MSG_WARN for less
+       serious notifications.
+
+       * NEWS: I meant "less" not "more".
+
+2003-11-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note BZIP2.
+
+       * configure.ac: Make sure that the resolver API actually compiles,
+       and not just that the right functions exist.
+
+2003-10-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Locate libbz2 for bzip2 compression support.
+
+2003-10-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note --symmetric --encrypt and the improved config file
+       search.
+
+       * configure.ac: Add SAFE_VERSION_DOT and SAFE_VERSION_DASH.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (SUBDIRS): Add intl.
+       (ACLOCAL_AMFLAGS): New variable.
+       (EXTRA_DIST): Add scripts/config.rpath.
+       * configure.ac (AC_CONFIG_FILES): Add po/Makefile.in,
+       (AL_LINGUAS): Removed.
+       
+2003-10-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac (DLLIBS): Work properly on platforms where dlopen
+       and friends are in libc instead of libdl.
+
+2003-10-24  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (DLLIBS): Fixed last change. 
+
+2003-10-23  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (DLLIBS): Do not include -ldl in the mingw32 case.
+
+2003-10-21  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (PRINTABLE_OS_NAME): Remove special case for The
+       Hurd; Robert Millan reported that the uname test is now
+       sufficient.
+
+2003-10-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Include -ldl when card support is used.
+
+2003-10-10  Werner Koch  <wk@gnupg.org>
+
+       Release 1.3.3.
+
+2003-10-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note multiple Comment: support and --sig-keyserver-url.
+
+2003-10-01  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (AH_BOTTOM): Define GNUPG_MAJOR_VERSION. 
+       (ENABLE_CARD_SUPPORT): Define as automake conditional.
+
+2003-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note that SHA-256 is read-write now, that TIGER/192 is no
+       more, that revoked and expired uids are skipped in -r, and that
+       --no-mangle-dos-filenames is now the default.
+
+2003-09-27  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (LIBUSB_LIBS,HAVE_LIBUSB): Check for Libusb.
+       (--enable-card-support): New.
+
+2003-09-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Drop TIGER/192 support.  Check for UINT64_C to go
+       along with uint64_t.
+
+2003-09-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note --list-options, --verify-options, the deprecation of
+       --show-photos, --show-policy-url, --show-notation, and
+       --show-keyring, and getting the signer's fingerprint in sig
+       records.
+
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * AUTHORS, THANKS: Updates from stable.
+
+2003-08-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note %g and %p, the "tru" --with-colons record, and the
+       REVKEYSIG --status-fd tag.
+
+       * README: Add a note about the SunOS symbol underscore problem and
+       how to fix it.  Note problem with gcc < 2.96 and non-gnu as.
+
+2003-08-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for getaddrinfo.  Don't bother to check for
+       EGD libs since we need to have the netlibs regardless because of
+       the agent socket.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: configure.ac: Check for sigset_t and struct
+       sigaction.  This is for Forte c89 on Solaris which seems to define
+       only the function call half of the two pairs by default.
+
+       * THANKS: Updates from stable.
+
+       * configure.ac: Include wsock32 in W32LIBS.  This is different
+       from NETLIBS so we don't need to force other platforms to pull in
+       the netlibs when they aren't actually needed.
+
+       * NEWS: Note portability changes.
+
+2003-06-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Define SAFE_VERSION so that RISCOS can override it
+       and remove invalid chars.
+
+2003-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Put wsock32 in NETLIBS.  Put zlib in ZLIBS.  Put
+       dl in DLLIBS.  Check for getopt.h if available.  Look for getopt()
+       in libiberty if libc doesn't have it.  Enable GPGKEYS_HKP after
+       AC_PROG_CC so that any needed extension (i.e. ".exe") is defined.
+
+2003-05-27  Werner Koch  <wk@gnupg.org>
+
+       Released 1.3.2.
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Document --gnupg and the deprecation of --no-openpgp and
+       --no-pgpX.
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Edit preprocessor instructions in g10defs.h to
+       remove whitespace before the '#'.  This is not required by C89,
+       but there are some compilers out there that don't like it.
+
+2003-05-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Remove some stuff no longer needed with newer
+       autoconf. Use AC_GNU_SOURCE instead of defining _GNU_SOURCE
+       manually.  Add check for strchr() for gettext.  Add "ngettext"
+       check for gettext, since that check supposedly implies a check for
+       bind_textdomain_codeset.  Add check for times() for random.c.  Fix
+       URL for EGD.  Make --enable-old-tiger match the stable branch as a
+       separate item.
+
+       * NEWS: "OpenPGP" trust model is now "PGP".  Add note about TIGER
+       being dropped from OpenPGP.  Note trust bug fix.
+
+       * README: Fix all URLs to point to the right place in the
+       reorganized gnupg.org web pages.  Some minor language fixes.
+
+2003-04-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * BUGS: Fix bug reporting URL.
+
+       * NEWS: Add sig version, pk algo, hash algo, and sig class to
+       VALIDSIG.  Add notes about SRV, the "subkeyid!" syntax, configure
+       options to disable various algorithms, and the ability to change
+       the keyserver no-modify flag.
+
+2003-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Big warning that TIGER/192 is being removed from
+       the standard, and make it disabled by default.
+
+       * README: Put back proper copyright line.  Remove mention of
+       TIGER/192.
+
+2003-04-15  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (HAVE_DOSISH_SYSTEM): New automake conditional.
+
+       * acinclude.m4 (GNUPG_CHECK_ENDIAN): Fixed quoting of r.e. using
+       quadrigraphs.
+
+2003-04-08  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (EXTRA_DIST): Add autogen.sh wrapper.
+
+2003-04-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Use much more accurate method to determine whether
+       DNS SRV is usable.
+
+       * README: Document the various --disable-xxx switches, and add a
+       note about existing keys that may use one of the missing ciphers
+       as a preference.  Update copyright date.
+
+       * NEWS: Add note about SHA-256/384/512.
+
+       * acinclude.m4: Fix URL to faqprog.pl.
+
+2003-03-24  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4 (GNUPG_CHECK_ENDIAN): When crosscompiling assume
+       little only for Intel CPUs.
+
+       * configure.ac: Check for ranlib and ar.  This is required for
+       cross compiling.
+
+2003-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Look for res_query so we can use DNS SRV, and add
+       --disable-dns-srv to disable it.
+
+2003-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Define @CAPLIBS@ to link in -lcap if we are using
+       capabilities.
+
+2003-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --disable-idea for IDEA.  Note that disabling
+       IDEA disables both the real IDEA and the possibility of using the
+       IDEA loadable module.  Remove the --disable-dynload option since
+       it is no longer meaningful (it is only used if idea-stub is used).
+
+2003-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --disable-xxx options for CAST5, BLOWFISH, AES
+       (all), TWOFISH, TIGER192, SHA256, and SHA384/512.  Add a
+       --enable-minimal that disables all of them as well as
+       --disable-exec.
+
+2003-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Do not set GNUPG_LIBEXECDIR in ./configure, so
+       that makefiles can override it.  Verify that we have a 64-bit type
+       before building tiger.c or sha512.c.  Add uint64_t as a possible
+       64-bit type.
+
+2003-02-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Add notes about disabled keys, trustdb tweaks, and
+       "revuid".
+
+2002-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Add note about convert-from-106 script.
+
+2002-11-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Add notes about notation names and '@', the --trust-model
+       option, default algorithms from --personal-xxxx,
+       --primary-keyring, changes with --s2k-digest-algo, the new
+       anonymous recipient improvements, and non-optimized memory wiping.
+
+2002-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * THANKS: Changes from stable branch.
+
+       * configure.ac: Check for ctermid().  From Werner on stable
+       branch.
+
+       * configure.ac (GPGKEYS_LDAP,GPGKEYS_HKP): Add $EXEEXT.  From
+       Werner on stable branch.
+
+       * configure.ac (try_gettext): Remove special case for cygwin.
+       This removes all the DOS specific macros and let Cygwin work like
+       a real OS.  Needs a couple of changes elsewhere but after all,
+       GnuPG presents itself much more like a Posix program and can be
+       used in a full Cygwin environment; e.g. used along with mutt.
+       Changes suggested by Volker Quetschke.  From Werner on stable
+       branch.
+
+       * acinclude.m4 (GNUPG_SYS_NM_PARSE): Allow for underscore in test
+       symbols.  Useful for Cygwin builds.
+       (GNUPG_SYS_SYMBOL_UNDERSCORE): Don't hardwire to yes for Cygwin.
+       From Werner on stable branch.
+
+       * README: Add an installation note for Darwin 6.1.  From Werner on
+       stable branch.
+
+2002-11-12  Werner Koch  <wk@gnupg.org>
+
+       Released 1.3.1
+
+2002-11-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note trust signature support,
+       --hidden-encrypt-to/--hidden-recipient, and long algorithm name
+       support everywhere.
+
+2002-10-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Put gnupg.spec in the root directory so rpm -ta
+       works.
+
+       * configure.ac: Add a check for volatile.
+
+2002-10-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --disable-regex in case some platform just
+       can't handle the regex stuff.  This means they can't fully handle
+       trust sigs with an attached regex either.
+
+2002-10-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Regex tests adapted from mutt to decide whether to
+       use the internal regex code or not.
+
+2002-10-18  Werner Koch  <wk@gnupg.org>
+
+       Released 1.3.0.
+       
+       * configure.ac: Changed version number comments.
+       (ALL_LINGUAS): Removed all except for de.  During development it
+       might not be a good idea to keep all of them - they get outdated
+       too soon and diff files will be far too large.
+
+2002-10-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * README: Multiple A record rotation works with MINGW32 now, and
+       clarify how it works with LDAP.
+
+2002-10-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * README: Some typo fixes from Florian Weimer, and bump version
+       number.
+
+2002-10-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Some 1.3 notes.
+
+2002-10-12  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (NAME_OF_DEV_URANDOM): Use /dev/urandom for
+       NetBSD.  Reported by Christian Biere.
+
+2002-10-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: OpenLDAP 2.0.27 changed the dependencies again.
+       Add a "LDAPLIBS" variable so users can try and suggest the right
+       dependencies for their platform.
+
+2002-10-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add an --enable-old-tiger, to revert back to the
+       old OID.
+
+2002-09-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Remove --enable-tiger, as TIGER is now always
+       enabled.
+
+2002-09-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add NETLIBS to EGDLIBS when using EGD as EGD uses
+       sockets.
+
+2002-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * THANKS: Remove duplicate.
+
+       * NEWS: Bring in cosmetic changes from stable branch.
+
+       * configure.ac: Figure out whether the LDAP library supports
+       ldap_get_option, ld_errno, or neither.
+
+2002-09-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Try linking LDAP as just -lldap as it seems very
+       recent OpenLDAPs (>=2.0.23) support that.
+
+2002-09-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Try linking LDAP without -lresolv first, just in
+       case the platform has libresolv, but doesn't actually need it to
+       use LDAP.
+
+2002-09-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Note that the old IDEA plugin won't work with post-1.1.90
+       gpg.
+
+2002-09-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Remove --enable-external-hkp as this is always on
+       now.  Add --disable-hkp to match the other
+       --disable-{keyservertype} options.
+
+       * NEWS, configure.ac: Move to devel version 1.3.
+
+2002-09-11  Werner Koch  <wk@gnupg.org>
+
+       Released 1.1.92.
+
+       * configure.ac (random_modules): The default random module for
+       system lacking a /dev/random is now auto selected at runtime.
+
+2002-09-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: typo.
+
+       * configure.ac: Add a link test for LDAP without -lresolv for
+       HPUX.  Remove "hstrerror" test as it is no longer needed.
+
+2002-09-02  Werner Koch  <wk@gnupg.org>
+
+       * README: Removed the note about a development version so that we
+       later don't forget this.  Minor other changes.
+
+2002-08-29  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (random_modules): Reworked the code to select the
+       random module.  Define USE_ALL_RANDOM_MODULES for value all.
+
+2002-08-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check type of mode_t.
+
+       * NEWS: Clarify that --libexecdir is a configure option.
+
+       * configure.ac: Check for hstrerror.
+
+2002-08-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: Document new ways to enable MDC, and change in automatic
+       compression disabling.
+
+       * configure.ac: No such thing as the "none" random gather any
+       longer.
+
+2002-08-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add an --enable-tiger.
+
+       * NEWS: Clarify new permission checks.
+
+2002-08-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: If the static IDEA cipher is present, disable
+       dynamic loading.  Also fix backwards grammar of keyserver
+       exec-path CHECKING message.
+
+2002-08-05  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Bumbed version number.
+
+2002-08-04  Werner Koch  <wk@gnupg.org>
+
+       Released 1.1.91.
+
+       * configure.ac (ALL_LINGUAS): Added Catalan.
+
+2002-08-02  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Removed all extension stuff but keep the tests for
+       dlopen.  We don't need to figure out the flags required.  All
+       stuff is now statically loaded.
+
+2002-07-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * README, configure.ac: --with-exec-path is now clarified into
+       --disable-keyserver-path
+
+       * NEWS: changes since 1.1.90.
+
+2002-07-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Include a GNUPG_LIBEXECDIR in g10defs.h, as well
+       as a SUBST for Makefiles.
+
+2002-07-22  Timo Schulz  <ts@winpt.org>
+
+       * configure.ac: Replace the 'c:/' variables with 'c:\' due
+       to the fact we already use '\' in the remaining code.
+       
+2002-07-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add --with-mailprog to override the use of
+       sendmail with another MTA.  We can use anything that follows the
+       "$MAILPROG -t" convention.
+
+2002-07-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: --enable-exec-path should be a 'with'.  Fix 'no'
+       cases of --with-exec-path and --with-photo-viewer.
+
+       * README: Document --disable-exec, --disable-photo-viewers,
+       --disable-keyserver-helpers, --enable-exec-path, and
+       --with-photo-viewer.
+
+       * configure.ac: Add --with-photo-viewer to lock the viewer at
+       compile time and --disable-keyserver-helpers and
+       --disable-photo-viewers to allow disabling one without disabling
+       the other.
+
+2002-07-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Allow setting USE_EXEC_PATH to lock the exec-path
+       to a fixed value.
+
+2002-07-01  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Set version number to 1.1.91.
+
+        Released 1.1.90.
+       
+       * INSTALL: Replaced by generic install file.
+       * README: Marked as development version and moved most stuff of
+       the old INSTALL file to here.
+
+2002-06-30  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Link W32 version against libwsock32.
+
+2002-06-29  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (development_version): New.
+       (HAVE_DEV_RANDOM_IOCTL): Removed test for it; it was never used.
+
+       * BUGS, AUTHORS: Add a note on how to send security related bug
+       reports.
+
+2002-06-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: changes since 1.0.7.
+
+       * configure.ac: Set new version number (1.1.90), and fix Solaris
+       compiler flags for shared objects.
+
+2002-06-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Move -lsocket and -lnsl checks before LDAP link
+       tests so they work properly on Solaris.  Noted by David Champion.
+       Also, check for the Mozilla LDAP library if the OpenLDAP library
+       check fails.  Put -lsocket and -lnsl in NETLIBS rather than LIBS
+       so not all programs are forced to link to them.
+       
+2002-06-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Add a switch for the experimental external HKP
+       keyserver interface.
+
+2002-05-22  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Check for strcasecmp and strncasecmp.  Removed
+       stricmp and memicmp checks.
+
+2002-05-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: If LDAP comes up unusable, try #including <lber.h>
+       before giving up.  Old versions of OpenLDAP require that.
+
+2002-05-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: In g10defs.h, use \ for the directory separator
+       when HAVE_DOSISH_SYSTEM is on.
+
+       * configure.ac: Add --disable-exec flag to disable all remote
+       program execution.  --disable-exec implies --disable-ldap and
+       --disable-mailto.  Also look in /usr/lib for sendmail.  If
+       sendmail is not found, do not default - just fail.
+
+2002-04-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Try and link to a sample LDAP program to check if
+       the LDAP we're about to use is really sane.  The most common
+       problem (using a very old OpenLDAP), could be fixed with an extra
+       #include, but this would not be very portable to other LDAP
+       libraries.
+
+2002-04-29  Werner Koch  <wk@gnupg.org>
+
+       Released 1.0.7.
+
+       * README: Fixed some minor things.
+
+2002-04-25  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Check for locale.h and setlocale
+
+2002-04-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * Update NEWS with recent changes.
+
+2002-04-19  Werner Koch  <wk@gnupg.org>
+
+       Released 1.0.6e snapshot.
+
+2002-04-12  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Add a warning note to the definition of the
+       EXTSEP macros.
+
+2002-04-09  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (ALL_LINGUAS): Added Czech, Galician and Greek
+       translations.  s/es_ES/es/.
+
+2002-03-06  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (ALL_LINGUAS): s/pt_PT/pt/
+
+2002-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * Add a AC_DEFINE(_GNU_SOURCE).  Since this is always defined in
+       config.h, the various autoconf tests should be tested with it
+       enabled.  This also works around a compiler warning caused by a
+       minor header bug in glibc 2.1 that causes fseeko to be defined
+       when building gpg, but not when tested for in configure.
+
+2002-03-03  Werner Koch  <wk@gnupg.org>
+
+       Release 1.0.6d snapshot.
+
+2002-01-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * NEWS: about symmetric messages and fixed file sizes.
+
+2001-12-22  Werner Koch  <wk@gnupg.org>
+
+        Released 1.0.6c snapshot.
+       
+       * configure.ac (AH_BOTTOM): Moved EXEC_TEMPFILE_ONLY to here.
+
+       * acconfig.h:  Removed, it should no longer be used.
+
+2001-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * Add an acconfig.h to define EXEC_TEMPFILE_ONLY on platforms that
+       can't do fork/exec.
+
+2001-12-21  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (dist-hook): We should also look in include for
+       distfiles.
+       (EXTRA_DIST): Remove VERSION because it is generated by dist-hook.
+
+2001-12-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: replacement function for mkdtemp()
+
+2001-12-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * configure.ac: Check for stat()
+
+2001-12-19  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Support Cygwin target
+       * configure.ac [CYGWIN32]: Don't build tiger.  By Disastry.
+
+2001-12-18  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (SUBDIRS): Add keyserver.
+       (dist-hook): Only look in mpi and scripts for distfiles; this way
+       we don't include those of a stale "make dist" directory.
+
+2001-10-23  Werner Koch  <wk@gnupg.org>
+
+       Released 1.0.6b snapshot.
+
+2001-10-22  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Fixed for automake 1.5 
+
+2001-10-17  Werner Koch  <wk@gnupg.org>
+
+       * README: Removed note on local_ID.
+
+2001-09-28  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: From now on add a string "-cvs" to the version to
+       indicate that this is a pre-release of the given version number.
+
+2001-09-26  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac [MINGW32]: Switched from wsock.dll to ws2_32.dll.
+
+2001-09-09  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: autoconf changed the name of the maintainer mode
+       flag, so that not all warnings where enabled. Fixed that.
+       Reported by Dirk Meyer.
+
+2001-09-07  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Test for strsep().
+
+2001-09-03  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Removed GDBM tests.
+
+2001-08-23  Werner Koch  <wk@gnupg.org>
+
+       * configure.in (AC_FUNC_FSEEKO): Add.
+       (AC_CHECK_FUNCS): Remove fseeko. By Paul Eggert <eggert@twinsun.com>.
+
+2001-08-22  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (gethrtime): Enhanced the test by running a test
+       program. 
+       * INSTALL: Removed the note about Solaris problems because the
+       above test should catch this.
+
+2001-08-20  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4: Add check for plock if mlock is broken.
+       * configure.ac: Use regular tests for -lsocket and -lnsl,
+       more thorough test for gethrtime, allow specifying the path to
+       the zlib library if it is not in the default compiler/linker
+       search path, use ${datadir}.  All these test enhancements are by
+       Albert Chin.
+
+       * configure.ac: Set some compiler flags for dec-osf and hpux. By
+       Tim Mooney.
+
+       * configure.ac: Create g10defs.h with EXTSEP_S et al. 
+
+2001-08-03  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac (VERSION,PACKAGE): Fixed quoting. 
+
+2001-07-26  Werner Koch  <wk@gnupg.org>
+
+       * configure.ac: Finally got it running with the new autoconf. Had
+       to define PACKAGE and VERSION and to add -I.. to each Makefile.am.
+
+2001-07-09  Werner Koch  <wk@gnupg.org>
+
+        Migrated to autoconf 2.50.
+       * acinclude.m4: Removed the temporary LFS macros and GNUPG_LINK_FILES.
+       * acconfig.h: Removed
+       * configure.in: Replaced by...
+       * configure.ac: and modified for use with autoconf 2.50, use a
+       literal string for the version number.  Replaced GNUPG_LINK_FILES
+        with AC_CONFIG_LINKS and moved some informational messages to the end.
+       * VERSION: Removed.
+       * Makefile.am (DISTCLEANFILES): gettext is better now; no more
+       need to remove the libintl.h symlink.
+        (dist-hook): Create VERSION file.
+       
+2001-06-08  Werner Koch  <wk@gnupg.org>
+
+       * configure.in (DYNLINK_MOD_CFLAGS): Use -shared with dec-osf.
+       Reported by Chris Adams.  Merged some cases.
+
+2001-05-29  Werner Koch  <wk@gnupg.org>
+
+       Released version 1.0.6.
+
+2001-05-28  Werner Koch  <wk@gnupg.org>
+
+       * configure.in (BUILD_INCLUDED_LIBINTL): Set to no for W32.
+
+2001-04-29  Werner Koch  <wk@gnupg.org>
+
+       Released version 1.0.5.
+
+2001-04-28  Werner Koch  <wk@gnupg.org>
+
+       Updated all copyright notices.
+
+2001-04-27  Werner Koch  <wk@gnupg.org>
+
+       * README: Removed a few outdated paragraphs.
+
+2001-04-17  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4 (GNUPG_CHECK_DOCBOOK_TO_TEXI): New.
+       (GNUPG_CHECK_TYPEDEF): Define _GNU_SOURCE because we will use it
+       anyway.
+
+       * configure.in: Use it here.
+       
+       * configure.in (ALL_LINGUAS): Add Estonian translation by Toomas Soome.
+       (use_m_debug): Removed --enable-m-debug because it does not work
+       anymore.
+
+2001-04-06  Werner Koch  <wk@gnupg.org>
+
+       * configure.in (ALL_LINGUAS): Add Turkish translation.  Thanks
+       to Nilgun Belma Buguner.
+
+2001-03-18  Werner Koch  <wk@gnupg.org>
+
+       * configure.in: Hardwire the use of -lsocket for some
+       systems. Thanks to Reinhard Wobst.
+
+2001-03-13  Werner Koch  <wk@gnupg.org>
+
+       * configure.in: Add copyright notice and -lwsock32.
+
+2001-03-12  Werner Koch  <wk@gnupg.org>
+
+       * INSTALL: Add a note to VPATH builds. 
+
+2001-03-08  Werner Koch  <wk@gnupg.org>
+
+       * debian/: Applied update from James.
+
+       Added copyright and license notices to some more files.
+
+2001-01-18  Werner Koch  <wk@gnupg.org>
+
+       * configure.in: Removed tool definitions for MingW32
+
+2000-11-17  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4 (GNUPG_CHECK_FAQPROG): Do not prinnt the warning.
+
+2000-11-11  Paul Eggert  <eggert@twinsun.com>
+
+        Actually Paul's patches are dated 2000-20-17; I applied them today
+       and merged some ChangeLog entries (wk@gnupg.org).
+       
+        * configure.in (AC_SYS_LARGEFILE): Add.
+        (try_large_file): Remove.  All uses removed.
+        (AC_CHECK_FUNCS): Remove fopen64 and fstat64.
+
+        * acinclude.m4 (AC_SYS_LARGEFILE_TEST_INCLUDES,
+        AC_SYS_LARGEFILE_MACRO_VALUE, AC_SYS_LARGEFILE): New macros,
+        taken from GNU tar.
+
+        * configure.in (AC_CHECK_FUNCS): Add fseeko.
+
+2000-10-17  Werner Koch  <wk@gnupg.org>
+
+       * configure.in: Disabled fopen64 checks for Solaris and HPUX.
+
+2000-10-13  Werner Koch  <wk@gnupg.org>
+
+       * configure.in: Append mpi/mpi-asm-defs.h to g10defs.h
+
+2000-10-09  Werner Koch  <wk@gnupg.org>
+
+       * acinclude.m4: Changed wording of the faqprog.pl warning.
+
+Wed Oct  4 15:50:18 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * configure.in: Set DYNLINK_MOD_CFLAGS for Irix. It seems that Irix
+        needs the -shared flag.  In 1.1 we are going to use libtool, so this
+        module stuff will get redesigned anyway. Suggested by Jeff Long.
+
+Thu Sep 14 14:20:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * acinclude.m4 (GNUPG_CHECK_FAQPROG): New.
+        * configure.in: Test for this.
+
+        * configure.in (DYNLINK_MOD_CFLAGS): Fix by David Champion.
+
+Wed Sep  6 17:55:47 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * configure.in: Check for fstat64 and fopen64
+
+Wed Sep  6 14:59:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * configure.in (GNUPG_HOMEDIR): New.
+
+Fri Aug 25 16:05:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * configure.in:  Changes to allow for Solaris random device.
+        By Nils Ellmenreich.
+        (--with-egd-socket): New.
+
+Wed Aug 23 19:52:51 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * acinclude.m4 (GNUPG_CHECK_MLOCK):  Removed that silly mkdir().
+
+Wed Jul 19 11:26:43 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * configure.in (mingw32): Changes to allow for mingw32msvc
+
+Fri Jul 14 10:17:30 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * acinclude.m4 (GNUPG_CHECK_MLOCK): Fixed syntax error in C code.
+
+Wed Jul 12 13:32:06 CEST 2000  Werner Koch  <wk@openit.de>
+
+  Version 1.0.2
+
+Fri Jun  9 10:09:52 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * configure.in: Add check for termio.h, wait unctiosn and sigaction.
+
+Wed Jun  7 19:19:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * acinclude.m4 (MKDIR_TAKES_ONE_ARG): Check some headers. By Gaël Quéri.
+  * configure.in (AM_INIT_AUTOMAKE): Use this now. By Gaël.
+
+Mon Jun  5 12:37:43 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * acnclude.m4 (GNUPG_CHECK_EXPORTDYNAMIC): Replacement for
+  GNUPG_CHECK_RDYNAMIC which should handle gcc with non GNU ld nicer.
+  Contributed by Dave Dykstra.
+  * configure.in (GNYPG_CHECK_RDYNAMIC): Replaced by the new check.
+
+  * configure.in (AC_CHECK_AWK): Moved before the first use of AWK. Suggested
+  by Dave Dykstra.
+
+Tue May 30 16:37:55 CEST 2000  Werner Koch  <wk@openit.de>
+
+  Version 1.0.1-ePit-1
+
+Sun May 28 13:55:17 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * acinclude.m4 (GNUPG_SYS_NM_PARSE): Added BSDI support.
+       (GNUPG_CHECK_RDYNAMIC): Ditto.
+
+Wed Apr 19 10:57:26 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * acconfig.h (HAVE_MLOCK): Added
+
+Wed Mar 22 13:50:24 CET 2000  Werner Koch  <wk@openit.de>
+
+       * acinclude.m4 (GNUPG_CHECK_MLOCK): Changed the way to test for
+       librt.  Test suggested by Jeff Long.
+
+Fri Mar 17 17:50:25 CET 2000  Werner Koch  <wk@openit.de>
+
+       * acinclude.m4 (GNUPG_CHECK_MLOCK): Do librt check only when
+       we can't link a test program.  This way GNU systems don't need
+       to link against linrt.
+       (GNUPG_CHECK_IPC): Fixed use of TRY_COMPILE macro.  From Tim Mooney.
+
+2000-03-14 12:07:54  Werner Koch  (wk@habibti.openit.de)
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Add support for
+       DJGPP.
+       (GNUPG_CHECK_MLOCK): Check whether mlock sits in librt.
+       * configure.in: Add a test for unisgned long long.
+
+Tue Mar  7 18:45:31 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): Add NetBSD. By Thomas Klausner.
+       * configure.in (DYNLINK_MOD_CFLAGS): Set different for NetBSD.
+
+Thu Mar  2 15:37:46 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in: Add check for clock_gettime
+
+Wed Feb 23 10:07:57 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in (ALL_LINGUAS): Add nl.
+
+Wed Feb 16 16:25:09 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in (ALL_LINGUAS): Add Esperanto.
+
+Wed Feb 16 14:09:00 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in (ALL_LINGUAS): Add sv and ja.
+
+       * AUTHORS: Converted to a more compact format.
+
+       * INSTALL: Wrote a note about a Solaris problem.
+
+Thu Feb 10 17:39:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in: Use /usr/local for CFLAGS and LDFLAGS when
+       target is freebsd.  By Rémi.
+
+Thu Jan 13 19:31:58 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * configure.in: Do not set development version when the version has
+       a dash in it.  Suggested by Dave Dykstra.
+
+Thu Dec 16 10:07:58 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * VERSION: Set to 1.0.1.
+
+       * configure.in: Removed substitution for doc/gph/Makefile.
+       Do all the gcc warning only in maintainer mode.
+
+Thu Dec  9 10:31:05 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * INSTALL: Add a hint for AIX. By Jos Backus.
+
+Sat Dec  4 12:30:28 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * configure.in (dlopen): Use CHECK_FUNC for a test of dlopen in libc.
+       Suggested by Alexandre Oliva.
+       (-Wall): Moved the settting of gcc warning options near to the end
+       so that tests don't get confused.  Suggested by Paul D. Smith.
+
+Mon Nov 22 11:14:53 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * BUGS: Replaced content with a link to the online list.
+
+Fri Nov 12 20:33:19 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * README: Fixed a type and add a note about the gnupg-i18n ML.
+
+Thu Oct 28 16:08:20 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * acinclude.m4, configure.in (GNUPG_CHECK_GNUMAKE): New.
+
+Sat Oct  9 20:34:41 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * configure.in: Tweaked handling of random modules and removed
+       dummy support for libgcrypt.
+       * Makefile.am: Removed libgcrypt support.
+       * cgrypt/ : Removed.
+
+       * Makefile.am:  Removed libtool.
+
+Fri Oct  8 20:32:01 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * configure.in: Fixed quoting in test for development version.
+
+       * THANKS: Add entries for Michael, Brenno and J Horacio who did
+       very nice Howto documents - I apoligize for forgetting to mention them
+       earlier.
+
+Tue Sep 28 20:54:37 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * textfilter.c (copy_clearsig_text) [__MINGW32__): Use CR,LF.
+
+Fri Sep 17 12:56:42 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Add "-lcap" when capabilities are requested.
+       Add the conditional CROSS_COMPILING.
+       * Makefile.am: Don't use checks when CROSS_COMPILING.
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (ALL_LINGUAS): Add pt_PT.
+
+       * configure.in: Some tweaks for cross compiling under MingW32
+       * acconfig.h (USE_STATIC_RNDW32): New.
+
+Tue Sep  7 17:08:10 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Set to 1.0.0.
+
+Mon Sep  6 19:59:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Create makefile in doc/gph
+
+       * acinclude.m4 (GNUPG_FUNC_MKDIR_TAKES_ONE_ARG): New
+       * configure.in: use the above.
+
+Thu Sep  2 16:40:55 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Set to 0.9.11.
+
+Tue Aug 31 17:20:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Minor changes to the OS/2 and Mingw32 system labels.
+       Add a printable name for Hurd.
+
+Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Some support for DJGPP (Mark Elbrecht)
+
+Wed Aug  4 10:34:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Set to 0.9.10.
+
+Mon Jul 26 09:34:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): remove init of ac_cv_...
+
+       * Makefile.am (DISCLEANFILES): New
+
+Fri Jul 23 13:53:03 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Set to 0.9.9.
+
+       * configure.in: Print a notice when rndunix is used.
+
+Thu Jul 15 10:15:35 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Fixed last modification.
+
+Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Support for libtool.
+       * configure.in: Ditto.
+
+Tue Jun 29 21:44:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (use_local_zlib): The lost dollar is back.
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): Add EMX case.
+       * configure.in: Another variant of the MX vendor string
+
+       * configure.in (--with-capabilities): Some test code (Remi).
+
+Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): Support for HPUX and IRIX.
+       * configure.in (HAVE_DL_SHL_LOAD): New for HPUX (Dave Dykstra).
+
+       * VERSION: Now 0.9.8
+
+Wed Jun 16 20:16:21 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Add test for docbook-to-man
+
+Tue Jun 15 12:21:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_SYS_NM_PARSE): Support for {net,free}bsd,
+
+Thu Jun 10 14:18:23 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (ZLIB,GDBM): Check both, header and lib.
+
+Sat Jun  5 15:30:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (key_present_in_pk_list): New (Michael).
+
+Tue May 25 19:50:32 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (IS_DEVELOPMENT_VERSION): Fixed detection.
+
+Sun May 23 14:20:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_SYS_SYMBOL_UNDERSCORE): assume yes when
+       cross-compiling.
+
+Mon May 17 21:54:43 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (socket): Fix for Unisys by Katsuhiro Kondou.
+
+Sat May  8 19:28:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * NEWS: Add a marker line which I forgot to do for 0.9.6.
+
+Thu May  6 14:18:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * README: Minor updates
+
+       * VERSION: Now 0.9.6
+
+Thu Apr  8 09:35:53 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): Fix for
+                                              amiga-openbsd (Peter Reich)
+       (GNUPG_PROG_NM): Ditto
+
+Wed Apr  7 20:51:39 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am (g10defs.h): Removed.
+       * configure.in (AC_OUTPUT_COMMANDS): Create g10defs.h
+
+Sat Mar 20 12:55:33 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Now 0.9.5
+
+Sun Mar 14 19:34:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (AM_SYS_SYMBOL_UNDERSCORE): Removed because it is
+       now in the latest libtool.
+
+Thu Mar 11 16:39:46 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Removed the need for libtool
+
+Mon Mar  8 20:47:17 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (DLSYM_NEEDS_UNDERSCORE): Replaced.
+       * acinclude.in (AM_SYS_SYMBOL_UNDERSCORE): New.
+
+       * VERSION: Now 0.9.4
+
+Sun Feb 28 19:11:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (dld): Test disabled.
+
+Fri Feb 26 17:55:41 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * encode.c (encode_simple): temporary fix.
+
+Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: New option --enable-static-rnd.
+
+Mon Feb 22 20:04:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * BUGS: Now we assign bug numbers.
+       * OBUGS: New to keep rack o fixed bugs (CVS only)
+
+Fri Feb 19 18:01:54 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Released 0.9.3
+
+Fri Feb 19 15:49:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4: Removed gettext macros.
+
+Tue Feb 16 14:10:02 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in (socket): Check for -lsocket and -lnsl.
+       (osf4): Disable all warnings for DEC's cc.
+       (-Wall): Add more warning options for gcc
+
+Sat Feb 13 12:04:43 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Changed detection of compiler flags.
+       * intl/ : Removed directory
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): Fix for freebsd 2.2
+
+       * configure.in: a lot of changes to allow selection of modules.
+       Add support for OS/2.
+
+       * acinclude.m4: add some more caching
+
+       * README: Spelling and grammar corrections (John A. Martin)
+       * INSTALL: Ditto.
+
+Wed Jan 20 21:40:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: --enable-m-guard is now default
+
+Wed Jan 13 12:49:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * INSTALL: Applied new information how to build rpms by Fabio Coatti
+       * Makefile.in (gnupg.spec): Changed the names.
+
+Tue Jan 12 11:17:18 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.links (m68k-atari-mint): New
+
+Tue Jan 12 09:17:19 CET 1999  Gaël Quéri <gqueri@mail.dotcom.fr>
+
+       * all: Fixed typos all over the place
+
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Add a way to statically link rndunix
+
+Sun Jan  3 15:28:44 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m4 (GNUPG_CHECK_RDYNAMIC): New.
+       * configure.in (DYNLOAD_CFLAGS): Use result from CHECK_RDYNAMIC
+
+Wed Dec 23 13:18:14 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * README: Replaced the command overview with a short intro.
+
+Sat Dec 12 18:40:32 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * configure.in: Add check for dlopen in libc (Greg Troxel)
+       and a new define
+       * acconfig.h (DLSYM_NEEDS_UNDERSCORE): New.
+
+Thu Dec 10 20:15:36 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * acinclude.m (GNUPG_CHECK_PIC): New
+       * configure.in, acinclude.m4: Renamed all WK_ to GNUPG_
+
+Tue Dec  8 15:09:29 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * VERSION: Set to 0.4.5
+
+Wed Nov 25 12:38:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (USE_RNDLINUX): New.
+
+Fri Nov 20 19:34:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * VERSION: Released 0.4.4
+
+       * configure.in (try_asm_modules): For option --disable-asm
+
+Tue Nov 10 19:32:40 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (MPI_SFLAGS): New.
+
+Tue Nov 10 13:44:53 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ABOUT-NLS: New
+       * configure.in (AC_REVISION): New.
+
+Sun Nov  8 18:20:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * VERSION: Set to 0.4.3
+
+Sun Oct 25 19:49:37 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (g10defs.h): New macro GNUPG_DATADIR.
+
+Wed Oct 21 17:24:24 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in: Removed gettext kludge
+       * acinclude.m4: Add patched AM_WITH_NKS macro
+
+Tue Oct 20 19:03:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in: Kludge to make AM_GNU_GETTEXT work,
+       changed some macors to more modern versions. Also
+       changeg the all makefiles to remove duplicate ../intl.
+       * acinclude.m4: Removed the gettext stuff, as this
+       already comes with automake now.
+
+Wed Oct 14 12:11:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (NAME_OF_DEV_RANDOM): New.
+       (DYNLINK_MOD_CFLAGS): New.
+
+Thu Oct  8 10:55:15 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (g10defs.h): creates include file
+       * acconfig.h: now includes g10defs.h
+       * configure.in: Removed G10_LOCALEDIR and GNUPG_LIB
+
+Thu Sep 17 18:49:40 1998  Werner Koch  (wk@(none))
+
+       * Makefile.am (dist-hook): Now creates RPM file.
+       * scripts/gnupg.spec: New template file for RPMs
+
+Thu Jul 30 19:17:07 1998  Werner Koch  (wk@(none))
+
+       * acinclude.h (WK_CHECK_IPC): New
+       * configure.in : Add checks for SysV IPC
+
+Thu Jun 25 11:18:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (--disable-dynload): New.
+
+Wed Jun 10 07:48:59 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * configure.in (GNUPG_LIBDIR): New.
+
+Mon May 25 19:10:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rand-unix.c (fast_random_poll): fixed syntax bug.
+
+Mon May 11 10:21:31 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (PRINTABLE_OS_NAME): Linux is now GNU/Linux
+
+Tue Apr 14 19:08:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * [all files]: Applied Matthew Skala's typo and grammar fixes.
+
+Wed Mar  4 10:32:40 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (getrusage,gettimeofday): New tests.
+
+Fri Feb 27 13:14:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (--disable-m-guard): New.
+
+Thu Feb 26 17:09:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in, acinclude.m4, intl/, po/: New macros taken
+       from GNOME, switched to automake 1.2f
+
+Thu Feb 26 09:05:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (doc/Makefile): New
+
+Thu Feb 26 07:40:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in: Changed gettext stuff
+
+Wed Feb 25 11:44:10 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * checks/*test : restructured the directory.
+
+Tue Feb 24 15:59:12 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in: Changed the name of the package to GNUPG and
+       chnaged several other names too.
+
+Wed Feb 18 17:36:45 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (checks): New.
+
+Sat Feb 14 15:37:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (mpi_config_done): Removed asm links caching.
+
+Sat Feb 14 14:02:20 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in (PRINTABLE_OS_NAME): New.
+       * acconfig.h: Likewise.
+
+Fri Feb 13 19:43:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * configure.in : Fixed zlib stuff
+       * Makefile.am: Likewise
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003,
+          2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..095b1eb
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,231 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about.  Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory.  After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..3f1d670
--- /dev/null
@@ -0,0 +1,53 @@
+# Copyright (C) 1998,1999,2000,2001,2003 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+ACLOCAL_AMFLAGS = -I m4
+DISTCHECK_CONFIGURE_FLAGS = --enable-selinux-support
+AUTOMAKE_OPTIONS = dist-bzip2 filename-length-max=99
+
+if CROSS_COMPILING
+checks =
+else
+checks = checks
+endif
+
+SUBDIRS = m4 intl zlib util mpi cipher tools g10 keyserver po doc ${checks}
+EXTRA_DIST = scripts/config.rpath  PROJECTS BUGS config.h.in autogen.sh
+DISTCLEANFILES = g10defs.h 
+
+# Add all the files listed in "distfiles" files to the distribution,
+# apply version numbers to some files and create a VERSION file which
+# we need for the Prereq: patch file trick.
+dist-hook:
+       @set -e; \
+        for file in `cd $(top_srcdir); \
+                    find scripts mpi include -type f -name distfiles`; do \
+           dir=`dirname $$file` ; $(mkinstalldirs) $(distdir)/$$dir ; \
+           for i in distfiles `cat $(top_srcdir)/$$file` ; do \
+               ln $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i 2> /dev/null \
+               || cp -p $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i; \
+           done ; \
+       done
+       @set -e; \
+       sed -e 's/@pkg_version@/$(VERSION)/g' \
+           $(top_srcdir)/scripts/gnupg.spec.in \
+           > $(distdir)/gnupg.spec
+       echo "$(VERSION)" > $(distdir)/VERSION
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..637baa7
--- /dev/null
@@ -0,0 +1,775 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998,1999,2000,2001,2003 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+       $(top_srcdir)/configure $(top_srcdir)/intl/Makefile.in \
+       ABOUT-NLS AUTHORS COPYING ChangeLog INSTALL NEWS THANKS TODO \
+       scripts/ChangeLog scripts/compile scripts/config.guess \
+       scripts/config.rpath scripts/config.sub scripts/depcomp \
+       scripts/install-sh scripts/mdate-sh scripts/missing \
+       scripts/mkinstalldirs scripts/texinfo.tex
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = intl/Makefile zlib.h zconf.h
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+       html-recursive info-recursive install-data-recursive \
+       install-exec-recursive install-info-recursive \
+       install-recursive installcheck-recursive installdirs-recursive \
+       pdf-recursive ps-recursive uninstall-info-recursive \
+       uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = m4 intl zlib util mpi cipher tools g10 keyserver po doc \
+       checks
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  { test ! -d $(distdir) \
+    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+         && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+ACLOCAL_AMFLAGS = -I m4
+DISTCHECK_CONFIGURE_FLAGS = --enable-selinux-support
+AUTOMAKE_OPTIONS = dist-bzip2 filename-length-max=99
+@CROSS_COMPILING_FALSE@checks = checks
+@CROSS_COMPILING_TRUE@checks = 
+SUBDIRS = m4 intl zlib util mpi cipher tools g10 keyserver po doc ${checks}
+EXTRA_DIST = scripts/config.rpath  PROJECTS BUGS config.h.in autogen.sh
+DISTCLEANFILES = g10defs.h 
+all: config.h
+       $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+       @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
+             cd $(srcdir) && $(AUTOMAKE) --gnu  \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           echo ' $(SHELL) ./config.status'; \
+           $(SHELL) ./config.status;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+       @if test ! -f $@; then \
+         rm -f stamp-h1; \
+         $(MAKE) stamp-h1; \
+       else :; fi
+
+stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
+       @rm -f stamp-h1
+       cd $(top_builddir) && $(SHELL) ./config.status config.h
+$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) 
+       cd $(top_srcdir) && $(AUTOHEADER)
+       rm -f stamp-h1
+       touch $@
+
+distclean-hdr:
+       -rm -f config.h stamp-h1
+intl/Makefile: $(top_builddir)/config.status $(top_srcdir)/intl/Makefile.in
+       cd $(top_builddir) && $(SHELL) ./config.status $@
+uninstall-info-am:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+$(RECURSIVE_TARGETS):
+       @failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @failcom='exit 1'; \
+       for f in x $$MAKEFLAGS; do \
+         case $$f in \
+           *=* | --[!k]*);; \
+           *k*) failcom='fail=yes';; \
+         esac; \
+       done; \
+       dot_seen=no; \
+       case "$@" in \
+         distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+         *) list='$(SUBDIRS)' ;; \
+       esac; \
+       rev=''; for subdir in $$list; do \
+         if test "$$subdir" = "."; then :; else \
+           rev="$$subdir $$rev"; \
+         fi; \
+       done; \
+       rev="$$rev ."; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+         || eval $$failcom; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       done
+ctags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+       done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+         include_option=--etags-include; \
+         empty_fix=.; \
+       else \
+         include_option=--include; \
+         empty_fix=; \
+       fi; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test ! -f $$subdir/TAGS || \
+             tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+         fi; \
+       done; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       $(am__remove_distdir)
+       mkdir $(distdir)
+       $(mkdir_p) $(distdir)/intl $(distdir)/keyserver $(distdir)/m4 $(distdir)/po $(distdir)/scripts $(distdir)/tools $(distdir)/zlib
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+         if test "$$subdir" = .; then :; else \
+           test -d "$(distdir)/$$subdir" \
+           || $(mkdir_p) "$(distdir)/$$subdir" \
+           || exit 1; \
+           distdir=`$(am__cd) $(distdir) && pwd`; \
+           top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+           (cd $$subdir && \
+             $(MAKE) $(AM_MAKEFLAGS) \
+               top_distdir="$$top_distdir" \
+               distdir="$$distdir/$$subdir" \
+               distdir) \
+             || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-hook
+       -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
+         ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+         ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
+       || chmod -R a+r $(distdir)
+       @if find $(distdir) -type f -print | \
+         grep '^...................................................................................................' 1>&2; then \
+         echo 'error: the above filenames are too long' 1>&2; \
+         exit 1; \
+       else :; fi
+dist-gzip: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       $(am__remove_distdir)
+dist-bzip2: distdir
+       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+dist-tarZ: distdir
+       tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+       $(am__remove_distdir)
+
+dist-shar: distdir
+       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       $(am__remove_distdir)
+
+dist-zip: distdir
+       -rm -f $(distdir).zip
+       zip -rq $(distdir).zip $(distdir)
+       $(am__remove_distdir)
+
+dist dist-all: distdir
+       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+       $(am__remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       case '$(DIST_ARCHIVES)' in \
+       *.tar.gz*) \
+         GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+       *.tar.bz2*) \
+         bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+       *.tar.Z*) \
+         uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+       *.shar.gz*) \
+         GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+       *.zip*) \
+         unzip $(distdir).zip ;;\
+       esac
+       chmod -R a-w $(distdir); chmod a+w $(distdir)
+       mkdir $(distdir)/_build
+       mkdir $(distdir)/_inst
+       chmod a-w $(distdir)
+       dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+         && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+         && cd $(distdir)/_build \
+         && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+           --with-included-gettext \
+           $(DISTCHECK_CONFIGURE_FLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+         && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+               distuninstallcheck \
+         && chmod -R a-w "$$dc_install_base" \
+         && ({ \
+              (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+              && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+                   distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+             } || { rm -rf "$$dc_destdir"; exit 1; }) \
+         && rm -rf "$$dc_destdir" \
+         && $(MAKE) $(AM_MAKEFLAGS) dist \
+         && rm -rf $(DIST_ARCHIVES) \
+         && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
+       $(am__remove_distdir)
+       @(echo "$(distdir) archives ready for distribution: "; \
+         list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+         sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+       @cd $(distuninstallcheck_dir) \
+       && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+          || { echo "ERROR: files left after uninstall:" ; \
+               if test -n "$(DESTDIR)"; then \
+                 echo "  (check DESTDIR support)"; \
+               fi ; \
+               $(distuninstallcheck_listfiles) ; \
+               exit 1; } >&2
+distcleancheck: distclean
+       @if test '$(srcdir)' = . ; then \
+         echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+         exit 1 ; \
+       fi
+       @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+         || { echo "ERROR: files left in build directory after distclean:" ; \
+              $(distcleancheck_listfiles) ; \
+              exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile config.h
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-hdr distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+       -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+       -rm -rf $(top_srcdir)/autom4te.cache
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+       check-am clean clean-generic clean-recursive ctags \
+       ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-hook \
+       dist-shar dist-tarZ dist-zip distcheck distclean \
+       distclean-generic distclean-hdr distclean-recursive \
+       distclean-tags distcleancheck distdir distuninstallcheck dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-data install-data-am install-exec install-exec-am \
+       install-info install-info-am install-man install-strip \
+       installcheck installcheck-am installdirs installdirs-am \
+       maintainer-clean maintainer-clean-generic \
+       maintainer-clean-recursive mostlyclean mostlyclean-generic \
+       mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+       uninstall uninstall-am uninstall-info-am
+
+
+# Add all the files listed in "distfiles" files to the distribution,
+# apply version numbers to some files and create a VERSION file which
+# we need for the Prereq: patch file trick.
+dist-hook:
+       @set -e; \
+        for file in `cd $(top_srcdir); \
+                    find scripts mpi include -type f -name distfiles`; do \
+           dir=`dirname $$file` ; $(mkinstalldirs) $(distdir)/$$dir ; \
+           for i in distfiles `cat $(top_srcdir)/$$file` ; do \
+               ln $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i 2> /dev/null \
+               || cp -p $(top_srcdir)/$$dir/$$i $(distdir)/$$dir/$$i; \
+           done ; \
+       done
+       @set -e; \
+       sed -e 's/@pkg_version@/$(VERSION)/g' \
+           $(top_srcdir)/scripts/gnupg.spec.in \
+           > $(distdir)/gnupg.spec
+       echo "$(VERSION)" > $(distdir)/VERSION
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..8c56d06
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,1930 @@
+Noteworthy changes in version 1.4.6 (2006-12-06)
+------------------------------------------------
+
+    * Fixed a serious and exploitable bug in processing encrypted
+      packages. [CVE-2006-6235].
+
+    * Fixed a buffer overflow in gpg. [bug#728, CVE-2006-6169]
+
+    * Fixed a bug while decrypting certain compressed and encrypted
+      messages. [bug#537]
+    * Added --s2k-count to set the number of times passphrase mangling
+      is repeated.  The default is 65536 times.
+
+    * Added --passphrase-repeat to set the number of times GPG will
+      prompt for a new passphrase to be repeated.  This is useful to
+      help memorize a new passphrase.  The default is 1 repetition.
+
+    * Added a GPL license exception to the keyserver helper programs
+      gpgkeys_ldap, gpgkeys_curl, and gpgkeys_hkp, to clarify any
+      potential questions about the ability to distribute binaries
+      that link to the OpenSSL library.  GnuPG does not link directly
+      to OpenSSL, but libcurl (used for HKP, HTTP, and FTP) and
+      OpenLDAP (used for LDAP) may.  Note that this license exception
+      is considered a bug fix and is intended to forgive any
+      violations pertaining to this issue, including those that may
+      have occurred in the past.
+
+    * Man pages are now build from the same source as those of GnuPG-2.
+
+
+Noteworthy changes in version 1.4.5 (2006-08-01)
+------------------------------------------------
+
+    * Reverted check for valid standard handles under Windows.
+
+    * More DSA2 tweaks.
+
+    * Fixed a problem uploading certain keys to the smart card.
+
+    * Fixed 2 more possible memory allocation attacks.
+
+    * Added Norwegian translation.
+
+
+Noteworthy changes in version 1.4.4 (2006-06-25)
+------------------------------------------------
+
+    * User IDs are now capped at 2048 bytes.  This avoids a memory
+      allocation attack (see CVE-2006-3082).
+
+    * Added support for the SHA-224 hash.  Like the SHA-384 hash, it
+      is mainly useful when DSS (the US Digital Signature Standard)
+      compatibility is desired.
+
+    * Added support for the latest update to DSA keys and signatures.
+      This allows for larger keys than 1024 bits and hashes other than
+      SHA-1 and RIPEMD/160.  Note that not all OpenPGP implementations
+      can handle these new keys and signatures yet.  See
+      "--enable-dsa2" in the manual for more information.
+
+
+Noteworthy changes in version 1.4.3 (2006-04-03)
+------------------------------------------------
+
+    * If available, cURL-based keyserver helpers are built that can
+      retrieve keys using HKP or any protocol that cURL supports
+      (HTTP, HTTPS, FTP, FTPS, etc).  If cURL is not available, HKP
+      and HTTP are still supported using a built-in cURL emulator.  To
+      force building the old pre-cURL keyserver helpers, use the
+      configure option --enable-old-keyserver-helpers.  Note that none
+      of this affects finger or LDAP support, which are unchanged.
+      Note also that a future version of GnuPG will remove the old
+      keyserver helpers altogether.
+
+    * Implemented Public Key Association (PKA) signature verification.
+      This uses special DNS records and notation data to associate a
+      mail address with an OpenPGP key to prove that mail coming from
+      that address is legitimate without the need for a full trust
+      path to the signing key.
+
+    * When exporting subkeys, those specified with a key ID or
+      fingerpint and the '!' suffix are now merged into one keyblock.
+
+    * Added "gpg-zip", a program to create encrypted archives that can
+      interoperate with PGP Zip.
+
+    * Added support for signing subkey cross-certification "back
+      signatures".  Requiring cross-certification to be present is
+      currently off by default, but will be changed to on by default
+      in the future, once more keys use it.  A new "cross-certify"
+      command in the --edit-key menu can be used to update signing
+      subkeys to have cross-certification.
+
+    * The key cleaning options for --import-options and
+      --export-options have been further polished.  "import-clean" and
+      "export-clean" replace the older
+      import-clean-sigs/import-clean-uids and
+      export-clean-sigs/export-clean-uids option pairs.
+
+    * New "minimize" command in the --edit-key menu removes everything
+      that can be removed from a key, rendering it as small as
+      possible.  There are corresponding "export-minimal" and
+      "import-minimal" commands for --export-options and
+      --import-options.
+
+    * New --fetch-keys command to retrieve keys by specifying a URI.
+      This allows direct key retrieval from a web page or other
+      location that can be specified in a URI.  Available protocols
+      are HTTP and finger, plus anything that cURL supplies, if built
+      with cURL support.
+
+    * Files containing several signed messages are not allowed any
+      longer as there is no clean way to report the status of such
+      files back to the caller.  To partly revert to the old behaviour
+      the new option --allow-multisig-verification may be used.
+
+    * The keyserver helpers can now handle keys in either ASCII armor
+      or binary format.
+
+    * New auto-key-locate option that takes an ordered list of methods
+      to locate a key if it is not available at encryption time (-r or
+      --recipient).  Possible methods include "cert" (use DNS CERT as
+      per RFC2538bis, "pka" (use DNS PKA), "ldap" (consult the LDAP
+      server for the domain in question), "keyserver" (use the
+      currently defined keyserver), as well as arbitrary keyserver
+      URIs that will be contacted for the key.
+
+    * Able to retrieve keys using DNS CERT records as per RFC-4398.
+
+
+Noteworthy changes in version 1.4.2 (2005-07-26)
+------------------------------------------------
+
+    * New command "verify" in the card-edit menu to display
+      the Private-DO-3.  The Admin command has been enhanced to take
+      the optional arguments "on", "off" and "verify".  The latter may
+      be used to verify the Admin Pin without modifying data; this
+      allows displaying the Private-DO-4 with the "list" command.
+
+    * Rewrote large parts of the card code to optionally make use of a
+      running gpg-agent.  If --use-agent is being used and a gpg-agent
+      with enabled scdaemon is active, gpg will now divert all card
+      operations to that daemon.  This is required because both,
+      scdaemon and gpg require exclusive access to the card reader. By
+      delegating the work to scdaemon, both can peacefully coexist and
+      scdaemon is able to control the use of the reader.  Note that
+      this requires at least gnupg 1.9.17.
+
+    * Fixed a couple of problems with the card reader.
+
+    * Command completion is now available in the --edit-key and
+      --card-edit menus.  Filename completion is available at all
+      filename prompts.  Note that completion is only available if the
+      system provides a readline library.
+
+    * New experimental HKP keyserver helper that uses the cURL
+      library.  It is enabled via the configure option --with-libcurl
+      like the other (also experimental) cURL helpers.
+
+    * New key cleaning options that can be used to remove unusable
+      (expired, revoked) signatures from a key.  This is available via
+      the new "clean" command in --edit-key on a key by key basis, as
+      well as via the import-clean-sigs/import-clean-uids and
+      export-clean-sigs/export-clean-uids options for --import-options
+      and --export-options.  These are currently off by default, and
+      replace the import-unusable-sigs/export-unusable-sigs options
+      from version 1.4.1.
+
+    * New export option export-reset-subkey-passwd.
+
+    * New option --limit-card-insert-tries.
+
+
+Noteworthy changes in version 1.4.1 (2005-03-15)
+------------------------------------------------
+
+    * New --rfc2440-text option which controls how text is handled in
+      signatures.  This is in response to some problems seen with
+      certain PGP/MIME mail clients and GnuPG version 1.4.0.  More
+      details about this are available at
+      <http://lists.gnupg.org/pipermail/gnupg-users/2005-January/024408.html>.
+
+    * New "import-unusable-sigs" and "export-unusable-sigs" tags for
+      --import-options and --export-options.  These are off by default,
+      which causes GnuPG to not import or export key signatures that
+      are not usable (e.g. expired signatures).
+
+    * New experimental HTTP, HTTPS, FTP, and FTPS keyserver helper
+      that uses the cURL library <http://curl.haxx.se> to retrieve
+      keys.  This is disabled by default, but may be enabled with the
+      configure option --with-libcurl.  Without this option, the
+      existing HTTP code is used for HTTP, and HTTPS, FTP, and FTPS
+      are not supported.
+
+    * When running a --card-status or --card-edit and a public key is
+      available, missing secret key stubs will be created on the fly.
+      Details of the key are listed too.
+
+    * The implicit packet dumping in double verbose mode is now sent
+      to stderr and not to stdout.
+
+    * Added countermeasures against the Mister/Zuccherato CFB attack
+      <http://eprint.iacr.org/2005/033>.
+
+    * [W32] The algorithm for the default home directory changed:
+      First we look at the environment variable GNUPGHOME, if this one
+      is not set, we check whether the registry entry
+      {HKCU,HKLM}\Software\GNU\GnuPG:HomeDir has been set. If this
+      fails we use a GnuPG directory below the standard application
+      data directory (APPDATA) of the current user. Only in the case
+      that this directory cannot be determined, the old default of
+      c:\gnupg will be used.  The option --homedir still overrides all
+      of them.
+
+    * [W32] The locale selection under Windows changed. You need to
+      enter the locale in the registry at HKCU\Software\GNU\GnuPG:Lang. 
+      For German you would use "de".  If it is not set, GnuPG falls
+      back to HKLM.  The languages files "*.mo" are expected in a
+      directory named "gnupg.nls" below the installation directory;
+      that directory must be stored in the registry at the same key as
+      above with the name "Install Directory".
+
+    * Add new --edit-key command "bkuptocard" to allow restoring a
+      card key from a backup.
+
+    * The "fetch" command of --card-edit now retrieves the key using
+      the default keyserver if no URL has been stored on the card.
+
+    * New configure option --enable-noexecstack.
+
+
+Noteworthy changes in version 1.4.0 (2004-12-16)
+------------------------------------------------
+
+    * See the file doc/highlights-1.4.txt for an overview of all
+      changes in respect to the 1.2 series.
+
+
+Noteworthy changes in version 1.3.93 (2004-12-14)
+-------------------------------------------------
+
+    * Ask the user to repeat a changed PIN.
+
+    * Switched to automake 1.9.  Minor big fixes.
+
+    
+Noteworthy changes in version 1.3.92 (2004-10-28)
+-------------------------------------------------
+    
+    * Added Russian man page. Thanks to Pawel I. Shajdo.
+
+    * libiconv is now used to support other character sets other than
+      UTF-8, Latin-1,-2 and KOI8-2.  The W32 version will only work
+      correctly when iconv.dll is installed on the system.  A binary
+      version is available at all GNU mirror sites under libiconv.
+     
+    * gettext for Windows has been simplified.  The MO files are now
+      distributed UTF-8 encoded and gpg translates on the fly.
+
+
+Noteworthy changes in version 1.3.91 (2004-10-15)
+-------------------------------------------------
+
+    * A new configure option --enable-selinux-support disallows
+      processing of confidential files used by gpg (e.g. secring.gpg).
+      This helps writing ACLs for the SELinux kernel.
+
+    * Support for fetching keys via finger has been added.  This is
+      useful for setting a preferred keyserver URL like
+      "finger:wk@g10code.com".
+
+    * Timeout support has been added to the keyserver helpers.  This
+      allows users to set an upper limit on how long to wait for the
+      keyserver before giving up.
+
+    * New "direct" trust model where users can set key validity
+      directly if they do not want to participate in the web of trust.
+
+    * Minor bug fixes, code and string cleanups.
+
+
+Noteworthy changes in version 1.3.90 (2004-10-01)
+-------------------------------------------------
+
+    * Readline support at all prompts is now available if the system
+      provides a readline library.  The build time option
+      --without-readline may be used to disable this feature.
+
+    * Support for the OpenPGP smartcard is now enabled by default.
+      Use the option --disable-card-support to build without support
+      for smartcards. 
+
+    * New command "addcardkey" in the key edit menu to add subkeys to
+      a smartcard. New command "keytocard" to transfer a key to a smartcard.
+      The serial number of the card is show in secret key listings.
+
+    * -K may now be used as an alias for --list-secret-keys.      
+
+    * HTTP Basic authentication is now supported for all HKP and HTTP
+      keyserver functions, either through a proxy or via direct
+      access.
+
+
+Noteworthy changes in version 1.3.6 (2004-05-22)
+------------------------------------------------
+
+    * New --keyid-format option that selects short (99242560), long
+      (DB698D7199242560), 0xshort (0x99242560), or 0xlong
+      (0xDB698D7199242560) keyid displays.  This lets users tune the
+      display to what they prefer.
+
+    * The --list-options and --verify-options option
+      "show-long-keyids" has been removed since --keyid-format
+      obviates the need for them.
+
+    * Support for the old quasi-1991 partial length encoding has been
+      removed.
+
+    * The --export-all and --export-options include-non-rfc options
+      have been removed as superfluous since nonstandard V3 Elgamal
+      sign+encrypt keys have been removed.
+
+    * Preferred keyserver support has been added.  Users may set a
+      preferred keyserver via the --edit-key command "keyserver".  If
+      the --keyserver-option honor-keyserver-url is set (and it is by
+      default), then the preferred keyserver is used when refreshing
+      that key.
+
+    * The --sig-keyserver-url option can be used to inform signature
+      recipients where the signing key can be downloaded.  When
+      verifying the signature, if the signing key is not present, and
+      the keyserver options honor-keyserver-url and auto-key-retrieve
+      are set, this URL will be used to retrieve the key.
+
+    * Support for fetching keys via HTTP has been added.  This is
+      mainly useful for setting a preferred keyserver URL like
+      "http://www.jabberwocky.com/key.asc".
+
+    * New --ask-cert-level/--no-ask-cert-level option to turn on and
+      off the prompt for signature level when signing a key.  Defaults
+      to off.
+
+    * New --gpgconf-list command for internal use by the gpgconf
+      utility from gnupg 1.9.x.
+
+
+Noteworthy changes in version 1.3.5 (2004-02-26)
+------------------------------------------------
+
+    * New --min-cert-level option to disregard key signatures that are
+      under a specified level.  Defaults to 2 (i.e. discard 0x11
+      signatures).
+
+    * New --max-output option to limit the amount of plaintext output
+      generated by GnuPG.  This option can be used by programs which
+      call GnuPG to process messages that may result in plaintext
+      larger than the calling program is prepared to handle.  This is
+      sometimes called a "Decompression Bomb".
+
+    * New --list-config command for frontends and other programs that
+      call GnuPG.  See doc/DETAILS for the specifics of this.
+
+    * Some performance improvements with large keyrings.  See the
+      build time option --enable-key-cache=SIZE in the README file for
+      details.
+
+    * Some portability fixes for the OpenBSD/i386, HPPA, and AIX
+      platforms.
+
+    * New keyserver-option "http-proxy" to specify which proxy to use
+      in the config file without using environment variables.
+
+    * Added support for storing, retrieving, and searching for keys in
+      LDAP servers.  Note that this is different than the "LDAP
+      keyserver" which was already (and remains) supported.
+
+    * Added support for TLS and LDAPS session encryption for LDAP.
+
+    * --show-session-key/--override-session-key now works with
+      --symmetric messages.
+
+    * The configure options --enable-rsa and --disable-rsa can now be
+      used to enable or disable the RSA algorithm.  This can be useful
+      for embedded use where space is tight.  --enable-minimal
+      includes --disable-rsa.  RSA is enabled by default.
+
+    * The last support for Elgamal sign+encrypt keys has been removed.
+
+
+Noteworthy changes in version 1.3.4 (2003-11-27)
+------------------------------------------------
+
+    * Added support for BZIP2 compression.  This should be considered
+      experimental, and is only available if the libbzip2 library
+      <http://sources.redhat.com/bzip2/> is installed.
+
+    * Added the ability to handle messages that can be decrypted with
+      either a passphrase or a secret key.  These messages may be
+      generated with --symmetric --encrypt or --symmetric --sign
+      --encrypt.
+
+    * The config file search has been enhanced to try for less
+      specific filename matches before giving up.  For example,
+      version 1.3.4 will try for gpg.conf-1.3.4, gpg.conf-1.3, and
+      gpg.conf-1 before falling back to the regular gpg.conf file.
+
+    * Fixed a format string bug in the HKP keyserver handler.
+
+    * Support for Elgamal sign+encrypt keys has been removed.  Old
+      signatures may still be verified, and existing encrypted
+      messages may still be decrypted, but no new signatures may be
+      issued by, and no new messages will be encrypted to, these keys.
+
+
+Noteworthy changes in version 1.3.3 (2003-10-10)
+------------------------------------------------
+
+    * Basic support for the OpenPGP card.  New commands --card-status,
+      --card-edit, --change-pin and the configuration options
+      --reader-port, --ctapi-driver, --pcsc-driver, and --disable-ccid.
+
+    * Full (read/write) support for the SHA-256 hash has been added.
+
+    * Support for the TIGER/192 hash has been dropped.  This should
+      not be interpreted as a statement as to the strength of
+      TIGER/192 - rather, the upcoming revision to the OpenPGP
+      standard removes support for several unused (or mostly unused)
+      hashes.
+
+    * Revoked or expired user IDs are now skipped when selecting keys
+      for encryption.  Specifying a key by the key ID overrides this
+      check and allows the selection of any key.
+
+    * Note that --no-mangle-dos-filenames is now the default.  If you
+      are upgrading from a 1.2.x version of GnuPG, and are running a
+      very old version of Windows that has the 8.3 filename limit, you
+      may need to change this.
+
+    * Multiple "Comment:" lines in armored output are now allowed.
+
+    * New --list-options option.  This option takes a list of
+      arguments that allows the user to customize exactly what key
+      listings (including the --edit-key listing) look like, enabling
+      or disabling things such as photo display, policy URL, preferred
+      keyserver URL, or notation display, long or short keyIDs,
+      calculated validity for each user ID, etc.  See the manual for
+      the complete list of list-options.
+
+    * New --verify-options option.  This option takes a list of
+      arguments that allows the user to customize exactly what happens
+      during signature verification, enabling or disabling things such
+      as photo display, policy URL, preferred keyserver URL, or
+      notation display, long or short keyIDs, calculated validity for
+      each user ID, etc.  See the manual for the complete list of
+      verify-options.
+
+    * New --sig-keyserver-url to embed a "where to get my key"
+      subpacket into a signature.
+
+    * The options --show-photos, --show-policy-url, --show-notation,
+      and --show-keyring are all deprecated in favor of those
+      arguments to --list-options and --verify-options.  The new
+      method is more flexible since a user can specify (for example)
+      showing photos during sig verification, but not in key listings.
+
+    * The complete fingerprint of the key that made a given key
+      certification is now available in the --with-colons output.  For
+      technical reasons, this is only available when running with
+      --no-sig-cache set.  See doc/DETAILS for the specifics of this.
+
+    * IPv6 support for HKP keyserver access.  IPv6 for LDAP keyserver
+      access is also supported, but is dependent on the LDAP library
+      used.
+
+    * To simplify running both the stable (1.2.x) and development
+      (1.3.x) versions of GnuPG, the development version will try to
+      load the options file gpg.conf-VERSION (e.g. gpg.conf-1.3.3 for
+      this release) before falling back to the regular gpg.conf file.
+
+    * Two new %-expandos for use in notation and policy URLs.  "%g"
+      expands to the fingerprint of the key making the signature
+      (which might be a subkey), and "%p" expands to the fingerprint
+      of the primary key that owns the key making the signature.
+    * New "tru" record in --with-colons --list-keys listings.  It
+      shows the status of the trust database that was used to
+      calculate the key validity in the listings.  See doc/DETAILS for
+      the specifics of this.
+    * New REVKEYSIG status tag for --status-fd.  It indicates a valid
+      signature that was issued by a revoked key.  See doc/DETAILS for
+      the specifics of this.
+
+    * A number of portability changes to make building GnuPG on
+      less-common platforms easier.
+
+
+Noteworthy changes in version 1.3.2 (2003-05-27)
+------------------------------------------------
+
+    * New "--gnupg" option (set by default) that disables --openpgp,
+      and the various --pgpX emulation options.  This replaces
+      --no-openpgp, and --no-pgpX, and also means that GnuPG has
+      finally grown a --gnupg option to make GnuPG act like GnuPG.
+
+    * A bug in key validation has been fixed.  This bug only affects
+      keys with more than one user ID (photo IDs do not count here),
+      and results in all user IDs on a given key being treated with
+      the validity of the most-valid user ID on that key.
+
+    * Notation names that do not contain a '@' are no longer allowed
+      unless --expert is set.  This is to help prevent pollution of
+      the (as yet unused) IETF notation namespace.
+
+    * Multiple trust models are now supported via the --trust-model
+      option.  The options are "pgp" (web-of-trust plus trust
+      signatures), "classic" (web-of-trust only), and "always"
+      (identical to the --always-trust option).
+
+    * The --personal-{cipher|digest|compression}-preferences are now
+      consulted to get default algorithms before resorting to the
+      last-ditch defaults of --s2k-cipher-algo, SHA1, and ZIP
+      respectively.  This allows a user to set algorithms to use in a
+      safe manner so they are used when legal to do so, without
+      forcing them on for all messages.
+
+    * New --primary-keyring option to designate the keyring that the
+      user wants new keys imported into.
+
+    * --s2k-digest-algo is now used for all password mangling.
+      Earlier versions used both --s2k-digest-algo and --digest-algo
+      for passphrase mangling.
+
+    * Handling of --hidden-recipient or --throw-keyid messages is now
+      easier - the user only needs to give their passphrase once, and
+      GnuPG will try it against all of the available secret keys.
+
+    * Care is taken to prevent compiler optimization from removing
+      memory wiping code.
+
+    * New option --no-mangle-dos-filenames so that filenames are not
+      truncated in the W32 version.
+
+    * A "convert-from-106" script has been added.  This is a simple
+      script that automates the conversion from a 1.0.6 or earlier
+      version of GnuPG to a 1.0.7 or later version.
+
+    * Disabled keys are now skipped when selecting keys for
+      encryption.  If you are using the --with-colons key listings to
+      detect disabled keys, please see doc/DETAILS for a minor format
+      change in this release.
+
+    * Minor trustdb changes to make the trust calculations match
+      common usage.
+
+    * New command "revuid" in the --edit-key menu to revoke a user ID.
+      This is a simpler interface to the old method (which still
+      works) of revoking the user ID self-signature.
+
+    * Status VALIDSIG does now also print the primary key's
+      fingerprint, as well as the signature version, pubkey algorithm,
+      hash algorithm, and signature class.
+
+    * Add read-only support for the SHA-256 hash, and optional
+      read-only support for the SHA-384 and SHA-512 hashes.
+
+    * New option --enable-progress-filter for use with frontends.
+
+    * DNS SRV records are used in HKP keyserver lookups to allow
+      administrators to load balance and select keyserver ports
+      automatically.  This is as specified in
+      draft-shaw-openpgp-hkp-00.txt.
+
+    * When using the "keyid!" syntax during a key export, only that
+      specified key is exported.  If the key in question is a subkey,
+      the primary key plus only that subkey is exported.
+
+    * configure --disable-xxx options to disable individual algorithms
+      at build time.  This can be used to build a smaller gpg binary
+      for embedded uses where space is tight.  See the README file for
+      the algorithms that can be used with this option, or use
+      --enable-minimal to build the smallest gpg possible (disables
+      all optional algorithms, disables keyserver access, and disables
+      photo IDs).
+
+    * The keyserver no-modify flag on a key can now be displayed and
+      modified.
+
+    * Note that the TIGER/192 digest algorithm is in the process of
+      being dropped from the OpenPGP standard.  While this release of
+      GnuPG still contains it, it is disabled by default.  To ensure
+      you will still be able to use your messages with future versions
+      of GnuPG and other OpenPGP programs, please do not use this
+      algorithm.
+
+
+Noteworthy changes in version 1.3.1 (2002-11-12)
+------------------------------------------------
+
+    * Trust signature support.  This is based on the Maurer trust
+      model where a user can specify the trust level along with the
+      signature with multiple levels so users can delegate
+      certification ability to other users, possibly restricted by a
+      regular expression on the user ID.  Note that full trust
+      signature support requires a regular expression parsing library.
+      The regexp code from glibc 2.3.1 is included for those platforms
+      that don't have working regexp functions available.  The
+      configure option --disable-regex may be used to disable any
+      regular expression code, which will make GnuPG ignore any trust
+      signature with a regular expression included.
+
+    * Two new commands --hidden-recipient (-R) and --hidden-encrypt-to
+      encrypt to a user, but hide the identity of that user.  This is
+      the same functionality as --throw-keyid, but can be used on a
+      per-user basis.
+
+    * Full algorithm names (e.g. "3DES", "SHA1", "ZIP") can now be
+      used interchangeably with the short algorithm names (e.g. "S2",
+      "H2", "Z1") anywhere algorithm names are used in GnuPG.
+
+
+Noteworthy changes in version 1.3.0 (2002-10-18)
+------------------------------------------------
+
+    * The last piece of internal keyserver support has been removed,
+      and now all keyserver access is done via the keyserver plugins.
+      There is also a newer keyserver protocol used between GnuPG and
+      the plugins, so plugins from earlier versions of GnuPG may not
+      work properly.
+
+    * The HKP keyserver plugin supports the new machine-readable key
+      listing format for those keyservers that provide it.
+
+    * When using a HKP keyserver with multiple DNS records (such as
+      wwwkeys.pgp.net which has the addresses of multiple servers
+      around the world), try all records until one succeeds.  Note
+      that it depends on the LDAP library used whether the LDAP
+      keyserver plugin does this as well.
+
+    * The library dependencies for OpenLDAP seem to change fairly
+      frequently, and GnuPG's configure script cannot guess all the
+      combinations.  Use ./configure LDAPLIBS="-L libdir -l libs" to
+      override the script and use the libraries selected.
+
+    * Secret keys generated with --export-secret-subkeys are now
+      indicated in key listings with a '#' after the "sec", and in
+      --with-colons listings by showing no capabilities (no lowercase
+      characters).
+
+    * --trusted-key has been un-obsoleted, as it is useful for adding
+      ultimately trusted keys from the config file.  It is identical
+      to using --edit and "trust" to change a key to ultimately
+      trusted.
+
+    * Translations other than de are no longer distributed with the
+      development branch.  This is due to the frequent text changes
+      during development, which cause the translations to rapidly go
+      out of date.
+
+
+Noteworthy changes in version 1.1.92 (2002-09-11)
+-------------------------------------------------
+
+    * [IMPORTANT] The default configuration file is now
+      ~/.gnupg/gpg.conf.  If an old ~/.gnupg/options is found it will
+      still be used.  This change is required to have a more
+      consistent naming scheme with forthcoming tools.
+
+    * The use of MDCs have increased.  A MDC will be used if the
+      recipients directly request it, if the recipients have AES,
+      AES192, AES256, or TWOFISH in their cipher preferences, or if
+      the chosen cipher has a blocksize not equal to 64 bits
+      (currently this is also AES, AES192, AES256, and TWOFISH).
+
+    * GnuPG will no longer automatically disable compression when
+      processing an already-compressed file unless a MDC is being
+      used.  This is to give the message a certain amount of
+      resistance to the chosen-ciphertext attack while communicating
+      with other programs (most commonly PGP earlier than version 7.x)
+      that do not support MDCs.
+
+    * The option --interactive now has the desired effect when
+      importing keys.
+
+    * The file permission and ownership checks on files have been
+      clarified.  Specifically, the homedir (usually ~/.gnupg) is
+      checked to protect everything within it.  If the user specifies
+      keyrings outside this homedir, they are presumed to be shared
+      keyrings and therefore *not* checked.  Configuration files
+      specified with the --options option and the IDEA cipher
+      extension specified with --load-extension are checked, along
+      with their enclosing directories.
+
+    * The configure option --with-static-rnd=auto allows to build gpg
+      with all available entropy gathering modules included.  At
+      runtime the best usable one will be selected from the list
+      linux, egd, unix.  This is also the default for systems lacking
+      a /dev/random device.
+
+    * The default character set is now taken from the current locale;
+      it can still be overridden by the --charset option.  Using the
+      option -vvv shows the used character set.
+
+    * [REMOVED] --emulate-checksum-bug and --emulate-3des-s2k-bug have
+      been removed.
+
+
+Noteworthy changes in version 1.1.91 (2002-08-04)
+-------------------------------------------------
+
+    * All modules are now linked statically; the --load-extension
+      option is in general not useful anymore.  The only exception is
+      to specify the deprecated idea cipher.
+
+    * The IDEA plugin has changed.  Previous versions of the IDEA
+      plugin will no longer work with GnuPG.  However, the current
+      version of the plugin will work with earlier GnuPG versions.
+
+    * When using --batch with one of the --delete-key commands, the
+      key must be specified by fingerprint.  See the man page for
+      details.
+
+    * There are now various ways to restrict the ability GnuPG has to
+      exec external programs (for the keyserver helpers or photo ID
+      viewers).  Read the README file for the complete list.
+
+    * New export option to leave off attribute packets (photo IDs)
+      during export.  This is useful when exporting to HKP keyservers
+      which do not understand attribute packets.
+
+    * New import option to repair during import the HKP keyserver
+      mangling multiple subkeys bug.  Note that this cannot completely
+      repair the damaged key as some crucial data is removed by the
+      keyserver, but it does at least give you back one subkey.  This
+      is on by default for keyserver --recv-keys, and off by default
+      for regular --import.
+
+    * The keyserver helper programs now live in
+      /usr/[local/]libexec/gnupg by default.  If you are upgrading
+      from 1.0.7, you might want to delete your old copies in
+      /usr/[local/]bin.  If you use an OS that does not use libexec
+      for whatever reason, use configure --libexecdir=/usr/local/lib
+      to place the keyserver helpers there.
+
+    * The LDAP keyserver handler now works properly with very old
+      (version 1) LDAP keyservers.
+
+
+Noteworthy changes in version 1.1.90 (2002-07-01)
+-------------------------------------------------
+
+    * New commands: --personal-cipher-preferences,
+      --personal-digest-preferences, and
+      --personal-compress-preferences allow the user to specify which
+      algorithms are to be preferred.  Note that this does not permit
+      using an algorithm that is not present in the recipient's
+      preferences (which would violate the OpenPGP standard).  This
+      just allows sorting the preferences differently.
+
+    * New "group" command to refer to several keys with one name.
+
+    * A warning is issued if the user forces the use of an algorithm
+      that is not listed in the recipient's preferences.
+
+    * Full revocation key (aka "designated revoker") support.
+
+    * The preferred hash algorithms on a key are consulted when
+      encrypting a signed message to that key.  Note that this is
+      disabled by default by a SHA1 preference in
+      --personal-digest-preferences.
+
+    * --cert-digest-algo allows the user to specify the hash algorithm
+      to use when signing a key rather than the default SHA1 (or MD5
+      for PGP2 keys).  Do not use this feature unless you fully
+      understand the implications of this.
+
+    * --pgp7 mode automatically sets all necessary options to ensure
+      that the resulting message will be usable by a user of PGP 7.x.
+
+    * New --attribute-fd command for frontends and scripts to get the
+      contents of attribute packets (i.e. photos)
+
+    * In expert mode, the user can now re-sign a v3 key with a v4
+      self-signature.  This does not change the v3 key into a v4 key,
+      but it does allow the user to use preferences, primary ID flags,
+      etc.
+
+    * Significantly improved photo ID support on non-unixlike
+      platforms.
+
+    * The version number has jumped ahead to 1.1.90 to skip over the
+      old version 1.1 and to get ready for the upcoming 1.2.
+
+    * ElGamal sign and encrypt is not anymore allowed in the key
+      generation dialog unless in expert mode.  RSA sign and encrypt
+      has been added with the same restrictions.
+
+    * [W32] Keyserver access does work with Windows NT.
+
+
+Noteworthy changes in version 1.0.7 (2002-04-29)
+------------------------------------------------
+
+    * Secret keys are now stored and exported in a new format which
+      uses SHA-1 for integrity checks.  This format renders the
+      Rosa/Klima attack useless.  Other OpenPGP implementations might
+      not yet support this, so the option --simple-sk-checksum creates
+      the old vulnerable format.
+
+    * The default cipher algorithm for encryption is now CAST5,
+      default hash algorithm is SHA-1.  This will give us better
+      interoperability with other OpenPGP implementations.
+
+    * Symmetric encrypted messages now use a fixed file size if
+      possible.  This is a tradeoff: it breaks PGP 5, but fixes PGP 2,
+      6, and 7.  Note this was only an issue with RFC-1991 style
+      symmetric messages.
+
+    * Photographic user ID support.  This uses an external program to
+      view the images.
+
+    * Enhanced keyserver support via keyserver "plugins".  GnuPG comes
+      with plugins for the NAI LDAP keyserver as well as the HKP email
+      keyserver.  It retains internal support for the HKP HTTP
+      keyserver.
+
+    * Nonrevocable signatures are now supported.  If a user signs a
+      key nonrevocably, this signature cannot be taken back so be
+      careful!
+
+    * Multiple signature classes are usable when signing a key to
+      specify how carefully the key information (fingerprint, photo
+      ID, etc) was checked.
+
+    * --pgp2 mode automatically sets all necessary options to ensure
+      that the resulting message will be usable by a user of PGP 2.x.
+
+    * --pgp6 mode automatically sets all necessary options to ensure
+      that the resulting message will be usable by a user of PGP 6.x.
+
+    * Signatures may now be given an expiration date.  When signing a
+      key with an expiration date, the user is prompted whether they
+      want their signature to expire at the same time.
+
+    * Revocation keys (designated revokers) are now supported if
+      present.  There is currently no way to designate new keys as
+      designated revokers.
+
+    * Permissions on the .gnupg directory and its files are checked
+      for safety.
+
+    * --expert mode enables certain silly things such as signing a
+      revoked user id, expired key, or revoked key.
+
+    * Some fixes to build cleanly under Cygwin32.
+
+    * New tool gpgsplit to split OpenPGP data formats into packets.
+
+    * New option --preserve-permissions.
+
+    * Subkeys created in the future are not used for encryption or
+      signing unless the new option --ignore-valid-from is used.
+
+    * Revoked user-IDs are not listed unless signatures are listed too
+      or we are in verbose mode.
+
+    * There is no default comment string with ascii armors anymore
+      except for revocation certificates and --enarmor mode.
+
+    * The command "primary" in the edit menu can be used to change the
+      primary UID, "setpref" and "updpref" can be used to change the
+      preferences.
+
+    * Fixed the preference handling; since 1.0.5 they were erroneously
+      matched against against the latest user ID and not the given one.
+
+    * RSA key generation.
+
+    * Merged Stefan's patches for RISC OS in.  See comments in
+      scripts/build-riscos. 
+
+    * It is now possible to sign and conventional encrypt a message (-cs).
+
+    * The MDC feature flag is supported and can be set by using
+      the "updpref" edit command.
+
+    * The status messages GOODSIG and BADSIG are now returning the primary
+      UID, encoded using %XX escaping (but with spaces left as spaces,
+      so that it should not break too much)
+
+    * Support for GDBM based keyrings has been removed.
+
+    * The entire keyring management has been revamped.
+
+    * The way signature stati are store has changed so that v3
+      signatures can be supported. To increase the speed of many
+      operations for existing keyrings you can use the new
+      --rebuild-keydb-caches command.
+
+    * The entire key validation process (trustdb) has been revamped.
+      See the man page entries for --update-trustdb, --check-trustdb
+      and --no-auto-check-trustdb.
+
+    * --trusted-keys is again obsolete, --edit can be used to set the
+      ownertrust of any key to ultimately trusted.
+
+    * A subkey is never used to sign keys.
+
+    * Read only keyrings are now handled as expected.
+
+
+Noteworthy changes in version 1.0.6 (2001-05-29)
+------------------------------------------------
+
+    * Security fix for a format string bug in the tty code.
+
+    * Fixed format string bugs in all PO files. 
+
+    * Removed Russian translation due to too many bugs.  The FTP
+      server has an unofficial but better translation in the contrib
+      directory.
+
+    * Fixed expire time calculation and keyserver access.
+
+    * The usual set of minor bug fixes and enhancements.
+
+    * non-writable keyrings are now correctly handled.
+
+
+Noteworthy changes in version 1.0.5 (2001-04-29)
+------------------------------------------------
+
+    * WARNING: The semantics of --verify have changed to address a
+      problem with detached signature detection. --verify now ignores
+      signed material given on stdin unless this is requested by using
+      a "-" as the name for the file with the signed material.  Please
+      check all your detached signature handling applications and make
+      sure that they don't pipe the signed material to stdin without
+      using a filename together with "-" on the the command line.
+
+    * WARNING: Corrected hash calculation for input data larger than
+      512M - it was just wrong, so you might notice bad signature in
+      some very big files.  It may be wise to keep an old copy of
+      GnuPG around.
+
+    * Secret keys are no longer imported unless you use the new option
+      --allow-secret-key-import.  This is a kludge and future versions will
+      handle it in another way.
+
+    * New command "showpref" in the --edit-key menu to show an easier
+      to understand preference listing.
+
+    * There is now the notation of a primary user ID.  For example, it
+      is printed with a signature verification as the first user ID;
+      revoked user IDs are not printed there anymore.  In general the
+      primary user ID is the one with the latest self-signature.
+
+    * New --charset=utf-8 to bypass all internal conversions.
+
+    * Large File Support (LFS) is now working.
+
+    * New options: --ignore-crc-error, --no-sig-create-check, 
+      --no-sig-cache, --fixed-list-mode, --no-expensive-trust-checks,
+      --enable-special-filenames and --use-agent.  See man page.
+
+    * New command --pipemode, which can be used to run gpg as a
+      co-process.  Currently only the verification of detached
+      signatures are working.  See doc/DETAILS.
+
+    * Keyserver support for the W32 version.
+
+    * Rewritten key selection code so that GnuPG can better cope with
+      multiple subkeys, expire dates and so.  The drawback is that it
+      is slower.
+
+    * A whole lot of bug fixes.
+
+    * The verification status of self-signatures are now cached. To
+      increase the speed of key list operations for existing keys you
+      can do the following in your GnuPG homedir (~/.gnupg):
+         cp pubring.gpg pubring.gpg.save && gpg --export-all >x && \
+         rm pubring.gpg && gpg --import x
+      Only v4 keys (i.e not the old RSA keys) benefit from this caching.
+
+    * New translations: Estonian, Turkish.
+
+
+Noteworthy changes in version 1.0.4 (2000-10-17)
+------------------------------------------------
+
+    * Fixed a serious bug which could lead to false signature verification
+      results when more than one signature is fed to gpg.  This is the
+      primary reason for releasing this version.
+
+    * New utility gpgv which is a stripped down version of gpg to
+      be used to verify signatures against a list of trusted keys.
+
+    * Rijndael (AES) is now supported and listed with top preference.
+
+    * --with-colons now works with --print-md[s].
+
+Noteworthy changes in version 1.0.3 (2000-09-18)
+------------------------------------------------
+
+    * Fixed problems with piping to/from other MS-Windows software
+
+    * Expiration time of the primary key can be changed again.
+
+    * Revoked user IDs are now marked in the output of --list-key
+
+    * New options --show-session-key and --override-session-key
+      to help the British folks to somewhat minimize the danger
+      of this Orwellian RIP bill.
+
+    * New options --merge-only and --try-all-secrets.
+
+    * New configuration option --with-egd-socket.
+
+    * The --trusted-key option is back after it left us with 0.9.5
+     
+    * RSA is supported. Key generation does not yet work but will come
+      soon. 
+    
+    * CAST5 and SHA-1 are now the default algorithms to protect the key
+      and for symmetric-only encryption. This should solve a couple
+      of compatibility problems because the old algorithms are optional
+      according to RFC2440
+
+    * Twofish and MDC enhanced encryption is now used.  PGP 7 supports 
+      this.  Older versions of GnuPG don't support it, so they should be
+      upgraded to at least 1.0.2
+      
+
+Noteworthy changes in version 1.0.2 (2000-07-12)
+----------------------------------------------
+
+    * Fixed expiration handling of encryption keys.
+
+    * Add an experimental feature to do unattended key generation.
+
+    * The user is now asked for the reason of revocation as required
+      by the new OpenPGP draft.
+
+    * There is a ~/.gnupg/random_seed file now which saves the
+      state of the internal RNG and increases system performance
+      somewhat.  This way the full entropy source is only used in
+      cases were it is really required.
+      Use the option --no-random-seed-file to disable this feature.
+
+    * New options --ignore-time-conflict and --lock-never.
+
+    * Some fixes for the W32 version.
+
+    * The entropy.dll is not anymore used by the W32 version but replaced
+      by code derived from Cryptlib.
+
+    * Encryption is now much faster: About 2 times for 1k bit keys
+      and 8 times for 4k keys.
+
+    * New encryption keys are generated in a way which allows a much
+      faster decryption.
+
+    * New command --export-secret-subkeys which outputs the
+      the _primary_ key with it's secret parts deleted.  This is
+      useful for automated decryption/signature creation as it
+      allows to keep the real secret primary key offline and
+      thereby protecting the key certificates and allowing to
+      create revocations for the subkeys.  See the FAQ for a
+      procedure to install such secret keys.
+
+    * Keygeneration now writes to the first writeable keyring or
+      as default to the one in the homedirectory.  Prior versions
+      ignored all --keyring options.
+
+    * New option --command-fd to take user input from a file descriptor;
+      to be used with --status-fd by software which uses GnuPG as a backend.
+
+    * There is a new status PROGRESS which is used to show progress during
+      key generation.
+
+    * Support for the new MDC encryption packets.  To create them either
+      --force-mdc must be use or cipher algorithm with a blocksize other
+      than 64 bits is to be used.  --openpgp currently disables MDC packets
+      entirely.  This option should not yet be used.
+
+    * New option --no-auto-key-retrieve to disable retrieving of
+      a missing public key from a keyserver, when a keyserver has been set.
+
+    * Danish translation
+
+Noteworthy changes in version 1.0.1 (1999-12-16)
+-----------------------------------
+
+    * New command --verify-files.  New option --fast-list-mode.
+
+    * $http_proxy is now used when --honor-http-proxy is set.
+
+    * Fixed some minor bugs and the problem with conventional encrypted
+      packets which did use the gpg v3 partial length headers.
+
+    * Add Indonesian and Portugese translations.
+
+    * Fixed a bug with symmetric-only encryption using the non-default 3DES.
+      The option --emulate-3des-s2k-bug may be used to decrypt documents
+      which have been encrypted this way; this should be done immediately
+      as this workaround will be remove in 1.1
+
+    * Can now handle (but not display) PGP's photo IDs. I don't know the
+      format of that packet but after stripping a few bytes from the start
+      it looks like a JPEG (at least my test data).  Handling of this
+      package is required because otherwise it would mix up the
+      self signatures and you can't import those keys.
+
+    * Passing non-ascii user IDs on the commandline should now work in all
+      cases.
+
+    * New keys are now generated with an additional preference to Blowfish.
+
+    * Removed the GNU Privacy Handbook from the distribution as it will go
+      into a separate one.
+
+
+Noteworthy changes in version 1.0.0 (1999-09-07)
+-----------------------------------
+
+    * Add a very preliminary version of the GNU Privacy Handbook to
+      the distribution (lynx doc/gph/index.html).
+
+    * Changed the version number to GnuPG 2001 ;-)
+
+
+Noteworthy changes in version 0.9.11
+------------------------------------
+
+    * UTF-8 strings are now correctly printed (if --charset is set correctly).
+      Output of --with-colons remains C-style escaped UTF-8.
+
+    * Workaround for a problem with PGP 5 detached signature in textmode.
+
+    * Fixed a problem when importing new subkeys (duplicated signatures).
+
+Noteworthy changes in version 0.9.10
+------------------------------------
+
+    * Some strange new options to help pgpgpg
+
+    * Cleaned up the dox a bit.
+
+
+Noteworthy changes in version 0.9.9
+-----------------------------------
+
+    * New options --[no-]utf8-strings.
+
+    * New edit-menu commands "enable" and "disable" for entire keys.
+
+    * You will be asked for a filename if gpg cannot deduce one.
+
+    * Changes to support libtool which is needed for the development
+      of libgcrypt.
+
+    * New script tools/lspgpot to help transferring assigned
+      trustvalues from PGP to GnuPG.
+
+    * New commands --lsign-key and made --sign-key a shortcut for --edit
+      and sign.
+
+    * New options (#122--126 ;-) --[no-]default-recipient[-self],
+      --disable-{cipher,pubkey}-algo. See the man page.
+
+    * Enhanced info output in case of multiple recipients and fixed exit code.
+
+    * New option --allow-non-selfsigned-uid to work around a problem with
+      the German IN way of separating signing and encryption keys.
+
+
+Noteworthy changes in version 0.9.8
+-----------------------------------
+
+    * New subcommand "delsig" in the edit menu.
+
+    * The name of the output file is not anymore the one which is
+      embedded in the processed message, but the used filename with
+      the extension stripped.  To revert to the old behaviour you can
+      use the option --use-embedded-filename.
+
+    * Another hack to cope with pgp2 generated detached signatures.
+
+    * latin-2 character set works (--charset=iso-8859-2).
+
+    * New option --with-key-data to list the public key parameters.
+      New option -N to insert notations and a --set-policy-url.
+      A couple of other options to allow reseting of options.
+
+    * Better support for HPUX.
+
+
+Noteworthy changes in version 0.9.7
+-----------------------------------
+
+    * Add some work arounds for a bugs in pgp 2 which led to bad signatures
+      when used with canonical texts in some cases.
+
+    * Enhanced some status outputs.
+
+Noteworthy changes in version 0.9.6
+-----------------------------------
+
+    * Twofish is now statically linked by default. The experimental 128 bit
+      version is now disabled. Full support will be available as soon as
+      the OpenPGP WG has decided on an interpretation of rfc2440.
+
+    * Dropped support for the ancient Blowfish160 which is not OpenPGP.
+
+    * Merged gpgm and gpg into one binary.
+
+    * Add "revsig" and "revkey" commands to the edit menu.  It is now
+      possible to revoke signature and subkeys.
+
+
+Noteworthy changes in version 0.9.5
+-----------------------------------
+
+    * New command "lsign" in the keyedit menu to create non-exportable
+      signatures.  Removed --trusted-keys option.
+
+    * A bunch of changes to the key validation code.
+
+    * --list-trust-path now has an optional --with-colons format.
+
+    * New command --recv-keys to import keys from an keyserver.
+
+
+Noteworthy changes in version 0.9.4
+-----------------------------------
+
+    * New configure option --enable-static-rnd=[egd|linux|unix|none]
+      to select a random gathering module for static linking.
+
+    * The original text is now verbatim copied to a cleartext signed message.
+
+    * Bugfixes but there are still a couple of bugs.
+
+
+Noteworthy changes in version 0.9.3
+-----------------------------------
+
+    * Changed the internal design of getkey which now allows a
+      efficient lookup of multiple keys and add a word match mode.
+
+    * New options --[no-]encrypt-to.
+
+    * Some changes to the configure stuff.  Switched to automake 1.4.
+      Removed intl/ from CVS, autogen.sh now uses gettextize.
+
+    * Preferences now include Twofish. Removed preference to Blowfish with
+      a special hack to suppress the "not listed in preferences" warning;
+      this is to allow us to switch completely to Twofish in the near future.
+
+    * Changed the locking stuff.
+
+    * Print all user ids of a good signature.
+
+
+Noteworthy changes in version 0.9.2
+-----------------------------------
+
+    * add some additional time warp checks.
+
+    * Option --keyserver and command --send-keys to utilize HKP servers.
+
+    * Upgraded to zlib 1.1.3 and fixed an inflate bug
+
+    * More cleanup on the cleartext signatures.
+
+
+Noteworthy changes in version 0.9.1
+-----------------------------------
+
+    * Polish language support.
+
+    * When querying the passphrase, the key ID of the primary key is
+      displayed along with the one of the used secondary key.
+
+    * Fixed a bug occurring when decrypting pgp 5 encrypted messages,
+      fixed an infinite loop bug in the 3DES code and in the code
+      which looks for trusted signatures.
+
+    * Fixed a bug in the mpi library which caused signatures not to
+      compare okay.
+
+    * Rewrote the handling of cleartext signatures; the code is now
+      better maintainable (I hope so).
+
+    * New status output VALIDSIG only for valid signatures together
+      with the fingerprint of the signer's key.
+
+
+Noteworthy changes in version 0.9.0
+-----------------------------------
+
+    * --export does now only exports rfc2440 compatible keys; the
+      old behaviour is available with --export-all.
+      Generation of v3 ElGamal (sign and encrypt) keys is not longer
+      supported.
+
+    * Fixed the uncompress bug.
+
+    * Rewrote the rndunix module. There are two environment variables
+      used for debugging now: GNUPG_RNDUNIX_DBG give the file to write
+      debugging information (use "-" for stdout) and if GNUPG_RNDUNIX_DBGALL
+      is set, all programs which are only tried are also printed.
+
+    * New option --escape-from-lines to "dash-escape" "From " lines to
+      prevent mailers to change them to ">From ".  This is not enabled by
+      default because it is not in compliance with rfc2440 - however, you
+      should turn it on.
+
+
+Noteworthy changes in version 0.4.5
+-----------------------------------
+
+    * The keyrings and the trustdb is now locked, so that
+      other GnuPG processes won't damage these files.  You
+      may want to put the option --lock-once into your options file.
+
+    * The latest self-signatures are now used; this enables --import
+      to see updated preferences etc.
+
+    * Import of subkeys should now work.
+
+    * Random gathering modules may now be loaded as extensions. Add
+      such a module for most Unices but it is very experimental!
+
+    * Brazilian language support.
+
+
+Noteworthy changes in version 0.4.4
+-----------------------------------
+
+    * Fixed the way the key expiration time is stored. If you have
+      an expiration time on your key you should fix it with --edit-key
+      and the command "expire".  I apologize for this inconvenience.
+
+    * Add option --charset to support "koi8-r" encoding of user ids.
+      (Not yet tested).
+
+    * Preferences should now work again. You should run
+      "gpgm --check-trustdb \*" to rebuild all preferences.
+
+    * Checking of certificates should now work but this needs a lot
+      of testing.  Key validation values are now cached in the
+      trustdb; they should be recalculated as needed, but you may
+      use --check-trustdb or --update-trustdb to do this.
+
+    * Spanish translation by Urko Lusa.
+
+    * Patch files are from now on signed.  See the man page
+      for the new option --not-dash-escaped.
+
+    * New syntax: --edit-key <userID> [<commands>]
+      If you run it without --batch the commands are executed and then
+      you are put into normal mode unless you use "quit" or "save" as
+      one of the commands.  When in batch mode, the program quits after
+      the last command, so you have to use "save" if you did some changes.
+      It does not yet work completely, but may be used to list so the
+      keys etc.
+
+
+Noteworthy changes in version 0.4.3
+-----------------------------------
+
+    * Fixed the gettext configure bug.
+
+    * Kludge for RSA keys: keyid and length of a RSA key are
+      correctly reported, but you get an error if you try to use
+      this key (If you do not have the non-US version).
+
+    * Experimental support for keyrings stored in a GDBM database.
+      This is *much* faster than a standard keyring.  You will notice
+      that the import gets slower with time; the reason is that all
+      new keys are used to verify signatures of previous inserted
+      keys.  Use "--keyring gnupg-gdbm:<name-of-gdbm-file>".  This is
+      not (yet) supported for secret keys.
+
+    * A Russian language file in the distribution (alternatives are in
+      the contrib directory of the FTP servers)
+
+    * commandline option processing now works as expected for GNU programs
+      with the exception that you can't mix options and normal arguments.
+
+    * Now --list-key lists all matching keys.  This is needed in some
+      other places too.
+
+
+Noteworthy changes in version 0.4.2
+-----------------------------------
+
+    * This is only a snapshot: There are still a few bugs.
+
+    * Fixed this huge memory leak.
+
+    * Redesigned the trust database:  You should run "gpgm --check-trustdb".
+      New command --update-trustdb, which adds new key from the public
+      keyring into your trustdb
+
+    * Fixed a bug in the armor code, leading to invalid packet errors.
+      (a workaround for this was to use --no-armor).  The shorten line
+      length (64 instead of 72) fixes a problem with pgp5 and keyservers.
+
+    * comment packets are not anymore generated. "--export" filters
+      them out.  One Exception:  The comment packets in a secret keyring
+      are still used because they carry the factorization of the public
+      prime product.
+
+    * --import now only looks for KEYBLOCK headers, so you can now simply
+      remove the "- " in front of such a header if someone accidently signed
+      such a message or the keyblock is part of a cleartext signed message.
+
+    * --with-colons now lists the key expiration time and not anymore
+      the valid period.
+
+    * Some keyblocks created with old releases have a wrong sequence
+      of packets, so that the keyservers don't accept these keys.
+      Simply using "--edit-key" fixes the problem.
+
+    * New option --force-v3-sigs to generate signed messages which are
+      compatible to PGP 5.
+
+    * Add some code to support DLD (for non ELF systems) - but this is
+      not tested because my BSD box is currently broken.
+
+    * New command "expire" in the edit-key menu.
+
+
+
+Noteworthy changes in version 0.4.1
+-----------------------------------
+    * A secondary key is used when the primary key is specified but cannot
+      be used for the operation (if it is a sign-only key).
+
+    * GNUPG can now handle concatenated armored messages:  There is still a
+      bug if different kinds of messages are mixed.
+
+    * Iterated+Salted passphrases now work.  If want to be sure that PGP5
+      is able to handle them you may want to use the options
+       "--s2k-mode 3 --s2k-cipher-algo cast5 --s2k-digest-algo sha1"
+      when changing a passphrase.
+
+    * doc/OpenPGP talks about OpenPGP compliance, doc/HACKING gives
+      a few hints about the internal structure.
+
+    * Checked gnupg against the August 1998 draft (07) and I believe
+      it is in compliance with this document (except for one point).
+
+    * Fixed some bugs in the import merging code and rewrote some
+      code for the trustdb.
+
+
+Noteworthy changes in version 0.4.0
+-----------------------------------
+    * Triple DES is now supported.  Michael Roth did this piece of
+      needed work.  We have now all the coded needed to be OpenPGP
+      compliant.
+
+    * Added a simple rpm spec file (see INSTALL).
+
+    * detached and armored signatures are now using "PGP SIGNATURE",
+      except when --rfc1991 is used.
+
+    * All times which are not in the yyyy-mm-dd format are now printed
+      in local time.
+
+
+Noteworthy changes in version 0.3.5
+-----------------------------------
+    * New option --throw-keyid to create anonymous enciphered messages.
+      If gpg detects such a message it tires all available secret keys
+      in turn so decode it.  This is a gnupg extension and not in OpenPGP
+      but it has been discussed there and afaik some products use this
+      scheme too (Suggested by Nimrod Zimmerman).
+
+    * Fixed a bug with 5 byte length headers.
+
+    * --delete-[secret-]key is now also available in gpgm.
+
+    * cleartext signatures are not anymore converted to LF only.
+
+    * Fixed a trustdb problem. Run "gpgm --check-trustdb" to fix old
+      trust dbs.
+
+    * Building in another directory should now work.
+
+    * Weak key detection mechanism (Niklas Hernaeus).
+
+
+Noteworthy changes in version 0.3.4
+-----------------------------------
+    * New options --comment and --set-filename; see g10/OPTIONS
+
+    * yes/no, y/n localized.
+
+    * Fixed some bugs.
+
+Noteworthy changes in version 0.3.3
+-----------------------------------
+    * IMPORTANT: I found yet another bug in the way the secret keys
+      are encrypted - I did it the way pgp 2.x did it, but OpenPGP
+      and pgp 5.x specify another (in some aspects simpler) method.
+      To convert your secret keys you have to do this:
+       1. Build the new release but don't install it and keep
+          a copy of the old program.
+       2. Disable the network, make sure that you are the only
+          user, be sure that there are no Trojan horses etc ....
+       3. Use your old gpg (version 0.3.[12]) and set the
+          passphrases of ALL your secret keys to empty!
+          (gpg --change-passphrase your-user-id).
+       4. Save your ownertrusts (see the next point)
+       5. rm ~/.gnupg/trustdb.gpg
+       6. install the new version of gpg (0.3.3)
+       7. For every secret key call "gpg --edit-key your-user-id",
+          enter "passwd" at the prompt, follow the instructions and
+          change your password back, enter "save" to store it.
+       8. Restore the ownertrust (see next point).
+
+    * The format of the trust database has changed; you must delete
+      the old one, so gnupg can create a new one.
+      IMPORTANT: Use version 0.3.[12] to save your assigned ownertrusts
+      ("gpgm --list-ownertrust >saved-trust"); then build this new version
+      and restore the ownertrust with this new version
+      ("gpgm --import-ownertrust saved-trust").  Please note that
+      --list-ownertrust has been renamed to --export-ownertrust in this
+      release and it does now only export defined ownertrusts.
+
+    * The command --edit-key now provides a commandline driven menu
+      which can be used for various tasks.  --sign-key is only an
+      an alias to --edit-key and maybe removed in future: use the
+      command "sign" of this new menu - you can select which user ids
+      you want to sign.
+
+    * Alternate user ids can now be created an signed.
+
+    * Owner trust values can now be changed with --edit-key (trust)
+
+    * GNUPG can now run as a coprocess; this enables sophisticated
+      frontends.  tools/shmtest.c is a simple sample implementation.
+      This needs some more work: all tty_xxx() are to be replaced
+      by cpr_xxx() and some changes in the display logics is needed.
+
+    * Removed options --gen-prime and --gen-random.
+
+    * Removed option --add-key; use --edit-key instead.
+
+    * Removed option --change-passphrase; use --edit-key instead.
+
+    * Signatures are now checked even if the output file could not
+      be created. Command "--verify" tries to find the detached data.
+
+    * gpg now disables core dumps.
+
+    * compress and symmetric cipher preferences are now used.
+      Because there is no 3DES yet, this is replaced by Blowfish.
+
+    * We have added the Twofish as an experimental cipher algorithm.
+      Many thanks to Matthew Skala for doing this work.
+      Twofish is the AES submission from Schneier et al.; see
+      "www.counterpane.com/twofish.html" for more information.
+
+    * Started with a help system: If you enter a question mark at some
+      prompt; you should get a specific help for this prompt.
+
+    * There is no more backup copy of the secret keyring.
+
+    * A lot of new bugs. I think this release is not as stable as
+      the previous one.
+
+
+Noteworthy changes in version 0.3.2
+-----------------------------------
+    * Fixed some bugs when using --textmode (-seat)
+
+    * Now displays the trust status of a positive verified message.
+
+    * Keyrings are now scanned in the sequence they are added with
+      --[secret-]keyring.  Note that the default keyring is implicitly
+      added as the very first one unless --no-default-keyring is used.
+
+    * Fixed setuid and dlopen bug.
+
+Noteworthy changes in version 0.3.1
+-----------------------------------
+    * Partial headers are now written in the OpenPGP format if
+      a key in a v4 packet is used.
+
+    * Removed some unused options, removed the gnupg.sig stuff.
+
+    * Key lookup by name now returns a key which can be used for
+      the desired action.
+
+    * New options --list-ownertrust (gpgm) to make a backup copy
+      of the ownertrust values you assigned.
+
+    * clear signature headers are now in compliance with OpenPGP.
+
+Noteworthy changes in version 0.3.0
+-----------------------------------
+
+    * New option --emulate-checksum-bug.  If your passphrase does not
+      work anymore, use this option and --change-passphrase to rewrite
+      your passphrase.
+
+    * More complete v4 key support: Preferences and expiration time
+      is set into the self signature.
+
+    * Key generation defaults to DSA/ElGamal keys, so that new keys are
+      interoperable with pgp5
+
+    * DSA key generation is faster and key generation does not anymore
+      remove entropy from the random generator (the primes are public
+      parameters, so there is really no need for a cryptographic secure
+      prime number generator which we had used).
+
+    * A complete new structure for representing the key parameters.
+
+    * Removed most public key knowledge into the cipher library.
+
+    * Support for dynamic loading of new algorithms.
+
+    * Moved tiger to an extension module.
+
+
+Noteworthy changes in version 0.2.19
+------------------------------------
+
+    * Replaced /dev/urandom in checks with new tool mk-tdata.
+
+    * Some assembler file cleanups; some more functions for the Alpha.
+
+    * Tiger has now the OpenPGP assigned number 6.  Because the OID has
+      changed, old signatures using this algorithm can't be verified.
+
+    * gnupg now encrypts the compressed packed and not any longer in the
+      reverse order; anyway it can decrypt both versions. Thanks to Tom
+      for telling me this (not security related) bug.
+
+    * --add-key works and you are now able to generate subkeys.
+
+    * It is now possible to generate ElGamal keys in v4 packets to create
+      valid OpenPGP keys.
+
+    * Some new features for better integration into MUAs.
+
+
+Noteworthy changes in version 0.2.18
+------------------------------------
+
+    * Splitted cipher/random.c, add new option "--disable-dev-random"
+      to configure to support the development of a random source for
+      other systems. Prepared sourcefiles rand-unix.c, rand-w32.c
+      and rand-dummy.c (which is used to allow compilation on systems
+      without a random source).
+
+    * Fixed a small bug in the key generation (it was possible that 48 bits
+      of a key were not taken from the random pool)
+
+    * Add key generation for DSA and v4 signatures.
+
+    * Add a function trap_unaligned(), so that a SIGBUS is issued on
+      Alphas and not the slow emulation code is used. And success: rmd160
+      raised a SIGBUS.
+
+    * Enhanced the formatting facility of argparse and changed the use of
+      \r,\v to @ because gettext does not like it.
+
+    * New option "--compress-algo 1" to allow the creation of compressed
+      messages which are readable by PGP and "--print-md" (gpgm) to make
+      speed measurement easier.
+
+
+Noteworthy changes in version 0.2.17
+------------------------------------
+
+    * Comment packets are now of private type 61.
+
+    * Passphrase code still used a 160 bit blowfish key, added a
+      silly workaround. Please change your passphrase again - sorry.
+
+    * Conventional encryption now uses a type 3 packet to describe the
+      used algorithms.
+
+    * The new algorithm number for Blowfish is 20, 16 is still used for
+      encryption only; for signing it is only used when it is in a v3 packet,
+      so that GNUPG keys are still valid.
+
+
+Noteworthy changes in version 0.2.16
+------------------------------------
+
+    * Add experimental support for the TIGER/192 message digest algorithm.
+      (But there is only a dummy ASN OID).
+
+    * Standard cipher is now Blowfish with 128 bit key in OpenPGP's CFB
+      mode. I renamed the old cipher to Blowfish160. Because the OpenPGP
+      group refused to assign me a number for Blowfish160, I have to
+      drop support for this in the future. You should use
+      "--change-passphrase" to recode your current passphrase with 128
+      bit Blowfish.
+
+
+Noteworthy changes in version 0.2.15
+------------------------------------
+
+    * Fixed a bug with the old checksum calculation for secret keys.
+      If you run the program without --batch, a warning does inform
+      you if your secret key needs to be converted; simply use
+      --change-passphrase to recalculate the checksum. Please do this
+      soon, as the compatible mode will be removed sometime in the future.
+
+    * CAST5 works (using the PGP's special CFB mode).
+
+    * Again somewhat more PGP 5 compatible.
+
+    * Some new test cases
+
+Noteworthy changes in version 0.2.14
+------------------------------------
+
+    * Changed the internal handling of keyrings.
+
+    * Add support to list PGP 5 keyrings with subkeys
+
+    * Timestamps of signatures are now verified.
+
+    * A expiration time can now be specified during key generation.
+
+    * Some speedups for Blowfish and SHA-1, rewrote SHA-1 transform.
+      Reduced the amount of random bytes needed for key generation in
+      some cases.
+
+
+Noteworthy changes in version 0.2.13
+------------------------------------
+
+    * Verify of DSA signatures works.
+
+    * Re-implemented the slower random number generator.
+
+
+Noteworthy changes in version 0.2.12
+------------------------------------
+
+    * --delete-key checks that there is no secret key. The new
+      option --delete-secret-key maybe used to delete a secret key.
+
+    * "-kv" now works as expected. Options "--list-{keys,sigs]"
+      and "--check-sigs" are now working.
+
+    * New options "--verify" and "--decrypt" to better support integration
+      into MUAs (partly done for Mutt).
+
+    * New option "--with-colons" to make parsing of key lists easier.
+
+Noteworthy changes in version 0.2.11
+------------------------------------
+
+    * GPG now asks for a recipient's name if option "-r" is not used.
+
+    * If there is no good trust path, the program asks whether to use
+      the public keys anyway.
+
+    * "--delete-key" works for public keys. What semantics shall I use
+      when there is a secret key too? Delete the secret key or leave him
+      and auto-regenerate the public key, next time the secret key is used?
+
+Noteworthy changes in version 0.2.10
+------------------------------------
+
+    * Code for the alpha is much faster (about 20 times); the data
+      was misaligned and the kernel traps this, so nearly all time
+      was used by system to trap the misalignments and to write
+      syslog messages. Shame on me and thanks to Ralph for
+      pointing me at this while drinking some beer yesterday.
+
+    * Changed some configure options and add an option
+      --disable-m-guard to remove the memory checking code
+      and to compile everything with optimization on.
+
+    * New environment variable GNUPGHOME, which can be used to set
+      another homedir than ~/.gnupg.  Changed default homedir for
+      Windoze version to c:/gnupg.
+
+    * Fixed detached signatures; detached PGP signatures caused a SEGV.
+
+    * The Windoze version works (as usual w/o a strong RNG).
+
+
+Noteworthy changes in version 0.2.9
+-----------------------------------
+
+    * Fixed FreeBSD bug.
+
+    * Added a simple man page.
+
+    * Switched to automake1.2f and a newer gettext.
+
+Noteworthy changes in version 0.2.8
+-----------------------------------
+
+    * Changed the name to GNUPG, the binaries are called gpg and gpgm.
+      You must rename rename the directory "~/.g10" to ~/.gnupg/, rename
+      {pub,sec}ring.g10 to {pub,sec}ring.gpg, trustdb.g10 to trustdb.gpg
+      and g10.sig to gnupg.sig.
+
+    * New or changed passphrases are now salted.
+
+
+Noteworthy changes in version 0.2.7
+-----------------------------------
+
+    * New command "gen-revoke" to create a key revocation certificate.
+
+    * New option "homedir" to set the homedir (which defaults to "~/.g10").
+      This directory is created if it does not exists (only the last
+      part of the name and not the complete hierarchy)
+
+    * Command "import" works. (Try: "finger gcrypt@ftp.guug.de|g10 --import")
+
+    * New commands "dearmor/enarmor" for g10maint.  These are mainly
+      used for internal test purposes.
+
+    * Option --version now conforming to the GNU standards and lists
+      the available ciphers, message digests and public key algorithms.
+
+    * Assembler code for m68k (not tested).
+
+    * "make check" works.
+
+Noteworthy changes in version 0.2.6
+-----------------------------------
+
+    * Option "--export" works.
+
+
+Noteworthy changes in version 0.2.5
+-----------------------------------
+
+    * Added zlib for systems which don't have it.
+      Use "./configure --with-zlib" to link with the static version.
+
+    * Generalized some more functions and rewrote the encoding of
+      message digests into MPIs.
+
+    * Enhanced the checkit script
+
+
+Noteworthy changes in version 0.2.4
+-----------------------------------
+
+    * nearly doubled the speed of the ElGamal signature verification.
+
+    * backup copies of keyrings are created.
+
+    * assembler stuff for Pentium; gives about 15% better performance.
+
+    * fixed a lot of bugs.
+
+
+Noteworthy changes in version 0.2.3
+-----------------------------------
+
+    * Found a bug in the calculation of ELG fingerprints. This is now
+      fixed, but all existing fingerprints and keyids for ELG keys
+      are not any more valid.
+
+    * armor should now work; including clear signed text.
+
+    * moved some options to the new program g10maint
+
+    * It's now 64 bit clean and runs fine on an alpha--linux.
+
+    * Key generation is much faster now.  I fixed this by using not
+      so strong random number for the primes (this was a bug because the
+      ElGamal primes are public parameters and it does not make sense
+      to generate them from strong random).  The real secret is the x value
+      which is still generated from strong (okay: /dev/random) random bits.
+
+    * added option "--status-fd": see g10/OPTIONS
+
+    * We have secure memory on systems which support mlock().
+      It is not complete yet, because we do not have signal handler
+      which does a cleanup in very case.
+      We should also check the ulimit for the user in the case
+      that the admin does not have set a limit on locked pages.
+
+    * started with internationalization support.
+
+    * The logic to handle the web of trust is now implemented. It is
+      has some bugs; but I'm going to change the algorithm anyway.
+      It works by calculating the trustlevel on the fly.  It may ask
+      you to provide trust parameters if the calculated trust probability
+      is too low.  I will write a paper which discusses this new approach.
+
+    * a couple of changes to the configure script.
+
+    * New option "--quick-random" which uses a much quicker random
+      number generator.  Keys generated while this option is in effect
+      are flags with "INSECURE!" in the user-id.  This is a development
+      only option.
+
+    * Read support for new version packets (OpenPGP).
+
+    * Comment packets are now of correct OpenPGP type 16. Old comment
+      packets written by G10 are detected because they always start with
+      a hash which is an invalid version byte.
+
+    * The string "(INSECURE!)" is appended to a new user-id if this
+      is generated on a system without a good random number generator.
+
+
+Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+          2005, 2006 Free Software Foundation, Inc.
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This 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.
diff --git a/PROJECTS b/PROJECTS
new file mode 100644 (file)
index 0000000..d6725f7
--- /dev/null
+++ b/PROJECTS
@@ -0,0 +1,46 @@
+
+    * Change the internal representation of keyid into a struct which
+      can also hold the localid and extend the localid to hold information
+      of the subkey number because two subkeys may have the same keyid.
+
+    * Add a way to override the current cipher/md implementations
+      by others (using extensions)
+
+    * Not GnuPG related:  What about option completion in bash?
+      Can "--dump-options" be used for this or should we place the
+      options in an ELF note section?
+
+    * Split key support (n-out-of-m).  Use our own protocol or figure out
+      how PGP does it.
+
+    * add an option to re-create a public key from a secret key; we
+      can do this in trustdb.c:verify_own_keys. (special tool?)
+      Hmmm, we better drop the duplication of the public part and just keep
+      the secrets in the "secring" - this has the additional that we can
+      put those secrets on a hardware token.
+
+    * write a tool to extract selected keys from a file.
+
+    * Change the buffering to a mbuf like scheme?  See Michael's proposal.
+
+    * Keep a list of duplicate, faked or unwanted keyids.
+
+    * The current code has knowledge about the structure of a keyblock.
+      We should add an abstraction layer so that adding support for
+      different certificate structures will become easier.
+
+    * "Michael T. Babcock" <mbabcock@fibrespeed.net> suggested to write
+      an event log so that other software can display a key history or
+      alike with GnuPG results.  This should be connected to the keyrings.
+
+
+
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..0e20a37
--- /dev/null
+++ b/README
@@ -0,0 +1,819 @@
+
+                   GnuPG - The GNU Privacy Guard
+                  -------------------------------
+                           Version 1.4.6
+
+        Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+                2005, 2006 Free Software Foundation, Inc.
+
+    This file is free software; as a special exception the author
+    gives unlimited permission to copy and/or distribute it, with or
+    without modifications, as long as this notice is preserved.
+
+    This 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.
+
+
+    Intro
+    -----
+
+    GnuPG is GNU's tool for secure communication and data storage.
+    It can be used to encrypt data and to create digital signatures.
+    It includes an advanced key management facility and is compliant
+    with the proposed OpenPGP Internet standard as described in RFC2440.
+
+    GnuPG works best on GNU/Linux or *BSD systems.  Most other Unices
+    are also supported but are not as well tested as the Free Unices.
+    See http://www.gnupg.org/download/supported_systems.html for a
+    list of systems which are known to work.
+
+    See the file COPYING for copyright and warranty information.
+
+    Because GnuPG does not use use any patented algorithms it is not
+    by default fully compatible with PGP 2.x, which uses the patented
+    IDEA algorithm.  See http://www.gnupg.org/why-not-idea.html for
+    more information on this subject, including what to do if you are
+    legally entitled to use IDEA.
+
+    The default public key algorithms are DSA and Elgamal, but RSA is
+    also supported.  Symmetric algorithms available are AES (with 128,
+    192, and 256 bit keys), 3DES, Blowfish, CAST5 and Twofish.  Digest
+    algorithms available are MD5, RIPEMD/160, SHA-1, SHA-256, SHA-384,
+    and SHA-512.  Compression algorithms available are ZIP, ZLIB, and
+    BZIP2 (with libbz2 installed).
+
+
+    Installation
+    ------------
+
+    Please read the file INSTALL and the sections in this file
+    related to the installation.  Here is a quick summary:
+
+    1) Check that you have unmodified sources.  See below on how to do
+       this.  Don't skip it - this is an important step!
+
+    2) Unpack the tarball.  With GNU tar you can do it this way:
+       "tar xzvf gnupg-x.y.z.tar.gz".  If got a bzip2 compressed
+       tarball you need to use: "tar xjvf gnupg-x.y.z.tar.bz2".
+
+    3) "cd gnupg-x.y.z"
+
+    4) "./configure"
+
+    5) "make"
+
+    6) "make install"
+
+    7) You end up with a "gpg" binary in /usr/local/bin.
+
+    8) To avoid swapping out of sensitive data, you can install "gpg"
+       setuid root.  If you don't do so, you may want to add the
+       option "no-secmem-warning" to ~/.gnupg/gpg.conf
+
+
+    How to Verify the Source
+    ------------------------
+
+    In order to check that the version of GnuPG which you are going to
+    install is an original and unmodified one, you can do it in one of
+    the following ways:
+
+    a) If you already have a trusted Version of GnuPG installed, you
+       can simply check the supplied signature:
+
+       $ gpg --verify gnupg-x.y.z.tar.gz.sig
+
+       This checks that the detached signature gnupg-x.y.z.tar.gz.sig
+       is indeed a signature of gnupg-x.y.z.tar.gz.  The key currently
+       used to create this signature is:
+
+       "pub  1024R/1CE0C630 2006-01-01 Werner Koch (dist sig) <dd9jn@gnu.org>"
+
+       If you do not have this key, you can get it from the source in
+       the file doc/samplekeys.asc (use "gpg --import  doc/samplekeys.asc"
+       to add it to the keyring) or from any keyserver.  You have to
+       make sure that this is really the key and not a faked one. You
+       can do this by comparing the output of:
+
+               $ gpg --fingerprint 0x1CE0C630
+
+       with the fingerprint published elsewhere.
+
+       Please note, that you have to use an old version of GnuPG to
+       do all this stuff.  *Never* use the version which you are going
+       to check!
+
+
+    b) If you don't have any of the above programs, you have to verify
+       the SHA1 checksum:
+
+       $ sha1sum gnupg-x.y.z.tar.gz
+
+       This should yield an output _similar_ to this:
+
+       fd9351b26b3189c1d577f0970f9dcadc1234abcd  gnupg-x.y.z.tar.gz
+
+       Now check that this checksum is _exactly_ the same as the one
+       published via the announcement list and probably via Usenet.
+
+
+    Documentation
+    -------------
+
+    The manual will be distributed separately under the name "gph".
+    An online version of the latest manual draft is available at the
+    GnuPG web pages:
+
+       http://www.gnupg.org/documentation/
+
+    A list of frequently asked questions is available in the GnuPG
+    distribution in the file doc/FAQ and online as:
+
+       http://www.gnupg.org/documentation/faqs.html
+
+    A couple of HOWTO documents are available online; for a listing see:
+
+       http://www.gnupg.org/documentation/howtos.html
+
+    A man page with a description of all commands and options gets installed
+    along with the program. 
+
+
+    Introduction
+    ------------
+
+    Here is a brief overview on how to use GnuPG - it is strongly suggested
+    that you read the manual and other information about the use of
+    cryptography.  GnuPG is only a tool, secure usage requires that
+    YOU KNOW WHAT YOU ARE DOING.
+
+    The first time you run gpg, it will create a .gnupg directory in
+    your home directory and populate it with a default configuration
+    file.  Once this is done, you may create a new key, or if you
+    already have keyrings from PGP, you can import them into GnuPG
+    with:
+
+        gpg --import path/to/pgp/keyring/pubring.pkr
+    and
+        gpg --import path/to/pgp/keyring/secring.skr
+
+    The normal way to create a key is
+
+       gpg --gen-key
+
+    This asks some questions and then starts key generation. To create
+    good random numbers for the key parameters, GnuPG needs to gather
+    enough noise (entropy) from your system.  If you see no progress
+    during key generation you should start some other activities such
+    as moving the mouse or hitting the CTRL and SHIFT keys.
+
+    Generate a key ONLY on a machine where you have direct physical
+    access - don't do it over the network or on a machine also used
+    by others, especially if you have no access to the root account.
+
+    When you are asked for a passphrase use a good one which you can
+    easily remember.  Don't make the passphrase too long because you
+    have to type it for every decryption or signing; but, - AND THIS
+    IS VERY IMPORTANT - use a good one that is not easily to guess
+    because the security of the whole system relies on your secret key
+    and the passphrase that protects it when someone gains access to
+    your secret keyring.  One good way to select a passphrase is to
+    figure out a short nonsense sentence which makes some sense for
+    you and modify it by inserting extra spaces, non-letters and
+    changing the case of some characters - this is really easy to
+    remember especially if you associate some pictures with it.
+
+    Next, you should create a revocation certificate in case someone
+    gets knowledge of your secret key or you forgot your passphrase
+
+       gpg --gen-revoke your_user_id
+
+    Run this command and store the revocation certificate away.  The output
+    is always ASCII armored, so that you can print it and (hopefully
+    never) re-create it if your electronic media fails.
+
+    Now you can use your key to create digital signatures
+
+       gpg -s file
+
+    This creates a file "file.gpg" which is compressed and has a
+    signature attached.
+
+       gpg -sa file
+
+    Same as above, but creates a file "file.asc" which is ASCII armored
+    and and ready for sending by mail. It is better to use your
+    mailers features to create signatures (The mailer uses GnuPG to do
+    this) because the mailer has the ability to MIME encode such
+    signatures - but this is not a security issue.
+
+       gpg -s -o out file
+
+    Creates a signature of "file", but writes the output to the file
+    "out".
+
+    Everyone who knows your public key (you can and should publish
+    your key by putting it on a key server, a web page or in your .plan
+    file) is now able to check whether you really signed this text
+
+       gpg --verify file
+
+    GnuPG now checks whether the signature is valid and prints an
+    appropriate message.  If the signature is good, you know at least
+    that the person (or machine) has access to the secret key which
+    corresponds to the published public key.
+
+    If you run gpg without an option it will verify the signature and
+    create a new file that is identical to the original.  gpg can also
+    run as a filter, so that you can pipe data to verify trough it
+
+       cat signed-file | gpg | wc -l
+
+    which will check the signature of signed-file and then display the
+    number of lines in the original file.
+
+    To send a message encrypted to someone you can use
+
+       gpg -e -r heine file
+
+    This encrypts "file" with the public key of the user "heine" and
+    writes it to "file.gpg"
+
+       echo "hello" | gpg -ea -r heine | mail heine
+
+    Ditto, but encrypts "hello\n" and mails it as ASCII armored message
+    to the user with the mail address heine.
+
+       gpg -se -r heine file
+
+    This encrypts "file" with the public key of "heine" and writes it
+    to "file.gpg" after signing it with your user id.
+
+       gpg -se -r heine -u Suttner file
+
+    Ditto, but sign the file with your alternative user id "Suttner"
+
+
+    GnuPG has some options to help you publish public keys.  This is
+    called "exporting" a key, thus
+
+       gpg --export >all-my-keys
+
+    exports all the keys in the keyring and writes them (in a binary
+    format) to "all-my-keys".  You may then mail "all-my-keys" as an
+    MIME attachment to someone else or put it on an FTP server. To
+    export only some user IDs, you give them as arguments on the command
+    line.
+
+    To mail a public key or put it on a web page you have to create
+    the key in ASCII armored format
+
+       gpg --export --armor | mail panther@tiger.int
+
+    This will send all your public keys to your friend panther.
+
+    If you have received a key from someone else you can put it
+    into your public keyring.  This is called "importing"
+
+       gpg --import [filenames]
+
+    New keys are appended to your keyring and already existing
+    keys are updated. Note that GnuPG does not import keys that
+    are not self-signed.
+
+    Because anyone can claim that a public key belongs to her
+    we must have some way to check that a public key really belongs
+    to the owner.  This can be achieved by comparing the key during
+    a phone call.  Sure, it is not very easy to compare a binary file
+    by reading the complete hex dump of the file - GnuPG (and nearly
+    every other program used for management of cryptographic keys)
+    provides other solutions.
+
+       gpg --fingerprint <username>
+
+    prints the so called "fingerprint" of the given username which
+    is a sequence of hex bytes (which you may have noticed in mail
+    sigs or on business cards) that uniquely identifies the public
+    key - different keys will always have different fingerprints.
+    It is easy to compare fingerprints by phone and I suggest
+    that you print your fingerprint on the back of your business
+    card.  To see the fingerprints of the secondary keys, you can
+    give the command twice; but this is normally not needed.
+
+    If you don't know the owner of the public key you are in trouble.
+    Suppose however that friend of yours knows someone who knows someone
+    who has met the owner of the public key at some computer conference.
+    Suppose that all the people between you and the public key holder
+    may now act as introducers to you. Introducers signing keys thereby
+    certify that they know the owner of the keys they sign.  If you then
+    trust all the introducers to have correctly signed other keys, you
+    can be be sure that the other key really belongs to the one who
+    claims to own it.
+
+    There are 2 steps to validate a key:
+       1. First check that there is a complete chain
+          of signed keys from the public key you want to use
+          and your key and verify each signature.
+       2. Make sure that you have full trust in the certificates
+          of all the introduces between the public key holder and
+          you.
+    Step 2 is the more complicated part because there is no easy way
+    for a computer to decide who is trustworthy and who is not.  GnuPG
+    leaves this decision to you and will ask you for a trust value
+    (here also referenced as the owner-trust of a key) for every key
+    needed to check the chain of certificates. You may choose from:
+      a) "I don't know" - then it is not possible to use any
+        of the chains of certificates, in which this key is used
+        as an introducer, to validate the target key.  Use this if
+        you don't know the introducer.
+      b) "I do not trust" - Use this if you know that the introducer
+        does not do a good job in certifying other keys.  The effect
+        is the same as with a) but for a) you may later want to
+        change the value because you got new information about this
+        introducer.
+      c) "I trust marginally" - Use this if you assume that the
+        introducer knows what he is doing.  Together with some
+        other marginally trusted keys, GnuPG validates the target
+        key then as good.
+      d) "I fully trust" - Use this if you really know that this
+        introducer does a good job when certifying other keys.
+        If all the introducer are of this trust value, GnuPG
+        normally needs only one chain of signatures to validate
+        a target key okay. (But this may be adjusted with the help
+        of some options).
+    This information is confidential because it gives your personal
+    opinion on the trustworthiness of someone else.  Therefore this data
+    is not stored in the keyring but in the "trustdb"
+    (~/.gnupg/trustdb.gpg).  Do not assign a high trust value just
+    because the introducer is a friend of yours - decide how well she
+    understands the implications of key signatures and you may want to
+    tell her more about public key cryptography so you can later change
+    the trust value you assigned.
+
+    Okay, here is how GnuPG helps you with key management.  Most stuff
+    is done with the --edit-key command
+
+       gpg --edit-key <keyid or username>
+
+    GnuPG displays some information about the key and then prompts
+    for a command (enter "help" to see a list of commands and see
+    the man page for a more detailed explanation).  To sign a key
+    you select the user ID you want to sign by entering the number
+    that is displayed in the leftmost column (or do nothing if the
+    key has only one user ID) and then enter the command "sign" and
+    follow all the prompts.  When you are ready, give the command
+    "save" (or use "quit" to cancel your actions).
+
+    If you want to sign the key with another of your user IDs, you
+    must give an "-u" option on the command line together with the
+    "--edit-key".
+
+    Normally you want to sign only one user ID because GnuPG
+    uses only one and this keeps the public key certificate
+    small.  Because such key signatures are very important you
+    should make sure that the signatories of your key sign a user ID
+    which is very likely to stay for a long time - choose one with an
+    email address you have full control of or do not enter an email
+    address at all.  In future GnuPG will have a way to tell which
+    user ID is the one with an email address you prefer - because
+    you have no signatures on this email address it is easy to change
+    this address.  Remember, your signatories sign your public key (the
+    primary one) together with one of your user IDs - so it is not possible
+    to change the user ID later without voiding all the signatures.
+
+    Tip: If you hear about a key signing party on a computer conference
+    join it because this is a very convenient way to get your key
+    certified (But remember that signatures have nothing to to with the
+    trust you assign to a key).
+
+
+    8 Ways to Specify a User ID
+    ---------=-----------------
+
+    There are several ways to specify a user ID, here are some examples.
+
+    * Only by the short keyid (prepend a zero if it begins with A..F):
+
+       "234567C4"
+       "0F34E556E"
+       "01347A56A"
+       "0xAB123456
+
+    * By a complete keyid:
+
+       "234AABBCC34567C4"
+       "0F323456784E56EAB"
+       "01AB3FED1347A5612"
+       "0x234AABBCC34567C4"
+
+    * By a fingerprint:
+
+       "1234343434343434C434343434343434"
+       "123434343434343C3434343434343734349A3434"
+       "0E12343434343434343434EAB3484343434343434"
+
+      The first one is a short fingerprint for PGP 2.x style keys.
+      The others are long fingerprints for OpenPGP keys.
+
+    * By an exact string:
+
+       "=Heinrich Heine <heinrichh@uni-duesseldorf.de>"
+
+    * By an email address:
+
+       "<heinrichh@uni-duesseldorf.de>"
+
+    * By word match
+
+       "+Heinrich Heine duesseldorf"
+
+      All words must match exactly (not case sensitive) and appear in
+      any order in the user ID.  Words are any sequences of letters,
+      digits, the underscore and characters with bit 7 set.
+
+    * Or by the usual substring:
+
+       "Heine"
+       "*Heine"
+
+      The '*' indicates substring search explicitly.
+
+
+    Batch mode
+    ----------
+
+    If you use the option "--batch", GnuPG runs in non-interactive mode and
+    never prompts for input data.  This does not even allow entering the
+    passphrase.  Until we have a better solution (something like ssh-agent),
+    you can use the option "--passphrase-fd n", which works like PGP's
+    PGPPASSFD.
+
+    Batch mode also causes GnuPG to terminate as soon as a BAD signature is
+    detected.
+
+
+    Exit status
+    -----------
+
+    GnuPG returns with an exit status of 1 if in batch mode and a bad signature
+    has been detected or 2 or higher for all other errors.  You should parse
+    stderr or, better, the output of the fd specified with --status-fd to get
+    detailed information about the errors.
+
+
+    Configure options 
+    -----------------
+
+    Here is a list of configure options which are sometime useful 
+    for installation.
+
+    --enable-static-rnd=<name> 
+                     Force the use of the random byte gathering
+                    module <name>.  Default is either to use /dev/random
+                    or the auto mode.  Value for name:
+                      egd - Use the module which accesses the
+                            Entropy Gathering Daemon. See the webpages
+                            for more information about it.
+                     unix - Use the standard Unix module which does not
+                            have a very good performance.
+                    linux - Use the module which accesses /dev/random.
+                            This is the first choice and the default one
+                            for GNU/Linux or *BSD.
+                      auto - Compile linux, egd and unix in and 
+                             automagically select at runtime.
+  
+     --with-egd-socket=<name>
+                     This is only used when EGD is used as random
+                     gatherer. GnuPG uses by default "~/.gnupg/entropy"
+                     as the socket to connect EGD.  Using this option the
+                     socket name can be changed.  You may use any filename
+                     here with 2 exceptions:  a filename starting with
+                     "~/" uses the socket in the home directory of the user
+                     and one starting with a "=" uses a socket in the
+                     GnuPG home directory which is "~/.gnupg" by default.
+     --without-readline
+                     Do not include support for the readline library
+                     even if it is available.  The default is to check
+                     whether the readline library is a available and
+                     use it to allow fancy command line editing.
+  
+     --with-included-zlib
+                     Forces usage of the local zlib sources. Default is
+                    to use the (shared) library of the system.
+
+     --with-zlib=<DIR>
+                    Look for the system zlib in DIR.
+
+     --with-bzip2=<DIR>
+                    Look for the system libbz2 in DIR.
+
+     --without-bzip2
+                    Disable the BZIP2 compression algorithm.
+
+     --with-included-gettext
+                     Forces usage of the local gettext sources instead of
+                    the one provided by your system.
+
+     --disable-nls
+                     Disable NLS support (See the file ABOUT-NLS)
+
+     --enable-m-guard
+                     Enable the integrated malloc checking code. Please
+                     note that this feature does not work on all CPUs
+                     (e.g. SunOS 5.7 on UltraSparc-2) and might give
+                     you a bus error.
+
+     --disable-dynload 
+                    If you have problems with dynamic loading, this
+                    option disables all dynamic loading stuff.  Note
+                    that the use of dynamic linking is very limited.
+
+     --disable-asm
+                    Do not use assembler modules.  It is not possible 
+                    to use this on some CPU types.
+                    
+     --disable-exec
+                    Disable all remote program execution.  This
+                   disables photo ID viewing as well as all keyserver
+                   access.
+
+     --disable-photo-viewers
+                    Disable only photo ID viewing.
+
+     --disable-keyserver-helpers
+                    Disable only keyserver helpers.
+
+     --disable-keyserver-path
+                    Disables the user's ability to use the exec-path
+                   feature to add additional search directories when
+                   executing a keyserver helper.
+
+     --with-photo-viewer=FIXED_VIEWER
+                    Force the photo viewer to be FIXED_VIEWER and
+                   disable any ability for the user to change it in
+                   their options file.
+
+     --disable-rsa
+                   Removes support for the RSA public key algorithm.
+                    This can give a smaller gpg binary for places
+                    where space is tight.
+
+     --disable-idea
+     --disable-cast5
+     --disable-blowfish
+     --disable-aes
+     --disable-twofish
+     --disable-sha256
+     --disable-sha512
+                   Removes support for the selected symmetric or hash
+                   algorithm.  This can give a smaller gpg binary for
+                   places where space is tight.
+
+                   **** Note that if there are existing keys that
+                   have one of these algorithms as a preference,
+                   messages may be received that use one of these
+                   algorithms and you will not be able to decrypt the
+                   message! ****
+
+                   The public key preference list can be updated to
+                   match the list of available algorithms by using
+                   "gpg --edit-key (thekey)", and running the
+                   "setpref" command.
+
+     --enable-minimal
+                   Build the smallest gpg binary possible (disables
+                   all optional algorithms, disables keyserver
+                   access, and disables photo IDs).  Specifically,
+                   this means --disable-rsa --disable-idea,
+                   --disable-cast5, --disable-blowfish,
+                   --disable-aes, --disable-twofish,
+                   --disable-sha256, --disable-sha512,
+                   --without-bzip2, --disable-exec, 
+                    --disable-card-support and
+                   --disable-agent-support.
+                    Configure command lines are read from left to
+                   right, so if you want to have an "almost minimal"
+                   configuration, you can do (for example)
+                   "--enable-minimal --enable-rsa" to have RSA added
+                   to the minimal build.
+
+     --enable-key-cache=SIZE
+                    Set the internal key and UID cache size.  This has
+                    a significant impact on performance with large
+                    keyrings.  The default is 4096, but for use on
+                    platforms where memory is an issue, it can be set
+                    as low as 5.
+
+     --disable-card-support
+                    Do not include smartcard support.  The default is
+                    to include support if all required libraries are
+                    available.
+
+     --disable-agent-support
+                    Do not include support for the gpg-agent.  The
+                    default is to include support.
+
+     --enable-selinux-support
+                    This prevents access to certain files and won't
+                    allow import or export of secret keys. 
+
+     --enable-noexecstack
+                    Pass option --noexecstack to as.  Autdetect wether
+                    the tool chain actually support this.
+
+     --disable-gnupg-iconv
+                    If iconv is available it is used to convert
+                    between utf-8 and the system character set.  This
+                    is in general the preferable solution.  However
+                    the code is new and under some cirumstances it may
+                    give different output than with the limited old
+                    support.  This option allows to explicity disable
+                    the use of iconv.  Note, that iconv is also
+                    disabled if gettext has been disabled.
+
+
+    Installation Problems
+    ---------------------
+
+    If you get unresolved externals "gettext" you should run configure
+    again with the option "--with-included-gettext"; this is version
+    0.12.1 which is available at ftp.gnu.org.
+
+    If you have other compile problems, try the configure options
+    "--with-included-zlib" or "--disable-nls" (See ABOUT-NLS) or
+    --disable-dynload.
+
+    We can't check all assembler files, so if you have problems
+    assembling them (or the program crashes) use --disable-asm with
+    ./configure.  If you opt to delete individual replacement files in
+    hopes of using the remaining ones, be aware that the configure
+    scripts may consider several subdirectories to get all available
+    assembler files; be sure to delete the correct ones. The assembler
+    replacements are in C and in mpi/generic; never delete
+    udiv-qrnnd.S in any CPU directory, because there may be no C
+    substitute.  Don't forget to delete "config.cache" and run
+    "./config.status --recheck".  We have also heard reports of
+    problems when using versions of gcc earlier than 2.96 along with a
+    non-GNU assembler (as).  If this applies to your platform, you can
+    either upgrade gcc to a more recent version, or use the GNU
+    assembler.
+
+    Some make tools are broken - the best solution is to use GNU's
+    make.  Try gmake or grab the sources from a GNU archive and
+    install them.
+
+    On some OSF systems you may get unresolved externals.  This is a
+    libtool problem and the workaround is to manually remove all the
+    "-lc -lz" but the last one from the linker line and execute them
+    manually.
+
+    On some architectures you see warnings like:
+      longlong.h:175: warning: function declaration isn't a prototype
+    or
+      http.c:647: warning: cast increases required alignment of target type
+    This doesn't matter and we know about it (actually it is due to
+    some warning options which we have enabled for gcc)
+
+    If you are cross-compiling and you get an error either building a
+    tool called "yat2m" or running that tool, the problem is most
+    likely a bad or missing native compiler.  We require a standard
+    C-89 compiler to produce an executable to be run on the build
+    platform.  You can explicitly set such a compiler with configure
+    arguments. On HP/UX you might want to try: "CC_FOR_BUILD=c89".
+
+
+
+    Specific problems on some machines
+    ----------------------------------
+
+    * Apple Darwin 6.1:
+
+        ./configure --with-libiconv-prefix=/sw
+
+    * IBM RS/6000 running AIX:
+
+       Due to a change in gcc (since version 2.8) the MPI stuff may
+       not build. In this case try to run configure using:
+           CFLAGS="-g -O2 -mcpu=powerpc" ./configure
+
+    * SVR4.2 (ESIX V4.2 cc)
+
+        Due to problems with the ESIX as, you probably want to do
+            CFLAGS="-O -K pentium" ./configure --disable-asm
+
+    * SunOS 4.1.4
+
+         ./configure ac_cv_sys_symbol_underscore=yes
+
+
+    The Random Device
+    -----------------
+
+    Random devices are available in Linux, FreeBSD and OpenBSD.
+    Operating systems without a random devices must use another
+    entropy collector. 
+
+    This collector works by running a lot of commands that yield more
+    or less unpredictable output and feds this as entropy into the
+    random generator - It should work reliably but you should check
+    whether it produces good output for your version of Unix. There
+    are some debug options to help you (see cipher/rndunix.c).
+
+
+    Creating an RPM package
+    -----------------------
+
+    The file scripts/gnupg.spec is used to build a RPM package (both
+    binary and src):
+      1. copy the spec file into /usr/src/redhat/SPECS
+      2. copy the tar file into /usr/src/redhat/SOURCES
+      3. type: rpm -ba SPECS/gnupg.spec
+
+    Or use the -t (--tarbuild) option of rpm:
+      1. rpm -ta gnupg-x.x.x.tar.gz
+
+    The binary rpm file can now be found in /usr/src/redhat/RPMS, source
+    rpm in /usr/src/redhat/SRPMS
+
+
+    Building Universal Binaries on Apple OS X
+    -----------------------------------------
+
+    You can build a universal ("fat") binary that will work on both
+    PPC and Intel Macs with something like:
+
+    ./configure CFLAGS="-arch ppc -arch i386" --disable-endian-check \
+               --disable-dependency-tracking --disable-asm
+
+    If you are doing the build on a OS X 10.4 (Tiger) PPC machine you
+    may need to add "-isysroot /Developer/SDKs/MacOSX10.4u.sdk" to
+    those CFLAGS.  Note that any third-party libraries you may link
+    with need to be universal as well.  All Apple-supplied libraries
+    (even libraries not originally written by Apple like curl, zip,
+    and BZ2) are universal.
+
+
+    GnuPG 1.4 and GnuPG 2.0
+    -----------------------
+
+    GnuPG 2.0 is a newer version of GnuPG with additional support for
+    S/MIME.  It has a different design philosophy that splits
+    functionality up into several modules.  Both versions may be
+    installed simultaneously without any conflict (gpg is called gpg2
+    in GnuPG 2).  In fact, the gpg version from GnuPG 1.4 is able to
+    make use of the gpg-agent as included in GnuPG 2 and allows for
+    seamless passphrase caching.  The advantage of GnupG 1.4 is its
+    smaller size and no dependency on other modules at run and build
+    time.
+
+
+    How to Get More Information
+    ---------------------------
+
+    The primary WWW page is "http://www.gnupg.org"
+    The primary FTP site is "ftp://ftp.gnupg.org/gcrypt/"
+
+    See http://www.gnupg.org/download/mirrors.html for a list of
+    mirrors and use them if possible.  You may also find GnuPG
+    mirrored on some of the regular GNU mirrors.
+
+    We have some mailing lists dedicated to GnuPG:
+
+       gnupg-announce@gnupg.org    For important announcements like
+                                   new versions and such stuff.
+                                   This is a moderated list and has
+                                   very low traffic.  Do not post to
+                                   this list.
+
+       gnupg-users@gnupg.org       For general user discussion and
+                                   help (English).
+
+        gnupg-de@gnupg.org          German speaking counterpart of
+                                    gnupg-users.
+
+        gnupg-ru@gnupg.org          Russian speaking counterpart of
+                                    gnupg-users.
+
+       gnupg-devel@gnupg.org       GnuPG developers main forum.
+
+    You subscribe to one of the list by sending mail with a subject
+    of "subscribe" to x-request@gnupg.org, where x is the name of the
+    mailing list (gnupg-announce, gnupg-users, etc.).  An archive of
+    the mailing lists are available at
+    http://www.gnupg.org/documentation/mailing-lists.html
+
+    Please direct bug reports to http://bugs.gnupg.org or post
+    them direct to the mailing list <gnupg-devel@gnupg.org>.
+
+    Please direct questions about GnuPG to the users mailing list or
+    one of the pgp newsgroups; please do not direct questions to one
+    of the authors directly as we are busy working on improvements and
+    bug fixes.  The English and German mailing lists are watched by
+    the authors and we try to answer questions when time allows us to
+    do so.
+
+    Commercial grade support for GnuPG is available; please see
+    http://www.gnupg.org/service.html .
diff --git a/THANKS b/THANKS
new file mode 100644 (file)
index 0000000..4e2bca6
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,258 @@
+GnuPG was originally written by Werner Koch.  Other people contributed
+by reporting problems, suggesting various improvements or submitting
+actual code.  Here is a list of those people. Help us keep it complete
+and free of errors.
+
+Adam Mitchell             adam@cafe21.org
+Albert Chin                china@thewrittenword.com
+Alec Habig                habig@budoe2.bu.edu
+Allan Clark               allanc@sco.com
+Anand Kumria              wildfire@progsoc.uts.edu.au
+Andreas Haumer             andreas@xss.co.at
+Anthony Carrico            acarrico@memebeam.org
+Anthony Mulcahy           anthony@kcn.ne.jp
+Ariel T Glenn             ariel@columbia.edu
+Bob Mathews                bobmathews@mindspring.com
+Bodo Moeller              Bodo_Moeller@public.uni-hamburg.de
+Brendan O'Dea              bod@debian.org
+Brenno de Winter          brenno@dewinter.com
+Brian M. Carlson           karlsson@hal-pc.org
+Brian Moore               bem@cmc.net
+Brian Warner              warner@lothar.com
+Bryan Fullerton           bryanf@samurai.com
+Bryce Nichols              bryce@bnichols.org
+Caskey L. Dickson         caskey@technocage.com
+Cees van de Griend        cees-list@griend.xs4all.nl
+Charles Levert            charles@comm.polymtl.ca
+Chip Salzenberg           chip@valinux.com
+Chris Adams                cmadams@hiwaay.net
+Christian Biere            christianbiere@gmx.de
+Christian Kurz            shorty@debian.org
+Christian von Roques      roques@pond.sub.org
+Christopher Oliver        oliver@fritz.traverse.net
+Christian Recktenwald     chris@citecs.de
+Daiki Ueno                 ueno@unixuser.org
+Dan Winship                danw@helixcode.com
+Daniel Eisenbud           eisenbud@cs.swarthmore.edu
+Daniel Koening            dan@chaosdorf.de
+Daniel Resare             daniel@resare.com
+Dany Nativel               dany@natzo.com
+Dave Dykstra              dwd@bell-labs.com
+David C Niemi              niemi@tuxers.net
+David Champion             dgc@uchicago.edu
+David D. Scribner          dscribner@bigfoot.com
+David Ellement            ellement@sdd.hp.com
+David Hallinan            hallinan@rtd.com
+David Hollenberg           dhollen@ISI.EDU
+David Mathog               MATHOG@seqaxp.bio.caltech.edu
+David R. Bergstein         dbergstein@home.com
+David Shaw                 dshaw@jabberwocky.com
+Detlef Lannert            lannert@lannert.rz.uni-duesseldorf.de
+Dimitri                   dmitri@advantrix.com
+Dirk Lattermann           dlatt@t-online.de
+Dirk Meyer                 dirk.meyer@dinoex.sub.org
+Disastry                   Disastry@saiknes.lv
+Douglas Calvert            dfc@anize.org
+Ed Boraas                 ecxjo@esperanto.org
+Edmund GRIMLEY EVANS      edmundo@rano.org
+Edwin Woudt                edwin@woudt.nl
+Enzo Michelangeli         em@MailAndNews.com
+Ernst Molitor             ernst.molitor@uni-bonn.de
+Evgeny Legerov
+Fabio Coatti              cova@ferrara.linux.it
+Felix von Leitner         leitner@amdiv.de
+fish stiqz                 fish@analog.org
+Florian Weimer             Florian.Weimer@rus.uni-stuttgart.de
+Francesco Potorti          pot@gnu.org
+Frank Donahoe             fdonahoe@wilkes1.wilkes.edu
+Frank Heckenbach          heckenb@mi.uni-erlangen.de
+Frank Stajano             frank.stajano@cl.cam.ac.uk
+Frank Tobin               ftobin@uiuc.edu
+Gabriel Rosenkoetter      gr@eclipsed.net
+Gaël Quéri                gael@lautre.net
+Gene Carter                gcarter@lanier.com
+Geoff Keating             geoffk@ozemail.com.au
+Georg Schwarz              georg.schwarz@iname.com
+Giampaolo Tomassoni        g.tomassoni@libero.it
+Gilbert Fernandes          gilbert_fernandes@hotmail.com
+Greg Louis                glouis@dynamicro.on.ca
+Greg Troxel               gdt@ir.bbn.com
+Gregory Steuck            steuck@iname.com
+Harald Denker             harry@hal.westfalen.de
+Holger Baust               Holger.Baust@freenet-ag.de
+Hendrik Buschkamp         buschkamp@rheumanet.org
+Holger Schurig            holger@d.om.org
+Holger Smolinski          smolinsk@de.ibm.com
+Holger Trapp              Holger.Trapp@informatik.tu-chemnitz.de
+Hugh Daniel               hugh@toad.com
+Huy Le                    huyle@ugcs.caltech.edu
+Ian McKellar              imckellar@harvestroad.com.au
+Ingo Klöcker               kloecker@kde.org
+Ivo Timmermans            itimmermans@bigfoot.com
+Jan Krueger               max@physics.otago.ac.nz
+Jan Niehusmann             jan@gondor.com  
+Janusz A. Urbanowicz      alex@bofh.torun.pl
+James Troup               james@nocrew.org
+Jean-loup Gailly          gzip@prep.ai.mit.edu
+Jeff Long                 long@kestrel.cc.ukans.edu
+Jeffery Von Ronne          jronne@ics.uci.edu
+Jens Bachem               bachem@rrz.uni-koeln.de
+Jeroen C. van Gelderen     jeroen@vangelderen.org
+J Horacio MG              homega@ciberia.es
+J. Michael Ashley          jashley@acm.org
+Jim Bauer                  jfbauer@home.com
+Jim Small                  cavenewt@my-deja.com
+Joachim Backes            backes@rhrk.uni-kl.de
+Joe Rhett                  jrhett@isite.net
+Joerg Honegger             Joerg.Honegger@hp.com
+John A. Martin            jam@jamux.com
+John Clizbe                JPClizbe@comcast.net
+John R. Shannon            john@johnrshannon.com
+Johnny Teveßen            j.tevessen@gmx.de
+Jörg Schilling            schilling@fokus.gmd.de
+Jos Backus                Jos.Backus@nl.origin-it.com
+Joseph Walton              joe@kafsemo.org
+Juan F. Codagnone          juam@arnet.com.ar
+Jun Kuriyama              kuriyama@sky.rim.or.jp
+Kahil D. Jallad            kdj4@cs.columbia.edu
+Karl Fogel                kfogel@guanabana.onshore.com
+Karsten Thygesen          karthy@kom.auc.dk
+Katsuhiro Kondou          kondou@nec.co.jp
+Kazu Yamamoto             kazu@iijlab.net
+Kazuyoshi Kakihara         
+Keith Clayton              keith@claytons.org
+Kevin Ryde                 user42@zip.com.au
+Klaus Singvogel            ks@caldera.de
+Kurt Garloff               garloff@suse.de
+Lars Kellogg-Stedman      lars@bu.edu
+L. Sassaman               rabbi@quickie.net
+M Taylor                   mctaylor@privacy.nb.ca                 
+Marcel Waldvogel           mwa@arl.wustl.edu
+Marco d'Itri               md@linux.it
+Marco Parrone              marc0@autistici.org
+Marcus Brinkmann           Marcus.Brinkmann@ruhr-uni-bochum.de 
+Mark Adler                madler@alumni.caltech.edu
+Mark Elbrecht             snowball3@bigfoot.com
+Mark Pettit                pettit@yahoo-inc.com
+Markus Friedl             Markus.Friedl@informatik.uni-erlangen.de
+Martin Kahlert            martin.kahlert@provi.de
+Martin Hamilton
+Martin Schulte            schulte@thp.uni-koeln.de
+Matt Kraai                 kraai@alumni.carnegiemellon.edu
+Matthew Skala             mskala@ansuz.sooke.bc.ca
+Matthew Wilcox             matthew@wil.cx
+Matthias Urlichs          smurf@noris.de
+Max Valianskiy            maxcom@maxcom.ml.org
+Michael Engels             michael.engels@uni-duesseldorf.de
+Michael Fischer v. Mollard mfvm@gmx.de
+Michael Roth              mroth@nessie.de
+Michael Sobolev           mss@despair.transas.com
+Michael Tokarev           mjt@tls.msk.ru
+Nicolas Graner            Nicolas.Graner@cri.u-psud.fr
+Mike Dowling               ML.Dowling at tu-bs.de
+Mike McEwan               mike@lotusland.demon.co.uk
+Neal H Walfield            neal@cs.uml.edu
+Nelson H. F. Beebe         beebe@math.utah.edu
+NIIBE Yutaka              gniibe@chroot.org
+Niklas Hernaeus
+Nimrod Zimerman           zimerman@forfree.at
+Norihiko Murase            skeleten@shillest.net
+N J Doye                  nic@niss.ac.uk
+Oliver Haakert            haakert@hsp.de
+Oskari Jääskeläinen       f33003a@cc.hut.fi
+Pascal Scheffers           Pascal@scheffers.net
+Paul D. Smith             psmith@baynetworks.com
+Per Cederqvist             ceder@lysator.liu.se
+Phil Blundell              pb@debian.org
+Philippe Laliberte        arsphl@oeil.qc.ca
+Peter Fales                psfales@lucent.com
+Peter Gutmann             pgut001@cs.auckland.ac.nz
+Peter Marschall           Peter.Marschall@gedos.de
+Peter Valchev              pvalchev@openbsd.org
+Phong Nguyen               Phong.Nguyen@ens.fr
+Piotr Krukowiecki          piotr@pingu.ii.uj.edu.pl
+QingLong                  qinglong@bolizm.ihep.su
+Ralph Gillen              gillen@theochem.uni-duesseldorf.de
+Rat                       ratinox@peorth.gweep.net
+Reinhard Wobst            R.Wobst@ifw-dresden.de
+Rémi Guyomarch            rguyom@mail.dotcom.fr
+Reuben Sumner             rasumner@wisdom.weizmann.ac.il
+Richard Outerbridge       outer@interlog.com
+Richard Patterson          vectro@yahoo.com
+Robert Joop                rj@rainbow.in-berlin.de
+Roddy Strachan            roddy@satlink.com.au
+Roger Sondermann           r.so@bigfoot.com
+Roland Rosenfeld          roland@spinnaker.rhein.de
+Roman Pavlik               rp@tns.cz
+Ross Golder               rossigee@bigfoot.com
+Russell Coker              russell@coker.com.au
+Ryan Malayter              rmalayter@bai.org
+Sam Roberts               sam@cogent.ca
+Sami Tolvanen              sami@tolvanen.com
+Sascha Kiefer              sk@intertivity.com
+Scott Worley               sworley@chkno.net
+Sean MacLennan            seanm@netwinder.org
+Sebastian Klemke           packet@convergence.de
+Serge Munhoven            munhoven@mema.ucl.ac.be
+SL Baur                   steve@xemacs.org
+Stefan Bellon              sbellon@sbellon.de
+Dr.Stefan.Dalibor          Dr.Stefan.Dalibor@bfa.de
+Stefan Karrmann           S.Karrmann@gmx.net
+Stefan Keller             dres@cs.tu-berlin.de
+Steffen Ullrich           ccrlphr@xensei.com
+Steffen Zahn              zahn@berlin.snafu.de
+Steven Bakker             steven@icoe.att.com
+Steven Murdoch             sjmurdoch@bigfoot.com
+Susanne Schultz           schultz@hsp.de
+Tavis Ormandy              taviso@gentoo.org
+Ted Cabeen                secabeen@pobox.com
+Thiago Jung Bauermann     jungmann@cwb.matrix.com.br
+Thijmen Klok               thijmen@xs4all.nl
+Thomas Roessler           roessler@guug.de
+Tim Mooney                mooney@dogbert.cc.ndsu.nodak.edu
+Timo Schulz                twoaday@freakmail.de
+Tobias Winkler             tobias.winkler@s1998.tu-chemnitz.de
+Todd Vierling              tv@pobox.com
+TOGAWA Satoshi             Satoshi.Togawa@jp.yokogawa.com
+Tom Spindler              dogcow@home.merit.edu
+Tom Zerucha               tzeruch@ceddec.com
+Tomas Fasth               tomas.fasth@twinspot.net
+Tommi Komulainen           Tommi.Komulainen@iki.fi
+Thomas Klausner           wiz@danbala.ifoer.tuwien.ac.at
+Tomasz Kozlowski           tomek@rentec.com
+Thomas Mikkelsen          tbm@image.dk
+Ulf Möller                3umoelle@informatik.uni-hamburg.de
+Urko Lusa                 ulusa@euskalnet.net
+Vincent P. Broman          broman@spawar.navy.mil
+Volker Quetschke           quetschke@scytek.de
+W Lewis                    wiml@hhhh.org
+Walter Hofmann            Walter.Hofmann@physik.stud.uni-erlangen.de
+Walter Koch               koch@hsp.de
+Wayne Chapeskie           waynec@spinnaker.com
+Werner Koch               wk@gnupg.org
+Wim Vandeputte            bunbun@reptile.rug.ac.be
+Winona Brown               win@huh.org
+Yosiaki IIDA              iida@ring.gr.jp
+Yoshihiro Kajiki          kajiki@ylug.org
+                          nbecker@hns.com
+
+Thanks to the German Unix User Group for sponsoring this project,
+Martin Hamilton for hosting the first mailing list and OpenIT for
+cheap hosting conditions.
+
+The development of this software has partly been funded by the German
+Ministry for Economics and Technology under grant VIB3-68553.168-001/1999.
+
+Many thanks to my wife Gerlinde for having so much patience with
+me while hacking late in the evening.
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003,
+           2004  Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..a7187a1
--- /dev/null
+++ b/TODO
@@ -0,0 +1,73 @@
+  * Using an expired key for signing should give an error message
+    "expired key" and not "unusable key'.  Furthermore the error should
+    also be thrown when the default key has expired.  Reported by
+    Eric.VanBuggenhaut add AdValvas.be.
+
+  * pause scrolling help in --edit-key and elsewhere.
+
+  * getkey does not return revoked/expired keys - therefore it is not
+    possible to override it.
+
+  * Selection using +wordlist does not work.
+    What about adding a feature -word to the +wordlist search mode.
+
+  * Check the changes to the gpg random gatherer on all W32 platforms.
+
+  * Show more info does not work from edit->trust. We should give more
+    information on the user ID under question while running
+    --update-trustdb.
+
+  * Check that no secret temporary results are stored in the result parameter
+    of the mpi functions.  We have already done this for mpi-mul.c 
+
+  * We need another special packet at the end of a clearsign message to mark
+    it's end and allow for multiple signature for one message.  And
+    add a real grammar to the code in mainproc.c
+
+  * Fix the bug in the mips assembler code
+
+  * Add a way to show the fingerprint of an key signator's keys
+
+  * Concatenated encryption messages don't work corectly - only the
+    first one is processed.
+
+  * Add option to put the list of recipients (from the encryption
+    layer) into the signatures notation data.
+
+  * --disable-asm should still assemble _udiv_qrnnd when needed
+
+  * the pubkey encrypt functions should do some sanity checks.
+
+  * "gpg filename.tar.gz.asc" should work like --verify (-sab).
+
+  * for messages created with "-t", it might make sense to append the
+    verification status of the message to the output (i.e. write something to
+    the --output file and not only to stderr.  However the problem is
+    that we consider the message transpatrent and don't have any
+    indication of the used character set.  To implement this feature
+    we need to make sure that all output is plain 7 bit ascii but
+    given that we need to print a user name, this does not make sense
+    at all.  The only way this can be implemented is by assuming that
+    the message is encoded in utf8 and hope tht everyone starts to use
+    utf8 instead of latin-1 or whatever RSN.  Hmmm, I myself should
+    start with this.
+
+  * keyflags don't distinguish between {certify,signature}-only.
+
+  * cat foo | gpg --sign | gpg --list-packets
+    Does not list the signature packet.
+
+  * When presenting the result of a verification show the user ID with
+    the highest trust level first instead of the primary one.
+
+  * allow the use of option in gpg.conf. 
+
+  * Add the NEWSIG status.
+
+  * Delete a card key as well as a wiping.
+
+  * passphrase_to_dek does not return NULL after a cancel.  There is
+    no way to issue a cancel when unsing the CLI - this would however
+    be a Good Thing when used with mixed symkey/pubkey encrypted
+    messages. See comment in mainproc.c:proc_symkey_enc. 
+    Note, that this has been fixed in 2.0.2 - we should backport it.
diff --git a/VERSION b/VERSION
new file mode 100644 (file)
index 0000000..c514bd8
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+1.4.6
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644 (file)
index 0000000..fb7edde
--- /dev/null
@@ -0,0 +1,770 @@
+dnl macros to configure gnupg
+dnl Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc.
+dnl
+dnl This file is part of GnuPG.
+dnl
+dnl GnuPG is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl 
+dnl GnuPG is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl 
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+dnl GNUPG_MSG_PRINT(STRING)
+dnl print a message
+dnl
+define(GNUPG_MSG_PRINT,
+  [ echo $ac_n "$1"" $ac_c" 1>&AC_FD_MSG
+  ])
+
+
+dnl GNUPG_CHECK_TYPEDEF(TYPE, HAVE_NAME)
+dnl Check whether a typedef exists and create a #define $2 if it exists
+dnl
+AC_DEFUN([GNUPG_CHECK_TYPEDEF],
+  [ AC_MSG_CHECKING(for $1 typedef)
+    AC_CACHE_VAL(gnupg_cv_typedef_$1,
+    [AC_TRY_COMPILE([#define _GNU_SOURCE 1
+    #include <stdlib.h>
+    #include <sys/types.h>], [
+    #undef $1
+    int a = sizeof($1);
+    ], gnupg_cv_typedef_$1=yes, gnupg_cv_typedef_$1=no )])
+    AC_MSG_RESULT($gnupg_cv_typedef_$1)
+    if test "$gnupg_cv_typedef_$1" = yes; then
+        AC_DEFINE($2,1,[Defined if a `]$1[' is typedef'd])
+    fi
+  ])
+
+
+dnl GNUPG_CHECK_GNUMAKE
+dnl
+AC_DEFUN([GNUPG_CHECK_GNUMAKE],
+  [ 
+    if ${MAKE-make} --version 2>/dev/null | grep '^GNU ' >/dev/null 2>&1; then
+        :
+    else
+        AC_MSG_WARN([[
+***
+*** It seems that you are not using GNU make.  Some make tools have serious
+*** flaws and you may not be able to build this software at all. Before you
+*** complain, please try GNU make:  GNU make is easy to build and available
+*** at all GNU archives.  It is always available from ftp.gnu.org:/gnu/make.
+***]])
+    fi
+  ])
+
+
+dnl GNUPG_CHECK_FAQPROG
+dnl
+AC_DEFUN([GNUPG_CHECK_FAQPROG],
+  [ AC_MSG_CHECKING(for faqprog.pl)
+    if faqprog.pl -V 2>/dev/null | grep '^faqprog.pl ' >/dev/null 2>&1; then
+        working_faqprog=yes
+        FAQPROG="faqprog.pl"
+    else 
+       working_faqprog=no
+        FAQPROG=": "
+    fi
+    AC_MSG_RESULT($working_faqprog)
+    AC_SUBST(FAQPROG)
+    AM_CONDITIONAL(WORKING_FAQPROG, test "$working_faqprog" = "yes" )
+
+dnl     if test $working_faqprog = no; then
+dnl         AC_MSG_WARN([[
+dnl ***
+dnl *** It seems that the faqprog.pl program is not installed;
+dnl *** however it is only needed if you want to change the FAQ.
+dnl ***  (faqprog.pl should be available at:
+dnl ***    ftp://ftp.gnupg.org/gcrypt/contrib/faqprog.pl )
+dnl *** No need to worry about this warning.
+dnl ***]])
+dnl     fi
+   ])       
+
+dnl GNUPG_CHECK_DOCBOOK_TO_TEXI
+dnl
+AC_DEFUN([GNUPG_CHECK_DOCBOOK_TO_TEXI],
+  [
+    AC_CHECK_PROG(DOCBOOK_TO_TEXI, docbook2texi, yes, no)
+    AC_MSG_CHECKING(for sgml to texi tools)
+    working_sgmltotexi=no
+    if test "$ac_cv_prog_DOCBOOK_TO_TEXI" = yes; then
+      if sgml2xml -v /dev/null 2>&1 | grep 'SP version' >/dev/null 2>&1 ; then
+            working_sgmltotexi=yes
+      fi
+    fi
+    AC_MSG_RESULT($working_sgmltotexi)
+    AM_CONDITIONAL(HAVE_DOCBOOK_TO_TEXI, test "$working_sgmltotexi" = "yes" )
+   ])       
+
+
+dnl GNUPG_CHECK_ENDIAN
+dnl define either LITTLE_ENDIAN_HOST or BIG_ENDIAN_HOST
+dnl
+define([GNUPG_CHECK_ENDIAN],
+  [
+    tmp_assumed_endian=big
+    if test "$cross_compiling" = yes; then
+      case "$host_cpu" in
+         i@<:@345678@:>@* )
+            tmp_assumed_endian=little
+            ;;
+         *)
+            ;;
+      esac
+      AC_MSG_WARN(cross compiling; assuming $tmp_assumed_endian endianess)
+    fi
+    AC_MSG_CHECKING(endianess)
+    AC_CACHE_VAL(gnupg_cv_c_endian,
+      [ gnupg_cv_c_endian=unknown
+        # See if sys/param.h defines the BYTE_ORDER macro.
+        AC_TRY_COMPILE([#include <sys/types.h>
+        #include <sys/param.h>], [
+        #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+         bogus endian macros
+        #endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
+        AC_TRY_COMPILE([#include <sys/types.h>
+        #include <sys/param.h>], [
+        #if BYTE_ORDER != BIG_ENDIAN
+         not big endian
+        #endif], gnupg_cv_c_endian=big, gnupg_cv_c_endian=little)])
+        if test "$gnupg_cv_c_endian" = unknown; then
+            AC_TRY_RUN([main () {
+              /* Are we little or big endian?  From Harbison&Steele.  */
+              union
+              {
+                long l;
+                char c[sizeof (long)];
+              } u;
+              u.l = 1;
+              exit (u.c[sizeof (long) - 1] == 1);
+              }],
+              gnupg_cv_c_endian=little,
+              gnupg_cv_c_endian=big,
+              gnupg_cv_c_endian=$tmp_assumed_endian
+            )
+        fi
+      ])
+    AC_MSG_RESULT([$gnupg_cv_c_endian])
+    if test "$gnupg_cv_c_endian" = little; then
+      AC_DEFINE(LITTLE_ENDIAN_HOST,1,
+                [Defined if the host has little endian byte ordering])
+    else
+      AC_DEFINE(BIG_ENDIAN_HOST,1,
+                [Defined if the host has big endian byte ordering])
+    fi
+  ])
+
+dnl GNUPG_CHECK_CACHE
+dnl
+define(GNUPG_CHECK_CACHE,
+  [ AC_MSG_CHECKING(cached information)
+    gnupg_hostcheck="$target"
+    AC_CACHE_VAL(gnupg_cv_hostcheck, [ gnupg_cv_hostcheck="$gnupg_hostcheck" ])
+    if test "$gnupg_cv_hostcheck" != "$gnupg_hostcheck"; then
+        AC_MSG_RESULT(changed)
+        AC_MSG_WARN(config.cache exists!)
+        AC_MSG_ERROR(you must do 'make distclean' first to compile for
+                 different target or different parameters.)
+    else
+        AC_MSG_RESULT(ok)
+    fi
+  ])
+
+
+######################################################################
+# Check for -fPIC etc (taken from libtool)
+# This sets CFLAGS_PIC to the required flags
+#           NO_PIC to yes if it is not possible to
+#                  generate PIC
+######################################################################
+dnl GNUPG_CHECK_PIC
+dnl
+define(GNUPG_CHECK_PIC,
+  [ AC_MSG_CHECKING(for option to create PIC)
+    CFLAGS_PIC=
+    NO_PIC=no
+    if test "$cross_compiling" = yes; then
+        AC_MSG_RESULT(assume none)
+    else
+        if test "$GCC" = yes; then
+            CFLAGS_PIC="-fPIC"
+        else
+            case "$host_os" in
+              aix3* | aix4*)
+                # All rs/6000 code is PIC
+                # but is there any non-rs/6000 AIX platform?
+                ;;
+
+              hpux9* | hpux10*)
+                CFLAGS_PIC="+Z"
+                ;;
+
+              irix5* | irix6*)
+                # PIC (with -KPIC) is the default.
+                ;;
+
+              osf3* | osf4*)
+                # FIXME - pic_flag is probably required for
+                # hppa*-osf* and i860-osf*
+                ;;
+
+              sco3.2v5*)
+                CFLAGS_PIC='-Kpic'
+                ;;
+
+              solaris2* | solaris7* )
+                CFLAGS_PIC='-KPIC'
+                ;;
+
+              sunos4*)
+                CFLAGS_PIC='-PIC'
+                ;;
+
+              *)
+                NO_PIC=yes
+                ;;
+            esac
+        fi
+
+        case "$host_cpu" in
+        rs6000 | powerpc | powerpcle)
+          # Yippee! All RS/6000 and PowerPC code is position-independent.
+          CFLAGS_PIC=""
+          ;;
+        esac
+
+        if test "$NO_PIC" = yes; then
+            AC_MSG_RESULT(not possible)
+        else
+            if test -z "$CFLAGS_PIC"; then
+               AC_MSG_RESULT(none)
+            else
+                AC_MSG_RESULT($CFLAGS_PIC)
+            fi
+        fi
+    fi
+  ])
+
+
+######################################################################
+# Check for export-dynamic flag
+# This sets CFLAGS_EXPORTDYNAMIC to the required flags
+######################################################################
+dnl GNUPG_CHECK_EXPORTDYNAMIC
+dnl
+define(GNUPG_CHECK_EXPORTDYNAMIC,
+  [ AC_MSG_CHECKING(how to specify -export-dynamic)
+    if test "$cross_compiling" = yes; then
+      AC_MSG_RESULT(assume none)
+      CFLAGS_EXPORTDYNAMIC=""
+    else
+      AC_CACHE_VAL(gnupg_cv_export_dynamic,[
+      if AC_TRY_COMMAND([${CC-cc} $CFLAGS -Wl,--version 2>&1 |
+                                          grep "GNU ld" >/dev/null]); then
+          # using gnu's linker
+          gnupg_cv_export_dynamic="-Wl,-export-dynamic"
+      else
+          case "$host_os" in
+            hpux* )
+              gnupg_cv_export_dynamic="-Wl,-E"
+              ;;
+            * )
+              gnupg_cv_export_dynamic=""
+              ;;
+          esac
+      fi
+      ])
+      AC_MSG_RESULT($gnupg_cv_export_dynamic)
+      CFLAGS_EXPORTDYNAMIC="$gnupg_cv_export_dynamic"
+    fi
+  ])
+
+#####################################################################
+# Check for SysV IPC  (from GIMP)
+#   And see whether we have a SHM_LOCK (FreeBSD does not have it).
+#####################################################################
+dnl GNUPG_CHECK_IPC
+dnl
+define(GNUPG_CHECK_IPC,
+   [ AC_CHECK_HEADERS(sys/ipc.h sys/shm.h)
+     if test "$ac_cv_header_sys_shm_h" = "yes"; then
+       AC_MSG_CHECKING(whether IPC_RMID allowes subsequent attaches)
+       AC_CACHE_VAL(gnupg_cv_ipc_rmid_deferred_release,
+          AC_TRY_RUN([
+             #include <sys/types.h>
+             #include <sys/ipc.h>
+             #include <sys/shm.h>
+             int main()
+             {
+               int id;
+               char *shmaddr;
+             id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0777);
+             if (id == -1)
+               exit (2);
+               shmaddr = shmat (id, 0, 0);
+               shmctl (id, IPC_RMID, 0);
+               if ((char*) shmat (id, 0, 0) == (char*) -1)
+               {
+                 shmdt (shmaddr);
+                 exit (1);
+               }
+               shmdt (shmaddr);
+               shmdt (shmaddr);
+               exit (0);
+             }
+         ],
+         gnupg_cv_ipc_rmid_deferred_release="yes",
+         gnupg_cv_ipc_rmid_deferred_release="no",
+         gnupg_cv_ipc_rmid_deferred_release="assume-no")
+       )
+       if test "$gnupg_cv_ipc_rmid_deferred_release" = "yes"; then
+           AC_DEFINE(IPC_RMID_DEFERRED_RELEASE,1,
+                     [Defined if we can do a deferred shm release])
+           AC_MSG_RESULT(yes)
+       else
+          if test "$gnupg_cv_ipc_rmid_deferred_release" = "no"; then
+              AC_MSG_RESULT(no)
+          else
+              AC_MSG_RESULT([assuming no])
+          fi
+       fi
+
+       AC_MSG_CHECKING(whether SHM_LOCK is available)
+       AC_CACHE_VAL(gnupg_cv_ipc_have_shm_lock,
+          AC_TRY_COMPILE([#include <sys/types.h>
+             #include <sys/ipc.h>
+             #include <sys/shm.h>],[
+             int shm_id;
+             shmctl(shm_id, SHM_LOCK, 0);
+             ],
+             gnupg_cv_ipc_have_shm_lock="yes",
+             gnupg_cv_ipc_have_shm_lock="no"
+          )
+       )
+       if test "$gnupg_cv_ipc_have_shm_lock" = "yes"; then
+         AC_DEFINE(IPC_HAVE_SHM_LOCK,1,
+                   [Defined if a SysV shared memory supports the LOCK flag])
+         AC_MSG_RESULT(yes)
+       else
+         AC_MSG_RESULT(no)
+       fi
+     fi
+   ])
+
+
+######################################################################
+# Check whether mlock is broken (hpux 10.20 raises a SIGBUS if mlock
+# is not called from uid 0 (not tested whether uid 0 works)
+# For DECs Tru64 we have also to check whether mlock is in librt
+# mlock is there a macro using memlk()
+######################################################################
+dnl GNUPG_CHECK_MLOCK
+dnl
+define(GNUPG_CHECK_MLOCK,
+  [ AC_CHECK_FUNCS(mlock)
+    if test "$ac_cv_func_mlock" = "no"; then
+        AC_CHECK_HEADERS(sys/mman.h)
+        if test "$ac_cv_header_sys_mman_h" = "yes"; then
+            # Add librt to LIBS:
+            AC_CHECK_LIB(rt, memlk)
+            AC_CACHE_CHECK([whether mlock is in sys/mman.h],
+                            gnupg_cv_mlock_is_in_sys_mman,
+                [AC_TRY_LINK([
+                    #include <assert.h>
+                    #ifdef HAVE_SYS_MMAN_H
+                    #include <sys/mman.h>
+                    #endif
+                ], [
+                    int i;
+
+                    /* glibc defines this for functions which it implements
+                     * to always fail with ENOSYS.  Some functions are actually
+                     * named something starting with __ and the normal name
+                     * is an alias.  */
+                    #if defined (__stub_mlock) || defined (__stub___mlock)
+                    choke me
+                    #else
+                    mlock(&i, 4);
+                    #endif
+                    ; return 0;
+                ],
+                gnupg_cv_mlock_is_in_sys_mman=yes,
+                gnupg_cv_mlock_is_in_sys_mman=no)])
+            if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
+                AC_DEFINE(HAVE_MLOCK,1,
+                          [Defined if the system supports an mlock() call])
+            fi
+        fi
+    fi
+    if test "$ac_cv_func_mlock" = "yes"; then
+        AC_MSG_CHECKING(whether mlock is broken)
+          AC_CACHE_VAL(gnupg_cv_have_broken_mlock,
+             AC_TRY_RUN([
+                #include <stdlib.h>
+                #include <unistd.h>
+                #include <errno.h>
+                #include <sys/mman.h>
+                #include <sys/types.h>
+                #include <fcntl.h>
+
+                int main()
+                {
+                    char *pool;
+                    int err;
+                    long int pgsize = getpagesize();
+
+                    pool = malloc( 4096 + pgsize );
+                    if( !pool )
+                        return 2;
+                    pool += (pgsize - ((long int)pool % pgsize));
+
+                    err = mlock( pool, 4096 );
+                    if( !err || errno == EPERM )
+                        return 0; /* okay */
+
+                    return 1;  /* hmmm */
+                }
+
+            ],
+            gnupg_cv_have_broken_mlock="no",
+            gnupg_cv_have_broken_mlock="yes",
+            gnupg_cv_have_broken_mlock="assume-no"
+           )
+         )
+         if test "$gnupg_cv_have_broken_mlock" = "yes"; then
+             AC_DEFINE(HAVE_BROKEN_MLOCK,1,
+                       [Defined if the mlock() call does not work])
+             AC_MSG_RESULT(yes)
+             AC_CHECK_FUNCS(plock)
+         else
+            if test "$gnupg_cv_have_broken_mlock" = "no"; then
+                AC_MSG_RESULT(no)
+            else
+                AC_MSG_RESULT(assuming no)
+            fi
+         fi
+    fi
+  ])
+
+
+################################################################
+# GNUPG_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN([GNUPG_PROG_NM],
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  ac_cv_path_NM="$NM"
+else
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/nm; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+        ac_cv_path_NM="$ac_dir/nm -B"
+      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+        ac_cv_path_NM="$ac_dir/nm -p"
+      else
+        ac_cv_path_NM="$ac_dir/nm"
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+AC_SUBST(NM)
+])
+
+# GNUPG_SYS_NM_PARSE - Check for command ro grab the raw symbol name followed
+# by C symbol name from nm.
+AC_DEFUN([GNUPG_SYS_NM_PARSE],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([GNUPG_PROG_NM])dnl
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output])
+AC_CACHE_VAL(ac_cv_sys_global_symbol_pipe,
+[# These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix.  What could be older than Ultrix?!! ;)}
+
+changequote(,)dnl
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRSTU]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \1'
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+  ac_symcode='[BCDTU]'
+  ;;
+freebsd* | netbsd* | openbsd* | bsdi* | sunos* | cygwin32* | mingw32*)
+  ac_sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
+  ac_symxfrm='_\1 \1'
+  ;;
+irix*)
+  # Cannot use undefined symbols on IRIX because inlined functions mess us up.
+  ac_symcode='[BCDEGRST]'
+  ;;
+solaris*)
+  ac_symcode='[BDTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  ac_symcode='[ABCDGISTUW]'
+fi
+
+case "$host_os" in
+cygwin32* | mingw32*)
+  # We do not want undefined symbols on cygwin32.  The user must
+  # arrange to define them via -l arguments.
+  ac_symcode='[ABCDGISTW]'
+  ;;
+esac
+changequote([,])dnl
+
+# Write the raw and C identifiers.
+ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.* $ac_symcode $ac_sympat$/$ac_symxfrm/p'"
+
+# Check to see that the pipe works correctly.
+ac_pipe_works=no
+cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+if AC_TRY_EVAL(ac_compile); then
+  # Now try to grab the symbols.
+  ac_nlist=conftest.nm
+  if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+
+    # Try sorting and uniquifying the output.
+    if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+      mv -f "$ac_nlist"T "$ac_nlist"
+      ac_wcout=`wc "$ac_nlist" 2>/dev/null`
+changequote(,)dnl
+      ac_count=`echo "X$ac_wcout" | sed -e 's,^X,,' -e 's/^[    ]*\([0-9][0-9]*\).*$/\1/'`
+changequote([,])dnl
+      (test "$ac_count" -ge 0) 2>/dev/null || ac_count=-1
+    else
+      rm -f "$ac_nlist"T
+      ac_count=-1
+    fi
+
+    # Make sure that we snagged all the symbols we need.
+    if egrep ' _?nm_test_var$' "$ac_nlist" >/dev/null; then
+      if egrep ' _?nm_test_func$' "$ac_nlist" >/dev/null; then
+        cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+       # Now generate the symbol file.
+       sed 's/^.* _\{0,1\}\(.*\)$/extern char \1;/' < "$ac_nlist" >> conftest.c
+
+        cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define __ptr_t void *
+#else
+# define __ptr_t char *
+#endif
+
+/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
+int dld_preloaded_symbol_count = $ac_count;
+
+/* The mapping between symbol names and symbols. */
+struct {
+  char *name;
+  __ptr_t address;
+}
+changequote(,)dnl
+dld_preloaded_symbols[] =
+changequote([,])dnl
+{
+EOF
+        sed 's/^_\{0,1\}\(.*\) _\{0,1\}\(.*\)$/  {"\1", (__ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+        cat <<\EOF >> conftest.c
+  {0, (__ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+        # Now try linking the two files.
+        mv conftest.$ac_objext conftestm.$ac_objext
+        ac_save_LIBS="$LIBS"
+        ac_save_CFLAGS="$CFLAGS"
+        LIBS="conftestm.$ac_objext"
+        CFLAGS="$CFLAGS$no_builtin_flag"
+        if AC_TRY_EVAL(ac_link) && test -s conftest; then
+          ac_pipe_works=yes
+        else
+          echo "configure: failed program was:" >&AC_FD_CC
+          cat conftest.c >&AC_FD_CC
+        fi
+        LIBS="$ac_save_LIBS"
+        CFLAGS="$ac_save_CFLAGS"
+      else
+        echo "cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+      fi
+    else
+      echo "cannot find nm_test_var in $ac_nlist" >&AC_FD_CC
+    fi
+  else
+    echo "cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+  fi
+else
+  echo "$progname: failed program was:" >&AC_FD_CC
+  cat conftest.c >&AC_FD_CC
+fi
+rm -rf conftest*
+
+# Do not use the global_symbol_pipe unless it works.
+test "$ac_pipe_works" = yes || ac_cv_sys_global_symbol_pipe=
+])
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+   ac_result=no
+fi
+AC_MSG_RESULT($ac_result)
+])
+
+# GNUPG_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32
+AC_DEFUN([GNUPG_SYS_LIBTOOL_CYGWIN32],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+AC_CHECK_TOOL(AS, as, false)
+])
+
+# GNUPG_SYS_SYMBOL_UNDERSCORE - does the compiler prefix global symbols
+#                              with an underscore?
+AC_DEFUN([GNUPG_SYS_SYMBOL_UNDERSCORE],
+[tmp_do_check="no"
+case "${host}" in
+    *-mingw32msvc*)
+        ac_cv_sys_symbol_underscore=yes
+        ;;
+    i386-emx-os2 | i[3456]86-pc-os2*emx | i386-pc-msdosdjgpp)
+        ac_cv_sys_symbol_underscore=yes
+        ;;
+    *)
+      if test "$cross_compiling" = yes; then
+         if test "x$ac_cv_sys_symbol_underscore" = x; then
+            ac_cv_sys_symbol_underscore=yes
+         fi
+      else
+         tmp_do_check="yes"
+      fi
+       ;;
+esac
+
+if test "$tmp_do_check" = "yes"; then
+AC_REQUIRE([GNUPG_PROG_NM])dnl
+AC_REQUIRE([GNUPG_SYS_NM_PARSE])dnl
+AC_MSG_CHECKING([for _ prefix in compiled symbols])
+AC_CACHE_VAL(ac_cv_sys_symbol_underscore,
+[ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if AC_TRY_EVAL(ac_compile); then
+  # Now try to grab the symbols.
+  ac_nlist=conftest.nm
+  if AC_TRY_EVAL(NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then
+    # See whether the symbols have a leading underscore.
+    if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
+      ac_cv_sys_symbol_underscore=yes
+    else
+      if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
+        :
+      else
+        echo "configure: cannot find nm_test_func in $ac_nlist" >&AC_FD_CC
+      fi
+    fi
+  else
+    echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&AC_FD_CC
+  fi
+else
+  echo "configure: failed program was:" >&AC_FD_CC
+  cat conftest.c >&AC_FD_CC
+fi
+rm -rf conftest*
+])
+else
+AC_MSG_CHECKING([for _ prefix in compiled symbols])
+fi
+AC_MSG_RESULT($ac_cv_sys_symbol_underscore)
+if test x$ac_cv_sys_symbol_underscore = xyes; then
+  AC_DEFINE(WITH_SYMBOL_UNDERSCORE,1,
+            [Defined if compiled symbols have a leading underscore])
+fi
+])
+
+dnl Stolen from gcc
+dnl Define MKDIR_TAKES_ONE_ARG if mkdir accepts only one argument instead
+dnl of the usual 2.
+AC_DEFUN([GNUPG_FUNC_MKDIR_TAKES_ONE_ARG],
+[AC_CHECK_HEADERS(sys/stat.h unistd.h direct.h)
+AC_CACHE_CHECK([if mkdir takes one argument], gnupg_cv_mkdir_takes_one_arg,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_DIRECT_H
+# include <direct.h>
+#endif], [mkdir ("foo", 0);],
+        gnupg_cv_mkdir_takes_one_arg=no, gnupg_cv_mkdir_takes_one_arg=yes)])
+if test $gnupg_cv_mkdir_takes_one_arg = yes ; then
+  AC_DEFINE(MKDIR_TAKES_ONE_ARG,1,
+            [Defined if mkdir() does not take permission flags])
+fi
+])
+
+# GNUPG_AC_INIT([PACKAGE, VERSION, [ISDEVEL], BUG-REPORT)
+# ----------------------------------------
+# Call AC_INIT with an additional argument to indicate a development
+# version.  If this is called ""svn", the global revision of the
+# repository will be appended, so that a version.  The variable
+# SVN_REVISION will always be set.  In case svn is not available 0
+# will be used for the revision.
+m4_define([GNUPG_AC_INIT],
+[
+m4_define(gnupg_ac_init_tmp, m4_esyscmd([echo -n $((svn info 2>/dev/null || \
+          echo 'Revision: 0') |sed -n '/^Revision:/ {s/[^0-9]//gp;q}')]))
+SVN_REVISION="gnupg_ac_init_tmp[]"
+AC_INIT([$1], [$2][]m4_ifval([$3],[-[$3][]gnupg_ac_init_tmp],[]), [$4])
+])
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..4d2f752
--- /dev/null
@@ -0,0 +1,948 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005  Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+        [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# Figure out how to run the assembler.                      -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_PROG_AS
+# ----------
+AC_DEFUN([AM_PROG_AS],
+[# By default we simply use the C compiler to build assembly code.
+AC_REQUIRE([AC_PROG_CC])
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+AC_ARG_VAR([CCAS],      [assembler compiler command (defaults to CC)])
+AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`AS_DIRNAME("$mf")`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`AS_DIRNAME(["$file"])`
+    AS_MKDIR_P([$dirpart/$fdir])
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+                            [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+                  [_AM_DEPENDENCIES(CC)],
+                  [define([AC_PROG_CC],
+                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+                  [_AM_DEPENDENCIES(CXX)],
+                  [define([AC_PROG_CXX],
+                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $1 | $1:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+  dnl maintainer-mode is disabled by default
+  AC_ARG_ENABLE(maintainer-mode,
+[  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer],
+      USE_MAINTAINER_MODE=$enableval,
+      USE_MAINTAINER_MODE=no)
+  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+  AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+  MAINT=$MAINTAINER_MODE_TRUE
+  AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes.                 -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake.  There are at least two reasons why we must not
+# use `-m 0755':
+#   - it causes special bits like SGID to be ignored,
+#   - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out.  Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/autobuild.m4])
+m4_include([m4/codeset.m4])
+m4_include([m4/gettext.m4])
+m4_include([m4/glibc21.m4])
+m4_include([m4/iconv.m4])
+m4_include([m4/intdiv0.m4])
+m4_include([m4/intmax.m4])
+m4_include([m4/inttypes-pri.m4])
+m4_include([m4/inttypes.m4])
+m4_include([m4/inttypes_h.m4])
+m4_include([m4/isc-posix.m4])
+m4_include([m4/lcmessage.m4])
+m4_include([m4/ldap.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
+m4_include([m4/libcurl.m4])
+m4_include([m4/libusb.m4])
+m4_include([m4/longdouble.m4])
+m4_include([m4/longlong.m4])
+m4_include([m4/nls.m4])
+m4_include([m4/noexecstack.m4])
+m4_include([m4/po.m4])
+m4_include([m4/printf-posix.m4])
+m4_include([m4/progtest.m4])
+m4_include([m4/readline.m4])
+m4_include([m4/signed.m4])
+m4_include([m4/size_max.m4])
+m4_include([m4/stdint_h.m4])
+m4_include([m4/tar-ustar.m4])
+m4_include([m4/uintmax_t.m4])
+m4_include([m4/ulonglong.m4])
+m4_include([m4/wchar_t.m4])
+m4_include([m4/wint_t.m4])
+m4_include([m4/xsize.m4])
+m4_include([acinclude.m4])
diff --git a/autogen.sh b/autogen.sh
new file mode 100755 (executable)
index 0000000..41ae4e2
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+autogen_sh="`dirname $0`/scripts/autogen.sh"
+exec $autogen_sh $*
+
diff --git a/checks/ChangeLog b/checks/ChangeLog
new file mode 100644 (file)
index 0000000..b338d45
--- /dev/null
@@ -0,0 +1,272 @@
+2006-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * sigs.test, mds.test: Add tests for SHA-224, SHA-384, and
+       SHA-512.
+
+2006-04-11  Werner Koch  <wk@g10code.com>
+
+       * armor.test: New.
+
+2006-03-09  Werner Koch  <wk@g10code.com>
+
+       * defs.inc: Removed Basishm by proper redirection.
+
+2006-03-06  Werner Koch  <wk@g10code.com>
+
+       * defs.inc: Print error messages also to stderr.  Allow for
+       verbose environment variable.
+       (linefeed): New.
+       (suspend_error, resume_error): New.
+       * verify.test:  More tests.
+       * multisig.test: Better error printing.
+       (sig_1ls1ls_valid, sig_ls_valid):  Moved to the non-valid group.
+       
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * verify.test: New.
+
+2005-06-21  Werner Koch  <wk@g10code.com>
+
+       * conventional.test (algos): Uhh ohh, cut+paste error and not
+       tested.
+
+2005-06-02  Werner Koch  <wk@g10code.com>
+
+       * conventional.test: have_cipher_algo now requires uppercase
+       algorithm names.  Changed.  Noted by John R. Shannon.
+
+2004-02-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * clearsig.test, sigs.test: Properly detect RSA being missing, and
+       use the proper key for doing an RSA test.
+
+2003-12-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * clearsig.test, conventional-mdc.test, conventional.test,
+       defs.inc, encrypt-dsa.test, encrypt.test, genkey1024.test,
+       plain-1.asc, plain-1-pgp.asc, plain-2.asc, plain-3.asc,
+       pubring.asc, secring.asc, sigs.test: Rework tests to work properly
+       with a gpg binary that doesn't have all ciphers and all pk algos.
+       Basically, we test for the ciphers we have, only test signing with
+       non-160-bit hashes with RSA (we test all hashes as hashes).  Test
+       all key lengths of AES.
+
+2003-12-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Reenable tests now that the Elgamal signature keys
+       are gone.
+
+       * defs.inc, pubring.asc, secring.asc, plain-1.asc, plain-2.asc,
+       plain-3.asc: Remove the old v3 Elgamal keys and replace with
+       RSA+Elgamal and RSA s+e.
+
+2003-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * options: Remove emulate-md-encode-bug.
+
+2003-11-27  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (TESTS): Temporary remove tests using ElG signatures.
+
+2003-09-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * mds.test, sigs.test: Remove TIGER/192 and make SHA-256 optional
+       (since it might not be compiled in).
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Add --no-permission-warning to avoid spurious
+       warning when importing demo keys.
+
+2003-05-27  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (CLEANFILES): Add gpg.conf
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * defs.inc (pgmname): Make sure there is a valid options
+       file. (From wk on stable branch)
+
+       * mds.test: Note that missing algorithms are not errors.
+
+2003-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, options.in: Rename options.in to options since it
+       no longer needs to be a generated file.
+
+       * sigs.test: TODO note to add the new SHAs when we start
+       generating them.
+
+       * mds.test: Test the new SHAs.
+
+2002-05-10  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Add gpg_dearmor to all targets where it is used.
+       Noted by Andreas Haumer. 
+
+2002-04-19  Werner Koch  <wk@gnupg.org>
+
+       * signencrypt-dsa.test, sigs-dsa.test: Don't check with MD5 as
+       this is not valid with DSA signatures.
+
+2001-12-22  Werner Koch  <wk@gnupg.org>
+
+       * options.in: Add no-permission-warning.
+
+2001-12-21  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (distclean-local): prefix mkdemodirs with srcdir
+       (DISTCLEANFILES): Add random_seed.
+
+2001-12-19  Werner Koch  <wk@gnupg.org>
+
+       * options.in: Remove load-extension tiger
+       * Makefile.am (./options): append it if there is such a module.
+
+2001-10-23  Werner Koch  <wk@gnupg.org>
+
+       * defs.inc, Makefile.am: Do not use $srcdir when invoking gpg.
+       Write the logfile to the current directory.
+
+2001-09-28  Werner Koch  <wk@gnupg.org>
+
+       * defs.inc: Write a log file for each test. 
+       * run-gpg, run-gpgm, run-gpg.patterns: Removed.  Replaced in all
+       tests by a simple macro from defs.inc.
+       * Makefile.am (CLEANFILES): Remove log files.
+       (./gpg_dearmor): create it and use it instead of the macro.
+       This is needed in multisig.test due to IFS tricks.
+
+       * armsignencrypt.test, signencrypt-dsa.test, signencrypt.test,
+       armencryptp.test, armencrypt.test, encryptp.test, seat.test,
+       encrypt-dsa.test, encrypt.test: Use --always-trust because the
+       test are not designed to check the validity.
+       
+2001-09-06  Werner Koch  <wk@gnupg.org>
+
+       * genkey1024.test: Simplified by using a parameter file.
+
+2001-05-30  Werner Koch  <wk@gnupg.org>
+
+       * multisig.test (IFS): Reset IFS just before the test.
+
+2001-04-30  Werner Koch  <wk@gnupg.org>
+
+       * multisig.test: Add an set +x to avoid ksh problems
+
+2001-04-28  Werner Koch  <wk@gnupg.org>
+
+       * run-gpg.patterns: a v3 test key expired yesterday, suppress the
+       messages.
+
+2001-03-27  Werner Koch  <wk@gnupg.org>
+
+       * defs.inc: Removed creation of options file.
+       * options.in: New.
+       * Makefile.am: Create options file and fixed import of pubdemo.asc.
+
+       * run-gpg.patterns (gpg): Add some more patterns.
+
+2001-03-20  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Import the pubdemo.asc file 
+
+       * sigs.test (hash_algo_list): s/tiger/tiger192/
+
+2001-03-19  Werner Koch  <wk@gnupg.org>
+
+       * mkdemodirs (GPGDEMO): Add --allow-secret-key-import to all gpg
+       invocations.  Use echon -n instead of an argument with \c.
+
+2001-02-12  Werner Koch  <wk@gnupg.org>
+
+       * multisig.test: new
+       * Makefile.am (TESTS): Added.
+
+2000-10-18  Werner Koch  <wk@gnupg.org>
+
+       * conventional-mdc.test: Add Rijndael and fix for empty plain texts.
+
+Thu Feb 10 17:39:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * mkdemodirs: Fixed the --clean loop.
+
+Thu Jan 13 19:31:58 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * defs.inc (chdir): Removed becuase it is unsused an plain old sh
+       does not like this name.  Reported by Alec Habig.
+
+Tue Oct 26 20:02:23 1999  Werner Koch  (wk@gnupg.org)
+
+       * Makefile.am (GPG_DEARMOR): New and use --no-options.
+
+Tue Aug 31 17:20:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * defs.inc: set LC_ALL empty
+
+Wed Aug  4 10:34:18 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * defs.inc (echo_n): New and used instead of /bin/echo "\c"
+
+Sun Apr 18 10:11:28 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mkdemodirs: New
+       * signdemokey: New.
+       * Makefile.am (distclean-local): New.
+
+Wed Mar 17 13:09:03 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mds.test: replaced the "echo -n"
+
+Mon Mar  8 20:47:17 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pubdemo.asc, secdemo.asc: New.
+
+Fri Feb 19 15:49:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * genkey1024.test: Be really quiet.
+
+1999-01-01  Geoff Keating  <geoffk@ozemail.com.au>
+
+       * Makefile.am (CLEANFILES): Also delete trustdb and any leftover
+       lockfiles.
+
+Fri Nov 27 15:30:24 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * clearsig.test: Some more test cases.
+
+Sun Oct 25 18:19:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mds.test: Check whether TIGER is available.
+       * sigs.tesr: Ditto.
+
+Wed Sep 23 12:25:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * run-gpg.patterns: New (because Solaris fgrep does not like -f -).
+
+Mon Aug 10 21:33:38 1998  Werner Koch  (wk@(none))
+
+       * genkey1024.test: Ariel fixed this.
+
+Wed Jul  8 10:43:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seat.test: New.
+
+Mon May 18 15:40:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am: Now uses mk-tdata to produce random test data.
+
+       * ChangeLog: New.
+
+
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
+
diff --git a/checks/Makefile.am b/checks/Makefile.am
new file mode 100644 (file)
index 0000000..d5218f7
--- /dev/null
@@ -0,0 +1,100 @@
+# Copyright (C) 1998, 1999, 2000, 2001, 2003 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# Process this file with automake to create Makefile.in
+
+GPG_IMPORT  = ../g10/gpg --homedir . --quiet --yes --no-permission-warning --import
+
+TESTS = version.test mds.test \
+       decrypt.test decrypt-dsa.test \
+       sigs.test sigs-dsa.test \
+       encrypt.test encrypt-dsa.test  \
+       seat.test clearsig.test encryptp.test detach.test \
+       armsigs.test armencrypt.test armencryptp.test \
+       signencrypt.test signencrypt-dsa.test \
+       armsignencrypt.test armdetach.test \
+       armdetachm.test detachm.test genkey1024.test \
+       conventional.test conventional-mdc.test \
+       multisig.test verify.test armor.test
+
+
+TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \
+            plain-1.asc plain-2.asc plain-3.asc plain-1-pgp.asc \
+            pubring.pkr.asc secring.skr.asc secdemo.asc pubdemo.asc options
+
+DATA_FILES = data-500 data-9000 data-32000 data-80000 plain-large
+
+EXTRA_DIST = defs.inc $(TESTS) $(TEST_FILES) \
+            mkdemodirs signdemokey
+CLEANFILES = prepared.stamp x y yy z out err  $(DATA_FILES) \
+            plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \
+            *.test.log gpg_dearmor gpg.conf \
+            pubring.gpg secring.gpg pubring.pkr secring.skr
+DISTCLEANFILES = pubring.gpg~ random_seed
+
+
+all-local: prepared.stamp
+
+distclean-local:
+       $(srcdir)/mkdemodirs --clean
+
+prepared.stamp: ./pubring.gpg ./secring.gpg ./plain-1 ./plain-2 ./plain-3 \
+               ./pubring.pkr ./secring.skr ./gpg_dearmor $(DATA_FILES)
+        $(GPG_IMPORT) $(srcdir)/pubdemo.asc     
+        echo timestamp >./prepared.stamp
+
+./gpg_dearmor:
+       echo '#!/bin/sh' >./gpg_dearmor
+       echo "../g10/gpg --no-options --no-greeting \
+             --no-secmem-warning --batch --dearmor" >>./gpg_dearmor
+       chmod 755 ./gpg_dearmor
+
+./pubring.gpg: $(srcdir)/pubring.asc $(srcdir)/pubdemo.asc ./gpg_dearmor
+       ./gpg_dearmor > ./pubring.gpg < $(srcdir)/pubring.asc
+
+./secring.gpg: $(srcdir)/secring.asc ./gpg_dearmor
+       ./gpg_dearmor > ./secring.gpg < $(srcdir)/secring.asc
+
+./pubring.pkr: $(srcdir)/pubring.pkr.asc ./gpg_dearmor
+       ./gpg_dearmor > ./pubring.pkr < $(srcdir)/pubring.pkr.asc
+
+./secring.skr: $(srcdir)/secring.skr.asc ./gpg_dearmor
+       ./gpg_dearmor > ./secring.skr < $(srcdir)/secring.skr.asc
+
+./plain-1: $(srcdir)/plain-1o.asc ./gpg_dearmor
+       ./gpg_dearmor > ./plain-1 < $(srcdir)/plain-1o.asc
+
+./plain-2: $(srcdir)/plain-2o.asc ./gpg_dearmor
+       ./gpg_dearmor > ./plain-2 < $(srcdir)/plain-2o.asc
+
+./plain-3: $(srcdir)/plain-3o.asc ./gpg_dearmor
+       ./gpg_dearmor > ./plain-3 < $(srcdir)/plain-3o.asc
+
+
+data-500:
+       ../tools/mk-tdata   500  >data-500
+data-9000:
+       ../tools/mk-tdata  9000  >data-9000
+data-32000:
+       ../tools/mk-tdata 32000  >data-32000
+data-80000:
+       ../tools/mk-tdata 80000  >data-80000
+plain-large:
+       cat $(srcdir)/../doc/HACKING \
+           $(srcdir)/../doc/DETAILS \
+           $(srcdir)/../doc/FAQ         >plain-large
diff --git a/checks/Makefile.in b/checks/Makefile.in
new file mode 100644 (file)
index 0000000..074fe55
--- /dev/null
@@ -0,0 +1,588 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2003 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# Process this file with automake to create Makefile.in
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = checks
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+GPG_IMPORT = ../g10/gpg --homedir . --quiet --yes --no-permission-warning --import
+TESTS = version.test mds.test \
+       decrypt.test decrypt-dsa.test \
+       sigs.test sigs-dsa.test \
+       encrypt.test encrypt-dsa.test  \
+       seat.test clearsig.test encryptp.test detach.test \
+       armsigs.test armencrypt.test armencryptp.test \
+       signencrypt.test signencrypt-dsa.test \
+       armsignencrypt.test armdetach.test \
+       armdetachm.test detachm.test genkey1024.test \
+       conventional.test conventional-mdc.test \
+       multisig.test verify.test armor.test
+
+TEST_FILES = pubring.asc secring.asc plain-1o.asc plain-2o.asc plain-3o.asc \
+            plain-1.asc plain-2.asc plain-3.asc plain-1-pgp.asc \
+            pubring.pkr.asc secring.skr.asc secdemo.asc pubdemo.asc options
+
+DATA_FILES = data-500 data-9000 data-32000 data-80000 plain-large
+EXTRA_DIST = defs.inc $(TESTS) $(TEST_FILES) \
+            mkdemodirs signdemokey
+
+CLEANFILES = prepared.stamp x y yy z out err  $(DATA_FILES) \
+            plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \
+            *.test.log gpg_dearmor gpg.conf \
+            pubring.gpg secring.gpg pubring.pkr secring.skr
+
+DISTCLEANFILES = pubring.gpg~ random_seed
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  checks/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  checks/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+check-TESTS: $(TESTS)
+       @failed=0; all=0; xfail=0; xpass=0; skip=0; \
+       srcdir=$(srcdir); export srcdir; \
+       list='$(TESTS)'; \
+       if test -n "$$list"; then \
+         for tst in $$list; do \
+           if test -f ./$$tst; then dir=./; \
+           elif test -f $$tst; then dir=; \
+           else dir="$(srcdir)/"; fi; \
+           if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+             all=`expr $$all + 1`; \
+             case " $(XFAIL_TESTS) " in \
+             *" $$tst "*) \
+               xpass=`expr $$xpass + 1`; \
+               failed=`expr $$failed + 1`; \
+               echo "XPASS: $$tst"; \
+             ;; \
+             *) \
+               echo "PASS: $$tst"; \
+             ;; \
+             esac; \
+           elif test $$? -ne 77; then \
+             all=`expr $$all + 1`; \
+             case " $(XFAIL_TESTS) " in \
+             *" $$tst "*) \
+               xfail=`expr $$xfail + 1`; \
+               echo "XFAIL: $$tst"; \
+             ;; \
+             *) \
+               failed=`expr $$failed + 1`; \
+               echo "FAIL: $$tst"; \
+             ;; \
+             esac; \
+           else \
+             skip=`expr $$skip + 1`; \
+             echo "SKIP: $$tst"; \
+           fi; \
+         done; \
+         if test "$$failed" -eq 0; then \
+           if test "$$xfail" -eq 0; then \
+             banner="All $$all tests passed"; \
+           else \
+             banner="All $$all tests behaved as expected ($$xfail expected failures)"; \
+           fi; \
+         else \
+           if test "$$xpass" -eq 0; then \
+             banner="$$failed of $$all tests failed"; \
+           else \
+             banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+           fi; \
+         fi; \
+         dashes="$$banner"; \
+         skipped=""; \
+         if test "$$skip" -ne 0; then \
+           skipped="($$skip tests were not run)"; \
+           test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+             dashes="$$skipped"; \
+         fi; \
+         report=""; \
+         if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+           report="Please report to $(PACKAGE_BUGREPORT)"; \
+           test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+             dashes="$$report"; \
+         fi; \
+         dashes=`echo "$$dashes" | sed s/./=/g`; \
+         echo "$$dashes"; \
+         echo "$$banner"; \
+         test -z "$$skipped" || echo "$$skipped"; \
+         test -z "$$report" || echo "$$report"; \
+         echo "$$dashes"; \
+         test "$$failed" -eq 0; \
+       else :; fi
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+       $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-local
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am all-local check check-TESTS check-am clean \
+       clean-generic distclean distclean-generic distclean-local \
+       distdir dvi dvi-am html html-am info info-am install \
+       install-am install-data install-data-am install-exec \
+       install-exec-am install-info install-info-am install-man \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-info-am
+
+
+all-local: prepared.stamp
+
+distclean-local:
+       $(srcdir)/mkdemodirs --clean
+
+prepared.stamp: ./pubring.gpg ./secring.gpg ./plain-1 ./plain-2 ./plain-3 \
+               ./pubring.pkr ./secring.skr ./gpg_dearmor $(DATA_FILES)
+        $(GPG_IMPORT) $(srcdir)/pubdemo.asc     
+        echo timestamp >./prepared.stamp
+
+./gpg_dearmor:
+       echo '#!/bin/sh' >./gpg_dearmor
+       echo "../g10/gpg --no-options --no-greeting \
+             --no-secmem-warning --batch --dearmor" >>./gpg_dearmor
+       chmod 755 ./gpg_dearmor
+
+./pubring.gpg: $(srcdir)/pubring.asc $(srcdir)/pubdemo.asc ./gpg_dearmor
+       ./gpg_dearmor > ./pubring.gpg < $(srcdir)/pubring.asc
+
+./secring.gpg: $(srcdir)/secring.asc ./gpg_dearmor
+       ./gpg_dearmor > ./secring.gpg < $(srcdir)/secring.asc
+
+./pubring.pkr: $(srcdir)/pubring.pkr.asc ./gpg_dearmor
+       ./gpg_dearmor > ./pubring.pkr < $(srcdir)/pubring.pkr.asc
+
+./secring.skr: $(srcdir)/secring.skr.asc ./gpg_dearmor
+       ./gpg_dearmor > ./secring.skr < $(srcdir)/secring.skr.asc
+
+./plain-1: $(srcdir)/plain-1o.asc ./gpg_dearmor
+       ./gpg_dearmor > ./plain-1 < $(srcdir)/plain-1o.asc
+
+./plain-2: $(srcdir)/plain-2o.asc ./gpg_dearmor
+       ./gpg_dearmor > ./plain-2 < $(srcdir)/plain-2o.asc
+
+./plain-3: $(srcdir)/plain-3o.asc ./gpg_dearmor
+       ./gpg_dearmor > ./plain-3 < $(srcdir)/plain-3o.asc
+
+data-500:
+       ../tools/mk-tdata   500  >data-500
+data-9000:
+       ../tools/mk-tdata  9000  >data-9000
+data-32000:
+       ../tools/mk-tdata 32000  >data-32000
+data-80000:
+       ../tools/mk-tdata 80000  >data-80000
+plain-large:
+       cat $(srcdir)/../doc/HACKING \
+           $(srcdir)/../doc/DETAILS \
+           $(srcdir)/../doc/FAQ         >plain-large
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/checks/armdetach.test b/checks/armdetach.test
new file mode 100755 (executable)
index 0000000..c445d6c
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+
+#info Checking armored detached signatures
+for i in $plain_files $data_files ; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 -sab -o x --yes $i
+    $GPG -o /dev/null --yes x  <$i || error "$i: bad signature"
+done
+
diff --git a/checks/armdetachm.test b/checks/armdetachm.test
new file mode 100755 (executable)
index 0000000..f195842
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking armored detached signatures of multiple files
+i="$plain_files $data_files"
+echo "$usrpass1" | $GPG --passphrase-fd 0 -sab -o x --yes $i
+cat $i | $GPG -o /dev/null --yes x || error "$i: bad signature"
+
diff --git a/checks/armencrypt.test b/checks/armencrypt.test
new file mode 100755 (executable)
index 0000000..356d1bd
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking armored encryption
+for i in $plain_files $data_files ; do
+    $GPG --always-trust -ea -o x --yes -r "$usrname2" $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/armencryptp.test b/checks/armencryptp.test
new file mode 100755 (executable)
index 0000000..d18c56b
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking armored encryption with a pipe
+for i in $plain_files $data_files ; do
+    $GPG --always-trust -ea --yes -r "$usrname2" < $i | tee x | $GPG -o y --yes
+    cmp $i y || error "$i: mismatch"
+    $GPG --yes < x > y
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/armor.test b/checks/armor.test
new file mode 100755 (executable)
index 0000000..2efcf32
--- /dev/null
@@ -0,0 +1,181 @@
+#!/bin/sh
+# Regression tests pertaining to the armoring.
+
+. $srcdir/defs.inc || exit 3
+
+armored_key_8192='-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: SKS 1.0.9
+
+mQGiBDnKLQkRBACVlYh6HivoRjHzGedNpnYPISxImK3eFgt+qs/DD9rqhBOSUTYvmKfa1u7M
+W4XDc23YEoq3MyhtC35IL2RH6rmeIPz7ZVK5rUKWMqzf94n58gIkgdDZgCcaDWImtZFSjji4
+TGhepaIz75iIbymvtnjr9d++fH/lFkz0HDjbOkXCfwCg9GeOjiWw1yBK8cO11acAjk+QpW8D
+/i8ftC1hV0iuh9mswYeG05pBbeeaOW4I2Ps4IcecpXhSyPaP1YiXKRqg9GX2brNgXwc3MEiq
+Wn4UU407RzjrUNF4/d20Q7N2g2MDUDzBtmMytfT2LLKlj53Cq+p510yXESA7UHjiOpRrHPN9
+R69wHmHPsLPkdkB/jRTSM1gzQNtXA/96bRpfGMtCssfB449gBA/kYF14iXUM5KTF6YPSFhCC
+xPGNMoP1uxTk0NHvcYZe4zW2O6b/f9x5Lh15RI1ozWXakX6u3xEV3OqsvVTtXupe4MljHQlX
+YwMDI3MUzFtnHR+He1Bw5lkBVWtkV7rX2kX749J1EgADwlNEP1KFRdjqi7QhU3VzdW11IE9T
+QVdBIDxzdXN1bXVvQGRlYmlhbi5vcmc+iEYEEBECAAYFAjvNYPUACgkQU+WZW1FVMwrlTACf
+RigokAWd1OqYtcOt3v829fhNqYEAnR9uUslZr6B6RaW0z8/BZZuhGuLViEYEEBECAAYFAjzG
+evgACgkQfGUzr9MtPXGWyACg066aP5SSkBHWqqYGGLZv9sVRMNIAoIEHBI1gq4rPJatYDdau
+Ni6DUTkGiEYEEBECAAYFAjzGfBAACgkQ9D5yZjzIjAlTqACeJmtp9kpfljkARhfa3QTc2Q56
+WKkAoJmUchp+fAceVeFncpFeo6leM1YhiEYEEBECAAYFAjzGftIACgkQ2QCnNZ2xmQQCegCg
+rdTsTWzaZk6gF+mtvIDwKsUx8gwAnRUbdDfOP0qL+83Bbz2r/IzPxjCEiEYEEBECAAYFAj2T
+Rd0ACgkQFwU5DuZsm7BfXQCeNVG09VZ2VnuuWTRbgoANXGIyRb0AoI/giUU4DcIpAPbcoNV7
+PzCIreyviEYEExECAAYFAj2508wACgkQ0pu//EQuY8KiUwCdHijK7Wkim2FUPU6i6KxwRH/k
+kFwAn1sOAWVOrLfRBfrNNQBANpbr5ufniEYEExECAAYFAj27vpsACgkQKb5dImj9VJ9m2wCc
+DeL9IkWpytXLPFhKCH9U9XhzPA4AnRjiY3y6AdNhbUgG/eS8Dumch0dniEYEExECAAYFAj5q
+MCcACgkQO/YJxouvzb2O5QCghtxYfrIcbfTcBwvz9vG1sBHkQSkAnj3PMjN9dk1x1e4rUD9d
+S00JOoI0iFYEExECABYFAjnKLQkECwoEAwMVAwIDFgIBAheAAAoJEN7sjAneQVsOUfcAoNgN
+xaeqMn5EWO2MkwVvVrLjWI2FAKDLnp19rJsU69OK7qHqfMeGWFXsQYheBBMRAgAWBQI5yi0J
+BAsKBAMDFQMCAxYCAQIXgAASCRDe7IwJ3kFbDgdlR1BHAAEBUfcAoNgNxaeqMn5EWO2MkwVv
+VrLjWI2FAKDLnp19rJsU69OK7qHqfMeGWFXsQYiVAwUQOcrkWi2pLp/VI9wNAQE5mAP/WW9g
+shqGqWN/rWevpVKlzwqGSqMUq6E2K34dHrFdqd/WnY8ng5zAd66Ey3OLS5x9/+KI6W9MU5OI
+WmxOfrp7PxwqLrQH/BruPTHe9mZbkSyjWIS/V+W8/lYtzIUYTd0584+1x7cK6jah3mAdFu5t
+8fr1k3NyVXFH66dLrLF0bBu0JFN1c3VtdSBPU0FXQSA8c3VzdW11LW9AZGViaWFuLm9yLmpw
+PohGBBARAgAGBQI7zWD4AAoJEFPlmVtRVTMKpEEAn0Oxl1tcdFf6LxiG2URD7kmHNm+iAJ9l
+uLXjsYvo0OXlG1HlaFkFduhgp4hGBBARAgAGBQI8xnr7AAoJEHxlM6/TLT1xZlEAnjSeGhDQ
+mbidMrjv4nOaWWDePjN7AKDXoHEhZbpUIJLJBgS4jZfuGtT3VYhGBBARAgAGBQI8xnwTAAoJ
+EPQ+cmY8yIwJTjEAnAllI6IPXWJlHjtwqlHHwprrZG4eAJwMTl5Rbqu1lf+Lmz3N8QBrcTjn
+zYhGBBARAgAGBQI8xn7VAAoJENkApzWdsZkE6M4AoIpVj26AQLU6dtiJuLNMio8jKx/AAJ9n
+8VzpA4GFEL3Rg2eqNvuQC0bJp4hGBBARAgAGBQI9k0XgAAoJEBcFOQ7mbJuwsaUAnRIT1q2W
+kEgui423U/TVWLvSp2/aAKDG6xkJ+tdAmBnO5CcQcNswRmK4NIhGBBMRAgAGBQI9u76dAAoJ
+ECm+XSJo/VSfDJQAn0pZLQJhXUWzasjG2s2L8egRvvkmAJ4yTxKBoZbvtruTf//8HwNLRs9W
+v4hGBBMRAgAGBQI+ajAuAAoJEDv2CcaLr829bTYAoJzZa95z3Ty/rVS8Q5viOnicJwtOAKCG
+RKoaw3UZfpm6RLHZ4aHlYxCA0YhXBBMRAgAXBQI6aHxFBQsHCgMEAxUDAgMWAgECF4AACgkQ
+3uyMCd5BWw4I+ACfQhdkd2tu9qqWuWW7O1GsLpb359oAoLleotCCH4La5L5ZE/cPIde9+p8o
+iF8EExECABcFAjpofEUFCwcKAwQDFQMCAxYCAQIXgAASCRDe7IwJ3kFbDgdlR1BHAAEBCPgA
+n0IXZHdrbvaqlrlluztRrC6W9+faAKC5XqLQgh+C2uS+WRP3DyHXvfqfKLQlU3VzdW11IE9T
+QVdBIDxzdXN1bXUtb0Bnb2ZvcndhcmQub3JnPohGBBARAgAGBQI7zWD4AAoJEFPlmVtRVTMK
+aY0An0oI4Fwko9YsVWS+0M3/Tpc8FB2eAJ4oALojFgFkOWYT97dh8rTQW8BhyohGBBARAgAG
+BQI8xnr7AAoJEHxlM6/TLT1xsXcAoJV/9zoudxvWy+LwktkGyCB7aTx4AJ0Z8GWmx2/C4W2M
+tSyaUscY3X19uYhGBBARAgAGBQI8xnwTAAoJEPQ+cmY8yIwJpxQAn3efnPpctMJFDQomRDbo
+7Q8rg6r4AKCq7LZmOaXvyrBF/JcYjOCLtYMPIIhGBBARAgAGBQI8xn7VAAoJENkApzWdsZkE
+iB0AnRQs0XjhpGOpR1lyEOuZkm2xxHPzAJ9Is3sG9UMOr+YS5V1GXXiFM29S3YhGBBARAgAG
+BQI9k0XgAAoJEBcFOQ7mbJuwjiAAn2wcQP9HreVLCSQruB1wnX/s79ZcAKCRcecLF+wiRo59
+JJvwtnxp2W24EYhGBBMRAgAGBQI9u76dAAoJECm+XSJo/VSftKUAoJQ/cYKqkyOLSOelU8eM
+plFiFJlPAJwK7B0HrN+tDmR7r8Hc0GrRrbAuvYhGBBMRAgAGBQI+ajAuAAoJEDv2CcaLr829
+PX0An2kfEs+3iR5qV35EQlCdL5ITZCSNAKCf8HErpT620TUhU6hI7vW5R3LNgohXBBMRAgAX
+BQI6aHxeBQsHCgMEAxUDAgMWAgECF4AACgkQ3uyMCd5BWw5HzwCdF8w3WjnwTvktko3ZB7IM
+mFLKvSQAn3GbioDBdV+j6xuhSI90osLMu1jgiF8EExECABcFAjpofF4FCwcKAwQDFQMCAxYC
+AQIXgAASCRDe7IwJ3kFbDgdlR1BHAAEBR88AnRfMN1o58E75LZKN2QeyDJhSyr0kAJ9xm4qA
+wXVfo+sboUiPdKLCzLtY4IkBIgQQAQIADAUCQpGGggUDABJ1AAAKCRCXELibyletfJEKCACw
+Yf5qY4J3RtHnC56HmGiW4GXaahJpBQ1JcWmfx7CkTqJPQveg+KQ4pfLuJvZ8v4YqPZCxPOeK
+/ZhIO48UB4obcD8BZdSkRA4QBamRp8iqcgrCot/LA5xQu9tivIhUJP/1dT6PmDy4DAV3Flgt
+HgED5niVESDPfz3Gjff5iWWIs6dM3bycxoTcFWLz++578aOasoq9T8Tfua9H8UrouVz3+6TK
+xG0rGeb2jOQOQcbLCn3soU/Z60H3SvJYHzgxlS5bqIybrjo3sAnuus/kisrmNjeFfQBdl9v+
+GnK65D1tmBa1+6a95uHb+OG4eHzIXmvnDI4A1RhRKiZ/kpVsT7RViQEiBBABAgAMBQJCo1H8
+BQMAEnUAAAoJEJcQuJvKV618bJgIAMb9Xiv8ps3quJ9ByHhbIQtBOymH0fFiodsutPrcR2Af
+1lc/eh3Ik20Z9Ba3g5V6eUW+3sjpDsjKtI1CXuRq0Zgmze3hrUTMRmyrLoaHPocrqfj2G9mW
+y2OomLHMDurcJFQkSUJioI4Kxo+1NBZmylPKUEeIEoP8UBJbKxf78dVh00ZUecwZcn9lLiZA
+TycRQ0WTT1Yv1fI+tBmvSrpMSe+0k+JS+QigvINN5vUxaV1cN6mkREPYVm7oHzPCQ2C9NX1q
+cI/Wkc38ieZw1Sv9vyPCCL6MYd/2t1209a/ZKADaw5l+mhyWUqIT6SXPLxMDy0NvPhTKdDr1
+7S5LOcKhwPqJASIEEAECAAwFAkK2pukFAwASdQAACgkQlxC4m8pXrXxvUQgAlfw6doD0JHtY
+iN9uCp2M1orLKS/zm66e9eiYPJwbim96KiwP98Ti5J+QO5hZdT3dhW2Avw5JPFiQukSc/rjT
+1YHRyuhZfXKhQhsjom5JmyFSdeIzjnz0PIM2qZaK4OfFihleQfQ8Y94wkPwYtkEXxpBQSClg
+Xk6QJEql34sQexIDM7VsREwv/eIQ73RMquat4RZP1L3h4nj1UJu/X7ey3HVVo61gH0RIAR+A
+adv59AAp//TkKUNIRCHOsIpFCXHjJsJxRvJKhiz3T6FhqFEQNF2tDJKHFV1FcLAIEZheuGOV
+fKNXgmvVATPHrJsg5HsZACg/aRFq9NL9FYskFyGcB4kBIgQQAQIADAUCQrdR0QUDABJ1AAAK
+CRCXELibyletfMNMB/49u9oQzbmTtmHaoKuvou7OA6zmrfeu5X9vV1efZgItF78J7G19fVt8
+K3e6kn0KGYVL+FTbPdEbvrYTb+jfMkzrHooxQYSr0j8Baqfh2bMuZzuw2pVtgBUTYHoihNjQ
+lv6GPtF7Y3CVWLUYXZ25yqY3Hzh9YneoH8bUVFZWxRFitqGB+noFpvm0YXrCJZ19BDNTQlx7
+5quAl4KTNOAxapsKaBrz/4PrnNbuwZBkzP5EEuEyjTM+6UBhxibXfdWKnZw6ky7k6tuUsc68
+qfQJBK6KBmVLflZ5nrd2N90Ueb0m3xfzdncBAZb43THGhi6XyZ4jvbMjvjm3MCGuUosYYbT6
+iQEiBBABAgAMBQJCyQLdBQMAEnUAAAoJEJcQuJvKV618Jz0IAKstm2VX39p4Lt4k55ZdOqXG
+CqHCFT5YYOVcnptx8dKTpHWQXpI2lUJBAcWz0IAXXFhyUbGpvS1E9T/pYF97RSSsQyTncQll
+mLbzy3fESVkGT9xpEvF7ZaK+61BKuWFpbKRdpy5wWakk0GRyF0156vxm7vQh4XI91TwXj7DA
+v6KYWdjnHcEB8O9jLw6RlD4Y6dKjb/v7vTY6dGmYYyOQVK+Bmr/8vVcNDf+tevExsytTu4FZ
+tL9yp+yHODfHP5LZk3mC7UGR/mUKFDYhuEzzIU5ozc6qUfC5ViGt2Hjg45i2T79WeSV0UHSE
+8c3JOgE3e7A71bQEUJygPC9S+RTuc8aJASIEEAECAAwFAkLMT3oFAwASdQAACgkQlxC4m8pX
+rXwoBgf+MEjA/hx7UMl6LHwheZ9qzH/4P1d4CU46SzoC/XEPqWGs9sJw0dKxEAnRZgrG1WMP
+Ml127bOHby5WWDa/xGi0siYM64F386SG0W42FD67vPK9mMPnCDIQ4xn5gGoqUUl8ZzFG0eNv
+XRg0bmMVmoZFvaUyf0uah/0dYCYplgAjJtmC3cmNuJ98PoYEVHMKKGtPW4fVf+TcN90HVjXU
+kr0GnAvRegb3ZXnte3GrOe3jOfXjfjZMyEM6a16FFuKHmykgfyX/I4tS9GqoxPZ6s0KARKn0
+YLZUuxxFL7i1VaGJR/9duyUc8T0BLc9O4TxNuvd1vd5UKVVmTL04fe0q1Bfu4okBIgQQAQIA
+DAUCQtGX8QUDABJ1AAAKCRCXELibyletfNEoCACtKtfWhAfkxLqPihQMbvwXTuSszG61XNYb
+a41gTOpjADF2jQAQ2y8oilVyr5RgSvug8knik3EitSpBOOg0o5Y9NHF3e+85r27m8T5cP3g5
+GHAeugRFDqMXXioiAw9WoyvG9ruMY4caD3gAuogM4hB/3EMEHSlMylMrXLUtbGkQKqkLVJQn
+7V/3SVG8zfUyGb0lSFaGtHFa6LaIIuvJwkQYGMT/SiK7ISqPKOPD7kKRWhxjgcfzVthqGORn
+uQGi+316fdA+JzEYOI/gGdcZsbN/KrMSNQ0DOdSRIeiATy9M0fd+8QtUPOCtaDKLYISSrm72
+xgnKbussJRxAPjxo66dPiQEiBBABAgAMBQJC42DIBQMAEnUAAAoJEJcQuJvKV6181SUIAL/P
+gZhrwepyFUhr+nlYvxeflrxgR9Yl1aNtTngcOYlFU273cs3XnkczIpkg4fVikY5s56Y42G8F
+NvqRu0M0eL5kJvYi50NNMQnf39GkZZp2LrL9bZ9n7ysWU5tiOJsxCBnaOiAg/p6vCUVN3NV+
+t8vRP1fHwPsd5tYEBqA/g4g1U0xJAG+JqJftSDRDLxfTZ16hBdHzlQ3opqMMmW5Mv005p4o+
+buh4HzQLmBHDE98BeZ7CpjYeXY23bu8oi0tvkcTjCEeBWrXWfA3pKSX5HH63nmG3ryKuP0tr
+1A2gTgs9JtLXnGFJUdVYULiQbU781wR6+9o/0h6NuCJDPmJMNmmJASIEEAECAAwFAkLmBFIF
+AwASdQAACgkQlxC4m8pXrXxYZwf/ah4IaTK3CbtqF1+4uz7VVRKemSaNg3jMKLey2simqAQs
+1JwqkLuwEgrwF7XiejfLAvX0/yFqJZkdtDFqeK0VrwOq3WIpfj7+g5B9YSW0CkasD0HUci/l
+oXQiT9CN7PAe1vM5X4X3cqlXfC9tmU7fH7kc0kULxYHAfn96nZQklZS9aVecJ0H+pqMlPoDt
+xtxweNa7UJWAanO9kbPZ/xEdSlkuqzk1CK6ThURedc2lCE+qobPpUZri1FEvMBjyXoQ9MyD6
+AFWfax9eNn1ZSRq9t2WpPyFSQmCvyGETHyvM2BBiFR6UAQUKdr+d4ZE09cR0wXpEtoqaNeJ8
+AidTEGkuLYkBIgQQAQIADAUCQuydlwUDABJ1AAAKCRCXELibyletfLsbB/0X/Jafv+v43U26
+W3HD5XdmHaNdxm7uthGzGGzATGcTAUd3/t8fyVFk2XgmUYxtz0wHUdM8GiyK0tpKBu6wqcbO
+nGkBlvC1m6Blxy+PvpJxQ2sK4ycN8ToEEn/7HCCJesS2fvDudXkvdvskXkxZprPWe7JTHNxj
+fvESUAbLLmSpNGflZnMAOfuQP0hFBQr4D5FEA+zMf7FtrwkBanXt6W65xxEIJ/239ctCsRe8
+jIQ4LesYQN7hyX6x9bP9h3tEw6+OtvjYbMH+2B/3muNVac/9bYqi9rnuGew9eAjmdmm0u8T5
+7Iboy5mUDH2wjpRo6MGU1cHe4oZscW0f9TPE+6XbiQEiBBABAgAMBQJC7UXaBQMAEnUAAAoJ
+EJcQuJvKV618zbcH/RlUtrZSBcUafmhY29s9BYycwWx/UoeJRIJmi852TguSGsoPuAYEGeaW
+WxCdSru2ibn7GPBXowM5u+4MqYqaRB695sg/Ajxho2Djys3lV0TPeSIbyZ7cXbjoSDnSVw/N
+eWGKJLwbFVZPjjC7mcGIMhE1NGGxyRO5H1Z6GA8dEP3zR0rIivklN8KEngfyLRVvB5WYPBs+
+buaNF5HflsBXl2bOP5ueThcal1PSE4HNoQXz79t0Cw7kpsWy3FyFUVVRHPyvwVpJSdYjz8Ur
+L4cD3Dj9SOPwa4AvM7WX+JXbPEIFxi+NA4R0TVxIZXJ/HX8AZj87RFxGYlTfP3GFFw+52QaJ
+ASIEEAECAAwFAkMHCEAFAwASdQAACgkQlxC4m8pXrXxGXQgAwFY5RYFHKcYkL9nDfblQDjXW
+Ictj1rlP2yPsy8dKX579ejhdd8o0TGJf8AzYRaDEpffPf/ZvyfRltqKd979GzdAE3smkrGeD
+kPuUY2rEF6Eon549Tn7omGYNueDuO27QQ4zIs0k9h4m+pE6PxPTgC5BsEVF8Hrz647/XSTf2
+G0Wo11y/KBWGJ9BYvZ1YSxwmk5zicGF4sYNktO1Yl6CGS1ugP9zitCuwSiUm+gJrMCZ3am/D
++Of+80Ui7e/V9yOOeyC7/gqQq4okPZbdVzJ3hiG2Y3eip19ewHYlYSiLoBW3rr3M3mKBTcbx
++nLfVOTUHp8HdqxIyI782SaZlpg0mYkBIgQQAQIADAUCQwhbTQUDABJ1AAAKCRCXELibylet
+fD7WB/9ydWuVT1DeeL3UBqqeRRN+mt5DChdFeCjJhWcAjds8R6Z8Q9c+kpKEk+MeSevKaOAf
+iiM2JBtruIxt1sfh/vVEFgjHP/M0sF1il6TwZEKqVn5c3ikMYCMXy75xheslCJoX7fi4jZut
+TO8+JqjVN+z+SYzeRrvQFcjJoIOLRnshh2XgUiXVf/xo/My+fM9rKnMHxF/75PaFVVz8cXz1
+X3jsuUOVLxnUZHsOaP9r1h3bq8uHJxkxPElVPbCuKLdCWrNOHHX6/+TAH9xohUvrBm6HXqbv
+O/aVGqf+Bip6oWSB6rSIe9+0GmXLRe4Ph3ekBvyGUJM/nFhN4hQHX69xZS7yiQEiBBABAgAM
+BQJDEOyRBQMAEnUAAAoJEJcQuJvKV618IlwIAIPbWp20TBCnU0D3kE6JFqRaVKqNAFaJbmRn
+48qxX10NmHnBAluU1iJiUsVL2kOpvf2eyFUsX+sQfVJPzmWkUU2gED/+WZNkcmxPZ72FtJCs
+hW30BcJnLjcRo8wv/6nhdEZ2JYNiBIFHxNQ6iiB7BzVpYsMp1l5tI6mIhbxYxMNETTMrb+hK
+NNAhxjrqiWxPNlrzw6TaKnBOE0Au/Asjz9n37hsPV5Q9xY3zXbff3yDirVkBC4l0Vc+U6drX
+XiFBjQj77yt6AjTYUzBZY7UuGQ0W6o/6QF3KfiC3WAoFJL7SLujIaALkALs+lFzsu3CA9KoB
+X8Ca4hA7kzOP1H76VZKJASIEEAECAAwFAkMSPXoFAwASdQAACgkQlxC4m8pXrXx3cQf9GBPO
+XIrdbvUWIKTofiwftiy6j3MhKOszHkzR9quCu6aLu/aVvIA/avTZHjfj0EvYaQaSNMWplMiX
+i2UhkPHe4cgJYkbjmXEz16GtXYPZXGP1FubQ/RwQ7yQKaVtXSCgz+ZdR5tKhU5kruxAsVjly
+KcQvST95wlqxLuvXzSCjPdWj4qBvkuEt6QADx8EYCafraIiHPRkKtAAiK0sXJSkLevXn3zAN
+6X6ngvZZiNQFvfWLFV8Rodz1vI4S6Af2MTSlVV9Vw0voJGprcsNDlB8k5B/Kl9LigeKdkFa8
+JVfwOQppAtU+Nq3pHjquEafZrPVF9HWY0G0Szh5tOFEpVMF6g4kBIgQQAQIADAUCQxQ7iwUD
+ABJ1AAAKCRCXELibyletfBVfB/9ydVsiBrNWLt0RwbAdMvHRceHz1twh+YeSnpr9Equ7aDMG
+qou4ppl/nTbnZIizdWn3dnRKt+vKY/puuPIT9kEVF7DlfBOcWBdLBvJz34eBt29BCFgvsfOS
+fwESMNKgquZmrraGpEvj4cSTOmW3DJPevB+6ajsN87BC5Qp2MjDGVkwT/Nj6R60pz/vmeSwl
+0BmzgthrBd+NfHSA116HEAF1V21/2UhA1hbkPKe40jWp6HK+GcXDC3+PucTJeS8nX4LLQnWZ
+JCr1QUbkaW6jHCw7i/pgCLfqBBdIh7xJE7d+6mut1AKtq2qUSpEM4qTvrR89DLz3OtNiMnr9
+hq7s5SyduQINBDnKLe0QCACUXlS4TkpEZZP06rJ2IVWZ2v7ZSPkLXjDRcC8h6ESQeZdBOSbd
+dciiWYiHtGq2kyx+eoltwooP7EgJ9m35wn0FGV+5hpKbhSwz2Up9oYsSbexjx/hlopUYGCL4
+kgezCUWQsKypsitJChjV8MHgePDQcF3ho+qK+0ZJeevbYKSZ9bLyzt/i3/b3Jnt0f8tsFP3P
+djel4N76DyQiTyuoOxzZJUJDKx1zr745PUMGcur79oAxuahUfPcRpuwcHFOB0yO7SwEY8fe2
+68U5/AZrGwX+UAZhN7y2MMkU/xK/4BIDY5/W4NY3EX2APAYMRanI+mFW3idui8EEzpzKZ1K1
+8RODAAMFCACOAfgCjg7cgjZe58k0lAV0SANrJbMqgAT1M7v4f5mOf5e3B4si9z8Mk1hx5cRX
+I3dDz/W4LPh8eONmMPjov42NOz8z84PksQBbnjlfZ5UCotPS2fZ2actJPhYCho+a4iXwRm8B
+aXQ3DFa1CsWdXvkGsNIouuSkGoGh6+sEgAdP6JXanM9YGTQINy9Xsg9YOj1UWInSwRqUmJnj
+aNQhxJfj8j5W0uXixzkbKB+Is92mfo8Km3TAi9u0Ge/Acb5Cz0c5sqs+oWqcouaTS3o8/1n6
+CZVmvcHyGI0APiALwU84z7YT9srpXHrjiHo2oS3M4sLxl0nuSFqD6uiIFrg7yF+HiEYEGBEC
+AAYFAjnKLe0ACgkQ3uyMCd5BWw6XgQCg7Gu7XOzqnEcnCYR7v6rub5d0zwwAoOsQ9TNDYmVl
+nW1ff9rt1YcTH9LiiE4EGBECAAYFAjnKLe0AEgkQ3uyMCd5BWw4HZUdQRwABAZeBAKDsa7tc
+7OqcRycJhHu/qu5vl3TPDACg6xD1M0NiZWWdbV9/2u3VhxMf0uI=
+=oXxa
+-----END PGP PUBLIC KEY BLOCK-----
+'
+
+# Bug solved 2005-04-07:
+# Try importing the attached key file.  As the key is exactly 8192
+# bytes long, radix64_read is called twice - the first time to read
+# the 8192 bytes, and then once again, to handle the pad '=' on the
+# last four character radix64 block '0uI='.  gpg bails out with
+#  gpg: [don't know]: invalid packet (ctb=2d)
+# On a read for only the = sign, radix64_read returns -1 for EOF.
+# This causes the iobuf code to pop the armor filter and thus the next
+# byte read is the '-' from the END header line, causing an error.
+i=armored_key_8192
+info "checking: $i"
+eval "(IFS=; echo \"\$$i\")" >x
+$GPG --import x || error "the $i bug is back in town"
+
+
+
+
diff --git a/checks/armsignencrypt.test b/checks/armsignencrypt.test
new file mode 100755 (executable)
index 0000000..24b9575
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+
+#info Checking armored signing and encryption
+for i in $plain_files $data_files ; do
+    echo "$usrpass1"  | $GPG --passphrase-fd 0 --always-trust \
+                        -sae -o x --yes -r "$usrname2" $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/armsigs.test b/checks/armsigs.test
new file mode 100755 (executable)
index 0000000..aecc064
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking armored signatures
+for i in $plain_files $data_files ; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 -sa -o x --yes $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/clearsig.test b/checks/clearsig.test
new file mode 100755 (executable)
index 0000000..8217f2f
--- /dev/null
@@ -0,0 +1,102 @@
+#!/bin/sh
+
+# Fixme: we should not only do a --verify but also the output.
+
+. $srcdir/defs.inc || exit 3
+
+# ======================================
+# I can't compare the out because plain-3 has no LF as last charcater
+# but the output has always one.  I do not thinkl this is a bug, because
+# it is clear text and not binary text.
+# ======================================
+for i in $plain_files plain-large ; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 -sat -o x --yes $i
+    $GPG --verify x
+done
+
+
+# ======================================
+# and once more to check rfc1991
+# ======================================
+
+if have_pubkey_algo "RSA"; then
+  for i in $plain_files plain-large ; do
+      $GPG -u $usrname3 --rfc1991 --digest-algo md5 -sat -o x --yes $i
+      $GPG --verify x
+  done
+fi
+
+# ======================================
+# and one with long lines
+# ======================================
+cat >y <<EOF
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyx
+
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+EOF
+echo "$usrpass1" | $GPG --passphrase-fd 0 --clearsign -o x --yes y
+$GPG --verify x
+
+
+# ======================================
+# and one with only one long lines
+# ======================================
+cat >y <<EOF
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyx
+EOF
+echo "$usrpass1" | $GPG --passphrase-fd 0 --clearsign -o x --yes y
+$GPG --verify x
+
+
+# ======================================
+# and one with an empty body
+# ======================================
+cat >y <<EOF
+EOF
+echo "$usrpass1" | $GPG --passphrase-fd 0 --clearsign -o x --yes y
+$GPG --verify x
+
+
+# ======================================
+# and one with one empty line at the end
+# ======================================
+cat >y <<EOF
+line 1
+line 2
+line 3
+there is a blank line after this
+
+EOF
+echo "$usrpass1" | $GPG --passphrase-fd 0 --clearsign -o x --yes y
+$GPG --verify x
+
+
+# ======================================
+# I think this file will be constructed wrong (gpg 0.9.3)
+# but it should verify okay anyway.
+# ======================================
+echo "this is a sig test" >y
+echo_n " " >>y
+echo "$usrpass1" | $GPG --passphrase-fd 0 --clearsign -o x --yes y
+$GPG --verify x
+
+
+# ======================================
+# check our special diff mode
+# ======================================
+cat >y <<EOF
+--- mainproc.c Tue Jun 27 09:28:11 2000
++++ mainproc.c~ Thu Jun  8 22:50:25 2000
+@@ -1190,16 +1190,13 @@
+               md_enable( c->mfx.md, n1->pkt->pkt.signature->digest_algo);
+           }
+           /* ask for file and hash it */
+-          if( c->sigs_only ) {
++          if( c->sigs_only )   
+               rc = hash_datafiles( c->mfx.md, NULL,
+                                    c->signed_data, c->sigfilename,
+                       n1? (n1->pkt->pkt.onepass_sig->sig_class == 0x01):0 );
+EOF
+echo "$usrpass1" | $GPG --passphrase-fd 0 \
+                                  --not-dash-escaped --clearsign -o x --yes y
+$GPG --verify x
diff --git a/checks/conventional-mdc.test b/checks/conventional-mdc.test
new file mode 100755 (executable)
index 0000000..95a6ba4
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+algos="3des"
+
+if have_cipher_algo "idea"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "cast5"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "blowfish"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "aes"; then
+   algos="$algos aes aes192 aes256"
+fi
+
+if have_cipher_algo "twofish"; then
+   algos="$algos twofish"
+fi
+
+#info Checking conventional encryption
+for i in 0 1 2 3 9 10 11 19 20 21 22 23 39 40 41 8192 32000 ; do
+  for ciph in $algos; do
+    # *BSD's dd can't cope with a count of 0
+    if test "$i" = "0"; then
+        : >z
+    else
+        dd if=data-80000 of=z bs=1 count=$i 2>/dev/null
+    fi
+    echo "Hier spricht HAL" | $GPG --passphrase-fd 0 \
+       --force-mdc --cipher $ciph -c -o x --yes z
+    echo "Hier spricht HAL" | $GPG --passphrase-fd 0 \
+       -o y --yes x
+    cmp z y || error "$ciph/$i: mismatch"
+  done
+done
diff --git a/checks/conventional.test b/checks/conventional.test
new file mode 100755 (executable)
index 0000000..2fd2730
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking conventional encryption
+for i in plain-2 data-32000 ; do
+    echo "Hier spricht HAL" | $GPG --passphrase-fd 0 -c -o x --yes $i
+    echo "Hier spricht HAL" | $GPG --passphrase-fd 0    -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
+algos="3des"
+
+if have_cipher_algo "CAST5"; then
+   algos="$algos cast5"
+fi
+
+if have_cipher_algo "BLOWFISH"; then
+   algos="$algos blowfish"
+fi
+
+if have_cipher_algo "AES"; then
+   algos="$algos aes aes192 aes256"
+fi
+
+if have_cipher_algo "TWOFISH"; then
+   algos="$algos twofish"
+fi
+
+for a in $algos; do
+    for i in plain-1 data-80000 ; do
+      echo "Hier spricht HAL" | $GPG --passphrase-fd 0 \
+                                         --cipher-algo $a -c -o x --yes $i
+      echo "Hier spricht HAL" | $GPG --passphrase-fd 0 -o y --yes x
+      cmp $i y || error "$i: ($a) mismatch"
+    done
+done
diff --git a/checks/decrypt-dsa.test b/checks/decrypt-dsa.test
new file mode 100755 (executable)
index 0000000..6dc7dc4
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking decryption of supplied DSA encrypted file
+for i in "plain-1" ; do
+    $GPG $dsa_keyrings -o y --yes $srcdir/$i-pgp.asc
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/decrypt.test b/checks/decrypt.test
new file mode 100755 (executable)
index 0000000..aab4167
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking decryption of supplied files
+for i in $plain_files ; do
+    echo "$usrpass1" | $GPG  --passphrase-fd 0 -o y --yes $srcdir/$i.asc
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/defs.inc b/checks/defs.inc
new file mode 100755 (executable)
index 0000000..98a6c3f
--- /dev/null
@@ -0,0 +1,162 @@
+# definitions for the check scripts
+
+#--------------------------------
+#------ constants ---------------
+#--------------------------------
+
+# Note that usrpass1 is also used in Makefile.am
+usrname1="one"
+usrpass1="def"
+usrname2="two"
+usrpass2=""
+usrname3="three"
+usrpass3=""
+
+
+dsa_usrname1="pgp5"
+# we use the sub key because we do not yet have the logic to
+# to derive the first encryption key from a keyblock (I guess)
+dsa_usrname2="0xCB879DE9"
+
+dsa_keyrings="--keyring ./pubring.pkr --secret-keyring ./secring.skr"
+
+
+plain_files="plain-1 plain-2 plain-3"
+data_files="data-500 data-9000 data-32000 data-80000"
+exp_files=""
+
+# The testscripts expect the original language
+LANG=
+LANGUAGE=
+LC_ALL=
+LC_MESSAGES=
+
+# Internal use.
+defs_stop_on_error=no
+defs_error_seen=no
+
+#--------------------------------
+#------ utility functions -------
+#--------------------------------
+
+fatal () {
+    echo "$pgmname: fatal:" $* >&2
+    echo "$pgmname: fatal:" $* >&5
+    exit 1;
+}
+
+error () {
+    echo "$pgmname:" $* >&2
+    defs_error_seen=yes
+    echo "$pgmname:" $* >&5
+    if [ x$defs_stop_on_error != xyes ]; then
+      exit 1 
+    fi
+}
+
+# Call this at the start of a test and resume_error at the end to keep
+# on running all subtests without immediately exiting on error.
+suspend_error () {
+   defs_stop_on_error=yes
+}
+
+resume_error () {
+    if [ x$defs_error_seen = xyes ]; then
+        exit 1
+    fi
+    defs_stop_on_error=no
+    defs_error_seen=no
+}
+
+info () {
+    echo "$pgmname:" $* >&2
+    if [ -n "${verbose+set}" ]; then
+      echo "$pgmname:" $* >&5
+    fi
+}
+
+linefeed () {
+    echo >&2
+}
+
+
+echo_n_init=no
+echo_n () {
+  if test "$echo_n_init" = "no"; then
+    if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+      if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+       echo_n_n=
+       echo_n_c='
+'
+      else
+       echo_n_n='-n'
+       echo_n_c=
+      fi
+    else
+      echo_n_n=
+      echo_n_c='\c'
+    fi
+    echo_n_init=yes
+  fi
+  echo $echo_n_n "${1}$echo_n_c"
+}
+
+
+#cleanup () {
+#    rm $cleanup_files 2>/dev/null || true
+#    echo "#empty" >./options
+#}
+
+
+#add_cleanup () {
+#    cleanup_files="$cleanup_files $*"
+#}
+
+have_pubkey_algo () {
+  if  ../g10/gpg --homedir .  --version | grep "Pubkey:.*$1" >/dev/null
+  then
+       true
+  else
+       false
+  fi
+}
+
+have_cipher_algo () {
+  if  ../g10/gpg --homedir .  --version | grep "Cipher:.*$1" >/dev/null
+  then
+       true
+  else
+       false
+  fi
+}
+
+have_hash_algo () {
+  if  ../g10/gpg --homedir .  --version | grep "Hash:.*$1" >/dev/null
+  then
+       true
+  else
+       false
+  fi
+}
+
+set -e
+pgmname=`basename $0`
+#trap cleanup SIGHUP SIGINT SIGQUIT
+
+[ -z "$srcdir" ] && fatal "not called from make"
+
+# Make sure we have a valid option files even with VPATH builds.
+if [ -f ./options ]; then
+  :
+elif [ -f ./gpg.conf ]; then
+  :
+elif [ -f $srcdir/options ]; then
+  cat $srcdir/options >gpg.conf
+fi
+
+GPG="../g10/gpg --no-permission-warning --homedir . "
+
+exec 5>&2 2>${pgmname}.log
+
+:
+# end
diff --git a/checks/detach.test b/checks/detach.test
new file mode 100755 (executable)
index 0000000..6a3ae05
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking detached signatures
+for i in $plain_files $data_files ; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 -sb -o x --yes $i
+    $GPG -o /dev/null --yes x  <$i || error "$i: bad signature"
+done
+
diff --git a/checks/detachm.test b/checks/detachm.test
new file mode 100755 (executable)
index 0000000..dc60bb2
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking detached signatures of multiple files
+i="$plain_files $data_files"
+echo "$usrpass1" | $GPG --passphrase-fd 0 -sb -o x --yes $i
+cat $i | $GPG -o /dev/null --yes x || error "$i: bad signature"
+
diff --git a/checks/encrypt-dsa.test b/checks/encrypt-dsa.test
new file mode 100755 (executable)
index 0000000..0c6333c
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking encryption
+for i in $plain_files $data_files ; do
+    $GPG $dsa_keyrings --always-trust -e -o x --yes -r "$dsa_usrname2" $i
+    $GPG $dsa_keyrings -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
+algos="3des"
+
+if have_cipher_algo "idea"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "cast5"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "blowfish"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "aes"; then
+   algos="$algos aes aes192 aes256"
+fi
+
+if have_cipher_algo "twofish"; then
+   algos="$algos twofish"
+fi
+
+for ca in $algos ; do
+    for i in $plain_files $data_files ; do
+       $GPG $dsa_keyrings --always-trust --cipher-algo $ca -e \
+           -o x --yes -r "$dsa_usrname2" $i
+       $GPG $dsa_keyrings -o y --yes x
+       cmp $i y || error "$i: mismatch"
+    done
+done
diff --git a/checks/encrypt.test b/checks/encrypt.test
new file mode 100755 (executable)
index 0000000..44f26a1
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking encryption
+for i in $plain_files $data_files ; do
+    $GPG --always-trust -e -o x --yes -r "$usrname2" $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
+algos="3des"
+
+if have_cipher_algo "idea"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "cast5"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "blowfish"; then
+   algos="$algos idea"
+fi
+
+if have_cipher_algo "aes"; then
+   algos="$algos aes aes192 aes256"
+fi
+
+if have_cipher_algo "twofish"; then
+   algos="$algos twofish"
+fi
+
+for ca in $algos ; do
+    for i in $plain_files $data_files ; do
+       $GPG --always-trust -e -o x --yes -r "$usrname2" --cipher-algo $ca $i
+       $GPG -o y --yes x
+       cmp $i y || error "$i: mismatch"
+    done
+done
diff --git a/checks/encryptp.test b/checks/encryptp.test
new file mode 100755 (executable)
index 0000000..7df24ef
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking encryption with a pipe
+for i in $plain_files $data_files ; do
+    $GPG --always-trust -e --yes -r "$usrname2" <$i | $GPG --yes > y
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/genkey1024.test b/checks/genkey1024.test
new file mode 100755 (executable)
index 0000000..48d02da
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+../g10/gpg --quiet --batch --quick-random --homedir . --gen-key <<EOF
+Key-Type: DSA
+Key-Length: 1024
+Subkey-Type: ELG-E
+Subkey-Length: 1024
+Name-Real: Harry H.
+Name-Comment: test key 
+Name-Email: hh@@ddorf.de
+Expire-Date: 1
+Passphrase: abc
+%commit
+EOF
+
+if have_pubkey_algo "RSA"; then
+../g10/gpg --quiet --batch --quick-random --homedir . --gen-key <<EOF
+Key-Type: RSA
+Key-Length: 1024
+Key-Usage: sign,encrypt
+Name-Real: Harry A.
+Name-Comment: RSA test key 
+Name-Email: hh@@ddorf.de
+Expire-Date: 2
+Passphrase: abc
+%commit
+EOF
+fi
diff --git a/checks/mds.test b/checks/mds.test
new file mode 100755 (executable)
index 0000000..6551d18
--- /dev/null
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+
+. $srcdir/defs.inc || exit 3
+
+
+test_one () {
+   if [ "`grep $1 y | sed -e 's/:[^:]*:\(.*\):/\1/'`" != "$2" ]; then
+       failed="$failed $1"
+   fi
+}
+
+failed=""
+
+#info Checking message digests
+cat /dev/null | $GPG --with-colons --print-mds >y
+# MD5
+test_one ":1:"    "D41D8CD98F00B204E9800998ECF8427E"
+# SHA-1
+test_one ":2:"    "DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"
+# RMD160
+test_one ":3:"    "9C1185A5C5E9FC54612808977EE8F548B2258D31"
+# SHA-224
+if have_hash_algo "SHA224"; then
+  test_one ":11:"    "D14A028C2A3A2BC9476102BB288234C415A2B01F828EA62AC5B3E42F"
+else
+  echo "Hash algorithm SHA-224 is not installed (not an error)"
+fi
+# SHA-256
+if have_hash_algo "SHA256"; then
+  test_one ":8:"    "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855"
+else
+  echo "Hash algorithm SHA-256 is not installed (not an error)"
+fi
+# SHA-384
+if have_hash_algo "SHA384"; then
+  test_one ":9:"  "38B060A751AC96384CD9327EB1B1E36A21FDB71114BE07434C0CC7BF63F6E1DA274EDEBFE76F65FBD51AD2F14898B95B"
+else
+  echo "Hash algorithm SHA-384 is not installed (not an error)"
+fi
+# SHA-512
+if have_hash_algo "SHA512"; then
+  test_one ":10:"  "CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E"
+else
+  echo "Hash algorithm SHA-512 is not installed (not an error)"
+fi
+
+[ "$failed" != "" ] && error "$failed failed for empty string"
+
+echo_n "abcdefghijklmnopqrstuvwxyz" | $GPG --with-colons --print-mds >y
+test_one ":1:"    "C3FCD3D76192E4007DFB496CCA67E13B"
+test_one ":2:"    "32D10C7B8CF96570CA04CE37F2A19D84240D3A89"
+test_one ":3:"    "F71C27109C692C1B56BBDCEB5B9D2865B3708DBC"
+if have_hash_algo "SHA224"; then
+  test_one ":11:"    "45A5F72C39C5CFF2522EB3429799E49E5F44B356EF926BCF390DCCC2"
+fi
+if have_hash_algo "SHA256"; then
+  test_one ":8:"    "71C480DF93D6AE2F1EFAD1447C66C9525E316218CF51FC8D9ED832F2DAF18B73"
+fi
+if have_hash_algo "SHA384"; then
+  test_one ":9:"  "FEB67349DF3DB6F5924815D6C3DC133F091809213731FE5C7B5F4999E463479FF2877F5F2936FA63BB43784B12F3EBB4"
+fi
+if have_hash_algo "SHA512"; then
+  test_one ":10:" "4DBFF86CC2CA1BAE1E16468A05CB9881C97F1753BCE3619034898FAA1AABE429955A1BF8EC483D7421FE3C1646613A59ED5441FB0F321389F77F48A879C7B1F1"
+fi
+
+[ "$failed" != "" ] && error "$failed failed for a..z"
+
+exit 0
diff --git a/checks/mkdemodirs b/checks/mkdemodirs
new file mode 100755 (executable)
index 0000000..d6b7d7c
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+set -e
+
+GPG="../g10/gpg --batch --quiet --no-secmem-warning --allow-secret-key-import"
+NAMES='Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India
+       Juliet Kilo Lima Mike November Oscar Papa Quebec Romeo
+       Sierra Tango Uniform Victor Whisky XRay Yankee Zulu'
+
+if [ "$1" = "--clean" ]; then
+    (for i in $NAMES; do
+       [ -d $i ] && rm -r $i
+    done) || true
+    exit 0
+fi
+
+$GPG --dearmor -o secdemo.gpg --yes ../checks/secdemo.asc
+$GPG --dearmor -o pubdemo.gpg --yes ../checks/pubdemo.asc
+[ -f ./tdb.tmp ] && rm ./tdb.tmp
+GPGDEMO="$GPG --homedir . --trustdb-name ./tdb.tmp --no-default-keyring
+        --keyring pubdemo.gpg --secret-keyring secdemo.gpg"
+echo -n "Creating:"
+for name in $NAMES; do
+    echo -n " $name"
+    [ -d $name ] && rm -r $name
+    mkdir $name
+    $GPGDEMO --export-secret-key -o - $name > $name/Secret.gpg
+    $GPG --homedir $name --import $name/Secret.gpg
+    $GPGDEMO --export -o - $name > $name/Public.gpg
+    $GPG --homedir $name --import $name/Public.gpg
+    [ -f $name/pubring.gpg~ ] && rm $name/pubring.gpg~
+done
+echo "."
+[ -f ./tdb.tmp ] && rm ./tdb.tmp
+rm pubdemo.gpg secdemo.gpg
+
+
diff --git a/checks/multisig.test b/checks/multisig.test
new file mode 100755 (executable)
index 0000000..ece6f22
--- /dev/null
@@ -0,0 +1,145 @@
+#!/bin/sh
+# Check that gpg verifies only signatures where there is no ambiguity
+# in the order of packets.  Needs the Demo Keys Lima and Mike.
+
+# Note: We do son't support multiple signaturess anymore thus thsi test is 
+# not really needed becuase verify could do the same.  We keep it anyway.
+
+. $srcdir/defs.inc || exit 3
+
+suspend_error
+
+
+
+sig_1ls1ls_valid='
+-----BEGIN PGP ARMORED FILE-----
+
+kA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogq9EkgYW0gc29ycnksIEkgY2FuJ3Qg
+ZG8gdGhhdAqIPwMFADqIKvQ3yrUft5ED+BEC2joAoJaSaXOZEtSZqQ780HIXG77e
+8PB7AJ4wCprmaFTO0fBaTcXDuEOBdAWnOZANAwACETfKtR+3kQP4AawnYgV0ZXh0
+MTqIKvRJIGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRoYXQKiD8DBQA6iCr0N8q1H7eR
+A/gRAto6AKCWkmlzmRLUmakO/NByFxu+3vDwewCeMAqa5mhUztHwWk3Fw7hDgXQF
+pzk=
+=8jSC
+-----END PGP ARMORED FILE-----
+'
+sig_ls_valid='
+-----BEGIN PGP ARMORED FILE-----
+
+rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI
+K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT
+QDUFTH2PvZRxjw==
+=J+lb
+-----END PGP ARMORED FILE-----
+'
+sig_sl_valid='
+-----BEGIN PGP ARMORED FILE-----
+
+iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU
+tH60PslLE0A1BUx9j72UcY+sJ2IFdGV4dDE6iCtLSSBhbSBzb3JyeSwgSSBjYW4n
+dCBkbyB0aGF0Cg==
+=N9MP
+-----END PGP ARMORED FILE-----
+'
+sig_11lss_valid_but_is_not='
+-----BEGIN PGP ARMORED FILE-----
+
+kA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogyXUkgYW0g
+c29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED+BECwQAAnRXT
+mXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp5Yg/AwUAOogy
+XTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0P01WmbgZJoZB
+Q341WRXKS/at
+=Ekrs
+-----END PGP ARMORED FILE-----
+'
+sig_11lss11lss_valid_but_is_not='
+-----BEGIN PGP ARMORED FILE-----
+
+kA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogyXUkgYW0g
+c29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED+BECwQAAnRXT
+mXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp5Yg/AwUAOogy
+XTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0P01WmbgZJoZB
+Q341WRXKS/atkA0DAAIRN8q1H7eRA/gAkA0DAAIRN8q1H7eRA/gBrCdiBXRleHQx
+OogyXUkgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqIMl03yrUft5ED
++BECwQAAnRXTmXjVd385oD38W80XuheWKTGcAJ9pZ6/flaKDfw+SLido7xaUHuhp
+5Yg/AwUAOogyXTfKtR+3kQP4EQLBAACgnN0IP+NztE0aAc/DZ17yHWR9diwAniN0
+P01WmbgZJoZBQ341WRXKS/at
+=P1Mu
+-----END PGP ARMORED FILE-----
+'
+sig_ssl_valid_but_is_not='
+-----BEGIN PGP ARMORED FILE-----
+
+iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU
+tH60PslLE0A1BUx9j72UcY+IPwMFADqIK0s3yrUft5ED+BECLQMAn2jZUNOpB4Ou
+urSQkc2TRfg6ek02AJ9+oJS0frQ+yUsTQDUFTH2PvZRxj6wnYgV0ZXh0MTqIK0tJ
+IGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRoYXQK
+=Zven
+-----END PGP ARMORED FILE-----
+'
+sig_1lsls_invalid='
+-----BEGIN PGP ARMORED FILE-----
+
+kA0DAAIRN8q1H7eRA/gBrCdiBXRleHQxOogq9EkgYW0gc29ycnksIEkgY2FuJ3Qg
+ZG8gdGhhdAqIPwMFADqIKvQ3yrUft5ED+BEC2joAoJaSaXOZEtSZqQ780HIXG77e
+8PB7AJ4wCprmaFTO0fBaTcXDuEOBdAWnOawnYgV0ZXh0MTqIK0tJIGFtIHNvcnJ5
+LCBJIGNhbid0IGRvIHRoYXQKiD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeD
+rrq0kJHNk0X4OnpNNgCffqCUtH60PslLE0A1BUx9j72UcY8=
+=nkeu
+-----END PGP ARMORED FILE-----
+'
+sig_lsls_invalid='
+-----BEGIN PGP ARMORED FILE-----
+
+rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI
+K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT
+QDUFTH2PvZRxj6wnYgV0ZXh0MTqIK0tJIGFtIHNvcnJ5LCBJIGNhbid0IGRvIHRo
+YXQKiD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCf
+fqCUtH60PslLE0A1BUx9j72UcY8=
+=BlZH
+-----END PGP ARMORED FILE-----
+'
+sig_lss_invalid='
+-----BEGIN PGP ARMORED FILE-----
+
+rCdiBXRleHQxOogrS0kgYW0gc29ycnksIEkgY2FuJ3QgZG8gdGhhdAqIPwMFADqI
+K0s3yrUft5ED+BECLQMAn2jZUNOpB4OuurSQkc2TRfg6ek02AJ9+oJS0frQ+yUsT
+QDUFTH2PvZRxj4g/AwUAOogrSzfKtR+3kQP4EQItAwCfaNlQ06kHg666tJCRzZNF
++Dp6TTYAn36glLR+tD7JSxNANQVMfY+9lHGP
+=jmt6
+-----END PGP ARMORED FILE-----
+'
+sig_slsl_invalid='
+-----BEGIN PGP ARMORED FILE-----
+
+iD8DBQA6iCtLN8q1H7eRA/gRAi0DAJ9o2VDTqQeDrrq0kJHNk0X4OnpNNgCffqCU
+tH60PslLE0A1BUx9j72UcY+sJ2IFdGV4dDE6iCtLSSBhbSBzb3JyeSwgSSBjYW4n
+dCBkbyB0aGF0Cog/AwUAOogrSzfKtR+3kQP4EQItAwCfaNlQ06kHg666tJCRzZNF
++Dp6TTYAn36glLR+tD7JSxNANQVMfY+9lHGPrCdiBXRleHQxOogrS0kgYW0gc29y
+cnksIEkgY2FuJ3QgZG8gdGhhdAo=
+=phBF
+-----END PGP ARMORED FILE-----
+'
+
+
+for i in  sig_sl_valid ; do
+    eval "(IFS=; echo \"\$$i\")" | ./gpg_dearmor >x
+    $GPG --verify x 2>/dev/null || error "valid is invalid ($i)"
+    linefeed
+done
+#for i in "$sig_11lss_valid_but_is_not" "$sig_11lss11lss_valid_but_is_not" \
+#         "$sig_ssl_valid_but_is_not"; do
+#    echo "$i" | $GPG --dearmor >x
+#    $GPG --verify <x 2>/dev/null || error "valid is invalid"
+#done
+
+for i in sig_1ls1ls_valid sig_ls_valid \
+         sig_1lsls_invalid sig_lsls_invalid \
+         sig_lss_invalid sig_slsl_invalid ; do
+    eval "(IFS=; echo \"\$$i\")" | ./gpg_dearmor >x
+    $GPG --verify <x 2>/dev/null && error "invalid is valid ($i)"
+    linefeed
+done
+
+
+resume_error
\ No newline at end of file
diff --git a/checks/options b/checks/options
new file mode 100644 (file)
index 0000000..7060a66
--- /dev/null
@@ -0,0 +1,5 @@
+no-greeting
+no-secmem-warning
+no-permission-warning
+batch
+no-auto-check-trustdb
diff --git a/checks/plain-1-pgp.asc b/checks/plain-1-pgp.asc
new file mode 100644 (file)
index 0000000..9a83dcf
--- /dev/null
@@ -0,0 +1,27 @@
+This is an encrypted version of plain-1 for the PGP test key
+0xCB879DE9 using 3DES.
+
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.3.5-cvs (GNU/Linux)
+
+hM4DW3oC8MuHnekQAv0U6qlDAA64QS/oZJErr1J77m5Dh7IFen3mAcwOxvL/POqS
+HQWTFcuFT4LH9asSWgRe6DebJGfscMjMqNPAkhEJtKQQ2jEesn2Bon6SMwah7vkD
+9Zap7WKHRlnB/Da1/xQC/ispXY7e5tuejnzoNSAOWFpBn354nvkKGaCfMRNuz3R2
+HljH+gXKRa00n2dPmvX9Mr8AI0Q+FoEI2/YW+6aUxmv8b0c2dP6HcL6HUu0Ro2Nl
+RJNPfYXP20EL/Xrv8LN0Ksnp3YKTWrz5gQKNr3DH5pn1PjFqAKz4JD6rQBpnlh1c
+03gLB1OAJWA6+/QNaEQV451GBZW3ul10R/6621/kk0Isdxn/htlD4Jl/jAvFdlQW
+ULBu1HorZZ5X/IMuMRFwSQkx+H8i0zq+LGr8+rLFVTRuXBrgpeTLWs/f35DDblPp
+jtPGSs1qql98PfOV1tAr16rGRLAAyNWEgi3yZWUGgq5dfFnRbJX1hrj9waQmq1g0
+mn1oB9Ig708xSZqcfFVFNpvIB7nmbFF/WaMnqfL3XmgTe8whKB/f/XYhg+W2d57h
+EmTcAlC1N6IHY8/7YqtnjitavTIUsi0hPldX0tvrjsaZ7ppSma2epRJhx47jIFjw
+wXOEByZE+K3pyTSN8KJxParDsqrTWFrL0t8az9W8lWG7YYsxUxk9cwRo5PyEko1M
+kAKrbDMb+02Iw35yeuxFY33dl7KqpaWy43ksX/ROxX4S0InQywaQejXyt5A1cJN1
+t+G0aKdRp40MDKtOkZfFGlUSFZIhB0dxKVfSKJE/SIeYZzROTuyCNe/2wwufxgpa
+uztUf5ipVnINupiztWGw5c5Wp40ptQ/0K4/35KrZhMoFGR9DtImAPpZocuiFdJDt
+uqqapxGfJ876S4hFjRAkHSNRsAySul9zFLnIJ+Smk5xsvQZK4yjDwZfSs9b7WPKg
+7NCxl5bF5dIbWRYdRBNjHQ4m3LyYmqKzQqALSYT54/9O35B7rb1fOB2SFIuME0QI
+5XQq9QsH/f5rW8U6Ixzw1582B8fO1TMRhCqMyXozmsBJoWdCIQTQiVNyrbgLi+ss
+wKiKq4AymLXFMSpI4TOCc+rKiAdMpLbNO8Ndox5hZEGz+mqg84cgC/rkJc/P03KR
+uo0+rb5eSfJw9t+uzBXDmFHynayj0CB8wW9iwXknpdlHDo1z
+=7Otr
+-----END PGP MESSAGE-----
diff --git a/checks/plain-1.asc b/checks/plain-1.asc
new file mode 100644 (file)
index 0000000..f62fb15
--- /dev/null
@@ -0,0 +1,26 @@
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.3.5-cvs (GNU/Linux)
+
+hQEOA6urKKJHvid1EAQA0MchGc7vZsjUgxdII4lo/2jRDesMmLDN4U0uOgExvyhD
+u1OtQBJF8iHgNdDEf8/R3GWhRE94IpVwLqzKTqfVmyKIFd80/Qe4h37TUPpEf8Ex
+f7WaIBk/9OSDNKOkCwZ5OH9xGaorhBwYiTNJlEEGv5zcDte9ZoLO7WhWFfHp3b0E
+AJYk/tf3oV4sJSn8AbUa8UC2tAdpNM1Lx+UEuCtxevYRpWeDVDok7/xuaa/wcb39
+lKyhUV+FBUH++k59K4GVqykOz02hmFl97O+4bAldgP6cVTm0Gh7jwMcJANzhLW/O
+MR5birB+HPKOotMIfhggzxsAt6ESrviIlknkGqwKXWog0ukB/npOqQdu1GmvJqoC
+k6ElA6xZPY5HTF/JLKlLXFfIIKLeuyckKwGDkVNFE7JYPW+dfxcGH9z1KXaNNllY
+V4OKGQh3+gMaoJSY2X7PsmjC4fvi3g6rr360ATr5f82Mr8GPa3x21XLdIFZ04vTe
+yE3kwdcarkiT1QQLnOXk/yRBxJwiA5loL9crVdC2WyOV3B3DG33/yas8krw4BYWw
+DzAgxNtZR4MQXcj83WwoflMo43dYUq3Pk7ZnzKN04O8m9w0gxVxCpXu4ds9emMdJ
+WS4eNTPUOnzeWttkfYcd3SarK6COi9iBosFT2QF80FwDSlH3XdEo7rD1j6WJ5GeX
+RbHDvIm9g0xB23S7jmtfdqIHndvPKLmwW2B1VC1mbjcDUo6pyUb31GBd1zFVhT69
+ijhiEwBlr8uWxROdwJd/7IVIB/RYHLr5P3M8p08hdEdS1IMQbNEE4Y25fRdcc6g8
+fVEAExbG01K1EJhRLxoHzgnAkxDTV2HSwlqbFvKEzUfE+rMHApmSX2lfMvKgueYz
+JpA7nxuf79Wk17bjNvuVQwokhXpzw7FyPPdD7h4Z30LW0ozvSVgs2tigWCAysIKB
+3ZIolchqBoj0ddJgbPXrx09r1oCckEmdj1KtZsci9m+CFA8d22uxXBec0HkEHZpr
+EHlqEZfNTmqowoDtJ8KT+S8VPsALEyDnrqm3s4i44OwgvsPiKOST1xwk6lIJ5isu
+fO76RHTQ2jc8z7+sKyNffVugfjYVRj54/8Gj34QkrVo/42rlvg398tpbAbWuNq8w
+PM//M6eVD4IRDYEGrGOk7prd9mgdbWnOWpasirhr41kePu2vsrIUkJWHmOgdMQDH
+cSSzI8C5NpafROHAhMsUymcJ5dKksvPubh5IAdgtH+m6yDnNUJT8s6WV1f1RpSsQ
+L/n3dhti76l0XtfZ7aST8j46B1JPNDx8+r6Xl9IUbSU=
+=xK46
+-----END PGP MESSAGE-----
diff --git a/checks/plain-1o.asc b/checks/plain-1o.asc
new file mode 100644 (file)
index 0000000..973b293
--- /dev/null
@@ -0,0 +1,28 @@
+-----BEGIN PGP ARMORED FILE-----
+Version: GNUPG v0.3.4 (GNU/Linux)
+Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/
+Comment: Use "gpgm --dearmor" for unpacking
+
+PCEtLSBEaWVzIGlzdCBTZWl0ZSAzLCBkb3J0IGlzdCBrZWluZSBTZWl0ZW56YWhsIGFuZ2Vn
+ZWJlbiwKICAgICBvYmVuIHJlY2h0cyBpc3Qgd2llZGVyIGRlciBTdGVtcGVsIHZvbiBtZWlu
+ZW0gT3BhIHp1IGZpbmRlbiAtLT4KCjxzZWN0MT5OYW1lIDxxPkdyb98tQmFydGxvZmY8Lz4K
+CjxwPgpEZXIgTmFtZSA8cS9CYXJ0bG9mZi8gaXN0IHNjaHdlciB6dSBkZXV0ZW4uIE1hbiBo
+YXQgdmllbGUgTXV0bWHfdW5nZW4KYW5nZXN0ZWxsdCwgdm9uIGRlbmVuIG1hbiBhYmVyIGJp
+c2xhbmcga2VpbmUgZWluemlnZSBhbHMgdW5iZWRpbmd0CnJpY2h0aWcgZXJrbORyZW4ga2Fu
+bi4KPGZvbnRpbmZvIHJlbT0ibWl0IExlZXJ6ZWljaGVuIGdlc2NocmllYmVuIj5Vcmt1bmRs
+aWNoPC8+IHdpcmQgZGFzCkRvcmYgYmlzIHp1ciBSZWZvcm1hdGlvbiBzdGV0cyA8cS9CYXJ0
+b3JmLyAoYW5ubyAxMjUzKSB1bmQKPHEvQmFyZG9yZi8gKDEzMDYsIDEzMTgsIDEzMjksIDE0
+MjkpIGdlbmFubnQgdW5kIGRhc18gc293b2hsIEtsZWluLQp3aWUgR3Jv32JhcnRsb2ZmLiBF
+cnN0IDE1ODYgaW0gQmlzY2hvZnNzdGVpbmVyIEp1cmlzZGlrdGlvbmFsYnVjaApoZWnfdCB1
+bnNlciBEb3JmIDxxL0JhcnR0ZWxvZmYvIHVuZCBzbyBhdWNoIGluIGRlciDkbHRlc3RlbiBu
+b2NoCnZvcmhhbmRlbmVuIEtpcmNoZW5yZWNobnVuZyB2b20gSmFocmUgMTY1MS4gTkFjaCBk
+ZW0gSmFocmUgMTcwMCB3aXJkCmluIGRlbiBVcmt1bmRlbiBiZWdvbm5lbiwgZGVuIHZvbGxl
+biBOYW1lbiA8cS9Hcm/fLUJhcnRsb2ZmLyB1bmQKPHEvS2xlaW4tQmFydGxvZmYvIHp1IHNj
+aHJlaWJlbi4KLS0tLS0tLS0tLS0tLS0tLSBbd2VnZW4gZGFzaGVkIGVzY2FwZWQgdGV4dF0K
+PHA+Ck5pbW10IG1hbiBhbiwgZGHfIGRpZSB1cmt1bmRsaWNoZSwg5Gx0ZXN0ZSBCZXplaWNo
+bnVuZyBCYXJ0b3JmIGRpZQp1cnNwcvxuZ2xpY2hlIGlzdCB1bmQgbmljaHQgZGllIG11bmRh
+cnRsaWNoZSBCYXJ0bG9mZiwgc28ga/ZubnRlIGRlcgpOYW1lIGd1dCBnZWRldXRldCB3ZXJk
+ZW4gYWxzIERvcmYgYW4gZGVyIDxxL0JvcmRlLyBvZGVyIGFtIFJhbmRlCm9kZXIgYW4gZGVy
+IEdyZW56ZSBlbnR3ZWRlciBkZXMgV2FsZGVzCg==
+=m1k/
+-----END PGP ARMORED FILE-----
diff --git a/checks/plain-2.asc b/checks/plain-2.asc
new file mode 100644 (file)
index 0000000..5a774a6
--- /dev/null
@@ -0,0 +1,31 @@
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.3.5-cvs (GNU/Linux)
+
+hQEOA6urKKJHvid1EAP/aYXFOkxPzbBB0SWtyX+yyvZso8i1WJS3pzrHNXcXQSQx
+xOAfmlCiuXYrjEzlyDAn7k7RLAhUB/ffI58HnbkQ7btWujrHig/V1tQ0j5igR85M
+3y2/msWu2c2pyeZnx29LzeoJ2aMVTbMObszlG+TNOuhCNn4unvbShrkFjNK5fi8E
+AIHiavE77ZPfcaUrXp6FJ6OuhbnJQ8y8CVpH++ddgU6xXK1vByMSsYqiOjfq08gV
+MzqT1eMVvKhSjl3R6Ktl7j+ErYM4KuIofIZsKc8M3JnoTSrLqWSEBq+DEiaSI58i
+SMJfzxfKA84bpJyLIjp4bjRIXveYoX8UjEnSNr3xuDIq0ukBoVe6Bx8lBActcwE+
+kE7EffSBHUmnm8cvwZan+Ms8t9p9aQEzBxV/LfEXZyk36lK35zCH188iJR+tt9zs
+rNubkRuOjq9jAcBtrvgjTTO91Ru7z4RCYeMfnX9AauJZFShBNYN46GTIwqMWE9vq
+B/IYFH9/L2nufcrDQ6u5WxJo0y2FoPqVS4RKEZ4FlKnlT2Op0X1k9w+1nWTtKwQx
+fPsB+YRSKmVbZOXDeKAIVEyGHgR1Hj6pbo/IeHSJ2DJt5OFu6eLQYjxYjM7BPjPD
+Gn+lTUvqw5ykYpCcnvpEx25+qHh5HI11Hi0sLKzvB92hhsQ7+lU2D+iAzsMJKdwE
+u2bCnrZokzZwDBy6NISQ+hoc6NPPezQM4FLN0BB752fa9DYMQo5nEGfPUM7fv51A
+nUdGOmaDVWY54GQxiYzl0JAT41sQSYlVHcWBCGNAm064y+tsHVjDYcf5uze/3Iuw
+m/IbRGLBT7x+j2OqMX30yXoeHCg0/M/2c6vIzhdHEsJjTbTr+M4bMii/mB5kSo/7
+x5R14Lr0mwnPNDFHG2egqd5uL8985+5BENm7q0pQHKGM5NxkjVSWCpzRgKcSEq5A
+x4Q2HbhEJNP6ZonnZkDmGM52Eq62eaR7t8+k9px35osfiTiClmVrjsTgl5Kvatk0
+oL1aYEwp8OtavoSwidUTk+Xb+cEE09P5bnCFs5Js0e5wdo+/izJ6iBuF+PndTh4i
+4ppFmt8/GZ63MKBJu4CZE7QJMVAcmmCrsGRONP2JVgmyaBjrIl5xk9FPXQVY0AJx
+gl3/jO/QFHYs+dlrQ3aqg8Mm0eZyLmZEYjoNibD8PW0keYiVfTF7EGl4jS2sAboc
+AOzbuABa+30vIjJRWeW5UdTcLyNK7B2qWk6dqpRn9ps3cwCWUiTIcIRgot4PY+3M
+8BL4smyZIP1Fmz/woL7gSVIaJHMExHjYPyRlfo+6Vfy3hh3zdiB9e5xA8QRFKgUb
+Px5ShU5bBykfvFBJjgKU1XLBKqdklaudf3+v8F3LPIyuO6vTYzOIU9UKAHy9CrA2
+kAZ8kgHBTtAjmKuJjASBCZHPepq0G9SaRDQI5g4DXx0LXPX3y5xkwVI6kd0QmsMF
+UU4ij/xjzIPN/AxBgQI8HKk56FnaX0JKoHm7mqWa+1TzbuvJjio4J/IN9XXzVqb1
+YL+mkx607hdW9oJltXLO5eio0pb12v/0YXAQlsrlJJNPCUW5hYFv/vH1rHzR98xx
+nx4PXElm8VUuhKDxdVi9Ipo8fL9Amu3PwYonzOck3R2W4wwlmcopVQQ=
+=Ng8B
+-----END PGP MESSAGE-----
diff --git a/checks/plain-2o.asc b/checks/plain-2o.asc
new file mode 100644 (file)
index 0000000..562e5f0
--- /dev/null
@@ -0,0 +1,36 @@
+-----BEGIN PGP ARMORED FILE-----
+Version: GNUPG v0.3.4 (GNU/Linux)
+Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/
+Comment: Use "gpgm --dearmor" for unpacking
+
+Cgo8c2VjdD5Wb3J3b3J0CjxwPgpEZXIgV2VydCBlaW5lciBPcnRzY2hyb25payBpc3Qgb2Zm
+ZW5iYXIgdW5kIGJlZGFyZiBrZWluZXIgRXL2cnRlcnVuZy4KTWl0IEF1c2JydWNoIGRlcyBX
+ZWx0a3JpZWdlc18sIGlubWl0dGVuIGRlciBnZXdhbHRpZ2VuIEdlc2NoZWhuaXNzZSwgZvxo
+bHRlCmRlciBLbGVydXNfIHVuc2VyZXNfIEVpY2hzX2ZlbGRlc18gZGFzXyBtZWhyIHdpZSBm
+cvxoZXIgdW5kIHNvCmVyc3Rhcmt0ZSBkYXNfIFN0cmViZW4sIGVpbmUgc29sY2hlIE9ydHNf
+Z2VzY2hpY2h0ZSB6dSBzY2FoZmZlbiwgdW0KdW5zZXJlbiBOYWNoa29tbWVuIHp1IGJlcmlj
+aHRlbiwgd2FzXyBhdWNoIGRpZSBrbGVpbnN0ZW4gRPZyZmVyIGluCmRlciBncm/fZW4gWmVp
+dCBnZWxlaXN0ZXQsIGVybGVidCB1bmQgZXJsaXR0ZW4gaGFiZW4uCjxwPgpVbmQgc28gYmVn
+YW5uIGF1Y2ggaWNoIGltIERlemVtYmVyIDE5MTQsIGRlbiA/Pz8/Pz8/Pz8KU3RvZmYsIHdv
+IGltbWVyIGljaCBpaG4gYXVjaCBudXIgc28gc3DkcmxpY2ggZmluZGVuIGtvbm50ZSwgenUK
+c2FtbWVsbiwgaWNoIGJlZnJhZ3RlIHp1buRjaHN0IGVtc2lnIGRpZSDkbHRlc3RlbiBMZXV0
+ZSwKZHVyY2hmb3JzY2h0ZSBzb2Rhbm4gZGFzIGdhbnplIFBmYXJyYXJjaGl2LCBkYXMgU2No
+dWx6ZW5hcmNoaXYKYmVpZGVyIFBmYXJyZPZyZmVyLCBkYXMgS29tbWlzc2FyaWF0c19hcmNo
+aXYgenUgSGVpbGlnZW5zdGFkdCwKZW5kbGljaCBhdWNoIDE5MTYgZGFzIFN0YWF0c19hcmNo
+aXYgenUgTWFnZGVidXJnLiBTZWxic3R2ZXJzdORuZGxpY2gKYXJiZWl0ZXRlIGljaCBhdWNo
+IGRpZSBlaW5zY2hs5GdpZ2UgTGl0ZXJhdHVyIGR1cmNoLiBHYXIgdmllbGUgWmVpdAp1bmQg
+TfxoZSBoYXQgZXNfIGdla29zdGV0IHVtIG5hY2ggbWVociBhbHMgOCBKYWhyZW4gZGllIE9y
+dHNjaHJvbmlrIHZvbgpHcm/fYmFydGxvZmYgdW5kIHZvbSBGaWxpYWxkb3JmIFdpbGJpY2gg
+Z2Vzb25kZXJ0IHp1IHNjaGFmZmVuLgo8cCB2c3BhY2U9IjJleCI+CjxiZj5Hcm/fYmFydGxv
+ZmYsPC8+IGRlbiAyMy4gTeRyeiAxOTIzLgo8cCB2c3BhY2U9IjNleCIgYWxpZ249cmlnaHQ+
+CjxiZi9OaWtvbGF1cyBH9nJpbmcsLyBQZmFycmVyLgo8L3A+Cgo8IS0tIEhpZXIgZm9sZ3Qg
+ZWluIFN0ZW1wZWwgdm9uIG1laW5lbSBPcGE6CgkgIFJ1ZC4gS29jaAogICAgIEdyb99iYXJ0
+bG9mZi9FaWNoc2ZlbGQKCUFuZ2VyIDE2MQotLT4KPCEtLSBGSVhNRTogaGllciBrb21tdCBl
+aW5lbiBaaWVybGluaWUgLS0+Cgo8cCB2c3BhY2U9ZmlsbD4gPCEtLSBEZXIgUmVzdCBrYW0g
+YW0gRW5kZSBkZXIgU2VpdGUgLS0+CjxwIGFsaWduPWNlbnRlcj4gTGl0ZXJhdHVyOiA8L3A+
+CjEpIEpvaC4gV29sZjogUG9saXRpc2NoZSBHZXNjaGljaHRlIGRlcyBFaWNoc2YuIEf2dHQu
+IDE3OTIgdW5kCkz2ZmZsZXIgMTkyMS4gMikgSy4gR2VzY2hpY2h0ZSwgV29sZiAxODE2IEf2
+dHQuICAzKSBLbmllYjogR2VzY2guCmRlciBSZWYuIHUuIEdlZ2VucmVmPz8/Cgo8IS0tIEZJ
+WE1FOiBEZXIgUmVzdCBmZWhsdCBub2NoIC0tPgoKCgoKCgoKCjwvc2VjdD4K
+=9nnj
+-----END PGP ARMORED FILE-----
diff --git a/checks/plain-3.asc b/checks/plain-3.asc
new file mode 100644 (file)
index 0000000..b2206ae
--- /dev/null
@@ -0,0 +1,13 @@
+-----BEGIN PGP MESSAGE-----
+Version: GnuPG v1.3.5-cvs (GNU/Linux)
+
+hQEOA6urKKJHvid1EAQAreXx68NPUPpiNhqRyM//Y97N8hX5iAWq3WxXTa8D6Hy9
+81Jy2wI4IeDhHIoWuXMIX2oVL//V1+LyLkrF/tutBVvqct0TUDUWqb4Ydpfk2l5j
+FfSybWW1fS4D1e0KVB3Lfj2Y4cCoT/+zyq7jUKQE++qNefPBzeaRWY4qeI6xXF8E
+AMj01HPe0ZwIBWqiIYv91Q7rGzEZm0ROPilgSQjUvCdsNQGhZpFGTl6uMSU0lmp8
+SD2EKv3xGeo2nMPy/Xp4JoYAMW+fjJh+wM6uT84nJgCVaeWyR7HAfF1U4rzqz7DF
+amPozuwuZiyjoo/wB1irZSl90t5Oa69oMesZtGMvwBN10mMBM0TotT4gjgviv5uY
+kLjD7DM79xy0drptNypmcVcjnDunM6bSEhTyq/fahdaULTYcwSOTXVMyesNpmLCb
+ziayleyuSaXPxIqWTgSfkab/W2FGWZvbexYaSaWXmDqsyzs81o0=
+=JDKF
+-----END PGP MESSAGE-----
diff --git a/checks/plain-3o.asc b/checks/plain-3o.asc
new file mode 100644 (file)
index 0000000..409b9c2
--- /dev/null
@@ -0,0 +1,10 @@
+Stored by G10, because diff/patch have problems with
+files not having a trailing LF - and this one has none.
+
+-----BEGIN PGP ARMORED FILE-----
+Version: G10 v0.2.6a (Linux)
+Comment: This is an alpha version!
+
+RGllcyBpc3QgZWluZSBlaW5mYWNoZSBaZWlsZSBvaG5lIExGIGFtIEVuZGUu
+=ZQ6m
+-----END PGP ARMORED FILE-----
diff --git a/checks/pubdemo.asc b/checks/pubdemo.asc
new file mode 100644 (file)
index 0000000..d550f1a
--- /dev/null
@@ -0,0 +1,566 @@
+26 demo keys:
+
+pub  1024D/68697734 1999-03-08 Alpha Test (demo key) <alpha@example.net>
+uid                            Alice (demo key)
+uid                            Alfa Test (demo key) <alfa@example.net>
+sub  1024g/46A871F8 1999-03-08 
+pub  1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) <charlie@example.net>
+sub  1024g/BC43DA60 1999-03-08 
+pub  1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) <echo@example.net>
+uid                            Eve (demo key)
+uid                            Echelon (demo key)
+sub  1024g/7272144D 1999-03-08 
+pub  1024D/8FC282E6 1999-03-08 Golf Test (demo key) <golf@example.net>
+sub  1024g/9DCAD354 1999-03-08 
+pub  1024D/04259677 1999-03-08 India Test (demo key) <india@example.net>
+sub  1024g/61F76C73 1999-03-08 
+pub  1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) <kilo@example.net>
+sub  1024g/9AF64D02 1999-03-08 
+pub  1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) <bravo@example.net>
+uid                            Bob (demo key)
+sub  1024g/E29BA37F 1999-03-08 
+pub  1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) <delta@example.net>
+sub  1024g/B0C45424 1999-03-08 
+pub  1024D/7372E243 1999-03-08 Foxtrot Test (demo key) <foxtrot@example.net>
+sub  1024g/EE45198E 1999-03-08 
+pub  1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) <hotel@example.net>
+sub  1024g/D622AD0A 1999-03-08 
+pub  1024D/D2699313 1999-03-08 Juliet Test (demo key) <juliet@example.net>
+sub  1024g/35F8F136 1999-03-08 
+pub  1024D/B79103F8 1999-03-08 Lima Test (demo key) <lima@example.net>
+sub  1024g/FE56350C 1999-03-08 
+pub  1024D/BE5CF886 1999-03-08 Mike Test (demo key) <mike@example.net>
+uid                            Mallory (demo key)
+sub  1024g/4F31EAE8 1999-03-08 
+pub  1024D/30CEC684 1999-03-08 November Test (demo key) <november@example.net>
+sub  1024g/8B70E472 1999-03-08 
+pub  1024D/6D9732AC 1999-03-08 Oscar Test (demo key) <oscar@example.net>
+sub  1024g/2681619F 1999-03-08 
+pub  1024D/3FF13206 1999-03-08 Papa test (demo key) <papa@example.net>
+sub  1024g/63330D9C 1999-03-08 
+pub  1024D/3C661C84 1999-03-08 Quebec Test (demo key) <quebec@example.net>
+sub  1024g/A029ACF4 1999-03-08 
+pub  1024D/777FBED3 1999-03-08 Romeo Test (demo key) <romeo@example.net>
+sub  1024g/11D102EA 1999-03-08 
+pub  1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) <sierra@example.net>
+sub  1024g/0F1B50B4 1999-03-08 
+pub  1024D/85A81F38 1999-03-08 Tango Test (demo key) <tango@example.net>
+sub  1024g/101C0402 1999-03-08 
+pub  1024D/653244D6 1999-03-08 Uniform Test (demo key) <uniform@example.net>
+sub  1024g/5522BDB9 1999-03-08 
+pub  1024D/61F04784 1999-03-08 Victor Test (demo key) <victor@example.org>
+sub  1024g/07287134 1999-03-08 
+pub  1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) <whisky@example.net>
+sub  1024g/FD6E27F6 1999-03-08 
+pub  1024D/567FB34A 1999-03-08 XRay Test (demo key) <xray@example.net>
+sub  1024g/41E408BE 1999-03-08 
+pub  1024D/4B11B25F 1999-03-08 Yankee Test (demo key) <yankee@example.net>
+sub  1024g/F7B080AD 1999-03-08 
+pub  1024D/54ACD246 1999-03-08 Zulu Test (demo key) <zulu@example.net>
+sub  1024g/A172C881 1999-03-08 
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v0.9.3 (GNU/Linux)
+Comment: For info see http://www.gnupg.org
+
+mQGiBDbjjp4RBAC2ZbFDX0wmJI8yLDYQdIiZeAuHLmfyHsqXaLGUMZtWiAvn/hNp
+ctwahmzKm5oXinHUvUkLOQ0s8rOlu15nhw4azc30rTP1LsIkn5zORNnFdgYC6RKy
+hOeim/63+/yGtdnTm49lVfaCqwsEmBCEkXaeWDGq+ie1b89J89T6n/JquwCgoQkj
+VeVGG+B/SzJ6+yifdHWQVkcD/RXDyLXX4+WHGP2aet51XlKojWGwsZmc9LPPYhwU
+/RcUO7ce1QQb0XFlUVFBhY0JQpM/ty/kNi+aGWFzigbQ+HAWZkUvA8+VIAVneN+p
++SHhGIyLTXKpAYTq46AwvllZ5Cpvf02Cp/+W1aVyA0qnBWMyeIxXmR9HOi6lxxn5
+cjajA/9VZufOXWqCXkBvz4Oy3Q5FbjQQ0/+ty8rDn8OTaiPi41FyUnEi6LO+qyBS
+09FjnZj++PkcRcXW99SNxmEJRY7MuNHt5wIvEH2jNEOJ9lszzZFBDbuwsjXHK35+
+lPbGEy69xCP26iEafysKKbRXJhE1C+tk8SnK+Gm62sivmK/5arQpQWxwaGEgVGVz
+dCAoZGVtbyBrZXkpIDxhbHBoYUBleGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOOngML
+CgMDFQMCAxYCAQIXgAAKCRAtcnzHaGl3NDl4AKCBLmRplv/8ZfSqep5IjqEAuaXv
+WwCgl6NEzT+/WewPTGcwZY+pLkycLv20EEFsaWNlIChkZW1vIGtleSmIVQQTEQIA
+FQUCNuO2qwMLCgMDFQMCAxYCAQIXgAAKCRAtcnzHaGl3NCeMAJ9MeUVrago5Jc6P
+dwdeN5OMwby37QCghW65cZTQlD1bBlIq/QM8bz9AN4G0J0FsZmEgVGVzdCAoZGVt
+byBrZXkpIDxhbGZhQGV4YW1wbGUubmV0PohVBBMRAgAVBQI247hYAwsKAwMVAwID
+FgIBAheAAAoJEC1yfMdoaXc0t8IAoJPwa6j+Vm5Vi3Nvuo8JZri4PJ/DAJ9dqbma
+JdB8FdJnHfGh1rXK3y/JcrkBDQQ2448PEAQAnI3XH1f0uyN9fZnw72zsHMw706g7
+EW29nD4UDQG4OzRZViSrUa5n39eI7QrfTO+1meVvs0y8F/PvFst5jH68rPLnGSrX
+z4sTl1T4cop1FBkquvCAKwPLy0lE7jjtCyItOSwIOo8xoTfY4JEEXmcqsbm+KHv9
+yYSF/YK4Cf7bIzcAAwcD/Rnl5jKxoucDA96pD2829TKsLFQSau+Xiy8bvOSSDdly
+ABsOkNBSaeKO3eAQEKgDM7dzjVNTnAlpQ0EQ8Y9Z8pxOWYEQYlaMrnRBC4DZ2Iad
+zEhLlIOz5BVp/jfhrr8oVVBwKZXsrz9PZLz+e4Yn+siUUvlei9boD9L2ZgSOHakP
+iEYEGBECAAYFAjbjjw8ACgkQLXJ8x2hpdzQgqQCfcDXmD8uNVdKg/C9vqI3JSndq
+knsAnRxzVeHi/iJ73OCKtvFrHbV9GogqmQGiBDbjkGcRBAC/DCQungO2iJ7j9+9q
+d2crjBU8K+AmQhs27JBkJqtAbC/xFqkHBsA1Pi8Zb6TLa/OCm2PbXFiM5x00wiEn
+VKNzuGOzU8uHB6kwWtLj8+V7VOWOkSDEtnlTF6u0y9JOvs7GwDvqOM5C3QH7La+z
+nNeAu1527Hj6l0XGSAzyvp+NkwCgnktU11VFpKSIdoplZBayN9OzT8sD/Awc/890
+fiSMWYNGo4+n6IHxhjBBM9lL+DAe1RtCEtwUSWNrGsIxFnDRkMxvMpaT4GusG+DP
+haTddrDBSyFiCLxKDBYgMbSO6wQ9g6zWEEh1ZMTMVU/akr81DOEColXn/f3Q4sRj
+xI3hu2z8tjVewAPNTuWETQ6iHHoVqdpkK4aABACfbMrnfK6TujxSs91MfKBWfYxy
+w9hjM6+VV8cJJdDXiheMKzWcrVecwgYYzukmNinO//BRmQcs1wdfi5UdfHLNFDig
+w96SdyZpHx+79ghD3NqDmzYakoRIoDKcZAIrAjgfl5if6vIiA4c1LjhSdcVTBsSy
+ic/mkk01EgztWKY0abQtQ2hhcmxpZSBUZXN0IChkZW1vIGtleSkgPGNoYXJsaWVA
+ZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjkGcDCwoDAxUDAgMWAgECF4AACgkQQT9K
+8xr9q2w+RACfX3AwFwPu5+mr/f1Sa/Wv0m9T57gAn1TBIoUErMqJehQZu73N0u93
+fqSKuQENBDbjkIIQBAChY8NSvu6sK0p4D0AVBsRz8iVXYqbRlRTZAHS4LCXwx/i8
+FmfdIXnaNLOoyi44YruSCnlZdh4YWquCx2mgywG589AzcFhahmqElNbKb7m4F//E
+GIZK0zTgW13tQwG9hTXOhYeqchnOOaDDwPEK1Gr+2o/5ANqhqrin0TFFBWLgdwAD
+BwP/R009s61X/FkUUAh8w4Tua6qndN/2GsqXsyPYjdF5E3gErK8jDcDLniOHqksw
+V17bJG81czCRE5JcVFLLWQJg9cpeoTpP+YcF+m9whtswaOJ/LPrx888i/OmluSD8
+1VP+6zBhhTUbpazfLEdt3XczpW7CNdNbyiEcgT+6Cr+W2GaIRgQYEQIABgUCNuOQ
+ggAKCRBBP0rzGv2rbLWtAJwNtSGPYjbesLSTeRwKGA5ffZiFDgCfTPC6I+XyGavj
+HJraHTgS/bSCN0OZAaIENuORzREEAIrOxkw6rRDOpbqKenlrMRYvfqoVFafTekvs
+ZW8M0GVQOBYwqn9VUfSV/H8Iy3nJsU+cU4UFXEaoHhVWgspMtjYHvxXBTD2UHmj+
+Y7+RkVnOT7x/UsPKbxjkweeleGXkeHECwwZuQhebSrtQQllqtjCx33Le013ukAs2
+SnI83cPLAKDfVb6yjfhG0Avkx83VmlFqXXH1pwQAhVhMi1T06SNYzbKAmdNBfBWr
+v9m2l5PJnUTpSWUum6ueJLHzkEM0XgVnHt+YdFuzXgUafsnqEn+2N4tI0zuJqzoi
+/9DQnEvKijZxihtYq3S3rN6UIQ2aXFHthvVtxZxocZeluYaWHPeedJlI9h9yObZn
+0mLFXFY6TUiHQYs8RNgD/0iNbequyxzEKdIdzD0Ns+3WjIVBlYl51Zdvqyo2+U+2
+70hXVdIssrsqKr1DwRlsCRSwMY+nrB0ZUOlvLaIB7qCQke3C9myu/fJoGDhMZOYA
+XsatVR0EGTdXnSuCxqNhEiqwlbZGMAcwFO+oWBSgGyjFPHTMSOw0XS42d73UNxTa
+tCdFY2hvIFRlc3QgKGRlbW8ga2V5KSA8ZWNob0BleGFtcGxlLm5ldD6IVQQTEQIA
+FQUCNuOkfwMLCgMDFQMCAxYCAQIXgAAKCRAxjB+u+u9tG2cDAKCzaFoiAm79QSmY
+ISeiM7XMKhoHDACaA8CU1j8+20C7rNipOHYz3KfUMhe0DkV2ZSAoZGVtbyBrZXkp
+iFUEExECABUFAjbjuAADCwoDAxUDAgMWAgECF4AACgkQMYwfrvrvbRsg3QCeOMf0
+g3znbc8IBiTrIPUgUz9p3WoAoJ6eRZTZk7z+hTyx4JDceReQbYlGtBJFY2hlbG9u
+IChkZW1vIGtleSmIVQQTEQIAFQUCNuO4HwMLCgMDFQMCAxYCAQIXgAAKCRAxjB+u
++u9tG16mAJ46lQbmtWRZUldQtp4ZnOptP7ZJtQCfceYMZfMAnqUKJiHk2tMhvwDv
+Ah25AQ0ENuOR/xAEALSl7SaNEf8mYovea5tJNEwoZx3vv6XymyXga1wDqKo2PeDr
+nRDbHGBb5BvWIv1J6Igk/wq4R+Pq989UpkcqREB+yOeluE3zPPtZBrbLySSaqiMe
+gYiHnAAPc0TqjH7UPZa+fJKZTUk64BCUQN9ELkL2FKtAGQ7RNQJYvbCq4O/XAAMF
+BACXdO4a3ZIK5hJejhHZ01mkHa6Sqoc6PuedNC7tlWiLU62BljGiv/DvzcbMsnvk
+991AxJ3pP4ZvKr5CClqIG+WZa1zmtwXdmCfGJb2fbNSVD4zp16e5slPr8Cp+fvIv
+2/SyvwruROs+oAzSVvoMAzAGSk3yj5nT5oikbn+M62fC5IhGBBgRAgAGBQI245H/
+AAoJEDGMH676720bj5AAnRH+1me1/iHDnS5ltXysOdl24/BMAKCPThApQ7lJe8LY
+r61+lXUUwr1TKZkBogQ245LREQQAubUOd0B7cFzJHF5vo5NwiMZ1JXPjyNqL2OWE
+/XfaeJiB55oMmVEPmK1JF69wU7ZBpo1l4PEIWcP7WRMqvBEFl+8LnelRkSW95kwF
+r3D8TRnarZy3kfiBF1t33dnkVTaZYxCDKOBdZ/ZiRvLa6gZ/KHhITfzaS7h36G2M
+bAlGlj8AoKQPFsEPjByKYdx72m5/2Ju/4d4jA/oCNAKaJH7N8Y3HLis1ShhpytJP
+1yC9GJjtec3ugzYSC7RKV3NJcBeCX4om3KhiDSN6YYVICf4wdqz6TAocoqPzR2t7
+Fz6+upxIgh5WGnnCs2e7uO1eXUCSXONfiDEDzRKGTQjkdvwFo+880DkiGln/qmRr
+cILA568dwNnOrBio5QP/dbkpUBhqGDr2LchpkoYyQlqzbvUpXJ1xlfZim1jfrmdf
+sk83dE3iBzvmT8ByIZcMoqDEHil95LmJp3qw1yVeApP/ZWR+0XiBLEF9GhcAOc5i
+hH2ACSXLWiRXpyMmK2/erTvTX3QkAcqoQ1cFWCwNNCrlgycB84Hdm5GXdajp7cC0
+J0dvbGYgVGVzdCAoZGVtbyBrZXkpIDxnb2xmQGV4YW1wbGUubmV0PohVBBMRAgAV
+BQI245LRAwsKAwMVAwIDFgIBAheAAAoJEBaEEKSPwoLmIuMAn222gK7ibwOXzIKd
+/gZP09JC/3+eAKCOelaqqYqNNbku0gA84+O7d1kMqrkBDQQ245L8EAQAtsGp/UnA
+1y4AqjewlkkTOQevLwtzwm3pmLLjl2Y3TfGn8Ni0h8Wd27kV32MUZyTaNaZuDxpD
+EO2aUIpGWVQmWvlqCFV2F0Z2AI8R4bx1tC2kD758hUvR+S2hn9lK7E1lQPuvec2L
+Eml+uvVxW/Vm4iDBgeMlIlz70MFC9LUnfpMAAwUD/At7Clo7D4dNk43BMvhQ8VgJ
++INy37Dj8PHX2sCZZ/tIfSwNIU3m2ygSVreTlDKo406v6Qmefs/m9dH9lsBE/8QL
+40Ek3SY6xV/QzTVN44QgnpRKWpfaMbGzWJVXeczlNkTeIZZo/nhDm+aMucMu/e7E
+KbG64BnrQk7Lz6LSKb2xiEYEGBECAAYFAjbjkvwACgkQFoQQpI/Cgub37ACgicCk
+6XvTqEv34RXVSkhf+EcDHOMAn3krqPc5ZeSJGa7RfRcVhm5QtcvymQGiBDbjlLER
+BADIbiZFRBlqCMOCXTECdpJssJDnAmpir+yfAKX4hsOVdygepdA071Ams8rApABS
+/c2+Tuaplad8w+iyQs4BKuzqeQK/YWj0DDqyY2LM7qJbvFd6nC/GOGjiEucTTSgY
+8IOFScBTTks7alMGjHAdWzSjq+1ppWJeTSzp04UKhV1/0wCguOIaUr/cMVahSuoi
+K4Tdot+CR10EAKunWycnUG2IaGYqO3sCfpChzktWdTjUn9ESJAjKK1QUC89f5+Kr
+MPITdUPypf++9MumBkJi+8R0GVJ8zwhwKfX9CHhrD0kfO68pCDxZyW+dDzOr/tFX
+0nuH9pL8oiEMkikaGLph+N+N1Ip8thh+vdLhNUr3EPRlrcAfv+WtOpbyA/9+kpa7
+x8nIn2SofJisj+PjKS3lAoGPe0eOoK/sVBvgVjy3Gc3d8vMG29r+2WRIpGwuhuLG
+NlQYX65BHV1MK/TjYvFnpoRSqtTK3GpRzTmkJIC8RlXxtfYf/n66VLB3EoTOzWHY
+29JMCJnnjPMoaMc2YSK10Bo8P/27nF0CKo8XEbQpSW5kaWEgVGVzdCAoZGVtbyBr
+ZXkpIDxpbmRpYUBleGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOUsQMLCgMDFQMCAxYC
+AQIXgAAKCRAf6PxvBCWWd1pYAKCVZ7DfK+i/YZGyEu18DnWq0ixligCghGwDoMGg
+LnenSjyShMZ+1Ecekia5AQ0ENuOVEhAEAIMMgk/e8lsV/KEkd4/jNK4yFj5iy/Fa
+on800I3GUzETuQA2AT3getR+GuV4pbZWE/80b9hnNW50UJGiP1+SXfVtY5vT8p/g
+NFwn5d0O/pq3bpgFRJmoawTzx8SFDwCVPHEcwOHE2j5LvfrvRBOyKU32tr976ri+
+Uowt0+92LuA7AAMFA/0Yo9dDqhjR2UoNcYfEZwWhRHaaJenP3z3QbzjJkASb5H84
+xCTEpv0dqEtVTJUoIo8Lh5VjbiCwok4QPLVSbQFeHqTKb7N96PjevkZ1Co6OrLCN
+OcPRvXxgCwSGbuuLMkQJEutnXLu0DOKquY94KXXh79La7lTgjReE/1Wzbgc1+ohG
+BBgRAgAGBQI245USAAoJEB/o/G8EJZZ3CXgAoI5oimsZs8ZKmLb5sPB4AZzngCyz
+AJ9og9spt3EYXAB95XmfzqgJBRv04ZkBogQ245UlEQQAnKdAaILozJ04V6Z+FIwQ
+EY/aF4EFrJJIc+uewF7ukZl/7uUZqSxqmzZjbqigyMFGybJSMa6TpwN0BKG5CJe0
+4R/mVCIRsz1Jx5YXezN3UFsNVNE36R8l8dxWG+wgj2m60gu4VlodcpVMc/kRiSUg
+KUfg/xmPnRe3SJZSlG2lBm8AoNc/r5DW86om3MHWK8AoyhvVXhWvA/wOcjx6gfTT
+KftzpQBhOF0U0fC3npQC6bvjLjTBhQjC3WX5rfwJqMmrudRbEO1sFqzTOQPtb9xa
+tMeVqTcOi6+x2zfXes4nTfi9Lgq1z8HhE/LnktwxZxyPeOXqXu9N023IyQTv7mC5
+9C1xMZk4POOv9WZUGz4C85s2/9iTJCfkMwP+MRW0S9mHmisruCY6TDVFc12KIFMI
+PSmWav6gW6bCAA+wIHfmcSyR6MHiLV2gtJ0vQuqgyWfeTiaxPof07dg9pZsV7Hk1
+ZUhEmloeOcfZmwtHkRhWGEbEsd89IWMDJlwNJ7Y9JZ3QvK7vB42bQVvyhdFQdEXH
+0slvlvsgKtCcaOa0J0tpbG8gVGVzdCAoZGVtbyBrZXkpIDxraWxvQGV4YW1wbGUu
+bmV0PohVBBMRAgAVBQI245UlAwsKAwMVAwIDFgIBAheAAAoJEK0bD61DwtDH1RIA
+n1kxWuxGwCS1+i7Fp1cFzzZCHycLAJwJq+RG7ux9sQEmop2V2mKdjBZmkrkBDQQ2
+45VIEAQAuZli0/vYbs6h1HhF9HbvRHFMePjQ99Sk8h/dTx7PI7eSqMHXYh0PZghc
+hlbrMSPnemxfwMbJrmdK9WN0Wh9BJUe2ycH8ftUcGRo5CdESgiceziF6Vg4PQz9F
+lxtEhvrl7q8R6y7O+j03QAJKUGwBdt540oZ8YYKiDvgZUZxnoecAAwcD/1b2fYzA
+nuWrQZXhXQQ4cNVxMBVFKHScH24oFVbuEWLgM/tdgF+CPw2Vtzba8ySR1K80VSgs
+Qfs6n2wyCVd+II8lKHTZT/pfICFcPJlHKs4ge+JNn1IcxBAiq0QRNW5hGTO9KdJ8
+MFWrWn2Bbp5k32roAzuCagoielFo4MVFZTsNiEYEGBECAAYFAjbjlUgACgkQrRsP
+rUPC0MeO/QCfaGt8NeCm0zbssmOrXZ6v9zFk8xEAnj3SpjLTyqemniHSJ9KEzIKJ
+CdiDmQGiBDbjouIRBACKncc4Ueec7dWaVARy2SmNVufeSenYs4AsIPP0v59jEl7J
+I0rb+4JbIJoAzW/hcm26GS/UbbpQwig8/PgMUV5QfBST4CEOlf7/x2a4HKk9tDV4
+An7q2aNr1beW+twxfUGWWV5I0o1b/iKVk/LiQRiaMr8pJXY266m6/2Pn9LmDtwCg
++Iqfx8gsK2PZCWv87uEKAOLzHXsD/1eRxLqCt1hT98gdDLykRTlI3kMq6EK3I+z/
+8pDIMDuPIJq1eM68YdFZr8s7i1ye1QpDltPYHgWnUC733ujAKANdyybm3HrA3TSB
+jEAhNfcu8nkrVorvASQUDCLJatWRWJTUVrPH+GXIXMA/Oi6LDsgNDOJanwzzvDCC
+m8hWQqW9A/4xYAZ4NVFrQq8gtQPJWuMIfSFSvpZWNgQgYZntiXSUGYOVs28T/87R
+oRx02tsVDw2PA8z68q/XRuM9NdetxbUXQHB9eszFLi3W1idsXhd/C4SyiTgEFXG8
+Y8s94Eadgk1PAYHN6Gd3SY7jmevqYGVLmBp7qfj5Y9XSM5SE0Th+fLQpQnJhdm8g
+VGVzdCAoZGVtbyBrZXkpIDxicmF2b0BleGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOi
+4gMLCgMDFQMCAxYCAQIXgAAKCRD+GAsdqeOwsvruAJ4iU4M5s1xsZiXa0wLnX4FB
+Bl9abgCfflNpwyEp6KEhKCPWwPRG9WJc0qi0DkJvYiAoZGVtbyBrZXkpiFUEExEC
+ABUFAjbjtzsDCwoDAxUDAgMWAgECF4AACgkQ/hgLHanjsLIa4QCgityK8zajBOqA
+N0ZZTq8fOzgiEYIAn1ZEfjX+jefZUuY+4zFzrpO/fX0OuQENBDbjowcQBACVSdXx
+UWlz81FjqHgR4b1EtmhmW89CmpsHfKlSwlYvBtbB/y7TFIfvAr4ZFbpuqew6Jvtj
+IEZoXvolTWwHVPEFkuG0LAa03olaYpzC6ZBDuLkb09RukCD4zdY6xwbAMRsOzZgv
+597LZXtOLLLnmOyTpsjRDLztWsuNglm5rffOTwADBwP/SyVZvFEdEVn5/dQTp7eA
+tXdrbZEM379ctCJ2663RbTZd55lIBev1fTnKQkvDTY2e58yIQ4E+Nzr99qg9Cyf6
+e3OhErTUqEBOhusBge4/7E5LrIVMvo6AFU9qgn0Sgsnu/ww2txVw3XEjqL8Hgl+4
+Q/57YRvJOe+q29Ye9LL8eaiIRgQYEQIABgUCNuOjBwAKCRD+GAsdqeOwsjK5AJ9p
+ek7H6yt3ZHAJ+7nn7sGmxYxb5ACg1INFN4AMzqEUjbZ51KTVdAvyKlSZAaIENuOj
+hxEEAN5nO1c81jCmgh/oF+p6kiZmqFV3ape5kEmcS/BoWgCXt6vjaldctmFYi7v+
+BY4N9zI3GxQqAxt5D6dY7aN1xlC236CZEAaXUXktvGw/ppHDjdbs8CRuZiA9jm1j
+92GAUY/mm6hX2aGKOkVwr9yN6DrA2CaO4SwK/wEXkVfj+nazAKDCaBzHzwSkkXf8
+QOtOTj/xevpnzwQAv30laCeXTDZM2I/1Pdzma1V1xizfae0kfzZOJBDQtHQDvNFj
+mu6iM1kL0uxOG3krr0AlqSsMD8W7mavbFigUlxbhvuul4pTL/BiJ946FhjlPY0Ni
+9pmdAldno7yUYsWADEKadkQ3ghEVqEqz+ACYbzp3p8K+5KuiFJm9D4uyvToEAIVP
+i2N+4voxnRWGwKXF4E+fLYAzXT5sMMzl46Xk4Ms303F/5JG7kB0iiPPY6oP0l3nl
+ahulRcbNMj7SDbfrfoi4m4ftUYIX3acXCSN0gNuVGipg8CwlGQyILgWRFp6oXQOm
+AlpxhIGcd1jdh3sj5y+CQrugGPNOJT9mzmFkB4rxtClEZWx0YSBUZXN0IChkZW1v
+IGtleSkgPGRlbHRhQGV4YW1wbGUubmV0PohVBBMRAgAVBQI246OHAwsKAwMVAwID
+FgIBAheAAAoJEOup8kDrncnmriYAoJdBwMXGVRTFlfw1u4XimCRPVFRNAJ9WFXys
+x0ugWaIaLJ3tyNZQHWoARrkBDQQ246OqEAQAj7WdaOJjzJNs2G8rvrDZvD/uaALQ
+9PtdvYAp/Drp7xMH5T62+KKTlKdO3s8IQBPiuFocJNir5st/nm8Xl+gcOZOvtr45
+c/cl54fGO1gOjBZOfgbkdBVK/LMwuQWIebK4qCZnAOlDLYNGVUguGLnEQBSfnhhk
+gh0WA0kqt7fYvpcAAwUD/3cOEqPlMdYeLnGEG4wPxtyVIchwGOv0YRW5apbz2fdO
+7otj1AFUN5WzFw0A5+WHza1OIUhg50Zco6HnwKx6F+LbZ5aOc37EAvaFgPuMxBfk
+aWYagCof3jBF0CbTWUXV/D5/dFmIeuGTuUMNsGVH+OSMW2hBN/7+aJK5LLHL+hzp
+iEYEGBECAAYFAjbjo6oACgkQ66nyQOudyeZzTQCgmr4mT/wPN2ppg5x75E3cXn6q
+B28An2hO/hgIPkf/rSSydA72ZZc/MWM6mQGiBDbjpSYRBADdWzld1lyDWDqGPSzG
+OsehXyTSa0pOfVTLckpJpDpErcn8jS8cKrXkVUowI7SlZhPRmYI+5pqGaG5FZ5VJ
+d1TfKWihc7O+JDHoK3yamOnh6OFQFPZUF1+WlAGiFXLc+WODzbgOSMy/8yXA6n0z
+e+v3et5n9Kzib3sDGjw5DMmiYwCgmUwnofqskHVv1S6tDg08mXALKKMEAIVGyf9i
+j3BzNb0fVYGUOLU07nqQ3RpNQPaKtPQpBobRknQ/ZSdzuiALcCB+Q664f1cKGA+O
+gtm0L/f1xUmKRW3rT9lzMtcCy6kcudCI2OHm/gOcPzKqjj5onpD84fgR4BdbsehT
+8+urmxFiK/bFFI6eC1L5edBQcRLs7TF2jY3SBACdXy9yHg6iDTJhysvR7UuLWE/1
+s9ysirhZgPb0vyIFwHfRzM96AYIPpLZr/jvkrDawTxYGfGIZrj7UyGePu7RCeFRV
+VX55B6evNv3fAqbmwQ1GHTX7WHCNdAkP07yTxZ/wnZudPAzQwRkEfZ39TdccbOhH
+fHvbv3RNQ0VxbWtQUrQtRm94dHJvdCBUZXN0IChkZW1vIGtleSkgPGZveHRyb3RA
+ZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjpSYDCwoDAxUDAgMWAgECF4AACgkQ1L9X
+83Ny4kN3LQCfZhlov9Ux6LofeSt5g2hVijDdX0gAnRc7adixQ2hpprv4vNoKvmum
+F/D4uQENBDbjpVAQBADfVCPYwZ59MKgXTH4P71QzFnpG4E/MjqDNfW3NxQ9ZjLfw
+0ir6U1gGDuEsWRR+fS5OwCbfeHZDzPj8MZPuOZBamgiDvI1OvrrzUv+BijkWGEL6
+oRFnWI8zJ8zDAPuuvP1u2FQZOoKFXaHo2I9Q8zuJz8P2vEkgJfLx2yiPR1Dp2wAD
+BQP/SCCKZBNQIaY0cfKmiv8ZjRcAAvhXLyMCwLQUfVRqoNVOtMMfWpYtGdL27ESw
+4kgZIsxJ3ELQVkRiriMKbsJiNM4dMe+9gNuGz1CG9b2vhUPZ59sREVIRgyIfr0BJ
+AsYOn87mQ5lOBA6+XmjHO+ys4xpEVJZyfrq5QAw5GYcrPWCIRgQYEQIABgUCNuOl
+UAAKCRDUv1fzc3LiQ475AKCVZupUbMXq9yw03M34RS9YT9MzKQCfUgFd+Fn89xqU
+4Owg/MQzYlLreUmZAaIENuOl2hEEAKeOL2pIdZ+zQtehxdL9l/uDBFSTuN9rLb8D
+gLiw8Z9j8U5CEH/M38WzH1nHKKlZKjGVZYiyhRfAG83wvHnT83lq+Ad0lgaZTR4z
+6nrd5ViOlHPlfqo4RPZPzPe+uF7EfDl792sJerXGAasLosmKnxKAyJyVjh7eZcjT
+S/hUhO9zAKDVyLHJ/gQlMYk8vE5XYL7Pw4d28wP/VsKVkjlxsXpcrCQIoKeDXgKN
+Vv9L+0Pebspzr2WOah8iBN1QOkbtexIKCbb9mmviEnJU0FFx5MIw4mipvY4EpCaH
+3McGwJpCzWmdzID8Z6oISUyKsuP7PXjmASbogV6Iqy2m/2RDtfbIlbwotfbiOT9T
+r3IPbH+tHAZByMRyvxID/RN90WOPSpODxr9AH9btmeJD0BfNt99116+qdwvWrTof
+cbkBgzvB34vLLDaMKVIyinxz2lYyC7aSpA3uzjZvoPvPrQJFLE0dx7DSkUTtWbQG
+ByRabpyrXYdKZzsFXLb+LSTWwF3sQLax0C4cYT7OLPlxjDVq/A0jgztaZVWa37IY
+tClIb3RlbCBUZXN0IChkZW1vIGtleSkgPGhvdGVsQGV4YW1wbGUubmV0PohVBBMR
+AgAVBQI246XaAwsKAwMVAwIDFgIBAheAAAoJEBPbllU0xuPx7NQAoMhUK7d8mW1F
+45Qpwtpbn/EdSuqNAJ94+GVY6GrtMbA8yrZHeD8zSAedrrkBDQQ246YdEAQAzpO6
+UuCWWpP9up5GVhLPoSCBfSIA9JWm5Ap6/hjQ5hia7CcS8E41PjaGl6Pkh5lj2qkS
+UBa892SXyQMYqMqEq/h7+BW7+n62SCRMtYOHRYZPA4hvs0d7jznGQlMsltx7qamo
+VNP0XF+ws1wHLjyQl3qMnkrAQ8lAJP+jg7P5Hq8AAwcD/A61qQLRXsSFr7LMBnaU
+SR0o6+4/HCdh8t+mnAeQBDAkne5DTPiwqzqsjoYekX6JK7wk+mbsJTd/Zw55Jkq9
+xVm6nEUo/JIbN7cPlMqfCLaoS+ttbxZ9fNCO3WTNdWxAr/mGZZiBfy9yTcxUfo5q
+Tg0ffWy40CNHaVKk+iIcktGziEYEGBECAAYFAjbjph0ACgkQE9uWVTTG4/EmaACf
+U+XRhr/UgvgCfMlOthY327vlI30AoJypWeGLup2DqouZIGkY8bmpDrz9mQGiBDbj
+p/8RBACXrm5v2sQpLtexfA2S8a2PUruCeqXYfVsnkYX1sYJaFaYHxYW2wDL1dR4L
+dZuty5YWBOxu1N9dnkjuPsdIbq6R/phy6xv5sDUihP4YBAZakV5ahd7XrBdkWXSk
+RzaJSfH1OG2hAXR87liVu8ck8RDeS+ipx1vnZY45864IAnFzqwCg2qjnDRjGAn2O
+SPsnhyZH44VQQpcD/A7SOu9gTt6Jl4VSMY2JGi3HOFPOHnevG3Pb8NYbcP4gEU63
+iqrHGndYJI07lKcFlZRbnSEOSFPFLuNKax88GYKKeZDoQXkVoU/ItAGrS4rCExpZ
++Jx2tBL2zJcWU+7NDmM5LeRUDE6a0N3sIxMLzz3Z2PTarMATjpA01Qj3WRlcA/48
+g1+gnyFXbO+UZn21WWj4uCyXUE6/G8SCZhXXiDJOYxaBrmw2rtN0x1aLwXPRXLuw
+jhL5Ewn3qszCzaJPNYuLaMY7jiK2ha20LCqYYmaVJa6tGy9iFIGC80ItcUYZpCfm
+dw7W2oqdZIN/rblScCKmyBbw/gCB3molmLBd8nrseLQrSnVsaWV0IFRlc3QgKGRl
+bW8ga2V5KSA8anVsaWV0QGV4YW1wbGUubmV0PohVBBMRAgAVBQI246f/AwsKAwMV
+AwIDFgIBAheAAAoJEAyCDHHSaZMTQPYAoKRB8Ey3Ny6TaKaGoL2GNFQEwM1MAJ0W
+blK0ScSKbm1BN+2hfDmmKRkgvbkBDQQ246gqEAQAkdlSJYfTiZH/CkfV8tnhI6ID
+z+SgiZKcneEBnO+hAJottARGAojdbURlOIeZqRCgKpdTXBK7MdHAz4RKFnAAXPDB
+ZgA5q+Coqn580t/O/AKGb8kKn9n52z9lC8A5KnHaRAsOKVyPTIU5vq6FLmsWmMB5
+5iz826Dk9kMhV7mmdQcABA0EAI8Jq3Jnqf0HqqaX7CZuNKHJgag14bTaBw0niZK0
+KSB6FBpzitEoyst5JBPCl0ayQEw0Hn4jhZAqcZybI//pC1CNQBBO47VUi0y1UVjE
+xtaNmmWxugzkzWHHx4WmyWsCQwGN4B9riUws4g3dgC007l+aonKzj5QEo1XiiMNT
+FFmPiEYEGBECAAYFAjbjqCoACgkQDIIMcdJpkxOPrgCgvrCZO/Txjq3F6U9vxdQq
+lrLDgXIAnid5WPrZkh91f3gM+QXTQfmq9V4RmQGiBDbjqN0RBADBWmbmmByw+u1J
+TAixxj5NXRXQJ9zLtkxRQ1GHxLQPyQzojWWnD4kEme8yvsFXuulbPX8zZMnl6qcC
+8wt+b5E8dCtZuvQL3vS51yGe9M76VRC/1HgriE0YqHMTYJT4J+HciftldHFid+jR
+nGZpLwVtLxiLaWAm6SBi82FTn4lVGwCgtjc3u/SMsPgylPRyN/QeH8/OZ5MD/R2y
+G/c+ZF4kWcgmlzjJxQUN2wGYeDoOWUMXS8mf6yF+DLtwxo6oOlLaLHVTR6+qH2Vh
+z1zaqk1Ir6FJjkuUGvHbVFt2BmvL26StTjJ4zC4UFSWYP3qLvfbPThT+RoD4ea+V
+cPxGEGeqs0umImJ6s0reS3KJS9vgHtGo11Is4nP1A/9EzV7QkX5EuEnlUpGV2q29
+aGYx3RpcOhDYixogNHuW+K9KwcluBEEBmT74NwxVzI6qdJVVZn5lxT4IC5G0z/ki
+df1Rkgv8Eqj5DIikgnp0asB8FiHSsb+39d4cnk2V0ez/LmknXUl2mpKpk/fb+qXW
+TqPDbFUE8dz8zyqRFXIjwbQnTGltYSBUZXN0IChkZW1vIGtleSkgPGxpbWFAZXhh
+bXBsZS5uZXQ+iFUEExECABUFAjbjqN0DCwoDAxUDAgMWAgECF4AACgkQN8q1H7eR
+A/iKXACgkZY9/w96yK2Oiq/MUs/A74SzJ2MAniQ2eSHT5CQ4G8PPvYfPZueNI9PT
+uQENBDbjqPUQBACn8JyfkTPFcgaWMpUpnk+nTEkDe4GhAG9fO7alTgdT6+aDCdfX
+fXfH7gGwdURvDv6V/KEqcMPRNLAgAeP/F4T6OtoJNTxfWLB7j14DJNpYXjBPJPN1
+kpD2at8GcWB1aVGMsAtxMwlo4TZlqyfzCAAQeCLhBbIE9LWKX5oUTqiLOwADBgP9
+Gm8md+/xWp9sLE5i3uZ4t9Muu9w+UY3Ke/WcSA2CNthEYhHNtcMPP6PBwtz0x425
+mC1pe9RuxDyzRfV0/q+rjdWZBNA+VTVNDHXSj5hifvem3KFvA6TIgMabJ/q4WE7T
+4Hn8xjQpEsLGjSXAzG9WRg13qTzTilIk+rC6xYGbZHSIRgQYEQIABgUCNuOo9QAK
+CRA3yrUft5ED+P5vAJ9dQMc2nMpcKuH28xwKl8r7MP3pygCfWHGKFHWIDkUt8RfH
+AB9geauEQSKZAaIENuOqZBEEAKLUF5GqBMWJQtBs1t1Sp+NIOGuMLgJOhINbMU6t
+k2jzeUt6ooNd+c8P0TexsbSETwhrU4ntpvIISb7I8Twhcled7bi5KCABJOzz7Fw+
+Ydxo5Yjm1DQH7+gEtPx3n4AjZUfRAN0nqcFizDpRYPqVaN1QYiGWn9yPF3pubQhV
+n8zzAKCpx1LUlQl2e5t1YJhmom2qy38EeQP+IB45FBfDf5KKtyS64alQ0vHYIssU
+p806PQorw/ZOuoiscUQj/WeZ4vn7rCdu60uR1EuHpGp7n0t7igEgAOcxDjrxJmpg
+SdD79V+oJAFLATo2msj1IklVvJeI7ZsImyPchIU1lqn/GvpAam9N+FiIB1KUMFqT
+Jzc6zUn1Qqag1w0EAIiRHPYRW8ojd9Uh4Ed3X0daAnClyMWL82t2bj/bJRmhupQn
+4aVJ5D0pFB9izTiJEWciHpqiMdsi/zExYYIDS1Zu94+WFbNIxyMFfHrJ5fUQtAqL
+b7E5LrlxZONUnrRwshqR4X2TmW2mz1Wop542eUQ1UWp4Gr3VlH6giswY0CnQtCdN
+aWtlIFRlc3QgKGRlbW8ga2V5KSA8bWlrZUBleGFtcGxlLm5ldD6IVQQTEQIAFQUC
+NuOqZAMLCgMDFQMCAxYCAQIXgAAKCRC+eUhSvlz4hvEjAJsEfDLAxH49s9lf0nql
+F4tcflpr/wCeJKCP6iVwvhGIdCu+Dbvf6z8/sI60Ek1hbGxvcnkgKGRlbW8ga2V5
+KYhVBBMRAgAVBQI247e3AwsKAwMVAwIDFgIBAheAAAoJEL55SFK+XPiGmdUAoKhr
+c+z524neflMpRwJ+NG8KVxOxAJsFZqm7bBtYllrdcTqNqMk49LfBObkBDQQ246p+
+EAQApnvWjY5rMvw9Ly8xFL49pGjAYFb9zFijvgG4tMirI3T9EBLflKLJ8m4KWoRo
+T2eNmy/JGLHyZjveaVh8TerDV+uxZkEGvv702nz8NOElQTjHWHoy0n6poci6Fxhf
+Jd1bnOjDK2mZEufEQNSn2PhA46gjCLRTAPuwLpitSSL5ubsAAwYD/ij9KRO69/Jx
+3+W9DZQxWIQBiKnYHVr1us2WpdpTV4jpCqJOCOgB/hlBmCY1C1/tpsAj1A3ZZamJ
+RWVZoNokkReItZLXfGacprGbmmjcg89gFM5V3nEUNCU/mm2BQWp58h4NOCv60dGr
+5GAqHDxAStPk388zbxEdyFs57CPQ4ZJtiEYEGBECAAYFAjbjqn4ACgkQvnlIUr5c
++IaRMgCfdcoqwoaTU7rNH0BWaYUfCrQ6TnIAniN+yQaBbwZHMbSaDTBRndjLglsK
+mQGiBDbjquMRBACteKaHZ7pcM7Quj8Ec8Sx0fJ3u0NdLso5xn9Ek4FWMLBu6jw7b
+/5KjB2WtXOZSWKHOzeTfUAx79NMKJrD9jZW/0kEAFVeZpwZF1l8fBsRELR9cxAaj
+E3RvFkgCYAhXsF1Jno+qiU5TNvadGU4SzmP4vOnnjrIWTy83mtZiwoFIcwCggaaa
+ClE8Q41NyIfVtjS3f+Nm8x0D/icH9uwM3vpB2QV29IIBqazgaFr7vBoogFoAllaC
+QbPLiyHX1Mk3kEZg5xewmDS/tU4rGqj7UcL9OlZx1ICD8cp80yNYfoI7K5XM6sYO
+MmfJORGOEsqMtoYbo3lluDgDkg26DZNynUeFHZRrIWz2cKqTuaB3dw09m8sJNus3
+poEtA/9Q1KDsjKPi8+2kUzJoK3V61QglXAVDlfzK6B5KOEZ6GR/gX9M5uyyLjREy
+bFSSNPlvLR11+mV4GR5AcrVQOmE0QpFyo1Mr+uDsbqwkzERvRq1r5pOyqM5WPXhl
+Xa5oo4na1fBEX76IEzK6xIVG07GnNnaY+dlPgsLq4I8+A20ZG7QvTm92ZW1iZXIg
+VGVzdCAoZGVtbyBrZXkpIDxub3ZlbWJlckBleGFtcGxlLm5ldD6IVQQTEQIAFQUC
+NuOq4wMLCgMDFQMCAxYCAQIXgAAKCRAlsA/UMM7GhJjYAJ49ENMfPwK1U1ESEYQS
+5Yts3SRcAgCdG65G3ZW0dnhnjQAhf/vk+EteMfK5AQ0ENuOrHBAEAOGceVg3PC6F
+tgrZrnofohzWnui6FVBzeai1DZ5MMKmdN6/QMv1eeHoMOb33fbfhwA51n+kPuhap
+r6QqTzx62RGA/gK1m7vjU2OfYxSO65GN/rSUXN/kE83jR7Hux4MocRXZ+/8ngqL7
+JAjw1LZdJyOniJpeRvrckPNC/bKaua77AAMFA/95VjAjJIAU/gOMwtbqTgV+cmHe
+52Aa1CJEalV88yKG86nnqHuL4xxUTTZljyjbbKleJD/Ah7R1BxBhSEDy8WuTuonE
+VHVxTcL9Yig4pZ/OzYZf5fkl1eLNaSLb8XZMT0JbP02b//OMpAr29lcaga1o1RtW
+vrlUyIYOTm2RcTxkf4hGBBgRAgAGBQI246scAAoJECWwD9QwzsaEIOcAnjt0vZDn
+9+3cTNpCuV1ZKIu2t410AJ0Y3CnFBUFBOKk6zkOJnaArwVN3ZZkBogQ246tbEQQA
+lWieyQhDso2ZnD2wb+gq6aqk1rRUhcwdBwCTbiE1aLAsnuMl8nLH4fvhaTz2V/Ae
+joL00e28duA5or9JiBfmVblrpTAIGWsu0AU6uEQsWgZwRdso3NH/KfH8Z5lxwJtk
+Z/hlAiEHohmGoD38mJNsgnm63RXadUH76irO6McvWlcAoONeH7i25AcrMol4O7BZ
+wqGq25ibA/9IRhK7AFhfgaRrDTz84PaIssxp1dWKalRruMJYGQK2LDuEl53Q+d1r
+nYBPliPbjWr/9Gkjx3K4B0CfWWQC0sUl77bNRFqr8FXkjRZcvkCoxxHG7PIFG77r
+Ld2SiQ+eS+dp5QijuuMC8skkvQuuxS6eIk0g+jjGlNhjuu97Ya6xeQP/Zxek37p8
+P1u9TTmN7nPtlzGXGrfKVi9DtJ31E805ruXFqTuoFfcOBRrtfY+DOebX8RxIwQV/
+TEmyxwoXdmkv03EYwD6AJSmx3WuVi5/revcH9nfSEHDy7sFC8CBp4aavAFRQNrho
+mSB9lSm5clGLZiD4nljF1EFABwQFch7HhlO0KU9zY2FyIFRlc3QgKGRlbW8ga2V5
+KSA8b3NjYXJAZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjq1sDCwoDAxUDAgMWAgEC
+F4AACgkQX2NWum2XMqywLwCbBT6UT+lNWMh/jxFu/m5Dy2qMwpMAmwePBu7USi6T
+WKaXYRSL2yywJR0HuQENBDbjq44QBACdC1XRPM9CMFrgVUvioU7SShffLnjgWBZ3
+hqbOYrsgtXfuQdv6lAixnNPdnk/k4mjL8w1pqbjUmfmbppVDxzsiiUQlJatzGDfU
+1gDc7ksnXpF/vzghbucy8HNO0SHi3uM/GXC574iZ1oxa/A14fKnCVYT1ThqUa1us
+C5YQXHm4IwADBQP/f4LZgN3dbL4jLqXHDNpAIEjiTbKXxDKHOnAof//4SE0mpaNV
+HLu3nxI57CtXfSI2kMQSm/3pqpTKzaBlM/CbMAJUanhmlLPARDcJ/hQcDtBsF5nF
+G7zfLfe0SBwgsM1HxL968Vva7WsbYpSa98+3HSDuy9VwphFp7i4HbnCbSK6IRgQY
+EQIABgUCNuOrjgAKCRBfY1a6bZcyrA3hAJ0erCoxKtpc184iLkp5kpXQakDGHgCe
+K2WXA5gTOULftladXZn8tNoXM6CZAaIENuOsQxEEAIQRmJhsJniNi/bRff/YGrZ9
+aFWt81G93W8WhV51qq+ntUHgUNY55Yyos4XLOa2tS+K8zP6X15FesVBPYIQa5BIC
+10mAsLfJ+1rbnGJPuNBA2U2MoEaRxo/JtXQ//5jiTRlYwLDRnBzuaMCPdsirveu+
+JBw53ytRwjwe7m/D1PPvAKCp2dj1FtDjubTN7kCF0o2KzPwE0wP7BimQxXyPwSzG
+qLaHXSEBsh84OQTxPI98BXgq0195/A1B1/pPs356euKlqoefUTHYhbjiMYbjZT+A
+6juudf7A2Ucy03G8HDZ4k1f1vmzrj24+6ygGBcxTVr0BaweiC1DwG3LjQoJ1cuFx
+RQ8BYJDGIwPrUW5JdlnzW2bJWfdyXOoD/0S7iEVN9txkSKildOeP1YcDCD8MM3hv
+F9kUc+1hbmir8SOZ/IYJAyQN+j+mYWsLuKtZ/F9pqiBNTXH2jWCTqldOD/ZYxHVJ
+AARnkiVG6yckMLsxHi2LPPBK8xack0y92mKe7za/7fhVgCRSs7M/rzUbzUhyInHS
+yxr2SYb+8lbutCdQYXBhIHRlc3QgKGRlbW8ga2V5KSA8cGFwYUBleGFtcGxlLm5l
+dD6IVQQTEQIAFQUCNuOsQwMLCgMDFQMCAxYCAQIXgAAKCRBdFeAdP/EyBgb6AJsE
+NGQmK4nUrwcbtZ7+av5GDQ2T4wCfYJaV2rBtTR9aWTRQfZOQoIkNF8+5AQ0ENuOs
+cRAEAN5hO+fEhqW2pX71oSUqW/TRHWSbybNc5brQ1tzgTbheHiG/LQJ1lHjtZoZQ
+syW3H/efEuNARwryo4IjvK0nmiQsqZUR1795XTIbo/waPN08QujC26uWbL1pYL5y
+QarwbKOoyAst4jgE1NpZVc/r1+WUp7NuEapicVjvFNzkiVCLAAMGBACWQJYr+h0o
+zr7JQ/BqI8vTKuVXb+DIBQjuSzN7LvaiIqMqb9ZdfNNmZ1Atvklo2Ce2VMyliQzV
+STZuHJQbfrDTBXBf+Q+AINiHdZEAodzBvDv6p7vsTnoP+A2bS8l6xrWObKt3Ky9+
+GUDkqW3WuagcUKogQgEb/FKec+GegwSgUYhGBBgRAgAGBQI246xxAAoJEF0V4B0/
+8TIGk4cAn1I/jmu7FSgglh9aPmVYAw7HWQMAAJ9PAPPXfqtwza6I8ttGPLYNvEAm
+AZkBogQ246zREQQAgcIj/Eo8PrIhEaxKcjc9dNb9/0BZ3BxBk7x9a7HKm6o0/vcf
+LH2XFjFxB4Ddfe+O1PC9KNUqIi6GTafGbyqS47XsnOJs5nvsrgmVpUUzAd7p0dxc
+c2tJodwhkH4GtOP4i4P9XBrxngQrWQ0ju333EPF6wLWi7qkVyGENCfsvktMAoKYg
+M+XYh9UQe7/HX0GiCnk3ExVnA/4ryBxdyBihj02i6s8vAe5mlTrwv85ugouSB95X
+EX8GPfvaWIW/TpUWQ6a7o8YzU/kIPa7YzETYX8e/FVr2Zd33HAfeLUNp3OS0NvEb
+YJlGDfW7/X7qLVv1o5WCjCHUhK8DCf9Ax9b4z7CbRHptxSE4U79NCCOsXQsObV28
+qlGsFQP+IIaCh7dTqADw/nBmfuXxepPKXS6Xdi0to79LfQtr+TUtJOEVGIbqqQBs
+gESFiT5qR0W7qhOnl47TIQyPQnt/V994QwyAGtIgtM5qYFRW70g1FkyDRX57PzTM
+uU2BjVI6mHkaUkLaLujbRXiQFm8IXJ4rf297GppKuSgvNcr7Rmq0K1F1ZWJlYyBU
+ZXN0IChkZW1vIGtleSkgPHF1ZWJlY0BleGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOs
+0QMLCgMDFQMCAxYCAQIXgAAKCRAcZ+wTPGYchNG4AJ98zSyvQ3Rt+Y+AVfawyEoo
+sFG5KwCgmMyj4RYhRlXKWCPORBxAfCOYMtW5AQ0ENuOs5BAEAJGi4T/jrY5BtRTM
+0psAneQytzzFgH4+LigUXAAb0QDAOkyGNfWHrfHJIS7A3Nc9pMWAdOjWgSKbYyrz
+ra0SQ75/SkI5+/S5ev2Fpki+HYo7cNgVXnbCJrIY7k4DAMunqPJ9JCUXc88WxGvK
+V5b45htqCPnV2Pgq+AEIKD5aGfLjAAMFA/9+O6ttUbeY2bQHRdThl4HUxQw4lgYN
+7stgGZsbHCc0y6ln1HF9vlE4Tl6HI/NR/8OauQrXt8988dh039QNZsOdAeRWTk4P
+gSuXq6VDG5WNw6B9bvRPKXe5yeVmNNl6KESBzMcq87kANZWZ68vKJ2JihxPHRAyf
+xwGr2JKkVF0S+YhGBBgRAgAGBQI246zkAAoJEBxn7BM8ZhyEiJcAoJTy/pFHvd9y
+xAYZBYp7qLG2lUIOAJ9Rlpbjou3wb81vE+Qev1+GQGpaVZkBogQ24644EQQAlNDo
+1aAt9iof3VI1z3TehyLrBIR4XmKRSM2Bx02CZhQRIwY/QsK6WBoxlJqfgUtsBUuf
+cztjJaUBixq5qPmBgXYqN9/B8HZvG2nknHdiqKrvqFpAqATJtlccW0tzPJKtKaTb
+tkORBDv6hssFa1aXwTN7IjN5nLI1Wh8lsvk9SKsAoP5Z4IDSK/mM9h6FPRsAsAYv
+d99ZA/40UwQLl06u7wBtmxqSdF/86kjC0kWX8J2Y9vIceiNEiE9MmVNcYIKwIM0m
+wduF50EksVjEdgWUJrqT3RztJfMT5+Sgm2KOAvvfmbKa8RF4NPSrVXDDrFeqk6uN
+DT0jnUUTQFYTjk4Pxg9Kl+a/c7Qee6qXn5qeDX8ubZqN0noX0QP/Y5HSgi62UbBP
+5B+e5BqE+ZLeJ7yVtl909NwTCr7KVZt1o3Za0dCYtMosPT9ObAjCanhSnuEWa3hu
+outOgorWaUSEW6Y3zBKvN/M4FA7+1Rhe86gnnWLt+rHqX5M8Y/7JTcrugNtR04DF
+sYga5A16CLsTDxSmM2Rgvpwh14FtrqG0KVJvbWVvIFRlc3QgKGRlbW8ga2V5KSA8
+cm9tZW9AZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjrjgDCwoDAxUDAgMWAgECF4AA
+CgkQO9vtsXd/vtOr4ACgllMIBb4leDKz61LQiA4TGWQp9+QAn0gF7rrvXtHdEc9k
+FQxgfASZH4RZuQENBDbjrmYQBACJ5res4tXRZj36s7P4KZWUf0YC8mtLxxeNEXe5
+ckAtn8gMfcSQJ4Mei4O1EBvrKZ9Dz28Emv0FmDd66DUd4ybRIk1PN8kWry9UuGLA
+f/VBAkMIyXhYCEnB7wRsNj4kF5DhYiytep2wekPocZO2GAUoIyY2yMNb2m2g2K8U
+nK2QBwADBQP+Ixih3o+++i02Xwi4wOe7aro2xSeBmH9b8nEaJ8v8RVLRO0AgoR4G
+LzKeTOfv57FU48tlY7sxth6FOxeJaQkS1nD1LRpb3GUDZr7qM/yOGYp0WhdRgGW+
+c0eYa32g5ajq2zn3+H1L4yrmRSZM4nmZ5ZXe9ijkGs0UNYqmi0gBYxqIRgQYEQIA
+BgUCNuOuZgAKCRA72+2xd3++00nRAKCX6f3/mVnEreWCgorUdZh8hg1LEgCg7FUW
+Ctn3HWOwgOwxxKzOs/rQm+CZAaIENuOvBBEEAMUtk4AJiXP3jaKpIhbi3B73S2SZ
+67rKzBkicjelpwWk6LndsCrbLsIWsDf8fNtih0r9As+2arfApkNlwuCGq1ZlPGGG
+Ef18OqPxFvnghVEbDdcosP4bIm3k6G2sgFbMl68xAGnTtkS5Gfz43uTuznPzdZnG
+bIjP0uBmPfZk6GW7AKDhi4htuxr3Y+ud9lx1bWM9KqUtAwQAiRYHm605RZVBkdzl
+fYx1Iwgn/l8Chq3MsPrfBMslapBnq1an2/nEQPmuIde9C6ALN1t03DHpKonx2Xgj
+YVz8pgty2FU7txSSm2EE+975dXp3ov4TfD1KxksOl770PAzixLfNhPW1q4A2cEru
+GgO74qEX3/fAa1J0nRKDgmA/mgYD/2TSZKCaFHoc3IHQnkygmGzzZNpVZV2+1kIB
+8Z2hNo9V81PYpzlYV8SlG51ajW1G3ePcti7JOIP6MquNUbYR4TOzZy1Dq4+VqqZC
+B6fOeIKL40IKKAoMMDYFNLp9zcT+s6+6DTPH27eE1WEt+NQjBgr2ofC/4iAU/nmA
+Ymo4xn7YtCtTaWVycmEgVGVzdCAoZGVtbyBrZXkpIDxzaWVycmFAZXhhbXBsZS5u
+ZXQ+iFUEExECABUFAjbjrwQDCwoDAxUDAgMWAgECF4AACgkQpeZ/f6OuPqGvfwCg
+oevUn2afCdW1bLwbcRs5kYrM1GwAn04Y4r15A7ytYdO2PaxSkSJ4gn5NuQENBDbj
+r4AQBAC4cckdPiWgQNkGvAm3q8FxzRLog68/jffvj8Mvt++XQ4NikO0VJ8ezYkVd
++vG3v5RoHTISynmMWZZjT56aFDSDZPOkQs2G0qZgAEgTpzCUBdlnUC8ZrHSTSQjC
+n7HtR2cpYCCUBliPtatDvS3Me1XdRfBhXib04TB0ci6DrzFQkwADBQQAje0R1INm
+9GkZKAzTECi+lVei7wbXkn4JF6n9r1KL5oULVF8aGHNEJ1Twj7kuq2kacYjc/Di4
+KdESRTZN9szlZnNruvAd9JKHIgbeysene3yRhy+YFaqXm1MtWCdwwaDiDoHDASpl
+55RtuCKxz6uW77qhrZ8E6GRDrhI92R88DbmIRgQYEQIABgUCNuOvgAAKCRCl5n9/
+o64+oWsJAJ0XijmoDUP1Iu6lhsSlmGOiNO/l4QCff5G6w6Vkq8d86Ev2IwS9Wf4u
+NmaZAaIENuOwChEEAJDhTfBph5G51alEDUaIfFvD0K+oXDXqDB7hDg3stVIpZR99
+d2bo/dPOuVWorwXFBDJeK0c7iJEQrMWKlxdqbRGkH8paFSnL5XWo4xMjknqnJzYu
+3gb734ioFHTC4WDM2/voTGuFpLw+eirW+wl12wusHpnNkWxMEIWt2HoGTerfAKD3
+JUBraePb8gHKnXFzyEu8RLp3swP/XaAKje+NAYeqhcAqxv2SEPUj8EMgtX7SDkky
+Dv8wuRfcNwMAt4XwHYnnM3bpUwWj2JcDGE9rsNna/HuFAjz/2lrhUKncH0Cywvjh
+Ytt1t92j0cPZaeR3pY8R/bm8Ns20tiP7uxVlj+szI2Pf5KiUHhiWHJ2RTXGE2pUm
+T6UFhc0D/juyZvINKwkbUSSwpKvsoi15d6e4Wx5PZ2mArT5y+ULitBx4WKIsXV6U
+VVaEBNaBe63k9cFGdPEba/HflSd76kLmcSdy+Fr73d3TMIrmwAKMVdKjRAEc3l87
+YaPd2/LdT+TWzCQw33EotexJ7yZzZA2SJx27/jyIgXkWtwvn5UCMtClUYW5nbyBU
+ZXN0IChkZW1vIGtleSkgPHRhbmdvQGV4YW1wbGUubmV0PohVBBMRAgAVBQI247AK
+AwsKAwMVAwIDFgIBAheAAAoJEFjLmkyFqB84JOIAni+c3CDhA3k2Pp2CWgBSFcsT
+A59CAJ4gy1+t/Pwk/095y1T6g3rwRbE0zbkBDQQ247CeEAQAnr0w2OcvlUX7E8u2
+C8dJGIj7wRU5qDazxh0tw55/ybJ3/KyhCFfsr2dZ2E7Zw6Yvc1u3WTTf82nH4S+/
+IJFSI+qBi3TrcwVtt8Xa3Po7cIzNvS0bBhqfmOOXJc4ihUlADR2Jukm/QC+f6bO8
+IZBDWr/7LnT4SwEPhPoZNMFb63sAAwYEAJ2kiP3e1zM+zEo2i2jkOny1Igyn0sRi
+uw0OXQ9B656zp02G5qtDN+IXhgLdfQqgqyWckP4BLDJ4NtQoEM/Mr2/7oj3h01Xp
+bU86R1QFQOXmoWw3q7yqEWIwfOBqClSF0A14sXdjQwadyabTFsW4m8Zn5jLW+1sH
+4PrVjHoNEz4CiEYEGBECAAYFAjbjsJ4ACgkQWMuaTIWoHzgImwCfYJ4NGyH/snAB
+xoxryuVciL3Cyu8AoMtIZ222A8al4XK0DrQqJAnIZlF+mQGiBDbjsakRBADettZo
+8gTOTr1nJXbk5sJfuVSQaMmbgLpZpMs3Q7C+gAX0XX+Q/vcuHp+wV2Nq0S4v+w5K
++sxDF4A8UDf+q+GmNKMA5U27hkcDQvE48EYUghcdWKjWeFwmmJOb0KMoatdeh4iP
+T4j8ocGw+i0z6o/e0y0OVWsUvIqp4iZP3UlnOwCggOq5GfPJMq3K3cND3nU7GOR8
+e1EEAMcgH09o68Hbjbwpw+ejPuKwVFa37COX/65FF8PONeleq7Mr3Y8yKqbLIsIW
+DaxrlflpbyMz/ShuDdNU8gh+msfwh0+RNzdEPmpJCCVJOdZO46cudgbyAQriH7Py
+sSbi7AbmpnMl7kQruhAZWXLtnH1e1kKovB43a3ph8wF4kotyA/45A8bLKEmJvpq/
+amY6VjDnGsxkDjjw2OoVbt8sLdGjpganj3fvy5KRhWeWLKhmtq44tH97m4YDmGCH
+Va/Iic4aDPMMvUPWdaY5DyCeerVOb3JN1qLC7o5x2HBt8RE7cXnPJl5VKxc4qzys
+5bqQEYYt2dP4cJqKk3OjjCbl6TJ+8bQtVW5pZm9ybSBUZXN0IChkZW1vIGtleSkg
+PHVuaWZvcm1AZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjsakDCwoDAxUDAgMWAgEC
+F4AACgkQqUwPdWUyRNYzWwCeMxscN9idLHgH2DP2U6tP0tNR0T0An3lfFgidO+z8
+ZeHXzuOM9TAS+jz6uQENBDbjscMQBAC1u+09NP46dPnn6RJtczL3LEroyrcPmHOk
+3FbiNfJ8YMnFBeST+U++chi/kKzm+N4y8TZE8sHwGqnkeIBtJX2YmQJFhKi2RR9A
+tVn2HV1ZTBYT1q/P7MpZTPMI9EODlCEPJTvX+MdtP8xh0Gsj1i1wujQOJAiXdrqs
+Pxen4Sch5wADBQP+NRROzLFq4kBUpgoTyvWzJl96Gdykf+O0AhbTlZ7ix9KtQLfx
+Grqzgo0hwDjb2QzeWHfjVhaaaSc5UWNMuIQyHRcsj9x4n25XGE0HUyOVSD46IOAj
+fZF+beXOa/NbYcR+zzORfXr1qyW2g4oV8LN4s4uV4dPamQ3l98Lkg8lhWCeIRgQY
+EQIABgUCNuOxwwAKCRCpTA91ZTJE1s6YAJ9ZgYjqQ3rScmCwhc3Ihzt2ATANbwCd
+FuVgvD2Yh8lsuiWswLDFrNsDk5WZAaIENuOzmhEEAKMDGobMDqPX3SKI3/W8m9Lm
+NgtDUffHGHNd1npnGM8mSyVfWjEWoEg2GPMEmdX3/tvUUV7nTz02IJwZRVlrbEPd
+W76eItMAY1NB43LpjQTrAR++mVAslulUY6a5V5nJKEc0IqOuxkW1LWavujX1JRvl
+BZLeBkdpsVNuaGJtwUFfAKDfqoZUCcZxnO+dRMalHLfGOn7O4QP/apMk2mc+GJwp
+KSxXBvoQkVcfuZBJmXJuUCc4BUUzHX0ZSKNbgxY/kVR1xN3krMgOCR6dEsGukIsg
+VWRDj9to/+E6IIs6YKhG7fGcXKhE8z8mf3hDLcmjbCKDCSFBT7PI5TkLzlAEP1y2
+Rtin/Sa71unGZhNyEfAPW/d1dRcRVqMD/2WcTPUaIjRvAqmbxUpenRhg/mF5rwmH
+l81VvVBbZCoZ35c0edEZKpfmyYbKuz7GhjEPz6O/UWGYZpK/7r6f4kFUrhO5atCl
+nRyBkvmNmdfbtM5hd5jh3lgqAT7tk7ntPAIh8X8/qm5+Uab63kZwXCPiSR+iEwRp
+42GbVL7F/b2rtCtWaWN0b3IgVGVzdCAoZGVtbyBrZXkpIDx2aWN0b3JAZXhhbXBs
+ZS5vcmc+iFUEExECABUFAjbjs5oDCwoDAxUDAgMWAgECF4AACgkQR69LaWHwR4TM
+SQCgwD4p9j1sDwR1+9bBrzNQzVIyzmsAoNL7pfcdW4Jou1XHNc6hv4MpsHtvuQEN
+BDbjs74QBACHkUCB29pMkveMEZyNiKImizF5NZ/cv91Rj319k3xHf0NJWhQp/1G3
+8SxLkPLBdWcoB4mJRNjDyVsxFUXvRWFIMekwL0q1sHSWTcJwCpQs+LKKtPmD3LA3
+bhbuTSdpYgmKy21SH4epubqBzk/P0193mWXzHgSGLeUoTo3N7eBQ0wADBQP8C1Q3
+WGrBZNOmFVly0erclpQRv1qCa785yx/bj9ur2LxHwVozAEXh8jmoiKZyoAz7YFnp
+29kR2qtVplH1oePNyFweZqIjtmZbiCaT4scUVZ/3LuYbxgMoUFeRoG4mnEVvUUh8
+mmZovMmZFrvp0uojcDsfYTx0VBr8waxgJrg2YguIRQQYEQIABgUCNuOzvgAKCRBH
+r0tpYfBHhFPdAKCcyVECIa28vmUPgZ2jkXQoQ/nNkQCUDpGL1aZn1eKrDlHcGyD4
+CzywnpkBogQ247Q0EQQAvVX9TJEynPJEsX3X2fGPPDiQK+oB7D1INI9bfID5NKto
+o8qybivOLo85i5m7RUiEyhX3E9lUg9buKmtIhas0sJ8sLURmCndIKtXjIWg3Kd0p
+mjE8q2zyd7ChQ3ffJ20875wNbR4GQhSO1WTuxwRoL53ft+9JTULJxkQRf71Azm8A
+oJZQYphKeLWrLtFjb2WKbYxst54tBACS7C/Vu40euIevp2TZHTtY0U+ObFvJr8jD
+rdQZMkUFSuhti7rfO/bf7qTwmCvv6IVmn905ACh9bnKwZvcR5T1yR2b6CAN267fz
+riZhu6/FG+9Ddr62ZnV2rP8Oa7uxAXCnoovaafKYupopvHV0z0tUf2+wasrQdHZT
+vc0pfY+56AP/WOVJ0KGzP6k9bYjYSRJ1MJb70wdVFiHdlIlEd5P3jQsXOyHVMrWp
+6qH10sQLto8gweWJr9aHem0QjTNSTVpzp6laBHf7tnLEwCJGeX5f5BOh87akRjwf
+h9J9zW+DBrtpqS6vjlDYU5y6RGbGRl6ndtXhV5FpE4cbLax/pGFWEq20K1doaXNr
+eSBUZXN0IChkZW1vIGtleSkgPHdoaXNreUBleGFtcGxlLm5ldD6IVQQTEQIAFQUC
+NuO0NAMLCgMDFQMCAxYCAQIXgAAKCRDe8Pe47Gfb3qJqAJ9MbluIqs8qjd1lOkj5
+8xC5K482bACgjeYJadH5StXmbJMGw2ZD29yevzO5AQ0ENuO0VhAEAM9X7EMxDw3O
+SqgnI76WuIBSsI0gF/UptzpT8g8AY6gQPVhU9fgQHbu7cr8SZFV3dyUVLTzkNq7m
+sUivd3/Fecuf77CpKBCrQlzst+UykiPQ/bT3+gq3owGi9MBCfeU2l5yZZ3yjGIqg
+8/XnxmCbuItw69FNyz7+nQoDM28ci9B3AAMFA/wJBLjxXXqWFY5JdXq7ck66Qx5Y
+HDpPH7szUKrIGKGZHxk2UXoU8G9WRfQ0VVQfaomfnKvo+bFDFJGcLfIITI8FrjzG
+oh2K3PKcxsQiQ1SsVlMT3XmuvST0yvDM8a4t9o+2v8yLLgEjR2dn/lTiGjE/ANun
+Ro9TBGpvz5P085NmzohGBBgRAgAGBQI247RWAAoJEN7w97jsZ9ve/yAAn18Lg2NX
+AdY6HW0LEurh0Xcv8zlWAJ9ePiLMYxpoW5nv4g4nuOAWoL/KLJkBogQ247TcEQQA
+rUqUbiVTMxJhp8bA4vMXAzCuLjys4A44DE+uRFb9AGsZTmw/FTPETO7iU/3frlyY
+yTgIvI2zDF1SwHXG06KF3yIu8LF6OCM0N0k7KnKpw8M2tkPiT+D8ANrHU5d178ev
+zm40PyNDyKxSGNlIG1N4MIKFtNdMlahLvu91kG04WesAoLPa5zISvsX+Ew95M1o4
+Qti8iYHbA/4wr+eYRywP35eb/F5V9bOLWhWmEDzw4KHXQ7V+OJ7JD5n44S5KLPKw
+IogohDlPmrxDTAJ/YAukApUItd30kr0Uq34QgFktAsqgCP7C5KEM1TTxU25Tcs4o
+jUHoDyMj14ECuiTCP0ZFRKUivopgjgRhFTKXVVWTySkQ0g9SDaITSgP/a0FyXMQU
+YJjuB7GA6r4U6QnIHsxS5xrQgkshb4tp2MVWMhqlhsfOLaj1WZ+oe0DxKw0O3YKT
+H/EAzmNelKcMbtTcilLaIdI5l+Ylam/bZe7QvbN2s72Kn2PZjtYqO3Uzqw14bqAJ
+Rl0ekleMdZRMMzAsour+iNVPHnlodXnQ2gy0J1hSYXkgVGVzdCAoZGVtbyBrZXkp
+IDx4cmF5QGV4YW1wbGUubmV0PohVBBMRAgAVBQI247TcAwsKAwMVAwIDFgIBAheA
+AAoJEIl5psVWf7NKt08An0PRqhiMzF+L37DyvcaVl+0zSrmbAJ0fL+8D5Frcp1m3
+YtBMpo+j5dsieLkBDQQ247UFEAQAxuGlBvqoDkxhIDgFZzdHJO+gJym94zgSGHkB
+mBIBf5Q2G2O3zkN7SIENI16yg9cxy7zkTbBu9PMgzUe/UuQov9Z6YXKzTj1jLozr
+GdljKOcW5YRvlibo7eKXDUkSvT+X6J1BOIVexl05Y4Ncmf7otNDre29QfK8gGBO/
+bdQd7L8ABAsD/R4Nq/JQav4/7d5ETuMZddPAxV4kCnY+7F7oJgHDKJheJxt49rNt
+fXSxBZUsJ9P6Xhr46fCRT33DD1P8RyUmmS3/dJl7H/qR3A1rox4FQPWAuk4WGhsf
+SXvlZnFWKJhC8TZzFisjiXjw1OFYiF4TArxj9D7d/cHEKIi43rtefpf+iEYEGBEC
+AAYFAjbjtQUACgkQiXmmxVZ/s0rskACeKGRhY+fGFtaL1JQxoHdDPRJ+wu8AmwQa
+u+u5pPZc9UrBr0UV+pGPpY+emQGiBDbjtVERBADdUAZzhP6+69VdyRrgRNotouUv
+XE6I8h0kxZFZZDrQJmpZcNWkUHDqgbYDJ9RmIeEuWZNmyzPxSFcvD9RGw9KmIZu2
+kZYqIuzg4KqOyU3SUfNycarEZYJkmLEyBlrkNxZkmPCp1cRsMKGCbhQs//v6Iq8h
+6dNA2EWgJev0y12gcwCguk0KZIqVO7UfkaVaZhMr0Cd1at8D/juKnRViDMi9SEjS
+JZwb3mw1+yECnM8vrM+AoGoAKiCz/n8N9Gf2DTsFy4yKEskPQ8s09Wc5epBFo3gN
+ruMu4kDnde0uCmiDEbTwzpdSKZO5x9yi+7b39uCNkgoDlzwonaXNdIn2NnFKjL47
+TnV/vKFdtSZgLW902vwYGTr1ArL/BACIcx9TdxsJ9NMyaKD7MEcKQeOrOqv/Mq1H
+xFPkDBI4hTZpQiId1XTxqkJ6UHDw9sR/TvtO5YKrZjINkmaBZFiHlx1oyB0B3u6X
+UVLXIc9liyFyh9aOBdQkdHgjyI8Kzk6Z0ejYcre5TY4zfplAZKkUDlY3U0Sb0a0x
+IGhgo3YRELQrWWFua2VlIFRlc3QgKGRlbW8ga2V5KSA8eWFua2VlQGV4YW1wbGUu
+bmV0PohVBBMRAgAVBQI247VRAwsKAwMVAwIDFgIBAheAAAoJEJ7vNM1LEbJfSQQA
+oJRRe9UHKHiX2iFczXq6nrvr0NhLAJ99W/I5b2/2QQ01we8i1mcSYPWj47kBDQQ2
+47VnEAQAmuK5RcS0zTyXp6SjW2+WeQIpJnJDflL0+iBe//3SADv01qUmw3jWMAux
+G+CcCApksl122V9npEHiLC4Q2A69roLRsbxKBPebustfadLJoVYqPsvjnrBlafe5
+GcrFPnKbE0wV6ZXx/Tp/eSDiQlid4lWz5J+z/mN7KhHANzoRAbsAAwYEAJO5fkCS
+dNwkisFXzeKslWxm9Yoe1TOouiSV11hex0j94Hpz5wGWEXF7z+FbDq+4V0UqGkKx
+aERsl6HMWNkImj57N/9h1C1YDfiKTimg5tZpKmehXtldpWGCNDZrE0RasrFCKENV
+hFMhpc4kAnx6rbA0+LhRvJkvkdxY7pKU//aZiEYEGBECAAYFAjbjtWcACgkQnu80
+zUsRsl/0XACfffuI4IS7cgh0PNghr/0v3L/NhncAoJNwutmN7kkv9n/oPqkByzLx
+vZt4mQGiBDbjtcsRBACBDJOGX9C/xxCVZNP6OHz6cL5vM3PimUAhV+9HAVVPQViT
+nFKrkYPSQyRfWzjOU8RO1Tp5CHz747oOb6j9P74yH1uy78yFg4UuhXBWinhuCKKq
+4IIWwJkCKBFr1U8fu8a6Y6NcjqiDA0KmGRJrMPmXenXkJpFGHG78rUvNi9IMfwCg
+ugzNILh/3XZCZU+BUPYeXL+nUAEEAIDXZhj1vFXHgi9lmijKDjJocEBoamN/taQy
+6Ox1RRD6HtfAPY5TER1n7xm9hMzE+Ov1IKpH/E872Rha1qu1v7eOa6eTuNWF0Nvm
+SR955freRsNuR8JNIb6StI2ER9pzBUfjykC9pg2wPeC7wpQJIF9TF+Ja1BvG2I+h
+a2xJ786AA/sHEUvAOsc58YbPlbIPyp2JdEHvXTRT2NISVRuTMQsg8vV99nMYR2CU
+h270uPyy2xZaD/kYcJ9/1ngY7C9pbbNWoV70PkEMO/qj67OIViWVPzUhIdURorbp
+Ghuc3oBzUxOgial7IbISPRItDgg2oZoY4hqyQNx8Cj2ZZAzDpM2vCrQnWnVsdSBU
+ZXN0IChkZW1vIGtleSkgPHp1bHVAZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjtcsD
+CwoDAxUDAgMWAgECF4AACgkQa8R3gFSs0kZA6wCeJUyRzuFbsZ0uQulvpgOIRTLT
+KscAoLd3InVEj20peTUQ5b2NOimSXnKxuQENBDbjtfIQBADMfPDBQoMzv52Mmjb8
+SdaYKKNzqDd9K1oY2hcMSi+LcHag+KJFOyKBf3SoHmcU/vCEN+LyTgljYSKDmEf4
+wZ2+eLfqFgSdBJp2xm55ih+9CHXg3dXx9SbHiGJCIxfJaIsnNz3VmJGPDDjBlaf/
+hjl/7SZvR+MJpVLFPGjj7uOhTwADBQP/Sgv0abeCXVdVXwGEmhdV0VDo833IQRdR
+u1yt+QLnWRMGTY1oQapsH6QLwYSZfDJlxbsBA3tfqKStpRSbdGNNTsK+RIehsGdd
+i3sWGplRGm5Xt5KpkY/mc/tLFaYJNMqAgfWQcKlZHBp7EoWMgiRiDJUWq0TH1wRD
+oPaRc+H5GdqIRgQYEQIABgUCNuO18gAKCRBrxHeAVKzSRn1jAKC5Gp5sHM9sWdZe
+M6qfu54F2OwMQACfTjYXfpMApAROPkjhhFNqH0d8x5E=
+=1N8S
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/checks/pubring.asc b/checks/pubring.asc
new file mode 100644 (file)
index 0000000..a091e0e
--- /dev/null
@@ -0,0 +1,720 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.3.5-cvs (GNU/Linux)
+
+mQGiBD/yNQgRBAC/KSfe6uVfDgA3BrGpNLhVxT/ytwXMpBI8pEdTiY0jWnYrb/Yu
+8wtCeZ9GAux/ZA/ted+7pdibHXfX5PzDfgUTZwrIJa57OUpWwI878AzZxNsnVv1I
+P6ufGyESKME4PUQO5heKhwAb0gQwFwArS3v4oeYrEljhJ79kpt319JEAEwCg+hTk
+nylYwYGT/PEVQ4JlLPoWmqUEAJn1HX1Od5tyoK4OEAM5G+wHz3SBj4FMonZNWs1I
+t03JKHoM5ulQ2FgEWmBVIPTKSDm/jQXPYApz5DpxpoGYbTCaEo6zfE32AEzoXDmG
+AZE90Xhq/wcEN+JcHpHytAA/n+hYaR3sYegQ52mWMR+vdd99KO0V0jLRcckgBA7Z
+2jlFA/98cyy2nYt0QI5Tf+t/d4WBeib2yNWVtZH/j7XpDqHLZDgVAYkazCA6ZF7B
+vLddBEqVAh1X5tqua4AXX9L4SGYb7B0LRV72alhYiWWHez126KjVgwRTUxtEJ4En
+HmYJRReLlXosPIRhXSz7HFAqalPXJ0DvC9kzTQnnjPOylyMPTbQjVGVzdCBvbmUg
+KHBwPWRlZikgPG9uZUBleGFtcGxlLmNvbT6IWgQTEQIAGgUCP/I1CAIbAwILAgMV
+AgMDFgIBAh4BAheAAAoJEA73cJbXTF8iUO4AnA8wHb3erMrfWV3ij0d/cEiSJAYF
+AJ9fcbShgTXDN1dIVZvLSW5E93TfC4haBBMRAgAaBQI/8jUIAhsDAgsCAxUCAwMW
+AgECHgECF4AACgkQDvdwltdMXyJQ7gCfcOplS9yv3a1gj4TCPiNybMWs0owAnjJh
+NmPvm3h3taFS/VaO0OAmSQCbuQENBD/yNQ0QBADoAktaeO83HXnNFL1QtKYXsGpR
+1FOn+5rpVq9I9GWNUVNCDj9fBwHk+yDXMD3FGlLwvSmHp15mG7ztYu7DTVAjrClG
+psIPqEjTHGzNwMDcMZYIE8iUtTelsyF+zI0S1JVKrWy0YTwxpQpbbesngI0tKWU+
+uOkwDWgQ4kSIJPeAAwADBQP/Rodl9UsvuCKf0bTCQz2TmPmOrFlDezojNgZHVJgi
+zpmjlX4K7BHrynUgQY9KFVjfNVNNou40M4YQCN7WTBSZj/4ZRewJUuR0mi49vrdZ
+xwCisu9EIbJCDUeNQgr/bBwHOYDdVq2OTQ6XiNdhpqrFjD0FT1B7E03tELE+l2x8
+7wuISQQYEQIACQUCP/I1DQIbDAAKCRAO93CW10xfInB4AKDKD5BulHRXb04ynP6Y
+Wel6I2g3fQCgqJEJLoUNcIF3tp2jF2jBr80WmM2ZAaIEP/JSaxEEAKxxqlg9Kz9D
+Z/3N52BC0w+JtYKke39vpdWVDHR3MHmMJ/31Y2iSpm0fvRs3h1j9/fBVmLOZglNQ
+yH62SxdJyZwCelkZzfUy/qLm9Qaqi7wpg0p4EbmWdoFF/A1Zg/MU7D5w5xu+EA1J
+77Z6QyALN9rIOXZ7rLLa64lw/MV4LdIPAKC449htJbbp5rkJHvBDs4YxEIkk5wP/
+X4hPGlIw5PlHrsG7hdahhTudV5hRGlvosnwsrYJXvKAQLAV1EV26SIYUH5pM/ycX
+rG25dqVoG56uQqnhBdUqo4iSnsxY3ZMA46D14REc9P//CGvJ/j2Z41gw8u8oB7rS
+50djvoaWb5myj7bhacTBdfah3U8dVXcIi1ZFvtiaGAYD+gIF7eNIdpaYiB0427un
+4ggc26+Y9nkF93DaMnZEaYSeum6g/g7D1vwINFgQkMYEWi4DK3W+uH0E/n8o20wS
+2wvMrbeYaQm5v6ucd001wwFDY6AdwpwP7UCLQcu6qqvwNHdxWYK6+gIsSufLmeMG
+rsvC0WQqYeu1GfGpHIMCZJlZtCJUZXN0IHR3byAobm8gcHApIDx0d29AZXhhbXBs
+ZS5jb20+iF8EExECAB8FAj/yUmsCGwMHCwkIBwMCAQMVAgMDFgIBAh4BAheAAAoJ
+EJc9UOHED97PgEMAn0F8RGDrnmXv7rqM2+pic2oDz1kpAJ0SWPHxdjJHWzoGMrHq
+ocAy/3wFi7kBDQQ/8lJvEAQAzNix+drHTYCMxS8NiUZNpVTGnWfzMjxCqVyZYt9C
+Em7A4JcfSbgRUppqKunwreuDmmNGFc1W+lT1oLfvJaDi/oQ/oubgIcq0EZ5gOUyd
+aj961PV3ltNmaaUSZsJ6jRxaa0FB1cgx6EVB88gR6JB4mAM4KV+Ct/f9QzPv2TMS
+8qsAAwYD/jdzptnsiJ124yTW5ewhvUVpmDGuT9CuA3ggW65bjOhfravX5rfHMCXL
+PXMNXFgpA012vghVwun/ekkj7/rxapZmlE28YpSDj8Pwn/lkqNAjy466My+wUeoC
+gg7mEg/75is2ogKzx1L52nay7BGmfS415m7BBjWHsiUA6KRtFXt1iEkEGBECAAkF
+Aj/yUm8CGwwACgkQlz1Q4cQP3s8svgCgmWcpVwvtDN3nAVT1dMFTvCz0hfwAoI4V
+szJBesG/8GyLW+e2E+LiQXVqmIwEP/JTvQEEAKhSVnbs5Ndf5tAHPyv5mm9JM869
+1FKK9W5MYeL3MSRzk2Rd2vWOrdVlKcJTl3gjZGPfLUWFIOgONMBYJCs/+I3Tmog7
+R1tmzqq7yZif8B/+c3Zg6bYbudyRIF1Cj//o9nX672E2WMctptdQwOvECvYj0gZp
+LIJRTEBNiCWrcBABAAkBAbQmVGVzdCB0aHJlZSAobm8gcHApIDx0aHJlZUBleGFt
+cGxlLmNvbT6ItQQTAQIAHwUCP/JTvQIbAwcLCQgHAwIBAxUCAwMWAgECHgECF4AA
+CgkQ0SC2Juyr9R1qQwP/bCDX1WGk1u0zkKJWJ/VXnuH3jk6ZevkuHZICwjlqAxv1
+de5P3Jeya/4kPmEQTotEv3xcDAZ+9pBL3TrZolAKhxkBZ08l4QSy76kyf8hB0eoZ
+2Svs7LrGPBJr6CHX0kyDiapHgAhBKQq9GhNKpIAZuL6DK2dOaQDtoRSW2iB1h4mZ
+AaIENuOOnhEEALZlsUNfTCYkjzIsNhB0iJl4C4cuZ/IeypdosZQxm1aIC+f+E2ly
+3BqGbMqbmheKcdS9SQs5DSzys6W7XmeHDhrNzfStM/UuwiSfnM5E2cV2BgLpErKE
+56Kb/rf7/Ia12dObj2VV9oKrCwSYEISRdp5YMar6J7Vvz0nz1Pqf8mq7AKChCSNV
+5UYb4H9LMnr7KJ90dZBWRwP9FcPItdfj5YcY/Zp63nVeUqiNYbCxmZz0s89iHBT9
+FxQ7tx7VBBvRcWVRUUGFjQlCkz+3L+Q2L5oZYXOKBtD4cBZmRS8Dz5UgBWd436n5
+IeEYjItNcqkBhOrjoDC+WVnkKm9/TYKn/5bVpXIDSqcFYzJ4jFeZH0c6LqXHGfly
+NqMD/1Vm585daoJeQG/Pg7LdDkVuNBDT/63LysOfw5NqI+LjUXJScSLos76rIFLT
+0WOdmP74+RxFxdb31I3GYQlFjsy40e3nAi8QfaM0Q4n2WzPNkUENu7CyNccrfn6U
+9sYTLr3EI/bqIRp/KwoptFcmETUL62TxKcr4abrayK+Yr/lqtClBbHBoYSBUZXN0
+IChkZW1vIGtleSkgPGFscGhhQGV4YW1wbGUubmV0PohdBBMRAgAVBQI2446eAwsK
+AwMVAwIDFgIBAheAABIJEC1yfMdoaXc0B2VHUEcAAQE5eACggS5kaZb//GX0qnqe
+SI6hALml71sAoJejRM0/v1nsD0xnMGWPqS5MnC79tBBBbGljZSAoZGVtbyBrZXkp
+iF0EExECABUFAjbjtqsDCwoDAxUDAgMWAgECF4AAEgkQLXJ8x2hpdzQHZUdQRwAB
+ASeMAJ9MeUVrago5Jc6PdwdeN5OMwby37QCghW65cZTQlD1bBlIq/QM8bz9AN4G0
+J0FsZmEgVGVzdCAoZGVtbyBrZXkpIDxhbGZhQGV4YW1wbGUubmV0PohdBBMRAgAV
+BQI247hYAwsKAwMVAwIDFgIBAheAABIJEC1yfMdoaXc0B2VHUEcAAQG3wgCgk/Br
+qP5WblWLc2+6jwlmuLg8n8MAn12puZol0HwV0mcd8aHWtcrfL8lyuQENBDbjjw8Q
+BACcjdcfV/S7I319mfDvbOwczDvTqDsRbb2cPhQNAbg7NFlWJKtRrmff14jtCt9M
+77WZ5W+zTLwX8+8Wy3mMfrys8ucZKtfPixOXVPhyinUUGSq68IArA8vLSUTuOO0L
+Ii05LAg6jzGhN9jgkQReZyqxub4oe/3JhIX9grgJ/tsjNwADBwP9GeXmMrGi5wMD
+3qkPbzb1MqwsVBJq75eLLxu85JIN2XIAGw6Q0FJp4o7d4BAQqAMzt3ONU1OcCWlD
+QRDxj1nynE5ZgRBiVoyudEELgNnYhp3MSEuUg7PkFWn+N+GuvyhVUHApleyvP09k
+vP57hif6yJRS+V6L1ugP0vZmBI4dqQ+ITgQYEQIABgUCNuOPDwASCRAtcnzHaGl3
+NAdlR1BHAAEBIKkAn3A15g/LjVXSoPwvb6iNyUp3apJ7AJ0cc1Xh4v4ie9zgirbx
+ax21fRqIKpkBogQ245BnEQQAvwwkLp4Dtoie4/fvandnK4wVPCvgJkIbNuyQZCar
+QGwv8RapBwbANT4vGW+ky2vzgptj21xYjOcdNMIhJ1Sjc7hjs1PLhwepMFrS4/Pl
+e1TljpEgxLZ5UxertMvSTr7OxsA76jjOQt0B+y2vs5zXgLtedux4+pdFxkgM8r6f
+jZMAoJ5LVNdVRaSkiHaKZWQWsjfTs0/LA/wMHP/PdH4kjFmDRqOPp+iB8YYwQTPZ
+S/gwHtUbQhLcFEljaxrCMRZw0ZDMbzKWk+BrrBvgz4Wk3XawwUshYgi8SgwWIDG0
+jusEPYOs1hBIdWTEzFVP2pK/NQzhAqJV5/390OLEY8SN4bts/LY1XsADzU7lhE0O
+ohx6FanaZCuGgAQAn2zK53yuk7o8UrPdTHygVn2McsPYYzOvlVfHCSXQ14oXjCs1
+nK1XnMIGGM7pJjYpzv/wUZkHLNcHX4uVHXxyzRQ4oMPekncmaR8fu/YIQ9zag5s2
+GpKESKAynGQCKwI4H5eYn+ryIgOHNS44UnXFUwbEsonP5pJNNRIM7VimNGm0LUNo
+YXJsaWUgVGVzdCAoZGVtbyBrZXkpIDxjaGFybGllQGV4YW1wbGUubmV0PohdBBMR
+AgAVBQI245BnAwsKAwMVAwIDFgIBAheAABIJEEE/SvMa/atsB2VHUEcAAQE+RACf
+X3AwFwPu5+mr/f1Sa/Wv0m9T57gAn1TBIoUErMqJehQZu73N0u93fqSKuQENBDbj
+kIIQBAChY8NSvu6sK0p4D0AVBsRz8iVXYqbRlRTZAHS4LCXwx/i8FmfdIXnaNLOo
+yi44YruSCnlZdh4YWquCx2mgywG589AzcFhahmqElNbKb7m4F//EGIZK0zTgW13t
+QwG9hTXOhYeqchnOOaDDwPEK1Gr+2o/5ANqhqrin0TFFBWLgdwADBwP/R009s61X
+/FkUUAh8w4Tua6qndN/2GsqXsyPYjdF5E3gErK8jDcDLniOHqkswV17bJG81czCR
+E5JcVFLLWQJg9cpeoTpP+YcF+m9whtswaOJ/LPrx888i/OmluSD81VP+6zBhhTUb
+pazfLEdt3XczpW7CNdNbyiEcgT+6Cr+W2GaITgQYEQIABgUCNuOQggASCRBBP0rz
+Gv2rbAdlR1BHAAEBta0AnA21IY9iNt6wtJN5HAoYDl99mIUOAJ9M8Loj5fIZq+Mc
+mtodOBL9tII3Q5kBogQ245HNEQQAis7GTDqtEM6luop6eWsxFi9+qhUVp9N6S+xl
+bwzQZVA4FjCqf1VR9JX8fwjLecmxT5xThQVcRqgeFVaCyky2Nge/FcFMPZQeaP5j
+v5GRWc5PvH9Sw8pvGOTB56V4ZeR4cQLDBm5CF5tKu1BCWWq2MLHfct7TXe6QCzZK
+cjzdw8sAoN9VvrKN+EbQC+THzdWaUWpdcfWnBACFWEyLVPTpI1jNsoCZ00F8Fau/
+2baXk8mdROlJZS6bq54ksfOQQzReBWce35h0W7NeBRp+yeoSf7Y3i0jTO4mrOiL/
+0NCcS8qKNnGKG1irdLes3pQhDZpcUe2G9W3FnGhxl6W5hpYc9550mUj2H3I5tmfS
+YsVcVjpNSIdBizxE2AP/SI1t6q7LHMQp0h3MPQ2z7daMhUGViXnVl2+rKjb5T7bv
+SFdV0iyyuyoqvUPBGWwJFLAxj6esHRlQ6W8togHuoJCR7cL2bK798mgYOExk5gBe
+xq1VHQQZN1edK4LGo2ESKrCVtkYwBzAU76hYFKAbKMU8dMxI7DRdLjZ3vdQ3FNq0
+J0VjaG8gVGVzdCAoZGVtbyBrZXkpIDxlY2hvQGV4YW1wbGUubmV0PohdBBMRAgAV
+BQI246R/AwsKAwMVAwIDFgIBAheAABIJEDGMH676720bB2VHUEcAAQFnAwCgs2ha
+IgJu/UEpmCEnojO1zCoaBwwAmgPAlNY/PttAu6zYqTh2M9yn1DIXtA5FdmUgKGRl
+bW8ga2V5KYhdBBMRAgAVBQI247gAAwsKAwMVAwIDFgIBAheAABIJEDGMH676720b
+B2VHUEcAAQEg3QCeOMf0g3znbc8IBiTrIPUgUz9p3WoAoJ6eRZTZk7z+hTyx4JDc
+eReQbYlGtBJFY2hlbG9uIChkZW1vIGtleSmIXQQTEQIAFQUCNuO4HwMLCgMDFQMC
+AxYCAQIXgAASCRAxjB+u+u9tGwdlR1BHAAEBXqYAnjqVBua1ZFlSV1C2nhmc6m0/
+tkm1AJ9x5gxl8wCepQomIeTa0yG/AO8CHbkBDQQ245H/EAQAtKXtJo0R/yZii95r
+m0k0TChnHe+/pfKbJeBrXAOoqjY94OudENscYFvkG9Yi/UnoiCT/CrhH4+r3z1Sm
+RypEQH7I56W4TfM8+1kGtsvJJJqqIx6BiIecAA9zROqMftQ9lr58kplNSTrgEJRA
+30QuQvYUq0AZDtE1Ali9sKrg79cAAwUEAJd07hrdkgrmEl6OEdnTWaQdrpKqhzo+
+5500Lu2VaItTrYGWMaK/8O/Nxsyye+T33UDEnek/hm8qvkIKWogb5ZlrXOa3Bd2Y
+J8YlvZ9s1JUPjOnXp7myU+vwKn5+8i/b9LK/Cu5E6z6gDNJW+gwDMAZKTfKPmdPm
+iKRuf4zrZ8LkiE4EGBECAAYFAjbjkf8AEgkQMYwfrvrvbRsHZUdQRwABAY+QAJ0R
+/tZntf4hw50uZbV8rDnZduPwTACgj04QKUO5SXvC2K+tfpV1FMK9UymZAaIENuOS
+0REEALm1DndAe3BcyRxeb6OTcIjGdSVz48jai9jlhP132niYgeeaDJlRD5itSRev
+cFO2QaaNZeDxCFnD+1kTKrwRBZfvC53pUZElveZMBa9w/E0Z2q2ct5H4gRdbd93Z
+5FU2mWMQgyjgXWf2Ykby2uoGfyh4SE382ku4d+htjGwJRpY/AKCkDxbBD4wcimHc
+e9puf9ibv+HeIwP6AjQCmiR+zfGNxy4rNUoYacrST9cgvRiY7XnN7oM2Egu0Sldz
+SXAXgl+KJtyoYg0jemGFSAn+MHas+kwKHKKj80drexc+vrqcSIIeVhp5wrNnu7jt
+Xl1AklzjX4gxA80Shk0I5Hb8BaPvPNA5IhpZ/6pka3CCwOevHcDZzqwYqOUD/3W5
+KVAYahg69i3IaZKGMkJas271KVydcZX2YptY365nX7JPN3RN4gc75k/AciGXDKKg
+xB4pfeS5iad6sNclXgKT/2VkftF4gSxBfRoXADnOYoR9gAkly1okV6cjJitv3q07
+0190JAHKqENXBVgsDTQq5YMnAfOB3ZuRl3Wo6e3AtCdHb2xmIFRlc3QgKGRlbW8g
+a2V5KSA8Z29sZkBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOS0QMLCgMDFQMCAxYC
+AQIXgAASCRAWhBCkj8KC5gdlR1BHAAEBIuMAn222gK7ibwOXzIKd/gZP09JC/3+e
+AKCOelaqqYqNNbku0gA84+O7d1kMqrkBDQQ245L8EAQAtsGp/UnA1y4AqjewlkkT
+OQevLwtzwm3pmLLjl2Y3TfGn8Ni0h8Wd27kV32MUZyTaNaZuDxpDEO2aUIpGWVQm
+WvlqCFV2F0Z2AI8R4bx1tC2kD758hUvR+S2hn9lK7E1lQPuvec2LEml+uvVxW/Vm
+4iDBgeMlIlz70MFC9LUnfpMAAwUD/At7Clo7D4dNk43BMvhQ8VgJ+INy37Dj8PHX
+2sCZZ/tIfSwNIU3m2ygSVreTlDKo406v6Qmefs/m9dH9lsBE/8QL40Ek3SY6xV/Q
+zTVN44QgnpRKWpfaMbGzWJVXeczlNkTeIZZo/nhDm+aMucMu/e7EKbG64BnrQk7L
+z6LSKb2xiE4EGBECAAYFAjbjkvwAEgkQFoQQpI/CguYHZUdQRwABAffsAKCJwKTp
+e9OoS/fhFdVKSF/4RwMc4wCfeSuo9zll5IkZrtF9FxWGblC1y/KZAaIENuOUsREE
+AMhuJkVEGWoIw4JdMQJ2kmywkOcCamKv7J8ApfiGw5V3KB6l0DTvUCazysCkAFL9
+zb5O5qmVp3zD6LJCzgEq7Op5Ar9haPQMOrJjYszuolu8V3qcL8Y4aOIS5xNNKBjw
+g4VJwFNOSztqUwaMcB1bNKOr7WmlYl5NLOnThQqFXX/TAKC44hpSv9wxVqFK6iIr
+hN2i34JHXQQAq6dbJydQbYhoZio7ewJ+kKHOS1Z1ONSf0RIkCMorVBQLz1/n4qsw
+8hN1Q/Kl/770y6YGQmL7xHQZUnzPCHAp9f0IeGsPSR87rykIPFnJb50PM6v+0VfS
+e4f2kvyiIQySKRoYumH4343Uiny2GH690uE1SvcQ9GWtwB+/5a06lvID/36SlrvH
+ycifZKh8mKyP4+MpLeUCgY97R46gr+xUG+BWPLcZzd3y8wbb2v7ZZEikbC6G4sY2
+VBhfrkEdXUwr9ONi8WemhFKq1MrcalHNOaQkgLxGVfG19h/+frpUsHcShM7NYdjb
+0kwImeeM8yhoxzZhIrXQGjw//bucXQIqjxcRtClJbmRpYSBUZXN0IChkZW1vIGtl
+eSkgPGluZGlhQGV4YW1wbGUubmV0PohdBBMRAgAVBQI245SxAwsKAwMVAwIDFgIB
+AheAABIJEB/o/G8EJZZ3B2VHUEcAAQFaWACglWew3yvov2GRshLtfA51qtIsZYoA
+oIRsA6DBoC53p0o8koTGftRHHpImuQENBDbjlRIQBACDDIJP3vJbFfyhJHeP4zSu
+MhY+YsvxWqJ/NNCNxlMxE7kANgE94HrUfhrleKW2VhP/NG/YZzVudFCRoj9fkl31
+bWOb0/Kf4DRcJ+XdDv6at26YBUSZqGsE88fEhQ8AlTxxHMDhxNo+S73670QTsilN
+9ra/e+q4vlKMLdPvdi7gOwADBQP9GKPXQ6oY0dlKDXGHxGcFoUR2miXpz9890G84
+yZAEm+R/OMQkxKb9HahLVUyVKCKPC4eVY24gsKJOEDy1Um0BXh6kym+zfej43r5G
+dQqOjqywjTnD0b18YAsEhm7rizJECRLrZ1y7tAziqrmPeCl14e/S2u5U4I0XhP9V
+s24HNfqITgQYEQIABgUCNuOVEgASCRAf6PxvBCWWdwdlR1BHAAEBCXgAoI5oimsZ
+s8ZKmLb5sPB4AZzngCyzAJ9og9spt3EYXAB95XmfzqgJBRv04ZkBogQ245UlEQQA
+nKdAaILozJ04V6Z+FIwQEY/aF4EFrJJIc+uewF7ukZl/7uUZqSxqmzZjbqigyMFG
+ybJSMa6TpwN0BKG5CJe04R/mVCIRsz1Jx5YXezN3UFsNVNE36R8l8dxWG+wgj2m6
+0gu4VlodcpVMc/kRiSUgKUfg/xmPnRe3SJZSlG2lBm8AoNc/r5DW86om3MHWK8Ao
+yhvVXhWvA/wOcjx6gfTTKftzpQBhOF0U0fC3npQC6bvjLjTBhQjC3WX5rfwJqMmr
+udRbEO1sFqzTOQPtb9xatMeVqTcOi6+x2zfXes4nTfi9Lgq1z8HhE/LnktwxZxyP
+eOXqXu9N023IyQTv7mC59C1xMZk4POOv9WZUGz4C85s2/9iTJCfkMwP+MRW0S9mH
+misruCY6TDVFc12KIFMIPSmWav6gW6bCAA+wIHfmcSyR6MHiLV2gtJ0vQuqgyWfe
+TiaxPof07dg9pZsV7Hk1ZUhEmloeOcfZmwtHkRhWGEbEsd89IWMDJlwNJ7Y9JZ3Q
+vK7vB42bQVvyhdFQdEXH0slvlvsgKtCcaOa0J0tpbG8gVGVzdCAoZGVtbyBrZXkp
+IDxraWxvQGV4YW1wbGUubmV0PohdBBMRAgAVBQI245UlAwsKAwMVAwIDFgIBAheA
+ABIJEK0bD61DwtDHB2VHUEcAAQHVEgCfWTFa7EbAJLX6LsWnVwXPNkIfJwsAnAmr
+5Ebu7H2xASainZXaYp2MFmaSuQENBDbjlUgQBAC5mWLT+9huzqHUeEX0du9EcUx4
++ND31KTyH91PHs8jt5KowddiHQ9mCFyGVusxI+d6bF/AxsmuZ0r1Y3RaH0ElR7bJ
+wfx+1RwZGjkJ0RKCJx7OIXpWDg9DP0WXG0SG+uXurxHrLs76PTdAAkpQbAF23njS
+hnxhgqIO+BlRnGeh5wADBwP/VvZ9jMCe5atBleFdBDhw1XEwFUUodJwfbigVVu4R
+YuAz+12AX4I/DZW3NtrzJJHUrzRVKCxB+zqfbDIJV34gjyUodNlP+l8gIVw8mUcq
+ziB74k2fUhzEECKrRBE1bmEZM70p0nwwVatafYFunmTfaugDO4JqCiJ6UWjgxUVl
+Ow2ITgQYEQIABgUCNuOVSAASCRCtGw+tQ8LQxwdlR1BHAAEBjv0An2hrfDXgptM2
+7LJjq12er/cxZPMRAJ490qYy08qnpp4h0ifShMyCiQnYg5kBogQ246LiEQQAip3H
+OFHnnO3VmlQEctkpjVbn3knp2LOALCDz9L+fYxJeySNK2/uCWyCaAM1v4XJtuhkv
+1G26UMIoPPz4DFFeUHwUk+AhDpX+/8dmuBypPbQ1eAJ+6tmja9W3lvrcMX1Bllle
+SNKNW/4ilZPy4kEYmjK/KSV2Nuupuv9j5/S5g7cAoPiKn8fILCtj2Qlr/O7hCgDi
+8x17A/9XkcS6grdYU/fIHQy8pEU5SN5DKuhCtyPs//KQyDA7jyCatXjOvGHRWa/L
+O4tcntUKQ5bT2B4Fp1Au997owCgDXcsm5tx6wN00gYxAITX3LvJ5K1aK7wEkFAwi
+yWrVkViU1Fazx/hlyFzAPzouiw7IDQziWp8M87wwgpvIVkKlvQP+MWAGeDVRa0Kv
+ILUDyVrjCH0hUr6WVjYEIGGZ7Yl0lBmDlbNvE//O0aEcdNrbFQ8NjwPM+vKv10bj
+PTXXrcW1F0BwfXrMxS4t1tYnbF4XfwuEsok4BBVxvGPLPeBGnYJNTwGBzehnd0mO
+45nr6mBlS5gae6n4+WPV0jOUhNE4fny0KUJyYXZvIFRlc3QgKGRlbW8ga2V5KSA8
+YnJhdm9AZXhhbXBsZS5uZXQ+iF0EExECABUFAjbjouIDCwoDAxUDAgMWAgECF4AA
+EgkQ/hgLHanjsLIHZUdQRwABAfruAJ4iU4M5s1xsZiXa0wLnX4FBBl9abgCfflNp
+wyEp6KEhKCPWwPRG9WJc0qi0DkJvYiAoZGVtbyBrZXkpiF0EExECABUFAjbjtzsD
+CwoDAxUDAgMWAgECF4AAEgkQ/hgLHanjsLIHZUdQRwABARrhAKCK3IrzNqME6oA3
+RllOrx87OCIRggCfVkR+Nf6N59lS5j7jMXOuk799fQ65AQ0ENuOjBxAEAJVJ1fFR
+aXPzUWOoeBHhvUS2aGZbz0Kamwd8qVLCVi8G1sH/LtMUh+8CvhkVum6p7Dom+2Mg
+Rmhe+iVNbAdU8QWS4bQsBrTeiVpinMLpkEO4uRvT1G6QIPjN1jrHBsAxGw7NmC/n
+3stle04ssueY7JOmyNEMvO1ay42CWbmt985PAAMHA/9LJVm8UR0RWfn91BOnt4C1
+d2ttkQzfv1y0InbrrdFtNl3nmUgF6/V9OcpCS8NNjZ7nzIhDgT43Ov32qD0LJ/p7
+c6EStNSoQE6G6wGB7j/sTkushUy+joAVT2qCfRKCye7/DDa3FXDdcSOovweCX7hD
+/nthG8k576rb1h70svx5qIhOBBgRAgAGBQI246MHABIJEP4YCx2p47CyB2VHUEcA
+AQEyuQCfaXpOx+srd2RwCfu55+7BpsWMW+QAoNSDRTeADM6hFI22edSk1XQL8ipU
+mQGiBDbjo4cRBADeZztXPNYwpoIf6BfqepImZqhVd2qXuZBJnEvwaFoAl7er42pX
+XLZhWIu7/gWODfcyNxsUKgMbeQ+nWO2jdcZQtt+gmRAGl1F5LbxsP6aRw43W7PAk
+bmYgPY5tY/dhgFGP5puoV9mhijpFcK/cjeg6wNgmjuEsCv8BF5FX4/p2swCgwmgc
+x88EpJF3/EDrTk4/8Xr6Z88EAL99JWgnl0w2TNiP9T3c5mtVdcYs32ntJH82TiQQ
+0LR0A7zRY5ruojNZC9LsTht5K69AJakrDA/Fu5mr2xYoFJcW4b7rpeKUy/wYifeO
+hYY5T2NDYvaZnQJXZ6O8lGLFgAxCmnZEN4IRFahKs/gAmG86d6fCvuSrohSZvQ+L
+sr06BACFT4tjfuL6MZ0VhsClxeBPny2AM10+bDDM5eOl5ODLN9Nxf+SRu5AdIojz
+2OqD9Jd55WobpUXGzTI+0g23636IuJuH7VGCF92nFwkjdIDblRoqYPAsJRkMiC4F
+kRaeqF0DpgJacYSBnHdY3Yd7I+cvgkK7oBjzTiU/Zs5hZAeK8bQpRGVsdGEgVGVz
+dCAoZGVtbyBrZXkpIDxkZWx0YUBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOjhwML
+CgMDFQMCAxYCAQIXgAASCRDrqfJA653J5gdlR1BHAAEBriYAoJdBwMXGVRTFlfw1
+u4XimCRPVFRNAJ9WFXysx0ugWaIaLJ3tyNZQHWoARrkBDQQ246OqEAQAj7WdaOJj
+zJNs2G8rvrDZvD/uaALQ9PtdvYAp/Drp7xMH5T62+KKTlKdO3s8IQBPiuFocJNir
+5st/nm8Xl+gcOZOvtr45c/cl54fGO1gOjBZOfgbkdBVK/LMwuQWIebK4qCZnAOlD
+LYNGVUguGLnEQBSfnhhkgh0WA0kqt7fYvpcAAwUD/3cOEqPlMdYeLnGEG4wPxtyV
+IchwGOv0YRW5apbz2fdO7otj1AFUN5WzFw0A5+WHza1OIUhg50Zco6HnwKx6F+Lb
+Z5aOc37EAvaFgPuMxBfkaWYagCof3jBF0CbTWUXV/D5/dFmIeuGTuUMNsGVH+OSM
+W2hBN/7+aJK5LLHL+hzpiE4EGBECAAYFAjbjo6oAEgkQ66nyQOudyeYHZUdQRwAB
+AXNNAKCaviZP/A83ammDnHvkTdxefqoHbwCfaE7+GAg+R/+tJLJ0DvZllz8xYzqZ
+AaIENuOlJhEEAN1bOV3WXINYOoY9LMY6x6FfJNJrSk59VMtySkmkOkStyfyNLxwq
+teRVSjAjtKVmE9GZgj7mmoZobkVnlUl3VN8paKFzs74kMegrfJqY6eHo4VAU9lQX
+X5aUAaIVctz5Y4PNuA5IzL/zJcDqfTN76/d63mf0rOJvewMaPDkMyaJjAKCZTCeh
++qyQdW/VLq0ODTyZcAsoowQAhUbJ/2KPcHM1vR9VgZQ4tTTuepDdGk1A9oq09CkG
+htGSdD9lJ3O6IAtwIH5Drrh/VwoYD46C2bQv9/XFSYpFbetP2XMy1wLLqRy50IjY
+4eb+A5w/MqqOPmiekPzh+BHgF1ux6FPz66ubEWIr9sUUjp4LUvl50FBxEuztMXaN
+jdIEAJ1fL3IeDqINMmHKy9HtS4tYT/Wz3KyKuFmA9vS/IgXAd9HMz3oBgg+ktmv+
+O+SsNrBPFgZ8YhmuPtTIZ4+7tEJ4VFVVfnkHp682/d8CpubBDUYdNftYcI10CQ/T
+vJPFn/Cdm508DNDBGQR9nf1N1xxs6Ed8e9u/dE1DRXFta1BStC1Gb3h0cm90IFRl
+c3QgKGRlbW8ga2V5KSA8Zm94dHJvdEBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOl
+JgMLCgMDFQMCAxYCAQIXgAASCRDUv1fzc3LiQwdlR1BHAAEBdy0An2YZaL/VMei6
+H3kreYNoVYow3V9IAJ0XO2nYsUNoaaa7+LzaCr5rphfw+LkBDQQ246VQEAQA31Qj
+2MGefTCoF0x+D+9UMxZ6RuBPzI6gzX1tzcUPWYy38NIq+lNYBg7hLFkUfn0uTsAm
+33h2Q8z4/DGT7jmQWpoIg7yNTr6681L/gYo5FhhC+qERZ1iPMyfMwwD7rrz9bthU
+GTqChV2h6NiPUPM7ic/D9rxJICXy8dsoj0dQ6dsAAwUD/0ggimQTUCGmNHHypor/
+GY0XAAL4Vy8jAsC0FH1UaqDVTrTDH1qWLRnS9uxEsOJIGSLMSdxC0FZEYq4jCm7C
+YjTOHTHvvYDbhs9QhvW9r4VD2efbERFSEYMiH69ASQLGDp/O5kOZTgQOvl5oxzvs
+rOMaRFSWcn66uUAMORmHKz1giE4EGBECAAYFAjbjpVAAEgkQ1L9X83Ny4kMHZUdQ
+RwABAY75AKCVZupUbMXq9yw03M34RS9YT9MzKQCfUgFd+Fn89xqU4Owg/MQzYlLr
+eUmZAaIENuOl2hEEAKeOL2pIdZ+zQtehxdL9l/uDBFSTuN9rLb8DgLiw8Z9j8U5C
+EH/M38WzH1nHKKlZKjGVZYiyhRfAG83wvHnT83lq+Ad0lgaZTR4z6nrd5ViOlHPl
+fqo4RPZPzPe+uF7EfDl792sJerXGAasLosmKnxKAyJyVjh7eZcjTS/hUhO9zAKDV
+yLHJ/gQlMYk8vE5XYL7Pw4d28wP/VsKVkjlxsXpcrCQIoKeDXgKNVv9L+0Pebspz
+r2WOah8iBN1QOkbtexIKCbb9mmviEnJU0FFx5MIw4mipvY4EpCaH3McGwJpCzWmd
+zID8Z6oISUyKsuP7PXjmASbogV6Iqy2m/2RDtfbIlbwotfbiOT9Tr3IPbH+tHAZB
+yMRyvxID/RN90WOPSpODxr9AH9btmeJD0BfNt99116+qdwvWrTofcbkBgzvB34vL
+LDaMKVIyinxz2lYyC7aSpA3uzjZvoPvPrQJFLE0dx7DSkUTtWbQGByRabpyrXYdK
+ZzsFXLb+LSTWwF3sQLax0C4cYT7OLPlxjDVq/A0jgztaZVWa37IYtClIb3RlbCBU
+ZXN0IChkZW1vIGtleSkgPGhvdGVsQGV4YW1wbGUubmV0PohdBBMRAgAVBQI246Xa
+AwsKAwMVAwIDFgIBAheAABIJEBPbllU0xuPxB2VHUEcAAQHs1ACgyFQrt3yZbUXj
+lCnC2luf8R1K6o0An3j4ZVjoau0xsDzKtkd4PzNIB52uuQENBDbjph0QBADOk7pS
+4JZak/26nkZWEs+hIIF9IgD0labkCnr+GNDmGJrsJxLwTjU+NoaXo+SHmWPaqRJQ
+Frz3ZJfJAxioyoSr+Hv4Fbv6frZIJEy1g4dFhk8DiG+zR3uPOcZCUyyW3HupqahU
+0/RcX7CzXAcuPJCXeoyeSsBDyUAk/6ODs/kerwADBwP8DrWpAtFexIWvsswGdpRJ
+HSjr7j8cJ2Hy36acB5AEMCSd7kNM+LCrOqyOhh6RfokrvCT6ZuwlN39nDnkmSr3F
+WbqcRSj8khs3tw+Uyp8ItqhL621vFn180I7dZM11bECv+YZlmIF/L3JNzFR+jmpO
+DR99bLjQI0dpUqT6IhyS0bOITgQYEQIABgUCNuOmHQASCRAT25ZVNMbj8QdlR1BH
+AAEBJmgAn1Pl0Ya/1IL4AnzJTrYWN9u75SN9AKCcqVnhi7qdg6qLmSBpGPG5qQ68
+/ZkBogQ246f/EQQAl65ub9rEKS7XsXwNkvGtj1K7gnql2H1bJ5GF9bGCWhWmB8WF
+tsAy9XUeC3WbrcuWFgTsbtTfXZ5I7j7HSG6ukf6Ycusb+bA1IoT+GAQGWpFeWoXe
+16wXZFl0pEc2iUnx9ThtoQF0fO5YlbvHJPEQ3kvoqcdb52WOOfOuCAJxc6sAoNqo
+5w0YxgJ9jkj7J4cmR+OFUEKXA/wO0jrvYE7eiZeFUjGNiRotxzhTzh53rxtz2/DW
+G3D+IBFOt4qqxxp3WCSNO5SnBZWUW50hDkhTxS7jSmsfPBmCinmQ6EF5FaFPyLQB
+q0uKwhMaWficdrQS9syXFlPuzQ5jOS3kVAxOmtDd7CMTC8892dj02qzAE46QNNUI
+91kZXAP+PINfoJ8hV2zvlGZ9tVlo+Lgsl1BOvxvEgmYV14gyTmMWga5sNq7TdMdW
+i8Fz0Vy7sI4S+RMJ96rMws2iTzWLi2jGO44itoWttCwqmGJmlSWurRsvYhSBgvNC
+LXFGGaQn5ncO1tqKnWSDf625UnAipsgW8P4Agd5qJZiwXfJ67Hi0K0p1bGlldCBU
+ZXN0IChkZW1vIGtleSkgPGp1bGlldEBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOn
+/wMLCgMDFQMCAxYCAQIXgAASCRAMggxx0mmTEwdlR1BHAAEBQPYAoKRB8Ey3Ny6T
+aKaGoL2GNFQEwM1MAJ0WblK0ScSKbm1BN+2hfDmmKRkgvbkBDQQ246gqEAQAkdlS
+JYfTiZH/CkfV8tnhI6IDz+SgiZKcneEBnO+hAJottARGAojdbURlOIeZqRCgKpdT
+XBK7MdHAz4RKFnAAXPDBZgA5q+Coqn580t/O/AKGb8kKn9n52z9lC8A5KnHaRAsO
+KVyPTIU5vq6FLmsWmMB55iz826Dk9kMhV7mmdQcABA0EAI8Jq3Jnqf0HqqaX7CZu
+NKHJgag14bTaBw0niZK0KSB6FBpzitEoyst5JBPCl0ayQEw0Hn4jhZAqcZybI//p
+C1CNQBBO47VUi0y1UVjExtaNmmWxugzkzWHHx4WmyWsCQwGN4B9riUws4g3dgC00
+7l+aonKzj5QEo1XiiMNTFFmPiE4EGBECAAYFAjbjqCoAEgkQDIIMcdJpkxMHZUdQ
+RwABAY+uAKC+sJk79PGOrcXpT2/F1CqWssOBcgCeJ3lY+tmSH3V/eAz5BdNB+ar1
+XhGZAaIENuOo3REEAMFaZuaYHLD67UlMCLHGPk1dFdAn3Mu2TFFDUYfEtA/JDOiN
+ZacPiQSZ7zK+wVe66Vs9fzNkyeXqpwLzC35vkTx0K1m69Ave9LnXIZ70zvpVEL/U
+eCuITRiocxNglPgn4dyJ+2V0cWJ36NGcZmkvBW0vGItpYCbpIGLzYVOfiVUbAKC2
+Nze79Iyw+DKU9HI39B4fz85nkwP9HbIb9z5kXiRZyCaXOMnFBQ3bAZh4Og5ZQxdL
+yZ/rIX4Mu3DGjqg6UtosdVNHr6ofZWHPXNqqTUivoUmOS5Qa8dtUW3YGa8vbpK1O
+MnjMLhQVJZg/eou99s9OFP5GgPh5r5Vw/EYQZ6qzS6YiYnqzSt5LcolL2+Ae0ajX
+Uizic/UD/0TNXtCRfkS4SeVSkZXarb1oZjHdGlw6ENiLGiA0e5b4r0rByW4EQQGZ
+Pvg3DFXMjqp0lVVmfmXFPggLkbTP+SJ1/VGSC/wSqPkMiKSCenRqwHwWIdKxv7f1
+3hyeTZXR7P8uaSddSXaakqmT99v6pdZOo8NsVQTx3PzPKpEVciPBtCdMaW1hIFRl
+c3QgKGRlbW8ga2V5KSA8bGltYUBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOo3QML
+CgMDFQMCAxYCAQIXgAASCRA3yrUft5ED+AdlR1BHAAEBilwAoJGWPf8Pesitjoqv
+zFLPwO+EsydjAJ4kNnkh0+QkOBvDz72Hz2bnjSPT07kBDQQ246j1EAQAp/Ccn5Ez
+xXIGljKVKZ5Pp0xJA3uBoQBvXzu2pU4HU+vmgwnX1313x+4BsHVEbw7+lfyhKnDD
+0TSwIAHj/xeE+jraCTU8X1iwe49eAyTaWF4wTyTzdZKQ9mrfBnFgdWlRjLALcTMJ
+aOE2Zasn8wgAEHgi4QWyBPS1il+aFE6oizsAAwYD/RpvJnfv8VqfbCxOYt7meLfT
+LrvcPlGNynv1nEgNgjbYRGIRzbXDDz+jwcLc9MeNuZgtaXvUbsQ8s0X1dP6vq43V
+mQTQPlU1TQx10o+YYn73ptyhbwOkyIDGmyf6uFhO0+B5/MY0KRLCxo0lwMxvVkYN
+d6k804pSJPqwusWBm2R0iE4EGBECAAYFAjbjqPUAEgkQN8q1H7eRA/gHZUdQRwAB
+Af5vAJ9dQMc2nMpcKuH28xwKl8r7MP3pygCfWHGKFHWIDkUt8RfHAB9geauEQSKZ
+AaIENuOqZBEEAKLUF5GqBMWJQtBs1t1Sp+NIOGuMLgJOhINbMU6tk2jzeUt6ooNd
++c8P0TexsbSETwhrU4ntpvIISb7I8Twhcled7bi5KCABJOzz7Fw+Ydxo5Yjm1DQH
+7+gEtPx3n4AjZUfRAN0nqcFizDpRYPqVaN1QYiGWn9yPF3pubQhVn8zzAKCpx1LU
+lQl2e5t1YJhmom2qy38EeQP+IB45FBfDf5KKtyS64alQ0vHYIssUp806PQorw/ZO
+uoiscUQj/WeZ4vn7rCdu60uR1EuHpGp7n0t7igEgAOcxDjrxJmpgSdD79V+oJAFL
+ATo2msj1IklVvJeI7ZsImyPchIU1lqn/GvpAam9N+FiIB1KUMFqTJzc6zUn1Qqag
+1w0EAIiRHPYRW8ojd9Uh4Ed3X0daAnClyMWL82t2bj/bJRmhupQn4aVJ5D0pFB9i
+zTiJEWciHpqiMdsi/zExYYIDS1Zu94+WFbNIxyMFfHrJ5fUQtAqLb7E5LrlxZONU
+nrRwshqR4X2TmW2mz1Wop542eUQ1UWp4Gr3VlH6giswY0CnQtCdNaWtlIFRlc3Qg
+KGRlbW8ga2V5KSA8bWlrZUBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOqZAMLCgMD
+FQMCAxYCAQIXgAASCRC+eUhSvlz4hgdlR1BHAAEB8SMAmwR8MsDEfj2z2V/SeqUX
+i1x+Wmv/AJ4koI/qJXC+EYh0K74Nu9/rPz+wjrQSTWFsbG9yeSAoZGVtbyBrZXkp
+iF0EExECABUFAjbjt7cDCwoDAxUDAgMWAgECF4AAEgkQvnlIUr5c+IYHZUdQRwAB
+AZnVAKCoa3Ps+duJ3n5TKUcCfjRvClcTsQCbBWapu2wbWJZa3XE6jajJOPS3wTm5
+AQ0ENuOqfhAEAKZ71o2OazL8PS8vMRS+PaRowGBW/cxYo74BuLTIqyN0/RAS35Si
+yfJuClqEaE9njZsvyRix8mY73mlYfE3qw1frsWZBBr7+9Np8/DThJUE4x1h6MtJ+
+qaHIuhcYXyXdW5zowytpmRLnxEDUp9j4QOOoIwi0UwD7sC6YrUki+bm7AAMGA/4o
+/SkTuvfycd/lvQ2UMViEAYip2B1a9brNlqXaU1eI6QqiTgjoAf4ZQZgmNQtf7abA
+I9QN2WWpiUVlWaDaJJEXiLWS13xmnKaxm5po3IPPYBTOVd5xFDQlP5ptgUFqefIe
+DTgr+tHRq+RgKhw8QErT5N/PM28RHchbOewj0OGSbYhOBBgRAgAGBQI246p+ABIJ
+EL55SFK+XPiGB2VHUEcAAQGRMgCfdcoqwoaTU7rNH0BWaYUfCrQ6TnIAniN+yQaB
+bwZHMbSaDTBRndjLglsKmQGiBDbjquMRBACteKaHZ7pcM7Quj8Ec8Sx0fJ3u0NdL
+so5xn9Ek4FWMLBu6jw7b/5KjB2WtXOZSWKHOzeTfUAx79NMKJrD9jZW/0kEAFVeZ
+pwZF1l8fBsRELR9cxAajE3RvFkgCYAhXsF1Jno+qiU5TNvadGU4SzmP4vOnnjrIW
+Ty83mtZiwoFIcwCggaaaClE8Q41NyIfVtjS3f+Nm8x0D/icH9uwM3vpB2QV29IIB
+qazgaFr7vBoogFoAllaCQbPLiyHX1Mk3kEZg5xewmDS/tU4rGqj7UcL9OlZx1ICD
+8cp80yNYfoI7K5XM6sYOMmfJORGOEsqMtoYbo3lluDgDkg26DZNynUeFHZRrIWz2
+cKqTuaB3dw09m8sJNus3poEtA/9Q1KDsjKPi8+2kUzJoK3V61QglXAVDlfzK6B5K
+OEZ6GR/gX9M5uyyLjREybFSSNPlvLR11+mV4GR5AcrVQOmE0QpFyo1Mr+uDsbqwk
+zERvRq1r5pOyqM5WPXhlXa5oo4na1fBEX76IEzK6xIVG07GnNnaY+dlPgsLq4I8+
+A20ZG7QvTm92ZW1iZXIgVGVzdCAoZGVtbyBrZXkpIDxub3ZlbWJlckBleGFtcGxl
+Lm5ldD6IXQQTEQIAFQUCNuOq4wMLCgMDFQMCAxYCAQIXgAASCRAlsA/UMM7GhAdl
+R1BHAAEBmNgAnj0Q0x8/ArVTURIRhBLli2zdJFwCAJ0brkbdlbR2eGeNACF/++T4
+S14x8rkBDQQ246scEAQA4Zx5WDc8LoW2Ctmueh+iHNae6LoVUHN5qLUNnkwwqZ03
+r9Ay/V54egw5vfd9t+HADnWf6Q+6FqmvpCpPPHrZEYD+ArWbu+NTY59jFI7rkY3+
+tJRc3+QTzeNHse7HgyhxFdn7/yeCovskCPDUtl0nI6eIml5G+tyQ80L9spq5rvsA
+AwUD/3lWMCMkgBT+A4zC1upOBX5yYd7nYBrUIkRqVXzzIobzqeeoe4vjHFRNNmWP
+KNtsqV4kP8CHtHUHEGFIQPLxa5O6icRUdXFNwv1iKDiln87Nhl/l+SXV4s1pItvx
+dkxPQls/TZv/84ykCvb2VxqBrWjVG1a+uVTIhg5ObZFxPGR/iE4EGBECAAYFAjbj
+qxwAEgkQJbAP1DDOxoQHZUdQRwABASDnAJ47dL2Q5/ft3EzaQrldWSiLtreNdACd
+GNwpxQVBQTipOs5DiZ2gK8FTd2WZAaIENuOrWxEEAJVonskIQ7KNmZw9sG/oKumq
+pNa0VIXMHQcAk24hNWiwLJ7jJfJyx+H74Wk89lfwHo6C9NHtvHbgOaK/SYgX5lW5
+a6UwCBlrLtAFOrhELFoGcEXbKNzR/ynx/GeZccCbZGf4ZQIhB6IZhqA9/JiTbIJ5
+ut0V2nVB++oqzujHL1pXAKDjXh+4tuQHKzKJeDuwWcKhqtuYmwP/SEYSuwBYX4Gk
+aw08/OD2iLLMadXVimpUa7jCWBkCtiw7hJed0Pnda52AT5Yj241q//RpI8dyuAdA
+n1lkAtLFJe+2zURaq/BV5I0WXL5AqMcRxuzyBRu+6y3dkokPnkvnaeUIo7rjAvLJ
+JL0LrsUuniJNIPo4xpTYY7rve2GusXkD/2cXpN+6fD9bvU05je5z7Zcxlxq3ylYv
+Q7Sd9RPNOa7lxak7qBX3DgUa7X2Pgznm1/EcSMEFf0xJsscKF3ZpL9NxGMA+gCUp
+sd1rlYuf63r3B/Z30hBw8u7BQvAgaeGmrwBUUDa4aJkgfZUpuXJRi2Yg+J5YxdRB
+QAcEBXIex4ZTtClPc2NhciBUZXN0IChkZW1vIGtleSkgPG9zY2FyQGV4YW1wbGUu
+bmV0PohdBBMRAgAVBQI246tbAwsKAwMVAwIDFgIBAheAABIJEF9jVrptlzKsB2VH
+UEcAAQGwLwCbBT6UT+lNWMh/jxFu/m5Dy2qMwpMAmwePBu7USi6TWKaXYRSL2yyw
+JR0HuQENBDbjq44QBACdC1XRPM9CMFrgVUvioU7SShffLnjgWBZ3hqbOYrsgtXfu
+Qdv6lAixnNPdnk/k4mjL8w1pqbjUmfmbppVDxzsiiUQlJatzGDfU1gDc7ksnXpF/
+vzghbucy8HNO0SHi3uM/GXC574iZ1oxa/A14fKnCVYT1ThqUa1usC5YQXHm4IwAD
+BQP/f4LZgN3dbL4jLqXHDNpAIEjiTbKXxDKHOnAof//4SE0mpaNVHLu3nxI57CtX
+fSI2kMQSm/3pqpTKzaBlM/CbMAJUanhmlLPARDcJ/hQcDtBsF5nFG7zfLfe0SBwg
+sM1HxL968Vva7WsbYpSa98+3HSDuy9VwphFp7i4HbnCbSK6ITgQYEQIABgUCNuOr
+jgASCRBfY1a6bZcyrAdlR1BHAAEBDeEAnR6sKjEq2lzXziIuSnmSldBqQMYeAJ4r
+ZZcDmBM5Qt+2Vp1dmfy02hczoJkBogQ246xDEQQAhBGYmGwmeI2L9tF9/9gatn1o
+Va3zUb3dbxaFXnWqr6e1QeBQ1jnljKizhcs5ra1L4rzM/pfXkV6xUE9ghBrkEgLX
+SYCwt8n7WtucYk+40EDZTYygRpHGj8m1dD//mOJNGVjAsNGcHO5owI92yKu9674k
+HDnfK1HCPB7ub8PU8+8AoKnZ2PUW0OO5tM3uQIXSjYrM/ATTA/sGKZDFfI/BLMao
+toddIQGyHzg5BPE8j3wFeCrTX3n8DUHX+k+zfnp64qWqh59RMdiFuOIxhuNlP4Dq
+O651/sDZRzLTcbwcNniTV/W+bOuPbj7rKAYFzFNWvQFrB6ILUPAbcuNCgnVy4XFF
+DwFgkMYjA+tRbkl2WfNbZslZ93Jc6gP/RLuIRU323GRIqKV054/VhwMIPwwzeG8X
+2RRz7WFuaKvxI5n8hgkDJA36P6Zhawu4q1n8X2mqIE1NcfaNYJOqV04P9ljEdUkA
+BGeSJUbrJyQwuzEeLYs88ErzFpyTTL3aYp7vNr/t+FWAJFKzsz+vNRvNSHIicdLL
+GvZJhv7yVu60J1BhcGEgdGVzdCAoZGVtbyBrZXkpIDxwYXBhQGV4YW1wbGUubmV0
+PohdBBMRAgAVBQI246xDAwsKAwMVAwIDFgIBAheAABIJEF0V4B0/8TIGB2VHUEcA
+AQEG+gCbBDRkJiuJ1K8HG7We/mr+Rg0Nk+MAn2CWldqwbU0fWlk0UH2TkKCJDRfP
+uQENBDbjrHEQBADeYTvnxIaltqV+9aElKlv00R1km8mzXOW60Nbc4E24Xh4hvy0C
+dZR47WaGULMltx/3nxLjQEcK8qOCI7ytJ5okLKmVEde/eV0yG6P8GjzdPELowtur
+lmy9aWC+ckGq8GyjqMgLLeI4BNTaWVXP69fllKezbhGqYnFY7xTc5IlQiwADBgQA
+lkCWK/odKM6+yUPwaiPL0yrlV2/gyAUI7kszey72oiKjKm/WXXzTZmdQLb5JaNgn
+tlTMpYkM1Uk2bhyUG36w0wVwX/kPgCDYh3WRAKHcwbw7+qe77E56D/gNm0vJesa1
+jmyrdysvfhlA5Klt1rmoHFCqIEIBG/xSnnPhnoMEoFGITgQYEQIABgUCNuOscQAS
+CRBdFeAdP/EyBgdlR1BHAAEBk4cAn1I/jmu7FSgglh9aPmVYAw7HWQMAAJ9PAPPX
+fqtwza6I8ttGPLYNvEAmAZkBogQ246zREQQAgcIj/Eo8PrIhEaxKcjc9dNb9/0BZ
+3BxBk7x9a7HKm6o0/vcfLH2XFjFxB4Ddfe+O1PC9KNUqIi6GTafGbyqS47XsnOJs
+5nvsrgmVpUUzAd7p0dxcc2tJodwhkH4GtOP4i4P9XBrxngQrWQ0ju333EPF6wLWi
+7qkVyGENCfsvktMAoKYgM+XYh9UQe7/HX0GiCnk3ExVnA/4ryBxdyBihj02i6s8v
+Ae5mlTrwv85ugouSB95XEX8GPfvaWIW/TpUWQ6a7o8YzU/kIPa7YzETYX8e/FVr2
+Zd33HAfeLUNp3OS0NvEbYJlGDfW7/X7qLVv1o5WCjCHUhK8DCf9Ax9b4z7CbRHpt
+xSE4U79NCCOsXQsObV28qlGsFQP+IIaCh7dTqADw/nBmfuXxepPKXS6Xdi0to79L
+fQtr+TUtJOEVGIbqqQBsgESFiT5qR0W7qhOnl47TIQyPQnt/V994QwyAGtIgtM5q
+YFRW70g1FkyDRX57PzTMuU2BjVI6mHkaUkLaLujbRXiQFm8IXJ4rf297GppKuSgv
+Ncr7Rmq0K1F1ZWJlYyBUZXN0IChkZW1vIGtleSkgPHF1ZWJlY0BleGFtcGxlLm5l
+dD6IXQQTEQIAFQUCNuOs0QMLCgMDFQMCAxYCAQIXgAASCRAcZ+wTPGYchAdlR1BH
+AAEB0bgAn3zNLK9DdG35j4BV9rDISiiwUbkrAKCYzKPhFiFGVcpYI85EHEB8I5gy
+1bkBDQQ246zkEAQAkaLhP+OtjkG1FMzSmwCd5DK3PMWAfj4uKBRcABvRAMA6TIY1
+9Yet8ckhLsDc1z2kxYB06NaBIptjKvOtrRJDvn9KQjn79Ll6/YWmSL4dijtw2BVe
+dsImshjuTgMAy6eo8n0kJRdzzxbEa8pXlvjmG2oI+dXY+Cr4AQgoPloZ8uMAAwUD
+/347q21Rt5jZtAdF1OGXgdTFDDiWBg3uy2AZmxscJzTLqWfUcX2+UThOXocj81H/
+w5q5Cte3z3zx2HTf1A1mw50B5FZOTg+BK5erpUMblY3DoH1u9E8pd7nJ5WY02Xoo
+RIHMxyrzuQA1lZnry8onYmKHE8dEDJ/HAavYkqRUXRL5iE4EGBECAAYFAjbjrOQA
+EgkQHGfsEzxmHIQHZUdQRwABAYiXAKCU8v6RR73fcsQGGQWKe6ixtpVCDgCfUZaW
+46Lt8G/NbxPkHr9fhkBqWlWZAaIENuOuOBEEAJTQ6NWgLfYqH91SNc903oci6wSE
+eF5ikUjNgcdNgmYUESMGP0LCulgaMZSan4FLbAVLn3M7YyWlAYsauaj5gYF2Kjff
+wfB2bxtp5Jx3Yqiq76haQKgEybZXHFtLczySrSmk27ZDkQQ7+obLBWtWl8EzeyIz
+eZyyNVofJbL5PUirAKD+WeCA0iv5jPYehT0bALAGL3ffWQP+NFMEC5dOru8AbZsa
+knRf/OpIwtJFl/CdmPbyHHojRIhPTJlTXGCCsCDNJsHbhedBJLFYxHYFlCa6k90c
+7SXzE+fkoJtijgL735mymvEReDT0q1Vww6xXqpOrjQ09I51FE0BWE45OD8YPSpfm
+v3O0Hnuql5+ang1/Lm2ajdJ6F9ED/2OR0oIutlGwT+QfnuQahPmS3ie8lbZfdPTc
+Ewq+ylWbdaN2WtHQmLTKLD0/TmwIwmp4Up7hFmt4bqLrToKK1mlEhFumN8wSrzfz
+OBQO/tUYXvOoJ51i7fqx6l+TPGP+yU3K7oDbUdOAxbGIGuQNegi7Ew8UpjNkYL6c
+IdeBba6htClSb21lbyBUZXN0IChkZW1vIGtleSkgPHJvbWVvQGV4YW1wbGUubmV0
+PohdBBMRAgAVBQI24644AwsKAwMVAwIDFgIBAheAABIJEDvb7bF3f77TB2VHUEcA
+AQGr4ACgllMIBb4leDKz61LQiA4TGWQp9+QAn0gF7rrvXtHdEc9kFQxgfASZH4RZ
+uQENBDbjrmYQBACJ5res4tXRZj36s7P4KZWUf0YC8mtLxxeNEXe5ckAtn8gMfcSQ
+J4Mei4O1EBvrKZ9Dz28Emv0FmDd66DUd4ybRIk1PN8kWry9UuGLAf/VBAkMIyXhY
+CEnB7wRsNj4kF5DhYiytep2wekPocZO2GAUoIyY2yMNb2m2g2K8UnK2QBwADBQP+
+Ixih3o+++i02Xwi4wOe7aro2xSeBmH9b8nEaJ8v8RVLRO0AgoR4GLzKeTOfv57FU
+48tlY7sxth6FOxeJaQkS1nD1LRpb3GUDZr7qM/yOGYp0WhdRgGW+c0eYa32g5ajq
+2zn3+H1L4yrmRSZM4nmZ5ZXe9ijkGs0UNYqmi0gBYxqITgQYEQIABgUCNuOuZgAS
+CRA72+2xd3++0wdlR1BHAAEBSdEAoJfp/f+ZWcSt5YKCitR1mHyGDUsSAKDsVRYK
+2fcdY7CA7DHErM6z+tCb4JkBogQ2468EEQQAxS2TgAmJc/eNoqkiFuLcHvdLZJnr
+usrMGSJyN6WnBaToud2wKtsuwhawN/x822KHSv0Cz7Zqt8CmQ2XC4IarVmU8YYYR
+/Xw6o/EW+eCFURsN1yiw/hsibeTobayAVsyXrzEAadO2RLkZ/Pje5O7Oc/N1mcZs
+iM/S4GY99mToZbsAoOGLiG27Gvdj6532XHVtYz0qpS0DBACJFgebrTlFlUGR3OV9
+jHUjCCf+XwKGrcyw+t8EyyVqkGerVqfb+cRA+a4h170LoAs3W3TcMekqifHZeCNh
+XPymC3LYVTu3FJKbYQT73vl1enei/hN8PUrGSw6XvvQ8DOLEt82E9bWrgDZwSu4a
+A7vioRff98BrUnSdEoOCYD+aBgP/ZNJkoJoUehzcgdCeTKCYbPNk2lVlXb7WQgHx
+naE2j1XzU9inOVhXxKUbnVqNbUbd49y2Lsk4g/oyq41RthHhM7NnLUOrj5WqpkIH
+p854govjQgooCgwwNgU0un3NxP6zr7oNM8fbt4TVYS341CMGCvah8L/iIBT+eYBi
+ajjGfti0K1NpZXJyYSBUZXN0IChkZW1vIGtleSkgPHNpZXJyYUBleGFtcGxlLm5l
+dD6IXQQTEQIAFQUCNuOvBAMLCgMDFQMCAxYCAQIXgAASCRCl5n9/o64+oQdlR1BH
+AAEBr38AoKHr1J9mnwnVtWy8G3EbOZGKzNRsAJ9OGOK9eQO8rWHTtj2sUpEieIJ+
+TbkBDQQ246+AEAQAuHHJHT4loEDZBrwJt6vBcc0S6IOvP43374/DL7fvl0ODYpDt
+FSfHs2JFXfrxt7+UaB0yEsp5jFmWY0+emhQ0g2TzpELNhtKmYABIE6cwlAXZZ1Av
+Gax0k0kIwp+x7UdnKWAglAZYj7WrQ70tzHtV3UXwYV4m9OEwdHIug68xUJMAAwUE
+AI3tEdSDZvRpGSgM0xAovpVXou8G15J+CRep/a9Si+aFC1RfGhhzRCdU8I+5Lqtp
+GnGI3Pw4uCnREkU2TfbM5WZza7rwHfSShyIG3srHp3t8kYcvmBWql5tTLVgncMGg
+4g6BwwEqZeeUbbgisc+rlu+6oa2fBOhkQ64SPdkfPA25iE4EGBECAAYFAjbjr4AA
+EgkQpeZ/f6OuPqEHZUdQRwABAWsJAJ0XijmoDUP1Iu6lhsSlmGOiNO/l4QCff5G6
+w6Vkq8d86Ev2IwS9Wf4uNmaZAaIENuOwChEEAJDhTfBph5G51alEDUaIfFvD0K+o
+XDXqDB7hDg3stVIpZR99d2bo/dPOuVWorwXFBDJeK0c7iJEQrMWKlxdqbRGkH8pa
+FSnL5XWo4xMjknqnJzYu3gb734ioFHTC4WDM2/voTGuFpLw+eirW+wl12wusHpnN
+kWxMEIWt2HoGTerfAKD3JUBraePb8gHKnXFzyEu8RLp3swP/XaAKje+NAYeqhcAq
+xv2SEPUj8EMgtX7SDkkyDv8wuRfcNwMAt4XwHYnnM3bpUwWj2JcDGE9rsNna/HuF
+Ajz/2lrhUKncH0CywvjhYtt1t92j0cPZaeR3pY8R/bm8Ns20tiP7uxVlj+szI2Pf
+5KiUHhiWHJ2RTXGE2pUmT6UFhc0D/juyZvINKwkbUSSwpKvsoi15d6e4Wx5PZ2mA
+rT5y+ULitBx4WKIsXV6UVVaEBNaBe63k9cFGdPEba/HflSd76kLmcSdy+Fr73d3T
+MIrmwAKMVdKjRAEc3l87YaPd2/LdT+TWzCQw33EotexJ7yZzZA2SJx27/jyIgXkW
+twvn5UCMtClUYW5nbyBUZXN0IChkZW1vIGtleSkgPHRhbmdvQGV4YW1wbGUubmV0
+PohdBBMRAgAVBQI247AKAwsKAwMVAwIDFgIBAheAABIJEFjLmkyFqB84B2VHUEcA
+AQEk4gCeL5zcIOEDeTY+nYJaAFIVyxMDn0IAniDLX638/CT/T3nLVPqDevBFsTTN
+uQENBDbjsJ4QBACevTDY5y+VRfsTy7YLx0kYiPvBFTmoNrPGHS3Dnn/Jsnf8rKEI
+V+yvZ1nYTtnDpi9zW7dZNN/zacfhL78gkVIj6oGLdOtzBW23xdrc+jtwjM29LRsG
+Gp+Y45clziKFSUANHYm6Sb9AL5/ps7whkENav/sudPhLAQ+E+hk0wVvrewADBgQA
+naSI/d7XMz7MSjaLaOQ6fLUiDKfSxGK7DQ5dD0HrnrOnTYbmq0M34heGAt19CqCr
+JZyQ/gEsMng21CgQz8yvb/uiPeHTVeltTzpHVAVA5eahbDervKoRYjB84GoKVIXQ
+DXixd2NDBp3JptMWxbibxmfmMtb7Wwfg+tWMeg0TPgKITgQYEQIABgUCNuOwngAS
+CRBYy5pMhagfOAdlR1BHAAEBCJsAn2CeDRsh/7JwAcaMa8rlXIi9wsrvAKDLSGdt
+tgPGpeFytA60KiQJyGZRfpkBogQ247GpEQQA3rbWaPIEzk69ZyV25ObCX7lUkGjJ
+m4C6WaTLN0OwvoAF9F1/kP73Lh6fsFdjatEuL/sOSvrMQxeAPFA3/qvhpjSjAOVN
+u4ZHA0LxOPBGFIIXHVio1nhcJpiTm9CjKGrXXoeIj0+I/KHBsPotM+qP3tMtDlVr
+FLyKqeImT91JZzsAoIDquRnzyTKtyt3DQ951OxjkfHtRBADHIB9PaOvB2428KcPn
+oz7isFRWt+wjl/+uRRfDzjXpXquzK92PMiqmyyLCFg2sa5X5aW8jM/0obg3TVPII
+fprH8IdPkTc3RD5qSQglSTnWTuOnLnYG8gEK4h+z8rEm4uwG5qZzJe5EK7oQGVly
+7Zx9XtZCqLweN2t6YfMBeJKLcgP+OQPGyyhJib6av2pmOlYw5xrMZA448NjqFW7f
+LC3Ro6YGp49378uSkYVnliyoZrauOLR/e5uGA5hgh1WvyInOGgzzDL1D1nWmOQ8g
+nnq1Tm9yTdaiwu6OcdhwbfERO3F5zyZeVSsXOKs8rOW6kBGGLdnT+HCaipNzo4wm
+5ekyfvG0LVVuaWZvcm0gVGVzdCAoZGVtbyBrZXkpIDx1bmlmb3JtQGV4YW1wbGUu
+bmV0PohdBBMRAgAVBQI247GpAwsKAwMVAwIDFgIBAheAABIJEKlMD3VlMkTWB2VH
+UEcAAQEzWwCeMxscN9idLHgH2DP2U6tP0tNR0T0An3lfFgidO+z8ZeHXzuOM9TAS
++jz6uQENBDbjscMQBAC1u+09NP46dPnn6RJtczL3LEroyrcPmHOk3FbiNfJ8YMnF
+BeST+U++chi/kKzm+N4y8TZE8sHwGqnkeIBtJX2YmQJFhKi2RR9AtVn2HV1ZTBYT
+1q/P7MpZTPMI9EODlCEPJTvX+MdtP8xh0Gsj1i1wujQOJAiXdrqsPxen4Sch5wAD
+BQP+NRROzLFq4kBUpgoTyvWzJl96Gdykf+O0AhbTlZ7ix9KtQLfxGrqzgo0hwDjb
+2QzeWHfjVhaaaSc5UWNMuIQyHRcsj9x4n25XGE0HUyOVSD46IOAjfZF+beXOa/Nb
+YcR+zzORfXr1qyW2g4oV8LN4s4uV4dPamQ3l98Lkg8lhWCeITgQYEQIABgUCNuOx
+wwASCRCpTA91ZTJE1gdlR1BHAAEBzpgAn1mBiOpDetJyYLCFzciHO3YBMA1vAJ0W
+5WC8PZiHyWy6JazAsMWs2wOTlZkBogQ247OaEQQAowMahswOo9fdIojf9byb0uY2
+C0NR98cYc13WemcYzyZLJV9aMRagSDYY8wSZ1ff+29RRXudPPTYgnBlFWWtsQ91b
+vp4i0wBjU0HjcumNBOsBH76ZUCyW6VRjprlXmckoRzQio67GRbUtZq+6NfUlG+UF
+kt4GR2mxU25oYm3BQV8AoN+qhlQJxnGc751ExqUct8Y6fs7hA/9qkyTaZz4YnCkp
+LFcG+hCRVx+5kEmZcm5QJzgFRTMdfRlIo1uDFj+RVHXE3eSsyA4JHp0Swa6QiyBV
+ZEOP22j/4TogizpgqEbt8ZxcqETzPyZ/eEMtyaNsIoMJIUFPs8jlOQvOUAQ/XLZG
+2Kf9JrvW6cZmE3IR8A9b93V1FxFWowP/ZZxM9RoiNG8CqZvFSl6dGGD+YXmvCYeX
+zVW9UFtkKhnflzR50Rkql+bJhsq7PsaGMQ/Po79RYZhmkr/uvp/iQVSuE7lq0KWd
+HIGS+Y2Z19u0zmF3mOHeWCoBPu2Tue08AiHxfz+qbn5RpvreRnBcI+JJH6ITBGnj
+YZtUvsX9vau0K1ZpY3RvciBUZXN0IChkZW1vIGtleSkgPHZpY3RvckBleGFtcGxl
+Lm9yZz6IXQQTEQIAFQUCNuOzmgMLCgMDFQMCAxYCAQIXgAASCRBHr0tpYfBHhAdl
+R1BHAAEBzEkAoMA+KfY9bA8EdfvWwa8zUM1SMs5rAKDS+6X3HVuCaLtVxzXOob+D
+KbB7b7kBDQQ247O+EAQAh5FAgdvaTJL3jBGcjYiiJosxeTWf3L/dUY99fZN8R39D
+SVoUKf9Rt/EsS5DywXVnKAeJiUTYw8lbMRVF70VhSDHpMC9KtbB0lk3CcAqULPiy
+irT5g9ywN24W7k0naWIJisttUh+Hqbm6gc5Pz9Nfd5ll8x4Ehi3lKE6Nze3gUNMA
+AwUD/AtUN1hqwWTTphVZctHq3JaUEb9agmu/Ocsf24/bq9i8R8FaMwBF4fI5qIim
+cqAM+2BZ6dvZEdqrVaZR9aHjzchcHmaiI7ZmW4gmk+LHFFWf9y7mG8YDKFBXkaBu
+JpxFb1FIfJpmaLzJmRa76dLqI3A7H2E8dFQa/MGsYCa4NmILiE0EGBECAAYFAjbj
+s74AEgkQR69LaWHwR4QHZUdQRwABAVPdAKCcyVECIa28vmUPgZ2jkXQoQ/nNkQCU
+DpGL1aZn1eKrDlHcGyD4CzywnpkBogQ247Q0EQQAvVX9TJEynPJEsX3X2fGPPDiQ
+K+oB7D1INI9bfID5NKtoo8qybivOLo85i5m7RUiEyhX3E9lUg9buKmtIhas0sJ8s
+LURmCndIKtXjIWg3Kd0pmjE8q2zyd7ChQ3ffJ20875wNbR4GQhSO1WTuxwRoL53f
+t+9JTULJxkQRf71Azm8AoJZQYphKeLWrLtFjb2WKbYxst54tBACS7C/Vu40euIev
+p2TZHTtY0U+ObFvJr8jDrdQZMkUFSuhti7rfO/bf7qTwmCvv6IVmn905ACh9bnKw
+ZvcR5T1yR2b6CAN267fzriZhu6/FG+9Ddr62ZnV2rP8Oa7uxAXCnoovaafKYupop
+vHV0z0tUf2+wasrQdHZTvc0pfY+56AP/WOVJ0KGzP6k9bYjYSRJ1MJb70wdVFiHd
+lIlEd5P3jQsXOyHVMrWp6qH10sQLto8gweWJr9aHem0QjTNSTVpzp6laBHf7tnLE
+wCJGeX5f5BOh87akRjwfh9J9zW+DBrtpqS6vjlDYU5y6RGbGRl6ndtXhV5FpE4cb
+Lax/pGFWEq20K1doaXNreSBUZXN0IChkZW1vIGtleSkgPHdoaXNreUBleGFtcGxl
+Lm5ldD6IXQQTEQIAFQUCNuO0NAMLCgMDFQMCAxYCAQIXgAASCRDe8Pe47Gfb3gdl
+R1BHAAEBomoAn0xuW4iqzyqN3WU6SPnzELkrjzZsAKCN5glp0flK1eZskwbDZkPb
+3J6/M7kBDQQ247RWEAQAz1fsQzEPDc5KqCcjvpa4gFKwjSAX9Sm3OlPyDwBjqBA9
+WFT1+BAdu7tyvxJkVXd3JRUtPOQ2ruaxSK93f8V5y5/vsKkoEKtCXOy35TKSI9D9
+tPf6CrejAaL0wEJ95TaXnJlnfKMYiqDz9efGYJu4i3Dr0U3LPv6dCgMzbxyL0HcA
+AwUD/AkEuPFdepYVjkl1ertyTrpDHlgcOk8fuzNQqsgYoZkfGTZRehTwb1ZF9DRV
+VB9qiZ+cq+j5sUMUkZwt8ghMjwWuPMaiHYrc8pzGxCJDVKxWUxPdea69JPTK8Mzx
+ri32j7a/zIsuASNHZ2f+VOIaMT8A26dGj1MEam/Pk/Tzk2bOiE4EGBECAAYFAjbj
+tFYAEgkQ3vD3uOxn294HZUdQRwABAf8gAJ9fC4NjVwHWOh1tCxLq4dF3L/M5VgCf
+Xj4izGMaaFuZ7+IOJ7jgFqC/yiyZAaIENuO03BEEAK1KlG4lUzMSYafGwOLzFwMw
+ri48rOAOOAxPrkRW/QBrGU5sPxUzxEzu4lP9365cmMk4CLyNswxdUsB1xtOihd8i
+LvCxejgjNDdJOypyqcPDNrZD4k/g/ADax1OXde/Hr85uND8jQ8isUhjZSBtTeDCC
+hbTXTJWoS77vdZBtOFnrAKCz2ucyEr7F/hMPeTNaOELYvImB2wP+MK/nmEcsD9+X
+m/xeVfWzi1oVphA88OCh10O1fjieyQ+Z+OEuSizysCKIKIQ5T5q8Q0wCf2ALpAKV
+CLXd9JK9FKt+EIBZLQLKoAj+wuShDNU08VNuU3LOKI1B6A8jI9eBArokwj9GRUSl
+Ir6KYI4EYRUyl1VVk8kpENIPUg2iE0oD/2tBclzEFGCY7gexgOq+FOkJyB7MUuca
+0IJLIW+LadjFVjIapYbHzi2o9VmfqHtA8SsNDt2Ckx/xAM5jXpSnDG7U3IpS2iHS
+OZfmJWpv22Xu0L2zdrO9ip9j2Y7WKjt1M6sNeG6gCUZdHpJXjHWUTDMwLKLq/ojV
+Tx55aHV50NoMtCdYUmF5IFRlc3QgKGRlbW8ga2V5KSA8eHJheUBleGFtcGxlLm5l
+dD6IXQQTEQIAFQUCNuO03AMLCgMDFQMCAxYCAQIXgAASCRCJeabFVn+zSgdlR1BH
+AAEBt08An0PRqhiMzF+L37DyvcaVl+0zSrmbAJ0fL+8D5Frcp1m3YtBMpo+j5dsi
+eLkBDQQ247UFEAQAxuGlBvqoDkxhIDgFZzdHJO+gJym94zgSGHkBmBIBf5Q2G2O3
+zkN7SIENI16yg9cxy7zkTbBu9PMgzUe/UuQov9Z6YXKzTj1jLozrGdljKOcW5YRv
+libo7eKXDUkSvT+X6J1BOIVexl05Y4Ncmf7otNDre29QfK8gGBO/bdQd7L8ABAsD
+/R4Nq/JQav4/7d5ETuMZddPAxV4kCnY+7F7oJgHDKJheJxt49rNtfXSxBZUsJ9P6
+Xhr46fCRT33DD1P8RyUmmS3/dJl7H/qR3A1rox4FQPWAuk4WGhsfSXvlZnFWKJhC
+8TZzFisjiXjw1OFYiF4TArxj9D7d/cHEKIi43rtefpf+iE4EGBECAAYFAjbjtQUA
+EgkQiXmmxVZ/s0oHZUdQRwABAeyQAJ4oZGFj58YW1ovUlDGgd0M9En7C7wCbBBq7
+67mk9lz1SsGvRRX6kY+lj56ZAaIENuO1UREEAN1QBnOE/r7r1V3JGuBE2i2i5S9c
+TojyHSTFkVlkOtAmallw1aRQcOqBtgMn1GYh4S5Zk2bLM/FIVy8P1EbD0qYhm7aR
+lioi7ODgqo7JTdJR83JxqsRlgmSYsTIGWuQ3FmSY8KnVxGwwoYJuFCz/+/oiryHp
+00DYRaAl6/TLXaBzAKC6TQpkipU7tR+RpVpmEyvQJ3Vq3wP+O4qdFWIMyL1ISNIl
+nBvebDX7IQKczy+sz4CgagAqILP+fw30Z/YNOwXLjIoSyQ9DyzT1Zzl6kEWjeA2u
+4y7iQOd17S4KaIMRtPDOl1Ipk7nH3KL7tvf24I2SCgOXPCidpc10ifY2cUqMvjtO
+dX+8oV21JmAtb3Ta/BgZOvUCsv8EAIhzH1N3Gwn00zJooPswRwpB46s6q/8yrUfE
+U+QMEjiFNmlCIh3VdPGqQnpQcPD2xH9O+07lgqtmMg2SZoFkWIeXHWjIHQHe7pdR
+Utchz2WLIXKH1o4F1CR0eCPIjwrOTpnR6Nhyt7lNjjN+mUBkqRQOVjdTRJvRrTEg
+aGCjdhEQtCtZYW5rZWUgVGVzdCAoZGVtbyBrZXkpIDx5YW5rZWVAZXhhbXBsZS5u
+ZXQ+iF0EExECABUFAjbjtVEDCwoDAxUDAgMWAgECF4AAEgkQnu80zUsRsl8HZUdQ
+RwABAUkEAKCUUXvVByh4l9ohXM16up6769DYSwCffVvyOW9v9kENNcHvItZnEmD1
+o+O5AQ0ENuO1ZxAEAJriuUXEtM08l6eko1tvlnkCKSZyQ35S9PogXv/90gA79Nal
+JsN41jALsRvgnAgKZLJddtlfZ6RB4iwuENgOva6C0bG8SgT3m7rLX2nSyaFWKj7L
+456wZWn3uRnKxT5ymxNMFemV8f06f3kg4kJYneJVs+Sfs/5jeyoRwDc6EQG7AAMG
+BACTuX5AknTcJIrBV83irJVsZvWKHtUzqLoklddYXsdI/eB6c+cBlhFxe8/hWw6v
+uFdFKhpCsWhEbJehzFjZCJo+ezf/YdQtWA34ik4poObWaSpnoV7ZXaVhgjQ2axNE
+WrKxQihDVYRTIaXOJAJ8eq2wNPi4UbyZL5HcWO6SlP/2mYhOBBgRAgAGBQI247Vn
+ABIJEJ7vNM1LEbJfB2VHUEcAAQH0XACfffuI4IS7cgh0PNghr/0v3L/NhncAoJNw
+utmN7kkv9n/oPqkByzLxvZt4mQGiBDbjtcsRBACBDJOGX9C/xxCVZNP6OHz6cL5v
+M3PimUAhV+9HAVVPQViTnFKrkYPSQyRfWzjOU8RO1Tp5CHz747oOb6j9P74yH1uy
+78yFg4UuhXBWinhuCKKq4IIWwJkCKBFr1U8fu8a6Y6NcjqiDA0KmGRJrMPmXenXk
+JpFGHG78rUvNi9IMfwCgugzNILh/3XZCZU+BUPYeXL+nUAEEAIDXZhj1vFXHgi9l
+mijKDjJocEBoamN/taQy6Ox1RRD6HtfAPY5TER1n7xm9hMzE+Ov1IKpH/E872Rha
+1qu1v7eOa6eTuNWF0NvmSR955freRsNuR8JNIb6StI2ER9pzBUfjykC9pg2wPeC7
+wpQJIF9TF+Ja1BvG2I+ha2xJ786AA/sHEUvAOsc58YbPlbIPyp2JdEHvXTRT2NIS
+VRuTMQsg8vV99nMYR2CUh270uPyy2xZaD/kYcJ9/1ngY7C9pbbNWoV70PkEMO/qj
+67OIViWVPzUhIdURorbpGhuc3oBzUxOgial7IbISPRItDgg2oZoY4hqyQNx8Cj2Z
+ZAzDpM2vCrQnWnVsdSBUZXN0IChkZW1vIGtleSkgPHp1bHVAZXhhbXBsZS5uZXQ+
+iF0EExECABUFAjbjtcsDCwoDAxUDAgMWAgECF4AAEgkQa8R3gFSs0kYHZUdQRwAB
+AUDrAJ4lTJHO4VuxnS5C6W+mA4hFMtMqxwCgt3cidUSPbSl5NRDlvY06KZJecrG5
+AQ0ENuO18hAEAMx88MFCgzO/nYyaNvxJ1pgoo3OoN30rWhjaFwxKL4twdqD4okU7
+IoF/dKgeZxT+8IQ34vJOCWNhIoOYR/jBnb54t+oWBJ0EmnbGbnmKH70IdeDd1fH1
+JseIYkIjF8loiyc3PdWYkY8MOMGVp/+GOX/tJm9H4wmlUsU8aOPu46FPAAMFA/9K
+C/Rpt4JdV1VfAYSaF1XRUOjzfchBF1G7XK35AudZEwZNjWhBqmwfpAvBhJl8MmXF
+uwEDe1+opK2lFJt0Y01Owr5Eh6GwZ12LexYamVEable3kqmRj+Zz+0sVpgk0yoCB
+9ZBwqVkcGnsShYyCJGIMlRarRMfXBEOg9pFz4fkZ2ohOBBgRAgAGBQI247XyABIJ
+EGvEd4BUrNJGB2VHUEcAAQF9YwCguRqebBzPbFnWXjOqn7ueBdjsDEAAn042F36T
+AKQETj5I4YRTah9HfMeRmQGiBDunE88RBADJ7pHJpvdSqmL2oVUHWGiPxr//5+GA
+1i+wRzXQK1NzANMY3Jopsp0euyiF3bCrv5BFXECbx+q5ci9ifgb0aKcR0Zk/ieBS
+nUI829AXSTKCs8QXf792cIp1tH45b012m53J20Ttyn7A+gXeRRb/tBzhX1CU0AoG
+uWLTWK0GcSM+YwCg60xV3gtAAUYUDQQf8pto4iasw0UD/2Svbe7Sl9hipq3Z/LBX
+nN4/YdUDZw6D//Nsa12UESAjbrDARIT8w+zgBKNFYoKc9k7vvsFnIu4ISowgjKpo
+GEAxiVZlWyYK6jPuFoD0L+4w9kP8kVIZZH+/3adEjRV36HR8Tjg93eRY9MwTH6ay
+pXuerx4yA36TcGs/JNl42TMOA/4tb9FsnEi620lnAmGr6lRHmbZCeFDB3I7I0M9F
+ayO0/wzJjHmKGqrPK8x5QyRrk9jc+EN5MfKWP5Uy6ZOp+mmKux071x2Ul+SdPgJ/
++1YI91Ch/CrO/zf3Tee2SWOefupZZkJKYPz1dHHUDQ0mynlWJHgOLSaw41Yho3vO
+oemU1LQiSGFycnkgSC4gKHRlc3Qga2V5KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAg
+BQI7pxPPBQkAAVGABQsHCgMEAxUDAgMWAgECHgECF4AACgkQf/Iwv51WPlYg/QCb
+B3/W8gBLgzhAhEevTQJtfDdlnaQAnA4mjmgN4HdNTJHRM+eLaChSKTxGuQENBDun
+E9gQBADtzp5/lES7jzbBVc+q6yFnpyW6cxmE3TX+5/ZABSF3xQCi/Jz7XZ3uMy+l
+EHBwAAQzgHeIAiPbUEjx0619bUpcwxdsSS+bGxRcZGjdYrwfaIePk6DFxBjThwGf
+UkYpxanQaLc6/OM4P6xlRU84UrjJDwjFLvtTQihieAesCCevywADBQP9HuyaJunf
+cD0Pi2Q0QSu3B/8hvmJauYsZfOgC9xEWS/yVLlHuAdolT8d99bGOBuaQwt7Kr/BX
+JiLXYrXxTvBWCRTFg9g303W7RlOF0cIHegUN9fdgGi3MMo86bhDK6ZQhUI01dDnx
+BaIEXIT+MeVBseoHcl0Q4uZ+9wqkJRkuHq+ITAQYEQIADAUCO6cT2AUJAAFRgAAK
+CRB/8jC/nVY+VjuDAJ0QtU4XC3frnCt7jNDr2qi+CAdeBgCcDbwQ5jxDq17hEv8R
+Yrg2uWkc28iYiwQ7pxPZAQP/Z7JX/e7utktjH8j7Q7WkbcnaAff7PCkJWGpHE1mo
+1UnqCl6kssgTZli9RJZMdKtJpvTqBLxUS41QRz5+MQjtjOb2UIJ8VPEiXB61bCZx
+WLtX0kLGvi0R6k6Il9y2O7ymiif+aPYE2FqW7F/2Q5EulMbkWtQUaBWGXQkvANv0
+EhkABRG0JkhhcnJ5IEEuIChSU0EgdGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iLkE
+EwEBACMFAjunE9kCGw8FCQACowAFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRCenBCg
+zthU/wHfA/9PWfdy0flvORRc6/s7z4ZKdKCfTFXJ7jnHhMzYU+7j8mn/WWLYMh3Y
+zJ0TDD6mWZz/H8KMq5EqAf7w8vzPbfR9kRxm3VNBJRUXaklsDJBls6QNXMTMOULq
+s5xy6x4+lbDpENo6RpmN8gUMCQWxdfXhqt1eYyS1tC88p/RzN+06EZkBoQQ7qKLe
+EQQA2u7cgrIxZf9s7zUK/6/hh/2gn9dsJcbJlRNXLPxnZDuJ72YMwdJuUSj37ExH
+9fDqeMGYesuK0CRwlBcVZBuzGzw9nf2lGstZ1O7wqLerxvPb5FDLbnm2WN7VzUH8
+Fa7fJaPOw5wfxgNHSj0tEkM239PB4WocOBFEAxFiN7r3/+MAoKJmzdJ/HKVFT2qA
+zGZMiVlznfOfA/sGM5pCGx5PedXbDNcDi0L+2rYQ8A+2B4v7N+Fda1qGVZrk9lNx
+GYi7rGCeXP24LEbvfgN2Oqw5od1y+XfYKadiRLFoCTCOFO/fwLcs44sIDt4cN0Ll
+qKIflQdde6jPEsPV8hYZZkg9KI8YLZ64dmFuDsP2AfclOIi78D+Imgrh/AP3SKhP
+MTm25AItzW8g3sIui02Epy0JB71EIQbjASVHwSxyjb3dvP2ObnUuOKkL8/KBENcw
+JqNP8vpB1sX8Yd3hR0IjC+DEt+bKzwYrAlzqSRqCdHSfHOMvWvbK83oOmSRm08KB
+UEGW2gCMXHIkbrOzb5wjhKciiRG2tJcYclUwn7QiSGFycnkgSC4gKHRlc3Qga2V5
+KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAgBQI7qKLeBQkAAVGABQsHCgMEAxUDAgMW
+AgECHgECF4AACgkQQjc2NGP7UxG5sQCePWDnb3MYe7QjwFT3C1hMWEvgXrIAn0EI
+UNaloyri8vclg3xikvuUJbKpuQENBDuoougQBACh6YePGIeo3sz5tU29hfVDn4Cw
+BCh128L+Rd5852HN/3Iwhy1yTSEqpavmX5UTLvJaVFn9h0C81RWF7Q1qAa7o5TpX
+WMtSFijr72DwUSFa23uq+LZ5JUTf9g2PA1VkkhaL7TYVrclBm4pfsAwEKA21kF4Y
+536+Mzr/oCSIzGG81wADBQP/d1frnzRuI6pujq3DMH+hNRh9KQZckjsLtTukKy18
+f2JSvnDEKj8sv6GelI/DKlBSCRAW0MHu28rmx5WCmyRum7OHnDlIIAE19wZ28ux8
+Af8Y0COhAqYY8Zqxqrb23sBvCxkmTYZn68eOC9IC6PG6e+4/KQGgnNbMkvBzbnv9
+ytSISwQYEQIADAUCO6ii6AUJAAFRgAAKCRBCNzY0Y/tTEW9ZAJ0XMOG6SmjO8MlK
+DiuKybmrPoDnzACWLKDApr6MxgHnkyRO5PAFpvaS2ZiLBDuooukBA/9r69N1QdSQ
+M40Ic4n2Nrnh8ntF/wXI7UhVoTeoyEMxx50R/KEmjTKdHeNoL8TaeWsqRLO9khTu
+FufNA7MWzXbUiYWguoZ6Z3AIPMgLGSKNyMe7+9/GJIeMzgf+ES8JmSc5toBvrKIk
+AAE0zgb5w9CCbplNOqQkVB0AydHWh7MK0QAFEbQmSGFycnkgQS4gKFJTQSB0ZXN0
+IGtleSkgPGhoQEBkZG9yZi5kZT6IuQQTAQEAIwUCO6ii6QIbDwUJAAKjAAULBwoD
+BAMVAwIDFgIBAh4BAheAAAoJEIOptNOKdysIOsQD/1YIs0R0vtkcYf5FSiNfz0UK
+VRghJfbhwefKXjHT5d2gF8QXDqDvu+HH293Hvqw9AxBoY1ynFw5dncC5f5UgDnVM
+Bz3S4ujIr+CL6DMjLAssRSIBp6+6mVBTsxLnrPR9CG1W8Er+qSTAoMnNGjp0cghX
+095vZVy/YSCFFb2sGrZ6mQGiBDuzYioRBADJT2TyxVZwVJ3PSdpWUXVZpx1oGAkX
+NpGIH3izKmO0PZfzXdUsbgrfA6bncFbP/MPuqDSB/oh9ZOKnGWDre2n8OQuVZ/Cx
+DfTX3E05L8BKm/c/BTXikwKhivJaZduTYADcKrcapYCvW2VLsczSIs7HPxqoJI8C
++U4COr6YnHRaFwCg1sgnVPENxCusaBVsT0eQ/fFahqcD/RXQqxagvzbd6yRwKvTz
+QliVrUzv04ivC0vD8pu2EaGyi8xgAONbgWhHFMYSQDiSnlvJuI6vZn5kIsRiKA1p
+taAWzOaKE8klAcHiWVIddyCZqHDmBPvisSO0Vxpq7mhXAhtKbrByyaGp8s4einlG
+8vUvz7WPQaN73PCNt/RD4Y9PA/4vZfnHVwhoRsDlkMbAjlHFy1fM23/pS9AMP23M
+La+vgkgrFvg3Z0bCc3MirCs/xHsyRPPS1LJhamV5x2knV0PlHTAHoGaGPoapZyDs
+YZDNkZRqjtnoHCfEya83rhxB7GJIsEKM8oSJ515kHYbQ50Pj67WIK9AWOZ4sMAer
+fDQhjrQiSGFycnkgSC4gKHRlc3Qga2V5KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAg
+BQI7s2IqBQkAAVGABQsHCgMEAxUDAgMWAgECHgECF4AACgkQyECct8vKuumUcwCc
+DNsPEKSgDH2bDiDyjoiSiAgl5WMAn2CmmieSzs+pqpEm1YA1baXgGSSVuQENBDuz
+YjUQBACJygT7QnMtfDnFUnixXdXu/vOCqTbXvmysKnnI4OeDW9QxTr+ugf+f6ROy
+kJFF75zq/53jgDD2cQkUjU2OWbrrqWF/aYHpYM21TDtIRfRe0llF1kSHPnYW2rjn
+Y4/AeWvPjToevxursEn1J3Ijd6NentxE/FWhetTEHSWE784/NwAECwP/fpxILkyJ
+UfPdNY5HqN4Aag1g0ZWjVfaWrebZDt0BIHJpQd8RvUtQnOzCOZ29KOQKS9LHOJOB
+2EjysCKTwBDYK5ZonQUtmhdwNZeoLYlLrH1PQ9WuhddjT6dJWMl2yJ+zchmDRFaj
+f+4AvrbYGnMbMdjCllnDcygSlzUt7KGcjuuITAQYEQIADAUCO7NiNQUJAAFRgAAK
+CRDIQJy3y8q66b5jAJ9ROwHyPzvGq/vgztzs4972gMuDIQCfeQq3q4tW3qoWyC/T
+OkvTSeUuzwSYiwQ7s2I3AQP/ZLwvhFPpbGgF04i7p6pLQxyZk7sgO32sOxe2kYbQ
+K5cdqMiCJKAS5jFfu4wew29u9XYlDKc/dnIqHKbnFhyPC3+m7YSk3T1lpOy1evIM
+zalaXQPZtJ+RuMRrQO6YD5pmkNeLHk2O5axpDUpk8VZ6t8kqsoKNEt7U4MGS8qWA
+BWkABRO0JkhhcnJ5IEEuIChSU0EgdGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iLkE
+EwEBACMFAjuzYjcCGw8FCQACowAFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRCfk5C+
+NXBwN1wvA/4oc01t7KIltGdDyU3XYwzA9Sfma6RZhv3MedM0XxHnEW6L1lIhHM46
+KXDsORumgiUXPVbCT1N85Ay1gPZT5Oy7/ZraPEMm7FLza6BjYuOxmlRj0dnrHu/v
+FmljrjGlYPzzNyoit6cxZOsbWlT/Gv6YJDLCT10UBGyh5GtlYft8cpkBogQ7tCnL
+EQQA/fmXfM8N93cmPNBu6nAWQ5MOev//CfIr8R9hGRH3FV8bO758gFLkHX2Rf/uR
+cyo8ZHeLw1cI0UfzC3A7TJr62MAoLBS2fn9wgAzd7KsnJFcKmpKVQqUX0EN0i+k4
+qnp1jyMCLNAVdTwVXuMTpBKEgYAI5xXNK6FnlmK4RAQ42M8AoKRDGHjijja3HLp/
++4P8/hwHYd8RA/9GjrsMfy9xynS2o99o7LkIaE4skJ7OYeJVfuZ9G6F7Q7JRIoTd
+d4OqHMeIvLIModiT0prmqRUdwEQS6Qi8HVwAsiUdNL9odleWOb380Ft6Qujn4zhs
+uvyt7S5/ctU4JPpOCokih/2D0jHzSMO5RPBKq7wQjkU/C3XSm09vsWou6wP/aSdB
+6Im2y47qiG9mHoUsCKl9CaJX6W+hl5Pto9OLW6QkYPofMs61hmzXKEZEl6Gbqhu+
+1rUd/35xahvh+hgjtRsW3XHcd7VrAPwkEruFgOM01q++sZg/4JXPDLVhAHYi7Xin
+vBsKAvOXvMGqhgByvyM9VS6bcIF7kgkIvSuodYy0IkhhcnJ5IEguICh0ZXN0IGtl
+eSkgPGhoQEBkZG9yZi5kZT6IYAQTEQIAIAUCO7QpywUJAAFRgAULBwoDBAMVAwID
+FgIBAh4BAheAAAoJEAQMJpyCUltmKsIAoJ5uxGMJtPAAGEBFidTybQ44Lk/AAJ9p
+h2WUiJFTUeNYbZa9YHcg1gk2+7kBDQQ7tCnREAQAvkwf0DiD1zbcqiBajDGZhDvE
+0cb5BUbMcuJvSH0FBXopIIniYcmnfu5q393y8WPc/rVrJVHrAU2RyHTAoX8vI14H
+vc4HUFDdnoj6Wk/xSiuYP8C4VN0NX3G+S+C4Pa1Er2s/m4X9PRz/YA0bMVynp7f9
+QM18aN++OpWV2jVBRd8AAwUD/3cuV7jHchUeZ7h6Upagzj7quky9o6o5lB///Pk9
+QZ5HEBQTCJDvmu13xCaaO9II4XFwjYntYbPOxOTJ1aEBKQubkUo0SIj8i5rhLTeD
+kkHB5M/rO40gS/MFNMVWqFCvUIQk7yBkum+MFcJFSEz7OMpL3K5X93W9twllqtUZ
+qjvuiEwEGBECAAwFAju0KdEFCQABUYAACgkQBAwmnIJSW2YNEwCfbPwQzlrLRCUu
+JM2inVLcz/3jijIAoJWggcMT69FfppDw3sA2h2PtAdOAmIsEO7Qp0gEEAMuvaXje
+qJDz2mAbPWARryInKsu+SJiOBsyNPdX2WIJTABcRh7FckP07IodeDPFGh4EgS/FE
+lDZRsMlL5SWf6Fj80JUXuyrbLNmvv0qUlDNVw1uJoeYulIypU1ZbuGSq+sDVyYur
+PDkXTlBfptMGII7Yuu+Q5Xk3CXymvDsQNbslAAURtCZIYXJyeSBBLiAoUlNBIHRl
+c3Qga2V5KSA8aGhAQGRkb3JmLmRlPoi5BBMBAQAjBQI7tCnSAhsPBQkAAqMABQsH
+CgMEAxUDAgMWAgECHgECF4AACgkQmwfivFMU1yHXHQP/ZZwHatqc12l6Pn9iawmU
+mFru8jnOhMJAzCQ/H+gUldmN9qsSQV0pFj+fP7NkNXEPOvkO4DS+ME/mHcm7JxDC
+4Z0MZbt4Xlkhffie0J6kwuiEuSoQ70lZQxbME3f+lBcNJTIhsTupJEsqqf3MaC+y
+tvHu/CcE8UkT9DPSBES5Qn2ZAaIEO7Qs+REEALaiacuS+YqTQ9Xrl462vSA6Ahvo
+hm6PUW8dg3kMOthEMVn0+fiQi7MvfDrgws51geKklPoHPwHKZs9/T7him2dcrHzN
+suh7e8i6kVGSXyLPLJUCnhklzxDnBEEjnXUG1uZQz306L/wE9oX/b76Yt08gbkPa
+33lYeep0bwvO4oBHAKCYAha4i/nB5MdV03XppOeOtp5UbwQAsCzn7IWSX6H9oYIN
+nyYBKOp1BpnidmsR878tzRHdM06A2lBGqF9O+Jt7H7vlqogX24LRuE7yw9aUTWKx
+iw/6UP+QEKHAR3RAbPv9Tg4rqyMDwHhzkebkc17VJyVSaLIEEo6TSkOl+tCqBvV1
+T5qq+z5lGzcaWqRYCkXEJu3Y32gEAKY2nu/lrMzBCHXRunNuMbhSkcIb8OplbWc4
+IDfrxw740iCsg5wh2GNzmEtPzwy3ay6sQhkGruV6pYpUii5Ms24e8ztSn85x7muL
+i1EhdqpExKt547wXz8ShXShP2Fst6bVfsaGbFU5a3kX/7BEMzzRrcSd6g85aCGWx
+a/Td6F8DtCJIYXJyeSBILiAodGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iGAEExEC
+ACAFAju0LPkFCQABUYAFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRAM8Ubp5JhAg8/T
+AJ9PKJJLVr4KwCetNM2FWR+0Ldug/wCfbgPT1B7WtvQMztTsJom49sc1rGi5AQ0E
+O7QtABAEAM1AVhC7V3EnU5XF7M7OPozDnk9fOgGpCh4HeD8Emuqh4TRVWSmCSA+Y
+qWt5r1L4TpV4QQX+vUDHet2i/IieIFKOrowuwiONln+YGToxXSB8tOKKr4p0qJ/w
+4ozijJZ6NVBmsGeXZIpu5LB2Ar4K3z3HZmwNSlDznVNwXJXNpfIXAAMHA/48d7y3
+W9y7jHD6QatVl68EelxV/x7BWHQF0JEltwHCKN65H5yV6IhUn84VNJazS5jVwYUv
+bmbQu09Ndm7iKX/Gfwo5EyPxGzbLl/W5fA3vn1USXJFX2Tk7wALQ5SAZHHbrluIp
+/660zvXn3E+466KchiRCdOfqFpCd3Rxgrv/hAohMBBgRAgAMBQI7tC0ABQkAAVGA
+AAoJEAzxRunkmECDFXwAn0NXK//V3U3k1LNXeU0mz6GYmaPRAJ9eRstO6/n170QF
+3Q7bkGNUvtPVdZiLBDu0LQEBA/933MLSz3/cCubVa6XR94o7mM8DSmT+Jl1wINBZ
+iqgx+W7Z32Pe8ioU03+2r0kOW9Re11zjXX0+vkyCHulWdJpC1ipuKHx9tiA1RtfU
+2uqq2B4jufbxLlb5Ix9H+4sKl0ZJGhyH+C+YrPa7umfJAv9Nybl98w/SCSCM1UZr
+SiT/UwAFEbQmSGFycnkgQS4gKFJTQSB0ZXN0IGtleSkgPGhoQEBkZG9yZi5kZT6I
+uQQTAQEAIwUCO7QtAQIbDwUJAAKjAAULBwoDBAMVAwIDFgIBAh4BAheAAAoJEGre
+QqJ0A/WJWGwD/2r6jQvyWpIQsyK0BwR7yrvi36BqhCA7Mh1ZmnQbgZhrHIdTrFQC
+5a3XxYA4l1/VYb6+aXPmRVfg6+VNAWXSh5UR8IS81No4mxSU8RqMHyjdGsrOHGus
+n6ckZlXtJizsJsXZx+ue4sxne9zTtiUYwDFlTlANNPiwpnSGQQGEarKWmQGiBDu0
+L9kRBAD8/PiBfF/3DoGsadZWnzFmpmaBmuyWi7wG7UCWVfCWf9mrtYgF54/wuX+w
+UvH0JOLhPeJkMunI9UwZDQiRAEQqxkVEN3EjAaxQ/+1ip3lPTi7k2xunLwei0QWb
+/i2rkotviOzg/tZOFYWa2MiEhiMx0rSQBUHszS3vjHfc5TVa7wCgk9GBkr9m4L5V
+OA+Pn/S4vttDRjMD/1CmsrzbOh+E8ViYqTDUHqdawzlAyjU8iCVmjwMwO+Zfohbs
+qwQMN3DeDU7AykXTQgjn5pawttY9Hkg3Is8t41XlwHZCrM0EiygrK2xquMi/mSIB
+5X0HS/LJkjCJegtF++OhM/VVPeWnI444b4fFk8Ndo5GyEdUS/Rz/C1+tvq/zA/9Y
+sYdeqAb7StJfEDla25vx+hcE2bKX+Wy2+RtEUQV9VSWyh+Bgs5S8kN+HwFpdcXp+
+j3+W3iT+QjJxtnlmAq0ugJblLiCYKNcPr8eDBr6vTjHSsiWXGC21lJ8ewg2zqP9Z
+vr2bF4pAPM/hhX0bDi8C/h0nUkFcRGWxuoVifo0TLrQiSGFycnkgSC4gKHRlc3Qg
+a2V5KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAgBQI7tC/ZBQkAAVGABQsHCgMEAxUD
+AgMWAgECHgECF4AACgkQcBJ6QSqLCEBA4QCdHAGobRtfv+IDDFpbW4rUqm0zQawA
+nRFFs5sBFUjq1/5zG74QHo0pY07auQENBDu0L94QBADW/R4I4DMQvkGlvP6jxWLz
+6TgkPMAAfEyxIJoZYLJggau4XJYyElmUGVFVH36DPE0453yN7j3gBxVbOCZamUOI
+NyehuBy8Gxom36Oegzvr/43TcNPTHZnVl9wJVCFmOsAR3L8A617lAguvUzlj4e7G
+wV5yCwwlNtBGO27Lq/dISwADBgP+JB4l+2Bdx9wMs1zVDGQj0BERtyHmwSVzLn3B
+G0pAM9wf6Me5/o633rOOQYl1mwmXXjUWZasmjegqWLUFPEkCyFMHR0CWWI9CdBOQ
+ROBFb6jK9Oq2jYoGxTJ4kCtMGo3z/pNsAGdNtgj5s0AgUIoQHw+L7u6XF8De/Sww
+56eyuKOITAQYEQIADAUCO7Qv3gUJAAFRgAAKCRBwEnpBKosIQNT/AJ9z794Z40YO
+apyZWN3NyQPI1zM0vwCfZIkY3c9J7WVXDqO+FlXWrb9L722YiwQ7tC/gAQP/U1mk
+j+I4eBCICqWjFBqJe84v1fmFu1c9sUw3wnVL7vxxHEEq1xvPgdfPlXQ6tMpcbtpe
+7nbWGuU554CMEWF/ZK99iY+Ln+zpG1CW/br6YtQWCm1fLww1WJoANloUimZs9B9p
+FtjVGNWDyRI8q3flw5rcOo7aCM1+BtNQhNM5RC8ABRO0JkhhcnJ5IEEuIChSU0Eg
+dGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iLkEEwEBACMFAju0L+ACGw8FCQACowAF
+CwcKAwQDFQMCAxYCAQIeAQIXgAAKCRBHrPEvKhKYmd/XA/4uJqeH2WLMAtbxuARZ
+TsDwrof1adVKpVgn/KKFle/yId4co0DmeFS6a/HbHPYVtlQ2TWWASVu6geNobua3
+6MnG9vHs2W4YmQGTSO8T3MXP4sOp9oinwtvcgZW+XGfCX4PAZDoxHUwN/UVwGkiU
+wRjlQVX31vkPxZDR2UBoHjBYDg==
+=XVtd
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/checks/pubring.pkr.asc b/checks/pubring.pkr.asc
new file mode 100644 (file)
index 0000000..e8eaabb
--- /dev/null
@@ -0,0 +1,28 @@
+This is a test pubring generated by pgp 5 beta
+
+Type Bits KeyID    Created    Expires    Algorithm       Use
+sec+  768 439F02CA 1998-03-17 ---------- DSS             Sign and Encrypt
+sub   768 CB879DE9 1998-03-17 ---------- Diffie-Hellman
+uid  pgp5 test <pgp5@dev.null>
+
+
+-----BEGIN PGP ARMORED FILE-----
+Version: GNUPG v0.2.13a (Linux)
+Comment: This is an alpha version!
+Comment: Use "gpgm --dearmor" for unpacking
+
+mQFCBDUOrE4RAwDbbxWAbWsheUJprK6VryMTpwDiYwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEm
+Sppp/6/Ygp+N3n32Kznq7PjHXiuWLlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUAoP+KBFly
+qNMdsK8j+ZO0A8rnImGrAwC1ddDme5iZFkTEWHhrtU97sEu2GDkSQB8HdX8CoRcrOz/B2WliF6qf
+BKhcZPFVBIhKNzjTfY7SEYAZk2zcsCm8elnwSLaGEzxKFNFBqKDNXP+a35spcqsHSGzDVw4VuKMD
+AJNnAP6skpHlhVAmecLZT9eRzVoOq1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXv
+dCT24hlfoGoXzkoDInkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLbABh7QZcGdwNSB0ZXN0IDxw
+Z3A1QGRldi5udWxsPrABA4kASwQQEQIACwUCNQ6sTgQLAwECAAoJENY0E25DnwLKxIoAoPSyM/Mw
+BogpyMU5YY+Sj74k3UIfAJ0RopQa8ciickDVzoSVPrGysrnOkLABZ7kAzQQ1DqxWEAMA/wVrlNsP
+qTxWZbUiMrUN8MjTFR2xUhuTw3cdvRgiVPUT/q1l1+I3CpopVBx/XuAkg5sHB80zc6pZg652YFV3
+dLoTceS7ridb5k23sHa2hZGCeTo6AdxIOy53giCPDP9FAAICAv9Oh5/OVxUqI+6hsp9ccOEhRA9N
+8aJzYDPjvCQyhgej2P1kTsBZqWIx0/PiMvIt+qqhT2YfyD68mHIBztScAXZKTnjroUPKl0+bkX09
+NbdyqojAkzhaCRKUzwnaHEfhi2WwAYeJAD8DBRg1DqxW1jQTbkOfAsoRAnaPAJ0Z/k6Y2ypgDhXo
+qBLeW7Lq/AKYEACeLTod6Nt117DkqDz9epmIqwWOE1ewAWc=
+=6BrN
+-----END PGP ARMORED FILE-----
diff --git a/checks/seat.test b/checks/seat.test
new file mode 100755 (executable)
index 0000000..72ab27f
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+for i in $plain_files ; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 --always-trust -seat \
+                        -r two -o x --yes $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/secdemo.asc b/checks/secdemo.asc
new file mode 100644 (file)
index 0000000..343453c
--- /dev/null
@@ -0,0 +1,737 @@
+26 demo keys (passphrase is "abc"):
+
+sec  1024D/68697734 1999-03-08 Alpha Test (demo key) <alpha@example.net>
+uid                            Alice (demo key)
+uid                            Alfa Test (demo key) <alfa@example.net>
+ssb  1024g/46A871F8 1999-03-08 
+sec  1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) <charlie@example.net>
+ssb  1024g/BC43DA60 1999-03-08 
+sec  1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) <echo@example.net>
+uid                            Eve (demo key)
+uid                            Echelon (demo key)
+ssb  1024g/7272144D 1999-03-08 
+sec  1024D/8FC282E6 1999-03-08 Golf Test (demo key) <golf@example.net>
+ssb  1024g/9DCAD354 1999-03-08 
+sec  1024D/04259677 1999-03-08 India Test (demo key) <india@example.net>
+ssb  1024g/61F76C73 1999-03-08 
+sec  1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) <kilo@example.net>
+ssb  1024g/9AF64D02 1999-03-08 
+sec  1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) <bravo@example.net>
+uid                            Bob (demo key)
+ssb  1024g/E29BA37F 1999-03-08 
+sec  1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) <delta@example.net>
+ssb  1024g/B0C45424 1999-03-08 
+sec  1024D/7372E243 1999-03-08 Foxtrot Test (demo key) <foxtrot@example.net>
+ssb  1024g/EE45198E 1999-03-08 
+sec  1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) <hotel@example.net>
+ssb  1024g/D622AD0A 1999-03-08 
+sec  1024D/D2699313 1999-03-08 Juliet Test (demo key) <juliet@example.net>
+ssb  1024g/35F8F136 1999-03-08 
+sec  1024D/B79103F8 1999-03-08 Lima Test (demo key) <lima@example.net>
+ssb  1024g/FE56350C 1999-03-08 
+sec  1024D/BE5CF886 1999-03-08 Mike Test (demo key) <mike@example.net>
+uid                            Mallory (demo key)
+ssb  1024g/4F31EAE8 1999-03-08 
+sec  1024D/30CEC684 1999-03-08 November Test (demo key) <november@example.net>
+ssb  1024g/8B70E472 1999-03-08 
+sec  1024D/6D9732AC 1999-03-08 Oscar Test (demo key) <oscar@example.net>
+ssb  1024g/2681619F 1999-03-08 
+sec  1024D/3FF13206 1999-03-08 Papa test (demo key) <papa@example.net>
+ssb  1024g/63330D9C 1999-03-08 
+sec  1024D/3C661C84 1999-03-08 Quebec Test (demo key) <quebec@example.net>
+ssb  1024g/A029ACF4 1999-03-08 
+sec  1024D/777FBED3 1999-03-08 Romeo Test (demo key) <romeo@example.net>
+ssb  1024g/11D102EA 1999-03-08 
+sec  1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) <sierra@example.net>
+ssb  1024g/0F1B50B4 1999-03-08 
+sec  1024D/85A81F38 1999-03-08 Tango Test (demo key) <tango@example.net>
+ssb  1024g/101C0402 1999-03-08 
+sec  1024D/653244D6 1999-03-08 Uniform Test (demo key) <uniform@example.net>
+ssb  1024g/5522BDB9 1999-03-08 
+sec  1024D/61F04784 1999-03-08 Victor Test (demo key) <victor@example.org>
+ssb  1024g/07287134 1999-03-08 
+sec  1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) <whisky@example.net>
+ssb  1024g/FD6E27F6 1999-03-08 
+sec  1024D/567FB34A 1999-03-08 XRay Test (demo key) <xray@example.net>
+ssb  1024g/41E408BE 1999-03-08 
+sec  1024D/4B11B25F 1999-03-08 Yankee Test (demo key) <yankee@example.net>
+ssb  1024g/F7B080AD 1999-03-08 
+sec  1024D/54ACD246 1999-03-08 Zulu Test (demo key) <zulu@example.net>
+ssb  1024g/A172C881 1999-03-08 
+
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Version: GnuPG v0.9.3 (GNU/Linux)
+Comment: For info see http://www.gnupg.org
+
+lQHOBDbjjp4RBAC2ZbFDX0wmJI8yLDYQdIiZeAuHLmfyHsqXaLGUMZtWiAvn/hNp
+ctwahmzKm5oXinHUvUkLOQ0s8rOlu15nhw4azc30rTP1LsIkn5zORNnFdgYC6RKy
+hOeim/63+/yGtdnTm49lVfaCqwsEmBCEkXaeWDGq+ie1b89J89T6n/JquwCgoQkj
+VeVGG+B/SzJ6+yifdHWQVkcD/RXDyLXX4+WHGP2aet51XlKojWGwsZmc9LPPYhwU
+/RcUO7ce1QQb0XFlUVFBhY0JQpM/ty/kNi+aGWFzigbQ+HAWZkUvA8+VIAVneN+p
++SHhGIyLTXKpAYTq46AwvllZ5Cpvf02Cp/+W1aVyA0qnBWMyeIxXmR9HOi6lxxn5
+cjajA/9VZufOXWqCXkBvz4Oy3Q5FbjQQ0/+ty8rDn8OTaiPi41FyUnEi6LO+qyBS
+09FjnZj++PkcRcXW99SNxmEJRY7MuNHt5wIvEH2jNEOJ9lszzZFBDbuwsjXHK35+
+lPbGEy69xCP26iEafysKKbRXJhE1C+tk8SnK+Gm62sivmK/5av8EAQNuYiCeVh4Q
+pF3i4v6LDa82cNBI92zOHLJAu1nbeJ6bl86f/lrm6DuH/SYjOkRTQV9mYWN0b3I6
+AACvUW2sEdiVCzqYu9QdI92LJQd2HLYgKf0mIzpEU0FfZmFjdG9yOgAAr3LeP6n0
+SUaQqSNKJPx1Wes66+3KH0n9JiM6RFNBX2ZhY3RvcjoAAK9/tmRCQsDGIXRnEJZM
+rvRjIUE4qvtztClBbHBoYSBUZXN0IChkZW1vIGtleSkgPGFscGhhQGV4YW1wbGUu
+bmV0PohVBBMRAgAVBQI2446eAwsKAwMVAwIDFgIBAheAAAoJEC1yfMdoaXc0OXgA
+niui4cH4ukKQ2LkLn2McRrWRsA3MAKCZ122s1KPXI/JMLBTBGCE9SiYQJLQQQWxp
+Y2UgKGRlbW8ga2V5KYhVBBMRAgAVBQI247arAwsKAwMVAwIDFgIBAheAAAoJEC1y
+fMdoaXc0J4wAn0x5RWtqCjklzo93B143k4zBvLftAKCFbrlxlNCUPVsGUir9Azxv
+P0A3gbQnQWxmYSBUZXN0IChkZW1vIGtleSkgPGFsZmFAZXhhbXBsZS5uZXQ+iFUE
+ExECABUFAjbjuFgDCwoDAxUDAgMWAgECF4AACgkQLXJ8x2hpdzS3wgCgk/BrqP5W
+blWLc2+6jwlmuLg8n8MAn12puZol0HwV0mcd8aHWtcrfL8lynQGlBDbjjw8QBACc
+jdcfV/S7I319mfDvbOwczDvTqDsRbb2cPhQNAbg7NFlWJKtRrmff14jtCt9M77WZ
+5W+zTLwX8+8Wy3mMfrys8ucZKtfPixOXVPhyinUUGSq68IArA8vLSUTuOO0LIi05
+LAg6jzGhN9jgkQReZyqxub4oe/3JhIX9grgJ/tsjNwADBwP9GeXmMrGi5wMD3qkP
+bzb1MqwsVBJq75eLLxu85JIN2XIAGw6Q0FJp4o7d4BAQqAMzt3ONU1OcCWlDQRDx
+j1nynE5ZgRBiVoyudEELgNnYhp3MSEuUg7PkFWn+N+GuvyhVUHApleyvP09kvP57
+hif6yJRS+V6L1ugP0vZmBI4dqQ//BAEDbmIgnlYeEKRd4uL+iw2vNnOO9Y3cRSEx
+yy8unuzNvx5GFG6KNtxoFCDzMMzUa0EDH1x/QJA3CgqMpS282nLdk/5O+AphiEVe
+Gv8+c6pL/t7falIfSgKZ0j2nvCKH12SobwiNflTGJB+jLnnesjqYJD7h0SVLjToP
+/vtKPYlXOU1ZpKzDwP5YcQQuRhF9Tj8SUxScIIhGBBgRAgAGBQI2448PAAoJEC1y
+fMdoaXc0IKkAoJ/NQGlvFv5clcDIf1AXjLlTFG9uAJ9rs8IOzHfNWuUSNxdhRvO+
+O7fYF5UBzgQ245BnEQQAvwwkLp4Dtoie4/fvandnK4wVPCvgJkIbNuyQZCarQGwv
+8RapBwbANT4vGW+ky2vzgptj21xYjOcdNMIhJ1Sjc7hjs1PLhwepMFrS4/Ple1Tl
+jpEgxLZ5UxertMvSTr7OxsA76jjOQt0B+y2vs5zXgLtedux4+pdFxkgM8r6fjZMA
+oJ5LVNdVRaSkiHaKZWQWsjfTs0/LA/wMHP/PdH4kjFmDRqOPp+iB8YYwQTPZS/gw
+HtUbQhLcFEljaxrCMRZw0ZDMbzKWk+BrrBvgz4Wk3XawwUshYgi8SgwWIDG0jusE
+PYOs1hBIdWTEzFVP2pK/NQzhAqJV5/390OLEY8SN4bts/LY1XsADzU7lhE0Oohx6
+FanaZCuGgAQAn2zK53yuk7o8UrPdTHygVn2McsPYYzOvlVfHCSXQ14oXjCs1nK1X
+nMIGGM7pJjYpzv/wUZkHLNcHX4uVHXxyzRQ4oMPekncmaR8fu/YIQ9zag5s2GpKE
+SKAynGQCKwI4H5eYn+ryIgOHNS44UnXFUwbEsonP5pJNNRIM7VimNGn/BAEDIkls
+jKh5E70pJ77zKAq/uP+EnBQq0tCcyqQgQiG1n28iMQy45N5zv/0mIzpEU0FfZmFj
+dG9yOgAAr2cvUYCyL3NVUcfw3gGkK+A8ZyTfoBH9JiM6RFNBX2ZhY3RvcjoAAK9H
+YClNyCyakk4UDrW4qn8YgsdvZcxN/SYjOkRTQV9mYWN0b3I6AACvZ5Ed3zcwNvmF
+Ptb2h6OhMGgwrNan67QtQ2hhcmxpZSBUZXN0IChkZW1vIGtleSkgPGNoYXJsaWVA
+ZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjkGcDCwoDAxUDAgMWAgECF4AACgkQQT9K
+8xr9q2w+RACghpiwPnn7F3HJsm9VXM8SwBjWThIAnjHZulQw9Tee9XDT5STui+ZG
++WN3nQGlBDbjkIIQBAChY8NSvu6sK0p4D0AVBsRz8iVXYqbRlRTZAHS4LCXwx/i8
+FmfdIXnaNLOoyi44YruSCnlZdh4YWquCx2mgywG589AzcFhahmqElNbKb7m4F//E
+GIZK0zTgW13tQwG9hTXOhYeqchnOOaDDwPEK1Gr+2o/5ANqhqrin0TFFBWLgdwAD
+BwP/R009s61X/FkUUAh8w4Tua6qndN/2GsqXsyPYjdF5E3gErK8jDcDLniOHqksw
+V17bJG81czCRE5JcVFLLWQJg9cpeoTpP+YcF+m9whtswaOJ/LPrx888i/OmluSD8
+1VP+6zBhhTUbpazfLEdt3XczpW7CNdNbyiEcgT+6Cr+W2Gb/BAEDIklsjKh5E70p
+J77zKAq/uPsbfaq2h50JWrb/wQiufxaUrYRvo5FjMBLnoUE+L/yG/Hp2ZRZuA5Ez
+BpZ3ON5LaFadahL98oQe/W3IXFZwxyYfGCtVrV16zx6cFTJQK/iIqp3TNp/fA6TR
+E3syS1FQZIZMiFLvgSy4Tsu4vAadP290Tc62LP9ivC3PiIxt3aqW2l/NLohGBBgR
+AgAGBQI245CCAAoJEEE/SvMa/atsta0An3ZMmv9EVWVwEvf/Rwf7nbFsgGhuAJ0b
+P+lAOCRSYziWSIDf+BJ9F19H3ZUBzgQ245HNEQQAis7GTDqtEM6luop6eWsxFi9+
+qhUVp9N6S+xlbwzQZVA4FjCqf1VR9JX8fwjLecmxT5xThQVcRqgeFVaCyky2Nge/
+FcFMPZQeaP5jv5GRWc5PvH9Sw8pvGOTB56V4ZeR4cQLDBm5CF5tKu1BCWWq2MLHf
+ct7TXe6QCzZKcjzdw8sAoN9VvrKN+EbQC+THzdWaUWpdcfWnBACFWEyLVPTpI1jN
+soCZ00F8Fau/2baXk8mdROlJZS6bq54ksfOQQzReBWce35h0W7NeBRp+yeoSf7Y3
+i0jTO4mrOiL/0NCcS8qKNnGKG1irdLes3pQhDZpcUe2G9W3FnGhxl6W5hpYc9550
+mUj2H3I5tmfSYsVcVjpNSIdBizxE2AP/SI1t6q7LHMQp0h3MPQ2z7daMhUGViXnV
+l2+rKjb5T7bvSFdV0iyyuyoqvUPBGWwJFLAxj6esHRlQ6W8togHuoJCR7cL2bK79
+8mgYOExk5gBexq1VHQQZN1edK4LGo2ESKrCVtkYwBzAU76hYFKAbKMU8dMxI7DRd
+LjZ3vdQ3FNr/BAED+xylaHWcBOTZBCd4ui6NIsLkQLv5uFW66tWYKvc2APAe8oKx
+h5YMp/0mIzpEU0FfZmFjdG9yOgAAr0tuCtmJhCp9PoSOTFA2ssaMB7jl+5H9JiM6
+RFNBX2ZhY3RvcjoAAK9Ilc3l2agIgR5iIQnvOgyYUe4duz+d/SYjOkRTQV9mYWN0
+b3I6AACvfQ0dS/51Esd9E/rbG/m1C3qIenSthbQnRWNobyBUZXN0IChkZW1vIGtl
+eSkgPGVjaG9AZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjpH8DCwoDAxUDAgMWAgEC
+F4AACgkQMYwfrvrvbRtnAwCgs2haIgJu/UEpmCEnojO1zCoaBwwAmgPAlNY/PttA
+u6zYqTh2M9yn1DIXtA5FdmUgKGRlbW8ga2V5KYhVBBMRAgAVBQI247gAAwsKAwMV
+AwIDFgIBAheAAAoJEDGMH676720bIN0AnjjH9IN8523PCAYk6yD1IFM/ad1qAKCe
+nkWU2ZO8/oU8seCQ3HkXkG2JRrQSRWNoZWxvbiAoZGVtbyBrZXkpiFUEExECABUF
+AjbjuB8DCwoDAxUDAgMWAgECF4AACgkQMYwfrvrvbRtepgCeOpUG5rVkWVJXULae
+GZzqbT+2SbUAn3HmDGXzAJ6lCiYh5NrTIb8A7wIdnQGlBDbjkf8QBAC0pe0mjRH/
+JmKL3mubSTRMKGcd77+l8psl4GtcA6iqNj3g650Q2xxgW+Qb1iL9SeiIJP8KuEfj
+6vfPVKZHKkRAfsjnpbhN8zz7WQa2y8kkmqojHoGIh5wAD3NE6ox+1D2WvnySmU1J
+OuAQlEDfRC5C9hSrQBkO0TUCWL2wquDv1wADBQQAl3TuGt2SCuYSXo4R2dNZpB2u
+kqqHOj7nnTQu7ZVoi1OtgZYxor/w783GzLJ75PfdQMSd6T+Gbyq+QgpaiBvlmWtc
+5rcF3ZgnxiW9n2zUlQ+M6denubJT6/Aqfn7yL9v0sr8K7kTrPqAM0lb6DAMwBkpN
+8o+Z0+aIpG5/jOtnwuT/BAED+xylaHWcBOTZBCd4ui6NIsGHGb+xn5M8RwQblStX
+KFu07GugiONqnqNgB+sywt1otn4dFUWo/4FzJzvEtBQ6EjchWAVKoVYj5H7ExOP4
+BKNDNb9JfOzu9ItHk8TvQ5X7HoV/r9eM0i6MRzNOlvchB1P3Hjw4a2Pj6TwpEBGZ
+uuYqe14UAGPlUjHSn+LuhtGpE06zuYhGBBgRAgAGBQI245H/AAoJEDGMH676720b
+j5AAn2T9b/n1T2CTa+Q5oGKLAsBIcgeGAJ9kC4ETWfY8itary77dKmyVJetgl5UB
+zgQ245LREQQAubUOd0B7cFzJHF5vo5NwiMZ1JXPjyNqL2OWE/XfaeJiB55oMmVEP
+mK1JF69wU7ZBpo1l4PEIWcP7WRMqvBEFl+8LnelRkSW95kwFr3D8TRnarZy3kfiB
+F1t33dnkVTaZYxCDKOBdZ/ZiRvLa6gZ/KHhITfzaS7h36G2MbAlGlj8AoKQPFsEP
+jByKYdx72m5/2Ju/4d4jA/oCNAKaJH7N8Y3HLis1ShhpytJP1yC9GJjtec3ugzYS
+C7RKV3NJcBeCX4om3KhiDSN6YYVICf4wdqz6TAocoqPzR2t7Fz6+upxIgh5WGnnC
+s2e7uO1eXUCSXONfiDEDzRKGTQjkdvwFo+880DkiGln/qmRrcILA568dwNnOrBio
+5QP/dbkpUBhqGDr2LchpkoYyQlqzbvUpXJ1xlfZim1jfrmdfsk83dE3iBzvmT8By
+IZcMoqDEHil95LmJp3qw1yVeApP/ZWR+0XiBLEF9GhcAOc5ihH2ACSXLWiRXpyMm
+K2/erTvTX3QkAcqoQ1cFWCwNNCrlgycB84Hdm5GXdajp7cD/BAEDMzjCY4kr/Q3j
+hyianLh3vPRtiNtOM1BAXVlyCFrMAWM4wvd1NvQzOv0mIzpEU0FfZmFjdG9yOgAA
+r2YMtXCKQcwejpJAvOyUDQkN7pMthHn9JiM6RFNBX2ZhY3RvcjoAAK9Jr4qS3ZZl
+PdL7YV1+Phgvnly8701B/SYjOkRTQV9mYWN0b3I6AACvUexSWiUCxWbF+aprVRlc
+r9OTu8iDIbQnR29sZiBUZXN0IChkZW1vIGtleSkgPGdvbGZAZXhhbXBsZS5uZXQ+
+iFUEExECABUFAjbjktEDCwoDAxUDAgMWAgECF4AACgkQFoQQpI/CguYi4wCgmXVE
+CJyjkfpJJBTdGzCjhUq4N/sAn3Cguw1R4rX0391e1pAUuyM4OsFnnQGlBDbjkvwQ
+BAC2wan9ScDXLgCqN7CWSRM5B68vC3PCbemYsuOXZjdN8afw2LSHxZ3buRXfYxRn
+JNo1pm4PGkMQ7ZpQikZZVCZa+WoIVXYXRnYAjxHhvHW0LaQPvnyFS9H5LaGf2Urs
+TWVA+695zYsSaX669XFb9WbiIMGB4yUiXPvQwUL0tSd+kwADBQP8C3sKWjsPh02T
+jcEy+FDxWAn4g3LfsOPw8dfawJln+0h9LA0hTebbKBJWt5OUMqjjTq/pCZ5+z+b1
+0f2WwET/xAvjQSTdJjrFX9DNNU3jhCCelEpal9oxsbNYlVd5zOU2RN4hlmj+eEOb
+5oy5wy797sQpsbrgGetCTsvPotIpvbH/BAEDMzjCY4kr/Q3jhyianLh3vPDNvR6M
+j3Bba3JZVQTKkPeSB3XBJgQ8ssznZMvxlNdGPl6SOlpBYPcmUuo2u69fS+LUzqxM
+0unjLC/WRRPWr5QCyg3kJFXpZ5DcsdXUPikfaRD4XWuVPTStcu7NC3YRt+QN0y4m
+dadZMjSAwMyHg/oqZHF6HoK/TA5ZTVHNlabj+zNpyYhGBBgRAgAGBQI245L9AAoJ
+EBaEEKSPwoLmSuUAnRcjDyrjIbOCDkQfCrpPvbqiHoQMAKCYSE1DVqBk+RlVUp8R
+uPmgvzIKC5UBzgQ245SxEQQAyG4mRUQZagjDgl0xAnaSbLCQ5wJqYq/snwCl+IbD
+lXcoHqXQNO9QJrPKwKQAUv3Nvk7mqZWnfMPoskLOASrs6nkCv2Fo9Aw6smNizO6i
+W7xXepwvxjho4hLnE00oGPCDhUnAU05LO2pTBoxwHVs0o6vtaaViXk0s6dOFCoVd
+f9MAoLjiGlK/3DFWoUrqIiuE3aLfgkddBACrp1snJ1BtiGhmKjt7An6Qoc5LVnU4
+1J/REiQIyitUFAvPX+fiqzDyE3VD8qX/vvTLpgZCYvvEdBlSfM8IcCn1/Qh4aw9J
+HzuvKQg8WclvnQ8zq/7RV9J7h/aS/KIhDJIpGhi6YfjfjdSKfLYYfr3S4TVK9xD0
+Za3AH7/lrTqW8gP/fpKWu8fJyJ9kqHyYrI/j4ykt5QKBj3tHjqCv7FQb4FY8txnN
+3fLzBtva/tlkSKRsLobixjZUGF+uQR1dTCv042LxZ6aEUqrUytxqUc05pCSAvEZV
+8bX2H/5+ulSwdxKEzs1h2NvSTAiZ54zzKGjHNmEitdAaPD/9u5xdAiqPFxH/BAED
+CYhWuhxneJYv2ZhcXqW11qNlLO3tHf4QWPYOZ9bRChm0UzW5CRik8f0mIzpEU0Ff
+ZmFjdG9yOgAAr2JqCOINgV2LqfCiK4s7X0mqwBz/uAX9JiM6RFNBX2ZhY3RvcjoA
+AK9CmjU0rQ5lHrAdn3TtY6fEEyaU9UBx/SYjOkRTQV9mYWN0b3I6AACvdPZBZuBl
+tFtFIRj0/+lL7Cm9daq3wbQpSW5kaWEgVGVzdCAoZGVtbyBrZXkpIDxpbmRpYUBl
+eGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOUsQMLCgMDFQMCAxYCAQIXgAAKCRAf6Pxv
+BCWWd1pYAJ4lvyDCV/l9oXkJOzNeGL3Df5u87gCfWm5F7YsIhi+PR7BVafFUBsWT
+w+udAaUENuOVEhAEAIMMgk/e8lsV/KEkd4/jNK4yFj5iy/Faon800I3GUzETuQA2
+AT3getR+GuV4pbZWE/80b9hnNW50UJGiP1+SXfVtY5vT8p/gNFwn5d0O/pq3bpgF
+RJmoawTzx8SFDwCVPHEcwOHE2j5LvfrvRBOyKU32tr976ri+Uowt0+92LuA7AAMF
+A/0Yo9dDqhjR2UoNcYfEZwWhRHaaJenP3z3QbzjJkASb5H84xCTEpv0dqEtVTJUo
+Io8Lh5VjbiCwok4QPLVSbQFeHqTKb7N96PjevkZ1Co6OrLCNOcPRvXxgCwSGbuuL
+MkQJEutnXLu0DOKquY94KXXh79La7lTgjReE/1Wzbgc1+v8EAQMJiFa6HGd4li/Z
+mFxepbXWoDrmIq/iTdsieZ9YRYA+rJ4OBtb2sjqV2L6WYNOqc2qDSj9QDIRJ8yiD
+ysA/4Yiur+UNBqRtJQGroegDXG4+NHsudnVzGXaQsgEqAjZ9PZEtsrEf8D89NeZ0
+3yQFkAXQ3n+aCf69jmau/Yf2YAX7D8brkxgQp3PCUcOgGv8EPo9r+AeRiEYEGBEC
+AAYFAjbjlRIACgkQH+j8bwQllncJeACaAqT6TL4N3gG2lLQNzV6gMd/p3dgAn2/2
+mEgFb3CkorWwdW++wf/YThe0lQHOBDbjlSURBACcp0BogujMnThXpn4UjBARj9oX
+gQWskkhz657AXu6RmX/u5RmpLGqbNmNuqKDIwUbJslIxrpOnA3QEobkIl7ThH+ZU
+IhGzPUnHlhd7M3dQWw1U0TfpHyXx3FYb7CCPabrSC7hWWh1ylUxz+RGJJSApR+D/
+GY+dF7dIllKUbaUGbwCg1z+vkNbzqibcwdYrwCjKG9VeFa8D/A5yPHqB9NMp+3Ol
+AGE4XRTR8LeelALpu+MuNMGFCMLdZfmt/Amoyau51FsQ7WwWrNM5A+1v3Fq0x5Wp
+Nw6Lr7HbN9d6zidN+L0uCrXPweET8ueS3DFnHI945epe703TbcjJBO/uYLn0LXEx
+mTg846/1ZlQbPgLzmzb/2JMkJ+QzA/4xFbRL2YeaKyu4JjpMNUVzXYogUwg9KZZq
+/qBbpsIAD7Agd+ZxLJHoweItXaC0nS9C6qDJZ95OJrE+h/Tt2D2lmxXseTVlSESa
+Wh45x9mbC0eRGFYYRsSx3z0hYwMmXA0ntj0lndC8ru8HjZtBW/KF0VB0RcfSyW+W
++yAq0Jxo5v8EAQNzQpmchsGqHF94WG/VI+1oYlA4rI/KYT/DB+zHXBquIl2KZoUR
+ebyb/SYjOkRTQV9mYWN0b3I6AACvUJB07mtW6/9i6mmuR9JtC7USM0AP//0mIzpE
+U0FfZmFjdG9yOgAAr2EW7SJ8fPMvmLE8+Kb56tIqW9FrYAP9JiM6RFNBX2ZhY3Rv
+cjoAAK9VpNLwU8ljMnpHbTNr6de2pplMjS3ztCdLaWxvIFRlc3QgKGRlbW8ga2V5
+KSA8a2lsb0BleGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOVJQMLCgMDFQMCAxYCAQIX
+gAAKCRCtGw+tQ8LQx9USAJ4sELIj8IZxlvkwqmmEMXtm1kIhQgCfZEpMtTpkRbT+
+rEHMssei72JJi+OdAaUENuOVSBAEALmZYtP72G7OodR4RfR270RxTHj40PfUpPIf
+3U8ezyO3kqjB12IdD2YIXIZW6zEj53psX8DGya5nSvVjdFofQSVHtsnB/H7VHBka
+OQnREoInHs4helYOD0M/RZcbRIb65e6vEesuzvo9N0ACSlBsAXbeeNKGfGGCog74
+GVGcZ6HnAAMHA/9W9n2MwJ7lq0GV4V0EOHDVcTAVRSh0nB9uKBVW7hFi4DP7XYBf
+gj8Nlbc22vMkkdSvNFUoLEH7Op9sMglXfiCPJSh02U/6XyAhXDyZRyrOIHviTZ9S
+HMQQIqtEETVuYRkzvSnSfDBVq1p9gW6eZN9q6AM7gmoKInpRaODFRWU7Df8EAQNz
+QpmchsGqHF94WG/VI+1oYTZm8S4dmnYvEY77B6haPMQN5nCjubqfHGGIMJxRRG/I
+HzXq0tNi4fusoLILtVbUgta+94uzgnsrUJqZbfmwrId96U52nG82ZMhLpX41lZ/d
+LZouCr/jMO0uvF+WYMjO04ffBfcnNkeQv0p7WDH0zZZjuJ0aoUwBM9xxU3lYTgzl
+aZi8iEYEGBECAAYFAjbjlUgACgkQrRsPrUPC0MeO/QCeNYtFDXrr21NZlLu0OfAe
+lPBM51AAoKglouZG0f49sm9tHg1Gc/nwjzzhlQHOBDbjouIRBACKncc4Ueec7dWa
+VARy2SmNVufeSenYs4AsIPP0v59jEl7JI0rb+4JbIJoAzW/hcm26GS/UbbpQwig8
+/PgMUV5QfBST4CEOlf7/x2a4HKk9tDV4An7q2aNr1beW+twxfUGWWV5I0o1b/iKV
+k/LiQRiaMr8pJXY266m6/2Pn9LmDtwCg+Iqfx8gsK2PZCWv87uEKAOLzHXsD/1eR
+xLqCt1hT98gdDLykRTlI3kMq6EK3I+z/8pDIMDuPIJq1eM68YdFZr8s7i1ye1QpD
+ltPYHgWnUC733ujAKANdyybm3HrA3TSBjEAhNfcu8nkrVorvASQUDCLJatWRWJTU
+VrPH+GXIXMA/Oi6LDsgNDOJanwzzvDCCm8hWQqW9A/4xYAZ4NVFrQq8gtQPJWuMI
+fSFSvpZWNgQgYZntiXSUGYOVs28T/87RoRx02tsVDw2PA8z68q/XRuM9NdetxbUX
+QHB9eszFLi3W1idsXhd/C4SyiTgEFXG8Y8s94Eadgk1PAYHN6Gd3SY7jmevqYGVL
+mBp7qfj5Y9XSM5SE0Th+fP8EAQNn55Peu081+nAbRC00SOkO5P3aJwu7AIvXN9Ng
+rJdUW7TQmQK+cHyT/SYjOkRTQV9mYWN0b3I6AACvbK2QUpz29Yo72wl9Cy/TCjWc
+O22z5f0mIzpEU0FfZmFjdG9yOgAAr3et3apzZ+S3o9ywcdaosE2TLfNzuX/9JiM6
+RFNBX2ZhY3RvcjoAAK9PHpBSB/T7wKTGFBngy9sOwtS7ZM3ptClCcmF2byBUZXN0
+IChkZW1vIGtleSkgPGJyYXZvQGV4YW1wbGUubmV0PohVBBMRAgAVBQI246LjAwsK
+AwMVAwIDFgIBAheAAAoJEP4YCx2p47CybMcAnj/BlcF5gdhj8huiFijkgZZi/YgA
+AKDxpmP4JCksz+UPKsQ8UbtuTPbpPbQOQm9iIChkZW1vIGtleSmIVQQTEQIAFQUC
+NuO3OwMLCgMDFQMCAxYCAQIXgAAKCRD+GAsdqeOwshrhAKCK3IrzNqME6oA3RllO
+rx87OCIRggCfVkR+Nf6N59lS5j7jMXOuk799fQ6dAaUENuOjBxAEAJVJ1fFRaXPz
+UWOoeBHhvUS2aGZbz0Kamwd8qVLCVi8G1sH/LtMUh+8CvhkVum6p7Dom+2MgRmhe
++iVNbAdU8QWS4bQsBrTeiVpinMLpkEO4uRvT1G6QIPjN1jrHBsAxGw7NmC/n3stl
+e04ssueY7JOmyNEMvO1ay42CWbmt985PAAMHA/9LJVm8UR0RWfn91BOnt4C1d2tt
+kQzfv1y0InbrrdFtNl3nmUgF6/V9OcpCS8NNjZ7nzIhDgT43Ov32qD0LJ/p7c6ES
+tNSoQE6G6wGB7j/sTkushUy+joAVT2qCfRKCye7/DDa3FXDdcSOovweCX7hD/nth
+G8k576rb1h70svx5qP8EAQNn55Peu081+nAbRC00SOkO55yVYRTuqV1cyTx/djMo
+oC9B9hYiXA8kcUn/RO3hztHVFGSYQWYNhOGBPe+FrUFfY6yjGeS9rlLKQ3oaGCr6
+pvZYdIBdzktW+TItDPYmRaaBTKrBw8jmccsn7xnEriVcgkSTTMd706I8cCIQh/iK
+iM5pFZGPPghQPn6paS6L+ydP0ZNliEYEGBECAAYFAjbjowcACgkQ/hgLHanjsLIy
+uQCdFkPnvUpYurVoPjhg1pw4UzuaVYwAnROb93OSUP9PZxf4XVJwHKU2PnCUlQHO
+BDbjo4cRBADeZztXPNYwpoIf6BfqepImZqhVd2qXuZBJnEvwaFoAl7er42pXXLZh
+WIu7/gWODfcyNxsUKgMbeQ+nWO2jdcZQtt+gmRAGl1F5LbxsP6aRw43W7PAkbmYg
+PY5tY/dhgFGP5puoV9mhijpFcK/cjeg6wNgmjuEsCv8BF5FX4/p2swCgwmgcx88E
+pJF3/EDrTk4/8Xr6Z88EAL99JWgnl0w2TNiP9T3c5mtVdcYs32ntJH82TiQQ0LR0
+A7zRY5ruojNZC9LsTht5K69AJakrDA/Fu5mr2xYoFJcW4b7rpeKUy/wYifeOhYY5
+T2NDYvaZnQJXZ6O8lGLFgAxCmnZEN4IRFahKs/gAmG86d6fCvuSrohSZvQ+Lsr06
+BACFT4tjfuL6MZ0VhsClxeBPny2AM10+bDDM5eOl5ODLN9Nxf+SRu5AdIojz2OqD
+9Jd55WobpUXGzTI+0g23636IuJuH7VGCF92nFwkjdIDblRoqYPAsJRkMiC4FkRae
+qF0DpgJacYSBnHdY3Yd7I+cvgkK7oBjzTiU/Zs5hZAeK8f8EAQNhroQ8vAawUbBJ
+GAm7E5zNoXK3ly9yV45/SohVZDzODvOlo6LWymLq/SYjOkRTQV9mYWN0b3I6AACv
+VTx87uYeuay/ZhQKJudCoAgGZGdML/0mIzpEU0FfZmFjdG9yOgAAr34g7RZNSO3G
+bdz8PNLxVgFG9ZaKo7X9JiM6RFNBX2ZhY3RvcjoAAK9YCrkTYjGM3LHB50POLDFY
+Z1O3Mu9jtClEZWx0YSBUZXN0IChkZW1vIGtleSkgPGRlbHRhQGV4YW1wbGUubmV0
+PohVBBMRAgAVBQI246OHAwsKAwMVAwIDFgIBAheAAAoJEOup8kDrncnmriYAoLZf
+OyE8KQbqCKZA2lLbxnCXr2G1AKCnWAeL/6RLjuyT7ddG3qd+ggEnB50BpQQ246Oq
+EAQAj7WdaOJjzJNs2G8rvrDZvD/uaALQ9PtdvYAp/Drp7xMH5T62+KKTlKdO3s8I
+QBPiuFocJNir5st/nm8Xl+gcOZOvtr45c/cl54fGO1gOjBZOfgbkdBVK/LMwuQWI
+ebK4qCZnAOlDLYNGVUguGLnEQBSfnhhkgh0WA0kqt7fYvpcAAwUD/3cOEqPlMdYe
+LnGEG4wPxtyVIchwGOv0YRW5apbz2fdO7otj1AFUN5WzFw0A5+WHza1OIUhg50Zc
+o6HnwKx6F+LbZ5aOc37EAvaFgPuMxBfkaWYagCof3jBF0CbTWUXV/D5/dFmIeuGT
+uUMNsGVH+OSMW2hBN/7+aJK5LLHL+hzp/wQBA2GuhDy8BrBRsEkYCbsTnM2iEIZ+
+jDx69i6vtiK2mS5+ud0+9/XEd1foHMXoByohTsJeUvbwXvAu7FvDdfroq3XGvSjZ
++czTMIekzBbYRxC+pPYENNuBn/e6LTKQD4oVW+uQYcPax5AvZeR5tm9RPxuQ1EYN
+AmHR2OEtmE4zSbqGtrnsp/a097bTCnmxH6PsQ19HSseIRgQYEQIABgUCNuOjqgAK
+CRDrqfJA653J5nNNAJ9Se4OBQyISgG6RMM2e6+frY01H+wCeJmn1SGKVrWnZeIBE
+j+jR5OSAMDCVAc4ENuOlJhEEAN1bOV3WXINYOoY9LMY6x6FfJNJrSk59VMtySkmk
+OkStyfyNLxwqteRVSjAjtKVmE9GZgj7mmoZobkVnlUl3VN8paKFzs74kMegrfJqY
+6eHo4VAU9lQXX5aUAaIVctz5Y4PNuA5IzL/zJcDqfTN76/d63mf0rOJvewMaPDkM
+yaJjAKCZTCeh+qyQdW/VLq0ODTyZcAsoowQAhUbJ/2KPcHM1vR9VgZQ4tTTuepDd
+Gk1A9oq09CkGhtGSdD9lJ3O6IAtwIH5Drrh/VwoYD46C2bQv9/XFSYpFbetP2XMy
+1wLLqRy50IjY4eb+A5w/MqqOPmiekPzh+BHgF1ux6FPz66ubEWIr9sUUjp4LUvl5
+0FBxEuztMXaNjdIEAJ1fL3IeDqINMmHKy9HtS4tYT/Wz3KyKuFmA9vS/IgXAd9HM
+z3oBgg+ktmv+O+SsNrBPFgZ8YhmuPtTIZ4+7tEJ4VFVVfnkHp682/d8CpubBDUYd
+NftYcI10CQ/TvJPFn/Cdm508DNDBGQR9nf1N1xxs6Ed8e9u/dE1DRXFta1BS/wQB
+A7n3lqEldy5uprCBgI7BwpM0ElWN+2D2a9LgElCF6MeTnG4Ycamo4Gb9JiM6RFNB
+X2ZhY3RvcjoAAK9TlqT8l+FZ3rsTboSXkdYnCZZwh4rd/SYjOkRTQV9mYWN0b3I6
+AACvZXMVrb4dxU2h5sKMOGXEpcHs+DuVW/0mIzpEU0FfZmFjdG9yOgAAr3vtqeEa
+itcXHtaGrkSx+21NoZaKkS+0LUZveHRyb3QgVGVzdCAoZGVtbyBrZXkpIDxmb3h0
+cm90QGV4YW1wbGUubmV0PohVBBMRAgAVBQI246UmAwsKAwMVAwIDFgIBAheAAAoJ
+ENS/V/NzcuJDdy0An1AXntULu0eTFfoqIj2gIoRR6l/kAJ0VIXasNn5cMC6DtduH
+/Cl3BCFW250BpQQ246VQEAQA31Qj2MGefTCoF0x+D+9UMxZ6RuBPzI6gzX1tzcUP
+WYy38NIq+lNYBg7hLFkUfn0uTsAm33h2Q8z4/DGT7jmQWpoIg7yNTr6681L/gYo5
+FhhC+qERZ1iPMyfMwwD7rrz9bthUGTqChV2h6NiPUPM7ic/D9rxJICXy8dsoj0dQ
+6dsAAwUD/0ggimQTUCGmNHHypor/GY0XAAL4Vy8jAsC0FH1UaqDVTrTDH1qWLRnS
+9uxEsOJIGSLMSdxC0FZEYq4jCm7CYjTOHTHvvYDbhs9QhvW9r4VD2efbERFSEYMi
+H69ASQLGDp/O5kOZTgQOvl5oxzvsrOMaRFSWcn66uUAMORmHKz1g/wQBA7n3lqEl
+dy5uprCBgI7BwpMwsmLANtSNhKe+VmFkvN9msymkZ/XyA43Ts3EpgI/RoP2B4GS9
+LyuCC26DEqGnsats++yae/wDoWz1mM9tq4UcML4hSHIbZnG2OEZDIiu1q5aS1I27
+UeWhA8+qPhPosw9cJ3Y3sQIgdIEiKzAdfsjhmE78aSpljhGnFumTVv9p/lCNuAGI
+RgQYEQIABgUCNuOlUAAKCRDUv1fzc3LiQ475AJ9aAil0KqenoLziTexEcc2EnFmR
+uwCdEjwBOoJFx6qltIM/tJcxqRi7qu2VAc4ENuOl2hEEAKeOL2pIdZ+zQtehxdL9
+l/uDBFSTuN9rLb8DgLiw8Z9j8U5CEH/M38WzH1nHKKlZKjGVZYiyhRfAG83wvHnT
+83lq+Ad0lgaZTR4z6nrd5ViOlHPlfqo4RPZPzPe+uF7EfDl792sJerXGAasLosmK
+nxKAyJyVjh7eZcjTS/hUhO9zAKDVyLHJ/gQlMYk8vE5XYL7Pw4d28wP/VsKVkjlx
+sXpcrCQIoKeDXgKNVv9L+0Pebspzr2WOah8iBN1QOkbtexIKCbb9mmviEnJU0FFx
+5MIw4mipvY4EpCaH3McGwJpCzWmdzID8Z6oISUyKsuP7PXjmASbogV6Iqy2m/2RD
+tfbIlbwotfbiOT9Tr3IPbH+tHAZByMRyvxID/RN90WOPSpODxr9AH9btmeJD0BfN
+t99116+qdwvWrTofcbkBgzvB34vLLDaMKVIyinxz2lYyC7aSpA3uzjZvoPvPrQJF
+LE0dx7DSkUTtWbQGByRabpyrXYdKZzsFXLb+LSTWwF3sQLax0C4cYT7OLPlxjDVq
+/A0jgztaZVWa37IY/wQBA4atrlwHD2LVQWW8aUn17IvjZxnp2Z5Em6q1rszts7m9
+rXCv+fKUFF/9JiM6RFNBX2ZhY3RvcjoAAK9hYwqxHjc6iHxWUSLF376lmCzbsJxV
+/SYjOkRTQV9mYWN0b3I6AACvYBDzN17V2d/ZXmycyHFyOyxqAighH/0mIzpEU0Ff
+ZmFjdG9yOgAAr1pTL8K2pO6rbaqNJoTiKU0q6XdGAj+0KUhvdGVsIFRlc3QgKGRl
+bW8ga2V5KSA8aG90ZWxAZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjpdoDCwoDAxUD
+AgMWAgECF4AACgkQE9uWVTTG4/Hs1ACdFOYsQ4pNSdT9grdhmONXKXgVRzkAoImb
+lC/iwRti3/yZ8Ljc0tEc4HTPnQGlBDbjph0QBADOk7pS4JZak/26nkZWEs+hIIF9
+IgD0labkCnr+GNDmGJrsJxLwTjU+NoaXo+SHmWPaqRJQFrz3ZJfJAxioyoSr+Hv4
+Fbv6frZIJEy1g4dFhk8DiG+zR3uPOcZCUyyW3HupqahU0/RcX7CzXAcuPJCXeoye
+SsBDyUAk/6ODs/kerwADBwP8DrWpAtFexIWvsswGdpRJHSjr7j8cJ2Hy36acB5AE
+MCSd7kNM+LCrOqyOhh6RfokrvCT6ZuwlN39nDnkmSr3FWbqcRSj8khs3tw+Uyp8I
+tqhL621vFn180I7dZM11bECv+YZlmIF/L3JNzFR+jmpODR99bLjQI0dpUqT6IhyS
+0bP/BAEDhq2uXAcPYtVBZbxpSfXsi+AHAuizXUm/50gOqDPn9/AvgQnPzxgeV71O
+aUzUKvZEVIC7A8eNbmLXooM3Kc6ppaVOy1l6BVNcHA+iAdEOnGL9e46NALwFz+DH
+rt2umY2banvt6kYyWqChnp6vnk8O4CD8ufKnQ4c3zfSul69uuUA+l4e5ZG8V5yUo
+ikTP7kb7/7PSMohGBBgRAgAGBQI246YdAAoJEBPbllU0xuPxJmgAnjzxkJIErPw9
+iJ/WlLv4gvPY/IhLAJ9WR725AmIjPEe8YqhNfx5b+Va9CpUBzgQ246f/EQQAl65u
+b9rEKS7XsXwNkvGtj1K7gnql2H1bJ5GF9bGCWhWmB8WFtsAy9XUeC3WbrcuWFgTs
+btTfXZ5I7j7HSG6ukf6Ycusb+bA1IoT+GAQGWpFeWoXe16wXZFl0pEc2iUnx9Tht
+oQF0fO5YlbvHJPEQ3kvoqcdb52WOOfOuCAJxc6sAoNqo5w0YxgJ9jkj7J4cmR+OF
+UEKXA/wO0jrvYE7eiZeFUjGNiRotxzhTzh53rxtz2/DWG3D+IBFOt4qqxxp3WCSN
+O5SnBZWUW50hDkhTxS7jSmsfPBmCinmQ6EF5FaFPyLQBq0uKwhMaWficdrQS9syX
+FlPuzQ5jOS3kVAxOmtDd7CMTC8892dj02qzAE46QNNUI91kZXAP+PINfoJ8hV2zv
+lGZ9tVlo+Lgsl1BOvxvEgmYV14gyTmMWga5sNq7TdMdWi8Fz0Vy7sI4S+RMJ96rM
+ws2iTzWLi2jGO44itoWttCwqmGJmlSWurRsvYhSBgvNCLXFGGaQn5ncO1tqKnWSD
+f625UnAipsgW8P4Agd5qJZiwXfJ67Hj/BAEDu6tMael+rX7E/usFH0MyFQczfHWC
+g6VkC9TYfdLwbBVtdcq/lugvQP0mIzpEU0FfZmFjdG9yOgAAr030xCMZovqQobPR
+re1kY7ZER8BZq7H9JiM6RFNBX2ZhY3RvcjoAAK91zg0swEPwYMWjD9p9kHpjle8c
+eWvt/SYjOkRTQV9mYWN0b3I6AACvbxuq5MH2Yu4E6hH46k0+/KnqrsrS0bQrSnVs
+aWV0IFRlc3QgKGRlbW8ga2V5KSA8anVsaWV0QGV4YW1wbGUubmV0PohVBBMRAgAV
+BQI246f/AwsKAwMVAwIDFgIBAheAAAoJEAyCDHHSaZMTQPYAnj5F4su5N516+dcX
+YBl7cLVDPp1JAJ9d2mO76rlmINaaTtH5lhApIjQjEZ0BpQQ246gqEAQAkdlSJYfT
+iZH/CkfV8tnhI6IDz+SgiZKcneEBnO+hAJottARGAojdbURlOIeZqRCgKpdTXBK7
+MdHAz4RKFnAAXPDBZgA5q+Coqn580t/O/AKGb8kKn9n52z9lC8A5KnHaRAsOKVyP
+TIU5vq6FLmsWmMB55iz826Dk9kMhV7mmdQcABA0EAI8Jq3Jnqf0HqqaX7CZuNKHJ
+gag14bTaBw0niZK0KSB6FBpzitEoyst5JBPCl0ayQEw0Hn4jhZAqcZybI//pC1CN
+QBBO47VUi0y1UVjExtaNmmWxugzkzWHHx4WmyWsCQwGN4B9riUws4g3dgC007l+a
+onKzj5QEo1XiiMNTFFmP/wQBA7urTGnpfq1+xP7rBR9DMhUEbuQV+5mF3JEYDt0d
+r9Ej9Ccl8GT/tOi0QsPNbtaWED6pY70iZMVJSk0TG7pZ47FNx8UHI2bJKWWjCF1n
+uXV+mW/xLMM1GgFMwK44bX2IsEJVqFjB7alBd/uj0ugnj2feFeTao2xDuSQ71IjG
+y/lFtOkcdJOov7L4tNh2/8ag6bbuZKiIRgQYEQIABgUCNuOoKgAKCRAMggxx0mmT
+E4+uAJ4+JbldpmIpRDEuE8tFCnHacQr0/QCeLU0G5RaI4jZI+QUKtYiXq0ITUnGV
+Ac4ENuOo3REEAMFaZuaYHLD67UlMCLHGPk1dFdAn3Mu2TFFDUYfEtA/JDOiNZacP
+iQSZ7zK+wVe66Vs9fzNkyeXqpwLzC35vkTx0K1m69Ave9LnXIZ70zvpVEL/UeCuI
+TRiocxNglPgn4dyJ+2V0cWJ36NGcZmkvBW0vGItpYCbpIGLzYVOfiVUbAKC2Nze7
+9Iyw+DKU9HI39B4fz85nkwP9HbIb9z5kXiRZyCaXOMnFBQ3bAZh4Og5ZQxdLyZ/r
+IX4Mu3DGjqg6UtosdVNHr6ofZWHPXNqqTUivoUmOS5Qa8dtUW3YGa8vbpK1OMnjM
+LhQVJZg/eou99s9OFP5GgPh5r5Vw/EYQZ6qzS6YiYnqzSt5LcolL2+Ae0ajXUizi
+c/UD/0TNXtCRfkS4SeVSkZXarb1oZjHdGlw6ENiLGiA0e5b4r0rByW4EQQGZPvg3
+DFXMjqp0lVVmfmXFPggLkbTP+SJ1/VGSC/wSqPkMiKSCenRqwHwWIdKxv7f13hye
+TZXR7P8uaSddSXaakqmT99v6pdZOo8NsVQTx3PzPKpEVciPB/wQBA3B94sZ4BXVU
+UYZFifR1y3VNINM8s1ZkPHDNwxOmQwK5PkcxqfpPpGv9JiM6RFNBX2ZhY3RvcjoA
+AK95UQT4zAahgt0Z7gBkqnFPjSb7Fn9j/SYjOkRTQV9mYWN0b3I6AACvZij2NXRN
+N8KfYKoU+00zOAYGp8PcUf0mIzpEU0FfZmFjdG9yOgAAr2BTPmLEX46yXGfFOW40
+pPQsV5wHy6+0J0xpbWEgVGVzdCAoZGVtbyBrZXkpIDxsaW1hQGV4YW1wbGUubmV0
+PohVBBMRAgAVBQI246jdAwsKAwMVAwIDFgIBAheAAAoJEDfKtR+3kQP4ilwAn2q9
+qdnkpFPi1neWFi0OEOr5le7lAJ40e+wQHgKIE+Fn7sjYQ0Liwn7oip0BpQQ246j1
+EAQAp/Ccn5EzxXIGljKVKZ5Pp0xJA3uBoQBvXzu2pU4HU+vmgwnX1313x+4BsHVE
+bw7+lfyhKnDD0TSwIAHj/xeE+jraCTU8X1iwe49eAyTaWF4wTyTzdZKQ9mrfBnFg
+dWlRjLALcTMJaOE2Zasn8wgAEHgi4QWyBPS1il+aFE6oizsAAwYD/RpvJnfv8Vqf
+bCxOYt7meLfTLrvcPlGNynv1nEgNgjbYRGIRzbXDDz+jwcLc9MeNuZgtaXvUbsQ8
+s0X1dP6vq43VmQTQPlU1TQx10o+YYn73ptyhbwOkyIDGmyf6uFhO0+B5/MY0KRLC
+xo0lwMxvVkYNd6k804pSJPqwusWBm2R0/wQBA3B94sZ4BXVUUYZFifR1y3VOfk4w
+3PRZvIRE/y8bsqADpUHOrpzhg45mVJx0XUD9jUsufCzZg7wHdE3KlnZW2cJ+HHoh
+up28Ie38bbaUVgfofuur31BiAVojpu8KhTncGAMb64oNfdRJapHzzBcuUigQ9ETt
+6OPgUE/thuHws+GpxQe8KhGQcVfJwuRernhyJhW+BEeIRgQYEQIABgUCNuOo9gAK
+CRA3yrUft5ED+PJaAKCkicGM/NGxdTvpyHhtVSSkTRV/6gCgsnKOr6ziNIo/Bbdf
+RfYDd1dL4lOVAc4ENuOqZBEEAKLUF5GqBMWJQtBs1t1Sp+NIOGuMLgJOhINbMU6t
+k2jzeUt6ooNd+c8P0TexsbSETwhrU4ntpvIISb7I8Twhcled7bi5KCABJOzz7Fw+
+Ydxo5Yjm1DQH7+gEtPx3n4AjZUfRAN0nqcFizDpRYPqVaN1QYiGWn9yPF3pubQhV
+n8zzAKCpx1LUlQl2e5t1YJhmom2qy38EeQP+IB45FBfDf5KKtyS64alQ0vHYIssU
+p806PQorw/ZOuoiscUQj/WeZ4vn7rCdu60uR1EuHpGp7n0t7igEgAOcxDjrxJmpg
+SdD79V+oJAFLATo2msj1IklVvJeI7ZsImyPchIU1lqn/GvpAam9N+FiIB1KUMFqT
+Jzc6zUn1Qqag1w0EAIiRHPYRW8ojd9Uh4Ed3X0daAnClyMWL82t2bj/bJRmhupQn
+4aVJ5D0pFB9izTiJEWciHpqiMdsi/zExYYIDS1Zu94+WFbNIxyMFfHrJ5fUQtAqL
+b7E5LrlxZONUnrRwshqR4X2TmW2mz1Wop542eUQ1UWp4Gr3VlH6giswY0CnQ/wQB
+A5YOFNcg/BY3BMnzmbEa9r4DVqdF0faqHCAPM1GU/o1rZ++VSNJruLP9JiM6RFNB
+X2ZhY3RvcjoAAK9h5T6r3UXJdRJYgiPBeltuXDZLCq03/SYjOkRTQV9mYWN0b3I6
+AACvXXkGa4lux84ceaJy3CpOkPW9NxGnh/0mIzpEU0FfZmFjdG9yOgAAr2H8Yr3s
+FEe3lYbWaVBMe1xHDnsfH0u0J01pa2UgVGVzdCAoZGVtbyBrZXkpIDxtaWtlQGV4
+YW1wbGUubmV0PohVBBMRAgAVBQI246pkAwsKAwMVAwIDFgIBAheAAAoJEL55SFK+
+XPiG8SMAmQEeRej4CyoP+wmpdhNm+c9famN9AJ9nKsCqRWJ/ufezi0YqAcbgbaNQ
+5rQSTWFsbG9yeSAoZGVtbyBrZXkpiFUEExECABUFAjbjt7cDCwoDAxUDAgMWAgEC
+F4AACgkQvnlIUr5c+IaZ1QCgqGtz7Pnbid5+UylHAn40bwpXE7EAmwVmqbtsG1iW
+Wt1xOo2oyTj0t8E5nQGlBDbjqn4QBACme9aNjmsy/D0vLzEUvj2kaMBgVv3MWKO+
+Abi0yKsjdP0QEt+UosnybgpahGhPZ42bL8kYsfJmO95pWHxN6sNX67FmQQa+/vTa
+fPw04SVBOMdYejLSfqmhyLoXGF8l3Vuc6MMraZkS58RA1KfY+EDjqCMItFMA+7Au
+mK1JIvm5uwADBgP+KP0pE7r38nHf5b0NlDFYhAGIqdgdWvW6zZal2lNXiOkKok4I
+6AH+GUGYJjULX+2mwCPUDdllqYlFZVmg2iSRF4i1ktd8ZpymsZuaaNyDz2AUzlXe
+cRQ0JT+abYFBannyHg04K/rR0avkYCocPEBK0+TfzzNvER3IWznsI9Dhkm3/BAED
+lg4U1yD8FjcEyfOZsRr2vgAw2DSsek1WQcJVSrTcrl4DmC6JoYKNZxcZxkz+azXG
+MzU6P/gruBQX4ldaWq8ObvjrdF+g032GXju9Olh9Wx82E+lc4O2K5kwNe0fveQQG
+7vFrmajyXnIB4myEx8jSGNcEUcl/6pMmwjzIOMcU1lPVYNkZU8cFQpZHJ2dY0OO9
+MXpawIhGBBgRAgAGBQI246p+AAoJEL55SFK+XPiGkTIAnj6CpWQaP+vvx+HhzcjT
+cL/VKlZQAJ9Nk+d40+pCqkNEZDcV/xO6vXHbbZUBzgQ246rjEQQArXimh2e6XDO0
+Lo/BHPEsdHyd7tDXS7KOcZ/RJOBVjCwbuo8O2/+SowdlrVzmUlihzs3k31AMe/TT
+Ciaw/Y2Vv9JBABVXmacGRdZfHwbERC0fXMQGoxN0bxZIAmAIV7BdSZ6PqolOUzb2
+nRlOEs5j+Lzp546yFk8vN5rWYsKBSHMAoIGmmgpRPEONTciH1bY0t3/jZvMdA/4n
+B/bsDN76QdkFdvSCAams4Gha+7waKIBaAJZWgkGzy4sh19TJN5BGYOcXsJg0v7VO
+Kxqo+1HC/TpWcdSAg/HKfNMjWH6COyuVzOrGDjJnyTkRjhLKjLaGG6N5Zbg4A5IN
+ug2Tcp1HhR2UayFs9nCqk7mgd3cNPZvLCTbrN6aBLQP/UNSg7Iyj4vPtpFMyaCt1
+etUIJVwFQ5X8yugeSjhGehkf4F/TObssi40RMmxUkjT5by0ddfpleBkeQHK1UDph
+NEKRcqNTK/rg7G6sJMxEb0ata+aTsqjOVj14ZV2uaKOJ2tXwRF++iBMyusSFRtOx
+pzZ2mPnZT4LC6uCPPgNtGRv/BAEDsc7YSdD9O4gyqEDz+24vfhBH5b1jnJJ9MOul
+ZipNjfbpG+Tocn1wYf0mIzpEU0FfZmFjdG9yOgAAr1WRiijedefkEEOQBUrN2HOs
+xDW9NIX9JiM6RFNBX2ZhY3RvcjoAAK9CxfX5lmHbWFcJfFHEQCfpabmW2/on/SYj
+OkRTQV9mYWN0b3I6AACvV5X9PayElGU3atpQ//cE3jl3tHEfhbQvTm92ZW1iZXIg
+VGVzdCAoZGVtbyBrZXkpIDxub3ZlbWJlckBleGFtcGxlLm5ldD6IVQQTEQIAFQUC
+NuOq4wMLCgMDFQMCAxYCAQIXgAAKCRAlsA/UMM7GhJjYAJ96+gRNnRtFX68Wbsix
+2VqHsXeLugCfVbbEonL55bC9BBQ89XY+6AFNSgGdAaUENuOrHBAEAOGceVg3PC6F
+tgrZrnofohzWnui6FVBzeai1DZ5MMKmdN6/QMv1eeHoMOb33fbfhwA51n+kPuhap
+r6QqTzx62RGA/gK1m7vjU2OfYxSO65GN/rSUXN/kE83jR7Hux4MocRXZ+/8ngqL7
+JAjw1LZdJyOniJpeRvrckPNC/bKaua77AAMFA/95VjAjJIAU/gOMwtbqTgV+cmHe
+52Aa1CJEalV88yKG86nnqHuL4xxUTTZljyjbbKleJD/Ah7R1BxBhSEDy8WuTuonE
+VHVxTcL9Yig4pZ/OzYZf5fkl1eLNaSLb8XZMT0JbP02b//OMpAr29lcaga1o1RtW
+vrlUyIYOTm2RcTxkf/8EAQOxzthJ0P07iDKoQPP7bi9+FNgB92LCXMeilHSPeArG
+JblD4lyK8pp+jwjSCaWJrWQO/OJJOzhTh6Betn6H6C6bapoEaQ8TuKbHEnOMUfax
+tx/yzDtWu4EWGMyG9sSPjXRr/lChDsi5OMcYnrxK3foQYMEHBMb1fIqqtRZmqWPc
+FixNLKLjBalB2cMRuYaY8o2V3ZyKiEYEGBECAAYFAjbjqxwACgkQJbAP1DDOxoQg
+5wCfbgzOK8WkgR8iruUOQagMIqwMr6gAn1iBQ2TJM5znLHzYgLX+D0k5IG/plQHO
+BDbjq1sRBACVaJ7JCEOyjZmcPbBv6CrpqqTWtFSFzB0HAJNuITVosCye4yXycsfh
+++FpPPZX8B6OgvTR7bx24Dmiv0mIF+ZVuWulMAgZay7QBTq4RCxaBnBF2yjc0f8p
+8fxnmXHAm2Rn+GUCIQeiGYagPfyYk2yCebrdFdp1QfvqKs7oxy9aVwCg414fuLbk
+BysyiXg7sFnCoarbmJsD/0hGErsAWF+BpGsNPPzg9oiyzGnV1YpqVGu4wlgZArYs
+O4SXndD53WudgE+WI9uNav/0aSPHcrgHQJ9ZZALSxSXvts1EWqvwVeSNFly+QKjH
+Ecbs8gUbvust3ZKJD55L52nlCKO64wLyySS9C67FLp4iTSD6OMaU2GO673thrrF5
+A/9nF6Tfunw/W71NOY3uc+2XMZcat8pWL0O0nfUTzTmu5cWpO6gV9w4FGu19j4M5
+5tfxHEjBBX9MSbLHChd2aS/TcRjAPoAlKbHda5WLn+t69wf2d9IQcPLuwULwIGnh
+pq8AVFA2uGiZIH2VKblyUYtmIPieWMXUQUAHBAVyHseGU/8EAQMb786noBSUDw4m
+7xGDnWduktairbapLv/ColtFylU7mo8tzwPJ9N6M/SYjOkRTQV9mYWN0b3I6AACv
+V0SyyziakJ764L9AWGhvZl0VDNCEff0mIzpEU0FfZmFjdG9yOgAAr2aAgfc/R0ZI
+X1er4E/LYM2tthHZ54n9JiM6RFNBX2ZhY3RvcjoAAK9vCoy6yI44r9RAQQdGiriB
+nWdRPg35tClPc2NhciBUZXN0IChkZW1vIGtleSkgPG9zY2FyQGV4YW1wbGUubmV0
+PohVBBMRAgAVBQI246tbAwsKAwMVAwIDFgIBAheAAAoJEF9jVrptlzKssC8An32a
+3EYMFU3dvYtqymOZk1G6qdElAJ9XrILycL0GM22u75KkQfVlZReszp0BpQQ246uO
+EAQAnQtV0TzPQjBa4FVL4qFO0koX3y544FgWd4amzmK7ILV37kHb+pQIsZzT3Z5P
+5OJoy/MNaam41Jn5m6aVQ8c7IolEJSWrcxg31NYA3O5LJ16Rf784IW7nMvBzTtEh
+4t7jPxlwue+ImdaMWvwNeHypwlWE9U4alGtbrAuWEFx5uCMAAwUD/3+C2YDd3Wy+
+Iy6lxwzaQCBI4k2yl8QyhzpwKH//+EhNJqWjVRy7t58SOewrV30iNpDEEpv96aqU
+ys2gZTPwmzACVGp4ZpSzwEQ3Cf4UHA7QbBeZxRu83y33tEgcILDNR8S/evFb2u1r
+G2KUmvfPtx0g7svVcKYRae4uB25wm0iu/wQBAxvvzqegFJQPDibvEYOdZ26Rt9Gj
+Nyo0jdE5rAxUvk0VBw7TW+V6uxtqp+fKrP3W/ewR4mUXo1jq29kicdAtO/nI0uEW
+iMuascrL4lCWWcrEK2n4AX7KbzJ9W3HDupQhHHwYga7LFg+ZAc+6m9k+cn6M8Syc
+sbQt90IMqon/jpYnSialNZilcMpFfYCnqBDTVKpBReiIRgQYEQIABgUCNuOrjgAK
+CRBfY1a6bZcyrA3hAKCPwFgK2ukTx/0R6o/BN6HFJh7Y+ACeIB2LqEi2uOknmyef
+7JveVqldPTyVAc4ENuOsQxEEAIQRmJhsJniNi/bRff/YGrZ9aFWt81G93W8WhV51
+qq+ntUHgUNY55Yyos4XLOa2tS+K8zP6X15FesVBPYIQa5BIC10mAsLfJ+1rbnGJP
+uNBA2U2MoEaRxo/JtXQ//5jiTRlYwLDRnBzuaMCPdsirveu+JBw53ytRwjwe7m/D
+1PPvAKCp2dj1FtDjubTN7kCF0o2KzPwE0wP7BimQxXyPwSzGqLaHXSEBsh84OQTx
+PI98BXgq0195/A1B1/pPs356euKlqoefUTHYhbjiMYbjZT+A6juudf7A2Ucy03G8
+HDZ4k1f1vmzrj24+6ygGBcxTVr0BaweiC1DwG3LjQoJ1cuFxRQ8BYJDGIwPrUW5J
+dlnzW2bJWfdyXOoD/0S7iEVN9txkSKildOeP1YcDCD8MM3hvF9kUc+1hbmir8SOZ
+/IYJAyQN+j+mYWsLuKtZ/F9pqiBNTXH2jWCTqldOD/ZYxHVJAARnkiVG6yckMLsx
+Hi2LPPBK8xack0y92mKe7za/7fhVgCRSs7M/rzUbzUhyInHSyxr2SYb+8lbu/wQB
+A3vncg3S/0EKhZRFb/E5MzbPjleeF5fQn4SvP7U30kDoHyI3LH6KymD9JiM6RFNB
+X2ZhY3RvcjoAAK9Gv/oavNniW7Yqm+70mldjom2X6ztd/SYjOkRTQV9mYWN0b3I6
+AACvTc6M6Pazxb3BIBjtK8lUhha6Ei7BOf0mIzpEU0FfZmFjdG9yOgAAr3SSQHcy
+6mye2mjpCNKs/FezOQKbDUe0J1BhcGEgdGVzdCAoZGVtbyBrZXkpIDxwYXBhQGV4
+YW1wbGUubmV0PohVBBMRAgAVBQI246xEAwsKAwMVAwIDFgIBAheAAAoJEF0V4B0/
+8TIG4YwAn2L7BGoJE1q7g/ePfsIhAc0nacGKAJ4iBZV69HtWtOryudH1sG7zEoaR
+KZ0BpQQ246xxEAQA3mE758SGpbalfvWhJSpb9NEdZJvJs1zlutDW3OBNuF4eIb8t
+AnWUeO1mhlCzJbcf958S40BHCvKjgiO8rSeaJCyplRHXv3ldMhuj/Bo83TxC6MLb
+q5ZsvWlgvnJBqvBso6jICy3iOATU2llVz+vX5ZSns24RqmJxWO8U3OSJUIsAAwYE
+AJZAliv6HSjOvslD8Gojy9Mq5Vdv4MgFCO5LM3su9qIioypv1l1802ZnUC2+SWjY
+J7ZUzKWJDNVJNm4clBt+sNMFcF/5D4Ag2Id1kQCh3MG8O/qnu+xOeg/4DZtLyXrG
+tY5sq3crL34ZQOSpbda5qBxQqiBCARv8Up5z4Z6DBKBR/wQBA3vncg3S/0EKhZRF
+b/E5MzbLEL6CTR0ywkrjR5f4P+KFRNbVixP74rOGEYga1Uy8PrUOMDBIjbtKVWQy
+6ly4hnMv7ZPtIZSJFpeofg7k/kTNJB0W0BcJhWfg5CbiWncJYH+IZT6+/0aJfmhe
+y7gMlkoXOqH7y1MlLXHLriVzNOpapAK4Q7vwzzfRL8kXP8zC+u1noiuIRgQYEQIA
+BgUCNuOscgAKCRBdFeAdP/EyBhuTAJ4zaeXrBSUA3s0m0MV04WJxDDGwWgCeKwYd
+KMH/CO2Eaetd28XWxnxJHO6VAc4ENuOs0REEAIHCI/xKPD6yIRGsSnI3PXTW/f9A
+WdwcQZO8fWuxypuqNP73Hyx9lxYxcQeA3X3vjtTwvSjVKiIuhk2nxm8qkuO17Jzi
+bOZ77K4JlaVFMwHe6dHcXHNrSaHcIZB+BrTj+IuD/Vwa8Z4EK1kNI7t99xDxesC1
+ou6pFchhDQn7L5LTAKCmIDPl2IfVEHu/x19Bogp5NxMVZwP+K8gcXcgYoY9NourP
+LwHuZpU68L/OboKLkgfeVxF/Bj372liFv06VFkOmu6PGM1P5CD2u2MxE2F/HvxVa
+9mXd9xwH3i1DadzktDbxG2CZRg31u/1+6i1b9aOVgowh1ISvAwn/QMfW+M+wm0R6
+bcUhOFO/TQgjrF0LDm1dvKpRrBUD/iCGgoe3U6gA8P5wZn7l8XqTyl0ul3YtLaO/
+S30La/k1LSThFRiG6qkAbIBEhYk+akdFu6oTp5eO0yEMj0J7f1ffeEMMgBrSILTO
+amBUVu9INRZMg0V+ez80zLlNgY1SOph5GlJC2i7o20V4kBZvCFyeK39vexqaSrko
+LzXK+0Zq/wQBA0GK22cdg+tRJk3gYcN/JjZjdGbyparZK4zFc6L9X+dZtsC9gBVh
+D2j9JiM6RFNBX2ZhY3RvcjoAAK9XLx987T5u+PQj0za48diNtMwF5HRv/SYjOkRT
+QV9mYWN0b3I6AACvZ+sSQxavyXXTvVtvSZ9DrB2hdoyR5f0mIzpEU0FfZmFjdG9y
+OgAAr2TiK/D9hNwmBtF5JxEuKwCv5DBmY920K1F1ZWJlYyBUZXN0IChkZW1vIGtl
+eSkgPHF1ZWJlY0BleGFtcGxlLm5ldD6IVQQTEQIAFQUCNuOs0QMLCgMDFQMCAxYC
+AQIXgAAKCRAcZ+wTPGYchNG4AKCjSqAGZAKs7NstyNXe0qmxdjqhgACfUIFuQ0RA
+vRxngnEfGZJiTL7vHBmdAaUENuOs5BAEAJGi4T/jrY5BtRTM0psAneQytzzFgH4+
+LigUXAAb0QDAOkyGNfWHrfHJIS7A3Nc9pMWAdOjWgSKbYyrzra0SQ75/SkI5+/S5
+ev2Fpki+HYo7cNgVXnbCJrIY7k4DAMunqPJ9JCUXc88WxGvKV5b45htqCPnV2Pgq
++AEIKD5aGfLjAAMFA/9+O6ttUbeY2bQHRdThl4HUxQw4lgYN7stgGZsbHCc0y6ln
+1HF9vlE4Tl6HI/NR/8OauQrXt8988dh039QNZsOdAeRWTk4PgSuXq6VDG5WNw6B9
+bvRPKXe5yeVmNNl6KESBzMcq87kANZWZ68vKJ2JihxPHRAyfxwGr2JKkVF0S+f8E
+AQNBittnHYPrUSZN4GHDfyY2YCjm88CdmfBmhTozr+i8fBZaKPsQQkAz4Ybhdf+d
+CkGOyQjOvI9qUX4wNF1n9/2af6a9A9TJNYGpdQ3AQUyyH1AXIfYLeZhAKR8oHgP3
+r5L4DDGmyAG/I47Ziko9nyyRjEkT5B17n0HedUtHH0+v6vtjNc4OA0XtbY0SCvuF
+MpLRF9guiEYEGBECAAYFAjbjrOQACgkQHGfsEzxmHISIlwCfZ8SYKvVQnWcUbLR4
+pdAC/SDm0XwAnAqTsdVw9qkF0c5EwGnsst/qiAqalQHOBDbjrjgRBACU0OjVoC32
+Kh/dUjXPdN6HIusEhHheYpFIzYHHTYJmFBEjBj9CwrpYGjGUmp+BS2wFS59zO2Ml
+pQGLGrmo+YGBdio338Hwdm8baeScd2Koqu+oWkCoBMm2VxxbS3M8kq0ppNu2Q5EE
+O/qGywVrVpfBM3siM3mcsjVaHyWy+T1IqwCg/lnggNIr+Yz2HoU9GwCwBi9331kD
+/jRTBAuXTq7vAG2bGpJ0X/zqSMLSRZfwnZj28hx6I0SIT0yZU1xggrAgzSbB24Xn
+QSSxWMR2BZQmupPdHO0l8xPn5KCbYo4C+9+ZsprxEXg09KtVcMOsV6qTq40NPSOd
+RRNAVhOOTg/GD0qX5r9ztB57qpefmp4Nfy5tmo3SehfRA/9jkdKCLrZRsE/kH57k
+GoT5kt4nvJW2X3T03BMKvspVm3WjdlrR0Ji0yiw9P05sCMJqeFKe4RZreG6i606C
+itZpRIRbpjfMEq838zgUDv7VGF7zqCedYu36sepfkzxj/slNyu6A21HTgMWxiBrk
+DXoIuxMPFKYzZGC+nCHXgW2uof8EAQOPMKazZfwtUoJ7eB74i789uCp+H+yM1KRO
+CEcmSW/T7ago8wfbaRdC/SYjOkRTQV9mYWN0b3I6AACvTozOxPOPjYlU7v7vhyL4
+rFswiNRORf0mIzpEU0FfZmFjdG9yOgAAr0jn/8fzbG+geTnYS5NG4g227pXLeTn9
+JiM6RFNBX2ZhY3RvcjoAAK9spiY0wOlyucxM1H39jlMftXgj0GA/tClSb21lbyBU
+ZXN0IChkZW1vIGtleSkgPHJvbWVvQGV4YW1wbGUubmV0PohVBBMRAgAVBQI24644
+AwsKAwMVAwIDFgIBAheAAAoJEDvb7bF3f77Tq+AAn10WjJmAMcn1pBFwE28eIqtU
+z5bsAKCoNi7oa/HFVQZRypKR7SChjez90p0BpQQ2465mEAQAiea3rOLV0WY9+rOz
++CmVlH9GAvJrS8cXjRF3uXJALZ/IDH3EkCeDHouDtRAb6ymfQ89vBJr9BZg3eug1
+HeMm0SJNTzfJFq8vVLhiwH/1QQJDCMl4WAhJwe8EbDY+JBeQ4WIsrXqdsHpD6HGT
+thgFKCMmNsjDW9ptoNivFJytkAcAAwUD/iMYod6PvvotNl8IuMDnu2q6NsUngZh/
+W/JxGifL/EVS0TtAIKEeBi8ynkzn7+exVOPLZWO7MbYehTsXiWkJEtZw9S0aW9xl
+A2a+6jP8jhmKdFoXUYBlvnNHmGt9oOWo6ts59/h9S+Mq5kUmTOJ5meWV3vYo5BrN
+FDWKpotIAWMa/wQBA48wprNl/C1Sgnt4HviLvz27SydCgapMV/zUfdQL64nYYQj/
+00crVG3e1cAN2iOPRNsjnczkYXjFfSxTxoVvQEOvScRoOF1LQ6doAGGSJmSkyIGZ
+wxb4VLD8GhqmCX30XxOcTRG6EiLq9+kDGL5gAnBUTviRF6Tc+y9N79L+nxc4lawj
+36d0ZXeIG2fm8RycxA2E4ICIRgQYEQIABgUCNuOuZgAKCRA72+2xd3++00nRAKCQ
+vRyQt5pNoWbpj8btfqGK00jpOACgjSITGzCNURjHPCPEBAPqgOVDh4CVAc4ENuOv
+BBEEAMUtk4AJiXP3jaKpIhbi3B73S2SZ67rKzBkicjelpwWk6LndsCrbLsIWsDf8
+fNtih0r9As+2arfApkNlwuCGq1ZlPGGGEf18OqPxFvnghVEbDdcosP4bIm3k6G2s
+gFbMl68xAGnTtkS5Gfz43uTuznPzdZnGbIjP0uBmPfZk6GW7AKDhi4htuxr3Y+ud
+9lx1bWM9KqUtAwQAiRYHm605RZVBkdzlfYx1Iwgn/l8Chq3MsPrfBMslapBnq1an
+2/nEQPmuIde9C6ALN1t03DHpKonx2XgjYVz8pgty2FU7txSSm2EE+975dXp3ov4T
+fD1KxksOl770PAzixLfNhPW1q4A2cEruGgO74qEX3/fAa1J0nRKDgmA/mgYD/2TS
+ZKCaFHoc3IHQnkygmGzzZNpVZV2+1kIB8Z2hNo9V81PYpzlYV8SlG51ajW1G3ePc
+ti7JOIP6MquNUbYR4TOzZy1Dq4+VqqZCB6fOeIKL40IKKAoMMDYFNLp9zcT+s6+6
+DTPH27eE1WEt+NQjBgr2ofC/4iAU/nmAYmo4xn7Y/wQBAw1YC6sO6OK1YqygeAug
+0cwEFM97WACPFwv/yo59kPUn2OPV90GqWcP9JiM6RFNBX2ZhY3RvcjoAAK9kgTY3
+bsST11j0XtHaORe84A/oRwpP/SYjOkRTQV9mYWN0b3I6AACvXbfs2GvacmwUsN1h
+JIJ6o5Tv41Oiif0mIzpEU0FfZmFjdG9yOgAAr34DrRWil2lE06jH9gI775+twQFW
+Zp+0K1NpZXJyYSBUZXN0IChkZW1vIGtleSkgPHNpZXJyYUBleGFtcGxlLm5ldD6I
+VQQTEQIAFQUCNuOvBAMLCgMDFQMCAxYCAQIXgAAKCRCl5n9/o64+oa9/AKCaJbj4
+sc17CLwMOuvFVejk4mwUQQCfcrpQGZox97B60MgQRs/wklSEVWedAaUENuOvgBAE
+ALhxyR0+JaBA2Qa8CberwXHNEuiDrz+N9++Pwy+375dDg2KQ7RUnx7NiRV368be/
+lGgdMhLKeYxZlmNPnpoUNINk86RCzYbSpmAASBOnMJQF2WdQLxmsdJNJCMKfse1H
+ZylgIJQGWI+1q0O9Lcx7Vd1F8GFeJvThMHRyLoOvMVCTAAMFBACN7RHUg2b0aRko
+DNMQKL6VV6LvBteSfgkXqf2vUovmhQtUXxoYc0QnVPCPuS6raRpxiNz8OLgp0RJF
+Nk32zOVmc2u68B30kociBt7Kx6d7fJGHL5gVqpebUy1YJ3DBoOIOgcMBKmXnlG24
+IrHPq5bvuqGtnwToZEOuEj3ZHzwNuf8EAQMNWAurDujitWKsoHgLoNHMAI9CpJsg
+3p5r1/2dTbN+h0CJ+lqHoo70wkoAb+gaM+7jq/FWce/7mNExPIYobdgkvZ2rbKJP
+x8o0zJqu77IkMLTb/eh8z+dEaC9X0S/uYgN6AUJl/DsEU+XwOd+JY8Es0wJda+M0
+qvSGaH6+kTYy4pO5QD1BrfdPTOVNxcFna7HAItZPiEYEGBECAAYFAjbjr4EACgkQ
+peZ/f6OuPqEzHwCgo3fuvctqBR1zM+lGiitaCcoRH98AoM2iZsG2q1yiU3MebUWD
+xcPCiuRMlQHOBDbjsAoRBACQ4U3waYeRudWpRA1GiHxbw9CvqFw16gwe4Q4N7LVS
+KWUffXdm6P3TzrlVqK8FxQQyXitHO4iREKzFipcXam0RpB/KWhUpy+V1qOMTI5J6
+pyc2Lt4G+9+IqBR0wuFgzNv76ExrhaS8Pnoq1vsJddsLrB6ZzZFsTBCFrdh6Bk3q
+3wCg9yVAa2nj2/IByp1xc8hLvES6d7MD/12gCo3vjQGHqoXAKsb9khD1I/BDILV+
+0g5JMg7/MLkX3DcDALeF8B2J5zN26VMFo9iXAxhPa7DZ2vx7hQI8/9pa4VCp3B9A
+ssL44WLbdbfdo9HD2Wnkd6WPEf25vDbNtLYj+7sVZY/rMyNj3+SolB4YlhydkU1x
+hNqVJk+lBYXNA/47smbyDSsJG1EksKSr7KIteXenuFseT2dpgK0+cvlC4rQceFii
+LF1elFVWhATWgXut5PXBRnTxG2vx35Une+pC5nEncvha+93d0zCK5sACjFXSo0QB
+HN5fO2Gj3dvy3U/k1swkMN9xKLXsSe8mc2QNkicdu/48iIF5FrcL5+VAjP8EAQOk
+qTnVSVlDNyanmeWCbHT5y1XDf7flXnKwAlPvRhV71WMkqrgQyZSO/SYjOkRTQV9m
+YWN0b3I6AACvYMiOr13riT9DyF8K7MAH9rFUqh5JY/0mIzpEU0FfZmFjdG9yOgAA
+r1ZK4vMwe7MVGkYsBl0OFJFhJWf+nD/9JiM6RFNBX2ZhY3RvcjoAAK9tanjl+Ggi
+icD8mvH2FEnlCyuiB9iHtClUYW5nbyBUZXN0IChkZW1vIGtleSkgPHRhbmdvQGV4
+YW1wbGUubmV0PohVBBMRAgAVBQI247AKAwsKAwMVAwIDFgIBAheAAAoJEFjLmkyF
+qB84JOIAn1w8JVmBDp+6A35ia9SqWpt52ZiiAKCIHwczU5eSjSlPSm5W8C7dlk+B
+CZ0BpQQ247CeEAQAnr0w2OcvlUX7E8u2C8dJGIj7wRU5qDazxh0tw55/ybJ3/Kyh
+CFfsr2dZ2E7Zw6Yvc1u3WTTf82nH4S+/IJFSI+qBi3TrcwVtt8Xa3Po7cIzNvS0b
+BhqfmOOXJc4ihUlADR2Jukm/QC+f6bO8IZBDWr/7LnT4SwEPhPoZNMFb63sAAwYE
+AJ2kiP3e1zM+zEo2i2jkOny1Igyn0sRiuw0OXQ9B656zp02G5qtDN+IXhgLdfQqg
+qyWckP4BLDJ4NtQoEM/Mr2/7oj3h01XpbU86R1QFQOXmoWw3q7yqEWIwfOBqClSF
+0A14sXdjQwadyabTFsW4m8Zn5jLW+1sH4PrVjHoNEz4C/wQBA6SpOdVJWUM3JqeZ
+5YJsdPnICDfLPDsLTp+mSJOvz8ZkqbdjjI/q3Kptusm2FbDk07+WCtgfeKcaeJZH
+FNDb0PYRG9S22OGNlhDTmZluNPmUG5syMkoyycBX+4RTirp7LNS+VBIOHa6d1wD1
+k8lANIjD/ilD8pW0pAyqN5oJLDgGD9892G7eeE9Vy4XGRmBB6TbFMF2IRgQYEQIA
+BgUCNuOwngAKCRBYy5pMhagfOAibAKCS4dbgdlteoklBNH9XU3+trecmqgCg4u4N
+x5RLyPVJoOlZhb87WTBcW5+VAc4ENuOxqREEAN621mjyBM5OvWclduTmwl+5VJBo
+yZuAulmkyzdDsL6ABfRdf5D+9y4en7BXY2rRLi/7Dkr6zEMXgDxQN/6r4aY0owDl
+TbuGRwNC8TjwRhSCFx1YqNZ4XCaYk5vQoyhq116HiI9PiPyhwbD6LTPqj97TLQ5V
+axS8iqniJk/dSWc7AKCA6rkZ88kyrcrdw0PedTsY5Hx7UQQAxyAfT2jrwduNvCnD
+56M+4rBUVrfsI5f/rkUXw8416V6rsyvdjzIqpssiwhYNrGuV+WlvIzP9KG4N01Ty
+CH6ax/CHT5E3N0Q+akkIJUk51k7jpy52BvIBCuIfs/KxJuLsBuamcyXuRCu6EBlZ
+cu2cfV7WQqi8HjdremHzAXiSi3ID/jkDxssoSYm+mr9qZjpWMOcazGQOOPDY6hVu
+3ywt0aOmBqePd+/LkpGFZ5YsqGa2rji0f3ubhgOYYIdVr8iJzhoM8wy9Q9Z1pjkP
+IJ56tU5vck3WosLujnHYcG3xETtxec8mXlUrFzirPKzlupARhi3Z0/hwmoqTc6OM
+JuXpMn7x/wQBAwH5EiW2ICr1W3T/Rx6Cb3eG3/JG8Sjo3rpEYlaApMS+d4oM/9V8
+3kr9JiM6RFNBX2ZhY3RvcjoAAK9AzQba8DH0bAE2s5RGAEJ5VAWk/+g1/SYjOkRT
+QV9mYWN0b3I6AACveVUvbR4gGYzhP/+FIlqbM8KFSN9EM/0mIzpEU0FfZmFjdG9y
+OgAAr239YwqXBe1eAtTrlPkM+BZQS5iCzKm0LVVuaWZvcm0gVGVzdCAoZGVtbyBr
+ZXkpIDx1bmlmb3JtQGV4YW1wbGUubmV0PohVBBMRAgAVBQI247GpAwsKAwMVAwID
+FgIBAheAAAoJEKlMD3VlMkTWM1sAn0eideyWSJxrd/trrimzJpapYrQPAJ99nNzM
+TsSCQwsfLaq0E7kkkS7KtZ0BpQQ247HDEAQAtbvtPTT+OnT55+kSbXMy9yxK6Mq3
+D5hzpNxW4jXyfGDJxQXkk/lPvnIYv5Cs5vjeMvE2RPLB8Bqp5HiAbSV9mJkCRYSo
+tkUfQLVZ9h1dWUwWE9avz+zKWUzzCPRDg5QhDyU71/jHbT/MYdBrI9YtcLo0DiQI
+l3a6rD8Xp+EnIecAAwUD/jUUTsyxauJAVKYKE8r1syZfehncpH/jtAIW05We4sfS
+rUC38Rq6s4KNIcA429kM3lh341YWmmknOVFjTLiEMh0XLI/ceJ9uVxhNB1MjlUg+
+OiDgI32Rfm3lzmvzW2HEfs8zkX169asltoOKFfCzeLOLleHT2pkN5ffC5IPJYVgn
+/wQBAwH5EiW2ICr1W3T/Rx6Cb3eFuP+IvpNCP9FJtq/cHx/aNtVczSNEk2ParqkE
+bsZoGgIF0fZStEWeTda8b2/P8dt8E/hZL8YE86A6y26jjzhIQBnThCdlxYXCI+f3
+rwXSdBJYBu6jvOA6Cp7VJkBGBUknV3c26VN6mF0tq2xw8EdB0Z94SBwIObsUJxUX
+GSx6F9n/BIaIRgQYEQIABgUCNuOxwwAKCRCpTA91ZTJE1s6YAJ90NN6PZ4hYojIq
+GPHLsoXLX4ZQqwCeNI8dzekcdK9ZkqXRxIfFj4cQH5+VAc4ENuOzmhEEAKMDGobM
+DqPX3SKI3/W8m9LmNgtDUffHGHNd1npnGM8mSyVfWjEWoEg2GPMEmdX3/tvUUV7n
+Tz02IJwZRVlrbEPdW76eItMAY1NB43LpjQTrAR++mVAslulUY6a5V5nJKEc0IqOu
+xkW1LWavujX1JRvlBZLeBkdpsVNuaGJtwUFfAKDfqoZUCcZxnO+dRMalHLfGOn7O
+4QP/apMk2mc+GJwpKSxXBvoQkVcfuZBJmXJuUCc4BUUzHX0ZSKNbgxY/kVR1xN3k
+rMgOCR6dEsGukIsgVWRDj9to/+E6IIs6YKhG7fGcXKhE8z8mf3hDLcmjbCKDCSFB
+T7PI5TkLzlAEP1y2Rtin/Sa71unGZhNyEfAPW/d1dRcRVqMD/2WcTPUaIjRvAqmb
+xUpenRhg/mF5rwmHl81VvVBbZCoZ35c0edEZKpfmyYbKuz7GhjEPz6O/UWGYZpK/
+7r6f4kFUrhO5atClnRyBkvmNmdfbtM5hd5jh3lgqAT7tk7ntPAIh8X8/qm5+Uab6
+3kZwXCPiSR+iEwRp42GbVL7F/b2r/wQBA+smNbHH+mT2ogDvwebUEYQ5u7AjqZvU
+WkfnZPKAVQwghkIrT1Vq21v9JiM6RFNBX2ZhY3RvcjoAAK90DxORhCauJg3tbEH5
+zO25GERe8T2L/SYjOkRTQV9mYWN0b3I6AACvW0fayFNyPj0o3kQ0YOk+vZDnV7i/
+4/0mIzpEU0FfZmFjdG9yOgAAr1sEI+EYL25Oh+V/MAHMZ3nfeIm133O0K1ZpY3Rv
+ciBUZXN0IChkZW1vIGtleSkgPHZpY3RvckBleGFtcGxlLm9yZz6IVQQTEQIAFQUC
+NuOzmgMLCgMDFQMCAxYCAQIXgAAKCRBHr0tpYfBHhMxJAJ91JH/X2uIsYSrKJmI/
+S1Zgwoz1/wCfdQoDeGHzNwPI5NaxIZH0XYr+O22dAaUENuOzvhAEAIeRQIHb2kyS
+94wRnI2IoiaLMXk1n9y/3VGPfX2TfEd/Q0laFCn/UbfxLEuQ8sF1ZygHiYlE2MPJ
+WzEVRe9FYUgx6TAvSrWwdJZNwnAKlCz4soq0+YPcsDduFu5NJ2liCYrLbVIfh6m5
+uoHOT8/TX3eZZfMeBIYt5ShOjc3t4FDTAAMFA/wLVDdYasFk06YVWXLR6tyWlBG/
+WoJrvznLH9uP26vYvEfBWjMAReHyOaiIpnKgDPtgWenb2RHaq1WmUfWh483IXB5m
+oiO2ZluIJpPixxRVn/cu5hvGAyhQV5GgbiacRW9RSHyaZmi8yZkWu+nS6iNwOx9h
+PHRUGvzBrGAmuDZiC/8EAQPrJjWxx/pk9qIA78Hm1BGEOtrTuBDDiXmHnTN7vG9T
+7F+vQT/JusPW4EJHYO4E2e1J6gyPEGOqrAsLW97WTEN+LW1bdTdY7dhM4jSI+Unv
+ZqZ71xW06WXE2lxGD4ayXuzP6Q0KQT7YcMnrkqBluRJTfGKdjX0RPXt/5+KWd7H3
+VEst836l75/lYfLrbWxaArFjztISiEYEGBECAAYFAjbjs74ACgkQR69LaWHwR4RT
+3QCfcsKGxTTd4f5S/liM5MfnCtlAU9QAnia0uQcnuH/aodTQqspKUGN3Z04+lQHO
+BDbjtDQRBAC9Vf1MkTKc8kSxfdfZ8Y88OJAr6gHsPUg0j1t8gPk0q2ijyrJuK84u
+jzmLmbtFSITKFfcT2VSD1u4qa0iFqzSwnywtRGYKd0gq1eMhaDcp3SmaMTyrbPJ3
+sKFDd98nbTzvnA1tHgZCFI7VZO7HBGgvnd+370lNQsnGRBF/vUDObwCgllBimEp4
+tasu0WNvZYptjGy3ni0EAJLsL9W7jR64h6+nZNkdO1jRT45sW8mvyMOt1BkyRQVK
+6G2Lut879t/upPCYK+/ohWaf3TkAKH1ucrBm9xHlPXJHZvoIA3brt/OuJmG7r8Ub
+70N2vrZmdXas/w5ru7EBcKeii9pp8pi6mim8dXTPS1R/b7BqytB0dlO9zSl9j7no
+A/9Y5UnQobM/qT1tiNhJEnUwlvvTB1UWId2UiUR3k/eNCxc7IdUytanqofXSxAu2
+jyDB5Ymv1od6bRCNM1JNWnOnqVoEd/u2csTAIkZ5fl/kE6HztqRGPB+H0n3Nb4MG
+u2mpLq+OUNhTnLpEZsZGXqd21eFXkWkThxstrH+kYVYSrf8EAQMsrHk/oVe3Xf3i
+4RPIB3bwsBoWGrA4kRK7mm5a6M/pBLavd6wy89rv/SYjOkRTQV9mYWN0b3I6AACv
+ehBH0gU1mDQlnrZJH1j9rE7y0RQQ7f0mIzpEU0FfZmFjdG9yOgAAr0wMh+wQ/T3L
+5WOeVMHnGH1mSba/DcX9JiM6RFNBX2ZhY3RvcjoAAK9nFbd0J8gWcTtZNckFwvKi
+KKj15fB9tCtXaGlza3kgVGVzdCAoZGVtbyBrZXkpIDx3aGlza3lAZXhhbXBsZS5u
+ZXQ+iFUEExECABUFAjbjtDQDCwoDAxUDAgMWAgECF4AACgkQ3vD3uOxn296iagCf
+SizgYr94GzIrMWbc6H1ha7gFOX4An2oeiUql9DoXgvph82AUGtmv9TuRnQGlBDbj
+tFYQBADPV+xDMQ8NzkqoJyO+lriAUrCNIBf1Kbc6U/IPAGOoED1YVPX4EB27u3K/
+EmRVd3clFS085Dau5rFIr3d/xXnLn++wqSgQq0Jc7LflMpIj0P209/oKt6MBovTA
+Qn3lNpecmWd8oxiKoPP158Zgm7iLcOvRTcs+/p0KAzNvHIvQdwADBQP8CQS48V16
+lhWOSXV6u3JOukMeWBw6Tx+7M1CqyBihmR8ZNlF6FPBvVkX0NFVUH2qJn5yr6Pmx
+QxSRnC3yCEyPBa48xqIditzynMbEIkNUrFZTE915rr0k9MrwzPGuLfaPtr/Miy4B
+I0dnZ/5U4hoxPwDbp0aPUwRqb8+T9POTZs7/BAEDLKx5P6FXt1394uETyAd28LN6
+Abjx+ozpGMN36+SHvBm1QBbee0EWJ9LYnatmavOGPgEn7HZFbgk/QaUQiMRMNQIE
+ykHjoKU1C5uWEDR+P/wuEYX0+pQ1UhUUZ8v+/wZjAC+X5WymJmjKW2l4LXfq0RpO
+U3DedzHl5+zcuhfZN03MhxX4mcTHdGNSLqWzikj/1HWl3ohGBBgRAgAGBQI247RW
+AAoJEN7w97jsZ9ve/yAAnROeKraABkL+JUAzQwMcNm+0JCezAJ0Uz6p+tN5wt6yw
+yH09JfENI3F77ZUBzgQ247TcEQQArUqUbiVTMxJhp8bA4vMXAzCuLjys4A44DE+u
+RFb9AGsZTmw/FTPETO7iU/3frlyYyTgIvI2zDF1SwHXG06KF3yIu8LF6OCM0N0k7
+KnKpw8M2tkPiT+D8ANrHU5d178evzm40PyNDyKxSGNlIG1N4MIKFtNdMlahLvu91
+kG04WesAoLPa5zISvsX+Ew95M1o4Qti8iYHbA/4wr+eYRywP35eb/F5V9bOLWhWm
+EDzw4KHXQ7V+OJ7JD5n44S5KLPKwIogohDlPmrxDTAJ/YAukApUItd30kr0Uq34Q
+gFktAsqgCP7C5KEM1TTxU25Tcs4ojUHoDyMj14ECuiTCP0ZFRKUivopgjgRhFTKX
+VVWTySkQ0g9SDaITSgP/a0FyXMQUYJjuB7GA6r4U6QnIHsxS5xrQgkshb4tp2MVW
+MhqlhsfOLaj1WZ+oe0DxKw0O3YKTH/EAzmNelKcMbtTcilLaIdI5l+Ylam/bZe7Q
+vbN2s72Kn2PZjtYqO3Uzqw14bqAJRl0ekleMdZRMMzAsour+iNVPHnlodXnQ2gz/
+BAED36GMDF6APjbzsvUK+yk64h67FO9lD4i0FiXAE3DtfiBKzYh3jEV1uv0mIzpE
+U0FfZmFjdG9yOgAAr3nDQWlricc0AeWTgJNI54Z91WZHkBP9JiM6RFNBX2ZhY3Rv
+cjoAAK9OjHQxUQz8Wnpik8iZguVXD27lXLi9/SYjOkRTQV9mYWN0b3I6AACvX6xO
+WYl810CKCu/QJGFZWsNhMV3iibQnWFJheSBUZXN0IChkZW1vIGtleSkgPHhyYXlA
+ZXhhbXBsZS5uZXQ+iFUEExECABUFAjbjtNwDCwoDAxUDAgMWAgECF4AACgkQiXmm
+xVZ/s0q3TwCgnrUiygc8NmP/EDsgHOweLy5+oMUAoJCz7S9Q/1f2X7xXU9Xs2xka
+KazvnQGlBDbjtQUQBADG4aUG+qgOTGEgOAVnN0ck76AnKb3jOBIYeQGYEgF/lDYb
+Y7fOQ3tIgQ0jXrKD1zHLvORNsG708yDNR79S5Ci/1nphcrNOPWMujOsZ2WMo5xbl
+hG+WJujt4pcNSRK9P5fonUE4hV7GXTljg1yZ/ui00Ot7b1B8ryAYE79t1B3svwAE
+CwP9Hg2r8lBq/j/t3kRO4xl108DFXiQKdj7sXugmAcMomF4nG3j2s219dLEFlSwn
+0/peGvjp8JFPfcMPU/xHJSaZLf90mXsf+pHcDWujHgVA9YC6ThYaGx9Je+VmcVYo
+mELxNnMWKyOJePDU4ViIXhMCvGP0Pt39wcQoiLjeu15+l/7/BAED36GMDF6APjbz
+svUK+yk64h3k1cEq5Vaa4ZpvzNmxRxEEMST+XLJ7leRFzngFM7CJLENe3+ZTqaS7
+d9/a0p9ocVwP2NHOBTLSUiKi8PacU3qtr5A79M2AtUrlnwJca4opneBLJgNGJLyR
+Gsv6WEWrPZ1PhR7v6SkUfj8jQ/Tzb1lj6DpOApZFH9fHv5btLU+JITTR+ohGBBgR
+AgAGBQI247UFAAoJEIl5psVWf7NK7JAAnRosvXTK0JTDng87kaiXLAT3t2H8AJ95
+wwtp1x0eP4rcO45yUsgGIoWoU5UBzgQ247VREQQA3VAGc4T+vuvVXcka4ETaLaLl
+L1xOiPIdJMWRWWQ60CZqWXDVpFBw6oG2AyfUZiHhLlmTZssz8UhXLw/URsPSpiGb
+tpGWKiLs4OCqjslN0lHzcnGqxGWCZJixMgZa5DcWZJjwqdXEbDChgm4ULP/7+iKv
+IenTQNhFoCXr9MtdoHMAoLpNCmSKlTu1H5GlWmYTK9AndWrfA/47ip0VYgzIvUhI
+0iWcG95sNfshApzPL6zPgKBqACogs/5/DfRn9g07BcuMihLJD0PLNPVnOXqQRaN4
+Da7jLuJA53XtLgpogxG08M6XUimTucfcovu29/bgjZIKA5c8KJ2lzXSJ9jZxSoy+
+O051f7yhXbUmYC1vdNr8GBk69QKy/wQAiHMfU3cbCfTTMmig+zBHCkHjqzqr/zKt
+R8RT5AwSOIU2aUIiHdV08apCelBw8PbEf077TuWCq2YyDZJmgWRYh5cdaMgdAd7u
+l1FS1yHPZYshcofWjgXUJHR4I8iPCs5OmdHo2HK3uU2OM36ZQGSpFA5WN1NEm9Gt
+MSBoYKN2ERD/BAEDE+RZ21hlj9nFUQKkDf2E3ET88XB3l0M1bCxCv2UAfGp+pESW
+bFZsBv0mIzpEU0FfZmFjdG9yOgAAr1wtpFPolwbaQUa/5Qmzo2/e2AAZMSX9JiM6
+RFNBX2ZhY3RvcjoAAK9Sfv2nvtEYMQvNNDd0DvnBNBoxlAS5/SYjOkRTQV9mYWN0
+b3I6AACvZ5hJ+Tl0FtvDC+JX0swooQzPDGNCObQrWWFua2VlIFRlc3QgKGRlbW8g
+a2V5KSA8eWFua2VlQGV4YW1wbGUubmV0PohVBBMRAgAVBQI247VSAwsKAwMVAwID
+FgIBAheAAAoJEJ7vNM1LEbJfV7EAoJAAKzgeRH40g+m1xX5ZfP6QnCcoAKCbTZMS
+o0H79g6Zn2wZbdEVGwmj+p0BpQQ247VnEAQAmuK5RcS0zTyXp6SjW2+WeQIpJnJD
+flL0+iBe//3SADv01qUmw3jWMAuxG+CcCApksl122V9npEHiLC4Q2A69roLRsbxK
+BPebustfadLJoVYqPsvjnrBlafe5GcrFPnKbE0wV6ZXx/Tp/eSDiQlid4lWz5J+z
+/mN7KhHANzoRAbsAAwYEAJO5fkCSdNwkisFXzeKslWxm9Yoe1TOouiSV11hex0j9
+4Hpz5wGWEXF7z+FbDq+4V0UqGkKxaERsl6HMWNkImj57N/9h1C1YDfiKTimg5tZp
+KmehXtldpWGCNDZrE0RasrFCKENVhFMhpc4kAnx6rbA0+LhRvJkvkdxY7pKU//aZ
+/wQBAxPkWdtYZY/ZxVECpA39hNxHnMEofjVNfhE0JAv3KTJRZHOCbzCkO+DxKgcS
+IsZVSJizzudmVLYbQWMKc0ykAvbJot4k6PgNiWwUyY8HxQs0F+5YYtQkMs8VdIQN
+ez+5E2RCoB+VflUVq4qhWUxXB737maUEsSc220yeEj04n59OlPILb+A/XvwoCE/F
++kCQdlS7BA2IRgQYEQIABgUCNuO1ZwAKCRCe7zTNSxGyX/RcAJ9X3N2PPlX0KeNx
+UHefqmpPYDF6GgCfZmyC/OlrmmSulJ6NAHxiQNT4D/aVAc4ENuO1yxEEAIEMk4Zf
+0L/HEJVk0/o4fPpwvm8zc+KZQCFX70cBVU9BWJOcUquRg9JDJF9bOM5TxE7VOnkI
+fPvjug5vqP0/vjIfW7LvzIWDhS6FcFaKeG4IoqrgghbAmQIoEWvVTx+7xrpjo1yO
+qIMDQqYZEmsw+Zd6deQmkUYcbvytS82L0gx/AKC6DM0guH/ddkJlT4FQ9h5cv6dQ
+AQQAgNdmGPW8VceCL2WaKMoOMmhwQGhqY3+1pDLo7HVFEPoe18A9jlMRHWfvGb2E
+zMT46/Ugqkf8TzvZGFrWq7W/t45rp5O41YXQ2+ZJH3nl+t5Gw25Hwk0hvpK0jYRH
+2nMFR+PKQL2mDbA94LvClAkgX1MX4lrUG8bYj6FrbEnvzoAD+wcRS8A6xznxhs+V
+sg/KnYl0Qe9dNFPY0hJVG5MxCyDy9X32cxhHYJSHbvS4/LLbFloP+Rhwn3/WeBjs
+L2lts1ahXvQ+QQw7+qPrs4hWJZU/NSEh1RGitukaG5zegHNTE6CJqXshshI9Ei0O
+CDahmhjiGrJA3HwKPZlkDMOkza8K/wQBA3GTFCmP28PloZW7fHe9ipQH0TkH+yp2
+IXXRWNHjhcbOrwkv7+jedHX9JiM6RFNBX2ZhY3RvcjoAAK9nd2gdDGXr+aS4H9RN
+o21VL8OsKJBj/SYjOkRTQV9mYWN0b3I6AACvXT7TUKyg8va6X0RToEWg4+feDJFE
+n/0mIzpEU0FfZmFjdG9yOgAAr0s/BxXRDWjjCqZNI5VKmGD3EQ2CCWO0J1p1bHUg
+VGVzdCAoZGVtbyBrZXkpIDx6dWx1QGV4YW1wbGUubmV0PohVBBMRAgAVBQI247XL
+AwsKAwMVAwIDFgIBAheAAAoJEGvEd4BUrNJGQOsAnjgUjTj9/yeCyzBgwu2Fs1Z2
+HB9aAKCYdUx3OscN3QmqVVre3pwZY5GmSJ0BpQQ247XyEAQAzHzwwUKDM7+djJo2
+/EnWmCijc6g3fStaGNoXDEovi3B2oPiiRTsigX90qB5nFP7whDfi8k4JY2Eig5hH
++MGdvni36hYEnQSadsZueYofvQh14N3V8fUmx4hiQiMXyWiLJzc91ZiRjww4wZWn
+/4Y5f+0mb0fjCaVSxTxo4+7joU8AAwUD/0oL9Gm3gl1XVV8BhJoXVdFQ6PN9yEEX
+UbtcrfkC51kTBk2NaEGqbB+kC8GEmXwyZcW7AQN7X6ikraUUm3RjTU7CvkSHobBn
+XYt7FhqZURpuV7eSqZGP5nP7SxWmCTTKgIH1kHCpWRwaexKFjIIkYgyVFqtEx9cE
+Q6D2kXPh+Rna/wQBA3GTFCmP28PloZW7fHe9ipQEjson+R8J0cZFxO8B2k6Fas1C
+pLvP8P0NdTIyitaiBUatIGDI8N22I6mqelpWZpTKZZymrDKe0n8h+rTNqb0uIt8F
+R+6/1qFnL1k3E/+QxqS7VGkRz6xnT+la7OVrexXz18ynbpvzJMPe2SAPyqY+RSzW
+wf5Z/bgM+A/ftNFfEencn7KIRgQYEQIABgUCNuO18gAKCRBrxHeAVKzSRn1jAJsF
+3zuwZ09o7T0yZNm4zWcRGZvteACgroLrVdUuNxbdEllH4BbcvFB06zA=
+=P9+G
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/checks/secring.asc b/checks/secring.asc
new file mode 100644 (file)
index 0000000..99e02ca
--- /dev/null
@@ -0,0 +1,73 @@
+This is a test secret keyring simply stored by GNUPG so that it is
+easier to make diff files.
+
+sec   1024D/D74C5F22 2003-12-31 Test one (pp=def) <one@example.com>
+ssb   1024g/47BE2775 2003-12-31
+
+sec   1024D/C40FDECF 2003-12-31 Test two (no pp) <two@example.com>
+ssb   1024g/B27907AA 2003-12-31
+
+sec   1024R/ECABF51D 2003-12-31 Test three (no pp) <three@example.com>
+
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+Version: GnuPG v1.3.5-cvs (GNU/Linux)
+
+lQHhBD/yNQgRBAC/KSfe6uVfDgA3BrGpNLhVxT/ytwXMpBI8pEdTiY0jWnYrb/Yu
+8wtCeZ9GAux/ZA/ted+7pdibHXfX5PzDfgUTZwrIJa57OUpWwI878AzZxNsnVv1I
+P6ufGyESKME4PUQO5heKhwAb0gQwFwArS3v4oeYrEljhJ79kpt319JEAEwCg+hTk
+nylYwYGT/PEVQ4JlLPoWmqUEAJn1HX1Od5tyoK4OEAM5G+wHz3SBj4FMonZNWs1I
+t03JKHoM5ulQ2FgEWmBVIPTKSDm/jQXPYApz5DpxpoGYbTCaEo6zfE32AEzoXDmG
+AZE90Xhq/wcEN+JcHpHytAA/n+hYaR3sYegQ52mWMR+vdd99KO0V0jLRcckgBA7Z
+2jlFA/98cyy2nYt0QI5Tf+t/d4WBeib2yNWVtZH/j7XpDqHLZDgVAYkazCA6ZF7B
+vLddBEqVAh1X5tqua4AXX9L4SGYb7B0LRV72alhYiWWHez126KjVgwRTUxtEJ4En
+HmYJRReLlXosPIRhXSz7HFAqalPXJ0DvC9kzTQnnjPOylyMPTf4CAwJkfa7fzYfs
+BWBdwH11VHPRv4hkbVaS7Vw6TTmc9D+ZEFv6pw+gTLldIfEZU3+24eoVkMjdwGF2
+dXN/V7QjVGVzdCBvbmUgKHBwPWRlZikgPG9uZUBleGFtcGxlLmNvbT6IWgQTEQIA
+GgUCP/I1CAIbAwILAgMVAgMDFgIBAh4BAheAAAoJEA73cJbXTF8iUO4AnA8wHb3e
+rMrfWV3ij0d/cEiSJAYFAJ9fcbShgTXDN1dIVZvLSW5E93TfC50BVwQ/8jUNEAQA
+6AJLWnjvNx15zRS9ULSmF7BqUdRTp/ua6VavSPRljVFTQg4/XwcB5Psg1zA9xRpS
+8L0ph6deZhu87WLuw01QI6wpRqbCD6hI0xxszcDA3DGWCBPIlLU3pbMhfsyNEtSV
+Sq1stGE8MaUKW23rJ4CNLSllPrjpMA1oEOJEiCT3gAMAAwUD/0aHZfVLL7gin9G0
+wkM9k5j5jqxZQ3s6IzYGR1SYIs6Zo5V+CuwR68p1IEGPShVY3zVTTaLuNDOGEAje
+1kwUmY/+GUXsCVLkdJouPb63WccAorLvRCGyQg1HjUIK/2wcBzmA3Vatjk0Ol4jX
+YaaqxYw9BU9QexNN7RCxPpdsfO8L/gIDAmR9rt/Nh+wFYEvXzcetbmRUtlnyX2e0
+2F35hsF4RxXrHAYepLiQbk+oWnYH8mWL5IED80PzjUifsIxDH9AWHUBvD+4NjxWI
+SQQYEQIACQUCP/I1DQIbDAAKCRAO93CW10xfInB4AKDKD5BulHRXb04ynP6YWel6
+I2g3fQCgqJEJLoUNcIF3tp2jF2jBr80WmM2VAbsEP/JSaxEEAKxxqlg9Kz9DZ/3N
+52BC0w+JtYKke39vpdWVDHR3MHmMJ/31Y2iSpm0fvRs3h1j9/fBVmLOZglNQyH62
+SxdJyZwCelkZzfUy/qLm9Qaqi7wpg0p4EbmWdoFF/A1Zg/MU7D5w5xu+EA1J77Z6
+QyALN9rIOXZ7rLLa64lw/MV4LdIPAKC449htJbbp5rkJHvBDs4YxEIkk5wP/X4hP
+GlIw5PlHrsG7hdahhTudV5hRGlvosnwsrYJXvKAQLAV1EV26SIYUH5pM/ycXrG25
+dqVoG56uQqnhBdUqo4iSnsxY3ZMA46D14REc9P//CGvJ/j2Z41gw8u8oB7rS50dj
+voaWb5myj7bhacTBdfah3U8dVXcIi1ZFvtiaGAYD+gIF7eNIdpaYiB0427un4ggc
+26+Y9nkF93DaMnZEaYSeum6g/g7D1vwINFgQkMYEWi4DK3W+uH0E/n8o20wS2wvM
+rbeYaQm5v6ucd001wwFDY6AdwpwP7UCLQcu6qqvwNHdxWYK6+gIsSufLmeMGrsvC
+0WQqYeu1GfGpHIMCZJlZAACff9jWuNkBIYwr0gZvXL9kMpPTORMJ4LQiVGVzdCB0
+d28gKG5vIHBwKSA8dHdvQGV4YW1wbGUuY29tPohfBBMRAgAfBQI/8lJrAhsDBwsJ
+CAcDAgEDFQIDAxYCAQIeAQIXgAAKCRCXPVDhxA/ez4BDAJ9sPyWbgc4424/Rt291
+voaJYdMdFwCdFAxAg7wN6d8qoZKEWJZUiopPvzGdATEEP/JSbxAEAMzYsfnax02A
+jMUvDYlGTaVUxp1n8zI8QqlcmWLfQhJuwOCXH0m4EVKaairp8K3rg5pjRhXNVvpU
+9aC37yWg4v6EP6Lm4CHKtBGeYDlMnWo/etT1d5bTZmmlEmbCeo0cWmtBQdXIMehF
+QfPIEeiQeJgDOClfgrf3/UMz79kzEvKrAAMGA/43c6bZ7IidduMk1uXsIb1FaZgx
+rk/QrgN4IFuuW4zoX62r1+a3xzAlyz1zDVxYKQNNdr4IVcLp/3pJI+/68WqWZpRN
+vGKUg4/D8J/5ZKjQI8uOujMvsFHqAoIO5hIP++YrNqICs8dS+dp2suwRpn0uNeZu
+wQY1h7IlAOikbRV7dQAA92kVxs7SWBQ/iTexM19Ih/AEK3xjAFOY+TlruFMjjLYO
+TohJBBgRAgAJBQI/8lJvAhsMAAoJEJc9UOHED97PLL4An2KG78IRsthGnHJOtnQP
+QrYoxb27AJ41qvZyQw0V5ClIAtEtd+JqUnxHmJUB1gQ/8lO9AQQAqFJWduzk11/m
+0Ac/K/mab0kzzr3UUor1bkxh4vcxJHOTZF3a9Y6t1WUpwlOXeCNkY98tRYUg6A40
+wFgkKz/4jdOaiDtHW2bOqrvJmJ/wH/5zdmDpthu53JEgXUKP/+j2dfrvYTZYxy2m
+11DA68QK9iPSBmksglFMQE2IJatwEAEACQEBAAP4vKABRIX7dtUOm2y6VyGsESE5
+D4YI1AhL0EWodt84EPEUvC1o61UuYbAe28JIHwjIKDLgDiedZ6hTBV3K5cI1aFHL
+421hDE0qtD+mVZhcRGnR2RHhr9gX6qX+4P8mV0w1nhdShwUhlFO1GuwQ2/dWKwYd
+XGbDW7P58LIiudGWuQIAwzxYBjmWvVl1Kqvf2s2qe0tmqhdU7g2Jt3lPDej/ckxU
+n/ESozKSu517zueU8IAkw+Vf2CM/UHntSZHE3yYY2QIA3LWUXwDxr0OL1MMRuLrK
+PZ2wrRZRmGU0IDDx3zBX5VMsR/WNMwPLo8iimBT2F7ez3umPqqrugRtJj6ryF3t3
+aQH+Kfst9psjWkmpBrEO99j4Gq6orYHnzd4fSnnOJEv4/ObdXrGBGwvV5RZblXCF
+A2kB3ShaYowpengtqBVzpD0cCZ6ntCZUZXN0IHRocmVlIChubyBwcCkgPHRocmVl
+QGV4YW1wbGUuY29tPoi1BBMBAgAfBQI/8lO9AhsDBwsJCAcDAgEDFQIDAxYCAQIe
+AQIXgAAKCRDRILYm7Kv1HWpDA/9sINfVYaTW7TOQolYn9Vee4feOTpl6+S4dkgLC
+OWoDG/V17k/cl7Jr/iQ+YRBOi0S/fFwMBn72kEvdOtmiUAqHGQFnTyXhBLLvqTJ/
+yEHR6hnZK+zsusY8EmvoIdfSTIOJqkeACEEpCr0aE0qkgBm4voMrZ05pAO2hFJba
+IHWHiQ==
+=52aT
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/checks/secring.skr.asc b/checks/secring.skr.asc
new file mode 100644 (file)
index 0000000..0081b59
--- /dev/null
@@ -0,0 +1,27 @@
+This is a test secring generated by pgp 5 beta
+
+Type Bits KeyID    Created    Expires    Algorithm       Use
+sec+  768 439F02CA 1998-03-17 ---------- DSS             Sign and Encrypt
+sub   768 CB879DE9 1998-03-17 ---------- Diffie-Hellman                 
+uid  pgp5 test <pgp5@dev.null>
+
+There is no password on the key
+
+-----BEGIN PGP ARMORED FILE-----
+Version: GNUPG v0.2.13a (Linux)
+Comment: This is an alpha version!
+Comment: Use "gpgm --dearmor" for unpacking
+
+lQFbBDUOrE4RAwDbbxWAbWsheUJprK6VryMTpwDiYwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEm
+Sppp/6/Ygp+N3n32Kznq7PjHXiuWLlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUAoP+KBFly
+qNMdsK8j+ZO0A8rnImGrAwC1ddDme5iZFkTEWHhrtU97sEu2GDkSQB8HdX8CoRcrOz/B2WliF6qf
+BKhcZPFVBIhKNzjTfY7SEYAZk2zcsCm8elnwSLaGEzxKFNFBqKDNXP+a35spcqsHSGzDVw4VuKMD
+AJNnAP6skpHlhVAmecLZT9eRzVoOq1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXv
+dCT24hlfoGoXzkoDInkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLQAAn3GbgsWo+7E/hWakzstp
+TXzI2kDIDIm0GXBncDUgdGVzdCA8cGdwNUBkZXYubnVsbD6dAO8ENQ6sVhADAP8Fa5TbD6k8VmW1
+IjK1DfDI0xUdsVIbk8N3Hb0YIlT1E/6tZdfiNwqaKVQcf17gJIObBwfNM3OqWYOudmBVd3S6E3Hk
+u64nW+ZNt7B2toWRgnk6OgHcSDsud4Igjwz/RQACAgL/ToefzlcVKiPuobKfXHDhIUQPTfGic2Az
+47wkMoYHo9j9ZE7AWaliMdPz4jLyLfqqoU9mH8g+vJhyAc7UnAF2Sk5466FDypdPm5F9PTW3cqqI
+wJM4WgkSlM8J2hxH4YtlAADlG+pxFXNFuDPmcq6jL6dug2ikZ7hcHLAy7DddSS8OAA==
+=1UWo
+-----END PGP ARMORED FILE-----
diff --git a/checks/signdemokey b/checks/signdemokey
new file mode 100755 (executable)
index 0000000..e387446
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+set -e
+
+if [ $# != 3 ]; then
+    echo "Usage: signdemokey name user_id user_id_no"
+    exit 1
+fi
+name="$1"
+user_id="$2"
+user_id_no="$3"
+
+echo "abc" | ../g10/gpg --options ./options --homedir $name \
+               --sign-key --batch --yes --passphrase-fd 0 $user_id \
+               $user_id_no sign save
+
diff --git a/checks/signencrypt-dsa.test b/checks/signencrypt-dsa.test
new file mode 100755 (executable)
index 0000000..41bf831
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking signing and encryption for DSA
+for i in $plain_files $data_files ; do
+    $GPG $dsa_keyrings --always-trust -se -o x --yes \
+               -u "$dsa_usrname1" -r "$dsa_usrname2" $i
+    $GPG $dsa_keyrings -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
+for da in ripemd160 sha1; do
+    for i in $plain_files; do
+       $GPG $dsa_keyrings --always-trust -se -o x --yes --digest-algo $da \
+                   -u "$dsa_usrname1" -r "$dsa_usrname2" $i
+       $GPG $dsa_keyrings -o y --yes x
+       cmp $i y || error "$i: mismatch"
+       # process only the first one
+       break
+    done
+done
diff --git a/checks/signencrypt.test b/checks/signencrypt.test
new file mode 100755 (executable)
index 0000000..1d05990
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+
+#info Checking signing and encryption
+for i in $plain_files $data_files ; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 --always-trust \
+                            -se -o x --yes -r "$usrname2" $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
diff --git a/checks/sigs-dsa.test b/checks/sigs-dsa.test
new file mode 100755 (executable)
index 0000000..2294cf5
--- /dev/null
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking DSA signatures (default digest algo)
+for i in $plain_files $data_files; do
+    $GPG $dsa_keyrings -s -o x --yes -u $dsa_usrname1 $i
+    $GPG $dsa_keyrings -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
+for da in ripemd160 sha1; do
+    for i in $plain_files; do
+       $GPG $dsa_keyrings --digest-algo $da \
+                               -s -o x --yes -u $dsa_usrname1 $i
+       $GPG $dsa_keyrings -o y --yes x
+       cmp $i y || error "$i: mismatch"
+       # process only the first one
+       break
+    done
+done
+
diff --git a/checks/sigs.test b/checks/sigs.test
new file mode 100755 (executable)
index 0000000..2c3be5c
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+#info Checking signatures
+for i in $plain_files $data_files; do
+    echo "$usrpass1" | $GPG --passphrase-fd 0 -s -o x --yes $i
+    $GPG -o y --yes x
+    cmp $i y || error "$i: mismatch"
+done
+
+# Using the DSA sig key - only 160 bit hashes
+for da in ripemd160 sha1 ; do
+    for i in $plain_files; do
+       echo "$usrpass1" | $GPG --passphrase-fd 0 --digest-algo $da \
+                               -s -o x --yes $i
+       $GPG -o y --yes x
+       cmp $i y || error "$i: mismatch"
+       # process only the first one
+       break
+    done
+done
+
+# TODO: add the new SHAs here once we allow them to be used in new
+# documents.
+
+if have_pubkey_algo "RSA"; then
+    # Using the RSA sig key - all hashes
+    hash_algo_list="ripemd160 sha1 md5"
+    if have_hash_algo "SHA224"; then
+       hash_algo_list="$hash_algo_list sha224"
+    fi
+    if have_hash_algo "SHA256"; then
+       hash_algo_list="$hash_algo_list sha256"
+    fi
+    if have_hash_algo "SHA384"; then
+       hash_algo_list="$hash_algo_list sha384"
+    fi
+    if have_hash_algo "SHA512"; then
+       hash_algo_list="$hash_algo_list sha512"
+    fi
+
+    for da in $hash_algo_list ; do
+       for i in $plain_files; do
+           $GPG -u $usrname3 --digest-algo $da -s -o x --yes $i
+           $GPG -o y --yes x
+           cmp $i y || error "$i: mismatch"
+           # process only the first one
+           break
+       done
+    done
+fi
diff --git a/checks/verify.test b/checks/verify.test
new file mode 100755 (executable)
index 0000000..bfd7baa
--- /dev/null
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+suspend_error
+
+#
+# Two simple tests to check that verify fails for bad input data
+#
+info "checking bogus signature 1"
+../tools/mk-tdata --char 0x2d 64 >x
+$GPG --verify x data-500 && error "no error code from verify"
+info "checking bogus signature 2"
+../tools/mk-tdata --char 0xca 64 >x
+$GPG --verify x data-500 && error "no error code from verify"
+
+linefeed
+
+# A variable to collect the test names
+tests=""
+
+# A plain signed message created using
+#  echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -z0 -sa msg
+tests="$tests msg_ols_asc"
+msg_ols_asc='-----BEGIN PGP MESSAGE-----
+
+kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo
+dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0
+aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh
+cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp
+cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk
+IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM
+UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0
+D8luT78c/1x45Q==
+=a29i
+-----END PGP MESSAGE-----'
+
+# A plain signed message created using
+#  echo abc | gpg --homedir . --passphrase-fd 0 -u Alpha -sa msg
+tests="$tests msg_cols_asc"
+msg_cols_asc='-----BEGIN PGP MESSAGE-----
+
+owGbwMvMwCSoW1RzPCOz3IRxLSN7EnNucboLT6Cgp0JJRmZeNpBMLFFIzMlRKMpM
+zyjRBQtm5qUrFKTmF+SkKmTmgdQVKyTnl+aVFFUqJBalKhRnJmcrJOalcJVkFqWm
+KOSnKSSlgrSU5OekQMzLL0rJzEsEKk9JTU7NK4EZBtKcBtRRWgAzlwtmbnlmSQbU
+GJjxCmDj9RQUPNVzFZJTi0oSM/NyKhXy8kuAYk6lJSBxLlTF2NziqZCYq8elq+Cb
+n1dSqRBQWZKRn8fVYc/MygAKBljYCDIFiTDMT+9seu836Q+bevyHTJ0dzPNuvCjn
+ZpgrwX38z58rJsfYDhwOSS4SkN/d6vUAAA==
+=s6sY
+-----END PGP MESSAGE-----'
+
+# A PGP 2 style message.
+tests="$tests msg_sl_asc"
+msg_sl_asc='-----BEGIN PGP MESSAGE-----
+
+iD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCgiI5M
+yzgJpGTZtA/Jbk+/HP9ceOWtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJp
+Z2h0LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5k
+CnRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxl
+IGFyZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQg
+dGlyZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGly
+ZWQgb2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCg==
+=0ukK
+-----END PGP MESSAGE-----'
+
+# An OpenPGP message lacking the onepass packet.  We used to accept
+# such messages but now consider them invalid.
+tests="$tests bad_ls_asc"
+bad_ls_asc='-----BEGIN PGP MESSAGE-----
+
+rQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9w
+bGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0
+b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRo
+aXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRh
+aW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQg
+dGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IA
+oJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q==
+=Mpiu
+-----END PGP MESSAGE-----'
+
+
+# A signed message prefixed with an unsigned literal packet.
+# (fols = faked-literal-data, one-pass, literal-data, signature)
+# This should throw an error because running gpg to extract the
+# signed data will return both literal data packets
+tests="$tests bad_fols_asc"
+bad_fols_asc='-----BEGIN PGP MESSAGE-----
+
+rF1iDG1zZy51bnNpZ25lZEQMY0x0aW1lc2hhcmluZywgbjoKCUFuIGFjY2VzcyBt
+ZXRob2Qgd2hlcmVieSBvbmUgY29tcHV0ZXIgYWJ1c2VzIG1hbnkgcGVvcGxlLgqQ
+DQMAAhEtcnzHaGl3NAGtAQdiA21zZ0QMUlpJIHRoaW5rIHRoYXQgYWxsIHJpZ2h0
+LXRoaW5raW5nIHBlb3BsZSBpbiB0aGlzIGNvdW50cnkgYXJlIHNpY2sgYW5kCnRp
+cmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBvcmRpbmFyeSBkZWNlbnQgcGVvcGxlIGFy
+ZSBmZWQgdXAgaW4gdGhpcwpjb3VudHJ5IHdpdGggYmVpbmcgc2ljayBhbmQgdGly
+ZWQuICBJJ20gY2VydGFpbmx5IG5vdC4gIEJ1dCBJJ20Kc2ljayBhbmQgdGlyZWQg
+b2YgYmVpbmcgdG9sZCB0aGF0IEkgYW0uCi0gTW9udHkgUHl0aG9uCog/AwUARAxS
+Wi1yfMdoaXc0EQJHggCgmUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQP
+yW5Pvxz/XHjl
+=UNM4
+-----END PGP MESSAGE-----'
+
+# A signed message suffixed with an unsigned literal packet.
+# (fols = faked-literal-data, one-pass, literal-data, signature)
+# This should throw an error because running gpg to extract the
+# signed data will return both literal data packets
+tests="$tests bad_olsf_asc"
+bad_olsf_asc='-----BEGIN PGP MESSAGE-----
+
+kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo
+dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0
+aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh
+cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp
+cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk
+IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM
+UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0
+D8luT78c/1x45axdYgxtc2cudW5zaWduZWREDGNMdGltZXNoYXJpbmcsIG46CglB
+biBhY2Nlc3MgbWV0aG9kIHdoZXJlYnkgb25lIGNvbXB1dGVyIGFidXNlcyBtYW55
+IHBlb3BsZS4K
+=3gnG
+-----END PGP MESSAGE-----'
+
+
+# Two standard signed messages in a row
+tests="$tests msg_olsols_asc_multisig"
+msg_olsols_asc_multisig='-----BEGIN PGP MESSAGE-----
+
+kA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGluayB0aGF0IGFsbCByaWdo
+dC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5IGFyZSBzaWNrIGFuZAp0
+aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkgZGVjZW50IHBlb3BsZSBh
+cmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJlaW5nIHNpY2sgYW5kIHRp
+cmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdtCnNpY2sgYW5kIHRpcmVk
+IG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5IFB5dGhvbgqIPwMFAEQM
+UlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk01pbAKCIjkzLOAmkZNm0
+D8luT78c/1x45ZANAwACES1yfMdoaXc0Aa0BB2IDbXNnRAxSWkkgdGhpbmsgdGhh
+dCBhbGwgcmlnaHQtdGhpbmtpbmcgcGVvcGxlIGluIHRoaXMgY291bnRyeSBhcmUg
+c2ljayBhbmQKdGlyZWQgb2YgYmVpbmcgdG9sZCB0aGF0IG9yZGluYXJ5IGRlY2Vu
+dCBwZW9wbGUgYXJlIGZlZCB1cCBpbiB0aGlzCmNvdW50cnkgd2l0aCBiZWluZyBz
+aWNrIGFuZCB0aXJlZC4gIEknbSBjZXJ0YWlubHkgbm90LiAgQnV0IEknbQpzaWNr
+IGFuZCB0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgSSBhbS4KLSBNb250eSBQeXRo
+b24KiD8DBQBEDFJaLXJ8x2hpdzQRAkeCAKCZRBk2Pmx4w9h2LgosS0AppNNaWwCg
+iI5MyzgJpGTZtA/Jbk+/HP9ceOU=
+=8nLN
+-----END PGP MESSAGE-----'
+
+# A standard message with two signatures (actually the same signature
+# duplicated).
+tests="$tests msg_oolss_asc"
+msg_oolss_asc='-----BEGIN PGP MESSAGE-----
+
+kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu
+ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5
+IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg
+ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl
+aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt
+CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5
+IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk
+01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Yg/AwUARAxSWi1yfMdoaXc0EQJHggCg
+mUQZNj5seMPYdi4KLEtAKaTTWlsAoIiOTMs4CaRk2bQPyW5Pvxz/XHjl
+=KVw5
+-----END PGP MESSAGE-----'
+
+# A standard message with two one-pass packet but only one signature
+# packet
+tests="$tests bad_ools_asc"
+bad_ools_asc='-----BEGIN PGP MESSAGE-----
+
+kA0DAAIRLXJ8x2hpdzQBkA0DAAIRLXJ8x2hpdzQBrQEHYgNtc2dEDFJaSSB0aGlu
+ayB0aGF0IGFsbCByaWdodC10aGlua2luZyBwZW9wbGUgaW4gdGhpcyBjb3VudHJ5
+IGFyZSBzaWNrIGFuZAp0aXJlZCBvZiBiZWluZyB0b2xkIHRoYXQgb3JkaW5hcnkg
+ZGVjZW50IHBlb3BsZSBhcmUgZmVkIHVwIGluIHRoaXMKY291bnRyeSB3aXRoIGJl
+aW5nIHNpY2sgYW5kIHRpcmVkLiAgSSdtIGNlcnRhaW5seSBub3QuICBCdXQgSSdt
+CnNpY2sgYW5kIHRpcmVkIG9mIGJlaW5nIHRvbGQgdGhhdCBJIGFtLgotIE1vbnR5
+IFB5dGhvbgqIPwMFAEQMUlotcnzHaGl3NBECR4IAoJlEGTY+bHjD2HYuCixLQCmk
+01pbAKCIjkzLOAmkZNm0D8luT78c/1x45Q==
+=1/ix
+-----END PGP MESSAGE-----'
+
+# Standard cleartext signature
+tests="$tests msg_cls_asc"
+msg_cls_asc=`cat <<EOF
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+I think that all right-thinking people in this country are sick and
+tired of being told that ordinary decent people are fed up in this
+country with being sick and tired.  I'm certainly not.  But I'm
+sick and tired of being told that I am.
+- - Monty Python
+-----BEGIN PGP SIGNATURE-----
+
+iD8DBQFEDVp1LXJ8x2hpdzQRAplUAKCMfpG3GPw/TLN52tosgXP5lNECkwCfQhAa
+emmev7IuQjWYrGF9Lxj+zj8=
+=qJsY
+-----END PGP SIGNATURE-----
+EOF
+`
+
+# Cleartext signature with two signatures
+tests="$tests msg_clss_asc"
+msg_clss_asc=`cat <<EOF
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+What is the difference between a Turing machine and the modern computer?
+It's the same as that between Hillary's ascent of Everest and the
+establishment of a Hilton on its peak.
+-----BEGIN PGP SIGNATURE-----
+
+iD8DBQFEDVz6LXJ8x2hpdzQRAtkGAKCeMhNbHnh339fpjNj9owsYcC4zBwCfYO5l
+2u+KEfXX0FKyk8SMzLjZ536IPwMFAUQNXPr+GAsdqeOwshEC2QYAoPOWAiQm0EF/
+FWIAQUplk7JWbyRKAJ92ZJyJpWfzb0yc1s7MY65r2qEHrg==
+=1Xvv
+-----END PGP SIGNATURE-----
+EOF
+`
+
+# Two clear text signatures in a row
+tests="$tests msg_clsclss_asc"
+msg_clsclss_asc="${msg_cls_asc}
+${msg_clss_asc}"
+
+
+# Fixme:  We need more tests with manipulated cleartext signatures.
+
+
+#
+# Now run the tests.
+#
+for i in $tests ; do
+   info "checking: $i"
+   eval "(IFS=; echo \"\$$i\")" >x
+   case "$i" in
+    msg_*_asc)
+       $GPG --verify x || error "verify of $i failed"
+       ;;
+    msg_*_asc_multisig)
+       $GPG --verify --allow-multisig-verification x \
+           || error "verify of $i failed"
+       $GPG --verify x && error "verify of $i succeeded but should not"
+       ;;
+    bad_*_asc)
+       $GPG --verify x && error "verify of $i succeeded but should not"
+       ;;
+    *)
+       error "No handler for test case $i"
+       ;;
+   esac
+   linefeed
+done
+
+
+resume_error
diff --git a/checks/version.test b/checks/version.test
new file mode 100755 (executable)
index 0000000..f1fd728
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+. $srcdir/defs.inc || exit 3
+
+# print the GPG version
+$GPG --version
+
+#fixme: check that the output is correct
+
diff --git a/cipher/ChangeLog b/cipher/ChangeLog
new file mode 100644 (file)
index 0000000..d504a16
--- /dev/null
@@ -0,0 +1,1295 @@
+2006-11-03  Werner Koch  <wk@g10code.com>
+
+       * random.c [HAVE_GETTIMEOFDAY]: Included sys/time.h and not
+       sys/times.h.  Reported by Rafaël Carré.
+
+2006-06-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * rsa.c (generate): Use e=65537 for new RSA keys.
+
+2006-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * dsa.c (dsa2_generate): New function to generate a DSA key with a
+       variable sized q.
+       (generate): Tweak to allow keys larger than 1024 bits.  Enforce
+       that the q size doesn't end between byte boundaries.
+
+2006-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * sha256.c (sha224_get_info, sha224_init): New init functions for
+       the 224-bit variant of SHA-256.
+       * algorithms.h, md.c (load_digest_module): Call them here.
+
+2006-03-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * blowfish.c, md5.c, rmd160.c, sha1.c, sha256.c, sha512.c: Revert
+       previous change.  It's now all done in configure.
+
+2006-03-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * blowfish.c, md5.c, rmd160.c, sha1.c, sha256.c, sha512.c: Use
+       '#if' rather than '#ifdef' BIG_ENDIAN_HOST.  Harmless as we
+       explicitly define BIG_ENDIAN_HOST to 1 when we need it, but needed
+       for OSX fat builds when we define BIG_ENDIAN_HOST to another
+       macro.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * random.c (lock_seed_file): Build even when not used.
+
+2006-02-09  Werner Koch  <wk@g10code.com>
+
+       * random.c (lock_seed_file): New.
+       (read_seed_file, update_random_seed_file): Use it.
+       (random_disable_locking): New.
+
+2005-12-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * idea-stub.c (load_module): Not legal to return a void * as a
+       function pointer.
+
+       * Makefile.am, rndegd.c, rndlinux.c, rndunix.c, rndw32.c: Some
+       cleanup so we don't build files that are completely ifdeffed out.
+       This causes a warning on Sun's cc.  Do sha512.c as well for
+       consistency.
+
+2005-08-11  Werner Koch  <wk@g10code.com>
+
+       * rijndael.c (rijndael_cfb_encrypt): Experimental code to improve
+       AES performance.  Got about 25% on ia32.
+       * cipher.c (do_cfb_encrypt): Ditto.
+
+2005-06-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * random.c: Fix prototype of the fast random gatherer.  Noted by
+       Joe Vender.
+
+2005-03-23  Werner Koch  <wk@g10code.com>
+
+       * rndw32.c (rndw32_gather_random_fast): While adding data use the
+       size of the object and not the one of its address.  Bug reported by 
+       Sascha Kiefer.
+
+2005-03-07  Werner Koch  <wk@g10code.com>
+
+       * primegen.c (is_prime): Free A2.  Noted by pmike2001@mail.ru.
+       Fixes #423.
+
+2004-11-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * md.c (string_to_digest_algo): Allow read/write SHA384 and
+       SHA512.
+
+2004-11-03  Timo Schulz  <twoaday@g10code.com>
+
+        * idea-stub.c (dlopen, dlsym): Use w32_strerror instead of
+        just showing the error number.
+       
+2004-10-14  Werner Koch  <wk@g10code.com>
+
+       * rndunix.c (start_gatherer) [ENABLE_SELINUX_HACKS]: Don't allow
+       logging.
+
+2004-10-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * algorithms.h, cast5.c, cipher.c, idea-stub.c, twofish.c,
+       blowfish.c, des.c, rijndael.c: Consistently use const for input
+       buffers.
+
+2004-09-23  Werner Koch  <wk@g10code.com>
+
+       * rsa.c (rsa_generate): Return the dummy list of factors only if
+       the caller asked for it.
+
+2004-05-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * dsa.c (verify): s/exp/exponent/ to fix a compiler warning.  From
+       Werner on stable branch.
+
+2004-01-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.c (setup_cipher_table): May as well call Rijndael AES at
+       this point.
+
+       * pubkey.c (setup_pubkey_table), elgamal.c (sign, verify,
+       test_keys, elg_sign, elg_verify, elg_get_info): Remove the last
+       bits of Elgamal type 20 support.
+
+2003-12-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * idea-stub.c (load_module, idea_get_info): Return the proper type
+       for idea_get_info from inside load_module.  From Stefan Bellon.
+
+       * rijndael.c, rndunix.c, twofish.c: Remove dead IS_MODULE code.
+
+       * g10c.c: Dead code.  Remove.
+
+       * Makefile.am: Don't compile g10c.c.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * rndriscos.c (rndriscos_gather_random) [__riscos__]: Declare
+       variable outside loop.
+
+       * blowfish.c, twofish.c [__riscos__]: Removal of unnecessary
+       #ifdef __riscos__ sections.
+
+2003-12-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * dsa.h, dsa.c (dsa_verify), elgamal.h, elgamal.c (elg_verify),
+       rsa.h, rsa.c (rsa_verify), pubkey.c (dummy_verify, pubkey_verify):
+       Remove old unused code.
+
+2003-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * pubkey.c (setup_pubkey_table): Don't allow signatures to and
+       from encrypt-only Elgamal keys.
+       (pubkey_get_npkey, pubkey_get_nskey, pubkey_get_nsig,
+       pubkey_get_nenc, pubkey_nbits): Wrap the RSA cheats in !USE_RSA.
+       Add cheats for sign+encrypt Elgamal.
+
+2003-11-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * pubkey.c (setup_pubkey_table): Only include RSA if USE_RSA is
+       defined.
+       (pubkey_get_npkey): Return 2 for RSA even if it isn't available so
+       we can at least handle RSA keys.
+
+2003-11-27  Werner Koch  <wk@gnupg.org>
+
+       * pubkey.c (pubkey_sign): Return an error if an ElGamal key is
+       used.
+
+       * elgamal.c (gen_k): New arg SMALL_K.
+       (sign): Use it here with SMALL_K set to false
+       (do_encrypt): and here with SMALL_K set to true.
+
+2003-10-10  Werner Koch  <wk@gnupg.org>
+
+       * primegen.c (gen_prime): Bail out if we try to generate a prime
+       with less than 16 bits. Include i18n.h.
+
+2003-10-06  Werner Koch  <wk@gnupg.org>
+
+       * primegen.c (gen_prime): Bail out if NBITS is zero.  This is
+       Debian bug #213989 reported by Max <rusmir@tula.net>.
+
+2003-09-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * md.c (string_to_digest_algo): Enable read-write SHA-256 support.
+
+       * algorithms.h, Makefile.am, md.c (load_digest_module,
+       string_to_digest_algo), tiger.c: Drop TIGER/192 support.
+
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * idea-stub.c, random.c; s/__MINGW32__/_WIN32/ to help building on
+       native Windows compilers.  Requested by Brian Gladman.  From
+       Werner on stable branch.
+
+2003-08-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * random.c (getfnc_gather_random): Don't check NAME_OF_DEV_RANDOM
+       twice.  Use NAME_OF_DEV_URANDOM.
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * bithelp.h, des.c, random.c, rndlinux.c, sha1.c, blowfish.c,
+       elgamal.c, rijndael.c, rndunix.c, sha256.c, cast5.c, idea-stub.c,
+       rmd160.c, rndw32.c, sha512.c, md5.c, rmd160test.c, rsa.c, tiger.c:
+       Edit all preprocessor instructions to remove whitespace before the
+       '#'.  This is not required by C89, but there are some compilers
+       out there that don't like it.
+
+2003-05-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.c (setup_cipher_table): #ifdef IDEA.
+
+       * random.c (fast_random_poll): Only use times() if we HAVE_TIMES.
+
+       * sha512.c, tiger.c: Use the U64_C() macro to specify 64-bit
+       constants.  U64_C is defined in include/types.h and uses the
+       correct suffix depending on the underlying type of u64.
+
+       * idea-stub.c (load_module): Catch an error if the idea module
+       file is unloadable for some reason (unreadable, bad permissions,
+       etc.)
+
+       * md.c (string_to_digest_algo): Give a warning about TIGER192 not
+       being part of OpenPGP.
+
+2003-04-15  Werner Koch  <wk@gnupg.org>
+
+       * md.c (md_start_debug): Need to open the file in binary mode.
+
+2003-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.c (setup_cipher_table): #ifdef all optional ciphers.
+
+       * md.c (load_digest_module): #ifdef all optional digests.
+
+2003-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, md.c (load_digest_module): Only build in SHA384/512
+       and TIGER if specifically enabled by the 64-bit type check in
+       configure.
+
+2003-02-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * sha256.c, sha512.c: New.
+
+       * Makefile.am, algorithms.h, md.c (load_digest_module,
+       string_to_digest_algo): Add read-only support for the new SHAs.
+
+2002-11-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * rndw32.c [__CYGWIN32__]: Don't include winioctl.h - it is not
+       required anymore. (From Werner)
+
+       * random.c (read_seed_file,update_random_seed_file): Use binary
+       mode for __CYGWIN__. (From Werner)
+
+       * blowfish.c (burn_stack), cast5.c (burn_stack), des.c
+        (burn_stack), md5.c (burn_stack), random.c (burn_stack, read_pool,
+       fast_random_poll), rijndael.c (burn_stack), rmd160.c (burn_stack),
+       rndegd.c (rndegd_gather_random), rndlinux.c
+        (rndlinux_gather_random), sha1.c (burn_stack), tiger.c
+       (burn_stack), twofish.c (burn_stack): Replace various calls to
+       memset() with the more secure wipememory().
+
+2002-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.c (string_to_cipher_algo), md.c (string_to_digest_algo):
+       Allow the Sxxx and Hxxx format for cipher and digest names.
+
+2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
+
+       * rndriscos.c (rndriscos_gather_random): Use riscos_load_module()
+       to load CryptRandom module.
+
+2002-10-12  Werner Koch  <wk@gnupg.org>
+
+       * rndunix.c (my_popen): Make sure that stdin and stderr are
+       connected to a file.  This is to avoid NetBSD to complain about
+       set{u,g}id programs invoked with fd 0, 2 closed.  Reported by
+       Cristian Biere.
+       (start_gatherer): Likewise. Reordered code.
+
+2002-10-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * tiger.c (tiger_get_info): Select the OID to use for TIGER at
+       compile time.
+
+2002-09-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, md.c (load_digest_module): TIGER is now always
+       enabled.
+
+2002-09-26  Werner Koch  <wk@gnupg.org>
+
+       * tiger.c (tiger_get_info): Use a regular OID.  Note that this
+       breaks all TIGER generated signatures; if we want to do something
+       about it we have to do it in ../g10/sig-check.c .
+
+2002-09-17  Werner Koch  <wk@gnupg.org>
+
+       * rndw32.c (SIZEOF_DISK_PERFORMANCE_STRUCT): Increased to 256.
+
+2002-09-12  Stefan Bellon  <sbellon@sbellon.de>
+
+       * rand-internal.h (rndriscos_gather_random): Added prototype.
+
+2002-08-30  Werner Koch  <wk@gnupg.org>
+
+       * random.c: Automagically detect the entropy gatherer when
+       this feature is configured.
+       * rndegd.c (rndegd_connect_socket): New.  Factored out from ..
+       (rndegd_gather_random): here and call it.
+       (do_read): Update the counter variables correctly.  This was not a
+       problem due to the way EGD works. Bug found by Christian Biere.
+
+2002-08-20  Werner Koch  <wk@gnupg.org>
+
+       * primegen.c (generate_elg_prime): Return all factors for mode 1.
+       Bug reported by Bob Mathews.
+
+2002-08-12  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c: Include the DUMMY cipher only when the new ALLOW_DUMMY
+       is defined. It should only be defined for hard core debugging.
+
+2002-08-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, md.c (load_digest_module): Allow switching TIGER on
+       and off via configure.
+
+2002-08-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * md.c (md_algo_present): New function to check if a given algo is
+       in use for a given MD_HANDLE.
+
+2002-08-04  Werner Koch  <wk@gnupg.org>
+
+       * blowfish.h, cast5.h, des.h: Removed after moving all prototypes to
+       * algorithms.h: here. Changed all sources to use this one.
+       
+2002-08-03  Stefan Bellon  <sbellon@sbellon.de>
+
+       * idea-stub.c (idea_get_info): RISC OS' Norcroft C needs a cast.
+       * random.c (getfnc_gather_random): Added RISC OS support.
+       * rndriscos.c: Removed dynload code and tidied up a bit.
+
+2002-08-03  Werner Koch  <wk@gnupg.org>
+
+       * rndegd.c (do_read): Handle case when read returns 0 to avoid
+       gpg hanging when EGD died.  By Christian Biere.
+
+2002-08-02  Werner Koch  <wk@gnupg.org>
+
+        The big extension removal.
+       
+       * Makefile.am: Removed all extension stuff.
+       * dynload.c: Removed everything except for
+       register_cipher_extension.
+       (dynload_enum_module_names): New.
+       * dynload.h: Removed.
+       * random.c (getfnc_gather_random,getfnc_fast_random_poll):
+       New. Replaced all dynload functions with these ones.
+       * rndunix.c (rndunix_gather_random): Renamed from
+       gather_random.  Made global.  Removed all dynload stuff.
+       * rndlinux.c (rndlinux_gather_random): Likewise.
+       * rndegd.c (rndegd_gather_random): Likewise.
+       * rndw32.c (rndw32_gather_random)
+       (rndw32_gather_random_fast): Likewise.  Also removed the unsued
+       entropy dll code.
+       * md.c (new_list_item): Changed return value to indicate whether
+       an algorithms was loaded.
+       (load_digest_module): Simplified by removing all the dynload code.
+       * algorithms.h: New.
+       * md5.c (md5_get_info): Made global.  Removed all dynload stuff.
+       * rmd160.c (rmd160_get_info): Likewise. 
+       * sha1.c (sha1_get_info): Likewise.
+       * tiger.c (tiger_get_info): Likewise. Return NULL if we can't use
+       this module.
+       * idea-stub.c: New.
+       * blowfish.h (idea_get_info): Add prototype.
+       * cipher.c (setup_cipher_table): Try to load IDEA.
+       (load_cipher_modules): Removed all dynload code.
+       * pubkey.c (load_pubkey_modules): Removed the dynloading code.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * random.c: "warning" -> "WARNING"
+
+2002-07-02  Werner Koch  <wk@gnupg.org>
+
+       * rndw32.c (slow_gatherer_windowsNT): Use a simple array for the
+       disk performance structure and increase it to the size required by
+       W2000.
+
+2002-06-29  Werner Koch  <wk@gnupg.org>
+
+       * rndlinux.c: Removed HAVE_LINUX_RANDOM_H conditional because it
+       was never used and the configure test did set the wrong macro
+       anyway.
+
+2002-05-07  Stefan Bellon  <sbellon@sbellon.de>
+
+       * md.c (md_start_debug): Use EXTSEP_S instead of ".".
+
+2002-04-24  Werner Koch  <wk@gnupg.org>
+
+       * tiger.c (tiger_final): Removed superfluous token pasting operators.
+       * md5.c (md5_final): Ditto.
+
+2002-04-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * rndriscos.c (func_table): Made func a function pointer.
+       (init_device): Improved loading of CryptRandom module.
+
+2002-04-18  Werner Koch  <wk@gnupg.org>
+
+       * rndlinux.c, rndegd.c, rndunix.c (func_table): Made func a
+       function pointer.  Note that we still need to change the module
+       interface to cope with data vs function pointer problems.  Hmmm,
+       even dlsym has a problem with this.
+
+2002-04-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.c (setup_cipher_table, cipher_open, cipher_encrypt,
+       cipher_decrypt, dummy_setkey, dummy_encrypt_block,
+       dummy_decrypt_block): the dummy cipher should only be built on
+       development versions.
+
+2002-04-06  Werner Koch  <wk@gnupg.org>
+
+       * rijndael.c (rijndael_get_info): We do only support a 128 bit
+       blocksize so it makes sense to change the algorithm strings to
+       AES.
+       * cipher.c (string_to_cipher_algo): Map "RIJNDAEL" to "AES".
+
+2002-02-14  Werner Koch  <wk@gnupg.org>
+
+       * random.c (mix_pool): Removed the failsafe stuff again.  It makes
+       the code more complicate and may give the path to more bugs.
+
+2002-02-10  Werner Koch  <wk@gnupg.org>
+
+       * random.c (mix_pool): Carry an extra failsafe_digest buffer
+       around to make the function more robust.
+
+2002-02-08  Werner Koch  <wk@gnupg.org>
+
+       * random.c (add_randomness): Xor new data into the pool and not
+       just copy it.  This avoids any choosen input attacks which are not
+       serious in our setting because an outsider won't be able to mix
+       data in and even then we keep going with a PRNG.  Thanks to Stefan
+       Keller for pointing this out.
+
+2002-01-02  Stefan Bellon  <sbellon@sbellon.de>
+
+       * rndriscos.c [__riscos__]: Updated include file name.
+
+2001-12-21  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (DISCLEANFILES): Add construct.c
+
+2001-12-19  Werner Koch  <wk@gnupg.org>
+
+       * rndw32.c [CYGWIN32]: Include winioctl.h.  By Disastry.
+
+2001-11-08  Werner Koch  <wk@gnupg.org>
+
+       * primegen.c (gen_prime): Set 2 high order bits for secret primes.
+       * rsa.c (generate): Loop until we find the exact modulus size.
+       Changed the exponent to 41.
+
+2001-10-22  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Need to use $(EXEEXT) where approriate.
+
+2001-09-09  Werner Koch  <wk@gnupg.org>
+
+       * rsa.c (rsa_get_info): s/usage/r_usage/ to avoid shadow warnings.
+
+2001-08-24  Werner Koch  <wk@gnupg.org>
+
+       * md.c (md_write): Made buf arg const.
+
+2001-08-22  Werner Koch  <wk@gnupg.org>
+
+       * random.c (fast_random_poll): Don't use gethrtime if it is broken.
+
+2001-08-20  Werner Koch  <wk@gnupg.org>
+
+       Applied patches from Stefan Bellon <sbellon@sbellon.de> to support
+       RISC OS.  Nearly all of these patches are identified by the
+       __riscos__ macro.
+       * blowfish.c, twofish.c: Added pragmas for use with a Norcraft
+       compiler. 
+       * dynload.c, md5.c, rmd160.c, sha1.c: Minor patches for RISC OS.
+       * rndriscos.c: New.
+       * rnd-internal.h: Added prototype.
+       * random.c (fast_random_poll): Use '#if defined' instead of just
+       'defined'; needed for RISC OS.
+       * primegen.c (gen_prime): count? are now ints for consistence
+       with is_prime().
+
+2001-08-08  Werner Koch  <wk@gnupg.org>
+
+       * rndw32.c (gather_random): Use toolhelp in addition to the NT
+       gatherer for Windows2000.  Suggested by Sami Tolvanen.
+
+       * random.c (read_pool): Fixed length check, this used to be one
+       byte to strict.  Made an assert out of it because the caller has
+       already made sure that only poolsize bytes are requested.
+       Reported by Marcus Brinkmann.
+
+2001-07-18  Werner Koch  <wk@gnupg.org>
+
+       * rndlinux.c (gather_random): casted a size_t arg to int so that
+       the format string is correct.  Casting is okay here and avoids
+       translation changes. 
+
+2001-06-12  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c (string_to_cipher_algo): Use ascii_strcasecmp().
+       * md.c (string_to_digest_algo): Ditto.
+       * pubkey.c (string_to_pubkey_algo): Ditto.
+       * rndw32.c (slow_gatherer_windowsNT): Ditto.  Not really needed
+       here but anyway.
+
+2001-04-29  Werner Koch  <wk@gnupg.org>
+
+       * random.c (fast_random_poll): Do not check the return code of
+       getrusage.
+
+2001-04-17  Werner Koch  <wk@gnupg.org>
+
+       * rndunix.c: Add a signal.h header to avoid warnings on Solaris 7
+       and 8.
+
+2001-04-16  Werner Koch  <wk@gnupg.org>
+
+       * dynload.c [__MINGW32__]: Applied patch from Timo Schulz to make
+       it work under W32.  This patches is based on the one from
+       Disastry@saiknes.lv
+
+2001-04-06  Werner Koch  <wk@gnupg.org>
+
+       * rijndael.c, des.c, blowfish.c, twofish.c, cast5.c (burn_stack):
+       New.  Add wrappers for most functions to be able to call
+       burn_stack after the function invocation. This methods seems to be
+       the most portable way to zeroise the stack used. It does only work
+       on stack frame based machines but it is highly portable and has no
+       side effects.  Just setting the automatic variables at the end of
+       a function to zero does not work well because the compiler will
+       optimize them away - marking them as volatile would be bad for
+       performance.
+       * md5.c, sha1.c, rmd160.c, tiger.c (burn_stack): Likewise.
+       * random.c (burn_stack): New.
+       (mix_pool): Use it here to burn the stack of the mixblock function.
+       
+2001-04-02  Werner Koch  <wk@gnupg.org>
+
+       * primegen.c (generate_elg_prime): I was not initialized for mode
+       != 1.  Freed q at 3 places.  Thanks to  Tommi Komulainen.
+
+2001-03-28  Werner Koch  <wk@gnupg.org>
+
+       * md5.c (md5_final): Fixed calculation of hashed length.  Thanks
+       to disastry@saiknes.lv for pointing out that it was horrible wrong
+       for more than 512MB of input.
+       * sha1.c (sha1_final): Ditto.
+       * rmd160.c (rmd160_final): Ditto.
+       * tiger.c (tiger_final): Ditto.
+
+2001-03-19  Werner Koch  <wk@gnupg.org>
+
+       * blowfish.c (encrypt,do_encrypt): Changed name to do_encrypt to
+       avoid name clahses with an encrypt function in stdlib.h of
+       Dynix/PIX.  Thanks to Gene Carter.
+       * elgamal.c (encrypt,do_encrypt): Ditto.
+
+2001-03-12  Werner Koch  <wk@gnupg.org>
+
+       * twofish.c (gnupgext_enum_func): Add some static when comnpiled
+       as a module.
+
+       * tiger.c (tiger_get_info): Return "TIGER192" and not just
+       "TIGER".  By Edwin Woudt.
+
+2001-03-08  Werner Koch  <wk@gnupg.org>
+
+       * random.c: Always include time.h - standard requirement.  Thanks
+       to James Troup.
+
+2001-01-18  Werner Koch  <wk@gnupg.org>
+
+       * rndw32.c: Fixed typo and wrong ifdef for VER_PLATFORM* macro
+
+2001-01-12  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c (cipher_encrypt,cipher_encrypt): Use blocksize and
+       not 8 for CBC mode (However: we don't use CBS in OpenPGP).
+
+2000-11-22  Werner Koch  <wk@gnupg.org>
+
+       * rndegd.c (gather_random): Fixed default socket to be '=entropy'.
+       Thanks to Tomasz Kozlowski.
+
+2000-10-12  Werner Koch  <wk@gnupg.org>
+
+        * rijndael.c: New.
+        * cipher.c: Add Rijndael support.
+
+Wed Oct  4 15:50:18 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * sha1.c (transform): Use rol() macro.  Actually this is not needed
+        for a newer gcc but there are still aoter compilers.
+
+Thu Sep 14 14:20:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * random.c (fast_random_poll): Check ENOSYS for getrusage.
+        * rndunix.c:  Add 2 sources for QNX. By Sam Roberts.
+
+Wed Sep 13 18:12:34 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * rsa.c (secret): Speed up by using the CRT.  For a 2k keys this
+        is about 3 times faster.
+        (stronger_key_check): New but unused code to check the secret key.
+
+Wed Sep  6 17:55:47 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * rsa.c: Changed the comment about the patent.
+        * Makefile.am: Included rsa.[ch].
+        * pubkey.c: Enabled RSA support.
+        (pubkey_get_npkey): Removed RSA workaround.
+
+Fri Aug 25 16:05:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * rndlinux.c (open_device): Loose random device checking.
+        By Nils Ellmenreich.
+
+        * rndegd.c (gather_random): Name of socket is nom configurable.
+
+Wed Jun 28 11:54:44 CEST 2000  Werner Koch  <wk@>
+
+  * rsa.c, rsa.h: New based on the old module version (only in CVS for now).
+  * pubkey.c (setup_pubkey_table): Added commented support for RSA.
+
+Fri Jun  9 10:09:52 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * rndunix.c (waitpid): New. For UTS 2.1.  All by Dave Dykstra.
+  (my_popen): Do the FD_CLOEXEC only if it is available
+  (start_gatherer): Cope with missing _SC_OPEN_MAX
+
+Sun May 28 13:55:17 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * random.c (read_seed_file): Binary open for DOSish system
+  (update_random_seed_file): Ditto.
+
+  * rndw32.c: Add some debuging code enabled by an environment variable.
+
+Tue May 23 09:19:00 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * rndw32.c: Started with alternative code to replace entropy.dll
+
+Thu May 18 11:38:54 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * primegen.c (register_primegen_progress): New.
+       * dsa.c (register_pk_dsa_progress): New.
+       * elgamal.c (register_pk_elg_progress): New.
+
+Fri Apr 14 19:37:08 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * twofish.c (twofish_get_info): Fixed warning about cast.
+
+Tue Mar 28 14:26:58 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * random.c [MINGW32]: Include process.h for getpid.
+
+Thu Mar  2 15:37:46 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * random.c (fast_random_poll): Add clock_gettime() as fallback for
+       system which support this POSIX.4 fucntion. By Sam Roberts.
+
+       * rndunix.c: Add some more headers for QNX. By Sam Roberts.
+
+       * random.c (read_seed_file): Removed the S_ISLNK test becuase it
+       is already covered by !S_ISREG and is not defined in Unixware.
+       Reported by Dave Dykstra.
+
+       * sha1.c (sha1_get_info): Removed those stupid double lines. Dave
+       is really a good lint.
+
+Wed Feb 23 10:07:57 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * twofish.c (twofish_get_info): Add some const to the casts.  By Martin
+       Kahlert.
+
+Mon Feb 14 14:30:20 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       (update_random_seed_file): Silently ignore update request when pool
+       is not filled.
+
+Fri Feb 11 17:44:40 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * random.c (read_seed_file): New.
+       (set_random_seed_file): New.
+       (read_pool): Try to read the seeding file.
+       (update_random_seed_file): New.
+
+       (read_pool): Do an initial extra seeding when level 2 quality random
+       is requested the first time.  This requestes at least POOLSIZE/2 bytes
+       of entropy.  Compined with the seeding file this should make normal
+       random bytes cheaper and increase the quality of the random bytes
+       used for key generation.
+
+       * rndegd.c (gather_random): Shortcut level 0.
+       * rndunix.c (gather_random): Ditto.
+       * rndw32.c (gather_random): Ditto.
+
+Fri Jan 14 18:32:01 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * rmd160.c (rmd160_get_info): Moved casting to the left side due to a
+       problem with UTS4.3.  Suggested by Dave Dykstra.
+       * sha1.c (sha1_get_info): Ditto.
+       * tiger.c (tiger_get_info): Ditto.
+       * md5.c (md5_get_info): Ditto
+       * des.c (des_get_info): Ditto.
+       * blowfish.c (blowfish_get_info): Ditto.
+       * cast5.c (cast5_get_info): Ditto.
+       * twofish.c (twofish_get_info): Ditto.
+
+Thu Jan 13 19:31:58 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * elgamal.c (wiener_map): New.
+       (gen_k): Use a much smaller k.
+       (generate): Calculate the qbits using the wiener map and
+       choose an x at a size comparable to the one choosen in gen_k
+
+       * random.c (read_pool): Print a more friendly error message in
+       cases when too much random is requested in one call.
+
+       * Makefile.am (tiger): Replaced -O1 by -O. Suggested by Alec Habig.
+
+Sat Dec  4 12:30:28 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * primegen.c (generate_elg_prime): All primes are now generated with
+       the lowest random quality level.  Becuase they are public anyway we
+       don't need stronger random and by this we do not drain the systems
+       entropy so much.
+
+Thu Oct 28 16:08:20 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * random.c (fast_random_poll): Check whether RUSAGE_SELF is defined;
+       this is not the case for some ESIX and Unixware, although they have
+       getrusage().
+
+       * elgamal.c (sign): Hugh found strange code here. Replaced by BUG().
+
+Mon Oct 11 09:24:12 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * rndw32.c (gather_random): Handle PCP_SEEDER_TOO_SMALL.
+
+Sat Oct  9 20:34:41 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * Makefile.am:  Tweaked module build and removed libtool
+
+Fri Oct  8 20:32:01 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * rndw32.c (load_and_init_winseed): Use the Registry to locate the DLL
+
+Mon Oct  4 21:23:04 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * md.c (md_reset): Clear finalized; thanks to Ulf Moeller for
+       fixing this bug.
+
+Sat Sep 18 12:51:51 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Never compile mingw32 as module
+
+Wed Sep 15 14:39:59 CEST 1999  Michael Roth <mroth@nessie.de>
+
+       * des.c: Various speed improvements: One bit pre rotation
+         trick after initial permutation (Richard Outerbridge).
+         Finished test of SSLeay Tripple-DES patterns.
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndw32.c: New.
+
+Mon Sep 13 10:51:29 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * bithelp.h: New.
+       * rmd160.h, sha1.h, md5.h: Use the rol macro from bithelp.h
+
+Tue Sep  7 16:23:36 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Fixed seds for latest egcc. By Ollivier Robert.
+
+Mon Sep  6 19:59:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * des.c (selftest): Add some testpattern
+
+Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.c (do_cbc_encrypt): Fixed serious bug occuring when not using
+       in place encryption. Pointed out by Frank Stajano.
+
+Mon Jul 26 09:34:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * md5.c (md5_final): Fix for a SCO cpp bug.
+
+Thu Jul 15 10:15:35 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * elgamal.c (elg_check_secret_key,elg_encrypt
+       elg_decrypt,elg_sign,elg_verify): Sanity check on the args.
+       * dsa.c (dsa_check_secret_key,dsa_sign,dsa_verify): Ditto.
+
+       * pubkey.c (disable_pubkey_algo): New.
+       (check_pubkey_algo2): Look at disabled algo table.
+       * cipher.c (disable_cipher_algo): New.
+       (check_cipher_algo): Look at disabled algo table.
+
+Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Support for libtool.
+
+Fri Jul  2 11:45:54 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dsa.c (gen_k): Changed algorithm to consume less random bytes
+       * elgamal.c (gen_k): Ditto.
+
+       * random.c (random_dump_stats): New.
+
+Thu Jul  1 12:47:31 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * primegen.c, elgamal.c, dsa.c (progess): New and replaced all
+       fputc with a call to this function.
+
+Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndegd.c (do_write): s/ssize_t/int/ due to SunOS 4.1 probs.
+
+       * cipher.c (do_cbc_encrypt, do_cbc_decrypt): New.
+
+       * dynload.c (HAVE_DL_SHL_LOAD): Map hpux API to dlopen (Dave Dykstra).
+       * Makefile.am (install-exec-hook): Removed.
+
+Sun May 23 14:20:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.c (setup_cipher_table): Enable Twofish
+
+       * random.c (fast_random_poll): Disable use of times() for mingw32.
+
+Mon May 17 21:54:43 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dynload.c (register_internal_cipher_extension): Minor init fix.
+
+Tue May  4 15:47:53 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * primegen.c (gen_prime): Readded the Fermat test. Fixed the bug
+       that we didn't correct for step when passing the prime to the
+       Rabin-Miller test which led to bad performance (Stefan Keller).
+       (check_prime): Add a first Fermat test.
+
+Sun Apr 18 10:11:28 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.c (cipher_setiv): Add ivlen arg, changed all callers.
+
+       * random.c (randomize_buffer): alway use secure memory because
+       we can't use m_is_secure() on a statically allocated buffer.
+
+       * twofish.c: Replaced some macros by a loop to reduce text size.
+       * Makefile.am (twofish): No more need for sed editing.
+
+Fri Apr  9 12:26:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.c (cipher_open): Reversed the changes for AUTO_CFB.
+
+       * blowfish.c: Dropped the Blowfish 160 mode.
+       * cipher.c (cipher_open): Ditto.
+       (setup_cipher_table): Ditto.  And removed support of twofish128
+
+Wed Apr  7 20:51:39 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * random.c (get_random_bits): Can now handle requests > POOLSIZE
+
+       * cipher.c (cipher_open): Now uses standard CFB for automode if
+       the blocksize is gt 8 (according to rfc2440).
+
+       * twofish.c: Applied Matthew Skala's patches for 256 bit key.
+
+Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * random.c (get_random_bits): Can now handle requests > POOLSIZE
+
+       * cipher.c (cipher_open): Now uses standard CFB for automode if
+       the blocksize is gt 8 (according to rfc2440).
+
+Sat Mar 20 11:44:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndlinux.c (tty_printf) [IS_MODULE]: Removed.
+
+       * rndegd.c (gather_random): Some fixes.
+
+Wed Mar 17 13:09:03 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndegd.c (do_read): New.
+       (gather_random): Changed the implementation.
+
+Mon Mar  8 20:47:17 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dynload.c (DLSYM_NEEDS_UNDERSCORE): Renamed.
+
+Fri Feb 26 17:55:41 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * md.c: Nearly a total rewrote.
+
+Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.c (context): Fixed alignment
+       * md.c: Ditto.
+
+       * rndegd.c: New
+
+Mon Feb 22 20:04:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndegd.c: New.
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Modules are now figured out by configure
+       * construct.c: New. Generated by configure. Changed all modules
+       to work with that.
+       * sha1.h: Removed.
+       * md5.h: Removed.
+
+       * twofish.c: Changed interface to allow Twofish/256
+
+       * rndunix.c (start_gatherer): Die on SIGPIPE.
+
+Wed Jan 20 18:59:49 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndunix.c (gather_random): Fix to avoid infinite loop.
+
+Sun Jan 17 11:04:33 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * des.c (is_weak_key): Replace system memcmp due to bugs
+       in SunOS's memcmp.
+       (des_get_info): Return error on failed selftest.
+       * twofish.c (twofish_setkey): Return error on failed selftest or
+       invalid keylength.
+       * cast5.c (cast_setkey): Ditto.
+       * blowfish.c (bf_setkey): Return error on failed selftest.
+
+Tue Jan 12 11:17:18 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * random.c (random_is_faked): New.
+
+       * tiger.c: Only compile if we have the u64 type
+
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndunix.c (gather_random): check for setuid.
+
+       * Makefile.am: Add a way to staically link random modules
+
+Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * md.c (md_stop_debug): Do a flush first.
+       (md_open): size of buffer now depends on the secure parameter
+
+Sun Jan  3 15:28:44 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * rndunix.c (start_gatherer): Fixed stupid ==/= bug
+
+1998-12-31  Geoff Keating  <geoffk@ozemail.com.au>
+
+       * des.c (is_weak_key): Rewrite loop end condition.
+
+Tue Dec 29 14:41:47 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * random.c: add unistd.h for getpid().
+       (RAND_MAX): Fallback value for Sun.
+
+Wed Dec 23 17:12:24 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * md.c (md_copy): Reset debug.
+
+Mon Dec 14 21:18:49 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * random.c (read_random_source): Changed the interface to the
+       random gathering function.
+       (gather_faked): Use new interface.
+       * dynload.c (dynload_getfnc_fast_random_poll): Ditto.
+       (dynload_getfnc_gather_random): Ditto.
+       * rndlinux.c (gather_random): Ditto.
+       * rndunix.c (gather_random): Ditto.
+
+Sat Dec 12 18:40:32 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dynload.c (SYMBOL_VERSION): New to cope with system which needs
+       underscores.
+
+       * rndunix.c: Rewrote large parts
+
+Thu Dec 10 20:15:36 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dynload.c (load_extension): increased needed verbosity level.
+
+       * random.c (fast_random_poll): Fallback to a default fast random
+       poll function.
+       (read_random_source): Always use the faked entroy gatherer if no
+       gather module is available.
+       * rndlinux.c (fast_poll): Removed.
+       * rndunix.c (fast_poll): Removed.
+
+
+Wed Nov 25 12:33:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rand-*.c: Removed.
+       * rndlinux.c : New.
+       * rndunix.c : New.
+       * random.c : Restructured the interface to the gather modules.
+       (intialize): Call constructor functions
+       (read_radnom_source): Moved to here.
+       * dynload.c (dynload_getfnc_gather_random): New.
+       (dynload_getfnc_fast_random_poll): New.
+       (register_internal_cipher_extension): New.
+       (register_cipher_extension): Support of internal modules.
+
+Sun Nov  8 17:44:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rand-unix.c (read_random_source): Removed the assert.
+
+Mon Oct 19 18:34:30 1998  me,,,  (wk@tobold)
+
+       * pubkey.c: Hack to allow us to give some info about RSA keys back.
+
+Thu Oct 15 11:47:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * dynload.c: Support for DLD
+
+Wed Oct 14 12:13:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rand-unix.c: Now uses names from configure for /dev/random.
+
+1998-10-10  SL Baur  <steve@altair.xemacs.org>
+
+       * Makefile.am: fix sed -O substitutions to catch -O6, etc.
+
+Tue Oct  6 10:06:32 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rand-unix.c (HAVE_GETTIMEOFDAY): Fixed (was ..GETTIMEOFTIME :-)
+       * rand-dummy.c (HAVE_GETTIMEOFDAY): Ditto.
+
+Mon Sep 28 13:23:09 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md.c (md_digest): New.
+       (md_reset): New.
+
+Wed Sep 23 12:27:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * tiger.c (TIGER_CONTEXT): moved "buf", so that it is 64 bit aligned.
+
+Mon Sep 21 06:22:53 1998  Werner Koch  (wk@(none))
+
+       * des.c: Some patches from Michael.
+
+Thu Sep 17 19:00:06 1998  Werner Koch  (wk@(none))
+
+       * des.c : New file from Michael Roth <mroth@nessie.de>
+
+Mon Sep 14 11:10:55 1998  Werner Koch  (wk@(none))
+
+       * blowfish.c (bf_setkey): Niklas Hernaeus patch to detect weak keys.
+
+Mon Sep 14 09:19:25 1998  Werner Koch  (wk@(none))
+
+       * dynload.c (RTLD_NOW): Now defined to 1 if it is undefined.
+
+Mon Sep  7 17:04:33 1998  Werner Koch  (wk@(none))
+
+       * Makefile.am: Fixes to allow a different build directory
+
+Thu Aug  6 17:25:38 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * random.c (get_random_byte): Removed and changed all callers
+       to use get_random_bits()
+
+Mon Jul 27 10:30:22 1998  Werner Koch  (wk@(none))
+
+       * cipher.c : Support for other blocksizes
+       (cipher_get_blocksize): New.
+       * twofish.c: New.
+       * Makefile.am: Add twofish module.
+
+Mon Jul 13 21:30:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * random.c (read_pool): Simple alloc if secure_alloc is not set.
+       (get_random_bits): Ditto.
+
+Thu Jul  9 13:01:14 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * dynload.c (load_extension): Function now nbails out if
+       the program is run setuid.
+
+Wed Jul  8 18:58:23 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rmd160.c (rmd160_hash_buffer): New.
+
+Thu Jul  2 10:50:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c (cipher_open): algos >=100 use standard CFB
+
+Thu Jun 25 11:18:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am: Support for extensions
+
+Thu Jun 18 12:09:38 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * random.c (mix_pool): simpler handling for level 0
+
+Mon Jun 15 14:40:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * tiger.c: Removed from dist, will reappear as dynload module
+
+Sat Jun 13 14:16:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * pubkey.c: Major changes to allow extensions. Changed the inteface
+       of all public key ciphers and added the ability to load extensions
+       on demand.
+
+       * misc.c: Removed.
+
+Wed Jun 10 07:52:08 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * dynload.c: New.
+       * cipher.c: Major changes to allow extensions.
+
+Mon Jun  8 22:43:00 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c: Major internal chnages to support extensions.
+       * blowfish.c (blowfish_get_info): New and made all internal
+       functions static, changed heder.
+       * cast5.c (cast5_get_info): Likewise.
+
+Mon Jun  8 12:27:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * tiger.c (transform): Fix for big endian
+
+       * cipher.c (do_cfb_decrypt): Big endian fix.
+
+Fri May 22 07:30:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md.c (md_get_oid): Add a new one for TIGER.
+
+Thu May 21 13:24:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c: Add support for a dummy cipher
+
+Thu May 14 15:40:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rmd160.c (transform): fixed sigbus - I should better
+       add Christian von Roques's new implemenation of rmd160_write.
+
+Fri May  8 18:07:44 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rand-internal.h, rand-unix.c, rand-w32.c, rand_dummy.c: New
+       * random.c: Moved system specific functions to rand-****.c
+
+Fri May  8 14:01:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * random.c (fast_random_poll): add call to gethrtime.
+
+Tue May  5 21:28:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * elgamal.c (elg_generate): choosing x was not correct, could
+       yield 6 bytes which are not from the random pool, tsss, tsss..
+
+Tue May  5 14:09:06 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * primegen.c (generate_elg_prime): Add arg mode, changed all
+       callers and implemented mode 1.
+
+Mon Apr 27 14:41:58 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c (cipher_get_keylen): New.
+
+Sun Apr 26 14:44:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * tiger.c, tiger.h: New.
+
+Wed Apr  8 14:57:11 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * misc.c (check_pubkey_algo2): New.
+
+Tue Apr  7 18:46:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c: New
+       * misc.c (check_cipher_algo): Moved to cipher.c
+       * cast5.c: Moved many functions to cipher.c
+       * blowfish.c: Likewise.
+
+Sat Apr  4 19:52:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cast5.c: Implemented and tested.
+
+Wed Apr  1 16:38:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * elgamal.c (elg_generate): Faster generation of x in some cases.
+
+Thu Mar 19 13:54:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * blowfish.c (blowfish_decode_cfb): changed XOR operation
+       (blowfish_encode_cfb): Ditto.
+
+Thu Mar 12 14:04:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sha1.c (transform): Rewrote
+
+       * blowfish.c (encrypt): Unrolled for rounds == 16
+       (decrypt): Ditto.
+
+Tue Mar 10 16:32:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rmd160.c (transform): Unrolled the loop.
+
+Tue Mar 10 13:05:14 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * random.c (read_pool): Add pool_balance stuff.
+       (get_random_bits): New.
+
+       * elgamal.c (elg_generate): Now uses get_random_bits to generate x.
+
+
+Tue Mar 10 11:33:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md.c (md_digest_length): New.
+
+Tue Mar 10 11:27:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * dsa.c (dsa_verify): Works.
+
+Mon Mar  9 12:59:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * dsa.c, dsa.h: Removed some unused code.
+
+Wed Mar  4 10:39:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md.c (md_open): Add call to fast_random_poll.
+       blowfish.c (blowfish_setkey): Ditto.
+
+Tue Mar  3 13:32:54 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * rmd160.c (rmd160_mixblock): New.
+       * random.c: Restructured to start with a new RNG implementation.
+       * random.h: New.
+
+Mon Mar  2 19:21:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * gost.c, gost.h: Removed because they did only conatin trash.
+
+Sun Mar  1 16:42:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * random.c (fill_buffer): removed error message if n == -1.
+
+Fri Feb 27 16:39:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md.c (md_enable): No init if called twice.
+
+Thu Feb 26 07:57:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * primegen.c (generate_elg_prime): Changed the progress printing.
+       (gen_prime): Ditto.
+
+Tue Feb 24 12:28:42 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md5.c, md.5 : Replaced by a modified version of md5.c from
+       GNU textutils 1.22.
+
+Wed Feb 18 14:08:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * md.c, md.h : New debugging support
+
+Mon Feb 16 10:08:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * misc.c (cipher_algo_to_string): New
+       (pubkey_algo_to_string): New.
+       (digest_algo_to_string): New.
+
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003,
+          2004, 2005 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/cipher/Makefile.am b/cipher/Makefile.am
new file mode 100644 (file)
index 0000000..0aef605
--- /dev/null
@@ -0,0 +1,75 @@
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+#               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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I.. -I$(top_srcdir)/include -I$(top_srcdir)/intl
+
+noinst_LIBRARIES = libcipher.a
+
+libcipher_a_SOURCES = cipher.c \
+                pubkey.c       \
+                md.c           \
+                dynload.c      \
+                bithelp.h      \
+                des.c          \
+                twofish.c      \
+                blowfish.c     \
+                cast5.c        \
+                rijndael.c     \
+                elgamal.c      \
+                elgamal.h      \
+                rsa.c rsa.h    \
+                primegen.c     \
+                random.h       \
+                random.c       \
+                rand-internal.h \
+                rmd.h          \
+                dsa.h          \
+                dsa.c          \
+                smallprime.c   \
+                algorithms.h   \
+                md5.c          \
+                rmd160.c       \
+                sha1.c         \
+                sha256.c
+
+if USE_RNDLINUX
+libcipher_a_SOURCES+=rndlinux.c
+endif
+
+if USE_RNDUNIX
+libcipher_a_SOURCES+=rndunix.c
+endif
+
+if USE_RNDEGD
+libcipher_a_SOURCES+=rndegd.c
+endif
+
+if USE_RNDW32
+libcipher_a_SOURCES+=rndw32.c
+endif
+
+if USE_SHA512
+libcipher_a_SOURCES+=sha512.c
+endif
+
+EXTRA_libcipher_a_SOURCES=idea-stub.c
+libcipher_a_DEPENDENCIES=@IDEA_O@
+libcipher_a_LIBADD=@IDEA_O@
diff --git a/cipher/Makefile.in b/cipher/Makefile.in
new file mode 100644 (file)
index 0000000..e68ce8b
--- /dev/null
@@ -0,0 +1,584 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+#               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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@USE_RNDLINUX_TRUE@am__append_1 = rndlinux.c
+@USE_RNDUNIX_TRUE@am__append_2 = rndunix.c
+@USE_RNDEGD_TRUE@am__append_3 = rndegd.c
+@USE_RNDW32_TRUE@am__append_4 = rndw32.c
+@USE_SHA512_TRUE@am__append_5 = sha512.c
+subdir = cipher
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libcipher_a_AR = $(AR) $(ARFLAGS)
+am__libcipher_a_SOURCES_DIST = cipher.c pubkey.c md.c dynload.c \
+       bithelp.h des.c twofish.c blowfish.c cast5.c rijndael.c \
+       elgamal.c elgamal.h rsa.c rsa.h primegen.c random.h random.c \
+       rand-internal.h rmd.h dsa.h dsa.c smallprime.c algorithms.h \
+       md5.c rmd160.c sha1.c sha256.c rndlinux.c rndunix.c rndegd.c \
+       rndw32.c sha512.c
+@USE_RNDLINUX_TRUE@am__objects_1 = rndlinux.$(OBJEXT)
+@USE_RNDUNIX_TRUE@am__objects_2 = rndunix.$(OBJEXT)
+@USE_RNDEGD_TRUE@am__objects_3 = rndegd.$(OBJEXT)
+@USE_RNDW32_TRUE@am__objects_4 = rndw32.$(OBJEXT)
+@USE_SHA512_TRUE@am__objects_5 = sha512.$(OBJEXT)
+am_libcipher_a_OBJECTS = cipher.$(OBJEXT) pubkey.$(OBJEXT) \
+       md.$(OBJEXT) dynload.$(OBJEXT) des.$(OBJEXT) twofish.$(OBJEXT) \
+       blowfish.$(OBJEXT) cast5.$(OBJEXT) rijndael.$(OBJEXT) \
+       elgamal.$(OBJEXT) rsa.$(OBJEXT) primegen.$(OBJEXT) \
+       random.$(OBJEXT) dsa.$(OBJEXT) smallprime.$(OBJEXT) \
+       md5.$(OBJEXT) rmd160.$(OBJEXT) sha1.$(OBJEXT) sha256.$(OBJEXT) \
+       $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+       $(am__objects_4) $(am__objects_5)
+libcipher_a_OBJECTS = $(am_libcipher_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libcipher_a_SOURCES) $(EXTRA_libcipher_a_SOURCES)
+DIST_SOURCES = $(am__libcipher_a_SOURCES_DIST) \
+       $(EXTRA_libcipher_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+INCLUDES = -I.. -I$(top_srcdir)/include -I$(top_srcdir)/intl
+noinst_LIBRARIES = libcipher.a
+libcipher_a_SOURCES = cipher.c pubkey.c md.c dynload.c bithelp.h des.c \
+       twofish.c blowfish.c cast5.c rijndael.c elgamal.c elgamal.h \
+       rsa.c rsa.h primegen.c random.h random.c rand-internal.h rmd.h \
+       dsa.h dsa.c smallprime.c algorithms.h md5.c rmd160.c sha1.c \
+       sha256.c $(am__append_1) $(am__append_2) $(am__append_3) \
+       $(am__append_4) $(am__append_5)
+EXTRA_libcipher_a_SOURCES = idea-stub.c
+libcipher_a_DEPENDENCIES = @IDEA_O@
+libcipher_a_LIBADD = @IDEA_O@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  cipher/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  cipher/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libcipher.a: $(libcipher_a_OBJECTS) $(libcipher_a_DEPENDENCIES) 
+       -rm -f libcipher.a
+       $(libcipher_a_AR) libcipher.a $(libcipher_a_OBJECTS) $(libcipher_a_LIBADD)
+       $(RANLIB) libcipher.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/blowfish.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cast5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/des.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsa.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynload.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elgamal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idea-stub.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/primegen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubkey.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rijndael.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmd160.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rndegd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rndlinux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rndunix.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rndw32.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsa.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha256.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha512.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smallprime.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/twofish.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/cipher/algorithms.h b/cipher/algorithms.h
new file mode 100644 (file)
index 0000000..65346fe
--- /dev/null
@@ -0,0 +1,141 @@
+/* algorithms.h - prototypes for algorithm functions.
+ * Copyright (C) 2002, 2003, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef GNUPG_ALGORITHMS_H
+#define GNUPG_ALGORITHMS_H 1
+
+const char *dynload_enum_module_names (int seq);
+
+const char *
+md5_get_info (int algo, size_t *contextsize,
+              byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+              void (**r_init)( void *c ),
+              void (**r_write)( void *c, byte *buf, size_t nbytes ),
+              void (**r_final)( void *c ),
+              byte *(**r_read)( void *c )
+              );
+
+
+const char *
+rmd160_get_info (int algo, size_t *contextsize,
+                 byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                 void (**r_init)( void *c ),
+                 void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                 void (**r_final)( void *c ),
+                 byte *(**r_read)( void *c )
+                 );
+
+const char *
+sha1_get_info (int algo, size_t *contextsize,
+              byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+              void (**r_init)( void *c ),
+              void (**r_write)( void *c, byte *buf, size_t nbytes ),
+              void (**r_final)( void *c ),
+              byte *(**r_read)( void *c )
+               );
+
+const char *
+sha224_get_info (int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                );
+
+const char *
+sha256_get_info (int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                );
+
+const char *
+sha384_get_info (int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                );
+
+const char *
+sha512_get_info (int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                );
+
+const char *
+des_get_info( int algo, size_t *keylen,
+             size_t *blocksize, size_t *contextsize,
+             int (**setkeyf)( void *c, const byte *key, unsigned keylen ),
+             void (**encryptf)( void *c, byte *outbuf, const byte *inbuf ),
+             void (**decryptf)( void *c, byte *outbuf, const byte *inbuf )
+             );
+
+const char *
+cast5_get_info( int algo, size_t *keylen,
+               size_t *blocksize, size_t *contextsize,
+               int (**setkeyf)( void *c, const byte *key, unsigned keylen ),
+               void (**encryptf)( void *c, byte *outbuf, const byte *inbuf ),
+               void (**decryptf)( void *c, byte *outbuf, const byte *inbuf )
+               );
+
+
+const char *
+blowfish_get_info( int algo, size_t *keylen,
+                  size_t *blocksize, size_t *contextsize,
+                  int (**setkeyf)(void *c, const byte *key, unsigned keylen),
+                  void (**encryptf)(void *c, byte *outbuf, const byte *inbuf),
+                  void (**decryptf)(void *c, byte *outbuf, const byte *inbuf)
+                );
+
+const char *
+twofish_get_info( int algo, size_t *keylen,
+                 size_t *blocksize, size_t *contextsize,
+                 int (**setkeyf)( void *c, const byte *key, unsigned keylen ),
+                 void (**encryptf)( void *c, byte *outbuf, const byte *inbuf),
+                 void (**decryptf)( void *c, byte *outbuf, const byte *inbuf )
+                 );
+
+/* this is just a kludge for the time we have not yet changed the cipher
+ * stuff to the scheme we use for random and digests */
+const char *
+rijndael_get_info( int algo, size_t *keylen,
+                  size_t *blocksize, size_t *contextsize,
+                  int (**setkeyf)( void *c, const byte *key, unsigned keylen),
+                  void (**encryptf)(void *c, byte *outbuf, const byte *inbuf),
+                  void (**decryptf)(void *c, byte *outbuf, const byte *inbuf)
+                  );
+
+const char *
+idea_get_info( int algo, size_t *keylen,
+               size_t *blocksize, size_t *contextsize,
+               int (**setkeyf)( void *c, const byte *key, unsigned keylen ),
+               void (**encryptf)( void *c, byte *outbuf, const byte *inbuf ),
+               void (**decryptf)( void *c, byte *outbuf, const byte *inbuf )
+               );
+
+#endif /*GNUPG_ALGORITHMS_H*/
diff --git a/cipher/bithelp.h b/cipher/bithelp.h
new file mode 100644 (file)
index 0000000..64209ba
--- /dev/null
@@ -0,0 +1,42 @@
+/* bithelp.h  -  Some bit manipulation helpers
+ *     Copyright (C) 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_BITHELP_H
+#define G10_BITHELP_H
+
+
+/****************
+ * Rotate a 32 bit integer by n bytes
+ */
+#if defined(__GNUC__) && defined(__i386__)
+static inline u32
+rol( u32 x, int n)
+{
+       __asm__("roll %%cl,%0"
+               :"=r" (x)
+               :"0" (x),"c" (n));
+       return x;
+}
+#else
+#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )
+#endif
+
+
+#endif /*G10_BITHELP_H*/
diff --git a/cipher/blowfish.c b/cipher/blowfish.c
new file mode 100644 (file)
index 0000000..1a1ce56
--- /dev/null
@@ -0,0 +1,619 @@
+/* blowfish.c  -  Blowfish encryption
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * For a description of the algorithm, see:
+ *   Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
+ *   ISBN 0-471-11709-9. Pages 336 ff.
+ */
+
+/* Test values:
+ * key   "abcdefghijklmnopqrstuvwxyz";
+ * plain  "BLOWFISH"
+ * cipher 32 4E D0 FE F4 13 A2 03
+ *
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "types.h"
+#include "util.h"
+#include "errors.h"
+#include "algorithms.h"
+
+
+
+#define CIPHER_ALGO_BLOWFISH    4  /* blowfish 128 bit key */
+
+#define BLOWFISH_BLOCKSIZE 8
+#define BLOWFISH_ROUNDS 16
+
+typedef struct {
+    u32 s0[256];
+    u32 s1[256];
+    u32 s2[256];
+    u32 s3[256];
+    u32 p[BLOWFISH_ROUNDS+2];
+} BLOWFISH_context;
+
+static int bf_setkey( void *c, const byte *key, unsigned keylen );
+
+/* precomputed S boxes */
+static const u32 ks0[256] = {
+    0xD1310BA6,0x98DFB5AC,0x2FFD72DB,0xD01ADFB7,0xB8E1AFED,0x6A267E96,
+    0xBA7C9045,0xF12C7F99,0x24A19947,0xB3916CF7,0x0801F2E2,0x858EFC16,
+    0x636920D8,0x71574E69,0xA458FEA3,0xF4933D7E,0x0D95748F,0x728EB658,
+    0x718BCD58,0x82154AEE,0x7B54A41D,0xC25A59B5,0x9C30D539,0x2AF26013,
+    0xC5D1B023,0x286085F0,0xCA417918,0xB8DB38EF,0x8E79DCB0,0x603A180E,
+    0x6C9E0E8B,0xB01E8A3E,0xD71577C1,0xBD314B27,0x78AF2FDA,0x55605C60,
+    0xE65525F3,0xAA55AB94,0x57489862,0x63E81440,0x55CA396A,0x2AAB10B6,
+    0xB4CC5C34,0x1141E8CE,0xA15486AF,0x7C72E993,0xB3EE1411,0x636FBC2A,
+    0x2BA9C55D,0x741831F6,0xCE5C3E16,0x9B87931E,0xAFD6BA33,0x6C24CF5C,
+    0x7A325381,0x28958677,0x3B8F4898,0x6B4BB9AF,0xC4BFE81B,0x66282193,
+    0x61D809CC,0xFB21A991,0x487CAC60,0x5DEC8032,0xEF845D5D,0xE98575B1,
+    0xDC262302,0xEB651B88,0x23893E81,0xD396ACC5,0x0F6D6FF3,0x83F44239,
+    0x2E0B4482,0xA4842004,0x69C8F04A,0x9E1F9B5E,0x21C66842,0xF6E96C9A,
+    0x670C9C61,0xABD388F0,0x6A51A0D2,0xD8542F68,0x960FA728,0xAB5133A3,
+    0x6EEF0B6C,0x137A3BE4,0xBA3BF050,0x7EFB2A98,0xA1F1651D,0x39AF0176,
+    0x66CA593E,0x82430E88,0x8CEE8619,0x456F9FB4,0x7D84A5C3,0x3B8B5EBE,
+    0xE06F75D8,0x85C12073,0x401A449F,0x56C16AA6,0x4ED3AA62,0x363F7706,
+    0x1BFEDF72,0x429B023D,0x37D0D724,0xD00A1248,0xDB0FEAD3,0x49F1C09B,
+    0x075372C9,0x80991B7B,0x25D479D8,0xF6E8DEF7,0xE3FE501A,0xB6794C3B,
+    0x976CE0BD,0x04C006BA,0xC1A94FB6,0x409F60C4,0x5E5C9EC2,0x196A2463,
+    0x68FB6FAF,0x3E6C53B5,0x1339B2EB,0x3B52EC6F,0x6DFC511F,0x9B30952C,
+    0xCC814544,0xAF5EBD09,0xBEE3D004,0xDE334AFD,0x660F2807,0x192E4BB3,
+    0xC0CBA857,0x45C8740F,0xD20B5F39,0xB9D3FBDB,0x5579C0BD,0x1A60320A,
+    0xD6A100C6,0x402C7279,0x679F25FE,0xFB1FA3CC,0x8EA5E9F8,0xDB3222F8,
+    0x3C7516DF,0xFD616B15,0x2F501EC8,0xAD0552AB,0x323DB5FA,0xFD238760,
+    0x53317B48,0x3E00DF82,0x9E5C57BB,0xCA6F8CA0,0x1A87562E,0xDF1769DB,
+    0xD542A8F6,0x287EFFC3,0xAC6732C6,0x8C4F5573,0x695B27B0,0xBBCA58C8,
+    0xE1FFA35D,0xB8F011A0,0x10FA3D98,0xFD2183B8,0x4AFCB56C,0x2DD1D35B,
+    0x9A53E479,0xB6F84565,0xD28E49BC,0x4BFB9790,0xE1DDF2DA,0xA4CB7E33,
+    0x62FB1341,0xCEE4C6E8,0xEF20CADA,0x36774C01,0xD07E9EFE,0x2BF11FB4,
+    0x95DBDA4D,0xAE909198,0xEAAD8E71,0x6B93D5A0,0xD08ED1D0,0xAFC725E0,
+    0x8E3C5B2F,0x8E7594B7,0x8FF6E2FB,0xF2122B64,0x8888B812,0x900DF01C,
+    0x4FAD5EA0,0x688FC31C,0xD1CFF191,0xB3A8C1AD,0x2F2F2218,0xBE0E1777,
+    0xEA752DFE,0x8B021FA1,0xE5A0CC0F,0xB56F74E8,0x18ACF3D6,0xCE89E299,
+    0xB4A84FE0,0xFD13E0B7,0x7CC43B81,0xD2ADA8D9,0x165FA266,0x80957705,
+    0x93CC7314,0x211A1477,0xE6AD2065,0x77B5FA86,0xC75442F5,0xFB9D35CF,
+    0xEBCDAF0C,0x7B3E89A0,0xD6411BD3,0xAE1E7E49,0x00250E2D,0x2071B35E,
+    0x226800BB,0x57B8E0AF,0x2464369B,0xF009B91E,0x5563911D,0x59DFA6AA,
+    0x78C14389,0xD95A537F,0x207D5BA2,0x02E5B9C5,0x83260376,0x6295CFA9,
+    0x11C81968,0x4E734A41,0xB3472DCA,0x7B14A94A,0x1B510052,0x9A532915,
+    0xD60F573F,0xBC9BC6E4,0x2B60A476,0x81E67400,0x08BA6FB5,0x571BE91F,
+    0xF296EC6B,0x2A0DD915,0xB6636521,0xE7B9F9B6,0xFF34052E,0xC5855664,
+    0x53B02D5D,0xA99F8FA1,0x08BA4799,0x6E85076A };
+
+static const u32 ks1[256] = {
+    0x4B7A70E9,0xB5B32944,0xDB75092E,0xC4192623,0xAD6EA6B0,0x49A7DF7D,
+    0x9CEE60B8,0x8FEDB266,0xECAA8C71,0x699A17FF,0x5664526C,0xC2B19EE1,
+    0x193602A5,0x75094C29,0xA0591340,0xE4183A3E,0x3F54989A,0x5B429D65,
+    0x6B8FE4D6,0x99F73FD6,0xA1D29C07,0xEFE830F5,0x4D2D38E6,0xF0255DC1,
+    0x4CDD2086,0x8470EB26,0x6382E9C6,0x021ECC5E,0x09686B3F,0x3EBAEFC9,
+    0x3C971814,0x6B6A70A1,0x687F3584,0x52A0E286,0xB79C5305,0xAA500737,
+    0x3E07841C,0x7FDEAE5C,0x8E7D44EC,0x5716F2B8,0xB03ADA37,0xF0500C0D,
+    0xF01C1F04,0x0200B3FF,0xAE0CF51A,0x3CB574B2,0x25837A58,0xDC0921BD,
+    0xD19113F9,0x7CA92FF6,0x94324773,0x22F54701,0x3AE5E581,0x37C2DADC,
+    0xC8B57634,0x9AF3DDA7,0xA9446146,0x0FD0030E,0xECC8C73E,0xA4751E41,
+    0xE238CD99,0x3BEA0E2F,0x3280BBA1,0x183EB331,0x4E548B38,0x4F6DB908,
+    0x6F420D03,0xF60A04BF,0x2CB81290,0x24977C79,0x5679B072,0xBCAF89AF,
+    0xDE9A771F,0xD9930810,0xB38BAE12,0xDCCF3F2E,0x5512721F,0x2E6B7124,
+    0x501ADDE6,0x9F84CD87,0x7A584718,0x7408DA17,0xBC9F9ABC,0xE94B7D8C,
+    0xEC7AEC3A,0xDB851DFA,0x63094366,0xC464C3D2,0xEF1C1847,0x3215D908,
+    0xDD433B37,0x24C2BA16,0x12A14D43,0x2A65C451,0x50940002,0x133AE4DD,
+    0x71DFF89E,0x10314E55,0x81AC77D6,0x5F11199B,0x043556F1,0xD7A3C76B,
+    0x3C11183B,0x5924A509,0xF28FE6ED,0x97F1FBFA,0x9EBABF2C,0x1E153C6E,
+    0x86E34570,0xEAE96FB1,0x860E5E0A,0x5A3E2AB3,0x771FE71C,0x4E3D06FA,
+    0x2965DCB9,0x99E71D0F,0x803E89D6,0x5266C825,0x2E4CC978,0x9C10B36A,
+    0xC6150EBA,0x94E2EA78,0xA5FC3C53,0x1E0A2DF4,0xF2F74EA7,0x361D2B3D,
+    0x1939260F,0x19C27960,0x5223A708,0xF71312B6,0xEBADFE6E,0xEAC31F66,
+    0xE3BC4595,0xA67BC883,0xB17F37D1,0x018CFF28,0xC332DDEF,0xBE6C5AA5,
+    0x65582185,0x68AB9802,0xEECEA50F,0xDB2F953B,0x2AEF7DAD,0x5B6E2F84,
+    0x1521B628,0x29076170,0xECDD4775,0x619F1510,0x13CCA830,0xEB61BD96,
+    0x0334FE1E,0xAA0363CF,0xB5735C90,0x4C70A239,0xD59E9E0B,0xCBAADE14,
+    0xEECC86BC,0x60622CA7,0x9CAB5CAB,0xB2F3846E,0x648B1EAF,0x19BDF0CA,
+    0xA02369B9,0x655ABB50,0x40685A32,0x3C2AB4B3,0x319EE9D5,0xC021B8F7,
+    0x9B540B19,0x875FA099,0x95F7997E,0x623D7DA8,0xF837889A,0x97E32D77,
+    0x11ED935F,0x16681281,0x0E358829,0xC7E61FD6,0x96DEDFA1,0x7858BA99,
+    0x57F584A5,0x1B227263,0x9B83C3FF,0x1AC24696,0xCDB30AEB,0x532E3054,
+    0x8FD948E4,0x6DBC3128,0x58EBF2EF,0x34C6FFEA,0xFE28ED61,0xEE7C3C73,
+    0x5D4A14D9,0xE864B7E3,0x42105D14,0x203E13E0,0x45EEE2B6,0xA3AAABEA,
+    0xDB6C4F15,0xFACB4FD0,0xC742F442,0xEF6ABBB5,0x654F3B1D,0x41CD2105,
+    0xD81E799E,0x86854DC7,0xE44B476A,0x3D816250,0xCF62A1F2,0x5B8D2646,
+    0xFC8883A0,0xC1C7B6A3,0x7F1524C3,0x69CB7492,0x47848A0B,0x5692B285,
+    0x095BBF00,0xAD19489D,0x1462B174,0x23820E00,0x58428D2A,0x0C55F5EA,
+    0x1DADF43E,0x233F7061,0x3372F092,0x8D937E41,0xD65FECF1,0x6C223BDB,
+    0x7CDE3759,0xCBEE7460,0x4085F2A7,0xCE77326E,0xA6078084,0x19F8509E,
+    0xE8EFD855,0x61D99735,0xA969A7AA,0xC50C06C2,0x5A04ABFC,0x800BCADC,
+    0x9E447A2E,0xC3453484,0xFDD56705,0x0E1E9EC9,0xDB73DBD3,0x105588CD,
+    0x675FDA79,0xE3674340,0xC5C43465,0x713E38D8,0x3D28F89E,0xF16DFF20,
+    0x153E21E7,0x8FB03D4A,0xE6E39F2B,0xDB83ADF7 };
+
+static const u32 ks2[256] = {
+    0xE93D5A68,0x948140F7,0xF64C261C,0x94692934,0x411520F7,0x7602D4F7,
+    0xBCF46B2E,0xD4A20068,0xD4082471,0x3320F46A,0x43B7D4B7,0x500061AF,
+    0x1E39F62E,0x97244546,0x14214F74,0xBF8B8840,0x4D95FC1D,0x96B591AF,
+    0x70F4DDD3,0x66A02F45,0xBFBC09EC,0x03BD9785,0x7FAC6DD0,0x31CB8504,
+    0x96EB27B3,0x55FD3941,0xDA2547E6,0xABCA0A9A,0x28507825,0x530429F4,
+    0x0A2C86DA,0xE9B66DFB,0x68DC1462,0xD7486900,0x680EC0A4,0x27A18DEE,
+    0x4F3FFEA2,0xE887AD8C,0xB58CE006,0x7AF4D6B6,0xAACE1E7C,0xD3375FEC,
+    0xCE78A399,0x406B2A42,0x20FE9E35,0xD9F385B9,0xEE39D7AB,0x3B124E8B,
+    0x1DC9FAF7,0x4B6D1856,0x26A36631,0xEAE397B2,0x3A6EFA74,0xDD5B4332,
+    0x6841E7F7,0xCA7820FB,0xFB0AF54E,0xD8FEB397,0x454056AC,0xBA489527,
+    0x55533A3A,0x20838D87,0xFE6BA9B7,0xD096954B,0x55A867BC,0xA1159A58,
+    0xCCA92963,0x99E1DB33,0xA62A4A56,0x3F3125F9,0x5EF47E1C,0x9029317C,
+    0xFDF8E802,0x04272F70,0x80BB155C,0x05282CE3,0x95C11548,0xE4C66D22,
+    0x48C1133F,0xC70F86DC,0x07F9C9EE,0x41041F0F,0x404779A4,0x5D886E17,
+    0x325F51EB,0xD59BC0D1,0xF2BCC18F,0x41113564,0x257B7834,0x602A9C60,
+    0xDFF8E8A3,0x1F636C1B,0x0E12B4C2,0x02E1329E,0xAF664FD1,0xCAD18115,
+    0x6B2395E0,0x333E92E1,0x3B240B62,0xEEBEB922,0x85B2A20E,0xE6BA0D99,
+    0xDE720C8C,0x2DA2F728,0xD0127845,0x95B794FD,0x647D0862,0xE7CCF5F0,
+    0x5449A36F,0x877D48FA,0xC39DFD27,0xF33E8D1E,0x0A476341,0x992EFF74,
+    0x3A6F6EAB,0xF4F8FD37,0xA812DC60,0xA1EBDDF8,0x991BE14C,0xDB6E6B0D,
+    0xC67B5510,0x6D672C37,0x2765D43B,0xDCD0E804,0xF1290DC7,0xCC00FFA3,
+    0xB5390F92,0x690FED0B,0x667B9FFB,0xCEDB7D9C,0xA091CF0B,0xD9155EA3,
+    0xBB132F88,0x515BAD24,0x7B9479BF,0x763BD6EB,0x37392EB3,0xCC115979,
+    0x8026E297,0xF42E312D,0x6842ADA7,0xC66A2B3B,0x12754CCC,0x782EF11C,
+    0x6A124237,0xB79251E7,0x06A1BBE6,0x4BFB6350,0x1A6B1018,0x11CAEDFA,
+    0x3D25BDD8,0xE2E1C3C9,0x44421659,0x0A121386,0xD90CEC6E,0xD5ABEA2A,
+    0x64AF674E,0xDA86A85F,0xBEBFE988,0x64E4C3FE,0x9DBC8057,0xF0F7C086,
+    0x60787BF8,0x6003604D,0xD1FD8346,0xF6381FB0,0x7745AE04,0xD736FCCC,
+    0x83426B33,0xF01EAB71,0xB0804187,0x3C005E5F,0x77A057BE,0xBDE8AE24,
+    0x55464299,0xBF582E61,0x4E58F48F,0xF2DDFDA2,0xF474EF38,0x8789BDC2,
+    0x5366F9C3,0xC8B38E74,0xB475F255,0x46FCD9B9,0x7AEB2661,0x8B1DDF84,
+    0x846A0E79,0x915F95E2,0x466E598E,0x20B45770,0x8CD55591,0xC902DE4C,
+    0xB90BACE1,0xBB8205D0,0x11A86248,0x7574A99E,0xB77F19B6,0xE0A9DC09,
+    0x662D09A1,0xC4324633,0xE85A1F02,0x09F0BE8C,0x4A99A025,0x1D6EFE10,
+    0x1AB93D1D,0x0BA5A4DF,0xA186F20F,0x2868F169,0xDCB7DA83,0x573906FE,
+    0xA1E2CE9B,0x4FCD7F52,0x50115E01,0xA70683FA,0xA002B5C4,0x0DE6D027,
+    0x9AF88C27,0x773F8641,0xC3604C06,0x61A806B5,0xF0177A28,0xC0F586E0,
+    0x006058AA,0x30DC7D62,0x11E69ED7,0x2338EA63,0x53C2DD94,0xC2C21634,
+    0xBBCBEE56,0x90BCB6DE,0xEBFC7DA1,0xCE591D76,0x6F05E409,0x4B7C0188,
+    0x39720A3D,0x7C927C24,0x86E3725F,0x724D9DB9,0x1AC15BB4,0xD39EB8FC,
+    0xED545578,0x08FCA5B5,0xD83D7CD3,0x4DAD0FC4,0x1E50EF5E,0xB161E6F8,
+    0xA28514D9,0x6C51133C,0x6FD5C7E7,0x56E14EC4,0x362ABFCE,0xDDC6C837,
+    0xD79A3234,0x92638212,0x670EFA8E,0x406000E0 };
+
+static const u32 ks3[256] = {
+    0x3A39CE37,0xD3FAF5CF,0xABC27737,0x5AC52D1B,0x5CB0679E,0x4FA33742,
+    0xD3822740,0x99BC9BBE,0xD5118E9D,0xBF0F7315,0xD62D1C7E,0xC700C47B,
+    0xB78C1B6B,0x21A19045,0xB26EB1BE,0x6A366EB4,0x5748AB2F,0xBC946E79,
+    0xC6A376D2,0x6549C2C8,0x530FF8EE,0x468DDE7D,0xD5730A1D,0x4CD04DC6,
+    0x2939BBDB,0xA9BA4650,0xAC9526E8,0xBE5EE304,0xA1FAD5F0,0x6A2D519A,
+    0x63EF8CE2,0x9A86EE22,0xC089C2B8,0x43242EF6,0xA51E03AA,0x9CF2D0A4,
+    0x83C061BA,0x9BE96A4D,0x8FE51550,0xBA645BD6,0x2826A2F9,0xA73A3AE1,
+    0x4BA99586,0xEF5562E9,0xC72FEFD3,0xF752F7DA,0x3F046F69,0x77FA0A59,
+    0x80E4A915,0x87B08601,0x9B09E6AD,0x3B3EE593,0xE990FD5A,0x9E34D797,
+    0x2CF0B7D9,0x022B8B51,0x96D5AC3A,0x017DA67D,0xD1CF3ED6,0x7C7D2D28,
+    0x1F9F25CF,0xADF2B89B,0x5AD6B472,0x5A88F54C,0xE029AC71,0xE019A5E6,
+    0x47B0ACFD,0xED93FA9B,0xE8D3C48D,0x283B57CC,0xF8D56629,0x79132E28,
+    0x785F0191,0xED756055,0xF7960E44,0xE3D35E8C,0x15056DD4,0x88F46DBA,
+    0x03A16125,0x0564F0BD,0xC3EB9E15,0x3C9057A2,0x97271AEC,0xA93A072A,
+    0x1B3F6D9B,0x1E6321F5,0xF59C66FB,0x26DCF319,0x7533D928,0xB155FDF5,
+    0x03563482,0x8ABA3CBB,0x28517711,0xC20AD9F8,0xABCC5167,0xCCAD925F,
+    0x4DE81751,0x3830DC8E,0x379D5862,0x9320F991,0xEA7A90C2,0xFB3E7BCE,
+    0x5121CE64,0x774FBE32,0xA8B6E37E,0xC3293D46,0x48DE5369,0x6413E680,
+    0xA2AE0810,0xDD6DB224,0x69852DFD,0x09072166,0xB39A460A,0x6445C0DD,
+    0x586CDECF,0x1C20C8AE,0x5BBEF7DD,0x1B588D40,0xCCD2017F,0x6BB4E3BB,
+    0xDDA26A7E,0x3A59FF45,0x3E350A44,0xBCB4CDD5,0x72EACEA8,0xFA6484BB,
+    0x8D6612AE,0xBF3C6F47,0xD29BE463,0x542F5D9E,0xAEC2771B,0xF64E6370,
+    0x740E0D8D,0xE75B1357,0xF8721671,0xAF537D5D,0x4040CB08,0x4EB4E2CC,
+    0x34D2466A,0x0115AF84,0xE1B00428,0x95983A1D,0x06B89FB4,0xCE6EA048,
+    0x6F3F3B82,0x3520AB82,0x011A1D4B,0x277227F8,0x611560B1,0xE7933FDC,
+    0xBB3A792B,0x344525BD,0xA08839E1,0x51CE794B,0x2F32C9B7,0xA01FBAC9,
+    0xE01CC87E,0xBCC7D1F6,0xCF0111C3,0xA1E8AAC7,0x1A908749,0xD44FBD9A,
+    0xD0DADECB,0xD50ADA38,0x0339C32A,0xC6913667,0x8DF9317C,0xE0B12B4F,
+    0xF79E59B7,0x43F5BB3A,0xF2D519FF,0x27D9459C,0xBF97222C,0x15E6FC2A,
+    0x0F91FC71,0x9B941525,0xFAE59361,0xCEB69CEB,0xC2A86459,0x12BAA8D1,
+    0xB6C1075E,0xE3056A0C,0x10D25065,0xCB03A442,0xE0EC6E0E,0x1698DB3B,
+    0x4C98A0BE,0x3278E964,0x9F1F9532,0xE0D392DF,0xD3A0342B,0x8971F21E,
+    0x1B0A7441,0x4BA3348C,0xC5BE7120,0xC37632D8,0xDF359F8D,0x9B992F2E,
+    0xE60B6F47,0x0FE3F11D,0xE54CDA54,0x1EDAD891,0xCE6279CF,0xCD3E7E6F,
+    0x1618B166,0xFD2C1D05,0x848FD2C5,0xF6FB2299,0xF523F357,0xA6327623,
+    0x93A83531,0x56CCCD02,0xACF08162,0x5A75EBB5,0x6E163697,0x88D273CC,
+    0xDE966292,0x81B949D0,0x4C50901B,0x71C65614,0xE6C6C7BD,0x327A140A,
+    0x45E1D006,0xC3F27B9A,0xC9AA53FD,0x62A80F00,0xBB25BFE2,0x35BDD2F6,
+    0x71126905,0xB2040222,0xB6CBCF7C,0xCD769C2B,0x53113EC0,0x1640E3D3,
+    0x38ABBD60,0x2547ADF0,0xBA38209C,0xF746CE76,0x77AFA1C5,0x20756060,
+    0x85CBFE4E,0x8AE88DD8,0x7AAAF9B0,0x4CF9AA7E,0x1948C25C,0x02FB8A8C,
+    0x01C36AE4,0xD6EBE1F9,0x90D4F869,0xA65CDEA0,0x3F09252D,0xC208E69F,
+    0xB74E6132,0xCE77E25B,0x578FDFE3,0x3AC372E6 };
+
+static const u32 ps[BLOWFISH_ROUNDS+2] = {
+    0x243F6A88,0x85A308D3,0x13198A2E,0x03707344,0xA4093822,0x299F31D0,
+    0x082EFA98,0xEC4E6C89,0x452821E6,0x38D01377,0xBE5466CF,0x34E90C6C,
+    0xC0AC29B7,0xC97C50DD,0x3F84D5B5,0xB5470917,0x9216D5D9,0x8979FB1B };
+
+
+
+#if BLOWFISH_ROUNDS != 16
+static inline u32
+function_F( BLOWFISH_context *bc, u32 x )
+{
+    u16 a, b, c, d;
+
+#ifdef BIG_ENDIAN_HOST
+    a = ((byte*)&x)[0];
+    b = ((byte*)&x)[1];
+    c = ((byte*)&x)[2];
+    d = ((byte*)&x)[3];
+#else
+    a = ((byte*)&x)[3];
+    b = ((byte*)&x)[2];
+    c = ((byte*)&x)[1];
+    d = ((byte*)&x)[0];
+#endif
+
+    return ((bc->s0[a] + bc->s1[b]) ^ bc->s2[c] ) + bc->s3[d];
+}
+#endif
+
+#ifdef BIG_ENDIAN_HOST
+#define F(x) ((( s0[((byte*)&x)[0]] + s1[((byte*)&x)[1]])       \
+                  ^ s2[((byte*)&x)[2]]) + s3[((byte*)&x)[3]] )
+#else
+#define F(x) ((( s0[((byte*)&x)[3]] + s1[((byte*)&x)[2]])       \
+                  ^ s2[((byte*)&x)[1]]) + s3[((byte*)&x)[0]] )
+#endif
+#define R(l,r,i)  do { l ^= p[i]; r ^= F(l); } while(0)
+
+static void
+burn_stack (int bytes)
+{
+    char buf[64];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+static void
+do_encrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
+{
+#if BLOWFISH_ROUNDS == 16
+    u32 xl, xr, *s0, *s1, *s2, *s3, *p;
+
+    xl = *ret_xl;
+    xr = *ret_xr;
+    p = bc->p;
+    s0 = bc->s0;
+    s1 = bc->s1;
+    s2 = bc->s2;
+    s3 = bc->s3;
+
+    R( xl, xr, 0);
+    R( xr, xl, 1);
+    R( xl, xr, 2);
+    R( xr, xl, 3);
+    R( xl, xr, 4);
+    R( xr, xl, 5);
+    R( xl, xr, 6);
+    R( xr, xl, 7);
+    R( xl, xr, 8);
+    R( xr, xl, 9);
+    R( xl, xr, 10);
+    R( xr, xl, 11);
+    R( xl, xr, 12);
+    R( xr, xl, 13);
+    R( xl, xr, 14);
+    R( xr, xl, 15);
+
+    xl ^= p[BLOWFISH_ROUNDS];
+    xr ^= p[BLOWFISH_ROUNDS+1];
+
+    *ret_xl = xr;
+    *ret_xr = xl;
+
+#else
+    u32 xl, xr, temp, *p;
+    int i;
+
+    xl = *ret_xl;
+    xr = *ret_xr;
+    p = bc->p;
+
+    for(i=0; i < BLOWFISH_ROUNDS; i++ ) {
+       xl ^= p[i];
+       xr ^= function_F(bc, xl);
+       temp = xl;
+       xl = xr;
+       xr = temp;
+    }
+    temp = xl;
+    xl = xr;
+    xr = temp;
+
+    xr ^= p[BLOWFISH_ROUNDS];
+    xl ^= p[BLOWFISH_ROUNDS+1];
+
+    *ret_xl = xl;
+    *ret_xr = xr;
+#endif
+}
+
+
+static void
+decrypt(  BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr )
+{
+#if BLOWFISH_ROUNDS == 16
+    u32 xl, xr, *s0, *s1, *s2, *s3, *p;
+
+    xl = *ret_xl;
+    xr = *ret_xr;
+    p = bc->p;
+    s0 = bc->s0;
+    s1 = bc->s1;
+    s2 = bc->s2;
+    s3 = bc->s3;
+
+    R( xl, xr, 17);
+    R( xr, xl, 16);
+    R( xl, xr, 15);
+    R( xr, xl, 14);
+    R( xl, xr, 13);
+    R( xr, xl, 12);
+    R( xl, xr, 11);
+    R( xr, xl, 10);
+    R( xl, xr, 9);
+    R( xr, xl, 8);
+    R( xl, xr, 7);
+    R( xr, xl, 6);
+    R( xl, xr, 5);
+    R( xr, xl, 4);
+    R( xl, xr, 3);
+    R( xr, xl, 2);
+
+    xl ^= p[1];
+    xr ^= p[0];
+
+    *ret_xl = xr;
+    *ret_xr = xl;
+
+#else
+    u32 xl, xr, temp, *p;
+    int i;
+
+    xl = *ret_xl;
+    xr = *ret_xr;
+    p = bc->p;
+
+    for(i=BLOWFISH_ROUNDS+1; i > 1; i-- ) {
+       xl ^= p[i];
+       xr ^= function_F(bc, xl);
+       temp = xl;
+       xl = xr;
+       xr = temp;
+    }
+
+    temp = xl;
+    xl = xr;
+    xr = temp;
+
+    xr ^= p[1];
+    xl ^= p[0];
+
+    *ret_xl = xl;
+    *ret_xr = xr;
+#endif
+}
+
+#undef F
+#undef R
+
+static void
+do_encrypt_block( BLOWFISH_context *bc, byte *outbuf, const byte *inbuf )
+{
+    u32 d1, d2;
+
+    d1 = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
+    d2 = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
+    do_encrypt( bc, &d1, &d2 );
+    outbuf[0] = (d1 >> 24) & 0xff;
+    outbuf[1] = (d1 >> 16) & 0xff;
+    outbuf[2] = (d1 >> 8) & 0xff;
+    outbuf[3] =  d1       & 0xff;
+    outbuf[4] = (d2 >> 24) & 0xff;
+    outbuf[5] = (d2 >> 16) & 0xff;
+    outbuf[6] = (d2 >> 8) & 0xff;
+    outbuf[7] =  d2       & 0xff;
+}
+
+static void
+encrypt_block( void *bc, byte *outbuf, const byte *inbuf )
+{
+    do_encrypt_block (bc, outbuf, inbuf);
+    burn_stack (64);
+}
+
+static void
+do_decrypt_block( BLOWFISH_context *bc, byte *outbuf, const byte *inbuf )
+{
+    u32 d1, d2;
+
+    d1 = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
+    d2 = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
+    decrypt( bc, &d1, &d2 );
+    outbuf[0] = (d1 >> 24) & 0xff;
+    outbuf[1] = (d1 >> 16) & 0xff;
+    outbuf[2] = (d1 >> 8) & 0xff;
+    outbuf[3] =  d1       & 0xff;
+    outbuf[4] = (d2 >> 24) & 0xff;
+    outbuf[5] = (d2 >> 16) & 0xff;
+    outbuf[6] = (d2 >> 8) & 0xff;
+    outbuf[7] =  d2       & 0xff;
+}
+
+static void
+decrypt_block( void *bc, byte *outbuf, const byte *inbuf )
+{
+    do_decrypt_block (bc, outbuf, inbuf);
+    burn_stack (64);
+}
+
+
+static const char*
+selftest(void)
+{
+    BLOWFISH_context c;
+    byte plain[] = "BLOWFISH";
+    byte buffer[8];
+    byte plain3[] = { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 };
+    byte key3[] = { 0x41, 0x79, 0x6E, 0xA0, 0x52, 0x61, 0x6E, 0xE4 };
+    byte cipher3[] = { 0xE1, 0x13, 0xF4, 0x10, 0x2C, 0xFC, 0xCE, 0x43 };
+
+    bf_setkey( &c, "abcdefghijklmnopqrstuvwxyz", 26 );
+    encrypt_block( &c, buffer, plain );
+    if( memcmp( buffer, "\x32\x4E\xD0\xFE\xF4\x13\xA2\x03", 8 ) )
+       return "Blowfish selftest failed (1).";
+    decrypt_block( &c, buffer, buffer );
+    if( memcmp( buffer, plain, 8 ) )
+       return "Blowfish selftest failed (2).";
+
+    bf_setkey( &c, key3, 8 );
+    encrypt_block( &c, buffer, plain3 );
+    if( memcmp( buffer, cipher3, 8 ) )
+       return "Blowfish selftest failed (3).";
+    decrypt_block( &c, buffer, buffer );
+    if( memcmp( buffer, plain3, 8 ) )
+       return "Blowfish selftest failed (4).";
+    return NULL;
+}
+
+
+static int
+do_bf_setkey( BLOWFISH_context *c, const byte *key, unsigned keylen )
+{
+    int i, j;
+    u32 data, datal, datar;
+    static int initialized;
+    static const char *selftest_failed;
+
+    if( !initialized ) {
+       initialized = 1;
+       selftest_failed = selftest();
+       if( selftest_failed )
+           fprintf(stderr,"%s\n", selftest_failed );
+    }
+    if( selftest_failed )
+       return G10ERR_SELFTEST_FAILED;
+
+    for(i=0; i < BLOWFISH_ROUNDS+2; i++ )
+       c->p[i] = ps[i];
+    for(i=0; i < 256; i++ ) {
+       c->s0[i] = ks0[i];
+       c->s1[i] = ks1[i];
+       c->s2[i] = ks2[i];
+       c->s3[i] = ks3[i];
+    }
+
+    for(i=j=0; i < BLOWFISH_ROUNDS+2; i++ ) {
+#ifdef BIG_ENDIAN_HOST
+       ((byte*)&data)[0] = key[j];
+       ((byte*)&data)[1] = key[(j+1)%keylen];
+       ((byte*)&data)[2] = key[(j+2)%keylen];
+       ((byte*)&data)[3] = key[(j+3)%keylen];
+#else
+       ((byte*)&data)[3] = key[j];
+       ((byte*)&data)[2] = key[(j+1)%keylen];
+       ((byte*)&data)[1] = key[(j+2)%keylen];
+       ((byte*)&data)[0] = key[(j+3)%keylen];
+#endif
+       c->p[i] ^= data;
+       j = (j+4) % keylen;
+    }
+
+    datal = datar = 0;
+    for(i=0; i < BLOWFISH_ROUNDS+2; i += 2 ) {
+       do_encrypt( c, &datal, &datar );
+       c->p[i]   = datal;
+       c->p[i+1] = datar;
+    }
+    for(i=0; i < 256; i += 2 ) {
+       do_encrypt( c, &datal, &datar );
+       c->s0[i]   = datal;
+       c->s0[i+1] = datar;
+    }
+    for(i=0; i < 256; i += 2 ) {
+       do_encrypt( c, &datal, &datar );
+       c->s1[i]   = datal;
+       c->s1[i+1] = datar;
+    }
+    for(i=0; i < 256; i += 2 ) {
+       do_encrypt( c, &datal, &datar );
+       c->s2[i]   = datal;
+       c->s2[i+1] = datar;
+    }
+    for(i=0; i < 256; i += 2 ) {
+       do_encrypt( c, &datal, &datar );
+       c->s3[i]   = datal;
+       c->s3[i+1] = datar;
+    }
+
+
+    /* Check for weak key.  A weak key is a key in which a value in */
+    /* the P-array (here c) occurs more than once per table.       */
+    for(i=0; i < 255; i++ ) {
+       for( j=i+1; j < 256; j++) {
+           if( (c->s0[i] == c->s0[j]) || (c->s1[i] == c->s1[j]) ||
+               (c->s2[i] == c->s2[j]) || (c->s3[i] == c->s3[j]) )
+               return G10ERR_WEAK_KEY;
+       }
+    }
+
+    return 0;
+}
+
+static int
+bf_setkey( void *c, const byte *key, unsigned keylen )
+{
+    int rc = do_bf_setkey (c, key, keylen);
+    burn_stack (64);
+    return rc;
+}
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+blowfish_get_info(int algo, size_t *keylen,
+                 size_t *blocksize, size_t *contextsize,
+                 int (**r_setkey)(void *c, const byte *key, unsigned keylen),
+                 void (**r_encrypt)(void *c, byte *outbuf, const byte *inbuf),
+                 void (**r_decrypt)( void *c, byte *outbuf, const byte *inbuf)
+                 )
+{
+    *keylen = 128;
+    *blocksize = BLOWFISH_BLOCKSIZE;
+    *contextsize = sizeof(BLOWFISH_context);
+    *r_setkey = bf_setkey;
+    *r_encrypt = encrypt_block;
+    *r_decrypt = decrypt_block;
+
+    if( algo == CIPHER_ALGO_BLOWFISH )
+       return "BLOWFISH";
+    return NULL;
+}
diff --git a/cipher/cast5.c b/cipher/cast5.c
new file mode 100644 (file)
index 0000000..043aa7a
--- /dev/null
@@ -0,0 +1,646 @@
+/* cast5.c  -  CAST5 cipher (RFC2144)
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* Test vectors:
+ *
+ * 128-bit key        = 01 23 45 67 12 34 56 78 23 45 67 89 34 56 78 9A
+ *        plaintext   = 01 23 45 67 89 AB CD EF
+ *        ciphertext  = 23 8B 4F E5 84 7E 44 B2
+ *
+ * 80-bit  key        = 01 23 45 67 12 34 56 78 23 45
+ *                    = 01 23 45 67 12 34 56 78 23 45 00 00 00 00 00 00
+ *        plaintext   = 01 23 45 67 89 AB CD EF
+ *        ciphertext  = EB 6A 71 1A 2C 02 27 1B
+ *
+ * 40-bit  key        = 01 23 45 67 12
+ *                    = 01 23 45 67 12 00 00 00 00 00 00 00 00 00 00 00
+ *        plaintext   = 01 23 45 67 89 AB CD EF
+ *        ciphertext  = 7A C8 16 D1 6E 9B 30 2E
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "types.h"
+#include "util.h"
+#include "errors.h"
+#include "algorithms.h"
+
+
+#define CIPHER_ALGO_CAST5       3
+
+#define CAST5_BLOCKSIZE 8
+
+typedef struct {
+    u32  Km[16];
+    byte Kr[16];
+} CAST5_context;
+
+static int  cast_setkey( void *c, const byte *key, unsigned keylen );
+
+static const u32 s1[256] = {
+0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949,
+0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e,
+0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d,
+0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0,
+0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7,
+0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935,
+0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d,
+0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50,
+0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe,
+0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3,
+0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167,
+0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291,
+0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779,
+0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2,
+0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511,
+0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d,
+0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5,
+0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324,
+0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c,
+0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc,
+0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d,
+0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96,
+0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a,
+0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d,
+0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd,
+0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6,
+0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9,
+0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872,
+0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c,
+0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e,
+0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9,
+0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf
+};
+static const u32 s2[256] = {
+0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651,
+0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3,
+0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb,
+0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806,
+0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b,
+0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359,
+0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b,
+0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c,
+0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34,
+0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb,
+0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd,
+0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860,
+0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b,
+0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304,
+0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b,
+0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf,
+0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c,
+0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13,
+0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f,
+0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6,
+0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6,
+0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58,
+0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906,
+0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d,
+0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6,
+0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4,
+0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6,
+0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f,
+0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249,
+0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa,
+0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9,
+0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1
+};
+static const u32 s3[256] = {
+0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90,
+0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5,
+0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e,
+0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240,
+0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5,
+0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b,
+0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71,
+0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04,
+0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82,
+0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15,
+0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2,
+0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176,
+0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148,
+0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc,
+0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341,
+0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e,
+0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51,
+0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f,
+0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a,
+0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b,
+0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b,
+0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5,
+0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45,
+0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536,
+0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc,
+0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0,
+0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69,
+0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2,
+0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49,
+0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d,
+0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a,
+0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783
+};
+static const u32 s4[256] = {
+0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1,
+0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf,
+0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15,
+0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121,
+0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25,
+0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5,
+0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb,
+0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5,
+0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d,
+0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6,
+0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23,
+0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003,
+0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6,
+0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119,
+0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24,
+0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a,
+0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79,
+0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df,
+0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26,
+0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab,
+0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7,
+0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417,
+0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2,
+0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2,
+0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a,
+0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919,
+0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef,
+0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876,
+0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab,
+0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04,
+0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282,
+0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2
+};
+static const u32 s5[256] = {
+0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f,
+0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a,
+0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff,
+0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02,
+0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a,
+0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7,
+0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9,
+0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981,
+0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774,
+0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655,
+0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2,
+0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910,
+0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1,
+0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da,
+0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049,
+0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f,
+0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba,
+0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be,
+0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3,
+0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840,
+0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4,
+0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2,
+0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7,
+0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5,
+0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e,
+0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e,
+0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801,
+0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad,
+0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0,
+0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20,
+0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8,
+0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4
+};
+static const u32 s6[256] = {
+0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac,
+0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138,
+0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367,
+0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98,
+0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072,
+0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3,
+0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd,
+0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8,
+0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9,
+0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54,
+0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387,
+0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc,
+0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf,
+0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf,
+0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f,
+0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289,
+0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950,
+0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f,
+0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b,
+0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be,
+0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13,
+0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976,
+0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0,
+0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891,
+0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da,
+0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc,
+0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084,
+0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25,
+0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121,
+0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5,
+0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd,
+0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f
+};
+static const u32 s7[256] = {
+0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f,
+0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de,
+0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43,
+0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19,
+0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2,
+0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516,
+0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88,
+0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816,
+0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756,
+0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a,
+0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264,
+0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688,
+0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28,
+0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3,
+0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7,
+0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06,
+0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033,
+0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a,
+0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566,
+0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509,
+0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962,
+0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e,
+0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c,
+0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c,
+0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285,
+0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301,
+0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be,
+0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767,
+0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647,
+0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914,
+0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c,
+0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3
+};
+static const u32 s8[256] = {
+0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5,
+0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc,
+0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd,
+0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d,
+0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2,
+0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862,
+0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc,
+0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c,
+0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e,
+0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039,
+0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8,
+0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42,
+0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5,
+0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472,
+0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225,
+0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c,
+0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb,
+0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054,
+0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70,
+0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc,
+0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c,
+0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3,
+0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4,
+0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101,
+0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f,
+0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e,
+0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a,
+0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c,
+0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384,
+0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c,
+0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82,
+0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e
+};
+
+
+#if defined(__GNUC__) && defined(__i386__)
+static inline u32
+rol(int n, u32 x)
+{
+       __asm__("roll %%cl,%0"
+               :"=r" (x)
+               :"0" (x),"c" (n));
+       return x;
+}
+#else
+#define rol(n,x) ( ((x) << (n)) | ((x) >> (32-(n))) )
+#endif
+
+#define F1(D,m,r)  (  (I = ((m) + (D))), (I=rol((r),I)),   \
+    (((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]) )
+#define F2(D,m,r)  (  (I = ((m) ^ (D))), (I=rol((r),I)),   \
+    (((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]) )
+#define F3(D,m,r)  (  (I = ((m) - (D))), (I=rol((r),I)),   \
+    (((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) )
+
+static void
+burn_stack (int bytes)
+{
+    char buf[64];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+static void
+do_encrypt_block( CAST5_context *c, byte *outbuf, const byte *inbuf )
+{
+    u32 l, r, t;
+    u32 I;   /* used by the Fx macros */
+    u32 *Km;
+    byte *Kr;
+
+    Km = c->Km;
+    Kr = c->Kr;
+
+    /* (L0,R0) <-- (m1...m64). (Split the plaintext into left and
+     * right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
+     */
+    l = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
+    r = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
+
+    /* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
+     * Li = Ri-1;
+     * Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
+     * Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
+     * Rounds 2, 5, 8, 11, and 14 use f function Type 2.
+     * Rounds 3, 6, 9, 12, and 15 use f function Type 3.
+     */
+
+    t = l; l = r; r = t ^ F1(r, Km[ 0], Kr[ 0]);
+    t = l; l = r; r = t ^ F2(r, Km[ 1], Kr[ 1]);
+    t = l; l = r; r = t ^ F3(r, Km[ 2], Kr[ 2]);
+    t = l; l = r; r = t ^ F1(r, Km[ 3], Kr[ 3]);
+    t = l; l = r; r = t ^ F2(r, Km[ 4], Kr[ 4]);
+    t = l; l = r; r = t ^ F3(r, Km[ 5], Kr[ 5]);
+    t = l; l = r; r = t ^ F1(r, Km[ 6], Kr[ 6]);
+    t = l; l = r; r = t ^ F2(r, Km[ 7], Kr[ 7]);
+    t = l; l = r; r = t ^ F3(r, Km[ 8], Kr[ 8]);
+    t = l; l = r; r = t ^ F1(r, Km[ 9], Kr[ 9]);
+    t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
+    t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
+    t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
+    t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
+    t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
+    t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
+
+    /* c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16 and
+     * concatenate to form the ciphertext.) */
+    outbuf[0] = (r >> 24) & 0xff;
+    outbuf[1] = (r >> 16) & 0xff;
+    outbuf[2] = (r >>  8) & 0xff;
+    outbuf[3] =  r       & 0xff;
+    outbuf[4] = (l >> 24) & 0xff;
+    outbuf[5] = (l >> 16) & 0xff;
+    outbuf[6] = (l >>  8) & 0xff;
+    outbuf[7] =  l       & 0xff;
+}
+
+static void
+encrypt_block( void *c, byte *outbuf, const byte *inbuf )
+{
+    do_encrypt_block (c, outbuf, inbuf);
+    burn_stack (20+4*sizeof(void*));
+}
+
+static void
+do_decrypt_block (CAST5_context *c, byte *outbuf, const byte *inbuf )
+{
+    u32 l, r, t;
+    u32 I;
+    u32 *Km;
+    byte *Kr;
+
+    Km = c->Km;
+    Kr = c->Kr;
+
+    l = inbuf[0] << 24 | inbuf[1] << 16 | inbuf[2] << 8 | inbuf[3];
+    r = inbuf[4] << 24 | inbuf[5] << 16 | inbuf[6] << 8 | inbuf[7];
+
+    t = l; l = r; r = t ^ F1(r, Km[15], Kr[15]);
+    t = l; l = r; r = t ^ F3(r, Km[14], Kr[14]);
+    t = l; l = r; r = t ^ F2(r, Km[13], Kr[13]);
+    t = l; l = r; r = t ^ F1(r, Km[12], Kr[12]);
+    t = l; l = r; r = t ^ F3(r, Km[11], Kr[11]);
+    t = l; l = r; r = t ^ F2(r, Km[10], Kr[10]);
+    t = l; l = r; r = t ^ F1(r, Km[ 9], Kr[ 9]);
+    t = l; l = r; r = t ^ F3(r, Km[ 8], Kr[ 8]);
+    t = l; l = r; r = t ^ F2(r, Km[ 7], Kr[ 7]);
+    t = l; l = r; r = t ^ F1(r, Km[ 6], Kr[ 6]);
+    t = l; l = r; r = t ^ F3(r, Km[ 5], Kr[ 5]);
+    t = l; l = r; r = t ^ F2(r, Km[ 4], Kr[ 4]);
+    t = l; l = r; r = t ^ F1(r, Km[ 3], Kr[ 3]);
+    t = l; l = r; r = t ^ F3(r, Km[ 2], Kr[ 2]);
+    t = l; l = r; r = t ^ F2(r, Km[ 1], Kr[ 1]);
+    t = l; l = r; r = t ^ F1(r, Km[ 0], Kr[ 0]);
+
+    outbuf[0] = (r >> 24) & 0xff;
+    outbuf[1] = (r >> 16) & 0xff;
+    outbuf[2] = (r >>  8) & 0xff;
+    outbuf[3] =  r       & 0xff;
+    outbuf[4] = (l >> 24) & 0xff;
+    outbuf[5] = (l >> 16) & 0xff;
+    outbuf[6] = (l >>  8) & 0xff;
+    outbuf[7] =  l       & 0xff;
+}
+
+static void
+decrypt_block( void *c, byte *outbuf, const byte *inbuf )
+{
+    do_decrypt_block (c, outbuf, inbuf);
+    burn_stack (20+4*sizeof(void*));
+}
+
+
+static const char*
+selftest(void)
+{
+    CAST5_context c;
+    byte key[16]  = { 0x01, 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78,
+                     0x23, 0x45, 0x67, 0x89, 0x34, 0x56, 0x78, 0x9A  };
+    byte plain[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };
+    byte cipher[8]= { 0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2 };
+    byte buffer[8];
+
+    cast_setkey( &c, key, 16 );
+    encrypt_block( &c, buffer, plain );
+    if( memcmp( buffer, cipher, 8 ) )
+       return "1";
+    decrypt_block( &c, buffer, buffer );
+    if( memcmp( buffer, plain, 8 ) )
+       return "2";
+
+#if 0 /* full maintenance test */
+    {
+       int i;
+       byte a0[16] = { 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
+                       0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A };
+       byte b0[16] = { 0x01,0x23,0x45,0x67,0x12,0x34,0x56,0x78,
+                       0x23,0x45,0x67,0x89,0x34,0x56,0x78,0x9A };
+       byte a1[16] = { 0xEE,0xA9,0xD0,0xA2,0x49,0xFD,0x3B,0xA6,
+                       0xB3,0x43,0x6F,0xB8,0x9D,0x6D,0xCA,0x92 };
+       byte b1[16] = { 0xB2,0xC9,0x5E,0xB0,0x0C,0x31,0xAD,0x71,
+                       0x80,0xAC,0x05,0xB8,0xE8,0x3D,0x69,0x6E };
+
+       for(i=0; i < 1000000; i++ ) {
+           cast_setkey( &c, b0, 16 );
+           encrypt_block( &c, a0, a0 );
+           encrypt_block( &c, a0+8, a0+8 );
+           cast_setkey( &c, a0, 16 );
+           encrypt_block( &c, b0, b0 );
+           encrypt_block( &c, b0+8, b0+8 );
+       }
+       if( memcmp( a0, a1, 16 ) || memcmp( b0, b1, 16 ) )
+           return "3";
+
+    }
+#endif
+    return NULL;
+}
+
+
+static void
+key_schedule( u32 *x, u32 *z, u32 *k )
+{
+
+#define xi(i)   ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
+#define zi(i)   ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
+
+    z[0] = x[0] ^ s5[xi(13)]^s6[xi(15)]^s7[xi(12)]^s8[xi(14)]^s7[xi( 8)];
+    z[1] = x[2] ^ s5[zi( 0)]^s6[zi( 2)]^s7[zi( 1)]^s8[zi( 3)]^s8[xi(10)];
+    z[2] = x[3] ^ s5[zi( 7)]^s6[zi( 6)]^s7[zi( 5)]^s8[zi( 4)]^s5[xi( 9)];
+    z[3] = x[1] ^ s5[zi(10)]^s6[zi( 9)]^s7[zi(11)]^s8[zi( 8)]^s6[xi(11)];
+    k[0] = s5[zi( 8)]^s6[zi( 9)]^s7[zi( 7)]^s8[zi( 6)]^s5[zi( 2)];
+    k[1] = s5[zi(10)]^s6[zi(11)]^s7[zi( 5)]^s8[zi( 4)]^s6[zi( 6)];
+    k[2] = s5[zi(12)]^s6[zi(13)]^s7[zi( 3)]^s8[zi( 2)]^s7[zi( 9)];
+    k[3] = s5[zi(14)]^s6[zi(15)]^s7[zi( 1)]^s8[zi( 0)]^s8[zi(12)];
+
+    x[0] = z[2] ^ s5[zi( 5)]^s6[zi( 7)]^s7[zi( 4)]^s8[zi( 6)]^s7[zi( 0)];
+    x[1] = z[0] ^ s5[xi( 0)]^s6[xi( 2)]^s7[xi( 1)]^s8[xi( 3)]^s8[zi( 2)];
+    x[2] = z[1] ^ s5[xi( 7)]^s6[xi( 6)]^s7[xi( 5)]^s8[xi( 4)]^s5[zi( 1)];
+    x[3] = z[3] ^ s5[xi(10)]^s6[xi( 9)]^s7[xi(11)]^s8[xi( 8)]^s6[zi( 3)];
+    k[4] = s5[xi( 3)]^s6[xi( 2)]^s7[xi(12)]^s8[xi(13)]^s5[xi( 8)];
+    k[5] = s5[xi( 1)]^s6[xi( 0)]^s7[xi(14)]^s8[xi(15)]^s6[xi(13)];
+    k[6] = s5[xi( 7)]^s6[xi( 6)]^s7[xi( 8)]^s8[xi( 9)]^s7[xi( 3)];
+    k[7] = s5[xi( 5)]^s6[xi( 4)]^s7[xi(10)]^s8[xi(11)]^s8[xi( 7)];
+
+    z[0] = x[0] ^ s5[xi(13)]^s6[xi(15)]^s7[xi(12)]^s8[xi(14)]^s7[xi( 8)];
+    z[1] = x[2] ^ s5[zi( 0)]^s6[zi( 2)]^s7[zi( 1)]^s8[zi( 3)]^s8[xi(10)];
+    z[2] = x[3] ^ s5[zi( 7)]^s6[zi( 6)]^s7[zi( 5)]^s8[zi( 4)]^s5[xi( 9)];
+    z[3] = x[1] ^ s5[zi(10)]^s6[zi( 9)]^s7[zi(11)]^s8[zi( 8)]^s6[xi(11)];
+    k[8] = s5[zi( 3)]^s6[zi( 2)]^s7[zi(12)]^s8[zi(13)]^s5[zi( 9)];
+    k[9] = s5[zi( 1)]^s6[zi( 0)]^s7[zi(14)]^s8[zi(15)]^s6[zi(12)];
+    k[10]= s5[zi( 7)]^s6[zi( 6)]^s7[zi( 8)]^s8[zi( 9)]^s7[zi( 2)];
+    k[11]= s5[zi( 5)]^s6[zi( 4)]^s7[zi(10)]^s8[zi(11)]^s8[zi( 6)];
+
+    x[0] = z[2] ^ s5[zi( 5)]^s6[zi( 7)]^s7[zi( 4)]^s8[zi( 6)]^s7[zi( 0)];
+    x[1] = z[0] ^ s5[xi( 0)]^s6[xi( 2)]^s7[xi( 1)]^s8[xi( 3)]^s8[zi( 2)];
+    x[2] = z[1] ^ s5[xi( 7)]^s6[xi( 6)]^s7[xi( 5)]^s8[xi( 4)]^s5[zi( 1)];
+    x[3] = z[3] ^ s5[xi(10)]^s6[xi( 9)]^s7[xi(11)]^s8[xi( 8)]^s6[zi( 3)];
+    k[12]= s5[xi( 8)]^s6[xi( 9)]^s7[xi( 7)]^s8[xi( 6)]^s5[xi( 3)];
+    k[13]= s5[xi(10)]^s6[xi(11)]^s7[xi( 5)]^s8[xi( 4)]^s6[xi( 7)];
+    k[14]= s5[xi(12)]^s6[xi(13)]^s7[xi( 3)]^s8[xi( 2)]^s7[xi( 8)];
+    k[15]= s5[xi(14)]^s6[xi(15)]^s7[xi( 1)]^s8[xi( 0)]^s8[xi(13)];
+
+#undef xi
+#undef zi
+}
+
+
+static int
+do_cast_setkey( CAST5_context *c, const byte *key, unsigned keylen )
+{
+  static int initialized;
+  static const char* selftest_failed;
+    int i;
+    u32 x[4];
+    u32 z[4];
+    u32 k[16];
+
+    if( !initialized ) {
+       initialized = 1;
+       selftest_failed = selftest();
+       if( selftest_failed )
+           fprintf(stderr,"CAST5 selftest failed (%s).\n", selftest_failed );
+    }
+    if( selftest_failed )
+       return G10ERR_SELFTEST_FAILED;
+
+    if( keylen != 16 )
+       return G10ERR_WRONG_KEYLEN;
+
+    x[0] = key[0]  << 24 | key[1]  << 16 | key[2]  << 8 | key[3];
+    x[1] = key[4]  << 24 | key[5]  << 16 | key[6]  << 8 | key[7];
+    x[2] = key[8]  << 24 | key[9]  << 16 | key[10] << 8 | key[11];
+    x[3] = key[12] << 24 | key[13] << 16 | key[14] << 8 | key[15];
+
+    key_schedule( x, z, k );
+    for(i=0; i < 16; i++ )
+       c->Km[i] = k[i];
+    key_schedule( x, z, k );
+    for(i=0; i < 16; i++ )
+       c->Kr[i] = k[i] & 0x1f;
+
+    memset(&x,0, sizeof x);
+    memset(&z,0, sizeof z);
+    memset(&k,0, sizeof k);
+
+#undef xi
+#undef zi
+    return 0;
+}
+
+static int
+cast_setkey( void *c, const byte *key, unsigned keylen )
+{
+    int rc = do_cast_setkey (c, key, keylen);
+    burn_stack (96+7*sizeof(void*));
+    return rc;
+}
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+cast5_get_info( int algo, size_t *keylen,
+               size_t *blocksize, size_t *contextsize,
+               int (**r_setkey)( void *c, const byte *key, unsigned keylen ),
+               void (**r_encrypt)( void *c, byte *outbuf, const byte *inbuf ),
+               void (**r_decrypt)( void *c, byte *outbuf, const byte *inbuf )
+               )
+{
+    *keylen = 128;
+    *blocksize = CAST5_BLOCKSIZE;
+    *contextsize = sizeof(CAST5_context);
+    *r_setkey = cast_setkey;
+    *r_encrypt = encrypt_block;
+    *r_decrypt = decrypt_block;
+
+    if( algo == CIPHER_ALGO_CAST5 )
+       return "CAST5";
+    return NULL;
+}
diff --git a/cipher/cipher.c b/cipher/cipher.c
new file mode 100644 (file)
index 0000000..311919f
--- /dev/null
@@ -0,0 +1,715 @@
+/* cipher.c  - cipher dispatcher
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include "util.h"
+#include "errors.h"
+#include "cipher.h"
+#include "algorithms.h"
+
+/* We have support for a DUMMY encryption cipher which comes handy to
+   debug MDCs and similar things.  Because this is a bit dangerous it
+   is not enabled. */
+/*#define ALLOW_DUMMY 1 */
+
+#define MAX_BLOCKSIZE 16
+#define TABLE_SIZE 14
+
+struct cipher_table_s {
+    const char *name;
+    int algo;
+    size_t blocksize;
+    size_t keylen;
+    size_t contextsize; /* allocate this amount of context */
+    int  (*setkey)( void *c, const byte *key, unsigned keylen );
+    void (*encrypt)( void *c, byte *outbuf, const byte *inbuf );
+    void (*decrypt)( void *c, byte *outbuf, const byte *inbuf );
+};
+
+static struct cipher_table_s cipher_table[TABLE_SIZE];
+static int disabled_algos[TABLE_SIZE];
+
+
+struct cipher_handle_s {
+    int  algo;
+    int  mode;
+    size_t blocksize;
+    byte iv[MAX_BLOCKSIZE];    /* (this should be ulong aligned) */
+    byte lastiv[MAX_BLOCKSIZE];
+    int  unused;  /* in IV */
+    int  (*setkey)( void *c, const byte *key, unsigned keylen );
+    void (*encrypt)( void *c, byte *outbuf, const byte *inbuf );
+    void (*decrypt)( void *c, byte *outbuf, const byte *inbuf );
+    PROPERLY_ALIGNED_TYPE context;
+};
+
+
+#ifdef ALLOW_DUMMY
+static int
+dummy_setkey( void *c, byte *key, unsigned keylen ) { return 0; }
+static void
+dummy_encrypt_block( void *c, byte *outbuf, byte *inbuf ) { BUG(); }
+static void
+dummy_decrypt_block( void *c, byte *outbuf, byte *inbuf ) { BUG(); }
+#ifdef __GNUC__
+# warning DUMMY cipher module is enabled
+#endif
+#endif
+
+
+/****************
+ * Put the static entries into the table.
+ */
+static void
+setup_cipher_table(void)
+{
+    int i=0;
+
+#ifdef USE_AES
+    cipher_table[i].algo = CIPHER_ALGO_AES;
+    cipher_table[i].name = rijndael_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+    cipher_table[i].algo = CIPHER_ALGO_AES192;
+    cipher_table[i].name = rijndael_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+    cipher_table[i].algo = CIPHER_ALGO_AES256;
+    cipher_table[i].name = rijndael_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+#endif
+
+#ifdef USE_TWOFISH
+    cipher_table[i].algo = CIPHER_ALGO_TWOFISH;
+    cipher_table[i].name = twofish_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+#endif
+
+#ifdef USE_BLOWFISH
+    cipher_table[i].algo = CIPHER_ALGO_BLOWFISH;
+    cipher_table[i].name = blowfish_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+#endif
+
+#ifdef USE_CAST5
+    cipher_table[i].algo = CIPHER_ALGO_CAST5;
+    cipher_table[i].name = cast5_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+#endif
+
+    cipher_table[i].algo = CIPHER_ALGO_3DES;
+    cipher_table[i].name = des_get_info( cipher_table[i].algo,
+                                        &cipher_table[i].keylen,
+                                        &cipher_table[i].blocksize,
+                                        &cipher_table[i].contextsize,
+                                        &cipher_table[i].setkey,
+                                        &cipher_table[i].encrypt,
+                                        &cipher_table[i].decrypt     );
+    if( !cipher_table[i].name )
+       BUG();
+    i++;
+
+#ifdef USE_IDEA
+    cipher_table[i].algo = CIPHER_ALGO_IDEA;
+    cipher_table[i].name = idea_get_info( cipher_table[i].algo,
+                                         &cipher_table[i].keylen,
+                                         &cipher_table[i].blocksize,
+                                         &cipher_table[i].contextsize,
+                                         &cipher_table[i].setkey,
+                                         &cipher_table[i].encrypt,
+                                         &cipher_table[i].decrypt     );
+    if (cipher_table[i].name)
+      i++;  /* Note that the loadable IDEA module may not be
+              available. */
+#endif
+
+#ifdef ALLOW_DUMMY
+    cipher_table[i].algo = CIPHER_ALGO_DUMMY;
+    cipher_table[i].name = "DUMMY";
+    cipher_table[i].blocksize = 8;
+    cipher_table[i].keylen = 128;
+    cipher_table[i].contextsize = 0;
+    cipher_table[i].setkey = dummy_setkey;
+    cipher_table[i].encrypt = dummy_encrypt_block;
+    cipher_table[i].decrypt = dummy_decrypt_block;
+    i++;
+#endif
+
+    for( ; i < TABLE_SIZE; i++ )
+       cipher_table[i].name = NULL;
+}
+
+
+/****************
+ * Try to load all modules and return true if new modules are available
+ */
+static int
+load_cipher_modules(void)
+{
+  static int initialized = 0;
+
+  if (!initialized ) 
+    {
+      setup_cipher_table(); /* load static modules on the first call */
+      initialized = 1;
+      return 1;
+    }
+  return 0;
+}
+
+/****************
+ * Map a string to the cipher algo
+ */
+int
+string_to_cipher_algo( const char *string )
+{
+  int i;
+  const char *s;
+
+  /* kludge to alias RIJNDAEL to AES */
+  if ( *string == 'R' || *string == 'r')
+    {
+      if (!ascii_strcasecmp (string, "RIJNDAEL"))
+        string = "AES";
+      else if (!ascii_strcasecmp (string, "RIJNDAEL192"))
+        string = "AES192";
+      else if (!ascii_strcasecmp (string, "RIJNDAEL256"))
+        string = "AES256";
+    }
+
+  do
+    {
+      for(i=0; (s=cipher_table[i].name); i++ ) 
+        {
+          if( !ascii_strcasecmp( s, string ) )
+            return cipher_table[i].algo;
+        }
+    } while( load_cipher_modules() );
+
+    /* Didn't find it, so try the Sx format */
+    if(string[0]=='S' || string[0]=='s')
+      {
+       long val;
+       char *endptr;
+
+       string++;
+
+       val=strtol(string,&endptr,10);
+       if(*string!='\0' && *endptr=='\0' && check_cipher_algo(val)==0)
+         return val;
+      }
+
+  return 0;
+}
+
+/****************
+ * Map a cipher algo to a string
+ */
+const char *
+cipher_algo_to_string( int algo )
+{
+    int i;
+
+    do {
+       for(i=0; cipher_table[i].name; i++ )
+           if( cipher_table[i].algo == algo )
+               return cipher_table[i].name;
+    } while( load_cipher_modules() );
+    return NULL;
+}
+
+
+void
+disable_cipher_algo( int algo )
+{
+    int i;
+
+    for(i=0; i < DIM(disabled_algos); i++ ) {
+       if( !disabled_algos[i] || disabled_algos[i] == algo ) {
+           disabled_algos[i] = algo;
+           return;
+       }
+    }
+    /* fixme: we should use a linked list */
+    log_fatal("can't disable cipher algo %d: table full\n", algo );
+}
+
+/****************
+ * Return 0 if the cipher algo is available
+ */
+int
+check_cipher_algo( int algo )
+{
+    int i;
+
+    do {
+       for(i=0; cipher_table[i].name; i++ )
+          if( cipher_table[i].algo == algo ) {
+               for(i=0; i < DIM(disabled_algos); i++ ) {
+                  if( disabled_algos[i] == algo )
+                      return G10ERR_CIPHER_ALGO;
+               }
+               return 0; /* okay */
+          }
+    } while( load_cipher_modules() );
+    return G10ERR_CIPHER_ALGO;
+}
+
+
+unsigned
+cipher_get_keylen( int algo )
+{
+    int i;
+    unsigned len = 0;
+
+    do {
+       for(i=0; cipher_table[i].name; i++ ) {
+           if( cipher_table[i].algo == algo ) {
+               len = cipher_table[i].keylen;
+               if( !len )
+                   log_bug("cipher %d w/o key length\n", algo );
+               return len;
+           }
+       }
+    } while( load_cipher_modules() );
+    log_bug("cipher %d not found\n", algo );
+    return 0;
+}
+
+unsigned
+cipher_get_blocksize( int algo )
+{
+    int i;
+    unsigned len = 0;
+
+    do {
+       for(i=0; cipher_table[i].name; i++ ) {
+           if( cipher_table[i].algo == algo ) {
+               len = cipher_table[i].blocksize;
+               if( !len )
+                   log_bug("cipher %d w/o blocksize\n", algo );
+               return len;
+           }
+       }
+    } while( load_cipher_modules() );
+    log_bug("cipher %d not found\n", algo );
+    return 0;
+}
+
+
+/****************
+ * Open a cipher handle for use with algorithm ALGO, in mode MODE
+ * and put it into secure memory if SECURE is true.
+ */
+CIPHER_HANDLE
+cipher_open( int algo, int mode, int secure )
+{
+    CIPHER_HANDLE hd;
+    int i;
+
+    fast_random_poll();
+    do {
+       for(i=0; cipher_table[i].name; i++ )
+           if( cipher_table[i].algo == algo )
+               break;
+    } while( !cipher_table[i].name && load_cipher_modules() );
+    if( !cipher_table[i].name ) {
+       log_fatal("cipher_open: algorithm %d not available\n", algo );
+       return NULL;
+    }
+
+    /* ? perform selftest here and mark this with a flag in cipher_table ? */
+
+    hd = secure ? xmalloc_secure_clear( sizeof *hd
+                                       + cipher_table[i].contextsize
+                                       - sizeof(PROPERLY_ALIGNED_TYPE) )
+               : xmalloc_clear( sizeof *hd + cipher_table[i].contextsize
+                                          - sizeof(PROPERLY_ALIGNED_TYPE)  );
+    hd->algo = algo;
+    hd->blocksize = cipher_table[i].blocksize;
+    hd->setkey = cipher_table[i].setkey;
+    hd->encrypt = cipher_table[i].encrypt;
+    hd->decrypt = cipher_table[i].decrypt;
+
+    if( mode == CIPHER_MODE_AUTO_CFB ) {
+       if( algo >= 100 )
+           hd->mode = CIPHER_MODE_CFB;
+       else
+           hd->mode = CIPHER_MODE_PHILS_CFB;
+    }
+    else
+       hd->mode = mode;
+
+#ifdef ALLOW_DUMMY
+    if( algo == CIPHER_ALGO_DUMMY )
+       hd->mode = CIPHER_MODE_DUMMY;
+#endif
+
+    return hd;
+}
+
+
+void
+cipher_close( CIPHER_HANDLE c )
+{
+    xfree(c);
+}
+
+
+int
+cipher_setkey( CIPHER_HANDLE c, byte *key, unsigned keylen )
+{
+    return (*c->setkey)( &c->context.c, key, keylen );
+}
+
+
+void
+cipher_setiv( CIPHER_HANDLE c, const byte *iv, unsigned ivlen )
+{
+    memset( c->iv, 0, c->blocksize );
+    if( iv ) {
+       if( ivlen != c->blocksize )
+           log_info("WARNING: cipher_setiv: ivlen=%u blklen=%u\n",
+                                            ivlen, (unsigned)c->blocksize );
+       if( ivlen > c->blocksize )
+           ivlen = c->blocksize;
+       memcpy( c->iv, iv, ivlen );
+    }
+    c->unused = 0;
+}
+
+static void
+do_ecb_encrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nblocks )
+{
+    unsigned n;
+
+    for(n=0; n < nblocks; n++ ) {
+       (*c->encrypt)( &c->context.c, outbuf, inbuf );
+       inbuf  += c->blocksize;
+       outbuf += c->blocksize;
+    }
+}
+
+static void
+do_ecb_decrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nblocks )
+{
+    unsigned n;
+
+    for(n=0; n < nblocks; n++ ) {
+       (*c->decrypt)( &c->context.c, outbuf, inbuf );
+       inbuf  += c->blocksize;
+       outbuf += c->blocksize;
+    }
+}
+
+static void
+do_cbc_encrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nblocks )
+{
+    unsigned int n;
+    byte *ivp;
+    int i;
+    size_t blocksize = c->blocksize;
+
+    for(n=0; n < nblocks; n++ ) {
+       /* fixme: the xor should works on words and not on
+        * bytes.  Maybe it is a good idea to enhance the cipher backend
+        * API to allow for CBC handling in the backend */
+       for(ivp=c->iv,i=0; i < blocksize; i++ )
+           outbuf[i] = inbuf[i] ^ *ivp++;
+       (*c->encrypt)( &c->context.c, outbuf, outbuf );
+       memcpy(c->iv, outbuf, blocksize );
+       inbuf  += c->blocksize;
+       outbuf += c->blocksize;
+    }
+}
+
+static void
+do_cbc_decrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nblocks )
+{
+    unsigned int n;
+    byte *ivp;
+    int i;
+    size_t blocksize = c->blocksize;
+
+    for(n=0; n < nblocks; n++ ) {
+       /* because outbuf and inbuf might be the same, we have
+        * to save the original ciphertext block.  We use lastiv
+        * for this here because it is not used otherwise */
+       memcpy(c->lastiv, inbuf, blocksize );
+       (*c->decrypt)( &c->context.c, outbuf, inbuf );
+       for(ivp=c->iv,i=0; i < blocksize; i++ )
+           outbuf[i] ^= *ivp++;
+       memcpy(c->iv, c->lastiv, blocksize );
+       inbuf  += c->blocksize;
+       outbuf += c->blocksize;
+    }
+}
+
+
+static void
+do_cfb_encrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nbytes )
+{
+    byte *ivp;
+    size_t blocksize = c->blocksize;
+
+    if( nbytes <= c->unused ) {
+       /* short enough to be encoded by the remaining XOR mask */
+       /* XOR the input with the IV and store input into IV */
+       for(ivp=c->iv+c->blocksize - c->unused; nbytes; nbytes--, c->unused-- )
+           *outbuf++ = (*ivp++ ^= *inbuf++);
+       return;
+    }
+
+    if( c->unused ) {
+       /* XOR the input with the IV and store input into IV */
+       nbytes -= c->unused;
+       for(ivp=c->iv+blocksize - c->unused; c->unused; c->unused-- )
+           *outbuf++ = (*ivp++ ^= *inbuf++);
+    }
+
+    /* Now we can process complete blocks. */
+#if 0 
+    /* Experimental code.  We may only use this for standard CFB
+       because for Phil's mode we need to save the IV of before the
+       last encryption - we don't want to do this in tghe fasf CFB
+       encryption routine.  */
+    if (c->algo == CIPHER_ALGO_AES
+        && nbytes >= blocksize 
+        && c->mode != CIPHER_MODE_PHILS_CFB) {
+        size_t n;
+
+       memcpy( c->lastiv, c->iv, blocksize );
+        n = (nbytes / blocksize) * blocksize;
+        rijndael_cfb_encrypt (&c->context.c, c->iv, outbuf, inbuf, n);
+        inbuf  += n;
+        outbuf += n;
+       nbytes -= n;
+    }
+#endif
+    while( nbytes >= blocksize ) {
+       int i;
+       /* encrypt the IV (and save the current one) */
+       memcpy( c->lastiv, c->iv, blocksize );
+       (*c->encrypt)( &c->context.c, c->iv, c->iv );
+       /* XOR the input with the IV and store input into IV */
+       for(ivp=c->iv,i=0; i < blocksize; i++ )
+           *outbuf++ = (*ivp++ ^= *inbuf++);
+       nbytes -= blocksize;
+    }
+    if( nbytes ) { /* process the remaining bytes */
+       /* encrypt the IV (and save the current one) */
+       memcpy( c->lastiv, c->iv, blocksize );
+       (*c->encrypt)( &c->context.c, c->iv, c->iv );
+       c->unused = blocksize;
+       /* and apply the xor */
+       c->unused -= nbytes;
+       for(ivp=c->iv; nbytes; nbytes-- )
+           *outbuf++ = (*ivp++ ^= *inbuf++);
+    }
+}
+
+static void
+do_cfb_decrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nbytes )
+{
+    byte *ivp;
+    ulong temp;
+    size_t blocksize = c->blocksize;
+
+    if( nbytes <= c->unused ) {
+       /* short enough to be encoded by the remaining XOR mask */
+       /* XOR the input with the IV and store input into IV */
+       for(ivp=c->iv+blocksize - c->unused; nbytes; nbytes--,c->unused--){
+           temp = *inbuf++;
+           *outbuf++ = *ivp ^ temp;
+           *ivp++ = temp;
+       }
+       return;
+    }
+
+    if( c->unused ) {
+       /* XOR the input with the IV and store input into IV */
+       nbytes -= c->unused;
+       for(ivp=c->iv+blocksize - c->unused; c->unused; c->unused-- ) {
+           temp = *inbuf++;
+           *outbuf++ = *ivp ^ temp;
+           *ivp++ = temp;
+       }
+    }
+
+    /* now we can process complete blocks */
+    while( nbytes >= blocksize ) {
+       int i;
+       /* encrypt the IV (and save the current one) */
+       memcpy( c->lastiv, c->iv, blocksize );
+       (*c->encrypt)( &c->context.c, c->iv, c->iv );
+       /* XOR the input with the IV and store input into IV */
+       for(ivp=c->iv,i=0; i < blocksize; i++ ) {
+           temp = *inbuf++;
+           *outbuf++ = *ivp ^ temp;
+           *ivp++ = temp;
+       }
+       nbytes -= blocksize;
+    }
+    if( nbytes ) { /* process the remaining bytes */
+       /* encrypt the IV (and save the current one) */
+       memcpy( c->lastiv, c->iv, blocksize );
+       (*c->encrypt)( &c->context.c, c->iv, c->iv );
+       c->unused = blocksize;
+       /* and apply the xor */
+       c->unused -= nbytes;
+       for(ivp=c->iv; nbytes; nbytes-- ) {
+           temp = *inbuf++;
+           *outbuf++ = *ivp ^ temp;
+           *ivp++ = temp;
+       }
+    }
+}
+
+
+/****************
+ * Encrypt INBUF to OUTBUF with the mode selected at open.
+ * inbuf and outbuf may overlap or be the same.
+ * Depending on the mode some some contraints apply to NBYTES.
+ */
+void
+cipher_encrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nbytes )
+{
+    switch( c->mode ) {
+      case CIPHER_MODE_ECB:
+       assert(!(nbytes%c->blocksize));
+       do_ecb_encrypt(c, outbuf, inbuf, nbytes/c->blocksize );
+       break;
+      case CIPHER_MODE_CBC:
+       assert(!(nbytes%c->blocksize));  
+       do_cbc_encrypt(c, outbuf, inbuf, nbytes/c->blocksize );
+       break;
+      case CIPHER_MODE_CFB:
+      case CIPHER_MODE_PHILS_CFB:
+       do_cfb_encrypt(c, outbuf, inbuf, nbytes );
+       break;
+#ifdef ALLOW_DUMMY
+      case CIPHER_MODE_DUMMY:
+       if( inbuf != outbuf )
+           memmove( outbuf, inbuf, nbytes );
+       break;
+#endif
+      default: log_fatal("cipher_encrypt: invalid mode %d\n", c->mode );
+    }
+}
+
+
+/****************
+ * Decrypt INBUF to OUTBUF with the mode selected at open.
+ * inbuf and outbuf may overlap or be the same.
+ * Depending on the mode some some contraints apply to NBYTES.
+ */
+void
+cipher_decrypt( CIPHER_HANDLE c, byte *outbuf, byte *inbuf, unsigned nbytes )
+{
+    switch( c->mode ) {
+      case CIPHER_MODE_ECB:
+       assert(!(nbytes%c->blocksize));
+       do_ecb_decrypt(c, outbuf, inbuf, nbytes/c->blocksize );
+       break;
+      case CIPHER_MODE_CBC:
+       assert(!(nbytes%c->blocksize));
+       do_cbc_decrypt(c, outbuf, inbuf, nbytes/c->blocksize );
+       break;
+      case CIPHER_MODE_CFB:
+      case CIPHER_MODE_PHILS_CFB:
+       do_cfb_decrypt(c, outbuf, inbuf, nbytes );
+       break;
+#ifdef ALLOW_DUMMY
+      case CIPHER_MODE_DUMMY:
+       if( inbuf != outbuf )
+           memmove( outbuf, inbuf, nbytes );
+       break;
+#endif
+      default: log_fatal("cipher_decrypt: invalid mode %d\n", c->mode );
+    }
+}
+
+
+
+/****************
+ * Used for PGP's somewhat strange CFB mode. Only works if
+ * the handle is in PHILS_CFB mode
+ */
+void
+cipher_sync( CIPHER_HANDLE c )
+{
+    if( c->mode == CIPHER_MODE_PHILS_CFB && c->unused ) {
+       memmove(c->iv + c->unused, c->iv, c->blocksize - c->unused );
+       memcpy(c->iv, c->lastiv + c->blocksize - c->unused, c->unused);
+       c->unused = 0;
+    }
+}
diff --git a/cipher/des.c b/cipher/des.c
new file mode 100644 (file)
index 0000000..6ad7993
--- /dev/null
@@ -0,0 +1,1022 @@
+/* des.c - DES and Triple-DES encryption/decryption Algorithm
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ *
+ * According to the definition of DES in FIPS PUB 46-2 from December 1993.
+ * For a description of triple encryption, see:
+ *   Bruce Schneier: Applied Cryptography. Second Edition.
+ *   John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff.
+ */
+
+
+/*
+ * Written by Michael Roth <mroth@nessie.de>, September 1998
+ */
+
+
+/*
+ *  U S A G E
+ * ===========
+ *
+ * For DES or Triple-DES encryption/decryption you must initialize a proper
+ * encryption context with a key.
+ *
+ * A DES key is 64bit wide but only 56bits of the key are used. The remaining
+ * bits are parity bits and they will _not_ checked in this implementation, but
+ * simply ignored.
+ *
+ * For Triple-DES you could use either two 64bit keys or three 64bit keys.
+ * The parity bits will _not_ checked, too.
+ *
+ * After initializing a context with a key you could use this context to
+ * encrypt or decrypt data in 64bit blocks in Electronic Codebook Mode.
+ *
+ * (In the examples below the slashes at the beginning and ending of comments
+ * are omited.)
+ *
+ * DES Example
+ * -----------
+ *     unsigned char key[8];
+ *     unsigned char plaintext[8];
+ *     unsigned char ciphertext[8];
+ *     unsigned char recoverd[8];
+ *     des_ctx context;
+ *
+ *     * Fill 'key' and 'plaintext' with some data *
+ *     ....
+ *
+ *     * Set up the DES encryption context *
+ *     des_setkey(context, key);
+ *
+ *     * Encrypt the plaintext *
+ *     des_ecb_encrypt(context, plaintext, ciphertext);
+ *
+ *     * To recover the orginal plaintext from ciphertext use: *
+ *     des_ecb_decrypt(context, ciphertext, recoverd);
+ *
+ *
+ * Triple-DES Example
+ * ------------------
+ *     unsigned char key1[8];
+ *     unsigned char key2[8];
+ *     unsigned char key3[8];
+ *     unsigned char plaintext[8];
+ *     unsigned char ciphertext[8];
+ *     unsigned char recoverd[8];
+ *     tripledes_ctx context;
+ *
+ *     * If you would like to use two 64bit keys, fill 'key1' and'key2'
+ *      then setup the encryption context: *
+ *     tripledes_set2keys(context, key1, key2);
+ *
+ *     * To use three 64bit keys with Triple-DES use: *
+ *     tripledes_set3keys(context, key1, key2, key3);
+ *
+ *     * Encrypting plaintext with Triple-DES *
+ *     tripledes_ecb_encrypt(context, plaintext, ciphertext);
+ *
+ *     * Decrypting ciphertext to recover the plaintext with Triple-DES *
+ *     tripledes_ecb_decrypt(context, ciphertext, recoverd);
+ *
+ *
+ * Selftest
+ * --------
+ *     char *error_msg;
+ *
+ *     * To perform a selftest of this DES/Triple-DES implementation use the
+ *      function selftest(). It will return an error string if their are
+ *      some problems with this library. *
+ *
+ *     if ( (error_msg = selftest()) )
+ *     {
+ *        fprintf(stderr, "An error in the DES/Tripple-DES implementation occured: %s\n", error_msg);
+ *        abort();
+ *     }
+ */
+
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>           /* memcpy, memcmp */
+#include "types.h"             /* for byte and u32 typedefs */
+#include "util.h"
+#include "errors.h"
+#include "algorithms.h"
+
+#if defined(__GNUC__) && defined(__GNU_LIBRARY__)
+#define working_memcmp memcmp
+#else
+/*
+ * According to the SunOS man page, memcmp returns indeterminate sign
+ * depending on whether characters are signed or not.
+ */
+int
+working_memcmp( const char *a, const char *b, size_t n )
+{
+    for( ; n; n--, a++, b++ )
+       if( *a != *b )
+           return (int)(*(byte*)a) - (int)(*(byte*)b);
+    return 0;
+}
+#endif
+
+
+
+/* Some defines/checks to support standalone modules */
+
+#ifndef CIPHER_ALGO_3DES
+#define CIPHER_ALGO_3DES 2
+#elif CIPHER_ALGO_3DES != 2
+#error CIPHER_ALGO_3DES is defined to a wrong value.
+#endif
+
+
+
+
+/*
+ * Encryption/Decryption context of DES
+ */
+typedef struct _des_ctx
+  {
+    u32 encrypt_subkeys[32];
+    u32 decrypt_subkeys[32];
+  }
+des_ctx[1];
+
+/*
+ * Encryption/Decryption context of Triple-DES
+ */
+typedef struct _tripledes_ctx
+  {
+    u32 encrypt_subkeys[96];
+    u32 decrypt_subkeys[96];
+  }
+tripledes_ctx[1];
+
+static const char *selftest_failed;
+
+static void des_key_schedule (const byte *, u32 *);
+static int des_setkey (struct _des_ctx *, const byte *);
+static int des_ecb_crypt (struct _des_ctx *, const byte *, byte *, int);
+static int tripledes_set2keys (struct _tripledes_ctx *, const byte *, const byte *);
+static int tripledes_set3keys (struct _tripledes_ctx *, const byte *, const byte *, const byte *);
+static int tripledes_ecb_crypt (struct _tripledes_ctx *, const byte *, byte *, int);
+static int is_weak_key ( const byte *key );
+static const char *selftest (void);
+
+
+
+
+
+
+/*
+ * The s-box values are permuted according to the 'primitive function P'
+ * and are rotated one bit to the left.
+ */
+static u32 sbox1[64] =
+{
+  0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000,
+  0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
+  0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
+  0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000,
+  0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400,
+  0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
+  0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400,
+  0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004
+};
+
+static u32 sbox2[64] =
+{
+  0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020,
+  0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
+  0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
+  0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020,
+  0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000,
+  0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
+  0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020,
+  0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000
+};
+
+static u32 sbox3[64] =
+{
+  0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200,
+  0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
+  0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
+  0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000,
+  0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000,
+  0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
+  0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008,
+  0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200
+};
+
+static u32 sbox4[64] =
+{
+  0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001,
+  0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
+  0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
+  0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081,
+  0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000,
+  0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
+  0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081,
+  0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080
+};
+
+static u32 sbox5[64] =
+{
+  0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000,
+  0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
+  0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
+  0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100,
+  0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100,
+  0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
+  0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000,
+  0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100
+};
+
+static u32 sbox6[64] =
+{
+  0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000,
+  0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
+  0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
+  0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000,
+  0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010,
+  0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
+  0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010,
+  0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010
+};
+
+static u32 sbox7[64] =
+{
+  0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800,
+  0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
+  0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
+  0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800,
+  0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002,
+  0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
+  0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802,
+  0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002
+};
+
+static u32 sbox8[64] =
+{
+  0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000,
+  0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
+  0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
+  0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000,
+  0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040,
+  0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
+  0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000,
+  0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000
+};
+
+
+/*
+ * These two tables are part of the 'permuted choice 1' function.
+ * In this implementation several speed improvements are done.
+ */
+u32 leftkey_swap[16] =
+{
+  0x00000000, 0x00000001, 0x00000100, 0x00000101,
+  0x00010000, 0x00010001, 0x00010100, 0x00010101,
+  0x01000000, 0x01000001, 0x01000100, 0x01000101,
+  0x01010000, 0x01010001, 0x01010100, 0x01010101
+};
+
+u32 rightkey_swap[16] =
+{
+  0x00000000, 0x01000000, 0x00010000, 0x01010000,
+  0x00000100, 0x01000100, 0x00010100, 0x01010100,
+  0x00000001, 0x01000001, 0x00010001, 0x01010001,
+  0x00000101, 0x01000101, 0x00010101, 0x01010101,
+};
+
+
+
+/*
+ * Numbers of left shifts per round for encryption subkeys.
+ * To calculate the decryption subkeys we just reverse the
+ * ordering of the calculated encryption subkeys. So their
+ * is no need for a decryption rotate tab.
+ */
+static byte encrypt_rotate_tab[16] =
+{
+  1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
+};
+
+
+
+/*
+ * Table with weak DES keys sorted in ascending order.
+ * In DES their are 64 known keys wich are weak. They are weak
+ * because they produce only one, two or four different
+ * subkeys in the subkey scheduling process.
+ * The keys in this table have all their parity bits cleared.
+ */
+static byte weak_keys[64][8] =
+{
+  { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },  { 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e },
+  { 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0 },  { 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe },
+  { 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e },  { 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00 },
+  { 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe },  { 0x00, 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0 },
+  { 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0 },  { 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe },
+  { 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00 },  { 0x00, 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e },
+  { 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe },  { 0x00, 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0 },
+  { 0x00, 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e },  { 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00 },
+  { 0x0e, 0x0e, 0x0e, 0x0e, 0xf0, 0xf0, 0xf0, 0xf0 },  { 0x1e, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x0e },
+  { 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00 },  { 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0, 0xfe },
+  { 0x1e, 0x00, 0xfe, 0xe0, 0x0e, 0x00, 0xfe, 0xf0 },  { 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00 },
+  { 0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e },  { 0x1e, 0x1e, 0xe0, 0xe0, 0x0e, 0x0e, 0xf0, 0xf0 },
+  { 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe, 0xfe },  { 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00, 0xfe },
+  { 0x1e, 0xe0, 0x1e, 0xe0, 0x0e, 0xf0, 0x0e, 0xf0 },  { 0x1e, 0xe0, 0xe0, 0x1e, 0x0e, 0xf0, 0xf0, 0x0e },
+  { 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe, 0x00 },  { 0x1e, 0xfe, 0x00, 0xe0, 0x0e, 0xfe, 0x00, 0xf0 },
+  { 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe },  { 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0, 0x00 },
+  { 0x1e, 0xfe, 0xfe, 0x1e, 0x0e, 0xfe, 0xfe, 0x0e },  { 0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0xf0 },
+  { 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e, 0xfe },  { 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00 },
+  { 0xe0, 0x00, 0xfe, 0x1e, 0xf0, 0x00, 0xfe, 0x0e },  { 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00, 0xfe },
+  { 0xe0, 0x1e, 0x1e, 0xe0, 0xf0, 0x0e, 0x0e, 0xf0 },  { 0xe0, 0x1e, 0xe0, 0x1e, 0xf0, 0x0e, 0xf0, 0x0e },
+  { 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe, 0x00 },  { 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00 },
+  { 0xe0, 0xe0, 0x1e, 0x1e, 0xf0, 0xf0, 0x0e, 0x0e },  { 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe, 0xfe },
+  { 0xe0, 0xfe, 0x00, 0x1e, 0xf0, 0xfe, 0x00, 0x0e },  { 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e, 0x00 },
+  { 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe },  { 0xe0, 0xfe, 0xfe, 0xe0, 0xf0, 0xfe, 0xfe, 0xf0 },
+  { 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe },  { 0xfe, 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0 },
+  { 0xfe, 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e },  { 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00 },
+  { 0xfe, 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0 },  { 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe },
+  { 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00 },  { 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e },
+  { 0xfe, 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e },  { 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00 },
+  { 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe },  { 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0 },
+  { 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00 },  { 0xfe, 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e },
+  { 0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0 },  { 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe }
+};
+
+
+
+
+
+
+/*
+ * Macro to swap bits across two words.
+ */
+#define DO_PERMUTATION(a, temp, b, offset, mask)       \
+    temp = ((a>>offset) ^ b) & mask;                   \
+    b ^= temp;                                         \
+    a ^= temp<<offset;
+
+
+/*
+ * This performs the 'initial permutation' of the data to be encrypted
+ * or decrypted. Additionally the resulting two words are rotated one bit
+ * to the left.
+ */
+#define INITIAL_PERMUTATION(left, temp, right)         \
+    DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)   \
+    DO_PERMUTATION(left, temp, right, 16, 0x0000ffff)  \
+    DO_PERMUTATION(right, temp, left, 2, 0x33333333)   \
+    DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff)   \
+    right =  (right << 1) | (right >> 31);             \
+    temp  =  (left ^ right) & 0xaaaaaaaa;              \
+    right ^= temp;                                     \
+    left  ^= temp;                                     \
+    left  =  (left << 1) | (left >> 31);
+
+/*
+ * The 'inverse initial permutation'.
+ */
+#define FINAL_PERMUTATION(left, temp, right)           \
+    left  =  (left << 31) | (left >> 1);               \
+    temp  =  (left ^ right) & 0xaaaaaaaa;              \
+    left  ^= temp;                                     \
+    right ^= temp;                                     \
+    right  =  (right << 31) | (right >> 1);            \
+    DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff)   \
+    DO_PERMUTATION(right, temp, left, 2, 0x33333333)   \
+    DO_PERMUTATION(left, temp, right, 16, 0x0000ffff)  \
+    DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)
+
+
+/*
+ * A full DES round including 'expansion function', 'sbox substitution'
+ * and 'primitive function P' but without swapping the left and right word.
+ * Please note: The data in 'from' and 'to' is already rotated one bit to
+ * the left, done in the initial permutation.
+ */
+#define DES_ROUND(from, to, work, subkey)              \
+    work = from ^ *subkey++;                           \
+    to ^= sbox8[  work     & 0x3f ];                   \
+    to ^= sbox6[ (work>>8)  & 0x3f ];                  \
+    to ^= sbox4[ (work>>16) & 0x3f ];                  \
+    to ^= sbox2[ (work>>24) & 0x3f ];                  \
+    work = ((from << 28) | (from >> 4)) ^ *subkey++;   \
+    to ^= sbox7[  work     & 0x3f ];                   \
+    to ^= sbox5[ (work>>8)  & 0x3f ];                  \
+    to ^= sbox3[ (work>>16) & 0x3f ];                  \
+    to ^= sbox1[ (work>>24) & 0x3f ];
+
+/*
+ * Macros to convert 8 bytes from/to 32bit words.
+ */
+#define READ_64BIT_DATA(data, left, right)                                     \
+    left  = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];      \
+    right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
+
+#define WRITE_64BIT_DATA(data, left, right)                                    \
+    data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff;                \
+    data[2] = (left >> 8) &0xff; data[3] = left &0xff;                         \
+    data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff;              \
+    data[6] = (right >> 8) &0xff; data[7] = right &0xff;
+
+/*
+ * Handy macros for encryption and decryption of data
+ */
+#define des_ecb_encrypt(ctx, from, to)         des_ecb_crypt(ctx, from, to, 0)
+#define des_ecb_decrypt(ctx, from, to)         des_ecb_crypt(ctx, from, to, 1)
+#define tripledes_ecb_encrypt(ctx, from, to)   tripledes_ecb_crypt(ctx, from, to, 0)
+#define tripledes_ecb_decrypt(ctx, from, to)   tripledes_ecb_crypt(ctx, from, to, 1)
+
+
+static void
+burn_stack (int bytes)
+{
+    char buf[64];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+/*
+ * des_key_schedule():   Calculate 16 subkeys pairs (even/odd) for
+ *                       16 encryption rounds.
+ *                       To calculate subkeys for decryption the caller
+ *                       have to reorder the generated subkeys.
+ *
+ *    rawkey:      8 Bytes of key data
+ *    subkey:      Array of at least 32 u32s. Will be filled
+ *                 with calculated subkeys.
+ *
+ */
+static void
+des_key_schedule (const byte * rawkey, u32 * subkey)
+{
+  u32 left, right, work;
+  int round;
+
+  READ_64BIT_DATA (rawkey, left, right)
+
+  DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f)
+  DO_PERMUTATION (right, work, left, 0, 0x10101010)
+
+  left = (leftkey_swap[(left >> 0) & 0xf] << 3) | (leftkey_swap[(left >> 8) & 0xf] << 2)
+    | (leftkey_swap[(left >> 16) & 0xf] << 1) | (leftkey_swap[(left >> 24) & 0xf])
+    | (leftkey_swap[(left >> 5) & 0xf] << 7) | (leftkey_swap[(left >> 13) & 0xf] << 6)
+    | (leftkey_swap[(left >> 21) & 0xf] << 5) | (leftkey_swap[(left >> 29) & 0xf] << 4);
+
+  left &= 0x0fffffff;
+
+  right = (rightkey_swap[(right >> 1) & 0xf] << 3) | (rightkey_swap[(right >> 9) & 0xf] << 2)
+    | (rightkey_swap[(right >> 17) & 0xf] << 1) | (rightkey_swap[(right >> 25) & 0xf])
+    | (rightkey_swap[(right >> 4) & 0xf] << 7) | (rightkey_swap[(right >> 12) & 0xf] << 6)
+    | (rightkey_swap[(right >> 20) & 0xf] << 5) | (rightkey_swap[(right >> 28) & 0xf] << 4);
+
+  right &= 0x0fffffff;
+
+  for (round = 0; round < 16; ++round)
+    {
+      left = ((left << encrypt_rotate_tab[round]) | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
+      right = ((right << encrypt_rotate_tab[round]) | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
+
+      *subkey++ = ((left << 4) & 0x24000000)
+       | ((left << 28) & 0x10000000)
+       | ((left << 14) & 0x08000000)
+       | ((left << 18) & 0x02080000)
+       | ((left << 6) & 0x01000000)
+       | ((left << 9) & 0x00200000)
+       | ((left >> 1) & 0x00100000)
+       | ((left << 10) & 0x00040000)
+       | ((left << 2) & 0x00020000)
+       | ((left >> 10) & 0x00010000)
+       | ((right >> 13) & 0x00002000)
+       | ((right >> 4) & 0x00001000)
+       | ((right << 6) & 0x00000800)
+       | ((right >> 1) & 0x00000400)
+       | ((right >> 14) & 0x00000200)
+       | (right & 0x00000100)
+       | ((right >> 5) & 0x00000020)
+       | ((right >> 10) & 0x00000010)
+       | ((right >> 3) & 0x00000008)
+       | ((right >> 18) & 0x00000004)
+       | ((right >> 26) & 0x00000002)
+       | ((right >> 24) & 0x00000001);
+
+      *subkey++ = ((left << 15) & 0x20000000)
+       | ((left << 17) & 0x10000000)
+       | ((left << 10) & 0x08000000)
+       | ((left << 22) & 0x04000000)
+       | ((left >> 2) & 0x02000000)
+       | ((left << 1) & 0x01000000)
+       | ((left << 16) & 0x00200000)
+       | ((left << 11) & 0x00100000)
+       | ((left << 3) & 0x00080000)
+       | ((left >> 6) & 0x00040000)
+       | ((left << 15) & 0x00020000)
+       | ((left >> 4) & 0x00010000)
+       | ((right >> 2) & 0x00002000)
+       | ((right << 8) & 0x00001000)
+       | ((right >> 14) & 0x00000808)
+       | ((right >> 9) & 0x00000400)
+       | ((right) & 0x00000200)
+       | ((right << 7) & 0x00000100)
+       | ((right >> 7) & 0x00000020)
+       | ((right >> 3) & 0x00000011)
+       | ((right << 2) & 0x00000004)
+       | ((right >> 21) & 0x00000002);
+    }
+}
+
+
+
+/*
+ * Fill a DES context with subkeys calculated from a 64bit key.
+ * Does not check parity bits, but simply ignore them.
+ * Does not check for weak keys.
+ */
+static int
+des_setkey (struct _des_ctx *ctx, const byte * key)
+{
+  int i;
+
+  if( selftest_failed )
+    return G10ERR_SELFTEST_FAILED;
+
+  des_key_schedule (key, ctx->encrypt_subkeys);
+  burn_stack (32);
+
+  for(i=0; i<32; i+=2)
+    {
+      ctx->decrypt_subkeys[i]  = ctx->encrypt_subkeys[30-i];
+      ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[31-i];
+    }
+
+  return 0;
+}
+
+
+
+/*
+ * Electronic Codebook Mode DES encryption/decryption of data according
+ * to 'mode'.
+ */
+static int
+des_ecb_crypt (struct _des_ctx *ctx, const byte * from, byte * to, int mode)
+{
+  u32 left, right, work;
+  u32 *keys;
+
+  keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
+
+  READ_64BIT_DATA (from, left, right)
+  INITIAL_PERMUTATION (left, work, right)
+
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+
+  FINAL_PERMUTATION (right, work, left)
+  WRITE_64BIT_DATA (to, right, left)
+
+  return 0;
+}
+
+
+
+/*
+ * Fill a Triple-DES context with subkeys calculated from two 64bit keys.
+ * Does not check the parity bits of the keys, but simply ignore them.
+ * Does not check for weak keys.
+ */
+static int
+tripledes_set2keys (struct _tripledes_ctx *ctx,
+                   const byte * key1,
+                   const byte * key2)
+{
+  int i;
+
+  des_key_schedule (key1, ctx->encrypt_subkeys);
+  des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
+  burn_stack (32);
+
+  for(i=0; i<32; i+=2)
+    {
+      ctx->decrypt_subkeys[i]   = ctx->encrypt_subkeys[30-i];
+      ctx->decrypt_subkeys[i+1]  = ctx->encrypt_subkeys[31-i];
+
+      ctx->encrypt_subkeys[i+32] = ctx->decrypt_subkeys[62-i];
+      ctx->encrypt_subkeys[i+33] = ctx->decrypt_subkeys[63-i];
+
+      ctx->encrypt_subkeys[i+64] = ctx->encrypt_subkeys[i];
+      ctx->encrypt_subkeys[i+65] = ctx->encrypt_subkeys[i+1];
+
+      ctx->decrypt_subkeys[i+64] = ctx->decrypt_subkeys[i];
+      ctx->decrypt_subkeys[i+65] = ctx->decrypt_subkeys[i+1];
+    }
+
+  return 0;
+}
+
+
+
+/*
+ * Fill a Triple-DES context with subkeys calculated from three 64bit keys.
+ * Does not check the parity bits of the keys, but simply ignore them.
+ * Does not check for weak keys.
+ */
+static int
+tripledes_set3keys (struct _tripledes_ctx *ctx,
+                   const byte * key1,
+                   const byte * key2,
+                   const byte * key3)
+{
+  int i;
+
+  des_key_schedule (key1, ctx->encrypt_subkeys);
+  des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
+  des_key_schedule (key3, &(ctx->encrypt_subkeys[64]));
+  burn_stack (32);
+
+  for(i=0; i<32; i+=2)
+    {
+      ctx->decrypt_subkeys[i]   = ctx->encrypt_subkeys[94-i];
+      ctx->decrypt_subkeys[i+1]  = ctx->encrypt_subkeys[95-i];
+
+      ctx->encrypt_subkeys[i+32] = ctx->decrypt_subkeys[62-i];
+      ctx->encrypt_subkeys[i+33] = ctx->decrypt_subkeys[63-i];
+
+      ctx->decrypt_subkeys[i+64] = ctx->encrypt_subkeys[30-i];
+      ctx->decrypt_subkeys[i+65] = ctx->encrypt_subkeys[31-i];
+    }
+
+  return 0;
+}
+
+
+
+/*
+ * Electronic Codebook Mode Triple-DES encryption/decryption of data according to 'mode'.
+ * Sometimes this mode is named 'EDE' mode (Encryption-Decryption-Encryption).
+ */
+static int
+tripledes_ecb_crypt (struct _tripledes_ctx *ctx, const byte * from, byte * to, int mode)
+{
+  u32 left, right, work;
+  u32 *keys;
+
+  keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
+
+  READ_64BIT_DATA (from, left, right)
+  INITIAL_PERMUTATION (left, work, right)
+
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+  DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
+
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+  DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
+
+  FINAL_PERMUTATION (right, work, left)
+  WRITE_64BIT_DATA (to, right, left)
+
+  return 0;
+}
+
+
+
+
+
+/*
+ * Check whether the 8 byte key is weak.
+ * Dose not check the parity bits of the key but simple ignore them.
+ */
+static int
+is_weak_key ( const byte *key )
+{
+  byte work[8];
+  int i, left, right, middle, cmp_result;
+
+  /* clear parity bits */
+  for(i=0; i<8; ++i)
+     work[i] = key[i] & 0xfe;
+
+  /* binary search in the weak key table */
+  left = 0;
+  right = 63;
+  while(left <= right)
+    {
+      middle = (left + right) / 2;
+
+      if ( !(cmp_result=working_memcmp(work, weak_keys[middle], 8)) )
+         return -1;
+
+      if ( cmp_result > 0 )
+         left = middle + 1;
+      else
+         right = middle - 1;
+    }
+
+  return 0;
+}
+
+
+
+/*
+ * Performs a selftest of this DES/Triple-DES implementation.
+ * Returns an string with the error text on failure.
+ * Returns NULL if all is ok.
+ */
+static const char *
+selftest (void)
+{
+  /*
+   * Check if 'u32' is really 32 bits wide. This DES / 3DES implementation
+   * need this.
+   */
+  if (sizeof (u32) != 4)
+       return "Wrong word size for DES configured.";
+
+  /*
+   * DES Maintenance Test
+   */
+  {
+    int i;
+    byte key[8] =
+    {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
+    byte input[8] =
+    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+    byte result[8] =
+    {0x24, 0x6e, 0x9d, 0xb9, 0xc5, 0x50, 0x38, 0x1a};
+    byte temp1[8], temp2[8], temp3[8];
+    des_ctx des;
+
+    for (i = 0; i < 64; ++i)
+      {
+       des_setkey (des, key);
+       des_ecb_encrypt (des, input, temp1);
+       des_ecb_encrypt (des, temp1, temp2);
+       des_setkey (des, temp2);
+       des_ecb_decrypt (des, temp1, temp3);
+       memcpy (key, temp3, 8);
+       memcpy (input, temp1, 8);
+      }
+    if (memcmp (temp3, result, 8))
+      return "DES maintenance test failed.";
+  }
+
+
+  /*
+   * Self made Triple-DES test (Does somebody known an official test?)
+   */
+  {
+    int i;
+    byte input[8] =
+    {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
+    byte key1[8] =
+    {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};
+    byte key2[8] =
+    {0x11, 0x22, 0x33, 0x44, 0xff, 0xaa, 0xcc, 0xdd};
+    byte result[8] =
+    {0x7b, 0x38, 0x3b, 0x23, 0xa2, 0x7d, 0x26, 0xd3};
+
+    tripledes_ctx des3;
+
+    for (i = 0; i < 16; ++i)
+      {
+       tripledes_set2keys (des3, key1, key2);
+       tripledes_ecb_encrypt (des3, input, key1);
+       tripledes_ecb_decrypt (des3, input, key2);
+       tripledes_set3keys (des3, key1, input, key2);
+       tripledes_ecb_encrypt (des3, input, input);
+      }
+    if (memcmp (input, result, 8))
+      return "Triple-DES test failed.";
+  }
+
+    /*
+     * More Triple-DES test.  These are testvectors as used by SSLeay,
+     * thanks to Jeroen C. van Gelderen.
+     */
+    {  struct { byte key[24]; byte plain[8]; byte cipher[8]; } testdata[] = {
+       { { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01  },
+         { 0x95,0xF8,0xA5,0xE5,0xDD,0x31,0xD9,0x00  },
+         { 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00  }
+       },
+
+       { { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01  },
+         { 0x9D,0x64,0x55,0x5A,0x9A,0x10,0xB8,0x52, },
+         { 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00  }
+       },
+       { { 0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
+           0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
+           0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E  },
+         { 0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A  },
+         { 0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A  }
+       },
+       { { 0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
+           0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
+           0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6  },
+         { 0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2  },
+         { 0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95  }
+       },
+       { { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
+           0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
+           0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF  },
+         { 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61  },
+         { 0x3D,0x12,0x4F,0xE2,0x19,0x8B,0xA3,0x18  }
+       },
+       { { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
+           0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+           0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF  },
+         { 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61  },
+         { 0xFB,0xAB,0xA1,0xFF,0x9D,0x05,0xE9,0xB1  }
+       },
+       { { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
+           0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
+           0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10  },
+         { 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61  },
+         { 0x18,0xd7,0x48,0xe5,0x63,0x62,0x05,0x72  }
+       },
+       { { 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
+           0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
+           0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57  },
+         { 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65  },
+         { 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30  }
+       },
+       { { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+           0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02  },
+         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
+         { 0xe6,0xe6,0xdd,0x5b,0x7e,0x72,0x29,0x74  }
+       },
+       { { 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
+           0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
+           0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01  },
+         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
+         { 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b  }
+       }
+       };
+
+       byte            result[8];
+       int             i;
+       static char     error[80];
+       tripledes_ctx   des3;
+
+       for (i=0; i<sizeof(testdata)/sizeof(*testdata); ++i) {
+           tripledes_set3keys (des3, testdata[i].key, testdata[i].key + 8, testdata[i].key + 16);
+
+           tripledes_ecb_encrypt (des3, testdata[i].plain, result);
+           if (memcmp (testdata[i].cipher, result, 8)) {
+               sprintf (error, "Triple-DES SSLeay test pattern no. %d failend on encryption.", i+1);
+               return error;
+           }
+
+           tripledes_ecb_decrypt (des3, testdata[i].cipher, result);
+           if (memcmp (testdata[i].plain, result, 8)) {
+               sprintf (error, "Triple-DES SSLeay test pattern no. %d failend on decryption.", i+1);
+               return error;
+           }
+       }
+    }
+
+  /*
+   * Check the weak key detection. We simply assume that the table
+   * with weak keys is ok and check every key in the table if it is
+   * detected... (This test is a little bit stupid)
+   */
+  {
+    int i;
+
+    for (i = 0; i < 64; ++i)
+       if (!is_weak_key(weak_keys[i]))
+           return "DES weak key detection failed";
+  }
+
+  return 0;
+}
+
+
+static int
+do_tripledes_setkey ( void *ctx, const byte *key, unsigned keylen )
+{
+    if( selftest_failed )
+       return G10ERR_SELFTEST_FAILED;
+    if( keylen != 24 )
+       return G10ERR_WRONG_KEYLEN;
+
+    tripledes_set3keys ( ctx, key, key+8, key+16);
+
+    if( is_weak_key( key ) || is_weak_key( key+8 ) || is_weak_key( key+16 ) ) {
+        burn_stack (64);
+       return G10ERR_WEAK_KEY;
+    }
+    burn_stack (64); 
+
+    return 0;
+}
+
+
+static void
+do_tripledes_encrypt( void *ctx, byte *outbuf, const byte *inbuf )
+{
+    tripledes_ecb_encrypt ( ctx, inbuf, outbuf );
+    burn_stack (32);
+}
+
+static void
+do_tripledes_decrypt( void *ctx, byte *outbuf, const byte *inbuf )
+{
+    tripledes_ecb_decrypt ( ctx, inbuf, outbuf );
+    burn_stack (32);
+}
+
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+des_get_info( int algo, size_t *keylen,
+             size_t *blocksize, size_t *contextsize,
+             int (**r_setkey)( void *c, const byte *key, unsigned keylen ),
+             void (**r_encrypt)( void *c, byte *outbuf, const byte *inbuf ),
+             void (**r_decrypt)( void *c, byte *outbuf, const byte *inbuf )
+             )
+{
+    static int did_selftest = 0;
+
+    if( !did_selftest ) {
+       const char *s = selftest();
+       did_selftest = 1;
+       if( s ) {
+           fprintf(stderr,"%s\n", s );
+           selftest_failed = s;
+           return NULL;
+       }
+    }
+
+    if( algo == CIPHER_ALGO_3DES ) {
+       *keylen = 192;
+       *blocksize = 8;
+       *contextsize = sizeof(struct _tripledes_ctx);
+       *r_setkey = do_tripledes_setkey;
+       *r_encrypt = do_tripledes_encrypt;
+       *r_decrypt = do_tripledes_decrypt;
+       return "3DES";
+    }
+    return NULL;
+}
diff --git a/cipher/dsa.c b/cipher/dsa.c
new file mode 100644 (file)
index 0000000..9745656
--- /dev/null
@@ -0,0 +1,496 @@
+/* dsa.c  -  DSA signature algorithm
+ * Copyright (C) 1998, 1999, 2000, 2003, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "dsa.h"
+
+typedef struct {
+    MPI p;         /* prime */
+    MPI q;         /* group order */
+    MPI g;         /* group generator */
+    MPI y;         /* g^x mod p */
+} DSA_public_key;
+
+
+typedef struct {
+    MPI p;         /* prime */
+    MPI q;         /* group order */
+    MPI g;         /* group generator */
+    MPI y;         /* g^x mod p */
+    MPI x;         /* secret exponent */
+} DSA_secret_key;
+
+
+static MPI gen_k( MPI q );
+static void test_keys( DSA_secret_key *sk, unsigned qbits );
+static int  check_secret_key( DSA_secret_key *sk );
+static void generate( DSA_secret_key *sk, unsigned nbits, unsigned qbits,
+                     MPI **ret_factors );
+static void sign(MPI r, MPI s, MPI input, DSA_secret_key *skey);
+static int  verify(MPI r, MPI s, MPI input, DSA_public_key *pkey);
+
+
+static void (*progress_cb) ( void *, int );
+static void *progress_cb_data;
+
+void
+register_pk_dsa_progress ( void (*cb)( void *, int), void *cb_data )
+{
+    progress_cb = cb;
+    progress_cb_data = cb_data;
+}
+
+
+static void
+progress( int c )
+{
+    if ( progress_cb )
+       progress_cb ( progress_cb_data, c );
+    else
+       fputc( c, stderr );
+}
+
+
+
+/****************
+ * Generate a random secret exponent k less than q
+ */
+static MPI
+gen_k( MPI q )
+{
+    MPI k = mpi_alloc_secure( mpi_get_nlimbs(q) );
+    unsigned int nbits = mpi_get_nbits(q);
+    unsigned int nbytes = (nbits+7)/8;
+    char *rndbuf = NULL;
+
+    if( DBG_CIPHER )
+       log_debug("choosing a random k ");
+    for(;;) {
+       if( DBG_CIPHER )
+           progress('.');
+
+       if( !rndbuf || nbits < 32 ) {
+           xfree(rndbuf);
+           rndbuf = get_random_bits( nbits, 1, 1 );
+       }
+       else { /* change only some of the higher bits */
+           /* we could imporove this by directly requesting more memory
+            * at the first call to get_random_bits() and use this the here
+            * maybe it is easier to do this directly in random.c */
+           char *pp = get_random_bits( 32, 1, 1 );
+           memcpy( rndbuf,pp, 4 );
+           xfree(pp);
+       }
+       mpi_set_buffer( k, rndbuf, nbytes, 0 );
+       if( mpi_test_bit( k, nbits-1 ) )
+           mpi_set_highbit( k, nbits-1 );
+       else {
+           mpi_set_highbit( k, nbits-1 );
+           mpi_clear_bit( k, nbits-1 );
+       }
+
+       if( !(mpi_cmp( k, q ) < 0) ) {  /* check: k < q */
+           if( DBG_CIPHER )
+               progress('+');
+           continue; /* no  */
+       }
+       if( !(mpi_cmp_ui( k, 0 ) > 0) ) { /* check: k > 0 */
+           if( DBG_CIPHER )
+               progress('-');
+           continue; /* no */
+       }
+       break;  /* okay */
+    }
+    xfree(rndbuf);
+    if( DBG_CIPHER )
+       progress('\n');
+
+    return k;
+}
+
+
+static void
+test_keys( DSA_secret_key *sk, unsigned qbits )
+{
+    DSA_public_key pk;
+    MPI test = mpi_alloc( qbits / BITS_PER_MPI_LIMB );
+    MPI out1_a = mpi_alloc( qbits / BITS_PER_MPI_LIMB );
+    MPI out1_b = mpi_alloc( qbits / BITS_PER_MPI_LIMB );
+
+    pk.p = sk->p;
+    pk.q = sk->q;
+    pk.g = sk->g;
+    pk.y = sk->y;
+    /*mpi_set_bytes( test, qbits, get_random_byte, 0 );*/
+    {  char *p = get_random_bits( qbits, 0, 0 );
+       mpi_set_buffer( test, p, (qbits+7)/8, 0 );
+       xfree(p);
+    }
+
+    sign( out1_a, out1_b, test, sk );
+    if( !verify( out1_a, out1_b, test, &pk ) )
+       log_fatal("DSA:: sign, verify failed\n");
+
+    mpi_free( test );
+    mpi_free( out1_a );
+    mpi_free( out1_b );
+}
+
+
+
+/****************
+ * Generate a DSA key pair with a key of size NBITS
+ * Returns: 2 structures filled with all needed values
+ *         and an array with the n-1 factors of (p-1)
+ */
+static void
+generate( DSA_secret_key *sk, unsigned nbits, unsigned qbits,
+         MPI **ret_factors )
+{
+    MPI p;    /* the prime */
+    MPI q;    /* the prime factor */
+    MPI g;    /* the generator */
+    MPI y;    /* g^x mod p */
+    MPI x;    /* the secret exponent */
+    MPI h, e;  /* helper */
+    byte *rndbuf;
+
+    assert( nbits >= 512 );
+    assert( qbits >= 160 );
+    assert( qbits %8 == 0 );
+
+    p = generate_elg_prime( 1, nbits, qbits, NULL, ret_factors );
+    /* get q out of factors */
+    q = mpi_copy((*ret_factors)[0]);
+    if( mpi_get_nbits(q) != qbits )
+       BUG();
+
+    /* find a generator g (h and e are helpers)*/
+    /* e = (p-1)/q */
+    e = mpi_alloc( mpi_get_nlimbs(p) );
+    mpi_sub_ui( e, p, 1 );
+    mpi_fdiv_q( e, e, q );
+    g = mpi_alloc( mpi_get_nlimbs(p) );
+    h = mpi_alloc_set_ui( 1 ); /* we start with 2 */
+    do {
+       mpi_add_ui( h, h, 1 );
+       /* g = h^e mod p */
+       mpi_powm( g, h, e, p );
+    } while( !mpi_cmp_ui( g, 1 ) );  /* continue until g != 1 */
+
+    /* select a random number which has these properties:
+     *  0 < x < q-1
+     * This must be a very good random number because this
+     * is the secret part. */
+    if( DBG_CIPHER )
+       log_debug("choosing a random x ");
+    x = mpi_alloc_secure( mpi_get_nlimbs(q) );
+    mpi_sub_ui( h, q, 1 );  /* put q-1 into h */
+    rndbuf = NULL;
+    do {
+       if( DBG_CIPHER )
+           progress('.');
+       if( !rndbuf )
+           rndbuf = get_random_bits( qbits, 2, 1 );
+       else { /* change only some of the higher bits (= 2 bytes)*/
+           char *r = get_random_bits( 16, 2, 1 );
+           memcpy(rndbuf, r, 16/8 );
+           xfree(r);
+       }
+       mpi_set_buffer( x, rndbuf, (qbits+7)/8, 0 );
+       mpi_clear_highbit( x, qbits+1 );
+    } while( !( mpi_cmp_ui( x, 0 )>0 && mpi_cmp( x, h )<0 ) );
+    xfree(rndbuf);
+    mpi_free( e );
+    mpi_free( h );
+
+    /* y = g^x mod p */
+    y = mpi_alloc( mpi_get_nlimbs(p) );
+    mpi_powm( y, g, x, p );
+
+    if( DBG_CIPHER ) {
+       progress('\n');
+       log_mpidump("dsa  p= ", p );
+       log_mpidump("dsa  q= ", q );
+       log_mpidump("dsa  g= ", g );
+       log_mpidump("dsa  y= ", y );
+       log_mpidump("dsa  x= ", x );
+    }
+
+    /* copy the stuff to the key structures */
+    sk->p = p;
+    sk->q = q;
+    sk->g = g;
+    sk->y = y;
+    sk->x = x;
+
+    /* now we can test our keys (this should never fail!) */
+    test_keys( sk, qbits );
+}
+
+
+
+/****************
+ * Test whether the secret key is valid.
+ * Returns: if this is a valid key.
+ */
+static int
+check_secret_key( DSA_secret_key *sk )
+{
+    int rc;
+    MPI y = mpi_alloc( mpi_get_nlimbs(sk->y) );
+
+    mpi_powm( y, sk->g, sk->x, sk->p );
+    rc = !mpi_cmp( y, sk->y );
+    mpi_free( y );
+    return rc;
+}
+
+
+
+/****************
+ * Make a DSA signature from HASH and put it into r and s.
+ *
+ * Without generating the k this function runs in 
+ * about 26ms on a 300 Mhz Mobile Pentium
+ */
+
+static void
+sign(MPI r, MPI s, MPI hash, DSA_secret_key *skey )
+{
+    MPI k;
+    MPI kinv;
+    MPI tmp;
+
+    /* select a random k with 0 < k < q */
+    k = gen_k( skey->q );
+
+    /* r = (a^k mod p) mod q */
+    mpi_powm( r, skey->g, k, skey->p );
+    mpi_fdiv_r( r, r, skey->q );
+
+    /* kinv = k^(-1) mod q */
+    kinv = mpi_alloc( mpi_get_nlimbs(k) );
+    mpi_invm(kinv, k, skey->q );
+
+    /* s = (kinv * ( hash + x * r)) mod q */
+    tmp = mpi_alloc( mpi_get_nlimbs(skey->p) );
+    mpi_mul( tmp, skey->x, r );
+    mpi_add( tmp, tmp, hash );
+    mpi_mulm( s , kinv, tmp, skey->q );
+
+    mpi_free(k);
+    mpi_free(kinv);
+    mpi_free(tmp);
+}
+
+
+/****************
+ * Returns true if the signature composed from R and S is valid.
+ *
+ * Without the checks this function runs in 
+ * about 31ms on a 300 Mhz Mobile Pentium
+ */
+static int
+verify(MPI r, MPI s, MPI hash, DSA_public_key *pkey )
+{
+    int rc;
+    MPI w, u1, u2, v;
+    MPI base[3];
+    MPI exponent[3];
+
+
+    if( !(mpi_cmp_ui( r, 0 ) > 0 && mpi_cmp( r, pkey->q ) < 0) )
+       return 0; /* assertion  0 < r < q  failed */
+    if( !(mpi_cmp_ui( s, 0 ) > 0 && mpi_cmp( s, pkey->q ) < 0) )
+       return 0; /* assertion  0 < s < q  failed */
+
+    w  = mpi_alloc( mpi_get_nlimbs(pkey->q) );
+    u1 = mpi_alloc( mpi_get_nlimbs(pkey->q) );
+    u2 = mpi_alloc( mpi_get_nlimbs(pkey->q) );
+    v  = mpi_alloc( mpi_get_nlimbs(pkey->p) );
+
+    /* w = s^(-1) mod q */
+    mpi_invm( w, s, pkey->q );
+
+    /* u1 = (hash * w) mod q */
+    mpi_mulm( u1, hash, w, pkey->q );
+
+    /* u2 = r * w mod q  */
+    mpi_mulm( u2, r, w, pkey->q );
+
+    /* v =  g^u1 * y^u2 mod p mod q */
+    base[0] = pkey->g; exponent[0] = u1;
+    base[1] = pkey->y; exponent[1] = u2;
+    base[2] = NULL;    exponent[2] = NULL;
+    mpi_mulpowm( v, base, exponent, pkey->p );
+    mpi_fdiv_r( v, v, pkey->q );
+
+    rc = !mpi_cmp( v, r );
+
+    mpi_free(w);
+    mpi_free(u1);
+    mpi_free(u2);
+    mpi_free(v);
+    return rc;
+}
+
+
+/*********************************************
+ **************  interface  ******************
+ *********************************************/
+
+/* DSA2 has a variable-sized q, which adds an extra parameter to the
+   pubkey generation.  I'm doing this as a different function as it is
+   only called from one place and is thus cleaner than revamping the
+   pubkey_generate interface to carry an extra parameter which would
+   be meaningless for all algorithms other than DSA. */
+
+int
+dsa2_generate( int algo, unsigned nbits, unsigned qbits,
+              MPI *skey, MPI **retfactors )
+{
+    DSA_secret_key sk;
+
+    if( algo != PUBKEY_ALGO_DSA )
+       return G10ERR_PUBKEY_ALGO;
+
+    generate( &sk, nbits, qbits, retfactors );
+    skey[0] = sk.p;
+    skey[1] = sk.q;
+    skey[2] = sk.g;
+    skey[3] = sk.y;
+    skey[4] = sk.x;
+    return 0;
+}
+
+
+int
+dsa_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors )
+{
+  return dsa2_generate(algo,nbits,160,skey,retfactors);
+}
+
+
+int
+dsa_check_secret_key( int algo, MPI *skey )
+{
+    DSA_secret_key sk;
+
+    if( algo != PUBKEY_ALGO_DSA )
+       return G10ERR_PUBKEY_ALGO;
+    if( !skey[0] || !skey[1] || !skey[2] || !skey[3] || !skey[4] )
+       return G10ERR_BAD_MPI;
+
+    sk.p = skey[0];
+    sk.q = skey[1];
+    sk.g = skey[2];
+    sk.y = skey[3];
+    sk.x = skey[4];
+    if( !check_secret_key( &sk ) )
+       return G10ERR_BAD_SECKEY;
+
+    return 0;
+}
+
+
+
+int
+dsa_sign( int algo, MPI *resarr, MPI data, MPI *skey )
+{
+    DSA_secret_key sk;
+
+    if( algo != PUBKEY_ALGO_DSA )
+       return G10ERR_PUBKEY_ALGO;
+    if( !data || !skey[0] || !skey[1] || !skey[2] || !skey[3] || !skey[4] )
+       return G10ERR_BAD_MPI;
+
+    sk.p = skey[0];
+    sk.q = skey[1];
+    sk.g = skey[2];
+    sk.y = skey[3];
+    sk.x = skey[4];
+    resarr[0] = mpi_alloc( mpi_get_nlimbs( sk.p ) );
+    resarr[1] = mpi_alloc( mpi_get_nlimbs( sk.p ) );
+    sign( resarr[0], resarr[1], data, &sk );
+    return 0;
+}
+
+int
+dsa_verify( int algo, MPI hash, MPI *data, MPI *pkey )
+{
+    DSA_public_key pk;
+
+    if( algo != PUBKEY_ALGO_DSA )
+       return G10ERR_PUBKEY_ALGO;
+    if( !data[0] || !data[1] || !hash
+       || !pkey[0] || !pkey[1] || !pkey[2] || !pkey[3] )
+       return G10ERR_BAD_MPI;
+
+    pk.p = pkey[0];
+    pk.q = pkey[1];
+    pk.g = pkey[2];
+    pk.y = pkey[3];
+    if( !verify( data[0], data[1], hash, &pk ) )
+       return G10ERR_BAD_SIGN;
+    return 0;
+}
+
+
+
+unsigned
+dsa_get_nbits( int algo, MPI *pkey )
+{
+    if( algo != PUBKEY_ALGO_DSA )
+       return 0;
+    return mpi_get_nbits( pkey[0] );
+}
+
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ * Usage: Bit 0 set : allows signing
+ *           1 set : allows encryption
+ */
+const char *
+dsa_get_info( int algo, int *npkey, int *nskey, int *nenc, int *nsig,
+                                                        int *use )
+{
+    *npkey = 4;
+    *nskey = 5;
+    *nenc = 0;
+    *nsig = 2;
+
+    switch( algo ) {
+      case PUBKEY_ALGO_DSA:   *use = PUBKEY_USAGE_SIG; return "DSA";
+      default: *use = 0; return NULL;
+    }
+}
diff --git a/cipher/dsa.h b/cipher/dsa.h
new file mode 100644 (file)
index 0000000..6902b54
--- /dev/null
@@ -0,0 +1,33 @@
+/* dsa.h  -  DSA signature algorithm
+ *     Copyright (C) 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_DSA_H
+#define G10_DSA_H
+
+int dsa_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors );
+int dsa_check_secret_key( int algo, MPI *skey );
+int dsa_sign( int algo, MPI *resarr, MPI data, MPI *skey );
+int dsa_verify( int algo, MPI hash, MPI *data, MPI *pkey );
+unsigned dsa_get_nbits( int algo, MPI *pkey );
+const char *dsa_get_info( int algo, int *npkey, int *nskey,
+                                   int *nenc, int *nsig, int *use );
+
+#endif /*G10_DSA_H*/
diff --git a/cipher/dynload.c b/cipher/dynload.c
new file mode 100644 (file)
index 0000000..05d82f6
--- /dev/null
@@ -0,0 +1,104 @@
+/* dynload.c - load cipher extensions
+ *     Copyright (C) 1998, 1999, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include "util.h"
+#include "cipher.h"
+#include "algorithms.h"
+
+
+typedef struct ext_list {
+    struct ext_list *next;
+    char name[1];
+} *EXTLIST;
+
+static EXTLIST extensions;
+
+/* This is actually not used anymore but we keep a list of already 
+ * set extensions modules here.   
+ *
+ * Here is the ancient comment:
+ * Register an extension module.  The last registered module will
+ * be loaded first.  A name may have a list of classes
+ * appended; e.g:
+ *     mymodule.so(1:17,3:20,3:109)
+ * means that this module provides digest algorithm 17 and public key
+ * algorithms 20 and 109.  This is only a hint but if it is there the
+ * loader may decide to only load a module which claims to have a
+ * requested algorithm.
+ *
+ * mainpgm is the path to the program which wants to load a module
+ * it is only used in some environments.
+ */
+void
+register_cipher_extension( const char *mainpgm, const char *fname )
+{
+    EXTLIST r, el, intex;
+    char *p, *pe;
+
+    if( *fname != DIRSEP_C ) { /* do tilde expansion etc */
+       char *tmp;
+
+       if( strchr(fname, DIRSEP_C) )
+           tmp = make_filename(fname, NULL);
+       else
+           tmp = make_filename(GNUPG_LIBDIR, fname, NULL);
+       el = xmalloc_clear( sizeof *el + strlen(tmp) );
+       strcpy(el->name, tmp );
+       xfree(tmp);
+    }
+    else {
+       el = xmalloc_clear( sizeof *el + strlen(fname) );
+       strcpy(el->name, fname );
+    }
+    /* check whether we have a class hint */
+    if( (p=strchr(el->name,'(')) && (pe=strchr(p+1,')')) && !pe[1] )
+       *p = *pe = 0;
+
+    /* check that it is not already registered */
+    intex = NULL;
+    for(r = extensions; r; r = r->next ) {
+       if( !compare_filenames(r->name, el->name) ) {
+           log_info("extension `%s' already registered\n", el->name );
+           xfree(el);
+           return;
+       }
+    }
+    /* and register */
+    el->next = extensions;
+    extensions = el;
+}
+
+/* Return the module name with index SEQ, return NULL as as indication
+   for end of list. */
+const char *
+dynload_enum_module_names (int seq)
+{
+  EXTLIST el = extensions;
+
+  for (; el && el->name && seq; el = el->next, seq--)
+    ;
+  return el? el->name:NULL;
+}
diff --git a/cipher/elgamal.c b/cipher/elgamal.c
new file mode 100644 (file)
index 0000000..3c37a28
--- /dev/null
@@ -0,0 +1,510 @@
+/* elgamal.c  -  elgamal Public Key encryption
+ * Copyright (C) 1998, 2000, 2001, 2003,
+ *               2004 Free Software Foundation, Inc.
+ *
+ * For a description of the algorithm, see:
+ *   Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996.
+ *   ISBN 0-471-11709-9. Pages 476 ff.
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "util.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "elgamal.h"
+
+typedef struct {
+    MPI p;         /* prime */
+    MPI g;         /* group generator */
+    MPI y;         /* g^x mod p */
+} ELG_public_key;
+
+
+typedef struct {
+    MPI p;         /* prime */
+    MPI g;         /* group generator */
+    MPI y;         /* g^x mod p */
+    MPI x;         /* secret exponent */
+} ELG_secret_key;
+
+
+static void test_keys( ELG_secret_key *sk, unsigned nbits );
+static MPI gen_k( MPI p, int small_k );
+static void generate( ELG_secret_key *sk, unsigned nbits, MPI **factors );
+static int  check_secret_key( ELG_secret_key *sk );
+static void do_encrypt(MPI a, MPI b, MPI input, ELG_public_key *pkey );
+static void decrypt(MPI output, MPI a, MPI b, ELG_secret_key *skey );
+
+
+static void (*progress_cb) ( void *, int );
+static void *progress_cb_data;
+
+void
+register_pk_elg_progress ( void (*cb)( void *, int), void *cb_data )
+{
+    progress_cb = cb;
+    progress_cb_data = cb_data;
+}
+
+
+static void
+progress( int c )
+{
+    if ( progress_cb )
+       progress_cb ( progress_cb_data, c );
+    else
+       fputc( c, stderr );
+}
+
+
+/****************
+ * Michael Wiener's table about subgroup sizes to match field sizes
+ * (floating around somewhere - Fixme: need a reference)
+ */
+static unsigned int
+wiener_map( unsigned int n )
+{
+    static struct { unsigned int p_n, q_n; } t[] =
+    {  /*   p    q      attack cost */
+       {  512, 119 },  /* 9 x 10^17 */
+       {  768, 145 },  /* 6 x 10^21 */
+       { 1024, 165 },  /* 7 x 10^24 */
+       { 1280, 183 },  /* 3 x 10^27 */
+       { 1536, 198 },  /* 7 x 10^29 */
+       { 1792, 212 },  /* 9 x 10^31 */
+       { 2048, 225 },  /* 8 x 10^33 */
+       { 2304, 237 },  /* 5 x 10^35 */
+       { 2560, 249 },  /* 3 x 10^37 */
+       { 2816, 259 },  /* 1 x 10^39 */
+       { 3072, 269 },  /* 3 x 10^40 */
+       { 3328, 279 },  /* 8 x 10^41 */
+       { 3584, 288 },  /* 2 x 10^43 */
+       { 3840, 296 },  /* 4 x 10^44 */
+       { 4096, 305 },  /* 7 x 10^45 */
+       { 4352, 313 },  /* 1 x 10^47 */
+       { 4608, 320 },  /* 2 x 10^48 */
+       { 4864, 328 },  /* 2 x 10^49 */
+       { 5120, 335 },  /* 3 x 10^50 */
+       { 0, 0 }
+    };
+    int i;
+
+    for(i=0; t[i].p_n; i++ )  {
+       if( n <= t[i].p_n )
+           return t[i].q_n;
+    }
+    /* not in table - use some arbitrary high number ;-) */
+    return  n / 8 + 200;
+}
+
+static void
+test_keys( ELG_secret_key *sk, unsigned nbits )
+{
+    ELG_public_key pk;
+    MPI test = mpi_alloc( 0 );
+    MPI out1_a = mpi_alloc( nbits / BITS_PER_MPI_LIMB );
+    MPI out1_b = mpi_alloc( nbits / BITS_PER_MPI_LIMB );
+    MPI out2 = mpi_alloc( nbits / BITS_PER_MPI_LIMB );
+
+    pk.p = sk->p;
+    pk.g = sk->g;
+    pk.y = sk->y;
+
+    /*mpi_set_bytes( test, nbits, get_random_byte, 0 );*/
+    {  char *p = get_random_bits( nbits, 0, 0 );
+       mpi_set_buffer( test, p, (nbits+7)/8, 0 );
+       xfree(p);
+    }
+
+    do_encrypt( out1_a, out1_b, test, &pk );
+    decrypt( out2, out1_a, out1_b, sk );
+    if( mpi_cmp( test, out2 ) )
+       log_fatal("Elgamal operation: encrypt, decrypt failed\n");
+
+    mpi_free( test );
+    mpi_free( out1_a );
+    mpi_free( out1_b );
+    mpi_free( out2 );
+}
+
+
+/****************
+ * Generate a random secret exponent k from prime p, so that k is
+ * relatively prime to p-1.  With SMALL_K set, k will be selected for
+ * better encryption performance - this must never bee used signing!
+ */
+static MPI
+gen_k( MPI p, int small_k )
+{
+    MPI k = mpi_alloc_secure( 0 );
+    MPI temp = mpi_alloc( mpi_get_nlimbs(p) );
+    MPI p_1 = mpi_copy(p);
+    unsigned int orig_nbits = mpi_get_nbits(p);
+    unsigned int nbits;
+    unsigned int nbytes;
+    char *rndbuf = NULL;
+
+    if (small_k)
+      {
+        /* Using a k much lesser than p is sufficient for encryption and
+         * it greatly improves the encryption performance.  We use
+         * Wiener's table and add a large safety margin.
+         */
+        nbits = wiener_map( orig_nbits ) * 3 / 2;
+        if( nbits >= orig_nbits )
+          BUG();
+      }
+    else
+      nbits = orig_nbits;
+
+    nbytes = (nbits+7)/8;
+    if( DBG_CIPHER )
+       log_debug("choosing a random k of %u bits", nbits);
+    mpi_sub_ui( p_1, p, 1);
+    for(;;) {
+       if( !rndbuf || nbits < 32 ) {
+           xfree(rndbuf);
+           rndbuf = get_random_bits( nbits, 1, 1 );
+       }
+       else { /* Change only some of the higher bits. */
+           /* We could impprove this by directly requesting more memory
+            * at the first call to get_random_bits() and use this the here
+            * maybe it is easier to do this directly in random.c
+            * Anyway, it is highly inlikely that we will ever reach this code
+            */
+           char *pp = get_random_bits( 32, 1, 1 );
+           memcpy( rndbuf,pp, 4 );
+           xfree(pp);
+       }
+       mpi_set_buffer( k, rndbuf, nbytes, 0 );
+
+       for(;;) {
+           if( !(mpi_cmp( k, p_1 ) < 0) ) {  /* check: k < (p-1) */
+               if( DBG_CIPHER )
+                   progress('+');
+               break; /* no  */
+           }
+           if( !(mpi_cmp_ui( k, 0 ) > 0) ) { /* check: k > 0 */
+               if( DBG_CIPHER )
+                   progress('-');
+               break; /* no */
+           }
+           if( mpi_gcd( temp, k, p_1 ) )
+               goto found;  /* okay, k is relatively prime to (p-1) */
+           mpi_add_ui( k, k, 1 );
+           if( DBG_CIPHER )
+               progress('.');
+       }
+    }
+  found:
+    xfree(rndbuf);
+    if( DBG_CIPHER )
+       progress('\n');
+    mpi_free(p_1);
+    mpi_free(temp);
+
+    return k;
+}
+
+/****************
+ * Generate a key pair with a key of size NBITS
+ * Returns: 2 structures filles with all needed values
+ *         and an array with n-1 factors of (p-1)
+ */
+static void
+generate(  ELG_secret_key *sk, unsigned int nbits, MPI **ret_factors )
+{
+    MPI p;    /* the prime */
+    MPI p_min1;
+    MPI g;
+    MPI x;    /* the secret exponent */
+    MPI y;
+    MPI temp;
+    unsigned int qbits;
+    unsigned int xbits;
+    byte *rndbuf;
+
+    p_min1 = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    temp   = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    qbits = wiener_map( nbits );
+    if( qbits & 1 ) /* better have a even one */
+       qbits++;
+    g = mpi_alloc(1);
+    p = generate_elg_prime( 0, nbits, qbits, g, ret_factors );
+    mpi_sub_ui(p_min1, p, 1);
+
+
+    /* select a random number which has these properties:
+     *  0 < x < p-1
+     * This must be a very good random number because this is the
+     * secret part.  The prime is public and may be shared anyway,
+     * so a random generator level of 1 is used for the prime.
+     *
+     * I don't see a reason to have a x of about the same size as the
+     * p.  It should be sufficient to have one about the size of q or
+     * the later used k plus a large safety margin. Decryption will be
+     * much faster with such an x.  Note that this is not optimal for
+     * signing keys becuase it makes an attack using accidential small
+     * K values even easier.  Well, one should not use ElGamal signing
+     * anyway.
+     */
+    xbits = qbits * 3 / 2;
+    if( xbits >= nbits )
+       BUG();
+    x = mpi_alloc_secure( xbits/BITS_PER_MPI_LIMB );
+    if( DBG_CIPHER )
+       log_debug("choosing a random x of size %u", xbits );
+    rndbuf = NULL;
+    do {
+       if( DBG_CIPHER )
+           progress('.');
+       if( rndbuf ) { /* change only some of the higher bits */
+           if( xbits < 16 ) {/* should never happen ... */
+               xfree(rndbuf);
+               rndbuf = get_random_bits( xbits, 2, 1 );
+           }
+           else {
+               char *r = get_random_bits( 16, 2, 1 );
+               memcpy(rndbuf, r, 16/8 );
+               xfree(r);
+           }
+       }
+       else
+           rndbuf = get_random_bits( xbits, 2, 1 );
+       mpi_set_buffer( x, rndbuf, (xbits+7)/8, 0 );
+       mpi_clear_highbit( x, xbits+1 );
+    } while( !( mpi_cmp_ui( x, 0 )>0 && mpi_cmp( x, p_min1 )<0 ) );
+    xfree(rndbuf);
+
+    y = mpi_alloc(nbits/BITS_PER_MPI_LIMB);
+    mpi_powm( y, g, x, p );
+
+    if( DBG_CIPHER ) {
+       progress('\n');
+       log_mpidump("elg  p= ", p );
+       log_mpidump("elg  g= ", g );
+       log_mpidump("elg  y= ", y );
+       log_mpidump("elg  x= ", x );
+    }
+
+    /* copy the stuff to the key structures */
+    sk->p = p;
+    sk->g = g;
+    sk->y = y;
+    sk->x = x;
+
+    /* now we can test our keys (this should never fail!) */
+    test_keys( sk, nbits - 64 );
+
+    mpi_free( p_min1 );
+    mpi_free( temp   );
+}
+
+
+/****************
+ * Test whether the secret key is valid.
+ * Returns: if this is a valid key.
+ */
+static int
+check_secret_key( ELG_secret_key *sk )
+{
+    int rc;
+    MPI y = mpi_alloc( mpi_get_nlimbs(sk->y) );
+
+    mpi_powm( y, sk->g, sk->x, sk->p );
+    rc = !mpi_cmp( y, sk->y );
+    mpi_free( y );
+    return rc;
+}
+
+
+static void
+do_encrypt(MPI a, MPI b, MPI input, ELG_public_key *pkey )
+{
+    MPI k;
+
+    /* Note: maybe we should change the interface, so that it
+     * is possible to check that input is < p and return an
+     * error code.
+     */
+
+    k = gen_k( pkey->p, 1 );
+    mpi_powm( a, pkey->g, k, pkey->p );
+    /* b = (y^k * input) mod p
+     *  = ((y^k mod p) * (input mod p)) mod p
+     * and because input is < p
+     *  = ((y^k mod p) * input) mod p
+     */
+    mpi_powm( b, pkey->y, k, pkey->p );
+    mpi_mulm( b, b, input, pkey->p );
+#if 0
+    if( DBG_CIPHER ) {
+       log_mpidump("elg encrypted y= ", pkey->y);
+       log_mpidump("elg encrypted p= ", pkey->p);
+       log_mpidump("elg encrypted k= ", k);
+       log_mpidump("elg encrypted M= ", input);
+       log_mpidump("elg encrypted a= ", a);
+       log_mpidump("elg encrypted b= ", b);
+    }
+#endif
+    mpi_free(k);
+}
+
+
+static void
+decrypt(MPI output, MPI a, MPI b, ELG_secret_key *skey )
+{
+    MPI t1 = mpi_alloc_secure( mpi_get_nlimbs( skey->p ) );
+
+    /* output = b/(a^x) mod p */
+    mpi_powm( t1, a, skey->x, skey->p );
+    mpi_invm( t1, t1, skey->p );
+    mpi_mulm( output, b, t1, skey->p );
+#if 0
+    if( DBG_CIPHER ) {
+       log_mpidump("elg decrypted x= ", skey->x);
+       log_mpidump("elg decrypted p= ", skey->p);
+       log_mpidump("elg decrypted a= ", a);
+       log_mpidump("elg decrypted b= ", b);
+       log_mpidump("elg decrypted M= ", output);
+    }
+#endif
+    mpi_free(t1);
+}
+
+
+/*********************************************
+ **************  interface  ******************
+ *********************************************/
+
+int
+elg_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors )
+{
+    ELG_secret_key sk;
+
+    if( !is_ELGAMAL(algo) )
+       return G10ERR_PUBKEY_ALGO;
+
+    generate( &sk, nbits, retfactors );
+    skey[0] = sk.p;
+    skey[1] = sk.g;
+    skey[2] = sk.y;
+    skey[3] = sk.x;
+    return 0;
+}
+
+
+int
+elg_check_secret_key( int algo, MPI *skey )
+{
+    ELG_secret_key sk;
+
+    if( !is_ELGAMAL(algo) )
+       return G10ERR_PUBKEY_ALGO;
+    if( !skey[0] || !skey[1] || !skey[2] || !skey[3] )
+       return G10ERR_BAD_MPI;
+
+    sk.p = skey[0];
+    sk.g = skey[1];
+    sk.y = skey[2];
+    sk.x = skey[3];
+    if( !check_secret_key( &sk ) )
+       return G10ERR_BAD_SECKEY;
+
+    return 0;
+}
+
+
+int
+elg_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey )
+{
+    ELG_public_key pk;
+
+    if( !is_ELGAMAL(algo) )
+       return G10ERR_PUBKEY_ALGO;
+    if( !data || !pkey[0] || !pkey[1] || !pkey[2] )
+       return G10ERR_BAD_MPI;
+
+    pk.p = pkey[0];
+    pk.g = pkey[1];
+    pk.y = pkey[2];
+    resarr[0] = mpi_alloc( mpi_get_nlimbs( pk.p ) );
+    resarr[1] = mpi_alloc( mpi_get_nlimbs( pk.p ) );
+    do_encrypt( resarr[0], resarr[1], data, &pk );
+    return 0;
+}
+
+int
+elg_decrypt( int algo, MPI *result, MPI *data, MPI *skey )
+{
+    ELG_secret_key sk;
+
+    if( !is_ELGAMAL(algo) )
+       return G10ERR_PUBKEY_ALGO;
+    if( !data[0] || !data[1]
+       || !skey[0] || !skey[1] || !skey[2] || !skey[3] )
+       return G10ERR_BAD_MPI;
+
+    sk.p = skey[0];
+    sk.g = skey[1];
+    sk.y = skey[2];
+    sk.x = skey[3];
+    *result = mpi_alloc_secure( mpi_get_nlimbs( sk.p ) );
+    decrypt( *result, data[0], data[1], &sk );
+    return 0;
+}
+
+
+unsigned int
+elg_get_nbits( int algo, MPI *pkey )
+{
+    if( !is_ELGAMAL(algo) )
+       return 0;
+    return mpi_get_nbits( pkey[0] );
+}
+
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ * Usage: Bit 0 set : allows signing
+ *           1 set : allows encryption
+ */
+const char *
+elg_get_info( int algo, int *npkey, int *nskey, int *nenc, int *nsig,
+                                                        int *use )
+{
+    *npkey = 3;
+    *nskey = 4;
+    *nenc = 2;
+    *nsig = 2;
+
+    switch( algo ) {
+      case PUBKEY_ALGO_ELGAMAL_E:
+       *use = PUBKEY_USAGE_ENC;
+       return "ELG-E";
+      default: *use = 0; return NULL;
+    }
+}
diff --git a/cipher/elgamal.h b/cipher/elgamal.h
new file mode 100644 (file)
index 0000000..416f49c
--- /dev/null
@@ -0,0 +1,35 @@
+/* elgamal.h
+ *     Copyright (C) 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_ELGAMAL_H
+#define G10_ELGAMAL_H
+
+int elg_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors );
+int elg_check_secret_key( int algo, MPI *skey );
+int elg_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey );
+int elg_decrypt( int algo, MPI *result, MPI *data, MPI *skey );
+int elg_sign( int algo, MPI *resarr, MPI data, MPI *skey );
+int elg_verify( int algo, MPI hash, MPI *data, MPI *pkey );
+unsigned elg_get_nbits( int algo, MPI *pkey );
+const char *elg_get_info( int algo, int *npkey, int *nskey,
+                                   int *nenc, int *nsig, int *use );
+
+#endif /*G10_ELGAMAL_H*/
diff --git a/cipher/idea-stub.c b/cipher/idea-stub.c
new file mode 100644 (file)
index 0000000..55b5cb5
--- /dev/null
@@ -0,0 +1,182 @@
+/* idea-stub.c - Dummy module for the deprecated IDEA cipher.
+ * Copyright (C) 2002, 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* IDEA is a patented algorithm and therefore the use of IDEA in
+   countries where this patent is valid can not be allowed due to the
+   terms of the GNU General Public License.  Those restrictions are
+   there to help protecting the freedom of software.  For more
+   information on the nonsense of software patents and the general
+   problem with this, please see http://www.noepatents.org.
+
+   However for research purposes and in certain situations it might be
+   useful to use this algorithm anyway.  
+
+   We provide this stub which will dynload a idea module and is only 
+   used if the configure run did't found statically linked file.
+   See http://www.gnupg.org/why-not-dea.html for details.
+*/
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#ifdef HAVE_DL_DLOPEN
+#include <dlfcn.h>
+#endif
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#include "util.h"
+#include "algorithms.h"
+
+#ifndef RTLD_NOW
+#define RTLD_NOW  1
+#endif
+
+#ifdef _WIN32
+#define HAVE_DL_DLOPEN 1
+#define USE_DYNAMIC_LINKING 1
+
+static int last_error = 0;
+    
+void*
+dlopen (const char *pathname, int mode)
+{
+  void *h = LoadLibrary (pathname);
+  if (!h) 
+    {
+      log_error ("LoadLibrary failed: %s\n", w32_strerror (errno));
+      last_error = 1;
+      return NULL;
+    }
+  return h;
+}
+
+int
+dlclose ( void *handle )
+{
+  last_error = 0;
+  return FreeLibrary (handle);
+}
+
+
+const char*
+dlerror (void)
+{
+  if (last_error)
+    return w32_strerror (0);
+  return NULL;
+}
+
+void*
+dlsym (void *handle, const char *name)
+{
+  void *h = GetProcAddress (handle, name);
+  if (!h)
+    {
+      log_error ("GetProcAddress failed: %s\n", w32_strerror (errno));
+      last_error = 1;
+    }
+  return h;
+}
+#endif /*_WIN32*/
+
+/* We do only support dlopen and the Windows emulation of it. */
+#ifndef HAVE_DL_DLOPEN
+#undef USE_DYNAMIC_LINKING
+#endif
+
+typedef
+const char *(*INFO_FNC)(int, size_t*, size_t*, size_t*,
+                        int  (**)( void *, const byte *, unsigned),
+                        void (**)( void *, byte *, const byte *),
+                        void (**)( void *, byte *, const byte *));
+
+static INFO_FNC
+load_module (const char *name)
+{
+#ifdef USE_DYNAMIC_LINKING
+  const char *err;
+  void *handle;
+  void *sym;
+
+#ifndef _WIN32
+  /* Make sure we are not setuid. */
+  if (getuid() != geteuid())
+    log_bug("trying to load an extension while still setuid\n");
+#endif
+
+  handle = dlopen (name, RTLD_NOW);
+  if (!handle)
+    {
+      err=dlerror();
+      goto failure;
+    }
+
+  sym = dlsym (handle, "idea_get_info");
+  if (dlerror ())
+    sym = dlsym (handle, "_idea_get_info");
+  if ((err=dlerror())) 
+    goto failure;
+
+  return (INFO_FNC)sym;
+  
+ failure:
+  log_info ("invalid module `%s': %s\n", name?name:"???", err?err:"???");
+  if (handle)
+      dlclose (handle);
+#endif /*USE_DYNAMIC_LINKING*/
+  return NULL;
+}
+
+const char *
+idea_get_info( int algo, size_t *keylen,
+              size_t *blocksize, size_t *contextsize,
+              int (**r_setkey)( void *c, const byte *key, unsigned keylen ),
+              void (**r_encrypt)( void *c, byte *outbuf, const byte *inbuf ),
+              void (**r_decrypt)( void *c, byte *outbuf, const byte *inbuf )
+              )
+{
+  static int initialized;
+  static INFO_FNC info_fnc;
+  const char *rstr;
+  int i;
+
+  if (!initialized)
+    {
+      initialized = 1;
+      for (i=0; (rstr = dynload_enum_module_names (i)); i++)
+        {
+          info_fnc = load_module (rstr);
+          if (info_fnc)
+            break;
+        }
+    }
+  if (!info_fnc)
+    return NULL; /* dynloadable module not found. */
+  rstr = info_fnc (algo, keylen, blocksize, contextsize,
+                   r_setkey, r_encrypt, r_decrypt);
+  if (rstr && *keylen == 128 && *blocksize == 8
+      && *r_setkey && *r_encrypt && r_decrypt)
+    return rstr;
+  return NULL;
+}
diff --git a/cipher/md.c b/cipher/md.c
new file mode 100644 (file)
index 0000000..8faf208
--- /dev/null
@@ -0,0 +1,530 @@
+/* md.c  -  message digest dispatcher
+ * Copyright (C) 1998, 1999, 2002, 2003, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include "util.h"
+#include "cipher.h"
+#include "errors.h"
+#include "algorithms.h"
+#include "i18n.h"
+
+/****************
+ * This structure is used for the list of available algorithms
+ * and for the list of algorithms in MD_HANDLE.
+ */
+struct md_digest_list_s {
+    struct md_digest_list_s *next;
+    const char *name;
+    int algo;
+    byte *asnoid;
+    int asnlen;
+    int mdlen;
+    void (*init)( void *c );
+    void (*write)( void *c, byte *buf, size_t nbytes );
+    void (*final)( void *c );
+    byte *(*read)( void *c );
+    size_t contextsize; /* allocate this amount of context */
+    PROPERLY_ALIGNED_TYPE context;
+};
+
+static struct md_digest_list_s *digest_list;
+
+
+static struct md_digest_list_s *
+new_list_item (int algo,
+              const char *(*get_info)( int, size_t*,byte**, int*, int*,
+                                      void (**)(void*),
+                                      void (**)(void*,byte*,size_t),
+                                      void (**)(void*),byte *(**)(void*)))
+{
+  struct md_digest_list_s *r;
+
+  r = xmalloc_clear (sizeof *r );
+  r->algo = algo;
+  r->name = (*get_info)( algo, &r->contextsize,
+                         &r->asnoid, &r->asnlen, &r->mdlen,
+                         &r->init, &r->write, &r->final, &r->read );
+  if (!r->name ) 
+    {
+      xfree(r);
+      r = NULL;
+    }
+  if (r)
+    {
+      r->next = digest_list;
+      digest_list = r;
+    }
+  return r;
+}
+
+
+
+/*
+  Load all available hash algorithms and return true.  Subsequent
+  calls will return 0.  
+ */
+static int
+load_digest_module (void)
+{
+  static int initialized = 0;
+
+  if (initialized)
+    return 0;
+  initialized = 1;
+
+  /* We load them in reverse order so that the most
+     frequently used are the first in the list. */
+#ifdef USE_SHA512
+  if (!new_list_item (DIGEST_ALGO_SHA512, sha512_get_info)) 
+    BUG ();
+  if (!new_list_item (DIGEST_ALGO_SHA384, sha384_get_info)) 
+    BUG ();
+#endif
+#ifdef USE_SHA256
+  if (!new_list_item (DIGEST_ALGO_SHA256, sha256_get_info)) 
+    BUG ();
+  if (!new_list_item (DIGEST_ALGO_SHA224, sha224_get_info)) 
+    BUG ();
+#endif
+  if (!new_list_item (DIGEST_ALGO_MD5, md5_get_info)) 
+    BUG ();
+  if (!new_list_item (DIGEST_ALGO_RMD160, rmd160_get_info)) 
+    BUG ();
+  if (!new_list_item (DIGEST_ALGO_SHA1, sha1_get_info)) 
+    BUG ();
+
+  return 1;
+}      
+
+
+/****************
+ * Map a string to the digest algo */
+int
+string_to_digest_algo( const char *string )
+{
+    struct md_digest_list_s *r;
+
+    do {
+       for(r = digest_list; r; r = r->next )
+           if( !ascii_strcasecmp( r->name, string ) )
+               return r->algo;
+    } while( !r && load_digest_module () );
+
+    /* Didn't find it, so try the Hx format */
+    if(string[0]=='H' || string[0]=='h')
+      {
+       long val;
+       char *endptr;
+
+       string++;
+
+       val=strtol(string,&endptr,10);
+       if(*string!='\0' && *endptr=='\0' && check_digest_algo(val)==0)
+         return val;
+      }
+
+    return 0;
+}
+
+/****************
+ * Map a digest algo to a string
+ */
+const char *
+digest_algo_to_string( int algo )
+{
+    struct md_digest_list_s *r;
+
+    do {
+       for(r = digest_list; r; r = r->next )
+           if( r->algo == algo )
+               return r->name;
+    } while( !r && load_digest_module () );
+    return NULL;
+}
+
+
+int
+check_digest_algo( int algo )
+{
+    struct md_digest_list_s *r;
+
+    do {
+       for(r = digest_list; r; r = r->next )
+           if( r->algo == algo )
+               return 0;
+    } while( !r && load_digest_module () );
+    return G10ERR_DIGEST_ALGO;
+}
+
+
+
+/****************
+ * Open a message digest handle for use with algorithm ALGO.
+ * More algorithms may be added by md_enable(). The initial algorithm
+ * may be 0.
+ */
+MD_HANDLE
+md_open( int algo, int secure )
+{
+    MD_HANDLE hd;
+    int bufsize;
+
+    if( secure ) {
+       bufsize = 512 - sizeof( *hd );
+       hd = xmalloc_secure_clear( sizeof *hd + bufsize );
+    }
+    else {
+       bufsize = 1024 - sizeof( *hd );
+       hd = xmalloc_clear( sizeof *hd + bufsize );
+    }
+
+    hd->bufsize = bufsize+1; /* hd has already one byte allocated */
+    hd->secure = secure;
+    if( algo )
+       md_enable( hd, algo );
+    fast_random_poll();
+    return hd;
+}
+
+void
+md_enable( MD_HANDLE h, int algo )
+{
+    struct md_digest_list_s *r, *ac;
+
+    for( ac=h->list; ac; ac = ac->next )
+       if( ac->algo == algo )
+           return ; /* already enabled */
+    /* find the algorithm */
+    do {
+       for(r = digest_list; r; r = r->next )
+           if( r->algo == algo )
+               break;
+    } while( !r && load_digest_module () );
+    if( !r ) {
+       log_error("md_enable: algorithm %d not available\n", algo );
+       return;
+    }
+    /* and allocate a new list entry */
+    ac = h->secure? xmalloc_secure( sizeof *ac + r->contextsize
+                                              - sizeof(r->context) )
+                 : xmalloc( sizeof *ac + r->contextsize
+                                              - sizeof(r->context) );
+    *ac = *r;
+    ac->next = h->list;
+    h->list = ac;
+    /* and init this instance */
+    (*ac->init)( &ac->context.c );
+}
+
+
+MD_HANDLE
+md_copy( MD_HANDLE a )
+{
+    MD_HANDLE b;
+    struct md_digest_list_s *ar, *br;
+
+    if( a->bufcount )
+       md_write( a, NULL, 0 );
+    b = a->secure ? xmalloc_secure( sizeof *b + a->bufsize - 1 )
+                 : xmalloc( sizeof *b + a->bufsize - 1 );
+    memcpy( b, a, sizeof *a + a->bufsize - 1 );
+    b->list = NULL;
+    b->debug = NULL;
+    /* and now copy the complete list of algorithms */
+    /* I know that the copied list is reversed, but that doesn't matter */
+    for( ar=a->list; ar; ar = ar->next ) {
+       br = a->secure ? xmalloc_secure( sizeof *br + ar->contextsize
+                                              - sizeof(ar->context) )
+                      : xmalloc( sizeof *br + ar->contextsize
+                                              - sizeof(ar->context) );
+       memcpy( br, ar, sizeof(*br) + ar->contextsize
+                                   - sizeof(ar->context) );
+       br->next = b->list;
+       b->list = br;
+    }
+
+    if( a->debug )
+       md_start_debug( b, "unknown" );
+    return b;
+}
+
+
+/****************
+ * Reset all contexts and discard any buffered stuff.  This may be used
+ * instead of a md_close(); md_open().
+ */
+void
+md_reset( MD_HANDLE a )
+{
+    struct md_digest_list_s *r;
+
+    a->bufcount = a->finalized = 0;
+    for( r=a->list; r; r = r->next ) {
+       memset( r->context.c, 0, r->contextsize );
+       (*r->init)( &r->context.c );
+    }
+}
+
+
+void
+md_close(MD_HANDLE a)
+{
+    struct md_digest_list_s *r, *r2;
+
+    if( !a )
+       return;
+    if( a->debug )
+       md_stop_debug(a);
+    for(r=a->list; r; r = r2 ) {
+       r2 = r->next;
+       xfree(r);
+    }
+    xfree(a);
+}
+
+
+void
+md_write( MD_HANDLE a, const byte *inbuf, size_t inlen)
+{
+    struct md_digest_list_s *r;
+
+    if( a->debug ) {
+       if( a->bufcount && fwrite(a->buffer, a->bufcount, 1, a->debug ) != 1 )
+           BUG();
+       if( inlen && fwrite(inbuf, inlen, 1, a->debug ) != 1 )
+           BUG();
+    }
+    for(r=a->list; r; r = r->next ) {
+       (*r->write)( &r->context.c, a->buffer, a->bufcount );
+        /* Fixme: all ->write fnc should take a const byte* */ 
+       (*r->write)( &r->context.c, (byte*)inbuf, inlen );
+    }
+    a->bufcount = 0;
+}
+
+
+
+void
+md_final(MD_HANDLE a)
+{
+    struct md_digest_list_s *r;
+
+    if( a->finalized )
+       return;
+
+    if( a->bufcount )
+       md_write( a, NULL, 0 );
+
+    for(r=a->list; r; r = r->next ) {
+       (*r->final)( &r->context.c );
+    }
+    a->finalized = 1;
+}
+
+
+/****************
+ * if ALGO is null get the digest for the used algo (which should be only one)
+ */
+byte *
+md_read( MD_HANDLE a, int algo )
+{
+    struct md_digest_list_s *r;
+
+    if( !algo ) {  /* return the first algorithm */
+       if( (r=a->list) ) {
+           if( r->next )
+               log_debug("more than algorithm in md_read(0)\n");
+           return (*r->read)( &r->context.c );
+       }
+    }
+    else {
+       for(r=a->list; r; r = r->next )
+           if( r->algo == algo )
+               return (*r->read)( &r->context.c );
+    }
+    BUG();
+    return NULL;
+}
+
+
+/****************
+ * This function combines md_final and md_read but keeps the context
+ * intact.  This function can be used to calculate intermediate
+ * digests.  The digest is copied into buffer and the digestlength is
+ * returned.  If buffer is NULL only the needed size for buffer is returned.
+ * buflen gives the max size of buffer. If the buffer is too shourt to
+ * hold the complete digest, the buffer is filled with as many bytes are
+ * possible and this value is returned.
+ */
+int
+md_digest( MD_HANDLE a, int algo, byte *buffer, int buflen )
+{
+    struct md_digest_list_s *r = NULL;
+    char *context;
+    char *digest;
+
+    if( a->bufcount )
+       md_write( a, NULL, 0 );
+
+    if( !algo ) {  /* return digest for the first algorithm */
+       if( (r=a->list) && r->next )
+           log_debug("more than algorithm in md_digest(0)\n");
+    }
+    else {
+       for(r=a->list; r; r = r->next )
+           if( r->algo == algo )
+               break;
+    }
+    if( !r )
+       BUG();
+
+    if( !buffer )
+       return r->mdlen;
+
+    /* I don't want to change the interface, so I simply work on a copy
+     * the context (extra overhead - should be fixed)*/
+    context = a->secure ? xmalloc_secure( r->contextsize )
+                       : xmalloc( r->contextsize );
+    memcpy( context, r->context.c, r->contextsize );
+    (*r->final)( context );
+    digest = (*r->read)( context );
+
+    if( buflen > r->mdlen )
+       buflen = r->mdlen;
+    memcpy( buffer, digest, buflen );
+
+    xfree(context);
+    return buflen;
+}
+
+
+int
+md_get_algo( MD_HANDLE a )
+{
+    struct md_digest_list_s *r;
+
+    if( (r=a->list) ) {
+       if( r->next )
+           log_error("WARNING: more than algorithm in md_get_algo()\n");
+       return r->algo;
+    }
+    return 0;
+}
+
+/* Returns true if a given algo is in use in a md */
+int
+md_algo_present( MD_HANDLE a, int algo )
+{
+  struct md_digest_list_s *r=a->list;
+
+  while(r)
+    {
+      if(r->algo==algo)
+       return 1;
+
+      r=r->next;
+    }
+
+  return 0;
+}
+
+/****************
+ * Return the length of the digest
+ */
+int
+md_digest_length( int algo )
+{
+    struct md_digest_list_s *r;
+
+    do {
+       for(r = digest_list; r; r = r->next ) {
+           if( r->algo == algo )
+               return r->mdlen;
+       }
+    } while( !r && load_digest_module () );
+    log_error("WARNING: no length for md algo %d\n", algo);
+    return 0;
+}
+
+
+/* Hmmm: add a mode to enumerate the OIDs
+ *     to make g10/sig-check.c more portable */
+const byte *
+md_asn_oid( int algo, size_t *asnlen, size_t *mdlen )
+{
+    struct md_digest_list_s *r;
+
+    do {
+       for(r = digest_list; r; r = r->next ) {
+           if( r->algo == algo ) {
+               if( asnlen )
+                   *asnlen = r->asnlen;
+               if( mdlen )
+                   *mdlen = r->mdlen;
+               return r->asnoid;
+           }
+       }
+    } while( !r && load_digest_module () );
+    log_bug("no asn for md algo %d\n", algo);
+    return NULL;
+}
+
+
+void
+md_start_debug( MD_HANDLE md, const char *suffix )
+{
+    static int idx=0;
+    char buf[25];
+
+    if( md->debug ) {
+       log_debug("Oops: md debug already started\n");
+       return;
+    }
+    idx++;
+    sprintf(buf, "dbgmd-%05d" EXTSEP_S "%.10s", idx, suffix );
+    md->debug = fopen(buf, "wb");
+    if( !md->debug )
+       log_debug("md debug: can't open %s\n", buf );
+}
+
+void
+md_stop_debug( MD_HANDLE md )
+{
+    if( md->debug ) {
+       if( md->bufcount )
+           md_write( md, NULL, 0 );
+       fclose(md->debug);
+       md->debug = NULL;
+    }
+#ifdef HAVE_U64_TYPEDEF
+    {  /* a kludge to pull in the __muldi3 for Solaris */
+       volatile u32 a = (u32)(ulong)md;
+       volatile u64 b = 42;
+       volatile u64 c;
+       c = a * b;
+    }
+#endif
+}
diff --git a/cipher/md5.c b/cipher/md5.c
new file mode 100644 (file)
index 0000000..270e3fe
--- /dev/null
@@ -0,0 +1,366 @@
+/* md5.c - MD5 Message-Digest Algorithm
+ * Copyright (C) 1995, 1996, 1998, 1999,
+ *               2000, 2001 Free Software Foundation, Inc.
+ *
+ * This program 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 2, or (at your option) any
+ * later version.
+ *
+ * This program 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, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * According to the definition of MD5 in RFC 1321 from April 1992.
+ * NOTE: This is *not* the same file as the one from glibc.
+ */
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.  */
+/* Heavily modified for GnuPG by <wk@gnupg.org> */
+
+/* Test values:
+ * ""                  D4 1D 8C D9 8F 00 B2 04  E9 80 09 98 EC F8 42 7E
+ * "a"                 0C C1 75 B9 C0 F1 B6 A8  31 C3 99 E2 69 77 26 61
+ * "abc                90 01 50 98 3C D2 4F B0  D6 96 3F 7D 28 E1 7F 72
+ * "message digest"    F9 6B 69 7D 7C B7 93 8D  52 5A 2F 31 AA F1 61 D0
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "algorithms.h"
+
+#include "bithelp.h"
+
+
+typedef struct {
+    u32 A,B,C,D;         /* chaining variables */
+    u32  nblocks;
+    byte buf[64];
+    int  count;
+} MD5_CONTEXT;
+
+
+static void
+md5_init( MD5_CONTEXT *ctx )
+{
+    ctx->A = 0x67452301;
+    ctx->B = 0xefcdab89;
+    ctx->C = 0x98badcfe;
+    ctx->D = 0x10325476;
+
+    ctx->nblocks = 0;
+    ctx->count = 0;
+}
+
+
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+   and defined in the RFC 1321.  The first function is a little bit optimized
+   (as found in Colin Plumbs public domain implementation).  */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+static void
+burn_stack (int bytes)
+{
+    char buf[128];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+
+/****************
+ * transform n*64 bytes
+ */
+static void
+/*transform( MD5_CONTEXT *ctx, const void *buffer, size_t len )*/
+transform( MD5_CONTEXT *ctx, byte *data )
+{
+    u32 correct_words[16];
+    u32 A = ctx->A;
+    u32 B = ctx->B;
+    u32 C = ctx->C;
+    u32 D = ctx->D;
+    u32 *cwp = correct_words;
+
+#ifdef BIG_ENDIAN_HOST
+    { int i;
+      byte *p2, *p1;
+      for(i=0, p1=data, p2=(byte*)correct_words; i < 16; i++, p2 += 4 ) {
+       p2[3] = *p1++;
+       p2[2] = *p1++;
+       p2[1] = *p1++;
+       p2[0] = *p1++;
+      }
+    }
+#else
+    memcpy( correct_words, data, 64 );
+#endif
+
+
+#define OP(a, b, c, d, s, T)                                       \
+  do                                                               \
+    {                                                              \
+      a += FF (b, c, d) + (*cwp++) + T;            \
+      a = rol(a, s);                                               \
+      a += b;                                                      \
+    }                                                              \
+  while (0)
+
+    /* Before we start, one word about the strange constants.
+       They are defined in RFC 1321 as
+
+       T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+     */
+
+    /* Round 1.  */
+    OP (A, B, C, D,  7, 0xd76aa478);
+    OP (D, A, B, C, 12, 0xe8c7b756);
+    OP (C, D, A, B, 17, 0x242070db);
+    OP (B, C, D, A, 22, 0xc1bdceee);
+    OP (A, B, C, D,  7, 0xf57c0faf);
+    OP (D, A, B, C, 12, 0x4787c62a);
+    OP (C, D, A, B, 17, 0xa8304613);
+    OP (B, C, D, A, 22, 0xfd469501);
+    OP (A, B, C, D,  7, 0x698098d8);
+    OP (D, A, B, C, 12, 0x8b44f7af);
+    OP (C, D, A, B, 17, 0xffff5bb1);
+    OP (B, C, D, A, 22, 0x895cd7be);
+    OP (A, B, C, D,  7, 0x6b901122);
+    OP (D, A, B, C, 12, 0xfd987193);
+    OP (C, D, A, B, 17, 0xa679438e);
+    OP (B, C, D, A, 22, 0x49b40821);
+
+#undef OP
+#define OP(f, a, b, c, d, k, s, T)  \
+    do                                                               \
+      {                                                              \
+       a += f (b, c, d) + correct_words[k] + T;                      \
+       a = rol(a, s);                                                \
+       a += b;                                                       \
+      }                                                              \
+    while (0)
+
+    /* Round 2.  */
+    OP (FG, A, B, C, D,  1,  5, 0xf61e2562);
+    OP (FG, D, A, B, C,  6,  9, 0xc040b340);
+    OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+    OP (FG, B, C, D, A,  0, 20, 0xe9b6c7aa);
+    OP (FG, A, B, C, D,  5,  5, 0xd62f105d);
+    OP (FG, D, A, B, C, 10,  9, 0x02441453);
+    OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+    OP (FG, B, C, D, A,  4, 20, 0xe7d3fbc8);
+    OP (FG, A, B, C, D,  9,  5, 0x21e1cde6);
+    OP (FG, D, A, B, C, 14,  9, 0xc33707d6);
+    OP (FG, C, D, A, B,  3, 14, 0xf4d50d87);
+    OP (FG, B, C, D, A,  8, 20, 0x455a14ed);
+    OP (FG, A, B, C, D, 13,  5, 0xa9e3e905);
+    OP (FG, D, A, B, C,  2,  9, 0xfcefa3f8);
+    OP (FG, C, D, A, B,  7, 14, 0x676f02d9);
+    OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+    /* Round 3.  */
+    OP (FH, A, B, C, D,  5,  4, 0xfffa3942);
+    OP (FH, D, A, B, C,  8, 11, 0x8771f681);
+    OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+    OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+    OP (FH, A, B, C, D,  1,  4, 0xa4beea44);
+    OP (FH, D, A, B, C,  4, 11, 0x4bdecfa9);
+    OP (FH, C, D, A, B,  7, 16, 0xf6bb4b60);
+    OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+    OP (FH, A, B, C, D, 13,  4, 0x289b7ec6);
+    OP (FH, D, A, B, C,  0, 11, 0xeaa127fa);
+    OP (FH, C, D, A, B,  3, 16, 0xd4ef3085);
+    OP (FH, B, C, D, A,  6, 23, 0x04881d05);
+    OP (FH, A, B, C, D,  9,  4, 0xd9d4d039);
+    OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+    OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+    OP (FH, B, C, D, A,  2, 23, 0xc4ac5665);
+
+    /* Round 4.  */
+    OP (FI, A, B, C, D,  0,  6, 0xf4292244);
+    OP (FI, D, A, B, C,  7, 10, 0x432aff97);
+    OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+    OP (FI, B, C, D, A,  5, 21, 0xfc93a039);
+    OP (FI, A, B, C, D, 12,  6, 0x655b59c3);
+    OP (FI, D, A, B, C,  3, 10, 0x8f0ccc92);
+    OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+    OP (FI, B, C, D, A,  1, 21, 0x85845dd1);
+    OP (FI, A, B, C, D,  8,  6, 0x6fa87e4f);
+    OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+    OP (FI, C, D, A, B,  6, 15, 0xa3014314);
+    OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+    OP (FI, A, B, C, D,  4,  6, 0xf7537e82);
+    OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+    OP (FI, C, D, A, B,  2, 15, 0x2ad7d2bb);
+    OP (FI, B, C, D, A,  9, 21, 0xeb86d391);
+
+    /* Put checksum in context given as argument.  */
+    ctx->A += A;
+    ctx->B += B;
+    ctx->C += C;
+    ctx->D += D;
+}
+
+
+
+/* The routine updates the message-digest context to
+ * account for the presence of each of the characters inBuf[0..inLen-1]
+ * in the message whose digest is being computed.
+ */
+static void
+md5_write( MD5_CONTEXT *hd, byte *inbuf, size_t inlen)
+{
+    if( hd->count == 64 ) { /* flush the buffer */
+       transform( hd, hd->buf );
+        burn_stack (80+6*sizeof(void*));
+       hd->count = 0;
+       hd->nblocks++;
+    }
+    if( !inbuf )
+       return;
+    if( hd->count ) {
+       for( ; inlen && hd->count < 64; inlen-- )
+           hd->buf[hd->count++] = *inbuf++;
+       md5_write( hd, NULL, 0 );
+       if( !inlen )
+           return;
+    }
+
+    while( inlen >= 64 ) {
+       transform( hd, inbuf );
+       hd->count = 0;
+       hd->nblocks++;
+       inlen -= 64;
+       inbuf += 64;
+    }
+    burn_stack (80+6*sizeof(void*));
+    for( ; inlen && hd->count < 64; inlen-- )
+       hd->buf[hd->count++] = *inbuf++;
+}
+
+
+
+/* The routine final terminates the message-digest computation and
+ * ends with the desired message digest in mdContext->digest[0...15].
+ * The handle is prepared for a new MD5 cycle.
+ * Returns 16 bytes representing the digest.
+ */
+
+static void
+md5_final( MD5_CONTEXT *hd )
+{
+    u32 t, msb, lsb;
+    byte *p;
+
+    md5_write(hd, NULL, 0); /* flush */;
+
+    t = hd->nblocks;
+    /* multiply by 64 to make a byte count */
+    lsb = t << 6;
+    msb = t >> 26;
+    /* add the count */
+    t = lsb;
+    if( (lsb += hd->count) < t )
+       msb++;
+    /* multiply by 8 to make a bit count */
+    t = lsb;
+    lsb <<= 3;
+    msb <<= 3;
+    msb |= t >> 29;
+
+    if( hd->count < 56 ) { /* enough room */
+       hd->buf[hd->count++] = 0x80; /* pad */
+       while( hd->count < 56 )
+           hd->buf[hd->count++] = 0;  /* pad */
+    }
+    else { /* need one extra block */
+       hd->buf[hd->count++] = 0x80; /* pad character */
+       while( hd->count < 64 )
+           hd->buf[hd->count++] = 0;
+       md5_write(hd, NULL, 0);  /* flush */;
+       memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
+    }
+    /* append the 64 bit count */
+    hd->buf[56] = lsb     ;
+    hd->buf[57] = lsb >>  8;
+    hd->buf[58] = lsb >> 16;
+    hd->buf[59] = lsb >> 24;
+    hd->buf[60] = msb     ;
+    hd->buf[61] = msb >>  8;
+    hd->buf[62] = msb >> 16;
+    hd->buf[63] = msb >> 24;
+    transform( hd, hd->buf );
+    burn_stack (80+6*sizeof(void*));
+
+    p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *p++ = hd-> a      ; *p++ = hd-> a >> 8;      \
+                     *p++ = hd-> a >> 16; *p++ = hd-> a >> 24; } while(0)
+#else /* little endian */
+#define X(a) do { *(u32*)p = hd-> a ; p += 4; } while(0)
+#endif
+    X(A);
+    X(B);
+    X(C);
+    X(D);
+#undef X
+
+}
+
+static byte *
+md5_read( MD5_CONTEXT *hd )
+{
+    return hd->buf;
+}
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+md5_get_info( int algo, size_t *contextsize,
+              byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+              void (**r_init)( void *c ),
+              void (**r_write)( void *c, byte *buf, size_t nbytes ),
+              void (**r_final)( void *c ),
+              byte *(**r_read)( void *c )
+            )
+{
+    static byte asn[18] = /* Object ID is 1.2.840.113549.2.5 */
+                   { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86,0x48,
+                     0x86, 0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00, 0x04, 0x10 };
+
+    if( algo != 1 )
+       return NULL;
+
+    *contextsize = sizeof(MD5_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 16;
+    *(void  (**)(MD5_CONTEXT *))r_init                = md5_init;
+    *(void  (**)(MD5_CONTEXT *, byte*, size_t))r_write = md5_write;
+    *(void  (**)(MD5_CONTEXT *))r_final               = md5_final;
+    *(byte *(**)(MD5_CONTEXT *))r_read                = md5_read;
+
+    return "MD5";
+}
diff --git a/cipher/primegen.c b/cipher/primegen.c
new file mode 100644 (file)
index 0000000..0662d39
--- /dev/null
@@ -0,0 +1,594 @@
+/* primegen.c - prime number generator
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * ***********************************************************************
+ * The algorithm used to generate practically save primes is due to
+ * Lim and Lee as described in the CRYPTO '97 proceedings (ISBN3540633847)
+ * page 260.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "i18n.h"
+
+static int no_of_small_prime_numbers;
+static MPI gen_prime( unsigned nbits, int mode, int randomlevel );
+static int check_prime( MPI prime, MPI val_2 );
+static int is_prime( MPI n, int steps, int *count );
+static void m_out_of_n( char *array, int m, int n );
+
+static void (*progress_cb) ( void *, int );
+static void *progress_cb_data;
+
+void
+register_primegen_progress ( void (*cb)( void *, int), void *cb_data )
+{
+    progress_cb = cb;
+    progress_cb_data = cb_data;
+}
+
+
+static void
+progress( int c )
+{
+    if ( progress_cb )
+       progress_cb ( progress_cb_data, c );
+    else
+       fputc( c, stderr );
+}
+
+
+/****************
+ * Generate a prime number (stored in secure memory)
+ */
+MPI
+generate_secret_prime( unsigned  nbits )
+{
+    MPI prime;
+
+    prime = gen_prime( nbits, 1, 2 );
+    progress('\n');
+    return prime;
+}
+
+MPI
+generate_public_prime( unsigned  nbits )
+{
+    MPI prime;
+
+    prime = gen_prime( nbits, 0, 2 );
+    progress('\n');
+    return prime;
+}
+
+
+/****************
+ * We do not need to use the strongest RNG because we gain no extra
+ * security from it - The prime number is public and we could also
+ * offer the factors for those who are willing to check that it is
+ * indeed a strong prime.
+ *
+ * mode 0: Standard
+ *     1: Make sure that at least one factor is of size qbits.
+ */
+MPI
+generate_elg_prime( int mode, unsigned pbits, unsigned qbits,
+                   MPI g, MPI **ret_factors )
+{
+    int n;  /* number of factors */
+    int m;  /* number of primes in pool */
+    unsigned fbits; /* length of prime factors */
+    MPI *factors; /* current factors */
+    MPI *pool; /* pool of primes */
+    MPI q;     /* first prime factor (variable)*/
+    MPI prime; /* prime test value */
+    MPI q_factor; /* used for mode 1 */
+    byte *perms = NULL;
+    int i, j;
+    int count1, count2;
+    unsigned nprime;
+    unsigned req_qbits = qbits; /* the requested q bits size */
+    MPI val_2  = mpi_alloc_set_ui( 2 );
+
+    /* find number of needed prime factors */
+    for(n=1; (pbits - qbits - 1) / n  >= qbits; n++ )
+       ;
+    n--;
+    if( !n || (mode==1 && n < 2) )
+       log_fatal(_("can't gen prime with pbits=%u qbits=%u\n"),
+                  pbits, qbits );
+    if( mode == 1 ) {
+       n--;
+       fbits = (pbits - 2*req_qbits -1) / n;
+       qbits =  pbits - req_qbits - n*fbits;
+    }
+    else {
+       fbits = (pbits - req_qbits -1) / n;
+       qbits = pbits - n*fbits;
+    }
+    if( DBG_CIPHER )
+       log_debug("gen prime: pbits=%u qbits=%u fbits=%u/%u n=%d\n",
+                   pbits, req_qbits, qbits, fbits, n  );
+    prime = mpi_alloc( (pbits + BITS_PER_MPI_LIMB - 1) /  BITS_PER_MPI_LIMB );
+    q = gen_prime( qbits, 0, 0 );
+    q_factor = mode==1? gen_prime( req_qbits, 0, 0 ) : NULL;
+
+    /* allocate an array to hold the factors + 2 for later usage */
+    factors = xmalloc_clear( (n+2) * sizeof *factors );
+
+    /* make a pool of 3n+5 primes (this is an arbitrary value) */
+    m = n*3+5;
+    if( mode == 1 )
+       m += 5; /* need some more for DSA */
+    if( m < 25 )
+       m = 25;
+    pool = xmalloc_clear( m * sizeof *pool );
+
+    /* permutate over the pool of primes */
+    count1=count2=0;
+    do {
+      next_try:
+       if( !perms ) {
+           /* allocate new primes */
+           for(i=0; i < m; i++ ) {
+               mpi_free(pool[i]);
+               pool[i] = NULL;
+           }
+           /* init m_out_of_n() */
+           perms = xmalloc_clear( m );
+           for(i=0; i < n; i++ ) {
+               perms[i] = 1;
+               pool[i] = gen_prime( fbits, 0, 0 );
+               factors[i] = pool[i];
+           }
+       }
+       else {
+           m_out_of_n( perms, n, m );
+           for(i=j=0; i < m && j < n ; i++ )
+               if( perms[i] ) {
+                   if( !pool[i] )
+                       pool[i] = gen_prime( fbits, 0, 0 );
+                   factors[j++] = pool[i];
+               }
+           if( i == n ) {
+               xfree(perms); perms = NULL;
+               progress('!');
+               goto next_try;  /* allocate new primes */
+           }
+       }
+
+       mpi_set( prime, q );
+       mpi_mul_ui( prime, prime, 2 );
+       if( mode == 1 )
+           mpi_mul( prime, prime, q_factor );
+       for(i=0; i < n; i++ )
+           mpi_mul( prime, prime, factors[i] );
+       mpi_add_ui( prime, prime, 1 );
+       nprime = mpi_get_nbits(prime);
+       if( nprime < pbits ) {
+           if( ++count1 > 20 ) {
+               count1 = 0;
+               qbits++;
+               progress('>');
+                mpi_free (q);
+               q = gen_prime( qbits, 0, 0 );
+               goto next_try;
+           }
+       }
+       else
+           count1 = 0;
+       if( nprime > pbits ) {
+           if( ++count2 > 20 ) {
+               count2 = 0;
+               qbits--;
+               progress('<');
+                mpi_free (q);
+               q = gen_prime( qbits, 0, 0 );
+               goto next_try;
+           }
+       }
+       else
+           count2 = 0;
+    } while( !(nprime == pbits && check_prime( prime, val_2 )) );
+
+    if( DBG_CIPHER ) {
+       progress('\n');
+       log_mpidump( "prime    : ", prime );
+       log_mpidump( "factor  q: ", q );
+       if( mode == 1 )
+           log_mpidump( "factor q0: ", q_factor );
+       for(i=0; i < n; i++ )
+           log_mpidump( "factor pi: ", factors[i] );
+       log_debug("bit sizes: prime=%u, q=%u", mpi_get_nbits(prime), mpi_get_nbits(q) );
+       if( mode == 1 )
+           fprintf(stderr, ", q0=%u", mpi_get_nbits(q_factor) );
+       for(i=0; i < n; i++ )
+           fprintf(stderr, ", p%d=%u", i, mpi_get_nbits(factors[i]) );
+       progress('\n');
+    }
+
+    if( ret_factors ) { /* caller wants the factors */
+       *ret_factors = xmalloc_clear( (n+2) * sizeof **ret_factors);
+        i = 0;
+       if( mode == 1 ) {
+           (*ret_factors)[i++] = mpi_copy( q_factor );
+           for(; i <= n; i++ )
+               (*ret_factors)[i] = mpi_copy( factors[i-1] );
+       }
+       else {
+           for(; i < n; i++ )
+               (*ret_factors)[i] = mpi_copy( factors[i] );
+       }
+    }
+
+    if( g ) { /* create a generator (start with 3)*/
+       MPI tmp   = mpi_alloc( mpi_get_nlimbs(prime) );
+       MPI b     = mpi_alloc( mpi_get_nlimbs(prime) );
+       MPI pmin1 = mpi_alloc( mpi_get_nlimbs(prime) );
+
+       if( mode == 1 )
+           BUG(); /* not yet implemented */
+       factors[n] = q;
+       factors[n+1] = mpi_alloc_set_ui(2);
+       mpi_sub_ui( pmin1, prime, 1 );
+       mpi_set_ui(g,2);
+       do {
+           mpi_add_ui(g, g, 1);
+           if( DBG_CIPHER ) {
+               log_debug("checking g: ");
+               mpi_print( stderr, g, 1 );
+           }
+           else
+               progress('^');
+           for(i=0; i < n+2; i++ ) {
+               /*fputc('~', stderr);*/
+               mpi_fdiv_q(tmp, pmin1, factors[i] );
+               /* (no mpi_pow(), but it is okay to use this with mod prime) */
+               mpi_powm(b, g, tmp, prime );
+               if( !mpi_cmp_ui(b, 1) )
+                   break;
+           }
+           if( DBG_CIPHER )
+               progress('\n');
+       } while( i < n+2 );
+       mpi_free(factors[n+1]);
+       mpi_free(tmp);
+       mpi_free(b);
+       mpi_free(pmin1);
+    }
+    if( !DBG_CIPHER )
+       progress('\n');
+
+    xfree( factors );  /* (factors are shallow copies) */
+    for(i=0; i < m; i++ )
+       mpi_free( pool[i] );
+    xfree( pool );
+    xfree(perms);
+    mpi_free(val_2);
+    mpi_free(q);
+    return prime;
+}
+
+
+
+static MPI
+gen_prime( unsigned int nbits, int secret, int randomlevel )
+{
+    unsigned  nlimbs;
+    MPI prime, ptest, pminus1, val_2, val_3, result;
+    int i;
+    unsigned x, step;
+    int count1, count2;
+    int *mods;
+
+    if( 0 && DBG_CIPHER )
+       log_debug("generate a prime of %u bits ", nbits );
+
+    if (nbits < 16)
+      {
+        log_error (_("can't generate a prime with less than %d bits\n"), 16);
+        exit (2);
+      }
+
+    if( !no_of_small_prime_numbers ) {
+       for(i=0; small_prime_numbers[i]; i++ )
+           no_of_small_prime_numbers++;
+    }
+    mods = xmalloc( no_of_small_prime_numbers * sizeof *mods );
+    /* make nbits fit into MPI implementation */
+    nlimbs = (nbits + BITS_PER_MPI_LIMB - 1) / BITS_PER_MPI_LIMB;
+    val_2  = mpi_alloc_set_ui( 2 );
+    val_3 = mpi_alloc_set_ui( 3);
+    prime  = secret? mpi_alloc_secure( nlimbs ): mpi_alloc( nlimbs );
+    result = mpi_alloc_like( prime );
+    pminus1= mpi_alloc_like( prime );
+    ptest  = mpi_alloc_like( prime );
+    count1 = count2 = 0;
+    for(;;) {  /* try forvever */
+       int dotcount=0;
+
+       /* generate a random number */
+       {   char *p = get_random_bits( nbits, randomlevel, secret );
+           mpi_set_buffer( prime, p, (nbits+7)/8, 0 );
+           xfree(p);
+       }
+
+       /* Set high order bit to 1, set low order bit to 0.
+           If we are generating a secret prime we are most probably
+           doing that for RSA, to make sure that the modulus does have
+           the requested keysize we set the 2 high order bits */
+       mpi_set_highbit( prime, nbits-1 );
+        if (secret)
+          mpi_set_bit (prime, nbits-2);
+       mpi_set_bit( prime, 0 );
+
+       /* calculate all remainders */
+       for(i=0; (x = small_prime_numbers[i]); i++ )
+           mods[i] = mpi_fdiv_r_ui(NULL, prime, x);
+
+       /* now try some primes starting with prime */
+       for(step=0; step < 20000; step += 2 ) {
+           /* check against all the small primes we have in mods */
+           count1++;
+           for(i=0; (x = small_prime_numbers[i]); i++ ) {
+               while( mods[i] + step >= x )
+                   mods[i] -= x;
+               if( !(mods[i] + step) )
+                   break;
+           }
+           if( x )
+               continue;   /* found a multiple of an already known prime */
+
+           mpi_add_ui( ptest, prime, step );
+
+           /* do a faster Fermat test */
+           count2++;
+           mpi_sub_ui( pminus1, ptest, 1);
+           mpi_powm( result, val_2, pminus1, ptest );
+           if( !mpi_cmp_ui( result, 1 ) ) { /* not composite */
+               /* perform stronger tests */
+               if( is_prime(ptest, 5, &count2 ) ) {
+                   if( !mpi_test_bit( ptest, nbits-1 ) ) {
+                       progress('\n');
+                       log_debug("overflow in prime generation\n");
+                       break; /* step loop, continue with a new prime */
+                   }
+
+                   mpi_free(val_2);
+                   mpi_free(val_3);
+                   mpi_free(result);
+                   mpi_free(pminus1);
+                   mpi_free(prime);
+                   xfree(mods);
+                   return ptest;
+               }
+           }
+           if( ++dotcount == 10 ) {
+               progress('.');
+               dotcount = 0;
+           }
+       }
+       progress(':'); /* restart with a new random value */
+    }
+}
+
+/****************
+ * Returns: true if this may be a prime
+ */
+static int
+check_prime( MPI prime, MPI val_2 )
+{
+    int i;
+    unsigned x;
+    int count=0;
+
+    /* check against small primes */
+    for(i=0; (x = small_prime_numbers[i]); i++ ) {
+       if( mpi_divisible_ui( prime, x ) )
+           return 0;
+    }
+
+    /* a quick fermat test */
+    {
+       MPI result = mpi_alloc_like( prime );
+       MPI pminus1 = mpi_alloc_like( prime );
+       mpi_sub_ui( pminus1, prime, 1);
+       mpi_powm( result, val_2, pminus1, prime );
+       mpi_free( pminus1 );
+       if( mpi_cmp_ui( result, 1 ) ) { /* if composite */
+           mpi_free( result );
+           progress('.');
+           return 0;
+       }
+       mpi_free( result );
+    }
+
+    /* perform stronger tests */
+    if( is_prime(prime, 5, &count ) )
+       return 1; /* is probably a prime */
+    progress('.');
+    return 0;
+}
+
+
+/****************
+ * Return true if n is probably a prime
+ */
+static int
+is_prime( MPI n, int steps, int *count )
+{
+    MPI x = mpi_alloc( mpi_get_nlimbs( n ) );
+    MPI y = mpi_alloc( mpi_get_nlimbs( n ) );
+    MPI z = mpi_alloc( mpi_get_nlimbs( n ) );
+    MPI nminus1 = mpi_alloc( mpi_get_nlimbs( n ) );
+    MPI a2 = mpi_alloc_set_ui( 2 );
+    MPI q;
+    unsigned i, j, k;
+    int rc = 0;
+    unsigned nbits = mpi_get_nbits( n );
+
+    mpi_sub_ui( nminus1, n, 1 );
+
+    /* find q and k, so that n = 1 + 2^k * q */
+    q = mpi_copy( nminus1 );
+    k = mpi_trailing_zeros( q );
+    mpi_tdiv_q_2exp(q, q, k);
+
+    for(i=0 ; i < steps; i++ ) {
+       ++*count;
+       if( !i ) {
+           mpi_set_ui( x, 2 );
+       }
+       else {
+            char *p;
+            
+            p = get_random_bits( nbits, 0, 0 );
+            mpi_set_buffer( x, p, (nbits+7)/8, 0 );
+            xfree(p);
+
+           /* Make sure that the number is smaller than the prime
+            * and keep the randomness of the high bit.  */
+           if( mpi_test_bit( x, nbits-2 ) ) {
+               mpi_set_highbit( x, nbits-2 ); /* Clear all higher bits */
+           }
+           else {
+               mpi_set_highbit( x, nbits-2 );
+               mpi_clear_bit( x, nbits-2 );
+           }
+           assert( mpi_cmp( x, nminus1 ) < 0 && mpi_cmp_ui( x, 1 ) > 0 );
+       }
+       mpi_powm( y, x, q, n);
+       if( mpi_cmp_ui(y, 1) && mpi_cmp( y, nminus1 ) ) {
+           for( j=1; j < k && mpi_cmp( y, nminus1 ); j++ ) {
+               mpi_powm(y, y, a2, n);
+               if( !mpi_cmp_ui( y, 1 ) )
+                   goto leave; /* not a prime */
+           }
+           if( mpi_cmp( y, nminus1 ) )
+               goto leave; /* not a prime */
+       }
+       progress('+');
+    }
+    rc = 1; /* may be a prime */
+
+  leave:
+    mpi_free( x );
+    mpi_free( y );
+    mpi_free( z );
+    mpi_free( nminus1 );
+    mpi_free( q );
+    mpi_free (a2);
+
+    return rc;
+}
+
+
+static void
+m_out_of_n( char *array, int m, int n )
+{
+    int i=0, i1=0, j=0, jp=0,  j1=0, k1=0, k2=0;
+
+    if( !m || m >= n )
+       return;
+
+    if( m == 1 ) { /* special case */
+       for(i=0; i < n; i++ )
+           if( array[i] ) {
+               array[i++] = 0;
+               if( i >= n )
+                   i = 0;
+               array[i] = 1;
+               return;
+           }
+       BUG();
+    }
+
+    for(j=1; j < n; j++ ) {
+       if( array[n-1] == array[n-j-1] )
+           continue;
+       j1 = j;
+       break;
+    }
+
+    if( m & 1 ) { /* m is odd */
+       if( array[n-1] ) {
+           if( j1 & 1 ) {
+               k1 = n - j1;
+               k2 = k1+2;
+               if( k2 > n )
+                   k2 = n;
+               goto leave;
+           }
+           goto scan;
+       }
+       k2 = n - j1 - 1;
+       if( k2 == 0 ) {
+           k1 = i;
+           k2 = n - j1;
+       }
+       else if( array[k2] && array[k2-1] )
+           k1 = n;
+       else
+           k1 = k2 + 1;
+    }
+    else { /* m is even */
+       if( !array[n-1] ) {
+           k1 = n - j1;
+           k2 = k1 + 1;
+           goto leave;
+       }
+
+       if( !(j1 & 1) ) {
+           k1 = n - j1;
+           k2 = k1+2;
+           if( k2 > n )
+               k2 = n;
+           goto leave;
+       }
+      scan:
+       jp = n - j1 - 1;
+       for(i=1; i <= jp; i++ ) {
+           i1 = jp + 2 - i;
+           if( array[i1-1]  ) {
+               if( array[i1-2] ) {
+                   k1 = i1 - 1;
+                   k2 = n - j1;
+               }
+               else {
+                   k1 = i1 - 1;
+                   k2 = n + 1 - j1;
+               }
+               goto leave;
+           }
+       }
+       k1 = 1;
+       k2 = n + 1 - m;
+    }
+  leave:
+    array[k1-1] = !array[k1-1];
+    array[k2-1] = !array[k2-1];
+}
+
diff --git a/cipher/pubkey.c b/cipher/pubkey.c
new file mode 100644 (file)
index 0000000..d6d1ff1
--- /dev/null
@@ -0,0 +1,577 @@
+/* pubkey.c  - pubkey dispatcher
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include "util.h"
+#include "errors.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "elgamal.h"
+#include "dsa.h"
+#include "rsa.h"
+
+#define TABLE_SIZE 10
+
+struct pubkey_table_s {
+    const char *name;
+    int algo;
+    int npkey;
+    int nskey;
+    int nenc;
+    int nsig;
+    int use;
+    int (*generate)( int algo, unsigned nbits, MPI *skey, MPI **retfactors );
+    int (*check_secret_key)( int algo, MPI *skey );
+    int (*encrypt)( int algo, MPI *resarr, MPI data, MPI *pkey );
+    int (*decrypt)( int algo, MPI *result, MPI *data, MPI *skey );
+    int (*sign)( int algo, MPI *resarr, MPI data, MPI *skey );
+    int (*verify)( int algo, MPI hash, MPI *data, MPI *pkey );
+    unsigned (*get_nbits)( int algo, MPI *pkey );
+};
+
+static struct pubkey_table_s pubkey_table[TABLE_SIZE];
+static int disabled_algos[TABLE_SIZE];
+
+
+#if 0
+static int
+dummy_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors )
+{ log_bug("no generate() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
+
+static int
+dummy_check_secret_key( int algo, MPI *skey )
+{ log_bug("no check_secret_key() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
+#endif
+
+static int
+dummy_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey )
+{ log_bug("no encrypt() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
+
+static int
+dummy_decrypt( int algo, MPI *result, MPI *data, MPI *skey )
+{ log_bug("no decrypt() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
+
+static int
+dummy_sign( int algo, MPI *resarr, MPI data, MPI *skey )
+{ log_bug("no sign() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
+
+static int
+dummy_verify( int algo, MPI hash, MPI *data, MPI *pkey )
+{ log_bug("no verify() for %d\n", algo ); return G10ERR_PUBKEY_ALGO; }
+
+#if 0
+static unsigned
+dummy_get_nbits( int algo, MPI *pkey )
+{ log_bug("no get_nbits() for %d\n", algo ); return 0; }
+#endif
+
+/****************
+ * Put the static entries into the table.
+ * This is out constructor function which fill the table
+ * of algorithms with the one we have statically linked.
+ */
+static void
+setup_pubkey_table(void)
+{
+    int i=0;
+
+    pubkey_table[i].algo = PUBKEY_ALGO_ELGAMAL_E;
+    pubkey_table[i].name = elg_get_info( pubkey_table[i].algo,
+                                        &pubkey_table[i].npkey,
+                                        &pubkey_table[i].nskey,
+                                        &pubkey_table[i].nenc,
+                                        &pubkey_table[i].nsig,
+                                        &pubkey_table[i].use );
+    pubkey_table[i].generate        = elg_generate;
+    pubkey_table[i].check_secret_key = elg_check_secret_key;
+    pubkey_table[i].encrypt         = elg_encrypt;
+    pubkey_table[i].decrypt         = elg_decrypt;
+    pubkey_table[i].sign            = dummy_sign;
+    pubkey_table[i].verify          = dummy_verify;
+    pubkey_table[i].get_nbits       = elg_get_nbits;
+    if( !pubkey_table[i].name )
+       BUG();
+    i++;
+    pubkey_table[i].algo = PUBKEY_ALGO_DSA;
+    pubkey_table[i].name = dsa_get_info( pubkey_table[i].algo,
+                                        &pubkey_table[i].npkey,
+                                        &pubkey_table[i].nskey,
+                                        &pubkey_table[i].nenc,
+                                        &pubkey_table[i].nsig,
+                                        &pubkey_table[i].use );
+    pubkey_table[i].generate        = dsa_generate;
+    pubkey_table[i].check_secret_key = dsa_check_secret_key;
+    pubkey_table[i].encrypt         = dummy_encrypt;
+    pubkey_table[i].decrypt         = dummy_decrypt;
+    pubkey_table[i].sign            = dsa_sign;
+    pubkey_table[i].verify          = dsa_verify;
+    pubkey_table[i].get_nbits       = dsa_get_nbits;
+    if( !pubkey_table[i].name )
+       BUG();
+    i++;
+
+#ifdef USE_RSA
+    pubkey_table[i].algo = PUBKEY_ALGO_RSA;
+    pubkey_table[i].name = rsa_get_info( pubkey_table[i].algo,
+                                        &pubkey_table[i].npkey,
+                                        &pubkey_table[i].nskey,
+                                        &pubkey_table[i].nenc,
+                                        &pubkey_table[i].nsig,
+                                        &pubkey_table[i].use );
+    pubkey_table[i].generate        = rsa_generate;
+    pubkey_table[i].check_secret_key = rsa_check_secret_key;
+    pubkey_table[i].encrypt         = rsa_encrypt;
+    pubkey_table[i].decrypt         = rsa_decrypt;
+    pubkey_table[i].sign            = rsa_sign;
+    pubkey_table[i].verify          = rsa_verify;
+    pubkey_table[i].get_nbits       = rsa_get_nbits;
+    if( !pubkey_table[i].name )
+       BUG();
+    i++;
+    pubkey_table[i].algo = PUBKEY_ALGO_RSA_E;
+    pubkey_table[i].name = rsa_get_info( pubkey_table[i].algo,
+                                        &pubkey_table[i].npkey,
+                                        &pubkey_table[i].nskey,
+                                        &pubkey_table[i].nenc,
+                                        &pubkey_table[i].nsig,
+                                        &pubkey_table[i].use );
+    pubkey_table[i].generate        = rsa_generate;
+    pubkey_table[i].check_secret_key = rsa_check_secret_key;
+    pubkey_table[i].encrypt         = rsa_encrypt;
+    pubkey_table[i].decrypt         = rsa_decrypt;
+    pubkey_table[i].sign            = dummy_sign;
+    pubkey_table[i].verify          = dummy_verify;
+    pubkey_table[i].get_nbits       = rsa_get_nbits;
+    if( !pubkey_table[i].name )
+       BUG();
+    i++;
+    pubkey_table[i].algo = PUBKEY_ALGO_RSA_S;
+    pubkey_table[i].name = rsa_get_info( pubkey_table[i].algo,
+                                        &pubkey_table[i].npkey,
+                                        &pubkey_table[i].nskey,
+                                        &pubkey_table[i].nenc,
+                                        &pubkey_table[i].nsig,
+                                        &pubkey_table[i].use );
+    pubkey_table[i].generate        = rsa_generate;
+    pubkey_table[i].check_secret_key = rsa_check_secret_key;
+    pubkey_table[i].encrypt         = dummy_encrypt;
+    pubkey_table[i].decrypt         = dummy_decrypt;
+    pubkey_table[i].sign            = rsa_sign;
+    pubkey_table[i].verify          = rsa_verify;
+    pubkey_table[i].get_nbits       = rsa_get_nbits;
+    if( !pubkey_table[i].name )
+       BUG();
+    i++;
+#endif /* USE_RSA */
+
+    for( ; i < TABLE_SIZE; i++ )
+       pubkey_table[i].name = NULL;
+}
+
+
+/****************
+ * Try to load all modules and return true if new modules are available
+ */
+static int
+load_pubkey_modules(void)
+{
+    static int initialized = 0;
+
+    if( !initialized ) {
+       setup_pubkey_table();
+       initialized = 1;
+       return 1;
+    }
+    return 0;
+}
+
+
+/****************
+ * Map a string to the pubkey algo
+ */
+int
+string_to_pubkey_algo( const char *string )
+{
+    int i;
+    const char *s;
+
+    do {
+       for(i=0; (s=pubkey_table[i].name); i++ )
+           if( !ascii_strcasecmp( s, string ) )
+               return pubkey_table[i].algo;
+    } while( load_pubkey_modules() );
+    return 0;
+}
+
+
+/****************
+ * Map a pubkey algo to a string
+ */
+const char *
+pubkey_algo_to_string( int algo )
+{
+    int i;
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return pubkey_table[i].name;
+    } while( load_pubkey_modules() );
+    return NULL;
+}
+
+
+void
+disable_pubkey_algo( int algo )
+{
+    int i;
+
+    for(i=0; i < DIM(disabled_algos); i++ ) {
+       if( !disabled_algos[i] || disabled_algos[i] == algo ) {
+           disabled_algos[i] = algo;
+           return;
+       }
+    }
+    log_fatal("can't disable pubkey algo %d: table full\n", algo );
+}
+
+
+int
+check_pubkey_algo( int algo )
+{
+    return check_pubkey_algo2( algo, 0 );
+}
+
+/****************
+ * a use of 0 means: don't care
+ */
+int
+check_pubkey_algo2( int algo, unsigned use )
+{
+    int i;
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo ) {
+               if( (use & PUBKEY_USAGE_SIG)
+                   && !(pubkey_table[i].use & PUBKEY_USAGE_SIG) )
+                   return G10ERR_WR_PUBKEY_ALGO;
+               if( (use & PUBKEY_USAGE_ENC)
+                   && !(pubkey_table[i].use & PUBKEY_USAGE_ENC) )
+                   return G10ERR_WR_PUBKEY_ALGO;
+
+               for(i=0; i < DIM(disabled_algos); i++ ) {
+                   if( disabled_algos[i] == algo )
+                       return G10ERR_PUBKEY_ALGO;
+               }
+               return 0; /* okay */
+           }
+    } while( load_pubkey_modules() );
+    return G10ERR_PUBKEY_ALGO;
+}
+
+
+
+
+/****************
+ * Return the number of public key material numbers
+ */
+int
+pubkey_get_npkey( int algo )
+{
+    int i;
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return pubkey_table[i].npkey;
+    } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
+    if( is_RSA(algo) )   /* special hack, so that we are able to */
+       return 2;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 3;
+
+    return 0;
+}
+
+/****************
+ * Return the number of secret key material numbers
+ */
+int
+pubkey_get_nskey( int algo )
+{
+    int i;
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return pubkey_table[i].nskey;
+    } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
+    if( is_RSA(algo) )   /* special hack, so that we are able to */
+       return 6;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 4;
+
+    return 0;
+}
+
+/****************
+ * Return the number of signature material numbers
+ */
+int
+pubkey_get_nsig( int algo )
+{
+    int i;
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return pubkey_table[i].nsig;
+    } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
+    if( is_RSA(algo) )   /* special hack, so that we are able to */
+       return 1;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 2;
+
+    return 0;
+}
+
+/****************
+ * Return the number of encryption material numbers
+ */
+int
+pubkey_get_nenc( int algo )
+{
+    int i;
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return pubkey_table[i].nenc;
+    } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
+    if( is_RSA(algo) )   /* special hack, so that we are able to */
+       return 1;         /* see the RSA keyids */
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return 2;
+
+    return 0;
+}
+
+/****************
+ * Get the number of nbits from the public key
+ */
+unsigned
+pubkey_nbits( int algo, MPI *pkey )
+{
+    int i;
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return (*pubkey_table[i].get_nbits)( algo, pkey );
+    } while( load_pubkey_modules() );
+
+#ifndef USE_RSA
+    if( is_RSA(algo) ) /* we always wanna see the length of a key :-) */
+       return mpi_get_nbits( pkey[0] );
+#endif /* USE_RSA */
+
+    if(algo==PUBKEY_ALGO_ELGAMAL)
+      return mpi_get_nbits(pkey[0]);
+
+    return 0;
+}
+
+
+int
+pubkey_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors )
+{
+    int i;
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return (*pubkey_table[i].generate)( algo, nbits,
+                                                   skey, retfactors );
+    } while( load_pubkey_modules() );
+    return G10ERR_PUBKEY_ALGO;
+}
+
+
+int
+pubkey_check_secret_key( int algo, MPI *skey )
+{
+    int i;
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo )
+               return (*pubkey_table[i].check_secret_key)( algo, skey );
+    } while( load_pubkey_modules() );
+    return G10ERR_PUBKEY_ALGO;
+}
+
+
+/****************
+ * This is the interface to the public key encryption.
+ * Encrypt DATA with PKEY and put it into RESARR which
+ * should be an array of MPIs of size PUBKEY_MAX_NENC (or less if the
+ * algorithm allows this - check with pubkey_get_nenc() )
+ */
+int
+pubkey_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey )
+{
+    int i, rc;
+
+    if( DBG_CIPHER ) {
+       log_debug("pubkey_encrypt: algo=%d\n", algo );
+       for(i=0; i < pubkey_get_npkey(algo); i++ )
+           log_mpidump("  pkey:", pkey[i] );
+       log_mpidump("  data:", data );
+    }
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo ) {
+               rc = (*pubkey_table[i].encrypt)( algo, resarr, data, pkey );
+               goto ready;
+           }
+    } while( load_pubkey_modules() );
+    rc = G10ERR_PUBKEY_ALGO;
+  ready:
+    if( !rc && DBG_CIPHER ) {
+       for(i=0; i < pubkey_get_nenc(algo); i++ )
+           log_mpidump("  encr:", resarr[i] );
+    }
+    return rc;
+}
+
+
+
+/****************
+ * This is the interface to the public key decryption.
+ * ALGO gives the algorithm to use and this implicitly determines
+ * the size of the arrays.
+ * result is a pointer to a mpi variable which will receive a
+ * newly allocated mpi or NULL in case of an error.
+ */
+int
+pubkey_decrypt( int algo, MPI *result, MPI *data, MPI *skey )
+{
+    int i, rc;
+
+    *result = NULL; /* so the caller can always do an mpi_free */
+    if( DBG_CIPHER ) {
+       log_debug("pubkey_decrypt: algo=%d\n", algo );
+       for(i=0; i < pubkey_get_nskey(algo); i++ )
+           log_mpidump("  skey:", skey[i] );
+       for(i=0; i < pubkey_get_nenc(algo); i++ )
+           log_mpidump("  data:", data[i] );
+    }
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo ) {
+               rc = (*pubkey_table[i].decrypt)( algo, result, data, skey );
+               goto ready;
+           }
+    } while( load_pubkey_modules() );
+    rc = G10ERR_PUBKEY_ALGO;
+  ready:
+    if( !rc && DBG_CIPHER ) {
+       log_mpidump(" plain:", *result );
+    }
+    return rc;
+}
+
+
+/****************
+ * This is the interface to the public key signing.
+ * Sign data with skey and put the result into resarr which
+ * should be an array of MPIs of size PUBKEY_MAX_NSIG (or less if the
+ * algorithm allows this - check with pubkey_get_nsig() )
+ */
+int
+pubkey_sign( int algo, MPI *resarr, MPI data, MPI *skey )
+{
+    int i, rc;
+
+    if( DBG_CIPHER ) {
+       log_debug("pubkey_sign: algo=%d\n", algo );
+       for(i=0; i < pubkey_get_nskey(algo); i++ )
+           log_mpidump("  skey:", skey[i] );
+       log_mpidump("  data:", data );
+    }
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo ) {
+               rc = (*pubkey_table[i].sign)( algo, resarr, data, skey );
+               goto ready;
+           }
+    } while( load_pubkey_modules() );
+    rc = G10ERR_PUBKEY_ALGO;
+  ready:
+    if( !rc && DBG_CIPHER ) {
+       for(i=0; i < pubkey_get_nsig(algo); i++ )
+           log_mpidump("   sig:", resarr[i] );
+    }
+    return rc;
+}
+
+/****************
+ * Verify a public key signature.
+ * Return 0 if the signature is good
+ */
+int
+pubkey_verify( int algo, MPI hash, MPI *data, MPI *pkey )
+{
+    int i, rc;
+
+    do {
+       for(i=0; pubkey_table[i].name; i++ )
+           if( pubkey_table[i].algo == algo ) {
+               rc = (*pubkey_table[i].verify)( algo, hash, data, pkey );
+               goto ready;
+           }
+    } while( load_pubkey_modules() );
+    rc = G10ERR_PUBKEY_ALGO;
+  ready:
+    return rc;
+}
diff --git a/cipher/rand-internal.h b/cipher/rand-internal.h
new file mode 100644 (file)
index 0000000..cb39887
--- /dev/null
@@ -0,0 +1,39 @@
+/* rand-internal.h - header to glue the random functions
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_RAND_INTERNAL_H
+#define G10_RAND_INTERNAL_H
+
+int rndunix_gather_random (void (*add)(const void*, size_t, int),
+                           int requester, size_t length, int level);
+int rndlinux_gather_random (void (*add)(const void*, size_t, int),
+                            int requester, size_t length, int level);
+int rndegd_connect_socket (int nofail);
+int rndegd_gather_random (void (*add)(const void*, size_t, int),
+                          int requester, size_t length, int level );
+int rndw32_gather_random (void (*add)(const void*, size_t, int),
+                          int requester, size_t length, int level);
+int rndw32_gather_random_fast (void (*add)(const void*, size_t, int),
+                               int requester );
+int rndriscos_gather_random (void (*add)(const void*, size_t, int),
+                             int requester, size_t length, int level);
+
+
+#endif /*G10_RAND_INTERNAL_H*/
diff --git a/cipher/random.c b/cipher/random.c
new file mode 100644 (file)
index 0000000..6bc8e56
--- /dev/null
@@ -0,0 +1,838 @@
+/* random.c  - random number generator
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2003, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/****************
+ * This random number generator is modelled after the one described
+ * in Peter Gutmann's Paper: "Software Generation of Practically
+ * Strong Random Numbers".
+ */
+
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#ifdef HAVE_GETHRTIME
+#include <sys/times.h>
+#endif
+#ifdef HAVE_GETTIMEOFDAY
+#include <sys/time.h>
+#endif
+#ifdef HAVE_TIMES
+#include <sys/times.h>
+#endif
+#ifdef HAVE_GETRUSAGE
+#include <sys/resource.h>
+#endif
+#ifdef _WIN32
+#include <process.h>
+#endif
+#include "util.h"
+#include "rmd.h"
+#include "ttyio.h"
+#include "i18n.h"
+#include "random.h"
+#include "rand-internal.h"
+#include "algorithms.h"
+
+#ifndef RAND_MAX   /* for SunOS */
+#define RAND_MAX 32767
+#endif
+
+
+/* Check whether we can lock the seed file read write. */
+#if defined(HAVE_FCNTL) && defined(HAVE_FTRUNCATE) && !defined(HAVE_W32_SYSTEM)
+#define LOCK_SEED_FILE 1
+#else
+#define LOCK_SEED_FILE 0
+#endif
+
+
+#if SIZEOF_UNSIGNED_LONG == 8
+#define ADD_VALUE 0xa5a5a5a5a5a5a5a5
+#elif SIZEOF_UNSIGNED_LONG == 4
+#define ADD_VALUE 0xa5a5a5a5
+#else
+#error weird size for an unsigned long
+#endif
+
+#define BLOCKLEN  64   /* hash this amount of bytes */
+#define DIGESTLEN 20   /* into a digest of this length (rmd160) */
+/* poolblocks is the number of digests which make up the pool
+ * and poolsize must be a multiple of the digest length
+ * to make the AND operations faster, the size should also be
+ * a multiple of ulong
+ */
+#define POOLBLOCKS 30
+#define POOLSIZE (POOLBLOCKS*DIGESTLEN)
+#if (POOLSIZE % SIZEOF_UNSIGNED_LONG)
+#error Please make sure that poolsize is a multiple of ulong
+#endif
+#define POOLWORDS (POOLSIZE / SIZEOF_UNSIGNED_LONG)
+
+
+static int is_initialized;
+#define MASK_LEVEL(a) do {if( a > 2 ) a = 2; else if( a < 0 ) a = 0; } while(0)
+static char *rndpool;  /* allocated size is POOLSIZE+BLOCKLEN */
+static char *keypool;  /* allocated size is POOLSIZE+BLOCKLEN */
+static size_t pool_readpos;
+static size_t pool_writepos;
+static int pool_filled;
+static int pool_balance;
+static int just_mixed;
+static int did_initial_extra_seeding;
+static char *seed_file_name;
+static int allow_seed_file_update;
+static int no_seed_file_locking;
+
+static int secure_alloc;
+static int quick_test;
+static int faked_rng;
+
+
+static void read_pool( byte *buffer, size_t length, int level );
+static void add_randomness( const void *buffer, size_t length, int source );
+static void random_poll(void);
+static void read_random_source( int requester, size_t length, int level);
+static int gather_faked( void (*add)(const void*, size_t, int), int requester,
+                                                   size_t length, int level );
+
+static struct {
+    ulong mixrnd;
+    ulong mixkey;
+    ulong slowpolls;
+    ulong fastpolls;
+    ulong getbytes1;
+    ulong ngetbytes1;
+    ulong getbytes2;
+    ulong ngetbytes2;
+    ulong addbytes;
+    ulong naddbytes;
+} rndstats;
+
+
+static int (*
+getfnc_gather_random (void))(void (*)(const void*, size_t, int), int,
+                        size_t, int)
+{
+#ifdef USE_ALL_RANDOM_MODULES
+  static int (*fnc)(void (*)(const void*, size_t, int), int, size_t, int);
+  
+  if (fnc)
+    return fnc;
+# ifdef USE_RNDLINUX
+  if ( !access (NAME_OF_DEV_RANDOM, R_OK)
+       && !access (NAME_OF_DEV_URANDOM, R_OK))
+    {
+      fnc = rndlinux_gather_random;
+      return fnc;
+    }
+# endif
+# ifdef USE_RNDEGD
+  if ( rndegd_connect_socket (1) != -1 )
+    {
+      fnc = rndegd_gather_random;
+      return fnc;
+    }
+# endif
+# ifdef USE_RNDUNIX
+  fnc = rndunix_gather_random;
+  return fnc;
+# endif
+
+  log_fatal (_("no entropy gathering module detected\n"));
+
+#else
+# ifdef USE_RNDLINUX
+  return rndlinux_gather_random;
+# endif
+# ifdef USE_RNDUNIX
+  return rndunix_gather_random;
+# endif
+# ifdef USE_RNDEGD
+  return rndegd_gather_random;
+# endif
+# ifdef USE_RNDW32
+  return rndw32_gather_random;
+# endif
+# ifdef USE_RNDRISCOS
+  return rndriscos_gather_random;
+# endif
+#endif
+  return NULL;
+}
+
+static int (*
+getfnc_fast_random_poll (void))( void (*)(const void*, size_t, int), int)
+{
+#ifdef USE_RNDW32
+  return rndw32_gather_random_fast;
+#endif
+  return NULL;
+}
+
+
+
+static void
+initialize(void)
+{
+    /* The data buffer is allocated somewhat larger, so that
+     * we can use this extra space (which is allocated in secure memory)
+     * as a temporary hash buffer */
+    rndpool = secure_alloc ? xmalloc_secure_clear(POOLSIZE+BLOCKLEN)
+                          : xmalloc_clear(POOLSIZE+BLOCKLEN);
+    keypool = secure_alloc ? xmalloc_secure_clear(POOLSIZE+BLOCKLEN)
+                          : xmalloc_clear(POOLSIZE+BLOCKLEN);
+    is_initialized = 1;
+}
+
+static void
+burn_stack (int bytes)
+{
+    char buf[128];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+void
+random_dump_stats()
+{
+    fprintf(stderr,
+           "random usage: poolsize=%d mixed=%lu polls=%lu/%lu added=%lu/%lu\n"
+           "              outmix=%lu getlvl1=%lu/%lu getlvl2=%lu/%lu\n",
+       POOLSIZE, rndstats.mixrnd, rndstats.slowpolls, rndstats.fastpolls,
+                 rndstats.naddbytes, rndstats.addbytes,
+       rndstats.mixkey, rndstats.ngetbytes1, rndstats.getbytes1,
+                   rndstats.ngetbytes2, rndstats.getbytes2 );
+}
+
+void
+secure_randoxmalloc()
+{
+    secure_alloc = 1;
+}
+
+
+int
+quick_random_gen( int onoff )
+{
+    int last;
+
+    read_random_source(0,0,0); /* init */
+    last = quick_test;
+    if( onoff != -1 )
+       quick_test = onoff;
+    return faked_rng? 1 : last;
+}
+
+
+/****************
+ * Fill the buffer with LENGTH bytes of cryptographically strong
+ * random bytes. level 0 is not very strong, 1 is strong enough
+ * for most usage, 2 is good for key generation stuff but may be very slow.
+ */
+void
+randomize_buffer( byte *buffer, size_t length, int level )
+{
+    char *p = get_random_bits( length*8, level, 1 );
+    memcpy( buffer, p, length );
+    xfree(p);
+}
+
+
+int
+random_is_faked()
+{
+    if( !is_initialized )
+       initialize();
+    return faked_rng || quick_test;
+}
+
+/* Disable locking of seed files. */
+void 
+random_disable_locking ()
+{
+  no_seed_file_locking = 1;
+}
+
+/****************
+ * Return a pointer to a randomized buffer of level 0 and LENGTH bits
+ * caller must free the buffer.
+ * Note: The returned value is rounded up to bytes.
+ */
+byte *
+get_random_bits( size_t nbits, int level, int secure )
+{
+    byte *buf, *p;
+    size_t nbytes = (nbits+7)/8;
+
+    if( quick_test && level > 1 )
+       level = 1;
+    MASK_LEVEL(level);
+    if( level == 1 ) {
+       rndstats.getbytes1 += nbytes;
+       rndstats.ngetbytes1++;
+    }
+    else if( level >= 2 ) {
+       rndstats.getbytes2 += nbytes;
+       rndstats.ngetbytes2++;
+    }
+
+    buf = secure && secure_alloc ? xmalloc_secure( nbytes ) : xmalloc( nbytes );
+    for( p = buf; nbytes > 0; ) {
+       size_t n = nbytes > POOLSIZE? POOLSIZE : nbytes;
+       read_pool( p, n, level );
+       nbytes -= n;
+       p += n;
+    }
+    return buf;
+}
+
+
+/****************
+ * Mix the pool
+ */
+static void
+mix_pool(byte *pool)
+{
+    char *hashbuf = pool + POOLSIZE;
+    char *p, *pend;
+    int i, n;
+    RMD160_CONTEXT md;
+
+    rmd160_init( &md );
+#if DIGESTLEN != 20
+#error must have a digest length of 20 for ripe-md-160
+#endif
+    /* loop over the pool */
+    pend = pool + POOLSIZE;
+    memcpy(hashbuf, pend - DIGESTLEN, DIGESTLEN );
+    memcpy(hashbuf+DIGESTLEN, pool, BLOCKLEN-DIGESTLEN);
+    rmd160_mixblock( &md, hashbuf);
+    memcpy(pool, hashbuf, 20 );
+
+    p = pool;
+    for( n=1; n < POOLBLOCKS; n++ ) {
+       memcpy(hashbuf, p, DIGESTLEN );
+
+       p += DIGESTLEN;
+       if( p+DIGESTLEN+BLOCKLEN < pend )
+           memcpy(hashbuf+DIGESTLEN, p+DIGESTLEN, BLOCKLEN-DIGESTLEN);
+       else {
+           char *pp = p+DIGESTLEN;
+           for(i=DIGESTLEN; i < BLOCKLEN; i++ ) {
+               if( pp >= pend )
+                   pp = pool;
+               hashbuf[i] = *pp++;
+           }
+       }
+
+       rmd160_mixblock( &md, hashbuf);
+       memcpy(p, hashbuf, 20 );
+    }
+    burn_stack (384); /* for the rmd160_mixblock() */
+}
+
+
+void
+set_random_seed_file( const char *name )
+{
+    if( seed_file_name )
+       BUG();
+    seed_file_name = xstrdup( name );
+}
+
+
+/* Lock an open file identified by file descriptor FD and wait a
+   reasonable time to succeed.  With FOR_WRITE set to true a Rite lock
+   will be taken.  FNAME is used only for diagnostics. Returns 0 on
+   success or -1 on error. */
+static int
+lock_seed_file (int fd, const char *fname, int for_write)
+{
+#if LOCK_SEED_FILE
+  struct flock lck;
+  struct timeval tv;
+  int backoff=0;
+
+  if (no_seed_file_locking)
+    return 0;
+  
+  /* We take a lock on the entire file. */
+  memset (&lck, 0, sizeof lck);
+  lck.l_type = for_write? F_WRLCK : F_RDLCK;
+  lck.l_whence = SEEK_SET;
+
+  while (fcntl (fd, F_SETLK, &lck) == -1)
+    {
+      if (errno != EAGAIN && errno != EACCES)
+        {
+          log_info (_("can't lock `%s': %s\n"), fname, strerror (errno));
+          return -1;
+        }
+
+      if (backoff > 2) /* Show the first message after ~2.25 seconds. */
+        log_info( _("waiting for lock on `%s'...\n"), fname);
+      
+      tv.tv_sec = backoff;
+      tv.tv_usec = 250000;
+      select (0, NULL, NULL, NULL, &tv);
+      if (backoff < 10)
+        backoff++ ;
+    }
+#endif /*LOCK_SEED_FILE*/
+  return 0;
+}
+
+
+
+/****************
+ * Read in a seed form the random_seed file
+ * and return true if this was successful
+ */
+static int
+read_seed_file(void)
+{
+    int fd;
+    struct stat sb;
+    unsigned char buffer[POOLSIZE];
+    int n;
+
+    if( !seed_file_name )
+       return 0;
+
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
+    fd = open( seed_file_name, O_RDONLY | O_BINARY );
+#else
+    fd = open( seed_file_name, O_RDONLY );
+#endif
+    if( fd == -1 && errno == ENOENT) {
+       allow_seed_file_update = 1;
+       return 0;
+    }
+
+    if( fd == -1 ) {
+       log_info(_("can't open `%s': %s\n"), seed_file_name, strerror(errno) );
+       return 0;
+    }
+    if (lock_seed_file (fd, seed_file_name, 0))
+      {
+        close (fd);
+        return 0;
+      }
+
+    if( fstat( fd, &sb ) ) {
+       log_info(_("can't stat `%s': %s\n"), seed_file_name, strerror(errno) );
+       close(fd);
+       return 0;
+    }
+    if( !S_ISREG(sb.st_mode) ) {
+       log_info(_("`%s' is not a regular file - ignored\n"), seed_file_name );
+       close(fd);
+       return 0;
+    }
+    if( !sb.st_size ) {
+       log_info(_("note: random_seed file is empty\n") );
+       close(fd);
+       allow_seed_file_update = 1;
+       return 0;
+    }
+    if( sb.st_size != POOLSIZE ) {
+       log_info(_("WARNING: invalid size of random_seed file - not used\n") );
+       close(fd);
+       return 0;
+    }
+    do {
+       n = read( fd, buffer, POOLSIZE );
+    } while( n == -1 && errno == EINTR );
+    if( n != POOLSIZE ) {
+       log_fatal(_("can't read `%s': %s\n"), seed_file_name,strerror(errno) );
+       close(fd);
+       return 0;
+    }
+
+    close(fd);
+
+    add_randomness( buffer, POOLSIZE, 0 );
+    /* add some minor entropy to the pool now (this will also force a mixing) */
+    {  pid_t x = getpid();
+       add_randomness( &x, sizeof(x), 0 );
+    }
+    {  time_t x = time(NULL);
+       add_randomness( &x, sizeof(x), 0 );
+    }
+    {  clock_t x = clock();
+       add_randomness( &x, sizeof(x), 0 );
+    }
+    /* And read a few bytes from our entropy source.  By using
+     * a level of 0 this will not block and might not return anything
+     * with some entropy drivers, however the rndlinux driver will use
+     * /dev/urandom and return some stuff - Do not read to much as we
+     * want to be friendly to the scare system entropy resource. */
+    read_random_source( 0, 16, 0 );
+
+    allow_seed_file_update = 1;
+    return 1;
+}
+
+void
+update_random_seed_file()
+{
+    ulong *sp, *dp;
+    int fd, i;
+
+    if( !seed_file_name || !is_initialized || !pool_filled )
+       return;
+    if( !allow_seed_file_update ) {
+       log_info(_("note: random_seed file not updated\n"));
+       return;
+    }
+
+
+    /* copy the entropy pool to a scratch pool and mix both of them */
+    for(i=0,dp=(ulong*)keypool, sp=(ulong*)rndpool;
+                                   i < POOLWORDS; i++, dp++, sp++ ) {
+       *dp = *sp + ADD_VALUE;
+    }
+    mix_pool(rndpool); rndstats.mixrnd++;
+    mix_pool(keypool); rndstats.mixkey++;
+
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
+    fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,
+                                                       S_IRUSR|S_IWUSR );
+#else
+# if LOCK_SEED_FILE
+    fd = open( seed_file_name, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );
+# else
+    fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
+# endif
+#endif
+    if( fd == -1 ) {
+       log_info(_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
+       return;
+    }
+
+    if (lock_seed_file (fd, seed_file_name, 1))
+      {
+        close (fd);
+        return;
+      }
+#if LOCK_SEED_FILE
+    if (ftruncate (fd, 0))
+      {
+       log_info(_("can't write `%s': %s\n"), seed_file_name, strerror(errno));
+        close (fd);
+        return;
+      }
+#endif /*LOCK_SEED_FILE*/
+
+    do {
+       i = write( fd, keypool, POOLSIZE );
+    } while( i == -1 && errno == EINTR );
+    if( i != POOLSIZE ) {
+       log_info(_("can't write `%s': %s\n"), seed_file_name, strerror(errno) );
+    }
+    if( close(fd) )
+       log_info(_("can't close `%s': %s\n"), seed_file_name, strerror(errno) );
+}
+
+
+static void
+read_pool( byte *buffer, size_t length, int level )
+{
+    int i;
+    ulong *sp, *dp;
+
+    if( length > POOLSIZE ) {
+       log_bug("too many random bits requested\n");
+    }
+
+    if( !pool_filled ) {
+       if( read_seed_file() )
+           pool_filled = 1;
+    }
+
+    /* For level 2 quality (key generation) we alwas make
+     * sure that the pool has been seeded enough initially */
+    if( level == 2 && !did_initial_extra_seeding ) {
+       size_t needed;
+
+       pool_balance = 0;
+       needed = length - pool_balance;
+       if( needed < POOLSIZE/2 )
+           needed = POOLSIZE/2;
+       else if( needed > POOLSIZE )
+           BUG();
+       read_random_source( 3, needed, 2 );
+       pool_balance += needed;
+       did_initial_extra_seeding=1;
+    }
+
+    /* for level 2 make sure that there is enough random in the pool */
+    if( level == 2 && pool_balance < length ) {
+       size_t needed;
+
+       if( pool_balance < 0 )
+           pool_balance = 0;
+       needed = length - pool_balance;
+       if( needed > POOLSIZE )
+           BUG();
+       read_random_source( 3, needed, 2 );
+       pool_balance += needed;
+    }
+
+    /* make sure the pool is filled */
+    while( !pool_filled )
+       random_poll();
+
+    /* do always a fast random poll */
+    fast_random_poll();
+
+    if( !level ) { /* no need for cryptographic strong random */
+       /* create a new pool */
+       for(i=0,dp=(ulong*)keypool, sp=(ulong*)rndpool;
+                                   i < POOLWORDS; i++, dp++, sp++ )
+           *dp = *sp + ADD_VALUE;
+       /* must mix both pools */
+       mix_pool(rndpool); rndstats.mixrnd++;
+       mix_pool(keypool); rndstats.mixkey++;
+       memcpy( buffer, keypool, length );
+    }
+    else {
+       /* mix the pool (if add_randomness() didn't it) */
+       if( !just_mixed ) {
+           mix_pool(rndpool);
+           rndstats.mixrnd++;
+       }
+       /* create a new pool */
+       for(i=0,dp=(ulong*)keypool, sp=(ulong*)rndpool;
+                                   i < POOLWORDS; i++, dp++, sp++ )
+           *dp = *sp + ADD_VALUE;
+       /* and mix both pools */
+       mix_pool(rndpool); rndstats.mixrnd++;
+       mix_pool(keypool); rndstats.mixkey++;
+       /* read the required data
+        * we use a readpoiter to read from a different postion each
+        * time */
+       while( length-- ) {
+           *buffer++ = keypool[pool_readpos++];
+           if( pool_readpos >= POOLSIZE )
+               pool_readpos = 0;
+           pool_balance--;
+       }
+       if( pool_balance < 0 )
+           pool_balance = 0;
+       /* and clear the keypool */
+       wipememory(keypool, POOLSIZE);
+    }
+}
+
+
+/****************
+ * Add LENGTH bytes of randomness from buffer to the pool.
+ * source may be used to specify the randomness source.
+ * Source is:
+ *     0 - used ony for initialization
+ *     1 - fast random poll function
+ *     2 - normal poll function
+ *     3 - used when level 2 random quality has been requested
+ *         to do an extra pool seed.
+ */
+static void
+add_randomness( const void *buffer, size_t length, int source )
+{
+    const byte *p = buffer;
+
+    if( !is_initialized )
+       initialize();
+    rndstats.addbytes += length;
+    rndstats.naddbytes++;
+    while( length-- ) {
+       rndpool[pool_writepos++] ^= *p++;
+       if( pool_writepos >= POOLSIZE ) {
+           if( source > 1 )
+               pool_filled = 1;
+           pool_writepos = 0;
+           mix_pool(rndpool); rndstats.mixrnd++;
+           just_mixed = !length;
+       }
+    }
+}
+
+
+
+static void
+random_poll()
+{
+    rndstats.slowpolls++;
+    read_random_source( 2, POOLSIZE/5, 1 );
+}
+
+
+void
+fast_random_poll()
+{
+    static int (*fnc)( void (*)(const void*, size_t, int), int) = NULL;
+    static int initialized = 0;
+
+    rndstats.fastpolls++;
+    if( !initialized ) {
+       if( !is_initialized )
+           initialize();
+       initialized = 1;
+       fnc = getfnc_fast_random_poll();
+    }
+    if( fnc ) {
+       (*fnc)( add_randomness, 1 );
+       return;
+    }
+
+    /* fall back to the generic function */
+#if defined(HAVE_GETHRTIME) && !defined(HAVE_BROKEN_GETHRTIME)
+    {  hrtime_t tv;
+        /* On some Solaris and HPUX system gethrtime raises an SIGILL, but we 
+         * checked this with configure */
+       tv = gethrtime();
+       add_randomness( &tv, sizeof(tv), 1 );
+    }
+#elif defined (HAVE_GETTIMEOFDAY)
+    {  struct timeval tv;
+       if( gettimeofday( &tv, NULL ) )
+           BUG();
+       add_randomness( &tv.tv_sec, sizeof(tv.tv_sec), 1 );
+       add_randomness( &tv.tv_usec, sizeof(tv.tv_usec), 1 );
+    }
+#elif defined (HAVE_CLOCK_GETTIME)
+    {  struct timespec tv;
+       if( clock_gettime( CLOCK_REALTIME, &tv ) == -1 )
+           BUG();
+       add_randomness( &tv.tv_sec, sizeof(tv.tv_sec), 1 );
+       add_randomness( &tv.tv_nsec, sizeof(tv.tv_nsec), 1 );
+    }
+#elif defined (HAVE_TIMES)
+    {  struct tms buf;
+        if( times( &buf ) == -1 )
+           BUG();
+       add_randomness( &buf, sizeof buf, 1 );
+    }
+#endif
+#ifdef HAVE_GETRUSAGE
+#ifndef RUSAGE_SELF
+#ifdef __GCC__
+#warning There is no RUSAGE_SELF on this system
+#endif
+#else
+    {  struct rusage buf;
+        /* QNX/Neutrino does return ENOSYS - so we just ignore it and
+         * add whatever is in buf.  In a chroot environment it might not
+         * work at all (i.e. because /proc/ is not accessible), so we better 
+         * ignore all error codes and hope for the best
+         */
+        getrusage( RUSAGE_SELF, &buf );
+        
+       add_randomness( &buf, sizeof buf, 1 );
+       wipememory( &buf, sizeof buf );
+    }
+#endif
+#endif
+    /* time and clock are available on all systems - so
+     * we better do it just in case one of the above functions
+     * didn't work */
+    {  time_t x = time(NULL);
+       add_randomness( &x, sizeof(x), 1 );
+    }
+    {  clock_t x = clock();
+       add_randomness( &x, sizeof(x), 1 );
+    }
+}
+
+
+
+static void
+read_random_source( int requester, size_t length, int level )
+{
+    static int (*fnc)(void (*)(const void*, size_t, int), int,
+                                                   size_t, int) = NULL;
+    if( !fnc ) {
+       if( !is_initialized )
+           initialize();
+       fnc = getfnc_gather_random();
+       if( !fnc ) {
+           faked_rng = 1;
+           fnc = gather_faked;
+       }
+       if( !requester && !length && !level )
+           return; /* init only */
+    }
+    if( (*fnc)( add_randomness, requester, length, level ) < 0 )
+       log_fatal("No way to gather entropy for the RNG\n");
+}
+
+
+static int
+gather_faked( void (*add)(const void*, size_t, int), int requester,
+             size_t length, int level )
+{
+    static int initialized=0;
+    size_t n;
+    char *buffer, *p;
+
+    if( !initialized ) {
+       log_info(_("WARNING: using insecure random number generator!!\n"));
+       tty_printf(_("The random number generator is only a kludge to let\n"
+                  "it run - it is in no way a strong RNG!\n\n"
+                  "DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n\n"));
+       initialized=1;
+#ifdef HAVE_RAND
+       srand(make_timestamp()*getpid());
+#else
+       srandom(make_timestamp()*getpid());
+#endif
+    }
+
+    p = buffer = xmalloc( length );
+    n = length;
+#ifdef HAVE_RAND
+    while( n-- )
+       *p++ = ((unsigned)(1 + (int) (256.0*rand()/(RAND_MAX+1.0)))-1);
+#else
+    while( n-- )
+       *p++ = ((unsigned)(1 + (int) (256.0*random()/(RAND_MAX+1.0)))-1);
+#endif
+    add_randomness( buffer, length, requester );
+    xfree(buffer);
+    return 0; /* okay */
+}
diff --git a/cipher/random.h b/cipher/random.h
new file mode 100644 (file)
index 0000000..0f26d99
--- /dev/null
@@ -0,0 +1,43 @@
+/* random.h - random functions
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_RANDOM_H
+#define G10_RANDOM_H
+
+#include "types.h"
+
+/*-- random.c --*/
+void random_dump_stats(void);
+void secure_randoxmalloc(void);
+void set_random_seed_file(const char *);
+void update_random_seed_file(void);
+int  quick_random_gen( int onoff );
+int  random_is_faked(void);
+void random_disable_locking (void);
+void randomize_buffer( byte *buffer, size_t length, int level );
+byte *get_random_bits( size_t nbits, int level, int secure );
+void fast_random_poll( void );
+
+/*-- rndw32.c --*/
+#ifdef USE_STATIC_RNDW32
+void rndw32_set_dll_name( const char *name );
+#endif
+
+#endif /*G10_RANDOM_H*/
diff --git a/cipher/rijndael.c b/cipher/rijndael.c
new file mode 100644 (file)
index 0000000..e52e01e
--- /dev/null
@@ -0,0 +1,2206 @@
+/* Rijndael (AES) for GnuPG
+ *     Copyright (C) 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *******************************************************************
+ * The code here is based on the optimized implementation taken from
+ * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/ on Oct 2, 2000,
+ * which carries this notice:
+ *------------------------------------------
+ * rijndael-alg-fst.c   v2.3   April '2000
+ *
+ * Optimised ANSI C code
+ *
+ * authors: v1.0: Antoon Bosselaers
+ *          v2.0: Vincent Rijmen
+ *          v2.3: Paulo Barreto
+ *
+ * This code is placed in the public domain.
+ *------------------------------------------
+ */
+\f
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h> /* for memcmp() */
+
+#include "types.h"  /* for byte and u32 typedefs */
+#include "util.h"
+#include "errors.h"
+#include "algorithms.h"
+
+#define MAXKC                  (256/32)
+#define MAXROUNDS              14
+
+
+static const char *selftest(void);
+
+typedef struct {
+    int   ROUNDS;                   /* key-length-dependent number of rounds */
+    int decryption_prepared;
+    byte  keySched[MAXROUNDS+1][4][4]; /* key schedule         */
+    byte  keySched2[MAXROUNDS+1][4][4];        /* key schedule         */
+} RIJNDAEL_context;
+\f
+
+static const byte S[256] = {
+    99, 124, 119, 123, 242, 107, 111, 197,
+    48,   1, 103,  43, 254, 215, 171, 118, 
+    202, 130, 201, 125, 250,  89,  71, 240,
+    173, 212, 162, 175, 156, 164, 114, 192, 
+    183, 253, 147,  38,  54,  63, 247, 204,
+    52, 165, 229, 241, 113, 216,  49,  21, 
+    4, 199,  35, 195,  24, 150,   5, 154,
+    7,  18, 128, 226, 235,  39, 178, 117, 
+    9, 131,  44,  26,  27, 110,  90, 160, 
+    82,  59, 214, 179,  41, 227,  47, 132, 
+    83, 209,   0, 237,  32, 252, 177,  91,
+    106, 203, 190,  57,  74,  76,  88, 207, 
+    208, 239, 170, 251,  67,  77,  51, 133,
+    69, 249,   2, 127,  80,  60, 159, 168, 
+    81, 163,  64, 143, 146, 157,  56, 245,
+    188, 182, 218,  33,  16, 255, 243, 210, 
+    205,  12,  19, 236,  95, 151,  68,  23,
+    196, 167, 126,  61, 100,  93,  25, 115, 
+    96, 129,  79, 220,  34,  42, 144, 136,
+    70, 238, 184,  20, 222,  94,  11, 219, 
+    224,  50,  58,  10,  73,   6,  36,  92,
+    194, 211, 172,  98, 145, 149, 228, 121, 
+    231, 200,  55, 109, 141, 213,  78, 169, 
+    108,  86, 244, 234, 101, 122, 174,   8, 
+    186, 120,  37,  46,  28, 166, 180, 198, 
+    232, 221, 116,  31,  75, 189, 139, 138, 
+    112,  62, 181, 102,  72,   3, 246,  14,
+    97,  53,  87, 185, 134, 193,  29, 158, 
+    225, 248, 152,  17, 105, 217, 142, 148,
+    155,  30, 135, 233, 206,  85,  40, 223, 
+    140, 161, 137,  13, 191, 230,  66, 104, 
+    65, 153,  45,  15, 176,  84, 187,  22
+};
+
+
+static const byte T1[256][4] = {
+    { 0xc6,0x63,0x63,0xa5 }, { 0xf8,0x7c,0x7c,0x84 },
+    { 0xee,0x77,0x77,0x99 }, { 0xf6,0x7b,0x7b,0x8d }, 
+    { 0xff,0xf2,0xf2,0x0d }, { 0xd6,0x6b,0x6b,0xbd },
+    { 0xde,0x6f,0x6f,0xb1 }, { 0x91,0xc5,0xc5,0x54 }, 
+    { 0x60,0x30,0x30,0x50 }, { 0x02,0x01,0x01,0x03 },
+    { 0xce,0x67,0x67,0xa9 }, { 0x56,0x2b,0x2b,0x7d }, 
+    { 0xe7,0xfe,0xfe,0x19 }, { 0xb5,0xd7,0xd7,0x62 },
+    { 0x4d,0xab,0xab,0xe6 }, { 0xec,0x76,0x76,0x9a }, 
+    { 0x8f,0xca,0xca,0x45 }, { 0x1f,0x82,0x82,0x9d },
+    { 0x89,0xc9,0xc9,0x40 }, { 0xfa,0x7d,0x7d,0x87 }, 
+    { 0xef,0xfa,0xfa,0x15 }, { 0xb2,0x59,0x59,0xeb }, 
+    { 0x8e,0x47,0x47,0xc9 }, { 0xfb,0xf0,0xf0,0x0b }, 
+    { 0x41,0xad,0xad,0xec }, { 0xb3,0xd4,0xd4,0x67 },
+    { 0x5f,0xa2,0xa2,0xfd }, { 0x45,0xaf,0xaf,0xea }, 
+    { 0x23,0x9c,0x9c,0xbf }, { 0x53,0xa4,0xa4,0xf7 },
+    { 0xe4,0x72,0x72,0x96 }, { 0x9b,0xc0,0xc0,0x5b }, 
+    { 0x75,0xb7,0xb7,0xc2 }, { 0xe1,0xfd,0xfd,0x1c },
+    { 0x3d,0x93,0x93,0xae }, { 0x4c,0x26,0x26,0x6a }, 
+    { 0x6c,0x36,0x36,0x5a }, { 0x7e,0x3f,0x3f,0x41 },
+    { 0xf5,0xf7,0xf7,0x02 }, { 0x83,0xcc,0xcc,0x4f }, 
+    { 0x68,0x34,0x34,0x5c }, { 0x51,0xa5,0xa5,0xf4 }, 
+    { 0xd1,0xe5,0xe5,0x34 }, { 0xf9,0xf1,0xf1,0x08 }, 
+    { 0xe2,0x71,0x71,0x93 }, { 0xab,0xd8,0xd8,0x73 },
+    { 0x62,0x31,0x31,0x53 }, { 0x2a,0x15,0x15,0x3f }, 
+    { 0x08,0x04,0x04,0x0c }, { 0x95,0xc7,0xc7,0x52 },
+    { 0x46,0x23,0x23,0x65 }, { 0x9d,0xc3,0xc3,0x5e }, 
+    { 0x30,0x18,0x18,0x28 }, { 0x37,0x96,0x96,0xa1 },
+    { 0x0a,0x05,0x05,0x0f }, { 0x2f,0x9a,0x9a,0xb5 }, 
+    { 0x0e,0x07,0x07,0x09 }, { 0x24,0x12,0x12,0x36 },
+    { 0x1b,0x80,0x80,0x9b }, { 0xdf,0xe2,0xe2,0x3d }, 
+    { 0xcd,0xeb,0xeb,0x26 }, { 0x4e,0x27,0x27,0x69 },
+    { 0x7f,0xb2,0xb2,0xcd }, { 0xea,0x75,0x75,0x9f }, 
+    { 0x12,0x09,0x09,0x1b }, { 0x1d,0x83,0x83,0x9e },
+    { 0x58,0x2c,0x2c,0x74 }, { 0x34,0x1a,0x1a,0x2e }, 
+    { 0x36,0x1b,0x1b,0x2d }, { 0xdc,0x6e,0x6e,0xb2 }, 
+    { 0xb4,0x5a,0x5a,0xee }, { 0x5b,0xa0,0xa0,0xfb }, 
+    { 0xa4,0x52,0x52,0xf6 }, { 0x76,0x3b,0x3b,0x4d },
+    { 0xb7,0xd6,0xd6,0x61 }, { 0x7d,0xb3,0xb3,0xce }, 
+    { 0x52,0x29,0x29,0x7b }, { 0xdd,0xe3,0xe3,0x3e }, 
+    { 0x5e,0x2f,0x2f,0x71 }, { 0x13,0x84,0x84,0x97 }, 
+    { 0xa6,0x53,0x53,0xf5 }, { 0xb9,0xd1,0xd1,0x68 }, 
+    { 0x00,0x00,0x00,0x00 }, { 0xc1,0xed,0xed,0x2c }, 
+    { 0x40,0x20,0x20,0x60 }, { 0xe3,0xfc,0xfc,0x1f },
+    { 0x79,0xb1,0xb1,0xc8 }, { 0xb6,0x5b,0x5b,0xed }, 
+    { 0xd4,0x6a,0x6a,0xbe }, { 0x8d,0xcb,0xcb,0x46 },
+    { 0x67,0xbe,0xbe,0xd9 }, { 0x72,0x39,0x39,0x4b }, 
+    { 0x94,0x4a,0x4a,0xde }, { 0x98,0x4c,0x4c,0xd4 },
+    { 0xb0,0x58,0x58,0xe8 }, { 0x85,0xcf,0xcf,0x4a }, 
+    { 0xbb,0xd0,0xd0,0x6b }, { 0xc5,0xef,0xef,0x2a },
+    { 0x4f,0xaa,0xaa,0xe5 }, { 0xed,0xfb,0xfb,0x16 }, 
+    { 0x86,0x43,0x43,0xc5 }, { 0x9a,0x4d,0x4d,0xd7 },
+    { 0x66,0x33,0x33,0x55 }, { 0x11,0x85,0x85,0x94 }, 
+    { 0x8a,0x45,0x45,0xcf }, { 0xe9,0xf9,0xf9,0x10 },
+    { 0x04,0x02,0x02,0x06 }, { 0xfe,0x7f,0x7f,0x81 }, 
+    { 0xa0,0x50,0x50,0xf0 }, { 0x78,0x3c,0x3c,0x44 },
+    { 0x25,0x9f,0x9f,0xba }, { 0x4b,0xa8,0xa8,0xe3 }, 
+    { 0xa2,0x51,0x51,0xf3 }, { 0x5d,0xa3,0xa3,0xfe },
+    { 0x80,0x40,0x40,0xc0 }, { 0x05,0x8f,0x8f,0x8a }, 
+    { 0x3f,0x92,0x92,0xad }, { 0x21,0x9d,0x9d,0xbc },
+    { 0x70,0x38,0x38,0x48 }, { 0xf1,0xf5,0xf5,0x04 }, 
+    { 0x63,0xbc,0xbc,0xdf }, { 0x77,0xb6,0xb6,0xc1 },
+    { 0xaf,0xda,0xda,0x75 }, { 0x42,0x21,0x21,0x63 }, 
+    { 0x20,0x10,0x10,0x30 }, { 0xe5,0xff,0xff,0x1a },
+    { 0xfd,0xf3,0xf3,0x0e }, { 0xbf,0xd2,0xd2,0x6d }, 
+    { 0x81,0xcd,0xcd,0x4c }, { 0x18,0x0c,0x0c,0x14 },
+    { 0x26,0x13,0x13,0x35 }, { 0xc3,0xec,0xec,0x2f }, 
+    { 0xbe,0x5f,0x5f,0xe1 }, { 0x35,0x97,0x97,0xa2 },
+    { 0x88,0x44,0x44,0xcc }, { 0x2e,0x17,0x17,0x39 }, 
+    { 0x93,0xc4,0xc4,0x57 }, { 0x55,0xa7,0xa7,0xf2 },
+    { 0xfc,0x7e,0x7e,0x82 }, { 0x7a,0x3d,0x3d,0x47 }, 
+    { 0xc8,0x64,0x64,0xac }, { 0xba,0x5d,0x5d,0xe7 },
+    { 0x32,0x19,0x19,0x2b }, { 0xe6,0x73,0x73,0x95 }, 
+    { 0xc0,0x60,0x60,0xa0 }, { 0x19,0x81,0x81,0x98 },
+    { 0x9e,0x4f,0x4f,0xd1 }, { 0xa3,0xdc,0xdc,0x7f }, 
+    { 0x44,0x22,0x22,0x66 }, { 0x54,0x2a,0x2a,0x7e },
+    { 0x3b,0x90,0x90,0xab }, { 0x0b,0x88,0x88,0x83 }, 
+    { 0x8c,0x46,0x46,0xca }, { 0xc7,0xee,0xee,0x29 },
+    { 0x6b,0xb8,0xb8,0xd3 }, { 0x28,0x14,0x14,0x3c }, 
+    { 0xa7,0xde,0xde,0x79 }, { 0xbc,0x5e,0x5e,0xe2 },
+    { 0x16,0x0b,0x0b,0x1d }, { 0xad,0xdb,0xdb,0x76 }, 
+    { 0xdb,0xe0,0xe0,0x3b }, { 0x64,0x32,0x32,0x56 },
+    { 0x74,0x3a,0x3a,0x4e }, { 0x14,0x0a,0x0a,0x1e }, 
+    { 0x92,0x49,0x49,0xdb }, { 0x0c,0x06,0x06,0x0a },
+    { 0x48,0x24,0x24,0x6c }, { 0xb8,0x5c,0x5c,0xe4 }, 
+    { 0x9f,0xc2,0xc2,0x5d }, { 0xbd,0xd3,0xd3,0x6e },
+    { 0x43,0xac,0xac,0xef }, { 0xc4,0x62,0x62,0xa6 }, 
+    { 0x39,0x91,0x91,0xa8 }, { 0x31,0x95,0x95,0xa4 },
+    { 0xd3,0xe4,0xe4,0x37 }, { 0xf2,0x79,0x79,0x8b }, 
+    { 0xd5,0xe7,0xe7,0x32 }, { 0x8b,0xc8,0xc8,0x43 },
+    { 0x6e,0x37,0x37,0x59 }, { 0xda,0x6d,0x6d,0xb7 }, 
+    { 0x01,0x8d,0x8d,0x8c }, { 0xb1,0xd5,0xd5,0x64 },
+    { 0x9c,0x4e,0x4e,0xd2 }, { 0x49,0xa9,0xa9,0xe0 }, 
+    { 0xd8,0x6c,0x6c,0xb4 }, { 0xac,0x56,0x56,0xfa },
+    { 0xf3,0xf4,0xf4,0x07 }, { 0xcf,0xea,0xea,0x25 }, 
+    { 0xca,0x65,0x65,0xaf }, { 0xf4,0x7a,0x7a,0x8e },
+    { 0x47,0xae,0xae,0xe9 }, { 0x10,0x08,0x08,0x18 }, 
+    { 0x6f,0xba,0xba,0xd5 }, { 0xf0,0x78,0x78,0x88 },
+    { 0x4a,0x25,0x25,0x6f }, { 0x5c,0x2e,0x2e,0x72 }, 
+    { 0x38,0x1c,0x1c,0x24 }, { 0x57,0xa6,0xa6,0xf1 },
+    { 0x73,0xb4,0xb4,0xc7 }, { 0x97,0xc6,0xc6,0x51 }, 
+    { 0xcb,0xe8,0xe8,0x23 }, { 0xa1,0xdd,0xdd,0x7c },
+    { 0xe8,0x74,0x74,0x9c }, { 0x3e,0x1f,0x1f,0x21 }, 
+    { 0x96,0x4b,0x4b,0xdd }, { 0x61,0xbd,0xbd,0xdc }, 
+    { 0x0d,0x8b,0x8b,0x86 }, { 0x0f,0x8a,0x8a,0x85 }, 
+    { 0xe0,0x70,0x70,0x90 }, { 0x7c,0x3e,0x3e,0x42 },
+    { 0x71,0xb5,0xb5,0xc4 }, { 0xcc,0x66,0x66,0xaa }, 
+    { 0x90,0x48,0x48,0xd8 }, { 0x06,0x03,0x03,0x05 },
+    { 0xf7,0xf6,0xf6,0x01 }, { 0x1c,0x0e,0x0e,0x12 }, 
+    { 0xc2,0x61,0x61,0xa3 }, { 0x6a,0x35,0x35,0x5f },
+    { 0xae,0x57,0x57,0xf9 }, { 0x69,0xb9,0xb9,0xd0 }, 
+    { 0x17,0x86,0x86,0x91 }, { 0x99,0xc1,0xc1,0x58 },
+    { 0x3a,0x1d,0x1d,0x27 }, { 0x27,0x9e,0x9e,0xb9 }, 
+    { 0xd9,0xe1,0xe1,0x38 }, { 0xeb,0xf8,0xf8,0x13 },
+    { 0x2b,0x98,0x98,0xb3 }, { 0x22,0x11,0x11,0x33 }, 
+    { 0xd2,0x69,0x69,0xbb }, { 0xa9,0xd9,0xd9,0x70 },
+    { 0x07,0x8e,0x8e,0x89 }, { 0x33,0x94,0x94,0xa7 }, 
+    { 0x2d,0x9b,0x9b,0xb6 }, { 0x3c,0x1e,0x1e,0x22 },
+    { 0x15,0x87,0x87,0x92 }, { 0xc9,0xe9,0xe9,0x20 }, 
+    { 0x87,0xce,0xce,0x49 }, { 0xaa,0x55,0x55,0xff },
+    { 0x50,0x28,0x28,0x78 }, { 0xa5,0xdf,0xdf,0x7a }, 
+    { 0x03,0x8c,0x8c,0x8f }, { 0x59,0xa1,0xa1,0xf8 },
+    { 0x09,0x89,0x89,0x80 }, { 0x1a,0x0d,0x0d,0x17 }, 
+    { 0x65,0xbf,0xbf,0xda }, { 0xd7,0xe6,0xe6,0x31 },
+    { 0x84,0x42,0x42,0xc6 }, { 0xd0,0x68,0x68,0xb8 }, 
+    { 0x82,0x41,0x41,0xc3 }, { 0x29,0x99,0x99,0xb0 },
+    { 0x5a,0x2d,0x2d,0x77 }, { 0x1e,0x0f,0x0f,0x11 }, 
+    { 0x7b,0xb0,0xb0,0xcb }, { 0xa8,0x54,0x54,0xfc },
+    { 0x6d,0xbb,0xbb,0xd6 }, { 0x2c,0x16,0x16,0x3a }
+};
+
+static const byte T2[256][4] = {
+    { 0xa5,0xc6,0x63,0x63 }, { 0x84,0xf8,0x7c,0x7c },
+    { 0x99,0xee,0x77,0x77 }, { 0x8d,0xf6,0x7b,0x7b }, 
+    { 0x0d,0xff,0xf2,0xf2 }, { 0xbd,0xd6,0x6b,0x6b },
+    { 0xb1,0xde,0x6f,0x6f }, { 0x54,0x91,0xc5,0xc5 }, 
+    { 0x50,0x60,0x30,0x30 }, { 0x03,0x02,0x01,0x01 },
+    { 0xa9,0xce,0x67,0x67 }, { 0x7d,0x56,0x2b,0x2b }, 
+    { 0x19,0xe7,0xfe,0xfe }, { 0x62,0xb5,0xd7,0xd7 }, 
+    { 0xe6,0x4d,0xab,0xab }, { 0x9a,0xec,0x76,0x76 }, 
+    { 0x45,0x8f,0xca,0xca }, { 0x9d,0x1f,0x82,0x82 }, 
+    { 0x40,0x89,0xc9,0xc9 }, { 0x87,0xfa,0x7d,0x7d }, 
+    { 0x15,0xef,0xfa,0xfa }, { 0xeb,0xb2,0x59,0x59 }, 
+    { 0xc9,0x8e,0x47,0x47 }, { 0x0b,0xfb,0xf0,0xf0 }, 
+    { 0xec,0x41,0xad,0xad }, { 0x67,0xb3,0xd4,0xd4 }, 
+    { 0xfd,0x5f,0xa2,0xa2 }, { 0xea,0x45,0xaf,0xaf }, 
+    { 0xbf,0x23,0x9c,0x9c }, { 0xf7,0x53,0xa4,0xa4 }, 
+    { 0x96,0xe4,0x72,0x72 }, { 0x5b,0x9b,0xc0,0xc0 }, 
+    { 0xc2,0x75,0xb7,0xb7 }, { 0x1c,0xe1,0xfd,0xfd }, 
+    { 0xae,0x3d,0x93,0x93 }, { 0x6a,0x4c,0x26,0x26 }, 
+    { 0x5a,0x6c,0x36,0x36 }, { 0x41,0x7e,0x3f,0x3f },
+    { 0x02,0xf5,0xf7,0xf7 }, { 0x4f,0x83,0xcc,0xcc }, 
+    { 0x5c,0x68,0x34,0x34 }, { 0xf4,0x51,0xa5,0xa5 },
+    { 0x34,0xd1,0xe5,0xe5 }, { 0x08,0xf9,0xf1,0xf1 }, 
+    { 0x93,0xe2,0x71,0x71 }, { 0x73,0xab,0xd8,0xd8 },
+    { 0x53,0x62,0x31,0x31 }, { 0x3f,0x2a,0x15,0x15 }, 
+    { 0x0c,0x08,0x04,0x04 }, { 0x52,0x95,0xc7,0xc7 }, 
+    { 0x65,0x46,0x23,0x23 }, { 0x5e,0x9d,0xc3,0xc3 }, 
+    { 0x28,0x30,0x18,0x18 }, { 0xa1,0x37,0x96,0x96 }, 
+    { 0x0f,0x0a,0x05,0x05 }, { 0xb5,0x2f,0x9a,0x9a }, 
+    { 0x09,0x0e,0x07,0x07 }, { 0x36,0x24,0x12,0x12 },
+    { 0x9b,0x1b,0x80,0x80 }, { 0x3d,0xdf,0xe2,0xe2 }, 
+    { 0x26,0xcd,0xeb,0xeb }, { 0x69,0x4e,0x27,0x27 }, 
+    { 0xcd,0x7f,0xb2,0xb2 }, { 0x9f,0xea,0x75,0x75 }, 
+    { 0x1b,0x12,0x09,0x09 }, { 0x9e,0x1d,0x83,0x83 },
+    { 0x74,0x58,0x2c,0x2c }, { 0x2e,0x34,0x1a,0x1a }, 
+    { 0x2d,0x36,0x1b,0x1b }, { 0xb2,0xdc,0x6e,0x6e },
+    { 0xee,0xb4,0x5a,0x5a }, { 0xfb,0x5b,0xa0,0xa0 }, 
+    { 0xf6,0xa4,0x52,0x52 }, { 0x4d,0x76,0x3b,0x3b },
+    { 0x61,0xb7,0xd6,0xd6 }, { 0xce,0x7d,0xb3,0xb3 }, 
+    { 0x7b,0x52,0x29,0x29 }, { 0x3e,0xdd,0xe3,0xe3 }, 
+    { 0x71,0x5e,0x2f,0x2f }, { 0x97,0x13,0x84,0x84 }, 
+    { 0xf5,0xa6,0x53,0x53 }, { 0x68,0xb9,0xd1,0xd1 }, 
+    { 0x00,0x00,0x00,0x00 }, { 0x2c,0xc1,0xed,0xed }, 
+    { 0x60,0x40,0x20,0x20 }, { 0x1f,0xe3,0xfc,0xfc }, 
+    { 0xc8,0x79,0xb1,0xb1 }, { 0xed,0xb6,0x5b,0x5b }, 
+    { 0xbe,0xd4,0x6a,0x6a }, { 0x46,0x8d,0xcb,0xcb }, 
+    { 0xd9,0x67,0xbe,0xbe }, { 0x4b,0x72,0x39,0x39 }, 
+    { 0xde,0x94,0x4a,0x4a }, { 0xd4,0x98,0x4c,0x4c }, 
+    { 0xe8,0xb0,0x58,0x58 }, { 0x4a,0x85,0xcf,0xcf }, 
+    { 0x6b,0xbb,0xd0,0xd0 }, { 0x2a,0xc5,0xef,0xef },
+    { 0xe5,0x4f,0xaa,0xaa }, { 0x16,0xed,0xfb,0xfb }, 
+    { 0xc5,0x86,0x43,0x43 }, { 0xd7,0x9a,0x4d,0x4d }, 
+    { 0x55,0x66,0x33,0x33 }, { 0x94,0x11,0x85,0x85 }, 
+    { 0xcf,0x8a,0x45,0x45 }, { 0x10,0xe9,0xf9,0xf9 }, 
+    { 0x06,0x04,0x02,0x02 }, { 0x81,0xfe,0x7f,0x7f }, 
+    { 0xf0,0xa0,0x50,0x50 }, { 0x44,0x78,0x3c,0x3c },
+    { 0xba,0x25,0x9f,0x9f }, { 0xe3,0x4b,0xa8,0xa8 }, 
+    { 0xf3,0xa2,0x51,0x51 }, { 0xfe,0x5d,0xa3,0xa3 },
+    { 0xc0,0x80,0x40,0x40 }, { 0x8a,0x05,0x8f,0x8f }, 
+    { 0xad,0x3f,0x92,0x92 }, { 0xbc,0x21,0x9d,0x9d },
+    { 0x48,0x70,0x38,0x38 }, { 0x04,0xf1,0xf5,0xf5 }, 
+    { 0xdf,0x63,0xbc,0xbc }, { 0xc1,0x77,0xb6,0xb6 },
+    { 0x75,0xaf,0xda,0xda }, { 0x63,0x42,0x21,0x21 }, 
+    { 0x30,0x20,0x10,0x10 }, { 0x1a,0xe5,0xff,0xff },
+    { 0x0e,0xfd,0xf3,0xf3 }, { 0x6d,0xbf,0xd2,0xd2 }, 
+    { 0x4c,0x81,0xcd,0xcd }, { 0x14,0x18,0x0c,0x0c },
+    { 0x35,0x26,0x13,0x13 }, { 0x2f,0xc3,0xec,0xec }, 
+    { 0xe1,0xbe,0x5f,0x5f }, { 0xa2,0x35,0x97,0x97 },
+    { 0xcc,0x88,0x44,0x44 }, { 0x39,0x2e,0x17,0x17 }, 
+    { 0x57,0x93,0xc4,0xc4 }, { 0xf2,0x55,0xa7,0xa7 },
+    { 0x82,0xfc,0x7e,0x7e }, { 0x47,0x7a,0x3d,0x3d }, 
+    { 0xac,0xc8,0x64,0x64 }, { 0xe7,0xba,0x5d,0x5d },
+    { 0x2b,0x32,0x19,0x19 }, { 0x95,0xe6,0x73,0x73 }, 
+    { 0xa0,0xc0,0x60,0x60 }, { 0x98,0x19,0x81,0x81 }, 
+    { 0xd1,0x9e,0x4f,0x4f }, { 0x7f,0xa3,0xdc,0xdc }, 
+    { 0x66,0x44,0x22,0x22 }, { 0x7e,0x54,0x2a,0x2a }, 
+    { 0xab,0x3b,0x90,0x90 }, { 0x83,0x0b,0x88,0x88 }, 
+    { 0xca,0x8c,0x46,0x46 }, { 0x29,0xc7,0xee,0xee },
+    { 0xd3,0x6b,0xb8,0xb8 }, { 0x3c,0x28,0x14,0x14 }, 
+    { 0x79,0xa7,0xde,0xde }, { 0xe2,0xbc,0x5e,0x5e },
+    { 0x1d,0x16,0x0b,0x0b }, { 0x76,0xad,0xdb,0xdb }, 
+    { 0x3b,0xdb,0xe0,0xe0 }, { 0x56,0x64,0x32,0x32 },
+    { 0x4e,0x74,0x3a,0x3a }, { 0x1e,0x14,0x0a,0x0a }, 
+    { 0xdb,0x92,0x49,0x49 }, { 0x0a,0x0c,0x06,0x06 },
+    { 0x6c,0x48,0x24,0x24 }, { 0xe4,0xb8,0x5c,0x5c }, 
+    { 0x5d,0x9f,0xc2,0xc2 }, { 0x6e,0xbd,0xd3,0xd3 }, 
+    { 0xef,0x43,0xac,0xac }, { 0xa6,0xc4,0x62,0x62 }, 
+    { 0xa8,0x39,0x91,0x91 }, { 0xa4,0x31,0x95,0x95 },
+    { 0x37,0xd3,0xe4,0xe4 }, { 0x8b,0xf2,0x79,0x79 }, 
+    { 0x32,0xd5,0xe7,0xe7 }, { 0x43,0x8b,0xc8,0xc8 },
+    { 0x59,0x6e,0x37,0x37 }, { 0xb7,0xda,0x6d,0x6d }, 
+    { 0x8c,0x01,0x8d,0x8d }, { 0x64,0xb1,0xd5,0xd5 },
+    { 0xd2,0x9c,0x4e,0x4e }, { 0xe0,0x49,0xa9,0xa9 }, 
+    { 0xb4,0xd8,0x6c,0x6c }, { 0xfa,0xac,0x56,0x56 },
+    { 0x07,0xf3,0xf4,0xf4 }, { 0x25,0xcf,0xea,0xea }, 
+    { 0xaf,0xca,0x65,0x65 }, { 0x8e,0xf4,0x7a,0x7a },
+    { 0xe9,0x47,0xae,0xae }, { 0x18,0x10,0x08,0x08 }, 
+    { 0xd5,0x6f,0xba,0xba }, { 0x88,0xf0,0x78,0x78 }, 
+    { 0x6f,0x4a,0x25,0x25 }, { 0x72,0x5c,0x2e,0x2e }, 
+    { 0x24,0x38,0x1c,0x1c }, { 0xf1,0x57,0xa6,0xa6 }, 
+    { 0xc7,0x73,0xb4,0xb4 }, { 0x51,0x97,0xc6,0xc6 }, 
+    { 0x23,0xcb,0xe8,0xe8 }, { 0x7c,0xa1,0xdd,0xdd },
+    { 0x9c,0xe8,0x74,0x74 }, { 0x21,0x3e,0x1f,0x1f }, 
+    { 0xdd,0x96,0x4b,0x4b }, { 0xdc,0x61,0xbd,0xbd },
+    { 0x86,0x0d,0x8b,0x8b }, { 0x85,0x0f,0x8a,0x8a }, 
+    { 0x90,0xe0,0x70,0x70 }, { 0x42,0x7c,0x3e,0x3e }, 
+    { 0xc4,0x71,0xb5,0xb5 }, { 0xaa,0xcc,0x66,0x66 }, 
+    { 0xd8,0x90,0x48,0x48 }, { 0x05,0x06,0x03,0x03 },
+    { 0x01,0xf7,0xf6,0xf6 }, { 0x12,0x1c,0x0e,0x0e }, 
+    { 0xa3,0xc2,0x61,0x61 }, { 0x5f,0x6a,0x35,0x35 },
+    { 0xf9,0xae,0x57,0x57 }, { 0xd0,0x69,0xb9,0xb9 }, 
+    { 0x91,0x17,0x86,0x86 }, { 0x58,0x99,0xc1,0xc1 }, 
+    { 0x27,0x3a,0x1d,0x1d }, { 0xb9,0x27,0x9e,0x9e }, 
+    { 0x38,0xd9,0xe1,0xe1 }, { 0x13,0xeb,0xf8,0xf8 },
+    { 0xb3,0x2b,0x98,0x98 }, { 0x33,0x22,0x11,0x11 }, 
+    { 0xbb,0xd2,0x69,0x69 }, { 0x70,0xa9,0xd9,0xd9 },
+    { 0x89,0x07,0x8e,0x8e }, { 0xa7,0x33,0x94,0x94 }, 
+    { 0xb6,0x2d,0x9b,0x9b }, { 0x22,0x3c,0x1e,0x1e },
+    { 0x92,0x15,0x87,0x87 }, { 0x20,0xc9,0xe9,0xe9 }, 
+    { 0x49,0x87,0xce,0xce }, { 0xff,0xaa,0x55,0x55 },
+    { 0x78,0x50,0x28,0x28 }, { 0x7a,0xa5,0xdf,0xdf }, 
+    { 0x8f,0x03,0x8c,0x8c }, { 0xf8,0x59,0xa1,0xa1 }, 
+    { 0x80,0x09,0x89,0x89 }, { 0x17,0x1a,0x0d,0x0d }, 
+    { 0xda,0x65,0xbf,0xbf }, { 0x31,0xd7,0xe6,0xe6 },
+    { 0xc6,0x84,0x42,0x42 }, { 0xb8,0xd0,0x68,0x68 }, 
+    { 0xc3,0x82,0x41,0x41 }, { 0xb0,0x29,0x99,0x99 }, 
+    { 0x77,0x5a,0x2d,0x2d }, { 0x11,0x1e,0x0f,0x0f }, 
+    { 0xcb,0x7b,0xb0,0xb0 }, { 0xfc,0xa8,0x54,0x54 }, 
+    { 0xd6,0x6d,0xbb,0xbb }, { 0x3a,0x2c,0x16,0x16 }
+};
+
+static const byte T3[256][4] = {
+    { 0x63,0xa5,0xc6,0x63 }, { 0x7c,0x84,0xf8,0x7c },
+    { 0x77,0x99,0xee,0x77 }, { 0x7b,0x8d,0xf6,0x7b }, 
+    { 0xf2,0x0d,0xff,0xf2 }, { 0x6b,0xbd,0xd6,0x6b },
+    { 0x6f,0xb1,0xde,0x6f }, { 0xc5,0x54,0x91,0xc5 }, 
+    { 0x30,0x50,0x60,0x30 }, { 0x01,0x03,0x02,0x01 },
+    { 0x67,0xa9,0xce,0x67 }, { 0x2b,0x7d,0x56,0x2b }, 
+    { 0xfe,0x19,0xe7,0xfe }, { 0xd7,0x62,0xb5,0xd7 }, 
+    { 0xab,0xe6,0x4d,0xab }, { 0x76,0x9a,0xec,0x76 }, 
+    { 0xca,0x45,0x8f,0xca }, { 0x82,0x9d,0x1f,0x82 },
+    { 0xc9,0x40,0x89,0xc9 }, { 0x7d,0x87,0xfa,0x7d }, 
+    { 0xfa,0x15,0xef,0xfa }, { 0x59,0xeb,0xb2,0x59 }, 
+    { 0x47,0xc9,0x8e,0x47 }, { 0xf0,0x0b,0xfb,0xf0 }, 
+    { 0xad,0xec,0x41,0xad }, { 0xd4,0x67,0xb3,0xd4 }, 
+    { 0xa2,0xfd,0x5f,0xa2 }, { 0xaf,0xea,0x45,0xaf }, 
+    { 0x9c,0xbf,0x23,0x9c }, { 0xa4,0xf7,0x53,0xa4 },
+    { 0x72,0x96,0xe4,0x72 }, { 0xc0,0x5b,0x9b,0xc0 }, 
+    { 0xb7,0xc2,0x75,0xb7 }, { 0xfd,0x1c,0xe1,0xfd }, 
+    { 0x93,0xae,0x3d,0x93 }, { 0x26,0x6a,0x4c,0x26 }, 
+    { 0x36,0x5a,0x6c,0x36 }, { 0x3f,0x41,0x7e,0x3f },
+    { 0xf7,0x02,0xf5,0xf7 }, { 0xcc,0x4f,0x83,0xcc }, 
+    { 0x34,0x5c,0x68,0x34 }, { 0xa5,0xf4,0x51,0xa5 },
+    { 0xe5,0x34,0xd1,0xe5 }, { 0xf1,0x08,0xf9,0xf1 }, 
+    { 0x71,0x93,0xe2,0x71 }, { 0xd8,0x73,0xab,0xd8 },
+    { 0x31,0x53,0x62,0x31 }, { 0x15,0x3f,0x2a,0x15 }, 
+    { 0x04,0x0c,0x08,0x04 }, { 0xc7,0x52,0x95,0xc7 }, 
+    { 0x23,0x65,0x46,0x23 }, { 0xc3,0x5e,0x9d,0xc3 }, 
+    { 0x18,0x28,0x30,0x18 }, { 0x96,0xa1,0x37,0x96 },
+    { 0x05,0x0f,0x0a,0x05 }, { 0x9a,0xb5,0x2f,0x9a }, 
+    { 0x07,0x09,0x0e,0x07 }, { 0x12,0x36,0x24,0x12 }, 
+    { 0x80,0x9b,0x1b,0x80 }, { 0xe2,0x3d,0xdf,0xe2 }, 
+    { 0xeb,0x26,0xcd,0xeb }, { 0x27,0x69,0x4e,0x27 },
+    { 0xb2,0xcd,0x7f,0xb2 }, { 0x75,0x9f,0xea,0x75 }, 
+    { 0x09,0x1b,0x12,0x09 }, { 0x83,0x9e,0x1d,0x83 },
+    { 0x2c,0x74,0x58,0x2c }, { 0x1a,0x2e,0x34,0x1a }, 
+    { 0x1b,0x2d,0x36,0x1b }, { 0x6e,0xb2,0xdc,0x6e },
+    { 0x5a,0xee,0xb4,0x5a }, { 0xa0,0xfb,0x5b,0xa0 }, 
+    { 0x52,0xf6,0xa4,0x52 }, { 0x3b,0x4d,0x76,0x3b },
+    { 0xd6,0x61,0xb7,0xd6 }, { 0xb3,0xce,0x7d,0xb3 }, 
+    { 0x29,0x7b,0x52,0x29 }, { 0xe3,0x3e,0xdd,0xe3 }, 
+    { 0x2f,0x71,0x5e,0x2f }, { 0x84,0x97,0x13,0x84 }, 
+    { 0x53,0xf5,0xa6,0x53 }, { 0xd1,0x68,0xb9,0xd1 },
+    { 0x00,0x00,0x00,0x00 }, { 0xed,0x2c,0xc1,0xed }, 
+    { 0x20,0x60,0x40,0x20 }, { 0xfc,0x1f,0xe3,0xfc },
+    { 0xb1,0xc8,0x79,0xb1 }, { 0x5b,0xed,0xb6,0x5b }, 
+    { 0x6a,0xbe,0xd4,0x6a }, { 0xcb,0x46,0x8d,0xcb },
+    { 0xbe,0xd9,0x67,0xbe }, { 0x39,0x4b,0x72,0x39 }, 
+    { 0x4a,0xde,0x94,0x4a }, { 0x4c,0xd4,0x98,0x4c },
+    { 0x58,0xe8,0xb0,0x58 }, { 0xcf,0x4a,0x85,0xcf }, 
+    { 0xd0,0x6b,0xbb,0xd0 }, { 0xef,0x2a,0xc5,0xef },
+    { 0xaa,0xe5,0x4f,0xaa }, { 0xfb,0x16,0xed,0xfb }, 
+    { 0x43,0xc5,0x86,0x43 }, { 0x4d,0xd7,0x9a,0x4d },
+    { 0x33,0x55,0x66,0x33 }, { 0x85,0x94,0x11,0x85 }, 
+    { 0x45,0xcf,0x8a,0x45 }, { 0xf9,0x10,0xe9,0xf9 },
+    { 0x02,0x06,0x04,0x02 }, { 0x7f,0x81,0xfe,0x7f }, 
+    { 0x50,0xf0,0xa0,0x50 }, { 0x3c,0x44,0x78,0x3c },
+    { 0x9f,0xba,0x25,0x9f }, { 0xa8,0xe3,0x4b,0xa8 }, 
+    { 0x51,0xf3,0xa2,0x51 }, { 0xa3,0xfe,0x5d,0xa3 },
+    { 0x40,0xc0,0x80,0x40 }, { 0x8f,0x8a,0x05,0x8f }, 
+    { 0x92,0xad,0x3f,0x92 }, { 0x9d,0xbc,0x21,0x9d },
+    { 0x38,0x48,0x70,0x38 }, { 0xf5,0x04,0xf1,0xf5 }, 
+    { 0xbc,0xdf,0x63,0xbc }, { 0xb6,0xc1,0x77,0xb6 },
+    { 0xda,0x75,0xaf,0xda }, { 0x21,0x63,0x42,0x21 }, 
+    { 0x10,0x30,0x20,0x10 }, { 0xff,0x1a,0xe5,0xff },
+    { 0xf3,0x0e,0xfd,0xf3 }, { 0xd2,0x6d,0xbf,0xd2 }, 
+    { 0xcd,0x4c,0x81,0xcd }, { 0x0c,0x14,0x18,0x0c }, 
+    { 0x13,0x35,0x26,0x13 }, { 0xec,0x2f,0xc3,0xec }, 
+    { 0x5f,0xe1,0xbe,0x5f }, { 0x97,0xa2,0x35,0x97 },
+    { 0x44,0xcc,0x88,0x44 }, { 0x17,0x39,0x2e,0x17 }, 
+    { 0xc4,0x57,0x93,0xc4 }, { 0xa7,0xf2,0x55,0xa7 },
+    { 0x7e,0x82,0xfc,0x7e }, { 0x3d,0x47,0x7a,0x3d }, 
+    { 0x64,0xac,0xc8,0x64 }, { 0x5d,0xe7,0xba,0x5d },
+    { 0x19,0x2b,0x32,0x19 }, { 0x73,0x95,0xe6,0x73 }, 
+    { 0x60,0xa0,0xc0,0x60 }, { 0x81,0x98,0x19,0x81 },
+    { 0x4f,0xd1,0x9e,0x4f }, { 0xdc,0x7f,0xa3,0xdc }, 
+    { 0x22,0x66,0x44,0x22 }, { 0x2a,0x7e,0x54,0x2a },
+    { 0x90,0xab,0x3b,0x90 }, { 0x88,0x83,0x0b,0x88 }, 
+    { 0x46,0xca,0x8c,0x46 }, { 0xee,0x29,0xc7,0xee },
+    { 0xb8,0xd3,0x6b,0xb8 }, { 0x14,0x3c,0x28,0x14 }, 
+    { 0xde,0x79,0xa7,0xde }, { 0x5e,0xe2,0xbc,0x5e }, 
+    { 0x0b,0x1d,0x16,0x0b }, { 0xdb,0x76,0xad,0xdb }, 
+    { 0xe0,0x3b,0xdb,0xe0 }, { 0x32,0x56,0x64,0x32 },
+    { 0x3a,0x4e,0x74,0x3a }, { 0x0a,0x1e,0x14,0x0a }, 
+    { 0x49,0xdb,0x92,0x49 }, { 0x06,0x0a,0x0c,0x06 },
+    { 0x24,0x6c,0x48,0x24 }, { 0x5c,0xe4,0xb8,0x5c }, 
+    { 0xc2,0x5d,0x9f,0xc2 }, { 0xd3,0x6e,0xbd,0xd3 },
+    { 0xac,0xef,0x43,0xac }, { 0x62,0xa6,0xc4,0x62 }, 
+    { 0x91,0xa8,0x39,0x91 }, { 0x95,0xa4,0x31,0x95 },
+    { 0xe4,0x37,0xd3,0xe4 }, { 0x79,0x8b,0xf2,0x79 }, 
+    { 0xe7,0x32,0xd5,0xe7 }, { 0xc8,0x43,0x8b,0xc8 }, 
+    { 0x37,0x59,0x6e,0x37 }, { 0x6d,0xb7,0xda,0x6d }, 
+    { 0x8d,0x8c,0x01,0x8d }, { 0xd5,0x64,0xb1,0xd5 }, 
+    { 0x4e,0xd2,0x9c,0x4e }, { 0xa9,0xe0,0x49,0xa9 }, 
+    { 0x6c,0xb4,0xd8,0x6c }, { 0x56,0xfa,0xac,0x56 },
+    { 0xf4,0x07,0xf3,0xf4 }, { 0xea,0x25,0xcf,0xea }, 
+    { 0x65,0xaf,0xca,0x65 }, { 0x7a,0x8e,0xf4,0x7a }, 
+    { 0xae,0xe9,0x47,0xae }, { 0x08,0x18,0x10,0x08 }, 
+    { 0xba,0xd5,0x6f,0xba }, { 0x78,0x88,0xf0,0x78 }, 
+    { 0x25,0x6f,0x4a,0x25 }, { 0x2e,0x72,0x5c,0x2e }, 
+    { 0x1c,0x24,0x38,0x1c }, { 0xa6,0xf1,0x57,0xa6 }, 
+    { 0xb4,0xc7,0x73,0xb4 }, { 0xc6,0x51,0x97,0xc6 }, 
+    { 0xe8,0x23,0xcb,0xe8 }, { 0xdd,0x7c,0xa1,0xdd },
+    { 0x74,0x9c,0xe8,0x74 }, { 0x1f,0x21,0x3e,0x1f }, 
+    { 0x4b,0xdd,0x96,0x4b }, { 0xbd,0xdc,0x61,0xbd },
+    { 0x8b,0x86,0x0d,0x8b }, { 0x8a,0x85,0x0f,0x8a }, 
+    { 0x70,0x90,0xe0,0x70 }, { 0x3e,0x42,0x7c,0x3e },
+    { 0xb5,0xc4,0x71,0xb5 }, { 0x66,0xaa,0xcc,0x66 }, 
+    { 0x48,0xd8,0x90,0x48 }, { 0x03,0x05,0x06,0x03 },
+    { 0xf6,0x01,0xf7,0xf6 }, { 0x0e,0x12,0x1c,0x0e }, 
+    { 0x61,0xa3,0xc2,0x61 }, { 0x35,0x5f,0x6a,0x35 },
+    { 0x57,0xf9,0xae,0x57 }, { 0xb9,0xd0,0x69,0xb9 }, 
+    { 0x86,0x91,0x17,0x86 }, { 0xc1,0x58,0x99,0xc1 }, 
+    { 0x1d,0x27,0x3a,0x1d }, { 0x9e,0xb9,0x27,0x9e }, 
+    { 0xe1,0x38,0xd9,0xe1 }, { 0xf8,0x13,0xeb,0xf8 },
+    { 0x98,0xb3,0x2b,0x98 }, { 0x11,0x33,0x22,0x11 }, 
+    { 0x69,0xbb,0xd2,0x69 }, { 0xd9,0x70,0xa9,0xd9 },
+    { 0x8e,0x89,0x07,0x8e }, { 0x94,0xa7,0x33,0x94 }, 
+    { 0x9b,0xb6,0x2d,0x9b }, { 0x1e,0x22,0x3c,0x1e },
+    { 0x87,0x92,0x15,0x87 }, { 0xe9,0x20,0xc9,0xe9 }, 
+    { 0xce,0x49,0x87,0xce }, { 0x55,0xff,0xaa,0x55 },
+    { 0x28,0x78,0x50,0x28 }, { 0xdf,0x7a,0xa5,0xdf }, 
+    { 0x8c,0x8f,0x03,0x8c }, { 0xa1,0xf8,0x59,0xa1 },
+    { 0x89,0x80,0x09,0x89 }, { 0x0d,0x17,0x1a,0x0d }, 
+    { 0xbf,0xda,0x65,0xbf }, { 0xe6,0x31,0xd7,0xe6 },
+    { 0x42,0xc6,0x84,0x42 }, { 0x68,0xb8,0xd0,0x68 }, 
+    { 0x41,0xc3,0x82,0x41 }, { 0x99,0xb0,0x29,0x99 },
+    { 0x2d,0x77,0x5a,0x2d }, { 0x0f,0x11,0x1e,0x0f }, 
+    { 0xb0,0xcb,0x7b,0xb0 }, { 0x54,0xfc,0xa8,0x54 },
+    { 0xbb,0xd6,0x6d,0xbb }, { 0x16,0x3a,0x2c,0x16 }
+};
+
+static const byte T4[256][4] = {
+    { 0x63,0x63,0xa5,0xc6 }, { 0x7c,0x7c,0x84,0xf8 },
+    { 0x77,0x77,0x99,0xee }, { 0x7b,0x7b,0x8d,0xf6 }, 
+    { 0xf2,0xf2,0x0d,0xff }, { 0x6b,0x6b,0xbd,0xd6 }, 
+    { 0x6f,0x6f,0xb1,0xde }, { 0xc5,0xc5,0x54,0x91 }, 
+    { 0x30,0x30,0x50,0x60 }, { 0x01,0x01,0x03,0x02 },
+    { 0x67,0x67,0xa9,0xce }, { 0x2b,0x2b,0x7d,0x56 }, 
+    { 0xfe,0xfe,0x19,0xe7 }, { 0xd7,0xd7,0x62,0xb5 },
+    { 0xab,0xab,0xe6,0x4d }, { 0x76,0x76,0x9a,0xec }, 
+    { 0xca,0xca,0x45,0x8f }, { 0x82,0x82,0x9d,0x1f },
+    { 0xc9,0xc9,0x40,0x89 }, { 0x7d,0x7d,0x87,0xfa }, 
+    { 0xfa,0xfa,0x15,0xef }, { 0x59,0x59,0xeb,0xb2 },
+    { 0x47,0x47,0xc9,0x8e }, { 0xf0,0xf0,0x0b,0xfb }, 
+    { 0xad,0xad,0xec,0x41 }, { 0xd4,0xd4,0x67,0xb3 },
+    { 0xa2,0xa2,0xfd,0x5f }, { 0xaf,0xaf,0xea,0x45 }, 
+    { 0x9c,0x9c,0xbf,0x23 }, { 0xa4,0xa4,0xf7,0x53 },
+    { 0x72,0x72,0x96,0xe4 }, { 0xc0,0xc0,0x5b,0x9b }, 
+    { 0xb7,0xb7,0xc2,0x75 }, { 0xfd,0xfd,0x1c,0xe1 },
+    { 0x93,0x93,0xae,0x3d }, { 0x26,0x26,0x6a,0x4c }, 
+    { 0x36,0x36,0x5a,0x6c }, { 0x3f,0x3f,0x41,0x7e },
+    { 0xf7,0xf7,0x02,0xf5 }, { 0xcc,0xcc,0x4f,0x83 }, 
+    { 0x34,0x34,0x5c,0x68 }, { 0xa5,0xa5,0xf4,0x51 },
+    { 0xe5,0xe5,0x34,0xd1 }, { 0xf1,0xf1,0x08,0xf9 }, 
+    { 0x71,0x71,0x93,0xe2 }, { 0xd8,0xd8,0x73,0xab },
+    { 0x31,0x31,0x53,0x62 }, { 0x15,0x15,0x3f,0x2a }, 
+    { 0x04,0x04,0x0c,0x08 }, { 0xc7,0xc7,0x52,0x95 },
+    { 0x23,0x23,0x65,0x46 }, { 0xc3,0xc3,0x5e,0x9d }, 
+    { 0x18,0x18,0x28,0x30 }, { 0x96,0x96,0xa1,0x37 },
+    { 0x05,0x05,0x0f,0x0a }, { 0x9a,0x9a,0xb5,0x2f }, 
+    { 0x07,0x07,0x09,0x0e }, { 0x12,0x12,0x36,0x24 },
+    { 0x80,0x80,0x9b,0x1b }, { 0xe2,0xe2,0x3d,0xdf }, 
+    { 0xeb,0xeb,0x26,0xcd }, { 0x27,0x27,0x69,0x4e },
+    { 0xb2,0xb2,0xcd,0x7f }, { 0x75,0x75,0x9f,0xea }, 
+    { 0x09,0x09,0x1b,0x12 }, { 0x83,0x83,0x9e,0x1d },
+    { 0x2c,0x2c,0x74,0x58 }, { 0x1a,0x1a,0x2e,0x34 }, 
+    { 0x1b,0x1b,0x2d,0x36 }, { 0x6e,0x6e,0xb2,0xdc },
+    { 0x5a,0x5a,0xee,0xb4 }, { 0xa0,0xa0,0xfb,0x5b }, 
+    { 0x52,0x52,0xf6,0xa4 }, { 0x3b,0x3b,0x4d,0x76 },
+    { 0xd6,0xd6,0x61,0xb7 }, { 0xb3,0xb3,0xce,0x7d }, 
+    { 0x29,0x29,0x7b,0x52 }, { 0xe3,0xe3,0x3e,0xdd },
+    { 0x2f,0x2f,0x71,0x5e }, { 0x84,0x84,0x97,0x13 }, 
+    { 0x53,0x53,0xf5,0xa6 }, { 0xd1,0xd1,0x68,0xb9 },
+    { 0x00,0x00,0x00,0x00 }, { 0xed,0xed,0x2c,0xc1 }, 
+    { 0x20,0x20,0x60,0x40 }, { 0xfc,0xfc,0x1f,0xe3 },
+    { 0xb1,0xb1,0xc8,0x79 }, { 0x5b,0x5b,0xed,0xb6 }, 
+    { 0x6a,0x6a,0xbe,0xd4 }, { 0xcb,0xcb,0x46,0x8d },
+    { 0xbe,0xbe,0xd9,0x67 }, { 0x39,0x39,0x4b,0x72 }, 
+    { 0x4a,0x4a,0xde,0x94 }, { 0x4c,0x4c,0xd4,0x98 },
+    { 0x58,0x58,0xe8,0xb0 }, { 0xcf,0xcf,0x4a,0x85 }, 
+    { 0xd0,0xd0,0x6b,0xbb }, { 0xef,0xef,0x2a,0xc5 },
+    { 0xaa,0xaa,0xe5,0x4f }, { 0xfb,0xfb,0x16,0xed }, 
+    { 0x43,0x43,0xc5,0x86 }, { 0x4d,0x4d,0xd7,0x9a },
+    { 0x33,0x33,0x55,0x66 }, { 0x85,0x85,0x94,0x11 }, 
+    { 0x45,0x45,0xcf,0x8a }, { 0xf9,0xf9,0x10,0xe9 },
+    { 0x02,0x02,0x06,0x04 }, { 0x7f,0x7f,0x81,0xfe }, 
+    { 0x50,0x50,0xf0,0xa0 }, { 0x3c,0x3c,0x44,0x78 },
+    { 0x9f,0x9f,0xba,0x25 }, { 0xa8,0xa8,0xe3,0x4b }, 
+    { 0x51,0x51,0xf3,0xa2 }, { 0xa3,0xa3,0xfe,0x5d },
+    { 0x40,0x40,0xc0,0x80 }, { 0x8f,0x8f,0x8a,0x05 }, 
+    { 0x92,0x92,0xad,0x3f }, { 0x9d,0x9d,0xbc,0x21 },
+    { 0x38,0x38,0x48,0x70 }, { 0xf5,0xf5,0x04,0xf1 }, 
+    { 0xbc,0xbc,0xdf,0x63 }, { 0xb6,0xb6,0xc1,0x77 },
+    { 0xda,0xda,0x75,0xaf }, { 0x21,0x21,0x63,0x42 }, 
+    { 0x10,0x10,0x30,0x20 }, { 0xff,0xff,0x1a,0xe5 },
+    { 0xf3,0xf3,0x0e,0xfd }, { 0xd2,0xd2,0x6d,0xbf }, 
+    { 0xcd,0xcd,0x4c,0x81 }, { 0x0c,0x0c,0x14,0x18 },
+    { 0x13,0x13,0x35,0x26 }, { 0xec,0xec,0x2f,0xc3 }, 
+    { 0x5f,0x5f,0xe1,0xbe }, { 0x97,0x97,0xa2,0x35 },
+    { 0x44,0x44,0xcc,0x88 }, { 0x17,0x17,0x39,0x2e }, 
+    { 0xc4,0xc4,0x57,0x93 }, { 0xa7,0xa7,0xf2,0x55 },
+    { 0x7e,0x7e,0x82,0xfc }, { 0x3d,0x3d,0x47,0x7a }, 
+    { 0x64,0x64,0xac,0xc8 }, { 0x5d,0x5d,0xe7,0xba },
+    { 0x19,0x19,0x2b,0x32 }, { 0x73,0x73,0x95,0xe6 }, 
+    { 0x60,0x60,0xa0,0xc0 }, { 0x81,0x81,0x98,0x19 },
+    { 0x4f,0x4f,0xd1,0x9e }, { 0xdc,0xdc,0x7f,0xa3 }, 
+    { 0x22,0x22,0x66,0x44 }, { 0x2a,0x2a,0x7e,0x54 },
+    { 0x90,0x90,0xab,0x3b }, { 0x88,0x88,0x83,0x0b }, 
+    { 0x46,0x46,0xca,0x8c }, { 0xee,0xee,0x29,0xc7 },
+    { 0xb8,0xb8,0xd3,0x6b }, { 0x14,0x14,0x3c,0x28 }, 
+    { 0xde,0xde,0x79,0xa7 }, { 0x5e,0x5e,0xe2,0xbc },
+    { 0x0b,0x0b,0x1d,0x16 }, { 0xdb,0xdb,0x76,0xad }, 
+    { 0xe0,0xe0,0x3b,0xdb }, { 0x32,0x32,0x56,0x64 },
+    { 0x3a,0x3a,0x4e,0x74 }, { 0x0a,0x0a,0x1e,0x14 }, 
+    { 0x49,0x49,0xdb,0x92 }, { 0x06,0x06,0x0a,0x0c },
+    { 0x24,0x24,0x6c,0x48 }, { 0x5c,0x5c,0xe4,0xb8 }, 
+    { 0xc2,0xc2,0x5d,0x9f }, { 0xd3,0xd3,0x6e,0xbd },
+    { 0xac,0xac,0xef,0x43 }, { 0x62,0x62,0xa6,0xc4 }, 
+    { 0x91,0x91,0xa8,0x39 }, { 0x95,0x95,0xa4,0x31 },
+    { 0xe4,0xe4,0x37,0xd3 }, { 0x79,0x79,0x8b,0xf2 }, 
+    { 0xe7,0xe7,0x32,0xd5 }, { 0xc8,0xc8,0x43,0x8b },
+    { 0x37,0x37,0x59,0x6e }, { 0x6d,0x6d,0xb7,0xda }, 
+    { 0x8d,0x8d,0x8c,0x01 }, { 0xd5,0xd5,0x64,0xb1 }, 
+    { 0x4e,0x4e,0xd2,0x9c }, { 0xa9,0xa9,0xe0,0x49 }, 
+    { 0x6c,0x6c,0xb4,0xd8 }, { 0x56,0x56,0xfa,0xac }, 
+    { 0xf4,0xf4,0x07,0xf3 }, { 0xea,0xea,0x25,0xcf }, 
+    { 0x65,0x65,0xaf,0xca }, { 0x7a,0x7a,0x8e,0xf4 }, 
+    { 0xae,0xae,0xe9,0x47 }, { 0x08,0x08,0x18,0x10 }, 
+    { 0xba,0xba,0xd5,0x6f }, { 0x78,0x78,0x88,0xf0 }, 
+    { 0x25,0x25,0x6f,0x4a }, { 0x2e,0x2e,0x72,0x5c }, 
+    { 0x1c,0x1c,0x24,0x38 }, { 0xa6,0xa6,0xf1,0x57 },
+    { 0xb4,0xb4,0xc7,0x73 }, { 0xc6,0xc6,0x51,0x97 }, 
+    { 0xe8,0xe8,0x23,0xcb }, { 0xdd,0xdd,0x7c,0xa1 },
+    { 0x74,0x74,0x9c,0xe8 }, { 0x1f,0x1f,0x21,0x3e }, 
+    { 0x4b,0x4b,0xdd,0x96 }, { 0xbd,0xbd,0xdc,0x61 },
+    { 0x8b,0x8b,0x86,0x0d }, { 0x8a,0x8a,0x85,0x0f }, 
+    { 0x70,0x70,0x90,0xe0 }, { 0x3e,0x3e,0x42,0x7c },
+    { 0xb5,0xb5,0xc4,0x71 }, { 0x66,0x66,0xaa,0xcc }, 
+    { 0x48,0x48,0xd8,0x90 }, { 0x03,0x03,0x05,0x06 },
+    { 0xf6,0xf6,0x01,0xf7 }, { 0x0e,0x0e,0x12,0x1c }, 
+    { 0x61,0x61,0xa3,0xc2 }, { 0x35,0x35,0x5f,0x6a },
+    { 0x57,0x57,0xf9,0xae }, { 0xb9,0xb9,0xd0,0x69 }, 
+    { 0x86,0x86,0x91,0x17 }, { 0xc1,0xc1,0x58,0x99 },
+    { 0x1d,0x1d,0x27,0x3a }, { 0x9e,0x9e,0xb9,0x27 }, 
+    { 0xe1,0xe1,0x38,0xd9 }, { 0xf8,0xf8,0x13,0xeb },
+    { 0x98,0x98,0xb3,0x2b }, { 0x11,0x11,0x33,0x22 }, 
+    { 0x69,0x69,0xbb,0xd2 }, { 0xd9,0xd9,0x70,0xa9 },
+    { 0x8e,0x8e,0x89,0x07 }, { 0x94,0x94,0xa7,0x33 }, 
+    { 0x9b,0x9b,0xb6,0x2d }, { 0x1e,0x1e,0x22,0x3c },
+    { 0x87,0x87,0x92,0x15 }, { 0xe9,0xe9,0x20,0xc9 }, 
+    { 0xce,0xce,0x49,0x87 }, { 0x55,0x55,0xff,0xaa },
+    { 0x28,0x28,0x78,0x50 }, { 0xdf,0xdf,0x7a,0xa5 }, 
+    { 0x8c,0x8c,0x8f,0x03 }, { 0xa1,0xa1,0xf8,0x59 },
+    { 0x89,0x89,0x80,0x09 }, { 0x0d,0x0d,0x17,0x1a }, 
+    { 0xbf,0xbf,0xda,0x65 }, { 0xe6,0xe6,0x31,0xd7 }, 
+    { 0x42,0x42,0xc6,0x84 }, { 0x68,0x68,0xb8,0xd0 }, 
+    { 0x41,0x41,0xc3,0x82 }, { 0x99,0x99,0xb0,0x29 },
+    { 0x2d,0x2d,0x77,0x5a }, { 0x0f,0x0f,0x11,0x1e }, 
+    { 0xb0,0xb0,0xcb,0x7b }, { 0x54,0x54,0xfc,0xa8 },
+    { 0xbb,0xbb,0xd6,0x6d }, { 0x16,0x16,0x3a,0x2c }
+};
+
+static const byte T5[256][4] = {
+    { 0x51,0xf4,0xa7,0x50 }, { 0x7e,0x41,0x65,0x53 }, 
+    { 0x1a,0x17,0xa4,0xc3 }, { 0x3a,0x27,0x5e,0x96 }, 
+    { 0x3b,0xab,0x6b,0xcb }, { 0x1f,0x9d,0x45,0xf1 },
+    { 0xac,0xfa,0x58,0xab }, { 0x4b,0xe3,0x03,0x93 }, 
+    { 0x20,0x30,0xfa,0x55 }, { 0xad,0x76,0x6d,0xf6 },
+    { 0x88,0xcc,0x76,0x91 }, { 0xf5,0x02,0x4c,0x25 }, 
+    { 0x4f,0xe5,0xd7,0xfc }, { 0xc5,0x2a,0xcb,0xd7 },
+    { 0x26,0x35,0x44,0x80 }, { 0xb5,0x62,0xa3,0x8f }, 
+    { 0xde,0xb1,0x5a,0x49 }, { 0x25,0xba,0x1b,0x67 },
+    { 0x45,0xea,0x0e,0x98 }, { 0x5d,0xfe,0xc0,0xe1 }, 
+    { 0xc3,0x2f,0x75,0x02 }, { 0x81,0x4c,0xf0,0x12 },
+    { 0x8d,0x46,0x97,0xa3 }, { 0x6b,0xd3,0xf9,0xc6 }, 
+    { 0x03,0x8f,0x5f,0xe7 }, { 0x15,0x92,0x9c,0x95 },
+    { 0xbf,0x6d,0x7a,0xeb }, { 0x95,0x52,0x59,0xda }, 
+    { 0xd4,0xbe,0x83,0x2d }, { 0x58,0x74,0x21,0xd3 },
+    { 0x49,0xe0,0x69,0x29 }, { 0x8e,0xc9,0xc8,0x44 }, 
+    { 0x75,0xc2,0x89,0x6a }, { 0xf4,0x8e,0x79,0x78 },
+    { 0x99,0x58,0x3e,0x6b }, { 0x27,0xb9,0x71,0xdd }, 
+    { 0xbe,0xe1,0x4f,0xb6 }, { 0xf0,0x88,0xad,0x17 },
+    { 0xc9,0x20,0xac,0x66 }, { 0x7d,0xce,0x3a,0xb4 }, 
+    { 0x63,0xdf,0x4a,0x18 }, { 0xe5,0x1a,0x31,0x82 },
+    { 0x97,0x51,0x33,0x60 }, { 0x62,0x53,0x7f,0x45 }, 
+    { 0xb1,0x64,0x77,0xe0 }, { 0xbb,0x6b,0xae,0x84 }, 
+    { 0xfe,0x81,0xa0,0x1c }, { 0xf9,0x08,0x2b,0x94 }, 
+    { 0x70,0x48,0x68,0x58 }, { 0x8f,0x45,0xfd,0x19 }, 
+    { 0x94,0xde,0x6c,0x87 }, { 0x52,0x7b,0xf8,0xb7 }, 
+    { 0xab,0x73,0xd3,0x23 }, { 0x72,0x4b,0x02,0xe2 },
+    { 0xe3,0x1f,0x8f,0x57 }, { 0x66,0x55,0xab,0x2a }, 
+    { 0xb2,0xeb,0x28,0x07 }, { 0x2f,0xb5,0xc2,0x03 },
+    { 0x86,0xc5,0x7b,0x9a }, { 0xd3,0x37,0x08,0xa5 }, 
+    { 0x30,0x28,0x87,0xf2 }, { 0x23,0xbf,0xa5,0xb2 },
+    { 0x02,0x03,0x6a,0xba }, { 0xed,0x16,0x82,0x5c }, 
+    { 0x8a,0xcf,0x1c,0x2b }, { 0xa7,0x79,0xb4,0x92 },
+    { 0xf3,0x07,0xf2,0xf0 }, { 0x4e,0x69,0xe2,0xa1 }, 
+    { 0x65,0xda,0xf4,0xcd }, { 0x06,0x05,0xbe,0xd5 },
+    { 0xd1,0x34,0x62,0x1f }, { 0xc4,0xa6,0xfe,0x8a }, 
+    { 0x34,0x2e,0x53,0x9d }, { 0xa2,0xf3,0x55,0xa0 },
+    { 0x05,0x8a,0xe1,0x32 }, { 0xa4,0xf6,0xeb,0x75 }, 
+    { 0x0b,0x83,0xec,0x39 }, { 0x40,0x60,0xef,0xaa },
+    { 0x5e,0x71,0x9f,0x06 }, { 0xbd,0x6e,0x10,0x51 }, 
+    { 0x3e,0x21,0x8a,0xf9 }, { 0x96,0xdd,0x06,0x3d }, 
+    { 0xdd,0x3e,0x05,0xae }, { 0x4d,0xe6,0xbd,0x46 }, 
+    { 0x91,0x54,0x8d,0xb5 }, { 0x71,0xc4,0x5d,0x05 }, 
+    { 0x04,0x06,0xd4,0x6f }, { 0x60,0x50,0x15,0xff }, 
+    { 0x19,0x98,0xfb,0x24 }, { 0xd6,0xbd,0xe9,0x97 },
+    { 0x89,0x40,0x43,0xcc }, { 0x67,0xd9,0x9e,0x77 }, 
+    { 0xb0,0xe8,0x42,0xbd }, { 0x07,0x89,0x8b,0x88 },
+    { 0xe7,0x19,0x5b,0x38 }, { 0x79,0xc8,0xee,0xdb }, 
+    { 0xa1,0x7c,0x0a,0x47 }, { 0x7c,0x42,0x0f,0xe9 },
+    { 0xf8,0x84,0x1e,0xc9 }, { 0x00,0x00,0x00,0x00 }, 
+    { 0x09,0x80,0x86,0x83 }, { 0x32,0x2b,0xed,0x48 },
+    { 0x1e,0x11,0x70,0xac }, { 0x6c,0x5a,0x72,0x4e }, 
+    { 0xfd,0x0e,0xff,0xfb }, { 0x0f,0x85,0x38,0x56 },
+    { 0x3d,0xae,0xd5,0x1e }, { 0x36,0x2d,0x39,0x27 }, 
+    { 0x0a,0x0f,0xd9,0x64 }, { 0x68,0x5c,0xa6,0x21 },
+    { 0x9b,0x5b,0x54,0xd1 }, { 0x24,0x36,0x2e,0x3a }, 
+    { 0x0c,0x0a,0x67,0xb1 }, { 0x93,0x57,0xe7,0x0f },
+    { 0xb4,0xee,0x96,0xd2 }, { 0x1b,0x9b,0x91,0x9e }, 
+    { 0x80,0xc0,0xc5,0x4f }, { 0x61,0xdc,0x20,0xa2 },
+    { 0x5a,0x77,0x4b,0x69 }, { 0x1c,0x12,0x1a,0x16 }, 
+    { 0xe2,0x93,0xba,0x0a }, { 0xc0,0xa0,0x2a,0xe5 }, 
+    { 0x3c,0x22,0xe0,0x43 }, { 0x12,0x1b,0x17,0x1d }, 
+    { 0x0e,0x09,0x0d,0x0b }, { 0xf2,0x8b,0xc7,0xad }, 
+    { 0x2d,0xb6,0xa8,0xb9 }, { 0x14,0x1e,0xa9,0xc8 }, 
+    { 0x57,0xf1,0x19,0x85 }, { 0xaf,0x75,0x07,0x4c }, 
+    { 0xee,0x99,0xdd,0xbb }, { 0xa3,0x7f,0x60,0xfd }, 
+    { 0xf7,0x01,0x26,0x9f }, { 0x5c,0x72,0xf5,0xbc },
+    { 0x44,0x66,0x3b,0xc5 }, { 0x5b,0xfb,0x7e,0x34 }, 
+    { 0x8b,0x43,0x29,0x76 }, { 0xcb,0x23,0xc6,0xdc },
+    { 0xb6,0xed,0xfc,0x68 }, { 0xb8,0xe4,0xf1,0x63 }, 
+    { 0xd7,0x31,0xdc,0xca }, { 0x42,0x63,0x85,0x10 },
+    { 0x13,0x97,0x22,0x40 }, { 0x84,0xc6,0x11,0x20 }, 
+    { 0x85,0x4a,0x24,0x7d }, { 0xd2,0xbb,0x3d,0xf8 }, 
+    { 0xae,0xf9,0x32,0x11 }, { 0xc7,0x29,0xa1,0x6d }, 
+    { 0x1d,0x9e,0x2f,0x4b }, { 0xdc,0xb2,0x30,0xf3 },
+    { 0x0d,0x86,0x52,0xec }, { 0x77,0xc1,0xe3,0xd0 }, 
+    { 0x2b,0xb3,0x16,0x6c }, { 0xa9,0x70,0xb9,0x99 },
+    { 0x11,0x94,0x48,0xfa }, { 0x47,0xe9,0x64,0x22 }, 
+    { 0xa8,0xfc,0x8c,0xc4 }, { 0xa0,0xf0,0x3f,0x1a },
+    { 0x56,0x7d,0x2c,0xd8 }, { 0x22,0x33,0x90,0xef }, 
+    { 0x87,0x49,0x4e,0xc7 }, { 0xd9,0x38,0xd1,0xc1 }, 
+    { 0x8c,0xca,0xa2,0xfe }, { 0x98,0xd4,0x0b,0x36 }, 
+    { 0xa6,0xf5,0x81,0xcf }, { 0xa5,0x7a,0xde,0x28 }, 
+    { 0xda,0xb7,0x8e,0x26 }, { 0x3f,0xad,0xbf,0xa4 }, 
+    { 0x2c,0x3a,0x9d,0xe4 }, { 0x50,0x78,0x92,0x0d }, 
+    { 0x6a,0x5f,0xcc,0x9b }, { 0x54,0x7e,0x46,0x62 }, 
+    { 0xf6,0x8d,0x13,0xc2 }, { 0x90,0xd8,0xb8,0xe8 }, 
+    { 0x2e,0x39,0xf7,0x5e }, { 0x82,0xc3,0xaf,0xf5 }, 
+    { 0x9f,0x5d,0x80,0xbe }, { 0x69,0xd0,0x93,0x7c },
+    { 0x6f,0xd5,0x2d,0xa9 }, { 0xcf,0x25,0x12,0xb3 }, 
+    { 0xc8,0xac,0x99,0x3b }, { 0x10,0x18,0x7d,0xa7 },
+    { 0xe8,0x9c,0x63,0x6e }, { 0xdb,0x3b,0xbb,0x7b }, 
+    { 0xcd,0x26,0x78,0x09 }, { 0x6e,0x59,0x18,0xf4 },
+    { 0xec,0x9a,0xb7,0x01 }, { 0x83,0x4f,0x9a,0xa8 }, 
+    { 0xe6,0x95,0x6e,0x65 }, { 0xaa,0xff,0xe6,0x7e }, 
+    { 0x21,0xbc,0xcf,0x08 }, { 0xef,0x15,0xe8,0xe6 }, 
+    { 0xba,0xe7,0x9b,0xd9 }, { 0x4a,0x6f,0x36,0xce }, 
+    { 0xea,0x9f,0x09,0xd4 }, { 0x29,0xb0,0x7c,0xd6 }, 
+    { 0x31,0xa4,0xb2,0xaf }, { 0x2a,0x3f,0x23,0x31 }, 
+    { 0xc6,0xa5,0x94,0x30 }, { 0x35,0xa2,0x66,0xc0 }, 
+    { 0x74,0x4e,0xbc,0x37 }, { 0xfc,0x82,0xca,0xa6 }, 
+    { 0xe0,0x90,0xd0,0xb0 }, { 0x33,0xa7,0xd8,0x15 }, 
+    { 0xf1,0x04,0x98,0x4a }, { 0x41,0xec,0xda,0xf7 },
+    { 0x7f,0xcd,0x50,0x0e }, { 0x17,0x91,0xf6,0x2f }, 
+    { 0x76,0x4d,0xd6,0x8d }, { 0x43,0xef,0xb0,0x4d },
+    { 0xcc,0xaa,0x4d,0x54 }, { 0xe4,0x96,0x04,0xdf }, 
+    { 0x9e,0xd1,0xb5,0xe3 }, { 0x4c,0x6a,0x88,0x1b },
+    { 0xc1,0x2c,0x1f,0xb8 }, { 0x46,0x65,0x51,0x7f }, 
+    { 0x9d,0x5e,0xea,0x04 }, { 0x01,0x8c,0x35,0x5d },
+    { 0xfa,0x87,0x74,0x73 }, { 0xfb,0x0b,0x41,0x2e }, 
+    { 0xb3,0x67,0x1d,0x5a }, { 0x92,0xdb,0xd2,0x52 },
+    { 0xe9,0x10,0x56,0x33 }, { 0x6d,0xd6,0x47,0x13 }, 
+    { 0x9a,0xd7,0x61,0x8c }, { 0x37,0xa1,0x0c,0x7a },
+    { 0x59,0xf8,0x14,0x8e }, { 0xeb,0x13,0x3c,0x89 }, 
+    { 0xce,0xa9,0x27,0xee }, { 0xb7,0x61,0xc9,0x35 },
+    { 0xe1,0x1c,0xe5,0xed }, { 0x7a,0x47,0xb1,0x3c }, 
+    { 0x9c,0xd2,0xdf,0x59 }, { 0x55,0xf2,0x73,0x3f }, 
+    { 0x18,0x14,0xce,0x79 }, { 0x73,0xc7,0x37,0xbf }, 
+    { 0x53,0xf7,0xcd,0xea }, { 0x5f,0xfd,0xaa,0x5b },
+    { 0xdf,0x3d,0x6f,0x14 }, { 0x78,0x44,0xdb,0x86 }, 
+    { 0xca,0xaf,0xf3,0x81 }, { 0xb9,0x68,0xc4,0x3e }, 
+    { 0x38,0x24,0x34,0x2c }, { 0xc2,0xa3,0x40,0x5f }, 
+    { 0x16,0x1d,0xc3,0x72 }, { 0xbc,0xe2,0x25,0x0c }, 
+    { 0x28,0x3c,0x49,0x8b }, { 0xff,0x0d,0x95,0x41 }, 
+    { 0x39,0xa8,0x01,0x71 }, { 0x08,0x0c,0xb3,0xde }, 
+    { 0xd8,0xb4,0xe4,0x9c }, { 0x64,0x56,0xc1,0x90 }, 
+    { 0x7b,0xcb,0x84,0x61 }, { 0xd5,0x32,0xb6,0x70 },
+    { 0x48,0x6c,0x5c,0x74 }, { 0xd0,0xb8,0x57,0x42 }
+};
+
+static const byte T6[256][4] = {
+    { 0x50,0x51,0xf4,0xa7 }, { 0x53,0x7e,0x41,0x65 }, 
+    { 0xc3,0x1a,0x17,0xa4 }, { 0x96,0x3a,0x27,0x5e }, 
+    { 0xcb,0x3b,0xab,0x6b }, { 0xf1,0x1f,0x9d,0x45 },
+    { 0xab,0xac,0xfa,0x58 }, { 0x93,0x4b,0xe3,0x03 }, 
+    { 0x55,0x20,0x30,0xfa }, { 0xf6,0xad,0x76,0x6d },
+    { 0x91,0x88,0xcc,0x76 }, { 0x25,0xf5,0x02,0x4c }, 
+    { 0xfc,0x4f,0xe5,0xd7 }, { 0xd7,0xc5,0x2a,0xcb },
+    { 0x80,0x26,0x35,0x44 }, { 0x8f,0xb5,0x62,0xa3 }, 
+    { 0x49,0xde,0xb1,0x5a }, { 0x67,0x25,0xba,0x1b }, 
+    { 0x98,0x45,0xea,0x0e }, { 0xe1,0x5d,0xfe,0xc0 }, 
+    { 0x02,0xc3,0x2f,0x75 }, { 0x12,0x81,0x4c,0xf0 },
+    { 0xa3,0x8d,0x46,0x97 }, { 0xc6,0x6b,0xd3,0xf9 }, 
+    { 0xe7,0x03,0x8f,0x5f }, { 0x95,0x15,0x92,0x9c },
+    { 0xeb,0xbf,0x6d,0x7a }, { 0xda,0x95,0x52,0x59 }, 
+    { 0x2d,0xd4,0xbe,0x83 }, { 0xd3,0x58,0x74,0x21 },
+    { 0x29,0x49,0xe0,0x69 }, { 0x44,0x8e,0xc9,0xc8 }, 
+    { 0x6a,0x75,0xc2,0x89 }, { 0x78,0xf4,0x8e,0x79 },
+    { 0x6b,0x99,0x58,0x3e }, { 0xdd,0x27,0xb9,0x71 }, 
+    { 0xb6,0xbe,0xe1,0x4f }, { 0x17,0xf0,0x88,0xad },
+    { 0x66,0xc9,0x20,0xac }, { 0xb4,0x7d,0xce,0x3a }, 
+    { 0x18,0x63,0xdf,0x4a }, { 0x82,0xe5,0x1a,0x31 },
+    { 0x60,0x97,0x51,0x33 }, { 0x45,0x62,0x53,0x7f }, 
+    { 0xe0,0xb1,0x64,0x77 }, { 0x84,0xbb,0x6b,0xae },
+    { 0x1c,0xfe,0x81,0xa0 }, { 0x94,0xf9,0x08,0x2b }, 
+    { 0x58,0x70,0x48,0x68 }, { 0x19,0x8f,0x45,0xfd },
+    { 0x87,0x94,0xde,0x6c }, { 0xb7,0x52,0x7b,0xf8 }, 
+    { 0x23,0xab,0x73,0xd3 }, { 0xe2,0x72,0x4b,0x02 },
+    { 0x57,0xe3,0x1f,0x8f }, { 0x2a,0x66,0x55,0xab }, 
+    { 0x07,0xb2,0xeb,0x28 }, { 0x03,0x2f,0xb5,0xc2 },
+    { 0x9a,0x86,0xc5,0x7b }, { 0xa5,0xd3,0x37,0x08 }, 
+    { 0xf2,0x30,0x28,0x87 }, { 0xb2,0x23,0xbf,0xa5 },
+    { 0xba,0x02,0x03,0x6a }, { 0x5c,0xed,0x16,0x82 }, 
+    { 0x2b,0x8a,0xcf,0x1c }, { 0x92,0xa7,0x79,0xb4 },
+    { 0xf0,0xf3,0x07,0xf2 }, { 0xa1,0x4e,0x69,0xe2 }, 
+    { 0xcd,0x65,0xda,0xf4 }, { 0xd5,0x06,0x05,0xbe },
+    { 0x1f,0xd1,0x34,0x62 }, { 0x8a,0xc4,0xa6,0xfe }, 
+    { 0x9d,0x34,0x2e,0x53 }, { 0xa0,0xa2,0xf3,0x55 },
+    { 0x32,0x05,0x8a,0xe1 }, { 0x75,0xa4,0xf6,0xeb }, 
+    { 0x39,0x0b,0x83,0xec }, { 0xaa,0x40,0x60,0xef },
+    { 0x06,0x5e,0x71,0x9f }, { 0x51,0xbd,0x6e,0x10 }, 
+    { 0xf9,0x3e,0x21,0x8a }, { 0x3d,0x96,0xdd,0x06 },
+    { 0xae,0xdd,0x3e,0x05 }, { 0x46,0x4d,0xe6,0xbd }, 
+    { 0xb5,0x91,0x54,0x8d }, { 0x05,0x71,0xc4,0x5d },
+    { 0x6f,0x04,0x06,0xd4 }, { 0xff,0x60,0x50,0x15 }, 
+    { 0x24,0x19,0x98,0xfb }, { 0x97,0xd6,0xbd,0xe9 },
+    { 0xcc,0x89,0x40,0x43 }, { 0x77,0x67,0xd9,0x9e }, 
+    { 0xbd,0xb0,0xe8,0x42 }, { 0x88,0x07,0x89,0x8b },
+    { 0x38,0xe7,0x19,0x5b }, { 0xdb,0x79,0xc8,0xee }, 
+    { 0x47,0xa1,0x7c,0x0a }, { 0xe9,0x7c,0x42,0x0f },
+    { 0xc9,0xf8,0x84,0x1e }, { 0x00,0x00,0x00,0x00 }, 
+    { 0x83,0x09,0x80,0x86 }, { 0x48,0x32,0x2b,0xed },
+    { 0xac,0x1e,0x11,0x70 }, { 0x4e,0x6c,0x5a,0x72 }, 
+    { 0xfb,0xfd,0x0e,0xff }, { 0x56,0x0f,0x85,0x38 },
+    { 0x1e,0x3d,0xae,0xd5 }, { 0x27,0x36,0x2d,0x39 }, 
+    { 0x64,0x0a,0x0f,0xd9 }, { 0x21,0x68,0x5c,0xa6 },
+    { 0xd1,0x9b,0x5b,0x54 }, { 0x3a,0x24,0x36,0x2e }, 
+    { 0xb1,0x0c,0x0a,0x67 }, { 0x0f,0x93,0x57,0xe7 },
+    { 0xd2,0xb4,0xee,0x96 }, { 0x9e,0x1b,0x9b,0x91 }, 
+    { 0x4f,0x80,0xc0,0xc5 }, { 0xa2,0x61,0xdc,0x20 }, 
+    { 0x69,0x5a,0x77,0x4b }, { 0x16,0x1c,0x12,0x1a }, 
+    { 0x0a,0xe2,0x93,0xba }, { 0xe5,0xc0,0xa0,0x2a },
+    { 0x43,0x3c,0x22,0xe0 }, { 0x1d,0x12,0x1b,0x17 }, 
+    { 0x0b,0x0e,0x09,0x0d }, { 0xad,0xf2,0x8b,0xc7 },
+    { 0xb9,0x2d,0xb6,0xa8 }, { 0xc8,0x14,0x1e,0xa9 }, 
+    { 0x85,0x57,0xf1,0x19 }, { 0x4c,0xaf,0x75,0x07 },
+    { 0xbb,0xee,0x99,0xdd }, { 0xfd,0xa3,0x7f,0x60 }, 
+    { 0x9f,0xf7,0x01,0x26 }, { 0xbc,0x5c,0x72,0xf5 },
+    { 0xc5,0x44,0x66,0x3b }, { 0x34,0x5b,0xfb,0x7e }, 
+    { 0x76,0x8b,0x43,0x29 }, { 0xdc,0xcb,0x23,0xc6 },
+    { 0x68,0xb6,0xed,0xfc }, { 0x63,0xb8,0xe4,0xf1 }, 
+    { 0xca,0xd7,0x31,0xdc }, { 0x10,0x42,0x63,0x85 },
+    { 0x40,0x13,0x97,0x22 }, { 0x20,0x84,0xc6,0x11 }, 
+    { 0x7d,0x85,0x4a,0x24 }, { 0xf8,0xd2,0xbb,0x3d },
+    { 0x11,0xae,0xf9,0x32 }, { 0x6d,0xc7,0x29,0xa1 }, 
+    { 0x4b,0x1d,0x9e,0x2f }, { 0xf3,0xdc,0xb2,0x30 },
+    { 0xec,0x0d,0x86,0x52 }, { 0xd0,0x77,0xc1,0xe3 }, 
+    { 0x6c,0x2b,0xb3,0x16 }, { 0x99,0xa9,0x70,0xb9 }, 
+    { 0xfa,0x11,0x94,0x48 }, { 0x22,0x47,0xe9,0x64 }, 
+    { 0xc4,0xa8,0xfc,0x8c }, { 0x1a,0xa0,0xf0,0x3f }, 
+    { 0xd8,0x56,0x7d,0x2c }, { 0xef,0x22,0x33,0x90 }, 
+    { 0xc7,0x87,0x49,0x4e }, { 0xc1,0xd9,0x38,0xd1 },
+    { 0xfe,0x8c,0xca,0xa2 }, { 0x36,0x98,0xd4,0x0b }, 
+    { 0xcf,0xa6,0xf5,0x81 }, { 0x28,0xa5,0x7a,0xde }, 
+    { 0x26,0xda,0xb7,0x8e }, { 0xa4,0x3f,0xad,0xbf }, 
+    { 0xe4,0x2c,0x3a,0x9d }, { 0x0d,0x50,0x78,0x92 }, 
+    { 0x9b,0x6a,0x5f,0xcc }, { 0x62,0x54,0x7e,0x46 }, 
+    { 0xc2,0xf6,0x8d,0x13 }, { 0xe8,0x90,0xd8,0xb8 }, 
+    { 0x5e,0x2e,0x39,0xf7 }, { 0xf5,0x82,0xc3,0xaf }, 
+    { 0xbe,0x9f,0x5d,0x80 }, { 0x7c,0x69,0xd0,0x93 },
+    { 0xa9,0x6f,0xd5,0x2d }, { 0xb3,0xcf,0x25,0x12 }, 
+    { 0x3b,0xc8,0xac,0x99 }, { 0xa7,0x10,0x18,0x7d }, 
+    { 0x6e,0xe8,0x9c,0x63 }, { 0x7b,0xdb,0x3b,0xbb }, 
+    { 0x09,0xcd,0x26,0x78 }, { 0xf4,0x6e,0x59,0x18 },
+    { 0x01,0xec,0x9a,0xb7 }, { 0xa8,0x83,0x4f,0x9a }, 
+    { 0x65,0xe6,0x95,0x6e }, { 0x7e,0xaa,0xff,0xe6 }, 
+    { 0x08,0x21,0xbc,0xcf }, { 0xe6,0xef,0x15,0xe8 }, 
+    { 0xd9,0xba,0xe7,0x9b }, { 0xce,0x4a,0x6f,0x36 },
+    { 0xd4,0xea,0x9f,0x09 }, { 0xd6,0x29,0xb0,0x7c }, 
+    { 0xaf,0x31,0xa4,0xb2 }, { 0x31,0x2a,0x3f,0x23 },
+    { 0x30,0xc6,0xa5,0x94 }, { 0xc0,0x35,0xa2,0x66 }, 
+    { 0x37,0x74,0x4e,0xbc }, { 0xa6,0xfc,0x82,0xca }, 
+    { 0xb0,0xe0,0x90,0xd0 }, { 0x15,0x33,0xa7,0xd8 }, 
+    { 0x4a,0xf1,0x04,0x98 }, { 0xf7,0x41,0xec,0xda },
+    { 0x0e,0x7f,0xcd,0x50 }, { 0x2f,0x17,0x91,0xf6 }, 
+    { 0x8d,0x76,0x4d,0xd6 }, { 0x4d,0x43,0xef,0xb0 },
+    { 0x54,0xcc,0xaa,0x4d }, { 0xdf,0xe4,0x96,0x04 }, 
+    { 0xe3,0x9e,0xd1,0xb5 }, { 0x1b,0x4c,0x6a,0x88 },
+    { 0xb8,0xc1,0x2c,0x1f }, { 0x7f,0x46,0x65,0x51 }, 
+    { 0x04,0x9d,0x5e,0xea }, { 0x5d,0x01,0x8c,0x35 },
+    { 0x73,0xfa,0x87,0x74 }, { 0x2e,0xfb,0x0b,0x41 }, 
+    { 0x5a,0xb3,0x67,0x1d }, { 0x52,0x92,0xdb,0xd2 },
+    { 0x33,0xe9,0x10,0x56 }, { 0x13,0x6d,0xd6,0x47 }, 
+    { 0x8c,0x9a,0xd7,0x61 }, { 0x7a,0x37,0xa1,0x0c }, 
+    { 0x8e,0x59,0xf8,0x14 }, { 0x89,0xeb,0x13,0x3c }, 
+    { 0xee,0xce,0xa9,0x27 }, { 0x35,0xb7,0x61,0xc9 },
+    { 0xed,0xe1,0x1c,0xe5 }, { 0x3c,0x7a,0x47,0xb1 }, 
+    { 0x59,0x9c,0xd2,0xdf }, { 0x3f,0x55,0xf2,0x73 },
+    { 0x79,0x18,0x14,0xce }, { 0xbf,0x73,0xc7,0x37 }, 
+    { 0xea,0x53,0xf7,0xcd }, { 0x5b,0x5f,0xfd,0xaa },
+    { 0x14,0xdf,0x3d,0x6f }, { 0x86,0x78,0x44,0xdb }, 
+    { 0x81,0xca,0xaf,0xf3 }, { 0x3e,0xb9,0x68,0xc4 },
+    { 0x2c,0x38,0x24,0x34 }, { 0x5f,0xc2,0xa3,0x40 }, 
+    { 0x72,0x16,0x1d,0xc3 }, { 0x0c,0xbc,0xe2,0x25 },
+    { 0x8b,0x28,0x3c,0x49 }, { 0x41,0xff,0x0d,0x95 }, 
+    { 0x71,0x39,0xa8,0x01 }, { 0xde,0x08,0x0c,0xb3 },
+    { 0x9c,0xd8,0xb4,0xe4 }, { 0x90,0x64,0x56,0xc1 }, 
+    { 0x61,0x7b,0xcb,0x84 }, { 0x70,0xd5,0x32,0xb6 },
+    { 0x74,0x48,0x6c,0x5c }, { 0x42,0xd0,0xb8,0x57 }
+};
+
+static const byte T7[256][4] = {
+    { 0xa7,0x50,0x51,0xf4 }, { 0x65,0x53,0x7e,0x41 },
+    { 0xa4,0xc3,0x1a,0x17 }, { 0x5e,0x96,0x3a,0x27 }, 
+    { 0x6b,0xcb,0x3b,0xab }, { 0x45,0xf1,0x1f,0x9d },
+    { 0x58,0xab,0xac,0xfa }, { 0x03,0x93,0x4b,0xe3 }, 
+    { 0xfa,0x55,0x20,0x30 }, { 0x6d,0xf6,0xad,0x76 },
+    { 0x76,0x91,0x88,0xcc }, { 0x4c,0x25,0xf5,0x02 }, 
+    { 0xd7,0xfc,0x4f,0xe5 }, { 0xcb,0xd7,0xc5,0x2a },
+    { 0x44,0x80,0x26,0x35 }, { 0xa3,0x8f,0xb5,0x62 }, 
+    { 0x5a,0x49,0xde,0xb1 }, { 0x1b,0x67,0x25,0xba }, 
+    { 0x0e,0x98,0x45,0xea }, { 0xc0,0xe1,0x5d,0xfe }, 
+    { 0x75,0x02,0xc3,0x2f }, { 0xf0,0x12,0x81,0x4c },
+    { 0x97,0xa3,0x8d,0x46 }, { 0xf9,0xc6,0x6b,0xd3 }, 
+    { 0x5f,0xe7,0x03,0x8f }, { 0x9c,0x95,0x15,0x92 },
+    { 0x7a,0xeb,0xbf,0x6d }, { 0x59,0xda,0x95,0x52 }, 
+    { 0x83,0x2d,0xd4,0xbe }, { 0x21,0xd3,0x58,0x74 },
+    { 0x69,0x29,0x49,0xe0 }, { 0xc8,0x44,0x8e,0xc9 }, 
+    { 0x89,0x6a,0x75,0xc2 }, { 0x79,0x78,0xf4,0x8e }, 
+    { 0x3e,0x6b,0x99,0x58 }, { 0x71,0xdd,0x27,0xb9 }, 
+    { 0x4f,0xb6,0xbe,0xe1 }, { 0xad,0x17,0xf0,0x88 },
+    { 0xac,0x66,0xc9,0x20 }, { 0x3a,0xb4,0x7d,0xce }, 
+    { 0x4a,0x18,0x63,0xdf }, { 0x31,0x82,0xe5,0x1a },
+    { 0x33,0x60,0x97,0x51 }, { 0x7f,0x45,0x62,0x53 }, 
+    { 0x77,0xe0,0xb1,0x64 }, { 0xae,0x84,0xbb,0x6b },
+    { 0xa0,0x1c,0xfe,0x81 }, { 0x2b,0x94,0xf9,0x08 }, 
+    { 0x68,0x58,0x70,0x48 }, { 0xfd,0x19,0x8f,0x45 },
+    { 0x6c,0x87,0x94,0xde }, { 0xf8,0xb7,0x52,0x7b }, 
+    { 0xd3,0x23,0xab,0x73 }, { 0x02,0xe2,0x72,0x4b },
+    { 0x8f,0x57,0xe3,0x1f }, { 0xab,0x2a,0x66,0x55 }, 
+    { 0x28,0x07,0xb2,0xeb }, { 0xc2,0x03,0x2f,0xb5 },
+    { 0x7b,0x9a,0x86,0xc5 }, { 0x08,0xa5,0xd3,0x37 }, 
+    { 0x87,0xf2,0x30,0x28 }, { 0xa5,0xb2,0x23,0xbf },
+    { 0x6a,0xba,0x02,0x03 }, { 0x82,0x5c,0xed,0x16 }, 
+    { 0x1c,0x2b,0x8a,0xcf }, { 0xb4,0x92,0xa7,0x79 }, 
+    { 0xf2,0xf0,0xf3,0x07 }, { 0xe2,0xa1,0x4e,0x69 }, 
+    { 0xf4,0xcd,0x65,0xda }, { 0xbe,0xd5,0x06,0x05 },
+    { 0x62,0x1f,0xd1,0x34 }, { 0xfe,0x8a,0xc4,0xa6 }, 
+    { 0x53,0x9d,0x34,0x2e }, { 0x55,0xa0,0xa2,0xf3 },
+    { 0xe1,0x32,0x05,0x8a }, { 0xeb,0x75,0xa4,0xf6 }, 
+    { 0xec,0x39,0x0b,0x83 }, { 0xef,0xaa,0x40,0x60 },
+    { 0x9f,0x06,0x5e,0x71 }, { 0x10,0x51,0xbd,0x6e }, 
+    { 0x8a,0xf9,0x3e,0x21 }, { 0x06,0x3d,0x96,0xdd },
+    { 0x05,0xae,0xdd,0x3e }, { 0xbd,0x46,0x4d,0xe6 }, 
+    { 0x8d,0xb5,0x91,0x54 }, { 0x5d,0x05,0x71,0xc4 },
+    { 0xd4,0x6f,0x04,0x06 }, { 0x15,0xff,0x60,0x50 }, 
+    { 0xfb,0x24,0x19,0x98 }, { 0xe9,0x97,0xd6,0xbd }, 
+    { 0x43,0xcc,0x89,0x40 }, { 0x9e,0x77,0x67,0xd9 }, 
+    { 0x42,0xbd,0xb0,0xe8 }, { 0x8b,0x88,0x07,0x89 },
+    { 0x5b,0x38,0xe7,0x19 }, { 0xee,0xdb,0x79,0xc8 }, 
+    { 0x0a,0x47,0xa1,0x7c }, { 0x0f,0xe9,0x7c,0x42 },
+    { 0x1e,0xc9,0xf8,0x84 }, { 0x00,0x00,0x00,0x00 }, 
+    { 0x86,0x83,0x09,0x80 }, { 0xed,0x48,0x32,0x2b },
+    { 0x70,0xac,0x1e,0x11 }, { 0x72,0x4e,0x6c,0x5a }, 
+    { 0xff,0xfb,0xfd,0x0e }, { 0x38,0x56,0x0f,0x85 },
+    { 0xd5,0x1e,0x3d,0xae }, { 0x39,0x27,0x36,0x2d }, 
+    { 0xd9,0x64,0x0a,0x0f }, { 0xa6,0x21,0x68,0x5c },
+    { 0x54,0xd1,0x9b,0x5b }, { 0x2e,0x3a,0x24,0x36 }, 
+    { 0x67,0xb1,0x0c,0x0a }, { 0xe7,0x0f,0x93,0x57 },
+    { 0x96,0xd2,0xb4,0xee }, { 0x91,0x9e,0x1b,0x9b }, 
+    { 0xc5,0x4f,0x80,0xc0 }, { 0x20,0xa2,0x61,0xdc },
+    { 0x4b,0x69,0x5a,0x77 }, { 0x1a,0x16,0x1c,0x12 }, 
+    { 0xba,0x0a,0xe2,0x93 }, { 0x2a,0xe5,0xc0,0xa0 },
+    { 0xe0,0x43,0x3c,0x22 }, { 0x17,0x1d,0x12,0x1b }, 
+    { 0x0d,0x0b,0x0e,0x09 }, { 0xc7,0xad,0xf2,0x8b },
+    { 0xa8,0xb9,0x2d,0xb6 }, { 0xa9,0xc8,0x14,0x1e }, 
+    { 0x19,0x85,0x57,0xf1 }, { 0x07,0x4c,0xaf,0x75 },
+    { 0xdd,0xbb,0xee,0x99 }, { 0x60,0xfd,0xa3,0x7f }, 
+    { 0x26,0x9f,0xf7,0x01 }, { 0xf5,0xbc,0x5c,0x72 },
+    { 0x3b,0xc5,0x44,0x66 }, { 0x7e,0x34,0x5b,0xfb }, 
+    { 0x29,0x76,0x8b,0x43 }, { 0xc6,0xdc,0xcb,0x23 },
+    { 0xfc,0x68,0xb6,0xed }, { 0xf1,0x63,0xb8,0xe4 }, 
+    { 0xdc,0xca,0xd7,0x31 }, { 0x85,0x10,0x42,0x63 },
+    { 0x22,0x40,0x13,0x97 }, { 0x11,0x20,0x84,0xc6 }, 
+    { 0x24,0x7d,0x85,0x4a }, { 0x3d,0xf8,0xd2,0xbb },
+    { 0x32,0x11,0xae,0xf9 }, { 0xa1,0x6d,0xc7,0x29 }, 
+    { 0x2f,0x4b,0x1d,0x9e }, { 0x30,0xf3,0xdc,0xb2 },
+    { 0x52,0xec,0x0d,0x86 }, { 0xe3,0xd0,0x77,0xc1 }, 
+    { 0x16,0x6c,0x2b,0xb3 }, { 0xb9,0x99,0xa9,0x70 },
+    { 0x48,0xfa,0x11,0x94 }, { 0x64,0x22,0x47,0xe9 }, 
+    { 0x8c,0xc4,0xa8,0xfc }, { 0x3f,0x1a,0xa0,0xf0 },
+    { 0x2c,0xd8,0x56,0x7d }, { 0x90,0xef,0x22,0x33 }, 
+    { 0x4e,0xc7,0x87,0x49 }, { 0xd1,0xc1,0xd9,0x38 },
+    { 0xa2,0xfe,0x8c,0xca }, { 0x0b,0x36,0x98,0xd4 }, 
+    { 0x81,0xcf,0xa6,0xf5 }, { 0xde,0x28,0xa5,0x7a },
+    { 0x8e,0x26,0xda,0xb7 }, { 0xbf,0xa4,0x3f,0xad }, 
+    { 0x9d,0xe4,0x2c,0x3a }, { 0x92,0x0d,0x50,0x78 },
+    { 0xcc,0x9b,0x6a,0x5f }, { 0x46,0x62,0x54,0x7e }, 
+    { 0x13,0xc2,0xf6,0x8d }, { 0xb8,0xe8,0x90,0xd8 },
+    { 0xf7,0x5e,0x2e,0x39 }, { 0xaf,0xf5,0x82,0xc3 }, 
+    { 0x80,0xbe,0x9f,0x5d }, { 0x93,0x7c,0x69,0xd0 },
+    { 0x2d,0xa9,0x6f,0xd5 }, { 0x12,0xb3,0xcf,0x25 }, 
+    { 0x99,0x3b,0xc8,0xac }, { 0x7d,0xa7,0x10,0x18 },
+    { 0x63,0x6e,0xe8,0x9c }, { 0xbb,0x7b,0xdb,0x3b }, 
+    { 0x78,0x09,0xcd,0x26 }, { 0x18,0xf4,0x6e,0x59 }, 
+    { 0xb7,0x01,0xec,0x9a }, { 0x9a,0xa8,0x83,0x4f }, 
+    { 0x6e,0x65,0xe6,0x95 }, { 0xe6,0x7e,0xaa,0xff },
+    { 0xcf,0x08,0x21,0xbc }, { 0xe8,0xe6,0xef,0x15 }, 
+    { 0x9b,0xd9,0xba,0xe7 }, { 0x36,0xce,0x4a,0x6f },
+    { 0x09,0xd4,0xea,0x9f }, { 0x7c,0xd6,0x29,0xb0 }, 
+    { 0xb2,0xaf,0x31,0xa4 }, { 0x23,0x31,0x2a,0x3f },
+    { 0x94,0x30,0xc6,0xa5 }, { 0x66,0xc0,0x35,0xa2 }, 
+    { 0xbc,0x37,0x74,0x4e }, { 0xca,0xa6,0xfc,0x82 },
+    { 0xd0,0xb0,0xe0,0x90 }, { 0xd8,0x15,0x33,0xa7 }, 
+    { 0x98,0x4a,0xf1,0x04 }, { 0xda,0xf7,0x41,0xec },
+    { 0x50,0x0e,0x7f,0xcd }, { 0xf6,0x2f,0x17,0x91 }, 
+    { 0xd6,0x8d,0x76,0x4d }, { 0xb0,0x4d,0x43,0xef }, 
+    { 0x4d,0x54,0xcc,0xaa }, { 0x04,0xdf,0xe4,0x96 }, 
+    { 0xb5,0xe3,0x9e,0xd1 }, { 0x88,0x1b,0x4c,0x6a },
+    { 0x1f,0xb8,0xc1,0x2c }, { 0x51,0x7f,0x46,0x65 }, 
+    { 0xea,0x04,0x9d,0x5e }, { 0x35,0x5d,0x01,0x8c },
+    { 0x74,0x73,0xfa,0x87 }, { 0x41,0x2e,0xfb,0x0b }, 
+    { 0x1d,0x5a,0xb3,0x67 }, { 0xd2,0x52,0x92,0xdb },
+    { 0x56,0x33,0xe9,0x10 }, { 0x47,0x13,0x6d,0xd6 }, 
+    { 0x61,0x8c,0x9a,0xd7 }, { 0x0c,0x7a,0x37,0xa1 },
+    { 0x14,0x8e,0x59,0xf8 }, { 0x3c,0x89,0xeb,0x13 }, 
+    { 0x27,0xee,0xce,0xa9 }, { 0xc9,0x35,0xb7,0x61 },
+    { 0xe5,0xed,0xe1,0x1c }, { 0xb1,0x3c,0x7a,0x47 }, 
+    { 0xdf,0x59,0x9c,0xd2 }, { 0x73,0x3f,0x55,0xf2 },
+    { 0xce,0x79,0x18,0x14 }, { 0x37,0xbf,0x73,0xc7 }, 
+    { 0xcd,0xea,0x53,0xf7 }, { 0xaa,0x5b,0x5f,0xfd },
+    { 0x6f,0x14,0xdf,0x3d }, { 0xdb,0x86,0x78,0x44 }, 
+    { 0xf3,0x81,0xca,0xaf }, { 0xc4,0x3e,0xb9,0x68 },
+    { 0x34,0x2c,0x38,0x24 }, { 0x40,0x5f,0xc2,0xa3 }, 
+    { 0xc3,0x72,0x16,0x1d }, { 0x25,0x0c,0xbc,0xe2 },
+    { 0x49,0x8b,0x28,0x3c }, { 0x95,0x41,0xff,0x0d }, 
+    { 0x01,0x71,0x39,0xa8 }, { 0xb3,0xde,0x08,0x0c },
+    { 0xe4,0x9c,0xd8,0xb4 }, { 0xc1,0x90,0x64,0x56 }, 
+    { 0x84,0x61,0x7b,0xcb }, { 0xb6,0x70,0xd5,0x32 },
+    { 0x5c,0x74,0x48,0x6c }, { 0x57,0x42,0xd0,0xb8 }
+};
+
+static const byte  T8[256][4] = {
+    { 0xf4,0xa7,0x50,0x51 }, { 0x41,0x65,0x53,0x7e },
+    { 0x17,0xa4,0xc3,0x1a }, { 0x27,0x5e,0x96,0x3a }, 
+    { 0xab,0x6b,0xcb,0x3b }, { 0x9d,0x45,0xf1,0x1f },
+    { 0xfa,0x58,0xab,0xac }, { 0xe3,0x03,0x93,0x4b }, 
+    { 0x30,0xfa,0x55,0x20 }, { 0x76,0x6d,0xf6,0xad },
+    { 0xcc,0x76,0x91,0x88 }, { 0x02,0x4c,0x25,0xf5 }, 
+    { 0xe5,0xd7,0xfc,0x4f }, { 0x2a,0xcb,0xd7,0xc5 },
+    { 0x35,0x44,0x80,0x26 }, { 0x62,0xa3,0x8f,0xb5 }, 
+    { 0xb1,0x5a,0x49,0xde }, { 0xba,0x1b,0x67,0x25 },
+    { 0xea,0x0e,0x98,0x45 }, { 0xfe,0xc0,0xe1,0x5d }, 
+    { 0x2f,0x75,0x02,0xc3 }, { 0x4c,0xf0,0x12,0x81 },
+    { 0x46,0x97,0xa3,0x8d }, { 0xd3,0xf9,0xc6,0x6b }, 
+    { 0x8f,0x5f,0xe7,0x03 }, { 0x92,0x9c,0x95,0x15 },
+    { 0x6d,0x7a,0xeb,0xbf }, { 0x52,0x59,0xda,0x95 }, 
+    { 0xbe,0x83,0x2d,0xd4 }, { 0x74,0x21,0xd3,0x58 },
+    { 0xe0,0x69,0x29,0x49 }, { 0xc9,0xc8,0x44,0x8e }, 
+    { 0xc2,0x89,0x6a,0x75 }, { 0x8e,0x79,0x78,0xf4 },
+    { 0x58,0x3e,0x6b,0x99 }, { 0xb9,0x71,0xdd,0x27 }, 
+    { 0xe1,0x4f,0xb6,0xbe }, { 0x88,0xad,0x17,0xf0 },
+    { 0x20,0xac,0x66,0xc9 }, { 0xce,0x3a,0xb4,0x7d }, 
+    { 0xdf,0x4a,0x18,0x63 }, { 0x1a,0x31,0x82,0xe5 },
+    { 0x51,0x33,0x60,0x97 }, { 0x53,0x7f,0x45,0x62 }, 
+    { 0x64,0x77,0xe0,0xb1 }, { 0x6b,0xae,0x84,0xbb },
+    { 0x81,0xa0,0x1c,0xfe }, { 0x08,0x2b,0x94,0xf9 }, 
+    { 0x48,0x68,0x58,0x70 }, { 0x45,0xfd,0x19,0x8f },
+    { 0xde,0x6c,0x87,0x94 }, { 0x7b,0xf8,0xb7,0x52 }, 
+    { 0x73,0xd3,0x23,0xab }, { 0x4b,0x02,0xe2,0x72 },
+    { 0x1f,0x8f,0x57,0xe3 }, { 0x55,0xab,0x2a,0x66 }, 
+    { 0xeb,0x28,0x07,0xb2 }, { 0xb5,0xc2,0x03,0x2f },
+    { 0xc5,0x7b,0x9a,0x86 }, { 0x37,0x08,0xa5,0xd3 }, 
+    { 0x28,0x87,0xf2,0x30 }, { 0xbf,0xa5,0xb2,0x23 },
+    { 0x03,0x6a,0xba,0x02 }, { 0x16,0x82,0x5c,0xed }, 
+    { 0xcf,0x1c,0x2b,0x8a }, { 0x79,0xb4,0x92,0xa7 },
+    { 0x07,0xf2,0xf0,0xf3 }, { 0x69,0xe2,0xa1,0x4e }, 
+    { 0xda,0xf4,0xcd,0x65 }, { 0x05,0xbe,0xd5,0x06 },
+    { 0x34,0x62,0x1f,0xd1 }, { 0xa6,0xfe,0x8a,0xc4 }, 
+    { 0x2e,0x53,0x9d,0x34 }, { 0xf3,0x55,0xa0,0xa2 },
+    { 0x8a,0xe1,0x32,0x05 }, { 0xf6,0xeb,0x75,0xa4 }, 
+    { 0x83,0xec,0x39,0x0b }, { 0x60,0xef,0xaa,0x40 },
+    { 0x71,0x9f,0x06,0x5e }, { 0x6e,0x10,0x51,0xbd }, 
+    { 0x21,0x8a,0xf9,0x3e }, { 0xdd,0x06,0x3d,0x96 },
+    { 0x3e,0x05,0xae,0xdd }, { 0xe6,0xbd,0x46,0x4d }, 
+    { 0x54,0x8d,0xb5,0x91 }, { 0xc4,0x5d,0x05,0x71 },
+    { 0x06,0xd4,0x6f,0x04 }, { 0x50,0x15,0xff,0x60 }, 
+    { 0x98,0xfb,0x24,0x19 }, { 0xbd,0xe9,0x97,0xd6 },
+    { 0x40,0x43,0xcc,0x89 }, { 0xd9,0x9e,0x77,0x67 }, 
+    { 0xe8,0x42,0xbd,0xb0 }, { 0x89,0x8b,0x88,0x07 },
+    { 0x19,0x5b,0x38,0xe7 }, { 0xc8,0xee,0xdb,0x79 }, 
+    { 0x7c,0x0a,0x47,0xa1 }, { 0x42,0x0f,0xe9,0x7c },
+    { 0x84,0x1e,0xc9,0xf8 }, { 0x00,0x00,0x00,0x00 }, 
+    { 0x80,0x86,0x83,0x09 }, { 0x2b,0xed,0x48,0x32 },
+    { 0x11,0x70,0xac,0x1e }, { 0x5a,0x72,0x4e,0x6c }, 
+    { 0x0e,0xff,0xfb,0xfd }, { 0x85,0x38,0x56,0x0f }, 
+    { 0xae,0xd5,0x1e,0x3d }, { 0x2d,0x39,0x27,0x36 }, 
+    { 0x0f,0xd9,0x64,0x0a }, { 0x5c,0xa6,0x21,0x68 },
+    { 0x5b,0x54,0xd1,0x9b }, { 0x36,0x2e,0x3a,0x24 }, 
+    { 0x0a,0x67,0xb1,0x0c }, { 0x57,0xe7,0x0f,0x93 },
+    { 0xee,0x96,0xd2,0xb4 }, { 0x9b,0x91,0x9e,0x1b }, 
+    { 0xc0,0xc5,0x4f,0x80 }, { 0xdc,0x20,0xa2,0x61 },
+    { 0x77,0x4b,0x69,0x5a }, { 0x12,0x1a,0x16,0x1c }, 
+    { 0x93,0xba,0x0a,0xe2 }, { 0xa0,0x2a,0xe5,0xc0 },
+    { 0x22,0xe0,0x43,0x3c }, { 0x1b,0x17,0x1d,0x12 }, 
+    { 0x09,0x0d,0x0b,0x0e }, { 0x8b,0xc7,0xad,0xf2 },
+    { 0xb6,0xa8,0xb9,0x2d }, { 0x1e,0xa9,0xc8,0x14 }, 
+    { 0xf1,0x19,0x85,0x57 }, { 0x75,0x07,0x4c,0xaf },
+    { 0x99,0xdd,0xbb,0xee }, { 0x7f,0x60,0xfd,0xa3 }, 
+    { 0x01,0x26,0x9f,0xf7 }, { 0x72,0xf5,0xbc,0x5c },
+    { 0x66,0x3b,0xc5,0x44 }, { 0xfb,0x7e,0x34,0x5b }, 
+    { 0x43,0x29,0x76,0x8b }, { 0x23,0xc6,0xdc,0xcb },
+    { 0xed,0xfc,0x68,0xb6 }, { 0xe4,0xf1,0x63,0xb8 }, 
+    { 0x31,0xdc,0xca,0xd7 }, { 0x63,0x85,0x10,0x42 },
+    { 0x97,0x22,0x40,0x13 }, { 0xc6,0x11,0x20,0x84 }, 
+    { 0x4a,0x24,0x7d,0x85 }, { 0xbb,0x3d,0xf8,0xd2 }, 
+    { 0xf9,0x32,0x11,0xae }, { 0x29,0xa1,0x6d,0xc7 }, 
+    { 0x9e,0x2f,0x4b,0x1d }, { 0xb2,0x30,0xf3,0xdc },
+    { 0x86,0x52,0xec,0x0d }, { 0xc1,0xe3,0xd0,0x77 }, 
+    { 0xb3,0x16,0x6c,0x2b }, { 0x70,0xb9,0x99,0xa9 },
+    { 0x94,0x48,0xfa,0x11 }, { 0xe9,0x64,0x22,0x47 }, 
+    { 0xfc,0x8c,0xc4,0xa8 }, { 0xf0,0x3f,0x1a,0xa0 },
+    { 0x7d,0x2c,0xd8,0x56 }, { 0x33,0x90,0xef,0x22 }, 
+    { 0x49,0x4e,0xc7,0x87 }, { 0x38,0xd1,0xc1,0xd9 },
+    { 0xca,0xa2,0xfe,0x8c }, { 0xd4,0x0b,0x36,0x98 }, 
+    { 0xf5,0x81,0xcf,0xa6 }, { 0x7a,0xde,0x28,0xa5 },
+    { 0xb7,0x8e,0x26,0xda }, { 0xad,0xbf,0xa4,0x3f }, 
+    { 0x3a,0x9d,0xe4,0x2c }, { 0x78,0x92,0x0d,0x50 },
+    { 0x5f,0xcc,0x9b,0x6a }, { 0x7e,0x46,0x62,0x54 }, 
+    { 0x8d,0x13,0xc2,0xf6 }, { 0xd8,0xb8,0xe8,0x90 },
+    { 0x39,0xf7,0x5e,0x2e }, { 0xc3,0xaf,0xf5,0x82 }, 
+    { 0x5d,0x80,0xbe,0x9f }, { 0xd0,0x93,0x7c,0x69 },
+    { 0xd5,0x2d,0xa9,0x6f }, { 0x25,0x12,0xb3,0xcf }, 
+    { 0xac,0x99,0x3b,0xc8 }, { 0x18,0x7d,0xa7,0x10 },
+    { 0x9c,0x63,0x6e,0xe8 }, { 0x3b,0xbb,0x7b,0xdb }, 
+    { 0x26,0x78,0x09,0xcd }, { 0x59,0x18,0xf4,0x6e },
+    { 0x9a,0xb7,0x01,0xec }, { 0x4f,0x9a,0xa8,0x83 }, 
+    { 0x95,0x6e,0x65,0xe6 }, { 0xff,0xe6,0x7e,0xaa },
+    { 0xbc,0xcf,0x08,0x21 }, { 0x15,0xe8,0xe6,0xef }, 
+    { 0xe7,0x9b,0xd9,0xba }, { 0x6f,0x36,0xce,0x4a },
+    { 0x9f,0x09,0xd4,0xea }, { 0xb0,0x7c,0xd6,0x29 }, 
+    { 0xa4,0xb2,0xaf,0x31 }, { 0x3f,0x23,0x31,0x2a },
+    { 0xa5,0x94,0x30,0xc6 }, { 0xa2,0x66,0xc0,0x35 }, 
+    { 0x4e,0xbc,0x37,0x74 }, { 0x82,0xca,0xa6,0xfc },
+    { 0x90,0xd0,0xb0,0xe0 }, { 0xa7,0xd8,0x15,0x33 }, 
+    { 0x04,0x98,0x4a,0xf1 }, { 0xec,0xda,0xf7,0x41 },
+    { 0xcd,0x50,0x0e,0x7f }, { 0x91,0xf6,0x2f,0x17 }, 
+    { 0x4d,0xd6,0x8d,0x76 }, { 0xef,0xb0,0x4d,0x43 }, 
+    { 0xaa,0x4d,0x54,0xcc }, { 0x96,0x04,0xdf,0xe4 }, 
+    { 0xd1,0xb5,0xe3,0x9e }, { 0x6a,0x88,0x1b,0x4c },
+    { 0x2c,0x1f,0xb8,0xc1 }, { 0x65,0x51,0x7f,0x46 }, 
+    { 0x5e,0xea,0x04,0x9d }, { 0x8c,0x35,0x5d,0x01 },
+    { 0x87,0x74,0x73,0xfa }, { 0x0b,0x41,0x2e,0xfb }, 
+    { 0x67,0x1d,0x5a,0xb3 }, { 0xdb,0xd2,0x52,0x92 },
+    { 0x10,0x56,0x33,0xe9 }, { 0xd6,0x47,0x13,0x6d }, 
+    { 0xd7,0x61,0x8c,0x9a }, { 0xa1,0x0c,0x7a,0x37 },
+    { 0xf8,0x14,0x8e,0x59 }, { 0x13,0x3c,0x89,0xeb }, 
+    { 0xa9,0x27,0xee,0xce }, { 0x61,0xc9,0x35,0xb7 },
+    { 0x1c,0xe5,0xed,0xe1 }, { 0x47,0xb1,0x3c,0x7a }, 
+    { 0xd2,0xdf,0x59,0x9c }, { 0xf2,0x73,0x3f,0x55 },
+    { 0x14,0xce,0x79,0x18 }, { 0xc7,0x37,0xbf,0x73 }, 
+    { 0xf7,0xcd,0xea,0x53 }, { 0xfd,0xaa,0x5b,0x5f },
+    { 0x3d,0x6f,0x14,0xdf }, { 0x44,0xdb,0x86,0x78 }, 
+    { 0xaf,0xf3,0x81,0xca }, { 0x68,0xc4,0x3e,0xb9 },
+    { 0x24,0x34,0x2c,0x38 }, { 0xa3,0x40,0x5f,0xc2 }, 
+    { 0x1d,0xc3,0x72,0x16 }, { 0xe2,0x25,0x0c,0xbc },
+    { 0x3c,0x49,0x8b,0x28 }, { 0x0d,0x95,0x41,0xff }, 
+    { 0xa8,0x01,0x71,0x39 }, { 0x0c,0xb3,0xde,0x08 },
+    { 0xb4,0xe4,0x9c,0xd8 }, { 0x56,0xc1,0x90,0x64 }, 
+    { 0xcb,0x84,0x61,0x7b }, { 0x32,0xb6,0x70,0xd5 },
+    { 0x6c,0x5c,0x74,0x48 }, { 0xb8,0x57,0x42,0xd0 }
+};
+
+static const byte S5[256] = {
+    0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,
+    0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,
+    0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,
+    0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,
+    0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,
+    0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,
+    0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,
+    0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,
+    0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,
+    0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,
+    0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,
+    0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,
+    0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,
+    0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,
+    0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,
+    0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,
+    0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,
+    0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,
+    0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,
+    0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,
+    0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,
+    0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,
+    0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,
+    0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,
+    0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,
+    0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,
+    0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,
+    0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,
+    0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,
+    0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,
+    0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,
+    0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d
+};
+
+static const byte U1[256][4] = {
+    { 0x00,0x00,0x00,0x00 }, { 0x0e,0x09,0x0d,0x0b },
+    { 0x1c,0x12,0x1a,0x16 }, { 0x12,0x1b,0x17,0x1d }, 
+    { 0x38,0x24,0x34,0x2c }, { 0x36,0x2d,0x39,0x27 },
+    { 0x24,0x36,0x2e,0x3a }, { 0x2a,0x3f,0x23,0x31 }, 
+    { 0x70,0x48,0x68,0x58 }, { 0x7e,0x41,0x65,0x53 },
+    { 0x6c,0x5a,0x72,0x4e }, { 0x62,0x53,0x7f,0x45 }, 
+    { 0x48,0x6c,0x5c,0x74 }, { 0x46,0x65,0x51,0x7f },
+    { 0x54,0x7e,0x46,0x62 }, { 0x5a,0x77,0x4b,0x69 }, 
+    { 0xe0,0x90,0xd0,0xb0 }, { 0xee,0x99,0xdd,0xbb },
+    { 0xfc,0x82,0xca,0xa6 }, { 0xf2,0x8b,0xc7,0xad }, 
+    { 0xd8,0xb4,0xe4,0x9c }, { 0xd6,0xbd,0xe9,0x97 },
+    { 0xc4,0xa6,0xfe,0x8a }, { 0xca,0xaf,0xf3,0x81 }, 
+    { 0x90,0xd8,0xb8,0xe8 }, { 0x9e,0xd1,0xb5,0xe3 },
+    { 0x8c,0xca,0xa2,0xfe }, { 0x82,0xc3,0xaf,0xf5 }, 
+    { 0xa8,0xfc,0x8c,0xc4 }, { 0xa6,0xf5,0x81,0xcf },
+    { 0xb4,0xee,0x96,0xd2 }, { 0xba,0xe7,0x9b,0xd9 }, 
+    { 0xdb,0x3b,0xbb,0x7b }, { 0xd5,0x32,0xb6,0x70 },
+    { 0xc7,0x29,0xa1,0x6d }, { 0xc9,0x20,0xac,0x66 }, 
+    { 0xe3,0x1f,0x8f,0x57 }, { 0xed,0x16,0x82,0x5c },
+    { 0xff,0x0d,0x95,0x41 }, { 0xf1,0x04,0x98,0x4a }, 
+    { 0xab,0x73,0xd3,0x23 }, { 0xa5,0x7a,0xde,0x28 },
+    { 0xb7,0x61,0xc9,0x35 }, { 0xb9,0x68,0xc4,0x3e }, 
+    { 0x93,0x57,0xe7,0x0f }, { 0x9d,0x5e,0xea,0x04 },
+    { 0x8f,0x45,0xfd,0x19 }, { 0x81,0x4c,0xf0,0x12 }, 
+    { 0x3b,0xab,0x6b,0xcb }, { 0x35,0xa2,0x66,0xc0 },
+    { 0x27,0xb9,0x71,0xdd }, { 0x29,0xb0,0x7c,0xd6 }, 
+    { 0x03,0x8f,0x5f,0xe7 }, { 0x0d,0x86,0x52,0xec },
+    { 0x1f,0x9d,0x45,0xf1 }, { 0x11,0x94,0x48,0xfa }, 
+    { 0x4b,0xe3,0x03,0x93 }, { 0x45,0xea,0x0e,0x98 },
+    { 0x57,0xf1,0x19,0x85 }, { 0x59,0xf8,0x14,0x8e }, 
+    { 0x73,0xc7,0x37,0xbf }, { 0x7d,0xce,0x3a,0xb4 },
+    { 0x6f,0xd5,0x2d,0xa9 }, { 0x61,0xdc,0x20,0xa2 }, 
+    { 0xad,0x76,0x6d,0xf6 }, { 0xa3,0x7f,0x60,0xfd },
+    { 0xb1,0x64,0x77,0xe0 }, { 0xbf,0x6d,0x7a,0xeb }, 
+    { 0x95,0x52,0x59,0xda }, { 0x9b,0x5b,0x54,0xd1 },
+    { 0x89,0x40,0x43,0xcc }, { 0x87,0x49,0x4e,0xc7 }, 
+    { 0xdd,0x3e,0x05,0xae }, { 0xd3,0x37,0x08,0xa5 },
+    { 0xc1,0x2c,0x1f,0xb8 }, { 0xcf,0x25,0x12,0xb3 }, 
+    { 0xe5,0x1a,0x31,0x82 }, { 0xeb,0x13,0x3c,0x89 },
+    { 0xf9,0x08,0x2b,0x94 }, { 0xf7,0x01,0x26,0x9f }, 
+    { 0x4d,0xe6,0xbd,0x46 }, { 0x43,0xef,0xb0,0x4d },
+    { 0x51,0xf4,0xa7,0x50 }, { 0x5f,0xfd,0xaa,0x5b }, 
+    { 0x75,0xc2,0x89,0x6a }, { 0x7b,0xcb,0x84,0x61 },
+    { 0x69,0xd0,0x93,0x7c }, { 0x67,0xd9,0x9e,0x77 }, 
+    { 0x3d,0xae,0xd5,0x1e }, { 0x33,0xa7,0xd8,0x15 },
+    { 0x21,0xbc,0xcf,0x08 }, { 0x2f,0xb5,0xc2,0x03 }, 
+    { 0x05,0x8a,0xe1,0x32 }, { 0x0b,0x83,0xec,0x39 },
+    { 0x19,0x98,0xfb,0x24 }, { 0x17,0x91,0xf6,0x2f }, 
+    { 0x76,0x4d,0xd6,0x8d }, { 0x78,0x44,0xdb,0x86 },
+    { 0x6a,0x5f,0xcc,0x9b }, { 0x64,0x56,0xc1,0x90 }, 
+    { 0x4e,0x69,0xe2,0xa1 }, { 0x40,0x60,0xef,0xaa },
+    { 0x52,0x7b,0xf8,0xb7 }, { 0x5c,0x72,0xf5,0xbc }, 
+    { 0x06,0x05,0xbe,0xd5 }, { 0x08,0x0c,0xb3,0xde },
+    { 0x1a,0x17,0xa4,0xc3 }, { 0x14,0x1e,0xa9,0xc8 }, 
+    { 0x3e,0x21,0x8a,0xf9 }, { 0x30,0x28,0x87,0xf2 },
+    { 0x22,0x33,0x90,0xef }, { 0x2c,0x3a,0x9d,0xe4 }, 
+    { 0x96,0xdd,0x06,0x3d }, { 0x98,0xd4,0x0b,0x36 },
+    { 0x8a,0xcf,0x1c,0x2b }, { 0x84,0xc6,0x11,0x20 }, 
+    { 0xae,0xf9,0x32,0x11 }, { 0xa0,0xf0,0x3f,0x1a },
+    { 0xb2,0xeb,0x28,0x07 }, { 0xbc,0xe2,0x25,0x0c }, 
+    { 0xe6,0x95,0x6e,0x65 }, { 0xe8,0x9c,0x63,0x6e },
+    { 0xfa,0x87,0x74,0x73 }, { 0xf4,0x8e,0x79,0x78 }, 
+    { 0xde,0xb1,0x5a,0x49 }, { 0xd0,0xb8,0x57,0x42 },
+    { 0xc2,0xa3,0x40,0x5f }, { 0xcc,0xaa,0x4d,0x54 }, 
+    { 0x41,0xec,0xda,0xf7 }, { 0x4f,0xe5,0xd7,0xfc },
+    { 0x5d,0xfe,0xc0,0xe1 }, { 0x53,0xf7,0xcd,0xea }, 
+    { 0x79,0xc8,0xee,0xdb }, { 0x77,0xc1,0xe3,0xd0 },
+    { 0x65,0xda,0xf4,0xcd }, { 0x6b,0xd3,0xf9,0xc6 }, 
+    { 0x31,0xa4,0xb2,0xaf }, { 0x3f,0xad,0xbf,0xa4 },
+    { 0x2d,0xb6,0xa8,0xb9 }, { 0x23,0xbf,0xa5,0xb2 }, 
+    { 0x09,0x80,0x86,0x83 }, { 0x07,0x89,0x8b,0x88 },
+    { 0x15,0x92,0x9c,0x95 }, { 0x1b,0x9b,0x91,0x9e }, 
+    { 0xa1,0x7c,0x0a,0x47 }, { 0xaf,0x75,0x07,0x4c },
+    { 0xbd,0x6e,0x10,0x51 }, { 0xb3,0x67,0x1d,0x5a }, 
+    { 0x99,0x58,0x3e,0x6b }, { 0x97,0x51,0x33,0x60 },
+    { 0x85,0x4a,0x24,0x7d }, { 0x8b,0x43,0x29,0x76 }, 
+    { 0xd1,0x34,0x62,0x1f }, { 0xdf,0x3d,0x6f,0x14 },
+    { 0xcd,0x26,0x78,0x09 }, { 0xc3,0x2f,0x75,0x02 }, 
+    { 0xe9,0x10,0x56,0x33 }, { 0xe7,0x19,0x5b,0x38 },
+    { 0xf5,0x02,0x4c,0x25 }, { 0xfb,0x0b,0x41,0x2e }, 
+    { 0x9a,0xd7,0x61,0x8c }, { 0x94,0xde,0x6c,0x87 }, 
+    { 0x86,0xc5,0x7b,0x9a }, { 0x88,0xcc,0x76,0x91 }, 
+    { 0xa2,0xf3,0x55,0xa0 }, { 0xac,0xfa,0x58,0xab },
+    { 0xbe,0xe1,0x4f,0xb6 }, { 0xb0,0xe8,0x42,0xbd }, 
+    { 0xea,0x9f,0x09,0xd4 }, { 0xe4,0x96,0x04,0xdf },
+    { 0xf6,0x8d,0x13,0xc2 }, { 0xf8,0x84,0x1e,0xc9 }, 
+    { 0xd2,0xbb,0x3d,0xf8 }, { 0xdc,0xb2,0x30,0xf3 },
+    { 0xce,0xa9,0x27,0xee }, { 0xc0,0xa0,0x2a,0xe5 }, 
+    { 0x7a,0x47,0xb1,0x3c }, { 0x74,0x4e,0xbc,0x37 }, 
+    { 0x66,0x55,0xab,0x2a }, { 0x68,0x5c,0xa6,0x21 }, 
+    { 0x42,0x63,0x85,0x10 }, { 0x4c,0x6a,0x88,0x1b },
+    { 0x5e,0x71,0x9f,0x06 }, { 0x50,0x78,0x92,0x0d }, 
+    { 0x0a,0x0f,0xd9,0x64 }, { 0x04,0x06,0xd4,0x6f },
+    { 0x16,0x1d,0xc3,0x72 }, { 0x18,0x14,0xce,0x79 }, 
+    { 0x32,0x2b,0xed,0x48 }, { 0x3c,0x22,0xe0,0x43 },
+    { 0x2e,0x39,0xf7,0x5e }, { 0x20,0x30,0xfa,0x55 }, 
+    { 0xec,0x9a,0xb7,0x01 }, { 0xe2,0x93,0xba,0x0a },
+    { 0xf0,0x88,0xad,0x17 }, { 0xfe,0x81,0xa0,0x1c }, 
+    { 0xd4,0xbe,0x83,0x2d }, { 0xda,0xb7,0x8e,0x26 },
+    { 0xc8,0xac,0x99,0x3b }, { 0xc6,0xa5,0x94,0x30 }, 
+    { 0x9c,0xd2,0xdf,0x59 }, { 0x92,0xdb,0xd2,0x52 },
+    { 0x80,0xc0,0xc5,0x4f }, { 0x8e,0xc9,0xc8,0x44 }, 
+    { 0xa4,0xf6,0xeb,0x75 }, { 0xaa,0xff,0xe6,0x7e },
+    { 0xb8,0xe4,0xf1,0x63 }, { 0xb6,0xed,0xfc,0x68 }, 
+    { 0x0c,0x0a,0x67,0xb1 }, { 0x02,0x03,0x6a,0xba },
+    { 0x10,0x18,0x7d,0xa7 }, { 0x1e,0x11,0x70,0xac }, 
+    { 0x34,0x2e,0x53,0x9d }, { 0x3a,0x27,0x5e,0x96 },
+    { 0x28,0x3c,0x49,0x8b }, { 0x26,0x35,0x44,0x80 }, 
+    { 0x7c,0x42,0x0f,0xe9 }, { 0x72,0x4b,0x02,0xe2 },
+    { 0x60,0x50,0x15,0xff }, { 0x6e,0x59,0x18,0xf4 }, 
+    { 0x44,0x66,0x3b,0xc5 }, { 0x4a,0x6f,0x36,0xce },
+    { 0x58,0x74,0x21,0xd3 }, { 0x56,0x7d,0x2c,0xd8 }, 
+    { 0x37,0xa1,0x0c,0x7a }, { 0x39,0xa8,0x01,0x71 },
+    { 0x2b,0xb3,0x16,0x6c }, { 0x25,0xba,0x1b,0x67 }, 
+    { 0x0f,0x85,0x38,0x56 }, { 0x01,0x8c,0x35,0x5d },
+    { 0x13,0x97,0x22,0x40 }, { 0x1d,0x9e,0x2f,0x4b }, 
+    { 0x47,0xe9,0x64,0x22 }, { 0x49,0xe0,0x69,0x29 },
+    { 0x5b,0xfb,0x7e,0x34 }, { 0x55,0xf2,0x73,0x3f }, 
+    { 0x7f,0xcd,0x50,0x0e }, { 0x71,0xc4,0x5d,0x05 },
+    { 0x63,0xdf,0x4a,0x18 }, { 0x6d,0xd6,0x47,0x13 }, 
+    { 0xd7,0x31,0xdc,0xca }, { 0xd9,0x38,0xd1,0xc1 },
+    { 0xcb,0x23,0xc6,0xdc }, { 0xc5,0x2a,0xcb,0xd7 }, 
+    { 0xef,0x15,0xe8,0xe6 }, { 0xe1,0x1c,0xe5,0xed },
+    { 0xf3,0x07,0xf2,0xf0 }, { 0xfd,0x0e,0xff,0xfb }, 
+    { 0xa7,0x79,0xb4,0x92 }, { 0xa9,0x70,0xb9,0x99 },
+    { 0xbb,0x6b,0xae,0x84 }, { 0xb5,0x62,0xa3,0x8f }, 
+    { 0x9f,0x5d,0x80,0xbe }, { 0x91,0x54,0x8d,0xb5 },
+    { 0x83,0x4f,0x9a,0xa8 }, { 0x8d,0x46,0x97,0xa3 }
+};
+
+static const byte U2[256][4] = {
+    { 0x00,0x00,0x00,0x00 }, { 0x0b,0x0e,0x09,0x0d },
+    { 0x16,0x1c,0x12,0x1a }, { 0x1d,0x12,0x1b,0x17 }, 
+    { 0x2c,0x38,0x24,0x34 }, { 0x27,0x36,0x2d,0x39 },
+    { 0x3a,0x24,0x36,0x2e }, { 0x31,0x2a,0x3f,0x23 }, 
+    { 0x58,0x70,0x48,0x68 }, { 0x53,0x7e,0x41,0x65 }, 
+    { 0x4e,0x6c,0x5a,0x72 }, { 0x45,0x62,0x53,0x7f }, 
+    { 0x74,0x48,0x6c,0x5c }, { 0x7f,0x46,0x65,0x51 },
+    { 0x62,0x54,0x7e,0x46 }, { 0x69,0x5a,0x77,0x4b }, 
+    { 0xb0,0xe0,0x90,0xd0 }, { 0xbb,0xee,0x99,0xdd }, 
+    { 0xa6,0xfc,0x82,0xca }, { 0xad,0xf2,0x8b,0xc7 }, 
+    { 0x9c,0xd8,0xb4,0xe4 }, { 0x97,0xd6,0xbd,0xe9 }, 
+    { 0x8a,0xc4,0xa6,0xfe }, { 0x81,0xca,0xaf,0xf3 }, 
+    { 0xe8,0x90,0xd8,0xb8 }, { 0xe3,0x9e,0xd1,0xb5 },
+    { 0xfe,0x8c,0xca,0xa2 }, { 0xf5,0x82,0xc3,0xaf }, 
+    { 0xc4,0xa8,0xfc,0x8c }, { 0xcf,0xa6,0xf5,0x81 }, 
+    { 0xd2,0xb4,0xee,0x96 }, { 0xd9,0xba,0xe7,0x9b }, 
+    { 0x7b,0xdb,0x3b,0xbb }, { 0x70,0xd5,0x32,0xb6 }, 
+    { 0x6d,0xc7,0x29,0xa1 }, { 0x66,0xc9,0x20,0xac }, 
+    { 0x57,0xe3,0x1f,0x8f }, { 0x5c,0xed,0x16,0x82 }, 
+    { 0x41,0xff,0x0d,0x95 }, { 0x4a,0xf1,0x04,0x98 }, 
+    { 0x23,0xab,0x73,0xd3 }, { 0x28,0xa5,0x7a,0xde },
+    { 0x35,0xb7,0x61,0xc9 }, { 0x3e,0xb9,0x68,0xc4 }, 
+    { 0x0f,0x93,0x57,0xe7 }, { 0x04,0x9d,0x5e,0xea },
+    { 0x19,0x8f,0x45,0xfd }, { 0x12,0x81,0x4c,0xf0 }, 
+    { 0xcb,0x3b,0xab,0x6b }, { 0xc0,0x35,0xa2,0x66 },
+    { 0xdd,0x27,0xb9,0x71 }, { 0xd6,0x29,0xb0,0x7c }, 
+    { 0xe7,0x03,0x8f,0x5f }, { 0xec,0x0d,0x86,0x52 },
+    { 0xf1,0x1f,0x9d,0x45 }, { 0xfa,0x11,0x94,0x48 }, 
+    { 0x93,0x4b,0xe3,0x03 }, { 0x98,0x45,0xea,0x0e }, 
+    { 0x85,0x57,0xf1,0x19 }, { 0x8e,0x59,0xf8,0x14 }, 
+    { 0xbf,0x73,0xc7,0x37 }, { 0xb4,0x7d,0xce,0x3a },
+    { 0xa9,0x6f,0xd5,0x2d }, { 0xa2,0x61,0xdc,0x20 }, 
+    { 0xf6,0xad,0x76,0x6d }, { 0xfd,0xa3,0x7f,0x60 }, 
+    { 0xe0,0xb1,0x64,0x77 }, { 0xeb,0xbf,0x6d,0x7a }, 
+    { 0xda,0x95,0x52,0x59 }, { 0xd1,0x9b,0x5b,0x54 }, 
+    { 0xcc,0x89,0x40,0x43 }, { 0xc7,0x87,0x49,0x4e }, 
+    { 0xae,0xdd,0x3e,0x05 }, { 0xa5,0xd3,0x37,0x08 },
+    { 0xb8,0xc1,0x2c,0x1f }, { 0xb3,0xcf,0x25,0x12 }, 
+    { 0x82,0xe5,0x1a,0x31 }, { 0x89,0xeb,0x13,0x3c },
+    { 0x94,0xf9,0x08,0x2b }, { 0x9f,0xf7,0x01,0x26 }, 
+    { 0x46,0x4d,0xe6,0xbd }, { 0x4d,0x43,0xef,0xb0 },
+    { 0x50,0x51,0xf4,0xa7 }, { 0x5b,0x5f,0xfd,0xaa }, 
+    { 0x6a,0x75,0xc2,0x89 }, { 0x61,0x7b,0xcb,0x84 },
+    { 0x7c,0x69,0xd0,0x93 }, { 0x77,0x67,0xd9,0x9e }, 
+    { 0x1e,0x3d,0xae,0xd5 }, { 0x15,0x33,0xa7,0xd8 },
+    { 0x08,0x21,0xbc,0xcf }, { 0x03,0x2f,0xb5,0xc2 }, 
+    { 0x32,0x05,0x8a,0xe1 }, { 0x39,0x0b,0x83,0xec },
+    { 0x24,0x19,0x98,0xfb }, { 0x2f,0x17,0x91,0xf6 }, 
+    { 0x8d,0x76,0x4d,0xd6 }, { 0x86,0x78,0x44,0xdb },
+    { 0x9b,0x6a,0x5f,0xcc }, { 0x90,0x64,0x56,0xc1 }, 
+    { 0xa1,0x4e,0x69,0xe2 }, { 0xaa,0x40,0x60,0xef },
+    { 0xb7,0x52,0x7b,0xf8 }, { 0xbc,0x5c,0x72,0xf5 }, 
+    { 0xd5,0x06,0x05,0xbe }, { 0xde,0x08,0x0c,0xb3 },
+    { 0xc3,0x1a,0x17,0xa4 }, { 0xc8,0x14,0x1e,0xa9 }, 
+    { 0xf9,0x3e,0x21,0x8a }, { 0xf2,0x30,0x28,0x87 },
+    { 0xef,0x22,0x33,0x90 }, { 0xe4,0x2c,0x3a,0x9d }, 
+    { 0x3d,0x96,0xdd,0x06 }, { 0x36,0x98,0xd4,0x0b },
+    { 0x2b,0x8a,0xcf,0x1c }, { 0x20,0x84,0xc6,0x11 }, 
+    { 0x11,0xae,0xf9,0x32 }, { 0x1a,0xa0,0xf0,0x3f },
+    { 0x07,0xb2,0xeb,0x28 }, { 0x0c,0xbc,0xe2,0x25 }, 
+    { 0x65,0xe6,0x95,0x6e }, { 0x6e,0xe8,0x9c,0x63 },
+    { 0x73,0xfa,0x87,0x74 }, { 0x78,0xf4,0x8e,0x79 }, 
+    { 0x49,0xde,0xb1,0x5a }, { 0x42,0xd0,0xb8,0x57 },
+    { 0x5f,0xc2,0xa3,0x40 }, { 0x54,0xcc,0xaa,0x4d }, 
+    { 0xf7,0x41,0xec,0xda }, { 0xfc,0x4f,0xe5,0xd7 },
+    { 0xe1,0x5d,0xfe,0xc0 }, { 0xea,0x53,0xf7,0xcd }, 
+    { 0xdb,0x79,0xc8,0xee }, { 0xd0,0x77,0xc1,0xe3 },
+    { 0xcd,0x65,0xda,0xf4 }, { 0xc6,0x6b,0xd3,0xf9 }, 
+    { 0xaf,0x31,0xa4,0xb2 }, { 0xa4,0x3f,0xad,0xbf },
+    { 0xb9,0x2d,0xb6,0xa8 }, { 0xb2,0x23,0xbf,0xa5 }, 
+    { 0x83,0x09,0x80,0x86 }, { 0x88,0x07,0x89,0x8b },
+    { 0x95,0x15,0x92,0x9c }, { 0x9e,0x1b,0x9b,0x91 }, 
+    { 0x47,0xa1,0x7c,0x0a }, { 0x4c,0xaf,0x75,0x07 },
+    { 0x51,0xbd,0x6e,0x10 }, { 0x5a,0xb3,0x67,0x1d }, 
+    { 0x6b,0x99,0x58,0x3e }, { 0x60,0x97,0x51,0x33 },
+    { 0x7d,0x85,0x4a,0x24 }, { 0x76,0x8b,0x43,0x29 }, 
+    { 0x1f,0xd1,0x34,0x62 }, { 0x14,0xdf,0x3d,0x6f },
+    { 0x09,0xcd,0x26,0x78 }, { 0x02,0xc3,0x2f,0x75 }, 
+    { 0x33,0xe9,0x10,0x56 }, { 0x38,0xe7,0x19,0x5b },
+    { 0x25,0xf5,0x02,0x4c }, { 0x2e,0xfb,0x0b,0x41 }, 
+    { 0x8c,0x9a,0xd7,0x61 }, { 0x87,0x94,0xde,0x6c },
+    { 0x9a,0x86,0xc5,0x7b }, { 0x91,0x88,0xcc,0x76 }, 
+    { 0xa0,0xa2,0xf3,0x55 }, { 0xab,0xac,0xfa,0x58 },
+    { 0xb6,0xbe,0xe1,0x4f }, { 0xbd,0xb0,0xe8,0x42 }, 
+    { 0xd4,0xea,0x9f,0x09 }, { 0xdf,0xe4,0x96,0x04 },
+    { 0xc2,0xf6,0x8d,0x13 }, { 0xc9,0xf8,0x84,0x1e }, 
+    { 0xf8,0xd2,0xbb,0x3d }, { 0xf3,0xdc,0xb2,0x30 },
+    { 0xee,0xce,0xa9,0x27 }, { 0xe5,0xc0,0xa0,0x2a }, 
+    { 0x3c,0x7a,0x47,0xb1 }, { 0x37,0x74,0x4e,0xbc },
+    { 0x2a,0x66,0x55,0xab }, { 0x21,0x68,0x5c,0xa6 }, 
+    { 0x10,0x42,0x63,0x85 }, { 0x1b,0x4c,0x6a,0x88 },
+    { 0x06,0x5e,0x71,0x9f }, { 0x0d,0x50,0x78,0x92 }, 
+    { 0x64,0x0a,0x0f,0xd9 }, { 0x6f,0x04,0x06,0xd4 },
+    { 0x72,0x16,0x1d,0xc3 }, { 0x79,0x18,0x14,0xce }, 
+    { 0x48,0x32,0x2b,0xed }, { 0x43,0x3c,0x22,0xe0 },
+    { 0x5e,0x2e,0x39,0xf7 }, { 0x55,0x20,0x30,0xfa }, 
+    { 0x01,0xec,0x9a,0xb7 }, { 0x0a,0xe2,0x93,0xba },
+    { 0x17,0xf0,0x88,0xad }, { 0x1c,0xfe,0x81,0xa0 }, 
+    { 0x2d,0xd4,0xbe,0x83 }, { 0x26,0xda,0xb7,0x8e },
+    { 0x3b,0xc8,0xac,0x99 }, { 0x30,0xc6,0xa5,0x94 }, 
+    { 0x59,0x9c,0xd2,0xdf }, { 0x52,0x92,0xdb,0xd2 },
+    { 0x4f,0x80,0xc0,0xc5 }, { 0x44,0x8e,0xc9,0xc8 }, 
+    { 0x75,0xa4,0xf6,0xeb }, { 0x7e,0xaa,0xff,0xe6 },
+    { 0x63,0xb8,0xe4,0xf1 }, { 0x68,0xb6,0xed,0xfc }, 
+    { 0xb1,0x0c,0x0a,0x67 }, { 0xba,0x02,0x03,0x6a },
+    { 0xa7,0x10,0x18,0x7d }, { 0xac,0x1e,0x11,0x70 }, 
+    { 0x9d,0x34,0x2e,0x53 }, { 0x96,0x3a,0x27,0x5e },
+    { 0x8b,0x28,0x3c,0x49 }, { 0x80,0x26,0x35,0x44 }, 
+    { 0xe9,0x7c,0x42,0x0f }, { 0xe2,0x72,0x4b,0x02 },
+    { 0xff,0x60,0x50,0x15 }, { 0xf4,0x6e,0x59,0x18 }, 
+    { 0xc5,0x44,0x66,0x3b }, { 0xce,0x4a,0x6f,0x36 },
+    { 0xd3,0x58,0x74,0x21 }, { 0xd8,0x56,0x7d,0x2c }, 
+    { 0x7a,0x37,0xa1,0x0c }, { 0x71,0x39,0xa8,0x01 },
+    { 0x6c,0x2b,0xb3,0x16 }, { 0x67,0x25,0xba,0x1b }, 
+    { 0x56,0x0f,0x85,0x38 }, { 0x5d,0x01,0x8c,0x35 },
+    { 0x40,0x13,0x97,0x22 }, { 0x4b,0x1d,0x9e,0x2f }, 
+    { 0x22,0x47,0xe9,0x64 }, { 0x29,0x49,0xe0,0x69 },
+    { 0x34,0x5b,0xfb,0x7e }, { 0x3f,0x55,0xf2,0x73 }, 
+    { 0x0e,0x7f,0xcd,0x50 }, { 0x05,0x71,0xc4,0x5d },
+    { 0x18,0x63,0xdf,0x4a }, { 0x13,0x6d,0xd6,0x47 }, 
+    { 0xca,0xd7,0x31,0xdc }, { 0xc1,0xd9,0x38,0xd1 },
+    { 0xdc,0xcb,0x23,0xc6 }, { 0xd7,0xc5,0x2a,0xcb }, 
+    { 0xe6,0xef,0x15,0xe8 }, { 0xed,0xe1,0x1c,0xe5 },
+    { 0xf0,0xf3,0x07,0xf2 }, { 0xfb,0xfd,0x0e,0xff }, 
+    { 0x92,0xa7,0x79,0xb4 }, { 0x99,0xa9,0x70,0xb9 },
+    { 0x84,0xbb,0x6b,0xae }, { 0x8f,0xb5,0x62,0xa3 }, 
+    { 0xbe,0x9f,0x5d,0x80 }, { 0xb5,0x91,0x54,0x8d },
+    { 0xa8,0x83,0x4f,0x9a }, { 0xa3,0x8d,0x46,0x97 }
+};
+
+static const byte U3[256][4] = {
+    { 0x00,0x00,0x00,0x00 }, { 0x0d,0x0b,0x0e,0x09 },
+    { 0x1a,0x16,0x1c,0x12 }, { 0x17,0x1d,0x12,0x1b }, 
+    { 0x34,0x2c,0x38,0x24 }, { 0x39,0x27,0x36,0x2d },
+    { 0x2e,0x3a,0x24,0x36 }, { 0x23,0x31,0x2a,0x3f }, 
+    { 0x68,0x58,0x70,0x48 }, { 0x65,0x53,0x7e,0x41 },
+    { 0x72,0x4e,0x6c,0x5a }, { 0x7f,0x45,0x62,0x53 }, 
+    { 0x5c,0x74,0x48,0x6c }, { 0x51,0x7f,0x46,0x65 },
+    { 0x46,0x62,0x54,0x7e }, { 0x4b,0x69,0x5a,0x77 }, 
+    { 0xd0,0xb0,0xe0,0x90 }, { 0xdd,0xbb,0xee,0x99 },
+    { 0xca,0xa6,0xfc,0x82 }, { 0xc7,0xad,0xf2,0x8b }, 
+    { 0xe4,0x9c,0xd8,0xb4 }, { 0xe9,0x97,0xd6,0xbd },
+    { 0xfe,0x8a,0xc4,0xa6 }, { 0xf3,0x81,0xca,0xaf }, 
+    { 0xb8,0xe8,0x90,0xd8 }, { 0xb5,0xe3,0x9e,0xd1 },
+    { 0xa2,0xfe,0x8c,0xca }, { 0xaf,0xf5,0x82,0xc3 }, 
+    { 0x8c,0xc4,0xa8,0xfc }, { 0x81,0xcf,0xa6,0xf5 },
+    { 0x96,0xd2,0xb4,0xee }, { 0x9b,0xd9,0xba,0xe7 }, 
+    { 0xbb,0x7b,0xdb,0x3b }, { 0xb6,0x70,0xd5,0x32 },
+    { 0xa1,0x6d,0xc7,0x29 }, { 0xac,0x66,0xc9,0x20 }, 
+    { 0x8f,0x57,0xe3,0x1f }, { 0x82,0x5c,0xed,0x16 },
+    { 0x95,0x41,0xff,0x0d }, { 0x98,0x4a,0xf1,0x04 }, 
+    { 0xd3,0x23,0xab,0x73 }, { 0xde,0x28,0xa5,0x7a },
+    { 0xc9,0x35,0xb7,0x61 }, { 0xc4,0x3e,0xb9,0x68 }, 
+    { 0xe7,0x0f,0x93,0x57 }, { 0xea,0x04,0x9d,0x5e },
+    { 0xfd,0x19,0x8f,0x45 }, { 0xf0,0x12,0x81,0x4c }, 
+    { 0x6b,0xcb,0x3b,0xab }, { 0x66,0xc0,0x35,0xa2 },
+    { 0x71,0xdd,0x27,0xb9 }, { 0x7c,0xd6,0x29,0xb0 }, 
+    { 0x5f,0xe7,0x03,0x8f }, { 0x52,0xec,0x0d,0x86 },
+    { 0x45,0xf1,0x1f,0x9d }, { 0x48,0xfa,0x11,0x94 }, 
+    { 0x03,0x93,0x4b,0xe3 }, { 0x0e,0x98,0x45,0xea },
+    { 0x19,0x85,0x57,0xf1 }, { 0x14,0x8e,0x59,0xf8 }, 
+    { 0x37,0xbf,0x73,0xc7 }, { 0x3a,0xb4,0x7d,0xce }, 
+    { 0x2d,0xa9,0x6f,0xd5 }, { 0x20,0xa2,0x61,0xdc }, 
+    { 0x6d,0xf6,0xad,0x76 }, { 0x60,0xfd,0xa3,0x7f },
+    { 0x77,0xe0,0xb1,0x64 }, { 0x7a,0xeb,0xbf,0x6d }, 
+    { 0x59,0xda,0x95,0x52 }, { 0x54,0xd1,0x9b,0x5b },
+    { 0x43,0xcc,0x89,0x40 }, { 0x4e,0xc7,0x87,0x49 }, 
+    { 0x05,0xae,0xdd,0x3e }, { 0x08,0xa5,0xd3,0x37 },
+    { 0x1f,0xb8,0xc1,0x2c }, { 0x12,0xb3,0xcf,0x25 }, 
+    { 0x31,0x82,0xe5,0x1a }, { 0x3c,0x89,0xeb,0x13 }, 
+    { 0x2b,0x94,0xf9,0x08 }, { 0x26,0x9f,0xf7,0x01 }, 
+    { 0xbd,0x46,0x4d,0xe6 }, { 0xb0,0x4d,0x43,0xef }, 
+    { 0xa7,0x50,0x51,0xf4 }, { 0xaa,0x5b,0x5f,0xfd }, 
+    { 0x89,0x6a,0x75,0xc2 }, { 0x84,0x61,0x7b,0xcb }, 
+    { 0x93,0x7c,0x69,0xd0 }, { 0x9e,0x77,0x67,0xd9 }, 
+    { 0xd5,0x1e,0x3d,0xae }, { 0xd8,0x15,0x33,0xa7 },
+    { 0xcf,0x08,0x21,0xbc }, { 0xc2,0x03,0x2f,0xb5 }, 
+    { 0xe1,0x32,0x05,0x8a }, { 0xec,0x39,0x0b,0x83 },
+    { 0xfb,0x24,0x19,0x98 }, { 0xf6,0x2f,0x17,0x91 }, 
+    { 0xd6,0x8d,0x76,0x4d }, { 0xdb,0x86,0x78,0x44 }, 
+    { 0xcc,0x9b,0x6a,0x5f }, { 0xc1,0x90,0x64,0x56 }, 
+    { 0xe2,0xa1,0x4e,0x69 }, { 0xef,0xaa,0x40,0x60 }, 
+    { 0xf8,0xb7,0x52,0x7b }, { 0xf5,0xbc,0x5c,0x72 }, 
+    { 0xbe,0xd5,0x06,0x05 }, { 0xb3,0xde,0x08,0x0c }, 
+    { 0xa4,0xc3,0x1a,0x17 }, { 0xa9,0xc8,0x14,0x1e }, 
+    { 0x8a,0xf9,0x3e,0x21 }, { 0x87,0xf2,0x30,0x28 },
+    { 0x90,0xef,0x22,0x33 }, { 0x9d,0xe4,0x2c,0x3a }, 
+    { 0x06,0x3d,0x96,0xdd }, { 0x0b,0x36,0x98,0xd4 },
+    { 0x1c,0x2b,0x8a,0xcf }, { 0x11,0x20,0x84,0xc6 }, 
+    { 0x32,0x11,0xae,0xf9 }, { 0x3f,0x1a,0xa0,0xf0 },
+    { 0x28,0x07,0xb2,0xeb }, { 0x25,0x0c,0xbc,0xe2 }, 
+    { 0x6e,0x65,0xe6,0x95 }, { 0x63,0x6e,0xe8,0x9c },
+    { 0x74,0x73,0xfa,0x87 }, { 0x79,0x78,0xf4,0x8e }, 
+    { 0x5a,0x49,0xde,0xb1 }, { 0x57,0x42,0xd0,0xb8 },
+    { 0x40,0x5f,0xc2,0xa3 }, { 0x4d,0x54,0xcc,0xaa }, 
+    { 0xda,0xf7,0x41,0xec }, { 0xd7,0xfc,0x4f,0xe5 },
+    { 0xc0,0xe1,0x5d,0xfe }, { 0xcd,0xea,0x53,0xf7 }, 
+    { 0xee,0xdb,0x79,0xc8 }, { 0xe3,0xd0,0x77,0xc1 },
+    { 0xf4,0xcd,0x65,0xda }, { 0xf9,0xc6,0x6b,0xd3 }, 
+    { 0xb2,0xaf,0x31,0xa4 }, { 0xbf,0xa4,0x3f,0xad },
+    { 0xa8,0xb9,0x2d,0xb6 }, { 0xa5,0xb2,0x23,0xbf }, 
+    { 0x86,0x83,0x09,0x80 }, { 0x8b,0x88,0x07,0x89 },
+    { 0x9c,0x95,0x15,0x92 }, { 0x91,0x9e,0x1b,0x9b }, 
+    { 0x0a,0x47,0xa1,0x7c }, { 0x07,0x4c,0xaf,0x75 },
+    { 0x10,0x51,0xbd,0x6e }, { 0x1d,0x5a,0xb3,0x67 }, 
+    { 0x3e,0x6b,0x99,0x58 }, { 0x33,0x60,0x97,0x51 },
+    { 0x24,0x7d,0x85,0x4a }, { 0x29,0x76,0x8b,0x43 }, 
+    { 0x62,0x1f,0xd1,0x34 }, { 0x6f,0x14,0xdf,0x3d },
+    { 0x78,0x09,0xcd,0x26 }, { 0x75,0x02,0xc3,0x2f }, 
+    { 0x56,0x33,0xe9,0x10 }, { 0x5b,0x38,0xe7,0x19 },
+    { 0x4c,0x25,0xf5,0x02 }, { 0x41,0x2e,0xfb,0x0b }, 
+    { 0x61,0x8c,0x9a,0xd7 }, { 0x6c,0x87,0x94,0xde },
+    { 0x7b,0x9a,0x86,0xc5 }, { 0x76,0x91,0x88,0xcc }, 
+    { 0x55,0xa0,0xa2,0xf3 }, { 0x58,0xab,0xac,0xfa },
+    { 0x4f,0xb6,0xbe,0xe1 }, { 0x42,0xbd,0xb0,0xe8 }, 
+    { 0x09,0xd4,0xea,0x9f }, { 0x04,0xdf,0xe4,0x96 },
+    { 0x13,0xc2,0xf6,0x8d }, { 0x1e,0xc9,0xf8,0x84 }, 
+    { 0x3d,0xf8,0xd2,0xbb }, { 0x30,0xf3,0xdc,0xb2 },
+    { 0x27,0xee,0xce,0xa9 }, { 0x2a,0xe5,0xc0,0xa0 }, 
+    { 0xb1,0x3c,0x7a,0x47 }, { 0xbc,0x37,0x74,0x4e },
+    { 0xab,0x2a,0x66,0x55 }, { 0xa6,0x21,0x68,0x5c }, 
+    { 0x85,0x10,0x42,0x63 }, { 0x88,0x1b,0x4c,0x6a },
+    { 0x9f,0x06,0x5e,0x71 }, { 0x92,0x0d,0x50,0x78 }, 
+    { 0xd9,0x64,0x0a,0x0f }, { 0xd4,0x6f,0x04,0x06 },
+    { 0xc3,0x72,0x16,0x1d }, { 0xce,0x79,0x18,0x14 }, 
+    { 0xed,0x48,0x32,0x2b }, { 0xe0,0x43,0x3c,0x22 },
+    { 0xf7,0x5e,0x2e,0x39 }, { 0xfa,0x55,0x20,0x30 }, 
+    { 0xb7,0x01,0xec,0x9a }, { 0xba,0x0a,0xe2,0x93 },
+    { 0xad,0x17,0xf0,0x88 }, { 0xa0,0x1c,0xfe,0x81 }, 
+    { 0x83,0x2d,0xd4,0xbe }, { 0x8e,0x26,0xda,0xb7 },
+    { 0x99,0x3b,0xc8,0xac }, { 0x94,0x30,0xc6,0xa5 }, 
+    { 0xdf,0x59,0x9c,0xd2 }, { 0xd2,0x52,0x92,0xdb },
+    { 0xc5,0x4f,0x80,0xc0 }, { 0xc8,0x44,0x8e,0xc9 }, 
+    { 0xeb,0x75,0xa4,0xf6 }, { 0xe6,0x7e,0xaa,0xff },
+    { 0xf1,0x63,0xb8,0xe4 }, { 0xfc,0x68,0xb6,0xed }, 
+    { 0x67,0xb1,0x0c,0x0a }, { 0x6a,0xba,0x02,0x03 },
+    { 0x7d,0xa7,0x10,0x18 }, { 0x70,0xac,0x1e,0x11 }, 
+    { 0x53,0x9d,0x34,0x2e }, { 0x5e,0x96,0x3a,0x27 },
+    { 0x49,0x8b,0x28,0x3c }, { 0x44,0x80,0x26,0x35 }, 
+    { 0x0f,0xe9,0x7c,0x42 }, { 0x02,0xe2,0x72,0x4b },
+    { 0x15,0xff,0x60,0x50 }, { 0x18,0xf4,0x6e,0x59 }, 
+    { 0x3b,0xc5,0x44,0x66 }, { 0x36,0xce,0x4a,0x6f },
+    { 0x21,0xd3,0x58,0x74 }, { 0x2c,0xd8,0x56,0x7d }, 
+    { 0x0c,0x7a,0x37,0xa1 }, { 0x01,0x71,0x39,0xa8 },
+    { 0x16,0x6c,0x2b,0xb3 }, { 0x1b,0x67,0x25,0xba }, 
+    { 0x38,0x56,0x0f,0x85 }, { 0x35,0x5d,0x01,0x8c },
+    { 0x22,0x40,0x13,0x97 }, { 0x2f,0x4b,0x1d,0x9e }, 
+    { 0x64,0x22,0x47,0xe9 }, { 0x69,0x29,0x49,0xe0 },
+    { 0x7e,0x34,0x5b,0xfb }, { 0x73,0x3f,0x55,0xf2 }, 
+    { 0x50,0x0e,0x7f,0xcd }, { 0x5d,0x05,0x71,0xc4 },
+    { 0x4a,0x18,0x63,0xdf }, { 0x47,0x13,0x6d,0xd6 }, 
+    { 0xdc,0xca,0xd7,0x31 }, { 0xd1,0xc1,0xd9,0x38 },
+    { 0xc6,0xdc,0xcb,0x23 }, { 0xcb,0xd7,0xc5,0x2a }, 
+    { 0xe8,0xe6,0xef,0x15 }, { 0xe5,0xed,0xe1,0x1c },
+    { 0xf2,0xf0,0xf3,0x07 }, { 0xff,0xfb,0xfd,0x0e }, 
+    { 0xb4,0x92,0xa7,0x79 }, { 0xb9,0x99,0xa9,0x70 },
+    { 0xae,0x84,0xbb,0x6b }, { 0xa3,0x8f,0xb5,0x62 }, 
+    { 0x80,0xbe,0x9f,0x5d }, { 0x8d,0xb5,0x91,0x54 },
+    { 0x9a,0xa8,0x83,0x4f }, { 0x97,0xa3,0x8d,0x46 }
+};
+
+static const byte U4[256][4] = {
+    { 0x00,0x00,0x00,0x00 }, { 0x09,0x0d,0x0b,0x0e },
+    { 0x12,0x1a,0x16,0x1c }, { 0x1b,0x17,0x1d,0x12 }, 
+    { 0x24,0x34,0x2c,0x38 }, { 0x2d,0x39,0x27,0x36 },
+    { 0x36,0x2e,0x3a,0x24 }, { 0x3f,0x23,0x31,0x2a }, 
+    { 0x48,0x68,0x58,0x70 }, { 0x41,0x65,0x53,0x7e },
+    { 0x5a,0x72,0x4e,0x6c }, { 0x53,0x7f,0x45,0x62 }, 
+    { 0x6c,0x5c,0x74,0x48 }, { 0x65,0x51,0x7f,0x46 },
+    { 0x7e,0x46,0x62,0x54 }, { 0x77,0x4b,0x69,0x5a }, 
+    { 0x90,0xd0,0xb0,0xe0 }, { 0x99,0xdd,0xbb,0xee },
+    { 0x82,0xca,0xa6,0xfc }, { 0x8b,0xc7,0xad,0xf2 }, 
+    { 0xb4,0xe4,0x9c,0xd8 }, { 0xbd,0xe9,0x97,0xd6 },
+    { 0xa6,0xfe,0x8a,0xc4 }, { 0xaf,0xf3,0x81,0xca }, 
+    { 0xd8,0xb8,0xe8,0x90 }, { 0xd1,0xb5,0xe3,0x9e },
+    { 0xca,0xa2,0xfe,0x8c }, { 0xc3,0xaf,0xf5,0x82 }, 
+    { 0xfc,0x8c,0xc4,0xa8 }, { 0xf5,0x81,0xcf,0xa6 },
+    { 0xee,0x96,0xd2,0xb4 }, { 0xe7,0x9b,0xd9,0xba }, 
+    { 0x3b,0xbb,0x7b,0xdb }, { 0x32,0xb6,0x70,0xd5 },
+    { 0x29,0xa1,0x6d,0xc7 }, { 0x20,0xac,0x66,0xc9 }, 
+    { 0x1f,0x8f,0x57,0xe3 }, { 0x16,0x82,0x5c,0xed },
+    { 0x0d,0x95,0x41,0xff }, { 0x04,0x98,0x4a,0xf1 }, 
+    { 0x73,0xd3,0x23,0xab }, { 0x7a,0xde,0x28,0xa5 },
+    { 0x61,0xc9,0x35,0xb7 }, { 0x68,0xc4,0x3e,0xb9 }, 
+    { 0x57,0xe7,0x0f,0x93 }, { 0x5e,0xea,0x04,0x9d },
+    { 0x45,0xfd,0x19,0x8f }, { 0x4c,0xf0,0x12,0x81 }, 
+    { 0xab,0x6b,0xcb,0x3b }, { 0xa2,0x66,0xc0,0x35 },
+    { 0xb9,0x71,0xdd,0x27 }, { 0xb0,0x7c,0xd6,0x29 }, 
+    { 0x8f,0x5f,0xe7,0x03 }, { 0x86,0x52,0xec,0x0d },
+    { 0x9d,0x45,0xf1,0x1f }, { 0x94,0x48,0xfa,0x11 }, 
+    { 0xe3,0x03,0x93,0x4b }, { 0xea,0x0e,0x98,0x45 },
+    { 0xf1,0x19,0x85,0x57 }, { 0xf8,0x14,0x8e,0x59 }, 
+    { 0xc7,0x37,0xbf,0x73 }, { 0xce,0x3a,0xb4,0x7d },
+    { 0xd5,0x2d,0xa9,0x6f }, { 0xdc,0x20,0xa2,0x61 }, 
+    { 0x76,0x6d,0xf6,0xad }, { 0x7f,0x60,0xfd,0xa3 },
+    { 0x64,0x77,0xe0,0xb1 }, { 0x6d,0x7a,0xeb,0xbf }, 
+    { 0x52,0x59,0xda,0x95 }, { 0x5b,0x54,0xd1,0x9b },
+    { 0x40,0x43,0xcc,0x89 }, { 0x49,0x4e,0xc7,0x87 }, 
+    { 0x3e,0x05,0xae,0xdd }, { 0x37,0x08,0xa5,0xd3 },
+    { 0x2c,0x1f,0xb8,0xc1 }, { 0x25,0x12,0xb3,0xcf }, 
+    { 0x1a,0x31,0x82,0xe5 }, { 0x13,0x3c,0x89,0xeb },
+    { 0x08,0x2b,0x94,0xf9 }, { 0x01,0x26,0x9f,0xf7 }, 
+    { 0xe6,0xbd,0x46,0x4d }, { 0xef,0xb0,0x4d,0x43 },
+    { 0xf4,0xa7,0x50,0x51 }, { 0xfd,0xaa,0x5b,0x5f }, 
+    { 0xc2,0x89,0x6a,0x75 }, { 0xcb,0x84,0x61,0x7b },
+    { 0xd0,0x93,0x7c,0x69 }, { 0xd9,0x9e,0x77,0x67 }, 
+    { 0xae,0xd5,0x1e,0x3d }, { 0xa7,0xd8,0x15,0x33 },
+    { 0xbc,0xcf,0x08,0x21 }, { 0xb5,0xc2,0x03,0x2f }, 
+    { 0x8a,0xe1,0x32,0x05 }, { 0x83,0xec,0x39,0x0b },
+    { 0x98,0xfb,0x24,0x19 }, { 0x91,0xf6,0x2f,0x17 }, 
+    { 0x4d,0xd6,0x8d,0x76 }, { 0x44,0xdb,0x86,0x78 },
+    { 0x5f,0xcc,0x9b,0x6a }, { 0x56,0xc1,0x90,0x64 }, 
+    { 0x69,0xe2,0xa1,0x4e }, { 0x60,0xef,0xaa,0x40 },
+    { 0x7b,0xf8,0xb7,0x52 }, { 0x72,0xf5,0xbc,0x5c }, 
+    { 0x05,0xbe,0xd5,0x06 }, { 0x0c,0xb3,0xde,0x08 },
+    { 0x17,0xa4,0xc3,0x1a }, { 0x1e,0xa9,0xc8,0x14 }, 
+    { 0x21,0x8a,0xf9,0x3e }, { 0x28,0x87,0xf2,0x30 },
+    { 0x33,0x90,0xef,0x22 }, { 0x3a,0x9d,0xe4,0x2c }, 
+    { 0xdd,0x06,0x3d,0x96 }, { 0xd4,0x0b,0x36,0x98 },
+    { 0xcf,0x1c,0x2b,0x8a }, { 0xc6,0x11,0x20,0x84 }, 
+    { 0xf9,0x32,0x11,0xae }, { 0xf0,0x3f,0x1a,0xa0 },
+    { 0xeb,0x28,0x07,0xb2 }, { 0xe2,0x25,0x0c,0xbc }, 
+    { 0x95,0x6e,0x65,0xe6 }, { 0x9c,0x63,0x6e,0xe8 },
+    { 0x87,0x74,0x73,0xfa }, { 0x8e,0x79,0x78,0xf4 }, 
+    { 0xb1,0x5a,0x49,0xde }, { 0xb8,0x57,0x42,0xd0 },
+    { 0xa3,0x40,0x5f,0xc2 }, { 0xaa,0x4d,0x54,0xcc }, 
+    { 0xec,0xda,0xf7,0x41 }, { 0xe5,0xd7,0xfc,0x4f },
+    { 0xfe,0xc0,0xe1,0x5d }, { 0xf7,0xcd,0xea,0x53 }, 
+    { 0xc8,0xee,0xdb,0x79 }, { 0xc1,0xe3,0xd0,0x77 },
+    { 0xda,0xf4,0xcd,0x65 }, { 0xd3,0xf9,0xc6,0x6b }, 
+    { 0xa4,0xb2,0xaf,0x31 }, { 0xad,0xbf,0xa4,0x3f },
+    { 0xb6,0xa8,0xb9,0x2d }, { 0xbf,0xa5,0xb2,0x23 }, 
+    { 0x80,0x86,0x83,0x09 }, { 0x89,0x8b,0x88,0x07 },
+    { 0x92,0x9c,0x95,0x15 }, { 0x9b,0x91,0x9e,0x1b }, 
+    { 0x7c,0x0a,0x47,0xa1 }, { 0x75,0x07,0x4c,0xaf },
+    { 0x6e,0x10,0x51,0xbd }, { 0x67,0x1d,0x5a,0xb3 }, 
+    { 0x58,0x3e,0x6b,0x99 }, { 0x51,0x33,0x60,0x97 },
+    { 0x4a,0x24,0x7d,0x85 }, { 0x43,0x29,0x76,0x8b }, 
+    { 0x34,0x62,0x1f,0xd1 }, { 0x3d,0x6f,0x14,0xdf },
+    { 0x26,0x78,0x09,0xcd }, { 0x2f,0x75,0x02,0xc3 }, 
+    { 0x10,0x56,0x33,0xe9 }, { 0x19,0x5b,0x38,0xe7 },
+    { 0x02,0x4c,0x25,0xf5 }, { 0x0b,0x41,0x2e,0xfb }, 
+    { 0xd7,0x61,0x8c,0x9a }, { 0xde,0x6c,0x87,0x94 },
+    { 0xc5,0x7b,0x9a,0x86 }, { 0xcc,0x76,0x91,0x88 }, 
+    { 0xf3,0x55,0xa0,0xa2 }, { 0xfa,0x58,0xab,0xac },
+    { 0xe1,0x4f,0xb6,0xbe }, { 0xe8,0x42,0xbd,0xb0 }, 
+    { 0x9f,0x09,0xd4,0xea }, { 0x96,0x04,0xdf,0xe4 },
+    { 0x8d,0x13,0xc2,0xf6 }, { 0x84,0x1e,0xc9,0xf8 }, 
+    { 0xbb,0x3d,0xf8,0xd2 }, { 0xb2,0x30,0xf3,0xdc },
+    { 0xa9,0x27,0xee,0xce }, { 0xa0,0x2a,0xe5,0xc0 }, 
+    { 0x47,0xb1,0x3c,0x7a }, { 0x4e,0xbc,0x37,0x74 },
+    { 0x55,0xab,0x2a,0x66 }, { 0x5c,0xa6,0x21,0x68 }, 
+    { 0x63,0x85,0x10,0x42 }, { 0x6a,0x88,0x1b,0x4c },
+    { 0x71,0x9f,0x06,0x5e }, { 0x78,0x92,0x0d,0x50 }, 
+    { 0x0f,0xd9,0x64,0x0a }, { 0x06,0xd4,0x6f,0x04 },
+    { 0x1d,0xc3,0x72,0x16 }, { 0x14,0xce,0x79,0x18 }, 
+    { 0x2b,0xed,0x48,0x32 }, { 0x22,0xe0,0x43,0x3c },
+    { 0x39,0xf7,0x5e,0x2e }, { 0x30,0xfa,0x55,0x20 }, 
+    { 0x9a,0xb7,0x01,0xec }, { 0x93,0xba,0x0a,0xe2 }, 
+    { 0x88,0xad,0x17,0xf0 }, { 0x81,0xa0,0x1c,0xfe }, 
+    { 0xbe,0x83,0x2d,0xd4 }, { 0xb7,0x8e,0x26,0xda },
+    { 0xac,0x99,0x3b,0xc8 }, { 0xa5,0x94,0x30,0xc6 }, 
+    { 0xd2,0xdf,0x59,0x9c }, { 0xdb,0xd2,0x52,0x92 }, 
+    { 0xc0,0xc5,0x4f,0x80 }, { 0xc9,0xc8,0x44,0x8e }, 
+    { 0xf6,0xeb,0x75,0xa4 }, { 0xff,0xe6,0x7e,0xaa },
+    { 0xe4,0xf1,0x63,0xb8 }, { 0xed,0xfc,0x68,0xb6 }, 
+    { 0x0a,0x67,0xb1,0x0c }, { 0x03,0x6a,0xba,0x02 },
+    { 0x18,0x7d,0xa7,0x10 }, { 0x11,0x70,0xac,0x1e }, 
+    { 0x2e,0x53,0x9d,0x34 }, { 0x27,0x5e,0x96,0x3a },
+    { 0x3c,0x49,0x8b,0x28 }, { 0x35,0x44,0x80,0x26 }, 
+    { 0x42,0x0f,0xe9,0x7c }, { 0x4b,0x02,0xe2,0x72 }, 
+    { 0x50,0x15,0xff,0x60 }, { 0x59,0x18,0xf4,0x6e }, 
+    { 0x66,0x3b,0xc5,0x44 }, { 0x6f,0x36,0xce,0x4a },
+    { 0x74,0x21,0xd3,0x58 }, { 0x7d,0x2c,0xd8,0x56 }, 
+    { 0xa1,0x0c,0x7a,0x37 }, { 0xa8,0x01,0x71,0x39 },
+    { 0xb3,0x16,0x6c,0x2b }, { 0xba,0x1b,0x67,0x25 }, 
+    { 0x85,0x38,0x56,0x0f }, { 0x8c,0x35,0x5d,0x01 },
+    { 0x97,0x22,0x40,0x13 }, { 0x9e,0x2f,0x4b,0x1d }, 
+    { 0xe9,0x64,0x22,0x47 }, { 0xe0,0x69,0x29,0x49 }, 
+    { 0xfb,0x7e,0x34,0x5b }, { 0xf2,0x73,0x3f,0x55 }, 
+    { 0xcd,0x50,0x0e,0x7f }, { 0xc4,0x5d,0x05,0x71 },
+    { 0xdf,0x4a,0x18,0x63 }, { 0xd6,0x47,0x13,0x6d }, 
+    { 0x31,0xdc,0xca,0xd7 }, { 0x38,0xd1,0xc1,0xd9 },
+    { 0x23,0xc6,0xdc,0xcb }, { 0x2a,0xcb,0xd7,0xc5 }, 
+    { 0x15,0xe8,0xe6,0xef }, { 0x1c,0xe5,0xed,0xe1 },
+    { 0x07,0xf2,0xf0,0xf3 }, { 0x0e,0xff,0xfb,0xfd }, 
+    { 0x79,0xb4,0x92,0xa7 }, { 0x70,0xb9,0x99,0xa9 },
+    { 0x6b,0xae,0x84,0xbb }, { 0x62,0xa3,0x8f,0xb5 }, 
+    { 0x5d,0x80,0xbe,0x9f }, { 0x54,0x8d,0xb5,0x91 },
+    { 0x4f,0x9a,0xa8,0x83 }, { 0x46,0x97,0xa3,0x8d }
+};
+
+static const u32 rcon[30] = { 
+    0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+    0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
+    0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
+};
+
+\f
+
+static void
+burn_stack (int bytes)
+{
+    char buf[64];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+/* Perform the key setup.
+ */  
+static int
+do_setkey (RIJNDAEL_context *ctx, const byte *key, const unsigned keylen)
+{
+    static int initialized = 0;
+    static const char *selftest_failed=0;
+    int ROUNDS;
+    byte k[MAXKC][4];
+    int i,j, r, t, rconpointer = 0;
+    byte tk[MAXKC][4];
+    int KC;
+    /* space for automatic variables is about 64 + 11*int */
+
+    if (!initialized) {
+        initialized = 1;
+        selftest_failed = selftest ();
+        if( selftest_failed )
+            fprintf(stderr, "%s\n", selftest_failed );
+    }
+    if( selftest_failed )
+        return G10ERR_SELFTEST_FAILED;
+
+    if( keylen == 128/8 ) {
+        ROUNDS = 10;
+        KC = 4;
+    }
+    else if ( keylen == 192/8 ) {
+        ROUNDS = 12;
+        KC = 6;
+    }
+    else if ( keylen == 256/8 ) {
+        ROUNDS = 14;
+        KC = 8;
+    }
+    else
+       return G10ERR_WRONG_KEYLEN;
+
+    ctx->ROUNDS = ROUNDS;
+    ctx->decryption_prepared = 0;
+
+    for (i = 0; i < keylen; i++) {
+        k[i >> 2][i & 3] = key[i]; 
+    }
+#define W (ctx->keySched)
+
+    for (j = KC-1; j >= 0; j--) {
+        *((u32*)tk[j]) = *((u32*)k[j]);
+    }
+    r = 0;
+    t = 0;
+    /* copy values into round key array */
+    for (j = 0; (j < KC) && (r < ROUNDS + 1); ) {
+        for (; (j < KC) && (t < 4); j++, t++) {
+            *((u32*)W[r][t]) = *((u32*)tk[j]);
+        }
+        if (t == 4) {
+            r++;
+            t = 0;
+        }
+    }
+               
+    while (r < ROUNDS + 1) {
+        /* while not enough round key material calculated */
+        /* calculate new values */
+        tk[0][0] ^= S[tk[KC-1][1]];
+        tk[0][1] ^= S[tk[KC-1][2]];
+        tk[0][2] ^= S[tk[KC-1][3]];
+        tk[0][3] ^= S[tk[KC-1][0]];
+        tk[0][0] ^= rcon[rconpointer++];
+        
+        if (KC != 8) {
+            for (j = 1; j < KC; j++) {
+                *((u32*)tk[j]) ^= *((u32*)tk[j-1]);
+            }
+        } else {
+            for (j = 1; j < KC/2; j++) {
+                *((u32*)tk[j]) ^= *((u32*)tk[j-1]);
+            }
+            tk[KC/2][0] ^= S[tk[KC/2 - 1][0]];
+            tk[KC/2][1] ^= S[tk[KC/2 - 1][1]];
+            tk[KC/2][2] ^= S[tk[KC/2 - 1][2]];
+            tk[KC/2][3] ^= S[tk[KC/2 - 1][3]];
+            for (j = KC/2 + 1; j < KC; j++) {
+                *((u32*)tk[j]) ^= *((u32*)tk[j-1]);
+            }
+        }
+        /* copy values into round key array */
+        for (j = 0; (j < KC) && (r < ROUNDS + 1); ) {
+            for (; (j < KC) && (t < 4); j++, t++) {
+                *((u32*)W[r][t]) = *((u32*)tk[j]);
+            }
+            if (t == 4) {
+                r++;
+                t = 0;
+            }
+        }
+    }          
+    
+#undef W    
+    return 0;
+}
+
+static int
+rijndael_setkey (void *ctx, const byte *key, const unsigned keylen)
+{
+    int rc = do_setkey (ctx, key, keylen);
+    burn_stack ( 100 + 16*sizeof(int));
+    return rc;
+}
+
+/* make a decryption  key from an encryption key */
+static void
+prepare_decryption( RIJNDAEL_context *ctx )
+{
+    int r;
+    byte *w;
+
+    for (r=0; r < MAXROUNDS+1; r++ ) {
+        *((u32*)ctx->keySched2[r][0]) = *((u32*)ctx->keySched[r][0]);
+        *((u32*)ctx->keySched2[r][1]) = *((u32*)ctx->keySched[r][1]);
+        *((u32*)ctx->keySched2[r][2]) = *((u32*)ctx->keySched[r][2]);
+        *((u32*)ctx->keySched2[r][3]) = *((u32*)ctx->keySched[r][3]);
+    }
+#define W (ctx->keySched2)
+    for (r = 1; r < ctx->ROUNDS; r++) {
+        w = W[r][0];
+        *((u32*)w) = *((u32*)U1[w[0]]) ^ *((u32*)U2[w[1]])
+                   ^ *((u32*)U3[w[2]]) ^ *((u32*)U4[w[3]]);
+       
+        w = W[r][1];
+        *((u32*)w) = *((u32*)U1[w[0]]) ^ *((u32*)U2[w[1]])
+                   ^ *((u32*)U3[w[2]]) ^ *((u32*)U4[w[3]]);
+        
+        w = W[r][2];
+        *((u32*)w) = *((u32*)U1[w[0]]) ^ *((u32*)U2[w[1]])
+                   ^ *((u32*)U3[w[2]]) ^ *((u32*)U4[w[3]]);
+        
+        w = W[r][3];
+        *((u32*)w) = *((u32*)U1[w[0]]) ^ *((u32*)U2[w[1]])
+                   ^ *((u32*)U3[w[2]]) ^ *((u32*)U4[w[3]]);
+    }
+#undef W
+}      
+
+
+\f
+/* Encrypt one block.  A and B may be the same. */
+static void
+do_encrypt (const RIJNDAEL_context *ctx, byte *b, const byte *a)
+{
+    int r;
+    byte temp[4][4];
+    int ROUNDS = ctx->ROUNDS;
+#define rk (ctx->keySched)
+
+    *((u32*)temp[0]) = *((u32*)(a   )) ^ *((u32*)rk[0][0]);
+    *((u32*)temp[1]) = *((u32*)(a+ 4)) ^ *((u32*)rk[0][1]);
+    *((u32*)temp[2]) = *((u32*)(a+ 8)) ^ *((u32*)rk[0][2]);
+    *((u32*)temp[3]) = *((u32*)(a+12)) ^ *((u32*)rk[0][3]);
+    *((u32*)(b    )) = *((u32*)T1[temp[0][0]])
+        ^ *((u32*)T2[temp[1][1]])
+        ^ *((u32*)T3[temp[2][2]]) 
+        ^ *((u32*)T4[temp[3][3]]);
+    *((u32*)(b + 4)) = *((u32*)T1[temp[1][0]])
+        ^ *((u32*)T2[temp[2][1]])
+        ^ *((u32*)T3[temp[3][2]]) 
+        ^ *((u32*)T4[temp[0][3]]);
+    *((u32*)(b + 8)) = *((u32*)T1[temp[2][0]])
+        ^ *((u32*)T2[temp[3][1]])
+        ^ *((u32*)T3[temp[0][2]]) 
+        ^ *((u32*)T4[temp[1][3]]);
+    *((u32*)(b +12)) = *((u32*)T1[temp[3][0]])
+        ^ *((u32*)T2[temp[0][1]])
+        ^ *((u32*)T3[temp[1][2]]) 
+        ^ *((u32*)T4[temp[2][3]]);
+    for (r = 1; r < ROUNDS-1; r++) {
+        *((u32*)temp[0]) = *((u32*)(b   )) ^ *((u32*)rk[r][0]);
+        *((u32*)temp[1]) = *((u32*)(b+ 4)) ^ *((u32*)rk[r][1]);
+        *((u32*)temp[2]) = *((u32*)(b+ 8)) ^ *((u32*)rk[r][2]);
+        *((u32*)temp[3]) = *((u32*)(b+12)) ^ *((u32*)rk[r][3]);
+
+        *((u32*)(b    )) = *((u32*)T1[temp[0][0]])
+            ^ *((u32*)T2[temp[1][1]])
+            ^ *((u32*)T3[temp[2][2]]) 
+            ^ *((u32*)T4[temp[3][3]]);
+        *((u32*)(b + 4)) = *((u32*)T1[temp[1][0]])
+            ^ *((u32*)T2[temp[2][1]])
+            ^ *((u32*)T3[temp[3][2]]) 
+            ^ *((u32*)T4[temp[0][3]]);
+        *((u32*)(b + 8)) = *((u32*)T1[temp[2][0]])
+            ^ *((u32*)T2[temp[3][1]])
+            ^ *((u32*)T3[temp[0][2]]) 
+            ^ *((u32*)T4[temp[1][3]]);
+        *((u32*)(b +12)) = *((u32*)T1[temp[3][0]])
+            ^ *((u32*)T2[temp[0][1]])
+            ^ *((u32*)T3[temp[1][2]]) 
+            ^ *((u32*)T4[temp[2][3]]);
+    }
+    /* last round is special */   
+    *((u32*)temp[0]) = *((u32*)(b   )) ^ *((u32*)rk[ROUNDS-1][0]);
+    *((u32*)temp[1]) = *((u32*)(b+ 4)) ^ *((u32*)rk[ROUNDS-1][1]);
+    *((u32*)temp[2]) = *((u32*)(b+ 8)) ^ *((u32*)rk[ROUNDS-1][2]);
+    *((u32*)temp[3]) = *((u32*)(b+12)) ^ *((u32*)rk[ROUNDS-1][3]);
+    b[ 0] = T1[temp[0][0]][1];
+    b[ 1] = T1[temp[1][1]][1];
+    b[ 2] = T1[temp[2][2]][1];
+    b[ 3] = T1[temp[3][3]][1];
+    b[ 4] = T1[temp[1][0]][1];
+    b[ 5] = T1[temp[2][1]][1];
+    b[ 6] = T1[temp[3][2]][1];
+    b[ 7] = T1[temp[0][3]][1];
+    b[ 8] = T1[temp[2][0]][1];
+    b[ 9] = T1[temp[3][1]][1];
+    b[10] = T1[temp[0][2]][1];
+    b[11] = T1[temp[1][3]][1];
+    b[12] = T1[temp[3][0]][1];
+    b[13] = T1[temp[0][1]][1];
+    b[14] = T1[temp[1][2]][1];
+    b[15] = T1[temp[2][3]][1];
+    *((u32*)(b   )) ^= *((u32*)rk[ROUNDS][0]);
+    *((u32*)(b+ 4)) ^= *((u32*)rk[ROUNDS][1]);
+    *((u32*)(b+ 8)) ^= *((u32*)rk[ROUNDS][2]);
+    *((u32*)(b+12)) ^= *((u32*)rk[ROUNDS][3]);
+#undef rk
+}
+
+static void
+rijndael_encrypt (void *ctx, byte *b, const byte *a)
+{
+    do_encrypt (ctx, b, a);
+    burn_stack (16 + 2*sizeof(int));
+}
+
+#if 0
+/* Experimental code.  Needs to be generalized and we might want to
+   have variants for all possible sizes of the largest scalar type.
+   Also need to make sure that INBUF and OUTBUF are properlu
+   aligned. */
+void
+rijndael_cfb_encrypt (void *ctx, byte *iv,
+                      byte *outbuf, const byte *inbuf, size_t nbytes)
+{
+/*   if ( ((unsigned long)inbuf & 3) || ((unsigned long)outbuf & 3) ) */
+/*     {  */
+      /* Not properly aligned, use the slow version.  Actually the
+         compiler might even optimize it this pretty well if the
+         target CPU has relaxed alignment requirements. Thus it is
+         questionable whether we should at all go into the hassles of
+         doing alignment wise optimizations by ourself.  A quick test
+         with gcc 4.0 on ia32 did showed any advantages. */
+      byte *ivp;
+      int i;
+
+      while (nbytes >= 16)
+        {
+          do_encrypt (ctx, iv, iv);
+          for (i=0, ivp = iv; i < 16; i++)
+            *outbuf++ = (*ivp++ ^= *inbuf++);
+          nbytes -= 16;
+        }
+/*     } */
+/*   else */
+/*     { */
+/*       u32 *ivp; */
+/*       u32 *ob = (u32*)outbuf; */
+/*       const u32 *ib = (const u32*)inbuf; */
+
+/*       while (nbytes >= 16) */
+/*         { */
+/*           do_encrypt (ctx, iv, iv); */
+/*           ivp = iv; */
+/*           *ob++ = (*ivp++ ^= *ib++); */
+/*           *ob++ = (*ivp++ ^= *ib++); */
+/*           *ob++ = (*ivp++ ^= *ib++); */
+/*           *ob++ = (*ivp   ^= *ib++); */
+/*           nbytes -= 16; */
+/*         } */
+/*     } */
+  burn_stack (16 + 2*sizeof(int));
+}
+#endif
+
+
+
+\f
+/* Decrypt one block.  a and b may be the same. */
+static void
+do_decrypt (RIJNDAEL_context *ctx, byte *b, const byte *a)
+{
+#define rk  (ctx->keySched2)
+    int ROUNDS = ctx->ROUNDS; 
+    int r;
+    byte temp[4][4];
+
+    if ( !ctx->decryption_prepared ) {
+        prepare_decryption ( ctx );
+        burn_stack (64);
+        ctx->decryption_prepared = 1;
+    }
+    
+    *((u32*)temp[0]) = *((u32*)(a   )) ^ *((u32*)rk[ROUNDS][0]);
+    *((u32*)temp[1]) = *((u32*)(a+ 4)) ^ *((u32*)rk[ROUNDS][1]);
+    *((u32*)temp[2]) = *((u32*)(a+ 8)) ^ *((u32*)rk[ROUNDS][2]);
+    *((u32*)temp[3]) = *((u32*)(a+12)) ^ *((u32*)rk[ROUNDS][3]);
+  
+    *((u32*)(b   )) = *((u32*)T5[temp[0][0]])
+        ^ *((u32*)T6[temp[3][1]])
+        ^ *((u32*)T7[temp[2][2]]) 
+        ^ *((u32*)T8[temp[1][3]]);
+    *((u32*)(b+ 4)) = *((u32*)T5[temp[1][0]])
+        ^ *((u32*)T6[temp[0][1]])
+        ^ *((u32*)T7[temp[3][2]]) 
+        ^ *((u32*)T8[temp[2][3]]);
+    *((u32*)(b+ 8)) = *((u32*)T5[temp[2][0]])
+        ^ *((u32*)T6[temp[1][1]])
+        ^ *((u32*)T7[temp[0][2]]) 
+        ^ *((u32*)T8[temp[3][3]]);
+    *((u32*)(b+12)) = *((u32*)T5[temp[3][0]])
+        ^ *((u32*)T6[temp[2][1]])
+        ^ *((u32*)T7[temp[1][2]]) 
+        ^ *((u32*)T8[temp[0][3]]);
+    for (r = ROUNDS-1; r > 1; r--) {
+               *((u32*)temp[0]) = *((u32*)(b   )) ^ *((u32*)rk[r][0]);
+               *((u32*)temp[1]) = *((u32*)(b+ 4)) ^ *((u32*)rk[r][1]);
+               *((u32*)temp[2]) = *((u32*)(b+ 8)) ^ *((u32*)rk[r][2]);
+               *((u32*)temp[3]) = *((u32*)(b+12)) ^ *((u32*)rk[r][3]);
+               *((u32*)(b   )) = *((u32*)T5[temp[0][0]])
+           ^ *((u32*)T6[temp[3][1]])
+           ^ *((u32*)T7[temp[2][2]]) 
+           ^ *((u32*)T8[temp[1][3]]);
+               *((u32*)(b+ 4)) = *((u32*)T5[temp[1][0]])
+           ^ *((u32*)T6[temp[0][1]])
+           ^ *((u32*)T7[temp[3][2]]) 
+           ^ *((u32*)T8[temp[2][3]]);
+               *((u32*)(b+ 8)) = *((u32*)T5[temp[2][0]])
+           ^ *((u32*)T6[temp[1][1]])
+           ^ *((u32*)T7[temp[0][2]]) 
+           ^ *((u32*)T8[temp[3][3]]);
+               *((u32*)(b+12)) = *((u32*)T5[temp[3][0]])
+           ^ *((u32*)T6[temp[2][1]])
+           ^ *((u32*)T7[temp[1][2]]) 
+           ^ *((u32*)T8[temp[0][3]]);
+       }
+       /* last round is special */   
+       *((u32*)temp[0]) = *((u32*)(b   )) ^ *((u32*)rk[1][0]);
+       *((u32*)temp[1]) = *((u32*)(b+ 4)) ^ *((u32*)rk[1][1]);
+       *((u32*)temp[2]) = *((u32*)(b+ 8)) ^ *((u32*)rk[1][2]);
+       *((u32*)temp[3]) = *((u32*)(b+12)) ^ *((u32*)rk[1][3]);
+       b[ 0] = S5[temp[0][0]];
+       b[ 1] = S5[temp[3][1]];
+       b[ 2] = S5[temp[2][2]];
+       b[ 3] = S5[temp[1][3]];
+       b[ 4] = S5[temp[1][0]];
+       b[ 5] = S5[temp[0][1]];
+       b[ 6] = S5[temp[3][2]];
+       b[ 7] = S5[temp[2][3]];
+       b[ 8] = S5[temp[2][0]];
+       b[ 9] = S5[temp[1][1]];
+       b[10] = S5[temp[0][2]];
+       b[11] = S5[temp[3][3]];
+       b[12] = S5[temp[3][0]];
+       b[13] = S5[temp[2][1]];
+       b[14] = S5[temp[1][2]];
+       b[15] = S5[temp[0][3]];
+       *((u32*)(b   )) ^= *((u32*)rk[0][0]);
+       *((u32*)(b+ 4)) ^= *((u32*)rk[0][1]);
+       *((u32*)(b+ 8)) ^= *((u32*)rk[0][2]);
+       *((u32*)(b+12)) ^= *((u32*)rk[0][3]);
+#undef rk
+}
+
+static void
+rijndael_decrypt (void *ctx, byte *b, const byte *a)
+{
+    do_decrypt (ctx, b, a);
+    burn_stack (16+2*sizeof(int));
+}
+\f
+/* Test a single encryption and decryption with each key size. */
+
+static const char*
+selftest (void)
+{
+    RIJNDAEL_context ctx;
+    byte scratch[16];     
+
+    /* The test vectors are from the AES supplied ones; more or less 
+     * randomly taken from ecb_tbl.txt (I=42,81,14)
+     */
+    static const byte plaintext[16] = {
+       0x01,0x4B,0xAF,0x22,0x78,0xA6,0x9D,0x33,
+       0x1D,0x51,0x80,0x10,0x36,0x43,0xE9,0x9A
+    };
+    static const byte key[16] = {
+        0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF,0xF0,
+        0xF2,0xF3,0xF4,0xF5,0xF7,0xF8,0xF9,0xFA
+    };
+    static const byte ciphertext[16] = {
+        0x67,0x43,0xC3,0xD1,0x51,0x9A,0xB4,0xF2,
+        0xCD,0x9A,0x78,0xAB,0x09,0xA5,0x11,0xBD
+    };
+
+    static const byte plaintext_192[16] = {
+        0x76,0x77,0x74,0x75,0xF1,0xF2,0xF3,0xF4,
+        0xF8,0xF9,0xE6,0xE7,0x77,0x70,0x71,0x72
+    };
+    static const byte key_192[24] = {
+        0x04,0x05,0x06,0x07,0x09,0x0A,0x0B,0x0C,
+        0x0E,0x0F,0x10,0x11,0x13,0x14,0x15,0x16,
+        0x18,0x19,0x1A,0x1B,0x1D,0x1E,0x1F,0x20
+    };
+    static const byte ciphertext_192[16] = {
+        0x5D,0x1E,0xF2,0x0D,0xCE,0xD6,0xBC,0xBC,
+        0x12,0x13,0x1A,0xC7,0xC5,0x47,0x88,0xAA
+    };
+    
+    static const byte plaintext_256[16] = {
+        0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F,
+        0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21
+    };
+    static const byte key_256[32] = {
+        0x08,0x09,0x0A,0x0B,0x0D,0x0E,0x0F,0x10,
+        0x12,0x13,0x14,0x15,0x17,0x18,0x19,0x1A,
+        0x1C,0x1D,0x1E,0x1F,0x21,0x22,0x23,0x24,
+        0x26,0x27,0x28,0x29,0x2B,0x2C,0x2D,0x2E
+    };
+    static const byte ciphertext_256[16] = {
+        0x08,0x0E,0x95,0x17,0xEB,0x16,0x77,0x71,
+        0x9A,0xCF,0x72,0x80,0x86,0x04,0x0A,0xE3
+    };
+
+    rijndael_setkey (&ctx, key, sizeof(key));
+    rijndael_encrypt (&ctx, scratch, plaintext);
+    if (memcmp (scratch, ciphertext, sizeof (ciphertext)))
+        return "Rijndael-128 test encryption failed.";
+    rijndael_decrypt (&ctx, scratch, scratch);
+    if (memcmp (scratch, plaintext, sizeof (plaintext)))
+        return "Rijndael-128 test decryption failed.";
+
+    rijndael_setkey (&ctx, key_192, sizeof(key_192));
+    rijndael_encrypt (&ctx, scratch, plaintext_192);
+    if (memcmp (scratch, ciphertext_192, sizeof (ciphertext_192)))
+        return "Rijndael-192 test encryption failed.";
+    rijndael_decrypt (&ctx, scratch, scratch);
+    if (memcmp (scratch, plaintext_192, sizeof (plaintext_192)))
+        return "Rijndael-192 test decryption failed.";
+    
+    rijndael_setkey (&ctx, key_256, sizeof(key_256));
+    rijndael_encrypt (&ctx, scratch, plaintext_256);
+    if (memcmp (scratch, ciphertext_256, sizeof (ciphertext_256)))
+        return "Rijndael-256 test encryption failed.";
+    rijndael_decrypt (&ctx, scratch, scratch);
+    if (memcmp (scratch, plaintext_256, sizeof (plaintext_256)))
+        return "Rijndael-256 test decryption failed.";
+    
+    return NULL;
+}
+
+const char *
+rijndael_get_info(int algo, size_t *keylen,
+                 size_t *blocksize, size_t *contextsize,
+                 int (**r_setkey)(void *c, const byte *key, unsigned keylen),
+                 void (**r_encrypt)(void *c, byte *outbuf, const byte *inbuf),
+                 void (**r_decrypt)(void *c, byte *outbuf, const byte *inbuf)
+                 )
+{
+    *keylen = algo==7? 128 :  algo==8? 192 : 256;
+    *blocksize = 16;
+    *contextsize = sizeof (RIJNDAEL_context);
+
+    *r_setkey = rijndael_setkey;
+    *r_encrypt = rijndael_encrypt;
+    *r_decrypt = rijndael_decrypt;
+
+    if( algo == 7 )
+       return "AES";
+    if (algo == 8)
+        return "AES192";
+    if (algo == 9)
+        return "AES256";
+    return NULL;
+}
diff --git a/cipher/rmd.h b/cipher/rmd.h
new file mode 100644 (file)
index 0000000..1313bb7
--- /dev/null
@@ -0,0 +1,36 @@
+/* rmd.h - RIPE-MD hash functions
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_RMD_H
+#define G10_RMD_H
+
+
+/* we need this here because random.c must have direct access */
+typedef struct {
+    u32  h0,h1,h2,h3,h4;
+    u32  nblocks;
+    byte buf[64];
+    int  count;
+} RMD160_CONTEXT;
+
+void rmd160_init( RMD160_CONTEXT *hd );
+void rmd160_mixblock( RMD160_CONTEXT *hd, char *buffer );
+
+#endif /*G10_RMD_H*/
diff --git a/cipher/rmd160.c b/cipher/rmd160.c
new file mode 100644 (file)
index 0000000..7a7230f
--- /dev/null
@@ -0,0 +1,588 @@
+/* rmd160.c  - RIPE-MD160
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "rmd.h"
+#include "cipher.h" /* for rmd160_hash_buffer */
+#include "algorithms.h"
+
+#include "bithelp.h"
+
+/*********************************
+ * RIPEMD-160 is not patented, see (as of 25.10.97)
+ *   http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
+ * Note that the code uses Little Endian byteorder, which is good for
+ * 386 etc, but we must add some conversion when used on a big endian box.
+ *
+ *
+ * Pseudo-code for RIPEMD-160
+ *
+ * RIPEMD-160 is an iterative hash function that operates on 32-bit words.
+ * The round function takes as input a 5-word chaining variable and a 16-word
+ * message block and maps this to a new chaining variable. All operations are
+ * defined on 32-bit words. Padding is identical to that of MD4.
+ *
+ *
+ * RIPEMD-160: definitions
+ *
+ *
+ *   nonlinear functions at bit level: exor, mux, -, mux, -
+ *
+ *   f(j, x, y, z) = x XOR y XOR z               (0 <= j <= 15)
+ *   f(j, x, y, z) = (x AND y) OR (NOT(x) AND z)  (16 <= j <= 31)
+ *   f(j, x, y, z) = (x OR NOT(y)) XOR z         (32 <= j <= 47)
+ *   f(j, x, y, z) = (x AND z) OR (y AND NOT(z))  (48 <= j <= 63)
+ *   f(j, x, y, z) = x XOR (y OR NOT(z))         (64 <= j <= 79)
+ *
+ *
+ *   added constants (hexadecimal)
+ *
+ *   K(j) = 0x00000000     (0 <= j <= 15)
+ *   K(j) = 0x5A827999    (16 <= j <= 31)      int(2**30 x sqrt(2))
+ *   K(j) = 0x6ED9EBA1    (32 <= j <= 47)      int(2**30 x sqrt(3))
+ *   K(j) = 0x8F1BBCDC    (48 <= j <= 63)      int(2**30 x sqrt(5))
+ *   K(j) = 0xA953FD4E    (64 <= j <= 79)      int(2**30 x sqrt(7))
+ *   K'(j) = 0x50A28BE6     (0 <= j <= 15)      int(2**30 x cbrt(2))
+ *   K'(j) = 0x5C4DD124    (16 <= j <= 31)      int(2**30 x cbrt(3))
+ *   K'(j) = 0x6D703EF3    (32 <= j <= 47)      int(2**30 x cbrt(5))
+ *   K'(j) = 0x7A6D76E9    (48 <= j <= 63)      int(2**30 x cbrt(7))
+ *   K'(j) = 0x00000000    (64 <= j <= 79)
+ *
+ *
+ *   selection of message word
+ *
+ *   r(j)      = j                   (0 <= j <= 15)
+ *   r(16..31) = 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8
+ *   r(32..47) = 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12
+ *   r(48..63) = 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2
+ *   r(64..79) = 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
+ *   r0(0..15) = 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12
+ *   r0(16..31)= 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2
+ *   r0(32..47)= 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13
+ *   r0(48..63)= 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14
+ *   r0(64..79)= 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
+ *
+ *
+ *   amount for rotate left (rol)
+ *
+ *   s(0..15)  = 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8
+ *   s(16..31) = 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12
+ *   s(32..47) = 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5
+ *   s(48..63) = 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12
+ *   s(64..79) = 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
+ *   s'(0..15) = 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6
+ *   s'(16..31)= 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11
+ *   s'(32..47)= 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5
+ *   s'(48..63)= 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8
+ *   s'(64..79)= 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
+ *
+ *
+ *   initial value (hexadecimal)
+ *
+ *   h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476;
+ *                                                     h4 = 0xC3D2E1F0;
+ *
+ *
+ * RIPEMD-160: pseudo-code
+ *
+ *   It is assumed that the message after padding consists of t 16-word blocks
+ *   that will be denoted with X[i][j], with 0 <= i <= t-1 and 0 <= j <= 15.
+ *   The symbol [+] denotes addition modulo 2**32 and rol_s denotes cyclic left
+ *   shift (rotate) over s positions.
+ *
+ *
+ *   for i := 0 to t-1 {
+ *      A := h0; B := h1; C := h2; D = h3; E = h4;
+ *      A' := h0; B' := h1; C' := h2; D' = h3; E' = h4;
+ *      for j := 0 to 79 {
+ *          T := rol_s(j)(A [+] f(j, B, C, D) [+] X[i][r(j)] [+] K(j)) [+] E;
+ *          A := E; E := D; D := rol_10(C); C := B; B := T;
+ *          T := rol_s'(j)(A' [+] f(79-j, B', C', D') [+] X[i][r'(j)]
+                                                      [+] K'(j)) [+] E';
+ *          A' := E'; E' := D'; D' := rol_10(C'); C' := B'; B' := T;
+ *      }
+ *      T := h1 [+] C [+] D'; h1 := h2 [+] D [+] E'; h2 := h3 [+] E [+] A';
+ *      h3 := h4 [+] A [+] B'; h4 := h0 [+] B [+] C'; h0 := T;
+ *   }
+ */
+
+/* Some examples:
+ * ""                    9c1185a5c5e9fc54612808977ee8f548b2258d31
+ * "a"                   0bdc9d2d256b3ee9daae347be6f4dc835a467ffe
+ * "abc"                 8eb208f7e05d987a9b044a8e98c6b087f15a0bfc
+ * "message digest"      5d0689ef49d2fae572b881b123a85ffa21595f36
+ * "a...z"               f71c27109c692c1b56bbdceb5b9d2865b3708dbc
+ * "abcdbcde...nopq"     12a053384a9c0c88e405a06c27dcf49ada62eb2b
+ * "A...Za...z0...9"     b0e20b6e3116640286ed3a87a5713079b21f5189
+ * 8 times "1234567890"  9b752e45573d4b39f4dbd3323cab82bf63326bfb
+ * 1 million times "a"   52783243c1697bdbe16d37f97f68f08325dc1528
+ */
+
+static void
+burn_stack (int bytes)
+{
+    char buf[150];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+
+void
+rmd160_init( RMD160_CONTEXT *hd )
+{
+    hd->h0 = 0x67452301;
+    hd->h1 = 0xEFCDAB89;
+    hd->h2 = 0x98BADCFE;
+    hd->h3 = 0x10325476;
+    hd->h4 = 0xC3D2E1F0;
+    hd->nblocks = 0;
+    hd->count = 0;
+}
+
+
+
+/****************
+ * Transform the message X which consists of 16 32-bit-words
+ */
+static void
+transform( RMD160_CONTEXT *hd, byte *data )
+{
+    u32 a,b,c,d,e,aa,bb,cc,dd,ee,t;
+#ifdef BIG_ENDIAN_HOST
+    u32 x[16];
+    { int i;
+      byte *p2, *p1;
+      for(i=0, p1=data, p2=(byte*)x; i < 16; i++, p2 += 4 ) {
+       p2[3] = *p1++;
+       p2[2] = *p1++;
+       p2[1] = *p1++;
+       p2[0] = *p1++;
+      }
+    }
+#else
+#if 0
+    u32 *x =(u32*)data;
+#else
+    /* this version is better because it is always aligned;
+     * The performance penalty on a 586-100 is about 6% which
+     * is acceptable - because the data is more local it might
+     * also be possible that this is faster on some machines.
+     * This function (when compiled with -02 on gcc 2.7.2)
+     * executes on a 586-100 (39.73 bogomips) at about 1900kb/sec;
+     * [measured with a 4MB data and "gpgm --print-md rmd160"] */
+    u32 x[16];
+    memcpy( x, data, 64 );
+#endif
+#endif
+
+
+#define K0  0x00000000
+#define K1  0x5A827999
+#define K2  0x6ED9EBA1
+#define K3  0x8F1BBCDC
+#define K4  0xA953FD4E
+#define KK0 0x50A28BE6
+#define KK1 0x5C4DD124
+#define KK2 0x6D703EF3
+#define KK3 0x7A6D76E9
+#define KK4 0x00000000
+#define F0(x,y,z)   ( (x) ^ (y) ^ (z) )
+#define F1(x,y,z)   ( ((x) & (y)) | (~(x) & (z)) )
+#define F2(x,y,z)   ( ((x) | ~(y)) ^ (z) )
+#define F3(x,y,z)   ( ((x) & (z)) | ((y) & ~(z)) )
+#define F4(x,y,z)   ( (x) ^ ((y) | ~(z)) )
+#define R(a,b,c,d,e,f,k,r,s) do { t = a + f(b,c,d) + k + x[r]; \
+                                 a = rol(t,s) + e;            \
+                                 c = rol(c,10);               \
+                               } while(0)
+
+    /* left lane */
+    a = hd->h0;
+    b = hd->h1;
+    c = hd->h2;
+    d = hd->h3;
+    e = hd->h4;
+    R( a, b, c, d, e, F0, K0,  0, 11 );
+    R( e, a, b, c, d, F0, K0,  1, 14 );
+    R( d, e, a, b, c, F0, K0,  2, 15 );
+    R( c, d, e, a, b, F0, K0,  3, 12 );
+    R( b, c, d, e, a, F0, K0,  4,  5 );
+    R( a, b, c, d, e, F0, K0,  5,  8 );
+    R( e, a, b, c, d, F0, K0,  6,  7 );
+    R( d, e, a, b, c, F0, K0,  7,  9 );
+    R( c, d, e, a, b, F0, K0,  8, 11 );
+    R( b, c, d, e, a, F0, K0,  9, 13 );
+    R( a, b, c, d, e, F0, K0, 10, 14 );
+    R( e, a, b, c, d, F0, K0, 11, 15 );
+    R( d, e, a, b, c, F0, K0, 12,  6 );
+    R( c, d, e, a, b, F0, K0, 13,  7 );
+    R( b, c, d, e, a, F0, K0, 14,  9 );
+    R( a, b, c, d, e, F0, K0, 15,  8 );
+    R( e, a, b, c, d, F1, K1,  7,  7 );
+    R( d, e, a, b, c, F1, K1,  4,  6 );
+    R( c, d, e, a, b, F1, K1, 13,  8 );
+    R( b, c, d, e, a, F1, K1,  1, 13 );
+    R( a, b, c, d, e, F1, K1, 10, 11 );
+    R( e, a, b, c, d, F1, K1,  6,  9 );
+    R( d, e, a, b, c, F1, K1, 15,  7 );
+    R( c, d, e, a, b, F1, K1,  3, 15 );
+    R( b, c, d, e, a, F1, K1, 12,  7 );
+    R( a, b, c, d, e, F1, K1,  0, 12 );
+    R( e, a, b, c, d, F1, K1,  9, 15 );
+    R( d, e, a, b, c, F1, K1,  5,  9 );
+    R( c, d, e, a, b, F1, K1,  2, 11 );
+    R( b, c, d, e, a, F1, K1, 14,  7 );
+    R( a, b, c, d, e, F1, K1, 11, 13 );
+    R( e, a, b, c, d, F1, K1,  8, 12 );
+    R( d, e, a, b, c, F2, K2,  3, 11 );
+    R( c, d, e, a, b, F2, K2, 10, 13 );
+    R( b, c, d, e, a, F2, K2, 14,  6 );
+    R( a, b, c, d, e, F2, K2,  4,  7 );
+    R( e, a, b, c, d, F2, K2,  9, 14 );
+    R( d, e, a, b, c, F2, K2, 15,  9 );
+    R( c, d, e, a, b, F2, K2,  8, 13 );
+    R( b, c, d, e, a, F2, K2,  1, 15 );
+    R( a, b, c, d, e, F2, K2,  2, 14 );
+    R( e, a, b, c, d, F2, K2,  7,  8 );
+    R( d, e, a, b, c, F2, K2,  0, 13 );
+    R( c, d, e, a, b, F2, K2,  6,  6 );
+    R( b, c, d, e, a, F2, K2, 13,  5 );
+    R( a, b, c, d, e, F2, K2, 11, 12 );
+    R( e, a, b, c, d, F2, K2,  5,  7 );
+    R( d, e, a, b, c, F2, K2, 12,  5 );
+    R( c, d, e, a, b, F3, K3,  1, 11 );
+    R( b, c, d, e, a, F3, K3,  9, 12 );
+    R( a, b, c, d, e, F3, K3, 11, 14 );
+    R( e, a, b, c, d, F3, K3, 10, 15 );
+    R( d, e, a, b, c, F3, K3,  0, 14 );
+    R( c, d, e, a, b, F3, K3,  8, 15 );
+    R( b, c, d, e, a, F3, K3, 12,  9 );
+    R( a, b, c, d, e, F3, K3,  4,  8 );
+    R( e, a, b, c, d, F3, K3, 13,  9 );
+    R( d, e, a, b, c, F3, K3,  3, 14 );
+    R( c, d, e, a, b, F3, K3,  7,  5 );
+    R( b, c, d, e, a, F3, K3, 15,  6 );
+    R( a, b, c, d, e, F3, K3, 14,  8 );
+    R( e, a, b, c, d, F3, K3,  5,  6 );
+    R( d, e, a, b, c, F3, K3,  6,  5 );
+    R( c, d, e, a, b, F3, K3,  2, 12 );
+    R( b, c, d, e, a, F4, K4,  4,  9 );
+    R( a, b, c, d, e, F4, K4,  0, 15 );
+    R( e, a, b, c, d, F4, K4,  5,  5 );
+    R( d, e, a, b, c, F4, K4,  9, 11 );
+    R( c, d, e, a, b, F4, K4,  7,  6 );
+    R( b, c, d, e, a, F4, K4, 12,  8 );
+    R( a, b, c, d, e, F4, K4,  2, 13 );
+    R( e, a, b, c, d, F4, K4, 10, 12 );
+    R( d, e, a, b, c, F4, K4, 14,  5 );
+    R( c, d, e, a, b, F4, K4,  1, 12 );
+    R( b, c, d, e, a, F4, K4,  3, 13 );
+    R( a, b, c, d, e, F4, K4,  8, 14 );
+    R( e, a, b, c, d, F4, K4, 11, 11 );
+    R( d, e, a, b, c, F4, K4,  6,  8 );
+    R( c, d, e, a, b, F4, K4, 15,  5 );
+    R( b, c, d, e, a, F4, K4, 13,  6 );
+
+    aa = a; bb = b; cc = c; dd = d; ee = e;
+
+    /* right lane */
+    a = hd->h0;
+    b = hd->h1;
+    c = hd->h2;
+    d = hd->h3;
+    e = hd->h4;
+    R( a, b, c, d, e, F4, KK0, 5,  8);
+    R( e, a, b, c, d, F4, KK0, 14,  9);
+    R( d, e, a, b, c, F4, KK0, 7,  9);
+    R( c, d, e, a, b, F4, KK0, 0, 11);
+    R( b, c, d, e, a, F4, KK0, 9, 13);
+    R( a, b, c, d, e, F4, KK0, 2, 15);
+    R( e, a, b, c, d, F4, KK0, 11, 15);
+    R( d, e, a, b, c, F4, KK0, 4,  5);
+    R( c, d, e, a, b, F4, KK0, 13,  7);
+    R( b, c, d, e, a, F4, KK0, 6,  7);
+    R( a, b, c, d, e, F4, KK0, 15,  8);
+    R( e, a, b, c, d, F4, KK0, 8, 11);
+    R( d, e, a, b, c, F4, KK0, 1, 14);
+    R( c, d, e, a, b, F4, KK0, 10, 14);
+    R( b, c, d, e, a, F4, KK0, 3, 12);
+    R( a, b, c, d, e, F4, KK0, 12,  6);
+    R( e, a, b, c, d, F3, KK1, 6,  9);
+    R( d, e, a, b, c, F3, KK1, 11, 13);
+    R( c, d, e, a, b, F3, KK1, 3, 15);
+    R( b, c, d, e, a, F3, KK1, 7,  7);
+    R( a, b, c, d, e, F3, KK1, 0, 12);
+    R( e, a, b, c, d, F3, KK1, 13,  8);
+    R( d, e, a, b, c, F3, KK1, 5,  9);
+    R( c, d, e, a, b, F3, KK1, 10, 11);
+    R( b, c, d, e, a, F3, KK1, 14,  7);
+    R( a, b, c, d, e, F3, KK1, 15,  7);
+    R( e, a, b, c, d, F3, KK1, 8, 12);
+    R( d, e, a, b, c, F3, KK1, 12,  7);
+    R( c, d, e, a, b, F3, KK1, 4,  6);
+    R( b, c, d, e, a, F3, KK1, 9, 15);
+    R( a, b, c, d, e, F3, KK1, 1, 13);
+    R( e, a, b, c, d, F3, KK1, 2, 11);
+    R( d, e, a, b, c, F2, KK2, 15,  9);
+    R( c, d, e, a, b, F2, KK2, 5,  7);
+    R( b, c, d, e, a, F2, KK2, 1, 15);
+    R( a, b, c, d, e, F2, KK2, 3, 11);
+    R( e, a, b, c, d, F2, KK2, 7,  8);
+    R( d, e, a, b, c, F2, KK2, 14,  6);
+    R( c, d, e, a, b, F2, KK2, 6,  6);
+    R( b, c, d, e, a, F2, KK2, 9, 14);
+    R( a, b, c, d, e, F2, KK2, 11, 12);
+    R( e, a, b, c, d, F2, KK2, 8, 13);
+    R( d, e, a, b, c, F2, KK2, 12,  5);
+    R( c, d, e, a, b, F2, KK2, 2, 14);
+    R( b, c, d, e, a, F2, KK2, 10, 13);
+    R( a, b, c, d, e, F2, KK2, 0, 13);
+    R( e, a, b, c, d, F2, KK2, 4,  7);
+    R( d, e, a, b, c, F2, KK2, 13,  5);
+    R( c, d, e, a, b, F1, KK3, 8, 15);
+    R( b, c, d, e, a, F1, KK3, 6,  5);
+    R( a, b, c, d, e, F1, KK3, 4,  8);
+    R( e, a, b, c, d, F1, KK3, 1, 11);
+    R( d, e, a, b, c, F1, KK3, 3, 14);
+    R( c, d, e, a, b, F1, KK3, 11, 14);
+    R( b, c, d, e, a, F1, KK3, 15,  6);
+    R( a, b, c, d, e, F1, KK3, 0, 14);
+    R( e, a, b, c, d, F1, KK3, 5,  6);
+    R( d, e, a, b, c, F1, KK3, 12,  9);
+    R( c, d, e, a, b, F1, KK3, 2, 12);
+    R( b, c, d, e, a, F1, KK3, 13,  9);
+    R( a, b, c, d, e, F1, KK3, 9, 12);
+    R( e, a, b, c, d, F1, KK3, 7,  5);
+    R( d, e, a, b, c, F1, KK3, 10, 15);
+    R( c, d, e, a, b, F1, KK3, 14,  8);
+    R( b, c, d, e, a, F0, KK4, 12,  8);
+    R( a, b, c, d, e, F0, KK4, 15,  5);
+    R( e, a, b, c, d, F0, KK4, 10, 12);
+    R( d, e, a, b, c, F0, KK4, 4,  9);
+    R( c, d, e, a, b, F0, KK4, 1, 12);
+    R( b, c, d, e, a, F0, KK4, 5,  5);
+    R( a, b, c, d, e, F0, KK4, 8, 14);
+    R( e, a, b, c, d, F0, KK4, 7,  6);
+    R( d, e, a, b, c, F0, KK4, 6,  8);
+    R( c, d, e, a, b, F0, KK4, 2, 13);
+    R( b, c, d, e, a, F0, KK4, 13,  6);
+    R( a, b, c, d, e, F0, KK4, 14,  5);
+    R( e, a, b, c, d, F0, KK4, 0, 15);
+    R( d, e, a, b, c, F0, KK4, 3, 13);
+    R( c, d, e, a, b, F0, KK4, 9, 11);
+    R( b, c, d, e, a, F0, KK4, 11, 11);
+
+
+    t     = hd->h1 + d + cc;
+    hd->h1 = hd->h2 + e + dd;
+    hd->h2 = hd->h3 + a + ee;
+    hd->h3 = hd->h4 + b + aa;
+    hd->h4 = hd->h0 + c + bb;
+    hd->h0 = t;
+}
+
+
+/* Update the message digest with the contents
+ * of INBUF with length INLEN.
+ */
+static void
+rmd160_write( RMD160_CONTEXT *hd, byte *inbuf, size_t inlen)
+{
+    if( hd->count == 64 ) { /* flush the buffer */
+       transform( hd, hd->buf );
+        burn_stack (108+5*sizeof(void*));
+       hd->count = 0;
+       hd->nblocks++;
+    }
+    if( !inbuf )
+       return;
+    if( hd->count ) {
+       for( ; inlen && hd->count < 64; inlen-- )
+           hd->buf[hd->count++] = *inbuf++;
+       rmd160_write( hd, NULL, 0 );
+       if( !inlen )
+           return;
+    }
+
+    while( inlen >= 64 ) {
+       transform( hd, inbuf );
+       hd->count = 0;
+       hd->nblocks++;
+       inlen -= 64;
+       inbuf += 64;
+    }
+    burn_stack (108+5*sizeof(void*));
+    for( ; inlen && hd->count < 64; inlen-- )
+       hd->buf[hd->count++] = *inbuf++;
+}
+
+/****************
+ * Apply the rmd160 transform function on the buffer which must have
+ * a length 64 bytes. Do not use this function together with the
+ * other functions, use rmd160_init to initialize internal variables.
+ * Returns: 16 bytes in buffer with the mixed contentes of buffer.
+ */
+void
+rmd160_mixblock( RMD160_CONTEXT *hd, char *buffer )
+{
+    char *p = buffer;
+    transform( hd, buffer );
+#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
+    X(0);
+    X(1);
+    X(2);
+    X(3);
+    X(4);
+#undef X
+}
+
+
+/* The routine terminates the computation
+ */
+
+static void
+rmd160_final( RMD160_CONTEXT *hd )
+{
+    u32 t, msb, lsb;
+    byte *p;
+
+    rmd160_write(hd, NULL, 0); /* flush */;
+
+    t = hd->nblocks;
+    /* multiply by 64 to make a byte count */
+    lsb = t << 6;
+    msb = t >> 26;
+    /* add the count */
+    t = lsb;
+    if( (lsb += hd->count) < t )
+       msb++;
+    /* multiply by 8 to make a bit count */
+    t = lsb;
+    lsb <<= 3;
+    msb <<= 3;
+    msb |= t >> 29;
+
+    if( hd->count < 56 ) { /* enough room */
+       hd->buf[hd->count++] = 0x80; /* pad */
+       while( hd->count < 56 )
+           hd->buf[hd->count++] = 0;  /* pad */
+    }
+    else { /* need one extra block */
+       hd->buf[hd->count++] = 0x80; /* pad character */
+       while( hd->count < 64 )
+           hd->buf[hd->count++] = 0;
+       rmd160_write(hd, NULL, 0);  /* flush */;
+       memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
+    }
+    /* append the 64 bit count */
+    hd->buf[56] = lsb     ;
+    hd->buf[57] = lsb >>  8;
+    hd->buf[58] = lsb >> 16;
+    hd->buf[59] = lsb >> 24;
+    hd->buf[60] = msb     ;
+    hd->buf[61] = msb >>  8;
+    hd->buf[62] = msb >> 16;
+    hd->buf[63] = msb >> 24;
+    transform( hd, hd->buf );
+    burn_stack (108+5*sizeof(void*));
+
+    p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *p++ = hd->h##a         ; *p++ = hd->h##a >> 8;      \
+                     *p++ = hd->h##a >> 16; *p++ = hd->h##a >> 24; } while(0)
+#else /* little endian */
+#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
+#endif
+    X(0);
+    X(1);
+    X(2);
+    X(3);
+    X(4);
+#undef X
+}
+
+static byte *
+rmd160_read( RMD160_CONTEXT *hd )
+{
+    return hd->buf;
+}
+
+
+
+/****************
+ * Shortcut functions which puts the hash value of the supplied buffer
+ * into outbuf which must have a size of 20 bytes.
+ */
+void
+rmd160_hash_buffer( char *outbuf, const char *buffer, size_t length )
+{
+    RMD160_CONTEXT hd;
+
+    rmd160_init( &hd );
+    rmd160_write( &hd, (byte*)buffer, length );
+    rmd160_final( &hd );
+    memcpy( outbuf, hd.buf, 20 );
+}
+
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+rmd160_get_info( int algo, size_t *contextsize,
+              byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+              void (**r_init)( void *c ),
+              void (**r_write)( void *c, byte *buf, size_t nbytes ),
+              void (**r_final)( void *c ),
+              byte *(**r_read)( void *c )
+            )
+{
+    static byte asn[15] = /* Object ID is 1.3.36.3.2.1 */
+         { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x24, 0x03,
+           0x02, 0x01, 0x05, 0x00, 0x04, 0x14 };
+
+    if( algo != 3 )
+       return NULL;
+
+    *contextsize = sizeof(RMD160_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 20;
+    *(void  (**)(RMD160_CONTEXT *))r_init                = rmd160_init;
+    *(void  (**)(RMD160_CONTEXT *, byte*, size_t))r_write = rmd160_write;
+    *(void  (**)(RMD160_CONTEXT *))r_final               = rmd160_final;
+    *(byte *(**)(RMD160_CONTEXT *))r_read                = rmd160_read;
+
+    return "RIPEMD160";
+}
diff --git a/cipher/rndegd.c b/cipher/rndegd.c
new file mode 100644 (file)
index 0000000..e6646a2
--- /dev/null
@@ -0,0 +1,225 @@
+/* rndegd.c  - interface to the EGD
+ *     Copyright (C) 1999, 2000, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include "types.h"
+#include "util.h"
+#include "ttyio.h"
+#include "algorithms.h"
+#include "cipher.h"
+#include "i18n.h"
+
+
+#ifndef offsetof
+#define offsetof(type, member) ((size_t) &((type *)0)->member)
+#endif
+
+static int egd_socket = -1;
+
+static int
+do_write( int fd, void *buf, size_t nbytes )
+{
+    size_t nleft = nbytes;
+    int nwritten;
+
+    while( nleft > 0 ) {
+       nwritten = write( fd, buf, nleft);
+       if( nwritten < 0 ) {
+           if( errno == EINTR )
+               continue;
+           return -1;
+       }
+       nleft -= nwritten;
+       buf = (char*)buf + nwritten;
+    }
+    return 0;
+}
+
+static int
+do_read( int fd, void *buf, size_t nbytes )
+{
+  int n, nread = 0;
+  
+  while (nbytes)
+    {
+      do {
+        n = read(fd, (char*)buf + nread, nbytes );
+      } while( n == -1 && errno == EINTR );
+      if( n == -1 )
+        return nread? nread:-1;
+      else if( n == 0 ) {
+        /* EGD probably died. */
+        errno = ECONNRESET;
+        return -1;
+      }
+      nread += n;
+      nbytes -= n;
+    } 
+  return nread;
+}
+
+/* Connect to the EGD and return the file descriptor.  Return -1 on
+   error.  With NOFAIL set to true, silently fail and return the
+   error, otherwise print an error message and die. */
+int
+rndegd_connect_socket (int nofail)
+{
+  int fd;
+  const char *bname = NULL;
+  char *name;
+  struct sockaddr_un addr;
+  int addr_len;
+
+  if (egd_socket != -1)
+    {
+      close (egd_socket);
+      egd_socket = -1;
+    }
+
+#ifdef EGD_SOCKET_NAME
+  bname = EGD_SOCKET_NAME;
+#endif
+  if ( !bname || !*bname )
+    bname = "=entropy";
+  
+  if ( *bname == '=' && bname[1] )
+    name = make_filename( g10_opt_homedir, bname+1 , NULL );
+  else
+    name = make_filename( bname , NULL );
+  
+  if ( strlen(name)+1 >= sizeof addr.sun_path ) 
+    g10_log_fatal ("EGD socketname is too long\n");
+  
+  memset( &addr, 0, sizeof addr );
+  addr.sun_family = AF_UNIX;
+  strcpy( addr.sun_path, name );         
+  addr_len = (offsetof( struct sockaddr_un, sun_path )
+              + strlen( addr.sun_path ));
+  
+  fd = socket(AF_UNIX, SOCK_STREAM, 0);
+  if (fd == -1 && !nofail)
+    g10_log_fatal("can't create unix domain socket: %s\n",
+                  strerror(errno) );
+  else if (connect (fd, (struct sockaddr*)&addr, addr_len) == -1)
+    {
+      if (!nofail)
+        g10_log_fatal("can't connect to `%s': %s\n",
+                      name, strerror(errno) );
+      close (fd);
+      fd = -1;
+    }
+  xfree(name);
+  if (fd != -1)
+    egd_socket = fd;
+  return fd;
+}
+
+
+/****************
+ * Note: we always use the highest level.
+ * TO boost the performance we may want to add some
+ * additional code for level 1
+ *
+ * Using a level of 0 should never block and better add nothing
+ * to the pool.  So this is just a dummy for EGD.
+ */
+int
+rndegd_gather_random( void (*add)(const void*, size_t, int), int requester,
+                                         size_t length, int level )
+{
+    int fd = egd_socket;
+    int n;
+    byte buffer[256+2];
+    int nbytes;
+    int do_restart = 0;
+
+    if( !length )
+       return 0;
+    if( !level )
+       return 0;
+
+  restart:
+    if (fd == -1 || do_restart)
+      fd = rndegd_connect_socket (0);
+
+    do_restart = 0;
+
+    nbytes = length < 255? length : 255;
+    /* first time we do it with a non blocking request */
+    buffer[0] = 1; /* non blocking */
+    buffer[1] = nbytes;
+    if( do_write( fd, buffer, 2 ) == -1 )
+       g10_log_fatal("can't write to the EGD: %s\n", strerror(errno) );
+    n = do_read( fd, buffer, 1 );
+    if( n == -1 ) {
+       g10_log_error("read error on EGD: %s\n", strerror(errno));
+       do_restart = 1;
+       goto restart;
+    }
+    n = buffer[0];
+    if( n ) {
+       n = do_read( fd, buffer, n );
+       if( n == -1 ) {
+           g10_log_error("read error on EGD: %s\n", strerror(errno));
+           do_restart = 1;
+           goto restart;
+       }
+       (*add)( buffer, n, requester );
+       length -= n;
+    }
+
+    if( length ) {
+       tty_printf(
+        _("Please wait, entropy is being gathered. Do some work if it would\n"
+          "keep you from getting bored, because it will improve the quality\n"
+          "of the entropy.\n") );
+    }
+    while( length ) {
+       nbytes = length < 255? length : 255;
+
+       buffer[0] = 2; /* blocking */
+       buffer[1] = nbytes;
+       if( do_write( fd, buffer, 2 ) == -1 )
+           g10_log_fatal("can't write to the EGD: %s\n", strerror(errno) );
+       n = do_read( fd, buffer, nbytes );
+       if( n == -1 ) {
+           g10_log_error("read error on EGD: %s\n", strerror(errno));
+           do_restart = 1;
+           goto restart;
+       }
+       (*add)( buffer, n, requester );
+       length -= n;
+    }
+    wipememory(buffer, sizeof(buffer) );
+
+    return 0; /* success */
+}
diff --git a/cipher/rndlinux.c b/cipher/rndlinux.c
new file mode 100644 (file)
index 0000000..c6f646c
--- /dev/null
@@ -0,0 +1,160 @@
+/* rndlinux.c  -  raw random number for OSes with /dev/random
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_GETTIMEOFDAY
+#include <sys/times.h>
+#endif
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#if 0
+#include <sys/ioctl.h>
+#include <asm/types.h>
+#include <linux/random.h>
+#endif
+#include "types.h"
+#include "util.h"
+#include "ttyio.h"
+#include "algorithms.h"
+
+#include "i18n.h"
+
+static int open_device( const char *name, int minor );
+
+
+#if 0
+#ifdef HAVE_DEV_RANDOM_IOCTL
+static ulong
+get_entropy_count( int fd )
+{
+    ulong count;
+
+    if( ioctl( fd, RNDGETENTCNT, &count ) == -1 )
+       g10_log_fatal("ioctl(RNDGETENTCNT) failed: %s\n", strerror(errno) );
+    return count;
+}
+#endif
+#endif
+
+/****************
+ * Used to open the /dev/random devices (Linux, xBSD, Solaris (if it exists), ...)
+ */
+static int
+open_device( const char *name, int minor )
+{
+    int fd;
+    struct stat sb;
+
+    fd = open( name, O_RDONLY );
+    if( fd == -1 )
+       g10_log_fatal("can't open %s: %s\n", name, strerror(errno) );
+    if( fstat( fd, &sb ) )
+       g10_log_fatal("stat() off %s failed: %s\n", name, strerror(errno) );
+    /* Don't check device type for better portability */
+    /*  if( (!S_ISCHR(sb.st_mode)) && (!S_ISFIFO(sb.st_mode)) )
+         g10_log_fatal("invalid random device!\n" ); */
+    return fd;
+}
+
+
+/****************
+ * Note:  Using a level of 0 should never block and better add nothing
+ * to the pool.  This is easy to accomplish with /dev/urandom.
+ */
+int
+rndlinux_gather_random( void (*add)(const void*, size_t, int), int requester,
+                                         size_t length, int level )
+{
+    static int fd_urandom = -1;
+    static int fd_random = -1;
+    int fd;
+    int n;
+    int warn=0;
+    byte buffer[768];
+
+    if( level >= 2 ) {
+       if( fd_random == -1 )
+           fd_random = open_device( NAME_OF_DEV_RANDOM, 8 );
+       fd = fd_random;
+    }
+    else {
+       /* this will also be used for elve 0 but by using /dev/urandom
+        * we can be sure that oit will never block. */
+       if( fd_urandom == -1 )
+           fd_urandom = open_device( NAME_OF_DEV_URANDOM, 9 );
+       fd = fd_urandom;
+    }
+
+#if 0
+#ifdef HAVE_DEV_RANDOM_IOCTL
+    g10_log_info("entropy count of %d is %lu\n", fd, get_entropy_count(fd) );
+#endif
+#endif
+    while( length ) {
+       fd_set rfds;
+       struct timeval tv;
+       int rc;
+
+       FD_ZERO(&rfds);
+       FD_SET(fd, &rfds);
+       tv.tv_sec = 3;
+       tv.tv_usec = 0;
+       if( !(rc=select(fd+1, &rfds, NULL, NULL, &tv)) ) {
+           if( !warn )
+               tty_printf(
+_("\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"), (int)length );
+           warn = 1;
+           continue;
+       }
+       else if( rc == -1 ) {
+           tty_printf(
+                      "select() error: %s\n", strerror(errno));
+           continue;
+       }
+
+       do {
+           int nbytes = length < sizeof(buffer)? length : sizeof(buffer);
+           n = read(fd, buffer, nbytes );
+           if( n >= 0 && n > nbytes ) {
+               g10_log_error("bogus read from random device (n=%d)\n", n );
+               n = nbytes;
+           }
+       } while( n == -1 && errno == EINTR );
+       if( n == -1 )
+           g10_log_fatal("read error on random device: %s\n", strerror(errno));
+       (*add)( buffer, n, requester );
+       length -= n;
+    }
+    wipememory(buffer, sizeof(buffer) );
+
+    return 0; /* success */
+}
diff --git a/cipher/rndunix.c b/cipher/rndunix.c
new file mode 100644 (file)
index 0000000..3cc71cf
--- /dev/null
@@ -0,0 +1,869 @@
+/****************************************************************************
+ *                                                                         *
+ *                                                                         *
+ *   Unix Randomness-Gathering Code                                        *
+ *                                                                         *
+ *   Copyright Peter Gutmann, Paul Kendall, and Chris Wedgwood 1996-1999.   *
+ *   Heavily modified for GnuPG by Werner Koch                             *
+ *                                                                         *
+ *                                                                         *
+ ****************************************************************************/
+
+/* This module is part of the cryptlib continuously seeded pseudorandom
+   number generator.  For usage conditions, see lib_rand.c
+
+   [Here is the notice from lib_rand.c:]
+
+   This module and the misc/rnd*.c modules represent the cryptlib
+   continuously seeded pseudorandom number generator (CSPRNG) as described in
+   my 1998 Usenix Security Symposium paper "The generation of random numbers
+   for cryptographic purposes".
+
+   The CSPRNG code is copyright Peter Gutmann (and various others) 1996,
+   1997, 1998, 1999, all rights reserved.  Redistribution of the CSPRNG
+   modules and use in source and binary forms, with or without modification,
+   are permitted provided that the following conditions are met:
+
+   1. Redistributions of source code must retain the above copyright notice
+      and this permission notice in its entirety.
+
+   2. Redistributions in binary form must reproduce the copyright notice in
+      the documentation and/or other materials provided with the distribution.
+
+   3. A copy of any bugfixes or enhancements made must be provided to the
+      author, <pgut001@cs.auckland.ac.nz> to allow them to be added to the
+      baseline version of the code.
+
+  ALTERNATIVELY, the code may be distributed under the terms of the GNU
+  General Public License, version 2 or any later version published by the
+  Free Software Foundation, in which case the provisions of the GNU GPL are
+  required INSTEAD OF the above restrictions.
+
+  Although not required under the terms of the GPL, it would still be nice if
+  you could make any changes available to the author to allow a consistent
+  code base to be maintained */
+
+
+
+/* General includes */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/* OS-specific includes */
+
+#ifdef __osf__
+  /* Somewhere in the morass of system-specific cruft which OSF/1 pulls in
+   * via the following includes are various endianness defines, so we
+   * undefine the cryptlib ones, which aren't really needed for this module
+   * anyway */
+#undef BIG_ENDIAN
+#undef LITTLE_ENDIAN
+#endif                         /* __osf__ */
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <pwd.h>
+#ifndef __QNX__
+#include <sys/errno.h>
+#include <sys/ipc.h>
+#endif                         /* __QNX__ */
+#include <sys/time.h>          /* SCO and SunOS need this before resource.h */
+#ifndef __QNX__
+#include <sys/resource.h>
+#endif                         /* __QNX__ */
+#if defined( _AIX ) || defined( __QNX__ )
+#include <sys/select.h>
+#endif                         /* _AIX || __QNX__ */
+#ifndef __QNX__
+#include <sys/shm.h>
+#include <signal.h>
+#include <sys/signal.h>
+#endif                         /* __QNX__ */
+#include <sys/stat.h>
+#include <sys/types.h>         /* Verschiedene komische Typen */
+#if defined( __hpux ) && ( OS_VERSION == 9 )
+#include <vfork.h>
+#endif                         /* __hpux 9.x, after that it's in unistd.h */
+#include <sys/wait.h>
+/* #include <kitchensink.h> */
+#ifdef __QNX__
+#include <signal.h>
+#include <process.h>
+#endif               /* __QNX__ */
+#include <errno.h>
+
+#include "types.h"  /* for byte and u32 typedefs */
+#include "algorithms.h"
+#include "util.h"
+
+#ifndef EAGAIN
+#define EAGAIN EWOULDBLOCK
+#endif
+#ifndef STDIN_FILENO
+#define STDIN_FILENO 0
+#endif
+#ifndef STDOUT_FILENO
+#define STDOUT_FILENO 1
+#endif
+
+#define GATHER_BUFSIZE         49152   /* Usually about 25K are filled */
+
+/* The structure containing information on random-data sources.  Each
+ * record contains the source and a relative estimate of its usefulness
+ * (weighting) which is used to scale the number of kB of output from the
+ * source (total = data_bytes / usefulness).  Usually the weighting is in the
+ * range 1-3 (or 0 for especially useless sources), resulting in a usefulness
+ * rating of 1...3 for each kB of source output (or 0 for the useless
+ * sources).
+ *
+ * If the source is constantly changing (certain types of network statistics
+ * have this characteristic) but the amount of output is small, the weighting
+ * is given as a negative value to indicate that the output should be treated
+ * as if a minimum of 1K of output had been obtained.  If the source produces
+ * a lot of output then the scale factor is fractional, resulting in a
+ * usefulness rating of < 1 for each kB of source output.
+ *
+ * In order to provide enough randomness to satisfy the requirements for a
+ * slow poll, we need to accumulate at least 20 points of usefulness (a
+ * typical system should get about 30 points).
+ *
+ * Some potential options are missed out because of special considerations.
+ * pstat -i and pstat -f can produce amazing amounts of output (the record
+ * is 600K on an Oracle server) which floods the buffer and doesn't yield
+ * anything useful (apart from perhaps increasing the entropy of the vmstat
+ * output a bit), so we don't bother with this.  pstat in general produces
+ * quite a bit of output, but it doesn't change much over time, so it gets
+ * very low weightings.  netstat -s produces constantly-changing output but
+ * also produces quite a bit of it, so it only gets a weighting of 2 rather
+ * than 3.  The same holds for netstat -in, which gets 1 rather than 2.
+ *
+ * Some binaries are stored in different locations on different systems so
+ * alternative paths are given for them.  The code sorts out which one to
+ * run by itself, once it finds an exectable somewhere it moves on to the
+ * next source.  The sources are arranged roughly in their order of
+ * usefulness, occasionally sources which provide a tiny amount of
+ * relatively useless data are placed ahead of ones which provide a large
+ * amount of possibly useful data because another 100 bytes can't hurt, and
+ * it means the buffer won't be swamped by one or two high-output sources.
+ * All the high-output sources are clustered towards the end of the list
+ * for this reason.  Some binaries are checked for in a certain order, for
+ * example under Slowaris /usr/ucb/ps understands aux as an arg, but the
+ * others don't.  Some systems have conditional defines enabling alternatives
+ * to commands which don't understand the usual options but will provide
+ * enough output (in the form of error messages) to look like they're the
+ * real thing, causing alternative options to be skipped (we can't check the
+ * return either because some commands return peculiar, non-zero status even
+ * when they're working correctly).
+ *
+ * In order to maximise use of the buffer, the code performs a form of run-
+ * length compression on its input where a repeated sequence of bytes is
+ * replaced by the occurrence count mod 256.  Some commands output an awful
+ * lot of whitespace, this measure greatly increases the amount of data we
+ * can fit in the buffer.
+ *
+ * When we scale the weighting using the SC() macro, some preprocessors may
+ * give a division by zero warning for the most obvious expression
+ * 'weight ? 1024 / weight : 0' (and gcc 2.7.2.2 dies with a division by zero
+ * trap), so we define a value SC_0 which evaluates to zero when fed to
+ * '1024 / SC_0' */
+
+#define SC( weight )   ( 1024 / weight )       /* Scale factor */
+#define SC_0                   16384   /* SC( SC_0 ) evalutes to 0 */
+
+static struct RI {
+    const char *path;          /* Path to check for existence of source */
+    const char *arg;           /* Args for source */
+    const int usefulness;      /* Usefulness of source */
+    FILE *pipe;                /* Pipe to source as FILE * */
+    int pipeFD;                /* Pipe to source as FD */
+    pid_t pid;                 /* pid of child for waitpid() */
+    int length;                /* Quantity of output produced */
+    const int hasAlternative;      /* Whether source has alt.location */
+} dataSources[] = {
+
+    {  "/bin/vmstat", "-s", SC(-3), NULL, 0, 0, 0, 1    },
+    {  "/usr/bin/vmstat", "-s", SC(-3), NULL, 0, 0, 0, 0},
+    {  "/bin/vmstat", "-c", SC(-3), NULL, 0, 0, 0, 1     },
+    {  "/usr/bin/vmstat", "-c", SC(-3), NULL, 0, 0, 0, 0},
+    {  "/usr/bin/pfstat", NULL, SC(-2), NULL, 0, 0, 0, 0},
+    {  "/bin/vmstat", "-i", SC(-2), NULL, 0, 0, 0, 1     },
+    {  "/usr/bin/vmstat", "-i", SC(-2), NULL, 0, 0, 0, 0},
+    {  "/usr/ucb/netstat", "-s", SC(2), NULL, 0, 0, 0, 1 },
+    {  "/usr/bin/netstat", "-s", SC(2), NULL, 0, 0, 0, 1 },
+    {  "/usr/sbin/netstat", "-s", SC(2), NULL, 0, 0, 0, 1},
+    {  "/usr/etc/netstat", "-s", SC(2), NULL, 0, 0, 0, 0},
+    {  "/usr/bin/nfsstat", NULL, SC(2), NULL, 0, 0, 0, 0},
+    {  "/usr/ucb/netstat", "-m", SC(-1), NULL, 0, 0, 0, 1  },
+    {  "/usr/bin/netstat", "-m", SC(-1), NULL, 0, 0, 0, 1  },
+    {  "/usr/sbin/netstat", "-m", SC(-1), NULL, 0, 0, 0, 1 },
+    {  "/usr/etc/netstat", "-m", SC(-1), NULL, 0, 0, 0, 0 },
+    {  "/bin/netstat",     "-in", SC(-1), NULL, 0, 0, 0, 1 },
+    {  "/usr/ucb/netstat", "-in", SC(-1), NULL, 0, 0, 0, 1 },
+    {  "/usr/bin/netstat", "-in", SC(-1), NULL, 0, 0, 0, 1 },
+    {  "/usr/sbin/netstat", "-in", SC(-1), NULL, 0, 0, 0, 1},
+    {  "/usr/etc/netstat", "-in", SC(-1), NULL, 0, 0, 0, 0},
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.7.1.0",
+                                   SC(-1), NULL, 0, 0, 0, 0 }, /* UDP in */
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.7.4.0",
+                                   SC(-1), NULL, 0, 0, 0, 0 },  /* UDP out */
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.4.3.0",
+                                   SC(-1), NULL, 0, 0, 0, 0 }, /* IP ? */
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.6.10.0",
+                                   SC(-1), NULL, 0, 0, 0, 0 }, /* TCP ? */
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.6.11.0",
+                                   SC(-1), NULL, 0, 0, 0, 0 }, /* TCP ? */
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.6.13.0",
+                                   SC(-1), NULL, 0, 0, 0, 0 }, /* TCP ? */
+    {  "/usr/bin/mpstat", NULL, SC(1), NULL, 0, 0, 0, 0     },
+    {  "/usr/bin/w", NULL, SC(1), NULL, 0, 0, 0, 1           },
+    {  "/usr/bsd/w", NULL, SC(1), NULL, 0, 0, 0, 0          },
+    {  "/usr/bin/df", NULL, SC(1), NULL, 0, 0, 0, 1          },
+    {  "/bin/df", NULL, SC(1), NULL, 0, 0, 0, 0             },
+    {  "/usr/sbin/portstat", NULL, SC(1), NULL, 0, 0, 0, 0  },
+    {  "/usr/bin/iostat", NULL, SC(SC_0), NULL, 0, 0, 0, 0  },
+    {  "/usr/bin/uptime", NULL, SC(SC_0), NULL, 0, 0, 0, 1   },
+    {  "/usr/bsd/uptime", NULL, SC(SC_0), NULL, 0, 0, 0, 0  },
+    {  "/bin/vmstat", "-f", SC(SC_0), NULL, 0, 0, 0, 1       },
+    {  "/usr/bin/vmstat", "-f", SC(SC_0), NULL, 0, 0, 0, 0  },
+    {  "/bin/vmstat", NULL, SC(SC_0), NULL, 0, 0, 0, 1       },
+    {  "/usr/bin/vmstat", NULL, SC(SC_0), NULL, 0, 0, 0, 0  },
+    {  "/usr/ucb/netstat", "-n", SC(0.5), NULL, 0, 0, 0, 1   },
+    {  "/usr/bin/netstat", "-n", SC(0.5), NULL, 0, 0, 0, 1   },
+    {  "/usr/sbin/netstat", "-n", SC(0.5), NULL, 0, 0, 0, 1  },
+    {  "/usr/etc/netstat", "-n", SC(0.5), NULL, 0, 0, 0, 0  },
+#if defined( __sgi ) || defined( __hpux )
+    {  "/bin/ps", "-el", SC(0.3), NULL, 0, 0, 0, 1           },
+#endif                         /* __sgi || __hpux */
+    {  "/usr/ucb/ps", "aux", SC(0.3), NULL, 0, 0, 0, 1       },
+    {  "/usr/bin/ps", "aux", SC(0.3), NULL, 0, 0, 0, 1       },
+    {  "/bin/ps", "aux", SC(0.3), NULL, 0, 0, 0, 0          },
+    {   "/bin/ps", "-A", SC(0.3), NULL, 0, 0, 0, 0           }, /*QNX*/
+    {  "/usr/bin/ipcs", "-a", SC(0.5), NULL, 0, 0, 0, 1      },
+    {  "/bin/ipcs", "-a", SC(0.5), NULL, 0, 0, 0, 0         },
+    /* Unreliable source, depends on system usage */
+    {  "/etc/pstat", "-p", SC(0.5), NULL, 0, 0, 0, 1         },
+    {  "/bin/pstat", "-p", SC(0.5), NULL, 0, 0, 0, 0        },
+    {  "/etc/pstat", "-S", SC(0.2), NULL, 0, 0, 0, 1         },
+    {  "/bin/pstat", "-S", SC(0.2), NULL, 0, 0, 0, 0        },
+    {  "/etc/pstat", "-v", SC(0.2), NULL, 0, 0, 0, 1         },
+    {  "/bin/pstat", "-v", SC(0.2), NULL, 0, 0, 0, 0        },
+    {  "/etc/pstat", "-x", SC(0.2), NULL, 0, 0, 0, 1         },
+    {  "/bin/pstat", "-x", SC(0.2), NULL, 0, 0, 0, 0        },
+    {  "/etc/pstat", "-t", SC(0.1), NULL, 0, 0, 0, 1         },
+    {  "/bin/pstat", "-t", SC(0.1), NULL, 0, 0, 0, 0        },
+    /* pstat is your friend */
+    {  "/usr/bin/last", "-n 50", SC(0.3), NULL, 0, 0, 0, 1   },
+#ifdef __sgi
+    {  "/usr/bsd/last", "-50", SC(0.3), NULL, 0, 0, 0, 0    },
+#endif                         /* __sgi */
+#ifdef __hpux
+    {  "/etc/last", "-50", SC(0.3), NULL, 0, 0, 0, 0        },
+#endif                         /* __hpux */
+    {  "/usr/bsd/last", "-n 50", SC(0.3), NULL, 0, 0, 0, 0  },
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.5.1.0",
+                               SC(0.1), NULL, 0, 0, 0, 0 }, /* ICMP ? */
+    {  "/usr/sbin/snmp_request", "localhost public get 1.3.6.1.2.1.5.3.0",
+                               SC(0.1), NULL, 0, 0, 0, 0 }, /* ICMP ? */
+    {  "/etc/arp", "-a", SC(0.1), NULL, 0, 0, 0, 1  },
+    {  "/usr/etc/arp", "-a", SC(0.1), NULL, 0, 0, 0, 1  },
+    {  "/usr/bin/arp", "-a", SC(0.1), NULL, 0, 0, 0, 1  },
+    {  "/usr/sbin/arp", "-a", SC(0.1), NULL, 0, 0, 0, 0 },
+    {  "/usr/sbin/ripquery", "-nw 1 127.0.0.1",
+                               SC(0.1), NULL, 0, 0, 0, 0 },
+    {  "/bin/lpstat", "-t", SC(0.1), NULL, 0, 0, 0, 1     },
+    {  "/usr/bin/lpstat", "-t", SC(0.1), NULL, 0, 0, 0, 1 },
+    {  "/usr/ucb/lpstat", "-t", SC(0.1), NULL, 0, 0, 0, 0 },
+    {  "/usr/bin/tcpdump", "-c 5 -efvvx", SC(1), NULL, 0, 0, 0, 0 },
+    /* This is very environment-dependant.  If network traffic is low, it'll
+     * probably time out before delivering 5 packets, which is OK because
+     * it'll probably be fixed stuff like ARP anyway */
+    {  "/usr/sbin/advfsstat", "-b usr_domain",
+                               SC(SC_0), NULL, 0, 0, 0, 0},
+    {  "/usr/sbin/advfsstat", "-l 2 usr_domain",
+                               SC(0.5), NULL, 0, 0, 0, 0},
+    {  "/usr/sbin/advfsstat", "-p usr_domain",
+                               SC(SC_0), NULL, 0, 0, 0, 0},
+    /* This is a complex and screwball program.  Some systems have things
+     * like rX_dmn, x = integer, for RAID systems, but the statistics are
+     * pretty dodgy */
+#ifdef __QNXNTO__                                                             
+    { "/bin/pidin", "-F%A%B%c%d%E%I%J%K%m%M%n%N%p%P%S%s%T", SC(0.3),
+             NULL, 0, 0, 0, 0       },
+#endif     
+#if 0
+    /* The following aren't enabled since they're somewhat slow and not very
+     * unpredictable, however they give an indication of the sort of sources
+     * you can use (for example the finger might be more useful on a
+     * firewalled internal network) */
+    {  "/usr/bin/finger", "@ml.media.mit.edu", SC(0.9), NULL, 0, 0, 0, 0 },
+    {  "/usr/local/bin/wget", "-O - http://lavarand.sgi.com/block.html",
+                               SC(0.9), NULL, 0, 0, 0, 0 },
+    {  "/bin/cat", "/usr/spool/mqueue/syslog", SC(0.9), NULL, 0, 0, 0, 0 },
+#endif                         /* 0 */
+    {  NULL, NULL, 0, NULL, 0, 0, 0, 0 }
+};
+
+static byte *gather_buffer;        /* buffer for gathering random noise */
+static int gather_buffer_size;     /* size of the memory buffer */
+static uid_t gatherer_uid;
+
+/* The message structure used to communicate with the parent */
+typedef struct {
+    int  usefulness;   /* usefulness of data */
+    int  ndata;        /* valid bytes in data */
+    char data[500];    /* gathered data */
+} GATHER_MSG;
+
+
+#ifndef HAVE_WAITPID
+pid_t
+waitpid(pid_t pid, int *statptr, int options)
+{
+#ifdef HAVE_WAIT4
+       return wait4(pid, statptr, options, NULL);
+#else
+       /* If wait4 is also not available, try wait3 for SVR3 variants */
+       /* Less ideal because can't actually request a specific pid */
+       /* For that reason, first check to see if pid is for an */
+       /*   existing process. */
+       int tmp_pid, dummystat;;
+       if (kill(pid, 0) == -1) {
+               errno = ECHILD;
+               return -1;
+       }
+       if (statptr == NULL)
+               statptr = &dummystat;
+       while (((tmp_pid = wait3(statptr, options, 0)) != pid) &&
+                   (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1))
+           ;
+       return tmp_pid;
+#endif
+}
+#endif
+
+
+/* Under SunOS popen() doesn't record the pid of the child process.  When
+ * pclose() is called, instead of calling waitpid() for the correct child, it
+ * calls wait() repeatedly until the right child is reaped.  The problem is
+ * that this reaps any other children that happen to have died at that
+ * moment, and when their pclose() comes along, the process hangs forever.
+ * The fix is to use a wrapper for popen()/pclose() which saves the pid in
+ * the dataSources structure (code adapted from GNU-libc's popen() call).
+ *
+ * Aut viam inveniam aut faciam */
+
+static FILE *
+my_popen(struct RI *entry)
+{
+
+    int pipedes[2];
+    FILE *stream;
+
+    /* Create the pipe */
+    if (pipe(pipedes) < 0)
+       return (NULL);
+
+    /* Fork off the child ("vfork() is like an OS orgasm.  All OS's want to
+     * do it, but most just end up faking it" - Chris Wedgwood).  If your OS
+     * supports it, you should try to use vfork() here because it's somewhat
+     * more efficient */
+#if defined( sun ) || defined( __ultrix__ ) || defined( __osf__ ) || \
+       defined(__hpux)
+    entry->pid = vfork();
+#else                          /*  */
+    entry->pid = fork();
+#endif                         /* Unixen which have vfork() */
+    if (entry->pid == (pid_t) - 1) {
+       /* The fork failed */
+       close(pipedes[0]);
+       close(pipedes[1]);
+       return (NULL);
+    }
+
+    if (entry->pid == (pid_t) 0) {
+       struct passwd *passwd;
+       int fd;
+
+       /* We are the child.  Make the read side of the pipe be stdout */
+       if (dup2(pipedes[STDOUT_FILENO], STDOUT_FILENO) < 0)
+           exit(127);
+       /* Connect the other standard handles to the bit bucket. */
+       if ((fd = open ("/dev/null", O_RDWR)) != -1) {
+           dup2 (fd, STDIN_FILENO);
+           dup2 (fd, STDERR_FILENO);
+           close (fd);
+       }
+
+       /* Now that everything is set up, give up our permissions to make
+        * sure we don't read anything sensitive.  If the getpwnam() fails,
+        * we default to -1, which is usually nobody */
+       if (gatherer_uid == (uid_t)-1 && \
+           (passwd = getpwnam("nobody")) != NULL)
+           gatherer_uid = passwd->pw_uid;
+
+       setuid(gatherer_uid);
+
+       /* Close the pipe descriptors. */
+       close(pipedes[STDIN_FILENO]);
+       close(pipedes[STDOUT_FILENO]);
+
+       /* Try and exec the program */
+       execl(entry->path, entry->path, entry->arg, NULL);
+
+       /* Die if the exec failed */
+       exit(127);
+    }
+
+    /* We are the parent.  Close the irrelevant side of the pipe and open
+     * the relevant side as a new stream.  Mark our side of the pipe to
+     * close on exec, so new children won't see it */
+    close(pipedes[STDOUT_FILENO]);
+
+#ifdef FD_CLOEXEC
+    fcntl(pipedes[STDIN_FILENO], F_SETFD, FD_CLOEXEC);
+#endif
+
+    stream = fdopen(pipedes[STDIN_FILENO], "r");
+
+    if (stream == NULL) {
+       int savedErrno = errno;
+
+       /* The stream couldn't be opened or the child structure couldn't be
+        * allocated.  Kill the child and close the other side of the pipe */
+       kill(entry->pid, SIGKILL);
+       if (stream == NULL)
+           close(pipedes[STDOUT_FILENO]);
+       else
+           fclose(stream);
+
+       waitpid(entry->pid, NULL, 0);
+
+       entry->pid = 0;
+       errno = savedErrno;
+       return (NULL);
+    }
+
+    return (stream);
+}
+
+static int
+my_pclose(struct RI *entry)
+{
+    int status = 0;
+
+    if (fclose(entry->pipe))
+       return (-1);
+
+    /* We ignore the return value from the process because some programs
+     * return funny values which would result in the input being discarded
+     * even if they executed successfully.  This isn't a problem because the
+     * result data size threshold will filter out any programs which exit
+     * with a usage message without producing useful output */
+    if (waitpid(entry->pid, NULL, 0) != entry->pid)
+       status = -1;
+
+    entry->pipe = NULL;
+    entry->pid = 0;
+    return (status);
+}
+
+
+/* Unix slow poll (without special support for Linux)
+ *
+ * If a few of the randomness sources create a large amount of output then
+ * the slowPoll() stops once the buffer has been filled (but before all the
+ * randomness sources have been sucked dry) so that the 'usefulness' factor
+ * remains below the threshold.  For this reason the gatherer buffer has to
+ * be fairly sizeable on moderately loaded systems.  This is something of a
+ * bug since the usefulness should be influenced by the amount of output as
+ * well as the source type */
+
+
+static int
+slow_poll(FILE *dbgfp, int dbgall, size_t *nbytes )
+{
+    int moreSources;
+    struct timeval tv;
+    fd_set fds;
+#if defined( __hpux )
+    size_t maxFD = 0;
+#else
+    int maxFD = 0;
+#endif /* OS-specific brokenness */
+    int bufPos, i, usefulness = 0;
+
+
+    /* Fire up each randomness source */
+    FD_ZERO(&fds);
+    for (i = 0; dataSources[i].path != NULL; i++) {
+       /* Since popen() is a fairly heavy function, we check to see whether
+        * the executable exists before we try to run it */
+       if (access(dataSources[i].path, X_OK)) {
+           if( dbgfp && dbgall )
+               fprintf(dbgfp, "%s not present%s\n", dataSources[i].path,
+                              dataSources[i].hasAlternative ?
+                                       ", has alternatives" : "");
+           dataSources[i].pipe = NULL;
+       }
+       else
+           dataSources[i].pipe = my_popen(&dataSources[i]);
+
+       if (dataSources[i].pipe != NULL) {
+           dataSources[i].pipeFD = fileno(dataSources[i].pipe);
+           if (dataSources[i].pipeFD > maxFD)
+               maxFD = dataSources[i].pipeFD;
+#ifdef O_NONBLOCK /* Ohhh what a hack (used for Atari) */
+           fcntl(dataSources[i].pipeFD, F_SETFL, O_NONBLOCK);
+#endif
+           FD_SET(dataSources[i].pipeFD, &fds);
+           dataSources[i].length = 0;
+
+           /* If there are alternatives for this command, don't try and
+            * execute them */
+           while (dataSources[i].hasAlternative) {
+               if( dbgfp && dbgall )
+                   fprintf(dbgfp, "Skipping %s\n", dataSources[i + 1].path);
+               i++;
+           }
+       }
+    }
+
+
+    /* Suck all the data we can get from each of the sources */
+    bufPos = 0;
+    moreSources = 1;
+    while (moreSources && bufPos <= gather_buffer_size) {
+       /* Wait for data to become available from any of the sources, with a
+        * timeout of 10 seconds.  This adds even more randomness since data
+        * becomes available in a nondeterministic fashion.  Kudos to HP's QA
+        * department for managing to ship a select() which breaks its own
+        * prototype */
+       tv.tv_sec = 10;
+       tv.tv_usec = 0;
+
+#if defined( __hpux ) && ( OS_VERSION == 9 )
+       if (select(maxFD + 1, (int *)&fds, NULL, NULL, &tv) == -1)
+#else  /*  */
+       if (select(maxFD + 1, &fds, NULL, NULL, &tv) == -1)
+#endif /* __hpux */
+           break;
+
+       /* One of the sources has data available, read it into the buffer */
+       for (i = 0; dataSources[i].path != NULL; i++) {
+           if( dataSources[i].pipe && FD_ISSET(dataSources[i].pipeFD, &fds)) {
+               size_t noBytes;
+
+               if ((noBytes = fread(gather_buffer + bufPos, 1,
+                                    gather_buffer_size - bufPos,
+                                    dataSources[i].pipe)) == 0) {
+                   if (my_pclose(&dataSources[i]) == 0) {
+                       int total = 0;
+
+                       /* Try and estimate how much entropy we're getting
+                        * from a data source */
+                       if (dataSources[i].usefulness) {
+                           if (dataSources[i].usefulness < 0)
+                               total = (dataSources[i].length + 999)
+                                       / -dataSources[i].usefulness;
+                           else
+                               total = dataSources[i].length
+                                       / dataSources[i].usefulness;
+                       }
+                       if( dbgfp )
+                           fprintf(dbgfp,
+                              "%s %s contributed %d bytes, "
+                              "usefulness = %d\n", dataSources[i].path,
+                              (dataSources[i].arg != NULL) ?
+                                      dataSources[i].arg : "",
+                                     dataSources[i].length, total);
+                       if( dataSources[i].length )
+                           usefulness += total;
+                   }
+                   dataSources[i].pipe = NULL;
+               }
+               else {
+                   int currPos = bufPos;
+                   int endPos = bufPos + noBytes;
+
+                   /* Run-length compress the input byte sequence */
+                   while (currPos < endPos) {
+                       int ch = gather_buffer[currPos];
+
+                       /* If it's a single byte, just copy it over */
+                       if (ch != gather_buffer[currPos + 1]) {
+                           gather_buffer[bufPos++] = ch;
+                           currPos++;
+                       }
+                       else {
+                           int count = 0;
+
+                           /* It's a run of repeated bytes, replace them
+                            * with the byte count mod 256 */
+                           while ((ch == gather_buffer[currPos])
+                                   && currPos < endPos) {
+                               count++;
+                               currPos++;
+                           }
+                           gather_buffer[bufPos++] = count;
+                           noBytes -= count - 1;
+                       }
+                   }
+
+                   /* Remember the number of (compressed) bytes of input we
+                    * obtained */
+                   dataSources[i].length += noBytes;
+               }
+           }
+       }
+
+       /* Check if there is more input available on any of the sources */
+       moreSources = 0;
+       FD_ZERO(&fds);
+       for (i = 0; dataSources[i].path != NULL; i++) {
+           if (dataSources[i].pipe != NULL) {
+               FD_SET(dataSources[i].pipeFD, &fds);
+               moreSources = 1;
+           }
+       }
+    }
+
+    if( dbgfp ) {
+       fprintf(dbgfp, "Got %d bytes, usefulness = %d\n", bufPos, usefulness);
+       fflush(dbgfp);
+    }
+    *nbytes = bufPos;
+    return usefulness;
+}
+
+/****************
+ * Start the gatherer process which writes messages of
+ * type GATHERER_MSG to pipedes
+ */
+static void
+start_gatherer( int pipefd )
+{
+    FILE *dbgfp = NULL;
+    int dbgall;
+
+#ifdef ENABLE_SELINUX_HACKS
+    /* We don't allow writing to the log file because this might be
+       sued to corrupt a secured file.  Given that this is used as a
+       library by the ../g10/ code, we can't access the check function
+       from ../g10/misc.c.  */
+    dbgall = 0;
+#else
+    {
+       const char *s = getenv("GNUPG_RNDUNIX_DBG");
+       if( s ) {
+           dbgfp = (*s=='-' && !s[1])? stdout : fopen(s, "a");
+           if( !dbgfp )
+               g10_log_info("can't open debug file `%s': %s\n",
+                            s, strerror(errno) );
+           else
+               fprintf(dbgfp,"\nSTART RNDUNIX DEBUG pid=%d\n", (int)getpid());
+       }
+       dbgall = !!getenv("GNUPG_RNDUNIX_DBGALL");
+    }
+#endif
+
+    /* Set up the buffer */
+    gather_buffer_size = GATHER_BUFSIZE;
+    gather_buffer = malloc( gather_buffer_size );
+    if( !gather_buffer ) {
+       g10_log_error("out of core while allocating the gatherer buffer\n");
+       exit(2);
+    }
+
+    /* Reset the SIGC(H)LD handler to the system default.  This is necessary
+     * because if the program which cryptlib is a part of installs its own
+     * SIGC(H)LD handler, it will end up reaping the cryptlib children before
+     * cryptlib can.  As a result, my_pclose() will call waitpid() on a
+     * process which has already been reaped by the installed handler and
+     * return an error, so the read data won't be added to the randomness
+     * pool.  There are two types of SIGC(H)LD naming, the SysV SIGCLD and
+     * the BSD/Posix SIGCHLD, so we need to handle either possibility */
+#ifdef SIGCLD
+    signal(SIGCLD, SIG_DFL);
+#else
+    signal(SIGCHLD, SIG_DFL);
+#endif
+
+    fflush (stderr);
+    /* Arrghh!!  It's Stuart code!! */
+    /* (close all files but the ones we need) */
+    {  int nmax, n1, i;
+#ifdef _SC_OPEN_MAX
+       if( (nmax=sysconf( _SC_OPEN_MAX )) < 0 ) {
+#ifdef _POSIX_OPEN_MAX
+           nmax = _POSIX_OPEN_MAX;
+#else
+           nmax = 20; /* assume a reasonable value */
+#endif
+       }
+#else
+       nmax = 20; /* assume a reasonable value */
+#endif
+       {  
+         int fd;
+         if ((fd = open ("/dev/null", O_RDWR)) != -1) {
+           dup2 (fd, STDIN_FILENO);
+           dup2 (fd, STDOUT_FILENO);
+           dup2 (fd, STDERR_FILENO);
+           close (fd);
+         }
+       }
+       n1 = dbgfp? fileno (dbgfp) : -1;
+       for(i=0; i < nmax; i++ ) {
+           if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO
+               && i != n1 && i != pipefd )
+             close(i);
+       }
+       errno = 0;
+    }
+
+
+    for(;;) {
+       GATHER_MSG msg;
+       size_t nbytes;
+       const char *p;
+
+       msg.usefulness = slow_poll( dbgfp, dbgall, &nbytes );
+       p = gather_buffer;
+       while( nbytes ) {
+           msg.ndata = nbytes > sizeof(msg.data)? sizeof(msg.data) : nbytes;
+           memcpy( msg.data, p, msg.ndata );
+           nbytes -= msg.ndata;
+           p += msg.ndata;
+
+           while( write( pipefd, &msg, sizeof(msg) ) != sizeof(msg) ) {
+               if( errno == EINTR )
+                   continue;
+               if( errno == EAGAIN ) {
+                   struct timeval tv;
+                   tv.tv_sec = 0;
+                   tv.tv_usec = 50000;
+                   select(0, NULL, NULL, NULL, &tv);
+                   continue;
+               }
+               if( errno == EPIPE ) /* parent has exited, so give up */
+                  exit(0);
+
+               /* we can't do very much here because stderr is closed */
+               if( dbgfp )
+                   fprintf(dbgfp, "gatherer can't write to pipe: %s\n",
+                                   strerror(errno) );
+               /* we start a new poll to give the system some time */
+               nbytes = 0;
+               break;
+           }
+       }
+    }
+    /* we are killed when the parent dies */
+}
+
+
+static int
+read_a_msg( int fd, GATHER_MSG *msg )
+{
+    char *buffer = (char*)msg;
+    size_t length = sizeof( *msg );
+    int n;
+
+    do {
+       do {
+           n = read(fd, buffer, length );
+       } while( n == -1 && errno == EINTR );
+       if( n == -1 )
+           return -1;
+       buffer += n;
+       length -= n;
+    } while( length );
+    return 0;
+}
+
+
+/****************
+ * Using a level of 0 should never block and better add nothing
+ * to the pool.  So this is just a dummy for this gatherer.
+ */
+int
+rndunix_gather_random( void (*add)(const void*, size_t, int), int requester,
+                       size_t length, int level )
+{
+    static pid_t gatherer_pid = 0;
+    static int pipedes[2];
+    GATHER_MSG msg;
+    size_t n;
+
+    if( !level )
+       return 0;
+
+    if( !gatherer_pid ) {
+       /* make sure we are not setuid */
+       if( getuid() != geteuid() )
+           BUG();
+       /* time to start the gatherer process */
+       if( pipe( pipedes ) ) {
+           g10_log_error("pipe() failed: %s\n", strerror(errno));
+           return -1;
+       }
+       gatherer_pid = fork();
+       if( gatherer_pid == -1 ) {
+           g10_log_error("can't for gatherer process: %s\n", strerror(errno));
+           return -1;
+       }
+       if( !gatherer_pid ) {
+           start_gatherer( pipedes[1] );
+           /* oops, can't happen */
+           return -1;
+       }
+    }
+
+    /* now read from the gatherer */
+    while( length ) {
+       int goodness;
+       ulong subtract;
+
+       if( read_a_msg( pipedes[0], &msg ) ) {
+           g10_log_error("reading from gatherer pipe failed: %s\n",
+                                                           strerror(errno));
+           return -1;
+       }
+
+
+       if( level > 1 ) {
+           if( msg.usefulness > 30 )
+               goodness = 100;
+           else if ( msg.usefulness )
+               goodness = msg.usefulness * 100 / 30;
+           else
+               goodness = 0;
+       }
+       else if( level ) {
+           if( msg.usefulness > 15 )
+               goodness = 100;
+           else if ( msg.usefulness )
+               goodness = msg.usefulness * 100 / 15;
+           else
+               goodness = 0;
+       }
+       else
+           goodness = 100; /* goodness of level 0 is always 100 % */
+
+       n = msg.ndata;
+       if( n > length )
+           n = length;
+       (*add)( msg.data, n, requester );
+
+       /* this is the trick how e cope with the goodness */
+       subtract = (ulong)n * goodness / 100;
+       /* subtract at least 1 byte to avoid infinite loops */
+       length -= subtract ? subtract : 1;
+    }
+
+    return 0;
+}
diff --git a/cipher/rndw32.c b/cipher/rndw32.c
new file mode 100644 (file)
index 0000000..f81f1c1
--- /dev/null
@@ -0,0 +1,699 @@
+/* rndw32.c  - W32 entropy gatherer
+ *     Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ *     Copyright Peter Gutmann, Matt Thomlinson and Blake Coverett 1996-1999
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ *************************************************************************
+ * The code here is based on code from Cryptlib 3.0 beta by Peter Gutmann.
+ * Source file misc/rndwin32.c "Win32 Randomness-Gathering Code" with this
+ * copyright notice:
+ *
+ * This module is part of the cryptlib continuously seeded pseudorandom
+ * number generator.  For usage conditions, see lib_rand.c
+ *
+ * [Here is the notice from lib_rand.c, which is now called dev_sys.c]
+ *
+ * This module and the misc/rnd*.c modules represent the cryptlib
+ * continuously seeded pseudorandom number generator (CSPRNG) as described in
+ * my 1998 Usenix Security Symposium paper "The generation of random numbers
+ * for cryptographic purposes".
+ *
+ * The CSPRNG code is copyright Peter Gutmann (and various others) 1996,
+ * 1997, 1998, 1999, all rights reserved.  Redistribution of the CSPRNG
+ * modules and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice
+ *    and this permission notice in its entirety.
+ *
+ * 2. Redistributions in binary form must reproduce the copyright notice in
+ *    the documentation and/or other materials provided with the distribution.
+ *
+ * 3. A copy of any bugfixes or enhancements made must be provided to the
+ *    author, <pgut001@cs.auckland.ac.nz> to allow them to be added to the
+ *    baseline version of the code.
+ *
+ * ALTERNATIVELY, the code may be distributed under the terms of the GNU
+ * General Public License, version 2 or any later version published by the
+ * Free Software Foundation, in which case the provisions of the GNU GPL are
+ * required INSTEAD OF the above restrictions.
+ *
+ * Although not required under the terms of the GPL, it would still be nice if
+ * you could make any changes available to the author to allow a consistent
+ * code base to be maintained
+ *************************************************************************
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+
+#include <windows.h>
+
+
+#include "types.h"
+#include "util.h"
+#include "algorithms.h"
+
+#include "i18n.h"
+
+
+static int debug_me;
+
+/*
+ * Definitions which are missing from the current GNU Windows32Api
+ */
+
+#ifndef TH32CS_SNAPHEAPLIST
+#define TH32CS_SNAPHEAPLIST 1
+#define TH32CS_SNAPPROCESS  2
+#define TH32CS_SNAPTHREAD   4
+#define TH32CS_SNAPMODULE   8
+#define TH32CS_SNAPALL     (1|2|4|8)
+#define TH32CS_INHERIT     0x80000000
+#endif /*TH32CS_SNAPHEAPLIST*/
+
+#ifndef IOCTL_DISK_PERFORMANCE
+#define IOCTL_DISK_PERFORMANCE 0x00070020
+#endif
+#ifndef VER_PLATFORM_WIN32_WINDOWS
+#define VER_PLATFORM_WIN32_WINDOWS 1
+#endif
+
+/* This used to be (6*8+5*4+8*2), but Peter Gutmann figured a larger
+   value in a newer release. So we use a far larger value. */
+#define SIZEOF_DISK_PERFORMANCE_STRUCT 256
+
+
+typedef struct {
+    DWORD dwSize;
+    DWORD th32ProcessID;
+    DWORD th32HeapID;
+    DWORD dwFlags;
+} HEAPLIST32;
+
+typedef struct {
+    DWORD dwSize;
+    HANDLE hHandle;
+    DWORD dwAddress;
+    DWORD dwBlockSize;
+    DWORD dwFlags;
+    DWORD dwLockCount;
+    DWORD dwResvd;
+    DWORD th32ProcessID;
+    DWORD th32HeapID;
+} HEAPENTRY32;
+
+typedef struct {
+    DWORD dwSize;
+    DWORD cntUsage;
+    DWORD th32ProcessID;
+    DWORD th32DefaultHeapID;
+    DWORD th32ModuleID;
+    DWORD cntThreads;
+    DWORD th32ParentProcessID;
+    LONG  pcPriClassBase;
+    DWORD dwFlags;
+    char  szExeFile[260];
+} PROCESSENTRY32;
+
+typedef struct {
+    DWORD dwSize;
+    DWORD cntUsage;
+    DWORD th32ThreadID;
+    DWORD th32OwnerProcessID;
+    LONG  tpBasePri;
+    LONG  tpDeltaPri;
+    DWORD dwFlags;
+} THREADENTRY32;
+
+typedef struct {
+    DWORD dwSize;
+    DWORD th32ModuleID;
+    DWORD th32ProcessID;
+    DWORD GlblcntUsage;
+    DWORD ProccntUsage;
+    BYTE  *modBaseAddr;
+    DWORD modBaseSize;
+    HMODULE hModule;
+    char  szModule[256];
+    char  szExePath[260];
+} MODULEENTRY32;
+
+
+
+/* Type definitions for function pointers to call Toolhelp32 functions
+ * used with the windows95 gatherer */
+typedef BOOL (WINAPI * MODULEWALK) (HANDLE hSnapshot, MODULEENTRY32 *lpme);
+typedef BOOL (WINAPI * THREADWALK) (HANDLE hSnapshot, THREADENTRY32 *lpte);
+typedef BOOL (WINAPI * PROCESSWALK) (HANDLE hSnapshot, PROCESSENTRY32 *lppe);
+typedef BOOL (WINAPI * HEAPLISTWALK) (HANDLE hSnapshot, HEAPLIST32 *lphl);
+typedef BOOL (WINAPI * HEAPFIRST) (HEAPENTRY32 *lphe, DWORD th32ProcessID,
+                                  DWORD th32HeapID);
+typedef BOOL (WINAPI * HEAPNEXT) (HEAPENTRY32 *lphe);
+typedef HANDLE (WINAPI * CREATESNAPSHOT) (DWORD dwFlags, DWORD th32ProcessID);
+
+/* Type definitions for function pointers to call NetAPI32 functions */
+typedef DWORD (WINAPI * NETSTATISTICSGET) (LPWSTR szServer, LPWSTR szService,
+                                          DWORD dwLevel, DWORD dwOptions,
+                                          LPBYTE * lpBuffer);
+typedef DWORD (WINAPI * NETAPIBUFFERSIZE) (LPVOID lpBuffer, LPDWORD cbBuffer);
+typedef DWORD (WINAPI * NETAPIBUFFERFREE) (LPVOID lpBuffer);
+
+
+/* When we query the performance counters, we allocate an initial buffer and
+ * then reallocate it as required until RegQueryValueEx() stops returning
+ * ERROR_MORE_DATA.  The following values define the initial buffer size and
+ * step size by which the buffer is increased
+ */
+#define PERFORMANCE_BUFFER_SIZE        65536   /* Start at 64K */
+#define PERFORMANCE_BUFFER_STEP        16384   /* Step by 16K */
+
+
+static void
+slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
+{
+    static CREATESNAPSHOT pCreateToolhelp32Snapshot = NULL;
+    static MODULEWALK pModule32First = NULL;
+    static MODULEWALK pModule32Next = NULL;
+    static PROCESSWALK pProcess32First = NULL;
+    static PROCESSWALK pProcess32Next = NULL;
+    static THREADWALK pThread32First = NULL;
+    static THREADWALK pThread32Next = NULL;
+    static HEAPLISTWALK pHeap32ListFirst = NULL;
+    static HEAPLISTWALK pHeap32ListNext = NULL;
+    static HEAPFIRST pHeap32First = NULL;
+    static HEAPNEXT pHeap32Next = NULL;
+    HANDLE hSnapshot;
+
+
+    /* initialize the Toolhelp32 function pointers */
+    if ( !pCreateToolhelp32Snapshot ) {
+       HANDLE hKernel;
+
+       if ( debug_me )
+           log_debug ("rndw32#slow_gatherer_95: init toolkit\n" );
+
+       /* Obtain the module handle of the kernel to retrieve the addresses
+        * of the Toolhelp32 functions */
+       if ( ( !(hKernel = GetModuleHandle ("KERNEL32.DLL"))) ) {
+           g10_log_fatal ( "rndw32: can't get module handle\n" );
+       }
+
+       /* Now get pointers to the functions */
+       pCreateToolhelp32Snapshot = (CREATESNAPSHOT) GetProcAddress (hKernel,
+                                                 "CreateToolhelp32Snapshot");
+       pModule32First = (MODULEWALK) GetProcAddress (hKernel, "Module32First");
+       pModule32Next = (MODULEWALK) GetProcAddress (hKernel, "Module32Next");
+       pProcess32First = (PROCESSWALK) GetProcAddress (hKernel,
+                                                       "Process32First");
+       pProcess32Next = (PROCESSWALK) GetProcAddress (hKernel,
+                                                      "Process32Next");
+       pThread32First = (THREADWALK) GetProcAddress (hKernel, "Thread32First");
+       pThread32Next = (THREADWALK) GetProcAddress (hKernel, "Thread32Next");
+       pHeap32ListFirst = (HEAPLISTWALK) GetProcAddress (hKernel,
+                                                         "Heap32ListFirst");
+       pHeap32ListNext = (HEAPLISTWALK) GetProcAddress (hKernel,
+                                                        "Heap32ListNext");
+       pHeap32First = (HEAPFIRST) GetProcAddress (hKernel, "Heap32First");
+       pHeap32Next = (HEAPNEXT) GetProcAddress (hKernel, "Heap32Next");
+
+       if (    !pCreateToolhelp32Snapshot
+            || !pModule32First || !pModule32Next
+            || !pProcess32First || !pProcess32Next
+            || !pThread32First  || !pThread32Next
+            || !pHeap32ListFirst || !pHeap32ListNext
+            || !pHeap32First     || !pHeap32Next  ) {
+           g10_log_fatal ( "rndw32: failed to get a toolhep function\n" );
+       }
+    }
+
+    /* Take a snapshot of everything we can get to which is currently
+     * in the system */
+    if ( !(hSnapshot = pCreateToolhelp32Snapshot (TH32CS_SNAPALL, 0)) ) {
+       g10_log_fatal ( "rndw32: failed to take a toolhelp snapshot\n" );
+    }
+
+    /* Walk through the local heap */
+    {  HEAPLIST32 hl32;
+       hl32.dwSize = sizeof (HEAPLIST32);
+       if (pHeap32ListFirst (hSnapshot, &hl32)) {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_95: walk heap\n" );
+           do {
+               HEAPENTRY32 he32;
+
+               /* First add the information from the basic Heaplist32 struct */
+               (*add) ( &hl32, sizeof (hl32), requester );
+
+               /* Now walk through the heap blocks getting information
+                * on each of them */
+               he32.dwSize = sizeof (HEAPENTRY32);
+               if (pHeap32First (&he32, hl32.th32ProcessID, hl32.th32HeapID)){
+                   do {
+                       (*add) ( &he32, sizeof (he32), requester );
+                   } while (pHeap32Next (&he32));
+               }
+           } while (pHeap32ListNext (hSnapshot, &hl32));
+       }
+    }
+
+
+    /* Walk through all processes */
+    {  PROCESSENTRY32 pe32;
+       pe32.dwSize = sizeof (PROCESSENTRY32);
+       if (pProcess32First (hSnapshot, &pe32)) {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_95: walk processes\n" );
+           do {
+               (*add) ( &pe32, sizeof (pe32), requester );
+           } while (pProcess32Next (hSnapshot, &pe32));
+       }
+    }
+
+    /* Walk through all threads */
+    {  THREADENTRY32 te32;
+       te32.dwSize = sizeof (THREADENTRY32);
+       if (pThread32First (hSnapshot, &te32)) {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_95: walk threads\n" );
+           do {
+               (*add) ( &te32, sizeof (te32), requester );
+           } while (pThread32Next (hSnapshot, &te32));
+       }
+    }
+
+    /* Walk through all modules associated with the process */
+    {  MODULEENTRY32 me32;
+       me32.dwSize = sizeof (MODULEENTRY32);
+       if (pModule32First (hSnapshot, &me32)) {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_95: walk modules\n" );
+           do {
+               (*add) ( &me32, sizeof (me32), requester );
+           } while (pModule32Next (hSnapshot, &me32));
+       }
+    }
+
+    CloseHandle (hSnapshot);
+}
+
+
+
+static void
+slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
+{
+    static int is_initialized = 0;
+    static NETSTATISTICSGET pNetStatisticsGet = NULL;
+    static NETAPIBUFFERSIZE pNetApiBufferSize = NULL;
+    static NETAPIBUFFERFREE pNetApiBufferFree = NULL;
+    static int is_workstation = 1;
+
+    static int cbPerfData = PERFORMANCE_BUFFER_SIZE;
+    PERF_DATA_BLOCK *pPerfData;
+    HANDLE hDevice, hNetAPI32 = NULL;
+    DWORD dwSize, status;
+    int nDrive;
+
+    if ( !is_initialized ) {
+       HKEY hKey;
+
+       if ( debug_me )
+           log_debug ("rndw32#slow_gatherer_nt: init toolkit\n" );
+       /* Find out whether this is an NT server or workstation if necessary */
+       if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,
+                         "SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
+                         0, KEY_READ, &hKey) == ERROR_SUCCESS) {
+           BYTE szValue[32];
+           dwSize = sizeof (szValue);
+
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_nt: check product options\n" );
+           status = RegQueryValueEx (hKey, "ProductType", 0, NULL,
+                                     szValue, &dwSize);
+           if (status == ERROR_SUCCESS
+                && ascii_strcasecmp (szValue, "WinNT")) {
+               /* Note: There are (at least) three cases for ProductType:
+                * WinNT = NT Workstation, ServerNT = NT Server, LanmanNT =
+                * NT Server acting as a Domain Controller */
+               is_workstation = 0;
+               if ( debug_me )
+                   log_debug ("rndw32: this is a NT server\n");
+           }
+           RegCloseKey (hKey);
+       }
+
+       /* Initialize the NetAPI32 function pointers if necessary */
+       if ( (hNetAPI32 = LoadLibrary ("NETAPI32.DLL")) ) {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_nt: netapi32 loaded\n" );
+           pNetStatisticsGet = (NETSTATISTICSGET) GetProcAddress (hNetAPI32,
+                                                      "NetStatisticsGet");
+           pNetApiBufferSize = (NETAPIBUFFERSIZE) GetProcAddress (hNetAPI32,
+                                                      "NetApiBufferSize");
+           pNetApiBufferFree = (NETAPIBUFFERFREE) GetProcAddress (hNetAPI32,
+                                                      "NetApiBufferFree");
+
+           if ( !pNetStatisticsGet
+                || !pNetApiBufferSize || !pNetApiBufferFree ) {
+               FreeLibrary (hNetAPI32);
+               hNetAPI32 = NULL;
+               g10_log_debug ("rndw32: No NETAPI found\n" );
+           }
+       }
+
+       is_initialized = 1;
+    }
+
+    /* Get network statistics. Note: Both NT Workstation and NT Server by
+     * default will be running both the workstation and server services.  The
+     * heuristic below is probably useful though on the assumption that the
+     * majority of the network traffic will be via the appropriate service.
+     * In any case the network statistics return almost no randomness */
+    {  LPBYTE lpBuffer;
+       if (hNetAPI32 && !pNetStatisticsGet (NULL,
+                          is_workstation ? L"LanmanWorkstation" :
+                          L"LanmanServer", 0, 0, &lpBuffer) ) {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_nt: get netstats\n" );
+           pNetApiBufferSize (lpBuffer, &dwSize);
+           (*add) ( lpBuffer, dwSize,requester );
+           pNetApiBufferFree (lpBuffer);
+       }
+    }
+
+    /* Get disk I/O statistics for all the hard drives */
+    for (nDrive = 0;; nDrive++) {
+        char diskPerformance[SIZEOF_DISK_PERFORMANCE_STRUCT];
+       char szDevice[50];
+
+       /* Check whether we can access this device */
+       sprintf (szDevice, "\\\\.\\PhysicalDrive%d", nDrive);
+       hDevice = CreateFile (szDevice, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                             NULL, OPEN_EXISTING, 0, NULL);
+       if (hDevice == INVALID_HANDLE_VALUE)
+           break;
+
+       /* Note: This only works if you have turned on the disk performance
+        * counters with 'diskperf -y'.  These counters are off by default */
+       if (DeviceIoControl (hDevice, IOCTL_DISK_PERFORMANCE, NULL, 0,
+                            diskPerformance, SIZEOF_DISK_PERFORMANCE_STRUCT,
+                            &dwSize, NULL))
+       {
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_nt: iostats drive %d\n",
+                                                                 nDrive );
+           (*add) (diskPerformance, dwSize, requester );
+       }
+       else {
+           log_info ("NOTE: you should run 'diskperf -y' "
+                     "to enable the disk statistics\n");
+       }
+       CloseHandle (hDevice);
+    }
+
+#if 0 /* we don't need this in GnuPG  */
+    /* Wait for any async keyset driver binding to complete.  You may be
+     * wondering what this call is doing here... the reason it's necessary is
+     * because RegQueryValueEx() will hang indefinitely if the async driver
+     * bind is in progress.  The problem occurs in the dynamic loading and
+     * linking of driver DLL's, which work as follows:
+     *
+     * hDriver = LoadLibrary( DRIVERNAME );
+     * pFunction1 = ( TYPE_FUNC1 ) GetProcAddress( hDriver, NAME_FUNC1 );
+     * pFunction2 = ( TYPE_FUNC1 ) GetProcAddress( hDriver, NAME_FUNC2 );
+     *
+     * If RegQueryValueEx() is called while the GetProcAddress()'s are in
+     * progress, it will hang indefinitely.  This is probably due to some
+     * synchronisation problem in the NT kernel where the GetProcAddress()
+     * calls affect something like a module reference count or function
+     * reference count while RegQueryValueEx() is trying to take a snapshot
+     * of the statistics, which include the reference counts.  Because of
+     * this, we have to wait until any async driver bind has completed
+     * before we can call RegQueryValueEx() */
+    waitSemaphore (SEMAPHORE_DRIVERBIND);
+#endif
+
+    /* Get information from the system performance counters.  This can take
+     * a few seconds to do.  In some environments the call to
+     * RegQueryValueEx() can produce an access violation at some random time
+     * in the future, adding a short delay after the following code block
+     * makes the problem go away.  This problem is extremely difficult to
+     * reproduce, I haven't been able to get it to occur despite running it
+     * on a number of machines.  The best explanation for the problem is that
+     * on the machine where it did occur, it was caused by an external driver
+     * or other program which adds its own values under the
+     * HKEY_PERFORMANCE_DATA key.  The NT kernel calls the required external
+     * modules to map in the data, if there's a synchronisation problem the
+     * external module would write its data at an inappropriate moment,
+     * causing the access violation.  A low-level memory checker indicated
+     * that ExpandEnvironmentStrings() in KERNEL32.DLL, called an
+     * interminable number of calls down inside RegQueryValueEx(), was
+     * overwriting memory (it wrote twice the allocated size of a buffer to a
+     * buffer allocated by the NT kernel).  This may be what's causing the
+     * problem, but since it's in the kernel there isn't much which can be
+     * done.
+     *
+     * In addition to these problems the code in RegQueryValueEx() which
+     * estimates the amount of memory required to return the performance
+     * counter information isn't very accurate, since it always returns a
+     * worst-case estimate which is usually nowhere near the actual amount
+     * required.  For example it may report that 128K of memory is required,
+     * but only return 64K of data */
+    {  pPerfData =  xmalloc (cbPerfData);
+       for (;;) {
+           dwSize = cbPerfData;
+           if ( debug_me )
+               log_debug ("rndw32#slow_gatherer_nt: get perf data\n" );
+           status = RegQueryValueEx (HKEY_PERFORMANCE_DATA, "Global", NULL,
+                                     NULL, (LPBYTE) pPerfData, &dwSize);
+           if (status == ERROR_SUCCESS) {
+               if (!memcmp (pPerfData->Signature, L"PERF", 8)) {
+                   (*add) ( pPerfData, dwSize, requester );
+               }
+               else
+                   g10_log_debug ( "rndw32: no PERF signature\n");
+               break;
+           }
+           else if (status == ERROR_MORE_DATA) {
+               cbPerfData += PERFORMANCE_BUFFER_STEP;
+               pPerfData = xrealloc (pPerfData, cbPerfData);
+           }
+           else {
+               g10_log_debug ( "rndw32: get performance data problem\n");
+               break;
+           }
+       }
+       xfree (pPerfData);
+    }
+    /* Although this isn't documented in the Win32 API docs, it's necessary
+       to explicitly close the HKEY_PERFORMANCE_DATA key after use (it's
+       implicitly opened on the first call to RegQueryValueEx()).  If this
+       isn't done then any system components which provide performance data
+       can't be removed or changed while the handle remains active */
+    RegCloseKey (HKEY_PERFORMANCE_DATA);
+}
+
+
+int
+rndw32_gather_random (void (*add)(const void*, size_t, int), int requester,
+                      size_t length, int level )
+{
+    static int is_initialized;
+    static int is_windowsNT, has_toolhelp;
+
+
+    if( !level )
+       return 0;
+    /* We don't differentiate between level 1 and 2 here because
+     * there is no nternal entropy pool as a scary resource.  It may
+     * all work slower, but because our entropy source will never
+     * block but deliver some not easy to measure entropy, we assume level 2
+     */
+
+
+    if ( !is_initialized ) {
+       OSVERSIONINFO osvi = { sizeof( osvi ) };
+       DWORD platform;
+
+       GetVersionEx( &osvi );
+       platform = osvi.dwPlatformId;
+        is_windowsNT = platform == VER_PLATFORM_WIN32_NT;
+        has_toolhelp = (platform == VER_PLATFORM_WIN32_WINDOWS
+                        || (is_windowsNT && osvi.dwMajorVersion >= 5));
+
+       if ( platform == VER_PLATFORM_WIN32s ) {
+           g10_log_fatal("can't run on a W32s platform\n" );
+       }
+       is_initialized = 1;
+       if ( debug_me )
+           log_debug ("rndw32#gather_random: platform=%d\n", (int)platform );
+    }
+
+
+    if ( debug_me )
+       log_debug ("rndw32#gather_random: req=%d len=%u lvl=%d\n",
+                          requester, (unsigned int)length, level );
+
+    if ( has_toolhelp ) {
+        slow_gatherer_windows95 ( add, requester );
+    }
+    if ( is_windowsNT ) {
+        slow_gatherer_windowsNT ( add, requester );
+    }
+
+    return 0;
+}
+
+
+
+int
+rndw32_gather_random_fast( void (*add)(const void*, size_t, int), int requester )
+{
+    static int addedFixedItems = 0;
+
+    if ( debug_me )
+       log_debug ("rndw32#gather_random_fast: req=%d\n", requester );
+
+    /* Get various basic pieces of system information: Handle of active
+     * window, handle of window with mouse capture, handle of clipboard owner
+     * handle of start of clpboard viewer list, pseudohandle of current
+     * process, current process ID, pseudohandle of current thread, current
+     * thread ID, handle of desktop window, handle  of window with keyboard
+     * focus, whether system queue has any events, cursor position for last
+     * message, 1 ms time for last message, handle of window with clipboard
+     * open, handle of process heap, handle of procs window station, types of
+     * events in input queue, and milliseconds since Windows was started */
+    {  byte buffer[20*sizeof(ulong)], *bufptr;
+       bufptr = buffer;
+#define ADD(f)  do { ulong along = (ulong)(f);               \
+                          memcpy (bufptr, &along, sizeof (along) );  \
+                          bufptr += sizeof (along); } while (0)
+       ADD ( GetActiveWindow ());
+       ADD ( GetCapture ());
+       ADD ( GetClipboardOwner ());
+       ADD ( GetClipboardViewer ());
+       ADD ( GetCurrentProcess ());
+       ADD ( GetCurrentProcessId ());
+       ADD ( GetCurrentThread ());
+       ADD ( GetCurrentThreadId ());
+       ADD ( GetDesktopWindow ());
+       ADD ( GetFocus ());
+       ADD ( GetInputState ());
+       ADD ( GetMessagePos ());
+       ADD ( GetMessageTime ());
+       ADD ( GetOpenClipboardWindow ());
+       ADD ( GetProcessHeap ());
+       ADD ( GetProcessWindowStation ());
+       ADD ( GetQueueStatus (QS_ALLEVENTS));
+       ADD ( GetTickCount ());
+
+       assert ( bufptr-buffer < sizeof (buffer) );
+       (*add) ( buffer, bufptr-buffer, requester );
+#undef ADD
+    }
+
+    /* Get multiword system information: Current caret position, current
+     * mouse cursor position */
+    {  POINT point;
+       GetCaretPos (&point);
+       (*add) ( &point, sizeof (point), requester );
+       GetCursorPos (&point);
+       (*add) ( &point, sizeof (point), requester );
+    }
+
+    /* Get percent of memory in use, bytes of physical memory, bytes of free
+     * physical memory, bytes in paging file, free bytes in paging file, user
+     * bytes of address space, and free user bytes */
+    {  MEMORYSTATUS memoryStatus;
+       memoryStatus.dwLength = sizeof (MEMORYSTATUS);
+       GlobalMemoryStatus (&memoryStatus);
+       (*add) ( &memoryStatus, sizeof (memoryStatus), requester );
+    }
+
+    /* Get thread and process creation time, exit time, time in kernel mode,
+       and time in user mode in 100ns intervals */
+    {  HANDLE handle;
+       FILETIME creationTime, exitTime, kernelTime, userTime;
+       DWORD minimumWorkingSetSize, maximumWorkingSetSize;
+
+       handle = GetCurrentThread ();
+       GetThreadTimes (handle, &creationTime, &exitTime,
+                                              &kernelTime, &userTime);
+       (*add) ( &creationTime, sizeof (creationTime), requester );
+       (*add) ( &exitTime, sizeof (exitTime), requester );
+       (*add) ( &kernelTime, sizeof (kernelTime), requester );
+       (*add) ( &userTime, sizeof (userTime), requester );
+
+       handle = GetCurrentProcess ();
+       GetProcessTimes (handle, &creationTime, &exitTime,
+                                               &kernelTime, &userTime);
+       (*add) ( &creationTime, sizeof (creationTime), requester );
+       (*add) ( &exitTime, sizeof (exitTime), requester );
+       (*add) ( &kernelTime, sizeof (kernelTime), requester );
+       (*add) ( &userTime, sizeof (userTime), requester );
+
+       /* Get the minimum and maximum working set size for the
+           current process */
+       GetProcessWorkingSetSize (handle, &minimumWorkingSetSize,
+                                         &maximumWorkingSetSize);
+       (*add) ( &minimumWorkingSetSize,
+                                  sizeof (minimumWorkingSetSize), requester );
+       (*add) ( &maximumWorkingSetSize,
+                                  sizeof (maximumWorkingSetSize), requester );
+    }
+
+
+    /* The following are fixed for the lifetime of the process so we only
+     * add them once */
+    if (!addedFixedItems) {
+       STARTUPINFO startupInfo;
+
+       /* Get name of desktop, console window title, new window position and
+        * size, window flags, and handles for stdin, stdout, and stderr */
+       startupInfo.cb = sizeof (STARTUPINFO);
+       GetStartupInfo (&startupInfo);
+       (*add) ( &startupInfo, sizeof (STARTUPINFO), requester );
+       addedFixedItems = 1;
+    }
+
+    /* The performance of QPC varies depending on the architecture it's
+     * running on and on the OS.  Under NT it reads the CPU's 64-bit timestamp
+     * counter (at least on a Pentium and newer '486's, it hasn't been tested
+     * on anything without a TSC), under Win95 it reads the 1.193180 MHz PIC
+     * timer.  There are vague mumblings in the docs that it may fail if the
+     * appropriate hardware isn't available (possibly '386's or MIPS machines
+     * running NT), but who's going to run NT on a '386? */
+    {  LARGE_INTEGER performanceCount;
+       if (QueryPerformanceCounter (&performanceCount)) {
+           if ( debug_me )
+               log_debug ("rndw32#gather_random_fast: perf data\n");
+           (*add) (&performanceCount, sizeof (performanceCount), requester);
+       }
+       else { /* Millisecond accuracy at best... */
+           DWORD aword = GetTickCount ();
+           (*add) (&aword, sizeof (aword), requester );
+       }
+    }
+
+    return 0;
+}
diff --git a/cipher/rsa.c b/cipher/rsa.c
new file mode 100644 (file)
index 0000000..0b00e21
--- /dev/null
@@ -0,0 +1,487 @@
+/* rsa.c  -  RSA function
+ *     Copyright (C) 1997, 1998, 1999 by Werner Koch (dd9jn)
+ *     Copyright (C) 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* This code uses an algorithm protected by U.S. Patent #4,405,829
+   which expires on September 20, 2000.  The patent holder placed that
+   patent into the public domain on Sep 6th, 2000.
+*/
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "util.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "rsa.h"
+
+
+typedef struct {
+    MPI n;         /* modulus */
+    MPI e;         /* exponent */
+} RSA_public_key;
+
+
+typedef struct {
+    MPI n;         /* public modulus */
+    MPI e;         /* public exponent */
+    MPI d;         /* exponent */
+    MPI p;         /* prime  p. */
+    MPI q;         /* prime  q. */
+    MPI u;         /* inverse of p mod q. */
+} RSA_secret_key;
+
+
+static void test_keys( RSA_secret_key *sk, unsigned nbits );
+static void generate( RSA_secret_key *sk, unsigned nbits );
+static int  check_secret_key( RSA_secret_key *sk );
+static void public(MPI output, MPI input, RSA_public_key *skey );
+static void secret(MPI output, MPI input, RSA_secret_key *skey );
+
+
+static void
+test_keys( RSA_secret_key *sk, unsigned nbits )
+{
+    RSA_public_key pk;
+    MPI test = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    MPI out1 = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    MPI out2 = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+
+    pk.n = sk->n;
+    pk.e = sk->e;
+    {  char *p = get_random_bits( nbits, 0, 0 );
+       mpi_set_buffer( test, p, (nbits+7)/8, 0 );
+       xfree(p);
+    }
+
+    public( out1, test, &pk );
+    secret( out2, out1, sk );
+    if( mpi_cmp( test, out2 ) )
+       log_fatal("RSA operation: public, secret failed\n");
+    secret( out1, test, sk );
+    public( out2, out1, &pk );
+    if( mpi_cmp( test, out2 ) )
+       log_fatal("RSA operation: secret, public failed\n");
+    mpi_free( test );
+    mpi_free( out1 );
+    mpi_free( out2 );
+}
+
+/****************
+ * Generate a key pair with a key of size NBITS
+ * Returns: 2 structures filled with all needed values
+ */
+static void
+generate( RSA_secret_key *sk, unsigned nbits )
+{
+    MPI p, q; /* the two primes */
+    MPI d;    /* the private key */
+    MPI u;
+    MPI t1, t2;
+    MPI n;    /* the public key */
+    MPI e;    /* the exponent */
+    MPI phi;  /* helper: (p-1)(q-1) */
+    MPI g;
+    MPI f;
+
+    /* make sure that nbits is even so that we generate p, q of equal size */
+    if ( (nbits&1) )
+      nbits++; 
+
+    n = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+
+    p = q = NULL;
+    do {
+      /* select two (very secret) primes */
+      if (p)
+        mpi_free (p);
+      if (q)
+        mpi_free (q);
+      p = generate_secret_prime( nbits / 2 );
+      q = generate_secret_prime( nbits / 2 );
+      if( mpi_cmp( p, q ) > 0 ) /* p shall be smaller than q (for calc of u)*/
+        mpi_swap(p,q);
+      /* calculate the modulus */
+      mpi_mul( n, p, q );
+    } while ( mpi_get_nbits(n) != nbits );
+
+    /* calculate Euler totient: phi = (p-1)(q-1) */
+    t1 = mpi_alloc_secure( mpi_get_nlimbs(p) );
+    t2 = mpi_alloc_secure( mpi_get_nlimbs(p) );
+    phi = mpi_alloc_secure( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    g  = mpi_alloc_secure( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB  );
+    f  = mpi_alloc_secure( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB  );
+    mpi_sub_ui( t1, p, 1 );
+    mpi_sub_ui( t2, q, 1 );
+    mpi_mul( phi, t1, t2 );
+    mpi_gcd(g, t1, t2);
+    mpi_fdiv_q(f, phi, g);
+
+    /* Find an public exponent.
+       Benchmarking the RSA verify function with a 1024 bit key yields
+       (2001-11-08):
+         e=17    0.54 ms
+         e=41    0.75 ms
+         e=257   0.95 ms
+         e=65537 1.80 ms
+
+       This code used 41 until 2006-06-28 when it was changed to use
+       65537 as the new best practice.  See FIPS-186-3.
+     */
+    e = mpi_alloc( (32+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    mpi_set_ui( e, 65537); 
+    while( !mpi_gcd(t1, e, phi) ) /* (while gcd is not 1) */
+      mpi_add_ui( e, e, 2);
+
+    /* calculate the secret key d = e^1 mod phi */
+    d = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    mpi_invm(d, e, f );
+    /* calculate the inverse of p and q (used for chinese remainder theorem)*/
+    u = mpi_alloc( (nbits+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB );
+    mpi_invm(u, p, q );
+
+    if( DBG_CIPHER ) {
+        log_mpidump("  p= ", p );
+       log_mpidump("  q= ", q );
+       log_mpidump("phi= ", phi );
+       log_mpidump("  g= ", g );
+       log_mpidump("  f= ", f );
+       log_mpidump("  n= ", n );
+       log_mpidump("  e= ", e );
+       log_mpidump("  d= ", d );
+       log_mpidump("  u= ", u );
+    }
+
+    mpi_free(t1);
+    mpi_free(t2);
+    mpi_free(phi);
+    mpi_free(f);
+    mpi_free(g);
+
+    sk->n = n;
+    sk->e = e;
+    sk->p = p;
+    sk->q = q;
+    sk->d = d;
+    sk->u = u;
+
+    /* now we can test our keys (this should never fail!) */
+    test_keys( sk, nbits - 64 );
+}
+
+
+/****************
+ * Test wether the secret key is valid.
+ * Returns: true if this is a valid key.
+ */
+static int
+check_secret_key( RSA_secret_key *sk )
+{
+    int rc;
+    MPI temp = mpi_alloc( mpi_get_nlimbs(sk->p)*2 );
+
+    mpi_mul(temp, sk->p, sk->q );
+    rc = mpi_cmp( temp, sk->n );
+    mpi_free(temp);
+    return !rc;
+}
+
+
+
+/****************
+ * Public key operation. Encrypt INPUT with PKEY and put result into OUTPUT.
+ *
+ *     c = m^e mod n
+ *
+ * Where c is OUTPUT, m is INPUT and e,n are elements of PKEY.
+ */
+static void
+public(MPI output, MPI input, RSA_public_key *pkey )
+{
+    if( output == input ) { /* powm doesn't like output and input the same */
+       MPI x = mpi_alloc( mpi_get_nlimbs(input)*2 );
+       mpi_powm( x, input, pkey->e, pkey->n );
+       mpi_set(output, x);
+       mpi_free(x);
+    }
+    else
+       mpi_powm( output, input, pkey->e, pkey->n );
+}
+
+#if 0
+static void
+stronger_key_check ( RSA_secret_key *skey )
+{
+    MPI t = mpi_alloc_secure ( 0 );
+    MPI t1 = mpi_alloc_secure ( 0 );
+    MPI t2 = mpi_alloc_secure ( 0 );
+    MPI phi = mpi_alloc_secure ( 0 );
+
+    /* check that n == p * q */
+    mpi_mul( t, skey->p, skey->q);
+    if (mpi_cmp( t, skey->n) )
+        log_info ( "RSA Oops: n != p * q\n" );
+
+    /* check that p is less than q */
+    if( mpi_cmp( skey->p, skey->q ) > 0 )
+       log_info ("RSA Oops: p >= q\n");
+
+
+    /* check that e divides neither p-1 nor q-1 */
+    mpi_sub_ui(t, skey->p, 1 );
+    mpi_fdiv_r(t, t, skey->e );
+    if ( !mpi_cmp_ui( t, 0) )
+        log_info ( "RSA Oops: e divides p-1\n" );
+    mpi_sub_ui(t, skey->q, 1 );
+    mpi_fdiv_r(t, t, skey->e );
+    if ( !mpi_cmp_ui( t, 0) )
+        log_info ( "RSA Oops: e divides q-1\n" );
+
+    /* check that d is correct */
+    mpi_sub_ui( t1, skey->p, 1 );
+    mpi_sub_ui( t2, skey->q, 1 );
+    mpi_mul( phi, t1, t2 );
+    mpi_gcd(t, t1, t2);
+    mpi_fdiv_q(t, phi, t);
+    mpi_invm(t, skey->e, t );
+    if ( mpi_cmp(t, skey->d ) )
+        log_info ( "RSA Oops: d is wrong\n");
+
+    /* check for crrectness of u */
+    mpi_invm(t, skey->p, skey->q );
+    if ( mpi_cmp(t, skey->u ) )
+        log_info ( "RSA Oops: u is wrong\n");
+   
+    log_info ( "RSA secret key check finished\n");
+
+    mpi_free (t);
+    mpi_free (t1);
+    mpi_free (t2);
+    mpi_free (phi);
+}
+#endif
+
+
+/****************
+ * Secret key operation. Encrypt INPUT with SKEY and put result into OUTPUT.
+ *
+ *     m = c^d mod n
+ *
+ * Or faster:
+ *
+ *      m1 = c ^ (d mod (p-1)) mod p 
+ *      m2 = c ^ (d mod (q-1)) mod q 
+ *      h = u * (m2 - m1) mod q 
+ *      m = m1 + h * p
+ *
+ * Where m is OUTPUT, c is INPUT and d,n,p,q,u are elements of SKEY.
+ */
+static void
+secret(MPI output, MPI input, RSA_secret_key *skey )
+{
+#if 0
+    mpi_powm( output, input, skey->d, skey->n );
+#else
+    MPI m1   = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 );
+    MPI m2   = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 );
+    MPI h    = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 );
+
+    /* m1 = c ^ (d mod (p-1)) mod p */
+    mpi_sub_ui( h, skey->p, 1  );
+    mpi_fdiv_r( h, skey->d, h );   
+    mpi_powm( m1, input, h, skey->p );
+    /* m2 = c ^ (d mod (q-1)) mod q */
+    mpi_sub_ui( h, skey->q, 1  );
+    mpi_fdiv_r( h, skey->d, h );
+    mpi_powm( m2, input, h, skey->q );
+    /* h = u * ( m2 - m1 ) mod q */
+    mpi_sub( h, m2, m1 );
+    if ( mpi_is_neg( h ) ) 
+        mpi_add ( h, h, skey->q );
+    mpi_mulm( h, skey->u, h, skey->q ); 
+    /* m = m2 + h * p */
+    mpi_mul ( h, h, skey->p );
+    mpi_add ( output, m1, h );
+    /* ready */
+    
+    mpi_free ( h );
+    mpi_free ( m1 );
+    mpi_free ( m2 );
+#endif
+}
+
+
+/*********************************************
+ **************  interface  ******************
+ *********************************************/
+
+int
+rsa_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors )
+{
+    RSA_secret_key sk;
+
+    if( !is_RSA(algo) )
+       return G10ERR_PUBKEY_ALGO;
+
+    generate( &sk, nbits );
+    skey[0] = sk.n;
+    skey[1] = sk.e;
+    skey[2] = sk.d;
+    skey[3] = sk.p;
+    skey[4] = sk.q;
+    skey[5] = sk.u;
+    /* make an empty list of factors */
+    if (retfactors)
+      *retfactors = xmalloc_clear( 1 * sizeof **retfactors );
+    return 0;
+}
+
+
+int
+rsa_check_secret_key( int algo, MPI *skey )
+{
+    RSA_secret_key sk;
+
+    if( !is_RSA(algo) )
+       return G10ERR_PUBKEY_ALGO;
+
+    sk.n = skey[0];
+    sk.e = skey[1];
+    sk.d = skey[2];
+    sk.p = skey[3];
+    sk.q = skey[4];
+    sk.u = skey[5];
+    if( !check_secret_key( &sk ) )
+       return G10ERR_BAD_SECKEY;
+
+    return 0;
+}
+
+
+
+int
+rsa_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey )
+{
+    RSA_public_key pk;
+
+    if( algo != 1 && algo != 2 )
+       return G10ERR_PUBKEY_ALGO;
+
+    pk.n = pkey[0];
+    pk.e = pkey[1];
+    resarr[0] = mpi_alloc( mpi_get_nlimbs( pk.n ) );
+    public( resarr[0], data, &pk );
+    return 0;
+}
+
+int
+rsa_decrypt( int algo, MPI *result, MPI *data, MPI *skey )
+{
+    RSA_secret_key sk;
+
+    if( algo != 1 && algo != 2 )
+       return G10ERR_PUBKEY_ALGO;
+
+    sk.n = skey[0];
+    sk.e = skey[1];
+    sk.d = skey[2];
+    sk.p = skey[3];
+    sk.q = skey[4];
+    sk.u = skey[5];
+    *result = mpi_alloc_secure( mpi_get_nlimbs( sk.n ) );
+    secret( *result, data[0], &sk );
+    return 0;
+}
+
+int
+rsa_sign( int algo, MPI *resarr, MPI data, MPI *skey )
+{
+    RSA_secret_key sk;
+
+    if( algo != 1 && algo != 3 )
+       return G10ERR_PUBKEY_ALGO;
+
+    sk.n = skey[0];
+    sk.e = skey[1];
+    sk.d = skey[2];
+    sk.p = skey[3];
+    sk.q = skey[4];
+    sk.u = skey[5];
+    resarr[0] = mpi_alloc( mpi_get_nlimbs( sk.n ) );
+    secret( resarr[0], data, &sk );
+
+    return 0;
+}
+
+int
+rsa_verify( int algo, MPI hash, MPI *data, MPI *pkey )
+{
+    RSA_public_key pk;
+    MPI result;
+    int rc;
+
+    if( algo != 1 && algo != 3 )
+       return G10ERR_PUBKEY_ALGO;
+    pk.n = pkey[0];
+    pk.e = pkey[1];
+    result = mpi_alloc( (160+BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB);
+    public( result, data[0], &pk );
+    rc = mpi_cmp( result, hash )? G10ERR_BAD_SIGN:0;
+    mpi_free(result);
+
+    return rc;
+}
+
+
+unsigned int
+rsa_get_nbits( int algo, MPI *pkey )
+{
+    if( !is_RSA(algo) )
+       return 0;
+    return mpi_get_nbits( pkey[0] );
+}
+
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ * Usage: Bit 0 set : allows signing
+ *           1 set : allows encryption
+ */
+const char *
+rsa_get_info( int algo,
+             int *npkey, int *nskey, int *nenc, int *nsig, int *r_usage )
+{
+    *npkey = 2;
+    *nskey = 6;
+    *nenc = 1;
+    *nsig = 1;
+
+    switch( algo ) {
+      case 1: *r_usage = PUBKEY_USAGE_SIG | PUBKEY_USAGE_ENC; return "RSA";
+      case 2: *r_usage = PUBKEY_USAGE_ENC; return "RSA-E";
+      case 3: *r_usage = PUBKEY_USAGE_SIG; return "RSA-S";
+      default:*r_usage = 0; return NULL;
+    }
+}
diff --git a/cipher/rsa.h b/cipher/rsa.h
new file mode 100644 (file)
index 0000000..e6ea423
--- /dev/null
@@ -0,0 +1,36 @@
+/* rsa.h
+ *     Copyright (C) 1997,1998 by Werner Koch (dd9jn)
+ *     Copyright (C) 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_RSA_H
+#define G10_RSA_H
+
+int rsa_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors );
+int rsa_check_secret_key( int algo, MPI *skey );
+int rsa_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey );
+int rsa_decrypt( int algo, MPI *result, MPI *data, MPI *skey );
+int rsa_sign( int algo, MPI *resarr, MPI data, MPI *skey );
+int rsa_verify( int algo, MPI hash, MPI *data, MPI *pkey );
+unsigned rsa_get_nbits( int algo, MPI *pkey );
+const char *rsa_get_info( int algo, int *npkey, int *nskey,
+                                   int *nenc, int *nsig, int *use );
+
+#endif /*G10_RSA_H*/
diff --git a/cipher/sha1.c b/cipher/sha1.c
new file mode 100644 (file)
index 0000000..d150fad
--- /dev/null
@@ -0,0 +1,359 @@
+/* sha1.c - SHA1 hash function
+ *     Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ *
+ * Please see below for more legal information!
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*  Test vectors:
+ *
+ *  "abc"
+ *  A999 3E36 4706 816A BA3E  2571 7850 C26C 9CD0 D89D
+ *
+ *  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ *  8498 3E44 1C3B D26E BAAE  4AA1 F951 29E5 E546 70F1
+ */
+
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "algorithms.h"
+#include "bithelp.h"
+
+
+typedef struct {
+    u32  h0,h1,h2,h3,h4;
+    u32  nblocks;
+    byte buf[64];
+    int  count;
+} SHA1_CONTEXT;
+
+static void
+burn_stack (int bytes)
+{
+    char buf[128];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+void
+sha1_init( SHA1_CONTEXT *hd )
+{
+    hd->h0 = 0x67452301;
+    hd->h1 = 0xefcdab89;
+    hd->h2 = 0x98badcfe;
+    hd->h3 = 0x10325476;
+    hd->h4 = 0xc3d2e1f0;
+    hd->nblocks = 0;
+    hd->count = 0;
+}
+
+
+/****************
+ * Transform the message X which consists of 16 32-bit-words
+ */
+static void
+transform( SHA1_CONTEXT *hd, byte *data )
+{
+    u32 a,b,c,d,e,tm;
+    u32 x[16];
+
+    /* get values from the chaining vars */
+    a = hd->h0;
+    b = hd->h1;
+    c = hd->h2;
+    d = hd->h3;
+    e = hd->h4;
+
+#ifdef BIG_ENDIAN_HOST
+    memcpy( x, data, 64 );
+#else
+    { int i;
+      byte *p2;
+      for(i=0, p2=(byte*)x; i < 16; i++, p2 += 4 ) {
+       p2[3] = *data++;
+       p2[2] = *data++;
+       p2[1] = *data++;
+       p2[0] = *data++;
+      }
+    }
+#endif
+
+
+#define K1  0x5A827999L
+#define K2  0x6ED9EBA1L
+#define K3  0x8F1BBCDCL
+#define K4  0xCA62C1D6L
+#define F1(x,y,z)   ( z ^ ( x & ( y ^ z ) ) )
+#define F2(x,y,z)   ( x ^ y ^ z )
+#define F3(x,y,z)   ( ( x & y ) | ( z & ( x | y ) ) )
+#define F4(x,y,z)   ( x ^ y ^ z )
+
+
+#define M(i) ( tm =   x[i&0x0f] ^ x[(i-14)&0x0f] \
+                   ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f] \
+              , (x[i&0x0f] = rol(tm,1)) )
+
+#define R(a,b,c,d,e,f,k,m)  do { e += rol( a, 5 )     \
+                                     + f( b, c, d )  \
+                                     + k             \
+                                     + m;            \
+                                b = rol( b, 30 );    \
+                              } while(0)
+    R( a, b, c, d, e, F1, K1, x[ 0] );
+    R( e, a, b, c, d, F1, K1, x[ 1] );
+    R( d, e, a, b, c, F1, K1, x[ 2] );
+    R( c, d, e, a, b, F1, K1, x[ 3] );
+    R( b, c, d, e, a, F1, K1, x[ 4] );
+    R( a, b, c, d, e, F1, K1, x[ 5] );
+    R( e, a, b, c, d, F1, K1, x[ 6] );
+    R( d, e, a, b, c, F1, K1, x[ 7] );
+    R( c, d, e, a, b, F1, K1, x[ 8] );
+    R( b, c, d, e, a, F1, K1, x[ 9] );
+    R( a, b, c, d, e, F1, K1, x[10] );
+    R( e, a, b, c, d, F1, K1, x[11] );
+    R( d, e, a, b, c, F1, K1, x[12] );
+    R( c, d, e, a, b, F1, K1, x[13] );
+    R( b, c, d, e, a, F1, K1, x[14] );
+    R( a, b, c, d, e, F1, K1, x[15] );
+    R( e, a, b, c, d, F1, K1, M(16) );
+    R( d, e, a, b, c, F1, K1, M(17) );
+    R( c, d, e, a, b, F1, K1, M(18) );
+    R( b, c, d, e, a, F1, K1, M(19) );
+    R( a, b, c, d, e, F2, K2, M(20) );
+    R( e, a, b, c, d, F2, K2, M(21) );
+    R( d, e, a, b, c, F2, K2, M(22) );
+    R( c, d, e, a, b, F2, K2, M(23) );
+    R( b, c, d, e, a, F2, K2, M(24) );
+    R( a, b, c, d, e, F2, K2, M(25) );
+    R( e, a, b, c, d, F2, K2, M(26) );
+    R( d, e, a, b, c, F2, K2, M(27) );
+    R( c, d, e, a, b, F2, K2, M(28) );
+    R( b, c, d, e, a, F2, K2, M(29) );
+    R( a, b, c, d, e, F2, K2, M(30) );
+    R( e, a, b, c, d, F2, K2, M(31) );
+    R( d, e, a, b, c, F2, K2, M(32) );
+    R( c, d, e, a, b, F2, K2, M(33) );
+    R( b, c, d, e, a, F2, K2, M(34) );
+    R( a, b, c, d, e, F2, K2, M(35) );
+    R( e, a, b, c, d, F2, K2, M(36) );
+    R( d, e, a, b, c, F2, K2, M(37) );
+    R( c, d, e, a, b, F2, K2, M(38) );
+    R( b, c, d, e, a, F2, K2, M(39) );
+    R( a, b, c, d, e, F3, K3, M(40) );
+    R( e, a, b, c, d, F3, K3, M(41) );
+    R( d, e, a, b, c, F3, K3, M(42) );
+    R( c, d, e, a, b, F3, K3, M(43) );
+    R( b, c, d, e, a, F3, K3, M(44) );
+    R( a, b, c, d, e, F3, K3, M(45) );
+    R( e, a, b, c, d, F3, K3, M(46) );
+    R( d, e, a, b, c, F3, K3, M(47) );
+    R( c, d, e, a, b, F3, K3, M(48) );
+    R( b, c, d, e, a, F3, K3, M(49) );
+    R( a, b, c, d, e, F3, K3, M(50) );
+    R( e, a, b, c, d, F3, K3, M(51) );
+    R( d, e, a, b, c, F3, K3, M(52) );
+    R( c, d, e, a, b, F3, K3, M(53) );
+    R( b, c, d, e, a, F3, K3, M(54) );
+    R( a, b, c, d, e, F3, K3, M(55) );
+    R( e, a, b, c, d, F3, K3, M(56) );
+    R( d, e, a, b, c, F3, K3, M(57) );
+    R( c, d, e, a, b, F3, K3, M(58) );
+    R( b, c, d, e, a, F3, K3, M(59) );
+    R( a, b, c, d, e, F4, K4, M(60) );
+    R( e, a, b, c, d, F4, K4, M(61) );
+    R( d, e, a, b, c, F4, K4, M(62) );
+    R( c, d, e, a, b, F4, K4, M(63) );
+    R( b, c, d, e, a, F4, K4, M(64) );
+    R( a, b, c, d, e, F4, K4, M(65) );
+    R( e, a, b, c, d, F4, K4, M(66) );
+    R( d, e, a, b, c, F4, K4, M(67) );
+    R( c, d, e, a, b, F4, K4, M(68) );
+    R( b, c, d, e, a, F4, K4, M(69) );
+    R( a, b, c, d, e, F4, K4, M(70) );
+    R( e, a, b, c, d, F4, K4, M(71) );
+    R( d, e, a, b, c, F4, K4, M(72) );
+    R( c, d, e, a, b, F4, K4, M(73) );
+    R( b, c, d, e, a, F4, K4, M(74) );
+    R( a, b, c, d, e, F4, K4, M(75) );
+    R( e, a, b, c, d, F4, K4, M(76) );
+    R( d, e, a, b, c, F4, K4, M(77) );
+    R( c, d, e, a, b, F4, K4, M(78) );
+    R( b, c, d, e, a, F4, K4, M(79) );
+
+    /* update chainig vars */
+    hd->h0 += a;
+    hd->h1 += b;
+    hd->h2 += c;
+    hd->h3 += d;
+    hd->h4 += e;
+}
+
+
+/* Update the message digest with the contents
+ * of INBUF with length INLEN.
+ */
+static void
+sha1_write( SHA1_CONTEXT *hd, byte *inbuf, size_t inlen)
+{
+    if( hd->count == 64 ) { /* flush the buffer */
+       transform( hd, hd->buf );
+        burn_stack (88+4*sizeof(void*));
+       hd->count = 0;
+       hd->nblocks++;
+    }
+    if( !inbuf )
+       return;
+    if( hd->count ) {
+       for( ; inlen && hd->count < 64; inlen-- )
+           hd->buf[hd->count++] = *inbuf++;
+       sha1_write( hd, NULL, 0 );
+       if( !inlen )
+           return;
+    }
+
+    while( inlen >= 64 ) {
+       transform( hd, inbuf );
+       hd->count = 0;
+       hd->nblocks++;
+       inlen -= 64;
+       inbuf += 64;
+    }
+    burn_stack (88+4*sizeof(void*));
+    for( ; inlen && hd->count < 64; inlen-- )
+       hd->buf[hd->count++] = *inbuf++;
+}
+
+
+/* The routine final terminates the computation and
+ * returns the digest.
+ * The handle is prepared for a new cycle, but adding bytes to the
+ * handle will the destroy the returned buffer.
+ * Returns: 20 bytes representing the digest.
+ */
+
+static void
+sha1_final(SHA1_CONTEXT *hd)
+{
+    u32 t, msb, lsb;
+    byte *p;
+
+    sha1_write(hd, NULL, 0); /* flush */;
+
+    t = hd->nblocks;
+    /* multiply by 64 to make a byte count */
+    lsb = t << 6;
+    msb = t >> 26;
+    /* add the count */
+    t = lsb;
+    if( (lsb += hd->count) < t )
+       msb++;
+    /* multiply by 8 to make a bit count */
+    t = lsb;
+    lsb <<= 3;
+    msb <<= 3;
+    msb |= t >> 29;
+
+    if( hd->count < 56 ) { /* enough room */
+       hd->buf[hd->count++] = 0x80; /* pad */
+       while( hd->count < 56 )
+           hd->buf[hd->count++] = 0;  /* pad */
+    }
+    else { /* need one extra block */
+       hd->buf[hd->count++] = 0x80; /* pad character */
+       while( hd->count < 64 )
+           hd->buf[hd->count++] = 0;
+       sha1_write(hd, NULL, 0);  /* flush */;
+       memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
+    }
+    /* append the 64 bit count */
+    hd->buf[56] = msb >> 24;
+    hd->buf[57] = msb >> 16;
+    hd->buf[58] = msb >>  8;
+    hd->buf[59] = msb     ;
+    hd->buf[60] = lsb >> 24;
+    hd->buf[61] = lsb >> 16;
+    hd->buf[62] = lsb >>  8;
+    hd->buf[63] = lsb     ;
+    transform( hd, hd->buf );
+    burn_stack (88+4*sizeof(void*));
+
+    p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
+#else /* little endian */
+#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;         \
+                     *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
+#endif
+    X(0);
+    X(1);
+    X(2);
+    X(3);
+    X(4);
+#undef X
+}
+
+static byte *
+sha1_read( SHA1_CONTEXT *hd )
+{
+    return hd->buf;
+}
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+sha1_get_info( int algo, size_t *contextsize,
+              byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+              void (**r_init)( void *c ),
+              void (**r_write)( void *c, byte *buf, size_t nbytes ),
+              void (**r_final)( void *c ),
+              byte *(**r_read)( void *c )
+            )
+{
+    static byte asn[15] = /* Object ID is 1.3.14.3.2.26 */
+                   { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
+                     0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 };
+    if( algo != 2 )
+       return NULL;
+
+    *contextsize = sizeof(SHA1_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 20;
+    *(void  (**)(SHA1_CONTEXT *))r_init                = sha1_init;
+    *(void  (**)(SHA1_CONTEXT *, byte*, size_t))r_write = sha1_write;
+    *(void  (**)(SHA1_CONTEXT *))r_final               = sha1_final;
+    *(byte *(**)(SHA1_CONTEXT *))r_read                = sha1_read;
+
+    return "SHA1";
+}
diff --git a/cipher/sha256.c b/cipher/sha256.c
new file mode 100644 (file)
index 0000000..2403073
--- /dev/null
@@ -0,0 +1,379 @@
+/* sha256.c - SHA224 and SHA256 hash functions
+ * Copyright (C) 2003, 2006 Free Software Foundation, Inc.
+ *
+ * Please see below for more legal information!
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*  Test vectors from FIPS-180-2:
+ *
+ *  "abc"
+ * 224:
+ *  23097D22 3405D822 8642A477 BDA255B3 2AADBCE4 BDA0B3F7 E36C9DA7
+ * 256:
+ *  BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD
+ *
+ *  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+ * 224:
+ *  75388B16 512776CC 5DBA5DA1 FD890150 B0C6455C B4F58B19 52522525
+ * 256:
+ *  248D6A61 D20638B8 E5C02693 0C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1
+ *
+ *  "a" x 1000000
+ * 224:
+ *  20794655 980C91D8 BBB4C1EA 97618A4B F03F4258 1948B2EE 4EE7AD67
+ * 256:
+ *  CDC76E5C 9914FB92 81A1C7E2 84D73E67 F1809A48 A497200E 046D39CC C7112CD0
+ */
+
+
+#include <config.h>
+#include <string.h>
+#include "util.h"
+#include "algorithms.h"
+
+
+typedef struct {
+    u32  h0,h1,h2,h3,h4,h5,h6,h7;
+    u32  nblocks;
+    byte buf[64];
+    int  count;
+} SHA256_CONTEXT;
+
+static void
+burn_stack (int bytes)
+{
+    char buf[128];
+
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+void
+sha256_init( SHA256_CONTEXT *hd )
+{
+    hd->h0 = 0x6a09e667;
+    hd->h1 = 0xbb67ae85;
+    hd->h2 = 0x3c6ef372;
+    hd->h3 = 0xa54ff53a;
+    hd->h4 = 0x510e527f;
+    hd->h5 = 0x9b05688c;
+    hd->h6 = 0x1f83d9ab;
+    hd->h7 = 0x5be0cd19;
+
+    hd->nblocks = 0;
+    hd->count = 0;
+}
+
+void
+sha224_init( SHA256_CONTEXT *hd )
+{
+    hd->h0 = 0xc1059ed8;
+    hd->h1 = 0x367cd507;
+    hd->h2 = 0x3070dd17;
+    hd->h3 = 0xf70e5939;
+    hd->h4 = 0xffc00b31;
+    hd->h5 = 0x68581511;
+    hd->h6 = 0x64f98fa7;
+    hd->h7 = 0xbefa4fa4;
+
+    hd->nblocks = 0;
+    hd->count = 0;
+}
+
+
+/****************
+ * Transform the message w which consists of 16 32-bit words
+ */
+static void
+transform( SHA256_CONTEXT *hd, byte *data )
+{
+  u32 a,b,c,d,e,f,g,h;
+  u32 w[64];
+  int t;
+  static const u32 k[]=
+    {
+      0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
+      0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+      0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
+      0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+      0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
+      0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+      0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
+      0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+      0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
+      0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+      0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+    };
+
+  /* get values from the chaining vars */
+  a = hd->h0;
+  b = hd->h1;
+  c = hd->h2;
+  d = hd->h3;
+  e = hd->h4;
+  f = hd->h5;
+  g = hd->h6;
+  h = hd->h7;
+
+#ifdef BIG_ENDIAN_HOST
+  memcpy( w, data, 64 );
+#else
+  {
+    int i;
+    byte *p2;
+
+    for(i=0, p2=(byte*)w; i < 16; i++, p2 += 4 )
+      {
+       p2[3] = *data++;
+       p2[2] = *data++;
+       p2[1] = *data++;
+       p2[0] = *data++;
+      }
+  }
+#endif
+
+#define ROTR(x,n) (((x)>>(n)) | ((x)<<(32-(n))))
+#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+#define Sum0(x) (ROTR((x),2) ^ ROTR((x),13) ^ ROTR((x),22))
+#define Sum1(x) (ROTR((x),6) ^ ROTR((x),11) ^ ROTR((x),25))
+#define S0(x) (ROTR((x),7) ^ ROTR((x),18) ^ ((x)>>3))
+#define S1(x) (ROTR((x),17) ^ ROTR((x),19) ^ ((x)>>10))
+
+  for(t=16;t<64;t++)
+    w[t] = S1(w[t-2]) + w[t-7] + S0(w[t-15]) + w[t-16];
+
+  for(t=0;t<64;t++)
+    {
+      u32 t1,t2;
+
+      t1=h+Sum1(e)+Ch(e,f,g)+k[t]+w[t];
+      t2=Sum0(a)+Maj(a,b,c);
+      h=g;
+      g=f;
+      f=e;
+      e=d+t1;
+      d=c;
+      c=b;
+      b=a;
+      a=t1+t2;
+      /* printf("t=%d a=%08lX b=%08lX c=%08lX d=%08lX e=%08lX f=%08lX g=%08lX h=%08lX\n",t,a,b,c,d,e,f,g,h); */
+    }
+
+  /* update chaining vars */
+  hd->h0 += a;
+  hd->h1 += b;
+  hd->h2 += c;
+  hd->h3 += d;
+  hd->h4 += e;
+  hd->h5 += f;
+  hd->h6 += g;
+  hd->h7 += h;
+}
+
+
+/* Update the message digest with the contents
+ * of INBUF with length INLEN.
+ */
+static void
+sha256_write( SHA256_CONTEXT *hd, byte *inbuf, size_t inlen)
+{
+    if( hd->count == 64 ) { /* flush the buffer */
+       transform( hd, hd->buf );
+        burn_stack (328);
+       hd->count = 0;
+       hd->nblocks++;
+    }
+    if( !inbuf )
+       return;
+    if( hd->count ) {
+       for( ; inlen && hd->count < 64; inlen-- )
+           hd->buf[hd->count++] = *inbuf++;
+       sha256_write( hd, NULL, 0 );
+       if( !inlen )
+           return;
+    }
+
+    while( inlen >= 64 ) {
+       transform( hd, inbuf );
+       hd->count = 0;
+       hd->nblocks++;
+       inlen -= 64;
+       inbuf += 64;
+    }
+    burn_stack (328);
+    for( ; inlen && hd->count < 64; inlen-- )
+       hd->buf[hd->count++] = *inbuf++;
+}
+
+
+/* The routine final terminates the computation and
+ * returns the digest.
+ * The handle is prepared for a new cycle, but adding bytes to the
+ * handle will the destroy the returned buffer.
+ * Returns: 32 bytes representing the digest.  When used for sha224,
+ * we take the leftmost 28 of those bytes.
+ */
+
+static void
+sha256_final(SHA256_CONTEXT *hd)
+{
+    u32 t, msb, lsb;
+    byte *p;
+
+    sha256_write(hd, NULL, 0); /* flush */;
+
+    t = hd->nblocks;
+    /* multiply by 64 to make a byte count */
+    lsb = t << 6;
+    msb = t >> 26;
+    /* add the count */
+    t = lsb;
+    if( (lsb += hd->count) < t )
+       msb++;
+    /* multiply by 8 to make a bit count */
+    t = lsb;
+    lsb <<= 3;
+    msb <<= 3;
+    msb |= t >> 29;
+
+    if( hd->count < 56 ) { /* enough room */
+       hd->buf[hd->count++] = 0x80; /* pad */
+       while( hd->count < 56 )
+           hd->buf[hd->count++] = 0;  /* pad */
+    }
+    else { /* need one extra block */
+       hd->buf[hd->count++] = 0x80; /* pad character */
+       while( hd->count < 64 )
+           hd->buf[hd->count++] = 0;
+       sha256_write(hd, NULL, 0);  /* flush */;
+       memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
+    }
+    /* append the 64 bit count */
+    hd->buf[56] = msb >> 24;
+    hd->buf[57] = msb >> 16;
+    hd->buf[58] = msb >>  8;
+    hd->buf[59] = msb     ;
+    hd->buf[60] = lsb >> 24;
+    hd->buf[61] = lsb >> 16;
+    hd->buf[62] = lsb >>  8;
+    hd->buf[63] = lsb     ;
+    transform( hd, hd->buf );
+    burn_stack (328);
+
+    p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
+#else /* little endian */
+#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;         \
+                     *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
+#endif
+    X(0);
+    X(1);
+    X(2);
+    X(3);
+    X(4);
+    X(5);
+    X(6);
+    /* Note that this last chunk is included even for SHA224.  We just
+       ignore it. */
+    X(7);
+#undef X
+}
+
+static byte *
+sha256_read( SHA256_CONTEXT *hd )
+{
+    return hd->buf;
+}
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+sha256_get_info( int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                )
+{
+    static byte asn[] = /* Object ID is 2.16.840.1.101.3.4.2.1 */
+      { 
+       0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+       0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
+       0x00, 0x04, 0x20
+      };
+
+    if( algo != 8 )
+       return NULL;
+
+    *contextsize = sizeof(SHA256_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 32;
+    *(void  (**)(SHA256_CONTEXT *))r_init                = sha256_init;
+    *(void  (**)(SHA256_CONTEXT *, byte*, size_t))r_write = sha256_write;
+    *(void  (**)(SHA256_CONTEXT *))r_final               = sha256_final;
+    *(byte *(**)(SHA256_CONTEXT *))r_read                = sha256_read;
+
+    return "SHA256";
+}
+
+/* SHA224 is really a truncated SHA256 with a different
+   initialization */
+const char *
+sha224_get_info( int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                )
+{
+    static byte asn[] = /* Object ID is 2.16.840.1.101.3.4.2.4 */
+      { 
+       0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+       0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05,
+       0x00, 0x04, 0x20
+      };
+
+    if( algo != 11 )
+       return NULL;
+
+    *contextsize = sizeof(SHA256_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 28;
+    *(void  (**)(SHA256_CONTEXT *))r_init                = sha224_init;
+    *(void  (**)(SHA256_CONTEXT *, byte*, size_t))r_write = sha256_write;
+    *(void  (**)(SHA256_CONTEXT *))r_final               = sha256_final;
+    *(byte *(**)(SHA256_CONTEXT *))r_read                = sha256_read;
+
+    return "SHA224";
+}
diff --git a/cipher/sha512.c b/cipher/sha512.c
new file mode 100644 (file)
index 0000000..523579d
--- /dev/null
@@ -0,0 +1,430 @@
+/* sha512.c - SHA384 and SHA512 hash functions
+ *     Copyright (C) 2003 Free Software Foundation, Inc.
+ *
+ * Please see below for more legal information!
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*  Test vectors from FIPS-180-2:
+ *
+ *  "abc"
+ * 384:
+ *  CB00753F 45A35E8B B5A03D69 9AC65007 272C32AB 0EDED163
+ *  1A8B605A 43FF5BED 8086072B A1E7CC23 58BAECA1 34C825A7
+ * 512:
+ *  DDAF35A1 93617ABA CC417349 AE204131 12E6FA4E 89A97EA2 0A9EEEE6 4B55D39A
+ *  2192992A 274FC1A8 36BA3C23 A3FEEBBD 454D4423 643CE80E 2A9AC94F A54CA49F
+ *
+ *  "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
+ * 384:
+ *  09330C33 F71147E8 3D192FC7 82CD1B47 53111B17 3B3B05D2
+ *  2FA08086 E3B0F712 FCC7C71A 557E2DB9 66C3E9FA 91746039
+ * 512:
+ *  8E959B75 DAE313DA 8CF4F728 14FC143F 8F7779C6 EB9F7FA1 7299AEAD B6889018
+ *  501D289E 4900F7E4 331B99DE C4B5433A C7D329EE B6DD2654 5E96E55B 874BE909
+ *
+ *  "a" x 1000000
+ * 384:
+ *  9D0E1809 716474CB 086E834E 310A4A1C ED149E9C 00F24852
+ *  7972CEC5 704C2A5B 07B8B3DC 38ECC4EB AE97DDD8 7F3D8985
+ * 512:
+ *  E718483D 0CE76964 4E2E42C7 BC15B463 8E1F98B1 3B204428 5632A803 AFA973EB
+ *  DE0FF244 877EA60A 4CB0432C E577C31B EB009C5C 2C49AA2E 4EADB217 AD8CC09B
+ */
+
+
+#include <config.h>
+#include <string.h>
+#include "util.h"
+#include "algorithms.h"
+
+
+typedef struct {
+    u64  h0,h1,h2,h3,h4,h5,h6,h7;
+    u64  nblocks;
+    byte buf[128];
+    int  count;
+} SHA512_CONTEXT;
+
+static void
+burn_stack (int bytes)
+{
+  char buf[128];
+
+  wipememory(buf,sizeof buf);
+  bytes -= sizeof buf;
+  if (bytes > 0)
+    burn_stack (bytes);
+}
+
+
+void
+sha512_init( SHA512_CONTEXT *hd )
+{
+  hd->h0 = U64_C(0x6a09e667f3bcc908);
+  hd->h1 = U64_C(0xbb67ae8584caa73b);
+  hd->h2 = U64_C(0x3c6ef372fe94f82b);
+  hd->h3 = U64_C(0xa54ff53a5f1d36f1);
+  hd->h4 = U64_C(0x510e527fade682d1);
+  hd->h5 = U64_C(0x9b05688c2b3e6c1f);
+  hd->h6 = U64_C(0x1f83d9abfb41bd6b);
+  hd->h7 = U64_C(0x5be0cd19137e2179);
+
+  hd->nblocks = 0;
+  hd->count = 0;
+}
+
+void
+sha384_init( SHA512_CONTEXT *hd )
+{
+  hd->h0 = U64_C(0xcbbb9d5dc1059ed8);
+  hd->h1 = U64_C(0x629a292a367cd507);
+  hd->h2 = U64_C(0x9159015a3070dd17);
+  hd->h3 = U64_C(0x152fecd8f70e5939);
+  hd->h4 = U64_C(0x67332667ffc00b31);
+  hd->h5 = U64_C(0x8eb44a8768581511);
+  hd->h6 = U64_C(0xdb0c2e0d64f98fa7);
+  hd->h7 = U64_C(0x47b5481dbefa4fa4);
+
+  hd->nblocks = 0;
+  hd->count = 0;
+}
+
+
+/****************
+ * Transform the message W which consists of 16 64-bit-words
+ */
+static void
+transform( SHA512_CONTEXT *hd, byte *data )
+{
+  u64 a,b,c,d,e,f,g,h;
+  u64 w[80];
+  int t;
+  static const u64 k[]=
+    {
+      U64_C(0x428a2f98d728ae22), U64_C(0x7137449123ef65cd),
+      U64_C(0xb5c0fbcfec4d3b2f), U64_C(0xe9b5dba58189dbbc),
+      U64_C(0x3956c25bf348b538), U64_C(0x59f111f1b605d019),
+      U64_C(0x923f82a4af194f9b), U64_C(0xab1c5ed5da6d8118),
+      U64_C(0xd807aa98a3030242), U64_C(0x12835b0145706fbe),
+      U64_C(0x243185be4ee4b28c), U64_C(0x550c7dc3d5ffb4e2),
+      U64_C(0x72be5d74f27b896f), U64_C(0x80deb1fe3b1696b1),
+      U64_C(0x9bdc06a725c71235), U64_C(0xc19bf174cf692694),
+      U64_C(0xe49b69c19ef14ad2), U64_C(0xefbe4786384f25e3),
+      U64_C(0x0fc19dc68b8cd5b5), U64_C(0x240ca1cc77ac9c65),
+      U64_C(0x2de92c6f592b0275), U64_C(0x4a7484aa6ea6e483),
+      U64_C(0x5cb0a9dcbd41fbd4), U64_C(0x76f988da831153b5),
+      U64_C(0x983e5152ee66dfab), U64_C(0xa831c66d2db43210),
+      U64_C(0xb00327c898fb213f), U64_C(0xbf597fc7beef0ee4),
+      U64_C(0xc6e00bf33da88fc2), U64_C(0xd5a79147930aa725),
+      U64_C(0x06ca6351e003826f), U64_C(0x142929670a0e6e70),
+      U64_C(0x27b70a8546d22ffc), U64_C(0x2e1b21385c26c926),
+      U64_C(0x4d2c6dfc5ac42aed), U64_C(0x53380d139d95b3df),
+      U64_C(0x650a73548baf63de), U64_C(0x766a0abb3c77b2a8),
+      U64_C(0x81c2c92e47edaee6), U64_C(0x92722c851482353b),
+      U64_C(0xa2bfe8a14cf10364), U64_C(0xa81a664bbc423001),
+      U64_C(0xc24b8b70d0f89791), U64_C(0xc76c51a30654be30),
+      U64_C(0xd192e819d6ef5218), U64_C(0xd69906245565a910),
+      U64_C(0xf40e35855771202a), U64_C(0x106aa07032bbd1b8),
+      U64_C(0x19a4c116b8d2d0c8), U64_C(0x1e376c085141ab53),
+      U64_C(0x2748774cdf8eeb99), U64_C(0x34b0bcb5e19b48a8),
+      U64_C(0x391c0cb3c5c95a63), U64_C(0x4ed8aa4ae3418acb),
+      U64_C(0x5b9cca4f7763e373), U64_C(0x682e6ff3d6b2b8a3),
+      U64_C(0x748f82ee5defb2fc), U64_C(0x78a5636f43172f60),
+      U64_C(0x84c87814a1f0ab72), U64_C(0x8cc702081a6439ec),
+      U64_C(0x90befffa23631e28), U64_C(0xa4506cebde82bde9),
+      U64_C(0xbef9a3f7b2c67915), U64_C(0xc67178f2e372532b),
+      U64_C(0xca273eceea26619c), U64_C(0xd186b8c721c0c207),
+      U64_C(0xeada7dd6cde0eb1e), U64_C(0xf57d4f7fee6ed178),
+      U64_C(0x06f067aa72176fba), U64_C(0x0a637dc5a2c898a6),
+      U64_C(0x113f9804bef90dae), U64_C(0x1b710b35131c471b),
+      U64_C(0x28db77f523047d84), U64_C(0x32caab7b40c72493),
+      U64_C(0x3c9ebe0a15c9bebc), U64_C(0x431d67c49c100d4c),
+      U64_C(0x4cc5d4becb3e42b6), U64_C(0x597f299cfc657e2a),
+      U64_C(0x5fcb6fab3ad6faec), U64_C(0x6c44198c4a475817)
+    };
+
+  /* get values from the chaining vars */
+  a = hd->h0;
+  b = hd->h1;
+  c = hd->h2;
+  d = hd->h3;
+  e = hd->h4;
+  f = hd->h5;
+  g = hd->h6;
+  h = hd->h7;
+
+#ifdef BIG_ENDIAN_HOST
+  memcpy( w, data, 128 );
+#else
+  {
+    int i;
+    byte *p2;
+
+    for(i=0, p2=(byte*)w; i < 16; i++, p2 += 8 )
+      {
+       p2[7] = *data++;
+       p2[6] = *data++;
+       p2[5] = *data++;
+       p2[4] = *data++;
+       p2[3] = *data++;
+       p2[2] = *data++;
+       p2[1] = *data++;
+       p2[0] = *data++;
+      }
+  }
+#endif
+
+#define ROTR(x,n) (((x)>>(n)) | ((x)<<(64-(n))))
+#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+#define Sum0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
+#define Sum1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
+#define S0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7))
+#define S1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
+
+  for(t=16;t<80;t++)
+    w[t] = S1(w[t-2]) + w[t-7] + S0(w[t-15]) + w[t-16];
+
+  for(t=0;t<80;t++)
+    {
+      u64 t1,t2;
+
+      t1=h+Sum1(e)+Ch(e,f,g)+k[t]+w[t];
+      t2=Sum0(a)+Maj(a,b,c);
+      h=g;
+      g=f;
+      f=e;
+      e=d+t1;
+      d=c;
+      c=b;
+      b=a;
+      a=t1+t2;
+
+      /* printf("t=%d a=%016llX b=%016llX c=%016llX d=%016llX e=%016llX f=%016llX g=%016llX h=%016llX\n",t,a,b,c,d,e,f,g,h); */
+    }
+
+  /* update chaining vars */
+  hd->h0 += a;
+  hd->h1 += b;
+  hd->h2 += c;
+  hd->h3 += d;
+  hd->h4 += e;
+  hd->h5 += f;
+  hd->h6 += g;
+  hd->h7 += h;
+}
+
+
+/* Update the message digest with the contents
+ * of INBUF with length INLEN.
+ */
+static void
+sha512_write( SHA512_CONTEXT *hd, byte *inbuf, size_t inlen)
+{
+    if( hd->count == 128 ) { /* flush the buffer */
+       transform( hd, hd->buf );
+        burn_stack (768);
+       hd->count = 0;
+       hd->nblocks++;
+    }
+    if( !inbuf )
+       return;
+    if( hd->count ) {
+       for( ; inlen && hd->count < 128; inlen-- )
+           hd->buf[hd->count++] = *inbuf++;
+       sha512_write( hd, NULL, 0 );
+       if( !inlen )
+           return;
+    }
+
+    while( inlen >= 128 ) {
+       transform( hd, inbuf );
+       hd->count = 0;
+       hd->nblocks++;
+       inlen -= 128;
+       inbuf += 128;
+    }
+    burn_stack (768);
+    for( ; inlen && hd->count < 128; inlen-- )
+       hd->buf[hd->count++] = *inbuf++;
+}
+
+
+/* The routine final terminates the computation and
+ * returns the digest.
+ * The handle is prepared for a new cycle, but adding bytes to the
+ * handle will the destroy the returned buffer.
+ * Returns: 64 bytes representing the digest.  When used for sha384,
+ * we take the leftmost 48 of those bytes.
+ */
+
+static void
+sha512_final(SHA512_CONTEXT *hd)
+{
+    u64 t, msb, lsb;
+    byte *p;
+
+    sha512_write(hd, NULL, 0); /* flush */;
+
+    t = hd->nblocks;
+    /* multiply by 128 to make a byte count */
+    lsb = t << 7;
+    msb = t >> 57;
+    /* add the count */
+    t = lsb;
+    if( (lsb += hd->count) < t )
+       msb++;
+    /* multiply by 8 to make a bit count */
+    t = lsb;
+    lsb <<= 3;
+    msb <<= 3;
+    msb |= t >> 61;
+
+    if( hd->count < 112 ) { /* enough room */
+       hd->buf[hd->count++] = 0x80; /* pad */
+       while( hd->count < 112 )
+           hd->buf[hd->count++] = 0;  /* pad */
+    }
+    else { /* need one extra block */
+       hd->buf[hd->count++] = 0x80; /* pad character */
+       while( hd->count < 128 )
+           hd->buf[hd->count++] = 0;
+       sha512_write(hd, NULL, 0);  /* flush */;
+       memset(hd->buf, 0, 112 ); /* fill next block with zeroes */
+    }
+    /* append the 128 bit count */
+    hd->buf[112] = msb >> 56;
+    hd->buf[113] = msb >> 48;
+    hd->buf[114] = msb >> 40;
+    hd->buf[115] = msb >> 32;
+    hd->buf[116] = msb >> 24;
+    hd->buf[117] = msb >> 16;
+    hd->buf[118] = msb >>  8;
+    hd->buf[119] = msb    ;
+
+    hd->buf[120] = lsb >> 56;
+    hd->buf[121] = lsb >> 48;
+    hd->buf[122] = lsb >> 40;
+    hd->buf[123] = lsb >> 32;
+    hd->buf[124] = lsb >> 24;
+    hd->buf[125] = lsb >> 16;
+    hd->buf[126] = lsb >>  8;
+    hd->buf[127] = lsb    ;
+    transform( hd, hd->buf );
+    burn_stack (768);
+
+    p = hd->buf;
+#ifdef BIG_ENDIAN_HOST
+#define X(a) do { *(u64*)p = hd->h##a ; p += 8; } while(0)
+#else /* little endian */
+#define X(a) do { *p++ = hd->h##a >> 56; *p++ = hd->h##a >> 48;         \
+                      *p++ = hd->h##a >> 40; *p++ = hd->h##a >> 32;     \
+                      *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;     \
+                     *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
+#endif
+    X(0);
+    X(1);
+    X(2);
+    X(3);
+    X(4);
+    X(5);
+    /* Note that these last two chunks are included even for SHA384.
+       We just ignore them. */
+    X(6);
+    X(7);
+#undef X
+}
+
+static byte *
+sha512_read( SHA512_CONTEXT *hd )
+{
+  return hd->buf;
+}
+
+/****************
+ * Return some information about the algorithm.  We need algo here to
+ * distinguish different flavors of the algorithm.
+ * Returns: A pointer to string describing the algorithm or NULL if
+ *         the ALGO is invalid.
+ */
+const char *
+sha512_get_info( int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                )
+{
+  static byte asn[] = /* Object ID is 2.16.840.1.101.3.4.2.3 */
+    { 
+      0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+      0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
+      0x00, 0x04, 0x40
+    };
+
+    if( algo != 10 )
+       return NULL;
+
+    *contextsize = sizeof(SHA512_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 64;
+    *(void  (**)(SHA512_CONTEXT *))r_init                = sha512_init;
+    *(void  (**)(SHA512_CONTEXT *, byte*, size_t))r_write = sha512_write;
+    *(void  (**)(SHA512_CONTEXT *))r_final               = sha512_final;
+    *(byte *(**)(SHA512_CONTEXT *))r_read                = sha512_read;
+
+    return "SHA512";
+}
+
+/* SHA384 is really a truncated SHA512 with a different
+   initialization */
+const char *
+sha384_get_info( int algo, size_t *contextsize,
+                byte **r_asnoid, int *r_asnlen, int *r_mdlen,
+                void (**r_init)( void *c ),
+                void (**r_write)( void *c, byte *buf, size_t nbytes ),
+                void (**r_final)( void *c ),
+                byte *(**r_read)( void *c )
+                )
+{
+  static byte asn[] = /* Object ID is 2.16.840.1.101.3.4.2.2 */
+    {
+      0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
+      0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05,
+      0x00, 0x04, 0x30
+    };
+
+    if( algo != 9 )
+       return NULL;
+
+    *contextsize = sizeof(SHA512_CONTEXT);
+    *r_asnoid = asn;
+    *r_asnlen = DIM(asn);
+    *r_mdlen = 48;
+    *(void  (**)(SHA512_CONTEXT *))r_init                = sha384_init;
+    *(void  (**)(SHA512_CONTEXT *, byte*, size_t))r_write = sha512_write;
+    *(void  (**)(SHA512_CONTEXT *))r_final               = sha512_final;
+    *(byte *(**)(SHA512_CONTEXT *))r_read                = sha512_read;
+
+    return "SHA384";
+}
diff --git a/cipher/smallprime.c b/cipher/smallprime.c
new file mode 100644 (file)
index 0000000..b110fbb
--- /dev/null
@@ -0,0 +1,115 @@
+/* smallprime.c - List of small primes
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "util.h"
+#include "types.h"
+
+/* Note: 2 is not included because it can be tested more easily
+ * by looking at bit 0. The last entry in this list is marked by a zero
+ */
+ushort
+small_prime_numbers[] = {
+    3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,
+    47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101,
+    103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
+    157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
+    211, 223, 227, 229, 233, 239, 241, 251, 257, 263,
+    269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
+    331, 337, 347, 349, 353, 359, 367, 373, 379, 383,
+    389, 397, 401, 409, 419, 421, 431, 433, 439, 443,
+    449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
+    509, 521, 523, 541, 547, 557, 563, 569, 571, 577,
+    587, 593, 599, 601, 607, 613, 617, 619, 631, 641,
+    643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
+    709, 719, 727, 733, 739, 743, 751, 757, 761, 769,
+    773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
+    853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
+    919, 929, 937, 941, 947, 953, 967, 971, 977, 983,
+    991, 997, 1009, 1013, 1019, 1021, 1031, 1033,
+    1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091,
+    1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151,
+    1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213,
+    1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277,
+    1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307,
+    1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399,
+    1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
+    1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493,
+    1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559,
+    1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609,
+    1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667,
+    1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733,
+    1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789,
+    1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871,
+    1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931,
+    1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,
+    1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053,
+    2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111,
+    2113, 2129, 2131, 2137, 2141, 2143, 2153, 2161,
+    2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243,
+    2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297,
+    2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
+    2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411,
+    2417, 2423, 2437, 2441, 2447, 2459, 2467, 2473,
+    2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551,
+    2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633,
+    2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
+    2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729,
+    2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791,
+    2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851,
+    2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917,
+    2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
+    3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061,
+    3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137,
+    3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
+    3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271,
+    3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
+    3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391,
+    3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467,
+    3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533,
+    3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583,
+    3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
+    3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709,
+    3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779,
+    3793, 3797, 3803, 3821, 3823, 3833, 3847, 3851,
+    3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917,
+    3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
+    4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049,
+    4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111,
+    4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
+    4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243,
+    4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
+    4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391,
+    4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457,
+    4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519,
+    4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597,
+    4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
+    4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729,
+    4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799,
+    4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889,
+    4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951,
+    4957, 4967, 4969, 4973, 4987, 4993, 4999,
+    0
+};
+
+
diff --git a/cipher/twofish.c b/cipher/twofish.c
new file mode 100644 (file)
index 0000000..2feccdf
--- /dev/null
@@ -0,0 +1,1034 @@
+/* Twofish for GPG
+ * By Matthew Skala <mskala@ansuz.sooke.bc.ca>, July 26, 1998
+ * 256-bit key length added March 20, 1999
+ * Some modifications to reduce the text size by Werner Koch, April, 1998
+ *
+ * The original author has disclaimed all copyright interest in this
+ * code and thus putting it in the public domain.
+ *
+ * This code is a "clean room" implementation, written from the paper
+ * _Twofish: A 128-Bit Block Cipher_ by Bruce Schneier, John Kelsey,
+ * Doug Whiting, David Wagner, Chris Hall, and Niels Ferguson, available
+ * through http://www.counterpane.com/twofish.html
+ *
+ * For background information on multiplication in finite fields, used for
+ * the matrix operations in the key schedule, see the book _Contemporary
+ * Abstract Algebra_ by Joseph A. Gallian, especially chapter 22 in the
+ * Third Edition.
+ *
+ * Only the 128- and 256-bit key sizes are supported.  This code is intended
+ * for GNU C on a 32-bit system, but it should work almost anywhere.  Loops
+ * are unrolled, precomputation tables are used, etc., for maximum speed at
+ * some cost in memory consumption. */
+\f
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h> /* for memcmp() */
+
+#include "types.h"  /* for byte and u32 typedefs */
+#include "util.h"
+#include "errors.h"
+#include "algorithms.h"
+
+/* Prototype for the self-test function. */
+static const char *selftest(void);
+
+/* Structure for an expanded Twofish key.  s contains the key-dependent
+ * S-boxes composed with the MDS matrix; w contains the eight "whitening"
+ * subkeys, K[0] through K[7]. k holds the remaining, "round" subkeys.  Note
+ * that k[i] corresponds to what the Twofish paper calls K[i+8]. */
+typedef struct {
+   u32 s[4][256], w[8], k[32];
+} TWOFISH_context;
+\f
+/* These two tables are the q0 and q1 permutations, exactly as described in
+ * the Twofish paper. */
+
+static const byte q0[256] = {
+   0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78,
+   0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C,
+   0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30,
+   0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82,
+   0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE,
+   0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B,
+   0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45,
+   0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7,
+   0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF,
+   0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8,
+   0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED,
+   0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90,
+   0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B,
+   0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B,
+   0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F,
+   0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A,
+   0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17,
+   0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72,
+   0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68,
+   0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4,
+   0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42,
+   0x4A, 0x5E, 0xC1, 0xE0
+};
+
+static const byte q1[256] = {
+   0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B,
+   0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1,
+   0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B,
+   0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5,
+   0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54,
+   0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96,
+   0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7,
+   0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8,
+   0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF,
+   0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9,
+   0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D,
+   0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E,
+   0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21,
+   0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01,
+   0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E,
+   0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64,
+   0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44,
+   0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E,
+   0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B,
+   0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9,
+   0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56,
+   0x55, 0x09, 0xBE, 0x91
+};
+\f
+/* These MDS tables are actually tables of MDS composed with q0 and q1,
+ * because it is only ever used that way and we can save some time by
+ * precomputing.  Of course the main saving comes from precomputing the
+ * GF(2^8) multiplication involved in the MDS matrix multiply; by looking
+ * things up in these tables we reduce the matrix multiply to four lookups
+ * and three XORs.  Semi-formally, the definition of these tables is:
+ * mds[0][i] = MDS (q1[i] 0 0 0)^T  mds[1][i] = MDS (0 q0[i] 0 0)^T
+ * mds[2][i] = MDS (0 0 q1[i] 0)^T  mds[3][i] = MDS (0 0 0 q0[i])^T
+ * where ^T means "transpose", the matrix multiply is performed in GF(2^8)
+ * represented as GF(2)[x]/v(x) where v(x)=x^8+x^6+x^5+x^3+1 as described
+ * by Schneier et al, and I'm casually glossing over the byte/word
+ * conversion issues. */
+
+static const u32 mds[4][256] = {
+   {0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B,
+    0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B,
+    0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32,
+    0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1,
+    0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA,
+    0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B,
+    0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1,
+    0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5,
+    0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490,
+    0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154,
+    0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0,
+    0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796,
+    0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228,
+    0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7,
+    0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3,
+    0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8,
+    0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477,
+    0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF,
+    0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C,
+    0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9,
+    0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA,
+    0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D,
+    0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72,
+    0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E,
+    0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76,
+    0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321,
+    0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39,
+    0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01,
+    0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D,
+    0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E,
+    0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5,
+    0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64,
+    0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7,
+    0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544,
+    0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E,
+    0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E,
+    0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A,
+    0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B,
+    0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2,
+    0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9,
+    0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504,
+    0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756,
+    0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91},
+
+   {0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252,
+    0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A,
+    0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020,
+    0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141,
+    0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444,
+    0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424,
+    0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A,
+    0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757,
+    0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383,
+    0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A,
+    0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9,
+    0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656,
+    0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1,
+    0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898,
+    0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414,
+    0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3,
+    0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1,
+    0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989,
+    0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5,
+    0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282,
+    0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E,
+    0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E,
+    0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202,
+    0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC,
+    0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565,
+    0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A,
+    0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808,
+    0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272,
+    0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A,
+    0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969,
+    0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505,
+    0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5,
+    0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D,
+    0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343,
+    0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF,
+    0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3,
+    0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F,
+    0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646,
+    0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6,
+    0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF,
+    0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A,
+    0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7,
+    0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8},
+
+   {0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B,
+    0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F,
+    0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A,
+    0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783,
+    0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70,
+    0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3,
+    0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB,
+    0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA,
+    0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4,
+    0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41,
+    0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C,
+    0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07,
+    0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622,
+    0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18,
+    0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035,
+    0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96,
+    0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84,
+    0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E,
+    0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F,
+    0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD,
+    0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558,
+    0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40,
+    0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA,
+    0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85,
+    0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF,
+    0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773,
+    0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D,
+    0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B,
+    0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C,
+    0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19,
+    0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086,
+    0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D,
+    0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74,
+    0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755,
+    0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691,
+    0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D,
+    0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4,
+    0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53,
+    0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E,
+    0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9,
+    0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705,
+    0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7,
+    0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF},
+
+   {0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98,
+    0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866,
+    0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643,
+    0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77,
+    0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9,
+    0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C,
+    0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3,
+    0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216,
+    0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F,
+    0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25,
+    0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF,
+    0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7,
+    0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4,
+    0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E,
+    0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA,
+    0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C,
+    0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12,
+    0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A,
+    0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D,
+    0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE,
+    0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A,
+    0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C,
+    0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B,
+    0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4,
+    0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B,
+    0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3,
+    0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE,
+    0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB,
+    0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85,
+    0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA,
+    0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E,
+    0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8,
+    0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33,
+    0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC,
+    0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718,
+    0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA,
+    0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8,
+    0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872,
+    0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882,
+    0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D,
+    0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10,
+    0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6,
+    0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8}
+};
+\f
+/* The exp_to_poly and poly_to_exp tables are used to perform efficient
+ * operations in GF(2^8) represented as GF(2)[x]/w(x) where
+ * w(x)=x^8+x^6+x^3+x^2+1.  We care about doing that because it's part of the
+ * definition of the RS matrix in the key schedule.  Elements of that field
+ * are polynomials of degree not greater than 7 and all coefficients 0 or 1,
+ * which can be represented naturally by bytes (just substitute x=2).  In that
+ * form, GF(2^8) addition is the same as bitwise XOR, but GF(2^8)
+ * multiplication is inefficient without hardware support.  To multiply
+ * faster, I make use of the fact x is a generator for the nonzero elements,
+ * so that every element p of GF(2)[x]/w(x) is either 0 or equal to (x)^n for
+ * some n in 0..254.  Note that that caret is exponentiation in GF(2^8),
+ * *not* polynomial notation.  So if I want to compute pq where p and q are
+ * in GF(2^8), I can just say:
+ *    1. if p=0 or q=0 then pq=0
+ *    2. otherwise, find m and n such that p=x^m and q=x^n
+ *    3. pq=(x^m)(x^n)=x^(m+n), so add m and n and find pq
+ * The translations in steps 2 and 3 are looked up in the tables
+ * poly_to_exp (for step 2) and exp_to_poly (for step 3).  To see this
+ * in action, look at the CALC_S macro.  As additional wrinkles, note that
+ * one of my operands is always a constant, so the poly_to_exp lookup on it
+ * is done in advance; I included the original values in the comments so
+ * readers can have some chance of recognizing that this *is* the RS matrix
+ * from the Twofish paper.  I've only included the table entries I actually
+ * need; I never do a lookup on a variable input of zero and the biggest
+ * exponents I'll ever see are 254 (variable) and 237 (constant), so they'll
+ * never sum to more than 491. I'm repeating part of the exp_to_poly table
+ * so that I don't have to do mod-255 reduction in the exponent arithmetic.
+ * Since I know my constant operands are never zero, I only have to worry
+ * about zero values in the variable operand, and I do it with a simple
+ * conditional branch. I know conditionals are expensive, but I couldn't
+ * see a non-horrible way of avoiding them, and I did manage to group the
+ * statements so that each if covers four group multiplications. */
+
+static const byte poly_to_exp[255] = {
+   0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93, 0x19,
+   0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94, 0x4B, 0x1A,
+   0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24, 0x5D, 0x87, 0x6C,
+   0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95, 0x98, 0x4C, 0xCA, 0x1B,
+   0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12, 0x56, 0x62, 0xAB, 0xF0, 0x47,
+   0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25, 0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D,
+   0xD6, 0x9C, 0x79, 0xB8, 0x08, 0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8,
+   0x8A, 0xA4, 0x5A, 0x96, 0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C,
+   0x7B, 0xE7, 0x3B, 0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83,
+   0x6F, 0x13, 0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48,
+   0x0A, 0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26,
+   0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC, 0x6E,
+   0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09, 0x41, 0xC3,
+   0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52, 0xFE, 0x16, 0xA9,
+   0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97, 0xC9, 0x2A, 0xA2, 0x9A,
+   0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF, 0xCC, 0x11, 0xE5, 0x72, 0x1D,
+   0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C, 0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75,
+   0x1E, 0xF5, 0x3E, 0x38, 0xF6, 0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84,
+   0xA0, 0x70, 0xED, 0x14, 0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64,
+   0xD0, 0xDD, 0x77, 0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49,
+   0xB4, 0x0B, 0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF,
+   0x85, 0xC8, 0xA1
+};
+
+static const byte exp_to_poly[492] = {
+   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79, 0xF2,
+   0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5, 0xA7, 0x03,
+   0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3, 0x8B, 0x5B, 0xB6,
+   0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A,
+   0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63,
+   0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C,
+   0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07,
+   0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88,
+   0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12,
+   0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7,
+   0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C,
+   0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64, 0xC8,
+   0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A, 0xB4, 0x25,
+   0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56, 0xAC, 0x15, 0x2A,
+   0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE,
+   0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC,
+   0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E,
+   0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92,
+   0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89,
+   0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB,
+   0x3B, 0x76, 0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1,
+   0x8F, 0x53, 0xA6, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D,
+   0x9A, 0x79, 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC,
+   0xF5, 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3,
+   0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29, 0x52,
+   0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34, 0x68, 0xD0,
+   0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B, 0x7B, 0xF6, 0xA1,
+   0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD, 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A,
+   0xF4, 0xA5, 0x07, 0x0E, 0x1C, 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11,
+   0x22, 0x44, 0x88, 0x5D, 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51,
+   0xA2, 0x09, 0x12, 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66,
+   0xCC, 0xD5, 0xE7, 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB,
+   0x1B, 0x36, 0x6C, 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19,
+   0x32, 0x64, 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D,
+   0x5A, 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56,
+   0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77, 0xEE,
+   0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D, 0xFA, 0xB9,
+   0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA, 0x99, 0x7F, 0xFE,
+   0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A, 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41,
+   0x82, 0x49, 0x92, 0x69, 0xD2, 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E,
+   0x71, 0xE2, 0x89, 0x5F, 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB
+};
+\f
+
+/* The table constants are indices of
+ * S-box entries, preprocessed through q0 and q1. */
+static byte calc_sb_tbl[512] = {
+    0xA9, 0x75, 0x67, 0xF3, 0xB3, 0xC6, 0xE8, 0xF4,
+    0x04, 0xDB, 0xFD, 0x7B, 0xA3, 0xFB, 0x76, 0xC8,
+    0x9A, 0x4A, 0x92, 0xD3, 0x80, 0xE6, 0x78, 0x6B,
+    0xE4, 0x45, 0xDD, 0x7D, 0xD1, 0xE8, 0x38, 0x4B,
+    0x0D, 0xD6, 0xC6, 0x32, 0x35, 0xD8, 0x98, 0xFD,
+    0x18, 0x37, 0xF7, 0x71, 0xEC, 0xF1, 0x6C, 0xE1,
+    0x43, 0x30, 0x75, 0x0F, 0x37, 0xF8, 0x26, 0x1B,
+    0xFA, 0x87, 0x13, 0xFA, 0x94, 0x06, 0x48, 0x3F,
+    0xF2, 0x5E, 0xD0, 0xBA, 0x8B, 0xAE, 0x30, 0x5B,
+    0x84, 0x8A, 0x54, 0x00, 0xDF, 0xBC, 0x23, 0x9D,
+    0x19, 0x6D, 0x5B, 0xC1, 0x3D, 0xB1, 0x59, 0x0E,
+    0xF3, 0x80, 0xAE, 0x5D, 0xA2, 0xD2, 0x82, 0xD5,
+    0x63, 0xA0, 0x01, 0x84, 0x83, 0x07, 0x2E, 0x14,
+    0xD9, 0xB5, 0x51, 0x90, 0x9B, 0x2C, 0x7C, 0xA3,
+    0xA6, 0xB2, 0xEB, 0x73, 0xA5, 0x4C, 0xBE, 0x54,
+    0x16, 0x92, 0x0C, 0x74, 0xE3, 0x36, 0x61, 0x51,
+    0xC0, 0x38, 0x8C, 0xB0, 0x3A, 0xBD, 0xF5, 0x5A,
+    0x73, 0xFC, 0x2C, 0x60, 0x25, 0x62, 0x0B, 0x96,
+    0xBB, 0x6C, 0x4E, 0x42, 0x89, 0xF7, 0x6B, 0x10,
+    0x53, 0x7C, 0x6A, 0x28, 0xB4, 0x27, 0xF1, 0x8C,
+    0xE1, 0x13, 0xE6, 0x95, 0xBD, 0x9C, 0x45, 0xC7,
+    0xE2, 0x24, 0xF4, 0x46, 0xB6, 0x3B, 0x66, 0x70,
+    0xCC, 0xCA, 0x95, 0xE3, 0x03, 0x85, 0x56, 0xCB,
+    0xD4, 0x11, 0x1C, 0xD0, 0x1E, 0x93, 0xD7, 0xB8,
+    0xFB, 0xA6, 0xC3, 0x83, 0x8E, 0x20, 0xB5, 0xFF,
+    0xE9, 0x9F, 0xCF, 0x77, 0xBF, 0xC3, 0xBA, 0xCC,
+    0xEA, 0x03, 0x77, 0x6F, 0x39, 0x08, 0xAF, 0xBF,
+    0x33, 0x40, 0xC9, 0xE7, 0x62, 0x2B, 0x71, 0xE2,
+    0x81, 0x79, 0x79, 0x0C, 0x09, 0xAA, 0xAD, 0x82,
+    0x24, 0x41, 0xCD, 0x3A, 0xF9, 0xEA, 0xD8, 0xB9,
+    0xE5, 0xE4, 0xC5, 0x9A, 0xB9, 0xA4, 0x4D, 0x97,
+    0x44, 0x7E, 0x08, 0xDA, 0x86, 0x7A, 0xE7, 0x17,
+    0xA1, 0x66, 0x1D, 0x94, 0xAA, 0xA1, 0xED, 0x1D,
+    0x06, 0x3D, 0x70, 0xF0, 0xB2, 0xDE, 0xD2, 0xB3,
+    0x41, 0x0B, 0x7B, 0x72, 0xA0, 0xA7, 0x11, 0x1C,
+    0x31, 0xEF, 0xC2, 0xD1, 0x27, 0x53, 0x90, 0x3E,
+    0x20, 0x8F, 0xF6, 0x33, 0x60, 0x26, 0xFF, 0x5F,
+    0x96, 0xEC, 0x5C, 0x76, 0xB1, 0x2A, 0xAB, 0x49,
+    0x9E, 0x81, 0x9C, 0x88, 0x52, 0xEE, 0x1B, 0x21,
+    0x5F, 0xC4, 0x93, 0x1A, 0x0A, 0xEB, 0xEF, 0xD9,
+    0x91, 0xC5, 0x85, 0x39, 0x49, 0x99, 0xEE, 0xCD,
+    0x2D, 0xAD, 0x4F, 0x31, 0x8F, 0x8B, 0x3B, 0x01,
+    0x47, 0x18, 0x87, 0x23, 0x6D, 0xDD, 0x46, 0x1F,
+    0xD6, 0x4E, 0x3E, 0x2D, 0x69, 0xF9, 0x64, 0x48,
+    0x2A, 0x4F, 0xCE, 0xF2, 0xCB, 0x65, 0x2F, 0x8E,
+    0xFC, 0x78, 0x97, 0x5C, 0x05, 0x58, 0x7A, 0x19,
+    0xAC, 0x8D, 0x7F, 0xE5, 0xD5, 0x98, 0x1A, 0x57,
+    0x4B, 0x67, 0x0E, 0x7F, 0xA7, 0x05, 0x5A, 0x64,
+    0x28, 0xAF, 0x14, 0x63, 0x3F, 0xB6, 0x29, 0xFE,
+    0x88, 0xF5, 0x3C, 0xB7, 0x4C, 0x3C, 0x02, 0xA5,
+    0xB8, 0xCE, 0xDA, 0xE9, 0xB0, 0x68, 0x17, 0x44,
+    0x55, 0xE0, 0x1F, 0x4D, 0x8A, 0x43, 0x7D, 0x69,
+    0x57, 0x29, 0xC7, 0x2E, 0x8D, 0xAC, 0x74, 0x15,
+    0xB7, 0x59, 0xC4, 0xA8, 0x9F, 0x0A, 0x72, 0x9E,
+    0x7E, 0x6E, 0x15, 0x47, 0x22, 0xDF, 0x12, 0x34,
+    0x58, 0x35, 0x07, 0x6A, 0x99, 0xCF, 0x34, 0xDC,
+    0x6E, 0x22, 0x50, 0xC9, 0xDE, 0xC0, 0x68, 0x9B,
+    0x65, 0x89, 0xBC, 0xD4, 0xDB, 0xED, 0xF8, 0xAB,
+    0xC8, 0x12, 0xA8, 0xA2, 0x2B, 0x0D, 0x40, 0x52,
+    0xDC, 0xBB, 0xFE, 0x02, 0x32, 0x2F, 0xA4, 0xA9,
+    0xCA, 0xD7, 0x10, 0x61, 0x21, 0x1E, 0xF0, 0xB4,
+    0xD3, 0x50, 0x5D, 0x04, 0x0F, 0xF6, 0x00, 0xC2,
+    0x6F, 0x16, 0x9D, 0x25, 0x36, 0x86, 0x42, 0x56,
+    0x4A, 0x55, 0x5E, 0x09, 0xC1, 0xBE, 0xE0, 0x91
+};
+/* Macro to perform one column of the RS matrix multiplication.  The
+ * parameters a, b, c, and d are the four bytes of output; i is the index
+ * of the key bytes, and w, x, y, and z, are the column of constants from
+ * the RS matrix, preprocessed through the poly_to_exp table. */
+
+#define CALC_S(a, b, c, d, i, w, x, y, z) \
+   if (key[i]) { \
+      tmp = poly_to_exp[key[i] - 1]; \
+      (a) ^= exp_to_poly[tmp + (w)]; \
+      (b) ^= exp_to_poly[tmp + (x)]; \
+      (c) ^= exp_to_poly[tmp + (y)]; \
+      (d) ^= exp_to_poly[tmp + (z)]; \
+   }
+
+/* Macros to calculate the key-dependent S-boxes for a 128-bit key using
+ * the S vector from CALC_S.  CALC_SB_2 computes a single entry in all
+ * four S-boxes, where i is the index of the entry to compute, and a and b
+ * are the index numbers preprocessed through the q0 and q1 tables
+ * respectively.  CALC_SB is simply a convenience to make the code shorter;
+ * it calls CALC_SB_2 four times with consecutive indices from i to i+3,
+ * using the remaining parameters two by two. */
+
+#define CALC_SB_2(i, a, b) \
+   ctx->s[0][i] = mds[0][q0[(a) ^ sa] ^ se]; \
+   ctx->s[1][i] = mds[1][q0[(b) ^ sb] ^ sf]; \
+   ctx->s[2][i] = mds[2][q1[(a) ^ sc] ^ sg]; \
+   ctx->s[3][i] = mds[3][q1[(b) ^ sd] ^ sh]
+
+#define CALC_SB(i, a, b, c, d, e, f, g, h) \
+   CALC_SB_2 (i, a, b); CALC_SB_2 ((i)+1, c, d); \
+   CALC_SB_2 ((i)+2, e, f); CALC_SB_2 ((i)+3, g, h)
+
+/* Macros exactly like CALC_SB and CALC_SB_2, but for 256-bit keys. */
+
+#define CALC_SB256_2(i, a, b) \
+   ctx->s[0][i] = mds[0][q0[q0[q1[(b) ^ sa] ^ se] ^ si] ^ sm]; \
+   ctx->s[1][i] = mds[1][q0[q1[q1[(a) ^ sb] ^ sf] ^ sj] ^ sn]; \
+   ctx->s[2][i] = mds[2][q1[q0[q0[(a) ^ sc] ^ sg] ^ sk] ^ so]; \
+   ctx->s[3][i] = mds[3][q1[q1[q0[(b) ^ sd] ^ sh] ^ sl] ^ sp];
+
+#define CALC_SB256(i, a, b, c, d, e, f, g, h) \
+   CALC_SB256_2 (i, a, b); CALC_SB256_2 ((i)+1, c, d); \
+   CALC_SB256_2 ((i)+2, e, f); CALC_SB256_2 ((i)+3, g, h)
+
+/* Macros to calculate the whitening and round subkeys.  CALC_K_2 computes the
+ * last two stages of the h() function for a given index (either 2i or 2i+1).
+ * a, b, c, and d are the four bytes going into the last two stages.  For
+ * 128-bit keys, this is the entire h() function and a and c are the index
+ * preprocessed through q0 and q1 respectively; for longer keys they are the
+ * output of previous stages.  j is the index of the first key byte to use.
+ * CALC_K computes a pair of subkeys for 128-bit Twofish, by calling CALC_K_2
+ * twice, doing the Psuedo-Hadamard Transform, and doing the necessary
+ * rotations.  Its parameters are: a, the array to write the results into,
+ * j, the index of the first output entry, k and l, the preprocessed indices
+ * for index 2i, and m and n, the preprocessed indices for index 2i+1.
+ * CALC_K256_2 expands CALC_K_2 to handle 256-bit keys, by doing two
+ * additional lookup-and-XOR stages.  The parameters a and b are the index
+ * preprocessed through q0 and q1 respectively; j is the index of the first
+ * key byte to use.  CALC_K256 is identical to CALC_K but for using the
+ * CALC_K256_2 macro instead of CALC_K_2. */
+
+#define CALC_K_2(a, b, c, d, j) \
+     mds[0][q0[a ^ key[(j) + 8]] ^ key[j]] \
+   ^ mds[1][q0[b ^ key[(j) + 9]] ^ key[(j) + 1]] \
+   ^ mds[2][q1[c ^ key[(j) + 10]] ^ key[(j) + 2]] \
+   ^ mds[3][q1[d ^ key[(j) + 11]] ^ key[(j) + 3]]
+
+#define CALC_K(a, j, k, l, m, n) \
+   x = CALC_K_2 (k, l, k, l, 0); \
+   y = CALC_K_2 (m, n, m, n, 4); \
+   y = (y << 8) + (y >> 24); \
+   x += y; y += x; ctx->a[j] = x; \
+   ctx->a[(j) + 1] = (y << 9) + (y >> 23)
+
+#define CALC_K256_2(a, b, j) \
+   CALC_K_2 (q0[q1[b ^ key[(j) + 24]] ^ key[(j) + 16]], \
+            q1[q1[a ^ key[(j) + 25]] ^ key[(j) + 17]], \
+            q0[q0[a ^ key[(j) + 26]] ^ key[(j) + 18]], \
+            q1[q0[b ^ key[(j) + 27]] ^ key[(j) + 19]], j)
+
+#define CALC_K256(a, j, k, l, m, n) \
+   x = CALC_K256_2 (k, l, 0); \
+   y = CALC_K256_2 (m, n, 4); \
+   y = (y << 8) + (y >> 24); \
+   x += y; y += x; ctx->a[j] = x; \
+   ctx->a[(j) + 1] = (y << 9) + (y >> 23)
+\f
+
+static void
+burn_stack (int bytes)
+{
+    char buf[64];
+    
+    wipememory(buf,sizeof buf);
+    bytes -= sizeof buf;
+    if (bytes > 0)
+        burn_stack (bytes);
+}
+
+
+/* Perform the key setup.  Note that this works only with 128- and 256-bit
+ * keys, despite the API that looks like it might support other sizes. */
+
+static int
+do_twofish_setkey (TWOFISH_context *ctx, const byte *key, unsigned int keylen)
+{
+    int i, j, k;
+
+    /* Temporaries for CALC_K. */
+    u32 x, y;
+
+    /* The S vector used to key the S-boxes, split up into individual bytes.
+     * 128-bit keys use only sa through sh; 256-bit use all of them. */
+    byte sa = 0, sb = 0, sc = 0, sd = 0, se = 0, sf = 0, sg = 0, sh = 0;
+    byte si = 0, sj = 0, sk = 0, sl = 0, sm = 0, sn = 0, so = 0, sp = 0;
+
+    /* Temporary for CALC_S. */
+    byte tmp;
+
+    /* Flags for self-test. */
+    static int initialized = 0;
+    static const char *selftest_failed=0;
+
+    /* Check key length. */
+    if( ( ( keylen - 16 ) | 16 ) != 16 )
+       return G10ERR_WRONG_KEYLEN;
+
+    /* Do self-test if necessary. */
+    if (!initialized) {
+       initialized = 1;
+       selftest_failed = selftest ();
+       if( selftest_failed )
+        fprintf(stderr, "%s\n", selftest_failed );
+    }
+    if( selftest_failed )
+       return G10ERR_SELFTEST_FAILED;
+
+    /* Compute the first two words of the S vector.  The magic numbers are
+     * the entries of the RS matrix, preprocessed through poly_to_exp. The
+     * numbers in the comments are the original (polynomial form) matrix
+     * entries. */
+    CALC_S (sa, sb, sc, sd, 0, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */
+    CALC_S (sa, sb, sc, sd, 1, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */
+    CALC_S (sa, sb, sc, sd, 2, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */
+    CALC_S (sa, sb, sc, sd, 3, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */
+    CALC_S (sa, sb, sc, sd, 4, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */
+    CALC_S (sa, sb, sc, sd, 5, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */
+    CALC_S (sa, sb, sc, sd, 6, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */
+    CALC_S (sa, sb, sc, sd, 7, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */
+    CALC_S (se, sf, sg, sh, 8, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */
+    CALC_S (se, sf, sg, sh, 9, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */
+    CALC_S (se, sf, sg, sh, 10, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */
+    CALC_S (se, sf, sg, sh, 11, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */
+    CALC_S (se, sf, sg, sh, 12, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */
+    CALC_S (se, sf, sg, sh, 13, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */
+    CALC_S (se, sf, sg, sh, 14, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */
+    CALC_S (se, sf, sg, sh, 15, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */
+
+    if (keylen == 32) { /* 256-bit key */
+       /* Calculate the remaining two words of the S vector */
+       CALC_S (si, sj, sk, sl, 16, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */
+       CALC_S (si, sj, sk, sl, 17, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */
+       CALC_S (si, sj, sk, sl, 18, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */
+       CALC_S (si, sj, sk, sl, 19, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */
+       CALC_S (si, sj, sk, sl, 20, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */
+       CALC_S (si, sj, sk, sl, 21, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */
+       CALC_S (si, sj, sk, sl, 22, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */
+       CALC_S (si, sj, sk, sl, 23, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */
+       CALC_S (sm, sn, so, sp, 24, 0x00, 0x2D, 0x01, 0x2D); /* 01 A4 02 A4 */
+       CALC_S (sm, sn, so, sp, 25, 0x2D, 0xA4, 0x44, 0x8A); /* A4 56 A1 55 */
+       CALC_S (sm, sn, so, sp, 26, 0x8A, 0xD5, 0xBF, 0xD1); /* 55 82 FC 87 */
+       CALC_S (sm, sn, so, sp, 27, 0xD1, 0x7F, 0x3D, 0x99); /* 87 F3 C1 5A */
+       CALC_S (sm, sn, so, sp, 28, 0x99, 0x46, 0x66, 0x96); /* 5A 1E 47 58 */
+       CALC_S (sm, sn, so, sp, 29, 0x96, 0x3C, 0x5B, 0xED); /* 58 C6 AE DB */
+       CALC_S (sm, sn, so, sp, 30, 0xED, 0x37, 0x4F, 0xE0); /* DB 68 3D 9E */
+       CALC_S (sm, sn, so, sp, 31, 0xE0, 0xD0, 0x8C, 0x17); /* 9E E5 19 03 */
+
+       /* Compute the S-boxes. */
+       for(i=j=0,k=1; i < 256; i++, j += 2, k += 2 ) {
+           CALC_SB256_2( i, calc_sb_tbl[j], calc_sb_tbl[k] );
+       }
+
+       /* Calculate whitening and round subkeys.  The constants are
+        * indices of subkeys, preprocessed through q0 and q1. */
+       CALC_K256 (w, 0, 0xA9, 0x75, 0x67, 0xF3);
+       CALC_K256 (w, 2, 0xB3, 0xC6, 0xE8, 0xF4);
+       CALC_K256 (w, 4, 0x04, 0xDB, 0xFD, 0x7B);
+       CALC_K256 (w, 6, 0xA3, 0xFB, 0x76, 0xC8);
+       CALC_K256 (k, 0, 0x9A, 0x4A, 0x92, 0xD3);
+       CALC_K256 (k, 2, 0x80, 0xE6, 0x78, 0x6B);
+       CALC_K256 (k, 4, 0xE4, 0x45, 0xDD, 0x7D);
+       CALC_K256 (k, 6, 0xD1, 0xE8, 0x38, 0x4B);
+       CALC_K256 (k, 8, 0x0D, 0xD6, 0xC6, 0x32);
+       CALC_K256 (k, 10, 0x35, 0xD8, 0x98, 0xFD);
+       CALC_K256 (k, 12, 0x18, 0x37, 0xF7, 0x71);
+       CALC_K256 (k, 14, 0xEC, 0xF1, 0x6C, 0xE1);
+       CALC_K256 (k, 16, 0x43, 0x30, 0x75, 0x0F);
+       CALC_K256 (k, 18, 0x37, 0xF8, 0x26, 0x1B);
+       CALC_K256 (k, 20, 0xFA, 0x87, 0x13, 0xFA);
+       CALC_K256 (k, 22, 0x94, 0x06, 0x48, 0x3F);
+       CALC_K256 (k, 24, 0xF2, 0x5E, 0xD0, 0xBA);
+       CALC_K256 (k, 26, 0x8B, 0xAE, 0x30, 0x5B);
+       CALC_K256 (k, 28, 0x84, 0x8A, 0x54, 0x00);
+       CALC_K256 (k, 30, 0xDF, 0xBC, 0x23, 0x9D);
+    }
+    else {
+       /* Compute the S-boxes. */
+       for(i=j=0,k=1; i < 256; i++, j += 2, k += 2 ) {
+           CALC_SB_2( i, calc_sb_tbl[j], calc_sb_tbl[k] );
+       }
+
+       /* Calculate whitening and round subkeys.  The constants are
+        * indices of subkeys, preprocessed through q0 and q1. */
+       CALC_K (w, 0, 0xA9, 0x75, 0x67, 0xF3);
+       CALC_K (w, 2, 0xB3, 0xC6, 0xE8, 0xF4);
+       CALC_K (w, 4, 0x04, 0xDB, 0xFD, 0x7B);
+       CALC_K (w, 6, 0xA3, 0xFB, 0x76, 0xC8);
+       CALC_K (k, 0, 0x9A, 0x4A, 0x92, 0xD3);
+       CALC_K (k, 2, 0x80, 0xE6, 0x78, 0x6B);
+       CALC_K (k, 4, 0xE4, 0x45, 0xDD, 0x7D);
+       CALC_K (k, 6, 0xD1, 0xE8, 0x38, 0x4B);
+       CALC_K (k, 8, 0x0D, 0xD6, 0xC6, 0x32);
+       CALC_K (k, 10, 0x35, 0xD8, 0x98, 0xFD);
+       CALC_K (k, 12, 0x18, 0x37, 0xF7, 0x71);
+       CALC_K (k, 14, 0xEC, 0xF1, 0x6C, 0xE1);
+       CALC_K (k, 16, 0x43, 0x30, 0x75, 0x0F);
+       CALC_K (k, 18, 0x37, 0xF8, 0x26, 0x1B);
+       CALC_K (k, 20, 0xFA, 0x87, 0x13, 0xFA);
+       CALC_K (k, 22, 0x94, 0x06, 0x48, 0x3F);
+       CALC_K (k, 24, 0xF2, 0x5E, 0xD0, 0xBA);
+       CALC_K (k, 26, 0x8B, 0xAE, 0x30, 0x5B);
+       CALC_K (k, 28, 0x84, 0x8A, 0x54, 0x00);
+       CALC_K (k, 30, 0xDF, 0xBC, 0x23, 0x9D);
+    }
+
+    return 0;
+}
+
+static int
+twofish_setkey (void *ctx, const byte *key, unsigned int keylen)
+{
+    int rc = do_twofish_setkey (ctx, key, keylen);
+    burn_stack (23+6*sizeof(void*));
+    return rc;
+}
+        
+
+\f
+/* Macros to compute the g() function in the encryption and decryption
+ * rounds.  G1 is the straight g() function; G2 includes the 8-bit
+ * rotation for the high 32-bit word. */
+
+#define G1(a) \
+     (ctx->s[0][(a) & 0xFF]) ^ (ctx->s[1][((a) >> 8) & 0xFF]) \
+   ^ (ctx->s[2][((a) >> 16) & 0xFF]) ^ (ctx->s[3][(a) >> 24])
+
+#define G2(b) \
+     (ctx->s[1][(b) & 0xFF]) ^ (ctx->s[2][((b) >> 8) & 0xFF]) \
+   ^ (ctx->s[3][((b) >> 16) & 0xFF]) ^ (ctx->s[0][(b) >> 24])
+
+/* Encryption and decryption Feistel rounds.  Each one calls the two g()
+ * macros, does the PHT, and performs the XOR and the appropriate bit
+ * rotations.  The parameters are the round number (used to select subkeys),
+ * and the four 32-bit chunks of the text. */
+
+#define ENCROUND(n, a, b, c, d) \
+   x = G1 (a); y = G2 (b); \
+   x += y; y += x + ctx->k[2 * (n) + 1]; \
+   (c) ^= x + ctx->k[2 * (n)]; \
+   (c) = ((c) >> 1) + ((c) << 31); \
+   (d) = (((d) << 1)+((d) >> 31)) ^ y
+
+#define DECROUND(n, a, b, c, d) \
+   x = G1 (a); y = G2 (b); \
+   x += y; y += x; \
+   (d) ^= y + ctx->k[2 * (n) + 1]; \
+   (d) = ((d) >> 1) + ((d) << 31); \
+   (c) = (((c) << 1)+((c) >> 31)); \
+   (c) ^= (x + ctx->k[2 * (n)])
+
+/* Encryption and decryption cycles; each one is simply two Feistel rounds
+ * with the 32-bit chunks re-ordered to simulate the "swap" */
+
+#define ENCCYCLE(n) \
+   ENCROUND (2 * (n), a, b, c, d); \
+   ENCROUND (2 * (n) + 1, c, d, a, b)
+
+#define DECCYCLE(n) \
+   DECROUND (2 * (n) + 1, c, d, a, b); \
+   DECROUND (2 * (n), a, b, c, d)
+
+/* Macros to convert the input and output bytes into 32-bit words,
+ * and simultaneously perform the whitening step.  INPACK packs word
+ * number n into the variable named by x, using whitening subkey number m.
+ * OUTUNPACK unpacks word number n from the variable named by x, using
+ * whitening subkey number m. */
+
+#define INPACK(n, x, m) \
+   x = in[4 * (n)] ^ (in[4 * (n) + 1] << 8) \
+     ^ (in[4 * (n) + 2] << 16) ^ (in[4 * (n) + 3] << 24) ^ ctx->w[m]
+
+#define OUTUNPACK(n, x, m) \
+   x ^= ctx->w[m]; \
+   out[4 * (n)] = x; out[4 * (n) + 1] = x >> 8; \
+   out[4 * (n) + 2] = x >> 16; out[4 * (n) + 3] = x >> 24
+\f
+/* Encrypt one block.  in and out may be the same. */
+
+static void
+do_twofish_encrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
+{
+   /* The four 32-bit chunks of the text. */
+   u32 a, b, c, d;
+
+   /* Temporaries used by the round function. */
+   u32 x, y;
+
+   /* Input whitening and packing. */
+   INPACK (0, a, 0);
+   INPACK (1, b, 1);
+   INPACK (2, c, 2);
+   INPACK (3, d, 3);
+
+   /* Encryption Feistel cycles. */
+   ENCCYCLE (0);
+   ENCCYCLE (1);
+   ENCCYCLE (2);
+   ENCCYCLE (3);
+   ENCCYCLE (4);
+   ENCCYCLE (5);
+   ENCCYCLE (6);
+   ENCCYCLE (7);
+
+   /* Output whitening and unpacking. */
+   OUTUNPACK (0, c, 4);
+   OUTUNPACK (1, d, 5);
+   OUTUNPACK (2, a, 6);
+   OUTUNPACK (3, b, 7);
+}
+
+static void
+twofish_encrypt (void *ctx, byte *out, const byte *in)
+{
+    do_twofish_encrypt (ctx, out, in);
+    burn_stack (24+3*sizeof (void*));
+}
+\f
+/* Decrypt one block.  in and out may be the same. */
+
+static void
+do_twofish_decrypt (const TWOFISH_context *ctx, byte *out, const byte *in)
+{
+   /* The four 32-bit chunks of the text. */
+   u32 a, b, c, d;
+
+   /* Temporaries used by the round function. */
+   u32 x, y;
+
+   /* Input whitening and packing. */
+   INPACK (0, c, 4);
+   INPACK (1, d, 5);
+   INPACK (2, a, 6);
+   INPACK (3, b, 7);
+
+   /* Encryption Feistel cycles. */
+   DECCYCLE (7);
+   DECCYCLE (6);
+   DECCYCLE (5);
+   DECCYCLE (4);
+   DECCYCLE (3);
+   DECCYCLE (2);
+   DECCYCLE (1);
+   DECCYCLE (0);
+
+   /* Output whitening and unpacking. */
+   OUTUNPACK (0, a, 0);
+   OUTUNPACK (1, b, 1);
+   OUTUNPACK (2, c, 2);
+   OUTUNPACK (3, d, 3);
+}
+
+static void
+twofish_decrypt (void *ctx, byte *out, const byte *in)
+{
+    do_twofish_decrypt (ctx, out, in);
+    burn_stack (24+3*sizeof (void*));
+}
+\f
+/* Test a single encryption and decryption with each key size. */
+
+static const char*
+selftest (void)
+{
+   TWOFISH_context ctx; /* Expanded key. */
+   byte scratch[16];   /* Encryption/decryption result buffer. */
+
+   /* Test vectors for single encryption/decryption.  Note that I am using
+    * the vectors from the Twofish paper's "known answer test", I=3 for
+    * 128-bit and I=4 for 256-bit, instead of the all-0 vectors from the
+    * "intermediate value test", because an all-0 key would trigger all the
+    * special cases in the RS matrix multiply, leaving the math untested. */
+   static const byte plaintext[16] = {
+      0xD4, 0x91, 0xDB, 0x16, 0xE7, 0xB1, 0xC3, 0x9E,
+      0x86, 0xCB, 0x08, 0x6B, 0x78, 0x9F, 0x54, 0x19
+   };
+   static const byte key[16] = {
+      0x9F, 0x58, 0x9F, 0x5C, 0xF6, 0x12, 0x2C, 0x32,
+      0xB6, 0xBF, 0xEC, 0x2F, 0x2A, 0xE8, 0xC3, 0x5A
+   };
+   static const byte ciphertext[16] = {
+      0x01, 0x9F, 0x98, 0x09, 0xDE, 0x17, 0x11, 0x85,
+      0x8F, 0xAA, 0xC3, 0xA3, 0xBA, 0x20, 0xFB, 0xC3
+   };
+   static const byte plaintext_256[16] = {
+      0x90, 0xAF, 0xE9, 0x1B, 0xB2, 0x88, 0x54, 0x4F,
+      0x2C, 0x32, 0xDC, 0x23, 0x9B, 0x26, 0x35, 0xE6
+   };
+   static const byte key_256[32] = {
+      0xD4, 0x3B, 0xB7, 0x55, 0x6E, 0xA3, 0x2E, 0x46,
+      0xF2, 0xA2, 0x82, 0xB7, 0xD4, 0x5B, 0x4E, 0x0D,
+      0x57, 0xFF, 0x73, 0x9D, 0x4D, 0xC9, 0x2C, 0x1B,
+      0xD7, 0xFC, 0x01, 0x70, 0x0C, 0xC8, 0x21, 0x6F
+   };
+   static const byte ciphertext_256[16] = {
+      0x6C, 0xB4, 0x56, 0x1C, 0x40, 0xBF, 0x0A, 0x97,
+      0x05, 0x93, 0x1C, 0xB6, 0xD4, 0x08, 0xE7, 0xFA
+   };
+
+   twofish_setkey (&ctx, key, sizeof(key));
+   twofish_encrypt (&ctx, scratch, plaintext);
+   if (memcmp (scratch, ciphertext, sizeof (ciphertext)))
+     return "Twofish-128 test encryption failed.";
+   twofish_decrypt (&ctx, scratch, scratch);
+   if (memcmp (scratch, plaintext, sizeof (plaintext)))
+     return "Twofish-128 test decryption failed.";
+
+   twofish_setkey (&ctx, key_256, sizeof(key_256));
+   twofish_encrypt (&ctx, scratch, plaintext_256);
+   if (memcmp (scratch, ciphertext_256, sizeof (ciphertext_256)))
+     return "Twofish-256 test encryption failed.";
+   twofish_decrypt (&ctx, scratch, scratch);
+   if (memcmp (scratch, plaintext_256, sizeof (plaintext_256)))
+     return "Twofish-256 test decryption failed.";
+
+   return NULL;
+}
+\f
+/* More complete test program. This does 1000 encryptions and decryptions
+ * with each of 250 128-bit keys and 2000 encryptions and decryptions with
+ * each of 125 256-bit keys, using a feedback scheme similar to a Feistel
+ * cipher, so as to be sure of testing all the table entries pretty
+ * thoroughly. We keep changing the keys so as to get a more meaningful
+ * performance number, since the key setup is non-trivial for Twofish. */
+
+#ifdef TEST
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+int
+main()
+{
+   TWOFISH_context ctx;     /* Expanded key. */
+   int i, j;               /* Loop counters. */
+
+   const char *encrypt_msg; /* Message to print regarding encryption test;
+                            * the printf is done outside the loop to avoid
+                            * stuffing up the timing. */
+   clock_t timer; /* For computing elapsed time. */
+
+   /* Test buffer. */
+   byte buffer[4][16] = {
+      {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+       0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},
+      {0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78,
+       0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2 ,0xE1, 0xF0},
+      {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54 ,0x32, 0x10},
+      {0x01, 0x23, 0x45, 0x67, 0x76, 0x54 ,0x32, 0x10,
+       0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98}
+   };
+
+   /* Expected outputs for the million-operation test */
+   static const byte test_encrypt[4][16] = {
+      {0xC8, 0x23, 0xB8, 0xB7, 0x6B, 0xFE, 0x91, 0x13,
+       0x2F, 0xA7, 0x5E, 0xE6, 0x94, 0x77, 0x6F, 0x6B},
+      {0x90, 0x36, 0xD8, 0x29, 0xD5, 0x96, 0xC2, 0x8E,
+       0xE4, 0xFF, 0x76, 0xBC, 0xE5, 0x77, 0x88, 0x27},
+      {0xB8, 0x78, 0x69, 0xAF, 0x42, 0x8B, 0x48, 0x64,
+       0xF7, 0xE9, 0xF3, 0x9C, 0x42, 0x18, 0x7B, 0x73},
+      {0x7A, 0x88, 0xFB, 0xEB, 0x90, 0xA4, 0xB4, 0xA8,
+       0x43, 0xA3, 0x1D, 0xF1, 0x26, 0xC4, 0x53, 0x57}
+   };
+   static const byte test_decrypt[4][16] = {
+      {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+       0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF},
+      {0x0F, 0x1E, 0x2D, 0x3C, 0x4B, 0x5A, 0x69, 0x78,
+       0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2 ,0xE1, 0xF0},
+      {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54 ,0x32, 0x10},
+      {0x01, 0x23, 0x45, 0x67, 0x76, 0x54 ,0x32, 0x10,
+       0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98}
+   };
+
+   /* Start the timer ticking. */
+   timer = clock ();
+
+   /* Encryption test. */
+   for (i = 0; i < 125; i++) {
+      twofish_setkey (&ctx, buffer[0], sizeof (buffer[0]));
+      for (j = 0; j < 1000; j++)
+       twofish_encrypt (&ctx, buffer[2], buffer[2]);
+      twofish_setkey (&ctx, buffer[1], sizeof (buffer[1]));
+      for (j = 0; j < 1000; j++)
+       twofish_encrypt (&ctx, buffer[3], buffer[3]);
+      twofish_setkey (&ctx, buffer[2], sizeof (buffer[2])*2);
+      for (j = 0; j < 1000; j++) {
+       twofish_encrypt (&ctx, buffer[0], buffer[0]);
+       twofish_encrypt (&ctx, buffer[1], buffer[1]);
+      }
+   }
+   encrypt_msg = memcmp (buffer, test_encrypt, sizeof (test_encrypt)) ?
+                "encryption failure!\n" : "encryption OK!\n";
+
+   /* Decryption test. */
+   for (i = 0; i < 125; i++) {
+      twofish_setkey (&ctx, buffer[2], sizeof (buffer[2])*2);
+      for (j = 0; j < 1000; j++) {
+       twofish_decrypt (&ctx, buffer[0], buffer[0]);
+       twofish_decrypt (&ctx, buffer[1], buffer[1]);
+      }
+      twofish_setkey (&ctx, buffer[1], sizeof (buffer[1]));
+      for (j = 0; j < 1000; j++)
+       twofish_decrypt (&ctx, buffer[3], buffer[3]);
+      twofish_setkey (&ctx, buffer[0], sizeof (buffer[0]));
+      for (j = 0; j < 1000; j++)
+       twofish_decrypt (&ctx, buffer[2], buffer[2]);
+   }
+
+   /* Stop the timer, and print results. */
+   timer = clock () - timer;
+   printf (encrypt_msg);
+   printf (memcmp (buffer, test_decrypt, sizeof (test_decrypt)) ?
+          "decryption failure!\n" : "decryption OK!\n");
+   printf ("elapsed time: %.1f s.\n", (float) timer / CLOCKS_PER_SEC);
+
+   return 0;
+}
+
+#endif /* TEST */
+
+const char *
+twofish_get_info(int algo, size_t *keylen,
+                size_t *blocksize, size_t *contextsize,
+                int (**r_setkey) (void *c, const byte *key, unsigned keylen),
+                void (**r_encrypt) (void *c, byte *outbuf, const byte *inbuf),
+                void (**r_decrypt) (void *c, byte *outbuf, const byte *inbuf)
+                )
+{
+    *keylen = algo==10? 256 : 128;
+    *blocksize = 16;
+    *contextsize = sizeof (TWOFISH_context);
+
+    *r_setkey = twofish_setkey;
+    *r_encrypt = twofish_encrypt;
+    *r_decrypt = twofish_decrypt;
+
+    if( algo == 10 )
+       return "TWOFISH";
+    if (algo == 102) /* This algorithm number is assigned for
+                     * experiments, so we can use it */
+       return "TWOFISH128";
+    return NULL;
+}
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..1b76f58
--- /dev/null
@@ -0,0 +1,798 @@
+/* config.h.in.  Generated from configure.ac by autoheader.  */
+
+
+#ifndef GNUPG_CONFIG_H_INCLUDED
+#define GNUPG_CONFIG_H_INCLUDED
+
+
+/* Defined if the host has big endian byte ordering */
+#undef BIG_ENDIAN_HOST
+
+/* an Apple OSXism */
+#undef BIND_8_COMPAT
+
+/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
+   systems. This function is required for `alloca.c' support on those systems.
+   */
+#undef CRAY_STACKSEG_END
+
+/* Define to 1 if using `alloca.c'. */
+#undef C_ALLOCA
+
+/* define to disable keyserver helpers */
+#undef DISABLE_KEYSERVER_HELPERS
+
+/* define to disable exec-path for keyserver helpers */
+#undef DISABLE_KEYSERVER_PATH
+
+/* define to disable photo viewing */
+#undef DISABLE_PHOTO_VIEWER
+
+/* Define to disable regular expression support */
+#undef DISABLE_REGEX
+
+/* Define if you don't want the default EGD socket name. For details see
+   cipher/rndegd.c */
+#undef EGD_SOCKET_NAME
+
+/* Define to include gpg-agent support */
+#undef ENABLE_AGENT_SUPPORT
+
+/* Define to include OpenPGP card support */
+#undef ENABLE_CARD_SUPPORT
+
+/* Define to 1 if translation of program messages to the user's native
+   language is requested. */
+#undef ENABLE_NLS
+
+/* Define to enable SELinux support */
+#undef ENABLE_SELINUX_HACKS
+
+/* The executable file extension, if any */
+#undef EXEEXT
+
+/* if set, restrict photo-viewer to this */
+#undef FIXED_PHOTO_VIEWER
+
+/* Define to 1 if you have `alloca', as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
+   */
+#undef HAVE_ALLOCA_H
+
+/* Define to 1 if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define to 1 if you have the `asprintf' function. */
+#undef HAVE_ASPRINTF
+
+/* Define to 1 if you have the `atexit' function. */
+#undef HAVE_ATEXIT
+
+/* Define if `gethrtime(2)' does not work correctly i.e. issues a SIGILL. */
+#undef HAVE_BROKEN_GETHRTIME
+
+/* Defined if the mlock() call does not work */
+#undef HAVE_BROKEN_MLOCK
+
+/* Defined if a `byte' is typedef'd */
+#undef HAVE_BYTE_TYPEDEF
+
+/* Defined if the bz2 compression library is available */
+#undef HAVE_BZIP2
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define to 1 if you have the `ctermid' function. */
+#undef HAVE_CTERMID
+
+/* Define if the GNU dcgettext() function is already present or preinstalled.
+   */
+#undef HAVE_DCGETTEXT
+
+/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you
+   don't. */
+#undef HAVE_DECL_FEOF_UNLOCKED
+
+/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if
+   you don't. */
+#undef HAVE_DECL_FGETS_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETC_UNLOCKED
+
+/* Define to 1 if you have the declaration of `getpagesize', and to 0 if you
+   don't. */
+#undef HAVE_DECL_GETPAGESIZE
+
+/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
+   don't. */
+#undef HAVE_DECL_SYS_SIGLIST
+
+/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you
+   don't. */
+#undef HAVE_DECL__SNPRINTF
+
+/* Define to 1 if you have the declaration of `_snwprintf', and to 0 if you
+   don't. */
+#undef HAVE_DECL__SNWPRINTF
+
+/* defined if the system supports a random device */
+#undef HAVE_DEV_RANDOM
+
+/* Define to 1 if you have the <direct.h> header file. */
+#undef HAVE_DIRECT_H
+
+/* Defined when the dlopen function family is available */
+#undef HAVE_DL_DLOPEN
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* defined if we run on some of the PCDOS like systems (DOS, Windoze. OS/2)
+   with special properties like no file modes */
+#undef HAVE_DOSISH_SYSTEM
+
+/* defined if we must run on a stupid file system */
+#undef HAVE_DRIVE_LETTERS
+
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
+/* Define to 1 if you have the `fork' function. */
+#undef HAVE_FORK
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `ftruncate' function. */
+#undef HAVE_FTRUNCATE
+
+/* Define to 1 if you have the `fwprintf' function. */
+#undef HAVE_FWPRINTF
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+#undef HAVE_GETADDRINFO
+
+/* Define to 1 if you have the `getcwd' function. */
+#undef HAVE_GETCWD
+
+/* Define to 1 if you have the `getegid' function. */
+#undef HAVE_GETEGID
+
+/* Define to 1 if you have the `geteuid' function. */
+#undef HAVE_GETEUID
+
+/* Define to 1 if you have the `getgid' function. */
+#undef HAVE_GETGID
+
+/* Define if you have the `gethrtime(2)' function. */
+#undef HAVE_GETHRTIME
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define to 1 if you have the `getpagesize' function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define to 1 if you have the `getpwnam' function. */
+#undef HAVE_GETPWNAM
+
+/* Define to 1 if you have the `getpwuid' function. */
+#undef HAVE_GETPWUID
+
+/* Define to 1 if you have the `getrusage' function. */
+#undef HAVE_GETRUSAGE
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the `getuid' function. */
+#undef HAVE_GETUID
+
+/* Define if you have the iconv() function. */
+#undef HAVE_ICONV
+
+/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_INTMAX_T
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
+   declares uintmax_t. */
+#undef HAVE_INTTYPES_H_WITH_UINTMAX
+
+/* Define to 1 if you have the `isascii' function. */
+#undef HAVE_ISASCII
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+#undef HAVE_LANGINFO_H
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if you have the `ldap_get_option' function. */
+#undef HAVE_LDAP_GET_OPTION
+
+/* Define if the LDAP library supports ld_errno */
+#undef HAVE_LDAP_LD_ERRNO
+
+/* Define to 1 if you have the `ldap_set_option' function. */
+#undef HAVE_LDAP_SET_OPTION
+
+/* Define to 1 if you have the `ldap_start_tls_s' function. */
+#undef HAVE_LDAP_START_TLS_S
+
+/* Define to 1 if you have a functional curl library. */
+#undef HAVE_LIBCURL
+
+/* Define to 1 if you have a fully functional readline library. */
+#undef HAVE_LIBREADLINE
+
+/* Define to 1 if you have the `rt' library (-lrt). */
+#undef HAVE_LIBRT
+
+/* Define to 1 if you have a fully functional libusb library. */
+#undef HAVE_LIBUSB
+
+/* Define to 1 if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the 'long double' type. */
+#undef HAVE_LONG_DOUBLE
+
+/* Define if you have the 'long long' type. */
+#undef HAVE_LONG_LONG
+
+/* Define to 1 if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define to 1 if you have the `memmove' function. */
+#undef HAVE_MEMMOVE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mempcpy' function. */
+#undef HAVE_MEMPCPY
+
+/* Define to 1 if you have the `memrchr' function. */
+#undef HAVE_MEMRCHR
+
+/* Define to 1 if you have the `mkdtemp' function. */
+#undef HAVE_MKDTEMP
+
+/* Defined if the system supports an mlock() call */
+#undef HAVE_MLOCK
+
+/* Define to 1 if you have the `mmap' function. */
+#undef HAVE_MMAP
+
+/* Define to 1 if you have the `munmap' function. */
+#undef HAVE_MUNMAP
+
+/* Define to 1 if you have the `nl_langinfo' function. */
+#undef HAVE_NL_LANGINFO
+
+/* Define to 1 if you have the <nl_types.h> header file. */
+#undef HAVE_NL_TYPES_H
+
+/* Define to 1 if you have the `pipe' function. */
+#undef HAVE_PIPE
+
+/* Define to 1 if you have the `plock' function. */
+#undef HAVE_PLOCK
+
+/* Define if your printf() function supports format strings with positions. */
+#undef HAVE_POSIX_PRINTF
+
+/* Define to 1 if you have the `putenv' function. */
+#undef HAVE_PUTENV
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#undef HAVE_PWD_H
+
+/* Define to 1 if you have the `raise' function. */
+#undef HAVE_RAISE
+
+/* Define to 1 if you have the `rand' function. */
+#undef HAVE_RAND
+
+/* Define to 1 if you have the `setenv' function. */
+#undef HAVE_SETENV
+
+/* Define to 1 if you have the `setlocale' function. */
+#undef HAVE_SETLOCALE
+
+/* Define to 1 if you have the `setrlimit' function. */
+#undef HAVE_SETRLIMIT
+
+/* Define to 1 if you have the `sigaction' function. */
+#undef HAVE_SIGACTION
+
+/* Define to 1 if you have the `sigprocmask' function. */
+#undef HAVE_SIGPROCMASK
+
+/* Define to 1 if the system has the type `sigset_t'. */
+#undef HAVE_SIGSET_T
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the `stat' function. */
+#undef HAVE_STAT
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
+   uintmax_t. */
+#undef HAVE_STDINT_H_WITH_UINTMAX
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the `stpcpy' function. */
+#undef HAVE_STPCPY
+
+/* Define to 1 if you have the `strcasecmp' function. */
+#undef HAVE_STRCASECMP
+
+/* Define to 1 if you have the `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* Define to 1 if you have the `strftime' function. */
+#undef HAVE_STRFTIME
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the `strlwr' function. */
+#undef HAVE_STRLWR
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#undef HAVE_STRNCASECMP
+
+/* Define to 1 if you have the `strsep' function. */
+#undef HAVE_STRSEP
+
+/* Define to 1 if you have the `strtoul' function. */
+#undef HAVE_STRTOUL
+
+/* Define to 1 if the system has the type `struct sigaction'. */
+#undef HAVE_STRUCT_SIGACTION
+
+/* Define to 1 if you have the <sys/capability.h> header file. */
+#undef HAVE_SYS_CAPABILITY_H
+
+/* Define to 1 if you have the <sys/ipc.h> header file. */
+#undef HAVE_SYS_IPC_H
+
+/* Define to 1 if you have the <sys/mman.h> header file. */
+#undef HAVE_SYS_MMAN_H
+
+/* Define to 1 if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define to 1 if you have the <sys/shm.h> header file. */
+#undef HAVE_SYS_SHM_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the `tcgetattr' function. */
+#undef HAVE_TCGETATTR
+
+/* Define to 1 if you have the <termio.h> header file. */
+#undef HAVE_TERMIO_H
+
+/* Define to 1 if you have the `timegm' function. */
+#undef HAVE_TIMEGM
+
+/* Define to 1 if you have the `times' function. */
+#undef HAVE_TIMES
+
+/* Define to 1 if you have the `tsearch' function. */
+#undef HAVE_TSEARCH
+
+/* Defined if a `u16' is typedef'd */
+#undef HAVE_U16_TYPEDEF
+
+/* Defined if a `u32' is typedef'd */
+#undef HAVE_U32_TYPEDEF
+
+/* Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>. */
+#undef HAVE_UINTMAX_T
+
+/* Defined if a `ulong' is typedef'd */
+#undef HAVE_ULONG_TYPEDEF
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `unsetenv' function. */
+#undef HAVE_UNSETENV
+
+/* Define if you have the 'unsigned long long' type. */
+#undef HAVE_UNSIGNED_LONG_LONG
+
+/* Define to 1 if you have the `usb_get_busses' function. */
+#undef HAVE_USB_GET_BUSSES
+
+/* Defined if a `ushort' is typedef'd */
+#undef HAVE_USHORT_TYPEDEF
+
+/* Define to 1 if you have the `vfork' function. */
+#undef HAVE_VFORK
+
+/* Define to 1 if you have the <vfork.h> header file. */
+#undef HAVE_VFORK_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Defined if we run on a W32 API based system */
+#undef HAVE_W32_SYSTEM
+
+/* Define to 1 if you have the `wait4' function. */
+#undef HAVE_WAIT4
+
+/* Define to 1 if you have the `waitpid' function. */
+#undef HAVE_WAITPID
+
+/* Define if you have the 'wchar_t' type. */
+#undef HAVE_WCHAR_T
+
+/* Define to 1 if you have the `wcslen' function. */
+#undef HAVE_WCSLEN
+
+/* Define if you have the 'wint_t' type. */
+#undef HAVE_WINT_T
+
+/* Define to 1 if `fork' works. */
+#undef HAVE_WORKING_FORK
+
+/* Define to 1 if `vfork' works. */
+#undef HAVE_WORKING_VFORK
+
+/* Define to 1 if you have the `__argz_count' function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define to 1 if you have the `__argz_next' function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define to 1 if you have the `__argz_stringify' function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define to 1 if you have the `__fsetlocking' function. */
+#undef HAVE___FSETLOCKING
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define if integer division by zero raises signal SIGFPE. */
+#undef INTDIV0_RAISES_SIGFPE
+
+/* Defined if a SysV shared memory supports the LOCK flag */
+#undef IPC_HAVE_SHM_LOCK
+
+/* Defined if we can do a deferred shm release */
+#undef IPC_RMID_DEFERRED_RELEASE
+
+/* Defined if this is not a regular release */
+#undef IS_DEVELOPMENT_VERSION
+
+/* Defined if libcurl supports AsynchDNS */
+#undef LIBCURL_FEATURE_ASYNCHDNS
+
+/* Defined if libcurl supports IDN */
+#undef LIBCURL_FEATURE_IDN
+
+/* Defined if libcurl supports IPv6 */
+#undef LIBCURL_FEATURE_IPV6
+
+/* Defined if libcurl supports KRB4 */
+#undef LIBCURL_FEATURE_KRB4
+
+/* Defined if libcurl supports libz */
+#undef LIBCURL_FEATURE_LIBZ
+
+/* Defined if libcurl supports NTLM */
+#undef LIBCURL_FEATURE_NTLM
+
+/* Defined if libcurl supports SSL */
+#undef LIBCURL_FEATURE_SSL
+
+/* Defined if libcurl supports SSPI */
+#undef LIBCURL_FEATURE_SSPI
+
+/* Defined if libcurl supports DICT */
+#undef LIBCURL_PROTOCOL_DICT
+
+/* Defined if libcurl supports FILE */
+#undef LIBCURL_PROTOCOL_FILE
+
+/* Defined if libcurl supports FTP */
+#undef LIBCURL_PROTOCOL_FTP
+
+/* Defined if libcurl supports FTPS */
+#undef LIBCURL_PROTOCOL_FTPS
+
+/* Defined if libcurl supports HTTP */
+#undef LIBCURL_PROTOCOL_HTTP
+
+/* Defined if libcurl supports HTTPS */
+#undef LIBCURL_PROTOCOL_HTTPS
+
+/* Defined if libcurl supports LDAP */
+#undef LIBCURL_PROTOCOL_LDAP
+
+/* Defined if libcurl supports TELNET */
+#undef LIBCURL_PROTOCOL_TELNET
+
+/* Defined if libcurl supports TFTP */
+#undef LIBCURL_PROTOCOL_TFTP
+
+/* Defined if the host has little endian byte ordering */
+#undef LITTLE_ENDIAN_HOST
+
+/* Defined if mkdir() does not take permission flags */
+#undef MKDIR_TAKES_ONE_ARG
+
+/* defined to the name of the strong random device */
+#undef NAME_OF_DEV_RANDOM
+
+/* defined to the name of the weaker random device */
+#undef NAME_OF_DEV_URANDOM
+
+/* Define if the LDAP library requires including lber.h before ldap.h */
+#undef NEED_LBER_H
+
+/* Define to disable all external program execution */
+#undef NO_EXEC
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Size of the key and UID caches */
+#undef PK_UID_CACHE_SIZE
+
+/* A human readable text with the name of the OS */
+#undef PRINTABLE_OS_NAME
+
+/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
+#undef PRI_MACROS_BROKEN
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* The size of `uint64_t', as computed by sizeof. */
+#undef SIZEOF_UINT64_T
+
+/* The size of `unsigned int', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_INT
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of `unsigned long long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG_LONG
+
+/* The size of `unsigned short', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_SHORT
+
+/* Define as the maximum value of type 'size_t', if the system doesn't define
+   it. */
+#undef SIZE_MAX
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at runtime.
+       STACK_DIRECTION > 0 => grows toward higher addresses
+       STACK_DIRECTION < 0 => grows toward lower addresses
+       STACK_DIRECTION = 0 => direction of growth unknown */
+#undef STACK_DIRECTION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to include the AES, AES192, and AES256 ciphers */
+#undef USE_AES
+
+/* Allow to select random modules at runtime. */
+#undef USE_ALL_RANDOM_MODULES
+
+/* Define to include the BLOWFISH cipher */
+#undef USE_BLOWFISH
+
+/* define if capabilities should be used */
+#undef USE_CAPABILITIES
+
+/* Define to include the CAST5 cipher */
+#undef USE_CAST5
+
+/* define to use DNS CERT */
+#undef USE_DNS_CERT
+
+/* define to use our experimental DNS PKA */
+#undef USE_DNS_PKA
+
+/* define to use DNS SRV */
+#undef USE_DNS_SRV
+
+/* Define to enable the use of extensions */
+#undef USE_DYNAMIC_LINKING
+
+/* Define to use the new iconv based code */
+#undef USE_GNUPG_ICONV
+
+/* Define to include the IDEA cipher */
+#undef USE_IDEA
+
+/* Define if you want to use the included regex lib */
+#undef USE_INTERNAL_REGEX
+
+/* set this to limit filenames to the 8.3 format */
+#undef USE_ONLY_8DOT3
+
+/* Defined if the EGD based RNG should be used. */
+#undef USE_RNDEGD
+
+/* Defined if the /dev/random based RNG should be used. */
+#undef USE_RNDLINUX
+
+/* Defined if the default Unix RNG should be used. */
+#undef USE_RNDUNIX
+
+/* Defined if the Windows specific RNG should be used. */
+#undef USE_RNDW32
+
+/* Define to include the RSA public key algorithm */
+#undef USE_RSA
+
+/* Define to include the SHA-224 and SHA-256 digests */
+#undef USE_SHA256
+
+/* Define to include the SHA-384 and SHA-512 digests */
+#undef USE_SHA512
+
+/* define if the shared memory interface should be made available */
+#undef USE_SHM_COPROCESSING
+
+/* because the Unix gettext has too much overhead on MingW32 systems and these
+   systems lack Posix functions, we use a simplified version of gettext */
+#undef USE_SIMPLE_GETTEXT
+
+/* Define to include the TWOFISH cipher */
+#undef USE_TWOFISH
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if compiled symbols have a leading underscore */
+#undef WITH_SYMBOL_UNDERSCORE
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Enable GNU extensions on systems that have them.  */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
+
+/* Define curl_free() as free() if our version of curl lacks curl_free. */
+#undef curl_free
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+   calls it, or to nothing if 'inline' is not supported under any name.  */
+#ifndef __cplusplus
+#undef inline
+#endif
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef mode_t
+
+/* Define to `long int' if <sys/types.h> does not define. */
+#undef off_t
+
+/* Define to `int' if <sys/types.h> does not define. */
+#undef pid_t
+
+/* Define as the type of the result of subtracting two pointers, if the system
+   doesn't define it. */
+#undef ptrdiff_t
+
+/* Define to empty if the C compiler doesn't support this keyword. */
+#undef signed
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+#undef size_t
+
+/* Define to unsigned long or unsigned long long if <stdint.h> and
+   <inttypes.h> don't define. */
+#undef uintmax_t
+
+/* Define as `fork' if `vfork' does not work. */
+#undef vfork
+
+/* Define to empty if the keyword `volatile' does not work. Warning: valid
+   code using `volatile' can become incorrect without. Disable with care. */
+#undef volatile
+
+
+/* We didn't define endianness above, so get it from OS macros.  This
+is intended for making fat binary builds on OS X. */
+#if !defined(BIG_ENDIAN_HOST) && !defined(LITTLE_ENDIAN_HOST)
+#if defined(__BIG_ENDIAN__)
+#define BIG_ENDIAN_HOST 1
+#elif defined(__LITTLE_ENDIAN__)
+#define LITTLE_ENDIAN_HOST 1
+#else
+#error "No endianness found"
+#endif
+#endif
+
+#if !(defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID))
+#define EXEC_TEMPFILE_ONLY
+#endif
+
+/* This is the major version number of GnuPG so that
+   source included files can test for this. */
+#define GNUPG_MAJOR_VERSION 1
+
+#include "g10defs.h"
+
+#endif /*GNUPG_CONFIG_H_INCLUDED*/
+
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..cac9e74
--- /dev/null
+++ b/configure
@@ -0,0 +1,28530 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.60a for gnupg 1.4.6.
+#
+# Report bugs to <bug-gnupg@gnu.org>.
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+if test "x$CONFIG_SHELL" = x; then
+  if (eval ":") 2>/dev/null; then
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+
+  if test $as_have_required = yes &&    (eval ":
+(as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=\$LINENO
+  as_lineno_2=\$LINENO
+  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
+  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
+") 2> /dev/null; then
+  :
+else
+  as_candidate_shells=
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /usr/bin/posix$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  case $as_dir in
+        /*)
+          for as_base in sh bash ksh sh5; do
+            as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
+          done;;
+       esac
+done
+IFS=$as_save_IFS
+
+
+      for as_shell in $as_candidate_shells $SHELL; do
+        # Try only shells that exist, to save several forks.
+        if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+               { ("$as_shell") 2> /dev/null <<\_ASEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+:
+_ASEOF
+}; then
+  CONFIG_SHELL=$as_shell
+              as_have_required=yes
+              if { "$as_shell" 2> /dev/null <<\_ASEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+:
+(as_func_return () {
+  (exit $1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = "$1" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test $exitcode = 0) || { (exit 1); exit 1; }
+
+(
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
+
+_ASEOF
+}; then
+  break
+fi
+
+fi
+
+      done
+
+      if test "x$CONFIG_SHELL" != x; then
+  for as_var in BASH_ENV ENV
+        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+        done
+        export CONFIG_SHELL
+        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+fi
+
+
+    if test $as_have_required = no; then
+  echo This script requires a shell more modern than all the
+      echo shells that I found on your system.  Please install a
+      echo modern shell, or manually run the script under such a
+      echo shell if you do have one.
+      { (exit 1); exit 1; }
+fi
+
+
+fi
+
+fi
+
+
+
+(eval "as_func_return () {
+  (exit \$1)
+}
+as_func_success () {
+  as_func_return 0
+}
+as_func_failure () {
+  as_func_return 1
+}
+as_func_ret_success () {
+  return 0
+}
+as_func_ret_failure () {
+  return 1
+}
+
+exitcode=0
+if as_func_success; then
+  :
+else
+  exitcode=1
+  echo as_func_success failed.
+fi
+
+if as_func_failure; then
+  exitcode=1
+  echo as_func_failure succeeded.
+fi
+
+if as_func_ret_success; then
+  :
+else
+  exitcode=1
+  echo as_func_ret_success failed.
+fi
+
+if as_func_ret_failure; then
+  exitcode=1
+  echo as_func_ret_failure succeeded.
+fi
+
+if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
+  :
+else
+  exitcode=1
+  echo positional parameters were not saved.
+fi
+
+test \$exitcode = 0") || {
+  echo No shell found that supports shell functions.
+  echo Please tell autoconf@gnu.org about your system,
+  echo including any error possibly output before this
+  echo message
+}
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+# Find out whether ``test -x'' works.  Don't use a zero-byte file, as
+# systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  as_executable_p="test -x"
+else
+  as_executable_p=:
+fi
+rm -f conf$$.file
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+
+exec 7<&0 </dev/null 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Identity of this package.
+PACKAGE_NAME='gnupg'
+PACKAGE_TARNAME='gnupg'
+PACKAGE_VERSION='1.4.6'
+PACKAGE_STRING='gnupg 1.4.6'
+PACKAGE_BUGREPORT='bug-gnupg@gnu.org'
+
+ac_unique_file="g10/gpg.c"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL
+PATH_SEPARATOR
+PACKAGE_NAME
+PACKAGE_TARNAME
+PACKAGE_VERSION
+PACKAGE_STRING
+PACKAGE_BUGREPORT
+exec_prefix
+prefix
+program_transform_name
+bindir
+sbindir
+libexecdir
+datarootdir
+datadir
+sysconfdir
+sharedstatedir
+localstatedir
+includedir
+oldincludedir
+docdir
+infodir
+htmldir
+dvidir
+pdfdir
+psdir
+libdir
+localedir
+mandir
+DEFS
+ECHO_C
+ECHO_N
+ECHO_T
+LIBS
+build_alias
+host_alias
+target_alias
+build
+build_cpu
+build_vendor
+build_os
+host
+host_cpu
+host_vendor
+host_os
+INSTALL_PROGRAM
+INSTALL_SCRIPT
+INSTALL_DATA
+CYGPATH_W
+PACKAGE
+VERSION
+ACLOCAL
+AUTOCONF
+AUTOMAKE
+AUTOHEADER
+MAKEINFO
+install_sh
+STRIP
+INSTALL_STRIP_PROGRAM
+mkdir_p
+AWK
+SET_MAKE
+am__leading_dot
+AMTAR
+am__tar
+am__untar
+IDEA_O
+MAINTAINER_MODE_TRUE
+MAINTAINER_MODE_FALSE
+MAINT
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+ac_ct_CC
+EXEEXT
+OBJEXT
+DEPDIR
+am__include
+am__quote
+AMDEP_TRUE
+AMDEP_FALSE
+AMDEPBACKSLASH
+CCDEPMODE
+am__fastdepCC_TRUE
+am__fastdepCC_FALSE
+CPP
+RANLIB
+AR
+PERL
+DOCBOOK_TO_MAN
+HAVE_DOCBOOK_TO_MAN_TRUE
+HAVE_DOCBOOK_TO_MAN_FALSE
+FAQPROG
+WORKING_FAQPROG_TRUE
+WORKING_FAQPROG_FALSE
+DOCBOOK_TO_TEXI
+HAVE_DOCBOOK_TO_TEXI_TRUE
+HAVE_DOCBOOK_TO_TEXI_FALSE
+TAR
+HAVE_USTAR_TRUE
+HAVE_USTAR_FALSE
+CC_FOR_BUILD
+HAVE_DOSISH_SYSTEM_TRUE
+HAVE_DOSISH_SYSTEM_FALSE
+USE_SIMPLE_GETTEXT_TRUE
+USE_SIMPLE_GETTEXT_FALSE
+HAVE_W32_SYSTEM_TRUE
+HAVE_W32_SYSTEM_FALSE
+MPI_OPT_FLAGS
+NM
+GPGKEYS_HKP
+GPGKEYS_FINGER
+DNSLIBS
+USE_DNS_SRV_TRUE
+USE_DNS_SRV_FALSE
+GPGKEYS_LDAP
+LDAPLIBS
+LDAP_CPPFLAGS
+_libcurl_config
+LIBCURL_CPPFLAGS
+LIBCURL
+FAKE_CURL_TRUE
+FAKE_CURL_FALSE
+GPGKEYS_CURL
+SENDMAIL
+GPGKEYS_MAILTO
+MKINSTALLDIRS
+USE_NLS
+MSGFMT
+GMSGFMT
+XGETTEXT
+MSGMERGE
+GREP
+EGREP
+ALLOCA
+GLIBC21
+HAVE_POSIX_PRINTF
+HAVE_ASPRINTF
+HAVE_SNPRINTF
+HAVE_WPRINTF
+LIBICONV
+LTLIBICONV
+INTLBISON
+BUILD_INCLUDED_LIBINTL
+USE_INCLUDED_LIBINTL
+CATOBJEXT
+DATADIRNAME
+INSTOBJEXT
+GENCAT
+INTLOBJS
+INTL_LIBTOOL_SUFFIX_PREFIX
+INTLLIBS
+LIBINTL
+LTLIBINTL
+POSUB
+DLLIBS
+ENABLE_CARD_SUPPORT_TRUE
+ENABLE_CARD_SUPPORT_FALSE
+ENABLE_AGENT_SUPPORT_TRUE
+ENABLE_AGENT_SUPPORT_FALSE
+USE_SHA512_TRUE
+USE_SHA512_FALSE
+LIBOBJS
+GETOPT
+CAPLIBS
+USE_RNDLINUX_TRUE
+USE_RNDLINUX_FALSE
+USE_RNDUNIX_TRUE
+USE_RNDUNIX_FALSE
+USE_RNDEGD_TRUE
+USE_RNDEGD_FALSE
+USE_RNDW32_TRUE
+USE_RNDW32_FALSE
+MPI_EXTRA_ASM_OBJS
+MPI_SFLAGS
+USE_INTERNAL_REGEX_TRUE
+USE_INTERNAL_REGEX_FALSE
+ENABLE_LOCAL_ZLIB_TRUE
+ENABLE_LOCAL_ZLIB_FALSE
+ENABLE_BZIP2_SUPPORT_TRUE
+ENABLE_BZIP2_SUPPORT_FALSE
+ZLIBS
+_usb_config
+LIBUSB_CPPFLAGS
+LIBUSB
+LIBREADLINE
+CROSS_COMPILING_TRUE
+CROSS_COMPILING_FALSE
+NETLIBS
+W32LIBS
+CCAS
+CCASFLAGS
+NOEXECSTACK_FLAGS
+LTLIBOBJS'
+ac_subst_files=''
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+CPPFLAGS
+CPP
+CC_FOR_BUILD
+CCAS
+CCASFLAGS'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *)   ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval enable_$ac_feature=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval enable_$ac_feature=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval with_$ac_package=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval with_$ac_package=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute directory names.
+for ac_var in  exec_prefix prefix bindir sbindir libexecdir datarootdir \
+               datadir sysconfdir sharedstatedir localstatedir includedir \
+               oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+               libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; }
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  { echo "$as_me: error: Working directory cannot be determined" >&2
+   { (exit 1); exit 1; }; }
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  { echo "$as_me: error: pwd does not report name of working directory" >&2
+   { (exit 1); exit 1; }; }
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$0" ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$0" : 'X\(//\)[^/]' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+       cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+   { (exit 1); exit 1; }; }
+       pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures gnupg 1.4.6 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                         [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                         [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR          info documentation [DATAROOTDIR/info]
+  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR           man documentation [DATAROOTDIR/man]
+  --docdir=DIR           documentation root [DATAROOTDIR/doc/gnupg]
+  --htmldir=DIR          html documentation [DOCDIR]
+  --dvidir=DIR           dvi documentation [DOCDIR]
+  --pdfdir=DIR           pdf documentation [DOCDIR]
+  --psdir=DIR            ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of gnupg 1.4.6:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-static-rnd=egd|unix|linux|auto
+  --disable-dev-random    disable the use of dev random
+  --disable-asm           do not use assembler modules
+  --enable-selinux-support
+                          enable SELinux support
+  --disable-gnupg-iconv   disable the new iconv code
+  --enable-minimal        build the smallest gpg binary possible
+  --disable-card-support  disable OpenPGP card support
+  --disable-agent-support disable gpg-agent support
+  --disable-rsa           disable the RSA public key algorithm
+  --disable-idea          disable the IDEA cipher
+  --disable-cast5         disable the CAST5 cipher
+  --disable-blowfish      disable the BLOWFISH cipher
+  --disable-aes           disable the AES, AES192, and AES256 ciphers
+  --disable-twofish       disable the TWOFISH cipher
+  --disable-sha256        disable the SHA-224 and SHA-256 digests
+  --disable-sha512        disable the SHA-384 and SHA-512 digests
+  --disable-bzip2         disable the BZIP2 compression algorithm
+  --disable-exec          disable all external program execution
+  --disable-photo-viewers disable photo ID viewers
+  --disable-keyserver-helpers  disable all external keyserver support
+  --disable-ldap          disable LDAP keyserver interface only
+  --disable-hkp           disable HKP keyserver interface only
+  --disable-finger        disable finger key fetching interface only
+  --disable-generic       disable generic object key fetching interface only
+  --enable-mailto         enable email keyserver interface only
+  --disable-keyserver-path
+                          disable the exec-path option for keyserver helpers
+  --enable-key-cache=SIZE Set key cache to SIZE (default 4096)
+  --enable-maintainer-mode  enable make rules and dependencies not useful
+                         (and sometimes confusing) to the casual installer
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --disable-largefile     omit support for large files
+  --disable-dns-srv       disable the use of DNS SRV in HKP and HTTP
+  --disable-dns-pka       disable the use of PKA records in DNS
+  --disable-dns-cert      disable the use of CERT records in DNS
+  --disable-nls           do not use Native Language Support
+  --disable-rpath         do not hardcode runtime library paths
+  --disable-endian-check  disable the endian check and trust the OS provided
+                          macros
+  --disable-regex         do not handle regular expressions in trust
+                          signatures
+  --disable-optimization  disable compiler optimization
+  --enable-noexecstack    enable non executable stack support (gcc only)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-egd-socket=NAME  use NAME for the EGD socket
+  --with-photo-viewer=FIXED_VIEWER  set a fixed photo ID viewer
+  --with-included-zlib    use the zlib code included here
+  --with-capabilities     use linux capabilities default=no
+  --with-tar=PATH         look for a tar program in PATH
+  --with-ldap=DIR         look for the LDAP library in DIR
+  --with-libcurl=DIR      look for the curl library in DIR
+  --with-mailprog=NAME    use "NAME -t" for mail transport
+  --with-gnu-ld           assume the C compiler uses GNU ld default=no
+  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
+  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
+  --with-included-gettext use the GNU gettext library included here
+  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
+  --without-libintl-prefix     don't search for libintl in includedir and libdir
+  --with-included-regex   use the included GNU regex library
+  --with-zlib=DIR         use libz in DIR
+  --with-bzip2=DIR        look for bzip2 in DIR
+  --with-libusb=DIR       look for the libusb library in DIR
+  --with-readline=DIR     look for the readline library in DIR
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+  CC_FOR_BUILD
+              build system C compiler
+  CCAS        assembler compiler command (defaults to CC)
+  CCASFLAGS   assembler compiler flags (defaults to CFLAGS)
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <bug-gnupg@gnu.org>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" || continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+gnupg configure 1.4.6
+generated by GNU Autoconf 2.60a
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by gnupg $as_me 1.4.6, which was
+generated by GNU Autoconf 2.60a.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+       ac_must_keep_next=false # Got value, back to normal.
+      else
+       case $ac_arg in
+         *=* | --config-cache | -C | -disable-* | --disable-* \
+         | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+         | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+         | -with-* | --with-* | -without-* | --without-* | --x)
+           case "$ac_configure_args0 " in
+             "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+           esac
+           ;;
+         -* ) ac_must_keep_next=true ;;
+       esac
+      fi
+      ac_configure_args="$ac_configure_args '$ac_arg'"
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+       "s/'\''/'\''\\\\'\'''\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------------- ##
+## File substitutions. ##
+## ------------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+  set x "$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+else
+  set x "$ac_default_prefix/share/config.site" \
+       "$ac_default_prefix/etc/config.site"
+fi
+shift
+for ac_site_file
+do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+       { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+       { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+       { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+       ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Set development_version to yes if the minor number is odd or you
+# feel that the default check for a development version is not
+# sufficient.
+development_version=no
+
+ac_aux_dir=
+for ac_dir in scripts "$srcdir"/scripts; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in scripts \"$srcdir\"/scripts" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in scripts \"$srcdir\"/scripts" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+   { (exit 1); exit 1; }; }
+
+{ echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+if test "${ac_cv_build+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+   { (exit 1); exit 1; }; }
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+echo "$as_me: error: invalid value of canonical build" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+if test "${ac_cv_host+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+echo "$as_me: error: invalid value of canonical host" >&2;}
+   { (exit 1); exit 1; }; };;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+am__api_version="1.9"
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+           break 3
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.  echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm -f conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+  # We used to keeping the `.' as first argument, in order to
+  # allow $(mkdir_p) to be used without argument.  As in
+  #   $(mkdir_p) $(somedir)
+  # where $(somedir) is conditionally defined.  However this is wrong
+  # for two reasons:
+  #  1. if the package is installed by a user who cannot write `.'
+  #     make install will fail,
+  #  2. the above comment should most certainly read
+  #     $(mkdir_p) $(DESTDIR)$(somedir)
+  #     so it does not work when $(somedir) is undefined and
+  #     $(DESTDIR) is not.
+  #  To support the latter case, we have to write
+  #     test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+  #  so the `.' trick is pointless.
+  mkdir_p='mkdir -p --'
+else
+  # On NextStep and OpenStep, the `mkdir' command does not
+  # recognize any option.  It will interpret all options as
+  # directories to create, and then abort because `.' already
+  # exists.
+  for d in ./-p ./--version;
+  do
+    test -d $d && rmdir $d
+  done
+  # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+  if test -f "$ac_aux_dir/mkinstalldirs"; then
+    mkdir_p='$(mkinstalldirs)'
+  else
+    mkdir_p='$(install_sh) -d'
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+   test -f $srcdir/config.status; then
+  { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gnupg'
+ VERSION='1.4.6'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+
+
+       { echo "$as_me:$LINENO: autobuild project... ${PACKAGE_NAME:-$PACKAGE}" >&5
+echo "$as_me: autobuild project... ${PACKAGE_NAME:-$PACKAGE}" >&6;}
+       { echo "$as_me:$LINENO: autobuild revision... ${PACKAGE_VERSION:-$VERSION}" >&5
+echo "$as_me: autobuild revision... ${PACKAGE_VERSION:-$VERSION}" >&6;}
+       hostname=`hostname`
+       if test "$hostname"; then
+          { echo "$as_me:$LINENO: autobuild hostname... $hostname" >&5
+echo "$as_me: autobuild hostname... $hostname" >&6;}
+       fi
+
+       date=`date +%Y%m%d-%H%M%S`
+       if test "$?" != 0; then
+          date=`date`
+       fi
+       if test "$date"; then
+          { echo "$as_me:$LINENO: autobuild timestamp... $date" >&5
+echo "$as_me: autobuild timestamp... $date" >&6;}
+       fi
+
+ac_config_headers="$ac_config_headers config.h"
+
+
+
+cat >>confdefs.h <<\_ACEOF
+#define _GNU_SOURCE 1
+_ACEOF
+
+
+
+{ echo "$as_me:$LINENO: checking which random module to use" >&5
+echo $ECHO_N "checking which random module to use... $ECHO_C" >&6; }
+# Check whether --enable-static-rnd was given.
+if test "${enable_static_rnd+set}" = set; then
+  enableval=$enable_static_rnd; use_static_rnd=$enableval
+else
+  use_static_rnd=default
+fi
+
+
+if test "$use_static_rnd" = no; then
+    use_static_rnd=default
+fi
+
+case "$use_static_rnd" in
+    egd | linux | unix | default )
+      { echo "$as_me:$LINENO: result: $use_static_rnd" >&5
+echo "${ECHO_T}$use_static_rnd" >&6; }
+      ;;
+    auto )
+      { echo "$as_me:$LINENO: result: automagically selected at runtime" >&5
+echo "${ECHO_T}automagically selected at runtime" >&6; }
+      ;;
+    * )
+      { echo "$as_me:$LINENO: result: invalid argument" >&5
+echo "${ECHO_T}invalid argument" >&6; }
+      { { echo "$as_me:$LINENO: error: there is no random module rnd$use_static_rnd" >&5
+echo "$as_me: error: there is no random module rnd$use_static_rnd" >&2;}
+   { (exit 1); exit 1; }; }
+      ;;
+esac
+
+
+# Check whether --with-egd-socket was given.
+if test "${with_egd_socket+set}" = set; then
+  withval=$with_egd_socket; egd_socket_name="$withval"
+else
+  egd_socket_name=""
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define EGD_SOCKET_NAME "$egd_socket_name"
+_ACEOF
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether use of /dev/random is requested" >&5
+echo $ECHO_N "checking whether use of /dev/random is requested... $ECHO_C" >&6; }
+# Check whether --enable-dev-random was given.
+if test "${enable_dev_random+set}" = set; then
+  enableval=$enable_dev_random; try_dev_random=$enableval
+else
+  try_dev_random=yes
+fi
+
+{ echo "$as_me:$LINENO: result: $try_dev_random" >&5
+echo "${ECHO_T}$try_dev_random" >&6; }
+
+
+
+{ echo "$as_me:$LINENO: checking whether assembler modules are requested" >&5
+echo $ECHO_N "checking whether assembler modules are requested... $ECHO_C" >&6; }
+# Check whether --enable-asm was given.
+if test "${enable_asm+set}" = set; then
+  enableval=$enable_asm; try_asm_modules=$enableval
+else
+  try_asm_modules=yes
+fi
+
+{ echo "$as_me:$LINENO: result: $try_asm_modules" >&5
+echo "${ECHO_T}$try_asm_modules" >&6; }
+
+
+# SELinux support includes tracking of sensitive files to avoid
+# leaking their contents through processing these files by gpg itself
+{ echo "$as_me:$LINENO: checking whether SELinux support is requested" >&5
+echo $ECHO_N "checking whether SELinux support is requested... $ECHO_C" >&6; }
+# Check whether --enable-selinux-support was given.
+if test "${enable_selinux_support+set}" = set; then
+  enableval=$enable_selinux_support; selinux_support=$enableval
+else
+  selinux_support=no
+fi
+
+{ echo "$as_me:$LINENO: result: $selinux_support" >&5
+echo "${ECHO_T}$selinux_support" >&6; }
+
+
+{ echo "$as_me:$LINENO: checking whether the new iconv based code is requested" >&5
+echo $ECHO_N "checking whether the new iconv based code is requested... $ECHO_C" >&6; }
+# Check whether --enable-gnupg-iconv was given.
+if test "${enable_gnupg_iconv+set}" = set; then
+  enableval=$enable_gnupg_iconv; gnupg_use_iconv=$enableval
+else
+  gnupg_use_iconv=yes
+fi
+
+{ echo "$as_me:$LINENO: result: $gnupg_use_iconv" >&5
+echo "${ECHO_T}$gnupg_use_iconv" >&6; }
+
+
+try_extensions=no
+
+try_gettext=yes
+try_dns=yes
+use_rsa=yes
+use_idea=yes
+use_cast5=yes
+use_blowfish=yes
+use_aes=yes
+use_twofish=yes
+use_sha256=yes
+use_sha512=yes
+use_bzip2=yes
+use_exec=yes
+card_support=yes
+agent_support=yes
+disable_keyserver_path=no
+
+# Check whether --enable-minimal was given.
+if test "${enable_minimal+set}" = set; then
+  enableval=$enable_minimal; try_gettext=no
+   try_dns=no
+   use_rsa=no
+   use_idea=no
+   use_cast5=no
+   use_blowfish=no
+   use_aes=no
+   use_twofish=no
+   use_sha256=no
+   use_sha512=no
+   use_bzip2=no
+   use_exec=no
+   card_support=no
+   agent_support=no
+fi
+
+
+
+{ echo "$as_me:$LINENO: checking whether OpenPGP card support is requested" >&5
+echo $ECHO_N "checking whether OpenPGP card support is requested... $ECHO_C" >&6; }
+# Check whether --enable-card-support was given.
+if test "${enable_card_support+set}" = set; then
+  enableval=$enable_card_support; card_support=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $card_support" >&5
+echo "${ECHO_T}$card_support" >&6; }
+
+
+# Note that we may later disable the agent support based on the platform.
+{ echo "$as_me:$LINENO: checking whether gpg-agent support is requested" >&5
+echo $ECHO_N "checking whether gpg-agent support is requested... $ECHO_C" >&6; }
+# Check whether --enable-agent-support was given.
+if test "${enable_agent_support+set}" = set; then
+  enableval=$enable_agent_support; agent_support=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $agent_support" >&5
+echo "${ECHO_T}$agent_support" >&6; }
+
+
+{ echo "$as_me:$LINENO: checking whether to enable the RSA public key algorithm" >&5
+echo $ECHO_N "checking whether to enable the RSA public key algorithm... $ECHO_C" >&6; }
+# Check whether --enable-rsa was given.
+if test "${enable_rsa+set}" = set; then
+  enableval=$enable_rsa; use_rsa=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_rsa" >&5
+echo "${ECHO_T}$use_rsa" >&6; }
+if test x"$use_rsa" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_RSA 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the IDEA cipher" >&5
+echo $ECHO_N "checking whether to enable the IDEA cipher... $ECHO_C" >&6; }
+# Check whether --enable-idea was given.
+if test "${enable_idea+set}" = set; then
+  enableval=$enable_idea; use_idea=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_idea" >&5
+echo "${ECHO_T}$use_idea" >&6; }
+if test x"$use_idea" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_IDEA 1
+_ACEOF
+
+
+# We don't need idea but some people claim that they need it for
+# research etc., so we allow to place an idea source code into the
+# cipher directory and statically link it if available, otherwise we
+# link to a stub.  We don't use AC_CHECK_FILE to avoid caching.
+
+   { echo "$as_me:$LINENO: checking for idea cipher module" >&5
+echo $ECHO_N "checking for idea cipher module... $ECHO_C" >&6; }
+   tmp=""
+   if test -f $srcdir/cipher/idea.c; then
+      IDEA_O=idea.o
+      tmp=idea
+   else
+      IDEA_O=idea-stub.o
+      tmp=no
+      try_extensions=yes
+   fi
+
+   { echo "$as_me:$LINENO: result: $tmp" >&5
+echo "${ECHO_T}$tmp" >&6; }
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the CAST5 cipher" >&5
+echo $ECHO_N "checking whether to enable the CAST5 cipher... $ECHO_C" >&6; }
+# Check whether --enable-cast5 was given.
+if test "${enable_cast5+set}" = set; then
+  enableval=$enable_cast5; use_cast5=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_cast5" >&5
+echo "${ECHO_T}$use_cast5" >&6; }
+if test x"$use_cast5" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_CAST5 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the BLOWFISH cipher" >&5
+echo $ECHO_N "checking whether to enable the BLOWFISH cipher... $ECHO_C" >&6; }
+# Check whether --enable-blowfish was given.
+if test "${enable_blowfish+set}" = set; then
+  enableval=$enable_blowfish; use_blowfish=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_blowfish" >&5
+echo "${ECHO_T}$use_blowfish" >&6; }
+if test x"$use_blowfish" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_BLOWFISH 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the AES ciphers" >&5
+echo $ECHO_N "checking whether to enable the AES ciphers... $ECHO_C" >&6; }
+# Check whether --enable-aes was given.
+if test "${enable_aes+set}" = set; then
+  enableval=$enable_aes; use_aes=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_aes" >&5
+echo "${ECHO_T}$use_aes" >&6; }
+if test x"$use_aes" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_AES 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the TWOFISH cipher" >&5
+echo $ECHO_N "checking whether to enable the TWOFISH cipher... $ECHO_C" >&6; }
+# Check whether --enable-twofish was given.
+if test "${enable_twofish+set}" = set; then
+  enableval=$enable_twofish; use_twofish=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_twofish" >&5
+echo "${ECHO_T}$use_twofish" >&6; }
+if test x"$use_twofish" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_TWOFISH 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the SHA-256 digest" >&5
+echo $ECHO_N "checking whether to enable the SHA-256 digest... $ECHO_C" >&6; }
+# Check whether --enable-sha256 was given.
+if test "${enable_sha256+set}" = set; then
+  enableval=$enable_sha256; use_sha256=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_sha256" >&5
+echo "${ECHO_T}$use_sha256" >&6; }
+if test x"$use_sha256" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SHA256 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking whether to enable the SHA-384 and SHA-512 digests" >&5
+echo $ECHO_N "checking whether to enable the SHA-384 and SHA-512 digests... $ECHO_C" >&6; }
+# Check whether --enable-sha512 was given.
+if test "${enable_sha512+set}" = set; then
+  enableval=$enable_sha512; use_sha512=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_sha512" >&5
+echo "${ECHO_T}$use_sha512" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether to enable the BZIP2 compression algorithm" >&5
+echo $ECHO_N "checking whether to enable the BZIP2 compression algorithm... $ECHO_C" >&6; }
+# Check whether --enable-bzip2 was given.
+if test "${enable_bzip2+set}" = set; then
+  enableval=$enable_bzip2; use_bzip2=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_bzip2" >&5
+echo "${ECHO_T}$use_bzip2" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether to enable external program execution" >&5
+echo $ECHO_N "checking whether to enable external program execution... $ECHO_C" >&6; }
+# Check whether --enable-exec was given.
+if test "${enable_exec+set}" = set; then
+  enableval=$enable_exec; use_exec=$enableval
+fi
+
+{ echo "$as_me:$LINENO: result: $use_exec" >&5
+echo "${ECHO_T}$use_exec" >&6; }
+if test "$use_exec" = no ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define NO_EXEC 1
+_ACEOF
+
+fi
+
+if test "$use_exec" = yes ; then
+  { echo "$as_me:$LINENO: checking whether to enable photo ID viewing" >&5
+echo $ECHO_N "checking whether to enable photo ID viewing... $ECHO_C" >&6; }
+  # Check whether --enable-photo-viewers was given.
+if test "${enable_photo_viewers+set}" = set; then
+  enableval=$enable_photo_viewers; if test "$enableval" = no ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define DISABLE_PHOTO_VIEWER 1
+_ACEOF
+
+      fi
+else
+  enableval=yes
+fi
+
+  gnupg_cv_enable_photo_viewers=$enableval
+  { echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6; }
+
+  if test "$gnupg_cv_enable_photo_viewers" = yes ; then
+    { echo "$as_me:$LINENO: checking whether to use a fixed photo ID viewer" >&5
+echo $ECHO_N "checking whether to use a fixed photo ID viewer... $ECHO_C" >&6; }
+
+# Check whether --with-photo-viewer was given.
+if test "${with_photo_viewer+set}" = set; then
+  withval=$with_photo_viewer; if test "$withval" = yes ; then
+           withval=no
+        elif test "$withval" != no ; then
+
+cat >>confdefs.h <<_ACEOF
+#define FIXED_PHOTO_VIEWER "$withval"
+_ACEOF
+
+        fi
+else
+  withval=no
+fi
+
+    { echo "$as_me:$LINENO: result: $withval" >&5
+echo "${ECHO_T}$withval" >&6; }
+  fi
+
+  { echo "$as_me:$LINENO: checking whether to enable external keyserver helpers" >&5
+echo $ECHO_N "checking whether to enable external keyserver helpers... $ECHO_C" >&6; }
+  # Check whether --enable-keyserver-helpers was given.
+if test "${enable_keyserver_helpers+set}" = set; then
+  enableval=$enable_keyserver_helpers; if test "$enableval" = no ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define DISABLE_KEYSERVER_HELPERS 1
+_ACEOF
+
+      fi
+else
+  enableval=yes
+fi
+
+  gnupg_cv_enable_keyserver_helpers=$enableval
+  { echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6; }
+
+  if test "$gnupg_cv_enable_keyserver_helpers" = yes ; then
+    { echo "$as_me:$LINENO: checking whether LDAP keyserver support is requested" >&5
+echo $ECHO_N "checking whether LDAP keyserver support is requested... $ECHO_C" >&6; }
+    # Check whether --enable-ldap was given.
+if test "${enable_ldap+set}" = set; then
+  enableval=$enable_ldap; try_ldap=$enableval
+else
+  try_ldap=yes
+fi
+
+    { echo "$as_me:$LINENO: result: $try_ldap" >&5
+echo "${ECHO_T}$try_ldap" >&6; }
+
+    { echo "$as_me:$LINENO: checking whether HKP keyserver support is requested" >&5
+echo $ECHO_N "checking whether HKP keyserver support is requested... $ECHO_C" >&6; }
+    # Check whether --enable-hkp was given.
+if test "${enable_hkp+set}" = set; then
+  enableval=$enable_hkp; try_hkp=$enableval
+else
+  try_hkp=yes
+fi
+
+    { echo "$as_me:$LINENO: result: $try_hkp" >&5
+echo "${ECHO_T}$try_hkp" >&6; }
+
+    { echo "$as_me:$LINENO: checking whether finger key fetching support is requested" >&5
+echo $ECHO_N "checking whether finger key fetching support is requested... $ECHO_C" >&6; }
+    # Check whether --enable-finger was given.
+if test "${enable_finger+set}" = set; then
+  enableval=$enable_finger; try_finger=$enableval
+else
+  try_finger=yes
+fi
+
+    { echo "$as_me:$LINENO: result: $try_finger" >&5
+echo "${ECHO_T}$try_finger" >&6; }
+
+    { echo "$as_me:$LINENO: checking whether generic object key fetching support is requested" >&5
+echo $ECHO_N "checking whether generic object key fetching support is requested... $ECHO_C" >&6; }
+    # Check whether --enable-generic was given.
+if test "${enable_generic+set}" = set; then
+  enableval=$enable_generic; try_generic=$enableval
+else
+  try_generic=yes
+fi
+
+    { echo "$as_me:$LINENO: result: $try_generic" >&5
+echo "${ECHO_T}$try_generic" >&6; }
+
+    { echo "$as_me:$LINENO: checking whether email keyserver support is requested" >&5
+echo $ECHO_N "checking whether email keyserver support is requested... $ECHO_C" >&6; }
+    # Check whether --enable-mailto was given.
+if test "${enable_mailto+set}" = set; then
+  enableval=$enable_mailto; try_mailto=$enableval
+else
+  try_mailto=no
+fi
+
+    { echo "$as_me:$LINENO: result: $try_mailto" >&5
+echo "${ECHO_T}$try_mailto" >&6; }
+    fi
+
+    { echo "$as_me:$LINENO: checking whether keyserver exec-path is enabled" >&5
+echo $ECHO_N "checking whether keyserver exec-path is enabled... $ECHO_C" >&6; }
+    # Check whether --enable-keyserver-path was given.
+if test "${enable_keyserver_path+set}" = set; then
+  enableval=$enable_keyserver_path; if test "$enableval" = no ; then
+         disable_keyserver_path=yes
+      fi
+else
+  enableval=yes
+fi
+
+    { echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6; }
+  fi
+
+{ echo "$as_me:$LINENO: checking whether the included zlib is requested" >&5
+echo $ECHO_N "checking whether the included zlib is requested... $ECHO_C" >&6; }
+
+# Check whether --with-included-zlib was given.
+if test "${with_included_zlib+set}" = set; then
+  withval=$with_included_zlib; g10_force_zlib="$withval"
+else
+  g10_force_zlib=no
+fi
+
+{ echo "$as_me:$LINENO: result: $g10_force_zlib" >&5
+echo "${ECHO_T}$g10_force_zlib" >&6; }
+
+{ echo "$as_me:$LINENO: checking for the size of the key and uid cache" >&5
+echo $ECHO_N "checking for the size of the key and uid cache... $ECHO_C" >&6; }
+# Check whether --enable-key-cache was given.
+if test "${enable_key_cache+set}" = set; then
+  enableval=$enable_key_cache;
+else
+  enableval=4096
+fi
+
+
+if test "$enableval" = "no"; then
+   enableval=5
+elif test "$enableval" = "yes" || test "$enableval" = ""; then
+   enableval=4096
+fi
+
+key_cache_size=`echo "$enableval" | sed 's/[A-Za-z]//g'`
+
+if test "$enableval" != "$key_cache_size" || test "$key_cache_size" -lt 5; then
+   { { echo "$as_me:$LINENO: error: invalid key-cache size" >&5
+echo "$as_me: error: invalid key-cache size" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+{ echo "$as_me:$LINENO: result: $key_cache_size" >&5
+echo "${ECHO_T}$key_cache_size" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define PK_UID_CACHE_SIZE $key_cache_size
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking whether use of capabilities is requested" >&5
+echo $ECHO_N "checking whether use of capabilities is requested... $ECHO_C" >&6; }
+
+# Check whether --with-capabilities was given.
+if test "${with_capabilities+set}" = set; then
+  withval=$with_capabilities; use_capabilities="$withval"
+else
+  use_capabilities=no
+fi
+
+{ echo "$as_me:$LINENO: result: $use_capabilities" >&5
+echo "${ECHO_T}$use_capabilities" >&6; }
+
+# To avoid double inclusion of config.h which might happen at some
+# places, we add the usual double inclusion protection.
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6; }
+    # Check whether --enable-maintainer-mode was given.
+if test "${enable_maintainer_mode+set}" = set; then
+  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else
+  USE_MAINTAINER_MODE=no
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5
+echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6; }
+
+
+if test $USE_MAINTAINER_MODE = yes; then
+  MAINTAINER_MODE_TRUE=
+  MAINTAINER_MODE_FALSE='#'
+else
+  MAINTAINER_MODE_TRUE='#'
+  MAINTAINER_MODE_FALSE=
+fi
+
+  MAINT=$MAINTAINER_MODE_TRUE
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
+set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+       @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+  SET_MAKE=
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" >&2;}
+   { (exit 1); exit 1; }; }
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+missing_dir=`cd $ac_aux_dir && pwd`
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO: checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (ac_try="$ac_compiler --version >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler --version >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -v >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -v >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (ac_try="$ac_compiler -V >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compiler -V >&5") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+#
+# List of possible output files, starting from the most likely.
+# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
+# only as a last resort.  b.out is created by i960 compilers.
+ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
+#
+# The IRIX 6 linker writes into existing files which may not be
+# executable, retaining their permissions.  Remove them first so a
+# subsequent execution test works.
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { (ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+       ;;
+    [ab].out )
+       # We found the default executable, but exeext='' is most
+       # certainly right.
+       break;;
+    *.* )
+        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+       then :; else
+          ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+       fi
+       # We set ac_cv_exeext here because the later test for it is not
+       # safe: cross compilers may not add the suffix if given an `-o'
+       # argument, so we may need to know it at that point already.
+       # Even if this section looks crufty: it has the advantage of
+       # actually working.
+       break;;
+    * )
+       break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+
+{ echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6; }
+if test -z "$ac_file"; then
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+       cross_compiling=yes
+    else
+       { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+{ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
+{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6; }
+
+{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+         break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_compiler_gnu=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       CFLAGS=""
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_c_werror_flag=$ac_save_c_werror_flag
+        CFLAGS="-g"
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+if test "${ac_cv_prog_cc_c89+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+       -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_c89=$ac_arg
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6; } ;;
+  xno)
+    { echo "$as_me:$LINENO: result: unsupported" >&5
+echo "${ECHO_T}unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+       @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+   am__include=include
+   am__quote=
+   _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+      am__include=.include
+      am__quote="\""
+      _am_result=BSD
+   fi
+fi
+
+
+{ echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    case $depmode in
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+       continue
+      else
+       break
+      fi
+      ;;
+    none) break ;;
+    esac
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.
+    if depmode=$depmode \
+       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+
+
+if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                    Syntax error
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="${ac_tool_prefix}ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+  ac_ct_AR=$AR
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="ar"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  if test "x$ac_ct_AR" = x; then
+    AR=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&5
+echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
+whose name does not start with the host triplet.  If you think this
+configuration is useful to you, please write to autoconf@gnu.org." >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+else
+  AR="$ac_cv_prog_AR"
+fi
+
+# Extract the first word of ""perl"", so it can be a program name with args.
+set dummy "perl"; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_PERL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $PERL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+if test -n "$PERL"; then
+  { echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+
+        { echo "$as_me:$LINENO: checking for strerror in -lcposix" >&5
+echo $ECHO_N "checking for strerror in -lcposix... $ECHO_C" >&6; }
+if test "${ac_cv_lib_cposix_strerror+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcposix  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char strerror ();
+int
+main ()
+{
+return strerror ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_cposix_strerror=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_cposix_strerror=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_cposix_strerror" >&5
+echo "${ECHO_T}$ac_cv_lib_cposix_strerror" >&6; }
+if test $ac_cv_lib_cposix_strerror = yes; then
+  LIBS="$LIBS -lcposix"
+fi
+
+
+
+# Check whether --enable-largefile was given.
+if test "${enable_largefile+set}" = set; then
+  enableval=$enable_largefile;
+fi
+
+if test "$enable_largefile" != no; then
+
+  { echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5
+echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_largefile_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_sys_largefile_CC=no
+     if test "$GCC" != yes; then
+       ac_save_CC=$CC
+       while :; do
+        # IRIX 6.2 and later do not support large files by default,
+        # so use the C compiler's -n32 option if that helps.
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+        rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+        CC="$CC -n32"
+        rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sys_largefile_CC=' -n32'; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext
+        break
+       done
+       CC=$ac_save_CC
+       rm -f conftest.$ac_ext
+    fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6; }
+  if test "$ac_cv_sys_largefile_CC" != no; then
+    CC=$CC$ac_cv_sys_largefile_CC
+  fi
+
+  { echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_file_offset_bits+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_file_offset_bits=no
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sys_file_offset_bits=64; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5
+echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6; }
+if test "$ac_cv_sys_file_offset_bits" != no; then
+
+cat >>confdefs.h <<_ACEOF
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
+_ACEOF
+
+fi
+rm -f conftest*
+  { echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5
+echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_large_files+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_large_files=no
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+                      && LARGE_OFF_T % 2147483647 == 1)
+                     ? 1 : -1];
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sys_large_files=1; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5
+echo "${ECHO_T}$ac_cv_sys_large_files" >&6; }
+if test "$ac_cv_sys_large_files" != no; then
+
+cat >>confdefs.h <<_ACEOF
+#define _LARGE_FILES $ac_cv_sys_large_files
+_ACEOF
+
+fi
+rm -f conftest*
+fi
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+  ./ | .// | /cC/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+       if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then
+         if test $ac_prog = install &&
+           grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         elif test $ac_prog = install &&
+           grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+           # program-specific install script used by HP pwplus--don't use.
+           :
+         else
+           ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+           break 3
+         fi
+       fi
+      done
+    done
+    ;;
+esac
+done
+IFS=$as_save_IFS
+
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+# Extract the first word of "docbook-to-man", so it can be a program name with args.
+set dummy docbook-to-man; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DOCBOOK_TO_MAN+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DOCBOOK_TO_MAN"; then
+  ac_cv_prog_DOCBOOK_TO_MAN="$DOCBOOK_TO_MAN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DOCBOOK_TO_MAN="yes"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_DOCBOOK_TO_MAN" && ac_cv_prog_DOCBOOK_TO_MAN="no"
+fi
+fi
+DOCBOOK_TO_MAN=$ac_cv_prog_DOCBOOK_TO_MAN
+if test -n "$DOCBOOK_TO_MAN"; then
+  { echo "$as_me:$LINENO: result: $DOCBOOK_TO_MAN" >&5
+echo "${ECHO_T}$DOCBOOK_TO_MAN" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+
+if test "$ac_cv_prog_DOCBOOK_TO_MAN" = yes; then
+  HAVE_DOCBOOK_TO_MAN_TRUE=
+  HAVE_DOCBOOK_TO_MAN_FALSE='#'
+else
+  HAVE_DOCBOOK_TO_MAN_TRUE='#'
+  HAVE_DOCBOOK_TO_MAN_FALSE=
+fi
+
+ { echo "$as_me:$LINENO: checking for faqprog.pl" >&5
+echo $ECHO_N "checking for faqprog.pl... $ECHO_C" >&6; }
+    if faqprog.pl -V 2>/dev/null | grep '^faqprog.pl ' >/dev/null 2>&1; then
+        working_faqprog=yes
+        FAQPROG="faqprog.pl"
+    else
+       working_faqprog=no
+        FAQPROG=": "
+    fi
+    { echo "$as_me:$LINENO: result: $working_faqprog" >&5
+echo "${ECHO_T}$working_faqprog" >&6; }
+
+
+
+if test "$working_faqprog" = "yes" ; then
+  WORKING_FAQPROG_TRUE=
+  WORKING_FAQPROG_FALSE='#'
+else
+  WORKING_FAQPROG_TRUE='#'
+  WORKING_FAQPROG_FALSE=
+fi
+
+
+
+
+    # Extract the first word of "docbook2texi", so it can be a program name with args.
+set dummy docbook2texi; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_DOCBOOK_TO_TEXI+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$DOCBOOK_TO_TEXI"; then
+  ac_cv_prog_DOCBOOK_TO_TEXI="$DOCBOOK_TO_TEXI" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DOCBOOK_TO_TEXI="yes"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_DOCBOOK_TO_TEXI" && ac_cv_prog_DOCBOOK_TO_TEXI="no"
+fi
+fi
+DOCBOOK_TO_TEXI=$ac_cv_prog_DOCBOOK_TO_TEXI
+if test -n "$DOCBOOK_TO_TEXI"; then
+  { echo "$as_me:$LINENO: result: $DOCBOOK_TO_TEXI" >&5
+echo "${ECHO_T}$DOCBOOK_TO_TEXI" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    { echo "$as_me:$LINENO: checking for sgml to texi tools" >&5
+echo $ECHO_N "checking for sgml to texi tools... $ECHO_C" >&6; }
+    working_sgmltotexi=no
+    if test "$ac_cv_prog_DOCBOOK_TO_TEXI" = yes; then
+      if sgml2xml -v /dev/null 2>&1 | grep 'SP version' >/dev/null 2>&1 ; then
+            working_sgmltotexi=yes
+      fi
+    fi
+    { echo "$as_me:$LINENO: result: $working_sgmltotexi" >&5
+echo "${ECHO_T}$working_sgmltotexi" >&6; }
+
+
+if test "$working_sgmltotexi" = "yes" ; then
+  HAVE_DOCBOOK_TO_TEXI_TRUE=
+  HAVE_DOCBOOK_TO_TEXI_FALSE='#'
+else
+  HAVE_DOCBOOK_TO_TEXI_TRUE='#'
+  HAVE_DOCBOOK_TO_TEXI_FALSE=
+fi
+
+
+
+
+# Check whether --with-tar was given.
+if test "${with_tar+set}" = set; then
+  withval=$with_tar; _do_tar=$withval
+fi
+
+
+  if test x$_do_tar != xno ; then
+
+     if test x$_do_tar = x ; then
+        # Extract the first word of ""tar"", so it can be a program name with args.
+set dummy "tar"; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_TAR+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $TAR in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_TAR="$TAR" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_TAR="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+TAR=$ac_cv_path_TAR
+if test -n "$TAR"; then
+  { echo "$as_me:$LINENO: result: $TAR" >&5
+echo "${ECHO_T}$TAR" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+        _mytar=$ac_cv_path_TAR
+     fi
+
+     # Check if our tar is ustar format.  If so, it's good.  TODO: Add some
+     # code to check various options, etc, to try and create ustar
+     # format.
+
+     if test x$_mytar != x ; then
+        { echo "$as_me:$LINENO: checking whether $_mytar speaks USTAR" >&5
+echo $ECHO_N "checking whether $_mytar speaks USTAR... $ECHO_C" >&6; }
+        echo hithere > conftest.txt
+        $_mytar -cf - conftest.txt | (dd skip=257 bs=1 count=5 2>/dev/null || cat) | grep ustar > /dev/null
+        _tar_bad=$?
+        rm conftest.txt
+
+       if test x$_tar_bad = x0 ; then
+          { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       else
+          { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+       fi
+     fi
+  fi
+
+
+
+if test x$_tar_bad = x0; then
+  HAVE_USTAR_TRUE=
+  HAVE_USTAR_FALSE='#'
+else
+  HAVE_USTAR_TRUE='#'
+  HAVE_USTAR_FALSE=
+fi
+
+
+
+
+# According to a comment by Marcus Brinkman in libgpg-error, the
+# AC_PROG_CC_FOR_BUILD macro in the AC archive is broken for autoconf
+# 2.57.  Thus we use a simply use "cc" if we are cross-compiling.
+{ echo "$as_me:$LINENO: checking for cc for build" >&5
+echo $ECHO_N "checking for cc for build... $ECHO_C" >&6; }
+if test "$cross_compiling" = "yes"; then
+  CC_FOR_BUILD="${CC_FOR_BUILD-cc}"
+else
+  CC_FOR_BUILD="${CC_FOR_BUILD-$CC}"
+fi
+{ echo "$as_me:$LINENO: result: $CC_FOR_BUILD" >&5
+echo "${ECHO_T}$CC_FOR_BUILD" >&6; }
+
+
+
+
+MPI_OPT_FLAGS=""
+
+have_dosish_system=no
+need_dlopen=yes
+case "${host}" in
+    *-mingw32*)
+        # special stuff for Windoze NT
+        ac_cv_have_dev_random=no
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_ONLY_8DOT3 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DRIVE_LETTERS 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SIMPLE_GETTEXT 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_W32_SYSTEM 1
+_ACEOF
+
+        disable_keyserver_path=yes
+        have_dosish_system=yes
+        need_dlopen=no
+        try_gettext="no"
+        agent_support=no
+       use_simple_gettext=yes
+       have_w32_system=yes
+        ;;
+    i?86-emx-os2 | i?86-*-os2*emx )
+        # OS/2 with the EMX environment
+        ac_cv_have_dev_random=no
+        cat >>confdefs.h <<\_ACEOF
+#define HAVE_DRIVE_LETTERS 1
+_ACEOF
+
+        have_dosish_system=yes
+        try_gettext="no"
+        agent_support=no
+        ;;
+
+    i?86-*-msdosdjgpp*)
+        # DOS with the DJGPP environment
+        ac_cv_have_dev_random=no
+        cat >>confdefs.h <<\_ACEOF
+#define HAVE_DRIVE_LETTERS 1
+_ACEOF
+
+        have_dosish_system=yes
+        try_gettext="no"
+        agent_support=no
+        ;;
+
+    *-*-hpux*)
+        if test -z "$GCC" ; then
+            CFLAGS="$CFLAGS -Ae -D_HPUX_SOURCE"
+        fi
+        ;;
+    *-dec-osf4*)
+        if test -z "$GCC" ; then
+            # Suppress all warnings
+            # to get rid of the unsigned/signed char mismatch warnings.
+            CFLAGS="$CFLAGS -w"
+        fi
+        ;;
+    *-dec-osf5*)
+        if test -z "$GCC" ; then
+            # Use the newer compiler `-msg_disable ptrmismatch1' to
+            # get rid of the unsigned/signed char mismatch warnings.
+            # Using this may hide other pointer mismatch warnings, but
+           # it at least lets other warning classes through
+            CFLAGS="$CFLAGS -msg_disable ptrmismatch1"
+        fi
+        ;;
+    m68k-atari-mint)
+        ;;
+    *)
+       ;;
+esac
+
+if test "$have_dosish_system" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DOSISH_SYSTEM 1
+_ACEOF
+
+fi
+
+
+if test "$have_dosish_system" = yes; then
+  HAVE_DOSISH_SYSTEM_TRUE=
+  HAVE_DOSISH_SYSTEM_FALSE='#'
+else
+  HAVE_DOSISH_SYSTEM_TRUE='#'
+  HAVE_DOSISH_SYSTEM_FALSE=
+fi
+
+
+
+
+if test x"$use_simple_gettext" = xyes; then
+  USE_SIMPLE_GETTEXT_TRUE=
+  USE_SIMPLE_GETTEXT_FALSE='#'
+else
+  USE_SIMPLE_GETTEXT_TRUE='#'
+  USE_SIMPLE_GETTEXT_FALSE=
+fi
+
+
+
+if test x"$have_w32_system" = xyes; then
+  HAVE_W32_SYSTEM_TRUE=
+  HAVE_W32_SYSTEM_FALSE='#'
+else
+  HAVE_W32_SYSTEM_TRUE='#'
+  HAVE_W32_SYSTEM_FALSE=
+fi
+
+
+if test "$disable_keyserver_path" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define DISABLE_KEYSERVER_PATH 1
+_ACEOF
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6; }
+if test "${ac_cv_path_NM+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  ac_cv_path_NM="$NM"
+else
+  IFS="${IFS=   }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/nm; then
+      # Check to see if the nm accepts a BSD-compat flag.
+      # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+      #   nm: unknown option "B" ignored
+      if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+        ac_cv_path_NM="$ac_dir/nm -B"
+      elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+        ac_cv_path_NM="$ac_dir/nm -p"
+      else
+        ac_cv_path_NM="$ac_dir/nm"
+      fi
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi
+fi
+
+NM="$ac_cv_path_NM"
+{ echo "$as_me:$LINENO: result: $NM" >&5
+echo "${ECHO_T}$NM" >&6; }
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ echo "$as_me:$LINENO: checking command to parse $NM output" >&5
+echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6; }
+if test "${ac_cv_sys_global_symbol_pipe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # These are sane defaults that work on at least a few old systems.
+# {They come from Ultrix.  What could be older than Ultrix?!! ;)}
+
+# Character class describing NM global symbol codes.
+ac_symcode='[BCDEGRSTU]'
+
+# Regexp to match symbols that can be accessed directly from C.
+ac_sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+ac_symxfrm='\1 \1'
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+  ac_symcode='[BCDTU]'
+  ;;
+freebsd* | netbsd* | openbsd* | bsdi* | sunos* | cygwin32* | mingw32*)
+  ac_sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
+  ac_symxfrm='_\1 \1'
+  ;;
+irix*)
+  # Cannot use undefined symbols on IRIX because inlined functions mess us up.
+  ac_symcode='[BCDEGRST]'
+  ;;
+solaris*)
+  ac_symcode='[BDTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+  ac_symcode='[ABCDGISTUW]'
+fi
+
+case "$host_os" in
+cygwin32* | mingw32*)
+  # We do not want undefined symbols on cygwin32.  The user must
+  # arrange to define them via -l arguments.
+  ac_symcode='[ABCDGISTW]'
+  ;;
+esac
+
+# Write the raw and C identifiers.
+ac_cv_sys_global_symbol_pipe="sed -n -e 's/^.* $ac_symcode $ac_sympat$/$ac_symxfrm/p'"
+
+# Check to see that the pipe works correctly.
+ac_pipe_works=no
+cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func;return 0;}
+EOF
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Now try to grab the symbols.
+  ac_nlist=conftest.nm
+  if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$ac_nlist"; then
+
+    # Try sorting and uniquifying the output.
+    if sort "$ac_nlist" | uniq > "$ac_nlist"T; then
+      mv -f "$ac_nlist"T "$ac_nlist"
+      ac_wcout=`wc "$ac_nlist" 2>/dev/null`
+      ac_count=`echo "X$ac_wcout" | sed -e 's,^X,,' -e 's/^[    ]*\([0-9][0-9]*\).*$/\1/'`
+      (test "$ac_count" -ge 0) 2>/dev/null || ac_count=-1
+    else
+      rm -f "$ac_nlist"T
+      ac_count=-1
+    fi
+
+    # Make sure that we snagged all the symbols we need.
+    if egrep ' _?nm_test_var$' "$ac_nlist" >/dev/null; then
+      if egrep ' _?nm_test_func$' "$ac_nlist" >/dev/null; then
+        cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+       # Now generate the symbol file.
+       sed 's/^.* _\{0,1\}\(.*\)$/extern char \1;/' < "$ac_nlist" >> conftest.c
+
+        cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define __ptr_t void *
+#else
+# define __ptr_t char *
+#endif
+
+/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
+int dld_preloaded_symbol_count = $ac_count;
+
+/* The mapping between symbol names and symbols. */
+struct {
+  char *name;
+  __ptr_t address;
+}
+dld_preloaded_symbols[] =
+{
+EOF
+        sed 's/^_\{0,1\}\(.*\) _\{0,1\}\(.*\)$/  {"\1", (__ptr_t) \&\2},/' < "$ac_nlist" >> conftest.c
+        cat <<\EOF >> conftest.c
+  {0, (__ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+        # Now try linking the two files.
+        mv conftest.$ac_objext conftestm.$ac_objext
+        ac_save_LIBS="$LIBS"
+        ac_save_CFLAGS="$CFLAGS"
+        LIBS="conftestm.$ac_objext"
+        CFLAGS="$CFLAGS$no_builtin_flag"
+        if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s conftest; then
+          ac_pipe_works=yes
+        else
+          echo "configure: failed program was:" >&5
+          cat conftest.c >&5
+        fi
+        LIBS="$ac_save_LIBS"
+        CFLAGS="$ac_save_CFLAGS"
+      else
+        echo "cannot find nm_test_func in $ac_nlist" >&5
+      fi
+    else
+      echo "cannot find nm_test_var in $ac_nlist" >&5
+    fi
+  else
+    echo "cannot run $ac_cv_sys_global_symbol_pipe" >&5
+  fi
+else
+  echo "$progname: failed program was:" >&5
+  cat conftest.c >&5
+fi
+rm -rf conftest*
+
+# Do not use the global_symbol_pipe unless it works.
+test "$ac_pipe_works" = yes || ac_cv_sys_global_symbol_pipe=
+
+fi
+
+
+ac_result=yes
+if test -z "$ac_cv_sys_global_symbol_pipe"; then
+   ac_result=no
+fi
+{ echo "$as_me:$LINENO: result: $ac_result" >&5
+echo "${ECHO_T}$ac_result" >&6; }
+
+tmp_do_check="no"
+case "${host}" in
+    *-mingw32msvc*)
+        ac_cv_sys_symbol_underscore=yes
+        ;;
+    i386-emx-os2 | i345686-pc-os2*emx | i386-pc-msdosdjgpp)
+        ac_cv_sys_symbol_underscore=yes
+        ;;
+    *)
+      if test "$cross_compiling" = yes; then
+         if test "x$ac_cv_sys_symbol_underscore" = x; then
+            ac_cv_sys_symbol_underscore=yes
+         fi
+      else
+         tmp_do_check="yes"
+      fi
+       ;;
+esac
+
+if test "$tmp_do_check" = "yes"; then
+{ echo "$as_me:$LINENO: checking for _ prefix in compiled symbols" >&5
+echo $ECHO_N "checking for _ prefix in compiled symbols... $ECHO_C" >&6; }
+if test "${ac_cv_sys_symbol_underscore+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_sys_symbol_underscore=no
+cat > conftest.$ac_ext <<EOF
+void nm_test_func(){}
+int main(){nm_test_func;return 0;}
+EOF
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Now try to grab the symbols.
+  ac_nlist=conftest.nm
+  if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist\"") >&5
+  (eval $NM conftest.$ac_objext \| $ac_cv_sys_global_symbol_pipe \> $ac_nlist) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && test -s "$ac_nlist"; then
+    # See whether the symbols have a leading underscore.
+    if egrep '^_nm_test_func' "$ac_nlist" >/dev/null; then
+      ac_cv_sys_symbol_underscore=yes
+    else
+      if egrep '^nm_test_func ' "$ac_nlist" >/dev/null; then
+        :
+      else
+        echo "configure: cannot find nm_test_func in $ac_nlist" >&5
+      fi
+    fi
+  else
+    echo "configure: cannot run $ac_cv_sys_global_symbol_pipe" >&5
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.c >&5
+fi
+rm -rf conftest*
+
+fi
+
+else
+{ echo "$as_me:$LINENO: checking for _ prefix in compiled symbols" >&5
+echo $ECHO_N "checking for _ prefix in compiled symbols... $ECHO_C" >&6; }
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_symbol_underscore" >&5
+echo "${ECHO_T}$ac_cv_sys_symbol_underscore" >&6; }
+if test x$ac_cv_sys_symbol_underscore = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define WITH_SYMBOL_UNDERSCORE 1
+_ACEOF
+
+fi
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define EXEEXT "$EXEEXT"
+_ACEOF
+
+
+if test x"$try_hkp" = xyes ; then
+  GPGKEYS_HKP="gpgkeys_hkp$EXEEXT"
+
+fi
+
+if test x"$try_finger" = xyes ; then
+  GPGKEYS_FINGER="gpgkeys_finger$EXEEXT"
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6; }
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define gethostbyname innocuous_gethostbyname
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gethostbyname (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef gethostbyname
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_gethostbyname || defined __stub___gethostbyname
+choke me
+#endif
+
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_gethostbyname=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6; }
+if test $ac_cv_func_gethostbyname = yes; then
+  :
+else
+  { echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6; }
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char gethostbyname ();
+int
+main ()
+{
+return gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_nsl_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_nsl_gethostbyname=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6; }
+if test $ac_cv_lib_nsl_gethostbyname = yes; then
+  NETLIBS="-lnsl $NETLIBS"
+fi
+
+fi
+
+{ echo "$as_me:$LINENO: checking for setsockopt" >&5
+echo $ECHO_N "checking for setsockopt... $ECHO_C" >&6; }
+if test "${ac_cv_func_setsockopt+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define setsockopt to an innocuous variant, in case <limits.h> declares setsockopt.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define setsockopt innocuous_setsockopt
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char setsockopt (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef setsockopt
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char setsockopt ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_setsockopt || defined __stub___setsockopt
+choke me
+#endif
+
+int
+main ()
+{
+return setsockopt ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_setsockopt=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_setsockopt=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_setsockopt" >&5
+echo "${ECHO_T}$ac_cv_func_setsockopt" >&6; }
+if test $ac_cv_func_setsockopt = yes; then
+  :
+else
+  { echo "$as_me:$LINENO: checking for setsockopt in -lsocket" >&5
+echo $ECHO_N "checking for setsockopt in -lsocket... $ECHO_C" >&6; }
+if test "${ac_cv_lib_socket_setsockopt+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char setsockopt ();
+int
+main ()
+{
+return setsockopt ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_socket_setsockopt=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_socket_setsockopt=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_socket_setsockopt" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_setsockopt" >&6; }
+if test $ac_cv_lib_socket_setsockopt = yes; then
+  NETLIBS="-lsocket $NETLIBS"
+fi
+
+fi
+
+
+
+if test x"$try_dns" = xyes ; then
+   if test x"$try_hkp" = xyes || test x"$try_http" = xyes ; then
+      # Check whether --enable-dns-srv was given.
+if test "${enable_dns_srv+set}" = set; then
+  enableval=$enable_dns_srv; use_dns_srv=$enableval
+else
+  use_dns_srv=yes
+fi
+
+   fi
+
+   # Check whether --enable-dns-pka was given.
+if test "${enable_dns_pka+set}" = set; then
+  enableval=$enable_dns_pka; use_dns_pka=$enableval
+else
+  use_dns_pka=yes
+fi
+
+
+   # Check whether --enable-dns-cert was given.
+if test "${enable_dns_cert+set}" = set; then
+  enableval=$enable_dns_cert; use_dns_cert=$enableval
+else
+  use_dns_cert=yes
+fi
+
+fi
+
+if test x"$use_dns_pka" = xyes || test x"$use_dns_srv" = xyes || test x"$use_dns_cert" = xyes; then
+  _dns_save_libs=$LIBS
+  LIBS=""
+  # the double underscore thing is a glibc-ism?
+  { echo "$as_me:$LINENO: checking for library containing res_query" >&5
+echo $ECHO_N "checking for library containing res_query... $ECHO_C" >&6; }
+if test "${ac_cv_search_res_query+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char res_query ();
+int
+main ()
+{
+return res_query ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' resolv bind; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_res_query=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_res_query+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_res_query+set}" = set; then
+  :
+else
+  ac_cv_search_res_query=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_res_query" >&5
+echo "${ECHO_T}$ac_cv_search_res_query" >&6; }
+ac_res=$ac_cv_search_res_query
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  { echo "$as_me:$LINENO: checking for library containing __res_query" >&5
+echo $ECHO_N "checking for library containing __res_query... $ECHO_C" >&6; }
+if test "${ac_cv_search___res_query+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __res_query ();
+int
+main ()
+{
+return __res_query ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' resolv bind; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search___res_query=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search___res_query+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search___res_query+set}" = set; then
+  :
+else
+  ac_cv_search___res_query=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search___res_query" >&5
+echo "${ECHO_T}$ac_cv_search___res_query" >&6; }
+ac_res=$ac_cv_search___res_query
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  have_resolver=no
+fi
+
+fi
+
+  { echo "$as_me:$LINENO: checking for library containing dn_expand" >&5
+echo $ECHO_N "checking for library containing dn_expand... $ECHO_C" >&6; }
+if test "${ac_cv_search_dn_expand+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dn_expand ();
+int
+main ()
+{
+return dn_expand ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' resolv bind; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_dn_expand=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_dn_expand+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_dn_expand+set}" = set; then
+  :
+else
+  ac_cv_search_dn_expand=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_dn_expand" >&5
+echo "${ECHO_T}$ac_cv_search_dn_expand" >&6; }
+ac_res=$ac_cv_search_dn_expand
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  { echo "$as_me:$LINENO: checking for library containing __dn_expand" >&5
+echo $ECHO_N "checking for library containing __dn_expand... $ECHO_C" >&6; }
+if test "${ac_cv_search___dn_expand+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __dn_expand ();
+int
+main ()
+{
+return __dn_expand ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' resolv bind; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search___dn_expand=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search___dn_expand+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search___dn_expand+set}" = set; then
+  :
+else
+  ac_cv_search___dn_expand=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search___dn_expand" >&5
+echo "${ECHO_T}$ac_cv_search___dn_expand" >&6; }
+ac_res=$ac_cv_search___dn_expand
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  have_resolver=no
+fi
+
+fi
+
+  { echo "$as_me:$LINENO: checking for library containing dn_skipname" >&5
+echo $ECHO_N "checking for library containing dn_skipname... $ECHO_C" >&6; }
+if test "${ac_cv_search_dn_skipname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dn_skipname ();
+int
+main ()
+{
+return dn_skipname ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' resolv bind; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_dn_skipname=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_dn_skipname+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_dn_skipname+set}" = set; then
+  :
+else
+  ac_cv_search_dn_skipname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_dn_skipname" >&5
+echo "${ECHO_T}$ac_cv_search_dn_skipname" >&6; }
+ac_res=$ac_cv_search_dn_skipname
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  { echo "$as_me:$LINENO: checking for library containing __dn_skipname" >&5
+echo $ECHO_N "checking for library containing __dn_skipname... $ECHO_C" >&6; }
+if test "${ac_cv_search___dn_skipname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char __dn_skipname ();
+int
+main ()
+{
+return __dn_skipname ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' resolv bind; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search___dn_skipname=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search___dn_skipname+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search___dn_skipname+set}" = set; then
+  :
+else
+  ac_cv_search___dn_skipname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search___dn_skipname" >&5
+echo "${ECHO_T}$ac_cv_search___dn_skipname" >&6; }
+ac_res=$ac_cv_search___dn_skipname
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+
+else
+  have_resolver=no
+fi
+
+fi
+
+
+  if test x"$have_resolver" != xno ; then
+
+    # Make sure that the BIND 4 resolver interface is workable before
+    # enabling any code that calls it.  At some point I'll rewrite the
+    # code to use the BIND 8 resolver API.
+
+    { echo "$as_me:$LINENO: checking whether the resolver is usable" >&5
+echo $ECHO_N "checking whether the resolver is usable... $ECHO_C" >&6; }
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+int
+main ()
+{
+unsigned char answer[PACKETSZ]; res_query("foo.bar",C_IN,T_A,answer,PACKETSZ); dn_skipname(0,0); dn_expand(0,0,0,0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  have_resolver=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       have_resolver=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+    { echo "$as_me:$LINENO: result: $have_resolver" >&5
+echo "${ECHO_T}$have_resolver" >&6; }
+
+    # This is Apple-specific and somewhat bizarre as they changed the
+    # define in bind 8 for some reason.
+
+    if test x"$have_resolver" != xyes ; then
+       { echo "$as_me:$LINENO: checking whether I can make the resolver usable with BIND_8_COMPAT" >&5
+echo $ECHO_N "checking whether I can make the resolver usable with BIND_8_COMPAT... $ECHO_C" >&6; }
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define BIND_8_COMPAT
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+int
+main ()
+{
+unsigned char answer[PACKETSZ]; res_query("foo.bar",C_IN,T_A,answer,PACKETSZ); dn_skipname(0,0); dn_expand(0,0,0,0,0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  have_resolver=yes ; need_compat=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+       { echo "$as_me:$LINENO: result: $have_resolver" >&5
+echo "${ECHO_T}$have_resolver" >&6; }
+    fi
+  fi
+
+  if test x"$have_resolver" = xyes ; then
+     DNSLIBS=$LIBS
+
+     if test x"$use_dns_srv" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_DNS_SRV 1
+_ACEOF
+
+     fi
+
+     if test x"$use_dns_pka" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_DNS_PKA 1
+_ACEOF
+
+     fi
+
+     if test x"$use_dns_cert" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_DNS_CERT 1
+_ACEOF
+
+     fi
+
+     if test x"$need_compat" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define BIND_8_COMPAT 1
+_ACEOF
+
+     fi
+  else
+     use_dns_srv=no
+     use_dns_pka=no
+     use_dns_cert=no
+  fi
+
+  LIBS=$_dns_save_libs
+fi
+
+
+
+
+
+if test x"$use_dns_srv" = xyes; then
+  USE_DNS_SRV_TRUE=
+  USE_DNS_SRV_FALSE='#'
+else
+  USE_DNS_SRV_TRUE='#'
+  USE_DNS_SRV_FALSE=
+fi
+
+
+# Check for LDAP
+
+if test "$try_ldap" = yes ; then
+
+# Try and link a LDAP test program to weed out unusable LDAP
+# libraries.  -lldap [-llber [-lresolv]] is for older OpenLDAPs.
+# OpenLDAP, circa 1999, was terrible with creating weird dependencies.
+# If all else fails, the user can play guess-the-dependency by using
+# something like ./configure LDAPLIBS="-Lfoo -lbar"
+
+
+# Check whether --with-ldap was given.
+if test "${with_ldap+set}" = set; then
+  withval=$with_ldap; _ldap_with=$withval
+fi
+
+
+if test x$_ldap_with != xno ; then
+
+  if test -d "$withval" ; then
+     LDAP_CPPFLAGS="-I$withval/include"
+     LDAP_LDFLAGS="-L$withval/lib"
+  fi
+
+  _ldap_save_cppflags=$CPPFLAGS
+  CPPFLAGS="${LDAP_CPPFLAGS} ${CPPFLAGS}"
+  _ldap_save_ldflags=$LDFLAGS
+  LDFLAGS="${LDAP_LDFLAGS} ${LDFLAGS}"
+
+  for MY_LDAPLIBS in ${LDAPLIBS+"$LDAPLIBS"} "-lldap" "-lldap -llber" "-lldap -llber -lresolv" "-lwldap32"; do
+    _ldap_save_libs=$LIBS
+    LIBS="$MY_LDAPLIBS $NETLIBS $LIBS"
+
+    { echo "$as_me:$LINENO: checking whether LDAP via \"$MY_LDAPLIBS\" is present and sane" >&5
+echo $ECHO_N "checking whether LDAP via \"$MY_LDAPLIBS\" is present and sane... $ECHO_C" >&6; }
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#ifdef _WIN32
+#include <winsock2.h>
+#include <winldap.h>
+#else
+#include <ldap.h>
+#endif
+
+int
+main ()
+{
+ldap_open("foobar",1234);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_func_ldap_init=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_func_ldap_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+    { echo "$as_me:$LINENO: result: $gnupg_cv_func_ldap_init" >&5
+echo "${ECHO_T}$gnupg_cv_func_ldap_init" >&6; }
+
+    if test $gnupg_cv_func_ldap_init = no; then
+      { echo "$as_me:$LINENO: checking whether I can make LDAP be sane with lber.h" >&5
+echo $ECHO_N "checking whether I can make LDAP be sane with lber.h... $ECHO_C" >&6; }
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <lber.h>
+#include <ldap.h>
+int
+main ()
+{
+ldap_open("foobar",1234);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_func_ldaplber_init=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_func_ldaplber_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+      { echo "$as_me:$LINENO: result: $gnupg_cv_func_ldaplber_init" >&5
+echo "${ECHO_T}$gnupg_cv_func_ldaplber_init" >&6; }
+    fi
+
+    if test "$gnupg_cv_func_ldaplber_init" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define NEED_LBER_H 1
+_ACEOF
+
+    fi
+
+    if test "$gnupg_cv_func_ldap_init" = yes || \
+        test "$gnupg_cv_func_ldaplber_init" = yes ; then
+       LDAPLIBS="$LDAP_LDFLAGS $MY_LDAPLIBS"
+       GPGKEYS_LDAP="gpgkeys_ldap$EXEEXT"
+
+
+
+
+for ac_func in ldap_get_option ldap_set_option ldap_start_tls_s
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+       if test "$ac_cv_func_ldap_get_option" != yes ; then
+          { echo "$as_me:$LINENO: checking whether LDAP supports ld_errno" >&5
+echo $ECHO_N "checking whether LDAP supports ld_errno... $ECHO_C" >&6; }
+         cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ldap.h>
+int
+main ()
+{
+LDAP *ldap; ldap->ld_errno;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_func_ldap_ld_errno=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_func_ldap_ld_errno=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+          { echo "$as_me:$LINENO: result: $gnupg_cv_func_ldap_ld_errno" >&5
+echo "${ECHO_T}$gnupg_cv_func_ldap_ld_errno" >&6; }
+
+         if test "$gnupg_cv_func_ldap_ld_errno" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LDAP_LD_ERRNO 1
+_ACEOF
+
+          fi
+       fi
+    fi
+
+    LIBS=$_ldap_save_libs
+
+    if test "$GPGKEYS_LDAP" != "" ; then break; fi
+  done
+
+
+
+
+
+  CPPFLAGS=$_ldap_save_cppflags
+  LDFLAGS=$_ldap_save_ldflags
+fi
+
+fi
+
+# Check for curl.  We fake the curl API if libcurl isn't installed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-libcurl was given.
+if test "${with_libcurl+set}" = set; then
+  withval=$with_libcurl; _libcurl_with=$withval
+else
+  _libcurl_with=yes
+fi
+
+
+  if test "$_libcurl_with" != "no" ; then
+
+     for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_AWK+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+
+     _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[1]+256*A[2]+A[3]; print X;}'"
+
+     _libcurl_try_link=yes
+
+     if test -d "$_libcurl_with" ; then
+        LIBCURL_CPPFLAGS="-I$withval/include"
+        _libcurl_ldflags="-L$withval/lib"
+        # Extract the first word of ""$withval/bin/curl-config"", so it can be a program name with args.
+set dummy "$withval/bin/curl-config"; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path__libcurl_config+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $_libcurl_config in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+_libcurl_config=$ac_cv_path__libcurl_config
+if test -n "$_libcurl_config"; then
+  { echo "$as_me:$LINENO: result: $_libcurl_config" >&5
+echo "${ECHO_T}$_libcurl_config" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+     else
+       # Extract the first word of "curl-config", so it can be a program name with args.
+set dummy curl-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path__libcurl_config+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $_libcurl_config in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path__libcurl_config="$_libcurl_config" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path__libcurl_config="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+_libcurl_config=$ac_cv_path__libcurl_config
+if test -n "$_libcurl_config"; then
+  { echo "$as_me:$LINENO: result: $_libcurl_config" >&5
+echo "${ECHO_T}$_libcurl_config" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+     fi
+
+     if test x$_libcurl_config != "x" ; then
+        { echo "$as_me:$LINENO: checking for the version of libcurl" >&5
+echo $ECHO_N "checking for the version of libcurl... $ECHO_C" >&6; }
+if test "${libcurl_cv_lib_curl_version+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $2}'`
+fi
+{ echo "$as_me:$LINENO: result: $libcurl_cv_lib_curl_version" >&5
+echo "${ECHO_T}$libcurl_cv_lib_curl_version" >&6; }
+
+       _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse`
+       _libcurl_wanted=`echo 0 | $_libcurl_version_parse`
+
+        if test $_libcurl_wanted -gt 0 ; then
+          { echo "$as_me:$LINENO: checking for libcurl >= version " >&5
+echo $ECHO_N "checking for libcurl >= version ... $ECHO_C" >&6; }
+if test "${libcurl_cv_lib_version_ok+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+             if test $_libcurl_version -ge $_libcurl_wanted ; then
+                libcurl_cv_lib_version_ok=yes
+             else
+                libcurl_cv_lib_version_ok=no
+             fi
+
+fi
+{ echo "$as_me:$LINENO: result: $libcurl_cv_lib_version_ok" >&5
+echo "${ECHO_T}$libcurl_cv_lib_version_ok" >&6; }
+        fi
+
+       if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then
+           if test x"$LIBCURL_CPPFLAGS" = "x" ; then
+              LIBCURL_CPPFLAGS=`$_libcurl_config --cflags`
+           fi
+           if test x"$LIBCURL" = "x" ; then
+              LIBCURL=`$_libcurl_config --libs`
+
+              # This is so silly, but Apple actually has a bug in their
+             # curl-config script.  Fixed in Tiger, but there are still
+             # lots of Panther installs around.
+              case "${host}" in
+                 powerpc-apple-darwin7*)
+                    LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
+                 ;;
+              esac
+           fi
+
+          # All curl-config scripts support --feature
+          _libcurl_features=`$_libcurl_config --feature`
+
+           # Is it modern enough to have --protocols? (7.12.4)
+          if test $_libcurl_version -ge 461828 ; then
+              _libcurl_protocols=`$_libcurl_config --protocols`
+           fi
+       else
+           _libcurl_try_link=no
+       fi
+
+       unset _libcurl_wanted
+     fi
+
+     if test $_libcurl_try_link = yes ; then
+
+        # we didn't find curl-config, so let's see if the user-supplied
+        # link line (or failing that, "-lcurl") is enough.
+        LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"}
+
+        { echo "$as_me:$LINENO: checking whether libcurl is usable" >&5
+echo $ECHO_N "checking whether libcurl is usable... $ECHO_C" >&6; }
+if test "${libcurl_cv_lib_curl_usable+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+           _libcurl_save_cppflags=$CPPFLAGS
+           CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS"
+           _libcurl_save_libs=$LIBS
+           LIBS="$LIBCURL $LIBS"
+
+           cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <curl/curl.h>
+int
+main ()
+{
+
+/* Try and use a few common options to force a failure if we are
+   missing symbols or can't link. */
+int x;
+curl_easy_setopt(NULL,CURLOPT_URL,NULL);
+x=CURL_ERROR_SIZE;
+x=CURLOPT_WRITEFUNCTION;
+x=CURLOPT_FILE;
+x=CURLOPT_ERRORBUFFER;
+x=CURLOPT_STDERR;
+x=CURLOPT_VERBOSE;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  libcurl_cv_lib_curl_usable=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       libcurl_cv_lib_curl_usable=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+           CPPFLAGS=$_libcurl_save_cppflags
+           LIBS=$_libcurl_save_libs
+           unset _libcurl_save_cppflags
+           unset _libcurl_save_libs
+
+fi
+{ echo "$as_me:$LINENO: result: $libcurl_cv_lib_curl_usable" >&5
+echo "${ECHO_T}$libcurl_cv_lib_curl_usable" >&6; }
+
+        if test $libcurl_cv_lib_curl_usable = yes ; then
+
+          # Does curl_free() exist in this version of libcurl?
+          # If not, fake it with free()
+
+           _libcurl_save_cppflags=$CPPFLAGS
+           CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
+           _libcurl_save_libs=$LIBS
+           LIBS="$LIBS $LIBCURL"
+
+           { echo "$as_me:$LINENO: checking for curl_free" >&5
+echo $ECHO_N "checking for curl_free... $ECHO_C" >&6; }
+if test "${ac_cv_func_curl_free+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define curl_free to an innocuous variant, in case <limits.h> declares curl_free.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define curl_free innocuous_curl_free
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char curl_free (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef curl_free
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char curl_free ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_curl_free || defined __stub___curl_free
+choke me
+#endif
+
+int
+main ()
+{
+return curl_free ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_curl_free=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_curl_free=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_curl_free" >&5
+echo "${ECHO_T}$ac_cv_func_curl_free" >&6; }
+if test $ac_cv_func_curl_free = yes; then
+  :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define curl_free free
+_ACEOF
+
+fi
+
+
+           CPPFLAGS=$_libcurl_save_cppflags
+           LIBS=$_libcurl_save_libs
+           unset _libcurl_save_cppflags
+           unset _libcurl_save_libs
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBCURL 1
+_ACEOF
+
+
+
+
+           for _libcurl_feature in $_libcurl_features ; do
+             cat >>confdefs.h <<_ACEOF
+#define `echo "libcurl_feature_$_libcurl_feature" | $as_tr_cpp` 1
+_ACEOF
+
+             eval `echo "libcurl_feature_$_libcurl_feature" | $as_tr_sh`=yes
+           done
+
+          if test "x$_libcurl_protocols" = "x" ; then
+
+             # We don't have --protocols, so just assume that all
+             # protocols are available
+             _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT"
+
+             if test x$libcurl_feature_SSL = xyes ; then
+                _libcurl_protocols="$_libcurl_protocols HTTPS"
+
+                # FTPS wasn't standards-compliant until version
+                # 7.11.0
+                if test $_libcurl_version -ge 461568; then
+                   _libcurl_protocols="$_libcurl_protocols FTPS"
+                fi
+             fi
+          fi
+
+          for _libcurl_protocol in $_libcurl_protocols ; do
+             cat >>confdefs.h <<_ACEOF
+#define `echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_cpp` 1
+_ACEOF
+
+             eval `echo "libcurl_protocol_$_libcurl_protocol" | $as_tr_sh`=yes
+           done
+       else
+          unset LIBCURL
+          unset LIBCURL_CPPFLAGS
+        fi
+     fi
+
+     unset _libcurl_try_link
+     unset _libcurl_version_parse
+     unset _libcurl_config
+     unset _libcurl_feature
+     unset _libcurl_features
+     unset _libcurl_protocol
+     unset _libcurl_protocols
+     unset _libcurl_version
+     unset _libcurl_ldflags
+  fi
+
+  if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then
+     # This is the IF-NO path
+     fake_curl=yes
+  else
+     # This is the IF-YES path
+     :
+  fi
+
+  unset _libcurl_with
+
+
+
+if test x"$fake_curl" = xyes; then
+  FAKE_CURL_TRUE=
+  FAKE_CURL_FALSE='#'
+else
+  FAKE_CURL_TRUE='#'
+  FAKE_CURL_FALSE=
+fi
+
+
+# Generic, for us, means curl
+
+if test x"$try_generic" = xyes ; then
+   GPGKEYS_CURL="gpgkeys_curl$EXEEXT"
+
+fi
+
+
+if test "$try_mailto" = yes ; then
+
+# Check whether --with-mailprog was given.
+if test "${with_mailprog+set}" = set; then
+  withval=$with_mailprog;
+else
+  with_mailprog=yes
+fi
+
+
+  if test "$with_mailprog" = yes ; then
+    # Extract the first word of "sendmail", so it can be a program name with args.
+set dummy sendmail; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_SENDMAIL+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $SENDMAIL in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_SENDMAIL="$SENDMAIL" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_dummy="$PATH:/usr/sbin:/usr/libexec:/usr/lib"
+for as_dir in $as_dummy
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_SENDMAIL="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+SENDMAIL=$ac_cv_path_SENDMAIL
+if test -n "$SENDMAIL"; then
+  { echo "$as_me:$LINENO: result: $SENDMAIL" >&5
+echo "${ECHO_T}$SENDMAIL" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+    if test "$ac_cv_path_SENDMAIL" ; then
+      GPGKEYS_MAILTO="gpgkeys_mailto"
+    fi
+  elif test "$with_mailprog" != no ; then
+    { echo "$as_me:$LINENO: checking for a mail transport program" >&5
+echo $ECHO_N "checking for a mail transport program... $ECHO_C" >&6; }
+    SENDMAIL=$with_mailprog
+
+    { echo "$as_me:$LINENO: result: $with_mailprog" >&5
+echo "${ECHO_T}$with_mailprog" >&6; }
+    GPGKEYS_MAILTO="gpgkeys_mailto"
+  fi
+fi
+
+
+
+case "${host}" in
+    *-mingw32*)
+        PRINTABLE_OS_NAME="MingW32"
+        ;;
+    *-*-cygwin*)
+        PRINTABLE_OS_NAME="Cygwin"
+        ;;
+    i?86-emx-os2 | i?86-*-os2*emx )
+        PRINTABLE_OS_NAME="OS/2"
+        ;;
+    i?86-*-msdosdjgpp*)
+        PRINTABLE_OS_NAME="MSDOS/DJGPP"
+        try_extensions=no
+        ;;
+    *-linux*)
+        PRINTABLE_OS_NAME="GNU/Linux"
+        ;;
+    *)
+        PRINTABLE_OS_NAME=`uname -s || echo "Unknown"`
+        ;;
+esac
+
+cat >>confdefs.h <<_ACEOF
+#define PRINTABLE_OS_NAME "$PRINTABLE_OS_NAME"
+_ACEOF
+
+
+
+#
+# 1. Set names of random devices
+#
+NAME_OF_DEV_RANDOM="/dev/random"
+NAME_OF_DEV_URANDOM="/dev/urandom"
+case "${host}" in
+    *-openbsd*)
+        NAME_OF_DEV_RANDOM="/dev/srandom"
+        NAME_OF_DEV_URANDOM="/dev/urandom"
+        ;;
+esac
+
+cat >>confdefs.h <<_ACEOF
+#define NAME_OF_DEV_RANDOM "$NAME_OF_DEV_RANDOM"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define NAME_OF_DEV_URANDOM "$NAME_OF_DEV_URANDOM"
+_ACEOF
+
+
+
+
+
+
+if test "$try_gettext" = yes; then
+
+        MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    case "$ac_aux_dir" in
+      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+    esac
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+
+
+
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
+
+
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+    rm -f messages.po
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGMERGE+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+      if test "$GMSGFMT" != ":"; then
+            if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      { echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; }
+      GMSGFMT=":"
+    fi
+  fi
+
+      if test "$XGETTEXT" != ":"; then
+            if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      { echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
+      XGETTEXT=":"
+    fi
+        rm -f messages.po
+  fi
+
+  ac_config_commands="$ac_config_commands default-1"
+
+
+
+{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Extract the first word of "grep ggrep" to use in msg output
+if test -z "$GREP"; then
+set dummy grep ggrep; ac_prog_name=$2
+if test "${ac_cv_path_GREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_GREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in grep ggrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_GREP" && $as_executable_p "$ac_path_GREP"; } || continue
+    # Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_GREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+GREP="$ac_cv_path_GREP"
+if test -z "$GREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     # Extract the first word of "egrep" to use in msg output
+if test -z "$EGREP"; then
+set dummy egrep; ac_prog_name=$2
+if test "${ac_cv_path_EGREP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_path_EGREP_found=false
+# Loop through the user's path and test for each of PROGNAME-LIST
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_prog in egrep; do
+  for ac_exec_ext in '' $ac_executable_extensions; do
+    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+    { test -f "$ac_path_EGREP" && $as_executable_p "$ac_path_EGREP"; } || continue
+    # Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    ac_count=`expr $ac_count + 1`
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+
+    $ac_path_EGREP_found && break 3
+  done
+done
+
+done
+IFS=$as_save_IFS
+
+
+fi
+
+EGREP="$ac_cv_path_EGREP"
+if test -z "$EGREP"; then
+  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+
+   fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+  { echo "$as_me:$LINENO: checking for signed" >&5
+echo $ECHO_N "checking for signed... $ECHO_C" >&6; }
+if test "${bh_cv_c_signed+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+signed char x;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  bh_cv_c_signed=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       bh_cv_c_signed=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $bh_cv_c_signed" >&5
+echo "${ECHO_T}$bh_cv_c_signed" >&6; }
+  if test $bh_cv_c_signed = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define signed
+_ACEOF
+
+  fi
+
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_inline=$ac_kw
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6; }
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+
+
+
+
+
+
+
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+                 inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_Header=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_Header=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+{ echo "$as_me:$LINENO: checking for off_t" >&5
+echo $ECHO_N "checking for off_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_off_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef off_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_off_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_off_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5
+echo "${ECHO_T}$ac_cv_type_off_t" >&6; }
+if test $ac_cv_type_off_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef size_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_size_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6; }
+if test $ac_cv_type_size_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+
+  { echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6; }
+if test "${ac_cv_type_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+long long ll = 1LL; int i = 63;
+int
+main ()
+{
+long long llmax = (long long) -1;
+     return ll << i | ll >> i | llmax / ll | llmax % ll;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_long_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_long_long=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6; }
+  if test $ac_cv_type_long_long = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_LONG 1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for long double" >&5
+echo $ECHO_N "checking for long double... $ECHO_C" >&6; }
+if test "${gt_cv_c_long_double+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$GCC" = yes; then
+       gt_cv_c_long_double=yes
+     else
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+         /* The Stardent Vistra knows sizeof(long double), but does not support it.  */
+         long double foo = 0.0;
+         /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
+         int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_c_long_double=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_c_long_double=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+     fi
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_long_double" >&5
+echo "${ECHO_T}$gt_cv_c_long_double" >&6; }
+  if test $gt_cv_c_long_double = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LONG_DOUBLE 1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for wchar_t" >&5
+echo $ECHO_N "checking for wchar_t... $ECHO_C" >&6; }
+if test "${gt_cv_c_wchar_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+       wchar_t foo = (wchar_t)'\0';
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_c_wchar_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_c_wchar_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_wchar_t" >&5
+echo "${ECHO_T}$gt_cv_c_wchar_t" >&6; }
+  if test $gt_cv_c_wchar_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WCHAR_T 1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for wint_t" >&5
+echo $ECHO_N "checking for wint_t... $ECHO_C" >&6; }
+if test "${gt_cv_c_wint_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <wchar.h>
+       wint_t foo = (wchar_t)'\0';
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_c_wint_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_c_wint_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_wint_t" >&5
+echo "${ECHO_T}$gt_cv_c_wint_t" >&6; }
+  if test $gt_cv_c_wint_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WINT_T 1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6; }
+if test "${jm_ac_cv_header_inttypes_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  jm_ac_cv_header_inttypes_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       jm_ac_cv_header_inttypes_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $jm_ac_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$jm_ac_cv_header_inttypes_h" >&6; }
+  if test $jm_ac_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H_WITH_UINTMAX 1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for stdint.h" >&5
+echo $ECHO_N "checking for stdint.h... $ECHO_C" >&6; }
+if test "${jm_ac_cv_header_stdint_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <stdint.h>
+int
+main ()
+{
+uintmax_t i = (uintmax_t) -1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  jm_ac_cv_header_stdint_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       jm_ac_cv_header_stdint_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $jm_ac_cv_header_stdint_h" >&5
+echo "${ECHO_T}$jm_ac_cv_header_stdint_h" >&6; }
+  if test $jm_ac_cv_header_stdint_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STDINT_H_WITH_UINTMAX 1
+_ACEOF
+
+  fi
+
+
+
+
+  { echo "$as_me:$LINENO: checking for intmax_t" >&5
+echo $ECHO_N "checking for intmax_t... $ECHO_C" >&6; }
+if test "${gt_cv_c_intmax_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stddef.h>
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+
+int
+main ()
+{
+intmax_t x = -1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_c_intmax_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_c_intmax_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_c_intmax_t" >&5
+echo "${ECHO_T}$gt_cv_c_intmax_t" >&6; }
+  if test $gt_cv_c_intmax_t = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_INTMAX_T 1
+_ACEOF
+
+  fi
+
+
+
+  { echo "$as_me:$LINENO: checking whether printf() supports POSIX/XSI format strings" >&5
+echo $ECHO_N "checking whether printf() supports POSIX/XSI format strings... $ECHO_C" >&6; }
+if test "${gt_cv_func_printf_posix+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+      if test "$cross_compiling" = yes; then
+
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+  notposix
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "notposix" >/dev/null 2>&1; then
+  gt_cv_func_printf_posix="guessing no"
+else
+  gt_cv_func_printf_posix="guessing yes"
+fi
+rm -f conftest*
+
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_func_printf_posix=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gt_cv_func_printf_posix=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_printf_posix" >&5
+echo "${ECHO_T}$gt_cv_func_printf_posix" >&6; }
+  case $gt_cv_func_printf_posix in
+    *yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_POSIX_PRINTF 1
+_ACEOF
+
+      ;;
+  esac
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments.  Useless!
+{ echo "$as_me:$LINENO: checking for working alloca.h" >&5
+echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; }
+if test "${ac_cv_working_alloca_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <alloca.h>
+int
+main ()
+{
+char *p = (char *) alloca (2 * sizeof (int));
+                         if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_working_alloca_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_working_alloca_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
+echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; }
+if test $ac_cv_working_alloca_h = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA_H 1
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for alloca" >&5
+echo $ECHO_N "checking for alloca... $ECHO_C" >&6; }
+if test "${ac_cv_func_alloca_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  ifdef HAVE_ALLOCA_H
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+int
+main ()
+{
+char *p = (char *) alloca (1);
+                                   if (p) return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_alloca_works=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_alloca_works=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
+echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; }
+
+if test $ac_cv_func_alloca_works = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ALLOCA 1
+_ACEOF
+
+else
+  # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+# that cause trouble.  Some versions do not even contain alloca or
+# contain a buggy version.  If you still want to use their alloca,
+# use ar to extract alloca.o from them instead of compiling alloca.c.
+
+ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
+
+cat >>confdefs.h <<\_ACEOF
+#define C_ALLOCA 1
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
+echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; }
+if test "${ac_cv_os_cray+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#if defined CRAY && ! defined CRAY2
+webecray
+#else
+wenotbecray
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "webecray" >/dev/null 2>&1; then
+  ac_cv_os_cray=yes
+else
+  ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
+echo "${ECHO_T}$ac_cv_os_cray" >&6; }
+if test $ac_cv_os_cray = yes; then
+  for ac_func in _getb67 GETB67 getb67; do
+    as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define CRAY_STACKSEG_END $ac_func
+_ACEOF
+
+    break
+fi
+
+  done
+fi
+
+{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
+echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; }
+if test "${ac_cv_c_stack_direction+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_c_stack_direction=0
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+find_stack_direction ()
+{
+  static char *addr = 0;
+  auto char dummy;
+  if (addr == 0)
+    {
+      addr = &dummy;
+      return find_stack_direction ();
+    }
+  else
+    return (&dummy > addr) ? 1 : -1;
+}
+
+int
+main ()
+{
+  return find_stack_direction () < 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_stack_direction=1
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_stack_direction=-1
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
+echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+_ACEOF
+
+
+fi
+
+
+
+for ac_header in stdlib.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_func in getpagesize
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+{ echo "$as_me:$LINENO: checking for working mmap" >&5
+echo $ECHO_N "checking for working mmap... $ECHO_C" >&6; }
+if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_mmap_fixed_mapped=no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+/* malloc might have been renamed as rpl_malloc. */
+#undef malloc
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+   Here is a matrix of mmap possibilities:
+       mmap private not fixed
+       mmap private fixed at somewhere currently unmapped
+       mmap private fixed at somewhere already mapped
+       mmap shared not fixed
+       mmap shared fixed at somewhere currently unmapped
+       mmap shared fixed at somewhere already mapped
+   For private mappings, we should verify that changes cannot be read()
+   back from the file, nor mmap's back from the file at a different
+   address.  (There have been systems where private was not correctly
+   implemented like the infamous i386 svr4.0, and systems where the
+   VM page cache was not coherent with the file system buffer cache
+   like early versions of FreeBSD and possibly contemporary NetBSD.)
+   For shared mappings, we should conversely verify that changes get
+   propagated back to all the places they're supposed to be.
+
+   Grep wants private fixed already mapped.
+   The main things grep needs to know about mmap are:
+   * does it exist and is it safe to write into the mmap'd area
+   * how to use it (BSD variants)  */
+
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
+char *malloc ();
+#endif
+
+/* This mess was copied from the GNU getpagesize.h.  */
+#ifndef HAVE_GETPAGESIZE
+/* Assume that all systems that can run configure have sys/param.h.  */
+# ifndef HAVE_SYS_PARAM_H
+#  define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+#  define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+#  ifdef HAVE_SYS_PARAM_H
+#   include <sys/param.h>
+#   ifdef EXEC_PAGESIZE
+#    define getpagesize() EXEC_PAGESIZE
+#   else /* no EXEC_PAGESIZE */
+#    ifdef NBPG
+#     define getpagesize() NBPG * CLSIZE
+#     ifndef CLSIZE
+#      define CLSIZE 1
+#     endif /* no CLSIZE */
+#    else /* no NBPG */
+#     ifdef NBPC
+#      define getpagesize() NBPC
+#     else /* no NBPC */
+#      ifdef PAGESIZE
+#       define getpagesize() PAGESIZE
+#      endif /* PAGESIZE */
+#     endif /* no NBPC */
+#    endif /* no NBPG */
+#   endif /* no EXEC_PAGESIZE */
+#  else /* no HAVE_SYS_PARAM_H */
+#   define getpagesize() 8192  /* punt totally */
+#  endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+int
+main ()
+{
+  char *data, *data2, *data3;
+  int i, pagesize;
+  int fd;
+
+  pagesize = getpagesize ();
+
+  /* First, make a file with some known garbage in it. */
+  data = (char *) malloc (pagesize);
+  if (!data)
+    return 1;
+  for (i = 0; i < pagesize; ++i)
+    *(data + i) = rand ();
+  umask (0);
+  fd = creat ("conftest.mmap", 0600);
+  if (fd < 0)
+    return 1;
+  if (write (fd, data, pagesize) != pagesize)
+    return 1;
+  close (fd);
+
+  /* Next, try to mmap the file at a fixed address which already has
+     something else allocated at it.  If we can, also make sure that
+     we see the same garbage.  */
+  fd = open ("conftest.mmap", O_RDWR);
+  if (fd < 0)
+    return 1;
+  data2 = (char *) malloc (2 * pagesize);
+  if (!data2)
+    return 1;
+  data2 += (pagesize - ((long int) data2 & (pagesize - 1))) & (pagesize - 1);
+  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
+                    MAP_PRIVATE | MAP_FIXED, fd, 0L))
+    return 1;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data2 + i))
+      return 1;
+
+  /* Finally, make sure that changes to the mapped area do not
+     percolate back to the file as seen by read().  (This is a bug on
+     some variants of i386 svr4.0.)  */
+  for (i = 0; i < pagesize; ++i)
+    *(data2 + i) = *(data2 + i) + 1;
+  data3 = (char *) malloc (pagesize);
+  if (!data3)
+    return 1;
+  if (read (fd, data3, pagesize) != pagesize)
+    return 1;
+  for (i = 0; i < pagesize; ++i)
+    if (*(data + i) != *(data3 + i))
+      return 1;
+  close (fd);
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_mmap_fixed_mapped=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_mmap_fixed_mapped" >&5
+echo "${ECHO_T}$ac_cv_func_mmap_fixed_mapped" >&6; }
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MMAP 1
+_ACEOF
+
+fi
+rm -f conftest.mmap
+
+
+    { echo "$as_me:$LINENO: checking whether we are using the GNU C Library 2.1 or newer" >&5
+echo $ECHO_N "checking whether we are using the GNU C Library 2.1 or newer... $ECHO_C" >&6; }
+if test "${ac_cv_gnu_library_2_1+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Lucky GNU user" >/dev/null 2>&1; then
+  ac_cv_gnu_library_2_1=yes
+else
+  ac_cv_gnu_library_2_1=no
+fi
+rm -f conftest*
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_gnu_library_2_1" >&5
+echo "${ECHO_T}$ac_cv_gnu_library_2_1" >&6; }
+
+    GLIBC21="$ac_cv_gnu_library_2_1"
+
+
+
+
+  { echo "$as_me:$LINENO: checking whether integer division by zero raises SIGFPE" >&5
+echo $ECHO_N "checking whether integer division by zero raises SIGFPE... $ECHO_C" >&6; }
+if test "${gt_cv_int_divbyzero_sigfpe+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+      if test "$cross_compiling" = yes; then
+
+          # Guess based on the CPU.
+          case "$host_cpu" in
+            alpha* | i3456786 | m68k | s390*)
+              gt_cv_int_divbyzero_sigfpe="guessing yes";;
+            *)
+              gt_cv_int_divbyzero_sigfpe="guessing no";;
+          esac
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (1);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_int_divbyzero_sigfpe=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gt_cv_int_divbyzero_sigfpe=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_int_divbyzero_sigfpe" >&5
+echo "${ECHO_T}$gt_cv_int_divbyzero_sigfpe" >&6; }
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+
+cat >>confdefs.h <<_ACEOF
+#define INTDIV0_RAISES_SIGFPE $value
+_ACEOF
+
+
+
+  { echo "$as_me:$LINENO: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6; }
+if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+unsigned long long ull = 1ULL; int i = 63;
+int
+main ()
+{
+unsigned long long ullmax = (unsigned long long) -1;
+     return ull << i | ull >> i | ullmax / ull | ullmax % ull;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_long_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_unsigned_long_long=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6; }
+  if test $ac_cv_type_unsigned_long_long = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UNSIGNED_LONG_LONG 1
+_ACEOF
+
+  fi
+
+
+
+
+  if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+
+    test $ac_cv_type_unsigned_long_long = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+
+cat >>confdefs.h <<_ACEOF
+#define uintmax_t $ac_type
+_ACEOF
+
+  else
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_UINTMAX_T 1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for inttypes.h" >&5
+echo $ECHO_N "checking for inttypes.h... $ECHO_C" >&6; }
+if test "${gt_cv_header_inttypes_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <inttypes.h>
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_header_inttypes_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_header_inttypes_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_header_inttypes_h" >&5
+echo "${ECHO_T}$gt_cv_header_inttypes_h" >&6; }
+  if test $gt_cv_header_inttypes_h = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INTTYPES_H 1
+_ACEOF
+
+  fi
+
+
+
+  if test $gt_cv_header_inttypes_h = yes; then
+    { echo "$as_me:$LINENO: checking whether the inttypes.h PRIxNN macros are broken" >&5
+echo $ECHO_N "checking whether the inttypes.h PRIxNN macros are broken... $ECHO_C" >&6; }
+if test "${gt_cv_inttypes_pri_broken+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_inttypes_pri_broken=no
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_inttypes_pri_broken=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_inttypes_pri_broken" >&5
+echo "${ECHO_T}$gt_cv_inttypes_pri_broken" >&6; }
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define PRI_MACROS_BROKEN 1
+_ACEOF
+
+  fi
+
+
+
+for ac_header in stdint.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+    { echo "$as_me:$LINENO: checking for SIZE_MAX" >&5
+echo $ECHO_N "checking for SIZE_MAX... $ECHO_C" >&6; }
+  result=
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "Found it" >/dev/null 2>&1; then
+  result=yes
+fi
+rm -f conftest*
+
+  if test -z "$result"; then
+                    if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 / 10) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) res_hi=$ac_lo;;
+'') result=? ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+static long int longval () { return ~(size_t)0 / 10; }
+static unsigned long int ulongval () { return ~(size_t)0 / 10; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if ((~(size_t)0 / 10) < 0)
+    {
+      long int i = longval ();
+      if (i != (~(size_t)0 / 10))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != (~(size_t)0 / 10))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  res_hi=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=?
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+    if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((~(size_t)0 % 10) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) res_lo=$ac_lo;;
+'') result=? ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+static long int longval () { return ~(size_t)0 % 10; }
+static unsigned long int ulongval () { return ~(size_t)0 % 10; }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if ((~(size_t)0 % 10) < 0)
+    {
+      long int i = longval ();
+      if (i != (~(size_t)0 % 10))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != (~(size_t)0 % 10))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  res_lo=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=?
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+    if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+int
+main ()
+{
+static int test_array [1 - 2 * !((sizeof (size_t) <= sizeof (unsigned int)) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) fits_in_uint=$ac_lo;;
+'') result=? ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+static long int longval () { return sizeof (size_t) <= sizeof (unsigned int); }
+static unsigned long int ulongval () { return sizeof (size_t) <= sizeof (unsigned int); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if ((sizeof (size_t) <= sizeof (unsigned int)) < 0)
+    {
+      long int i = longval ();
+      if (i != (sizeof (size_t) <= sizeof (unsigned int)))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != (sizeof (size_t) <= sizeof (unsigned int)))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  fits_in_uint=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+result=?
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+    if test "$fits_in_uint" = 1; then
+                  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stddef.h>
+        extern size_t foo;
+        extern unsigned long foo;
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  fits_in_uint=0
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test -z "$result"; then
+      if test "$fits_in_uint" = 1; then
+        result="$res_hi$res_lo"U
+      else
+        result="$res_hi$res_lo"UL
+      fi
+    else
+            result='~(size_t)0'
+    fi
+  fi
+  { echo "$as_me:$LINENO: result: $result" >&5
+echo "${ECHO_T}$result" >&6; }
+  if test "$result" != yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define SIZE_MAX $result
+_ACEOF
+
+  fi
+
+
+
+
+for ac_header in stdint.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+      if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | [A-Za-z]:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+else
+  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+fi
+if test "${acl_cv_path_LD+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break ;;
+      *)
+       test "$with_gnu_ld" != yes && break ;;
+      esac
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  { echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+   { (exit 1); exit 1; }; }
+{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+if test "${acl_cv_prog_gnu_ld+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes ;;
+*)
+  acl_cv_prog_gnu_ld=no ;;
+esac
+fi
+{ echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+                                                { echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; }
+if test "${acl_cv_rpath+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+
+fi
+{ echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6; }
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+    # Check whether --enable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+  enableval=$enable_rpath; :
+else
+  enable_rpath=yes
+fi
+
+
+
+
+
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+  withval=$with_libiconv_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi
+
+      LIBICONV=
+  LTLIBICONV=
+  INCICONV=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='iconv '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+              else
+                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBICONV; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+    done
+  fi
+
+
+
+
+
+
+
+
+  { echo "$as_me:$LINENO: checking for ptrdiff_t" >&5
+echo $ECHO_N "checking for ptrdiff_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_ptrdiff_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef ptrdiff_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_ptrdiff_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_ptrdiff_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_ptrdiff_t" >&5
+echo "${ECHO_T}$ac_cv_type_ptrdiff_t" >&6; }
+if test $ac_cv_type_ptrdiff_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define ptrdiff_t long
+_ACEOF
+
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+for ac_header in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for ac_func in asprintf fwprintf getcwd getegid geteuid getgid getuid \
+mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \
+strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \
+__fsetlocking
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+  { echo "$as_me:$LINENO: checking whether _snprintf is declared" >&5
+echo $ECHO_N "checking whether _snprintf is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl__snprintf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef _snprintf
+  char *p = (char *) _snprintf;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl__snprintf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl__snprintf=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl__snprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl__snprintf" >&6; }
+  if test $ac_cv_have_decl__snprintf = yes; then
+    gt_value=1
+  else
+    gt_value=0
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SNPRINTF $gt_value
+_ACEOF
+
+
+
+  { echo "$as_me:$LINENO: checking whether _snwprintf is declared" >&5
+echo $ECHO_N "checking whether _snwprintf is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl__snwprintf+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef _snwprintf
+  char *p = (char *) _snwprintf;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl__snwprintf=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl__snwprintf=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl__snwprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl__snwprintf" >&6; }
+  if test $ac_cv_have_decl__snwprintf = yes; then
+    gt_value=1
+  else
+    gt_value=0
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL__SNWPRINTF $gt_value
+_ACEOF
+
+
+
+
+  { echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5
+echo $ECHO_N "checking whether feof_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef feof_unlocked
+  char *p = (char *) feof_unlocked;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_feof_unlocked=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_feof_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_feof_unlocked" >&6; }
+  if test $ac_cv_have_decl_feof_unlocked = yes; then
+    gt_value=1
+  else
+    gt_value=0
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FEOF_UNLOCKED $gt_value
+_ACEOF
+
+
+
+  { echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5
+echo $ECHO_N "checking whether fgets_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef fgets_unlocked
+  char *p = (char *) fgets_unlocked;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_fgets_unlocked=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_fgets_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fgets_unlocked" >&6; }
+  if test $ac_cv_have_decl_fgets_unlocked = yes; then
+    gt_value=1
+  else
+    gt_value=0
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FGETS_UNLOCKED $gt_value
+_ACEOF
+
+
+
+  { echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5
+echo $ECHO_N "checking whether getc_unlocked is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+
+#ifndef getc_unlocked
+  char *p = (char *) getc_unlocked;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_getc_unlocked=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_getc_unlocked=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getc_unlocked" >&6; }
+  if test $ac_cv_have_decl_getc_unlocked = yes; then
+    gt_value=1
+  else
+    gt_value=0
+  fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETC_UNLOCKED $gt_value
+_ACEOF
+
+
+
+  case $gt_cv_func_printf_posix in
+    *yes) HAVE_POSIX_PRINTF=1 ;;
+    *) HAVE_POSIX_PRINTF=0 ;;
+  esac
+
+  if test "$ac_cv_func_asprintf" = yes; then
+    HAVE_ASPRINTF=1
+  else
+    HAVE_ASPRINTF=0
+  fi
+
+  if test "$ac_cv_func_snprintf" = yes; then
+    HAVE_SNPRINTF=1
+  else
+    HAVE_SNPRINTF=0
+  fi
+
+  if test "$ac_cv_func_wprintf" = yes; then
+    HAVE_WPRINTF=1
+  else
+    HAVE_WPRINTF=0
+  fi
+
+
+
+
+
+
+
+          am_save_CPPFLAGS="$CPPFLAGS"
+
+  for element in $INCICONV; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+
+  { echo "$as_me:$LINENO: checking for iconv" >&5
+echo $ECHO_N "checking for iconv... $ECHO_C" >&6; }
+if test "${am_cv_func_iconv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_func_iconv=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <iconv.h>
+int
+main ()
+{
+iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+      LIBS="$am_save_LIBS"
+    fi
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5
+echo "${ECHO_T}$am_cv_func_iconv" >&6; }
+  if test "$am_cv_func_iconv" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ICONV 1
+_ACEOF
+
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    { echo "$as_me:$LINENO: checking how to link with libiconv" >&5
+echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; }
+    { echo "$as_me:$LINENO: result: $LIBICONV" >&5
+echo "${ECHO_T}$LIBICONV" >&6; }
+  else
+            CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+
+
+
+  if test "$am_cv_func_iconv" = yes; then
+    { echo "$as_me:$LINENO: checking for iconv declaration" >&5
+echo $ECHO_N "checking for iconv declaration... $ECHO_C" >&6; }
+    if test "${am_cv_proto_iconv+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+      cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_proto_iconv_arg1=""
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       am_cv_proto_iconv_arg1="const"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+    am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    { echo "$as_me:$LINENO: result: ${ac_t:-
+         }$am_cv_proto_iconv" >&5
+echo "${ECHO_T}${ac_t:-
+         }$am_cv_proto_iconv" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+_ACEOF
+
+  fi
+
+
+  { echo "$as_me:$LINENO: checking for nl_langinfo and CODESET" >&5
+echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6; }
+if test "${am_cv_langinfo_codeset+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <langinfo.h>
+int
+main ()
+{
+char* cs = nl_langinfo(CODESET);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_langinfo_codeset=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       am_cv_langinfo_codeset=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_langinfo_codeset" >&5
+echo "${ECHO_T}$am_cv_langinfo_codeset" >&6; }
+  if test $am_cv_langinfo_codeset = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LANGINFO_CODESET 1
+_ACEOF
+
+  fi
+
+  if test $ac_cv_header_locale_h = yes; then
+
+  { echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5
+echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6; }
+if test "${am_cv_val_LC_MESSAGES+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <locale.h>
+int
+main ()
+{
+return LC_MESSAGES
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  am_cv_val_LC_MESSAGES=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       am_cv_val_LC_MESSAGES=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5
+echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6; }
+  if test $am_cv_val_LC_MESSAGES = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LC_MESSAGES 1
+_ACEOF
+
+  fi
+
+  fi
+
+                      for ac_prog in bison
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_prog_INTLBISON+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$INTLBISON"; then
+  ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_INTLBISON="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+fi
+fi
+INTLBISON=$ac_cv_prog_INTLBISON
+if test -n "$INTLBISON"; then
+  { echo "$as_me:$LINENO: result: $INTLBISON" >&5
+echo "${ECHO_T}$INTLBISON" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+  test -n "$INTLBISON" && break
+done
+
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+        { echo "$as_me:$LINENO: checking version of bison" >&5
+echo $ECHO_N "checking version of bison... $ECHO_C" >&6; }
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    { echo "$as_me:$LINENO: result: $ac_prog_version" >&5
+echo "${ECHO_T}$ac_prog_version" >&6; }
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { echo "$as_me:$LINENO: checking whether NLS is requested" >&5
+echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; }
+    # Check whether --enable-nls was given.
+if test "${enable_nls+set}" = set; then
+  enableval=$enable_nls; USE_NLS=$enableval
+else
+  USE_NLS=yes
+fi
+
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
+
+
+
+
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+    if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+
+      { echo "$as_me:$LINENO: checking whether included gettext is requested" >&5
+echo $ECHO_N "checking whether included gettext is requested... $ECHO_C" >&6; }
+
+# Check whether --with-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+  withval=$with_included_gettext; nls_cv_force_use_gnu_gettext=$withval
+else
+  nls_cv_force_use_gnu_gettext=no
+fi
+
+      { echo "$as_me:$LINENO: result: $nls_cv_force_use_gnu_gettext" >&5
+echo "${ECHO_T}$nls_cv_force_use_gnu_gettext" >&6; }
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+
+
+
+
+
+
+        { echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5
+echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6; }
+if test "${gt_cv_func_gnugettext2_libc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_domain_bindings
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_func_gnugettext2_libc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_func_gnugettext2_libc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext2_libc" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext2_libc" >&6; }
+
+        if test "$gt_cv_func_gnugettext2_libc" != "yes"; then
+
+
+
+    use_additional=yes
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+
+# Check whether --with-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then
+  withval=$with_libintl_prefix;
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+
+fi
+
+      LIBINTL=
+  LTLIBINTL=
+  INCINTL=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='intl '
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+          else
+                                    :
+          fi
+        else
+                              found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+              else
+                                                                                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                                if test "$hardcode_direct" = yes; then
+                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                                                            haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                                                                                haveit=
+                    for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+                    else
+                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+              else
+                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+              fi
+            fi
+                        additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INCINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+                        if test -n "$found_la"; then
+                                                        save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+                            for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                                                                                                                                                                if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIBINTL; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                                                                  haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                                                                  haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+                        alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+            acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+    else
+            for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+            for found_dir in $ltrpathdirs; do
+      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+    done
+  fi
+
+          { echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5
+echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6; }
+if test "${gt_cv_func_gnugettext2_libintl+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+                        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_expand_alias (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gt_cv_func_gnugettext2_libintl=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gt_cv_func_gnugettext2_libintl=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+                        if test "$gt_cv_func_gnugettext2_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int
+main ()
+{
+bindtextdomain ("", "");
+return (int) gettext ("") + (int) ngettext ("", "", 0) + _nl_msg_cat_cntr + *_nl_expand_alias (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext2_libintl=yes
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"
+fi
+{ echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext2_libintl" >&5
+echo "${ECHO_T}$gt_cv_func_gnugettext2_libintl" >&6; }
+        fi
+
+                                        if test "$gt_cv_func_gnugettext2_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext2_libintl" = "yes" \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+                    LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+                              nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+                BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV"
+        LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+                CATOBJEXT=.gmo
+      fi
+
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_NLS 1
+_ACEOF
+
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  { echo "$as_me:$LINENO: checking whether to use NLS" >&5
+echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6; }
+  { echo "$as_me:$LINENO: result: $USE_NLS" >&5
+echo "${ECHO_T}$USE_NLS" >&6; }
+  if test "$USE_NLS" = "yes"; then
+    { echo "$as_me:$LINENO: checking where the gettext function comes from" >&5
+echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6; }
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    { echo "$as_me:$LINENO: result: $gt_source" >&5
+echo "${ECHO_T}$gt_source" >&6; }
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext2_libintl" = "yes"; then
+        { echo "$as_me:$LINENO: checking how to link with libintl" >&5
+echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6; }
+        { echo "$as_me:$LINENO: result: $LIBINTL" >&5
+echo "${ECHO_T}$LIBINTL" >&6; }
+
+  for element in $INCINTL; do
+    haveit=
+    for x in $CPPFLAGS; do
+
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  eval x=\"$x\"
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+    fi
+  done
+
+      fi
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETTEXT 1
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DCGETTEXT 1
+_ACEOF
+
+    fi
+
+        POSUB=po
+  fi
+
+
+            if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+
+
+
+
+        nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+        DATADIRNAME=share
+
+
+        INSTOBJEXT=.mo
+
+
+        GENCAT=gencat
+
+
+        if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+
+
+        INTL_LIBTOOL_SUFFIX_PREFIX=
+
+
+
+    INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+  # gettext requires some extra checks.  These really should be part of
+  # the basic AM_GNU_GETTEXT macro.  TODO: move other gettext-specific
+  # function checks to here.
+
+
+for ac_func in strchr
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+else
+  USE_NLS=no
+  USE_INCLUDED_LIBINTL=no
+  BUILD_INCLUDED_LIBINTL=no
+
+
+
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGFMT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+    ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+  { echo "$as_me:$LINENO: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+  # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $GMSGFMT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+  ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+if test -n "$GMSGFMT"; then
+  { echo "$as_me:$LINENO: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$XGETTEXT" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+    ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+  { echo "$as_me:$LINENO: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+    rm -f messages.po
+
+
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path_MSGMERGE+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case "$MSGMERGE" in
+  [\\/]* | ?:[\\/]*)
+    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH; do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then
+            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+    ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+  { echo "$as_me:$LINENO: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+      if test "$GMSGFMT" != ":"; then
+            if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      { echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5
+echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; }
+      GMSGFMT=":"
+    fi
+  fi
+
+      if test "$XGETTEXT" != ":"; then
+            if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      { echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6; }
+      XGETTEXT=":"
+    fi
+        rm -f messages.po
+  fi
+
+  ac_config_commands="$ac_config_commands default-2"
+
+
+fi
+
+if test "$try_extensions" = yes || test x"$card_support" = xyes ; then
+  if test "$need_dlopen" = yes; then
+    _dl_save_libs=$LIBS
+    LIBS=""
+    { echo "$as_me:$LINENO: checking for library containing dlopen" >&5
+echo $ECHO_N "checking for library containing dlopen... $ECHO_C" >&6; }
+if test "${ac_cv_search_dlopen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' dl; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_search_dlopen=$ac_res
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext
+  if test "${ac_cv_search_dlopen+set}" = set; then
+  break
+fi
+done
+if test "${ac_cv_search_dlopen+set}" = set; then
+  :
+else
+  ac_cv_search_dlopen=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_search_dlopen" >&5
+echo "${ECHO_T}$ac_cv_search_dlopen" >&6; }
+ac_res=$ac_cv_search_dlopen
+if test "$ac_res" != no; then
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  found_dlopen=yes
+fi
+
+    if test x"$found_dlopen" = "xyes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DL_DLOPEN 1
+_ACEOF
+
+      DLLIBS=$LIBS
+    else
+      if test "$try_extensions" = yes ; then
+         { echo "$as_me:$LINENO: dlopen not found.  Disabling extensions." >&5
+echo "$as_me: dlopen not found.  Disabling extensions." >&6;}
+        try_extensions=no
+      fi
+
+      if test "$card_support" = yes ; then
+         { echo "$as_me:$LINENO: WARNING: dlopen not found.  Disabling OpenPGP card support." >&5
+echo "$as_me: WARNING: dlopen not found.  Disabling OpenPGP card support." >&2;}
+         card_support=no
+      fi
+    fi
+    LIBS=$_dl_save_libs
+  fi
+fi
+
+
+
+if test "$card_support" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_CARD_SUPPORT 1
+_ACEOF
+
+fi
+
+if test "$agent_support" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_AGENT_SUPPORT 1
+_ACEOF
+
+fi
+
+if test "$try_extensions" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_DYNAMIC_LINKING 1
+_ACEOF
+
+fi
+
+if test "$selinux_support" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ENABLE_SELINUX_HACKS 1
+_ACEOF
+
+fi
+
+if test "$gnupg_use_iconv" = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_GNUPG_ICONV 1
+_ACEOF
+
+fi
+
+
+
+if test "$card_support" = yes; then
+  ENABLE_CARD_SUPPORT_TRUE=
+  ENABLE_CARD_SUPPORT_FALSE='#'
+else
+  ENABLE_CARD_SUPPORT_TRUE='#'
+  ENABLE_CARD_SUPPORT_FALSE=
+fi
+
+
+
+if test "$agent_support" = yes; then
+  ENABLE_AGENT_SUPPORT_TRUE=
+  ENABLE_AGENT_SUPPORT_FALSE='#'
+else
+  ENABLE_AGENT_SUPPORT_TRUE='#'
+  ENABLE_AGENT_SUPPORT_FALSE=
+fi
+
+
+{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+if test "${ac_cv_header_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_stdc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_stdc=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then
+  :
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+                  (('a' <= (c) && (c) <= 'i') \
+                    || ('j' <= (c) && (c) <= 'r') \
+                    || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+       || toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+for ac_header in unistd.h langinfo.h termio.h locale.h getopt.h pwd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Note that we do not check for iconv here because this is done anyway
+# by the gettext checks and thus it allows us to disable the use of
+# iconv by using --disable-nls.
+
+{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+if test "${ac_cv_c_const+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+  /* Ultrix mips cc rejects this.  */
+  typedef int charset[2];
+  const charset cs;
+  /* SunOS 4.1.1 cc rejects this.  */
+  char const *const *pcpcc;
+  char **ppc;
+  /* NEC SVR4.0.2 mips cc rejects this.  */
+  struct point {int x, y;};
+  static struct point const zero = {0,0};
+  /* AIX XL C 1.02.0.0 rejects this.
+     It does not let you subtract one const X* pointer from another in
+     an arm of an if-expression whose if-part is not a constant
+     expression */
+  const char *g = "string";
+  pcpcc = &g + (g ? g-g : 0);
+  /* HPUX 7.0 cc rejects these. */
+  ++pcpcc;
+  ppc = (char**) pcpcc;
+  pcpcc = (char const *const *) ppc;
+  { /* SCO 3.2v4 cc rejects this.  */
+    char *t;
+    char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+    *t++ = 0;
+    if (s) return 0;
+  }
+  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+    int x[] = {25, 17};
+    const int *foo = &x[0];
+    ++foo;
+  }
+  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+    typedef const int *iptr;
+    iptr p = 0;
+    ++p;
+  }
+  { /* AIX XL C 1.02.0.0 rejects this saying
+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+    struct s { int j; const int *ap[3]; };
+    struct s *b; b->j = 5;
+  }
+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+    const int foo = 10;
+    if (!foo) return 0;
+  }
+  return !cs[0] && !zero.x;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_const=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_const=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6; }
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6; }
+if test "${ac_cv_c_inline+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifndef __cplusplus
+typedef int foo_t;
+static $ac_kw foo_t static_foo () {return 0; }
+$ac_kw foo_t foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_inline=$ac_kw
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  test "$ac_cv_c_inline" != no && break
+done
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6; }
+
+
+case $ac_cv_c_inline in
+  inline | yes) ;;
+  *)
+    case $ac_cv_c_inline in
+      no) ac_val=;;
+      *) ac_val=$ac_cv_c_inline;;
+    esac
+    cat >>confdefs.h <<_ACEOF
+#ifndef __cplusplus
+#define inline $ac_val
+#endif
+_ACEOF
+    ;;
+esac
+
+{ echo "$as_me:$LINENO: checking for working volatile" >&5
+echo $ECHO_N "checking for working volatile... $ECHO_C" >&6; }
+if test "${ac_cv_c_volatile+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+volatile int x;
+int * volatile y = (int *) 0;
+return !x && !y;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_volatile=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_c_volatile=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5
+echo "${ECHO_T}$ac_cv_c_volatile" >&6; }
+if test $ac_cv_c_volatile = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define volatile
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_size_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef size_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_size_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_size_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6; }
+if test $ac_cv_type_size_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking for mode_t" >&5
+echo $ECHO_N "checking for mode_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_mode_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef mode_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_mode_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_mode_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_mode_t" >&5
+echo "${ECHO_T}$ac_cv_type_mode_t" >&6; }
+if test $ac_cv_type_mode_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define mode_t int
+_ACEOF
+
+fi
+
+{ echo "$as_me:$LINENO: checking return type of signal handlers" >&5
+echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; }
+if test "${ac_cv_type_signal+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <signal.h>
+
+int
+main ()
+{
+return *(signal (0, 0)) (0) == 1;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_signal=int
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_signal=void
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
+echo "${ECHO_T}$ac_cv_type_signal" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define RETSIGTYPE $ac_cv_type_signal
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking whether sys_siglist is declared" >&5
+echo $ECHO_N "checking whether sys_siglist is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_sys_siglist+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <signal.h>
+/* NetBSD declares sys_siglist in unistd.h.  */
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef sys_siglist
+  char *p = (char *) sys_siglist;
+  return !p;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_sys_siglist=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_sys_siglist=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_sys_siglist" >&5
+echo "${ECHO_T}$ac_cv_have_decl_sys_siglist" >&6; }
+if test $ac_cv_have_decl_sys_siglist = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SYS_SIGLIST 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SYS_SIGLIST 0
+_ACEOF
+
+
+fi
+
+
+
+
+# Check whether --enable-endian-check was given.
+if test "${enable_endian_check+set}" = set; then
+  enableval=$enable_endian_check; endiancheck=$enableval
+else
+  endiancheck=yes
+fi
+
+
+if test x"$endiancheck" = xyes ; then
+
+    tmp_assumed_endian=big
+    if test "$cross_compiling" = yes; then
+      case "$host_cpu" in
+         i[345678]* )
+            tmp_assumed_endian=little
+            ;;
+         *)
+            ;;
+      esac
+      { echo "$as_me:$LINENO: WARNING: cross compiling; assuming $tmp_assumed_endian endianess" >&5
+echo "$as_me: WARNING: cross compiling; assuming $tmp_assumed_endian endianess" >&2;}
+    fi
+    { echo "$as_me:$LINENO: checking endianess" >&5
+echo $ECHO_N "checking endianess... $ECHO_C" >&6; }
+    if test "${gnupg_cv_c_endian+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+   gnupg_cv_c_endian=unknown
+        # See if sys/param.h defines the BYTE_ORDER macro.
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+        #include <sys/param.h>
+int
+main ()
+{
+
+        #if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+         bogus endian macros
+        #endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+        #include <sys/param.h>
+int
+main ()
+{
+
+        #if BYTE_ORDER != BIG_ENDIAN
+         not big endian
+        #endif
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_c_endian=big
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_c_endian=little
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+        if test "$gnupg_cv_c_endian" = unknown; then
+            if test "$cross_compiling" = yes; then
+  gnupg_cv_c_endian=$tmp_assumed_endian
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+main () {
+              /* Are we little or big endian?  From Harbison&Steele.  */
+              union
+              {
+                long l;
+                char c[sizeof (long)];
+              } u;
+              u.l = 1;
+              exit (u.c[sizeof (long) - 1] == 1);
+              }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_c_endian=little
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gnupg_cv_c_endian=big
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+        fi
+
+fi
+
+    { echo "$as_me:$LINENO: result: $gnupg_cv_c_endian" >&5
+echo "${ECHO_T}$gnupg_cv_c_endian" >&6; }
+    if test "$gnupg_cv_c_endian" = little; then
+
+cat >>confdefs.h <<\_ACEOF
+#define LITTLE_ENDIAN_HOST 1
+_ACEOF
+
+    else
+
+cat >>confdefs.h <<\_ACEOF
+#define BIG_ENDIAN_HOST 1
+_ACEOF
+
+    fi
+
+fi
+
+ { echo "$as_me:$LINENO: checking for byte typedef" >&5
+echo $ECHO_N "checking for byte typedef... $ECHO_C" >&6; }
+    if test "${gnupg_cv_typedef_byte+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _GNU_SOURCE 1
+    #include <stdlib.h>
+    #include <sys/types.h>
+int
+main ()
+{
+
+    #undef byte
+    int a = sizeof(byte);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_typedef_byte=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_typedef_byte=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { echo "$as_me:$LINENO: result: $gnupg_cv_typedef_byte" >&5
+echo "${ECHO_T}$gnupg_cv_typedef_byte" >&6; }
+    if test "$gnupg_cv_typedef_byte" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BYTE_TYPEDEF 1
+_ACEOF
+
+    fi
+
+ { echo "$as_me:$LINENO: checking for ushort typedef" >&5
+echo $ECHO_N "checking for ushort typedef... $ECHO_C" >&6; }
+    if test "${gnupg_cv_typedef_ushort+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _GNU_SOURCE 1
+    #include <stdlib.h>
+    #include <sys/types.h>
+int
+main ()
+{
+
+    #undef ushort
+    int a = sizeof(ushort);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_typedef_ushort=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_typedef_ushort=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { echo "$as_me:$LINENO: result: $gnupg_cv_typedef_ushort" >&5
+echo "${ECHO_T}$gnupg_cv_typedef_ushort" >&6; }
+    if test "$gnupg_cv_typedef_ushort" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_USHORT_TYPEDEF 1
+_ACEOF
+
+    fi
+
+ { echo "$as_me:$LINENO: checking for ulong typedef" >&5
+echo $ECHO_N "checking for ulong typedef... $ECHO_C" >&6; }
+    if test "${gnupg_cv_typedef_ulong+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _GNU_SOURCE 1
+    #include <stdlib.h>
+    #include <sys/types.h>
+int
+main ()
+{
+
+    #undef ulong
+    int a = sizeof(ulong);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_typedef_ulong=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_typedef_ulong=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { echo "$as_me:$LINENO: result: $gnupg_cv_typedef_ulong" >&5
+echo "${ECHO_T}$gnupg_cv_typedef_ulong" >&6; }
+    if test "$gnupg_cv_typedef_ulong" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_ULONG_TYPEDEF 1
+_ACEOF
+
+    fi
+
+ { echo "$as_me:$LINENO: checking for u16 typedef" >&5
+echo $ECHO_N "checking for u16 typedef... $ECHO_C" >&6; }
+    if test "${gnupg_cv_typedef_u16+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _GNU_SOURCE 1
+    #include <stdlib.h>
+    #include <sys/types.h>
+int
+main ()
+{
+
+    #undef u16
+    int a = sizeof(u16);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_typedef_u16=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_typedef_u16=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { echo "$as_me:$LINENO: result: $gnupg_cv_typedef_u16" >&5
+echo "${ECHO_T}$gnupg_cv_typedef_u16" >&6; }
+    if test "$gnupg_cv_typedef_u16" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_U16_TYPEDEF 1
+_ACEOF
+
+    fi
+
+ { echo "$as_me:$LINENO: checking for u32 typedef" >&5
+echo $ECHO_N "checking for u32 typedef... $ECHO_C" >&6; }
+    if test "${gnupg_cv_typedef_u32+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _GNU_SOURCE 1
+    #include <stdlib.h>
+    #include <sys/types.h>
+int
+main ()
+{
+
+    #undef u32
+    int a = sizeof(u32);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_typedef_u32=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_typedef_u32=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+    { echo "$as_me:$LINENO: result: $gnupg_cv_typedef_u32" >&5
+echo "${ECHO_T}$gnupg_cv_typedef_u32" >&6; }
+    if test "$gnupg_cv_typedef_u32" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_U32_TYPEDEF 1
+_ACEOF
+
+    fi
+
+
+{ echo "$as_me:$LINENO: checking for unsigned short" >&5
+echo $ECHO_N "checking for unsigned short... $ECHO_C" >&6; }
+if test "${ac_cv_type_unsigned_short+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef unsigned short ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_short=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_unsigned_short=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_short" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_short" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of unsigned short" >&5
+echo $ECHO_N "checking size of unsigned short... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_unsigned_short+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned short ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned short ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned short ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned short ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned short ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_short=$ac_lo;;
+'') if test "$ac_cv_type_unsigned_short" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned short)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned short)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_short=0
+              fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned short ac__type_sizeof_;
+
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_short=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_unsigned_short" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned short)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned short)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_short=0
+              fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_short" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_short" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_SHORT $ac_cv_sizeof_unsigned_short
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for unsigned int" >&5
+echo $ECHO_N "checking for unsigned int... $ECHO_C" >&6; }
+if test "${ac_cv_type_unsigned_int+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef unsigned int ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_int=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_unsigned_int=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_int" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of unsigned int" >&5
+echo $ECHO_N "checking size of unsigned int... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_unsigned_int+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned int ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned int ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned int ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned int ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned int ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_int=$ac_lo;;
+'') if test "$ac_cv_type_unsigned_int" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_int=0
+              fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned int ac__type_sizeof_;
+
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_int=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_unsigned_int" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned int)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned int)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_int=0
+              fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_int" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_INT $ac_cv_sizeof_unsigned_int
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for unsigned long" >&5
+echo $ECHO_N "checking for unsigned long... $ECHO_C" >&6; }
+if test "${ac_cv_type_unsigned_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef unsigned long ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_unsigned_long=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of unsigned long" >&5
+echo $ECHO_N "checking size of unsigned long... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_unsigned_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long=$ac_lo;;
+'') if test "$ac_cv_type_unsigned_long" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_long=0
+              fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long ac__type_sizeof_;
+
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_unsigned_long" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_long=0
+              fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+{ echo "$as_me:$LINENO: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6; }
+if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef unsigned long long ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_unsigned_long_long=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_unsigned_long_long=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of unsigned long long" >&5
+echo $ECHO_N "checking size of unsigned long long... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_unsigned_long_long+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long long ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long_long=$ac_lo;;
+'') if test "$ac_cv_type_unsigned_long_long" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long long)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_long_long=0
+              fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef unsigned long long ac__type_sizeof_;
+
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_unsigned_long_long=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_unsigned_long_long" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long long)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_unsigned_long_long=0
+              fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
+_ACEOF
+
+
+
+# Ensure that we have UINT64_C before we bother to check for uint64_t
+
+for ac_header in inttypes.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking for UINT64_C" >&5
+echo $ECHO_N "checking for UINT64_C... $ECHO_C" >&6; }
+if test "${gnupg_cv_uint64_c_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <inttypes.h>
+int
+main ()
+{
+
+uint64_t foo=UINT64_C(42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_uint64_c_works=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_uint64_c_works=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gnupg_cv_uint64_c_works" >&5
+echo "${ECHO_T}$gnupg_cv_uint64_c_works" >&6; }
+
+if test "$gnupg_cv_uint64_c_works" = "yes" ; then
+   { echo "$as_me:$LINENO: checking for uint64_t" >&5
+echo $ECHO_N "checking for uint64_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_uint64_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef uint64_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_uint64_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_uint64_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_uint64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint64_t" >&6; }
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ echo "$as_me:$LINENO: checking size of uint64_t" >&5
+echo $ECHO_N "checking size of uint64_t... $ECHO_C" >&6; }
+if test "${ac_cv_sizeof_uint64_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef uint64_t ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=0 ac_mid=0
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef uint64_t ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr $ac_mid + 1`
+                       if test $ac_lo -le $ac_mid; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef uint64_t ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=-1 ac_mid=-1
+  while :; do
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef uint64_t ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_lo=$ac_mid; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_hi=`expr '(' $ac_mid ')' - 1`
+                       if test $ac_mid -le $ac_hi; then
+                         ac_lo= ac_hi=
+                         break
+                       fi
+                       ac_mid=`expr 2 '*' $ac_mid`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo= ac_hi=
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+  ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef uint64_t ac__type_sizeof_;
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)];
+test_array [0] = 0
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_hi=$ac_mid
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_uint64_t=$ac_lo;;
+'') if test "$ac_cv_type_uint64_t" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (uint64_t)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (uint64_t)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_uint64_t=0
+              fi ;;
+esac
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+               typedef uint64_t ac__type_sizeof_;
+
+static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); }
+static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+  FILE *f = fopen ("conftest.val", "w");
+  if (! f)
+    return 1;
+  if (((long int) (sizeof (ac__type_sizeof_))) < 0)
+    {
+      long int i = longval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%ld\n", i);
+    }
+  else
+    {
+      unsigned long int i = ulongval ();
+      if (i != ((long int) (sizeof (ac__type_sizeof_))))
+       return 1;
+      fprintf (f, "%lu\n", i);
+    }
+  return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sizeof_uint64_t=`cat conftest.val`
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+if test "$ac_cv_type_uint64_t" = yes; then
+                { { echo "$as_me:$LINENO: error: cannot compute sizeof (uint64_t)
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (uint64_t)
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+              else
+                ac_cv_sizeof_uint64_t=0
+              fi
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.val
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_uint64_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_uint64_t" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UINT64_T $ac_cv_sizeof_uint64_t
+_ACEOF
+
+
+fi
+
+if test "$ac_cv_sizeof_unsigned_short" = "0" \
+   || test "$ac_cv_sizeof_unsigned_int" = "0" \
+   || test "$ac_cv_sizeof_unsigned_long" = "0"; then
+    { echo "$as_me:$LINENO: WARNING: Hmmm, something is wrong with the sizes - using defaults" >&5
+echo "$as_me: WARNING: Hmmm, something is wrong with the sizes - using defaults" >&2;};
+fi
+
+if test x"$use_sha512" = xyes \
+   && test "$ac_cv_sizeof_unsigned_int" != "8" \
+   && test "$ac_cv_sizeof_unsigned_long" != "8" \
+   && test "$ac_cv_sizeof_unsigned_long_long" != "8" \
+   && test x"$ac_cv_sizeof_uint64_t" != "x8"; then
+    { echo "$as_me:$LINENO: No 64-bit types.  Disabling SHA-384 and SHA-512." >&5
+echo "$as_me: No 64-bit types.  Disabling SHA-384 and SHA-512." >&6;}
+    use_sha512=no
+fi
+
+if test x"$use_sha512" = xyes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SHA512 1
+_ACEOF
+
+fi
+
+
+
+if test x"$use_sha512" = xyes; then
+  USE_SHA512_TRUE=
+  USE_SHA512_FALSE='#'
+else
+  USE_SHA512_TRUE='#'
+  USE_SHA512_FALSE=
+fi
+
+
+{ echo "$as_me:$LINENO: checking whether getpagesize is declared" >&5
+echo $ECHO_N "checking whether getpagesize is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_getpagesize+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getpagesize
+  char *p = (char *) getpagesize;
+  return !p;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_getpagesize=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_getpagesize=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_getpagesize" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getpagesize" >&6; }
+if test $ac_cv_have_decl_getpagesize = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETPAGESIZE 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETPAGESIZE 0
+_ACEOF
+
+
+fi
+
+
+{ echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5
+echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6; }
+if test "${ac_cv_sys_largefile_source+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  while :; do
+  ac_cv_sys_largefile_source=no
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+return !fseeko;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#define _LARGEFILE_SOURCE 1
+#include <stdio.h>
+int
+main ()
+{
+return !fseeko;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_sys_largefile_source=1; break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  break
+done
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5
+echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6; }
+if test "$ac_cv_sys_largefile_source" != no; then
+
+cat >>confdefs.h <<_ACEOF
+#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source
+_ACEOF
+
+fi
+rm -f conftest*
+
+# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug
+# in glibc 2.1.3, but that breaks too many other things.
+# If you want fseeko and ftello with glibc, upgrade to a fixed glibc.
+{ echo "$as_me:$LINENO: checking for fseeko" >&5
+echo $ECHO_N "checking for fseeko... $ECHO_C" >&6; }
+if test "${ac_cv_func_fseeko+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+return fseeko && fseeko (stdin, 0, 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_fseeko=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_fseeko=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_fseeko" >&5
+echo "${ECHO_T}$ac_cv_func_fseeko" >&6; }
+if test $ac_cv_func_fseeko = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_FSEEKO 1
+_ACEOF
+
+fi
+
+
+for ac_func in vprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+{ echo "$as_me:$LINENO: checking for _doprnt" >&5
+echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6; }
+if test "${ac_cv_func__doprnt+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define _doprnt to an innocuous variant, in case <limits.h> declares _doprnt.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define _doprnt innocuous__doprnt
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _doprnt (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef _doprnt
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char _doprnt ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub__doprnt || defined __stub____doprnt
+choke me
+#endif
+
+int
+main ()
+{
+return _doprnt ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func__doprnt=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func__doprnt=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5
+echo "${ECHO_T}$ac_cv_func__doprnt" >&6; }
+if test $ac_cv_func__doprnt = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DOPRNT 1
+_ACEOF
+
+fi
+
+fi
+done
+
+
+{ echo "$as_me:$LINENO: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_pid_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+typedef pid_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_pid_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_pid_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6; }
+if test $ac_cv_type_pid_t = yes; then
+  :
+else
+
+cat >>confdefs.h <<_ACEOF
+#define pid_t int
+_ACEOF
+
+fi
+
+
+for ac_header in vfork.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_func in fork vfork
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+if test "x$ac_cv_func_fork" = xyes; then
+  { echo "$as_me:$LINENO: checking for working fork" >&5
+echo $ECHO_N "checking for working fork... $ECHO_C" >&6; }
+if test "${ac_cv_func_fork_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_fork_works=cross
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+
+         /* By Ruediger Kuhlmann. */
+         return fork () < 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_fork_works=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_fork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5
+echo "${ECHO_T}$ac_cv_func_fork_works" >&6; }
+
+else
+  ac_cv_func_fork_works=$ac_cv_func_fork
+fi
+if test "x$ac_cv_func_fork_works" = xcross; then
+  case $host in
+    *-*-amigaos* | *-*-msdosdjgpp*)
+      # Override, as these systems have only a dummy fork() stub
+      ac_cv_func_fork_works=no
+      ;;
+    *)
+      ac_cv_func_fork_works=yes
+      ;;
+  esac
+  { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5
+echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;}
+fi
+ac_cv_func_vfork_works=$ac_cv_func_vfork
+if test "x$ac_cv_func_vfork" = xyes; then
+  { echo "$as_me:$LINENO: checking for working vfork" >&5
+echo $ECHO_N "checking for working vfork... $ECHO_C" >&6; }
+if test "${ac_cv_func_vfork_works+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_func_vfork_works=cross
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Thanks to Paul Eggert for this test.  */
+$ac_includes_default
+#include <sys/wait.h>
+#ifdef HAVE_VFORK_H
+# include <vfork.h>
+#endif
+/* On some sparc systems, changes by the child to local and incoming
+   argument registers are propagated back to the parent.  The compiler
+   is told about this with #include <vfork.h>, but some compilers
+   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a
+   static variable whose address is put into a register that is
+   clobbered by the vfork.  */
+static void
+#ifdef __cplusplus
+sparc_address_test (int arg)
+# else
+sparc_address_test (arg) int arg;
+#endif
+{
+  static pid_t child;
+  if (!child) {
+    child = vfork ();
+    if (child < 0) {
+      perror ("vfork");
+      _exit(2);
+    }
+    if (!child) {
+      arg = getpid();
+      write(-1, "", 0);
+      _exit (arg);
+    }
+  }
+}
+
+int
+main ()
+{
+  pid_t parent = getpid ();
+  pid_t child;
+
+  sparc_address_test (0);
+
+  child = vfork ();
+
+  if (child == 0) {
+    /* Here is another test for sparc vfork register problems.  This
+       test uses lots of local variables, at least as many local
+       variables as main has allocated so far including compiler
+       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris
+       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should
+       reuse the register of parent for one of the local variables,
+       since it will think that parent can't possibly be used any more
+       in this routine.  Assigning to the local variable will thus
+       munge parent in the parent process.  */
+    pid_t
+      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),
+      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();
+    /* Convince the compiler that p..p7 are live; otherwise, it might
+       use the same hardware register for all 8 local variables.  */
+    if (p != p1 || p != p2 || p != p3 || p != p4
+       || p != p5 || p != p6 || p != p7)
+      _exit(1);
+
+    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent
+       from child file descriptors.  If the child closes a descriptor
+       before it execs or exits, this munges the parent's descriptor
+       as well.  Test for this by closing stdout in the child.  */
+    _exit(close(fileno(stdout)) != 0);
+  } else {
+    int status;
+    struct stat st;
+
+    while (wait(&status) != child)
+      ;
+    return (
+        /* Was there some problem with vforking?  */
+        child < 0
+
+        /* Did the child fail?  (This shouldn't happen.)  */
+        || status
+
+        /* Did the vfork/compiler bug occur?  */
+        || parent != getpid()
+
+        /* Did the file descriptor bug occur?  */
+        || fstat(fileno(stdout), &st) != 0
+        );
+  }
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_vfork_works=yes
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_func_vfork_works=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5
+echo "${ECHO_T}$ac_cv_func_vfork_works" >&6; }
+
+fi;
+if test "x$ac_cv_func_fork_works" = xcross; then
+  ac_cv_func_vfork_works=$ac_cv_func_vfork
+  { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5
+echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;}
+fi
+
+if test "x$ac_cv_func_vfork_works" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WORKING_VFORK 1
+_ACEOF
+
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define vfork fork
+_ACEOF
+
+fi
+if test "x$ac_cv_func_fork_works" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_WORKING_FORK 1
+_ACEOF
+
+fi
+
+
+
+
+
+
+
+for ac_func in strerror stpcpy strlwr tcgetattr strtoul mmap
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+for ac_func in strcasecmp strncasecmp ctermid times unsetenv getpwnam getpwuid
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+for ac_func in memmove gettimeofday getrusage setrlimit clock_gettime
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+for ac_func in atexit raise getpagesize strftime nl_langinfo setlocale
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+
+
+
+for ac_func in waitpid wait4 sigaction sigprocmask rand pipe stat getaddrinfo
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+for ac_func in fcntl ftruncate
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+
+
+
+
+
+for ac_func in mkdtemp timegm isascii memrchr strsep
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+  case " $LIBOBJS " in
+  *" $ac_func.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
+ ;;
+esac
+
+fi
+done
+
+
+
+{ echo "$as_me:$LINENO: checking for struct sigaction" >&5
+echo $ECHO_N "checking for struct sigaction... $ECHO_C" >&6; }
+if test "${ac_cv_type_struct_sigaction+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <signal.h>
+
+typedef struct sigaction ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_struct_sigaction=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_struct_sigaction=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_struct_sigaction" >&5
+echo "${ECHO_T}$ac_cv_type_struct_sigaction" >&6; }
+if test $ac_cv_type_struct_sigaction = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_STRUCT_SIGACTION 1
+_ACEOF
+
+
+fi
+{ echo "$as_me:$LINENO: checking for sigset_t" >&5
+echo $ECHO_N "checking for sigset_t... $ECHO_C" >&6; }
+if test "${ac_cv_type_sigset_t+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <signal.h>
+
+typedef sigset_t ac__type_new_;
+int
+main ()
+{
+if ((ac__type_new_ *) 0)
+  return 0;
+if (sizeof (ac__type_new_))
+  return 0;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_type_sigset_t=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_type_sigset_t=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_type_sigset_t" >&5
+echo "${ECHO_T}$ac_cv_type_sigset_t" >&6; }
+if test $ac_cv_type_sigset_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_SIGSET_T 1
+_ACEOF
+
+
+fi
+
+
+# See if getopt is in libiberty.  This is of course not optimal since
+# it might be somewhere other than libiberty, but does cover the
+# mingw32 case.
+
+{ echo "$as_me:$LINENO: checking for getopt" >&5
+echo $ECHO_N "checking for getopt... $ECHO_C" >&6; }
+if test "${ac_cv_func_getopt+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define getopt to an innocuous variant, in case <limits.h> declares getopt.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define getopt innocuous_getopt
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char getopt (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef getopt
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getopt ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_getopt || defined __stub___getopt
+choke me
+#endif
+
+int
+main ()
+{
+return getopt ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_getopt=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_getopt=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_getopt" >&5
+echo "${ECHO_T}$ac_cv_func_getopt" >&6; }
+if test $ac_cv_func_getopt = yes; then
+  :
+else
+  { echo "$as_me:$LINENO: checking for getopt in -liberty" >&5
+echo $ECHO_N "checking for getopt in -liberty... $ECHO_C" >&6; }
+if test "${ac_cv_lib_iberty_getopt+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-liberty  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char getopt ();
+int
+main ()
+{
+return getopt ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_iberty_getopt=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_iberty_getopt=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_iberty_getopt" >&5
+echo "${ECHO_T}$ac_cv_lib_iberty_getopt" >&6; }
+if test $ac_cv_lib_iberty_getopt = yes; then
+  GETOPT="-liberty"
+
+fi
+
+fi
+
+
+#
+# check for gethrtime and run a testprogram to see whether
+# it is broken.  It has been reported that some Solaris and HP UX systems
+# raise an SIGILL
+#
+{ echo "$as_me:$LINENO: checking for gethrtime" >&5
+echo $ECHO_N "checking for gethrtime... $ECHO_C" >&6; }
+if test "${gnupg_cv_func_gethrtime+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/times.h>
+int
+main ()
+{
+
+                   hrtime_t tv;
+                   tv = gethrtime();
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_func_gethrtime=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_func_gethrtime=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+fi
+{ echo "$as_me:$LINENO: result: $gnupg_cv_func_gethrtime" >&5
+echo "${ECHO_T}$gnupg_cv_func_gethrtime" >&6; }
+if test $gnupg_cv_func_gethrtime = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_GETHRTIME 1
+_ACEOF
+
+     { echo "$as_me:$LINENO: checking whether gethrtime is broken" >&5
+echo $ECHO_N "checking whether gethrtime is broken... $ECHO_C" >&6; }
+if test "${gnupg_cv_func_broken_gethrtime+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  gnupg_cv_func_broken_gethrtime=assume-no
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+                   #include <sys/times.h>
+                   int main () {
+                   hrtime_t tv;
+                   tv = gethrtime();
+                 }
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_func_broken_gethrtime=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gnupg_cv_func_broken_gethrtime=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gnupg_cv_func_broken_gethrtime" >&5
+echo "${ECHO_T}$gnupg_cv_func_broken_gethrtime" >&6; }
+    if test $gnupg_cv_func_broken_gethrtime = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BROKEN_GETHRTIME 1
+_ACEOF
+
+    fi
+fi
+
+
+
+for ac_func in mlock
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+    if test "$ac_cv_func_mlock" = "no"; then
+
+for ac_header in sys/mman.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+        if test "$ac_cv_header_sys_mman_h" = "yes"; then
+            # Add librt to LIBS:
+
+{ echo "$as_me:$LINENO: checking for memlk in -lrt" >&5
+echo $ECHO_N "checking for memlk in -lrt... $ECHO_C" >&6; }
+if test "${ac_cv_lib_rt_memlk+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrt  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char memlk ();
+int
+main ()
+{
+return memlk ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_rt_memlk=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_rt_memlk=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_rt_memlk" >&5
+echo "${ECHO_T}$ac_cv_lib_rt_memlk" >&6; }
+if test $ac_cv_lib_rt_memlk = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBRT 1
+_ACEOF
+
+  LIBS="-lrt $LIBS"
+
+fi
+
+            { echo "$as_me:$LINENO: checking whether mlock is in sys/mman.h" >&5
+echo $ECHO_N "checking whether mlock is in sys/mman.h... $ECHO_C" >&6; }
+if test "${gnupg_cv_mlock_is_in_sys_mman+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+                    #include <assert.h>
+                    #ifdef HAVE_SYS_MMAN_H
+                    #include <sys/mman.h>
+                    #endif
+
+int
+main ()
+{
+
+                    int i;
+
+                    /* glibc defines this for functions which it implements
+                     * to always fail with ENOSYS.  Some functions are actually
+                     * named something starting with __ and the normal name
+                     * is an alias.  */
+                    #if defined (__stub_mlock) || defined (__stub___mlock)
+                    choke me
+                    #else
+                    mlock(&i, 4);
+                    #endif
+                    ; return 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_mlock_is_in_sys_mman=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_mlock_is_in_sys_mman=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gnupg_cv_mlock_is_in_sys_mman" >&5
+echo "${ECHO_T}$gnupg_cv_mlock_is_in_sys_mman" >&6; }
+            if test "$gnupg_cv_mlock_is_in_sys_mman" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_MLOCK 1
+_ACEOF
+
+            fi
+        fi
+    fi
+    if test "$ac_cv_func_mlock" = "yes"; then
+        { echo "$as_me:$LINENO: checking whether mlock is broken" >&5
+echo $ECHO_N "checking whether mlock is broken... $ECHO_C" >&6; }
+          if test "${gnupg_cv_have_broken_mlock+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  gnupg_cv_have_broken_mlock="assume-no"
+
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+                #include <stdlib.h>
+                #include <unistd.h>
+                #include <errno.h>
+                #include <sys/mman.h>
+                #include <sys/types.h>
+                #include <fcntl.h>
+
+                int main()
+                {
+                    char *pool;
+                    int err;
+                    long int pgsize = getpagesize();
+
+                    pool = malloc( 4096 + pgsize );
+                    if( !pool )
+                        return 2;
+                    pool += (pgsize - ((long int)pool % pgsize));
+
+                    err = mlock( pool, 4096 );
+                    if( !err || errno == EPERM )
+                        return 0; /* okay */
+
+                    return 1;  /* hmmm */
+                }
+
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_have_broken_mlock="no"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gnupg_cv_have_broken_mlock="yes"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+
+         if test "$gnupg_cv_have_broken_mlock" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BROKEN_MLOCK 1
+_ACEOF
+
+             { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+
+for ac_func in plock
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+         else
+            if test "$gnupg_cv_have_broken_mlock" = "no"; then
+                { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+            else
+                { echo "$as_me:$LINENO: result: assuming no" >&5
+echo "${ECHO_T}assuming no" >&6; }
+            fi
+         fi
+    fi
+
+
+
+
+for ac_header in sys/stat.h unistd.h direct.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+{ echo "$as_me:$LINENO: checking if mkdir takes one argument" >&5
+echo $ECHO_N "checking if mkdir takes one argument... $ECHO_C" >&6; }
+if test "${gnupg_cv_mkdir_takes_one_arg+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_DIRECT_H
+# include <direct.h>
+#endif
+int
+main ()
+{
+mkdir ("foo", 0);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_mkdir_takes_one_arg=no
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_mkdir_takes_one_arg=yes
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $gnupg_cv_mkdir_takes_one_arg" >&5
+echo "${ECHO_T}$gnupg_cv_mkdir_takes_one_arg" >&6; }
+if test $gnupg_cv_mkdir_takes_one_arg = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define MKDIR_TAKES_ONE_ARG 1
+_ACEOF
+
+fi
+
+
+if test "$use_capabilities" = "yes" ; then
+
+{ echo "$as_me:$LINENO: WARNING:
+***
+*** WARNING: using capabilities with GnuPG is experimental code!
+***" >&5
+echo "$as_me: WARNING:
+***
+*** WARNING: using capabilities with GnuPG is experimental code!
+***" >&2;}
+
+use_capabilities=no
+
+for ac_header in sys/capability.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+if test "$ac_cv_header_sys_capability_h" = "yes" ; then
+  { echo "$as_me:$LINENO: checking for cap_init in -lcap" >&5
+echo $ECHO_N "checking for cap_init in -lcap... $ECHO_C" >&6; }
+if test "${ac_cv_lib_cap_cap_init+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcap  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cap_init ();
+int
+main ()
+{
+return cap_init ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_cap_cap_init=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_cap_cap_init=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_cap_cap_init" >&5
+echo "${ECHO_T}$ac_cv_lib_cap_cap_init" >&6; }
+if test $ac_cv_lib_cap_cap_init = yes; then
+  ac_need_libcap=1
+fi
+
+  if test "$ac_cv_lib_cap_cap_init" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_CAPABILITIES 1
+_ACEOF
+
+     CAPLIBS="-lcap"
+
+     use_capabilities=yes
+  fi
+fi
+if test "$use_capabilities" = "no" ; then
+    { echo "$as_me:$LINENO: WARNING:
+***
+*** The use of capabilities on this system is not possible.
+*** You need a recent Linux kernel and some patches:
+***   fcaps-2.2.9-990610.patch      (kernel patch for 2.2.9)
+***   fcap-module-990613.tar.gz     (kernel module)
+***   libcap-1.92.tar.gz            (user mode library and utilities)
+*** And you have to configure the kernel with CONFIG_VFS_CAP_PLUGIN
+*** set (filesystems menu). Be warned: This code is *really* ALPHA.
+***" >&5
+echo "$as_me: WARNING:
+***
+*** The use of capabilities on this system is not possible.
+*** You need a recent Linux kernel and some patches:
+***   fcaps-2.2.9-990610.patch      (kernel patch for 2.2.9)
+***   fcap-module-990613.tar.gz     (kernel module)
+***   libcap-1.92.tar.gz            (user mode library and utilities)
+*** And you have to configure the kernel with CONFIG_VFS_CAP_PLUGIN
+*** set (filesystems menu). Be warned: This code is *really* ALPHA.
+***" >&2;}
+fi
+fi
+
+
+
+
+for ac_header in sys/ipc.h sys/shm.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  { echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <$ac_header>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  eval "$as_ac_Header=\$ac_header_preproc"
+fi
+ac_res=`eval echo '${'$as_ac_Header'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+     if test "$ac_cv_header_sys_shm_h" = "yes"; then
+       { echo "$as_me:$LINENO: checking whether IPC_RMID allowes subsequent attaches" >&5
+echo $ECHO_N "checking whether IPC_RMID allowes subsequent attaches... $ECHO_C" >&6; }
+       if test "${gnupg_cv_ipc_rmid_deferred_release+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  gnupg_cv_ipc_rmid_deferred_release="assume-no"
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+             #include <sys/types.h>
+             #include <sys/ipc.h>
+             #include <sys/shm.h>
+             int main()
+             {
+               int id;
+               char *shmaddr;
+             id = shmget (IPC_PRIVATE, 4, IPC_CREAT | 0777);
+             if (id == -1)
+               exit (2);
+               shmaddr = shmat (id, 0, 0);
+               shmctl (id, IPC_RMID, 0);
+               if ((char*) shmat (id, 0, 0) == (char*) -1)
+               {
+                 shmdt (shmaddr);
+                 exit (1);
+               }
+               shmdt (shmaddr);
+               shmdt (shmaddr);
+               exit (0);
+             }
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_ipc_rmid_deferred_release="yes"
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gnupg_cv_ipc_rmid_deferred_release="no"
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+
+fi
+
+       if test "$gnupg_cv_ipc_rmid_deferred_release" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IPC_RMID_DEFERRED_RELEASE 1
+_ACEOF
+
+           { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       else
+          if test "$gnupg_cv_ipc_rmid_deferred_release" = "no"; then
+              { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+          else
+              { echo "$as_me:$LINENO: result: assuming no" >&5
+echo "${ECHO_T}assuming no" >&6; }
+          fi
+       fi
+
+       { echo "$as_me:$LINENO: checking whether SHM_LOCK is available" >&5
+echo $ECHO_N "checking whether SHM_LOCK is available... $ECHO_C" >&6; }
+       if test "${gnupg_cv_ipc_have_shm_lock+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+             #include <sys/ipc.h>
+             #include <sys/shm.h>
+int
+main ()
+{
+
+             int shm_id;
+             shmctl(shm_id, SHM_LOCK, 0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_ipc_have_shm_lock="yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       gnupg_cv_ipc_have_shm_lock="no"
+
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+
+       if test "$gnupg_cv_ipc_have_shm_lock" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IPC_HAVE_SHM_LOCK 1
+_ACEOF
+
+         { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+       else
+         { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+       fi
+     fi
+
+if test "$ac_cv_header_sys_shm_h" = "yes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_SHM_COPROCESSING 1
+_ACEOF
+
+fi
+
+if test "$try_dev_random" = yes ; then
+    { echo "$as_me:$LINENO: checking for random device" >&5
+echo $ECHO_N "checking for random device... $ECHO_C" >&6; }
+if test "${ac_cv_have_dev_random+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -r "$NAME_OF_DEV_RANDOM" && test -r "$NAME_OF_DEV_URANDOM" ; then
+      ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_dev_random" >&5
+echo "${ECHO_T}$ac_cv_have_dev_random" >&6; }
+    if test "$ac_cv_have_dev_random" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_DEV_RANDOM 1
+_ACEOF
+
+    fi
+else
+    { echo "$as_me:$LINENO: checking for random device" >&5
+echo $ECHO_N "checking for random device... $ECHO_C" >&6; }
+    ac_cv_have_dev_random=no
+    { echo "$as_me:$LINENO: result: has been disabled" >&5
+echo "${ECHO_T}has been disabled" >&6; }
+fi
+
+
+random_modules=""
+if test "$use_static_rnd" = default; then
+     if test "$ac_cv_have_dev_random" = yes; then
+        random_modules="rndlinux"
+     else
+         case "${host}" in
+            *-mingw32*|*-*-cygwin*)
+                random_modules="rndw32"
+                ;;
+            i?86-emx-os2|i?86-*-os2*emx)
+                random_modules="rndos2"
+                ;;
+            m68k-atari-mint)
+                random_modules="rndatari"
+                ;;
+            i?86-*-msdosdjgpp*)
+                :
+                ;;
+            *)
+                random_modules="rndlinux rndegd rndunix"
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_ALL_RANDOM_MODULES 1
+_ACEOF
+
+                ;;
+         esac
+     fi
+else
+  if test "$use_static_rnd" = auto; then
+     random_modules="rndlinux rndegd rndunix"
+     cat >>confdefs.h <<\_ACEOF
+#define USE_ALL_RANDOM_MODULES 1
+_ACEOF
+
+  else
+     random_modules="rnd$use_static_rnd";
+  fi
+fi
+
+if test -z "$random_modules"; then
+   { { echo "$as_me:$LINENO: error: no random module available" >&5
+echo "$as_me: error: no random module available" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+print_egd_warning=no
+for rndmod in $random_modules "" ; do
+  case "$rndmod" in
+    rndlinux)
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_RNDLINUX 1
+_ACEOF
+
+         use_rndlinux=yes
+         ;;
+    rndunix)
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_RNDUNIX 1
+_ACEOF
+
+         print_egd_warning=yes
+         use_rndunix=yes
+          ;;
+    rndegd)
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_RNDEGD 1
+_ACEOF
+
+         use_rndegd=yes
+         ;;
+    rndw32)
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_RNDW32 1
+_ACEOF
+
+         use_rndw32=yes
+        ;;
+   esac
+done
+
+
+
+if test "$use_rndlinux" = yes; then
+  USE_RNDLINUX_TRUE=
+  USE_RNDLINUX_FALSE='#'
+else
+  USE_RNDLINUX_TRUE='#'
+  USE_RNDLINUX_FALSE=
+fi
+
+
+
+if test "$use_rndunix" = yes; then
+  USE_RNDUNIX_TRUE=
+  USE_RNDUNIX_FALSE='#'
+else
+  USE_RNDUNIX_TRUE='#'
+  USE_RNDUNIX_FALSE=
+fi
+
+
+
+if test "$use_rndegd" = yes; then
+  USE_RNDEGD_TRUE=
+  USE_RNDEGD_FALSE='#'
+else
+  USE_RNDEGD_TRUE='#'
+  USE_RNDEGD_FALSE=
+fi
+
+
+
+if test "$use_rndw32" = yes; then
+  USE_RNDW32_TRUE=
+  USE_RNDW32_FALSE='#'
+else
+  USE_RNDW32_TRUE='#'
+  USE_RNDW32_FALSE=
+fi
+
+
+{ echo "$as_me:$LINENO: checking for mpi assembler functions" >&5
+echo $ECHO_N "checking for mpi assembler functions... $ECHO_C" >&6; }
+if test -f $srcdir/mpi/config.links ; then
+    . $srcdir/mpi/config.links
+    ac_config_links="$ac_config_links "$mpi_ln_list""
+
+    ac_cv_mpi_extra_asm_modules="$mpi_extra_modules"
+    ac_cv_mpi_sflags="$mpi_sflags"
+    ac_cv_mpi_config_done="yes"
+    { echo "$as_me:$LINENO: result: done" >&5
+echo "${ECHO_T}done" >&6; }
+else
+    { echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6; }
+    { { echo "$as_me:$LINENO: error: mpi/config.links missing!" >&5
+echo "$as_me: error: mpi/config.links missing!" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+MPI_EXTRA_ASM_OBJS=""
+show_extraasm=""
+if test "$ac_cv_mpi_extra_asm_modules" != ""; then
+for i in $ac_cv_mpi_extra_asm_modules; do
+    show_extraasm="$show_extraasm $i"
+    MPI_EXTRA_ASM_OBJS="$MPI_EXTRA_ASM_OBJS $i.o"
+done
+fi
+
+MPI_SFLAGS="$ac_cv_mpi_sflags"
+
+
+# Sanity check regex.  Tests adapted from mutt.
+
+{ echo "$as_me:$LINENO: checking whether regular expression support is requested" >&5
+echo $ECHO_N "checking whether regular expression support is requested... $ECHO_C" >&6; }
+# Check whether --enable-regex was given.
+if test "${enable_regex+set}" = set; then
+  enableval=$enable_regex; use_regex=$enableval
+else
+  use_regex=yes
+fi
+
+{ echo "$as_me:$LINENO: result: $use_regex" >&5
+echo "${ECHO_T}$use_regex" >&6; }
+
+if test "$use_regex" = yes ; then
+  { echo "$as_me:$LINENO: checking whether the included regex lib is requested" >&5
+echo $ECHO_N "checking whether the included regex lib is requested... $ECHO_C" >&6; }
+
+# Check whether --with-included-regex was given.
+if test "${with_included_regex+set}" = set; then
+  withval=$with_included_regex; gnupg_cv_included_regex="$withval"
+else
+  gnupg_cv_included_regex=no
+fi
+
+  { echo "$as_me:$LINENO: result: $gnupg_cv_included_regex" >&5
+echo "${ECHO_T}$gnupg_cv_included_regex" >&6; }
+
+  if test $gnupg_cv_included_regex = no ; then
+     # Does the system have regex functions at all?
+     { echo "$as_me:$LINENO: checking for regcomp" >&5
+echo $ECHO_N "checking for regcomp... $ECHO_C" >&6; }
+if test "${ac_cv_func_regcomp+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define regcomp to an innocuous variant, in case <limits.h> declares regcomp.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define regcomp innocuous_regcomp
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char regcomp (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef regcomp
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char regcomp ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_regcomp || defined __stub___regcomp
+choke me
+#endif
+
+int
+main ()
+{
+return regcomp ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_regcomp=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_func_regcomp=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_func_regcomp" >&5
+echo "${ECHO_T}$ac_cv_func_regcomp" >&6; }
+if test $ac_cv_func_regcomp = yes; then
+  gnupg_cv_included_regex=no
+else
+  gnupg_cv_included_regex=yes
+fi
+
+  fi
+
+  if test $gnupg_cv_included_regex = no ; then
+     { echo "$as_me:$LINENO: checking whether your system's regexp library is broken" >&5
+echo $ECHO_N "checking whether your system's regexp library is broken... $ECHO_C" >&6; }
+if test "${gnupg_cv_regex_broken+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test "$cross_compiling" = yes; then
+  gnupg_cv_regex_broken=yes
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <unistd.h>
+#include <regex.h>
+main() { regex_t blah ; regmatch_t p; p.rm_eo = p.rm_eo; return regcomp(&blah, "foo.*bar", REG_NOSUB) || regexec (&blah, "foobar", 0, NULL, 0); }
+_ACEOF
+rm -f conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  gnupg_cv_regex_broken=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+gnupg_cv_regex_broken=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+
+fi
+{ echo "$as_me:$LINENO: result: $gnupg_cv_regex_broken" >&5
+echo "${ECHO_T}$gnupg_cv_regex_broken" >&6; }
+
+     if test $gnupg_cv_regex_broken = yes ; then
+      { echo "$as_me:$LINENO: WARNING: your regex is broken - using the included GNU regex instead." >&5
+echo "$as_me: WARNING: your regex is broken - using the included GNU regex instead." >&2;}
+      gnupg_cv_included_regex=yes
+     fi
+  fi
+
+  if test $gnupg_cv_included_regex = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define USE_INTERNAL_REGEX 1
+_ACEOF
+
+  fi
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define DISABLE_REGEX 1
+_ACEOF
+
+fi
+
+
+
+if test x"$gnupg_cv_included_regex" = xyes; then
+  USE_INTERNAL_REGEX_TRUE=
+  USE_INTERNAL_REGEX_FALSE='#'
+else
+  USE_INTERNAL_REGEX_TRUE='#'
+  USE_INTERNAL_REGEX_FALSE=
+fi
+
+
+use_local_zlib=yes
+if test "$g10_force_zlib" = "yes"; then
+  :
+else
+  _cppflags="${CPPFLAGS}"
+  _ldflags="${LDFLAGS}"
+
+
+# Check whether --with-zlib was given.
+if test "${with_zlib+set}" = set; then
+  withval=$with_zlib;
+    if test -d "$withval"; then
+      CPPFLAGS="${CPPFLAGS} -I$withval/include"
+      LDFLAGS="${LDFLAGS} -L$withval/lib"
+    fi
+
+fi
+
+
+  if test "${ac_cv_header_zlib_h+set}" = set; then
+  { echo "$as_me:$LINENO: checking for zlib.h" >&5
+echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_zlib_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5
+echo "${ECHO_T}$ac_cv_header_zlib_h" >&6; }
+else
+  # Is the header compilable?
+{ echo "$as_me:$LINENO: checking zlib.h usability" >&5
+echo $ECHO_N "checking zlib.h usability... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+#include <zlib.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_header_compiler=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_header_compiler=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ echo "$as_me:$LINENO: checking zlib.h presence" >&5
+echo $ECHO_N "checking zlib.h presence... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <zlib.h>
+_ACEOF
+if { (ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+    ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  ac_header_preproc=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  ac_header_preproc=no
+fi
+
+rm -f conftest.err conftest.$ac_ext
+{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+  yes:no: )
+    { echo "$as_me:$LINENO: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: zlib.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: zlib.h: proceeding with the compiler's result" >&2;}
+    ac_header_preproc=yes
+    ;;
+  no:yes:* )
+    { echo "$as_me:$LINENO: WARNING: zlib.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: zlib.h: present but cannot be compiled" >&2;}
+    { echo "$as_me:$LINENO: WARNING: zlib.h:     check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: zlib.h:     check for missing prerequisite headers?" >&2;}
+    { echo "$as_me:$LINENO: WARNING: zlib.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: zlib.h: see the Autoconf documentation" >&2;}
+    { echo "$as_me:$LINENO: WARNING: zlib.h:     section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: zlib.h:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { echo "$as_me:$LINENO: WARNING: zlib.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: zlib.h: proceeding with the preprocessor's result" >&2;}
+    { echo "$as_me:$LINENO: WARNING: zlib.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: zlib.h: in the future, the compiler will take precedence" >&2;}
+    ( cat <<\_ASBOX
+## -------------------------------- ##
+## Report this to bug-gnupg@gnu.org ##
+## -------------------------------- ##
+_ASBOX
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+{ echo "$as_me:$LINENO: checking for zlib.h" >&5
+echo $ECHO_N "checking for zlib.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_zlib_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_header_zlib_h=$ac_header_preproc
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_zlib_h" >&5
+echo "${ECHO_T}$ac_cv_header_zlib_h" >&6; }
+
+fi
+if test $ac_cv_header_zlib_h = yes; then
+  { echo "$as_me:$LINENO: checking for deflateInit2_ in -lz" >&5
+echo $ECHO_N "checking for deflateInit2_ in -lz... $ECHO_C" >&6; }
+if test "${ac_cv_lib_z_deflateInit2_+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lz  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char deflateInit2_ ();
+int
+main ()
+{
+return deflateInit2_ ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_z_deflateInit2_=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_z_deflateInit2_=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_z_deflateInit2_" >&5
+echo "${ECHO_T}$ac_cv_lib_z_deflateInit2_" >&6; }
+if test $ac_cv_lib_z_deflateInit2_ = yes; then
+  use_local_zlib=no
+       ZLIBS="-lz"
+else
+  CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}
+fi
+
+else
+  CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}
+fi
+
+
+fi
+
+if test "$use_local_zlib" = yes ; then
+
+
+if true; then
+  ENABLE_LOCAL_ZLIB_TRUE=
+  ENABLE_LOCAL_ZLIB_FALSE='#'
+else
+  ENABLE_LOCAL_ZLIB_TRUE='#'
+  ENABLE_LOCAL_ZLIB_FALSE=
+fi
+
+    ac_config_links="$ac_config_links zlib.h:zlib/zlib.h zconf.h:zlib/zconf.h"
+
+    ZLIBS="../zlib/libzlib.a"
+else
+
+
+if false; then
+  ENABLE_LOCAL_ZLIB_TRUE=
+  ENABLE_LOCAL_ZLIB_FALSE='#'
+else
+  ENABLE_LOCAL_ZLIB_TRUE='#'
+  ENABLE_LOCAL_ZLIB_FALSE=
+fi
+
+fi
+
+if test "$use_bzip2" = yes ; then
+  _cppflags="${CPPFLAGS}"
+  _ldflags="${LDFLAGS}"
+
+# Check whether --with-bzip2 was given.
+if test "${with_bzip2+set}" = set; then
+  withval=$with_bzip2;
+      if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+      fi
+
+else
+  withval=""
+fi
+
+
+# Checking alongside stdio.h as an early version of bzip2 (1.0)
+# required stdio.h to be included before bzlib.h, and Solaris 9 is
+# woefully out of date.
+
+  if test "$withval" != no ; then
+     { echo "$as_me:$LINENO: checking for bzlib.h" >&5
+echo $ECHO_N "checking for bzlib.h... $ECHO_C" >&6; }
+if test "${ac_cv_header_bzlib_h+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdio.h>
+
+#include <bzlib.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_header_bzlib_h=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_header_bzlib_h=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_header_bzlib_h" >&5
+echo "${ECHO_T}$ac_cv_header_bzlib_h" >&6; }
+if test $ac_cv_header_bzlib_h = yes; then
+  { echo "$as_me:$LINENO: checking for BZ2_bzCompressInit in -lbz2" >&5
+echo $ECHO_N "checking for BZ2_bzCompressInit in -lbz2... $ECHO_C" >&6; }
+if test "${ac_cv_lib_bz2_BZ2_bzCompressInit+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbz2  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char BZ2_bzCompressInit ();
+int
+main ()
+{
+return BZ2_bzCompressInit ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_bz2_BZ2_bzCompressInit=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_lib_bz2_BZ2_bzCompressInit=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_lib_bz2_BZ2_bzCompressInit" >&5
+echo "${ECHO_T}$ac_cv_lib_bz2_BZ2_bzCompressInit" >&6; }
+if test $ac_cv_lib_bz2_BZ2_bzCompressInit = yes; then
+
+         have_bz2=yes
+         ZLIBS="$ZLIBS -lbz2"
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_BZIP2 1
+_ACEOF
+
+
+else
+  CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}
+fi
+
+else
+  CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}
+fi
+
+
+  fi
+fi
+
+
+
+if test x"$have_bz2" = "xyes"; then
+  ENABLE_BZIP2_SUPPORT_TRUE=
+  ENABLE_BZIP2_SUPPORT_FALSE='#'
+else
+  ENABLE_BZIP2_SUPPORT_TRUE='#'
+  ENABLE_BZIP2_SUPPORT_FALSE=
+fi
+
+
+
+# libusb allows us to use the integrated CCID smartcard reader driver.
+
+
+# Check whether --with-libusb was given.
+if test "${with_libusb+set}" = set; then
+  withval=$with_libusb; _do_libusb=$withval
+else
+  _do_libusb=yes
+fi
+
+
+  if test "$_do_libusb" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+        # Extract the first word of ""$_do_libusb/bin/libusb-config"", so it can be a program name with args.
+set dummy "$_do_libusb/bin/libusb-config"; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path__usb_config+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $_usb_config in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path__usb_config="$_usb_config" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path__usb_config="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+_usb_config=$ac_cv_path__usb_config
+if test -n "$_usb_config"; then
+  { echo "$as_me:$LINENO: result: $_usb_config" >&5
+echo "${ECHO_T}$_usb_config" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+     else
+        # Extract the first word of "libusb-config", so it can be a program name with args.
+set dummy libusb-config; ac_word=$2
+{ echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+if test "${ac_cv_path__usb_config+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  case $_usb_config in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path__usb_config="$_usb_config" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path__usb_config="$as_dir/$ac_word$ac_exec_ext"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+_usb_config=$ac_cv_path__usb_config
+if test -n "$_usb_config"; then
+  { echo "$as_me:$LINENO: result: $_usb_config" >&5
+echo "${ECHO_T}$_usb_config" >&6; }
+else
+  { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+fi
+
+
+     fi
+
+     _libusb_save_libs=$LIBS
+     _libusb_save_cflags=$CFLAGS
+
+     if test x$_usb_config != "x" ; then
+        _libusb_try_libs=`$LIBS $_usb_config --libs`
+        _libusb_try_cflags=`$LIBS $_usb_config --cflags`
+     else
+        _libusb_try_libs="-lusb"
+        _libusb_try_cflags=""
+     fi
+
+     LIBS="$LIBS $_libusb_try_libs"
+     CFLAGS="$CFLAGS $_libusb_try_cflags"
+
+     { echo "$as_me:$LINENO: checking whether libusb is present and sane" >&5
+echo $ECHO_N "checking whether libusb is present and sane... $ECHO_C" >&6; }
+
+     cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <usb.h>
+int
+main ()
+{
+
+usb_bulk_write(NULL,0,NULL,0,0);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  _found_libusb=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       _found_libusb=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+     { echo "$as_me:$LINENO: result: $_found_libusb" >&5
+echo "${ECHO_T}$_found_libusb" >&6; }
+
+     if test $_found_libusb = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBUSB 1
+_ACEOF
+
+        LIBUSB_CPPFLAGS=$_libusb_try_cflags
+
+        LIBUSB=$_libusb_try_libs
+
+
+for ac_func in usb_get_busses
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $ac_func
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$ac_func || defined __stub___$ac_func
+choke me
+#endif
+
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  eval "$as_ac_var=yes"
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       eval "$as_ac_var=no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+fi
+ac_res=`eval echo '${'$as_ac_var'}'`
+              { echo "$as_me:$LINENO: result: $ac_res" >&5
+echo "${ECHO_T}$ac_res" >&6; }
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+  cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+done
+
+     fi
+
+     LIBS=$_libusb_save_libs
+     CFLAGS=$_libusb_save_cflags
+
+     unset _libusb_save_libs
+     unset _libusb_save_cflags
+     unset _libusb_try_libs
+     unset _libusb_try_cflags
+     unset _found_libusb
+  fi
+
+
+# Check for readline support
+
+
+# Check whether --with-readline was given.
+if test "${with_readline+set}" = set; then
+  withval=$with_readline; _do_readline=$withval
+else
+  _do_readline=yes
+fi
+
+
+  if test "$_do_readline" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+     for _termcap in "" "-ltermcap" "-lcurses" "-lncurses" ; do
+        _readline_save_libs=$LIBS
+        _combo="-lreadline${_termcap:+ $_termcap}"
+        LIBS="$LIBS $_combo"
+
+        { echo "$as_me:$LINENO: checking whether readline via \"$_combo\" is present and sane" >&5
+echo $ECHO_N "checking whether readline via \"$_combo\" is present and sane... $ECHO_C" >&6; }
+
+        cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+
+int
+main ()
+{
+
+rl_completion_func_t *completer;
+add_history("foobar");
+rl_catch_signals=0;
+rl_inhibit_completion=0;
+rl_attempted_completion_function=NULL;
+rl_completion_matches(NULL,NULL);
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_link") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest$ac_exeext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  _found_readline=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       _found_readline=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
+      conftest$ac_exeext conftest.$ac_ext
+
+        { echo "$as_me:$LINENO: result: $_found_readline" >&5
+echo "${ECHO_T}$_found_readline" >&6; }
+
+        LIBS=$_readline_save_libs
+
+        if test $_found_readline = yes ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_LIBREADLINE 1
+_ACEOF
+
+           LIBREADLINE=$_combo
+
+           break
+        fi
+     done
+
+     unset _termcap
+     unset _readline_save_libs
+     unset _combo
+     unset _found_readline
+  fi
+
+
+# Allow users to append something to the version string without
+# flagging it as development version.  The user version parts is
+# considered everything after a dash.
+if test "$development_version" != yes; then
+    tmp_pat='[a-zA-Z]'
+    if echo "$VERSION" | sed 's/-.*//' | grep "$tmp_pat" >/dev/null ; then
+    development_version=yes
+  fi
+fi
+if test "$development_version" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define IS_DEVELOPMENT_VERSION 1
+_ACEOF
+
+fi
+
+
+
+if test x$cross_compiling = xyes; then
+  CROSS_COMPILING_TRUE=
+  CROSS_COMPILING_FALSE='#'
+else
+  CROSS_COMPILING_TRUE='#'
+  CROSS_COMPILING_FALSE=
+fi
+
+
+
+# add some extra libs here so that previous tests don't fail for
+# mysterious reasons - the final link step should bail out.
+case "${host}" in
+    *-mingw32*)
+       W32LIBS="-lwsock32"
+        ;;
+    *)
+       ;;
+esac
+
+
+
+
+# Special options used with gcc.
+if test "$GCC" = yes; then
+    # Note that it is okay to use CFLAGS here because this are just
+    # warning options and the user should have a chance of overriding
+    #them.
+    if test "$USE_MAINTAINER_MODE" = "yes"; then
+        CFLAGS="$CFLAGS -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
+        CFLAGS="$CFLAGS -Wformat-nonliteral"
+    else
+        CFLAGS="$CFLAGS -Wall"
+    fi
+
+    # This is handy for debugging so the compiler doesn't rearrange
+    # things and eliminate variables.
+    # Check whether --enable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+  enableval=$enable_optimization; if test $enableval = no ; then
+                         CFLAGS=`echo $CFLAGS | sed 's/-O[0-9]//'`
+                       fi
+fi
+
+
+    { echo "$as_me:$LINENO: checking if gcc supports -Wno-pointer-sign" >&5
+echo $ECHO_N "checking if gcc supports -Wno-pointer-sign... $ECHO_C" >&6; }
+
+    _gcc_cflags_save=$CFLAGS
+    CFLAGS="-Wno-pointer-sign"
+
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  _gcc_psign=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       _gcc_psign=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    { echo "$as_me:$LINENO: result: $_gcc_psign" >&5
+echo "${ECHO_T}$_gcc_psign" >&6; }
+
+    CFLAGS=$_gcc_cflags_save;
+
+    if test x"$_gcc_psign" = xyes ; then
+       CFLAGS="$CFLAGS -Wno-pointer-sign"
+    fi
+fi
+
+# By default we simply use the C compiler to build assembly code.
+
+test "${CCAS+set}" = set || CCAS=$CC
+test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+
+
+
+
+
+
+
+{ echo "$as_me:$LINENO: checking whether non excutable stack support is requested" >&5
+echo $ECHO_N "checking whether non excutable stack support is requested... $ECHO_C" >&6; }
+# Check whether --enable-noexecstack was given.
+if test "${enable_noexecstack+set}" = set; then
+  enableval=$enable_noexecstack; noexecstack_support=$enableval
+else
+  noexecstack_support=no
+fi
+
+{ echo "$as_me:$LINENO: result: $noexecstack_support" >&5
+echo "${ECHO_T}$noexecstack_support" >&6; }
+
+{ echo "$as_me:$LINENO: checking whether assembler supports --noexecstack option" >&5
+echo $ECHO_N "checking whether assembler supports --noexecstack option... $ECHO_C" >&6; }
+if test "${cl_cv_as_noexecstack+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+    cat > conftest.c <<EOF
+void foo() {}
+EOF
+  if { ac_try='${CC} $CFLAGS $CPPFLAGS
+                     -S -o conftest.s conftest.c >/dev/null'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } \
+     && grep -q .note.GNU-stack conftest.s \
+     && { ac_try='${CCAS} $CCASFLAGS $CPPFLAGS -Wa,--noexecstack
+                       -c -o conftest.o conftest.s >/dev/null'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }
+  then
+    cl_cv_as_noexecstack=yes
+  else
+    cl_cv_as_noexecstack=no
+  fi
+  rm -f conftest*
+fi
+{ echo "$as_me:$LINENO: result: $cl_cv_as_noexecstack" >&5
+echo "${ECHO_T}$cl_cv_as_noexecstack" >&6; }
+  if test "$noexecstack_support" = yes -a "$cl_cv_as_noexecstack" = yes; then
+       NOEXECSTACK_FLAGS="-Wa,--noexecstack"
+  else
+        NOEXECSTACK_FLAGS=
+  fi
+
+
+
+if test "$print_egd_warning" = yes; then
+  { echo "$as_me:$LINENO: WARNING:
+***
+*** The performance of the UNIX random gatherer module is not very good
+*** and it does not keep the entropy pool over multiple invocations of
+*** GnuPG.  The suggested way to overcome this problem is to use the
+***
+***               Entropy Gathering Daemon (EGD)
+***
+*** which provides a entropy source for the whole system.  It is written
+*** in Perl and available at the GnuPG FTP servers.  For more information
+*** consult the GnuPG webpages:
+***
+***           http://www.gnupg.org/download/#EGD
+***
+*** You may want to run ./configure with --enable-static-rnd=egd or
+*** --enable-static-rnd=auto to use it.
+***" >&5
+echo "$as_me: WARNING:
+***
+*** The performance of the UNIX random gatherer module is not very good
+*** and it does not keep the entropy pool over multiple invocations of
+*** GnuPG.  The suggested way to overcome this problem is to use the
+***
+***               Entropy Gathering Daemon (EGD)
+***
+*** which provides a entropy source for the whole system.  It is written
+*** in Perl and available at the GnuPG FTP servers.  For more information
+*** consult the GnuPG webpages:
+***
+***           http://www.gnupg.org/download/#EGD
+***
+*** You may want to run ./configure with --enable-static-rnd=egd or
+*** --enable-static-rnd=auto to use it.
+***" >&2;}
+fi
+
+# Note the \\\\ for backslashes.  Autoconf eats one layer, leaving \\
+
+ac_config_commands="$ac_config_commands g10defs.h"
+
+
+
+ac_config_files="$ac_config_files Makefile m4/Makefile intl/Makefile po/Makefile.in util/Makefile mpi/Makefile cipher/Makefile g10/Makefile keyserver/Makefile keyserver/gpgkeys_mailto keyserver/gpgkeys_test doc/Makefile tools/Makefile tools/gpg-zip zlib/Makefile checks/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
+echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      *) $as_unset $ac_var ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+       "s/'/'\\\\''/g;
+         s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    test "x$cache_file" != "x/dev/null" &&
+      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
+echo "$as_me: updating cache $cache_file" >&6;}
+    cat confcache >$cache_file
+  else
+    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_DOCBOOK_TO_MAN_TRUE}" && test -z "${HAVE_DOCBOOK_TO_MAN_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_DOCBOOK_TO_MAN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_DOCBOOK_TO_MAN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${WORKING_FAQPROG_TRUE}" && test -z "${WORKING_FAQPROG_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"WORKING_FAQPROG\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"WORKING_FAQPROG\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_DOCBOOK_TO_TEXI_TRUE}" && test -z "${HAVE_DOCBOOK_TO_TEXI_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_DOCBOOK_TO_TEXI\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_DOCBOOK_TO_TEXI\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_USTAR_TRUE}" && test -z "${HAVE_USTAR_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_USTAR\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_USTAR\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_DOSISH_SYSTEM_TRUE}" && test -z "${HAVE_DOSISH_SYSTEM_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_DOSISH_SYSTEM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_DOSISH_SYSTEM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_SIMPLE_GETTEXT_TRUE}" && test -z "${USE_SIMPLE_GETTEXT_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_SIMPLE_GETTEXT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_SIMPLE_GETTEXT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_W32_SYSTEM_TRUE}" && test -z "${HAVE_W32_SYSTEM_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"HAVE_W32_SYSTEM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_W32_SYSTEM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_DNS_SRV_TRUE}" && test -z "${USE_DNS_SRV_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_DNS_SRV\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_DNS_SRV\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${FAKE_CURL_TRUE}" && test -z "${FAKE_CURL_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"FAKE_CURL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"FAKE_CURL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_CARD_SUPPORT_TRUE}" && test -z "${ENABLE_CARD_SUPPORT_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_CARD_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_CARD_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_AGENT_SUPPORT_TRUE}" && test -z "${ENABLE_AGENT_SUPPORT_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_AGENT_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_AGENT_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_SHA512_TRUE}" && test -z "${USE_SHA512_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_SHA512\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_SHA512\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_RNDLINUX_TRUE}" && test -z "${USE_RNDLINUX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_RNDLINUX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_RNDLINUX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_RNDUNIX_TRUE}" && test -z "${USE_RNDUNIX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_RNDUNIX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_RNDUNIX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_RNDEGD_TRUE}" && test -z "${USE_RNDEGD_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_RNDEGD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_RNDEGD\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_RNDW32_TRUE}" && test -z "${USE_RNDW32_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_RNDW32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_RNDW32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INTERNAL_REGEX_TRUE}" && test -z "${USE_INTERNAL_REGEX_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"USE_INTERNAL_REGEX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INTERNAL_REGEX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_LOCAL_ZLIB_TRUE}" && test -z "${ENABLE_LOCAL_ZLIB_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_LOCAL_ZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_LOCAL_ZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_LOCAL_ZLIB_TRUE}" && test -z "${ENABLE_LOCAL_ZLIB_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_LOCAL_ZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_LOCAL_ZLIB\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_BZIP2_SUPPORT_TRUE}" && test -z "${ENABLE_BZIP2_SUPPORT_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"ENABLE_BZIP2_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_BZIP2_SUPPORT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${CROSS_COMPILING_TRUE}" && test -z "${CROSS_COMPILING_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"CROSS_COMPILING\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"CROSS_COMPILING\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+
+# PATH needs CR
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+as_nl='
+'
+IFS=" ""       $as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+case $0 in
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  { (exit 1); exit 1; }
+fi
+
+# Work around bugs in pre-3.0 UWIN ksh.
+for as_var in ENV MAIL MAILPATH
+do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+        X"$0" : 'X\(//\)$' \| \
+        X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\/\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line after each line using $LINENO; the second 'sed'
+  # does the real work.  The second script uses 'N' to pair each
+  # line-number line with the line containing $LINENO, and appends
+  # trailing '-' during substitution so that $LINENO is not a special
+  # case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # scripts with optimization help from Paolo Bonzini.  Blame Lee
+  # E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in
+-n*)
+  case `echo 'x\c'` in
+  *c*) ECHO_T='        ';;     # ECHO_T is single tab character.
+  *)   ECHO_C='\c';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir
+fi
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s='ln -s'
+  # ... but there are two gotchas:
+  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+  # In both cases, we have to default to `cp -p'.
+  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+    as_ln_s='cp -p'
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+# Find out whether ``test -x'' works.  Don't use a zero-byte file, as
+# systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  as_executable_p="test -x"
+else
+  as_executable_p=:
+fi
+rm -f conf$$.file
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+
+# Save the log message, to keep $[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by gnupg $as_me 1.4.6, which was
+generated by GNU Autoconf 2.60a.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_links="$ac_config_links"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                  instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                  instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration links:
+$config_links
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+gnupg config.status 1.4.6
+configured by $0, generated by GNU Autoconf 2.60a,
+  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2006 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    echo "$ac_cs_version"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    { echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  CONFIG_SHELL=$SHELL
+  export CONFIG_SHELL
+  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+
+# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+
+
+prefix=$prefix
+exec_prefix=$exec_prefix
+libdir=$libdir
+libexecdir=$libexecdir
+datadir=$datadir
+DATADIRNAME=$DATADIRNAME
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;;
+    "default-2") CONFIG_COMMANDS="$CONFIG_COMMANDS default-2" ;;
+    ""$mpi_ln_list"") CONFIG_LINKS="$CONFIG_LINKS "$mpi_ln_list"" ;;
+    "zlib.h") CONFIG_LINKS="$CONFIG_LINKS zlib.h:zlib/zlib.h" ;;
+    "zconf.h") CONFIG_LINKS="$CONFIG_LINKS zconf.h:zlib/zconf.h" ;;
+    "g10defs.h") CONFIG_COMMANDS="$CONFIG_COMMANDS g10defs.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;
+    "intl/Makefile") CONFIG_FILES="$CONFIG_FILES intl/Makefile" ;;
+    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+    "util/Makefile") CONFIG_FILES="$CONFIG_FILES util/Makefile" ;;
+    "mpi/Makefile") CONFIG_FILES="$CONFIG_FILES mpi/Makefile" ;;
+    "cipher/Makefile") CONFIG_FILES="$CONFIG_FILES cipher/Makefile" ;;
+    "g10/Makefile") CONFIG_FILES="$CONFIG_FILES g10/Makefile" ;;
+    "keyserver/Makefile") CONFIG_FILES="$CONFIG_FILES keyserver/Makefile" ;;
+    "keyserver/gpgkeys_mailto") CONFIG_FILES="$CONFIG_FILES keyserver/gpgkeys_mailto" ;;
+    "keyserver/gpgkeys_test") CONFIG_FILES="$CONFIG_FILES keyserver/gpgkeys_test" ;;
+    "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
+    "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
+    "tools/gpg-zip") CONFIG_FILES="$CONFIG_FILES tools/gpg-zip" ;;
+    "zlib/Makefile") CONFIG_FILES="$CONFIG_FILES zlib/Makefile" ;;
+    "checks/Makefile") CONFIG_FILES="$CONFIG_FILES checks/Makefile" ;;
+
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_LINKS+set}" = set || CONFIG_LINKS=$config_links
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp=
+  trap 'exit_status=$?
+  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+#
+# Set up the sed scripts for CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "$CONFIG_FILES"; then
+
+_ACEOF
+
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+SHELL!$SHELL$ac_delim
+PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
+PACKAGE_NAME!$PACKAGE_NAME$ac_delim
+PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
+PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
+PACKAGE_STRING!$PACKAGE_STRING$ac_delim
+PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
+exec_prefix!$exec_prefix$ac_delim
+prefix!$prefix$ac_delim
+program_transform_name!$program_transform_name$ac_delim
+bindir!$bindir$ac_delim
+sbindir!$sbindir$ac_delim
+libexecdir!$libexecdir$ac_delim
+datarootdir!$datarootdir$ac_delim
+datadir!$datadir$ac_delim
+sysconfdir!$sysconfdir$ac_delim
+sharedstatedir!$sharedstatedir$ac_delim
+localstatedir!$localstatedir$ac_delim
+includedir!$includedir$ac_delim
+oldincludedir!$oldincludedir$ac_delim
+docdir!$docdir$ac_delim
+infodir!$infodir$ac_delim
+htmldir!$htmldir$ac_delim
+dvidir!$dvidir$ac_delim
+pdfdir!$pdfdir$ac_delim
+psdir!$psdir$ac_delim
+libdir!$libdir$ac_delim
+localedir!$localedir$ac_delim
+mandir!$mandir$ac_delim
+DEFS!$DEFS$ac_delim
+ECHO_C!$ECHO_C$ac_delim
+ECHO_N!$ECHO_N$ac_delim
+ECHO_T!$ECHO_T$ac_delim
+LIBS!$LIBS$ac_delim
+build_alias!$build_alias$ac_delim
+host_alias!$host_alias$ac_delim
+target_alias!$target_alias$ac_delim
+build!$build$ac_delim
+build_cpu!$build_cpu$ac_delim
+build_vendor!$build_vendor$ac_delim
+build_os!$build_os$ac_delim
+host!$host$ac_delim
+host_cpu!$host_cpu$ac_delim
+host_vendor!$host_vendor$ac_delim
+host_os!$host_os$ac_delim
+INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
+INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
+INSTALL_DATA!$INSTALL_DATA$ac_delim
+CYGPATH_W!$CYGPATH_W$ac_delim
+PACKAGE!$PACKAGE$ac_delim
+VERSION!$VERSION$ac_delim
+ACLOCAL!$ACLOCAL$ac_delim
+AUTOCONF!$AUTOCONF$ac_delim
+AUTOMAKE!$AUTOMAKE$ac_delim
+AUTOHEADER!$AUTOHEADER$ac_delim
+MAKEINFO!$MAKEINFO$ac_delim
+install_sh!$install_sh$ac_delim
+STRIP!$STRIP$ac_delim
+INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
+mkdir_p!$mkdir_p$ac_delim
+AWK!$AWK$ac_delim
+SET_MAKE!$SET_MAKE$ac_delim
+am__leading_dot!$am__leading_dot$ac_delim
+AMTAR!$AMTAR$ac_delim
+am__tar!$am__tar$ac_delim
+am__untar!$am__untar$ac_delim
+IDEA_O!$IDEA_O$ac_delim
+MAINTAINER_MODE_TRUE!$MAINTAINER_MODE_TRUE$ac_delim
+MAINTAINER_MODE_FALSE!$MAINTAINER_MODE_FALSE$ac_delim
+MAINT!$MAINT$ac_delim
+CC!$CC$ac_delim
+CFLAGS!$CFLAGS$ac_delim
+LDFLAGS!$LDFLAGS$ac_delim
+CPPFLAGS!$CPPFLAGS$ac_delim
+ac_ct_CC!$ac_ct_CC$ac_delim
+EXEEXT!$EXEEXT$ac_delim
+OBJEXT!$OBJEXT$ac_delim
+DEPDIR!$DEPDIR$ac_delim
+am__include!$am__include$ac_delim
+am__quote!$am__quote$ac_delim
+AMDEP_TRUE!$AMDEP_TRUE$ac_delim
+AMDEP_FALSE!$AMDEP_FALSE$ac_delim
+AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
+CCDEPMODE!$CCDEPMODE$ac_delim
+am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
+am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
+CPP!$CPP$ac_delim
+RANLIB!$RANLIB$ac_delim
+AR!$AR$ac_delim
+PERL!$PERL$ac_delim
+DOCBOOK_TO_MAN!$DOCBOOK_TO_MAN$ac_delim
+HAVE_DOCBOOK_TO_MAN_TRUE!$HAVE_DOCBOOK_TO_MAN_TRUE$ac_delim
+HAVE_DOCBOOK_TO_MAN_FALSE!$HAVE_DOCBOOK_TO_MAN_FALSE$ac_delim
+FAQPROG!$FAQPROG$ac_delim
+WORKING_FAQPROG_TRUE!$WORKING_FAQPROG_TRUE$ac_delim
+WORKING_FAQPROG_FALSE!$WORKING_FAQPROG_FALSE$ac_delim
+DOCBOOK_TO_TEXI!$DOCBOOK_TO_TEXI$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+HAVE_DOCBOOK_TO_TEXI_TRUE!$HAVE_DOCBOOK_TO_TEXI_TRUE$ac_delim
+HAVE_DOCBOOK_TO_TEXI_FALSE!$HAVE_DOCBOOK_TO_TEXI_FALSE$ac_delim
+TAR!$TAR$ac_delim
+HAVE_USTAR_TRUE!$HAVE_USTAR_TRUE$ac_delim
+HAVE_USTAR_FALSE!$HAVE_USTAR_FALSE$ac_delim
+CC_FOR_BUILD!$CC_FOR_BUILD$ac_delim
+HAVE_DOSISH_SYSTEM_TRUE!$HAVE_DOSISH_SYSTEM_TRUE$ac_delim
+HAVE_DOSISH_SYSTEM_FALSE!$HAVE_DOSISH_SYSTEM_FALSE$ac_delim
+USE_SIMPLE_GETTEXT_TRUE!$USE_SIMPLE_GETTEXT_TRUE$ac_delim
+USE_SIMPLE_GETTEXT_FALSE!$USE_SIMPLE_GETTEXT_FALSE$ac_delim
+HAVE_W32_SYSTEM_TRUE!$HAVE_W32_SYSTEM_TRUE$ac_delim
+HAVE_W32_SYSTEM_FALSE!$HAVE_W32_SYSTEM_FALSE$ac_delim
+MPI_OPT_FLAGS!$MPI_OPT_FLAGS$ac_delim
+NM!$NM$ac_delim
+GPGKEYS_HKP!$GPGKEYS_HKP$ac_delim
+GPGKEYS_FINGER!$GPGKEYS_FINGER$ac_delim
+DNSLIBS!$DNSLIBS$ac_delim
+USE_DNS_SRV_TRUE!$USE_DNS_SRV_TRUE$ac_delim
+USE_DNS_SRV_FALSE!$USE_DNS_SRV_FALSE$ac_delim
+GPGKEYS_LDAP!$GPGKEYS_LDAP$ac_delim
+LDAPLIBS!$LDAPLIBS$ac_delim
+LDAP_CPPFLAGS!$LDAP_CPPFLAGS$ac_delim
+_libcurl_config!$_libcurl_config$ac_delim
+LIBCURL_CPPFLAGS!$LIBCURL_CPPFLAGS$ac_delim
+LIBCURL!$LIBCURL$ac_delim
+FAKE_CURL_TRUE!$FAKE_CURL_TRUE$ac_delim
+FAKE_CURL_FALSE!$FAKE_CURL_FALSE$ac_delim
+GPGKEYS_CURL!$GPGKEYS_CURL$ac_delim
+SENDMAIL!$SENDMAIL$ac_delim
+GPGKEYS_MAILTO!$GPGKEYS_MAILTO$ac_delim
+MKINSTALLDIRS!$MKINSTALLDIRS$ac_delim
+USE_NLS!$USE_NLS$ac_delim
+MSGFMT!$MSGFMT$ac_delim
+GMSGFMT!$GMSGFMT$ac_delim
+XGETTEXT!$XGETTEXT$ac_delim
+MSGMERGE!$MSGMERGE$ac_delim
+GREP!$GREP$ac_delim
+EGREP!$EGREP$ac_delim
+ALLOCA!$ALLOCA$ac_delim
+GLIBC21!$GLIBC21$ac_delim
+HAVE_POSIX_PRINTF!$HAVE_POSIX_PRINTF$ac_delim
+HAVE_ASPRINTF!$HAVE_ASPRINTF$ac_delim
+HAVE_SNPRINTF!$HAVE_SNPRINTF$ac_delim
+HAVE_WPRINTF!$HAVE_WPRINTF$ac_delim
+LIBICONV!$LIBICONV$ac_delim
+LTLIBICONV!$LTLIBICONV$ac_delim
+INTLBISON!$INTLBISON$ac_delim
+BUILD_INCLUDED_LIBINTL!$BUILD_INCLUDED_LIBINTL$ac_delim
+USE_INCLUDED_LIBINTL!$USE_INCLUDED_LIBINTL$ac_delim
+CATOBJEXT!$CATOBJEXT$ac_delim
+DATADIRNAME!$DATADIRNAME$ac_delim
+INSTOBJEXT!$INSTOBJEXT$ac_delim
+GENCAT!$GENCAT$ac_delim
+INTLOBJS!$INTLOBJS$ac_delim
+INTL_LIBTOOL_SUFFIX_PREFIX!$INTL_LIBTOOL_SUFFIX_PREFIX$ac_delim
+INTLLIBS!$INTLLIBS$ac_delim
+LIBINTL!$LIBINTL$ac_delim
+LTLIBINTL!$LTLIBINTL$ac_delim
+POSUB!$POSUB$ac_delim
+DLLIBS!$DLLIBS$ac_delim
+ENABLE_CARD_SUPPORT_TRUE!$ENABLE_CARD_SUPPORT_TRUE$ac_delim
+ENABLE_CARD_SUPPORT_FALSE!$ENABLE_CARD_SUPPORT_FALSE$ac_delim
+ENABLE_AGENT_SUPPORT_TRUE!$ENABLE_AGENT_SUPPORT_TRUE$ac_delim
+ENABLE_AGENT_SUPPORT_FALSE!$ENABLE_AGENT_SUPPORT_FALSE$ac_delim
+USE_SHA512_TRUE!$USE_SHA512_TRUE$ac_delim
+USE_SHA512_FALSE!$USE_SHA512_FALSE$ac_delim
+LIBOBJS!$LIBOBJS$ac_delim
+GETOPT!$GETOPT$ac_delim
+CAPLIBS!$CAPLIBS$ac_delim
+USE_RNDLINUX_TRUE!$USE_RNDLINUX_TRUE$ac_delim
+USE_RNDLINUX_FALSE!$USE_RNDLINUX_FALSE$ac_delim
+USE_RNDUNIX_TRUE!$USE_RNDUNIX_TRUE$ac_delim
+USE_RNDUNIX_FALSE!$USE_RNDUNIX_FALSE$ac_delim
+USE_RNDEGD_TRUE!$USE_RNDEGD_TRUE$ac_delim
+USE_RNDEGD_FALSE!$USE_RNDEGD_FALSE$ac_delim
+USE_RNDW32_TRUE!$USE_RNDW32_TRUE$ac_delim
+USE_RNDW32_FALSE!$USE_RNDW32_FALSE$ac_delim
+MPI_EXTRA_ASM_OBJS!$MPI_EXTRA_ASM_OBJS$ac_delim
+MPI_SFLAGS!$MPI_SFLAGS$ac_delim
+USE_INTERNAL_REGEX_TRUE!$USE_INTERNAL_REGEX_TRUE$ac_delim
+USE_INTERNAL_REGEX_FALSE!$USE_INTERNAL_REGEX_FALSE$ac_delim
+ENABLE_LOCAL_ZLIB_TRUE!$ENABLE_LOCAL_ZLIB_TRUE$ac_delim
+ENABLE_LOCAL_ZLIB_FALSE!$ENABLE_LOCAL_ZLIB_FALSE$ac_delim
+ENABLE_BZIP2_SUPPORT_TRUE!$ENABLE_BZIP2_SUPPORT_TRUE$ac_delim
+ENABLE_BZIP2_SUPPORT_FALSE!$ENABLE_BZIP2_SUPPORT_FALSE$ac_delim
+ZLIBS!$ZLIBS$ac_delim
+_usb_config!$_usb_config$ac_delim
+LIBUSB_CPPFLAGS!$LIBUSB_CPPFLAGS$ac_delim
+LIBUSB!$LIBUSB$ac_delim
+LIBREADLINE!$LIBREADLINE$ac_delim
+CROSS_COMPILING_TRUE!$CROSS_COMPILING_TRUE$ac_delim
+CROSS_COMPILING_FALSE!$CROSS_COMPILING_FALSE$ac_delim
+NETLIBS!$NETLIBS$ac_delim
+W32LIBS!$W32LIBS$ac_delim
+CCAS!$CCAS$ac_delim
+CCASFLAGS!$CCASFLAGS$ac_delim
+NOEXECSTACK_FLAGS!$NOEXECSTACK_FLAGS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+CEOF$ac_eof
+_ACEOF
+
+
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  cat >conf$$subs.sed <<_ACEOF
+LTLIBOBJS!$LTLIBOBJS$ac_delim
+_ACEOF
+
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 1; then
+    break
+  elif $ac_last_try; then
+    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
+if test -n "$ac_eof"; then
+  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
+  ac_eof=`expr $ac_eof + 1`
+fi
+
+cat >>$CONFIG_STATUS <<_ACEOF
+cat >"\$tmp/subs-3.sed" <<\CEOF$ac_eof
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACEOF
+sed '
+s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
+s/^/s,@/; s/!/@,|#_!!_#|/
+:n
+t n
+s/'"$ac_delim"'$/,g/; t
+s/$/\\/; p
+N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
+' >>$CONFIG_STATUS <conf$$subs.sed
+rm -f conf$$subs.sed
+cat >>$CONFIG_STATUS <<_ACEOF
+:end
+s/|#_!!_#|//g
+CEOF$ac_eof
+_ACEOF
+
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[         ]*VPATH[        ]*=/{
+s/:*\$(srcdir):*/:/
+s/:*\${srcdir}:*/:/
+s/:*@srcdir@:*/:/
+s/^\([^=]*=[    ]*\):*/\1/
+s/:*$//
+s/^[^=]*=[      ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+fi # test -n "$CONFIG_FILES"
+
+
+for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS  :L $CONFIG_LINKS  :C $CONFIG_COMMANDS
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
+echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+   { (exit 1); exit 1; }; };;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+        # (if the path is not absolute).  The absolute path cannot be DOS-style,
+        # because $ac_f cannot contain `:'.
+        test -f "$ac_f" ||
+          case $ac_f in
+          [\\/$]*) false;;
+          *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+          esac ||
+          { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+   { (exit 1); exit 1; }; };;
+      esac
+      ac_file_inputs="$ac_file_inputs $ac_f"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input="Generated from "`IFS=:
+         echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    fi
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$tmp/stdin";;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$ac_file" : 'X\(//\)[^/]' \| \
+        X"$ac_file" : 'X\(//\)$' \| \
+        X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  { as_dir="$ac_dir"
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+
+case `sed -n '/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p
+' $ac_file_inputs` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+    s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s&@configure_input@&$configure_input&;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+$ac_datarootdir_hack
+" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" | sed -f "$tmp/subs-3.sed" >$tmp/out
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[         ]*datarootdir[  ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&5
+echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined." >&2;}
+
+  rm -f "$tmp/stdin"
+  case $ac_file in
+  -) cat "$tmp/out"; rm -f "$tmp/out";;
+  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
+  esac
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+_ACEOF
+
+# Transform confdefs.h into a sed script `conftest.defines', that
+# substitutes the proper values into config.h.in to produce config.h.
+rm -f conftest.defines conftest.tail
+# First, append a space to every undef/define line, to ease matching.
+echo 's/$/ /' >conftest.defines
+# Then, protect against being on the right side of a sed subst, or in
+# an unquoted here document, in config.status.  If some macros were
+# called several times there might be several #defines for the same
+# symbol, which is useless.  But do not sort them, since the last
+# AC_DEFINE must be honored.
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
+# NAME is the cpp macro being defined, VALUE is the value it is being given.
+# PARAMS is the parameter list in the macro definition--in most cases, it's
+# just an empty string.
+ac_dA='s,^\\([  #]*\\)[^        ]*\\([  ]*'
+ac_dB='\\)[     (].*,\\1define\\2'
+ac_dC=' '
+ac_dD=' ,'
+
+uniq confdefs.h |
+  sed -n '
+       t rset
+       :rset
+       s/^[     ]*#[    ]*define[       ][      ]*//
+       t ok
+       d
+       :ok
+       s/[\\&,]/\\&/g
+       s/^\('"$ac_word_re"'\)\(([^()]*)\)[      ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
+       s/^\('"$ac_word_re"'\)[  ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
+  ' >>conftest.defines
+
+# Remove the space that was appended to ease matching.
+# Then replace #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+# (The regexp can be short, since the line contains either #define or #undef.)
+echo 's/ $//
+s,^[    #]*u.*,/* & */,' >>conftest.defines
+
+# Break up conftest.defines:
+ac_max_sed_lines=50
+
+# First sed command is:         sed -f defines.sed $ac_file_inputs >"$tmp/out1"
+# Second one is:        sed -f defines.sed "$tmp/out1" >"$tmp/out2"
+# Third one will be:    sed -f defines.sed "$tmp/out2" >"$tmp/out1"
+# et cetera.
+ac_in='$ac_file_inputs'
+ac_out='"$tmp/out1"'
+ac_nxt='"$tmp/out2"'
+
+while :
+do
+  # Write a here document:
+    cat >>$CONFIG_STATUS <<_ACEOF
+    # First, check the format of the line:
+    cat >"\$tmp/defines.sed" <<\\CEOF
+/^[     ]*#[    ]*undef[        ][      ]*$ac_word_re[  ]*\$/b def
+/^[     ]*#[    ]*define[       ][      ]*$ac_word_re[(         ]/b def
+b
+:def
+_ACEOF
+  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
+  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
+  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
+  grep . conftest.tail >/dev/null || break
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines conftest.tail
+
+echo "ac_result=$ac_in" >>$CONFIG_STATUS
+cat >>$CONFIG_STATUS <<\_ACEOF
+  if test x"$ac_file" != x-; then
+    echo "/* $configure_input  */" >"$tmp/config.h"
+    cat "$ac_result" >>"$tmp/config.h"
+    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f $ac_file
+      mv "$tmp/config.h" $ac_file
+    fi
+  else
+    echo "/* $configure_input  */"
+    cat "$ac_result"
+  fi
+  rm -f "$tmp/out12"
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $ac_file | $ac_file:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $ac_file" >`$as_dirname -- $ac_file ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X$ac_file : 'X\(//\)[^/]' \| \
+        X$ac_file : 'X\(//\)$' \| \
+        X$ac_file : 'X\(/\)' \| . 2>/dev/null ||
+echo X$ac_file |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+  :L)
+  #
+  # CONFIG_LINK
+  #
+
+  { echo "$as_me:$LINENO: linking $srcdir/$ac_source to $ac_file" >&5
+echo "$as_me: linking $srcdir/$ac_source to $ac_file" >&6;}
+
+  if test ! -r "$srcdir/$ac_source"; then
+    { { echo "$as_me:$LINENO: error: $srcdir/$ac_source: file not found" >&5
+echo "$as_me: error: $srcdir/$ac_source: file not found" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  rm -f "$ac_file"
+
+  # Try a relative symlink, then a hard link, then a copy.
+  case $srcdir in
+  [\\/$]* | ?:[\\/]* ) ac_rel_source=$srcdir/$ac_source ;;
+      *) ac_rel_source=$ac_top_build_prefix$srcdir/$ac_source ;;
+  esac
+  ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
+    ln "$srcdir/$ac_source" "$ac_file" 2>/dev/null ||
+    cp -p "$srcdir/$ac_source" "$ac_file" ||
+    { { echo "$as_me:$LINENO: error: cannot link or copy $srcdir/$ac_source to $ac_file" >&5
+echo "$as_me: error: cannot link or copy $srcdir/$ac_source to $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+ ;;
+  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
+echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
+  # Strip MF so we end up with the name of the file.
+  mf=`echo "$mf" | sed -e 's/:.*$//'`
+  # Check whether this is an Automake generated Makefile or not.
+  # We used to match only the files named `Makefile.in', but
+  # some people rename them; so instead we look at the file content.
+  # Grep'ing the first line is not enough: some people post-process
+  # each Makefile.in and add a new line on top of each file to say so.
+  # So let's grep whole file.
+  if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+    dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$mf" : 'X\(//\)[^/]' \| \
+        X"$mf" : 'X\(//\)$' \| \
+        X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+  else
+    continue
+  fi
+  # Extract the definition of DEPDIR, am__include, and am__quote
+  # from the Makefile without running `make'.
+  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+  test -z "$DEPDIR" && continue
+  am__include=`sed -n 's/^am__include = //p' < "$mf"`
+  test -z "am__include" && continue
+  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+  # When using ansi2knr, U may be empty or an underscore; expand it
+  U=`sed -n 's/^U = //p' < "$mf"`
+  # Find all dependency output files, they are included files with
+  # $(DEPDIR) in their names.  We invoke sed twice because it is the
+  # simplest approach to changing $(DEPDIR) to its actual value in the
+  # expansion.
+  for file in `sed -n "
+    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+    # Make sure the directory exists.
+    test -f "$dirpart/$file" && continue
+    fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$file" : 'X\(//\)[^/]' \| \
+        X"$file" : 'X\(//\)$' \| \
+        X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+    { as_dir=$dirpart/$fdir
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+        X"$as_dir" : 'X\(//\)[^/]' \| \
+        X"$as_dir" : 'X\(//\)$' \| \
+        X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)[^/].*/{
+           s//\1/
+           q
+         }
+         /^X\(\/\/\)$/{
+           s//\1/
+           q
+         }
+         /^X\(\/\).*/{
+           s//\1/
+           q
+         }
+         s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+echo "$as_me: error: cannot create directory $as_dir" >&2;}
+   { (exit 1); exit 1; }; }; }
+    # echo "creating $dirpart/$file"
+    echo '# dummy' > "$dirpart/$file"
+  done
+done
+ ;;
+    "default-1":C)
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done ;;
+    "default-2":C)
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done ;;
+    "g10defs.h":C)
+cat >g10defs.tmp <<G10EOF
+/* Generated automatically by configure */
+#ifdef HAVE_DRIVE_LETTERS
+#define G10_LOCALEDIR     "c:\\\\lib\\\\gnupg\\\\locale"
+#define GNUPG_LIBDIR      "c:\\\\lib\\\\gnupg"
+#define GNUPG_LIBEXECDIR  "c:\\\\lib\\\\gnupg"
+#define GNUPG_DATADIR     "c:\\\\lib\\\\gnupg"
+#define GNUPG_HOMEDIR     "c:\\\\gnupg"
+#else
+#define G10_LOCALEDIR     "${datadir}/locale"
+#define GNUPG_LIBDIR      "${libdir}/gnupg"
+#define GNUPG_DATADIR     "${datadir}/gnupg"
+#ifdef __VMS
+#define GNUPG_HOMEDIR "/SYS\$LOGIN/gnupg"
+#else
+#define GNUPG_HOMEDIR "~/.gnupg"
+#endif
+#endif
+/* those are here to be redefined by handcrafted g10defs.h.
+   Please note that the string version must not contain more
+   than one character because the using code assumes strlen()==1 */
+#ifdef HAVE_DOSISH_SYSTEM
+#define DIRSEP_C '\\\\'
+#define EXTSEP_C '.'
+#define DIRSEP_S "\\\\"
+#define EXTSEP_S "."
+#define PATHSEP_C ';'
+#define PATHSEP_S ";"
+#else
+#define DIRSEP_C '/'
+#define EXTSEP_C '.'
+#define DIRSEP_S "/"
+#define EXTSEP_S "."
+#define PATHSEP_C ':'
+#define PATHSEP_S ":"
+#endif
+/* This is the same as VERSION, but should be overridden if the
+   platform cannot handle things like dots'.' in filenames.  Set
+   SAFE_VERSION_DOT and SAFE_VERSION_DASH to whatever SAFE_VERSION
+   uses for dots and dashes. */
+#define SAFE_VERSION      VERSION
+#define SAFE_VERSION_DOT  '.'
+#define SAFE_VERSION_DASH '-'
+G10EOF
+cat mpi/mpi-asm-defs.h >>g10defs.tmp
+if cmp -s g10defs.h g10defs.tmp 2>/dev/null; then
+    echo "g10defs.h is unchanged"
+    rm -f g10defs.tmp
+else
+    rm -f g10defs.h
+    mv g10defs.tmp g10defs.h
+    echo "g10defs.h created"
+fi
+ ;;
+
+  esac
+done # for ac_tag
+
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+
+# Give some feedback
+echo
+echo   "                Version info:   $PACKAGE_STRING"
+echo   "                Configured for: $PRINTABLE_OS_NAME ($host)"
+if test -n "$show_extraasm"; then
+  echo "  Extra cpu specific functions:$show_extraasm"
+fi
+echo
diff --git a/configure.ac b/configure.ac
new file mode 100644 (file)
index 0000000..f2e74f3
--- /dev/null
@@ -0,0 +1,1430 @@
+dnl configure.ac script for GnuPG
+dnl Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+dnl               2006 Free Software Foundation, Inc.
+dnl
+dnl This file is part of GnuPG.
+dnl
+dnl GnuPG is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl 
+dnl GnuPG is distributed in the hope that it will be useful,g
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+dnl GNU General Public License for more details.
+dnl 
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
+dnl MA 02110-1301, USA
+dnl
+dnl (Process this file with autoconf to produce a configure script.)
+
+AC_PREREQ(2.59)
+min_automake_version="1.9.3"
+
+# Remember to change the version number immediately *after* a release.
+# Set my_issvn to "yes" for non-released code.  Remember to run an
+# "svn up" and "autogen.sh" right before creating a distribution.
+m4_define([my_version], [1.4.6])
+m4_define([my_issvn], [no])
+
+m4_define([svn_revision], m4_esyscmd([echo -n $((svn info 2>/dev/null \
+          || echo 'Revision: 0')|sed -n '/^Revision:/ s/[^0-9]//gp'|head -1)]))
+AC_INIT([gnupg], my_version[]m4_if(my_issvn,[yes],[-svn[]svn_revision]),
+        [bug-gnupg@gnu.org])
+# Set development_version to yes if the minor number is odd or you
+# feel that the default check for a development version is not
+# sufficient.
+development_version=no
+
+AC_CONFIG_AUX_DIR(scripts)
+AC_CONFIG_SRCDIR(g10/gpg.c)
+AC_CANONICAL_HOST
+AM_INIT_AUTOMAKE([std-options])
+AB_INIT
+AM_CONFIG_HEADER(config.h)
+
+AC_GNU_SOURCE
+
+dnl
+dnl  Check for random module options
+dnl
+AC_MSG_CHECKING([which random module to use])
+AC_ARG_ENABLE(static-rnd,
+    [  --enable-static-rnd=[egd|unix|linux|auto]  ],
+[use_static_rnd=$enableval], [use_static_rnd=default] )
+
+if test "$use_static_rnd" = no; then
+    use_static_rnd=default
+fi
+
+case "$use_static_rnd" in
+    egd | linux | unix | default )
+      AC_MSG_RESULT($use_static_rnd)
+      ;;
+    auto )
+      AC_MSG_RESULT(automagically selected at runtime)
+      ;;
+    * )
+      AC_MSG_RESULT(invalid argument)
+      AC_MSG_ERROR(there is no random module rnd$use_static_rnd)
+      ;;
+esac
+
+AC_ARG_WITH(egd-socket,
+    [  --with-egd-socket=NAME  use NAME for the EGD socket],
+            egd_socket_name="$withval", egd_socket_name="" )
+AC_DEFINE_UNQUOTED(EGD_SOCKET_NAME, "$egd_socket_name",
+                   [Define if you don't want the default EGD socket name.
+                    For details see cipher/rndegd.c])
+
+
+dnl
+dnl See whether the user wants to disable checking for /dev/random
+
+AC_MSG_CHECKING([whether use of /dev/random is requested])
+AC_ARG_ENABLE(dev-random,
+[  --disable-dev-random    disable the use of dev random],
+    try_dev_random=$enableval, try_dev_random=yes)
+AC_MSG_RESULT($try_dev_random)
+
+
+dnl
+dnl  Check other options
+dnl
+
+AC_MSG_CHECKING([whether assembler modules are requested])
+AC_ARG_ENABLE(asm,
+[  --disable-asm           do not use assembler modules],
+     try_asm_modules=$enableval, try_asm_modules=yes)
+AC_MSG_RESULT($try_asm_modules)
+
+dnl AC_MSG_CHECKING([whether memory guard is requested])
+dnl AC_ARG_ENABLE(m-guard,
+dnl     [  --enable-m-guard        enable memory guard facility],
+dnl     use_m_guard=$enableval, use_m_guard=no)
+dnl AC_MSG_RESULT($use_m_guard)
+dnl if test "$use_m_guard" = yes ; then
+dnl     AC_DEFINE(M_GUARD,1,[Define to use the (obsolete) malloc guarding feature])
+dnl fi
+
+# SELinux support includes tracking of sensitive files to avoid
+# leaking their contents through processing these files by gpg itself
+AC_MSG_CHECKING([whether SELinux support is requested])
+AC_ARG_ENABLE(selinux-support,
+              AC_HELP_STRING([--enable-selinux-support],
+                             [enable SELinux support]),
+              selinux_support=$enableval, selinux_support=no)
+AC_MSG_RESULT($selinux_support)
+
+
+AC_MSG_CHECKING([whether the new iconv based code is requested])
+AC_ARG_ENABLE(gnupg-iconv,
+              AC_HELP_STRING([--disable-gnupg-iconv],
+                             [disable the new iconv code]),
+              gnupg_use_iconv=$enableval, gnupg_use_iconv=yes)
+AC_MSG_RESULT($gnupg_use_iconv)
+
+dnl See if we are disabling any algorithms or features for a smaller
+dnl binary
+
+try_extensions=no
+
+try_gettext=yes
+try_dns=yes
+use_rsa=yes
+use_idea=yes
+use_cast5=yes
+use_blowfish=yes
+use_aes=yes
+use_twofish=yes
+use_sha256=yes
+use_sha512=yes
+use_bzip2=yes
+use_exec=yes
+card_support=yes
+agent_support=yes
+disable_keyserver_path=no
+
+AC_ARG_ENABLE(minimal,
+   AC_HELP_STRING([--enable-minimal],[build the smallest gpg binary possible]),
+   try_gettext=no
+   try_dns=no
+   use_rsa=no
+   use_idea=no
+   use_cast5=no
+   use_blowfish=no
+   use_aes=no
+   use_twofish=no
+   use_sha256=no
+   use_sha512=no
+   use_bzip2=no
+   use_exec=no
+   card_support=no
+   agent_support=no)
+
+
+AC_MSG_CHECKING([whether OpenPGP card support is requested])
+AC_ARG_ENABLE(card-support,
+              AC_HELP_STRING([--disable-card-support],
+                             [disable OpenPGP card support]),
+              card_support=$enableval)
+AC_MSG_RESULT($card_support)
+
+
+# Note that we may later disable the agent support based on the platform.
+AC_MSG_CHECKING([whether gpg-agent support is requested])
+AC_ARG_ENABLE(agent-support,
+              AC_HELP_STRING([--disable-agent-support],
+                             [disable gpg-agent support]),
+              agent_support=$enableval)
+AC_MSG_RESULT($agent_support)
+
+
+AC_MSG_CHECKING([whether to enable the RSA public key algorithm])
+AC_ARG_ENABLE(rsa,
+   AC_HELP_STRING([--disable-rsa],[disable the RSA public key algorithm]),
+   use_rsa=$enableval)
+AC_MSG_RESULT($use_rsa)
+if test x"$use_rsa" = xyes ; then
+   AC_DEFINE(USE_RSA,1,[Define to include the RSA public key algorithm])
+fi
+
+AC_MSG_CHECKING([whether to enable the IDEA cipher])
+AC_ARG_ENABLE(idea,
+   AC_HELP_STRING([--disable-idea],[disable the IDEA cipher]),
+   use_idea=$enableval)
+AC_MSG_RESULT($use_idea)
+if test x"$use_idea" = xyes ; then
+   AC_DEFINE(USE_IDEA,1,[Define to include the IDEA cipher])
+
+# We don't need idea but some people claim that they need it for
+# research etc., so we allow to place an idea source code into the
+# cipher directory and statically link it if available, otherwise we
+# link to a stub.  We don't use AC_CHECK_FILE to avoid caching.
+
+   AC_MSG_CHECKING([for idea cipher module])
+   tmp=""
+   if test -f $srcdir/cipher/idea.c; then 
+      IDEA_O=idea.o
+      tmp=idea
+   else
+      IDEA_O=idea-stub.o
+      tmp=no
+      try_extensions=yes
+   fi
+   AC_SUBST(IDEA_O)
+   AC_MSG_RESULT($tmp)
+fi
+
+AC_MSG_CHECKING([whether to enable the CAST5 cipher])
+AC_ARG_ENABLE(cast5,
+   AC_HELP_STRING([--disable-cast5],[disable the CAST5 cipher]),
+   use_cast5=$enableval)
+AC_MSG_RESULT($use_cast5)
+if test x"$use_cast5" = xyes ; then
+   AC_DEFINE(USE_CAST5,1,[Define to include the CAST5 cipher])
+fi
+
+AC_MSG_CHECKING([whether to enable the BLOWFISH cipher])
+AC_ARG_ENABLE(blowfish,
+   AC_HELP_STRING([--disable-blowfish],[disable the BLOWFISH cipher]),
+   use_blowfish=$enableval)
+AC_MSG_RESULT($use_blowfish)
+if test x"$use_blowfish" = xyes ; then
+   AC_DEFINE(USE_BLOWFISH,1,[Define to include the BLOWFISH cipher])
+fi
+
+AC_MSG_CHECKING([whether to enable the AES ciphers])
+AC_ARG_ENABLE(aes,
+   AC_HELP_STRING([--disable-aes],[disable the AES, AES192, and AES256 ciphers]),
+   use_aes=$enableval)
+AC_MSG_RESULT($use_aes)
+if test x"$use_aes" = xyes ; then
+   AC_DEFINE(USE_AES,1,[Define to include the AES, AES192, and AES256 ciphers])
+fi
+
+AC_MSG_CHECKING([whether to enable the TWOFISH cipher])
+AC_ARG_ENABLE(twofish,
+   AC_HELP_STRING([--disable-twofish],[disable the TWOFISH cipher]),
+   use_twofish=$enableval)
+AC_MSG_RESULT($use_twofish)
+if test x"$use_twofish" = xyes ; then
+   AC_DEFINE(USE_TWOFISH,1,[Define to include the TWOFISH cipher])
+fi
+
+AC_MSG_CHECKING([whether to enable the SHA-256 digest])
+AC_ARG_ENABLE(sha256,
+   AC_HELP_STRING([--disable-sha256],[disable the SHA-224 and SHA-256 digests]),
+   use_sha256=$enableval)
+AC_MSG_RESULT($use_sha256)
+if test x"$use_sha256" = xyes ; then
+   AC_DEFINE(USE_SHA256,1,[Define to include the SHA-224 and SHA-256 digests])
+fi
+
+dnl SHA512 is defined only after we confirm 64-bit support later
+AC_MSG_CHECKING([whether to enable the SHA-384 and SHA-512 digests])
+AC_ARG_ENABLE(sha512,
+   AC_HELP_STRING([--disable-sha512],[disable the SHA-384 and SHA-512 digests]),
+   use_sha512=$enableval)
+AC_MSG_RESULT($use_sha512)
+
+dnl BZLIB is defined only after we confirm the library is available later
+AC_MSG_CHECKING([whether to enable the BZIP2 compression algorithm])
+AC_ARG_ENABLE(bzip2,
+   AC_HELP_STRING([--disable-bzip2],[disable the BZIP2 compression algorithm]),
+   use_bzip2=$enableval)
+AC_MSG_RESULT($use_bzip2)
+
+AC_MSG_CHECKING([whether to enable external program execution])
+AC_ARG_ENABLE(exec,
+    AC_HELP_STRING([--disable-exec],[disable all external program execution]),
+    use_exec=$enableval)
+AC_MSG_RESULT($use_exec)
+if test "$use_exec" = no ; then
+    AC_DEFINE(NO_EXEC,1,[Define to disable all external program execution])
+fi
+
+if test "$use_exec" = yes ; then
+  AC_MSG_CHECKING([whether to enable photo ID viewing])
+  AC_ARG_ENABLE(photo-viewers,
+      [  --disable-photo-viewers disable photo ID viewers],
+      [if test "$enableval" = no ; then
+         AC_DEFINE(DISABLE_PHOTO_VIEWER,1,[define to disable photo viewing])
+      fi],enableval=yes)
+  gnupg_cv_enable_photo_viewers=$enableval
+  AC_MSG_RESULT($enableval)
+
+  if test "$gnupg_cv_enable_photo_viewers" = yes ; then
+    AC_MSG_CHECKING([whether to use a fixed photo ID viewer])
+    AC_ARG_WITH(photo-viewer,
+        [  --with-photo-viewer=FIXED_VIEWER  set a fixed photo ID viewer],
+        [if test "$withval" = yes ; then
+           withval=no
+        elif test "$withval" != no ; then
+           AC_DEFINE_UNQUOTED(FIXED_PHOTO_VIEWER,"$withval",
+                           [if set, restrict photo-viewer to this])
+        fi],withval=no)
+    AC_MSG_RESULT($withval)
+  fi
+
+  AC_MSG_CHECKING([whether to enable external keyserver helpers])
+  AC_ARG_ENABLE(keyserver-helpers,
+      [  --disable-keyserver-helpers  disable all external keyserver support],
+      [if test "$enableval" = no ; then
+         AC_DEFINE(DISABLE_KEYSERVER_HELPERS,1,
+                  [define to disable keyserver helpers])
+      fi],enableval=yes)
+  gnupg_cv_enable_keyserver_helpers=$enableval
+  AC_MSG_RESULT($enableval)
+
+  if test "$gnupg_cv_enable_keyserver_helpers" = yes ; then
+dnl LDAP is defined only after we confirm the library is available later
+    AC_MSG_CHECKING([whether LDAP keyserver support is requested])
+    AC_ARG_ENABLE(ldap,
+      AC_HELP_STRING([--disable-ldap],[disable LDAP keyserver interface only]),
+      try_ldap=$enableval, try_ldap=yes)
+    AC_MSG_RESULT($try_ldap)
+
+    AC_MSG_CHECKING([whether HKP keyserver support is requested])
+    AC_ARG_ENABLE(hkp,
+      AC_HELP_STRING([--disable-hkp],[disable HKP keyserver interface only]),
+      try_hkp=$enableval, try_hkp=yes)
+    AC_MSG_RESULT($try_hkp)
+
+    AC_MSG_CHECKING([whether finger key fetching support is requested])
+    AC_ARG_ENABLE(finger,
+      AC_HELP_STRING([--disable-finger],
+        [disable finger key fetching interface only]),
+      try_finger=$enableval, try_finger=yes)
+    AC_MSG_RESULT($try_finger)
+
+    AC_MSG_CHECKING([whether generic object key fetching support is requested])
+    AC_ARG_ENABLE(generic,
+      AC_HELP_STRING([--disable-generic],
+        [disable generic object key fetching interface only]),
+      try_generic=$enableval, try_generic=yes)
+    AC_MSG_RESULT($try_generic)
+
+    AC_MSG_CHECKING([whether email keyserver support is requested])
+    AC_ARG_ENABLE(mailto,
+      AC_HELP_STRING([--enable-mailto],
+       [enable email keyserver interface only]),
+      try_mailto=$enableval, try_mailto=no)
+    AC_MSG_RESULT($try_mailto)
+    fi
+
+    AC_MSG_CHECKING([whether keyserver exec-path is enabled])
+    AC_ARG_ENABLE(keyserver-path,
+      AC_HELP_STRING([--disable-keyserver-path],
+        [disable the exec-path option for keyserver helpers]),
+      [if test "$enableval" = no ; then
+         disable_keyserver_path=yes
+      fi],enableval=yes)
+    AC_MSG_RESULT($enableval)
+  fi
+
+AC_MSG_CHECKING([whether the included zlib is requested])
+AC_ARG_WITH(included-zlib,
+    [  --with-included-zlib    use the zlib code included here],
+[g10_force_zlib="$withval"], [g10_force_zlib=no] )
+AC_MSG_RESULT($g10_force_zlib)
+
+dnl
+dnl Check for the key/uid cache size.  This can't be zero, but can be
+dnl pretty small on embedded systems.
+dnl
+AC_MSG_CHECKING([for the size of the key and uid cache])
+AC_ARG_ENABLE(key-cache,
+       AC_HELP_STRING([--enable-key-cache=SIZE],[Set key cache to SIZE (default 4096)]),,enableval=4096)
+
+if test "$enableval" = "no"; then
+   enableval=5
+elif test "$enableval" = "yes" || test "$enableval" = ""; then
+   enableval=4096
+fi
+
+changequote(,)dnl
+key_cache_size=`echo "$enableval" | sed 's/[A-Za-z]//g'`
+changequote([,])dnl
+
+if test "$enableval" != "$key_cache_size" || test "$key_cache_size" -lt 5; then
+   AC_MSG_ERROR([invalid key-cache size])
+fi
+
+AC_MSG_RESULT($key_cache_size)
+AC_DEFINE_UNQUOTED(PK_UID_CACHE_SIZE,$key_cache_size,[Size of the key and UID caches])
+
+dnl
+dnl Check whether we want to use Linux capabilities
+dnl
+AC_MSG_CHECKING([whether use of capabilities is requested])
+AC_ARG_WITH(capabilities,
+    [  --with-capabilities     use linux capabilities [default=no]],
+[use_capabilities="$withval"],[use_capabilities=no])
+AC_MSG_RESULT($use_capabilities)
+
+# To avoid double inclusion of config.h which might happen at some
+# places, we add the usual double inclusion protection.
+AH_TOP([
+#ifndef GNUPG_CONFIG_H_INCLUDED
+#define GNUPG_CONFIG_H_INCLUDED
+])
+
+AH_BOTTOM([
+/* We didn't define endianness above, so get it from OS macros.  This
+is intended for making fat binary builds on OS X. */
+#if !defined(BIG_ENDIAN_HOST) && !defined(LITTLE_ENDIAN_HOST)
+#if defined(__BIG_ENDIAN__)
+#define BIG_ENDIAN_HOST 1
+#elif defined(__LITTLE_ENDIAN__)
+#define LITTLE_ENDIAN_HOST 1
+#else
+#error "No endianness found"
+#endif
+#endif
+
+#if !(defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID))
+#define EXEC_TEMPFILE_ONLY
+#endif
+
+/* This is the major version number of GnuPG so that
+   source included files can test for this. */
+#define GNUPG_MAJOR_VERSION 1
+
+#include "g10defs.h"
+
+#endif /*GNUPG_CONFIG_H_INCLUDED*/
+])
+
+AM_MAINTAINER_MODE
+
+dnl Checks for programs.
+
+AC_PROG_MAKE_SET
+AM_SANITY_CHECK
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_RANLIB
+AC_CHECK_TOOL(AR, ar, :)
+AC_PATH_PROG(PERL,"perl")
+AC_ISC_POSIX
+AC_SYS_LARGEFILE
+AC_PROG_INSTALL
+AC_PROG_AWK
+AC_CHECK_PROG(DOCBOOK_TO_MAN, docbook-to-man, yes, no)
+AM_CONDITIONAL(HAVE_DOCBOOK_TO_MAN, test "$ac_cv_prog_DOCBOOK_TO_MAN" = yes)
+GNUPG_CHECK_FAQPROG
+GNUPG_CHECK_DOCBOOK_TO_TEXI
+GNUPG_CHECK_USTAR
+
+
+# According to a comment by Marcus Brinkman in libgpg-error, the
+# AC_PROG_CC_FOR_BUILD macro in the AC archive is broken for autoconf
+# 2.57.  Thus we use a simply use "cc" if we are cross-compiling.
+AC_MSG_CHECKING(for cc for build)
+if test "$cross_compiling" = "yes"; then
+  CC_FOR_BUILD="${CC_FOR_BUILD-cc}"
+else
+  CC_FOR_BUILD="${CC_FOR_BUILD-$CC}"
+fi
+AC_MSG_RESULT($CC_FOR_BUILD)
+AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler])
+
+
+
+MPI_OPT_FLAGS=""
+
+have_dosish_system=no
+need_dlopen=yes
+case "${host}" in
+    *-mingw32*)
+        # special stuff for Windoze NT
+        ac_cv_have_dev_random=no
+        AC_DEFINE(USE_ONLY_8DOT3,1,
+                  [set this to limit filenames to the 8.3 format])
+        AC_DEFINE(HAVE_DRIVE_LETTERS,1,
+                  [defined if we must run on a stupid file system])
+        AC_DEFINE(USE_SIMPLE_GETTEXT,1,
+                  [because the Unix gettext has too much overhead on
+                   MingW32 systems and these systems lack Posix functions,
+                   we use a simplified version of gettext])
+        AC_DEFINE(HAVE_W32_SYSTEM,1,
+                  [Defined if we run on a W32 API based system])
+        disable_keyserver_path=yes
+        have_dosish_system=yes
+        need_dlopen=no
+        try_gettext="no"
+        agent_support=no
+       use_simple_gettext=yes
+       have_w32_system=yes
+        ;;
+    i?86-emx-os2 | i?86-*-os2*emx )
+        # OS/2 with the EMX environment
+        ac_cv_have_dev_random=no
+        AC_DEFINE(HAVE_DRIVE_LETTERS)
+        have_dosish_system=yes
+        try_gettext="no"
+        agent_support=no
+        ;;
+
+    i?86-*-msdosdjgpp*)
+        # DOS with the DJGPP environment
+        ac_cv_have_dev_random=no
+        AC_DEFINE(HAVE_DRIVE_LETTERS)
+        have_dosish_system=yes
+        try_gettext="no"
+        agent_support=no
+        ;;
+
+    *-*-hpux*)
+        if test -z "$GCC" ; then
+            CFLAGS="$CFLAGS -Ae -D_HPUX_SOURCE"
+        fi
+        ;;
+    *-dec-osf4*)
+        if test -z "$GCC" ; then
+            # Suppress all warnings
+            # to get rid of the unsigned/signed char mismatch warnings.
+            CFLAGS="$CFLAGS -w"
+        fi
+        ;;
+    *-dec-osf5*)
+        if test -z "$GCC" ; then
+            # Use the newer compiler `-msg_disable ptrmismatch1' to
+            # get rid of the unsigned/signed char mismatch warnings.
+            # Using this may hide other pointer mismatch warnings, but
+           # it at least lets other warning classes through
+            CFLAGS="$CFLAGS -msg_disable ptrmismatch1"
+        fi
+        ;;
+    m68k-atari-mint)
+        ;;
+    *)
+       ;;
+esac
+
+if test "$have_dosish_system" = yes; then
+   AC_DEFINE(HAVE_DOSISH_SYSTEM,1,
+             [defined if we run on some of the PCDOS like systems 
+              (DOS, Windoze. OS/2) with special properties like
+              no file modes])
+fi
+AM_CONDITIONAL(HAVE_DOSISH_SYSTEM, test "$have_dosish_system" = yes)
+
+AM_CONDITIONAL(USE_SIMPLE_GETTEXT, test x"$use_simple_gettext" = xyes)
+AM_CONDITIONAL(HAVE_W32_SYSTEM, test x"$have_w32_system" = xyes)
+
+if test "$disable_keyserver_path" = yes; then
+    AC_DEFINE(DISABLE_KEYSERVER_PATH,1,
+              [define to disable exec-path for keyserver helpers])
+fi
+
+AC_SUBST(MPI_OPT_FLAGS)
+GNUPG_SYS_SYMBOL_UNDERSCORE
+
+dnl These need to go after AC_PROG_CC so that $EXEEXT is defined
+
+AC_DEFINE_UNQUOTED(EXEEXT,"$EXEEXT",[The executable file extension, if any])
+
+if test x"$try_hkp" = xyes ; then
+  AC_SUBST(GPGKEYS_HKP,"gpgkeys_hkp$EXEEXT")
+fi
+
+if test x"$try_finger" = xyes ; then
+  AC_SUBST(GPGKEYS_FINGER,"gpgkeys_finger$EXEEXT")
+fi
+
+dnl Must check for network library requirements before doing link tests
+dnl for ldap, for example. If ldap libs are static (or dynamic and without
+dnl ELF runtime link paths), then link will fail and LDAP support won't
+dnl be detected.
+
+AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, gethostbyname,
+       [NETLIBS="-lnsl $NETLIBS"]))
+AC_CHECK_FUNC(setsockopt, , AC_CHECK_LIB(socket, setsockopt,
+       [NETLIBS="-lsocket $NETLIBS"]))
+
+dnl Now try for the resolver functions so we can use DNS for SRV, PKA,
+dnl and CERT.
+
+if test x"$try_dns" = xyes ; then
+   if test x"$try_hkp" = xyes || test x"$try_http" = xyes ; then
+      AC_ARG_ENABLE(dns-srv,
+         AC_HELP_STRING([--disable-dns-srv],
+       [disable the use of DNS SRV in HKP and HTTP]),
+         use_dns_srv=$enableval,use_dns_srv=yes)
+   fi
+
+   AC_ARG_ENABLE(dns-pka,
+      AC_HELP_STRING([--disable-dns-pka],
+       [disable the use of PKA records in DNS]),
+      use_dns_pka=$enableval,use_dns_pka=yes)
+
+   AC_ARG_ENABLE(dns-cert,
+      AC_HELP_STRING([--disable-dns-cert],
+       [disable the use of CERT records in DNS]),
+      use_dns_cert=$enableval,use_dns_cert=yes)
+fi
+
+if test x"$use_dns_pka" = xyes || test x"$use_dns_srv" = xyes || test x"$use_dns_cert" = xyes; then
+  _dns_save_libs=$LIBS
+  LIBS=""
+  # the double underscore thing is a glibc-ism?
+  AC_SEARCH_LIBS(res_query,resolv bind,,
+                 AC_SEARCH_LIBS(__res_query,resolv bind,,have_resolver=no))
+  AC_SEARCH_LIBS(dn_expand,resolv bind,,
+                 AC_SEARCH_LIBS(__dn_expand,resolv bind,,have_resolver=no))
+  AC_SEARCH_LIBS(dn_skipname,resolv bind,,
+                 AC_SEARCH_LIBS(__dn_skipname,resolv bind,,have_resolver=no))
+
+  if test x"$have_resolver" != xno ; then
+
+    # Make sure that the BIND 4 resolver interface is workable before
+    # enabling any code that calls it.  At some point I'll rewrite the
+    # code to use the BIND 8 resolver API.
+
+    AC_MSG_CHECKING([whether the resolver is usable])
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>],
+[[unsigned char answer[PACKETSZ]; res_query("foo.bar",C_IN,T_A,answer,PACKETSZ); dn_skipname(0,0); dn_expand(0,0,0,0,0);]])],have_resolver=yes,have_resolver=no)
+    AC_MSG_RESULT($have_resolver)
+
+    # This is Apple-specific and somewhat bizarre as they changed the
+    # define in bind 8 for some reason.
+
+    if test x"$have_resolver" != xyes ; then
+       AC_MSG_CHECKING([whether I can make the resolver usable with BIND_8_COMPAT])
+       AC_LINK_IFELSE([AC_LANG_PROGRAM([#define BIND_8_COMPAT
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>],
+[[unsigned char answer[PACKETSZ]; res_query("foo.bar",C_IN,T_A,answer,PACKETSZ); dn_skipname(0,0); dn_expand(0,0,0,0,0);]])],[have_resolver=yes ; need_compat=yes])
+       AC_MSG_RESULT($have_resolver)
+    fi
+  fi
+
+  if test x"$have_resolver" = xyes ; then
+     DNSLIBS=$LIBS
+
+     if test x"$use_dns_srv" = xyes ; then
+        AC_DEFINE(USE_DNS_SRV,1,[define to use DNS SRV])
+     fi
+
+     if test x"$use_dns_pka" = xyes ; then
+        AC_DEFINE(USE_DNS_PKA,1,[define to use our experimental DNS PKA])
+     fi
+
+     if test x"$use_dns_cert" = xyes ; then
+        AC_DEFINE(USE_DNS_CERT,1,[define to use DNS CERT])
+     fi
+
+     if test x"$need_compat" = xyes ; then
+        AC_DEFINE(BIND_8_COMPAT,1,[an Apple OSXism])
+     fi
+  else
+     use_dns_srv=no
+     use_dns_pka=no
+     use_dns_cert=no
+  fi
+
+  LIBS=$_dns_save_libs
+fi
+
+AC_SUBST(DNSLIBS)
+
+AM_CONDITIONAL(USE_DNS_SRV, test x"$use_dns_srv" = xyes)
+
+# Check for LDAP
+
+if test "$try_ldap" = yes ; then
+   GNUPG_CHECK_LDAP($NETLIBS)
+fi
+
+# Check for curl.  We fake the curl API if libcurl isn't installed.
+
+LIBCURL_CHECK_CONFIG([yes],,,[fake_curl=yes])
+AM_CONDITIONAL(FAKE_CURL,test x"$fake_curl" = xyes)
+
+# Generic, for us, means curl
+
+if test x"$try_generic" = xyes ; then
+   AC_SUBST(GPGKEYS_CURL,"gpgkeys_curl$EXEEXT")
+fi
+
+dnl This isn't necessarily sendmail itself, but anything that gives a
+dnl sendmail-ish interface to the outside world.  That includes qmail,
+dnl postfix, etc.  Basically, anything that can handle "sendmail -t".
+
+if test "$try_mailto" = yes ; then
+  AC_ARG_WITH(mailprog,[  --with-mailprog=NAME    use "NAME -t" for mail transport],,with_mailprog=yes)
+
+  if test "$with_mailprog" = yes ; then
+    AC_PATH_PROG(SENDMAIL,sendmail,,$PATH:/usr/sbin:/usr/libexec:/usr/lib)
+    if test "$ac_cv_path_SENDMAIL" ; then
+      GPGKEYS_MAILTO="gpgkeys_mailto"
+    fi
+  elif test "$with_mailprog" != no ; then
+    AC_MSG_CHECKING([for a mail transport program])
+    AC_SUBST(SENDMAIL,$with_mailprog)
+    AC_MSG_RESULT($with_mailprog)
+    GPGKEYS_MAILTO="gpgkeys_mailto"
+  fi
+fi
+
+AC_SUBST(GPGKEYS_MAILTO)
+
+case "${host}" in
+    *-mingw32*)
+        PRINTABLE_OS_NAME="MingW32"
+        ;;
+    *-*-cygwin*)
+        PRINTABLE_OS_NAME="Cygwin"
+        ;;
+    i?86-emx-os2 | i?86-*-os2*emx )
+        PRINTABLE_OS_NAME="OS/2"
+        ;;
+    i?86-*-msdosdjgpp*)
+        PRINTABLE_OS_NAME="MSDOS/DJGPP"
+        try_extensions=no
+        ;;
+    *-linux*)
+        PRINTABLE_OS_NAME="GNU/Linux"
+        ;;
+    *)
+        PRINTABLE_OS_NAME=`uname -s || echo "Unknown"`
+        ;;
+esac
+AC_DEFINE_UNQUOTED(PRINTABLE_OS_NAME, "$PRINTABLE_OS_NAME",
+                   [A human readable text with the name of the OS])
+
+
+#
+# 1. Set names of random devices
+#
+NAME_OF_DEV_RANDOM="/dev/random"
+NAME_OF_DEV_URANDOM="/dev/urandom"
+case "${host}" in
+    *-openbsd*)
+        NAME_OF_DEV_RANDOM="/dev/srandom"
+        NAME_OF_DEV_URANDOM="/dev/urandom"
+        ;;
+esac
+AC_DEFINE_UNQUOTED(NAME_OF_DEV_RANDOM, "$NAME_OF_DEV_RANDOM",
+                   [defined to the name of the strong random device])
+AC_DEFINE_UNQUOTED(NAME_OF_DEV_URANDOM, "$NAME_OF_DEV_URANDOM",
+                   [defined to the name of the weaker random device])
+AC_SUBST(MPI_OPT_FLAGS)
+
+
+dnl Checks for libraries.
+
+AM_GNU_GETTEXT_VERSION(0.14.1)
+if test "$try_gettext" = yes; then
+  AM_GNU_GETTEXT(,[need-ngettext])
+
+  # gettext requires some extra checks.  These really should be part of
+  # the basic AM_GNU_GETTEXT macro.  TODO: move other gettext-specific
+  # function checks to here.
+
+  AC_CHECK_FUNCS(strchr)
+else
+  USE_NLS=no
+  USE_INCLUDED_LIBINTL=no
+  BUILD_INCLUDED_LIBINTL=no
+  AC_SUBST(USE_NLS)
+  AC_SUBST(USE_INCLUDED_LIBINTL)
+  AC_SUBST(BUILD_INCLUDED_LIBINTL)
+  AM_PO_SUBDIRS
+fi
+
+if test "$try_extensions" = yes || test x"$card_support" = xyes ; then
+  if test "$need_dlopen" = yes; then
+    _dl_save_libs=$LIBS
+    LIBS=""
+    AC_SEARCH_LIBS(dlopen,dl,found_dlopen=yes)
+    if test x"$found_dlopen" = "xyes" ; then
+      AC_DEFINE(HAVE_DL_DLOPEN,1,
+                [Defined when the dlopen function family is available])
+      DLLIBS=$LIBS
+    else
+      if test "$try_extensions" = yes ; then
+         AC_MSG_NOTICE([dlopen not found.  Disabling extensions.])
+        try_extensions=no
+      fi
+  
+      if test "$card_support" = yes ; then
+         AC_MSG_WARN([dlopen not found.  Disabling OpenPGP card support.])
+         card_support=no
+      fi
+    fi
+    LIBS=$_dl_save_libs
+  fi
+fi
+
+AC_SUBST(DLLIBS)
+
+if test "$card_support" = yes ; then
+  AC_DEFINE(ENABLE_CARD_SUPPORT,1,[Define to include OpenPGP card support])
+fi
+
+if test "$agent_support" = yes ; then
+  AC_DEFINE(ENABLE_AGENT_SUPPORT,1,[Define to include gpg-agent support])
+fi
+
+if test "$try_extensions" = yes ; then
+  AC_DEFINE(USE_DYNAMIC_LINKING,1,[Define to enable the use of extensions])
+fi
+
+if test "$selinux_support" = yes ; then
+  AC_DEFINE(ENABLE_SELINUX_HACKS,1,[Define to enable SELinux support])
+fi
+
+if test "$gnupg_use_iconv" = yes ; then
+  AC_DEFINE(USE_GNUPG_ICONV,1,[Define to use the new iconv based code])
+fi
+
+AM_CONDITIONAL(ENABLE_CARD_SUPPORT, test "$card_support" = yes)
+AM_CONDITIONAL(ENABLE_AGENT_SUPPORT, test "$agent_support" = yes)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS([unistd.h langinfo.h termio.h locale.h getopt.h pwd.h])
+
+# Note that we do not check for iconv here because this is done anyway
+# by the gettext checks and thus it allows us to disable the use of
+# iconv by using --disable-nls.
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_INLINE
+AC_C_VOLATILE
+AC_TYPE_SIZE_T
+AC_TYPE_MODE_T
+AC_TYPE_SIGNAL
+AC_DECL_SYS_SIGLIST
+
+AC_ARG_ENABLE(endian-check,
+              AC_HELP_STRING([--disable-endian-check],
+             [disable the endian check and trust the OS provided macros]),
+             endiancheck=$enableval,endiancheck=yes)
+
+if test x"$endiancheck" = xyes ; then
+   GNUPG_CHECK_ENDIAN
+fi
+
+GNUPG_CHECK_TYPEDEF(byte, HAVE_BYTE_TYPEDEF)
+GNUPG_CHECK_TYPEDEF(ushort, HAVE_USHORT_TYPEDEF)
+GNUPG_CHECK_TYPEDEF(ulong, HAVE_ULONG_TYPEDEF)
+GNUPG_CHECK_TYPEDEF(u16, HAVE_U16_TYPEDEF)
+GNUPG_CHECK_TYPEDEF(u32, HAVE_U32_TYPEDEF)
+
+AC_CHECK_SIZEOF(unsigned short)
+AC_CHECK_SIZEOF(unsigned int)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned long long)
+
+# Ensure that we have UINT64_C before we bother to check for uint64_t
+AC_CHECK_HEADERS([inttypes.h])
+AC_CACHE_CHECK([for UINT64_C], [gnupg_cv_uint64_c_works],
+               AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <inttypes.h>],[
+uint64_t foo=UINT64_C(42);]),gnupg_cv_uint64_c_works=yes,gnupg_cv_uint64_c_works=no))
+
+if test "$gnupg_cv_uint64_c_works" = "yes" ; then
+   AC_CHECK_SIZEOF(uint64_t)
+fi
+
+if test "$ac_cv_sizeof_unsigned_short" = "0" \
+   || test "$ac_cv_sizeof_unsigned_int" = "0" \
+   || test "$ac_cv_sizeof_unsigned_long" = "0"; then
+    AC_MSG_WARN([Hmmm, something is wrong with the sizes - using defaults]);
+fi
+
+dnl Do we have any 64-bit data types?
+if test x"$use_sha512" = xyes \
+   && test "$ac_cv_sizeof_unsigned_int" != "8" \
+   && test "$ac_cv_sizeof_unsigned_long" != "8" \
+   && test "$ac_cv_sizeof_unsigned_long_long" != "8" \
+   && test x"$ac_cv_sizeof_uint64_t" != "x8"; then
+    AC_MSG_NOTICE([No 64-bit types.  Disabling SHA-384 and SHA-512.])
+    use_sha512=no
+fi
+
+if test x"$use_sha512" = xyes ; then
+    AC_DEFINE(USE_SHA512,1,[Define to include the SHA-384 and SHA-512 digests])
+fi
+
+AM_CONDITIONAL(USE_SHA512, test x"$use_sha512" = xyes)
+
+dnl Checks for library functions.
+AC_CHECK_DECLS(getpagesize)
+AC_FUNC_FSEEKO
+AC_FUNC_VPRINTF
+AC_FUNC_FORK
+AC_CHECK_FUNCS(strerror stpcpy strlwr tcgetattr strtoul mmap)
+AC_CHECK_FUNCS(strcasecmp strncasecmp ctermid times unsetenv getpwnam getpwuid)
+AC_CHECK_FUNCS(memmove gettimeofday getrusage setrlimit clock_gettime)
+AC_CHECK_FUNCS(atexit raise getpagesize strftime nl_langinfo setlocale)
+AC_CHECK_FUNCS(waitpid wait4 sigaction sigprocmask rand pipe stat getaddrinfo)
+AC_CHECK_FUNCS(fcntl ftruncate)
+AC_REPLACE_FUNCS(mkdtemp timegm isascii memrchr strsep)
+
+AC_CHECK_TYPES([struct sigaction, sigset_t],,,[#include <signal.h>])
+
+# See if getopt is in libiberty.  This is of course not optimal since
+# it might be somewhere other than libiberty, but does cover the
+# mingw32 case.
+
+AC_CHECK_FUNC(getopt,,AC_CHECK_LIB(iberty,getopt,AC_SUBST(GETOPT,"-liberty")))
+
+#
+# check for gethrtime and run a testprogram to see whether
+# it is broken.  It has been reported that some Solaris and HP UX systems 
+# raise an SIGILL
+#
+AC_CACHE_CHECK([for gethrtime], 
+               [gnupg_cv_func_gethrtime],
+               [AC_TRY_LINK([#include <sys/times.h>],[
+                   hrtime_t tv;
+                   tv = gethrtime();
+                 ],
+                 [gnupg_cv_func_gethrtime=yes],
+                 [gnupg_cv_func_gethrtime=no])
+               ])
+if test $gnupg_cv_func_gethrtime = yes; then
+     AC_DEFINE([HAVE_GETHRTIME], 1,
+               [Define if you have the `gethrtime(2)' function.])
+     AC_CACHE_CHECK([whether gethrtime is broken], 
+               [gnupg_cv_func_broken_gethrtime],
+               [AC_TRY_RUN([
+                   #include <sys/times.h>
+                   int main () {
+                   hrtime_t tv;
+                   tv = gethrtime(); 
+                 }
+                 ],
+                 [gnupg_cv_func_broken_gethrtime=no],
+                 [gnupg_cv_func_broken_gethrtime=yes],
+                 [gnupg_cv_func_broken_gethrtime=assume-no])
+                ])
+    if test $gnupg_cv_func_broken_gethrtime = yes; then
+      AC_DEFINE([HAVE_BROKEN_GETHRTIME], 1,
+      [Define if `gethrtime(2)' does not work correctly i.e. issues a SIGILL.])
+    fi
+fi
+     
+
+GNUPG_CHECK_MLOCK
+GNUPG_FUNC_MKDIR_TAKES_ONE_ARG
+
+dnl
+dnl Check whether we can use Linux capabilities as requested
+dnl
+if test "$use_capabilities" = "yes" ; then
+
+AC_MSG_WARN([[
+***
+*** WARNING: using capabilities with GnuPG is experimental code!
+***]])
+
+use_capabilities=no
+AC_CHECK_HEADERS(sys/capability.h)
+if test "$ac_cv_header_sys_capability_h" = "yes" ; then
+  AC_CHECK_LIB(cap, cap_init, ac_need_libcap=1)
+  if test "$ac_cv_lib_cap_cap_init" = "yes"; then
+     AC_DEFINE(USE_CAPABILITIES,1,
+               [define if capabilities should be used])
+     AC_SUBST(CAPLIBS,"-lcap")
+     use_capabilities=yes
+  fi
+fi
+if test "$use_capabilities" = "no" ; then
+    AC_MSG_WARN([[
+***
+*** The use of capabilities on this system is not possible.
+*** You need a recent Linux kernel and some patches:
+***   fcaps-2.2.9-990610.patch      (kernel patch for 2.2.9)
+***   fcap-module-990613.tar.gz     (kernel module)
+***   libcap-1.92.tar.gz            (user mode library and utilities)
+*** And you have to configure the kernel with CONFIG_VFS_CAP_PLUGIN
+*** set (filesystems menu). Be warned: This code is *really* ALPHA.
+***]])
+fi
+fi
+
+
+GNUPG_CHECK_IPC
+if test "$ac_cv_header_sys_shm_h" = "yes"; then
+  AC_DEFINE(USE_SHM_COPROCESSING,1,
+            [define if the shared memory interface should be made available])
+fi
+
+dnl
+dnl check whether we have a random device
+dnl
+if test "$try_dev_random" = yes ; then
+    AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
+    [if test -r "$NAME_OF_DEV_RANDOM" && test -r "$NAME_OF_DEV_URANDOM" ; then
+      ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
+    if test "$ac_cv_have_dev_random" = yes; then
+        AC_DEFINE(HAVE_DEV_RANDOM,1,
+                 [defined if the system supports a random device] )
+    fi
+else
+    AC_MSG_CHECKING(for random device)
+    ac_cv_have_dev_random=no
+    AC_MSG_RESULT(has been disabled)
+fi
+
+
+dnl
+dnl Figure out the default random module.
+dnl
+random_modules=""
+if test "$use_static_rnd" = default; then
+     if test "$ac_cv_have_dev_random" = yes; then
+        random_modules="rndlinux"
+     else
+         case "${host}" in
+            *-mingw32*|*-*-cygwin*)
+                random_modules="rndw32"
+                ;;
+            i?86-emx-os2|i?86-*-os2*emx)
+                random_modules="rndos2"
+                ;;
+            m68k-atari-mint)
+                random_modules="rndatari"
+                ;;
+            i?86-*-msdosdjgpp*)
+                :
+                ;;
+            *)
+                random_modules="rndlinux rndegd rndunix"
+                AC_DEFINE(USE_ALL_RANDOM_MODULES, 1, 
+                          [Allow to select random modules at runtime.])
+                ;;
+         esac
+     fi
+else
+  if test "$use_static_rnd" = auto; then
+     random_modules="rndlinux rndegd rndunix"
+     AC_DEFINE(USE_ALL_RANDOM_MODULES, 1)
+  else
+     random_modules="rnd$use_static_rnd";
+  fi
+fi
+
+if test -z "$random_modules"; then
+   AC_MSG_ERROR(no random module available)
+fi
+print_egd_warning=no
+for rndmod in $random_modules "" ; do
+  case "$rndmod" in
+    rndlinux)
+         AC_DEFINE(USE_RNDLINUX,1, 
+                  [Defined if the /dev/random based RNG should be used.])
+         use_rndlinux=yes
+         ;;
+    rndunix)
+         AC_DEFINE(USE_RNDUNIX,1, 
+                  [Defined if the default Unix RNG should be used.])
+         print_egd_warning=yes
+         use_rndunix=yes
+          ;;
+    rndegd)
+         AC_DEFINE(USE_RNDEGD,1, 
+                  [Defined if the EGD based RNG should be used.])
+         use_rndegd=yes
+         ;;
+    rndw32)
+         AC_DEFINE(USE_RNDW32,1, 
+                  [Defined if the Windows specific RNG should be used.])
+         use_rndw32=yes
+        ;;
+   esac
+done
+
+AM_CONDITIONAL(USE_RNDLINUX, test "$use_rndlinux" = yes)
+AM_CONDITIONAL(USE_RNDUNIX,  test "$use_rndunix" = yes)
+AM_CONDITIONAL(USE_RNDEGD,   test "$use_rndegd" = yes)
+AM_CONDITIONAL(USE_RNDW32,   test "$use_rndw32" = yes)
+
+dnl setup assembler stuff
+AC_MSG_CHECKING(for mpi assembler functions)
+if test -f $srcdir/mpi/config.links ; then
+    . $srcdir/mpi/config.links
+    AC_CONFIG_LINKS("$mpi_ln_list")
+    ac_cv_mpi_extra_asm_modules="$mpi_extra_modules"
+    ac_cv_mpi_sflags="$mpi_sflags"
+    ac_cv_mpi_config_done="yes"
+    AC_MSG_RESULT(done)
+else
+    AC_MSG_RESULT(failed)
+    AC_MSG_ERROR([mpi/config.links missing!])
+fi
+MPI_EXTRA_ASM_OBJS=""
+show_extraasm=""
+if test "$ac_cv_mpi_extra_asm_modules" != ""; then
+for i in $ac_cv_mpi_extra_asm_modules; do
+    show_extraasm="$show_extraasm $i"
+    MPI_EXTRA_ASM_OBJS="$MPI_EXTRA_ASM_OBJS $i.o"
+done
+fi
+AC_SUBST(MPI_EXTRA_ASM_OBJS)
+MPI_SFLAGS="$ac_cv_mpi_sflags"
+AC_SUBST(MPI_SFLAGS)
+
+# Sanity check regex.  Tests adapted from mutt.
+
+AC_MSG_CHECKING([whether regular expression support is requested])
+AC_ARG_ENABLE(regex,
+  AC_HELP_STRING([--disable-regex],
+    [do not handle regular expressions in trust signatures]),
+  use_regex=$enableval, use_regex=yes)
+AC_MSG_RESULT($use_regex)
+
+if test "$use_regex" = yes ; then
+  AC_MSG_CHECKING([whether the included regex lib is requested])
+  AC_ARG_WITH(included-regex,
+      [  --with-included-regex   use the included GNU regex library],
+      [gnupg_cv_included_regex="$withval"],[gnupg_cv_included_regex=no])
+  AC_MSG_RESULT($gnupg_cv_included_regex)
+
+  if test $gnupg_cv_included_regex = no ; then
+     # Does the system have regex functions at all?
+     AC_CHECK_FUNC(regcomp,gnupg_cv_included_regex=no,
+                          gnupg_cv_included_regex=yes)
+  fi
+
+  if test $gnupg_cv_included_regex = no ; then
+     AC_CACHE_CHECK([whether your system's regexp library is broken],
+       [gnupg_cv_regex_broken],
+       AC_TRY_RUN([
+#include <unistd.h>
+#include <regex.h>
+main() { regex_t blah ; regmatch_t p; p.rm_eo = p.rm_eo; return regcomp(&blah, "foo.*bar", REG_NOSUB) || regexec (&blah, "foobar", 0, NULL, 0); }],
+       gnupg_cv_regex_broken=no, gnupg_cv_regex_broken=yes, gnupg_cv_regex_broken=yes))
+
+     if test $gnupg_cv_regex_broken = yes ; then
+      AC_MSG_WARN(your regex is broken - using the included GNU regex instead.)
+      gnupg_cv_included_regex=yes
+     fi
+  fi
+
+  if test $gnupg_cv_included_regex = yes; then
+     AC_DEFINE(USE_INTERNAL_REGEX,1,[ Define if you want to use the included regex lib ])
+  fi
+else
+  AC_DEFINE(DISABLE_REGEX,1,[ Define to disable regular expression support ])
+fi
+
+AM_CONDITIONAL(USE_INTERNAL_REGEX, test x"$gnupg_cv_included_regex" = xyes)
+
+dnl Do we have zlib? Must do it here because Solaris failed
+dnl when compiling a conftest (due to the "-lz" from LIBS).
+use_local_zlib=yes
+if test "$g10_force_zlib" = "yes"; then
+  :
+else
+  _cppflags="${CPPFLAGS}"
+  _ldflags="${LDFLAGS}"
+
+  AC_ARG_WITH(zlib,
+  [  --with-zlib=DIR         use libz in DIR],[
+    if test -d "$withval"; then
+      CPPFLAGS="${CPPFLAGS} -I$withval/include"
+      LDFLAGS="${LDFLAGS} -L$withval/lib"
+    fi
+  ])
+
+  AC_CHECK_HEADER(zlib.h,
+      AC_CHECK_LIB(z, deflateInit2_,
+       use_local_zlib=no
+       ZLIBS="-lz",
+       CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}),
+       CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags})
+fi
+
+if test "$use_local_zlib" = yes ; then
+    AM_CONDITIONAL(ENABLE_LOCAL_ZLIB, true)
+    AC_CONFIG_LINKS(zlib.h:zlib/zlib.h zconf.h:zlib/zconf.h )
+    ZLIBS="../zlib/libzlib.a"
+else
+    AM_CONDITIONAL(ENABLE_LOCAL_ZLIB, false)
+fi
+
+if test "$use_bzip2" = yes ; then
+  _cppflags="${CPPFLAGS}"
+  _ldflags="${LDFLAGS}"
+  AC_ARG_WITH(bzip2,
+     AC_HELP_STRING([--with-bzip2=DIR],[look for bzip2 in DIR]),
+      [
+      if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+      fi
+      ],withval="")
+
+# Checking alongside stdio.h as an early version of bzip2 (1.0)
+# required stdio.h to be included before bzlib.h, and Solaris 9 is
+# woefully out of date.
+
+  if test "$withval" != no ; then
+     AC_CHECK_HEADER(bzlib.h,
+        AC_CHECK_LIB(bz2,BZ2_bzCompressInit,
+         [
+         have_bz2=yes
+         ZLIBS="$ZLIBS -lbz2"
+         AC_DEFINE(HAVE_BZIP2,1,
+                 [Defined if the bz2 compression library is available])
+         ],
+         CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}),
+         CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags},[#include <stdio.h>])
+  fi
+fi
+
+AM_CONDITIONAL(ENABLE_BZIP2_SUPPORT,test x"$have_bz2" = "xyes")
+AC_SUBST(ZLIBS)
+
+# libusb allows us to use the integrated CCID smartcard reader driver.
+GNUPG_CHECK_LIBUSB
+
+# Check for readline support
+GNUPG_CHECK_READLINE
+
+# Allow users to append something to the version string without
+# flagging it as development version.  The user version parts is
+# considered everything after a dash. 
+if test "$development_version" != yes; then
+  changequote(,)dnl
+  tmp_pat='[a-zA-Z]'
+  changequote([,])dnl
+  if echo "$VERSION" | sed 's/-.*//' | grep "$tmp_pat" >/dev/null ; then
+    development_version=yes
+  fi
+fi
+if test "$development_version" = yes; then
+    AC_DEFINE(IS_DEVELOPMENT_VERSION,1,
+            [Defined if this is not a regular release])
+fi
+
+AM_CONDITIONAL(CROSS_COMPILING, test x$cross_compiling = xyes)
+
+
+# add some extra libs here so that previous tests don't fail for
+# mysterious reasons - the final link step should bail out. 
+case "${host}" in
+    *-mingw32*)
+dnl      NETLIBS="$NETLIBS -lwsock32"
+       W32LIBS="-lwsock32"
+        ;;
+    *)
+       ;;
+esac
+
+AC_SUBST(NETLIBS)
+AC_SUBST(W32LIBS)
+
+# Special options used with gcc.
+if test "$GCC" = yes; then
+    # Note that it is okay to use CFLAGS here because this are just
+    # warning options and the user should have a chance of overriding
+    #them.
+    if test "$USE_MAINTAINER_MODE" = "yes"; then
+        CFLAGS="$CFLAGS -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
+        CFLAGS="$CFLAGS -Wformat-nonliteral"
+    else
+        CFLAGS="$CFLAGS -Wall"
+    fi
+
+    # This is handy for debugging so the compiler doesn't rearrange
+    # things and eliminate variables.
+    AC_ARG_ENABLE(optimization,
+       AC_HELP_STRING([--disable-optimization],
+                     [disable compiler optimization]),
+                      [if test $enableval = no ; then
+                         CFLAGS=`echo $CFLAGS | sed 's/-O[[0-9]]//'`
+                       fi])
+
+    AC_MSG_CHECKING([if gcc supports -Wno-pointer-sign])
+
+    _gcc_cflags_save=$CFLAGS
+    CFLAGS="-Wno-pointer-sign"
+
+    AC_COMPILE_IFELSE(AC_LANG_PROGRAM([]),_gcc_psign=yes,_gcc_psign=no)
+    AC_MSG_RESULT($_gcc_psign)
+
+    CFLAGS=$_gcc_cflags_save;
+
+    if test x"$_gcc_psign" = xyes ; then
+       CFLAGS="$CFLAGS -Wno-pointer-sign"
+    fi
+fi
+
+CL_AS_NOEXECSTACK
+
+if test "$print_egd_warning" = yes; then
+  AC_MSG_WARN([[
+***
+*** The performance of the UNIX random gatherer module is not very good
+*** and it does not keep the entropy pool over multiple invocations of
+*** GnuPG.  The suggested way to overcome this problem is to use the
+***
+***               Entropy Gathering Daemon (EGD)
+***
+*** which provides a entropy source for the whole system.  It is written
+*** in Perl and available at the GnuPG FTP servers.  For more information
+*** consult the GnuPG webpages:
+***
+***           http://www.gnupg.org/download/#EGD
+***
+*** You may want to run ./configure with --enable-static-rnd=egd or
+*** --enable-static-rnd=auto to use it.
+***]])
+fi
+
+# Note the \\\\ for backslashes.  Autoconf eats one layer, leaving \\
+
+AC_CONFIG_COMMANDS(g10defs.h,[[
+cat >g10defs.tmp <<G10EOF
+/* Generated automatically by configure */
+#ifdef HAVE_DRIVE_LETTERS
+#define G10_LOCALEDIR     "c:\\\\lib\\\\gnupg\\\\locale"
+#define GNUPG_LIBDIR      "c:\\\\lib\\\\gnupg"
+#define GNUPG_LIBEXECDIR  "c:\\\\lib\\\\gnupg"
+#define GNUPG_DATADIR     "c:\\\\lib\\\\gnupg"
+#define GNUPG_HOMEDIR     "c:\\\\gnupg"
+#else
+#define G10_LOCALEDIR     "${datadir}/locale"
+#define GNUPG_LIBDIR      "${libdir}/gnupg"
+#define GNUPG_DATADIR     "${datadir}/gnupg"
+#ifdef __VMS
+#define GNUPG_HOMEDIR "/SYS\$LOGIN/gnupg" 
+#else
+#define GNUPG_HOMEDIR "~/.gnupg" 
+#endif
+#endif
+/* those are here to be redefined by handcrafted g10defs.h.
+   Please note that the string version must not contain more
+   than one character because the using code assumes strlen()==1 */
+#ifdef HAVE_DOSISH_SYSTEM
+#define DIRSEP_C '\\\\'
+#define EXTSEP_C '.'
+#define DIRSEP_S "\\\\"
+#define EXTSEP_S "."
+#define PATHSEP_C ';'
+#define PATHSEP_S ";"
+#else
+#define DIRSEP_C '/'
+#define EXTSEP_C '.'
+#define DIRSEP_S "/"
+#define EXTSEP_S "."
+#define PATHSEP_C ':'
+#define PATHSEP_S ":"
+#endif
+/* This is the same as VERSION, but should be overridden if the
+   platform cannot handle things like dots'.' in filenames.  Set
+   SAFE_VERSION_DOT and SAFE_VERSION_DASH to whatever SAFE_VERSION
+   uses for dots and dashes. */
+#define SAFE_VERSION      VERSION
+#define SAFE_VERSION_DOT  '.'
+#define SAFE_VERSION_DASH '-'
+G10EOF
+cat mpi/mpi-asm-defs.h >>g10defs.tmp 
+if cmp -s g10defs.h g10defs.tmp 2>/dev/null; then
+    echo "g10defs.h is unchanged"
+    rm -f g10defs.tmp
+else
+    rm -f g10defs.h
+    mv g10defs.tmp g10defs.h
+    echo "g10defs.h created"
+fi
+]],[[
+prefix=$prefix
+exec_prefix=$exec_prefix
+libdir=$libdir
+libexecdir=$libexecdir
+datadir=$datadir
+DATADIRNAME=$DATADIRNAME
+]])
+
+
+AC_CONFIG_FILES([
+Makefile
+m4/Makefile
+intl/Makefile
+po/Makefile.in
+util/Makefile
+mpi/Makefile
+cipher/Makefile
+g10/Makefile
+keyserver/Makefile
+keyserver/gpgkeys_mailto
+keyserver/gpgkeys_test
+doc/Makefile
+tools/Makefile
+tools/gpg-zip
+zlib/Makefile
+checks/Makefile
+])
+AC_OUTPUT
+
+# Give some feedback
+echo
+echo   "                Version info:   $PACKAGE_STRING"             
+echo   "                Configured for: $PRINTABLE_OS_NAME ($host)"
+if test -n "$show_extraasm"; then
+  echo "  Extra cpu specific functions:$show_extraasm"
+fi
+echo
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644 (file)
index 0000000..cb9d785
--- /dev/null
@@ -0,0 +1,21 @@
+Upgrading from very old (<= 0.3.3) versions of GnuPG
+----------------------------------------------------
+
+Due to a bug in the way secret keys were encrypted in versions prior
+to 0.3.3, later version of GnuPG are not backwards compatible and you
+will have to convert your secret keys before using old secret keys
+with recent versions of GnuPG.
+
+The upgrade strategy is described in /usr/doc/gnupg/NEWS.gz, please
+refer to it for more details, but it requires an old copy of the gpg
+and gpgm binaries.  They may be on your system as gpg.old and
+gpgm.old, but if they're not you can find gnupg 0.3.2 source and
+binaries for i386, m68k, alpha, powerpc and hurd-i386 at:
+
+  <URL:http://people.debian.org/~troup/gnupg/>
+
+-- 
+James Troup <james@nocrew.org>, Horsforth, UK
+Tue, 30 Apr 2002 20:04:49 +0100
+
+
diff --git a/debian/Upgrading_From_PGP.txt b/debian/Upgrading_From_PGP.txt
new file mode 100644 (file)
index 0000000..bce0559
--- /dev/null
@@ -0,0 +1,76 @@
+For a long time I have wanted to switch from using PGP 2.x to using GPG
+(because it's Free).  But I didn't want to give up my trusty PGP key,
+which has a long history and has gathered a lot of signatures that
+I would have trouble getting again.
+
+Now that the RSA patent has expired, GPG comes with RSA support
+by default.  This means that it's actually possible to convert
+your PGP key to a GPG key, and use it normally with GPG.  You
+will not need gpg-idea or any other non-free component.
+
+The steps are quite easy.  I wrote them down here, because I expect
+that a number of Debian maintainers are in the same situation
+and can benefit from this advice.
+
+Note that the GPG FAQ contains a section about the same thing,
+but it's aimed at maintaining compatibility with PGP 2.x.
+The procedure I describe here is designed solely to switch
+to GPG without giving up your PGP key.  It will not let you
+exchange encrypted mail with someone who still uses (only) PGP 2.x.
+But if you ever need to do that, you can pull out your old copy
+of PGP for that -- it's the same key!
+
+Here are the steps:
+
+  0. Make sure your version of GPG supports RSA.  You should be
+     okay if you have GPG 1.0.3 or newer.  I used GPG 1.0.4 myself.
+
+  1. Back up your .pgp directory, and your .gnupg directory (if any).
+     Note: I started with an empty .gnupg directory for this.
+     If you already have a GPG ring with a set of keys, you'll
+     end up having two keys with probably the same userids.
+     That won't break anything, but it can be confusing and it
+     is easy to accidentally use the wrong key.
+
+  2. Remove the passphrase from your PGP secret key.  This is necessary
+     because the secret key is protected using the IDEA algorithm, and
+     IDEA is still patented so GPG does not support it.
+     Command:
+     pgp -ke userid
+     where userid is what you use to access your key, usually your name
+     or email address.  Just hit Enter when PGP asks for the new
+     passphrase.
+
+  3. Import your secret and public keys into GPG.
+     Command:
+     gpg --import $HOME/.pgp/secring.pgp $HOME/.pgp/pubring.pgp
+     There doesn't seem to be a way to tell GPG to import only selected
+     keys from those files, so you may want to first use PGP to export
+     your keys to a small keyring.  (Do not use ASCII armor for that.)
+     I simply imported all the keys, because I wanted to convert to using
+     GPG for everything.
+
+  4. Re-protect your secret key with a passphrase.
+     You removed the passphrase in step 2, you can now put it back.
+     Command:
+     gpg --edit-key userid
+     GPG will tell you what key you accessed and prompt you to do
+     something with it.  Tell it "passwd" to change the passphrase.
+
+  5. Check if everything worked.  Sign and encrypt a small file,
+     mail it to a friend, see if you can decrypt something mailed
+     to you, upload a Debian package, that sort of thing.
+
+  6. Clean up the backups.  Remember, you un-protected your PGP key.
+     It's still not protected, and it's the same key you are now using
+     with GPG.  Make sure no one can get at it.  You can restore
+     the backup, or run pgp -ke again, or -- if you don't plan to ever
+     use PGP again -- delete the key.  There is a program in fileutils
+     called "shred" which may help with this.
+
+Well, I hope this helps someone.  I wrote this down after exactly one
+experience with converting keys -- I'd love to have feedback from
+someone else who tried it.
+
+Richard Braakman
+with tips from Adam Rogoyski, Marco d'Itri, and Andrew Pimlott.
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..1db2856
--- /dev/null
@@ -0,0 +1,992 @@
+gnupg (1.4.6-3slp2+s5) lucid; urgency=low
+
+  * Fix libusb again
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Mon, 02 May 2011 15:32:30 +0900
+
+gnupg (1.4.6-3slp2+s4) unstable; urgency=low
+
+  * Make sure not to use libusb when building
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Thu, 28 Apr 2011 15:33:03 +0900
+
+gnupg (1.4.6-3slp2+s3) unstable; urgency=low
+
+  * Make sure not to use libcurl when building
+
+ -- Mike McCormack <mj.mccormack@samsung.com>  Fri, 08 Apr 2011 10:04:47 +0900
+
+gnupg (1.4.6-3slp2+s2) unstable; urgency=low
+
+  * Rebuild against readline5.
+
+ -- Rafal Krypa <r.krypa@samsung.com>  Wed, 12 Jan 2011 14:24:42 +0100
+
+gnupg (1.4.6-3slp2+s1) unstable; urgency=low
+
+  * Set myself as maintainer.
+  * Drop dependency on: libldap2-dev, libcap-dev, libusb-dev.
+  * Change dependency on libreadline5-dev to libreadline-dev.
+  * Don't create udebs.
+  * Git: 165.213.180.234:/git/slp/pkgs/gnupg
+  * Tag: gnupg_1.4.6-3slp2+s1
+
+ -- Rafal Krypa <r.krypa@samsung.com>  Thu, 11 Nov 2010 17:48:12 +0900
+
+gnupg (1.4.6-3) unstable; urgency=low
+
+  * Adopt package. Thanks to James Troup for his work in the far past.
+    Thanks to NMU'ers Bastian and Thijs. (Closes: #476418)
+  * Co-maintainers wanted.
+  * Don't build-dep on pcap on non-linux-archs. (Closes: #357267)
+
+ -- Sune Vuorela <debian@pusling.com>  Sat, 17 May 2008 15:42:55 +0200
+
+gnupg (1.4.6-2.2) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Do not install gpg setuid root, this is not necessary anymore since
+    Linux kernel 2.6.9. (Closes: #356550, #346597, #453122)
+  * Update priority to match override.
+
+ -- Thijs Kinkhorst <thijs@debian.org>  Sat, 03 May 2008 16:20:56 +0200
+
+gnupg (1.4.6-2.1) unstable; urgency=low
+
+  * Non-maintainer upload.
+  * Remove makedev dependency. (closes: #343988)
+
+ -- Bastian Blank <waldi@debian.org>  Sat, 23 Feb 2008 19:59:18 +0100
+
+gnupg (1.4.6-2) unstable; urgency=medium
+
+  * 28_multiple_message.dpatch: new patch from upstream to fix problems
+    handling verification of messages with multiple
+    components. [CVE-2007-1263]
+
+ -- James Troup <james@nocrew.org>  Wed,  7 Mar 2007 21:47:35 +0000
+
+gnupg (1.4.6-1) unstable; urgency=high
+
+  * New upstream release.
+   * Fixes remotely controllable function pointer [CVE-2006-6235]
+
+  * 27_filename_overflow.dpatch: merged upstream, dropped.
+  * 24_gpgv_manpage_cleanup.dpatch: updated and a couple of additional
+    trivial fixes.
+
+  * debian/rules (binary-arch): info copy of manuals moved to
+    /usr/share/info - remove them there instead.  Manuals are now built
+    from texi source, so install them from build tree, not top level.
+
+  * debian/copyright: update to add OpenSSL exemption for keyserver helper
+    tools.
+
+ -- James Troup <james@nocrew.org>  Thu,  7 Dec 2006 02:54:51 +0000
+
+gnupg (1.4.5-3) unstable; urgency=high
+
+  * 27_filename_overflow.dpatch: new patch from upstream to fix buffer
+    overflow in ask_outfile_name(). [CVE-2006-6169]
+
+ -- James Troup <james@nocrew.org>  Mon, 27 Nov 2006 21:23:37 +0000
+
+gnupg (1.4.5-2) unstable; urgency=low
+
+  * debian/control: add gpgv package.  Make gnupg package depend on it.
+  * debian/rules (binary-arch): add support for building gpgv package.
+    Adapt gnupg package creation accordingly.
+  * debian/rules (clean): clean gpgv package temporary directory.
+
+ -- James Troup <james@nocrew.org>  Thu, 26 Oct 2006 02:14:46 +0100
+
+gnupg (1.4.5-1) unstable; urgency=low
+
+  * New upstream release.
+   * 23_getkey_utf8_userid.dpatch: superseded by different fix upstream,
+     dropped.
+   * 26_user_id_overflow.dpatch: merged upstream, dropped.
+   * 25_de.po_fixes.dpatch: updated.
+
+  * debian/copyright: update FSF address.
+  * debian/changelog: convert to UTF-8.
+  * debian/control (Standards-Version): bump to 3.7.2.1.
+
+ -- James Troup <james@nocrew.org>  Tue,  1 Aug 2006 22:50:09 +0100
+
+gnupg (1.4.3-2) unstable; urgency=low
+
+  * 26_user_id_overflow.dpatch: new patch pulled from upstream SVN to fix
+    a crash when processing overly large User ID packets [CVE-2006-3082].
+    Thanks to Alec Berryman <alec@thened.net>. Closes: #375052
+
+ -- James Troup <james@nocrew.org>  Fri, 23 Jun 2006 11:22:31 +0100
+
+gnupg (1.4.3-1) unstable; urgency=low
+
+  * New upstream release.
+   * 22_zero_length_mpi_fix.dpatch: merged upstream, dropped.
+   * debian/rules (test): s/g10.c/gpg.c/.
+   * 16_min_privileges.dpatch: likewise.
+
+  * debian/control, debian/rules: apply patch from Max Vozeler
+    <xam@debian.org> to build gnupg-udeb.  Closes: #321948
+  
+  * Based on discussion with and testing by Martin Pitt
+    <martin.pitt@ubuntu.com>:
+   * debian/rules (build-deb-stamp): don't pass --with-included-gettext to
+     configure.
+   * debian/rules (build-udeb-stamp): likewise.
+   * debian/rules (binary-arch): don't need to remove
+     usr/share/locale/locale.alias anymore as a result.
+
+  * debian/rules (build-deb-stamp): pass --enable-mailto to configure.
+    Closes #301308
+  * debian/rules (build-udeb-stamp): likewise.
+
+  * debian/control (Build-Depends): drop mail-transport-agent and...
+  * debian/rules (build-deb-stamp): pass
+    --with-mailprog=/usr/sbin/sendmail to configure instead.
+  * debian/rules (build-udeb-stamp): likewise.  Closes: #333218
+
+  * debian/rules: put common configure options into CONFARGS variable and
+    rename the cross-compile-only variable to HOSTARG.
+
+  * debian/rules (clean): also remove debian/gnupg-deb build directory.
+
+  * debian/gpg-convert-from-106.1, debian/gpgsplit.1, debian/lspgpot.1:
+    new manpages from François Wendling <frwendling@free.fr>.  Closes:
+    #344314
+  * debian/rules (binary-arch): install them.
+
+  * The following is a patch from Frans Pop <aragorn@tiscali.nl>.  Closes:
+    #360257
+   * debian/control (Build-Depends): add dpkg-dev (>= 1.13.12).
+   * debian/rules (binary-arch): pass -tudeb when invoking dpkg-shlibdeps
+     for the .udeb builds.
+
+  * 23_getkey_utf8_userid.dpatch: new patch from Fumitoshi UKAI
+    <ukai@debian.or.jp> to fix '[User id not found]' message in non-UTF-8
+    locales.  Closes: #205028
+
+  * 24_gpgv_manpage_cleanup.dpatch: new patch from "Jim W. Jaszewski"
+    <grok@sprint.ca> to fix small errors in the gpgv manpage.  Closes:
+    #177951
+
+  * 25_de.po_fixes.dpatch: new patch from Jens Seidel
+    <jensseidel@users.sf.net> with small fixes to the German translations.
+    Closes: #314069
+
+ -- James Troup <james@nocrew.org>  Wed,  5 Apr 2006 02:45:56 +0100
+
+gnupg (1.4.2.2-1) unstable; urgency=low
+
+  * New upstream release.
+   * Fixes handling of files containing several signed messages.
+     [CVE-2006-0049]
+
+ -- James Troup <james@nocrew.org>  Fri, 10 Mar 2006 04:27:12 +0000
+
+gnupg (1.4.2-2) unstable; urgency=low
+
+  * 22_zero_length_mpi_fix.dpatch: new patch; pull in upstream patch to
+    fix bug in reading a zero-length MPI.  Closes: #330686
+
+ -- James Troup <james@nocrew.org>  Sun,  2 Oct 2005 02:39:51 +0100
+
+gnupg (1.4.2-1) unstable; urgency=low
+
+  * New upstream release.
+   * Fixes extra ) on expired keys.  Closes: #329402
+
+  * debian/control (Standards-Version): updated to 3.6.2.1.
+
+  * debian/rules (binary-arch): drop 'gnupg/' from libexecdir passed to
+    make install.
+
+ -- James Troup <james@nocrew.org>  Sat, 24 Sep 2005 03:31:37 +0100
+
+gnupg (1.4.1-1) unstable; urgency=low
+
+  * New upstream release.  Closes: #307203
+   * Fixes mis-selection of encryption key.  Closes: #299814
+   * Countermeasures against the Mister/Zuccherato CFB attack.  
+     Closes: #300859
+  * 18_ca_po_update.dpatch, 21_strgutil_update.dpatch: dropped - merged
+    upstream.
+  * debian/rules (build-deb-stamp): don't forcefully regenerate po/ca.gmo.
+    (clean): likewise, don't remove po/ca.gmo.
+
+ -- James Troup <james@nocrew.org>  Mon,  9 May 2005 23:41:50 +0100
+
+gnupg (1.4.0-3) unstable; urgency=low
+
+  * debian/rules (binary-arch): move Russian manpage to correct (FHS)
+    location.  Thanks to Uwe Zeisberger
+    <zeisberg@informatik.uni-freiburg.de> for the report.  Closes: #294196
+
+ -- James Troup <james@nocrew.org>  Sun, 20 Feb 2005 22:55:11 +0000
+
+gnupg (1.4.0-2) unstable; urgency=low
+
+  * 18_ca_po_update.dpatch: re-added, updated for new upstream release.
+    Thanks to Jordi Mallach <jordi@debian.org>.
+  * debian/rules (build-deb): force regeneration of ca.gmo.
+
+  * 21_strgutil_update.dpatch: new patch; pull in strgutil.c fixes from
+    1.4.1rc1 to fix warnings about 'Invalid or incomplete multibyte or
+    wide character' with (at least) Latin-1 encoded UIDs.
+
+  * debian/copyright: update year and version number.
+
+  * debian/rules: apply patch to enable cross-build from NIIBE Yutaka
+    <gniibe@fsij.org>. Closes: #285293
+
+  * debian/rules: s/DEB_HOST_ARCH/DEB_BUILD_ARCH/ as the gpgv-udeb should
+    use the build architecture not host.
+  * debian/rules (build-udeb): pass $(CONFARGS) to configure here too.
+  
+ -- James Troup <james@nocrew.org>  Sat,  5 Feb 2005 03:03:06 +0000
+
+gnupg (1.4.0-1) unstable; urgency=low
+
+  * New upstream release.  Closes: #286058
+  
+  * debian/control (Build-Depends): add libusb-dev and libreadline5-dev.
+  * debian/rules (binary): install doc/highlights-1.4.txt to
+    /usr/share/doc/gnupg/ too.
+
+  * 17_ipv6_support.dpatch: removed; a different patch has been applied
+    upstream.
+  * 19_throw_keyid_compat.dpatch, 20_update_pgp8.dpatch: dropped; merged
+    upstream.
+
+  * 16_min_privileges.dpatch: adjusted for new upstream release with
+    wiggle(1).
+
+  * 18_ca_po_update.dpatch: dropped temporarily as it no longer applies.
+
+  * Apply patch from Colin Watson to add gpgv-udeb package.  Closes: #287106
+  * debian/rules (build-udeb): also pass --without-readline to configure.
+
+ -- James Troup <james@nocrew.org>  Thu,  3 Feb 2005 23:52:49 +0000
+
+gnupg (1.2.5-3.1) UNOFFICIAL; urgency=low
+
+  * debian/control, debian/rules: Build gpgv-udeb, containing just
+    /usr/bin/gpgv built without bzip2 support and with -Os, for use in
+    debian-installer.
+
+ -- Colin Watson <cjwatson@debian.org>  Fri, 24 Dec 2004 13:42:23 +0000
+
+gnupg (1.2.5-3) unstable; urgency=low
+
+  * debian/rules (build): drop --with-capabilites for now.
+  * debian/rules (clean): don't remove fi.gmo now that we're no longer
+    patching it.
+  * Merge patch from Peter Palfrader <weasel@debian.org> to fix building
+    without capabilities and idempotency of build process after
+    18_ca_po_update.dpatch.  Closes: #262723
+
+ -- James Troup <james@nocrew.org>  Mon,  2 Aug 2004 00:51:21 +0100
+
+gnupg (1.2.5-2.1) unstable; urgency=low
+
+  * Fix patches/15_free_caps to also build without capabilities.
+  * Remove po/ca.gmo in clean target.
+
+ -- Peter Palfrader <weasel@debian.org>  Sun,  1 Aug 2004 20:13:31 +0200
+
+gnupg (1.2.5-2) unstable; urgency=low
+
+  * 18_ca_po_update.dpatch: new patch from Jordi Mallach
+    <jordi@debian.org> to fix ca.po encoding.  Closes: #237070
+
+  * 19_throw_keyid_compat.dpatch: new patch from Werner Koch
+    <wk@gnupg.org> to add a --throw-keyid option for backwards
+    compatability.
+  
+  * 20_update_pgp8.dpatch: new patch from David Shaw
+    <dshaw@jabberwocky.com> to update --pgp8 to match reality.
+
+ -- James Troup <james@nocrew.org>  Sat, 31 Jul 2004 10:55:30 +0100
+
+gnupg (1.2.5-1) unstable; urgency=low
+
+  * New upstream release.  Closes: #262094
+   * UID merging should now work on initial import.  Closes: #236966
+  
+  * 10_hppa_unaligned_constant.dpatch, 11_fi_po_update.dpatch,
+    12_zero_length_header.dpatch, 13_revoked_keys.dpatch,
+    14_getkey_not_found_fix.dpatch: merged upstream - removed.
+
+  * debian/rules (binary-arch): add
+    'mkinstalldirs=`pwd`/scripts/mkinstalldirs' to make install invocation
+    to work around broken Makefile.
+
+  * debian/control (Standards-Version): bump to 3.6.1.1.
+
+  * Apply patch from Martin Pitt <mpitt@debian.org> to drop privileges as
+    early as possible.  Closes: #260803
+
+  * debian/control (Build-Depends): add mail-transport-agent to ensure
+    gpgkeys_mailto is built.  Thanks to Daniel Schepler
+    <schepler@math.berkeley.edu> for noticing.  Closes: #253681
+
+  * debian/rules, debian/preinst: Patch from David Weinehall
+    <tao@debian.org> to use && in favour of -a as the latter is an XSI
+    extension.  Closes: #257575
+
+  * 17_ipv6_support.dpatch: IPv6 patch from Jun-ichiro itojun Hagino.
+    Thanks to Fabio Massimo Di Nitto <fabbione@fabbione.net>.  
+    Closes: #209242
+
+ -- James Troup <james@nocrew.org>  Thu, 29 Jul 2004 23:57:08 +0100
+
+gnupg (1.2.4-4.1) unstable; urgency=low
+
+  * 15_free_caps.dpatch: free allocated capability contexts when using
+    USE_CAPABILITIES.
+  * 16_min_privileges.dpatch: immediately drop root user to normal user and
+    keep only CAP_IPC_LOCK, which is dropped as well right after it is not
+    needed any more. This ensures minimal privileges.
+  * debian/rules: configure with --with-capabilities to tighten security.
+  * debian/control: this requires build-dependency libcap-dev.
+
+ -- Martin Pitt <mpitt@debian.org>  Thu, 22 Jul 2004 02:08:56 +0200
+
+gnupg (1.2.4-4) unstable; urgency=low
+
+  * 12_zero_length_header.dpatch: update patch from David Shaw
+    <dshaw@jabberwocky.com> to fix the fix of crashing on certain
+    keys. Closes: #234289
+
+ -- James Troup <james@nocrew.org>  Mon, 23 Feb 2004 18:02:20 +0000
+
+gnupg (1.2.4-3) unstable; urgency=low
+
+  * Move to dpatch; existing non-debian/ change split into
+    10_hppa_unaligned_constant.dpatch.
+
+  * debian/rules: include /usr/share/dpatch/dpatch.make.
+  * debian/rules (build): depend on patch-stamp.
+  * debian/rules (clean): depend on unpatch.  Remove debian/patched.
+  * debian/control (Build-Depends): add dpatch.
+
+  * debian/rules: update version number and use install_foo convenience
+    variables.
+  * debian/rules (clean): remove emacs backup files from any directory.
+  
+  * 11_fi_po_update.dpatch: new patch from Tommi Vainikainen
+    <thv+debian@iki.fi> to update Finnish translation as the current one
+    renders gnupg unusable.  Closes: #232030, #222951, #192582
+  * debian/rules (clean): remove po/fi.gmo to avoid dpkg-source errors
+    over unrepresentable changes to source.
+
+  * 12_zero_length_header.dpatch: new patch from David Shaw
+    <dshaw@jabberwocky.com> to fix cases where importing certain keys
+    makes the keyring unuseable.  Closes: #232714
+
+  * 13_revoked_keys.dpatch: new patch from David Shaw
+    <dshaw@jabberwocky.com> to list revoked keys as revoked.  Closes: #231814
+
+  * 14_getkey_not_found_fix.dpatch: new patch from David Shaw
+    <dshaw@jabberwocky.com> to fix --list-sigs incorrectly claiming "User
+    id not found".  Closes: #229549
+
+ -- James Troup <james@nocrew.org>  Fri, 20 Feb 2004 16:38:12 +0000
+  
+gnupg (1.2.4-2) unstable; urgency=low
+
+  * mpi/hppa1.1/udiv-qrnnd.S: patch from LaMont Jones <lamont@debian.org>
+    to fix unaligned constant.  Closes: #228456
+  * debian/copyright: update year and version number.
+
+ -- James Troup <james@nocrew.org>  Tue, 20 Jan 2004 17:19:58 +0000
+
+gnupg (1.2.4-1) unstable; urgency=medium
+
+  * New upstream release.
+   * Most support for ElGamal Sign+Encrypt keys has been removed. Closes: #222293
+   * No longer miss-identifies GNU/KFreeBSD as GNU/Hurd. Closes: #216957
+   * Fixes build error on GNU/KFreeBSD (and Glibc-based GNU/KNetBSD). Closes: #221079
+   * Fixes segmentation fault in prime generator. Closes: #213989
+   * Fixes trustdb not updating without ultimately trusted keys. Closes: #222368
+
+  * debian/control (Build-Depends): add libbz2-dev.
+
+ -- James Troup <james@nocrew.org>  Wed, 31 Dec 2003 17:57:52 +0000
+
+gnupg (1.2.3-1) unstable; urgency=low
+
+  * New upstream release (Closes: #207340).
+   * gpg no longer kills keyrings by importing broken keys.  Closes: #196505
+   * options.skel uses subkeys.pgp.net instead of pgp.mit.edu. Closes: #206092
+   * --import now closes files when it's done. Closes: #196643
+   * A key listing speed regression has been fixed. Closes: #192083
+  * debian/copyright: update URL and date.
+  * debian/rules: update dates and version.
+
+  * debian/control (Standards-Version): bump to 3.6.0.
+
+  * debian/Upgrading_From_PGP.txt: new file from to Richard Braakman
+    <dark@xs4all.nl>.  Closes: #173233
+  * debian/rules (binary-arch): install it.
+
+  * debian/rules (build): correct libexecdir passed to configure; patch
+    from Matthias Cramer <cramer@freestone.net>.  Fixes invocation of
+    gpgkeys_ldap.  Closes: #168486
+
+ -- James Troup <james@nocrew.org>  Thu, 28 Aug 2003 14:08:50 +0100
+
+gnupg (1.2.2-1) unstable; urgency=low
+
+  * New upstream release.
+  * debian/control (Standards-Version): bump to 3.5.9.0.
+  * debian/rules (binary-arch): install convert-from-106 as
+    gpg-convert-from-106 and fix the path to gpg.
+  * debian/control: remove trailing full stop from short description.
+  * debian/control: remove out-dated and contradictory information about
+    RSA.
+
+ -- James Troup <james@nocrew.org>  Mon,  5 May 2003 03:08:58 +0100
+
+gnupg (1.2.1-2) unstable; urgency=low
+
+  * Update config.guess (to 2002-10-21) and config.sub (to 2002-09-05).
+    Thanks to Ryan Murray.  Closes: #166696
+
+ -- James Troup <james@nocrew.org>  Mon, 28 Oct 2002 01:47:26 +0000
+
+gnupg (1.2.1-1) unstable; urgency=low
+
+  * New upstream version.
+   * An inifinte loop in --update-trustdb has been fixed.  Closes: #162039
+   * The polish translation is now correctly specified as UTF-8.  Closes: #162885
+   * --refresh-keys is now documented in the manpage.  Closes: #165566
+  * debian/control (Conflicts): add gpg-idea <= 2.2 since gnupg >= 1.2 is
+    incompatible with that version of gpg-idea.  Closes: #162314
+
+ -- James Troup <james@nocrew.org>  Fri, 25 Oct 2002 18:18:43 +0100
+
+gnupg (1.2.0-1) unstable; urgency=low
+
+  * New upstream version.  Closes: #161817.
+   * --options no longer mis-handles a directory as an argument.  Closes: #151973
+   * gpg now prompts before sending all keys to the keyserver.  Closes: #64607
+   * There is now a gnupg(7) manpage.  Closes: #157750
+   * The permission checking has been sanitized and handles non-home-dir
+     keyrings better.  Closes: #147760
+   * notation data longer than 5 characters is now handled.  Closes: #156871
+   * an abort when setting trust levels in a czech locale has been fixed.
+     Closes: #149212
+  * debian/rules (binary-arch): there are no more modules, adjust
+    accordingly.
+  * debian/postinst, debian/prerm: remove; no longer do /usr/doc symlinks.
+  * debian/rules (binary-arch): don't install obsolete postinst or prerm.
+  * debian/rules (binary-arch): gzip gnupg.7 too.
+  * debian/rules (build): pass --libexecdir=/usr/lib/gnupg to configure.
+  * debian/rules (binary-arch): likewise, pass suitable libexcedir
+    argument to make install.
+  * debian/control (Standards-Version): update to 3.5.7.0.
+  * debian/copyright: update URL and date.
+  * debian/rules: update dates and version.
+
+ -- James Troup <james@nocrew.org>  Sun, 22 Sep 2002 22:26:25 +0100
+
+gnupg (1.0.7-2) unstable; urgency=low
+
+  * debian/control (Suggests): add xloadimage since that's what gpg uses
+    by default to view photo IDs.  Thanks to Julien Danjou
+    <acid@debian.org> for the suggestion.  Closes: #156245
+  * debian/control (Depends): add "hurd" to the alternatives to
+    makedev. Thanks to Michal Suchanek <hramrach_l@centrum.cz> for
+    noticing.  Closes: #158492
+  * po/it.po: patch to fix typos from Marco Bodrato
+    <bodrato@gulp.linux.it.  Closes: #149462
+  * g10/g10.c (main): remove the bogus undef of USE_SHM_COPROCESSING to
+    match upstream and fix gabber and libgnupg-perl.  Closes: #147679, #151969
+
+ -- James Troup <james@nocrew.org>  Thu, 29 Aug 2002 01:42:58 +0100
+
+gnupg (1.0.7-1) unstable; urgency=low
+
+  * New upstream version.  Closes: #145477.
+    * GDBM support has been removed.  Closes: #33009.
+    * Now adds the default keyring when a keyring is specified.
+      Closes: #50616, #65260.
+    * Now does the Right Thing when receiving a key from the keyserver and
+      the key in question is in both a read-only and writable keyring.
+      Closes: #63297.
+    * Automatic key retrieval is now configurable.  Closes: #64940.
+    * --no-options supresses ~/.gnupg creation again.  Closes: #95486.
+    * duplicate trust entries are no longer treated as an error. Closes: #96480.
+    * There's now no comment line in ascii armours. Closes: #100088.
+    * Handle secret keyring given as keyring better.  Closes: #100581, #106670.
+    * It's now documented that --with-colons unconditionally uses UTF8.
+      Closes: #101446, 101454.
+    * s/now/knows/ typo in manpage fixed.  Closes: #107471.
+    * There's now support for a primary UID.  Closes: #106567, #108155.
+    * Handles errors in uncompression layer beter. Closes: #112392.
+    * Key selection has been entirely revamped.  Closes: #136170.
+    * Handles empty encrypt-to. Closes: #138378
+
+  * debian/rules (binary-arch): remove empty /usr/info directory, thanks
+    to Joey Hess <joeyh@debian.org>.  Closes: #121864.
+  * debian/control: remove duplicated word from long description, thanks
+    to Nicolas Boulenguez <nicolas.boulenguez@free.fr>.  Closes: #144786.
+  * README: correct URL to GPH and other docs, thanks to Mark Brown
+    <broonie@sirena.org.uk>.  Closes: #100277.
+  * debian/control (Standards-Version): updated to 3.5.6.1.
+  * debian/rules (binary-arch): only strip ELF binaries.  es_ES -> es hack
+    no longer needed as fixed upstream.
+  * debian/control (Build-Depends): remove libgdbmg1-dev; no longer used.
+  * debian/README.Debian: remove note about gdbm support which was finally
+    removed.  Update note on old versions of gnupg to reflect the
+    pre-historic nature of those versions.
+  * debian/control (Build-Depends): add libldap2-dev.
+  * debian/rules (binary-arch): call dpkg-shlibdeps for all ELF binaries.
+  * debian/control (Build-Depends): add file.
+  * debian/control (Priority): increase to standard to match overrides.
+
+ -- James Troup <james@nocrew.org>  Sat, 11 May 2002 15:08:02 +0100
+
+gnupg (1.0.6-3) unstable; urgency=low
+
+  * moved into main.
+
+ -- James Troup <james@nocrew.org>  Tue, 19 Mar 2002 16:17:09 +0000
+
+gnupg (1.0.6-2) unstable; urgency=high
+
+  * debian/rules (binary-arch): remove the erroneous
+    /usr/share/locale/locale.alias that 'make install' adds; closes:
+    #99293.
+
+ -- James Troup <james@nocrew.org>  Wed, 30 May 2001 20:40:59 +0100
+
+gnupg (1.0.6-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Tue, 29 May 2001 20:59:49 +0100
+
+gnupg (1.0.5-4) unstable; urgency=low
+
+  * Patch from Werner.
+
+ -- James Troup <james@nocrew.org>  Sun, 27 May 2001 09:34:50 +0100
+
+gnupg (1.0.5-3) unstable; urgency=low
+
+  * Apply patch from Matthew Wilcox <matthew@wil.cx> to fix assembly on
+    hppa.
+
+ -- James Troup <james@nocrew.org>  Sun, 13 May 2001 02:36:45 +0100
+
+gnupg (1.0.5-2) unstable; urgency=medium
+
+  * util/http.c: patch from Werner that fixes --send-key, closes: #96277.
+  * debian/control (Depends): accept devfsd in place of makedev, closes:
+    #96307.
+
+ -- James Troup <james@nocrew.org>  Mon,  7 May 2001 00:13:51 +0100
+
+gnupg (1.0.5-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/README.Debian: fix spelling and update URL.
+  * debian/rules (binary): remove the new info files.
+  * scripts/config.{guess,sub}: sync with subversions, closes: #95729.
+
+ -- James Troup <james@nocrew.org>  Mon, 30 Apr 2001 02:12:38 +0100
+
+gnupg (1.0.4-4) unstable; urgency=low
+
+  * po/ru.po: patch by Ilya Martynov <m_ilya@agava.com> to replace German
+    entries and add missing translations, closes: #93987.
+  * g10/revoke.c (ask_revocation_reason): typo fix (s/non longer/no
+    longer/g); noticed by Colin Watson <cjw44@flatline.org.uk>, closes:
+    #93664.
+
+  * Deprecated depreciated; noticed by Vincent Broman
+    <broman@spawar.navy.mil>.
+
+  * Following two patches are from Vincent Broman.
+  * g10/mainproc.c (proc_tree): use iobuf_get_real_fname() in preference
+    to iobuf_get_fname().
+  * g10/openfile.c (open_sigfile): handle .sign prefixed files correctly.
+
+ -- James Troup <james@nocrew.org>  Fri, 20 Apr 2001 23:32:44 +0100
+
+gnupg (1.0.4-3) unstable; urgency=medium
+
+  * debian/rules (binary): make gpg binary suid, closes: #86433.
+  * debian/postinst: don't use suidregister.
+  * debian/postrm: removed (only called suidunregister).
+  * debian/control: conflict with suidmanager << 0.50.
+  * mpi/longlong.h: apply fix for ARM long long artimetic from Philip
+    Blundell <philb@gnu.org>, closes: #87487.
+  * debian/preinst: the old GnuPG debs have moved to people.debian.org.
+  * cipher/random.c: #include <time.h> as well as <sys/time.h>
+  * g10/misc.c: likewise.
+  * debian/rules: define a strip alias which removes the .comment and
+    .note sections.
+  * debian/rules (binary-arch): use it.
+  * debian/lintian.override: new file; override the SUID warning from
+    lintian.
+  * debian/rules (binary-arch): install it.
+
+ -- James Troup <james@nocrew.org>  Sun, 25 Feb 2001 05:24:58 +0000
+
+gnupg (1.0.4-2) stable unstable; urgency=high
+
+  * Apply security fix patch from Werner.
+  * Apply another patch from Werner to fix bogus warning on Rijndael
+    usage.
+  * Change section to 'non-US'.
+
+ -- James Troup <james@nocrew.org>  Mon, 12 Feb 2001 07:47:02 +0000
+
+gnupg (1.0.4-1) stable unstable; urgency=high
+
+  * New upstream version.
+  * Fixes a serious bug which could lead to false signature verification
+    results when more than one signature is fed to gpg.
+
+ -- James Troup <james@nocrew.org>  Tue, 17 Oct 2000 17:26:17 +0100
+
+gnupg (1.0.3b-1) unstable; urgency=low
+
+  * New upstream snapshot version.
+
+ -- James Troup <james@nocrew.org>  Fri, 13 Oct 2000 18:08:14 +0100
+
+gnupg (1.0.3-2) unstable; urgency=low
+
+  * debian/control: Conflict, Replace and Provide gpg-rsa & gpg-rsaref.
+    Fix long description to reflect the fact that RSA is no longer
+    patented and now included. [#72177]
+  * debian/rules: move faq.html to /usr/share/doc/gnupg/ and remove FAQ
+    from /usr/share/gnupg/.  Thanks to Robert Luberda
+    <robert@pingu.ii.uj.edu.pl> for noticing. [#72151]
+  * debian/control: Suggest new package gnupg-doc. [#64323, #65560]
+  * utils/secmem.c (lock_pool): don't bomb out if mlock() returns ENOMEM,
+    as Linux will do this if resource limits (or other reasons) prevent
+    memory from being locked, instead treat it like permission was denied
+    and warn but continue.  Thanks to Topi Miettinen
+    <Topi.Miettinen@nic.fi>. [#70446]
+  * g10/hkp.c (not_implemented): s/ist/is/ in error message.
+  * debian/README.Debian: add a note about GDBM support and why it is
+    disabled.  Upstream already fixed the manpage.  [#65913]
+  * debian/rules (binary-arch): fix the Spanish translation to be 'es' not
+    'es_ES' at Nicolás Lichtmaier <nick@debian.org>'s request. [#57314]
+
+ -- James Troup <james@nocrew.org>  Sun,  1 Oct 2000 14:55:03 +0100
+
+gnupg (1.0.3-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Mon, 18 Sep 2000 15:56:54 +0100
+
+gnupg (1.0.2-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Thu, 13 Jul 2000 20:26:50 +0100
+
+gnupg (1.0.1-2) unstable; urgency=low
+
+  * debian/control (Build-Depends): added.
+  * debian/copyright: corrected location of copyright file.  Removed
+    references to Linux.  Removed warnings about beta nature of GnuPG.
+  * debian/rules (binary-arch): install documentation into
+    /usr/share/doc/gnupg/ and pass mandir to make install to ensure the
+    manpages go to /usr/share/man/.
+  * debian/postinst: create /usr/doc/gnupg symlink.
+  * debian/prerm: new file; remove /usr/doc/gnupg symlink.
+  * debian/rules (binary-arch): install prerm.
+  * debian/control (Standards-Version): updated to 3.1.1.1.
+
+ -- James Troup <james@nocrew.org>  Thu, 30 Dec 1999 16:16:49 +0000
+
+gnupg (1.0.1-1) unstable; urgency=low
+
+  * New upstream version.
+  * doc/gpg.1: updated to something usable from
+    ftp://ftp.gnupg.org/pub/gcrypt/gnupg/gpg.1.gz.
+
+ -- James Troup <james@nocrew.org>  Sun, 19 Dec 1999 23:47:10 +0000
+
+gnupg (1.0.0-3) unstable; urgency=low
+
+  * debian/rules (build): remove the stunningly ill-advised --host option
+    to configure.  [#44698, #48212, #48281]
+
+ -- James Troup <james@nocrew.org>  Tue, 26 Oct 1999 01:12:59 +0100
+
+gnupg (1.0.0-2) unstable; urgency=low
+
+  * debian/rules (binary-arch): fix the permissions on the
+    modules. [#47280]
+  * debian/postinst, debian/postrm: fix the package name passed to
+    suidregister. [#45013]
+  * debian/control: update long description. [#44636]
+  * debian/rules (build): pass the host explicitly to configure to avoid
+    problems on sparc64. [(Should fix) #44698].
+
+ -- James Troup <james@nocrew.org>  Wed, 20 Oct 1999 23:39:05 +0100
+
+gnupg (1.0.0-1) unstable; urgency=low
+
+  * New upstream release. [#44545]
+
+ -- James Troup <james@nocrew.org>  Wed,  8 Sep 1999 00:53:02 +0100
+
+gnupg (0.9.10-2) unstable; urgency=low
+
+  * debian/rules (binary-arch): install lspgpot.  Requested by Kai
+    Henningsen <kai@khms.westfalen.de>. [#42288]
+  * debian/rules (binary-arch): correct the path where modules are looked
+    for.  Reported by Karl M. Hegbloom <karlheg@odin.cc.pdx.edu>. [#40881]
+  * debian/postinst, debian/postrm: under protest, register gpg the
+    package with suidmanager and make it suid by default.
+    [#29780,#32590,#40391]
+
+ -- James Troup <james@nocrew.org>  Tue, 10 Aug 1999 00:12:40 +0100
+
+gnupg (0.9.10-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Fri,  6 Aug 1999 01:16:21 +0100
+
+gnupg (0.9.9-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Sun, 25 Jul 1999 01:06:31 +0100
+
+gnupg (0.9.8-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/rules (binary-arch): don't create a gpgm manpage as the binary
+    no longer exists.  Noticed by Wichert Akkerman
+    <wichert@cs.leidenuniv.nl>. [#38864]
+
+ -- James Troup <james@nocrew.org>  Sun, 27 Jun 1999 01:07:58 +0100
+
+gnupg (0.9.7-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Tue, 25 May 1999 13:23:24 +0100
+
+gnupg (0.9.6-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/copyright: update version number, noticed by Lazarus Long
+    <lazarus@frontiernet.net>.
+  * debian/control (Depends): depend on makedev (>= 2.3.1-13) to ensure
+    that /dev/urandom exists; reported by Steffen Markert
+    <smort@rz.tu-ilmenau.de>. [#32076]
+
+ -- James Troup <james@nocrew.org>  Tue, 11 May 1999 21:06:27 +0100
+
+gnupg (0.9.5-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control (Description): no tabs.  [Lintian]
+
+ -- James Troup <james@nocrew.org>  Wed, 24 Mar 1999 22:37:40 +0000
+
+gnupg (0.9.4-1) unstable; urgency=low
+
+  * New version.
+  * debian/control: s/GNUPG/GnuPG/
+
+ -- Werner Koch <wk@isil.d.suttle.de>  Mon, 8 Mar 1999 19:58:28 +0100
+
+gnupg (0.9.3-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Mon, 22 Feb 1999 22:55:04 +0000
+
+gnupg (0.9.2-1) unstable; urgency=low
+
+  * New version.
+  * debian/rules (build): Removed CFLAGS as the default is now sufficient.
+  * debian/rules (clean): remove special handling cleanup in intl.
+
+ -- Werner Koch <wk@isil.d.suttle.de>  Wed, 20 Jan 1999 21:23:11 +0100
+
+gnupg (0.9.1-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Sat,  9 Jan 1999 22:29:11 +0000
+
+gnupg (0.9.0-1) unstable; urgency=low
+
+  * New upstream version.
+  * g10/armor.c (armor_filter): add missing new line in comment string; as
+    noticed by Stainless Steel Rat <ratinox@peorth.gweep.net>.
+
+ -- James Troup <james@nocrew.org>  Tue, 29 Dec 1998 20:22:43 +0000
+
+gnupg (0.4.5-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/rules (clean): force removal of intl/libintl.h which the
+    Makefiles fail to remove properly.
+
+ -- James Troup <james@nocrew.org>  Tue,  8 Dec 1998 22:40:23 +0000
+
+gnupg (0.4.4-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Sat, 21 Nov 1998 01:34:29 +0000
+
+gnupg (0.4.3-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/README.Debian: new file; contains same information as is in the
+    preinst.  Suggested by Wichert Akkerman <wichert@cs.leidenuniv.nl>.
+  * debian/rules (binary-arch): install `README.Debian'
+  * debian/control (Standards-Version): updated to 2.5.0.0.
+
+ -- James Troup <james@nocrew.org>  Sun,  8 Nov 1998 19:08:12 +0000
+
+gnupg (0.4.2-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/preinst: improve message about the NEWS file which isn't
+    actually installed when it's referred to, thanks to Martin Mitchell
+    <martin@debian.org>.
+  * debian/rules (binary-arch): don't install the now non-existent `rfcs',
+    but do install `OpenPGP'.
+
+ -- James Troup <james@nocrew.org>  Sun, 18 Oct 1998 22:48:34 +0100
+
+gnupg (0.4.1-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/rules (binary-arch): fix the gpgm manpage symlink now installed
+    by `make install'.
+
+ -- James Troup <james@nocrew.org>  Sun, 11 Oct 1998 17:01:21 +0100
+
+gnupg (0.4.0-1) unstable; urgency=high
+
+  * New upstream version. [#26717]
+  * debian/copyright: tone down warning about alpha nature of gnupg.
+  * debian/copyright: new maintainer address.
+  * debian/control: update extended description.
+  * debian/rules (binary-arch): install FAQ and all ChangeLogs.
+  * debian/preinst: new; check for upgrade from (<= 0.3.2-1) and warn about
+    incompatibilities in keyring format and offer to move old copy out of
+    gpg out of the way for transition strategy and inform the user about
+    the old copies of gnupg available on my web page.
+  * debian/rules (binary-arch) install preinst.
+  * debian/rules (binary-arch): don't depend on the test target as it is
+    now partially interactive (tries to generate a key, which requires
+    someone else to be using the computer).
+
+ -- James Troup <james@nocrew.org>  Thu,  8 Oct 1998 00:47:07 +0100
+
+gnupg (0.3.2-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control (Maintainer): new address.
+  * debian/copyright: updated list of changes.
+
+ -- James Troup <james@nocrew.org>  Thu,  9 Jul 1998 21:06:07 +0200
+
+gnupg (0.3.1-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <james@nocrew.org>  Tue,  7 Jul 1998 00:26:21 +0200
+
+gnupg (0.3.0-2) unstable; urgency=low
+
+  * Applied bug-fix patch from Werner.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Fri, 26 Jun 1998 12:18:29 +0200
+
+gnupg (0.3.0-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control: rewrote short and long description.
+  * cipher/Makefile.am: link tiger with -lc.
+  * debian/rules (binary-arch): strip loadable modules.
+  * util/secmem.c (lock_pool): get rid of errant test code; fix from
+    Werner Koch <wk@isil.d.shuttle.de>.
+  * debian/rules (test): new target which runs gnupg's test suite.
+    binary-arch depends on it, to ensure it's run whenever the package is
+    built.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Thu, 25 Jun 1998 16:04:57 +0200
+
+gnupg (0.2.19-1) unstable; urgency=low
+
+  * New upstream version.
+  * debian/control: Updated long description.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Sat, 30 May 1998 12:12:35 +0200
+
+gnupg (0.2.18-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <J.J.Troup@comp.brad.ac.uk>  Sat, 16 May 1998 11:52:47 +0200
+
+gnupg (0.2.17-1) unstable; urgency=high
+
+  * New upstream version.
+  * debian/control (Standards-Version): updated to 2.4.1.0.
+  * debian/control: tone down warning about alpha nature of gnupg, as per
+    README.
+  * debian/copyright: ditto.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Mon,  4 May 1998 22:36:51 +0200
+
+gnupg (0.2.15-1) unstable; urgency=high
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Fri, 10 Apr 1998 01:12:20 +0100
+
+gnupg (0.2.13-1) unstable; urgency=high
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Wed, 11 Mar 1998 01:52:51 +0000
+
+gnupg (0.2.12-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Sat,  7 Mar 1998 13:52:40 +0000
+
+gnupg (0.2.11-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Wed,  4 Mar 1998 01:32:12 +0000
+
+gnupg (0.2.10-1) unstable; urgency=low
+
+  * New upstream version.
+  * Name changed upstream.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Mon,  2 Mar 1998 07:32:05 +0000
+
+g10 (0.2.7-1) unstable; urgency=low
+
+  * Initial release.
+
+ -- James Troup <jjtroup@comp.brad.ac.uk>  Fri, 20 Feb 1998 02:05:34 +0000
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..684d3e3
--- /dev/null
@@ -0,0 +1,64 @@
+Source: gnupg
+Section: utils
+Priority: important
+Maintainer: Rafal Krypa <r.krypa@samsung.com>
+X-Original-Maintainer: Sune Vuorela <debian@pusling.com>
+Standards-Version: 3.7.2.1
+Build-Depends: libz-dev, libbz2-dev, libreadline-dev, file, gettext, dpatch, dpkg-dev (>= 1.13.12)
+
+Package: gnupg
+Architecture: any
+Depends: ${shlibs:Depends}, gpgv
+Suggests: gnupg-doc, xloadimage
+Conflicts: gpg-rsa, gpg-rsaref, suidmanager (<< 0.50), gpg-idea (<= 2.2)
+Replaces: gpg-rsa, gpg-rsaref
+Provides: gpg-rsa, gpg-rsaref
+Description: GNU privacy guard - a free PGP replacement
+ GnuPG is GNU's tool for secure communication and data storage.
+ It can be used to encrypt data and to create digital signatures.
+ It includes an advanced key management facility and is compliant
+ with the proposed OpenPGP Internet standard as described in RFC2440.
+ .
+ GnuPG does not use any patented algorithms so it cannot be compatible
+ with PGP2 because it uses IDEA (which is patented worldwide).
+
+Package: gpgv
+Architecture: any
+Priority: important
+Depends: ${shlibs:Depends}
+Suggests: gnupg
+Replaces: gnupg (<< 1.4.5-2)
+Description: GNU privacy guard - signature verification tool
+ GnuPG is GNU's tool for secure communication and data storage.
+ .
+ gpgv is a stripped-down version of gnupg which is only able to check
+ signatures.  It is smaller than the full-blown gnupg and uses a
+ different (and simpler) way to check that the public keys used to
+ make the signature are trustworthy.
+
+Package: gnupg-udeb
+Section: debian-installer
+Priority: extra
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: GNU privacy guard - a free PGP replacement
+ GnuPG is GNU's tool for secure communication and data storage.
+ It can be used to encrypt data and to create digital signatures.
+ It includes an advanced key management facility and is compliant
+ with the proposed OpenPGP Internet standard as described in RFC2440.
+ .
+ This is GnuPG packaged in minimal form for use in debian-installer.
+
+Package: gpgv-udeb
+Section: debian-installer
+Priority: extra
+Architecture: any
+Depends: ${shlibs:Depends}
+Description: minimal signature verification tool
+ GnuPG is GNU's tool for secure communication and data storage.
+ It can be used to encrypt data and to create digital signatures.
+ It includes an advanced key management facility and is compliant
+ with the proposed OpenPGP Internet standard as described in RFC2440.
+ .
+ This is GnuPG's signature verification tool, gpgv, packaged in minimal
+ form for use in debian-installer.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..ddbbdc4
--- /dev/null
@@ -0,0 +1,40 @@
+This is Debian GNU's prepackaged version of GnuPG, a free PGP
+replacement.
+
+This package was put together by me, James Troup <james@nocrew.org>,
+from the sources, which I obtained from
+ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.6.tar.gz.  The changes were
+minimal, namely:
+
+- adding support for the Debian package maintenance scheme, by adding
+  various debian/* files.
+
+Program Copyright (C) 1998-2006 Free Software Foundation, Inc.
+Modifications for Debian Copyright (C) 1998-2006 James Troup.
+
+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 2, 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 with
+your Debian GNU system, in /usr/share/common-licenses/GPL, or with the
+Debian GNU gnupg source package as the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 
+Boston, MA 02110-1301, USA.
+
+In addition, as a special exception, the Free Software Foundation
+gives permission to link the code of the keyserver helper tools:
+gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL project's
+"OpenSSL" library (or with modified versions of it that use the same
+license as the "OpenSSL" library), and distribute the linked
+executables.  You must obey the GNU General Public License in all
+respects for all of the code used other than "OpenSSL".  If you modify
+this file, you may extend this exception to your version of the file,
+but you are not obligated to do so.  If you do not wish to do so,
+delete this exception statement from your version.
diff --git a/debian/gpg-convert-from-106.1 b/debian/gpg-convert-from-106.1
new file mode 100644 (file)
index 0000000..8d355e8
--- /dev/null
@@ -0,0 +1,21 @@
+.TH "gpg-convert-from-106" 1 "December 2005" 
+
+.SH NAME
+gpg-convert-from-106 \- converts your public keyring and trustdb from GnuPG
+1.0.6 to later formats.
+
+.SH SYNOPSIS
+.B gpg-convert-from-106
+
+
+.SH DESCRIPTION
+.B gpg-convert-from-106
+converts your public keyring and trustdb from GnuPG 1.0.6 or earlier to the
+1.0.7 and later format.
+
+.SH AUTHOR
+Copyright (C) 2002 Free Software Foundation, Inc. Please report bugs to
+<bug-gnupg@gnu.org>.
+
+This manpage was written by Francois Wendling <frwendling@free.fr>.
+
diff --git a/debian/gpgsplit.1 b/debian/gpgsplit.1
new file mode 100644 (file)
index 0000000..116ce89
--- /dev/null
@@ -0,0 +1,41 @@
+.TH "gpgsplit" 1 "December 2005" 
+
+.SH NAME
+gpgsplit \- Split an OpenPGP message into packets
+
+.SH SYNOPSIS
+.B gpgsplit 
+.RI [ OPTIONS ]
+.RI [ FILES ]
+
+.SH DESCRIPTION
+This manual page documents briefly the 
+.B gpgsplit
+command.
+.PP
+.B gpgsplit
+splits an OpenPGP message into packets.
+
+.SH OPTIONS
+.TP
+.BR \-v , \-\-verbose
+Verbose.
+.TP
+.BR \-p , "\-\-prefix " \fISTRING\fR
+Prepend filenames with \fISTRING\fR.
+.TP
+.B \-\-uncompress
+Uncompress a packet.
+.TP
+.B \-\-secret\-to\-public
+Convert secret keys to public keys.
+.TP
+.B \-\-no\-split
+Write to stdout and don't actually split.
+
+.SH AUTHOR
+Copyright (C) 2002 Free Software Foundation, Inc. Please report bugs to
+<bug-gnupg@gnu.org>.
+
+This manpage was written by Francois Wendling <frwendling@free.fr>.
+
diff --git a/debian/lspgpot.1 b/debian/lspgpot.1
new file mode 100644 (file)
index 0000000..ba27eca
--- /dev/null
@@ -0,0 +1,22 @@
+.TH "lspgpot" 1 "December 2005" 
+
+.SH NAME
+lspgpot - extracts the ownertrust values from PGP keyrings and list them in
+GnuPG ownertrust format.
+
+
+.SH SYNOPSIS
+.B lspgpot
+
+
+.SH DESCRIPTION
+.B lspgpot
+extracts the ownertrust values from PGP keyrings and list them in
+GnuPG ownertrust format.
+
+.SH AUTHOR
+Copyright (C) 2002 Free Software Foundation, Inc. Please report bugs to
+<bug-gnupg@gnu.org>.
+
+This manpage was written by Francois Wendling <frwendling@free.fr>.
+
diff --git a/debian/patches/00list b/debian/patches/00list
new file mode 100644 (file)
index 0000000..9ab4bda
--- /dev/null
@@ -0,0 +1,5 @@
+15_free_caps
+16_min_privileges
+24_gpgv_manpage_cleanup
+25_de.po_fixes
+28_multiple_message
diff --git a/debian/patches/15_free_caps.dpatch b/debian/patches/15_free_caps.dpatch
new file mode 100644 (file)
index 0000000..d48b2e1
--- /dev/null
@@ -0,0 +1,124 @@
+#! /bin/sh -e
+## 15_free_caps.dpatch by  <mpitt@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: cap_from_text() allocates a new capability context, which is not freed
+## DP: in the original sources. This patch fixes this.
+## DP: Please note that this approach alone is not safe: when using
+## DP: USE_CAPABILITIES the root user is not setuid() back any more to a normal
+## DP: user.
+
+if [ $# -lt 1 ]; then
+    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
+
+case "$1" in
+    -patch) patch -p1 ${patch_opts} < $0;;
+    -unpatch) patch -R -p1 ${patch_opts} < $0;;
+    *)
+        echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+        exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad /home/weasel/tmp/debian-gpg/gnupg-1.2.5/g10/status.c gnupg-1.2.5/g10/status.c
+--- /home/weasel/tmp/debian-gpg/gnupg-1.2.5/g10/status.c       2004-07-21 09:59:45.000000000 +0200
++++ gnupg-1.2.5/g10/status.c   2004-08-01 20:07:42.071690680 +0200
+@@ -346,6 +346,9 @@
+ {
+     char buf[100];
+     struct shmid_ds shmds;
++#ifdef USE_CAPABILITIES
++    cap_t caps;
++#endif
+ #ifndef IPC_RMID_DEFERRED_RELEASE
+     atexit( remove_shmid );
+@@ -371,7 +374,9 @@
+                           (unsigned)shm_size/1024, shm_area, shm_id );
+     if( lock_mem ) {
+ #ifdef USE_CAPABILITIES
+-      cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
++      caps = cap_from_text("cap_ipc_lock=ep");
++      cap_set_proc( caps );
++      cap_free( caps );
+ #endif
+       /* (need the cast for Solaris with Sun's workshop compilers) */
+       if ( mlock ( (char*)shm_area, shm_size) )
+@@ -380,7 +385,9 @@
+       else
+           shm_is_locked = 1;
+ #ifdef USE_CAPABILITIES
+-      cap_set_proc( cap_from_text("cap_ipc_lock+p") );
++      caps = cap_from_text("cap_ipc_lock=p");
++      cap_set_proc( caps );
++      cap_free( caps );
+ #endif
+     }
+@@ -407,7 +414,9 @@
+     if( lock_mem ) {
+ #ifdef USE_CAPABILITIES
+-      cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
++      caps = cap_from_text("cap_ipc_lock=ep");
++      cap_set_proc( caps );
++      cap_free( caps );
+ #endif
+ #ifdef IPC_HAVE_SHM_LOCK
+       if ( shmctl (shm_id, SHM_LOCK, 0) )
+@@ -419,7 +428,9 @@
+       log_info("Locking shared memory %d failed: No way to do it\n", shm_id );
+ #endif
+ #ifdef USE_CAPABILITIES
+-      cap_set_proc( cap_from_text("cap_ipc_lock+p") );
++      caps = cap_from_text("cap_ipc_lock=p");
++      cap_set_proc( caps );
++      cap_free( caps );
+ #endif
+     }
+diff -urNad /home/weasel/tmp/debian-gpg/gnupg-1.2.5/util/secmem.c gnupg-1.2.5/util/secmem.c
+--- /home/weasel/tmp/debian-gpg/gnupg-1.2.5/util/secmem.c      2004-02-24 17:06:58.000000000 +0100
++++ gnupg-1.2.5/util/secmem.c  2004-08-01 20:08:10.873412378 +0200
+@@ -97,12 +97,18 @@
+ {
+ #if defined(USE_CAPABILITIES) && defined(HAVE_MLOCK)
+     int err;
++    cap_t caps;
++
++    caps = cap_from_text("cap_ipc_lock=ep");
++    cap_set_proc( caps );
++    cap_free( caps );
+-    cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
+     err = mlock( p, n );
+     if( err && errno )
+       err = errno;
+-    cap_set_proc( cap_from_text("cap_ipc_lock+p") );
++    caps = cap_from_text("cap_ipc_lock=p");
++    cap_set_proc( caps );
++    cap_free( caps );
+     if( err ) {
+       if( errno != EPERM
+@@ -301,8 +307,12 @@
+     if( !n ) {
+ #ifndef __riscos__
+ #ifdef USE_CAPABILITIES
++      cap_t caps;
++
+       /* drop all capabilities */
+-      cap_set_proc( cap_from_text("all-eip") );
++      caps = cap_from_text("all-eip");
++      cap_set_proc( caps );
++      cap_free( caps );
+ #elif !defined(HAVE_DOSISH_SYSTEM)
+       uid_t uid;
diff --git a/debian/patches/16_min_privileges.dpatch b/debian/patches/16_min_privileges.dpatch
new file mode 100644 (file)
index 0000000..464133e
--- /dev/null
@@ -0,0 +1,98 @@
+#! /bin/sh -e
+## 16_min_privileges.dpatch by  <mpitt@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: when using USE_CAPABILITIES, the uid was not setuid() back to a normal
+## DP: user; this would allow to regain _all_ capabilities just by doing
+## DP: exec(). This patch ensures minimal privileges by immediately revoking
+## DP: root user and all capabilities except CAP_IPC_LOCK. After the shared
+## DP: memory is set up, this last capability is dropped as well.
+
+if [ $# -lt 1 ]; then
+    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
+
+case "$1" in
+    -patch) patch -p1 ${patch_opts} < $0;;
+    -unpatch) patch -R -p1 ${patch_opts} < $0;;
+    *)
+        echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+        exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad gnupg-1.4.0/g10/gpg.c /tmp/dpep.O5S02c/gnupg-1.4.0/g10/gpg.c
+--- gnupg-1.4.0/g10/gpg.c      2004-12-16 09:47:36.000000000 +0000
++++ /tmp/dpep.O5S02c/gnupg-1.4.0/g10/gpg.c     2005-02-03 23:31:40.645873299 +0000
+@@ -69,6 +69,11 @@
+ #endif
++#ifdef USE_CAPABILITIES
++#include <sys/capability.h>
++#include <sys/prctl.h>
++#endif
++
+ enum cmd_and_opt_values
+   {
+     aNull = 0,
+@@ -1618,6 +1623,10 @@
+ #ifdef USE_SHM_COPROCESSING
+     ulong requested_shm_size=0;
+ #endif
++#ifdef USE_CAPABILITIES
++    uid_t curr_uid;
++    cap_t caps;
++#endif
+ #ifdef __riscos__
+     opt.lock_once = 1;
+@@ -1629,6 +1638,33 @@
+      * when adding any stuff between here and the call to
+      * secmem_init()  somewhere after the option parsing
+      */
++
++    /* if we use capabilities and run as root, we can immediately setuid back
++     * to the normal user and only keep CAP_IPC_LOCK until the shared memory is
++     * set up.
++     */
++#ifdef USE_CAPABILITIES
++    curr_uid = getuid();
++    if( curr_uid && !geteuid() ) { /* we are setuid root */
++      if( prctl( PR_SET_KEEPCAPS, 1, 0, 0, 0 ) ) {
++          perror( "main(): could not keep capabilities" );
++          return -100;
++      }
++
++      if( setuid( curr_uid ) ) {
++          perror( "main(): could not set user id" );
++          return -100;
++      }
++
++      caps = cap_from_text( "cap_ipc_lock=p" );
++      if( cap_set_proc( caps ) ) {
++          perror( "main(): could not install capabilities" );
++          return -100;
++      }
++      cap_free( caps );
++    }
++#endif
++
+     log_set_name("gpg");
+     secure_random_alloc(); /* put random number into secure memory */
+     may_coredump = disable_core_dumps();
+@@ -1747,7 +1783,7 @@
+     }
+ #endif
+     /* initialize the secure memory. */
+-    got_secmem=secmem_init( 32768 );
++    got_secmem=secmem_init( 32768 ); /* this will drop all remaining privileges */
+     maybe_setuid = 0;
+     /* Okay, we are now working under our real uid */
diff --git a/debian/patches/24_gpgv_manpage_cleanup.dpatch b/debian/patches/24_gpgv_manpage_cleanup.dpatch
new file mode 100644 (file)
index 0000000..0284334
--- /dev/null
@@ -0,0 +1,85 @@
+#! /bin/sh -e
+## 24_gpgv_manpage_cleanup.dpatch
+##
+## DP: Description: Small fixes for gpgv manpage (#177951)
+## DP: Author: "Jim W. Jaszewski" <grok@sprint.ca>
+## DP: Upstream status: Not yet submitted
+## DP: Date: 2003-01-22
+
+if [ $# -lt 1 ]; then
+    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
+
+case "$1" in
+    -patch) patch -p1 ${patch_opts} < $0;;
+    -unpatch) patch -R -p1 ${patch_opts} < $0;;
+    *)
+        echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+        exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad gnupg-1.4.6~/doc/gpgv.texi gnupg-1.4.6/doc/gpgv.texi
+--- gnupg-1.4.6~/doc/gpgv.texi 2006-12-04 14:01:31.000000000 +0000
++++ gnupg-1.4.6/doc/gpgv.texi  2006-12-07 02:33:20.000000000 +0000
+@@ -55,8 +55,8 @@
+ @mansect description
+ @code{@gpgvname} is an OpenPGP signature verification tool.
+-This program is actually a stripped down version of @code{gpg} which is
+-only able to check signatures. It is somewhat smaller than the fully blown
++This program is actually a stripped-down version of @code{gpg} which is
++only able to check signatures. It is somewhat smaller than the fully-blown
+ @code{gpg} and uses a different (and simpler) way to check that
+ the public keys used to make the signature are valid. There are
+ no configuration files and only a few options are implemented.
+@@ -114,7 +114,7 @@
+ @mansect return value
+-The program returns 0 if everything was fine, 1 if at least
++The program returns 0 if everything is fine, 1 if at least
+ one signature was bad, and other error codes for fatal errors.
+ @mansect examples
+@@ -126,7 +126,7 @@
+ @itemx @gpgvname @code{sigfile} 
+ Verify the signature of the file. The second form
+ is used for detached signatures, where @code{sigfile} is the detached
+-signature (either ASCII armored or binary) and are the signed
++signature (either ASCII-armored or binary) and are the signed
+ data; if this is not given the name of the file holding the signed data is
+ constructed by cutting off the extension (".asc", ".sig" or ".sign") from
+ @code{sigfile}.
+@@ -152,7 +152,7 @@
+ @table @asis
+ @item ~/.gnupg/trustedkeys.gpg
+-The default keyring with the allowed keys
++The default keyring with the allowed keys.
+ @end table
+diff -urNad gnupg-1.4.6~/doc/opt-homedir.texi gnupg-1.4.6/doc/opt-homedir.texi
+--- gnupg-1.4.6~/doc/opt-homedir.texi  2006-12-04 13:31:56.000000000 +0000
++++ gnupg-1.4.6/doc/opt-homedir.texi   2006-12-07 02:32:48.000000000 +0000
+@@ -1,11 +1,11 @@
+ @c This option is included at several places.
+ @item --homedir @var{dir}
+ @opindex homedir
+-Set the name of the home directory to @var{dir}. If his option is not
++Set the name of the home directory to @var{dir}. If this option is not
+ used, the home directory defaults to @file{~/.gnupg}.  It is only
+ recognized when given on the command line.  It also overrides any home
+ directory stated through the environment variable @env{GNUPGHOME} or
+-(on W32 systems) by means on the Registry entry
++(on W32 systems) by means of the Registry entry
+ @ifset isman
+ @var{HKCU\\Software\\GNU\\GnuPG:HomeDir}.
+ @end ifset
diff --git a/debian/patches/25_de.po_fixes.dpatch b/debian/patches/25_de.po_fixes.dpatch
new file mode 100644 (file)
index 0000000..d83d59d
--- /dev/null
@@ -0,0 +1,195 @@
+#! /bin/sh -e
+## 25_de.po_fixes.dpatch
+##
+## DP: Description: Small fixes for the German translation (#314069)
+## DP: Author: Jens Seidel <jensseidel@users.sf.net>
+## DP: Upstream status: Not yet submitted
+## DP: Date: 2005-06-14
+
+if [ $# -lt 1 ]; then
+    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
+
+case "$1" in
+    -patch) patch -p1 ${patch_opts} < $0;;
+    -unpatch) patch -R -p1 ${patch_opts} < $0;;
+    *)
+        echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+        exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad gnupg-1.4.5~/po/de.po gnupg-1.4.5/po/de.po
+--- gnupg-1.4.5~/po/de.po      2006-08-01 12:08:06.000000000 +0100
++++ gnupg-1.4.5/po/de.po       2006-08-01 21:50:19.000000000 +0100
+@@ -1241,7 +1241,7 @@
+ #: g10/gpg.c:791
+ msgid "Pubkey: "
+-msgstr "Öff.Schlüssel: "
++msgstr "Öff. Schlüssel: "
+ #: g10/gpg.c:797 g10/keyedit.c:2310
+ msgid "Cipher: "
+@@ -2330,7 +2330,7 @@
+ #: g10/import.c:319
+ #, c-format
+ msgid " secret keys unchanged: %lu\n"
+-msgstr "                 unveränderte geh.Schl.: %lu\n"
++msgstr "                unveränderte geh. Schl.: %lu\n"
+ #: g10/import.c:321
+ #, c-format
+@@ -3388,11 +3388,11 @@
+ #: g10/keyedit.c:2035
+ msgid "Do you really want to revoke the selected subkeys? (y/N) "
+-msgstr "Möchten Sie die ausgewählten Unterschlüssel wirklich widerrufen? "
++msgstr "Möchten Sie die ausgewählten Unterschlüssel wirklich widerrufen? (j/N) "
+ #: g10/keyedit.c:2037
+ msgid "Do you really want to revoke this subkey? (y/N) "
+-msgstr "Möchten Sie diesen Schlüssel wirklich widerrufen? "
++msgstr "Möchten Sie diesen Unterschlüssel wirklich widerrufen? (j/N) "
+ #: g10/keyedit.c:2087
+ msgid ""
+@@ -3568,7 +3568,7 @@
+ #: g10/keyedit.c:3022
+ msgid "You may not add a photo ID to a PGP2-style key.\n"
+-msgstr "Sie können einem PGP2-artigen SchlüÂüsel keine Foto-ID hinzufügen.\n"
++msgstr "Sie können einem PGP2-artigen Schlüssel keine Foto-ID hinzufügen.\n"
+ #: g10/keyedit.c:3162
+ msgid "Delete this good signature? (y/N/q)"
+@@ -3622,7 +3622,7 @@
+ #: g10/keyedit.c:3352
+ msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+ msgstr ""
+-"Sie können einem PGP2-artigen SchlüÂüsel keine vorgesehenen Widerrufer "
++"Sie können einem PGP2-artigen Schlüssel keine vorgesehenen Widerrufer "
+ "hinzufügen.\n"
+ #: g10/keyedit.c:3372
+@@ -5034,7 +5034,7 @@
+ "Wählen Sie ein Bild für Ihre Photo ID aus. Das Bild muß eine JPEG Datei\n"
+ "sein.  Bitte beachten Sie, daß das Bild in Ihrem öffentlichen\n"
+ "Schlüssel gespeichert wird.  Wenn Sie ein sehr großes Bild benutzen,\n"
+-"wir Ihr Schlüssel leider auch sehr groß werden.  Ein Bild der GröÂße\n"
++"wir Ihr Schlüssel leider auch sehr groß werden.  Ein Bild der Größe\n"
+ "240x288 Pixel ist eine gute Wahl.\n"
+ #: g10/photoid.c:95
+@@ -5406,7 +5406,7 @@
+ #: g10/pubkey-enc.c:244
+ #, c-format
+ msgid "cipher algorithm %d%s is unknown or disabled\n"
+-msgstr "Verschüsselungsverfahren %d%s ist unbekannt oder abgeschaltet\n"
++msgstr "Verschlüsselungsverfahren %d%s ist unbekannt oder abgeschaltet\n"
+ #: g10/pubkey-enc.c:282
+ #, fuzzy, c-format
+@@ -5504,7 +5504,7 @@
+ msgstr ""
+ "Widerrufszertifikat wurde erzeugt.\n"
+ "\n"
+-"Bitte speichern Sie es auf einem Medium welches sie wegschliessen\n"
++"Bitte speichern Sie es auf einem Medium welches sie wegschließen\n"
+ "können; falls Mallory (ein Angreifer) Zugang zu diesem Zertifikat\n"
+ "erhält, kann erIhren Schlüssel unbrauchbar machen.  Es wäre klug,\n"
+ "dieses Widerrufszertifikat auch auszudrucken und sicher aufzubewahren,\n"
+@@ -5588,7 +5588,7 @@
+ msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+ msgstr ""
+ "Trotz %d-fachen Versuch konnte die Erzeugung eines unsicheren Schlüssels für "
+-"sym.Verschlüsselung nicht vermieden werden!\n"
++"sym. Verschlüsselung nicht vermieden werden!\n"
+ #: g10/seskey.c:222
+ msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+@@ -6133,7 +6133,7 @@
+ #, fuzzy, c-format
+ msgid "public key of ultimately trusted key %s not found\n"
+ msgstr ""
+-"öff.Schlüssel des uneingeschränkt vertrautem Schlüssel %08lX nicht gefunden\n"
++"öff. Schlüssel des uneingeschränkt vertrautem Schlüssel %08lX nicht gefunden\n"
+ #: g10/trustdb.c:2197
+ #, c-format
+@@ -6190,7 +6190,7 @@
+ #: util/errors.c:60
+ msgid "bad public key"
+-msgstr "Falscher öffentlicher Schüssel"
++msgstr "Falscher öffentlicher Schlüssel"
+ #: util/errors.c:61
+ msgid "bad secret key"
+@@ -6366,7 +6366,7 @@
+ #: util/errors.c:106
+ msgid "unusable public key"
+-msgstr "unbrauchbarer öffentlicher Schüssel"
++msgstr "unbrauchbarer öffentlicher Schlüssel"
+ #: util/errors.c:107
+ msgid "unusable secret key"
+@@ -6775,7 +6775,7 @@
+ #~ "Es wird ein neues %s Schlüsselpaar erzeugt.\n"
+ #~ "              kleinste Schlüssellänge ist  768 Bit\n"
+ #~ "              standard Schlüssellänge ist 1024 Bit\n"
+-#~ "      gröÂßte sinnvolle Schlüssellänge ist 2048 Bit\n"
++#~ "      größte sinnvolle Schlüssellänge ist 2048 Bit\n"
+ #~ msgid "DSA only allows keysizes from 512 to 1024\n"
+ #~ msgstr "DSA erlaubt nur Schlüssellängen von 512 bis 1024\n"
+@@ -6787,13 +6787,13 @@
+ #~ msgstr "zu kurz; 768 ist die kleinste mögliche Schlüssellänge.\n"
+ #~ msgid "keysize too large; %d is largest value allowed.\n"
+-#~ msgstr "SchüsselgröÂße zu hoch; %d ist der Maximalwert.\n"
++#~ msgstr "Schlüsselgröße zu hoch; %d ist der Maximalwert.\n"
+ #~ msgid ""
+ #~ "Keysizes larger than 2048 are not suggested because\n"
+ #~ "computations take REALLY long!\n"
+ #~ msgstr ""
+-#~ "Schlüssellängen gröÂßer als 2048 werden nicht empfohlen, da die\n"
++#~ "Schlüssellängen größer als 2048 werden nicht empfohlen, da die\n"
+ #~ "Berechnungen dann WIRKLICH lange brauchen!\n"
+ #, fuzzy
+@@ -7136,7 +7136,7 @@
+ #~ msgstr "zu viele `%c' Voreinstellungen\n"
+ #~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+-#~ msgstr "Schlüssel %08lX: dies ist kein RFC2440-Schüssel - übersprungen\n"
++#~ msgstr "Schlüssel %08lX: dies ist kein RFC2440-Schlüssel - übersprungen\n"
+ #~ msgid ""
+ #~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+@@ -7292,7 +7292,7 @@
+ #~ msgstr ""
+ #~ "Dieses Verfahren wird nur von GnuPG unterstützt.  Sie können diesen "
+ #~ "Schlüssel\n"
+-#~ "nicht zur Verständigung mit PGP-Anwendern benutzen.  Ausserdem ist "
++#~ "nicht zur Verständigung mit PGP-Anwendern benutzen.  Außerdem ist "
+ #~ "dieses\n"
+ #~ "Verfahren sehr langsam, und es könnte nicht so sicher wie die anderen "
+ #~ "sein.\n"
+@@ -7603,7 +7603,7 @@
+ #~ msgid "Do you really want to create a sign and encrypt key? "
+ #~ msgstr ""
+-#~ "Möchten Sie wirklich einen Unterschriften-/Verschlüsselungschlüssel "
++#~ "Möchten Sie wirklich einen Unterschriften-/Verschlüsselungsschlüssel "
+ #~ "erzeugen? "
+ #~ msgid "%s: user not found: %s\n"
diff --git a/debian/patches/28_multiple_message.dpatch b/debian/patches/28_multiple_message.dpatch
new file mode 100644 (file)
index 0000000..e882d48
--- /dev/null
@@ -0,0 +1,192 @@
+#! /bin/sh -e
+## 28_multiple_message.dpatch
+##
+## DP: Description: Fix problems handling multiple messages [CVE-2007-1263]
+## DP: Author: Werner Koch <wk@gnupg.org>
+## DP: Upstream status: part of 1.4.7
+## DP: Date: 2007-03-07
+
+if [ $# -lt 1 ]; then
+    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+    exit 1
+fi
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"
+
+case "$1" in
+    -patch) patch -p1 ${patch_opts} < $0;;
+    -unpatch) patch -R -p1 ${patch_opts} < $0;;
+    *)
+        echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
+        exit 1;;
+esac
+
+exit 0
+
+@DPATCH@
+diff -urNad gnupg-1.4.6~/checks/verify.test gnupg-1.4.6/checks/verify.test
+--- gnupg-1.4.6~/checks/verify.test    2006-03-07 10:28:24.000000000 +0000
++++ gnupg-1.4.6/checks/verify.test     2007-03-07 21:39:20.000000000 +0000
+@@ -231,15 +231,15 @@
+    eval "(IFS=; echo \"\$$i\")" >x
+    case "$i" in
+     msg_*_asc)
+-       $GPG --verify x || error "verify of $i failed"
++       $GPG --allow-multiple-messages --verify x || error "verify of $i failed"
+        ;;
+     msg_*_asc_multisig)
+-       $GPG --verify --allow-multisig-verification x \
++       $GPG --allow-multiple-messages --verify --allow-multisig-verification x \
+            || error "verify of $i failed"
+-       $GPG --verify x && error "verify of $i succeeded but should not"
++       $GPG --allow-multiple-messages --verify x && error "verify of $i succeeded but should not"
+        ;;
+     bad_*_asc)
+-       $GPG --verify x && error "verify of $i succeeded but should not"
++       $GPG --allow-multiple-messages --verify x && error "verify of $i succeeded but should not"
+        ;;
+     *)
+        error "No handler for test case $i"
+diff -urNad gnupg-1.4.6~/g10/gpg.c gnupg-1.4.6/g10/gpg.c
+--- gnupg-1.4.6~/g10/gpg.c     2007-03-07 21:38:57.000000000 +0000
++++ gnupg-1.4.6/g10/gpg.c      2007-03-07 21:39:20.000000000 +0000
+@@ -368,6 +368,8 @@
+     oAllowMultisigVerification,
+     oEnableDSA2,
+     oDisableDSA2,
++    oAllowMultipleMessages,
++    oNoAllowMultipleMessages,
+     oNoop
+   };
+@@ -711,6 +713,8 @@
+     { oAllowMultisigVerification, "allow-multisig-verification", 0, "@"},
+     { oEnableDSA2, "enable-dsa2", 0, "@"},
+     { oDisableDSA2, "disable-dsa2", 0, "@"},
++    { oAllowMultipleMessages, "allow-multiple-messages", 0, "@"},
++    { oNoAllowMultipleMessages, "no-allow-multiple-messages", 0, "@"},
+     /* These two are aliases to help users of the PGP command line
+        product use gpg with minimal pain.  Many commands are common
+@@ -2782,6 +2786,14 @@
+         case oEnableDSA2: opt.flags.dsa2=1; break;
+         case oDisableDSA2: opt.flags.dsa2=0; break;
++        case oAllowMultipleMessages:
++          opt.flags.allow_multiple_messages=1;
++          break;
++
++        case oNoAllowMultipleMessages:
++          opt.flags.allow_multiple_messages=0;
++          break;
++
+         case oNoop: break;
+         default : pargs.err = configfp? 1:2; break;
+diff -urNad gnupg-1.4.6~/g10/mainproc.c gnupg-1.4.6/g10/mainproc.c
+--- gnupg-1.4.6~/g10/mainproc.c        2006-04-08 01:51:28.000000000 +0100
++++ gnupg-1.4.6/g10/mainproc.c 2007-03-07 21:39:20.000000000 +0000
+@@ -84,10 +84,9 @@
+ static int do_proc_packets( CTX c, IOBUF a );
+-
+ static void list_node( CTX c, KBNODE node );
+ static void proc_tree( CTX c, KBNODE node );
+-
++static int literals_seen;
+ static void
+ release_list( CTX c )
+@@ -619,6 +618,8 @@
+     int any, clearsig, only_md5, rc;
+     KBNODE n;
++    literals_seen++;
++
+     if( pt->namelen == 8 && !memcmp( pt->name, "_CONSOLE", 8 ) )
+       log_info(_("NOTE: sender requested \"for-your-eyes-only\"\n"));
+     else if( opt.verbose )
+@@ -702,16 +703,37 @@
+       if ( c->mfx.md2  )
+           md_start_debug( c->mfx.md2, "verify2" );
+     }
+-    if ( c->pipemode.op == 'B' )
+-        rc = handle_plaintext( pt, &c->mfx, 1, 0 );
+-    else {
+-        rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
+-        if( rc == G10ERR_CREATE_FILE && !c->sigs_only) {
+-            /* can't write output but we hash it anyway to
+-             * check the signature */
+-            rc = handle_plaintext( pt, &c->mfx, 1, clearsig );
+-        }
+-    }
++
++    rc=0;
++
++    if(literals_seen>1)
++      {
++      log_info(_("WARNING: multiple plaintexts seen\n"));
++
++      if(!opt.flags.allow_multiple_messages)
++        {
++            write_status_text (STATUS_ERROR, "proc_pkt.plaintext 89_BAD_DATA");
++          log_inc_errorcount();
++          rc=G10ERR_UNEXPECTED;
++        }
++      }
++
++    if(!rc)
++      {
++      if ( c->pipemode.op == 'B' )
++        rc = handle_plaintext( pt, &c->mfx, 1, 0 );
++      else
++        {
++          rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
++          if( rc == G10ERR_CREATE_FILE && !c->sigs_only)
++            {
++              /* can't write output but we hash it anyway to
++               * check the signature */
++              rc = handle_plaintext( pt, &c->mfx, 1, clearsig );
++            }
++        }
++      }
++
+     if( rc )
+       log_error( "handle plaintext failed: %s\n", g10_errstr(rc));
+     free_packet(pkt);
+diff -urNad gnupg-1.4.6~/g10/options.h gnupg-1.4.6/g10/options.h
+--- gnupg-1.4.6~/g10/options.h 2006-12-03 15:37:45.000000000 +0000
++++ gnupg-1.4.6/g10/options.h  2007-03-07 21:39:20.000000000 +0000
+@@ -226,6 +226,7 @@
+     unsigned int use_embedded_filename:1;
+     unsigned int utf8_filename:1;
+     unsigned int dsa2:1;
++    unsigned int allow_multiple_messages:1;
+   } flags;
+   /* Linked list of ways to find a key if the key isn't on the local
+diff -urNad gnupg-1.4.6~/g10/status.c gnupg-1.4.6/g10/status.c
+--- gnupg-1.4.6~/g10/status.c  2007-03-07 21:38:57.000000000 +0000
++++ gnupg-1.4.6/g10/status.c   2007-03-07 21:39:20.000000000 +0000
+@@ -166,6 +166,7 @@
+     case STATUS_PKA_TRUST_BAD  : s = "PKA_TRUST_BAD"; break;
+     case STATUS_PKA_TRUST_GOOD : s = "PKA_TRUST_GOOD"; break;
+     case STATUS_BEGIN_SIGNING  : s = "BEGIN_SIGNING"; break;
++    case STATUS_ERROR          : s = "ERROR"; break;
+     default: s = "?"; break;
+     }
+   return s;
+diff -urNad gnupg-1.4.6~/g10/status.h gnupg-1.4.6/g10/status.h
+--- gnupg-1.4.6~/g10/status.h  2006-04-03 09:05:24.000000000 +0100
++++ gnupg-1.4.6/g10/status.h   2007-03-07 21:39:20.000000000 +0000
+@@ -120,6 +120,8 @@
+ #define STATUS_BEGIN_SIGNING    84
++#define STATUS_ERROR  85
++
+ /*-- status.c --*/
+ void set_status_fd ( int fd );
diff --git a/debian/preinst b/debian/preinst
new file mode 100644 (file)
index 0000000..71dab99
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+
+set -e
+
+case "$1" in
+    upgrade|install)
+       # Try to gracefully handle upgrades from a pre-0.3.3 version
+
+       if [ ! -z $2 ]; then
+           set +e
+           dpkg --compare-versions $2 \<= 0.3.2-1
+           result=$?
+           set -e
+           if [ $result = 0 ]; then
+               cat <<EOF
+Due to a bug in the way secret keys were encrypted in versions prior
+to 0.3.3, this version of gnupg is not backwards compatible with $2
+which you have (had) installed on your system.  
+
+There is an upgrade strategy (see /usr/doc/gnupg/NEWS.gz after this
+version is installed), but it requires an old copy of the gpg and gpgm
+EOF
+               echo -n "binaries; shall I make copies of them for you (Y/n)? "
+               read answer
+               if [ ! "$answer" = "n" ] && [ ! "$answer" = "N" ]; then
+                   cp /usr/bin/gpg /usr/bin/gpg.old
+                   cp /usr/bin/gpgm /usr/bin/gpgm.old
+                   echo "Okay, done.  The old versions are /usr/bin/gpg*.old"
+               else
+                   echo "Okay, I haven't made backups."
+               fi;     
+               cat <<EOF
+
+If at any stage you need a pre-0.3.3 gnupg, you can find source and
+binaries for i386, m68k, alpha, powerpc and hurd-i386 at 
+
+   http://people.debian.org/~troup/gnupg/
+
+Press return to continue
+EOF
+               read foo
+           fi;
+       fi;
+       ;;
+    abort-upgrade)
+       ;;
+esac
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..d3dcacb
--- /dev/null
@@ -0,0 +1,184 @@
+#!/usr/bin/make -f
+# debian/rules file - for GNUPG (1.4.6)
+# Based on sample debian/rules file - for GNU Hello (1.3).
+# Copyright 1994,1995 by Ian Jackson.
+# Copyright 1998-2006 by James Troup.
+# I hereby give you perpetual unlimited permission to copy,
+# modify and relicense this file, provided that you do not remove
+# my name from the file itself.  (I assert my moral right of
+# paternity under the Copyright, Designs and Patents Act 1988.)
+# This file may have to be extensively modified
+
+DISTRIBUTION := SLP
+STRIP=strip --remove-section=.comment --remove-section=.note
+
+DEB_BUILD_GNU_TYPE = $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+DEB_HOST_GNU_TYPE = $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
+HOSTARG = --host=$(DEB_HOST_GNU_TYPE)
+endif
+
+CONFARGS = --prefix=/usr --libexecdir=/usr/lib/ --enable-mailto --with-mailprog=/usr/sbin/sendmail
+
+install_dir=install -d -m 755
+install_file=install -m 644
+install_script=install -m 755
+install_binary=install -m 755 -s
+
+VERSION := $(shell dpkg-parsechangelog | grep ^Version: | cut -d' ' -f2)
+DEB_BUILD_ARCH := $(shell dpkg-architecture -qDEB_BUILD_ARCH)
+
+include /usr/share/dpatch/dpatch.make
+
+build-deb-stamp: patch-stamp
+       $(checkdir)
+       mkdir -p build-deb
+       cd build-deb && ../configure $(CONFARGS) $(HOSTARG) --with-libcurl=no --with-libusb=no
+       $(MAKE) -C build-deb
+       touch $@
+
+build-udeb-stamp: patch-stamp
+       $(checkdir)
+       mkdir -p build-udeb
+       cd build-udeb && CFLAGS='-g -Os' ../configure $(CONFARGS) $(HOSTARG) --without-bzip2 --without-readline --with-libcurl=no --with-libusb=no
+       $(MAKE) -C build-udeb
+       touch $@
+
+build: build-deb-stamp build-udeb-stamp
+
+test: build
+       $(checkdir)
+       make -C build-deb/checks check || exit 127
+       touch test
+
+clean: unpatch
+       $(checkdir)
+       -rm -f build
+       -$(MAKE) -C build-deb -i distclean || $(MAKE) -C build-deb -f Makefile.in distclean
+       -$(MAKE) -C build-udeb -i distclean || $(MAKE) -C build-udeb -f Makefile.in distclean
+       -rm -rf build-deb build-udeb debian/gpgv-udeb debian/gnupg-udeb debian/gpgv
+       -rm -rf debian/tmp debian/patched debian/files* debian/*substvars
+       find . -name \*~ | xargs rm -vf
+
+binary-indep:
+
+binary-arch:   checkroot build # test
+       $(checkdir)
+
+       : # gnupg
+       -rm -rf debian/tmp
+       $(install_dir) debian/tmp/DEBIAN/
+       $(install_script) debian/preinst debian/tmp/DEBIAN/
+       $(MAKE) -C build-deb prefix=`pwd`/debian/tmp/usr mandir=`pwd`/debian/tmp/usr/share/man libexecdir=`pwd`/debian/tmp/usr/lib/ mkinstalldirs=`pwd`/scripts/mkinstalldirs install
+       : # copies of the manpage which can't be grokked by install-info
+       rm debian/tmp/usr/share/info/*
+       find debian/tmp/ -type f | xargs file | grep ELF | cut -d: -f 1 | xargs $(STRIP)
+       chmod 755 debian/tmp/usr/bin/gpg
+       sed -e "s#../g10/gpg#gpg#" < tools/lspgpot > debian/tmp/usr/bin/lspgpot
+       sed -e "s#../g10/gpg#gpg#" < tools/convert-from-106 > debian/tmp/usr/bin/gpg-convert-from-106
+       chmod 755 debian/tmp/usr/bin/lspgpot debian/tmp/usr/bin/gpg-convert-from-106
+       sed -e "s#/usr/local/#/usr/#" < debian/tmp/usr/share/man/man1/gpg.1 \
+           > debian/tmp/usr/share/man/man1/gpg.1.new
+       mv debian/tmp/usr/share/man/man1/gpg.1.new debian/tmp/usr/share/man/man1/gpg.1
+       $(install_file) debian/gpg-convert-from-106.1 debian/gpgsplit.1 \
+                       debian/lspgpot.1 debian/tmp/usr/share/man/man1/
+       gzip -9v debian/tmp/usr/share/man/man*/*
+       : # Move localized manpages to FHS compliant locations
+       $(install_dir) debian/tmp/usr/share/man/ru/man1/
+       mv debian/tmp/usr/share/man/man1/gpg.ru.1.gz debian/tmp/usr/share/man/ru/man1/gpg.1.gz
+       : # Remove from /usr/share/gnupg what we install into /usr/share/doc/gnupg/
+       rm debian/tmp/usr/share/gnupg/FAQ debian/tmp/usr/share/gnupg/faq.html
+       $(install_dir) debian/tmp/usr/share/doc/gnupg/
+       $(install_file) debian/changelog debian/tmp/usr/share/doc/gnupg/changelog.Debian
+       $(install_file) debian/README.Debian README NEWS THANKS TODO doc/DETAILS \
+               doc/FAQ doc/faq.html doc/OpenPGP debian/Upgrading_From_PGP.txt \
+               doc/highlights-1.4.txt debian/tmp/usr/share/doc/gnupg/
+       for i in po util mpi cipher tools g10 checks include; do \
+               $(install_file) $$i/ChangeLog debian/tmp/usr/share/doc/gnupg/changelog.$$i; done
+       $(install_file) ChangeLog debian/tmp/usr/share/doc/gnupg/changelog.toplevel
+       gzip -9v debian/tmp/usr/share/doc/gnupg/*
+       ln -s changelog.g10.gz debian/tmp/usr/share/doc/gnupg/changelog.gz
+       $(install_file) debian/copyright debian/tmp/usr/share/doc/gnupg/
+
+       : # in the gpgv package instead
+       rm debian/tmp/usr/bin/gpgv
+       rm debian/tmp/usr/share/man/man1/gpgv.1.gz
+
+       find debian/tmp/ -type d -empty | xargs rmdir
+
+       find debian/tmp/ -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps
+       dpkg-gencontrol -pgnupg -isp
+       chown -R root.root debian/tmp
+       chmod -R go=rX debian/tmp
+       dpkg --build debian/tmp ..
+
+       : # gpgv
+       -rm -rf debian/gpgv
+       $(install_dir) debian/gpgv/DEBIAN/ 
+
+       $(install_dir) debian/gpgv/usr/bin/
+       $(install_binary) build-udeb/g10/gpgv debian/gpgv/usr/bin/
+       $(STRIP) debian/gpgv/usr/bin/gpgv
+
+       $(install_dir) debian/gpgv/usr/share/man/man1/
+       $(install_file) build-deb/doc/gpgv.1 debian/gpgv/usr/share/man/man1/
+       gzip -9v debian/gpgv/usr/share/man/man*/*
+
+       $(install_dir) debian/gpgv/usr/share/doc/gpgv
+       $(install_file) debian/changelog debian/gpgv/usr/share/doc/gpgv/changelog.Debian
+       gzip -9v debian/gpgv/usr/share/doc/gpgv/*
+       $(install_file) debian/copyright debian/gpgv/usr/share/doc/gpgv/
+
+       find debian/gpgv/ -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps
+       dpkg-gencontrol -pgpgv -Pdebian/gpgv -isp
+       chown -R root.root debian/gpgv
+       chmod -R go=rX debian/gpgv
+       dpkg --build debian/gpgv ..
+
+ifneq ($(DISTRIBUTION),SLP)
+       : ### Udebs
+
+       : # gpgv-udeb
+       rm -rf debian/gpgv-udeb
+       $(install_dir) debian/gpgv-udeb/DEBIAN/ debian/gpgv-udeb/usr/bin/
+       $(install_binary) build-udeb/g10/gpgv debian/gpgv-udeb/usr/bin/
+       find debian/gpgv-udeb/ -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps -Tdebian/gpgv-udeb.substvars -tudeb
+
+       : # Don't let dpkg-gencontrol write incorrect guesses to debian/files.
+       : # Instead, register the udeb manually.
+       dpkg-gencontrol -pgpgv-udeb -Tdebian/gpgv-udeb.substvars -Pdebian/gpgv-udeb -isp -fdebian/files~
+       dpkg-distaddfile gpgv-udeb_$(VERSION)_$(DEB_BUILD_ARCH).udeb debian-installer extra
+
+       chown -R root.root debian/gpgv-udeb
+       chmod -R go=rX debian/gpgv-udeb
+       dpkg --build debian/gpgv-udeb ../gpgv-udeb_$(VERSION)_$(DEB_BUILD_ARCH).udeb
+
+       : # gnupg-udeb
+       rm -rf debian/gnupg-udeb
+       $(install_dir) debian/gnupg-udeb/DEBIAN/ debian/gnupg-udeb/usr/bin/
+       $(install_binary) build-udeb/g10/gpg debian/gnupg-udeb/usr/bin/
+       find debian/gnupg-udeb/ -type f | xargs file | grep ELF | cut -d: -f 1 | xargs dpkg-shlibdeps -Tdebian/gnupg-udeb.substvars -tudeb
+
+       : # Don't let dpkg-gencontrol write incorrect guesses to debian/files.
+       : # Instead, register the udeb manually.
+       dpkg-gencontrol -pgnupg-udeb -Tdebian/gnupg-udeb.substvars -Pdebian/gnupg-udeb -isp -fdebian/files~
+       dpkg-distaddfile gnupg-udeb_$(VERSION)_$(DEB_BUILD_ARCH).udeb debian-installer extra
+
+       chown -R root.root debian/gnupg-udeb
+       chmod -R go=rX debian/gnupg-udeb
+       dpkg --build debian/gnupg-udeb ../gnupg-udeb_$(VERSION)_$(DEB_BUILD_ARCH).udeb
+endif
+
+define checkdir
+       test -f g10/gpg.c && test -f debian/rules
+endef
+
+# Below here is fairly generic really
+
+binary:        binary-indep binary-arch
+
+checkroot:
+       $(checkdir)
+       test root = "`whoami`"
+
+.PHONY: build binary binary-arch binary-indep clean checkroot
diff --git a/doc/ChangeLog b/doc/ChangeLog
new file mode 100644 (file)
index 0000000..2807b4e
--- /dev/null
@@ -0,0 +1,1115 @@
+2006-12-04  Werner Koch  <wk@g10code.com>
+
+       * yat2m.c: New.
+       * Makefile.am: New rules to build yatm and the man pages.
+
+2006-06-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --enable-dsa2, --disable-dsa2, and
+       --default-keyserver-url.
+
+       * DETAILS: Note "Keyserver:"
+
+       * gpg.sgml: Note that --pgp8 does not include SHA224.  Clarify
+       that clearsigned messages are not reversible.
+
+2006-05-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * mksamplekeys: Incorporate new package signature key and minimize
+       keys when generating samplekeys.asc.
+
+2006-05-17  Werner Koch  <wk@g10code.com>
+
+       * samplekeys.asc: Added new package signature key and cleaned all
+       keys to save space.
+
+2006-04-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Reminders that --cipher-algo, --digest-algo, and
+       --compress-algo should be avoided.
+
+2006-04-11  Michael Roth <mroth@nessie.de>  (wk)
+
+       * gpg.sgml (passphrase-fd): Explain that only the first line is used.
+
+2006-04-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Some typo fixes.  This is Debian 361324.
+
+2006-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * samplekeys.asc: Update 99242560 to have a signing subkey
+       backsig.
+
+2006-03-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify new notation delete feature.
+
+2006-03-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document "notation".
+
+2006-03-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Rename backsigs to cross-certification (backsigs is
+       just shorthand).  Document max-cert-size.
+
+       * gpg.sgml: Document new way of enabling the PKA functions.  Some
+       minor other cleanups.
+
+2006-03-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --auto-key-locate.
+
+2006-02-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document new --keyserver syntax.
+
+2005-12-20  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml (trust-model): Document "auto" and the "pka" variants.
+       (keyserver-options): Document "auto-pka-retrieve".
+       (allow-pka-lookup): Document.
+
+2005-12-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --fetch-keys.
+
+2005-12-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document -d.  Add [file] to a few options.
+
+2005-11-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify "xxxxx-clean" and "clean".  Document
+       "xxxxx-minimal", and "minimize".
+
+2005-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify what is and isn't included in a "clean sigs".
+
+2005-10-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document backsign, --require-backsigs, and
+       --no-require-backsigs.
+
+       * DETAILS: Clarify Key-Usage.
+
+2005-10-07  Werner Koch  <wk@g10code.com>
+
+       * gpgv.sgml: Small spelling corrections by Mike Dowling.
+
+2005-09-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note that --display-charset is just for display and
+       doesn't recode data.  Note that --search-keys can use the standard
+       search syntax now (<, =, *, @).  Document the @-address mode.
+
+2005-08-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Fix documentation for setpref/updpref, document
+       import-clean, --status-file, --logger-file, --attribute-file,
+       --passphrase-file, --passphrase, and --command-file.  Comment out
+       the "+word match" selection syntax since it isn't supported.
+
+2005-07-22  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml: Removed entry for --no-interactive-selection.
+
+2005-07-19  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml: Document --limit-card-insert-tries.
+
+2005-07-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * samplekeys.asc: Update 99242560.
+
+       * gpg.sgml: Clarify --throw-keyid and --hidden-recipient a bit.
+
+2005-06-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --edit-key/clean, import-clean, and
+       export-clean.
+
+2005-06-20  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml: Document smartcard related options.
+
+2005-06-06  Werner Koch  <wk@g10code.com>
+
+       * DETAILS: New subcode 5 for CARDCTRL.
+
+2005-05-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --default-sig-expire and
+       --default-cert-expire, remove --sk-comments and --no-sk-comments,
+       and clarify the form of a non-IETF notation for --sig-notation and
+       --cert-notation.
+
+2005-05-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify --min-cert-level a bit.
+
+2005-03-14  Werner Koch  <wk@g10code.com>
+
+       * gnupg-w32.reg: Removed.
+
+2005-03-07  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml (comment): Add note to keep the comment short.
+
+       * DETAILS: Document new status codes.
+
+2005-02-15  Werner Koch  <wk@g10code.com>
+
+       * faq.raw: Add htmlcharset header line as suggested by Maxim
+       Britov. s/ElGamal/Elgamal/.  Replaced reference to NAI by PGP
+       Corp.
+
+       * gpg.ru.sgml: Updated from upstream.  Added a closing PARA.
+       
+       * gpg.sgml: Add bkuptocard command for --edit-key.
+
+2005-02-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note that level 0 signatures are always accepted
+       regardless of --min-cert-level.
+
+2005-02-03  Werner Koch  <wk@g10code.com>
+
+       * README.W32: Updated to match the switch to the NSIS installer.
+
+2005-01-27  Werner Koch  <wk@g10code.com>
+
+       * faq.raw: Updated to the version from 1.2.7.
+
+2005-01-18  Werner Koch  <wk@g10code.com>
+
+       * gnupg-w32.reg: Remove the entry for the home directory.
+
+2004-12-16  Werner Koch  <wk@g10code.com>
+
+       * TRANSLATE: Add a note on how to send translations.
+
+2004-12-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --require-secmem/--no-require-secmem.  Note
+       that the sign flags (l, t, nr) can be mixed.  Remove --nrsign-key.
+
+2004-12-12  Werner Koch  <wk@g10code.com>
+
+       * samplekeys.asc, mksamplekeys (keys): Removed my old 621CC013 key
+       which expires at the end of this year.  Add g10 Code's source code
+       signing key 37D92FFB.
+
+2004-12-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * highlights-1.4.txt: New.
+
+       * mksamplekeys, samplekeys.asc: Add the PGP global directory key.
+
+2004-11-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document export-minimal.
+
+2004-10-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document SIG_SUBPACKET status tag.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (EXTRA_DIST): Add gpg.ru.1.
+
+2004-10-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Minor language tweaks.
+
+       * samplekeys.asc: Updated 99242560.
+
+       * DETAILS: spk flags are hex.
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * DETAILS: Document IMPORT_CHECK.
+
+2004-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document using "none" to remove preferred keyservers,
+       the keyserver timeout parameter, and the direct trust model.
+
+2004-09-23  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml: Document "addcardkey" and "keytocard".
+
+2004-09-20  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml: Document -K.
+
+2004-09-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document the 'spk' signature subpacket record.  Add
+       more detail on "tru" records.
+
+       * gpg.sgml: Note that PGP scales photo IDs to fit in the dialog
+       box.  Document show-sig-subpackets.  Document the '%c' signature
+       counter expando.
+
+2004-09-15  Werner Koch  <wk@g10code.com>
+
+       * gpg.sgml: Document "--debug-ccid-driver".
+
+2004-09-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note that --throw-keyid is --throw-keyids.  Note
+       changes in --pgp8.  Rephrase the "don't play algorithm games"
+       warning now that PGP has blowfish, zlib, and bzip2.
+
+2004-08-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Remove show-long-keyids since it is replaced by
+       --keyid-format.  Rename show-validity as
+       show-uid-validity. --ask-cert-level defaults to no.
+
+2004-06-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document PLAINTEXT and PLAINTEXT_LENGTH.
+
+       * gpg.sgml: Clarify that --min-cert-level disregards level 1 certs
+       by default.  Clarify include-revoked a bit to note that keyservers
+       might not be accurate.  Note that --charset is --display-charset.
+       Some language tweaks for --simple-sk-checksum (Debian 251795).
+       Note the PGP silliness with preferred keyserver subpackets causing
+       PGP/MIME.
+
+2004-05-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --edit-key "keyserver" command,
+       --keyid-format, --keyserver-option honor-keyserver-url, and --list
+       and --verify option show-std/user-notations.
+
+2004-05-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify that --charset applies to informational
+       strings and does not recode messages themselves.  Remove
+       include-non-rfc export-option.
+
+2004-05-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS, credits-1.0, credits-1.2: ElGamal -> Elgamal.
+
+       * gpg.sgml: Document --no-use-embedded-filename and
+       --min-cert-level.
+
+       * gpgv.sgml: Removed leftover </para>.
+
+2004-05-03  Werner Koch  <wk@gnupg.org>
+
+       * gpgv.sgml: Removed reference to non-available option
+       --no-default-keyring.
+
+2004-04-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document delsig.  Clarify that --refresh-keys
+       arguments are optional.  Document --bzip2-decompress-lowmem.
+
+2004-04-05  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS (NEWSIG): Documented.
+
+2004-02-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --ask-cert-level, --max-output, and
+       --default-cert-level.
+
+       * gpg.sgml: Document keyserver-option http-proxy, import-option
+       merge-only, remove old honor-http-proxy, --merge-only, and
+       --emulate-md-encode-bug.  Document COLUMNS and LINES.
+
+2004-02-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.7: Clarify that 'gpgv' doesn't encrypt, and that's not a
+       bug.
+
+       * samplekeys.asc: Update 99242560.
+
+       * gpg.sgml: Clarify -u/--local-user and --default-key.  Note what
+       happens if you run 'gpg' without any commands.  Document
+       --multifile.  Document list-option show-unusable-subkeys.
+
+2004-01-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Details for --list-config.
+
+       * gpg.sgml: Document --ungroup and --list-config.
+
+2004-01-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Fix a few minor typos.  Clarify what --textmode is
+       useful for.
+
+       * gpg.sgml: List proper documentation URL.  Note that addrevoker
+       takes an optional "sensitive" argument.  Remind that $GNUPGHOME
+       can be used instead of --homedir.  Clarify --no-default-keyring,
+       and note why it may not take effect if there are no other keyrings
+       present.  Remove --pgp2 from the list of --pgpXes that are just
+       for bad preference lists.  Explain more why locking memory pages
+       is good.
+
+       * gpg.sgml: Add an example of what an exclamation mark is, as
+       people seem to miss it often.
+
+2003-12-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Fix a few missing semicolons in & entities.  Noted by
+       Christian Biere.  Some minor grammar fixes.  Remove the "host -l
+       pgp.net | grep wwwkeys" advice since the nameserver no longer all
+       allow zone transfers.  Replace it with a mention of
+       hkp://subkeys.pgp.net.  Note that BZIP2 defaults to compression
+       level 6.
+
+2003-10-31  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: Add a note about the date format for X.509.
+
+2003-11-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note the new combinations with --symmetric and
+       --encrypt.  Document --bzip2-compress-level, and
+       --bzip2-compress-lowmem.  Clarify the plurarility (or not) of
+       various list and verify options.  Document BZIP2 in the
+       --compress-algo section.  Warn about compatibility issues with
+       ZLIB and BZIP2.
+
+2003-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --compress-level.  Some minor tweaks to other
+       entries.
+
+       * TRANSLATE: New, note to translators about the yes|yes multiple
+       match syntax.
+
+       * Makefile.am: Include TRANSLATE in distributed files.
+
+2003-10-28  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: Add the 'a' value for field 12 and the new field 15.
+
+2003-10-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * samplekeys.asc: Update 99242560.
+
+       * gpg.sgml: Document --no-groups.
+
+2003-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note web bug like behavior of auto-key-retrieve.  Note
+       that big photos mean big keys.  Document --rfc2440.  Document
+       verify-option show-unusable-uids.
+
+       * gpg.sgml: Clarify --mangle-dos-filenames, document list-option
+       show-unusable-uids, remove --no-comment (which is now
+       --no-sk-comments), add --no-comments (to remove --comment), remove
+       --default-comment, and document --sig-keyserver-url.
+
+2003-09-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Note fingerprint of signing key in sig records.
+
+2003-08-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Use "keyserver-url" instead of "preferred-keyserver"
+       for the sake of short and simple commands.
+
+2003-08-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document list-options (show-preferred-keyserver,
+       show-validity, show-long-keyid, and show-sig-expire), and
+       verify-options (show-preferred-keyserver, show-validity,
+       show-long-keyid).
+
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * samplekeys.asc: Updated.
+
+       * DETAILS: Document "tru" trust record.  Document REVKEYSIG status
+       tag.  Removed paragraph on gdbm usage.  Note that pipemode is
+       deprecated.
+
+2003-08-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --list-options (show-photos, show-policy-url,
+       show-notation, show-keyring) and --verify-options (show-photos,
+       show-policy-url, show-notation).  Deprecate --show-photos,
+       --show-policy-url, --show-notation, and --show-keyring.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document the --attribute-fd data.
+
+       * gpg.sgml: Document --set-notation.  Explain why it is not
+       possible to disable permission warnings in the gpg.conf file about
+       the homedir.  Add pointer in --ignore-time-conflict to see
+       --ignore-valid from, and vice versa.  Warning not to try and parse
+       --list-keys in scripts. Document the signature flags
+       (1-3/L/R/P/N/X/T), Document expandos %g and %p.  Note the default
+       --personal-digest-preferences are SHA-1.
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml, gpgv.sgml: Small SGML fixes. (From wk on stable
+       branch)
+
+       * gnupg-w32.reg: Use HLM for the program and make sure the entries
+       are created.  Suggested by danielc@analysisandsolutions.com. (From
+       wk on stable branch)
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --trustdb-name.  Document --gnupg in a new
+       compliance section, and remove the various --no-PGPX
+       options. Deprecate --no-comment in favor of --no-sk-comments.
+
+2003-05-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Some general language tweaks.  Note default algo for
+       --symmetric.  --export-ownertrust takes no args.  Document
+       --no-escape-from-lines.  Fix escaped "<From" to be ">From".  Make
+       "openpgp" trust model into "pgp".
+
+2003-04-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS (VALIDSIG): Add version, pk algo, digest algo, sig
+       class, and a reserved field for flags in a future version.
+
+       * gpg.sgml: Document --no-textmode and --no-use-agent.  Clarify
+       the interoperability section.  Clarify that "hkp corruption"
+       (repair-hkp-subkey-bug) is really "pks corruption"
+       (repair-pks-subkey-bug).
+
+2003-04-15  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Document --enable-progress-filter.
+
+2003-04-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Don't specify which hash is used to make up the
+       namehash since it may change in the future.
+
+       * samplekeys.asc: Updated.
+
+       * gpg.sgml: Document "revuid".  Clarify that --openpgp resets
+       --pgpX.  Some cleanup of --no-xxx options, make sure that all SGML
+       tags are closed, clarify --pgp8 allows SHA-256, and document
+       --no-emit-version.
+
+       * Makefile.am: Allow CVS version to build without faqprog.pl.
+
+2003-04-01  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS (VALIDSIG): Add primary keys fingerprint. 
+
+2003-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document trust depth, value, and regexp.
+
+2003-01-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Minor language tweaks, spell check, copyright date,
+       etc.
+
+       * DETAILS: Note that user IDs/UATs fill in creation and expiration
+       date.  Document namehash.
+
+2003-01-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document disabled flag in capabilities field.
+
+2002-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify --no-permission-warning to note that the
+       permission warnings are not intended to be the be-all and end-all
+       in security checks.  Add note to --group that when used on the
+       command line, it may be necessary to quote the argument so it is
+       not treated as multiple arguments.  Noted by Stefan Bellon.
+
+2002-12-23  Werner Koch  <wk@gnupg.org>
+
+       * samplekeys.asc: Updated.
+
+2002-12-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify include-revoked and include-disabled so they
+       match what the program actually does.  Noted by Dick Gevers.
+
+       * gpg.sgml: Document %-expandos for policy URLs and notations.
+
+       * gpg.sgml: Document --pgp8.  Clarify that --pgp6 and --pgp7
+       disable --throw-keyid.
+
+2002-12-05  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Document --no-mangle-dos-filenames.
+
+2002-12-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Point out that if the user absolutely must, it's
+       better to use --pgpX than forcing an algorithm manually.  Better
+       still not to use anything, of course.
+
+2002-11-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --primary-keyring.  Clarify
+       --s2k-cipher-algo, --s2k-digest-algo,
+       --personal-cipher-preferences, --personal-digest-preferences, and
+       --personal-compress-preferences.
+
+       * gpg.sgml: Document --sig-policy-url, --cert-policy-url,
+       --sig-notation, --cert-notation.  Clarify --show-notation and
+       --show-policy-url that policy URLs and notations can be used in
+       data signatures as well.  Add note about '@' being a required
+       character in notation names.
+
+2002-11-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Add an interoperability section.
+
+2002-11-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Correct defaults for --s2k-mode and --s2k-digest-mode.
+       Noted by Haakon Riiser.
+
+2002-11-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: --compress-algo now allows algorithm names.
+
+2002-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --trust-model.
+
+2002-11-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * KEYSERVER: New.  Documents the --with-colons format for
+       keyserver listings.
+
+       * DETAILS: Clarify meaning of 'u'.  Noted by Timo.
+
+2002-11-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document "tsign", clarify "setpref", clarify
+       --recipient, document --hidden-recipient, document
+       --hidden-encrypt-to, clarify --no-encrypt-to, clarify
+       --throw-keyid, document --no-throw-keyid.
+
+2002-10-25  Werner Koch  <wk@gnupg.org>
+
+        * README.W32: Add blurb on how to create a ZIP file, changed
+        requirement for mingw32 to 0.3.2.
+
+2002-10-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document --refresh-keys.
+
+2002-10-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify --force-mdc, and document --disable-mdc.
+
+2002-10-12  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS (KEY_CREATED): Enhanced by fingerprint.
+
+2002-10-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note that '#' means secret-key-unavailable, and that
+       keyserver schemes are case-insensitive.
+
+2002-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Note that --pgp2 disables --textmode when encrypting.
+
+2002-09-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Some minor language cleanup.
+
+2002-09-20  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: s/XORed/ORed/.
+
+2002-09-15  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Add rebuild-keydb-caches.
+
+2002-09-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Fix batch key generation example.
+
+2002-09-11  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (EXTRA_DIST): Include gnupg-32.reg
+
+2002-09-02  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Updated the charset option.
+
+       * DETAILS: Added status IMPORT_OK.
+
+       * gnupg.7: New mini man page.
+
+2002-08-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Document keyserver-option include-subkeys.  Note that
+       honor-http-proxy is a keyserver-option now.
+
+       * DETAILS: Add "Key not trusted" to INV_RECP status code.
+
+2002-08-23  Werner Koch  <wk@gnupg.org>
+
+       * faq.raw: Updated.  New Maintainer is David D. Scribner.
+
+2002-08-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify meaning of keyserver option include-revoked.
+
+2002-08-21  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: Added IMPORT_PROBLEM.
+
+2002-08-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Clarify that trust letters 'q' and '-' can be treated
+       identically.
+
+       * gpg.sgml: Document --ignore-mdc-error.
+
+2002-08-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify that only long-form options can go in the
+       config file.
+
+2002-08-06  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Fixed doc regarding the name change of the option
+       file.
+
+2002-07-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify --edit/addrevoker (sensitive), and
+       --keyserver-options (--import/export-options may be used as well).
+       Document --import-options and --export-options with their various
+       options.  --show-photos now works during signature verification as
+       well.  Document --exec-path.  Note in --simple-sk-checksum that
+       the passphrase must be changed for this to take effect.  Note that
+       --pgp7 does not disable MDC.  Document --no-mdc-warning.
+
+2002-07-25  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Document new --delete behaviour.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify the differences between "pref" and "showpref".
+       Note in "setpref" that a list of available algorithms can be
+       printed with "gpg -v --version".  Note in "updpref" that we don't
+       select keys via attribute uids, so preferences there will be
+       ignored.
+
+2002-07-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Clarify "group".
+
+2002-07-01  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Due to problems with VPATH builds we don't try to
+       build the texi vesions of the manual pages anymore automatically.
+
+2002-06-30  Werner Koch  <wk@gnupg.org>
+
+       * README.W32: Adjusted some descriptions.  Fixed the regsitry
+       entry descriptions.
+
+2002-06-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Document "uat".
+
+       * gpg.sgml: Document
+       --personal-{compress|digest|compress}-preferences, --group, and
+       add comments to --expert.
+
+2002-06-17  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Grammar fix.
+
+2002-06-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * DETAILS: Details of ATTRIBUTE.
+
+       * gpg.sgml: Document --attribute-fd
+
+2002-06-03  Timo Schulz  <ts@winpt.org>
+
+       * DETAILS: Add ATTRIBUTE.
+       
+2002-05-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Add "edit/addrevoker".  Document --desig-revoke.  Note
+       that -z and --compress are the same option.  Note that
+       --digest-algo can no longer violate OpenPGP with a non-160 bit
+       hash with DSA.  Document --cert-digest-algo with suitable warnings
+       not to use it.  Note the default s2k-cipher-algo is now CAST5.
+       Note that --force-v3-sigs overrides --ask-sig-expire.  Revise
+       --expert documentation, as it is now definitely legal to have more
+       than one photo ID on a key.  --preference-list is now
+       --default-preference-list with the new meaning.  Document
+       --personal-preference-list.
+
+       * DETAILS: Document "Revoker" for batch key generation.
+
+2002-05-22  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: sgml syntax fix.
+
+2002-05-12  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Fixed URL in the description section.
+
+       * faq.raw: Minor typo fixes noted by kromJx@myrealbox.com.
+
+2002-05-11  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Typo fix.
+
+2002-05-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Add entries for --sk-comments, --no-sk-comments,
+       --pgp7, and --no-pgp7.  Fix --pgp2 and --pgp6: the proper name is
+       --escape-from-lines and not --escape-from.
+
+2002-04-30  Timo Schulz  <ts@winpt.org>
+
+       * gpg.sgml: Add an entry for --encrypt-files and --decrypt-files.
+       
+2002-04-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Fix minor error in --pgp6 documentation: it does not
+       imply --digest-algo MD5
+
+2002-04-29  Werner Koch  <wk@gnupg.org>
+
+       * samplekeys.asc: Added gnupg distribution key 57548DCD.
+
+       * faq.raw: Inserted Douglas Calvert as new maintainer. Acknowledge
+       Nils.  Add entry about trust packet parsing problems.
+
+2002-04-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Add some documentation for
+       --edit/{addphoto|showphoto|nrsign|nrlsign}, and the difference
+       between %t and %T in photo viewer command lines.
+
+2002-04-23  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpg.sgml: Moved options from section "COMMANDS" to
+       section "OPTIONS".
+
+2002-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * samplekeys.asc: Added 0x5B0358A2
+
+2002-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Add "%t" flag for photo IDs, a note about primary
+       having different meanings for photo and regular IDs, rename
+       --default-check-level to --default-cert-check-level, add
+       --auto-check-trustdb, and --pgp6.
+
+       * DETAILS: Add EXPSIG, EXPKEYSIG, and KEYEXPIRED.  Add notes to
+       SIGEXPIRED (deprecated), and VALIDSIG (added expiration date).
+       Add "Preferences" command to unattended key generation
+       instructions.  Also fixed a few typos.
+       * samplekeys.asc: new (added to EXTRA_DIST in Makefile.am as well)
+
+2002-01-31  Marcus Brinkmann  <marcus@g10code.de>
+
+       * DETAILS: Fix a spelling error, correct IMPORTED_RES to IMPORT_RES,
+       correct INV_RECP (the second occurence) to NO_RECP.
+
+2002-04-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: auto-key-retrieve is a keyserver-option (noted by
+       Roger Sondermann).
+       
+2002-03-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: --pgp2 also means --disable-mdc, --no-ask-sig-expire,
+       and --no-ask-cert-expire.  It does not mean --no-force-v3-sigs
+       (noted by Timo).
+
+2002-03-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Add a few notes about --pgp2 meaning MIT PGP 2.6.2,
+       and keyserver details about HKP and NAI HKP.
+
+2002-03-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Change meaning of --allow-non-selfsigned-uid to match
+       change in code, and add --no-allow-non-selfsigned-uid.
+
+2002-03-13  Werner Koch  <wk@gnupg.org>
+
+       * faq.raw: Due to a lack of time Nils can't serve anymore as a
+       maintainer.  Removed his address and setup a generic address.
+
+2002-03-06  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Add an entry for --export-ownertrust.  Suggested by
+       Bernhard Reiter.
+
+2002-01-26  Timo Schulz  <ts@winpt.org>
+
+       * gnupg-w32.reg: New. Registry file for W32 in registry format.
+       
+2002-01-26  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: A few words about --gpg-agent-info and GPG_AGENT_INFO.
+
+2002-01-25  Timo Schulz  <ts@winpt.org>
+
+       * README.W32: Modify the filename because now the .exe extension
+       is automatically added to the binary.
+       
+2002-01-14  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Talk about PGP 5 and higher.
+
+2002-01-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Added documentation for --{no-}ask-cert-expire,
+       --{no-}ask-sig-expire, and revise --expert (it doesn't switch on
+       the expiration prompt anymore) and --default-check-level (to be
+       clearer as to what makes a good key check before signing).
+
+2002-01-07  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: Removed the comment that unattended key generation is
+       experimental.  It is now a standard feature.
+
+2001-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.sgml: Fixed a few typos.
+
+       * gpg.sgml: Added documentation for --show-photos,
+       --no-show-photos, --photo-viewer, --nrsign-key,
+       --default-check-level, --search-keys, --keyserver-options,
+       --show-notation, --no-show-notation, --show-policy-url,
+       --no-show-policy-url, --for-your-eyes-only,
+       --no-for-your-eyes-only, --pgp2, --no-pgp2,
+       --no-permission-warning, --expert, --no-expert.
+
+2001-10-31  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Add a remark on how to get the long key ID.  Suggested
+       by Sebastian Klemke.
+
+2001-10-23  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Add missing tag.
+
+2001-09-28  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Add a note on option parsing.
+
+2001-09-24  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Described --{update,check}-trustdb.
+
+2001-09-03  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml, gpgv.sgml: Removed GDBM stuff.
+
+2001-08-29  Werner Koch  <wk@gnupg.org>
+
+       * faq.raw: Described how to delete a secret key w/o a public key
+       and changed the entry on updating the preferences.
+
+2001-08-08  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Documented --print-mds and marked the --print-md * as
+       deprecated because it does not work in the W32 version.  Suggested
+       by John Kane.
+       (WARNINGS): Typo fix.
+       (--with-colons): Clarified that the output is in UTF-8.
+
+2001-08-01  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Added --ignore-valid-from
+
+2001-04-20  Werner Koch  <wk@gnupg.org>
+
+       * faq.raw (Maintained-by): Removed note that load-extension is not
+       available under Windoze.
+
+       * gpg.sgml: Add new --charset UTF-8.
+
+2001-04-19  Werner Koch  <wk@gnupg.org>
+
+       * faq.raw: Add a note about dates displayed as ????-??-??.
+
+2001-04-17  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (%.texi): Add rules to create .texi from .sgml.
+       However we can't automate this because automake does not like
+       .texi files as BUILT_SOURCES.
+       (%.dvi,%.ps): Removed these rules, because they are not needed
+       and get in the way of automake's dvi target
+
+       * HACKING: Changed CVS description.
+
+2001-04-06  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Small typo fixes by Florian Weimer.
+
+2001-03-27  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Add --no-sig-cache and --no-sig-create-check.
+
+2001-03-23  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: New status UNEXPECTED.
+
+2001-03-13  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Described --fixed-list-mode.
+
+2001-03-06  Werner Koch  <wk@gnupg.org>
+
+       * gpgv.sgml: Changed some gpg to gpgv. Thanks to John A. Murdie.
+
+2001-03-03  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Tell something about the 0x12345678! key ID syntax.
+
+2001-01-18  Werner Koch  <wk@gnupg.org>
+
+       * README.W32: Changed building instructions for MinGW32/CPD 0.3 
+
+2001-01-09  Werner Koch  <wk@gnupg.org>
+
+       * DETAILS: Fixed docs for NEED_PASSPHRASE and added USERID_HINT.
+
+2000-11-30  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Fixed the description of --verify.  Add a short note
+       the warnings sections.
+
+2000-10-19  Werner Koch  <wk@gnupg.org>
+
+       * gpg.sgml: Fixed doc for --allow-non-selfsigned-uid.
+       Add entry for --ignore-crc-error.
+
+2000-10-18  Werner Koch  <wk@gnupg.org>
+
+       * OpenPGP: Dropped the paragraph that RSA is not implemented.
+
+2000-10-14  Werner Koch  <wk@gnupg.org>
+
+       * faq.raw: Add an answer to the problem of multiple signatures.
+
+Wed Oct  4 15:50:18 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * gpgv.sgml: New.
+        * Makefile.am: build it.
+
+Thu Sep 14 14:20:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * faq.raw: New.
+        * Makefile.am: Support to build FAQs
+
+Wed Jul 12 13:32:06 CEST 2000  Werner Koch  <wk@>
+
+        * gpg.sgml: Add a note about the availability of the GPH.
+
+2000-07-03 13:59:24  Werner Koch  (wk@habibti.openit.de)
+
+        * DETAILS, FAQ: Typo fixes by Yosiaki IIDA.
+
+2000-05-12 10:57:21  Werner Koch  (wk@habibti.openit.de)
+
+       * gpg.sgml: Documented --no-tty.
+
+2000-03-09 15:01:51  Werner Koch  (wk@habibti.openit.de)
+
+       * DETAILS: Ad a short blurb about unattended key generation.
+
+Wed Feb  9 15:33:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * gpg.sgml: Describe --ignore-time-conflict.
+
+       * gpg.sgml: Fixed a few typos.  Thanks to Holger Trapp.
+
+Wed Jan  5 11:51:17 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * FAQ: Enhanced answer for the 3des-s2k bug.
+
+Sat Dec  4 12:30:28 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * gpg.sgml: Add section about the user ID
+
+Mon Nov 22 11:14:53 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * gph: Removed the directory from the dist becuase it will
+       go into it's own package.
+
+Thu Sep 23 09:52:58 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * README.W32: New.
+
+Mon Sep  6 19:59:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * Makefile.am (SUBDIRS): New subdir gph for the manual.
+
+Thu Jul 22 20:03:03 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * gpg.sgml (--always-trust): Added.
+
+Wed Jul 14 19:42:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * Makefile.am: Create a dummy man page if docbook-to-man is missing.
+
+Wed Jun 16 20:16:21 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * gpg1.pod: Removed.
+       * gpg.sgml: New. Replaces the pod file
+       * Makefile.am: Add rule to make a man file from sgml
+
+Tue Jun 15 12:21:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * Makefile.in.in: Use DESTDIR.
+
+Mon May 31 19:41:10 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * gpg.1pod: Enhanced the Bugs section (Michael).
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * gpg.1pod: Spelling and grammar corrections (John A. Martin)
+       * FAQ: Ditto.
+       * DETAILS: Ditto.
+
+
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
+
diff --git a/doc/DETAILS b/doc/DETAILS
new file mode 100644 (file)
index 0000000..986b908
--- /dev/null
@@ -0,0 +1,1253 @@
+                                                              -*- text -*-
+
+NOTE: The definitive reference is the file from the SVN trunk.
+
+Format of colon listings
+========================
+First an example:
+
+$ gpg --fixed-list-mode --with-colons --list-keys \
+   --with-fingerprint --with-fingerprint wk@gnupg.org
+
+pub:f:1024:17:6C7EE1B8621CC013:899817715:1055898235::m:::scESC:
+fpr:::::::::ECAF7590EB3443B5C7CF3ACB6C7EE1B8621CC013:
+uid:f::::::::Werner Koch <wk@g10code.com>:
+uid:f::::::::Werner Koch <wk@gnupg.org>:
+sub:f:1536:16:06AD222CADF6A6E1:919537416:1036177416:::::e:
+fpr:::::::::CF8BCC4B18DE08FCD8A1615906AD222CADF6A6E1:
+sub:r:1536:20:5CE086B5B5A18FF4:899817788:1025961788:::::esc:
+fpr:::::::::AB059359A3B81F410FCFF97F5CE086B5B5A18FF4:
+
+The double --with-fingerprint prints the fingerprint for the subkeys
+too, --fixed-list-mode is themodern listing way printing dates in
+seconds since Epoch and does not merge the first userID with the pub
+record.
+
+
+ 1. Field:  Type of record
+           pub = public key
+            crt = X.509 certificate
+            crs = X.509 certificate and private key available
+           sub = subkey (secondary key)
+           sec = secret key
+           ssb = secret subkey (secondary key)
+           uid = user id (only field 10 is used).
+           uat = user attribute (same as user id except for field 10).
+            sig = signature
+            rev = revocation signature
+           fpr = fingerprint: (fingerprint is in field 10)
+           pkd = public key data (special field format, see below)
+            grp = reserved for gpgsm
+            rvk = revocation key
+            tru = trust database information
+            spk = signature subpacket
+
+ 2. Field:  A letter describing the calculated trust. This is a single
+           letter, but be prepared that additional information may follow
+           in some future versions. (not used for secret keys)
+               o = Unknown (this key is new to the system)
+                i = The key is invalid (e.g. due to a missing self-signature)
+               d = The key has been disabled
+                   (deprecated - use the 'D' in field 12 instead)
+               r = The key has been revoked
+               e = The key has expired
+               - = Unknown trust (i.e. no value assigned)
+               q = Undefined trust
+                   '-' and 'q' may safely be treated as the same
+                   value for most purposes
+               n = Don't trust this key at all
+               m = There is marginal trust in this key
+               f = The key is fully trusted
+               u = The key is ultimately trusted.  This often means
+                   that the secret key is available, but any key may
+                   be marked as ultimately trusted.
+ 3. Field:  length of key in bits.
+ 4. Field:  Algorithm: 1 = RSA
+                      16 = Elgamal (encrypt only)
+                      17 = DSA (sometimes called DH, sign only)
+                      20 = Elgamal (sign and encrypt - don't use them!)
+           (for other id's see include/cipher.h)
+ 5. Field:  KeyID
+ 6. Field:  Creation Date (in UTC).  For UID and UAT records, this is the
+            self-signature date.  Note that the dae is usally printed
+            in seconds since epoch, however, we are migrating to an ISO
+            8601 format (e.g. "19660205T091500").  This is currently
+            only relevant for X.509, A simple way to detect the format
+            is be scannning for the 'T'.
+ 7. Field:  Key or user ID/user attribute expiration date or empty if none.
+ 8. Field:  Used for serial number in crt records (used to be the Local-ID).
+            For UID and UAT records, this is a hash of the user ID contents
+            used to represent that exact user ID.  For trust signatures,
+            this is the trust depth seperated by the trust value by a
+            space.
+ 9. Field:  Ownertrust (primary public keys only)
+           This is a single letter, but be prepared that additional
+           information may follow in some future versions.  For trust
+           signatures with a regular expression, this is the regular
+           expression value, quoted as in field 10.
+10. Field:  User-ID.  The value is quoted like a C string to avoid
+           control characters (the colon is quoted "\x3a").
+            This is not used with --fixed-list-mode in gpg.
+            A UAT record puts the attribute subpacket count here, a
+           space, and then the total attribute subpacket size.
+            In gpgsm the issuer name comes here
+            An FPR record stores the fingerprint here.
+            The fingerprint of an revocation key is stored here.
+11. Field:  Signature class.  This is a 2 digit hexnumber followed by
+            either the letter 'x' for an exportable signature or the
+            letter 'l' for a local-only signature.
+            The class byte of an revocation key is also given here,
+            'x' and 'l' ist used the same way.
+12. Field:  Key capabilities:
+                e = encrypt
+                s = sign
+                c = certify
+                a = authentication
+           A key may have any combination of them in any order.  In
+           addition to these letters, the primary key has uppercase
+           versions of the letters to denote the _usable_
+           capabilities of the entire key, and a potential letter 'D'
+           to indicate a disabled key.
+13. Field:  Used in FPR records for S/MIME keys to store the fingerprint of
+            the issuer certificate.  This is useful to build the
+            certificate path based on certificates stored in the local
+            keyDB; it is only filled if the issue certificate is
+            available. The advantage of using this value is that it is
+            guaranteed to have been been build by the same lookup
+            algorithm as gpgsm uses.
+            For "uid" recods this lists the preferences n the sameway the 
+            -edit menu does.
+           For "sig" records, this is the fingerprint of the key that
+           issued the signature.  Note that this is only filled in if
+           the signature verified correctly.  Note also that for
+           various technical reasons, this fingerprint is only
+           available if --no-sig-cache is used.
+
+14. Field   Flag field used in the --edit menu output:
+
+15. Field   Used in sec/sbb to print the serial number of a token
+            (internal protect mode 1002) or a '#' if that key is a
+            simple stub (internal protect mode 1001)
+
+All dates are displayed in the format yyyy-mm-dd unless you use the
+option --fixed-list-mode in which case they are displayed as seconds
+since Epoch.  More fields may be added later, so parsers should be
+prepared for this. When parsing a number the parser should stop at the
+first non-number character so that additional information can later be
+added.
+
+If field 1 has the tag "pkd", a listing looks like this:
+pkd:0:1024:B665B1435F4C2 .... FF26ABB:
+    !  !   !-- the value
+    !  !------ for information number of bits in the value
+    !--------- index (eg. DSA goes from 0 to 3: p,q,g,y)
+
+
+The "tru" trust database records have the fields:
+
+ 2: Reason for staleness of trust.  If this field is empty, then the
+    trustdb is not stale.  This field may have multiple flags in it:
+
+    o: Trustdb is old
+    t: Trustdb was built with a different trust model than the one we
+       are using now.
+
+ 3: Trust model:
+    0: Classic trust model, as used in PGP 2.x.
+    1: PGP trust model, as used in PGP 6 and later.  This is the same
+       as the classic trust model, except for the addition of trust
+       signatures.
+
+    GnuPG before version 1.4 used the classic trust model by default.
+    GnuPG 1.4 and later uses the PGP trust model by default.
+
+ 4: Date trustdb was created in seconds since 1/1/1970.
+ 5: Date trustdb will expire in seconds since 1/1/1970.
+
+The "spk" signature subpacket records have the fields:
+
+ 2: Subpacket number as per RFC-2440 and later.
+ 3: Flags in hex.  Currently the only two bits assigned are 1, to
+    indicate that the subpacket came from the hashed part of the
+    signature, and 2, to indicate the subpacket was marked critical.
+ 4: Length of the subpacket.  Note that this is the length of the
+    subpacket, and not the length of field 5 below.  Due to the need
+    for %-encoding, the length of field 5 may be up to 3x this value.
+ 5: The subpacket data.  Printable ASCII is shown as ASCII, but other
+    values are rendered as %XX where XX is the hex value for the byte.
+
+
+Format of the "--status-fd" output
+==================================
+Every line is prefixed with "[GNUPG:] ", followed by a keyword with
+the type of the status line and a some arguments depending on the
+type (maybe none); an application should always be prepared to see
+more arguments in future versions.
+
+
+    NEWSIG
+        May be issued right before a signature verification starts.  This
+        is useful to define a context for parsing ERROR status
+        messages.  No arguments are currently defined.
+
+    GOODSIG    <long keyid>  <username>
+       The signature with the keyid is good.  For each signature only
+        one of the three codes GOODSIG, BADSIG or ERRSIG will be
+        emitted and they may be used as a marker for a new signature.
+        The username is the primary one encoded in UTF-8 and %XX
+        escaped.
+
+    EXPSIG     <long keyid>  <username>
+       The signature with the keyid is good, but the signature is
+       expired. The username is the primary one encoded in UTF-8 and
+       %XX escaped.
+
+    EXPKEYSIG  <long keyid>  <username>
+       The signature with the keyid is good, but the signature was
+       made by an expired key. The username is the primary one
+       encoded in UTF-8 and %XX escaped.
+
+    REVKEYSIG  <long keyid>  <username>
+       The signature with the keyid is good, but the signature was
+       made by a revoked key. The username is the primary one
+       encoded in UTF-8 and %XX escaped.
+
+    BADSIG     <long keyid>  <username>
+       The signature with the keyid has not been verified okay.
+        The username is the primary one encoded in UTF-8 and %XX
+        escaped.
+
+    ERRSIG  <long keyid>  <pubkey_algo> <hash_algo> \
+           <sig_class> <timestamp> <rc>
+       It was not possible to check the signature.  This may be
+       caused by a missing public key or an unsupported algorithm.
+       A RC of 4 indicates unknown algorithm, a 9 indicates a missing
+       public key. The other fields give more information about
+       this signature.  sig_class is a 2 byte hex-value.
+
+        Note, that TIMESTAMP may either be a number with seconds since
+        epoch or an ISO 8601 string which can be detected by the
+        presence of the letter 'T' inside.
+
+    VALIDSIG   <fingerprint in hex> <sig_creation_date> <sig-timestamp>
+               <expire-timestamp> <sig-version> <reserved> <pubkey-algo>
+               <hash-algo> <sig-class> <primary-key-fpr>
+
+       The signature with the keyid is good. This is the same as
+       GOODSIG but has the fingerprint as the argument. Both status
+       lines are emitted for a good signature.  All arguments here
+       are on one long line.  sig-timestamp is the signature creation
+       time in seconds after the epoch. expire-timestamp is the
+       signature expiration time in seconds after the epoch (zero
+       means "does not expire"). sig-version, pubkey-algo, hash-algo,
+       and sig-class (a 2-byte hex value) are all straight from the
+       signature packet.  PRIMARY-KEY-FPR is the fingerprint of the
+       primary key or identical to the first argument.  This is
+       useful to get back to the primary key without running gpg
+       again for this purpose.
+
+        Note, that *-TIMESTAMP may either be a number with seconds
+        since epoch or an ISO 8601 string which can be detected by the
+        presence of the letter 'T' inside.
+
+    SIG_ID  <radix64_string>  <sig_creation_date>  <sig-timestamp>
+       This is emitted only for signatures of class 0 or 1 which
+       have been verified okay.  The string is a signature id
+       and may be used in applications to detect replay attacks
+       of signed messages.  Note that only DLP algorithms give
+       unique ids - others may yield duplicated ones when they
+       have been created in the same second.
+
+        Note, that SIG-TIMESTAMP may either be a number with seconds
+        since epoch or an ISO 8601 string which can be detected by the
+        presence of the letter 'T' inside.
+
+
+    ENC_TO  <long keyid>  <keytype>  <keylength>
+       The message is encrypted to this keyid.
+       keytype is the numerical value of the public key algorithm,
+       keylength is the length of the key or 0 if it is not known
+       (which is currently always the case).
+
+    NODATA  <what>
+       No data has been found. Codes for what are:
+           1 - No armored data.
+           2 - Expected a packet but did not found one.
+           3 - Invalid packet found, this may indicate a non OpenPGP
+                message.
+            4 - signature expected but not found
+       You may see more than one of these status lines.
+
+    UNEXPECTED <what>
+        Unexpected data has been encountered
+            0 - not further specified               1       
+  
+
+    TRUST_UNDEFINED <error token>
+    TRUST_NEVER  <error token>
+    TRUST_MARGINAL
+    TRUST_FULLY
+    TRUST_ULTIMATE
+       For good signatures one of these status lines are emitted
+       to indicate how trustworthy the signature is.  The error token
+        values are currently only emiited by gpgsm.
+
+    PKA_TRUST_GOOD <mailbox>
+    PKA_TRUST_BAD  <mailbox>
+        Depending on the outcome of the PKA check one of the above
+        status codes is emitted in addition to a TRUST_* status.
+        Without PKA info available or 
+
+    SIGEXPIRED
+       This is deprecated in favor of KEYEXPIRED.
+
+    KEYEXPIRED <expire-timestamp>
+       The key has expired.  expire-timestamp is the expiration time
+       in seconds after the epoch.
+
+        Note, that TIMESTAMP may either be a number with seconds since
+        epoch or an ISO 8601 string which can be detected by the
+        presence of the letter 'T' inside.
+
+    KEYREVOKED
+       The used key has been revoked by its owner.  No arguments yet.
+
+    BADARMOR
+       The ASCII armor is corrupted.  No arguments yet.
+
+    RSA_OR_IDEA
+       The IDEA algorithms has been used in the data.  A
+       program might want to fallback to another program to handle
+       the data if GnuPG failed.  This status message used to be emitted
+        also for RSA but this has been dropped after the RSA patent expired.
+        However we can't change the name of the message.
+
+    SHM_INFO
+    SHM_GET
+    SHM_GET_BOOL
+    SHM_GET_HIDDEN
+
+    GET_BOOL
+    GET_LINE
+    GET_HIDDEN
+    GOT_IT
+
+    NEED_PASSPHRASE <long main keyid> <long keyid> <keytype> <keylength>
+       Issued whenever a passphrase is needed.
+       keytype is the numerical value of the public key algorithm
+       or 0 if this is not applicable, keylength is the length
+       of the key or 0 if it is not known (this is currently always the case).
+
+    NEED_PASSPHRASE_SYM <cipher_algo> <s2k_mode> <s2k_hash>
+       Issued whenever a passphrase for symmetric encryption is needed.
+
+    NEED_PASSPHRASE_PIN <card_type> <chvno> [<serialno>]
+        Issued whenever a PIN is requested to unlock a card.
+
+    MISSING_PASSPHRASE
+       No passphrase was supplied.  An application which encounters this
+       message may want to stop parsing immediately because the next message
+       will probably be a BAD_PASSPHRASE.  However, if the application
+       is a wrapper around the key edit menu functionality it might not
+       make sense to stop parsing but simply ignoring the following
+       BAD_PASSPHRASE.
+
+    BAD_PASSPHRASE <long keyid>
+       The supplied passphrase was wrong or not given.  In the latter case
+       you may have seen a MISSING_PASSPHRASE.
+
+    GOOD_PASSPHRASE
+       The supplied passphrase was good and the secret key material
+       is therefore usable.
+
+    DECRYPTION_FAILED
+       The symmetric decryption failed - one reason could be a wrong
+       passphrase for a symmetrical encrypted message.
+
+    DECRYPTION_OKAY
+       The decryption process succeeded.  This means, that either the
+       correct secret key has been used or the correct passphrase
+       for a conventional encrypted message was given.  The program
+       itself may return an errorcode because it may not be possible to
+       verify a signature for some reasons.
+
+    NO_PUBKEY  <long keyid>
+    NO_SECKEY  <long keyid>
+       The key is not available
+
+    IMPORT_CHECK <long keyid> <fingerprint> <user ID>
+        This status is emitted in interactive mode right before
+        the "import.okay" prompt.
+
+    IMPORTED   <long keyid>  <username>
+       The keyid and name of the signature just imported
+
+    IMPORT_OK  <reason> [<fingerprint>]
+        The key with the primary key's FINGERPRINT has been imported.
+        Reason flags:
+          0 := Not actually changed
+          1 := Entirely new key.
+          2 := New user IDs
+          4 := New signatures
+          8 := New subkeys 
+         16 := Contains private key.
+        The flags may be ORed.
+
+    IMPORT_PROBLEM <reason> [<fingerprint>]
+        Issued for each import failure.  Reason codes are:
+          0 := "No specific reason given".
+          1 := "Invalid Certificate".
+          2 := "Issuer Certificate missing".
+          3 := "Certificate Chain too long".
+          4 := "Error storing certificate".
+
+    IMPORT_RES <count> <no_user_id> <imported> <imported_rsa> <unchanged>
+       <n_uids> <n_subk> <n_sigs> <n_revoc> <sec_read> <sec_imported> <sec_dups> <not_imported>
+       Final statistics on import process (this is one long line)
+
+    FILE_START <what> <filename>
+       Start processing a file <filename>.  <what> indicates the performed
+       operation:
+           1 - verify
+            2 - encrypt
+            3 - decrypt        
+
+    FILE_DONE
+       Marks the end of a file processing which has been started
+       by FILE_START.
+
+    BEGIN_DECRYPTION
+    END_DECRYPTION
+       Mark the start and end of the actual decryption process.  These
+       are also emitted when in --list-only mode.
+
+    BEGIN_ENCRYPTION  <mdc_method> <sym_algo>
+    END_ENCRYPTION
+       Mark the start and end of the actual encryption process.
+
+    BEGIN_SIGNING
+       Mark the start of the actual signing process. This may be used
+       as an indication that all requested secret keys are ready for
+       use.
+
+    DELETE_PROBLEM reason_code
+       Deleting a key failed.  Reason codes are:
+           1 - No such key
+           2 - Must delete secret key first
+            3 - Ambigious specification
+
+    PROGRESS what char cur total
+       Used by the primegen and Public key functions to indicate progress.
+       "char" is the character displayed with no --status-fd enabled, with
+       the linefeed replaced by an 'X'.  "cur" is the current amount
+       done and "total" is amount to be done; a "total" of 0 indicates that
+       the total amount is not known.  100/100 may be used to detect the
+       end of operation.
+        Well known values for WHAT:
+             "pk_dsa"   - DSA key generation
+             "pk_elg"   - Elgamal key generation
+             "primegen" - Prime generation
+             "need_entropy" - Waiting for new entropy in the RNG
+             "file:XXX" - processing file XXX
+                          (note that current gpg versions leave out the
+                           "file:" prefix).
+             "tick"     - generic tick without any special meaning - useful
+                          for letting clients know that the server is
+                          still working.
+             "starting_agent" - A gpg-agent was started because it is not
+                          running as a daemon.
+
+        
+    SIG_CREATED <type> <pubkey algo> <hash algo> <class> <timestamp> <key fpr>
+       A signature has been created using these parameters.
+           type:  'D' = detached
+                  'C' = cleartext
+                  'S' = standard
+                  (only the first character should be checked)
+           class: 2 hex digits with the signature class
+
+        Note, that TIMESTAMP may either be a number with seconds since
+        epoch or an ISO 8601 string which can be detected by the
+        presence of the letter 'T' inside.
+        
+    KEY_CREATED <type> <fingerprint> [<handle>]
+        A key has been created
+            type: 'B' = primary and subkey
+                  'P' = primary
+                  'S' = subkey
+        The fingerprint is one of the primary key for type B and P and
+        the one of the subkey for S.  Handle is an arbitrary
+        non-whitespace string used to match key parameters from batch
+        key creation run.
+
+    KEY_NOT_CREATED [<handle>]
+        The key from batch run has not been created due to errors.
+
+
+    SESSION_KEY  <algo>:<hexdigits>
+       The session key used to decrypt the message.  This message will
+       only be emitted when the special option --show-session-key
+       is used.  The format is suitable to be passed to the option
+       --override-session-key
+
+    NOTATION_NAME <name> 
+    NOTATION_DATA <string>
+        name and string are %XX escaped; the data may be splitted
+        among several notation_data lines.
+
+    USERID_HINT <long main keyid> <string>
+        Give a hint about the user ID for a certain keyID. 
+
+    POLICY_URL <string>
+        string is %XX escaped
+
+    BEGIN_STREAM
+    END_STREAM
+        Issued by pipemode.
+
+    INV_RECP <reason> <requested_recipient>
+        Issued for each unusable recipient. The reasons codes
+        currently in use are:
+          0 := "No specific reason given".
+          1 := "Not Found"
+          2 := "Ambigious specification"
+          3 := "Wrong key usage"
+          4 := "Key revoked"
+          5 := "Key expired"
+          6 := "No CRL known"
+          7 := "CRL too old"
+          8 := "Policy mismatch"
+          9 := "Not a secret key"
+        10 := "Key not trusted"
+
+        Note that this status is also used for gpgsm's SIGNER command
+        where it relates to signer's of course.
+
+    NO_RECP <reserved>
+        Issued when no recipients are usable.
+
+    ALREADY_SIGNED <long-keyid>
+        Warning: This is experimental and might be removed at any time.
+
+    TRUNCATED <maxno>
+        The output was truncated to MAXNO items.  This status code is issued
+        for certain external requests
+
+    ERROR <error location> <error code> 
+
+        This is a generic error status message, it might be followed
+        by error location specific data. <error token> and
+        <error_location> should not contain a space.  The error code
+        is a either a string commencing with a letter or such string
+        prefix with a numerical error code and an underscore; e.g.:
+        "151011327_EOF"
+
+    ATTRIBUTE <fpr> <octets> <type> <index> <count>
+             <timestamp> <expiredate> <flags>
+       This is one long line issued for each attribute subpacket when
+       an attribute packet is seen during key listing.  <fpr> is the
+       fingerprint of the key. <octets> is the length of the
+       attribute subpacket. <type> is the attribute type
+       (1==image). <index>/<count> indicates that this is the Nth
+       indexed subpacket of count total subpackets in this attribute
+       packet.  <timestamp> and <expiredate> are from the
+       self-signature on the attribute packet.  If the attribute
+       packet does not have a valid self-signature, then the
+       timestamp is 0.  <flags> are a bitwise OR of:
+               0x01 = this attribute packet is a primary uid
+               0x02 = this attribute packet is revoked
+               0x04 = this attribute packet is expired
+
+    CARDCTRL <what> [<serialno>]
+        This is used to control smartcard operations.
+        Defined values for WHAT are:
+           1 = Request insertion of a card.  Serialnumber may be given
+               to request a specific card.
+           2 = Request removal of a card.
+           3 = Card with serialnumber detected
+           4 = No card available.
+           5 = No card reader available
+
+
+    PLAINTEXT <format> <timestamp> <filename>
+        This indicates the format of the plaintext that is about to be
+        written.  The format is a 1 byte hex code that shows the
+        format of the plaintext: 62 ('b') is binary data, 74 ('t') is
+        text data with no character set specified, and 75 ('u') is
+        text data encoded in the UTF-8 character set.  The timestamp
+        is in seconds since the epoch.  If a filename is available it
+        gets printed as the third argument, percent-escaped as usual.
+
+    PLAINTEXT_LENGTH <length>
+        This indicates the length of the plaintext that is about to be
+        written.  Note that if the plaintext packet has partial length
+        encoding it is not possible to know the length ahead of time.
+        In that case, this status tag does not appear.
+
+    SIG_SUBPACKET <type> <flags> <len> <data>
+        This indicates that a signature subpacket was seen.  The
+        format is the same as the "spk" record above.
+
+    SC_OP_FAILURE [<code>]
+        An operation on a smartcard definitely failed.  Currently
+        there is no indication of the actual error code, but
+        application should be prepared to later accept more arguments.
+        Defined values for CODE are:
+           0 - unspecified error (identically to a missing CODE)
+           1 - canceled
+           2 - bad PIN
+
+    SC_OP_SUCCESS
+        A smart card operaion succeeded.  This status is only printed
+        for certain operation and is mostly useful to check whether a
+        PIN change really worked.
+
+    BACKUP_KEY_CREATED fingerprint fname
+        A backup key named FNAME has been created for the key with
+        KEYID.
+
+
+Format of the "--attribute-fd" output
+=====================================
+
+When --attribute-fd is set, during key listings (--list-keys,
+--list-secret-keys) GnuPG dumps each attribute packet to the file
+descriptor specified.  --attribute-fd is intended for use with
+--status-fd as part of the required information is carried on the
+ATTRIBUTE status tag (see above).
+
+The contents of the attribute data is specified by 2440bis, but for
+convenience, here is the Photo ID format, as it is currently the only
+attribute defined:
+
+   Byte 0-1:  The length of the image header.  Due to a historical
+              accident (i.e. oops!) back in the NAI PGP days, this is
+              a little-endian number.  Currently 16 (0x10 0x00).
+
+   Byte 2:    The image header version.  Currently 0x01.
+
+   Byte 3:    Encoding format.  0x01 == JPEG.
+
+   Byte 4-15: Reserved, and currently unused.
+
+   All other data after this header is raw image (JPEG) data.
+
+
+Format of the "--list-config" output
+====================================
+
+--list-config outputs information about the GnuPG configuration for
+the benefit of frontends or other programs that call GnuPG.  There are
+several list-config items, all colon delimited like the rest of the
+--with-colons output.  The first field is always "cfg" to indicate
+configuration information.  The second field is one of (with
+examples):
+
+version: the third field contains the version of GnuPG.
+
+   cfg:version:1.3.5
+
+pubkey: the third field contains the public key algorithmdcaiphers
+       this version of GnuPG supports, separated by semicolons.  The
+       algorithm numbers are as specified in RFC-2440.
+
+   cfg:pubkey:1;2;3;16;17
+
+cipher: the third field contains the symmetric ciphers this version of
+       GnuPG supports, separated by semicolons.  The cipher numbers
+       are as specified in RFC-2440.
+
+   cfg:cipher:2;3;4;7;8;9;10
+
+digest: the third field contains the digest (hash) algorithms this
+       version of GnuPG supports, separated by semicolons.  The
+       digest numbers are as specified in RFC-2440.
+
+   cfg:digest:1;2;3;8;9;10
+
+compress: the third field contains the compression algorithms this
+         version of GnuPG supports, separated by semicolons.  The
+         algorithm numbers are as specified in RFC-2440.
+
+   cfg:compress:0;1;2;3
+
+group: the third field contains the name of the group, and the fourth
+       field contains the values that the group expands to, separated
+       by semicolons.
+
+For example, a group of:
+   group mynames = paige 0x12345678 joe patti
+
+would result in:
+   cfg:group:mynames:patti;joe;0x12345678;paige
+
+
+Key generation
+==============
+    Key generation shows progress by printing different characters to
+    stderr:
+            "."  Last 10 Miller-Rabin tests failed
+            "+"  Miller-Rabin test succeeded
+            "!"  Reloading the pool with fresh prime numbers
+            "^"  Checking a new value for the generator
+            "<"  Size of one factor decreased
+            ">"  Size of one factor increased
+
+    The prime number for Elgamal is generated this way:
+
+    1) Make a prime number q of 160, 200, 240 bits (depending on the keysize)
+    2) Select the length of the other prime factors to be at least the size
+       of q and calculate the number of prime factors needed
+    3) Make a pool of prime numbers, each of the length determined in step 2
+    4) Get a new permutation out of the pool or continue with step 3
+       if we have tested all permutations.
+    5) Calculate a candidate prime p = 2 * q * p[1] * ... * p[n] + 1
+    6) Check that this prime has the correct length (this may change q if
+       it seems not to be possible to make a prime of the desired length)
+    7) Check whether this is a prime using trial divisions and the
+       Miller-Rabin test.
+    8) Continue with step 4 if we did not find a prime in step 7.
+    9) Find a generator for that prime.
+
+    This algorithm is based on Lim and Lee's suggestion from the
+    Crypto '97 proceedings p. 260.
+
+
+Unattended key generation
+=========================
+This feature allows unattended generation of keys controlled by a
+parameter file.  To use this feature, you use --gen-key together with
+--batch and feed the parameters either from stdin or from a file given
+on the commandline.
+
+The format of this file is as follows:
+  o Text only, line length is limited to about 1000 chars.
+  o You must use UTF-8 encoding to specify non-ascii characters.
+  o Empty lines are ignored.
+  o Leading and trailing spaces are ignored.
+  o A hash sign as the first non white space character indicates a comment line.
+  o Control statements are indicated by a leading percent sign, the
+    arguments are separated by white space from the keyword.
+  o Parameters are specified by a keyword, followed by a colon.  Arguments
+    are separated by white space.
+  o The first parameter must be "Key-Type", control statements
+    may be placed anywhere.
+  o Key generation takes place when either the end of the parameter file
+    is reached, the next "Key-Type" parameter is encountered or at the
+    control statement "%commit"
+  o Control statements:
+    %echo <text>
+       Print <text>.
+    %dry-run
+       Suppress actual key generation (useful for syntax checking).
+    %commit
+       Perform the key generation.  An implicit commit is done
+       at the next "Key-Type" parameter.
+    %pubring <filename>
+    %secring <filename>
+       Do not write the key to the default or commandline given
+       keyring but to <filename>.  This must be given before the first
+       commit to take place, duplicate specification of the same filename
+       is ignored, the last filename before a commit is used.
+       The filename is used until a new filename is used (at commit points)
+       and all keys are written to that file.  If a new filename is given,
+       this file is created (and overwrites an existing one).
+       Both control statements must be given.
+   o The order of the parameters does not matter except for "Key-Type"
+     which must be the first parameter.  The parameters are only for the
+     generated keyblock and parameters from previous key generations are not
+     used. Some syntactically checks may be performed.
+     The currently defined parameters are:
+     Key-Type: <algo-number>|<algo-string>
+       Starts a new parameter block by giving the type of the
+       primary key. The algorithm must be capable of signing.
+       This is a required parameter.
+     Key-Length: <length-in-bits>
+       Length of the key in bits.  Default is 1024.
+     Key-Usage: <usage-list>
+        Space or comma delimited list of key usage, allowed values are
+        "encrypt", "sign", and "auth".  This is used to generate the
+        key flags.  Please make sure that the algorithm is capable of
+        this usage.  Note that OpenPGP requires that all primary keys
+        are capable of certification, so no matter what usage is given
+        here, the "cert" flag will be on.  If no Key-Usage is
+        specified, all the allowed usages for that particular
+        algorithm are used.
+     Subkey-Type: <algo-number>|<algo-string>
+       This generates a secondary key.  Currently only one subkey
+       can be handled.
+     Subkey-Length: <length-in-bits>
+       Length of the subkey in bits.  Default is 1024.
+     Subkey-Usage: <usage-list>
+        Similar to Key-Usage.
+     Passphrase: <string>
+       If you want to specify a passphrase for the secret key,
+       enter it here.  Default is not to use any passphrase.
+     Name-Real: <string>
+     Name-Comment: <string>
+     Name-Email: <string>
+       The 3 parts of a key. Remember to use UTF-8 here.
+       If you don't give any of them, no user ID is created.
+     Expire-Date: <iso-date>|(<number>[d|w|m|y])
+       Set the expiration date for the key (and the subkey).  It
+       may either be entered in ISO date format (2000-08-15) or as
+       number of days, weeks, month or years. Without a letter days
+       are assumed.
+     Preferences: <string>
+        Set the cipher, hash, and compression preference values for
+       this key.  This expects the same type of string as "setpref"
+       in the --edit menu.
+     Revoker: <algo>:<fpr> [sensitive]
+        Add a designated revoker to the generated key.  Algo is the
+       public key algorithm of the designated revoker (i.e. RSA=1,
+       DSA=17, etc.)  Fpr is the fingerprint of the designated
+       revoker.  The optional "sensitive" flag marks the designated
+       revoker as sensitive information.  Only v4 keys may be
+       designated revokers.
+     Handle: <string>
+        This is an optional parameter only used with the status lines
+        KEY_CREATED and KEY_NOT_CREATED.  STRING may be up to 100
+        characters and should not contain spaces.  It is useful for
+        batch key generation to associate a key parameter block with a
+        status line.
+     Keyserver: <string>
+        This is an optional parameter that specifies the preferred
+        keyserver URL for the key.
+
+
+Here is an example:
+$ cat >foo <<EOF
+     %echo Generating a standard key
+     Key-Type: DSA
+     Key-Length: 1024
+     Subkey-Type: ELG-E
+     Subkey-Length: 1024
+     Name-Real: Joe Tester
+     Name-Comment: with stupid passphrase
+     Name-Email: joe@foo.bar
+     Expire-Date: 0
+     Passphrase: abc
+     %pubring foo.pub
+     %secring foo.sec
+     # Do a commit here, so that we can later print "done" :-)
+     %commit
+     %echo done
+EOF
+$ gpg --batch --gen-key foo
+ [...]
+$ gpg --no-default-keyring --secret-keyring ./foo.sec \
+                                 --keyring ./foo.pub --list-secret-keys
+/home/wk/work/gnupg-stable/scratch/foo.sec
+------------------------------------------
+sec  1024D/915A878D 2000-03-09 Joe Tester (with stupid passphrase) <joe@foo.bar>
+ssb  1024g/8F70E2C0 2000-03-09
+
+
+
+Layout of the TrustDB
+=====================
+The TrustDB is built from fixed length records, where the first byte
+describes the record type.  All numeric values are stored in network
+byte order. The length of each record is 40 bytes. The first record of
+the DB is always of type 1 and this is the only record of this type.
+
+FIXME:  The layout changed, document it here.
+
+  Record type 0:
+  --------------
+    Unused record, can be reused for any purpose.
+
+  Record type 1:
+  --------------
+    Version information for this TrustDB.  This is always the first
+    record of the DB and the only one with type 1.
+     1 byte value 1
+     3 bytes 'gpg'  magic value
+     1 byte Version of the TrustDB (2)
+     1 byte marginals needed
+     1 byte completes needed
+     1 byte max_cert_depth
+           The three items are used to check whether the cached
+           validity value from the dir record can be used.
+     1 u32  locked flags [not used]
+     1 u32  timestamp of trustdb creation
+     1 u32  timestamp of last modification which may affect the validity
+           of keys in the trustdb.  This value is checked against the
+           validity timestamp in the dir records.
+     1 u32  timestamp of last validation [currently not used]
+           (Used to keep track of the time, when this TrustDB was checked
+            against the pubring)
+     1 u32  record number of keyhashtable [currently not used]
+     1 u32  first free record
+     1 u32  record number of shadow directory hash table [currently not used]
+           It does not make sense to combine this table with the key table
+           because the keyid is not in every case a part of the fingerprint.
+     1 u32  record number of the trusthashtbale
+
+
+  Record type 2: (directory record)
+  --------------
+    Informations about a public key certificate.
+    These are static values which are never changed without user interaction.
+
+     1 byte value 2
+     1 byte  reserved
+     1 u32   LID     . (This is simply the record number of this record.)
+     1 u32   List of key-records (the first one is the primary key)
+     1 u32   List of uid-records
+     1 u32   cache record
+     1 byte  ownertrust
+     1 byte  dirflag
+     1 byte  maximum validity of all the user ids
+     1 u32   time of last validity check.
+     1 u32   Must check when this time has been reached.
+            (0 = no check required)
+
+
+  Record type 3:  (key record)
+  --------------
+    Informations about a primary public key.
+    (This is mainly used to lookup a trust record)
+
+     1 byte value 3
+     1 byte  reserved
+     1 u32   LID
+     1 u32   next   - next key record
+     7 bytes reserved
+     1 byte  keyflags
+     1 byte  pubkey algorithm
+     1 byte  length of the fingerprint (in bytes)
+     20 bytes fingerprint of the public key
+             (This is the value we use to identify a key)
+
+  Record type 4: (uid record)
+  --------------
+    Informations about a userid
+    We do not store the userid but the hash value of the userid because that
+    is sufficient.
+
+     1 byte value 4
+     1 byte reserved
+     1 u32  LID  points to the directory record.
+     1 u32  next   next userid
+     1 u32  pointer to preference record
+     1 u32  siglist  list of valid signatures
+     1 byte uidflags
+     1 byte validity of the key calculated over this user id
+     20 bytes ripemd160 hash of the username.
+
+
+  Record type 5: (pref record)
+  --------------
+    This record type is not anymore used.
+
+     1 byte value 5
+     1 byte   reserved
+     1 u32  LID; points to the directory record (and not to the uid record!).
+           (or 0 for standard preference record)
+     1 u32  next
+     30 byte preference data
+
+  Record type 6  (sigrec)
+  -------------
+    Used to keep track of key signatures. Self-signatures are not
+    stored.  If a public key is not in the DB, the signature points to
+    a shadow dir record, which in turn has a list of records which
+    might be interested in this key (and the signature record here
+    is one).
+
+     1 byte   value 6
+     1 byte   reserved
+     1 u32    LID          points back to the dir record
+     1 u32    next   next sigrec of this uid or 0 to indicate the
+                    last sigrec.
+     6 times
+       1 u32  Local_id of signatures dir or shadow dir record
+       1 byte Flag: Bit 0 = checked: Bit 1 is valid (we have a real
+                            directory record for this)
+                        1 = valid is set (but may be revoked)
+
+
+
+  Record type 8: (shadow directory record)
+  --------------
+    This record is used to reserve a LID for a public key.  We
+    need this to create the sig records of other keys, even if we
+    do not yet have the public key of the signature.
+    This record (the record number to be more precise) will be reused
+    as the dir record when we import the real public key.
+
+     1 byte value 8
+     1 byte  reserved
+     1 u32   LID      (This is simply the record number of this record.)
+     2 u32   keyid
+     1 byte  pubkey algorithm
+     3 byte reserved
+     1 u32   hintlist  A list of records which have references to
+                       this key.  This is used for fast access to
+                       signature records which are not yet checked.
+                       Note, that this is only a hint and the actual records
+                       may not anymore hold signature records for that key
+                       but that the code cares about this.
+    18 byte reserved
+
+
+
+  Record Type 10 (hash table)
+  --------------
+    Due to the fact that we use fingerprints to lookup keys, we can
+    implement quick access by some simple hash methods, and avoid
+    the overhead of gdbm.  A property of fingerprints is that they can be
+    used directly as hash values.  (They can be considered as strong
+    random numbers.)
+      What we use is a dynamic multilevel architecture, which combines
+    hashtables, record lists, and linked lists.
+
+    This record is a hashtable of 256 entries; a special property
+    is that all these records are stored consecutively to make one
+    big table. The hash value is simple the 1st, 2nd, ... byte of
+    the fingerprint (depending on the indirection level).
+
+    When used to hash shadow directory records, a different table is used
+    and indexed by the keyid.
+
+     1 byte value 10
+     1 byte reserved
+     n u32  recnum; n depends on the record length:
+           n = (reclen-2)/4  which yields 9 for the current record length
+           of 40 bytes.
+
+    the total number of such record which makes up the table is:
+        m = (256+n-1) / n
+    which is 29 for a record length of 40.
+
+    To look up a key we use the first byte of the fingerprint to get
+    the recnum from this hashtable and look up the addressed record:
+       - If this record is another hashtable, we use 2nd byte
+        to index this hash table and so on.
+       - if this record is a hashlist, we walk all entries
+        until we found one a matching one.
+       - if this record is a key record, we compare the
+        fingerprint and to decide whether it is the requested key;
+
+
+  Record type 11 (hash list)
+  --------------
+    see hash table for an explanation.
+    This is also used for other purposes.
+
+    1 byte value 11
+    1 byte reserved
+    1 u32  next         next hash list record
+    n times             n = (reclen-5)/5
+       1 u32  recnum
+
+    For the current record length of 40, n is 7
+
+
+
+  Record type 254 (free record)
+  ---------------
+    All these records form a linked list of unused records.
+     1 byte  value 254
+     1 byte  reserved (0)
+     1 u32   next_free
+
+
+
+Packet Headers
+===============
+
+GNUPG uses PGP 2 packet headers and also understands OpenPGP packet header.
+There is one enhancement used with the old style packet headers:
+
+   CTB bits 10, the "packet-length length bits", have values listed in
+   the following table:
+
+      00 - 1-byte packet-length field
+      01 - 2-byte packet-length field
+      10 - 4-byte packet-length field
+      11 - no packet length supplied, unknown packet length
+
+   As indicated in this table, depending on the packet-length length
+   bits, the remaining 1, 2, 4, or 0 bytes of the packet structure field
+   are a "packet-length field".  The packet-length field is a whole
+   number field.  The value of the packet-length field is defined to be
+   the value of the whole number field.
+
+   A value of 11 is currently used in one place: on compressed data.
+   That is, a compressed data block currently looks like <A3 01 . .  .>,
+   where <A3>, binary 10 1000 11, is an indefinite-length packet. The
+   proper interpretation is "until the end of the enclosing structure",
+   although it should never appear outermost (where the enclosing
+   structure is a file).
+
++  This will be changed with another version, where the new meaning of
++  the value 11 (see below) will also take place.
++
++  A value of 11 for other packets enables a special length encoding,
++  which is used in case, where the length of the following packet can
++  not be determined prior to writing the packet; especially this will
++  be used if large amounts of data are processed in filter mode.
++
++  It works like this: After the CTB (with a length field of 11) a
++  marker field is used, which gives the length of the following datablock.
++  This is a simple 2 byte field (MSB first) containing the amount of data
++  following this field, not including this length field. After this datablock
++  another length field follows, which gives the size of the next datablock.
++  A value of 0 indicates the end of the packet. The maximum size of a
++  data block is limited to 65534, thereby reserving a value of 0xffff for
++  future extensions. These length markers must be inserted into the data
++  stream just before writing the data out.
++
++  This 2 byte field is large enough, because the application must buffer
++  this amount of data to prepend the length marker before writing it out.
++  Data block sizes larger than about 32k doesn't make any sense. Note
++  that this may also be used for compressed data streams, but we must use
++  another packet version to tell the application that it can not assume,
++  that this is the last packet.
+
+
+GNU extensions to the S2K algorithm
+===================================
+S2K mode 101 is used to identify these extensions.
+After the hash algorithm the 3 bytes "GNU" are used to make
+clear that these are extensions for GNU, the next bytes gives the
+GNU protection mode - 1000.  Defined modes are:
+  1001 - do not store the secret part at all
+  1002 - a stub to access smartcards (not used in 1.2.x)
+
+
+Pipemode
+========
+NOTE:  This is deprecated and will be removed in future versions.
+
+This mode can be used to perform multiple operations with one call to
+gpg. It comes handy in cases where you have to verify a lot of
+signatures. Currently we support only detached signatures.  This mode
+is a kludge to avoid running gpg n daemon mode and using Unix Domain
+Sockets to pass the data to it.  There is no easy portable way to do
+this under Windows, so we use plain old pipes which do work well under
+Windows.  Because there is no way to signal multiple EOFs in a pipe we
+have to embed control commands in the data stream: We distinguish
+between a data state and a control state.  Initially the system is in
+data state but it won't accept any data.  Instead it waits for
+transition to control state which is done by sending a single '@'
+character.  While in control state the control command os expected and
+this command is just a single byte after which the system falls back
+to data state (but does not necesary accept data now).  The simplest
+control command is a '@' which just inserts this character into the
+data stream.
+
+Here is the format we use for detached signatures:
+"@<"  - Begin of new stream
+"@B"  - Detached signature follows.
+        This emits a control packet (1,'B')
+<detached_signature>
+"@t"  - Signed text follows. 
+        This emits the control packet (2, 'B')
+<signed_text>
+"@."  - End of operation. The final control packet forces signature
+        verification
+"@>"  - End of stream   
+
+
+
+
+
+
+Other Notes
+===========
+    * For packet version 3 we calculate the keyids this way:
+       RSA     := low 64 bits of n
+       ELGAMAL := build a v3 pubkey packet (with CTB 0x99) and calculate
+                  a rmd160 hash value from it. This is used as the
+                  fingerprint and the low 64 bits are the keyid.
+
+    * Revocation certificates consist only of the signature packet;
+      "import" knows how to handle this.  The rationale behind it is
+      to keep them small.
+
+
+
+
+
+
+
+Keyserver Message Format
+=========================
+
+The keyserver may be contacted by a Unix Domain socket or via TCP.
+
+The format of a request is:
+
+====
+command-tag
+"Content-length:" digits
+CRLF
+=======
+
+Where command-tag is
+
+NOOP
+GET <user-name>
+PUT
+DELETE <user-name>
+
+
+The format of a response is:
+
+======
+"GNUPG/1.0" status-code status-text
+"Content-length:" digits
+CRLF
+============
+followed by <digits> bytes of data
+
+
+Status codes are:
+
+     o 1xx: Informational - Request received, continuing process
+
+     o 2xx: Success - The action was successfully received, understood,
+       and accepted
+
+     o 4xx: Client Error - The request contains bad syntax or cannot be
+       fulfilled
+
+     o 5xx: Server Error - The server failed to fulfill an apparently
+       valid request
+
+
+
+Documentation on HKP (the http keyserver protocol):
+
+A minimalistic HTTP server on port 11371 recognizes a GET for /pks/lookup.
+The standard http URL encoded query parameters are this (always key=value):
+
+- op=index (like pgp -kv), op=vindex (like pgp -kvv) and op=get (like
+  pgp -kxa)
+
+- search=<stringlist>. This is a list of words that must occur in the key.
+  The words are delimited with space, points, @ and so on. The delimiters
+  are not searched for and the order of the words doesn't matter (but see
+  next option).
+
+- exact=on. This switch tells the hkp server to only report exact matching
+  keys back. In this case the order and the "delimiters" are important.
+
+- fingerprint=on. Also reports the fingerprints when used with 'index' or
+  'vindex'
+
+The keyserver also recognizes http-POSTs to /pks/add. Use this to upload
+keys.
+
+
+A better way to do this would be a request like:
+
+   /pks/lookup/<gnupg_formatierte_user_id>?op=<operation>
+
+This can be implemented using Hurd's translator mechanism.
+However, I think the whole key server stuff has to be re-thought;
+I have some ideas and probably create a white paper.
+
diff --git a/doc/FAQ b/doc/FAQ
new file mode 100644 (file)
index 0000000..480c42f
--- /dev/null
+++ b/doc/FAQ
@@ -0,0 +1,1301 @@
+
+GnuPG Frequently Asked Questions
+
+
+Version: 1.6.3
+Last-Modified: Jul 30, 2003
+Maintained-by: David D. Scribner, <faq 'at' gnupg.org>
+
+
+This is the GnuPG FAQ. The latest HTML version is available
+here. <http://www.gnupg.org/documentation/faqs.html>
+
+The index is generated automatically, so there may be errors. Not all
+questions may be in the section they belong to. Suggestions about how
+to improve the structure of this FAQ are welcome.
+
+Please send additions and corrections to the maintainer. It would be
+most convenient if you could provide the answer to be included here
+as well. Your help is very much appreciated!
+
+Please, don't send message like "This should be a FAQ - what's the
+answer?". If it hasn't been asked before, it isn't a FAQ. In that case
+you could search in the mailing list archive.
+
+
+ 1. GENERAL
+   1.1) What is GnuPG?
+   1.2) Is GnuPG compatible with PGP?
+   1.3) Is GnuPG free to use for personal or commercial use?
+   1.4) What conventions are used in this FAQ?
+
+ 2. SOURCES of INFORMATION
+   2.1) Where can I find more information on GnuPG?
+   2.2) Where do I get GnuPG?
+
+ 3. INSTALLATION 
+   3.1) Which OSes does GnuPG run on?
+   3.2) Which random data gatherer should I use?
+   3.3) How do I include support for RSA and IDEA?
+
+ 4. USAGE
+   4.1) What is the recommended key size?
+   4.2) Why does it sometimes take so long to create keys?
+   4.3) And it really takes long when I work on a remote system. Why?
+   4.4) What is the difference between options and commands?
+   4.5) I can't delete a user ID on my secret keyring because it has
+       already been deleted on my public keyring. What can I do?
+   4.6) I can't delete my secret key because the public key disappeared.
+       What can I do?
+   4.7) What are trust, validity and ownertrust?
+   4.8) How do I sign a patch file?
+   4.9) Where is the "encrypt-to-self" option?
+   4.10) How can I get rid of the Version and Comment headers in armored
+       messages?
+   4.11) What does the "You are using the xxxx character set." mean?
+   4.12) How can I get list of key IDs used to encrypt a message?
+   4.13) Why can't I decrypt files encrypted as symmetrical-only (-c) with
+       a version of GnuPG prior to 1.0.1.
+   4.14) How can I use GnuPG in an automated environment?
+   4.15) Which email-client can I use with GnuPG?
+   4.16) Can't we have a gpg library?
+   4.17) I have successfully generated a revocation certificate, but I don't
+       understand how to send it to the key servers.
+   4.18) How do I put my keyring in a different directory?
+   4.19) How do I verify signed packages?
+   4.20) How do I export a keyring with only selected signatures (keys)?
+   4.21) I still have my secret key, but lost my public key. What can I do?
+   4.22) Clearsigned messages sent from my web-mail account have an invalid
+       signature. Why?
+
+ 5. COMPATIBILITY ISSUES
+   5.1) How can I encrypt a message with GnuPG so that PGP is able to decrypt it?
+   5.2) How do I migrate from PGP 2.x to GnuPG?
+   5.3) (removed)
+   5.4) Why is PGP 5.x not able to encrypt messages with some keys?
+   5.5) Why is PGP 5.x not able to verify my messages?
+   5.6) How do I transfer owner trust values from PGP to GnuPG?
+   5.7) PGP does not like my secret key.
+   5.8) GnuPG no longer installs a ~/.gnupg/options file. Is it missing?
+   5.9) How do you export GnuPG keys for use with PGP?
+
+ 6. PROBLEMS and ERROR MESSAGES
+   6.1) Why do I get "gpg: Warning: using insecure memory!"
+   6.2) Large File Support doesn't work ...
+   6.3) In the edit menu the trust values are not displayed correctly after
+       signing uids. Why?
+   6.4) What does "skipping pubkey 1: already loaded" mean?
+   6.5) GnuPG 1.0.4 doesn't create ~/.gnupg ...
+   6.6) An Elgamal signature does not verify anymore since version 1.0.2 ...
+   6.7) Old versions of GnuPG can't verify Elgamal signatures
+   6.8) When I use --clearsign, the plain text has sometimes extra dashes
+       in it - why?
+   6.9) What is the thing with "can't handle multiple signatures"?
+   6.10) If I submit a key to a keyserver, nothing happens ...
+   6.11) I get "gpg: waiting for lock ..."
+   6.12) Older gpg binaries (e.g., 1.0) have problems with keys from newer
+       gpg binaries ...
+   6.13) With 1.0.4, I get "this cipher algorithm is deprecated ..."
+   6.14) Some dates are displayed as ????-??-??. Why?
+   6.15) I still have a problem. How do I report a bug?
+   6.16) Why doesn't GnuPG support X.509 certificates?
+   6.17) Why do national characters in my user ID look funny?
+   6.18) I get 'sed' errors when running ./configure on Mac OS X ...
+   6.19) Why does GnuPG 1.0.6 bail out on keyrings used with 1.0.7?
+   6.20) I upgraded to GnuPG version 1.0.7 and now it takes longer to load my
+       keyrings. What can I do?
+   6.21) Doesn't a fully trusted user ID on a key prevent warning messages
+       when encrypting to other IDs on the key?
+   6.22) I just compiled GnuPG from source on my GNU/Linux RPM-based system
+       and it's not working. Why?
+
+ 7. ADVANCED TOPICS
+   7.1) How does this whole thing work?
+   7.2) Why are some signatures with an ELG-E key valid?
+   7.3) How does the whole trust thing work?
+   7.4) What kind of output is this: "key C26EE891.298, uid 09FB: ...."?
+   7.5) How do I interpret some of the informational outputs?
+   7.6) Are the header lines of a cleartext signature part of the signed
+       material?
+   7.7) What is the list of preferred algorithms?
+   7.8) How do I change the list of preferred algorithms?
+
+ 8. ACKNOWLEDGEMENTS
+
+
+1. GENERAL
+
+1.1) What is GnuPG?
+
+    GnuPG stands for GNU Privacy Guard and <http://www.gnupg.org>
+    is GNU's tool for secure communication and data storage. It can be
+    used to encrypt data and to create digital signatures. It includes
+    an advanced key management facility and is compliant with the
+    proposed OpenPGP Internet standard as described in RFC 2440.
+           <http://www.rfc-editor.org/>
+    As such, it is aimed to be compatible with PGP from PGP Corp. and
+    other OpenPGP tools
+
+1.2) Is GnuPG compatible with PGP?
+
+    In general, yes. GnuPG and newer PGP releases should be implementing
+    the OpenPGP standard. But there are some interoperability problems.
+    See question 5.1 for details.
+
+1.3) Is GnuPG free to use for personal or commercial use?
+
+    Yes. GnuPG is part of the GNU family of tools and applications built
+    and provided in accordance with the Free Software Foundation (FSF)
+    General Public License (GPL). Therefore the software is free to copy,
+    use, modify and distribute in accordance with that license. Please
+    read the file titled COPYING that accompanies the application for
+    more information.
+
+1.4) What conventions are used in this FAQ?
+
+    Although GnuPG is being developed for several operating systems
+    (often in parallel), the conventions used in this FAQ reflect a
+    UNIX shell environment. For Win32 users, references to a shell
+    prompt (`$') should be interpreted as a command prompt (`>'),
+    directory names separated by a forward slash (`/') may need to be
+    converted to a back slash (`\'), and a tilde (`~') represents a
+    user's "home" directory (reference question 4.18 for an example).
+
+    Some command-lines presented in this FAQ are too long to properly
+    display in some browsers for the web page version of this file, and
+    have been split into two or more lines. For these commands please
+    remember to enter the entire command-string on one line or the
+    command will error, or at minimum not give the desired results. 
+
+    Please keep in mind that this FAQ contains information that may not
+    apply to your particular version, as new features and bug fixes are
+    added on a continuing basis (reference the NEWS file included with
+    the source or package for noteworthy changes between versions). One
+    item to note is that starting with GnuPG version 1.1.92 the file
+    containing user options and settings has been renamed from "options"
+    to "gpg.conf". Information in the FAQ that relates to the options
+    file may be interchangable with the newer gpg.conf file in many
+    instances. See question 5.8 for details.
+
+
+2. SOURCES of INFORMATION
+
+2.1) Where can I find more information on GnuPG?
+
+    On-line resources:
+
+    The documentation page is located at <http://www.gnupg.org/documentation/>.
+    Also, have a look at the HOWTOs and the GNU Privacy Handbook (GPH,
+    available in English, Spanish and Russian). The latter provides a
+    detailed user's guide to GnuPG. You'll also find a document about how
+    to convert from PGP 2.x to GnuPG.
+
+    At <http://www.gnupg.org/documentation/mailing-lists.html> you'll find
+    an online archive of the GnuPG mailing lists. Most interesting should
+    be gnupg-users for all user-related issues and gnupg-devel if you want
+    to get in touch with the developers.
+
+    In addition, searchable archives can be found on MARC, e.g.: 
+    gnupg-users: <http://marc.theaimsgroup.com/?l=gnupg-users&r=1&w=2>
+    gnupg-devel: <http://marc.theaimsgroup.com/?l=gnupg-devel&r=1&w=2>
+
+    PLEASE:
+    Before posting to a list, read this FAQ and the available documentation.
+    In addition, search the list archive - maybe your question has already
+    been discussed. This way you help people focus on topics that have not
+    yet been resolved.
+
+    The GnuPG source distribution contains a subdirectory:
+
+       ./doc
+
+    where some additional documentation is located (mainly interesting
+    for hackers, not the casual user).
+
+2.2) Where do I get GnuPG?
+
+    You can download the GNU Privacy Guard from its primary FTP server
+    <ftp://ftp.gnupg.org/gcrypt/> or from one of the mirrors:
+
+       <http://www.gnupg.org/download/mirrors.html>
+
+    The current stable version is 1.2.2. Please upgrade to this version as
+    it includes additional features, functions and security fixes that may
+    not have existed in prior versions.
+
+
+3. INSTALLATION 
+
+3.1) Which OSes does GnuPG run on?
+
+    It should run on most Unices as well as Windows versions (including
+    Windows NT/2000) and Macintosh OS/X. A list of OSes reported to be OK
+    is presented at:
+
+       <http://www.gnupg.org/download/supported_systems.html>
+
+3.2) Which random data gatherer should I use?
+
+    "Good" random numbers are crucial for the security of your encryption.
+    Different operating systems provide a variety of more or less quality
+    random data. Linux and *BSD provide kernel generated random data
+    through /dev/random - this should be the preferred choice on these
+    systems. Also Solaris users with the SUNWski package installed have
+    a /dev/random. In these cases, use the configure option:
+
+       --enable-static-rnd=linux
+
+    In addition, there's also the kernel random device by Andi Maier
+    <http://www.cosy.sbg.ac.at/~andi/SUNrand/>, but it's still beta. Use at your
+    own risk!
+
+    On other systems, the Entropy Gathering Daemon (EGD) is a good choice.
+    It is a perl-daemon that monitors system activity and hashes it into
+    random data. See the download page <http://www.gnupg.org/download/>
+    to obtain EGD. Use:
+
+       --enable-static-rnd=egd
+
+    here.
+
+    If the above options do not work, you can use the random number
+    generator "unix". This is *very* slow and should be avoided. The
+    random quality isn't very good so don't use it on sensitive data.
+
+3.3) How do I include support for RSA and IDEA?
+
+    RSA is included as of GnuPG version 1.0.3.
+
+    The official GnuPG distribution does not contain IDEA due to a patent
+    restriction. The patent does not expire before 2007 so don't expect
+    official support before then.
+
+    However, there is an unofficial module to include it even in earlier
+    versions of GnuPG. It's available from
+    <ftp://ftp.gnupg.dk/pub/contrib-dk/>. Look for:
+
+       idea.c.gz        (c module)
+       idea.c.gz.sig    (signature file)
+
+       ideadll.zip      (c module and win32 dll)
+       ideadll.zip.sig  (signature file)
+
+    Compilation directives are in the headers of these files. You will
+    then need to add the following line to your ~/.gnupg/gpg.conf or
+    ~/.gnupg/options file:
+
+       load-extension idea
+
+
+4. USAGE
+
+4.1) What is the recommended key size?
+
+    1024 bit for DSA signatures; even for plain Elgamal signatures.
+    This is sufficient as the size of the hash is probably the weakest
+    link if the key size is larger than 1024 bits. Encryption keys may
+    have greater sizes, but you should then check the fingerprint of
+    this key:
+
+       $ gpg --fingerprint <user ID>
+
+    As for the key algorithms, you should stick with the default (i.e.,
+    DSA signature and Elgamal encryption). An Elgamal signing key has
+    the following disadvantages: the signature is larger, it is hard
+    to create such a key useful for signatures which can withstand some
+    real world attacks, you don't get any extra security compared to
+    DSA, and there might be compatibility problems with certain PGP
+    versions. It has only been introduced because at the time it was
+    not clear whether there was a patent on DSA.
+
+4.2) Why does it sometimes take so long to create keys?
+
+    The problem here is that we need a lot of random bytes and for that
+    we (on Linux the /dev/random device) must collect some random data.
+    It is really not easy to fill the Linux internal entropy buffer; I
+    talked to Ted Ts'o and he commented that the best way to fill the
+    buffer is to play with your keyboard. Good security has its price.
+    What I do is to hit several times on the shift, control, alternate,
+    and caps lock keys, because these keys do not produce output to the
+    screen. This way you get your keys really fast (it's the same thing
+    PGP2 does).
+
+    Another problem might be another program which eats up your random
+    bytes (a program (look at your daemons) that reads from /dev/random).
+
+4.3) And it really takes long when I work on a remote system. Why?
+
+    Don't do this at all! You should never create keys or even use GnuPG
+    on a remote system because you normally have no physical control
+    over your secret key ring (which is in most cases vulnerable to
+    advanced dictionary attacks) - I strongly encourage everyone to only
+    create keys on a local computer (a disconnected laptop is probably
+    the best choice) and if you need it on your connected box (I know,
+    we all do this) be sure to have a strong password for both your
+    account and for your secret key, and that you can trust your system
+    administrator.
+
+    When I check GnuPG on a remote system via ssh (I have no Alpha here)
+    ;-) I have the same problem. It takes a *very* long time to create
+    the keys, so I use a special option, --quick-random, to generate
+    insecure keys which are only good for some tests.
+
+4.4) What is the difference between options and commands?
+
+    If you do a 'gpg --help', you will get two separate lists. The first
+    is a list of commands. The second is a list of options. Whenever you
+    run GPG, you must pick exactly one command (with one exception,
+    see below). You may pick one or more options. The command should,
+    just by convention, come at the end of the argument list, after all
+    the options. If the command takes a file (all the basic ones do),
+    the filename comes at the very end. So the basic way to run gpg is:
+
+       $ gpg [--option something] [--option2] [--option3 something] --command file
+
+    Some options take arguments. For example, the --output option (which
+    can be abbreviated as -o) is an option that takes a filename. The
+    option's argument must follow immediately after the option itself,
+    otherwise gpg doesn't know which option the argument is supposed to
+    paired with. As an option, --output and its filename must come before
+    the command. The --recipient (-r) option takes a name or keyID to
+    encrypt the message to, which must come right after the -r option.
+    The --encrypt (or -e) command comes after all the options and is
+    followed by the file you wish to encrypt. Therefore in this example
+    the command-line issued would be:
+
+       $ gpg -r alice -o secret.txt -e test.txt
+
+    If you write the options out in full, it is easier to read:
+
+       $ gpg --recipient alice --output secret.txt --encrypt test.txt
+
+    If you're encrypting to a file with the extension ".txt", then you'd
+    probably expect to see ASCII-armored text in the file (not binary),
+    so you need to add the --armor (-a) option, which doesn't take any
+    arguments:
+
+       $ gpg --armor --recipient alice --output secret.txt --encrypt test.txt
+
+    If you imagine square brackets around the optional parts, it becomes
+    a bit clearer:
+
+       $ gpg [--armor] [--recipient alice] [--output secret.txt] --encrypt test.txt
+
+    The optional parts can be rearranged any way you want:
+
+       $ gpg --output secret.txt --recipient alice --armor --encrypt test.txt
+
+    If your filename begins with a hyphen (e.g. "-a.txt"), GnuPG assumes
+    this is an option and may complain. To avoid this you have to either
+    use "./-a.txt", or stop the option and command processing with two
+    hyphens: "-- -a.txt".
+
+    *The exception to using only one command:* signing and encrypting
+    at the same time. For this you can combine both commands, such as in:
+
+       $ gpg [--options] --sign --encrypt foo.txt
+
+4.5) I can't delete a user ID on my secret keyring because it has
+    already been deleted on my public keyring. What can I do?
+
+    Because you can only select from the public key ring, there is no
+    direct way to do this. However it is not very complicated to do
+    anyway. Create a new user ID with exactly the same name and you
+    will see that there are now two identical user IDs on the secret
+    ring. Now select this user ID and delete it. Both user IDs will be
+    removed from the secret ring.
+
+4.6) I can't delete my secret key because the public key disappeared.
+    What can I do?
+
+    To select a key a search is always done on the public keyring,
+    therefore it is not possible to select a secret key without
+    having the public key. Normally it should never happen that the
+    public key got lost but the secret key is still available. The
+    reality is different, so GnuPG implements a special way to deal
+    with it: Simply use the long keyID to specify the key to delete,
+    which can be obtained by using the --with-colons options (it is
+    the fifth field in the lines beginning with "sec").
+
+    If you've lost your public key and need to recreate it instead
+    for continued use with your secret key, you may be able to use
+    gpgsplit as detailed in question 4.21.
+
+4.7) What are trust, validity and ownertrust?
+
+    With GnuPG, the term "ownertrust" is used instead of "trust" to
+    help clarify that this is the value you have assigned to a key
+    to express how much you trust the owner of this key to correctly
+    sign (and thereby introduce) other keys. The "validity", or
+    calculated trust, is a value which indicates how much GnuPG
+    considers a key as being valid (that it really belongs to the
+    one who claims to be the owner of the key). For more information
+    on trust values see the chapter "The Web of Trust" in The GNU
+    Privacy Handbook.
+
+4.8) How do I sign a patch file?
+
+    Use "gpg --clearsign --not-dash-escaped ...". The problem with
+    --clearsign is that all lines starting with a dash are quoted with
+    "- "; obviously diff produces many lines starting with a dash and
+    these are then quoted and that is not good for a patch ;-). To use
+    a patch file without removing the cleartext signature, the special
+    option --not-dash-escaped may be used to suppress generation of
+    these escape sequences. You should not mail such a patch because
+    spaces and line endings are also subject to the signature and a
+    mailer may not preserve these. If you want to mail a file you can
+    simply sign it using your MUA (Mail User Agent).
+
+4.9) Where is the "encrypt-to-self" option?
+
+    Use "--encrypt-to your_keyID". You can use more than one of these
+    options. To temporarily override the use of this additional key,
+    you can use the option "--no-encrypt-to".
+
+4.10) How can I get rid of the Version and Comment headers in armored
+    messages?
+
+    Use "--no-version --comment ''". Note that the left over blank line
+    is required by the protocol.
+
+4.11) What does the "You are using the xxxx character set." mean?
+
+    This note is printed when UTF-8 mapping has to be done. Make sure
+    that the displayed character set is the one you have activated on
+    your system. Since "iso-8859-1" is the character set most used,
+    this is the default. You can change the charset with the option
+    "--charset". It is important that your active character set matches
+    the one displayed - if not, restrict yourself to plain 7 bit ASCII
+    and no mapping has to be done.
+
+4.12) How can I get list of key IDs used to encrypt a message?
+
+       $ gpg --batch --decrypt --list-only --status-fd 1 2>/dev/null |
+         awk '/^\[GNUPG:\] ENC_TO / { print $3 }'
+
+4.13) Why can't I decrypt files encrypted as symmetrical-only (-c) with
+    a version of GnuPG prior to 1.0.1.
+
+    There was a bug in GnuPG versions prior to 1.0.1 which affected files
+    only if 3DES or Twofish was used for symmetric-only encryption (this has
+    never been the default). The bug has been fixed, but to enable decryption
+    of old files you should run gpg with the option "--emulate-3des-s2k-bug",
+    decrypt the file and encrypt it again without this option.
+
+    NOTE: This option was removed in GnuPG development version 1.1.0 and later
+    updates, so you will need to use a version between 1.0.1 and 1.0.7 to
+    re-encrypt any affected files.
+
+4.14) How can I use GnuPG in an automated environment?
+
+    You should use the option --batch and don't use passphrases as
+    there is usually no way to store it more securely than on the
+    secret keyring itself. The suggested way to create keys for an
+    automated environment is:
+
+    On a secure machine:
+     If you want to do automatic signing, create a signing subkey
+           for your key (use the interactive key editing menu by issueing
+           the command 'gpg --edit-key keyID', enter "addkey" and select
+           the DSA key type).
+     Make sure that you use a passphrase (needed by the current
+           implementation).
+     gpg --export-secret-subkeys --no-comment foo >secring.auto
+     Copy secring.auto and the public keyring to a test directory.
+     Change to this directory.
+     gpg --homedir . --edit foo and use "passwd" to remove the
+           passphrase from the subkeys. You may also want to remove all
+           unused subkeys.
+     Copy secring.auto to a floppy and carry it to the target box.
+
+    On the target machine:
+     Install secring.auto as the secret keyring.
+     Now you can start your new service. It's also a good idea to
+           install an intrusion detection system so that you hopefully
+           get a notice of an successful intrusion, so that you in turn
+           can revoke all the subkeys installed on that machine and
+           install new subkeys.
+
+4.15) Which email-client can I use with GnuPG?
+
+    Using GnuPG to encrypt email is one of the most popular uses.
+    Several mail clients or mail user agents (MUAs) support GnuPG to
+    varying degrees. Simplifying a bit, there are two ways mail can be
+    encrypted with GnuPG: the "old style" ASCII armor (i.e. cleartext
+    encryption), and RFC 2015 style (previously PGP/MIME, now OpenPGP).
+    The latter has full MIME support. Some MUAs support only one of
+    them, so whichever you actually use depends on your needs as well
+    as the capabilities of your addressee. As well, support may be
+    native to the MUA, or provided via "plug-ins" or external tools.
+
+    The following list is not exhaustive:
+
+       MUA            OpenPGP ASCII   How? (N,P,T)
+       -------------------------------------------------------------
+       Calypso           N      Y      P (Unixmail)
+       Elm               N      Y      T (mailpgp,morepgp)
+       Elm ME+           N      Y      N
+       Emacs/Gnus        Y      Y      T (Mailcrypt,gpg.el)
+       Emacs/Mew         Y      Y      N
+       Emacs/VM          N      Y      T (Mailcrypt)
+       Evolution         Y      Y      N
+       Exmh              Y      Y      N
+       GNUMail.app       Y      Y      P (PGPBundle)
+       GPGMail           Y      Y      N
+       KMail (<=1.4.x)   N      Y      N
+       KMail (1.5.x)     Y(P)   Y(N)   P/N
+       Mozilla           Y      Y      P (Enigmail)
+       Mulberry          Y      Y      P
+       Mutt              Y      Y      N
+       Sylpheed          Y      Y      N
+       Sylpheed-claws    Y      Y      N
+       TkRat             Y      Y      N
+       XEmacs/Gnus       Y      Y      T (Mailcrypt)
+       XEmacs/Mew        Y      Y      N
+       XEmacs/VM         N      Y      T (Mailcrypt)
+       XFmail            Y      Y      N
+
+       N - Native, P - Plug-in, T - External Tool
+
+    The following table lists proprietary MUAs. The GNU Project
+    suggests against the use of these programs, but they are listed
+    for interoperability reasons for your convenience.
+
+       MUA            OpenPGP ASCII   How? (N,P,T)
+       -------------------------------------------------------------
+       Apple Mail        Y      Y      P (GPGMail)
+       Becky2            Y      Y      P (BkGnuPG)
+       Eudora            Y      Y      P (EuroraGPG)
+       Eudora Pro        Y      Y      P (EudoraGPG)
+       Lotus Notes       N      Y      P
+       Netscape 4.x      N      Y      P
+       Netscape 7.x      Y      Y      P (Enigmail)
+       Novell Groupwise  N      Y      P
+       Outlook           N      Y      P (G-Data)
+       Outlook Express   N      Y      P (GPGOE)
+       Pegasus           N      Y      P (QDPGP,PM-PGP)
+       Pine              N      Y      T (pgpenvelope,(gpg|pgp)4pine)
+       Postme            N      Y      P (GPGPPL)
+       The Bat!          N      Y      P (Ritlabs)
+
+    Good overviews of OpenPGP-support can be found at:
+    <http://www.openpgp.fr.st/courrier_en.html> and
+    <http://www.bretschneidernet.de/tips/secmua.html>.
+
+    Users of Win32 MUAs that lack OpenPGP support may look into
+    using GPGrelay <http://gpgrelay.sourceforge.net>, a small
+    email-relaying server that uses GnuPG to enable many email clients
+    to send and receive emails that conform to PGP-MIME (RFC 2015).
+
+4.16) Can't we have a gpg library?
+
+    This has been frequently requested. However, the current viewpoint
+    of the GnuPG maintainers is that this would lead to several security
+    issues and will therefore not be implemented in the foreseeable
+    future. However, for some areas of application gpgme could do the
+    trick. You'll find it at <ftp://ftp.gnupg.org/gcrypt/alpha/gpgme>.
+
+4.17) I have successfully generated a revocation certificate, but I don't
+    understand how to send it to the key servers.
+
+    Most keyservers don't accept a 'bare' revocation certificate. You
+    have to import the certificate into gpg first:
+
+       $ gpg --import my-revocation.asc
+
+    then send the revoked key to the keyservers:
+
+       $ gpg --keyserver certserver.pgp.com --send-keys mykeyid
+
+    (or use a keyserver web interface for this).
+
+4.18) How do I put my keyring in a different directory?
+
+    GnuPG keeps several files in a special homedir directory. These
+    include the options file, pubring.gpg, secring.gpg, trustdb.gpg,
+    and others. GnuPG will always create and use these files. On unices,
+    the homedir is usually ~/.gnupg; on Windows "C:\gnupg\".
+
+    If you want to put your keyrings somewhere else, use the option:
+
+       --homedir /my/path/
+
+    to make GnuPG create all its files in that directory. Your keyring
+    will be "/my/path/pubring.gpg". This way you can store your secrets
+    on a floppy disk. Don't use "--keyring" as its purpose is to specify
+    additional keyring files.
+
+4.19) How do I verify signed packages?
+
+    Before you can verify the signature that accompanies a package,
+    you must first have the vendor, organisation, or issueing person's
+    key imported into your public keyring. To prevent GnuPG warning
+    messages the key should also be validated (or locally signed).
+
+    You will also need to download the detached signature file along
+    with the package. These files will usually have the same name as
+    the package, with either a binary (.sig) or ASCII armor (.asc)
+    extension.
+
+    Once their key has been imported, and the package and accompanying
+    signature files have been downloaded, use:
+
+       $ gpg --verify sigfile signed-file
+
+    If the signature file has the same base name as the package file,
+    the package can also be verified by specifying just the signature
+    file, as GnuPG will derive the package's file name from the name
+    given (less the .sig or .asc extension). For example, to verify a
+    package named foobar.tar.gz against its detached binary signature
+    file, use:
+
+       $ gpg --verify foobar.tar.gz.sig
+
+4.20) How do I export a keyring with only selected signatures (keys)?
+
+    If you're wanting to create a keyring with only a subset of keys
+    selected from a master keyring (for a club, user group, or company
+    department for example), simply specify the keys you want to export:
+
+       $ gpg --armor --export key1 key2 key3 key4 > keys1-4.asc
+
+4.21) I still have my secret key, but lost my public key. What can I do?
+
+    All OpenPGP secret keys have a copy of the public key inside them,
+    and in a worst-case scenario, you can create yourself a new public
+    key using the secret key.
+
+    A tool to convert a secret key into a public one has been included
+    (it's actually a new option for gpgsplit) and is available with GnuPG
+    versions 1.2.1 or later (or can be found in CVS). It works like this:
+
+       $ gpgsplit --no-split --secret-to-public secret.gpg >publickey.gpg
+
+    One should first try to export the secret key and convert just this
+    one. Using the entire secret keyring should work too. After this has
+    been done, the publickey.gpg file can be imported into GnuPG as usual.
+
+4.22) Clearsigned messages sent from my web-mail account have an invalid
+    signature. Why?
+
+    Check to make sure the settings for your web-based email account
+    do not use HTML formatting for the pasted clearsigned message. This can
+    alter the message with embedded HTML markup tags or spaces, resulting
+    in an invalid signature. The recipient may be able to copy the signed
+    message block to a text file for verification, or the web email
+    service may allow you to attach the clearsigned message as a file
+    if plaintext messages are not an option.
+
+
+5. COMPATIBILITY ISSUES
+
+5.1) How can I encrypt a message with GnuPG so that PGP is able to decrypt it?
+
+    It depends on the PGP version.
+
+    PGP 2.x
+    You can't do that because PGP 2.x normally uses IDEA which is not
+    supported by GnuPG as it is patented (see 3.3), but if you have a
+    modified version of PGP you can try this:
+
+       $ gpg --rfc1991 --cipher-algo 3des ...
+
+    Please don't pipe the data to encrypt to gpg but provide it using a
+    filename; otherwise, PGP 2 will not be able to handle it.
+
+    As for conventional encryption, you can't do this for PGP 2.
+
+    PGP 5.x and higher
+    You need to provide two additional options:
+
+       --compress-algo 1 --cipher-algo cast5
+
+    You may also use "3des" instead of "cast5", and "blowfish" does not
+    work with all versions of PGP 5. You may also want to put:
+
+       compress-algo 1
+
+    into your ~/.gnupg/options file - this does not affect normal GnuPG
+    operation.
+
+    This applies to conventional encryption as well.
+
+5.2) How do I migrate from PGP 2.x to GnuPG?
+
+    PGP 2 uses the RSA and IDEA encryption algorithms. Whereas the RSA
+    patent has expired and RSA is included as of GnuPG 1.0.3, the IDEA
+    algorithm is still patented until 2007. Under certain conditions you
+    may use IDEA even today. In that case, you may refer to Question
+    3.3 about how to add IDEA support to GnuPG and read
+    <http://www.gnupg.org/gph/en/pgp2x.html> to perform the migration.
+
+5.3) (removed)
+
+    (empty)
+
+5.4) Why is PGP 5.x not able to encrypt messages with some keys?
+
+    PGP, Inc. refuses to accept Elgamal keys of type 20 even for
+    encryption. They only support type 16 (which is identical at least
+    for decryption). To be more inter-operable, GnuPG (starting with
+    version 0.3.3) now also uses type 16 for the Elgamal subkey which is
+    created if the default key algorithm is chosen. You may add a type
+    16 Elgamal key to your public key, which is easy as your key
+    signatures are still valid.
+
+5.5) Why is PGP 5.x not able to verify my messages?
+
+    PGP 5.x does not accept v4 signatures for data material but OpenPGP
+    requests generation of v4 signatures for all kind of data, that's why
+    GnuPG defaults to them. Use the option "--force-v3-sigs" to generate
+    v3 signatures for data.
+
+5.6) How do I transfer owner trust values from PGP to GnuPG?
+
+    There is a script in the tools directory to help you. After you have
+    imported the PGP keyring you can give this command:
+
+       $ lspgpot pgpkeyring | gpg --import-ownertrust
+
+    where pgpkeyring is the original keyring and not the GnuPG keyring
+    you might have created in the first step.
+
+5.7) PGP does not like my secret key.
+
+    Older PGPs probably bail out on some private comment packets used by
+    GnuPG. These packets are fully in compliance with OpenPGP; however
+    PGP is not really OpenPGP aware. A workaround is to export the
+    secret keys with this command:
+
+       $ gpg --export-secret-keys --no-comment -a your-KeyID
+
+    Another possibility is this: by default, GnuPG encrypts your secret
+    key using the Blowfish symmetric algorithm. Older PGPs will only
+    understand 3DES, CAST5, or IDEA symmetric algorithms. Using the
+    following method you can re-encrypt your secret gpg key with a
+    different algo:
+
+       $ gpg --s2k-cipher-algo=CAST5 --s2k-digest-algo=SHA1
+         --compress-algo=1  --edit-key <username>
+
+    Then use passwd to change the password (just change it to the same
+    thing, but it will encrypt the key with CAST5 this time).
+
+    Now you can export it and PGP should be able to handle it.
+
+    For PGP 6.x the following options work to export a key:
+
+       $ gpg --s2k-cipher-algo 3des --compress-algo 1 --rfc1991
+         --export-secret-keys <KeyID>
+
+5.8) GnuPG no longer installs a ~/.gnupg/options file. Is it missing?
+
+    No. The ~/.gnupg/options file has been renamed to ~/.gnupg/gpg.conf for
+    new installs as of version 1.1.92. If an existing ~/.gnupg/options file
+    is found during an upgrade it will still be used, but this change was
+    required to have a more consistent naming scheme with forthcoming tools.
+    An existing options file can be renamed to gpg.conf for users upgrading,
+    or receiving the message that the "old default options file" is ignored
+    (occurs if both a gpg.conf and an options file are found).
+
+5.9) How do you export GnuPG keys for use with PGP?
+
+    This has come up fairly often, so here's the HOWTO:
+
+    PGP can (for most key types) use secret keys generated by GnuPG. The
+    problems that come up occasionally are generally because GnuPG
+    supports a few more features from the OpenPGP standard than PGP does.
+    If your secret key has any of those features in use, then PGP will
+    reject the key or you will have problems communicating later. Note
+    that PGP doesn't do Elgamal signing keys at all, so they are not
+    usable with any version.
+
+    These instructions should work for GnuPG 1.0.7 and later, and PGP
+    7.0.3 and later.
+
+    Start by editing the key. Most of this line is not really necessary
+    as the default values are correct, but it does not hurt to repeat the
+    values, as this will override them in case you have something else set
+    in your options file.
+
+       $ gpg --s2k-cipher-algo cast5 --s2k-digest-algo sha1 --s2k-mode 3
+         --simple-sk-checksum --edit KeyID
+
+    Turn off some features. Set the list of preferred ciphers, hashes,
+    and compression algorithms to things that PGP can handle. (Yes, I
+    know this is an odd list of ciphers, but this is what PGP itself uses,
+    minus IDEA).
+
+       > setpref S9 S8 S7 S3 S2 S10 H2 H3 Z1 Z0
+
+    Now put the list of preferences onto the key.
+
+       > updpref
+
+    Finally we must decrypt and re-encrypt the key, making sure that we
+    encrypt with a cipher that PGP likes. We set this up in the --edit
+    line above, so now we just need to change the passphrase to make it
+    take effect. You can use the same passphrase if you like, or take
+    this opportunity to actually change it.
+
+       > passwd
+
+    Save our work.
+
+       > save
+
+    Now we can do the usual export:
+
+       $ gpg --export KeyID > mypublickey.pgp
+       $ gpg --export-secret-key KeyID > mysecretkey.pgp
+
+    Thanks to David Shaw for this information!
+
+
+6. PROBLEMS and ERROR MESSAGES
+
+6.1) Why do I get "gpg: Warning: using insecure memory!"
+
+    On many systems this program should be installed as setuid(root).
+    This is necessary to lock memory pages. Locking memory pages prevents
+    the operating system from writing them to disk and thereby keeping your
+    secret keys really secret. If you get no warning message about insecure
+    memory your operating system supports locking without being root. The
+    program drops root privileges as soon as locked memory is allocated.
+
+    To setuid(root) permissions on the gpg binary you can either use:
+
+       $ chmod u+s /path/to/gpg
+
+    or
+
+       $ chmod 4755 /path/to/gpg
+
+    Some refrain from using setuid(root) unless absolutely required for
+    security reasons. Please check with your system administrator if you
+    are not able to make these determinations yourself. 
+
+    On UnixWare 2.x and 7.x you should install GnuPG with the 'plock'
+    privilege to get the same effect:
+
+       $ filepriv -f plock /path/to/gpg
+
+    If you can't or don't want to install GnuPG setuid(root), you can
+    use the option "--no-secmem-warning" or put:
+
+       no-secmem-warning
+
+    in your ~/.gnupg/options or ~/.gnupg/gpg.conf file (this disables
+    the warning).
+
+    On some systems (e.g., Windows) GnuPG does not lock memory pages
+    and older GnuPG versions (<=1.0.4) issue the warning:
+
+       gpg: Please note that you don't have secure memory
+
+    This warning can't be switched off by the above option because it
+    was thought to be too serious an issue. However, it confused users
+    too much, so the warning was eventually removed.
+
+6.2) Large File Support doesn't work ...
+
+    LFS works correctly in post-1.0.4 versions. If configure doesn't
+    detect it, try a different (i.e., better) compiler. egcs 1.1.2 works
+    fine, other gccs sometimes don't. BTW, several compilation problems
+    of GnuPG 1.0.3 and 1.0.4 on HP-UX and Solaris were due to broken LFS
+    support.
+
+6.3) In the edit menu the trust values are not displayed correctly after
+    signing uids. Why?
+
+    This happens because some information is stored immediately in
+    the trustdb, but the actual trust calculation can be done after the
+    save command. This is a "not easy to fix" design bug which will be
+    addressed in some future release.
+
+6.4) What does "skipping pubkey 1: already loaded" mean?
+
+    As of GnuPG 1.0.3, the RSA algorithm is included. If you still have
+    a "load-extension rsa" in your options file, the above message
+    occurs. Just remove the load command from the options file.
+
+6.5) GnuPG 1.0.4 doesn't create ~/.gnupg ...
+
+    That's a known bug, already fixed in newer versions.
+
+6.6) An Elgamal signature does not verify anymore since version 1.0.2 ...
+
+    Use the option --emulate-md-encode-bug.
+
+6.7) Old versions of GnuPG can't verify Elgamal signatures
+
+    Update to GnuPG 1.0.2 or newer.
+
+6.8) When I use --clearsign, the plain text has sometimes extra dashes
+    in it - why?
+
+    This is called dash-escaped text and is required by OpenPGP.
+    It always happens when a line starts with a dash ("-") and is
+    needed to make the lines that structure signature and text
+    (i.e., "-----BEGIN PGP SIGNATURE-----") to be the only lines
+    that start with two dashes.
+
+    If you use GnuPG to process those messages, the extra dashes
+    are removed. Good mail clients remove those extra dashes when
+    displaying such a message.      
+
+6.9) What is the thing with "can't handle multiple signatures"?
+
+    Due to different message formats GnuPG is not always able to split
+    a file with multiple signatures unambiguously into its parts. This
+    error message informs you that there is something wrong with the input.
+
+    The only way to have multiple signatures in a file is by using the
+    OpenPGP format with one-pass-signature packets (which is GnuPG's
+    default) or the cleartext signed format.
+
+6.10) If I submit a key to a keyserver, nothing happens ...
+
+    You are most likely using GnuPG 1.0.2 or older on Windows. That's
+    feature isn't yet implemented, but it's a bug not to say it. Newer
+    versions issue a warning. Upgrade to 1.0.4 or newer.
+
+6.11) I get "gpg: waiting for lock ..."
+
+    A previous instance of gpg has most likely exited abnormally and left
+    a lock file. Go to ~/.gnupg and look for .*.lock files and remove them.
+
+6.12) Older gpg binaries (e.g., 1.0) have problems with keys from newer
+    gpg binaries ...
+
+    As of 1.0.3, keys generated with gpg are created with preferences to
+    TWOFISH (and AES since 1.0.4) and that also means that they have the
+    capability to use the new MDC encryption method. This will go into
+    OpenPGP soon, and is also suppoted by PGP 7. This new method avoids
+    a (not so new) attack on all email encryption systems.
+
+    This in turn means that pre-1.0.3 gpg binaries have problems with
+    newer keys. Because of security and bug fixes, you should keep your
+    GnuPG installation in a recent state anyway. As a workaround, you can
+    force gpg to use a previous default cipher algo by putting:
+
+       cipher-algo cast5
+
+    into your options file.
+
+6.13) With 1.0.4, I get "this cipher algorithm is deprecated ..."
+
+    If you just generated a new key and get this message while
+    encrypting, you've witnessed a bug in 1.0.4. It uses the new AES
+    cipher Rijndael that is incorrectly being referred as "deprecated".
+    Ignore this warning, more recent versions of gpg are corrected.
+
+6.14) Some dates are displayed as ????-??-??. Why?
+
+    Due to constraints in most libc implementations, dates beyond
+    2038-01-19 can't be displayed correctly. 64-bit OSes are not
+    affected by this problem. To avoid printing wrong dates, GnuPG
+    instead prints some question marks. To see the correct value, you
+    can use the options --with-colons and --fixed-list-mode.
+
+6.15) I still have a problem. How do I report a bug?
+
+    Are you sure that it's not been mentioned somewhere on the mailing
+    lists? Did you have a look at the bug list (you'll find a link to
+    the list of reported bugs on the documentation page). If you're not
+    sure about it being a bug, you can send mail to the gnupg-devel
+    list. Otherwise, use the GUUG bug tracking system 
+    <http://bugs.guug.de/Reporting.html>.
+
+6.16) Why doesn't GnuPG support X.509 certificates?
+
+    GnuPG, first and foremost, is an implementation of the OpenPGP
+    standard (RFC 2440), which is a competing infrastructure, different
+    from X.509.
+
+    They are both public-key cryptosystems, but how the public keys are
+    actually handled is different.
+
+6.17) Why do national characters in my user ID look funny?
+
+    According to OpenPGP, GnuPG encodes user ID strings (and other
+    things) using UTF-8. In this encoding of Unicode, most national
+    characters get encoded as two- or three-byte sequences. For
+    example, &aring; (0xE5 in ISO-8859-1) becomes &Atilde;&yen; (0xC3,
+    0xA5). This might also be the reason why keyservers can't find
+    your key.
+
+6.18) I get 'sed' errors when running ./configure on Mac OS X ...
+
+    This will be fixed after GnuPG has been upgraded to autoconf-2.50.
+    Until then, find the line setting CDPATH in the configure script
+    and place an:
+
+       unset CDPATH
+
+    statement below it.
+
+6.19) Why does GnuPG 1.0.6 bail out on keyrings used with 1.0.7?
+
+    There is a small bug in 1.0.6 which didn't parse trust packets
+    correctly. You may want to apply this patch if you can't upgrade:
+
+    <http://www.gnupg.org/developer/gpg-woody-fix.txt>
+
+6.20) I upgraded to GnuPG version 1.0.7 and now it takes longer to load my
+    keyrings. What can I do?
+
+    The way signature states are stored has changed so that v3 signatures
+    can be supported. You can use the new --rebuild-keydb-caches migration
+    command, which was built into this release and increases the speed of
+    many operations for existing keyrings.
+
+6.21) Doesn't a fully trusted user ID on a key prevent warning messages
+    when encrypting to other IDs on the key?
+
+    No. That was actually a key validity bug in GnuPG 1.2.1 and earlier
+    versions. As part of the development of GnuPG 1.2.2, a bug was
+    discovered in the key validation code.  This bug causes keys with
+    more than one user ID to give all user IDs on the key the amount of
+    validity given to the most-valid key. The bug has been fixed in GnuPG
+    release 1.2.2, and upgrading is the recommended fix for this problem.
+    More information and a patch for a some pre-1.2.2 versions of GnuPG
+    can be found at:
+
+    <http://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000268.html>
+
+6.22) I just compiled GnuPG from source on my GNU/Linux RPM-based system
+    and it's not working. Why?
+
+    Many GNU/Linux distributions that are RPM-based will install a
+    version of GnuPG as part of its standard installation, placing the
+    binaries in the /usr/bin directory. Later, compiling and installing
+    GnuPG from source other than from a source RPM won't normally
+    overwrite these files, as the default location for placement of
+    GnuPG binaries is in /usr/local/bin unless the '--prefix' switch
+    is used during compile to specify an alternate location. Since the
+    /usr/bin directory more than likely appears in your path before
+    /usr/local/bin, the older RPM-version binaries will continue to
+    be used when called since they were not replaced.
+
+    To resolve this, uninstall the RPM-based version with 'rpm -e gnupg'
+    before installing the binaries compiled from source. If dependency
+    errors are displayed when attempting to uninstall the RPM (such as
+    when Red Hat's up2date is also installed, which uses GnuPG), uninstall
+    the RPM with 'rpm -e gnupg --nodeps' to force the uninstall. Any
+    dependent files should be automatically replaced during the install
+    of the compiled version. If the default /usr/local/bin directory is
+    used, some packages such as SuSE's Yast Online Update may need to be
+    configured to look for GnuPG binaries in the /usr/local/bin directory,
+    or symlinks can be created in /usr/bin that point to the binaries
+    located in /usr/local/bin.
+
+
+7. ADVANCED TOPICS
+
+7.1) How does this whole thing work?
+
+    To generate a secret/public keypair, run:
+
+       $ gpg --gen-key
+
+    and choose the default values.
+
+    Data that is encrypted with a public key can only be decrypted by
+    the matching secret key. The secret key is protected by a password,
+    the public key is not.
+
+    So to send your friend a message, you would encrypt your message
+    with his public key, and he would only be able to decrypt it by
+    having the secret key and putting in the password to use his secret
+    key.
+
+    GnuPG is also useful for signing things. Files that are encrypted
+    with the secret key can be decrypted with the public key. To sign
+    something, a hash is taken of the data, and then the hash is in some
+    form encoded with the secret key. If someone has your public key, they
+    can verify that it is from you and that it hasn't changed by checking
+    the encoded form of the hash with the public key.
+
+    A keyring is just a large file that stores keys. You have a public
+    keyring where you store yours and your friend's public keys. You have
+    a secret keyring that you keep your secret key on, and should be very
+    careful with. Never ever give anyone else access to it and use a *good*
+    passphrase to protect the data in it.
+
+    You can 'conventionally' encrypt something by using the option 'gpg -c'.
+    It is encrypted using a passphrase, and does not use public and secret
+    keys. If the person you send the data to knows that passphrase, they
+    can decrypt it. This is usually most useful for encrypting things to
+    yourself, although you can encrypt things to your own public key in the
+    same way. It should be used for communication with partners you know
+    and where it is easy to exchange the passphrases (e.g. with your boy
+    friend or your wife). The advantage is that you can change the
+    passphrase from time to time and decrease the risk, that many old
+    messages may be decrypted by people who accidently got your passphrase.
+
+    You can add and copy keys to and from your keyring with the 'gpg
+    --import' and 'gpg --export' command. 'gpg --export-secret-keys' will
+    export secret keys. This is normally not useful, but you can generate
+    the key on one machine then move it to another machine.
+
+    Keys can be signed under the 'gpg --edit-key' option. When you sign a
+    key, you are saying that you are certain that the key belongs to the
+    person it says it comes from. You should be very sure that is really
+    that person: You should verify the key fingerprint with:
+
+       $ gpg --fingerprint KeyID
+
+    over the phone (if you really know the voice of the other person), at
+    a key signing party (which are often held at computer conferences),
+    or at a meeting of your local GNU/Linux User Group.
+
+    Hmm, what else. You may use the option '-o filename' to force output
+    to this filename (use '-' to force output to stdout). '-r' just lets
+    you specify the recipient (which public key you encrypt with) on the
+    command line instead of typing it interactively.
+
+    Oh yeah, this is important. By default all data is encrypted in some
+    weird binary format. If you want to have things appear in ASCII text
+    that is readable, just add the '-a' option. But the preferred method
+    is to use a MIME aware mail reader (Mutt, Pine and many more).
+
+    There is a small security glitch in the OpenPGP (and therefore GnuPG)
+    system; to avoid this you should always sign and encrypt a message
+    instead of only encrypting it.
+
+7.2) Why are some signatures with an ELG-E key valid?
+
+    These are Elgamal keys generated by GnuPG in v3 (RFC 1991) packets.
+    The OpenPGP draft later changed the algorithm identifier for Elgamal
+    keys which are usable for signatures and encryption from 16 to 20.
+    GnuPG now uses 20 when it generates new Elgamal keys but still
+    accepts 16 (which is according to OpenPGP "encryption only") if this
+    key is in a v3 packet. GnuPG is the only program which had used
+    these v3 Elgamal keys - so this assumption is quite safe.
+
+7.3) How does the whole trust thing work?
+
+    It works more or less like PGP. The difference is that the trust is
+    computed at the time it is needed. This is one of the reasons for
+    the trustdb which holds a list of valid key signatures. If you are
+    not running in batch mode you will be asked to assign a trust
+    parameter (ownertrust) to a key.
+
+    You can see the validity (calculated trust value) using this
+    command.
+
+       $ gpg --list-keys --with-colons
+
+    If the first field is "pub" or "uid", the second field shows you the
+    trust:
+
+       o = Unknown (this key is new to the system)
+       e = The key has expired
+       q = Undefined (no value assigned)
+       n = Don't trust this key at all
+       m = There is marginal trust in this key
+       f = The key is full trusted
+       u = The key is ultimately trusted; this is only used
+           for keys for which the secret key is also available.
+       r = The key has been revoked
+       d = The key has been disabled
+
+    The value in the "pub" record is the best one of all "uid" records.
+    You can get a list of the assigned trust values (how much you trust
+    the owner to correctly sign another person's key) with:
+
+       $ gpg --list-ownertrust
+
+    The first field is the fingerprint of the primary key, the second
+    field is the assigned value:
+
+       - = No ownertrust value yet assigned or calculated.
+       n = Never trust this keyholder to correctly verify others signatures.
+       m = Have marginal trust in the keyholders capability to sign other
+           keys.
+       f = Assume that the key holder really knows how to sign keys.
+       u = No need to trust ourself because we have the secret key.
+
+    Keep these values confidential because they express your opinions
+    about others. PGP stores this information with the keyring thus it
+    is not a good idea to publish a PGP keyring instead of exporting the
+    keyring. GnuPG stores the trust in the trustdb.gpg file so it is okay
+    to give a gpg keyring away (but we have a --export command too).
+
+7.4) What kind of output is this: "key C26EE891.298, uid 09FB: ...."?
+
+    This is the internal representation of a user ID in the trustdb.
+    "C26EE891" is the keyid, "298" is the local ID (a record number in
+    the trustdb) and "09FB" is the last two bytes of a ripe-md-160 hash
+    of the user ID for this key.
+
+7.5) How do I interpret some of the informational outputs?
+
+    While checking the validity of a key, GnuPG sometimes prints some
+    information which is prefixed with information about the checked
+    item.
+
+       "key 12345678.3456"
+
+    This is about the key with key ID 12345678 and the internal number
+    3456, which is the record number of the so called directory record
+    in the trustdb.
+
+       "uid 12345678.3456/ACDE"
+
+    This is about the user ID for the same key. To identify the user ID
+    the last two bytes of a ripe-md-160 over the user ID ring is printed.
+
+       "sig 12345678.3456/ACDE/9A8B7C6D"
+
+    This is about the signature with key ID 9A8B7C6D for the above key
+    and user ID, if it is a signature which is direct on a key, the user
+    ID part is empty (..//..).
+
+7.6) Are the header lines of a cleartext signature part of the signed
+    material?
+
+    No. For example you can add or remove "Comment:" lines. They have
+    a purpose like the mail header lines. However a "Hash:" line is
+    needed for OpenPGP signatures to tell the parser which hash
+    algorithm to use.
+
+7.7) What is the list of preferred algorithms?
+
+    The list of preferred algorithms is a list of cipher, hash and
+    compression algorithms stored in the self-signature of a key during
+    key generation. When you encrypt a document, GnuPG uses this list
+    (which is then part of a public key) to determine which algorithms
+    to use. Basically it tells other people what algorithms the
+    recipient is able to handle and provides an order of preference.
+
+7.8) How do I change the list of preferred algorithms?
+
+    In version 1.0.7 or later, you can use the edit menu and set the
+    new list of preference using the command "setpref"; the format of
+    this command resembles the output of the command "pref". The
+    preference is not changed immediately but the set preference will
+    be used when a new user ID is created. If you want to update the
+    preferences for existing user IDs, select those user IDs (or select
+    none to update all) and enter the command "updpref". Note that the
+    timestamp of the self-signature is increased by one second when
+    running this command.
+
+
+8. ACKNOWLEDGEMENTS
+
+    Many thanks to Nils Ellmenreich for maintaining this FAQ file for
+    such a long time, Werner Koch for the original FAQ file, and to all
+    posters to gnupg-users and gnupg-devel. They all provided most of
+    the answers.
+
+    Also thanks to Casper Dik for providing us with a script to generate
+    this FAQ (he uses it for the excellent Solaris2 FAQ).
+
+
+Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02111, USA
+
+Verbatim copying and distribution of this entire article is permitted in
+any medium, provided this notice is preserved.
diff --git a/doc/HACKING b/doc/HACKING
new file mode 100644 (file)
index 0000000..eee9f62
--- /dev/null
@@ -0,0 +1,305 @@
+                     A Hacker's Guide to GNUPG
+                  ================================
+                  (Some notes on GNUPG internals.)
+
+
+                  ===> Under construction <=======
+
+
+CVS Access
+==========
+
+NOTE: CVS access has been disabled while we are migrating to Subversion.
+Watch www.gnupg.org for instarctions on how to use the Subversion repository.
+
+Anonymous read-only CVS access is available:
+
+  cvs -z3 -d :pserver:anoncvs@cvs.gnupg.org:/cvs/gnupg login
+
+use the password "anoncvs".  To check out the the complete
+archive use:
+
+  cvs -z3 -d :pserver:anoncvs@cvs.gnupg.org:/cvs/gnupg \
+        checkout -R STABLE-BRANCH-1-0 gnupg
+
+This service is provided to help you in hunting bugs and not to deliver
+stable snapshots; it may happen that it even does not compile, so please
+don't complain. CVS may put a high load on a server, so please don't poll
+poll for new updates but wait for an announcement; to receive this you may
+want to subscribe to:
+
+    gnupg-commit-watchers@gnupg.org
+
+by sending a mail with subject "subscribe" to
+
+    gnupg-commit-watchers-request@gnupg.org
+
+
+You must run scripts/autogen.sh before doing the ./configure,
+as this creates some needed while which are not in the CVS.
+autogen.sh should checks that you have all required tools
+installed.
+
+
+RSYNC access
+============
+The FTP archive is also available by anonymous rsync.  A daily snapshot
+of the CVS head revision is also available.  See rsync(1) and try
+"rsync ftp.gnupg.org::" to see available resources.
+
+
+
+Special Tools
+=============
+Documentation is based on the docbook DTD.  Actually we have only the
+man page for now.  To build a man page you need the docbook-to-man
+tool and all the other thinks needed for SGML processing.  Debian
+comes with the docbook tools and you only need this docbook-to-man
+script which is comes with gtk-doc or download it from
+ftp.openit.de:/pub/devel/sgml. If you don't have it everything
+should still work fine but you will have only a dummy man page.
+
+
+RFCs
+====
+
+1423  Privacy Enhancement for Internet Electronic Mail:
+      Part III: Algorithms, Modes, and Identifiers.
+
+1489  Registration of a Cyrillic Character Set.
+
+1750  Randomness Recommendations for Security.
+
+1991  PGP Message Exchange Formats.
+
+2015  MIME Security with Pretty Good Privacy (PGP).
+
+2144  The CAST-128 Encryption Algorithm.
+
+2279  UTF-8, a transformation format of ISO 10646.
+
+2440  OpenPGP.
+
+
+
+Debug Flags
+-----------
+Use the option "--debug n" to output debug information. This option
+can be used multiple times, all values are ORed; n maybe prefixed with
+0x to use hex-values.
+
+     value  used for
+     -----  ----------------------------------------------
+      1     packet reading/writing
+      2     MPI details
+      4     ciphers and primes (may reveal sensitive data)
+      8     iobuf filter functions
+      16    iobuf stuff
+      32    memory allocation stuff
+      64    caching
+      128   show memory statistics at exit
+      256   trust verification stuff
+
+
+
+
+Directory Layout
+----------------
+  ./           Readme, configure
+  ./scripts    Scripts needed by configure and others
+  ./doc        Documentation
+  ./util       General purpose utility function
+  ./mpi        Multi precision integer library
+  ./cipher     Cryptographic functions
+  ./g10        GnuPG application
+  ./tools      Some helper and demo programs
+  ./keybox     The keybox library (under construction)
+  ./gcrypt     Stuff needed to build libgcrypt (under construction)
+
+
+Detailed Roadmap
+----------------
+g10/g10.c      Main module with option parsing and all the stuff you have
+               to do on startup.  Also has the exout handler and some
+               helper functions.
+g10/sign.c      Create signature and optionally encrypt
+
+g10/parse-packet.c
+g10/build-packet.c
+g10/free-packet.c
+               Parsing and creating of OpenPGP message packets.
+
+g10/getkey.c    Key selection code
+g10/pkclist.c   Build a list of public keys
+g10/skclist.c   Build a list of secret keys
+g10/ringedit.c  Keyring I/O
+g10/keydb.h
+
+g10/keyid.c    Helper functions to get the keyid, fingerprint etc.
+
+
+g10/trustdb.c    
+g10/trustdb.h
+g10/tdbdump.c
+               Management of the trustdb.gpg
+
+g10/compress.c Filter to handle compression
+g10/filter.h   Declarations for all filter functions
+g10/delkey.c   Delete a key
+g10/kbnode.c   Helper for the KBNODE linked list
+g10/main.h     Prototypes and some constants
+g10/mainproc.c Message processing
+g10/armor.c    Ascii armor filter 
+g10/mdfilter.c Filter to calculate hashs
+g10/textfilter.c Filter to handle CR/LF and trailing white space
+g10/cipher.c   En-/Decryption filter
+g10/misc.c     Utlity functions
+g10/options.h  Structure with all the command line options
+               and related constants
+g10/openfile.c Create/Open Files
+g10/tdbio.c    I/O handling for the trustdb.gpg
+g10/tdbio.h
+g10/hkp.h      Keyserver access
+g10/hkp.c
+g10/packet.h   Defintion of OpenPGP structures.
+g10/passphrase.c  Passphrase handling code
+g10/pubkey-enc.c  
+g10/seckey-cert.c
+g10/seskey.c
+g10/import.c
+g10/export.c
+g10/comment.c
+g10/status.c
+g10/status.h
+g10/sign.c
+g10/plaintext.c
+g10/encr-data.c
+g10/encode.c
+g10/revoke.c
+g10/keylist.c
+g10/sig-check.c
+g10/signal.c
+g10/helptext.c
+g10/verify.c
+g10/decrypt.c
+g10/keyedit.c
+g10/dearmor.c
+g10/keygen.c
+
+
+
+Memory allocation
+-----------------
+Use only the functions:
+
+    m_alloc()
+    m_alloc_clear()
+    m_strdup()
+    m_free()
+
+If you want to store a passphrase or some other sensitive data you may
+want to use m_alloc_secure() instead of m_alloc(), as this puts the data
+into a memory region which is protected from swapping (on some platforms).
+m_free() works for both.  This functions will not return if there is not
+enough memory available.
+
+
+
+Logging
+-------
+
+
+
+
+
+
+Option parsing
+---------------
+GNUPG does not use getopt or GNU getopt but functions of it's own.  See
+util/argparse.c for details.  The advantage of these functions is that
+it is more easy to display and maintain the help texts for the options.
+The same option table is also used to parse resource files.
+
+
+
+What is an IOBUF
+----------------
+This is the data structure used for most I/O of gnupg. It is similar
+to System V Streams but much simpler.  Because OpenPGP messages are nested
+in different ways; the use of such a system has big advantages.  Here is
+an example, how it works:  If the parser sees a packet header with a partial
+length, it pushes the block_filter onto the IOBUF to handle these partial
+length packets: from now on you don't have to worry about this.  When it sees
+a compressed packet it pushes the uncompress filter and the next read byte
+is one which has already been uncompressed by this filter. Same goes for
+enciphered packet, plaintext packets and so on.  The file g10/encode.c
+might be a good staring point to see how it is used  - actually this is
+the other way: constructing messages using pushed filters but it may be
+easier to understand.
+
+
+How to use the message digest functions
+---------------------------------------
+cipher/md.c implements an interface to hash (message digest functions).
+
+a) If you have a common part of data and some variable parts
+   and you need to hash of the concatenated parts, you can use this:
+       md = md_open(...)
+       md_write( md,  common_part )
+       md1 = md_copy( md )
+       md_write(md1, part1)
+       md_final(md1);
+       digest1 = md_read(md1)
+       md2 = md_copy( md )
+       md_write(md2, part2)
+       md_final(md2);
+       digest2 = md_read(md2)
+
+   An example are key signatures; the key packet is the common part
+   and the user-id packets are the variable parts.
+
+b) If you need a running digest you should use this:
+       md = md_open(...)
+       md_write( md, part1 )
+       digest_of_part1 = md_digest( md );
+       md_write( md, part2 )
+       digest_of_part1_cat_part2 = md_digest( md );
+       ....
+
+Both methods may be combined. [Please see the source for the real syntax]
+
+
+
+
+How to use the cipher functions
+-------------------------------
+cipher/cipher.c implements the interface to symmetric encryption functions.
+As usual you have a function to open a cipher (which returns a handle to be used
+with all other functions), some functions to set the key and other stuff and
+a encrypt and decrypt function which does the real work.  You probably know
+how to work with files - so it should really be easy to work with these
+functions.  Here is an example:
+
+    CIPHER_HANDLE hd;
+
+    hd = cipher_open( CIPHER_ALGO_TWOFISH, CIPHER_MODE_CFB, 0 );
+    if( !hd )
+       oops( use other function to check for the real error );
+    rc = cipher_setkey( hd, key256bit, 32 ) )
+    if( rc )
+       oops( weak key or something like this );
+    cipher_setiv( hd, some_IV_or_NULL_for_all_zeroes );
+    cipher_encrypt( hd, plain, cipher, size );
+    cipher_close( hd );
+
+
+
+How to use the public key functions
+-----------------------------------
+cipher/pubkey.c implements the interface to asymmetric encryption and
+signature functions. This is basically the same as with the symmetric
+counterparts, but due to their nature it is a little bit more complicated.
+
+   [Give an example]
+
+
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644 (file)
index 0000000..30d39a2
--- /dev/null
@@ -0,0 +1,109 @@
+# Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to create Makefile.in
+
+EXTRA_DIST = DETAILS faq.raw FAQ faq.html \
+             HACKING OpenPGP README.W32 samplekeys.asc gnupg.7 \
+             TRANSLATE gpg.ru.sgml gpg.ru.1 highlights-1.4.txt \
+             gpg.texi gpgv.texi specify-user-id.texi see-also-note.texi \
+            opt-homedir.texi texi.css yat2m.c gpl.texi
+
+myman_sources = gpg.texi gpgv.texi
+myman_pages   = gpg.1 gpgv.1
+
+info_TEXINFOS = gnupg1.texi
+
+man_MANS = $(myman_pages) gnupg.7 gpg.ru.1
+
+gnupg1_TEXINFOS = gnupg1.texi
+
+# Need this to avoid building of dvis with automake 1.4
+DVIS =
+
+pkgdata_DATA = FAQ faq.html
+
+BUILT_SOURCES = FAQ faq.html 
+# we can't add gpg.texi gpgv.texi here because automake does not like them to
+# be built files. 
+
+CLEANFILES = faq.raw.xref gpg.xml gpgv.xml gpg.ru.xml 
+DISTCLEANFILES = yat2m yat2m-stamp.tmp yat2m-stamp $(myman_pages)
+
+AM_MAKEINFOFLAGS = -I $(srcdir) --css-include=$(srcdir)/texi.css -D gpgone
+
+YAT2M_OPTIONS = -I $(srcdir) -D gpgone \
+        --release "GnuPG @PACKAGE_VERSION@" --source "GNU Privacy Guard"
+
+yat2m: Makefile yat2m.c
+       $(CC_FOR_BUILD) -o $@ $(srcdir)/yat2m.c
+
+yat2m-stamp: $(myman_sources)
+       @rm -f yat2m-stamp.tmp
+       @touch yat2m-stamp.tmp
+       for file in $(myman_sources) ; do \
+              ./yat2m $(YAT2M_OPTIONS) --store \
+                 `test -f '$$file' || echo '$(srcdir)/'`$$file ; done
+       @mv -f yat2m-stamp.tmp $@
+
+yat2m-stamp: yat2m
+
+$(myman_pages) : yat2m-stamp
+       @if test -f $@; then :; else \
+            trap 'rm -rf yat2m-stamp yat2m-lock' 1 2 13 15; \
+               if mkdir yat2m-lock 2>/dev/null; then \
+                 rm -f yat2m-stamp; \
+                 $(MAKE) $(AM_MAKEFLAGS) yat2m-stamp; \
+                 rmdir yat2m-lock; \
+               else \
+                 while test -d yat2m-lock; do sleep 1; done; \
+                 test -f yat2m-stamp; exit $$?; \
+               fi; \
+             fi
+
+
+%.1 : %.sgml
+if HAVE_DOCBOOK_TO_MAN
+       docbook-to-man $<  >$@
+else
+       : Warning: missing docbook-to-man, cannot make $@
+       echo ".TH $< 1"   >$@
+       echo "No man page due to missing docbook-to-man" >>$@
+endif
+
+FAQ : faq.raw
+if WORKING_FAQPROG
+       $(FAQPROG) -f $<  $@ || $(FAQPROG) -f $< $@
+else
+       : Warning: missing faqprog.pl, cannot make $@
+       echo "No $@ due to missing faqprog.pl" > $@
+       echo "See ftp://ftp.gnupg.org/gcrypt/contrib/faqprog.pl" >> $@
+endif
+
+faq.html : faq.raw
+if WORKING_FAQPROG
+       $(FAQPROG) -h -f $< $@ 2>&1 || $(FAQPROG) -h -f $< $@
+else
+       : Warning: missing faqprog.pl, cannot make $@
+       echo "No $@ due to missing faqprog.pl" > $@
+       echo "See ftp://ftp.gnupg.org/gcrypt/contrib/faqprog.pl" >> $@
+endif
+
+dist-hook:
+       @if test "`wc -c < gpg.1`" -lt 200; then \
+           echo 'ERROR: dummy man page'; false; fi
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644 (file)
index 0000000..bf92170
--- /dev/null
@@ -0,0 +1,816 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = doc
+DIST_COMMON = $(gnupg1_TEXINFOS) $(srcdir)/Makefile.am \
+       $(srcdir)/Makefile.in $(srcdir)/stamp-vti \
+       $(srcdir)/version.texi ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+INFO_DEPS = $(srcdir)/gnupg1.info
+TEXINFO_TEX = $(top_srcdir)/scripts/texinfo.tex
+am__TEXINFO_TEX_DIR = $(top_srcdir)/scripts
+PDFS = gnupg1.pdf
+PSS = gnupg1.ps
+HTMLS = gnupg1.html
+TEXINFOS = gnupg1.texi
+TEXI2DVI = texi2dvi
+TEXI2PDF = $(TEXI2DVI) --pdf --batch
+MAKEINFOHTML = $(MAKEINFO) --html
+AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS)
+DVIPS = dvips
+am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" \
+       "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(pkgdatadir)"
+man1dir = $(mandir)/man1
+man7dir = $(mandir)/man7
+NROFF = nroff
+MANS = $(man_MANS)
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+pkgdataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkgdata_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = DETAILS faq.raw FAQ faq.html \
+             HACKING OpenPGP README.W32 samplekeys.asc gnupg.7 \
+             TRANSLATE gpg.ru.sgml gpg.ru.1 highlights-1.4.txt \
+             gpg.texi gpgv.texi specify-user-id.texi see-also-note.texi \
+            opt-homedir.texi texi.css yat2m.c gpl.texi
+
+myman_sources = gpg.texi gpgv.texi
+myman_pages = gpg.1 gpgv.1
+info_TEXINFOS = gnupg1.texi
+man_MANS = $(myman_pages) gnupg.7 gpg.ru.1
+gnupg1_TEXINFOS = gnupg1.texi
+
+# Need this to avoid building of dvis with automake 1.4
+DVIS = 
+pkgdata_DATA = FAQ faq.html
+BUILT_SOURCES = FAQ faq.html 
+# we can't add gpg.texi gpgv.texi here because automake does not like them to
+# be built files. 
+CLEANFILES = faq.raw.xref gpg.xml gpgv.xml gpg.ru.xml 
+DISTCLEANFILES = yat2m yat2m-stamp.tmp yat2m-stamp $(myman_pages)
+AM_MAKEINFOFLAGS = -I $(srcdir) --css-include=$(srcdir)/texi.css -D gpgone
+YAT2M_OPTIONS = -I $(srcdir) -D gpgone \
+        --release "GnuPG @PACKAGE_VERSION@" --source "GNU Privacy Guard"
+
+all: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) all-am
+
+.SUFFIXES:
+.SUFFIXES: .dvi .html .info .pdf .ps .texi
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  doc/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  doc/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+.texi.info:
+       restore=: && backupdir="$(am__leading_dot)am$$$$" && \
+       am__cwd=`pwd` && cd $(srcdir) && \
+       rm -rf $$backupdir && mkdir $$backupdir && \
+       if ($(MAKEINFO) --version) >/dev/null 2>&1; then \
+         for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \
+           if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \
+         done; \
+       else :; fi && \
+       cd "$$am__cwd"; \
+       if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+        -o $@ $<; \
+       then \
+         rc=0; \
+         cd $(srcdir); \
+       else \
+         rc=$$?; \
+         cd $(srcdir) && \
+         $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \
+       fi; \
+       rm -rf $$backupdir; exit $$rc
+
+.texi.dvi:
+       TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+       MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+       $(TEXI2DVI) $<
+
+.texi.pdf:
+       TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+       MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \
+       $(TEXI2PDF) $<
+
+.texi.html:
+       rm -rf $(@:.html=.htp)
+       if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \
+        -o $(@:.html=.htp) $<; \
+       then \
+         rm -rf $@; \
+         if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+           mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \
+       else \
+         if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \
+           rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \
+         exit 1; \
+       fi
+$(srcdir)/gnupg1.info: gnupg1.texi $(srcdir)/version.texi $(gnupg1_TEXINFOS)
+gnupg1.dvi: gnupg1.texi $(srcdir)/version.texi $(gnupg1_TEXINFOS)
+gnupg1.pdf: gnupg1.texi $(srcdir)/version.texi $(gnupg1_TEXINFOS)
+gnupg1.html: gnupg1.texi $(srcdir)/version.texi $(gnupg1_TEXINFOS)
+$(srcdir)/version.texi: @MAINTAINER_MODE_TRUE@ $(srcdir)/stamp-vti
+$(srcdir)/stamp-vti: gnupg1.texi $(top_srcdir)/configure
+       @(dir=.; test -f ./gnupg1.texi || dir=$(srcdir); \
+       set `$(SHELL) $(top_srcdir)/scripts/mdate-sh $$dir/gnupg1.texi`; \
+       echo "@set UPDATED $$1 $$2 $$3"; \
+       echo "@set UPDATED-MONTH $$2 $$3"; \
+       echo "@set EDITION $(VERSION)"; \
+       echo "@set VERSION $(VERSION)") > vti.tmp
+       @cmp -s vti.tmp $(srcdir)/version.texi \
+         || (echo "Updating $(srcdir)/version.texi"; \
+             cp vti.tmp $(srcdir)/version.texi)
+       -@rm -f vti.tmp
+       @cp $(srcdir)/version.texi $@
+
+mostlyclean-vti:
+       -rm -f vti.tmp
+
+maintainer-clean-vti:
+@MAINTAINER_MODE_TRUE@ -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi
+.dvi.ps:
+       TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \
+       $(DVIPS) -o $@ $<
+
+uninstall-info-am:
+       @$(PRE_UNINSTALL)
+       @if (install-info --version && \
+            install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+         list='$(INFO_DEPS)'; \
+         for file in $$list; do \
+           relfile=`echo "$$file" | sed 's|^.*/||'`; \
+           echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \
+           install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \
+         done; \
+       else :; fi
+       @$(NORMAL_UNINSTALL)
+       @list='$(INFO_DEPS)'; \
+       for file in $$list; do \
+         relfile=`echo "$$file" | sed 's|^.*/||'`; \
+         relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \
+         (if cd "$(DESTDIR)$(infodir)"; then \
+            echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \
+            rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \
+          else :; fi); \
+       done
+
+dist-info: $(INFO_DEPS)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       list='$(INFO_DEPS)'; \
+       for base in $$list; do \
+         case $$base in \
+           $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
+         esac; \
+         if test -f $$base; then d=.; else d=$(srcdir); fi; \
+         base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
+         for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
+           if test -f $$file; then \
+             relfile=`expr "$$file" : "$$d/\(.*\)"`; \
+             test -f $(distdir)/$$relfile || \
+               cp -p $$file $(distdir)/$$relfile; \
+           else :; fi; \
+         done; \
+       done
+
+mostlyclean-aminfo:
+       -rm -rf gnupg1.aux gnupg1.cp gnupg1.cps gnupg1.fn gnupg1.ky gnupg1.log \
+         gnupg1.op gnupg1.ops gnupg1.pg gnupg1.tmp gnupg1.toc \
+         gnupg1.tp gnupg1.vr gnupg1.dvi gnupg1.pdf gnupg1.ps \
+         gnupg1.html
+
+maintainer-clean-aminfo:
+       @list='$(INFO_DEPS)'; for i in $$list; do \
+         i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \
+         echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+         rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+       done
+install-man1: $(man1_MANS) $(man_MANS)
+       @$(NORMAL_INSTALL)
+       test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+       @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           1*) ;; \
+           *) ext='1' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+         $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+       done
+uninstall-man1:
+       @$(NORMAL_UNINSTALL)
+       @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.1*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           1*) ;; \
+           *) ext='1' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+         rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+       done
+install-man7: $(man7_MANS) $(man_MANS)
+       @$(NORMAL_INSTALL)
+       test -z "$(man7dir)" || $(mkdir_p) "$(DESTDIR)$(man7dir)"
+       @list='$(man7_MANS) $(dist_man7_MANS) $(nodist_man7_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.7*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+         else file=$$i; fi; \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           7*) ;; \
+           *) ext='7' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man7dir)/$$inst'"; \
+         $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$inst"; \
+       done
+uninstall-man7:
+       @$(NORMAL_UNINSTALL)
+       @list='$(man7_MANS) $(dist_man7_MANS) $(nodist_man7_MANS)'; \
+       l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+       for i in $$l2; do \
+         case "$$i" in \
+           *.7*) list="$$list $$i" ;; \
+         esac; \
+       done; \
+       for i in $$list; do \
+         ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+         case "$$ext" in \
+           7*) ;; \
+           *) ext='7' ;; \
+         esac; \
+         inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+         inst=`echo $$inst | sed -e 's/^.*\///'`; \
+         inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+         echo " rm -f '$(DESTDIR)$(man7dir)/$$inst'"; \
+         rm -f "$(DESTDIR)$(man7dir)/$$inst"; \
+       done
+install-pkgdataDATA: $(pkgdata_DATA)
+       @$(NORMAL_INSTALL)
+       test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)"
+       @list='$(pkgdata_DATA)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         f=$(am__strip_dir) \
+         echo " $(pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+         $(pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \
+       done
+
+uninstall-pkgdataDATA:
+       @$(NORMAL_UNINSTALL)
+       @list='$(pkgdata_DATA)'; for p in $$list; do \
+         f=$(am__strip_dir) \
+         echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \
+         rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \
+       done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+       $(MAKE) $(AM_MAKEFLAGS) \
+         top_distdir="$(top_distdir)" distdir="$(distdir)" \
+         dist-info dist-hook
+check-am: all-am
+check: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) check-am
+all-am: Makefile $(INFO_DEPS) $(MANS) $(DATA)
+installdirs:
+       for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(pkgdatadir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: $(BUILT_SOURCES)
+       $(MAKE) $(AM_MAKEFLAGS) install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+       -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am: $(DVIS)
+
+html: html-am
+
+html-am: $(HTMLS)
+
+info: info-am
+
+info-am: $(INFO_DEPS)
+
+install-data-am: install-info-am install-man install-pkgdataDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-info-am: $(INFO_DEPS)
+       @$(NORMAL_INSTALL)
+       test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)"
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       list='$(INFO_DEPS)'; \
+       for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+         esac; \
+         if test -f $$file; then d=.; else d=$(srcdir); fi; \
+         file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \
+         for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \
+                       $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \
+           if test -f $$ifile; then \
+             relfile=`echo "$$ifile" | sed 's|^.*/||'`; \
+             echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \
+             $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \
+           else : ; fi; \
+         done; \
+       done
+       @$(POST_INSTALL)
+       @if (install-info --version && \
+            install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \
+         list='$(INFO_DEPS)'; \
+         for file in $$list; do \
+           relfile=`echo "$$file" | sed 's|^.*/||'`; \
+           echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\
+           install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+         done; \
+       else : ; fi
+install-man: install-man1 install-man7
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-aminfo \
+       maintainer-clean-generic maintainer-clean-vti
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti
+
+pdf: pdf-am
+
+pdf-am: $(PDFS)
+
+ps: ps-am
+
+ps-am: $(PSS)
+
+uninstall-am: uninstall-info-am uninstall-man uninstall-pkgdataDATA
+
+uninstall-man: uninstall-man1 uninstall-man7
+
+.PHONY: all all-am check check-am clean clean-generic dist-hook \
+       dist-info distclean distclean-generic distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-man1 install-man7 \
+       install-pkgdataDATA install-strip installcheck installcheck-am \
+       installdirs maintainer-clean maintainer-clean-aminfo \
+       maintainer-clean-generic maintainer-clean-vti mostlyclean \
+       mostlyclean-aminfo mostlyclean-generic mostlyclean-vti pdf \
+       pdf-am ps ps-am uninstall uninstall-am uninstall-info-am \
+       uninstall-man uninstall-man1 uninstall-man7 \
+       uninstall-pkgdataDATA
+
+
+yat2m: Makefile yat2m.c
+       $(CC_FOR_BUILD) -o $@ $(srcdir)/yat2m.c
+
+yat2m-stamp: $(myman_sources)
+       @rm -f yat2m-stamp.tmp
+       @touch yat2m-stamp.tmp
+       for file in $(myman_sources) ; do \
+              ./yat2m $(YAT2M_OPTIONS) --store \
+                 `test -f '$$file' || echo '$(srcdir)/'`$$file ; done
+       @mv -f yat2m-stamp.tmp $@
+
+yat2m-stamp: yat2m
+
+$(myman_pages) : yat2m-stamp
+       @if test -f $@; then :; else \
+            trap 'rm -rf yat2m-stamp yat2m-lock' 1 2 13 15; \
+               if mkdir yat2m-lock 2>/dev/null; then \
+                 rm -f yat2m-stamp; \
+                 $(MAKE) $(AM_MAKEFLAGS) yat2m-stamp; \
+                 rmdir yat2m-lock; \
+               else \
+                 while test -d yat2m-lock; do sleep 1; done; \
+                 test -f yat2m-stamp; exit $$?; \
+               fi; \
+             fi
+
+%.1 : %.sgml
+@HAVE_DOCBOOK_TO_MAN_TRUE@     docbook-to-man $<  >$@
+@HAVE_DOCBOOK_TO_MAN_FALSE@    : Warning: missing docbook-to-man, cannot make $@
+@HAVE_DOCBOOK_TO_MAN_FALSE@    echo ".TH $< 1"   >$@
+@HAVE_DOCBOOK_TO_MAN_FALSE@    echo "No man page due to missing docbook-to-man" >>$@
+
+FAQ : faq.raw
+@WORKING_FAQPROG_TRUE@ $(FAQPROG) -f $<  $@ || $(FAQPROG) -f $< $@
+@WORKING_FAQPROG_FALSE@        : Warning: missing faqprog.pl, cannot make $@
+@WORKING_FAQPROG_FALSE@        echo "No $@ due to missing faqprog.pl" > $@
+@WORKING_FAQPROG_FALSE@        echo "See ftp://ftp.gnupg.org/gcrypt/contrib/faqprog.pl" >> $@
+
+faq.html : faq.raw
+@WORKING_FAQPROG_TRUE@ $(FAQPROG) -h -f $< $@ 2>&1 || $(FAQPROG) -h -f $< $@
+@WORKING_FAQPROG_FALSE@        : Warning: missing faqprog.pl, cannot make $@
+@WORKING_FAQPROG_FALSE@        echo "No $@ due to missing faqprog.pl" > $@
+@WORKING_FAQPROG_FALSE@        echo "See ftp://ftp.gnupg.org/gcrypt/contrib/faqprog.pl" >> $@
+
+dist-hook:
+       @if test "`wc -c < gpg.1`" -lt 200; then \
+           echo 'ERROR: dummy man page'; false; fi
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/OpenPGP b/doc/OpenPGP
new file mode 100644 (file)
index 0000000..a511ad7
--- /dev/null
@@ -0,0 +1,108 @@
+                   GnuPG and OpenPGP
+                   =================
+
+   See RFC2440 for a description of OpenPGP.  We have an annotated version
+   of this RFC online: http://www.gnupg.org/rfc2440.html
+
+
+
+  Compatibility Notes
+  ===================
+   GnuPG (>=1.0.3) is in compliance with RFC2440 despite these exceptions:
+
+    * (9.2) states that IDEA SHOULD be implemented.  This is not done
+      due to patent problems.
+
+
+   All MAY features are implemented with this exception:
+
+    * multi-part armored messages are not supported.
+      MIME (rfc2015) should be used instead.
+
+   Most of the OPTIONAL stuff is implemented.
+
+   There are a couple of options which can be used to override some
+   RFC requirements.  This is always mentioned with the description
+   of that options.
+
+   A special format of partial packet length exists for v3 packets
+   which can be considered to be in compliance with RFC1991;  this
+   format is only created if a special option is active.
+
+   GnuPG uses a S2K mode of 101 for GNU extensions to the secret key
+   protection algorithms.  This number is not defined in OpenPGP, but
+   given the fact that this number is in a range which used at many
+   other places in OpenPGP for private/experimenat algorithm identifiers,
+   this should be not a so bad choice. The 3 bytes "GNU" are used
+   to identify this as a GNU extension - see the file DETAILS for a
+   definition of the used data formats.
+
+
+
+  Some Notes on OpenPGP / PGP Compatibility:
+  ==========================================
+
+     * PGP 5.x does not accept V4 signatures for anything other than
+       key material.  The GnuPG option --force-v3-sigs mimics this
+       behavior.
+
+     * PGP 5.x does not recognize the "five-octet" lengths in
+       new-format headers or in signature subpacket lengths.
+
+     * PGP 5.0 rejects an encrypted session key if the keylength
+       differs from the S2K symmetric algorithm. This is a bug in its
+       validation function.
+
+     * PGP 5.0 does not handle multiple one-pass signature headers and
+       trailers. Signing one will compress the one-pass signed literal
+       and prefix a V3 signature instead of doing a nested one-pass
+       signature.
+
+     * When exporting a private key, PGP 2.x generates the header
+       "BEGIN PGP SECRET KEY BLOCK" instead of "BEGIN PGP PRIVATE KEY
+       BLOCK". All previous versions ignore the implied data type, and
+       look directly at the packet data type.
+
+     * In a clear-signed signature, PGP 5.0 will figure out the correct
+       hash algorithm if there is no "Hash:" header, but it will reject
+       a mismatch between the header and the actual algorithm used. The
+       "standard" (i.e. Zimmermann/Finney/et al.) version of PGP 2.x
+       rejects the "Hash:" header and assumes MD5. There are a number
+       of enhanced variants of PGP 2.6.x that have been modified for
+       SHA-1 signatures.
+
+     * PGP 5.0 can read an RSA key in V4 format, but can only recognize
+       it with a V3 keyid, and can properly use only a V3 format RSA
+       key.
+
+     * Neither PGP 5.x nor PGP 6.0 recognize ElGamal Encrypt and Sign
+       keys. They only handle ElGamal Encrypt-only keys.
+
+
+  Parts of this document are taken from:
+  ======================================
+
+                        OpenPGP Message Format
+                  draft-ietf-openpgp-formats-07.txt
+
+
+   Copyright 1998 by The Internet Society. All Rights Reserved.
+
+   This document and translations of it may be copied and furnished to
+   others, and derivative works that comment on or otherwise explain it
+   or assist in its implementation may be prepared, copied, published
+   and distributed, in whole or in part, without restriction of any
+   kind, provided that the above copyright notice and this paragraph
+   are included on all such copies and derivative works.  However, this
+   document itself may not be modified in any way, such as by removing
+   the copyright notice or references to the Internet Society or other
+   Internet organizations, except as needed for the purpose of
+   developing Internet standards in which case the procedures for
+   copyrights defined in the Internet Standards process must be
+   followed, or as required to translate it into languages other than
+   English.
+
+   The limited permissions granted above are perpetual and will not be
+   revoked by the Internet Society or its successors or assigns.
+
+
diff --git a/doc/README.W32 b/doc/README.W32
new file mode 100644 (file)
index 0000000..cd30711
--- /dev/null
@@ -0,0 +1,189 @@
+README.W32                                                -*- text -*-
+
+This is a binary package with GnuPG for MS-Windows 95, 98, WNT, W2000
+and XP. See the file README for generic instructions and usage hints.
+
+A FAQ comes with this package and a probably more recent one can be
+found online at http://www.gnupg.org/faq.html.  See
+http://www.gnupg.org/docs-mls.html for a list of mailing lists. In
+particular the list gnupg-users@gnupg.org might be useful to answer
+questions - but please read the FAQ first.
+
+
+Installation directory:
+=======================
+
+The installation directory of GnuPG is stored in the Registry under
+the key HKEY_LOCAL_MACHINE\Software\GNU\GnuPG with the name "Install
+Directory".  The installer does not change the PATH environment
+variable to include this directory.  You might want to do this
+manually.
+
+Note, that this registry entry is also used to locate the keyserver
+helper programs (e.g. gpgkeys_ldap).
+
+Below the Installation directory, you will find directories named
+"Doc", "gnupg.nls" and "Src".  The latter will be used for distributed
+patched, if any, and to store the source file if they have been
+included in this package.  The source files usually require further
+unpacking using the TAR utility.
+
+
+Internationalization support:
+=============================
+
+Store the locale id (like "de") into the Registry under the key
+HKEY_CURRENT_USER\Software\GNU\GnuPG with the name "Lang".  This must
+match one of the installed languages files in the directory named
+"gnupg.nls" below the installation directory.  Note, that the ".mo"
+extension is not part of the locale id.
+
+
+Home directory:
+===============
+
+GnuPG makes use of a per user home directory to store its keys as well
+as configuration files.  The default home directory is a directory
+named "gnupg" below the application data directory of the user.  This
+directory will be created if it does not exist.  Being only a default,
+it may be changed by setting the name of the home directory into the
+Registry under the key HKEY_CURRENT_USER\Software\GNU\GnuPG using the
+name "HomeDir".  If an environment variable "GNUPGHOME" exists, this
+even overrides the registry setting.  The command line option
+"--homedir" may be used to override all other settings of the home
+directory.
+
+
+Reporting bugs:
+===============
+
+Please check the documentation first before asking or reporting a
+bugs.  In particular check the archives of the mailing lists (see
+www.gnupg.org) and the bug tracking system at http://bugs.gnupg.org
+(login is "guest" password is "guest") whether the problem is already
+known.  Asking on the gnupg-users mailing list is also strongly
+encouraged; if you are not subscribed it may some time until a posting
+is approved (this is an anti-spam measure). Bug reporting addresses
+are listed in the file AUTHORS.
+
+If you want to report a bug or have other problems, always give
+detailed description of the problem, the version of GnuPG you used,
+the version of the OS, whether it is the official version from
+gnupg.org or how you built it.  Don't edit error messages - replacing
+sensitive information like user IDs, fingerprints and keyids is okay.
+If possible, switch to English messages by changing the "Lang" entry
+to empty (see under Internationalization support).
+
+
+How to build GnuPG from the source:
+===================================
+
+Until recently all official GnuPG versions have been build using the
+Mingw32/CPD kit as available at
+ftp://ftp.gnupg.org/people/werner/cpd/mingw32-cqpd-0.3.2.tar.gz .
+However, for maintenance reasons we switched to Debian's mingw32 cross
+compiler package and that is now the recommended way of building GnuPG
+for W32 platforms.  It might be possible to build it nativly on a W32
+platform but this is not supported.  Please don't file any bug reports
+if it does not build with any other system than the recommended one.
+
+According to the conditions of the GNU General Public License you
+either got the source files with this package, a written offer to send
+you the source on demand or the source is available at the same site
+you downloaded the binary package.  If you downloaded the package from
+the official GnuPG site or one of its mirrors, the corresponding
+source tarball is available in the sibling directory named gnupg.  The
+source used to build all versions is always the same and the version
+numbers should match.  If the version number of the binary package has
+a letter suffix, you will find a patch file installed in the "Src"
+directory with the changes relative to the generic version.
+
+The source is distributed as a BZIP2 or GZIP compressed tar archive.
+See the instructions in file README on how to check the integrity of
+that file.  Wir a properly setup build environment, you unpack the
+tarball change to the created directory and run
+
+ $ ./autogen.sh --build-w32
+ $ make
+ $ cp g10/gpg*.exe  /some_windows_drive/
+
+Building a version with the installer is a bit more complex and
+basically works by creating a top directory, unpacking in that top
+directory, switching to the gnupg-1.x.y directory, running
+"./autogen.sh --build-w32" and "make", switching back to the top
+directory, running a "mkdir dist-w32; mkdir iconv", copying the
+required iconv files (iconv.dll, README.iconv, COPYING.LIB) into the
+iconv directory, running gnupg-1.x.y/scripts/mk-w32-dist and voila,
+the installer package will be available in the dist-w32 directory.
+
+
+Copying:
+========
+
+GnuPG is
+
+  Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 
+            2005 Free Software Foundation, Inc.
+
+  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 2 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, write to the Free Software
+  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+  02110-1301, USA
+
+See the files AUTHORS and THANKS for credits, further legal
+information and bug reporting addresses pertaining to GnuPG.
+
+For copying conditions of the GNU LIBICONV library see the file
+README.iconv.
+  
+The installer software used to create the official binary packages for
+W32 is NSIS (http://nsis.sourceforge.net/):
+
+  Copyright (C) 1999-2005 Nullsoft, Inc.
+
+  This license applies to everything in the NSIS package, except where
+  otherwise noted.
+
+  This software is provided 'as-is', without any express or implied
+  warranty. In no event will the authors be held liable for any
+  damages arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any
+  purpose, including commercial applications, and to alter it and
+  redistribute it freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must
+     not claim that you wrote the original software. If you use this
+     software in a product, an acknowledgment in the product
+     documentation would be appreciated but is not required.
+
+  2. Altered source versions must be plainly marked as such, and must
+     not be misrepresented as being the original software.
+
+  3. This notice may not be removed or altered from any source
+     distribution.
+
+The user interface used with the installer is
+
+  Copyright (C) 2002-2005 Joost Verburg
+
+  [It is distributed along with NSIS and the same conditions as stated
+  above apply]
+
+
+The term "W32" is used to describe the API used by current Microsoft
+Windows versions.  We don't use the Microsft terminology here; in
+hacker terminology, calling something a "win" is a form of praise.
+Keep in mind that Windows ist just a temporary workaround until you
+can switch to a complete Free Software system.  Be the source always
+with you.
diff --git a/doc/TRANSLATE b/doc/TRANSLATE
new file mode 100644 (file)
index 0000000..c00f823
--- /dev/null
@@ -0,0 +1,33 @@
+$Id: TRANSLATE 3453 2004-12-16 10:13:02Z wk $
+
+Note for translators
+--------------------
+
+Some strings in GnuPG are for matching user input against.  These
+strings can accept multiple values that mean essentially the same
+thing.
+
+For example, the string "yes" in English is "sí" in Spanish.  However,
+some users will type "si" (without the accent).  To accomodate both
+users, you can translate the string "yes" as "sí|si".  You can have
+any number of alternate matches seperated by the | character like
+"sí|si|seguro".
+
+The strings that can be handled in this way are of the form "yes|yes",
+(or "no|no", etc.) There should also be a comment in the .po file
+directing you to this file.
+
+
+
+Sending new or updated translations
+-----------------------------------
+
+Please note that we do not use the TP Robot but require that
+translations are to be send by mail to translations@gnupg.org.  We
+also strongly advise to get subscribed to i18n@gnupg.org and request
+assistance if it is not clear on how to translate certain strings.  A
+wrongly translated string may lead to a security problem.
+
+A copyright disclaimer to the FSF is required by all translators.
+
+
diff --git a/doc/faq.html b/doc/faq.html
new file mode 100644 (file)
index 0000000..a546b3b
--- /dev/null
@@ -0,0 +1,1657 @@
+<html><head>
+<title>GnuPG FAQ</title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8">
+</head>
+<body>
+<body bgcolor=#ffffff text=#000000 link=#1f00ff alink=#ff0000 vlink=#9900dd>
+<h1>GnuPG Frequently Asked Questions</h1>
+<P>
+<P>
+<p>
+Version: 1.6.3<br>
+Last-Modified: Jul 30, 2003<br>
+Maintained-by: David D. Scribner, &lt;faq 'at' gnupg.org&gt;
+</p>
+<P>
+<P>
+This is the GnuPG FAQ. The latest HTML version is available
+<a href=http://www.gnupg.org/documentation/faqs.html>here</a>.
+<P>
+The index is generated automatically, so there may be errors. Not all
+questions may be in the section they belong to. Suggestions about how
+to improve the structure of this FAQ are welcome.
+<P>
+Please send additions and corrections to the maintainer. It would be
+most convenient if you could provide the answer to be included here
+as well. Your help is very much appreciated!
+<P>
+Please, don't send message like &quot;This should be a FAQ - what's the
+answer?&quot;. If it hasn't been asked before, it isn't a FAQ. In that case
+you could search in the mailing list archive.
+<P>
+<hr>
+<menu>
+<h2><A HREF=#q1>1. GENERAL
+</A></h2>
+<LI><a HREF=#q1.1>1.1) What is GnuPG?
+</a>
+<LI><a HREF=#q1.2>1.2) Is GnuPG compatible with PGP?
+</a>
+<LI><a HREF=#q1.3>1.3) Is GnuPG free to use for personal or commercial use?
+</a>
+<LI><a HREF=#q1.4>1.4) What conventions are used in this FAQ?
+</a>
+<h2><A HREF=#q2>2. SOURCES of INFORMATION
+</A></h2>
+<LI><a HREF=#q2.1>2.1) Where can I find more information on GnuPG?
+</a>
+<LI><a HREF=#q2.2>2.2) Where do I get GnuPG?
+</a>
+<h2><A HREF=#q3>3. INSTALLATION 
+</A></h2>
+<LI><a HREF=#q3.1>3.1) Which OSes does GnuPG run on?
+</a>
+<LI><a HREF=#q3.2>3.2) Which random data gatherer should I use?
+</a>
+<LI><a HREF=#q3.3>3.3) How do I include support for RSA and IDEA?
+</a>
+<h2><A HREF=#q4>4. USAGE
+</A></h2>
+<LI><a HREF=#q4.1>4.1) What is the recommended key size?
+</a>
+<LI><a HREF=#q4.2>4.2) Why does it sometimes take so long to create keys?
+</a>
+<LI><a HREF=#q4.3>4.3) And it really takes long when I work on a remote system. Why?
+</a>
+<LI><a HREF=#q4.4>4.4) What is the difference between options and commands?
+</a>
+<LI><a HREF=#q4.5>4.5) I can't delete a user ID on my secret keyring because it has
+    already been deleted on my public keyring. What can I do?
+</a>
+<LI><a HREF=#q4.6>4.6) I can't delete my secret key because the public key disappeared.
+    What can I do?
+</a>
+<LI><a HREF=#q4.7>4.7) What are trust, validity and ownertrust?
+</a>
+<LI><a HREF=#q4.8>4.8) How do I sign a patch file?
+</a>
+<LI><a HREF=#q4.9>4.9) Where is the &quot;encrypt-to-self&quot; option?
+</a>
+<LI><a HREF=#q4.10>4.10) How can I get rid of the Version and Comment headers in armored
+    messages?
+</a>
+<LI><a HREF=#q4.11>4.11) What does the &quot;You are using the xxxx character set.&quot; mean?
+</a>
+<LI><a HREF=#q4.12>4.12) How can I get list of key IDs used to encrypt a message?
+</a>
+<LI><a HREF=#q4.13>4.13) Why can't I decrypt files encrypted as symmetrical-only (-c) with
+    a version of GnuPG prior to 1.0.1.
+</a>
+<LI><a HREF=#q4.14>4.14) How can I use GnuPG in an automated environment?
+</a>
+<LI><a HREF=#q4.15>4.15) Which email-client can I use with GnuPG?
+</a>
+<LI><a HREF=#q4.16>4.16) Can't we have a gpg library?
+</a>
+<LI><a HREF=#q4.17>4.17) I have successfully generated a revocation certificate, but I don't
+    understand how to send it to the key servers.
+</a>
+<LI><a HREF=#q4.18>4.18) How do I put my keyring in a different directory?
+</a>
+<LI><a HREF=#q4.19>4.19) How do I verify signed packages?
+</a>
+<LI><a HREF=#q4.20>4.20) How do I export a keyring with only selected signatures (keys)?
+</a>
+<LI><a HREF=#q4.21>4.21) I still have my secret key, but lost my public key. What can I do?
+</a>
+<LI><a HREF=#q4.22>4.22) Clearsigned messages sent from my web-mail account have an invalid
+    signature. Why?
+</a>
+<h2><A HREF=#q5>5. COMPATIBILITY ISSUES
+</A></h2>
+<LI><a HREF=#q5.1>5.1) How can I encrypt a message with GnuPG so that PGP is able to decrypt it?
+</a>
+<LI><a HREF=#q5.2>5.2) How do I migrate from PGP 2.x to GnuPG?
+</a>
+<LI><a HREF=#q5.3>5.3) (removed)
+</a>
+<LI><a HREF=#q5.4>5.4) Why is PGP 5.x not able to encrypt messages with some keys?
+</a>
+<LI><a HREF=#q5.5>5.5) Why is PGP 5.x not able to verify my messages?
+</a>
+<LI><a HREF=#q5.6>5.6) How do I transfer owner trust values from PGP to GnuPG?
+</a>
+<LI><a HREF=#q5.7>5.7) PGP does not like my secret key.
+</a>
+<LI><a HREF=#q5.8>5.8) GnuPG no longer installs a ~/.gnupg/options file. Is it missing?
+</a>
+<LI><a HREF=#q5.9>5.9) How do you export GnuPG keys for use with PGP?
+</a>
+<h2><A HREF=#q6>6. PROBLEMS and ERROR MESSAGES
+</A></h2>
+<LI><a HREF=#q6.1>6.1) Why do I get &quot;gpg: Warning: using insecure memory!&quot;
+</a>
+<LI><a HREF=#q6.2>6.2) Large File Support doesn't work ...
+</a>
+<LI><a HREF=#q6.3>6.3) In the edit menu the trust values are not displayed correctly after
+    signing uids. Why?
+</a>
+<LI><a HREF=#q6.4>6.4) What does &quot;skipping pubkey 1: already loaded&quot; mean?
+</a>
+<LI><a HREF=#q6.5>6.5) GnuPG 1.0.4 doesn't create ~/.gnupg ...
+</a>
+<LI><a HREF=#q6.6>6.6) An Elgamal signature does not verify anymore since version 1.0.2 ...
+</a>
+<LI><a HREF=#q6.7>6.7) Old versions of GnuPG can't verify Elgamal signatures
+</a>
+<LI><a HREF=#q6.8>6.8) When I use --clearsign, the plain text has sometimes extra dashes
+    in it - why?
+</a>
+<LI><a HREF=#q6.9>6.9) What is the thing with &quot;can't handle multiple signatures&quot;?
+</a>
+<LI><a HREF=#q6.10>6.10) If I submit a key to a keyserver, nothing happens ...
+</a>
+<LI><a HREF=#q6.11>6.11) I get &quot;gpg: waiting for lock ...&quot;
+</a>
+<LI><a HREF=#q6.12>6.12) Older gpg binaries (e.g., 1.0) have problems with keys from newer
+    gpg binaries ...
+</a>
+<LI><a HREF=#q6.13>6.13) With 1.0.4, I get &quot;this cipher algorithm is deprecated ...&quot;
+</a>
+<LI><a HREF=#q6.14>6.14) Some dates are displayed as ????-??-??. Why?
+</a>
+<LI><a HREF=#q6.15>6.15) I still have a problem. How do I report a bug?
+</a>
+<LI><a HREF=#q6.16>6.16) Why doesn't GnuPG support X.509 certificates?
+</a>
+<LI><a HREF=#q6.17>6.17) Why do national characters in my user ID look funny?
+</a>
+<LI><a HREF=#q6.18>6.18) I get 'sed' errors when running ./configure on Mac OS X ...
+</a>
+<LI><a HREF=#q6.19>6.19) Why does GnuPG 1.0.6 bail out on keyrings used with 1.0.7?
+</a>
+<LI><a HREF=#q6.20>6.20) I upgraded to GnuPG version 1.0.7 and now it takes longer to load my
+    keyrings. What can I do?
+</a>
+<LI><a HREF=#q6.21>6.21) Doesn't a fully trusted user ID on a key prevent warning messages
+    when encrypting to other IDs on the key?
+</a>
+<LI><a HREF=#q6.22>6.22) I just compiled GnuPG from source on my GNU/Linux RPM-based system
+    and it's not working. Why?
+</a>
+<h2><A HREF=#q7>7. ADVANCED TOPICS
+</A></h2>
+<LI><a HREF=#q7.1>7.1) How does this whole thing work?
+</a>
+<LI><a HREF=#q7.2>7.2) Why are some signatures with an ELG-E key valid?
+</a>
+<LI><a HREF=#q7.3>7.3) How does the whole trust thing work?
+</a>
+<LI><a HREF=#q7.4>7.4) What kind of output is this: &quot;key C26EE891.298, uid 09FB: ....&quot;?
+</a>
+<LI><a HREF=#q7.5>7.5) How do I interpret some of the informational outputs?
+</a>
+<LI><a HREF=#q7.6>7.6) Are the header lines of a cleartext signature part of the signed
+    material?
+</a>
+<LI><a HREF=#q7.7>7.7) What is the list of preferred algorithms?
+</a>
+<LI><a HREF=#q7.8>7.8) How do I change the list of preferred algorithms?
+</a>
+<h2><A HREF=#q8>8. ACKNOWLEDGEMENTS
+</A></h2>
+</menu>
+<hr>
+<P>
+<P>
+<h2>
+<A NAME=q1>1. GENERAL
+</A></h2>
+<P>
+<h3>
+<a NAME=q1.1>1.1)</a> What is GnuPG?
+</h3>
+<P>
+<a href=http://www.gnupg.org>GnuPG</a> stands for GNU Privacy Guard and
+is GNU's tool for secure communication and data storage. It can be
+used to encrypt data and to create digital signatures. It includes
+an advanced key management facility and is compliant with the
+proposed OpenPGP Internet standard as described in <a href=http://www.rfc-editor.org/>RFC 2440</a>.
+As such, it is aimed to be compatible with PGP from PGP Corp. and
+other OpenPGP tools
+<P>
+<h3>
+<a NAME=q1.2>1.2)</a> Is GnuPG compatible with PGP?
+</h3>
+<P>
+In general, yes. GnuPG and newer PGP releases should be implementing
+the OpenPGP standard. But there are some interoperability problems.
+See question <a HREF=#q5.1>5.1</a> for details.
+<P>
+<h3>
+<a NAME=q1.3>1.3)</a> Is GnuPG free to use for personal or commercial use?
+</h3>
+<P>
+Yes. GnuPG is part of the GNU family of tools and applications built
+and provided in accordance with the Free Software Foundation (FSF)
+General Public License (GPL). Therefore the software is free to copy,
+use, modify and distribute in accordance with that license. Please
+read the file titled COPYING that accompanies the application for
+more information.
+<P>
+<h3>
+<a NAME=q1.4>1.4)</a> What conventions are used in this FAQ?
+</h3>
+<P>
+Although GnuPG is being developed for several operating systems
+(often in parallel), the conventions used in this FAQ reflect a
+UNIX shell environment. For Win32 users, references to a shell
+prompt (`$') should be interpreted as a command prompt (`&gt;'),
+directory names separated by a forward slash (`/') may need to be
+converted to a back slash (`\'), and a tilde (`~') represents a
+user's &quot;home&quot; directory (reference question <a HREF=#q4.18>4.18</a> for an example).
+<P>
+Some command-lines presented in this FAQ are too long to properly
+display in some browsers for the web page version of this file, and
+have been split into two or more lines. For these commands please
+remember to enter the entire command-string on one line or the
+command will error, or at minimum not give the desired results. 
+<P>
+Please keep in mind that this FAQ contains information that may not
+apply to your particular version, as new features and bug fixes are
+added on a continuing basis (reference the NEWS file included with
+the source or package for noteworthy changes between versions). One
+item to note is that starting with GnuPG version 1.1.92 the file
+containing user options and settings has been renamed from &quot;options&quot;
+to &quot;gpg.conf&quot;. Information in the FAQ that relates to the options
+file may be interchangable with the newer gpg.conf file in many
+instances. See question <a HREF=#q5.8>5.8</a> for details.
+<P>
+<P>
+<h2>
+<A NAME=q2>2. SOURCES of INFORMATION
+</A></h2>
+<P>
+<h3>
+<a NAME=q2.1>2.1)</a> Where can I find more information on GnuPG?
+</h3>
+<P>
+On-line resources:
+<P>
+<ul> 
+<li>The documentation page is located at <a href=http://www.gnupg.org/documentation/>&lt;http://www.gnupg.org/documentation/&gt;</a>.
+Also, have a look at the HOWTOs and the GNU Privacy Handbook (GPH,
+available in English, Spanish and Russian). The latter provides a
+detailed user's guide to GnuPG. You'll also find a document about how
+to convert from PGP 2.x to GnuPG.
+<P>
+<li>At <a href=http://www.gnupg.org/documentation/mailing-lists.html>&lt;http://www.gnupg.org/documentation/mailing-lists.html&gt;</a> you'll find
+an online archive of the GnuPG mailing lists. Most interesting should
+be gnupg-users for all user-related issues and gnupg-devel if you want
+to get in touch with the developers.
+<P>
+In addition, searchable archives can be found on MARC, e.g.: <br>
+gnupg-users: <a href=http://marc.theaimsgroup.com/?l=gnupg-users&amp;r=1&amp;w=2>&lt;http://marc.theaimsgroup.com/?l=gnupg-users&amp;r=1&amp;w=2&gt;</a><br>
+gnupg-devel: <a href=http://marc.theaimsgroup.com/?l=gnupg-devel&amp;r=1&amp;w=2>&lt;http://marc.theaimsgroup.com/?l=gnupg-devel&amp;r=1&amp;w=2&gt;</a><br>
+<P>
+<b>PLEASE:</b>
+Before posting to a list, read this FAQ and the available documentation.
+In addition, search the list archive - maybe your question has already
+been discussed. This way you help people focus on topics that have not
+yet been resolved.
+<P>
+<li>The GnuPG source distribution contains a subdirectory:
+<P>
+<samp>
+   ./doc
+</samp>
+<P>
+where some additional documentation is located (mainly interesting
+for hackers, not the casual user).
+</ul>
+<P>
+<h3>
+<a NAME=q2.2>2.2)</a> Where do I get GnuPG?
+</h3>
+<P>
+You can download the GNU Privacy Guard from its primary FTP server
+<a href=ftp://ftp.gnupg.org/gcrypt/>&lt;ftp://ftp.gnupg.org/gcrypt/&gt;</a> or from one of the mirrors:
+<P>
+<a href=http://www.gnupg.org/download/mirrors.html>
+   &lt;http://www.gnupg.org/download/mirrors.html&gt;
+</a>
+<P>
+The current stable version is 1.2.2. Please upgrade to this version as
+it includes additional features, functions and security fixes that may
+not have existed in prior versions.
+<P>
+<P>
+<h2>
+<A NAME=q3>3. INSTALLATION 
+</A></h2>
+<P>
+<h3>
+<a NAME=q3.1>3.1)</a> Which OSes does GnuPG run on?
+</h3>
+<P>
+It should run on most Unices as well as Windows versions (including
+Windows NT/2000) and Macintosh OS/X. A list of OSes reported to be OK
+is presented at:
+<P>
+<a href=http://www.gnupg.org/download/supported_systems.html>
+   &lt;http://www.gnupg.org/download/supported_systems.html&gt;
+</a>
+<P>
+<h3>
+<a NAME=q3.2>3.2)</a> Which random data gatherer should I use?
+</h3>
+<P>
+&quot;Good&quot; random numbers are crucial for the security of your encryption.
+Different operating systems provide a variety of more or less quality
+random data. Linux and *BSD provide kernel generated random data
+through /dev/random - this should be the preferred choice on these
+systems. Also Solaris users with the SUNWski package installed have
+a /dev/random. In these cases, use the configure option:
+<P>
+<samp>
+   --enable-static-rnd=linux
+</samp>
+<P>
+In addition, there's also the kernel random device by Andi Maier
+<a href= http://www.cosy.sbg.ac.at/~andi/SUNrand/>&lt;http://www.cosy.sbg.ac.at/~andi/SUNrand/&gt;</a>, but it's still beta. Use at your
+own risk!
+<P>
+On other systems, the Entropy Gathering Daemon (EGD) is a good choice.
+It is a perl-daemon that monitors system activity and hashes it into
+random data. See the download page <a href=http://www.gnupg.org/download/>&lt;http://www.gnupg.org/download/&gt;</a>
+to obtain EGD. Use:
+<P>
+<samp>
+   --enable-static-rnd=egd
+</samp>
+<P>
+here.
+<P>
+If the above options do not work, you can use the random number
+generator &quot;unix&quot;. This is <B>very</B> slow and should be avoided. The
+random quality isn't very good so don't use it on sensitive data.
+<P>
+<h3>
+<a NAME=q3.3>3.3)</a> How do I include support for RSA and IDEA?
+</h3>
+<P>
+RSA is included as of GnuPG version 1.0.3.
+<P>
+The official GnuPG distribution does not contain IDEA due to a patent
+restriction. The patent does not expire before 2007 so don't expect
+official support before then.
+<P>
+However, there is an unofficial module to include it even in earlier
+versions of GnuPG. It's available from
+<a href=ftp://ftp.gnupg.dk/pub/contrib-dk/>&lt;ftp://ftp.gnupg.dk/pub/contrib-dk/&gt;</a>. Look for:
+<P>
+<pre>
+   idea.c.gz        (c module)
+   idea.c.gz.sig    (signature file)
+</pre>
+<P>
+<pre>
+   ideadll.zip      (c module and win32 dll)
+   ideadll.zip.sig  (signature file)
+</pre>
+<P>
+Compilation directives are in the headers of these files. You will
+then need to add the following line to your ~/.gnupg/gpg.conf or
+~/.gnupg/options file:
+<P>
+<samp>
+   load-extension idea
+</samp>
+<P>
+<P>
+<h2>
+<A NAME=q4>4. USAGE
+</A></h2>
+<P>
+<h3>
+<a NAME=q4.1>4.1)</a> What is the recommended key size?
+</h3>
+<P>
+1024 bit for DSA signatures; even for plain Elgamal signatures.
+This is sufficient as the size of the hash is probably the weakest
+link if the key size is larger than 1024 bits. Encryption keys may
+have greater sizes, but you should then check the fingerprint of
+this key:
+<P>
+<samp>
+   $ gpg --fingerprint &lt;user ID&gt;
+</samp>
+<P>
+As for the key algorithms, you should stick with the default (i.e.,
+DSA signature and Elgamal encryption). An Elgamal signing key has
+the following disadvantages: the signature is larger, it is hard
+to create such a key useful for signatures which can withstand some
+real world attacks, you don't get any extra security compared to
+DSA, and there might be compatibility problems with certain PGP
+versions. It has only been introduced because at the time it was
+not clear whether there was a patent on DSA.
+<P>
+<h3>
+<a NAME=q4.2>4.2)</a> Why does it sometimes take so long to create keys?
+</h3>
+<P>
+The problem here is that we need a lot of random bytes and for that
+we (on Linux the /dev/random device) must collect some random data.
+It is really not easy to fill the Linux internal entropy buffer; I
+talked to Ted Ts'o and he commented that the best way to fill the
+buffer is to play with your keyboard. Good security has its price.
+What I do is to hit several times on the shift, control, alternate,
+and caps lock keys, because these keys do not produce output to the
+screen. This way you get your keys really fast (it's the same thing
+PGP2 does).
+<P>
+Another problem might be another program which eats up your random
+bytes (a program (look at your daemons) that reads from /dev/random).
+<P>
+<h3>
+<a NAME=q4.3>4.3)</a> And it really takes long when I work on a remote system. Why?
+</h3>
+<P>
+Don't do this at all! You should never create keys or even use GnuPG
+on a remote system because you normally have no physical control
+over your secret key ring (which is in most cases vulnerable to
+advanced dictionary attacks) - I strongly encourage everyone to only
+create keys on a local computer (a disconnected laptop is probably
+the best choice) and if you need it on your connected box (I know,
+we all do this) be sure to have a strong password for both your
+account and for your secret key, and that you can trust your system
+administrator.
+<P>
+When I check GnuPG on a remote system via ssh (I have no Alpha here)
+;-) I have the same problem. It takes a *very* long time to create
+the keys, so I use a special option, --quick-random, to generate
+insecure keys which are only good for some tests.
+<P>
+<h3>
+<a NAME=q4.4>4.4)</a> What is the difference between options and commands?
+</h3>
+<P>
+If you do a 'gpg --help', you will get two separate lists. The first
+is a list of commands. The second is a list of options. Whenever you
+run GPG, you <b>must</b> pick exactly one command (with one exception,
+see below). You <b>may</b> pick one or more options. The command should,
+just by convention, come at the end of the argument list, after all
+the options. If the command takes a file (all the basic ones do),
+the filename comes at the very end. So the basic way to run gpg is:
+<P>
+<samp>
+   $ gpg [--option something] [--option2] [--option3 something] --command file
+</samp>
+<P>
+Some options take arguments. For example, the --output option (which
+can be abbreviated as -o) is an option that takes a filename. The
+option's argument must follow immediately after the option itself,
+otherwise gpg doesn't know which option the argument is supposed to
+paired with. As an option, --output and its filename must come before
+the command. The --recipient (-r) option takes a name or keyID to
+encrypt the message to, which must come right after the -r option.
+The --encrypt (or -e) command comes after all the options and is
+followed by the file you wish to encrypt. Therefore in this example
+the command-line issued would be:
+<P>
+<samp>
+   $ gpg -r alice -o secret.txt -e test.txt
+</samp>
+<P>
+If you write the options out in full, it is easier to read:
+<P>
+<samp>
+   $ gpg --recipient alice --output secret.txt --encrypt test.txt
+</samp>
+<P>
+If you're encrypting to a file with the extension &quot;.txt&quot;, then you'd
+probably expect to see ASCII-armored text in the file (not binary),
+so you need to add the --armor (-a) option, which doesn't take any
+arguments:
+<P>
+<samp>
+   $ gpg --armor --recipient alice --output secret.txt --encrypt test.txt
+</samp>
+<P>
+If you imagine square brackets around the optional parts, it becomes
+a bit clearer:
+<P>
+<samp>
+   $ gpg [--armor] [--recipient alice] [--output secret.txt] --encrypt test.txt
+</samp>
+<P>
+The optional parts can be rearranged any way you want:
+<P>
+<samp>
+   $ gpg --output secret.txt --recipient alice --armor --encrypt test.txt
+</samp>
+<P>
+If your filename begins with a hyphen (e.g. &quot;-a.txt&quot;), GnuPG assumes
+this is an option and may complain. To avoid this you have to either
+use &quot;./-a.txt&quot;, or stop the option and command processing with two
+hyphens: &quot;-- -a.txt&quot;.
+<P>
+<B>The exception to using only one command:</B> signing and encrypting
+at the same time. For this you can combine both commands, such as in:
+<P>
+<samp>
+   $ gpg [--options] --sign --encrypt foo.txt
+</samp>
+<P>
+<h3>
+<a NAME=q4.5>4.5)</a> I can't delete a user ID on my secret keyring because it has
+    already been deleted on my public keyring. What can I do?
+</h3>
+<P>
+Because you can only select from the public key ring, there is no
+direct way to do this. However it is not very complicated to do
+anyway. Create a new user ID with exactly the same name and you
+will see that there are now two identical user IDs on the secret
+ring. Now select this user ID and delete it. Both user IDs will be
+removed from the secret ring.
+<P>
+<h3>
+<a NAME=q4.6>4.6)</a> I can't delete my secret key because the public key disappeared.
+    What can I do?
+</h3>
+<P>
+To select a key a search is always done on the public keyring,
+therefore it is not possible to select a secret key without
+having the public key. Normally it should never happen that the
+public key got lost but the secret key is still available. The
+reality is different, so GnuPG implements a special way to deal
+with it: Simply use the long keyID to specify the key to delete,
+which can be obtained by using the --with-colons options (it is
+the fifth field in the lines beginning with &quot;sec&quot;).
+<P>
+If you've lost your public key and need to recreate it instead
+for continued use with your secret key, you may be able to use
+gpgsplit as detailed in question <a HREF=#q4.21>4.21</a>.
+<P>
+<h3>
+<a NAME=q4.7>4.7)</a> What are trust, validity and ownertrust?
+</h3>
+<P>
+With GnuPG, the term &quot;ownertrust&quot; is used instead of &quot;trust&quot; to
+help clarify that this is the value you have assigned to a key
+to express how much you trust the owner of this key to correctly
+sign (and thereby introduce) other keys. The &quot;validity&quot;, or
+calculated trust, is a value which indicates how much GnuPG
+considers a key as being valid (that it really belongs to the
+one who claims to be the owner of the key). For more information
+on trust values see the chapter &quot;The Web of Trust&quot; in The GNU
+Privacy Handbook.
+<P>
+<h3>
+<a NAME=q4.8>4.8)</a> How do I sign a patch file?
+</h3>
+<P>
+Use &quot;gpg --clearsign --not-dash-escaped ...&quot;. The problem with
+--clearsign is that all lines starting with a dash are quoted with
+&quot;- &quot;; obviously diff produces many lines starting with a dash and
+these are then quoted and that is not good for a patch ;-). To use
+a patch file without removing the cleartext signature, the special
+option --not-dash-escaped may be used to suppress generation of
+these escape sequences. You should not mail such a patch because
+spaces and line endings are also subject to the signature and a
+mailer may not preserve these. If you want to mail a file you can
+simply sign it using your MUA (Mail User Agent).
+<P>
+<h3>
+<a NAME=q4.9>4.9)</a> Where is the &quot;encrypt-to-self&quot; option?
+</h3>
+<P>
+Use &quot;--encrypt-to your_keyID&quot;. You can use more than one of these
+options. To temporarily override the use of this additional key,
+you can use the option &quot;--no-encrypt-to&quot;.
+<P>
+<h3>
+<a NAME=q4.10>4.10)</a> How can I get rid of the Version and Comment headers in armored
+    messages?
+</h3>
+<P>
+Use &quot;--no-version --comment ''&quot;. Note that the left over blank line
+is required by the protocol.
+<P>
+<h3>
+<a NAME=q4.11>4.11)</a> What does the &quot;You are using the xxxx character set.&quot; mean?
+</h3>
+<P>
+This note is printed when UTF-8 mapping has to be done. Make sure
+that the displayed character set is the one you have activated on
+your system. Since &quot;iso-8859-1&quot; is the character set most used,
+this is the default. You can change the charset with the option
+&quot;--charset&quot;. It is important that your active character set matches
+the one displayed - if not, restrict yourself to plain 7 bit ASCII
+and no mapping has to be done.
+<P>
+<h3>
+<a NAME=q4.12>4.12)</a> How can I get list of key IDs used to encrypt a message?
+</h3>
+<P>
+<samp>
+   $ gpg --batch --decrypt --list-only --status-fd 1 2&gt;/dev/null |
+     awk '/^\[GNUPG:\] ENC_TO / { print $3 }'
+</samp>
+<P>
+<h3>
+<a NAME=q4.13>4.13)</a> Why can't I decrypt files encrypted as symmetrical-only (-c) with
+    a version of GnuPG prior to 1.0.1.
+</h3>
+<P>
+There was a bug in GnuPG versions prior to 1.0.1 which affected files
+only if 3DES or Twofish was used for symmetric-only encryption (this has
+never been the default). The bug has been fixed, but to enable decryption
+of old files you should run gpg with the option &quot;--emulate-3des-s2k-bug&quot;,
+decrypt the file and encrypt it again without this option.
+<P>
+NOTE: This option was removed in GnuPG development version 1.1.0 and later
+updates, so you will need to use a version between 1.0.1 and 1.0.7 to
+re-encrypt any affected files.
+<P>
+<h3>
+<a NAME=q4.14>4.14)</a> How can I use GnuPG in an automated environment?
+</h3>
+<P>
+You should use the option --batch and don't use passphrases as
+there is usually no way to store it more securely than on the
+secret keyring itself. The suggested way to create keys for an
+automated environment is:
+<P>
+On a secure machine:
+<ol>
+<li> If you want to do automatic signing, create a signing subkey
+       for your key (use the interactive key editing menu by issueing
+       the command 'gpg --edit-key keyID', enter &quot;addkey&quot; and select
+       the DSA key type).
+<li> Make sure that you use a passphrase (needed by the current
+       implementation).
+<li> gpg --export-secret-subkeys --no-comment foo &gt;secring.auto
+<li> Copy secring.auto and the public keyring to a test directory.
+<li> Change to this directory.
+<li> gpg --homedir . --edit foo and use &quot;passwd&quot; to remove the
+       passphrase from the subkeys. You may also want to remove all
+       unused subkeys.
+<li> Copy secring.auto to a floppy and carry it to the target box.
+</ol>
+<P>
+On the target machine:
+<ol>
+<li> Install secring.auto as the secret keyring.
+<li> Now you can start your new service. It's also a good idea to
+       install an intrusion detection system so that you hopefully
+       get a notice of an successful intrusion, so that you in turn
+       can revoke all the subkeys installed on that machine and
+       install new subkeys.
+</ol>
+<P>
+<h3>
+<a NAME=q4.15>4.15)</a> Which email-client can I use with GnuPG?
+</h3>
+<P>
+Using GnuPG to encrypt email is one of the most popular uses.
+Several mail clients or mail user agents (MUAs) support GnuPG to
+varying degrees. Simplifying a bit, there are two ways mail can be
+encrypted with GnuPG: the &quot;old style&quot; ASCII armor (i.e. cleartext
+encryption), and RFC 2015 style (previously PGP/MIME, now OpenPGP).
+The latter has full MIME support. Some MUAs support only one of
+them, so whichever you actually use depends on your needs as well
+as the capabilities of your addressee. As well, support may be
+native to the MUA, or provided via &quot;plug-ins&quot; or external tools.
+<P>
+The following list is not exhaustive:
+<P>
+<pre>
+   MUA            OpenPGP ASCII   How? (N,P,T)
+   -------------------------------------------------------------
+   Calypso           N      Y      P (Unixmail)
+   Elm               N      Y      T (mailpgp,morepgp)
+   Elm ME+           N      Y      N
+   Emacs/Gnus        Y      Y      T (Mailcrypt,gpg.el)
+   Emacs/Mew         Y      Y      N
+   Emacs/VM          N      Y      T (Mailcrypt)
+   Evolution         Y      Y      N
+   Exmh              Y      Y      N
+   GNUMail.app       Y      Y      P (PGPBundle)
+   GPGMail           Y      Y      N
+   KMail (&lt;=1.4.x)   N      Y      N
+   KMail (1.5.x)     Y(P)   Y(N)   P/N
+   Mozilla           Y      Y      P (Enigmail)
+   Mulberry          Y      Y      P
+   Mutt              Y      Y      N
+   Sylpheed          Y      Y      N
+   Sylpheed-claws    Y      Y      N
+   TkRat             Y      Y      N
+   XEmacs/Gnus       Y      Y      T (Mailcrypt)
+   XEmacs/Mew        Y      Y      N
+   XEmacs/VM         N      Y      T (Mailcrypt)
+   XFmail            Y      Y      N
+
+   N - Native, P - Plug-in, T - External Tool
+</pre>
+<P>
+The following table lists proprietary MUAs. The GNU Project
+suggests against the use of these programs, but they are listed
+for interoperability reasons for your convenience.
+<P>
+<pre>
+   MUA            OpenPGP ASCII   How? (N,P,T)
+   -------------------------------------------------------------
+   Apple Mail        Y      Y      P (GPGMail)
+   Becky2            Y      Y      P (BkGnuPG)
+   Eudora            Y      Y      P (EuroraGPG)
+   Eudora Pro        Y      Y      P (EudoraGPG)
+   Lotus Notes       N      Y      P
+   Netscape 4.x      N      Y      P
+   Netscape 7.x      Y      Y      P (Enigmail)
+   Novell Groupwise  N      Y      P
+   Outlook           N      Y      P (G-Data)
+   Outlook Express   N      Y      P (GPGOE)
+   Pegasus           N      Y      P (QDPGP,PM-PGP)
+   Pine              N      Y      T (pgpenvelope,(gpg|pgp)4pine)
+   Postme            N      Y      P (GPGPPL)
+   The Bat!          N      Y      P (Ritlabs)
+</pre>
+<P>
+Good overviews of OpenPGP-support can be found at:<br>
+<a href=http://www.openpgp.fr.st/courrier_en.html>&lt;http://www.openpgp.fr.st/courrier_en.html&gt;</a> and<br>
+<a href=http://www.bretschneidernet.de/tips/secmua.html>&lt;http://www.bretschneidernet.de/tips/secmua.html&gt;</a>.
+<P>
+Users of Win32 MUAs that lack OpenPGP support may look into
+using GPGrelay <a href=http://gpgrelay.sourceforge.net>&lt;http://gpgrelay.sourceforge.net&gt;</a>, a small
+email-relaying server that uses GnuPG to enable many email clients
+to send and receive emails that conform to PGP-MIME (RFC 2015).
+<P>
+<h3>
+<a NAME=q4.16>4.16)</a> Can't we have a gpg library?
+</h3>
+<P>
+This has been frequently requested. However, the current viewpoint
+of the GnuPG maintainers is that this would lead to several security
+issues and will therefore not be implemented in the foreseeable
+future. However, for some areas of application gpgme could do the
+trick. You'll find it at <a href=ftp://ftp.gnupg.org/gcrypt/alpha/gpgme>&lt;ftp://ftp.gnupg.org/gcrypt/alpha/gpgme&gt;</a>.
+<P>
+<h3>
+<a NAME=q4.17>4.17)</a> I have successfully generated a revocation certificate, but I don't
+    understand how to send it to the key servers.
+</h3>
+<P>
+Most keyservers don't accept a 'bare' revocation certificate. You
+have to import the certificate into gpg first:
+<P>
+<samp>
+   $ gpg --import my-revocation.asc
+</samp>
+<P>
+then send the revoked key to the keyservers:
+<P>
+<samp>
+   $ gpg --keyserver certserver.pgp.com --send-keys mykeyid
+</samp>
+<P>
+(or use a keyserver web interface for this).
+<P>
+<h3>
+<a NAME=q4.18>4.18)</a> How do I put my keyring in a different directory?
+</h3>
+<P>
+GnuPG keeps several files in a special homedir directory. These
+include the options file, pubring.gpg, secring.gpg, trustdb.gpg,
+and others. GnuPG will always create and use these files. On unices,
+the homedir is usually ~/.gnupg; on Windows &quot;C:\gnupg\&quot;.
+<P>
+If you want to put your keyrings somewhere else, use the option:
+<P>
+<samp>
+   --homedir /my/path/
+</samp>
+<P>
+to make GnuPG create all its files in that directory. Your keyring
+will be &quot;/my/path/pubring.gpg&quot;. This way you can store your secrets
+on a floppy disk. Don't use &quot;--keyring&quot; as its purpose is to specify
+additional keyring files.
+<P>
+<h3>
+<a NAME=q4.19>4.19)</a> How do I verify signed packages?
+</h3>
+<P>
+Before you can verify the signature that accompanies a package,
+you must first have the vendor, organisation, or issueing person's
+key imported into your public keyring. To prevent GnuPG warning
+messages the key should also be validated (or locally signed).
+<P>
+You will also need to download the detached signature file along
+with the package. These files will usually have the same name as
+the package, with either a binary (.sig) or ASCII armor (.asc)
+extension.
+<P>
+Once their key has been imported, and the package and accompanying
+signature files have been downloaded, use:
+<P>
+<samp>
+   $ gpg --verify sigfile signed-file
+</samp>
+<P>
+If the signature file has the same base name as the package file,
+the package can also be verified by specifying just the signature
+file, as GnuPG will derive the package's file name from the name
+given (less the .sig or .asc extension). For example, to verify a
+package named foobar.tar.gz against its detached binary signature
+file, use:
+<P>
+<samp>
+   $ gpg --verify foobar.tar.gz.sig
+</samp>
+<P>
+<h3>
+<a NAME=q4.20>4.20)</a> How do I export a keyring with only selected signatures (keys)?
+</h3>
+<P>
+If you're wanting to create a keyring with only a subset of keys
+selected from a master keyring (for a club, user group, or company
+department for example), simply specify the keys you want to export:
+<P>
+<samp>
+   $ gpg --armor --export key1 key2 key3 key4 &gt; keys1-4.asc
+</samp>
+<P>
+<h3>
+<a NAME=q4.21>4.21)</a> I still have my secret key, but lost my public key. What can I do?
+</h3>
+<P>
+All OpenPGP secret keys have a copy of the public key inside them,
+and in a worst-case scenario, you can create yourself a new public
+key using the secret key.
+<P>
+A tool to convert a secret key into a public one has been included
+(it's actually a new option for gpgsplit) and is available with GnuPG
+versions 1.2.1 or later (or can be found in CVS). It works like this:
+<P>
+<samp>
+   $ gpgsplit --no-split --secret-to-public secret.gpg &gt;publickey.gpg
+</samp>
+<P>
+One should first try to export the secret key and convert just this
+one. Using the entire secret keyring should work too. After this has
+been done, the publickey.gpg file can be imported into GnuPG as usual.
+<P>
+<h3>
+<a NAME=q4.22>4.22)</a> Clearsigned messages sent from my web-mail account have an invalid
+    signature. Why?
+</h3>
+<P>
+Check to make sure the settings for your web-based email account
+do not use HTML formatting for the pasted clearsigned message. This can
+alter the message with embedded HTML markup tags or spaces, resulting
+in an invalid signature. The recipient may be able to copy the signed
+message block to a text file for verification, or the web email
+service may allow you to attach the clearsigned message as a file
+if plaintext messages are not an option.
+<P>
+<P>
+<h2>
+<A NAME=q5>5. COMPATIBILITY ISSUES
+</A></h2>
+<P>
+<h3>
+<a NAME=q5.1>5.1)</a> How can I encrypt a message with GnuPG so that PGP is able to decrypt it?
+</h3>
+<P>
+It depends on the PGP version.
+<P>
+<ul>
+<li>PGP 2.x<br>
+You can't do that because PGP 2.x normally uses IDEA which is not
+supported by GnuPG as it is patented (see <a HREF=#q3.3>3.3</a>), but if you have a
+modified version of PGP you can try this:
+<P>
+<samp>
+   $ gpg --rfc1991 --cipher-algo 3des ...
+</samp>
+<P>
+Please don't pipe the data to encrypt to gpg but provide it using a
+filename; otherwise, PGP 2 will not be able to handle it.
+<P>
+As for conventional encryption, you can't do this for PGP 2.
+<P>
+<li>PGP 5.x and higher<br>
+You need to provide two additional options:
+<P>
+<samp>
+   --compress-algo 1 --cipher-algo cast5
+</samp>
+<P>
+You may also use &quot;3des&quot; instead of &quot;cast5&quot;, and &quot;blowfish&quot; does not
+work with all versions of PGP 5. You may also want to put:
+<P>
+<samp>
+   compress-algo 1
+</samp>
+<P>
+into your ~/.gnupg/options file - this does not affect normal GnuPG
+operation.
+<P>
+This applies to conventional encryption as well.
+</UL>
+<P>
+<h3>
+<a NAME=q5.2>5.2)</a> How do I migrate from PGP 2.x to GnuPG?
+</h3>
+<P>
+PGP 2 uses the RSA and IDEA encryption algorithms. Whereas the RSA
+patent has expired and RSA is included as of GnuPG 1.0.3, the IDEA
+algorithm is still patented until 2007. Under certain conditions you
+may use IDEA even today. In that case, you may refer to Question
+<a HREF=#q3.3>3.3</a> about how to add IDEA support to GnuPG and read
+<a href=http://www.gnupg.org/gph/en/pgp2x.html>&lt;http://www.gnupg.org/gph/en/pgp2x.html&gt;</a> to perform the migration.
+<P>
+<h3>
+<a NAME=q5.3>5.3)</a> (removed)
+</h3>
+<P>
+(empty)
+<P>
+<h3>
+<a NAME=q5.4>5.4)</a> Why is PGP 5.x not able to encrypt messages with some keys?
+</h3>
+<P>
+PGP, Inc. refuses to accept Elgamal keys of type 20 even for
+encryption. They only support type 16 (which is identical at least
+for decryption). To be more inter-operable, GnuPG (starting with
+version 0.3.3) now also uses type 16 for the Elgamal subkey which is
+created if the default key algorithm is chosen. You may add a type
+16 Elgamal key to your public key, which is easy as your key
+signatures are still valid.
+<P>
+<h3>
+<a NAME=q5.5>5.5)</a> Why is PGP 5.x not able to verify my messages?
+</h3>
+<P>
+PGP 5.x does not accept v4 signatures for data material but OpenPGP
+requests generation of v4 signatures for all kind of data, that's why
+GnuPG defaults to them. Use the option &quot;--force-v3-sigs&quot; to generate
+v3 signatures for data.
+<P>
+<h3>
+<a NAME=q5.6>5.6)</a> How do I transfer owner trust values from PGP to GnuPG?
+</h3>
+<P>
+There is a script in the tools directory to help you. After you have
+imported the PGP keyring you can give this command:
+<P>
+<samp>
+   $ lspgpot pgpkeyring | gpg --import-ownertrust
+</samp>
+<P>
+where pgpkeyring is the original keyring and not the GnuPG keyring
+you might have created in the first step.
+<P>
+<h3>
+<a NAME=q5.7>5.7)</a> PGP does not like my secret key.
+</h3>
+<P>
+Older PGPs probably bail out on some private comment packets used by
+GnuPG. These packets are fully in compliance with OpenPGP; however
+PGP is not really OpenPGP aware. A workaround is to export the
+secret keys with this command:
+<P>
+<samp>
+   $ gpg --export-secret-keys --no-comment -a your-KeyID
+</samp>
+<P>
+Another possibility is this: by default, GnuPG encrypts your secret
+key using the Blowfish symmetric algorithm. Older PGPs will only
+understand 3DES, CAST5, or IDEA symmetric algorithms. Using the
+following method you can re-encrypt your secret gpg key with a
+different algo:
+<P>
+<samp>
+   $ gpg --s2k-cipher-algo=CAST5 --s2k-digest-algo=SHA1
+     --compress-algo=1  --edit-key &lt;username&gt;
+</samp>
+<P>
+Then use passwd to change the password (just change it to the same
+thing, but it will encrypt the key with CAST5 this time).
+<P>
+Now you can export it and PGP should be able to handle it.
+<P>
+For PGP 6.x the following options work to export a key:
+<P>
+<samp>
+   $ gpg --s2k-cipher-algo 3des --compress-algo 1 --rfc1991
+     --export-secret-keys &lt;KeyID&gt;
+</samp>
+<P>
+<h3>
+<a NAME=q5.8>5.8)</a> GnuPG no longer installs a ~/.gnupg/options file. Is it missing?
+</h3>
+<P>
+No. The ~/.gnupg/options file has been renamed to ~/.gnupg/gpg.conf for
+new installs as of version 1.1.92. If an existing ~/.gnupg/options file
+is found during an upgrade it will still be used, but this change was
+required to have a more consistent naming scheme with forthcoming tools.
+An existing options file can be renamed to gpg.conf for users upgrading,
+or receiving the message that the &quot;old default options file&quot; is ignored
+(occurs if both a gpg.conf and an options file are found).
+<P>
+<h3>
+<a NAME=q5.9>5.9)</a> How do you export GnuPG keys for use with PGP?
+</h3>
+<P>
+This has come up fairly often, so here's the HOWTO:
+<P>
+PGP can (for most key types) use secret keys generated by GnuPG. The
+problems that come up occasionally are generally because GnuPG
+supports a few more features from the OpenPGP standard than PGP does.
+If your secret key has any of those features in use, then PGP will
+reject the key or you will have problems communicating later. Note
+that PGP doesn't do Elgamal signing keys at all, so they are not
+usable with any version.
+<P>
+These instructions should work for GnuPG 1.0.7 and later, and PGP
+7.0.3 and later.
+<P>
+Start by editing the key. Most of this line is not really necessary
+as the default values are correct, but it does not hurt to repeat the
+values, as this will override them in case you have something else set
+in your options file.
+<P>
+<samp>
+   $ gpg --s2k-cipher-algo cast5 --s2k-digest-algo sha1 --s2k-mode 3
+     --simple-sk-checksum --edit KeyID
+</samp>
+<P>
+Turn off some features. Set the list of preferred ciphers, hashes,
+and compression algorithms to things that PGP can handle. (Yes, I
+know this is an odd list of ciphers, but this is what PGP itself uses,
+minus IDEA).
+<P>
+<samp>
+   &gt; setpref S9 S8 S7 S3 S2 S10 H2 H3 Z1 Z0
+</samp>
+<P>
+Now put the list of preferences onto the key.
+<P>
+<samp>
+   &gt; updpref
+</samp>
+<P>
+Finally we must decrypt and re-encrypt the key, making sure that we
+encrypt with a cipher that PGP likes. We set this up in the --edit
+line above, so now we just need to change the passphrase to make it
+take effect. You can use the same passphrase if you like, or take
+this opportunity to actually change it.
+<P>
+<samp>
+   &gt; passwd
+</samp>
+<P>
+Save our work.
+<P>
+<samp>
+   &gt; save
+</samp>
+<P>
+Now we can do the usual export:
+<P>
+<samp>
+   $ gpg --export KeyID &gt; mypublickey.pgp<br>
+   $ gpg --export-secret-key KeyID &gt; mysecretkey.pgp
+</samp>
+<P>
+Thanks to David Shaw for this information!
+<P>
+<P>
+<h2>
+<A NAME=q6>6. PROBLEMS and ERROR MESSAGES
+</A></h2>
+<P>
+<h3>
+<a NAME=q6.1>6.1)</a> Why do I get &quot;gpg: Warning: using insecure memory!&quot;
+</h3>
+<P>
+On many systems this program should be installed as setuid(root).
+This is necessary to lock memory pages. Locking memory pages prevents
+the operating system from writing them to disk and thereby keeping your
+secret keys really secret. If you get no warning message about insecure
+memory your operating system supports locking without being root. The
+program drops root privileges as soon as locked memory is allocated.
+<P>
+To setuid(root) permissions on the gpg binary you can either use:
+<P>
+<samp>
+   $ chmod u+s /path/to/gpg
+</samp>
+<P>
+or
+<P>
+<samp>
+   $ chmod 4755 /path/to/gpg
+</samp>
+<P>
+Some refrain from using setuid(root) unless absolutely required for
+security reasons. Please check with your system administrator if you
+are not able to make these determinations yourself. 
+<P>
+On UnixWare 2.x and 7.x you should install GnuPG with the 'plock'
+privilege to get the same effect:
+<P>
+<samp>
+   $ filepriv -f plock /path/to/gpg
+</samp>
+<P>
+If you can't or don't want to install GnuPG setuid(root), you can
+use the option &quot;--no-secmem-warning&quot; or put:
+<P>
+<samp>
+   no-secmem-warning
+</samp>
+<P>
+in your ~/.gnupg/options or ~/.gnupg/gpg.conf file (this disables
+the warning).
+<P>
+On some systems (e.g., Windows) GnuPG does not lock memory pages
+and older GnuPG versions (&lt;=1.0.4) issue the warning:
+<P>
+<samp>
+   gpg: Please note that you don't have secure memory
+</samp>
+<P>
+This warning can't be switched off by the above option because it
+was thought to be too serious an issue. However, it confused users
+too much, so the warning was eventually removed.
+<P>
+<h3>
+<a NAME=q6.2>6.2)</a> Large File Support doesn't work ...
+</h3>
+<P>
+LFS works correctly in post-1.0.4 versions. If configure doesn't
+detect it, try a different (i.e., better) compiler. egcs 1.1.2 works
+fine, other gccs sometimes don't. BTW, several compilation problems
+of GnuPG 1.0.3 and 1.0.4 on HP-UX and Solaris were due to broken LFS
+support.
+<P>
+<h3>
+<a NAME=q6.3>6.3)</a> In the edit menu the trust values are not displayed correctly after
+    signing uids. Why?
+</h3>
+<P>
+This happens because some information is stored immediately in
+the trustdb, but the actual trust calculation can be done after the
+save command. This is a &quot;not easy to fix&quot; design bug which will be
+addressed in some future release.
+<P>
+<h3>
+<a NAME=q6.4>6.4)</a> What does &quot;skipping pubkey 1: already loaded&quot; mean?
+</h3>
+<P>
+As of GnuPG 1.0.3, the RSA algorithm is included. If you still have
+a &quot;load-extension rsa&quot; in your options file, the above message
+occurs. Just remove the load command from the options file.
+<P>
+<h3>
+<a NAME=q6.5>6.5)</a> GnuPG 1.0.4 doesn't create ~/.gnupg ...
+</h3>
+<P>
+That's a known bug, already fixed in newer versions.
+<P>
+<h3>
+<a NAME=q6.6>6.6)</a> An Elgamal signature does not verify anymore since version 1.0.2 ...
+</h3>
+<P>
+Use the option --emulate-md-encode-bug.
+<P>
+<h3>
+<a NAME=q6.7>6.7)</a> Old versions of GnuPG can't verify Elgamal signatures
+</h3>
+<P>
+Update to GnuPG 1.0.2 or newer.
+<P>
+<h3>
+<a NAME=q6.8>6.8)</a> When I use --clearsign, the plain text has sometimes extra dashes
+    in it - why?
+</h3>
+<P>
+This is called dash-escaped text and is required by OpenPGP.
+It always happens when a line starts with a dash (&quot;-&quot;) and is
+needed to make the lines that structure signature and text
+(i.e., &quot;-----BEGIN PGP SIGNATURE-----&quot;) to be the only lines
+that start with two dashes.
+<P>
+If you use GnuPG to process those messages, the extra dashes
+are removed. Good mail clients remove those extra dashes when
+displaying such a message.      
+<P>
+<h3>
+<a NAME=q6.9>6.9)</a> What is the thing with &quot;can't handle multiple signatures&quot;?
+</h3>
+<P>
+Due to different message formats GnuPG is not always able to split
+a file with multiple signatures unambiguously into its parts. This
+error message informs you that there is something wrong with the input.
+<P>
+The only way to have multiple signatures in a file is by using the
+OpenPGP format with one-pass-signature packets (which is GnuPG's
+default) or the cleartext signed format.
+<P>
+<h3>
+<a NAME=q6.10>6.10)</a> If I submit a key to a keyserver, nothing happens ...
+</h3>
+<P>
+You are most likely using GnuPG 1.0.2 or older on Windows. That's
+feature isn't yet implemented, but it's a bug not to say it. Newer
+versions issue a warning. Upgrade to 1.0.4 or newer.
+<P>
+<h3>
+<a NAME=q6.11>6.11)</a> I get &quot;gpg: waiting for lock ...&quot;
+</h3>
+<P>
+A previous instance of gpg has most likely exited abnormally and left
+a lock file. Go to ~/.gnupg and look for .*.lock files and remove them.
+<P>
+<h3>
+<a NAME=q6.12>6.12)</a> Older gpg binaries (e.g., 1.0) have problems with keys from newer
+    gpg binaries ...
+</h3>
+<P>
+As of 1.0.3, keys generated with gpg are created with preferences to
+TWOFISH (and AES since 1.0.4) and that also means that they have the
+capability to use the new MDC encryption method. This will go into
+OpenPGP soon, and is also suppoted by PGP 7. This new method avoids
+a (not so new) attack on all email encryption systems.
+<P>
+This in turn means that pre-1.0.3 gpg binaries have problems with
+newer keys. Because of security and bug fixes, you should keep your
+GnuPG installation in a recent state anyway. As a workaround, you can
+force gpg to use a previous default cipher algo by putting:
+<P>
+<samp>
+   cipher-algo cast5
+</samp>
+<P>
+into your options file.
+<P>
+<h3>
+<a NAME=q6.13>6.13)</a> With 1.0.4, I get &quot;this cipher algorithm is deprecated ...&quot;
+</h3>
+<P>
+If you just generated a new key and get this message while
+encrypting, you've witnessed a bug in 1.0.4. It uses the new AES
+cipher Rijndael that is incorrectly being referred as &quot;deprecated&quot;.
+Ignore this warning, more recent versions of gpg are corrected.
+<P>
+<h3>
+<a NAME=q6.14>6.14)</a> Some dates are displayed as ????-??-??. Why?
+</h3>
+<P>
+Due to constraints in most libc implementations, dates beyond
+2038-01-19 can't be displayed correctly. 64-bit OSes are not
+affected by this problem. To avoid printing wrong dates, GnuPG
+instead prints some question marks. To see the correct value, you
+can use the options --with-colons and --fixed-list-mode.
+<P>
+<h3>
+<a NAME=q6.15>6.15)</a> I still have a problem. How do I report a bug?
+</h3>
+<P>
+Are you sure that it's not been mentioned somewhere on the mailing
+lists? Did you have a look at the bug list (you'll find a link to
+the list of reported bugs on the documentation page). If you're not
+sure about it being a bug, you can send mail to the gnupg-devel
+list. Otherwise, use the GUUG bug tracking system 
+<a href=http://bugs.guug.de/Reporting.html>&lt;http://bugs.guug.de/Reporting.html&gt;</a>.
+<P>
+<h3>
+<a NAME=q6.16>6.16)</a> Why doesn't GnuPG support X.509 certificates?
+</h3>
+<P>
+GnuPG, first and foremost, is an implementation of the OpenPGP
+standard (RFC 2440), which is a competing infrastructure, different
+from X.509.
+<P>
+They are both public-key cryptosystems, but how the public keys are
+actually handled is different.
+<P>
+<h3>
+<a NAME=q6.17>6.17)</a> Why do national characters in my user ID look funny?
+</h3>
+<P>
+According to OpenPGP, GnuPG encodes user ID strings (and other
+things) using UTF-8. In this encoding of Unicode, most national
+characters get encoded as two- or three-byte sequences. For
+example, &amp;aring; (0xE5 in ISO-8859-1) becomes &amp;Atilde;&amp;yen; (0xC3,
+0xA5). This might also be the reason why keyservers can't find
+your key.
+<P>
+<h3>
+<a NAME=q6.18>6.18)</a> I get 'sed' errors when running ./configure on Mac OS X ...
+</h3>
+<P>
+This will be fixed after GnuPG has been upgraded to autoconf-2.50.
+Until then, find the line setting CDPATH in the configure script
+and place an:
+<P>
+<samp>
+   unset CDPATH
+</samp>
+<P>
+statement below it.
+<P>
+<h3>
+<a NAME=q6.19>6.19)</a> Why does GnuPG 1.0.6 bail out on keyrings used with 1.0.7?
+</h3>
+<P>
+There is a small bug in 1.0.6 which didn't parse trust packets
+correctly. You may want to apply this patch if you can't upgrade:
+<P>
+<a href=http://www.gnupg.org/developer/gpg-woody-fix.txt>&lt;http://www.gnupg.org/developer/gpg-woody-fix.txt&gt;</a>
+<P>
+<h3>
+<a NAME=q6.20>6.20)</a> I upgraded to GnuPG version 1.0.7 and now it takes longer to load my
+    keyrings. What can I do?
+</h3>
+<P>
+The way signature states are stored has changed so that v3 signatures
+can be supported. You can use the new --rebuild-keydb-caches migration
+command, which was built into this release and increases the speed of
+many operations for existing keyrings.
+<P>
+<h3>
+<a NAME=q6.21>6.21)</a> Doesn't a fully trusted user ID on a key prevent warning messages
+    when encrypting to other IDs on the key?
+</h3>
+<P>
+No. That was actually a key validity bug in GnuPG 1.2.1 and earlier
+versions. As part of the development of GnuPG 1.2.2, a bug was
+discovered in the key validation code.  This bug causes keys with
+more than one user ID to give all user IDs on the key the amount of
+validity given to the most-valid key. The bug has been fixed in GnuPG
+release 1.2.2, and upgrading is the recommended fix for this problem.
+More information and a patch for a some pre-1.2.2 versions of GnuPG
+can be found at:
+<P>
+<a href=http://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000268.html>&lt;http://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000268.html&gt;</a>
+<P>
+<h3>
+<a NAME=q6.22>6.22)</a> I just compiled GnuPG from source on my GNU/Linux RPM-based system
+    and it's not working. Why?
+</h3>
+<P>
+Many GNU/Linux distributions that are RPM-based will install a
+version of GnuPG as part of its standard installation, placing the
+binaries in the /usr/bin directory. Later, compiling and installing
+GnuPG from source other than from a source RPM won't normally
+overwrite these files, as the default location for placement of
+GnuPG binaries is in /usr/local/bin unless the '--prefix' switch
+is used during compile to specify an alternate location. Since the
+/usr/bin directory more than likely appears in your path before
+/usr/local/bin, the older RPM-version binaries will continue to
+be used when called since they were not replaced.
+<P>
+To resolve this, uninstall the RPM-based version with 'rpm -e gnupg'
+before installing the binaries compiled from source. If dependency
+errors are displayed when attempting to uninstall the RPM (such as
+when Red Hat's up2date is also installed, which uses GnuPG), uninstall
+the RPM with 'rpm -e gnupg --nodeps' to force the uninstall. Any
+dependent files should be automatically replaced during the install
+of the compiled version. If the default /usr/local/bin directory is
+used, some packages such as SuSE's Yast Online Update may need to be
+configured to look for GnuPG binaries in the /usr/local/bin directory,
+or symlinks can be created in /usr/bin that point to the binaries
+located in /usr/local/bin.
+<P>
+<P>
+<h2>
+<A NAME=q7>7. ADVANCED TOPICS
+</A></h2>
+<P>
+<h3>
+<a NAME=q7.1>7.1)</a> How does this whole thing work?
+</h3>
+<P>
+To generate a secret/public keypair, run:
+<P>
+<samp>
+   $ gpg --gen-key
+</samp>
+<P>
+and choose the default values.
+<P>
+Data that is encrypted with a public key can only be decrypted by
+the matching secret key. The secret key is protected by a password,
+the public key is not.
+<P>
+So to send your friend a message, you would encrypt your message
+with his public key, and he would only be able to decrypt it by
+having the secret key and putting in the password to use his secret
+key.
+<P>
+GnuPG is also useful for signing things. Files that are encrypted
+with the secret key can be decrypted with the public key. To sign
+something, a hash is taken of the data, and then the hash is in some
+form encoded with the secret key. If someone has your public key, they
+can verify that it is from you and that it hasn't changed by checking
+the encoded form of the hash with the public key.
+<P>
+A keyring is just a large file that stores keys. You have a public
+keyring where you store yours and your friend's public keys. You have
+a secret keyring that you keep your secret key on, and should be very
+careful with. Never ever give anyone else access to it and use a *good*
+passphrase to protect the data in it.
+<P>
+You can 'conventionally' encrypt something by using the option 'gpg -c'.
+It is encrypted using a passphrase, and does not use public and secret
+keys. If the person you send the data to knows that passphrase, they
+can decrypt it. This is usually most useful for encrypting things to
+yourself, although you can encrypt things to your own public key in the
+same way. It should be used for communication with partners you know
+and where it is easy to exchange the passphrases (e.g. with your boy
+friend or your wife). The advantage is that you can change the
+passphrase from time to time and decrease the risk, that many old
+messages may be decrypted by people who accidently got your passphrase.
+<P>
+You can add and copy keys to and from your keyring with the 'gpg
+--import' and 'gpg --export' command. 'gpg --export-secret-keys' will
+export secret keys. This is normally not useful, but you can generate
+the key on one machine then move it to another machine.
+<P>
+Keys can be signed under the 'gpg --edit-key' option. When you sign a
+key, you are saying that you are certain that the key belongs to the
+person it says it comes from. You should be very sure that is really
+that person: You should verify the key fingerprint with:
+<P>
+<samp>
+   $ gpg --fingerprint KeyID
+</samp>
+<P>
+over the phone (if you really know the voice of the other person), at
+a key signing party (which are often held at computer conferences),
+or at a meeting of your local GNU/Linux User Group.
+<P>
+Hmm, what else. You may use the option '-o filename' to force output
+to this filename (use '-' to force output to stdout). '-r' just lets
+you specify the recipient (which public key you encrypt with) on the
+command line instead of typing it interactively.
+<P>
+Oh yeah, this is important. By default all data is encrypted in some
+weird binary format. If you want to have things appear in ASCII text
+that is readable, just add the '-a' option. But the preferred method
+is to use a MIME aware mail reader (Mutt, Pine and many more).
+<P>
+There is a small security glitch in the OpenPGP (and therefore GnuPG)
+system; to avoid this you should always sign and encrypt a message
+instead of only encrypting it.
+<P>
+<h3>
+<a NAME=q7.2>7.2)</a> Why are some signatures with an ELG-E key valid?
+</h3>
+<P>
+These are Elgamal keys generated by GnuPG in v3 (RFC 1991) packets.
+The OpenPGP draft later changed the algorithm identifier for Elgamal
+keys which are usable for signatures and encryption from 16 to 20.
+GnuPG now uses 20 when it generates new Elgamal keys but still
+accepts 16 (which is according to OpenPGP &quot;encryption only&quot;) if this
+key is in a v3 packet. GnuPG is the only program which had used
+these v3 Elgamal keys - so this assumption is quite safe.
+<P>
+<h3>
+<a NAME=q7.3>7.3)</a> How does the whole trust thing work?
+</h3>
+<P>
+It works more or less like PGP. The difference is that the trust is
+computed at the time it is needed. This is one of the reasons for
+the trustdb which holds a list of valid key signatures. If you are
+not running in batch mode you will be asked to assign a trust
+parameter (ownertrust) to a key.
+<P>
+You can see the validity (calculated trust value) using this
+command.
+<P>
+<samp>
+   $ gpg --list-keys --with-colons
+</samp> 
+<P>
+If the first field is &quot;pub&quot; or &quot;uid&quot;, the second field shows you the
+trust:
+<P>
+<pre>
+   o = Unknown (this key is new to the system)
+   e = The key has expired
+   q = Undefined (no value assigned)
+   n = Don't trust this key at all
+   m = There is marginal trust in this key
+   f = The key is full trusted
+   u = The key is ultimately trusted; this is only used
+       for keys for which the secret key is also available.
+   r = The key has been revoked
+   d = The key has been disabled
+</pre>
+<P>
+The value in the &quot;pub&quot; record is the best one of all &quot;uid&quot; records.
+You can get a list of the assigned trust values (how much you trust
+the owner to correctly sign another person's key) with:
+<P>
+<samp>
+   $ gpg --list-ownertrust
+</samp>
+<P>
+The first field is the fingerprint of the primary key, the second
+field is the assigned value:
+<P>
+<pre>
+   - = No ownertrust value yet assigned or calculated.
+   n = Never trust this keyholder to correctly verify others signatures.
+   m = Have marginal trust in the keyholders capability to sign other
+       keys.
+   f = Assume that the key holder really knows how to sign keys.
+   u = No need to trust ourself because we have the secret key.
+</pre>
+<P>
+Keep these values confidential because they express your opinions
+about others. PGP stores this information with the keyring thus it
+is not a good idea to publish a PGP keyring instead of exporting the
+keyring. GnuPG stores the trust in the trustdb.gpg file so it is okay
+to give a gpg keyring away (but we have a --export command too).
+<P>
+<h3>
+<a NAME=q7.4>7.4)</a> What kind of output is this: &quot;key C26EE891.298, uid 09FB: ....&quot;?
+</h3>
+<P>
+This is the internal representation of a user ID in the trustdb.
+&quot;C26EE891&quot; is the keyid, &quot;298&quot; is the local ID (a record number in
+the trustdb) and &quot;09FB&quot; is the last two bytes of a ripe-md-160 hash
+of the user ID for this key.
+<P>
+<h3>
+<a NAME=q7.5>7.5)</a> How do I interpret some of the informational outputs?
+</h3>
+<P>
+While checking the validity of a key, GnuPG sometimes prints some
+information which is prefixed with information about the checked
+item.
+<P>
+<samp>
+   &quot;key 12345678.3456&quot;
+</samp>
+<P>
+This is about the key with key ID 12345678 and the internal number
+3456, which is the record number of the so called directory record
+in the trustdb.
+<P>
+<samp>
+   &quot;uid 12345678.3456/ACDE&quot;
+</samp>
+<P>
+This is about the user ID for the same key. To identify the user ID
+the last two bytes of a ripe-md-160 over the user ID ring is printed.
+<P>
+<samp>
+   &quot;sig 12345678.3456/ACDE/9A8B7C6D&quot;
+</samp>
+<P>
+This is about the signature with key ID 9A8B7C6D for the above key
+and user ID, if it is a signature which is direct on a key, the user
+ID part is empty (..//..).
+<P>
+<h3>
+<a NAME=q7.6>7.6)</a> Are the header lines of a cleartext signature part of the signed
+    material?
+</h3>
+<P>
+No. For example you can add or remove &quot;Comment:&quot; lines. They have
+a purpose like the mail header lines. However a &quot;Hash:&quot; line is
+needed for OpenPGP signatures to tell the parser which hash
+algorithm to use.
+<P>
+<h3>
+<a NAME=q7.7>7.7)</a> What is the list of preferred algorithms?
+</h3>
+<P>
+The list of preferred algorithms is a list of cipher, hash and
+compression algorithms stored in the self-signature of a key during
+key generation. When you encrypt a document, GnuPG uses this list
+(which is then part of a public key) to determine which algorithms
+to use. Basically it tells other people what algorithms the
+recipient is able to handle and provides an order of preference.
+<P>
+<h3>
+<a NAME=q7.8>7.8)</a> How do I change the list of preferred algorithms?
+</h3>
+<P>
+In version 1.0.7 or later, you can use the edit menu and set the
+new list of preference using the command &quot;setpref&quot;; the format of
+this command resembles the output of the command &quot;pref&quot;. The
+preference is not changed immediately but the set preference will
+be used when a new user ID is created. If you want to update the
+preferences for existing user IDs, select those user IDs (or select
+none to update all) and enter the command &quot;updpref&quot;. Note that the
+timestamp of the self-signature is increased by one second when
+running this command.
+<P>
+<P>
+<h2>
+<A NAME=q8>8. ACKNOWLEDGEMENTS
+</A></h2>
+<P>
+Many thanks to Nils Ellmenreich for maintaining this FAQ file for
+such a long time, Werner Koch for the original FAQ file, and to all
+posters to gnupg-users and gnupg-devel. They all provided most of
+the answers.
+<P>
+Also thanks to Casper Dik for providing us with a script to generate
+this FAQ (he uses it for the excellent Solaris2 FAQ).
+<P>
+<hr>
+<P>
+Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02111, USA
+<P>
+Verbatim copying and distribution of this entire article is permitted in
+any medium, provided this notice is preserved.
+</body></html>
diff --git a/doc/faq.raw b/doc/faq.raw
new file mode 100644 (file)
index 0000000..cbab76b
--- /dev/null
@@ -0,0 +1,1344 @@
+[$htmltitle=GnuPG FAQ]
+[$htmlcharset=<meta http-equiv="content-type" content="text/html; charset=utf-8">]
+[$sfaqheader=The GnuPG FAQ says:]
+[$sfaqfooter=
+The most recent version of the FAQ is available from
+<http://www.gnupg.org/>
+]
+[$usenetheader=
+]
+[$maintainer=David D. Scribner, <faq 'at' gnupg.org>]
+[$hGPGHTTP=http://www.gnupg.org]
+[$hGPGFTP=ftp://ftp.gnupg.org]
+[$hVERSION=1.2.2]
+
+[H body bgcolor=#ffffff text=#000000 link=#1f00ff alink=#ff0000 vlink=#9900dd]
+[H h1]GnuPG Frequently Asked Questions[H /h1]
+
+
+[H p]
+Version: 1.6.3[H br]
+Last-Modified: Jul 30, 2003[H br]
+Maintained-by: [$maintainer]
+[H /p]
+
+
+This is the GnuPG FAQ. The latest HTML version is available
+[H a href=[$hGPGHTTP]/documentation/faqs.html]here[H/a].
+
+The index is generated automatically, so there may be errors. Not all
+questions may be in the section they belong to. Suggestions about how
+to improve the structure of this FAQ are welcome.
+
+Please send additions and corrections to the maintainer. It would be
+most convenient if you could provide the answer to be included here
+as well. Your help is very much appreciated!
+
+Please, don't send message like "This should be a FAQ - what's the
+answer?". If it hasn't been asked before, it isn't a FAQ. In that case
+you could search in the mailing list archive.
+
+[H hr]
+<C>
+[H hr]
+
+
+<S> GENERAL
+
+<Q> What is GnuPG?
+
+    [H a href=[$hGPGHTTP]]GnuPG[H /a] stands for GNU Privacy Guard and
+    is GNU's tool for secure communication and data storage. It can be
+    used to encrypt data and to create digital signatures. It includes
+    an advanced key management facility and is compliant with the
+    proposed OpenPGP Internet standard as described in [H a href=http://www.rfc-editor.org/]RFC 2440[H/a].
+    As such, it is aimed to be compatible with PGP from PGP Corp. and
+    other OpenPGP tools
+
+<Q> Is GnuPG compatible with PGP?
+
+    In general, yes. GnuPG and newer PGP releases should be implementing
+    the OpenPGP standard. But there are some interoperability problems.
+    See question <Rcompat> for details.
+
+<Q> Is GnuPG free to use for personal or commercial use?
+
+    Yes. GnuPG is part of the GNU family of tools and applications built
+    and provided in accordance with the Free Software Foundation (FSF)
+    General Public License (GPL). Therefore the software is free to copy,
+    use, modify and distribute in accordance with that license. Please
+    read the file titled COPYING that accompanies the application for
+    more information.
+
+<Q> What conventions are used in this FAQ?
+
+    Although GnuPG is being developed for several operating systems
+    (often in parallel), the conventions used in this FAQ reflect a
+    UNIX shell environment. For Win32 users, references to a shell
+    prompt (`$') should be interpreted as a command prompt (`>'),
+    directory names separated by a forward slash (`/') may need to be
+    converted to a back slash (`\'), and a tilde (`~') represents a
+    user's "home" directory (reference question <Rhomedir> for an example).
+
+    Some command-lines presented in this FAQ are too long to properly
+    display in some browsers for the web page version of this file, and
+    have been split into two or more lines. For these commands please
+    remember to enter the entire command-string on one line or the
+    command will error, or at minimum not give the desired results. 
+
+    Please keep in mind that this FAQ contains information that may not
+    apply to your particular version, as new features and bug fixes are
+    added on a continuing basis (reference the NEWS file included with
+    the source or package for noteworthy changes between versions). One
+    item to note is that starting with GnuPG version 1.1.92 the file
+    containing user options and settings has been renamed from "options"
+    to "gpg.conf". Information in the FAQ that relates to the options
+    file may be interchangable with the newer gpg.conf file in many
+    instances. See question <Roptions> for details.
+
+
+<S> SOURCES of INFORMATION
+
+<Q> Where can I find more information on GnuPG?
+
+    On-line resources:
+
+    [H ul] 
+    [H li]The documentation page is located at [H a href=[$hGPGHTTP]/documentation/]<[$hGPGHTTP]/documentation/>[H/a].
+    Also, have a look at the HOWTOs and the GNU Privacy Handbook (GPH,
+    available in English, Spanish and Russian). The latter provides a
+    detailed user's guide to GnuPG. You'll also find a document about how
+    to convert from PGP 2.x to GnuPG.
+
+    [H li]At [H a href=[$hGPGHTTP]/documentation/mailing-lists.html]<[$hGPGHTTP]/documentation/mailing-lists.html>[H/a] you'll find
+    an online archive of the GnuPG mailing lists. Most interesting should
+    be gnupg-users for all user-related issues and gnupg-devel if you want
+    to get in touch with the developers.
+
+    In addition, searchable archives can be found on MARC, e.g.: [H br]
+    gnupg-users: [H a href=http://marc.theaimsgroup.com/?l=gnupg-users&r=1&w=2]<http://marc.theaimsgroup.com/?l=gnupg-users&r=1&w=2>[H/a][H br]
+    gnupg-devel: [H a href=http://marc.theaimsgroup.com/?l=gnupg-devel&r=1&w=2]<http://marc.theaimsgroup.com/?l=gnupg-devel&r=1&w=2>[H/a][H br]
+
+    [H b]PLEASE:[H /b]
+    Before posting to a list, read this FAQ and the available documentation.
+    In addition, search the list archive - maybe your question has already
+    been discussed. This way you help people focus on topics that have not
+    yet been resolved.
+
+    [H li]The GnuPG source distribution contains a subdirectory:
+
+    [H samp]
+       ./doc
+    [H /samp]
+
+    where some additional documentation is located (mainly interesting
+    for hackers, not the casual user).
+    [H /ul]
+
+<Q> Where do I get GnuPG?
+
+    You can download the GNU Privacy Guard from its primary FTP server
+    [H a href=[$hGPGFTP]/gcrypt/]<[$hGPGFTP]/gcrypt/>[H /a] or from one of the mirrors:
+
+    [H a href=[$hGPGHTTP]/download/mirrors.html]
+       <[$hGPGHTTP]/download/mirrors.html>
+    [H /a]
+
+    The current stable version is [$hVERSION]. Please upgrade to this version as
+    it includes additional features, functions and security fixes that may
+    not have existed in prior versions.
+
+
+<S> INSTALLATION 
+
+<Q> Which OSes does GnuPG run on?
+
+    It should run on most Unices as well as Windows versions (including
+    Windows NT/2000) and Macintosh OS/X. A list of OSes reported to be OK
+    is presented at:
+
+    [H a href=[$hGPGHTTP]/download/supported_systems.html]
+       <[$hGPGHTTP]/download/supported_systems.html>
+    [H /a]
+
+<Q> Which random data gatherer should I use?
+
+    "Good" random numbers are crucial for the security of your encryption.
+    Different operating systems provide a variety of more or less quality
+    random data. Linux and *BSD provide kernel generated random data
+    through /dev/random - this should be the preferred choice on these
+    systems. Also Solaris users with the SUNWski package installed have
+    a /dev/random. In these cases, use the configure option:
+
+    [H samp]
+       --enable-static-rnd=linux
+    [H /samp]
+
+    In addition, there's also the kernel random device by Andi Maier
+    [H a href= http://www.cosy.sbg.ac.at/~andi/SUNrand/]<http://www.cosy.sbg.ac.at/~andi/SUNrand/>[H /a], but it's still beta. Use at your
+    own risk!
+
+    On other systems, the Entropy Gathering Daemon (EGD) is a good choice.
+    It is a perl-daemon that monitors system activity and hashes it into
+    random data. See the download page [H a href=[$hGPGHTTP]/download/]<[$hGPGHTTP]/download/>[H /a]
+    to obtain EGD. Use:
+
+    [H samp]
+       --enable-static-rnd=egd
+    [H /samp]
+
+    here.
+
+    If the above options do not work, you can use the random number
+    generator "unix". This is [H B]very[H /B] slow and should be avoided. The
+    random quality isn't very good so don't use it on sensitive data.
+
+<Didea>
+<Q> How do I include support for RSA and IDEA?
+
+    RSA is included as of GnuPG version 1.0.3.
+
+    The official GnuPG distribution does not contain IDEA due to a patent
+    restriction. The patent does not expire before 2007 so don't expect
+    official support before then.
+
+    However, there is an unofficial module to include it even in earlier
+    versions of GnuPG. It's available from
+    [H a href=ftp://ftp.gnupg.dk/pub/contrib-dk/]<ftp://ftp.gnupg.dk/pub/contrib-dk/>[H /a]. Look for:
+
+    [H pre]
+       idea.c.gz        (c module)
+       idea.c.gz.sig    (signature file)
+    [H /pre]
+
+    [H pre]
+       ideadll.zip      (c module and win32 dll)
+       ideadll.zip.sig  (signature file)
+    [H /pre]
+
+    Compilation directives are in the headers of these files. You will
+    then need to add the following line to your ~/.gnupg/gpg.conf or
+    ~/.gnupg/options file:
+
+    [H samp]
+       load-extension idea
+    [H /samp]
+
+
+<S> USAGE
+
+<Q> What is the recommended key size?
+
+    1024 bit for DSA signatures; even for plain Elgamal signatures.
+    This is sufficient as the size of the hash is probably the weakest
+    link if the key size is larger than 1024 bits. Encryption keys may
+    have greater sizes, but you should then check the fingerprint of
+    this key:
+
+    [H samp]
+       $ gpg --fingerprint <user ID>
+    [H /samp]
+
+    As for the key algorithms, you should stick with the default (i.e.,
+    DSA signature and Elgamal encryption). An Elgamal signing key has
+    the following disadvantages: the signature is larger, it is hard
+    to create such a key useful for signatures which can withstand some
+    real world attacks, you don't get any extra security compared to
+    DSA, and there might be compatibility problems with certain PGP
+    versions. It has only been introduced because at the time it was
+    not clear whether there was a patent on DSA.
+
+<Q> Why does it sometimes take so long to create keys?
+
+    The problem here is that we need a lot of random bytes and for that
+    we (on Linux the /dev/random device) must collect some random data.
+    It is really not easy to fill the Linux internal entropy buffer; I
+    talked to Ted Ts'o and he commented that the best way to fill the
+    buffer is to play with your keyboard. Good security has its price.
+    What I do is to hit several times on the shift, control, alternate,
+    and caps lock keys, because these keys do not produce output to the
+    screen. This way you get your keys really fast (it's the same thing
+    PGP2 does).
+
+    Another problem might be another program which eats up your random
+    bytes (a program (look at your daemons) that reads from /dev/random).
+
+<Q> And it really takes long when I work on a remote system. Why?
+
+    Don't do this at all! You should never create keys or even use GnuPG
+    on a remote system because you normally have no physical control
+    over your secret key ring (which is in most cases vulnerable to
+    advanced dictionary attacks) - I strongly encourage everyone to only
+    create keys on a local computer (a disconnected laptop is probably
+    the best choice) and if you need it on your connected box (I know,
+    we all do this) be sure to have a strong password for both your
+    account and for your secret key, and that you can trust your system
+    administrator.
+
+    When I check GnuPG on a remote system via ssh (I have no Alpha here)
+    ;-) I have the same problem. It takes a *very* long time to create
+    the keys, so I use a special option, --quick-random, to generate
+    insecure keys which are only good for some tests.
+
+<Q> What is the difference between options and commands?
+
+    If you do a 'gpg --help', you will get two separate lists. The first
+    is a list of commands. The second is a list of options. Whenever you
+    run GPG, you [H b]must[H /b] pick exactly one command (with one exception,
+    see below). You [H b]may[H /b] pick one or more options. The command should,
+    just by convention, come at the end of the argument list, after all
+    the options. If the command takes a file (all the basic ones do),
+    the filename comes at the very end. So the basic way to run gpg is:
+
+    [H samp]
+       $ gpg [--option something] [--option2] [--option3 something] --command file
+    [H /samp]
+
+    Some options take arguments. For example, the --output option (which
+    can be abbreviated as -o) is an option that takes a filename. The
+    option's argument must follow immediately after the option itself,
+    otherwise gpg doesn't know which option the argument is supposed to
+    paired with. As an option, --output and its filename must come before
+    the command. The --recipient (-r) option takes a name or keyID to
+    encrypt the message to, which must come right after the -r option.
+    The --encrypt (or -e) command comes after all the options and is
+    followed by the file you wish to encrypt. Therefore in this example
+    the command-line issued would be:
+
+    [H samp]
+       $ gpg -r alice -o secret.txt -e test.txt
+    [H /samp]
+
+    If you write the options out in full, it is easier to read:
+
+    [H samp]
+       $ gpg --recipient alice --output secret.txt --encrypt test.txt
+    [H /samp]
+
+    If you're encrypting to a file with the extension ".txt", then you'd
+    probably expect to see ASCII-armored text in the file (not binary),
+    so you need to add the --armor (-a) option, which doesn't take any
+    arguments:
+
+    [H samp]
+       $ gpg --armor --recipient alice --output secret.txt --encrypt test.txt
+    [H /samp]
+
+    If you imagine square brackets around the optional parts, it becomes
+    a bit clearer:
+
+    [H samp]
+       $ gpg [--armor] [--recipient alice] [--output secret.txt] --encrypt test.txt
+    [H /samp]
+
+    The optional parts can be rearranged any way you want:
+
+    [H samp]
+       $ gpg --output secret.txt --recipient alice --armor --encrypt test.txt
+    [H /samp]
+
+    If your filename begins with a hyphen (e.g. "-a.txt"), GnuPG assumes
+    this is an option and may complain. To avoid this you have to either
+    use "./-a.txt", or stop the option and command processing with two
+    hyphens: "-- -a.txt".
+
+    [H B]The exception to using only one command:[H /B] signing and encrypting
+    at the same time. For this you can combine both commands, such as in:
+
+    [H samp]
+       $ gpg [--options] --sign --encrypt foo.txt
+    [H /samp]
+
+<Q> I can't delete a user ID on my secret keyring because it has
+    already been deleted on my public keyring. What can I do?
+
+    Because you can only select from the public key ring, there is no
+    direct way to do this. However it is not very complicated to do
+    anyway. Create a new user ID with exactly the same name and you
+    will see that there are now two identical user IDs on the secret
+    ring. Now select this user ID and delete it. Both user IDs will be
+    removed from the secret ring.
+
+<Q> I can't delete my secret key because the public key disappeared.
+    What can I do?
+
+    To select a key a search is always done on the public keyring,
+    therefore it is not possible to select a secret key without
+    having the public key. Normally it should never happen that the
+    public key got lost but the secret key is still available. The
+    reality is different, so GnuPG implements a special way to deal
+    with it: Simply use the long keyID to specify the key to delete,
+    which can be obtained by using the --with-colons options (it is
+    the fifth field in the lines beginning with "sec").
+
+    If you've lost your public key and need to recreate it instead
+    for continued use with your secret key, you may be able to use
+    gpgsplit as detailed in question <Rgpgsplit>.
+
+<Q> What are trust, validity and ownertrust?
+
+    With GnuPG, the term "ownertrust" is used instead of "trust" to
+    help clarify that this is the value you have assigned to a key
+    to express how much you trust the owner of this key to correctly
+    sign (and thereby introduce) other keys. The "validity", or
+    calculated trust, is a value which indicates how much GnuPG
+    considers a key as being valid (that it really belongs to the
+    one who claims to be the owner of the key). For more information
+    on trust values see the chapter "The Web of Trust" in The GNU
+    Privacy Handbook.
+
+<Q> How do I sign a patch file?
+
+    Use "gpg --clearsign --not-dash-escaped ...". The problem with
+    --clearsign is that all lines starting with a dash are quoted with
+    "- "; obviously diff produces many lines starting with a dash and
+    these are then quoted and that is not good for a patch ;-). To use
+    a patch file without removing the cleartext signature, the special
+    option --not-dash-escaped may be used to suppress generation of
+    these escape sequences. You should not mail such a patch because
+    spaces and line endings are also subject to the signature and a
+    mailer may not preserve these. If you want to mail a file you can
+    simply sign it using your MUA (Mail User Agent).
+
+<Q> Where is the "encrypt-to-self" option?
+
+    Use "--encrypt-to your_keyID". You can use more than one of these
+    options. To temporarily override the use of this additional key,
+    you can use the option "--no-encrypt-to".
+
+<Q> How can I get rid of the Version and Comment headers in armored
+    messages?
+
+    Use "--no-version --comment ''". Note that the left over blank line
+    is required by the protocol.
+
+<Q> What does the "You are using the xxxx character set." mean?
+
+    This note is printed when UTF-8 mapping has to be done. Make sure
+    that the displayed character set is the one you have activated on
+    your system. Since "iso-8859-1" is the character set most used,
+    this is the default. You can change the charset with the option
+    "--charset". It is important that your active character set matches
+    the one displayed - if not, restrict yourself to plain 7 bit ASCII
+    and no mapping has to be done.
+
+<Q> How can I get list of key IDs used to encrypt a message?
+
+    [H samp]
+       $ gpg --batch --decrypt --list-only --status-fd 1 2>/dev/null |
+         awk '/^\[GNUPG:\] ENC_TO / { print $3 }'
+    [H /samp]
+
+<Q> Why can't I decrypt files encrypted as symmetrical-only (-c) with
+    a version of GnuPG prior to 1.0.1.
+
+    There was a bug in GnuPG versions prior to 1.0.1 which affected files
+    only if 3DES or Twofish was used for symmetric-only encryption (this has
+    never been the default). The bug has been fixed, but to enable decryption
+    of old files you should run gpg with the option "--emulate-3des-s2k-bug",
+    decrypt the file and encrypt it again without this option.
+
+    NOTE: This option was removed in GnuPG development version 1.1.0 and later
+    updates, so you will need to use a version between 1.0.1 and 1.0.7 to
+    re-encrypt any affected files.
+
+<Q> How can I use GnuPG in an automated environment?
+
+    You should use the option --batch and don't use passphrases as
+    there is usually no way to store it more securely than on the
+    secret keyring itself. The suggested way to create keys for an
+    automated environment is:
+
+    On a secure machine:
+    [H ol]
+    [H li] If you want to do automatic signing, create a signing subkey
+           for your key (use the interactive key editing menu by issueing
+           the command 'gpg --edit-key keyID', enter "addkey" and select
+           the DSA key type).
+    [H li] Make sure that you use a passphrase (needed by the current
+           implementation).
+    [H li] gpg --export-secret-subkeys --no-comment foo >secring.auto
+    [H li] Copy secring.auto and the public keyring to a test directory.
+    [H li] Change to this directory.
+    [H li] gpg --homedir . --edit foo and use "passwd" to remove the
+           passphrase from the subkeys. You may also want to remove all
+           unused subkeys.
+    [H li] Copy secring.auto to a floppy and carry it to the target box.
+    [H /ol]
+
+    On the target machine:
+    [H ol]
+    [H li] Install secring.auto as the secret keyring.
+    [H li] Now you can start your new service. It's also a good idea to
+           install an intrusion detection system so that you hopefully
+           get a notice of an successful intrusion, so that you in turn
+           can revoke all the subkeys installed on that machine and
+           install new subkeys.
+    [H /ol]
+
+<Q> Which email-client can I use with GnuPG?
+
+    Using GnuPG to encrypt email is one of the most popular uses.
+    Several mail clients or mail user agents (MUAs) support GnuPG to
+    varying degrees. Simplifying a bit, there are two ways mail can be
+    encrypted with GnuPG: the "old style" ASCII armor (i.e. cleartext
+    encryption), and RFC 2015 style (previously PGP/MIME, now OpenPGP).
+    The latter has full MIME support. Some MUAs support only one of
+    them, so whichever you actually use depends on your needs as well
+    as the capabilities of your addressee. As well, support may be
+    native to the MUA, or provided via "plug-ins" or external tools.
+
+    The following list is not exhaustive:
+
+    [H pre]
+       MUA            OpenPGP ASCII   How? (N,P,T)
+       -------------------------------------------------------------
+       Calypso           N      Y      P (Unixmail)
+       Elm               N      Y      T (mailpgp,morepgp)
+       Elm ME+           N      Y      N
+       Emacs/Gnus        Y      Y      T (Mailcrypt,gpg.el)
+       Emacs/Mew         Y      Y      N
+       Emacs/VM          N      Y      T (Mailcrypt)
+       Evolution         Y      Y      N
+       Exmh              Y      Y      N
+       GNUMail.app       Y      Y      P (PGPBundle)
+       GPGMail           Y      Y      N
+       KMail (<=1.4.x)   N      Y      N
+       KMail (1.5.x)     Y(P)   Y(N)   P/N
+       Mozilla           Y      Y      P (Enigmail)
+       Mulberry          Y      Y      P
+       Mutt              Y      Y      N
+       Sylpheed          Y      Y      N
+       Sylpheed-claws    Y      Y      N
+       TkRat             Y      Y      N
+       XEmacs/Gnus       Y      Y      T (Mailcrypt)
+       XEmacs/Mew        Y      Y      N
+       XEmacs/VM         N      Y      T (Mailcrypt)
+       XFmail            Y      Y      N
+
+       N - Native, P - Plug-in, T - External Tool
+    [H /pre]
+
+    The following table lists proprietary MUAs. The GNU Project
+    suggests against the use of these programs, but they are listed
+    for interoperability reasons for your convenience.
+
+    [H pre]
+       MUA            OpenPGP ASCII   How? (N,P,T)
+       -------------------------------------------------------------
+       Apple Mail        Y      Y      P (GPGMail)
+       Becky2            Y      Y      P (BkGnuPG)
+       Eudora            Y      Y      P (EuroraGPG)
+       Eudora Pro        Y      Y      P (EudoraGPG)
+       Lotus Notes       N      Y      P
+       Netscape 4.x      N      Y      P
+       Netscape 7.x      Y      Y      P (Enigmail)
+       Novell Groupwise  N      Y      P
+       Outlook           N      Y      P (G-Data)
+       Outlook Express   N      Y      P (GPGOE)
+       Pegasus           N      Y      P (QDPGP,PM-PGP)
+       Pine              N      Y      T (pgpenvelope,(gpg|pgp)4pine)
+       Postme            N      Y      P (GPGPPL)
+       The Bat!          N      Y      P (Ritlabs)
+    [H /pre]
+
+    Good overviews of OpenPGP-support can be found at:[H br]
+    [H a href=http://www.openpgp.fr.st/courrier_en.html]<http://www.openpgp.fr.st/courrier_en.html>[H /a] and[H br]
+    [H a href=http://www.bretschneidernet.de/tips/secmua.html]<http://www.bretschneidernet.de/tips/secmua.html>[H /a].
+
+    Users of Win32 MUAs that lack OpenPGP support may look into
+    using GPGrelay [H a href=http://gpgrelay.sourceforge.net]<http://gpgrelay.sourceforge.net>[H /a], a small
+    email-relaying server that uses GnuPG to enable many email clients
+    to send and receive emails that conform to PGP-MIME (RFC 2015).
+
+<Q> Can't we have a gpg library?
+
+    This has been frequently requested. However, the current viewpoint
+    of the GnuPG maintainers is that this would lead to several security
+    issues and will therefore not be implemented in the foreseeable
+    future. However, for some areas of application gpgme could do the
+    trick. You'll find it at [H a href=[$hGPGFTP]/gcrypt/alpha/gpgme]<[$hGPGFTP]/gcrypt/alpha/gpgme>[H /a].
+
+<Q> I have successfully generated a revocation certificate, but I don't
+    understand how to send it to the key servers.
+
+    Most keyservers don't accept a 'bare' revocation certificate. You
+    have to import the certificate into gpg first:
+
+    [H samp]
+       $ gpg --import my-revocation.asc
+    [H /samp]
+
+    then send the revoked key to the keyservers:
+
+    [H samp]
+       $ gpg --keyserver certserver.pgp.com --send-keys mykeyid
+    [H /samp]
+
+    (or use a keyserver web interface for this).
+
+<Dhomedir>
+<Q> How do I put my keyring in a different directory?
+
+    GnuPG keeps several files in a special homedir directory. These
+    include the options file, pubring.gpg, secring.gpg, trustdb.gpg,
+    and others. GnuPG will always create and use these files. On unices,
+    the homedir is usually ~/.gnupg; on Windows "C:\gnupg\".
+
+    If you want to put your keyrings somewhere else, use the option:
+
+    [H samp]
+       --homedir /my/path/
+    [H /samp]
+
+    to make GnuPG create all its files in that directory. Your keyring
+    will be "/my/path/pubring.gpg". This way you can store your secrets
+    on a floppy disk. Don't use "--keyring" as its purpose is to specify
+    additional keyring files.
+
+<Q> How do I verify signed packages?
+
+    Before you can verify the signature that accompanies a package,
+    you must first have the vendor, organisation, or issueing person's
+    key imported into your public keyring. To prevent GnuPG warning
+    messages the key should also be validated (or locally signed).
+
+    You will also need to download the detached signature file along
+    with the package. These files will usually have the same name as
+    the package, with either a binary (.sig) or ASCII armor (.asc)
+    extension.
+
+    Once their key has been imported, and the package and accompanying
+    signature files have been downloaded, use:
+
+    [H samp]
+       $ gpg --verify sigfile signed-file
+    [H /samp]
+
+    If the signature file has the same base name as the package file,
+    the package can also be verified by specifying just the signature
+    file, as GnuPG will derive the package's file name from the name
+    given (less the .sig or .asc extension). For example, to verify a
+    package named foobar.tar.gz against its detached binary signature
+    file, use:
+
+    [H samp]
+       $ gpg --verify foobar.tar.gz.sig
+    [H /samp]
+
+<Q> How do I export a keyring with only selected signatures (keys)?
+
+    If you're wanting to create a keyring with only a subset of keys
+    selected from a master keyring (for a club, user group, or company
+    department for example), simply specify the keys you want to export:
+
+    [H samp]
+       $ gpg --armor --export key1 key2 key3 key4 > keys1-4.asc
+    [H /samp]
+
+<Dgpgsplit>
+<Q> I still have my secret key, but lost my public key. What can I do?
+
+    All OpenPGP secret keys have a copy of the public key inside them,
+    and in a worst-case scenario, you can create yourself a new public
+    key using the secret key.
+
+    A tool to convert a secret key into a public one has been included
+    (it's actually a new option for gpgsplit) and is available with GnuPG
+    versions 1.2.1 or later (or can be found in CVS). It works like this:
+
+    [H samp]
+       $ gpgsplit --no-split --secret-to-public secret.gpg >publickey.gpg
+    [H /samp]
+
+    One should first try to export the secret key and convert just this
+    one. Using the entire secret keyring should work too. After this has
+    been done, the publickey.gpg file can be imported into GnuPG as usual.
+
+<Q> Clearsigned messages sent from my web-mail account have an invalid
+    signature. Why?
+
+    Check to make sure the settings for your web-based email account
+    do not use HTML formatting for the pasted clearsigned message. This can
+    alter the message with embedded HTML markup tags or spaces, resulting
+    in an invalid signature. The recipient may be able to copy the signed
+    message block to a text file for verification, or the web email
+    service may allow you to attach the clearsigned message as a file
+    if plaintext messages are not an option.
+
+
+<S> COMPATIBILITY ISSUES
+
+<Dcompat>
+<Q> How can I encrypt a message with GnuPG so that PGP is able to decrypt it?
+
+    It depends on the PGP version.
+
+    [H ul]
+    [H li]PGP 2.x[H br]
+    You can't do that because PGP 2.x normally uses IDEA which is not
+    supported by GnuPG as it is patented (see <Ridea>), but if you have a
+    modified version of PGP you can try this:
+
+    [H samp]
+       $ gpg --rfc1991 --cipher-algo 3des ...
+    [H /samp]
+
+    Please don't pipe the data to encrypt to gpg but provide it using a
+    filename; otherwise, PGP 2 will not be able to handle it.
+
+    As for conventional encryption, you can't do this for PGP 2.
+
+    [H li]PGP 5.x and higher[H br]
+    You need to provide two additional options:
+
+    [H samp]
+       --compress-algo 1 --cipher-algo cast5
+    [H /samp]
+
+    You may also use "3des" instead of "cast5", and "blowfish" does not
+    work with all versions of PGP 5. You may also want to put:
+
+    [H samp]
+       compress-algo 1
+    [H /samp]
+
+    into your ~/.gnupg/options file - this does not affect normal GnuPG
+    operation.
+
+    This applies to conventional encryption as well.
+    [H /UL]
+
+<Q> How do I migrate from PGP 2.x to GnuPG?
+
+    PGP 2 uses the RSA and IDEA encryption algorithms. Whereas the RSA
+    patent has expired and RSA is included as of GnuPG 1.0.3, the IDEA
+    algorithm is still patented until 2007. Under certain conditions you
+    may use IDEA even today. In that case, you may refer to Question
+    <Ridea> about how to add IDEA support to GnuPG and read
+    [H a href=[$hGPGHTTP]/gph/en/pgp2x.html]<[$hGPGHTTP]/gph/en/pgp2x.html>[H /a] to perform the migration.
+
+<Q> (removed)
+
+    (empty)
+
+<Q> Why is PGP 5.x not able to encrypt messages with some keys?
+
+    PGP, Inc. refuses to accept Elgamal keys of type 20 even for
+    encryption. They only support type 16 (which is identical at least
+    for decryption). To be more inter-operable, GnuPG (starting with
+    version 0.3.3) now also uses type 16 for the Elgamal subkey which is
+    created if the default key algorithm is chosen. You may add a type
+    16 Elgamal key to your public key, which is easy as your key
+    signatures are still valid.
+
+<Q> Why is PGP 5.x not able to verify my messages?
+
+    PGP 5.x does not accept v4 signatures for data material but OpenPGP
+    requests generation of v4 signatures for all kind of data, that's why
+    GnuPG defaults to them. Use the option "--force-v3-sigs" to generate
+    v3 signatures for data.
+
+<Q> How do I transfer owner trust values from PGP to GnuPG?
+
+    There is a script in the tools directory to help you. After you have
+    imported the PGP keyring you can give this command:
+
+    [H samp]
+       $ lspgpot pgpkeyring | gpg --import-ownertrust
+    [H /samp]
+
+    where pgpkeyring is the original keyring and not the GnuPG keyring
+    you might have created in the first step.
+
+<Q> PGP does not like my secret key.
+
+    Older PGPs probably bail out on some private comment packets used by
+    GnuPG. These packets are fully in compliance with OpenPGP; however
+    PGP is not really OpenPGP aware. A workaround is to export the
+    secret keys with this command:
+
+    [H samp]
+       $ gpg --export-secret-keys --no-comment -a your-KeyID
+    [H /samp]
+
+    Another possibility is this: by default, GnuPG encrypts your secret
+    key using the Blowfish symmetric algorithm. Older PGPs will only
+    understand 3DES, CAST5, or IDEA symmetric algorithms. Using the
+    following method you can re-encrypt your secret gpg key with a
+    different algo:
+
+    [H samp]
+       $ gpg --s2k-cipher-algo=CAST5 --s2k-digest-algo=SHA1
+         --compress-algo=1  --edit-key <username>
+    [H /samp]
+
+    Then use passwd to change the password (just change it to the same
+    thing, but it will encrypt the key with CAST5 this time).
+
+    Now you can export it and PGP should be able to handle it.
+
+    For PGP 6.x the following options work to export a key:
+
+    [H samp]
+       $ gpg --s2k-cipher-algo 3des --compress-algo 1 --rfc1991
+         --export-secret-keys <KeyID>
+    [H /samp]
+
+<Doptions>
+<Q> GnuPG no longer installs a ~/.gnupg/options file. Is it missing?
+
+    No. The ~/.gnupg/options file has been renamed to ~/.gnupg/gpg.conf for
+    new installs as of version 1.1.92. If an existing ~/.gnupg/options file
+    is found during an upgrade it will still be used, but this change was
+    required to have a more consistent naming scheme with forthcoming tools.
+    An existing options file can be renamed to gpg.conf for users upgrading,
+    or receiving the message that the "old default options file" is ignored
+    (occurs if both a gpg.conf and an options file are found).
+
+<Q> How do you export GnuPG keys for use with PGP?
+
+    This has come up fairly often, so here's the HOWTO:
+
+    PGP can (for most key types) use secret keys generated by GnuPG. The
+    problems that come up occasionally are generally because GnuPG
+    supports a few more features from the OpenPGP standard than PGP does.
+    If your secret key has any of those features in use, then PGP will
+    reject the key or you will have problems communicating later. Note
+    that PGP doesn't do Elgamal signing keys at all, so they are not
+    usable with any version.
+
+    These instructions should work for GnuPG 1.0.7 and later, and PGP
+    7.0.3 and later.
+
+    Start by editing the key. Most of this line is not really necessary
+    as the default values are correct, but it does not hurt to repeat the
+    values, as this will override them in case you have something else set
+    in your options file.
+
+    [H samp]
+       $ gpg --s2k-cipher-algo cast5 --s2k-digest-algo sha1 --s2k-mode 3
+         --simple-sk-checksum --edit KeyID
+    [H /samp]
+
+    Turn off some features. Set the list of preferred ciphers, hashes,
+    and compression algorithms to things that PGP can handle. (Yes, I
+    know this is an odd list of ciphers, but this is what PGP itself uses,
+    minus IDEA).
+
+    [H samp]
+       > setpref S9 S8 S7 S3 S2 S10 H2 H3 Z1 Z0
+    [H /samp]
+
+    Now put the list of preferences onto the key.
+
+    [H samp]
+       > updpref
+    [H /samp]
+
+    Finally we must decrypt and re-encrypt the key, making sure that we
+    encrypt with a cipher that PGP likes. We set this up in the --edit
+    line above, so now we just need to change the passphrase to make it
+    take effect. You can use the same passphrase if you like, or take
+    this opportunity to actually change it.
+
+    [H samp]
+       > passwd
+    [H /samp]
+
+    Save our work.
+
+    [H samp]
+       > save
+    [H /samp]
+
+    Now we can do the usual export:
+
+    [H samp]
+       $ gpg --export KeyID > mypublickey.pgp[H br]
+       $ gpg --export-secret-key KeyID > mysecretkey.pgp
+    [H /samp]
+
+    Thanks to David Shaw for this information!
+
+
+<S> PROBLEMS and ERROR MESSAGES
+
+<Q> Why do I get "gpg: Warning: using insecure memory!"
+
+    On many systems this program should be installed as setuid(root).
+    This is necessary to lock memory pages. Locking memory pages prevents
+    the operating system from writing them to disk and thereby keeping your
+    secret keys really secret. If you get no warning message about insecure
+    memory your operating system supports locking without being root. The
+    program drops root privileges as soon as locked memory is allocated.
+
+    To setuid(root) permissions on the gpg binary you can either use:
+
+    [H samp]
+       $ chmod u+s /path/to/gpg
+    [H /samp]
+
+    or
+
+    [H samp]
+       $ chmod 4755 /path/to/gpg
+    [H /samp]
+
+    Some refrain from using setuid(root) unless absolutely required for
+    security reasons. Please check with your system administrator if you
+    are not able to make these determinations yourself. 
+
+    On UnixWare 2.x and 7.x you should install GnuPG with the 'plock'
+    privilege to get the same effect:
+
+    [H samp]
+       $ filepriv -f plock /path/to/gpg
+    [H /samp]
+
+    If you can't or don't want to install GnuPG setuid(root), you can
+    use the option "--no-secmem-warning" or put:
+
+    [H samp]
+       no-secmem-warning
+    [H /samp]
+
+    in your ~/.gnupg/options or ~/.gnupg/gpg.conf file (this disables
+    the warning).
+
+    On some systems (e.g., Windows) GnuPG does not lock memory pages
+    and older GnuPG versions (<=1.0.4) issue the warning:
+
+    [H samp]
+       gpg: Please note that you don't have secure memory
+    [H /samp]
+
+    This warning can't be switched off by the above option because it
+    was thought to be too serious an issue. However, it confused users
+    too much, so the warning was eventually removed.
+
+<Q> Large File Support doesn't work ...
+
+    LFS works correctly in post-1.0.4 versions. If configure doesn't
+    detect it, try a different (i.e., better) compiler. egcs 1.1.2 works
+    fine, other gccs sometimes don't. BTW, several compilation problems
+    of GnuPG 1.0.3 and 1.0.4 on HP-UX and Solaris were due to broken LFS
+    support.
+
+<Q> In the edit menu the trust values are not displayed correctly after
+    signing uids. Why?
+
+    This happens because some information is stored immediately in
+    the trustdb, but the actual trust calculation can be done after the
+    save command. This is a "not easy to fix" design bug which will be
+    addressed in some future release.
+
+<Q> What does "skipping pubkey 1: already loaded" mean?
+
+    As of GnuPG 1.0.3, the RSA algorithm is included. If you still have
+    a "load-extension rsa" in your options file, the above message
+    occurs. Just remove the load command from the options file.
+
+<Q> GnuPG 1.0.4 doesn't create ~/.gnupg ...
+
+    That's a known bug, already fixed in newer versions.
+
+<Q> An Elgamal signature does not verify anymore since version 1.0.2 ...
+
+    Use the option --emulate-md-encode-bug.
+
+<Q> Old versions of GnuPG can't verify Elgamal signatures
+
+    Update to GnuPG 1.0.2 or newer.
+
+<Q> When I use --clearsign, the plain text has sometimes extra dashes
+    in it - why?
+
+    This is called dash-escaped text and is required by OpenPGP.
+    It always happens when a line starts with a dash ("-") and is
+    needed to make the lines that structure signature and text
+    (i.e., "-----BEGIN PGP SIGNATURE-----") to be the only lines
+    that start with two dashes.
+
+    If you use GnuPG to process those messages, the extra dashes
+    are removed. Good mail clients remove those extra dashes when
+    displaying such a message.      
+
+<Q> What is the thing with "can't handle multiple signatures"?
+
+    Due to different message formats GnuPG is not always able to split
+    a file with multiple signatures unambiguously into its parts. This
+    error message informs you that there is something wrong with the input.
+
+    The only way to have multiple signatures in a file is by using the
+    OpenPGP format with one-pass-signature packets (which is GnuPG's
+    default) or the cleartext signed format.
+
+<Q> If I submit a key to a keyserver, nothing happens ...
+
+    You are most likely using GnuPG 1.0.2 or older on Windows. That's
+    feature isn't yet implemented, but it's a bug not to say it. Newer
+    versions issue a warning. Upgrade to 1.0.4 or newer.
+
+<Q> I get "gpg: waiting for lock ..."
+
+    A previous instance of gpg has most likely exited abnormally and left
+    a lock file. Go to ~/.gnupg and look for .*.lock files and remove them.
+
+<Q> Older gpg binaries (e.g., 1.0) have problems with keys from newer
+    gpg binaries ...
+
+    As of 1.0.3, keys generated with gpg are created with preferences to
+    TWOFISH (and AES since 1.0.4) and that also means that they have the
+    capability to use the new MDC encryption method. This will go into
+    OpenPGP soon, and is also suppoted by PGP 7. This new method avoids
+    a (not so new) attack on all email encryption systems.
+
+    This in turn means that pre-1.0.3 gpg binaries have problems with
+    newer keys. Because of security and bug fixes, you should keep your
+    GnuPG installation in a recent state anyway. As a workaround, you can
+    force gpg to use a previous default cipher algo by putting:
+
+    [H samp]
+       cipher-algo cast5
+    [H /samp]
+
+    into your options file.
+
+<Q> With 1.0.4, I get "this cipher algorithm is deprecated ..."
+
+    If you just generated a new key and get this message while
+    encrypting, you've witnessed a bug in 1.0.4. It uses the new AES
+    cipher Rijndael that is incorrectly being referred as "deprecated".
+    Ignore this warning, more recent versions of gpg are corrected.
+
+<Q> Some dates are displayed as ????-??-??. Why?
+
+    Due to constraints in most libc implementations, dates beyond
+    2038-01-19 can't be displayed correctly. 64-bit OSes are not
+    affected by this problem. To avoid printing wrong dates, GnuPG
+    instead prints some question marks. To see the correct value, you
+    can use the options --with-colons and --fixed-list-mode.
+
+<Q> I still have a problem. How do I report a bug?
+
+    Are you sure that it's not been mentioned somewhere on the mailing
+    lists? Did you have a look at the bug list (you'll find a link to
+    the list of reported bugs on the documentation page). If you're not
+    sure about it being a bug, you can send mail to the gnupg-devel
+    list. Otherwise, use the GUUG bug tracking system 
+    [H a href=http://bugs.guug.de/Reporting.html]<http://bugs.guug.de/Reporting.html>[H /a].
+
+<Q> Why doesn't GnuPG support X.509 certificates?
+
+    GnuPG, first and foremost, is an implementation of the OpenPGP
+    standard (RFC 2440), which is a competing infrastructure, different
+    from X.509.
+
+    They are both public-key cryptosystems, but how the public keys are
+    actually handled is different.
+
+<Q> Why do national characters in my user ID look funny?
+
+    According to OpenPGP, GnuPG encodes user ID strings (and other
+    things) using UTF-8. In this encoding of Unicode, most national
+    characters get encoded as two- or three-byte sequences. For
+    example, &aring; (0xE5 in ISO-8859-1) becomes &Atilde;&yen; (0xC3,
+    0xA5). This might also be the reason why keyservers can't find
+    your key.
+
+<Q> I get 'sed' errors when running ./configure on Mac OS X ...
+
+    This will be fixed after GnuPG has been upgraded to autoconf-2.50.
+    Until then, find the line setting CDPATH in the configure script
+    and place an:
+
+    [H samp]
+       unset CDPATH
+    [H /samp]
+
+    statement below it.
+
+<Q> Why does GnuPG 1.0.6 bail out on keyrings used with 1.0.7?
+
+    There is a small bug in 1.0.6 which didn't parse trust packets
+    correctly. You may want to apply this patch if you can't upgrade:
+
+    [H a href=http://www.gnupg.org/developer/gpg-woody-fix.txt]<http://www.gnupg.org/developer/gpg-woody-fix.txt>[H /a]
+
+<Q> I upgraded to GnuPG version 1.0.7 and now it takes longer to load my
+    keyrings. What can I do?
+
+    The way signature states are stored has changed so that v3 signatures
+    can be supported. You can use the new --rebuild-keydb-caches migration
+    command, which was built into this release and increases the speed of
+    many operations for existing keyrings.
+
+<Q> Doesn't a fully trusted user ID on a key prevent warning messages
+    when encrypting to other IDs on the key?
+
+    No. That was actually a key validity bug in GnuPG 1.2.1 and earlier
+    versions. As part of the development of GnuPG 1.2.2, a bug was
+    discovered in the key validation code.  This bug causes keys with
+    more than one user ID to give all user IDs on the key the amount of
+    validity given to the most-valid key. The bug has been fixed in GnuPG
+    release 1.2.2, and upgrading is the recommended fix for this problem.
+    More information and a patch for a some pre-1.2.2 versions of GnuPG
+    can be found at:
+
+    [H a href=http://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000268.html]<http://lists.gnupg.org/pipermail/gnupg-announce/2003q2/000268.html>[H /a]
+
+<Q> I just compiled GnuPG from source on my GNU/Linux RPM-based system
+    and it's not working. Why?
+
+    Many GNU/Linux distributions that are RPM-based will install a
+    version of GnuPG as part of its standard installation, placing the
+    binaries in the /usr/bin directory. Later, compiling and installing
+    GnuPG from source other than from a source RPM won't normally
+    overwrite these files, as the default location for placement of
+    GnuPG binaries is in /usr/local/bin unless the '--prefix' switch
+    is used during compile to specify an alternate location. Since the
+    /usr/bin directory more than likely appears in your path before
+    /usr/local/bin, the older RPM-version binaries will continue to
+    be used when called since they were not replaced.
+
+    To resolve this, uninstall the RPM-based version with 'rpm -e gnupg'
+    before installing the binaries compiled from source. If dependency
+    errors are displayed when attempting to uninstall the RPM (such as
+    when Red Hat's up2date is also installed, which uses GnuPG), uninstall
+    the RPM with 'rpm -e gnupg --nodeps' to force the uninstall. Any
+    dependent files should be automatically replaced during the install
+    of the compiled version. If the default /usr/local/bin directory is
+    used, some packages such as SuSE's Yast Online Update may need to be
+    configured to look for GnuPG binaries in the /usr/local/bin directory,
+    or symlinks can be created in /usr/bin that point to the binaries
+    located in /usr/local/bin.
+
+
+<S> ADVANCED TOPICS
+
+<Q> How does this whole thing work?
+
+    To generate a secret/public keypair, run:
+
+    [H samp]
+       $ gpg --gen-key
+    [H /samp]
+
+    and choose the default values.
+
+    Data that is encrypted with a public key can only be decrypted by
+    the matching secret key. The secret key is protected by a password,
+    the public key is not.
+
+    So to send your friend a message, you would encrypt your message
+    with his public key, and he would only be able to decrypt it by
+    having the secret key and putting in the password to use his secret
+    key.
+
+    GnuPG is also useful for signing things. Files that are encrypted
+    with the secret key can be decrypted with the public key. To sign
+    something, a hash is taken of the data, and then the hash is in some
+    form encoded with the secret key. If someone has your public key, they
+    can verify that it is from you and that it hasn't changed by checking
+    the encoded form of the hash with the public key.
+
+    A keyring is just a large file that stores keys. You have a public
+    keyring where you store yours and your friend's public keys. You have
+    a secret keyring that you keep your secret key on, and should be very
+    careful with. Never ever give anyone else access to it and use a *good*
+    passphrase to protect the data in it.
+
+    You can 'conventionally' encrypt something by using the option 'gpg -c'.
+    It is encrypted using a passphrase, and does not use public and secret
+    keys. If the person you send the data to knows that passphrase, they
+    can decrypt it. This is usually most useful for encrypting things to
+    yourself, although you can encrypt things to your own public key in the
+    same way. It should be used for communication with partners you know
+    and where it is easy to exchange the passphrases (e.g. with your boy
+    friend or your wife). The advantage is that you can change the
+    passphrase from time to time and decrease the risk, that many old
+    messages may be decrypted by people who accidently got your passphrase.
+
+    You can add and copy keys to and from your keyring with the 'gpg
+    --import' and 'gpg --export' command. 'gpg --export-secret-keys' will
+    export secret keys. This is normally not useful, but you can generate
+    the key on one machine then move it to another machine.
+
+    Keys can be signed under the 'gpg --edit-key' option. When you sign a
+    key, you are saying that you are certain that the key belongs to the
+    person it says it comes from. You should be very sure that is really
+    that person: You should verify the key fingerprint with:
+
+    [H samp]
+       $ gpg --fingerprint KeyID
+    [H /samp]
+
+    over the phone (if you really know the voice of the other person), at
+    a key signing party (which are often held at computer conferences),
+    or at a meeting of your local GNU/Linux User Group.
+
+    Hmm, what else. You may use the option '-o filename' to force output
+    to this filename (use '-' to force output to stdout). '-r' just lets
+    you specify the recipient (which public key you encrypt with) on the
+    command line instead of typing it interactively.
+
+    Oh yeah, this is important. By default all data is encrypted in some
+    weird binary format. If you want to have things appear in ASCII text
+    that is readable, just add the '-a' option. But the preferred method
+    is to use a MIME aware mail reader (Mutt, Pine and many more).
+
+    There is a small security glitch in the OpenPGP (and therefore GnuPG)
+    system; to avoid this you should always sign and encrypt a message
+    instead of only encrypting it.
+
+<Q> Why are some signatures with an ELG-E key valid?
+
+    These are Elgamal keys generated by GnuPG in v3 (RFC 1991) packets.
+    The OpenPGP draft later changed the algorithm identifier for Elgamal
+    keys which are usable for signatures and encryption from 16 to 20.
+    GnuPG now uses 20 when it generates new Elgamal keys but still
+    accepts 16 (which is according to OpenPGP "encryption only") if this
+    key is in a v3 packet. GnuPG is the only program which had used
+    these v3 Elgamal keys - so this assumption is quite safe.
+
+<Q> How does the whole trust thing work?
+
+    It works more or less like PGP. The difference is that the trust is
+    computed at the time it is needed. This is one of the reasons for
+    the trustdb which holds a list of valid key signatures. If you are
+    not running in batch mode you will be asked to assign a trust
+    parameter (ownertrust) to a key.
+
+    You can see the validity (calculated trust value) using this
+    command.
+
+    [H samp]
+       $ gpg --list-keys --with-colons
+    [H /samp] 
+
+    If the first field is "pub" or "uid", the second field shows you the
+    trust:
+
+    [H pre]
+       o = Unknown (this key is new to the system)
+       e = The key has expired
+       q = Undefined (no value assigned)
+       n = Don't trust this key at all
+       m = There is marginal trust in this key
+       f = The key is full trusted
+       u = The key is ultimately trusted; this is only used
+           for keys for which the secret key is also available.
+       r = The key has been revoked
+       d = The key has been disabled
+    [H /pre]
+
+    The value in the "pub" record is the best one of all "uid" records.
+    You can get a list of the assigned trust values (how much you trust
+    the owner to correctly sign another person's key) with:
+
+    [H samp]
+       $ gpg --list-ownertrust
+    [H /samp]
+
+    The first field is the fingerprint of the primary key, the second
+    field is the assigned value:
+
+    [H pre]
+       - = No ownertrust value yet assigned or calculated.
+       n = Never trust this keyholder to correctly verify others signatures.
+       m = Have marginal trust in the keyholders capability to sign other
+           keys.
+       f = Assume that the key holder really knows how to sign keys.
+       u = No need to trust ourself because we have the secret key.
+    [H /pre]
+
+    Keep these values confidential because they express your opinions
+    about others. PGP stores this information with the keyring thus it
+    is not a good idea to publish a PGP keyring instead of exporting the
+    keyring. GnuPG stores the trust in the trustdb.gpg file so it is okay
+    to give a gpg keyring away (but we have a --export command too).
+
+<Q> What kind of output is this: "key C26EE891.298, uid 09FB: ...."?
+
+    This is the internal representation of a user ID in the trustdb.
+    "C26EE891" is the keyid, "298" is the local ID (a record number in
+    the trustdb) and "09FB" is the last two bytes of a ripe-md-160 hash
+    of the user ID for this key.
+
+<Q> How do I interpret some of the informational outputs?
+
+    While checking the validity of a key, GnuPG sometimes prints some
+    information which is prefixed with information about the checked
+    item.
+
+    [H samp]
+       "key 12345678.3456"
+    [H /samp]
+
+    This is about the key with key ID 12345678 and the internal number
+    3456, which is the record number of the so called directory record
+    in the trustdb.
+
+    [H samp]
+       "uid 12345678.3456/ACDE"
+    [H /samp]
+
+    This is about the user ID for the same key. To identify the user ID
+    the last two bytes of a ripe-md-160 over the user ID ring is printed.
+
+    [H samp]
+       "sig 12345678.3456/ACDE/9A8B7C6D"
+    [H /samp]
+
+    This is about the signature with key ID 9A8B7C6D for the above key
+    and user ID, if it is a signature which is direct on a key, the user
+    ID part is empty (..//..).
+
+<Q> Are the header lines of a cleartext signature part of the signed
+    material?
+
+    No. For example you can add or remove "Comment:" lines. They have
+    a purpose like the mail header lines. However a "Hash:" line is
+    needed for OpenPGP signatures to tell the parser which hash
+    algorithm to use.
+
+<Q> What is the list of preferred algorithms?
+
+    The list of preferred algorithms is a list of cipher, hash and
+    compression algorithms stored in the self-signature of a key during
+    key generation. When you encrypt a document, GnuPG uses this list
+    (which is then part of a public key) to determine which algorithms
+    to use. Basically it tells other people what algorithms the
+    recipient is able to handle and provides an order of preference.
+
+<Q> How do I change the list of preferred algorithms?
+
+    In version 1.0.7 or later, you can use the edit menu and set the
+    new list of preference using the command "setpref"; the format of
+    this command resembles the output of the command "pref". The
+    preference is not changed immediately but the set preference will
+    be used when a new user ID is created. If you want to update the
+    preferences for existing user IDs, select those user IDs (or select
+    none to update all) and enter the command "updpref". Note that the
+    timestamp of the self-signature is increased by one second when
+    running this command.
+
+
+<S> ACKNOWLEDGEMENTS
+
+    Many thanks to Nils Ellmenreich for maintaining this FAQ file for
+    such a long time, Werner Koch for the original FAQ file, and to all
+    posters to gnupg-users and gnupg-devel. They all provided most of
+    the answers.
+
+    Also thanks to Casper Dik for providing us with a script to generate
+    this FAQ (he uses it for the excellent Solaris2 FAQ).
+
+[H hr]
+
+Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02111, USA
+
+Verbatim copying and distribution of this entire article is permitted in
+any medium, provided this notice is preserved.
diff --git a/doc/gnupg.7 b/doc/gnupg.7
new file mode 100644 (file)
index 0000000..a3dd290
--- /dev/null
@@ -0,0 +1,15 @@
+.TH GNUPG 7 2002-09-02 GNU "GNU Privacy Guard" 
+.SH NAME
+GnuPG \- The GNU Privacy Guard suite of programs
+.SH DESCRIPTION
+GnuPG is a set of programs for public key encryption and digital
+signatures.  The program most users will want to use is the OpenPGP
+command line tool, named \fBgpg\fP.  \fBgpgv\fP is a stripped down
+version of \fBgpg\fP with no encryption functionality, used only to
+verify signatures against a trusted keyring.  There is also a tool
+called \fBgpgsplit\fP to split OpenPGP messages or keyrings into their
+component packets.  This is mainly useful for seeing how OpenPGP
+messages are put together.
+.SH "SEE ALSO"
+.BR gpg (1),
+.BR gpgv (1),
diff --git a/doc/gnupg1.info b/doc/gnupg1.info
new file mode 100644 (file)
index 0000000..40ca222
--- /dev/null
@@ -0,0 +1,3172 @@
+This is gnupg1.info, produced by makeinfo version 4.8 from gnupg1.texi.
+
+   This is the `The GNU Privacy Guard Manual' (1.4.6, 4 December 2006).
+
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free
+Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of 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. The text of the
+     license can be found in the section entitled "Copying".
+
+INFO-DIR-SECTION GNU Utilities
+START-INFO-DIR-ENTRY
+* gpg: (gpg).            OpenPGP encryption and signing tool (v1).
+END-INFO-DIR-ENTRY
+
+\1f
+File: gnupg1.info,  Node: Top,  Next: Invoking GPG,  Up: (dir)
+
+Using the GnuPG Version 1.4
+***************************
+
+This is the `The GNU Privacy Guard Manual' (1.4.6, 4 December 2006).
+
+   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free
+Software Foundation, Inc.
+
+     Permission is granted to copy, distribute and/or modify this
+     document under the terms of 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. The text of the
+     license can be found in the section entitled "Copying".
+
+This manual documents how to use the standalone version of GNU Privacy
+Guard.
+
+* Menu:
+
+* Invoking GPG::        Using the classic GPG protocol.
+* Specify a User ID::   How to Specify a User Id.
+
+* Copying::             GNU General Public License says
+                        how you can copy and share GnuPG
+* Option Index::        Index to command line options.
+* Index::              Index of concepts and symbol names.
+
+\1f
+File: gnupg1.info,  Node: Invoking GPG,  Next: Specify a User ID,  Prev: Top,  Up: Top
+
+1 Invoking GPG
+**************
+
+`gpg' is the OpenPGP part of the GNU Privacy Guard (GnuPG). It is a
+tool to provide digital encryption and signing services using the
+OpenPGP standard. `gpg' features complete key management and all bells
+and whistles you can expect from a decent OpenPGP implementation.
+
+   This is the standalone version of `gpg'.  For desktop use you should
+consider using `gpg2'.
+
+   *Note Option Index::, for an index to `gpg''s commands and options.
+
+* Menu:
+
+* GPG Commands::        List of all commands.
+* GPG Options::         List of all options.
+* GPG Configuration::   Configuration files.
+* GPG Examples::        Some usage examples.
+
+Developer information:
+
+\1f
+File: gnupg1.info,  Node: GPG Commands,  Next: GPG Options,  Up: Invoking GPG
+
+1.1 Commands
+============
+
+Commands are not distinguished from options execpt for the fact that
+only one command is allowed.
+
+   `gpg' may be run with no commands, in which case it will perform a
+reasonable action depending on the type of file it is given as input
+(an encrypted message is decrypted, a signature is verified, a file
+containing keys is listed).
+
+   Please remember that option as well as command parsing stops as soon
+as a non-option is encountered, you can explicitly stop parsing by
+using the special option `--'.
+
+* Menu:
+
+* General GPG Commands::        Commands not specific to the functionality.
+* Operational GPG Commands::    Commands to select the type of operation.
+* OpenPGP Key Management::      How to manage your keys.
+
+\1f
+File: gnupg1.info,  Node: General GPG Commands,  Next: Operational GPG Commands,  Up: GPG Commands
+
+1.1.1 Commands not specific to the function
+-------------------------------------------
+
+`--version'
+     Print the program version and licensing information.  Note that you
+     cannot abbreviate this command.
+
+`--help'
+`-h'
+     Print a usage message summarizing the most useful command line
+     options.  Not that you cannot abbreviate this command.
+
+`--warranty'
+     Print warranty information.
+
+`--dump-options'
+     Print a list of all available options and commands.  Note that you
+     cannot abbreviate this command.
+
+\1f
+File: gnupg1.info,  Node: Operational GPG Commands,  Next: OpenPGP Key Management,  Prev: General GPG Commands,  Up: GPG Commands
+
+1.1.2 Commands to select the type of operation
+----------------------------------------------
+
+`--sign'
+`-s'
+     Make a signature. This command may be combined with `--encrypt'
+     (for a signed and encrypted message), `--symmetric' (for a signed
+     and symmetrically encrypted message), or `--encrypt' and
+     `--symmetric' together (for a signed message that may be decrypted
+     via a secret key or a passphrase).
+
+`--clearsign'
+     Make a clear text signature. The content in a clear text signature
+     is readable without any special software. OpenPGP software is only
+     needed to verify the signature. Clear text signatures may modify
+     end-of-line whitespace for platform independence and are not
+     intended to be reversible.
+
+`--detach-sign'
+`-b'
+     Make a detached signature.
+
+`--encrypt'
+`-e'
+     Encrypt data. This option may be combined with `--sign' (for a
+     signed and encrypted message), `--symmetric' (for a message that
+     may be decrypted via a secret key or a passphrase), or `--sign'
+     and `--symmetric' together (for a signed message that may be
+     decrypted via a secret key or a passphrase).
+
+`--symmetric'
+`-c'
+     Encrypt with a symmetric cipher using a passphrase. The default
+     symmetric cipher used is CAST5, but may be chosen with the
+     `--cipher-algo' option. This option may be combined with `--sign'
+     (for a signed and symmetrically encrypted message), `--encrypt'
+     (for a message that may be decrypted via a secret key or a
+     passphrase), or `--sign' and `--encrypt' together (for a signed
+     message that may be decrypted via a secret key or a passphrase).
+
+`--store'
+     Store only (make a simple RFC1991 literal data packet).
+
+`--decrypt'
+`-d'
+     Decrypt the file given on the command line (or `stdin' if no file
+     is specified) and write it to stdout (or the file specified with
+     `--output'). If the decrypted file is signed, the signature is also
+     verified. This command differs from the default operation, as it
+     never writes to the filename which is included in the file and it
+     rejects files which don't begin with an encrypted message.
+
+`--verify'
+     Assume that the first argument is a signed file or a detached
+     signature and verify it without generating any output. With no
+     arguments, the signature packet is read from stdin. If only a
+     sigfile is given, it may be a complete signature or a detached
+     signature, in which case the signed stuff is expected in a file
+     without the ".sig" or ".asc" extension.  With more than 1
+     argument, the first should be a detached signature and the
+     remaining files are the signed stuff. To read the signed stuff
+     from stdin, use `-' as the second filename.  For security reasons
+     a detached signature cannot read the signed material from stdin
+     without denoting it in the above way.
+
+`--multifile'
+     This modifies certain other commands to accept multiple files for
+     processing on the command line or read from stdin with each
+     filename on a separate line. This allows for many files to be
+     processed at once. `--multifile' may currently be used along with
+     `--verify', `--encrypt', and `--decrypt'. Note that `--multifile
+     --verify' may not be used with detached signatures.
+
+`--verify-files'
+     Identical to `--multifile --verify'.
+
+`--encrypt-files'
+     Identical to `--multifile --encrypt'.
+
+`--decrypt-files'
+     Identical to `--multifile --decrypt'.
+
+`--list-keys'
+`-k'
+`--list-public-keys'
+     List all keys from the public keyrings, or just the keys given on
+     the command line.  `-k' is slightly different from `--list-keys'
+     in that it allows only for one argument and takes the second
+     argument as the keyring to search.  This is for command line
+     compatibility with PGP 2 and has been removed in `gpg2'.
+
+     Avoid using the output of this command in scripts or other
+     programs as it is likely to change as GnuPG changes. See
+     `--with-colons' for a machine-parseable key listing command that
+     is appropriate for use in scripts and other programs.
+
+`--list-secret-keys'
+`-K'
+     List all keys from the secret keyrings, or just the ones given on
+     the command line. A `#' after the letters `sec' means that the
+     secret key is not usable (for example, if it was created via
+     `--export-secret-subkeys').
+
+`--list-sigs'
+     Same as `--list-keys', but the signatures are listed too.
+
+     For each signature listed, there are several flags in between the
+     "sig" tag and keyid. These flags give additional information about
+     each signature. From left to right, they are the numbers 1-3 for
+     certificate check level (see `--ask-cert-level'), "L" for a local
+     or non-exportable signature (see `--lsign-key'), "R" for a
+     nonRevocable signature (see the `--edit-key' command "nrsign"),
+     "P" for a signature that contains a policy URL (see
+     `--cert-policy-url'), "N" for a signature that contains a notation
+     (see `--cert-notation'), "X" for an eXpired signature (see
+     `--ask-cert-expire'), and the numbers 1-9 or "T" for 10 and above
+     to indicate trust signature levels (see the `--edit-key' command
+     "tsign").
+
+`--check-sigs'
+     Same as `--list-sigs', but the signatures are verified.
+
+`--fingerprint'
+     List all keys (or the specified ones) along with their
+     fingerprints. This is the same output as `--list-keys' but with
+     the additional output of a line with the fingerprint. May also be
+     combined with `--list-sigs' or `--check-sigs'.  If this command is
+     given twice, the fingerprints of all secondary keys are listed too.
+
+`--list-packets'
+     List only the sequence of packets. This is mainly useful for
+     debugging.
+
+`--card-edit'
+     Present a menu to work with a smartcard. The subcommand "help"
+     provides an overview on available commands. For a detailed
+     description, please see the Card HOWTO at
+     http://www.gnupg.org/documentation/howtos.html#GnuPG-cardHOWTO .
+
+`--card-status'
+     Show the content of the smart card.
+
+`--change-pin'
+     Present a menu to allow changing the PIN of a smartcard. This
+     functionality is also available as the subcommand "passwd" with the
+     `--card-edit' command.
+
+`--delete-key `name''
+     Remove key from the public keyring. In batch mode either `--yes' is
+     required or the key must be specified by fingerprint. This is a
+     safeguard against accidental deletion of multiple keys.
+
+`--delete-secret-key `name''
+     Remove key from the secret and public keyring. In batch mode the
+     key must be specified by fingerprint.
+
+`--delete-secret-and-public-key `name''
+     Same as `--delete-key', but if a secret key exists, it will be
+     removed first. In batch mode the key must be specified by
+     fingerprint.
+
+`--export'
+     Either export all keys from all keyrings (default keyrings and
+     those registered via option `--keyring'), or if at least one name
+     is given, those of the given name. The new keyring is written to
+     stdout or to the file given with option `--output'. Use together
+     with `--armor' to mail those keys.
+
+`--send-keys `key IDs''
+     Similar to `--export' but sends the keys to a keyserver.
+     Fingerprints may be used instead of key IDs. Option `--keyserver'
+     must be used to give the name of this keyserver. Don't send your
+     complete keyring to a keyserver -- select only those keys which
+     are new or changed by you.
+
+`--export-secret-keys'
+`--export-secret-subkeys'
+     Same as `--export', but exports the secret keys instead.  This is
+     normally not very useful and a security risk.  The second form of
+     the command has the special property to render the secret part of
+     the primary key useless; this is a GNU extension to OpenPGP and
+     other implementations can not be expected to successfully import
+     such a key.  See the option `--simple-sk-checksum' if you want to
+     import such an exported key with an older OpenPGP implementation.
+
+`--import'
+`--fast-import'
+     Import/merge keys. This adds the given keys to the keyring. The
+     fast version is currently just a synonym.
+
+     There are a few other options which control how this command works.
+     Most notable here is the `--keyserver-options merge-only' option
+     which does not insert new keys but does only the merging of new
+     signatures, user-IDs and subkeys.
+
+`--recv-keys `key IDs''
+     Import the keys with the given key IDs from a keyserver. Option
+     `--keyserver' must be used to give the name of this keyserver.
+
+`--refresh-keys'
+     Request updates from a keyserver for keys that already exist on the
+     local keyring. This is useful for updating a key with the latest
+     signatures, user IDs, etc. Calling this with no arguments will
+     refresh the entire keyring. Option `--keyserver' must be used to
+     give the name of the keyserver for all keys that do not have
+     preferred keyservers set (see `--keyserver-options
+     honor-keyserver-url').
+
+`--search-keys `names''
+     Search the keyserver for the given names. Multiple names given
+     here will be joined together to create the search string for the
+     keyserver.  Option `--keyserver' must be used to give the name of
+     this keyserver.  Keyservers that support different search methods
+     allow using the syntax specified in "How to specify a user ID"
+     below. Note that different keyserver types support different
+     search methods. Currently only LDAP supports them all.
+
+`--fetch-keys `URIs''
+     Retrieve keys located at the specified URIs. Note that different
+     installations of GnuPG may support different protocols (HTTP, FTP,
+     LDAP, etc.)
+
+`--update-trustdb'
+     Do trust database maintenance. This command iterates over all keys
+     and builds the Web of Trust. This is an interactive command
+     because it may have to ask for the "ownertrust" values for keys.
+     The user has to give an estimation of how far she trusts the owner
+     of the displayed key to correctly certify (sign) other keys. GnuPG
+     only asks for the ownertrust value if it has not yet been assigned
+     to a key. Using the `--edit-key' menu, the assigned value can be
+     changed at any time.
+
+`--check-trustdb'
+     Do trust database maintenance without user interaction. From time
+     to time the trust database must be updated so that expired keys or
+     signatures and the resulting changes in the Web of Trust can be
+     tracked. Normally, GnuPG will calculate when this is required and
+     do it automatically unless `--no-auto-check-trustdb' is set. This
+     command can be used to force a trust database check at any time.
+     The processing is identical to that of `--update-trustdb' but it
+     skips keys with a not yet defined "ownertrust".
+
+     For use with cron jobs, this command can be used together with
+     `--batch' in which case the trust database check is done only if a
+     check is needed. To force a run even in batch mode add the option
+     `--yes'.
+
+`--export-ownertrust'
+     Send the ownertrust values to stdout. This is useful for backup
+     purposes as these values are the only ones which can't be
+     re-created from a corrupted trust DB.
+
+`--import-ownertrust'
+     Update the trustdb with the ownertrust values stored in `files' (or
+     stdin if not given); existing values will be overwritten.
+
+`--rebuild-keydb-caches'
+     When updating from version 1.0.6 to 1.0.7 this command should be
+     used to create signature caches in the keyring. It might be handy
+     in other situations too.
+
+`--print-md `algo''
+`--print-mds'
+     Print message digest of algorithm ALGO for all given files or
+     stdin.  With the second form (or a deprecated "*" as algo) digests
+     for all available algorithms are printed.
+
+`--gen-random `0|1|2''
+     Emit COUNT random bytes of the given quality level. If count is
+     not given or zero, an endless sequence of random bytes will be
+     emitted.  PLEASE, don't use this command unless you know what you
+     are doing; it may remove precious entropy from the system!
+
+`--gen-prime `mode'  `bits''
+     Use the source, Luke :-). The output format is still subject to
+     change.
+
+`--enarmor'
+
+`--dearmor'
+     Pack or unpack an arbitrary input into/from an OpenPGP ASCII armor.
+     This is a GnuPG extension to OpenPGP and in general not very
+     useful.
+
+
+\1f
+File: gnupg1.info,  Node: OpenPGP Key Management,  Prev: Operational GPG Commands,  Up: GPG Commands
+
+1.1.3 How to manage your keys
+-----------------------------
+
+This section explains the main commands for key management
+
+`--gen-key'
+     Generate a new key pair. This command is normally only used
+     interactively.
+
+     There is an experimental feature which allows you to create keys in
+     batch mode. See the file `doc/DETAILS' in the source distribution
+     on how to use this.
+
+`--gen-revoke `name''
+     Generate a revocation certificate for the complete key. To revoke
+     a subkey or a signature, use the `--edit' command.
+
+`--desig-revoke `name''
+     Generate a designated revocation certificate for a key. This
+     allows a user (with the permission of the keyholder) to revoke
+     someone else's key.
+
+`--edit-key'
+     Present a menu which enables you to do most of the key management
+     related tasks.  It expects the specification of a key on the
+     command line.
+
+    sign
+          Make a signature on key of user `name' If the key is not yet
+          signed by the default user (or the users given with -u), the
+          program displays the information of the key again, together
+          with its fingerprint and asks whether it should be signed.
+          This question is repeated for all users specified with -u.
+
+    lsign
+          Same as "sign" but the signature is marked as non-exportable
+          and will therefore never be used by others. This may be used
+          to make keys valid only in the local environment.
+
+    nrsign
+          Same as "sign" but the signature is marked as non-revocable
+          and can therefore never be revoked.
+
+    tsign
+          Make a trust signature. This is a signature that combines the
+          notions of certification (like a regular signature), and
+          trust (like the "trust" command). It is generally only useful
+          in distinct communities or groups.
+
+     Note that "l" (for local / non-exportable), "nr" (for
+     non-revocable, and "t" (for trust) may be freely mixed and
+     prefixed to "sign" to create a signature of any type desired.
+
+    revsig
+          Revoke a signature. For every signature which has been
+          generated by one of the secret keys, GnuPG asks whether a
+          revocation certificate should be generated.
+
+    trust
+          Change the owner trust value. This updates the trust-db
+          immediately and no save is required.
+
+    disable
+    enable
+          Disable or enable an entire key. A disabled key can not
+          normally be used for encryption.
+
+    adduid
+          Create an alternate user id.
+
+    addphoto
+          Create a photographic user id. This will prompt for a JPEG
+          file that will be embedded into the user ID. Note that a very
+          large JPEG will make for a very large key. Also note that
+          some programs will display your JPEG unchanged (GnuPG), and
+          some programs will scale it to fit in a dialog box (PGP).
+
+    deluid
+          Delete a user id.  Note that it is not possible to retract a
+          user id, once it has been send to the public (i.e. to a
+          keyserver).  In that case you better use `revuid'.
+
+    delsig
+          Delete a signature. Note that it is not possible to retract a
+          signature, once it has been send to the public (i.e. to a
+          keyserver).  In that case you better use `revsig'.
+
+    revuid
+          Revoke a user id.
+
+    addkey
+          Add a subkey to this key.
+
+    addcardkey
+          Generate a key on a card and add it to this key.
+
+    keytocard
+          Transfer the selected secret key (or the primary key if no
+          key has been selected) to a smartcard. The secret key in the
+          keyring will be replaced by a stub if the key could be stored
+          successfully on the card and you use the save command later.
+          Only certain key types may be transferred to the card. A sub
+          menu allows you to select on what card to store the key. Note
+          that it is not possible to get that key back from the card -
+          if the card gets broken your secret key will be lost unless
+          you have a backup somewhere.
+
+    bkuptocard `file'
+          Restore the given file to a card. This command may be used to
+          restore a backup key (as generated during card
+          initialization) to a new card. In almost all cases this will
+          be the encryption key. You should use this command only with
+          the corresponding public key and make sure that the file
+          given as argument is indeed the backup to restore. You should
+          then select 2 to restore as encryption key.  You will first
+          be asked to enter the passphrase of the backup key and then
+          for the Admin PIN of the card.
+
+    delkey
+          Remove a subkey (secondart key). Note that it is not possible
+          to retract a subkey, once it has been send to the public
+          (i.e. to a keyserver).  In that case you better use `revkey'.
+
+    addrevoker
+          Add a designated revoker. This takes one optional argument:
+          "sensitive". If a designated revoker is marked as sensitive,
+          it will not be exported by default (see export-options).
+
+    revkey
+          Revoke a subkey.
+
+    expire
+          Change the key expiration time. If a subkey is selected, the
+          expiration time of this subkey will be changed. With no
+          selection, the key expiration of the primary key is changed.
+
+    passwd
+          Change the passphrase of the secret key.
+
+    primary
+          Flag the current user id as the primary one, removes the
+          primary user id flag from all other user ids and sets the
+          timestamp of all affected self-signatures one second ahead.
+          Note that setting a photo user ID as primary makes it primary
+          over other photo user IDs, and setting a regular user ID as
+          primary makes it primary over other regular user IDs.
+
+    uid `n'
+          Toggle selection of user id with index `n'.  Use 0 to
+          deselect all.
+
+    key `n'
+          Toggle selection of subkey with index `n'.  Use 0 to deselect
+          all.
+
+    check
+          Check all selected user ids.
+
+    showphoto
+          Display the selected photographic user id.
+
+    pref
+          List preferences from the selected user ID. This shows the
+          actual preferences, without including any implied preferences.
+
+    showpref
+          More verbose preferences listing for the selected user ID.
+          This shows the preferences in effect by including the implied
+          preferences of 3DES (cipher), SHA-1 (digest), and
+          Uncompressed (compression) if they are not already included
+          in the preference list. In addition, the preferred keyserver
+          and signature notations (if any) are shown.
+
+    setpref `string'
+          Set the list of user ID preferences to `string' for all (or
+          just the selected) user IDs. Calling setpref with no
+          arguments sets the preference list to the default (either
+          built-in or set via `--default-preference-list'), and calling
+          setpref with "none" as the argument sets an empty preference
+          list. Use `gpg --version' to get a list of available
+          algorithms. Note that while you can change the preferences on
+          an attribute user ID (aka "photo ID"), GnuPG does not select
+          keys via attribute user IDs so these preferences will not be
+          used by GnuPG.
+
+    keyserver
+          Set a preferred keyserver for the specified user ID(s). This
+          allows other users to know where you prefer they get your key
+          from. See `--keyserver-options honor-keyserver-url' for more
+          on how this works.  Setting a value of "none" removes an
+          existing preferred keyserver.
+
+    notation
+          Set a name=value notation for the specified user ID(s). See
+          `--cert-notation' for more on how this works. Setting a value
+          of "none" removes all notations, setting a notation prefixed
+          with a minus sign (-) removes that notation, and setting a
+          notation name (without the =value) prefixed with a minus sign
+          removes all notations with that name.
+
+    toggle
+          Toggle between public and secret key listing.
+
+    clean
+          Compact (by removing all signatures except the selfsig) any
+          user ID that is no longer usable (e.g. revoked, or expired).
+          Then, remove any signatures that are not usable by the trust
+          calculations.  Specifically, this removes any signature that
+          does not validate, any signature that is superseded by a
+          later signature, revoked signatures, and signatures issued by
+          keys that are not present on the keyring.
+
+    minimize
+          Make the key as small as possible. This removes all
+          signatures from each user ID except for the most recent
+          self-signature.
+
+    cross-certify
+          Add cross-certification signatures to signing subkeys that
+          may not currently have them. Cross-certification signatures
+          protect against a subtle attack against signing subkeys. See
+          `--require-cross-certification'.
+
+    save
+          Save all changes to the key rings and quit.
+
+    quit
+          Quit the program without updating the key rings.
+
+
+     The listing shows you the key with its secondary keys and all user
+     ids. Selected keys or user ids are indicated by an asterisk. The
+     trust value is displayed with the primary key: the first is the
+     assigned owner trust and the second is the calculated trust value.
+     Letters are used for the values:
+
+    -
+          No ownertrust assigned / not yet calculated.
+
+    e
+          Trust calculation has failed; probably due to an expired key.
+
+    q
+          Not enough information for calculation.
+
+    n
+          Never trust this key.
+
+    m
+          Marginally trusted.
+
+    f
+          Fully trusted.
+
+    u
+          Ultimately trusted.
+
+`--sign-key `name''
+     Signs a public key with your secret key. This is a shortcut
+     version of the subcommand "sign" from `--edit'.
+
+`--lsign-key `name''
+     Signs a public key with your secret key but marks it as
+     non-exportable. This is a shortcut version of the subcommand
+     "lsign" from `--edit-key'.
+
+
+\1f
+File: gnupg1.info,  Node: GPG Options,  Next: GPG Configuration,  Prev: GPG Commands,  Up: Invoking GPG
+
+1.2 Option Summary
+==================
+
+`gpg' comes features a bunch of options to control the exact behaviour
+and to change the default configuration.
+
+* Menu:
+
+* GPG Configuration Options::   How to change the configuration.
+* GPG Key related Options::     Key related options.
+* GPG Input and Output::        Input and Output.
+* OpenPGP Options::             OpenPGP protocol specific options.
+* GPG Esoteric Options::        Doing things one usually don't want to do.
+
+   Long options can be put in an options file (default
+"~/.gnupg/gpg.conf"). Short option names will not work - for example,
+"armor" is a valid option for the options file, while "a" is not. Do not
+write the 2 dashes, but simply the name of the option and any required
+arguments. Lines with a hash ('#') as the first non-white-space
+character are ignored. Commands may be put in this file too, but that is
+not generally useful as the command will execute automatically with
+every execution of gpg.
+
+   Please remember that option parsing stops as soon as a non-option is
+encountered, you can explicitly stop parsing by using the special option
+`--'.
+
+\1f
+File: gnupg1.info,  Node: GPG Configuration Options,  Next: GPG Key related Options,  Up: GPG Options
+
+1.2.1 How to change the configuration
+-------------------------------------
+
+These options are used to change the configuraton and are usually found
+in the option file.
+
+`--default-key NAME'
+     Use NAME as the default key to sign with. If this option is not
+     used, the default key is the first key found in the secret keyring.
+     Note that `-u' or `--local-user' overrides this option.
+
+`--default-recipient NAME'
+     Use NAME as default recipient if option `--recipient' is not used
+     and don't ask if this is a valid one. NAME must be non-empty.
+
+`--default-recipient-self'
+     Use the default key as default recipient if option `--recipient'
+     is not used and don't ask if this is a valid one. The default key
+     is the first one from the secret keyring or the one set with
+     `--default-key'.
+
+`--no-default-recipient'
+     Reset `--default-recipient' and `--default-recipient-self'.
+
+`-v, --verbose'
+     Give more information during processing. If used twice, the input
+     data is listed in detail.
+
+`--no-verbose'
+     Reset verbose level to 0.
+
+`-q, --quiet'
+     Try to be as quiet as possible.
+
+`--list-options `parameters''
+     This is a space or comma delimited string that gives options used
+     when listing keys and signatures (that is, `--list-keys',
+     `--list-sigs', `--list-public-keys', `--list-secret-keys', and the
+     `--edit-key' functions).  Options can be prepended with a `no-'
+     (after the two dashes) to give the opposite meaning.  The options
+     are:
+
+    show-photos
+          Causes `--list-keys', `--list-sigs', `--list-public-keys',
+          and `--list-secret-keys' to display any photo IDs attached to
+          the key.  Defaults to no. See also `--photo-viewer'.
+
+    show-policy-urls
+          Show policy URLs in the `--list-sigs' or `--check-sigs'
+          listings.  Defaults to no.
+
+    show-notations
+    show-std-notations
+    show-user-notations
+          Show all, IETF standard, or user-defined signature notations
+          in the `--list-sigs' or `--check-sigs' listings. Defaults to
+          no.
+
+    show-keyserver-urls
+          Show any preferred keyserver URL in the `--list-sigs' or
+          `--check-sigs' listings. Defaults to no.
+
+    show-uid-validity
+          Display the calculated validity of user IDs during key
+          listings.  Defaults to no.
+
+    show-unusable-uids
+          Show revoked and expired user IDs in key listings. Defaults
+          to no.
+
+    show-unusable-subkeys
+          Show revoked and expired subkeys in key listings. Defaults to
+          no.
+
+    show-keyring
+          Display the keyring name at the head of key listings to show
+          which keyring a given key resides on. Defaults to no.
+
+    show-sig-expire
+          Show signature expiration dates (if any) during `--list-sigs'
+          or `--check-sigs' listings. Defaults to no.
+
+    show-sig-subpackets
+          Include signature subpackets in the key listing. This option
+          can take an optional argument list of the subpackets to list.
+          If no argument is passed, list all subpackets. Defaults to
+          no. This option is only meaningful when using `--with-colons'
+          along with `--list-sigs' or `--check-sigs'.
+
+`--verify-options `parameters''
+     This is a space or comma delimited string that gives options used
+     when verifying signatures. Options can be prepended with a `no-'
+     to give the opposite meaning. The options are:
+
+    show-photos
+          Display any photo IDs present on the key that issued the
+          signature.  Defaults to no. See also `--photo-viewer'.
+
+    show-policy-urls
+          Show policy URLs in the signature being verified. Defaults to
+          no.
+
+    show-notations
+    show-std-notations
+    show-user-notations
+          Show all, IETF standard, or user-defined signature notations
+          in the signature being verified. Defaults to IETF standard.
+
+    show-keyserver-urls
+          Show any preferred keyserver URL in the signature being
+          verified.  Defaults to no.
+
+    show-uid-validity
+          Display the calculated validity of the user IDs on the key
+          that issued the signature. Defaults to no.
+
+    show-unusable-uids
+          Show revoked and expired user IDs during signature
+          verification.  Defaults to no.
+
+    pka-lookups
+          Enable PKA lookups to verify sender addresses. Note that PKA
+          is based on DNS, and so enabling this option may disclose
+          information on when and what signatures are verified or to
+          whom data is encrypted. This is similar to the "web bug"
+          described for the auto-key-retrieve feature.
+
+    pka-trust-increase
+          Raise the trust in a signature to full if the signature
+          passes PKA validation. This option is only meaningful if
+          pka-lookups is set.
+
+`--enable-dsa2'
+`--disable-dsa2'
+     Enables new-style DSA keys which (unlike the old style) may be
+     larger than 1024 bit and use hashes other than SHA-1 and
+     RIPEMD/160. Note that very few programs currently support these
+     keys and signatures from them.
+
+`--photo-viewer `string''
+     This is the command line that should be run to view a photo ID.
+     "%i" will be expanded to a filename containing the photo. "%I"
+     does the same, except the file will not be deleted once the viewer
+     exits.  Other flags are "%k" for the key ID, "%K" for the long key
+     ID, "%f" for the key fingerprint, "%t" for the extension of the
+     image type (e.g. "jpg"), "%T" for the MIME type of the image (e.g.
+     "image/jpeg"), and "%%" for an actual percent sign. If neither %i
+     or %I are present, then the photo will be supplied to the viewer
+     on standard input.
+
+     The default viewer is "xloadimage -fork -quiet -title 'KeyID 0x%k'
+     stdin". Note that if your image viewer program is not secure, then
+     executing it from GnuPG does not make it secure.
+
+`--exec-path `string''
+     Sets a list of directories to search for photo viewers and
+     keyserver helpers. If not provided, keyserver helpers use the
+     compiled-in default directory, and photo viewers use the $PATH
+     environment variable.  Note, that on W32 system this value is
+     ignored when searching for keyserver helpers.
+
+`--keyring `file''
+     Add `file' to the current list of keyrings. If `file' begins with
+     a tilde and a slash, these are replaced by the $HOME directory. If
+     the filename does not contain a slash, it is assumed to be in the
+     GnuPG home directory ("~/.gnupg" if `--homedir' or $GNUPGHOME is
+     not used).
+
+     Note that this adds a keyring to the current list. If the intent
+     is to use the specified keyring alone, use `--keyring' along with
+     `--no-default-keyring'.
+
+`--secret-keyring `file''
+     Same as `--keyring' but for the secret keyrings.
+
+`--primary-keyring `file''
+     Designate `file' as the primary public keyring. This means that
+     newly imported keys (via `--import' or keyserver `--recv-from')
+     will go to this keyring.
+
+`--trustdb-name `file''
+     Use `file' instead of the default trustdb. If `file' begins with a
+     tilde and a slash, these are replaced by the $HOME directory. If
+     the filename does not contain a slash, it is assumed to be in the
+     GnuPG home directory (`~/.gnupg' if `--homedir' or $GNUPGHOME is
+     not used).
+
+`--homedir DIR'
+     Set the name of the home directory to DIR. If his option is not
+     used, the home directory defaults to `~/.gnupg'.  It is only
+     recognized when given on the command line.  It also overrides any
+     home directory stated through the environment variable `GNUPGHOME'
+     or (on W32 systems) by means on the Registry entry
+     HKCU\SOFTWARE\GNU\GNUPG:HOMEDIR.
+
+`--pcsc-driver `file''
+     Use `file' to access the smartcard reader. The current default is
+     `libpcsclite.so.1' for GLIBC based systems,
+     `/System/Library/Frameworks/PCSC.framework/PCSC' for MAC OS X,
+     `winscard.dll' for Windows and `libpcsclite.so' for other systems.
+
+`--disable-ccid'
+     Disable the integrated support for CCID compliant readers. This
+     allows to fall back to one of the other drivers even if the
+     internal CCID driver can handle the reader. Note, that CCID
+     support is only available if libusb was available at build time.
+
+`--reader-port `number_or_string''
+     This option may be used to specify the port of the card terminal. A
+     value of 0 refers to the first serial device; add 32768 to access
+     USB devices. The default is 32768 (first USB device). PC/SC or CCID
+     readers might need a string here; run the program in verbose mode
+     to get a list of available readers. The default is then the first
+     reader found.
+
+`--display-charset `name''
+     Set the name of the native character set. This is used to convert
+     some informational strings like user IDs to the proper UTF-8
+     encoding.  Note that this has nothing to do with the character set
+     of data to be encrypted or signed; GnuPG does not recode user
+     supplied data. If this option is not used, the default character
+     set is determined from the current locale. A verbosity level of 3
+     shows the chosen set.  Valid values for `name' are:
+
+    iso-8859-1
+          This is the Latin 1 set.
+
+    iso-8859-2
+          The Latin 2 set.
+
+    iso-8859-15
+          This is currently an alias for the Latin 1 set.
+
+    koi8-r
+          The usual Russian set (rfc1489).
+
+    utf-8
+          Bypass all translations and assume that the OS uses native
+          UTF-8 encoding.
+
+`--utf8-strings'
+`--no-utf8-strings'
+     Assume that command line arguments are given as UTF8 strings. The
+     default (`--no-utf8-strings') is to assume that arguments are
+     encoded in the character set as specified by `--display-charset'.
+     These options affect all following arguments. Both options may be
+     used multiple times.
+
+`--options `file''
+     Read options from `file' and do not try to read them from the
+     default options file in the homedir (see `--homedir'). This option
+     is ignored if used in an options file.
+
+`--no-options'
+     Shortcut for `--options /dev/null'. This option is detected before
+     an attempt to open an option file.  Using this option will also
+     prevent the creation of a `~/.gnupg' homedir.
+
+`-z `n''
+`--compress-level `n''
+`--bzip2-compress-level `n''
+     Set compression level to `n' for the ZIP and ZLIB compression
+     algorithms. The default is to use the default compression level of
+     zlib (normally 6). `--bzip2-compress-level' sets the compression
+     level for the BZIP2 compression algorithm (defaulting to 6 as
+     well). This is a different option from `--compress-level' since
+     BZIP2 uses a significant amount of memory for each additional
+     compression level.  `-z' sets both. A value of 0 for `n' disables
+     compression.
+
+`--bzip2-decompress-lowmem'
+     Use a different decompression method for BZIP2 compressed files.
+     This alternate method uses a bit more than half the memory, but
+     also runs at half the speed. This is useful under extreme low
+     memory circumstances when the file was originally compressed at a
+     high `--bzip2-compress-level'.
+
+`--mangle-dos-filenames'
+`--no-mangle-dos-filenames'
+     Older version of Windows cannot handle filenames with more than one
+     dot. `--mangle-dos-filenames' causes GnuPG to replace (rather than
+     add to) the extension of an output filename to avoid this problem.
+     This option is off by default and has no effect on non-Windows
+     platforms.
+
+`--ask-cert-level'
+`--no-ask-cert-level'
+     When making a key signature, prompt for a certification level. If
+     this option is not specified, the certification level used is set
+     via `--default-cert-level'. See `--default-cert-level' for
+     information on the specific levels and how they are used.
+     `--no-ask-cert-level' disables this option. This option defaults
+     to no.
+
+`--default-cert-level `n''
+     The default to use for the check level when signing a key.
+
+     0 means you make no particular claim as to how carefully you
+     verified the key.
+
+     1 means you believe the key is owned by the person who claims to
+     own it but you could not, or did not verify the key at all. This is
+     useful for a "persona" verification, where you sign the key of a
+     pseudonymous user.
+
+     2 means you did casual verification of the key. For example, this
+     could mean that you verified that the key fingerprint and checked
+     the user ID on the key against a photo ID.
+
+     3 means you did extensive verification of the key. For example,
+     this could mean that you verified the key fingerprint with the
+     owner of the key in person, and that you checked, by means of a
+     hard to forge document with a photo ID (such as a passport) that
+     the name of the key owner matches the name in the user ID on the
+     key, and finally that you verified (by exchange of email) that the
+     email address on the key belongs to the key owner.
+
+     Note that the examples given above for levels 2 and 3 are just
+     that: examples. In the end, it is up to you to decide just what
+     "casual" and "extensive" mean to you.
+
+     This option defaults to 0 (no particular claim).
+
+`--min-cert-level'
+     When building the trust database, treat any signatures with a
+     certification level below this as invalid. Defaults to 2, which
+     disregards level 1 signatures. Note that level 0 "no particular
+     claim" signatures are always accepted.
+
+`--trusted-key `long key ID''
+     Assume that the specified key (which must be given as a full 8
+     byte key ID) is as trustworthy as one of your own secret keys.
+     This option is useful if you don't want to keep your secret keys
+     (or one of them) online but still want to be able to check the
+     validity of a given recipient's or signator's key.
+
+`--trust-model `pgp|classic|direct|always|auto''
+     Set what trust model GnuPG should follow. The models are:
+
+    pgp
+          This is the Web of Trust combined with trust signatures as
+          used in PGP 5.x and later. This is the default trust model
+          when creating a new trust database.
+
+    classic
+          This is the standard Web of Trust as used in PGP 2.x and
+          earlier.
+
+    direct
+          Key validity is set directly by the user and not calculated
+          via the Web of Trust.
+
+    always
+          Skip key validation and assume that used keys are always fully
+          trusted. You generally won't use this unless you are using
+          some external validation scheme. This option also suppresses
+          the "[uncertain]" tag printed with signature checks when
+          there is no evidence that the user ID is bound to the key.
+
+    auto
+          Select the trust model depending on whatever the internal
+          trust database says. This is the default model if such a
+          database already exists.
+
+`--auto-key-locate `parameters''
+`--no-auto-key-locate'
+     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 user@example.com
+     keys on the local keyring. This option takes any number of the
+     following arguments, in the order they are to be tried:
+
+    cert
+          locate a key using DNS CERT, as specified in 2538bis
+          (currently in draft): http://www.josefsson.org/rfc2538bis/
+
+    pka
+          locate a key using DNS PKA.
+
+    ldap
+          locate a key using the PGP Universal method of checking
+          "ldap://keys.(thedomain)".
+
+    keyserver
+          locate a key using whatever keyserver is defined using the
+          `--keyserver' option.
+
+    (keyserver URL)
+          In addition, a keyserver URL as used in the `--keyserver'
+          option may be used here to query that particular keyserver.
+
+`--keyid-format `short|0xshort|long|0xlong''
+     Select how to display key IDs. "short" is the traditional
+     8-character key ID. "long" is the more accurate (but less
+     convenient) 16-character key ID. Add an "0x" to either to include
+     an "0x" at the beginning of the key ID, as in 0x99242560.
+
+`--keyserver `name''
+     Use `name' as your keyserver. This is the server that
+     `--recv-keys', `--send-keys', and `--search-keys' will communicate
+     with to receive keys from, send keys to, and search for keys on.
+     The format of the `name' is a URI:
+     `scheme:[//]keyservername[:port]' The scheme is the type of
+     keyserver: "hkp" for the HTTP (or compatible) keyservers, "ldap"
+     for the LDAP keyservers, or "mailto" for the Graff email
+     keyserver. Note that your particular installation of GnuPG may
+     have other keyserver types available as well. Keyserver schemes
+     are case-insensitive. After the keyserver name, optional keyserver
+     configuration options may be provided. These are the same as the
+     global `--keyserver-options' from below, but apply only to this
+     particular keyserver.
+
+     Most keyservers synchronize with each other, so there is generally
+     no need to send keys to more than one server. The keyserver
+     `hkp://subkeys.pgp.net' uses round robin DNS to give a different
+     keyserver each time you use it.
+
+`--keyserver-options `name=value1 ''
+     This is a space or comma delimited string that gives options for
+     the keyserver. Options can be prepended with a `no-' to give the
+     opposite meaning. Valid import-options or export-options may be
+     used here as well to apply to importing (`--recv-key') or exporting
+     (`--send-key') a key from a keyserver. While not all options are
+     available for all keyserver types, some common options are:
+
+    include-revoked
+          When searching for a key with `--search-keys', include keys
+          that are marked on the keyserver as revoked. Note that not
+          all keyservers differentiate between revoked and unrevoked
+          keys, and for such keyservers this option is meaningless.
+          Note also that most keyservers do not have cryptographic
+          verification of key revocations, and so turning this option
+          off may result in skipping keys that are incorrectly marked
+          as revoked.
+
+    include-disabled
+          When searching for a key with `--search-keys', include keys
+          that are marked on the keyserver as disabled. Note that this
+          option is not used with HKP keyservers.
+
+    auto-key-retrieve
+          This option enables the automatic retrieving of keys from a
+          keyserver when verifying signatures made by keys that are not
+          on the local keyring.
+
+          Note that this option makes a "web bug" like behavior
+          possible.  Keyserver operators can see which keys you
+          request, so by sending you a message signed by a brand new
+          key (which you naturally will not have on your local
+          keyring), the operator can tell both your IP address and the
+          time when you verified the signature.
+
+    honor-keyserver-url
+          When using `--refresh-keys', if the key in question has a
+          preferred keyserver URL, then use that preferred keyserver to
+          refresh the key from. In addition, if auto-key-retrieve is
+          set, and the signature being verified has a preferred
+          keyserver URL, then use that preferred keyserver to fetch the
+          key from. Defaults to yes.
+
+    honor-pka-record
+          If auto-key-retrieve is set, and the signature being verified
+          has a PKA record, then use the PKA information to fetch the
+          key. Defaults to yes.
+
+    include-subkeys
+          When receiving a key, include subkeys as potential targets.
+          Note that this option is not used with HKP keyservers, as
+          they do not support retrieving keys by subkey id.
+
+    use-temp-files
+          On most Unix-like platforms, GnuPG communicates with the
+          keyserver helper program via pipes, which is the most
+          efficient method. This option forces GnuPG to use temporary
+          files to communicate. On some platforms (such as Win32 and
+          RISC OS), this option is always enabled.
+
+    keep-temp-files
+          If using `use-temp-files', do not delete the temp files after
+          using them. This option is useful to learn the keyserver
+          communication protocol by reading the temporary files.
+
+    verbose
+          Tell the keyserver helper program to be more verbose. This
+          option can be repeated multiple times to increase the
+          verbosity level.
+
+    timeout
+          Tell the keyserver helper program how long (in seconds) to
+          try and perform a keyserver action before giving up. Note
+          that performing multiple actions at the same time uses this
+          timeout value per action.  For example, when retrieving
+          multiple keys via `--recv-keys', the timeout applies
+          separately to each key retrieval, and not to the
+          `--recv-keys' command as a whole. Defaults to 30 seconds.
+
+    http-proxy
+          For HTTP-like keyserver schemes that (such as HKP and HTTP
+          itself), try to access the keyserver over a proxy. If a
+          `value' is specified, use this as the HTTP proxy. If no
+          `value' is specified, the value of the environment variable
+          "http_proxy", if any, will be used.
+
+    max-cert-size
+          When retrieving a key via DNS CERT, only accept keys up to
+          this size.  Defaults to 16384 bytes.
+
+`--completes-needed `n''
+     Number of completely trusted users to introduce a new key signer
+     (defaults to 1).
+
+`--marginals-needed `n''
+     Number of marginally trusted users to introduce a new key signer
+     (defaults to 3)
+
+`--max-cert-depth `n''
+     Maximum depth of a certification chain (default is 5).
+
+`--simple-sk-checksum'
+     Secret keys are integrity protected by using a SHA-1 checksum. This
+     method is part of the upcoming enhanced OpenPGP specification but
+     GnuPG already uses it as a countermeasure against certain attacks.
+     Old applications don't understand this new format, so this option
+     may be used to switch back to the old behaviour. Using this option
+     bears a security risk. Note that using this option only takes
+     effect when the secret key is encrypted - the simplest way to make
+     this happen is to change the passphrase on the key (even changing
+     it to the same value is acceptable).
+
+`--no-sig-cache'
+     Do not cache the verification status of key signatures.  Caching
+     gives a much better performance in key listings. However, if you
+     suspect that your public keyring is not save against write
+     modifications, you can use this option to disable the caching. It
+     probably does not make sense to disable it because all kind of
+     damage can be done if someone else has write access to your public
+     keyring.
+
+`--no-sig-create-check'
+     GnuPG normally verifies each signature right after creation to
+     protect against bugs and hardware malfunctions which could leak
+     out bits from the secret key. This extra verification needs some
+     time (about 115% for DSA keys), and so this option can be used to
+     disable it.  However, due to the fact that the signature creation
+     needs manual interaction, this performance penalty does not matter
+     in most settings.
+
+`--auto-check-trustdb'
+`--no-auto-check-trustdb'
+     If GnuPG feels that its information about the Web of Trust has to
+     be updated, it automatically runs the `--check-trustdb' command
+     internally.  This may be a time consuming process.
+     `--no-auto-check-trustdb' disables this option.
+
+`--use-agent'
+`--no-use-agent'
+     Try to use the GnuPG-Agent.  With this option, GnuPG first tries to
+     connect to the agent before it asks for a passphrase.
+     `--no-use-agent' disables this option.
+
+`--gpg-agent-info'
+     Override the value of the environment variable `GPG_AGENT_INFO'.
+     This is only used when `--use-agent' has been given
+
+`--lock-once'
+     Lock the databases the first time a lock is requested and do not
+     release the lock until the process terminates.
+
+`--lock-multiple'
+     Release the locks every time a lock is no longer needed. Use this
+     to override a previous `--lock-once' from a config file.
+
+`--lock-never'
+     Disable locking entirely. This option should be used only in very
+     special environments, where it can be assured that only one process
+     is accessing those files. A bootable floppy with a stand-alone
+     encryption system will probably use this. Improper usage of this
+     option may lead to data and key corruption.
+
+`--exit-on-status-write-error'
+     This option will cause write errors on the status FD to immediately
+     terminate the process. That should in fact be the default but it
+     never worked this way and thus we need an option to enable this,
+     so that the change won't break applications which close their end
+     of a status fd connected pipe too early. Using this option along
+     with `--enable-progress-filter' may be used to cleanly cancel long
+     running gpg operations.
+
+`--limit-card-insert-tries `n''
+     With `n' greater than 0 the number of prompts asking to insert a
+     smartcard gets limited to N-1. Thus with a value of 1 gpg won't at
+     all ask to insert a card if none has been inserted at startup. This
+     option is useful in the configuration file in case an application
+     does not know about the smartcard support and waits ad infinitum
+     for an inserted card.
+
+`--no-random-seed-file'
+     GnuPG uses a file to store its internal random pool over
+     invocations.  This makes random generation faster; however
+     sometimes write operations are not desired. This option can be
+     used to achieve that with the cost of slower random generation.
+
+`--no-greeting'
+     Suppress the initial copyright message.
+
+`--no-secmem-warning'
+     Suppress the warning about "using insecure memory".
+
+`--no-permission-warning'
+     Suppress the warning about unsafe file and home directory
+     (`--homedir') permissions. Note that the permission checks that
+     GnuPG performs are not intended to be authoritative, but rather
+     they simply warn about certain common permission problems. Do not
+     assume that the lack of a warning means that your system is secure.
+
+     Note that the warning for unsafe `--homedir' permissions cannot be
+     suppressed in the gpg.conf file, as this would allow an attacker to
+     place an unsafe gpg.conf file in place, and use this file to
+     suppress warnings about itself. The `--homedir' permissions
+     warning may only be suppressed on the command line.
+
+`--no-mdc-warning'
+     Suppress the warning about missing MDC integrity protection.
+
+`--require-secmem'
+`--no-require-secmem'
+     Refuse to run if GnuPG cannot get secure memory. Defaults to no
+     (i.e. run, but give a warning).
+
+`--require-cross-certification'
+`--no-require-cross-certification'
+     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 `--require-cross-certification' for `gpg'.
+
+`--expert'
+`--no-expert'
+     Allow the user to do certain nonsensical or "silly" things like
+     signing an expired or revoked key, or certain potentially
+     incompatible things like generating unusual key types. This also
+     disables certain warning messages about potentially incompatible
+     actions. As the name implies, this option is for experts only. If
+     you don't fully understand the implications of what it allows you
+     to do, leave this off. `--no-expert' disables this option.
+
+
+\1f
+File: gnupg1.info,  Node: GPG Key related Options,  Next: GPG Input and Output,  Prev: GPG Configuration Options,  Up: GPG Options
+
+1.2.2 Key related options
+-------------------------
+
+`--recipient NAME'
+`-r'
+     Encrypt for user id NAME. If this option or `--hidden-recipient'
+     is not specified, GnuPG asks for the user-id unless
+     `--default-recipient' is given.
+
+`--hidden-recipient NAME'
+`-R'
+     Encrypt for user ID NAME, but hide the key ID of this user's key.
+     This option helps to hide the receiver of the message and is a
+     limited countermeasure against traffic analysis. If this option or
+     `--recipient' is not specified, GnuPG asks for the user ID unless
+     `--default-recipient' is given.
+
+`--encrypt-to `name''
+     Same as `--recipient' but this one is intended for use in the
+     options file and may be used with your own user-id as an
+     "encrypt-to-self". These keys are only used when there are other
+     recipients given either by use of `--recipient' or by the asked
+     user id.  No trust checking is performed for these user ids and
+     even disabled keys can be used.
+
+`--hidden-encrypt-to `name''
+     Same as `--hidden-recipient' but this one is intended for use in
+     the options file and may be used with your own user-id as a hidden
+     "encrypt-to-self". These keys are only used when there are other
+     recipients given either by use of `--recipient' or by the asked
+     user id.  No trust checking is performed for these user ids and
+     even disabled keys can be used.
+
+`--no-encrypt-to'
+     Disable the use of all `--encrypt-to' and `--hidden-encrypt-to'
+     keys.
+
+`--group `name=value1 ''
+     Sets up a named group, which is similar to aliases in email
+     programs.  Any time the group name is a recipient (`-r' or
+     `--recipient'), it will be expanded to the values specified.
+     Multiple groups with the same name are automatically merged into a
+     single group.
+
+     The values are `key IDs' or fingerprints, but any key description
+     is accepted. Note that a value with spaces in it will be treated as
+     two different values. Note also there is only one level of
+     expansion -- you cannot make an group that points to another
+     group. When used from the command line, it may be necessary to
+     quote the argument to this option to prevent the shell from
+     treating it as multiple arguments.
+
+`--ungroup `name''
+     Remove a given entry from the `--group' list.
+
+`--no-groups'
+     Remove all entries from the `--group' list.
+
+`--local-user NAME'
+`-u'
+     Use NAME as the key to sign with. Note that this option overrides
+     `--default-key'.
+
+`--try-all-secrets'
+     Don't look at the key ID as stored in the message but try all
+     secret keys in turn to find the right decryption key. This option
+     forces the behaviour as used by anonymous recipients (created by
+     using `--throw-keyids') and might come handy in case where an
+     encrypted message contains a bogus key ID.
+
+
+\1f
+File: gnupg1.info,  Node: GPG Input and Output,  Next: OpenPGP Options,  Prev: GPG Key related Options,  Up: GPG Options
+
+1.2.3 Input and Output
+----------------------
+
+`--armor'
+`-a'
+     Create ASCII armored output.  The default is to create the binary
+     OpenPGP format.
+
+`--no-armor'
+     Assume the input data is not in ASCII armored format.
+
+`--output FILE'
+`-o FILE'
+     Write output to FILE.
+
+`--max-output `n''
+     This option sets a limit on the number of bytes that will be
+     generated when processing a file. Since OpenPGP supports various
+     levels of compression, it is possible that the plaintext of a
+     given message may be significantly larger than the original
+     OpenPGP message. While GnuPG works properly with such messages,
+     there is often a desire to set a maximum file size that will be
+     generated before processing is forced to stop by the OS limits.
+     Defaults to 0, which means "no limit".
+
+`--import-options `parameters''
+     This is a space or comma delimited string that gives options for
+     importing keys. Options can be prepended with a `no-' to give the
+     opposite meaning. The options are:
+
+    import-local-sigs
+          Allow importing key signatures marked as "local". This is not
+          generally useful unless a shared keyring scheme is being used.
+          Defaults to no.
+
+    repair-pks-subkey-bug
+          During import, attempt to repair the damage caused by the PKS
+          keyserver bug (pre version 0.9.6) that mangles keys with
+          multiple subkeys. Note that this cannot completely repair the
+          damaged key as some crucial data is removed by the keyserver,
+          but it does at least give you back one subkey. Defaults to no
+          for regular `--import' and to yes for keyserver `--recv-keys'.
+
+    merge-only
+          During import, allow key updates to existing keys, but do not
+          allow any new keys to be imported. Defaults to no.
+
+    import-clean
+          After import, compact (remove all signatures except the
+          self-signature) any user IDs from the new key that are not
+          usable.  Then, remove any signatures from the new key that
+          are not usable.  This includes signatures that were issued by
+          keys that are not present on the keyring. This option is the
+          same as running the `--edit-key' command "clean" after
+          import. Defaults to no.
+
+    import-minimal
+          Import the smallest key possible. This removes all signatures
+          except the most recent self-signature on each user ID. This
+          option is the same as running the `--edit-key' command
+          "minimize" after import.  Defaults to no.
+
+`--export-options `parameters''
+     This is a space or comma delimited string that gives options for
+     exporting keys. Options can be prepended with a `no-' to give the
+     opposite meaning. The options are:
+
+    export-local-sigs
+          Allow exporting key signatures marked as "local". This is not
+          generally useful unless a shared keyring scheme is being used.
+          Defaults to no.
+
+    export-attributes
+          Include attribute user IDs (photo IDs) while exporting. This
+          is useful to export keys if they are going to be used by an
+          OpenPGP program that does not accept attribute user IDs.
+          Defaults to yes.
+
+    export-sensitive-revkeys
+          Include designated revoker information that was marked as
+          "sensitive". Defaults to no.
+
+    export-reset-subkey-passwd
+          When using the `--export-secret-subkeys' command, this option
+          resets the passphrases for all exported subkeys to empty.
+          This is useful when the exported subkey is to be used on an
+          unattended machine where a passphrase doesn't necessarily
+          make sense. Defaults to no.
+
+    export-clean
+          Compact (remove all signatures from) user IDs on the key being
+          exported if the user IDs are not usable. Also, do not export
+          any signatures that are not usable. This includes signatures
+          that were issued by keys that are not present on the keyring.
+          This option is the same as running the `--edit-key' command
+          "clean" before export except that the local copy of the key
+          is not modified. Defaults to no.
+
+    export-minimal
+          Export the smallest key possible. This removes all signatures
+          except the most recent self-signature on each user ID. This
+          option is the same as running the `--edit-key' command
+          "minimize" before export except that the local copy of the
+          key is not modified. Defaults to no.
+
+`--with-colons'
+     Print key listings delimited by colons. Note that the output will
+     be encoded in UTF-8 regardless of any `--display-charset' setting.
+     This format is useful when GnuPG is called from scripts and other
+     programs as it is easily machine parsed. The details of this
+     format are documented in the file `doc/DETAILS', which is included
+     in the GnuPG source distribution.
+
+`--fixed-list-mode'
+     Do not merge primary user ID and primary key in `--with-colon'
+     listing mode and print all timestamps as seconds since 1970-01-01.
+
+`--with-fingerprint'
+     Same as the command `--fingerprint' but changes only the format of
+     the output and may be used together with another command.
+
+
+\1f
+File: gnupg1.info,  Node: OpenPGP Options,  Next: GPG Esoteric Options,  Prev: GPG Input and Output,  Up: GPG Options
+
+1.2.4 OpenPGP protocol specific options.
+----------------------------------------
+
+`-t, --textmode'
+`--no-textmode'
+     Treat input files as text and store them in the OpenPGP canonical
+     text form with standard "CRLF" line endings. This also sets the
+     necessary flags to inform the recipient that the encrypted or
+     signed data is text and may need its line endings converted back
+     to whatever the local system uses. This option is useful when
+     communicating between two platforms that have different line
+     ending conventions (UNIX-like to Mac, Mac to Windows, etc).
+     `--no-textmode' disables this option, and is the default.
+
+     If `-t' (but not `--textmode') is used together with armoring and
+     signing, this enables clearsigned messages. This kludge is needed
+     for command-line compatibility with command-line versions of PGP;
+     normally you would use `--sign' or `--clearsign' to select the
+     type of the signature.
+
+`--force-v3-sigs'
+`--no-force-v3-sigs'
+     OpenPGP states that an implementation should generate v4 signatures
+     but PGP versions 5 through 7 only recognize v4 signatures on key
+     material. This option forces v3 signatures for signatures on data.
+     Note that this option overrides `--ask-sig-expire', as v3
+     signatures cannot have expiration dates. `--no-force-v3-sigs'
+     disables this option.
+
+`--force-v4-certs'
+`--no-force-v4-certs'
+     Always use v4 key signatures even on v3 keys. This option also
+     changes the default hash algorithm for v3 RSA keys from MD5 to
+     SHA-1.  `--no-force-v4-certs' disables this option.
+
+`--force-mdc'
+     Force the use of encryption with a modification detection code.
+     This is always used with the newer ciphers (those with a blocksize
+     greater than 64 bits), or if all of the recipient keys indicate
+     MDC support in their feature flags.
+
+`--disable-mdc'
+     Disable the use of the modification detection code. Note that by
+     using this option, the encrypted message becomes vulnerable to a
+     message modification attack.
+
+`--personal-cipher-preferences `string''
+     Set the list of personal cipher preferences to `string', this list
+     should be a string similar to the one printed by the command
+     "pref" in the edit menu. This allows the user to factor in their
+     own preferred algorithms when algorithms are chosen via recipient
+     key preferences.  The most highly ranked cipher in this list is
+     also used for the `--symmetric' encryption command.
+
+`--personal-digest-preferences `string''
+     Set the list of personal digest preferences to `string', this list
+     should be a string similar to the one printed by the command
+     "pref" in the edit menu. This allows the user to factor in their
+     own preferred algorithms when algorithms are chosen via recipient
+     key preferences.  The most highly ranked digest algorithm in this
+     list is algo used when signing without encryption (e.g.
+     `--clearsign' or `--sign'). The default value is SHA-1.
+
+`--personal-compress-preferences `string''
+     Set the list of personal compression preferences to `string', this
+     list should be a string similar to the one printed by the command
+     "pref" in the edit menu. This allows the user to factor in their
+     own preferred algorithms when algorithms are chosen via recipient
+     key preferences. The most highly ranked algorithm in this list is
+     also used when there are no recipient keys to consider (e.g.
+     `--symmetric').
+
+`--s2k-cipher-algo `name''
+     Use `name' as the cipher algorithm used to protect secret keys.
+     The default cipher is CAST5. This cipher is also used for
+     conventional encryption if `--personal-cipher-preferences' and
+     `--cipher-algo' is not given.
+
+`--s2k-digest-algo `name''
+     Use `name' as the digest algorithm used to mangle the passphrases.
+     The default algorithm is SHA-1.
+
+`--s2k-mode `n''
+     Selects how passphrases are mangled. If `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 `--rfc1991' is
+     used, this mode is also used for conventional encryption.
+
+`--s2k-count `n''
+     Specify how many times the passphrase mangling is repeated.  This
+     value may range between 1024 and 65011712 inclusive, and the
+     default is 65536.  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 `--s2k-mode' is 3.
+
+
+1.2.5 Compliance options
+------------------------
+
+These options control what GnuPG is compliant to. Only one of these
+options may be active at a time. Note that the default setting of this
+is nearly always the correct one. See the INTEROPERABILITY WITH OTHER
+OPENPGP PROGRAMS section below before using one of these options.
+
+`--gnupg'
+     Use standard GnuPG behavior. This is essentially OpenPGP behavior
+     (see `--openpgp'), but with some additional workarounds for common
+     compatibility problems in different versions of PGP. This is the
+     default option, so it is not generally needed, but it may be
+     useful to override a different compliance option in the gpg.conf
+     file.
+
+`--openpgp'
+     Reset all packet, cipher and digest options to strict OpenPGP
+     behavior. Use this option to reset all previous options like
+     `--rfc1991', `--force-v3-sigs', `--s2k-*', `--cipher-algo',
+     `--digest-algo' and `--compress-algo' to OpenPGP compliant values.
+     All PGP workarounds are disabled.
+
+`--rfc2440'
+     Reset all packet, cipher and digest options to strict RFC-2440
+     behavior. Note that this is currently the same thing as
+     `--openpgp'.
+
+`--rfc1991'
+     Try to be more RFC-1991 (PGP 2.x) compliant.
+
+`--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 `--rfc1991 --disable-mdc --no-force-v4-certs
+     --no-sk-comment --escape-from-lines --force-v3-sigs
+     --no-ask-sig-expire --no-ask-cert-expire --cipher-algo IDEA
+     --digest-algo MD5 --compress-algo 1'. It also disables
+     `--textmode' when encrypting.
+
+`--pgp6'
+     Set up all options to be as PGP 6 compliant as possible. This
+     restricts you to the ciphers IDEA (if the IDEA plugin is
+     installed), 3DES, and CAST5, the hashes MD5, SHA1 and RIPEMD160,
+     and the compression algorithms none and ZIP. This also disables
+     -throw-keyids, and making signatures with signing subkeys as PGP 6
+     does not understand signatures made by signing subkeys.
+
+     This option implies `--disable-mdc --no-sk-comment
+     --escape-from-lines --force-v3-sigs --no-ask-sig-expire'.
+
+`--pgp7'
+     Set up all options to be as PGP 7 compliant as possible. This is
+     identical to `--pgp6' except that MDCs are not disabled, and the
+     list of allowable ciphers is expanded to add AES128, AES192,
+     AES256, and TWOFISH.
+
+`--pgp8'
+     Set up all options to be as PGP 8 compliant as possible. PGP 8 is
+     a lot closer to the OpenPGP standard than previous versions of
+     PGP, so all this does is disable `--throw-keyids' and set
+     `--escape-from-lines'.  All algorithms are allowed except for the
+     SHA224, SHA384, and SHA512 digests.
+
+
+\1f
+File: gnupg1.info,  Node: GPG Esoteric Options,  Prev: OpenPGP Options,  Up: GPG Options
+
+1.2.6 Doing things one usually don't want to do.
+------------------------------------------------
+
+`-n'
+`--dry-run'
+     Don't make any changes (this is not completely implemented).
+
+`--list-only'
+     Changes the behaviour of some commands. This is like `--dry-run'
+     but different in some cases. The semantic of this command may be
+     extended in the future. Currently it only skips the actual
+     decryption pass and therefore enables a fast listing of the
+     encryption keys.
+
+`-i'
+`--interactive'
+     Prompt before overwriting any files.
+
+`--debug FLAGS'
+     Set debugging flags. All flags are or-ed and FLAGS may be given in
+     C syntax (e.g. 0x0042).
+
+`--debug-all'
+     Set all useful debugging flags.
+
+`--debug-ccid-driver'
+     Enable debug output from the included CCID driver for smartcards.
+     Note that this option is only available on some system.
+
+`--enable-progress-filter'
+     Enable certain PROGRESS status outputs. This option allows
+     frontends to display a progress indicator while gpg is processing
+     larger files.  There is a slight performance overhead using it.
+
+`--status-fd `n''
+     Write special status strings to the file descriptor `n'.  See the
+     file DETAILS in the documentation for a listing of them.
+
+`--status-file `file''
+     Same as `--status-fd', except the status data is written to file
+     `file'.
+
+`--logger-fd `n''
+     Write log output to file descriptor `n' and not to stderr.
+
+`--logger-file `file''
+     Same as `--logger-fd', except the logger data is written to file
+     `file'.
+
+`--attribute-fd `n''
+     Write attribute subpackets to the file descriptor `n'. This is most
+     useful for use with `--status-fd', since the status messages are
+     needed to separate out the various subpackets from the stream
+     delivered to the file descriptor.
+
+`--attribute-file `file''
+     Same as `--attribute-fd', except the attribute data is written to
+     file `file'.
+
+`--comment `string''
+`--no-comments'
+     Use `string' as a comment string in clear text signatures and ASCII
+     armored messages or keys (see `--armor'). The default behavior is
+     not to use a comment string. `--comment' may be repeated multiple
+     times to get multiple comment strings. `--no-comments' removes all
+     comments.  It is a good idea to keep the length of a single comment
+     below 60 characters to avoid problems with mail programs wrapping
+     such lines.  Note that comment lines, like all other header lines,
+     are not protected by the signature.
+
+`--emit-version'
+`--no-emit-version'
+     Force inclusion of the version string in ASCII armored output.
+     `--no-emit-version' disables this option.
+
+`--sig-notation `name=value''
+`--cert-notation `name=value''
+`-N, --set-notation `name=value''
+     Put the name value pair into the signature as notation data.
+     `name' must consist only of printable characters or spaces, and
+     must contain a '@' character in the form keyname@domain.example.com
+     (substituting the appropriate keyname and domain name, of course).
+     This is to help prevent pollution of the IETF reserved notation
+     namespace. The `--expert' flag overrides the '@' check. `value'
+     may be any printable string; it will be encoded in UTF8, so you
+     should check that your `--display-charset' is set correctly. If
+     you prefix `name' with an exclamation mark (!), the notation data
+     will be flagged as critical (rfc2440:5.2.3.15). `--sig-notation'
+     sets a notation for data signatures. `--cert-notation' sets a
+     notation for key signatures (certifications). `--set-notation'
+     sets both.
+
+     There are special codes that may be used in notation names. "%k"
+     will be expanded into the key ID of the key being signed, "%K"
+     into the long key ID of the key being signed, "%f" into the
+     fingerprint of the key being signed, "%s" into the key ID of the
+     key making the signature, "%S" into the long key ID of the key
+     making the signature, "%g" into the fingerprint of the key making
+     the signature (which might be a subkey), "%p" into the fingerprint
+     of the primary key of the key making the signature, "%c" into the
+     signature count from the OpenPGP smartcard, and "%%" results in a
+     single "%". %k, %K, and %f are only meaningful when making a key
+     signature (certification), and %c is only meaningful when using
+     the OpenPGP smartcard.
+
+`--sig-policy-url `string''
+`--cert-policy-url `string''
+`--set-policy-url `string''
+     Use `string' as a Policy URL for signatures (rfc2440:5.2.3.19).  If
+     you prefix it with an exclamation mark (!), the policy URL packet
+     will be flagged as critical. `--sig-policy-url' sets a policy url
+     for data signatures. `--cert-policy-url' sets a policy url for key
+     signatures (certifications). `--set-policy-url' sets both.
+
+     The same %-expandos used for notation data are available here as
+     well.
+
+`--sig-keyserver-url `string''
+     Use `string' as a preferred keyserver URL for data signatures. If
+     you prefix it with an exclamation mark, the keyserver URL packet
+     will be flagged as critical.
+
+     The same %-expandos used for notation data are available here as
+     well.
+
+`--set-filename `string''
+     Use `string' as the filename which is stored inside messages.
+     This overrides the default, which is to use the actual filename of
+     the file being encrypted.
+
+`--for-your-eyes-only'
+`--no-for-your-eyes-only'
+     Set the `for your eyes only' flag in the message. This causes GnuPG
+     to refuse to save the file unless the `--output' option is given,
+     and PGP to use the "secure viewer" with a Tempest-resistant font to
+     display the message. This option overrides `--set-filename'.
+     `--no-for-your-eyes-only' disables this option.
+
+`--use-embedded-filename'
+`--no-use-embedded-filename'
+     Try to create a file with a name as embedded in the data. This can
+     be a dangerous option as it allows to overwrite files. Defaults to
+     no.
+
+`--cipher-algo `name''
+     Use `name' as cipher algorithm. Running the program with the
+     command `--version' yields a list of supported algorithms. If this
+     is not used the cipher algorithm is selected from the preferences
+     stored with the key. In general, you do not want to use this
+     option as it allows you to violate the OpenPGP standard.
+     `--personal-cipher-preferences' is the safe way to accomplish the
+     same thing.
+
+`--digest-algo `name''
+     Use `name' as the message digest algorithm. Running the program
+     with the command `--version' yields a list of supported
+     algorithms. In general, you do not want to use this option as it
+     allows you to violate the OpenPGP standard.
+     `--personal-digest-preferences' is the safe way to accomplish the
+     same thing.
+
+`--compress-algo `name''
+     Use compression algorithm `name'. "zlib" is RFC-1950 ZLIB
+     compression. "zip" is RFC-1951 ZIP compression which is used by
+     PGP.  "bzip2" is a more modern compression scheme that can
+     compress some things better than zip or zlib, but at the cost of
+     more memory used during compression and decompression.
+     "uncompressed" or "none" disables compression. If this option is
+     not used, the default behavior is to examine the recipient key
+     preferences to see which algorithms the recipient supports. If all
+     else fails, ZIP is used for maximum compatibility.
+
+     ZLIB may give better compression results than ZIP, as the
+     compression window size is not limited to 8k. BZIP2 may give even
+     better compression results than that, but will use a significantly
+     larger amount of memory while compressing and decompressing. This
+     may be significant in low memory situations. Note, however, that
+     PGP (all versions) only supports ZIP compression. Using any
+     algorithm other than ZIP or "none" will make the message
+     unreadable with PGP. In general, you do not want to use this
+     option as it allows you to violate the OpenPGP standard.
+     `--personal-compress-preferences' is the safe way to accomplish
+     the same thing.
+
+`--cert-digest-algo `name''
+     Use `name' as the message digest algorithm used when signing a
+     key. Running the program with the command `--version' yields a
+     list of supported algorithms. Be aware that if you choose an
+     algorithm that GnuPG supports but other OpenPGP implementations do
+     not, then some users will not be able to use the key signatures
+     you make, or quite possibly your entire key.
+
+`--disable-cipher-algo `name''
+     Never allow the use of `name' as cipher algorithm.  The given name
+     will not be checked so that a later loaded algorithm will still
+     get disabled.
+
+`--disable-pubkey-algo `name''
+     Never allow the use of `name' as public key algorithm.  The given
+     name will not be checked so that a later loaded algorithm will
+     still get disabled.
+
+`--throw-keyids'
+`--no-throw-keyids'
+     Do not put the recipient key IDs into encrypted messages. This
+     helps to hide the receivers of the message and is a limited
+     countermeasure against traffic analysis. On the receiving side, it
+     may slow down the decryption process because all available secret
+     keys must be tried.  `--no-throw-keyids' disables this option.
+     This option is essentially the same as using `--hidden-recipient'
+     for all recipients.
+
+`--not-dash-escaped'
+     This option changes the behavior of cleartext signatures so that
+     they can be used for patch files. You should not send such an
+     armored file via email because all spaces and line endings are
+     hashed too. You can not use this option for data which has 5
+     dashes at the beginning of a line, patch files don't have this. A
+     special armor header line tells GnuPG about this cleartext
+     signature option.
+
+`--escape-from-lines'
+`--no-escape-from-lines'
+     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 to prevent the mail system from breaking the
+     signature. Note that all other PGP versions do it this way too.
+     Enabled by default. `--no-escape-from-lines' disables this option.
+
+`--passphrase-repeat `n''
+     Specify how many times `gpg' will request a new passphrase be
+     repeated.  This is useful for helping memorize a passphrase.
+     Defaults to 1 repetition.
+
+`--passphrase-fd `n''
+     Read the passphrase from file descriptor `n'. Only the first line
+     will be read from file descriptor `n'. If you use 0 for `n', the
+     passphrase will be read from stdin. This can only be used if only
+     one passphrase is supplied.
+
+`--passphrase-file `file''
+     Read the passphrase from file `file'. Only the first line will be
+     read from file `file'. This can only be used if only one
+     passphrase is supplied. Obviously, a passphrase stored in a file is
+     of questionable security if other users can read this file. Don't
+     use this option if you can avoid it.
+
+`--passphrase `string''
+     Use `string' as the passphrase. This can only be used if only one
+     passphrase is supplied. Obviously, this is of very questionable
+     security on a multi-user system. Don't use this option if you can
+     avoid it.
+
+`--command-fd `n''
+     This is a replacement for the deprecated shared-memory IPC mode.
+     If this option is enabled, user input on questions is not expected
+     from the TTY but from the given file descriptor. It should be used
+     together with `--status-fd'. See the file doc/DETAILS in the source
+     distribution for details on how to use it.
+
+`--command-file `file''
+     Same as `--command-fd', except the commands are read out of file
+     `file'
+
+`--allow-non-selfsigned-uid'
+`--no-allow-non-selfsigned-uid'
+     Allow the import and use of keys with user IDs which are not
+     self-signed. This is not recommended, as a non self-signed user ID
+     is trivial to forge. `--no-allow-non-selfsigned-uid' disables.
+
+`--allow-freeform-uid'
+     Disable all checks on the form of the user ID while generating a
+     new one. This option should only be used in very special
+     environments as it does not ensure the de-facto standard format of
+     user IDs.
+
+`--ignore-time-conflict'
+     GnuPG normally checks that the timestamps associated with keys and
+     signatures have plausible values. However, sometimes a signature
+     seems to be older than the key due to clock problems. This option
+     makes these checks just a warning. See also `--ignore-valid-from'
+     for timestamp issues on subkeys.
+
+`--ignore-valid-from'
+     GnuPG normally does not select and use subkeys created in the
+     future.  This option allows the use of such keys and thus exhibits
+     the pre-1.0.7 behaviour. You should not use this option unless you
+     there is some clock problem. See also `--ignore-time-conflict' for
+     timestamp issues with signatures.
+
+`--ignore-crc-error'
+     The ASCII armor used by OpenPGP is protected by a CRC checksum
+     against transmission errors. Occasionally the CRC gets mangled
+     somewhere on the transmission channel but the actual content
+     (which is protected by the OpenPGP protocol anyway) is still okay.
+     This option allows GnuPG to ignore CRC errors.
+
+`--ignore-mdc-error'
+     This option changes a MDC integrity protection failure into a
+     warning.  This can be useful if a message is partially corrupt,
+     but it is necessary to get as much data as possible out of the
+     corrupt message.  However, be aware that a MDC protection failure
+     may also mean that the message was tampered with intentionally by
+     an attacker.
+
+`--no-default-keyring'
+     Do not add the default keyrings to the list of keyrings. Note that
+     GnuPG will not operate without any keyrings, so if you use this
+     option and do not provide alternate keyrings via `--keyring' or
+     `--secret-keyring', then GnuPG will still use the default public or
+     secret keyrings.
+
+`--skip-verify'
+     Skip the signature verification step. This may be used to make the
+     decryption faster if the signature verification is not needed.
+
+`--with-key-data'
+     Print key listings delimited by colons (like `--with-colons') and
+     print the public key data.
+
+`--fast-list-mode'
+     Changes the output of the list commands to work faster; this is
+     achieved by leaving some parts empty. Some applications don't need
+     the user ID and the trust information given in the listings. By
+     using this options they can get a faster listing. The exact
+     behaviour of this option may change in future versions.  If you
+     are missing some information, don't use this option.
+
+`--no-literal'
+     This is not for normal use. Use the source to see for what it
+     might be useful.
+
+`--set-filesize'
+     This is not for normal use. Use the source to see for what it
+     might be useful.
+
+`--show-session-key'
+     Display the session key used for one message. See
+     `--override-session-key' for the counterpart of this option.
+
+     We think that Key Escrow is a Bad Thing; however the user should
+     have the freedom to decide whether to go to prison or to reveal
+     the content of one specific message without compromising all
+     messages ever encrypted for one secret key. DON'T USE IT UNLESS
+     YOU ARE REALLY FORCED TO DO SO.
+
+`--override-session-key `string''
+     Don't use the public key but the session key `string'. The format
+     of this string is the same as the one printed by
+     `--show-session-key'. This option is normally not used but comes
+     handy in case someone forces you to reveal the content of an
+     encrypted message; using this option you can do this without
+     handing out the secret key.
+
+`--ask-sig-expire'
+`--no-ask-sig-expire'
+     When making a data signature, prompt for an expiration time. If
+     this option is not specified, the expiration time set via
+     `--default-sig-expire' is used. `--no-ask-sig-expire' disables
+     this option. Note that by default, `--force-v3-sigs' is set which
+     also disables this option. If you want signature expiration, you
+     must set `--no-force-v3-sigs' as well as turning
+     `--ask-sig-expire' on.
+
+`--default-sig-expire'
+     The default expiration time to use for signature expiration. Valid
+     values are "0" for no expiration, a number followed by the letter d
+     (for days), w (for weeks), m (for months), or y (for years) (for
+     example "2m" for two months, or "5y" for five years), or an
+     absolute date in the form YYYY-MM-DD. Defaults to "0".
+
+`--ask-cert-expire'
+`--no-ask-cert-expire'
+     When making a key signature, prompt for an expiration time. If this
+     option is not specified, the expiration time set via
+     `--default-cert-expire' is used. `--no-ask-cert-expire' disables
+     this option.
+
+`--default-cert-expire'
+     The default expiration time to use for key signature expiration.
+     Valid values are "0" for no expiration, a number followed by the
+     letter d (for days), w (for weeks), m (for months), or y (for
+     years) (for example "2m" for two months, or "5y" for five years),
+     or an absolute date in the form YYYY-MM-DD. Defaults to "0".
+
+`--allow-secret-key-import'
+     This is an obsolete option and is not used anywhere.
+
+`--allow-multisig-verification'
+     Allow verification of concatenated signed messages. This will run a
+     signature verification for each data+signature block. There are
+     some security issues with this option and thus it is off by
+     default. Note that versions of GPG prior to version 1.4.3
+     implicitly allowed this.
+
+`--enable-special-filenames'
+     This options enables a mode in which filenames of the form `-&n',
+     where n is a non-negative decimal number, refer to the file
+     descriptor n and not to a file with that name.
+
+`--no-expensive-trust-checks'
+     Experimental use only.
+
+`--preserve-permissions'
+     Don't change the permissions of a secret keyring back to user
+     read/write only. Use this option only if you really know what you
+     are doing.
+
+`--default-preference-list `string''
+     Set the list of default preferences to `string'. This preference
+     list is used for new keys and becomes the default for "setpref" in
+     the edit menu.
+
+`--default-keyserver-url `name''
+     Set the default keyserver URL to `name'. This keyserver will be
+     used as the keyserver URL when writing a new self-signature on a
+     key, which includes key generation and changing preferences.
+
+`--list-config'
+     Display various internal configuration parameters of GnuPG. This
+     option is intended for external programs that call GnuPG to
+     perform tasks, and is thus not generally useful. See the file
+     `doc/DETAILS' in the source distribution for the details of which
+     configuration items may be listed. `--list-config' is only usable
+     with `--with-colons' set.
+
+`--gpgconf-list'
+     This command is simliar to `--list-config' but in general only
+     internally used by the `gpgconf' tool.
+
+`--gpgconf-test'
+     This is more or less dummy action.  However it parses the
+     configuration file and returns with failure if the configuraion
+     file would prevent `gpg' from startup.  Thus it may be used to run
+     a syntax check on the configuration file.
+
+
+1.2.7 Deprecated options
+------------------------
+
+`--load-extension `name''
+     Load an extension module. If `name' does not contain a slash it is
+     searched for in the directory configured when GnuPG was built
+     (generally "/usr/local/lib/gnupg"). Extensions are not generally
+     useful anymore, and the use of this option is deprecated.
+
+`--show-photos'
+`--no-show-photos'
+     Causes `--list-keys', `--list-sigs', `--list-public-keys',
+     `--list-secret-keys', and verifying a signature to also display
+     the photo ID attached to the key, if any. See also
+     `--photo-viewer'. These options are deprecated. Use
+     `--list-options [no-]show-photos' and/or `--verify-options
+     [no-]show-photos' instead.
+
+`--show-keyring'
+     Display the keyring name at the head of key listings to show which
+     keyring a given key resides on. This option is deprecated: use
+     `--list-options [no-]show-keyring' instead.
+
+`--ctapi-driver `file''
+     Use `file' to access the smartcard reader. The current default is
+     `libtowitoko.so'. Note that the use of this interface is
+     deprecated; it may be removed in future releases.
+
+`--always-trust'
+     Identical to `--trust-model always'. This option is deprecated.
+
+`--show-notation'
+`--no-show-notation'
+     Show signature notations in the `--list-sigs' or `--check-sigs'
+     listings as well as when verifying a signature with a notation in
+     it. These options are deprecated. Use `--list-options
+     [no-]show-notation' and/or `--verify-options [no-]show-notation'
+     instead.
+
+`--show-policy-url'
+`--no-show-policy-url'
+     Show policy URLs in the `--list-sigs' or `--check-sigs' listings
+     as well as when verifying a signature with a policy URL in it.
+     These options are deprecated. Use `--list-options
+     [no-]show-policy-url' and/or `--verify-options
+     [no-]show-policy-url' instead.
+
+
+\1f
+File: gnupg1.info,  Node: GPG Configuration,  Next: GPG Examples,  Prev: GPG Options,  Up: Invoking GPG
+
+1.3 Configuration files
+=======================
+
+There are a few configuration files to control certain aspects of
+`gpg''s operation. Unless noted, they are expected in the current home
+directory (*note option --homedir::).
+
+`gpg.conf'
+     This is the standard configuration file read by `gpg' on startup.
+     It may contain any valid long option; the leading two dashes may
+     not be entered and the option may not be abbreviated.  This default
+     name may be changed on the command line (*note option --options::).
+
+
+   Note that on larger installations, it is useful to put predefined
+files into the directory `/etc/skel/.gnupg/' so that newly created users
+start up with a working configuration.
+
+   For internal purposes `gpg' creates and maintaines a few other
+files; They all live in in the current home directory (*note option
+--homedir::).  Only the `gpg' may modify these files.
+
+`~/.gnupg/secring.gpg'
+     The secret keyring.
+
+`~/.gnupg/secring.gpg.lock'
+     and the lock file
+
+`~/.gnupg/pubring.gpg'
+     The public keyring
+
+`~/.gnupg/pubring.gpg.lock'
+     and the lock file
+
+`~/.gnupg/trustdb.gpg'
+     The trust database
+
+`~/.gnupg/trustdb.gpg.lock'
+     and the lock file
+
+`~/.gnupg/random_seed'
+     used to preserve the internal random pool
+
+`/usr[/local]/share/gnupg/options.skel'
+     Skeleton options file
+
+`/usr[/local]/lib/gnupg/'
+     Default location for extensions
+
+
+   Operation is further controlled by a few environment variables:
+
+HOME
+     Used to locate the default home directory.
+
+GNUPGHOME
+     If set directory used instead of "~/.gnupg".
+
+GPG_AGENT_INFO
+     Used to locate the gpg-agent.  This is only honored when
+     `--use-agent' is set.  The value consists of 3 colon delimited
+     fields: The first is the path to the Unix Domain Socket, the
+     second the PID of the gpg-agent and the protocol version which
+     should be set to 1. When starting the gpg-agent as described in
+     its documentation, this variable is set to the correct value. The
+     option `--gpg-agent-info' can be used to override it.
+
+COLUMNS
+LINES
+     Used to size some displays to the full size of the screen.
+
+
+\1f
+File: gnupg1.info,  Node: GPG Examples,  Prev: GPG Configuration,  Up: Invoking GPG
+
+1.4 Examples
+============
+
+gpg -se -r `Bob' `file'
+     sign and encrypt for user Bob
+
+gpg -clearsign `file'
+     make a clear text signature
+
+gpg -sb `file'
+     make a detached signature
+
+gpg -list-keys `user_ID'
+     show keys
+
+gpg -fingerprint `user_ID'
+     show fingerprint
+
+gpg -verify `pgpfile'
+gpg -verify `sigfile'
+     Verify the signature of the file but do not output the data. The
+     second form is used for detached signatures, where `sigfile' is
+     the detached signature (either ASCII armored or binary) and are
+     the signed data; if this is not given, the name of the file
+     holding the signed data is constructed by cutting off the
+     extension (".asc" or ".sig") of `sigfile' or by asking the user
+     for the filename.
+
+RETURN VALUE
+************
+
+The program returns 0 if everything was fine, 1 if at least a signature
+was bad, and other error codes for fatal errors.
+
+WARNINGS
+********
+
+Use a *good* password for your user account and a *good* passphrase to
+protect your secret key. This passphrase is the weakest part of the
+whole system. Programs to do dictionary attacks on your secret keyring
+are very easy to write and so you should protect your "~/.gnupg/"
+directory very well.
+
+   Keep in mind that, if this program is used over a network (telnet),
+it is *very* easy to spy out your passphrase!
+
+   If you are going to verify detached signatures, make sure that the
+program knows about it; either give both filenames on the command line
+or use `-' to specify stdin.
+
+INTEROPERABILITY WITH OTHER OPENPGP PROGRAMS
+********************************************
+
+GnuPG tries to be a very flexible implementation of the OpenPGP
+standard. In particular, GnuPG implements many of the optional parts of
+the standard, such as the SHA-512 hash, and the ZLIB and BZIP2
+compression algorithms. It is important to be aware that not all
+OpenPGP programs implement these optional algorithms and that by
+forcing their use via the `--cipher-algo', `--digest-algo',
+`--cert-digest-algo', or `--compress-algo' options in GnuPG, it is
+possible to create a perfectly valid OpenPGP message, but one that
+cannot be read by the intended recipient.
+
+   There are dozens of variations of OpenPGP programs available, and
+each supports a slightly different subset of these optional algorithms.
+For example, until recently, no (unhacked) version of PGP supported the
+BLOWFISH cipher algorithm. A message using BLOWFISH simply could not be
+read by a PGP user. By default, GnuPG uses the standard OpenPGP
+preferences system that will always do the right thing and create
+messages that are usable by all recipients, regardless of which OpenPGP
+program they use. Only override this safe default if you really know
+what you are doing.
+
+   If you absolutely must override the safe default, or if the
+preferences on a given key are invalid for some reason, you are far
+better off using the `--pgp6', `--pgp7', or `--pgp8' options. These
+options are safe as they do not force any particular algorithms in
+violation of OpenPGP, but rather reduce the available algorithms to a
+"PGP-safe" list.
+
+BUGS
+****
+
+On many systems this program should be installed as setuid(root). This
+is necessary to lock memory pages. Locking memory pages prevents the
+operating system from writing memory pages (which may contain
+passphrases or other sensitive material) to disk. If you get no warning
+message about insecure memory your operating system supports locking
+without being root. The program drops root privileges as soon as locked
+memory is allocated.
+
+\1f
+File: gnupg1.info,  Node: Specify a User ID,  Next: Copying,  Prev: Invoking GPG,  Up: Top
+
+2 How to Specify a User Id
+**************************
+
+There are different ways to specify a user ID to GnuPG.  Some of them
+are only valid for `gpg' others are only good for `gpgsm'.  Here is the
+entire list of ways to specify a key:
+
+   * By key Id.  This format is deduced from the length of the string
+     and its content or `0x' prefix. The key Id of an X.509 certificate
+     are the low 64 bits of its SHA-1 fingerprint.  The use of key Ids
+     is just a shortcut, for all automated processing the fingerprint
+     should be used.
+
+     When using `gpg' an exclamation mark may be appended to force
+     using the specified primary or secondary key and not to try and
+     calculate which primary or secondary key to use.
+
+     The last four lines of the example give the key ID in their long
+     form as internally used by the OpenPGP protocol. You can see the
+     long key ID using the option `--with-colons'.
+
+          234567C4
+          0F34E556E
+          01347A56A
+          0xAB123456
+
+          234AABBCC34567C4
+          0F323456784E56EAB
+          01AB3FED1347A5612
+          0x234AABBCC34567C4
+
+   * By fingerprint.  This format is deduced from the length of the
+     string and its content or the `0x' prefix.  Note, that only the 20
+     byte version fingerprint is available with `gpgsm' (i.e. the SHA-1
+     hash of the certificate).
+
+     When using `gpg' an exclamation mark may be appended to force
+     using the specified primary or secondary key and not to try and
+     calculate which primary or secondary key to use.
+
+     The best way to specify a key Id is by using the fingerprint.  This
+     avoids any ambiguities in case that there are duplicated key IDs.
+
+          1234343434343434C434343434343434
+          123434343434343C3434343434343734349A3434
+          0E12343434343434343434EAB3484343434343434
+          0xE12343434343434343434EAB3484343434343434
+
+     (`gpgsm' also accepts colons between each pair of hexadecimal
+     digits because this is the de-facto standard on how to present
+     X.509 fingerprints.)
+
+   * By exact match on OpenPGP user ID.  This is denoted by a leading
+     equal sign. It does not make sense for X.509 certificates.
+
+          =Heinrich Heine <heinrichh@uni-duesseldorf.de>
+
+   * By exact match on an email address.  This is indicated by
+     enclosing the email address in the usual way with left and right
+     angles.
+
+          <heinrichh@uni-duesseldorf.de>
+
+   * By word match.  All words must match exactly (not case sensitive)
+     but can appear in any order in the user ID or a subjects name.
+     Words are any sequences of letters, digits, the underscore and all
+     characters with bit 7 set.
+
+          +Heinrich Heine duesseldorf
+
+   * By exact match on the subject's DN.  This is indicated by a
+     leading slash, directly followed by the RFC-2253 encoded DN of the
+     subject.  Note that you can't use the string printed by "gpgsm
+     -list-keys" because that one as been reordered and modified for
+     better readability; use -with-colons to print the raw (but standard
+     escaped) RFC-2253 string
+
+          /CN=Heinrich Heine,O=Poets,L=Paris,C=FR
+
+   * By exact match on the issuer's DN.  This is indicated by a leading
+     hash mark, directly followed by a slash and then directly followed
+     by the rfc2253 encoded DN of the issuer.  This should return the
+     Root cert of the issuer.  See note above.
+
+          #/CN=Root Cert,O=Poets,L=Paris,C=FR
+
+   * By exact match on serial number and issuer's DN.  This is
+     indicated by a hash mark, followed by the hexadecmal
+     representation of the serial number, the followed by a slash and
+     the RFC-2253 encoded DN of the issuer. See note above.
+
+          #4F03/CN=Root Cert,O=Poets,L=Paris,C=FR
+
+   * By keygrip This is indicated by an ampersand followed by the 40
+     hex digits of a keygrip.  `gpgsm' prints the keygrip when using
+     the command `--dump-cert'.  It does not yet work for OpenPGP keys.
+
+          &D75F22C3F86E355877348498CDC92BD21010A480
+
+   * By substring match.  This is the default mode but applications may
+     want to explicitly indicate this by putting the asterisk in front.
+     Match is not case sensitive.
+
+          Heine
+          *Heine
+
+
+   Please note that we have reused the hash mark identifier which was
+used in old GnuPG versions to indicate the so called local-id.  It is
+not anymore used and there should be no conflict when used with X.509
+stuff.
+
+   Using the RFC-2253 format of DNs has the drawback that it is not
+possible to map them back to the original encoding, however we don't
+have to do this because our key database stores this encoding as meta
+data.
+
+\1f
+File: gnupg1.info,  Node: Copying,  Next: Option Index,  Prev: Specify a User ID,  Up: Top
+
+Appendix A GNU GENERAL PUBLIC LICENSE
+*************************************
+
+                         Version 2, June 1991
+
+     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+     Everyone is permitted to copy and distribute verbatim copies
+     of this license document, but changing it is not allowed.
+
+A.0.1 Preamble
+--------------
+
+The licenses for most software are designed to take away your freedom
+to share and change it.  By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+   When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it in
+new free programs; and that you know you can do these things.
+
+   To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+   For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+   We protect your rights with two steps: (1) copyright the software,
+and (2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+   Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+   Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+   The precise terms and conditions for copying, distribution and
+modification follow.
+
+    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+  1. This License applies to any program or other work which contains a
+     notice placed by the copyright holder saying it may be distributed
+     under the terms of this General Public License.  The "Program",
+     below, refers to any such program or work, and a "work based on
+     the Program" means either the Program or any derivative work under
+     copyright law: that is to say, a work containing the Program or a
+     portion of it, either verbatim or with modifications and/or
+     translated into another language.  (Hereinafter, translation is
+     included without limitation in the term "modification".)  Each
+     licensee is addressed as "you".
+
+     Activities other than copying, distribution and modification are
+     not covered by this License; they are outside its scope.  The act
+     of running the Program is not restricted, and the output from the
+     Program is covered only if its contents constitute a work based on
+     the Program (independent of having been made by running the
+     Program).  Whether that is true depends on what the Program does.
+
+  2. You may copy and distribute verbatim copies of the Program's
+     source code as you receive it, in any medium, provided that you
+     conspicuously and appropriately publish on each copy an appropriate
+     copyright notice and disclaimer of warranty; keep intact all the
+     notices that refer to this License and to the absence of any
+     warranty; and give any other recipients of the Program a copy of
+     this License along with the Program.
+
+     You may charge a fee for the physical act of transferring a copy,
+     and you may at your option offer warranty protection in exchange
+     for a fee.
+
+  3. You may modify your copy or copies of the Program or any portion
+     of it, thus forming a work based on the Program, and copy and
+     distribute such modifications or work under the terms of Section 1
+     above, provided that you also meet all of these conditions:
+
+       a. You must cause the modified files to carry prominent notices
+          stating that you changed the files and the date of any change.
+
+       b. You must cause any work that you distribute or publish, that
+          in whole or in part contains or is derived from the Program
+          or any part thereof, to be licensed as a whole at no charge
+          to all third parties under the terms of this License.
+
+       c. If the modified program normally reads commands interactively
+          when run, you must cause it, when started running for such
+          interactive use in the most ordinary way, to print or display
+          an announcement including an appropriate copyright notice and
+          a notice that there is no warranty (or else, saying that you
+          provide a warranty) and that users may redistribute the
+          program under these conditions, and telling the user how to
+          view a copy of this License.  (Exception: if the Program
+          itself is interactive but does not normally print such an
+          announcement, your work based on the Program is not required
+          to print an announcement.)
+
+     These requirements apply to the modified work as a whole.  If
+     identifiable sections of that work are not derived from the
+     Program, and can be reasonably considered independent and separate
+     works in themselves, then this License, and its terms, do not
+     apply to those sections when you distribute them as separate
+     works.  But when you distribute the same sections as part of a
+     whole which is a work based on the Program, the distribution of
+     the whole must be on the terms of this License, whose permissions
+     for other licensees extend to the entire whole, and thus to each
+     and every part regardless of who wrote it.
+
+     Thus, it is not the intent of this section to claim rights or
+     contest your rights to work written entirely by you; rather, the
+     intent is to exercise the right to control the distribution of
+     derivative or collective works based on the Program.
+
+     In addition, mere aggregation of another work not based on the
+     Program with the Program (or with a work based on the Program) on
+     a volume of a storage or distribution medium does not bring the
+     other work under the scope of this License.
+
+  4. You may copy and distribute the Program (or a work based on it,
+     under Section 2) in object code or executable form under the terms
+     of Sections 1 and 2 above provided that you also do one of the
+     following:
+
+       a. Accompany it with the complete corresponding machine-readable
+          source code, which must be distributed under the terms of
+          Sections 1 and 2 above on a medium customarily used for
+          software interchange; or,
+
+       b. Accompany it with a written offer, valid for at least three
+          years, to give any third party, for a charge no more than your
+          cost of physically performing source distribution, a complete
+          machine-readable copy of the corresponding source code, to be
+          distributed under the terms of Sections 1 and 2 above on a
+          medium customarily used for software interchange; or,
+
+       c. Accompany it with the information you received as to the offer
+          to distribute corresponding source code.  (This alternative is
+          allowed only for noncommercial distribution and only if you
+          received the program in object code or executable form with
+          such an offer, in accord with Subsection b above.)
+
+     The source code for a work means the preferred form of the work for
+     making modifications to it.  For an executable work, complete
+     source code means all the source code for all modules it contains,
+     plus any associated interface definition files, plus the scripts
+     used to control compilation and installation of the executable.
+     However, as a special exception, the source code distributed need
+     not include anything that is normally distributed (in either
+     source or binary form) with the major components (compiler,
+     kernel, and so on) of the operating system on which the executable
+     runs, unless that component itself accompanies the executable.
+
+     If distribution of executable or object code is made by offering
+     access to copy from a designated place, then offering equivalent
+     access to copy the source code from the same place counts as
+     distribution of the source code, even though third parties are not
+     compelled to copy the source along with the object code.
+
+  5. You may not copy, modify, sublicense, or distribute the Program
+     except as expressly provided under this License.  Any attempt
+     otherwise to copy, modify, sublicense or distribute the Program is
+     void, and will automatically terminate your rights under this
+     License.  However, parties who have received copies, or rights,
+     from you under this License will not have their licenses
+     terminated so long as such parties remain in full compliance.
+
+  6. You are not required to accept this License, since you have not
+     signed it.  However, nothing else grants you permission to modify
+     or distribute the Program or its derivative works.  These actions
+     are prohibited by law if you do not accept this License.
+     Therefore, by modifying or distributing the Program (or any work
+     based on the Program), you indicate your acceptance of this
+     License to do so, and all its terms and conditions for copying,
+     distributing or modifying the Program or works based on it.
+
+  7. Each time you redistribute the Program (or any work based on the
+     Program), the recipient automatically receives a license from the
+     original licensor to copy, distribute or modify the Program
+     subject to these terms and conditions.  You may not impose any
+     further restrictions on the recipients' exercise of the rights
+     granted herein.  You are not responsible for enforcing compliance
+     by third parties to this License.
+
+  8. If, as a consequence of a court judgment or allegation of patent
+     infringement or for any other reason (not limited to patent
+     issues), conditions are imposed on you (whether by court order,
+     agreement or otherwise) that contradict the conditions of this
+     License, they do not excuse you from the conditions of this
+     License.  If you cannot distribute so as to satisfy simultaneously
+     your obligations under this License and any other pertinent
+     obligations, then as a consequence you may not distribute the
+     Program at all.  For example, if a patent license would not permit
+     royalty-free redistribution of the Program by all those who
+     receive copies directly or indirectly through you, then the only
+     way you could satisfy both it and this License would be to refrain
+     entirely from distribution of the Program.
+
+     If any portion of this section is held invalid or unenforceable
+     under any particular circumstance, the balance of the section is
+     intended to apply and the section as a whole is intended to apply
+     in other circumstances.
+
+     It is not the purpose of this section to induce you to infringe any
+     patents or other property right claims or to contest validity of
+     any such claims; this section has the sole purpose of protecting
+     the integrity of the free software distribution system, which is
+     implemented by public license practices.  Many people have made
+     generous contributions to the wide range of software distributed
+     through that system in reliance on consistent application of that
+     system; it is up to the author/donor to decide if he or she is
+     willing to distribute software through any other system and a
+     licensee cannot impose that choice.
+
+     This section is intended to make thoroughly clear what is believed
+     to be a consequence of the rest of this License.
+
+  9. If the distribution and/or use of the Program is restricted in
+     certain countries either by patents or by copyrighted interfaces,
+     the original copyright holder who places the Program under this
+     License may add an explicit geographical distribution limitation
+     excluding those countries, so that distribution is permitted only
+     in or among countries not thus excluded.  In such case, this
+     License incorporates the limitation as if written in the body of
+     this License.
+
+ 10. The Free Software Foundation may publish revised and/or new
+     versions of the General Public License from time to time.  Such
+     new versions will be similar in spirit to the present version, but
+     may differ in detail to address new problems or concerns.
+
+     Each version is given a distinguishing version number.  If the
+     Program specifies a version number of this License which applies
+     to it and "any later version", you have the option of following
+     the terms and conditions either of that version or of any later
+     version published by the Free Software Foundation.  If the Program
+     does not specify a version number of this License, you may choose
+     any version ever published by the Free Software Foundation.
+
+ 11. If you wish to incorporate parts of the Program into other free
+     programs whose distribution conditions are different, write to the
+     author to ask for permission.  For software which is copyrighted
+     by the Free Software Foundation, write to the Free Software
+     Foundation; we sometimes make exceptions for this.  Our decision
+     will be guided by the two goals of preserving the free status of
+     all derivatives of our free software and of promoting the sharing
+     and reuse of software generally.
+
+                                NO WARRANTY
+ 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
+     WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
+     LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+     HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
+     WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
+     NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+     FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE
+     QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+     PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
+     SERVICING, REPAIR OR CORRECTION.
+
+ 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
+     MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
+     LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+     INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+     INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+     DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
+     OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
+     OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
+     ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+                      END OF TERMS AND CONDITIONS
+How to Apply These Terms to Your New Programs
+=============================================
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+   To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+     ONE LINE TO GIVE THE PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
+     Copyright (C) 19YY  NAME OF AUTHOR
+
+     This program 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 2
+     of the License, or (at your option) any later version.
+
+     This program 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, write to the Free Software Foundation, Inc.,
+     51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+   Also add information on how to contact you by electronic and paper
+mail.
+
+   If the program is interactive, make it output a short notice like
+this when it starts in an interactive mode:
+
+     Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
+     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+     type `show w'.  This is free software, and you are welcome
+     to redistribute it under certain conditions; type `show c'
+     for details.
+
+   The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+   You should also get your employer (if you work as a programmer) or
+your school, if any, to sign a "copyright disclaimer" for the program,
+if necessary.  Here is a sample; alter the names:
+
+     Yoyodyne, Inc., hereby disclaims all copyright
+     interest in the program `Gnomovision'
+     (which makes passes at compilers) written
+     by James Hacker.
+
+     SIGNATURE OF TY COON, 1 April 1989
+     Ty Coon, President of Vice
+
+   This General Public License does not permit incorporating your
+program into proprietary programs.  If your program is a subroutine
+library, you may consider it more useful to permit linking proprietary
+applications with the library.  If this is what you want to do, use the
+GNU Library General Public License instead of this License.
+
+\1f
+File: gnupg1.info,  Node: Option Index,  Next: Index,  Prev: Copying,  Up: Top
+
+Option Index
+************
+
+\0\b[index\0\b]
+* Menu:
+
+* --enarmor:                             Operational GPG Commands.
+                                                              (line 283)
+* armor:                                 GPG Input and Output.
+                                                              (line   8)
+* card-edit:                             Operational GPG Commands.
+                                                              (line 137)
+* card-status:                           Operational GPG Commands.
+                                                              (line 143)
+* change-pin:                            Operational GPG Commands.
+                                                              (line 146)
+* check-sigs:                            Operational GPG Commands.
+                                                              (line 123)
+* check-trustdb:                         Operational GPG Commands.
+                                                              (line 236)
+* clearsign:                             Operational GPG Commands.
+                                                              (line  15)
+* debug:                                 GPG Esoteric Options.
+                                                              (line  22)
+* decrypt:                               Operational GPG Commands.
+                                                              (line  48)
+* decrypt-files:                         Operational GPG Commands.
+                                                              (line  83)
+* default-key:                           GPG Configuration Options.
+                                                              (line  10)
+* default-keyserver-url:                 GPG Esoteric Options.
+                                                              (line 417)
+* default-preference-list:               GPG Esoteric Options.
+                                                              (line 412)
+* default-recipient:                     GPG Configuration Options.
+                                                              (line  15)
+* default-recipient-self:                GPG Configuration Options.
+                                                              (line  19)
+* delete-key:                            Operational GPG Commands.
+                                                              (line 151)
+* delete-secret-and-public-key:          Operational GPG Commands.
+                                                              (line 160)
+* delete-secret-key:                     Operational GPG Commands.
+                                                              (line 156)
+* desig-revoke:                          OpenPGP Key Management.
+                                                              (line  21)
+* detach-sign:                           Operational GPG Commands.
+                                                              (line  23)
+* dry-run:                               GPG Esoteric Options.
+                                                              (line   8)
+* dump-options:                          General GPG Commands.
+                                                              (line  19)
+* edit-key:                              OpenPGP Key Management.
+                                                              (line  26)
+* enarmor:                               Operational GPG Commands.
+                                                              (line 283)
+* encrypt:                               Operational GPG Commands.
+                                                              (line  27)
+* encrypt-files:                         Operational GPG Commands.
+                                                              (line  80)
+* export:                                Operational GPG Commands.
+                                                              (line 165)
+* export-ownertrust:                     Operational GPG Commands.
+                                                              (line 251)
+* export-secret-keys:                    Operational GPG Commands.
+                                                              (line 180)
+* export-secret-subkeys:                 Operational GPG Commands.
+                                                              (line 180)
+* fetch-keys:                            Operational GPG Commands.
+                                                              (line 221)
+* fingerprint:                           Operational GPG Commands.
+                                                              (line 126)
+* fixed-list-mode:                       GPG Input and Output.
+                                                              (line 117)
+* gen-key:                               OpenPGP Key Management.
+                                                              (line   9)
+* gen-prime:                             Operational GPG Commands.
+                                                              (line 277)
+* gen-random:                            Operational GPG Commands.
+                                                              (line 271)
+* gen-revoke:                            OpenPGP Key Management.
+                                                              (line  17)
+* gnupg:                                 OpenPGP Options.     (line 110)
+* gpgconf-list:                          GPG Esoteric Options.
+                                                              (line 430)
+* gpgconf-test:                          GPG Esoteric Options.
+                                                              (line 434)
+* help:                                  General GPG Commands.
+                                                              (line  12)
+* hidden-recipient:                      GPG Key related Options.
+                                                              (line  14)
+* homedir:                               GPG Configuration Options.
+                                                              (line 191)
+* import:                                Operational GPG Commands.
+                                                              (line 190)
+* import-ownertrust:                     Operational GPG Commands.
+                                                              (line 256)
+* interactive:                           GPG Esoteric Options.
+                                                              (line  19)
+* keyedit:addcardkey:                    OpenPGP Key Management.
+                                                              (line  97)
+* keyedit:addkey:                        OpenPGP Key Management.
+                                                              (line  94)
+* keyedit:addphoto:                      OpenPGP Key Management.
+                                                              (line  74)
+* keyedit:addrevoker:                    OpenPGP Key Management.
+                                                              (line 127)
+* keyedit:adduid:                        OpenPGP Key Management.
+                                                              (line  71)
+* keyedit:bkuptocard:                    OpenPGP Key Management.
+                                                              (line 111)
+* keyedit:check:                         OpenPGP Key Management.
+                                                              (line 159)
+* keyedit:clean:                         OpenPGP Key Management.
+                                                              (line 207)
+* keyedit:cross-certify:                 OpenPGP Key Management.
+                                                              (line 221)
+* keyedit:delkey:                        OpenPGP Key Management.
+                                                              (line 122)
+* keyedit:delsig:                        OpenPGP Key Management.
+                                                              (line  86)
+* keyedit:deluid:                        OpenPGP Key Management.
+                                                              (line  81)
+* keyedit:disable:                       OpenPGP Key Management.
+                                                              (line  67)
+* keyedit:enable:                        OpenPGP Key Management.
+                                                              (line  67)
+* keyedit:expire:                        OpenPGP Key Management.
+                                                              (line 135)
+* keyedit:key:                           OpenPGP Key Management.
+                                                              (line 155)
+* keyedit:keyserver:                     OpenPGP Key Management.
+                                                              (line 189)
+* keyedit:keytocard:                     OpenPGP Key Management.
+                                                              (line 100)
+* keyedit:lsign:                         OpenPGP Key Management.
+                                                              (line  38)
+* keyedit:minimize:                      OpenPGP Key Management.
+                                                              (line 216)
+* keyedit:notation:                      OpenPGP Key Management.
+                                                              (line 196)
+* keyedit:nrsign:                        OpenPGP Key Management.
+                                                              (line  43)
+* keyedit:passwd:                        OpenPGP Key Management.
+                                                              (line 140)
+* keyedit:pref:                          OpenPGP Key Management.
+                                                              (line 165)
+* keyedit:primary:                       OpenPGP Key Management.
+                                                              (line 143)
+* keyedit:quit:                          OpenPGP Key Management.
+                                                              (line 230)
+* keyedit:revkey:                        OpenPGP Key Management.
+                                                              (line 132)
+* keyedit:revsig:                        OpenPGP Key Management.
+                                                              (line  57)
+* keyedit:revuid:                        OpenPGP Key Management.
+                                                              (line  91)
+* keyedit:save:                          OpenPGP Key Management.
+                                                              (line 227)
+* keyedit:setpref:                       OpenPGP Key Management.
+                                                              (line 177)
+* keyedit:showphoto:                     OpenPGP Key Management.
+                                                              (line 162)
+* keyedit:showpref:                      OpenPGP Key Management.
+                                                              (line 169)
+* keyedit:sign:                          OpenPGP Key Management.
+                                                              (line  31)
+* keyedit:toggle:                        OpenPGP Key Management.
+                                                              (line 204)
+* keyedit:trust:                         OpenPGP Key Management.
+                                                              (line  62)
+* keyedit:tsign:                         OpenPGP Key Management.
+                                                              (line  47)
+* keyedit:uid:                           OpenPGP Key Management.
+                                                              (line 151)
+* list-config:                           GPG Esoteric Options.
+                                                              (line 422)
+* list-keys:                             Operational GPG Commands.
+                                                              (line  88)
+* list-options:                          GPG Configuration Options.
+                                                              (line  38)
+* list-options:show-notations:           GPG Configuration Options.
+                                                              (line  57)
+* list-options:show-photos:              GPG Configuration Options.
+                                                              (line  46)
+* list-options:show-policy-urls:         GPG Configuration Options.
+                                                              (line  51)
+* list-options:show-std-notations:       GPG Configuration Options.
+                                                              (line  57)
+* list-options:show-user-notations:      GPG Configuration Options.
+                                                              (line  57)
+* list-packets:                          Operational GPG Commands.
+                                                              (line 133)
+* list-secret-keys:                      Operational GPG Commands.
+                                                              (line 101)
+* list-sigs:                             Operational GPG Commands.
+                                                              (line 107)
+* local-user:                            GPG Key related Options.
+                                                              (line  63)
+* lsign-key:                             OpenPGP Key Management.
+                                                              (line 265)
+* mangle-dos-filenames:                  GPG Configuration Options.
+                                                              (line 282)
+* max-output:                            GPG Input and Output.
+                                                              (line  19)
+* multifile:                             Operational GPG Commands.
+                                                              (line  69)
+* no-default-recipient:                  GPG Configuration Options.
+                                                              (line  25)
+* no-mangle-dos-filenames:               GPG Configuration Options.
+                                                              (line 282)
+* no-verbose:                            GPG Configuration Options.
+                                                              (line  32)
+* openpgp:                               OpenPGP Options.     (line 118)
+* output:                                GPG Input and Output.
+                                                              (line  16)
+* pgp2:                                  OpenPGP Options.     (line 133)
+* pgp6:                                  OpenPGP Options.     (line 147)
+* pgp7:                                  OpenPGP Options.     (line 158)
+* pgp8:                                  OpenPGP Options.     (line 164)
+* print-md:                              Operational GPG Commands.
+                                                              (line 266)
+* quiet:                                 GPG Configuration Options.
+                                                              (line  35)
+* rebuild-keydb-caches:                  Operational GPG Commands.
+                                                              (line 260)
+* recipient:                             GPG Key related Options.
+                                                              (line   8)
+* recv-keys:                             Operational GPG Commands.
+                                                              (line 199)
+* refresh-keys:                          Operational GPG Commands.
+                                                              (line 203)
+* rfc1991:                               OpenPGP Options.     (line 130)
+* rfc2440:                               OpenPGP Options.     (line 125)
+* search-keys:                           Operational GPG Commands.
+                                                              (line 212)
+* send-keys:                             Operational GPG Commands.
+                                                              (line 172)
+* sign:                                  Operational GPG Commands.
+                                                              (line   8)
+* sign-key:                              OpenPGP Key Management.
+                                                              (line 261)
+* store:                                 Operational GPG Commands.
+                                                              (line  44)
+* symmetric:                             Operational GPG Commands.
+                                                              (line  35)
+* update-trustdb:                        Operational GPG Commands.
+                                                              (line 226)
+* verbose:                               GPG Configuration Options.
+                                                              (line  28)
+* verify:                                Operational GPG Commands.
+                                                              (line  56)
+* verify-files:                          Operational GPG Commands.
+                                                              (line  77)
+* version:                               General GPG Commands.
+                                                              (line   7)
+* warranty:                              General GPG Commands.
+                                                              (line  16)
+* with-colons:                           GPG Input and Output.
+                                                              (line 109)
+* with-fingerprint:                      GPG Input and Output.
+                                                              (line 121)
+
+\1f
+File: gnupg1.info,  Node: Index,  Prev: Option Index,  Up: Top
+
+Index
+*****
+
+\0\b[index\0\b]
+* Menu:
+
+* command options:                       Invoking GPG.         (line  6)
+* GPG command options:                   Invoking GPG.         (line  6)
+* gpgsm.conf:                            GPG Configuration.    (line 11)
+* GPL, GNU General Public License:       Copying.              (line  6)
+* options, GPG command:                  Invoking GPG.         (line  6)
+
+
+\1f
+Tag Table:
+Node: Top\7f717
+Node: Invoking GPG\7f1760
+Node: GPG Commands\7f2536
+Node: General GPG Commands\7f3367
+Node: Operational GPG Commands\7f3998
+Node: OpenPGP Key Management\7f16542
+Node: GPG Options\7f26994
+Node: GPG Configuration Options\7f28224
+Ref: option --homedir\7f35706
+Ref: option --options\7f38256
+Node: GPG Key related Options\7f56255
+Node: GPG Input and Output\7f59254
+Node: OpenPGP Options\7f64663
+Node: GPG Esoteric Options\7f72453
+Node: GPG Configuration\7f93827
+Node: GPG Examples\7f96077
+Node: Specify a User ID\7f99709
+Ref: how-to-specify-a-user-id\7f99858
+Node: Copying\7f104479
+Node: Option Index\7f123693
+Node: Index\7f141621
+\1f
+End Tag Table
diff --git a/doc/gnupg1.texi b/doc/gnupg1.texi
new file mode 100644 (file)
index 0000000..75c98ba
--- /dev/null
@@ -0,0 +1,161 @@
+\input texinfo                      @c -*-texinfo-*-
+@c %**start of header
+@setfilename gnupg1.info
+@include version.texi
+@settitle Using the GnuPG Version 1.4
+
+@c A couple of macros with no effect on texinfo
+@c but used by the yat2m processor. 
+@macro manpage {a}
+@end macro
+@macro mansect {a}
+@end macro
+@macro manpause 
+@end macro
+@macro mancont
+@end macro
+
+@c Create a separate index for command line options.
+@defcodeindex op
+@c Merge the standard indexes into a single one.
+@syncodeindex fn cp
+@syncodeindex vr cp
+@syncodeindex ky cp
+@syncodeindex pg cp
+@syncodeindex tp cp
+@c %**end of header
+@copying
+This is the @cite{The GNU Privacy Guard Manual}
+(@value{VERSION}, @value{UPDATED}).
+
+@iftex
+Published by the Free Software Foundation@*
+51 Franklin St, Fifth Floor@*
+Boston, MA 02110-1301 USA
+@end iftex
+
+Copyright @copyright{} 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of 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. The text of the license can be found in the
+section entitled ``Copying''.
+@end quotation
+@end copying
+
+
+@dircategory GNU Utilities
+@direntry
+* gpg: (gpg).            OpenPGP encryption and signing tool (v1).
+@end direntry
+
+
+@c
+@c Printing stuff taken from gcc.
+@c
+@macro gnupgtabopt{body}
+@code{\body\}
+@end macro
+@macro gnupgoptlist{body}
+@smallexample
+\body\
+@end smallexample
+@end macro
+@c Makeinfo handles the above macro OK, TeX needs manual line breaks;
+@c they get lost at some point in handling the macro.  But if @macro is
+@c used here rather than @alias, it produces double line breaks.
+@iftex
+@alias gol = *
+@end iftex
+@ifnottex
+@macro gol
+@end macro
+@end ifnottex
+
+
+@c
+@c Titlepage
+@c
+@setchapternewpage odd
+@titlepage
+@title Using the GNU Privacy Guard, Version 1.4
+@subtitle Version @value{VERSION}
+@subtitle @value{UPDATED}
+
+@author Werner Koch (@email{wk@@gnupg.org})
+
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@ifnothtml
+@summarycontents
+@contents
+@page
+@end ifnothtml
+
+@ifnottex
+@node Top
+@top 
+@insertcopying
+
+@noindent
+This manual documents how to use the standalone version of GNU Privacy Guard.
+@end ifnottex
+
+@menu
+* Invoking GPG::        Using the classic GPG protocol.
+* Specify a User ID::   How to Specify a User Id.
+
+* Copying::             GNU General Public License says
+                        how you can copy and share GnuPG
+* Option Index::        Index to command line options.
+* Index::              Index of concepts and symbol names.
+@end menu
+
+@ifhtml
+
+@end ifhtml
+
+
+@ifhtml
+@page
+@summarycontents
+@contents
+@end ifhtml
+
+
+@include gpg.texi
+
+@node Specify a User ID
+@chapter How to Specify a User Id
+@anchor{how-to-specify-a-user-id}
+@include specify-user-id.texi
+
+@include gpl.texi
+
+
+@c ---------------------------------------------------------------------
+@c Indexes
+@c ---------------------------------------------------------------------
+
+@node Option Index
+@unnumbered Option Index
+
+@printindex op
+
+@node Index
+@unnumbered Index
+
+@printindex cp
+
+@c ---------------------------------------------------------------------
+@c Epilogue
+@c ---------------------------------------------------------------------
+
+@bye
+
+
diff --git a/doc/gpg.ru.1 b/doc/gpg.ru.1
new file mode 100644 (file)
index 0000000..6dc4834
--- /dev/null
@@ -0,0 +1,1702 @@
+.TH "gpg" "1" 
+.SH "NAME" 
+gpg \(em ÉÎÓÔÒÕÍÅÎÔ ÄÌÑ ÛÉÆÒÏ×ÁÎÉÑ É ÃÉÆÒÏ×ÏÊ ÐÏÄÐÉÓÉ 
+.SH "SYNOPSIS" 
+.PP 
+.nf 
+\fBgpg\fR [\-\-homedir \fBname\fR] [\-\-options \fBfile\fR] [\fBoptions\fR] \fBcommand\fR [\fBargs\fR]    
+.fi 
+.SH "ïðéóáîéå" 
+.PP 
+\fBgpg\fR ÏÓÎÏ×ÎÁÑ ÐÒÏÇÒÁÍÍÁ ÓÉÓÔÅÍÙ GnuPG. 
+.PP 
+äÁÎÎÏÅ ÒÕËÏ×ÏÄÓÔ×Ï Ñ×ÌÑÅÔÓÑ ÞÁÓÔØÀ GnuPG. 
+GnuPG ÒÁÓÐÒÏÓÔÒÁÎÑÅÔÓÑ ÎÁ ÕÓÌÏ×ÉÑÈ GNU General Public License, ÏÐÕÂÌÉËÏ×ÁÎÎÏÊ 
+Free Software Foundation; ÌÉÂÏ ×ÅÒÓÉÉ 2, ÌÉÂÏ (ÎÁ ÷ÁÛÅ ÕÓÍÏÔÒÅÎÉÅ) ÌÀÂÏÊ  
+ÂÏÌÅÅ ÐÏÚÄÎÅÊ ×ÅÒÓÉÉ.  
+.PP 
+äÁÎÎÏÅ ÒÕËÏ×ÏÄÓÔ×Ï ÓÏÄÅÒÖÉÔ ÔÏÌØËÏ ÓÐÉÓÏË ÄÏÓÔÕÐÎÙÈ ËÏÍÁÎÄ É ÐÁÒÁÍÅÔÒÏ×. 
+âÏÌÅÅ ÐÏÄÒÏÂÎÁÑ ÉÎÆÏÒÍÁÃÉÑ ÓÏÄÅÒÖÉÔÓÑ × GNU Privacy Handbook (GPH) É 
+ÄÒÕÇÉÈ ÄÏËÕÍÅÎÔÁÈ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÎÁÊÔÉ ÎÁ ÓÁÊÔÅ 
+http://www.gnupg.org. 
+.PP 
+ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÒÁÚÂÏÒ ÐÁÒÁÍÅÔÒÏ× ÚÁËÁÎÞÉ×ÁÅÔÓÑ ÓÒÁÚÕ ÐÏÓÌÅ ÔÏÇÏ, 
+ËÁË × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ×ÓÔÒÅÞÁÅÔÓÑ ÜÌÅÍÅÎÔ ÎÅ Ñ×ÌÑÀÝÉÊÓÑ ÐÁÒÁÍÅÔÒÏÍ. ÷Ù 
+ÍÏÖÅÔÅ ÐÒÉÎÕÄÉÔÅÌØÎÏ ÐÒÅËÒÁÔÉÔØ ÒÁÚÂÏÒ ÐÁÒÁÍÅÔÒÏ×, ÉÓÐÏÌØÚÕÑ ÓÐÅÃÉÁÌØÎÙÊ 
+ÐÁÒÁÍÅÔÒ "\-\-". 
+.SH "ëïíáîäù" 
+.PP 
+\fBgpg\fR ÍÏÖÅÔ ÂÙÔØ ÚÁÐÕÝÅΠÂÅÚ ÕËÁÚÁÎÉÑ ËÏÍÁÎÄÙ, × ÜÔÏÍ ÓÌÕÞÁÅ ÏΠ
+×ÙÐÏÌÎÑÅÔ ÄÅÊÓÔ×ÉÅ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÔÉÐÁ ÆÁÊÌÁ ÐÏÄÁÎÎÏÇÏ ÎÁ ÅÇÏ ×ÈÏÄ 
+(ÚÁÛÉÆÒÏ×ÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ ÒÁÓÛÉÆÒÏ×Ù×ÁÅÔÓÑ, ÐÏÄÐÉÓØ ÐÒÏ×ÅÒÑÅÔÓÑ, ÅÓÌÉ  
+ÆÁÊÌ ÓÏÄÅÒÖÉÔ ËÌÀÞÉ, ÔÏ ×Ù×ÏÄÉÔÓÑ ÉÈ ÓÐÉÓÏË). 
+.PP 
+\fBgpg\fR ÒÁÓÐÏÚÎÁ£Ô ÓÌÅÄÕÀÝÉÅ ËÏÍÁÎÄÙ: 
+.IP "\-s, \-\-sign" 10 
+óÏÚÄÁÔØ ÐÏÄÐÉÓØ. äÁÎÎÁÑ ËÏÍÁÎÄÁ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó  
+\-\-encrypt (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ), 
+\-\-symmetric (ÄÌÑ ÓÏÚÄÁÎÉÑ ÓÏÏÂÝÅÎÉÊ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ 
+ÓÉÍÍÅÔÒÉÞÎÙÍ ÛÉÆÒÏÍ) ÉÌÉ Ó \-\-encrypt É \-\-symmetric ÓÒÁÚÕ (ÄÌÑ ÓÏÚÄÁÎÉÑ 
+ÐÏÄÐÉÓÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÂÙÔØ ÒÁÓÛÉÆÒÏ×ÁÎÙ ÉÌÉ Ó ÐÏÍÏÝØÀ 
+ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ ÉÌÉ ÐÏÓÒÅÄÓÔ×ÏÍ ËÌÀÞÅ×ÏËÌÀÞÅ×ÏÊ ÆÒÁÚÙ). 
+.IP "\-\-clearsign" 10 
+óÏÚÄÁÔØ ÐÒÏÚÒÁÞÎÕÀ ÐÏÄÐÉÓØ. 
+.IP "\-b, \-\-detach-sign" 10 
+óÏÚÄÁÔØ ÏÔÄÅÌ£ÎÎÕÀ ÐÏÄÐÉÓØ. 
+.IP "\-e, \-\-encrypt" 10 
+úÁÛÉÆÒÏ×ÁÔØ ÄÁÎÎÙÅ. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó \-\-sign (ÄÌÑ 
+ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ), \-\-symmetric (ÄÌÑ 
+ÓÏÚÄÁÎÉÑ ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó 
+ÐÏÍÏÝØÀ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ) ÉÌÉ Ó  
+\-\-sign É \-\-symmetric ÓÒÁÚÕ (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ 
+ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó ÐÏÍÏÝØÀ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, 
+ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ). 
+.IP "\-c, \-\-symmetric" 10 
+úÁÛÉÆÒÏ×ÁÔØ ÓÉÍÍÅÔÒÉÞÎÙÍ ÁÌÇÏÒÉÔÍÏÍ ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ (ÐÁÒÏÌØ). 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÁÌÇÏÒÉÔÍ CAST5. äÌÑ ×ÙÂÏÒÁ ÄÒÕÇÏÇÏ ÁÌÇÏÒÉÔÍÁ 
+ÍÏÖÎÏ ×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒÏÍ \-\-cipher-algo. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ  
+ÓÏ×ÍÅÓÔÎÏ Ó \-\-sign (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ), 
+\-\-encrypt  (ÄÌÑ ÓÏÚÄÁÎÉÑ ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ  
+ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó ÐÏÍÏÝØÀ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ  
+ÆÒÁÚÕ) ÉÌÉ Ó \-\-sign É \-\-encrypt ÓÒÁÚÕ (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É 
+ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó ÐÏÍÏÝØÀ  
+ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ). 
+.IP "\-\-store" 10 
+óÏÚÄÁ£Ô ÐÁËÅÔ × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó RFC1991. 
+.IP "\-\-decrypt [\fBfile\fR]" 10 
+òÁÓÛÉÆÒÏ×Ù×ÁÅÔ \fBfile\fR (ÉÌÉ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ, ÅÓÌÉ ÆÁÊÌ ÎÅ ÚÁÄÁÎ) É 
+×Ù×ÏÄÉÔ ÅÇÏ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ (ÉÌÉ × ÆÁÊÌ ÏÐÒÅÄÅÌ£ÎÎÙÊ ÐÁÒÁÍÅÔÒÏÍ 
+\-\-output). åÓÌÉ ÒÁÓÛÉÆÒÏ×ÁÎÎÙÊ ÆÁÊÌ ÐÏÄÐÉÓÁÎ, ÔÏ ÔÁËÖÅ ÐÒÏ×ÅÒÑÅÔÓÑ 
+ÐÏÄÐÉÓØ. üÔÁ ËÏÍÁÎÄÁ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÏÐÅÒÁÃÉÉ ÐÏ ÕÍÏÌÞÁÎÉÀ ÔÅÍ, ÞÔÏ 
+ÎÉËÏÇÄÁ ÎÅ ÓÏÈÒÁÎÑÅÔ ÒÅÚÕÌØÔÁÔ × ÆÁÊÌÅ Ó ÉÍÅÎÅÍ ÕËÁÚÁÎÎÙÍ × 
+ÚÁÛÉÆÒÏ×ÁÎÎÏÍ ÆÁÊÌÅ É ÎÅ ÏÂÒÁÂÁÔÙ×ÁÅÔ ÆÁÊÌÙ ÎÅ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó 
+ÚÁÛÉÆÒÏ×ÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ. 
+.IP "\-\-verify [[\fBsigfile\fR]  [\fBsigned-files\fR]]" 10 
+ðÒÅÄÐÏÌÁÇÁÅÔ, ÞÔÏ \fBsigfile\fR ÓÏÄÅÒÖÉÔ ÐÏÄÐÉÓØ É ÐÒÏ×ÅÒÑÅԠţ, 
+ÎÅ ×Ù×ÏÄÑ ÓÏÄÅÒÖÉÍÏÅ ÄÏËÕÍÅÎÔÁ. âÅÚ ÁÒÇÕÍÅÎÔÏ×, ÓÞÉÔÙ×ÁÅÔ ÐÏÄÐÉÓÁÎÎÙÅ 
+ÄÁÎÎÙÅ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ. åÓÌÉ ÚÁÄÁΠÔÏÌØËÏ ÆÁÊÌ ÐÏÄÐÉÓÉ, ÔϠנΣ͠
+ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØÓÑ ÌÉÂÏ ÐÏÌÎÏÓÔØÀ ÐÏÄÐÉÓÁÎÎÙÊ ÄÏËÕÍÅÎÔ, ÌÉÂÏ ÏÔÄÅÌ£ÎÎÁÑ 
+ÐÏÄÐÉÓØ. ÷ ÐÏÓÌÅÄÎÅÍ ÓÌÕÞÁÅ ÐÏÄÐÉÓÁÎÎÙÊ ÄÏËÕÍÅÎÔ ÄÏÌÖÅΠÓÏÄÅÒÖÁÔØÓÑ × 
+ÆÁÊÌÅ ÂÅÚ ÒÁÓÛÉÒÅÎÉÑ ".sig" ÉÌÉ ".asc". åÓÌÉ ÕËÁÚÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ 
+ÁÒÇÕÍÅÎÔÁ, ÔÏ ÐÅÒ×ÙÊ ÄÏÌÖÅΠÂÙÔØ ÏÔÄÅÌ£ÎÎÏÊ ÐÏÄÐÉÓØÀ, Á ÏÓÔÁÌØÎÙÅ ÄÏÌÖÎÙ 
+ÓÏÄÅÒÖÁÔØ ÐÏÄÐÉÓÁÎÎÙÊ ÍÁÔÅÒÉÁÌ. äÌÑ ÓÞÉÔÙ×ÁÎÉÑ ÐÏÄÐÉÓÁÎÎÏÇÏ ÄÏËÕÍÅÎÔÁ ÓÏ 
+ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ, ÉÓÐÏÌØÚÕÊÔÅ \fB-\fP × ËÁÞÅÓÔ×Å ÉÍÅÎÉ 
+×ÔÏÒÏÇÏ ÆÁÊÌÁ. ðÏ ÐÒÉÞÉÎÁÍ ÂÅÚÏÐÁÓÎÏÓÔÉ, ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÏÔÄÅÌ£ÎÎÏÊ 
+ÐÏÄÐÉÓÉ, ÐÏÄÐÉÓÁÎÎÙÊ ÍÁÔÅÒÉÁÌ ÎÅ ÍÏÖÅÔ ÓÞÉÔÙ×ÁÔØÓÑ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ 
+ÂÅÚ Ñ×ÎÏÇÏ ÕËÁÚÁÎÉÑ ×ÙÛÅÏÚÎÁÞÅÎÎÙÍ ÏÂÒÁÚÏÍ. 
+.IP "\-\-multifile" 10 
+éÚÍÅÎÑÅÔ ÐÏ×ÅÄÅÎÉÅ ÎÅËÏÔÏÒÙÈ ÄÒÕÇÉÈ ËÏÍÁÎÄ ÔÁË, ÞÔÏÂÙ ÏÎÉ ÍÏÇÌÉ 
+ÏÂÒÁÂÁÔÙ×ÁÔØ ÓÒÁÚÕ ÎÅÓËÏÌØËÏ ÆÁÊÌÏ×. éÍÅÎÁ ÆÁÊÌÏ× ÕËÁÚÙ×ÁÀÔÓÑ × 
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ÉÌÉ ÐÏÄÁÀÔÓÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ ÐÏ ÏÄÎÏÍÕ × ÓÔÒÏËÅ. 
+üÔÏ ÐÏÚ×ÏÌÑÅÔ ÏÂÒÁÂÁÔÙ×ÁÔØ ÍÎÏÖÅÓÔ×Ï ÆÁÊÌÏ× ÏÄÎÏÊ ËÏÍÁÎÄÏÊ. ÷ ÎÁÓÔÏÑÝÅÅ 
+×ÒÅÍÑ \-\-multifile ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó \-\-verify, 
+\-\-encrypt, É \-\-decrypt.  úÁÍÅÔØÔÅ, ÞÔÏ "\-\-multifile \-\-verify" ÎÅÌØÚÑ 
+ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÐÒÏ×ÅÒËÉ ÏÔÄÅÌ£ÎÎÙÈ ÐÏÄÐÉÓÅÊ. 
+.IP "\-\-verify-files [\fBfiles\fR]" 10 
+éÄÅÎÔÉÞÎÁ \-\-multifile \-\-verify. 
+.IP "\-\-encrypt-files [\fBfiles\fR]" 10 
+éÄÅÎÔÉÞÎÁ \-\-multifile \-\-encrypt. 
+.IP "\-\-decrypt-files [\fBfiles\fR]" 10 
+éÄÅÎÔÉÞÎÁ \-\-multifile \-\-decrypt. 
+.IP "\-\-list-keys [\fBnames\fR]" 10 
+.IP "\-\-list-public-keys [\fBnames\fR]" 10 
+÷Ù×ÏÄÉÔ ×ÓÅ ËÌÀÞÉ ÉÚ Ó×ÑÚËÉ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ, ÉÌÉ ÔÏÌØËÏ ÕËÁÚÁÎÎÙÅ × 
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. 
+.IP "" 10 
+îÅ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ×Ù×ÏÄ ÄÁÎÎÏÊ ËÏÍÁÎÄÙ × ÓÃÅÎÁÒÉÑÈ É ÄÒÕÇÉÈ 
+ÐÒÏÇÒÁÍÍÁÈ, Ô.Ë. ÆÏÒÍÁÔ ×Ù×ÏÄÁ ÍÏÖÅÔ ÍÅÎÑÔØÓÑ × ÒÁÚÎÙÈ ×ÅÒÓÉÑÈ GnuPG. 
+äÌÑ ÍÁÛÉÎÎÏÊ ÏÂÒÁÂÏÔËÉ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ×Ù×ÏÄ ËÏÍÁÎÄÙ 
+\-\-with-colons. 
+.IP "\-K, \-\-list-secret-keys [\fBnames\fR]" 10 
+÷Ù×ÏÄÉÔ ×ÓÅ ËÌÀÞÉ ÉÚ Ó×ÑÚËÉ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ, ÉÌÉ ÔÏÌØËÏ ÕËÁÚÁÎÎÙÅ × 
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. úÎÁË '#' ÐÏÓÌÅ ÓÉÍ×ÏÌÏ× sec ÏÚÎÁÞÁÅÔ, ÞÔÏ ÓÅËÒÅÔÎÙÊ 
+ËÌÀÞ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ (ÎÁÐÒ., ÅÓÌÉ ÏΠÂÙÌ ÓÏÚÄÁΠËÏÍÁÎÄÏÊ 
+\-\-export-secret-subkeys). 
+.IP "\-\-list-sigs [\fBnames\fR]" 10 
+ôÏ ÖÅ, ÞÔÏ É  \-\-list-keys, ÎÏ ÄÏÐÏÌÎÉÔÅÌØÎÏ ×Ù×ÏÄÉÔ ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ. 
+.IP "" 10 
+äÌÑ ËÁÖÄÏÊ ÐÏÄÐÉÓÉ ÍÏÖÅÔ ÂÙÔØ ÕËÁÚÁÎÏ ÎÅÓËÏÌØËÏ ÆÌÁÇÏ× ÍÅÖÄÕ ÔÜÇÏÍ "sig" 
+É ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ. üÔÉ ÆÌÁÇÉ ÓÏÄÅÒÖÁÔ ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï 
+ËÁÖÄÏÊ ÐÏÄÐÉÓÉ. ãÉÆÒÙ 1-3 ÕËÁÚÙ×ÁÀÔ ÎÁ ÕÒÏ×ÅÎØ ÐÒÏ×ÅÒËÉ ÓÅÒÔÉÆÉËÁÔÁ (ÓÍ. 
+\-\-ask-cert-level), "L" ÄÌÑ ÌÏËÁÌØÎÙÈ ÉÌÉ ÎÅÜËÓÐÏÒÔÉÒÕÅÍÙÈ ÐÏÄÐÉÓÅÊ (ÓÍ. 
+\-\-lsign-key), "R" ÄÌÑ ÎÅÏÔÚÙ×ÁÅÍÙÈ ÐÏÄÐÉÓÅÊ (ÓÍ.  nrsign × ÏÐÉÓÁÎÉÉ 
+\-\-edit-key), "P" ÄÌÑ ÐÏÄÐÉÓÅÊ ÓÏÄÅÒÖÁÝÉÈ URL ÐÏÌÉÔÉËÉ ÐÏÄÐÉÓÉ (ÓÍ. 
+\-\-cert-policy-url), "N" ÄÌÑ ÐÏÄÐÉÓÅÊ ÓÏÄÅÒÖÁÝÉÈ ÐÒÉÍÅÞÁÎÉÅ (ÓÍ. 
+\-\-cert-notation), "X" ÄÌÑ ÐÏÄÐÉÓÅÊ ÓÒÏË ÄÅÊÓÔ×ÉÑ ËÏÔÏÒÙÈ ÉÓÔ£Ë.  (ÓÍ. 
+\-\-ask-cert-expire), ÃÉÆÒÙ 1-9 ÉÌÉ "T" ÄÌÑ 10 É ÂÏÌÅÅ, ÞÔÏÂÙ ÕËÁÚÁÔØ 
+ÕÒÏ×ÅÎØ ÄÏ×ÅÒÑÀÝÅÊ ÐÏÄÐÉÓÉ (ÓÍ. tsign × ÏÐÉÓÁÎÉÉ ËÏÍÁÎÄÙ \-\-edit-key). 
+.IP "\-\-check-sigs [\fBnames\fR]" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-list-sigs, ÎÏ ÐÏÄÐÉÓÉ ÐÒÏ×ÅÒÑÀÔÓÑ. 
+.IP "\-\-fingerprint [\fBnames\fR]" 10 
+÷Ù×ÏÄÉÔ ×ÓÅ ËÌÀÞÉ É ÉÈ ÏÔÐÅÞÁÔËÉ. üÔÏ ÔÏÔ ÖÅ ×Ù×ÏÄ, ÞÔÏ É Õ \-\-list-keys, 
+ÎÏ ÄÌÑ ËÁÖÄÏÇÏ ËÌÀÞÁ ÄÏÂÁ×ÌÑÅÔÓÑ ÓÔÒÏËÁ, ÓÏÄÅÒÖÁÝÁÑ ÅÇÏ ÏÔÐÅÞÁÔÏË. íÏÖÅÔ 
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó \-\-list-sigs ÉÌÉ \-\-check-sigs. åÓÌÉ ËÏÍÁÎÄÁ 
+ÚÁÄÁÎÁ Ä×ÁÖÄÙ, ÔÏ ×Ù×ÏÄÑÔÓÑ ÏÔÐÅÞÁÔËÉ É ÄÌÑ ÐÏÄÞÉΣÎÎÙÈ ËÌÀÞÅÊ. 
+.IP "\-\-list-packets" 10 
+÷Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÁËÅÔÏ×. éÓÐÏÌØÚÕÅÔÓÑ, × ÏÓÎÏ×ÎÏÍ, ÄÌÑ ÏÔÌÁÄËÉ. 
+.IP "\-\-gen-key" 10 
+çÅÎÅÒÉÒÕÅÔ ÎÏ×ÕÀ ÐÁÒÕ ËÌÀÞÅÊ. äÁÎÎÁÑ ËÏÍÁÎÄÁ, ËÁË ÐÒÁ×ÉÌÏ, ÉÓÐÏÌØÚÕÅÔÓÑ 
+ÔÏÌØËÏ ÉÎÔÅÒÁËÔÉ×ÎÏ. 
+.IP "" 10 
+éÍÅÅÔÓÑ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÁÑ ×ÏÚÍÏÖÎÏÓÔØ, ÐÏÚ×ÏÌÑÀÝÁÑ ÇÅÎÅÒÉÒÏ×ÁÔØ ËÌÀÞÉ × 
+ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ. ðÏÄÒÏÂÎÏÓÔÉ × ÆÁÊÌÅ \fBdoc/DETAILS\fP × ÉÓÈÏÄÎÏÍ ÄÉÓÔÒÉÂÕÔÉ×Å. 
+.IP "\-\-edit-key \fBname\fR" 10 
+ðÒÅÄÏÓÔÁ×ÌÑÅÔ ÍÅÎÀ, ÐÏÚ×ÏÌÑÀÝÅÅ ×ÙÐÏÌÎÑÔØ ×ÓÅ ÚÁÄÁÞÉ ÐÏ ÕÐÒÁ×ÌÅÎÉÀ 
+ËÌÀÞÁÍÉ: 
+.RS 
+.IP "sign" 10 
+ðÏÄÐÉÓÁÔØ ËÌÀÞ ÐÏÌØÚÏ×ÁÔÅÌÑ \fBname\fR. åÓÌÉ ËÌÀÞ ÎÅ ÂÙÌ ÅÝ£ ÐÏÄÐÉÓÁΠ
+ËÌÀÞÏÍ ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÏ ÕÍÏÌÞÁÎÉÀ ( ÉÌÉ ÐÏÌØÚÏ×ÁÔÅÌÑ ÚÁÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÏÍ 
+\-u), ÔÏ ÐÒÏÇÒÁÍÍÁ ×Ù×ÏÄÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ËÌÀÞÅ, ×ÍÅÓÔÅ Ó ÏÔÐÅÞÁÔËÏÍ É 
+ÚÁÐÒÁÛÉ×ÁÅÔ ÐÏÄÔ×ÅÒÖÄÅÎÉÅ ÎÁ ÐÏÄÐÉÓØ ËÌÀÞÁ. ðÏÄÔ×ÅÒÖÄÅÎÉÅ ÚÁÐÒÁÛÉ×ÁÅÔÓÑ 
+ÄÌÑ ËÁÖÄÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÚÁÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÏÍ \-u. 
+.IP "lsign" 10 
+ôÏ ÖÅ, ÞÔÏ É  "sign", ÎÏ ÐÏÄÐÉÓØ ÐÏÍÅÞÁÅÔÓÑ ËÁË ÎÅÜËÓÐÏÒÔÉÒÕÅÍÁÑ É 
+ÎÉËÏÇÄÁ ÎÅ ÐÅÒÅÄÁ£ÔÓÑ ÄÒÕÇÉÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ, ÞÔÏÂÙ 
+ÓÄÅÌÁÔØ ËÌÀÞÉ ÄÅÊÓÔ×ÉÔÅÌØÎÙÍÉ ÔÏÌØËÏ × ÌÏËÁÌØÎÏÍ ÏËÒÕÖÅÎÉÉ. 
+.IP "nrsign" 10 
+ôÏ ÖÅ, ÞÔÏ É "sign", ÎÏ ÐÏÄÐÉÓØ ÐÏÍÅÞÁÅÔÓÑ ËÁË ÎÅÏÔÚÙ×ÁÅÍÁÑ. ôÁËÕÀ 
+ÐÏÄÐÉÓØ ÎÅ×ÏÚÍÏÖÎÏ ÂÕÄÅÔ ÏÔÏÚ×ÁÔØ. 
+.IP "nrlsign" 10 
+ïÂßÅÄÉÎÑÅÔ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ nrsign É lsign, ÓÏÚÄÁ×ÁÑ ÎÅÏÔÚÙ×ÁÅÍÙÅ É 
+ÎÅÜËÓÐÏÒÔÉÒÕÅÍÙÅ ÐÏÄÐÉÓÉ. 
+.IP "tsign" 10 
+óÏÚÄÁÔØ ÄÏ×ÅÒÑÀÝÕÀ ÐÏÄÐÉÓØ. üÔÁ ÐÏÄÐÉÓØ ÏÂßÅÄÉÎÑÅÔ ÚÎÁÞÅÎÉÅ ÓÅÒÔÉÆÉËÁÃÉÉ 
+(ËÁË É ÏÂÙÞÎÁÑ ÐÏÄÐÉÓØ) É ÕÓÔÁÎÏ×ËÉ ÄÏ×ÅÒÉÑ (ËÁË ËÏÍÁÎÄÁ "trust"). 
+ëÏÍÁÎÄÁ, × ÏÂÝÅÍ ÓÌÕÞÁÅ, ÐÒÉÍÅÎÉÍÁ × ÏÂÏÓÏÂÌÅÎÎÙÈ ÓÏÏÂÝÅÓÔ×ÁÈ É ÇÒÕÐÐÁÈ. 
+.RE 
+.IP "" 10 
+úÁÍÅÔØÔÅ, ÞÔÏ "l" (ÄÌÑ ÌÏËÁÌØÎÙÈ / ÎÅÜËÓÐÏÒÔÉÒÕÅÍÙÈ), "nr" (ÄÌÑ 
+ÎÅÏÔÚÙ×ÁÅÍÙÈ) É "t" (ÄÌÑ ÄÏ×ÅÒÑÀÝÉÈ) ÍÏÇÕÔ Ó×ÏÂÏÄÎÏ ÏÂßÅÄÉÎÑÔØÓÑ É 
+ÕËÁÚÙ×ÁÔØÓÑ ÐÅÒÅÄ "sign" ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÐÏÄÐÉÓÅÊ ÌÀÂÏÇÏ ÖÅÌÁÅÍÏÇÏ ÔÉÐÁ. 
+.RS 
+.IP "revsig" 10 
+ïÔÏÚ×ÁÔØ ÐÏÄÐÉÓØ. GnuPG ÚÁÐÒÁÛÉ×ÁÅÔ ÐÏÄÔ×ÅÒÖÄÅÎÉÅ ÇÅÎÅÒÁÃÉÉ ÏÔÚÙ×ÁÀÝÅÇÏ 
+ÓÅÒÔÉÆÉËÁÔÁ ÄÌÑ ËÁÖÄÏÊ ÐÏÄÐÉÓÉ, 
+ËÏÔÏÒÁÑ ÂÙÌÁ ÓÄÅÌÁÎÁ ÏÄÎÉÍ ÉÚ ÄÏÓÔÕÐÎÙÈ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ. 
+.IP "trust" 10 
+éÚÍÅÎÉÔØ ÕÒÏ×ÅÎØ ÄÏ×ÅÒÉÑ ×ÌÁÄÅÌØÃÕ ËÌÀÞÁ. ïÂÎÏ×ÌÑÅÔ ÂÁÚÕ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ 
+ÎÅÍÅÄÌÅÎÎÏ, ÎÅ ÔÒÅÂÕÑ ÓÏÈÒÁÎÅÎÉÑ. 
+.IP "disable" 10 
+.IP "enable" 10 
+ðÏÍÅÔÉÔØ ËÌÀÞ ËÁË ÎÅÉÓÐÏÌØÚÕÅÍÙÊ (disable) ÉÌÉ ÓÎÑÔØ ÐÏÍÅÔËÕ (enable). 
+ëÌÀÞ ÐÏÍÅÞÅÎÎÙÊ ËÁË ÎÅÉÓÐÏÌØÚÕÅÍÙÊ ÎÅ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ 
+ÛÉÆÒÏ×ÁÎÉÑ. 
+.IP "adduid" 10 
+óÏÚÄÁÔØ ÁÌØÔÅÒÎÁÔÉ×ÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "addphoto" 10 
+äÏÂÁ×ÉÔØ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+ëÏÍÁÎÄÁ ÚÁÐÒÁÛ×ÁÅÔ ÆÁÊÌ × ÆÏÒÍÁÔÅ JPEG, ËÏÔÏÒÙÊ ÄÏÂÁ×ÌÑÅÔÓÑ × 
+ËÁÞÅÓÔ×Å ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ. úÁÍÅÔØÔÅ, ÞÔÏ ÄÏÂÁ×ÌÅÎÉÅ 
+ÉÚÏÂÒÁÖÅÎÉÑ ÐÒÉ×ÏÄÉÔ Ë Õ×ÅÌÉÞÅÎÉÀ ÒÁÚÍÅÒÁ ËÌÀÞÁ. úÁÍÅÔØÔÅ, ÔÁËÖÅ, ÞÔÏ 
+ÎÅËÏÔÏÒÙÅ ÐÒÏÇÒÁÍÍÙ ÂÕÄÕÔ ×Ù×ÏÄÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ ÂÅÚ ÉÚÍÅÎÅÎÉÊ (GnuPG), 
+Á ÎÅËÏÔÏÒÙÅ ÂÕÄÕÔ ÅÇÏ ÍÁÓÛÔÁÂÉÒÏ×ÁÔØ (PGP). 
+.IP "deluid" 10 
+õÄÁÌÉÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "delsig" 10 
+õÄÁÌÉÔØ ÐÏÄÐÉÓØ. 
+.IP "revuid" 10 
+ïÔÏÚ×ÁÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "addkey" 10 
+äÏÂÁ×ÉÔØ ÐÏÄËÌÀÞ Ë ÔÅËÕÝÅÍÕ ËÌÀÞÕ. 
+.IP "addcardkey" 10 
+óÇÅÎÅÒÉÒÏ×ÁÔØ ËÌÀÞ ÎÁ ËÁÒÔÅ É ÄÏÂÁ×ÉÔØ ÅÇÏ Ë ÄÁÎÎÏÍÕ ËÌÀÞÕ. 
+.IP "keytocard" 10 
+ðÅÒÅÍÅÓÔÉÔØ ×ÙÂÒÁÎÎÙÊ ÓÅËÒÅÔÎÙÊ ËÌÀÞ (ÉÌÉ ÐÅÒ×ÉÞÎÙÊ ËÌÀÞ, ÅÓÌÉ ÎÉ ÏÄÉΠ 
+ËÌÀÞ ÎÅ ×ÙÂÒÁÎ) ÎÁ ÓÍÁÒÔËÁÒÔÕ. óÅËÒÅÔÎÙÊ ËÌÀÞ × Ó×ÑÚËÅ ËÌÀÞÅÊ ÂÕÄÅÔ 
+ÚÁÍÅΣΠÚÁÇÌÕÛËÏÊ × ÓÌÕÞÁÅ ÕÓÐÅÛÎÏÇÏ ÅÇÏ ÓÏÈÒÁÎÅÎÉÑ ÎÁ ËÁÒÔÅ, É ÅÓÌÉ ÷Ù 
+ÐÏÚÖÅ ÉÓÐÏÌØÚÕÅÔÅ ËÏÍÁÎÄÕ save. ôÏÌØËÏ ËÌÀÞÉ ÏÐÒÅÄÅÌ£ÎÎÙÈ ÔÉÐÏ× ÍÏÇÕÔ 
+ÂÙÔØ ÐÅÒÅÍÅÝÅÎÙ ÎÁ ËÁÒÔÕ. ðÏÄÍÅÎÀ ÐÏÚ×ÏÌÉÔ ÷ÁÍ ×ÙÂÒÁÔØ ËÁÒÔÕ ÎÁ ËÏÔÏÒÕÀ 
+÷Ù ÈÏÔÉÔÅ ÓÏÈÒÁÎÉÔØ ËÌÀÞ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÏÌÕÞÉÔØ ËÌÀÞ Ó ËÁÒÔÙ ÏÂÒÁÔÎÏ 
+ÎÅ×ÏÚÍÏÖÎÏ \- ÅÓÌÉ ËÁÒÔÁ ÂÕÄÅÔ ÐÏÔÅÒÑÎÁ ÉÌÉ ÐÏ×ÒÅÖÄÅÎÁ, ÔÏ ÷ÁÛ ÓÅËÒÅÔÎÙÊ 
+ËÌÀÞ ÂÕÄÅÔ ÕÔÒÁÞÅÎ, ÅÓÌÉ ÏÔÓÕÔÓÔ×ÕÅÔ ÒÅÚÅÒ×ÎÁÑ ËÏÐÉÑ. 
+.IP "delkey" 10 
+õÄÁÌÉÔØ ÐÏÄËÌÀÞ. 
+.IP "addrevoker [sensitive]" 10 
+äÏÂÁ×ÉÔØ ÎÁÚÎÁÞÅÎÎÏÇÏ ÄÌÑ ÏÔÚÙ×Á. éÍÅÅÔ ÏÄÉΠÎÅÏÂÑÚÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ: 
+"sensitive".  åÓÌÉ ÎÁÚÎÁÞÅÎÎÙÊ ÄÌÑ ÏÔÚÙ×Á ÐÏÍÅÞÅΠËÁË sensitive, ÔÏ ÏΠ
+ÎÅ ÂÕÄÅÔ ÜËÓÐÏÒÔÉÒÏ×ÁÔØÓÑ ÐÏ ÕÍÏÌÞÁÎÉÀ (ÓÍ. export-options). 
+.IP "revkey" 10 
+ïÔÏÚ×ÁÔØ ÐÏÄËÌÀÞ. 
+.IP "expire" 10 
+éÚÍÅÎÉÔØ ÓÒÏË ÄÅÊÓÔ×ÉÑ ËÌÀÞÁ. åÓÌÉ ÉÍÅÅÔÓÑ ×ÙÂÒÁÎÎÙÊ ÐÏÄËÌÀÞ, ÔÏ ÉÚÍÅÎÑÅÔÓÑ 
+ÓÒÏË ÄÅÊÓÔ×ÉÑ ÜÔÏÇÏ ÐÏÄËÌÀÞÁ. åÓÌÉ ÎÉ ÏÄÉΠÐÏÄËÌÀÞ ÎÅ ×ÙÂÒÁÎ, ÔÏ ÉÚÍÅÎÑÅÔÓÑ 
+ÓÒÏË ÄÅÊÓÔ×ÉÑ ÐÅÒ×ÉÞÎÏÇÏ ËÌÀÞÁ. 
+.IP "passwd" 10 
+éÚÍÅÎÉÔØ ÐÁÒÏÌØ, ËÏÔÏÒÙÍ ÚÁÝÉݣΠÓÅËÒÅÔÎÙÊ ËÌÀÞ. 
+.IP "primary" 10 
+ðÏÍÅÔÉÔØ ÔÅËÕÝÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ, ËÁË ÐÅÒ×ÉÞÎÙÊ. åÓÌÉ ÐÅÒ×ÉÞÎÙÍ 
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÔÏ ÏΠ 
+ÓÔÁÎÏ×ÉÔÓÑ ÐÅÒ×ÉÞÎÙÍ ÐÏ ÏÔÎÏÛÅÎÉÀ Ë ÏÓÔÁÌØÎÙÍ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÍ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍ. åÓÌÉ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÒÅÇÕÌÑÒÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ, ÔÏ ÏΠ
+ÓÔÁÎÏ×ÉÔÓÑ ÐÅÒ×ÉÞÎÙÍ ÐÏ ÏÔÎÏÛÅÎÉÀ Ë ÏÓÔÁÌØÎÙÍ ÒÅÇÕÌÑÒÎÙÍ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍ. 
+.IP "uid \fBn\fR" 10 
+õÓÔÁÎÏ×ÉÔØ/ÓÎÑÔØ ×ÙÂÏÒ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ Ó ÎÏÍÅÒÏÍ \fBn\fR. 
+úÎÁÞÅÎÉÅ 0 ÏÔÍÅÎÑÅÔ ×ÙÂÏÒ ×ÓÅÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ×. 
+.IP "key \fBn\fR" 10 
+õÓÔÁÎÏ×ÉÔØ/ÓÎÑÔØ ×ÙÂÏÒ ËÌÀÞÁ Ó ÎÏÍÅÒÏÍ \fBn\fR. 
+úÎÁÞÅÎÉÅ 0 ÏÔÍÅÎÑÅÔ ×ÙÂÏÒ ×ÓÅÈ ËÌÀÞÅÊ. 
+.IP "check" 10 
+ðÒÏ×ÅÒÉÔØ ×ÙÂÒÁÎÎÙÅ (×ÓÅ, ÅÓÌÉ ÎÉ ÏÄÉΠÎÅ ×ÙÂÒÁÎ) ÉÄÅÎÔÉÆÉËÁÔÏÒÙ  
+ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "showphoto" 10 
+ïÔÏÂÒÁÚÉÔØ ×ÙÂÒÁÎÎÙÊ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "pref" 10 
+÷Ù×ÅÓÔÉ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ×ÙÂÒÁÎÎÏÇÏ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+ðÏËÁÚÙ×ÁÅÔ ÄÅÊÓÔ×ÉÔÅÌØÎÙÊ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ, ÎÅ ×ËÌÀÞÁÑ ËÁËÉÅ\-ÌÉÂÏ 
+ÐÏÄÒÁÚÕÍÅ×ÁÅÍÙÅ ÐÒÅÄÐÏÞÔÅÎÉÑ. 
+.IP "showpref" 10 
+÷Ù×ÅÓÔÉ ÂÏÌÅÅ ÐÏÄÒÏÂÎÙÊ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ×ÙÂÒÁÎÎÏÇÏ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÎÅÖÅÌÉ pref. ðÏËÁÚÙ×ÁÅÔ ÄÅÊÓÔ×ÕÀÝÉÅ 
+ÐÒÅÄÐÏÞÔÅÎÉÑ, ×ËÌÀÞÁÑ ÐÏÄÒÁÚÕÍÅ×ÁÅÍÙÅ 3DES (ÄÌÑ ÛÉÆÒÏ×ÁÎÉÑ), SHA-1 
+(ÈÜÛ\-ÆÕÎËÃÉÑ) É Uncompressed (ÓÖÁÔÉÅ), ÅÓÌÉ ÏÎÉ ÎÅ ÄÏÂÁ×ÌÅÎÙ × ÓÐÉÓÏË 
+ÐÒÅÄÐÏÞÔÅÎÉÊ. 
+.IP "setpref \fBstring\fR" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ × 
+\fBstring\fR. \fBstring\fR ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÏÊ ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ 
+×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ "pref". éÓÐÏÌØÚÕÑ ÐÕÓÔÕÀ ÓÔÒÏËÕ ÍÏÖÎÏ ÓÂÒÏÓÉÔØ ÓÐÉÓÏË 
+ÐÒÅÄÐÏÞÔÅÎÉÊ Ë ÕÓÔÁÎÏ×ËÁÍ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÉÓÐÏÌØÚÕÑ ÚÎÁÞÅÎÉÅ "none" ÍÏÖÎÏ 
+ÏÂÎÕÌÉÔØ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ. äÌÑ ÐÏÌÕÞÅÎÉÑ ÓÐÉÓËÁ ÄÏÓÔÕÐÎÙÈ ÁÌÇÏÒÉÔÍÏ× 
+ÍÏÖÎÏ ×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ËÏÍÁÎÄÏÊ "gpg \-\-version". äÁÎÎÁÑ ËÏÍÁÎÄÁ ÔÏÌØËÏ  
+ÉÎÉÃÉÁÌÉÚÉÒÕÅÔ ×ÎÕÔÒÅÎÎÉÊ ÓÐÉÓÏË É ÎÉÞÅÇÏ ÎÅ ÉÚÍÅÎÑÅÔ, ÐÏËÁ ÎÅ ÂÕÄÅÔ  
+×ÙÐÏÌÎÅÎÁ ÄÒÕÇÁÑ ËÏÍÁÎÄÁ (ÔÁËÁÑ, ËÁË updpref) , ËÏÔÏÒÁÑ ÉÚÍÅÎÑÅÔ ÓÁÍÏÐÏÄÐÉÓÉ. 
+.IP "updpref" 10 
+éÚÍÅÎÑÅÔ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ×ÓÅÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ (ÉÌÉ 
+ÔÏÌØËÏ ÄÌÑ ×ÙÂÒÁÎÎÙÈ) × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÔÅËÕÝÉÍ ÓÐÉÓËÏÍ ÐÒÅÄÐÏÞÔÅÎÉÊ. 
+íÅÔËÁ ×ÒÅÍÅÎÉ ÄÌÑ ×ÓÅÈ ÚÁÔÒÏÎÕÔÙÈ ÉÚÍÅÎÅÎÉÅÍ ÓÁÍÏÐÏÄÐÉÓÅÊ Õ×ÅÌÉÞÉ×ÁÅÔÓÑ 
+ÎÁ ÏÄÎÕ ÓÅËÕÎÄÕ. úÁÍÅÔØÔÅ, ÞÔÏ ÈÏÔÑ ÷Ù ÍÏÖÅÔÅ ÉÚÍÅÎÉÔØ ÐÒÅÄÐÏÞÔÅÎÉÑ ÄÌÑ 
+ÁÔÒÉÂÕÔÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ (ÔÁËÉÈ ËÁË ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒ), GnuPG ÎÅ ÐÏÚ×ÏÌÑÅÔ ×ÙÂÉÒÁÔØ ËÌÀÞÉ ÐÏ ÁÔÒÉÂÕÔÎÙÍ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍ, É, ÓÌÅÄÏ×ÁÔÅÌØÎÏ, ÜÔÉ ÐÒÅÄÐÏÞÔÅÎÉÑ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÎÅ 
+ÂÕÄÕÔ. 
+.IP "keyserver" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÓÅÒ×ÅÒ ËÌÀÞÅÊ ÄÌÑ ÚÁÄÁÎÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× 
+ÐÏÌØÚÏ×ÁÔÅÌÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÓÏÏÂÝÉÔØ ÄÒÕÇÉÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ ÇÄÅ ÷Ù 
+ÐÒÅÄÐÏÞÉÔÁÅÔÅ, ÞÔÏÂÙ ÏÎÉ ÂÒÁÌÉ ÷ÁÛ ËÌÀÞ (ÓÍ. ÐÏÄÒÏÂÎÏÓÔÉ × ÏÐÉÓÁÎÉÉ 
+\-\-keyserver-option honor-keyserver-url). úÁÍÅÔØÔÅ, ÞÔÏ ÎÅËÏÔÏÒÙÅ 
+×ÅÒÓÉÉ PGP ×ÏÓÐÒÉÎÉÍÁÀÔ ÎÁÌÉÞÉÅ URL ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ËÁË ÕËÁÚÁÎÉÅ Ë 
+ÉÓÐÏÌØÚÏ×ÁÎÉÀ PGP/MIME ÐÒÉ ÏÔÐÒÁ×ËÅ ÐÏÞÔÙ. äÌÑ ÕÄÁÌÅÎÉÑ ÓÕÝÅÓÔ×ÕÀÝÅÊ  
+ÚÁÐÉÓÉ Ï ÐÒÅÄÐÏÞÉÔÁÅÍÏÍ ÓÅÒ×ÅÒÅ ÉÓÐÏÌØÚÕÊÔÅ ÚÎÁÞÅÎÉÅ "none". 
+.IP "toggle" 10 
+ðÅÒÅËÌÀÞÅÎÉÅ ÍÅÖÄÕ ÏÔËÒÙÔÙÍ É ÓÅËÒÅÔÎÙÍ ËÌÀÞÁÍÉ. 
+.IP "save" 10 
+óÏÈÒÁÎÉÔ ×ÓÅ ÉÚÍÅÎÅÎÉÑ × ÎÁÂÏÒÅ ËÌÀÞÅÊ É ×ÙÊÔÉ. 
+.IP "quit" 10 
+÷ÙÊÔÉ ÉÚ ÐÒÏÇÒÁÍÍÙ ÎÅ ÓÏÈÒÁÎÑÑ ÉÚÍÅÎÅÎÉÑ × ÎÁÂÏÒÅ ËÌÀÞÅÊ. 
+.RE 
+.IP "" 10 
+ìÉÓÔÉÎÇ ÐÏËÁÚÙ×ÁÅÔ ÷ÁÍ ËÌÀÞ Ó ÅÇÏ ÐÏÄËÌÀÞÁÍÉ É ×ÓÅÍÉ ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍÉ 
+ÐÏÌØÚÏ×ÁÔÅÌÑ. ÷ÙÂÒÁÎÎÙÅ ËÌÀÞÉ ÉÌÉ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ ÕËÁÚÁÎÙ 
+Ú×£ÚÄÏÞËÏÊ. úÎÁÞÅÎÉÅ ÄÏ×ÅÒÉÑ ×Ù×ÏÄÉÔÓÑ ÒÑÄÏÍ Ó ÐÅÒ×ÉÞÎÙÍ ËÌÀÞÏÍ: ÐÅÒ×ÙÊ 
+ÓÉÍ×ÏÌ ÏÂÏÚÎÁÞÁÅÔ ÕÒÏ×ÅÎØ ÄÏ×ÅÒÉÑ, ÐÒÉÓ×ÏÅÎÎÙÊ ×ÌÁÄÅÌØÃÕ ËÌÀÞÁ, Á ×ÔÏÒÏÊ 
+×ÙÞÉÓÌÅÎÎÏÅ ÚÎÁÞÅÎÉÅ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ ËÌÀÞÁ. óÉÍ×ÏÌÙ ÉÍÅÀÔ ÓÌÅÄÕÀÝÅÅ 
+ÚÎÁÞÅÎÉÅ: 
+.RS 
+.IP "\-" 10 
+ÄÏ×ÅÒÉÅ ÎÅ ÐÒÉÓ×ÏÅÎÏ / ÄÏÓÔÏ×ÅÒÎÏÓÔØ ÎÅ ×ÙÞÉÓÌÅÎÁ. 
+.IP "e" 10 
+÷ÙÞÉÓÌÅÎÉÅ 
+ÄÏÓÔÏ×ÅÒÎÏÓÔÉ ÚÁ×ÅÒÛÉÌÏÓØ Ó ÏÛÉÂËÏÊ; ×ÏÚÍÏÖÎÏ ÉÚ\-ÚÁ ÐÒÏÓÒÏÞÅÎÎÏÇÏ 
+ËÌÀÞÁ. 
+.IP "q" 10 
+îÅ ÄÏÓÔÁÔÏÞÎÏ ÉÎÆÏÒÍÁÃÉÉ ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ. 
+.IP "n" 10 
+îÅÔ ÄÏ×ÅÒÉÑ ×ÌÁÄÅÌØÃÕ ËÌÀÞÁ. 
+.IP "m" 10 
+ïÇÒÁÎÉÞÅÎÎÙÊ ÕÒÏ×ÅÎØ ÄÏ×ÅÒÉÑ/ÄÏÓÔÏ×ÅÒÎÏÓÔÉ. 
+.IP "f" 10 
+ðÏÌÎÏÅ ÄÏ×ÅÒÉÅ/ÄÏÓÔÏ×ÅÒÎÏÓÔØ. 
+.IP "u" 10 
+âÅÚÏÇÏ×ÏÒÏÞÎÏÅ ÄÏ×ÅÒÉÅ/ÄÏÓÔÏ×ÅÒÎÏÓÔØ. 
+.RE 
+.IP "\-\-sign-key \fBname\fR" 10 
+ðÏÄÐÉÓÁÔØ ÏÔËÒÙÔÙÊ ËÌÀÞ ÷ÁÛÉÍ ÓÅËÒÅÔÎÙÍ ËÌÀÞÏÍ. ôÏ ÖÅ, ÞÔÏ É ÐÏÄËÏÍÁÎÄÁ 
+"sign" ËÏÍÁÎÄÙ \-\-edit-key. 
+.IP "\-\-lsign-key \fBname\fR" 10 
+ðÏÄÐÉÓÁÔØ ÏÔËÒÙÔÙÊ ËÌÀÞ ÷ÁÛÉÍ ÓÅËÒÅÔÎÙÍ ËÌÀÞÏÍ ÌÏËÁÌØÎÏ.  
+ôÏ ÖÅ, ÞÔÏ É ÐÏÄËÏÍÁÎÄÁ 
+"lsign" ËÏÍÁÎÄÙ \-\-edit-key. 
+.IP "\-\-delete-key \fBname\fR" 10 
+õÄÁÌÉÔØ ËÌÀÞ ÉÚ ÎÁÂÏÒÁ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. ÷ ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ ÔÒÅÂÕÅÔÓÑ ÌÉÂÏ 
+ÉÓÐÏÌØÚÏ×ÁÔØ \-\-yes, ÌÉÂÏ ÚÁÄÁ×ÁÔØ ËÌÀÞ ÅÇÏ ÏÔÐÅÞÁÔËÏÍ. üÔÏ ÚÁÝÉÔÁ ÐÒÏÔÉ× 
+ÓÌÕÞÁÊÎÏÇÏ ÕÄÁÌÅÎÉÑ ËÌÀÞÅÊ. 
+.IP "\-\-delete-secret-key \fBname\fR" 10 
+õÄÁÌÉÔØ ËÌÀÞ ÉÚ ÎÁÂÏÒÏ× ÓÅËÒÅÔÎÙÈ É ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. ÷ ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ 
+ËÌÀÞ ÄÏÌÖÅΠÂÙÔØ ÚÁÄÁΠÏÔÐÅÞÁÔËÏÍ. 
+.IP "\-\-delete-secret-and-public-key \fBname\fR" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-delete-key, ÎÏ ÅÓÌÉ ÓÕÝÅÓÔ×ÕÅÔ ÓÅËÒÅÔÎÙÊ ËÌÀÞ,  
+ÔÏ ÓÎÁÞÁÌÁ ÂÕÄÅÔ ÕÄẠ́ΠÏÎ. ÷ ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ ËÌÀÞ ÄÏÌÖÅΠÂÙÔØ ÚÁÄÁΠ
+ÏÔÐÅÞÁÔËÏÍ. 
+.IP "\-\-gen-revoke \fBname\fR" 10 
+çÅÎÅÒÉÒÏ×ÁÔØ ÏÔÚÙ×ÁÀÝÉÊ ÓÅÒÔÉÆÉËÁÔ ÄÌÑ ×ÓÅÇÏ ËÌÀÞÁ. äÌÑ ÏÔÚÙ×Á ÐÏÄËÌÀÞÁ 
+ÉÌÉ ÐÏÄÐÉÓÉ ÉÓÐÏÌØÚÕÊÔÅ ËÏÍÁÎÄÕ \-\-edit-key. 
+.IP "\-\-desig-revoke \fBname\fR" 10 
+çÅÎÅÒÉÒÏ×ÁÔØ ÎÁÚÎÁÞÅÎÎÙÊ ÓÅÒÔÉÆÉËÁÔ ÏÔÚÙ×Á ÄÌÑ ËÌÀÞÁ. üÔÏ ÐÏÚ×ÏÌÑÅÔ 
+ÐÏÌØÚÏ×ÁÔÅÌÀ (Ó ÒÁÚÒÅÛÅÎÉÑ ×ÌÁÄÅÌØÃÁ ËÌÀÞÁ) ÏÔÏÚ×ÁÔØ ÞÅÊ\-ÌÉÂÏ ËÌÀÞ. 
+.IP "\-\-export [\fBnames\fR]" 10 
+ìÉÂÏ ÜËÓÐÏÒÔÉÒÏ×ÁÔØ ×ÓÅ ËÌÀÞÉ ÉÚ ×ÓÅÈ ÎÁÂÏÒÏ× ËÌÀÞÅÊ (ÎÁÂÏÒÏ× ÐÏ 
+ÕÍÏÌÞÁÎÉÀ É ÔÅÈ ËÏÔÏÒÙÅ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÎÙ ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÁ 
+\-\-keyring), ÉÌÉ, ÅÓÌÉ ÚÁÄÁÎÏ ÈÏÔÑ ÂÙ ÏÄÎÏ ÉÍÑ, ÔÅ ËÌÀÞÉ ÉÍÅÎÁ ËÏÔÏÒÙÈ 
+ÚÁÄÁÎÙ × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. ðÏÌÕÞÅÎÎÙÊ × ÒÅÚÕÌØÔÁÔÅ ÎÁÂÏÒ ËÌÀÞÅÊ 
+×Ù×ÏÄÉÔÓÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ ÉÌÉ × ÆÁÊÌ ÚÁÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒÏÍ "output". 
+åÓÌÉ ÷Ù ÎÁÍÅÒÅÎÙ ÏÔÐÒÁ×ÉÔØ ËÌÀÞÉ ÐÏ ÐÏÞÔÅ, ÔÏ ÉÓÐÏÌØÚÕÊÔÅ ÓÏ×ÍÅÓÔÎÏ Ó 
+ÐÁÒÁÍÅÔÒÏÍ \-\-armor. 
+.IP "\-\-send-keys [\fBnames\fR]" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-export ÎÏ ÐÏÓÙÌÁÅÔ ËÌÀÞÉ ÎÁ ÓÅÒ×ÅÒ ËÌÀÞÅÊ. 
+äÌÑ ÚÁÄÁÎÉÑ ÉÍÅÎÉ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒ 
+\-\-keyserver. îÅ ÏÔÐÒÁ×ÌÑÊÔÅ ÎÁ ÓÅÒ×ÅÒ Ó×ÏÊ ÎÁÂÏÒ ËÌÀÞÅÊ ÐÏÌÎÏÓÔØÀ \- 
+×ÙÂÅÒÉÔÅ ÔÏÌØËÏ ÔÅ ËÌÀÞÉ, ËÏÔÏÒÙÅ ÂÙÌÉ ÄÏÂÁ×ÌÅÎÙ ÉÌÉ ÉÚÍÅÎÅÎÙ ÷ÁÍÉ. 
+.IP "\-\-export-secret-keys [\fBnames\fR]" 10 
+.IP "\-\-export-secret-subkeys [\fBnames\fR]" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-export, ÎÏ ÜËÓÐÏÒÔÉÒÕÅÔ ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ. éÓÐÏÌØÚÕÅÔÓÑ 
+ÒÅÄËÏ É ÒÉÓËÏ×ÁÎÁ Ó ÔÏÞËÉ ÚÒÅÎÉÑ ÂÅÚÏÐÁÓÎÏÓÔÉ. ÷ÔÏÒÁÑ ÆÏÒÍÁ ËÏÍÁÎÄÙ 
+ÄÅÌÁÅÔ ÓÅËÒÅÔÎÕÀ ÞÁÓÔØ ÐÅÒ×ÉÞÎÏÇÏ ËÌÀÞÁ, × ×Ù×ÏÄÉÍÏÍ ÒÅÚÕÌØÔÁÔÅ, 
+ÎÅÐÒÉÇÏÄÎÏÊ; ÜÔÏ ÒÁÓÛÉÒÅÎÉÅ GNU ÄÌÑ ÓÔÁÎÄÁÒÔÁ OpenPGP É ÄÒÕÇÉÅ 
+ÒÅÁÌÉÚÁÃÉÉ ÎÅ ÓÍÏÇÕÔ ÕÓÐÅÛÎÏ ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÔÁËÉÅ ËÌÀÞÉ. 
+ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÐÁÒÁÍÅÔÒ \-\-simple-sk-checksum, ÅÓÌÉ ÷Ù ÈÏÔÉÔÅ 
+ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÐÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ × ÓÔÁÒÕÀ ÒÅÁÌÉÚÁÃÉÀ OpenPGP. 
+.IP "\-\-import [\fBfiles\fR]" 10 
+.IP "\-\-fast-import [\fBfiles\fR]" 10 
+éÍÐÏÒÔÉÒÏ×ÁÔØ/ÏÂßÅÄÉÎÉÔØ ËÌÀÞÉ. üÔÁ ËÏÍÁÎÄÁ ÄÏÂÁ×ÌÑÅÔ ×ÙÂÒÁÎÎÙÅ ËÌÀÞÉ Ë 
+ÎÁÂÏÒÕ ËÌÀÞÅÊ. \-\-fast-import, × ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ Ñ×ÌÑÅÔÓÑ ÐÒÏÓÔÏ 
+ÓÉÎÏÎÉÍÏÍ ÄÌÑ \-\-import. 
+.IP "" 10 
+éÍÅÅÔÓÑ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ×, ËÏÎÔÒÏÌÉÒÕÀÝÉÈ ÒÁÂÏÔÕ ËÏÍÁÎÄÙ. îÁÉÂÏÌÅÅ 
+ÚÎÁÞÉÍÙÊ ÓÒÅÄÉ ÎÉÈ \- ÐÁÒÁÍÅÔÒ \-\-keyserver-option \-\-merge-only, ËÏÔÏÒÙÊ 
+ÐÒÅÄÏÔ×ÒÁÝÁÅÔ ÄÏÂÁ×ÌÅÎÉÅ ÎÏ×ÙÈ ËÌÀÞÅÊ É ÄÏÐÕÓËÁÅÔ ÔÏÌØËÏ ÄÏÂÁ×ÌÅÎÉÅ ÎÏ×ÙÈ 
+ÐÏÄÐÉÓÅÊ, ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ É ÐÏÄËÌÀÞÅÊ Ë ÕÖÅ ÉÍÅÀÝÉÍÓÑ ËÌÀÞÁÍ. 
+.IP "\-\-recv-keys \fBkey IDs\fR" 10 
+éÍÐÏÒÔÉÒÏ×ÁÔØ ËÌÀÞÉ Ó ÚÁÄÁÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ Ó ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. 
+äÌÑ ÕËÁÚÁÎÉÑ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒ \-\-keyserver. 
+.IP "\-\-refresh-keys \fBkey IDs\fR" 10 
+úÁÐÒÏÓÉÔØ Ó ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÏÂÎÏ×ÌÅÎÉÑ ÄÌÑ ËÌÀÞÅÊ, ËÏÔÏÒÙÅ ÕÖÅ ÉÍÅÀÔÓÑ × 
+ÌÏËÁÌØÎÙÈ Ó×ÑÚËÁÈ. ðÒÉÍÅÎÉÍÏ ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÎÏ×ÙÈ ÐÏÄÐÉÓÅÊ, 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÅÊ É Ô.Ä. ÷ÙÚÏ× ËÏÍÁÎÄÙ ÂÅÚ ÐÁÒÁÍÅÔÒÁ ÐÒÉ×ÅÄ£Ô 
+Ë ÏÂÎÏ×ÌÅÎÉÀ ×ÓÅÊ Ó×ÑÚËÉ ËÌÀÞÅÊ. îÅÏÂÈÏÄÉÍÏ ÚÁÄÁÔØ ÐÁÒÁÍÅÔÒ  
+\-\-keyserver, ÞÔÏÂÙ ÕËÁÚÁÔØ ÓÅÒ×ÅÒ ËÌÀÞÅÊ ÄÌÑ ×ÓÅÈ ËÌÀÞÅÊ, × ËÏÔÏÒÙÈ ÎÅ 
+ÕËÁÚÁΠÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÓÅÒ×ÅÒ ËÌÀÞÅÊ  
+(ÓÍ. \-\-keyserver-option honor-keyserver-url). 
+.IP "\-\-search-keys [\fBnames\fR]" 10 
+ðÏÉÓË ÐÏ ÕËÁÚÁÎÎÙÍ ÉÍÅÎÁÍ ÎÁ ÓÅÒ×ÅÒÅ ËÌÀÞÅÊ. îÅÓËÏÌØËÏ ÉÍ£Î, ÚÁÄÁÎÎÙÈ × 
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ, ÏÂßÅÄÉÎÑÀÔÓÑ ×ÍÅÓÔÅ ÄÌÑ ÓÏÚÄÁÎÉÑ ÓÔÒÏËÉ ÐÏÉÓËÁ. 
+äÌÑ ÕËÁÚÁÎÉÑ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒ \-\-keyserver. 
+.IP "\-\-update-trustdb" 10 
+éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÐÏÄÄÅÒÖËÉ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ. äÁÎÎÁÑ ËÏÍÁÎÄÁ 
+ÐÒÏÓÍÁÔÒÉ×ÁÅÔ ×ÓÅ ÉÍÅÀÝÉÅÓÑ ËÌÀÞÉ É ÓÔÒÏÉÔ ÓÅÔØ ÄÏ×ÅÒÉÑ (Web of Trust). 
+äÁÎÎÁÑ ËÏÍÁÎÄÁ Ñ×ÌÑÅÔÓÑ ÉÎÔÅÒÁËÔÉ×ÎÏÊ, Ô.Ë. ÏÎÁ ÍÏÖÅÔ ÚÁÐÒÁÛÉ×ÁÔØ Ï 
+÷ÁÛÅÍ ÕÒÏ×ÎÅ ÄÏ×ÅÒÉÑ ×ÌÁÄÅÌØÃÁÍ ËÌÀÞÅÊ. ðÏÌØÚÏ×ÁÔÅÌØ ÍÏÖÅÔ ÕËÁÚÁÔØ 
+ÎÁÓËÏÌØËÏ ÏΠÄÏ×ÅÒÑÅÔ ×ÌÁÄÅÌØÃÕ ÕËÁÚÁÎÎÏÇÏ ËÌÀÞÁ × ×ÏÐÒÏÓÁÈ ÐÒÏ×ÅÒËÉ É 
+ÓÅÒÔÉÆÉËÁÃÉÉ (ÐÏÄÐÉÓÉ) ÄÒÕÇÉÈ ËÌÀÞÅÊ. úÁÐÒÏÓ ×ÙÄÁ£ÔÓÑ ÔÏÌØËÏ × ÔÏÍ 
+ÓÌÕÞÁÅ, ÅÓÌÉ ÄÁÎÎÏÍÕ ËÌÀÞÕ ÅÝ£ ÎÅ ÂÙÌÏ ÐÒÉÓ×ÏÅÎÏ ÚÎÁÞÅÎÉÅ ÄÏ×ÅÒÉÑ. ðÒÉ 
+ÐÏÍÏÝÉ ËÏÍÁÎÄÙ \-\-edit-key ÍÏÖÎÏ ÐÏÚÖÅ ÉÚÍÅÎÉÔØ ÄÁÎÎÏÅ ÚÎÁÞÅÎÉÅ. 
+.IP "\-\-check-trustdb" 10 
+÷ÙÐÏÌÎÑÅÔ ÐÒÏ×ÅÒËÕ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÂÅÚ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó 
+ÐÏÌØÚÏ×ÁÔÅÌÅÍ. ðÅÒÉÏÄÉÞÅÓËÉ ÂÁÚÁ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÄÏÌÖÎÁ ÏÂÎÏ×ÌÑÔØÓÑ, 
+ÞÔÏÂÙ ÏÔÓÌÅÖÉ×ÁÔØ ÉÓÔ£ËÛÉÅ ËÌÀÞÉ É ÐÏÄÐÉÓÉ É ×ÎÏÓÉÔØ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ 
+ÉÚÍÅÎÅÎÉÑ × ÓÅÔØ ÄÏ×ÅÒÉÑ. GnuPG ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÏÔÓÌÅÖÉ×ÁÅÔ ÔÁËÉÅ  
+ÓÉÔÕÁÃÉÉ É ÏÂÎÏ×ÌÑÅÔ ÂÁÚÕ Á×ÔÏÍÁÔÉÞÅÓËÉ, ÅÓÌÉ ÎÅ ÕÓÔÁÎÏ×ÌÅΠÐÁÒÁÍÅÔÒ 
+\-\-no-auto-check-trustdb. äÁÎÎÁÑ ËÏÍÁÎÄÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ  
+ÐÒÏ×ÅÒËÉ ÐÒÉÎÕÄÉÔÅÌØÎÏ, × ÌÀÂÏÅ ×ÒÅÍÑ. ÷ÙÐÏÌÎÑÅÍÙÅ ÄÅÊÓÔ×ÉÑ ÁÎÁÌÏÇÉÞÎÙ 
+ÔÅÍ, ËÏÔÏÒÙÅ ×ÙÐÏÌÎÑÅÔ \-\-update-trustdb, 
+ÎÏ ËÌÀÞÉ Ó ÎÅÏÐÒÅÄÅÌ£ÎÎÙÍ ÕÒÏ×ÎÅÍ ÄÏ×ÅÒÉÑ ÐÒÏÐÕÓËÁÀÔÓÑ. 
+.IP "" 10 
+ðÒÉ ÚÁÐÕÓËÅ Ó ÐÏÍÏÝØÀ cron, ÄÁÎÎÁÑ ËÏÍÁÎÄÁ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó 
+ÐÁÒÁÍÅÔÒÏÍ \-\-batch, × ÜÔÏÍ ÓÌÕÞÁÅ ÐÒÏ×ÅÒËÁ ×ÙÐÏÌÎÑÅÔÓÑ ÔÏÌØËÏ ÅÓÌÉ ÏÎÁ 
+ÎÕÖÎÁ. äÌÑ ÐÒÉÎÕÄÉÔÅÌØÎÏÇÏ ×ÙÐÏÌÎÅÎÉÑ ÐÒÏ×ÅÒËÉ × ÜÔÏÍ ÓÌÕÞÁÅ ÍÏÖÎÏ  
+ÉÓÐÏÌØÚÏ×ÁÔØ ÐÁÒÁÍÅÔÒ \-\-yes. 
+.IP "\-\-export-ownertrust" 10 
+÷Ù×ÏÄÉÔ ÚÎÁÞÅÎÉÑ ÄÏ×ÅÒÉÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ. 
+ðÒÉÍÅÎÉÍÁ × ÃÅÌÑÈ ÁÒÈÉ×ÁÃÉÉ, Ô.Ë. ÜÔÉ ÚÎÁÞÅÎÉÑ ÅÄÉÎÓÔ×ÅÎÎÏÅ, ÞÔÏ ÎÅ 
+ÍÏÖÅÔ ÂÙÔØ ×ÏÓÓÔÁÎÏ×ÌÅÎÏ × ÓÌÕÞÁÅ ÐÏ×ÒÅÖÄÅÎÉÑ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ. 
+.IP "\-\-import-ownertrust [\fBfiles\fR]" 10 
+÷ÎÏÓÉÔ × ÂÁÚÕ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÚÎÁÞÅÎÉÑ ÓÏÈÒÁΣÎÎÙÅ × ÆÁÊÌÅ 
+\fBfiles\fR (ÉÌÉ ÓÞÉÔÙ×ÁÅÔ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ, ÅÓÌÉ ÆÁÊÌ ÎÅ ÚÁÄÁÎ);  
+ÓÕÝÅÓÔ×ÕÀÝÉÅ ÚÎÁÞÅÎÉÑ ÐÅÒÅÚÁÐÉÓÙ×ÁÀÔÓÑ. 
+.IP "\-\-rebuild-keydb-caches" 10 
+ðÒÉ ÏÂÎÏ×ÌÅÎÉÉ Ó ×ÅÒÓÉÉ 1.0.6 ÄÏ 1.0.7 ÜÔÁ ËÏÍÁÎÄÁ ÄÏÌÖÎÁ ÂÙÔØ 
+ÉÓÐÏÌØÚÏ×ÁÎÁ ÄÌÑ ÓÏÚÄÁÎÉÑ ËÜÛÅÊ ÐÏÄÐÉÓÅÊ × ÎÁÂÏÒÅ ËÌÀÞÅÊ. ïÎÁ ÍÏÖÅÔ 
+ÏËÁÚÁÔØÓÑ ÕÄÏÂÎÏÊ É × ÄÒÕÇÉÈ ÓÌÕÞÁÑÈ. 
+.IP "\-\-print-md \fBalgo\fR [\fBfiles\fR]" 10 
+.IP "\-\-print-mds [\fBfiles\fR]" 10 
+÷Ù×ÏÄÉÔ ÚÎÁÞÅÎÉÅ ÈÜÛ\-ÆÕÎËÃÉÉ ALGO ÄÌÑ ËÁÖÄÏÇÏ ÉÚ ÚÁÄÁÎÎÙÈ ÆÁÊÌÏ× ÉÌÉ ÄÌÑ 
+ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ. ÷ÔÏÒÁÑ ÆÏÒÍÁ (ÉÌÉ "*" × ËÁÞÅÓÔ×Å algo × ÐÅÒ×ÏÍ 
+ÓÌÕÞÁÅ) ×Ù×ÏÄÉÔ ÚÎÁÞÅÎÉÑ ×ÓÅÈ ÄÏÓÔÕÐÎÙÈ ÈÜÛ\-ÆÕÎËÃÉÊ. 
+.IP "\-\-gen-random \fB0|1|2\fR                   [\fBcount\fR]" 10 
+÷Ù×ÏÄÉÔ COUNT ÓÌÕÞÁÊÎÙÈ ÂÁÊÔ Ó ÚÁÄÁÎÎÙÍ ÕÒÏ×ÎÅÍ ËÁÞÅÓÔ×Á. åÓÌÉ ÐÁÒÁÍÅÔÒ 
+COUNT ÎÅ ÚÁÄÁΠÉÌÉ ÒÁ×ÅΠÎÕÌÀ, ÔÏ ×Ù×ÏÄÉÔÓÑ ÂÅÓËÏÎÅÞÎÁÑ 
+ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÓÌÕÞÁÊÎÙÈ ÂÁÊÔ. ðòåäõðòåöäåîéå! îÅ ÉÓÐÏÌØÚÕÊÔÅ ÜÔÕ 
+ËÏÍÁÎÄÕ ÂÅÚ ÎÅÏÂÈÏÄÉÍÏÓÔÉ; ÜÔÏ ÍÏÖÅÔ ÕÍÅÎØÛÉÔØ ÞÉÓÌÏ ÓÌÕÞÁÊÎÙÈ ÄÁÎÎÙÈ 
+ÄÏÓÔÕÐÎÙÈ ÓÉÓÔÅÍÅ! 
+.IP "\-\-gen-prime \fBmode\fR            \fBbits\fR               [\fBqbits\fR]" 10 
+çÅÎÅÒÉÒÕÅÔ ÐÒÏÓÔÏÅ ÞÉÓÌÏ. ðÏÄÒÏÂÎÏÓÔÉ ÓÍ. × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ. 
+.IP "\-\-version" 10 
+÷Ù×ÏÄÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ ÐÒÏÇÒÁÍÍÙ É ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ 
+ÁÌÇÏÒÉÔÍÏ×. 
+.IP "\-\-warranty" 10 
+÷Ù×ÏÄÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ÇÁÒÁÎÔÉÑÈ. 
+.IP "\-h, \-\-help" 10 
+÷Ù×ÏÄÉÔ ËÒÁÔËÕÀ ÓÐÒÁ×ËÕ ÐÏ ÉÓÐÏÌØÚÏ×ÁÎÉÀ ËÏÍÁÎÄÙ. óÐÉÓÏË ÄÏ×ÏÌØÎÏ 
+ÄÌÉÎÎÙÊ, ÈÏÔÑ É ÎÅ ×ËÌÀÞÁÅÔ ÏÐÉÓÁÎÉÑ ×ÓÅÈ ÐÁÒÁÍÅÔÒÏ×. äÌÑ ÐÏÌÕÞÅÎÉÑ 
+ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÊ ÉÎÆÏÒÍÁÃÉÉ, ÏÂÒÁÝÁÊÔÅÓØ Ë ÄÁÎÎÏÍÕ ÒÕËÏ×ÏÄÓÔ×Õ. 
+.SH "ðáòáíåôòù" 
+.PP 
+äÌÉÎÎÙÅ ÆÏÒÍÙ ÐÁÒÁÍÅÔÒÏ× ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÆÁÊÌÅ ÐÁÒÁÍÅÔÒÏ× (ÐÏ 
+ÕÍÏÌÞÁÎÉÀ "~/.gnupg/gpg.conf"). ëÏÒÏÔËÉÅ ÉÍÅÎÁ ÐÁÒÁÍÅÔÒÏ× ÒÁÂÏÔÁÔØ ÎÅ 
+ÂÕÄÕÔ \- ÎÁÐÒÉÍÅÒ, "armor" ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ × ÆÁÊÌÅ ËÏÎÆÉÇÕÒÁÃÉÉ, Á "Á" 
+ÎÅÌØÚÑ. îÅ ÕËÁÚÙ×ÁÊÔÅ Ä×Á ÎÁÞÁÌØÎÙÈ ÄÅÆÉÓÁ, ÐÒÏÓÔÏ ÉÍÑ ÐÁÒÁÍÅÔÒÁ É ÔÒÅÂÕÅÍÙÅ  
+ÁÒÇÕÍÅÎÔÙ. óÔÒÏËÉ ÎÁÞÉÎÁÀÝÉÅÓÑ ÓÉÍ×ÏÌÏÍ "#" (×ÏÚÍÏÖÎÏ ÐÏÓÌÅ ÎÅÓËÏÌØËÉÈ ÐÒÏÂÅÌÏ×) 
+ÉÇÎÏÒÉÒÕÀÔÓÑ. ëÏÍÁÎÄÙ ÔÁË ÖÅ ÍÏÇÕÔ ÐÏÍÅÝÁÔØÓÑ × ÜÔÏÔ ÆÁÊÌ, ÎÏ ÜÔÏ, × 
+ÏÂÝÅÍ ÓÌÕÞÁÅ, ÎÅ ÉÍÅÅÔ ÓÍÙÓÌÁ. 
+.PP 
+\fBgpg\fR ÒÁÓÐÏÚÎÁ£Ô ÓÌÅÄÕÀÝÉÅ ÐÁÒÁÍÅÔÒÙ: 
+.IP "\-a, \-\-armor" 10 
+óÏÚÄÁ£Ô ×Ù×ÏÄ × ASCII ÆÏÒÍÁÔÅ. 
+.IP "\-o, \-\-output \fBfile\fR" 10 
+óÏÈÒÁÎÑÅÔ ÒÅÚÕÌØÔÁÔ × ÆÁÊÌÅ \fBfile\fR. 
+.IP "\-\-max-output \fBn\fR" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÐÒÅÄÅÌØÎÏÅ ÞÉÓÌÏ ÂÁÊÔÏ×, ËÏÔÏÒÙÅ 
+ÇÅÎÅÒÉÒÕÀÔÓÑ ÐÒÉ ÏÂÒÁÂÏÔËÅ ÆÁÊÌÁ. ðÏÓËÏÌØËÕ OpenPGP ÐÏÄÄÅÒÖÉ×ÁÅÔ 
+ÒÁÚÌÉÞÎÙÅ ÓÔÅÐÅÎÉ ÓÖÁÔÉÑ, ÔÏ ×ÏÚÍÏÖÎÏ, ÞÔÏ ÏÔËÒÙÔÙÊ ÔÅËÓÔ ÓÏÏÂÝÅÎÉÑ 
+ÍÏÖÅÔ ÂÙÔØ ÚÎÁÞÉÔÅÌØÎÏ ÂÏÌØÛÅ ÉÓÈÏÄÎÏÇÏ ÓÏÏÂÝÅÎÉÑ OpenPGP. èÏÔÑ GnuPG 
+ËÏÒÒÅËÔÎÏ ÒÁÂÏÔÁÅÔ Ó ÔÁËÉÍÉ ÆÁÊÌÁÍÉ, ÚÁÞÁÓÔÕÀ ÖÅÌÁÔÅÌØÎÏ ÏÇÒÁÎÉÞÉÔØ 
+ÏÂߣ͠×ÙÄÁ×ÁÅÍÏÊ ÉÎÆÏÒÍÁÃÉÉ. ðÏ ÕÍÏÌÞÁÎÉÀ 0, ÞÔÏ ÏÚÎÁÞÁÅÔ ÏÔÓÕÔÓÔ×ÉÅ 
+ÏÇÒÁÎÉÞÅÎÉÊ. 
+.IP "\-\-mangle-dos-filenames" 10 
+.IP "\-\-no-mangle-dos-filenames" 10 
+óÔÁÒÙÅ ×ÅÒÓÉÉ Windows ÎÅ ÍÏÇÕÔ ÏÂÒÁÂÁÔÙ×ÁÔØ ÉÍÅÎÁ ÆÁÊÌÏ× Ó ÂÏÌÅÅ ÞÅÍ 
+ÏÄÎÏÊ ÔÏÞËÏÊ. \-\-mangle-dos-filenames ÚÁÓÔÁ×ÌÑÅÔ GnuPG ÚÁÍÅÎÑÔØ ÉÍÅÀÝÅÅÓÑ 
+ÒÁÓÛÉÒÅÎÉÅ ÆÁÊÌÁ, Á ÎÅ ÄÏÂÁ×ÌÑÔØ ÅÝ£ ÏÄÎÏ, ÄÌÑ ÏÂÈÏÄÁ ÄÁÎÎÏÊ ÐÒÏÂÌÅÍÙ. 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÔËÌÀÞÅΠÐÏ ÕÍÏÌÞÁÎÉÀ É ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ ÎÁ ÐÌÁÔÆÏÒÍÁÈ 
+ÏÔÌÉÞÎÙÈ ÏÔ Windows. 
+.IP "\-u, \-\-local-user \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÐÏÄÐÉÓÉ ËÌÀÞ \fBname\fR. úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÐÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÁÒÁÍÅÔÒÁ \-\-default-key. 
+.IP "\-\-default-key \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBname\fR × ËÁÞÅÓÔ×Å ËÌÀÞÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÄÌÑ ÐÏÄÐÉÓÅÊ. 
+åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, ÔÏ ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ 
+ÐÅÒ×ÙÊ ËÌÀÞ ÎÁÊÄÅÎÎÙÊ × Ó×ÑÚËÅ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ. 
+úÁÍÅÔØÔÅ, ÞÔÏ \-u ÉÌÉ \-\-local-user ÐÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÄÁÎÎÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-r, \-\-recipient \fBname\fR" 10 
+.IP "" 10 
+úÁÛÉÆÒÏ×ÁÔØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ \fBname\fR. åÓÌÉ ÎÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÉ ÐÁÒÁÍÅÔÒ 
+\-\-hidden-recipient ÎÅ ÕËÁÚÁÎÙ, É ÎÅ ÚÁÄÁΠÐÁÒÁÍÅÔÒ \-\-default-recipient, 
+ÔÏ GnuPG ÚÁÐÒÁÛÉ×ÁÅÔ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "\-R, \-\-hidden-recipient \fBname\fR" 10 
+.IP "" 10 
+úÁÛÉÆÒÏ×ÁÔØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ \fBname\fR, ÎÏ ÓËÒÙÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ. 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÓËÒÙ×ÁÅÔ ÐÏÌÕÞÁÔÅÌÑ ÓÏÏÂÝÅÎÉÑ É Ñ×ÌÑÅÔÓÑ ËÏÎÔÒÍÅÒÏÊ 
+ÐÒÏÔÉ× ÁÎÁÌÉÚÁ ÔÒÁÆÆÉËÁ. åÓÌÉ ÎÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÉ ÐÁÒÁÍÅÔÒ 
+\-\-recipient ÎÅ ÕËÁÚÁÎÙ, É ÎÅ ÚÁÄÁΠÐÁÒÁÍÅÔÒ \-\-default-recipient, 
+ÔÏ GnuPG ÚÁÐÒÁÛÉ×ÁÅÔ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "\-\-default-recipient \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBname\fR ËÁË ÐÏÌÕÞÁÔÅÌÑ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÅÓÌÉ ÎÅ ÚÁÄÁΠ
+ÐÁÒÁÍÅÔÒ \-\-recipient É ÎÅ ×ÙÄÁ×ÁÔØ ÚÁÐÒÏÓ Ï ÐÏÌÕÞÁÔÅÌÅ ÅÓÌÉ ÚÎÁÞÅÎÉÅ  
+\fBname\fR Ñ×ÌÑÅÔÓÑ ÄÏÐÕÓÔÉÍÙÍ. 
+\fBname\fR ÎÅ ÍÏÖÅÔ ÂÙÔØ ÐÕÓÔÙÍ. 
+.IP "\-\-default-recipient-self" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ËÌÀÞ ÐÏ ÕÍÏÌÞÁÎÉÀ ËÁË ÐÏÌÕÞÁÔÅÌÑ, ÅÓÌÉ ÎÅ ÚÁÄÁΠÐÁÒÁÍÅÔÒ 
+\-\-recipient, É ÎÅ ×ÙÄÁ×ÁÔØ ÚÁÐÒÏÓ Ï ÐÏÌÕÞÁÔÅÌÅ ÅÓÌÉ ÚÎÁÞÅÎÉÅ ËÌÀÞÁ  
+Ñ×ÌÑÅÔÓÑ ÄÏÐÕÓÔÉÍÙÍ. ëÌÀÞ ÐÏ ÕÍÏÌÞÁÎÉÀ \- ÜÔÏ ÐÅÒ×ÙÊ × ÓÅËÒÅÔÎÏÍ ÎÁÂÏÒÅ 
+ËÌÀÞÅÊ ÉÌÉ ÔÏÔ, ËÏÔÏÒÙÊ ÚÁÄÁΠÐÁÒÁÍÅÔÒÏÍ \-\-default-key. 
+.IP "\-\-no-default-recipient" 10 
+ïÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÏ× \-\-default-recipient É \-\-default-recipient-self. 
+.IP "\-\-encrypt-to \fBname\fR" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-recipient, ÎÏ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ × ÆÁÊÌÅ 
+ÐÁÒÁÍÅÔÒÏ× É ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÷ÁÛÉÍ ÓÏÂÓÔ×ÅÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ 
+ÐÏÌØÚÏ×ÁÔÅÌÑ. õËÁÚÁÎÎÙÅ ËÌÀÞÉ ÉÓÐÏÌØÚÕÀÔÓÑ ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ 
+ÚÁÄÁÎÙ ÄÒÕÇÉÅ ÐÏÌÕÞÁÔÅÌÉ ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÁ \-\-recipient, ÉÌÉ ÐÏÓÌÅ 
+ÔÏÇÏ ËÁË ÂÙÌ ÚÁÐÒÏÛÅΠÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌÕÞÁÔÅÌÑ. äÌÑ ÕËÁÚÁÎÎÙÈ ËÌÀÞÅÊ  
+ÎÅ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÐÒÏ×ÅÒËÁ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ É ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÁÖÅ 
+ÔÅ, ËÏÔÏÒÙÅ ÏÔËÌÀÞÅÎÙ. 
+.IP "\-\-hidden-encrypt-to \fBname\fR" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-hidden-recipient, ÎÏ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ × ÆÁÊÌÅ 
+ÐÁÒÁÍÅÔÒÏ× É ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÷ÁÛÉÍ ÓÏÂÓÔ×ÅÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ 
+ÐÏÌØÚÏ×ÁÔÅÌÑ ËÁË ÓËÒÙÔÙÊ "encrypt-to-self".   
+õËÁÚÁÎÎÙÅ ËÌÀÞÉ ÉÓÐÏÌØÚÕÀÔÓÑ ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ 
+ÚÁÄÁÎÙ ÄÒÕÇÉÅ ÐÏÌÕÞÁÔÅÌÉ ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÁ \-\-recipient, ÉÌÉ ÐÏÓÌÅ 
+ÔÏÇÏ ËÁË ÂÙÌ ÚÁÐÒÏÛÅΠÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌÕÞÁÔÅÌÑ. äÌÑ ÕËÁÚÁÎÎÙÈ ËÌÀÞÅÊ  
+ÎÅ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÐÒÏ×ÅÒËÁ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ É ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÁÖÅ 
+ÔÅ, ËÏÔÏÒÙÅ ÏÔËÌÀÞÅÎÙ. 
+.IP "\-\-no-encrypt-to" 10 
+ïÔÍÅÎÑÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ËÌÀÞÅÊ ÚÁÄÁÎÎÙÈ ÐÁÒÁÍÅÔÒÁÍÉ \-\-encrypt-to É \-\-hidden-encrypt-to. 
+.IP "\-v, \-\-verbose" 10 
+õ×ÅÌÉÞÉ×ÁÅÔ ÄÅÔÁÌØÎÏÓÔØ ×Ù×ÏÄÁ ÉÎÆÏÒÍÁÃÉÉ. åÓÌÉ ÉÓÐÏÌØÚÕÅÔÓÑ Ä×ÁÖÄÙ, ÔÏ 
+ÄÅÔÁÌØÎÏ ÏÐÉÓÙ×ÁÀÔÓÑ É ×ÈÏÄÎÙÅ ÄÁÎÎÙÅ. 
+.IP "\-q, \-\-quiet" 10 
+õÍÅÎØÛÁÅÔ ËÏÌÉÞÅÓÔ×Ï ×Ù×ÏÄÉÍÏÊ ÉÎÆÏÒÍÁÃÉÉ ÎÁÓËÏÌØËÏ ÜÔÏ ×ÏÚÍÏÖÎÏ. 
+.IP "\-z \fBn\fR" 10 
+.IP "\-\-compress-level \fBn\fR" 10 
+.IP "\-\-bzip2-compress-level \fBn\fR" 10 
+\-\-compress-level ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÕÒÏ×ÅÎØ ÓÖÁÔÉÑ ÒÁ×ÎÙÍ \fBn\fR ÄÌÑ 
+ÁÌÇÏÒÉÔÍÏ× ZIP É ZLIB. ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÕÒÏ×ÅÎØ ÓÖÁÔÉÑ zlib  
+(ÏÂÙÞÎÏ 6). \-\-bzip2-compress-level ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÕÒÏ×ÅÎØ 
+ÓÖÁÔÉÑ ÄÌÑ ÁÌÇÏÒÉÔÍÁ BZIP2 (ÔÁËÖÅ 6 ÐÏ ÕÍÏÌÞÁÎÉÀ). 
+äÌÑ BZIP2 ÓÄÅÌÁΠÏÔÄÅÌØÎÙÊ ÐÁÒÁÍÅÔÒ, 
+ÐÏÓËÏÌØËÕ ÏΠÔÒÅÂÕÅÔ ÚÎÁÞÉÔÅÌØÎÏ ÂÏÌØÛÅÇÏ ÏÂߣÍÁ ÐÁÍÑÔÉ ÐÒÉ Õ×ÅÌÉÞÅÎÉÉ 
+ÕÒÏ×ÎÑ ÓÖÁÔÉÑ. \-z ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÏÂÁ ÐÁÒÁÍÅÔÒÁ. úÎÁÞÅÎÉÅ 0 ÏÔËÌÀÞÁÅÔ 
+ÓÖÁÔÉÅ. 
+.IP "\-\-bzip2-decompress-lowmem" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÁÌØÔÅÒÎÁÔÉ×ÎÙÊ ÁÌÇÏÒÉÔÍ ÄÅËÏÍÐÒÅÓÓÉÉ ÄÌÑ ÆÁÊÌÏ× ÓÖÁÔÙÈ 
+BZIP2. üÔÏÔ ÍÅÔÏÄ ÉÓÐÏÌØÚÕÅÔ ÐÏÞÔÉ × Ä×Á ÒÁÚÁ ÍÅÎØÛÅ ÐÁÍÑÔÉ, ÎÏ ÒÁÂÏÔÁÅÔ 
+ÔÁË ÖÅ × Ä×Á ÒÁÚÁ ÍÅÄÌÅÎÎÅÅ. ðÁÒÁÍÅÔÒ ÐÒÉÍÅÎÉÍ × ÓÌÕÞÁÑÈ ÏÓÔÒÏÊ ÎÅÈ×ÁÔËÉ 
+ÐÁÍÑÔÉ ÄÌÑ ÆÁÊÌÏ× ÓÖÁÔÙÈ Ó ×ÙÓÏËÉÍ \-\-bzip2-compress-level. 
+.IP "\-t, \-\-textmode" 10 
+.IP "\-\-no-textmode" 10 
+ðÏÌÁÇÁÔØ, ÞÔÏ ×ÈÏÄÎÙÅ ÆÁÊÌÙ ÓÏÄÅÒÖÁÔ ÔÅËÓÔ É ÓÏÈÒÁÎÑÔØ ÉÈ × ËÁÎÏÎÉÞÅÓËÏÊ 
+ÔÅËÓÔÏ×ÏÊ ÆÏÒÍÅ OpenPGP ÓÏ ÓÔÒÏËÁÍÉ ÚÁËÁÎÞÉ×ÁÀÝÉÍÉÓÑ "CRLF". ðÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÕÓÔÁÎÁ×ÌÉ×ÁÀÔÓÑ ÆÌÁÇÉ, ÓÏÏÂÝÁÀÝÉÅ ÐÏÌÕÞÁÔÅÌÀ, 
+ÞÔÏ ÚÁÛÉÆÒÏ×ÁÎÎÙÅ ÉÌÉ ÐÏÄÐÉÓÁÎÎÙÅ ÄÁÎÎÙÅ Ñ×ÌÑÀÔÓÑ ÔÅËÓÔÏÍ É ÍÏÖÅÔ 
+ÐÏÔÒÅÂÏ×ÁÔØÓÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ËÏÎÃÏ× ÓÔÒÏË × ÔÅ, ËÏÔÏÒÙÅ ÉÓÐÏÌØÚÕÀÔÓÑ 
+ÌÏËÁÌØÎÏÊ ÓÉÓÔÅÍÏÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉÍÅÎÉÍ ÐÒÉ ÏÂÍÅÎÅ ÉÎÆÏÒÍÁÃÉÅÊ 
+ÍÅÖÄÕ Ä×ÕÍÑ ÒÁÚÌÉÞÎÙÍÉ ÐÌÁÔÆÏÒÍÁÍÉ ÉÓÐÏÌØÚÕÀÝÉÍÉ ÒÁÚÌÉÞÎÙÅ ÏËÏÎÞÁÎÉÑ 
+ÓÔÒÏË (UNIX \- Mac, Mac \- Windows É Ô.Ð.). \-\-no-textmode ÏÔËÌÀÞÁÅÔ 
+ÄÁÎÎÙÊ ÒÅÖÉÍ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎ. 
+.IP "" 10 
+åÓÌÉ \-t (ÎÏ ÎÅ \-\-textmode) ÉÓÐÏÌØÚÕÅÔÓÑ ÓÏ×ÍÅÓÔÎÏ Ó \-\-armor 
+É \-\-sign, ÔÏ ÓÏÚÄÁ£ÔÓÑ ÐÒÏÚÒÁÞÎÁÑ ÐÏÄÐÉÓØ. üÔÏÔ ÐÁÒÁÍÅÔÒ ÎÅÏÂÈÏÄÉÍ ÄÌÑ 
+ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó ËÏÎÓÏÌØÎÙÍÉ ×ÅÒÓÉÑÍÉ PGP; ÏÂÙÞÎÏ ÷ÁÍ ÓÌÅÄÕÅÔ 
+ÉÓÐÏÌØÚÏ×ÁÔØ \-\-sign ÉÌÉ \-\-clearsign ÄÌÑ ×ÙÂÏÒÁ ÔÉÐÁ ÐÏÄÐÉÓÉ. 
+.IP "\-n, \-\-dry-run" 10 
+îÅ ÄÅÌÁÔØ ÎÉËÁËÉÈ ÉÚÍÅÎÅÎÉÊ (ÒÅÁÌÉÚÏ×ÁΠÎÅ ÐÏÌÎÏÓÔØÀ). 
+.IP "\-i, \-\-interactive" 10 
+÷Ù×ÏÄÉÔØ ÚÁÐÒÏÓ ÐÅÒÅÄ ÐÅÒÅÚÁÐÉÓØÀ ÆÁÊÌÏ×. 
+.IP "\-\-batch" 10 
+.IP "\-\-no-batch" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÐÁËÅÔÎÙÊ ÒÅÖÉÍ.  îÅ ×Ù×ÏÄÑÔÓÑ ÎÉËÁËÉÅ ÚÁÐÒÏÓÙ, ÎÅ 
+ÄÏÐÕÓËÁÀÔÓÑ ÉÎÔÅÒÁËÔÉ×ÎÙÅ ËÏÍÁÎÄÙ. 
+\-\-no-batch ÏÔËÌÀÞÁÅÔ ÐÁËÅÔÎÙÊ ÒÅÖÉÍ. 
+.IP "\-\-no-tty" 10 
+îÅ ÉÓÐÏÌØÚÏ×ÁÔØ TTY (ÔÅÒÍÉÎÁÌ) ÄÌÑ ×Ù×ÏÄÁ ÉÎÆÏÒÍÁÃÉÉ. ðÁÒÁÍÅÔÒ ÎÅÏÂÈÏÄÉÍ 
+× ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ, Ô.Ë. GnuPG ÉÎÏÇÄÁ ×Ù×ÏÄÉÔ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ ÎÁ TTY ÐÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ \-\-batch. 
+.IP "\-\-yes" 10 
+ðÒÅÄÐÏÌÁÇÁÅÔ ÕÔ×ÅÒÄÉÔÅÌØÎÙÊ ÏÔ×ÅÔ ÎÁ ÂÏÌØÛÉÎÓÔ×Ï ×ÏÐÒÏÓÏ×. 
+.IP "\-\-no" 10 
+ðÒÅÄÐÏÌÁÇÁÅÔ ÏÔÒÉÃÁÔÅÌØÎÙÊ ÏÔ×ÅÔ ÎÁ ÂÏÌØÛÉÎÓÔ×Ï ×ÏÐÒÏÓÏ×. 
+.IP "\-\-ask-cert-level" 10 
+.IP "\-\-no-ask-cert-level" 10 
+ðÒÉ ÐÏÄÐÉÓÙ×ÁÎÉÉ ËÌÀÞÁ, ÚÁÐÒÁÛÉ×ÁÔØ ÕÒÏ×ÅÎØ ÓÅÒÔÉÆÉËÁÃÉÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ 
+ÎÅ ÕËÁÚÁÎ, ÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ÕÒÏ×ÅÎØ ÚÁÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒÏÍ  
+\-\-default-cert-level. óÍ. × ÏÐÉÓÁÎÉÉ \-\-default-cert-level ÂÏÌÅÅ  
+ÐÏÄÒÏÂÎÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ÒÁÚÌÉÞÎÙÈ ÕÒÏ×ÎÑÈ É ÉÈ ÉÓÐÏÌØÚÏ×ÁÎÉÉ. 
+\-\-no-ask-cert-level ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÐÁÒÁÍÅÔÒ ÏÔËÌÀÞÅÎ. 
+.IP "\-\-min-cert-level" 10 
+ðÒÉ ÐÏÓÔÒÏÅÎÉÉ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÎÅ ÕÞÉÔÙ×ÁÔØ ÐÏÄÐÉÓÉ Ó ÕÒÏ×ÎÅÍ 
+ÓÅÒÔÉÆÉËÁÃÉÉ ÎÉÖÅ ÕËÁÚÁÎÎÏÇÏ. ðÏ ÕÍÏÌÞÁÎÉÀ ÒÁ×ÅΠ2, ÞÔÏ ÏÚÎÁÞÁÅÔ 
+ÏÔËÁÚ ÏÔ ÐÒÉÎÑÔÉÑ ÐÏÄÐÉÓÅÊ Ó ÕÒÏ×ÎÅÍ 1. 
+.IP "\-\-default-cert-level \fBn\fR" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÕÒÏ×ÅÎØ ÓÅÒÔÉÆÉËÁÃÉÉ ËÌÀÞÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÐÒÉ ÅÇÏ ÐÏÄÐÉÓÉ. 
+.IP "" 10 
+0 ÏÚÎÁÞÁÅÔ, ÞÔÏ ÷Ù ÎÅ ÂÕÄÅÔÅ ÕËÁÚÙ×ÁÔØ ÎÁÓËÏÌØËÏ ÔÝÁÔÅÌØÎÏ ÐÒÏ×ÅÒÉÌÉ 
+ËÌÀÞ ÐÅÒÅÄ ÔÅÍ, ËÁË ÅÇÏ ÐÏÄÐÉÓÙ×ÁÔØ. 
+.IP "" 10 
+1 ÏÚÎÁÞÁÅÔ, ÞÔÏ ÷Ù ×ÅÒÉÔÅ × ÄÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÁ, ÎÏ ÎÅ ÐÒÏ×ÅÒÑÌÉ ÉÌÉ ÎÅ 
+ÍÏÖÅÔÅ ÐÒÏ×ÅÒÉÔØ ÜÔÏ. ðÒÉÍÅÎÉÍ ÄÌÑ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ ÔÅÈ ÌÉÃ, Ó ËÏÔÏÒÙÍÉ ÷Ù 
+ÚÎÁËÏÍÙ ÔÏÌØËÏ ÐÏ ÐÅÒÅÐÉÓËÅ. 
+.IP "" 10 
+2 ÏÚÎÁÞÁÅÔ, ÞÔÏ ×Ù ÐÒÏÉÚ×ÅÌÉ ÐÏ×ÅÒÈÎÏÓÔÎÕÀ ÐÒÏ×ÅÒËÕ ËÌÀÞÁ. îÁÐÒÉÍÅÒ, ÷Ù 
+ÐÒÏ×ÅÒÉÌÉ ÏÔÐÅÞÁÔÏË ËÌÀÞÁ É Ó×ÅÒÉÌÉ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ ÎÁ ËÌÀÞÅ  
+Ó ÅÇÏ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ. 
+.IP "" 10 
+3 ÏÚÎÁÞÁÅÔ, ÞÔÏ ÷Ù ÔÝÁÔÅÌØÎÏ ÐÒÏ×ÅÒÉÌÉ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÁ. îÁÐÒÉÍÅÒ, ÷Ù 
+Ó×ÅÒÉÌÉ ÏÔÐÅÞÁÔÏË ÉÍÅÀÝÅÊÓÑ Õ ÷ÁÓ ËÏÐÉÉ ËÌÀÞÁ Ó ÔÅÍ, ËÏÔÏÒÙÊ ÌÉÞÎÏ 
+ÓÏÏÂÝÉÌ ÷ÁÍ ×ÌÁÄÅÌÅàËÌÀÞÁ, ÐÒÏ×ÅÒÉÌÉ ÐÏ ÄÏËÕÍÅÎÔÁÍ ÌÉÞÎÏÓÔØ ×ÌÁÄÅÌØÃÁ 
+ËÌÀÞÁ É Ó×ÅÒÉÌÉ ÅÇÏ ÉÍÑ Ó ÔÅÍ, ËÏÔÏÒÏÅ ÕËÁÚÁÎÏ × ÉÄÅÎÔÉÆÉËÁÔÏÒÅ 
+ÐÏÌØÚÏ×ÁÔÅÌÑ ÎÁ ËÌÀÞÅ, É, ÎÁËÏÎÅÃ, ÕÂÅÄÉÌÉÓØ (ÐÕԣ͠ÐÅÒÅÐÉÓËÉ), ÞÔÏ 
+ÕËÁÚÁÎÎÙÊ × ÉÄÅÎÔÉÆÉËÁÔÏÒÅ ËÌÀÞÁ ÁÄÒÅÓ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ, ÐÒÉÎÁÄÌÅÖÉÔ 
+×ÌÁÄÅÌØÃÕ ËÌÀÞÁ. 
+.IP "" 10 
+úÁÍÅÔÉÍ, ÞÔÏ ÐÒÉ×ÅÄ£ÎÎÙÅ ×ÙÛÅ ÐÒÉÍÅÒÙ ÄÌÑ ÕÒÏ×ÎÅÊ 2 É 3 ÜÔÏ ÔÏÌØËÏ 
+ÐÒÉÍÅÒÙ. ÷ ËÏÎÅÞÎÏÍ ÓÞ£ÔÅ, ÒÅÛÅÎÉÅ ×ÏÐÒÏÓÁ Ï ÔÏÍ ËÁËÁÑ ÐÒÏ×ÅÒËÁ Ñ×ÌÑÅÔÓÑ 
+ÐÏ×ÅÒÈÎÏÓÔÎÏÊ, Á ËÁËÁÑ ÔÝÁÔÅÌØÎÏÊ ÏÓÔÁ£ÔÓÑ ÚÁ ÷ÁÍÉ. 
+.IP "" 10 
+úÎÁÞÅÎÉÅÍ ÐÏ ÕÍÏÌÞÁÎÉÀ Ñ×ÌÑÅÔÓÑ 0 (ÕÒÏ×ÅÎØ ÎÅ ÕËÁÚÁÎ). 
+.IP "\-\-trusted-key \fBlong key ID\fR" 10 
+ðÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ ÕËÁÚÁÎÎÙÊ ËÌÀÞ (ËÏÔÏÒÙÊ ÄÏÌÖÅΠÂÙÔØ ÚÁÄÁΠÐÏÌÎÙÍ 8ÍÉ 
+ÂÁÊÔÏ×ÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ) ÄÏÓÔÏ×ÅÒÅÎ, ËÁË ÏÄÉΠÉÚ ÷ÁÛÉÈ ÓÅËÒÅÔÎÙÈ 
+ËÌÀÞÅÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉÍÅÎÉÍ ÅÓÌÉ ÷Ù ÎÅ ÈÏÔÉÔÅ ÈÒÁÎÉÔØ ÷ÁÛÉ  
+ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ (ÉÌÉ ÏÄÉΠÉÚ ÎÉÈ) ÎÁ ÄÁÎÎÏÍ ËÏÍÐØÀÔÅÒÅ, ÎÏ ÈÏÔÉÔÅ 
+ÓÏÈÒÁÎÉÔØ ×ÏÚÍÏÖÎÏÓÔØ ÐÒÏ×ÅÒÑÔØ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÅÊ ÷ÁÛÉÈ 
+ËÏÒÒÅÓÐÏÎÄÅÎÔÏ×.  
+.IP "\-\-trust-model \fBpgp|classic|always\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÍÏÄÅÌØ ÄÏ×ÅÒÉÑ, ËÏÔÏÒÏÊ ÄÏÌÖÅΠÓÌÅÄÏ×ÁÔØ GnuPG. 
+éÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ÍÏÄÅÌÉ: 
+.RS 
+.IP "pgp" 10 
+üÔÏ ÓÅÔØ ÄÏ×ÅÒÉÑ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÄÏ×ÅÒÑÀÝÉÈ ÐÏÄÐÉÓÅÊ, ËÏÔÏÒÁÑ 
+ÉÓÐÏÌØÚÕÅÔÓÑ × PGP 5.x É ÂÏÌÅÅ ÐÏÚÄÎÉÈ ×ÅÒÓÉÑÈ. üÔÏ ÍÏÄÅÌØ ÉÓÐÏÌØÚÕÅÍÁÑ 
+ÐÏ ÕÍÏÌÞÁÎÉÀ. 
+.IP "classic" 10 
+üÔÏ ÓÔÁÎÄÁÒÔÎÁÑ ÓÅÔØ ÄÏ×ÅÒÉÑ ÉÓÐÏÌØÚÏ×Á×ÛÁÑÓÑ × PGP 2.x É ÒÁÎØÛÅ. 
+.IP "direct" 10 
+äÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÁ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ ÐÏÌØÚÏ×ÁÔÅÌÅÍ É ÎÅ 
+×ÙÞÉÓÌÑÅÔÓÑ ÞÅÒÅÚ ÓÅÔØ ÄÏ×ÅÒÉÑ. 
+.IP "always" 10 
+ðÒÏÐÕÓÔÉÔØ ÐÒÏÃÅÄÕÒÕ ÐÒÏ×ÅÒËÉ ËÌÀÞÅÊ É ÐÏÌÁÇÁÔØ, ÞÔÏ ÉÓÐÏÌØÚÕÅÍÙÅ ËÌÀÞÉ 
+×ÓÅÇÄÁ ÐÏÌÎÏÓÔØÀ ÄÏÓÔÏ×ÅÒÎÙ. ÷Ù ÎÅ ÄÏÌÖÎÙ ÉÓÐÏÌØÚÏ×ÁÔØ ÜÔÕ ÍÏÄÅÌØ, ÅÓÌÉ  
+ÔÏÌØËÏ ÎÅ ÉÓÐÏÌØÚÕÅÔÅ ËÁËÕÀ\-ÌÉÂÏ ×ÎÅÛÎÀÀ ÓÈÅÍÕ ÐÒÏ×ÅÒËÉ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ  
+ËÌÀÞÅÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ, ÔÁËÖÅ, ÐÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÓÏÏÂÝÅÎÉÑ 
+"[uncertain]" ÐÒÉ ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÉ, ËÏÇÄÁ ÎÅÔ Ó×ÉÄÅÔÅÌØÓÔ× ÔÏÇÏ, ÞÔÏ 
+ËÌÀÞ ÐÒÉÎÁÄÌÅÖÉÔ ÕËÁÚÁÎÎÏÍՠנΣ͠×ÌÁÄÅÌØÃÕ. 
+.RE 
+.IP "\-\-always-trust" 10 
+éÄÅÎÔÉÞÅΠ`\-\-trust-model always'. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅ 
+ÒÅËÏÍÅÎÄÕÅÔÓÑ. 
+.IP "\-\-keyid-format \fBshort|0xshort|long|0xlong\fR" 10 
+ðÏÚ×ÏÌÑÅÔ ×ÙÂÒÁÔØ ÆÏÒÍÁÔ ÏÔÏÂÒÁÖÅÎÉÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ËÌÀÞÅÊ. 
+"short" \-\- ÜÔÏ ÔÒÁÄÉÃÉÏÎÎÙÊ 8-ÓÉÍ×ÏÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ. 
+"long" \-\- ÂÏÌÅÅ ÔÏÞÎÙÊ (ÎÏ ÍÅÎÅÅ ÒÁÓÐÒÏÓÔÒÁΣÎÎÙÊ) 16-ÓÉÍ×ÏÌØÎÙÊ  
+ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ.  äÏÂÁ×ÌÅÎÉÅ "0x" Ë ÆÏÒÍÁÔÕ ÐÒÉ×ÏÄÉÔ Ë  
+ÄÏÂÁ×ÌÅÎÉÀ "0x" Ë ÉÄÅÎÔÉÆÉËÁÔÏÒÕ ËÌÀÞÁ, ÎÁÐÒÉÍÅÒ, 0x99242560. 
+.IP "\-\-keyserver \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÓÅÒ×ÅÒ ËÌÀÞÅÊ \fBname\fR.  üÔÏ ÓÅÒ×ÅÒ ËÏÔÏÒÙÊ ÂÕÄÅÔ 
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÏÌÕÞÅÎÉÑ, ÏÔÐÒÁ×ËÉ É ÐÏÉÓËÁ ËÌÀÞÅÊ ÐÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ËÏÍÁÎÄ \-\-recv-keys, \-\-send-keys É \-\-search-keys. æÏÒÍÁÔ 
+\fBname\fR ÜÔÏ URI: `scheme:[//]keyservername[:port]' óÈÅÍÁ \-\- ÜÔÏ ÔÉР
+ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ: "hkp" ÄÌÑ HTTP (ÉÌÉ ÓÏ×ÍÅÓÔÉÍÙÈ) ÓÅÒ×ÅÒÏ×,  
+"ldap" ÄÌÑ NAI LDAP ÓÅÒ×ÅÒÏ×,  "mailto" ÄÌÑ Graf email keyserver. 
+úÁÍÅÔÉÍ, ÞÔÏ ËÏÎËÒÅÔÎÁÑ ÉÎÓÔÁÌÑÃÉÑ GnuPG ÍÏÖÅÔ ÄÏÐÕÓËÁÔØ É ÄÒÕÇÉÅ ÔÉÐÙ 
+ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ. éÍÅÎÁ ÓÈÅÍ ÉÓÐÏÌØÚÕÀÔÓÑ ÂÅÚ ÕÞÅÔÁ ÒÅÇÉÓÔÒÁ. 
+.IP "" 10 
+âÏÌØÛÉÎÓÔ×Ï ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ ÓÉÎÈÒÏÎÉÚÉÒÕÀÔÓÑ ÄÒÕÇ Ó ÄÒÕÇÏÍ, Ô.Ï. ÎÅÔ 
+ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÐÏÓÙÌÁÔØ ËÌÀÞÉ ÂÏÌÅÅ ÞÅÍ ÎÁ ÏÄÉΠÓÅÒ×ÅÒ. éÍÑ 
+"hkp://subkeys.pgp.net" Ñ×ÌÑÅÔÓÑ ÐÓÅ×ÄÏÎÉÍÏÍ ÄÌÑ ÎÅÓËÏÌØËÉÈ ÓÅÒ×ÅÒÏ× 
+ËÌÀÞÅÊ. 
+.IP "\-\-keyserver-options \fBparameters\fR" 10 
+äÁÎÎÁÑ ÓÔÒÏËÁ ÓÏÄÅÒÖÉÔ ÓÐÉÓÏË ÒÁÚÄÅÌ£ÎÎÙÈ ÐÒÏÂÅÌÁÍÉ ÉÌÉ ÚÁÐÑÔÙÍÉ 
+ÐÁÒÁÍÅÔÒÏ× ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÐÒÅÄ×ÁÒÑÔØÓÑ ÐÒÅÆÉËÓÏÍ `no-' 
+ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÏÂÒÁÔÎÏÇÏ ÚÎÁÞÅÎÉÑ.  
+îÅ ×ÓÅ ÐÁÒÁÍÅÔÒÙ ÄÏÐÕÓÔÉÍÙ ÄÌÑ ÌÀÂÏÇÏ 
+ÔÉÐÁ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. ïÓÎÏ×ÎÙÅ ÐÁÒÁÍÅÔÒÙ ÓÌÅÄÕÀÝÉÅ: 
+.RS 
+.IP "include-revoked" 10 
+ðÒÉ ÐÏÉÓËÅ ËÌÀÞÅÊ ËÏÍÁÎÄÏÊ \-\-search-keys, ÕÞÉÔÙ×ÁÔØ É ÔÅ ËÌÀÞÉ, ËÏÔÏÒÙÅ 
+ÐÏÍÅÞÅÎÙ ÎÁ ÓÅÒ×ÅÒÅ ËÌÀÞÅÊ ËÁË ÏÔÏÚ×ÁÎÎÙÅ. úÁÍÅÔØÔÅ, ÞÔÏ ÎÅ ×ÓÅ ÓÅÒ×ÅÒÙ 
+ËÌÀÞÅÊ ÒÁÚÌÉÞÁÀÔ ÏÔÏÚ×ÁÎÎÙÅ É ÎÅ ÏÔÏÚ×ÁÎÎÙÅ ËÌÀÞÉ, ÄÌÑ ÔÁËÉÈ ÓÅÒ×ÅÒÏ× 
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÌÉۣΠÓÍÙÓÌÁ. úÁÍÅÔØÔÅ, ÔÁËÖÅ, ÞÔÏ ÂÏÌØÛÉÎÓÔ×Ï ÓÅÒ×ÅÒÏ× 
+ËÌÀÞÅÊ ÎÅ ×ÙÐÏÌÎÑÀÔ ËÒÉÐÔÏÇÒÁÆÉÞÅÓËÕÀ ÐÒÏ×ÅÒËÕ ÏÔÚÙ×ÁÀÝÉÈ ÓÅÒÔÉÆÉËÁÔÏ×, 
+× ÜÔÏÍ ÓÌÕÞÁÅ ÏÔËÌÀÞÅÎÉÅ ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë ÔÏÍÕ, ÞÔÏ ÂÕÄÕÔ 
+ÐÒÏÐÕÝÅÎÙ ËÌÀÞÉ ÎÅËÏÒÒÅËÔÎÏ ÐÏÍÅÞÅÎÎÙÅ ËÁË ÏÔÏÚ×ÁÎÎÙÅ. ðÏ ÕÍÏÌÞÁÎÉÀ 
+ÐÁÒÁÍÅÔÒ ×ËÌÀÞÅÎ.  
+.IP "include-disabled" 10 
+ðÒÉ ÐÏÉÓËÅ ËÌÀÞÅÊ ËÏÍÁÎÄÏÊ \-\-search-keys, ÕÞÉÔÙ×ÁÔØ É ÔÅ ËÌÀÞÉ, ËÏÔÏÒÙÅ 
+ÐÏÍÅÞÅÎÙ ÎÁ ÓÅÒ×ÅÒÅ ËÌÀÞÅÊ ËÁË ÎÅÉÓÐÏÌØÚÕÅÍÙÅ. úÁÍÅÔÉÍ, ÞÔÏ ÄÁÎÎÙÊ  
+ÐÁÒÁÍÅÔÒ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ HKP ÓÅÒ×ÅÒÁÍÉ. 
+.IP "honor-keyserver-url" 10 
+ðÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄÙ \-\-refresh-keys, ÅÓÌÉ × ÚÁÐÒÁÛÉ×ÁÅÍÏÍ ËÌÀÞÅ 
+ÕÓÔÁÎÏ×ÌÅΠÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÓÅÒ×ÅÒ ËÌÀÞÅÊ, ÔÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÅÇÏ ÄÌÑ 
+ÏÂÎÏ×ÌÅÎÉÑ ËÌÀÞÁ. ðÏ ÕÍÏÌÞÁÎÉÀ ×ËÌÀÞÅÎ. 
+.IP "include-subkeys" 10 
+ðÒÉ ÐÏÌÕÞÅÎÉÉ ËÌÀÞÁ, ÐÒÏÉÚ×ÏÄÉÔØ ÐÏÉÓË É ÐÏ ÐÏÄËÌÀÞÁÍ. úÁÍÅÔØÔÅ, ÞÔÏ 
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÁÂÏÔÁÅÔ Ó ÓÅÒ×ÅÒÁÍÉ HKP, Ô.Ë. ÏÎÉ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔ 
+ÐÅÒÅÓÙÌËÕ ËÌÀÞÅÊ ÐÏ ÉÄÅÎÔÉÆÉËÁÔÏÒÕ ÐÏÄËÌÀÞÁ. 
+.IP "use-temp-files" 10 
+îÁ ÂÏÌØÛÉÎÓÔ×Å Unix-ÐÏÄÏÂÎÙÈ ÐÌÁÔÆÏÒÍ GnuPG ×ÚÁÉÍÏÄÅÊÓÔ×ÕÅÔ Ó ÐÒÏÇÒÁÍÍÏÊ 
+ÏÂÒÁÝÅÎÉÑ Ë ÓÅÒ×ÅÒÕ ËÌÀÞÅÊ ÞÅÒÅÚ ËÁÎÁÌÙ, ËÏÔÏÒÙÅ Ñ×ÌÑÀÔÓÑ ÎÁÉÂÏÌÅÅ 
+ÜÆÆÅËÔÉ×ÎÙÍ ÍÅÔÏÄÏÍ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÚÁÓÔÁ×ÌÑÅÔ GnuPG ÉÓÐÏÌØÚÏ×ÁÔØ 
+ÄÌÑ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ ×ÒÅÍÅÎÎÙÅ ÆÁÊÌÙ. îÁ ÎÅËÏÔÏÒÙÈ ÐÌÁÔÆÏÒÍÁÈ (ÔÁËÉÈ ËÁË 
+Win32 É RISC OS) ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÓÐÏÌØÚÕÅÔÓÑ ×ÓÅÇÄÁ. 
+.IP "keep-temp-files" 10 
+õËÁÚÙ×ÁÅÔ, ÞÔÏ ÐÒÉ ×ËÌÀÞÅÎÎÏÍ ÐÁÒÁÍÅÔÒÅ `use-temp-files' ×ÒÅÍÅÎÎÙÅ 
+ÆÁÊÌÙ ÎÅ ÄÏÌÖÎÙ ÕÄÁÌÑÔØÓÑ  ÐÏÓÌÅ ÉÈ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÕÄÏÂÅΠÄÌÑ ÉÚÕÞÅÎÉÑ ÐÒÏÔÏËÏÌÁ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ. 
+.IP "verbose" 10 
+õËÁÚÙ×ÁÅÔ ÐÒÏÇÒÁÍÍÅ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ ×Ù×ÏÄÉÔØ ÂÏÌÅÅ 
+ÐÏÄÒÏÂÎÕÀ ÉÎÆÏÒÍÁÃÉÀ. íÏÖÅÔ ÐÏ×ÔÏÒÑÔØÓÑ ÎÅÓËÏÌØËÏ ÒÁÚ ÄÌÑ Õ×ÅÌÉÞÅÎÉÑ 
+ÄÅÔÁÌØÎÏÓÔÉ ×Ù×ÏÄÁ. 
+.IP "timeout" 10 
+õËÁÚÙ×ÁÅÔ ÐÒÏÇÒÁÍÍÅ ×ÚÁÉÍÏÄÅÊÓÔ×ÕÀÝÅÊ Ó ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ ÍÁËÓÉÍÁÌØÎÕÀ 
+ÐÒÏÄÏÌÖÉÔÅÌØÎÏÓÔØ ÏÐÅÒÁÃÉÉ × ÓÅËÕÎÄÁÈ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÒÉ ÏÄÎÏ×ÒÅÍÅÎÎÏÍ 
+×ÙÐÏÌÎÅÎÉÉ ÎÅÓËÏÌØËÉÈ ÏÐÅÒÁÃÉÊ ÚÎÁÞÅÎÉÅ ÔÁÊÍÁÕÔÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÏÔÄÅÌØÎÏ 
+ÄÌÑ ËÁÖÄÏÊ ÏÐÅÒÁÃÉÉ. îÁÐÒÉÍÅÒ, ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÎÅÓËÏÌØËÉÈ ËÌÀÞÅÊ Ó ÐÏÍÏÝØÀ 
+\-\-recv-keys, ÏÇÒÁÎÉÞÉ×ÁÅÔÓÑ ×ÒÅÍÑ ÐÏÌÕÞÅÎÉÑ ËÁÖÄÏÇÏ ÉÚ ÎÉÈ ÐÏ 
+ÏÔÄÅÌØÎÏÓÔÉ. ðÏ ÕÍÏÌÞÁÎÉÀ 30 ÓÅËÕÎÄ. 
+.IP "http-proxy [=value]" 10 
+äÌÑ ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ ËÏÔÏÒÙÅ ÉÓÐÏÌØÚÕÀÔ HTTP (ÔÁËÉÈ ËÁË HKP), 
+ÉÓÐÏÌØÚÏ×ÁÔØ ÄÏÓÔÕРÞÅÒÅÚ ÕËÁÚÁÎÎÙÊ ÐÒÏËÓÉ\-ÓÅÒ×ÅÒ. åÓÌÉ ÁÒÇÕÍÅÎÔ 
+ÏÐÕÝÅÎ, ÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÏËÓÉ\-ÓÅÒ×ÅÒ ÚÁÄÁÎÎÙÊ × ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ 
+"http_proxy". 
+.IP "auto-key-retrieve" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÒÁÚÒÅÛÁÅÔ Á×ÔÏÍÁÔÉÞÅÓËÏÅ ÐÏÌÕÞÅÎÉÅ ËÌÀÞÅÊ Ó ÓÅÒ×ÅÒÁ ÐÒÉ 
+ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ ÓÄÅÌÁÎÎÙÈ ËÌÀÞÁÍÉ, ËÏÔÏÒÙÈ ÎÅÔ × ÌÏËÁÌØÎÏÍ ÎÁÂÏÒÅ 
+ËÌÀÞÅÊ. 
+.IP "" 10 
+úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉ×ÏÄÉÔ Ë ×ÏÚÎÉËÎÏ×ÅÎÉÀ ÏÐÒÅÄÅÌ£ÎÎÏÊ 
+ÕÑÚ×ÉÍÏÓÔÉ. áÄÍÉÎÉÓÔÒÁÔÏÒÙ ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ ÍÏÇÕÔ ÏÔÓÌÅÖÉ×ÁÔØ ÚÁÐÒÏÓÙ; 
+ÏÔÐÒÁ×É× ÷ÁÍ ÓÏÏÂÝÅÎÉÅ, ÐÏÄÐÉÓÁÎÎÏÅ ÎÏ×ÙÍ ËÌÀÞÏÍ (ËÏÔÏÒÙÊ ÏÔÓÕÔÓÔ×ÕÅÔ Õ 
+÷ÁÓ), ÏÎÉ ÍÏÇÕÔ ÏÐÒÅÄÅÌÉÔØ ÷ÁÛ IP ÁÄÒÅÓ É ×ÒÅÍÑ, ËÏÇÄÁ ÷Ù ÐÒÏ×ÅÒÉÌÉ 
+ÐÏÄÐÉÓØ. 
+.RE 
+.IP "\-\-import-options \fBparameters\fR" 10 
+÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÕËÁÚÙ×ÁÅÔÓÑ ÓÔÒÏËÁ, × ËÏÔÏÒÏÊ, ÞÅÒÅÚ ÐÒÏÂÅÌÙ ÉÌÉ 
+ÚÁÐÑÔÙÅ, ÐÅÒÅÞÉÓÌÅÎÙ ÐÁÒÁÍÅÔÒÙ ÉÍÐÏÒÔÁ ËÌÀÞÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ 
+ÐÒÅÄ×ÁÒÑÔØÓÑ `no-' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÏÂÒÁÔÎÏÇÏ ÚÎÁÞÅÎÉÑ. äÏÐÕÓÔÉÍÙÅ 
+ÐÁÒÁÍÅÔÒÙ: 
+.RS 
+.IP "import-local-sigs" 10 
+ðÏÚ×ÏÌÑÅÔ ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ, ÐÏÍÅÞÅÎÎÙÅ ËÁË ÌÏËÁÌØÎÙÅ. ëÁË 
+ÐÒÁ×ÉÌÏ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÓÌÕÞÁÅ× ÒÁÚÄÅÌÑÅÍÙÈ ÎÁÂÏÒÏ× 
+ËÌÀÞÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÎÅÔ. 
+.IP "repair-hkp-subkey-bug" 10 
+ðÒÉ ÉÍÐÏÒÔÅ ÐÙÔÁÔØÓÑ ×ÏÓÓÔÁÎÏ×ÉÔØ ÐÏ×ÒÅÖÄÅÎÉÑ ×ÙÚ×ÁÎÎÙÅ ÏÛÉÂËÏÊ × ÓÅÒ×ÅÒÅ 
+PKS (ÄÏ ×ÅÒÓÉÉ 0.9.6), ÉÓËÁÖÁÀÝÅÊ ËÌÀÞÉ Ó ÍÎÏÖÅÓÔ×ÅÎÎÙÍÉ ÐÏÄËÌÀÞÁÍÉ.  
+úÁÍÅÔØÔÅ, ÞÔÏ ÜÔÏ ÎÅ ÐÏÚ×ÏÌÑÅÔ ÐÏÌÎÏÓÔØÀ ×ÏÓÓÔÁÎÏ×ÉÔØ ÐÏ×ÒÅÖÄÅÎÎÙÊ ËÌÀÞ, 
+Ô.Ë. ÞÁÓÔØ ÄÁÎÎÙÈ ÕÄÁÌÑÅÔÓÑ ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ, ÎÏ ÄÁ£Ô ÐÏ ËÒÁÊÎÅÊ ÍÅÒÅ ÏÄÉΠ
+ÐÏÄËÌÀÞ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅΠÄÌÑ ÏÂÙÞÎÏÇÏ \-\-import É ×ËÌÀÞÅΠÄÌÑ 
+\-\-recv-keys. 
+.IP "merge-only" 10 
+÷Ï ×ÒÅÍÑ ÉÍÐÏÒÔÁ ÒÁÚÒÅÛÉÔØ ÔÏÌØËÏ ÏÂÎÏ×ÌÅÎÉÅ ÓÕÝÅÓÔ×ÕÀÝÉÈ ËÌÀÞÅÊ, ÎÏ ÎÅ 
+ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÎÉËÁËÉÅ ÎÏ×ÙÅ ËÌÀÞÉ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎ. 
+.RE 
+.IP "\-\-export-options \fBparameters\fR" 10 
+÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÕËÁÚÙ×ÁÅÔÓÑ ÓÔÒÏËÁ, × ËÏÔÏÒÏÊ, ÞÅÒÅÚ ÐÒÏÂÅÌÙ ÉÌÉ 
+ÚÁÐÑÔÙÅ, ÐÅÒÅÞÉÓÌÅÎÙ ÐÁÒÁÍÅÔÒÙ ÜËÓÐÏÒÔÁ ËÌÀÞÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ 
+ÐÒÅÄ×ÁÒÑÔØÓÑ `no-' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÏÂÒÁÔÎÏÇÏ ÚÎÁÞÅÎÉÑ. äÏÐÕÓÔÉÍÙÅ 
+ÐÁÒÁÍÅÔÒÙ: 
+.RS 
+.IP "export-local-sigs" 10 
+ðÏÚ×ÏÌÑÅÔ ÜËÓÐÏÒÔÉÒÏ×ÁÔØ ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ, ÐÏÍÅÞÅÎÎÙÅ ËÁË ÌÏËÁÌØÎÙÅ.  ëÁË 
+ÐÒÁ×ÉÌÏ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÓÌÕÞÁÅ× ÒÁÚÄÅÌÑÅÍÙÈ ÎÁÂÏÒÏ× 
+ËÌÀÞÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "export-attributes" 10 
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ÁÔÒÉÂÕÔÎÙÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ (ÆÏÔÏÇÒÁÆÉÞÅÓËÉÅ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÙ). ðÒÉÍÅÎÉÍÏ ÐÒÉ ÜËÓÐÏÒÔÅ ËÌÀÞÅÊ, ÅÓÌÉ ÏÎÉ ÐÒÅÄÎÁÚÎÁÞÅÎÙ 
+ÄÌÑ ÐÒÏÇÒÁÍÍÙ OpenPGP, ÎÅ ÄÏÐÕÓËÁÀÝÅÊ ÁÔÒÉÂÕÔÎÙÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ. ðÏ 
+ÕÍÏÌÞÁÎÉÀ ×ËÌÀÞÅÎÏ. 
+.IP "export-sensitive-revkeys" 10 
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÎÁÚÎÁÞÅÎÎÏÍ ÏÔÚÙ×ÁÀÝÅÍ, ËÏÔÏÒÁÑ ÂÙÌÁ 
+ÐÏÍÅÞÅÎÁ ËÁË "sensitive". ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "export-minimal" 10 
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ËÌÀÞ ÍÉÎÉÍÁÌØÎÏ ×ÏÚÍÏÖÎÏÇÏ ÒÁÚÍÅÒÁ. ÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÜÔÏ 
+ÄÏÓÔÉÇÁÅÔÓÑ ÚÁ ÓÞ£Ô ÔÏÇÏ, ÞÔÏ × ÜËÓÐÏÒÔÉÒÕÅÍÙÊ ËÌÀÞ ÎÅ ×ËÌÀÞÁÀÔÓÑ 
+ÎÉËÁËÉÅ ÐÏÄÐÉÓÉ ËÒÏÍÅ ÓÁÍÏÐÏÄÐÉÓÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.RE 
+.IP "\-\-list-options \fBparameters\fR" 10 
+üÔÏ ÓÐÉÓÏË ÒÁÚÄÅÌ£ÎÎÙÈ ÐÒÏÂÅÌÁÍÉ ÉÌÉ ÚÁÐÑÔÙÍÉ ÐÁÒÁÍÅÔÒÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ 
+ÐÒÉ ×Ù×ÏÄÅ ÓÐÉÓËÏ× ËÌÀÞÅÊ É ÐÏÄÐÉÓÅÊ (ÔÁËÉÍÉ ËÏÍÁÎÄÁÍÉ, ËÁË \-\-list-keys, 
+\-\-list-sigs, \-\-list-public-keys, \-\-list-secret-keys É ÆÕÎËÃÉÑÍÉ  
+\-\-edit-key). ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÐÒÅÄ×ÁÒÑÔØÓÑ ÐÒÅÆÉËÓÏÍ `no-' ÄÌÑ ÐÒÉÄÁÎÉÑ 
+ÉÍ ÐÒÏÔÉ×ÏÐÏÌÏÖÎÏÇÏ ÚÎÁÞÅÎÉÑ. éÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ÐÁÒÁÍÅÔÒÙ: 
+.RS 
+.IP "show-photos" 10 
+úÁÓÔÁ×ÌÑÅÔ \-\-list-keys, \-\-list-sigs, \-\-list-public-keys É 
+\-\-list-secret-keys ×Ù×ÏÄÉÔØ ×ÓÅ photo ID ÓÏÄÅÒÖÁÝÉÅÓÑ × ËÌÀÞÅ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. óÍ. ÔÁËÖÅ \-\-photo-viewer. 
+.IP "show-policy-url" 10 
+ðÏËÁÚÙ×ÁÔØ URL ÐÏÌÉÔÉË × ×Ù×ÏÄÅ ËÏÍÁÎÄ \-\-list-sigs É \-\-check-sigs. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-notations" 10 
+.IP "show-std-notations" 10 
+.IP "show-user-notations" 10 
+ðÏËÁÚÙ×ÁÔØ ÐÒÉÍÅÞÁÎÉÑ Ë ÐÏÄÐÉÓÑÍ × ×Ù×ÏÄÅ ËÏÍÁÎÄ \-\-list-sigs É \-\-check-sigs. 
+óÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, ×ÓÅ, ÓÔÁÎÄÁÒÔÎÙÅ IETF, ÉÌÉ ÏÐÒÅÄÅÌ£ÎÎÙÅ ÐÏÌØÚÏ×ÁÔÅÌÅÍ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-keyserver-urls" 10 
+ðÏËÁÚÙ×ÁÔØ URL ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ × ×Ù×ÏÄÅ ËÏÍÁÎÄ  
+\-\-list-sigs É \-\-check-sigs. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-uid-validity" 10 
+ðÏËÁÚÙ×ÁÔØ ×ÙÞÉÓÌÅÎÎÕÀ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× 
+ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÒÉ ×Ù×ÏÄÅ ËÌÀÞÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-unusable-uids" 10 
+ðÏËÁÚÙ×ÁÔØ ÏÔÏÚ×ÁÎÎÙÅ É ÉÓÔ£ËÛÉÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-unusable-subkeys" 10 
+ðÏËÁÚÙ×ÁÔØ ÏÔÏÚ×ÁÎÎÙÅ É ÉÓÔ£ËÛÉÅ ÐÏÄËÌÀÞÉ × ÓÐÉÓËÅ ËÌÀÞÅÊ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-keyring" 10 
+÷Ù×ÏÄÉÔØ ÉÍÑ ÆÁÊÌÁ Ó×ÑÚËÉ ËÌÀÞÅÊ × ÎÁÞÁÌÅ ÓÐÉÓËÁ ËÌÀÞÅÊ, ÞÔÏÂÙ ÐÏËÁÚÁÔØ × 
+ËÁËÏÊ Ó×ÑÚËÅ ÎÁÈÏÄÉÔÓÑ ËÌÀÞ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-sig-expire" 10 
+ðÏËÁÚÙ×ÁÔØ ÄÁÔÙ ÄÏ ËÏÔÏÒÙÈ ÄÅÊÓÔ×ÉÔÅÌØÎÙ ÐÏÄÐÉÓÉ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ 
+\-\-list-sigs É \-\-check-sigs. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-sig-subpackets" 10 
+ðÏËÁÚÙ×ÁÔØ ÐÏÄÐÁËÅÔÙ ÐÏÄÐÉÓÅÊ ÐÒÉ ×Ù×ÏÄÅ ÓÐÉÓËÁ ËÌÀÞÅÊ. äÌÑ ÄÁÎÎÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ ÂÙÔØ ÕËÁÚÁΠÄÏÐÏÌÎÉÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ, ÓÏÄÅÒÖÁÝÉÊ ÓÐÉÓÏË 
+ÐÏÄÐÁËÅÔÏ×, ËÏÔÏÒÙÅ ÓÌÅÄÕÅÔ ×Ù×ÅÓÔÉ. åÓÌÉ ÁÒÇÕÍÅÎÔ ÏÐÕÝÅÎ, ÔÏ ×Ù×ÏÄÑÔÓÑ 
+×ÓÅ ÐÏÄÐÁËÅÔÙ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÍÅÅÔ ÓÍÙÓÌ ÔÏÌØËÏ 
+ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ \-\-with-colons ÓÏ×ÍÅÓÔÎÏ Ó \-\-list-sigs ÉÌÉ \-\-check-sigs. 
+.RE 
+.IP "\-\-verify-options \fBparameters\fR" 10 
+üÔÏ ÓÐÉÓÏË ÒÁÚÄÅÌ£ÎÎÙÈ ÐÒÏÂÅÌÁÍÉ ÉÌÉ ÚÁÐÑÔÙÍÉ ÐÁÒÁÍÅÔÒÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ 
+ÐÒÉ ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÐÒÅÄ×ÁÒÑÔØÓÑ ÐÒÅÆÉËÓÏÍ `no-'  
+ÄÌÑ ÐÒÉÄÁÎÉÑ ÉÍ ÐÒÏÔÉ×ÏÐÏÌÏÖÎÏÇÏ ÚÎÁÞÅÎÉÑ. éÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ÐÁÒÁÍÅÔÒÙ: 
+.RS 
+.IP "show-photos" 10 
+ðÏËÁÚÙ×ÁÔØ ×ÓÅ photo ID ÉÍÅÀÝÉÅÓÑ × ËÌÀÞÅ, ËÏÔÏÒÙÍ ÓÄÅÌÁÎÁ ÐÏÄÐÉÓØ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. óÍ. ÔÁËÖÅ \-\-photo-viewer. 
+.IP "show-policy-url" 10 
+ðÏËÁÚÙ×ÁÔØ URL ÐÏÌÉÔÉË × ÐÒÏ×ÅÒÑÅÍÏÊ ÐÏÄÐÉÓÉ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-notations" 10 
+.IP "show-std-notations" 10 
+.IP "show-user-notations" 10 
+ðÏËÁÚÙ×ÁÔØ ÐÒÉÍÅÞÁÎÉÑ × ÐÒÏ×ÅÒÑÅÍÏÊ ÐÏÄÐÉÓÉ.  
+óÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, ×ÓÅ, ÓÔÁÎÄÁÒÔÎÙÅ IETF, ÉÌÉ ÏÐÒÅÄÅÌ£ÎÎÙÅ ÐÏÌØÚÏ×ÁÔÅÌÅÍ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÐÏËÁÚÙ×ÁÀÔÓÑ ÓÔÁÎÄÁÒÔÎÙÅ ÐÒÉÍÅÞÁÎÉÑ IETF. 
+.IP "show-keyserver-url" 10 
+ðÏËÁÚÙ×ÁÔØ URL ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ × ÐÒÏ×ÅÒÑÅÍÏÊ ÐÏÄÐÉÓÉ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-uid-validity" 10 
+ðÏËÁÚÙ×ÁÔØ ×ÙÞÉÓÌÅÎÎÕÀ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ ÎÁ 
+ËÌÀÞÅ ËÏÔÏÒÙÍ ÓÄÅÌÁÎÁ ÐÏÄÐÉÓØ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.IP "show-unusable-uids" 10 
+ðÏËÁÚÙ×ÁÔØ ÏÔÏÚ×ÁÎÎÙÅ É ÉÓÔ£ËÛÉÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÒÉ 
+ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÉ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. 
+.RE 
+.IP "\-\-show-photos" 10 
+.IP "\-\-no-show-photos" 10 
+ðÒÉ×ÏÄÉÔ Ë ÔÏÍÕ, ÞÔÏ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ \-\-list-keys, \-\-list-sigs,  
+\-\-list-public-keys, \-\-list-secret-keys É ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ ×Ù×ÏÄÑÔÓÑ 
+ÆÏÔÏÇÒÁÆÉÞÅÓËÉÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ Ó×ÑÚÁÎÎÙÅ Ó ËÌÀÞÏÍ, ÅÓÌÉ ÔÁËÏ×ÙÅ ÉÍÅÀÔÓÑ. 
+óÍ. ÔÁËÖÅ \-\-photo-viewer. éÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ. 
+÷ÍÅÓÔÏ ÎÅÇÏ ÌÕÞÛÅ ÉÓÐÏÌØÚÏ×ÁÔØ `\-\-list-options [no-]show-photos' É/ÉÌÉ 
+`\-\-verify-options [no-]show-photos'. 
+\-\-no-show-photos ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-photo-viewer \fBstring\fR" 10 
+ïÐÒÅÄÅÌÑÅÔ ËÏÍÁÎÄÎÕÀ ÓÔÒÏËÕ, ËÏÔÏÒÁÑ ÄÏÌÖÎÁ ÂÙÔØ ×ÙÐÏÌÎÅÎÁ ÄÌÑ ÐÒÏÓÍÏÔÒÁ 
+ÆÏÔÏÇÒÁÆÉÞÅÓËÏÇÏ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ. "%i" ÒÁÓËÒÙ×ÁÅÔÓÑ × ÉÍÑ ÆÁÊÌÁ, 
+ÓÏÄÅÒÖÁÝÅÇÏ ÆÏÔÏÇÒÁÆÉÀ. "%I" ÄÅÌÁÅÔ ÔÏ ÖÅ ÓÁÍÏÅ, ÎÏ ÆÁÊÌ ÎÅ ÂÕÄÅÔ ÕÄẠ́Π
+ÐÏÓÌÅ ×ÙÈÏÄÁ ÉÚ ÐÒÏÇÒÁÍÍÙ ÐÒÏÓÍÏÔÒÁ. "%k" ÚÁÍÅÎÑÅÔÓÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ 
+ËÌÀÞÁ, "%K" \-\- ÄÌÉÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ, "%f" \-\- ÏÔÐÅÞÁÔËÏÍ ËÌÀÞÁ, 
+"%t" \-\- ÒÁÓÛÉÒÅÎÉÅÍ ÄÌÑ ÄÁÎÎÏÇÏ ÔÉÐÁ ÉÚÏÂÒÁÖÅÎÉÊ (ÎÁÐÒ., "jpg"), "%T" \-\- 
+MIME ÔÉÐÏÍ ÉÚÏÂÒÁÖÅÎÉÑ (ÎÁÐÒ., "image/jpeg"), É "%%" \-\- ÚÎÁËÏÍ ÐÒÏÃÅÎÔÁ. 
+åÓÌÉ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ ÎÉ "%i", ÎÉ "%I", ÔÏ ÆÏÔÏÇÒÁÆÉÑ ÐÅÒÅÄÁ£ÔÓÑ ÎÁ 
+ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ ËÏÍÁÎÄÙ ÐÒÏÓÍÏÔÒÁ. 
+.IP "" 10 
+úÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ: 
+"xloadimage \-fork \-quiet \-title 'KeyID 0x%k' stdin" 
+úÁÍÅÔØÔÅ, ÞÔÏ ÅÓÌÉ ÷ÁÛÁ ÐÒÏÇÒÁÍÍÁ ÐÒÏÓÍÏÔÒÁ ÎÅ ÚÁÝÉÝÅÎÁ, ÔÏ ×ÙÚÏ× ÉÚ 
+GnuPG ÎÅ ÓÄÅÌÁÅԠţ ÚÁÝÉÝ£ÎÎÏÊ. 
+.IP "\-\-exec-path \fBstring\fR" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÓÐÉÓÏË ËÁÔÁÌÏÇÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ ÄÌÑ ÐÏÉÓËÁ ÐÒÏÇÒÁÍÍÙ 
+ÐÒÏÓÍÏÔÒÁ ÆÏÔÏÇÒÁÆÉÊ É ÐÏÍÏÝÎÉËÁ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, 
+ÔÏ ÄÌÑ ÐÏÍÏÝÎÉËÁ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÉÓÐÏÌØÚÕÅÔÓÑ ËÁÔÁÌÏÇ ÏÐÒÅÄÅÌ£ÎÎÙÊ ÐÒÉ 
+ËÏÍÐÉÌÑÃÉÉ, Á ÄÌÑ ÐÒÏÇÒÁÍÍÙ ÐÒÏÓÍÏÔÒÁ ÆÏÔÏÇÒÁÆÉÊ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÅÒÅÍÅÎÎÁÑ 
+ÏËÒÕÖÅÎÉÑ $PATH. 
+.IP "\-\-show-keyring" 10 
+÷Ù×ÏÄÉÔØ ÉÍÑ Ó×ÑÚËÉ ËÌÀÞÅÊ × ÎÁÞÁÌÅ ×Ù×ÏÄÁ ÓÐÉÓËÁ ËÌÀÞÅÊ, ÞÔÏÂÙ ÐÏËÁÚÁÔØ 
+× ËÁËÏÊ Ó×ÑÚËÅ ÈÒÁÎÉÔÓÑ ËÌÀÞ. ðÒÉÍÅÎÑÔØ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ. 
+÷ÍÅÓÔÏ ÎÅÇÏ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ `\-\-list-options [no-]show-keyring' 
+.IP "\-\-keyring \fBfile\fR" 10 
+äÏÂÁ×ÉÔØ \fBfile\fR Ë ÔÅËÕÝÅÍÕ ÓÐÉÓËÕ ÎÁÂÏÒÏ× ËÌÀÞÅÊ. åÓÌÉ \fBfile\fR ÎÁÞÉÎÁÅÔÓÑ Ó ÔÉÌØÄÙ É ÓÉÍ×ÏÌÁ ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ ÏÎÉ ÚÁÍÅÎÑÀÔÓÑ ÚÎÁÞÅÎÉÅÍ  
+ÄÏÍÁÛÎÅÇÏ ËÁÔÁÌÏÇÁ. åÓÌÉ ÉÍÑ ÆÁÊÌÁ ÎÅ ÓÏÄÅÒÖÉÔ ÓÉÍ×ÏÌÁ ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ 
+ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ, ÞÔÏ ÆÁÊÌ ÎÁÈÏÄÉÔÓÑ × ÄÏÍÁÛÎÅÍ ËÁÔÁÌÏÇÅ GnuPG ("~/.gnupg" 
+ÅÓÌÉ ÎÅ ÚÁÄÁÎÙ ÐÁÒÁÍÅÔÒ \-\-homedir É ÐÅÒÅÍÅÎÎÁÑ $GNUPGHOME). 
+.IP "" 10 
+úÁÍÅÔØÔÅ, ÞÔÏ ÐÁÒÁÍÅÔÒ ÄÏÂÁ×ÌÑÅÔ Ó×ÑÚËÕ Ë ÔÅËÕÝÅÍÕ ÓÐÉÓËÕ. åÓÌÉ ÎÕÖÎÏ 
+ÉÓÐÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ ÄÁÎÎÕÀ Ó×ÑÚËÕ ËÌÀÞÅÊ, ÔÏ ÐÁÒÁÍÅÔÒ ÓÌÅÄÕÅÔ ÚÁÄÁ×ÁÔØ 
+ÓÏ×ÍÅÓÔÎÏ Ó \-\-no-default-keyring. 
+.IP "\-\-secret-keyring \fBfile\fR" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-keyring ÎÏ ÄÌÑ ÎÁÂÏÒÏ× ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ. 
+.IP "\-\-primary-keyring \fBfile\fR" 10 
+îÁÚÎÁÞÁÅÔ ÆÁÊÌ \fBfile\fR ÇÌÁ×ÎÏÊ Ó×ÑÚËÏÊ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. üÔÏ ÚÎÁÞÉÔ, 
+ÞÔÏ ÎÏ×ÙÅ ÉÍÐÏÒÔÉÒÕÅÍÙÅ ËÌÀÞÉ (ÞÅÒÅÚ \-\-import ÉÌÉ \-\-recv-keys) ÂÕÄÕÔ 
+ÄÏÂÁ×ÌÑÔØÓÑ × ÜÔÕ Ó×ÑÚËÕ. 
+.IP "\-\-trustdb-name \fBfile\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBfile\fR ×ÍÅÓÔÏ ÂÁÚÙ ÄÁÎÎÙÈ Ï ÄÏ×ÅÒÉÑÈ ÐÏ ÕÍÏÌÞÁÎÉÀ. 
+åÓÌÉ \fBfile\fR ÎÁÞÉÎÁÅÔÓÑ Ó ÔÉÌØÄÙ É ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ ÏÎÉ ÚÁÍÅÎÑÀÔÓÑ 
+ÚÎÁÞÅÎÉÅÍ ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ $HOME. åÓÌÉ ÉÍÑ ÆÁÊÌÁ ÎÅ ÓÏÄÅÒÖÉÔ ËÏÓÏÊ 
+ÞÅÒÔÙ, ÔÏ ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ, ÞÔÏ ÏΠÎÁÈÏÄÉÔÓÑ × ÄÏÍÁÛÎÅÍ ËÁÔÁÌÏÇÅ GnuPG 
+("~/.gnupg", ÅÓÌÉ ÎÅ ÚÁÄÁÎÙ \-\-homedir É $GNUPGHOME). 
+.IP "\-\-homedir \fBdirectory\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÉÍÑ ÄÏÍÁÛÎÅÇÏ ËÁÔÁÌÏÇÁ ÒÁ×ÎÙÍ \fBdirectory\fR  
+åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÕÓÔÁÎÏ×ÌÅÎ, ÔÏ ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ 
+"~/.gnupg". éÇÎÏÒÉÒÕÅÔÓÑ × ÆÁÊÌÅ ÐÁÒÁÍÅÔÒÏ×. 
+ðÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ $GNUPGHOME. 
+.IP "\-\-display-charset \fBname\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÉÓÐÏÌØÚÕÅÍÙÊ ÎÁÂÏÒ ÓÉÍ×ÏÌÏ×. éÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÉ 
+ÎÅËÏÔÏÒÙÈ ÓÔÒÏË, ÔÁËÉÈ ËÁË ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ, × ËÏÄÉÒÏ×ËÕ 
+UTF-8. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, ÔÏ ÎÁÂÏÒ ÓÉÍ×ÏÌÏ× ÏÐÒÅÄÅÌÑÅÔÓÑ ÐÏ  
+ÔÅËÕÝÅÊ ÌÏËÁÌÉ. îÁÂÏÒ ÓÉÍ×ÏÌÏ× ×Ù×ÏÄÉÔÓÑ ÐÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ 3È \-v × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. 
+äÏÐÕÓÔÉÍÙÅ ÚÎÁÞÅÎÉÑ \fBname\fR: 
+.RS 
+.IP "iso-8859-1" 10 
+îÁÂÏÒ ÓÉÍ×ÏÌÏ× Latin 1. 
+.IP "iso-8859-2" 10 
+îÁÂÏÒ ÓÉÍ×ÏÌÏ× Latin 2. 
+.IP "iso-8859-15" 10 
+÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÐÓÅ×ÄÏÎÉÍ 
+ÄÌÑ ÎÁÂÏÒÁ Latin 1. 
+.IP "koi8-r" 10 
+òÕÓÓËÁÑ ËÏÄÉÒÏ×ËÁ (rfc1489). 
+.IP "utf-8" 10 
+îÅ ×ÙÐÏÌÎÑÔØ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ É 
+ÐÏÌÁÇÁÔØ, ÞÔÏ OS ÉÓÐÏÌØÚÕÅÔ ËÏÄÉÒÏ×ËÕ UTF-8. 
+.RE 
+.IP "\-\-utf8-strings" 10 
+.IP "\-\-no-utf8-strings" 10 
+ðÏÌÁÇÁÔØ, ÞÔÏ ÁÒÇÕÍÅÎÔÙ ÚÁÄÁÎÙ ËÁË ÓÔÒÏËÉ × ËÏÄÉÒÏ×ËÅ UTF8. ðÏ ÕÍÏÌÞÁÎÉÀ 
+(\-\-no-utf8-strings), ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ ÞÔÏ ÓÔÒÏËÉ ÚÁËÏÄÉÒÏ×ÁÎÙ × ÎÁÂÏÒÅ 
+ÓÉÍ×ÏÌÏ× ÏÐÒÅÄÅÌ£ÎÎÏÍ ÐÁÒÁÍÅÔÒÏÍ \-\-display-charset. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏËÁÚÙ×ÁÅÔ 
+×ÌÉÑÎÉÅ ÎÁ ×ÓÅ ÐÏÓÌÅÄÕÀÝÉÅ ÁÒÇÕÍÅÎÔÙ. ïÂÁ ÐÁÒÁÍÅÔÒÁ ÍÏÇÕÔ ÐÒÉÓÕÔÓÔ×Ï×ÁÔØ 
+× ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ÐÒÏÉÚ×ÏÌØÎÏÅ ÞÉÓÌÏ ÒÁÚ. 
+.IP "\-\-options \fBfile\fR" 10 
+óÞÉÔÁÔØ ÐÁÒÁÍÅÔÒÙ ÉÚ ÆÁÊÌÁ \fBfile\fR É ÎÅ ÐÙÔÁÔØÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ÆÁÊÌ ÐÏ 
+ÕÍÏÌÞÁÎÉÀ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÇÎÏÒÉÒÕÅÔÓÑ ÅÓÌÉ ÏΠÕËÁÚÁΠנÆÁÊÌÅ 
+ÐÁÒÁÍÅÔÒÏ×. 
+.IP "\-\-no-options" 10 
+óÏËÒÁÝÅÎÉÅ ÄÌÑ "\-\-options /dev/null".  äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÐÒÅÄÅÌÑÅÔÓÑ ÄÏ 
+ÏÔËÒÙÔÉÑ ÆÁÊÌÁ ÐÁÒÁÍÅÔÒÏ×. ðÒÅÄÏÔ×ÒÁÝÁÅÔ, ÔÁËÖÅ, ÓÏÚÄÁÎÉÅ ËÁÔÁÌÏÇÁ 
+"~./gnupg". 
+.IP "\-\-load-extension \fBname\fR" 10 
+úÁÇÒÕÚÉÔØ ÍÏÄÕÌØ ÒÁÓÛÉÒÅÎÉÑ. åÓÌÉ \fBname\fR ÎÅ ÓÏÄÅÒÖÉÔ ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ 
+ÍÏÄÕÌØ ÉÝÅÔÓÑ × ËÁÔÁÌÏÇÅ ÚÁÄÁÎÎÏÍ ÐÒÉ ËÏÍÐÉÌÑÃÉÉ (ÏÂÙÞÎÏ  
+"/usr/local/lib/gnupg"). òÁÓÛÉÒÅÎÉÑ, ËÁË ÐÒÁ×ÉÌÏ, ÂÏÌØÛÅ ÎÅ 
+ÉÓÐÏÌØÚÕÀÔÓÑ, É ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÎÅ ÖÅÌÁÔÅÌØÎÏ. 
+.IP "\-\-debug \fBflags\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÏÔÌÁÄÏÞÎÙÅ ÆÌÁÇÉ. ÷ÓÅ ÆÌÁÇÉ ÏÂßÅÄÉÎÑÀÔÓÑ ÐÒÉ ÏÐÅÒÁÃÉÅÊ 
+OR É \fBflags\fR ÍÏÖÅÔ ÂÙÔØ ÚÁÄÁΠנÓÔÉÌÅ C (ÎÁÐÒ., 0x0042). 
+.IP "\-\-debug-all" 10 
+õÓÔÁÎÏ×ÉÔØ ×ÓÅ ÉÓÐÏÌØÚÕÅÍÙÅ ÏÔÌÁÄÏÞÎÙÅ ÆÌÁÇÉ. 
+.IP "\-\-debug-ccid-driver" 10 
+÷ËÌÀÞÉÔØ ×Ù×ÏÄ ÏÔÌÁÄÏÞÎÏÊ ÉÎÆÏÒÍÁÃÉÉ CCID ÄÒÁÊ×ÅÒÁ ÄÌÑ ÓÍÁÒÔËÁÒÔ. 
+úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÏÓÔÕÐÅΠÎÅ ÎÁ ×ÓÅÈ ÓÉÓÔÅÍÁÈ. 
+.IP "\-\-enable-progress-filter" 10 
+÷ËÌÀÞÁÅÔ ×Ù×ÏÄ ÉÎÆÏÒÍÁÃÉÉ Ï ÈÏÄÅ ×ÙÐÏÌÎÅÎÉÑ ÒÁÂÏÔÙ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÐÏÚ×ÏÌÑÅÔ ÏÂÏÌÏÞËÁÍ ÏÔÏÂÒÁÖÁÔØ ÉÎÄÉËÁÔÏÒ ÐÒÏÇÒÅÓÓÁ ÐÒÉ ÏÂÒÁÂÏÔËÅ gpg 
+ÂÏÌØÛÉÈ ÆÁÊÌÏ×. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÎÅÍÎÏÇÏ ÓÎÉÖÁÅÔÓÑ 
+ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔØ. 
+.IP "\-\-status-fd \fBn\fR" 10 
+÷Ù×ÏÄÉÔØ ÓÔÒÏËÉ ÓÏÓÔÏÑÎÉÑ × ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ \fBn\fR. 
+óÍ. ÆÁÊÌ DETAILS × ÄÏËÕÍÅÎÔÁÃÉÉ. 
+.IP "\-\-logger-fd \fBn\fR" 10 
+÷Ù×ÏÄÉÔØ ÖÕÒÎÁÌ × ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ \fBn\fR, Á ÎÅ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ. 
+.IP "\-\-attribute-fd \fBn\fR" 10 
+÷Ù×ÏÄÉÔØ ÐÏÄÐÁËÅÔÙ ÁÔÒÉÂÕÔÏ× × ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ \fBn\fR.  îÁÉÂÏÌÅÅ 
+ÐÒÉÍÅÎÉÍÏ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÓÏ×ÍÅÓÔÎÏ Ó \-\-status-fd, Ô.Ë. ÓÏÏÂÝÅÎÉÑ 
+ÓÏÓÔÏÑÎÉÑ ÄÏÌÖÎÙ ÂÙÔØ ÏÔÄÅÌÅÎÙ ÏÔ ÒÁÚÌÉÞÎÙÈ ÐÏÄÐÁËÅÔÏ×. 
+.IP "\-\-sk-comments" 10 
+.IP "\-\-no-sk-comments" 10 
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ÐÁËÅÔÙ ËÏÍÍÅÎÔÁÒÉÅ× ÄÌÑ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ ÐÒÉ ÜËÓÐÏÒÔÅ 
+ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ. üÔÏ ÒÁÓÛÉÒÅÎÉÅ GnuPG ÓÔÁÎÄÁÒÔÁ OpenPGP. ïÔËÌÀÞÅÎÏ ÐÏ 
+ÕÍÏÌÞÁÎÉÀ. úÁÍÅÔØÔÅ, ÞÔÏ ÜÔÏÔ ÐÁÒÁÍÅÔÒ ÎÅ ÉÍÅÅÔ ÎÉÞÅÇÏ ÏÂÝÅÇÏ Ó 
+ËÏÍÍÅÎÔÁÒÉÑÍÉ × ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÑÈ É ÚÁÇÏÌÏ×ËÁÈ ASCII ÆÏÒÍÁÔÁ. 
+\-\-no-sk-comments ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-comment \fBstring\fR" 10 
+.IP "\-\-no-comments" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBstring\fR × ËÁÞÅÓÔ×Å ËÏÍÍÅÎÔÁÒÉÑ × ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÑÈ, 
+ASCII ÚÁËÏÄÉÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÑÈ É ËÌÀÞÁÈ (ÓÍ. \-\-armor). 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÓÔÒÏËÁ ËÏÍÍÅÎÔÁÒÉÑ ÏÔÓÕÔÓÔ×ÕÅÔ. \-\-comment ÍÏÖÅÔ ÂÙÔØ ÕËÁÚÁΠ
+ÎÅÓËÏÌØËÏ ÒÁÚ ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÎÅÓËÏÌØËÉÈ ÓÔÒÏË ËÏÍÍÅÎÔÁÒÉÅ×. \-\-no-comments 
+ÕÄÁÌÑÅÔ ×ÓÅ ËÏÍÍÅÎÔÁÒÉÉ. 
+.IP "\-\-emit-version" 10 
+.IP "\-\-no-emit-version" 10 
+ðÒÉ×ÏÄÉÔ Ë ×ËÌÀÞÅÎÉÀ ÓÔÒÏËÉ ×ÅÒÓÉÉ × ×Ù×ÏÄ × ASCII ÆÏÒÍÁÔÅ. 
+\-\-no-emit-version ÏÔËÌÀÞÁÅÔ ÐÁÒÁÍÅÔÒ. 
+.IP "\-\-sig-notation \fBname=value\fR" 10 
+.IP "\-\-cert-notation \fBname=value\fR" 10 
+.IP "\-N, \-\-set-notation \fBname=value\fR" 10 
+ðÏÍÅÓÔÉÔØ ÐÁÒÕ ÉÍÑ \- ÚÎÁÞÅÎÉÅ × ÐÏÄÐÉÓØ, ËÁË ÐÒÉÍÅÞÁÎÉÅ. 
+\fBname\fR ÄÏÌÖÎÏ ÓÏÄÅÒÖÁÔØ ÔÏÌØËÏ ÐÅÞÁÔÎÙÅ ÓÉÍ×ÏÌÙ ÉÌÉ ÐÒÏÂÅÌÙ, É 
+ÄÏÌÖÅΠÓÏÄÅÒÖÁÔØ ÓÉÍ×ÏÌ '@'. üÔÏ ÄÅÌÁÅÔÓÑ Ó ÃÅÌØÀ ÐÒÅÄÏÔ×ÒÁÔÉÔØ 
+ÚÁÓÏÒÅÎÉÅ ÚÁÒÅÚÅÒ×ÉÒÏ×ÁÎÎÏÇÏ IETF ÐÒÏÓÔÒÁÎÓÔ×Á ÉÍ£Î. æÌÁÇ \-\-expert 
+ÏÔÍÅÎÑÅÔ ÐÒÏ×ÅÒËÕ ÎÁÌÉÞÉÑ '@'. \fBvalue\fR ÍÏÖÅÔ ÂÙÔØ ÌÀÂÏÊ ÐÅÞÁÔÎÏÊ 
+ÓÔÒÏËÏÊ; ÜÔÁ ÓÔÒÏËÁ ÂÕÄÅÔ ÚÁËÏÄÉÒÏ×ÁÎÁ × UTF8, ÔÁË ÞÔÏ ÷ÁÍ ÓÌÅÄÕÅÔ 
+ÐÒÏ×ÅÒÉÔØ ËÏÒÒÅËÔÎÏÓÔØ ÕÓÔÁÎÏ×ËÉ ÐÁÒÁÍÅÔÒÁ \-\-display-charset.  
+åÓÌÉ ÷Ù ÐÒÅÄ×ÁÒÉÔÅ \fBname\fR ×ÏÓËÌÉÃÁÔÅÌØÎÙÍ ÚÎÁËÏÍ (!), ÔÏ ÐÒÉÍÅÞÁÎÉÅ  
+ÂÕÄÅÔ ÐÏÍÅÞÅÎÏ ËÁË ËÒÉÔÉÞÅÓËÏÅ (rfc2440:5.2.3.15). 
+\-\-sig-notation ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÐÒÉÍÅÞÁÎÉÅ ÄÌÑ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ, 
+\-\-cert-notation ÄÌÑ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ (ÓÅÒÔÉÆÉËÁÃÉÉ), \-\-set-notation 
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÏÂÁ ÐÁÒÁÍÅÔÒÁ. 
+.IP "" 10 
+éÍÅÀÔÓÑ ÓÐÅÃÉÁÌØÎÙÅ ËÏÄÙ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÐÒÉÍÅÞÁÎÉÑÈ.  
+"%k" ÂÕÄÅÔ ÚÁÍÅΣΠÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÐÏÄÐÉÓÙ×ÁÅÍÏÇÏ ËÌÀÞÁ,  
+"%K" \- ÄÌÉÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÐÏÄÐÉÓÙ×ÁÅÍÏÇÏ ËÌÀÞÁ,  
+"%f" \- ÏÔÐÅÞÁÔËÏÍ ÐÏÄÐÉÓÙ×ÁÅÍÏÇÏ ËÌÀÞÁ,  
+"%s" \- ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ,  
+"%S" \- ÄÌÉÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ,  
+"%g" \- ÏÔÐÅÞÁÔËÏÍ ËÌÀÞÁ (ÐÏÄËÌÀÞÁ) ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ, 
+"%p" \- ÏÔÐÅÞÁÔËÏÍ ÇÌÁ×ÎÏÇÏ ËÌÀÞÁ ËÌÀÞÁ ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ, 
+"%c" \- ÓÞ£ÔÞÉËÏÍ ÐÏÄÐÉÓÅÊ OpenPGP ÓÍÁÒÔËÁÒÔÙ, 
+"%%" ÂÕÄÅÔ ÚÁÍÅΣΠÏÄÎÉÍ ÚÎÁËÏÍ "%".  
+%k, %K, É %f ÉÍÅÀÔ ÓÍÙÓÌ ÔÏÌØËÏ ÐÒÉ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ (ÓÅÒÔÉÆÉËÁÃÉÉ), Á %c 
+ÔÏÌØËÏ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ OpenPGP ÓÍÁÒÔËÁÒÔÙ. 
+.IP "\-\-show-notation" 10 
+.IP "\-\-no-show-notation" 10 
+ðÏËÁÚÙ×ÁÔØ ÐÒÉÍÅÞÁÎÉÑ × ÐÏÄÐÉÓÑÈ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ \-\-list-sigs É  
+\-\-check-sigs É ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ, ÓÏÄÅÒÖÁÝÉÈ ÐÒÉÍÅÞÁÎÉÑ. éÓÐÏÌØÚÏ×ÁÔØ 
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ. éÓÐÏÌØÚÕÊÔÅ ×ÍÅÓÔÏ ÎÅÇÏ 
+`\-\-list-options [no-]show-notation' É/ÉÌÉ 
+`\-\-verify-options [no-]show-notation'. 
+.IP "\-\-sig-policy-url \fBstring\fR" 10 
+.IP "\-\-cert-policy-url \fBstring\fR" 10 
+.IP "\-\-set-policy-url \fBstring\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBstring\fR × ËÁÞÅÓÔ×Å URL ÐÏÌÉÔÉËÉ ÄÌÑ ÐÏÄÐÉÓÅÊ 
+(rfc2440:5.2.3.19). åÓÌÉ ÷Ù ÐÒÅÄ×ÁÒÉÔÅ ÅÇÏ ×ÏÓËÌÉÃÁÔÅÌØÎÙÍ ÚÎÁËÏÍ (!),  
+ÔÏ ÐÁËÅÔ Ó URL ÂÕÄÅÔ ÐÏÍÅÞÅΠËÁË ËÒÉÔÉÞÅÓËÉÊ. \-\-sig-policy-url 
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ URL ÐÏÌÉÔÉËÉ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ, \-\-cert-policy-url URL  
+ÐÏÌÉÔÉËÉ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ (ÓÅÒÔÉÆÉËÁÃÉÉ), Á \-set-policy-url  
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÏÂÁ ÐÁÒÁÍÅÔÒÁ. 
+.IP "" 10 
+äÏÓÔÕÐÎÙ ÔÅ ÖÅ ÐÏÄÓÔÁÎÏ×ËÉ Ó '%', ÞÔÏ É ÄÌÑ ÐÒÉÍÅÞÁÎÉÊ. 
+.IP "\-\-show-policy-url" 10 
+.IP "\-\-no-show-policy-url" 10 
+ðÏËÁÚÙ×ÁÔØ URL ÐÏÌÉÔÉË ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ \-\-list-sigs É  
+\-\-check-sigs É ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ, ÓÏÄÅÒÖÁÝÉÈ URL ÐÏÌÉÔÉË. éÓÐÏÌØÚÏ×ÁÔØ 
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ. éÓÐÏÌØÚÕÊÔÅ ×ÍÅÓÔÏ ÎÅÇÏ 
+`\-\-list-options [no-]show-policy-url' É/ÉÌÉ 
+`\-\-verify-options [no-]show-policy-url'. 
+.IP "\-\-sig-keyserver-url \fBstring\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBstring\fR × ËÁÞÅÓÔ×Å URL ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ 
+× ÐÏÄÐÉÓÑÈ ÄÁÎÎÙÈ. åÓÌÉ ÷Ù ÐÒÅÄ×ÁÒÉÔÅ ÅÇÏ ×ÏÓËÌÉÃÁÔÅÌØÎÙÍ ÚÎÁËÏÍ,  
+ÔÏ ÐÁËÅÔ Ó URL ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÂÕÄÅÔ ÐÏÍÅÞÅΠËÁË ËÒÉÔÉÞÅÓËÉÊ. 
+.IP "" 10 
+äÏÓÔÕÐÎÙ ÔÅ ÖÅ ÐÏÄÓÔÁÎÏ×ËÉ Ó '%', ÞÔÏ É ÄÌÑ ÐÒÉÍÅÞÁÎÉÊ. 
+.IP "\-\-set-filename \fBstring\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ \fBstring\fR ËÁË ÉÍÑ ÆÁÊÌÁ, ÓÏÄÅÒÖÁÝÅÇÏÓÑ × ÓÏÏÂÝÅÎÉÉ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÅÊÓÔ×ÉÔÅÌØÎÏÅ ÉÍÑ ÚÁÛÉÆÒÏ×Ù×ÁÅÍÏÇÏ ÆÁÊÌÁ. 
+.IP "\-\-for-your-eyes-only" 10 
+.IP "\-\-no-for-your-eyes-only" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ × ÓÏÏÂÝÅÎÉÉ ÆÌÁÇ `for your eyes only'. üÔÏ ÐÒÉ×ÏÄÉÔ Ë 
+ÔÏÍÕ, ÞÔÏ GnuPG ÎÅ ÓÏÈÒÁÎÑÅÔ ÒÁÓÛÉÆÒÏ×ÁÎÎÙÊ ÆÁÊÌ ÅÓÌÉ ÎÅ ÕËÁÚÁΠÐÁÒÁÍÅÔÒ 
+\-\-output, Á PGP ÉÓÐÏÌØÚÕÅÔ "secure viewer" ÄÌÑ ×Ù×ÏÄÁ ÓÏÏÂÝÅÎÉÑ. äÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ ÐÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÁÒÁÍÅÔÒÁ \-\-set-filename. 
+\-\-no-for-your-eyes-only ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-use-embedded-filename" 10 
+.IP "\-\-no-use-embedded-filename" 10 
+ðÏÐÙÔÁÔØÓÑ ÓÏÚÄÁÔØ ÆÁÊÌ Ó ÉÍÅÎÅÍ ÕËÁÚÁÎÎÙÍ × ÄÁÎÎÙÈ. íÏÖÅÔ ÂÙÔØ 
+ÎÅÂÅÚÏÐÁÓÎÏÊ, Ô.Ë. ÐÏÚ×ÏÌÑÅÔ ÐÅÒÅÚÁÐÉÓÙ×ÁÔØ ÆÁÊÌÙ. ðÏ ÕÍÏÌÞÁÎÉÀ 
+ÏÔËÌÀÞÅÎÏ. 
+.IP "\-\-completes-needed \fBn\fR" 10 
+þÉÓÌÏ ÐÏÄÐÉÓÅÊ ÎÁ ËÌÀÞÅ, ÓÄÅÌÁÎÎÙÈ ÐÏÌØÚÏ×ÁÔÅÌÑÍÉ ËÏÔÏÒÙÍ ÷Ù ÐÏÌÎÏÓÔØÀ 
+ÄÏ×ÅÒÑÅÔÅ, ÎÅÏÂÈÏÄÉÍÙÈ ÄÌÑ ÐÒÉÚÎÁÎÉÑ ËÌÀÞÁ ÄÏÓÔÏ×ÅÒÎÙÍ (ÐÏ ÕÍÏÌÞÁÎÉÀ 1).  
+.IP "\-\-marginals-needed \fBn\fR" 10 
+þÉÓÌÏ ÐÏÄÐÉÓÅÊ ÎÁ ËÌÀÞÅ, ÓÄÅÌÁÎÎÙÈ ÐÏÌØÚÏ×ÁÔÅÌÑÍÉ ËÏÔÏÒÙÍ ÷Ù ÄÏ×ÅÒÑÅÔÅ ÎÅ 
+ÐÏÌÎÏÓÔØÀ, ÎÅÏÂÈÏÄÉÍÙÈ ÄÌÑ ÐÒÉÚÎÁÎÉÑ ËÌÀÞÁ ÄÏÓÔÏ×ÅÒÎÙÍ (ÐÏ ÕÍÏÌÞÁÎÉÀ 3). 
+.IP "\-\-max-cert-depth \fBn\fR" 10 
+íÁËÓÉÍÁÌØÎÁÑ ÄÌÉÎÁ ÃÅÐÏÞËÉ ÓÅÒÔÉÆÉËÁÃÉÉ (ÐÏ ÕÍÏÌÞÁÎÉÀ 5). 
+.IP "\-\-cipher-algo \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ  \fBname\fR. úÁÐÕÓË ÐÒÏÇÒÁÍÍÙ Ó 
+ËÏÍÁÎÄÏÊ \-\-version ×Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÁÌÇÏÒÉÔÍÏ× ÛÉÆÒÏ×ÁÎÉÑ. 
+åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ, ÔÏ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ ×ÙÂÉÒÁÅÔÓÑ 
+ÉÚ ÕËÁÚÁÎÎÙÈ × ÓÐÉÓËÅ ÐÒÅÄÐÏÞÔÅÎÉÊ ËÌÀÞÁ. 
+.IP "\-\-digest-algo \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÈÜÛ\-ÆÕÎËÃÉÀ \fBname\fR. úÁÐÕÓË ÐÒÏÇÒÁÍÍÙ Ó 
+ËÏÍÁÎÄÏÊ \-\-version ×Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÈÜÛ\-ÆÕÎËÃÉÊ. 
+.IP "\-\-compress-algo \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ ÓÖÁÔÉÑ \fBname\fR.  "zlib" ÄÌÑ ÁÌÇÏÒÉÔÍÁ ZLIB 
+ÏÐÒÅÄÅÌ£ÎÎÏÇÏ × RFC1950. "zip" ÄÌÑ ÁÌÇÏÒÉÔÍÁ ZIP ÏÐÒÅÄÅÌ£ÎÎÏÇÏ ×  
+RFC-1951 É ÉÓÐÏÌØÚÕÅÍÏÇÏ PGP. "bzip2" ÂÏÌÅÅ ÓÏ×ÒÅÍÅÎÎÙÊ ÁÌÇÏÒÉÔÍ  
+ÓÖÁÔÉÑ, ËÏÔÏÒÙÊ ÍÏÖÅÔ ÓÖÉÍÁÔØ × ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ ÌÕÞÛÅ, ÎÏ ÔÒÅÂÕÅÔ 
+ÂÏÌØÛÅÇÏ ÏÂߣÍÁ ÐÁÍÑÔÉ. "uncompressed" ÉÌÉ "none" ÏÔËÌÀÞÁÅÔ 
+ÓÖÁÔÉÅ. åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, ÔÏ ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ 
+ÁÌÇÏÒÉÔÍ ÕËÁÚÁÎÎÙÊ × ËÌÀÞÅ ÐÏÌÕÞÁÔÅÌÑ × ËÁÞÅÓÔ×Å ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ. 
+åÓÌÉ ÏÐÒÅÄÅÌÉÔØ ÁÌÇÏÒÉÔÍ ÎÅ ÕÄÁ£ÔÓÑ, ÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ZIP ÄÌÑ ÄÏÓÔÉÖÅÎÉÑ 
+ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ. 
+.IP "" 10 
+ZLIB ÏÂÅÓÐÅÞÉ×ÁÅÔ ÂÏÌØÛÅÅ ÓÖÁÔÉÅ, ÐÏ ÓÒÁ×ÎÅÎÉÀ Ó ZIP, Ô.Ë. ÎÅ 
+ÏÇÒÁÎÉÞÉ×ÁÅÔ ÒÁÚÍÅÒ ÏËÎÁ ×ÅÌÉÞÉÎÏÊ 8ËÂÁÊÔ. BZIP2 ÄÁ£Ô ÅÝ£ ÌÕÞÛÉÅ 
+ÒÅÚÕÌØÔÁÔÙ, ÎÏ ÉÓÐÏÌØÚÕÅÔ ÚÎÁÞÉÔÅÌØÎÏ ÂÏÌØÛÅ ÐÁÍÑÔÉ, ÞÔÏ ÍÏÖÅÔ ÂÙÔØ 
+ÚÎÁÞÉÍÙÍ ÐÒÉ ÏÇÒÁÎÉÞÅÎÎÏÍ ÏÂߣÍÅ ÐÁÍÑÔÉ. úÁÍÅÔÉÍ, ÏÄÎÁËÏ, ÞÔÏ PGP (×ÓÅ 
+×ÅÒÓÉÉ) ÐÏÄÄÅÒÖÉ×ÁÅÔ ÔÏÌØËÏ ZIP. éÓÐÏÌØÚÏ×ÁÎÉÅ ÁÌÇÏÒÉÔÍÏ× ÏÔÌÉÞÎÙÈ ÏÔ 
+ZIP ÉÌÉ "none" ÄÅÌÁÅÔ ÓÏÏÂÝÅÎÉÅ ÎÅÞÉÔÁÂÅÌØÎÙÍ ÄÌÑ PGP. 
+.IP "\-\-cert-digest-algo \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÈÜÛ\-ÆÕÎËÃÉÀ \fBname\fR ÐÒÉ ÐÏÄÐÉÓÉ ËÌÀÞÁ. úÁÐÕÓË ÐÒÏÇÒÁÍÍÙ Ó 
+ËÏÍÁÎÄÏÊ \-\-version ×Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÈÜÛ\-ÆÕÎËÃÉÊ. âÕÄØÔÅ 
+ÏÓÔÏÒÏÖÎÙ, Ô.Ë. ÅÓÌÉ ÷Ù ×ÙÂÅÒÅÔÅ ÁÌÇÏÒÉÔÍ ÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ GnuPG, ÎÏ ÎÅ 
+ÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ ÄÒÕÇÉÍÉ ÒÅÁÌÉÚÁÃÉÑÍÉ OpenPGP, ÔÏ ÎÅËÏÔÏÒÙÅ ÐÏÌØÚÏ×ÁÔÅÌÉ 
+ÎÅ ÓÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÄÅÌÁÎÎÕÀ ÷ÁÍÉ ÐÏÄÐÉÓØ, ÉÌÉ ÄÁÖÅ ×ÅÓØ ËÌÀÞ.  
+.IP "\-\-s2k-cipher-algo \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÚÁÝÉÔÙ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ \fBname\fR. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ CAST5. äÁÎÎÙÊ ÁÌÇÏÒÉÔÍ ÉÓÐÏÌØÚÕÅÔÓÑ, ÔÁËÖÅ, 
+ÄÌÑ ÓÉÍÍÅÔÒÉÞÎÏÇÏ ÛÉÆÒÏ×ÁÎÉÑ, × ÓÌÕÞÁÅ ÅÓÌÉ ÎÅ ÚÁÄÁÎÙ ÐÁÒÁÍÅÔÒÙ 
+\-\-personal-cipher-preferences É \-\-cipher-algo. 
+.IP "\-\-s2k-digest-algo \fBname\fR" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÈÜÛ\-ÆÕÎËÃÉÀ  \fBname\fR ÄÌÑ ÏÂÒÁÂÏÔËÉ ËÌÀÞÅ×ÏÊ ÆÒÁÚÙ 
+(ÐÁÒÏÌÑ). ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ SHA-1.  
+.IP "\-\-s2k-mode \fBn\fR" 10 
+ïÐÒÅÄÅÌÑÅÔ ÍÅÔÏÄ ÏÂÒÁÂÏÔËÉ ËÌÀÞÅ×ÏÊ ÆÒÁÚÙ (ÐÁÒÏÌÑ). åÓÌÉ \fBn\fR ÒÁ×ÅΠ0, ÔÏ 
+ËÌÀÞÅ×ÁÑ ÆÒÁÚÁ ÎÅ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ (ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ), ÅÓÌÉ 1, ÔÏ Ë ËÌÀÞÅ×ÏÊ  
+ÆÒÁÚÅ ÄÏÂÁ×ÌÑÅÔÓÑ "ÓÏÌØ" (ÓÌÕÞÁÊÎÙÅ ÄÁÎÎÙÅ) É ÅÓÌÉ 3 (ÉÓÐÏÌØÚÕÅÔÓÑ ÐÏ 
+ÕÍÏÌÞÁÎÉÀ), ÔÏ ×ÅÓØ ÐÒÏÃÅÓÓ ÐÏ×ÔÏÒÑÅÔÓÑ ÎÅÓËÏÌØËÏ ÒÁÚ. åÓÌÉ ÎÅ ÚÁÄÁΠ 
+ÐÁÒÁÍÅÔÒ \-\-rfc1991, ÔÏ ÄÁÎÎÙÊ ÒÅÖÉÍ ÉÓÐÏÌØÚÕÅÔÓÑ É ÐÒÉ ÓÉÍÍÅÔÒÉÞÎÏÍ ÛÉÆÒÏ×ÁÎÉÉ. 
+.IP "\-\-simple-sk-checksum" 10 
+ãÅÌÏÓÔÎÏÓÔØ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ ÚÁÝÉÝÁÅÔÓÑ ÐÒÉ ÐÏÍÏÝÉ ËÏÎÔÒÏÌØÎÏÊ ÓÕÍÍÙ 
+SHA-1. äÁÎÎÙÊ ÍÅÔÏÄ Ñ×ÌÑÅÔÓÑ ÞÁÓÔØÀ ÒÁÓÛÉÒÅÎÎÏÊ ÓÐÅÃÉÆÉËÁÃÉÉ 
+OpenPGP, ÎÏ GnuPG ÕÖÅ ÉÓÐÏÌØÚÕÅÔ ÅÇÏ × ËÁÞÅÓÔ×Å ËÏÎÔÒÍÅÒÙ ÐÒÏÔÉ× 
+ÎÅËÏÔÏÒÙÈ ÁÔÁË. óÔÁÒÙÅ ÐÒÉÌÏÖÅÎÉÑ ÎÅ ÐÏÎÉÍÁÀÔ ÎÏ×ÙÊ ÆÏÒÍÁÔ, É ÄÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÅÒÅÄÁÞÉ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ ÔÁËÉÍ 
+ÐÒÉÌÏÖÅÎÉÑÍ. éÓÐÏÌØÚÏ×ÁÎÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÒÉÓËÏ×ÁÎÏ Ó ÔÏÞËÉ ÚÒÅÎÉÑ 
+ÂÅÚÏÐÁÓÎÏÓÔÉ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÁÒÁÍÅÔÒ ÏËÁÚÙ×ÁÅÔ ÜÆÆÅËÔ ÔÏÌØËÏ ÐÒÉ 
+ÛÉÆÒÏ×ÁÎÉÉ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÐÒÏÓÔÅÊÛÉÊ ÓÐÏÓÏ ÄÏÂÉÔØÓÑ ÜÔÏÇÏ \- ÓÍÅÎÉÔØ 
+ÐÁÒÏÌØ ÎÁ ËÌÀÞÅ (ÐÕÓÔØ ÄÁÖÅ ÎÁ ÔÏÔ ÖÅ ÓÁÍÙÊ). 
+.IP "\-\-disable-cipher-algo \fBname\fR" 10 
+îÉËÏÇÄÁ ÎÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ \fBname\fR. úÁÄÁÎÎÏÅ ÉÍÑ ÎÅ 
+ÐÒÏ×ÅÒÑÅÔÓÑ, ÐÏÜÔÏÍÕ ÁÌÇÏÒÉÔÍ ÚÁÇÒÕÖÅÎÎÙÊ ÐÏÚÖÅ ÏÓÔÁÎÅÔÓÑ ÏÔËÌÀÞÅÎÎÙÍ. 
+.IP "\-\-disable-pubkey-algo \fBname\fR" 10 
+îÉËÏÇÄÁ ÎÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ Ó ÏÔËÒÙÔÙÍ ËÌÀÞÏÍ \fBname\fR. úÁÄÁÎÎÏÅ  
+ÉÍÑ ÎÅ ÐÒÏ×ÅÒÑÅÔÓÑ, ÐÏÜÔÏÍÕ ÁÌÇÏÒÉÔÍ ÚÁÇÒÕÖÅÎÎÙÊ ÐÏÚÖÅ ÏÓÔÁÎÅÔÓÑ  
+ÏÔËÌÀÞÅÎÎÙÍ. 
+.IP "\-\-no-sig-cache" 10 
+îÅ ËÜÛÉÒÏ×ÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÓÏÓÔÏÑÎÉÉ ÐÒÏ×ÅÒËÉ ÐÏÄÐÉÓÅÊ. ëÜÛÉÒÏ×ÁÎÉÅ 
+ÚÎÁÞÉÔÅÌØÎÏ Õ×ÅÌÉÞÉ×ÁÅÔ ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔØ ÐÒÉ ×Ù×ÏÄÅ ÓÐÉÓËÁ ËÌÀÞÅÊ. 
+ïÄÎÁËÏ, ÅÓÌÉ ÷Ù ÓÏÍÎÅ×ÁÅÔÅÓØ × ÚÁÝÉÝÅÎÎÏÓÔÉ ÷ÁÛÅÇÏ ÎÁÂÏÒÁ ÏÔËÒÙÔÙÈ 
+ËÌÀÞÅÊ ÏÔ ÉÚÍÅÎÅÎÉÊ, ÔÏ ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÌÑ 
+ÏÔËÌÀÞÅÎÉÑ ËÜÛÉÒÏ×ÁÎÉÑ. ÷ÅÒÏÑÔÎÏ ÄÁÎÎÁÑ ÏÐÅÒÁÃÉÑ ÌÉÛÅÎÁ ÏÓÏÂÏÇÏ ÓÍÙÓÌÁ, 
+ÐÏÓËÏÌØËÕ ÅÓÌÉ ËÔÏ\-ÌÉÂÏ ÉÍÅÅÔ ÄÏÓÔÕРÎÁ ÚÁÐÉÓØ × ÷ÁÛ ÎÁÂÏÒ ÏÔËÒÙÔÙÈ 
+ËÌÀÞÅÊ, ÔÏ ÏΠÍÏÖÅÔ ×ÙÐÏÌÎÉÔØ ÌÀÂÙÅ ×ÉÄÙ ÐÏ×ÒÅÖÄÅÎÉÊ. 
+.IP "\-\-no-sig-create-check" 10 
+GnuPG, ËÁË ÐÒÁ×ÉÌÏ, ÐÒÏ×ÅÒÑÅÔ ËÁÖÄÕÀ ÐÏÄÐÉÓØ ÐÏÓÌŠţ ÓÏÚÄÁÎÉÑ ÄÌÑ 
+ÚÁÝÉÔÙ ÏÔ ÏÛÉÂÏË É ÓÂÏÅ× ÁÐÐÁÒÁÔÎÏÊ ÞÁÓÔÉ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÐÒÉ×ÅÓÔÉ Ë 
+ÉÚÍÅÎÅÎÉÀ ÂÉÔÏ× ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ. üÔÁ ÄÏÐÏÌÎÉÔÅÌØÎÁÑ ÐÒÏ×ÅÒËÁ ÚÁÎÉÍÁÅÔ 
+ÎÅËÏÔÏÒÏÅ ×ÒÅÍÑ (ÏËÏÌÏ 115% ÄÌÑ DSA ËÌÀÞÅÊ). äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÔËÌÀÞÅÎÉÑ ÐÒÏ×ÅÒËÉ. ïÄÎÁËÏ, ÐÏÓËÏÌØËÕ ÓÏÚÄÁÎÉÅ ÐÏÄÐÉÓÉ 
+ÐÒÏÉÓÈÏÄÉÔ × ÉÎÔÅÒÁËÔÉ×ÎÏÍ ÒÅÖÉÍÅ, ×ÙÉÇÒÙÛ ×ÒÅÍÅÎÉ ÏÔ ÕÓÔÁÎÏ×ËÉ ÄÁÎÎÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ ÂÕÄÅÔ ÎÅÚÁÍÅÔÅΠנÂÏÌØÛÉÎÓÔ×Å ËÏÎÆÉÇÕÒÁÃÉÊ. 
+.IP "\-\-auto-check-trustdb" 10 
+.IP "\-\-no-auto-check-trustdb" 10 
+åÓÌÉ GnuPG ÐÏÌÁÇÁÅÔ, ÞÔÏ ÉÎÆÏÒÍÁÃÉÑ × ÓÅÔÉ ÄÏ×ÅÒÉÑ ÄÏÌÖÎÁ ÂÙÔØ 
+ÏÂÎÏ×ÌÅÎÁ, ÔÏ ÏΠÁ×ÔÏÍÁÔÉÞÅÓËÉ ×ÙÐÏÌÎÑÅÔ ËÏÍÁÎÄÕ \-\-check-trustdb.  
+ðÒÏÃÅÓÓ ÏÂÎÏ×ÌÅÎÉÑ ÍÏÖÅÔ ÚÁÎÉÍÁÔØ ÎÅËÏÔÏÒÏÅ ×ÒÅÍÑ. 
+\-\-no-auto-check-trustdb ÏÔËÌÀÞÁÅÔ Á×ÔÏÍÁÔÉÞÅÓËÕÀ ÐÒÏ×ÅÒËÕ. 
+.IP "\-\-throw-keyids" 10 
+.IP "\-\-no-throw-keyids" 10 
+îÅ ÐÏÍÅÝÁÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ × ÚÁÛÉÆÒÏ×ÁÎÎÙÊ ÐÁËÅÔ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÓËÒÙ×ÁÅÔ ÐÏÌÕÞÁÔÅÌÑ ÓÏÏÂÝÅÎÉÑ É Ñ×ÌÑÅÔÓÑ ËÏÎÔÒÍÅÒÏÊ ÐÒÏÔÉ× ÁÎÁÌÉÚÁ 
+ÔÒÁÆÆÉËÁ. òÁÓÛÉÆÒÏ×ËÁ ÓÏÏÂÝÅÎÉÑ ÍÏÖÅÔ ÐÒÏÉÓÈÏÄÉÔØ ÍÅÄÌÅÎÎÅÅ, ÐÏÓËÏÌØËÕ 
+GnuPG ÂÕÄÅÔ ÐÙÔÁÔØÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ×ÓÅ ÄÏÓÔÕÐÎÙÅ ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ ÄÏ 
+ÎÁÈÏÖÄÅÎÉÑ ÐÒÁ×ÉÌØÎÏÇÏ. \-\-no-throw-keyids ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-not-dash-escaped" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÚÍÅÎÑÅÔ ÐÒÁ×ÉÌÁ ÓÏÚÄÁÎÉÑ ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÅÊ ÔÁËÉÍ 
+ÏÂÒÁÚÏÍ, ÞÔÏ ÏÎÉ ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÁÔÞÅÊ. ÷Ù ÎÅ ÄÏÌÖÎÙ ÐÏÓÙÌÁÔØ 
+ÔÁËÉÅ ÆÁÊÌÙ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÏÊ, Ô.Ë. ÐÒÉ ÐÏÄÐÉÓÉ ÕÞÉÔÙ×ÁÀÔÓÑ ×ÓÅ  
+ÐÒÏÂÅÌÙ É ÓÉÍ×ÏÌÙ ÐÅÒÅ×ÏÄÁ ÓÔÒÏËÉ. ÷Ù ÎÅ ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ ÄÌÑ ÄÁÎÎÙÈ ÓÏÄÅÒÖÁÝÉÈ ÓÔÒÏËÉ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó ÐÑÔÉ ÄÅÆÉÓÏ×. 
+÷ ÎÁÞÁÌÏ ÐÏÄÐÉÓÉ ÄÏÂÁ×ÌÑÅÔÓÑ ÓÐÅÃÉÁÌØÎÙÊ ÚÁÇÏÌÏ×ÏË, ÕËÁÚÙ×ÁÀÝÉÊ GnuPG ÎÁ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-escape-from-lines" 10 
+.IP "\-\-no-escape-from-lines" 10 
+ðÏÓËÏÌØËÕ ÍÎÏÇÉÅ ÐÏÞÔÏ×ÙÅ ÁÇÅÎÔÙ ÍÅÎÑÀÔ "From " × ÎÁÞÁÌÅ ÓÔÒÏË ÎÁ  
+"<From ", ÔÏ ÒÁÚÕÍÎÏ ÏÂÒÁÂÁÔÙ×ÁÔØ ÔÁËÉÅ ÓÔÒÏËÉ ÏÓÏÂÙÍ ÏÂÒÁÚÏÍ ÐÒÉ 
+ÓÏÚÄÁÎÉÉ ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÅÊ ÄÌÑ ÐÒÅÄÏÔ×ÒÁÝÅÎÉÑ ÏÛÉÂÏË ÐÒÉ ÐÒÏ×ÅÒËÅ 
+ÐÏÄÐÉÓÅÊ. úÁÍÅÔÉÍ, ÞÔÏ ×ÓÅ ÐÒÏÞÉÅ ÒÅÁÌÉÚÁÃÉÉ PGP ÐÏÓÔÕÐÁÀÔ ÔÁËÉÍ 
+ÖÅ ÏÂÒÁÚÏÍ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ×ËÌÀÞÅΠÐÏ ÕÍÏÌÞÁÎÉÀ. 
+\-\-no-escape-from-lines ÐÏÚ×ÏÌÑÅÔ ÏÔËÌÀÞÉÔØ ÜÔÏÔ ÐÁÒÁÍÅÔÒ. 
+.IP "\-\-passphrase-fd \fBn\fR" 10 
+óÞÉÔÁÔØ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ ÉÚ ÆÁÊÌÁ Ó ÄÅÓËÒÉÐÔÏÒÏÍ \fBn\fR. åÓÌÉ ÷Ù 
+ÉÓÐÏÌØÚÕÅÔÅ 0 ÄÌÑ \fBn\fR, ÔÏ ÐÁÒÏÌØ ÂÕÄÅÔ ÓÞÉÔÁΠÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ. 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÓÌÕÞÁÅ ÅÓÌÉ ÔÒÅÂÕÅÔÓÑ ÔÏÌØËÏ ÏÄÎÁ 
+ËÌÀÞÅ×ÁÑ ÆÒÁÚÁ. îÅ ÉÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÅÓÌÉ ÍÏÖÅÔÅ ÉÚÂÅÖÁÔØ 
+ÜÔÏÇÏ. 
+.IP "\-\-command-fd \fBn\fR" 10 
+üÔÏ ÚÁÍÅÎÁ ÄÌÑ ÎÅÒÅËÏÍÅÎÄÕÅÍÏÇÏ ÒÅÖÉÍÁ ÒÁÚÄÅÌÑÅÍÏÊ ÐÁÍÑÔÉ IPC. åÓÌÉ 
+ÐÁÒÁÍÅÔÒ ÚÁÄÁÎ, ÔÏ ××ÏÄ ËÏÍÁÎÄ ÐÏÌØÚÏ×ÁÔÅÌÑ ÓÞÉÔÙ×ÁÅÔÓÑ ÎÅ Ó ÔÅÒÍÉÎÁÌÁ, 
+Á ÉÚ ÆÁÊÌÁ Ó ÕËÁÚÁÎÎÙÍ ÄÅÓËÒÉÐÔÏÒÏÍ. òÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ 
+ÓÏ×ÍÅÓÔÎÏ × \-\-status-fd. óÍ. ÆÁÊÌ doc/DETAILS × ÉÓÈÏÄÎÏÍ ÄÉÓÔÒÉÂÕÔÉ×Å 
+ÄÌÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ. 
+.IP "\-\-use-agent" 10 
+.IP "\-\-no-use-agent" 10 
+ðÙÔÁÔØÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ GnuPG-Agent. úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÁÇÅÎÔ 
+ÎÁÈÏÄÉÔÓÑ × ÓÔÁÄÉÉ ÒÁÚÒÁÂÏÔËÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÕÓÔÁÎÏ×ÌÅÎ, ÔÏ GnuPG 
+ÓÎÁÞÁÌÁ ÐÙÔÁÅÔÓÑ ÐÏÄËÌÀÞÉÔØÓÑ Ë ÁÇÅÎÔÕ, Á ÅÓÌÉ ÜÔÏ ÎÅ ÕÄÁ£ÔÓÑ, ÔÏ 
+ÚÁÐÒÁÛÉ×ÁÅÔ ÐÁÒÏÌØ. \-\-no-use-agent ÏÔËÌÀÞÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÁÇÅÎÔÁ. 
+.IP "\-\-gpg-agent-info" 10 
+ðÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ 
+\fBGPG_AGENT_INFO\fP.  
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÐÒÉ ×ËÌÀÞÅÎÎÏÍ ÐÁÒÁÍÅÔÒÅ \-\-use-agent. 
+.IP "ðÁÒÁÍÅÔÒÙ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ" 10 
+üÔÉ ÐÁÒÁÍÅÔÒÙ ÕÐÒÁ×ÌÑÀÔ ÓÏ×ÍÅÓÔÉÍÏÓÔØÀ GnuPG Ó ÄÒÕÇÉÍÉ ÒÅÁÌÉÚÁÃÉÑÍÉ. 
+ôÏÌØËÏ ÏÄÉΠÉÚ ÜÔÉÈ ÐÁÒÁÍÅÔÒÏ× ÍÏÖÅÔ ÂÙÔØ ÁËÔÉ×ÅÎ. úÁÍÅÔØÔÅ, ÞÔÏ 
+ÕÓÔÁÎÏ×ËÉ ÉÓÐÏÌØÚÕÅÍÙÅ ÐÏ ÕÍÏÌÞÁÎÉÀ ÐÒÁËÔÉÞÅÓËÉ ×ÓÅÇÄÁ ËÏÒÒÅËÔÎÙ. ðÅÒÅÄ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÌÀÂÏÇÏ ÉÚ ÜÔÉÈ ÐÁÒÁÍÅÔÒÏ× ÏÚÎÁËÏÍØÔÅÓØ Ó ÒÁÚÄÅÌÏÍ  
+÷úáéíïäåêóô÷éå ó äòõçéíé ðòïçòáííáíé OPENPGP ÎÉÖÅ × ÄÁÎÎÏÍ ÒÕËÏ×ÏÄÓÔ×Å. 
+.RS 
+.IP "\-\-gnupg" 10 
+éÓÐÏÌØÚÏ×ÁÔØ ÓÔÁÎÄÁÒÔÎÙÅ ÕÓÔÁÎÏ×ËÉ GnuPG. ÷ ÓÕÝÎÏÓÔÉ, ÜÔÏ ÕÓÔÁÎÏ×ËÉ 
+OpenPGP (ÓÍ. \-\-openpgp), ÎÏ Ó ÎÅËÏÔÏÒÙÍÉ ÄÏÐÏÌÎÉÔÅÌØÎÙÍÉ ÐÁÒÁÍÅÔÒÁÍÉ ÄÌÑ 
+ÒÅÛÅÎÉÑ ÏÂÝÉÈ ÐÒÏÂÌÅÍ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó ÒÁÚÌÉÞÎÙÍÉ ×ÅÒÓÉÑÍÉ PGP. üÔÏ 
+ÐÁÒÁÍÅÔÒ ÉÓÐÏÌØÚÕÅÍÙÊ ÐÏ ÕÍÏÌÞÁÎÉÀ É, × ÏÂÝÅÍ ÓÌÕÞÁÅ, ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ 
+Ñ×ÎÏ ÅÇÏ ÕËÁÚÙ×ÁÔØ, ÎÏ ÏΠÍÏÖÅÔ ÂÙÔØ ÐÏÌÅÚÅΠÄÌÑ ÏÔÍÅÎÙ ÄÒÕÇÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ, ÚÁÄÁÎÎÏÇÏ × ÆÁÊÌÅ ËÏÎÆÉÇÕÒÁÃÉÉ gpg.conf. 
+.IP "\-\-openpgp" 10 
+õÓÔÁÎÏ×ÉÔØ ×ÓÅ ÐÁÒÁÍÅÔÒÙ ÐÁËÅÔÏ×, ÛÉÆÒÏ× É ÈÜÛ\-ÆÕÎËÃÉÊ ÓÔÒÏÇÏ ×  
+ÓÏÏÔ×ÅÔÓÔ×ÉÉ ÓÏ ÓÔÁÎÄÁÒÔÏÍ OpenPGP. éÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÌÑ 
+ÓÂÒÏÓÁ ×ÓÅÈ ÐÒÅÄÙÄÕÝÉÈ ÐÁÒÁÍÅÔÒÏ×, ÔÁËÉÈ ËÁË \-\-rfc1991, 
+\-\-force-v3-sigs, \-\-s2k-*, \-\-cipher-algo, \-\-digest-algo É 
+\-\-compress-algo × ÚÎÁÞÅÎÉÑ ÓÏ×ÍÅÓÔÉÍÙÅ Ó OpenPGP. ÷ÓÅ ÉÓÐÒÁ×ÌÅÎÉÑ ÄÌÑ 
+ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP ÂÕÄÕÔ ÏÔËÌÀÞÅÎÙ. 
+.IP "\-\-rfc2440" 10 
+õÓÔÁÎÏ×ÉÔØ ×ÓÅ ÐÁÒÁÍÅÔÒÙ ÐÁËÅÔÏ×, ÛÉÆÒÏ× É ÈÜÛ\-ÆÕÎËÃÉÊ ÓÔÒÏÇÏ ×  
+ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó RFC-2440. 
+÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÁÎÁÌÏÇÉÞÅΠÐÁÒÁÍÅÔÒÕ \-\-openpgp. 
+.IP "\-\-rfc1991" 10 
+âÙÔØ ÂÏÌÅÅ ÓÏ×ÍÅÓÔÉÍÙÍ Ó RFC1991 (PGP 2.x). 
+.IP "\-\-pgp2" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 2.x. 
+åÓÌÉ ×ÙÐÏÌÎÑÅÍÙÅ ÄÅÊÓÔ×ÉÑ ÐÒÉ×ÏÄÑÔ Ë ÓÏÚÄÁÎÉÀ ÓÏÏÂÝÅÎÉÑ ËÏÔÏÒÏÅ ÎÅ ÍÏÖÅÔ 
+ÂÙÔØ ÏÂÒÁÂÏÔÁÎÏ PGP 2.x (ÎÁÐÒ., ÛÉÆÒÏ×ÁÎÉÅ ÎÅ RSA ËÌÀÞÏÍ), ÔÏ ×ÙÄÁ£ÔÓÑ 
+ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ. úÁÍÅÔÉÍ, ÞÔÏ ÐÏÄ `PGP 2.x' ÚÄÅÓØ 
+ÐÏÄÒÁÚÕÍÅ×ÁÅÔÓÑ ÒÅÁÌÉÚÁÃÉÑ 'MIT PGP 2.6.2'. 
+.IP "" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅÑ×ÎÏ ÐÒÅÄÐÏÌÁÇÁÅÔ 
+`\-\-rfc1991 \-\-disable-mdc \-\-no-force-v4-certs \-\-no-sk-comment  
+\-\-escape-from-lines \-\-force-v3-sigs \-\-no-ask-sig-expire  
+\-\-no-ask-cert-expire \-\-cipher-algo IDEA \-\-digest-algo MD5  
+\-\-compress-algo 1'. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ, 
+ÔÁËÖÅ, ÏÔËÌÀÞÁÅÔÓÑ \-\-textmode ÐÒÉ ÚÁÛÉÆÒÏ×ÁÎÉÉ. 
+.IP "\-\-pgp6" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 6. 
+üÔÏ ÏÇÒÁÎÉÞÉ×ÁÅÔ ÎÁÂÏÒÙ ÓÉÍÍÅÔÒÉÞÎÙÈ ÁÌÇÏÒÉÔÍÏ× IDEA, 3DES É CAST5, 
+ÈÜÛ\-ÆÕÎËÃÉÊ MD5, SHA1 É RIPEMD160 É ÁÌÇÏÒÉÔÍÏ× ÓÖÁÔÉÑ ZIP É ÂÅÚ ÓÖÁÔÉÑ. 
+ðÁÒÁÍÅÔÒ ÏÔËÌÀÞÁÅÔ, ÔÁËÖÅ, \-\-throw-keyids É ÓÏÚÄÁÎÉÅ ÐÏÄÐÉÓÅÊ  
+ÐÏÄÐÉÓÙ×ÁÀÝÉÍÉ ÐÏÄËÌÀÞÁÍÉ, Ô.Ë. PGP 6 ÎÅ ÒÁÓÐÏÚÎÁ£Ô ÔÁËÉÅ ÐÏÄÐÉÓÉ. 
+.IP "" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅÑ×ÎÏ ÐÒÅÄÐÏÌÁÇÁÅÔ 
+`\-\-disable-mdc \-\-no-sk-comment \-\-escape-from-lines 
+\-\-force-v3-sigs \-\-no-ask-sig-expire'. 
+.IP "\-\-pgp7" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 7. 
+éÄÅÎÔÉÞÅΠ\-\-pgp6, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÔÏÇÏ, ÞÔÏ ÎÅ ÏÔËÌÀÞÁÀÔÓÑ MDC É ÓÐÉÓÏË 
+ÄÏÐÕÓÔÉÍÙÈ ÛÉÆÒÏ× ÄÏÐÏÌÎÑÅÔÓÑ  AES128, AES192, AES256, É TWOFISH. 
+.IP "\-\-pgp8" 10 
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 8. 
+PGP 8 ÚÎÁÞÉÔÅÌØÎÏ ÂÌÉÖÅ Ë ÓÔÁÎÄÁÒÔÕ OpenPGP, ÞÅÍ ×ÓÅ ÐÒÅÄÙÄÕÝÉÅ ×ÅÒÓÉÉ 
+PGP, ÔÁË ÞÔÏ ×Ó£ ÞÔÏ ÄÅÌÁÅÔ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ \- ÜÔÏ ÏÔËÌÀÞÁÅÔ \-\-throw-keyids  
+É ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ \-\-escape-from-lines. äÏÐÕÓËÁÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÌÀÂÙÈ 
+ÁÌÇÏÒÉÔÍÏ×, ËÒÏÍÅ ÈÜÛ\-ÆÕÎËÃÉÊ SHA-384 É SHA-512. 
+.RE 
+.IP "\-\-force-v3-sigs" 10 
+.IP "\-\-no-force-v3-sigs" 10 
+óÔÁÎÄÁÒÔ OpenPGP ÒÅËÏÍÅÎÄÕÅÔ, ÞÔÏÂÙ ÐÒÉÌÏÖÅÎÉÑ ÇÅÎÅÒÉÒÏ×ÁÌÉ ÐÏÄÐÉÓÉ v4, 
+ÎÏ PGP ×ÅÒÓÉÊ 5, 6 É 7 ÒÁÓÐÏÚÎÁ£Ô ÔÁËÉÅ ÐÏÄÐÉÓÉ ÔÏÌØËÏ ÎÁ ËÌÀÞÁÈ. äÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ ÐÒÉÎÕÖÄÁÅÔ GnuPG ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ ÐÏÄÐÉÓÉ v3. 
+úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÔÍÅÎÑÅÔ \-\-ask-sig-expire, Ô.Ë. v3 ÐÏÄÐÉÓÉ 
+ÎÅ ÉÍÅÀÔ ÓÒÏËÁ ÄÅÊÓÔ×ÉÑ. \-\-no-force-v3-sigs ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-force-v4-certs" 10 
+.IP "\-\-no-force-v4-certs" 10 
+÷ÓÅÇÄÁ ÉÓÐÏÌØÚÏ×ÁÔØ v4 ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ, ÄÁÖÅ ÅÓÌÉ ÜÔÏ v3 ËÌÀÞÉ. äÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ, ËÒÏÍÅ ÔÏÇÏ, ÍÅÎÑÅÔ ÉÓÐÏÌØÚÕÅÍÕÀ ÐÏ ÕÍÏÌÞÁÎÉÀ ÈÜÛ\-ÆÕÎËÃÉÀ ÄÌÑ 
+v3 RSA ËÌÀÞÅÊ Ó MD5 ÎÁ SHA-1. 
+\-\-no-force-v4-certs ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-force-mdc" 10 
+ðÒÉÎÕÖÄÁÅÔ GnuPG ÉÓÐÏÌØÚÏ×ÁÔØ ÛÉÆÒÏ×ÁÎÉÅ Ó ËÏÄÏÍ ÏÂÎÁÒÕÖÅÎÉÑ ÉÚÍÅÎÅÎÉÊ.  
+÷ÓÅÇÄÁ ÉÓÐÏÌØÚÕÅÔÓÑ Ó ÂÏÌÅÅ ÎÏ×ÙÍÉ ÛÉÆÒÁÍÉ (Ó ÒÁÚÍÅÒÏÍ ÂÌÏËÁ ÂÏÌÅÅ 
+64 ÂÉÔ) ÉÌÉ ÅÓÌÉ ×ÓÅ ËÌÀÞÉ ÐÏÌÕÞÁÔÅÌÑ ÐÏÄÄÅÒÖÉ×ÁÀÔ MDC. 
+.IP "\-\-disable-mdc" 10 
+ïÔËÌÀÞÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ËÏÄÁ ÏÂÎÁÒÕÖÅÎÉÑ ÉÚÍÅÎÅÎÉÊ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÚÁÛÉÆÒÏ×ÁÎÎÙÅ ÓÏÏÂÝÅÎÉÑ ÓÔÁÎÏ×ÑÔÓÑ 
+ÕÑÚ×ÉÍÙ ÄÌÑ ÁÔÁË ÉÚÍÅÎÅÎÉÑ ÓÏÏÂÝÅÎÉÊ. 
+.IP "\-\-allow-non-selfsigned-uid" 10 
+.IP "\-\-no-allow-non-selfsigned-uid" 10 
+òÁÚÒÅÛÁÅÔ ÉÍÐÏÒÔ É ÉÓÐÏÌØÚÏ×ÁÎÉÅ ËÌÀÞÅÊ Ó ÎÅÓÁÍÏÐÏÄÐÉÓÁÎÎÙÍ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÐÏÌØÚÏ×ÁÔÅÌÑ. îÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ, Ô.Ë. 
+ÔÁËÏÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ ÌÅÇËÏ ÐÏÄÄÅÌÁÔØ. 
+\-\-no-allow-non-selfsigned-uid ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-allow-freeform-uid" 10 
+ïÔËÌÀÞÁÅÔ ÐÒÏ×ÅÒËÕ ÆÏÒÍÁÔÁ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÒÉ ÅÇÏ ÓÏÚÄÁÎÉÉ. 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ × ÏÓÏÂÙÈ ÓÌÕÞÁÑÈ, Ô.Ë. 
+ÏΠÎÅ ÇÁÒÁÎÔÉÒÕÅÔ Ñ×ÌÑÀÝÉÊÓÑ ÓÔÁÎÄÁÒÔÏÍ ÄÅ\-ÆÁËÔÏ ÆÏÒÍÁÔ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ 
+ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "\-\-ignore-time-conflict" 10 
+GnuPG, ÏÂÙÞÎÏ, ÐÒÏ×ÅÒÑÅÔ ÐÒÁ×ÄÏÐÏÄÏÂÎÏÓÔØ ÚÎÁÞÅÎÉÊ ÍÅÔÏË ×ÒÅÍÅÎÉ, 
+Ó×ÑÚÁÎÎÙÈ Ó ËÌÀÞÁÍÉ É ÐÏÄÐÉÓÑÍÉ. ïÄÎÁËÏ, ÉÎÏÇÄÁ ÐÏÄÐÉÓØ ÏËÁÚÙ×ÁÅÔÓÑ 
+ÓÔÁÒÛÅ ËÌÀÞÁ ÉÚ\-ÚÁ ÐÒÏÂÌÅÍ Ó ÞÁÓÁÍÉ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÏÚ×ÏÌÑÅÔ 
+ÏÇÒÁÎÉÞÉ×ÁÔØÓÑ × ÐÏÄÏÂÎÙÈ ÓÌÕÞÁÑÈ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅÍ. óÍ. ÔÁËÖÅ ÐÁÒÁÍÅÔÒ  
+\-\-ignore-valid-from, ÉÓÐÏÌØÚÕÅÍÙÊ ÄÌÑ ÒÁÚÒÅÛÅÎÉÑ ÐÒÏÂÌÅÍ Ó ÎÅÐÒÁ×ÉÌØÎÙÍ 
+×ÒÅÍÅÎÅÍ ÎÁ ÐÏÄËÌÀÞÁÈ. 
+.IP "\-\-ignore-valid-from" 10 
+GnuPG, ËÁË ÐÒÁ×ÉÌÏ, ÎÅ ÐÏÚ×ÏÌÑÅÔ ×ÙÂÉÒÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ ËÌÀÞÉ ÓÏÚÄÁÎÎÙÅ 
+× ÂÕÄÕÝÅÍ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÒÁÚÒÅÛÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÔÁËÉÈ ËÌÀÞÅÊ. ÷Ù ÎÅ 
+ÄÏÌÖÎÙ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÅÓÌÉ Õ ÷ÁÓ ÎÅÔ ÓÅÒØ£ÚÎÙÈ ÐÒÏÂÌÅÍ Ó 
+ÞÁÓÁÍÉ. óÍ. ÔÁËÖÅ \-\-ignore-time-conflict ÄÌÑ ÒÁÚÒÅÛÅÎÉÑ ÐÒÏÂÌÅÍ Ó 
+ÎÅÐÒÁ×ÉÌØÎÙÍ ×ÒÅÍÅÎÅÍ ÎÁ ÐÏÄÐÉÓÑÈ. 
+.IP "\-\-ignore-crc-error" 10 
+ASCII ÆÏÒÍÁÔ, ÉÓÐÏÌØÚÕÅÍÙÊ OpenPG ÚÁÝÉÝÁÅÔÓÑ ËÏÎÔÒÏÌØÎÏÊ ÓÕÍÍÏÊ CRC ÄÌÑ 
+ÚÁÝÉÔÙ ÏÔ ÏÛÉÂÏË ÐÒÉ ÐÅÒÅÄÁÞÅ. óÌÕÞÁÅÔÓÑ, ÞÔÏ ÜÔÁ ËÏÎÔÒÏÌØÎÁÑ ÓÕÍÍÁ 
+ÉÓËÁÖÁÅÔÓÑ ÐÒÉ ÐÅÒÅÄÁÞÅ ÓÏÏÂÝÅÎÉÑ, ÎÏ ÓÁÍÁ ÉÎÆÏÒÍÁÃÉÑ (ÚÁÝÉÝÅÎÎÁÑ 
+ÐÒÏÔÏËÏÌÏÍ OpenPGP) ÏÓÔÁ£ÔÓÑ ÄÏÓÔÏ×ÅÒÎÏÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÏÚ×ÏÌÑÅÔ 
+ÉÇÎÏÒÉÒÏ×ÁÔØ ÏÛÉÂËÉ ËÏÎÔÒÏÌØÎÏÊ ÓÕÍÍÙ. 
+.IP "\-\-ignore-mdc-error" 10 
+ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ, × ÓÌÕÞÁÅ ÎÁÒÕÛÅÎÉÑ ÃÅÌÏÓÔÎÏÓÔÉ MDC 
+ÔÏÌØËÏ ×ÙÄÁ£ÔÓÑ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÓÌÕÞÁÅ ÞÁÓÔÉÞÎÏÇÏ 
+ÐÏ×ÒÅÖÄÅÎÉÑ ÓÏÏÂÝÅÎÉÑ, ÅÓÌÉ ÎÅÏÂÈÏÄÉÍÏ ÉÚ×ÌÅÞØ ËÁË ÍÏÖÎÏ ÂÏÌØÛÅ ÄÁÎÎÙÈ 
+ÉÚ ÐÏ×ÒÅÖÄ£ÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ. ïÄÎÁËÏ, ÕÞÔÉÔÅ, ÞÔÏ ÎÁÒÕÛÅÎÉÅ ÃÅÌÏÓÔÎÏÓÔÉ 
+MDC ÍÏÖÅÔ Ó×ÉÄÅÔÅÌØÓÔ×Ï×ÁÔØ Ï ÐÏÄÄÅÌËÅ ÓÏÏÂÝÅÎÉÑ. 
+.IP "\-\-lock-once" 10 
+âÌÏËÉÒÏ×ÁÔØ ÂÁÚÙ ÄÁÎÎÙÈ ÐÒÉ ÐÅÒ×ÏÍ ÚÁÐÒÏÓÅ É ÎÅ ÓÎÉÍÁÔØ ÂÌÏËÉÒÏ×ËÕ ÄÏ 
+ÚÁ×ÅÒÛÅÎÉÑ ÐÒÏÃÅÓÓÁ. 
+.IP "\-\-lock-multiple" 10 
+óÎÉÍÁÔØ ÂÌÏËÉÒÏ×ËÕ ËÁÖÄÙÊ ÒÁÚ ËÏÇÄÁ ÏÎÁ ÂÏÌØÛÅ ÎÅ ÎÕÖÎÁ. éÓÐÏÌØÚÕÅÔÓÑ 
+ÄÌÑ ÐÅÒÅÚÁÐÉÓÉ \-\-lock-once ÉÚ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ. 
+.IP "\-\-lock-never" 10 
+ðÏÌÎÏÓÔØÀ ÏÔÍÅÎÉÔØ ÂÌÏËÉÒÏ×ËÉ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ 
+ÔÏÌØËÏ × ÏÞÅÎØ ÓÐÅÃÉÆÉÞÅÓËÉÈ ÓÒÅÄÁÈ, ËÏÇÄÁ ÍÏÖÎÏ ÂÙÔØ Õ×ÅÒÅÎÎÙÍ, ÞÔÏ 
+ÔÏÌØËÏ ÏÄÉΠÐÒÏÃÅÓÓ ÉÍÅÅÔ ÄÏÓÔÕРˠÆÁÊÌÁÍ. úÁÇÒÕÚÏÞÎÁÑ ÄÉÓËÅÔÁ Ó 
+ÓÉÓÔÅÍÏÊ ÛÉÆÒÏ×ÁÎÉÑ ÎÁ ÎÅÊ ÍÏÖÅÔ ÓÌÕÖÉÔØ ÐÒÉÍÅÒÏÍ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÄÁÎÎÏÇÏ 
+ÐÁÒÁÍÅÔÒÁ. îÅÐÒÁ×ÉÌØÎÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÄÏÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë 
+ÐÏ×ÒÅÖÄÅÎÉÀ ËÌÀÞÅÊ É ÄÁÎÎÙÈ. 
+.IP "\-\-no-random-seed-file" 10 
+GnuPG ÉÓÐÏÌØÚÕÅÔ ÆÁÊÌ ÄÌÑ ÈÒÁÎÅÎÉÑ ×ÎÕÔÒÅÎÎÅÇÏ ÐÕÌÁ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ 
+ÍÅÖÄÕ ÚÁÐÕÓËÁÍÉ. üÔÏ ÕÓËÏÒÑÅÔ ÇÅÎÅÒÁÃÉÀ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ; ÏÄÎÁËÏ × 
+ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ ÏÐÅÒÁÃÉÉ ÚÁÐÉÓÉ ÎÅ ÄÏÐÕÓËÁÀÔÓÑ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ 
+ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁΠנÔÁËÏÊ ÓÉÔÕÁÃÉÉ  ÃÅÎÏÊ ÚÁÍÅÄÌÅÎÉÑ ÇÅÎÅÒÁÃÉÉ ÓÌÕÞÁÊÎÙÈ 
+ÞÉÓÅÌ. 
+.IP "\-\-no-verbose" 10 
+óÂÒÏÓÉÔØ ÕÒÏ×ÅÎØ ÄÅÔÁÌØÎÏÓÔÉ ×Ù×ÏÄÁ × 0. 
+.IP "\-\-no-greeting" 10 
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÓÏÏÂÝÅÎÉÑ Ï Á×ÔÏÒÓËÉÈ ÐÒÁ×ÁÈ. 
+.IP "\-\-no-secmem-warning" 10 
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÎÅÚÁÝÉÝÅÎÎÏÊ ÐÁÍÑÔÉ. 
+.IP "\-\-no-permission-warning" 10 
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÎÅÂÅÚÏÐÁÓÎÙÈ ÐÒÁ×ÁÈ ÄÏÓÔÕÐÁ Ë ÆÁÊÌÁÍ É 
+ÄÏÍÁÛÎÅÍÕ ËÁÔÁÌÏÇÕ (\-\-homedir). 
+úÁÍÅÔØÔÅ, ÞÔÏ ÐÒÏ×ÅÒËÁ ÐÒÁ× ÄÏÓÔÕÐÁ Ë ÆÁÊÌÁÍ, ×ÙÐÏÌÎÑÅÍÁÑ GnuPG, ÎÅ 
+Ñ×ÌÑÅÔÓÑ ÞÅÍ\-ÔÏ ÚÎÁÞÉÔÅÌØÎÙÍ, ÜÔÏ ÐÒÏÓÔÏ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ Ï ÏÂÝÉÈ 
+ÐÒÏÂÌÅÍÁÈ Ó ÐÒÁ×ÁÍÉ ÄÏÓÔÕÐÁ Ë ÆÁÊÌÁÍ. îÅ ÓÌÅÄÕÅÔ ÐÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ 
+ÏÔÓÕÔÓÔ×ÉÅ ÐÒÅÄÕÐÒÅÖÄÅÎÉÊ ÏÚÎÁÞÁÅÔ ÚÁÝÉÝ£ÎÎÏÓÔØ ÷ÁÛÅÊ ÓÉÓÔÅÍÙ. 
+.IP "" 10 
+úÁÍÅÔØÔÅ, ÔÁËÖÅ, ÞÔÏ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÎÅÂÅÚÏÐÁÓÎÙÈ ÐÒÁ×ÁÈ ÄÏÓÔÕÐÁ 
+Ë ÄÏÍÁÛÎÅÍÕ ËÁÔÁÌÏÇÕ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÏÔËÌÀÞÅΠÉÚ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ, Ô.Ë. 
+ÜÔÏ ÐÏÚ×ÏÌÉÌÏ ÂÙ ×ÚÌÏÍÝÉËÕ ÌÅÇËÏ ÐÏÄÍÅÎÉÔØ ÎÅÚÁÝÉÝ£ÎÎÙÊ ÆÁÊÌ 
+ËÏÎÆÉÇÕÒÁÃÉÉ gpg.conf É ÐÏÄÁ×ÉÔØ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ ÉÚ ÎÅÇÏ. ðÏÜÔÏÍÕ 
+×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ ÍÏÖÅÔ ÂÙÔØ ÏÔËÌÀÞÅΠÔÏÌØËÏ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ. 
+.IP "\-\-no-mdc-warning" 10 
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÏÔÓÕÔÓÔ×ÉÉ ÚÁÝÉÔÙ ÃÅÌÏÓÔÎÏÓÔÉ Ó 
+ÐÏÍÏÝØÀ MDC. 
+.IP "\-\-require-secmem" 10 
+.IP "\-\-no-require-secmem" 10 
+úÁÐÒÅÔÉÔØ ×ÙÐÏÌÎÅÎÉÅ ÅÓÌÉ GnuPG ÎÅ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÂÅÚÏÐÁÓÎÕÀ ÐÁÍÑÔØ. 
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ (Ô.Å. GnuPG ÚÁÐÕÓËÁÅÔÓÑ, ÎÏ ×ÙÄÁ£Ô 
+ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ). 
+.IP "\-\-no-armor" 10 
+ðÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ ×ÈÏÄÎÙÅ ÄÁÎÎÙÅ ÎÅ × ASCII ÆÏÒÍÁÔÅ. 
+.IP "\-\-no-default-keyring" 10 
+îÅ ÄÏÂÁ×ÌÑÔØ Ó×ÑÚËÉ ËÌÀÞÅÊ ÐÏ ÕÍÏÌÞÁÎÉÀ Ë ÓÐÉÓËÕ Ó×ÑÚÏË ËÌÀÞÅÊ. 
+úÁÍÅÔØÔÅ, ÞÔÏ GnuPG ÎÅ ÂÕÄÅÔ ÒÁÂÏÔÁÔØ ÓÏ×ÓÅÍ ÂÅÚ Ó×ÑÚÏË, ÐÏÜÔÏÍÕ ÐÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÎÕÖÎÏ ÕËÁÚÁÔØ ÉÓÐÏÌØÚÕÅÍÙÅ Ó×ÑÚËÉ ÐÒÉ 
+ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÏ× \-\-keyring ÉÌÉ \-\-secret-keyring, ÉÎÁÞÅ ÂÕÄÕÔ 
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó×ÑÚËÉ ÏÔËÒÙÔÙÈ ÉÌÉ ÚÁËÒÙÔÙÈ ËÌÀÞÅÊ ÐÒÉÎÑÔÙÅ ÐÏ 
+ÕÍÏÌÞÁÎÉÀ. 
+.IP "\-\-skip-verify" 10 
+ðÒÏÐÕÓÔÉÔØ ÐÒÏ×ÅÒËÕ ÐÏÄÐÉÓÉ. üÔÏÔ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ 
+ÕÓËÏÒÅÎÉÑ ÒÁÓÛÉÆÒÏ×ÁÎÉÑ ÅÓÌÉ ÐÒÏ×ÅÒËÁ ÐÏÄÐÉÓÉ ÎÅ ÔÒÅÂÕÅÔÓÑ. 
+.IP "\-\-with-colons" 10 
+÷Ù×ÅÓÔÉ ÓÐÉÓÏË ËÌÀÞÅÊ × ×ÉÄÅ ÐÏÌÅÊ ÒÁÚÄÅÌ£ÎÎÙÈ Ä×ÏÅÔÏÞÉÑÍÉ. úÁÍÅÔØÔÅ, 
+ÞÔÏ ×Ù×ÏÄ ÂÕÄÅÔ ÚÁËÏÄÉÒÏ×ÁΠנUTF-8 ÎÅÚÁ×ÉÓÉÍÏ ÏÔ ÚÎÁÞÅÎÉÑ ÐÁÒÁÍÅÔÒÁ 
+\-\-display-charset. äÁÎÎÙÊ ÆÏÒÍÁÔ ÕÄÏÂÅΠÐÒÉ ×ÙÚÏ×Å ÉÚ ÓÃÅÎÁÒÉÅ× É ÄÒÕÇÉÈ 
+ÐÒÏÇÒÁÍÍ, Ô.Ë. ÏΠÌÅÇËÏ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ. ðÏÄÒÏÂÎÏÅ ÏÐÉÓÁÎÉÅ ÆÏÒÍÁÔÁ 
+ÎÁÈÏÄÉÔÓÑ × ÆÁÊÌÅ doc/DETAILS, ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔÓÑ × ÄÉÓÔÒÉÂÕÔÉ×Å Ó 
+ÉÓÈÏÄÎÙÍ ËÏÄÏÍ GnuPG. 
+.IP "\-\-with-key-data" 10 
+÷Ù×ÅÓÔÉ ÓÐÉÓÏË ËÌÀÞÅÊ × ×ÉÄÅ ÐÏÌÅÊ ÒÁÚÄÅÌ£ÎÎÙÈ Ä×ÏÅÔÏÞÉÑÍÉ (ËÁË É ÐÒÉ 
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ \-\-with-colons) É ×Ù×ÅÓÔÉ ÄÁÎÎÙÅ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. 
+.IP "\-\-with-fingerprint" 10 
+ôÏ ÖÅ, ÞÔÏ É \-\-fingerprint ÎÏ ÉÚÍÅÎÑÅÔ ÔÏÌØËÏ ÆÏÒÍÁÔ ×Ù×ÏÄÁ É ÍÏÖÅÔ 
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÄÒÕÇÏÊ ËÏÍÁÎÄÏÊ. 
+.IP "\-\-fast-list-mode" 10 
+õÓËÏÒÑÅÔ ÒÁÂÏÔÕ ËÏÍÁÎÄ ×Ù×ÏÄÑÝÉÈ ÓÐÉÓÏË ËÌÀÞÅÊ; ÚÁ ÓÞ£Ô ÓÏËÒÁÝÅÎÉÑ 
+ÏÂߣÍÁ ×Ù×ÏÄÉÍÏÊ ÉÎÆÏÒÍÁÃÉÉ. îÅËÏÔÏÒÙÍ ÐÒÉÌÏÖÅÎÉÑÍ ÎÅ ÎÕÖÅΠ
+ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ É ÉÎÆÏÒÍÁÃÉÑ Ï ÕÒÏ×ÎÅ ÄÏ×ÅÒÉÑ. éÓÐÏÌØÚÕÑ 
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÎÉ ÍÏÇÕÔ ÕÓËÏÒÉÔØ ×Ù×ÏÄ ÓÐÉÓËÁ. ôÏÞÎÏÅ ÐÏ×ÅÄÅÎÉÅ ÄÁÎÎÏÊ 
+ËÏÍÁÎÄÙ ÍÏÖÅÔ ÉÚÍÅÎÉÔØÓÑ × ÂÕÄÕÝÉÈ ×ÅÒÓÉÑÈ. 
+.IP "\-\-fixed-list-mode" 10 
+îÅ ÏÂßÅÄÉÎÑÔØ ÐÅÒ×ÉÞÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ É ÐÅÒ×ÉÞÎÙÊ ËÌÀÞ ÐÒÉ ×Ù×ÏÄÅ × 
+ÒÅÖÉÍÅ \-\-with-colon É ×Ù×ÏÄÉÔØ ×ÓÅ ÍÅÔËÉ ×ÒÅÍÅÎÉ × ÓÅËÕÎÄÁÈ Ó 
+1970-01-01. 
+.IP "\-\-list-only" 10 
+éÚÍÅÎÑÅÔ ÒÁÂÏÔÕ ÎÅËÏÔÏÒÙÈ ËÏÍÁÎÄ. óÈÏÖÁ Ó \-\-dry-run, ÎÏ ÏÔÌÉÞÁÅÔÓÑ × 
+ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ. óÅÍÁÎÔÉËÁ ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ × ÂÕÄÕÝÅÍ ÂÙÔØ ÒÁÓÛÉÒÅÎÁ. ÷ 
+ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÏΠÔÏÌØËÏ ÐÒÏÐÕÓËÁÅÔ ÄÅÛÉÆÒÏ×ÁÎÉÅ É ÐÏÜÔÏÍÕ ÕÓËÏÒÑÅÔ 
+×Ù×ÏÄ ÓÐÉÓËÁ ËÌÀÞÅÊ ÛÉÆÒÏ×ÁÎÉÑ. 
+.IP "\-\-no-literal" 10 
+ðÁÒÁÍÅÔÒ ÎÅ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÏÂÙÞÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. ðÏÄÒÏÂÎÏÓÔÉ 
+ÐÒÉÍÅÎÅÎÉÑ ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ ÐÒÏÇÒÁÍÍÙ. 
+.IP "\-\-set-filesize" 10 
+ðÁÒÁÍÅÔÒ ÎÅ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÏÂÙÞÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. ðÏÄÒÏÂÎÏÓÔÉ 
+ÐÒÉÍÅÎÅÎÉÑ ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ ÐÒÏÇÒÁÍÍÙ. 
+.IP "\-\-show-session-key" 10 
+ðÏËÁÚÁÔØ ÓÅÁÎÓÏ×ÙÊ ËÌÀÞ, ÉÓÐÏÌØÚÏ×ÁÎÎÙÊ ÄÌÑ ÚÁÛÉÆÒÏ×ËÉ ÄÁÎÎÏÇÏ 
+ÓÏÏÂÝÅÎÉÑ. óÍ. ÔÁËÖÅ \-\-override-session-key. 
+.IP "" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÓÌÕÞÁÅ ÅÓÌÉ ÷ÁÓ ÐÒÉÎÕÖÄÁÀÔ 
+ÏÔËÒÙÔØ ÓÏÄÅÒÖÉÍÏÅ ÏÔÄÅÌØÎÏÇÏ ÚÁÛÉÆÒÏ×ÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ. éÓÐÏÌØÚÕÑ 
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÷Ù ÍÏÖÅÔÅ ÐÏÌÕÞÉÔØ ÓÅÁÎÓÏ×ÙÊ ËÌÀÞ, ËÏÔÏÒÙÍ  
+ÚÁÛÉÆÒÏ×ÁÎÏ ÓÏÏÂÝÅÎÉÅ. ðÒÉ ÐÏÍÏÝÉ ÓÅÁÎÓÏ×ÏÇÏ ËÌÀÞÁ ÷Ù ÍÏÖÅÔÅ 
+ÏÔËÒÙÔØ ÓÏÏÂÝÅÎÉÅ ÎÅ ÒÁÓËÒÙ×ÁÑ ÓÅËÒÅÔÎÙÊ ËÌÀÞ É ÎÅ ËÏÍÐÒÏÍÅÔÉÒÕÑ 
+ÏÓÔÁÌØÎÙÅ ÓÏÏÂÝÅÎÉÑ, ÚÁÛÉÆÒÏ×ÁÎÎÙÅ ÄÌÑ ÔÏÇÏ ÖÅ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ. 
+îå éóðïìøúõêôå äáîîùê ðáòáíåôò âåú ëòáêîåê îåïâèïäéíïóôé. 
+.IP "\-\-override-session-key \fBstring\fR " 10 
+îÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÅÁÎÓÏ×ÙÊ ËÌÀÞ ÚÁÛÉÆÒÏ×ÁÎÎÙÊ ÏÔËÒÙÔÙÍ ËÌÀÞÏÍ, Á 
+×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ËÌÀÞÏÍ \fBstring\fR.  æÏÒÍÁÔ ÐÁÒÁÍÅÔÒÁ ÁÎÁÌÏÇÉÞÅΠ
+×Ù×ÏÄÉÍÏÍÕ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ \-\-show-session-key. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÉÓÐÏÌØÚÕÅÔÓÑ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÷ÁÓ ÐÒÉÎÕÖÄÁÀÔ ÏÔËÒÙÔØ ÓÏÄÅÒÖÉÍÏÅ 
+ÚÁÛÉÆÒÏ×ÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ; ÉÓÐÏÌØÚÕÑ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÷Ù ÍÏÖÅÔÅ ÜÔÏ 
+ÓÄÅÌÁÔØ ÂÅÚ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ. 
+.IP "\-\-ask-sig-expire" 10 
+.IP "\-\-no-ask-sig-expire" 10 
+ðÒÉ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ ÚÁÐÒÁÛÉ×ÁÔØ ÓÒÏË ÄÅÊÓÔ×ÉÑ ÐÏÄÐÉÓÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ 
+ÚÁÄÁÎ, ÔÏ ÐÏÄÐÉÓØ ÂÅÓÓÒÏÞÎÁÑ. 
+\-\-no-ask-sig-expire ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-ask-cert-expire" 10 
+.IP "\-\-no-ask-cert-expire" 10 
+ðÒÉ ÐÏÄÐÉÓÉ ËÌÀÞÁ ÚÁÐÒÁÛÉ×ÁÔØ ÓÒÏË ÄÅÊÓÔ×ÉÑ ÐÏÄÐÉÓÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ 
+ÚÁÄÁÎ, ÔÏ ÐÏÄÐÉÓØ ÂÅÓÓÒÏÞÎÁÑ. 
+\-\-no-ask-cert-expire ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-expert" 10 
+.IP "\-\-no-expert" 10 
+ðÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÐÏÌÎÑÔØ ÎÅËÏÔÏÒÙÅ ÎÅÌÅÐÙÅ ÉÌÉ ÂÅÓÓÍÙÓÌÅÎÎÙÅ 
+ÏÐÅÒÁÃÉÉ, ÎÁÐÒÉÍÅÒ, ÐÏÄÐÉÓÙ×ÁÔØ ÐÒÏÓÒÏÞÅÎÎÙÅ É ÏÔÏÚ×ÁÎÎÙÅ ËÌÀÞÉ, ÉÌÉ 
+ÏÐÅÒÁÃÉÉ ÎÁÒÕÛÁÀÝÉÅ ÓÏ×ÍÅÓÔÉÍÏÓÔØ, ÎÁÐÒÉÍÅÒ, ÇÅÎÅÒÉÒÏ×ÁÔØ ËÌÀÞÉ 
+ÎÅÒÅËÏÍÅÎÄÕÅÍÙÈ ÔÉÐÏ×. ôÁËÖÅ ÏÔËÌÀÞÁÅÔ ×Ù×ÏÄ ÎÅËÏÔÏÒÙÈ ÐÒÅÄÕÐÒÅÖÄÁÀÝÉÈ 
+ÓÏÏÂÝÅÎÉÊ Ï ÐÏÔÅÎÃÉÁÌØÎÏ ÎÅÓÏ×ÍÅÓÔÉÍÙÈ ÄÅÊÓÔ×ÉÑÈ. ÷ ÏÂÝÅÍ, ËÁË ÓÌÅÄÕÅÔ 
+ÉÚ ÎÁÚ×ÁÎÉÑ, ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÔÏÌØËÏ ÄÌÑ ÓÐÅÃÉÁÌÉÓÔÏ×. åÓÌÉ ÷Ù ÎÅ 
+ÐÏÎÉÍÁÅÔÅ ÐÏÌÎÏÓÔØÀ ÐÏÓÌÅÄÓÔ×ÉÊ ÔÅÈ ÄÅÊÓÔ×ÉÊ, ËÏÔÏÒÙÅ ÐÏÚ×ÏÌÑÅÔ 
+×ÙÐÏÌÎÉÔØ ÜÔÏÔ ÐÁÒÁÍÅÔÒ, ÌÕÞÛÅ ÏÓÔÁ×ØÔÅ ÅÇÏ ÏÔËÌÀÞÅÎÎÙÍ. 
+\-\-no-expert ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ. 
+.IP "\-\-allow-secret-key-import" 10 
+õÓÔÁÒÅ×ÛÉÊ ÐÁÒÁÍÅÔÒ, ÂÏÌØÛÅ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ. 
+.IP "\-\-try-all-secrets" 10 
+îÅ ÏÂÒÁÝÁÔØ ×ÎÉÍÁÎÉÑ ÎÁ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÕËÁÚÁÎÎÙÊ × ÓÏÏÂÝÅÎÉÉ, ÎÏ 
+ÐÅÒÅÐÒÏÂÏ×ÁÔØ ×ÓÅ ÉÍÅÀÝÉÅÓÑ ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ, ÐÏËÁ ÎÅ ÎÁÊÄ£ÔÓÑ ÐÒÁ×ÉÌØÎÙÊ 
+ËÌÀÞ ÄÌÑ ÒÁÓÛÉÆÒÏ×ÁÎÉÑ ÓÏÏÂÝÅÎÉÑ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉÎÕÄÉÔÅÌØÎÏ 
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÒÅÖÉÍ ÉÓÐÏÌØÚÕÅÍÙÊ ÐÒÉ ÒÁÓÛÉÆÒÏ×ËÅ ÓÏÏÂÝÅÎÉÊ ÄÌÑ ÁÎÏÎÉÍÎÙÈ 
+ÐÏÌÕÞÁÔÅÌÅÊ (ÓÏÚÄÁÎÎÙÈ Ó ÐÏÍÏÝØÀ \-\-throw-keyids) É ÍÏÖÅÔ ÂÙÔØ ÐÏÌÅÚÅΠנ
+ÓÌÕÞÁÅ ÅÓÌÉ ÚÁÛÉÆÒÏ×ÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ ÓÏÄÅÒÖÉÔ ÎÅÐÒÁ×ÉÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ 
+ËÌÀÞÁ. 
+.IP "\-\-enable-special-filenames" 10 
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ×ËÌÀÞÁÅÔ ÒÅÖÉÍ × ËÏÔÏÒÏÍ ÉÍÅÎÁ ÆÁÊÌÏ× ×ÉÄÁ 
+\fB-&n\fP, ÇÄÅ n \-\- ÎÅÏÔÒÉÃÁÔÅÌØÎÏÅ ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ, 
+ÏÂÏÚÎÁÞÁÀÔ ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ n. 
+.IP "\-\-no-expensive-trust-checks" 10 
+ôÏÌØËÏ ÄÌÑ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. 
+.IP "\-\-group \fBname=value1 [value2 value3 ...]\fR" 10 
+ïÐÒÅÄÅÌÉÔØ ÉÍÅÎÏ×ÁÎÎÕÀ ÇÒÕÐÐÕ, ÐÏÄÏÂÎÕÀ ÁÌÉÁÓÁÍ × ÐÏÞÔÏ×ÙÈ ÐÒÏÇÒÁÍÍÁÈ. 
+ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÉÍÅÎÉ ÇÒÕÐÐÙ × ËÁÞÅÓÔ×Å ÐÏÌÕÞÁÔÅÌÑ (\-r or 
+\-\-recipient), ÏÎÁ ÂÕÄÅÔ ÐÒÅÏÂÒÁÚÏ×Ù×ÁÔØÓÑ × ÓÐÉÓÏË ÚÁÄÁÎÎÙÈ ÚÎÁÞÅÎÉÊ. 
+åÓÌÉ ÚÁÄÁÔØ ÎÅÓËÏÌØËÏ ÇÒÕÐРӠÏÄÎÉÍ ÉÍÅÎÅÍ, ÔÏ ÏÎÉ Á×ÔÏÍÁÔÉÞÅÓËÉ ÂÕÄÕÔ 
+ÏÂßÅÄÉÎÅÎÙ × ÏÄÎÕ. 
+.IP "" 10 
+÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÕËÁÚÙ×ÁÅÔÓÑ ÉÍÑ ÇÒÕÐÐÙ, Á ÚÁÔÅÍ, ÐÏÓÌÅ ÚÎÁËÁ =, 
+\fBkey IDs\fR ÉÌÉ ÏÔÐÅÞÁÔËÉ ËÌÀÞÅÊ, ÎÏ ÄÏÐÕÓËÁÀÔÓÑ É ÌÀÂÙÅ ÄÒÕÇÉÅ 
+ÏÐÉÓÁÎÉÑ ËÌÀÞÁ. úÁÍÅÔØÔÅ, ÞÔÏ ÚÎÁÞÅÎÉÅ Ó ÐÒÏÂÅÌÁÍÉ ÂÕÄÅÔ 
+ÉÎÔÅÒÐÒÅÔÉÒÏ×ÁÔØÓÑ ËÁË Ä×Á ÒÁÚÌÉÞÎÙÈ ÚÎÁÞÅÎÉÑ. ôÁËÖÅ, ÚÁÍÅÔØÔÅ, ÞÔÏ 
+ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÏÄÎÏÕÒÏ×ÎÅ×ÏÅ \- ÷Ù ÎÅ ÍÏÖÅÔÅ ÄÏÂÁ×ÉÔØ ÇÒÕÐÐÕ × ÄÒÕÇÕÀ 
+ÇÒÕÐÐÕ. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ, ÍÏÖÅÔ ÏËÁÚÁÔØÓÑ 
+ÎÅÏÂÈÏÄÉÍÙÍ ÚÁËÌÀÞÉÔØ ÁÒÇÕÍÅÎÔ × ËÁ×ÙÞËÉ, ÄÌÑ ÐÒÅÄÏÔ×ÒÁÝÅÎÉÑ ÅÇÏ 
+ÉÎÔÅÒÐÒÅÔÁÃÉÉ ÏÂÏÌÏÞËÏÊ, ËÁË ÎÅÓËÏÌØËÉÈ ÐÁÒÁÍÅÔÒÏ×. 
+.IP "\-\-ungroup \fBname\fR" 10 
+õÄÁÌÉÔØ ÚÁÄÁÎÎÕÀ ÚÁÐÉÓØ ÉÚ ÓÐÉÓËÁ \-\-group. 
+.IP "\-\-no-groups" 10 
+õÄÁÌÑÅÔ ×ÓÅ ÚÁÐÉÓÉ ÉÚ ÓÐÉÓËÁ \-\-group. 
+.IP "\-\-preserve-permissions" 10 
+îÅ ÉÚÍÅÎÑÔØ ÐÒÁ×Á ÄÏÓÔÕÐÁ Ë ÆÁÊÌÕ Ó ÎÁÂÏÒÏÍ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ × ÒÅÖÉÍ 
+ÄÏÓÔÕÐÁ ÞÔÅÎÉÑ/ÚÁÐÉÓÉ ÔÏÌØËÏ ÄÌÑ ×ÌÁÄÅÌØÃÁ. éÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ 
+ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÐÏÎÉÍÁÅÔÅ ÚÁÞÅÍ ÷ÁÍ ÜÔÏ ÎÕÖÎÏ. 
+.IP "\-\-personal-cipher-preferences \fBstring\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ ÛÉÆÒÏ× × \fBstring\fR,  
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ 
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÂÉÒÁÔØ 
+ÐÒÅÄÐÏÞÉÔÁÅÍÙÅ ÉÍ ÁÌÇÏÒÉÔÍÙ ÐÒÉ ×ÙÂÏÒÅ ÁÌÇÏÒÉÔÍÏ× ÉÚ ÕËÁÚÁÎÎÙÈ × ËÌÀÞÅ 
+ÐÏÌÕÞÁÔÅÌÑ. ðÅÒ×ÙÊ ÛÉÆÒ, ÕËÁÚÁÎÎÙÊ × ÄÁÎÎÏÍ ÓÐÉÓËÅ, ÔÁËÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ 
+ËÏÍÁÎÄÏÊ \-\-symmetric. 
+.IP "\-\-personal-digest-preferences \fBstring\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ ÈÜÛ\-ÆÕÎËÃÉÊ × \fBstring\fR, 
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ 
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÂÉÒÁÔØ 
+ÐÒÅÄÐÏÞÉÔÁÅÍÙÅ ÉÍ ÁÌÇÏÒÉÔÍÙ ÐÒÉ ×ÙÂÏÒÅ ÁÌÇÏÒÉÔÍÏ× ÉÚ ÕËÁÚÁÎÎÙÈ × ËÌÀÞÅ 
+ÐÏÌÕÞÁÔÅÌÑ. ðÅÒ×ÁÑ ÈÜÛ\-ÆÕÎËÃÉÑ, ÕËÁÚÁÎÎÁÑ × ÄÁÎÎÏÍ ÓÐÉÓËÅ, ÔÁËÖÅ  
+ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÐÏÄÐÉÓÉ ÂÅÚ ÛÉÆÒÏ×ÁÎÉÑ (\-\-clearsign ÉÌÉ \-\-sign). 
+úÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ "H2", ÞÔÏ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ SHA-1. 
+.IP "\-\-personal-compress-preferences \fBstring\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ ÁÌÇÏÒÉÔÍÏ× ÓÖÁÔÉÑ × \fBstring\fR, 
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ 
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÂÉÒÁÔØ 
+ÐÒÅÄÐÏÞÉÔÁÅÍÙÅ ÉÍ ÁÌÇÏÒÉÔÍÙ ÐÒÉ ×ÙÂÏÒÅ ÁÌÇÏÒÉÔÍÏ× ÉÚ ÕËÁÚÁÎÎÙÈ × ËÌÀÞÅ 
+ÐÏÌÕÞÁÔÅÌÑ. ðÅÒ×ÙÊ ÉÚ ÁÌÇÏÒÉÔÍÏ×, ÕËÁÚÁÎÎÙÈ × ÄÁÎÎÏÍ ÓÐÉÓËÅ, ÔÁËÖÅ 
+ÉÓÐÏÌØÚÕÅÔÓÑ × ÔÅÈ ÓÌÕÞÁÑÈ, ËÏÇÄÁ ËÌÀÞ ÐÏÌÕÞÁÔÅÌÑ ÏÔÓÕÔÓÔ×ÕÅÔ (ÎÁÐÒÉÍÅÒ, 
+\-\-symmetric). 
+.IP "\-\-default-preference-list \fBstring\fR" 10 
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ × \fBstring\fR, 
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ 
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. ëÏÍÁÎÄÁ ×ÌÉÑÅÔ ÎÁ ÇÅÎÅÒÁÃÉÀ ËÌÀÞÁ É 
+ËÏÍÁÎÄÕ "updpref" ÉÚ ÒÅÖÉÍÁ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. 
+.IP "\-\-list-config [\fBnames\fR]" 10 
+÷Ù×ÅÓÔÉ ÒÁÚÌÉÞÎÙÅ ×ÎÕÔÒÅÎÎÉÅ ÐÁÒÁÍÅÔÒÙ ËÏÎÆÉÇÕÒÁÃÉÉ GnuPG. äÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ×ÎÅÛÎÉÍÉ ÐÒÏÇÒÁÍÍÁÍÉ, ËÏÔÏÒÙÅ 
+ÉÓÐÏÌØÚÕÀÔ GnuPG. óÍ. ÐÏÄÒÏÂÎÏÓÔÉ × ÆÁÊÌÅ \fBdoc/DETAILS\fP × 
+ÄÉÓÔÒÉÂÕÔÉ×Å GnuPG. \-\-list-config ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ×ÍÅÓÔÅ Ó 
+ÕÓÔÁÎÏ×ÌÅÎÎÙÍ ÐÁÒÁÍÅÔÒÏÍ \-\-with-colons. 
+.SH "ëÁË ÚÁÄÁÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ" 
+.PP 
+éÍÅÅÔÓÑ ÎÅÓËÏÌØËÏ ÓÐÏÓÏÂÏ× ÕËÁÚÁÎÉÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ ÄÌÑ  
+GnuPG; ÎÉÖÅ ÐÒÉ×ÅÄÅÎÏ ÎÅÓËÏÌØËÏ ÐÒÉÍÅÒÏ×: 
+.IP "" 10 
+.IP "234567C4" 10 
+.IP "0F34E556E" 10 
+.IP "01347A56A" 10 
+.IP "0xAB123456" 10 
+üÔÏ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÚÁÄÁÎÎÙÊ × ÏÂÙÞÎÏÊ ËÏÒÏÔËÏÍ ÆÏÒÍÁÔÅ. 
+.IP "234AABBCC34567C4" 10 
+.IP "0F323456784E56EAB" 10 
+.IP "01AB3FED1347A5612" 10 
+.IP "0x234AABBCC34567C4" 10 
+úÄÅÓØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÚÁÄÁΠנÄÌÉÎÎÏÍ ÆÏÒÍÁÔÅ, ËÁË × OpenPGP (÷Ù 
+ÍÏÖÅÔÅ ÐÏÌÕÞÉÔØ ÄÌÉÎÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÉÓÐÏÌØÚÕÑ ÐÁÒÁÍÅÔÒ 
+\-\-with-colons). 
+.IP "1234343434343434C434343434343434" 10 
+.IP "123434343434343C3434343434343734349A3434" 10 
+.IP "0E12343434343434343434EAB3484343434343434" 10 
+.IP "0xE12343434343434343434EAB3484343434343434" 10 
+îÁÉÌÕÞÛÉÊ ÓÐÏÓÏ ÚÁÄÁÎÉÑ ËÌÀÞÁ \-\- ÜÔÏ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÅÇÏ ÏÔÐÅÞÁÔËÁ. üÔÏ 
+ÐÒÅÄÏÔ×ÒÁÝÁÅÔ ÌÀÂÙÅ ÎÅÏÄÎÏÚÎÁÞÎÏÓÔÉ × ÓÌÕÞÁÅ ÏÄÉÎÁËÏ×ÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× 
+ËÌÀÞÅÊ (ËÏÔÏÒÙÅ ËÒÁÊÎÅ ÒÅÄËÉ ÄÌÑ ÄÌÉÎÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ËÌÀÞÅÊ). 
+.IP "=Heinrich Heine <heinrichh@uni-duesseldorf.de>" 10 
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÞÎÏÅ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÓÔÒÏËÅ. üÔÏ ÕËÁÚÙ×ÁÅÔÓÑ ÚÎÁËÏÍ 
+ÒÁ×ÅÎÓÔ×Á. 
+.IP "<heinrichh@uni-duesseldorf.de>" 10 
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÞÎÏÅ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÁÄÒÅÓÁ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ. ìÅ×ÁÑ ÕÇÌÏ×ÁÑ 
+ÓËÏÂËÁ ÕËÁÚÙ×ÁÅÔ, ÞÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ÒÁÖÉÍ ÁÄÒÅÓÁ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ. 
+.IP "+Heinrich Heine duesseldorf" 10 
+÷ÓÅ ÓÌÏ×Á ÄÏÌÖÎÙ ÔÏÞÎÏ ÓÏÏÔ×ÅÔÓÔ×Ï×ÁÔØ ÕËÁÚÁÎÎÙÍ (ÒÅÇÉÓÔÒ ÓÉÍ×ÏÌÏ× ÎÅ 
+ÉÍÅÅÔ ÚÎÁÞÅÎÉÑ) ÎÏ ÍÏÇÕÔ ÐÒÉÓÕÔÓÔ×Ï×ÁÔØ × ÉÄÅÎÔÉÆÉËÁÔÏÒÅ ÐÏÌØÚÏ×ÁÔÅÌÑ × 
+ÌÀÂÏÍ ÐÏÒÑÄËÅ. óÌÏ×Á ÍÏÇÕÔ ÂÙÔØ ÌÀÂÙÍÉ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÑÍÉ ÂÕË×, ÃÉÆÒ, 
+ÚÎÁËÏ× ÐÏÄÞÅÒËÉ×ÁÎÉÑ É ÓÉÍ×ÏÌÏ× Ó ÕÓÔÁÎÏ×ÌÅÎÎÙÍ 7-Í ÂÉÔÏÍ. 
+.IP "Heine" 10 
+.IP "*Heine" 10 
+éÄÅÎÔÉÆÉËÁÔÏÒ ÄÏÌÖÅΠÓÏÄÅÒÖÁÔØ ÚÁÄÁÎÎÕÀ ÐÏÄÓÔÒÏËÕ (ÒÅÇÉÓÔÒ ÓÉÍ×ÏÌÏ× ÎÅ 
+ÉÍÅÅÔ ÚÎÁÞÅÎÉÑ). üÔÏÔ ÒÅÖÉÍ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÎÏ ÍÏÖÎÏ 
+ÄÏÐÏÌÎÉÔÅÌØÎÏ ÚÁÄÁÔØ ÅÇÏ ÐÏÍÅÓÔÉ× ÓÉÍ×ÏÌ Ú×£ÚÄÏÞËÉ × ÎÁÞÁÌÅ. 
+.PP 
+úÁÍÅÔÉÍ, ÞÔÏ ÷Ù ÍÏÖÅÔÅ ÄÏÂÁ×ÉÔØ ×ÏÓËÌÉÃÁÔÅÌØÎÙÊ ÚÎÁË (!) Ë ÉÄÅÎÔÉÆÉËÁÔÏÒÕ 
+ËÌÀÞÁ ÉÌÉ ÏÔÐÅÞÁÔËÕ. üÔÏ ÆÌÁÇ, ËÏÔÏÒÙÊ ÕËÁÚÙ×ÁÅÔ GnuPG, ÞÔÏ ÓÌÅÄÕÅÔ 
+ÉÓÐÏÌØÚÏ×ÁÔØ ÉÍÅÎÎÏ ÜÔÏÔ ÐÅÒ×ÉÞÎÙÊ ÉÌÉ ×ÔÏÒÉÞÎÙÊ ËÌÀÞ É ÎÅ ÐÙÔÁÔØÓÑ 
+ÉÓÐÏÌØÚÏ×ÁÔØ ËÁËÏÊ\-ÌÉÂÏ ÄÒÕÇÏÊ ÐÅÒ×ÉÞÎÙÊ ÉÌÉ ×ÔÏÒÉÞÎÙÊ ËÌÀÞ. 
+.SH "÷ïú÷òáýáåíïå úîáþåîéå" 
+.PP 
+ðÒÏÇÒÁÍÍÁ ×ÏÚ×ÒÁÝÁÅÔ 0 ÅÓÌÉ ×ÓÅ ÏÐÅÒÁÃÉÉ ×ÙÐÏÌÎÅÎÙ ÕÓÐÅÛÎÏ, 1 ÅÓÌÉ 
+ÐÒÏ×ÅÒËÁ ÈÏÔÑ ÂÙ ÏÄÎÏÊ ÐÏÄÐÉÓÉ ÂÙÌÁ ÎÅÕÄÁÞÎÏÊ É ÄÒÕÇÏÊ ËÏÄ ÏÛÉÂËÉ × 
+ÓÌÕÞÁÅ ÆÁÔÁÌØÎÏÊ ÏÛÉÂËÉ. 
+.SH "ðòéíåòù" 
+.IP "gpg \-se \-r \fBBob\fR \fBfile\fR" 10 
+ÐÏÄÐÉÓÁÔØ É ÚÁÛÉÆÒÏ×ÁÔØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ Bob 
+.IP "gpg \-\-clearsign \fBfile\fR" 10 
+ÓÏÚÄÁÔØ ÐÒÏÚÒÁÞÎÕÀ ÐÏÄÐÉÓØ 
+.IP "gpg \-sb  \fBfile\fR" 10 
+ÓÏÚÄÁÔØ ÏÔÄÅÌ£ÎÎÕÀ ÐÏÄÐÉÓØ 
+.IP "gpg \-\-list-keys  \fBuser_ID\fR" 10 
+ÐÏËÁÚÁÔØ ËÌÀÞ 
+.IP "gpg \-\-fingerprint  \fBuser_ID\fR" 10 
+ÐÏËÁÚÁÔØ ÏÔÐÅÞÁÔÏË ËÌÀÞÁ 
+.IP "gpg \-\-verify  \fBpgpfile\fR" 10 
+.IP "gpg \-\-verify  \fBsigfile\fR [\fBfiles\fR]" 10 
+ðÒÏ×ÅÒÉÔØ ÐÏÄÐÉÓØ ÎÁ ÆÁÊÌÅ, ÎÏ ÎÅ ×Ù×ÏÄÉÔØ ÅÇÏ ÓÏÄÅÒÖÉÍÏÅ. ÷ÔÏÒÁÑ ÆÏÒÍÁ 
+ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÏÔÄÅÌ£ÎÎÙÈ ÐÏÄÐÉÓÅÊ, ÇÄÅ \fBsigfile\fR  
+\-\-- ÏÔÄÅÌ£ÎÎÁÑ ÐÏÄÐÉÓØ (Ä×ÏÉÞÎÁÑ ÉÌÉ × ASCII ÆÏÒÍÁÔÅ), Á [\fBfiles\fR] ÐÏÄÐÉÓÁÎÎÙÅ ÄÁÎÎÙÅ; ÅÓÌÉ ÉÍÑ ÆÁÊÌÁ ÎÅ ÚÁÄÁÎÏ, ÔÏ ÏÎÏ ÏÂÒÁÚÕÅÔÓÑ 
+ÕÄÁÌÅÎÉÅÍ ÒÁÓÛÉÒÅÎÉÑ (".sig" ÉÌÉ ".asc") Õ ÉÍÅÎÉ 
+\fBsigfile\fR ÉÌÉ ÚÁÐÒÁÛÉ×ÁÅÔÓÑ Õ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.SH "ðåòåíåîîùå ïëòõöåîéñ" 
+.IP "HOME" 10 
+äÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ ÐÏÌØÚÏ×ÁÔÅÌÑ. 
+.IP "GNUPGHOME" 10 
+ëÁÔÁÌÏÇ, ÚÁÍÅÎÑÀÝÉÊ "~/.gnupg". 
+.IP "GPG_AGENT_INFO" 10 
+éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÐÒÅÄÅÌÅÎÉÑ ÍÅÓÔÏÐÏÌÏÖÅÎÉÑ gpg-agent; 
+ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÅÓÌÉ ÕÓÔÁÎÏ×ÌÅΠÐÁÒÁÍÅÔÒ \-\-use-agent. úÎÁÞÅÎÉÅ 
+ÓÏÓÔÏÉÔ ÉÚ 3 ÐÏÌÅÊ, ÒÁÚÄÅÌ£ÎÎÙÈ Ä×ÏÅÔÏÞÉÑÍÉ. ðÅÒ×ÏÅ \-\- ÐÕÔØ Ë ÄÏÍÅÎÎÏÍÕ 
+ÓÏËÅÔÕ UNIX, ×ÔÏÒÏÅ \-\- ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÒÏÃÅÓÓÁ gpg-agent, É ÔÒÅÔØÅ \-\- 
+×ÅÒÓÉÑ ÐÒÏÔÏËÏÌÁ, ËÏÔÏÒÁÑ ÄÏÌÖÎÁ ÂÙÔØ ÒÁ×ÎÁ 1. ðÒÉ ÚÁÐÕÓËÅ gpg-agent, 
+ËÁË ÏÐÉÓÁÎÏ × ÄÏËÕÍÅÎÔÁÃÉÉ, ÄÁÎÎÏÊ ÐÅÒÅÍÅÎÎÏÊ ÐÒÉÓ×ÁÉ×ÁÅÔÓÑ ËÏÒÒÅËÔÎÏÅ 
+ÚÎÁÞÅÎÉÅ. ðÁÒÁÍÅÔÒ \-\-gpg-agent-info ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÅÒÅËÒÙÔÉÑ 
+ÚÎÁÞÅÎÉÑ ÄÁÎÎÏÊ ÐÅÒÅÍÅÎÎÏÊ. 
+.IP "http_proxy" 10 
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÅÓÌÉ ÕÓÔÁÎÏ×ÌÅΠÐÁÒÁÍÅÔÒ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ 
+\-\-honor-http-proxy. 
+.IP "COLUMNS" 10 
+.IP "LINES" 10 
+éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÕÓÔÁÎÏ×ËÉ ÒÁÚÍÅÒÁ ÎÅËÏÔÏÒÙÈ ÄÉÓÐÌÅÅ×. 
+.SH "æáêìù" 
+.IP "~/.gnupg/secring.gpg" 10 
+îÁÂÏÒ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ 
+.IP "~/.gnupg/secring.gpg.lock" 10 
+É ÅÇÏ ÆÁÊÌ ÂÌÏËÉÒÏ×ËÉ 
+.IP "~/.gnupg/pubring.gpg" 10 
+îÁÂÏÒ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ 
+.IP "~/.gnupg/pubring.gpg.lock" 10 
+É ÅÇÏ ÆÁÊÌ ÂÌÏËÉÒÏ×ËÉ 
+.IP "~/.gnupg/trustdb.gpg" 10 
+âÁÚÁ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ 
+.IP "~/.gnupg/trustdb.gpg.lock" 10 
+ɠţ ÆÁÊÌ ÂÌÏËÉÒÏ×ËÉ 
+.IP "~/.gnupg/random_seed" 10 
+ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÈÒÁÎÅÎÉÑ ×ÎÕÔÒÅÎÎÅÇÏ ÐÕÌÁ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ 
+.IP "~/.gnupg/gpg.conf" 10 
+ëÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ ÐÏ ÕÍÏÌÞÁÎÉÀ 
+.IP "~/.gnupg/options" 10 
+æÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ × ÐÒÅÄÙÄÕÝÉÈ ×ÅÒÓÉÑÈ. éÓÐÏÌØÚÕÅÔÓÑ 
+ÅÓÌÉ ÎÅ ÎÁÊÄÅΠgpg.conf 
+.IP "/usr[/local]/share/gnupg/options.skel" 10 
+ðÒÏÏÔÉРÆÁÊÌÁ ÐÁÒÁÍÅÔÒÏ× 
+.IP "/usr[/local]/lib/gnupg/" 10 
+ëÁÔÁÌÏÇ, × ËÏÔÏÒÏÍ ÐÏ ÕÍÏÌÞÁÎÉÀ ÈÒÁÎÑÔÓÑ ÍÏÄÕÌÉ 
+ÒÁÓÛÉÒÅÎÉÑ 
+.SH "ðòåäõðòåöäåîéñ" 
+.PP 
+éÓÐÏÌØÚÕÊÔÅ *ÈÏÒÏÛÉÅ* ÐÁÒÏÌÉ ÄÌÑ ÷ÁÛÅÊ ÕÞÅÔÎÏÊ ÚÁÐÉÓÉ É *ÈÏÒÏÛÉÅ* 
+ËÌÀÞÅ×ÙÅ ÆÒÁÚÙ ÄÌÑ ÚÁÝÉÔÙ ÷ÁÛÅÇÏ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ. ëÌÀÞÅ×ÁÑ ÆÒÁÚÁ 
+Ñ×ÌÑÅÔÓÑ ÓÁÍÏÊ ÓÌÁÂÏÊ ÞÁÓÔØÀ ×ÓÅÊ ÓÉÓÔÅÍÙ. îÅÓÌÏÖÎÏ ÓÏÚÄÁÔØ ÐÒÏÇÒÁÍÍÕ, 
+ËÏÔÏÒÁÑ ÐÒÏÉÚ×ÅÄ£Ô ÓÌÏ×ÁÒÎÕÀ ÁÔÁËÕ ÎÁ ÷ÁÛ ÎÁÂÏÒ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ, 
+ÐÏÜÔÏÍÕ ÔÝÁÔÅÌØÎÏ ÚÁÝÉÝÁÊÔÅ Ó×ÏÊ ËÁÔÁÌÏÇ "~/.gnupg/". 
+.PP 
+ðÏÍÎÉÔÅ, ÞÔÏ ÅÓÌÉ ÷Ù ÉÓÐÏÌØÚÕÅÔÅ ÜÔÕ ÐÒÏÇÒÁÍÍÕ ÞÅÒÅÚ ÓÅÔØ (ÎÁÐÒÉÍÅÒ, 
+ÉÓÐÏÌØÚÕÑ telnet), ÔÏ *ÏÞÅÎØ* ÌÅÇËÏ ÐÅÒÅÈ×ÁÔÉÔØ ÷ÁÛÕ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ! 
+.PP 
+åÓÌÉ ÷Ù ÐÒÏ×ÅÒÑÅÔÅ ÏÔÄÅÌ£ÎÎÕÀ ÐÏÄÐÉÓØ, ÔÏ ÕÂÅÄÉÔÅÓØ, ÞÔÏ ÐÒÏÇÒÁÍÍÁ ÚÎÁÅÔ 
+Ï ÜÔÏÍ; ÌÉÂÏ ÚÁÄÁÊÔÅ ÉÍÅÎÁ ÏÂÏÉÈ ÆÁÊÌÏ× × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ, ÌÉÂÏ 
+ÉÓÐÏÌØÚÕÊÔÅ \fB-\fP ÄÌÑ ÕËÁÚÁÎÉÑ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ. 
+.SH "÷úáéíïäåêóô÷éå ó äòõçéíé ðòïçòáííáíé OPENPGP" 
+.PP 
+GnuPG ÓÔÒÅÍÉÔÓÑ ÂÙÔØ ÏÞÅÎØ ÇÉÂËÏÊ ÒÅÁÌÉÚÁÃÉÅÊ ÓÔÁÎÄÁÒÔÁ OpenPGP. ÷ 
+ÞÁÓÔÎÏÓÔÉ, GnuPG ÒÅÁÌÉÚÕÅÔ ÍÎÏÖÅÓÔ×Ï ÎÅÏÂÑÚÁÔÅÌØÎÙÈ ÞÁÓÔÅÊ ÓÔÁÎÄÁÒÔÁ, 
+ÔÁËÉÈ ËÁË ÈÜÛ\-ÆÕÎËÃÉÑ SHA-512 É ÁÌÇÏÒÉÔÍÙ ÓÖÁÔÉÑ ZLIB É BZIP2. ÷ÁÖÎÏ ÐÏÍÎÉÔØ, 
+ÞÔÏ ÎÅ ×ÓÅ ÐÒÏÇÒÁÍÍÙ OpenPGP ÒÅÁÌÉÚÕÀÔ ÜÔÉ ÄÏÐÏÌÎÉÔÅÌØÎÙÅ ÁÌÇÏÒÉÔÍÙ, É 
+ÞÔÏ ÐÒÉÎÕÄÉÔÅÌØÎÁÑ ÕÓÔÁÎÏ×ËÁ ÜÔÉÈ ÁÌÇÏÒÉÔÍÏ× ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÏ× 
+\-\-cipher-algo, \-\-digest-algo, \-\-cert-digest-algo ÉÌÉ \-\-compress-algo × 
+GnuPG ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë ÔÏÍÕ, ÞÔÏ ÓÏÚÄÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ, ÂÕÄÕÞÉ ÐÏÌÎÏÓÔØÀ 
+ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ ÓÔÁÎÄÁÒÔÕ OpenPGP, ÎÅ ÓÍÏÖÅÔ ÂÙÔØ ÐÒÏÞÉÔÁÎÏ ÐÏÌÕÞÁÔÅÌÅÍ, 
+ÉÓÐÏÌØÚÕÀÝÉÍ ÄÒÕÇÕÀ ÒÅÁÌÉÚÁÃÉÀ OpenPGP. 
+.PP 
+äÏÓÔÕÐÎÏ ÚÎÁÞÉÔÅÌØÎÏÅ ÞÉÓÌÏ ÒÁÚÌÉÞÎÙÈ ÒÅÁÌÉÚÁÃÉÊ OpenPGP, É ËÁÖÄÁÑ 
+ÐÏÄÄÅÒÖÉ×ÁÅÔ ÎÅËÏÔÏÒÏÅ Ó×Ï£ ÐÏÄÍÎÏÖÅÓÔ×Ï ÄÏÐÏÌÎÉÔÅÌØÎÙÈ ÁÌÇÏÒÉÔÍÏ×. 
+îÁÐÒÉÍÅÒ, ÄÏ ÐÏÓÌÅÄÎÅÇÏ ×ÒÅÍÅÎÉ, ÎÅ ÂÙÌÏ ÏÆÉÃÉÁÌØÎÙÈ ×ÅÒÓÉÊ 
+PGP ÐÏÄÄÅÒÖÉ×ÁÀÝÉÈ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ BLOWFISH. ðÏÌØÚÏ×ÁÔÅÌØ PGP ÎÅ 
+ÓÍÏÖÅÔ ÒÁÓÛÉÆÒÏ×ÁÔØ ÓÏÏÂÝÅÎÉÅ ÚÁÛÉÆÒÏ×ÁÎÎÏÅ ÜÔÉÍ ÁÌÇÏÒÉÔÍÏÍ. ðÏ ÕÍÏÌÞÁÎÉÀ 
+GnuPG ÉÓÐÏÌØÚÕÅÔ ÓÔÁÎÄÁÒÔÎÕÀ ÓÉÓÔÅÍÕ ÐÒÅÄÐÏÞÔÅÎÉÊ ÏÐÒÅÄÅÌ£ÎÎÕÀ × OpenPGP, 
+ËÏÔÏÒÁÑ ×ÓÅÇÄÁ ÄÅÌÁÅÔ ÐÒÁ×ÉÌØÎÙÊ ×ÙÂÏÒ É ÓÏÚÄÁ£Ô ÓÏÏÂÝÅÎÉÑ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÂÙÔØ 
+ÐÒÏÞÉÔÁÎÙ ×ÓÅÍÉ ÐÏÌÕÞÁÔÅÌÑÍÉ, ÎÅÚÁ×ÉÓÉÍÏ ÏÔ ÔÏÇÏ, ËÁËÕÀ ÒÅÁÌÉÚÁÃÉÀ 
+OpenPGP ÏÎÉ ÉÓÐÏÌØÚÕÀÔ. éÚÍÅÎÑÊÔÅ ÕÓÔÁÎÏ×ËÉ ÐÏ ÕÍÏÌÞÁÎÉÀ ÔÏÌØËÏ ÔÏÇÄÁ, 
+ËÏÇÄÁ ÚÎÁÅÔÅ, ÞÔÏ ÄÅÌÁÅÔÅ. 
+.PP 
+åÓÌÉ ÷ÁÍ ÁÂÓÏÌÀÔÎÏ ÎÅÏÂÈÏÄÉÍÏ ÐÅÒÅÚÁÐÉÓÁÔØ ÂÅÚÏÐÁÓÎÙÅ ÕÓÔÁÎÏ×ËÉ, 
+ÐÒÉÎÑÔÙÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÉÌÉ ÐÒÅÄÐÏÞÔÅÎÉÑ ÎÁ ÄÁÎÎÏÍ ËÌÀÞÅ ÐÏ ËÁËÉÍ\-ÔÏ 
+ÐÒÉÞÉÎÁÍ ÎÅ×ÅÒÎÙ, ÔÏ ÌÕÞÛÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÁÒÁÍÅÔÒÙ \-\-pgp6, 
+\-\-pgp7 ÉÌÉ \-\-pgp8. üÔÉ ÐÁÒÁÍÅÔÒÙ ÂÅÚÏÐÁÓÎÙ, Ô.Ë. ÏÎÉ ÎÅ ÐÒÉ×ÏÄÑÔ Ë 
+ÉÓÐÏÌØÚÏ×ÁÎÉÀ ËÁËÏÇÏ\-ÌÉÂÏ ËÏÎËÒÅÔÎÏÇÏ ÁÌÇÏÒÉÔÍÁ × ÎÁÒÕÛÅÎÉÅ OpenPGP, Á 
+ÔÏÌØËÏ ÕÍÅÎØÛÁÀÔ ËÏÌÉÞÅÓÔ×Ï ÄÏÐÕÓÔÉÍÙÈ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÁÌÇÏÒÉÔÍÏ×. 
+.SH "ïûéâëé" 
+.PP 
+÷Ï ÍÎÏÇÉÈ ÓÉÓÔÅÍÁÈ ÄÁÎÎÁÑ ÐÒÏÇÒÁÍÍÁ ÄÏÌÖÎÁ ÂÙÔØ ÕÓÔÁÎÏ×ÌÅÎÁ Ó ÂÉÔÏÍ 
+SUID. üÔÏ ÎÅÏÂÈÏÄÉÍÏ ÄÌÑ ÂÌÏËÉÒÏ×ËÉ ÓÔÒÁÎÉàÐÁÍÑÔÉ. âÌÏËÉÒÏ×ËÁ ÓÔÒÁÎÉà
+ÐÁÍÑÔÉ ÐÒÅÄÏÔ×ÒÁÝÁÅÔ ÚÁÐÉÓØ ÓÔÒÁÎÉàÐÁÍÑÔÉ (ËÏÔÏÒÙÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ 
+ËÌÀÞÅ×ÙÅ ÆÒÁÚÙ É ÄÒÕÇÕÀ ÞÕ×ÓÔ×ÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ) ÎÁ ÄÉÓË. 
+åÓÌÉ ÐÒÏÇÒÁÍÍÁ ÎÅ ×Ù×ÏÄÉÔ 
+ÐÒÅÄÕÐÒÅÖÄÁÀÝÅÇÏ ÓÏÏÂÝÅÎÉÑ Ï ÎÅÚÁÝÉÝÅÎÎÏÊ ÐÁÍÑÔÉ, ÔÏ ÜÔÏ ÚÎÁÞÉÔ, ÞÔÏ 
+÷ÁÛÁ ÏÐÅÒÁÃÉÏÎÎÁÑ ÓÉÓÔÅÍÁ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÂÌÏËÉÒÏ×ËÕ ÂÅÚ ÐÒÁ× 
+ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌÑ. ðÒÏÇÒÁÍÍÁ ÓÂÒÁÓÙ×ÁÅÔ ÐÒÉ×ÉÌÅÇÉÉ ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌÑ 
+ÓÒÁÚÕ ÐÏÓÌÅ ÔÏÇÏ, ËÁË ×ÙÄÅÌÑÅÔÓÑ ÂÌÏËÉÒÕÅÍÁÑ ÐÁÍÑÔØ. 
+.SH "ðåòå÷ïä" 
+.PP 
+ðÅÒÅ×ÏÄ ÎÁ ÒÕÓÓËÉÊ ÑÚÙË: ðÁ×ÅÌ ûÁÊÄÏ <zwon@severodvinsk.ru>. 
+.\" created by instant / docbook-to-man, Wed 27 Jul 2005, 19:24 
diff --git a/doc/gpg.ru.sgml b/doc/gpg.ru.sgml
new file mode 100644 (file)
index 0000000..a2d6d8a
--- /dev/null
@@ -0,0 +1,3073 @@
+<!-- $Id: gpg.ru.sgml 3753 2005-05-31 08:39:18Z wk $ -->
+<!-- gpg.sgml.ru - the man page for GnuPG
+     Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+                   2004 Free Software Foundation, Inc.
+    Russian translation by Pawel I. Shajdo <zwon@severodvinsk.ru>
+
+    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 2 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, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+    02110-1301, USA
+-->
+<!-- This file should be processed by docbook-to-man to
+     create a manual page.  This program has currently the bug
+     not to remove leading white space. So this source file does
+     not look very pretty
+
+    FIXME: generated a file with entity (e.g. pathnames) from the
+    configure scripts and include it here
+-->
+
+
+<!DOCTYPE refentry PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [
+<!entity ParmDir "<parameter>directory</parameter>">
+<!entity ParmFile "<parameter>file</parameter>">
+<!entity OptParmFile "<optional>&ParmFile;</optional>">
+<!entity ParmFiles "<parameter>files</parameter>">
+<!entity OptParmFiles "<optional>&ParmFiles;</optional>">
+<!entity ParmNames "<parameter>names</parameter>">
+<!entity OptParmNames "<optional>&ParmNames;</optional>">
+<!entity ParmName  "<parameter>name</parameter>">
+<!entity OptParmName  "<optional>&ParmName;</optional>">
+<!entity ParmKeyIDs "<parameter>key IDs</parameter>">
+<!entity OptParmKeyIDs "<optional>&ParmKeyIDs</optional>">
+<!entity ParmN     "<parameter>n</parameter>">
+<!entity ParmFlags  "<parameter>flags</parameter>">
+<!entity ParmString "<parameter>string</parameter>">
+<!entity ParmValue  "<parameter>value</parameter>">
+<!entity ParmNameValue "<parameter>name=value</parameter>">
+<!entity ParmNameValues        "<parameter>name=value1 <optional>value2 value3 ...</optional></parameter>">
+<!entity OptEqualsValue        "<optional>=value</optional>">
+]>
+
+<refentry id="gpg" lang="ru">
+<refmeta>
+  <refentrytitle>gpg</refentrytitle>
+  <manvolnum>1</manvolnum>
+  <refmiscinfo class="gnu">GNU Tools</refmiscinfo>
+</refmeta>
+<refnamediv>
+  <refname/gpg/
+  <refpurpose>ÉÎÓÔÒÕÍÅÎÔ ÄÌÑ ÛÉÆÒÏ×ÁÎÉÑ É ÃÉÆÒÏ×ÏÊ ÐÏÄÐÉÓÉ</>
+</refnamediv>
+<refsynopsisdiv>
+  <synopsis>
+<command>gpg</command> <optional>--homedir <parameter/name/</optional> <optional>--options <parameter/file/</optional> <optional><parameter/options/</optional> <parameter>command</parameter> <optional><parameter/args/</optional>
+  </synopsis>
+</refsynopsisdiv>
+
+<refsect1>
+    <title>ïðéóáîéå</title>
+    <para>
+<command/gpg/ ÏÓÎÏ×ÎÁÑ ÐÒÏÇÒÁÍÍÁ ÓÉÓÔÅÍÙ GnuPG.
+    </para>
+    <para>
+äÁÎÎÏÅ ÒÕËÏ×ÏÄÓÔ×Ï Ñ×ÌÑÅÔÓÑ ÞÁÓÔØÀ GnuPG.
+GnuPG ÒÁÓÐÒÏÓÔÒÁÎÑÅÔÓÑ ÎÁ ÕÓÌÏ×ÉÑÈ GNU General Public License, ÏÐÕÂÌÉËÏ×ÁÎÎÏÊ
+Free Software Foundation; ÌÉÂÏ ×ÅÒÓÉÉ 2, ÌÉÂÏ (ÎÁ ÷ÁÛÅ ÕÓÍÏÔÒÅÎÉÅ) ÌÀÂÏÊ 
+ÂÏÌÅÅ ÐÏÚÄÎÅÊ ×ÅÒÓÉÉ. 
+    </para>
+    <para>
+äÁÎÎÏÅ ÒÕËÏ×ÏÄÓÔ×Ï ÓÏÄÅÒÖÉÔ ÔÏÌØËÏ ÓÐÉÓÏË ÄÏÓÔÕÐÎÙÈ ËÏÍÁÎÄ É ÐÁÒÁÍÅÔÒÏ×.
+âÏÌÅÅ ÐÏÄÒÏÂÎÁÑ ÉÎÆÏÒÍÁÃÉÑ ÓÏÄÅÒÖÉÔÓÑ × GNU Privacy Handbook (GPH) É
+ÄÒÕÇÉÈ ÄÏËÕÍÅÎÔÁÈ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÎÁÊÔÉ ÎÁ ÓÁÊÔÅ
+http://www.gnupg.org.
+</para>
+<para>
+ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÒÁÚÂÏÒ ÐÁÒÁÍÅÔÒÏ× ÚÁËÁÎÞÉ×ÁÅÔÓÑ ÓÒÁÚÕ ÐÏÓÌÅ ÔÏÇÏ,
+ËÁË × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ×ÓÔÒÅÞÁÅÔÓÑ ÜÌÅÍÅÎÔ ÎÅ Ñ×ÌÑÀÝÉÊÓÑ ÐÁÒÁÍÅÔÒÏÍ. ÷Ù
+ÍÏÖÅÔÅ ÐÒÉÎÕÄÉÔÅÌØÎÏ ÐÒÅËÒÁÔÉÔØ ÒÁÚÂÏÒ ÐÁÒÁÍÅÔÒÏ×, ÉÓÐÏÌØÚÕÑ ÓÐÅÃÉÁÌØÎÙÊ
+ÐÁÒÁÍÅÔÒ "--".
+</para>
+</refsect1>
+
+<refsect1>
+<title>ëïíáîäù</title>
+
+<para>
+<command/gpg/ ÍÏÖÅÔ ÂÙÔØ ÚÁÐÕÝÅΠÂÅÚ ÕËÁÚÁÎÉÑ ËÏÍÁÎÄÙ, × ÜÔÏÍ ÓÌÕÞÁÅ ÏÎ
+×ÙÐÏÌÎÑÅÔ ÄÅÊÓÔ×ÉÅ × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÔÉÐÁ ÆÁÊÌÁ ÐÏÄÁÎÎÏÇÏ ÎÁ ÅÇÏ ×ÈÏÄ
+(ÚÁÛÉÆÒÏ×ÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ ÒÁÓÛÉÆÒÏ×Ù×ÁÅÔÓÑ, ÐÏÄÐÉÓØ ÐÒÏ×ÅÒÑÅÔÓÑ, ÅÓÌÉ 
+ÆÁÊÌ ÓÏÄÅÒÖÉÔ ËÌÀÞÉ, ÔÏ ×Ù×ÏÄÉÔÓÑ ÉÈ ÓÐÉÓÏË).
+</para>
+
+<para>
+<command/gpg/ ÒÁÓÐÏÚÎÁ£Ô ÓÌÅÄÕÀÝÉÅ ËÏÍÁÎÄÙ:
+</para>
+
+<variablelist>
+
+<varlistentry>
+<term>-s, --sign</term>
+<listitem><para>
+óÏÚÄÁÔØ ÐÏÄÐÉÓØ. äÁÎÎÁÑ ËÏÍÁÎÄÁ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó 
+--encrypt (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ),
+--symmetric (ÄÌÑ ÓÏÚÄÁÎÉÑ ÓÏÏÂÝÅÎÉÊ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ
+ÓÉÍÍÅÔÒÉÞÎÙÍ ÛÉÆÒÏÍ) ÉÌÉ Ó --encrypt É --symmetric ÓÒÁÚÕ (ÄÌÑ ÓÏÚÄÁÎÉÑ
+ÐÏÄÐÉÓÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÂÙÔØ ÒÁÓÛÉÆÒÏ×ÁÎÙ ÉÌÉ Ó ÐÏÍÏÝØÀ
+ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ ÉÌÉ ÐÏÓÒÅÄÓÔ×ÏÍ ËÌÀÞÅ×ÏËÌÀÞÅ×ÏÊ ÆÒÁÚÙ).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--clearsign</term>
+<listitem><para>
+óÏÚÄÁÔØ ÐÒÏÚÒÁÞÎÕÀ ÐÏÄÐÉÓØ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-b, --detach-sign</term>
+<listitem><para>
+óÏÚÄÁÔØ ÏÔÄÅÌ£ÎÎÕÀ ÐÏÄÐÉÓØ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-e, --encrypt</term>
+<listitem><para>
+úÁÛÉÆÒÏ×ÁÔØ ÄÁÎÎÙÅ. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó --sign (ÄÌÑ
+ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ), --symmetric (ÄÌÑ
+ÓÏÚÄÁÎÉÑ ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó
+ÐÏÍÏÝØÀ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ) ÉÌÉ Ó 
+--sign É --symmetric ÓÒÁÚÕ (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ
+ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó ÐÏÍÏÝØÀ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ,
+ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-c, --symmetric</term>
+<listitem><para>
+úÁÛÉÆÒÏ×ÁÔØ ÓÉÍÍÅÔÒÉÞÎÙÍ ÁÌÇÏÒÉÔÍÏÍ ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ (ÐÁÒÏÌØ).
+ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÁÌÇÏÒÉÔÍ CAST5. äÌÑ ×ÙÂÏÒÁ ÄÒÕÇÏÇÏ ÁÌÇÏÒÉÔÍÁ
+ÍÏÖÎÏ ×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒÏÍ --cipher-algo. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ 
+ÓÏ×ÍÅÓÔÎÏ Ó --sign (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ),
+--encrypt  (ÄÌÑ ÓÏÚÄÁÎÉÑ ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ 
+ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó ÐÏÍÏÝØÀ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ 
+ÆÒÁÚÕ) ÉÌÉ Ó --sign É --encrypt ÓÒÁÚÕ (ÄÌÑ ÓÏÚÄÁÎÉÑ ÐÏÄÐÉÓÁÎÎÙÈ É
+ÚÁÛÉÆÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÊ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÒÁÓÛÉÆÒÏ×ÁÔØ ËÁË Ó ÐÏÍÏÝØÀ 
+ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÔÁË É ÉÓÐÏÌØÚÕÑ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ).
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--store</term>
+<listitem><para>
+óÏÚÄÁ£Ô ÐÁËÅÔ × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó RFC1991.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--decrypt &OptParmFile;</term>
+<listitem><para>
+òÁÓÛÉÆÒÏ×Ù×ÁÅÔ &ParmFile; (ÉÌÉ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ, ÅÓÌÉ ÆÁÊÌ ÎÅ ÚÁÄÁÎ) É
+×Ù×ÏÄÉÔ ÅÇÏ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ (ÉÌÉ × ÆÁÊÌ ÏÐÒÅÄÅÌ£ÎÎÙÊ ÐÁÒÁÍÅÔÒÏÍ
+--output). åÓÌÉ ÒÁÓÛÉÆÒÏ×ÁÎÎÙÊ ÆÁÊÌ ÐÏÄÐÉÓÁÎ, ÔÏ ÔÁËÖÅ ÐÒÏ×ÅÒÑÅÔÓÑ
+ÐÏÄÐÉÓØ. üÔÁ ËÏÍÁÎÄÁ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÏÐÅÒÁÃÉÉ ÐÏ ÕÍÏÌÞÁÎÉÀ ÔÅÍ, ÞÔÏ
+ÎÉËÏÇÄÁ ÎÅ ÓÏÈÒÁÎÑÅÔ ÒÅÚÕÌØÔÁÔ × ÆÁÊÌÅ Ó ÉÍÅÎÅÍ ÕËÁÚÁÎÎÙÍ ×
+ÚÁÛÉÆÒÏ×ÁÎÎÏÍ ÆÁÊÌÅ É ÎÅ ÏÂÒÁÂÁÔÙ×ÁÅÔ ÆÁÊÌÙ ÎÅ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó
+ÚÁÛÉÆÒÏ×ÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--verify <optional><optional><parameter/sigfile/</optional>
+ <optional><parameter/signed-files/</optional></optional></term>
+<listitem><para>
+ðÒÅÄÐÏÌÁÇÁÅÔ, ÞÔÏ <parameter/sigfile/ ÓÏÄÅÒÖÉÔ ÐÏÄÐÉÓØ É ÐÒÏ×ÅÒÑÅԠţ,
+ÎÅ ×Ù×ÏÄÑ ÓÏÄÅÒÖÉÍÏÅ ÄÏËÕÍÅÎÔÁ. âÅÚ ÁÒÇÕÍÅÎÔÏ×, ÓÞÉÔÙ×ÁÅÔ ÐÏÄÐÉÓÁÎÎÙÅ
+ÄÁÎÎÙÅ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ. åÓÌÉ ÚÁÄÁΠÔÏÌØËÏ ÆÁÊÌ ÐÏÄÐÉÓÉ, ÔϠנΣÍ
+ÍÏÖÅÔ ÓÏÄÅÒÖÁÔØÓÑ ÌÉÂÏ ÐÏÌÎÏÓÔØÀ ÐÏÄÐÉÓÁÎÎÙÊ ÄÏËÕÍÅÎÔ, ÌÉÂÏ ÏÔÄÅÌ£ÎÎÁÑ
+ÐÏÄÐÉÓØ. ÷ ÐÏÓÌÅÄÎÅÍ ÓÌÕÞÁÅ ÐÏÄÐÉÓÁÎÎÙÊ ÄÏËÕÍÅÎÔ ÄÏÌÖÅΠÓÏÄÅÒÖÁÔØÓÑ ×
+ÆÁÊÌÅ ÂÅÚ ÒÁÓÛÉÒÅÎÉÑ ".sig" ÉÌÉ ".asc". åÓÌÉ ÕËÁÚÁÎÏ ÂÏÌÅÅ ÏÄÎÏÇÏ
+ÁÒÇÕÍÅÎÔÁ, ÔÏ ÐÅÒ×ÙÊ ÄÏÌÖÅΠÂÙÔØ ÏÔÄÅÌ£ÎÎÏÊ ÐÏÄÐÉÓØÀ, Á ÏÓÔÁÌØÎÙÅ ÄÏÌÖÎÙ
+ÓÏÄÅÒÖÁÔØ ÐÏÄÐÉÓÁÎÎÙÊ ÍÁÔÅÒÉÁÌ. äÌÑ ÓÞÉÔÙ×ÁÎÉÑ ÐÏÄÐÉÓÁÎÎÏÇÏ ÄÏËÕÍÅÎÔÁ ÓÏ
+ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ, ÉÓÐÏÌØÚÕÊÔÅ <literal>-</literal> × ËÁÞÅÓÔ×Å ÉÍÅÎÉ
+×ÔÏÒÏÇÏ ÆÁÊÌÁ. ðÏ ÐÒÉÞÉÎÁÍ ÂÅÚÏÐÁÓÎÏÓÔÉ, ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÏÔÄÅÌ£ÎÎÏÊ
+ÐÏÄÐÉÓÉ, ÐÏÄÐÉÓÁÎÎÙÊ ÍÁÔÅÒÉÁÌ ÎÅ ÍÏÖÅÔ ÓÞÉÔÙ×ÁÔØÓÑ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ
+ÂÅÚ Ñ×ÎÏÇÏ ÕËÁÚÁÎÉÑ ×ÙÛÅÏÚÎÁÞÅÎÎÙÍ ÏÂÒÁÚÏÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--multifile</term>
+<listitem><para>
+éÚÍÅÎÑÅÔ ÐÏ×ÅÄÅÎÉÅ ÎÅËÏÔÏÒÙÈ ÄÒÕÇÉÈ ËÏÍÁÎÄ ÔÁË, ÞÔÏÂÙ ÏÎÉ ÍÏÇÌÉ
+ÏÂÒÁÂÁÔÙ×ÁÔØ ÓÒÁÚÕ ÎÅÓËÏÌØËÏ ÆÁÊÌÏ×. éÍÅÎÁ ÆÁÊÌÏ× ÕËÁÚÙ×ÁÀÔÓÑ ×
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ÉÌÉ ÐÏÄÁÀÔÓÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ ÐÏ ÏÄÎÏÍÕ × ÓÔÒÏËÅ.
+üÔÏ ÐÏÚ×ÏÌÑÅÔ ÏÂÒÁÂÁÔÙ×ÁÔØ ÍÎÏÖÅÓÔ×Ï ÆÁÊÌÏ× ÏÄÎÏÊ ËÏÍÁÎÄÏÊ. ÷ ÎÁÓÔÏÑÝÅÅ
+×ÒÅÍÑ --multifile ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó --verify,
+--encrypt, É --decrypt.  úÁÍÅÔØÔÅ, ÞÔÏ "--multifile --verify" ÎÅÌØÚÑ
+ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÐÒÏ×ÅÒËÉ ÏÔÄÅÌ£ÎÎÙÈ ÐÏÄÐÉÓÅÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--verify-files <optional><parameter/files/</optional></term>
+<listitem><para>
+éÄÅÎÔÉÞÎÁ --multifile --verify.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--encrypt-files <optional><parameter/files/</optional></term>
+<listitem><para>
+éÄÅÎÔÉÞÎÁ --multifile --encrypt.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--decrypt-files <optional><parameter/files/</optional></term>
+<listitem><para>
+éÄÅÎÔÉÞÎÁ --multifile --decrypt.
+</para></listitem></varlistentry>
+
+<!--
+B<-k> [I<username>] [I<keyring>]
+    Kludge to be somewhat compatible with PGP.
+    Without arguments, all public keyrings are listed.
+    With one argument, only I<keyring> is listed.
+    Special combinations are also allowed, but they may
+    give strange results when combined with more options.
+    B<-kv>    Same as B<-k>
+    B<-kvv>   List the signatures with every key.
+    B<-kvvv>  Additionally check all signatures.
+    B<-kvc>   List fingerprints
+    B<-kvvc>  List fingerprints and signatures
+
+    B<This command may be removed in the future!>
+-->
+
+<varlistentry>
+<term>--list-keys &OptParmNames;</term>
+<term>--list-public-keys &OptParmNames;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ×ÓÅ ËÌÀÞÉ ÉÚ Ó×ÑÚËÉ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ, ÉÌÉ ÔÏÌØËÏ ÕËÁÚÁÎÎÙÅ ×
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ.
+</para><para>
+îÅ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ×Ù×ÏÄ ÄÁÎÎÏÊ ËÏÍÁÎÄÙ × ÓÃÅÎÁÒÉÑÈ É ÄÒÕÇÉÈ
+ÐÒÏÇÒÁÍÍÁÈ, Ô.Ë. ÆÏÒÍÁÔ ×Ù×ÏÄÁ ÍÏÖÅÔ ÍÅÎÑÔØÓÑ × ÒÁÚÎÙÈ ×ÅÒÓÉÑÈ GnuPG.
+äÌÑ ÍÁÛÉÎÎÏÊ ÏÂÒÁÂÏÔËÉ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ×Ù×ÏÄ ËÏÍÁÎÄÙ
+--with-colons.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-K, --list-secret-keys &OptParmNames;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ×ÓÅ ËÌÀÞÉ ÉÚ Ó×ÑÚËÉ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ, ÉÌÉ ÔÏÌØËÏ ÕËÁÚÁÎÎÙÅ ×
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. úÎÁË '#' ÐÏÓÌÅ ÓÉÍ×ÏÌÏ× sec ÏÚÎÁÞÁÅÔ, ÞÔÏ ÓÅËÒÅÔÎÙÊ
+ËÌÀÞ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ (ÎÁÐÒ., ÅÓÌÉ ÏΠÂÙÌ ÓÏÚÄÁΠËÏÍÁÎÄÏÊ
+--export-secret-subkeys).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--list-sigs &OptParmNames;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É  --list-keys, ÎÏ ÄÏÐÏÌÎÉÔÅÌØÎÏ ×Ù×ÏÄÉÔ ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ.
+</para><para>
+äÌÑ ËÁÖÄÏÊ ÐÏÄÐÉÓÉ ÍÏÖÅÔ ÂÙÔØ ÕËÁÚÁÎÏ ÎÅÓËÏÌØËÏ ÆÌÁÇÏ× ÍÅÖÄÕ ÔÜÇÏÍ "sig"
+É ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ. üÔÉ ÆÌÁÇÉ ÓÏÄÅÒÖÁÔ ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï
+ËÁÖÄÏÊ ÐÏÄÐÉÓÉ. ãÉÆÒÙ 1-3 ÕËÁÚÙ×ÁÀÔ ÎÁ ÕÒÏ×ÅÎØ ÐÒÏ×ÅÒËÉ ÓÅÒÔÉÆÉËÁÔÁ (ÓÍ.
+--ask-cert-level), "L" ÄÌÑ ÌÏËÁÌØÎÙÈ ÉÌÉ ÎÅÜËÓÐÏÒÔÉÒÕÅÍÙÈ ÐÏÄÐÉÓÅÊ (ÓÍ.
+--lsign-key), "R" ÄÌÑ ÎÅÏÔÚÙ×ÁÅÍÙÈ ÐÏÄÐÉÓÅÊ (ÓÍ.  nrsign × ÏÐÉÓÁÎÉÉ
+--edit-key), "P" ÄÌÑ ÐÏÄÐÉÓÅÊ ÓÏÄÅÒÖÁÝÉÈ URL ÐÏÌÉÔÉËÉ ÐÏÄÐÉÓÉ (ÓÍ.
+--cert-policy-url), "N" ÄÌÑ ÐÏÄÐÉÓÅÊ ÓÏÄÅÒÖÁÝÉÈ ÐÒÉÍÅÞÁÎÉÅ (ÓÍ.
+--cert-notation), "X" ÄÌÑ ÐÏÄÐÉÓÅÊ ÓÒÏË ÄÅÊÓÔ×ÉÑ ËÏÔÏÒÙÈ ÉÓÔ£Ë.  (ÓÍ.
+--ask-cert-expire), ÃÉÆÒÙ 1-9 ÉÌÉ "T" ÄÌÑ 10 É ÂÏÌÅÅ, ÞÔÏÂÙ ÕËÁÚÁÔØ
+ÕÒÏ×ÅÎØ ÄÏ×ÅÒÑÀÝÅÊ ÐÏÄÐÉÓÉ (ÓÍ. tsign × ÏÐÉÓÁÎÉÉ ËÏÍÁÎÄÙ --edit-key).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--check-sigs &OptParmNames;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --list-sigs, ÎÏ ÐÏÄÐÉÓÉ ÐÒÏ×ÅÒÑÀÔÓÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--fingerprint &OptParmNames;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ×ÓÅ ËÌÀÞÉ É ÉÈ ÏÔÐÅÞÁÔËÉ. üÔÏ ÔÏÔ ÖÅ ×Ù×ÏÄ, ÞÔÏ É Õ --list-keys,
+ÎÏ ÄÌÑ ËÁÖÄÏÇÏ ËÌÀÞÁ ÄÏÂÁ×ÌÑÅÔÓÑ ÓÔÒÏËÁ, ÓÏÄÅÒÖÁÝÁÑ ÅÇÏ ÏÔÐÅÞÁÔÏË. íÏÖÅÔ
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÓÏ×ÍÅÓÔÎÏ Ó --list-sigs ÉÌÉ --check-sigs. åÓÌÉ ËÏÍÁÎÄÁ
+ÚÁÄÁÎÁ Ä×ÁÖÄÙ, ÔÏ ×Ù×ÏÄÑÔÓÑ ÏÔÐÅÞÁÔËÉ É ÄÌÑ ÐÏÄÞÉΣÎÎÙÈ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--list-packets</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÁËÅÔÏ×. éÓÐÏÌØÚÕÅÔÓÑ, × ÏÓÎÏ×ÎÏÍ, ÄÌÑ ÏÔÌÁÄËÉ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--gen-key</term>
+<listitem><para>
+çÅÎÅÒÉÒÕÅÔ ÎÏ×ÕÀ ÐÁÒÕ ËÌÀÞÅÊ. äÁÎÎÁÑ ËÏÍÁÎÄÁ, ËÁË ÐÒÁ×ÉÌÏ, ÉÓÐÏÌØÚÕÅÔÓÑ
+ÔÏÌØËÏ ÉÎÔÅÒÁËÔÉ×ÎÏ.
+</para>
+<para>
+éÍÅÅÔÓÑ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÁÑ ×ÏÚÍÏÖÎÏÓÔØ, ÐÏÚ×ÏÌÑÀÝÁÑ ÇÅÎÅÒÉÒÏ×ÁÔØ ËÌÀÞÉ ×
+ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ. ðÏÄÒÏÂÎÏÓÔÉ × ÆÁÊÌÅ <filename>doc/DETAILS</filename>
+× ÉÓÈÏÄÎÏÍ ÄÉÓÔÒÉÂÕÔÉ×Å.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--edit-key &ParmName;</term>
+<listitem><para>
+ðÒÅÄÏÓÔÁ×ÌÑÅÔ ÍÅÎÀ, ÐÏÚ×ÏÌÑÀÝÅÅ ×ÙÐÏÌÎÑÔØ ×ÓÅ ÚÁÄÁÞÉ ÐÏ ÕÐÒÁ×ÌÅÎÉÀ
+ËÌÀÞÁÍÉ:</para>
+    <variablelist>
+
+    <varlistentry>
+    <term>sign</term>
+    <listitem><para>
+
+ðÏÄÐÉÓÁÔØ ËÌÀÞ ÐÏÌØÚÏ×ÁÔÅÌÑ &ParmName;. åÓÌÉ ËÌÀÞ ÎÅ ÂÙÌ ÅÝ£ ÐÏÄÐÉÓÁÎ
+ËÌÀÞÏÍ ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÏ ÕÍÏÌÞÁÎÉÀ ( ÉÌÉ ÐÏÌØÚÏ×ÁÔÅÌÑ ÚÁÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÏÍ
+-u), ÔÏ ÐÒÏÇÒÁÍÍÁ ×Ù×ÏÄÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ËÌÀÞÅ, ×ÍÅÓÔÅ Ó ÏÔÐÅÞÁÔËÏÍ É
+ÚÁÐÒÁÛÉ×ÁÅÔ ÐÏÄÔ×ÅÒÖÄÅÎÉÅ ÎÁ ÐÏÄÐÉÓØ ËÌÀÞÁ. ðÏÄÔ×ÅÒÖÄÅÎÉÅ ÚÁÐÒÁÛÉ×ÁÅÔÓÑ
+ÄÌÑ ËÁÖÄÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÚÁÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÏÍ -u.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>lsign</term>
+    <listitem><para>
+ôÏ ÖÅ, ÞÔÏ É  "sign", ÎÏ ÐÏÄÐÉÓØ ÐÏÍÅÞÁÅÔÓÑ ËÁË ÎÅÜËÓÐÏÒÔÉÒÕÅÍÁÑ É
+ÎÉËÏÇÄÁ ÎÅ ÐÅÒÅÄÁ£ÔÓÑ ÄÒÕÇÉÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ, ÞÔÏÂÙ
+ÓÄÅÌÁÔØ ËÌÀÞÉ ÄÅÊÓÔ×ÉÔÅÌØÎÙÍÉ ÔÏÌØËÏ × ÌÏËÁÌØÎÏÍ ÏËÒÕÖÅÎÉÉ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>nrsign</term>
+    <listitem><para>
+ôÏ ÖÅ, ÞÔÏ É "sign", ÎÏ ÐÏÄÐÉÓØ ÐÏÍÅÞÁÅÔÓÑ ËÁË ÎÅÏÔÚÙ×ÁÅÍÁÑ. ôÁËÕÀ
+ÐÏÄÐÉÓØ ÎÅ×ÏÚÍÏÖÎÏ ÂÕÄÅÔ ÏÔÏÚ×ÁÔØ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>nrlsign</term>
+    <listitem><para>
+ïÂßÅÄÉÎÑÅÔ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ nrsign É lsign, ÓÏÚÄÁ×ÁÑ ÎÅÏÔÚÙ×ÁÅÍÙÅ É
+ÎÅÜËÓÐÏÒÔÉÒÕÅÍÙÅ ÐÏÄÐÉÓÉ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>tsign</term>
+    <listitem><para>
+óÏÚÄÁÔØ ÄÏ×ÅÒÑÀÝÕÀ ÐÏÄÐÉÓØ. üÔÁ ÐÏÄÐÉÓØ ÏÂßÅÄÉÎÑÅÔ ÚÎÁÞÅÎÉÅ ÓÅÒÔÉÆÉËÁÃÉÉ
+(ËÁË É ÏÂÙÞÎÁÑ ÐÏÄÐÉÓØ) É ÕÓÔÁÎÏ×ËÉ ÄÏ×ÅÒÉÑ (ËÁË ËÏÍÁÎÄÁ "trust").
+ëÏÍÁÎÄÁ, × ÏÂÝÅÍ ÓÌÕÞÁÅ, ÐÒÉÍÅÎÉÍÁ × ÏÂÏÓÏÂÌÅÎÎÙÈ ÓÏÏÂÝÅÓÔ×ÁÈ É ÇÒÕÐÐÁÈ.
+</para></listitem></varlistentry>
+</variablelist>
+
+<para>
+úÁÍÅÔØÔÅ, ÞÔÏ "l" (ÄÌÑ ÌÏËÁÌØÎÙÈ / ÎÅÜËÓÐÏÒÔÉÒÕÅÍÙÈ), "nr" (ÄÌÑ
+ÎÅÏÔÚÙ×ÁÅÍÙÈ) É "t" (ÄÌÑ ÄÏ×ÅÒÑÀÝÉÈ) ÍÏÇÕÔ Ó×ÏÂÏÄÎÏ ÏÂßÅÄÉÎÑÔØÓÑ É
+ÕËÁÚÙ×ÁÔØÓÑ ÐÅÒÅÄ "sign" ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÐÏÄÐÉÓÅÊ ÌÀÂÏÇÏ ÖÅÌÁÅÍÏÇÏ ÔÉÐÁ.
+</para>
+
+<variablelist>
+    <varlistentry>
+    <term>revsig</term>
+    <listitem><para>
+ïÔÏÚ×ÁÔØ ÐÏÄÐÉÓØ. GnuPG ÚÁÐÒÁÛÉ×ÁÅÔ ÐÏÄÔ×ÅÒÖÄÅÎÉÅ ÇÅÎÅÒÁÃÉÉ ÏÔÚÙ×ÁÀÝÅÇÏ
+ÓÅÒÔÉÆÉËÁÔÁ ÄÌÑ ËÁÖÄÏÊ ÐÏÄÐÉÓÉ,
+ËÏÔÏÒÁÑ ÂÙÌÁ ÓÄÅÌÁÎÁ ÏÄÎÉÍ ÉÚ ÄÏÓÔÕÐÎÙÈ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>trust</term>
+    <listitem><para>
+éÚÍÅÎÉÔØ ÕÒÏ×ÅÎØ ÄÏ×ÅÒÉÑ ×ÌÁÄÅÌØÃÕ ËÌÀÞÁ. ïÂÎÏ×ÌÑÅÔ ÂÁÚÕ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ
+ÎÅÍÅÄÌÅÎÎÏ, ÎÅ ÔÒÅÂÕÑ ÓÏÈÒÁÎÅÎÉÑ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>disable</term>
+    <term>enable</term>
+    <listitem><para>
+ðÏÍÅÔÉÔØ ËÌÀÞ ËÁË ÎÅÉÓÐÏÌØÚÕÅÍÙÊ (disable) ÉÌÉ ÓÎÑÔØ ÐÏÍÅÔËÕ (enable).
+ëÌÀÞ ÐÏÍÅÞÅÎÎÙÊ ËÁË ÎÅÉÓÐÏÌØÚÕÅÍÙÊ ÎÅ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ
+ÛÉÆÒÏ×ÁÎÉÑ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>adduid</term>
+    <listitem><para>
+óÏÚÄÁÔØ ÁÌØÔÅÒÎÁÔÉ×ÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>addphoto</term>
+    <listitem><para>
+äÏÂÁ×ÉÔØ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+ëÏÍÁÎÄÁ ÚÁÐÒÁÛ×ÁÅÔ ÆÁÊÌ × ÆÏÒÍÁÔÅ JPEG, ËÏÔÏÒÙÊ ÄÏÂÁ×ÌÑÅÔÓÑ ×
+ËÁÞÅÓÔ×Å ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ. úÁÍÅÔØÔÅ, ÞÔÏ ÄÏÂÁ×ÌÅÎÉÅ
+ÉÚÏÂÒÁÖÅÎÉÑ ÐÒÉ×ÏÄÉÔ Ë Õ×ÅÌÉÞÅÎÉÀ ÒÁÚÍÅÒÁ ËÌÀÞÁ. úÁÍÅÔØÔÅ, ÔÁËÖÅ, ÞÔÏ
+ÎÅËÏÔÏÒÙÅ ÐÒÏÇÒÁÍÍÙ ÂÕÄÕÔ ×Ù×ÏÄÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ ÂÅÚ ÉÚÍÅÎÅÎÉÊ (GnuPG),
+Á ÎÅËÏÔÏÒÙÅ ÂÕÄÕÔ ÅÇÏ ÍÁÓÛÔÁÂÉÒÏ×ÁÔØ (PGP).
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>deluid</term>
+    <listitem><para>
+õÄÁÌÉÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>delsig</term>
+    <listitem><para>
+õÄÁÌÉÔØ ÐÏÄÐÉÓØ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>revuid</term>
+    <listitem><para>
+ïÔÏÚ×ÁÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>addkey</term>
+    <listitem><para>
+äÏÂÁ×ÉÔØ ÐÏÄËÌÀÞ Ë ÔÅËÕÝÅÍÕ ËÌÀÞÕ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>addcardkey</term>
+    <listitem><para>
+óÇÅÎÅÒÉÒÏ×ÁÔØ ËÌÀÞ ÎÁ ËÁÒÔÅ É ÄÏÂÁ×ÉÔØ ÅÇÏ Ë ÄÁÎÎÏÍÕ ËÌÀÞÕ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>keytocard</term>
+    <listitem><para>
+ðÅÒÅÍÅÓÔÉÔØ ×ÙÂÒÁÎÎÙÊ ÓÅËÒÅÔÎÙÊ ËÌÀÞ (ÉÌÉ ÐÅÒ×ÉÞÎÙÊ ËÌÀÞ, ÅÓÌÉ ÎÉ ÏÄÉΠ
+ËÌÀÞ ÎÅ ×ÙÂÒÁÎ) ÎÁ ÓÍÁÒÔËÁÒÔÕ. óÅËÒÅÔÎÙÊ ËÌÀÞ × Ó×ÑÚËÅ ËÌÀÞÅÊ ÂÕÄÅÔ
+ÚÁÍÅΣΠÚÁÇÌÕÛËÏÊ × ÓÌÕÞÁÅ ÕÓÐÅÛÎÏÇÏ ÅÇÏ ÓÏÈÒÁÎÅÎÉÑ ÎÁ ËÁÒÔÅ, É ÅÓÌÉ ÷Ù
+ÐÏÚÖÅ ÉÓÐÏÌØÚÕÅÔÅ ËÏÍÁÎÄÕ save. ôÏÌØËÏ ËÌÀÞÉ ÏÐÒÅÄÅÌ£ÎÎÙÈ ÔÉÐÏ× ÍÏÇÕÔ
+ÂÙÔØ ÐÅÒÅÍÅÝÅÎÙ ÎÁ ËÁÒÔÕ. ðÏÄÍÅÎÀ ÐÏÚ×ÏÌÉÔ ÷ÁÍ ×ÙÂÒÁÔØ ËÁÒÔÕ ÎÁ ËÏÔÏÒÕÀ
+÷Ù ÈÏÔÉÔÅ ÓÏÈÒÁÎÉÔØ ËÌÀÞ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÏÌÕÞÉÔØ ËÌÀÞ Ó ËÁÒÔÙ ÏÂÒÁÔÎÏ
+ÎÅ×ÏÚÍÏÖÎÏ - ÅÓÌÉ ËÁÒÔÁ ÂÕÄÅÔ ÐÏÔÅÒÑÎÁ ÉÌÉ ÐÏ×ÒÅÖÄÅÎÁ, ÔÏ ÷ÁÛ ÓÅËÒÅÔÎÙÊ
+ËÌÀÞ ÂÕÄÅÔ ÕÔÒÁÞÅÎ, ÅÓÌÉ ÏÔÓÕÔÓÔ×ÕÅÔ ÒÅÚÅÒ×ÎÁÑ ËÏÐÉÑ.
+</para></listitem></varlistentry>
+  <varlistentry>
+    <term>delkey</term>
+    <listitem><para>
+õÄÁÌÉÔØ ÐÏÄËÌÀÞ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>addrevoker <optional>sensitive</optional></term>
+    <listitem><para>
+äÏÂÁ×ÉÔØ ÎÁÚÎÁÞÅÎÎÏÇÏ ÄÌÑ ÏÔÚÙ×Á. éÍÅÅÔ ÏÄÉΠÎÅÏÂÑÚÁÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ:
+"sensitive".  åÓÌÉ ÎÁÚÎÁÞÅÎÎÙÊ ÄÌÑ ÏÔÚÙ×Á ÐÏÍÅÞÅΠËÁË sensitive, ÔÏ ÏÎ
+ÎÅ ÂÕÄÅÔ ÜËÓÐÏÒÔÉÒÏ×ÁÔØÓÑ ÐÏ ÕÍÏÌÞÁÎÉÀ (ÓÍ. export-options).
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>revkey</term>
+    <listitem><para>
+ïÔÏÚ×ÁÔØ ÐÏÄËÌÀÞ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>expire</term>
+    <listitem><para>
+éÚÍÅÎÉÔØ ÓÒÏË ÄÅÊÓÔ×ÉÑ ËÌÀÞÁ. åÓÌÉ ÉÍÅÅÔÓÑ ×ÙÂÒÁÎÎÙÊ ÐÏÄËÌÀÞ, ÔÏ ÉÚÍÅÎÑÅÔÓÑ
+ÓÒÏË ÄÅÊÓÔ×ÉÑ ÜÔÏÇÏ ÐÏÄËÌÀÞÁ. åÓÌÉ ÎÉ ÏÄÉΠÐÏÄËÌÀÞ ÎÅ ×ÙÂÒÁÎ, ÔÏ ÉÚÍÅÎÑÅÔÓÑ
+ÓÒÏË ÄÅÊÓÔ×ÉÑ ÐÅÒ×ÉÞÎÏÇÏ ËÌÀÞÁ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>passwd</term>
+    <listitem><para>
+éÚÍÅÎÉÔØ ÐÁÒÏÌØ, ËÏÔÏÒÙÍ ÚÁÝÉݣΠÓÅËÒÅÔÎÙÊ ËÌÀÞ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>primary</term>
+    <listitem><para>
+ðÏÍÅÔÉÔØ ÔÅËÕÝÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ, ËÁË ÐÅÒ×ÉÞÎÙÊ. åÓÌÉ ÐÅÒ×ÉÞÎÙÍ
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÔÏ ÏΠ
+ÓÔÁÎÏ×ÉÔÓÑ ÐÅÒ×ÉÞÎÙÍ ÐÏ ÏÔÎÏÛÅÎÉÀ Ë ÏÓÔÁÌØÎÙÍ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÍ
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍ. åÓÌÉ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÒÅÇÕÌÑÒÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ, ÔÏ ÏÎ
+ÓÔÁÎÏ×ÉÔÓÑ ÐÅÒ×ÉÞÎÙÍ ÐÏ ÏÔÎÏÛÅÎÉÀ Ë ÏÓÔÁÌØÎÙÍ ÒÅÇÕÌÑÒÎÙÍ
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>uid &ParmN;</term>
+    <listitem><para>
+õÓÔÁÎÏ×ÉÔØ/ÓÎÑÔØ ×ÙÂÏÒ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ Ó ÎÏÍÅÒÏÍ &ParmN;.
+úÎÁÞÅÎÉÅ 0 ÏÔÍÅÎÑÅÔ ×ÙÂÏÒ ×ÓÅÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ×.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>key &ParmN;</term>
+    <listitem><para>
+õÓÔÁÎÏ×ÉÔØ/ÓÎÑÔØ ×ÙÂÏÒ ËÌÀÞÁ Ó ÎÏÍÅÒÏÍ &ParmN;.
+úÎÁÞÅÎÉÅ 0 ÏÔÍÅÎÑÅÔ ×ÙÂÏÒ ×ÓÅÈ ËÌÀÞÅÊ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>check</term>
+    <listitem><para>
+ðÒÏ×ÅÒÉÔØ ×ÙÂÒÁÎÎÙÅ (×ÓÅ, ÅÓÌÉ ÎÉ ÏÄÉΠÎÅ ×ÙÂÒÁÎ) ÉÄÅÎÔÉÆÉËÁÔÏÒÙ 
+ÐÏÌØÚÏ×ÁÔÅÌÑ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>showphoto</term>
+    <listitem><para>
+ïÔÏÂÒÁÚÉÔØ ×ÙÂÒÁÎÎÙÊ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>pref</term>
+    <listitem><para>
+÷Ù×ÅÓÔÉ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ×ÙÂÒÁÎÎÏÇÏ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+ðÏËÁÚÙ×ÁÅÔ ÄÅÊÓÔ×ÉÔÅÌØÎÙÊ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ, ÎÅ ×ËÌÀÞÁÑ ËÁËÉÅ-ÌÉÂÏ
+ÐÏÄÒÁÚÕÍÅ×ÁÅÍÙÅ ÐÒÅÄÐÏÞÔÅÎÉÑ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>showpref</term>
+    <listitem><para>
+÷Ù×ÅÓÔÉ ÂÏÌÅÅ ÐÏÄÒÏÂÎÙÊ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ×ÙÂÒÁÎÎÏÇÏ
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÎÅÖÅÌÉ pref. ðÏËÁÚÙ×ÁÅÔ ÄÅÊÓÔ×ÕÀÝÉÅ
+ÐÒÅÄÐÏÞÔÅÎÉÑ, ×ËÌÀÞÁÑ ÐÏÄÒÁÚÕÍÅ×ÁÅÍÙÅ 3DES (ÄÌÑ ÛÉÆÒÏ×ÁÎÉÑ), SHA-1
+(ÈÜÛ-ÆÕÎËÃÉÑ) É Uncompressed (ÓÖÁÔÉÅ), ÅÓÌÉ ÏÎÉ ÎÅ ÄÏÂÁ×ÌÅÎÙ × ÓÐÉÓÏË
+ÐÒÅÄÐÏÞÔÅÎÉÊ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>setpref &ParmString;</term>
+    <listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ ×
+&ParmString;. &ParmString; ÄÏÌÖÎÁ ÂÙÔØ ÓÔÒÏËÏÊ ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ
+×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ "pref". éÓÐÏÌØÚÕÑ ÐÕÓÔÕÀ ÓÔÒÏËÕ ÍÏÖÎÏ ÓÂÒÏÓÉÔØ ÓÐÉÓÏË
+ÐÒÅÄÐÏÞÔÅÎÉÊ Ë ÕÓÔÁÎÏ×ËÁÍ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÉÓÐÏÌØÚÕÑ ÚÎÁÞÅÎÉÅ "none" ÍÏÖÎÏ
+ÏÂÎÕÌÉÔØ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ. äÌÑ ÐÏÌÕÞÅÎÉÑ ÓÐÉÓËÁ ÄÏÓÔÕÐÎÙÈ ÁÌÇÏÒÉÔÍÏ×
+ÍÏÖÎÏ ×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ËÏÍÁÎÄÏÊ "gpg --version". äÁÎÎÁÑ ËÏÍÁÎÄÁ ÔÏÌØËÏ 
+ÉÎÉÃÉÁÌÉÚÉÒÕÅÔ ×ÎÕÔÒÅÎÎÉÊ ÓÐÉÓÏË É ÎÉÞÅÇÏ ÎÅ ÉÚÍÅÎÑÅÔ, ÐÏËÁ ÎÅ ÂÕÄÅÔ 
+×ÙÐÏÌÎÅÎÁ ÄÒÕÇÁÑ ËÏÍÁÎÄÁ (ÔÁËÁÑ, ËÁË updpref) , ËÏÔÏÒÁÑ ÉÚÍÅÎÑÅÔ ÓÁÍÏÐÏÄÐÉÓÉ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>updpref</term>
+    <listitem><para>
+éÚÍÅÎÑÅÔ ÓÐÉÓÏË ÐÒÅÄÐÏÞÔÅÎÉÊ ÄÌÑ ×ÓÅÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ (ÉÌÉ
+ÔÏÌØËÏ ÄÌÑ ×ÙÂÒÁÎÎÙÈ) × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÔÅËÕÝÉÍ ÓÐÉÓËÏÍ ÐÒÅÄÐÏÞÔÅÎÉÊ.
+íÅÔËÁ ×ÒÅÍÅÎÉ ÄÌÑ ×ÓÅÈ ÚÁÔÒÏÎÕÔÙÈ ÉÚÍÅÎÅÎÉÅÍ ÓÁÍÏÐÏÄÐÉÓÅÊ Õ×ÅÌÉÞÉ×ÁÅÔÓÑ
+ÎÁ ÏÄÎÕ ÓÅËÕÎÄÕ. úÁÍÅÔØÔÅ, ÞÔÏ ÈÏÔÑ ÷Ù ÍÏÖÅÔÅ ÉÚÍÅÎÉÔØ ÐÒÅÄÐÏÞÔÅÎÉÑ ÄÌÑ
+ÁÔÒÉÂÕÔÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ (ÔÁËÉÈ ËÁË ÆÏÔÏÇÒÁÆÉÞÅÓËÉÊ
+ÉÄÅÎÔÉÆÉËÁÔÏÒ), GnuPG ÎÅ ÐÏÚ×ÏÌÑÅÔ ×ÙÂÉÒÁÔØ ËÌÀÞÉ ÐÏ ÁÔÒÉÂÕÔÎÙÍ
+ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍ, É, ÓÌÅÄÏ×ÁÔÅÌØÎÏ, ÜÔÉ ÐÒÅÄÐÏÞÔÅÎÉÑ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÎÅ
+ÂÕÄÕÔ.
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>keyserver</term>
+    <listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÓÅÒ×ÅÒ ËÌÀÞÅÊ ÄÌÑ ÚÁÄÁÎÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ×
+ÐÏÌØÚÏ×ÁÔÅÌÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÓÏÏÂÝÉÔØ ÄÒÕÇÉÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ ÇÄÅ ÷Ù
+ÐÒÅÄÐÏÞÉÔÁÅÔÅ, ÞÔÏÂÙ ÏÎÉ ÂÒÁÌÉ ÷ÁÛ ËÌÀÞ (ÓÍ. ÐÏÄÒÏÂÎÏÓÔÉ × ÏÐÉÓÁÎÉÉ
+--keyserver-option honor-keyserver-url). úÁÍÅÔØÔÅ, ÞÔÏ ÎÅËÏÔÏÒÙÅ
+×ÅÒÓÉÉ PGP ×ÏÓÐÒÉÎÉÍÁÀÔ ÎÁÌÉÞÉÅ URL ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ËÁË ÕËÁÚÁÎÉÅ Ë
+ÉÓÐÏÌØÚÏ×ÁÎÉÀ PGP/MIME ÐÒÉ ÏÔÐÒÁ×ËÅ ÐÏÞÔÙ. äÌÑ ÕÄÁÌÅÎÉÑ ÓÕÝÅÓÔ×ÕÀÝÅÊ 
+ÚÁÐÉÓÉ Ï ÐÒÅÄÐÏÞÉÔÁÅÍÏÍ ÓÅÒ×ÅÒÅ ÉÓÐÏÌØÚÕÊÔÅ ÚÎÁÞÅÎÉÅ "none".
+</para></listitem></varlistentry>
+    <varlistentry>
+    <term>toggle</term>
+    <listitem><para>
+ðÅÒÅËÌÀÞÅÎÉÅ ÍÅÖÄÕ ÏÔËÒÙÔÙÍ É ÓÅËÒÅÔÎÙÍ ËÌÀÞÁÍÉ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>save</term>
+    <listitem><para>
+óÏÈÒÁÎÉÔ ×ÓÅ ÉÚÍÅÎÅÎÉÑ × ÎÁÂÏÒÅ ËÌÀÞÅÊ É ×ÙÊÔÉ.</para></listitem></varlistentry>
+    <varlistentry>
+    <term>quit</term>
+    <listitem><para>
+÷ÙÊÔÉ ÉÚ ÐÒÏÇÒÁÍÍÙ ÎÅ ÓÏÈÒÁÎÑÑ ÉÚÍÅÎÅÎÉÑ × ÎÁÂÏÒÅ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+    </variablelist>
+    <para>
+ìÉÓÔÉÎÇ ÐÏËÁÚÙ×ÁÅÔ ÷ÁÍ ËÌÀÞ Ó ÅÇÏ ÐÏÄËÌÀÞÁÍÉ É ×ÓÅÍÉ ÉÄÅÎÔÉÆÉËÁÔÏÒÁÍÉ
+ÐÏÌØÚÏ×ÁÔÅÌÑ. ÷ÙÂÒÁÎÎÙÅ ËÌÀÞÉ ÉÌÉ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ ÕËÁÚÁÎÙ
+Ú×£ÚÄÏÞËÏÊ. úÎÁÞÅÎÉÅ ÄÏ×ÅÒÉÑ ×Ù×ÏÄÉÔÓÑ ÒÑÄÏÍ Ó ÐÅÒ×ÉÞÎÙÍ ËÌÀÞÏÍ: ÐÅÒ×ÙÊ
+ÓÉÍ×ÏÌ ÏÂÏÚÎÁÞÁÅÔ ÕÒÏ×ÅÎØ ÄÏ×ÅÒÉÑ, ÐÒÉÓ×ÏÅÎÎÙÊ ×ÌÁÄÅÌØÃÕ ËÌÀÞÁ, Á ×ÔÏÒÏÊ
+×ÙÞÉÓÌÅÎÎÏÅ ÚÎÁÞÅÎÉÅ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ ËÌÀÞÁ. óÉÍ×ÏÌÙ ÉÍÅÀÔ ÓÌÅÄÕÀÝÅÅ
+ÚÎÁÞÅÎÉÅ:</para>
+    <variablelist>
+      <varlistentry><term>-</term><listitem><para>ÄÏ×ÅÒÉÅ ÎÅ ÐÒÉÓ×ÏÅÎÏ / ÄÏÓÔÏ×ÅÒÎÏÓÔØ ÎÅ ×ÙÞÉÓÌÅÎÁ.</para></listitem></varlistentry>
+      <varlistentry><term>e</term><listitem><para>÷ÙÞÉÓÌÅÎÉÅ
+      ÄÏÓÔÏ×ÅÒÎÏÓÔÉ ÚÁ×ÅÒÛÉÌÏÓØ Ó ÏÛÉÂËÏÊ; ×ÏÚÍÏÖÎÏ ÉÚ-ÚÁ ÐÒÏÓÒÏÞÅÎÎÏÇÏ
+      ËÌÀÞÁ.</para></listitem></varlistentry>
+      <varlistentry><term>q</term><listitem><para>îÅ ÄÏÓÔÁÔÏÞÎÏ ÉÎÆÏÒÍÁÃÉÉ ÄÌÑ ×ÙÞÉÓÌÅÎÉÑ.</para></listitem></varlistentry>
+      <varlistentry><term>n</term><listitem><para>îÅÔ ÄÏ×ÅÒÉÑ ×ÌÁÄÅÌØÃÕ ËÌÀÞÁ.</para></listitem></varlistentry>
+      <varlistentry><term>m</term><listitem><para>ïÇÒÁÎÉÞÅÎÎÙÊ ÕÒÏ×ÅÎØ ÄÏ×ÅÒÉÑ/ÄÏÓÔÏ×ÅÒÎÏÓÔÉ.</para></listitem></varlistentry>
+      <varlistentry><term>f</term><listitem><para>ðÏÌÎÏÅ ÄÏ×ÅÒÉÅ/ÄÏÓÔÏ×ÅÒÎÏÓÔØ.</para></listitem></varlistentry>
+      <varlistentry><term>u</term><listitem><para>âÅÚÏÇÏ×ÏÒÏÞÎÏÅ ÄÏ×ÅÒÉÅ/ÄÏÓÔÏ×ÅÒÎÏÓÔØ.</para></listitem></varlistentry>
+    </variablelist>
+</listitem></varlistentry>
+
+<varlistentry>
+<term>--sign-key &ParmName;</term>
+<listitem><para>
+ðÏÄÐÉÓÁÔØ ÏÔËÒÙÔÙÊ ËÌÀÞ ÷ÁÛÉÍ ÓÅËÒÅÔÎÙÍ ËÌÀÞÏÍ. ôÏ ÖÅ, ÞÔÏ É ÐÏÄËÏÍÁÎÄÁ
+"sign" ËÏÍÁÎÄÙ --edit-key.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--lsign-key &ParmName;</term>
+<listitem><para>
+ðÏÄÐÉÓÁÔØ ÏÔËÒÙÔÙÊ ËÌÀÞ ÷ÁÛÉÍ ÓÅËÒÅÔÎÙÍ ËÌÀÞÏÍ ÌÏËÁÌØÎÏ. 
+ôÏ ÖÅ, ÞÔÏ É ÐÏÄËÏÍÁÎÄÁ
+"lsign" ËÏÍÁÎÄÙ --edit-key.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--delete-key &ParmName;</term>
+<listitem><para>
+õÄÁÌÉÔØ ËÌÀÞ ÉÚ ÎÁÂÏÒÁ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. ÷ ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ ÔÒÅÂÕÅÔÓÑ ÌÉÂÏ
+ÉÓÐÏÌØÚÏ×ÁÔØ --yes, ÌÉÂÏ ÚÁÄÁ×ÁÔØ ËÌÀÞ ÅÇÏ ÏÔÐÅÞÁÔËÏÍ. üÔÏ ÚÁÝÉÔÁ ÐÒÏÔÉ×
+ÓÌÕÞÁÊÎÏÇÏ ÕÄÁÌÅÎÉÑ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--delete-secret-key &ParmName;</term>
+<listitem><para>
+õÄÁÌÉÔØ ËÌÀÞ ÉÚ ÎÁÂÏÒÏ× ÓÅËÒÅÔÎÙÈ É ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. ÷ ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ
+ËÌÀÞ ÄÏÌÖÅΠÂÙÔØ ÚÁÄÁΠÏÔÐÅÞÁÔËÏÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--delete-secret-and-public-key &ParmName;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --delete-key, ÎÏ ÅÓÌÉ ÓÕÝÅÓÔ×ÕÅÔ ÓÅËÒÅÔÎÙÊ ËÌÀÞ, 
+ÔÏ ÓÎÁÞÁÌÁ ÂÕÄÅÔ ÕÄẠ́ΠÏÎ. ÷ ÐÁËÅÔÎÏÍ ÒÅÖÉÍÅ ËÌÀÞ ÄÏÌÖÅΠÂÙÔØ ÚÁÄÁÎ
+ÏÔÐÅÞÁÔËÏÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--gen-revoke &ParmName;</term>
+<listitem><para>
+çÅÎÅÒÉÒÏ×ÁÔØ ÏÔÚÙ×ÁÀÝÉÊ ÓÅÒÔÉÆÉËÁÔ ÄÌÑ ×ÓÅÇÏ ËÌÀÞÁ. äÌÑ ÏÔÚÙ×Á ÐÏÄËÌÀÞÁ
+ÉÌÉ ÐÏÄÐÉÓÉ ÉÓÐÏÌØÚÕÊÔÅ ËÏÍÁÎÄÕ --edit-key.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--desig-revoke &ParmName;</term>
+<listitem><para>
+çÅÎÅÒÉÒÏ×ÁÔØ ÎÁÚÎÁÞÅÎÎÙÊ ÓÅÒÔÉÆÉËÁÔ ÏÔÚÙ×Á ÄÌÑ ËÌÀÞÁ. üÔÏ ÐÏÚ×ÏÌÑÅÔ
+ÐÏÌØÚÏ×ÁÔÅÌÀ (Ó ÒÁÚÒÅÛÅÎÉÑ ×ÌÁÄÅÌØÃÁ ËÌÀÞÁ) ÏÔÏÚ×ÁÔØ ÞÅÊ-ÌÉÂÏ ËÌÀÞ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--export &OptParmNames;</term>
+<listitem><para>
+ìÉÂÏ ÜËÓÐÏÒÔÉÒÏ×ÁÔØ ×ÓÅ ËÌÀÞÉ ÉÚ ×ÓÅÈ ÎÁÂÏÒÏ× ËÌÀÞÅÊ (ÎÁÂÏÒÏ× ÐÏ
+ÕÍÏÌÞÁÎÉÀ É ÔÅÈ ËÏÔÏÒÙÅ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÎÙ ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÁ
+--keyring), ÉÌÉ, ÅÓÌÉ ÚÁÄÁÎÏ ÈÏÔÑ ÂÙ ÏÄÎÏ ÉÍÑ, ÔÅ ËÌÀÞÉ ÉÍÅÎÁ ËÏÔÏÒÙÈ
+ÚÁÄÁÎÙ × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ. ðÏÌÕÞÅÎÎÙÊ × ÒÅÚÕÌØÔÁÔÅ ÎÁÂÏÒ ËÌÀÞÅÊ
+×Ù×ÏÄÉÔÓÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ ÉÌÉ × ÆÁÊÌ ÚÁÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒÏÍ "output".
+åÓÌÉ ÷Ù ÎÁÍÅÒÅÎÙ ÏÔÐÒÁ×ÉÔØ ËÌÀÞÉ ÐÏ ÐÏÞÔÅ, ÔÏ ÉÓÐÏÌØÚÕÊÔÅ ÓÏ×ÍÅÓÔÎÏ Ó
+ÐÁÒÁÍÅÔÒÏÍ --armor.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--send-keys &OptParmNames;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --export ÎÏ ÐÏÓÙÌÁÅÔ ËÌÀÞÉ ÎÁ ÓÅÒ×ÅÒ ËÌÀÞÅÊ.
+äÌÑ ÚÁÄÁÎÉÑ ÉÍÅÎÉ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒ
+--keyserver. îÅ ÏÔÐÒÁ×ÌÑÊÔÅ ÎÁ ÓÅÒ×ÅÒ Ó×ÏÊ ÎÁÂÏÒ ËÌÀÞÅÊ ÐÏÌÎÏÓÔØÀ -
+×ÙÂÅÒÉÔÅ ÔÏÌØËÏ ÔÅ ËÌÀÞÉ, ËÏÔÏÒÙÅ ÂÙÌÉ ÄÏÂÁ×ÌÅÎÙ ÉÌÉ ÉÚÍÅÎÅÎÙ ÷ÁÍÉ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--export-secret-keys &OptParmNames;</term>
+<term>--export-secret-subkeys &OptParmNames;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --export, ÎÏ ÜËÓÐÏÒÔÉÒÕÅÔ ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ. éÓÐÏÌØÚÕÅÔÓÑ
+ÒÅÄËÏ É ÒÉÓËÏ×ÁÎÁ Ó ÔÏÞËÉ ÚÒÅÎÉÑ ÂÅÚÏÐÁÓÎÏÓÔÉ. ÷ÔÏÒÁÑ ÆÏÒÍÁ ËÏÍÁÎÄÙ
+ÄÅÌÁÅÔ ÓÅËÒÅÔÎÕÀ ÞÁÓÔØ ÐÅÒ×ÉÞÎÏÇÏ ËÌÀÞÁ, × ×Ù×ÏÄÉÍÏÍ ÒÅÚÕÌØÔÁÔÅ,
+ÎÅÐÒÉÇÏÄÎÏÊ; ÜÔÏ ÒÁÓÛÉÒÅÎÉÅ GNU ÄÌÑ ÓÔÁÎÄÁÒÔÁ OpenPGP É ÄÒÕÇÉÅ
+ÒÅÁÌÉÚÁÃÉÉ ÎÅ ÓÍÏÇÕÔ ÕÓÐÅÛÎÏ ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÔÁËÉÅ ËÌÀÞÉ.
+
+ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ ÎÁ ÐÁÒÁÍÅÔÒ --simple-sk-checksum, ÅÓÌÉ ÷Ù ÈÏÔÉÔÅ
+ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÐÏÌÕÞÅÎÎÙÊ ÒÅÚÕÌØÔÁÔ × ÓÔÁÒÕÀ ÒÅÁÌÉÚÁÃÉÀ OpenPGP.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--import &OptParmFiles;</term>
+<term>--fast-import &OptParmFiles;</term>
+<listitem><para>
+éÍÐÏÒÔÉÒÏ×ÁÔØ/ÏÂßÅÄÉÎÉÔØ ËÌÀÞÉ. üÔÁ ËÏÍÁÎÄÁ ÄÏÂÁ×ÌÑÅÔ ×ÙÂÒÁÎÎÙÅ ËÌÀÞÉ Ë
+ÎÁÂÏÒÕ ËÌÀÞÅÊ. --fast-import, × ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ Ñ×ÌÑÅÔÓÑ ÐÒÏÓÔÏ
+ÓÉÎÏÎÉÍÏÍ ÄÌÑ --import.
+</para>
+<para>
+éÍÅÅÔÓÑ ÎÅÓËÏÌØËÏ ÐÁÒÁÍÅÔÒÏ×, ËÏÎÔÒÏÌÉÒÕÀÝÉÈ ÒÁÂÏÔÕ ËÏÍÁÎÄÙ. îÁÉÂÏÌÅÅ
+ÚÎÁÞÉÍÙÊ ÓÒÅÄÉ ÎÉÈ - ÐÁÒÁÍÅÔÒ --keyserver-option --merge-only, ËÏÔÏÒÙÊ
+ÐÒÅÄÏÔ×ÒÁÝÁÅÔ ÄÏÂÁ×ÌÅÎÉÅ ÎÏ×ÙÈ ËÌÀÞÅÊ É ÄÏÐÕÓËÁÅÔ ÔÏÌØËÏ ÄÏÂÁ×ÌÅÎÉÅ ÎÏ×ÙÈ
+ÐÏÄÐÉÓÅÊ, ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ É ÐÏÄËÌÀÞÅÊ Ë ÕÖÅ ÉÍÅÀÝÉÍÓÑ ËÌÀÞÁÍ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--recv-keys &ParmKeyIDs;</term>
+<listitem><para>
+éÍÐÏÒÔÉÒÏ×ÁÔØ ËÌÀÞÉ Ó ÚÁÄÁÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ Ó ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ.
+äÌÑ ÕËÁÚÁÎÉÑ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒ --keyserver.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--refresh-keys &ParmKeyIDs;</term>
+<listitem><para>
+úÁÐÒÏÓÉÔØ Ó ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÏÂÎÏ×ÌÅÎÉÑ ÄÌÑ ËÌÀÞÅÊ, ËÏÔÏÒÙÅ ÕÖÅ ÉÍÅÀÔÓÑ ×
+ÌÏËÁÌØÎÙÈ Ó×ÑÚËÁÈ. ðÒÉÍÅÎÉÍÏ ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÎÏ×ÙÈ ÐÏÄÐÉÓÅÊ,
+ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÅÊ É Ô.Ä. ÷ÙÚÏ× ËÏÍÁÎÄÙ ÂÅÚ ÐÁÒÁÍÅÔÒÁ ÐÒÉ×ÅÄ£Ô
+Ë ÏÂÎÏ×ÌÅÎÉÀ ×ÓÅÊ Ó×ÑÚËÉ ËÌÀÞÅÊ. îÅÏÂÈÏÄÉÍÏ ÚÁÄÁÔØ ÐÁÒÁÍÅÔÒ 
+--keyserver, ÞÔÏÂÙ ÕËÁÚÁÔØ ÓÅÒ×ÅÒ ËÌÀÞÅÊ ÄÌÑ ×ÓÅÈ ËÌÀÞÅÊ, × ËÏÔÏÒÙÈ ÎÅ
+ÕËÁÚÁΠÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÓÅÒ×ÅÒ ËÌÀÞÅÊ 
+(ÓÍ. --keyserver-option honor-keyserver-url).
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--search-keys &OptParmNames;</term>
+<listitem><para>
+ðÏÉÓË ÐÏ ÕËÁÚÁÎÎÙÍ ÉÍÅÎÁÍ ÎÁ ÓÅÒ×ÅÒÅ ËÌÀÞÅÊ. îÅÓËÏÌØËÏ ÉÍ£Î, ÚÁÄÁÎÎÙÈ ×
+ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ, ÏÂßÅÄÉÎÑÀÔÓÑ ×ÍÅÓÔÅ ÄÌÑ ÓÏÚÄÁÎÉÑ ÓÔÒÏËÉ ÐÏÉÓËÁ.
+äÌÑ ÕËÁÚÁÎÉÑ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÐÁÒÁÍÅÔÒ --keyserver.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--update-trustdb</term>
+<listitem><para>
+éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÐÏÄÄÅÒÖËÉ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ. äÁÎÎÁÑ ËÏÍÁÎÄÁ
+ÐÒÏÓÍÁÔÒÉ×ÁÅÔ ×ÓÅ ÉÍÅÀÝÉÅÓÑ ËÌÀÞÉ É ÓÔÒÏÉÔ ÓÅÔØ ÄÏ×ÅÒÉÑ (Web of Trust).
+äÁÎÎÁÑ ËÏÍÁÎÄÁ Ñ×ÌÑÅÔÓÑ ÉÎÔÅÒÁËÔÉ×ÎÏÊ, Ô.Ë. ÏÎÁ ÍÏÖÅÔ ÚÁÐÒÁÛÉ×ÁÔØ Ï
+÷ÁÛÅÍ ÕÒÏ×ÎÅ ÄÏ×ÅÒÉÑ ×ÌÁÄÅÌØÃÁÍ ËÌÀÞÅÊ. ðÏÌØÚÏ×ÁÔÅÌØ ÍÏÖÅÔ ÕËÁÚÁÔØ
+ÎÁÓËÏÌØËÏ ÏΠÄÏ×ÅÒÑÅÔ ×ÌÁÄÅÌØÃÕ ÕËÁÚÁÎÎÏÇÏ ËÌÀÞÁ × ×ÏÐÒÏÓÁÈ ÐÒÏ×ÅÒËÉ É
+ÓÅÒÔÉÆÉËÁÃÉÉ (ÐÏÄÐÉÓÉ) ÄÒÕÇÉÈ ËÌÀÞÅÊ. úÁÐÒÏÓ ×ÙÄÁ£ÔÓÑ ÔÏÌØËÏ × ÔÏÍ
+ÓÌÕÞÁÅ, ÅÓÌÉ ÄÁÎÎÏÍÕ ËÌÀÞÕ ÅÝ£ ÎÅ ÂÙÌÏ ÐÒÉÓ×ÏÅÎÏ ÚÎÁÞÅÎÉÅ ÄÏ×ÅÒÉÑ. ðÒÉ
+ÐÏÍÏÝÉ ËÏÍÁÎÄÙ --edit-key ÍÏÖÎÏ ÐÏÚÖÅ ÉÚÍÅÎÉÔØ ÄÁÎÎÏÅ ÚÎÁÞÅÎÉÅ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--check-trustdb</term>
+<listitem><para>
+÷ÙÐÏÌÎÑÅÔ ÐÒÏ×ÅÒËÕ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÂÅÚ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó
+ÐÏÌØÚÏ×ÁÔÅÌÅÍ. ðÅÒÉÏÄÉÞÅÓËÉ ÂÁÚÁ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÄÏÌÖÎÁ ÏÂÎÏ×ÌÑÔØÓÑ,
+ÞÔÏÂÙ ÏÔÓÌÅÖÉ×ÁÔØ ÉÓÔ£ËÛÉÅ ËÌÀÞÉ É ÐÏÄÐÉÓÉ É ×ÎÏÓÉÔØ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ
+ÉÚÍÅÎÅÎÉÑ × ÓÅÔØ ÄÏ×ÅÒÉÑ. GnuPG ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÏÔÓÌÅÖÉ×ÁÅÔ ÔÁËÉÅ 
+ÓÉÔÕÁÃÉÉ É ÏÂÎÏ×ÌÑÅÔ ÂÁÚÕ Á×ÔÏÍÁÔÉÞÅÓËÉ, ÅÓÌÉ ÎÅ ÕÓÔÁÎÏ×ÌÅΠÐÁÒÁÍÅÔÒ
+--no-auto-check-trustdb. äÁÎÎÁÑ ËÏÍÁÎÄÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ 
+ÐÒÏ×ÅÒËÉ ÐÒÉÎÕÄÉÔÅÌØÎÏ, × ÌÀÂÏÅ ×ÒÅÍÑ. ÷ÙÐÏÌÎÑÅÍÙÅ ÄÅÊÓÔ×ÉÑ ÁÎÁÌÏÇÉÞÎÙ
+ÔÅÍ, ËÏÔÏÒÙÅ ×ÙÐÏÌÎÑÅÔ --update-trustdb,
+ÎÏ ËÌÀÞÉ Ó ÎÅÏÐÒÅÄÅÌ£ÎÎÙÍ ÕÒÏ×ÎÅÍ ÄÏ×ÅÒÉÑ ÐÒÏÐÕÓËÁÀÔÓÑ.
+</para>
+<para>
+ðÒÉ ÚÁÐÕÓËÅ Ó ÐÏÍÏÝØÀ cron, ÄÁÎÎÁÑ ËÏÍÁÎÄÁ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó
+ÐÁÒÁÍÅÔÒÏÍ --batch, × ÜÔÏÍ ÓÌÕÞÁÅ ÐÒÏ×ÅÒËÁ ×ÙÐÏÌÎÑÅÔÓÑ ÔÏÌØËÏ ÅÓÌÉ ÏÎÁ
+ÎÕÖÎÁ. äÌÑ ÐÒÉÎÕÄÉÔÅÌØÎÏÇÏ ×ÙÐÏÌÎÅÎÉÑ ÐÒÏ×ÅÒËÉ × ÜÔÏÍ ÓÌÕÞÁÅ ÍÏÖÎÏ 
+ÉÓÐÏÌØÚÏ×ÁÔØ ÐÁÒÁÍÅÔÒ --yes.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--export-ownertrust</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ÚÎÁÞÅÎÉÑ ÄÏ×ÅÒÉÑ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ.
+ðÒÉÍÅÎÉÍÁ × ÃÅÌÑÈ ÁÒÈÉ×ÁÃÉÉ, Ô.Ë. ÜÔÉ ÚÎÁÞÅÎÉÑ ÅÄÉÎÓÔ×ÅÎÎÏÅ, ÞÔÏ ÎÅ
+ÍÏÖÅÔ ÂÙÔØ ×ÏÓÓÔÁÎÏ×ÌÅÎÏ × ÓÌÕÞÁÅ ÐÏ×ÒÅÖÄÅÎÉÑ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--import-ownertrust &OptParmFiles;</term>
+<listitem><para>
+÷ÎÏÓÉÔ × ÂÁÚÕ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÚÎÁÞÅÎÉÑ ÓÏÈÒÁΣÎÎÙÅ × ÆÁÊÌÅ
+&ParmFiles; (ÉÌÉ ÓÞÉÔÙ×ÁÅÔ ÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ, ÅÓÌÉ ÆÁÊÌ ÎÅ ÚÁÄÁÎ); 
+ÓÕÝÅÓÔ×ÕÀÝÉÅ ÚÎÁÞÅÎÉÑ ÐÅÒÅÚÁÐÉÓÙ×ÁÀÔÓÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--rebuild-keydb-caches</term>
+<listitem><para>
+ðÒÉ ÏÂÎÏ×ÌÅÎÉÉ Ó ×ÅÒÓÉÉ 1.0.6 ÄÏ 1.0.7 ÜÔÁ ËÏÍÁÎÄÁ ÄÏÌÖÎÁ ÂÙÔØ
+ÉÓÐÏÌØÚÏ×ÁÎÁ ÄÌÑ ÓÏÚÄÁÎÉÑ ËÜÛÅÊ ÐÏÄÐÉÓÅÊ × ÎÁÂÏÒÅ ËÌÀÞÅÊ. ïÎÁ ÍÏÖÅÔ
+ÏËÁÚÁÔØÓÑ ÕÄÏÂÎÏÊ É × ÄÒÕÇÉÈ ÓÌÕÞÁÑÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--print-md <parameter>algo</parameter> &OptParmFiles;</term>
+<term>--print-mds &OptParmFiles;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ÚÎÁÞÅÎÉÅ ÈÜÛ-ÆÕÎËÃÉÉ ALGO ÄÌÑ ËÁÖÄÏÇÏ ÉÚ ÚÁÄÁÎÎÙÈ ÆÁÊÌÏ× ÉÌÉ ÄÌÑ
+ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ. ÷ÔÏÒÁÑ ÆÏÒÍÁ (ÉÌÉ "*" × ËÁÞÅÓÔ×Å algo × ÐÅÒ×ÏÍ
+ÓÌÕÞÁÅ) ×Ù×ÏÄÉÔ ÚÎÁÞÅÎÉÑ ×ÓÅÈ ÄÏÓÔÕÐÎÙÈ ÈÜÛ-ÆÕÎËÃÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--gen-random <parameter>0|1|2</parameter>
+                  <optional><parameter>count</parameter></optional></term>
+<listitem><para>
+÷Ù×ÏÄÉÔ COUNT ÓÌÕÞÁÊÎÙÈ ÂÁÊÔ Ó ÚÁÄÁÎÎÙÍ ÕÒÏ×ÎÅÍ ËÁÞÅÓÔ×Á. åÓÌÉ ÐÁÒÁÍÅÔÒ
+COUNT ÎÅ ÚÁÄÁΠÉÌÉ ÒÁ×ÅΠÎÕÌÀ, ÔÏ ×Ù×ÏÄÉÔÓÑ ÂÅÓËÏÎÅÞÎÁÑ
+ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ ÓÌÕÞÁÊÎÙÈ ÂÁÊÔ. ðòåäõðòåöäåîéå! îÅ ÉÓÐÏÌØÚÕÊÔÅ ÜÔÕ
+ËÏÍÁÎÄÕ ÂÅÚ ÎÅÏÂÈÏÄÉÍÏÓÔÉ; ÜÔÏ ÍÏÖÅÔ ÕÍÅÎØÛÉÔØ ÞÉÓÌÏ ÓÌÕÞÁÊÎÙÈ ÄÁÎÎÙÈ
+ÄÏÓÔÕÐÎÙÈ ÓÉÓÔÅÍÅ!
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--gen-prime <parameter>mode</parameter>
+                 <parameter>bits</parameter>
+                  <optional><parameter>qbits</parameter></optional></term>
+<listitem><para>
+çÅÎÅÒÉÒÕÅÔ ÐÒÏÓÔÏÅ ÞÉÓÌÏ. ðÏÄÒÏÂÎÏÓÔÉ ÓÍ. × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--version</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ ÐÒÏÇÒÁÍÍÙ É ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ
+ÁÌÇÏÒÉÔÍÏ×.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--warranty</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ÇÁÒÁÎÔÉÑÈ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-h, --help</term>
+<listitem><para>
+÷Ù×ÏÄÉÔ ËÒÁÔËÕÀ ÓÐÒÁ×ËÕ ÐÏ ÉÓÐÏÌØÚÏ×ÁÎÉÀ ËÏÍÁÎÄÙ. óÐÉÓÏË ÄÏ×ÏÌØÎÏ
+ÄÌÉÎÎÙÊ, ÈÏÔÑ É ÎÅ ×ËÌÀÞÁÅÔ ÏÐÉÓÁÎÉÑ ×ÓÅÈ ÐÁÒÁÍÅÔÒÏ×. äÌÑ ÐÏÌÕÞÅÎÉÑ
+ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÊ ÉÎÆÏÒÍÁÃÉÉ, ÏÂÒÁÝÁÊÔÅÓØ Ë ÄÁÎÎÏÍÕ ÒÕËÏ×ÏÄÓÔ×Õ.
+</para></listitem></varlistentry>
+
+
+
+</variablelist>
+</refsect1>
+
+<refsect1>
+<title>ðáòáíåôòù</title>
+<para>
+äÌÉÎÎÙÅ ÆÏÒÍÙ ÐÁÒÁÍÅÔÒÏ× ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÆÁÊÌÅ ÐÁÒÁÍÅÔÒÏ× (ÐÏ
+ÕÍÏÌÞÁÎÉÀ "~/.gnupg/gpg.conf"). ëÏÒÏÔËÉÅ ÉÍÅÎÁ ÐÁÒÁÍÅÔÒÏ× ÒÁÂÏÔÁÔØ ÎÅ
+ÂÕÄÕÔ - ÎÁÐÒÉÍÅÒ, "armor" ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ × ÆÁÊÌÅ ËÏÎÆÉÇÕÒÁÃÉÉ, Á "Á"
+ÎÅÌØÚÑ. îÅ ÕËÁÚÙ×ÁÊÔÅ Ä×Á ÎÁÞÁÌØÎÙÈ ÄÅÆÉÓÁ, ÐÒÏÓÔÏ ÉÍÑ ÐÁÒÁÍÅÔÒÁ É ÔÒÅÂÕÅÍÙÅ 
+ÁÒÇÕÍÅÎÔÙ. óÔÒÏËÉ ÎÁÞÉÎÁÀÝÉÅÓÑ ÓÉÍ×ÏÌÏÍ "#" (×ÏÚÍÏÖÎÏ ÐÏÓÌÅ ÎÅÓËÏÌØËÉÈ ÐÒÏÂÅÌÏ×)
+ÉÇÎÏÒÉÒÕÀÔÓÑ. ëÏÍÁÎÄÙ ÔÁË ÖÅ ÍÏÇÕÔ ÐÏÍÅÝÁÔØÓÑ × ÜÔÏÔ ÆÁÊÌ, ÎÏ ÜÔÏ, ×
+ÏÂÝÅÍ ÓÌÕÞÁÅ, ÎÅ ÉÍÅÅÔ ÓÍÙÓÌÁ.
+</para>
+<para>
+<command/gpg/ ÒÁÓÐÏÚÎÁ£Ô ÓÌÅÄÕÀÝÉÅ ÐÁÒÁÍÅÔÒÙ:
+</para>
+
+<variablelist>
+
+
+<varlistentry>
+<term>-a, --armor</term>
+<listitem><para>
+óÏÚÄÁ£Ô ×Ù×ÏÄ × ASCII ÆÏÒÍÁÔÅ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-o, --output &ParmFile;</term>
+<listitem><para>
+óÏÈÒÁÎÑÅÔ ÒÅÚÕÌØÔÁÔ × ÆÁÊÌÅ &ParmFile;.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--max-output &ParmN;</term>
+<listitem><para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÐÒÅÄÅÌØÎÏÅ ÞÉÓÌÏ ÂÁÊÔÏ×, ËÏÔÏÒÙÅ
+ÇÅÎÅÒÉÒÕÀÔÓÑ ÐÒÉ ÏÂÒÁÂÏÔËÅ ÆÁÊÌÁ. ðÏÓËÏÌØËÕ OpenPGP ÐÏÄÄÅÒÖÉ×ÁÅÔ
+ÒÁÚÌÉÞÎÙÅ ÓÔÅÐÅÎÉ ÓÖÁÔÉÑ, ÔÏ ×ÏÚÍÏÖÎÏ, ÞÔÏ ÏÔËÒÙÔÙÊ ÔÅËÓÔ ÓÏÏÂÝÅÎÉÑ
+ÍÏÖÅÔ ÂÙÔØ ÚÎÁÞÉÔÅÌØÎÏ ÂÏÌØÛÅ ÉÓÈÏÄÎÏÇÏ ÓÏÏÂÝÅÎÉÑ OpenPGP. èÏÔÑ GnuPG
+ËÏÒÒÅËÔÎÏ ÒÁÂÏÔÁÅÔ Ó ÔÁËÉÍÉ ÆÁÊÌÁÍÉ, ÚÁÞÁÓÔÕÀ ÖÅÌÁÔÅÌØÎÏ ÏÇÒÁÎÉÞÉÔØ
+ÏÂߣ͠×ÙÄÁ×ÁÅÍÏÊ ÉÎÆÏÒÍÁÃÉÉ. ðÏ ÕÍÏÌÞÁÎÉÀ 0, ÞÔÏ ÏÚÎÁÞÁÅÔ ÏÔÓÕÔÓÔ×ÉÅ
+ÏÇÒÁÎÉÞÅÎÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--mangle-dos-filenames</term>
+<term>--no-mangle-dos-filenames</term>
+<listitem><para>
+óÔÁÒÙÅ ×ÅÒÓÉÉ Windows ÎÅ ÍÏÇÕÔ ÏÂÒÁÂÁÔÙ×ÁÔØ ÉÍÅÎÁ ÆÁÊÌÏ× Ó ÂÏÌÅÅ ÞÅÍ
+ÏÄÎÏÊ ÔÏÞËÏÊ. --mangle-dos-filenames ÚÁÓÔÁ×ÌÑÅÔ GnuPG ÚÁÍÅÎÑÔØ ÉÍÅÀÝÅÅÓÑ
+ÒÁÓÛÉÒÅÎÉÅ ÆÁÊÌÁ, Á ÎÅ ÄÏÂÁ×ÌÑÔØ ÅÝ£ ÏÄÎÏ, ÄÌÑ ÏÂÈÏÄÁ ÄÁÎÎÏÊ ÐÒÏÂÌÅÍÙ.
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÔËÌÀÞÅΠÐÏ ÕÍÏÌÞÁÎÉÀ É ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ ÎÁ ÐÌÁÔÆÏÒÍÁÈ
+ÏÔÌÉÞÎÙÈ ÏÔ Windows.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>-u, --local-user &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÐÏÄÐÉÓÉ ËÌÀÞ &ParmName;. úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÐÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÁÒÁÍÅÔÒÁ --default-key.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--default-key &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ &ParmName; × ËÁÞÅÓÔ×Å ËÌÀÞÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÄÌÑ ÐÏÄÐÉÓÅÊ.
+åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, ÔÏ ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ
+ÐÅÒ×ÙÊ ËÌÀÞ ÎÁÊÄÅÎÎÙÊ × Ó×ÑÚËÅ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ.
+úÁÍÅÔØÔÅ, ÞÔÏ -u ÉÌÉ --local-user ÐÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÄÁÎÎÏÇÏ
+ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-r, --recipient &ParmName;</term>
+<term></term>
+<listitem><para>
+úÁÛÉÆÒÏ×ÁÔØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ &ParmName;. åÓÌÉ ÎÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÉ ÐÁÒÁÍÅÔÒ
+--hidden-recipient ÎÅ ÕËÁÚÁÎÙ, É ÎÅ ÚÁÄÁΠÐÁÒÁÍÅÔÒ --default-recipient,
+ÔÏ GnuPG ÚÁÐÒÁÛÉ×ÁÅÔ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>-R, --hidden-recipient &ParmName;</term>
+<term></term>
+<listitem><para>
+úÁÛÉÆÒÏ×ÁÔØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ &ParmName;, ÎÏ ÓËÒÙÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ.
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÓËÒÙ×ÁÅÔ ÐÏÌÕÞÁÔÅÌÑ ÓÏÏÂÝÅÎÉÑ É Ñ×ÌÑÅÔÓÑ ËÏÎÔÒÍÅÒÏÊ
+ÐÒÏÔÉ× ÁÎÁÌÉÚÁ ÔÒÁÆÆÉËÁ. åÓÌÉ ÎÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÉ ÐÁÒÁÍÅÔÒ
+--recipient ÎÅ ÕËÁÚÁÎÙ, É ÎÅ ÚÁÄÁΠÐÁÒÁÍÅÔÒ --default-recipient,
+ÔÏ GnuPG ÚÁÐÒÁÛÉ×ÁÅÔ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--default-recipient &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ &ParmName; ËÁË ÐÏÌÕÞÁÔÅÌÑ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÅÓÌÉ ÎÅ ÚÁÄÁÎ
+ÐÁÒÁÍÅÔÒ --recipient É ÎÅ ×ÙÄÁ×ÁÔØ ÚÁÐÒÏÓ Ï ÐÏÌÕÞÁÔÅÌÅ ÅÓÌÉ ÚÎÁÞÅÎÉÅ 
+&ParmName; Ñ×ÌÑÅÔÓÑ ÄÏÐÕÓÔÉÍÙÍ.
+&ParmName; ÎÅ ÍÏÖÅÔ ÂÙÔØ ÐÕÓÔÙÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--default-recipient-self</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ËÌÀÞ ÐÏ ÕÍÏÌÞÁÎÉÀ ËÁË ÐÏÌÕÞÁÔÅÌÑ, ÅÓÌÉ ÎÅ ÚÁÄÁΠÐÁÒÁÍÅÔÒ
+--recipient, É ÎÅ ×ÙÄÁ×ÁÔØ ÚÁÐÒÏÓ Ï ÐÏÌÕÞÁÔÅÌÅ ÅÓÌÉ ÚÎÁÞÅÎÉÅ ËÌÀÞÁ 
+Ñ×ÌÑÅÔÓÑ ÄÏÐÕÓÔÉÍÙÍ. ëÌÀÞ ÐÏ ÕÍÏÌÞÁÎÉÀ - ÜÔÏ ÐÅÒ×ÙÊ × ÓÅËÒÅÔÎÏÍ ÎÁÂÏÒÅ
+ËÌÀÞÅÊ ÉÌÉ ÔÏÔ, ËÏÔÏÒÙÊ ÚÁÄÁΠÐÁÒÁÍÅÔÒÏÍ --default-key.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--no-default-recipient</term>
+<listitem><para>
+ïÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÏ× --default-recipient É --default-recipient-self.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--encrypt-to &ParmName;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --recipient, ÎÏ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ × ÆÁÊÌÅ
+ÐÁÒÁÍÅÔÒÏ× É ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÷ÁÛÉÍ ÓÏÂÓÔ×ÅÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ
+ÐÏÌØÚÏ×ÁÔÅÌÑ. õËÁÚÁÎÎÙÅ ËÌÀÞÉ ÉÓÐÏÌØÚÕÀÔÓÑ ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ
+ÚÁÄÁÎÙ ÄÒÕÇÉÅ ÐÏÌÕÞÁÔÅÌÉ ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÁ --recipient, ÉÌÉ ÐÏÓÌÅ
+ÔÏÇÏ ËÁË ÂÙÌ ÚÁÐÒÏÛÅΠÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌÕÞÁÔÅÌÑ. äÌÑ ÕËÁÚÁÎÎÙÈ ËÌÀÞÅÊ 
+ÎÅ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÐÒÏ×ÅÒËÁ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ É ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÁÖÅ
+ÔÅ, ËÏÔÏÒÙÅ ÏÔËÌÀÞÅÎÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--hidden-encrypt-to &ParmName;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --hidden-recipient, ÎÏ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ × ÆÁÊÌÅ
+ÐÁÒÁÍÅÔÒÏ× É ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÷ÁÛÉÍ ÓÏÂÓÔ×ÅÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ
+ÐÏÌØÚÏ×ÁÔÅÌÑ ËÁË ÓËÒÙÔÙÊ "encrypt-to-self".  
+õËÁÚÁÎÎÙÅ ËÌÀÞÉ ÉÓÐÏÌØÚÕÀÔÓÑ ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ
+ÚÁÄÁÎÙ ÄÒÕÇÉÅ ÐÏÌÕÞÁÔÅÌÉ ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÁ --recipient, ÉÌÉ ÐÏÓÌÅ
+ÔÏÇÏ ËÁË ÂÙÌ ÚÁÐÒÏÛÅΠÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌÕÞÁÔÅÌÑ. äÌÑ ÕËÁÚÁÎÎÙÈ ËÌÀÞÅÊ 
+ÎÅ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÐÒÏ×ÅÒËÁ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ É ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÁÖÅ
+ÔÅ, ËÏÔÏÒÙÅ ÏÔËÌÀÞÅÎÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-encrypt-to</term>
+<listitem><para>
+ïÔÍÅÎÑÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ËÌÀÞÅÊ ÚÁÄÁÎÎÙÈ ÐÁÒÁÍÅÔÒÁÍÉ --encrypt-to É --hidden-encrypt-to.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>-v, --verbose</term>
+<listitem><para>
+õ×ÅÌÉÞÉ×ÁÅÔ ÄÅÔÁÌØÎÏÓÔØ ×Ù×ÏÄÁ ÉÎÆÏÒÍÁÃÉÉ. åÓÌÉ ÉÓÐÏÌØÚÕÅÔÓÑ Ä×ÁÖÄÙ, ÔÏ
+ÄÅÔÁÌØÎÏ ÏÐÉÓÙ×ÁÀÔÓÑ É ×ÈÏÄÎÙÅ ÄÁÎÎÙÅ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-q, --quiet</term>
+<listitem><para>
+õÍÅÎØÛÁÅÔ ËÏÌÉÞÅÓÔ×Ï ×Ù×ÏÄÉÍÏÊ ÉÎÆÏÒÍÁÃÉÉ ÎÁÓËÏÌØËÏ ÜÔÏ ×ÏÚÍÏÖÎÏ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-z &ParmN;</term>
+<term>--compress-level &ParmN;</term>
+<term>--bzip2-compress-level &ParmN;</term>
+<listitem><para>
+--compress-level ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÕÒÏ×ÅÎØ ÓÖÁÔÉÑ ÒÁ×ÎÙÍ &ParmN; ÄÌÑ
+ÁÌÇÏÒÉÔÍÏ× ZIP É ZLIB. ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÕÒÏ×ÅÎØ ÓÖÁÔÉÑ zlib 
+(ÏÂÙÞÎÏ 6). --bzip2-compress-level ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÕÒÏ×ÅÎØ
+ÓÖÁÔÉÑ ÄÌÑ ÁÌÇÏÒÉÔÍÁ BZIP2 (ÔÁËÖÅ 6 ÐÏ ÕÍÏÌÞÁÎÉÀ).
+äÌÑ BZIP2 ÓÄÅÌÁΠÏÔÄÅÌØÎÙÊ ÐÁÒÁÍÅÔÒ,
+ÐÏÓËÏÌØËÕ ÏΠÔÒÅÂÕÅÔ ÚÎÁÞÉÔÅÌØÎÏ ÂÏÌØÛÅÇÏ ÏÂߣÍÁ ÐÁÍÑÔÉ ÐÒÉ Õ×ÅÌÉÞÅÎÉÉ
+ÕÒÏ×ÎÑ ÓÖÁÔÉÑ. -z ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÏÂÁ ÐÁÒÁÍÅÔÒÁ. úÎÁÞÅÎÉÅ 0 ÏÔËÌÀÞÁÅÔ
+ÓÖÁÔÉÅ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--bzip2-decompress-lowmem</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÁÌØÔÅÒÎÁÔÉ×ÎÙÊ ÁÌÇÏÒÉÔÍ ÄÅËÏÍÐÒÅÓÓÉÉ ÄÌÑ ÆÁÊÌÏ× ÓÖÁÔÙÈ
+BZIP2. üÔÏÔ ÍÅÔÏÄ ÉÓÐÏÌØÚÕÅÔ ÐÏÞÔÉ × Ä×Á ÒÁÚÁ ÍÅÎØÛÅ ÐÁÍÑÔÉ, ÎÏ ÒÁÂÏÔÁÅÔ
+ÔÁË ÖÅ × Ä×Á ÒÁÚÁ ÍÅÄÌÅÎÎÅÅ. ðÁÒÁÍÅÔÒ ÐÒÉÍÅÎÉÍ × ÓÌÕÞÁÑÈ ÏÓÔÒÏÊ ÎÅÈ×ÁÔËÉ
+ÐÁÍÑÔÉ ÄÌÑ ÆÁÊÌÏ× ÓÖÁÔÙÈ Ó ×ÙÓÏËÉÍ --bzip2-compress-level.
+  </para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-t, --textmode</term>
+<term>--no-textmode</term>
+<listitem><para>
+ðÏÌÁÇÁÔØ, ÞÔÏ ×ÈÏÄÎÙÅ ÆÁÊÌÙ ÓÏÄÅÒÖÁÔ ÔÅËÓÔ É ÓÏÈÒÁÎÑÔØ ÉÈ × ËÁÎÏÎÉÞÅÓËÏÊ
+ÔÅËÓÔÏ×ÏÊ ÆÏÒÍÅ OpenPGP ÓÏ ÓÔÒÏËÁÍÉ ÚÁËÁÎÞÉ×ÁÀÝÉÍÉÓÑ "CRLF". ðÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÕÓÔÁÎÁ×ÌÉ×ÁÀÔÓÑ ÆÌÁÇÉ, ÓÏÏÂÝÁÀÝÉÅ ÐÏÌÕÞÁÔÅÌÀ,
+ÞÔÏ ÚÁÛÉÆÒÏ×ÁÎÎÙÅ ÉÌÉ ÐÏÄÐÉÓÁÎÎÙÅ ÄÁÎÎÙÅ Ñ×ÌÑÀÔÓÑ ÔÅËÓÔÏÍ É ÍÏÖÅÔ
+ÐÏÔÒÅÂÏ×ÁÔØÓÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ËÏÎÃÏ× ÓÔÒÏË × ÔÅ, ËÏÔÏÒÙÅ ÉÓÐÏÌØÚÕÀÔÓÑ
+ÌÏËÁÌØÎÏÊ ÓÉÓÔÅÍÏÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉÍÅÎÉÍ ÐÒÉ ÏÂÍÅÎÅ ÉÎÆÏÒÍÁÃÉÅÊ
+ÍÅÖÄÕ Ä×ÕÍÑ ÒÁÚÌÉÞÎÙÍÉ ÐÌÁÔÆÏÒÍÁÍÉ ÉÓÐÏÌØÚÕÀÝÉÍÉ ÒÁÚÌÉÞÎÙÅ ÏËÏÎÞÁÎÉÑ
+ÓÔÒÏË (UNIX - Mac, Mac - Windows É Ô.Ð.). --no-textmode ÏÔËÌÀÞÁÅÔ
+ÄÁÎÎÙÊ ÒÅÖÉÍ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎ.
+</para><para>
+åÓÌÉ -t (ÎÏ ÎÅ --textmode) ÉÓÐÏÌØÚÕÅÔÓÑ ÓÏ×ÍÅÓÔÎÏ Ó --armor
+É --sign, ÔÏ ÓÏÚÄÁ£ÔÓÑ ÐÒÏÚÒÁÞÎÁÑ ÐÏÄÐÉÓØ. üÔÏÔ ÐÁÒÁÍÅÔÒ ÎÅÏÂÈÏÄÉÍ ÄÌÑ
+ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó ËÏÎÓÏÌØÎÙÍÉ ×ÅÒÓÉÑÍÉ PGP; ÏÂÙÞÎÏ ÷ÁÍ ÓÌÅÄÕÅÔ
+ÉÓÐÏÌØÚÏ×ÁÔØ --sign ÉÌÉ --clearsign ÄÌÑ ×ÙÂÏÒÁ ÔÉÐÁ ÐÏÄÐÉÓÉ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-n, --dry-run</term>
+<listitem><para>
+îÅ ÄÅÌÁÔØ ÎÉËÁËÉÈ ÉÚÍÅÎÅÎÉÊ (ÒÅÁÌÉÚÏ×ÁΠÎÅ ÐÏÌÎÏÓÔØÀ).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>-i, --interactive</term>
+<listitem><para>
+÷Ù×ÏÄÉÔØ ÚÁÐÒÏÓ ÐÅÒÅÄ ÐÅÒÅÚÁÐÉÓØÀ ÆÁÊÌÏ×.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--batch</term>
+<term>--no-batch</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÐÁËÅÔÎÙÊ ÒÅÖÉÍ.  îÅ ×Ù×ÏÄÑÔÓÑ ÎÉËÁËÉÅ ÚÁÐÒÏÓÙ, ÎÅ
+ÄÏÐÕÓËÁÀÔÓÑ ÉÎÔÅÒÁËÔÉ×ÎÙÅ ËÏÍÁÎÄÙ.
+--no-batch ÏÔËÌÀÞÁÅÔ ÐÁËÅÔÎÙÊ ÒÅÖÉÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-tty</term>
+<listitem><para>
+îÅ ÉÓÐÏÌØÚÏ×ÁÔØ TTY (ÔÅÒÍÉÎÁÌ) ÄÌÑ ×Ù×ÏÄÁ ÉÎÆÏÒÍÁÃÉÉ. ðÁÒÁÍÅÔÒ ÎÅÏÂÈÏÄÉÍ
+× ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ, Ô.Ë. GnuPG ÉÎÏÇÄÁ ×Ù×ÏÄÉÔ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ ÎÁ TTY ÐÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ --batch.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--yes</term>
+<listitem><para>
+ðÒÅÄÐÏÌÁÇÁÅÔ ÕÔ×ÅÒÄÉÔÅÌØÎÙÊ ÏÔ×ÅÔ ÎÁ ÂÏÌØÛÉÎÓÔ×Ï ×ÏÐÒÏÓÏ×.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--no</term>
+<listitem><para>
+ðÒÅÄÐÏÌÁÇÁÅÔ ÏÔÒÉÃÁÔÅÌØÎÙÊ ÏÔ×ÅÔ ÎÁ ÂÏÌØÛÉÎÓÔ×Ï ×ÏÐÒÏÓÏ×.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--ask-cert-level</term>
+<term>--no-ask-cert-level</term>
+<listitem><para>
+ðÒÉ ÐÏÄÐÉÓÙ×ÁÎÉÉ ËÌÀÞÁ, ÚÁÐÒÁÛÉ×ÁÔØ ÕÒÏ×ÅÎØ ÓÅÒÔÉÆÉËÁÃÉÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ
+ÎÅ ÕËÁÚÁÎ, ÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ÕÒÏ×ÅÎØ ÚÁÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒÏÍ 
+--default-cert-level. óÍ. × ÏÐÉÓÁÎÉÉ --default-cert-level ÂÏÌÅÅ 
+ÐÏÄÒÏÂÎÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ÒÁÚÌÉÞÎÙÈ ÕÒÏ×ÎÑÈ É ÉÈ ÉÓÐÏÌØÚÏ×ÁÎÉÉ.
+--no-ask-cert-level ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÐÁÒÁÍÅÔÒ ÏÔËÌÀÞÅÎ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--min-cert-level</term>
+<listitem><para>
+ðÒÉ ÐÏÓÔÒÏÅÎÉÉ ÂÁÚÙ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ ÎÅ ÕÞÉÔÙ×ÁÔØ ÐÏÄÐÉÓÉ Ó ÕÒÏ×ÎÅÍ
+ÓÅÒÔÉÆÉËÁÃÉÉ ÎÉÖÅ ÕËÁÚÁÎÎÏÇÏ. ðÏ ÕÍÏÌÞÁÎÉÀ ÒÁ×ÅΠ2, ÞÔÏ ÏÚÎÁÞÁÅÔ
+ÏÔËÁÚ ÏÔ ÐÒÉÎÑÔÉÑ ÐÏÄÐÉÓÅÊ Ó ÕÒÏ×ÎÅÍ 1.
+</para></listitem></varlistentry>
+  
+<varlistentry>
+<term>--default-cert-level &ParmN;</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÕÒÏ×ÅÎØ ÓÅÒÔÉÆÉËÁÃÉÉ ËÌÀÞÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÐÒÉ ÅÇÏ ÐÏÄÐÉÓÉ.
+</para><para>
+0 ÏÚÎÁÞÁÅÔ, ÞÔÏ ÷Ù ÎÅ ÂÕÄÅÔÅ ÕËÁÚÙ×ÁÔØ ÎÁÓËÏÌØËÏ ÔÝÁÔÅÌØÎÏ ÐÒÏ×ÅÒÉÌÉ
+ËÌÀÞ ÐÅÒÅÄ ÔÅÍ, ËÁË ÅÇÏ ÐÏÄÐÉÓÙ×ÁÔØ.
+</para><para>
+1 ÏÚÎÁÞÁÅÔ, ÞÔÏ ÷Ù ×ÅÒÉÔÅ × ÄÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÁ, ÎÏ ÎÅ ÐÒÏ×ÅÒÑÌÉ ÉÌÉ ÎÅ
+ÍÏÖÅÔÅ ÐÒÏ×ÅÒÉÔØ ÜÔÏ. ðÒÉÍÅÎÉÍ ÄÌÑ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ ÔÅÈ ÌÉÃ, Ó ËÏÔÏÒÙÍÉ ÷Ù
+ÚÎÁËÏÍÙ ÔÏÌØËÏ ÐÏ ÐÅÒÅÐÉÓËÅ.
+</para><para>
+2 ÏÚÎÁÞÁÅÔ, ÞÔÏ ×Ù ÐÒÏÉÚ×ÅÌÉ ÐÏ×ÅÒÈÎÏÓÔÎÕÀ ÐÒÏ×ÅÒËÕ ËÌÀÞÁ. îÁÐÒÉÍÅÒ, ÷Ù
+ÐÒÏ×ÅÒÉÌÉ ÏÔÐÅÞÁÔÏË ËÌÀÞÁ É Ó×ÅÒÉÌÉ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ ÎÁ ËÌÀÞÅ 
+Ó ÅÇÏ ÆÏÔÏÇÒÁÆÉÞÅÓËÉÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ.
+</para><para>
+3 ÏÚÎÁÞÁÅÔ, ÞÔÏ ÷Ù ÔÝÁÔÅÌØÎÏ ÐÒÏ×ÅÒÉÌÉ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÁ. îÁÐÒÉÍÅÒ, ÷Ù
+Ó×ÅÒÉÌÉ ÏÔÐÅÞÁÔÏË ÉÍÅÀÝÅÊÓÑ Õ ÷ÁÓ ËÏÐÉÉ ËÌÀÞÁ Ó ÔÅÍ, ËÏÔÏÒÙÊ ÌÉÞÎÏ
+ÓÏÏÂÝÉÌ ÷ÁÍ ×ÌÁÄÅÌÅàËÌÀÞÁ, ÐÒÏ×ÅÒÉÌÉ ÐÏ ÄÏËÕÍÅÎÔÁÍ ÌÉÞÎÏÓÔØ ×ÌÁÄÅÌØÃÁ
+ËÌÀÞÁ É Ó×ÅÒÉÌÉ ÅÇÏ ÉÍÑ Ó ÔÅÍ, ËÏÔÏÒÏÅ ÕËÁÚÁÎÏ × ÉÄÅÎÔÉÆÉËÁÔÏÒÅ
+ÐÏÌØÚÏ×ÁÔÅÌÑ ÎÁ ËÌÀÞÅ, É, ÎÁËÏÎÅÃ, ÕÂÅÄÉÌÉÓØ (ÐÕԣ͠ÐÅÒÅÐÉÓËÉ), ÞÔÏ
+ÕËÁÚÁÎÎÙÊ × ÉÄÅÎÔÉÆÉËÁÔÏÒÅ ËÌÀÞÁ ÁÄÒÅÓ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ, ÐÒÉÎÁÄÌÅÖÉÔ
+×ÌÁÄÅÌØÃÕ ËÌÀÞÁ.
+</para><para>
+úÁÍÅÔÉÍ, ÞÔÏ ÐÒÉ×ÅÄ£ÎÎÙÅ ×ÙÛÅ ÐÒÉÍÅÒÙ ÄÌÑ ÕÒÏ×ÎÅÊ 2 É 3 ÜÔÏ ÔÏÌØËÏ
+ÐÒÉÍÅÒÙ. ÷ ËÏÎÅÞÎÏÍ ÓÞ£ÔÅ, ÒÅÛÅÎÉÅ ×ÏÐÒÏÓÁ Ï ÔÏÍ ËÁËÁÑ ÐÒÏ×ÅÒËÁ Ñ×ÌÑÅÔÓÑ
+ÐÏ×ÅÒÈÎÏÓÔÎÏÊ, Á ËÁËÁÑ ÔÝÁÔÅÌØÎÏÊ ÏÓÔÁ£ÔÓÑ ÚÁ ÷ÁÍÉ.
+</para><para>
+úÎÁÞÅÎÉÅÍ ÐÏ ÕÍÏÌÞÁÎÉÀ Ñ×ÌÑÅÔÓÑ 0 (ÕÒÏ×ÅÎØ ÎÅ ÕËÁÚÁÎ).
+</para></listitem></varlistentry>
+
+
+
+<varlistentry>
+<term>--trusted-key <parameter>long key ID</parameter></term>
+<listitem><para>
+ðÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ ÕËÁÚÁÎÎÙÊ ËÌÀÞ (ËÏÔÏÒÙÊ ÄÏÌÖÅΠÂÙÔØ ÚÁÄÁΠÐÏÌÎÙÍ 8ÍÉ
+ÂÁÊÔÏ×ÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ) ÄÏÓÔÏ×ÅÒÅÎ, ËÁË ÏÄÉΠÉÚ ÷ÁÛÉÈ ÓÅËÒÅÔÎÙÈ
+ËÌÀÞÅÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉÍÅÎÉÍ ÅÓÌÉ ÷Ù ÎÅ ÈÏÔÉÔÅ ÈÒÁÎÉÔØ ÷ÁÛÉ 
+ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ (ÉÌÉ ÏÄÉΠÉÚ ÎÉÈ) ÎÁ ÄÁÎÎÏÍ ËÏÍÐØÀÔÅÒÅ, ÎÏ ÈÏÔÉÔÅ
+ÓÏÈÒÁÎÉÔØ ×ÏÚÍÏÖÎÏÓÔØ ÐÒÏ×ÅÒÑÔØ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÅÊ ÷ÁÛÉÈ
+ËÏÒÒÅÓÐÏÎÄÅÎÔÏ×. 
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--trust-model <parameter>pgp|classic|always</parameter></term>
+<listitem><para>
+
+õÓÔÁÎÏ×ÉÔØ ÍÏÄÅÌØ ÄÏ×ÅÒÉÑ, ËÏÔÏÒÏÊ ÄÏÌÖÅΠÓÌÅÄÏ×ÁÔØ GnuPG.
+éÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ÍÏÄÅÌÉ:
+
+<variablelist>
+
+<varlistentry><term>pgp</term><listitem><para>
+üÔÏ ÓÅÔØ ÄÏ×ÅÒÉÑ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÄÏ×ÅÒÑÀÝÉÈ ÐÏÄÐÉÓÅÊ, ËÏÔÏÒÁÑ
+ÉÓÐÏÌØÚÕÅÔÓÑ × PGP 5.x É ÂÏÌÅÅ ÐÏÚÄÎÉÈ ×ÅÒÓÉÑÈ. üÔÏ ÍÏÄÅÌØ ÉÓÐÏÌØÚÕÅÍÁÑ
+ÐÏ ÕÍÏÌÞÁÎÉÀ.
+</para></listitem></varlistentry>
+
+<varlistentry><term>classic</term><listitem><para>
+üÔÏ ÓÔÁÎÄÁÒÔÎÁÑ ÓÅÔØ ÄÏ×ÅÒÉÑ ÉÓÐÏÌØÚÏ×Á×ÛÁÑÓÑ × PGP 2.x É ÒÁÎØÛÅ.
+</para></listitem></varlistentry>
+
+<varlistentry><term>direct</term><listitem><para>
+äÏÓÔÏ×ÅÒÎÏÓÔØ ËÌÀÞÁ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÓÑ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ ÐÏÌØÚÏ×ÁÔÅÌÅÍ É ÎÅ
+×ÙÞÉÓÌÑÅÔÓÑ ÞÅÒÅÚ ÓÅÔØ ÄÏ×ÅÒÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry><term>always</term><listitem><para>
+ðÒÏÐÕÓÔÉÔØ ÐÒÏÃÅÄÕÒÕ ÐÒÏ×ÅÒËÉ ËÌÀÞÅÊ É ÐÏÌÁÇÁÔØ, ÞÔÏ ÉÓÐÏÌØÚÕÅÍÙÅ ËÌÀÞÉ
+×ÓÅÇÄÁ ÐÏÌÎÏÓÔØÀ ÄÏÓÔÏ×ÅÒÎÙ. ÷Ù ÎÅ ÄÏÌÖÎÙ ÉÓÐÏÌØÚÏ×ÁÔØ ÜÔÕ ÍÏÄÅÌØ, ÅÓÌÉ 
+ÔÏÌØËÏ ÎÅ ÉÓÐÏÌØÚÕÅÔÅ ËÁËÕÀ-ÌÉÂÏ ×ÎÅÛÎÀÀ ÓÈÅÍÕ ÐÒÏ×ÅÒËÉ ÄÏÓÔÏ×ÅÒÎÏÓÔÉ 
+ËÌÀÞÅÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ, ÔÁËÖÅ, ÐÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÓÏÏÂÝÅÎÉÑ
+"[uncertain]" ÐÒÉ ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÉ, ËÏÇÄÁ ÎÅÔ Ó×ÉÄÅÔÅÌØÓÔ× ÔÏÇÏ, ÞÔÏ
+ËÌÀÞ ÐÒÉÎÁÄÌÅÖÉÔ ÕËÁÚÁÎÎÏÍՠנΣ͠×ÌÁÄÅÌØÃÕ.
+</para></listitem></varlistentry>
+</variablelist></para></listitem></varlistentry>
+
+<varlistentry>
+<term>--always-trust</term>
+<listitem><para>
+éÄÅÎÔÉÞÅΠ`--trust-model always'. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÓÐÏÌØÚÏ×ÁÔØ ÎÅ
+ÒÅËÏÍÅÎÄÕÅÔÓÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--keyid-format <parameter>short|0xshort|long|0xlong</parameter></term>
+<listitem><para>
+ðÏÚ×ÏÌÑÅÔ ×ÙÂÒÁÔØ ÆÏÒÍÁÔ ÏÔÏÂÒÁÖÅÎÉÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ËÌÀÞÅÊ.
+"short" -- ÜÔÏ ÔÒÁÄÉÃÉÏÎÎÙÊ 8-ÓÉÍ×ÏÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ.
+"long" -- ÂÏÌÅÅ ÔÏÞÎÙÊ (ÎÏ ÍÅÎÅÅ ÒÁÓÐÒÏÓÔÒÁΣÎÎÙÊ) 16-ÓÉÍ×ÏÌØÎÙÊ 
+ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ.  äÏÂÁ×ÌÅÎÉÅ "0x" Ë ÆÏÒÍÁÔÕ ÐÒÉ×ÏÄÉÔ Ë 
+ÄÏÂÁ×ÌÅÎÉÀ "0x" Ë ÉÄÅÎÔÉÆÉËÁÔÏÒÕ ËÌÀÞÁ, ÎÁÐÒÉÍÅÒ, 0x99242560.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--keyserver &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÓÅÒ×ÅÒ ËÌÀÞÅÊ &ParmName;.  üÔÏ ÓÅÒ×ÅÒ ËÏÔÏÒÙÊ ÂÕÄÅÔ
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÏÌÕÞÅÎÉÑ, ÏÔÐÒÁ×ËÉ É ÐÏÉÓËÁ ËÌÀÞÅÊ ÐÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ËÏÍÁÎÄ --recv-keys, --send-keys É --search-keys. æÏÒÍÁÔ
+&ParmName; ÜÔÏ URI: `scheme:[//]keyservername[:port]' óÈÅÍÁ -- ÜÔÏ ÔÉÐ
+ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ: "hkp" ÄÌÑ HTTP (ÉÌÉ ÓÏ×ÍÅÓÔÉÍÙÈ) ÓÅÒ×ÅÒÏ×, 
+"ldap" ÄÌÑ NAI LDAP ÓÅÒ×ÅÒÏ×,  "mailto" ÄÌÑ Graf email keyserver.
+úÁÍÅÔÉÍ, ÞÔÏ ËÏÎËÒÅÔÎÁÑ ÉÎÓÔÁÌÑÃÉÑ GnuPG ÍÏÖÅÔ ÄÏÐÕÓËÁÔØ É ÄÒÕÇÉÅ ÔÉÐÙ
+ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ. éÍÅÎÁ ÓÈÅÍ ÉÓÐÏÌØÚÕÀÔÓÑ ÂÅÚ ÕÞÅÔÁ ÒÅÇÉÓÔÒÁ.
+</para><para>
+âÏÌØÛÉÎÓÔ×Ï ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ ÓÉÎÈÒÏÎÉÚÉÒÕÀÔÓÑ ÄÒÕÇ Ó ÄÒÕÇÏÍ, Ô.Ï. ÎÅÔ
+ÎÅÏÂÈÏÄÉÍÏÓÔÉ ÐÏÓÙÌÁÔØ ËÌÀÞÉ ÂÏÌÅÅ ÞÅÍ ÎÁ ÏÄÉΠÓÅÒ×ÅÒ. éÍÑ
+"hkp://subkeys.pgp.net" Ñ×ÌÑÅÔÓÑ ÐÓÅ×ÄÏÎÉÍÏÍ ÄÌÑ ÎÅÓËÏÌØËÉÈ ÓÅÒ×ÅÒÏ×
+ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--keyserver-options <parameter>parameters</parameter></term>
+<listitem><para>
+äÁÎÎÁÑ ÓÔÒÏËÁ ÓÏÄÅÒÖÉÔ ÓÐÉÓÏË ÒÁÚÄÅÌ£ÎÎÙÈ ÐÒÏÂÅÌÁÍÉ ÉÌÉ ÚÁÐÑÔÙÍÉ
+ÐÁÒÁÍÅÔÒÏ× ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÐÒÅÄ×ÁÒÑÔØÓÑ ÐÒÅÆÉËÓÏÍ `no-'
+ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÏÂÒÁÔÎÏÇÏ ÚÎÁÞÅÎÉÑ. 
+îÅ ×ÓÅ ÐÁÒÁÍÅÔÒÙ ÄÏÐÕÓÔÉÍÙ ÄÌÑ ÌÀÂÏÇÏ
+ÔÉÐÁ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. ïÓÎÏ×ÎÙÅ ÐÁÒÁÍÅÔÒÙ ÓÌÅÄÕÀÝÉÅ:
+<variablelist>
+
+<varlistentry>
+<term>include-revoked</term>
+<listitem><para>
+ðÒÉ ÐÏÉÓËÅ ËÌÀÞÅÊ ËÏÍÁÎÄÏÊ --search-keys, ÕÞÉÔÙ×ÁÔØ É ÔÅ ËÌÀÞÉ, ËÏÔÏÒÙÅ
+ÐÏÍÅÞÅÎÙ ÎÁ ÓÅÒ×ÅÒÅ ËÌÀÞÅÊ ËÁË ÏÔÏÚ×ÁÎÎÙÅ. úÁÍÅÔØÔÅ, ÞÔÏ ÎÅ ×ÓÅ ÓÅÒ×ÅÒÙ
+ËÌÀÞÅÊ ÒÁÚÌÉÞÁÀÔ ÏÔÏÚ×ÁÎÎÙÅ É ÎÅ ÏÔÏÚ×ÁÎÎÙÅ ËÌÀÞÉ, ÄÌÑ ÔÁËÉÈ ÓÅÒ×ÅÒÏ×
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÌÉۣΠÓÍÙÓÌÁ. úÁÍÅÔØÔÅ, ÔÁËÖÅ, ÞÔÏ ÂÏÌØÛÉÎÓÔ×Ï ÓÅÒ×ÅÒÏ×
+ËÌÀÞÅÊ ÎÅ ×ÙÐÏÌÎÑÀÔ ËÒÉÐÔÏÇÒÁÆÉÞÅÓËÕÀ ÐÒÏ×ÅÒËÕ ÏÔÚÙ×ÁÀÝÉÈ ÓÅÒÔÉÆÉËÁÔÏ×,
+× ÜÔÏÍ ÓÌÕÞÁÅ ÏÔËÌÀÞÅÎÉÅ ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë ÔÏÍÕ, ÞÔÏ ÂÕÄÕÔ
+ÐÒÏÐÕÝÅÎÙ ËÌÀÞÉ ÎÅËÏÒÒÅËÔÎÏ ÐÏÍÅÞÅÎÎÙÅ ËÁË ÏÔÏÚ×ÁÎÎÙÅ. ðÏ ÕÍÏÌÞÁÎÉÀ
+ÐÁÒÁÍÅÔÒ ×ËÌÀÞÅÎ. 
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>include-disabled</term>
+<listitem><para>
+ðÒÉ ÐÏÉÓËÅ ËÌÀÞÅÊ ËÏÍÁÎÄÏÊ --search-keys, ÕÞÉÔÙ×ÁÔØ É ÔÅ ËÌÀÞÉ, ËÏÔÏÒÙÅ
+ÐÏÍÅÞÅÎÙ ÎÁ ÓÅÒ×ÅÒÅ ËÌÀÞÅÊ ËÁË ÎÅÉÓÐÏÌØÚÕÅÍÙÅ. úÁÍÅÔÉÍ, ÞÔÏ ÄÁÎÎÙÊ 
+ÐÁÒÁÍÅÔÒ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ HKP ÓÅÒ×ÅÒÁÍÉ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>honor-keyserver-url</term>
+<listitem><para>
+ðÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄÙ --refresh-keys, ÅÓÌÉ × ÚÁÐÒÁÛÉ×ÁÅÍÏÍ ËÌÀÞÅ
+ÕÓÔÁÎÏ×ÌÅΠÐÒÅÄÐÏÞÉÔÁÅÍÙÊ ÓÅÒ×ÅÒ ËÌÀÞÅÊ, ÔÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÅÇÏ ÄÌÑ
+ÏÂÎÏ×ÌÅÎÉÑ ËÌÀÞÁ. ðÏ ÕÍÏÌÞÁÎÉÀ ×ËÌÀÞÅÎ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>include-subkeys</term>
+<listitem><para>
+ðÒÉ ÐÏÌÕÞÅÎÉÉ ËÌÀÞÁ, ÐÒÏÉÚ×ÏÄÉÔØ ÐÏÉÓË É ÐÏ ÐÏÄËÌÀÞÁÍ. úÁÍÅÔØÔÅ, ÞÔÏ
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÁÂÏÔÁÅÔ Ó ÓÅÒ×ÅÒÁÍÉ HKP, Ô.Ë. ÏÎÉ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔ
+ÐÅÒÅÓÙÌËÕ ËÌÀÞÅÊ ÐÏ ÉÄÅÎÔÉÆÉËÁÔÏÒÕ ÐÏÄËÌÀÞÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>use-temp-files</term>
+<listitem><para>
+îÁ ÂÏÌØÛÉÎÓÔ×Å Unix-ÐÏÄÏÂÎÙÈ ÐÌÁÔÆÏÒÍ GnuPG ×ÚÁÉÍÏÄÅÊÓÔ×ÕÅÔ Ó ÐÒÏÇÒÁÍÍÏÊ
+ÏÂÒÁÝÅÎÉÑ Ë ÓÅÒ×ÅÒÕ ËÌÀÞÅÊ ÞÅÒÅÚ ËÁÎÁÌÙ, ËÏÔÏÒÙÅ Ñ×ÌÑÀÔÓÑ ÎÁÉÂÏÌÅÅ
+ÜÆÆÅËÔÉ×ÎÙÍ ÍÅÔÏÄÏÍ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÚÁÓÔÁ×ÌÑÅÔ GnuPG ÉÓÐÏÌØÚÏ×ÁÔØ
+ÄÌÑ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ ×ÒÅÍÅÎÎÙÅ ÆÁÊÌÙ. îÁ ÎÅËÏÔÏÒÙÈ ÐÌÁÔÆÏÒÍÁÈ (ÔÁËÉÈ ËÁË
+Win32 É RISC OS) ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÓÐÏÌØÚÕÅÔÓÑ ×ÓÅÇÄÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>keep-temp-files</term>
+<listitem><para>
+õËÁÚÙ×ÁÅÔ, ÞÔÏ ÐÒÉ ×ËÌÀÞÅÎÎÏÍ ÐÁÒÁÍÅÔÒÅ `use-temp-files' ×ÒÅÍÅÎÎÙÅ
+ÆÁÊÌÙ ÎÅ ÄÏÌÖÎÙ ÕÄÁÌÑÔØÓÑ  ÐÏÓÌÅ ÉÈ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÕÄÏÂÅΠÄÌÑ ÉÚÕÞÅÎÉÑ ÐÒÏÔÏËÏÌÁ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>verbose</term>
+<listitem><para>
+õËÁÚÙ×ÁÅÔ ÐÒÏÇÒÁÍÍÅ ×ÚÁÉÍÏÄÅÊÓÔ×ÉÑ Ó ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ ×Ù×ÏÄÉÔØ ÂÏÌÅÅ
+ÐÏÄÒÏÂÎÕÀ ÉÎÆÏÒÍÁÃÉÀ. íÏÖÅÔ ÐÏ×ÔÏÒÑÔØÓÑ ÎÅÓËÏÌØËÏ ÒÁÚ ÄÌÑ Õ×ÅÌÉÞÅÎÉÑ
+ÄÅÔÁÌØÎÏÓÔÉ ×Ù×ÏÄÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>timeout</term>
+<listitem><para>
+õËÁÚÙ×ÁÅÔ ÐÒÏÇÒÁÍÍÅ ×ÚÁÉÍÏÄÅÊÓÔ×ÕÀÝÅÊ Ó ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ ÍÁËÓÉÍÁÌØÎÕÀ
+ÐÒÏÄÏÌÖÉÔÅÌØÎÏÓÔØ ÏÐÅÒÁÃÉÉ × ÓÅËÕÎÄÁÈ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÒÉ ÏÄÎÏ×ÒÅÍÅÎÎÏÍ
+×ÙÐÏÌÎÅÎÉÉ ÎÅÓËÏÌØËÉÈ ÏÐÅÒÁÃÉÊ ÚÎÁÞÅÎÉÅ ÔÁÊÍÁÕÔÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÏÔÄÅÌØÎÏ
+ÄÌÑ ËÁÖÄÏÊ ÏÐÅÒÁÃÉÉ. îÁÐÒÉÍÅÒ, ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÎÅÓËÏÌØËÉÈ ËÌÀÞÅÊ Ó ÐÏÍÏÝØÀ
+--recv-keys, ÏÇÒÁÎÉÞÉ×ÁÅÔÓÑ ×ÒÅÍÑ ÐÏÌÕÞÅÎÉÑ ËÁÖÄÏÇÏ ÉÚ ÎÉÈ ÐÏ
+ÏÔÄÅÌØÎÏÓÔÉ. ðÏ ÕÍÏÌÞÁÎÉÀ 30 ÓÅËÕÎÄ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>http-proxy &OptEqualsValue;</term>
+<listitem><para>
+äÌÑ ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ ËÏÔÏÒÙÅ ÉÓÐÏÌØÚÕÀÔ HTTP (ÔÁËÉÈ ËÁË HKP),
+ÉÓÐÏÌØÚÏ×ÁÔØ ÄÏÓÔÕРÞÅÒÅÚ ÕËÁÚÁÎÎÙÊ ÐÒÏËÓÉ-ÓÅÒ×ÅÒ. åÓÌÉ ÁÒÇÕÍÅÎÔ
+ÏÐÕÝÅÎ, ÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÏËÓÉ-ÓÅÒ×ÅÒ ÚÁÄÁÎÎÙÊ × ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ
+"http_proxy".
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>auto-key-retrieve</term>
+<listitem><para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÒÁÚÒÅÛÁÅÔ Á×ÔÏÍÁÔÉÞÅÓËÏÅ ÐÏÌÕÞÅÎÉÅ ËÌÀÞÅÊ Ó ÓÅÒ×ÅÒÁ ÐÒÉ
+ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ ÓÄÅÌÁÎÎÙÈ ËÌÀÞÁÍÉ, ËÏÔÏÒÙÈ ÎÅÔ × ÌÏËÁÌØÎÏÍ ÎÁÂÏÒÅ
+ËÌÀÞÅÊ.
+</para><para>
+úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉ×ÏÄÉÔ Ë ×ÏÚÎÉËÎÏ×ÅÎÉÀ ÏÐÒÅÄÅÌ£ÎÎÏÊ
+ÕÑÚ×ÉÍÏÓÔÉ. áÄÍÉÎÉÓÔÒÁÔÏÒÙ ÓÅÒ×ÅÒÏ× ËÌÀÞÅÊ ÍÏÇÕÔ ÏÔÓÌÅÖÉ×ÁÔØ ÚÁÐÒÏÓÙ;
+ÏÔÐÒÁ×É× ÷ÁÍ ÓÏÏÂÝÅÎÉÅ, ÐÏÄÐÉÓÁÎÎÏÅ ÎÏ×ÙÍ ËÌÀÞÏÍ (ËÏÔÏÒÙÊ ÏÔÓÕÔÓÔ×ÕÅÔ Õ
+÷ÁÓ), ÏÎÉ ÍÏÇÕÔ ÏÐÒÅÄÅÌÉÔØ ÷ÁÛ IP ÁÄÒÅÓ É ×ÒÅÍÑ, ËÏÇÄÁ ÷Ù ÐÒÏ×ÅÒÉÌÉ
+ÐÏÄÐÉÓØ.
+</para></listitem></varlistentry>
+
+</variablelist>
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--import-options <parameter>parameters</parameter></term>
+<listitem><para>
+÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÕËÁÚÙ×ÁÅÔÓÑ ÓÔÒÏËÁ, × ËÏÔÏÒÏÊ, ÞÅÒÅÚ ÐÒÏÂÅÌÙ ÉÌÉ
+ÚÁÐÑÔÙÅ, ÐÅÒÅÞÉÓÌÅÎÙ ÐÁÒÁÍÅÔÒÙ ÉÍÐÏÒÔÁ ËÌÀÞÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ
+ÐÒÅÄ×ÁÒÑÔØÓÑ `no-' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÏÂÒÁÔÎÏÇÏ ÚÎÁÞÅÎÉÑ. äÏÐÕÓÔÉÍÙÅ
+ÐÁÒÁÍÅÔÒÙ:
+<variablelist>
+
+<varlistentry>
+<term>import-local-sigs</term>
+<listitem><para>
+ðÏÚ×ÏÌÑÅÔ ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ, ÐÏÍÅÞÅÎÎÙÅ ËÁË ÌÏËÁÌØÎÙÅ. ëÁË
+ÐÒÁ×ÉÌÏ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÓÌÕÞÁÅ× ÒÁÚÄÅÌÑÅÍÙÈ ÎÁÂÏÒÏ×
+ËÌÀÞÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÎÅÔ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>repair-hkp-subkey-bug</term>
+<listitem><para>
+ðÒÉ ÉÍÐÏÒÔÅ ÐÙÔÁÔØÓÑ ×ÏÓÓÔÁÎÏ×ÉÔØ ÐÏ×ÒÅÖÄÅÎÉÑ ×ÙÚ×ÁÎÎÙÅ ÏÛÉÂËÏÊ × ÓÅÒ×ÅÒÅ
+PKS (ÄÏ ×ÅÒÓÉÉ 0.9.6), ÉÓËÁÖÁÀÝÅÊ ËÌÀÞÉ Ó ÍÎÏÖÅÓÔ×ÅÎÎÙÍÉ ÐÏÄËÌÀÞÁÍÉ. 
+úÁÍÅÔØÔÅ, ÞÔÏ ÜÔÏ ÎÅ ÐÏÚ×ÏÌÑÅÔ ÐÏÌÎÏÓÔØÀ ×ÏÓÓÔÁÎÏ×ÉÔØ ÐÏ×ÒÅÖÄÅÎÎÙÊ ËÌÀÞ,
+Ô.Ë. ÞÁÓÔØ ÄÁÎÎÙÈ ÕÄÁÌÑÅÔÓÑ ÓÅÒ×ÅÒÏÍ ËÌÀÞÅÊ, ÎÏ ÄÁ£Ô ÐÏ ËÒÁÊÎÅÊ ÍÅÒÅ ÏÄÉÎ
+ÐÏÄËÌÀÞ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅΠÄÌÑ ÏÂÙÞÎÏÇÏ --import É ×ËÌÀÞÅΠÄÌÑ
+--recv-keys.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>merge-only</term>
+<listitem><para>
+÷Ï ×ÒÅÍÑ ÉÍÐÏÒÔÁ ÒÁÚÒÅÛÉÔØ ÔÏÌØËÏ ÏÂÎÏ×ÌÅÎÉÅ ÓÕÝÅÓÔ×ÕÀÝÉÈ ËÌÀÞÅÊ, ÎÏ ÎÅ
+ÉÍÐÏÒÔÉÒÏ×ÁÔØ ÎÉËÁËÉÅ ÎÏ×ÙÅ ËÌÀÞÉ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎ.
+</para></listitem></varlistentry>
+
+</variablelist>
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--export-options <parameter>parameters</parameter></term>
+<listitem><para>
+÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÕËÁÚÙ×ÁÅÔÓÑ ÓÔÒÏËÁ, × ËÏÔÏÒÏÊ, ÞÅÒÅÚ ÐÒÏÂÅÌÙ ÉÌÉ
+ÚÁÐÑÔÙÅ, ÐÅÒÅÞÉÓÌÅÎÙ ÐÁÒÁÍÅÔÒÙ ÜËÓÐÏÒÔÁ ËÌÀÞÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ
+ÐÒÅÄ×ÁÒÑÔØÓÑ `no-' ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÏÂÒÁÔÎÏÇÏ ÚÎÁÞÅÎÉÑ. äÏÐÕÓÔÉÍÙÅ
+ÐÁÒÁÍÅÔÒÙ:
+<variablelist>
+
+<varlistentry>
+<term>export-local-sigs</term>
+<listitem><para>
+ðÏÚ×ÏÌÑÅÔ ÜËÓÐÏÒÔÉÒÏ×ÁÔØ ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ, ÐÏÍÅÞÅÎÎÙÅ ËÁË ÌÏËÁÌØÎÙÅ.  ëÁË
+ÐÒÁ×ÉÌÏ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÓÌÕÞÁÅ× ÒÁÚÄÅÌÑÅÍÙÈ ÎÁÂÏÒÏ×
+ËÌÀÞÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>export-attributes</term>
+<listitem><para>
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ÁÔÒÉÂÕÔÎÙÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ (ÆÏÔÏÇÒÁÆÉÞÅÓËÉÅ
+ÉÄÅÎÔÉÆÉËÁÔÏÒÙ). ðÒÉÍÅÎÉÍÏ ÐÒÉ ÜËÓÐÏÒÔÅ ËÌÀÞÅÊ, ÅÓÌÉ ÏÎÉ ÐÒÅÄÎÁÚÎÁÞÅÎÙ
+ÄÌÑ ÐÒÏÇÒÁÍÍÙ OpenPGP, ÎÅ ÄÏÐÕÓËÁÀÝÅÊ ÁÔÒÉÂÕÔÎÙÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ. ðÏ
+ÕÍÏÌÞÁÎÉÀ ×ËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>export-sensitive-revkeys</term>
+<listitem><para>
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÎÁÚÎÁÞÅÎÎÏÍ ÏÔÚÙ×ÁÀÝÅÍ, ËÏÔÏÒÁÑ ÂÙÌÁ
+ÐÏÍÅÞÅÎÁ ËÁË "sensitive". ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>export-minimal</term>
+<listitem><para>
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ËÌÀÞ ÍÉÎÉÍÁÌØÎÏ ×ÏÚÍÏÖÎÏÇÏ ÒÁÚÍÅÒÁ. ÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÜÔÏ
+ÄÏÓÔÉÇÁÅÔÓÑ ÚÁ ÓÞ£Ô ÔÏÇÏ, ÞÔÏ × ÜËÓÐÏÒÔÉÒÕÅÍÙÊ ËÌÀÞ ÎÅ ×ËÌÀÞÁÀÔÓÑ
+ÎÉËÁËÉÅ ÐÏÄÐÉÓÉ ËÒÏÍÅ ÓÁÍÏÐÏÄÐÉÓÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+</variablelist>
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--list-options <parameter>parameters</parameter></term>
+<listitem><para>
+üÔÏ ÓÐÉÓÏË ÒÁÚÄÅÌ£ÎÎÙÈ ÐÒÏÂÅÌÁÍÉ ÉÌÉ ÚÁÐÑÔÙÍÉ ÐÁÒÁÍÅÔÒÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ
+ÐÒÉ ×Ù×ÏÄÅ ÓÐÉÓËÏ× ËÌÀÞÅÊ É ÐÏÄÐÉÓÅÊ (ÔÁËÉÍÉ ËÏÍÁÎÄÁÍÉ, ËÁË --list-keys,
+--list-sigs, --list-public-keys, --list-secret-keys É ÆÕÎËÃÉÑÍÉ 
+--edit-key). ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÐÒÅÄ×ÁÒÑÔØÓÑ ÐÒÅÆÉËÓÏÍ `no-' ÄÌÑ ÐÒÉÄÁÎÉÑ
+ÉÍ ÐÒÏÔÉ×ÏÐÏÌÏÖÎÏÇÏ ÚÎÁÞÅÎÉÑ. éÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ÐÁÒÁÍÅÔÒÙ:
+<variablelist>
+
+<varlistentry>
+<term>show-photos</term>
+<listitem><para>
+úÁÓÔÁ×ÌÑÅÔ --list-keys, --list-sigs, --list-public-keys É
+--list-secret-keys ×Ù×ÏÄÉÔØ ×ÓÅ photo ID ÓÏÄÅÒÖÁÝÉÅÓÑ × ËÌÀÞÅ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. óÍ. ÔÁËÖÅ --photo-viewer.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-policy-url</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ URL ÐÏÌÉÔÉË × ×Ù×ÏÄÅ ËÏÍÁÎÄ --list-sigs É --check-sigs.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-notations</term>
+<term>show-std-notations</term>
+<term>show-user-notations</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÐÒÉÍÅÞÁÎÉÑ Ë ÐÏÄÐÉÓÑÍ × ×Ù×ÏÄÅ ËÏÍÁÎÄ --list-sigs É --check-sigs.
+óÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, ×ÓÅ, ÓÔÁÎÄÁÒÔÎÙÅ IETF, ÉÌÉ ÏÐÒÅÄÅÌ£ÎÎÙÅ ÐÏÌØÚÏ×ÁÔÅÌÅÍ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-keyserver-urls</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ URL ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ × ×Ù×ÏÄÅ ËÏÍÁÎÄ 
+--list-sigs É --check-sigs. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-uid-validity</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ×ÙÞÉÓÌÅÎÎÕÀ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ×
+ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÒÉ ×Ù×ÏÄÅ ËÌÀÞÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-unusable-uids</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÏÔÏÚ×ÁÎÎÙÅ É ÉÓÔ£ËÛÉÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-unusable-subkeys</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÏÔÏÚ×ÁÎÎÙÅ É ÉÓÔ£ËÛÉÅ ÐÏÄËÌÀÞÉ × ÓÐÉÓËÅ ËÌÀÞÅÊ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-keyring</term>
+<listitem><para>
+÷Ù×ÏÄÉÔØ ÉÍÑ ÆÁÊÌÁ Ó×ÑÚËÉ ËÌÀÞÅÊ × ÎÁÞÁÌÅ ÓÐÉÓËÁ ËÌÀÞÅÊ, ÞÔÏÂÙ ÐÏËÁÚÁÔØ ×
+ËÁËÏÊ Ó×ÑÚËÅ ÎÁÈÏÄÉÔÓÑ ËÌÀÞ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-sig-expire</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÄÁÔÙ ÄÏ ËÏÔÏÒÙÈ ÄÅÊÓÔ×ÉÔÅÌØÎÙ ÐÏÄÐÉÓÉ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ
+ --list-sigs É --check-sigs. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-sig-subpackets</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÐÏÄÐÁËÅÔÙ ÐÏÄÐÉÓÅÊ ÐÒÉ ×Ù×ÏÄÅ ÓÐÉÓËÁ ËÌÀÞÅÊ. äÌÑ ÄÁÎÎÏÇÏ
+ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ ÂÙÔØ ÕËÁÚÁΠÄÏÐÏÌÎÉÔÅÌØÎÙÊ ÁÒÇÕÍÅÎÔ, ÓÏÄÅÒÖÁÝÉÊ ÓÐÉÓÏË
+ÐÏÄÐÁËÅÔÏ×, ËÏÔÏÒÙÅ ÓÌÅÄÕÅÔ ×Ù×ÅÓÔÉ. åÓÌÉ ÁÒÇÕÍÅÎÔ ÏÐÕÝÅÎ, ÔÏ ×Ù×ÏÄÑÔÓÑ
+×ÓÅ ÐÏÄÐÁËÅÔÙ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÍÅÅÔ ÓÍÙÓÌ ÔÏÌØËÏ
+ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ --with-colons ÓÏ×ÍÅÓÔÎÏ Ó --list-sigs ÉÌÉ --check-sigs.
+</para></listitem></varlistentry>
+
+</variablelist>
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--verify-options <parameter>parameters</parameter></term>
+<listitem><para>
+üÔÏ ÓÐÉÓÏË ÒÁÚÄÅÌ£ÎÎÙÈ ÐÒÏÂÅÌÁÍÉ ÉÌÉ ÚÁÐÑÔÙÍÉ ÐÁÒÁÍÅÔÒÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ
+ÐÒÉ ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ. ðÁÒÁÍÅÔÒÙ ÍÏÇÕÔ ÐÒÅÄ×ÁÒÑÔØÓÑ ÐÒÅÆÉËÓÏÍ `no-' 
+ÄÌÑ ÐÒÉÄÁÎÉÑ ÉÍ ÐÒÏÔÉ×ÏÐÏÌÏÖÎÏÇÏ ÚÎÁÞÅÎÉÑ. éÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ÐÁÒÁÍÅÔÒÙ:
+<variablelist>
+
+<varlistentry>
+<term>show-photos</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ×ÓÅ photo ID ÉÍÅÀÝÉÅÓÑ × ËÌÀÞÅ, ËÏÔÏÒÙÍ ÓÄÅÌÁÎÁ ÐÏÄÐÉÓØ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ. óÍ. ÔÁËÖÅ --photo-viewer.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-policy-url</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ URL ÐÏÌÉÔÉË × ÐÒÏ×ÅÒÑÅÍÏÊ ÐÏÄÐÉÓÉ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-notations</term>
+<term>show-std-notations</term>
+<term>show-user-notations</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÐÒÉÍÅÞÁÎÉÑ × ÐÒÏ×ÅÒÑÅÍÏÊ ÐÏÄÐÉÓÉ. 
+óÏÏÔ×ÅÔÓÔ×ÅÎÎÏ, ×ÓÅ, ÓÔÁÎÄÁÒÔÎÙÅ IETF, ÉÌÉ ÏÐÒÅÄÅÌ£ÎÎÙÅ ÐÏÌØÚÏ×ÁÔÅÌÅÍ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÐÏËÁÚÙ×ÁÀÔÓÑ ÓÔÁÎÄÁÒÔÎÙÅ ÐÒÉÍÅÞÁÎÉÑ IETF.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-keyserver-url</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ URL ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ × ÐÒÏ×ÅÒÑÅÍÏÊ ÐÏÄÐÉÓÉ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-uid-validity</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ×ÙÞÉÓÌÅÎÎÕÀ ÄÏÓÔÏ×ÅÒÎÏÓÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ÐÏÌØÚÏ×ÁÔÅÌÑ ÎÁ
+ËÌÀÞÅ ËÏÔÏÒÙÍ ÓÄÅÌÁÎÁ ÐÏÄÐÉÓØ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>show-unusable-uids</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÏÔÏÚ×ÁÎÎÙÅ É ÉÓÔ£ËÛÉÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÒÉ
+ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÉ. ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+</variablelist>
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--show-photos</term>
+<term>--no-show-photos</term>
+<listitem><para>
+ðÒÉ×ÏÄÉÔ Ë ÔÏÍÕ, ÞÔÏ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ --list-keys, --list-sigs, 
+--list-public-keys, --list-secret-keys É ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ ×Ù×ÏÄÑÔÓÑ
+ÆÏÔÏÇÒÁÆÉÞÅÓËÉÅ ÉÄÅÎÔÉÆÉËÁÔÏÒÙ Ó×ÑÚÁÎÎÙÅ Ó ËÌÀÞÏÍ, ÅÓÌÉ ÔÁËÏ×ÙÅ ÉÍÅÀÔÓÑ.
+óÍ. ÔÁËÖÅ --photo-viewer. éÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ.
+÷ÍÅÓÔÏ ÎÅÇÏ ÌÕÞÛÅ ÉÓÐÏÌØÚÏ×ÁÔØ `--list-options [no-]show-photos' É/ÉÌÉ
+`--verify-options [no-]show-photos'.
+--no-show-photos ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--photo-viewer &ParmString;</term>
+<listitem><para>
+ïÐÒÅÄÅÌÑÅÔ ËÏÍÁÎÄÎÕÀ ÓÔÒÏËÕ, ËÏÔÏÒÁÑ ÄÏÌÖÎÁ ÂÙÔØ ×ÙÐÏÌÎÅÎÁ ÄÌÑ ÐÒÏÓÍÏÔÒÁ
+ÆÏÔÏÇÒÁÆÉÞÅÓËÏÇÏ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ. "%i" ÒÁÓËÒÙ×ÁÅÔÓÑ × ÉÍÑ ÆÁÊÌÁ,
+ÓÏÄÅÒÖÁÝÅÇÏ ÆÏÔÏÇÒÁÆÉÀ. "%I" ÄÅÌÁÅÔ ÔÏ ÖÅ ÓÁÍÏÅ, ÎÏ ÆÁÊÌ ÎÅ ÂÕÄÅÔ ÕÄÁÌ£Î
+ÐÏÓÌÅ ×ÙÈÏÄÁ ÉÚ ÐÒÏÇÒÁÍÍÙ ÐÒÏÓÍÏÔÒÁ. "%k" ÚÁÍÅÎÑÅÔÓÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ
+ËÌÀÞÁ, "%K" -- ÄÌÉÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ, "%f" -- ÏÔÐÅÞÁÔËÏÍ ËÌÀÞÁ,
+"%t" -- ÒÁÓÛÉÒÅÎÉÅÍ ÄÌÑ ÄÁÎÎÏÇÏ ÔÉÐÁ ÉÚÏÂÒÁÖÅÎÉÊ (ÎÁÐÒ., "jpg"), "%T" --
+MIME ÔÉÐÏÍ ÉÚÏÂÒÁÖÅÎÉÑ (ÎÁÐÒ., "image/jpeg"), É "%%" -- ÚÎÁËÏÍ ÐÒÏÃÅÎÔÁ.
+åÓÌÉ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ ÎÉ "%i", ÎÉ "%I", ÔÏ ÆÏÔÏÇÒÁÆÉÑ ÐÅÒÅÄÁ£ÔÓÑ ÎÁ
+ÓÔÁÎÄÁÒÔÎÙÊ ××ÏÄ ËÏÍÁÎÄÙ ÐÒÏÓÍÏÔÒÁ.
+</para><para>
+úÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ:
+"xloadimage -fork -quiet -title 'KeyID 0x%k' stdin"
+úÁÍÅÔØÔÅ, ÞÔÏ ÅÓÌÉ ÷ÁÛÁ ÐÒÏÇÒÁÍÍÁ ÐÒÏÓÍÏÔÒÁ ÎÅ ÚÁÝÉÝÅÎÁ, ÔÏ ×ÙÚÏ× ÉÚ
+GnuPG ÎÅ ÓÄÅÌÁÅԠţ ÚÁÝÉÝ£ÎÎÏÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--exec-path &ParmString;</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ÓÐÉÓÏË ËÁÔÁÌÏÇÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ ÄÌÑ ÐÏÉÓËÁ ÐÒÏÇÒÁÍÍÙ
+ÐÒÏÓÍÏÔÒÁ ÆÏÔÏÇÒÁÆÉÊ É ÐÏÍÏÝÎÉËÁ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ,
+ÔÏ ÄÌÑ ÐÏÍÏÝÎÉËÁ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÉÓÐÏÌØÚÕÅÔÓÑ ËÁÔÁÌÏÇ ÏÐÒÅÄÅÌ£ÎÎÙÊ ÐÒÉ
+ËÏÍÐÉÌÑÃÉÉ, Á ÄÌÑ ÐÒÏÇÒÁÍÍÙ ÐÒÏÓÍÏÔÒÁ ÆÏÔÏÇÒÁÆÉÊ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÅÒÅÍÅÎÎÁÑ
+ÏËÒÕÖÅÎÉÑ $PATH.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--show-keyring</term>
+<listitem><para>
+÷Ù×ÏÄÉÔØ ÉÍÑ Ó×ÑÚËÉ ËÌÀÞÅÊ × ÎÁÞÁÌÅ ×Ù×ÏÄÁ ÓÐÉÓËÁ ËÌÀÞÅÊ, ÞÔÏÂÙ ÐÏËÁÚÁÔØ
+× ËÁËÏÊ Ó×ÑÚËÅ ÈÒÁÎÉÔÓÑ ËÌÀÞ. ðÒÉÍÅÎÑÔØ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ.
+÷ÍÅÓÔÏ ÎÅÇÏ ÓÌÅÄÕÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ `--list-options [no-]show-keyring'
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--keyring &ParmFile;</term>
+<listitem><para>
+äÏÂÁ×ÉÔØ &ParmFile; Ë ÔÅËÕÝÅÍÕ ÓÐÉÓËÕ ÎÁÂÏÒÏ× ËÌÀÞÅÊ. åÓÌÉ &ParmFile;
+ÎÁÞÉÎÁÅÔÓÑ Ó ÔÉÌØÄÙ É ÓÉÍ×ÏÌÁ ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ ÏÎÉ ÚÁÍÅÎÑÀÔÓÑ ÚÎÁÞÅÎÉÅÍ 
+ÄÏÍÁÛÎÅÇÏ ËÁÔÁÌÏÇÁ. åÓÌÉ ÉÍÑ ÆÁÊÌÁ ÎÅ ÓÏÄÅÒÖÉÔ ÓÉÍ×ÏÌÁ ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ
+ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ, ÞÔÏ ÆÁÊÌ ÎÁÈÏÄÉÔÓÑ × ÄÏÍÁÛÎÅÍ ËÁÔÁÌÏÇÅ GnuPG ("~/.gnupg"
+ÅÓÌÉ ÎÅ ÚÁÄÁÎÙ ÐÁÒÁÍÅÔÒ --homedir É ÐÅÒÅÍÅÎÎÁÑ $GNUPGHOME).
+</para><para>
+úÁÍÅÔØÔÅ, ÞÔÏ ÐÁÒÁÍÅÔÒ ÄÏÂÁ×ÌÑÅÔ Ó×ÑÚËÕ Ë ÔÅËÕÝÅÍÕ ÓÐÉÓËÕ. åÓÌÉ ÎÕÖÎÏ
+ÉÓÐÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ ÄÁÎÎÕÀ Ó×ÑÚËÕ ËÌÀÞÅÊ, ÔÏ ÐÁÒÁÍÅÔÒ ÓÌÅÄÕÅÔ ÚÁÄÁ×ÁÔØ
+ÓÏ×ÍÅÓÔÎÏ Ó --no-default-keyring.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--secret-keyring &ParmFile;</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --keyring ÎÏ ÄÌÑ ÎÁÂÏÒÏ× ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--primary-keyring &ParmFile;</term>
+<listitem><para>
+îÁÚÎÁÞÁÅÔ ÆÁÊÌ &ParmFile; ÇÌÁ×ÎÏÊ Ó×ÑÚËÏÊ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ. üÔÏ ÚÎÁÞÉÔ,
+ÞÔÏ ÎÏ×ÙÅ ÉÍÐÏÒÔÉÒÕÅÍÙÅ ËÌÀÞÉ (ÞÅÒÅÚ --import ÉÌÉ --recv-keys) ÂÕÄÕÔ
+ÄÏÂÁ×ÌÑÔØÓÑ × ÜÔÕ Ó×ÑÚËÕ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--trustdb-name &ParmFile;</term>
+<listitem><para>
+
+éÓÐÏÌØÚÏ×ÁÔØ &ParmFile; ×ÍÅÓÔÏ ÂÁÚÙ ÄÁÎÎÙÈ Ï ÄÏ×ÅÒÉÑÈ ÐÏ ÕÍÏÌÞÁÎÉÀ.
+åÓÌÉ &ParmFile; ÎÁÞÉÎÁÅÔÓÑ Ó ÔÉÌØÄÙ É ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ ÏÎÉ ÚÁÍÅÎÑÀÔÓÑ
+ÚÎÁÞÅÎÉÅÍ ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ $HOME. åÓÌÉ ÉÍÑ ÆÁÊÌÁ ÎÅ ÓÏÄÅÒÖÉÔ ËÏÓÏÊ
+ÞÅÒÔÙ, ÔÏ ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ, ÞÔÏ ÏΠÎÁÈÏÄÉÔÓÑ × ÄÏÍÁÛÎÅÍ ËÁÔÁÌÏÇÅ GnuPG
+("~/.gnupg", ÅÓÌÉ ÎÅ ÚÁÄÁÎÙ --homedir É $GNUPGHOME).
+
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--homedir &ParmDir;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÉÍÑ ÄÏÍÁÛÎÅÇÏ ËÁÔÁÌÏÇÁ ÒÁ×ÎÙÍ &ParmDir; 
+åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÕÓÔÁÎÏ×ÌÅÎ, ÔÏ ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ
+"~/.gnupg". éÇÎÏÒÉÒÕÅÔÓÑ × ÆÁÊÌÅ ÐÁÒÁÍÅÔÒÏ×.
+ðÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ $GNUPGHOME.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--display-charset &ParmName;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÉÓÐÏÌØÚÕÅÍÙÊ ÎÁÂÏÒ ÓÉÍ×ÏÌÏ×. éÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÉ
+ÎÅËÏÔÏÒÙÈ ÓÔÒÏË, ÔÁËÉÈ ËÁË ÉÄÅÎÔÉÆÉËÁÔÏÒÙ ÐÏÌØÚÏ×ÁÔÅÌÑ, × ËÏÄÉÒÏ×ËÕ
+UTF-8. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, ÔÏ ÎÁÂÏÒ ÓÉÍ×ÏÌÏ× ÏÐÒÅÄÅÌÑÅÔÓÑ ÐÏ 
+ÔÅËÕÝÅÊ ÌÏËÁÌÉ. îÁÂÏÒ ÓÉÍ×ÏÌÏ× ×Ù×ÏÄÉÔÓÑ ÐÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ 3È -v × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ.
+äÏÐÕÓÔÉÍÙÅ ÚÎÁÞÅÎÉÑ &ParmName;:</para>
+<variablelist>
+<varlistentry>
+<term>iso-8859-1</term><listitem><para>îÁÂÏÒ ÓÉÍ×ÏÌÏ× Latin 1.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>iso-8859-2</term><listitem><para>îÁÂÏÒ ÓÉÍ×ÏÌÏ× Latin 2.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>iso-8859-15</term><listitem><para>÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÐÓÅ×ÄÏÎÉÍ
+ÄÌÑ ÎÁÂÏÒÁ Latin 1.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>koi8-r</term><listitem><para>òÕÓÓËÁÑ ËÏÄÉÒÏ×ËÁ (rfc1489).</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>utf-8</term><listitem><para>îÅ ×ÙÐÏÌÎÑÔØ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ É
+ÐÏÌÁÇÁÔØ, ÞÔÏ OS ÉÓÐÏÌØÚÕÅÔ ËÏÄÉÒÏ×ËÕ UTF-8.</para></listitem>
+</varlistentry>
+</variablelist>
+</listitem></varlistentry>
+
+
+<varlistentry>
+<term>--utf8-strings</term>
+<term>--no-utf8-strings</term>
+<listitem><para>
+ðÏÌÁÇÁÔØ, ÞÔÏ ÁÒÇÕÍÅÎÔÙ ÚÁÄÁÎÙ ËÁË ÓÔÒÏËÉ × ËÏÄÉÒÏ×ËÅ UTF8. ðÏ ÕÍÏÌÞÁÎÉÀ
+(--no-utf8-strings), ÐÒÅÄÐÏÌÁÇÁÅÔÓÑ ÞÔÏ ÓÔÒÏËÉ ÚÁËÏÄÉÒÏ×ÁÎÙ × ÎÁÂÏÒÅ
+ÓÉÍ×ÏÌÏ× ÏÐÒÅÄÅÌ£ÎÎÏÍ ÐÁÒÁÍÅÔÒÏÍ --display-charset. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏËÁÚÙ×ÁÅÔ
+×ÌÉÑÎÉÅ ÎÁ ×ÓÅ ÐÏÓÌÅÄÕÀÝÉÅ ÁÒÇÕÍÅÎÔÙ. ïÂÁ ÐÁÒÁÍÅÔÒÁ ÍÏÇÕÔ ÐÒÉÓÕÔÓÔ×Ï×ÁÔØ
+× ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ÐÒÏÉÚ×ÏÌØÎÏÅ ÞÉÓÌÏ ÒÁÚ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--options &ParmFile;</term>
+<listitem><para>
+óÞÉÔÁÔØ ÐÁÒÁÍÅÔÒÙ ÉÚ ÆÁÊÌÁ &ParmFile; É ÎÅ ÐÙÔÁÔØÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ÆÁÊÌ ÐÏ
+ÕÍÏÌÞÁÎÉÀ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÇÎÏÒÉÒÕÅÔÓÑ ÅÓÌÉ ÏΠÕËÁÚÁΠנÆÁÊÌÅ
+ÐÁÒÁÍÅÔÒÏ×.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--no-options</term>
+<listitem><para>
+óÏËÒÁÝÅÎÉÅ ÄÌÑ "--options /dev/null".  äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÐÒÅÄÅÌÑÅÔÓÑ ÄÏ
+ÏÔËÒÙÔÉÑ ÆÁÊÌÁ ÐÁÒÁÍÅÔÒÏ×. ðÒÅÄÏÔ×ÒÁÝÁÅÔ, ÔÁËÖÅ, ÓÏÚÄÁÎÉÅ ËÁÔÁÌÏÇÁ
+"~./gnupg".
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--load-extension &ParmName;</term>
+<listitem><para>
+úÁÇÒÕÚÉÔØ ÍÏÄÕÌØ ÒÁÓÛÉÒÅÎÉÑ. åÓÌÉ &ParmName; ÎÅ ÓÏÄÅÒÖÉÔ ËÏÓÏÊ ÞÅÒÔÙ, ÔÏ
+ÍÏÄÕÌØ ÉÝÅÔÓÑ × ËÁÔÁÌÏÇÅ ÚÁÄÁÎÎÏÍ ÐÒÉ ËÏÍÐÉÌÑÃÉÉ (ÏÂÙÞÎÏ 
+"/usr/local/lib/gnupg"). òÁÓÛÉÒÅÎÉÑ, ËÁË ÐÒÁ×ÉÌÏ, ÂÏÌØÛÅ ÎÅ
+ÉÓÐÏÌØÚÕÀÔÓÑ, É ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÎÅ ÖÅÌÁÔÅÌØÎÏ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--debug &ParmFlags;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÏÔÌÁÄÏÞÎÙÅ ÆÌÁÇÉ. ÷ÓÅ ÆÌÁÇÉ ÏÂßÅÄÉÎÑÀÔÓÑ ÐÒÉ ÏÐÅÒÁÃÉÅÊ
+OR É &ParmFlags; ÍÏÖÅÔ ÂÙÔØ ÚÁÄÁΠנÓÔÉÌÅ C (ÎÁÐÒ., 0x0042).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--debug-all</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ×ÓÅ ÉÓÐÏÌØÚÕÅÍÙÅ ÏÔÌÁÄÏÞÎÙÅ ÆÌÁÇÉ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--debug-ccid-driver</term>
+<listitem><para>
+÷ËÌÀÞÉÔØ ×Ù×ÏÄ ÏÔÌÁÄÏÞÎÏÊ ÉÎÆÏÒÍÁÃÉÉ CCID ÄÒÁÊ×ÅÒÁ ÄÌÑ ÓÍÁÒÔËÁÒÔ.
+úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÏÓÔÕÐÅΠÎÅ ÎÁ ×ÓÅÈ ÓÉÓÔÅÍÁÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--enable-progress-filter</term>
+<listitem><para>
+÷ËÌÀÞÁÅÔ ×Ù×ÏÄ ÉÎÆÏÒÍÁÃÉÉ Ï ÈÏÄÅ ×ÙÐÏÌÎÅÎÉÑ ÒÁÂÏÔÙ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÐÏÚ×ÏÌÑÅÔ ÏÂÏÌÏÞËÁÍ ÏÔÏÂÒÁÖÁÔØ ÉÎÄÉËÁÔÏÒ ÐÒÏÇÒÅÓÓÁ ÐÒÉ ÏÂÒÁÂÏÔËÅ gpg
+ÂÏÌØÛÉÈ ÆÁÊÌÏ×. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÎÅÍÎÏÇÏ ÓÎÉÖÁÅÔÓÑ
+ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔØ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--status-fd &ParmN;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔØ ÓÔÒÏËÉ ÓÏÓÔÏÑÎÉÑ × ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ &ParmN;.
+óÍ. ÆÁÊÌ DETAILS × ÄÏËÕÍÅÎÔÁÃÉÉ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--logger-fd &ParmN;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔØ ÖÕÒÎÁÌ × ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ &ParmN;, Á ÎÅ ÎÁ ÓÔÁÎÄÁÒÔÎÙÊ ×Ù×ÏÄ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--attribute-fd &ParmN;</term>
+<listitem><para>
+÷Ù×ÏÄÉÔØ ÐÏÄÐÁËÅÔÙ ÁÔÒÉÂÕÔÏ× × ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ &ParmN;.  îÁÉÂÏÌÅÅ
+ÐÒÉÍÅÎÉÍÏ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÓÏ×ÍÅÓÔÎÏ Ó --status-fd, Ô.Ë. ÓÏÏÂÝÅÎÉÑ
+ÓÏÓÔÏÑÎÉÑ ÄÏÌÖÎÙ ÂÙÔØ ÏÔÄÅÌÅÎÙ ÏÔ ÒÁÚÌÉÞÎÙÈ ÐÏÄÐÁËÅÔÏ×.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--sk-comments</term>
+<term>--no-sk-comments</term>
+<listitem><para>
+üËÓÐÏÒÔÉÒÏ×ÁÔØ ÐÁËÅÔÙ ËÏÍÍÅÎÔÁÒÉÅ× ÄÌÑ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ ÐÒÉ ÜËÓÐÏÒÔÅ
+ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ. üÔÏ ÒÁÓÛÉÒÅÎÉÅ GnuPG ÓÔÁÎÄÁÒÔÁ OpenPGP. ïÔËÌÀÞÅÎÏ ÐÏ
+ÕÍÏÌÞÁÎÉÀ. úÁÍÅÔØÔÅ, ÞÔÏ ÜÔÏÔ ÐÁÒÁÍÅÔÒ ÎÅ ÉÍÅÅÔ ÎÉÞÅÇÏ ÏÂÝÅÇÏ Ó
+ËÏÍÍÅÎÔÁÒÉÑÍÉ × ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÑÈ É ÚÁÇÏÌÏ×ËÁÈ ASCII ÆÏÒÍÁÔÁ.
+--no-sk-comments ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--comment &ParmString;</term>
+<term>--no-comments</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ &ParmString; × ËÁÞÅÓÔ×Å ËÏÍÍÅÎÔÁÒÉÑ × ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÑÈ,
+ASCII ÚÁËÏÄÉÒÏ×ÁÎÎÙÈ ÓÏÏÂÝÅÎÉÑÈ É ËÌÀÞÁÈ (ÓÍ. --armor).
+ðÏ ÕÍÏÌÞÁÎÉÀ ÓÔÒÏËÁ ËÏÍÍÅÎÔÁÒÉÑ ÏÔÓÕÔÓÔ×ÕÅÔ. --comment ÍÏÖÅÔ ÂÙÔØ ÕËÁÚÁÎ
+ÎÅÓËÏÌØËÏ ÒÁÚ ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÎÅÓËÏÌØËÉÈ ÓÔÒÏË ËÏÍÍÅÎÔÁÒÉÅ×. --no-comments
+ÕÄÁÌÑÅÔ ×ÓÅ ËÏÍÍÅÎÔÁÒÉÉ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--emit-version</term>
+<term>--no-emit-version</term>
+<listitem><para>
+ðÒÉ×ÏÄÉÔ Ë ×ËÌÀÞÅÎÉÀ ÓÔÒÏËÉ ×ÅÒÓÉÉ × ×Ù×ÏÄ × ASCII ÆÏÒÍÁÔÅ.
+--no-emit-version ÏÔËÌÀÞÁÅÔ ÐÁÒÁÍÅÔÒ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--sig-notation &ParmNameValue;</term>
+<term>--cert-notation &ParmNameValue;</term>
+<term>-N, --set-notation &ParmNameValue;</term>
+<listitem><para>
+ðÏÍÅÓÔÉÔØ ÐÁÒÕ ÉÍÑ - ÚÎÁÞÅÎÉÅ × ÐÏÄÐÉÓØ, ËÁË ÐÒÉÍÅÞÁÎÉÅ.
+&ParmName; ÄÏÌÖÎÏ ÓÏÄÅÒÖÁÔØ ÔÏÌØËÏ ÐÅÞÁÔÎÙÅ ÓÉÍ×ÏÌÙ ÉÌÉ ÐÒÏÂÅÌÙ, É
+ÄÏÌÖÅΠÓÏÄÅÒÖÁÔØ ÓÉÍ×ÏÌ '@'. üÔÏ ÄÅÌÁÅÔÓÑ Ó ÃÅÌØÀ ÐÒÅÄÏÔ×ÒÁÔÉÔØ
+ÚÁÓÏÒÅÎÉÅ ÚÁÒÅÚÅÒ×ÉÒÏ×ÁÎÎÏÇÏ IETF ÐÒÏÓÔÒÁÎÓÔ×Á ÉÍ£Î. æÌÁÇ --expert
+ÏÔÍÅÎÑÅÔ ÐÒÏ×ÅÒËÕ ÎÁÌÉÞÉÑ '@'. &ParmValue; ÍÏÖÅÔ ÂÙÔØ ÌÀÂÏÊ ÐÅÞÁÔÎÏÊ
+ÓÔÒÏËÏÊ; ÜÔÁ ÓÔÒÏËÁ ÂÕÄÅÔ ÚÁËÏÄÉÒÏ×ÁÎÁ × UTF8, ÔÁË ÞÔÏ ÷ÁÍ ÓÌÅÄÕÅÔ
+ÐÒÏ×ÅÒÉÔØ ËÏÒÒÅËÔÎÏÓÔØ ÕÓÔÁÎÏ×ËÉ ÐÁÒÁÍÅÔÒÁ --display-charset. 
+åÓÌÉ ÷Ù ÐÒÅÄ×ÁÒÉÔÅ &ParmName; ×ÏÓËÌÉÃÁÔÅÌØÎÙÍ ÚÎÁËÏÍ (!), ÔÏ ÐÒÉÍÅÞÁÎÉÅ 
+ÂÕÄÅÔ ÐÏÍÅÞÅÎÏ ËÁË ËÒÉÔÉÞÅÓËÏÅ (rfc2440:5.2.3.15).
+--sig-notation ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÐÒÉÍÅÞÁÎÉÅ ÄÌÑ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ,
+--cert-notation ÄÌÑ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ (ÓÅÒÔÉÆÉËÁÃÉÉ), --set-notation
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÏÂÁ ÐÁÒÁÍÅÔÒÁ.
+</para>
+<para>
+éÍÅÀÔÓÑ ÓÐÅÃÉÁÌØÎÙÅ ËÏÄÙ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÐÒÉÍÅÞÁÎÉÑÈ. 
+"%k" ÂÕÄÅÔ ÚÁÍÅΣΠÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÐÏÄÐÉÓÙ×ÁÅÍÏÇÏ ËÌÀÞÁ, 
+"%K" - ÄÌÉÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÐÏÄÐÉÓÙ×ÁÅÍÏÇÏ ËÌÀÞÁ, 
+"%f" - ÏÔÐÅÞÁÔËÏÍ ÐÏÄÐÉÓÙ×ÁÅÍÏÇÏ ËÌÀÞÁ, 
+"%s" - ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ, 
+"%S" - ÄÌÉÎÎÙÍ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ËÌÀÞÁ ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ, 
+"%g" - ÏÔÐÅÞÁÔËÏÍ ËÌÀÞÁ (ÐÏÄËÌÀÞÁ) ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ,
+"%p" - ÏÔÐÅÞÁÔËÏÍ ÇÌÁ×ÎÏÇÏ ËÌÀÞÁ ËÌÀÞÁ ÉÓÐÏÌØÚÕÅÍÏÇÏ ÄÌÑ ÐÏÄÐÉÓÉ,
+"%c" - ÓÞ£ÔÞÉËÏÍ ÐÏÄÐÉÓÅÊ OpenPGP ÓÍÁÒÔËÁÒÔÙ,
+"%%" ÂÕÄÅÔ ÚÁÍÅΣΠÏÄÎÉÍ ÚÎÁËÏÍ "%". 
+%k, %K, É %f ÉÍÅÀÔ ÓÍÙÓÌ ÔÏÌØËÏ ÐÒÉ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ (ÓÅÒÔÉÆÉËÁÃÉÉ), Á %c
+ÔÏÌØËÏ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ OpenPGP ÓÍÁÒÔËÁÒÔÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--show-notation</term>
+<term>--no-show-notation</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ ÐÒÉÍÅÞÁÎÉÑ × ÐÏÄÐÉÓÑÈ ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ --list-sigs É 
+--check-sigs É ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ, ÓÏÄÅÒÖÁÝÉÈ ÐÒÉÍÅÞÁÎÉÑ. éÓÐÏÌØÚÏ×ÁÔØ
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ. éÓÐÏÌØÚÕÊÔÅ ×ÍÅÓÔÏ ÎÅÇÏ
+`--list-options [no-]show-notation' É/ÉÌÉ
+`--verify-options [no-]show-notation'.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--sig-policy-url &ParmString;</term>
+<term>--cert-policy-url &ParmString;</term>
+<term>--set-policy-url &ParmString;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ &ParmString; × ËÁÞÅÓÔ×Å URL ÐÏÌÉÔÉËÉ ÄÌÑ ÐÏÄÐÉÓÅÊ
+(rfc2440:5.2.3.19). åÓÌÉ ÷Ù ÐÒÅÄ×ÁÒÉÔÅ ÅÇÏ ×ÏÓËÌÉÃÁÔÅÌØÎÙÍ ÚÎÁËÏÍ (!), 
+ÔÏ ÐÁËÅÔ Ó URL ÂÕÄÅÔ ÐÏÍÅÞÅΠËÁË ËÒÉÔÉÞÅÓËÉÊ. --sig-policy-url
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ URL ÐÏÌÉÔÉËÉ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ, --cert-policy-url URL 
+ÐÏÌÉÔÉËÉ ÐÏÄÐÉÓÉ ËÌÀÞÅÊ (ÓÅÒÔÉÆÉËÁÃÉÉ), Á -set-policy-url 
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÏÂÁ ÐÁÒÁÍÅÔÒÁ.
+</para>
+<para>äÏÓÔÕÐÎÙ ÔÅ ÖÅ ÐÏÄÓÔÁÎÏ×ËÉ Ó '%', ÞÔÏ É ÄÌÑ ÐÒÉÍÅÞÁÎÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--show-policy-url</term>
+<term>--no-show-policy-url</term>
+<listitem><para>
+ðÏËÁÚÙ×ÁÔØ URL ÐÏÌÉÔÉË ÐÒÉ ×ÙÐÏÌÎÅÎÉÉ ËÏÍÁÎÄ --list-sigs É 
+--check-sigs É ÐÒÏ×ÅÒËÅ ÐÏÄÐÉÓÅÊ, ÓÏÄÅÒÖÁÝÉÈ URL ÐÏÌÉÔÉË. éÓÐÏÌØÚÏ×ÁÔØ
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ. éÓÐÏÌØÚÕÊÔÅ ×ÍÅÓÔÏ ÎÅÇÏ
+`--list-options [no-]show-policy-url' É/ÉÌÉ
+`--verify-options [no-]show-policy-url'.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--sig-keyserver-url &ParmString;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ &ParmString; × ËÁÞÅÓÔ×Å URL ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ
+× ÐÏÄÐÉÓÑÈ ÄÁÎÎÙÈ. åÓÌÉ ÷Ù ÐÒÅÄ×ÁÒÉÔÅ ÅÇÏ ×ÏÓËÌÉÃÁÔÅÌØÎÙÍ ÚÎÁËÏÍ, 
+ÔÏ ÐÁËÅÔ Ó URL ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ ÂÕÄÅÔ ÐÏÍÅÞÅΠËÁË ËÒÉÔÉÞÅÓËÉÊ.
+</para><para>
+äÏÓÔÕÐÎÙ ÔÅ ÖÅ ÐÏÄÓÔÁÎÏ×ËÉ Ó '%', ÞÔÏ É ÄÌÑ ÐÒÉÍÅÞÁÎÉÊ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--set-filename &ParmString;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ &ParmString; ËÁË ÉÍÑ ÆÁÊÌÁ, ÓÏÄÅÒÖÁÝÅÇÏÓÑ × ÓÏÏÂÝÅÎÉÉ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÅÊÓÔ×ÉÔÅÌØÎÏÅ ÉÍÑ ÚÁÛÉÆÒÏ×Ù×ÁÅÍÏÇÏ ÆÁÊÌÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--for-your-eyes-only</term>
+<term>--no-for-your-eyes-only</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ × ÓÏÏÂÝÅÎÉÉ ÆÌÁÇ `for your eyes only'. üÔÏ ÐÒÉ×ÏÄÉÔ Ë
+ÔÏÍÕ, ÞÔÏ GnuPG ÎÅ ÓÏÈÒÁÎÑÅÔ ÒÁÓÛÉÆÒÏ×ÁÎÎÙÊ ÆÁÊÌ ÅÓÌÉ ÎÅ ÕËÁÚÁΠÐÁÒÁÍÅÔÒ
+--output, Á PGP ÉÓÐÏÌØÚÕÅÔ "secure viewer" ÄÌÑ ×Ù×ÏÄÁ ÓÏÏÂÝÅÎÉÑ. äÁÎÎÙÊ
+ÐÁÒÁÍÅÔÒ ÐÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÁÒÁÍÅÔÒÁ --set-filename.
+--no-for-your-eyes-only ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry
+
+
+<varlistentry>
+<term>--use-embedded-filename</term>
+<term>--no-use-embedded-filename</term>
+<listitem><para>
+ðÏÐÙÔÁÔØÓÑ ÓÏÚÄÁÔØ ÆÁÊÌ Ó ÉÍÅÎÅÍ ÕËÁÚÁÎÎÙÍ × ÄÁÎÎÙÈ. íÏÖÅÔ ÂÙÔØ
+ÎÅÂÅÚÏÐÁÓÎÏÊ, Ô.Ë. ÐÏÚ×ÏÌÑÅÔ ÐÅÒÅÚÁÐÉÓÙ×ÁÔØ ÆÁÊÌÙ. ðÏ ÕÍÏÌÞÁÎÉÀ
+ÏÔËÌÀÞÅÎÏ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--completes-needed &ParmN;</term>
+<listitem><para>
+þÉÓÌÏ ÐÏÄÐÉÓÅÊ ÎÁ ËÌÀÞÅ, ÓÄÅÌÁÎÎÙÈ ÐÏÌØÚÏ×ÁÔÅÌÑÍÉ ËÏÔÏÒÙÍ ÷Ù ÐÏÌÎÏÓÔØÀ
+ÄÏ×ÅÒÑÅÔÅ, ÎÅÏÂÈÏÄÉÍÙÈ ÄÌÑ ÐÒÉÚÎÁÎÉÑ ËÌÀÞÁ ÄÏÓÔÏ×ÅÒÎÙÍ (ÐÏ ÕÍÏÌÞÁÎÉÀ 1). 
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--marginals-needed &ParmN;</term>
+<listitem><para>
+þÉÓÌÏ ÐÏÄÐÉÓÅÊ ÎÁ ËÌÀÞÅ, ÓÄÅÌÁÎÎÙÈ ÐÏÌØÚÏ×ÁÔÅÌÑÍÉ ËÏÔÏÒÙÍ ÷Ù ÄÏ×ÅÒÑÅÔÅ ÎÅ
+ÐÏÌÎÏÓÔØÀ, ÎÅÏÂÈÏÄÉÍÙÈ ÄÌÑ ÐÒÉÚÎÁÎÉÑ ËÌÀÞÁ ÄÏÓÔÏ×ÅÒÎÙÍ (ÐÏ ÕÍÏÌÞÁÎÉÀ 3).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--max-cert-depth &ParmN;</term>
+<listitem><para>
+íÁËÓÉÍÁÌØÎÁÑ ÄÌÉÎÁ ÃÅÐÏÞËÉ ÓÅÒÔÉÆÉËÁÃÉÉ (ÐÏ ÕÍÏÌÞÁÎÉÀ 5).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--cipher-algo &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ  &ParmName;. úÁÐÕÓË ÐÒÏÇÒÁÍÍÙ Ó
+ËÏÍÁÎÄÏÊ --version ×Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÁÌÇÏÒÉÔÍÏ× ÛÉÆÒÏ×ÁÎÉÑ.
+åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ, ÔÏ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ ×ÙÂÉÒÁÅÔÓÑ
+ÉÚ ÕËÁÚÁÎÎÙÈ × ÓÐÉÓËÅ ÐÒÅÄÐÏÞÔÅÎÉÊ ËÌÀÞÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--digest-algo &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÈÜÛ-ÆÕÎËÃÉÀ &ParmName;. úÁÐÕÓË ÐÒÏÇÒÁÍÍÙ Ó
+ËÏÍÁÎÄÏÊ --version ×Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÈÜÛ-ÆÕÎËÃÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--compress-algo &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ ÓÖÁÔÉÑ &ParmName;.  "zlib" ÄÌÑ ÁÌÇÏÒÉÔÍÁ ZLIB
+ÏÐÒÅÄÅÌ£ÎÎÏÇÏ × RFC1950. "zip" ÄÌÑ ÁÌÇÏÒÉÔÍÁ ZIP ÏÐÒÅÄÅÌ£ÎÎÏÇÏ × 
+RFC-1951 É ÉÓÐÏÌØÚÕÅÍÏÇÏ PGP. "bzip2" ÂÏÌÅÅ ÓÏ×ÒÅÍÅÎÎÙÊ ÁÌÇÏÒÉÔÍ 
+ÓÖÁÔÉÑ, ËÏÔÏÒÙÊ ÍÏÖÅÔ ÓÖÉÍÁÔØ × ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ ÌÕÞÛÅ, ÎÏ ÔÒÅÂÕÅÔ
+ÂÏÌØÛÅÇÏ ÏÂߣÍÁ ÐÁÍÑÔÉ. "uncompressed" ÉÌÉ "none" ÏÔËÌÀÞÁÅÔ
+ÓÖÁÔÉÅ. åÓÌÉ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅ ÚÁÄÁÎ, ÔÏ ÐÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ
+ÁÌÇÏÒÉÔÍ ÕËÁÚÁÎÎÙÊ × ËÌÀÞÅ ÐÏÌÕÞÁÔÅÌÑ × ËÁÞÅÓÔ×Å ÐÒÅÄÐÏÞÉÔÁÅÍÏÇÏ.
+åÓÌÉ ÏÐÒÅÄÅÌÉÔØ ÁÌÇÏÒÉÔÍ ÎÅ ÕÄÁ£ÔÓÑ, ÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ZIP ÄÌÑ ÄÏÓÔÉÖÅÎÉÑ
+ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ.
+</para><para>
+ZLIB ÏÂÅÓÐÅÞÉ×ÁÅÔ ÂÏÌØÛÅÅ ÓÖÁÔÉÅ, ÐÏ ÓÒÁ×ÎÅÎÉÀ Ó ZIP, Ô.Ë. ÎÅ
+ÏÇÒÁÎÉÞÉ×ÁÅÔ ÒÁÚÍÅÒ ÏËÎÁ ×ÅÌÉÞÉÎÏÊ 8ËÂÁÊÔ. BZIP2 ÄÁ£Ô ÅÝ£ ÌÕÞÛÉÅ
+ÒÅÚÕÌØÔÁÔÙ, ÎÏ ÉÓÐÏÌØÚÕÅÔ ÚÎÁÞÉÔÅÌØÎÏ ÂÏÌØÛÅ ÐÁÍÑÔÉ, ÞÔÏ ÍÏÖÅÔ ÂÙÔØ
+ÚÎÁÞÉÍÙÍ ÐÒÉ ÏÇÒÁÎÉÞÅÎÎÏÍ ÏÂߣÍÅ ÐÁÍÑÔÉ. úÁÍÅÔÉÍ, ÏÄÎÁËÏ, ÞÔÏ PGP (×ÓÅ
+×ÅÒÓÉÉ) ÐÏÄÄÅÒÖÉ×ÁÅÔ ÔÏÌØËÏ ZIP. éÓÐÏÌØÚÏ×ÁÎÉÅ ÁÌÇÏÒÉÔÍÏ× ÏÔÌÉÞÎÙÈ ÏÔ
+ZIP ÉÌÉ "none" ÄÅÌÁÅÔ ÓÏÏÂÝÅÎÉÅ ÎÅÞÉÔÁÂÅÌØÎÙÍ ÄÌÑ PGP.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--cert-digest-algo &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÈÜÛ-ÆÕÎËÃÉÀ &ParmName; ÐÒÉ ÐÏÄÐÉÓÉ ËÌÀÞÁ. úÁÐÕÓË ÐÒÏÇÒÁÍÍÙ Ó
+ËÏÍÁÎÄÏÊ --version ×Ù×ÏÄÉÔ ÓÐÉÓÏË ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ ÈÜÛ-ÆÕÎËÃÉÊ. âÕÄØÔÅ
+ÏÓÔÏÒÏÖÎÙ, Ô.Ë. ÅÓÌÉ ÷Ù ×ÙÂÅÒÅÔÅ ÁÌÇÏÒÉÔÍ ÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ GnuPG, ÎÏ ÎÅ
+ÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ ÄÒÕÇÉÍÉ ÒÅÁÌÉÚÁÃÉÑÍÉ OpenPGP, ÔÏ ÎÅËÏÔÏÒÙÅ ÐÏÌØÚÏ×ÁÔÅÌÉ
+ÎÅ ÓÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÄÅÌÁÎÎÕÀ ÷ÁÍÉ ÐÏÄÐÉÓØ, ÉÌÉ ÄÁÖÅ ×ÅÓØ ËÌÀÞ. 
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--s2k-cipher-algo &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÚÁÝÉÔÙ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ &ParmName;.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ CAST5. äÁÎÎÙÊ ÁÌÇÏÒÉÔÍ ÉÓÐÏÌØÚÕÅÔÓÑ, ÔÁËÖÅ,
+ÄÌÑ ÓÉÍÍÅÔÒÉÞÎÏÇÏ ÛÉÆÒÏ×ÁÎÉÑ, × ÓÌÕÞÁÅ ÅÓÌÉ ÎÅ ÚÁÄÁÎÙ ÐÁÒÁÍÅÔÒÙ
+--personal-cipher-preferences É --cipher-algo.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--s2k-digest-algo &ParmName;</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÈÜÛ-ÆÕÎËÃÉÀ  &ParmName; ÄÌÑ ÏÂÒÁÂÏÔËÉ ËÌÀÞÅ×ÏÊ ÆÒÁÚÙ
+(ÐÁÒÏÌÑ). ðÏ ÕÍÏÌÞÁÎÉÀ ÉÓÐÏÌØÚÕÅÔÓÑ SHA-1. 
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--s2k-mode &ParmN;</term>
+<listitem><para>
+ïÐÒÅÄÅÌÑÅÔ ÍÅÔÏÄ ÏÂÒÁÂÏÔËÉ ËÌÀÞÅ×ÏÊ ÆÒÁÚÙ (ÐÁÒÏÌÑ). åÓÌÉ &ParmN; ÒÁ×ÅΠ0, ÔÏ
+ËÌÀÞÅ×ÁÑ ÆÒÁÚÁ ÎÅ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ (ÎÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ), ÅÓÌÉ 1, ÔÏ Ë ËÌÀÞÅ×ÏÊ 
+ÆÒÁÚÅ ÄÏÂÁ×ÌÑÅÔÓÑ "ÓÏÌØ" (ÓÌÕÞÁÊÎÙÅ ÄÁÎÎÙÅ) É ÅÓÌÉ 3 (ÉÓÐÏÌØÚÕÅÔÓÑ ÐÏ
+ÕÍÏÌÞÁÎÉÀ), ÔÏ ×ÅÓØ ÐÒÏÃÅÓÓ ÐÏ×ÔÏÒÑÅÔÓÑ ÎÅÓËÏÌØËÏ ÒÁÚ. åÓÌÉ ÎÅ ÚÁÄÁΠ
+ÐÁÒÁÍÅÔÒ --rfc1991, ÔÏ ÄÁÎÎÙÊ ÒÅÖÉÍ ÉÓÐÏÌØÚÕÅÔÓÑ É ÐÒÉ ÓÉÍÍÅÔÒÉÞÎÏÍ ÛÉÆÒÏ×ÁÎÉÉ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--simple-sk-checksum</term>
+<listitem><para>
+ãÅÌÏÓÔÎÏÓÔØ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ ÚÁÝÉÝÁÅÔÓÑ ÐÒÉ ÐÏÍÏÝÉ ËÏÎÔÒÏÌØÎÏÊ ÓÕÍÍÙ
+SHA-1. äÁÎÎÙÊ ÍÅÔÏÄ Ñ×ÌÑÅÔÓÑ ÞÁÓÔØÀ ÒÁÓÛÉÒÅÎÎÏÊ ÓÐÅÃÉÆÉËÁÃÉÉ
+OpenPGP, ÎÏ GnuPG ÕÖÅ ÉÓÐÏÌØÚÕÅÔ ÅÇÏ × ËÁÞÅÓÔ×Å ËÏÎÔÒÍÅÒÙ ÐÒÏÔÉ×
+ÎÅËÏÔÏÒÙÈ ÁÔÁË. óÔÁÒÙÅ ÐÒÉÌÏÖÅÎÉÑ ÎÅ ÐÏÎÉÍÁÀÔ ÎÏ×ÙÊ ÆÏÒÍÁÔ, É ÄÁÎÎÙÊ
+ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÅÒÅÄÁÞÉ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ ÔÁËÉÍ
+ÐÒÉÌÏÖÅÎÉÑÍ. éÓÐÏÌØÚÏ×ÁÎÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÒÉÓËÏ×ÁÎÏ Ó ÔÏÞËÉ ÚÒÅÎÉÑ
+ÂÅÚÏÐÁÓÎÏÓÔÉ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÁÒÁÍÅÔÒ ÏËÁÚÙ×ÁÅÔ ÜÆÆÅËÔ ÔÏÌØËÏ ÐÒÉ
+ÛÉÆÒÏ×ÁÎÉÉ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ, ÐÒÏÓÔÅÊÛÉÊ ÓÐÏÓÏ ÄÏÂÉÔØÓÑ ÜÔÏÇÏ - ÓÍÅÎÉÔØ
+ÐÁÒÏÌØ ÎÁ ËÌÀÞÅ (ÐÕÓÔØ ÄÁÖÅ ÎÁ ÔÏÔ ÖÅ ÓÁÍÙÊ).
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--disable-cipher-algo &ParmName;</term>
+<listitem><para>
+îÉËÏÇÄÁ ÎÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ &ParmName;. úÁÄÁÎÎÏÅ ÉÍÑ ÎÅ
+ÐÒÏ×ÅÒÑÅÔÓÑ, ÐÏÜÔÏÍÕ ÁÌÇÏÒÉÔÍ ÚÁÇÒÕÖÅÎÎÙÊ ÐÏÚÖÅ ÏÓÔÁÎÅÔÓÑ ÏÔËÌÀÞÅÎÎÙÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--disable-pubkey-algo &ParmName;</term>
+<listitem><para>
+îÉËÏÇÄÁ ÎÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÌÇÏÒÉÔÍ Ó ÏÔËÒÙÔÙÍ ËÌÀÞÏÍ &ParmName;. úÁÄÁÎÎÏÅ 
+ÉÍÑ ÎÅ ÐÒÏ×ÅÒÑÅÔÓÑ, ÐÏÜÔÏÍÕ ÁÌÇÏÒÉÔÍ ÚÁÇÒÕÖÅÎÎÙÊ ÐÏÚÖÅ ÏÓÔÁÎÅÔÓÑ 
+ÏÔËÌÀÞÅÎÎÙÍ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-sig-cache</term>
+<listitem><para>
+îÅ ËÜÛÉÒÏ×ÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ÓÏÓÔÏÑÎÉÉ ÐÒÏ×ÅÒËÉ ÐÏÄÐÉÓÅÊ. ëÜÛÉÒÏ×ÁÎÉÅ
+ÚÎÁÞÉÔÅÌØÎÏ Õ×ÅÌÉÞÉ×ÁÅÔ ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔØ ÐÒÉ ×Ù×ÏÄÅ ÓÐÉÓËÁ ËÌÀÞÅÊ.
+ïÄÎÁËÏ, ÅÓÌÉ ÷Ù ÓÏÍÎÅ×ÁÅÔÅÓØ × ÚÁÝÉÝÅÎÎÏÓÔÉ ÷ÁÛÅÇÏ ÎÁÂÏÒÁ ÏÔËÒÙÔÙÈ
+ËÌÀÞÅÊ ÏÔ ÉÚÍÅÎÅÎÉÊ, ÔÏ ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÌÑ
+ÏÔËÌÀÞÅÎÉÑ ËÜÛÉÒÏ×ÁÎÉÑ. ÷ÅÒÏÑÔÎÏ ÄÁÎÎÁÑ ÏÐÅÒÁÃÉÑ ÌÉÛÅÎÁ ÏÓÏÂÏÇÏ ÓÍÙÓÌÁ,
+ÐÏÓËÏÌØËÕ ÅÓÌÉ ËÔÏ-ÌÉÂÏ ÉÍÅÅÔ ÄÏÓÔÕРÎÁ ÚÁÐÉÓØ × ÷ÁÛ ÎÁÂÏÒ ÏÔËÒÙÔÙÈ
+ËÌÀÞÅÊ, ÔÏ ÏΠÍÏÖÅÔ ×ÙÐÏÌÎÉÔØ ÌÀÂÙÅ ×ÉÄÙ ÐÏ×ÒÅÖÄÅÎÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-sig-create-check</term>
+<listitem><para>
+GnuPG, ËÁË ÐÒÁ×ÉÌÏ, ÐÒÏ×ÅÒÑÅÔ ËÁÖÄÕÀ ÐÏÄÐÉÓØ ÐÏÓÌŠţ ÓÏÚÄÁÎÉÑ ÄÌÑ
+ÚÁÝÉÔÙ ÏÔ ÏÛÉÂÏË É ÓÂÏÅ× ÁÐÐÁÒÁÔÎÏÊ ÞÁÓÔÉ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÐÒÉ×ÅÓÔÉ Ë
+ÉÚÍÅÎÅÎÉÀ ÂÉÔÏ× ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ. üÔÁ ÄÏÐÏÌÎÉÔÅÌØÎÁÑ ÐÒÏ×ÅÒËÁ ÚÁÎÉÍÁÅÔ
+ÎÅËÏÔÏÒÏÅ ×ÒÅÍÑ (ÏËÏÌÏ 115% ÄÌÑ DSA ËÌÀÞÅÊ). äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÔËÌÀÞÅÎÉÑ ÐÒÏ×ÅÒËÉ. ïÄÎÁËÏ, ÐÏÓËÏÌØËÕ ÓÏÚÄÁÎÉÅ ÐÏÄÐÉÓÉ
+ÐÒÏÉÓÈÏÄÉÔ × ÉÎÔÅÒÁËÔÉ×ÎÏÍ ÒÅÖÉÍÅ, ×ÙÉÇÒÙÛ ×ÒÅÍÅÎÉ ÏÔ ÕÓÔÁÎÏ×ËÉ ÄÁÎÎÏÇÏ
+ÐÁÒÁÍÅÔÒÁ ÂÕÄÅÔ ÎÅÚÁÍÅÔÅΠנÂÏÌØÛÉÎÓÔ×Å ËÏÎÆÉÇÕÒÁÃÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--auto-check-trustdb</term>
+<term>--no-auto-check-trustdb</term>
+<listitem><para>
+åÓÌÉ GnuPG ÐÏÌÁÇÁÅÔ, ÞÔÏ ÉÎÆÏÒÍÁÃÉÑ × ÓÅÔÉ ÄÏ×ÅÒÉÑ ÄÏÌÖÎÁ ÂÙÔØ
+ÏÂÎÏ×ÌÅÎÁ, ÔÏ ÏΠÁ×ÔÏÍÁÔÉÞÅÓËÉ ×ÙÐÏÌÎÑÅÔ ËÏÍÁÎÄÕ --check-trustdb. 
+ðÒÏÃÅÓÓ ÏÂÎÏ×ÌÅÎÉÑ ÍÏÖÅÔ ÚÁÎÉÍÁÔØ ÎÅËÏÔÏÒÏÅ ×ÒÅÍÑ.
+--no-auto-check-trustdb ÏÔËÌÀÞÁÅÔ Á×ÔÏÍÁÔÉÞÅÓËÕÀ ÐÒÏ×ÅÒËÕ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--throw-keyids</term>
+<term>--no-throw-keyids</term>
+<listitem><para>
+îÅ ÐÏÍÅÝÁÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ × ÚÁÛÉÆÒÏ×ÁÎÎÙÊ ÐÁËÅÔ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÓËÒÙ×ÁÅÔ ÐÏÌÕÞÁÔÅÌÑ ÓÏÏÂÝÅÎÉÑ É Ñ×ÌÑÅÔÓÑ ËÏÎÔÒÍÅÒÏÊ ÐÒÏÔÉ× ÁÎÁÌÉÚÁ
+ÔÒÁÆÆÉËÁ. òÁÓÛÉÆÒÏ×ËÁ ÓÏÏÂÝÅÎÉÑ ÍÏÖÅÔ ÐÒÏÉÓÈÏÄÉÔØ ÍÅÄÌÅÎÎÅÅ, ÐÏÓËÏÌØËÕ
+GnuPG ÂÕÄÅÔ ÐÙÔÁÔØÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ×ÓÅ ÄÏÓÔÕÐÎÙÅ ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ ÄÏ
+ÎÁÈÏÖÄÅÎÉÑ ÐÒÁ×ÉÌØÎÏÇÏ. --no-throw-keyids ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ
+ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--not-dash-escaped</term>
+<listitem><para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÉÚÍÅÎÑÅÔ ÐÒÁ×ÉÌÁ ÓÏÚÄÁÎÉÑ ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÅÊ ÔÁËÉÍ
+ÏÂÒÁÚÏÍ, ÞÔÏ ÏÎÉ ÍÏÇÕÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÁÔÞÅÊ. ÷Ù ÎÅ ÄÏÌÖÎÙ ÐÏÓÙÌÁÔØ
+ÔÁËÉÅ ÆÁÊÌÙ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÏÊ, Ô.Ë. ÐÒÉ ÐÏÄÐÉÓÉ ÕÞÉÔÙ×ÁÀÔÓÑ ×ÓÅ 
+ÐÒÏÂÅÌÙ É ÓÉÍ×ÏÌÙ ÐÅÒÅ×ÏÄÁ ÓÔÒÏËÉ. ÷Ù ÎÅ ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ
+ÐÁÒÁÍÅÔÒ ÄÌÑ ÄÁÎÎÙÈ ÓÏÄÅÒÖÁÝÉÈ ÓÔÒÏËÉ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó ÐÑÔÉ ÄÅÆÉÓÏ×.
+÷ ÎÁÞÁÌÏ ÐÏÄÐÉÓÉ ÄÏÂÁ×ÌÑÅÔÓÑ ÓÐÅÃÉÁÌØÎÙÊ ÚÁÇÏÌÏ×ÏË, ÕËÁÚÙ×ÁÀÝÉÊ GnuPG ÎÁ
+ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--escape-from-lines</term>
+<term>--no-escape-from-lines</term>
+<listitem><para>
+ðÏÓËÏÌØËÕ ÍÎÏÇÉÅ ÐÏÞÔÏ×ÙÅ ÁÇÅÎÔÙ ÍÅÎÑÀÔ "From " × ÎÁÞÁÌÅ ÓÔÒÏË ÎÁ 
+"&#60;From ", ÔÏ ÒÁÚÕÍÎÏ ÏÂÒÁÂÁÔÙ×ÁÔØ ÔÁËÉÅ ÓÔÒÏËÉ ÏÓÏÂÙÍ ÏÂÒÁÚÏÍ ÐÒÉ
+ÓÏÚÄÁÎÉÉ ÐÒÏÚÒÁÞÎÙÈ ÐÏÄÐÉÓÅÊ ÄÌÑ ÐÒÅÄÏÔ×ÒÁÝÅÎÉÑ ÏÛÉÂÏË ÐÒÉ ÐÒÏ×ÅÒËÅ
+ÐÏÄÐÉÓÅÊ. úÁÍÅÔÉÍ, ÞÔÏ ×ÓÅ ÐÒÏÞÉÅ ÒÅÁÌÉÚÁÃÉÉ PGP ÐÏÓÔÕÐÁÀÔ ÔÁËÉÍ
+ÖÅ ÏÂÒÁÚÏÍ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ×ËÌÀÞÅΠÐÏ ÕÍÏÌÞÁÎÉÀ.
+--no-escape-from-lines ÐÏÚ×ÏÌÑÅÔ ÏÔËÌÀÞÉÔØ ÜÔÏÔ ÐÁÒÁÍÅÔÒ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--passphrase-fd &ParmN;</term>
+<listitem><para>
+óÞÉÔÁÔØ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ ÉÚ ÆÁÊÌÁ Ó ÄÅÓËÒÉÐÔÏÒÏÍ &ParmN;. åÓÌÉ ÷Ù
+ÉÓÐÏÌØÚÕÅÔÅ 0 ÄÌÑ &ParmN;, ÔÏ ÐÁÒÏÌØ ÂÕÄÅÔ ÓÞÉÔÁΠÓÏ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ.
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÓÌÕÞÁÅ ÅÓÌÉ ÔÒÅÂÕÅÔÓÑ ÔÏÌØËÏ ÏÄÎÁ
+ËÌÀÞÅ×ÁÑ ÆÒÁÚÁ. îÅ ÉÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÅÓÌÉ ÍÏÖÅÔÅ ÉÚÂÅÖÁÔØ
+ÜÔÏÇÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--command-fd &ParmN;</term>
+<listitem><para>
+üÔÏ ÚÁÍÅÎÁ ÄÌÑ ÎÅÒÅËÏÍÅÎÄÕÅÍÏÇÏ ÒÅÖÉÍÁ ÒÁÚÄÅÌÑÅÍÏÊ ÐÁÍÑÔÉ IPC. åÓÌÉ
+ÐÁÒÁÍÅÔÒ ÚÁÄÁÎ, ÔÏ ××ÏÄ ËÏÍÁÎÄ ÐÏÌØÚÏ×ÁÔÅÌÑ ÓÞÉÔÙ×ÁÅÔÓÑ ÎÅ Ó ÔÅÒÍÉÎÁÌÁ,
+Á ÉÚ ÆÁÊÌÁ Ó ÕËÁÚÁÎÎÙÍ ÄÅÓËÒÉÐÔÏÒÏÍ. òÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ
+ÓÏ×ÍÅÓÔÎÏ × --status-fd. óÍ. ÆÁÊÌ doc/DETAILS × ÉÓÈÏÄÎÏÍ ÄÉÓÔÒÉÂÕÔÉ×Å
+ÄÌÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÇÏ ÏÐÉÓÁÎÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--use-agent</term>
+<term>--no-use-agent</term>
+<listitem><para>ðÙÔÁÔØÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ GnuPG-Agent. úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÁÇÅÎÔ
+ÎÁÈÏÄÉÔÓÑ × ÓÔÁÄÉÉ ÒÁÚÒÁÂÏÔËÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÕÓÔÁÎÏ×ÌÅÎ, ÔÏ GnuPG
+ÓÎÁÞÁÌÁ ÐÙÔÁÅÔÓÑ ÐÏÄËÌÀÞÉÔØÓÑ Ë ÁÇÅÎÔÕ, Á ÅÓÌÉ ÜÔÏ ÎÅ ÕÄÁ£ÔÓÑ, ÔÏ
+ÚÁÐÒÁÛÉ×ÁÅÔ ÐÁÒÏÌØ. --no-use-agent ÏÔËÌÀÞÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÁÇÅÎÔÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--gpg-agent-info</term>
+<listitem><para>
+ðÅÒÅËÒÙ×ÁÅÔ ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ
+<literal>GPG_AGENT_INFO</literal>. 
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÐÒÉ ×ËÌÀÞÅÎÎÏÍ ÐÁÒÁÍÅÔÒÅ --use-agent.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>ðÁÒÁÍÅÔÒÙ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ</term>
+<listitem><para>
+üÔÉ ÐÁÒÁÍÅÔÒÙ ÕÐÒÁ×ÌÑÀÔ ÓÏ×ÍÅÓÔÉÍÏÓÔØÀ GnuPG Ó ÄÒÕÇÉÍÉ ÒÅÁÌÉÚÁÃÉÑÍÉ.
+ôÏÌØËÏ ÏÄÉΠÉÚ ÜÔÉÈ ÐÁÒÁÍÅÔÒÏ× ÍÏÖÅÔ ÂÙÔØ ÁËÔÉ×ÅÎ. úÁÍÅÔØÔÅ, ÞÔÏ
+ÕÓÔÁÎÏ×ËÉ ÉÓÐÏÌØÚÕÅÍÙÅ ÐÏ ÕÍÏÌÞÁÎÉÀ ÐÒÁËÔÉÞÅÓËÉ ×ÓÅÇÄÁ ËÏÒÒÅËÔÎÙ. ðÅÒÅÄ
+ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÌÀÂÏÇÏ ÉÚ ÜÔÉÈ ÐÁÒÁÍÅÔÒÏ× ÏÚÎÁËÏÍØÔÅÓØ Ó ÒÁÚÄÅÌÏÍ 
+÷úáéíïäåêóô÷éå ó äòõçéíé ðòïçòáííáíé OPENPGP ÎÉÖÅ × ÄÁÎÎÏÍ ÒÕËÏ×ÏÄÓÔ×Å.
+<variablelist>
+
+<varlistentry>
+<term>--gnupg</term>
+<listitem><para>
+éÓÐÏÌØÚÏ×ÁÔØ ÓÔÁÎÄÁÒÔÎÙÅ ÕÓÔÁÎÏ×ËÉ GnuPG. ÷ ÓÕÝÎÏÓÔÉ, ÜÔÏ ÕÓÔÁÎÏ×ËÉ
+OpenPGP (ÓÍ. --openpgp), ÎÏ Ó ÎÅËÏÔÏÒÙÍÉ ÄÏÐÏÌÎÉÔÅÌØÎÙÍÉ ÐÁÒÁÍÅÔÒÁÍÉ ÄÌÑ
+ÒÅÛÅÎÉÑ ÏÂÝÉÈ ÐÒÏÂÌÅÍ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó ÒÁÚÌÉÞÎÙÍÉ ×ÅÒÓÉÑÍÉ PGP. üÔÏ
+ÐÁÒÁÍÅÔÒ ÉÓÐÏÌØÚÕÅÍÙÊ ÐÏ ÕÍÏÌÞÁÎÉÀ É, × ÏÂÝÅÍ ÓÌÕÞÁÅ, ÎÅÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ
+Ñ×ÎÏ ÅÇÏ ÕËÁÚÙ×ÁÔØ, ÎÏ ÏΠÍÏÖÅÔ ÂÙÔØ ÐÏÌÅÚÅΠÄÌÑ ÏÔÍÅÎÙ ÄÒÕÇÏÇÏ
+ÐÁÒÁÍÅÔÒÁ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ, ÚÁÄÁÎÎÏÇÏ × ÆÁÊÌÅ ËÏÎÆÉÇÕÒÁÃÉÉ gpg.conf.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--openpgp</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ×ÓÅ ÐÁÒÁÍÅÔÒÙ ÐÁËÅÔÏ×, ÛÉÆÒÏ× É ÈÜÛ-ÆÕÎËÃÉÊ ÓÔÒÏÇÏ × 
+ÓÏÏÔ×ÅÔÓÔ×ÉÉ ÓÏ ÓÔÁÎÄÁÒÔÏÍ OpenPGP. éÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÌÑ
+ÓÂÒÏÓÁ ×ÓÅÈ ÐÒÅÄÙÄÕÝÉÈ ÐÁÒÁÍÅÔÒÏ×, ÔÁËÉÈ ËÁË --rfc1991,
+--force-v3-sigs, --s2k-*, --cipher-algo, --digest-algo É
+--compress-algo × ÚÎÁÞÅÎÉÑ ÓÏ×ÍÅÓÔÉÍÙÅ Ó OpenPGP. ÷ÓÅ ÉÓÐÒÁ×ÌÅÎÉÑ ÄÌÑ
+ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP ÂÕÄÕÔ ÏÔËÌÀÞÅÎÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--rfc2440</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ×ÓÅ ÐÁÒÁÍÅÔÒÙ ÐÁËÅÔÏ×, ÛÉÆÒÏ× É ÈÜÛ-ÆÕÎËÃÉÊ ÓÔÒÏÇÏ × 
+ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó RFC-2440.
+÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÁÎÁÌÏÇÉÞÅΠÐÁÒÁÍÅÔÒÕ --openpgp.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--rfc1991</term>
+<listitem><para>
+âÙÔØ ÂÏÌÅÅ ÓÏ×ÍÅÓÔÉÍÙÍ Ó RFC1991 (PGP 2.x).
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--pgp2</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 2.x.
+åÓÌÉ ×ÙÐÏÌÎÑÅÍÙÅ ÄÅÊÓÔ×ÉÑ ÐÒÉ×ÏÄÑÔ Ë ÓÏÚÄÁÎÉÀ ÓÏÏÂÝÅÎÉÑ ËÏÔÏÒÏÅ ÎÅ ÍÏÖÅÔ
+ÂÙÔØ ÏÂÒÁÂÏÔÁÎÏ PGP 2.x (ÎÁÐÒ., ÛÉÆÒÏ×ÁÎÉÅ ÎÅ RSA ËÌÀÞÏÍ), ÔÏ ×ÙÄÁ£ÔÓÑ
+ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÅ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ. úÁÍÅÔÉÍ, ÞÔÏ ÐÏÄ `PGP 2.x' ÚÄÅÓØ
+ÐÏÄÒÁÚÕÍÅ×ÁÅÔÓÑ ÒÅÁÌÉÚÁÃÉÑ 'MIT PGP 2.6.2'.
+</para><para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅÑ×ÎÏ ÐÒÅÄÐÏÌÁÇÁÅÔ
+`--rfc1991 --disable-mdc --no-force-v4-certs --no-sk-comment 
+--escape-from-lines --force-v3-sigs --no-ask-sig-expire 
+--no-ask-cert-expire --cipher-algo IDEA --digest-algo MD5 
+--compress-algo 1'. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ,
+ÔÁËÖÅ, ÏÔËÌÀÞÁÅÔÓÑ --textmode ÐÒÉ ÚÁÛÉÆÒÏ×ÁÎÉÉ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--pgp6</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 6.
+üÔÏ ÏÇÒÁÎÉÞÉ×ÁÅÔ ÎÁÂÏÒÙ ÓÉÍÍÅÔÒÉÞÎÙÈ ÁÌÇÏÒÉÔÍÏ× IDEA, 3DES É CAST5,
+ÈÜÛ-ÆÕÎËÃÉÊ MD5, SHA1 É RIPEMD160 É ÁÌÇÏÒÉÔÍÏ× ÓÖÁÔÉÑ ZIP É ÂÅÚ ÓÖÁÔÉÑ.
+ðÁÒÁÍÅÔÒ ÏÔËÌÀÞÁÅÔ, ÔÁËÖÅ, --throw-keyids É ÓÏÚÄÁÎÉÅ ÐÏÄÐÉÓÅÊ 
+ÐÏÄÐÉÓÙ×ÁÀÝÉÍÉ ÐÏÄËÌÀÞÁÍÉ, Ô.Ë. PGP 6 ÎÅ ÒÁÓÐÏÚÎÁ£Ô ÔÁËÉÅ ÐÏÄÐÉÓÉ.
+</para><para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÎÅÑ×ÎÏ ÐÒÅÄÐÏÌÁÇÁÅÔ
+ `--disable-mdc --no-sk-comment --escape-from-lines
+--force-v3-sigs --no-ask-sig-expire'.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--pgp7</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 7.
+éÄÅÎÔÉÞÅΠ--pgp6, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÔÏÇÏ, ÞÔÏ ÎÅ ÏÔËÌÀÞÁÀÔÓÑ MDC É ÓÐÉÓÏË
+ÄÏÐÕÓÔÉÍÙÈ ÛÉÆÒÏ× ÄÏÐÏÌÎÑÅÔÓÑ  AES128, AES192, AES256, É TWOFISH.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--pgp8</term>
+<listitem><para>
+õÓÔÁÎÁ×ÌÉ×ÁÅÔ ×ÓÅ ÐÁÒÁÍÅÔÒÙ × ÒÅÖÉÍ ÍÁËÓÉÍÁÌØÎÏÊ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ Ó PGP 8.
+PGP 8 ÚÎÁÞÉÔÅÌØÎÏ ÂÌÉÖÅ Ë ÓÔÁÎÄÁÒÔÕ OpenPGP, ÞÅÍ ×ÓÅ ÐÒÅÄÙÄÕÝÉÅ ×ÅÒÓÉÉ
+PGP, ÔÁË ÞÔÏ ×Ó£ ÞÔÏ ÄÅÌÁÅÔ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ - ÜÔÏ ÏÔËÌÀÞÁÅÔ --throw-keyids 
+É ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ --escape-from-lines. äÏÐÕÓËÁÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÌÀÂÙÈ
+ÁÌÇÏÒÉÔÍÏ×, ËÒÏÍÅ ÈÜÛ-ÆÕÎËÃÉÊ SHA-384 É SHA-512.
+</para></listitem></varlistentry>
+
+</variablelist></para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--force-v3-sigs</term>
+<term>--no-force-v3-sigs</term>
+<listitem><para>
+óÔÁÎÄÁÒÔ OpenPGP ÒÅËÏÍÅÎÄÕÅÔ, ÞÔÏÂÙ ÐÒÉÌÏÖÅÎÉÑ ÇÅÎÅÒÉÒÏ×ÁÌÉ ÐÏÄÐÉÓÉ v4,
+ÎÏ PGP ×ÅÒÓÉÊ 5, 6 É 7 ÒÁÓÐÏÚÎÁ£Ô ÔÁËÉÅ ÐÏÄÐÉÓÉ ÔÏÌØËÏ ÎÁ ËÌÀÞÁÈ. äÁÎÎÙÊ
+ÐÁÒÁÍÅÔÒ ÐÒÉÎÕÖÄÁÅÔ GnuPG ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÑ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ ÐÏÄÐÉÓÉ v3.
+úÁÍÅÔØÔÅ, ÞÔÏ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÔÍÅÎÑÅÔ --ask-sig-expire, Ô.Ë. v3 ÐÏÄÐÉÓÉ
+ÎÅ ÉÍÅÀÔ ÓÒÏËÁ ÄÅÊÓÔ×ÉÑ. --no-force-v3-sigs ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ
+ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--force-v4-certs</term>
+<term>--no-force-v4-certs</term>
+<listitem><para>
+÷ÓÅÇÄÁ ÉÓÐÏÌØÚÏ×ÁÔØ v4 ÐÏÄÐÉÓÉ ÎÁ ËÌÀÞÁÈ, ÄÁÖÅ ÅÓÌÉ ÜÔÏ v3 ËÌÀÞÉ. äÁÎÎÙÊ
+ÐÁÒÁÍÅÔÒ, ËÒÏÍÅ ÔÏÇÏ, ÍÅÎÑÅÔ ÉÓÐÏÌØÚÕÅÍÕÀ ÐÏ ÕÍÏÌÞÁÎÉÀ ÈÜÛ-ÆÕÎËÃÉÀ ÄÌÑ
+v3 RSA ËÌÀÞÅÊ Ó MD5 ÎÁ SHA-1.
+--no-force-v4-certs ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--force-mdc</term>
+<listitem><para>
+ðÒÉÎÕÖÄÁÅÔ GnuPG ÉÓÐÏÌØÚÏ×ÁÔØ ÛÉÆÒÏ×ÁÎÉÅ Ó ËÏÄÏÍ ÏÂÎÁÒÕÖÅÎÉÑ ÉÚÍÅÎÅÎÉÊ. 
+÷ÓÅÇÄÁ ÉÓÐÏÌØÚÕÅÔÓÑ Ó ÂÏÌÅÅ ÎÏ×ÙÍÉ ÛÉÆÒÁÍÉ (Ó ÒÁÚÍÅÒÏÍ ÂÌÏËÁ ÂÏÌÅÅ
+64 ÂÉÔ) ÉÌÉ ÅÓÌÉ ×ÓÅ ËÌÀÞÉ ÐÏÌÕÞÁÔÅÌÑ ÐÏÄÄÅÒÖÉ×ÁÀÔ MDC.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--disable-mdc</term>
+<listitem><para>
+ïÔËÌÀÞÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ËÏÄÁ ÏÂÎÁÒÕÖÅÎÉÑ ÉÚÍÅÎÅÎÉÊ. úÁÍÅÔØÔÅ, ÞÔÏ ÐÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÚÁÛÉÆÒÏ×ÁÎÎÙÅ ÓÏÏÂÝÅÎÉÑ ÓÔÁÎÏ×ÑÔÓÑ
+ÕÑÚ×ÉÍÙ ÄÌÑ ÁÔÁË ÉÚÍÅÎÅÎÉÑ ÓÏÏÂÝÅÎÉÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--allow-non-selfsigned-uid</term>
+<term>--no-allow-non-selfsigned-uid</term>
+<listitem><para>
+òÁÚÒÅÛÁÅÔ ÉÍÐÏÒÔ É ÉÓÐÏÌØÚÏ×ÁÎÉÅ ËÌÀÞÅÊ Ó ÎÅÓÁÍÏÐÏÄÐÉÓÁÎÎÙÍ
+ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÐÏÌØÚÏ×ÁÔÅÌÑ. îÅ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ, Ô.Ë.
+ÔÁËÏÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ ÌÅÇËÏ ÐÏÄÄÅÌÁÔØ.
+--no-allow-non-selfsigned-uid ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--allow-freeform-uid</term>
+<listitem><para>
+ïÔËÌÀÞÁÅÔ ÐÒÏ×ÅÒËÕ ÆÏÒÍÁÔÁ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ ÐÒÉ ÅÇÏ ÓÏÚÄÁÎÉÉ.
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÒÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ ÔÏÌØËÏ × ÏÓÏÂÙÈ ÓÌÕÞÁÑÈ, Ô.Ë.
+ÏΠÎÅ ÇÁÒÁÎÔÉÒÕÅÔ Ñ×ÌÑÀÝÉÊÓÑ ÓÔÁÎÄÁÒÔÏÍ ÄÅ-ÆÁËÔÏ ÆÏÒÍÁÔ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ
+ÐÏÌØÚÏ×ÁÔÅÌÑ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--ignore-time-conflict</term>
+<listitem><para>
+GnuPG, ÏÂÙÞÎÏ, ÐÒÏ×ÅÒÑÅÔ ÐÒÁ×ÄÏÐÏÄÏÂÎÏÓÔØ ÚÎÁÞÅÎÉÊ ÍÅÔÏË ×ÒÅÍÅÎÉ,
+Ó×ÑÚÁÎÎÙÈ Ó ËÌÀÞÁÍÉ É ÐÏÄÐÉÓÑÍÉ. ïÄÎÁËÏ, ÉÎÏÇÄÁ ÐÏÄÐÉÓØ ÏËÁÚÙ×ÁÅÔÓÑ
+ÓÔÁÒÛÅ ËÌÀÞÁ ÉÚ-ÚÁ ÐÒÏÂÌÅÍ Ó ÞÁÓÁÍÉ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÏÚ×ÏÌÑÅÔ
+ÏÇÒÁÎÉÞÉ×ÁÔØÓÑ × ÐÏÄÏÂÎÙÈ ÓÌÕÞÁÑÈ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅÍ. óÍ. ÔÁËÖÅ ÐÁÒÁÍÅÔÒ 
+--ignore-valid-from, ÉÓÐÏÌØÚÕÅÍÙÊ ÄÌÑ ÒÁÚÒÅÛÅÎÉÑ ÐÒÏÂÌÅÍ Ó ÎÅÐÒÁ×ÉÌØÎÙÍ
+×ÒÅÍÅÎÅÍ ÎÁ ÐÏÄËÌÀÞÁÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--ignore-valid-from</term>
+<listitem><para>
+GnuPG, ËÁË ÐÒÁ×ÉÌÏ, ÎÅ ÐÏÚ×ÏÌÑÅÔ ×ÙÂÉÒÁÔØ É ÉÓÐÏÌØÚÏ×ÁÔØ ËÌÀÞÉ ÓÏÚÄÁÎÎÙÅ
+× ÂÕÄÕÝÅÍ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÒÁÚÒÅÛÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÔÁËÉÈ ËÌÀÞÅÊ. ÷Ù ÎÅ
+ÄÏÌÖÎÙ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÅÓÌÉ Õ ÷ÁÓ ÎÅÔ ÓÅÒØ£ÚÎÙÈ ÐÒÏÂÌÅÍ Ó
+ÞÁÓÁÍÉ. óÍ. ÔÁËÖÅ --ignore-time-conflict ÄÌÑ ÒÁÚÒÅÛÅÎÉÑ ÐÒÏÂÌÅÍ Ó
+ÎÅÐÒÁ×ÉÌØÎÙÍ ×ÒÅÍÅÎÅÍ ÎÁ ÐÏÄÐÉÓÑÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--ignore-crc-error</term>
+<listitem><para>
+ASCII ÆÏÒÍÁÔ, ÉÓÐÏÌØÚÕÅÍÙÊ OpenPG ÚÁÝÉÝÁÅÔÓÑ ËÏÎÔÒÏÌØÎÏÊ ÓÕÍÍÏÊ CRC ÄÌÑ
+ÚÁÝÉÔÙ ÏÔ ÏÛÉÂÏË ÐÒÉ ÐÅÒÅÄÁÞÅ. óÌÕÞÁÅÔÓÑ, ÞÔÏ ÜÔÁ ËÏÎÔÒÏÌØÎÁÑ ÓÕÍÍÁ
+ÉÓËÁÖÁÅÔÓÑ ÐÒÉ ÐÅÒÅÄÁÞÅ ÓÏÏÂÝÅÎÉÑ, ÎÏ ÓÁÍÁ ÉÎÆÏÒÍÁÃÉÑ (ÚÁÝÉÝÅÎÎÁÑ
+ÐÒÏÔÏËÏÌÏÍ OpenPGP) ÏÓÔÁ£ÔÓÑ ÄÏÓÔÏ×ÅÒÎÏÊ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÏÚ×ÏÌÑÅÔ
+ÉÇÎÏÒÉÒÏ×ÁÔØ ÏÛÉÂËÉ ËÏÎÔÒÏÌØÎÏÊ ÓÕÍÍÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--ignore-mdc-error</term>
+<listitem><para>
+ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ, × ÓÌÕÞÁÅ ÎÁÒÕÛÅÎÉÑ ÃÅÌÏÓÔÎÏÓÔÉ MDC
+ÔÏÌØËÏ ×ÙÄÁ£ÔÓÑ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ. íÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÓÌÕÞÁÅ ÞÁÓÔÉÞÎÏÇÏ
+ÐÏ×ÒÅÖÄÅÎÉÑ ÓÏÏÂÝÅÎÉÑ, ÅÓÌÉ ÎÅÏÂÈÏÄÉÍÏ ÉÚ×ÌÅÞØ ËÁË ÍÏÖÎÏ ÂÏÌØÛÅ ÄÁÎÎÙÈ
+ÉÚ ÐÏ×ÒÅÖÄ£ÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ. ïÄÎÁËÏ, ÕÞÔÉÔÅ, ÞÔÏ ÎÁÒÕÛÅÎÉÅ ÃÅÌÏÓÔÎÏÓÔÉ
+MDC ÍÏÖÅÔ Ó×ÉÄÅÔÅÌØÓÔ×Ï×ÁÔØ Ï ÐÏÄÄÅÌËÅ ÓÏÏÂÝÅÎÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--lock-once</term>
+<listitem><para>
+âÌÏËÉÒÏ×ÁÔØ ÂÁÚÙ ÄÁÎÎÙÈ ÐÒÉ ÐÅÒ×ÏÍ ÚÁÐÒÏÓÅ É ÎÅ ÓÎÉÍÁÔØ ÂÌÏËÉÒÏ×ËÕ ÄÏ
+ÚÁ×ÅÒÛÅÎÉÑ ÐÒÏÃÅÓÓÁ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--lock-multiple</term>
+<listitem><para>
+óÎÉÍÁÔØ ÂÌÏËÉÒÏ×ËÕ ËÁÖÄÙÊ ÒÁÚ ËÏÇÄÁ ÏÎÁ ÂÏÌØÛÅ ÎÅ ÎÕÖÎÁ. éÓÐÏÌØÚÕÅÔÓÑ
+ÄÌÑ ÐÅÒÅÚÁÐÉÓÉ --lock-once ÉÚ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--lock-never</term>
+<listitem><para>
+ðÏÌÎÏÓÔØÀ ÏÔÍÅÎÉÔØ ÂÌÏËÉÒÏ×ËÉ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÄÏÌÖÅΠÉÓÐÏÌØÚÏ×ÁÔØÓÑ
+ÔÏÌØËÏ × ÏÞÅÎØ ÓÐÅÃÉÆÉÞÅÓËÉÈ ÓÒÅÄÁÈ, ËÏÇÄÁ ÍÏÖÎÏ ÂÙÔØ Õ×ÅÒÅÎÎÙÍ, ÞÔÏ
+ÔÏÌØËÏ ÏÄÉΠÐÒÏÃÅÓÓ ÉÍÅÅÔ ÄÏÓÔÕРˠÆÁÊÌÁÍ. úÁÇÒÕÚÏÞÎÁÑ ÄÉÓËÅÔÁ Ó
+ÓÉÓÔÅÍÏÊ ÛÉÆÒÏ×ÁÎÉÑ ÎÁ ÎÅÊ ÍÏÖÅÔ ÓÌÕÖÉÔØ ÐÒÉÍÅÒÏÍ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÄÁÎÎÏÇÏ
+ÐÁÒÁÍÅÔÒÁ. îÅÐÒÁ×ÉÌØÎÏÅ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÄÏÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë
+ÐÏ×ÒÅÖÄÅÎÉÀ ËÌÀÞÅÊ É ÄÁÎÎÙÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-random-seed-file</term>
+<listitem><para>
+GnuPG ÉÓÐÏÌØÚÕÅÔ ÆÁÊÌ ÄÌÑ ÈÒÁÎÅÎÉÑ ×ÎÕÔÒÅÎÎÅÇÏ ÐÕÌÁ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ
+ÍÅÖÄÕ ÚÁÐÕÓËÁÍÉ. üÔÏ ÕÓËÏÒÑÅÔ ÇÅÎÅÒÁÃÉÀ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ; ÏÄÎÁËÏ ×
+ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ ÏÐÅÒÁÃÉÉ ÚÁÐÉÓÉ ÎÅ ÄÏÐÕÓËÁÀÔÓÑ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ
+ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁΠנÔÁËÏÊ ÓÉÔÕÁÃÉÉ  ÃÅÎÏÊ ÚÁÍÅÄÌÅÎÉÑ ÇÅÎÅÒÁÃÉÉ ÓÌÕÞÁÊÎÙÈ
+ÞÉÓÅÌ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--no-verbose</term>
+<listitem><para>
+óÂÒÏÓÉÔØ ÕÒÏ×ÅÎØ ÄÅÔÁÌØÎÏÓÔÉ ×Ù×ÏÄÁ × 0.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--no-greeting</term>
+<listitem><para>
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÓÏÏÂÝÅÎÉÑ Ï Á×ÔÏÒÓËÉÈ ÐÒÁ×ÁÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-secmem-warning</term>
+<listitem><para>
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÎÅÚÁÝÉÝÅÎÎÏÊ ÐÁÍÑÔÉ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-permission-warning</term>
+<listitem><para>
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÎÅÂÅÚÏÐÁÓÎÙÈ ÐÒÁ×ÁÈ ÄÏÓÔÕÐÁ Ë ÆÁÊÌÁÍ É
+ÄÏÍÁÛÎÅÍÕ ËÁÔÁÌÏÇÕ (--homedir).
+úÁÍÅÔØÔÅ, ÞÔÏ ÐÒÏ×ÅÒËÁ ÐÒÁ× ÄÏÓÔÕÐÁ Ë ÆÁÊÌÁÍ, ×ÙÐÏÌÎÑÅÍÁÑ GnuPG, ÎÅ
+Ñ×ÌÑÅÔÓÑ ÞÅÍ-ÔÏ ÚÎÁÞÉÔÅÌØÎÙÍ, ÜÔÏ ÐÒÏÓÔÏ ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ Ï ÏÂÝÉÈ
+ÐÒÏÂÌÅÍÁÈ Ó ÐÒÁ×ÁÍÉ ÄÏÓÔÕÐÁ Ë ÆÁÊÌÁÍ. îÅ ÓÌÅÄÕÅÔ ÐÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ
+ÏÔÓÕÔÓÔ×ÉÅ ÐÒÅÄÕÐÒÅÖÄÅÎÉÊ ÏÚÎÁÞÁÅÔ ÚÁÝÉÝ£ÎÎÏÓÔØ ÷ÁÛÅÊ ÓÉÓÔÅÍÙ.
+</para><para>
+úÁÍÅÔØÔÅ, ÔÁËÖÅ, ÞÔÏ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÎÅÂÅÚÏÐÁÓÎÙÈ ÐÒÁ×ÁÈ ÄÏÓÔÕÐÁ
+Ë ÄÏÍÁÛÎÅÍÕ ËÁÔÁÌÏÇÕ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÏÔËÌÀÞÅΠÉÚ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ, Ô.Ë.
+ÜÔÏ ÐÏÚ×ÏÌÉÌÏ ÂÙ ×ÚÌÏÍÝÉËÕ ÌÅÇËÏ ÐÏÄÍÅÎÉÔØ ÎÅÚÁÝÉÝ£ÎÎÙÊ ÆÁÊÌ
+ËÏÎÆÉÇÕÒÁÃÉÉ gpg.conf É ÐÏÄÁ×ÉÔØ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ ÉÚ ÎÅÇÏ. ðÏÜÔÏÍÕ
+×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ ÍÏÖÅÔ ÂÙÔØ ÏÔËÌÀÞÅΠÔÏÌØËÏ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-mdc-warning</term>
+<listitem><para>
+ðÏÄÁ×ÌÑÅÔ ×Ù×ÏÄ ÐÒÅÄÕÐÒÅÖÄÅÎÉÑ Ï ÏÔÓÕÔÓÔ×ÉÉ ÚÁÝÉÔÙ ÃÅÌÏÓÔÎÏÓÔÉ Ó
+ÐÏÍÏÝØÀ MDC.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--require-secmem</term>
+<term>--no-require-secmem</term>
+<listitem><para>
+úÁÐÒÅÔÉÔØ ×ÙÐÏÌÎÅÎÉÅ ÅÓÌÉ GnuPG ÎÅ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÂÅÚÏÐÁÓÎÕÀ ÐÁÍÑÔØ.
+ðÏ ÕÍÏÌÞÁÎÉÀ ÏÔËÌÀÞÅÎÏ (Ô.Å. GnuPG ÚÁÐÕÓËÁÅÔÓÑ, ÎÏ ×ÙÄÁ£Ô
+ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ).
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-armor</term>
+<listitem><para>
+ðÒÅÄÐÏÌÁÇÁÔØ, ÞÔÏ ×ÈÏÄÎÙÅ ÄÁÎÎÙÅ ÎÅ × ASCII ÆÏÒÍÁÔÅ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--no-default-keyring</term>
+<listitem><para>
+îÅ ÄÏÂÁ×ÌÑÔØ Ó×ÑÚËÉ ËÌÀÞÅÊ ÐÏ ÕÍÏÌÞÁÎÉÀ Ë ÓÐÉÓËÕ Ó×ÑÚÏË ËÌÀÞÅÊ.
+úÁÍÅÔØÔÅ, ÞÔÏ GnuPG ÎÅ ÂÕÄÅÔ ÒÁÂÏÔÁÔØ ÓÏ×ÓÅÍ ÂÅÚ Ó×ÑÚÏË, ÐÏÜÔÏÍÕ ÐÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ ÎÕÖÎÏ ÕËÁÚÁÔØ ÉÓÐÏÌØÚÕÅÍÙÅ Ó×ÑÚËÉ ÐÒÉ
+ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÏ× --keyring ÉÌÉ --secret-keyring, ÉÎÁÞÅ ÂÕÄÕÔ
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó×ÑÚËÉ ÏÔËÒÙÔÙÈ ÉÌÉ ÚÁËÒÙÔÙÈ ËÌÀÞÅÊ ÐÒÉÎÑÔÙÅ ÐÏ
+ÕÍÏÌÞÁÎÉÀ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--skip-verify</term>
+<listitem><para>
+ðÒÏÐÕÓÔÉÔØ ÐÒÏ×ÅÒËÕ ÐÏÄÐÉÓÉ. üÔÏÔ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ
+ÕÓËÏÒÅÎÉÑ ÒÁÓÛÉÆÒÏ×ÁÎÉÑ ÅÓÌÉ ÐÒÏ×ÅÒËÁ ÐÏÄÐÉÓÉ ÎÅ ÔÒÅÂÕÅÔÓÑ.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--with-colons</term>
+<listitem><para>
+÷Ù×ÅÓÔÉ ÓÐÉÓÏË ËÌÀÞÅÊ × ×ÉÄÅ ÐÏÌÅÊ ÒÁÚÄÅÌ£ÎÎÙÈ Ä×ÏÅÔÏÞÉÑÍÉ. úÁÍÅÔØÔÅ,
+ÞÔÏ ×Ù×ÏÄ ÂÕÄÅÔ ÚÁËÏÄÉÒÏ×ÁΠנUTF-8 ÎÅÚÁ×ÉÓÉÍÏ ÏÔ ÚÎÁÞÅÎÉÑ ÐÁÒÁÍÅÔÒÁ
+--display-charset. äÁÎÎÙÊ ÆÏÒÍÁÔ ÕÄÏÂÅΠÐÒÉ ×ÙÚÏ×Å ÉÚ ÓÃÅÎÁÒÉÅ× É ÄÒÕÇÉÈ
+ÐÒÏÇÒÁÍÍ, Ô.Ë. ÏΠÌÅÇËÏ ÏÂÒÁÂÁÔÙ×ÁÅÔÓÑ. ðÏÄÒÏÂÎÏÅ ÏÐÉÓÁÎÉÅ ÆÏÒÍÁÔÁ
+ÎÁÈÏÄÉÔÓÑ × ÆÁÊÌÅ doc/DETAILS, ËÏÔÏÒÙÊ ÓÏÄÅÒÖÉÔÓÑ × ÄÉÓÔÒÉÂÕÔÉ×Å Ó
+ÉÓÈÏÄÎÙÍ ËÏÄÏÍ GnuPG.
+</para></listitem></varlistentry>
+
+
+<varlistentry>
+<term>--with-key-data</term>
+<listitem><para>
+÷Ù×ÅÓÔÉ ÓÐÉÓÏË ËÌÀÞÅÊ × ×ÉÄÅ ÐÏÌÅÊ ÒÁÚÄÅÌ£ÎÎÙÈ Ä×ÏÅÔÏÞÉÑÍÉ (ËÁË É ÐÒÉ
+ÉÓÐÏÌØÚÏ×ÁÎÉÉ --with-colons) É ×Ù×ÅÓÔÉ ÄÁÎÎÙÅ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--with-fingerprint</term>
+<listitem><para>
+ôÏ ÖÅ, ÞÔÏ É --fingerprint ÎÏ ÉÚÍÅÎÑÅÔ ÔÏÌØËÏ ÆÏÒÍÁÔ ×Ù×ÏÄÁ É ÍÏÖÅÔ
+ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÄÒÕÇÏÊ ËÏÍÁÎÄÏÊ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--fast-list-mode</term>
+<listitem><para>
+õÓËÏÒÑÅÔ ÒÁÂÏÔÕ ËÏÍÁÎÄ ×Ù×ÏÄÑÝÉÈ ÓÐÉÓÏË ËÌÀÞÅÊ; ÚÁ ÓÞ£Ô ÓÏËÒÁÝÅÎÉÑ
+ÏÂߣÍÁ ×Ù×ÏÄÉÍÏÊ ÉÎÆÏÒÍÁÃÉÉ. îÅËÏÔÏÒÙÍ ÐÒÉÌÏÖÅÎÉÑÍ ÎÅ ÎÕÖÅÎ
+ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ É ÉÎÆÏÒÍÁÃÉÑ Ï ÕÒÏ×ÎÅ ÄÏ×ÅÒÉÑ. éÓÐÏÌØÚÕÑ
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÏÎÉ ÍÏÇÕÔ ÕÓËÏÒÉÔØ ×Ù×ÏÄ ÓÐÉÓËÁ. ôÏÞÎÏÅ ÐÏ×ÅÄÅÎÉÅ ÄÁÎÎÏÊ
+ËÏÍÁÎÄÙ ÍÏÖÅÔ ÉÚÍÅÎÉÔØÓÑ × ÂÕÄÕÝÉÈ ×ÅÒÓÉÑÈ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--fixed-list-mode</term>
+<listitem><para>
+îÅ ÏÂßÅÄÉÎÑÔØ ÐÅÒ×ÉÞÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ É ÐÅÒ×ÉÞÎÙÊ ËÌÀÞ ÐÒÉ ×Ù×ÏÄÅ ×
+ÒÅÖÉÍÅ --with-colon É ×Ù×ÏÄÉÔØ ×ÓÅ ÍÅÔËÉ ×ÒÅÍÅÎÉ × ÓÅËÕÎÄÁÈ Ó
+1970-01-01.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--list-only</term>
+<listitem><para>
+éÚÍÅÎÑÅÔ ÒÁÂÏÔÕ ÎÅËÏÔÏÒÙÈ ËÏÍÁÎÄ. óÈÏÖÁ Ó --dry-run, ÎÏ ÏÔÌÉÞÁÅÔÓÑ ×
+ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ. óÅÍÁÎÔÉËÁ ÐÁÒÁÍÅÔÒÁ ÍÏÖÅÔ × ÂÕÄÕÝÅÍ ÂÙÔØ ÒÁÓÛÉÒÅÎÁ. ÷
+ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÏΠÔÏÌØËÏ ÐÒÏÐÕÓËÁÅÔ ÄÅÛÉÆÒÏ×ÁÎÉÅ É ÐÏÜÔÏÍÕ ÕÓËÏÒÑÅÔ
+×Ù×ÏÄ ÓÐÉÓËÁ ËÌÀÞÅÊ ÛÉÆÒÏ×ÁÎÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-literal</term>
+<listitem><para>
+ðÁÒÁÍÅÔÒ ÎÅ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÏÂÙÞÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. ðÏÄÒÏÂÎÏÓÔÉ
+ÐÒÉÍÅÎÅÎÉÑ ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ ÐÒÏÇÒÁÍÍÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--set-filesize</term>
+<listitem><para>
+ðÁÒÁÍÅÔÒ ÎÅ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÏÂÙÞÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ. ðÏÄÒÏÂÎÏÓÔÉ
+ÐÒÉÍÅÎÅÎÉÑ ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÙÈ ÔÅËÓÔÁÈ ÐÒÏÇÒÁÍÍÙ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--show-session-key</term>
+<listitem><para>
+ðÏËÁÚÁÔØ ÓÅÁÎÓÏ×ÙÊ ËÌÀÞ, ÉÓÐÏÌØÚÏ×ÁÎÎÙÊ ÄÌÑ ÚÁÛÉÆÒÏ×ËÉ ÄÁÎÎÏÇÏ
+ÓÏÏÂÝÅÎÉÑ. óÍ. ÔÁËÖÅ --override-session-key.
+</para>
+<para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÓÌÕÞÁÅ ÅÓÌÉ ÷ÁÓ ÐÒÉÎÕÖÄÁÀÔ
+ÏÔËÒÙÔØ ÓÏÄÅÒÖÉÍÏÅ ÏÔÄÅÌØÎÏÇÏ ÚÁÛÉÆÒÏ×ÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ. éÓÐÏÌØÚÕÑ
+ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÷Ù ÍÏÖÅÔÅ ÐÏÌÕÞÉÔØ ÓÅÁÎÓÏ×ÙÊ ËÌÀÞ, ËÏÔÏÒÙÍ 
+ÚÁÛÉÆÒÏ×ÁÎÏ ÓÏÏÂÝÅÎÉÅ. ðÒÉ ÐÏÍÏÝÉ ÓÅÁÎÓÏ×ÏÇÏ ËÌÀÞÁ ÷Ù ÍÏÖÅÔÅ
+ÏÔËÒÙÔØ ÓÏÏÂÝÅÎÉÅ ÎÅ ÒÁÓËÒÙ×ÁÑ ÓÅËÒÅÔÎÙÊ ËÌÀÞ É ÎÅ ËÏÍÐÒÏÍÅÔÉÒÕÑ
+ÏÓÔÁÌØÎÙÅ ÓÏÏÂÝÅÎÉÑ, ÚÁÛÉÆÒÏ×ÁÎÎÙÅ ÄÌÑ ÔÏÇÏ ÖÅ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ.
+îå éóðïìøúõêôå äáîîùê ðáòáíåôò âåú ëòáêîåê îåïâèïäéíïóôé.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--override-session-key &ParmString; </term>
+<listitem><para>
+îÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÅÁÎÓÏ×ÙÊ ËÌÀÞ ÚÁÛÉÆÒÏ×ÁÎÎÙÊ ÏÔËÒÙÔÙÍ ËÌÀÞÏÍ, Á
+×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ËÌÀÞÏÍ &ParmString;.  æÏÒÍÁÔ ÐÁÒÁÍÅÔÒÁ ÁÎÁÌÏÇÉÞÅÎ
+×Ù×ÏÄÉÍÏÍÕ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ --show-session-key. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÉÓÐÏÌØÚÕÅÔÓÑ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÷ÁÓ ÐÒÉÎÕÖÄÁÀÔ ÏÔËÒÙÔØ ÓÏÄÅÒÖÉÍÏÅ
+ÚÁÛÉÆÒÏ×ÁÎÎÏÇÏ ÓÏÏÂÝÅÎÉÑ; ÉÓÐÏÌØÚÕÑ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÷Ù ÍÏÖÅÔÅ ÜÔÏ
+ÓÄÅÌÁÔØ ÂÅÚ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--ask-sig-expire</term>
+<term>--no-ask-sig-expire</term>
+<listitem><para>
+ðÒÉ ÐÏÄÐÉÓÉ ÄÁÎÎÙÈ ÚÁÐÒÁÛÉ×ÁÔØ ÓÒÏË ÄÅÊÓÔ×ÉÑ ÐÏÄÐÉÓÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ
+ÚÁÄÁÎ, ÔÏ ÐÏÄÐÉÓØ ÂÅÓÓÒÏÞÎÁÑ.
+--no-ask-sig-expire ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry
+
+<varlistentry>
+<term>--ask-cert-expire</term>
+<term>--no-ask-cert-expire</term>
+<listitem><para>
+ðÒÉ ÐÏÄÐÉÓÉ ËÌÀÞÁ ÚÁÐÒÁÛÉ×ÁÔØ ÓÒÏË ÄÅÊÓÔ×ÉÑ ÐÏÄÐÉÓÉ. åÓÌÉ ÐÁÒÁÍÅÔÒ ÎÅ
+ÚÁÄÁÎ, ÔÏ ÐÏÄÐÉÓØ ÂÅÓÓÒÏÞÎÁÑ.
+--no-ask-cert-expire ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry
+
+<varlistentry>
+<term>--expert</term>
+<term>--no-expert</term>
+<listitem><para>
+ðÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÐÏÌÎÑÔØ ÎÅËÏÔÏÒÙÅ ÎÅÌÅÐÙÅ ÉÌÉ ÂÅÓÓÍÙÓÌÅÎÎÙÅ
+ÏÐÅÒÁÃÉÉ, ÎÁÐÒÉÍÅÒ, ÐÏÄÐÉÓÙ×ÁÔØ ÐÒÏÓÒÏÞÅÎÎÙÅ É ÏÔÏÚ×ÁÎÎÙÅ ËÌÀÞÉ, ÉÌÉ
+ÏÐÅÒÁÃÉÉ ÎÁÒÕÛÁÀÝÉÅ ÓÏ×ÍÅÓÔÉÍÏÓÔØ, ÎÁÐÒÉÍÅÒ, ÇÅÎÅÒÉÒÏ×ÁÔØ ËÌÀÞÉ
+ÎÅÒÅËÏÍÅÎÄÕÅÍÙÈ ÔÉÐÏ×. ôÁËÖÅ ÏÔËÌÀÞÁÅÔ ×Ù×ÏÄ ÎÅËÏÔÏÒÙÈ ÐÒÅÄÕÐÒÅÖÄÁÀÝÉÈ
+ÓÏÏÂÝÅÎÉÊ Ï ÐÏÔÅÎÃÉÁÌØÎÏ ÎÅÓÏ×ÍÅÓÔÉÍÙÈ ÄÅÊÓÔ×ÉÑÈ. ÷ ÏÂÝÅÍ, ËÁË ÓÌÅÄÕÅÔ
+ÉÚ ÎÁÚ×ÁÎÉÑ, ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÔÏÌØËÏ ÄÌÑ ÓÐÅÃÉÁÌÉÓÔÏ×. åÓÌÉ ÷Ù ÎÅ
+ÐÏÎÉÍÁÅÔÅ ÐÏÌÎÏÓÔØÀ ÐÏÓÌÅÄÓÔ×ÉÊ ÔÅÈ ÄÅÊÓÔ×ÉÊ, ËÏÔÏÒÙÅ ÐÏÚ×ÏÌÑÅÔ
+×ÙÐÏÌÎÉÔØ ÜÔÏÔ ÐÁÒÁÍÅÔÒ, ÌÕÞÛÅ ÏÓÔÁ×ØÔÅ ÅÇÏ ÏÔËÌÀÞÅÎÎÙÍ.
+--no-expert ÏÔÍÅÎÑÅÔ ÄÅÊÓÔ×ÉÅ ÄÁÎÎÏÇÏ ÐÁÒÁÍÅÔÒÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--allow-secret-key-import</term>
+<listitem><para>
+õÓÔÁÒÅ×ÛÉÊ ÐÁÒÁÍÅÔÒ, ÂÏÌØÛÅ ÎÅ ÉÓÐÏÌØÚÕÅÔÓÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--try-all-secrets</term>
+<listitem><para>
+îÅ ÏÂÒÁÝÁÔØ ×ÎÉÍÁÎÉÑ ÎÁ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÕËÁÚÁÎÎÙÊ × ÓÏÏÂÝÅÎÉÉ, ÎÏ
+ÐÅÒÅÐÒÏÂÏ×ÁÔØ ×ÓÅ ÉÍÅÀÝÉÅÓÑ ÓÅËÒÅÔÎÙÅ ËÌÀÞÉ, ÐÏËÁ ÎÅ ÎÁÊÄ£ÔÓÑ ÐÒÁ×ÉÌØÎÙÊ
+ËÌÀÞ ÄÌÑ ÒÁÓÛÉÆÒÏ×ÁÎÉÑ ÓÏÏÂÝÅÎÉÑ. äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ÐÒÉÎÕÄÉÔÅÌØÎÏ
+ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÒÅÖÉÍ ÉÓÐÏÌØÚÕÅÍÙÊ ÐÒÉ ÒÁÓÛÉÆÒÏ×ËÅ ÓÏÏÂÝÅÎÉÊ ÄÌÑ ÁÎÏÎÉÍÎÙÈ
+ÐÏÌÕÞÁÔÅÌÅÊ (ÓÏÚÄÁÎÎÙÈ Ó ÐÏÍÏÝØÀ --throw-keyids) É ÍÏÖÅÔ ÂÙÔØ ÐÏÌÅÚÅΠ×
+ÓÌÕÞÁÅ ÅÓÌÉ ÚÁÛÉÆÒÏ×ÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ ÓÏÄÅÒÖÉÔ ÎÅÐÒÁ×ÉÌØÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ
+ËÌÀÞÁ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--enable-special-filenames</term>
+<listitem><para>
+äÁÎÎÙÊ ÐÁÒÁÍÅÔÒ ×ËÌÀÞÁÅÔ ÒÅÖÉÍ × ËÏÔÏÒÏÍ ÉÍÅÎÁ ÆÁÊÌÏ× ×ÉÄÁ
+<filename>-&#38;n</filename>, ÇÄÅ n -- ÎÅÏÔÒÉÃÁÔÅÌØÎÏÅ ÄÅÓÑÔÉÞÎÏÅ ÞÉÓÌÏ,
+ÏÂÏÚÎÁÞÁÀÔ ÆÁÊÌ Ó ÄÅÓËÒÉÐÔÏÒÏÍ n.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-expensive-trust-checks</term>
+<listitem><para>
+ôÏÌØËÏ ÄÌÑ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÏÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--group &ParmNameValues;</term>
+<listitem><para>
+ïÐÒÅÄÅÌÉÔØ ÉÍÅÎÏ×ÁÎÎÕÀ ÇÒÕÐÐÕ, ÐÏÄÏÂÎÕÀ ÁÌÉÁÓÁÍ × ÐÏÞÔÏ×ÙÈ ÐÒÏÇÒÁÍÍÁÈ.
+ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÉÍÅÎÉ ÇÒÕÐÐÙ × ËÁÞÅÓÔ×Å ÐÏÌÕÞÁÔÅÌÑ (-r or
+--recipient), ÏÎÁ ÂÕÄÅÔ ÐÒÅÏÂÒÁÚÏ×Ù×ÁÔØÓÑ × ÓÐÉÓÏË ÚÁÄÁÎÎÙÈ ÚÎÁÞÅÎÉÊ.
+åÓÌÉ ÚÁÄÁÔØ ÎÅÓËÏÌØËÏ ÇÒÕÐРӠÏÄÎÉÍ ÉÍÅÎÅÍ, ÔÏ ÏÎÉ Á×ÔÏÍÁÔÉÞÅÓËÉ ÂÕÄÕÔ
+ÏÂßÅÄÉÎÅÎÙ × ÏÄÎÕ.
+</para><para>
+÷ ËÁÞÅÓÔ×Å ÁÒÇÕÍÅÎÔÁ ÕËÁÚÙ×ÁÅÔÓÑ ÉÍÑ ÇÒÕÐÐÙ, Á ÚÁÔÅÍ, ÐÏÓÌÅ ÚÎÁËÁ =,
+&ParmKeyIDs; ÉÌÉ ÏÔÐÅÞÁÔËÉ ËÌÀÞÅÊ, ÎÏ ÄÏÐÕÓËÁÀÔÓÑ É ÌÀÂÙÅ ÄÒÕÇÉÅ
+ÏÐÉÓÁÎÉÑ ËÌÀÞÁ. úÁÍÅÔØÔÅ, ÞÔÏ ÚÎÁÞÅÎÉÅ Ó ÐÒÏÂÅÌÁÍÉ ÂÕÄÅÔ
+ÉÎÔÅÒÐÒÅÔÉÒÏ×ÁÔØÓÑ ËÁË Ä×Á ÒÁÚÌÉÞÎÙÈ ÚÎÁÞÅÎÉÑ. ôÁËÖÅ, ÚÁÍÅÔØÔÅ, ÞÔÏ
+ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÏÄÎÏÕÒÏ×ÎÅ×ÏÅ - ÷Ù ÎÅ ÍÏÖÅÔÅ ÄÏÂÁ×ÉÔØ ÇÒÕÐÐÕ × ÄÒÕÇÕÀ
+ÇÒÕÐÐÕ. ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ, ÍÏÖÅÔ ÏËÁÚÁÔØÓÑ
+ÎÅÏÂÈÏÄÉÍÙÍ ÚÁËÌÀÞÉÔØ ÁÒÇÕÍÅÎÔ × ËÁ×ÙÞËÉ, ÄÌÑ ÐÒÅÄÏÔ×ÒÁÝÅÎÉÑ ÅÇÏ
+ÉÎÔÅÒÐÒÅÔÁÃÉÉ ÏÂÏÌÏÞËÏÊ, ËÁË ÎÅÓËÏÌØËÉÈ ÐÁÒÁÍÅÔÒÏ×.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--ungroup &ParmName;</term>
+<listitem><para>
+õÄÁÌÉÔØ ÚÁÄÁÎÎÕÀ ÚÁÐÉÓØ ÉÚ ÓÐÉÓËÁ --group.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--no-groups</term>
+<listitem><para>
+õÄÁÌÑÅÔ ×ÓÅ ÚÁÐÉÓÉ ÉÚ ÓÐÉÓËÁ --group.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--preserve-permissions</term>
+<listitem><para>
+îÅ ÉÚÍÅÎÑÔØ ÐÒÁ×Á ÄÏÓÔÕÐÁ Ë ÆÁÊÌÕ Ó ÎÁÂÏÒÏÍ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ × ÒÅÖÉÍ
+ÄÏÓÔÕÐÁ ÞÔÅÎÉÑ/ÚÁÐÉÓÉ ÔÏÌØËÏ ÄÌÑ ×ÌÁÄÅÌØÃÁ. éÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÊ ÐÁÒÁÍÅÔÒ
+ÔÏÌØËÏ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÐÏÎÉÍÁÅÔÅ ÚÁÞÅÍ ÷ÁÍ ÜÔÏ ÎÕÖÎÏ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--personal-cipher-preferences &ParmString;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ ÛÉÆÒÏ× × &ParmString;, 
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÂÉÒÁÔØ
+ÐÒÅÄÐÏÞÉÔÁÅÍÙÅ ÉÍ ÁÌÇÏÒÉÔÍÙ ÐÒÉ ×ÙÂÏÒÅ ÁÌÇÏÒÉÔÍÏ× ÉÚ ÕËÁÚÁÎÎÙÈ × ËÌÀÞÅ
+ÐÏÌÕÞÁÔÅÌÑ. ðÅÒ×ÙÊ ÛÉÆÒ, ÕËÁÚÁÎÎÙÊ × ÄÁÎÎÏÍ ÓÐÉÓËÅ, ÔÁËÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ
+ËÏÍÁÎÄÏÊ --symmetric.
+</para></listitem></varlistentry>
+<varlistentry>
+<term>--personal-digest-preferences &ParmString;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ ÈÜÛ-ÆÕÎËÃÉÊ × &ParmString;,
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÂÉÒÁÔØ
+ÐÒÅÄÐÏÞÉÔÁÅÍÙÅ ÉÍ ÁÌÇÏÒÉÔÍÙ ÐÒÉ ×ÙÂÏÒÅ ÁÌÇÏÒÉÔÍÏ× ÉÚ ÕËÁÚÁÎÎÙÈ × ËÌÀÞÅ
+ÐÏÌÕÞÁÔÅÌÑ. ðÅÒ×ÁÑ ÈÜÛ-ÆÕÎËÃÉÑ, ÕËÁÚÁÎÎÁÑ × ÄÁÎÎÏÍ ÓÐÉÓËÅ, ÔÁËÖÅ 
+ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÐÏÄÐÉÓÉ ÂÅÚ ÛÉÆÒÏ×ÁÎÉÑ (--clearsign ÉÌÉ --sign).
+úÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ "H2", ÞÔÏ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ SHA-1.
+</para></listitem></varlistentry>
+<varlistentry>
+<term>--personal-compress-preferences &ParmString;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ ÁÌÇÏÒÉÔÍÏ× ÓÖÁÔÉÑ × &ParmString;,
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÐÏÌØÚÏ×ÁÔÅÌÀ ×ÙÂÉÒÁÔØ
+ÐÒÅÄÐÏÞÉÔÁÅÍÙÅ ÉÍ ÁÌÇÏÒÉÔÍÙ ÐÒÉ ×ÙÂÏÒÅ ÁÌÇÏÒÉÔÍÏ× ÉÚ ÕËÁÚÁÎÎÙÈ × ËÌÀÞÅ
+ÐÏÌÕÞÁÔÅÌÑ. ðÅÒ×ÙÊ ÉÚ ÁÌÇÏÒÉÔÍÏ×, ÕËÁÚÁÎÎÙÈ × ÄÁÎÎÏÍ ÓÐÉÓËÅ, ÔÁËÖÅ
+ÉÓÐÏÌØÚÕÅÔÓÑ × ÔÅÈ ÓÌÕÞÁÑÈ, ËÏÇÄÁ ËÌÀÞ ÐÏÌÕÞÁÔÅÌÑ ÏÔÓÕÔÓÔ×ÕÅÔ (ÎÁÐÒÉÍÅÒ,
+--symmetric).
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--default-preference-list &ParmString;</term>
+<listitem><para>
+õÓÔÁÎÏ×ÉÔØ ÓÐÉÓÏË ÐÅÒÓÏÎÁÌØÎÙÈ ÐÒÅÄÐÏÞÔÅÎÉÊ × &ParmString;,
+ÜÔÏÔ ÓÐÉÓÏË ÄÏÌÖÅΠÂÙÔØ ÓÔÒÏËÏÊ, ÐÏÄÏÂÎÏÊ ÔÏÊ, ÞÔÏ ×Ù×ÏÄÉÔÓÑ ËÏÍÁÎÄÏÊ
+"pref" × ÒÅÖÉÍÅ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ. ëÏÍÁÎÄÁ ×ÌÉÑÅÔ ÎÁ ÇÅÎÅÒÁÃÉÀ ËÌÀÞÁ É
+ËÏÍÁÎÄÕ "updpref" ÉÚ ÒÅÖÉÍÁ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ.
+</para></listitem></varlistentry>
+
+<varlistentry>
+<term>--list-config &OptParmNames;</term>
+<listitem><para>
+÷Ù×ÅÓÔÉ ÒÁÚÌÉÞÎÙÅ ×ÎÕÔÒÅÎÎÉÅ ÐÁÒÁÍÅÔÒÙ ËÏÎÆÉÇÕÒÁÃÉÉ GnuPG. äÁÎÎÙÊ
+ÐÁÒÁÍÅÔÒ ÐÒÅÄÎÁÚÎÁÞÅΠÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ×ÎÅÛÎÉÍÉ ÐÒÏÇÒÁÍÍÁÍÉ, ËÏÔÏÒÙÅ
+ÉÓÐÏÌØÚÕÀÔ GnuPG. óÍ. ÐÏÄÒÏÂÎÏÓÔÉ × ÆÁÊÌÅ <filename>doc/DETAILS</filename> ×
+ÄÉÓÔÒÉÂÕÔÉ×Å GnuPG. --list-config ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ×ÍÅÓÔÅ Ó
+ÕÓÔÁÎÏ×ÌÅÎÎÙÍ ÐÁÒÁÍÅÔÒÏÍ --with-colons.
+</para></listitem></varlistentry>
+
+</variablelist>
+</refsect1>
+
+
+<refsect1>
+    <title>ëÁË ÚÁÄÁÔØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÏÌØÚÏ×ÁÔÅÌÑ</title>
+    <para>
+éÍÅÅÔÓÑ ÎÅÓËÏÌØËÏ ÓÐÏÓÏÂÏ× ÕËÁÚÁÎÉÑ ÉÄÅÎÔÉÆÉËÁÔÏÒÁ ÐÏÌØÚÏ×ÁÔÅÌÑ ÄÌÑ 
+GnuPG; ÎÉÖÅ ÐÒÉ×ÅÄÅÎÏ ÎÅÓËÏÌØËÏ ÐÒÉÍÅÒÏ×:
+    </para>
+
+    <variablelist>
+<varlistentry>
+<term></term>
+<listitem><para></para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>234567C4</term>
+<term>0F34E556E</term>
+<term>01347A56A</term>
+<term>0xAB123456</term>
+<listitem><para>
+üÔÏ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÚÁÄÁÎÎÙÊ × ÏÂÙÞÎÏÊ ËÏÒÏÔËÏÍ ÆÏÒÍÁÔÅ.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>234AABBCC34567C4</term>
+<term>0F323456784E56EAB</term>
+<term>01AB3FED1347A5612</term>
+<term>0x234AABBCC34567C4</term>
+<listitem><para>
+úÄÅÓØ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÚÁÄÁΠנÄÌÉÎÎÏÍ ÆÏÒÍÁÔÅ, ËÁË × OpenPGP (÷Ù
+ÍÏÖÅÔÅ ÐÏÌÕÞÉÔØ ÄÌÉÎÎÙÊ ÉÄÅÎÔÉÆÉËÁÔÏÒ ËÌÀÞÁ ÉÓÐÏÌØÚÕÑ ÐÁÒÁÍÅÔÒ
+--with-colons).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>1234343434343434C434343434343434</term>
+<term>123434343434343C3434343434343734349A3434</term>
+<term>0E12343434343434343434EAB3484343434343434</term>
+<term>0xE12343434343434343434EAB3484343434343434</term>
+<listitem><para>
+îÁÉÌÕÞÛÉÊ ÓÐÏÓÏ ÚÁÄÁÎÉÑ ËÌÀÞÁ -- ÜÔÏ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÅÇÏ ÏÔÐÅÞÁÔËÁ. üÔÏ
+ÐÒÅÄÏÔ×ÒÁÝÁÅÔ ÌÀÂÙÅ ÎÅÏÄÎÏÚÎÁÞÎÏÓÔÉ × ÓÌÕÞÁÅ ÏÄÉÎÁËÏ×ÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ×
+ËÌÀÞÅÊ (ËÏÔÏÒÙÅ ËÒÁÊÎÅ ÒÅÄËÉ ÄÌÑ ÄÌÉÎÎÙÈ ÉÄÅÎÔÉÆÉËÁÔÏÒÏ× ËÌÀÞÅÊ).
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>=Heinrich Heine &#60;heinrichh@uni-duesseldorf.de&#62;</term>
+<listitem><para>
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÞÎÏÅ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÓÔÒÏËÅ. üÔÏ ÕËÁÚÙ×ÁÅÔÓÑ ÚÎÁËÏÍ
+ÒÁ×ÅÎÓÔ×Á.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>&#60;heinrichh@uni-duesseldorf.de&#62;</term>
+<listitem><para>
+éÓÐÏÌØÚÕÅÔÓÑ ÔÏÞÎÏÅ ÓÏÏÔ×ÅÔÓÔ×ÉÅ ÁÄÒÅÓÁ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ. ìÅ×ÁÑ ÕÇÌÏ×ÁÑ
+ÓËÏÂËÁ ÕËÁÚÙ×ÁÅÔ, ÞÔÏ ÉÓÐÏÌØÚÕÅÔÓÑ ÒÁÖÉÍ ÁÄÒÅÓÁ ÜÌÅËÔÒÏÎÎÏÊ ÐÏÞÔÙ.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>+Heinrich Heine duesseldorf</term>
+<listitem><para>
+÷ÓÅ ÓÌÏ×Á ÄÏÌÖÎÙ ÔÏÞÎÏ ÓÏÏÔ×ÅÔÓÔ×Ï×ÁÔØ ÕËÁÚÁÎÎÙÍ (ÒÅÇÉÓÔÒ ÓÉÍ×ÏÌÏ× ÎÅ
+ÉÍÅÅÔ ÚÎÁÞÅÎÉÑ) ÎÏ ÍÏÇÕÔ ÐÒÉÓÕÔÓÔ×Ï×ÁÔØ × ÉÄÅÎÔÉÆÉËÁÔÏÒÅ ÐÏÌØÚÏ×ÁÔÅÌÑ ×
+ÌÀÂÏÍ ÐÏÒÑÄËÅ. óÌÏ×Á ÍÏÇÕÔ ÂÙÔØ ÌÀÂÙÍÉ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔÑÍÉ ÂÕË×, ÃÉÆÒ,
+ÚÎÁËÏ× ÐÏÄÞÅÒËÉ×ÁÎÉÑ É ÓÉÍ×ÏÌÏ× Ó ÕÓÔÁÎÏ×ÌÅÎÎÙÍ 7-Í ÂÉÔÏÍ.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>Heine</term>
+<term>*Heine</term>
+<listitem><para>
+éÄÅÎÔÉÆÉËÁÔÏÒ ÄÏÌÖÅΠÓÏÄÅÒÖÁÔØ ÚÁÄÁÎÎÕÀ ÐÏÄÓÔÒÏËÕ (ÒÅÇÉÓÔÒ ÓÉÍ×ÏÌÏ× ÎÅ
+ÉÍÅÅÔ ÚÎÁÞÅÎÉÑ). üÔÏÔ ÒÅÖÉÍ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÎÏ ÍÏÖÎÏ
+ÄÏÐÏÌÎÉÔÅÌØÎÏ ÚÁÄÁÔØ ÅÇÏ ÐÏÍÅÓÔÉ× ÓÉÍ×ÏÌ Ú×£ÚÄÏÞËÉ × ÎÁÞÁÌÅ.
+</para></listitem>
+</varlistentry>
+
+    </variablelist>
+
+    <para>
+úÁÍÅÔÉÍ, ÞÔÏ ÷Ù ÍÏÖÅÔÅ ÄÏÂÁ×ÉÔØ ×ÏÓËÌÉÃÁÔÅÌØÎÙÊ ÚÎÁË (!) Ë ÉÄÅÎÔÉÆÉËÁÔÏÒÕ
+ËÌÀÞÁ ÉÌÉ ÏÔÐÅÞÁÔËÕ. üÔÏ ÆÌÁÇ, ËÏÔÏÒÙÊ ÕËÁÚÙ×ÁÅÔ GnuPG, ÞÔÏ ÓÌÅÄÕÅÔ
+ÉÓÐÏÌØÚÏ×ÁÔØ ÉÍÅÎÎÏ ÜÔÏÔ ÐÅÒ×ÉÞÎÙÊ ÉÌÉ ×ÔÏÒÉÞÎÙÊ ËÌÀÞ É ÎÅ ÐÙÔÁÔØÓÑ
+ÉÓÐÏÌØÚÏ×ÁÔØ ËÁËÏÊ-ÌÉÂÏ ÄÒÕÇÏÊ ÐÅÒ×ÉÞÎÙÊ ÉÌÉ ×ÔÏÒÉÞÎÙÊ ËÌÀÞ.
+    </para>
+
+</refsect1>
+
+
+<refsect1>
+    <title>÷ïú÷òáýáåíïå úîáþåîéå</title>
+    <para>
+ðÒÏÇÒÁÍÍÁ ×ÏÚ×ÒÁÝÁÅÔ 0 ÅÓÌÉ ×ÓÅ ÏÐÅÒÁÃÉÉ ×ÙÐÏÌÎÅÎÙ ÕÓÐÅÛÎÏ, 1 ÅÓÌÉ
+ÐÒÏ×ÅÒËÁ ÈÏÔÑ ÂÙ ÏÄÎÏÊ ÐÏÄÐÉÓÉ ÂÙÌÁ ÎÅÕÄÁÞÎÏÊ É ÄÒÕÇÏÊ ËÏÄ ÏÛÉÂËÉ ×
+ÓÌÕÞÁÅ ÆÁÔÁÌØÎÏÊ ÏÛÉÂËÉ.
+    </para>
+</refsect1>
+
+<refsect1>
+    <title>ðòéíåòù</title>
+    <variablelist>
+
+<varlistentry>
+<term>gpg -se -r <parameter/Bob/ &ParmFile;</term>
+<listitem><para>ÐÏÄÐÉÓÁÔØ É ÚÁÛÉÆÒÏ×ÁÔØ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ Bob</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>gpg --clearsign &ParmFile;</term>
+<listitem><para>ÓÏÚÄÁÔØ ÐÒÏÚÒÁÞÎÕÀ ÐÏÄÐÉÓØ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>gpg -sb  &ParmFile;</term>
+<listitem><para>ÓÏÚÄÁÔØ ÏÔÄÅÌ£ÎÎÕÀ ÐÏÄÐÉÓØ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>gpg --list-keys  <parameter/user_ID/</term>
+<listitem><para>ÐÏËÁÚÁÔØ ËÌÀÞ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>gpg --fingerprint  <parameter/user_ID/</term>
+<listitem><para>ÐÏËÁÚÁÔØ ÏÔÐÅÞÁÔÏË ËÌÀÞÁ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>gpg --verify  <parameter/pgpfile/</term>
+<term>gpg --verify  <parameter/sigfile/ &OptParmFiles;</term>
+<listitem><para>
+ðÒÏ×ÅÒÉÔØ ÐÏÄÐÉÓØ ÎÁ ÆÁÊÌÅ, ÎÏ ÎÅ ×Ù×ÏÄÉÔØ ÅÇÏ ÓÏÄÅÒÖÉÍÏÅ. ÷ÔÏÒÁÑ ÆÏÒÍÁ
+ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÏÔÄÅÌ£ÎÎÙÈ ÐÏÄÐÉÓÅÊ, ÇÄÅ <parameter/sigfile/ 
+--- ÏÔÄÅÌ£ÎÎÁÑ ÐÏÄÐÉÓØ (Ä×ÏÉÞÎÁÑ ÉÌÉ × ASCII ÆÏÒÍÁÔÅ), Á &OptParmFiles;
+ÐÏÄÐÉÓÁÎÎÙÅ ÄÁÎÎÙÅ; ÅÓÌÉ ÉÍÑ ÆÁÊÌÁ ÎÅ ÚÁÄÁÎÏ, ÔÏ ÏÎÏ ÏÂÒÁÚÕÅÔÓÑ
+ÕÄÁÌÅÎÉÅÍ ÒÁÓÛÉÒÅÎÉÑ (".sig" ÉÌÉ ".asc") Õ ÉÍÅÎÉ
+<parameter/sigfile/ ÉÌÉ ÚÁÐÒÁÛÉ×ÁÅÔÓÑ Õ ÐÏÌØÚÏ×ÁÔÅÌÑ.
+</para></listitem></varlistentry>
+
+    </variablelist>
+</refsect1>
+
+
+<refsect1>
+    <title>ðåòåíåîîùå ïëòõöåîéñ</title>
+
+    <variablelist>
+<varlistentry>
+<term>HOME</term>
+<listitem><para>äÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ ÐÏÌØÚÏ×ÁÔÅÌÑ.</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>GNUPGHOME</term>
+<listitem><para>ëÁÔÁÌÏÇ, ÚÁÍÅÎÑÀÝÉÊ "~/.gnupg".</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>GPG_AGENT_INFO</term>
+<listitem><para>éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÏÐÒÅÄÅÌÅÎÉÑ ÍÅÓÔÏÐÏÌÏÖÅÎÉÑ gpg-agent;
+ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÅÓÌÉ ÕÓÔÁÎÏ×ÌÅΠÐÁÒÁÍÅÔÒ --use-agent. úÎÁÞÅÎÉÅ
+ÓÏÓÔÏÉÔ ÉÚ 3 ÐÏÌÅÊ, ÒÁÚÄÅÌ£ÎÎÙÈ Ä×ÏÅÔÏÞÉÑÍÉ. ðÅÒ×ÏÅ -- ÐÕÔØ Ë ÄÏÍÅÎÎÏÍÕ
+ÓÏËÅÔÕ UNIX, ×ÔÏÒÏÅ -- ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÒÏÃÅÓÓÁ gpg-agent, É ÔÒÅÔØÅ --
+×ÅÒÓÉÑ ÐÒÏÔÏËÏÌÁ, ËÏÔÏÒÁÑ ÄÏÌÖÎÁ ÂÙÔØ ÒÁ×ÎÁ 1. ðÒÉ ÚÁÐÕÓËÅ gpg-agent,
+ËÁË ÏÐÉÓÁÎÏ × ÄÏËÕÍÅÎÔÁÃÉÉ, ÄÁÎÎÏÊ ÐÅÒÅÍÅÎÎÏÊ ÐÒÉÓ×ÁÉ×ÁÅÔÓÑ ËÏÒÒÅËÔÎÏÅ
+ÚÎÁÞÅÎÉÅ. ðÁÒÁÍÅÔÒ --gpg-agent-info ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ ÐÅÒÅËÒÙÔÉÑ
+ÚÎÁÞÅÎÉÑ ÄÁÎÎÏÊ ÐÅÒÅÍÅÎÎÏÊ.
+</para></listitem>
+</varlistentry>
+<varlistentry>
+<term>http_proxy</term>
+<listitem><para>éÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÅÓÌÉ ÕÓÔÁÎÏ×ÌÅΠÐÁÒÁÍÅÔÒ ÓÅÒ×ÅÒÁ ËÌÀÞÅÊ
+--honor-http-proxy.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>COLUMNS</term>
+<term>LINES</term>
+<listitem><para>
+éÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÕÓÔÁÎÏ×ËÉ ÒÁÚÍÅÒÁ ÎÅËÏÔÏÒÙÈ ÄÉÓÐÌÅÅ×.
+</para></listitem></varlistentry>
+</variablelist>
+
+</refsect1>
+
+<refsect1>
+    <title>æáêìù</title>
+    <variablelist>
+
+<varlistentry>
+<term>~/.gnupg/secring.gpg</term>
+<listitem><para>îÁÂÏÒ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/secring.gpg.lock</term>
+<listitem><para>É ÅÇÏ ÆÁÊÌ ÂÌÏËÉÒÏ×ËÉ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/pubring.gpg</term>
+<listitem><para>îÁÂÏÒ ÏÔËÒÙÔÙÈ ËÌÀÞÅÊ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/pubring.gpg.lock</term>
+<listitem><para>É ÅÇÏ ÆÁÊÌ ÂÌÏËÉÒÏ×ËÉ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/trustdb.gpg</term>
+<listitem><para>âÁÚÁ ÄÁÎÎÙÈ ÄÏ×ÅÒÉÑ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/trustdb.gpg.lock</term>
+<listitem><para>ɠţ ÆÁÊÌ ÂÌÏËÉÒÏ×ËÉ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/random_seed</term>
+<listitem><para>ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÈÒÁÎÅÎÉÑ ×ÎÕÔÒÅÎÎÅÇÏ ÐÕÌÁ ÓÌÕÞÁÊÎÙÈ ÞÉÓÅÌ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/gpg.conf</term>
+<listitem><para>ëÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ ÐÏ ÕÍÏÌÞÁÎÉÀ</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>~/.gnupg/options</term>
+<listitem><para>æÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ × ÐÒÅÄÙÄÕÝÉÈ ×ÅÒÓÉÑÈ. éÓÐÏÌØÚÕÅÔÓÑ
+ÅÓÌÉ ÎÅ ÎÁÊÄÅΠgpg.conf</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>/usr[/local]/share/gnupg/options.skel</term>
+<listitem><para>ðÒÏÏÔÉРÆÁÊÌÁ ÐÁÒÁÍÅÔÒÏ×</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>/usr[/local]/lib/gnupg/</term>
+<listitem><para>ëÁÔÁÌÏÇ, × ËÏÔÏÒÏÍ ÐÏ ÕÍÏÌÞÁÎÉÀ ÈÒÁÎÑÔÓÑ ÍÏÄÕÌÉ
+ÒÁÓÛÉÒÅÎÉÑ</para></listitem>
+</varlistentry>
+
+    </variablelist>
+</refsect1>
+
+<!-- SEE ALSO  not yet needed-->
+
+<refsect1>
+    <title>ðòåäõðòåöäåîéñ</title>
+    <para>
+éÓÐÏÌØÚÕÊÔÅ *ÈÏÒÏÛÉÅ* ÐÁÒÏÌÉ ÄÌÑ ÷ÁÛÅÊ ÕÞÅÔÎÏÊ ÚÁÐÉÓÉ É *ÈÏÒÏÛÉÅ*
+ËÌÀÞÅ×ÙÅ ÆÒÁÚÙ ÄÌÑ ÚÁÝÉÔÙ ÷ÁÛÅÇÏ ÓÅËÒÅÔÎÏÇÏ ËÌÀÞÁ. ëÌÀÞÅ×ÁÑ ÆÒÁÚÁ
+Ñ×ÌÑÅÔÓÑ ÓÁÍÏÊ ÓÌÁÂÏÊ ÞÁÓÔØÀ ×ÓÅÊ ÓÉÓÔÅÍÙ. îÅÓÌÏÖÎÏ ÓÏÚÄÁÔØ ÐÒÏÇÒÁÍÍÕ,
+ËÏÔÏÒÁÑ ÐÒÏÉÚ×ÅÄ£Ô ÓÌÏ×ÁÒÎÕÀ ÁÔÁËÕ ÎÁ ÷ÁÛ ÎÁÂÏÒ ÓÅËÒÅÔÎÙÈ ËÌÀÞÅÊ,
+ÐÏÜÔÏÍÕ ÔÝÁÔÅÌØÎÏ ÚÁÝÉÝÁÊÔÅ Ó×ÏÊ ËÁÔÁÌÏÇ "~/.gnupg/".
+</para>
+<para>
+ðÏÍÎÉÔÅ, ÞÔÏ ÅÓÌÉ ÷Ù ÉÓÐÏÌØÚÕÅÔÅ ÜÔÕ ÐÒÏÇÒÁÍÍÕ ÞÅÒÅÚ ÓÅÔØ (ÎÁÐÒÉÍÅÒ,
+ÉÓÐÏÌØÚÕÑ telnet), ÔÏ *ÏÞÅÎØ* ÌÅÇËÏ ÐÅÒÅÈ×ÁÔÉÔØ ÷ÁÛÕ ËÌÀÞÅ×ÕÀ ÆÒÁÚÕ!
+</para>
+<para>
+åÓÌÉ ÷Ù ÐÒÏ×ÅÒÑÅÔÅ ÏÔÄÅÌ£ÎÎÕÀ ÐÏÄÐÉÓØ, ÔÏ ÕÂÅÄÉÔÅÓØ, ÞÔÏ ÐÒÏÇÒÁÍÍÁ ÚÎÁÅÔ
+Ï ÜÔÏÍ; ÌÉÂÏ ÚÁÄÁÊÔÅ ÉÍÅÎÁ ÏÂÏÉÈ ÆÁÊÌÏ× × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ, ÌÉÂÏ
+ÉÓÐÏÌØÚÕÊÔÅ <literal>-</literal> ÄÌÑ ÕËÁÚÁÎÉÑ ÓÔÁÎÄÁÒÔÎÏÇÏ ××ÏÄÁ.
+</para>
+</refsect1>
+
+<refsect1>
+    <title>÷úáéíïäåêóô÷éå ó äòõçéíé ðòïçòáííáíé OPENPGP</title>
+<para>
+GnuPG ÓÔÒÅÍÉÔÓÑ ÂÙÔØ ÏÞÅÎØ ÇÉÂËÏÊ ÒÅÁÌÉÚÁÃÉÅÊ ÓÔÁÎÄÁÒÔÁ OpenPGP. ÷
+ÞÁÓÔÎÏÓÔÉ, GnuPG ÒÅÁÌÉÚÕÅÔ ÍÎÏÖÅÓÔ×Ï ÎÅÏÂÑÚÁÔÅÌØÎÙÈ ÞÁÓÔÅÊ ÓÔÁÎÄÁÒÔÁ,
+ÔÁËÉÈ ËÁË ÈÜÛ-ÆÕÎËÃÉÑ SHA-512 É ÁÌÇÏÒÉÔÍÙ ÓÖÁÔÉÑ ZLIB É BZIP2. ÷ÁÖÎÏ ÐÏÍÎÉÔØ,
+ÞÔÏ ÎÅ ×ÓÅ ÐÒÏÇÒÁÍÍÙ OpenPGP ÒÅÁÌÉÚÕÀÔ ÜÔÉ ÄÏÐÏÌÎÉÔÅÌØÎÙÅ ÁÌÇÏÒÉÔÍÙ, É
+ÞÔÏ ÐÒÉÎÕÄÉÔÅÌØÎÁÑ ÕÓÔÁÎÏ×ËÁ ÜÔÉÈ ÁÌÇÏÒÉÔÍÏ× ÐÒÉ ÐÏÍÏÝÉ ÐÁÒÁÍÅÔÒÏ×
+--cipher-algo, --digest-algo, --cert-digest-algo ÉÌÉ --compress-algo ×
+GnuPG ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë ÔÏÍÕ, ÞÔÏ ÓÏÚÄÁÎÎÏÅ ÓÏÏÂÝÅÎÉÅ, ÂÕÄÕÞÉ ÐÏÌÎÏÓÔØÀ
+ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ ÓÔÁÎÄÁÒÔÕ OpenPGP, ÎÅ ÓÍÏÖÅÔ ÂÙÔØ ÐÒÏÞÉÔÁÎÏ ÐÏÌÕÞÁÔÅÌÅÍ,
+ÉÓÐÏÌØÚÕÀÝÉÍ ÄÒÕÇÕÀ ÒÅÁÌÉÚÁÃÉÀ OpenPGP.
+</para>
+<para>
+äÏÓÔÕÐÎÏ ÚÎÁÞÉÔÅÌØÎÏÅ ÞÉÓÌÏ ÒÁÚÌÉÞÎÙÈ ÒÅÁÌÉÚÁÃÉÊ OpenPGP, É ËÁÖÄÁÑ
+ÐÏÄÄÅÒÖÉ×ÁÅÔ ÎÅËÏÔÏÒÏÅ Ó×Ï£ ÐÏÄÍÎÏÖÅÓÔ×Ï ÄÏÐÏÌÎÉÔÅÌØÎÙÈ ÁÌÇÏÒÉÔÍÏ×.
+îÁÐÒÉÍÅÒ, ÄÏ ÐÏÓÌÅÄÎÅÇÏ ×ÒÅÍÅÎÉ, ÎÅ ÂÙÌÏ ÏÆÉÃÉÁÌØÎÙÈ ×ÅÒÓÉÊ
+PGP ÐÏÄÄÅÒÖÉ×ÁÀÝÉÈ ÁÌÇÏÒÉÔÍ ÛÉÆÒÏ×ÁÎÉÑ BLOWFISH. ðÏÌØÚÏ×ÁÔÅÌØ PGP ÎÅ
+ÓÍÏÖÅÔ ÒÁÓÛÉÆÒÏ×ÁÔØ ÓÏÏÂÝÅÎÉÅ ÚÁÛÉÆÒÏ×ÁÎÎÏÅ ÜÔÉÍ ÁÌÇÏÒÉÔÍÏÍ. ðÏ ÕÍÏÌÞÁÎÉÀ
+GnuPG ÉÓÐÏÌØÚÕÅÔ ÓÔÁÎÄÁÒÔÎÕÀ ÓÉÓÔÅÍÕ ÐÒÅÄÐÏÞÔÅÎÉÊ ÏÐÒÅÄÅÌ£ÎÎÕÀ × OpenPGP,
+ËÏÔÏÒÁÑ ×ÓÅÇÄÁ ÄÅÌÁÅÔ ÐÒÁ×ÉÌØÎÙÊ ×ÙÂÏÒ É ÓÏÚÄÁ£Ô ÓÏÏÂÝÅÎÉÑ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÂÙÔØ
+ÐÒÏÞÉÔÁÎÙ ×ÓÅÍÉ ÐÏÌÕÞÁÔÅÌÑÍÉ, ÎÅÚÁ×ÉÓÉÍÏ ÏÔ ÔÏÇÏ, ËÁËÕÀ ÒÅÁÌÉÚÁÃÉÀ
+OpenPGP ÏÎÉ ÉÓÐÏÌØÚÕÀÔ. éÚÍÅÎÑÊÔÅ ÕÓÔÁÎÏ×ËÉ ÐÏ ÕÍÏÌÞÁÎÉÀ ÔÏÌØËÏ ÔÏÇÄÁ,
+ËÏÇÄÁ ÚÎÁÅÔÅ, ÞÔÏ ÄÅÌÁÅÔÅ.
+</para>
+
+<para>
+åÓÌÉ ÷ÁÍ ÁÂÓÏÌÀÔÎÏ ÎÅÏÂÈÏÄÉÍÏ ÐÅÒÅÚÁÐÉÓÁÔØ ÂÅÚÏÐÁÓÎÙÅ ÕÓÔÁÎÏ×ËÉ,
+ÐÒÉÎÑÔÙÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÉÌÉ ÐÒÅÄÐÏÞÔÅÎÉÑ ÎÁ ÄÁÎÎÏÍ ËÌÀÞÅ ÐÏ ËÁËÉÍ-ÔÏ
+ÐÒÉÞÉÎÁÍ ÎÅ×ÅÒÎÙ, ÔÏ ÌÕÞÛÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÁÒÁÍÅÔÒÙ --pgp6,
+--pgp7 ÉÌÉ --pgp8. üÔÉ ÐÁÒÁÍÅÔÒÙ ÂÅÚÏÐÁÓÎÙ, Ô.Ë. ÏÎÉ ÎÅ ÐÒÉ×ÏÄÑÔ Ë
+ÉÓÐÏÌØÚÏ×ÁÎÉÀ ËÁËÏÇÏ-ÌÉÂÏ ËÏÎËÒÅÔÎÏÇÏ ÁÌÇÏÒÉÔÍÁ × ÎÁÒÕÛÅÎÉÅ OpenPGP, Á
+ÔÏÌØËÏ ÕÍÅÎØÛÁÀÔ ËÏÌÉÞÅÓÔ×Ï ÄÏÐÕÓÔÉÍÙÈ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÁÌÇÏÒÉÔÍÏ×.
+</para>
+
+</refsect1>
+
+<refsect1>
+    <title>ïûéâëé</title>
+    <para>
+÷Ï ÍÎÏÇÉÈ ÓÉÓÔÅÍÁÈ ÄÁÎÎÁÑ ÐÒÏÇÒÁÍÍÁ ÄÏÌÖÎÁ ÂÙÔØ ÕÓÔÁÎÏ×ÌÅÎÁ Ó ÂÉÔÏÍ
+SUID. üÔÏ ÎÅÏÂÈÏÄÉÍÏ ÄÌÑ ÂÌÏËÉÒÏ×ËÉ ÓÔÒÁÎÉàÐÁÍÑÔÉ. âÌÏËÉÒÏ×ËÁ ÓÔÒÁÎÉÃ
+ÐÁÍÑÔÉ ÐÒÅÄÏÔ×ÒÁÝÁÅÔ ÚÁÐÉÓØ ÓÔÒÁÎÉàÐÁÍÑÔÉ (ËÏÔÏÒÙÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ
+ËÌÀÞÅ×ÙÅ ÆÒÁÚÙ É ÄÒÕÇÕÀ ÞÕ×ÓÔ×ÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ) ÎÁ ÄÉÓË.
+åÓÌÉ ÐÒÏÇÒÁÍÍÁ ÎÅ ×Ù×ÏÄÉÔ
+ÐÒÅÄÕÐÒÅÖÄÁÀÝÅÇÏ ÓÏÏÂÝÅÎÉÑ Ï ÎÅÚÁÝÉÝÅÎÎÏÊ ÐÁÍÑÔÉ, ÔÏ ÜÔÏ ÚÎÁÞÉÔ, ÞÔÏ
+÷ÁÛÁ ÏÐÅÒÁÃÉÏÎÎÁÑ ÓÉÓÔÅÍÁ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÂÌÏËÉÒÏ×ËÕ ÂÅÚ ÐÒÁ×
+ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌÑ. ðÒÏÇÒÁÍÍÁ ÓÂÒÁÓÙ×ÁÅÔ ÐÒÉ×ÉÌÅÇÉÉ ÓÕÐÅÒÐÏÌØÚÏ×ÁÔÅÌÑ
+ÓÒÁÚÕ ÐÏÓÌÅ ÔÏÇÏ, ËÁË ×ÙÄÅÌÑÅÔÓÑ ÂÌÏËÉÒÕÅÍÁÑ ÐÁÍÑÔØ.
+</para>
+</refsect1>
+
+<refsect1>
+    <title>ðåòå÷ïä</title>
+    <para>
+ðÅÒÅ×ÏÄ ÎÁ ÒÕÓÓËÉÊ ÑÚÙË: ðÁ×ÅÌ ûÁÊÄÏ &lt;zwon@severodvinsk.ru&gt;.
+</para>
+</refsect1>
+
+</refentry>
diff --git a/doc/gpg.texi b/doc/gpg.texi
new file mode 100644 (file)
index 0000000..a8e213c
--- /dev/null
@@ -0,0 +1,2695 @@
+@c Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+@c               2006 Free Software Foundation, Inc.
+@c This is part of the GnuPG manual.
+@c For copying conditions, see the file gnupg.texi.
+
+@node Invoking GPG
+@chapter Invoking GPG
+@cindex GPG command options
+@cindex command options
+@cindex options, GPG command
+
+@c Begin GnuPG 1.x specific stuff
+@ifset gpgone
+@macro gpgname
+gpg
+@end macro
+@manpage gpg.1
+@ifset manverb
+.B gpg
+\- OpenPGP encryption and signing tool
+@end ifset
+
+@mansect synopsis
+@ifset manverb
+.B  gpg
+.RB [ \-\-homedir
+.IR dir ]
+.RB [ \-\-options
+.IR file ]
+.RI [ options ]  
+.I command
+.RI [ args ]
+@end ifset
+@end ifset
+@c End GnuPG 1.x specific stuff
+
+@c Begin GnuPG 2 specific stuff
+@ifclear gpgone
+@macro gpgname
+gpg2
+@end macro
+@manpage gpg2.1
+@ifset manverb
+.B gpg2
+\- OpenPGP encryption and signing tool
+@end ifset
+
+@mansect synopsis
+@ifset manverb
+.B  gpg2
+.RB [ \-\-homedir
+.IR dir ]
+.RB [ \-\-options
+.IR file ]
+.RI [ options ]  
+.I command
+.RI [ args ]
+@end ifset
+@end ifclear
+@c Begin GnuPG 2 specific stuff
+
+@mansect description
+@command{@gpgname} is the OpenPGP part of the GNU Privacy Guard (GnuPG). It
+is a tool to provide digital encryption and signing services using the
+OpenPGP standard. @command{@gpgname} features complete key management and
+all bells and whistles you can expect from a decent OpenPGP
+implementation.
+
+@ifset gpgone
+This is the standalone version of @command{gpg}.  For desktop use you
+should consider using @command{gpg2}.
+@end ifset
+
+@ifclear gpgone
+In contrast to the standalone version @command{gpg}, which is more
+suited for server and embedded platforms, this version is installed
+under the name @command{gpg2} and more targeted to the desktop as it
+requires several other modules to be installed.  The standalone version
+will be kept maintained and it is possible to install both versions on
+the same system.  If you need to use different configuration files, you
+should make use of something like @file{gpg.conf-2} instead of just
+@file{gpg.conf}.
+@end ifclear
+
+@manpause
+@ifclear gpgone
+Documentation for the old standard @command{gpg} is available as a man
+page and at @inforef{Top,GnuPG 1,gpg}.
+@end ifclear
+
+@xref{Option Index}, for an index to @command{@gpgname}'s commands and options.
+@mancont
+
+@menu
+* GPG Commands::        List of all commands.
+* GPG Options::         List of all options.
+* GPG Configuration::   Configuration files.
+* GPG Examples::        Some usage examples.
+
+Developer information:
+@c * Unattended Usage::      Using @command{gpg} from other programs.
+@c * GPG Protocol::        The protocol the server mode uses.
+@end menu
+
+
+
+@c *******************************************
+@c ***************            ****************
+@c ***************  COMMANDS  ****************
+@c ***************            ****************
+@c *******************************************
+@mansect commands
+@node GPG Commands
+@section Commands
+
+Commands are not distinguished from options execpt for the fact that
+only one command is allowed.
+
+@command{@gpgname} may be run with no commands, in which case it will
+perform a reasonable action depending on the type of file it is given
+as input (an encrypted message is decrypted, a signature is verified,
+a file containing keys is listed).
+
+Please remember that option as well as command parsing stops as soon as
+a non-option is encountered, you can explicitly stop parsing by
+using the special option @option{--}.
+
+
+@menu
+* General GPG Commands::        Commands not specific to the functionality.
+* Operational GPG Commands::    Commands to select the type of operation.
+* OpenPGP Key Management::      How to manage your keys.
+@end menu
+
+
+@c *******************************************
+@c **********  GENERAL COMMANDS  *************
+@c *******************************************
+@node General GPG Commands
+@subsection Commands not specific to the function
+
+@table @gnupgtabopt
+@item --version
+@opindex version
+Print the program version and licensing information.  Note that you
+cannot abbreviate this command.
+
+@item --help
+@itemx -h
+@opindex help
+Print a usage message summarizing the most useful command line options.
+Not that you cannot abbreviate this command.
+
+@item --warranty
+@opindex warranty
+Print warranty information.
+
+@item --dump-options
+@opindex dump-options
+Print a list of all available options and commands.  Note that you cannot
+abbreviate this command.
+@end table
+
+
+@c *******************************************
+@c ********  OPERATIONAL COMMANDS  ***********
+@c *******************************************
+@node Operational GPG Commands
+@subsection Commands to select the type of operation
+
+
+@table @gnupgtabopt
+
+@item --sign
+@itemx -s
+@opindex sign
+Make a signature. This command may be combined with @option{--encrypt}
+(for a signed and encrypted message), @option{--symmetric} (for a signed
+and symmetrically encrypted message), or @option{--encrypt} and
+@option{--symmetric} together (for a signed message that may be
+decrypted via a secret key or a passphrase).
+
+@item --clearsign
+@opindex clearsign
+Make a clear text signature. The content in a clear text signature is
+readable without any special software. OpenPGP software is only
+needed to verify the signature. Clear text signatures may modify
+end-of-line whitespace for platform independence and are not intended
+to be reversible.
+
+@item --detach-sign
+@itemx -b
+@opindex detach-sign
+Make a detached signature.
+
+@item --encrypt
+@itemx -e
+@opindex encrypt
+Encrypt data. This option may be combined with @option{--sign} (for a
+signed and encrypted message), @option{--symmetric} (for a message that
+may be decrypted via a secret key or a passphrase), or @option{--sign}
+and @option{--symmetric} together (for a signed message that may be
+decrypted via a secret key or a passphrase).
+
+@item --symmetric
+@itemx -c
+@opindex symmetric
+Encrypt with a symmetric cipher using a passphrase. The default
+symmetric cipher used is CAST5, but may be chosen with the
+@option{--cipher-algo} option. This option may be combined with
+@option{--sign} (for a signed and symmetrically encrypted message),
+@option{--encrypt} (for a message that may be decrypted via a secret key
+or a passphrase), or @option{--sign} and @option{--encrypt} together
+(for a signed message that may be decrypted via a secret key or a
+passphrase).
+
+@item --store
+@opindex store
+Store only (make a simple RFC1991 literal data packet).
+
+@item --decrypt
+@itemx -d
+@opindex decrypt
+Decrypt the file given on the command line (or @code{stdin} if no file
+is specified) and write it to stdout (or the file specified with
+@option{--output}). If the decrypted file is signed, the signature is also
+verified. This command differs from the default operation, as it never
+writes to the filename which is included in the file and it rejects
+files which don't begin with an encrypted message.
+
+@item --verify
+@opindex verify
+Assume that the first argument is a signed file or a detached signature
+and verify it without generating any output. With no arguments, the
+signature packet is read from stdin. If only a sigfile is given, it may
+be a complete signature or a detached signature, in which case the
+signed stuff is expected in a file without the ".sig" or ".asc"
+extension.  With more than 1 argument, the first should be a detached
+signature and the remaining files are the signed stuff. To read the
+signed stuff from stdin, use @samp{-} as the second filename.  For
+security reasons a detached signature cannot read the signed material
+from stdin without denoting it in the above way.
+
+@item --multifile
+@opindex multifile
+This modifies certain other commands to accept multiple files for
+processing on the command line or read from stdin with each filename on
+a separate line. This allows for many files to be processed at
+once. @option{--multifile} may currently be used along with
+@option{--verify}, @option{--encrypt}, and @option{--decrypt}. Note that
+@option{--multifile --verify} may not be used with detached signatures.
+
+@item --verify-files
+@opindex verify-files
+Identical to @option{--multifile --verify}.
+
+@item --encrypt-files
+@opindex encrypt-files
+Identical to @option{--multifile --encrypt}.
+
+@item --decrypt-files
+@opindex decrypt-files
+Identical to @option{--multifile --decrypt}.
+
+@item --list-keys
+@itemx -k
+@itemx --list-public-keys
+@opindex list-keys
+List all keys from the public keyrings, or just the keys given on the
+command line.
+@ifset gpgone
+@option{-k} is slightly different from @option{--list-keys} in that it
+allows only for one argument and takes the second argument as the
+keyring to search.  This is for command line compatibility with PGP 2
+and has been removed in @command{gpg2}.
+@end ifset
+
+Avoid using the output of this command in scripts or other programs as
+it is likely to change as GnuPG changes. See @option{--with-colons} for a
+machine-parseable key listing command that is appropriate for use in
+scripts and other programs.
+
+@item --list-secret-keys
+@itemx -K
+@opindex list-secret-keys
+List all keys from the secret keyrings, or just the ones given on the
+command line. A @code{#} after the letters @code{sec} means that the
+secret key is not usable (for example, if it was created via
+@option{--export-secret-subkeys}).
+
+@item --list-sigs
+@opindex list-sigs
+Same as @option{--list-keys}, but the signatures are listed too.
+
+For each signature listed, there are several flags in between the "sig"
+tag and keyid. These flags give additional information about each
+signature. From left to right, they are the numbers 1-3 for certificate
+check level (see @option{--ask-cert-level}), "L" for a local or
+non-exportable signature (see @option{--lsign-key}), "R" for a
+nonRevocable signature (see the @option{--edit-key} command "nrsign"),
+"P" for a signature that contains a policy URL (see
+@option{--cert-policy-url}), "N" for a signature that contains a
+notation (see @option{--cert-notation}), "X" for an eXpired signature
+(see @option{--ask-cert-expire}), and the numbers 1-9 or "T" for 10 and
+above to indicate trust signature levels (see the @option{--edit-key}
+command "tsign").
+
+@item --check-sigs
+@opindex check-sigs
+Same as @option{--list-sigs}, but the signatures are verified.
+
+@item --fingerprint
+@opindex fingerprint
+List all keys (or the specified ones) along with their
+fingerprints. This is the same output as @option{--list-keys} but with
+the additional output of a line with the fingerprint. May also be
+combined with @option{--list-sigs} or @option{--check-sigs}.  If this
+command is given twice, the fingerprints of all secondary keys are
+listed too.
+
+@item --list-packets
+@opindex list-packets
+List only the sequence of packets. This is mainly
+useful for debugging.
+
+
+@item --card-edit
+@opindex card-edit
+Present a menu to work with a smartcard. The subcommand "help" provides
+an overview on available commands. For a detailed description, please
+see the Card HOWTO at
+http://www.gnupg.org/documentation/howtos.html#GnuPG-cardHOWTO .
+
+@item --card-status
+@opindex card-status
+Show the content of the smart card.
+
+@item --change-pin
+@opindex change-pin
+Present a menu to allow changing the PIN of a smartcard. This
+functionality is also available as the subcommand "passwd" with the
+@option{--card-edit} command.
+
+@item --delete-key @code{name}
+@opindex delete-key
+Remove key from the public keyring. In batch mode either @option{--yes} is
+required or the key must be specified by fingerprint. This is a
+safeguard against accidental deletion of multiple keys.
+
+@item --delete-secret-key @code{name}
+@opindex delete-secret-key
+Remove key from the secret and public keyring. In batch mode the key
+must be specified by fingerprint.
+
+@item --delete-secret-and-public-key @code{name}
+@opindex delete-secret-and-public-key
+Same as @option{--delete-key}, but if a secret key exists, it will be
+removed first. In batch mode the key must be specified by fingerprint.
+
+@item --export
+@opindex export
+Either export all keys from all keyrings (default keyrings and those
+registered via option @option{--keyring}), or if at least one name is given,
+those of the given name. The new keyring is written to stdout or to the
+file given with option @option{--output}. Use together with
+@option{--armor} to mail those keys.
+
+@item --send-keys @code{key IDs}
+@opindex send-keys
+Similar to @option{--export} but sends the keys to a keyserver.
+Fingerprints may be used instead of key IDs. Option @option{--keyserver}
+must be used to give the name of this keyserver. Don't send your
+complete keyring to a keyserver --- select only those keys which are new
+or changed by you.
+
+@item --export-secret-keys
+@itemx --export-secret-subkeys
+@opindex export-secret-keys
+@opindex export-secret-subkeys
+Same as @option{--export}, but exports the secret keys instead.  This is
+normally not very useful and a security risk.  The second form of the
+command has the special property to render the secret part of the
+primary key useless; this is a GNU extension to OpenPGP and other
+implementations can not be expected to successfully import such a key.
+See the option @option{--simple-sk-checksum} if you want to import such
+an exported key with an older OpenPGP implementation.
+
+@item --import
+@itemx --fast-import
+@opindex import
+Import/merge keys. This adds the given keys to the
+keyring. The fast version is currently just a synonym.
+
+There are a few other options which control how this command works.
+Most notable here is the @option{--keyserver-options merge-only} option
+which does not insert new keys but does only the merging of new
+signatures, user-IDs and subkeys.
+
+@item --recv-keys @code{key IDs}
+@opindex recv-keys
+Import the keys with the given key IDs from a keyserver. Option
+@option{--keyserver} must be used to give the name of this keyserver.
+
+@item --refresh-keys
+@opindex refresh-keys
+Request updates from a keyserver for keys that already exist on the
+local keyring. This is useful for updating a key with the latest
+signatures, user IDs, etc. Calling this with no arguments will refresh
+the entire keyring. Option @option{--keyserver} must be used to give the
+name of the keyserver for all keys that do not have preferred keyservers
+set (see @option{--keyserver-options honor-keyserver-url}).
+
+@item --search-keys @code{names}
+@opindex search-keys
+Search the keyserver for the given names. Multiple names given here will
+be joined together to create the search string for the keyserver.
+Option @option{--keyserver} must be used to give the name of this
+keyserver.  Keyservers that support different search methods allow using
+the syntax specified in "How to specify a user ID" below. Note that
+different keyserver types support different search methods. Currently
+only LDAP supports them all.
+
+@item --fetch-keys @code{URIs}
+@opindex fetch-keys
+Retrieve keys located at the specified URIs. Note that different
+installations of GnuPG may support different protocols (HTTP, FTP,
+LDAP, etc.)
+
+@item --update-trustdb
+@opindex update-trustdb
+Do trust database maintenance. This command iterates over all keys and
+builds the Web of Trust. This is an interactive command because it may
+have to ask for the "ownertrust" values for keys. The user has to give
+an estimation of how far she trusts the owner of the displayed key to
+correctly certify (sign) other keys. GnuPG only asks for the ownertrust
+value if it has not yet been assigned to a key. Using the
+@option{--edit-key} menu, the assigned value can be changed at any time.
+
+@item --check-trustdb
+@opindex check-trustdb
+Do trust database maintenance without user interaction. From time to
+time the trust database must be updated so that expired keys or
+signatures and the resulting changes in the Web of Trust can be
+tracked. Normally, GnuPG will calculate when this is required and do it
+automatically unless @option{--no-auto-check-trustdb} is set. This
+command can be used to force a trust database check at any time. The
+processing is identical to that of @option{--update-trustdb} but it
+skips keys with a not yet defined "ownertrust".
+
+For use with cron jobs, this command can be used together with
+@option{--batch} in which case the trust database check is done only if
+a check is needed. To force a run even in batch mode add the option
+@option{--yes}.
+
+@item --export-ownertrust
+@opindex export-ownertrust
+Send the ownertrust values to stdout. This is useful for backup purposes
+as these values are the only ones which can't be re-created from a
+corrupted trust DB.
+
+@item --import-ownertrust
+@opindex import-ownertrust
+Update the trustdb with the ownertrust values stored in @code{files} (or
+stdin if not given); existing values will be overwritten.
+
+@item --rebuild-keydb-caches
+@opindex rebuild-keydb-caches
+When updating from version 1.0.6 to 1.0.7 this command should be used
+to create signature caches in the keyring. It might be handy in other
+situations too.
+
+@item --print-md @code{algo}
+@itemx --print-mds
+@opindex print-md
+Print message digest of algorithm ALGO for all given files or stdin.
+With the second form (or a deprecated "*" as algo) digests for all
+available algorithms are printed.
+
+@item --gen-random @code{0|1|2}
+@opindex gen-random
+Emit @var{count} random bytes of the given quality level. If count is
+not given or zero, an endless sequence of random bytes will be emitted.
+PLEASE, don't use this command unless you know what you are doing; it
+may remove precious entropy from the system!
+
+@item --gen-prime @code{mode}  @code{bits}
+@opindex gen-prime
+Use the source, Luke :-). The output format is still subject to change.
+
+
+@item --enarmor
+@item --dearmor
+@opindex enarmor
+@opindex --enarmor
+Pack or unpack an arbitrary input into/from an OpenPGP ASCII armor.
+This is a GnuPG extension to OpenPGP and in general not very useful.
+
+@end table
+
+
+@c *******************************************
+@c *******  KEY MANGEMENT COMMANDS  **********
+@c *******************************************
+@node OpenPGP Key Management
+@subsection How to manage your keys
+
+This section explains the main commands for key management
+
+@table @gnupgtabopt
+
+@item --gen-key
+@opindex gen-key
+Generate a new key pair. This command is normally only used
+interactively.
+
+There is an experimental feature which allows you to create keys in
+batch mode. See the file @file{doc/DETAILS} in the source distribution
+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.
+
+@item --desig-revoke @code{name}
+@opindex desig-revoke
+Generate a designated revocation certificate for a key. This allows a
+user (with the permission of the keyholder) to revoke someone else's
+key.
+
+
+@item --edit-key
+@opindex edit-key
+Present a menu which enables you to do most of the key management
+related tasks.  It expects the specification of a key on the command
+line.
+
+@c ******** Begin Edit-key Options **********
+@table @asis
+
+@item sign
+@opindex keyedit:sign
+Make a signature on key of user @code{name} If the key is not yet
+signed by the default user (or the users given with -u), the program
+displays the information of the key again, together with its
+fingerprint and asks whether it should be signed. This question is
+repeated for all users specified with
+-u.
+
+@item lsign
+@opindex keyedit:lsign
+Same as "sign" but the signature is marked as non-exportable and will
+therefore never be used by others. This may be used to make keys
+valid only in the local environment.
+
+@item nrsign
+@opindex keyedit:nrsign
+Same as "sign" but the signature is marked as non-revocable and can
+therefore never be revoked.
+
+@item tsign
+@opindex keyedit:tsign
+Make a trust signature. This is a signature that combines the notions
+of certification (like a regular signature), and trust (like the
+"trust" command). It is generally only useful in distinct communities
+or groups.
+@end table
+
+@c man:.RS
+Note that "l" (for local / non-exportable), "nr" (for non-revocable,
+and "t" (for trust) may be freely mixed and prefixed to "sign" to
+create a signature of any type desired.
+@c man:.RE
+
+@table @asis
+
+@item revsig
+@opindex keyedit:revsig
+Revoke a signature. For every signature which has been generated by
+one of the secret keys, GnuPG asks whether a revocation certificate
+should be generated.
+
+@item trust
+@opindex keyedit:trust
+Change the owner trust value. This updates the
+trust-db immediately and no save is required.
+
+@item disable
+@itemx enable
+@opindex keyedit:disable
+@opindex keyedit:enable
+Disable or enable an entire key. A disabled key can not normally be
+used for encryption.
+
+@item adduid
+@opindex keyedit:adduid
+Create an alternate user id.
+
+@item addphoto
+@opindex keyedit:addphoto
+Create a photographic user id. This will prompt for a JPEG file that
+will be embedded into the user ID. Note that a very large JPEG will make
+for a very large key. Also note that some programs will display your
+JPEG unchanged (GnuPG), and some programs will scale it to fit in a
+dialog box (PGP).
+
+@item deluid
+@opindex keyedit:deluid
+Delete a user id.  Note that it is not possible to retract a user id,
+once it has been send to the public (i.e. to a keyserver).  In that case
+you better use @code{revuid}.
+
+@item delsig
+@opindex keyedit:delsig
+Delete a signature. Note that it is not possible to retract a signature,
+once it has been send to the public (i.e. to a keyserver).  In that case
+you better use @code{revsig}.
+
+@item revuid
+@opindex keyedit:revuid
+Revoke a user id.
+
+@item addkey
+@opindex keyedit:addkey
+Add a subkey to this key.
+
+@item addcardkey
+@opindex keyedit:addcardkey
+Generate a key on a card and add it to this key.
+
+@item keytocard
+@opindex keyedit:keytocard
+Transfer the selected secret key (or the primary key if no key has been
+selected) to a smartcard. The secret key in the keyring will be replaced
+by a stub if the key could be stored successfully on the card and you
+use the save command later. Only certain key types may be transferred to
+the card. A sub menu allows you to select on what card to store the
+key. Note that it is not possible to get that key back from the card -
+if the card gets broken your secret key will be lost unless you have a
+backup somewhere.
+
+@item bkuptocard @code{file}
+@opindex keyedit:bkuptocard
+Restore the given file to a card. This command may be used to restore a
+backup key (as generated during card initialization) to a new card. In
+almost all cases this will be the encryption key. You should use this
+command only with the corresponding public key and make sure that the
+file given as argument is indeed the backup to restore. You should then
+select 2 to restore as encryption key.  You will first be asked to enter
+the passphrase of the backup key and then for the Admin PIN of the card.
+
+@item delkey
+@opindex keyedit:delkey
+Remove a subkey (secondart key). Note that it is not possible to retract
+a subkey, once it has been send to the public (i.e. to a keyserver).  In
+that case you better use @code{revkey}.
+
+@item addrevoker
+@opindex keyedit:addrevoker
+Add a designated revoker. This takes one optional argument:
+"sensitive". If a designated revoker is marked as sensitive, it will not
+be exported by default (see export-options).
+
+@item revkey
+@opindex keyedit:revkey
+Revoke a subkey.
+
+@item expire
+@opindex keyedit:expire
+Change the key expiration time. If a subkey is selected, the
+expiration time of this subkey will be changed. With no selection,
+the key expiration of the primary key is changed.
+
+@item passwd
+@opindex keyedit:passwd
+Change the passphrase of the secret key.
+
+@item primary
+@opindex keyedit:primary
+Flag the current user id as the primary one, removes the primary user
+id flag from all other user ids and sets the timestamp of all affected
+self-signatures one second ahead. Note that setting a photo user ID
+as primary makes it primary over other photo user IDs, and setting a
+regular user ID as primary makes it primary over other regular user
+IDs.
+
+@item uid @code{n}
+@opindex keyedit:uid
+Toggle selection of user id with index @code{n}.
+Use 0 to deselect all.
+
+@item key @code{n}
+@opindex keyedit:key
+Toggle selection of subkey with index @code{n}.
+Use 0 to deselect all.
+
+@item check
+@opindex keyedit:check
+Check all selected user ids.
+
+@item showphoto
+@opindex keyedit:showphoto
+Display the selected photographic user
+id.
+
+@item pref
+@opindex keyedit:pref
+List preferences from the selected user ID. This shows the actual
+preferences, without including any implied preferences.
+
+@item showpref
+@opindex keyedit:showpref
+More verbose preferences listing for the selected user ID. This shows
+the preferences in effect by including the implied preferences of 3DES
+(cipher), SHA-1 (digest), and Uncompressed (compression) if they are
+not already included in the preference list. In addition, the
+preferred keyserver and signature notations (if any) are shown.
+
+@item setpref @code{string}
+@opindex keyedit:setpref
+Set the list of user ID preferences to @code{string} for all (or just
+the selected) user IDs. Calling setpref with no arguments sets the
+preference list to the default (either built-in or set via
+@option{--default-preference-list}), and calling setpref with "none" as
+the argument sets an empty preference list. Use @command{@gpgname
+--version} to get a list of available algorithms. Note that while you
+can change the preferences on an attribute user ID (aka "photo ID"),
+GnuPG does not select keys via attribute user IDs so these preferences
+will not be used by GnuPG.
+
+@item keyserver
+@opindex keyedit:keyserver
+Set a preferred keyserver for the specified user ID(s). This allows
+other users to know where you prefer they get your key from. See
+@option{--keyserver-options honor-keyserver-url} for more on how this
+works.  Setting a value of "none" removes an existing preferred
+keyserver.
+
+@item notation
+@opindex keyedit:notation
+Set a name=value notation for the specified user ID(s). See
+@option{--cert-notation} for more on how this works. Setting a value of
+"none" removes all notations, setting a notation prefixed with a minus
+sign (-) removes that notation, and setting a notation name (without the
+=value) prefixed with a minus sign removes all notations with that name.
+
+@item toggle
+@opindex keyedit:toggle
+Toggle between public and secret key listing.
+
+@item clean
+@opindex keyedit:clean
+Compact (by removing all signatures except the selfsig) any user ID
+that is no longer usable (e.g. revoked, or expired). Then, remove any
+signatures that are not usable by the trust calculations.
+Specifically, this removes any signature that does not validate, any
+signature that is superseded by a later signature, revoked signatures,
+and signatures issued by keys that are not present on the keyring.
+
+@item minimize
+@opindex keyedit:minimize
+Make the key as small as possible. This removes all signatures from
+each user ID except for the most recent self-signature.
+
+@item cross-certify
+@opindex keyedit:cross-certify
+Add cross-certification signatures to signing subkeys that may not
+currently have them. Cross-certification signatures protect against a
+subtle attack against signing subkeys. See
+@option{--require-cross-certification}.
+
+@item save
+@opindex keyedit:save
+Save all changes to the key rings and quit.
+
+@item quit
+@opindex keyedit:quit
+Quit the program without updating the
+key rings.
+
+@end table
+
+@c man:.RS
+The listing shows you the key with its secondary keys and all user
+ids. Selected keys or user ids are indicated by an asterisk. The trust
+value is displayed with the primary key: the first is the assigned owner
+trust and the second is the calculated trust value. Letters are used for
+the values:
+@c man:.RE
+
+@table @asis
+
+@item -
+No ownertrust assigned / not yet calculated.
+
+@item e
+Trust
+calculation has failed; probably due to an expired key.
+
+@item q
+Not enough information for calculation.
+
+@item n
+Never trust this key.
+
+@item m
+Marginally trusted.
+
+@item f
+Fully trusted.
+
+@item u
+Ultimately trusted.
+@end table
+@c ******** End Edit-key Options **********
+
+@item --sign-key @code{name}
+@opindex sign-key
+Signs a public key with your secret key. This is a shortcut version of
+the subcommand "sign" from @option{--edit}.
+
+@item --lsign-key @code{name}
+@opindex lsign-key
+Signs a public key with your secret key but marks it as
+non-exportable. This is a shortcut version of the subcommand "lsign"
+from @option{--edit-key}.
+
+
+@end table
+
+
+@c *******************************************
+@c ***************            ****************
+@c ***************  OPTIONS   ****************
+@c ***************            ****************
+@c *******************************************
+@mansect options
+@node GPG Options
+@section Option Summary
+
+@command{@gpgname} comes features a bunch of options to control the exact
+behaviour and to change the default configuration.
+
+@menu
+* GPG Configuration Options::   How to change the configuration.
+* GPG Key related Options::     Key related options.
+* GPG Input and Output::        Input and Output.
+* OpenPGP Options::             OpenPGP protocol specific options.
+* GPG Esoteric Options::        Doing things one usually don't want to do.
+@end menu
+
+Long options can be put in an options file (default
+"~/.gnupg/gpg.conf"). Short option names will not work - for example,
+"armor" is a valid option for the options file, while "a" is not. Do not
+write the 2 dashes, but simply the name of the option and any required
+arguments. Lines with a hash ('#') as the first non-white-space
+character are ignored. Commands may be put in this file too, but that is
+not generally useful as the command will execute automatically with
+every execution of gpg.
+
+Please remember that option parsing stops as soon as a non-option is
+encountered, you can explicitly stop parsing by using the special option
+@option{--}.
+
+@c *******************************************
+@c ********  CONFIGURATION OPTIONS  **********
+@c *******************************************
+@node GPG Configuration Options
+@subsection How to change the configuration
+
+These options are used to change the configuraton and are usually found
+in the option file.
+
+@table @gnupgtabopt
+
+@item --default-key @var{name}
+@opindex default-key
+Use @var{name} as the default key to sign with. If this option is not
+used, the default key is the first key found in the secret keyring.
+Note that @option{-u} or @option{--local-user} overrides this option.
+
+@item --default-recipient @var{name}
+@opindex default-recipient
+Use @var{name} as default recipient if option @option{--recipient} is
+not used and don't ask if this is a valid one. @var{name} must be
+non-empty.
+
+@item --default-recipient-self
+@opindex default-recipient-self
+Use the default key as default recipient if option @option{--recipient} is not
+used and don't ask if this is a valid one. The default key is the first
+one from the secret keyring or the one set with @option{--default-key}.
+
+@item --no-default-recipient
+@opindex no-default-recipient
+Reset @option{--default-recipient} and @option{--default-recipient-self}.
+
+@item -v, --verbose
+@opindex verbose
+Give more information during processing. If used
+twice, the input data is listed in detail.
+
+@item --no-verbose
+@opindex no-verbose
+Reset verbose level to 0.
+
+@item -q, --quiet
+@opindex quiet
+Try to be as quiet as possible.
+
+@item --list-options @code{parameters}
+@opindex list-options
+This is a space or comma delimited string that gives options used when
+listing keys and signatures (that is, @option{--list-keys},
+@option{--list-sigs}, @option{--list-public-keys},
+@option{--list-secret-keys}, and the @option{--edit-key} functions).
+Options can be prepended with a @option{no-} (after the two dashes) to
+give the opposite meaning.  The options are:
+
+@table @asis
+
+@item show-photos
+@opindex list-options:show-photos
+Causes @option{--list-keys}, @option{--list-sigs},
+@option{--list-public-keys}, and @option{--list-secret-keys} to display
+any photo IDs attached to the key.  Defaults to no. See also
+@option{--photo-viewer}.
+
+@item show-policy-urls
+@opindex list-options:show-policy-urls
+Show policy URLs in the @option{--list-sigs} or @option{--check-sigs}
+listings.  Defaults to no.
+
+@item show-notations
+@itemx show-std-notations
+@itemx show-user-notations
+@opindex list-options:show-notations
+@opindex list-options:show-std-notations
+@opindex list-options:show-user-notations
+Show all, IETF standard, or user-defined signature notations in the
+@option{--list-sigs} or @option{--check-sigs} listings. Defaults to no.
+
+@item show-keyserver-urls
+
+Show any preferred keyserver URL in the @option{--list-sigs} or
+@option{--check-sigs} listings. Defaults to no.
+
+@item show-uid-validity
+Display the calculated validity of user IDs during key listings.
+Defaults to no.
+
+@item show-unusable-uids
+Show revoked and expired user IDs in key listings. Defaults to no.
+
+@item show-unusable-subkeys
+Show revoked and expired subkeys in key listings. Defaults to no.
+
+@item show-keyring
+Display the keyring name at the head of key listings to show which
+keyring a given key resides on. Defaults to no.
+
+@item show-sig-expire
+Show signature expiration dates (if any) during @option{--list-sigs} or
+@option{--check-sigs} listings. Defaults to no.
+
+@item show-sig-subpackets
+Include signature subpackets in the key listing. This option can take an
+optional argument list of the subpackets to list. If no argument is
+passed, list all subpackets. Defaults to no. This option is only
+meaningful when using @option{--with-colons} along with
+@option{--list-sigs} or @option{--check-sigs}.
+@end table
+
+@item --verify-options @code{parameters}
+This is a space or comma delimited string that gives options used when
+verifying signatures. Options can be prepended with a `no-' to give
+the opposite meaning. The options are:
+
+@table @asis
+
+@item show-photos
+Display any photo IDs present on the key that issued the signature.
+Defaults to no. See also @option{--photo-viewer}.
+
+@item show-policy-urls
+Show policy URLs in the signature being verified. Defaults to no.
+
+@item show-notations
+@itemx show-std-notations
+@itemx show-user-notations
+Show all, IETF standard, or user-defined signature notations in the
+signature being verified. Defaults to IETF standard.
+
+@item show-keyserver-urls
+Show any preferred keyserver URL in the signature being verified.
+Defaults to no.
+
+@item show-uid-validity
+Display the calculated validity of the user IDs on the key that issued
+the signature. Defaults to no.
+
+@item show-unusable-uids
+Show revoked and expired user IDs during signature verification.
+Defaults to no.
+
+@item pka-lookups
+Enable PKA lookups to verify sender addresses. Note that PKA is based
+on DNS, and so enabling this option may disclose information on when
+and what signatures are verified or to whom data is encrypted. This
+is similar to the "web bug" described for the auto-key-retrieve
+feature.
+
+@item pka-trust-increase
+Raise the trust in a signature to full if the signature passes PKA
+validation. This option is only meaningful if pka-lookups is set.
+@end table
+
+@item --enable-dsa2
+@itemx --disable-dsa2
+Enables new-style DSA keys which (unlike the old style) may be larger
+than 1024 bit and use hashes other than SHA-1 and RIPEMD/160. Note
+that very few programs currently support these keys and signatures
+from them.
+
+@item --photo-viewer @code{string}
+This is the command line that should be run to view a photo ID. "%i"
+will be expanded to a filename containing the photo. "%I" does the
+same, except the file will not be deleted once the viewer exits.
+Other flags are "%k" for the key ID, "%K" for the long key ID, "%f"
+for the key fingerprint, "%t" for the extension of the image type
+(e.g. "jpg"), "%T" for the MIME type of the image (e.g. "image/jpeg"),
+and "%%" for an actual percent sign. If neither %i or %I are present,
+then the photo will be supplied to the viewer on standard input.
+
+The default viewer is "xloadimage -fork -quiet -title 'KeyID 0x%k'
+stdin". Note that if your image viewer program is not secure, then
+executing it from GnuPG does not make it secure.
+
+@item --exec-path @code{string}
+Sets a list of directories to search for photo viewers and keyserver
+helpers. If not provided, keyserver helpers use the compiled-in
+default directory, and photo viewers use the $PATH environment
+variable.
+Note, that on W32 system this value is ignored when searching for
+keyserver helpers.
+
+@item --keyring @code{file}
+Add @code{file} to the current list of keyrings. If @code{file} begins
+with a tilde and a slash, these are replaced by the $HOME directory. If
+the filename does not contain a slash, it is assumed to be in the GnuPG
+home directory ("~/.gnupg" if @option{--homedir} or $GNUPGHOME is not
+used).
+
+Note that this adds a keyring to the current list. If the intent is to
+use the specified keyring alone, use @option{--keyring} along with
+@option{--no-default-keyring}.
+
+@item --secret-keyring @code{file}
+Same as @option{--keyring} but for the secret keyrings.
+
+@item --primary-keyring @code{file}
+Designate @code{file} as the primary public keyring. This means that
+newly imported keys (via @option{--import} or keyserver
+@option{--recv-from}) will go to this keyring.
+
+@item --trustdb-name @code{file}
+Use @code{file} instead of the default trustdb. If @code{file} begins
+with a tilde and a slash, these are replaced by the $HOME directory. If
+the filename does not contain a slash, it is assumed to be in the GnuPG
+home directory (@file{~/.gnupg} if @option{--homedir} or $GNUPGHOME is
+not used).
+
+@ifset gpgone
+@anchor{option --homedir}
+@end ifset
+@include opt-homedir.texi
+
+
+@item --pcsc-driver @code{file}
+Use @code{file} to access the smartcard reader. The current default is
+`libpcsclite.so.1' for GLIBC based systems,
+`/System/Library/Frameworks/PCSC.framework/PCSC' for MAC OS X,
+`winscard.dll' for Windows and `libpcsclite.so' for other systems.
+
+@item --disable-ccid
+Disable the integrated support for CCID compliant readers. This
+allows to fall back to one of the other drivers even if the internal
+CCID driver can handle the reader. Note, that CCID support is only
+available if libusb was available at build time.
+
+@item --reader-port @code{number_or_string}
+This option may be used to specify the port of the card terminal. A
+value of 0 refers to the first serial device; add 32768 to access USB
+devices. The default is 32768 (first USB device). PC/SC or CCID
+readers might need a string here; run the program in verbose mode to get
+a list of available readers. The default is then the first reader
+found.
+
+@item --display-charset @code{name}
+Set the name of the native character set. This is used to convert
+some informational strings like user IDs to the proper UTF-8 encoding.
+Note that this has nothing to do with the character set of data to be
+encrypted or signed; GnuPG does not recode user supplied data. If
+this option is not used, the default character set is determined from
+the current locale. A verbosity level of 3 shows the chosen set.
+Valid values for @code{name} are:
+
+@table @asis
+
+@item iso-8859-1
+This is the Latin 1 set.
+
+@item iso-8859-2
+The Latin 2 set.
+
+@item iso-8859-15
+This is currently an alias for
+the Latin 1 set.
+
+@item koi8-r
+The usual Russian set (rfc1489).
+
+@item utf-8
+Bypass all translations and assume
+that the OS uses native UTF-8 encoding.
+@end table
+
+@item --utf8-strings
+@itemx --no-utf8-strings
+Assume that command line arguments are given as UTF8 strings. The
+default (@option{--no-utf8-strings}) is to assume that arguments are
+encoded in the character set as specified by
+@option{--display-charset}. These options affect all following
+arguments. Both options may be used multiple times.
+
+@ifset gpgone
+@anchor{option --options}
+@end ifset
+@item --options @code{file}
+Read options from @code{file} and do not try to read them from the
+default options file in the homedir (see @option{--homedir}). This
+option is ignored if used in an options file.
+
+@item --no-options
+Shortcut for @option{--options /dev/null}. This option is detected
+before an attempt to open an option file.  Using this option will also
+prevent the creation of a @file{~/.gnupg} homedir.
+
+
+
+@item -z @code{n}
+@itemx --compress-level @code{n}
+@itemx --bzip2-compress-level @code{n}
+Set compression level to @code{n} for the ZIP and ZLIB compression
+algorithms. The default is to use the default compression level of zlib
+(normally 6). @option{--bzip2-compress-level} sets the compression level
+for the BZIP2 compression algorithm (defaulting to 6 as well). This is a
+different option from @option{--compress-level} since BZIP2 uses a
+significant amount of memory for each additional compression level.
+@option{-z} sets both. A value of 0 for @code{n} disables compression.
+
+@item --bzip2-decompress-lowmem
+Use a different decompression method for BZIP2 compressed files. This
+alternate method uses a bit more than half the memory, but also runs
+at half the speed. This is useful under extreme low memory
+circumstances when the file was originally compressed at a high
+@option{--bzip2-compress-level}.
+
+
+@item --mangle-dos-filenames
+@itemx --no-mangle-dos-filenames
+@opindex mangle-dos-filenames
+@opindex no-mangle-dos-filenames
+Older version of Windows cannot handle filenames with more than one
+dot. @option{--mangle-dos-filenames} causes GnuPG to replace (rather
+than add to) the extension of an output filename to avoid this
+problem. This option is off by default and has no effect on non-Windows
+platforms.
+
+@item --ask-cert-level
+@itemx --no-ask-cert-level
+When making a key signature, prompt for a certification level. If this
+option is not specified, the certification level used is set via
+@option{--default-cert-level}. See @option{--default-cert-level} for
+information on the specific levels and how they are
+used. @option{--no-ask-cert-level} disables this option. This option
+defaults to no.
+
+@item --default-cert-level @code{n}
+The default to use for the check level when signing a key.
+
+0 means you make no particular claim as to how carefully you verified
+the key.
+
+1 means you believe the key is owned by the person who claims to own
+it but you could not, or did not verify the key at all. This is
+useful for a "persona" verification, where you sign the key of a
+pseudonymous user.
+
+2 means you did casual verification of the key. For example, this
+could mean that you verified that the key fingerprint and checked the
+user ID on the key against a photo ID.
+
+3 means you did extensive verification of the key. For example, this
+could mean that you verified the key fingerprint with the owner of the
+key in person, and that you checked, by means of a hard to forge
+document with a photo ID (such as a passport) that the name of the key
+owner matches the name in the user ID on the key, and finally that you
+verified (by exchange of email) that the email address on the key
+belongs to the key owner.
+
+Note that the examples given above for levels 2 and 3 are just that:
+examples. In the end, it is up to you to decide just what "casual"
+and "extensive" mean to you.
+
+This option defaults to 0 (no particular claim).
+
+@item --min-cert-level
+When building the trust database, treat any signatures with a
+certification level below this as invalid. Defaults to 2, which
+disregards level 1 signatures. Note that level 0 "no particular
+claim" signatures are always accepted.
+
+@item --trusted-key @code{long key ID}
+Assume that the specified key (which must be given
+as a full 8 byte key ID) is as trustworthy as one of
+your own secret keys. This option is useful if you
+don't want to keep your secret keys (or one of them)
+online but still want to be able to check the validity of a given
+recipient's or signator's key.
+
+@item --trust-model @code{pgp|classic|direct|always|auto}
+Set what trust model GnuPG should follow. The models are:
+
+@table @asis
+
+@item pgp
+This is the Web of Trust combined with trust signatures as used in PGP
+5.x and later. This is the default trust model when creating a new
+trust database.
+
+@item classic
+This is the standard Web of Trust as used in PGP 2.x and earlier.
+
+@item direct
+Key validity is set directly by the user and not calculated via the
+Web of Trust.
+
+@item always
+Skip key validation and assume that used keys are always fully
+trusted. You generally won't use this unless you are using some
+external validation scheme. This option also suppresses the
+"[uncertain]" tag printed with signature checks when there is no
+evidence that the user ID is bound to the key.
+
+@item auto
+Select the trust model depending on whatever the internal trust
+database says. This is the default model if such a database already
+exists.
+@end table
+
+@item --auto-key-locate @code{parameters}
+@itemx --no-auto-key-locate
+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 user@@example.com keys on
+the local keyring. This option takes any number of the following
+arguments, in the order they are to be tried:
+
+@table @asis
+
+@item cert
+locate a key using DNS CERT, as specified in 2538bis (currently in
+draft): http://www.josefsson.org/rfc2538bis/
+
+@item pka
+locate a key using DNS PKA.
+
+@item ldap
+locate a key using the PGP Universal method of checking
+"ldap://keys.(thedomain)".
+
+@item keyserver
+locate a key using whatever keyserver is defined using the
+@option{--keyserver} option.
+
+@item (keyserver URL)
+In addition, a keyserver URL as used in the @option{--keyserver} option may be
+used here to query that particular keyserver.
+@end table
+
+@item --keyid-format @code{short|0xshort|long|0xlong}
+Select how to display key IDs. "short" is the traditional 8-character
+key ID. "long" is the more accurate (but less convenient)
+16-character key ID. Add an "0x" to either to include an "0x" at the
+beginning of the key ID, as in 0x99242560.
+
+@item --keyserver @code{name}
+Use @code{name} as your keyserver. This is the server that
+@option{--recv-keys}, @option{--send-keys}, and @option{--search-keys}
+will communicate with to receive keys from, send keys to, and search for
+keys on. The format of the @code{name} is a URI:
+`scheme:[//]keyservername[:port]' The scheme is the type of keyserver:
+"hkp" for the HTTP (or compatible) keyservers, "ldap" for the LDAP
+keyservers, or "mailto" for the Graff email keyserver. Note that your
+particular installation of GnuPG may have other keyserver types
+available as well. Keyserver schemes are case-insensitive. After the
+keyserver name, optional keyserver configuration options may be
+provided. These are the same as the global @option{--keyserver-options}
+from below, but apply only to this particular keyserver.
+
+Most keyservers synchronize with each other, so there is generally no
+need to send keys to more than one server. The keyserver
+@code{hkp://subkeys.pgp.net} uses round robin DNS to give a different
+keyserver each time you use it.
+
+@item --keyserver-options @code{name=value1 }
+This is a space or comma delimited string that gives options for the
+keyserver. Options can be prepended with a `no-' to give the opposite
+meaning. Valid import-options or export-options may be used here as well
+to apply to importing (@option{--recv-key}) or exporting
+(@option{--send-key}) a key from a keyserver. While not all options are
+available for all keyserver types, some common options are:
+
+@table @asis
+
+@item include-revoked
+When searching for a key with @option{--search-keys}, include keys that
+are marked on the keyserver as revoked. Note that not all keyservers
+differentiate between revoked and unrevoked keys, and for such
+keyservers this option is meaningless. Note also that most keyservers do
+not have cryptographic verification of key revocations, and so turning
+this option off may result in skipping keys that are incorrectly marked
+as revoked.
+
+@item include-disabled
+When searching for a key with @option{--search-keys}, include keys that
+are marked on the keyserver as disabled. Note that this option is not
+used with HKP keyservers.
+
+@item auto-key-retrieve
+This option enables the automatic retrieving of keys from a keyserver
+when verifying signatures made by keys that are not on the local
+keyring.
+
+Note that this option makes a "web bug" like behavior possible.
+Keyserver operators can see which keys you request, so by sending you
+a message signed by a brand new key (which you naturally will not have
+on your local keyring), the operator can tell both your IP address and
+the time when you verified the signature.
+
+@item honor-keyserver-url
+When using @option{--refresh-keys}, if the key in question has a preferred
+keyserver URL, then use that preferred keyserver to refresh the key
+from. In addition, if auto-key-retrieve is set, and the signature
+being verified has a preferred keyserver URL, then use that preferred
+keyserver to fetch the key from. Defaults to yes.
+
+@item honor-pka-record
+If auto-key-retrieve is set, and the signature being verified has a
+PKA record, then use the PKA information to fetch the key. Defaults
+to yes.
+
+@item include-subkeys
+When receiving a key, include subkeys as potential targets. Note that
+this option is not used with HKP keyservers, as they do not support
+retrieving keys by subkey id.
+
+@item use-temp-files
+On most Unix-like platforms, GnuPG communicates with the keyserver
+helper program via pipes, which is the most efficient method. This
+option forces GnuPG to use temporary files to communicate. On some
+platforms (such as Win32 and RISC OS), this option is always enabled.
+
+@item keep-temp-files
+If using `use-temp-files', do not delete the temp files after using
+them. This option is useful to learn the keyserver communication
+protocol by reading the temporary files.
+
+@item verbose
+Tell the keyserver helper program to be more verbose. This option can
+be repeated multiple times to increase the verbosity level.
+
+@item timeout
+Tell the keyserver helper program how long (in seconds) to try and
+perform a keyserver action before giving up. Note that performing
+multiple actions at the same time uses this timeout value per action.
+For example, when retrieving multiple keys via @option{--recv-keys}, the
+timeout applies separately to each key retrieval, and not to the
+@option{--recv-keys} command as a whole. Defaults to 30 seconds.
+
+@item http-proxy
+For HTTP-like keyserver schemes that (such as HKP and HTTP itself),
+try to access the keyserver over a proxy. If a @code{value} is
+specified, use this as the HTTP proxy. If no @code{value} is
+specified, the value of the environment variable "http_proxy", if any,
+will be used.
+
+@item max-cert-size
+When retrieving a key via DNS CERT, only accept keys up to this size.
+Defaults to 16384 bytes.
+@end table
+
+@item --completes-needed @code{n}
+Number of completely trusted users to introduce a new
+key signer (defaults to 1).
+
+@item --marginals-needed @code{n}
+Number of marginally trusted users to introduce a new
+key signer (defaults to 3)
+
+@item --max-cert-depth @code{n}
+Maximum depth of a certification chain (default is 5).
+
+@item --simple-sk-checksum
+Secret keys are integrity protected by using a SHA-1 checksum. This
+method is part of the upcoming enhanced OpenPGP specification but
+GnuPG already uses it as a countermeasure against certain attacks.
+Old applications don't understand this new format, so this option may
+be used to switch back to the old behaviour. Using this option bears
+a security risk. Note that using this option only takes effect when
+the secret key is encrypted - the simplest way to make this happen is
+to change the passphrase on the key (even changing it to the same
+value is acceptable).
+
+@item --no-sig-cache
+Do not cache the verification status of key signatures.
+Caching gives a much better performance in key listings. However, if
+you suspect that your public keyring is not save against write
+modifications, you can use this option to disable the caching. It
+probably does not make sense to disable it because all kind of damage
+can be done if someone else has write access to your public keyring.
+
+@item --no-sig-create-check
+GnuPG normally verifies each signature right after creation to protect
+against bugs and hardware malfunctions which could leak out bits from
+the secret key. This extra verification needs some time (about 115%
+for DSA keys), and so this option can be used to disable it.
+However, due to the fact that the signature creation needs manual
+interaction, this performance penalty does not matter in most settings.
+
+@item --auto-check-trustdb
+@itemx --no-auto-check-trustdb
+If GnuPG feels that its information about the Web of Trust has to be
+updated, it automatically runs the @option{--check-trustdb} command
+internally.  This may be a time consuming
+process. @option{--no-auto-check-trustdb} disables this option.
+
+@item --use-agent
+@itemx --no-use-agent
+@ifclear gpgone
+This is dummy option. @command{@gpgname} always requires the agent.
+@end ifclear
+@ifset gpgone
+Try to use the GnuPG-Agent.  With this option, GnuPG first tries to
+connect to the agent before it asks for a
+passphrase. @option{--no-use-agent} disables this option.
+@end ifset
+
+@item --gpg-agent-info
+Override the value of the environment variable
+@samp{GPG_AGENT_INFO}. This is only used when @option{--use-agent} has
+been given
+
+@item --lock-once
+Lock the databases the first time a lock is requested
+and do not release the lock until the process
+terminates.
+
+@item --lock-multiple
+Release the locks every time a lock is no longer
+needed. Use this to override a previous @option{--lock-once}
+from a config file.
+
+@item --lock-never
+Disable locking entirely. This option should be used only in very
+special environments, where it can be assured that only one process
+is accessing those files. A bootable floppy with a stand-alone
+encryption system will probably use this. Improper usage of this
+option may lead to data and key corruption.
+
+@item --exit-on-status-write-error
+This option will cause write errors on the status FD to immediately
+terminate the process. That should in fact be the default but it never
+worked this way and thus we need an option to enable this, so that the
+change won't break applications which close their end of a status fd
+connected pipe too early. Using this option along with
+@option{--enable-progress-filter} may be used to cleanly cancel long
+running gpg operations.
+
+@item --limit-card-insert-tries @code{n}
+With @code{n} greater than 0 the number of prompts asking to insert a
+smartcard gets limited to N-1. Thus with a value of 1 gpg won't at
+all ask to insert a card if none has been inserted at startup. This
+option is useful in the configuration file in case an application does
+not know about the smartcard support and waits ad infinitum for an
+inserted card.
+
+@item --no-random-seed-file
+GnuPG uses a file to store its internal random pool over invocations.
+This makes random generation faster; however sometimes write operations
+are not desired. This option can be used to achieve that with the cost of
+slower random generation.
+
+@item --no-greeting
+Suppress the initial copyright message.
+
+@item --no-secmem-warning
+Suppress the warning about "using insecure memory".
+
+@item --no-permission-warning
+Suppress the warning about unsafe file and home directory (@option{--homedir})
+permissions. Note that the permission checks that GnuPG performs are
+not intended to be authoritative, but rather they simply warn about
+certain common permission problems. Do not assume that the lack of a
+warning means that your system is secure.
+
+Note that the warning for unsafe @option{--homedir} permissions cannot be
+suppressed in the gpg.conf file, as this would allow an attacker to
+place an unsafe gpg.conf file in place, and use this file to suppress
+warnings about itself. The @option{--homedir} permissions warning may only be
+suppressed on the command line.
+
+@item --no-mdc-warning
+Suppress the warning about missing MDC integrity protection.
+
+@item --require-secmem
+@itemx --no-require-secmem
+Refuse to run if GnuPG cannot get secure memory. Defaults to no
+(i.e. run, but give a warning).
+
+
+@item --require-cross-certification
+@itemx --no-require-cross-certification
+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 @option{--require-cross-certification} for
+@command{@gpgname}.
+
+@item --expert
+@itemx --no-expert
+Allow the user to do certain nonsensical or "silly" things like
+signing an expired or revoked key, or certain potentially incompatible
+things like generating unusual key types. This also disables certain
+warning messages about potentially incompatible actions. As the name
+implies, this option is for experts only. If you don't fully
+understand the implications of what it allows you to do, leave this
+off. @option{--no-expert} disables this option.
+
+
+
+
+@end table
+
+
+@c *******************************************
+@c ********  KEY RELATED OPTIONS  ************
+@c *******************************************
+@node GPG Key related Options
+@subsection Key related options
+
+@table @gnupgtabopt
+
+@item --recipient @var{name}
+@itemx -r
+@opindex recipient
+Encrypt for user id @var{name}. If this option or
+@option{--hidden-recipient} is not specified, GnuPG asks for the user-id
+unless @option{--default-recipient} is given.
+
+@item --hidden-recipient @var{name}
+@itemx -R
+@opindex hidden-recipient
+Encrypt for user ID @var{name}, but hide the key ID of this user's
+key. This option helps to hide the receiver of the message and is a
+limited countermeasure against traffic analysis. If this option or
+@option{--recipient} is not specified, GnuPG asks for the user ID unless
+@option{--default-recipient} is given.
+
+@item --encrypt-to @code{name}
+Same as @option{--recipient} but this one is intended for use in the
+options file and may be used with your own user-id as an
+"encrypt-to-self". These keys are only used when there are other
+recipients given either by use of @option{--recipient} or by the asked
+user id.  No trust checking is performed for these user ids and even
+disabled keys can be used.
+
+@item --hidden-encrypt-to @code{name}
+Same as @option{--hidden-recipient} but this one is intended for use in the
+options file and may be used with your own user-id as a hidden
+"encrypt-to-self". These keys are only used when there are other
+recipients given either by use of @option{--recipient} or by the asked user id.
+No trust checking is performed for these user ids and even disabled
+keys can be used.
+
+@item --no-encrypt-to
+Disable the use of all @option{--encrypt-to} and
+@option{--hidden-encrypt-to} keys.
+
+@item --group @code{name=value1 }
+Sets up a named group, which is similar to aliases in email programs.
+Any time the group name is a recipient (@option{-r} or
+@option{--recipient}), it will be expanded to the values
+specified. Multiple groups with the same name are automatically merged
+into a single group.
+
+The values are @code{key IDs} or fingerprints, but any key description
+is accepted. Note that a value with spaces in it will be treated as
+two different values. Note also there is only one level of expansion
+--- you cannot make an group that points to another group. When used
+from the command line, it may be necessary to quote the argument to
+this option to prevent the shell from treating it as multiple
+arguments.
+
+@item --ungroup @code{name}
+Remove a given entry from the @option{--group} list.
+
+@item --no-groups
+Remove all entries from the @option{--group} list.
+
+@item --local-user @var{name}
+@itemx -u
+@opindex local-user
+Use @var{name} as the key to sign with. Note that this option overrides
+@option{--default-key}.
+
+@item --try-all-secrets
+Don't look at the key ID as stored in the message but try all secret
+keys in turn to find the right decryption key. This option forces the
+behaviour as used by anonymous recipients (created by using
+@option{--throw-keyids}) and might come handy in case where an encrypted
+message contains a bogus key ID.
+
+
+
+
+
+@end table
+
+@c *******************************************
+@c ********  INPUT AND OUTPUT  ***************
+@c *******************************************
+@node GPG Input and Output
+@subsection Input and Output
+
+@table @gnupgtabopt
+
+@item --armor
+@itemx -a
+@opindex armor
+Create ASCII armored output.  The default is to create the binary
+OpenPGP format.
+
+@item --no-armor
+Assume the input data is not in ASCII armored format.
+
+@item --output @var{file}
+@itemx -o @var{file}
+@opindex output
+Write output to @var{file}.
+
+@item --max-output @code{n}
+@opindex max-output
+This option sets a limit on the number of bytes that will be generated
+when processing a file. Since OpenPGP supports various levels of
+compression, it is possible that the plaintext of a given message may be
+significantly larger than the original OpenPGP message. While GnuPG
+works properly with such messages, there is often a desire to set a
+maximum file size that will be generated before processing is forced to
+stop by the OS limits. Defaults to 0, which means "no limit".
+
+@item --import-options @code{parameters}
+This is a space or comma delimited string that gives options for
+importing keys. Options can be prepended with a `no-' to give the
+opposite meaning. The options are:
+
+@table @asis
+
+@item import-local-sigs
+Allow importing key signatures marked as "local". This is not
+generally useful unless a shared keyring scheme is being used.
+Defaults to no.
+
+@item repair-pks-subkey-bug
+During import, attempt to repair the damage caused by the PKS keyserver
+bug (pre version 0.9.6) that mangles keys with multiple subkeys. Note
+that this cannot completely repair the damaged key as some crucial data
+is removed by the keyserver, but it does at least give you back one
+subkey. Defaults to no for regular @option{--import} and to yes for
+keyserver @option{--recv-keys}.
+
+@item merge-only
+During import, allow key updates to existing keys, but do not allow
+any new keys to be imported. Defaults to no.
+
+@item import-clean
+After import, compact (remove all signatures except the
+self-signature) any user IDs from the new key that are not usable.
+Then, remove any signatures from the new key that are not usable.
+This includes signatures that were issued by keys that are not present
+on the keyring. This option is the same as running the @option{--edit-key}
+command "clean" after import. Defaults to no.
+
+@item import-minimal
+Import the smallest key possible. This removes all signatures except
+the most recent self-signature on each user ID. This option is the
+same as running the @option{--edit-key} command "minimize" after import.
+Defaults to no.
+@end table
+
+@item --export-options @code{parameters}
+This is a space or comma delimited string that gives options for
+exporting keys. Options can be prepended with a `no-' to give the
+opposite meaning. The options are:
+
+@table @asis
+
+@item export-local-sigs
+Allow exporting key signatures marked as "local". This is not
+generally useful unless a shared keyring scheme is being used.
+Defaults to no.
+
+@item export-attributes
+Include attribute user IDs (photo IDs) while exporting. This is
+useful to export keys if they are going to be used by an OpenPGP
+program that does not accept attribute user IDs. Defaults to yes.
+
+@item export-sensitive-revkeys
+Include designated revoker information that was marked as
+"sensitive". Defaults to no.
+
+@item export-reset-subkey-passwd
+When using the @option{--export-secret-subkeys} command, this option resets
+the passphrases for all exported subkeys to empty. This is useful
+when the exported subkey is to be used on an unattended machine where
+a passphrase doesn't necessarily make sense. Defaults to no.
+
+@item export-clean
+Compact (remove all signatures from) user IDs on the key being
+exported if the user IDs are not usable. Also, do not export any
+signatures that are not usable. This includes signatures that were
+issued by keys that are not present on the keyring. This option is
+the same as running the @option{--edit-key} command "clean" before export
+except that the local copy of the key is not modified. Defaults to
+no.
+
+@item export-minimal
+Export the smallest key possible. This removes all signatures except the
+most recent self-signature on each user ID. This option is the same as
+running the @option{--edit-key} command "minimize" before export except
+that the local copy of the key is not modified. Defaults to no.
+@end table
+
+@item --with-colons
+@opindex with-colons
+Print key listings delimited by colons. Note that the output will be
+encoded in UTF-8 regardless of any @option{--display-charset} setting. This
+format is useful when GnuPG is called from scripts and other programs
+as it is easily machine parsed. The details of this format are
+documented in the file @file{doc/DETAILS}, which is included in the GnuPG
+source distribution.
+
+@item --fixed-list-mode
+@opindex fixed-list-mode
+Do not merge primary user ID and primary key in @option{--with-colon}
+listing mode and print all timestamps as seconds since 1970-01-01.
+
+@item --with-fingerprint
+@opindex with-fingerprint
+Same as the command @option{--fingerprint} but changes only the format
+of the output and may be used together with another command.
+
+
+@end table
+
+@c *******************************************
+@c ********  OPENPGP OPTIONS  ****************
+@c *******************************************
+@node OpenPGP Options
+@subsection OpenPGP protocol specific options.
+
+@table @gnupgtabopt
+
+@item -t, --textmode
+@itemx --no-textmode
+Treat input files as text and store them in the OpenPGP canonical text
+form with standard "CRLF" line endings. This also sets the necessary
+flags to inform the recipient that the encrypted or signed data is text
+and may need its line endings converted back to whatever the local
+system uses. This option is useful when communicating between two
+platforms that have different line ending conventions (UNIX-like to Mac,
+Mac to Windows, etc). @option{--no-textmode} disables this option, and
+is the default.
+
+@ifset gpgone
+If @option{-t} (but not @option{--textmode}) is used together with
+armoring and signing, this enables clearsigned messages. This kludge is
+needed for command-line compatibility with command-line versions of PGP;
+normally you would use @option{--sign} or @option{--clearsign} to select
+the type of the signature.
+@end ifset
+
+
+
+@item --force-v3-sigs
+@itemx --no-force-v3-sigs
+OpenPGP states that an implementation should generate v4 signatures
+but PGP versions 5 through 7 only recognize v4 signatures on key
+material. This option forces v3 signatures for signatures on data.
+Note that this option overrides @option{--ask-sig-expire}, as v3 signatures
+cannot have expiration dates. @option{--no-force-v3-sigs} disables this
+option.
+
+@item --force-v4-certs
+@itemx --no-force-v4-certs
+Always use v4 key signatures even on v3 keys. This option also
+changes the default hash algorithm for v3 RSA keys from MD5 to SHA-1.
+@option{--no-force-v4-certs} disables this option.
+
+@item --force-mdc
+Force the use of encryption with a modification detection code. This
+is always used with the newer ciphers (those with a blocksize greater
+than 64 bits), or if all of the recipient keys indicate MDC support in
+their feature flags.
+
+@item --disable-mdc
+Disable the use of the modification detection code. Note that by
+using this option, the encrypted message becomes vulnerable to a
+message modification attack.
+
+@item --personal-cipher-preferences @code{string}
+Set the list of personal cipher preferences to @code{string}, this list
+should be a string similar to the one printed by the command "pref" in
+the edit menu. This allows the user to factor in their own preferred
+algorithms when algorithms are chosen via recipient key preferences.
+The most highly ranked cipher in this list is also used for the
+@option{--symmetric} encryption command.
+
+@item --personal-digest-preferences @code{string}
+Set the list of personal digest preferences to @code{string}, this list
+should be a string similar to the one printed by the command "pref" in
+the edit menu. This allows the user to factor in their own preferred
+algorithms when algorithms are chosen via recipient key preferences.
+The most highly ranked digest algorithm in this list is algo used when
+signing without encryption (e.g. @option{--clearsign} or
+@option{--sign}). The default value is SHA-1.
+
+@item --personal-compress-preferences @code{string}
+Set the list of personal compression preferences to @code{string}, this
+list should be a string similar to the one printed by the command
+"pref" in the edit menu. This allows the user to factor in their own
+preferred algorithms when algorithms are chosen via recipient key
+preferences. The most highly ranked algorithm in this list is also
+used when there are no recipient keys to consider (e.g. @option{--symmetric}).
+
+
+
+@item --s2k-cipher-algo @code{name}
+Use @code{name} as the cipher algorithm used to protect secret keys.
+The default cipher is CAST5. This cipher is also used for
+conventional encryption if @option{--personal-cipher-preferences} and
+@option{--cipher-algo} is not given.
+
+@item --s2k-digest-algo @code{name}
+Use @code{name} as the digest algorithm used to mangle the passphrases.
+The default algorithm is SHA-1.
+
+@item --s2k-mode @code{n}
+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 conventional encryption.
+
+@item --s2k-count @code{n}
+Specify how many times the passphrase mangling is repeated.  This
+value may range between 1024 and 65011712 inclusive, and the default
+is 65536.  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.
+
+
+@end table
+
+@c ***************************
+@c ******* Compliance ********
+@c ***************************
+@subsection Compliance options
+
+These options control what GnuPG is compliant to. Only one of these
+options may be active at a time. Note that the default setting of
+this is nearly always the correct one. See the INTEROPERABILITY WITH
+OTHER OPENPGP PROGRAMS section below before using one of these
+options.
+
+@table @gnupgtabopt
+
+@item --gnupg
+@opindex gnupg
+Use standard GnuPG behavior. This is essentially OpenPGP behavior
+(see @option{--openpgp}), but with some additional workarounds for common
+compatibility problems in different versions of PGP. This is the
+default option, so it is not generally needed, but it may be useful to
+override a different compliance option in the gpg.conf file.
+
+@item --openpgp
+@opindex openpgp
+Reset all packet, cipher and digest options to strict OpenPGP
+behavior. Use this option to reset all previous options like
+@option{--rfc1991}, @option{--force-v3-sigs}, @option{--s2k-*},
+@option{--cipher-algo}, @option{--digest-algo} and
+@option{--compress-algo} to OpenPGP compliant values. All PGP
+workarounds are disabled.
+
+@item --rfc2440
+@opindex rfc2440
+Reset all packet, cipher and digest options to strict RFC-2440
+behavior. Note that this is currently the same thing as @option{--openpgp}.
+
+@item --rfc1991
+@opindex rfc1991
+Try to be more RFC-1991 (PGP 2.x) compliant.
+
+@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
+--no-sk-comment --escape-from-lines --force-v3-sigs --no-ask-sig-expire
+--no-ask-cert-expire --cipher-algo IDEA --digest-algo MD5
+--compress-algo 1}. It also disables @option{--textmode} when
+encrypting.
+
+@item --pgp6
+@opindex pgp6
+Set up all options to be as PGP 6 compliant as possible. This
+restricts you to the ciphers IDEA (if the IDEA plugin is installed),
+3DES, and CAST5, the hashes MD5, SHA1 and RIPEMD160, and the
+compression algorithms none and ZIP. This also disables
+--throw-keyids, and making signatures with signing subkeys as PGP 6
+does not understand signatures made by signing subkeys.
+
+This option implies @option{--disable-mdc --no-sk-comment
+--escape-from-lines --force-v3-sigs --no-ask-sig-expire}.
+
+@item --pgp7
+@opindex pgp7
+Set up all options to be as PGP 7 compliant as possible. This is
+identical to @option{--pgp6} except that MDCs are not disabled, and the
+list of allowable ciphers is expanded to add AES128, AES192, AES256, and
+TWOFISH.
+
+@item --pgp8
+@opindex pgp8
+Set up all options to be as PGP 8 compliant as possible. PGP 8 is a lot
+closer to the OpenPGP standard than previous versions of PGP, so all
+this does is disable @option{--throw-keyids} and set
+@option{--escape-from-lines}.  All algorithms are allowed except for the
+SHA224, SHA384, and SHA512 digests.
+
+@end table
+
+
+@c *******************************************
+@c ********  ESOTERIC OPTIONS  ***************
+@c *******************************************
+@node GPG Esoteric Options
+@subsection Doing things one usually don't want to do.
+
+@table @gnupgtabopt
+
+@item -n
+@itemx --dry-run
+@opindex dry-run
+Don't make any changes (this is not completely implemented).
+
+@item --list-only
+Changes the behaviour of some commands. This is like @option{--dry-run} but
+different in some cases. The semantic of this command may be extended in
+the future. Currently it only skips the actual decryption pass and
+therefore enables a fast listing of the encryption keys.
+
+@item -i
+@itemx --interactive
+@opindex interactive
+Prompt before overwriting any files.
+
+@item --debug @var{flags}
+@opindex debug
+Set debugging flags. All flags are or-ed and @var{flags} may
+be given in C syntax (e.g. 0x0042).
+
+@item --debug-all
+Set all useful debugging flags.
+
+@ifset gpgone
+@item --debug-ccid-driver
+Enable debug output from the included CCID driver for smartcards.
+Note that this option is only available on some system.
+@end ifset
+
+@item --enable-progress-filter
+Enable certain PROGRESS status outputs. This option allows frontends
+to display a progress indicator while gpg is processing larger files.
+There is a slight performance overhead using it.
+
+@item --status-fd @code{n}
+Write special status strings to the file descriptor @code{n}.
+See the file DETAILS in the documentation for a listing of them.
+
+@item --status-file @code{file}
+Same as @option{--status-fd}, except the status data is written to file
+@code{file}.
+
+@item --logger-fd @code{n}
+Write log output to file descriptor @code{n} and not to stderr.
+
+@item --logger-file @code{file}
+Same as @option{--logger-fd}, except the logger data is written to file
+@code{file}.
+
+@item --attribute-fd @code{n}
+Write attribute subpackets to the file descriptor @code{n}. This is most
+useful for use with @option{--status-fd}, since the status messages are
+needed to separate out the various subpackets from the stream delivered
+to the file descriptor.
+
+@item --attribute-file @code{file}
+Same as @option{--attribute-fd}, except the attribute data is written to
+file @code{file}.
+
+@item --comment @code{string}
+@itemx --no-comments
+Use @code{string} as a comment string in clear text signatures and ASCII
+armored messages or keys (see @option{--armor}). The default behavior is
+not to use a comment string. @option{--comment} may be repeated multiple
+times to get multiple comment strings. @option{--no-comments} removes
+all comments.  It is a good idea to keep the length of a single comment
+below 60 characters to avoid problems with mail programs wrapping such
+lines.  Note that comment lines, like all other header lines, are not
+protected by the signature.
+
+@item --emit-version
+@itemx --no-emit-version
+Force inclusion of the version string in ASCII armored output.
+@option{--no-emit-version} disables this option.
+
+@item --sig-notation @code{name=value}
+@itemx --cert-notation @code{name=value}
+@itemx -N, --set-notation @code{name=value}
+Put the name value pair into the signature as notation data.
+@code{name} must consist only of printable characters or spaces, and
+must contain a '@@' character in the form keyname@@domain.example.com
+(substituting the appropriate keyname and domain name, of course).  This
+is to help prevent pollution of the IETF reserved notation
+namespace. The @option{--expert} flag overrides the '@@'
+check. @code{value} may be any printable string; it will be encoded in
+UTF8, so you should check that your @option{--display-charset} is set
+correctly. If you prefix @code{name} with an exclamation mark (!), the
+notation data will be flagged as critical
+(rfc2440:5.2.3.15). @option{--sig-notation} sets a notation for data
+signatures. @option{--cert-notation} sets a notation for key signatures
+(certifications). @option{--set-notation} sets both.
+
+There are special codes that may be used in notation names. "%k" will
+be expanded into the key ID of the key being signed, "%K" into the
+long key ID of the key being signed, "%f" into the fingerprint of the
+key being signed, "%s" into the key ID of the key making the
+signature, "%S" into the long key ID of the key making the signature,
+"%g" into the fingerprint of the key making the signature (which might
+be a subkey), "%p" into the fingerprint of the primary key of the key
+making the signature, "%c" into the signature count from the OpenPGP
+smartcard, and "%%" results in a single "%". %k, %K, and %f are only
+meaningful when making a key signature (certification), and %c is only
+meaningful when using the OpenPGP smartcard.
+
+@item --sig-policy-url @code{string}
+@itemx --cert-policy-url @code{string}
+@itemx --set-policy-url @code{string}
+Use @code{string} as a Policy URL for signatures (rfc2440:5.2.3.19).  If
+you prefix it with an exclamation mark (!), the policy URL packet will
+be flagged as critical. @option{--sig-policy-url} sets a policy url for
+data signatures. @option{--cert-policy-url} sets a policy url for key
+signatures (certifications). @option{--set-policy-url} sets both.
+
+The same %-expandos used for notation data are available here as well.
+
+@item --sig-keyserver-url @code{string}
+Use @code{string} as a preferred keyserver URL for data signatures. If
+you prefix it with an exclamation mark, the keyserver URL packet will
+be flagged as critical.
+
+The same %-expandos used for notation data are available here as well.
+
+@item --set-filename @code{string}
+Use @code{string} as the filename which is stored inside messages.
+This overrides the default, which is to use the actual filename of the
+file being encrypted.
+
+@item --for-your-eyes-only
+@itemx --no-for-your-eyes-only
+Set the `for your eyes only' flag in the message. This causes GnuPG
+to refuse to save the file unless the @option{--output} option is given, and
+PGP to use the "secure viewer" with a Tempest-resistant font to
+display the message. This option overrides @option{--set-filename}.
+@option{--no-for-your-eyes-only} disables this option.
+
+@item --use-embedded-filename
+@itemx --no-use-embedded-filename
+Try to create a file with a name as embedded in the data. This can be
+a dangerous option as it allows to overwrite files. Defaults to no.
+
+@item --cipher-algo @code{name}
+Use @code{name} as cipher algorithm. Running the program with the
+command @option{--version} yields a list of supported algorithms. If
+this is not used the cipher algorithm is selected from the preferences
+stored with the key. In general, you do not want to use this option as
+it allows you to violate the OpenPGP standard.
+@option{--personal-cipher-preferences} is the safe way to accomplish the
+same thing.
+
+@item --digest-algo @code{name}
+Use @code{name} as the message digest algorithm. Running the program
+with the command @option{--version} yields a list of supported algorithms. In
+general, you do not want to use this option as it allows you to
+violate the OpenPGP standard. @option{--personal-digest-preferences} is the
+safe way to accomplish the same thing.
+
+@item --compress-algo @code{name}
+Use compression algorithm @code{name}. "zlib" is RFC-1950 ZLIB
+compression. "zip" is RFC-1951 ZIP compression which is used by PGP.
+"bzip2" is a more modern compression scheme that can compress some
+things better than zip or zlib, but at the cost of more memory used
+during compression and decompression. "uncompressed" or "none"
+disables compression. If this option is not used, the default
+behavior is to examine the recipient key preferences to see which
+algorithms the recipient supports. If all else fails, ZIP is used for
+maximum compatibility.
+
+ZLIB may give better compression results than ZIP, as the compression
+window size is not limited to 8k. BZIP2 may give even better
+compression results than that, but will use a significantly larger
+amount of memory while compressing and decompressing. This may be
+significant in low memory situations. Note, however, that PGP (all
+versions) only supports ZIP compression. Using any algorithm other
+than ZIP or "none" will make the message unreadable with PGP. In
+general, you do not want to use this option as it allows you to
+violate the OpenPGP standard. @option{--personal-compress-preferences} is the
+safe way to accomplish the same thing.
+
+@item --cert-digest-algo @code{name}
+Use @code{name} as the message digest algorithm used when signing a
+key. Running the program with the command @option{--version} yields a
+list of supported algorithms. Be aware that if you choose an algorithm
+that GnuPG supports but other OpenPGP implementations do not, then some
+users will not be able to use the key signatures you make, or quite
+possibly your entire key.
+
+@item --disable-cipher-algo @code{name}
+Never allow the use of @code{name} as cipher algorithm.
+The given name will not be checked so that a later loaded algorithm
+will still get disabled.
+
+@item --disable-pubkey-algo @code{name}
+Never allow the use of @code{name} as public key algorithm.
+The given name will not be checked so that a later loaded algorithm
+will still get disabled.
+
+@item --throw-keyids
+@itemx --no-throw-keyids
+Do not put the recipient key IDs into encrypted messages. This helps
+to hide the receivers of the message and is a limited countermeasure
+against traffic analysis. On the receiving side, it may slow down the
+decryption process because all available secret keys must be tried.
+@option{--no-throw-keyids} disables this option. This option is essentially
+the same as using @option{--hidden-recipient} for all recipients.
+
+@item --not-dash-escaped
+This option changes the behavior of cleartext signatures
+so that they can be used for patch files. You should not
+send such an armored file via email because all spaces
+and line endings are hashed too. You can not use this
+option for data which has 5 dashes at the beginning of a
+line, patch files don't have this. A special armor header
+line tells GnuPG about this cleartext signature option.
+
+@item --escape-from-lines
+@itemx --no-escape-from-lines
+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 to prevent the mail system from breaking the signature. Note
+that all other PGP versions do it this way too.  Enabled by
+default. @option{--no-escape-from-lines} disables this option.
+
+@item --passphrase-repeat @code{n}
+Specify how many times @command{@gpgname} will request a new
+passphrase be repeated.  This is useful for helping memorize a
+passphrase.  Defaults to 1 repetition.
+
+@item --passphrase-fd @code{n}
+Read the passphrase from file descriptor @code{n}. Only the first line
+will be read from file descriptor @code{n}. If you use 0 for @code{n},
+the passphrase will be read from stdin. This can only be used if only
+one passphrase is supplied.
+@ifclear gpgone
+Note that this passphrase is only used if the option @option{--batch}
+has also been given.  This is different from @command{gpg}.
+@end ifclear
+
+@item --passphrase-file @code{file}
+Read the passphrase from file @code{file}. Only the first line will
+be read from file @code{file}. This can only be used if only one
+passphrase is supplied. Obviously, a passphrase stored in a file is
+of questionable security if other users can read this file. Don't use
+this option if you can avoid it.
+@ifclear gpgone
+Note that this passphrase is only used if the option @option{--batch}
+has also been given.  This is different from @command{gpg}.
+@end ifclear
+
+@item --passphrase @code{string}
+Use @code{string} as the passphrase. This can only be used if only one
+passphrase is supplied. Obviously, this is of very questionable
+security on a multi-user system. Don't use this option if you can
+avoid it.
+@ifclear gpgone
+Note that this passphrase is only used if the option @option{--batch}
+has also been given.  This is different from @command{gpg}.
+@end ifclear
+
+@item --command-fd @code{n}
+This is a replacement for the deprecated shared-memory IPC mode.
+If this option is enabled, user input on questions is not expected
+from the TTY but from the given file descriptor. It should be used
+together with @option{--status-fd}. See the file doc/DETAILS in the source
+distribution for details on how to use it.
+
+@item --command-file @code{file}
+Same as @option{--command-fd}, except the commands are read out of file
+@code{file}
+
+@item --allow-non-selfsigned-uid
+@itemx --no-allow-non-selfsigned-uid
+Allow the import and use of keys with user IDs which are not
+self-signed. This is not recommended, as a non self-signed user ID is
+trivial to forge. @option{--no-allow-non-selfsigned-uid} disables.
+
+@item --allow-freeform-uid
+Disable all checks on the form of the user ID while generating a new
+one. This option should only be used in very special environments as
+it does not ensure the de-facto standard format of user IDs.
+
+@item --ignore-time-conflict
+GnuPG normally checks that the timestamps associated with keys and
+signatures have plausible values. However, sometimes a signature
+seems to be older than the key due to clock problems. This option
+makes these checks just a warning. See also @option{--ignore-valid-from} for
+timestamp issues on subkeys.
+
+@item --ignore-valid-from
+GnuPG normally does not select and use subkeys created in the future.
+This option allows the use of such keys and thus exhibits the
+pre-1.0.7 behaviour. You should not use this option unless you there
+is some clock problem. See also @option{--ignore-time-conflict} for timestamp
+issues with signatures.
+
+@item --ignore-crc-error
+The ASCII armor used by OpenPGP is protected by a CRC checksum against
+transmission errors. Occasionally the CRC gets mangled somewhere on
+the transmission channel but the actual content (which is protected by
+the OpenPGP protocol anyway) is still okay. This option allows GnuPG
+to ignore CRC errors.
+
+@item --ignore-mdc-error
+This option changes a MDC integrity protection failure into a warning.
+This can be useful if a message is partially corrupt, but it is
+necessary to get as much data as possible out of the corrupt message.
+However, be aware that a MDC protection failure may also mean that the
+message was tampered with intentionally by an attacker.
+
+@item --no-default-keyring
+Do not add the default keyrings to the list of keyrings. Note that
+GnuPG will not operate without any keyrings, so if you use this option
+and do not provide alternate keyrings via @option{--keyring} or
+@option{--secret-keyring}, then GnuPG will still use the default public or
+secret keyrings.
+
+@item --skip-verify
+Skip the signature verification step. This may be
+used to make the decryption faster if the signature
+verification is not needed.
+
+@item --with-key-data
+Print key listings delimited by colons (like @option{--with-colons}) and
+print the public key data.
+
+@item --fast-list-mode
+Changes the output of the list commands to work faster; this is achieved
+by leaving some parts empty. Some applications don't need the user ID
+and the trust information given in the listings. By using this options
+they can get a faster listing. The exact behaviour of this option may
+change in future versions.  If you are missing some information, don't
+use this option.
+
+@item --no-literal
+This is not for normal use. Use the source to see for what it might be useful.
+
+@item --set-filesize
+This is not for normal use. Use the source to see for what it might be useful.
+
+@item --show-session-key
+Display the session key used for one message. See
+@option{--override-session-key} for the counterpart of this option.
+
+We think that Key Escrow is a Bad Thing; however the user should have
+the freedom to decide whether to go to prison or to reveal the content
+of one specific message without compromising all messages ever
+encrypted for one secret key. DON'T USE IT UNLESS YOU ARE REALLY
+FORCED TO DO SO.
+
+@item --override-session-key @code{string}
+Don't use the public key but the session key @code{string}. The format
+of this string is the same as the one printed by
+@option{--show-session-key}. This option is normally not used but comes
+handy in case someone forces you to reveal the content of an encrypted
+message; using this option you can do this without handing out the
+secret key.
+
+@item --ask-sig-expire
+@itemx --no-ask-sig-expire
+When making a data signature, prompt for an expiration time. If this
+option is not specified, the expiration time set via
+@option{--default-sig-expire} is used. @option{--no-ask-sig-expire}
+disables this option. Note that by default, @option{--force-v3-sigs} is
+set which also disables this option. If you want signature expiration,
+you must set @option{--no-force-v3-sigs} as well as turning
+@option{--ask-sig-expire} on.
+
+@item --default-sig-expire
+The default expiration time to use for signature expiration. Valid
+values are "0" for no expiration, a number followed by the letter d
+(for days), w (for weeks), m (for months), or y (for years) (for
+example "2m" for two months, or "5y" for five years), or an absolute
+date in the form YYYY-MM-DD. Defaults to "0".
+
+@item --ask-cert-expire
+@itemx --no-ask-cert-expire
+When making a key signature, prompt for an expiration time. If this
+option is not specified, the expiration time set via
+@option{--default-cert-expire} is used. @option{--no-ask-cert-expire}
+disables this option.
+
+@item --default-cert-expire
+The default expiration time to use for key signature expiration.
+Valid values are "0" for no expiration, a number followed by the
+letter d (for days), w (for weeks), m (for months), or y (for years)
+(for example "2m" for two months, or "5y" for five years), or an
+absolute date in the form YYYY-MM-DD. Defaults to "0".
+
+@item --allow-secret-key-import
+This is an obsolete option and is not used anywhere.
+
+@item --allow-multisig-verification
+Allow verification of concatenated signed messages. This will run a
+signature verification for each data+signature block. There are some
+security issues with this option and thus it is off by default. Note
+that versions of GPG prior to version 1.4.3 implicitly allowed this.
+
+@item --enable-special-filenames
+This options enables a mode in which filenames of the form
+@file{-&n}, where n is a non-negative decimal number,
+refer to the file descriptor n and not to a file with that name.
+
+@item --no-expensive-trust-checks
+Experimental use only.
+
+@item --preserve-permissions
+Don't change the permissions of a secret keyring back to user
+read/write only. Use this option only if you really know what you are doing.
+
+@item --default-preference-list @code{string}
+@opindex default-preference-list
+Set the list of default preferences to @code{string}. This preference
+list is used for new keys and becomes the default for "setpref" in the
+edit menu.
+
+@item --default-keyserver-url @code{name}
+@opindex default-keyserver-url
+Set the default keyserver URL to @code{name}. This keyserver will be
+used as the keyserver URL when writing a new self-signature on a key,
+which includes key generation and changing preferences.
+
+@item --list-config
+@opindex list-config
+Display various internal configuration parameters of GnuPG. This option
+is intended for external programs that call GnuPG to perform tasks, and
+is thus not generally useful. See the file @file{doc/DETAILS} in the
+source distribution for the details of which configuration items may be
+listed. @option{--list-config} is only usable with
+@option{--with-colons} set.
+
+@item --gpgconf-list
+@opindex gpgconf-list
+This command is simliar to @option{--list-config} but in general only
+internally used by the @command{gpgconf} tool.
+
+@item --gpgconf-test
+@opindex gpgconf-test
+This is more or less dummy action.  However it parses the configuration
+file and returns with failure if the configuraion file would prevent
+@command{gpg} from startup.  Thus it may be used to run a syntax check
+on the configuration file.
+
+@end table
+
+@c *******************************
+@c ******* Deprecated ************
+@c *******************************
+@subsection Deprecated options
+
+@table @gnupgtabopt
+
+@ifset gpgone
+@item --load-extension @code{name}
+Load an extension module. If @code{name} does not contain a slash it is
+searched for in the directory configured when GnuPG was built
+(generally "/usr/local/lib/gnupg"). Extensions are not generally
+useful anymore, and the use of this option is deprecated.
+@end ifset
+
+@item --show-photos
+@itemx --no-show-photos
+Causes @option{--list-keys}, @option{--list-sigs},
+@option{--list-public-keys}, @option{--list-secret-keys}, and verifying
+a signature to also display the photo ID attached to the key, if
+any. See also @option{--photo-viewer}. These options are deprecated. Use
+@option{--list-options [no-]show-photos} and/or @option{--verify-options
+[no-]show-photos} instead.
+
+@item --show-keyring
+Display the keyring name at the head of key listings to show which
+keyring a given key resides on. This option is deprecated: use
+@option{--list-options [no-]show-keyring} instead.
+
+@item --ctapi-driver @code{file}
+Use @code{file} to access the smartcard reader. The current default
+is `libtowitoko.so'. Note that the use of this interface is
+deprecated; it may be removed in future releases.
+
+@item --always-trust
+Identical to @option{--trust-model always}. This option is deprecated.
+
+@item --show-notation
+@itemx --no-show-notation
+Show signature notations in the @option{--list-sigs} or @option{--check-sigs} listings
+as well as when verifying a signature with a notation in it. These
+options are deprecated. Use @option{--list-options [no-]show-notation}
+and/or @option{--verify-options [no-]show-notation} instead.
+
+@item --show-policy-url
+@itemx --no-show-policy-url
+Show policy URLs in the @option{--list-sigs} or @option{--check-sigs}
+listings as well as when verifying a signature with a policy URL in
+it. These options are deprecated. Use @option{--list-options
+[no-]show-policy-url} and/or @option{--verify-options
+[no-]show-policy-url} instead.
+
+
+@end table
+
+
+@c *******************************************
+@c ***************            ****************
+@c ***************   FILES    ****************
+@c ***************            ****************
+@c *******************************************
+@mansect files
+@node GPG Configuration
+@section Configuration files
+
+There are a few configuration files to control certain aspects of
+@command{@gpgname}'s operation. Unless noted, they are expected in the
+current home directory (@pxref{option --homedir}).
+
+@table @file
+
+@item gpg.conf
+@cindex gpgsm.conf
+This is the standard configuration file read by @command{@gpgname} on
+startup.  It may contain any valid long option; the leading two dashes
+may not be entered and the option may not be abbreviated.  This default
+name may be changed on the command line (@pxref{option
+  --options}).
+
+@end table
+
+@c man:.RE
+Note that on larger installations, it is useful to put predefined files
+into the directory @file{/etc/skel/.gnupg/} so that newly created users
+start up with a working configuration.
+@ifclear gpgone
+For existing users the a small
+helper script is provided to create these files (@pxref{addgnupghome}).
+@end ifclear
+
+For internal purposes @command{@gpgname} creates and maintaines a few other
+files; They all live in in the current home directory (@pxref{option
+--homedir}).  Only the @command{@gpgname} may modify these files.
+
+
+@table @file
+@item ~/.gnupg/secring.gpg
+The secret keyring.
+
+@item ~/.gnupg/secring.gpg.lock
+and the lock file
+
+@item ~/.gnupg/pubring.gpg
+The public keyring
+
+@item ~/.gnupg/pubring.gpg.lock
+and the lock file
+
+@item ~/.gnupg/trustdb.gpg
+The trust database
+
+@item ~/.gnupg/trustdb.gpg.lock
+and the lock file
+
+@item ~/.gnupg/random_seed
+used to preserve the internal random pool
+
+@item /usr[/local]/share/gnupg/options.skel
+Skeleton options file
+
+@item /usr[/local]/lib/gnupg/
+Default location for extensions
+
+@end table
+
+@c man:.RE
+Operation is further controlled by a few environment variables:
+
+@table @asis
+
+@item HOME
+Used to locate the default home directory.
+
+@item GNUPGHOME
+If set directory used instead of "~/.gnupg".
+
+@item GPG_AGENT_INFO
+Used to locate the gpg-agent.
+@ifset gpgone
+This is only honored when @option{--use-agent} is set.
+@end ifset
+The value consists of 3 colon delimited fields: The first is the path
+to the Unix Domain Socket, the second the PID of the gpg-agent and the
+protocol version which should be set to 1. When starting the gpg-agent
+as described in its documentation, this variable is set to the correct
+value. The option @option{--gpg-agent-info} can be used to override it.
+
+@item COLUMNS
+@itemx LINES
+Used to size some displays to the full size of the screen.
+
+@end table
+
+
+@c *******************************************
+@c ***************            ****************
+@c ***************  EXAMPLES  ****************
+@c ***************            ****************
+@c *******************************************
+@mansect examples
+@node GPG Examples
+@section Examples
+
+@table @asis
+
+@item gpg -se -r @code{Bob} @code{file}
+sign and encrypt for user Bob
+
+@item gpg --clearsign @code{file}
+make a clear text signature
+
+@item gpg -sb @code{file}
+make a detached signature
+
+@item gpg --list-keys @code{user_ID}
+show keys
+
+@item gpg --fingerprint @code{user_ID}
+show fingerprint
+
+@item gpg --verify @code{pgpfile}
+@itemx gpg --verify @code{sigfile}
+Verify the signature of the file but do not output the data. The
+second form is used for detached signatures, where @code{sigfile}
+is the detached signature (either ASCII armored or binary) and
+are the signed data; if this is not given, the name of
+the file holding the signed data is constructed by cutting off the
+extension (".asc" or ".sig") of @code{sigfile} or by asking the
+user for the filename.
+@end table
+
+
+@c *******************************************
+@c ***************            ****************
+@c ***************  USER ID   ****************
+@c ***************            ****************
+@c *******************************************
+@mansect how to specify a user id
+@ifset isman
+@include specify-user-id.texi
+@end ifset
+
+@mansect return vaue
+@chapheading RETURN VALUE
+
+The program returns 0 if everything was fine, 1 if at least
+a signature was bad, and other error codes for fatal errors.
+
+@mansect warnings
+@chapheading WARNINGS
+
+Use a *good* password for your user account and a *good* passphrase
+to protect your secret key. This passphrase is the weakest part of the
+whole system. Programs to do dictionary attacks on your secret keyring
+are very easy to write and so you should protect your "~/.gnupg/"
+directory very well.
+
+Keep in mind that, if this program is used over a network (telnet), it
+is *very* easy to spy out your passphrase!
+
+If you are going to verify detached signatures, make sure that the
+program knows about it; either give both filenames on the command line
+or use @samp{-} to specify stdin.
+
+@mansect interoperability
+@chapheading INTEROPERABILITY WITH OTHER OPENPGP PROGRAMS
+
+GnuPG tries to be a very flexible implementation of the OpenPGP
+standard. In particular, GnuPG implements many of the optional parts
+of the standard, such as the SHA-512 hash, and the ZLIB and BZIP2
+compression algorithms. It is important to be aware that not all
+OpenPGP programs implement these optional algorithms and that by
+forcing their use via the @option{--cipher-algo}, @option{--digest-algo},
+@option{--cert-digest-algo}, or @option{--compress-algo} options in GnuPG, it is
+possible to create a perfectly valid OpenPGP message, but one that
+cannot be read by the intended recipient.
+
+There are dozens of variations of OpenPGP programs available, and each
+supports a slightly different subset of these optional algorithms.
+For example, until recently, no (unhacked) version of PGP supported
+the BLOWFISH cipher algorithm. A message using BLOWFISH simply could
+not be read by a PGP user. By default, GnuPG uses the standard
+OpenPGP preferences system that will always do the right thing and
+create messages that are usable by all recipients, regardless of which
+OpenPGP program they use. Only override this safe default if you
+really know what you are doing.
+
+If you absolutely must override the safe default, or if the preferences
+on a given key are invalid for some reason, you are far better off using
+the @option{--pgp6}, @option{--pgp7}, or @option{--pgp8} options. These
+options are safe as they do not force any particular algorithms in
+violation of OpenPGP, but rather reduce the available algorithms to a
+"PGP-safe" list.
+
+@mansect bugs
+@chapheading BUGS
+
+On many systems this program should be installed as setuid(root). This
+is necessary to lock memory pages. Locking memory pages prevents the
+operating system from writing memory pages (which may contain
+passphrases or other sensitive material) to disk. If you get no
+warning message about insecure memory your operating system supports
+locking without being root. The program drops root privileges as soon
+as locked memory is allocated.
+
+@mansect see also
+@ifset isman
+@command{gpgv}(1), 
+@ifclear gpgone
+@command{gpgsm}(1), 
+@command{gpg-agent}(1)
+@end ifclear
+@end ifset
+@include see-also-note.texi
diff --git a/doc/gpgv.texi b/doc/gpgv.texi
new file mode 100644 (file)
index 0000000..a09d1d0
--- /dev/null
@@ -0,0 +1,167 @@
+@c Copyright (C) 2004 Free Software Foundation, Inc.
+@c This is part of the GnuPG manual.
+@c For copying conditions, see the file GnuPG.texi.
+
+@c
+@c This is included by tools.texi.
+@c
+
+@c Begin GnuPG 1.x specific stuff
+@ifset gpgone
+@macro gpgvname
+gpgv
+@end macro
+@manpage gpgv.1
+@node gpgv
+@section Verify OpenPGP signatures
+@ifset manverb
+.B gpgv
+\- Verify OpenPGP signatures
+@end ifset
+
+@mansect synopsis
+@ifset manverb
+.B  gpgv
+.RI [ options ]
+.I signed_files
+@end ifset
+@end ifset
+@c End GnuPG 1.x specific stuff
+
+@c Begin GnuPG 2 specific stuff
+@ifclear gpgone
+@macro gpgvname
+gpgv2
+@end macro
+@manpage gpgv2.1
+@node gpgv
+@section Verify OpenPGP signatures
+@ifset manverb
+.B gpgv2
+\- Verify OpenPGP signatures
+@end ifset
+
+@mansect synopsis
+@ifset manverb
+.B  gpgv2
+.RI [ options ]
+.I signed_files
+@end ifset
+@end ifclear
+@c End GnuPG 2 specific stuff
+
+
+
+@mansect description
+@code{@gpgvname} is an OpenPGP signature verification tool.
+
+This program is actually a stripped down version of @code{gpg} which is
+only able to check signatures. It is somewhat smaller than the fully blown
+@code{gpg} and uses a different (and simpler) way to check that
+the public keys used to make the signature are valid. There are
+no configuration files and only a few options are implemented.
+
+@code{@gpgvname} assumes that all keys in the keyring are trustworthy.
+By default it uses a keyring named @file{trustedkeys.gpg} which is
+assumed to be in the home directory as defined by GnuPG or set by an
+option or an environment variable. An option may be used to specify
+another keyring or even multiple keyrings.
+
+@noindent
+@mansect options
+@code{@gpgvname} recognizes these options:
+
+@table @gnupgtabopt
+
+@item --verbose
+@itemx -v
+@opindex verbose
+Gives more information during processing. If used
+twice, the input data is listed in detail.
+
+@item --quiet
+@itemx -q
+@opindex quiet
+Try to be as quiet as possible.
+
+@item --keyring @var{file}
+@opindex keyring
+Add @var{file} to the list of keyrings.
+If @var{file} begins with a tilde and a slash, these
+are replaced by the HOME directory. If the filename
+does not contain a slash, it is assumed to be in the
+home-directory ("~/.gnupg" if --homedir is not used).
+
+@item --status-fd @var{n}
+@opindex status-fd
+Write special status strings to the file descriptor @var{n}.  See the
+file DETAILS in the documentation for a listing of them.
+
+@item --logger-fd @code{n}
+@opindex logger-fd
+Write log output to file descriptor @code{n} and not to stderr.
+
+@item --ignore-time-conflict
+@opindex ignore-time-conflict
+GnuPG normally checks that the timestamps associated with keys and
+signatures have plausible values. However, sometimes a signature seems to
+be older than the key due to clock problems. This option turns these
+checks into warnings.
+
+@include opt-homedir.texi
+
+@end table
+
+@mansect return value
+
+The program returns 0 if everything was fine, 1 if at least
+one signature was bad, and other error codes for fatal errors.
+
+@mansect examples
+@subsection Examples
+
+@table @asis
+
+@item @gpgvname @code{pgpfile}
+@itemx @gpgvname @code{sigfile} 
+Verify the signature of the file. The second form
+is used for detached signatures, where @code{sigfile} is the detached
+signature (either ASCII armored or binary) and are the signed
+data; if this is not given the name of the file holding the signed data is
+constructed by cutting off the extension (".asc", ".sig" or ".sign") from
+@code{sigfile}.
+
+@end table
+
+@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 ~/.gnupg/trustedkeys.gpg
+The default keyring with the allowed keys
+
+@end table
+
+@mansect see also
+@ifset gpgone
+@command{gpg}(1)
+@end ifset
+@ifclear gpgone
+@command{gpg2}(1)
+@end ifclear
+@include see-also-note.texi
+
diff --git a/doc/gpl.texi b/doc/gpl.texi
new file mode 100644 (file)
index 0000000..00108d2
--- /dev/null
@@ -0,0 +1,397 @@
+@node Copying
+@appendix GNU GENERAL PUBLIC LICENSE
+
+@cindex GPL, GNU General Public License
+@center Version 2, June 1991
+
+@display
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@appendixsubsec Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software---to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+@iftex
+@appendixsubsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end iftex
+@ifinfo
+@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+@end ifinfo
+
+@enumerate
+@item
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The ``Program'', below,
+refers to any such program or work, and a ``work based on the Program''
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term ``modification''.)  Each licensee is addressed as ``you''.
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+@item
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+@item
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+@enumerate a
+@item
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+@item
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+@item
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License.  (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+@end enumerate
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+@item
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+@enumerate a
+@item
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+@item
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+@item
+Accompany it with the information you received as to the offer
+to distribute corresponding source code.  (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+@end enumerate
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+@item
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+@item
+You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+@item
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+@item
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+@item
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+@item
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and ``any
+later version'', you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+@item
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+@iftex
+@heading NO WARRANTY
+@end iftex
+@ifinfo
+@center NO WARRANTY
+@end ifinfo
+
+@item
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+@item
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+@end enumerate
+
+@iftex
+@heading END OF TERMS AND CONDITIONS
+@end iftex
+@ifinfo
+@center END OF TERMS AND CONDITIONS
+@end ifinfo
+
+@page
+@unnumberedsec How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the ``copyright'' line and a pointer to where the full notice is found.
+
+@smallexample
+@var{one line to give the program's name and an idea of what it does.}
+Copyright (C) 19@var{yy}  @var{name of author}
+
+This program 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 2
+of the License, or (at your option) any later version.
+
+This program 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, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+@end smallexample
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+@smallexample
+Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author}
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'.  This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c' 
+for details.
+@end smallexample
+
+The hypothetical commands @samp{show w} and @samp{show c} should show
+the appropriate parts of the General Public License.  Of course, the
+commands you use may be called something other than @samp{show w} and
+@samp{show c}; they could even be mouse-clicks or menu items---whatever
+suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary.  Here is a sample; alter the names:
+
+@smallexample
+@group
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written 
+by James Hacker.
+
+@var{signature of Ty Coon}, 1 April 1989
+Ty Coon, President of Vice
+@end group
+@end smallexample
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/doc/highlights-1.4.txt b/doc/highlights-1.4.txt
new file mode 100644 (file)
index 0000000..615f6f0
--- /dev/null
@@ -0,0 +1,202 @@
+GnuPG 1.4 Highlights
+====================
+
+This is a brief overview of the changes between the GnuPG 1.2 series
+and the new GnuPG 1.4 series.  To read the full list of highlights for
+each revision that led up to 1.4, see the NEWS file in the GnuPG
+distribution.  This document is based on the NEWS file, and is thus
+the highlights of the highlights.
+
+When upgrading, note that RFC-2440, the OpenPGP standard, is currently
+being revised.  Most of the revisions in the latest draft (2440bis-12)
+have already been incorporated into GnuPG 1.4.
+
+
+Algorithm Changes
+-----------------
+
+OpenPGP supports many different algorithms for encryption, hashing,
+and compression, and taking into account the OpenPGP revisions, GnuPG
+1.4 supports a slightly different algorithm set than 1.2 did.
+
+The SHA256, SHA384, and SHA512 hashes are now supported for read and
+write.
+
+The BZIP2 compression algorithm is now supported for read and write.
+
+Due to the recent successful attack on the MD5 hash algorithm
+(discussed in <http://www.rsasecurity.com/rsalabs/node.asp?id=2738>,
+among other places), MD5 is deprecated for OpenPGP use.  It is still
+allowed in GnuPG 1.4 for backwards compatibility, but a warning is
+given when it is used.
+
+The TIGER/192 hash is no longer available.  This should not be
+interpreted as a statement as to the quality of TIGER/192 - rather,
+the revised OpenPGP standard removes support for several unused or
+mostly unused hashes, and TIGER/192 was one of them.
+
+Similarly, Elgamal signatures and the Elgamal signing key type have
+been removed from the OpenPGP standard, and thus from GnuPG.  Please
+do not confuse Elgamal signatures with DSA or DSS signatures or with
+Elgamal encryption.  Elgamal signatures were very rarely used and were
+not supported in any product other than GnuPG.  Elgamal encryption was
+and still is part of OpenPGP and GnuPG.
+
+Very old (pre-1.0) versions of GnuPG supported a nonstandard (contrary
+to OpenPGP) Elgamal key type.  While no recent version of GnuPG
+permitted the generation of such keys, GnuPG 1.2 could still use them.
+GnuPG 1.4 no longer allows the use of these keys or the (also
+nonstandard) messages generated using them.
+
+At build time, it is possible to select which algorithms will be built
+into GnuPG.  This can be used to build a smaller program binary for
+embedded uses where space is tight.
+
+
+Keyserver Changes
+-----------------
+
+GnuPG 1.4 does all keyserver operations via plugin or helper
+applications.  This allows the main GnuPG program to be smaller and
+simpler.  People who package GnuPG for various reasons have the
+flexibility to include or leave out support for any keyserver type as
+desired.
+
+Support for fetching keys via HTTP and finger has been added.  This is
+mainly useful for setting a preferred keyserver URL like
+"http://www.jabberwocky.com/key.asc". or "finger:wk@g10code.com".
+
+The LDAP keyserver helper now supports storing, retrieving, and
+searching for keys in both the old NAI "LDAP keyserver" as well as the
+more recent method to store OpenPGP keys in standard LDAP servers.
+This is compatible with the storage schema that PGP uses, so both
+products can interoperate with the same LDAP server.
+
+The LDAP keyserver helper is compatible with the PGP company's new
+"Global Directory" service.
+
+If the LDAP library you use supports LDAP-over-TLS and LDAPS, then
+GnuPG detects this and supports them as well.  Note that using TLS or
+LDAPS does not improve the security of GnuPG itself, but may be useful
+in certain key distribution scenarios.
+
+HTTP Basic authentication is now supported for all HKP and HTTP
+keyserver functions, either through a proxy or via direct access.
+
+The HKP keyserver plugin supports the new machine-readable key
+listing format for those keyservers that provide it.
+
+IPv6 is supported for HKP and HTTP keyserver access.
+
+When using a HKP keyserver with multiple DNS records (such as
+subkeys.pgp.net which has the addresses of multiple servers around the
+world), all DNS address records are tried until one succeeds.  This
+prevents a single down server in the rotation from stopping access.
+
+DNS SRV records are used in HKP keyserver lookups to allow
+administrators to load balance and select keyserver ports
+automatically.
+
+Timeout support has been added to the keyserver plugins.  This allows
+users to set an upper limit on how long to wait for the keyserver
+before giving up.
+
+
+Preferred Keyserver URL
+-----------------------
+
+Preferred keyserver support has been added.  Users may set a preferred
+keyserver via the --edit-key command "keyserver".  If the
+--keyserver-option honor-keyserver-url is set (and it is by default),
+then the preferred keyserver is used when refreshing that key with
+--refresh-keys.
+
+The --sig-keyserver-url option can be used to inform signature
+recipients where the signing key can be downloaded.  When verifying
+the signature, if the signing key is not present, and the keyserver
+options honor-keyserver-url and auto-key-retrieve are set, this URL
+will be used to retrieve the key.
+
+
+Trust Signatures
+----------------
+
+GnuPG 1.4 supports OpenPGP trust signatures, which allow a user to
+specify the trust level and distance from the user along with the
+signature so users can delegate different levels of certification
+ability to other users, possibly restricted by a regular expression on
+the user ID.
+
+
+Trust Models
+------------
+
+GnuPG 1.4 supports several ways of looking at trust:
+
+Classic - The classic PGP trust model, where people sign each others
+         keys and thus build up an assurance (called "validity") that
+         the key belongs to the right person.  This was the default
+         trust model in GnuPG 1.2.
+
+Always - Bypass all trust checks, and make all keys fully valid.
+
+Direct - Users may set key validity directly.
+
+PGP - The PGP 7 and 8 behavior which combines Classic trust with trust
+      signatures overlaid on top.  This is the default trust model in
+      GnuPG 1.4.
+
+
+The OpenPGP Smartcard
+---------------------
+
+GnuPG 1.4 supports the OpenPGP smartcard
+(<http://www.g10code.de/p-card.html>)
+
+Secret keys may be kept fully or partially on the smartcard.  The
+smartcard may be used for primary keys or subkeys.
+
+
+Other Interesting New Features
+------------------------------
+
+For those using Security-Enhanced Linux <http://www.nsa.gov/selinux/>,
+the configure option --enable-selinux-support prevents GnuPG from
+processing its own files (i.e. reading the secret keyring for
+something other than getting a secret key from it).  This simplifies
+writing ACLs for the SELinux kernel.
+
+Readline support is now available at all prompts if the system
+provides a readline library.
+
+GnuPG can now create messages that can be decrypted with either a
+passphrase or a secret key.  These messages may be generated with
+--symmetric --encrypt or --symmetric --sign --encrypt.
+
+--list-options and --verify-options allow the user to customize
+exactly what key listings or signature verifications look like,
+enabling or disabling things such as photo display, preferred
+keyserver URL, calculated validity for each user ID, etc.
+
+The --primary-keyring option designates the keyring that the user
+wants new keys imported into.
+
+The --hidden-recipient (or -R) command encrypts to a user, but hides
+the identity of that user.  This is the same functionality as
+--throw-keyid, but can be used on a per-user basis.
+
+Full algorithm names (e.g. "3DES", "SHA1", "ZIP") can now be used
+interchangeably with the short algorithm names (e.g. "S2", "H2", "Z1")
+anywhere algorithm names are used in GnuPG.
+
+The --keyid-format option selects short (99242560), long
+(DB698D7199242560), 0xshort (0x99242560), or 0xlong
+(0xDB698D7199242560) key ID displays.  This lets users tune the
+display to what they prefer.
+
+While it is not recommended for extended periods, it is possible to
+run both GnuPG 1.2.x and GnuPG 1.4 during the transition.  To aid in
+this, GnuPG 1.4 tries to load a config file suffixed with its version
+before it loads the default config file.  For example, 1.4 will try
+for gpg.conf-1.4 and gpg.conf-1 before falling back to the regular
+gpg.conf file.
diff --git a/doc/opt-homedir.texi b/doc/opt-homedir.texi
new file mode 100644 (file)
index 0000000..387bd02
--- /dev/null
@@ -0,0 +1,14 @@
+@c This option is included at several places.
+@item --homedir @var{dir}
+@opindex homedir
+Set the name of the home directory to @var{dir}. If his option is not
+used, the home directory defaults to @file{~/.gnupg}.  It is only
+recognized when given on the command line.  It also overrides any home
+directory stated through the environment variable @env{GNUPGHOME} or
+(on W32 systems) by means on the Registry entry
+@ifset isman
+@var{HKCU\\Software\\GNU\\GnuPG:HomeDir}.
+@end ifset
+@ifclear isman
+@var{HKCU\Software\GNU\GnuPG:HomeDir}.
+@end ifclear
diff --git a/doc/samplekeys.asc b/doc/samplekeys.asc
new file mode 100644 (file)
index 0000000..21c36d8
--- /dev/null
@@ -0,0 +1,461 @@
+  pub   1024D/5B0358A2 1999-03-15 [expires: 2009-07-11]
+  uid                  Werner Koch <wk@gnupg.org>
+  uid                  Werner Koch <wk@g10code.com>
+  uid                  Werner Koch
+  uid                  Werner Koch <werner@fsfe.org>
+  sub   1024D/010A57ED 2004-03-21 [expires: 2007-12-31]
+  sub   2048R/C3680A6E 2006-01-01 [expires: 2007-12-31]
+  
+  pub   1024D/57548DCD 1998-07-07 [expired: 2005-12-31]
+  uid                  Werner Koch (gnupg sig) <dd9jn@gnu.org>
+  
+  pub   4096R/99242560 2002-01-28
+  uid                  David M. Shaw <dshaw@jabberwocky.com>
+  sub   2048g/1643B926 2002-01-28 [expires: 2012-01-26]
+  sub   1024D/49E1CBC9 2002-01-28 [expires: 2012-01-26]
+  
+  pub   2048R/CA57AD7C 2004-12-06
+  uid                  PGP Global Directory Verification Key
+  uid                  [jpeg image of size 3400]
+  
+  pub   1024D/B2D7795E 2001-01-04
+  uid                  Philip R. Zimmermann <prz@mit.edu>
+  uid                  Philip R. Zimmermann <prz@acm.org>
+  uid                  [jpeg image of size 3369]
+  uid                  [jpeg image of size 3457]
+  uid                  Philip R. Zimmermann <prz@philzimmermann.com>
+  sub   3072g/A8E92834 2001-01-04
+  
+  pub   1024R/1CE0C630 2006-01-01 [expires: 2008-12-31]
+  uid                  Werner Koch (dist sig) <dd9jn@gnu.org>
+  
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.4-svn4128 (GNU/Linux)
+
+mQGiBDWiHh4RBAD+l0rg5p9rW4M3sKvmeyzhs2mDxhRKDTVVUnTwpMIR2kIA9pT4
+3No/coPajDvhZTaDM/vSz25IZDZWJ7gEu86RpoEdtr/eK8GuDcgsWvFs5+YpCDwW
+G2dx39ME7DN+SRvEE1xUm4E9G2Nnd2UNtLgg82wgi/ZK4Ih9CYDyo0a9awCgisn3
+RvZ/MREJmQq1+SjJgDx+c2sEAOEnxGYisqIKcOTdPOTTie7o7x+nem2uac7uOW68
+N+wRWxhGPIxsOdueMIa7U94Wg/Ydn4f2WngJpBvKNaHYmW8j1Q5zvZXXpIWRXSvy
+TR641BceGHNdYiR/PiDBJsGQ3ac7n7pwhV4qex3IViRDJWz5Dzr88x+Oju63KtxY
+urUIBACi7d1rUlHr4ok7iBRlWHYXU2hpUIQ8C+UOE1XXT+HB7mZLSRONQnWMyXnq
+bAAW+EUUX2xpb54CevAg4eOilt0es8GZMmU6c0wdUsnMWWqOKHBFFlDIvyI27aZ9
+quf0yvby63kFCanQKc0QnqGXQKzuXbFqBYW2UQrYgjXji8rd8bQnV2VybmVyIEtv
+Y2ggKGdudXBnIHNpZykgPGRkOWpuQGdudS5vcmc+iGEEExECACECF4AFCQ4Uh/0F
+AkG8aF4GCwkIBwMCAxUCAwMWAgECHgEACgkQaLeriVdUjc0EkwCfTXfXdqDS2COs
+ZRm0OUphuY0h4x4AnRSlWyPGnKUFxKOw8TwwCSLsdvZHmQGiBDbtSOkRBACURhKn
+GIFyXIeX61GAY9hJA5FgG4UalV55ohdz4whBgDzDGLE3XYlO8HCn4ggKilll6MOw
+Y0yZeg6PEU9Y3SqTzpQSV6qj2M7MgcS8xOpi6bNCu0iyZUik0KklUXMdI8e/CVmB
+pQJT9CofbD1dsP6z4dC6z3jil0+5Wbfw6yIXzwCgy/7Fagq5mN0H760/JEiiXILS
+1n0D/3H26lTaxo1vGput9Td1FQN7Vn6YDP0/To5ipsOODROV3zyUwF5QleY+8zTF
+JA3qD5KxRfA726WELOF1mB6Mw44UdkPniOoGdMH5oSx6qnNnlVZBBu3U+e1qfQwL
+QjHu0WX4Z2q00DKpWLThGv7Loh5NKi6OfTbMhfHoevCAzQnmA/wKc6J8GqthENTh
+KXxZaei3Ep0t+PlBmbUzuAYCXZhI6/0KyD6emyQ7LYIaPv9qEfMkMLhxicG0v/AA
+wOCBRKS3bkqc6wAYaO0bjUHJvem3HkWPux82t83+6YPyRnVjm/mwt0uEyKSvt7Md
+2DVrO3lEcKRkRHiYuf0nonPhl5Rs5bQaV2VybmVyIEtvY2ggPHdrQGdudXBnLm9y
+Zz6IawQTEQIAIwIXgAIZAQUJE2uL/wUCQllAcgULBwoDAgMVAgMDFgIBAh4BABIH
+ZUdQRwABAQkQXeJJllsDWKI6xwCfV3paxYsk7KQmrtOUxNmZb004OQoAn3uq9imO
+pgxqsXhXaLfz5IqZu5O7tBxXZXJuZXIgS29jaCA8d2tAZzEwY29kZS5jb20+iGME
+ExECACMCGwMCHgECF4AFCRNri/8FAkJZQHoFCwcKAwIDFQIDAxYCAQAKCRBd4kmW
+WwNYouXsAJ9nbkvbiJZvNlzwBL98x7YB+u9fsgCfXE6vHv6DJk7Eh9CY+Gcdn6kC
+G8i0C1dlcm5lciBLb2NoiGMEExECABsFAjbtSOoFCQzJfIADCwoDAxUDAgMWAgEC
+F4AAEgkQXeJJllsDWKIHZUdQRwABAbXWAJ9SCW0ieOpL7AY6vF+OIaMmw2ZW1gCg
+kto0eWfgpjAuVg6jXqR1wHt2pQO0HVdlcm5lciBLb2NoIDx3ZXJuZXJAZnNmZS5v
+cmc+iGMEExECACMCGwMFCRNri/8CHgECF4AFAkJZQHoFCwcKAwIDFQIDAxYCAQAK
+CRBd4kmWWwNYovxpAJ0ftTtETxhK8aKfIok/+43wNbQASwCfSFCPuVKTNHpv4JJ7
+9feDCtfxxLG5AaIEQF3aTxEEAP9SgfIbIPL6BQ1nqoblsTYoiwWPL48uBZPjkDfy
+8XsVR5V9aRQlggC4x4/MD3Ip5AUgReI7PcHnp4m3vcVLXPl+/7i7hAwd84iKzgN8
+I8VW0EevflcNm7nbWEnpjaGxJWFbhSLI1DmqnafoU8nZgGp2QoE+flgGDd559C3S
+iHRTAKDbqgS3EDhTbwfS+bAhW5Xi8/2CPwP9HueeuW9M/cyt8UvliLsj2eYMEIy7
+CeSLO13XfnqCjcnHK+b59/ADd99dpMaq3gKj7Aj1RIsRV2qWDJpDNXVxP7Cy+Fzx
+elQsytPQOV8H8AkB+RgmSyfxlNRUkC3sQU6jR9IwmPD4iB5fp/SqUpn++77TAArX
+qsfHbmlnwcuU1EAD/i7CEhxLBYS1N77hwxL8DWCqjpi+1PKG+6dc0BQFIU3uUhbz
+LGfqEobUDhveqgtlsvoEZ/lR8RgMv/uOjXEgiATQyTEa7s3M2vjXlpLjXjzklma3
+Lqmcam3dEf/5OR02yZif6hPU/x8f/VQle0kKNKdOCV1+dlo8aJH2UIZRRIvtiE8E
+GBECAA8FAkBd2k8CGwIFCQcbVgAACgkQXeJJllsDWKIiqACff+MvmBLGSBA0NkdK
+9ZB3fTSzCdcAoLrJ9QYe2+vFu2WYGZNC5xJy2db1iE8EGBECAA8FAkBd2lACGwIF
+CQcbVgAACgkQXeJJllsDWKLDcQCfdFh2/dY6p8Sz6nS5tfx5akOqmPAAn3Y/PpYm
+Z+bIfoFcHlzjPxmI93uSiJcEGBECAA8CGwIFCQcbVgAFAkR1rB0AUkcgBBkRAgAG
+BQJEdawTAAoJEGB4TpQBClft2RMAn1XiL/bC9hByZInCJTaCd8WS8kYCAKCfpAWw
+LIxkfwAeD/RI+2p00nQfvAkQXeJJllsDWKKx7QCguc4/HiEs64Ey5p6Yihy67X8E
+0YsAnRXMFdXVP7ww8uldljPiD1TgyurpuQELBEBd2ykBCADRKFS0lZw/2MawS97P
+3nVyt2FF9XWb8si7T9Jgl+NRF93uqUOIC15s3u5SVPcwdIhoG04wYKHTLKhyBAjF
+p4azfLmiIBDDp37DY3SAtJT6TsgULR+yFkXbRvuIOU5N/0WxzrK6JJwlFVEyaPX7
+zmWVKMCj+SMj2FrmltuVS0aCf0io3n97bUAvuU3dgjTFoHqW4017smfbE4VMwnLY
+i3/1SS9s0ysKM6Px5yEM3oQiOW/9pS48wSFfs3lXi8N1BikgPdU5FFA+5BGSUhxy
+Ff+lqdjwcByBC7LT3dCrFeWQOL0UeVh6wG48O63j8jue7mfTm+559uXnD/J65PiH
+cZTnAAYpiE8EGBECAA8FAkBd2ykCGwwFCQNY7wAACgkQXeJJllsDWKIS1gCgoJ2z
+4OnA0dVt7ZM/PeAsKXA0KFUAn3AV3yuZKX4WHw5Pnf5sLmF5LUkluQELBEO4FiIB
+CADRWoeCwf4lVIJQahM7ytFRvPMrkSZQy072/I6/4QPKsaHI+HnoB8PjTmBpyBDL
+K8Y6Of3Y1hNb77xe+m2g+8Wq/BUKHvUi1F+xzszpnixtMr+QOiy6U7kCJA6fGvq0
+qmzrXGcv5rXpGvWwyZfymTLW4X2WKgNL8bhODy0uJ9ZR/fhjE7nnIHgIboSnBAUP
+HCsI9BFumsbU8FKsKJCOBqziHEyDHbix7uP6ByYslH2tUw9WdQU8Yzo2mWojghXp
+jE7UT0tAb4QNTdwurLgiEIH5umsM43elr1/2nd06KigQX+NR4MqytR+28JtEEKvU
+LwJZpmExs4B+OB4x8l+6Lc0/AAYpiE8EGBECAA8FAkO4FiICGwwFCQPBFYAACgkQ
+XeJJllsDWKJdywCeNyRtO1/yIyiNkotYRfO5y3xuHocAnAyA4jaxa702sRs4iPR/
+WWJkMgEqmQGiBDpU6CcRBADCT/tGpBu0EHpjd3G11QtkTWYnihZDBdenjYV2Evot
+gRZAj5h4ewprq1u/zqzGBYpiYL/9j+5XDFcoWF24bzsUmHXsbDSiv+XEyQND1GUd
+x4wVcEY5rNjkArX06XuZzObvXFXOvqRj6LskePtw3xLf5uj8jPN0Nf6YKnhfGIHR
+WQCg/0UAr3hMK6zcA/egvWRGsm9dJecD/18XWekzt5JJeK3febJO/3Mwe43O6VNO
+xmMpGWOYTrhivyOb/ZLgLedqX+MeXHGdGroARZ+kxYq/a9y5jNcivD+EyN+IiNDP
+D64rl00FNZksx7dijD89PbIULDCtUpps2J0gk5inR+yzinf+jDyFnn5UEHI2rPFL
+UbXWHJXJcp0UBACBkzDdesPjEVXZdTRTLk0sfiWEdcBM/5GpNswMlK4A7A6iqJoS
+NJ4pO5Qq6PYOwDFqGir19WEfoTyHW0kxipnVbvq4q2vAhSIKOqNEJGxg4DTEKecf
+3xCdJ0kW8dVSogHDH/c+Q4+RFQq/31aev3HDy20YayxAE94BWIsKkhaMyohhBB8R
+AgAhBQI6VPBbAgcAFwyAET/HMgQdI+nqZt21AJydvCHfdNxhAAoJEMdGNjmy13le
+V7gAoKHV2q0XEP8GJkyp0/V5lgbwBmBMAJ9TtVfw2khoaZ3LNV2tINSjj0Alp7Qi
+UGhpbGlwIFIuIFppbW1lcm1hbm4gPHByekBtaXQuZWR1PohdBBARAgAVBQI6VOgn
+BQsJCAcDAhkBBRsDAAAAABIJEMdGNjmy13leB2VHUEcAAQFWUQCfWWfTDHzSezrD
+awgN2Z4Qb7dHKooAoJyVnm61utdRsdLr2e6QnV5Z0yjjtCJQaGlsaXAgUi4gWmlt
+bWVybWFubiA8cHJ6QGFjbS5vcmc+iE4EEBECAAYFAjpU6LcAEgkQx0Y2ObLXeV4H
+ZUdQRwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0
+RSQTkCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQAB
+AAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0
+KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7
+Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAAR
+CACQAHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL
+/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk
+ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5
+usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEB
+AQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC
+AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp
+KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK
+kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKI
+fMwqleanyUi/Osi4udqNLM+EUZJNNIlvsakuqjnYazbzxKlopLOHYfwqa5S/8QvO
+xjtyY1z17msqWZpGAzuz1wP61LmuhrGk3udHceO9RL4gSNB6EbjVU+Ndd3YEir9U
+Fc+nLYC49jWhbt5UW0RIGbpyKzuzbliuhuWfjnUw377ypQv3vk2/rXVaV4o07VFC
+iUQzd43P8j3rzVpnLESIgHoopZJIYIxPDg89Vb7tNSZLppnsIIYAggj1FKa4XQ/G
+7r5dvexI0R4WVTgj6jpXbxyrNGskZ3IwyCD1FWncxaa3F24oNLRTJIyKKecUUwHj
+rWbql2Y/3KHk9a084HPauZu7gTXLsemeKEgkyLmuS8TaqXmNlG3yofnweprp7qdb
+a1lnbpGhavPH3yN5rH55DuJNKo9LF0Y3d2T2sTt+8dflPQYzk1twaJK8AeVCxfkK
+OMVBo1qJLmJSPkHzH3ru4bRJlXjFc7Z2JXOBudBlIyEYAevaq8FkLRsld5J69xXp
+DaNC5PByffAqlJ4b8wkFiPTjpSci/ZnA3cXDbmcsRkEmoILGWYkpu9zXfjwkzgGU
+qVHtWhbaFbWyjEa7vYUlIfszy+e1uLEhnjfY3Xjiu28EeJZJ3XSpxuVUzFJ3Hsa0
+dU02IwMCgI78VxEcB0nxAnlOUDfPGfQ1pF6mNSN0eu0lQ2c4ubOKYfxoGqatjjG0
+UtFMQTsFgdj2U1zGB2OfwroNTcrZPjvxXP5pxJkZniF9miz5/iwv61xA+aUDOR3x
+3rq/F0hWwhjH8cmT+ArmIIvNmSJeD61lU3OqivdOn0KNTPuU5xxgdBXZ2TAIOe1Y
+Gj2ItLYYGTitSK7ghchpBk9hWD1OqKsbCcke1WkdcYIFUYZo3I2uDn0q2FIIx3pG
+y1JHAJAAHNVpCu4kcCpFJaZgOiioJm2vt6E9KQzPvZAUIHNcL4jjC3Fq/cOR+Fdt
+dHnHrXH+JSjMmexP8qqLMah1vgq4kuPDNuZc5jLRgnuAeK3s+lYng2PZ4YtAeSdx
+5/3jW5XUtjzpbsaTRSniimSUdZmCwrF3bmsWtDWj/pKD/ZrNzVLYh7lTVbCG8tQ1
+wGKKTgoeR71yGmWNzPdpLb/NsfOG4yK72+XfoU20Y8uJmJPucf41geG38wSMRwpC
+iuVu8nc9JRUYRSNoXqiHywjJOy/LH1J9hWcraeFBup0jnI3FVXcfyrYvoEmsSdoL
+qQQ2ORyKVdDRcmNEORz2P51m20aRjcy5L0mKIWmpWpVc8mHa2M8c960NP1q9hjYS
+SJMy85wentg/zph0OSCJ47UCNJAA4JBz+lVv7NayUlV3DG04bGc1Dl2NIxstToot
+VaMFlaEmY4UEkZ9hVPUtZS2lU3Aj3DjCPnH8qp60vkWVrDHkMoULjocVizRXDxB4
+1aSbJLh1BUjtjvmmmEtDVk8QWLLuD89g3Ga5bxDceY0Ei5AJY4PrV9mit40juNPX
+bIPneNSNp+hrLvdO86SGCJsB5Pl3N68YFXFmMr9T0vw2mzw7YjrmEH8+a06itYkh
+to4kXasaBQPoKkNdR57EPSig0UyTH1sEXSHsVrNzW7q1uZoBIvVKwqtbEvcfefPo
+N1GpADR4ye3P/wBesDQEaJHU93PFbNzP5em3K7S25OlZumxFGXBGc5I9zya5ZRs2
+ehCfMkdJbqs0LRN91hg1pQQtDCBKPMI43L396yLeTax7VdGrJbqRlWfsDWLZ1xWh
+PcXFvEhZoZRj8vzqghM9woMe1B8yoe3ufeo5pDcobiW4Tcpyq54H1qGDW0aXeFUh
+OCVOaSa6ltE2twubZZlHzQsGA9aW1WC6gVwVdT09foaj1PXbaeLy1CqzcbV706yg
+iZQs4aFnGUkjOD9D60SaYK4XenW5iJ2c/WucVJX1qzEfOJlUH6cmupeJY1w11Iw9
+OP8ACsSNgNegRFyC/AA6Zq6aVznr6RO34Hako5PUYorrPMENFIaKACQZiYY6iuWc
+FZCp7Gur61z+qQ+TclscNzTiTIoyLvjZemQRVLTTifyygUr156VezmsbUDLY3YlD
+YSQ8H0qaqujWhK0jo2woDk8DrXOs8l9eTeQHI3EgjkYqpca4fLMcbEMoxyeM07RL
+42t+vmk7W6iuJxaPRTTdh10bpVMDu0eTyDnp9aq2drdfaFaNhgckKwBxXaXKwtH5
+2wEDuRWNJqVgGKPbINo5YDrSTNuWK3Zg38N48m9iS2SQA2cYq9aapdJCIblnjKn5
+WHar32GzuxvjTAPYHFJq7W1qkEPAbpgUeRMlbZlqHUjdW2cguDg46fWl0KJ7jxIW
+IysEe4nHeq1oYYrNSD0GcVueFICIbi6YYM0mVz/d7VtSWpy15e6dATSGkJpO2a6T
+hFJoppNFAhj3MUf3mFZGqXUdy6BMELU8GiXExDXcu0d1Xk1p2+nQWw/cwgH+83Jq
+rWFqznorC7nGUgYL/ebgfrVfVdGa80h1UZlQFlx3xXXT7RE67yXI7dKrImxAw7c0
+90C0dzxIFkk2SZznByav2skk0qFDzjLH0xXVeLvBzMx1CxA2Ocso7E1xdtI9rO6S
+Db2NcjXQ9BSuro7bT74y2z2rNkA4znNStpNreyGZTtJTHXpXJR3ptFUhyNwzx61o
+QeIvs8flocnGCcVm1Y3jNPc04mTSRKGcNj7g+lc5qN897dPcHg54x2FNu9Qku5Bu
+4XJp+m6Re61MIrZDsj5eRuFH1pxjqROf3Gr4etLnVL0LyE6s3YCvRLeFLW3SFOFR
+QBVHQ9Ihs7IxIoL5yzdCTV4xvE3D/g4rqjCyPPnPmdyQkH8aCaZv28suPXHNKGBG
+Qc07MgDn6UUhNFAGmqHkscewpjnJ4qZhlKZjJ/CmXYrtFhSzDkn+lMWPAGOhHFXJ
+UypHr/hUUe0t5ZHJGV/qKLisJDtKmNgCp4wen0rl/EPgS0ut09rFjOSUX7y+49R7
+V1DJ5b5/hNVtb1mHRdHlvJ2xtwqcZyx6Cs5JM0hJpnkWoaBeW0525aMHA/wqrBoW
+oXMwSOI7mOABySa6ifW9W1KASBLe3twebhgCfwNNi8XQ6XgpKbmXp+7iChvbNYdT
+p5tNCzpHw6uSY5dRnVVz80SHJI9zXZixtdOsRDaQpDHnhVHU+tSWFyL6yjnG5RIP
+mRuGQ91PuDQd1zc4AyqV0xSRySk5bkcceyMHkHOanWN2HJyOvNSiIAHPvUuAAvvx
+VXJsVli4IBwR1HrTXtznrjPtVhky+fUU7naCfUU7isUGhZejZ9sUVcdCxxjt1op6
+CsWs/u/ypFHzfhS9Bj3pT1yKg0FwGB/Gq7Aq4YdRyKtIMg1E69PUYpDB8Mgbsaxt
+Z05NYhXTp8i3kzvI6j0x/OtUuBGUP1qjJJ5CvczSrGicszHhR70xdTy7XLS60y8b
+R5jmKGMNERwHH96r3gfR7aZ5NZvFL/Z32wRkcbgMlj9M8VDqeo22t+JZL2V3Fq37
+qM9DtAxn8Sa6fwtAunatPprOJLe5Tzrd/cDDD8ufwrFW5rGzb5Tb0xwLad1BCtIW
+AIx1AqzCjIAwOGPWoogzyunyhSR90VfEf9DW2xh1IP3jORk9anVG8sbjyKfgA09e
+dwouFiJ+GH4il2ZUjvQ/b609SN2KYC4AGexopkzHyyB1ooSBs//ZiE4EEBECAAYF
+AjpWjyIAEgkQx0Y2ObLXeV4HZUdQRwABAQfRAKCSnx3toHhFsCAaIsCRkmFdI4Hn
+9gCbBDKIqvBEjybcnaBW+iZufcjAzsfRzNf/AAANkgEQAAEBAAAAAAAAAAAAAAAA
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0V
+FhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoL
+Cw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
+Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA
+AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh
+MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6
+Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ
+mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx
+8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp
+anN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE
+xcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2
+aiiigAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p9
+68fvLyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjj
+XnA8zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrE
+TK51CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzD
+t7HuDQm0KUUz3ZHWRQ6MGU9CDkGnV5VZ6xf6FJ5qTlY8/Mh5Vh9K77QNfi1uEkJs
+kUZI7EeorRSuYyjY16KKKogKKKKACiiigArO17VU0XR575sFkXCKf4mPQVo1wHxX
+vfJ0yztw+N8hdh3IHA/nSew4q7PNdT1Ga9vpLi4kaaaRyWY8KDRYWCXkuG5Qc+gz
+We8mWAUYz19TW9pbGJAScZ6msJuyO2nG7NOPTrcxhAMdOmOKp3eg36OWsw0qY4x2
+rVgkynIyfrite0bKDBrBNo3aOOtvDWr3dwPPjEKDOS1dJbeFJYY/3UqKxGC5TJ/W
+t+Fdx4HNaMUSlM9yK1TbMJ2RwWo+GtXeMiaZLlByCo2mpvCOpTaDrKpdEmA/KxIw
+Vz612rR4PPWue13T4RcwXBUBWYI5A6Z6GmpNMmyasejghgCDkHkGlrD8J3ck+lfZ
+5m3SWreXu/vL/Cfy/lW5XQnc5GrMKKKKYgooooAK8j+LF4ZNchtmACQQjGDySefy
+6V6jqeowaVp099cnEcK7j7+grwXxjq1xr2ovqYRUV8DaCTtA7VMmtjWnBv3jMgjM
+0wAUnFbcCtHGFHOevtUek2RisUmkwS3O4HIqeWTaP3e0HPzMemfwrmk7s7oWSuat
+k7BQG71v28OFUpjHt2rj7XWreH91NLGWPQ7W/qK6bTdYs5IgFuI8njGajlsPmubt
+rmMGVuAo5q7GxWMcZBH51nmVDaIqMpErDJB7VcWf98Y+wXg9jVowlqTtIpGP6Vj+
+KNv/AAj1y4xuUAr9cjFajHnHWsvxG6DSij8h3H6c0yUW/Aju/n7xg7Rn6gkV2Fc1
+4Lg22MszD53IBPf1rpa6I7HNLcKKKKokKKKKAOQ+JchHhuOIMR5twufoATXkjOkj
+qqAHLYAzxXq3xLikl0uzKAkCYg49SvFeYR2htbqKJyN3JODnNc837zO6l/DSNOLe
+ijyuy7cEZzVG50jUbsmWKTamTny1GRzV4TAPtUZ+la2nyJbBWmZogScBhgfnWN7G
+9jmrfR7/AM7ZJdq8GDw8Suf6VRtXubfUFjMZR8jATjP0r0jfbMM7ULHvgVyl3BFP
+reICruTglTwvPr60+buKK1NeKe5S3W5liaNmHBTgKfU//WpJ/E13bYVJxM+MnEYy
+K25LKNtPtkPCK4U/TNYF94IinuWfcUVjuDxnBBpITa7GppvitLnalxZzRseN6pkE
+/TtUviOVbmC0jhdSGk+b26VlGz1PSpkEVz9sthgGN/vr7hq6PT7Qajq9os4ZI0Bf
+YB1AOcH/AD3rSOrsYzVlc6bQrZrXR4EddrldzD3P+RWjRRXUcQUUUUAFFFFAGN4r
+06bU9Blhtl3TIQ6qOrY7D8K8fvraW31JVmR0ZQPlYYI/Cvea8q+IVi0PiFrgnImj
+BUY/P+VZTj1OijP7JyP2n/SMnPB9eldXpV/5kIRsbfQ9K4yTMbhmyMnvUg1FoGYy
+I4THAXoPT+dYONztckkb2v69ZwSJa29qgLf6ybYPlHt7+9Q6JdWA1NWgYBMdBXOz
+Tf2id0aFg3anW+l3Fkv2tmcL1A/wo5VYSl9x6+ghnswgcEOOcdvemWs7zQHgSMjF
+GK+oNcZpd/Kl5Ct1JMIVAOA+M/WtGzu10nXHWObdbXZ8xCT3PVTSuRyHTymN1QeU
+SwYcba1dHt1W5Z2xvVOg9z/9YVmC583GOM9BWtoTectzN/CZNi+4H/661p2uc9S6
+ia1FFFdBzBRRRQAUUVi6x4v0HQwft2oxK4/5ZodzfkOn40AbVcX8SrHdo6akg+e2
+ba2P7p/+v/OsDVvjhYws0elaZLO3Z5m2g/gM/wA6525+I+t+IQ+n3ywQ290rDy0j
+wQMZHJOetS9jSKdzm7i+USAlhkZ56Dr1rd0vy5o9r4cuvzcg54rjLzNvcFMY55xW
+3od8FKx4GR8zMemazlG6N4zfMap02KC6bEcTJ6Nx+tbumPYyRrb/AL+Jc/dBEig+
+wYcU20FtqSguuMcZ7mtCx8PrDMZGkJVGyB/Kuf1Oly7Ej6XcyebgQ3IZTtdl2OD2
+6cViw2lxeSrayYTyzklTnbg9veun1LUU021IDb5Dwi+vvXOaVfIJZJN4LF8YHuad
+mTzHTqZEt/3eTIFwg7lu1dnpdn9g06K37gZb6nrXn0mvWujeVqOoI8ltG6/LHyS3
+b/Gu20TxRo3iCMNp16kj4yYm+Vx/wE10U1ZHJWd3oa9FFFamAUUUUAeF+KPijqur
+I0Fq32K3PaJvmP1avPbi5kuZCWJOTyfWmzOzNinwxBRuPXtSNCe3hSIBiMv/ACp1
+vcbdThkbp5gz9KYzEL9agcE7vXND1Hexs6raecSVA3jkZ71nWdy1qWjkG3sQRWlB
+di8tQ+cuvyuPcVFMsc3yyrz2P/16yi2tGdE4p+8jWsfEMNsU3H7vf+92rdt/FyiI
+4Zcnt6GvPmsyv3HB46k4zUiQTRKF3gAHOd3ehwi9SVOSVrHT6nrjzSYMgJUjknOK
+gsZnS4MrMVRerY/zk1mafAly2W3SAclgNoNWPNaW+kUDbFF8qovQHufr/hVqFkTz
+XNG+v3v5T5oxGq4WM9AKxlMlheCS1leNkO5CrYI59a0XOPvAfX1rN1OPPIB5TB+l
+USekeF/ipNEqWutKbhBwJ1Hzj6jv/nrXpWnaxp2rRCSxu4pwRnCtyPqOor5ht5G3
+Dca2bW+mtXEkEzxsDkMuQaCeVM+kqK8WsPiPr1rB5bXImx0MqbiPxoouTyM80jh8
+xyxHyg1KVx1qxEEeNfK5FI6euKZViq5IFJDGZA+Occ0sik9BVaYMqZUkFecjjFIk
+sQtJZT7+iEjcPSt63W1mUNIRjFc9ZXhuD5FwQSwwre/oa3raW3+xlGwWPr1FRUj1
+RtSl0GmW1jdlWCNz2Y/40yCBNQZijq0aNtKp/X/P51nXk4RJdqYBPJJHJq74a2x6
+XM4I3NJyM46f5NaQgkyZVG9DRv7hNPsW8pQP4VA7k/8A66g06Hy7dcnJbkk9yetU
+9TZpr+KHnKfO2fXoK0LYqYh1x6ZqpPUmJKy45z+XaqV8AUQ89x06VeccHA6896rX
+SbrZj3Ug1JRjYKsQfXrVxX+Xg+4qCVQQD0NOhJYcdTSEtGWVkIyFU/gtFJGEywbA
+568c0UFmUomil/dAtk9B3q/nzBjHTqKWBVjIPU45NMPDn3pkLQY6jBwRxTIoxJIE
+7HjmpW4/OmQcXC+maBdTG2FHdckFDxWpp7yyyu+eMcD/AGj3qpdLsvpAMdTWxpkQ
+jsVfpn5j+NVFXZCIL6N5YhG5GeWA6laTw/c+TJLYy4Al5TI/iHb8v5VYlwblAW6q
+MZ9c1mztgSleCzAKR26c1T0dwL1sDNPNOed7HafYcCr8MnlSAZwrdSfWobSLZCij
+0xRLlXHHDVBojSLZGSTz29KYFDK6nncMVHbTCSMqx+739RUJvWz+5A4/jbp+VIZS
+nGFOAOKbC3zZzjr0pbjvnkk9qihyZAB34oFfU0IEO05BH9f0oq1hIkXIySKKBn//
+2YhGBBARAgAGBQI8ZiQyAAoJEMdGNjmy13leJSIAoIx0Ql/m4Gf4ZZeFQ1Of+zq6
+499DAKCHBzmIEtE740kuUl5HGNvCJ4QbMLQtUGhpbGlwIFIuIFppbW1lcm1hbm4g
+PHByekBwaGlsemltbWVybWFubi5jb20+iEwEEBECAAwFAj6+zxoFCwkIBwMACgkQ
+x0Y2ObLXeV4M5gCgnemzKjFcpG5MpeFCTjVg24ptLhsAn03rO14zwfdxKS9ZSuGL
+eBG+d/eUuQMNBDpU6CcQDADMHXdXJDhK4sTw6I4TZ5dOkhNh9tvrJQ4X/faY98h8
+ebByHTh1+/bBc8SDESYrQ2DD4+jWCv2hKCYLrqmus2UPogBTAaB81qujEh76DyrO
+H3SET8rzF/OkQOnX0ne2Qi0CNsEmy2henXyYCQqNfi3t5F159dSST5sYjvwqp0t8
+MvZCV7cIfwgXcqK61qlC8wXo+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mU
+rfdMZIZJ+AyDvWXpF9Sh01D49Vlf3HZSTz09jdvOmeFXklnN/biudE/F/Ha8g8VH
+MGHOfMlm/xX5u/2RXscBqtNbno2gpXI61Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2
+azNsOA1FHQ98iLMcfFstjvbzySPAQ/ClWxiNjrtVjLhdONM0/XwXV0OjHRhs3jMh
+LLUq/zzhsSlAGBGNfISnCnLWhsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+c
+fL2JSyIZJrqrol7DVelMMm8AAgIMAI1RXgrY9LqHnvhnc1oGwhB7mORU7jwxKiGM
+Lqzb0KM+GVTv1xAhhaYGm41/CuhnrOW3LPpjYWbrlXQh+9WJxHvO8UUI6FqEy6TV
+yv5Cn3fo4wSr2wtkbFOMKWDCscZLtikxJmsQLtuk6YRGOjgX+fliYIckIfxDMI5z
+37zSCNUSweIlUAGsLzLKSMovnHVX89ICsThC0wtuQE8aZBg7DxvHqMIeg7jdCNTN
+upF8EwdmpZUnKgghkKn6fXdczj4079wNWxnxuNyHQsg7IytPzmfbjJ9dGU/SzsEW
+Mubn0mOF/h2O4laKQlrBYROXKkDLzo5hFG7AJsjI1q4F5MrL5q9m8Xagu+nAfhSe
+52kLTr87SOSPaVCmf0QRTDXVHA7qyr3NhPABTIp6s3TRxsJ/KJmXTUIijRu1xM7q
+FArdzrs9qWgn2VUfz+Yfsu6qQwsMfm6CSnOZ53/xKit+pWRqSd7pviZHJIUIFdpV
+mgqYMfNwfahJIyEz17HKHp3OLVsa7ohUBBgRAgAMBQI6VOgnBRsMAAAAABIJEMdG
+Njmy13leB2VHUEcAAQHlbQCg+N+fI3bzqF9+fB50J5sFHVHM7hYAn0+9AfDl5ncn
+r4D7ReMDlYoIZwRRmQILBDxUyXkBEACgg6vxNPigg9FQz14CkPtR/dEq3sCjK1r4
++2oyeoRno+pqZ6Z7ZfphgA/q5woweFAGOg17KD2WXegoQ5pXbFvP+w9j9zm3g59X
+zTRSzZgScelTibPnKy6g8r8GDAY6IQraR6pxe4297/NznqvRvKpTt5g1XP5LyjVB
+sEv9HAYJE1vyy10qSQRtEz3QunUzfELNC4kiYNMZOnmgaFeW4APIIhWDtrrxqW3O
+fjp1K4DAhqcnayrfvYbOtqh0sxJ246kvVc3Bc9pH6wDw/yub2deuPq6BZBLBJwrt
+u/20qD0nsZ9is/5j0aL1MZuVmr7xKYqeehyzJ1WdpJK52qng9natYedS+GefKDIw
+1Jq7ppQNWfVduTNITFTF0JswggjQuPqKT8Td5GCywQWN/kGHbp6EdybiUXZ+9fp4
+eek0UB5M+srSwbkF4hQ0mBrqlsaoji4CuXjc0c+Zx1D0pGfqqBCmvEV1tLul3U8h
+0TzR4opUA8mLKegQp5cjh/dHz7zTPDxVgSr3blJ9FxI1Z69th/+jJj3q6joo3uW/
+5y8qQCrzdSCzs+TDEWwucZtJIuIhTct8AMPY/Ayt+Pf9jXfI+xSQgz3r7Eu5o+rE
+u02/cthaOc4b3KYDtNkjLKszgiext1BYOq06R+Yyh2qgsg9azzkfudvvpwhCpJ7E
+OxcdaP3bxwAGKbQlRGF2aWQgTS4gU2hhdyA8ZHNoYXdAamFiYmVyd29ja3kuY29t
+PokCNAQTAQIAHgUCPFTJeQIbAwYLBwoDBAIDFQMCAxYCAQIeAQIXgAAKCRDbaY1x
+mSQlYH7aD/wMq9ksbvAf9drjVP2u4rjZhLkHyc1zCp7rMXc5CdNgDNVyhl7+co/q
+MeQBwk8SYEVedrZZ5Q7qjygjkKWp3qrLlw5PSydwCHaf5mlVg5E+5gt+RTkOi6FX
+dE/5c0IrIB+MNI3jt3IeOqEhITWcnjDk4gIxm4z43tvXvf/fY33ohrQknApN9uYI
+SoElzYGgnEZqX6P3p/8FB2+27A3t/Eshr6lLvVNEMgOlBY8te9TFvMJTMeSJXIQV
+pvbz/LMF8uEboWVzRC77y7RcD8p+JP9V97qZGsiOYB+2MPGEvAhEPHxQZAbaBF+e
+BFLzev+xmI36fHlFnAFiWikp0tYVLROgBhVGJUOJlDK+olfpxUqF+N8MfjeS01aH
+Ly+Y6rkzC26AC/9j+Adka9mBXEiiA1vQcBfO4U45QhgDAl00yUW1gV4oNGZ9Yqsl
+OhS/VHB61CjWwjnV3Jwkhscxux3rjj6TAwn5QmoO9kr3CqH1rzQXxTVruCJuwyuI
+6aNeywINoubgDhqhOCPfqyzgdxfp5UAhy54ge9dqjfgHI2Q3WxxhD3mCdYgN89GZ
+NpuH2lJkJZrRl7BimjqDeTlKYscZ1anrRgRpSoFDdUcMncySzW6cB1WSImj1aNWp
+q58FxoJWcTy6lNesINeRjZ/r1eJBeN55P8+7DKGIsGkpftsqgXAqVbkCDQQ8VMsE
+EAgA7lKuNHz6iYb+2pAZbxrjp5AHV86pbtVJQBWpGWkGLERGb6w2hYTL8YXr7Jgt
+eBmy1a/+l5ZYjnZFQ8603eZRC1g+/krruWmfiJxE/HtHVcVSDUxXNJiE67DpSdGP
+f8icIx3c91Xkui9ifS3VMSj1ezWLm5/OYF1utTQ5QiwrvzTuaCs8jWDUzxI77Fcz
+QYQELuDmHevde4Ke66MeWCJabs9OQ6i61vurJrj1WQQ9pvXOzcbdoQFtAF/vGK82
+rnr0p5cDyes3S5lCKC4nIhvokHotCf63YUU6afG9OLp/ASlcp2h21vmtDp7xSg6D
+7Ivn5cHtHnBvChG6vjQ9IO5gdwADBQgAnNF7z5VcV00LbYQxN1vX77iKwJ1aEZVS
+YMrJnvthtJPM5alAsOQRRe85pgZsBfd2xgKbDZFsQaPei+n59nMPTxl68YsrYOWa
+Be9IRnEKBYIHSVwDAGsEdxyOKgphNO7cQKcpRWdeqi9FQ11cWVLZrSqChmT9Z6uY
+GLDabKwAhYl6TrEQ2J9OzM586LARZHb8m2MOcGrla+XZZannjEVfaei5on8IuhOL
+alx/vx74C1qLi9B1fI/JyCsJlMQujkDrpz80hwIyavutLB9TdQZn8TuNqL/m7cpU
+1YMbNIa/1Ow2Cio7zrhr/FvTX4KgMaGq6ukx7qWDDbME96BF57IMtIkCIgQYAQIA
+DAUCPFTLBAUJEswDAAAKCRDbaY1xmSQlYPGsD/40gsxyQv4M8BFfPgnPEOYlSEBw
+pibr+XRdq7q98n3F9ZlXjJHq74RhX6aotL10wpeMb6fcFKhmaMu8Nhx4PUP9+h11
+I7EwmMeLn2prG/sSbsgCY4tsEW08NbDzcXdj6+KvekpE6lYmOa4ORQTEODx81d9R
+8DxcqUCYHYn+iYMbEDnBZmHgPc5hkGvBNj2F+dGs4n0iBvxFSBoTSzHb9XksG3/c
+q8DdW59McJw1/nTyN2kLIvGjNqSeV+2P2oeh5NRJAHs9X5W+Zar+sqvlHDa1e0jq
+2SrMhWdOD1qgTX3BzFyuhWW3IJLdcyFEp6NsC/L2eJdkWwclT1xhEvm8LEsB21nd
+E2UNpIjOUcdFvEnYa84Di8ZpIvEvngG6q9tm5K14DXZYQczsN+rrOXgTYfxbEuCz
+pFCg1DZaRQmWkXcywzo7F2YUgw1nFe9TlIrLJgXZcjg+ho3UNmquVr+qNV1IzYCk
+E6I70J/Q3fuXOfVdM2V0JQTaWfBOUFowwVNyzI5XSl8TTwslsGN8roEAGBR33Jwh
+By6TldhErnR1pvIOVt0kkGXbEqIIYONvfsdd2LIFZUfyegh8oFCJNDmKObKnuVyZ
+H53Q3bgTn06D5TdBaCK9usVqUe+JZ1K4VLy+20kSiBqaLkel3417o+bqdpL3Uu8g
+Xy1bsOhyo9m79ug8orkBogQ8VMvbEQQA9YjnqxRaPgKrbhTQqrzGMYBuP4QlbsQe
+EDA3y94jlPK++edfyUGUTnquXHDKmPnLwsqszYZCsC35nVP8FOsg0eATYYAj5A9u
+PDUXGQkW1eNQFGoh5p4SxBQZKlVJCAJyVgMxXDtUwDbjQ9CkOONrv1YlajDz9h9y
+HfFUjQrC47sAoOX8LBxMJVdAqGMOQGcI2lTWTfq1BACabalqZ3571+ePoAEsqSxZ
+elhHA/Se6oxlfxWNQilDGsgUSm53l7yeJn+8qZuiRm49wMlPZnzLA5isMAh0UyoT
+SnPs8lnZDLbo4/s4H2Jz0+MahJSYtNtSKTNhuJv7Fh/kQGVltAaniUQeecoJK7Yx
+hKbnvsXKzg7YEL2DLKDA4AP/RDeDRhK7ehXbkeONeJsOPjvjdATxSa7Io+GIUFB1
+CSLgaHfC43b8j7S5pEiZ8MOW+kwnP35G89h1K89nFpC47Xt8y/5DH4Z/tw3SdaEI
+r8TSL3u/UOK4gZEc5uVhCGBAX/BdIYFWdO2UUjEaO3ox38lgH0HfNscqgN5zCEEc
+6lmJAiIEGAECAAwFAjxUy9sFCRLMAwAACgkQ22mNcZkkJWAthQ//QCSN1sFaeqFQ
+Eki7fg6E0n+t7mO+V1llNymp7G8Pq3iSI2d99oijVk2BQnrbhdLy+wjl9Lyyzfvv
+aQ04QwAUvJNRgIaOpxkYb3z2tc31ho9eOYsQRmKxVzGWw1ii1OEnMBylsAaG58Gp
+FI/5MTfucIlJBvXoESkHSoiyov2Pd1c3hJ/6OuFYbn5dvYplBi2K3pAq12OCmWti
+cFvPTBpVlvTED0h+I133oO1e1Rx999u1/PQgLem5qfuz3wLv9r8qkXgy1AqdOEBN
+svXSo09yWaDTKaZWb6k7viOq6k2aDOi4mr8qgrf8obs6fpOfg6WQw+DRL/T9KUHF
+0EUSPVEMkbMc1V2iHURqXBGnIsa5JAi1eV1cMrp9T25DXWHlEfXRnPPjzTSJyJh2
+FmL9NnQrsmHf8f7DiR7uzCgA8+SZqRmr6o2j0FAPUrV4EmMYB7wTYPwPT7EXXmYs
+8m0ovamXwGbIwT2Z/EGhOc3UdAQF232o156m097tib5HMbTT+8AcjX3TaeXDJpjI
+35WybfJ8F2LEWmJsQwPC9MMCfy7SlW8BUqTBaelPvSYoKdLT6FOxtnoAVYn10WRI
+F7LESySJqENspSpv3ACJ/q1jZN6cXYKFlvKLR5Be/MWtnZ2AXqwHmR/XYGtXI6FR
+mNd6xrb+mP2QwkihMezVT+y2Q/EogXSJAmoEGAECAAwFCRLMAwAFAkQS4BkAUkcg
+BBkRAgAGBQJEEuACAAoJEOJmXIdJ4cvJKsUAn3R2myTGfaAyxiDwL9l3ObofNnX9
+AJ46M4YTuhT9ETVc15IOaHY5VCLcUQkQ22mNcZkkJWCOtg//RVzC6tHMnmZXXA6j
+slgca2yf/q0zJIULR9azhcraU3yy8OzjVorX1i5Xh5Rr3SmZkHiNUMrOK0jCzyM9
+ykBa58WOwwN1sZoNUQpUtmYja9kj/y444Atf0iIFW9TT4O31j25qEjz7cLZtmv+T
+nzcSIaZekJrIZ/8D74eDqNrfy/WaAi0JK2iMiw4dqwLtIc2W7UTtXfSgiAtNrkp4
+smrO6AUI2Xas7D+3zZiMlIv//W3ZSTF0vHtyBdmvcEPrs6DdjhsM+L7QHLnxD7HD
+86cvVh+9SzHelc5erhSWbwKMcZKykQ3uHhU9XCt60MYdbc8HHW92g0e9nEipZ7iS
+23uDmzoKvfihtho2+j1w5uKM/S6N/fditlWJ9qHvLHVPLNKPp4DEHo4ns56LCY1c
+RUX7N4TOWu2iVSdtzg8NFvhfnKyWkUTCYFuU64Jiq9XcJLMAn2AY02RzQcF8Lwbg
+zdyINK9pC0y0lH9ZrN6QyGinxILPVtwLsWO17JpDvKQf4+rmR9nHQSsvGJ/FjCDy
+dMx5HaT+TfC4KRR8BBgTDgZkq6cllbeC1qgCz3LXgai9pIlvT9httrVcpOL0QHnK
+M5jd7R8JZ1dt5qlltuWsC8Dw52kEGiBn095qmY1FFd02BxL7y7sxHp81m31yTErh
+o+HQlcXTIscl65wt2LwowPG0n2iZAQ0EQbPS8gEIAMtvZJvlBs6FEjN86De70Xff
+yArVdlYkbwnBc/wNIZtASh/T5ihP/tsD7eHWWOHcsbSbwlQR2iWvEvP/wyC67ZMD
+ZRCIzBFpEKFJW8GCQJFiSv3v6QKU2CaL48u5Q3XPi2ymp0TvrWdFW9SXbHhe8tMn
+bWFTl5cYawL6oU/gR97wHmQf4V7EB+cU8/Oi7caNsNti/gJiLSnKFPGZq7HInJCt
+D8xBS3REVGQvyoLNYJHYGYfeMzczRa3SgqfwLz59Yi1SHlT1/O/8r0Z479JXz7N0
+vgyt2oOy2Cpc2zbsf5Z4iBteVQYizSY40TpO0pnk9cbnMUzVvPW8N0Bhtjh5RYMA
+EQEAAbQlUEdQIEdsb2JhbCBEaXJlY3RvcnkgVmVyaWZpY2F0aW9uIEtleYkBVgQQ
+AQIAQAUCQlG0cAcLCQgHAwIKAhkBGRhsZGFwOi8va2V5c2VydmVyLnBncC5jb20F
+GwMAAAADFgIBBR4BAAAABBUIAgoACgkQlxC4m8pXrXz35ggAnVHdAh2KqrvwSnPo
+s73YdlVbeF9Lcbxs4oYPDCk6AHiDpjr2nxu48i1BiLea7aTEEwwAkcIa/3lCLP02
+NjGXq5gRnWpW/d0xtsaDDj8yYWusWGhEJsUlrq5Cz2KjwxNQHXRhHXEDR8vq9uzw
+5EjCB0u69vlwNmo8+fa17YMNVdXaXsmXJlJciVHazdvGoscTzZOuKDHdaJmY8nJc
+Cydk4qsFOiGOcFm5UOKPnzdBh31NKglqw/xh+1nTA2z5orsY4jVFIB6sWqutIcVQ
+Yt/J78diAKFemkEOQe0kU5JZrY34E8pp4BmS6mfPyr8NtHFfMOAE4m8acFeaZK1X
+6+uW59HMnv8AAA1ZARAAAQEAAAAAAAAAAAAAAAD/2P/gABBKRklGAAEBAAABAAEA
+AP/bAEMACgcHCAcGCggICAsKCgsOGBAODQ0OHRUWERgjHyUkIh8iISYrNy8mKTQp
+ISIwQTE0OTs+Pj4lLkRJQzxINz0+O//bAEMBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7
+Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEI
+AJAAeAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/
+xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHB
+FVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl
+ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6
+wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEB
+AQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID
+EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkq
+NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqS
+k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl
+5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqKrX99BptnJd3L7YoxkmuGvvi
+zZRkrZWbykdGbgVpClOp8KJlOMdz0KivILj4p6xM2IYYoV/Op7PxX4mv18xJSVBz
+leP61v8AVKiV5WRHtovY9YorzD/hMdat/vygsOoIqeD4l3URAubVJB3K8Gk8JVWy
+uHtYnpFFc5oXjXTtcnFsivFORna3+NdEDmueUXF2kjRNPVC0UUVIwooooAKKKKAC
+iiigDmPiG5XwjdYPXAP614dX0D4l0+HVNKNncFxHK3JQgEYBPGQfSuCfwBpCnia9
+/GVP/iK9DC4iFKDUjnq05Sd0eeL94V6X4N1HTRpqxzzLE6DnPfiq0HgXQHdkku75
+GHT51/8AiKst4H0aE4W/vRj/AGkP/slXWr0asbNsmFOcHcx9euLee/le1x5WTgjo
+ea5+Z+TXayeFNMQbf7QvMdeqf/EUz/hCtLkUN9qvSD38xP8A4irhiqUUkmJ0pt3O
+f8Iz+V4ihcsFA6knHpXr0ev6QkeJNUtAw6jzlyP1rzy48HaZaW7TxvcyOrKNsrKV
+OWA6BR61u6TpkVqRIqlcrj5Rx+NcWJqRqT5om1OLirM6mPX9GmbbHqtmzennrn+d
+X1ZXUMjBlPQg5BrnjAjqcbWHtzWFqGmySTma1le1dchXtXMZx9R1/Guexpc9Aorh
+YPFOq6Y6pdj7ZF0zIAr/AIMOPzH411Ola7Yawh+zSkSKMvC4w6/h6e4yKLBc0aKK
+KQwooooApalykQ9XP/oLVjyxYrZ1H7kR/wBv/wBlIqgyhhQMwJhcxu6xoQCScget
+OF7cxho3gLg9xkdsdutLdX0yX9xAoQLCyqPlznKK2T/31UJvJT12f98iiwiQzyAb
+I1IyB1HsBVqGFktowwwQKzzdSEEfKP8AgIq3b3BEcLt92WJHYDoCygnH50WAS9H/
+ABL5s+sf/o1KsW88giwiqAvdjUWojFi5B4Zo/wAfnU1pWq7rXaCFyOuKEBE1yduT
+GwPQ7KJQhGOM46VbMC+UF4DAdcVmTEQyMsKCZ+h5wFpiM2/hmcsiIrA9FZeDXOSN
+LpV0jvM0LZzE65BjP+9XVTabn5zJJuzncH5qneQhovLbkAdG+b+dUhM3/DPipdUI
+sb3al6B8rDhZgO49D6j8R6Dpa8ZuQ0Tq0ZMbxkFWTgqR0Ir0jwn4hGvacfNIF5b4
+WdR39GHsf5g0SjbUEzeoooqCipqA/cxn0lX9Tj+tUK1LqLzoGTODwQfQg5B/OuT8
+Sa1ceHdOe8ktIpwHCKquUySfoaAKl4P+Jvf/APXVP/RUdQkVBpWp/wBuxXGpfZ/s
+/nTY8vfv27UVeuBnpnpVoiqER1biH+h2v/XtF/6AtVSKyLfxbcTRrBbaMZPs6CEy
+Nc4Vio25+77dM0mM37yUiwCHp5yAfqf6VrWcuIV5rkGu9X1Mxoba3tY0fdtDFyxx
+jJPtk+nWtaGW9tlCzOhQ8BgpBzRYRszagm4wJl5Dxhe1SRQJBEBwTUFpDFHECMHP
+OfX3qSSXjrTSFciuG4NY143WtC4k4NZN2/WrRLMa96motC1g6Dr0F6WIhJ8uceqH
+qfw4P4U+7PWsi6GVbNVa4j3kHIyKKwvBd+2oeFbN5G3Swr5MnsV4598YP40Vgam9
+XnvxamC6bp9uD/rJyzD6DivQq82+LikLpkn8Jdh+OKqO4nsQeCUB0cAjI+0N/Stq
+6EUV05Kjy1PIrgfDRZfEun7XYK0hyMnB+U9q72/G9rmqejEtUQyXFrKu2FAreuSe
+KwNBVAhyo4dv/QjWH4w1EpEtpbJK5Rw00kf/ACz46HFGh+JrFLVYwjNKi8qpAB/E
+8ikgZ6BC6DoBSX91aCExXEwTcueOoHr7c1zOkand32pFmncooLGMN8voAB+NdDvz
+w2Rx3FOxNy1p1xA9kgtpxNGoxuByfxqSSXjrWJcWKSXcVzHLLC8ZBPksF3Y9eKq3
++o6z9tkitLeERZBWWTGMf5/GgDYnl4NZlzJ1pWuZSkQkjBZgfMaM/Khx784NU55c
+1SEU7lutZdzMkEUk7jcI13bfU9hV2d81n3EaTxvDJ9yQbSfT0P51Qju/g5ePc+H9
+QSRtzLelyf8AeVf8KKg+C8Lw6bqyuOVuVU/ULRWD3NVselVw3xYtDN4ZhugOba4U
+n6EY/wAK7ms/XdNXWNDvNPb/AJbxFV9m7frihaMGeM+GW3eIdOP/AE0b/wBAau/k
++d7n61514X3xeJbOCUFZIpXVgexCsDXocJ3y3A/2hVy3FE4RrOWw1KWK4BVmdnRh
+0dSeoqeewtL6ER3EKuobcCPlIOMZBFaPjCdI5LK2APmbjIT6LjH8z+lZ0MhKiqjq
+iXozJn0q/wBPDTW8wuoYxu2kFZQP5HFbnhbUftdjK6XHmoJOAG3beP61IjHjnmqk
+ulIblbm0mlspsbXa2wvmL6EevvRYR0T3AjRmkYIqjcxY4AFZsmv6WJGX7Upx/EEJ
+U/Q965nW3n0+KOyjup3t5MvslfcQQfXrjvisNpn67jQI9DlvLfyvN+0weXjO/wAw
+YxVadyADkEMMgg5BHsa8/eVvb64q7pWtS2MojkLvbNkNGD09xnoaYHSStmqc7fIa
+LbUIL9ZPKWRHjGSGIORnGcio7hZJCkMSl5JWCoo6kngCncD1L4XW3l+GZrraR9su
+3lGfQAL/ADU0V0miaamj6LZ6cmD9niCsR3b+I/icmisHuaov0UUUhnmnifw8dN8e
+2Gr26/6Peu3mY/hkCN/Mc/nV3T333Mw9XFbvi84tLU+k4/8AQTXN6M+6+ceriq6C
+MDxbeQXmsxW0ChmtQVkkHcnHy/hj9aggj4FN/sqawv5ba6XEqsTnswJ4YHvWjDb9
+OK0WiIe4xIjUkhS3heeXOyNSzY64FXI7f2pbvTvtdlNbklBKhTco5XI60XFY881S
++m1OcSSIqKowiKOFH9TVAxH0rYl0y4s7h7W6C+anO5ejr2YU02ftSuFjGaEntTRb
+knpWz9jPcU+OwLNhVyadxWKmlKbSdn2btyFcEkda9C+H+hR6prH9sPGwt7I4QNgh
+pcdvXbnP1IrB0Pw5c63qIsLT5duDcT4ysC/1Y9h/SvZtO0+20rT4bGzj8uCFdqjv
+7k+pJ5JqJMuKLVFFFQWFFFFAHOeMj/oVr/18Afoa57Tk8jW0j/vOK7PWdOGo2qru
+2vG4dDjIyPWuTuoL6G9842QLg8MjjH68imnoBB42U2L2uqlfMhX9zKijLLnkMPbg
+5qvpz2WoRiS0nR89s8irFxDqWoMguCFjjOVjTpn1J7msbU/DTiT7RaBrebruj4z+
+FNMTR0sdm47Zqwtqf7tcRDq/ifTDtbFwo/vjmr8XjvU4+JtLyfY07iNPXPDa6lGr
+xnyriP8A1coXOPYjuK506FfwP5VwiOcZDxghSPx71oS+PdQYYi0rn3NZeoa14k1W
+UCAC2jxjhcn3NIB82nQWcRlvZ0hQcncafp2nz6xIotEazsj965kX53H+wp/mf1qP
+SvDVxJdC5vi9xIDkGU7sfSu1tLOQYGDRcLGzoNrZaVYpZ2MQjjBye7Ox6sT3NbKn
+IzWTZ27LjNaqDC1JQ+iiigAooooAQjNRPbRueVFTUUAVjZRdlFQvpsT/AMNX6KAM
+eTQ4H6oPyqBvDdqf+WS/lW/RQBz48NWoP+qX8qmTQbdOiD8q2qKAM1NKiTooqwln
+GnQVaooAYsYXoKdS0UAFFFFAH//ZiQFOBBABAgA4BQJCUbRwBwsJCAcDAgoZGGxk
+YXA6Ly9rZXlzZXJ2ZXIucGdwLmNvbQUbAwAAAAMWAgEFHgEAAAAACgkQlxC4m8pX
+rXxIEgf+P5EZwy4eZWhmrj5duYK6edt+3hPRNrijqbE2RzrCTk/0+lwT2LHO2NXK
+wya/aLhjvjp0Jj0HW1+FBbXRLf0fOtgeHcjhrbBv3NCeJkJ/VedsJ7V5Gyw2FOkt
+VdedcoSxz0TAPky2I8gKW5khcHTxnHa4lJn7+L1OpIzkRS4mT6VeqBcZSJNpJc3r
+cj/gGdsXMLDxJpJPt3ueiTjlQL0j/6BwpU76hgROCuxTsAvq6TXpgP0ml9hkcQWa
+lihL6pDe0t88IbeBpL92MFlZaQ23nPt7qxtGSjj1cSPcRSHfceCOs6Uvy4k1uGVn
+k14gtzEeoZMeOL7nAwQMGN81P8LqbZiOBEO3+scBBADQmRl6K1zJAyqTbEZ3/mYa
+hzj5g3BCjw5KZXAi9jxQAje0GiuEXqFr2eJqplTi92V1OdcxTSPWg9yQCE6BE9o6
+9oRmFhRMXQX/XmmIAXl2RlDp2yZdVSQ81gxlOmRzacD4gAIGI6bKAYGQsW5e8dFb
+WLpI3PbyJEf9RlxguL/aIQAggVZQmbQmV2VybmVyIEtvY2ggKGRpc3Qgc2lnKSA8
+ZGQ5am5AZ251Lm9yZz6IvAQTAQIAJgUCQ7f6yAIbAwUJBaOagAYLCQgHAwIEFQII
+AwQWAgMBAh4BAheAAAoJEFO2INAc4MYweaMEAIdDDtJLkO4TOgCo/GCuG0RmqRwZ
+niJ4mnq/WOr8F4BK3w1HIuwVEE8V6BRU4Chx8wc9/W83krckIE5uaZRmjhCXCWsi
+K9Ow2ngbXAv3TKFVCbMMmyjBbT+31M9OT0Sowob8a1s4Xv2J+gQJjxfumMUKNlvf
+K86tEx0ucCiY15h8
+=yJFz
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/doc/see-also-note.texi b/doc/see-also-note.texi
new file mode 100644 (file)
index 0000000..c0563fe
--- /dev/null
@@ -0,0 +1,14 @@
+@c We append this note to all ``see also'' sections of the man pages
+
+@ifset isman
+The full documentation for this tool is maintained as a Texinfo manual.
+If GnuPG and the info program are properly installed at your site, the
+command
+
+@example
+info gnupg1
+@end example
+
+should give you access to the complete manual including a menu structure
+and an index.
+@end ifset
diff --git a/doc/specify-user-id.texi b/doc/specify-user-id.texi
new file mode 100644 (file)
index 0000000..7643f93
--- /dev/null
@@ -0,0 +1,171 @@
+@c Include file to allow for different placements in man pages and the manual
+
+There are different ways to specify a user ID to GnuPG.  Some of them
+are only valid for @command{gpg} others are only good for
+@command{gpgsm}.  Here is the entire list of ways to specify a key:
+
+@itemize @bullet
+
+@item By key Id. 
+This format is deduced from the length of the string and its content or
+@code{0x} prefix. The key Id of an X.509 certificate are the low 64 bits
+of its SHA-1 fingerprint.  The use of key Ids is just a shortcut, for
+all automated processing the fingerprint should be used.
+
+When using @command{gpg} an exclamation mark may be appended to force
+using the specified primary or secondary key and not to try and
+calculate which primary or secondary key to use.
+
+The last four lines of the example give the key ID in their long form as
+internally used by the OpenPGP protocol. You can see the long key ID
+using the option @option{--with-colons}.
+
+@cartouche
+@example
+234567C4
+0F34E556E
+01347A56A
+0xAB123456
+
+234AABBCC34567C4
+0F323456784E56EAB
+01AB3FED1347A5612
+0x234AABBCC34567C4
+@end example
+@end cartouche
+
+
+
+@item By fingerprint.
+This format is deduced from the length of the string and its content or
+the @code{0x} prefix.  Note, that only the 20 byte version fingerprint
+is available with @command{gpgsm} (i.e. the SHA-1 hash of the
+certificate).
+
+When using @command{gpg} an exclamation mark may be appended to force
+using the specified primary or secondary key and not to try and
+calculate which primary or secondary key to use.
+
+The best way to specify a key Id is by using the fingerprint.  This
+avoids any ambiguities in case that there are duplicated key IDs.
+
+@cartouche
+@example
+1234343434343434C434343434343434
+123434343434343C3434343434343734349A3434
+0E12343434343434343434EAB3484343434343434
+0xE12343434343434343434EAB3484343434343434
+@end example
+@end cartouche
+
+@noindent
+(@command{gpgsm} also accepts colons between each pair of hexadecimal
+digits because this is the de-facto standard on how to present X.509
+fingerprints.)
+
+@item By exact match on OpenPGP user ID.
+This is denoted by a leading equal sign. It does not make sense for
+X.509 certificates.
+
+@cartouche
+@example 
+=Heinrich Heine <heinrichh@@uni-duesseldorf.de>
+@end example
+@end cartouche
+
+@item By exact match on an email address.
+This is indicated by enclosing the email address in the usual way
+with left and right angles.
+
+@cartouche
+@example
+<heinrichh@@uni-duesseldorf.de>
+@end example
+@end cartouche
+
+
+@item By word match.
+All words must match exactly (not case sensitive) but can appear in any
+order in the user ID or a subjects name.  Words are any sequences of
+letters, digits, the underscore and all characters with bit 7 set.
+
+@cartouche
+@example
++Heinrich Heine duesseldorf
+@end example
+@end cartouche
+
+@item By exact match on the subject's DN.
+This is indicated by a leading slash, directly followed by the RFC-2253
+encoded DN of the subject.  Note that you can't use the string printed
+by "gpgsm --list-keys" because that one as been reordered and modified
+for better readability; use --with-colons to print the raw (but standard
+escaped) RFC-2253 string
+
+@cartouche
+@example
+/CN=Heinrich Heine,O=Poets,L=Paris,C=FR
+@end example
+@end cartouche
+
+@item By exact match on the issuer's DN.
+This is indicated by a leading hash mark, directly followed by a slash
+and then directly followed by the rfc2253 encoded DN of the issuer.
+This should return the Root cert of the issuer.  See note above.
+
+@cartouche
+@example
+#/CN=Root Cert,O=Poets,L=Paris,C=FR
+@end example
+@end cartouche
+
+
+@item By exact match on serial number and issuer's DN.
+This is indicated by a hash mark, followed by the hexadecmal
+representation of the serial number, the followed by a slash and the
+RFC-2253 encoded DN of the issuer. See note above.
+
+@cartouche
+@example
+#4F03/CN=Root Cert,O=Poets,L=Paris,C=FR
+@end example
+@end cartouche
+
+@item By keygrip
+This is indicated by an ampersand followed by the 40 hex digits of a
+keygrip.  @command{gpgsm} prints the keygrip when using the command
+@option{--dump-cert}.  It does not yet work for OpenPGP keys.
+
+@cartouche
+@example
+&D75F22C3F86E355877348498CDC92BD21010A480
+@end example
+@end cartouche
+
+
+@item By substring match.
+This is the default mode but applications may want to explicitly
+indicate this by putting the asterisk in front.  Match is not case
+sensitive.
+
+@cartouche
+@example
+Heine
+*Heine
+@end example
+@end cartouche
+
+@end itemize
+
+
+Please note that we have reused the hash mark identifier which was used
+in old GnuPG versions to indicate the so called local-id.  It is not
+anymore used and there should be no conflict when used with X.509 stuff.
+
+Using the RFC-2253 format of DNs has the drawback that it is not
+possible to map them back to the original encoding, however we don't
+have to do this because our key database stores this encoding as meta
+data.
+
+
+
diff --git a/doc/stamp-vti b/doc/stamp-vti
new file mode 100644 (file)
index 0000000..5e2b9df
--- /dev/null
@@ -0,0 +1,4 @@
+@set UPDATED 4 December 2006
+@set UPDATED-MONTH December 2006
+@set EDITION 1.4.6
+@set VERSION 1.4.6
diff --git a/doc/texi.css b/doc/texi.css
new file mode 100644 (file)
index 0000000..a369abc
--- /dev/null
@@ -0,0 +1,6 @@
+/* The gnupg.org standard stylesheet.  */
+  @import url(/share/site.css);
+
+
+
+
diff --git a/doc/version.texi b/doc/version.texi
new file mode 100644 (file)
index 0000000..5e2b9df
--- /dev/null
@@ -0,0 +1,4 @@
+@set UPDATED 4 December 2006
+@set UPDATED-MONTH December 2006
+@set EDITION 1.4.6
+@set VERSION 1.4.6
diff --git a/doc/yat2m.c b/doc/yat2m.c
new file mode 100644 (file)
index 0000000..e250db4
--- /dev/null
@@ -0,0 +1,1325 @@
+/* yat2m.c - Yet Another Texi 2 Man converter
+ *     Copyright (C) 2005 g10 Code GmbH
+ *      Copyright (C) 2006 2006 Free Software Foundation, Inc.
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+/*
+    This is a simple textinfo to man page converter.  It needs some
+    special markup in th e texinfo and tries best to get a create man
+    page.  It has been designed for the GnuPG man pages and thus only
+    a few texinfo commands are supported.
+
+    To use this you need to add the following macros into your texinfo
+    source:
+
+      @macro manpage {a}
+      @end macro
+      @macro mansect {a}
+      @end macro
+      @macro manpause 
+      @end macro
+      @macro mancont
+      @end macro
+      
+    They are used by yat2m to select parts of the Texinfo which should
+    go into the man page. These macros need to be used without leading
+    left space. Processing starts after a "manpage" macro has been
+    seen.  "mansect" identifies the section and yat2m make sure to
+    emit the sections in the proper order.  Note that @mansect skips
+    the next input line if that line begins with @section, @subsection or
+    @chapheading.
+
+    To insert verbatim troff markup, the follwing texinfo code may be
+    used:
+
+      @ifset manverb
+      .B whateever you want
+      @end ifset
+
+    alternativly a special comment may be used:
+
+      @c man:.B whatever you want
+
+    This is useful in case you need just one line. If you want to
+    include parts only in the man page but keep the texinfo
+    translation you may use:
+
+      @ifset isman
+      stuff to be rendered only on man pages
+      @end ifset
+
+    or to exclude stuff from man pages:
+
+      @ifclear isman
+      stuff not to be rendered on man pages
+      @end ifclear
+
+    the keyword @section is ignored, however @subsection gets rendered
+    as ".SS".  @menu is completely skipped. Several man pages may be
+    extracted from one file, either using the --store or the --select
+    option.
+
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <ctype.h>
+#include <time.h>
+
+
+#define PGM "yat2m"
+#define VERSION "0.5"
+
+/* The maximum length of a line including the linefeed and one extra
+   character. */
+#define LINESIZE 1024
+
+/* Option flags. */
+static int verbose;
+static int quiet;
+static int debug;
+static const char *opt_source; 
+static const char *opt_release; 
+static const char *opt_select;
+static const char *opt_include;
+static int opt_store;
+
+/* The only define we understand is -D gpgone.  Thus we need a simple
+   boolean tro track it. */
+static int gpgone_defined;
+
+/* Flag to keep track whether any error occurred.  */
+static int any_error;
+
+
+/* Object to keep macro definitions.  */
+struct macro_s
+{
+  struct macro_s *next;
+  char *value;  /* Malloced value. */
+  char name[1];
+};
+typedef struct macro_s *macro_t;
+
+/* List of all defined macros. */
+static macro_t macrolist;
+
+
+/* Object to store one line of content.  */
+struct line_buffer_s
+{
+  struct line_buffer_s *next;
+  int verbatim;  /* True if LINE contains verbatim data.  The default
+                    is Texinfo source.  */
+  char *line;
+};
+typedef struct line_buffer_s *line_buffer_t;
+
+
+/* Object to collect the data of a section.  */
+struct section_buffer_s
+{
+  char *name;           /* Malloced name of the section. This may be
+                           NULL to indicate this slot is not used.  */
+  line_buffer_t lines;  /* Linked list with the lines of the section.  */
+  line_buffer_t *lines_tail; /* Helper for faster appending to the
+                                linked list.  */
+  line_buffer_t last_line;   /* Points to the last line appended.  */
+};
+typedef struct section_buffer_s *section_buffer_t;
+
+/* Variable to keep info about the current page together.  */
+static struct 
+{
+  /* Filename of the current page or NULL if no page is active.  Malloced. */
+  char *name;
+
+  /* Number of allocated elements in SECTIONS below.  */
+  size_t n_sections;       
+  /* Array with the data of the sections.  */
+  section_buffer_t sections; 
+
+} thepage;
+
+
+/* The list of standard section names.  COMMANDS and ASSUAN are GnuPG
+   specific. */
+static const char * const standard_sections[] = 
+  { "NAME",  "SYNOPSIS",  "DESCRIPTION",
+    "RETURN VALUE", "EXIT STATUS", "ERROR HANDLING", "ERRORS",
+    "COMMANDS", "OPTIONS", "USAGE", "EXAMPLES", "FILES",
+    "ENVIRONMENT", "DIAGNOSTICS", "SECURITY", "CONFORMING TO",
+    "ASSUAN", "NOTES", "BUGS", "AUTHOR", "SEE ALSO", NULL };
+
+
+/*-- Local prototypes.  --*/
+static void proc_texi_buffer (FILE *fp, const char *line, size_t len,
+                              int *table_level, int *eol_action);
+
+
+
+/* Print diagnostic message and exit with failure. */
+static void
+die (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  fflush (stdout);
+  fprintf (stderr, "%s: ", PGM);
+
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  va_end (arg_ptr);
+  putc ('\n', stderr);
+
+  exit (1);
+}
+
+
+/* Print diagnostic message. */
+static void
+err (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  fflush (stdout);
+  if (strncmp (format, "%s:%d:", 6))
+    fprintf (stderr, "%s: ", PGM);
+
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  va_end (arg_ptr);
+  putc ('\n', stderr);
+  any_error = 1;
+}
+
+/* Print diagnostic message. */
+static void
+inf (const char *format, ...)
+{
+  va_list arg_ptr;
+
+  fflush (stdout);
+  fprintf (stderr, "%s: ", PGM);
+
+  va_start (arg_ptr, format);
+  vfprintf (stderr, format, arg_ptr);
+  va_end (arg_ptr);
+  putc ('\n', stderr);
+}
+
+
+static void *
+xmalloc (size_t n)
+{
+  void *p = malloc (n);
+  if (!p)
+    die ("out of core: %s", strerror (errno));
+  return p;
+}
+
+static void *
+xcalloc (size_t n, size_t m)
+{
+  void *p = calloc (n, m);
+  if (!p)
+    die ("out of core: %s", strerror (errno));
+  return p;
+}
+
+static void *
+xrealloc (void *old, size_t n)
+{
+  void *p = realloc (old, n);
+  if (!p)
+    die ("out of core: %s", strerror (errno));
+  return p;
+}
+
+static char *
+xstrdup (const char *string)
+{
+  void *p = malloc (strlen (string)+1);
+  if (!p)
+    die ("out of core: %s", strerror (errno));
+  strcpy (p, string);
+  return p;
+}
+
+
+/* Uppercase the ascii characters in STRING.  */
+static char *
+ascii_strupr (char *string)
+{
+  char *p;
+
+  for (p = string; *p; p++)
+    if (!(*p & 0x80))
+      *p = toupper (*p);
+  return string;
+}
+
+
+/* Return the current date as an ISO string.  */
+const char *
+isodatestring (void)
+{
+  static char buffer[11+5];
+  struct tm *tp;
+  time_t atime = time (NULL);
+  
+  if (atime < 0)
+    strcpy (buffer, "????" "-??" "-??");
+  else
+    {
+      tp = gmtime (&atime);
+      sprintf (buffer,"%04d-%02d-%02d",
+               1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
+    }
+  return buffer;
+}
+
+
+
+/* Return a section buffer for the section NAME.  Allocate a new buffer
+   if this is a new section.  Keep track of the sections in THEPAGE.
+   This function may reallocate the section array in THEPAGE.  */
+static section_buffer_t
+get_section_buffer (const char *name)
+{
+  int i;
+  section_buffer_t sect; 
+
+  /* If there is no section we put everything into the required NAME
+     section.  Given that this is the first one listed it is likely
+     that error are easily visible.  */
+  if (!name)
+    name = "NAME";
+
+  for (i=0; i < thepage.n_sections; i++)
+    {
+      sect = thepage.sections + i;
+      if (sect->name && !strcmp (name, sect->name))
+        return sect;
+    }
+  for (i=0; i < thepage.n_sections; i++)
+    if (!thepage.sections[i].name)
+      break;
+  if (i < thepage.n_sections)
+    sect = thepage.sections + i;
+  else
+    {
+      /* We need to allocate or reallocate the section array.  */
+      size_t old_n = thepage.n_sections;
+      size_t new_n = 20;
+
+      if (!old_n)
+        thepage.sections = xcalloc (new_n, sizeof *thepage.sections);
+      else
+        {
+          thepage.sections = xrealloc (thepage.sections,
+                                       ((old_n + new_n)
+                                        * sizeof *thepage.sections));
+          memset (thepage.sections + old_n, 0,
+                  new_n * sizeof *thepage.sections);
+        }
+      thepage.n_sections += new_n;
+
+      /* Setup the tail pointers.  */
+      for (i=old_n; i < thepage.n_sections; i++)
+        {
+          sect = thepage.sections + i;
+          sect->lines_tail = &sect->lines;
+        }
+      sect = thepage.sections + old_n;
+    }
+
+  /* Store the name.  */
+  assert (!sect->name);
+  sect->name = xstrdup (name);
+  return sect;
+}
+
+
+
+/* Add the content of LINE to the section named SECTNAME.  */
+static void
+add_content (const char *sectname, char *line, int verbatim)
+{
+  section_buffer_t sect;
+  line_buffer_t lb;
+
+  sect = get_section_buffer (sectname);
+  if (sect->last_line && !sect->last_line->verbatim == !verbatim)
+    {
+      /* Lets append that line to the last one.  We do this to keep
+         all lines of the same kind (i.e.verbatim or not) together in
+         one large buffer.  */
+      size_t n1, n;
+
+      lb = sect->last_line;
+      n1 = strlen (lb->line);
+      n = n1 + 1 + strlen (line) + 1;
+      lb->line = xrealloc (lb->line, n);
+      strcpy (lb->line+n1, "\n");
+      strcpy (lb->line+n1+1, line);
+    }
+  else
+    {
+      lb = xcalloc (1, sizeof *lb);
+      lb->verbatim = verbatim;
+      lb->line = xstrdup (line);
+      sect->last_line = lb;
+      *sect->lines_tail = lb;
+      sect->lines_tail = &lb->next;
+    }
+}
+
+
+/* Prepare for a new man page using the filename NAME. */
+static void
+start_page (char *name)
+{
+  if (verbose)
+    inf ("starting page `%s'", name);
+  assert (!thepage.name);
+  thepage.name = xstrdup (name);
+  thepage.n_sections = 0;
+}
+
+
+/* Write the .TH entry of the current page.  Return -1 if there is a
+   problem with the page. */
+static int
+write_th (FILE *fp)
+{
+  char *name, *p;
+
+  name = ascii_strupr (xstrdup (thepage.name));
+  p = strrchr (name, '.');
+  if (!p || !p[1])
+    {
+      err ("no section name in man page `%s'", thepage.name);
+      free (name);
+      return -1;
+    }
+  *p++ = 0;
+  fprintf (fp, ".TH %s %s %s \"%s\" \"%s\"\n",
+           name, p, isodatestring (), opt_release, opt_source);
+  return 0;
+}
+
+
+/* Process the texinfo command COMMAND (without the leading @) and
+   write output if needed to FP. REST is the remainer of the line
+   which should either point to an opening brace or to a white space.
+   The function returns the number of characters already processed
+   from REST.  LEN is the usable length of REST.  TABLE_LEVEL is used to
+   control the indentation of tables.  */
+static size_t
+proc_texi_cmd (FILE *fp, const char *command, const char *rest, size_t len,
+               int *table_level, int *eol_action)
+{
+  static struct {
+    const char *name;    /* Name of the command.  */
+    int what;            /* What to do with this command. */
+    const char *lead_in; /* String to print with a opening brace.  */
+    const char *lead_out;/* String to print with the closing brace. */
+  } cmdtbl[] = {
+    { "command", 0, "\\fB", "\\fR" },
+    { "code",    0, "\\fB", "\\fR" },
+    { "sc",      0, "\\fB", "\\fR" },
+    { "var",     0, "\\fI", "\\fR" },
+    { "samp",    0, "\n'",  "'\n"  },
+    { "file",    0, "`\\fI","\\fR'" }, 
+    { "env",     0, "`\\fI","\\fR'" }, 
+    { "acronym", 0 },
+    { "dfn",     0 },
+    { "option",  0, "\\fB", "\\fR"   },
+    { "example", 1, ".RS 2\n.nf\n" },
+    { "smallexample", 1, ".RS 2\n.nf\n" },
+    { "asis",    7 },
+    { "anchor",  7 },
+    { "cartouche", 1 },
+    { "xref",    0, "see: [", "]" },
+    { "pxref",   0, "see: [", "]" },
+    { "uref",    0, "(\\fB", "\\fR)" },
+    { "footnote",0, " ([", "])" },
+    { "emph",    0, "\\fI", "\\fR" },
+    { "w",       1 },                                 
+    { "c",       5 },
+    { "opindex", 1 },
+    { "cpindex", 1 },
+    { "cindex",  1 },
+    { "noindent", 0 },
+    { "section", 1 },
+    { "chapter", 1 },
+    { "subsection", 6, "\n.SS " },
+    { "chapheading", 0},
+    { "item",    2, ".TP\n.B " },
+    { "itemx",   2, ".TP\n.B " },
+    { "table",   3 }, 
+    { "itemize",   3 }, 
+    { "bullet",  0, "* " },
+    { "end",     4 },
+    { "quotation",1, ".RS\n\\fB" },
+    { NULL }
+  };
+  size_t n;
+  int i;
+  const char *s;
+  const char *lead_out = NULL;
+  int ignore_args = 0;
+
+  for (i=0; cmdtbl[i].name && strcmp (cmdtbl[i].name, command); i++)
+    ;
+  if (cmdtbl[i].name)
+    {
+      s = cmdtbl[i].lead_in;
+      if (s)
+        fputs (s, fp);
+      lead_out = cmdtbl[i].lead_out;
+      switch (cmdtbl[i].what)
+        {
+        case 1: /* Throw away the entire line.  */
+          s = memchr (rest, '\n', len);
+          return s? (s-rest)+1 : len;  
+        case 2: /* Handle @item.  */
+          break;
+        case 3: /* Handle table.  */
+          if (++(*table_level) > 1)
+            fputs (".RS\n", fp);
+          /* Now throw away the entire line. */
+          s = memchr (rest, '\n', len);
+          return s? (s-rest)+1 : len;  
+          break;
+        case 4: /* Handle end.  */
+          for (s=rest, n=len; n && (*s == ' ' || *s == '\t'); s++, n--)
+            ;
+          if (n >= 5 && !memcmp (s, "table", 5)
+              && (!n || s[5] == ' ' || s[5] == '\t' || s[5] == '\n'))
+            {
+              if ((*table_level)-- > 1)
+                fputs (".RE\n", fp);
+            }
+          else if (n >= 7 && !memcmp (s, "example", 7)
+              && (!n || s[7] == ' ' || s[7] == '\t' || s[7] == '\n'))
+            {
+              fputs (".fi\n.RE\n", fp);
+            }
+          else if (n >= 12 && !memcmp (s, "smallexample", 12)
+              && (!n || s[12] == ' ' || s[12] == '\t' || s[12] == '\n'))
+            {
+              fputs (".fi\n.RE\n", fp);
+            }
+          else if (n >= 9 && !memcmp (s, "quotation", 9)
+              && (!n || s[9] == ' ' || s[9] == '\t' || s[9] == '\n'))
+            {
+              fputs ("\\fR\n.RE\n", fp);
+            }
+          /* Now throw away the entire line. */
+          s = memchr (rest, '\n', len);
+          return s? (s-rest)+1 : len;  
+        case 5: /* Handle special comments. */
+          for (s=rest, n=len; n && (*s == ' ' || *s == '\t'); s++, n--)
+            ;
+          if (n >= 4 && !memcmp (s, "man:", 4))
+            {
+              for (s+=4, n-=4; n && *s != '\n'; n--, s++)
+                putc (*s, fp);
+              putc ('\n', fp);
+            }
+          /* Now throw away the entire line. */
+          s = memchr (rest, '\n', len);
+          return s? (s-rest)+1 : len;  
+        case 6:
+          *eol_action = 1;
+          break;
+        case 7:
+          ignore_args = 1;
+          break;
+        default:
+          break;
+        }
+    }
+  else
+    {
+      macro_t m;
+
+      for (m = macrolist; m ; m = m->next)
+        if (!strcmp (m->name, command))
+            break;
+      if (m)
+        {
+          proc_texi_buffer (fp, m->value, strlen (m->value),
+                            table_level, eol_action);
+          ignore_args = 1; /* Parameterized macros are not yet supported. */
+        }
+      else
+        inf ("texinfo command `%s' not supported (%.*s)", command,
+             ((s = memchr (rest, '\n', len)), (s? (s-rest) : len)), rest);
+    }
+
+  if (*rest == '{')
+    {
+      /* Find matching closing brace.  */
+      for (s=rest+1, n=1, i=1; i && *s && n < len; s++, n++)
+        if (*s == '{')
+          i++;
+        else if (*s == '}')
+          i--;
+      if (i)
+        {
+          err ("closing brace for command `%s' not found", command);
+          return len;
+        }
+      if (n > 2 && !ignore_args)
+        proc_texi_buffer (fp, rest+1, n-2, table_level, eol_action);
+    }
+  else
+    n = 0;
+
+  if (lead_out)
+    fputs (lead_out, fp);
+
+  return n;
+}
+
+
+
+/* Process the string LINE with LEN bytes of Texinfo content. */
+static void
+proc_texi_buffer (FILE *fp, const char *line, size_t len,
+                  int *table_level, int *eol_action)
+{
+  const char *s;
+  char cmdbuf[256];
+  int cmdidx = 0;
+  int in_cmd = 0;
+  size_t n;
+
+  for (s=line; *s && len; s++, len--)
+    {
+      if (in_cmd)
+        {
+          if (in_cmd == 1)
+            {
+              switch (*s)
+                {
+                case '@': case '{': case '}': 
+                  putc (*s, fp); in_cmd = 0; 
+                  break;
+                case ':': /* Not ending a sentence flag.  */
+                  in_cmd = 0;
+                  break;
+                case '.': case '!': case '?': /* Ending a sentence. */
+                  putc (*s, fp); in_cmd = 0; 
+                  break;
+                case ' ': case '\t': case '\n': /* Non collapsing spaces.  */
+                  putc (*s, fp); in_cmd = 0; 
+                  break;
+                default:
+                  cmdidx = 0;
+                  cmdbuf[cmdidx++] = *s;
+                  in_cmd++;
+                  break;
+                }
+            }
+          else if (*s == '{' || *s == ' ' || *s == '\t' || *s == '\n')
+            {
+              cmdbuf[cmdidx] = 0;
+              n = proc_texi_cmd (fp, cmdbuf, s, len, table_level, eol_action);
+              assert (n <= len);
+              s += n; len -= n;
+              s--; len++;
+              in_cmd = 0;
+            }
+          else if (cmdidx < sizeof cmdbuf -1)  
+            cmdbuf[cmdidx++] = *s;
+          else
+            {
+              err ("texinfo command too long - ignored");
+              in_cmd = 0;
+            }
+        }
+      else if (*s == '@')
+        in_cmd = 1;
+      else if (*s == '\n')
+        {
+          switch (*eol_action)
+            {
+            case 1: /* Create a dummy paragraph. */
+              fputs ("\n\\ \n", fp);
+              break;
+            default:
+              putc (*s, fp);
+            }
+          *eol_action = 0;
+        }
+      else
+        putc (*s, fp);
+    }
+
+  if (in_cmd > 1)
+    {
+      cmdbuf[cmdidx] = 0;
+      n = proc_texi_cmd (fp, cmdbuf, s, len, table_level, eol_action);
+      assert (n <= len);
+      s += n; len -= n;
+      s--; len++;
+      in_cmd = 0;
+    }
+}
+
+
+/* Do something with the Texinfo line LINE.  */
+static void
+parse_texi_line (FILE *fp, const char *line, int *table_level)
+{
+  int eol_action = 0;
+
+  /* A quick test whether there are any texinfo commands.  */
+  if (!strchr (line, '@'))
+    {
+      fputs (line, fp);
+      putc ('\n', fp);
+      return;
+    }
+  proc_texi_buffer (fp, line, strlen (line), table_level, &eol_action);
+  putc ('\n', fp);
+}
+
+
+/* Write all the lines LINES to FP.  */
+static void
+write_content (FILE *fp, line_buffer_t lines)
+{
+  line_buffer_t line;
+  int table_level = 0;
+
+  for (line = lines; line; line = line->next)
+    {
+      if (line->verbatim)
+        {
+          fputs (line->line, fp);
+          putc ('\n', fp);
+        }
+      else
+        {
+/*           fputs ("TEXI---", fp); */
+/*           fputs (line->line, fp); */
+/*           fputs ("---\n", fp); */
+          parse_texi_line (fp, line->line, &table_level);
+        }
+    }  
+}
+
+
+
+static int
+is_standard_section (const char *name)
+{
+  int i;
+  const char *s;
+
+  for (i=0; (s=standard_sections[i]); i++)
+    if (!strcmp (s, name))
+      return 1;
+  return 0;
+}
+
+
+/* Finish a page; that is sort the data and write it out to the file.  */
+static void
+finish_page (void)
+{
+  FILE *fp;
+  section_buffer_t sect;
+  int idx;
+  const char *s;
+  int i;
+
+  if (!thepage.name)
+    return; /* No page active.  */
+
+  if (verbose)
+    inf ("finishing page `%s'", thepage.name);
+
+  if (opt_select)
+    {
+      if (!strcmp (opt_select, thepage.name))
+        {
+          inf ("selected `%s'", thepage.name );
+          fp = stdout;
+        }
+      else
+        {
+          fp = fopen ( "/dev/null", "w" );
+          if (!fp)
+            die ("failed to open /dev/null: %s\n", strerror (errno));
+        }
+    }
+  else if (opt_store)
+    {
+      inf ("writing `%s'", thepage.name );
+      fp = fopen ( thepage.name, "w" );
+      if (!fp)
+        die ("failed to create `%s': %s\n", thepage.name, strerror (errno));
+    }
+  else
+    fp = stdout;
+
+  if (write_th (fp))
+    goto leave;
+
+  for (idx=0; (s=standard_sections[idx]); idx++)
+    {
+      for (i=0; i < thepage.n_sections; i++)
+        {
+          sect = thepage.sections + i;
+          if (sect->name && !strcmp (s, sect->name))
+            break;
+        }
+      if (i == thepage.n_sections)
+        sect = NULL;
+
+      if (sect)
+        {
+          fprintf (fp, ".SH %s\n", sect->name);
+          write_content (fp, sect->lines);
+          /* Now continue with all non standard sections directly
+             following this one. */
+          for (i++; i < thepage.n_sections; i++)
+            {
+              sect = thepage.sections + i;
+              if (sect->name && is_standard_section (sect->name))
+                break;
+              if (sect->name)
+                {
+                  fprintf (fp, ".SH %s\n", sect->name);
+                  write_content (fp, sect->lines);
+                }
+            }
+          
+        }
+    }
+
+
+ leave:
+  if (fp != stdout)
+    fclose (fp);
+  free (thepage.name);
+  thepage.name = NULL;
+  /* FIXME: Cleanup the content.  */
+}
+
+
+
+
+/* Parse one Texinfo file and create manpages according to the
+   embedded instructions.  */
+static void
+parse_file (const char *fname, FILE *fp, char **section_name, int in_pause)
+{
+  char *line;
+  int lnr = 0;
+  /* Fixme: The follwing state variables don't carry over to include
+     files. */
+  int in_verbatim = 0;
+  int skip_to_end = 0;        /* Used to skip over menu entries. */
+  int skip_sect_line = 0;     /* Skip after @mansect.  */
+  int ifset_nesting = 0;      /* How often a ifset has been seen. */
+  int ifclear_nesting = 0;    /* How often a ifclear has been seen. */
+  int in_gpgone = 0;          /* Keep track of "@ifset gpgone" parts.  */
+  int not_in_gpgone = 0;      /* Keep track of "@ifclear gpgone" parts.  */
+  int not_in_man = 0;         /* Keep track of "@ifclear isman" parts.  */
+
+  /* Helper to define a macro. */
+  char *macroname = NULL;     
+  char *macrovalue = NULL; 
+  size_t macrovaluesize = 0;
+  size_t macrovalueused = 0;
+
+  line = xmalloc (LINESIZE);
+  while (fgets (line, LINESIZE, fp))
+    {
+      size_t n = strlen (line);
+      int got_line = 0;
+      char *p;
+
+      lnr++;
+      if (!n || line[n-1] != '\n')
+        {
+          err ("%s:%d: trailing linefeed missing, line too long or "
+               "embedded Nul character", fname, lnr);
+          break;
+        }
+      line[--n] = 0;
+
+      if (*line == '@')
+        {
+          for (p=line+1, n=1; *p && *p != ' ' && *p != '\t'; p++)
+            n++;
+          while (*p == ' ' || *p == '\t')
+            p++;
+        }
+      else
+        p = line;
+
+      /* Take action on macro.  */
+      if (macroname)
+        {
+          if (n == 4 && !memcmp (line, "@end", 4)
+              && (line[4]==' '||line[4]=='\t'||!line[4])
+              && !strncmp (p, "macro", 5)
+              && (p[5]==' '||p[5]=='\t'||!p[5]))
+            {
+              macro_t m;
+
+              if (macrovalueused)
+                macrovalue[--macrovalueused] = 0; /* Kill the last LF. */
+              macrovalue[macrovalueused] = 0;     /* Terminate macro. */
+              macrovalue = xrealloc (macrovalue, macrovalueused+1);
+              
+              for (m= macrolist; m; m = m->next)
+                if (!strcmp (m->name, macroname))
+                  break;
+              if (m)
+                free (m->value);
+              else
+                {
+                  m = xcalloc (1, sizeof *m + strlen (macroname));
+                  strcpy (m->name, macroname);
+                  m->next = macrolist;
+                  macrolist = m;
+                }
+              m->value = macrovalue;
+              macrovalue = NULL;
+              free (macroname);
+              macroname = NULL;
+            }
+          else
+            {
+              if (macrovalueused + strlen (line) + 2 >= macrovaluesize)
+                {
+                  macrovaluesize += strlen (line) + 256;
+                  macrovalue = xrealloc (macrovalue,  macrovaluesize);
+                }
+              strcpy (macrovalue+macrovalueused, line);
+              macrovalueused += strlen (line);
+              macrovalue[macrovalueused++] = '\n';
+            }
+          continue;
+        }
+
+
+      if (n >= 5 && !memcmp (line, "@node", 5)
+          && (line[5]==' '||line[5]=='\t'||!line[5]))
+        {
+          /* Completey ignore @node lines.  */
+          continue;
+        }
+
+
+      if (skip_sect_line)
+        {
+          skip_sect_line = 0;
+          if (!strncmp (line, "@section", 8)
+              || !strncmp (line, "@subsection", 11)
+              || !strncmp (line, "@chapheading", 12))
+            continue;
+        }
+
+      /* We only parse lines we need and ignore the rest.  There are a
+         few macros used to control this as well as one @ifset
+         command.  Parts we know about are saved away into containers
+         separate for each section. */
+
+      /* First process ifset/ifclear commands. */
+      if (*line == '@')
+        {
+          if (n == 6 && !memcmp (line, "@ifset", 6)
+                   && (line[6]==' '||line[6]=='\t'))
+            {
+              ifset_nesting++;
+
+              if (!strncmp (p, "manverb", 7) && (p[7]==' '||p[7]=='\t'||!p[7]))
+                {
+                  if (in_verbatim)
+                    err ("%s:%d: nested \"@ifset manverb\"", fname, lnr);
+                  else
+                    in_verbatim = ifset_nesting;
+                }
+              else if (!strncmp (p, "gpgone", 6)
+                       && (p[6]==' '||p[6]=='\t'||!p[6]))
+                {
+                  if (in_gpgone)
+                    err ("%s:%d: nested \"@ifset gpgone\"", fname, lnr);
+                  else
+                    in_gpgone = ifset_nesting;
+                }
+              continue;
+            }
+          else if (n == 4 && !memcmp (line, "@end", 4)
+                   && (line[4]==' '||line[4]=='\t')
+                   && !strncmp (p, "ifset", 5)
+                   && (p[5]==' '||p[5]=='\t'||!p[5]))
+            {
+              if (in_verbatim && ifset_nesting == in_verbatim)
+                in_verbatim = 0;
+              if (in_gpgone && ifset_nesting == in_gpgone)
+                in_gpgone = 0;
+
+              if (ifset_nesting)
+                ifset_nesting--;
+              else
+                err ("%s:%d: unbalanced \"@end ifset\"", fname, lnr);
+              continue;
+            }
+          else if (n == 8 && !memcmp (line, "@ifclear", 8)
+                   && (line[8]==' '||line[8]=='\t'))
+            {
+              ifclear_nesting++;
+
+              if (!strncmp (p, "gpgone", 6)
+                  && (p[6]==' '||p[6]=='\t'||!p[6]))
+                {
+                  if (not_in_gpgone)
+                    err ("%s:%d: nested \"@ifclear gpgone\"", fname, lnr);
+                  else
+                    not_in_gpgone = ifclear_nesting;
+                }
+
+              else if (!strncmp (p, "isman", 5)
+                       && (p[5]==' '||p[5]=='\t'||!p[5]))
+                {
+                  if (not_in_man)
+                    err ("%s:%d: nested \"@ifclear isman\"", fname, lnr);
+                  else
+                    not_in_man = ifclear_nesting;
+                }
+
+              continue;
+            }
+          else if (n == 4 && !memcmp (line, "@end", 4)
+                   && (line[4]==' '||line[4]=='\t')
+                   && !strncmp (p, "ifclear", 7)
+                   && (p[7]==' '||p[7]=='\t'||!p[7]))
+            {
+              if (not_in_gpgone && ifclear_nesting == not_in_gpgone)
+                not_in_gpgone = 0;
+              if (not_in_man && ifclear_nesting == not_in_man)
+                not_in_man = 0;
+
+              if (ifclear_nesting)
+                ifclear_nesting--;
+              else
+                err ("%s:%d: unbalanced \"@end ifclear\"", fname, lnr);
+              continue;
+            }
+        }
+
+      /* Take action on ifset/ifclear.  */
+      if ( (in_gpgone && !gpgone_defined)
+           || (not_in_gpgone && gpgone_defined)
+           || not_in_man)
+        continue;
+
+      /* Process commands. */
+      if (*line == '@')
+        {
+          if (skip_to_end
+              && n == 4 && !memcmp (line, "@end", 4)
+              && (line[4]==' '||line[4]=='\t'||!line[4]))
+            {
+              skip_to_end = 0;
+            }
+          else if (in_verbatim)
+            {
+                got_line = 1;
+            }
+          else if (n == 6 && !memcmp (line, "@macro", 6))
+            {
+              macroname = xstrdup (p);
+              macrovalue = xmalloc ((macrovaluesize = 1024));
+              macrovalueused = 0;
+            }
+          else if (n == 8 && !memcmp (line, "@manpage", 8))
+            {
+              free (*section_name);
+              *section_name = NULL;
+              finish_page ();
+              start_page (p);
+              in_pause = 0;
+            }
+          else if (n == 8 && !memcmp (line, "@mansect", 8))
+            {
+              if (!thepage.name)
+                err ("%s:%d: section outside of a man page", fname, lnr);
+              else
+                {
+                  free (*section_name);
+                  *section_name = ascii_strupr (xstrdup (p));
+                  in_pause = 0;
+                  skip_sect_line = 1;
+                }
+            }
+          else if (n == 9 && !memcmp (line, "@manpause", 9))
+            {
+              if (!*section_name)
+                err ("%s:%d: pausing outside of a man section", fname, lnr);
+              else if (in_pause)
+                err ("%s:%d: already pausing", fname, lnr);
+              else
+                in_pause = 1;
+            }
+          else if (n == 8 && !memcmp (line, "@mancont", 8))
+            {
+              if (!*section_name)
+                err ("%s:%d: continue outside of a man section", fname, lnr);
+              else if (!in_pause)
+                err ("%s:%d: continue while not pausing", fname, lnr);
+              else
+                in_pause = 0;
+            }
+          else if (n == 5 && !memcmp (line, "@menu", 5)
+                   && (line[5]==' '||line[5]=='\t'||!line[5]))
+            {
+              skip_to_end = 1;
+            }
+          else if (n == 8 && !memcmp (line, "@include", 8)
+                   && (line[8]==' '||line[8]=='\t'||!line[8]))
+            {
+              char *incname = xstrdup (p);
+              FILE *incfp = fopen (incname, "r");
+
+              if (!incfp && opt_include && *opt_include && *p != '/')
+                {
+                  free (incname);
+                  incname = xmalloc (strlen (opt_include) + 1
+                                     + strlen (p) + 1);
+                  strcpy (incname, opt_include);
+                  if ( incname[strlen (incname)-1] != '/' )
+                    strcat (incname, "/");
+                  strcat (incname, p);
+                  incfp = fopen (incname, "r");
+                }
+
+              if (!incfp)
+                err ("can't open include file `%s':%s",
+                     incname, strerror (errno));
+              else
+                {
+                  parse_file (incname, incfp, section_name, in_pause);
+                  fclose (incfp);
+                }
+              free (incname);
+            }
+          else if (n == 4 && !memcmp (line, "@bye", 4)
+                   && (line[4]==' '||line[4]=='\t'||!line[4]))
+            {
+              break;
+            }
+          else if (!skip_to_end)
+            got_line = 1;
+        }
+      else if (!skip_to_end)
+        got_line = 1;
+
+      if (got_line && in_verbatim)
+        add_content (*section_name, line, 1);
+      else if (got_line && thepage.name && *section_name && !in_pause)
+        add_content (*section_name, line, 0);
+
+    }
+  if (ferror (fp))
+    err ("%s:%d: read error: %s", fname, lnr, strerror (errno));
+  free (macroname);
+  free (macrovalue);
+  free (line);
+}
+
+
+static void
+top_parse_file (const char *fname, FILE *fp)
+{
+  char *section_name = NULL;  /* Name of the current section or NULL
+                                 if not in a section.  */
+  while (macrolist)
+    {
+      macro_t m = macrolist->next;
+      free (m->value);
+      free (m);
+      macrolist = m;
+    }
+
+  parse_file (fname, fp, &section_name, 0);
+  free (section_name);
+  finish_page ();
+}
+
+
+int 
+main (int argc, char **argv)
+{
+  int last_argc = -1;
+
+  opt_source = "GNU";
+  opt_release = "";
+
+  if (argc)
+    {
+      argc--; argv++;
+    }
+  while (argc && last_argc != argc )
+    {
+      last_argc = argc;
+      if (!strcmp (*argv, "--"))
+        {
+          argc--; argv++;
+          break;
+        }
+      else if (!strcmp (*argv, "--help"))
+        {
+          puts (
+                "Usage: " PGM " [OPTION] [FILE]\n"
+                "Extract man pages from a Texinfo source.\n\n"
+                "  --source NAME    use NAME as source field\n"
+                "  --release STRING use STRING as the release field\n"
+                "  --store          write output using @manpage name\n"
+                "  --select NAME    only output pages with @manpage NAME\n"
+                "  --verbose        enable extra informational output\n"
+                "  --debug          enable additional debug output\n"
+                "  --help           display this help and exit\n"
+                "  -I DIR           also search in include DIR\n"
+                "  -D gpgone        the only useable define\n\n"
+                "With no FILE, or when FILE is -, read standard input.\n\n"
+                "Report bugs to <bugs@g10code.com>.");
+          exit (0);
+        }
+      else if (!strcmp (*argv, "--version"))
+        {
+          puts (PGM " " VERSION "\n"
+               "Copyright (C) 2005 g10 Code GmbH\n"
+               "This program comes with ABSOLUTELY NO WARRANTY.\n"
+               "This is free software, and you are welcome to redistribute it\n"
+                "under certain conditions. See the file COPYING for details.");
+          exit (0);
+        }
+      else if (!strcmp (*argv, "--verbose"))
+        {
+          verbose = 1;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--quiet"))
+        {
+          quiet = 1;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--debug"))
+        {
+          verbose = debug = 1;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--source"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              opt_source = *argv;
+              argc--; argv++;
+            }
+        }
+      else if (!strcmp (*argv, "--release"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              opt_release = *argv;
+              argc--; argv++;
+            }
+        }
+      else if (!strcmp (*argv, "--store"))
+        {
+          opt_store = 1;
+          argc--; argv++;
+        }
+      else if (!strcmp (*argv, "--select"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              opt_select = strrchr (*argv, '/');
+              if (opt_select)
+                opt_select++;
+              else 
+                opt_select = *argv;
+              argc--; argv++;
+            }
+        }
+      else if (!strcmp (*argv, "-I"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              opt_include = *argv;
+              argc--; argv++;
+            }
+        }
+      else if (!strcmp (*argv, "-D"))
+        {
+          argc--; argv++;
+          if (argc)
+            {
+              if (!strcmp (*argv, "gpgone"))
+                gpgone_defined = 1;
+              argc--; argv++;
+            }
+        }
+    }          
+  if (argc > 1)
+    die ("usage: " PGM " [OPTION] [FILE] (try --help for more information)\n");
+
+  /* Start processing. */
+  if (argc && strcmp (*argv, "-"))
+    {
+      FILE *fp = fopen (*argv, "rb");
+      if (!fp)
+        die ("%s:0: can't open file: %s", *argv, strerror (errno));
+      top_parse_file (*argv, fp);
+      fclose (fp);
+    }
+  else
+    top_parse_file ("-", stdin);
+
+  return !!any_error;
+}
+
+
+/*
+Local Variables:
+compile-command: "gcc -Wall -g -Wall -o yat2m yat2m.c"
+End:
+*/
diff --git a/g10/ChangeLog b/g10/ChangeLog
new file mode 100644 (file)
index 0000000..20d3ec1
--- /dev/null
@@ -0,0 +1,12964 @@
+2006-12-04  Werner Koch  <wk@g10code.com>
+
+       * filter.h (armor_filter_context_t): New field REFCOUNT.
+       * armor.c (new_armor_context, release_armor_context) 
+       (push_armor_filter): New.
+       (armor_filter): Call releae_armor_context for IOBUFCTRL_FREE.
+       * import.c (import): Use the new function here instead of the
+       old hack using the iobuf_push_filter2. 
+       * keyserver.c (keyserver_spawn): Ditto.
+
+2006-12-03  Werner Koch  <wk@g10code.com>
+
+       * keyedit.c (menu_clean): Made strings translatable.
+
+2006-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_clean): Show "already minimized" rather than
+       "already clean" when a minimized key is minimized again.  From
+       Dirk Traulsen.
+
+2006-12-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, gpg.c (main), passphrase.c (passphrase_to_dek): Add
+       --passphrase-repeat option to control how many times gpg will
+       re-prompt for a passphrase to ensure the user has typed it
+       correctly.  Defaults to 1.
+
+2006-11-27  Werner Koch  <wk@g10code.com>
+
+       * openfile.c (ask_outfile_name): Fixed buffer overflow occurring
+       if make_printable_string returns a longer string.  Fixes bug 728.
+
+2006-10-23  Werner Koch  <wk@g10code.com>
+
+       * gpg.c (main): New command --gpgconf-list.
+
+2006-10-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse_symkeyenc): Show the unpacked as well as
+       the packed s2k iteration count.
+
+       * main.h, options.h, gpg.c (encode_s2k_iterations, main),
+       passphrase.c (hash_passphrase): Add --s2k-count option to specify
+       the number of s2k hash iterations.
+
+2006-10-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Write the 16-digit keyid rather
+       than whatever key selector the user used on the command line.
+
+2006-10-02  Werner Koch  <wk@g10code.com>
+
+       * encr-data.c (decrypt_data, mdc_decode_filter): Check the MDC
+       right here and don't let parse-packet handle the MDC.
+
+2006-08-21  Werner Koch  <wk@g10code.com>
+
+       * skclist.c (is_insecure): Also test for uppercase version of the
+       insecure string.
+
+2006-07-31  Werner Koch  <wk@g10code.com>
+
+       * openfile.c (open_outfile) [USE_ONLY_8DOT3]: Search backwards for
+       the dot.  Fixes bug 654.
+
+       * passphrase.c (agent_open): Use log_info instead of log_error to
+       allow a fallback without having gpg return an error code.  Fixes
+       bug #655.
+
+       * encode.c (encode_crypt_files): Invalidate the whole fd cache.
+       This is a workaround for problems in iobuf's stupid fd cache.
+       * decrypt.c (decrypt_messages): Ditto.
+       * verify.c (verify_files): Ditto.
+
+2006-07-26  Werner Koch  <wk@g10code.com>
+
+       * keygen.c (gen_card_key_with_backup): Initialize sk_{un}protected.
+
+       * import.c (import): Initialize KEYBLOCK.
+
+       * pkclist.c (edit_ownertrust): Intialize trust to avoid gcc
+       warning.
+
+       * parse-packet.c (parse_comment): Cap comments at 65k.
+       (parse_gpg_control): Skip too large control packets.
+
+2006-06-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, pkclist.c (select_algo_from_prefs, algo_available):
+       Pass a union for preference hints rather than doing void * games.
+
+       * sign.c (sign_file): Use it here.
+
+       * sign.c (sign_file): When signing with multiple DSA keys, one
+       being DSA1 and one being DSA2 and encrypting at the same time, if
+       the recipient preferences give a hash that can work with the DSA2
+       key, then allow the DSA1 key to be promoted rather than giving up
+       and using hash_for().
+
+       * pkclist.c (algo_available): Automatically enable DSA2 mode when
+       handling a key that clearly isn't DSA1 (i.e. q!=160).
+
+2006-06-28  Werner Koch  <wk@g10code.com>
+
+       * import.c (check_prefs_warning): Fix change for better
+       translatability.
+
+       * app-openpgp.c (do_writekey): Fixed computation of memmove
+       length.  This led to garbled keys if E was larger than one byte.
+       Thanks to Achim Pietig for hinting at the garbled E.
+
+2006-06-27  Werner Koch  <wk@g10code.com>
+
+       * gpg.c (reopen_std) [HAVE_W32_SYSTEM]: Do not use it.
+
+2006-06-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, gpg.c (main), keygen.c (keygen_upd_std_prefs,
+       keygen_add_std_prefs, proc_parameter_file): Add
+       --default-keyserver-url to specify a keyserver URL at key
+       generation time, and "Keyserver:" keyword for doing the same
+       through a batch file.
+
+       * sign.c (do_sign): Accept a truncated hash even for DSA1 keys (be
+       liberal in what you accept, etc).
+
+2006-06-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_one): Add a flag (from_sk) so we don't check
+       prefs on an autoconverted public key.  The check should only
+       happen on the sk side.  Noted by Dirk Traulsen.
+
+2006-06-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (gen_card_key): Add optional argument to return a
+       pointer (not a copy) of the stub secret key for the secret key we
+       just generated on the card.
+       (generate_card_subkeypair): Use it here so that the signing key on
+       the card can use the card to generate the 0x19 backsig on the
+       primary key.  Noted by Janko Heilgeist and Jonas Oberg.
+
+       * parse-packet.c (parse_user_id): Cap the user ID size at 2048
+       bytes.  This prevents a memory allocation attack with a very large
+       user ID.  A very large packet length could even cause the
+       allocation (a u32) to wrap around to a small number.  Noted by
+       Evgeny Legerov on full-disclosure.
+
+2006-05-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (gen_dsa): Allow generating DSA2 keys
+       (allow specifying sizes > 1024 when --enable-dsa2 is set).  The
+       size of q is set automatically based on the key size.
+       (ask_keysize, generate_keypair): Ask for DSA size when
+       --enable-dsa2 is set.
+
+2006-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.c (make_tempdir): Fix bug with a temporary directory on
+       Win32 that is over 256 bytes long.  Noted by Israel G. Lugo.
+
+2006-05-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.c (reopen_std): New function to reopen fd 0, 1, or 2 if we
+       are called with them closed.  This is to protect our
+       keyring/trustdb files from corruption if they get attached to one
+       of the standard fds.  Print a warning if possible that this has
+       happened, and fail completely if we cannot reopen (should never
+       happen).
+       (main): Call it here.
+
+2006-05-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (dump_sig_subpkt, parse_signature),
+       build-packet.c (build_sig_subpkt_from_sig), getkey.c
+       (fixup_uidnode, merge_selfsigs_main, merge_selfsigs_subkey),
+       keygen.c (keygen_add_key_expire): Fix meaning of key expiration
+       and sig expiration subpackets - zero means "never expire"
+       according to 2440, not "expire instantly".
+
+       * getkey.c (get_pubkey_byname), import.c (import_one): Fix key
+       selection problem when auto-key-locate returns a list of keys, not
+       all of which are usable (revoked, expired, etc).  Noted by Simon
+       Josefsson.
+
+2006-04-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (direct_uri_map): New.
+       (keyserver_spawn): Used here to add "_uri" to certain gpgkeys_xxx
+       helpers when the meaning is different if a path is provided
+       (i.e. ldap).
+       (keyserver_import_cert): Show warning if there is a CERT
+       fingerprint, but no --keyserver set.
+
+2006-04-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c: Fix build problem with platforms that stick libcurl
+       in a place not in the regular include search path.
+
+2006-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, gpg.c (main): Add --enable-dsa2 and --disable-dsa2.
+       Defaults to disable.
+
+       * pkclist.c (algo_available): If --enable-dsa2 is set, we're
+       allowed to truncate hashes to fit DSA keys.
+
+       * sign.c (match_dsa_hash): New.  Return the best match hash for a
+       given q size.
+       (do_sign, hash_for, sign_file): When signing with a DSA key, if it
+       has q==160, assume it is an old DSA key and don't allow truncation
+       unless --enable-dsa2 is also set.  q!=160 always allows truncation
+       since they must be DSA2 keys.
+       (make_keysig_packet): If the user doesn't specify a
+       --cert-digest-algo, use match_dsa_hash to pick the best hash for
+       key signatures.
+
+2006-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.c (print_mds), armor.c (armor_filter, parse_hash_header):
+       Add SHA-224.
+
+       * sign.c (write_plaintext_packet), encode.c (encode_simple):
+       Factor common literal packet setup code from here, to...
+
+       * main.h, plaintext.c (setup_plaintext_name): Here. New. Make sure
+       the literal packet filename field is UTF-8 encoded.
+
+       * options.h, gpg.c (main): Make sure --set-filename is UTF-8
+       encoded and note when filenames are already UTF-8.
+
+2006-04-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_backsign): Give some more verbose errors when we
+       have no need to backsign.
+
+2006-04-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel, photoid.c (get_default_photo_command): Find an
+       image viewer at runtime.  Seems FC5 doesn't have xloadimage.
+
+2006-04-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (parse_auto_key_locate): Fix dupe-removal code.
+
+       * keyedit.c (menu_backsign): Allow backsigning even if the secret
+       subkey doesn't have a binding signature.
+
+       * armor.c (radix64_read): Don't report EOF when reading only a pad
+       (=) character.  The EOF actually starts after the pad.
+
+       * gpg.c (main): Make --export, --send-keys, --recv-keys,
+       --refresh-keys, and --fetch-keys follow their arguments from left
+       to right.  Suggested by Peter Palfrader.
+
+2006-04-08  Werner Koch  <wk@g10code.com>
+
+       * mainproc.c (list_node): Print ring trust value only if not empty
+       and --with-colons has been given.
+
+2006-04-05  Werner Koch  <wk@g10code.com>
+
+       * getkey.c (user_id_not_found_utf8): New.
+       (get_primary_uid, get_user_id): Use it.  Fixes Debian bug #205028
+       in the right way.
+
+2006-04-03  Werner Koch  <wk@g10code.com>
+
+       * import.c (check_prefs_warning): Merged strings for better
+       translation.
+
+       * gpg.c (main) [__GLIBC__]: Default to libpcsclite.so.1.
+
+       * status.h, status.c (STATUS_BEGIN_SIGNING): New.  Suggested by
+       Daiki Ueno.
+       * textfilter.c (copy_clearsig_text): Issue new status code.
+       * sign.c (sign_file, sign_symencrypt_file): Ditto.
+
+2006-03-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (get_pubkey_byname): Fix missing auto_key_retrieve
+       unlock.  Fix strings to not start with a capital letter as per
+       convention.
+
+2006-03-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, seskey.c (encode_md_value): Modify to allow a q size
+       greater than 160 bits as per DSA2.  This will allow us to verify
+       and issue DSA2 signatures for some backwards compatibility once we
+       start generating DSA2 keys.     
+       * sign.c (do_sign), sig-check.c (do_check): Change all callers.
+
+       * sign.c (do_sign): Enforce the 160-bit check for new signatures
+       here since encode_md_value can handle non-160-bit digests now.
+       This will need to come out once the standard for DSA2 is firmed
+       up.
+
+2006-03-28  Werner Koch  <wk@g10code.com>
+
+       * openfile.c (overwrite_filep): Fix small cpr issue.  Noted by
+       Daiki Ueno.
+
+2006-03-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (parse_auto_key_locate): Silently strip out duplicates
+       rather than causing an error.
+
+2006-03-22  Werner Koch  <wk@g10code.com>
+
+       * sig-check.c (signature_check2): Changed warning URL to include faq.
+       * misc.c (idea_cipher_warn): Ditto.
+
+2006-03-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (get_pka_address): Fix bug introduced as part of
+       sig_to_notation conversion.  Noted by Peter Palfradrer.
+
+2006-03-21  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (agent_scd_pksign): Allow the use of ripemd-160 along
+       with scdaemon.
+
+2006-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_import_cert): Handle the IPGP CERT type
+       for both the fingerprint alone, and fingerprint+URL cases.
+
+       * getkey.c (get_pubkey_byname): Minor cleanup.
+
+2006-03-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver-internal.h, keyserver.c (keyserver_import_pka): Use
+       the same API as the other auto-key-locate fetchers.
+
+       * getkey.c (get_pubkey_byname): Use the fingerprint of the key
+       that we actually fetched.  This helps prevent problems where the
+       key that we fetched doesn't have the same name that we used to
+       fetch it.  In the case of CERT and PKA, this is an actual security
+       requirement as the URL might point to a key put in by an attacker.
+       By forcing the use of the fingerprint, we won't use the attacker's
+       key here.
+
+       * keyserver-internal.h, keyserver.c (keyserver_spawn,
+       keyserver_work, keyserver_import_cert, keyserver_import_name,
+       keyserver_import_ldap): Pass fingerprint info through.
+
+       * main.h, import.c (import_one): Optionally return the fingerprint
+       of the key being imported.
+       (import_keys_internal, import_keys_stream, import): Change all
+       callers.
+
+2006-03-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (signature_check2): Print the backsig warning when
+       there is no backsig present.  Give a URL for more information.
+
+       * keyedit.c (menu_backsign): Small tweak to work properly with
+       keys originally generated with older GnuPGs that included comments
+       in the secret keys.
+
+2006-03-10  Werner Koch  <wk@g10code.com>
+
+       * card-util.c (get_manufacturer): Added Vendor 3
+
+2006-03-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (string_to_notation): Add ability to indicate a
+       notation to be deleted with a '-' prefix.
+
+       * keyedit.c (menu_set_notation): Use it here to allow deleting a
+       notation marked with '-'.  This works with either "-notation" or
+       "-notation=value".
+
+2006-03-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_set_notation): New function to set notations on
+       self-signatures.
+       (keyedit_menu): Call it here.
+       (tty_print_notations): Helper.
+       (show_prefs): Show notations in "showpref".
+
+       * mainproc.c (get_pka_address)
+       * keylist.c (show_notation): Remove
+       duplicate code by using notation functions.
+
+       * packet.h, build-packet.c (sig_to_notation)
+       * keygen.c (keygen_add_notations): Provide printable text for
+       non-human-readable notation values.
+       
+       * packet.h, build-packet.c (sig_to_notation)
+       * keygen.c (keygen_add_notations): Tweak to handle non-human-readable
+       notation values.
+
+       * options.h, sign.c (mk_notation_policy_etc)
+       * gpg.c (add_notation_data): Use it here for the various notation
+       commands.
+
+       * packet.h, main.h, keygen.c (keygen_add_notations)
+       * build-packet.c (string_to_notation, sig_to_notation)
+       (free_notation): New "one stop shopping" functions to handle
+       notations and start removing some code duplication.
+
+2006-03-08  Werner Koch  <wk@g10code.com>
+
+       * mainproc.c (do_check_sig): Use log_error for standalone revocations.
+
+2006-03-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, mainproc.c (check_sig_and_print), gpg.c (main):
+       pka-lookups, not pka-lookup.
+
+       * options.h, gpg.c (main), keyedit.c [cmds], sig-check.c
+       (signature_check2): Rename "backsign" to "cross-certify" as a more
+       accurate name.
+
+       * options.h, gpg.c (main, parse_trust_model), pkclist.c
+       (check_signatures_trust), mainproc.c (check_sig_and_print,
+       pka_uri_from_sig), trustdb.c (init_trustdb): Some tweaks to PKA so
+       that it is a verify-option now.
+
+2006-03-07  Werner Koch  <wk@g10code.com>
+
+       * mainproc.c (proc_signature_packets): Return any_sig_seen to caller.
+       (check_sig_and_print): Option to partly allow the old behaviour.
+       * gpg.c: New option --allow-multisig-verification.
+
+2006-03-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (make_keysig_packet): Don't use MD5 for a RSA_S key as
+       that is not a PGP 2.x algorithm.
+
+       * mainproc.c (proc_compressed): "Uncompressed" is not a valid
+       compression algorithm.
+
+2006-03-06  Werner Koch  <wk@g10code.com>
+
+       * mainproc.c (check_sig_and_print): Made the composition test more
+       tight.  This is due to another bug report by Tavis Ormandy.
+       (add_onepass_sig): Simplified.
+
+2006-03-05  Werner Koch  <wk@g10code.com>
+
+       * plaintext.c (handle_plaintext): Replace assert by explict error
+       conflict message.  Reported by Tavis Ormandy.
+
+2006-03-02  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (check_card_serialno): Don't ask in batch mode.
+
+2006-03-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (parse_auto_key_locate): Error if the user selects
+       "cert" or "pka" when those features are disabled.
+
+       * misc.c (has_invalid_email_chars): Fix some C syntax that broke
+       the compilers on SGI IRIX MIPS and Compaq/DEC OSF/1 Alpha.  Noted
+       by Nelson H. F. Beebe.
+
+2006-02-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Document auto-key-locate and give a pointer to
+       Simon Josefsson's page for CERT.
+
+2006-02-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, getkey.c (release_akl), gpg.c (main): Add
+       --no-auto-key-locate.
+
+       * options.h, gpg.c (main): Keep track of each keyserver registered
+       so we can match on them later.
+
+       * keyserver-internal.h, keyserver.c (cmp_keyserver_spec,
+       keyserver_match), gpgv.c: New.  Find a keyserver that matches ours
+       and return its spec.
+
+       * getkey.c (get_pubkey_byname): Use it here to get the
+       per-keyserver options from an earlier keyserver.
+
+2006-02-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_options): Only change max_cert if
+       it is used.
+
+       * options.c, gpg.c (main), keyserver.c (keyserver_spawn): No
+       special treatment of include-revoked, include-subkeys, and
+       try-dns-srv.  These are keyserver features, and GPG shouldn't get
+       involved here.
+
+       * keyserver.c (parse_keyserver_uri, add_canonical_option): Always
+       append options to the list, as ordering may be significant to the
+       user.
+
+       * gpg.c (add_notation_data): Fix reversed logic for isascii check
+       when adding notations.  Noted by Christian Biere.
+
+       * options.h, keyserver.c (add_canonical_option): New.
+       (parse_keyserver_options): Moved from here.
+       (parse_keyserver_uri): Use it here so each keyserver can have some
+       private options in addition to the main keyserver-options
+       (e.g. per-keyserver auth).
+
+2006-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keyserver-internal.h, keyserver.c
+       (keyserver_import_name), getkey.c (free_akl,
+       parse_auto_key_locate, get_pubkey_byname): The obvious next step:
+       allow arbitrary keyservers in the auto-key-locate list.
+
+       * options.h, keyserver.c (parse_keyserver_options): Remove
+       auto-cert-retrieve as it is no longer meaningful.  Add
+       max-cert-size to allow users to pick a max key size retrieved via
+       CERT.
+
+       * options.h, gpg.c (main), mainproc.c (check_sig_and_print),
+       keyserver.c (keyserver_opts): Rename auto-pka-retrieve to
+       honor-pka-record to be consistent with honor-keyserver-url.
+
+       * options.h, keydb.h, g10.c (main), getkey.c
+       (parse_auto_key_locate): Parse a list of key access methods.
+       (get_pubkey_byname): Walk the list here to try and retrieve keys
+       we don't have locally.
+
+2006-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (get_pubkey_byname): Fix minor security problem with
+       PKA when importing at -r time.  The URL in the PKA record may
+       point to a key put in by an attacker.  Fix is to use the
+       fingerprint from the PKA record as the recipient.  This ensures
+       that the PKA record is followed.
+
+       * keyserver-internal.h, keyserver.c (keyserver_import_pka): Return
+       the fingerprint we requested.
+
+       * gpgv.c: Stub keyserver_import_ldap.
+
+       * keyserver-internal.h, keyserver.c (keyserver_import_ldap):
+       Import using the PGP Universal trick of asking
+       ldap://keys.(maildomain) for the key.
+
+2006-02-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_uri): Include the scheme in the uri
+       even when we've assumed "hkp" when there was no scheme.
+
+2006-02-20  Werner Koch  <wk@g10code.com>
+
+       * apdu.c (open_pcsc_reader): As a precaution set LIST to NULL
+       after free.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * verify.c (verify_signatures): Print warning also for NO_DATA.
+
+       * mainproc.c (struct mainproc_context): New field any_sig_seen.
+       (add_signature): Set it.
+       (proc_signature_packets): Test and return NO_DATA.
+
+2006-02-09  Werner Koch  <wk@g10code.com>
+
+       * gpg.c (main) <oLockNever>: Disable random locking.
+
+2006-02-06  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c, ccid-driver.h: Updated from GnuPG 1.9.  Changes:
+       * ccid-driver.h (CCID_DRIVER_ERR_NO_KEYPAD): New.
+       * ccid-driver.c (send_escape_cmd): New args RESULT, RESULTLEN and
+       RESULTMAX.  Changed all callers.
+       (ccid_transceive_escape): New.
+       * ccid-driver.c (special_transport): New
+       (ccid_open_reader, do_close_reader, ccid_shutdown_reader)
+       (bulk_out, bulk_in): Add support for CardMan 4040 reader.
+       * ccid-driver.c (scan_or_find_devices): Factored most code out to
+       (scan_or_find_usb_device): .. new.
+       (make_reader_id): Fixed vendor mask.
+
+2006-01-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_uri): If there is a path present,
+       set the direct_uri flag so the right keyserver helper is run.
+
+2006-01-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Include the EXEEXT so we can find
+       keyserver helpers on systems that use extensions.
+
+       * misc.c (path_access) [HAVE_DRIVE_LETTERS]: Do the right thing
+       with drive letter systems.
+
+2006-01-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, passphrase.c (next_to_last_passphrase): New.  "Touch" a
+       passphrase as if it was used (move from next_pw to last_pw).
+
+       * pubkey-enc.c (get_session_key): Use it here to handle the case
+       where a passphrase happens to be correct for a secret key, but yet
+       that key isn't the anonymous recipient (i.e. the secret key could
+       be decrypted, but not the session key).  This also handles the
+       case where a secret key is located on a card and a secret key with
+       no passphrase.  Note this does not fix bug 594 (anonymous
+       recipients on smartcard do not work) - it just prevents the
+       anonymous search from stopping when the card is encountered.
+
+2006-01-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_refresh): Fix problem when more than one
+       key in a refresh batch has a preferred keyserver set.  Noted by
+       Nicolas Rachinsky.
+
+2006-01-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (check_sig_and_print), keyserver.c
+       (keyserver_import_pka), card-util.c (fetch_url): Always require a
+       scheme:// for keyserver URLs except when used as part of the
+       --keyserver command for backwards compatibility.
+
+       * sign.c (write_signature_packets): Lost a digest_algo line.
+
+       * sign.c (hash_for): Add code to detect if the sk lives on a smart
+       card.  If it does, only allow 160-bit hashes, a la DSA.  This
+       involves passing the *sk in, so change all callers.  This is
+       correct for today, given the current 160-bit q in DSA, and the
+       current SHA-1/RIPEMD160 support in the openpgp card.  It will
+       almost certainly need changing down the road.
+
+       * app-openpgp.c (do_sign): Give user error if hash algorithm is
+       not supported by the card.
+
+2005-12-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_import_pka): New.  Moved from
+       getkey.c:get_pubkey_byname which was getting crowded.
+
+       * keyserver.c (keyserver_import_cert): Import a key found in DNS
+       via CERT records.  Can handle both the PGP (actual key) and IPGP
+       (URL) CERT types.
+
+       * getkey.c (get_pubkey_byname): Call them both here.
+
+       * options.h, keyserver.c (parse_keyserver_options): Add
+       "auto-cert-retrieve" option with optional max size argument.
+
+       * gpgv.c: Stubs.
+
+       * keyserver-internal.h, keyserver.c (keyserver_spawn,
+       keyserver_work, keygerver_getname): New keyserver_getname function
+       to fetch keys by name.
+
+       * getkey.c (get_pubkey_byname): Call it here to enable locating
+       keys by full mailbox from a keyserver a la PKA.  Try PKA first,
+       though, as it is likely to be faster.
+
+2005-12-20  Werner Koch  <wk@g10code.com>
+
+       * gpg.c: New option --allow-pka-lookup.
+       (parse_trust_model): Add "+pka" variants.
+       (main): Make KEYSERVER_AUTO_PKA_RETRIEVE teh default.
+       * options.h (opt): New fields PKA_TRUST_INCREASE and
+       ALLOW_PKA_LOOKUP.
+       * status.h (STATUS_PKA_TRUST_BAD, STATUS_PKA_TRUST_GOOD): New.
+       * pkclist.c (check_signatures_trust): Increase trust due to valid
+       PKA only if that new option has been set.  Issue new status lines.
+       * trustdb.c (init_trustdb): Print info if this option is active.
+       * getkey.c (get_pubkey_byname): Honor allow-pka-lookup.
+       * mainproc.c (pka_uri_from_sig): Ditto.
+       
+       * trustdb.c (validate_keys): Print no "ultimately trusted keys
+       found" only in non-quiet mode.
+
+2005-12-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (merge_selfsigs_main): All primary keys can certify.
+
+2005-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.c (main): Restore convert-sk-to-pk as programs rely on it.
+
+       * keyid.c (usagestr_from_pk): Remove special PUBKEY_USAGE_CERT
+       flag.  It's no longer needed.
+
+2005-12-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg.c (main): Don't default to import-options convert-sk-to-pk.
+       It causes confusing warning messages when importing a PGP-exported
+       key that contains a secret key without selfsigs followed by the
+       public key.
+
+2005-12-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_fetch): Switch on fast-import before we
+       --fetch-keys so we don't rebuild the trustdb after each fetch.
+
+2005-12-08  Werner Koch  <wk@g10code.com>
+
+       * gpg.c (main): Check for DBCS lead byte when converting the
+       homedir.  By Kazuyoshi Kakihara. Fixes PR561.
+
+       * keyserver.c (keyserver_fetch): Made strings translatable.
+
+2005-12-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keyserver.c (curl_cant_handle, keyserver_spawn)
+       (keyserver_fetch): Set a flag to indicate that we're doing a direct
+       URI fetch so we can differentiate between a keyserver operation
+       and a URI fetch for protocols like LDAP that can do either.
+
+2005-12-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Don't print "searching for key
+       00000000" when fetching a URI.
+
+       * keyserver-internal.h, keyserver.c (keyserver_fetch): New.  Fetch
+       an arbitrary URI using the keyserver helpers.
+
+       * gpg.c (main): Call it from here for --fetch-keys.
+
+2005-12-07  Werner Koch  <wk@g10code.com>
+
+       * pkclist.c (do_we_trust): Add NOTREACHED comment.
+
+2005-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keylist.c (print_revokers): New.  Print the "rvk"
+       designated revoker record.  Moved from
+       keyedit.c:show_key_with_all_names_colon.
+
+       * keylist.c (list_keyblock_colon): Use it here ...
+
+       * keyedit.c (show_key_with_all_names_colon): ... and here.
+
+2005-11-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * free-packet.c (copy_secret_key): Copy secret key into secure
+       memory since we may unprotect it.
+
+       * main.h, g10.c (main), revoke.c (gen_desig_revoke): Add local
+       user support so users can use -u with --desig-revoke.  This
+       bypasses the interactive walk over the revocation keys.
+
+2005-11-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu, menu_clean): Simplify clean options to
+       just "clean", and add "minimize".
+
+       * import.c (parse_import_options): Make help text match the export
+       versions of the options.
+
+       * options.h, export.c (parse_export_options, do_export_stream):
+       Reduce clean options to two: clean and minimize.
+
+       * trustdb.h, trustdb.c (clean_one_uid): New function that joins
+       uid and sig cleaning into one for a simple API outside trustdb.
+
+2005-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c (parse_header_line): A fussy bit of 2440: header lines
+       are delimited with a colon-space pair.  Therefore a line such as
+       "Comment: " (with a trailing space) is actually legal, albeit not
+       particularly useful.
+
+2005-11-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (clean_key): New function to handle key
+       cleaning from one convenient place.
+
+       * options.h, import.c (parse_import_options,
+       clean_sigs_from_all_uids, import_one): Reduce clean options to
+       two: clean and minimize.
+
+       * parse-packet.c (setup_user_id): Remove.
+       (parse_user_id, parse_attribute): Just use xmalloc_clear instead.
+
+       * trustdb.c (clean_uid_from_key, clean_uids_from_key):
+       Significantly simpler implementation.
+
+2005-11-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu, menu_clean_sigs_from_uids): Add
+       "minimize" command.
+
+       * packet.h, keyedit.c (menu_clean_uids_from_key), trustdb.c
+       (clean_uids_from_key): Fix display bug where sigs cleaned for
+       other reasons caused a uid to appear as if it had been compacted.
+
+       * packet.h: Move some flags to a bitfield.  Change all callers.
+
+       * options.h, import.c (parse_import_options,
+       clean_sigs_from_all_uids, import_one): Add import-minimal option.
+       Similar to export-minimal, except it works on the way in.
+
+       * trustdb.h, trustdb.c (clean_sigs_from_uid): Add flag to remove
+       all non-selfsigs from key during cleaning.  Change all callers.
+
+       * export.c (do_export_stream): Use it here for export-minimal so
+       we don't need additional minimize code in the export path.
+
+2005-11-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Add a section for --encrypt-to.  This is Debian
+       bug 336211 by Javier Fernández-Sanguino Peña.
+
+2005-11-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Include @LIBUSB_CPPFLAGS@ in our CPPFLAGS.
+       Strictly speaking this should be only in gpg_CPPFLAGS, but then we
+       have to compile everything twice for gpg and gpgv.
+
+       * apdu.c (open_pcsc_reader): Fix double free.
+
+       * gpg.c (main) [__APPLE__]: Default the PCSC driver to the OS X
+       location.  Suggested by Patty A. Hardy.
+
+2005-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (clean_sigs_from_uid): Include sigs from unavailable
+       keys in the sigs that are cleaned.  Suggested by Dirk Traulsen and
+       many others.
+
+2005-11-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_one): Do collapse_uids() before we do any
+       cleaning so keyserver mangled keys with doubled user IDs can be
+       properly cleaned - possibly sigs on the different user IDs cancel
+       each other out.
+
+       * import.c (parse_import_options), export.c
+       (parse_export_options): List "xxx-clean" before the longer options
+       so we don't end up with a partial match on the longer options.
+
+       * trustdb.c (clean_uids_from_key): Return proper number of cleaned
+       user IDs.  Don't count user IDs as cleaned unless we actually
+       delete something.
+
+2005-10-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_addrevoker), getkey.c (finish_lookup): Fix
+       problem with adding a cert-only designated revoker.  Code was
+       looking for a key with sign ability, and not cert ability.  Noted
+       by Timo Schulz.
+
+2005-10-27  Werner Koch  <wk@g10code.com>
+
+       * gpg.c [__CYGWIN__]: Set default driver to winscard.dll.
+
+       * apdu.c, apdu.h: Updated from gnupg 1.9.  Changes are:
+       * apdu.c [__CYGWIN__]: Make cygwin environment similar to _WIN32.
+       Suggested by John P. Clizbe.
+       * apdu.h (SW_HOST_NO_KEYPAD): New.
+       * apdu.c (host_sw_string): Support new code. 
+       (reader_table_s): New field CHECK_KEYPAD.
+       (new_reader_slot, open_ct_reader, open_pcsc_reader) 
+       (open_ccid_reader, open_rapdu_reader): Initialize it.
+       (check_ccid_keypad): New.
+       (apdu_check_keypad): New.
+       (apdu_send_le): Factored all code out to ...
+       (send_le): .. new.  Takes an additional arg; changed all callers
+       of the orginal function to use this one with a NULL for the new
+       arg.
+       (apdu_send_simple_kp): New.
+       (ct_send_apdu, pcsc_send_apdu, my_rapdu_send_apdu) 
+       (send_apdu_ccid): New arg PININFO.
+       (send_apdu_ccid): Use the new arg.
+
+2005-10-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (proc_parameter_file): Default key and subkey usage
+       flags to algo capabilities if parameter file doesn't specify them.
+       Noted by Timo Schulz.
+
+2005-10-18  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (pin_cb): Fixed prompt for repeated PIN.  Return
+       G10ERR_CANCELED and not just -1.
+       (status_sc_op_failure): New.  Use it where we issue that status.
+       (pin_cb): Append serial number to the need-pin status message.
+       (agent_scd_change_pin): Add arg SERIALNO.  Changed all callers.
+       (agent_scd_writekey): Ditto.
+       (agent_scd_setattr): Ditto.
+       (agent_scd_genkey): Ditto.
+       (agent_scd_checkpin): Pass serialno to the pin_cb.
+
+       * keygen.c (parse_expire_string): Allow setting the expire
+       interval using a "seconds=<n>" syntax.  This is useful for
+       debugging.
+
+2005-10-17  Werner Koch  <wk@g10code.com>
+
+       * export.c (do_export_stream): Factored some code out to ...
+       (skip_subkey_p): .. new.
+       (subkey_in_list_p, release_subkey_list): New.
+       (new_subkey_list_item): New. 
+       (do_export_stream): Export exactly specified subkeys into one
+       keyblock.
+
+2005-10-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu, menu_backsign): New "backsign" command
+       to add 0x19 backsigs to old keys that don't have them.
+
+       * misc.c (parse_options): Fix build warning.
+
+       * main.h, keygen.c (make_backsig): Make public.
+
+2005-10-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, getkey.c (merge_selfsigs_subkey), gpg.c (main),
+       sig-check.c (signature_check2): Add --require-backsigs and
+       --no-require-backsigs.  Currently defaults to
+       --no-require-backsigs.
+
+2005-10-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (merge_selfsigs_subkey), sig-check.c
+       (signature_check2), keygen.c (make_backsig): Did some backsig
+       interop testing with the PGP folks.  All is well, so I'm turning
+       generation of backsigs on for new keys.  Checking for backsigs on
+       verification is still off.
+
+2005-10-05  Werner Koch  <wk@g10code.com>
+
+       * g10.c: Renamed to ..
+       * gpg.c: ..this.
+       * Makefile.am: Adjusted accordingly.
+
+2005-09-22  Werner Koch  <wk@g10code.com>
+
+       * sign.c (write_plaintext_packet): Don't print an empty file
+       warning if the file is actually too large.
+       * encode.c (encode_simple,encode_crypt): Ditto.
+       * progress.c (handle_progress): Adjusted for iobuf_get_filelength
+       change.
+       * photoid.c (generate_photo_id): Ditto.
+
+2005-09-20  Werner Koch  <wk@g10code.com>
+
+       * mainproc.c (proc_symkey_enc): Take care of a canceled passphrase
+       prompt.
+
+2005-09-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (reorder_keyblock, do_reorder_keyblock): Reorder
+       attribute IDs as well as regular text IDs.
+
+       * plaintext.c (ask_for_detached_datafile): Use make_filename() on
+       filename so tilde expansion works.
+
+2005-09-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, misc.c (parse_options): Add the ability to have help
+       strings in xxx-options commands.
+
+       * keyserver.c (keyserver_opts), import.c (parse_import_options),
+       export.c (parse_export_options), g10.c (parse_list_options, main):
+       Add help strings to xxx-options.
+
+2005-09-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_names): Moved name display code out from
+       show_key_with_all_names.
+       (keyedit_menu): Call it here for pref and showpref so they can
+       show only the selected user ID.  Suggested by Timo Schulz.
+
+2005-09-07  Werner Koch  <wk@g10code.com>
+
+       * cardglue.h (GPG_ERR_TOO_LARGE): New.
+
+       * apdu.c, apdu.h, iso7816.c, iso7816.h
+       * ccid-driver.c, ccid-driver.h: Updated from GnuPG 1.9 source.
+       Changes are:
+       * iso7816.c (iso7816_select_path): New.
+       * iso7816.c (iso7816_read_binary): Use Le=0 when reading all
+       data.  Handle 6C00 error and take 6B00 as indication for EOF.
+       * apdu.h (SW_EXACT_LENGTH_P): New.
+       * apdu.c (new_reader_slot, reset_pcsc_reader, pcsc_get_status) 
+       (open_pcsc_reader): Set new reader state IS_T0.
+       (apdu_send_le): When doing T=0 make sure not to send Lc and Le.
+       Problem reported by Carl Meijer.
+       (apdu_send_direct): Initialize RESULTLEN.
+
+       * misc.c (parse_options): Allow meta option "help" to list all
+       options and to exit the program.
+
+2005-09-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (enum_sig_subpkt, parse_signature,
+       parse_attribute_subpkts): Make a number of warnings verbose items.
+       These fire on many slightly mangled keys in the field, so the
+       warning is becoming burdensome.
+
+2005-09-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.h, photoid.c (generate_photo_id): Allow passing in a
+       suggested filename.
+
+       * keyedit.c (keyedit_menu, menu_adduid): Call it here so "addphoto
+       filename" works.
+
+2005-08-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.c (generate_photo_id): Enable readline completion and
+       tilde expansion for the JPEG prompt.
+
+2005-08-30  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_open): Print a warning and not an error in
+       case of a missing agent.  Should fix Debian bug #325578.
+
+2005-08-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (openpgp_pk_algo_usage): Default to allowing CERT for
+       signing algorithms.
+
+       * keyedit.c (sign_uids): Don't request a signing key to make a
+       certification.
+
+       * keygen.c (do_add_key_flags): Force the certify flag on for all
+       primary keys, as the spec requires primary keys must be able to
+       certify (if nothing else, which key is going to issue the user ID
+       signature?)
+       (print_key_flags): Show certify flag.
+       (ask_key_flags, ask_algo): Don't allow setting the C flag for
+       subkeys.
+       
+       * keyid.c (usagestr_from_pk), getkey.c (parse_key_usage):
+       Distinguish between a sign/certify key and a certify-only key.
+
+       * keyedit.c (ask_revoke_sig): Add a revsig --with-colons mode.
+       Suggested by Michael Schierl.
+
+2005-08-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: No need to link with curl any longer.
+
+       * main.h, misc.c (path_access): New.  Same as access() but does a
+       PATH search like execlp.
+
+       * keyserver.c (curl_can_handle): Removed.  Replaced by...
+       (curl_cant_handle): We are now relying on curl as the handler of
+       last resort.  This is necessary because PGP LDAP and curl LDAP are
+       apples and oranges.
+       (keyserver_typemap): Only test for ldap and ldaps.
+       (keyserver_spawn): If a given handler is unusable (as determined
+       by path_access()) then try gpgkeys_curl.
+
+       * exec.h, exec.c (make_tempdir, expand_args, exec_write,
+       exec_read): Minor cleanup to use bitfield flags instead of a bunch
+       of integers.
+
+2005-08-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add aliases sign-with->local-user and
+       user->recipient to make switching from PGP command line to GPG
+       easier.
+
+2005-08-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Remove the surfnet LDAP keyserver from the list of
+       samples since it is being shut down.
+
+       * getkey.c (classify_user_id): Disable the '.' and '+' search
+       modes since they aren't supported yet.
+
+2005-08-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main), passphrase.c (set_passphrase_from_string): New
+       --passphrase command line option.  Only useful in very special
+       circumstances.
+
+2005-08-05  Werner Koch  <wk@g10code.com>
+
+       * gpgv.c (keyserver_import_fprint): New stub.
+
+       * keygen.c (ask_user_id): Moved email checking code out to ..
+       * misc.c (is_valid_mailbox): .. new.
+       * mainproc.c (get_pka_address): Use it here.
+       * getkey.c (get_pubkey_byname): Add falback to auto-retrieve a key
+       via the PKA mechanism.
+
+       * options.h (KEYSERVER_AUTO_PKA_RETRIEVE): New.
+       * keyserver.c (keyserver_opts): Ditto.
+       * mainproc.c (check_sig_and_print): Use it here to retrieve keys
+       from a PKA DNS record.
+
+       * pkclist.c (build_pk_list): Add comments to this function;
+       re-indented it.
+
+2005-08-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (proc_parameter_file): Sanity check items in keygen
+       batch file.  Noted by Michael Schierl.
+
+       * pkclist.c (do_edit_ownertrust): Don't allow ownertrust level 0.
+       Noted by Michael Schierl.
+
+       * keygen.c (write_keyblock): Don't try and build deleted kbnodes
+       since we start our tree with one.
+
+2005-08-04  Werner Koch  <wk@g10code.com>
+
+       * export.c (do_export_stream): Skip on-card keys when only subkeys
+       are to be exported.  It does not make sense to replace the on-card
+       key stub by a no-key stub.
+
+       * revoke.c (gen_revoke): Check for non-online keys.
+
+       * seckey-cert.c (is_secret_key_protected): Return -3 for
+       non-online key stubs.  The old code assumes that a protection
+       algorithm is still set but in some cases this one is 0 and thus it
+       won't be possible to decide whether it is unprotected or
+       protected.
+
+2005-07-28  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (other_libs): Add SRVLIBS.
+
+       * parse-packet.c (can_handle_critical_notation): We know about
+       pka-address@gnupg.org.
+       * packet.h (PKT_signature): New fields PKA_INFO and PKA_TRIED. 
+       (pka_info_t): New.
+       * free-packet.c (cp_pka_info): New.
+       (free_seckey_enc, copy_signature): Support new fields.
+       * mainproc.c (get_pka_address, pka_uri_from_sig): New.
+       (check_sig_and_print): Try to get the keyserver from the PKA
+       record.
+       * pkclist.c (check_signatures_trust): Adjust the trust based on
+       the PKA.
+       * gpgv.c (parse_keyserver_uri): New stub.
+
+       * keygen.c (has_invalid_email_chars): Moved to ..
+       * misc.c (has_invalid_email_chars): .. here and made global.
+
+2005-07-27  Werner Koch  <wk@g10code.com>
+
+       * export.c (do_export_stream): Make two strings translatable.
+
+2005-07-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_typemap): Special-case LDAP since curl
+       will report that it can handle it, and we don't want it to.
+
+2005-07-26  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): Make sure to release the
+       saved codeset.
+       (agent_open): Add arg ORIG_CODESET and switch back to it in case
+       of error.  Changed all callers.
+
+2005-07-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids): Don't prompt for setting signature expiry
+       to match key expiry unless --ask-cert-expire is set.  Suggested by
+       Peter Palfrader.
+
+2005-07-22  Werner Koch  <wk@g10code.com>
+
+       * g10.c, options.h: New option --exit-on-status-write-error.
+       * status.c (write_status_text): Make use of this option.
+
+2005-07-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main): Removed option --no-interactive-selection.
+       * keyedit.c (keyedit_menu): Use --interactive to enable the uid
+       walking when signing a key with no uids specified to sign.
+
+       * keylist.c (list_keyblock_print): Fix silly typo.  Noted by Greg
+       Sabino Mullane.
+
+2005-07-20  Werner Koch  <wk@g10code.com>
+
+       * openfile.c (open_outfile): Disable FD caching for created files.
+       * encode.c (encode_simple, encode_crypt): Disable FD caching for
+       input files.
+       * verify.c (verify_one_file): Ditto.
+       * decrypt.c (decrypt_messages): Ditto. This is bug #479.
+
+       * misc.c (get_libexecdir) [W32]: Changed to return the value of
+       program used to create the process.
+       * keyserver.c (keyserver_spawn) [DISABLE_KEYSERVER_PATH]: Don't
+       change the exec-path at all.
+
+2005-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (curl_can_handle): New.  Do a runtime check against
+       libcurl to see if it can handle a particular protocol.
+       (keyserver_typemap): Call it here.
+
+       * Makefile.am: Pull in libcurl for curl_version_info() if used.
+
+2005-07-19  Werner Koch  <wk@g10code.com>
+
+       * g10.c, options.h: New option --limit-card-insert-tries.
+       * cardglue.c (open_card): Use it.
+
+       * export.c (parse_export_options): New option
+       export-reset-subkey-passwd.
+       (do_export_stream): Implement it.
+
+       * misc.c (get_libexecdir): New.
+       * keyserver.c (keyserver_spawn): Use it
+
+2005-07-18  Werner Koch  <wk@g10code.com>
+
+       * tdbio.c (open_db): Check for EROFS.  Suggested by Bryce Nichols.
+
+2005-07-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (clean_uids_from_key): Don't keep a valid selfsig
+       around when compacting a uid.  There is no reason to make an
+       attacker's job easier - this way they only have a revocation which
+       is useless in bringing the uid back.
+
+       * keydb.h, kbnode.c (undelete_kbnode): Removed.  No longer needed.
+
+       * import.c (chk_self_sigs): Allow a uid revocation to be enough to
+       allow importing a particular uid (no self sig needed).  This
+       allows importing compacted uids.
+
+2005-06-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (save_unprotected_key_to_card): Better fix for gcc4
+       warning.
+
+2005-06-20  Werner Koch  <wk@g10code.com>
+
+       * g10.c, options.h: New option --no-interactive-selection.
+       * keyedit.c (keyedit_menu): Use it.
+
+2005-06-18  Werner Koch  <wk@g10code.com>
+
+       * parse-packet.c (parse_signature): Use log_info for messages
+       about missing timestamp or keyid.  In case we don't use that key
+       there won't be no further error and thus gpg does not need to
+       return with an error.
+
+2005-06-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (save_unprotected_key_to_card): Fix gcc4 warning.
+
+       * options.h, import.c (parse_import_options, import_one): Add
+       import-clean-uids option to automatically compact unusable uids
+       when importing.  Like import-clean-sigs, this may nodify the local
+       keyring.
+
+       * trustdb.c (clean_uids_from_key): Only allow selfsigs to be a
+       candidate for re-inclusion.
+
+2005-06-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, import.c (parse_import_options,
+       clean_sigs_from_all_uids, import_one): Add import-clean-sigs
+       option to automatically clean a key when importing.  Note that
+       when importing a key that is already on the local keyring, the
+       clean applies to the merged key - i.e. existing superceded or
+       invalid signatures are removed.
+
+       * getkey.c (merge_selfsigs_main, merge_selfsigs_subkey): Make sure
+       that even after keys may be merged together, we only have one
+       chosen selfsig.
+
+2005-06-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, import.c (parse_import_options, delete_inv_parts):
+       import-unusable-sigs is now a noop.
+
+       * options.h, export.c (do_export_stream), keyedit.c (keyedit_menu,
+       menu_clean_subkeys_from_key), trustdb.h, trustdb.c
+       (clean_subkeys_from_key): Remove subkey cleaning function.  It is
+       of very limited usefulness since it cannot be used on any subkey
+       that can sign, and can only affect multiple selfsigs on
+       encryption-only subkeys.
+
+       * keydb.h, kbnode.c (undelete_kbnode): New function to undelete a
+       kbnode.
+
+       * trustdb.c (clean_uids_from_key): Further tweak the algorithm so
+       that the last good selfsig is kept when the chosen selfsig is a
+       revocation.
+
+2005-06-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (clean_uids_from_key), keyedit.c
+       (menu_clean_uids_from_key): Tweak algorithm to preserve the last
+       selfsig which helps prevent uid resurrections.
+
+       * getkey.c (fixup_uidnode, merge_selfsigs_main): Handle both
+       expired and revoked uids in fixup_uidnode().  No need to special
+       case in merge_selfsigs_main().  This also means that an expired
+       uid will have its selfsig tagged with chosen_selfsig.
+
+2005-06-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), export.c (parse_export_options,
+       do_export_stream): Add export-options export-clean-sigs,
+       export-clean-uids, export-clean-subkeys, and export-clean which is
+       all of the above.  Export-minimal is the same except it also
+       removes all non-selfsigs.  export-unusable-sigs is now a noop.
+
+2005-06-06  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (open_card): Emit new CARDCTRL status 5 for no reader
+       available.
+
+2005-06-02  Werner Koch  <wk@g10code.com>
+
+       * app-openpgp.c (do_writekey): Typo fix.
+
+       * status.c, status.h: Removed STATUS_BAD_PASSPHRASE_PIN.
+
+2005-06-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * signal.c [HAVE_DOSISH_SYSTEM]: Fix unused function warnings on
+       mingw32.  Noted by Joe Vender.
+
+       * passphrase.c [_WIN32]: Remove unused variables.
+
+2005-05-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_clean_uids_from_key,
+       menu_clean_subkeys_from_key), trustdb.c (clean_uids_from_key,
+       clean_subkeys_from_key): Fix mingw32 build warnings.  Noted by Joe
+       Vender.
+
+2005-05-31  Werner Koch  <wk@g10code.com>
+
+       * keydb.h [!ENABLE_AGENT_SUPPORT]: Define dummy types.
+
+       * cardglue.c (assuan_strerror, assuan_transact): Dummy functions
+       if not build with agent support. 
+
+       * armor.c (check_input): Don't bail out on invalid header lines
+       unless in struict rfc2440 mode.  Suggested by Richard Patterson.
+
+2005-05-30  Werner Koch  <wk@g10code.com>
+
+       * tlv.c: Add hack to compile without gpg-error.h.
+
+2005-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (clean_subkeys_from_key): New.  Walk
+       through the subkeys on a key, and mark any that aren't usable for
+       deletion.  Note that a signing subkey is never marked for deletion
+       since these keys are still useful after expiration or revocation.
+
+       * keyedit.c (menu_clean_subkeys_from_key): New function to call
+       clean_subkeys_from_key() on a key.  Note that the strings here are
+       not marked for translation yet.  The UI is still in flux, and
+       there is no point in annoying the translators twice.
+       (keyedit_menu): Call it here as part of the "clean" command.
+
+2005-05-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (clean_uids_from_key): New.  Walk through
+       the user IDs on a key, and mark any that aren't valid for
+       deletion.
+
+       * keyedit.c (menu_clean_uids_from_key): New function to call
+       clean_uids_from_key() on a key.
+       (keyedit_menu): Call it from here as part of the "clean" command.
+
+2005-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Default {export|import}-unusable-sigs to off until
+       the "clean" UI can be finished.
+
+2005-05-24  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (ask_passphrase): Unescape the description string.
+       * cardglue.c (unescape_status_string): Removed.  Changed all
+       caller to use ...
+       * misc.c (unescape_percent_string): New.
+
+       * g10.c (add_notation_data): Check number of at-signs.
+
+2005-05-23  Werner Koch  <wk@g10code.com>
+
+       * app-openpgp.c, app-common.h: Again updated from gnupg 1.9 CVS.
+
+       * cardglue.c (open_card): Check USE_AGENT.
+       (agent_scd_checkpin): Implemented Assuan part.
+       (agent_scd_change_pin): Ditto.
+
+       * g10.c (main): Option --debug-ccid-driver may now be given
+       several times increase the debug level.
+
+       * ccid-driver.c (parse_ccid_descriptor): Mark SCR335 FW version
+       5.14 as good.
+       (do_close_reader): Never do a reset. The caller should instead
+       make sure that the reader has been closed properly.  The new retry
+       code in ccid_slot_status will make sure that the readersatrts up
+       fine even if the last process didn't closed the USB connection
+       properly.
+       (ccid_get_atr): For certain readers try switching to ISO mode.
+       Thanks to Ludovic Rousseau for this hint and the magic numbers.
+       (print_command_failed): New.
+       (bulk_in): Use it here. Add new arg NO_DEBUG.
+       (ccid_slot_status): Disabled debugging.
+
+2005-05-21  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (send_status_info): Make CTRL optional.
+       (agent_scd_writekey, inq_writekey_parms): New.
+       (agent_openpgp_storekey): Removed.
+       * cardglue.h: Add a few more error code mappings.
+       * keygen.c (copy_mpi): Removed.
+       (save_unprotected_key_to_card): Changed to use agent_scd_writekey.
+       * app-common.h, app-openpgp.c, tlv.c, tlv.h: Updated from newer
+       version in gnupg 1.9 CVS.
+
+2005-05-20  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c (ccid_transceive): Arghhh.  The seqno is another
+       bit in the R-block than in the I block, this was wrong at one
+       place. Fixes bug #419 and hopefully several others.
+
+2005-05-19  Werner Koch  <wk@g10code.com>
+
+       * app-common.h, app-openpgp.c, tlv.c, tlv.h: Updated from newer
+       version in gnupg 1.9 CVS.
+
+2005-05-18  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_open): Made global and add arg TRY.
+       (agent_close): Made global.
+
+       * app-common.h (app_t): Add a field to store the Assuan context.
+
+2005-05-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (do_comment): Removed.
+       (build_packet): Ignore comment packets.
+
+       * export.c (do_export_stream): Don't export comment packets any
+       longer.
+
+       * options.h, g10.c (main): Remove --sk-comments and
+       --no-sk-comments options, and replace with no-op.
+
+2005-05-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (write_selfsigs): Rename from write_selfsig.  Write the
+       same selfsig into both the pk and sk, so that someone importing
+       their sk (which will get an autoconvert to the pk) won't end up
+       with two selfsigs.
+       (do_generate_keypair): Call it from here.
+
+       * parse-packet.c (can_handle_critical_notation): New.  Check for
+       particular notation tags that we will accept when critical.
+       Currently, that's only preferred-email-encoding@pgp.com, since we
+       know how to handle it (pass it through to a mail program).
+       (can_handle_critical): Call it from here.
+       (parse_one_sig_subpkt): Sanity check that notations are
+       well-formed in that the internal lengths add up to the size of the
+       subpacket.
+
+2005-05-07  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c (do_close_reader): Don't do a reset before close.
+       Some folks reported that it makes the SCR335 hang less often.
+       Look at the source on how to re-enable it.
+
+2005-05-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keygen.c (parse_expire_string, ask_expire_interval),
+       sign.c (sign_file, clearsign_file, sign_symencrypt_file), g10.c
+       (main), keyedit.c (sign_uids): Use seconds rather than days
+       internally to calculate expiration.  We no longer need the
+       day-based code as we don't generate v3 keys.
+
+       * sign.c (sign_file, clearsign_file, sign_symencrypt_file): Use
+       the default sig expire value when signing in batchmode.
+
+2005-05-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, packet.h, main.h, comment.c: Remove comment.c.  We
+       don't use any of these functions any longer.
+
+       * keygen.c (start_tree): New function to "prime" a KBNODE list.
+       (do_generate_keypair): Use it here rather than creating and
+       deleting a comment packet.
+
+       * keygen.c (gen_elg, gen_dsa): Do not put public factors in secret
+       key as a comment.
+
+       * options.h, encode.c (encode_simple, encode_crypt), keygen.c
+       (do_create): Remove disabled comment packet code.
+
+       * keygen.c (keygen_set_std_prefs): Add SHA256 and BZip2 to default
+       preferences.
+
+       * options.h, g10.c (main): Add new --default-sig-expire and
+       --default-cert-expire options.  Suggested by Florian Weimer.
+
+       * main.h, keygen.c (parse_expire_string, ask_expire_interval): Use
+       defaults passed in, or "0" to control what default expiration is.
+
+       * keyedit.c (sign_uids), sign.c (sign_file, clearsign_file,
+       sign_symencrypt_file): Call them here, so that default expiration
+       is used when --ask-xxxxx-expire is off.
+
+2005-05-03  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): Add new arg CACHEID.
+       Changed all callers.
+       (ask_passphrase): Add new arg CACHEID and use it in agent mode.
+       Changed all callers.
+       (passphrase_clear_cache): New arg CACHEID.  Changed all callers.
+       * cardglue.c (format_cacheid): New.
+       (pin_cb): Compute a cache ID.
+       (agent_scd_pksign, agent_scd_pkdecrypt): Use it.
+       (agent_clear_pin_cache): New.
+       * card-util.c (change_pin): Clear the PIN cache.
+       (check_pin_for_key_operation): Ditto.
+
+2005-04-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (mark_usable_uid_certs): Add flags for the
+       no-pubkey and chosen revocation cases.
+       (clean_uid): New function to clean a user ID of unusable (as
+       defined by mark_usable_uid_certs) certs.
+
+       * keyedit.c (keyedit_menu, menu_clean_uids): Call it here for new
+       "clean" command that removes unusable sigs from a key.
+
+       * trustdb.h, keyedit.c (keyedit_menu, menu_select_uid_namehash):
+       Allow specifying user ID via the namehash from --with-colons
+       --fixed-list-mode --list-keys.  Suggested by Peter Palfrader.
+
+2005-04-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids, keyedit_menu): When the user requests to
+       sign a key without specifying which user IDs to sign, and declines
+       to sign all user IDs, walk through the set of user IDs and prompt
+       for which to sign.
+
+       * mainproc.c (symkey_decrypt_seskey): There is no need to have an
+       extra check for a bad passphrase and/or unknown cipher algorithm
+       here.  We'll fail quite happily later, and usually with a better
+       error message to boot.
+
+2005-04-20  Werner Koch  <wk@g10code.com>
+
+       * sign.c (sign_file, sign_symencrypt_file): Allow for hash
+       debugging.
+
+2005-04-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Free some memory.
+
+       * sign.c (hash_for): Comments.
+
+2005-04-11  Werner Koch  <wk@g10code.com>
+
+       * g10.c (main, add_notation_data, add_policy_url)
+       (add_keyserver_url): Use isascii() to protect the isfoo macros and
+       to replace direct tests.  Possible problems noted by Christian
+       Biere.
+       * keyserver.c (parse_keyserver_uri): Ditto.
+
+2005-04-07  Werner Koch  <wk@g10code.com>
+
+       * g10.c (main): Declare --pipemode deprecated.
+       * misc.c (deprecated_command): New.
+
+       * ccid-driver.c (ccid_slot_status): Fixed debug messages.
+
+       * card-util.c (card_edit): Add command "verify".  Enhanced admin
+       command to allow optional arguments "on", "off" and "verify".
+       (card_status): Print private DOs in colon mode.
+       * app-openpgp.c (do_check_pin): Add hack to allow verification of
+       CHV3.
+
+2005-04-01  Werner Koch  <wk@g10code.com>
+
+       * keygen.c (keygen_set_std_prefs): Explain the chosen order of
+       AES key sizes. 
+
+2005-04-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (proc_plaintext): Properly handle SIG+LITERAL
+       (old-style PGP) signatures that use hashes other than SHA-1,
+       RIPEMD160, or MD5.
+
+2005-03-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.h, exec.c (set_exec_path): Remove some dead code and change
+       all callers.  We no longer need to append to $PATH.
+
+2005-03-31  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_open): Dropped support for W32 - is was
+       never actually used.  Removed support for the old non-assuan
+       protocol; there has never been a matured implementation and
+       gpg-agent is now arround for quite some time.  Rewritten to make
+       use of the Assuan code from ../util.
+       (gpga_protocol_codes): Removed.
+       (readn): Removed.
+       (agent_close): Simplified for use with Assuan.
+       (agent_get_passphrase, passphrase_clear_cache): Removed support
+       for old protocol.  Use only with ENABLE_CARD_SUPPORT defined.
+       (agent_send_all_options): Take assuan context instead of a file
+       descriptor.
+       (agent_send_option): Likewise. Use assuan_transact.
+       * passphrase.c (writen, readaline): Removed.
+
+       * g10.c (main): Print a warning if --use-agent has been used but
+       it has not been build with support for it.
+
+       * keydb.c (keydb_add_resource): Clarify meaning of flags.  Add new
+       flag 4.  Use log_info for errors registering the default secret key.
+       * g10.c (main): Flag the default keyrings.
+
+2005-03-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Don't mess about with the $PATH.
+       Rather, call keyserver helpers with the full path.  This fixes
+       some PATH-inspired DLL problems on W32.  Noted by Carlo Luciano
+       Bianco.
+
+2005-03-30  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (pin_cb): Print a warning if the info string hack is
+       not there.  This may happen due to typos in the translation.
+
+2005-03-22  Werner Koch  <wk@g10code.com>
+
+       * misc.c (w32_shgetfolderpath) [W32]: Changed declaration of
+       function ptr.  Noted by Tim Costello. 
+       * apdu.c [W32]: Changed declaration of dlopened function pointers.
+
+2005-03-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgv.c: Stubs for tty_enable_completion() &
+       tty_disable_completion().
+
+       * openfile.c (ask_outfile_name): Enable readline completion when
+       prompting for an output filename.
+
+       * plaintext.c (ask_for_detached_datafile): Enable readline
+       completion when prompting for a detached sig datafile.
+
+2005-03-21  Werner Koch  <wk@g10code.com>
+
+       * keyedit.c (command_generator, keyedit_completion): Changed
+       indentation.
+       * card-util.c (command_generator, card_edit_completion): Ditto.
+
+2005-03-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * card-util.c (command_generator, card_edit_completion)
+       [GNUPG_MAJOR_VERSION==1 && HAVE_LIBREADLINE]: New functions to
+       enable command completion in the --card-edit menu.
+       (card_edit): Call them here.
+
+2005-03-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (command_generator, keyedit_completion)
+       [HAVE_LIBREADLINE]: New functions to enable command completion in
+       the --edit-key menu.
+       (keyedit_menu): Call them here.
+
+2005-03-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (get_seckey_byname2): If no explicit default key is
+       set, don't pick a disabled default.  Noted by David Crick.
+
+       * Makefile.am: Calculate GNUPG_LIBEXECDIR directly.  Do not
+       redefine $libexecdir.
+
+       * options.h, keyserver.c (parse_keyserver_options)
+       (keyserver_spawn): Don't treat 'verbose' and 'include-disabled' as
+       special.  Just pass them through silently to the keyserver helper.
+
+2005-03-16  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c (parse_ccid_descriptor): Make SCM workaround
+       reader type specific.
+       (scan_or_find_devices): Do not check the interface subclass in the
+       SPR532 kludge, as this depends on the firmware version.
+       (ccid_get_atr): Get the Slot status first.  This solves the
+       problem with readers hanging on recent Linux 2.6.x.
+       (bulk_in): Add argument TIMEOUT and changed all callers to pass an
+       appropriate one.  Change the standard timeout from 10 to 5 seconds.
+       (ccid_slot_status): Add a retry code with an initial short timeout.
+       (do_close_reader): Do an usb_reset before closing the reader.
+
+2005-03-14  Werner Koch  <wk@g10code.com>
+
+       * card-util.c (card_status): Use isotimestamp and not the
+       localized asctimestamp to match the timezone used in the key
+       information.
+
+       * cardglue.c (pin_cb): Disable debug output.
+
+2005-03-11  Werner Koch  <wk@g10code.com>
+
+       * keygen.c (gen_card_key_with_backup): Write status line with the
+       backup filename.
+
+       * status.h, status.h (STATUS_BACKUP_KEY_CREATED): New.
+
+2005-03-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_options): Accept honor-http-proxy
+       as an alias for http-proxy.
+
+       * delkey.c (do_delete_key, delete_keys): Fix problem with --expert
+       preventing --delete-secret-and-public-keys from deleting secret
+       keys.
+
+2005-03-10  Werner Koch  <wk@g10code.com>
+
+       * keyedit.c (keyedit_menu) [W32]: Run the trustdb stale check
+       earlier.
+
+2005-03-07  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (agent_scd_pkdecrypt, agent_scd_pksign) 
+       (agent_scd_genkey, agent_scd_setattr, agent_scd_change_pin) 
+       (agent_scd_checkpin, agent_openpgp_storekey): Make sure to send a
+       SC_OP_FAILURE after card operations which might change data.
+       * card-util.c (change_pin): Send a SC_OP_SUCCESS after a PIN has
+       been changed.
+       (change_name): Removed a debug output.
+       * status.h, status.c: New codes BAD_PASSPHRASE_PIN, SC_OP_FAILURE
+       and SC_OP_SUCCESS.
+
+2005-02-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Only print the key signing hint when
+       signing from a place where it is useful (i.e. --edit-key and not
+       --sign-key).
+
+2005-02-16  Werner Koch  <wk@g10code.com>
+
+       * card-util.c (fetch_url): Fetch the key from the default
+       keyserver if no URL is available.
+
+2005-02-15  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): Don't call free_public_key
+       if PK is NULL.
+       (passphrase_clear_cache): Ditto. Removed debug output.
+       (passphrase_to_dek): Ditto.
+
+2005-02-13  Werner Koch  <wk@g10code.com>
+
+       * keyedit.c (cmds): Limit code to 80 columns. Add command
+       BKUPTOCARD.
+
+2005-02-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * encr-data.c (decrypt_data): Use it here to turn off the "quick
+       check" bytes for PK decryptions.  This is in regards to the Mister
+       and Zuccherato attack on OpenPGP CFB mode.
+
+       * mainproc.c (proc_symkey_enc): Set a flag to indicate that a
+       particular session key came from a passphrase and not a PK.
+
+2005-02-08  Werner Koch  <wk@g10code.com>
+
+       * misc.c (w32_shgetfolderpath): New.
+       (default_homedir): Use it to avoid problems under Windows95.
+
+2005-02-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (trustdb_check_or_update): New.  If the
+       trustdb is dirty and --interactive is set, do an --update-trustdb.
+       If not interactive, do a --check_trustdb unless
+       --no-auto-check-trustdb is set.
+
+       * import.c (import_keys_internal): Moved from here.
+
+       * keyserver.c (keyserver_refresh): Call it here after all
+       refreshing has happened so that we don't rebuild after each
+       preferred keyserver set of imports, but do one big rebuild at the
+       end.  This is Debian bug #293816, noted by Kurt Roeckx.
+
+2005-02-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (merge_selfsigs_subkey): Merged away definition from
+       the backsigs code.
+
+2005-01-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (do_generate_keypair): Write the auth key to the card
+       before the encryption key.  This is a partial workaround for a PGP
+       bug (as of this writing, all versions including 8.1), that causes
+       it to try and encrypt to the most recent subkey regardless of
+       whether that subkey is actually an encryption type.  In this case,
+       the auth key is an RSA key so it succeeds.
+
+2005-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyid.c (keyid_from_sk, keyid_from_pk): Use 0xFFFFFFFFFFFFFFFF
+       instead of 0x0000000000000000 for the invalid key ID since
+       all-zeroes is reserved for the anonymous recipient.
+
+       * keyedit.c (change_passphrase), keygen.c (generate_subkeypair):
+       Fix a string ;)
+
+2005-01-27  Werner Koch  <wk@g10code.com>
+
+       * parse-packet.c (listfp): New.
+       (set_packet_list_mode): Intialize it to stdout or stderr depending
+       on a global option.  Made all printing in list mode use LISTFP.
+
+       * keygen.c (generate_subkeypair): Detect primary key on-card and
+       ask for the passphrase.  Return an error if the primary key is a
+       plain stub.
+
+       * keyedit.c (change_passphrase): Don't ever change any stub key.
+       Print a note if a key consists of only stub keys.  Reported by
+       Dany Nativel.  These are bugs #401 and #402.
+
+2005-01-26  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c (parse_ccid_descriptor): Need the CSM workaround
+       also for newer firmware versions.  Need to get a list of fixed
+       firmware versions and use that.
+
+2005-01-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_uri): Allow RFC-2732 IPv6 [literal
+       address] syntax in keyserver URLs.
+       (keyserver_typemap): Map ftps if we are supporting it.
+
+2005-01-25  Werner Koch  <wk@g10code.com>
+
+       * keygen.c (do_generate_keypair): Don't continue after an error;
+       fixed at two places. Why at all didn't I used a goto to cleanup,
+       tsss?
+
+       * app-openpgp.c (get_cached_data): New arg GET_IMMEDIATE to bypass
+       the cache.  Changed all callers.
+       (get_one_do): Bypass the cache if the value would have been read
+       directly for v1.1 cards.  It makes things a bit slower but only for
+       1.0 cards and there are not that many cards out in the wild.  This
+       is required to fix a caching bug when generating new keys; as a
+       side effect of the retrieval of the the C4 DO from the 6E DO the
+       chaced fingerprint will get updated to the old value and later
+       when signing the generated key the checking of the fingerprint
+       fails becuase it won't match the new one.  Thanks to Moritz for
+       analyzing this problem.
+       (verify_chv3): Removed the CHV status reread logic because we
+       won't cache the C4 DO anymore.
+
+2005-01-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (free_keyserver_spec): Fix small leak.
+       (keyserver_typemap): Map https if we are supporting it.
+
+2005-01-20  Werner Koch  <wk@g10code.com>
+
+       * cardglue.c (open_card): Issue new CARDCTRL(4) status.
+
+       * gpgv.c (tty_fprintf): New stub.
+
+       * card-util.c (card_status): Create a secret key stub on the fly
+       and print more information about a card key.
+       * import.c (pub_to_sec_keyblock, auto_create_card_key_stub): New.
+       * getkey.c (get_seckeyblock_byfprint): New.
+       * keylist.c (print_card_key_info): New.
+
+       * g10.c (i18n_init) [W32]: Pass registry key to gettext
+       initialization.
+       * gpgv.c (i18n_init) [W32]: Ditto.
+
+2005-01-18  Werner Koch  <wk@g10code.com>
+
+       * misc.c (default_homedir): New.  Taken from gnupg 1.9.15.
+       * g10.c (main): Use it.
+       * gpgv.c (main): Ditto.
+
+       * keylist.c (public_key_list): Do a trustdb staleness check before
+       opening the keyring.
+       (secret_key_list): Ditto.
+
+2005-01-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Move command strings outside the
+       function to get ready for the readline completion code.
+
+       * passphrase.c (readline, agent_send_option, agent_open,
+       agent_get_passphrase, passphrase_clear_cache): Rename readline()
+       to readaline() to keep readline library namespace clear.
+
+2005-01-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * filter.h, armor.c (armor_filter): Use the eol string from the
+       armor filter context instead of hardcoding '\n' or '\r\n'.  If no
+       eol string is provided, default to '\n' or '\r\n' as appropriate.
+       (is_armor_header): Trim tabs in armor header lines as well.
+
+       * keyserver.c (keyserver_spawn): Use it here to force '\n' line
+       endings since the keyserver output file gets a LF->CRLF expansion
+       on win32.
+
+2005-01-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Typo.
+
+       * armor.c (is_armor_header): Allow CR and LF (not just actual
+       spaces) in an armor header line (-----BEGIN etc).  This is needed
+       due to CRLF issues on win32.  As before, --openpgp makes it
+       strict.
+
+2005-01-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use @LIBUSB@ instead of @LIBUSB_LIBS@
+
+       * import.c (delete_inv_parts): Comments on import-unusable-sigs.
+
+2005-01-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, import.c (parse_import_options, delete_inv_parts):
+       Add import-unusable-sigs flag to enable importing unusable
+       (currently: expired) sigs.
+
+       * options.h, export.c (parse_export_options, do_export_stream):
+       Add export-unusable-sigs flag to enable exporting unusable
+       (currently: expired) sigs.
+
+2004-12-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, getkey.c (merge_selfsigs_main, sig_to_revoke_info),
+       keyid.c (revokestr_from_pk), keyedit.c (show_key_with_all_names):
+       Show who revoked a key (either the same key or a designated
+       revoker) and when.
+
+2004-12-28  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c (find_endpoint): New.
+       (scan_or_find_devices): Add new args to return endpoint info and
+       interface number.
+       (ccid_open_reader, ccid_shutdown_reader): Take care of these new
+       args.
+       (bulk_in, bulk_out): Use the correct endpoints.
+       (ccid_transceive_apdu_level): New.
+       (ccid_transceive): Divert to above.
+       (parse_ccid_descriptor): Allow APDU level exchange mode.
+       (do_close_reader): Pass the interface number to usb_release_interface.
+
+2004-12-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_typemap): Only map HTTP and FTP if
+       libcurl has specifically been selected to handle them.
+
+2004-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keyserver.c (parse_keyserver_uri): Properly parse
+       auth data from URLs and pass to keyserver helpers.
+
+       * keyserver.c (keyserver_typemap): New.  Map certain keyserver
+       types to a common type (e.g. ldaps -> ldap).  If we are building
+       with curl, map both http and ftp to curl.
+
+       * build-packet.c (build_sig_subpkt): Only allow one preferred
+       keyserver subpacket at a time.
+
+2004-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_set_keyserver_url): Make sure we only operate on
+       the chosen selfsig so we don't accidentally promote an older
+       selfsig to chosen.  Discovered by Simon Josefsson and 'Todd'.
+
+       * keygen.c (ask_expire_interval): Fix typo.
+
+2004-12-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (list_keyblock_print): Secret key listings should
+       always show everything (expired UIDs, revoked subkeys, etc, etc).
+
+       * keyedit.c (keyedit_menu): Add additional help for the "sign"
+       flags.
+
+2004-12-20  Werner Koch  <wk@g10code.com>
+
+       * keygen.c (ask_expire_interval): For better translations chnage 2
+       strings.
+
+       * seckey-cert.c (do_check): Handle case when checksum was okay but
+       passphrase still wrong.  Roman Pavlik found such a case.
+
+2004-12-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Invisible alias "passwd" as
+       "password".
+
+       * passphrase.c: Don't check for __CYGWIN__, so it is treated as a
+       unix-like system.
+
+       * options.h, g10.c (main), textfilter.c (standard): Use new option
+       --rfc2440-text to determine whether to filter "<space>\t\r\n" or
+       just "\r\n" before canonicalizing text line endings.  Default to
+       "<space>\t\r\n".
+
+2004-12-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (keygen_get_std_prefs): Set reference count when
+       creating the temporary user ID.
+
+       * keyedit.c (keyedit_menu): Merge updpref and setpref.  Keep
+       updpref as an invisible alias.  Add invisible alias for revphoto.
+       Fix small memory leak when using "setpref" (not all of the uid was
+       freed).
+       (menu_revkey): Trigger a trust rebuild after revoking a key.
+       Don't allow revoking an already-revoked whole key.
+       (menu_revsubkey): Don't allow revoking an already-revoked subkey.
+
+2004-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_revkey): Rename to menu_revsubkey.
+       (menu_revkey): New.  Revoke a whole key.
+       (keyedit_menu): Call it here for when 'revkey' is used without any
+       subkeys selected.  This is to be consistent with the other
+       functions which are "selected part if selected, whole key if not".
+
+       * signal.c: Use only HAVE_LIBREADLINE to detect readline
+       availability.
+
+       * Makefile.am: Link with readline where necessary.
+
+2004-12-17  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): Define NREAD locally as
+       size_t or int.
+
+       * keylist.c (list_keyblock_print): Make field width an int.
+       * keyedit.c (show_key_with_all_names): Ditto.
+
+2004-12-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --require-secmem/--no-require-secmem to cause
+       gpg to exit if it cannot lock memory.  Also remove --nrsign-key
+       and --nrlsign-key since this can better be done via --edit-key.
+
+2004-12-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * apdu.c (apdu_send_le, apdu_send_direct), keylist.c
+       (status_one_subpacket, print_one_subpacket): Fix some compiler
+       warnings.
+
+       * g10.c (main): Fix --compression-algo to take a string argument
+       like --compress-algo.
+
+       * trustdb.c (uid_trust_string_fixed): For safety, check for a pk.
+
+2004-12-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Re-remove the N_() markers.
+
+       * trustdb.c (uid_trust_string_fixed): Show uids as revoked if the
+       key is revoked.
+       
+       * keyedit.c (show_key_with_all_names): Don't show validity for
+       secret key UIDs.
+
+       * keyedit.c (parse_sign_type): New.  Figure out the flags (local,
+       nonrevoke, trust) for a signature.
+       (keyedit_menu): Call it here so we can mix and match flags, and
+       don't need "nrltsign", "ltsign", "tnrsign", etc, etc, etc.
+
+2004-12-14  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): Removed debug output
+
+       * keyserver.c (keyserver_work, keyserver_spawn): Map ldaps to ldap.
+
+       * keyedit.c (keyedit_menu): Removed the N_() markers from the
+       command names.
+       * card-util.c (card_edit): Ditto.
+
+2004-12-13  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (read_passphrase_from_fd): Fixed memory leak.
+       Noted by Andrei Darashenka.
+
+2004-12-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_preferred_keyserver): Force preferred
+       keyserver subpackets to have a URI scheme specified.
+
+2004-12-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), textfilter.c (standard): Use --rfc2440
+       or --openpgp directly to determine the end of line hashing rule.
+
+       * trustdb.c (uid_trust_string_fixed): Show uids as expired if the
+       key is expired.
+
+2004-12-10  Werner Koch  <wk@g10code.com>
+
+       * app-openpgp.c (send_fprtime_if_not_null): New.
+       (do_getattr): Add KEY_TIME.
+       (do_learn_status): Print KEY_TIME.
+       * cardglue.c (learn_status_cb): Parse KEY-TIME.
+       * card-util.c (card_status): Print creation time if available.
+
+2004-12-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), textfilter.c (len_without_trailing_ws):
+       Removed (not used).
+       (standard): 2440 says that textmode hashes should canonicalize
+       line endings to CRLF and remove spaces and tabs.  2440bis-12 says
+       to just canonicalize to CRLF.  So, we default to the 2440bis-12
+       behavior, but revert to the strict 2440 behavior if the user
+       specifies --rfc2440.  In practical terms this makes no difference
+       to any signatures in the real world except for a textmode detached
+       signature.
+
+2004-12-09  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): New args CUSTOM_PROMPT and
+       CUSTOM_DESCRIPTION.     Changed all callers.
+
+       * app-openpgp.c (do_getattr, do_learn_status, do_setattr): Support
+       the new private DOs.
+       (do_change_pin): Add a "N" prefix to the strings so that the
+       callback can act accordingly for a new PIN.  Unfortunately this
+       breaks existing translations but I see no wother way to overvome
+       this.
+
+       * cardglue.c (learn_status_cb): Ditto.
+       (agent_release_card_info): Ditto.
+       (struct pin_cb_info_s): Removed and changed all users.
+       (pin_cb): Reworked.
+
+       * card-util.c (card_status): Print them
+       (card_edit): New command PRIVATEDO.
+       (change_private_do): New.
+
+2004-12-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (ask_algo): Add a choose-your-own-capabilities option
+       for DSA.
+
+2004-12-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (ask_keysize): Change strings to always use %u instead
+       of hardcoding key sizes.  Bump default to 2048.  Bump minimum down
+       to 512, where possible, but require --expert to get there.  DSA is
+       always 1024 unless --expert is given.
+
+2004-11-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (parse_key_usage): New function to parse out key usage
+       flags.  Set PUBKEY_USAGE_UNKNOWN to handle flags that we don't
+       understand.
+       (fixup_uidnode, merge_selfsigs_main, merge_selfsigs_subkey): Call
+       it from here to remove duplicate code.
+
+2004-11-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * export.c (do_export_stream): Allow export-minimal to work with
+       secret keys, even though a non-selfsig secret key signature is
+       rare.
+
+       * options.h, export.c (parse_export_options, do_export_stream),
+       import.c (parse_import_options, import_keys_internal): Make the
+       import-options and export-options distinct since they can be mixed
+       together as part of keyserver-options.
+
+2004-11-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, export.c (parse_export_options, do_export_stream):
+       Add "export-minimal" option to disregard any sigs except selfsigs.
+
+       * trustdb.c (uid_trust_string_fixed): Use a string that can be
+       atoi-ed, but also has a comment for the translator.
+
+       * trustdb.h, trustdb.c (uid_trust_string_fixed): New.  Return a
+       fixed-size translatable string similar to trust_value_to_string.
+       This allows for easier lining up of displays.
+
+       * keyedit.c (show_key_with_all_names), keylist.c
+       (list_keyblock_print): Use it here to print validity strings.
+
+       * gpgv.c: Stub.
+
+2004-11-18  Werner Koch  <wk@g10code.com>
+
+       * g10.c (S_IRGRP) [HAVE_DOSISH_SYSTEM]: Define to 0.
+
+2004-11-17  Werner Koch  <wk@g10code.com>
+
+       * g10.c (open_info_file): New.
+       (main): Unconditionally implement --status-file, --logger-file,
+       --attribute-file, --passphrase-file, --command-file.  This is not
+       generally useful but easy to support and might make scripting
+       under Windows easier.
+
+2004-11-11  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (readn): Fixed test against EINTR.
+
+2004-11-05  Werner Koch  <wk@g10code.com>
+
+       * app-openpgp.c: Made more strings translatable.
+       (verify_chv3, do_change_pin): Add a special prefix to the prompt
+       of the Admin PIN prompts.
+       * passphrase.c (ask_passphrase): Add arg TRYAGAIN_TEXT.  Changed
+       call callers.
+       * cardglue.c (pin_cb): Make use of the OPAQUE arg to pass
+       arguments to the PIN callback.  Use this to implement a way to
+       check for correct PIN repetition.  Changed all callers to pass an
+       opaque argument. Improved detection of Admin PIN prompts.
+
+2004-11-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * plaintext.c (handle_plaintext): Don't try and create a
+       zero-length filename when using --use-embedded-filename with input
+       that has no filename (clearsigned or message generated from a
+       pipe).
+
+       * encode.c (encode_simple, encode_crypt), progress.c
+       (handle_progress), sign.c (write_plaintext_packet): Fix a few
+       inconsistent calls (NULL filename means a pipe here, so don't
+       bother to check it twice).
+
+2004-11-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (print_digest_algo_note): The latest 2440bis drafts
+       deprecates MD5, so give a warning.
+       (print_pubkey_algo_note, print_cipher_algo_note,
+       print_digest_algo_note): Give the algorithm name in the
+       experimental algo warning.
+
+2004-11-03  Timo Schulz  <twoaday@g10code.com>
+
+       * passphrase.c (readn, writen): Use w32_strerror instead
+        of just showing the error number.
+       * misc.c [_WIN32]: Fix warning about missing prototypes.
+       
+2004-10-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * skclist.c (build_sk_list): Don't need to warn about
+       PGP-generated Elgamal signing keys since we no longer support any
+       Elgamal signing keys.
+
+       * sign.c (sign_file, clearsign_file): Use "writing to" instead of
+       "writing to file" to match other strings.
+
+       * pkclist.c (check_signatures_trust): Fix typo.  Noted by Moray
+       Allan.  This is Debian bug #278708.
+
+       * passphrase.c (ask_passphrase, passphrase_to_dek): "password" ->
+       "passphrase".
+
+       * keyedit.c (show_key_with_all_names): Show designated revoker as
+       part of translatable string.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (other_libs): New.  Also include LIBICONV.  Noted by
+       Tim Mooney.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       * apdu.c (open_pcsc_reader): Removed bad free in error handler.
+
+2004-10-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * card-util.c, delkey.c, keygen.c, plaintext.c, keyedit.c,
+       passphrase.c, revoke.c: Collapse the two different "can't do that
+       in batch mode" strings into one.
+
+       * keylist.c (status_one_subpacket): New.  Send the subpacket data
+       to the --status interface.
+
+       * card-util.c (card_edit): Show when admin is enabled or not.
+
+       * status.h, status.c: New STATUS_SIG_SUBPACKET type.
+
+       * build-packet.c (build_sig_subpkt): Multiple keyserver URLs are
+       allowed.
+
+       * keyring.c: Make some strings translatable.
+
+       * exec.c, sign.c: Change "can't open file" to "can't open" and
+       "can't create file" to "can't create" to be consistent with other
+       strings so we don't have to translate both.
+
+       * delkey.c, export.c, keyedit.c, pkclist.c, revoke.c, skclist.c:
+       Fix a few missed possible \"username\" quotes.
+
+2004-10-26  Werner Koch  <wk@g10code.com>
+
+       * app-openpgp.c (verify_chv3): The minimum length for CHV3 is
+       8. Changed string to match the other ones.
+
+       * passphrase.c (agent_send_all_options): Try to deduce the ttyname
+       from stdin.
+
+2004-10-22  Werner Koch  <wk@g10code.com>
+
+       * card-util.c (fetch_url): Disable for gnupg 1.9
+       (card_generate_subkey): Ditto.
+       (card_store_subkey): Ditto.
+
+2004-10-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), mainproc.c (check_sig_and_print):
+       Rename verify-option show-validity to show-uid-validity to match
+       the similar list-option.
+
+       * app-openpgp.c (verify_chv3): Fix typo.
+
+2004-10-21  Werner Koch  <wk@g10code.com>
+
+       * app-common.h (app_openpgp_storekey): Add prototype.
+
+       * app-openpgp.c (do_sign): Replace asprintf by direct allocation.
+       This avoids problems with missing vasprintf implementations.
+
+       * card-util.c (generate_card_keys): Add a #warning for gnupg 1.9
+       and use the same string there.
+
+2004-10-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (parse_list_options): Fix non-constant initializer so we
+       can build with C89.
+
+2004-10-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (print_one_subpacket): The flags field should be hex.
+
+2004-10-17  Werner Koch  <wk@g10code.com>
+
+       * passphrase.c (agent_get_passphrase): Cast UIDLEN to int.  Noted
+       by Christian Cornelssen.
+
+2004-10-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse_one_sig_subpkt, enum_sig_subpkt): Don't
+       BUG() on unknown subpackets.  Rather, just return them silently.
+       
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * status.h (STATUS_NEED_PASSPHRASE_PIN): New.
+       * status.c (get_status_string): Added.
+       * passphrase.c (ask_passphrase): Moved status printing to ..
+       * cardglue.c (pin_cb): .. here and issue new status message.
+
+       * keyedit.c (sign_uids): Don't include the leading LF in the
+       translatable string but print them separately.
+
+       * apdu.c (apdu_open_remote_reader) [_WIN32]: We don't have ENOSYS.
+
+       * app-openpgp.c (parse_login_data): New. 
+       (app_select_openpgp): Call it.
+       (do_setattr): Reparse it after change.
+
+       * pkclist.c (do_edit_ownertrust): Add a note to translators.
+       * keygen.c (ask_user_id): Ditto.
+
+       * helptext.c: Typo fix.
+
+2004-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (list_keyblock_print): Show the fingerprint after the
+       key, not after the first user ID.
+
+       * keyedit.c (show_key_with_all_names): Don't show validity if
+       we're just printing user IDs for signing.
+
+       * armor.c (fake_packet): Properly handle the case where the line
+       is dash-space (i.e. a blank line that was quoted).  Give a warning
+       for bad dash escaping.
+
+2004-10-14  Werner Koch  <wk@g10code.com>
+
+       * export.c (do_export_stream) [ENABLE_SELINUX_HACKS]: Don't allow
+       secret key export.
+       * import.c (import_secret_one) [ENABLE_SELINUX_HACKS]: Likewise 
+
+       * misc.c (is_secured_filename): New.
+       * keydb.c (maybe_create_keyring)
+       * tdbio.c (tdbio_set_dbname)
+       * plaintext.c (handle_plaintext)
+       * openfile.c (copy_options_file, open_outfile)
+       * exec.c (exec_write)
+       * keygen.c (do_generate_keypair, gen_card_key_with_backup)
+
+       * sign.c (sign_file, clearsign_file)
+       * keyring.c (create_tmp_file, do_copy): Check for secured files
+       before creating them. 
+
+       * keygen.c (print_status_key_created, read_parameter_file):
+       s/unsigned char/byte/ due to a strange typedef for RISC OS.  Noted
+       by Stefan.
+
+2004-10-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c (fake_packet): Allow arbitrary dash-escaped lines as per
+       2440bis-10.  This is bug #158.
+
+       * keyserver.c (keyserver_work): Handle keyserver timeouts.
+
+       * pkclist.c (do_edit_ownertrust): Different prompt when we're
+       using direct trust since the meaning is different.
+
+       * keyedit.c (trustsig_prompt): Change the strings to match the
+       ones in pkclist.c:do_edit_ownertrust to make translation easier.
+
+       * trustdb.c (trust_model_string, get_validity): Add direct trust
+       model which applies to the key as a whole and not per-uid.
+
+       * options.h, g10.c (parse_trust_model): New.
+       (main): Call it from here to do string-to-trust-model.
+
+2004-10-13  Werner Koch  <wk@g10code.com>
+
+       * tdbdump.c (import_ownertrust): Removed all log_error_f and
+       reworded the messages.
+
+       * dermor.c: Include i18n.h.  Made 2 strings translatable.
+       
+       * misc.c (register_secured_file, is_secured_file)
+       (unregister_secured_file): New.
+       * keyring.c (do_copy, rename_tmp_file): Implement the SELinux hacks.
+       (keyring_register_filename): Ditto.
+       * tdbio.c (open_db): Ditto.
+       * openfile.c (copy_options_file, open_sigfile): Ditto.
+       * verify.c (verify_signatures, verify_one_file): Ditto.
+       * photoid.c (generate_photo_id): Ditto.
+       * keygen.c (read_parameter_file): Ditto.
+       * import.c (import_keys_internal): Ditto.
+       * decrypt.c (decrypt_message, decrypt_messages): Ditto.
+       * dearmor.c (dearmor_file, enarmor_file): Ditto.
+       * g10.c (main, print_mds): Ditto.
+       * exec.c (exec_write, exec_read): Ditto. 
+       * card-util.c (change_login): Ditto.
+       * encode.c (encode_simple, encode_crypt): Ditto.
+
+       * openfile.c (overwrite_filep, make_outfile_name, open_outfile) 
+       (open_sigfile): Use iobuf_is_pipe_filename to check for pipes so
+       that special filesnames are taken into account. This is bug 327.
+
+       * tdbdump.c (import_ownertrust): Ditto.
+
+       * sign.c (write_plaintext_packet): Ditto.
+       (sign_file, clearsign_file, sign_symencrypt_file): 
+
+       * progress.c (handle_progress): Ditto.
+       * plaintext.c (handle_plaintext): Ditto.
+       (ask_for_detached_datafile, hash_datafiles): 
+
+       * encode.c (encode_simple, encode_crypt): Ditto. 
+
+2004-10-12  Werner Koch  <wk@g10code.com>
+
+       * keygen.c (read_parameter_file): Changed to use iobuf based file
+       reading to allow the special file name feature to work.
+
+       * keygen.c (read_parameter_file): New keyword "Handle".  This is
+       bug 287.
+       (print_status_key_not_created): New.
+       (print_status_key_created): Add new arg HANDLE.
+       (do_generate_keypair): Print not created status.
+       * status.c, tatus.h (STATUS_KEY_NOT_CREATED): New. 
+
+2004-10-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (do_edit_ownertrust): Use the same translated string
+       for showing the user ID as mainproc.c:print_pkenc_list.
+
+       * mainproc.c (print_pkenc_list): Allow translating the quotes
+       around the user ID.
+
+       * card-util.c, g10.c, photoid.c, trustdb.c: The last of the \"%s\"
+       -> `%s' quoting for things that aren't user IDs.
+
+       * keyserver.c (keyserver_spawn): If there is no keyserver host,
+       print the whole URI since it is self-contained.
+
+2004-10-11  Werner Koch  <wk@g10code.com>
+
+       * keyserver.c (keyserver_spawn): Print an empty string in log_info
+       if the host is not set (e.g. finger).
+
+2004-10-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * card-util.c, keyedit.c, openfile.c, pkclist.c, delkey.c,
+       keygen.c, photoid.c, revoke.c: Some yes-or-no prompts end in
+       "(y/n)".  Some don't.  Consistently use y/n everywhere.
+
+       * keygen.c (ask_key_flags): New.
+       (ask_algo): Call it here in --expert mode so we don't need to
+       specify each possible variation of RSA capabilities.
+
+       * keygen.c (do_add_key_flags): The spec says that all primary keys
+       MUST be able to certify.  Force the certify flag on for primaries
+       (and off for subkeys).
+
+       * keygen.c (generate_keypair): Fix generating keys with the auth
+       flag.
+
+2004-10-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * encr-data.c (decrypt_data): Give a warning with a weak key, but
+       still allow to decrypt the message.
+
+2004-10-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (build_pk_list): Keystrify.
+
+       * mainproc.c (check_sig_and_print), pkclist.c
+       (do_edit_ownertrust): Improve translatability of user ID prompts.
+
+2004-10-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * helptext.c, pkclist.c (do_we_trust): It is not possible to get
+       here with a revoked or expired key, so BUG() that case.  Remove
+       question about overriding revoked/expired.  Also
+       --keyid-format-ify.
+       (do_we_trust_pre): Use print_pubkey_info() instead of printing the
+       info ourselves.
+
+       * passphrase.c (passphrase_to_dek): Improve translatability of
+       user ID prompts.
+
+       * keylist.c (print_pubkey_info): Use the user ID the pk was
+       selected by, if any.
+
+       * keyedit.c (sign_uids, ask_revoke_sig): Improve translatability
+       of user ID prompts.
+       (ask_revoke_sig, menu_revsig): Try and use common strings for
+       these two functions so they don't need to be translated twice.
+
+       * keyedit.c, keylist.c, keyserver.c, mainproc.c: The
+       revoked/expired/expires string change of 2004-09-29 was too
+       simple.  Use two styles for each tag.
+
+2004-10-06  Werner Koch  <wk@g10code.com>
+
+       * ccid-driver.c (ccid_open_reader): Store the vendor ID.
+       (ccid_transceive_secure): New.
+       (parse_ccid_descriptor): Workaround for an SCM reader problem.
+       (send_escape_cmd): New.
+
+2004-10-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * passphrase.c (agent_get_passphrase): Use keystrs for agent
+       strings, and fix sprintf warnings.
+
+       * keyserver.c (keyserver_spawn): Fix BUG() with certain sets of
+       mixed regular and preferred keyserver refreshes.  Noted by
+       Sebastian Wiesinger.
+
+       * keyedit.c (show_key_with_all_names): Show uid validity in menu.
+
+2004-10-03  Timo Schulz  <twoaday@g10code.de>
+
+       * apdu.c (apdu_open_remote_reader) [_WIN32]: Do not set ENOSYS.
+       
+2004-10-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (print_and_check_one_sig_colon): Fix bad keyids in
+       colon delsig output.  Noted by Peter Palfrader.
+       (show_prefs): Do not reference missing selfsig.  Noted by Alex
+       Moroz.
+
+2004-10-01  Werner Koch  <wk@g10code.com>
+
+       * gpgv.c (i18n_init): Always use LC_ALL.
+
+2004-09-30  Werner Koch  <wk@g10code.com>
+
+       * app-openpgp.c (verify_chv3) [GNUPG_MAJOR_VERSION!=1]: Typo fix.
+
+2004-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgv.c, keydb.c (keydb_add_resource): Factored keyring creation
+       out to ..
+       (maybe_create_keyring): .. new.  Make sure that we do the checks
+       in a locked state.  Problem reported by Stefan Haller.  Try to
+       create the home directory before acquiring a lock for the keyring.
+       From Werner on stable branch.
+
+       * g10.c (main): Blow up if we didn't lose setuid.  From Werner on
+       stable branch.
+
+2004-09-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c, keylist.c, keyserver.c, mainproc.c: Reduce the many
+       variations of "revoked" ("revoked", "[revoked]", " [revoked]",
+       "[revoked] ") "and" expired down to two to simplify translation.
+
+2004-09-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (print_and_check_one_sig): Account for the extra space
+       that show-sig-expire takes up so we do not wrap lines.
+       (show_key_with_all_names): No need to show subkey revocations as a
+       seperate line since we now show revocation date in the main subkey
+       line.
+
+       * signal.c (got_fatal_signal): HAVE_DECL_SYS_SIGLIST is defined,
+       but zero if not found.  Noted by John Clizbe.
+
+       * keyserver.c (parse_keyrec): Fix problem with non-expiring keys
+       appearing expired in --search-keys results.
+
+2004-09-27  Werner Koch  <wk@g10code.com>
+
+       * card-util.c (card_edit): Take admin only status from the table.
+
+       * app-openpgp.c: Made all strings translatable.
+       (verify_chv3) [GNUPG_MAJOR_VERSION]: Make opt.allow_admin
+       available for use in gnupg 2. 
+       (verify_chv3): Reimplemented countdown showing to use only
+       functions from this module.  Flush the CVH status cache on a
+       successful read.
+       (get_one_do): Hack to bypass the cache for cards versions > 1.0.
+       (store_fpr): Store the creation date for card version > 1.0.
+
+2004-09-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, g10.c (main), card-util.c (change_pin): If "admin" has
+       not been issued, skip right to the CHV1/CHV2 PIN change.  No need
+       to show the unblock or admin PIN change option.
+       (card_edit): Add "admin" command to add admin commands to the
+       menu.  Do not allow admin commands until "admin" is given.
+
+       * app-openpgp.c (verify_chv3): Show a countdown of how many wrong
+       admin PINs can be entered before the card is locked.
+
+       * options.h, g10.c (main), app-openpgp.c (verify_chv3): Remove
+       --allow-admin.
+
+2004-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h: Create S2K_DIGEST_ALGO macro so we do not need to always
+       set opt.s2k_digest_algo.  This helps fix a problem with PGP 2.x
+       encrypted symmetric messages.  Change all callers (encode.c,
+       g10.c, keyedit.c, keygen.c, passphrase.c, sign.c).
+
+       * armor.c, cardglue.c, getkey.c, import.c, keygen.c: Be consistent
+       in some more quoted strings.  Always use 'user ID', not 'user id',
+       "quotes" for user IDs, etc.
+
+       * keyedit.c (keyedit_menu), gpgv.c (agent_scd_getattr (stub)),
+       keygen.c (copy_mpi, generate_raw_key): Fix a compile problem and a
+       few warnings when building without card support.
+
+2004-09-23  Werner Koch  <wk@g10code.com>
+
+       * card_util.c (generate_card_keys): ask whether backup should be
+       created.
+       (card_store_subkey): Factored some code out to ..
+       * keygen.c (save_unprotected_key_to_card): .. new function.
+       (gen_card_key_with_backup): New.
+       (generate_raw_key): New.
+       (generate_keypair): New arg BACKUP_ENCRYPTION_DIR.  Changed all
+       callers.
+       (do_generate_keypair): Divert to gen_card_key_with_backup when
+       desired.
+
+       * apdu.c (open_pcsc_reader): Do not print empty reader string.
+
+       * keygen.c (ask_algo): Allow creation of AUTH keys.
+
+       * keyid.c (usagestr_from_pk): New.
+
+       * app-openpgp.c (app_openpgp_storekey): Call flush_cache.
+       (get_cached_data): Move local data initialization to ..
+       (app_select_openpgp): .. here. Read some flags for later use.
+       (do_getattr): New read-only attribute EXTCAP.
+
+       * keyedit.c (keyedit_menu): New command "keytocard"
+       (keyedit_menu): Bad hack for the not_with_sk element.
+       (show_key_with_all_names): Print the usage.
+       (find_pk_from_sknode): New.
+
+       * card-util.c (card_store_subkey): New.
+       (copy_mpi): New.
+
+       * cardglue.c (agent_openpgp_storekey): New.
+
+2004-09-22  Werner Koch  <wk@g10code.com>
+
+       * card-util.c (card_generate_subkey, generate_card_keys): Factored
+       common code out to ...
+       (get_info_for_key_operation, check_pin_for_key_operation)
+       (restore_forced_chv1, replace_existing_key_p)
+       (show_card_key_info): ... new functions.
+
+2004-09-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (check_sig_and_print), keyedit.c (show_prefs,
+       menu_set_keyserver_url): Make sure that keyserver URLs with
+       control characters inside are printed properly.  In fact, handle
+       them as UTF8.
+
+       * keyedit.c (keyedit_menu): Don't show "addcardkey" in the menu if
+       we do not have card support.
+
+       * keydb.h, keyserver.c (print_keyrec, keyserver_spawn): fpr is an
+       array of unsigned bytes.
+
+2004-09-20  Werner Koch  <wk@g10code.com>
+
+       * g10.c: Make -K an alias for --list-secret-keys.
+
+       * keylist.c (print_card_serialno): New. Taken from gnupg 1.9.11.
+       (list_keyblock_print): Make use of it.
+       * keyedit.c (show_key_with_all_names): Print the card S/N.
+
+       * keyedit.c (keyedit_menu): New command ADDCARDKEY.
+       * card-util.c (card_generate_subkey): New.
+       * keygen.c (generate_card_subkeypair): New.
+       (gen_card_key): New arg IS_PRIMARY; changed all callers.
+
+       * cardglue.c (open_card): Use shutdown code if possible.
+       (check_card_serialno): Ditto.
+
+       * ccid-driver.c (do_close_reader): Factored some code out from ...
+       (ccid_close_reader): ..here.
+       (ccid_shutdown_reader): New.
+
+       * apdu.c (apdu_shutdown_reader): New.
+       (shutdown_ccid_reader): New.
+
+2004-09-17  Werner Koch  <wk@g10code.com>
+
+       * g10.c (list_config): New config option ccid-reader-id.
+       (gpgconf_list): Add "reader-port".
+
+       * apdu.c (open_ccid_reader): New arg PORTSTR.  Pass it to
+       ccid_open_reader.
+       (apdu_open_reader): Pass portstr to open_ccid_reader.
+       (apdu_open_reader): No fallback if a full CCID reader id has been
+       given.
+
+       * ccid-driver.c (ccid_get_reader_list): New.
+       (ccid_open_reader): Changed API to take a string for the reader.
+       Removed al the cruft for the libusb development vesion which seems
+       not to be maintained anymore and there are no packages anyway.
+       The stable library works just fine.
+       (struct ccid_reader_id_s): Deleted and replaced everywhere by a
+       simple string.
+       (usb_get_string_simple): Removed.
+       (bulk_in): Do valgrind hack here and not just everywhere.
+
+2004-09-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names, show_prefs): Show preferred
+       keyserver(s) in "showpref" output.
+
+       * keygen.c (keygen_add_keyserver_url), keyedit.c
+       (menu_set_keyserver_url): Allow setting a keyserver URL of "none"
+       to remove an existing keyserver URL.
+
+       * keyedit.c (menu_set_keyserver_url): Confirm replacement of a
+       keyserver URL before overwriting the old one.
+
+2004-09-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgv.c (agent_scd_getattr): Stub.
+
+       * misc.c (get_signature_count): New.  Get the signature count from
+       a smartcard.
+       (pct_expando): Call it here so the %c expando becomes the number
+       of signatures issued.  This allows for notations or the like with
+       an automatic signature count.
+
+       * ccid-driver.c (usb_get_string_simple): Replacement function to
+       work with older libusb.
+
+2004-09-15  Werner Koch  <wk@g10code.com>
+
+       * g10.c [HAVE_LIBUSB]: New option --debug-ccid-driver.
+
+       * ccid-driver.c (read_device_info): Removed.
+       (make_reader_id, scan_or_find_devices): New.
+       (ccid_open_reader): Simplified by make use of the new functions.
+       (ccid_set_debug_level): New.  Changed the macros to make use of
+       it.  It has turned out that it is often useful to enable debugging
+       at runtime so I added this option.
+
+2004-09-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (premerge_public_with_secret): Fix subkey<->binding sig
+       mismatch when some secret subkeys are missing.  Discovered by
+       Michael Roth.
+
+       * main.h, keylist.c (print_subpackets_colon): Make a public
+       function.
+
+       * keyedit.c (print_and_check_one_sig_colon): New.  Print a
+       with-colons version of the sig record.
+       (menu_delsig): Call it here for a with-colons delsig.
+
+2004-09-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keylist.c (print_one_subpacket,
+       print_subpackets_colon): Print a spk record for each request
+       subpacket.
+       (list_keyblock_colon): Call them here.
+
+       * g10.c (parse_subpacket_list, parse_list_options): New.  Make the
+       list of subpackets we are going to print.
+       (main): Call them here.
+
+2004-09-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * card-util.c (fetch_url, card_edit): Use the pubkey URL stored on
+       the card to fetch an updated copy.  Works with either straight
+       URLs or HKP or LDAP keyservers.
+
+       * keyserver-internal.h, keyserver.c (keyserver_import_fprint),
+       import.c (revocation_present): Use a keyserver_spec so the caller
+       can pass in whatever keyserver they like.
+
+2004-09-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * app-openpgp.c (get_cached_data): Avoid mallocing zero since it
+       breaks us when using --enable-m-guard.
+
+       * ccid-driver.c (read_device_info): Fix segfault when usb device
+       is not accessible.
+       (ccid_open_reader): Allow working with an even older version of
+       libusb (usb_busses global instead of usb_get_busses()).
+
+2004-09-09  Werner Koch  <wk@g10code.com>
+
+       * cardglue.h: Add members for CA fingerprints.
+       * cardglue.c (agent_release_card_info): Invalid them.
+       (learn_status_cb): Store them.
+
+       * app-common.h, app-openpgp.c, iso7816.c, iso7816.h
+       * apdu.c, apdu.h, ccid-driver.c, ccid-driver.h
+       * card-util.c: Updated from current gnupg-1.9.
+
+       Changes are:
+
+       * ccid-driver.h (CCID_DRIVER_ERR_ABORTED): New.
+       * ccid-driver.c (ccid_open_reader): Support the stable 0.1 version
+       of libusb.
+       (ccid_get_atr): Handle short messages.
+       * apdu.c (my_rapdu_get_status): Implemented.
+       * apdu.c: Include <signal.h>.
+       * apdu.c (reader_table_s):  Add function pointers for the backends.
+       (apdu_close_reader, apdu_get_status, apdu_activate) 
+       (send_apdu): Make use of them.
+       (new_reader_slot): Intialize them to NULL.
+       (dump_ccid_reader_status, ct_dump_reader_status): New.
+       (dump_pcsc_reader_status): New.
+       (open_ct_reader, open_pcsc_reader, open_ccid_reader) 
+       (open_osc_reader, open_rapdu_reader): Intialize function pointers.
+       (ct_activate_card, ct_send_apdu, pcsc_send_apdu, osc_send_apdu) 
+       (error_string): Removed.  Replaced by apdu_strerror.
+       (get_ccid_error_string): Removed.
+       (ct_activate_card): Remove the unused loop.
+       (reset_ct_reader): Implemented.
+       (ct_send_apdu): Activate the card if not yet done.
+       (pcsc_send_apdu): Ditto.
+       * ccid-driver.h: Add error codes.
+       * ccid-driver.c: Implement more or less proper error codes all
+       over the place.
+       * apdu.c (apdu_send_direct): New.
+       (get_ccid_error_string): Add some error code mappings.
+       (send_apdu): Pass error codes along for drivers already supporting
+       them.
+       (host_sw_string): New.
+       (get_ccid_error_string): Use above.
+       (send_apdu_ccid): Reset the reader if it has not yet been done.
+       (open_ccid_reader): Don't care if the ATR can't be read.
+       (apdu_activate_card): New.
+       (apdu_strerror): New.
+       (dump_reader_status): Only enable it with opt.VERBOSE.
+       * iso7816.c (map_sw): Add mappings for the new error codes.
+       * apdu.c (open_ct_reader, open_pcsc_reader, open_ccid_reader)
+       (reset_ccid_reader, open_osc_reader): Call dump_reader_status only
+       in verbose mode.
+       * app-openpgp.c (do_getattr): Fix for sending CA-FPR.
+       * app-openpgp.c (app_openpgp_readkey): Fixed check for valid
+       exponent.
+       * app-openpgp.c (do_setattr): Sync FORCE_CHV1.
+       * card-util.c (change_login): Kludge to allow reading data from a
+       file.
+       (card_edit): Pass ARG_STRING to change_login.
+       (card_status): Print CA fingerprints.
+       (change_cafpr): New.
+       (card_edit): New command CAFPR.
+
+2004-04-30  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main) <gpgconf>: Use gpg.conf and not /dev/null as
+       default filename.
+
+2004-04-28  Werner Koch  <wk@gnupg.org>
+
+       * card-util.c (card_edit): Remove PIN verification.
+       (generate_card_keys): New arg SERIALNO.  Do PIN verification here
+       after resetting forced_chv1.
+
+       
+2004-09-09  Werner Koch  <wk@g10code.com>
+
+       * signal.c (got_fatal_signal): Do readline cleanup.  Print signal
+       number if we can't print the name. Use new autoconf macro
+       HAVE_DECL_SYS_SIGLIST.
+       (get_signal_name): Removed.
+
+       * photoid.c: Include ttyio.h.
+
+       * parse-packet.c (skip_rest): Removed.  Changed all callers to use
+       the new iobuf_skip_reset.  Orginal patch by Florian Weimer.
+
+2004-09-07  Werner Koch  <wk@g10code.de>
+
+       * photoid.c (generate_photo_id): Use tty_printf and not just
+       printf.  Put _() around one string.
+
+2004-09-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyrec): Force the 'e'xpired flag on as soon
+       as we know the key is definitely expired.  Some translatable
+       string cleanup.
+
+2004-08-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * encode.c, exec.c, g10.c, sign.c: Some translatable string
+       cleanup.  Change some "this" to `this'.
+
+2004-08-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Show log line for what keyserver
+       action we are taking.
+
+       * keyid.c (keystr): If printing a keyid that lacks the high 4
+       bytes, print the low 4 alone.
+       (keystr_from_desc): Handle short keyids and warn on v3
+       fingerprints.
+
+       * keydb.h, getkey.c (get_user_id_printable,
+       get_user_id_string_printable): Rename to get_user_id_native and
+       get_user_id_string_native and remove the printable stuff since
+       we're print-ifying valid utf8 characters.  Change all callers in
+       import.c, sign.c, keylist.c, and encode.c.
+
+       * keyserver.c (keyserver_search_prompt): Make sure the search
+       string is converted from UTF-8 before display.
+
+2004-08-19  Werner Koch  <wk@g10code.de>
+
+       * seskey.c (encode_session_key): Changed the zero random byte
+       substituting code to actually do clever things.  Thanks to
+       Matthias Urlichs for noting the implementation problem.
+
+2004-08-18  Marcus Brinkmann  <marcus@g10code.de>
+
+       * passphrase.c (agent_get_passphrase): Fix detection of gpg-agent
+       cancellation.
+
+2004-08-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * plaintext.c (handle_plaintext): Bigger buffer for extra safety.
+
+       * g10.c (main): New alias --throw-keyid for --throw-keyids, so
+       that it continues to work in old configuration files.  Noted by
+       Jens Adam.
+
+       * pkclist.c (algo_available): --pgp8 now allows blowfish, zlib,
+       and bzip2.
+
+       * status.c (do_get_from_fd): Flush stdout if status isn't flushing
+       it for us.  This guarantees that any menus that were displayed
+       before the prompt don't get stuck in a buffer.  Noted by Peter
+       Palfrader.  This is Debian bug #254072.
+
+       * sign.c (update_keysig_packet): Revert change of 2004-05-18.  It
+       is not appropriate to strip policy and notations when remaking a
+       sig.  That should only happen when specifically requested by the
+       user.
+
+2004-08-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c (radix64_read): No armor CRC is legal according to the
+       spec (the CRC is a MAY).
+
+2004-07-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (argsplit): Properly split quoted args from the keyword
+       and trim whitespace afterwards.
+
+2004-07-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (optsep): Add the ability to understand keyword="quoted
+       arg with spaces" type options.
+
+2004-07-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (list_keyblock_print): Always use the new listing
+       format where uids are always on a line for themselves.  Mark
+       expired secret keys as expired.
+
+       * options.h, g10.c (main): Rename list show-validity to
+       show-uid-validity as it only shows for uids.
+
+       * armor.c (armor_filter): Do not use padding to get us to 8 bytes
+       of header.  Rather, use 2+4 as two different chunks.  This avoids
+       a fake filename of "is".
+
+2004-07-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids): Properly handle remaking a self-sig on
+       revoked or expired user IDs.  Also, once we've established that a
+       given uid cannot or will not be signed, don't continue to ask
+       about each sig.
+
+       * mainproc.c (proc_symkey_enc), seckey-cert.c (do_check): Check
+       the S2K hash algorithm before we try to generate a passphrase
+       using it.  This prevents hitting BUG() when generating a
+       passphrase using a hash that we don't have.
+
+       * sign.c (sign_symencrypt_file): Allow using --force-mdc in --sign
+       --symmetric messages.
+
+       * g10.c (main): Alias --charset as --display-charset to help avoid
+       the continuing confusion and make room for possible changes in
+       devel.
+
+       * parse-packet.c (parse_plaintext): Show the hex value for the
+       literal packet mode since it may not be printable.
+
+       * keygen.c (make_backsig): Make sure that the backsig was built
+       successfully before we try and use it.
+
+       * status.h, status.c (get_status_string), plaintext.c
+       (handle_plaintext): New status tags PLAINTEXT and
+       PLAINTEXT_LENGTH.
+
+2004-06-16  Werner Koch  <wk@gnupg.org>
+
+       * free-packet.c (copy_secret_key): Get last fix right.
+
+2004-06-16  Werner Koch  <wk@gnupg.org>
+
+       * free-packet.c (copy_secret_key): Fixed memory leak when D is not
+       NULL.
+
+       * passphrase.c (passphrase_to_dek): Added a few comments to the
+       code.
+
+2004-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_refresh): Keep track of keys already
+       fetched so we don't do a regular keyserver fetch if the preferred
+       keyserver fetch has exhausted the list.
+
+2004-05-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * verify.c (verify_signatures): Verify multiple files in the same
+       order in which we hashed them when issuing the signature.  Noted
+       by Nicholas Cole.
+
+       * pkclist.c (do_edit_ownertrust): Fix a kbnode leak and do another
+       keyid-format conversion.
+
+2004-05-22  Werner Koch  <wk@gnupg.org>
+
+       * trustdb.c (check_regexp): s/EXP/EXPR/.
+
+       * keyedit.c (trustsig_prompt): Remoev useless range check.
+
+       * options.h: Renamed ctrl to glo_ctrl.  Changed all users.
+
+       * ccid-driver.c (ccid_open_reader): Print a warning when CCID
+       can't be used.
+
+2004-05-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (check_sig_and_print): If we're honoring preferred
+       keyservers, and auto-key-retrieve is set, try and get a missing
+       key from the preferred keyserver subpacket when we verify the sig.
+
+       * gpgv.c (parse_preferred_keyserver, free_keyserver_spec): Stubs.
+
+       * keyserver.c (keyidlist): Use new parse_preferred_keyserver
+       function.
+       (keyserver_work): Use the passed-in keyserver spec rather than the
+       options global one.
+
+       * keyserver-internal.h, keyserver.c (parse_preferred_keyserver):
+       New function to take a sig and return a split out keyserver_spec.
+       (keyserver_import_keyid): Now takes a keyserver_spec.
+
+       * keyserver.c (keyidlist): Go back to the old fast keyid lister.
+       Only merge selfsigs if we have to for honor-keyserver-url.
+       (keyserver_refresh): Keyserver URL handler moved here.
+       (calculate_keyid_fpr): Removed.
+
+       * keydb.h, keyid.c (keystr_from_desc): Calculate a key string from
+       a KEYDB_SEARCH_DESC.
+
+       * keyserver.c (keyserver_spawn): Fix keyserver options on tempfile
+       only platforms.  Noted by Roger Sondermann.
+
+2004-05-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_work): Allow --refresh-keys with a
+       preferred keyserver to happen even if there is no global keyserver
+       set.
+
+       * sig-check.c (do_check_messages): No need to check for Elgamal
+       signatures any longer.
+       (do_check_messages, do_check, check_key_signature2):
+       --keyid-format conversion.
+
+       * pkclist.c (show_paths, edit_ownertrust): Remove some unused
+       code.
+
+       * options.h (ctrl): New for member IN_AUTO_KEY_RETRIEVE.
+
+       * mainproc.c (check_sig_and_print): track whether we are
+       retrieving a key.
+
+       * status.c (status_currently_allowed): New.
+       (write_status_text, write_status_text_and_buffer): Use it here.
+
+       * g10.c: New command --gpgconf-list.
+       (gpgconf_list): New.  From Werner on stable branch.
+
+2004-05-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * pubkey-enc.c (get_session_key, get_it), keyedit.c
+       (show_key_with_all_names, show_basic_key_info): --keyid-format
+       conversion.
+
+2004-05-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (update_keysig_packet): Policies and notations should be
+       stripped out when remaking a self-signature.  Noted by Atom
+       Smasher.
+
+       * keyserver.c (parse_keyserver_uri): Fix compiler warnings.
+
+2004-05-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keyserver-internal.h, keyserver.c
+       (parse_keyserver_uri): Improved URI parser that keeps track of the
+       path information and doesn't modify the input string.
+       (keyserver_spawn): Tell keyserver plugins about the path.
+
+2004-05-11  Werner Koch  <wk@gnupg.org>
+
+       * keylist.c (show_policy_url, show_keyserver_url, show_notation) 
+       (list_one): Use const char* for i18n string helpers.
+
+       * keygen.c (do_generate_keypair, read_parameter_file): Really
+       close the files.
+       (do_generate_keypair): Create the secret key file using safe
+       permissions.  Noted by Atom Smasher.
+
+2004-05-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, mainproc.c (symkey_decrypt_seskey), keyserver.c
+       (struct keyrec, parse_keyrec, keyserver_search_prompt), keyedit.c
+       (keyedit_menu), g10.c (add_keyserver_url, add_policy_url): Fix
+       some compiler warnings.
+
+2004-05-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu, menu_set_keyserver_url): Allow passing
+       preferred keyserver on "keyserver" command line.  Sanity check
+       keyserver URL before accepting it.
+
+       * keyserver-internal.h, g10.c (main), keyserver.c
+       (parse_keyserver_uri): Add an option to require the scheme:// and
+       change all callers.
+       (free_keyserver_spec): Make public.
+
+2004-05-07  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (write_plaintext_packet): Fixed the detection of too
+       large files in the same way as in encode.c.
+
+2004-05-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (show_notation): Use bits to select which sort of
+       notation to show.  Don't allow a not-shown notation to prevent us
+       from issuing the proper --status-fd message.
+
+       * options.h, g10.c (main): Add show-std/standard-notations and
+       show-user-notations.  show-notations is both.  Default is to show
+       standard notations only during verify.  Change all callers.
+
+2004-04-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keylist.c (show_notation): Add argument to show only
+       user notations, only standard notations, or both.  Change all
+       callers.
+
+       * keyserver.c (keyserver_spawn): We still need EXEC_TEMPFILE_ONLY.
+
+2004-04-28  Werner Koch  <wk@gnupg.org>
+
+       * card-util.c (card_edit): Require PIN only for generate. 
+
+       * app-openpgp.c (do_setattr): Sync FORCE_CHV1.
+
+2004-04-27  Werner Koch  <wk@gnupg.org>
+
+       * keyserver.c (keyserver_spawn) [EXEC_TEMPFILE_ONLY]: Removed
+       setting use_temp_file because this option has been removed.
+
+       * g10.c: New commands --allow-admin and --deny-admin.
+       * options.h (opt): Add member ALLOW_ADMIN.
+
+       * tlv.h, tlv.c: New.  Copied from gnupg-1.9. 
+       * cardglue.c (open_card): The serialno is now set internally by
+       app_select_openpgp; changed invocation.
+       * cardglue.h (app_t, ctrl_t): New.
+       (GPG_ERR_EBUSY, GPG_ERR_ENOENT, GPG_ERR_NOT_FOUND, GPG_ERR_BUG) 
+       (GPG_ERR_NOT_IMPLEMENTED, GPG_ERR_EACCESS): New.
+       (gpg_err_code_from_errno): New.
+
+       * app-common.h, app-openpgp.c, iso7816.c, iso7816.h
+       * apdu.c, apdu.h, ccid-driver.c, ccid-driver.h
+       * card-util.c: Updated from current gnupg-1.9.
+
+       Changes are:
+
+       * app-common.h: New members FNC.DEINIT and APP_LOCAL.
+       * app-openpgp.c (do_deinit): New.
+       (get_cached_data, flush_cache_item, flush_cache_after_error)
+       (flush_cache): New.
+       (get_one_do): Replaced arg SLOT by APP.  Make used of cached data.
+       (verify_chv2, verify_chv3): Flush some cache item after error.
+       (do_change_pin): Ditto.
+       (do_sign): Ditto.
+       (do_setattr): Flush cache item.
+       (do_genkey): Flush the entire cache.
+       (compare_fingerprint): Use cached data.
+
+       * apdu.c (apdu_send_le): Reinitialize RESULTLEN.  Handle
+       SW_EOF_REACHED like SW_SUCCESS.
+
+       * ccid-driver.c (parse_ccid_descriptor): Store some of the reader
+       features away.  New arg HANDLE
+       (read_device_info): New arg HANDLE. Changed caller.
+       (bulk_in): Handle time extension requests.
+       (ccid_get_atr): Setup parameters and the IFSD.
+       (compute_edc): New. Factored out code.
+       (ccid_transceive): Use default NADs when required.
+
+       * apdu.h: New pseudo stati SW_HOST_NOT_SUPPORTED,
+       SW_HOST_LOCKING_FAILED and SW_HOST_BUSY.
+       * iso7816.c (map_sw): Map it.
+       
+       * ccid-driver.c (ccid_slot_status): Add arg STATUSBITS.
+       * apdu.c (apdu_get_status): New.
+       (ct_get_status, pcsc_get_status, ocsc_get_status): New stubs.
+       (get_status_ccid): New.
+       (apdu_reset): New.
+       (reset_ct_reader, reset_pcsc_reader, reset_osc_reader): New stubs.
+       (reset_ccid_reader): New.
+       (apdu_enum_reader): New.
+       
+       * apdu.c (lock_slot, trylock_slot, unlock_slot): New helpers.
+       (new_reader_slot) [USE_GNU_PTH]: Init mutex.
+       (apdu_reset, apdu_get_status, apdu_send_le): Run functions
+       in locked mode.
+       
+2004-04-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (get_seckey_byname2): Significantly simplify this
+       function by using key_byname to do the heavy lifting.  Note that
+       this also fixes an old problem when the first key on the secret
+       keyring has an unusable stub primary, but is still chosen.
+
+       * getkey.c (key_byname): If namelist is NULL, return the first key
+       in the keyring.
+
+2004-04-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (make_backsig): If DO_BACKSIGS is not defined, do not
+       create backsigs.
+
+       * getkey.c (merge_selfsigs_subkey): Find 0x19 backsigs on subkey
+       selfsigs and verify they are valid.  If DO_BACKSIGS is not
+       defined, fake this as always valid.
+
+       * packet.h, parse-packet.c (parse_signature): Make parse_signature
+       non-static so we can parse 0x19s in self-sigs.
+
+       * main.h, sig-check.c (check_backsig): Check a 0x19 signature.
+       (signature_check2): Give a backsig warning if there is no or a bad
+       0x19 with signatures from a subkey.
+
+2004-04-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (dump_sig_subpkt, parse_one_sig_subpkt,
+       can_handle_critical): Parse and display 0x19 signatures.
+
+2004-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_uri): Do not accept "http" as an
+       alias for "hkp".  They are not the same thing.
+
+2004-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main): Add keyserver-option
+       honor-keyserver-url.  parse_keyserver_options now returns a
+       success code.
+
+       * keyserver.c (parse_keyserver_options): Return error on failure
+       to parse.  Currently there is no way to fail as any unrecognized
+       options get saved to be sent to the keyserver plugins later.
+       Check length of keyserver option tokens since with =arguments we
+       must only match the prefix.
+       (free_keyserver_spec): Moved code from parse_keyserver_url.
+       (keyserver_work, keyserver_spawn): Pass in a struct keyserver_spec
+       rather than using the global keyserver option.
+       (calculate_keyid_fpr): New.  Fills in a KEYDB_SEARCH_DESC for a
+       key.
+       (keyidlist): New implementation using get_pubkey_bynames rather
+       than searching the keydb directly.  If honor-keyserver-url is set,
+       make up a keyserver_spec and try and fetch that key directly.  Do
+       not include it in the returned keyidlist in that case.
+
+2004-04-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * plaintext.c (handle_plaintext): Accept 'u' as a plaintext mode
+       that requires end of line conversion.  This is being considered
+       for a UTF8 text packet.  If this doesn't take place, no major harm
+       done.  If it does take place, we'll get a jump on starting the
+       changeover.
+
+       * g10.c (main): --no-use-embedded-filename.
+
+       * build-packet.c (calc_plaintext, do_plaintext): Do not create
+       illegal (packet header indicates a size larger than the actual
+       packet) encrypted data packets when not compressing and using a
+       filename longer than 255 characters.
+
+       * keyedit.c (no_primary_warning): Cleanup. (menu_expire): Don't
+       give primary warning for subkey expiration changes.  These cannot
+       reorder primaries.
+
+       * keygen.c (gen_elg, gen_dsa, gen_rsa, do_create,
+       do_generate_keypair, generate_subkeypair): New is_subkey argument
+       to set whether a generated key is a subkey.  Do not overload the
+       ret_sk.  This is some early cleanup to do backsigs for signing
+       subkeys.
+
+       * keygen.c (write_keybinding, do_generate_keypair,
+       generate_subkeypair): Keep track of the unprotected subkey secret
+       key so we can make a backsig with it.
+
+       * keygen.c (make_backsig): New function to add a backsig to a
+       binding sig of signing subkeys.  Currently disabled.
+       (write_keybinding): Call it here, for signing subkeys only.
+
+       * sign.c (make_keysig_packet): Allow generating 0x19 signatures
+       (same as 0x18 or 0x28, but used for backsigs).
+
+       * packet.h, build-packet.c (build_sig_subpkt): Add new
+       SIGSUBPKT_SIGNATURE type for embedded signatures.
+
+       * main.h, misc.c (optsep, argsplit, optlen, parse_options):
+       Simplify code and properly handle a partial match against an
+       option with an argument.
+
+       * keyserver-internal.h, keyserver.c (parse_keyserver_options): Use
+       new optsep and argsplit functions.
+
+2004-04-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, misc.c (argsplit): Refactor argsep into argsplit and
+       argsep so they can be called separately.
+
+       * options.h, keyserver.c (parse_keyserver_options): Remove
+       duplicate code from parse_keyserver_options by calling the generic
+       parse_options.
+
+       * keyserver.c (keyserver_spawn, keyserver_refresh), g10.c (main),
+       gpgv.c (main), mainproc.c (check_sig_and_print), import.c
+       (revocation_present): Change all callers.
+
+2004-04-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, getkey.c (fixup_uidnode, merge_selfsigs_subkey): Keep
+       track of which self-sig we actually chose.
+
+       * keyedit.c (menu_expire, menu_set_primary_uid,
+       menu_set_preferences): Use it here to avoid updating non-used
+       self-sigs and possibly promoting an old self-sig into
+       consideration again.
+
+       * options.h, import.c, keyserver-internal.h, g10.c, mainproc.c,
+       keyserver.c (parse_keyserver_uri): Parse keyserver URI into a
+       structure.  Cleanup for new "guess my keyserver" functionality, as
+       well as refreshing via a preferred keyserver subpacket.
+
+       * options.h: Encapsulate keyserver details.  Change all callers.
+
+2004-04-05  Werner Koch  <wk@gnupg.org>
+
+       * status.h (STATUS_NEWSIG): New.
+       * status.c (get_status_string): Add it. 
+
+2004-03-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Request a trustdb update when adding a
+       new user ID so the new ID gets validity set.  Reported by Owen
+       Taylor.
+
+2004-03-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), compress-bz2.c (init_uncompress):
+       Rename --bzip2-compress-lowmem to --bzip2-decompress-lowmem since
+       it applies to decompression, not compression.
+
+2004-03-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids, show_key_and_fingerprint, ask_revoke_sig,
+       menu_revsig, menu_showphoto): --keyid-format conversion.
+       (menu_addrevoker): Use print_pubkey_info() rather than duplicating
+       code.
+
+2004-03-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (update_min_ownertrust, validate_keys): Do not use
+       keystr functions in log_debug.
+
+       * import.c (import_one): Try and collapse user IDs when importing
+       a key for the first time.
+
+       * keyedit.c (menu_addrevoker): Allow appointing a subkey as a
+       designated revoker if the user forces it via keyid!, so long as
+       the subkey can certify.  Also use the proper date string when
+       prompting for confirmation.
+
+       * g10.c (main): Maintain ordering of multiple Comment lines.
+       Requested by Peter Hyman.
+
+2004-03-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (proc_pubkey_enc, print_pkenc_list, list_node):
+       --keyid-format conversion.
+
+2004-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (skip_unusable, merge_selfsigs_main,
+       premerge_public_with_secret, lookup, get_user_id_string):
+       --keyid-format conversion.
+
+2004-03-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (add_utk, verify_own_keys, update_min_ownertrust,
+       get_validity, ask_ownertrust, validate_keys): --keyid-format
+       conversion.
+
+       * import.c (check_prefs_warning, check_prefs): --keyid-format
+       conversion and a little better text.
+       (import_one, import_secret_one, import_revoke_cert, chk_self_sigs,
+       delete_inv_parts, merge_blocks): Still more --keyid-format
+       conversions.
+
+2004-03-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (print_seckey_info, print_pubkey_info): --keyid-format
+       conversion.
+       (list_keyblock_print): 0xshort should not push us into the new
+       list format since it is not much longer than regular 8-character
+       short keyids.
+
+       * keydb.h, keyid.c (keystr_from_pk, keystr_from_sk): New functions
+       to pull a key string from a key in one step.  This isn't faster
+       than before, but makes for neater code.
+
+       * keylist.c (list_keyblock_print): Use keystr_from_xx here.
+       (print_key_data): No need to pass a keyid in.
+
+2004-03-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyid.c (keyid_from_sk): Minor performance boost by caching
+       secret key keyids so we don't have to calculate them each time.
+
+       * getkey.c (merge_selfsigs_subkey): Do not mark subkeys valid if
+       we do not support their pk algorithm.  This allows for early
+       (during get_*) rejection of a subkey, and selection of another.
+
+       * passphrase.c (passphrase_to_dek): Give a little more information
+       when we have room to do so.
+
+2004-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * revoke.c (export_minimal_pk), export.c (do_export_stream),
+       passphrase.c (passphrase_to_dek), keyserver.c (print_keyrec): A
+       few more places to use --keyid-format.
+
+       * options.h, g10.c (main), export.c (parse_export_options,
+       do_export_stream): Remove --export-all and the "include-non-rfc"
+       export-option as they are no longer meaningful with the removal of
+       v3 Elgamal keys.
+
+       * armor.c (fake_packet, armor_filter): Use the 2440 partial length
+       encoding for the faked plaintext packet.
+
+2004-03-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), mainproc.c (check_sig_and_print):
+       Remove verify-option show-long-keyids and replace with
+       the more general keyid-format.
+
+       * build-packet.c (write_header2): Remove call to start old gpg
+       partial length mode and change all callers.
+       (do_plaintext): Turn off partial length encoding now that we're
+       done writing the packet.
+       (do_comment, do_user_id): Try for a headerlen of 2 since that's
+       the smallest and most likely encoding for these packets.
+
+       * parse-packet.c (parse): Remove call to start old gpg partial
+       length mode.
+
+2004-03-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main): Add a more flexible --keyid-format
+       option to replace the list-option (and eventually verify-option)
+       show-long-keyids.  The format can be short, long, 0xshort, and
+       0xlong.
+
+       * keydb.h, keyid.c (keystr, keystrlen): New functions to generate
+       a printable keyid.
+
+       * keyedit.c (print_and_check_one_sig, show_key_with_all_names),
+       keylist.c (list_keyblock_print): Use new keystr() function here to
+       print keyids.
+
+       * packet.h, free-packet.c (free_encrypted, free_plaintext),
+       parse-packet.c (copy_packet, skip_packet, skip_rest, read_rest,
+       parse_plaintext, parse_encrypted, parse_gpg_control): Use a flag
+       to indicate partial or indeterminate encoding.  This is the first
+       step in some minor surgery to remove the old gpg partial length
+       encoding.
+
+2004-03-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse): Only data-type packets are allowed to
+       use OpenPGP partial length encoding.
+
+2004-02-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * delkey.c (do_delete_key): Allow deleting a public key with a
+       secret present if --expert is set.
+
+       * plaintext.c (handle_plaintext): Make bytecount static so it
+       works with multiple literal packets inside a message.
+
+       * encode.c, helptext.c (keygen.algo, keygen.algo.elg_se), keygen.c
+       (ask_algo), sig-check.c (do_check_messages), skclist.c
+       (build_sk_list): Rename "ElGamal" to "Elgamal" as that is the
+       proper spelling nowadays.  Suggested by Jon Callas.
+
+2004-02-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * plaintext.c: Copyright.
+
+       * encode.c (encode_simple): Show cipher with --verbose.
+
+       * options.h, g10.c (main), keyedit.c (sign_keys): Add
+       --ask-cert-level option to enable cert level prompts during
+       sigs. Defaults to on.  Simplify --default-cert-check-level to
+       --default-cert-level.  If ask-cert-level is off, or batch is on,
+       use the default-cert-level as the cert level.
+
+       * options.h, g10.c (main), trustdb.c (mark_usable_uid_certs):
+       Simplify --min-cert-check-level to --min-cert-level.
+
+2004-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), trustdb.c (mark_usable_uid_certs): Add
+       --min-cert-check-level option to specify minimum cert check level.
+       Defaults to 2 (so 0x11 sigs are ignored).  0x10 sigs cannot be
+       ignored.
+
+2004-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * plaintext.c (handle_plaintext): Properly handle a --max-output
+       of zero (do not limit output at all).
+
+       * keyserver.c (keyserver_spawn): Use the full 64-bit keyid in the
+       INFO header lines, and include "sig:" records for the benefit of
+       people who store their keys in LDAP servers.  It makes it easy to
+       do queries for things like "all keys signed by Isabella".
+
+       * main.h, misc.c (hextobyte): Removed.  It's in libutil.a now.
+
+2004-02-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_export): Disallow user strings that
+       aren't key IDs.
+       (keyserver_import): Clarify error message.
+       (keyserver_spawn): Properly handle 8 bit characters in user IDs in
+       the info lines during SEND.
+
+       * mkdtemp.c: Removed.
+
+       * Makefile.am: We get mkdtemp.c from libutil.a now, so don't link
+       with @LIBOBJS@.
+
+       * keyserver.c (keyserver_spawn): Pass the scheme to the keyserver
+       helper.
+
+2004-02-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), plaintext.c (handle_plaintext): Add
+       --max-output option to help people deal with decompression bombs.
+
+2004-02-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (do_user_id): Do not force a header for attribute
+       packets as they require a new CTB, and we don't support forced
+       headers for new CTBs yet.
+
+2004-02-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (write_header2): If a suggested header length is
+       provided along with a zero length, interpret this as an actual
+       zero length packet and not as an indeterminate length packet.
+       (do_comment, do_user_id): Use it here as these packets might be
+       naturally zero length.
+
+       * parse-packet.c (parse): Show packet type when failing due to an
+       indeterminate length packet.
+
+       * misc.c (parse_options): Only provide args for the true (i.e. not
+       "no-xxx") form of options.
+
+2004-02-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (argsep): Move to misc.c.
+
+       * main.h, misc.c (parse_options), export.c (parse_export_options),
+       import.c (parse_import_options), g10.c (main): Use it here to
+       allow for options with optional arguments.  Change all callers.
+
+       * import.c (check_prefs): Some language fixes.
+       (sec_to_pub_keyblock, import_secret_one): Without knowing the
+       number of MPIs there are, we cannot try and sk-to-pk-ize a key.
+
+2004-02-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (check_prefs): New function to check preferences on a
+       public key to ensure that it does not advertise any that we cannot
+       fulfill.  Use the keyedit command list function to optionally
+       rewrite the prefs.
+       (import_one, import_secret_one): Use it here when importing a
+       public key that we have the secret half of, or when importing a
+       secret key that we have the public half of.
+
+       * main.h, keyedit.c (keyedit_menu): Remove sign_mode and enhance
+       the more general command list functionality to replace it.
+
+       * g10.c (main): Use the general command functionality to implement
+       --sign-key, --lsign-key, --nrsign-key, and --nrlsign-key.
+
+       * import.c (import_one): Do the revocation check even in the case
+       when a key, a revocation key set in a direct key signature, and a
+       revocation from that revocation key, all arrive piecemeal.
+       Needless to say, this is pretty obscure.
+
+2004-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keylist.c (list_keyblock_print): Add
+       "show-unusable-subkeys" list-option to show revoked and/or expired
+       subkeys.
+
+2004-02-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Prompt for subkey removal for both
+       secret and public subkeys.
+
+       * keylist.c (list_keyblock_print), keyedit.c
+       (show_key_with_all_names): Show the revocation date of a
+       key/subkey, and general formatting work.
+
+       * packet.h, getkey.c (merge_selfsigs_main, merge_selfsigs_subkey,
+       merge_selfsigs): Keep track of the revocation date of a key.
+
+       * keydb.h, keyid.c (revokestr_from_pk): New function to print the
+       revocation date of a key.
+
+       * keygen.c (keygen_set_std_prefs): Build the default preferences
+       list at runtime as it properly handles algorithms disabled at
+       build or run time.
+
+       * getkey.c (merge_selfsigs_main): Properly handle expired user IDs
+       when the expired self-sig is not the only self-sig.
+
+       * misc.c (compress_algo_to_string): Return NULL on failure like
+       all of the other xxxx_algo_to_string() functions.
+
+       * mainproc.c (list_node): Minor spacing tweak to match --list-keys
+       output.
+
+       * keylist.c (list_keyblock_print), mainproc.c (list_node): Mark
+       revoked subkeys as revoked.  Requested by Matthew Wilcox.  Revoked
+       overrides expiration when both apply.
+
+       * keyedit.c (show_prefs): Use compress algo constants.
+       (show_basic_key_info): Make revoked and expired tags translatable.
+
+       * g10.c (rm_group): Properly ungroup from a list of groups.
+
+2004-01-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main, rm_group): Add --ungroup command to remove a
+       particular group.
+       (add_group): When adding a group with the same name as an already
+       existing group, merge the two groups.
+       (list_config): Show an error message when listing a config item
+       that doesn't exist.
+       (main): Replace -z0 trick for no compression.
+
+       * packet.h, keyedit.c (show_key_with_all_names_colon), keylist.c
+       (list_keyblock_colon), mainproc.c (list_node, proc_tree): Minor
+       cleanup to remove local_id, which is no longer used.
+
+2004-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c: Set MAX_PK_CACHE_ENTRIES and MAX_UID_CACHE_ENTRIES to
+       PK_UID_CACHE_SIZE (set in ./configure).
+
+       * getkey.c (get_pubkey): When reading key data into the cache,
+       properly handle keys that are partially (pk, no UIDs) cached
+       already.  This is Debian bug #176425 and #229549.
+
+       * compress.c (init_compress, push_compress_filter2): Do the right
+       thing (i.e. nothing) with compress algo 0.
+
+       * main.h, decrypt.c (decrypt_messages): Accept filenames to
+       decrypt on stdin.  This is bug #253.
+
+2004-01-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (list_node): Show sigs with --verbose.
+
+       * options.h, g10.c (set_screen_dimensions): New function to look
+       at COLUMNS and LINES.
+
+       * keyserver.c (parse_keyrec, keyserver_search_prompt), keyedit.c
+       (print_and_check_one_sig): Use new screen dimension variables.
+
+2004-01-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (list_config): New function to dump config options to
+       stdout.  Currently requires --with-colons.
+       (collapse_args): New function to turn argc/argv into a single
+       string.
+       (main): Use it here to pass list_config() more than one argument
+       as a single string.
+       (print_algo_numbers): Helper to print algorithm number for
+       --list-config "pubkey", "cipher", "hash"/"digest", and "compress"
+       config options.
+
+       * packet.h, getkey.c (merge_selfsigs, merge_selfsigs_main),
+       pkclist.c (check_signatures_trust): Indicate who has revoked a key
+       (the owner or a designated revoker).  If a key was revoked by
+       both, prefer the owner.  If a subkey is already revoked by the
+       owner, don't allow a designated revokation of the whole key to
+       override this.  We're still revoked either way, of course.
+       
+       * keyedit.c (print_and_check_one_sig, keyedit_menu): Use the
+       COLUMNS environment variable (if any) to hint how wide the
+       terminal is.  Disabled on _WIN32.  Suggested by Janusz
+       A. Urbanowicz.
+
+2004-01-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (set_attrib_fd): Open attribute fd in binary
+       mode. This isn't meaningful on POSIX systems, but the Mingw builds
+       aren't exactly POSIX.
+
+       * trustdb.c (reset_trust_records): New, faster, implementation
+       that doesn't involve a keyring scan.
+       (clear_validity): Removed.
+
+       * g10.c (main), keydb.h, keydb.c (keydb_rebuild_caches),
+       keyring.h, keyring.c (keyring_rebuild_cache): Add "noisy" flag so
+       cache rebuilds can remain noisy when called for itself, and quiet
+       when called as part of the trustdb rebuild.
+
+       * trustdb.c (validate_keys): Rebuild the sig caches before
+       building the trustdb.  Note that this is going to require some
+       architectual re-thinking, as it is agonizingly slow.
+
+2004-01-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (check_key_signature2): Comments.
+
+       * keyring.c (keyring_rebuild_cache): Clear sig cache for any
+       signatures that we can no longer process (say, if the user removed
+       support for a necessary pubkey or digest algorithm).
+
+2004-01-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (print_cipher_algo_note): May as well call Rijndael AES
+       at this point.
+
+       * keygen.c (do_create), misc.c (openpgp_pk_algo_usage): Remove the
+       last bits of Elgamal type 20 support.
+
+2004-01-03  Stefan Bellon  <sbellon@sbellon.de>
+
+       * compress.c [__riscos__]: Only use RISC OS' own ZLib module if
+       configured to use it.
+
+2003-12-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), import.c (parse_import_options,
+       import_one, import_secret_one), keyserver.c (keyserver_refresh):
+       Change --merge-only to --import-option merge-only.  Deprecate
+       --merge-only.
+
+2003-12-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (pull_in_libs): Dead code.  Removed.
+
+       * sig-check.c (check_revocation_keys): Comments.
+
+       * getkey.c (merge_selfsigs_main): Don't bother to check designated
+       revoker sigs if the key is already revoked.
+
+       * packet.h, getkey.c (merge_selfsigs_main): New "maybe_revoked"
+       flag on PKs.  It is set when there is a revocation signature from
+       a valid revocation key, but the revocation key is not present to
+       verify the signature.
+
+       * pkclist.c (check_signatures_trust): Use it here to give a
+       warning when showing key trust.
+
+       * compress-bz2.c: Include stdio.h.  Solaris 9 has a very old bzip2
+       library and we can at least guarantee that it won't fail because
+       of the lack of stdio.h.
+
+       * tdbio.c: Fixed format string bugs related to the use of DB_NAME.
+       Reported by Florian Weimer.
+
+2003-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keyserver.c (keyserver_opts,
+       parse_keyserver_uri): honor-http-proxy is no longer an option
+       since we can do the same thing with http-proxy with no arguments.
+       Also remove broken-http-proxy since it can be better handled in
+       the HTTP helper.
+
+       * keyserver.c (argsep): New variation on strsep that knows about
+       optional arguments.
+       (parse_keyserver_options): Use it here for optional arguments.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * plaintext.c (handle_plaintext) [__riscos__]: Don't mangle
+       filename if the user specified it.
+
+       * g10.c, gpgv.c [__riscos__]: Removal of unnecessary #ifdef
+       __riscos__ sections.
+
+2003-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (strip_leading_space, get_arg): New.
+       (parse_keyserver_options): Use them here to allow arguments to
+       keyserver-options.  Since none of our options need arguments yet,
+       just pass them through whole to the keyserver helper.
+
+       * main.h, misc.c (parse_options): Add a "noisy" flag to enable and
+       disable the messages about which option didn't match or matched
+       ambiguously.  Change all callers (g10.c, keyserver.c).
+
+       * main.h, import.c (import_options), export.c (export_options):
+       Pass the noisy flag through.
+
+2003-12-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (write_fake_data, do_secret_key), seckey-cert.c
+       (do_check): Use an unsigned length for mpi_get_opaque.
+
+       * options.h: It's impolite to assign -1 to an unsigned
+       opt.force_ownertrust.
+
+       * sig-check.c (cmp_help, do_check), sign.c (do_sign): Remove old
+       unused code.
+
+       * keyid.c (keyid_from_sk): Make sure lowbits is initialized.
+
+2003-12-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (do_check): Move the signing algo and hash checks
+       from here...
+       (signature_check2): ... to here.
+       (check_key_signature2): ... and here.  This is a minor
+       optimization to avoid fetching a key (which can be expensive,
+       especially if it is not self-signed, and there are many key
+       signatures on it which need to be checked for ultimate trust) if
+       the signature would have failed anyway because of algorithm or
+       hash problems.
+
+2003-12-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, build-packet.c (hash_public_key): Remove function ...
+
+       * keydb.h, keyid.c (hash_public_key, do_fingerprint_md): ... and
+       make a new one here that shares code with the fingerprint
+       calculations.  This removes some duplicated functionality, and is
+       also around 14% faster.  (Every bit helps).
+
+       * import.c (import_one): No longer need the Elgamal import
+       warning.
+
+       * getkey.c (get_pubkey_fast): This one is sort of obscure.
+       get_pubkey_fast returns the primary key when requesting a subkey,
+       so if a user has a key signed by a subkey (we don't do this, but
+       used to), AND that key is not self-signed, AND the algorithm of
+       the subkey in question is not present in GnuPG, AND the algorithm
+       of the primary key that owns the subkey in question is present in
+       GnuPG, then we will try and verify the subkey signature using the
+       primary key algorithm and hit a BUG().  The fix is to not return a
+       hit if the keyid is not the primary.  All other users of
+       get_pubkey_fast already expect a primary only.
+
+2003-12-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyid.c (do_fingerprint_md): Remove the rules to hash the old v3
+       Elgamal keys.  They are no longer needed.
+
+       * keyid.c (keyid_from_sk, keyid_from_pk, fingerprint_from_pk,
+       fingerprint_from_sk): Enforce the v3-is-only-RSA rule.  Anything
+       that isn't RSA gets a zero keyid and fingerprint.
+
+       * keyid.c (do_fingerprint_md): Properly handle hashing of keys
+       that we don't know the structure of by using the opaque MPI.
+       (do_fingerprint_md_sk): We cannot calculate the fingerprint from a
+       secret key unless we know the structure (since we can't leave off
+       the secret key parts), so fail early.....
+       (keyid_from_sk, fingerprint_from_sk): .... and return all zeroes.
+
+2003-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (strusage, main): Show development version warning in
+       --version output.
+       (main): Set --bzip2-compress-level to the default value at
+       startup.  Remove --emulate-checksum-bug noop.
+
+       * options.h, g10.c (main), main.h, seskey.c (do_encode_md,
+       encode_md_value), sig-check.c (do_check), sign.c (do_sign): Remove
+       --emulate-md-encode-bug as it only applied to Elgamal signatures,
+       which are going away.
+
+2003-11-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (proc_symkey_enc, proc_encrypted): Add ability to use
+       --override-session-key on --symmetric messages (new-style or
+       old-style).
+       (proc_pubkey_enc): Move code to show session key from here to
+       proc_encrypted() so it can work with any type of message.
+       Suggested by Michael Young.
+
+2003-11-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (validate_keys): Reset the trustdb before checking if
+       we have any ultimately trusted keys.  This ensures that if we lose
+       all our ultimately trusted keys, we don't leave behind the old
+       validity calculations.  Noted by Peter Palfrader.
+
+       * revoke.c (gen_desig_revoke): Specify in the comment when a
+       designated revocation is generated.
+
+       * getkey.c (merge_selfsigs_main, merge_selfsigs_subkey,
+       get_seckey_byname2): Remove Elgamal check since we are removing
+       type 20 keys altogether.
+
+2003-11-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (build_pk_list): Do not allow an empty PK list in
+       interactive mode.
+
+       * keygen.c (ask_algo): Remove ability to generate Elgamal
+       sign+encrypt keys.
+
+       * getkey.c (merge_selfsigs_main, merge_selfsigs_subkey,
+       get_seckey_byname2): Disallow use of sign+encrypt Elgamal keys.
+
+2003-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * seskey.c (do_encode_md): Comment about earlier (pre-PGP 2.3)
+       encodings.
+
+       * misc.c (compress_algo_to_string): Translate "Uncompressed".
+       Requested by Tommi Vainikainen.
+       (string_to_compress_algo): Include multi-string for
+       "uncompressed|none".
+
+2003-11-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), compress-bz2.c (init_uncompress): Add
+       --bz2-compress-lowmem to set bzlib "small" flag for low memory
+       (but slow) decompression.
+
+2003-11-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * compress.c (init_compress): Remove compress level 10 trick,
+       since it is no longer needed.
+
+       * g10.c: Fix typoed option name.
+
+       * compress-bz2.c (init_compress): Compression level 0 is not
+       meaningful for bzip2.
+
+       * options.h, g10.c (main), compress.c (init_compress),
+       compress-bz2.c (init_compress): Add --compress-level and
+       --bzip2-compress-level.  -z sets them both.  Change various
+       callers.
+
+       * encode.c (encode_simple), sign.c (sign_symencrypt_file):
+       Properly use default_compress_algo (--compress-algo, followed by
+       the highest --personal-compress-preference, followed by ZIP) to
+       get the algorithm.
+
+2003-11-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, trustdb.c (trust_model_string, init_trustdb): Add
+       support for "external" trust model, where the user can provide a
+       pregenerated trustdb.
+
+       * keyedit.c (keyedit_menu): Do not allow editing ownertrust with
+       an external trust model trustdb.
+
+2003-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c, keyedit.c, keylist.c, mainproc.c: Clarify the
+       plurarility (or not) of various list and verify options.
+
+2003-11-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --symmetric --sign --encrypt.
+
+       * main.h, encode.c (setup_symkey): New.  Prompt for a passphrase
+       and create a DEK for symmetric encryption.
+       (write_symkey_enc): New.  Write out symmetrically encrypted
+       session keys.
+       (encode_crypt, encrypt_filter): Use them here here when creating a
+       message that can be decrypted with a passphrase or a pk.
+
+       * sign.c (sign_file): Call setup_symkey if we are doing a
+       --symmetric --sign --encrypt.
+
+2003-11-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (proc_symkey_enc): Don't show algorithm information
+       when --quiet is set.  Suggested by Duncan Harris.  Also don't fail
+       with BUG() when processing a --symmetric message with a cipher we
+       don't have.
+
+       * g10.c: Alias --personal-xxx-prefs to --personal-xxx-preferences.
+
+       * pkclist.c (build_pk_list): When adding recipients interactively,
+       allow the user to stop at any point.
+
+2003-10-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (register_trusted_keyid): New.  Adds a
+       keyid to the list of ultimately trusted keys.
+
+       * keygen.c (do_generate_keypair): Use it here so that the ultimate
+       ownertrust happens before the trustdb (might be) rebuilt.  Also
+       fix an error where the newly generated pk is thought to be a
+       subkey by the trustdb.
+
+       * g10.c (main): Fix --export-all do actually do something
+       different than --export.
+
+       * pkclist.c (build_pk_list): Show all recipients rather than
+       showing each recipient as they are added.
+
+       * mainproc.c (proc_symkey_enc, proc_encrypted): Keep a count of
+       the number of passphrases that can decrypt a symmetric or mixed
+       symmetric/pk message and include it in the list of keys shown to
+       the user.
+
+2003-10-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (compress_algo_to_string, string_to_compress_algo,
+       check_compress_algo): Add bzip2.
+
+       * compress.c (compress_filter): Make static to help force the use
+       of push_compress_filter.  Remove default algorithm setting since
+       that is done in push_compress_filter now.
+
+       * main.h: Use named algorithm.
+
+       * filter.h, compress.c (push_compress_filter,
+       push_compress_filter2): New.  Figure out which is the appropriate
+       compression filter to use, and push it into place.
+
+       * compress.c (handle_compressed), encode.c (encode_simple,
+       encode_crypt), sign.c (sign_file, sign_symencrypt_file), import.c
+       (read_block), export.c (do_export): Use push_compress_filter
+       instead of pushing the compression filter ourselves.
+
+       * compress-bz2.c: New.  Bzlib versions of the compression filter
+       routines.
+
+       * Makefile.am: Include compress-bz2.c if bz2lib is available.
+
+2003-10-30  Werner Koch  <wk@gnupg.org>
+
+       * apdu.c (close_ct_reader, close_pcsc_reader): Implemented.
+       (get_ccid_error_string): New.  Not very useful messages, though.
+
+2003-10-29  Werner Koch  <wk@gnupg.org>
+
+       * cardglue.c (open_card): Ask for card insertion.
+       (check_card_serialno): New.
+       (agent_scd_pksign, agent_scd_pkdecrypt): Use it here.
+       * cardglue.c (open_card): Issue insertion status message.
+       * status.h, status.c (STATUS_CARDCTRL): New.
+
+       * status.c (cpr_get_answer_okay_cancel): New.
+
+2003-10-28  Werner Koch  <wk@gnupg.org>
+
+       * keylist.c (list_keyblock_print): Denote secrets keys stored on a
+       card with an '>'. Print the '#' also for subkeys.
+       (list_keyblock_colon): Introduce new field 15 for sec/ssb to print
+       the serial number.
+
+2003-10-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Enhance the version-specific config file code to
+       try for more specific matches before giving up (e.g. 1.3.3-cvs,
+       1.3.3, 1.3, 1).
+
+2003-10-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --symmetric --encrypt command.  This generates
+       a message that can be decrypted via a passphrase or public key
+       system.
+
+       * main.h, encode.c (encode_seskey): Allow passing in an
+       already-created session key dek.
+       (encode_simple): Use the actual symmetric cipher when encrypting a
+       session key for a symmetric message.
+       (encode_crypt): Add a flag to trigger a hybrid mode that can be
+       decrypted via a passphrase or a pk.  Change all callers.
+
+       * mainproc.c (symkey_decrypt_sesskey): There is no way to tell the
+       difference here between a bad passphrase and a cipher algorithm
+       that we don't have, so use a error message that makes that clear.
+       Use the actual list of ciphers when checking whether a cipher is
+       invalid.  Return error if the decrypted cipher algorithm is
+       invalid.
+       (proc_symkey_enc): In a mixed passphrase/pk message, if a valid
+       dek already exists from decrypting via pk, do not try to process
+       the passphrase.
+       (proc_symkey_enc): Indicate when we're decrypting a session key as
+       opposed to decrypting data.  If a passphrase is invalid, discard
+       the dek so we'll keep trying.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * ccid-driver.c (ccid_open_reader): Return an error if no USB
+       devices are found.
+
+       * Makefile.am: Replaced INTLLIBS by LIBINTL.
+
+       * g10.c (main) [ENABLE_CARD_SUPPORT]: Add a default for
+       --pcsc-driver.
+
+       * cardglue.c (learn_status_cb): Fixed faulty use of !space.
+
+2003-10-24  Werner Koch  <wk@gnupg.org>
+
+       * apdu.c (apdu_open_reader): Hacks for PC/SC under Windows.
+
+2003-10-21  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (ask_passphrase): Add optional promptid arg.
+       Changed all callers.
+       * cardglue.c (pin_cb): Use it here, so the machine interface can
+       tell whether the Admin PIN is requested.
+
+       * cardglue.c (agent_scd_checkpin): New.
+
+       * misc.c (openpgp_pk_algo_usage): Added AUTH usage.
+
+       * app-openpgp.c (check_against_given_fingerprint): New. Factored
+       out that code elsewhere.
+       (do_check_pin): New.
+       * card-util.c (card_edit): New command "passwd".  Add logic to
+       check the PIN in advance.
+       (card_status): Add new args to return the serial number.  Changed
+       all callers.
+
+2003-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_one): Show the keyid when giving the Elgamal
+       slow import warning.
+
+       * g10.c (main): Older versions used --comment "" to indicate no
+       comment.  Don't add an empty comment.
+
+2003-10-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names): Ownertrust is only
+       meaningful for the PGP or classic trust models.  Both validity and
+       ownertrust are not meaningful for the always trust model.
+
+2003-10-11  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c: Always enable the gen_card_key prototype.
+
+2003-10-10  Werner Koch  <wk@gnupg.org>
+
+       * cardglue.c (card_close): New.
+       (agent_scd_change_pin): Implemented.
+
+       * ccid-driver.c (ccid_close_reader): New.
+       * apdu.c (close_ccid_reader, close_ct_reader, close_csc_reader)
+       (close_osc_reader, apdu_close_reader): New.  Not all are properly
+       implemented yet.
+       * g10.c (g10_exit): Use close_card.
+
+2003-10-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Give a deprecated option warning for
+       --show-keyring, --show-photos, --show-policy-url, --show-notation,
+       and their respective no- forms.
+
+       * options.skel: Remove show-photos and replace with
+       list/verify-options show-photos.  Remove no-mangle-dos-filenames.
+
+       * misc.c (parse_options): Allow for incomplete (but unambiguous)
+       options.
+
+2003-10-09  Werner Koch  <wk@gnupg.org>
+
+       * ccid-driver.c (ccid_transceive): Add T=1 chaining for sending.
+
+       * sign.c (do_sign) [!ENABLE_CARD_SUPPORT]: Return an error for
+       card keys.
+
+       * cardglue.c (agent_scd_pkdecrypt): Implemented.
+       * pubkey-enc.c (get_it) [ENABLE_CARD_SUPPORT]: Divert decryption
+       to card
+
+2003-10-08  Werner Koch  <wk@gnupg.org>
+
+       * cardglue.c (pin_cb): Detect whether an admin or regular PIN is
+       requested.
+       (genkey_status_cb): New.
+       (agent_scd_genkey): Implemented.
+
+       * keygen.c (generate_keypair): New arg CARD_SERIALNO and prepare
+       parameters for on card key generation. Changed all callers.
+       (do_generate_keypair): Add new arg card and merged casrd specific
+       changes from 1.9.
+       (proc_parameter_file): New arg card, apss it down to
+       do_generate_keypair and changed all callers.
+       (gen_card_key): New.
+
+       * g10.c: Include cardclue.h.
+       (main): s/app_set_default_reader_port/card_set_reader_port/.
+       * cardglue.c (card_set_reader_port): New to address include file
+       issues.
+
+2003-10-02  Werner Koch  <wk@gnupg.org>
+
+       * cardglue.c (learn_status_cb): Release values before assignment
+       so that it can be used by getattr to update the structure.
+       (agent_scd_getattr): New.
+
+       * keylist.c (print_pubkey_info): Add FP arg for optional printing
+       to a stream.  Changed all callers.
+
+2003-10-01  Werner Koch  <wk@gnupg.org>
+
+       * app-common.h, app-openpgp.c, iso7816.c, iso7816.h, apdu.c
+       * apdu.h, ccid-driver.c, ccid-driver.h, card-util.c: Updated
+       from current GnuPG 1.9. Changes over there are:
+       * card-util.c: Tweaked to use this source also under 1.3. 
+       (card_edit): New command "forcesig".
+       * card-util.c (print_name, print_isoname): Use 0 and not LF fro
+       the max_n arg of tty_print_utf8_string2.
+       * card-util.c (change_pin): Simplified.  We now have only a PIN
+       and an Admin PIN.
+       * ccid-driver.c: Detect GnuPG 1.3 and include appropriate files.
+       * apdu.c: Ditto.
+       * app-openpgp.c: Ditto.
+       * iso7816.c: Ditto.
+       (generate_keypair): Renamed to ..
+       (do_generate_keypair): .. this.
+       * app-common.h [GNUPG_MAJOR_VERSION]: New.
+       * iso7816.h [GNUPG_MAJOR_VERSION]: Include cardglue.h
+       * app-openpgp.c (do_change_pin): Make sure CVH1 and CHV2 are
+       always synced.
+       (verify_chv2, verify_chv3): New. Factored out common code.
+       (do_setattr, do_sign, do_auth, do_decipher): Change the names of
+       the prompts to match that we have only 2 different PINs.
+       (app_select_openpgp): Check whether the card enforced CHV1.
+       (convert_sig_counter_value): New. Factor out code from
+       get_sig_counter.
+
+       * Makefile.am (card_support_source): Depend on new AM conditional
+       to get the ifdef ENABLE_CARD_SUPPORT off the way from source
+       copied files.
+       (update-source-from-gnupg-2): Maintainer helper.
+       
+2003-10-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --no-groups to zero --group list.
+
+       * encode.c (encode_simple): Allow for 32 bytes (256 bits) of
+       symmetrically encrypted session key.  Use --s2k-cipher-algo to
+       choose cipher, rather than the default cipher.
+
+       * parse-packet.c (parse_subkeyenc): Give a warning if an
+       symmetrically encrypted session key is seen without salt.  Show in
+       --list-packets if a symetrically encrypted session key is present.
+
+       * pubkey-enc.c (get_it): Always show cipher-not-in-prefs warning
+       unless --quiet is set.  Use text name of cipher in warning.
+
+2003-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), mainproc.c (check_sig_and_print): Add
+       --verify-option show-unusable-uids.
+
+       * gpgv.c (check_trustdb_stale): Stub.
+
+       * trustdb.c (get_validity): Move the up-to-date check to
+       check_trustdb_stale (new), so that it can be called before
+       validity is checked.
+       
+       * keylist.c (list_keyblock_print): Disable the overall key
+       validity display until it can be thought about more.  Use
+       check_trustdb_stale here to avoid putting the check warning in the
+       middle of a listed key.
+
+       * trustdb.c (init_trustdb): Only verify_own_keys() for those trust
+       models that it applies to (i.e. classic and OpenPGP).
+
+2003-09-29  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (do_add_key_flags, parse_parameter_usage): Add support
+       the proposed AUTH key flag.
+       * getkey.c (fixup_uidnode, merge_selfsigs_main) 
+       (merge_selfsigs_subkey, premerge_public_with_secret): Ditto.
+       * keylist.c (print_capabilities): Ditto.
+
+       * parse-packet.c (parse_key): Allow to parse the divert-to-card
+       S2K mode.
+       * build-packet.c (do_secret_key): Handle divert-to-card S2K
+       * seckey-cert.c (is_secret_key_protected): Ditto.
+       (check_secret_key): Ditto.
+
+       * keygen.c (do_ask_passphrase): Renamed from ask_passphrase.
+       * passphrase.c (ask_passphrase): New.
+
+2003-09-28  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): New commands --card-edit, --card-status and
+       --change-pin.  New options --ctapi-driver, --pcsc-driver and
+       --disable-ccid
+       * options.h (DBG_CARD_IO): New.
+       * cardglue.c, cardclue.h: Enhanced.
+       * card-util.c: New. Taken from current the gnupg 1.9 branch.
+       * app-common.h, app-openpgp.c, iso7816.c, iso7816.h, apdu.c
+       * apdu.h, ccid-driver.c, ccid-driver.h: New.  Takem from the current
+       gnupg 1.9 branch withy minor changes to include directives.
+       * Makefile.am: Added these files.
+       
+2003-09-27  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (do_sign) [ENABLE_CARD_SUPPORT]: Divert to card.
+       * cardglue.c, cardglue.h: New.
+       * Makefile.am (gpg_LDADD): Added.
+       (card_support_sources): New.
+       
+2003-09-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keylist.c (list_keyblock_print): Add
+       "show-unusable-uids" list-option to show revoked and/or expired
+       user IDs.
+
+2003-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names): Show names a little neater
+       by putting the [revoked] or [expired] in the space used for the
+       [validity].  There is also no point in showing "[unknown]
+       [revoked]".
+
+2003-09-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (mk_notation_policy_etc): Capitalize "URL".
+
+       * trustdb.c (validate_keys): Give a little more information while
+       rebuilding trustdb.
+
+       * pkclist.c (do_edit_ownertrust): Clarify "don't know".
+
+       * g10.c (main): Default to --no-mangle-dos-filenames.
+
+       * keydb.h, keyring.c (keyring_search), trustdb.c (search_skipfnc):
+       Expand the skipfnc to include a pointer to the user ID that
+       matched.
+
+       * getkey.c (skip_disabled): Rename to skip_unusable, and add
+       checks for expired or revoked user IDs.
+
+2003-09-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Deprecate --default-comment in favor of
+       --no-comments.
+
+       * options.h, g10.c (main), armor.c (armor_filter): Allow using
+       --comment multiple times to get multiple Comment: header lines.
+       --no-comments resets list.
+
+2003-09-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Trim --help to commonly used options.  Remove -f.
+
+2003-09-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Error out if --multifile is used with the commands
+       that don't support it yet (--sign, --clearsign, --detach-sign,
+       --symmetric, and --store).
+
+       * g10.c (main): Add --multifile as an alias to turn --encrypt into
+       --encrypt-files (plus --verify-files, --decrypt-files).
+
+       * encode.c (use_mdc), g10.c (main): Use RFC1991 and RFC2440
+       directly to check for MDC usability.  Do not set the force_mdc or
+       disable_mdc flags since there is no point any longer.
+
+2003-09-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c (parse_hash_header, armor_filter), g10.c (print_hex,
+       print_mds), pkclist.c (algo_available): Drop TIGER/192 support.
+
+2003-09-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names): Fix assertion failure when
+       using toggle to see a secret key.  Reported by Maxim Britov.
+
+2003-08-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (add_keyserver_url), keyedit.c (keyedit_menu), sign.c
+       (mk_notation_policy_etc): Clarify a few strings.  It's a
+       "preferred keyserver URL".
+
+       * g10.c (main): Use "keyserver-url" instead of
+       "preferred-keyserver" for the sake of short and simple commands.
+
+2003-08-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keygen.c (keygen_add_keyserver_url): Signature callback
+       for adding a keyserver URL.
+
+       * keyedit.c (keyedit_menu, menu_set_keyserver_url): New command to
+       set preferred keyserver to specified (or all) user IDs.
+
+       * build-packet.c (build_sig_subpkt): Set preferred keyserver flag
+       while building a preferred keyserver subpacket.
+
+       * keylist.c (show_policy_url, show_keyserver_url): URLs might be
+       UTF8.
+
+       * keyedit.c (menu_addrevoker): Fix leaking a few bytes.
+
+2003-08-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names): Use list-option
+       show-long-keyid in main --edit-key display.
+
+       * keyedit.c (print_and_check_one_sig): Use list-option
+       show-long-keyid in --edit-key "check" function.
+
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * passphrase.c (agent_send_all_options): Make use of $GPG_TTY.
+
+       * g10.c (main): Disable use-agent if passphrase-fd is given
+       later. Suggested by Kurt Garloff.
+
+       * exec.c, g10.c, gpgv.c, passphrase.c, photoid.c:
+       s/__MINGW32__/_WIN32/ to help building on native Windows
+       compilers.  Requested by Brian Gladman.  From Werner on stable
+       branch.
+
+2003-08-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main): Add list-option
+       list-preferred-keyserver.
+
+       * keyedit.c (change_passphrase): When responding 'no' to the blank
+       passphrase question, re-prompt for a new passphrase.  This is bug
+       #202.
+
+       * mainproc.c (check_sig_and_print): Use two different preferred
+       keyserver displays - one if the key is not present (to tell the
+       user where to get the key), the other if it is present (to tell
+       the user where the key can be refreshed).
+
+       * packet.h, parse-packet.c (parse_signature): Set flag if a
+       preferred keyserver is present.
+
+       * keylist.c (list_keyblock_print): Show keyserver url in listings
+       with list-option show-keyserver-url.
+
+2003-08-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use NETLIBS instead of EGDLIBS.
+
+       * mainproc.c (check_sig_and_print): Get the uid validity before
+       printing any sig results to avoid munging the output with trustdb
+       warnings.
+
+       * g10.c (main): Don't include --show-keyring in --help as it is
+       deprecated.
+
+2003-08-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgv.c: Remove extra semicolon (typo).
+
+       * options.skel: Note that keyserver.pgp.com isn't synchronized,
+       and explain the roundrobin a bit better.
+
+       * sig-check.c (check_key_signature2), import.c (import_one,
+       import_revoke_cert, chk_self_sigs, delete_inv_parts,
+       collapse_uids, merge_blocks): Make much quieter during import of
+       slightly munged, but recoverable, keys. Use log_error for
+       unrecoverable import failures.
+
+       * keyring.c (keyring_rebuild_cache): Comment.
+
+       * sign.c (mk_notation_and_policy): Making a v3 signature with
+       notations or policy urls is an error, not an info (i.e. increment
+       the errorcount). Don't print the notation or policy url to stdout
+       since it can be mixed into the output stream when piping and munge
+       the stream.
+
+2003-08-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, sig-check.c (signature_check2, do_check,
+       do_check_messages): Provide a signing-key-is-revoked flag.  Change
+       all callers.
+
+       * status.h, status.c (get_status_string): New REVKEYSIG status tag
+       for a good signature from a revoked key.
+
+       * mainproc.c (do_check_sig, check_sig_and_print): Use it here.
+
+       * import.c (import_revoke_cert, merge_blocks, merge_sigs): Compare
+       actual signatures on import rather than using keyid or class
+       matching.  This does not change actual behavior with a key, but
+       does mean that all sigs are imported whether they will be used or
+       not.
+
+       * parse-packet.c (parse_signature): Don't give "signature packet
+       without xxxx" warnings for experimental pk algorithms.  An
+       experimental algorithm may not have a notion of (for example) a
+       keyid (i.e. PGP's x.509 stuff).
+
+2003-08-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keylist.c (list_keyblock_print),
+       keyedit.c (print_and_check_one_sig): New "show-sig-expire"
+       list-option to show signature expiration dates (if any).
+
+2003-07-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main, add_keyserver_url): Add
+       --sig-preferred-keyserver to implant a "where to get my key"
+       subpacket into a signature.
+
+       * sign.c (mk_notation_and_policy): Rename to
+       mk_notation_policy_etc and add preferred keyserver support for
+       signatures.
+
+2003-07-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (do_add_key_flags): Don't set the certify flag for
+       subkeys.
+       (ask_algo): Provide key flags for DSA, Elgamal_e, and Elgamal
+       subkeys.
+       (generate_keypair): Provide key flags for the default DSA/Elgamal
+       keys.
+
+       * sig-check.c (signature_check, signature_check2,
+       check_key_signature, check_key_signature2): Allow passing NULLs
+       for unused parameters in the x2 form of each function to avoid the
+       need for dummy variables. getkey.c, mainproc.c: Change all
+       callers.
+
+       * trustdb.h, trustdb.c (read_trust_options): New.  Returns items
+       from the trustdb version record.
+
+       * keylist.c (public_key_list): Use it here for the new "tru"
+       record.
+
+       * gpgv.c (read_trust_options): Stub.
+
+2003-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names): Use list-option
+       show-validity in --edit-key interface as well.
+
+2003-07-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), mainproc.c (check_sig_and_print): Add
+       verify-options "show-validity" and "show-long-keyid" to show
+       trustdb validity and long keyids during (file) signature
+       verification.
+
+       * packet.h, main.h, sig-check.c (signature_check2,
+       check_key_signature2, do_check): If ret_pk is set, fill in the pk
+       used to verify the signature.  Change all callers in getkey.c,
+       mainproc.c, and sig-check.c.
+
+       * keylist.c (list_keyblock_colon): Use the ret_pk from above to
+       put the fingerprint of the signing key in "sig" records during a
+       --with-colons --check-sigs.  This requires --no-sig-cache as well
+       since we don't cache fingerprints.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse_signature): No need to reserve 8 bytes for
+       the unhashed signature cache any longer.
+
+       * misc.c (pct_expando): Add two new expandos - signer's
+       fingerprint (%g), and signer's primary fingerprint (%p).
+
+       * Makefile.am: Include W32LIBS where appropriate.
+
+       * g10.c (main): Add --rfc2440 alias for --openpgp since in a few
+       months, they won't be the same thing.
+
+       * keyserver.c (parse_keyserver_uri): Accept "http" as an alias for
+       "hkp", since it is occasionally written that way.
+       (keyserver_spawn): Use ascii_isspace to avoid locale issues.
+
+       * keygen.c (ask_user_id): Make --allow-freeform-uid apply to the
+       email field as well as the name field, and allow mixing fields
+       when it is set.
+
+       * options.skel: Use subkeys.pgp.net as the default keyserver.
+
+       * trustdb.c (validate_one_keyblock): Certifications on revoked or
+       expired uids do not count in the web of trust.
+
+       * signal.c (init_one_signal, pause_on_sigusr, do_block): Only use
+       sigprocmask() if we have sigset_t, and only use sigaction() if we
+       have struct sigaction.  This is for Forte c89 on Solaris which
+       seems to define only the function call half of the two pairs by
+       default.
+       (pause_on_sigusr): Typo.
+       (do_block): If we can't use sigprocmask() and sigset_t, try to get
+       the number of signals from NSIG as well as MAXSIG, and if we
+       can't, fail with an explanation.
+
+       * signal.c, tdbio.c: Comment out the transaction code.  It was not
+       used in this version, and was causing some build problems on
+       quasi-posix platforms (Solaris and Forte c89).
+
+       * keylist.c (list_keyblock_colon): Don't include validity values
+       when listing secret keys since they can be incorrect and/or
+       misleading.  This is a temporary kludge, and will be handled
+       properly in 1.9/2.0.
+
+       * mainproc.c (check_sig_and_print): Only show the "key available
+       from" preferred keyserver line if the key is not currently
+       present.
+
+       * keyedit.c (sign_uids): Do not sign expired uids without --expert
+       (same behavior as revoked uids).  Do not allow signing a user ID
+       without a self-signature.  --expert overrides.  Add additional
+       prompt to the signature level question.
+       (menu_expire): When changing expiration dates, don't replace
+       selfsigs on revoked uids since this would effectively unrevoke
+       them. There is also no point in replacing expired selfsigs.  This
+       is bug #181
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com> (from Werner on stable branch)
+
+       * g10.c (add_notation_data): Make sure that only ascii is passed
+       to iscntrl.  Noted by Christian Biere.
+       * getkey.c (classify_user_id2): Replaced isspace by spacep
+       * keygen.c (ask_user_id): Ditto.
+       (get_parameter_algo): Ditto.
+       * keyedit.c (keyedit_menu): Ditto.
+       * tdbdump.c (import_ownertrust): Ditto.  s/isxdigit/hexdigitp/.
+       * revoke.c (ask_revocation_reason): 
+       * keyserver.c (keyserver_spawn): Dito.
+
+2003-06-10  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (parse): Disallow old style partial length for
+       all key material packets to avoid possible corruption of keyrings.
+
+2003-06-08  Werner Koch  <wk@gnupg.org>
+
+       * import.c (import_keys_internal): Invalidate the cache so that
+       the file descriptor gets closed.  Fixes bug reported by Juan
+       F. Codagnone.
+
+2003-06-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Use new hkp://subkeys.pgp.net as sample keyserver
+       since they at least handle subkeys correctly.
+
+       * options.h, g10.c (main), main.h, keylist.c (show_keyserver_url),
+       mainproc.c (check_sig_and_print), parse-packet.c (dump_sig_subpkt,
+       parse_one_sig_subpkt, can_handle_critical): Add read-only support
+       for preferred keyserver subpackets.  They're basically policy URLs
+       with a different name.  Add a verify-option
+       "show-preferred-keyserver" to turn them on and off (on by default,
+       as per stable branch).
+
+       * g10.c (main): Add "--set-notation" as alias to "--notation-data"
+       this is to make things consistent with --set-policy-url meaning
+       both sigs and certs.
+
+2003-06-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keylist.c (list_keyblock_print): Add
+       "show-validity" and "show-long-keyid" list-options.
+
+       * gpgv.c (get_validity, trust_value_to_string): Stubs.
+
+       * g10.c (main): Use SAFE_VERSION instead of VERSION in the
+       version-specific gpg.conf file so it can be overridden on RISCOS.
+
+2003-06-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main), keylist.c (show_policy_url, show_notation),
+       mainproc.c (check_sig_and_print): Emulate the old policy and
+       notation behavior (display by default).  Send to status-fd whether
+       it is displayed on the screen or not.
+
+       * g10.c (main): Since we now have some options in devel that won't
+       work in a stable branch gpg.conf file, try for a version-specific
+       gpg.conf-VERSION file before falling back to gpg.conf.
+
+       * main.h, options.h: Move various option flags to options.h.
+
+2003-05-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (check_sig_and_print), main.h, keylist.c
+       (show_policy, show_notation): Collapse the old print_notation_data
+       into show_policy() and show_notation() so there is only one
+       function to print notations and policy URLs.
+
+       * options.h, main.h, g10.c (main), keyedit.c
+       (print_and_check_one_sig), keylist.c (list_one,
+       list_keyblock_print), pkclist.c (do_edit_ownertrust), sign.c
+       (mk_notation_and_policy): New "list-options" and "verify-options"
+       commands.  These replace the existing
+       --show-photos/--no-show-photos,
+       --show-notation/--no-show-notation,
+       --show-policy-url/--no-show-policy-url, and --show-keyring
+       options.  The new method is more flexible since a user can specify
+       (for example) showing photos during sig verification, but not in
+       key listings.  The old options are emulated.
+
+       * main.h, misc.c (parse_options): New general option line
+       parser. Fix the bug in the old version that did not handle report
+       syntax errors after a valid entry.
+
+       * import.c (parse_import_options), export.c
+       (parse_export_options): Call it here instead of duplicating the
+       code.
+
+2003-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (list_one): Don't show the keyring filename when in
+       --with-colons mode.  Actually translate "Keyring" string.
+
+       * mainproc.c (proc_tree): We can't currently handle multiple
+       signatures of different classes or digests (we'd pretty much have
+       to run a different hash context for each), but if they are all the
+       same, make an exception.  This is Debian bug #194292.
+
+       * sig-check.c (check_key_signature2): Make string translatable.
+
+       * packet.h, getkey.c (fixup_uidnode): Mark real primary uids
+       differently than assumed primaries.
+
+       * keyedit.c (no_primary_warning): Use the differently marked
+       primaries here in a new function to warn when an --edit-key
+       command might rearrange the self-sig dates enough to change which
+       uid is primary.
+       (menu_expire, menu_set_preferences): Use no_primary_warning()
+       here.
+
+       * Makefile.am: Use @DLLIBS@ for -ldl.
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (premerge_public_with_secret): Made "no secret subkey
+       for" warning a verbose item and translatable. (From wk on stable
+       branch)
+
+       * sig-check.c (check_key_signature2): Made "no subkey for subkey
+       binding packet" a verbose item instead of a !quiet one.  There are
+       too many garbled keys out in the wild. (From wk on stable branch)
+
+       * filter.h: Remove const from WHAT. (From wk on stable branch)
+
+       * progress.c (handle_progress): Store a copy of
+       NAME. (progress_filter): Release WHAT, make sure not to print a
+       NULL WHAT. (From wk on stable branch)
+
+       * openfile.c (open_sigfile): Adjust free for new progress
+       semantics. (From wk on stable branch)
+
+       * plaintext.c (ask_for_detached_datafile): Don't dealloc
+       pfx->WHAT. (From wk on stable branch)
+
+       * seckey-cert.c (do_check): Issue the RSA_OR_IDEA status when the
+       cipher algo is IDEA to make it easier to track down the
+       problem. (From twoaday on stable branch)
+       
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c, g10.c, kbnode.c, misc.c, pkclist.c, sign.c,
+       build-packet.c, getkey.c, keydb.c, openfile.c, plaintext.c,
+       status.c, gpgv.c, keygen.c, options.h, sig-check.c, tdbio.h,
+       encode.c, mainproc.c, parse-packet.c, signal.c, textfilter.c: Edit
+       all preprocessor instructions to remove whitespace before the '#'.
+       This is not required by C89, but there are some compilers out
+       there that don't like it.
+
+2003-05-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.h, trustdb.c (is_disabled), gpgv.c (is_disabled): Rename
+       is_disabled to cache_disabled_value, which now takes a pk and not
+       just the keyid. This is for speed since there is no need to
+       re-fetch a key when we already have that key handy.  Cache the
+       result of the check so we don't need to hit the trustdb more than
+       once.
+       
+       * getkey.c (skip_disabled): New function to get a pk and call
+       is_disabled on it. (key_byname): Use it here.
+       
+       * packet.h, getkey.c (skip_disabled), keylist.c
+       (print_capabilities): New "pk_is_disabled" macro to retrieve the
+       cached disabled value if available, and fill it in via
+       cache_disabled_value if not available.
+
+       * trustdb.c (get_validity): Cache the disabled value since we have
+       it handy and it might be useful later.
+
+       * parse-packet.c (parse_key): Clear disabled flag when parsing a
+       new key.  Just in case someone forgets to clear the whole key.
+
+       * getkey.c (merge_selfsigs_main): Add an "if all else fails" path
+       for setting a single user ID primary when there are multiple set
+       primaries all at the same second, or no primaries set and the most
+       recent user IDs are at the same second, or no signed user IDs at
+       all. This is arbitrary, but deterministic.
+
+       * exec.h, photoid.h: Add copyright message.
+
+       * keylist.c (list_keyblock_print): Don't dump attribs for
+       revoked/expired/etc uids for non-colon key listings.  This is for
+       consistency with --show-photos.
+
+       * main.h, keylist.c (dump_attribs), mainproc.c
+       (check_sig_and_print): Dump attribs if --attrib-fd is set when
+       verifying signatures.
+       
+       * g10.c (main): New --gnupg option to disable the various
+       --openpgp, --pgpX, etc. options.  This is the same as --no-XXXX
+       for those options.
+
+       * revoke.c (ask_revocation_reason): Clear old reason if user
+       elects to repeat question.  This is bug 153.
+
+       * keyedit.c (sign_uids): Show keyid of the key making the
+       signature.
+
+2003-05-21  Werner Koch  <wk@gnupg.org>
+
+       * progress.c (handle_progress)
+       * sign.c (write_plaintext_packet)
+       * encode.c (encode_simple,encode_crypt): Make sure that a filename
+       of "-" is considered to be stdin so that iobuf_get_filelength
+       won't get called.  This fixes bug 156 reported by Gregery Barton.
+
+2003-05-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, build-packet.c (build_sig_subpkt), export.c
+       (do_export_stream), import.c (remove_bad_stuff, import),
+       parse-packet.c (dump_sig_subpkt, parse_one_sig_subpkt): Remove
+       vestigal code for the old sig cache subpacket.  This wasn't
+       completely harmless as it caused subpacket 101 to disappear on
+       import and export.
+
+       * options.h, armor.c, cipher.c, g10.c, keyedit.c, pkclist.c,
+       sign.c, encode.c, getkey.c, revoke.c: The current flags for
+       different levels of PGP-ness are massively complex.  This is step
+       one in simplifying them. No functional change yet, just use a
+       macro to check for compliance level.
+
+       * sign.c (sign_file): Fix bug that causes spurious compression
+       preference warning.
+
+       * sign.c (clearsign_file): Fix bug that prevents proper warning
+       message from appearing when clearsigning in --pgp2 mode with a
+       non-v3 RSA key.
+
+       * main.h, misc.c (compliance_option_string, compliance_string,
+       compliance_failure), pkclist.c (build_pk_list), sign.c (sign_file,
+       clearsign_file), encode.c (encode_crypt,
+       write_pubkey_enc_from_list): New functions to put the "this
+       message may not be usable...." warning in one place.
+
+       * options.h, g10.c (main): Part two of the simplification.  Use a
+       single enum to indicate what we are compliant to (1991, 2440,
+       PGPx, etc.)
+
+       * g10.c (main): Show errors for failure in export, send-keys,
+       recv-keys, and refresh-keys.
+
+       * options.h, g10.c (main): Give algorithm warnings for algorithms
+       chosen against the --pgpX and --openpgp rules.
+
+       * keydb.h, pkclist.c (algo_available): Make TIGER192 invalid in
+       --openpgp mode.
+
+       * sign.c (sign_file), pkclist.c (algo_available): Allow passing a
+       hint of 0.
+
+2003-05-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * tdbio.c (create_version_record): Only create new trustdbs with
+       TM_CLASSIC or TM_PGP.
+
+       * trustdb.h, trustdb.c (trust_string, get_ownertrust_string,
+       get_validity_string, ask_ownertrust, validate_keys), pkclist.c
+       (do_edit_ownertrust): Rename trust_string to trust_value_to_string
+       for naming consistency.
+
+       * trustdb.h, trustdb.c (string_to_trust_value): New function to
+       translate a string to a trust value.
+
+       * g10.c (main): Use string_to_trust_value here for
+       --force-ownertrust.
+       
+       * options.h, g10.c (main), trustdb.c (trust_model_string,
+       init_trustdb, check_trustdb, update_trustdb, get_validity,
+       validate_one_keyblock): An "OpenPGP" trust model is misleading
+       since there is no official OpenPGP trust model.  Use "PGP"
+       instead.
+
+2003-04-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (build_sig_subpkt): Comments.
+
+       * exec.c (exec_write): Cast NULL to void* to properly terminate
+       varargs list.
+
+       * keyedit.c (show_key_with_all_names): Just for safety, catch an
+       invalid pk algorithm.
+
+       * sign.c (make_keysig_packet): Crucial that the call to mksubpkt
+       comes LAST before the calls to finalize the sig as that makes it
+       possible for the mksubpkt function to get a reliable pointer to
+       the subpacket area.
+
+       * pkclist.c (do_we_trust_pre): If an untrusted key was chosen by a
+       particular user ID, use that ID as the one to ask about when
+       prompting whether to use the key anyway.
+       (build_pk_list): Similar change here when adding keys to the
+       recipient list.
+
+       * trustdb.c (update_validity): Fix bug that prevented more than
+       one validity record per trust record.
+       (get_validity): When retrieving validity for a (user) supplied
+       user ID, return the validity for that user ID only, and do not
+       fall back to the general key validity.
+       (validate_one_keyblock): Some commentary on whether
+       non-self-signed user IDs belong in the web of trust (arguably,
+       they do).
+
+2003-04-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --no-textmode.
+
+       * export.c (do_export_stream), keyedit.c (show_key_with_all_names,
+       menu_addrevoker), mainproc.c (check_sig_and_print), photoid.c
+       (show_photos), sign.c (mk_notation_and_policy), trustdb.c
+       (get_validity, reset_trust_records, validate_keys): Make some
+       strings translatable.
+
+       * mainproc.c (check_sig_and_print): Show digest algorithm and sig
+       class when verifying a sig with --verbose on, and add version, pk
+       and hash algorithms and sig class to VALIDSIG.
+       
+       * parse-packet.c (enum_sig_subpkt): Make a warning message a
+       --verbose warning message since we don't need to warn every time
+       we see an unknown critical (we only need to invalidate the
+       signature).
+
+       * trustdb.c (init_trustdb): Check the trustdb options even with
+       TM_AUTO since the auto may become TM_CLASSIC or TM_OPENPGP.
+
+2003-04-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (do_sign): Show the hash used when making a signature in
+       verbose mode.
+
+       * tdbio.h, tdbio.c (tdbio_read_model): New function to return the
+       trust model used in a given trustdb.
+
+       * options.h, g10.c (main), trustdb.c (init_trustdb, check_trustdb,
+       update_trustdb): Use tdbio_read_model to implement an "auto" trust
+       model which is set via the trustdb.
+
+2003-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_revoke_cert): Remove ultimate trust when
+       revoking an ultimately trusted key.
+
+       * keyedit.c (sign_uids): Allow replacing expired signatures.
+       Allow duplicate signatures with --expert.
+
+       * pkclist.c (check_signatures_trust): Don't display a null
+       fingerprint when checking a signature with --always-trust enabled.
+
+       * filter.h (progress_filter_context_t), progress.c
+       (handle_progress), plaintext.c (ask_for_detached_datafile,
+       hash_datafiles): Fix compiler warnings.  Make "what" constant.
+
+       * build-packet.c (do_plaintext): Do not create invalid literal
+       packets with >255-byte names.
+
+2003-04-15  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (AM_CFLAGS): Make use of AM_CFLAGS and AM_LDFLAGS.
+
+       * g10.c, options.h: New option --enable-progress-filter.
+       * progress.c (handle_progress): Make use of it.
+
+2003-04-15  Marcus Brinkmann  <marcus@g10code.de>
+
+       * progress.c: New file.
+       * Makefile.am (common_source): Add progress.c.
+       * filter.h (progress_filter_context_t): New type.
+       (progress_filter, handle_progress): New prototypes.
+       * main.h (open_sigfile): New argument for prototype.
+       * openfile.c (open_sigfile): New argument to install progress
+       filter.
+       * encode.c (encode_simple): New variable PFX.  Register
+       progress filter.  Install text_filter after that.
+       (encode_crypt): Likewise.
+       * sign.c (sign_file): Likewise.
+       (clearsign_file): Likewise.
+       * decrypt.c (decrypt_message): Likewise.
+       (decrypt_messages): Likewise.
+       * verify.c (verify_signatures): Likewise.
+       (verify_one_file): Likewise.
+       * plaintext.c (hash_datafiles): Likewise.
+       (ask_for_detached_datafile): Likewise.
+
+2003-04-10  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (read_passphrase_from_fd): Do a dummy read if the
+       agent is to be used.  Noted by Ingo Klöcker.
+       (agent_get_passphrase): Inhibit caching when we have no
+       fingerprint.  This is required for key generation as well as for
+       symmetric only encryption.
+
+       * passphrase .c (agent_get_passphrase): New arg CANCELED.
+       (passphrase_to_dek): Ditto.  Passed to above.  Changed all
+       callers to pass NULL.
+       * seckey-cert.c (do_check): New arg CANCELED.
+       (check_secret_key): Terminate loop when canceled.
+
+       * keyedit.c (change_passphrase): Pass ERRTEXT untranslated to
+       passphrase_to_dek and translate where appropriate.
+       * seckey-cert.c (check_secret_key): Ditto.
+       * keygen.c (ask_passphrase): Ditto.
+       * passphrase.c (agent_get_passphrase): Translate the TRYAGAIN_TEXT.
+       Switch the codeset to utf-8.
+
+2003-04-09  Werner Koch  <wk@gnupg.org>
+
+       * decrypt.c (decrypt_messages): Fixed error handling; the function
+       used to re-loop with same file after an error.  Reported by Joseph
+       Walton.
+
+2003-04-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, g10.c (main), import.c (parse_import_options,
+       fix_pks_corruption): It's really PKS corruption, not HKP
+       corruption.  Keep the old repair-hkp-subkey-bug command as an
+       alias.
+
+       * g10.c (main): Rename --no-version to --no-emit-version for
+       consistency.  Keep --no-version as an alias.
+
+2003-04-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (algo_available): PGP 8 can use the SHA-256 hash.
+
+       * sign.c (sign_file, clearsign_file, sign_symencrypt_file): Remove
+       unused code.
+
+2003-04-01  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (check_sig_and_print): Add primary key fpr to VALIDSIG
+       status.
+
+2003-03-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h: Err on the side of making an unknown signature a SIG
+       rather than a CERT.
+
+       * import.c (delete_inv_parts): Discard any key signatures that
+       aren't key types (i.e. 0x00, 0x01, etc.)
+
+       * g10.c (main): Add deprecated option warning for
+       --list-ownertrust.  Add --compression-algo alias for
+       --compress-algo.  Change --version output strings to match
+       "showpref" strings, and make translatable.
+
+       * status.c (do_get_from_fd): Accept 'y' as well as 'Y' for
+       --command-fd boolean input.
+
+       * trustdb.c: Fix typo (DISABLE_REGEXP -> DISABLE_REGEX)
+
+       * keyedit.c (show_key_with_all_names_colon): Show no-ks-modify
+       flag.
+
+2003-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keyserver.c (kopts): Add "try-dns-srv"
+       keyserver option.  Defaults to on.
+
+       * passphrase.c (agent_get_passphrase): Fix memory leak with
+       symmetric messages.  Fix segfault with symmetric messages.  Fix
+       incorrect prompt with symmetric messages.
+
+2003-03-10  Werner Koch  <wk@gnupg.org>
+
+       * compress.c (init_uncompress): Use a 15 bit window size so that
+       the output of implementations which don't run for PGP 2
+       compatibility won't get garbled.
+
+2003-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (validate_keys): Mask the ownertrust when building the
+       list of fully valid keys so that disabled keys are still counted
+       in the web of trust.
+       (get_ownertrust_with_min): Do the same for the minimum ownertrust
+       calculation.
+
+       * parse-packet.c (dump_sig_subpkt): Show the notation names for
+       not-human-readable notations.  Fix cosmetic off-by-one length
+       counter.
+
+       * options.skel: Add explantion and commented-out
+       "no-mangle-dos-filenames".
+
+       * mainproc.c (proc_encrypted): Make string translatable.
+
+       * keyserver.c (keyserver_spawn): Quote ':', '%', and any 8-bit
+       characters in the uid strings sent to the keyserver helper.
+
+       * keyring.c (keyring_rebuild_cache): Lock the keyring while
+       rebuilding the signature caches to prevent another gpg from
+       tampering with the temporary copy.
+
+       * keygen.c (keygen_set_std_prefs): Include AES192 and AES256 in
+       default prefs.
+
+       * keyedit.c (show_prefs): Make strings translatable.
+
+       * keydb.c: Double the maximum number of keyrings to 40.
+
+       * gpgv.c (main): Fix bug #113 - gpgv should accept the
+       --ignore-time-conflict option.
+
+       * g10.c (main): --openpgp disables --pgpX.  Double the amount of
+       secure memory to 32k (keys are getting bigger these days).
+
+       * Makefile.am: Makefile.am: Use @CAPLIBS@ to link in -lcap if we
+       are using capabilities.
+
+2003-02-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Include various pieces of
+       information about the key in the data sent to the keyserver
+       helper.  This allows the helper to use it in instructing a remote
+       server which may not have any actual OpenPGP smarts in parsing
+       keys.
+
+       * main.h, export.c (export_pubkeys_stream, do_export_stream): Add
+       ability to return only the first match in an exported keyblock for
+       keyserver usage.  This should be replaced at some point with a
+       more flexible solution where each key can be armored seperately.
+
+2003-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (sign_file): Do not push textmode filter onto an unopened
+       IOBUF (segfault).  Noted by Marcus Brinkmann.  Push and
+       reinitialize textmode filter for each file in a multiple file
+       list.
+
+       * packet.h, getkey.c (fixup_uidnode), keyedit.c (show_prefs): Set
+       and show the keyserver no-modify flag.
+
+       * keygen.c (add_keyserver_modify): New.
+       (keygen_upd_std_prefs): Call it here.
+       (keygen_set_std_prefs): Accept "ks-modify" and "no-ks-modify" as
+       prefs to set and unset keyserver modify flag.
+
+       * g10.c (main): Accept "s1" in addition to "idea" to match the
+       other ciphers.
+
+       * main.h, misc.c (idea_cipher_warn): We don't need this if IDEA
+       has been disabled.
+
+2003-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (keygen_set_std_prefs): Don't put AES or CAST5 in
+       default prefs if they are disabled.
+
+       * g10.c (main): Use 3DES instead of CAST5 if we don't have CAST5
+       support.  Use 3DES for the s2k cipher in --openpgp mode.
+       (print_mds): #ifdef all of the optional digest algorithms.
+
+2003-02-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, getkey.c (classify_user_id, classify_user_id2): Make
+       'exact' a per-desc item.  Merge into one function since
+       'force_exact' is no longer needed.
+       (key_byname): Use new classify_user_id function, and new exact
+       flag in KEYDB_SEARCH_DESC.
+
+       * keyring.h, keyring.c (keyring_search): Return an optional index
+       to show which KEYDB_SEARCH_DESC was the matching one.
+
+       * keydb.h, keydb.c (keydb_search): Rename to keydb_search2, and
+       pass the optional index to keyring_search.  Add a macro version of
+       keydb_search that calls this new function.
+
+       * export.c (do_export_stream): If the keyid! syntax is used,
+       export only that specified key.  If the key in question is a
+       subkey, export the primary plus that subkey only.
+
+2003-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.c (set_exec_path): Add debugging line.
+
+       * g10.c (print_hex, print_mds): Print long hash strings a lot
+       neater.  This assumes at least an 80-character display, as there
+       are a few other similar assumptions here and there.  Users who
+       need unformatted hashes can still use with-colons.  Check that
+       SHA384 and 512 are available before using them as they are no
+       longer always available.
+
+       * Makefile.am: Use a local copy of libexecdir along with @PACKAGE@
+       as GNUPG_LIBEXECDIR so it can be easily overridden at make time.
+
+2003-02-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c (parse_hash_header, armor_filter): Accept the new SHAs
+       in the armor Hash: header.
+
+       * g10.c (print_hex): Print long hash strings a little neater.
+       (print_mds): Add the new SHAs to the hash list.
+
+2003-02-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_revuid): Properly handle a nonselfsigned uid on
+       a v4 key (treat as a v4 revocation).
+
+       * import.c (print_import_check): Do not re-utf8 convert user IDs.
+
+2003-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (list_node): Show signature expiration date in
+       with-colons sig records.
+
+       * keylist.c (list_keyblock_colon), mainproc.c (list_node): Show
+       trust sig information in with-colons sig records.
+
+2003-01-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (add_group): Trim whitespace after a group name so it does
+       not matter where the user puts the = sign.
+
+       * options.skel: Comment out the first three lines in case someone
+       manually copies the skel file to their homedir.
+
+       * sign.c (clearsign_file): Only use pgp2mode with v3 keys and
+       MD5. This matches what we do when decoding such messages and
+       prevents creating a message (v3+RIPEMD/160) that we can't verify.
+
+       * sig-check.c (signature_check2): Use G10ERR_GENERAL as the error
+       for signature digest conflict.  BAD_SIGN implies that a signature
+       was checked and we may try and print out a user ID for a key that
+       doesn't exist.
+
+2003-01-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (init_trustdb, get_validity): Don't use a changed
+       trust model to indicate a dirty trustdb, and never auto-rebuild a
+       dirty trustdb with the "always" trust model.
+
+       * g10.c (add_group): Last commit missed the \t ;)
+
+2003-01-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, parse-packet.c (setup_user_id), free-packet.c
+       (free_user_id), keydb.h, keyid.c (namehash_from_uid): New function
+       to rmd160-hash the contents of a user ID packet and cache it in
+       the uid object.
+
+       * keylist.c (list_keyblock_colon): Use namehash in field 8 of
+       uids.  Show dates for creation (selfsig date), and expiration in
+       fields 6 and 7.
+
+       * trustdb.c (get_validity, get_validity_counts, update_validity):
+       Use new namehash function rather than hashing it locally.
+
+2003-01-14  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (add_group): Fixed group parsing to allow more than one
+       delimiter in a row and also allow tab as delimiter.
+
+2003-01-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * tdbio.c (tdbio_set_dbname): Fix assertion failure with
+       non-fully-qualified trustdb names.
+
+2003-01-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (get_validity_info, get_ownertrust_info,
+       trust_letter): Simplify by returning a ? for error directly.
+
+       * keyedit.c (show_key_with_all_names): Use get_validity_string and
+       get_ownertrust_string to show full word versions of trust
+       (i.e. "full" instead of 'f').
+
+       * trustdb.h, trustdb.c (get_ownertrust_string,
+       get_validity_string): Same as get_ownertrust_info, and
+       get_validity_info, except returns a full string.
+
+       * trustdb.c (get_ownertrust_with_min): New.  Same as
+       'get_ownertrust' but takes the min_ownertrust value into account.
+
+2003-01-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * armor.c (armor_filter): Comment about PGP's end of line tab
+       problem.
+
+       * trustdb.h, trustdb.c (trust_letter): Make
+       static. (get_ownertrust_info, get_validity_info): Don't mask the
+       trust level twice.
+
+       * trustdb.h, gpgv.c, trustdb.c (get_validity, get_validity_info),
+       keylist.c (list_keyblock_colon), keyedit.c
+       (show_key_with_all_names_colon, menu_revuid): Pass a user ID in
+       rather than a namehash, so we only have to do the hashing in one
+       place.
+
+       * packet.h, pkclist.c (build_pk_list), free-packet.c
+       (release_public_key_parts): Remove unused namehash element for
+       public keys.
+
+2003-01-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (keygen_set_std_prefs): Warn when setting an IDEA
+       preference when IDEA is not available.
+
+2003-01-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (get_validity_info): 'd' for disabled is not a
+       validity value any more.
+
+       * packet.h, tdbio.h, tdbio.c (tdbio_read_record,
+       tdbio_write_record), trustdb.c (update_validity): Store temporary
+       full & marginal counts in the trustdb.
+       (clear_validity, get_validity_counts): Return and clear temp
+       counts.
+       (store_validation_status): Keep track of which keyids have been
+       stored.
+       (validate_one_keyblock, validate_key_list): Use per-uid copies of
+       the full & marginal counts so they can be recalled for multiple
+       levels.
+       (validate_keys): Only use unused keys for each new round.
+       (reset_unconnected_keys): Rename to reset_trust_records, and only
+       skip specifically excluded records.
+
+       * keylist.c (print_capabilities): Show 'D' for disabled keys in
+       capabilities section.
+
+       * trustdb.c (is_disabled): Remove incorrect comment.
+
+2003-01-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_one): Only do the work to create the status
+       display for interactive import if status is enabled.
+
+       * keyring.c (keyring_search): skipfnc didn't work properly with
+       non-keyid searches.  Noted by Stefan Bellon.
+
+       * getkey.c (merge_selfsigs_main): Remove some unused code and make
+       sure that the pk selfsigversion member accounts for 1F direct
+       sigs.
+
+2003-01-02  Werner Koch  <wk@gnupg.org>
+
+       * keydb.c (keydb_add_resource): Don't assume that try_make_homedir
+       terminates but check again for the existence of the directory and
+       continue then.
+       * openfile.c (copy_options_file): Print a warning if the skeleton
+       file has active options.
+
+2002-12-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (merge_selfsigs_main), main.h, sig-check.c
+       (check_key_signature2): Pass the ultimately trusted pk directly to
+       check_key_signature2 to avoid going through the key selection
+       mechanism.  This prevents a deadly embrace when two keys without
+       selfsigs each sign the other.
+
+2002-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_refresh): Don't print the "refreshing..."
+       line if there are no keys to refresh or if there is no keyserver
+       set.
+
+       * getkey.c (merge_selfsigs_main): Any valid user ID should make a
+       key valid, not just the last one.  This also fixes Debian bug
+       #174276.
+
+2002-12-27  Stefan Bellon  <sbellon@sbellon.de>
+
+       * import.c (print_import_check): Changed int to size_t.
+
+2002-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu, menu_revuid): Add "revuid" feature to
+       revoke a user ID.  This is the same as issuing a revocation for
+       the self-signature, but a much simpler interface to do it.
+
+2002-12-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, getkey.c (key_byname): Flag to enable or disable
+       including disabled keys.  Keys specified via keyid (i.e. 0x...)
+       are always included.
+
+       * getkey.c (get_pubkey_byname, get_seckey_byname2,
+       get_seckey_bynames), keyedit.c (keyedit_menu, menu_addrevoker):
+       Include disabled keys in these functions.
+
+       * pkclist.c (build_pk_list): Do not include disabled keys for -r
+       or the key prompt.  Do include disabled keys for the default key
+       and --encrypt-to.
+
+       * trustdb.h, trustdb.c (is_disabled): New skipfnc for skipping
+       disabled keys.
+
+       * gpgv.c (is_disabled): Stub.
+
+       * keygen.c (keygen_add_key_expire): Properly handle updating a key
+       expiration to a no-expiration value.
+
+       * keyedit.c (enable_disable_key): Comment.
+
+       * import.c (import_one): When in interactive mode and --verbose,
+       don't repeat some key information twice.
+
+2002-12-22  Timo Schulz  <ts@winpt.org>
+       
+       * import.c (print_import_check): New.
+       (import_one): Use it here.
+        Use merge_keys_and_selfsig in the interactive mode to avoid
+        wrong key information.
+       * status.h: Add new status code.
+       * status.c: Ditto.
+       
+2002-12-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (do_we_trust): Tweak language to refer to the "named
+       user" rather than "owner".  Noted by Stefan Bellon.
+
+       * trustdb.h, trustdb.c (trustdb_pending_check): New function to
+       check if the trustdb needs a check.
+
+       * import.c (import_keys_internal): Used here so we don't rebuild
+       the trustdb if it is still clean.
+       (import_one, chk_self_sigs): Only mark trustdb dirty if the key
+       that is being imported has any sigs other than self-sigs.
+       Suggested by Adrian von Bidder.
+
+       * options.skel: Include the required '=' sign in the sample
+       'group' option.  Noted by Stefan Bellon.
+
+       * import.c (chk_self_sigs): Don't try and check a subkey as if it
+       was a signature.
+
+2002-12-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * tdbio.c (tdbio_read_record, tdbio_write_record): Compact the
+       RECTYPE_TRUST records a bit.
+
+       * g10.c (main): Comment out --list-trust-path until it can be
+       implemented.
+
+       * import.c (import_one): Warn when importing an Elgamal primary
+       that this may take some time (to verify self-sigs).
+       (chk_self_sigs): Try and cache all self-sigs so the keyblock is
+       written to the keyring with a good rich cache.
+
+       * keygen.c (ask_algo): Make the Elgamal sign+encrypt warning
+       stronger, and remove the RSA sign+encrypt warning.
+
+2002-12-06  Stefan Bellon  <sbellon@sbellon.de>
+
+       * options.h: Fixed typo (mangle_dos_names instead of
+       mangle_dos_filenames).
+
+2002-12-05  Werner Koch  <wk@gnupg.org>
+
+       * g10.c: New options --[no-]mangle-dos-filenames.
+       * options.h (opt): Added mangle-dos-filenames.
+       * openfile.c (open_outfile) [USE_ONLY_8DOT3]: Truncate the
+       filename only when this option is set; this is the default.
+
+2002-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keyedit.c, keygen.c: Back out previous (2002-12-01)
+       change.  Minimal isn't always best.
+
+       * sign.c (update_keysig_packet): Use the current time rather then
+       a modification of the original signature time.  Make sure that
+       this doesn't cause a time warp.
+
+       * keygen.c (keygen_add_key_expire): Properly handle a key
+       expiration date in the past (use a duration of 0).
+
+       * keyedit.c (menu_expire): Use update_keysig_packet so any sig
+       subpackets are maintained during the update.
+
+       * build-packet.c (build_sig_subpkt): Mark sig expired or unexpired
+       when the sig expiration subpacket is added.
+       (build_sig_subpkt_from_sig): Handle making an expiration subpacket
+       from a sig that has already expired (use a duration of 0).
+
+       * packet.h, sign.c (update_keysig_packet), keyedit.c
+       (menu_set_primary_uid, menu_set_preferences): Add ability to issue
+       0x18 subkey binding sigs to update_keysig_packet and change all
+       callers.
+
+       * trustdb.c (validate_keys): Show trust parameters when building
+       the trustdb, and make sure that the version record update was
+       successful.
+       (init_trustdb): If the current parameters aren't what was used for
+       building the trustdb, the trustdb is invalid.
+
+       * tbio.c (tdbio_db_matches_options): Update to work with new
+       trustdbs.
+
+2002-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * tdbio.h, tdbio.c (tdbio_read_record, tdbio_write_record): Store
+       trust model in the trustdb version record.
+       (tdbio_update_version_record): New function to update version
+       record values during a trustdb check or update.
+       (tdbio_dump_record): Show trust model in dump.
+
+       * trustdb.c (validate_keys): Call tdbio_update_version_record on
+       success so that the correct options are stored in the trustdb.
+
+       * options.h: rearrange trust models so that CLASSIC is 0 and
+       OPENPGP is 1.
+
+       * options.h, g10.c (main), encode.c (write_pubkey_enc_from_list),
+       pkclist.c (algo_available), revoke.c (gen_revoke): Add --pgp8
+       mode.  This is basically identical to --pgp7 in all ways except
+       that signing subkeys, v4 data sigs (including expiration), and SK
+       comments are allowed.
+
+       * getkey.c (finish_lookup): Comment.
+
+       * main.h, keylist.c (reorder_keyblock), keyedit.c (keyedit_menu):
+       Reorder user ID display in the --edit-key menu to match that of
+       the --list-keys display.
+
+       * g10.c (add_notation_data): Fix initialization.
+
+2002-12-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_expire): Don't lose key flags when changing the
+       expiration date of a subkey.  This is not the most optimal
+       solution, but it is minimal change on the stable branch.
+
+       * main.h, keygen.c (do_copy_key_flags): New function to copy key
+       flags, if any, from one sig to another.
+       (do_add_key_expire): New function to add key expiration to a sig.
+       (keygen_copy_flags_add_expire): New version of
+       keygen_add_key_expire that also copies key flags.
+       (keygen_add_key_flags_and_expire): Use do_add_key_expire.
+
+       * import.c (fix_hkp_corruption): Comment.
+
+2002-11-25  Stefan Bellon  <sbellon@sbellon.de>
+
+       * plaintext.c (handle_plaintext) [__riscos__]: If nooutput is set,
+       no filetype is needed obviously.
+
+2002-11-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, misc.c (default_cipher_algo, default_compress_algo):
+       New.  Return the default algorithm by trying
+       --cipher-algo/--compress-algo, then the first item in the pref
+       list, then s2k-cipher-algo or ZIP.
+
+       * sign.c (sign_file, sign_symencrypt_file), encode.c
+       (encode_simple, encode_crypt): Call default_cipher_algo and
+       default_compress_algo to get algorithms.
+
+       * g10.c (main): Allow pref selection for compress algo with
+       --openpgp.
+
+       * mainproc.c (proc_encrypted): Use --s2k-digest-algo for
+       passphrase mangling rather than --digest-algo.
+
+       * sign.c (hash_for): If --digest-algo is not set, but
+       --personal-digest-preferences is, then use the first hash
+       algorithm in the personal list.  If the signing algorithm is DSA,
+       then use the first 160-bit hash algorithm in the personal list.
+       If --pgp2 is set and it's a v3 RSA key, use MD5.
+
+       * g10.c (main), keydb.c (keydb_add_resource,
+       keydb_locate_writable): Rename --default-keyring as
+       --primary-keyring.  Stefan wins the naming contest.
+
+2002-11-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (add_notation_data): Disallow notation names that do not
+       contain a '@', unless --expert is set.  This is to help prevent
+       people from polluting the (as yet unused) IETF namespace.
+
+       * main.h: Comments about default algorithms.
+
+       * photoid.c (image_type_to_string): Comments about 3-letter file
+       extensions.
+
+       * encode.c (encode_simple), passphrase.c (passphrase_to_dek),
+       sign.c (sign_symencrypt_file): Use --s2k-digest-algo for
+       passphrase mangling rather than --digest-algo.
+
+2002-11-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (keygen_set_std_prefs): Properly handle an empty
+       preference string.
+
+       * misc.c (string_to_compress_algo): "none" is a bad choice since
+       it conflicts with the "none" in setpref.
+
+2002-11-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Allow compression algorithm names as the argument
+       to --compress-algo.  The old algorithm names still work for
+       backwards compatibility.
+
+       * misc.c (string_to_compress_algo): Allow "none" as an alias for
+       "uncompressed".
+
+2002-11-13  Stefan Bellon  <sbellon@sbellon.de>
+
+       * getkey.c (get_pubkey_byfprint_fast): Fixed type incompatibility,
+       was unsigned char instead of byte.
+
+2002-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * encode.c (encode_simple): Make sure that files larger than about
+       4G use partial length encoding.  This is required because OpenPGP
+       allows only for 32 bit length fields.  From Werner on stable
+       branch.
+
+       * getkey.c (get_pubkey_direct): Renamed to...
+       (get_pubkey_fast): this and made extern.
+       (get_pubkey_byfprint_fast): New.  From Werner on stable branch.
+
+       * keydb.h, import.c (import_one): Use get_pubkey_fast instead of
+       get_pubkey.  We don't need a merged key and actually this might
+       lead to recursions.
+       (revocation_present): Likewise for search by fingerprint.  From
+       Werner on stable branch.
+
+       * g10.c (main): Try to create the trustdb even for non-colon-mode
+       list-key operations.  This is required because getkey needs to
+       know whether a a key is ultimately trusted.  From Werner on stable
+       branch.
+       
+       * exec.c [__CYGWIN32__]: Keep cygwin separate from Mingw32;
+       we don't need it here as it behaves more like a Posix system.
+       From Werner on stable branch.
+
+       * passphrase.c (agent_get_passphrase): Ditto.  From Werner on
+       stable branch.
+
+       * tdbio.c (MY_O_BINARY): Need binary mode with Cygwin.  From
+       Werner on stable branch.
+
+               * g10.c, gpgv.c (main) [__CYGWIN32__]: Don't get the homedir from
+       the registry.  From Werner on stable branch.
+       
+       * keyedit.c (show_key_with_all_names_colon): Make --with-colons
+       --edit display match the validity and trust of --with-colons
+       --list-keys.
+
+       * passphrase.c (agent_send_all_options): Fix compile warning.
+
+       * keylist.c (list_keyblock_colon): Validity for subkeys should
+       match that of the primary key, and not that of the last user ID.
+
+       * getkey.c (merge_selfsigs): Revoked/expired/invalid primary keys
+       carry these facts onto all their subkeys, but only after the
+       subkey has a chance to be marked valid.  This is to fix an
+       incorrect "invalid public key" error verifying a signature made by
+       a revoked signing subkey, with a valid unrevoked primary key.
+
+2002-11-09  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (agent_send_all_options): Use tty_get_ttyname to
+       get the default ttyname.
+
+2002-11-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyring.h, keyring.c (keyring_register_filename): Return the
+       pointer if a given keyring is registered twice.
+
+       * keydb.h, keydb.c (keydb_add_resource): Use flags to indicate a
+       default keyring.
+       (keydb_locate_writable): Prefer the default keyring if possible.
+
+       * g10.c (main): Add --default-keyring option.
+
+2002-11-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), trustdb.c (ask_ownertrust): Add
+       --force-ownertrust option for debugging purposes.  This allows
+       setting a whole keyring to a given trust during an
+       --update-trustdb.  Not for normal use - it's just easier than
+       hitting "4" all the time to test a large trustdb.
+
+       * pubkey-enc.c (get_session_key): With hidden recipients or try a
+       given passphrase against all secret keys rather than trying all
+       secret keys in turn.  Don't if --try-all-secrets or --status-fd is
+       enabled.
+
+       * passphrase.c (passphrase_to_dek): Mode 1 means do a regular
+       passphrase query, but don't prompt with the key info.
+
+       * seckey-cert.c (do_check, check_secret_key): A negative ask count
+       means to enable passphrase mode 1.
+
+       * keydb.h, getkey.c (enum_secret_keys): Add flag to include
+       secret-parts-missing keys (or not) in the list.
+
+2002-11-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_search_prompt): When --with-colons is
+       enabled, don't try and fit the search output to the screen size -
+       just dump the whole list.
+
+2002-11-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_search_prompt): When --with-colons is
+       enabled, just dump the raw keyserver protocol to stdout and don't
+       print the menu.
+
+       * keyserver.c (show_prompt): Don't show a prompt when command-fd
+       is being used.
+
+       * trustdb.c (trust_model_string, check_trustdb, update_trustdb,
+       validate_one_keyblock): It's not clear what a trustdb rebuild or
+       check means with a trust model other than "classic" or "openpgp",
+       so disallow this.
+
+2002-11-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main): Add --trust-model option.  Current
+       models are "openpgp" which is classic+trustsigs, "classic" which
+       is classic only, and "always" which is the same as the current
+       option --always-trust (which still works).  Default is "openpgp".
+
+       * trustdb.c (validate_one_keyblock): Use "openpgp" trust model to
+       enable trust sigs.
+
+       * gpgv.c (main), mainproc.c (check_sig_and_print), pkclist.c
+       (do_we_trust, do_we_trust_pre, check_signatures_trust): Use new
+       --trust-model option in place of --always-trust.
+
+       * keyedit.c (sign_mk_attrib, trustsig_prompt, sign_uids,
+       keyedit_menu): Prompt for and create a trust signature with
+       "tsign".  This is functional, but needs better UI text.
+
+       * build-packet.c (build_sig_subpkt): Able to build trust and
+       regexp subpackets.
+
+       * pkclist.c (do_edit_ownertrust): Comment.
+
+2002-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (set_one_pref, keygen_set_std_prefs): Allow using the
+       full algorithm name (CAST5, SHA1) rather than the short form (S3,
+       H2).
+
+       * main.h, keygen.c (keygen_get_std_prefs), keyedit.c
+       (keyedit_menu): Return and use a fake uid packet rather than a
+       string since we already have a nice parser/printer in
+       keyedit.c:show_prefs.
+
+       * main.h, misc.c (string_to_compress_algo): New.
+
+2002-11-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Add --no-throw-keyid.
+
+       * keydb.h, encode.c (write_pubkey_enc_from_list), g10.c (main),
+       pkclist.c (build_pk_list): Add --hidden-recipient (-R) and
+       --hidden-encrypt-to, which do a single-user variation on
+       --throw-keyid.  The "hide this key" flag is carried in bit 0 of
+       the pk_list flags field.
+
+       * keyserver.c (parse_keyrec): Fix shadowing warning.
+
+2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
+
+       * compress.c (init_compress) [__riscos__]: Use
+       riscos_load_module() to load ZLib module.
+
+       * g10.c (main) [__riscos__]: Renames due to changes in riscos.c
+       (e.g. prefixes all RISC OS specific functions with riscos_*).
+       * photoid.c (show_photos) [__riscos__]: Likewise.
+       * signal.c (got_fatal_signal) [__riscos__]: Likewise.
+
+       * trustdb.c (check_regexp) [__riscos__]: Branch to RISC OS RegEx
+       handling.
+
+2002-10-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (do_plaintext), encode.c (encode_sesskey,
+       encode_simple, encode_crypt), sign.c (write_plaintext_packet): Use
+       wipememory() instead of memset() to wipe sensitive memory as the
+       memset() might be optimized away.
+
+2002-10-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (check_regexp): Modern regexps require REG_EXTENDED.
+
+2002-10-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, trustdb.h, trustdb.c (trust_string): New.  Return a
+       string like "fully trusted", "marginally trusted", etc.
+       (get_min_ownertrust): New.  Return minimum ownertrust.
+       (update_min_ownertrust): New.  Set minimum ownertrust.
+       (check_regexp): New.  Check a regular epression against a user ID.
+       (ask_ownertrust): Allow specifying a minimum value.
+       (get_ownertrust_info): Follow the minimum ownertrust when
+       returning a letter.
+       (clear_validity): Remove minimum ownertrust when a key becomes
+       invalid.
+       (release_key_items): Release regexp along with the rest of the
+       info.
+       (validate_one_keyblock, validate_keys): Build a trust sig chain
+       while validating.  Call check_regexp for regexps.  Use the minimum
+       ownertrust if the user does not specify a genuine ownertrust.
+
+       * pkclist.c (do_edit_ownertrust): Only allow user to select a
+       trust level greater than the minimum value.
+
+       * parse-packet.c (can_handle_critical): Can handle critical trust
+       and regexp subpackets.
+
+       * trustdb.h, trustdb.c (clear_ownertrusts), delkey.c
+       (do_delete_key), import.c (import_one): Rename clear_ownertrust to
+       clear_ownertrusts and have it clear the min_ownertrust value as
+       well.
+
+       * keylist.c (list_keyblock_print): Indent uid to match pub and
+       sig.
+
+       * keyedit.c (print_and_check_one_sig, show_key_and_fingerprint,
+       menu_addrevoker), keylist.c (list_keyblock_print,
+       print_fingerprint): Show "T" or the trust depth for trust
+       signatures, and add spaces to some strings to make room for it.
+
+       * packet.h, parse-packet.c (dump_sig_subpkt, parse_one_sig_subpkt,
+       parse_signature): Parse trust signature values.
+
+       * tdbio.h, tdbio.c (tdbio_read_record, tdbio_write_record):
+       Reserve a byte for the minimum ownertrust value (for use with
+       trust signatures).
+
+2002-10-29  Stefan Bellon  <sbellon@sbellon.de>
+
+       * build-packet.c (calc_plaintext, do_plaintext): Removed RISC OS
+       specific filetype parts (it's now done in make_basename()).
+
+       * plaintext.c (handle_plaintext): Tidied up RISC OS specific
+       filetype parts.
+
+       * encode.c (encode_simple, encode_crypt): Added argument to
+       make_basename() call.
+
+       * sign.c (write_plaintext_packet): Added argument to
+       make_basename() call.
+
+2002-10-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * build-packet.c (calc_plaintext, do_plaintext): Added filetype
+       handling for RISC OS' file types.
+
+       * plaintext.c (handle_plaintext) [__riscos__]: Added filetype
+       handling for RISC OS' file types.
+
+2002-10-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, import.c (sec_to_pub_keyblock, import_secret_one,
+       parse_import_options), g10.c (main): New import-option
+       "convert-sk-to-pk" to convert a secret key into a public key
+       during import.  It is on by default.
+
+2002-10-23  Werner Koch  <wk@gnupg.org>
+
+       * pubkey-enc.c (get_it): Fix segv, test for revoked only when PK
+       has been assigned.
+
+2002-10-18  Timo Schulz  <ts@winpt.org>
+
+       * keylist.c: (print_pubkey_info): New.
+       (print_seckey_info): New.
+       * main.h: Prototypes for the new functions.       
+       * delkey.c (do_delete_key): Use it here.
+       * revoke.c (gen_desig_revoke): Ditto.
+       
+2002-10-17  Werner Koch  <wk@gnupg.org>
+
+       * pkclist.c (do_edit_ownertrust): Show all user IDs.  This should
+       be enhanced to also show the current trust level.  Suggested by
+       Florian Weimer.
+
+2002-10-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Handle --strict and --no-strict from the command
+       line before the options file is loaded.
+
+2002-10-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Disable --textmode when encrypting (symmetric or
+       pk) in --pgp2 mode as PGP 2 can't handle the unknown length
+       literal packet.  Reported by Michael Richardson.
+
+2002-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver-internal.h, keyserver.c (print_keyrec, parse_keyrec,
+       show_prompt, keyserver_search_prompt, keyserver_spawn): Go to
+       version 1 of the keyserver protocol.  This is a better design,
+       similar to --with-colons, that allows for keys with multiple user
+       IDs rather than using multiple keys.  It also matches the machine
+       readable pksd format.  Also use a prettier --search-keys listing
+       format that can fill different size windows (currently set at 24
+       lines).
+
+2002-10-12  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (print_status_key_created): New.
+       (do_generate_keypair): Use it to print the fingerprint.
+       (generate_subkeypair): Likewise.
+
+2002-10-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_addrevoker): Properly back out if the signature
+       fails.  Also, do not allow appointing the same revoker twice, and
+       report ALREADY_SIGNED if the user tries it.
+
+2002-10-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_keys_internal): Missed one s/inp/inp2/.
+
+       * keylist.c (print_capabilities): Properly indicate per-key
+       capabilities of sign&encrypt primary keys that have
+       secret-parts-missing (i.e. no capabilities at all)
+
+       * mainproc.c (symkey_decrypt_sesskey): Fix compiler warning.
+
+2002-10-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (get_pubkey_direct): Don't cache keys retrieved via
+       this function as they may not have all their fields filled in.
+
+       * sig-check.c (signature_check2): Use new is_primary flag to check
+       rather than comparing main_keyid with keyid as this still works in
+       the case of a not fully filled in pk.
+
+2002-10-04  Werner Koch  <wk@gnupg.org>
+
+       * import.c (import_keys_internal): s/inp/inp2/ to avoid shadowing
+       warning.
+
+       * passphrase.c (agent_get_passphrase): Fixed signed/unsigned char
+       problem in %-escaping.  Noted by Ingo Klöcker.
+
+2002-10-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main): Add --strict and --no-strict to switch
+       the log_warning severity level from info to error.
+
+       * keylist.c (print_capabilities): Secret-parts-missing keys should
+       show that fact in the capabilities, and only primary signing keys
+       can certify other keys.
+
+       * packet.h, parse_packet.c (parse_key): Add is_primary flag for
+       public keys (it already exists for secret keys).
+
+2002-10-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_secret_one): Check for an illegal (>110)
+       protection cipher when importing a secret key.
+
+       * keylist.c (list_keyblock_print): Show a '#' for a
+       secret-parts-missing key.
+
+       * parse_packet.c (parse_key): Some comments.
+
+       * revoke.c (gen_revoke): Remove some debugging code.
+
+       * trustdb.c (verify_own_keys): Make trusted-key a non-deprecated
+       option again.
+
+       * seckey-cert.c (do_check): Don't give the IDEA warning unless the
+       cipher in question is in fact IDEA.
+
+2002-10-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_one): Make sure that a newly imported key
+       starts with a clean ownertrust.
+
+2002-10-01  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (get_pubkey_direct): New.
+       (merge_selfsigs_main): Use it here to look for an ultimately
+       trusted key.  Using the full get_pubkey might lead to an
+       infinitive recursion.
+
+2002-09-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_uri): Force the keyserver URI
+       scheme to lowercase to be case-insensitive.
+
+2002-09-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * export.c (do_export_stream): Comment.
+
+       * sig-check.c (check_key_signature2): Properly handle a
+       non-designated revocation import.
+
+2002-09-26  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (set_homedir): New. Changed all direct assignments to use
+       this.
+       * gpgv.c (set_homedir): Ditto.
+
+2002-09-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Link gpg with EGDLIBS (i.e. NETLIBS) as EGD uses
+       sockets.  Remove the old NETLIBS variable since the keyserver
+       stuff is no longer internal.
+
+2002-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_keys_stream): Fix compiler type warning.
+
+       * keyring.c (keyring_rebuild_cache), sig-check.c
+       (check_key_signature2), import.c (import, chk_self_sigs): Minor
+       language cleanups.
+
+2002-09-23  Stefan Bellon  <sbellon@sbellon.de>
+
+       * main.h: Introduced fast-import as import option. Removed
+       fast as separate option from prototypes.
+       * import.c (parse_import_options): Added fast-import option.
+       (import_*): Removed fast as separate option.
+       * g10.c (main): Added option fast-import, removed old fast
+       as separate argument.
+       * keyserver.c (keyserver_spawn): Removed old fast as separate
+       argument.
+
+2002-09-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * import.c (import_keys, import_keys_stream,
+       import_keys_internal): Added trustdb update/check to key import if
+       not fast-import and interactive set/no-auto-check-trustdb unset.
+       Avoided function clone by introducing import_keys_internal.
+
+2002-09-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Properly handle line truncation.
+       Don't leak memory (~10-20 bytes) on searches.
+       (keyserver_search_prompt): Cleanup.
+
+       * keylist.c (list_keyblock_colon): Show 1F direct key signatures
+       in --with-colons listing.
+
+2002-09-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_addrevoker): The direct key signature for
+       revocation keys must be at least v4 to carry the revocation key
+       subpacket.  Add a PGP 2.x warning for revocation keys.
+
+2002-09-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (check_permissions): Rearrange strings to make translating
+       easier (don't incorporate string parts).
+
+       * keyedit.c (sign_uids): Make strings translatable.
+
+       * sig-check.c (check_key_signature2): Make string translatable.
+
+2002-09-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (check_revocation_keys): Move....
+       * main.h, sig-check.c (check_revocation_keys): to here.  Also
+       return the signature_check error code rather than 0/1 and cache
+       the sig result.
+
+       * sig-check.c (check_key_signature2): Divert to
+       check_revocation_keys if a revocation sig is made by someone other
+       than the pk owner.
+
+       * getkey.c (merge_selfsigs_main): Tidy.
+
+2002-09-13  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main) [__MINGW32__]: Activate oLoadExtension.
+
+2002-09-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, hkp.c, hkp.h, keyserver.c (keyserver_work): Remove
+       internal HKP support.
+
+       * keyserver.c (keyserver_spawn): Remove whitespace after keyserver
+       commands.
+
+2002-09-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.c (expand_args): Remove loop left over from earlier
+       implementation.
+       (exec_write): Missed one tick.
+
+2002-09-10  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, options.h: Removed option --emulate-checksum-bug.
+       * misc.c (checksum_u16_nobug): Removed.
+       (checksum_u16): Removed the bug emulation.
+       (checksum_mpi): Ditto.
+       (checksum_mpi_counted_nbits): Removed and replaced all calls
+       with checksum_mpi.
+
+       * parse-packet.c (read_protected_v3_mpi): New.
+       (parse_key): Use it here to store it as an opaque MPI.
+       * seckey-cert.c (do_check): Changed the v3 unprotection to the new
+       why to store these keys.
+       (protect_secret_key): Likewise.
+       * build-packet.c (do_secret_key): And changed the writing.
+
+       * tdbio.c (tdbio_set_dbname, open_db): Use new macro MY_O_BINARY
+       to avoid silly ifdefs.
+       (open_db): Fallback to RDONLY so that gpg may be used from a
+       RO-medium.
+
+       * encode.c (encode_simple): Make sure we don't use an ESK packet
+       when we don't have a salt in the S2K.
+
+       * misc.c (pct_expando) <case f>: Make sure that LEN is initialized.
+
+       * exec.c (exec_finish): Use ticks to denote filenames in messages.
+       (make_tempdir, exec_write): Changed format of messages.
+
+       * keyserver.c (print_keyinfo): Release USERID in on error.
+       (keyserver_work) [!DISABLE_KEYSERVER_HELPERS]: Exclude the unused
+       code.
+
+2002-09-09  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (make_attribute_uidname): Add new ar MAX_NAMELEN
+       for sanity checks.  Changed both callers. Limit the size of an %s.
+
+       * options.skel: Comment lock-once out, so that this file does not
+       change anything when copied to a new home directory.
+       * openfile.c (try_make_homedir): Don't exit after copying the
+       option skeleton.
+
+       * options.h: Don't use a comma when declaring variables over more
+       than one line.
+
+       * mainproc.c (symkey_decrypt_sesskey): Check length of the session
+       key.
+
+       * hkp.c (dehtmlize): Use ascii_tolower to protect against weird
+       locales.  Cast the argument for isspace for the sake of broken
+       HP/UXes.
+       (parse_hkp_index): s/ascii_memcasecmp/ascii_strncasecmp/.
+
+       * g10.c: Removed option --emulate-3des-s2k-bug.
+
+       * passphrase.c (hash_passphrase): Was used here.
+
+       * export.c (parse_export_options)
+       * keyserver.c (parse_keyserver_options)
+       * import.c (parse_import_options)
+       * g10.c (check_permissions): s/ascii_memcasecmp/ascii_strncasecmp/.
+
+2002-09-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (add_group): Use '=' to separate group name from group
+       members.  Use a better error message for when no = is found.
+
+       * hkp.c (hkp_export): Use CRLF in headers.
+
+2002-09-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * mainproc.c (print_pkenc_list): Don't increment the error counter
+       when printing the list of keys a message was encrypted to.  This
+       would make gpg give a non-zero exit code even for completely valid
+       messages if the message was encrypted to more than one key that
+       the user owned.
+
+2002-09-02  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Try to set a default character set.  Print the
+       used one in verbosity level 3.
+       * gpgv.c (main): Try to set a default character set.
+
+       * status.c, status.h (STATUS_IMPORT_OK): New.
+       * import.c (import_one,import_secret_one): Print new status.
+
+2002-08-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (build_pk_list): Add new status code to indicate an
+       untrusted user.  This (or a disabled key) fail with "unavailable
+       pubkey" (G10ERR_UNU_PUBKEY).
+
+       * pkclist.c (build_pk_list): Fail if any recipient keys are
+       unusable.
+
+       * options.skel: The PGP LDAP keyserver is back.  Use MIT keyserver
+       as a sample rather than cryptnet as cryptnet does not support
+       searching yet.
+
+       * keyedit.c (show_key_with_all_names): Fix error message
+       (preferences are userid/selfsig and not key specific).
+
+2002-08-30  Werner Koch  <wk@gnupg.org>
+
+       * pkclist.c (do_we_trust_pre): Changed the wording of a warning.
+
+       * encode.c (encode_simple,encode_crypt): Use new style CTB for
+       compressssed packets when using MDC.  We need to do this so that
+       concatenated messages are properly decrypted.  Old style
+       compression assumes that it is the last packet; given that we
+       can't determine the length in advance, the uncompressor does not
+       know where to start.  Actually we should use the new CTB always
+       but this would break PGP 2 compatibility.
+
+       * parse-packet.c (parse): Special treatment for new style CTB
+       compressed packets.
+
+       * build-packet.c (do_mdc): Removed. Was not used.
+       (do_encrypted_mdc): Count in the version number and the MDC packet.
+
+2002-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (do_check_messages, do_check): Show keyid in error
+       messages.
+
+       * keyserver.c (print_keyinfo): More readable key listings for
+       --search-keys responses.
+
+2002-08-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (parse_hkp_index, dehtmlize): Move HTML functionality into
+       new "dehtmlize" function.  Remove HTML before trying to parse each
+       line from the keyserver.  If the keyserver provides key type
+       information in the listing, use it.
+
+2002-08-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (do_check, do_check_messages): Emit the usual sig
+       warnings even for cached sigs.  This also serves to protect
+       against missing a sig expiring while cached.
+
+       * getkey.c (merge_selfsigs_main): Don't check UID self-sigs twice.
+
+2002-08-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (clean_subkeys, chk_self_sigs): Merge clean_subkeys
+       into chk_self_sigs.  This improves efficiency as the same
+       signatures are not checked multiple times.  Clarify when a subkey
+       is revoked (any revocation signature, even if it is dated before
+       the binding signature).
+
+       * getkey.c (merge_selfsigs_subkey): Subkey revocation comments.
+
+       * keylist.c (list_one): Stats are only for public key listings.
+
+       * g10.c (main), options.skel: Default should be include-revoked
+       for keyserver operations.
+
+2002-08-21  Werner Koch  <wk@gnupg.org>
+
+       * import.c (import_print_stats): Print new non_imported counter
+       which is currently not used because we terminate on errors.
+
+2002-08-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Document no-include-attributes for
+       keyserver-options.
+
+       * keylist.c, keyedit.c, keyserver.c, sign.c: Some TODOs and
+       comments.
+
+       * export.c (do_export_stream): Fix noop bug in exporting sensitive
+       revocation keys.
+
+       * pkclist.c (do_edit_ownertrust): Comment out the option for
+       showing trust paths until it can be implemented.
+
+2002-08-19  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (get_user_id_native): Renamed to ..
+       (get_user_id_printable): this.  Filter out all dangerous
+       characters.  Checked all usages.
+       (get_user_id_string_native): Renamed to..
+       (get_user_id_string_printable): this.  Filter out all dangerous
+       characters.  Checked all usages.
+       * keyedit.c (show_basic_key_info): New.
+       * keylist.c (print_fingerprint): New mode 3.
+       * import.c (import_one): Use new function to display the user ID.
+
+2002-08-16  Timo Schulz  <ts@winpt.org>
+
+       * g10.c (main): Enable opt.interactive.
+
+       * import.c (import_one): Ask the user if the key shall be
+       imported when the interactive mode is used. Useful to extract
+       selected keys from a file.
+       
+2002-08-16  Werner Koch  <wk@gnupg.org>
+
+       * seckey-cert.c: Workaround to allow decryption of v3 keys created
+       with a bug in the mpi_get_secure_buffer.
+
+2002-08-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (parse_hkp_index): Properly handle really large keys
+       (5 digit key length) in HKP searches.
+
+2002-08-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * encode.c (encode_simple): Fix problem with using compression
+       algo 2 and symmetric compressed files.
+
+       * encode.c (encode_simple, encode_crypt): If we are not using a
+       MDC, compress even if a file is already compressed.  This is to
+       help against the chosen ciphertext attack.
+
+       * pkclist.c (select_algo_from_prefs): Fix requested algorithm bug
+       so the request succeeds even if the requested algorithm is not the
+       first found.
+
+       * cipher.c (write_header), encode.c (use_mdc, encode_simple,
+       encode_crypt, encrypt_filter), g10.c (main): Be more eager to use
+       a MDC.  We use a MDC if the keys directly support it, if the keys
+       list AES (any) or TWOFISH anywhere in the prefs, or if the cipher
+       chosen does not have a 64 bit blocksize.
+
+2002-08-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Some language tweaks, and remove the
+       load-extension section for random gatherers.
+
+       * keyring.c (create_tmp_file, rename_tmp_file): Create tmp files
+       with user-only permissions, but restore the original permissions
+       if the user has something special set.
+
+       * openfile.c (copy_options_file): Create new options file
+       (gpg.conf) with user-only permissions.
+
+       * keydb.c (keydb_add_resource): Create new keyrings with user-only
+       permissions.
+
+       * tdbio.c (tdbio_set_dbname): Create new trustdbs with user-only
+       permissions.
+
+2002-08-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (signature_check2): Sanity check that the md has a
+       context for the hash that the sig is expecting.  This can happen
+       if a onepass sig header does not match the actual sig, and also if
+       the clearsign "Hash:" header is missing or does not match the
+       actual sig.
+
+       * keyedit.c (menu_revsig): Properly show a uid is revoked without
+       restarting gpg.  This is Debian bug 124219, though their supplied
+       patch will not do the right thing.
+
+       * main.h, tdbio.c (tdbio_set_dbname), misc.c (removed
+       check_permissions), keydb.c (keydb_add_resource), g10.c (main,
+       check_permissions): Significant reworking of the permission check
+       mechanism.  The new behavior is to check everything in the homedir
+       by checking the homedir itself.  If the user wants to put
+       (possibly shared) keyrings outside the homedir, they are not
+       checked.  The options file and any extension files are checked
+       wherever they are, as well as their enclosing directories.  This
+       is Debian bug 147760.
+       
+2002-08-06  Stefan Bellon  <sbellon@sbellon.de>
+
+       * g10.c (main): Use of EXTSEP_S in new gpg.conf string.
+       * openfile.c (copy_options_file): Ditto.
+
+2002-08-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), mainproc.c (proc_encrypted):
+       --ignore-mdc-error option to turn a MDC check error into a
+       warning.
+
+       * encode.c (encode_crypt), g10.c (main), sign.c (sign_file,
+       clearsign_file): Use the same --pgpX warning string everywhere to
+       ease translations.
+
+       * encode.c (write_pubkey_enc_from_list): Warn when using
+       --throw-keyid with --pgpX.  Noted by Vedaal Nistar.
+
+       * revoke.c (export_minimal_pk, gen_desig_revoke, gen_revoke):
+       Export a minimal pk along with the revocation cert when in --pgpX
+       mode so that PGP can import it.
+
+2002-08-06  Werner Koch  <wk@gnupg.org>
+
+       * options.skel: Changed comments.
+
+       * g10.c (main): Try to use "gpg.conf" as default option file.
+       * openfile.c (copy_options_file): Changed name of created file.
+
+2002-08-02  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (LDFLAGS): Removed DYNLINK_LDFLAGS.
+
+2002-07-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), mainproc.c (proc_encrypted): Return a
+       decryption failed error if a MDC does not verify.  Warn if a MDC
+       is not present (can disable via --no-mdc-warning).
+
+       * exec.c (exec_write), g10.c (main), keyserver.c
+       (keyserver_spawn): Use new DISABLE_KEYSERVER_PATH rather than
+       FIXED_EXEC_PATH.
+
+2002-07-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * sig-check.c (do_check): Properly validate v4 sigs with no hashed
+       section at all.
+
+2002-07-25  Werner Koch  <wk@gnupg.org>
+
+       * delkey.c (do_delete_key): Always allow to delete a key in batch mode
+       when specified by fingerprint.  Suggested by Enzo Michelangeli.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_revsig): Change "revsig" to honor selected uids
+       so the user can revoke sigs from particular uids only.
+
+       * keylist.c (list_keyblock_print): Don't display expired uids in
+       --list-keys unless -v and not --list-sigs (just like revoked
+       uids).
+
+       * exec.c, export.c, import.c, keyedit.c, keyserver.c, misc.c:
+       "Warning" -> "WARNING"
+
+2002-07-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, import.c (parse_import_options, fix_hkp_corruption,
+       import_one, delete_inv_parts), g10.c (main): New import-option
+       "repair-hkp-subkey-bug", which repairs as much as possible the HKP
+       mangling multiple subkeys bug.  It is on by default for keyserver
+       receives, and off by default for regular --import.
+
+       * main.h, import.c (import, import_one, delete_inv_parts), hkp.c
+       (hkp_ask_import), keyserver.c (keyserver_spawn): Use keyserver
+       import options when doing keyserver receives.
+
+       * options.h, exec.h, exec.c (set_exec_path, exec_write), g10.c
+       (main), keyserver.c (keyserver_spawn): If the user does not use
+       "exec-path", completely replace $PATH with GNUPG_LIBEXECDIR before
+       calling the keyserver helper.  If the user does use "exec-path",
+       append GNUPG_LIBEXECDIR after the specified path.
+
+2002-07-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (parse_import_options), export.c
+       (parse_export_options): Fix offset problem with reversed ("no-")
+       meanings.
+
+       * import.c (delete_inv_parts): Discard subkey signatures (0x18 and
+       0x28) if found in the userid section of the key.
+
+       * sig-check.c (signature_check2): Signatures made by invalid
+       subkeys (bad/missing binding sig) are also invalid.
+
+       * keylist.c (print_fingerprint): Show the primary as well as the
+       secondary key fingerprint in modes 1 & 2.
+
+2002-07-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, main.h, g10.c (main), import.c
+       (parse_import_options, delete_inv_parts), keyserver.c
+       (parse_keyserver_options): add new --import-options option.  The
+       only current flag is "allow-local-sigs".
+
+       * g10.c (main): Don't disable MDC in pgp7 mode.
+
+       * options.h, g10.c (main), keyserver.c (parse_keyserver_options):
+       Remove old keyserver-option include-attributes now that there is
+       an export-option for the same thing.
+
+       * options.h, main.h, export.c (parse_export_options,
+       do_export_stream), g10.c (main): add new --export-options option.
+       Current flags are "include-non-rfc", "include-local-sigs",
+       "include-attributes", and "include-sensitive-revkeys".
+
+       * options.h, hkp.c (hkp_export), keyserver.c
+       (parse_keyserver_options, keyserver_spawn): try passing unknown
+       keyserver options to export options, and if successful, use them
+       when doing a keyserver --send-key.
+
+       * build-packet.c (build_sig_subpkt): We do not generate
+       SIGSUBPKT_PRIV_VERIFY_CACHE anymore.
+
+       * revoke.c (gen_desig_revoke): Lots more comments about including
+       sensitive revkeys along with the revocation sig itself.
+
+       * keyserver.c (parse_keyserver_options): Simpler implementation
+       that can skip one pass over the options.
+
+2002-07-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu, menu_addrevoker): Allow specifying
+       "sensitive" as an argument to an addrevoker command.  This sets
+       the 0x40 sensitive revoker flag.
+
+       * revoke.c (gen_desig_revoke): When generating a designated
+       revocation, include the direct key sig that contains the
+       designated revoker subpacket.  This allows sensitive designated
+       revocation subpackets to be exported.  Also indicate which
+       revokers are sensitive in the first place.
+
+2002-07-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names_colon): The 0x40 class bit in
+       a designated revoker means "sensitive", not "local".  It's
+       exportable under the right circumstances.
+
+       * main.h, options.h, export.c (do_export_stream), g10.c (main),
+       hkp.c (hkp_export), keyserver.c (keyserver_spawn: Add a flag to
+       skip attribute packets and their signatures while exporting.  This
+       is to accomodate keyservers (pksd again) that choke on attributes.
+       Use keyserver-option "include-attributes" to control it.  This
+       defaults to ON (i.e. don't skip).
+
+2002-07-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keyserver.c (parse_keyserver_uri, keyserver_spawn,
+       keyserver_work), hkp.c (hkp_ask_import, hkp_export, hkp_search):
+       Use a much more strict reading of RFC-2396 for the keyserver URIs.
+       Specifically, don't try and be smart about checking the value of
+       ":port" so long as it is all digits, and properly handle opaque
+       data (those scheme specific parts that do not start with "//").
+
+2002-07-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.c (get_default_photo_command, show_photos): Honor
+       FIXED_PHOTO_VIEWER and DISABLE_PHOTO_VIEWER.
+
+       * mainproc.c (check_sig_and_print): Use --show-photos to show
+       photos when verifying a sig made by a key with a photo.
+
+       * keyserver.c (parse_keyserver_uri): Properly parse a URI with no
+       :port section and an empty file path, but with a terminating '/'.
+       (keyserver_work): Honor DISABLE_KEYSERVER_HELPERS.
+
+       * hkp.c (hkp_ask_import): Display keyserver URI as a URI, but only
+       if verbose.
+
+       * exec.c, g10.c: USE_EXEC_PATH -> FIXED_EXEC_PATH
+
+2002-07-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.h, exec.c (set_exec_path, exec_write), g10.c (main): If
+       USE_EXEC_PATH is defined at compile time, use it to lock the
+       exec-path and not allow the user to change it.
+
+2002-07-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keyserver.c (keyserver_refresh):
+       Maintain and use the original keyserver URI for cosmetics rather
+       than trying to recreate it when needed.
+
+       * mainproc.c (check_sig_and_print): Properly disregard expired
+       uids.  Make sure that the first uid listed is a real uid and not
+       an attribute (attributes should only be listed in the "aka"
+       section).  When there are no valid textual userids, try for an
+       invalid textual userid before using any attribute uid.
+
+2002-07-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Fix a few typos, clarify "group", and remove
+       sample photo viewers for Win32 since they are the defaults now.
+
+       * parse-packet.c (make_attribute_uidname), keylist.c
+       (dump_attribs): Fix two typecast warnings.
+
+       * packet.h, build-packet.c (build_attribute_subpkt), exec.c
+       (expand_args), mkdtemp.c (mkdtemp), photoid.c
+       (parse_image_header): Fix some signedness compiler warnings.
+
+2002-07-01  Werner Koch  <wk@gnupg.org>
+
+       * photoid.c (get_default_photo_command): Also use __MINGW32__
+       instead of HAVE_DOSISH_SYSTEM.
+
+       * encode.c (encode_symmetric): Do not use the new encryption code.
+
+2002-06-30  Werner Koch  <wk@gnupg.org>
+
+       * photoid.c: Use __MINGW32__ to include windows because
+       HAVE_DOSISH_SYSTEM is also set for OS/2 and plain DOS.  Provide
+       constant missing in older mingw installations. 
+
+2002-06-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * g10.c [__riscos__]: Moved RISC OS specific stuff to util/riscos.c
+       and include/util.h.
+
+       * gpgv.c [__riscos__]: Likewise.
+
+2002-06-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, pkclist.c (select_algo_from_prefs): Allow passing a
+       suggested algorithm which will be used if available.
+
+       * encode.c (encode_crypt, encrypt_filter), sign.c (sign_file): Use
+       new select_algo_from_prefs feature to check if forcing an
+       algorithm would violate the recipient preferences.
+
+       * photoid.c (get_default_photo_command, show_photos): Use
+       different default viewers on different platforms.  Currently we
+       have Win 9x, Win NT (2k, xp), Mac OSX, RISC OS, and "everybody
+       else".  These are #ifdefs as much as possible to avoid clutter.
+
+       * g10.c (strusage, build_list), keyedit.c (show_prefs), main.h,
+       misc.c (compress_algo_to_string, check_compress_algo), pkclist.c
+       (algo_available), keygen.c (keygen_set_std_prefs): New
+       algo_to_string and check functions for compress algorithms.
+
+2002-06-20  Werner Koch  <wk@gnupg.org>
+
+       * misc.c (setsysinfo): Removed a #warning for Alpha's uniligedn
+       trap disabling - it is quite possible that this is a debug relict.
+
+2002-06-20  Stefan Bellon  <sbellon@sbellon.de>
+
+       * g10.c [__riscos__]: Added image file system feature.
+
+       * gpgv.c [__riscos__]: Added image file system feature.
+
+       * photoid.c (show_photos) [__riscos__]: Set RISC OS filetype of
+       photo id according to MIME type.
+
+2002-06-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (parse_hkp_index): Don't leak memory when failing out of a
+       bad HKP keyserver.
+
+       * g10.c (add_notation_data): Relax slightly the rules as to what
+       can go into a notation name - 2440 allows "@", for example.
+
+2002-06-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (clean_subkeys, import_one): Only allow at most 1
+       binding sig and at most 1 revocation sig on a subkey, as per
+       2440:11.1.
+
+       * hkp.c (parse_hkp_index, hkp_search): Error if the keyserver
+       returns an unparseable HKP response.
+
+2002-06-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names), keylist.c
+       (list_keyblock_print): Show "[expired]" before expired uids.
+
+       * keyedit.c (show_key_with_all_names_colon), mainproc.c
+       (list_node), keylist.c (list_keyblock_colon): Show flag 'e' for
+       expired user ids.  Use "uat" for user attribute packets instead of
+       "uid".  Also use '<count> <length>' rather than the fake user id
+       string on attributes.
+
+       * keygen.c (keygen_add_revkey): Remove unused code.
+
+       * misc.c (check_permissions): Check directory permissions
+       properly - they are not special files.
+
+       * pkclist.c (expand_id, expand_group, build_pk_list): When
+       expanding groups before building a pk list, inherit flags from the
+       original pre-expanded string.
+
+       * pubkey-enc.c (is_algo_in_prefs): Don't use prefs from expired
+       uids.
+
+2002-06-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * free-packet.c (copy_signature): Properly copy a signature that
+       carries a revocation key on it.
+
+       * pkclist.c (expand_id, expand_group, build_pk_list): Groups now
+       work properly when used in the "Enter the user ID" prompt.
+
+2002-06-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (show_key_with_all_names): Display warning if a user
+       tries to show prefs on a v3 key with a v3 selfsig.
+
+       * kbnode.c (dump_kbnode): Show if a uid is expired.
+
+       * import.c (merge_blocks, import_revoke_cert): Show user ID
+       receiving a revocation certificate.
+
+       * free-packet.c (cmp_user_ids): Properly compare attribute ids.
+
+       * pkclist.c (expand_groups): Maintain the strlist flags while
+       expanding.  Members of an expansion inherit their flags from the
+       expansion key.
+
+       * options.h, cipher.c (write_header), g10.c (main), keygen.c
+       (keygen_set_std_prefs): remove the personal_mdc flag.  It no
+       longer serves a purpose now that the personal preference lists are
+       split into cipher/digest/zip.
+
+2002-06-14  Timo Schulz  <ts@winpt.org>
+
+       * skclist.c (is_insecure): Implemented.
+       
+2002-06-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Properly handle PROGRAM responses
+       when they have a CRLF ending.  Noted by Keith Ray.
+
+       * keyserver.c (keyserver_spawn): Handle CRLF endings from
+       keyserver helpers.  Also don't leak the last line worth of memory
+       from the keyserver response.
+
+       * main.h, misc.c (deprecated_warning): New function to warn about
+       deprecated options and commands.
+
+       * g10.c (main), keyserver-internal.h, keyserver.c
+       (parse_keyserver_uri): Use new deprecated function to warn about
+       honor-http-proxy, auto-key-retrieve, and x-broken-hkp.
+
+2002-06-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: link gpg with NETLIBS for the built-in HKP access.
+
+2002-06-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, keyserver.c (keyserver_opts), g10.c (main): New
+       keyserver option "include-subkeys".  This feature already existed,
+       but now can be turned off.  It defaults to on.
+
+       * options.h, keyserver.c (parse_keyserver_options,
+       keyserver_spawn): There are now enough options to justify making a
+       structure for the keyserver options rather than a page of
+       if-then-else-if-then-etc.
+
+       * getkey.c (merge_keys_and_selfsig, merge_selfsigs_main): Fix bug
+       in calculating key expiration dates.
+
+2002-06-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * keydb.h, getkey.c (get_user_id_native), import.c (import_one):
+       Display user ID while importing a key.  Note this applies to both
+       --import and keyserver --recv-keys.
+
+       * exec.c (exec_finish): Log unnatural exit (core dump, killed
+       manually, etc) for fork/exec/pipe child processes.
+
+2002-06-08  Timo Schulz  <ts@winpt.org>
+
+       * encode.c (encode_symmetric): Disable the compat flag
+       when the expert mode is enabled.
+       
+2002-06-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel, options.h, main.h, keydb.h, pkclist.c
+       (build_pk_list, expand_groups), g10.c (main, add_group): Add new
+       "group" command to allow one name to expand into multiple keys.
+       For simplicity, and to avoid potential loops, we only expand once
+       - you can't make an alias that points to an alias.
+
+       * main.h, g10.c (main), keygen.c (build_personal_digest_list):
+       Simplify the default digest list - there is really no need for the
+       other hashes since they will never be used after SHA-1 in the
+       list.
+
+       * options.skel, options.h, g10.c (main), hkp.c (hkp_ask_import,
+       hkp_export, hkp_search), keyserver.c (parse_keyserver_options,
+       parse_keyserver_uri, keyserver_work, keyserver_refresh): Make the
+       "x-broken-hkp" keyserver scheme into keyserver-option
+       "broken-http-proxy".  Move honor_http_proxy into
+       keyserver_options.  Canonicalize the three variations of "hkp",
+       "x-hkp", and "x-broken-hkp" into "hkp".
+
+2002-06-07  Stefan Bellon  <sbellon@sbellon.de>
+
+       * g10.c [__riscos__]: Added --attribute-file to do the same as
+       --attribute-fd, but with a filename not a fd as argument.
+       Added magic symbol for RISC OS to use different memory management.
+
+       * gpgv.c [__riscos__]: Added magic symbol for RISC OS to use
+       different memory management.
+
+2002-06-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, g10.c (main), keygen.c (build_personal_digest_list): Put
+       in a default digest preference list consisting of SHA-1, followed
+       by every other installed digest except MD5.  Note this is the same
+       as having no digest preference at all except for SHA-1 being
+       favored.
+
+       * options.h, g10.c (main), keygen.c (keygen_set_std_prefs),
+       pkclist.c (select_algo_from_prefs): Split
+       --personal-preference-list into three:
+       --personal-{cipher|digest|compress}-preferences.  This allows a
+       user to set one without affecting another (i.e. setting only a
+       digest pref doesn't imply an empty cipher pref).
+
+       * exec.c (exec_read): This is a safer way of guessing the return
+       value of system().  Noted by Stefan Bellon.
+
+2002-06-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (parse_hkp_index): Be more robust with keyservers
+       returning very unparseable responses.
+
+       * exec.c (exec_read): Catch and display an error when the remote
+       process exits unnaturally (i.e. segfault) so the user knows what
+       happened.  Also fix exec_write stub which has a different number
+       of arguments now.
+
+2002-06-05  Timo Schulz  <ts@winpt.org>
+
+       * encode.c (encode_simple): Ignore the new mode for RFC1991.
+       * mainproc.c (symkey_decrypt_sesskey): Better check for weird
+       keysizes.
+       
+2002-06-05  Timo Schulz  <ts@winpt.org>
+
+       * encode.c (encode_sesskey): New.
+       (encode_simple): Use it here. But by default we use the compat
+       mode which supress to generate encrypted session keys.
+       
+2002-06-05  Timo Schulz  <ts@winpt.org>
+
+       * mainproc.c (symkey_decrypt_sesskey): New.
+       (proc_symkey_enc): Support for encrypted session keys.
+       
+2002-06-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (hash_for, sign_file): When encrypting and signing at the
+       same time, consult the various hash prefs to pick a hash algorithm
+       to use.  Pass in a 160-bit hint if any of the signing keys are
+       DSA.
+
+       * keydb.h, pkclist.c (select_algo_from_prefs, algo_available):
+       Pass a "hints" opaque pointer in to let the caller give hints as
+       to what algorithms would be acceptable.  The only current hint is
+       for PREFTYPE_HASH to require a 160-bit hash for DSA.  Change all
+       callers in encode.c (encode_crypt, encrypt_filter) and sign.c
+       (sign_file).  If we settle on MD5 as the best algorithm based
+       solely on recepient keys and SHA1 is also a possibility, use SHA1
+       unless the user intentionally chose MD5.  This is as per 2440:13.
+
+       * exec.c (make_tempdir): Fix duplicated filename problem.
+
+2002-06-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, parse-packet.c (enum_sig_subpkt): Report back from
+       enum_sig_subpkt when a subpacket is critical and change all
+       callers in keylist.c (show_policy_url, show_notation), mainproc.c
+       (print_notation_data), and pkclist.c (do_show_revocation_reason).
+
+       * keylist.c (show_policy_url, show_notation): Display if the
+       policy or notation is critical.
+       
+2002-06-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, g10.c (main), keylist.c (dump_attribs, set_attrib_fd,
+       list_keyblock_print, list_keyblock_colon), status.h, status.c
+       (get_status_string): New --attribute-fd feature to dump the
+       contents of attribute subpackets for frontends.  If --status-fd is
+       also used, then a new status tag ATTRIBUTE is provided for each
+       subpacket.
+
+       * packet.h, getkey.c (fixup_uidnode, merge_selfsigs_main,
+       merge_selfsigs_subkey), parse-packet.c (setup_user_id): Keep track
+       of the expiration time of a user ID, and while we're at it, use
+       the expired flag from the selfsig rather than reparsing the
+       SIG_EXPIRE subpacket.
+
+       * photoid.c (generate_photo_id): When adding a new photo ID,
+       showing the photo for confirmation is not safe when noninteractive
+       since the "user" may not be able to dismiss a viewer window.
+       Noted by Timo Schulz.
+       
+2002-06-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: Sample photo viewers for Win32.
+
+       * misc.c (pct_expando): Use the seckey for %k/%K if the pubkey is
+       not available.
+
+       * photoid.h, photoid.c (show_photos): Include the seckey in case a
+       user tries to view a photo on a secret key, and change all callers
+       in keyedit.c (menu_showphoto), keylist.c (list_keyblock_print),
+       and photoid.c (generate_photo_id).
+
+2002-06-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.c (show_photos): Work properly when not called with a
+       public key.
+
+2002-05-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (mk_notation_and_policy): Free unneeded buffer.
+
+       * hkp.c (parse_hkp_index): Properly handle the '&' character
+       (i.e. "&amp;") in HKP responses.
+
+       * getkey.c (merge_selfsigs_main): Fix reversed expiration time
+       check with self-sigs.
+
+       * keyedit.c (sign_uids): When making a new self-sig on a v3 key,
+       make a v3 self-sig unless it is currently a v3 self-sig being
+       promoted to v4.
+
+2002-05-31  Timo Schulz  <ts@winpt.org>
+
+       * pkclist.c (do_show_revocation_reason): Don't use capital
+       letters for non-interactive output.
+       (show_revocation_reason): Now it is global.
+       * pubkey-enc.c (get_it): Show if the key has been revoked.
+       
+2002-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (write_signature_packets, sign_file, clearsign_file,
+       sign_symencrypt_file): Make a v4 signature if a policy URL or
+       notation is set, unless v3 sigs are forced via rfc1991 or
+       force-v3-sigs.  Also remove some doubled code and clarify an error
+       message (we don't sign in PGP2 mode - just detach-sign).
+
+       * parse-packet.c (parse_one_sig_subpkt): Add KS_FLAGS to the "any
+       size" section.
+
+2002-05-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (keygen_set_std_prefs, add_feature_mdc): Use "mdc" and
+       "no-mdc" in the prefs string to allow switching on and off the MDC
+       feature.  This is needed to properly export a key from GnuPG for
+       use on PGP which does not support MDC - without this, MDC-capable
+       implementations will still try and generate MDCs which will break
+       PGP.
+
+       * keygen.c (keygen_get_std_prefs): Show "[mdc]" in prefs string if
+       it is enabled.
+
+       * options.h, g10.c (main), cipher.c (write_header), keygen.c
+       (keygen_set_std_prefs): For consistency, allow the user to specify
+       mdc/no-mdc in the --personal-preference-list.  If disabled, it
+       acts just like --disable-mdc.
+
+2002-05-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, exec.c: Add some debugging info, using the 1024 debug
+       flag.
+
+       * exec.c (win_system): New system()-like function for win32 that
+       does not return until the child process terminates.  Of course,
+       this doesn't help if the process itself exits before it is
+       finished.
+
+2002-05-29  Werner Koch  <wk@gnupg.org>
+
+       * encode.c (encode_simple): Intialize PKT when --no-literal is used.
+
+       * keyedit.c (show_key_with_all_names_colon): Renamed the record
+       for revocation keys to "rvk".
+
+2002-05-27  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (show_key_with_all_names_colon): New.
+       (show_key_with_all_names): Divert to new function when required.
+       Sanitize printing of revoker name.
+
+2002-05-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (build_sig_subpkt): Handle setting sig flags for
+       certain subpacket types (notation, policy url, exportable,
+       revocable).  keyedit.c (sign_mk_attrib): Flags no longer need to
+       be set here.
+
+       * packet.h, parse-packet.c (parse_one_sig_subpkt), build-packet.c
+       (build_sig_subpkt): Call parse_one_sig_subpkt to sanity check
+       buffer lengths before building a sig subpacket.
+
+2002-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (mk_notation_and_policy): Include secret key to enable %s
+       expandos, and pass notations through pct_expando as well.
+
+       * main.h, misc.c (pct_expando): Add %s and %S expandos for
+       signer's keyid.
+
+2002-05-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (strusage, build_list): Add compress algorithms to
+       --version list.  Show algorithm numbers when --verbose --version
+       is done.
+
+2002-05-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, main.h, keygen.c (keygen_set_set_prefs,
+       keygen_get_std_prefs, keygen_upd_std_prefs), keyedit.c
+       (keyedit_menu), g10.c (main), pkclist.c (select_algo_from_prefs):
+       Add --personal-preference-list which allows the user to factor in
+       their own preferred algorithms when the preference lists are
+       consulted.  Obviously, this does not let the user violate a
+       recepient's preferences (and the RFC) - this only influences the
+       ranking of the agreed-on (and available) algorithms from the
+       recepients.  Suggested by David Hollenberg.
+
+       * options.h, keygen.c (keygen_set_std_prefs), g10.c (main): Rename
+       --preference-list to --default-preference-list (as that is what it
+       really is), and make it a true default in that if the user selects
+       "default" they get this list and not the compiled-in list.
+
+2002-05-22  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Add missing LF in a info printout and made it
+       translatable.  Noted by Michael Tokarev.
+
+2002-05-21  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Removed the undef of USE_SHM_COPROCESSING which
+       was erroneously introduced on 2002-01-09.
+
+       * signal.c (got_fatal_signal): Don't write the Nul to stderr.
+       Reported by David Hollenberg.
+
+2002-05-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, g10.c (main), revoke.c (gen_desig_revoke): Generate a
+       designated revocation via --desig-revoke
+
+       * keyedit.c (keyedit_menu, menu_addrevoker): New "addrevoker"
+       command to add a designated revoker to a key.
+
+2002-05-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgv.c: Add stub for get_ownertrust().
+
+       * g10.c (main): --allow-freeform-uid should be implied by
+       OpenPGP.  Add --no-allow-freeform-uid.
+
+       * keyedit.c (sign_uids): Issue a warning when signing a
+       non-selfsigned uid.
+
+       * getkey.c (merge_selfsigs_main): If a key has no selfsigs, and
+       allow-non-selfsigned-uid is not set, still try and make the key
+       valid by checking all uids for a signature from an ultimately
+       trusted key.
+
+2002-05-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keygen.c (keygen_add_revkey): Add revocation key
+       subpackets to a signature (callable by
+       make_keysig_packet). (write_direct_sig): Write a 1F direct key
+       signature. (parse_revocation_key): Parse a string in
+       algo:fpr:sensitive format into a revocation
+       key. (get_parameter_revkey, do_generate_keypair): Call above
+       functions when prompted from a batch key generation file.
+
+       * build-packet.c (build_sig_subpkt): Allow multiple revocation key
+       subpackets in a single sig.
+
+       * keydb.h, getkey.c (get_seckey_byfprint): Same as
+       get_pubkey_byfprint, except for secret keys.  We only know the
+       fingerprint of a revocation key, so this is needed to retrieve the
+       secret key needed to issue a revokation.
+
+       * packet.h, parse-packet.c (parse_signature, parse_revkeys): Split
+       revkey parsing off into a new function that can be used to reparse
+       after manipulating the revkey list.
+
+       * sign.c (make_keysig_packet): Ability to make 1F direct key
+       signatures.
+
+2002-05-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.skel: keyserver.pgp.com is gone, so list pgp.surfnet.nl
+       as a sample LDAP server instead.
+
+       * getkey.c (merge_selfsigs_main): Properly handle multiple
+       revocation keys in a single packet.  Properly handle revocation
+       keys that are in out-of-order packets.  Remove duplicates in
+       revocation key list.
+
+2002-05-14  Timo Schulz   <ts@winpt.org>
+
+       * exec.c (make_tempdir) [MINGW32]: Added missing '\'.
+       
+2002-05-14  Stefan Bellon  <sbellon@sbellon.de>
+
+       * exec.c (make_tempdir): Make use of EXTSEP_S instead of hardcoded
+       dot as extension separator.
+
+2002-05-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.c (show_photos): Use the long keyid as the filename for
+       the photo.  Use the short keyid as the filename on 8.3 systems.
+
+       * exec.h, exec.c (make_tempdir, exec_write, exec_finish): Allow
+       caller to specify filename.  This should make things easier on
+       windows and macs where the file extension is required, but a whole
+       filename is even better.
+
+       * keyedit.c (show_key_with_all_names, show_prefs): Show proper
+       prefs for a v4 key uid with no selfsig at all.
+
+       * misc.c (check_permissions): Don't check permissions on
+       non-normal files (pipes, character devices, etc.)
+
+2002-05-11  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (proc_symkey_enc): Avoid segv in case the parser
+       encountered an invalid packet.
+
+       * keyserver.c (keyserver_export): Get confirmation before sending
+       all keys.
+
+2002-05-10  Stefan Bellon  <sbellon@sbellon.de>
+
+       * g10.c, hkp.c, keyedit.c, keyserver.c: Replaced all occurrances
+       of strcasecmp with ascii_strcasecmp and all occurrances of
+       strncasecmp with ascii_memcasecmp.
+
+2002-05-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, getkey.c (fixup_uidnode), keyedit.c (show_prefs): Show
+       assumed prefs for hash and compression as well as the cipher pref.
+       Show assumed prefs if there are no prefs at all on a v4
+       self-signed key.
+
+       * options.h, g10.c (main), sign.c (make_keysig_packet): New
+       --cert-digest-algo function to override the default key signing
+       hash algorithm.
+
+2002-05-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (merge_selfsigs_main): Make sure the revocation key
+       list starts clean as this function may be called more than once
+       (e.g. from functions in --edit).
+
+       * g10.c, encode.c (encode_crypt), sign.c (sign_file,
+       sign_symencrypt_file): Make --compress-algo work like the
+       documentation says.  It should be like --cipher-algo and
+       --digest-algo in that it can override the preferences calculation
+       and impose the setting the user wants.  No --compress-algo setting
+       allows the usual preferences calculation to take place.
+
+       * main.h, compress.c (compress_filter): use new
+       DEFAULT_COMPRESS_ALGO define, and add a sanity check for compress
+       algo value.
+
+2002-05-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (select_algo_from_prefs): There is an assumed
+       compression preference for uncompressed data.
+
+2002-05-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), getkey.c (finish_lookup), pkclist.c
+       (algo_available): --pgp7, identical to --pgp6 except that it
+       permits a few algorithms that PGP 7 added: AES128, AES192, AES256,
+       and TWOFISH.  Any more of these --pgpX flags, and it'll be time to
+       start looking at a generic --emulate-pgp X option.
+
+       * export.c (do_export_stream): Warn the user when exporting a
+       secret key if it or any of its secret subkeys are protected with
+       SHA1 while simple_sk_checksum is set.
+
+       * parse-packet.c (parse_key): Show when the SHA1 protection is
+       used in --list-packets.
+
+       * options.h, build-packet.c (do_comment), g10.c (main): Rename
+       --no-comment as --sk-comments/--no-sk-comments (--no-comment still
+       works) and make the default be --no-sk-comments.
+
+2002-05-07  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (get_parameter_algo): Never allow generation of the
+       deprecated RSA-E or RSA-S flavors of PGP RSA.
+       (ask_algo): Allow generation of RSA sign and encrypt in expert
+       mode.  Don't allow ElGamal S+E unless in expert mode.
+       * helptext.c: Added entry keygen.algo.rsa_se.
+
+2002-05-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids): If --expert is set, allow re-signing a
+       uid to promote a v3 self-sig to a v4 one.  This essentially
+       deletes the old v3 self-sig and replaces it with a v4 one.
+
+       * packet.h, parse-packet.c (parse_key), getkey.c
+       (merge_keys_and_selfsig, merge_selfsigs_main): a v3 key with a v4
+       self-sig must never let the v4 self-sig express a key expiration
+       time that extends beyond the original v3 expiration time.
+
+2002-05-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids): When making a self-signature via "sign"
+       don't ask about sig level or expiration, and include the usual
+       preferences and such for v4 self-sigs.  (menu_set_preferences):
+       Convert uids from UTF8 to native before printing.
+
+       * keyedit.c (sign_uids): Convert uids from UTF8 to native before
+       printing.  (menu_set_primary_uid): Show error if the user tries to
+       make a uid with a v3 self-sig primary.
+
+2002-05-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (import_one): When merging with a key we already have,
+       don't let a key conflict (same keyid but different key) stop the
+       import: just skip the bad key and continue.
+
+       * exec.c (make_tempdir): Under Win32, don't try environment
+       variables for temp directories - GetTempDir tries environment
+       variables internally, and it's better not to second-guess it in
+       case MS adds some sort of temp dir handling to Windows at some
+       point.
+
+2002-05-05  Timo Schulz  <ts@winpt.org>
+
+       * mainproc.c (proc_symkey_enc): Don't ask for a passphrase
+        in the list only mode.
+       
+2002-05-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_refresh): --refresh-keys implies
+       --merge-only so as not to import keys with keyids that match the
+       ones being refreshed.  Noted by Florian Weimer.
+
+2002-05-04  Stefan Bellon  <sbellon@sbellon.de>
+
+       * free-packet.c (copy_public_key): Don't call m_alloc(0), therefore
+       added consistency check for revkey and numrefkeys.
+
+       * getkey.c (check_revocation_keys): Added consistency check for
+       revkey and numrefkeys.
+
+       * keyedit.c (show_key_with_all_names): Likewise.
+
+2002-05-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.c: Provide default image viewer for Win32.
+
+       * misc.c (pct_expando): %t means extension, not name ("jpg", not
+       "jpeg").
+
+       * keyserver.c (keyserver_spawn), photoid.c (show_photos), exec.h,
+       exec.c: Allow the caller to determine the temp file extension when
+       starting an exec_write and change all callers.
+
+       * keyedit.c (sign_uids): Nonrevocable key signatures cause an
+       automatic promotion to v4.
+
+       * exec.c: Provide stubs for exec_ functions when NO_EXEC is
+       defined.
+
+2002-05-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * photoid.h, photoid.c (parse_image_header, image_type_to_string):
+       Useful functions to return data about an image.
+
+       * packet.h, parse-packet.c (make_attribute_uidname,
+       parse_attribute_subpkts, parse_attribute), photoid.h, photoid.c
+       (show_photos): Handle multiple images in a single attribute
+       packet.
+
+       * main.h, misc.c (pct_expando), sign.c (mk_notation_and_policy),
+       photoid.c (show_photos): Simpler expando code that does not
+       require using compile-time string sizes.  Call
+       image_type_to_string to get image strings (i.e. "jpg",
+       "image/jpeg").  Change all callers.
+
+       * keyedit.c (menu_showphoto), keylist.c (list_keyblock_print):
+       Allow viewing multiple images within a single attribute packet.
+
+       * gpgv.c: Various stubs for link happiness.
+
+2002-05-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (build_sig_subpkt), keyedit.c (sign_uids),
+       options.h, sign.c (mk_notation_and_policy), g10.c (main,
+       add_notation_data, add_policy_url (new), check_policy_url
+       (removed)): Allow multiple policy URLs on a given signature.
+       Split "--notation-data" into "--cert-notation" and
+       "--sig-notation" so the user can set different policies for key
+       and data signing.  For backwards compatibility, "--notation-data"
+       sets both, as before.
+
+2002-05-02  Werner Koch  <wk@gnupg.org>
+
+       * options.skel: Removed the comment on trusted-keys because this
+       option is now deprecated.
+
+2002-05-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_adduid): 2440bis04 says that multiple attribute
+       packets on a given key are legal.
+
+       * keyserver.c (keyserver_refresh): the fake v3 keyid hack applies
+       to "mailto" URLs as well since they are also served by pksd.
+
+2002-04-29  Werner Koch  <wk@gnupg.org>
+
+       Added a copyright year for files changed this year.
+
+2002-04-25  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, options.h: New options --display, --ttyname, --ttytype,
+       --lc-ctype, --lc-messages to be used with future versions of the
+       gpg-agent. 
+       * passphrase.c (agent_send_option,agent_send_all_options): New.
+       (agent_open): Send options to the agent.
+
+       * trustdb.c (update_ownertrust, clear_ownertrust): Do an explicit
+       do_sync because revalidation_mark does it only if when the
+       timestamp actually changes.
+
+2002-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, keygen.c (do_generate_keypair), keylist.c
+       (print_signature_stats, list_all, list_one, list_keyblock,
+       list_keyblock_print, list_keyblock_colon): After generating a new
+       key, show the key information (name, keyid, fingerprint, etc.)
+       Also do not print uncheckable signatures (missing key..) in
+       --check-sigs.  Print statistics (N missing keys, etc.) after
+       --check-sigs.
+
+       * keyedit.c (sign_uids): When signing a key with an expiration
+       date on it, the "Do you want your signature to expire at the same
+       time?" question should default to YES.
+
+2002-04-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse_plaintext), packet.h, plaintext.c
+       (handle_plaintext): Fix bug in handling literal packets with
+       zero-length data (no data was being confused with partial body
+       length).
+
+       * misc.c (pct_expando), options.skel: %t means extension ("jpg").
+       %T means MIME type ("image/jpeg").
+
+       * import.c (import_one): Only trigger trust update if the keyring
+       is actually changed.
+
+       * export.c (do_export_stream): Missing a m_free.
+
+2002-04-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * keyid.c (expirestr_from_sk, expirestr_from_sig): Added _() to
+       string constant.
+
+       * exec.c (make_tempdir) [__riscos__]: Better placement of
+       temporary file.
+
+2002-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (generate_subkeypair): 2440bis04 adds that creating
+       subkeys on v3 keys is a MUST NOT.
+
+       * getkey.c (finish_lookup): The --pgp6 "use the primary key"
+       behavior should only apply while data signing and not encryption.
+       Noted by Roger Sondermann.
+
+2002-04-19  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (keygen_set_std_prefs): Put back 3DES because the RFC
+       says it is good form to do so.
+
+2002-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_deluid): Only cause a trust update if we delete
+       a non-revoked user id.
+
+       * hkp.c (hkp_ask_import), keyserver.c (parse_keyserver_options,
+       keyserver_spawn), options.h: Remove fast-import keyserver option
+       (no longer meaningful).
+
+       * g10.c (main), keyedit.c (sign_uids), options.h: Change
+       --default-check-level to --default-cert-check-level as it makes
+       clear what it operates on.
+
+       * g10.c (main): --pgp6 also implies --no-ask-sig-expire.
+
+       * delkey.c (do_delete_key): Comment.
+
+       * keyedit.c (sign_uids, keyedit_menu, menu_deluid, menu_delsig,
+       menu_expire, menu_revsig, menu_revkey): Only force a trustdb check
+       if we did something that changes it.
+
+       * g10.c: add "--auto-check-trustdb" to override a
+       "--no-auto-check-trustdb"
+
+2002-04-19  Werner Koch  <wk@gnupg.org>
+
+       * tdbio.c (tdbio_write_nextcheck): Return a status whether the
+       stamp was actually changed.
+       * trustdb.c (revalidation_mark): Sync the changes.  Removed the
+       sync operation done by its callers.
+       (get_validity): Add logic for maintaining a pending_check flag.
+       (clear_ownertrust): New.
+       
+       * keyedit.c (sign_uids): Don't call revalidation_mark depending on
+       primary_pk.
+       (keyedit_menu): Call revalidation_mark after "trust".
+       (show_key_with_all_names): Print a warning on the wrong listed key
+       validity.
+
+       * delkey.c (do_delete_key): Clear the owenertrust information when
+       deleting a public key.
+       
+2002-04-18  Werner Koch  <wk@gnupg.org>
+
+       * seskey.c (encode_md_value): Print an error message if a wrong
+       digest algorithm is used with DSA.  Changed all callers to cope
+       with a NULL return.  Problem noted by Imad R. Faiad.
+
+2002-04-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (mark_usable_uid_certs): Properly handle nonrevocable
+       signatures that can expire.  In short, the only thing that can
+       override an unexpired nonrevocable signature is another unexpired
+       nonrevocable signature.
+
+       * getkey.c (finish_lookup): Always use primary signing key for
+       signatures when --pgp6 is on since pgp6 and 7 do not understand
+       signatures made by signing subkeys.
+
+2002-04-18  Werner Koch  <wk@gnupg.org>
+
+       * trustdb.c (validate_keys): Never schedule a nextcheck into the
+       past.
+       (validate_key_list): New arg curtime use it to set next_expire.
+       (validate_one_keyblock): Take the current time from the caller.
+       (clear_validity, reset_unconnected_keys): New.
+       (validate_keys): Reset all unconnected keys.
+
+       * getkey.c (premerge_public_with_secret): Fixed 0x12345678! syntax
+       for use with secret keys.
+       (lookup): Advance the searchmode after a search FIRST.
+
+       * seckey-cert.c (do_check): Always calculate the old checksum for
+       use after unprotection.
+
+       * g10.c, options.skel: New option --no-escape-from.  Made
+       --escape-from and --force-v3-sigs the default and removed them
+       from the options skeleton.
+
+2002-04-16  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (parse_key): Support a SHA1 checksum as per
+       draft-rfc2440-bis04.
+       * packet.h (PKT_secret_key): Add field sha1chk.
+       * seckey-cert.c (do_check): Check the SHA1 checksum
+       (protect_secret_key): And create it.
+       * build-packet.c (do_secret_key): Mark it as sha-1 protected.
+       * g10.c, options.h: New option --simple-sk-checksum.
+
+2002-04-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse_signature): Minor fix - signatures should
+       expire at their expiration time and not one second later.
+
+       * keygen.c (proc_parameter_file): Allow specifying preferences
+       string (i.e. "s5 s2 z1 z2", etc) in a batchmode key generation
+       file.
+
+       * keyedit.c (keyedit_menu): Print standard error message when
+       signing a revoked key (no new translation).
+
+       * getkey.c (merge_selfsigs): Get the default set of key prefs from
+       the real (not attribute) primary uid.
+
+2002-04-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * pkclist.c (build_pk_list): Fix bug that allowed a key to be
+       selected twice in batch mode if one instance was the default
+       recipient and the other was an encrypt-to.  Noted by Stefan
+       Bellon.
+
+       * parse-packet.c (dump_sig_subpkt): Show data in trust and regexp
+       sig subpackets.
+
+       * keyedit.c (keyedit_menu): Use new function real_uids_left to
+       prevent deleting the last real (i.e. non-attribute) uid.  Again,
+       according to the attribute draft. (menu_showphoto): Make another
+       string translatable.
+
+2002-04-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * build-packet.c (build_sig_subpkt): Delete subpackets from both
+       hashed and unhashed area on update.  (find_subpkt): No longer
+       needed.
+
+       * keyedit.c (sign_uids): With --pgp2 on, refuse to sign a v3 key
+       with a v4 signature.  As usual, --expert overrides.  Try to tweak
+       some strings to a closer match so they can all be translated in
+       one place.  Use different helptext keys to allow different help
+       text for different questions.
+
+       * keygen.c (keygen_upd_std_prefs): Remove preferences from both
+       hashed and unhashed areas if they are not going to be used.
+
+2002-04-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (pct_expando), options.skel: Use %t to indicate type of a
+       photo ID (in this version, it's always "jpeg").  Also tweak string
+       expansion loop to minimize reallocs.
+
+       * mainproc.c (do_check_sig): Variable type fix.
+
+       * keyedit.c (menu_set_primary_uid): Differentiate between true
+       user IDs and attribute user IDs when making one of them primary.
+       That is, if we are making a user ID primary, we alter user IDs.
+       If we are making an attribute packet primary, we alter attribute
+       packets.  This matches the language in the latest attribute packet
+       draft.
+
+       * keyedit.c (sign_uids): No need for the empty string hack.
+
+       * getkey.c (fixup_uidnode): Only accept preferences from the
+       hashed segment of the self-sig.
+
+2002-04-10  Werner Koch  <wk@gnupg.org>
+
+       * tdbio.c (migrate_from_v2): Fixed the offset to read the old
+       ownertrust value and only add entries to the table if we really
+       have a value.
+
+2002-04-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * status.h, status.c (get_status_string): Add KEYEXPIRED, EXPSIG,
+       and EXPKEYSIG.  Add "deprecated-use-keyexpired-instead" to
+       SIGEXPIRED.
+
+       * sig-check.c (do_check): Start transition from SIGEXPIRED to
+       KEYEXPIRED, since the actual event is signature verification by an
+       expired key and not an expired signature. (do_signature_check,
+       packet.h): Rename as signature_check2, make public, and change all
+       callers.
+
+       * mainproc.c (check_sig_and_print, do_check_sig): Use status
+       EXPSIG for an expired, but good, signature.  Add the expiration
+       time (or 0) to the VALIDSIG status line.  Use status KEYEXPSIG for
+       a good signature from an expired key.
+
+       * g10.c (main): remove checks for no arguments now that argparse
+       does it.
+
+2002-04-06  Werner Koch  <wk@gnupg.org>
+
+       * keyring.c (keyring_get_keyblock): Disable the keylist mode here.
+
+       * encode.c (encode_simple, encode_crypt): Only test on compressed
+       files if a compress level was not explicity set.
+
+       * keygen.c (keygen_set_std_prefs): Removed Blowfish and Twofish
+       from the list of default preferences, swapped the preferences of
+       RMD160 and SHA1.  Don't include a preference to 3DES unless the
+       IDEA kludge gets used.
+
+       * free-packet.c (free_packet): call free_encrypted also for
+       PKT_ENCRYPTED_MDC.
+
+       * compress.c (release_context): New.
+       (handle_compressed): Allocate the context and setup a closure to
+       release the context.  This is required because there is no
+       guarabntee that the filter gets popped from the chain at the end
+       of the function.  Problem noted by Timo and probably also the
+       cause for a couple of other reports.
+       (compress_filter): Use the release function if set.
+
+       * tdbio.c [__CYGWIN32__]: Don't rename ftruncate.  Noted by
+       Disastry.
+
+       * parse-packet.c (parse_signature): Put parens around a bit test.
+
+       * exec.c (make_tempdir): Double backslash for TMP directory
+       creation under Windows.  Better strlen the DIRSEP_S constants for
+       allocation measurements.
+
+       * decrypt.c (decrypt_messages): Release the passphrase aquired
+       by get_last_passphrase.
+
+2002-04-02  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (EXTRA_DIST): Removed OPTIONS an pubring.asc - they
+       are no longer of any use. 
+
+2002-04-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (parse_keyserver_options): fix auto-key-retrieve to
+       actually work as a keyserver-option (noted by Roger Sondermann).
+
+       * keylist.c (reorder_keyblock): do not reorder the primary
+       attribute packet - the first user ID must be a genuine one.
+
+2002-03-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * keylist.c (list_keyblock_colon): Fix ownertrust display with
+       --with-colons.
+
+       * keygen.c (generate_user_id), photoid.c (generate_photo_id):
+       Properly initialize the user ID refcount.  A few more "y/n" ->
+       "y/N" in photoid.c.
+
+       * keyedit.c (ask_revoke_sig): Warn the user if they are about to
+       revoke an expired sig (not a problem, but they should know).  Also
+       tweak a few prompts to change "y/n" to "y/N", which is how most
+       other prompts are written.
+
+       * keyserver.c (keyserver_search_prompt): Control-d escapes the
+       keyserver search prompt.
+
+       * pkclist.c (show_revocation_reason & callers): If a subkey is
+       considered revoked solely because the parent key is revoked, print
+       the revocation reason from the parent key.
+
+       * trustdb.c (get_validity): Allow revocation/expiration to apply
+       to a uid/key with no entry in the trustdb.
+
+2002-03-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (printunquoted): unquote backslashes from keyserver
+       searches
+
+       * hkp.c (write_quoted): quote backslashes from keyserver searches
+
+2002-03-26  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (ask_keysize): Removed the warning for key sizes > 1536.
+
+2002-03-25  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (sign_uids): Use 2 strings and not a %s so that
+       translations can be done the right way.
+       * helptext.c: Fixed small typo.
+
+2002-03-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (append_uid, merge_sigs): it is okay to import
+       completely non-signed uids now (with --allow-non-selfsigned-uid).
+
+       * getkey.c (get_primary_uid, merge_selfsigs_main): do not choose
+       an attribute packet (i.e. photo) as primary uid.  This prevents
+       oddities like "Good signature from [image of size 2671]".  This is
+       still not perfect (one can still select an attribute packet as
+       primary in --edit), but is closer to the way the draft is going.
+
+       * g10.c (build_list): algorithms should include 110.
+
+       * g10.c (main): --pgp2 implies --no-ask-sig-expire and
+       --no-ask-cert-expire as those would cause a v4 sig/cert.
+
+       * armor.c (is_armor_header): be more lenient in what constitutes a
+       valid armor header (i.e. -----BEGIN blah blah-----) as some
+       Windows programs seem to add spaces at the end.  --openpgp makes
+       it strict again.
+
+2002-03-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_search_prompt): Properly handle a "no
+       keys found" case from the internal HKP code (external HKP is ok).
+       Also, make a COUNT -1 (i.e. streamed) keyserver response a little
+       more efficient.
+
+       * g10.c (main): Add --no-allow-non-selfsigned-uid
+
+2002-03-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): --openpgp implies --allow-non-selfsigned-uid.
+
+       * getkey.c (merge_selfsigs_main): If none of the uids are primary
+       (because none are valid) then pick the first to be primary (but
+       still invalid).  This is for cosmetics in case some display needs
+       to print a user ID from a non-selfsigned key.  Also use
+       --allow-non-selfsigned-uid to make such a key valid and not
+       --always-trust.  The key is *not* automatically trusted via
+       --allow-non-selfsigned-uid.
+
+       * mainproc.c (check_sig_and_print): Make sure non-selfsigned uids
+       print [uncertain] on verification even though one is primary now.
+
+       * getkey.c (merge_selfsigs): If the main key is not valid, then
+       neither are the subkeys.
+
+       * import.c (import_one): Allow --allow-non-selfsigned-uid to work
+       on completely unsigned keys.  Print the uids in UTF8.  Remove
+       mark_non_selfsigned_uids_valid().
+
+       * keyedit.c (show_key_with_all_names): Show revocation key as
+       UTF8.
+
+       * sign.c (clearsign_file): Allow --not-dash-escaped to work with
+       v3 keys.
+
+2002-03-14  Werner Koch  <wk@gnupg.org>
+
+       * main.h: Changed the default algorithms to CAST5 and SHA1.
+
+2002-03-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * import.c (chk_self_sigs): Show which user ID a bad self-sig
+       (invald sig or unsupported public key algorithm) resides on.
+
+       * import.c (chk_self_sigs): any valid self-sig should mark a user
+       ID or subkey as valid - otherwise, an attacker could DoS the user
+       by inventing a bogus invalid self-signature.
+
+2002-03-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): make a few more strings translatable.
+
+       * options.h, options.skel, g10.c (main), gpgv.c, mainproc.c
+       (check_sig_and_print), keyserver.c (parse_keyserver_options):
+       --auto-key-retrieve should really be a keyserver-option variable.
+
+       * import.c (revocation_present): new function to print a warning
+       if a key is imported that has been revoked by designated revoker,
+       but the designated revoker is not present to verify the
+       revocation.  If keyserver-options auto-key-retrieve is set, try
+       and fetch the designated revoker from the keyserver.
+
+       * import.c (import_one): call revocation_present after importing a
+       new key.  Note that this applies to --import, --recv-keys, and
+       --search-keys.
+       
+       * keyserver-internal.h, keyserver.c (keyserver_import_fprint):
+       import via fingerprint (for revocation keys).
+
+       * keyserver.c (keyserver_import_keyid): much simpler
+       implementation now that we're using KEYDB_SEARCH_DESC internally.
+
+2002-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * revoke.c (gen_revoke): do not prompt for revocation reason for
+       v3 revocations (unless force-v4-certs is on) since they wouldn't
+       be used anyway.
+
+       * keyedit.c (menu_revsig): show the status of the sigs
+       (exportable? revocable?) to the user before prompting for which
+       sig to revoke.  Also, make sure that local signatures get local
+       revocations.
+
+       * keyedit.c (ask_revoke_sig): remind the user which sigs are
+       local.
+
+       * g10.c (main): Add "exec-path" variable to override PATH for
+       execing programs.
+
+       * export.c (do_export_stream): properly check return code from
+       classify_user_id to catch unclassifiable keys.
+
+2002-03-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (parse_signature): variable type tweak for RISC
+       OS (from Stefan)
+
+2002-02-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * getkey.c (check_revocation_keys): New function to check a
+       revocation against a list of potential revocation keys.  Note the
+       loop-breaking code here.  This is to prevent blowing up if A is
+       B's revocation key, while B is also A's.  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.  It does at least have the advantage of
+       much simpler code - my first version of this had lots of loop
+       maintaining code so you could chain revokers many levels deep and
+       if D was revoked, C was not, which meant that B was, and so on.
+       It was sort of scary, actually.
+
+       * getkey.c (merge_selfsigs_main): Add any revocation keys onto the
+       pk.  This is particularly interesting since we normally only get
+       data from the most recent 1F signature, but you need multiple 1F
+       sigs to properly handle revocation keys (PGP does it this way, and
+       a revocation key could be marked "sensitive" and hence in a
+       different signature).  Also, if a pk has a revocation key set,
+       check for revocation sigs that were not made by us - if made by a
+       valid revocation key, mark the pk revoked.
+
+       * packet.h, getkey.c (cache_public_key): do not cache key if
+       "dont_cache" is set.  This allows the revocation key code to look
+       up a key and return information that may be inaccurate to prevent
+       loops without caching the fake data.
+
+       * packet.h, sig-check.c (do_signature_check): Record if a
+       signature was made by a revoked pk.
+
+       * packet.h, parse-packet.c (parse_one_sig_subpkt,
+       can_handle_critical, parse_signature): Get revocation key
+       information out of direct sigs.
+       
+       * keylist.c (list_keyblock_print): don't assume that the presence
+       of a 0x20 signature means the key is revoked.  With revocation
+       keys, this may not be true if the revocation key is not around to
+       verify it or if verification failed.  Also, 0x1F should get listed
+       as "sig", and not "unexpected signature class".
+
+       * keyedit.c (show_key_with_all_names): Add a flag for printing
+       revoker information and change all callers.
+
+       * import.c (merge_blocks): merge in any new direct key (0x1F)
+       sigs.
+
+       * import.c (import_revoke_cert): don't keep processing after a
+       revocation is rejected.
+       
+       * import.c (delete_inv_parts): Allow importing a revocation
+       signature even if it was not issued by the key.  This allows a
+       revocation key to issue it.  Of course, the sig still needs to be
+       checked before we trust it.
+
+       * free-packet.c (copy_public_key): Include a new copy of the
+       revocation keys when duping a pk.
+
+       * free-packet.c (free_seckey_enc, release_public_key_parts): Free
+       any revocation keys that are attached to a sig or pk.
+
+       * export.c (do_export_stream): Do not export signatures with
+       "sensitive" revocation keys in them.
+
+2002-02-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * export.c (do_export_stream): Do not include v3 keys in a
+       --export-secret-subkeys export.
+
+       * getkey.c (merge_selfsigs_main): If a key isn't valid (say,
+       because of no self-signature), allow --always-trust to force it
+       valid so it can be trusted.
+
+2002-02-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (hkp_ask_import), hkp.h, keyserver.c (all): treat key
+       lists internally as fingerprints when possible.  All this is via
+       KEYDB_SEARCH_DESC - no point in reinventing the wheel. This allows
+       the helper program to search the keyserver by fingerprint if
+       desired (and the keyserver supports it).  Note that automatic
+       fingerprint promotion during refresh only applies to v4 keys as a
+       v4 fingerprint can be easily changed into a long or short key id,
+       and a v3 cannot.
+
+       * pubkey-enc.c, getkey.c, misc.c, main.h: Take two copies of
+       hextobyte() from pubkey-enc.c and getkey.c and make them into one
+       copy in misc.c.
+
+2002-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_search_prompt): Detect a "no keys found"
+       case even if the helper program does not explicitly say how many
+       keys were found.
+
+       * hkp.c (parse_hkp_index): Bug fix - don't report non-revoked keys
+       as revoked in HKP key searches.
+
+2002-02-19  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (parse_trust): Made parsing more robust.
+
+2002-02-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (parse_hkp_index): Catch corruption in HKP index lines
+       (can be caused by broken or malicious keyservers).
+
+       * keyserver.c (keyserver_work): Add KEYSERVER_NOT_SUPPORTED for
+       unsupported actions (say, a keyserver that has no way to search,
+       or a readonly keyserver that has no way to add).  Also add a
+       USE_EXTERNAL_HKP define to disable the internal HKP keyserver
+       code.
+
+2002-02-14  Werner Koch  <wk@gnupg.org>
+
+       * g10.c: New option --no-use-agent. 
+
+       * pkclist.c (check_signatures_trust): Always print the warning for
+       unknown and undefined trust.  Removed the did_add cruft.  Reported
+       by Janusz A. Urbanowicz.
+
+2002-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * hkp.c (parse_hkp_index): Bug fix - properly handle user IDs with
+       colons (":") in them while HKP searching.
+
+2002-02-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (pct_expando): More comments.
+
+       * keydb.h, sign.c (mk_notation_and_policy): Clarify what is a sig
+       and what is a cert.  A sig has sigclass 0x00, 0x01, 0x02, or 0x40,
+       and everything else is a cert.
+
+       * g10.c (main), keyedit.c (keyedit_menu): Add a "nrlsign" for
+       nonrevocable and local key signatures.
+
+       * g10.c (main): Add a --no-force-mdc to undo --force-mdc.
+
+       * options.h, g10.c (main), cipher.c (write_header): Add a knob to
+       --disable-mdc/--no-disable-mdc.  Off by default, of course, but is
+       used in --pgp2 and --pgp6 modes.
+       
+       * pkclist.c (build_pk_list): Allow specifying multiple users in
+       the "Enter the user ID" loop.  Enter a blank line to stop.  Show
+       each key+id as it is added.
+
+       * keylist.c (show_policy_url), mainproc.c (print_notation_data):
+       It is not illegal (though possibly silly) to have multiple policy
+       URLs in a given signature, so print all that are present.
+       
+       * hkp.c (hkp_search): More efficient implementation of URL-ifying
+       code.
+
+2002-02-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * main.h, misc.c (pct_expando): New function to generalize
+       %-expando processing in any arbitrary string.
+
+       * photoid.c (show_photo): Call the new pct_expando function rather
+       than expand strings internally.
+       
+       * sign.c (mk_notation_and_policy): Show policy URLs and notations
+       when making a signature if show-policy/show-notation is on.
+       %-expand policy URLs during generation.  This lets the user have
+       policy URLs of the form "http://notary.jabberwocky.com/keysign/%K"
+       which will generate a per-signature policy URL.
+
+       * main.h, keylist.c (show_policy_url, show_notation): Add amount
+       to indent so the same function can be used in key listings as well
+       as during sig generation.  Change all callers.
+
+2002-02-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c, options.h (parse_keyserver_options, keyidlist):
+       Workaround for the pksd and OKS keyserver bug that calculates v4
+       RSA keyids as if they were v3.  The workaround/hack is to fetch
+       both the v4 (e.g. 99242560) and v3 (e.g. 68FDDBC7) keyids.  This
+       only happens for key refresh while using the HKP scheme and the
+       refresh-add-fake-v3-keyids keyserver option must be set.  This
+       should stay off by default.
+
+2002-02-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Bug fix - do not append keys to
+       each other when --sending more than one.
+
+2002-02-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c (main), keyedit.c (sign_uids), sign.c
+       (mk_notation_and_policy): Split "--set-policy-url" into
+       "--cert-policy-url" and "--sig-policy-url" so the user can set
+       different policies for key and data signing.  For backwards
+       compatibility, "--set-policy-url" sets both, as before.
+
+2002-01-30  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): --gen-random --armor does now output a base64
+       encoded string.
+
+2002-01-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main), options.h, pkclist.c (algo_available): --pgp6
+       flag.  This is not nearly as involved as --pgp2.  In short, it
+       turns off force_mdc, turns on no_comment, escape_from, and
+       force_v3_sigs, and sets compression to 1.  It also restricts the
+       user to IDEA (if present), 3DES, CAST5, MD5, SHA1, and RIPEMD160.
+       See the comments above algo_available() for lots of discussion on
+       why you would want to do this.
+
+2002-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (keygen_set_std_prefs): Comment
+
+       * keyedit.c (sign_uids): Bug fix - when signing with multiple
+       secret keys at the same time, make sure each key gets the sigclass
+       prompt.
+
+       * exec.c (exec_finish): Close the iobuf and FILE before trying to
+       waitpid, so the remote process will get a SIGPIPE and exit.  This
+       is only a factor when using a pipe to communicate.
+
+       * exec.c (exec_write): Disable cache-on-close of the fd iobuf (is
+       this right?  Why is a fd iobuf cached at all?)
+
+2002-01-26  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, options.h: New option --gpg-agent-info
+       * passphrase.c (agent_open): Let it override the environment info.
+       * seckey-cert.c (check_secret_key): Always try 3 times when the
+       agent is enabled.
+       * options.skel: Describe --use-agent.
+
+2002-01-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * pubkey-enc.c (is_algo_in_prefs, get_it): Only check preferences
+       against keys with v4 self sigs - there is really little point in
+       warning for every single non-IDEA message encrypted to an old key.
+
+       * pkclist.c (select_algo_from_prefs): Only put in the fake IDEA
+       preference if --pgp2 is on.
+
+       * mainproc.c (check_sig_and_print): Print "Expired" for expired
+       but good signatures (this still prints "BAD" for expired but bad
+       signatures).
+
+2002-01-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * keygen.c (ask_keysize): Cosmetic: don't present a RSA signing
+       key as a "keypair" which can be 768 bits long (as RSA minimum is
+       1024).
+
+       * pubkey-enc.c (is_algo_in_prefs): Allow IDEA as a fake preference
+       for v3 keys with v3 selfsigs.
+
+2002-01-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * packet.h, getkey.c (merge_selfsigs_main), pkclist.c
+       (select_algo_from_prefs): Implement the fake IDEA preference as
+       per RFC2440:12.1.  This doesn't mean that IDEA will be used (the
+       plugin may not be present), but it does mean that a v3 key with a
+       v3 selfsig has an implicit IDEA preference instead of 3DES.  v3
+       keys with v4 selfsigs use preferences as normal.
+
+       * encode.c (encode_crypt): if select_algo_from_prefs fails, this
+       means that we could not find a cipher that both keys like.  Since
+       all v4 keys have an implicit 3DES preference, this means there is
+       a v3 key with a v3 selfsig in the list.  Use 3DES in this case as
+       it is the safest option (we know the v4 key can handle it, and
+       we'll just hope the v3 key is being used in an implementation that
+       can handle it).  If --pgp2 is on, warn the user what we're doing
+       since it'll probably break PGP2 compatibility.
+
+       * g10.c (main): Do not force using IDEA for encrypted files in
+       --pgp2 mode - let the fake IDEA preference choose this for us for
+       better compatibility when encrypting to multiple keys, only some
+       of which are v3.
+
+       * keygen.c (keygen_set_std_prefs): Put 3DES on the end of the
+       default cipher pref list (RFC2440: "...it is good form to place it
+       there explicitly.").  If the user has the IDEA plugin installed,
+       put a preference for IDEA *after* 3DES to effectively disable its
+       use for everything except encrypting along with v3 keys.
+
+       * encode.c, g10.c, sign.c: Change the PGP2 warning line from
+       "... will not be usable ..." to "... may not be usable ..." as the
+       user could be using one of the enhanced PGP2 variations.
+
+       * helptext.c: Revise the sign_uid.class help text as suggested by
+       Stefan.
+       
+2002-01-20  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (passphrase_to_dek): Add tryagain_text arg to be
+       used with the agent.  Changed all callers.
+       (agent_get_passphrase): Likewise and send it to the agent
+       * seckey-cert.c (do_check): New arg tryagain_text.
+       (check_secret_key): Pass the string to do_check.
+       * keygen.c (ask_passphrase): Set the error text is required.
+       * keyedit.c (change_passphrase): Ditto.
+
+       * passphrase.c (agent_open): Disable opt.use_agent in case of a
+       problem with the agent. 
+       (agent_get_passphrase): Ditto.
+       (passphrase_clear_cache): Ditto.
+
+2002-01-19  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (agent_open): Add support for the new Assuan based
+       gpg-agent.  New arg to return the used protocol version.
+       (agent_get_passphrase): Implemented new protocol here.
+       (passphrase_clear_cache): Ditto.
+       (readline): New.
+       
+2002-01-15  Timo Schulz  <ts@winpt.org>
+
+       * encode.c (encode_crypt_files): Fail if --output is used.
+       
+       * g10.c: New command --decrypt-files.
+
+       * decrypt.c (decrypt_messages): New.
+       
+2002-01-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c, misc.c, gpgv.c: move idea_cipher_warn to misc.c so gpgv.c
+       doesn't need a stub for it any longer.
+
+       * g10.c (get_temp_dir), main.h: no longer used (it's in exec.c now)
+
+       * g10.c (main), delkey.c (delete_keys), main.h : Allow
+       --delete-key (now --delete-keys, though --delete-key still works,
+       of course) to delete multiple keys in one go.  This applies to
+       --delete-secret-key(s) and --delete-secret-and-public-key(s) as
+       well.
+
+2002-01-09  Timo Schulz  <ts@winpt.org>
+
+       * encode.c (encode_crypt_files): Now it behaves like verify_files.
+       
+       * g10.c (main): We don't need to check argc for encode_crypt_files
+       any longer.
+
+2002-01-09  Timo Schulz  <ts@winpt.org>
+
+       * exec.c: Include windows.h for dosish systems.
+
+2002-01-08  Timo Schulz  <ts@winpt.org>
+
+       * g10.c (main): New description for --encrypt-files.
+
+2002-01-08  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Must register the secring for encryption because
+       it is needed to figure out the default recipient.  Reported by
+       Roger Sondermann.
+
+2002-01-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (menu_adduid): Require --expert before adding a photo
+       ID to a v3 key, and before adding a second photo ID to any key.
+
+       * keyedit.c (keyedit_menu): Don't allow adding photo IDs in
+       rfc1991 or pgp2 mode.
+
+       * getkey.c (merge_selfsigs_subkey): Permit v3 subkeys.  Believe it
+       or not, this is allowed by rfc 2440, and both PGP 6 and PGP 7 work
+       fine with them.
+
+       * g10.c, options.h, keyedit.c, sign.c: Move the "ask for
+       expiration" switch off of --expert, which was getting quite
+       overloaded, and onto ask-sig-expire and ask-cert-expire.  Both
+       default to off.
+
+       * g10.c (main): Change the default compression algo to 1, to be
+       more OpenPGP compliant (PGP also uses this, so it'll help with
+       interoperability problems as well).
+
+       * encode.c (encode_crypt): Handle compression algo 2, since the
+       default is now 1.
+
+       * build-packet.c (build_attribute_subpkt): Fix off-by-one error.
+
+2002-01-05  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Do not register the secret keyrings for certain
+       commands.
+
+       * keydb.c (keydb_add_resource): Use access to test for keyring
+       existence.  This avoids cached opened files which are bad under
+       RISC OS.
+
+2002-01-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (sign_file, sign_symencrypt_file): always use one-pass
+       packets unless rfc1991 is enabled.  This allows a signature made
+       with a v3 key to work in PGP 6 and 7.  Signatures made with v4
+       keys are unchanged.
+
+       * g10.c (main): Disallow non-detached signatures in PGP2 mode.
+       Move the "you must use files and not pipes" PGP2 warning up so all
+       the PGP2 stuff is together.
+
+       * encode.c (encode_simple): Use the actual filesize instead of
+       partial length packets in the internal literal packet from a
+       symmetric message.  This breaks PGP5(?), but fixes PGP2, 6, and 7.
+       It's a decent tradeoff.  Note there was only an issue with
+       old-style RFC1991 symmetric messages.  2440-style messages in 6
+       and 7 work with or without partial length packets.
+
+2002-01-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Removed --no-default-check-level option, as it is
+       not consistent with other "default" options.  Plus, it is the same
+       as saying --default-check-level 0.
+
+       * exec.c (exec_read): Disallow caching tempfile from child
+       process, as this keeps the file handle open and can cause unlink
+       problems on some platforms.
+
+       * keyserver.c (keyserver_search_prompt): Minor tweak - don't
+       bother to transform keyids into textual form if they're just going
+       to be transformed back to numbers.
+
+2002-01-03  Timo Schulz <ts@winpt.org>
+
+       * g10.c: New command --encrypt-files.
+    
+       * verify.c (print_file_status): Removed the static because
+       encode_crypt_files also uses this function.
+
+       * main.h (print_files_status): New.
+       (encode_crypt_files): New.
+
+       * encode.c (encode_crypt_files): New.
+
+2002-01-02  Stefan Bellon  <sbellon@sbellon.de>
+
+       * keyserver.c: Moved util.h include down in order to avoid
+       redefinition problems on RISC OS.
+
+       * keyring.c (keyring_lock): Only lock keyrings that are writable.
+
+       * keyring.c (keyring_update_keyblock): Close unused iobuf.
+
+       * hkp.c (parse_hkp_index, hkp_search) [__riscos__]: Changed
+       unsigned char* to char* because of compiler issues.
+
+       * exec.c (exec_finish) [__riscos__]: Invalidate close cache so
+       that file can be unlinked.
+
+2001-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (main): Use a different strlist to check extensions since
+       they need to be handled seperately now.
+
+       * misc.c,main.h (check_permissions): Properly handle permission
+       and ownership checks on files in the lib directory
+       (e.g. /usr/local/lib/gnupg), which are owned by root and are
+       world-readable, and change all callers to specify extension or
+       per-user file.
+
+       * photoid.c (show_photo), keyserver.c (keyserver_spawn): Bug fix -
+       don't call exec_finish if exec_write fails.
+
+       * keyserver.c (keyserver_spawn): Look for OPTIONS from the
+       keyserver helper - specifically, a "OUTOFBAND" option for the
+       email keyserver.
+
+       * mainproc.c (list_node), keylist.c (list_keyblock_colon),
+       import.c (delete_inv_parts), export.c (do_export_stream): Use
+       signature flags for exportability check rather than re-parsing the
+       subpacket.
+
+       * keyid.c, keydb.h (get_lsign_letter): No longer needed.
+
+2001-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.c (exec_finish): Show errors when temp files cannot be
+       deleted for whatever reason.
+
+       * exec.c (exec_read): Don't rely on WEXITSTATUS being present.
+
+       * exec.c (make_tempdir): Add temp file creator for win32.  Don't
+       create an incoming temp file if the exec is write-only.
+
+       * keyserver.c (keyserver_spawn): Clean up error handling, for when
+       the spawn fails.
+
+       * photoid.c (show_photo): Clean up error handling.
+
+       * misc.c (check_permissions): Neaten.
+
+2001-12-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * mkdtemp.c (mkdtemp): Add copyleft info and tweak the 'X' counter
+       to be a bit simpler.
+
+       * keyserver.c, photoid.c: Remove unused headers left over from
+       when the exec functions lived there.
+
+2001-12-23  Timo Schulz <ts@winpt.org>
+
+       * misc.c (check_permissions): Do not use it for W32 systems.
+
+       * tdbio.c (migrate_from_v2): Define ftruncate as chsize() for W32.
+
+       * mkdtemp.c: W32 support.
+
+       * photoid.c: Ditto.
+
+       * exec.c: Ditto.
+
+2001-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * exec.c (make_tempdir): avoid compiler warning with const
+
+       * mkdtemp.c (mkdtemp): catch the empty ("") string case in case
+       someone repurposes mkdtemp at some point.
+
+       * photoid.c (generate_photo_id, show_photo): some type changes
+       from Stefan Bellon.
+
+       * exec.c (make_tempdir): handle Win32 systems, suggested by Timo
+       Schulz.
+
+2001-12-22  Werner Koch  <wk@gnupg.org>
+
+       * encode.c (encode_simple, encode_crypt): i18n 2 strings.
+
+2001-12-22  Timo Schulz <ts@winpt.org>
+       
+       * encode.c (encode_simple, encode_crypt): Use is_file_compressed
+       to avoid to compress compressed files.
+
+2001-12-22  Werner Koch  <wk@gnupg.org>
+
+       * keyserver.c (keyserver_spawn): Removed some variables
+       declaration due to shadowing warnings.
+
+       * build-packet.c (build_attribute_subpkt): s/index/idx/ to avoid
+       compiler warnig due to index(3).
+
+       * getkey.c (get_ctx_handle): Use KEYDB_HANDLE as return value.
+       * keylist.c (list_one): Made resname const.
+
+       * keyedit.c (keyedit_menu): Allow "addphoto" only when --openpgp is
+       not used.
+
+       * options.skel: Changed one example photo viewer to qiv.
+
+2001-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: add exec.c, exec.h, photoid.c, and photoid.h
+
+       * build-packet.c (build_attribute_subpkt): new function to build
+       the raw attribute subpacket.  Note that attribute subpackets have
+       the same format as signature subpackets.
+
+       * exec.c: new file with generic exec-a-program functionality.
+       Used by both photo IDs and keyserver helpers.  This is pretty much
+       the same code that used to be keyserver specific, with some
+       changes to be usable generically.
+
+       * free-packet.c (free_attributes (new)): function to free an
+       attribute packet.
+       
+       * gpgv.c: added stub show_photo
+       
+       * keyedit.c (keyedit_menu, menu_adduid, menu_showphoto): can add a
+       photo (calls generate_photo_id), or display a photo (calls
+       show_photo) from the --edit menu.  New commands are "addphoto",
+       and "delphoto" (same as "deluid").
+
+       * keylist.c (list_keyblock_print): show photos during key list if
+       --show-photos enabled.
+       
+       * keyserver.c (keyserver_spawn): use the generic exec_xxx
+       functions to call keyserver helper.
+
+       * g10.c, options.h: three new options - --{no-}show-photos, and
+       --photo-viewer to give the command line to display a picture.
+
+       * options.skel: instructions for the photo viewer
+       
+       * parse-packet.c (parse_user_id, setup_user_id (new)): common code
+       for both user IDs and attribute IDs moved to setup_user_id.
+
+       * parse-packet.c (make_attribute_uidname (new)): constructs a fake
+       "name" for attribute packets (e.g. "[image of size ...]")
+
+       * parse-packet.c (parse_attribute (replaces parse_photo_id),
+       parse_attribute_subpkts): Builds an array of individual
+       attributes.  Currently only handles attribute image / type jpeg
+       subpackets.
+
+       * sign.c (hash_uid): Fix bug in signing attribute (formerly
+       photo_id) packets.
+
+       * packet.h, and callers: globally change "photo_id" to "attribute"
+       and add structures for attributes.  The packet format is generic
+       attributes, even though the only attribute type thus far defined
+       is jpeg.
+
+2001-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * parse-packet.c (can_handle_critical): Can handle critical
+       revocation subpackets now.
+
+       * trustdb.c (mark_usable_uid_certs): Disregard revocations for
+       nonrevocable sigs.  Note that this allows a newer revocable
+       signature to override an older nonrevocable signature.
+
+       * sign.c (make_keysig_packet): add a duration field and change all
+       callers.  This makes make_keysig_packet closer to
+       write_signature_packets and removes some duplicated expiration
+       code.
+
+       * keyedit.c (keyedit_menu, menu_revsig, sign_uids,
+       sign_mk_attrib): Add nrsign command, don't allow revoking a
+       nonrevocable signature,
+
+       * g10.c (main): Add --nrsign option to nonrevocably sign a key
+       from the command line.
+
+       * build-packet.c (build_sig_subpkt_from_sig): Comment to explain
+       the use of CRITICAL.
+
+2001-12-21  Werner Koch  <wk@gnupg.org>
+
+       * g10.c. options.h : New option --show-keyring
+       * getkey.c (get_ctx_handle): New.
+       * keylist.c (list_one): Implement option here.  By David Champion. 
+
+2001-12-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (keyserver_spawn): Use mkdtemp() to make temp
+       directory.
+
+       * mkdtemp.c: replacement function for those platforms that don't
+       have mkdtemp (make a temp directory securely).
+
+2001-12-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * misc.c (check_permissions): New function to stat() and ensure
+       the permissions of GNUPGHOME and the files have safe permissions.
+
+       * keydb.c (keydb_add_resource): Check keyring permissions.
+
+       * tdbio.c (tdbio_set_dbname): Check permissions of trustdb.gpg
+
+       * keyserver.c (keyserver_spawn): Disable keyserver schemes that
+       involve running external programs if the options file has unsafe
+       permissions or ownership.
+
+       * g10.c, options.h: New option --no-permission-warning to disable
+       the permission warning message(s).  This also permits use of the
+       keyserver if it had been disabled (see above).  Also check the
+       permissions/ownership of random_seed.
+       
+       * keyserver.c (keyserver_spawn): The new glibc prints a warning
+       when using mktemp() (the code was already secure, but the warning
+       was bound to cause confusion).  Use a different implementation
+       based on get_random_bits() instead.  Also try a few times to get
+       the temp dir before giving up.
+
+2001-12-19  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, passphrase.c [CYGWIN32]: Allow this as an alias for MINGW32.
+
+2001-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c (idea_cipher_warn): Add a flag to show the warning always
+       or once per session and change all callers (show always except for
+       the secret key protection and unknown cipher from an encrypted
+       message errors).  Also make the strings translatable.
+
+       * pubkey-enc.c (get_it): Add the IDEA cipher warning if the user
+       tries to decrypt an IDEA encrypted message without the IDEA
+       plugin.
+
+       * keyserver.c (parse_keyserver_uri): More strict checking of the
+       keyserver URI.  Specifically, fail if the ":port" section is
+       anything except a number between 1 and 65535.
+
+2001-12-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.c (print_keyinfo): No need to check for
+       control/illegal characters, as utf8_to_native does this for us.
+
+       * mainproc.c (proc_encrypted): Use generic IDEA warning.
+
+       * gpgv.c: add stub for idea_cipher_warn
+
+       * g10.c, hkp.c, keyserver.c: Fix capitalization and plural issues.
+
+       * encode.c (encode_crypt), sign.c (sign_file, clearsign_file):
+       disable pgp2 mode after the message is no longer pgp2 compatible.
+
+       * g10.c (main): Tweak the PGP2.x IDEA warning to use the generic
+       warning, and not merely fail if the IDEA plugin isn't there.
+
+       * g10.c (main, idea_cipher_warn), keygen.c (set_one_pref),
+       seckey-cert.c (do_check): Add a generic IDEA warning for when the
+       IDEA plugin is not present.  This pops up when the user uses
+       "--cipher-algo idea", when setpref is used to set a "S1"
+       preference, and when a secret key protected with IDEA is used.
+
+2001-12-15  Werner Koch  <wk@gnupg.org>
+
+       * keyserver.c (keyserver_spawn): Assert that we have dropped privs.
+
+2001-12-13  Werner Koch  <wk@gnupg.org>
+
+       * pubkey-enc.c (get_session_key): Check that the public key
+       algorithm is indeed usable for en/decryption.  This avoid a
+       strange error message from pubkey_decrypt if for some reasons a
+       bad algorithm indentifier is passed.
+
+2001-12-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * Fixed some types for portability.  Noted by Stefan Bellon.
+
+2001-12-11  Werner Koch  <wk@gnupg.org>
+
+       * hkp.c (hkp_export): Do not print possible control characters
+       from a keyserver response.
+       (parse_hkp_index): Made uid an unsigned char* because it is passed to
+       isspace().
+       (hkp_search): Ditto for the char* vars.
+
+       * g10.c (main): Print the IDEA warning also for -c and -se.
+       
+       * g10.c (get_temp_dir): Assert that we have dropped privs
+
+       * encode.c (encode_crypt): Include the first key into the --pgp2
+       check.
+
+2001-12-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c, options.h: New option --pgp2.  This is identical to
+       "--rfc1991 --cipher-algo idea --compress-algo 1 --digest-algo md5
+       --force_v3_sigs" with the addition of an warning to advise the
+       user not to use a pipe (which would break pgp2 compatibility).
+
+       * encode.c (encode_crypt): warn if the user tries to encrypt to
+       any key that is not RSA and <= 2048 bits when the --pgp2 option is
+       used.
+
+       * sign.c (sign_file, clearsign_file): When using --pgp2, make a v3
+       sig, and warn if the signature is made with a non-v3 key.
+
+2001-12-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * sign.c (sign_file, clearsign_file, sign_symencrypt_file): Prompt
+       for sig expiration if --expert is set and --force-v3-sigs is not
+       set (v3 sigs cannot expire).
+
+       * mainproc.c (check_sig_and_print): After checking a sig, print
+       expiration status.  This causes a error return if the sig is
+       expired.
+
+       * build-packet.c (build_sig_subpkt_from_sig): Include a critical
+       sig expiration subpacket if the sig is to expire.
+
+       * keyedit.c (sign_uids): Do not sign an expired key unless
+       --expert is set, in which case prompt.  Also, offer to expire a
+       signature when the key the user is signing expires.
+
+       * keygen.c (ask_expire_interval): Add a value to determine whether
+       to prompt for a key or sig expiration and change all callers.
+
+       * keyid.c: New functions: expirestr_from_sig and
+       colon_expirestr_from_sig.
+
+       * keylist.c (list_keyblock_colon): Show sig expiration date in the
+       --with-colons listing.
+
+       * sign.c (make_keysig_packet, write_signature_packets): Pass in an
+       optional timestamp for the signature packet, and change all
+       callers.
+
+       * keyedit.c (sign_mk_attrib): Include a critical expiration
+       subpacket in the signature if an expiration date is given.
+
+2001-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (sign_uids): If the user tries to sign a
+       locally-signed key, allow the cert to be promoted to a full
+       exportable signature.  This essentially deletes the old
+       non-exportable sig, and replaces it with a new exportable one.
+
+2001-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyedit.c (keyedit_menu): Do not allow signing a revoked key
+       unless --expert is set, and ask even then.
+
+       * keyedit.c (sign_uids): Do not allow signing a revoked UID unless
+       --expert is set, and ask even then.
+
+       * g10.c, options.h : New option --expert
+
+2001-11-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * Allow the user to select no compression via "--compress-algo 0"
+       on the command line.
+
+       * keyedit.c (show_prefs): Show compression preferences in the
+       long-form "showpref" style.
+
+       * keygen.c (set_one_pref): Permit setting a no-compression ("Z0")
+       preference.
+
+       * getkey.c (fixup_uidnode): Fix compression preference corruption
+       bug.
+
+2001-12-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c: Add advisory --for-your-eyes-only option as per section
+       5.9 of 2440.
+
+2001-12-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * Force a V4 sig if the user has a notation or policy URL set.
+
+2001-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10.c: Add options --keyserver-options, --temp-directory, and
+       auto-key-retrieve (the opposite of no-auto-key-retrieve).
+
+       * hkp.c (hkp_search): New function to handle searching a HKP
+       keyserver for a key
+
+       * hkp.c (hkp_ask_import, hkp_export): Pretty large changes to make
+       them communicate via the generic functions in keyserver.c
+
+       * keyserver.c: new file with generic keyserver routines for
+       getting keys from a keyserver, sending keys to a keyserver, and
+       searching for keys on a keyserver.  Calls the internal HKP stuff
+       in hkp.c for HKP keyserver functions.  Other calls are handled by
+       an external program which is spawned and written to and read from
+       via pipes.  Platforms that don't have pipes use temp files.
+
+2001-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * options.h, g10.c: New options show-notation, no-show-notation,
+       default-check-level, no-default-check-level, show-policy-url,
+       no-show-policy-url.
+
+       * packet.h, sign.c (make_keysig_packet), parse-packet.c
+       (parse_signature), free-packet.c (free_seckey_enc): Fill in
+       structures for notation, policy, sig class, exportability, etc.
+
+       * keyedit.c, keylist.c (print_and_check_one_sig,
+       list_keyblock_print): Show flags in signature display for cert
+       details (class, local, notation, policy, revocable).  If selected,
+       show the notation and policy url.
+
+       * keyedit.c (sign_uids): Prompt for and use different key sig
+       classes.
+
+       * helptext.c (helptexts): Add help text to explain different
+       key signature classes
+
+2001-11-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * trustdb.c (mark_usable_uid_certs): Fix segfault from bad
+       initialization and fix reversed key signature expiration check.
+
+2001-11-09  Werner Koch  <wk@gnupg.org>
+
+       * export.c (do_export_stream): Put all given names into a search
+       description and change the loop so that all matching names are
+       returned.
+
+2001-11-08  Werner Koch  <wk@gnupg.org>
+
+       * pubkey-enc.c (get_it): To reduce the number of questions on the
+       MLs print the the name of cipher algorithm 1 with the error message.
+
+       * mainproc.c: Changed the way old rfc1991 encryption cipher is
+       selected. Based on a patch by W Lewis.
+
+       * pkclist.c (do_edit_ownertrust): Allow to skip over keys, the non
+       working "show info" is now assigned to "i" 
+       * trustdb.c (ask_ownertrust, validate_keys): Implement a real quit
+       here.  Both are by David Shaw.
+       
+       * trustdb.c (validate_keys): Make sure next_exipire is initialized.
+
+       * sign.c (make_keysig_packet): Use SHA-1 with v4 RSA keys.
+
+       * g10.c, options.h : New option --[no-]froce-v4-certs.
+       * sign.c (make_keysig_packet): Create v4 sigs on v4 keys even with
+       a v3 key.  Use that new option.  By David Shaw
+
+       * revoke.c (ask_revocation_reason): Allow to select "no reason".
+       By David Shaw.
+
+       * keyid.c (fingerprint_from_sk): Calculation of an v3 fpr was
+       plain wrong - nearly the same code in fingerprint_from_pk is correct.
+
+       * build-packet.c (do_secret_key): Added a few comments to the code.
+
+2001-11-07  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Print a warning when -r is used w/o encryption.
+       Suggested by Pascal Scheffers.
+
+2001-10-23  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (keyedit_menu): Changed helptext for showpref
+       command.  Suggested by Reinhard Wobst.
+
+       * keyring.c (keyring_search): When marking the offtbl ready, take
+       into account that we may have more than one keyring.
+
+2001-10-22  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Do not use OMIT_DEPENDENCIES
+
+       * build-packet.c (build_sig_subpkt): Default is now to put all
+       types of subpackets into the hashed area and only list those which
+       should go into the unhashed area.
+
+2001-10-18  Werner Koch  <wk@gnupg.org>
+
+       * keydb.c (keydb_add_resource): Rearranged the way we keep track
+       of the resource. There will now be an entry for each keyring here
+       and not in keyring.c itself.  Store a token to allow creation of a
+       keyring handle.  Changed all functions to utilize this new design.
+       (keydb_locate_writable): Make a real implementation.
+       * keyring.c (next_kr): Removed and changed all callers to set the
+       resource directly from the one given with the handle.
+       (keyring_is_writable): New. 
+       (keyring_rebuild_cache): Add an arg to pass the token from keydb.
+
+2001-10-17  Werner Koch  <wk@gnupg.org>
+
+       * keyring.c (keyring_search): Enabled word search mode but print a
+       warning that it is buggy.
+       
+2001-10-11  Werner Koch  <wk@gnupg.org>
+
+       * hkp.c (hkp_ask_import): No more need to set the port number for
+       the x-hkp scheme. 
+       (hkp_export): Ditto.
+
+2001-10-06  Stefan Bellon  <sbellon@sbellon.de>
+
+       * passphrase.c [__riscos__]: Disabled agent specific stuff.
+       * g10.c: New option --no-force-v3-sigs.
+
+2001-10-04  Werner Koch  <wk@gnupg.org>
+
+       * export.c (do_export_stream): Do not push the compress filter
+       here because the context would run out of scope due to the
+       iobuf_close done by the caller.
+       (do_export): Do it here instead. 
+
+2001-09-28  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (sign_uids): Always use the primary key to sign keys.
+       * getkey.c (finish_lookup): Hack to return only the primary key if
+       a certification key has been requested.
+
+       * trustdb.c (cmp_kid_for_make_key_array): Renamed to
+       (validate_one_keyblock): this and changed arg for direct calling.
+       (make_key_array): Renamed to
+       (validate_one_keyblock): this and changed args for direct calling.
+       (mark_usable_uid_certs, validate_one_keyblock)
+       (validate_key_list): Add next_expire arg to keep track of
+       expiration times.  
+       (validate_keys): Ditto for UTKs and write the stamp.
+
+       * tdbio.c (migrate_from_v2): Check return code of tbdio_sync.
+
+       * tdbdump.c (import_ownertrust): Do a tdbio_sync().
+
+       * keyring.c: Made the offtbl an global object.
+
+2001-09-27  Werner Koch  <wk@gnupg.org>
+
+       * pkclist.c (do_edit_ownertrust): Allow settin of ultimate trust.
+
+       * trustdb.c (mark_keyblock_seen): New.
+       (make_key_array): Use it to mark the subkeys too.
+       (validate_keys): Store validity for ultimatly trusted keys.
+
+2001-09-26  Werner Koch  <wk@gnupg.org>
+
+       * pkclist.c (check_signatures_trust, do_we_trust): Removed the
+       invocation of add_ownertrust. Minor changes to the wording.
+       (add_ownertrust, add_ownertrust_cb): Removed.
+
+       * trustdb.c (get_validity): Allow to lookup the validity using a
+       subkey.
+
+       * trustdb.c (new_key_hash_table): Increased the table size to 1024
+       and changed the masks accordingly.
+       (validate): Changed stats printing.
+       (mark_usable_uid_certs): New.
+       (cmp_kid_for_make_key_array): Does now check the signatures and
+       figures out a usable one.
+
+2001-09-25  Werner Koch  <wk@gnupg.org>
+
+       * keyring.c (new_offset_item,release_offset_items)
+       (new_offset_hash_table, lookup_offset_hash_table)
+       (update_offset_hash_table, update_offset_hash_table_from_kb): New.
+       (keyring_search): Use a offset table to optimize search for
+       unknown keys.
+       (keyring_update_keyblock, keyring_insert_keyblock): Insert new
+       offsets.
+       * getkey.c (MAX_UNK_CACHE_ENTRIES): Removed the unknown keys
+       caching code.
+
+       * g10.c, options.h, import.c: Removed the entire
+       allow-secret-key-import stuff because the validity is now
+       controlled by other means.
+
+       * g10.c: New command --rebuild-keydb-caches.
+       * keydb.c (keydb_rebuild_caches): New.
+       * keyring.c (do_copy): Moved some code to
+       (create_tmp_file, rename_tmp_file, write_keyblock): new functions.
+       (keyring_rebuild_cache): New.
+
+       * packet.h (PKT_ring_trust): Add sigcache field.
+       * parse-packet.c (parse_trust): Parse sigcache.
+       * keyring.c (do_copy): Always insert a sigcache packet.
+       (keyring_get_keyblock): Copy the sigcache packet to the signature.
+       * sig-check.c (cache_sig_result): Renamed from
+       cache_selfsig_result. Changed implementation to use the flag bits
+       and changed all callers.
+       (mdc_kludge_check): Removed this unused code.
+       (do_check): Do not set the sig flags here.
+
+       * import.c (read_block): Make sure that ring_trust packets are
+       never imported.
+       * export.c (do_export_stream): and never export them.
+
+       * trustdb.c (make_key_array): Skip revoked and expired keys.
+
+2001-09-24  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, options.h: New option --no-auto-check-trustdb.
+
+       * keygen.c (do_generate_keypair): Set newly created keys to
+       ultimately trusted.
+
+       * tdbio.h, tdbio.c: Removed all support for records DIR, KEY, UID,
+       PREF, SIG, SDIR and CACH. Changed migration function to work
+       direct on the file.
+       (tdbio_read_nextcheck): New.
+       (tdbio_write_nextcheck): New. 
+
+2001-09-21  Werner Koch  <wk@gnupg.org>
+
+       Revamped the entire key validation system.
+       * trustdb.c: Complete rewrite. No more validation on demand,
+       removed some functions, adjusted to all callers to use the new 
+       and much simpler interface. Does not use the LID anymore.
+       * tdbio.c, tdbio.h: Add new record types trust and valid. Wrote a
+       migration function to convert to the new trustdb layout.
+       * getkey.c (classify_user_id2): Do not allow the use of the "#"
+       prefix. 
+       * keydb.h: Removed the TDBIDX mode add a skipfnc to the
+       descriptor.
+       * keyring.c (keyring_search): Implemented skipfnc.
+
+       * passphrase.c (agent_open): Add missing bracket.  Include windows.h.
+
+2001-09-19  Werner Koch  <wk@gnupg.org>
+
+       * keylist.c (print_fingerprint): Renamed from fingerprint, made
+       global available. Added new arg to control the print style.
+       * mainproc.c (print_fingerprint): Removed. 
+       * pkclist.c (print_fpr, fpr_info): Removed and changed callers to
+       use print_fingerprint.
+       * keyedit.c (show_fingerprint): Ditto.
+
+       * passphrase.c (writen, readn)
+       (agent_open, agent_close)
+       (agent_get_passphrase)
+       (passphrase_clear_cache): Support for W32.  Contributed by Timo.
+
+       * import.c (import_one): Release keydb handles at 2 more places.
+
+       * keyring.c (keyring_release): Close the iobuf.
+       (keyring_get_keyblock): Init ret_kb to NULL and store error contidion.
+
+       * import.c (import_new_stats_handle): New. 
+       (import_release_stats_handle): New.
+       (import_print_stats): Renamed from static fnc print_stats.
+       (import_keys, import_keys_stream): Add an optional status handle
+       arg and changed all callers.
+       * hkp.c (hkp_ask_import): Add an stats_handle arg and changed all
+       callers.
+
+       * mainproc.c (print_pkenc_list): Use print_utf8_string2().
+
+2001-09-18  Werner Koch  <wk@gnupg.org>
+
+       * g10.c: New command --refresh-keys.
+       * hkp.c (hkp_refresh_keys): New. Contributed by Timo Schulz.
+
+       * parse-packet.c (parse): Stop on impossible packet lengths.
+
+2001-09-17  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (print_notation_data): Wrap notation data status lines
+       after 50 chars.
+       
+       * mainproc.c (proc_pubkey_enc): Make option try-all-secrets work.
+       By disastry@saiknes.lv.
+
+2001-09-14  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (dump_sig_subpkt): List key server preferences
+       and show the revocable flag correctly. Contributed by David Shaw.
+
+2001-09-09  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (keyedit_menu): No need to define another p.
+
+       * keylist.c (print_capabilities): s/used/use/ so that it
+       does not shadow a global.
+       * sign.c (sign_file): Renamed arg encrypt to encryptflag
+       * keygen.c: Replaced all "usage" by "use".
+       * misc.c (openpgp_pk_algo_usage): Ditto.
+
+       * pubkey-enc.c (get_it): Renamed arg k to enc so that the later
+       defined k does not shadow it.
+
+       * parse-packet.c (parse_gpg_control): No need to define another i.
+
+       * getkey.c (get_pubkey_byfprint): Must use the enum values and not
+       the fprint_len.
+       * keyring.c (keyring_search): Removed a non-sense break.  Both
+       bugs pointed out by Stefan.
+
+2001-09-07  Werner Koch  <wk@gnupg.org>
+
+       * status.c, status.h: Added NO_RECP and ALREADY_SIGNED.
+       * pkclist.c (build_pk_list): Issue NO_RECP.
+       * keyedit.c (sign_uids): Added experimental ALREADY_SIGNED
+
+       * hkp.c (hkp_import): Use log_error. Bug reported by Neal H
+       Walfield. 
+
+       * getkey.c (classify_user_id2): Change args to take the desc union
+       direct.  It was a stupid idea to pass the individual fields of an
+       union to this function. Changed all callers.
+       (classify_user_id): Ditto and allow to pass NULL as the description.
+
+2001-09-06  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (fixup_uidnode): Features flag is now a bit vector.
+       * keygen.c (add_feature_mdc): Ditto.
+
+       Revamped the entire key I/O code to be prepared for other ways of
+       key storages and to get rid of the existing shit.  GDBM support has
+       gone.
+       * keydb.c: New
+       * keyring.c, keyring.h: New.
+       * ringedit.c: Removed.  Moved some stuff to keyring.c
+       * getkey.c: Changed everything related to the key retrieving
+       functions which are now using the keydb_ functions.  
+       (prepare_search, word_match_chars, word_match)
+       (prepare_word_match, compare_name): Moved to keyring.c
+       (get_pubkey_byname): Removed ctx arg and add ret_kdbhd
+       arg.  Changed all callers.
+       (key_byname): Use get_pubkey_end to release the context and take
+       new ret_kbdhd arg.  Changed all callers.
+       (classify_user_id2): Fill the 16 byte fingerprint up with 4 null
+       bytes not with zero bytes of value 4, tsss.
+       * import.c (import_one): Updated to use the new keydb interface.
+       (import_secret_one): Ditto.
+       (import_revoke_cert): Ditto.
+       * delkey.c (do_delete_key): Ditto. 
+       * keyedit.c (keyedit_menu): Ditto.
+       (get_keyblock_byname): Removed.
+       * revoke.c (gen_revoke): Ditto. 
+       * export.c (do_export_stream): Ditto.
+       * trustdb.c (update_trustdb): Ditto.
+       * g10.c, gpgv.c (main): Renamed add_keyblock_resource to
+       keydb_add_resource. 
+       * Makefile.am:  Added and removed files.
+
+       * keydb.h: Moved KBNODE typedef and MAX_FINGERPRINT_LEN to
+       * global.h: this new header.
+       
+2001-09-03  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (agent_get_passphrase): Changed nread to size_t.
+       (passphrase_clear_cache): Ditto.
+
+       * keyid.c (mk_datestr): Avoid trigraphs.
+       (fingerprint_from_pk): Cache the keyid in the pk.
+
+       * options.h: Add opt.with_fingerprint so that we know whether the
+       corresponding options was used.
+       * g10.c (main): Set it here.
+       * pkclist.c (check_signatures_trust): Always print fingerprint
+       when this option is used.  Mixed a minor memory leak.
+
+       * status.c, status.h: New status INV_RECP.
+       * pkclist.c (build_pk_list): Issue this status.
+
+2001-08-31  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (parse_key,parse_pubkeyenc)
+       (parse_signature): Return error on reading bad MPIs.
+       
+       * mainproc.c (check_sig_and_print): Always print the user ID even
+       if it is not bound by a signature.  Use the primary UID in the
+       status messages and encode them in UTF-8
+       * status.c (write_status_text_and_buffer): New.
+
+2001-08-30  Werner Koch  <wk@gnupg.org>
+
+       * packet.h (sigsubpkttype_t): Add SIGSUBPKT_FEATURES.
+       (PKT_public_key, PKT_user_id): Add a flag for it.
+       * parse-packet.c, build-packet.c: Add support for them.
+       * getkey.c (fixup_uidnode, merge_selfsigs): Set the MDC flags.
+       * keygen.c (add_feature_mdc): New.
+       (keygen_upd_std_prefs): Always set the MDC feature.
+       * keyedit.c (show_prefs): List the MDC flag
+       * pkclist.c (select_mdc_from_pklist): New.
+       * encode.c (encode_crypt, encrypt_filter): Test whether MDC
+       should be used.
+       * cipher.c (write_header): Set MDC use depending on the above test.
+       Print more status info.
+
+       * delkey.c (do_delete_key): Kludge to delete a secret key with no
+       public key available.
+
+       * ringedit.c (find_secret_keyblock_direct): New.
+       * getkey.c (seckey_available): Simplified.
+
+       * ringedit.c (cmp_seckey): Now compares the secret key against the
+       public key while ignoring all secret parts.
+       (keyring_search): Use a public key packet as arg.  Allow to search
+       for subnkeys
+       (search): Likewise. Changed all callers.
+       (find_secret_keyblock_bypk): New.
+       (find_secret_keyblock_byname): First locate the pubkey and then
+       find the correponding secret key.
+       * parse-packet.c (parse): Renamed pkttype arg to onlykeypkts and
+       changed code accordingly.  Changed all callers.
+       (search_packet): Removed pkttype arg.
+       * keyedit.c (keyedit_menu): First locate the public key and then
+       try to locate a secret key.
+
+       * ringedit.c (locate_keyblock_by_fpr): Removed.
+       (locate_keyblock_by_keyid): Removed.
+       (find_keyblock_bysk): Removed.
+
+       * sig-check.c (check_key_signature2): Print the keyid along with
+       the wrong sig class errors.
+
+2001-08-24  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (sign_file): Stripped the disabled comment packet code.
+       (sign_file, sign_symencrypt_file): Moved common code to ..
+       (write_onepass_sig_packets): .. this new function.
+       (sign_file, clearsign_file, sign_symencrypt_file): Moved common
+       code to 
+       (write_signature_packets): this new function.
+       (write_signature_packets, make_keysig_packet)
+       (update_keysig_packet): Moved common code to 
+       (hash_uid, hash_sigclass_to_magic): these new functions
+       (sign_file, sign_symencrypt_file): Moved common code to 
+       (write_plaintext_packet):  this new function.
+
+2001-08-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * trustdb.c (query_trust_info): Changed trustlevel to signed int.
+       * g10.c [__riscos__]: Fixed handling of --use-agent --lock-multiple.
+
+2001-08-20  Werner Koch  <wk@gnupg.org>
+
+       * encr-data.c (decrypt_data): Keep track on whether we already
+       printed information about the used algorithm.
+       * mainproc.c (proc_encrypted): Removed the non-working IDEA hack
+       and print a message about the assumed algorithm.
+       * passphrase.c (passphrase_to_dek): Use the same algorithm as above.
+       (proc_symkey_enc): Print the algorithm, so that the user knows it
+       before entering the passphrase.
+       (proc_pubkey_enc, proc_pubkey_enc): Zero the DEK out.
+       * encode.c (encode_crypt, encrypt_filter): Ditto.
+
+       * g10.c: Allow for --sign --symmetric.
+       * sign.c (sign_and_symencrypt): New.
+
+       Applied patches from Stefan Bellon <sbellon@sbellon.de> to support
+       RISC OS.  Nearly all of these patches are identified by the
+       __riscos__ macro.
+       * compress.c: Added a couple of casts.
+       * g10.c [__riscos__]: Some patches and new options foo-file similar
+       to all foo-fd options.
+       * gpgv.c, openfile.c, ringedit.c, tdbio.c: Minor fixes.  Mainly
+       replaced hardcoded path separators with EXTSEP_S like macros.  
+       * passprase.c [__riscos__]: Disabled agent stuff
+       * trustdb.c (check_trust): Changed r_trustlevel to signed int to
+       avoid mismatch problems in pkclist.c
+       * pkclist.c (add_ownertrust): Ditto.
+       * plaintext.c (handle_plaintext) [__riscos__]: Print a note when
+       file can't be created.
+       * options.h [__riscos__]: Use an extern unless included from the
+       main module.
+       * signal.c (got_fatal_signal) [__riscos__]: Close all files.
+       
+2001-08-14  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (ask_algo): New arg r_usage.  Allow for RSA keys.
+       (gen_rsa): Enabled the code.
+       (do_create): Enabled RSA branch.
+       (parse_parameter_usage): New.
+       (proc_parameter_file): Handle usage parameter.
+       (read_parameter_file): Ditto.
+       (generate_keypair): Ditto.
+       (generate_subkeypair): Ditto.
+       (do_generate_keypair): Ditto.
+       (do_add_key_flags): New.
+       (keygen_add_std_prefs): Use the new function.
+       (keygen_add_key_flags_and_expire): New.
+       (write_selfsig, write_keybinding): Handle new usage arg.
+       * build-packet.c (build_sig_subpkt): Make sure that key flags go
+       into the hashed area.
+       
+       * keygen.c (write_uid): Initialize the reference cunter.
+
+       * keyedit.c (keyedit_menu): No more need to update the trustdb for
+       preferences.  Added calls to merge keblock.
+
+       * kbnode.c (dump_kbnode): Print some more flags.
+
+2001-08-10  Werner Koch  <wk@gnupg.org>
+
+        Revamped the preference handling.
+
+       * packet.h (prefitem_t, preftype_t): New.
+       (PKT_public_key): Added a uid field.
+       (PKT_user_id): Added field to store preferences and a reference
+       counter.
+       * parse-packet.c (parse_user_id,parse_photo_id): Initialize them
+       * free-packet.c (free_user_id): Free them.
+       (copy_user_id): Removed.
+       (scopy_user_id): New. 
+       (cmp_user_ids): Optimized for identical pointers.
+       (release_public_key_parts): Release the uid.
+       (copy_public_key_with_new_namehash): Removed.
+       (copy_prefs): New.
+       * keyedit.c (menu_adduid): Use the new shallow copy user id.
+       (show_prefs): Adjusted implementation.
+       (keyedit_menu): No more need to update the trustdb after changing
+       preferences.
+       * getkey.c (fixup_uidnode): Store preferences.
+       (find_by_name): Return a user id packet and remove namehash stuff.
+       (lookup): Removed the unused namehash stuff.
+       (finish_lookup): Added foundu arg.
+       (pk_from_block): Removed the namehash arg and changed all callers.
+       (merge_selfsigs): Copy prefs to all keys.
+       * trustdb.c (get_pref_data): Removed.
+       (is_algo_in_prefs): Removed.
+       (make_pref_record): Deleted and removed all class.
+       * pkclist.c (select_algo_from_prefs): Adjusted for the new
+       preference implementation.
+       * pubkey-enc.c (is_algo_in_prefs): New.
+       (get_it): Use that new function. 
+
+2001-08-09  Werner Koch  <wk@gnupg.org>
+
+       * build-packet.c (build_sig_subpkt): Fixed calculation of
+       newarea->size.
+
+       * g10.c (main): New option "--preference-list"
+       * keyedit.c (keyedit_menu): New commands "setpref" and "updpref".
+       (menu_set_preferences): New.
+       * keygen.c (keygen_set_std_prefs): New.
+       (set_one_pref): New.
+       (check_zip_algo): New.
+       (keygen_get_std_prefs): New.
+       (keygen_upd_std_prefs): New
+       (keygen_add_std_prefs): Move the pref setting code into the above fnc.
+       * build-packet.c (build_sig_subpkt): Updated the list of allowed
+       to update subpackets.
+
+2001-08-08  Werner Koch  <wk@gnupg.org>
+
+       * packet.h (subpktarea_t): New.
+       (PKT_signature): Use that type for hashed_data and unhashed_data and
+       removed the _data prefix from those fields.  Changed all users.
+       * parse-packet.c (parse_signature): Changed allocation for that.
+       (parse_sig_subpkt): Changed declaration
+       (enum_sig_subpkt): Ditto and changed implementation accordingly.
+       * free-packet.c (cp_subpktarea): Renamed from cp_data_block and
+       adjusted implementation. Changed caller.
+       * sig-check.c (mdc_kludge_check): Adjusted the hashing.
+       (do_check): Ditto.
+       * sign.c (sign_file, clearsign_file, make_keysig_packet,
+       update_keysig_packet): Ditto.
+       * build-packet.c (build_sig_subpkt): Partial rewrite.
+       (find_subpkt): Adjusted and made static.
+       (delete_sig_subpkt): Adjusted.
+       (do_signature): Ditto.
+
+       * keygen.c (ask_keysize): Do not print the notes about suggested
+       key sizes if just a DSA key is generated.
+
+       * trustdb.c (add_ultimate_key): s/log_error/log_info/ for
+       duplicated inserted trusted keys.
+
+2001-08-07  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (sleep): Redefine for W32.
+
+       * g10.c, options.h: Set new flag opt.no_homedir_creation when
+       --no-options is given.
+       * openfile.c (try_make_homedir): Don't create the homedir in that case.
+
+2001-08-03  Werner Koch  <wk@gnupg.org>
+
+       * armor.c (armor_filter): Removed the default comment string
+       because it could get us in trouble due to translations using non
+       ascii characters.
+
+2001-08-01  Werner Koch  <wk@gnupg.org>
+
+       * keylist.c (list_keyblock_print): Do not list revoked UIDs unless
+       in verbose mode and we do no signature listing.
+
+       * getkey.c (finish_lookup): Skip subkeys which are not yet valid.
+       * g10.c, options.h: New option --ignore-valid-from.
+
+       * sign.c (make_keysig_packet): Added new sigversion argument to
+       allow the caller to force generation of required signature
+       version. Changed all callers. Suggested by Thomas Roessler.
+
+       * keyedit.c (sign_uids): Force v4 signature generation for local
+       sigs.  Removed the check for local signature and pre-v4 keys.
+
+2001-07-27  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (sign_uids): Check that we are not trying to to a
+       lsign with a pre-v4 key.  Bug noticed by Thomas Roessler.
+
+2001-07-26  Werner Koch  <wk@gnupg.org>
+
+       * parse-packet.c (parse_photo_id): Reset all variables.
+       * getkey.c (merge_selfsigs_main): Removed checks on PHOTO_ID
+       because this is handled identically to a user ID.
+
+2001-07-06  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c (write_header): Don't use MDC with --rfc1991.  Suggested
+       by disastry@saiknes.lv.
+
+2001-07-05  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, options.h: New option --preserve-permissions.
+       * ringedit.c (add_keyblock_resource): Use it here
+       (keyring_copy): and here.
+
+       * trustdb.c (verify_own_keys): Be more silent on --quiet.
+       Suggested by Thomas Roessler.
+       * sig-check.c (check_key_signature2): Ditto.
+       * mainproc.c (proc_encrypted, proc_tree): Ditto
+       * getkey.c (lookup): Ditto.
+
+2001-07-04  Werner Koch  <wk@gnupg.org>
+
+       * ringedit.c (add_keyblock_resource): Restore filename in case of error.
+
+2001-06-25  Werner Koch  <wk@gnupg.org>
+
+       * kbnode.c (dump_kbnode): Print the signature timestamp.
+
+       * keyedit.c (keyedit_menu): New menu point "primary".
+       (change_primary_uid_cb): New.
+       (menu_set_primary_uid): New.
+       * sign.c (update_keysig_packet): New.
+       * build-packet.c (build_sig_subpkt): Put the primary UID flag into
+       the hashed area. Allow update of some more packets.
+
+2001-06-15  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (merge_selfsigs): Exit gracefully when a secret key is
+       encountered.  May happen if a secret key is in public keyring.
+       Reported by Francesco Potorti.
+       
+2001-06-12  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (compare_name): Use ascii_memistr(), ascii_memcasecmp()
+       * keyedit.c (keyedit_menu): Use ascii_strcasecmp().
+       * armor.c (radix64_read): Use ascii_toupper().  
+       * ringedit.c (do_bm_search): Ditto.
+       * keygen.c (read_parameter_file): Ditto.
+       * openfile.c (CMP_FILENAME): Ditto.
+       * g10.c (i18n_init): We can now use just LC_ALL.
+
+2001-05-29  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (generate_subkeypair): Print a warning if a subkey is
+       created on a v3 key. Suggested by Brian M. Carlson.
+
+2001-05-27  Werner Koch  <wk@gnupg.org>
+
+       * keyid.c (get_lsign_letter): New.
+       * keylist.c (list_keyblock_colon): Use it here.
+       * mainproc.c (list_node): and here.
+
+       * getkey.c, packet.h, free-packet.c: Removed that useless key
+       created field; I dunno why I introducded this at all - the
+       creation time is always bound to the key packet and subject to
+       fingerprint calculation etc.
+
+       * getkey.c (fixup_uidnode): Add keycreated arg and use this
+       instead of the signature timestamp to calculate the
+       help_key_expire.  Bug reported by David R. Bergstein.
+       (merge_selfsigs_main): Correct key expiration time calculation.
+       (merge_selfsigs_subkey): Ditto.
+
+2001-05-25  Werner Koch  <wk@gnupg.org>
+
+       * revoke.c (gen_revoke): Add a cast to a tty_printf arg.
+       * delkey.c (do_delete_key): Ditto.
+       * keyedit.c (print_and_check_one_sig): Ditto.
+       (ask_revoke_sig): Ditto.
+       (menu_revsig): Ditto.
+       (check_all_keysigs): Removed unused arg.
+
+2001-05-23  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (opts): Typo fix by Robert C. Ames.
+
+2001-05-06  Werner Koch  <wk@gnupg.org>
+
+       * revoke.c: Small typo fix
+
+2001-05-04  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (passphrase_clear_cache): Shortcut if agent usage
+       is not enabled.
+
+2001-05-01  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (writen): Replaced ssize_t by int.  Thanks to 
+       to Robert Joop for reporting that SunOS 4.1.4 does not have it.
+
+2001-04-28  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (merge_public_with_secret): pkttype was not set to subkey.
+
+2001-04-27  Werner Koch  <wk@gnupg.org>
+
+       * skclist.c (build_sk_list): Changed one log_debug to log_info.
+
+2001-04-25  Werner Koch  <wk@gnupg.org>
+
+       * keyedit.c (show_prefs): Add a verbose mode.
+       (show_key_with_all_names): Pass verbose flag for special value of
+       with_pref.
+       (keyedit_menu): New command "showpref"
+       (show_key_with_all_names): Mark revoked uids and the primary key.
+
+2001-04-24  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (get_primary_uid): Return a different string in case of
+       error and made it translatable.
+
+       * build-packet.c (do_secret_key): Ugly, we wrote a zero
+       instead of the computed ndays.  Thanks to M Taylor for complaining
+       about a secret key import problem.
+
+2001-04-23  Werner Koch  <wk@gnupg.org>
+
+       * hkp.c (hkp_ask_import): Allow to specify a port number for the 
+       keyserver.  Add a kudge to set the no_shutdown flag.
+       (hkp_export): Ditto.
+       * options.skel: Document the changes 
+
+2001-04-20  Werner Koch  <wk@gnupg.org>
+
+       * options.skel: Add some more comments.
+
+2001-04-19  Werner Koch  <wk@gnupg.org>
+
+       * keyid.c (mk_datestr): New.  Handles negative times.  We must do
+       this because Windoze segvs on negative times passed to gmtime().
+       Changed all datestr_from function to use this one.
+
+       * keyid.c, keyid.h (colon_strtime): New. To implement the
+       fixed-list-mode.
+       (colon_datestr_from_pk): New.
+       (colon_datestr_from_sk): New.
+       (colon_datestr_from_sig): New.
+       * keylist.c (list_keyblock_colon): Use these functions here.
+       * mainproc.c (list_node): Ditto.
+
+2001-04-18  Werner Koch  <wk@gnupg.org>
+
+       * openfile.c (open_sigfile): Fixed the handling of ".sign".
+       * mainproc.c (proc_tree): Use iobuf_get_real_fname.
+       Both are by Vincent Broman.
+
+2001-04-14  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (fixup_uidnode): Removed check for !sig which is
+       pointless here.  Thanks to Jan Niehusmann.
+
+2001-04-10  Werner Koch  <wk@gnupg.org>
+
+       * sig-check.c (check_key_signature2): Use log_info instead of
+       log_error so that messed up keys do not let gpg return an error.
+       Suggested by Christian Kurz.
+
+       * getkey.c (merge_selfsigs_main): Do a fixup_uidnode only if we
+       have both, uid and sig.  Thanks to M Taylor.
+
+2001-04-05  Werner Koch  <wk@gnupg.org>
+
+       * armor.c (unarmor_pump_new,unarmor_pump_release): New.
+       (unarmor_pump): New. 
+       * pipemode.c (pipemode_filter): Use the unarmor_pump to handle
+       armored or non-armored detached signatures.  We can't use the
+       regular armor_filter becuase this does only chack for armored
+       signatures the very first time.  In pipemode we may have a mix of
+       armored and binary detached signatures.
+       * mainproc.c (proc_tree): Do not print the "old style" notice when
+       this is a pipemode processes detached signature.
+       (proc_plaintext): Special handling of pipemode detached sigs.
+
+       * packet.h (CTRLPKT_PLAINTEXT_MARK): New.
+       * parse-packet.c (create_gpg_control): New.
+       * kbnode.c (dump_kbnode): Support it here.
+       * mainproc.c (check_sig_and_print): Fixed the check for bad
+       sequences of multiple signatures.
+       (proc_plaintext): Add the marker packet.
+       (proc_tree): We can now check multiple detached signatures.
+
+2001-04-02  Werner Koch  <wk@gnupg.org>
+
+       The length of encrypted packets for blocksizes != 8 was not
+       correct encoded.  I think this is a minor problem, because we
+       usually use partial length packets.  Kudos to Kahil D. Jallad for
+       pointing this out.
+       * packet.h: Add extralen to PKT_encrypted.
+       * cipher.c (write_header): Set extralen.
+       * build-packet.c (do_encrypted): Use extralen instead of const 10.
+       (do_encrypted_mdc): Ditto.
+       * parse-packet.c (parse_encrypted): Set extralen to 0 because we
+       don't know it here.
+
+2001-03-30  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (premerge_public_with_secret): Changed wording an add
+       the keyID to the info message.
+
+2001-03-29  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (premerge_public_with_secret): Use log_info instead of
+       log_error when no secret key was found for a public one.
+       Fix the usage if the secret parts of a key are not available.
+
+       * openfile.c (ask_outfile_name): Trim spaces.
+       (open_outfile): Allow to enter an alternate filename.  Thanks to
+       Stefan Bellon.
+       * plaintext.c (handle_plaintext): Ditto.
+
+2001-03-28  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (do_check_sig): Allow direct key and subkey
+       revocation signature.
+       * sig-check.c (check_key_signature2): Check direct key signatures.
+       Print the signature class along with an error.
+
+2001-03-27  Werner Koch  <wk@gnupg.org>
+
+       * packet.h: Add a missing typedef to an enum.  Thanks to Stefan Bellon.
+
+       * g10.c: New option --no-sig-create-check.
+       * sign.c (do_sign): Implement it here.
+       * g10.c: New option --no-sig-cache.
+       * sig-check.c (check_key_signature2): Implement it here.
+       (cache_selfsig_result): and here.
+
+       * keylist.c (list_keyblock): Removed debugging stuff.
+
+       * getkey.c (cache_public_key): Made global.
+       * keygen.c (write_selfsig, write_keybinding): Cache the new key.
+
+       * getkey.c (key_byname): Add new arg secmode and changed all
+       callers to request explicitly the mode.  Deriving this information
+       from the other supplied parameters does not work if neither pk nor
+       sk are supplied.
+
+2001-03-25  Werner Koch  <wk@gnupg.org>
+
+       * packet.h (ctrlpkttype_t): New.
+       * mainproc.c (add_gpg_control,proc_plaintext,proc_tree): Use the
+       new enum values.
+       * pipemode.c (make_control): Ditto.
+       * armor.c (armor_filter): Ditto.
+
+2001-03-24  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (do_sign): Verify the signature right after creation.
+
+2001-03-23  Werner Koch  <wk@gnupg.org>
+
+       * status.c, status.h (STATUS_UNEXPECTED): New.
+       * mainproc.c (do_proc_packets): And emit it here.
+
+2001-03-21  Werner Koch  <wk@gnupg.org>
+
+       * status.c: Add sys/types.h so that it runs on Ultrix.  Reported
+       by Georg Schwarz.x
+
+       * build-packet.c (build_sig_subpkt): Fixed generaton of packet
+       length header in case where 2 bytes headers are needed.  Thanks to
+       Piotr Krukowiecki.
+
+2001-03-19  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): the default keyring is no always used unless
+       --no-default-keyring is given.  
+
+       * ringedit.c (add_keyblock_resource): invalidate cache after file
+       creation.
+
+2001-03-15  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (ask_algo): Changed the warning of the ElGamal S+E Algo.
+
+       * keylist.c (print_capabilities): New.
+       (list_keyblock_colon): and use it here.
+
+2001-03-13  Werner Koch  <wk@gnupg.org>
+
+       * main.c, options.h: New option --fixed_list_mode.
+       * keylist.c (list_keyblock_colon): use it here.
+
+       * getkey.c (merge_keys_and_selfsig): Divert merging of public keys
+       to the function used in key selection..
+       * keylist.c (is_uid_valid): Removed.
+       (list_keyblock): Splitted into ..
+       (list_keyblock_print, list_keyblock_colon): .. these.
+       functions.  Changed them to use the flags set in the key lookup code.
+       (reorder_keyblock): New, so that primary user IDs are listed first.
+
+       * ringedit.c (keyring_copy): flush the new iobuf chaces before
+       rename or remove operations.  This is mainly needed for W32.
+
+       * hkp.c [HAVE_DOSISH_SYSTEM]: Removed the disabled code because we
+       have now W32 socket support in ../util/http.c
+
+       * skclist.c (key_present_in_sk_list): New.
+       (is_duplicated_entry): New.
+       (build_sk_list): Check for duplicates and do that before unlocking.
+
+2001-03-12  Werner Koch  <wk@gnupg.org>
+
+       * armor.c (parse_header_line): Removed double empty line check.
+       (parse_header_line): Replaced trim_trailing_ws with a counting
+       function so that we can adjust for the next read.
+
+       * options.skel: Fixed 3 typos. By Thomas Klausner. Replaced the
+       keyserver example by a better working server. 
+
+       * parse-packet.c (parse_symkeyenc): Return Invalid_Packet on error.
+       (parse_pubkeyenc): Ditto.
+       (parse_onepass_sig): Ditto.
+       (parse_plaintext): Ditto.
+       (parse_encrypted): Ditto.
+       (parse_signature): Return error at other places too.
+       (parse_key): Ditto.
+       * g10.c (main): Set opt.list_packets to another value when invoked
+       with the --list-packets command.
+       * mainproc.c (do_proc_packets): Don's stop processing when running
+       under --list-packets command.
+
+       * signal.c (do_sigaction): Removed.
+       (init_one_signal): New to replace the above.  Needed to support
+       systems without sigactions. Suggested by Dave Dykstra.
+       (got_fatal_signal,init_signals): Use the above here. 
+       (do_block): Use sigset() if sigprocmask() is not available.
+
+       * armor.c (parse_hash_header): Test on TIGER192, which is the
+       correct value as per rfc2440.  By Edwin Woudt.
+
+2001-03-08  Werner Koch  <wk@gnupg.org>
+
+       * misc.c: Include time.h. By James Troup.
+
+       * getkey.c: Re-enabled the unknown user Id and PK caches and
+       increased their sizes.
+
+       * getkey.c (merge_selfsigs_main): Set expire date and continue
+       processing even if we found a revoked key.
+       (merge_selfsigs_subkeys): Ditto.
+       
+       * packet.h: Add an is_revoked flag to the user_id packet.
+       * getkey.c (fixup_uidnode): Set that flag here.
+       (merge_selfsigs_main): Fix so that the latest signature is used to
+       find the self-signature for an UID.
+       * parse-packet.c (parse_user_id): Zero out all fields.
+       * mainproc.c (check_sig_and_print): Print the primary user ID
+       according the the node flag and then all other non-revoked user IDs.
+       (is_uid_revoked): Removed; it is now handled by the key selection code.
+       
+       Changed the year list of all copyright notices.
+       
+2001-03-07  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (finish_lookup): Print an info message only in verbose mode.
+
+2001-03-05  Werner Koch  <wk@gnupg.org>
+
+       * packet.h: Replaced sigsubpkt_t value 101 by PRIV_VERIFY_CACHE.
+       We have never used the old value, so we can do this without any harm.
+       * parse-packet.c (dump_sig_subpkt): Ditto.
+       (parse_one_sig_subpkt): Parse that new sub packet.
+       * build-packet.c (build_sig_subpkt): Removed the old one from the
+       hashed area.
+       (delete_sig_subpkt): New.
+       (build_sig_subpkt): Allow an update of that new subpkt.
+       * sig-check.c (check_key_signature2): Add verification caching
+       (cache_selfsig_result): New.
+       * export.c (do_export_stream): Delete that sig subpkt before exporting.
+       * import.c (remove_bad_stuff): New.
+       (import): Apply that function to all imported data 
+
+2001-03-03  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c: Introduced a new lookup context flag "exact" and used 
+       it in all place where we once used primary.
+       (classify_user_id2): Replaced the old function and add an extra
+       argument to return whether an exact keyID has been requested.
+       (key_byname): Removed the unused ctx.primary flag
+       (get_seckey_byname2): Ditto.
+       (finish_lookup): Changed debugging output.
+
+2001-03-02  Werner Koch  <wk@gnupg.org>
+
+       * keylist.c (list_one): Remove the merge key calls. 
+
+2001-03-01  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (finish_lookup): Don't use it if we no specific usage
+       has been requested.
+       (merge_selfsigs_main): fix UID only if we have an signature.
+       (lookup): Return UNU_PUBKEY etc. instead of NO_PUBKEY if we found
+       a key but the requested usage does not allow this key.
+       * import.c (import_one): Take UNU_PUBKEY into account.
+       * mainproc.c (list_node): Ditto.
+       * keylist.c (list_keyblock): Ditto.
+       * keyedit.c (print_and_check_one_sig): Ditto. 
+
+2001-02-09  Werner Koch  <wk@gnupg.org>
+
+       * delkey.c (delete_key): Removed that silly assert which rendered
+       the whole new stuff meaningless.
+
+2001-02-08  Werner Koch  <wk@gnupg.org>
+
+       * getkey.c (key_byname): It can happen that we have both, sk and pk
+       NULL, fix for that.
+
+       * parse-packet.c (parse_one_sig_subpkt): Add support for
+       primary_uid and key_flags.
+       (can_handle_critical): Ditto
+
+       * parse-packet.c (parse_encrypted): Fixed listing of pktlen for
+       MDC packets.
+
+       * getkey.c: Backported the version of this file from gpg 1.1. this
+       involved some changes in other files too.
+       * parse-packet.c (parse_key): Clear req_usage.
+       * skclist.c (build_sk_list): Use req_usage to pass the usage
+       information to the lookup function.
+       * pkclist.c (build_pk_list): Ditto.
+       * free-packet.c (copy_public_parts_to_secret_key): New.
+       * keydb.h: Add IS_* macros to check the sig_class.
+       * misc.c (openpgp_cipher_test_algo): New.
+       (openpgp_pk_test_algo): New.
+       (openpgp_pk_algo_usage): New.
+       (openpgp_md_test_algo): New.
+       * packet.h: Add a few fields to PKT_{public,secret}_key and
+       PKT_user_id.
+       * seckey-cert.c (do_check): Use the new main_keyid field.
+
+2001-02-04  Werner Koch  <wk@gnupg.org>
+
+       * encr-data.c (decrypt_data): Catch error when we had problems to
+       parse the encrypted packet. By Timo.
+
+2001-01-29  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): --batch does now set nogreeting.
+
+       * delkey.c (do_delete_key): Fixed delete-both functionality.
+
+2001-01-22  Werner Koch  <wk@gnupg.org>
+
+       * g10.c: New command --delete-secret-and-public-key.
+       * delkey.c (delete_key): Add new arg allow_both.
+       (do_delete_key): Move most stuff from above to this new function.
+
+2001-01-12  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c (passphrase_to_dek): Use MD5 when IDEA is installed
+       and we have no S2K.
+       * mainproc.c (proc_encrypted): Likewise
+
+2001-01-11  Werner Koch  <wk@gnupg.org>
+
+       * sig-check.c (do_check): Print the signature key expire message
+       only in verbose mode and added the keyID.
+
+2001-01-09  Werner Koch  <wk@gnupg.org>
+
+       * status.c, status.h: New status USERID_HINT. 
+       (write_status_text): Replace LF and CR int text by C-escape sequence.
+
+       * passphrase.c (passphrase_to_dek): Fixed the NEED_PASSPHRASE
+       output.  It does now always print 2 keyIDs.  Emit the new
+       USERID_HINT.
+
+2001-01-08  Werner Koch  <wk@gnupg.org>
+
+       * g10.c, options.h: New option --no-expensive-trust-checks.
+       * keylist.c (list_keyblock): Act on this option.
+
+2001-01-04  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Set homedir only in the pre-parsing phase and
+       replace backslashes in the W32 version.
+
+2001-01-03  Werner Koch  <wk@gnupg.org>
+
+       * status.c, status.h : New status KEY_CREATED
+       * keygen.c (do_generate_keypair,generate_subkeypair): Emit it.
+
+2000-12-28  Werner Koch  <wk@gnupg.org>
+
+       * signal.c (got_fatal_signal): Remove lockfiles here because the
+       atexit stuff does not work due to the use of raise. Suggested by
+       Peter Fales.
+       * gpgv.c (remove_lockfiles): New stub.
+       
+2000-12-19  Werner Koch  <wk@gnupg.org>
+
+       * status.c, status.h (cpr_get_no_help): New.
+       * keyedit.c (keyedit_menu): Use it here because we have our own
+       help list here.
+
+2000-12-18  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (print_failed_pkenc): Don't print the sometimes
+       confusing message about unavailabe secret key.  Renamed ...
+       (print_pkenc_list): ... to this and introduced failed arg.
+       (proc_encrypted): Print the failed encryption keys and then
+       the one to be used.
+       (proc_pubkey_enc): Store also the key we are going to use.
+
+       * mainproc.c (check_sig_and_print): Don't list revoked user IDs.
+       (is_uid_revoked): New.
+
+2000-12-08  Werner Koch  <wk@gnupg.org>
+
+       * pipemode.c: Made the command work.  Currently only for
+       non-armored detached signatures.
+       * mainproc.c (release_list): Reset the new pipemode vars.
+       (add_gpg_control): Handle the control packets for pipemode
+       * status.c, status.h: New stati {BEGIN,END}_STREAM.
+
+2000-12-07  Werner Koch  <wk@gnupg.org>
+
+       * g10.c: New option --allow-secret-key-import.
+       * import.c (import_keys,import_keys_stream): Honor this option.
+       (import): New arg allow_secret and pass that arg down to ...
+       (import_secret_one): to this and print a warning if secret key
+       importing is not allowed.
+
+2000-12-05  Werner Koch  <wk@gnupg.org>
+
+       * cipher.c (cipher_filter): Moved the end_encryption status ...
+       * encode.c (encode_simple,encode_crypt): to here
+       * sign.c (sign_file): and here.
+
+       * status.c (mywrite): Removed.
+       (get_status_string): Removed the LFs from the strings.
+       (set_status_fd,is_status_enabed,write_status_text,
+       write_status_buffer): Replaced all mywrite by stdio calls and use
+       fdopen to create a strem.  This is needed to make things smoother
+       in the W32 version.
+
+2000-12-04  Werner Koch  <wk@gnupg.org>
+
+       * import.c (merge_blocks): Increment n_sigs for revocations.
+
+2000-11-30  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): Use iobuf_translate_file_handle for all options
+       with filehandles as arguments.  This is function does some magic
+       for the W32 API.
+
+       * verify.c (verify_signatures): Add a comment rant about the
+       detached signature problem.
+       * mainproc.c (proc_tree): Issue an error if a detached signature
+       is assumed but a standard one was found.
+       * plaintext.c (hash_datafiles): Don't fall back to read signature
+       from stdin.
+       * openfile.c (open_sigfile): Print verbose message only if the
+       file could be accessed.
+
+2000-11-24  Werner Koch  <wk@gnupg.org>
+
+       * passphrase.c [HAVE_DOSISH_SYSTEM]: Disabled all the agent stuff.
+
+2000-11-16  Werner Koch  <wk@gnupg.org>
+
+        * g10.c: New option --use-agent
+        * passphrase.c (agent_open,agent_close): New.
+        (agent_get_passphrase,agent_clear_passphrase): New.
+       (passphrase_clear_cache): New.
+        (passphrase_to_dek): Use the agent here.
+       * seckey-cert.c (do_check): Clear cached passphrases.
+
+2000-11-15  Werner Koch  <wk@gnupg.org>
+
+       * status.c (write_status_text): Moved the big switch to ...
+       (get_status_string): ... new function.
+       (write_status_buffer): New.
+
+       * status.c (mywrite): New and replaced all write() by this.
+
+       * status.c, status.h: Add 3 status lcodes for notaions and policy.
+       * mainproc.c (print_notation_data): Do status output of notations.
+       
+2000-11-13  Werner Koch  <wk@gnupg.org>
+
+       * sign.c (clearsign_file): Use LF macro to print linefeed.
+       
+2000-11-11  Paul Eggert  <eggert@twinsun.com>
+
+       Clean up the places in the code that incorrectly use "long" or
+        "unsigned long" for file offsets.  The correct type to use is
+        "off_t".  The difference is important on large-file hosts,
+        where "off_t" is longer than "long".
+
+        * keydb.h (struct keyblock_pos_struct.offset):
+        Use off_t, not ulong, for file offsets.
+        * packet.h (dbg_search_packet, dbg_copy_some_packets,
+        search_packet, copy_some_packets): Likewise.
+        * parse-packet.c (parse, dbg_search_packet, search_packet,
+        dbg_copy_some_packets, copy_some_packets): Likewise.
+        * ringedit.c (keyring_search): Likewise.
+
+        * parse-packet.c (parse): Do not use %lu to report file
+        offsets in error diagnostics; it's not portable.
+        * ringedit.c (keyring_search): Likewise.
+
+2000-11-09  Werner Koch  <wk@gnupg.org>
+
+       * g10.c (main): New option --enable-special-filenames.
+
+2000-11-07  Werner Koch  <wk@gnupg.org>
+       * g10.c (main): New command --pipemode.
+       * pipemode.c: New.
+
+2000-10-23  Werner Koch  <wk@gnupg.org>
+
+       * armor.c (armor_filter): Changed output of hdrlines, so that a CR
+       is emitted for DOS systems.
+
+       * keygen.c (read_parameter_file): Add a cast for isspace().
+
+       * status.c (myread): Use SIGINT instead of SIGHUP for DOS. 
+
+2000-10-19  Werner Koch  <wk@gnupg.org>
+
+       * g10.c: New option --ignore-crc-error
+       * armor.c (invalid_crc): New.
+       (radix64_read): Act on new option.
+
+       * openfile.c (try_make_homedir): Klaus Singvogel fixed a stupid
+       error introduced on Sep 6th. 
+
+2000-10-18  Werner Koch  <wk@gnupg.org>
+
+       * misc.c (print_cipher_algo_note): Don't print the note for AES.
+       Changed wording.
+
+2000-10-16  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (do_proc_packets): Hack to fix the problem that
+       signatures are not detected when there is a MDC packet but no
+       compression packet.
+       
+       * g10.c (print_hashline): New.
+       (print_mds): Use above func with --with-colons.
+
+       * mainproc.c (check_sig_and_print): Detect multiple signatures
+       and don't verify them.
+
+2000-10-14  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (add_onepass_sig): There is an easier solution to the
+       error fixed yesterday; just check that we only have onepass
+       packets.  However, the other solution provides an cleaner
+       interface and opens the path to get access to other information
+       from the armore headers.
+       (release_list): Reset some more variables.
+
+2000-10-13  Werner Koch  <wk@gnupg.org>
+
+       * mainproc.c (add_gpg_control): New.
+       (do_proc_packets): use it.
+       (proc_plaintext): Changed logic to detect clearsigns.
+       (proc_tree): Check the cleartext sig with some new code.
+
+       * packet.h: New packet PKT_GPG_CONTROL.
+       * parse-packet.c (parse_gpg_control): New.
+       * misc.c (get_session_marker): New.
+       * armor.c (armor_filter): Replaced the faked 1-pass packet by the
+       new control packet.
+
+       * keyedit.c (keyedit_menu): Allow batchmode with a command_fd. 
+       * status.c (my_read): New.
+       (do_get_from_fd): use it.
+
+2000-10-12  Werner Koch  <wk@gnupg.org>
+
+       * keygen.c (keygen_add_std_prefs): Add Rijndael to the prefs.
+
+2000-10-07  Werner Koch  <wk@gnupg.org>
+
+       * gpgv.c: Add more stubs for ununsed code to make the binary smaller.
+
+Wed Oct  4 15:50:18 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * sign.c (hash_for): New arg to take packet version in account, changed
+        call callers.
+
+        * gpgv.c: New.
+        * Makefile.am: Rearranged source files so that gpgv can be build with
+        at least files as possible.
+
+Mon Sep 18 12:13:52 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * hkp.c (not_implemented): Print a notice for W32
+
+Fri Sep 15 18:40:36 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * keygen.c (keygen_add_std_prefs): Changed order of preferences to
+        twofish, cast5, blowfish.
+
+        * pkclist.c (algo_available): Removed hack to disable Twofish.
+
+Thu Sep 14 17:45:11 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * parse-packet.c (dump_sig_subpkt): Dump key flags. Print special
+        warning in case of faked ARRs.
+
+        * getkey.c (finsih_lookup): Hack so that for v4 RSA keys the subkey
+        is used for encryption.
+
+Thu Sep 14 14:20:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * g10.c (main): Default S2K algorithms are now SHA1 and CAST5 - this
+        should solve a lot of compatibility problems with other OpenPGP
+        apps because those algorithms are SHOULD and not optional.  The old
+        way to force it was by using the --openpgp option whith the drawback 
+        that this would disable a couple of workarounds for PGP.
+
+        * g10.c (main): Don't set --quite along with --no-tty.  By Frank Tobin.
+
+        * misc.c (disable_core_dump): Don't display a warning here but a return
+        a status value and ...
+        * g10.c (main): ...print warnining here. Suggested by Sam Roberts.
+
+Wed Sep 13 18:12:34 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * keyedit.c (keyedit_menu): Allow to use "debug" on the secret key.
+
+        * ringedit.c (cmp_seckey): Fix for v4 RSA keys.
+        * seckey-cert.c (do_check): Workaround for PGP 7 bug.
+
+Wed Sep  6 17:55:47 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * misc.c (print_pubkey_algo_note): Do not print the RSA notice.
+        * sig-check.c (do_signature_check): Do not emit the RSA status message.
+        * pubkey-enc.c (get_session_key): Ditto.
+
+        * encode.c (encode_simple, encode_crypt): Fix for large files.
+        * sign.c (sign_file): Ditto.
+
+Wed Sep  6 14:59:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * passphrase.c (hash_passphrase): Removed funny assert.  Reported by
+        David Mathog.
+
+        * openfile.c (try_make_homedir): Changes for non-Posix systems.
+        * g10.c (main): Take the default homedir from macro.
+
+        * g10.c: The --trusted-key option is back.
+        * trustdb.c (verify_own_key): Handle this option.
+        (add_ultimate_key): Moved stuff from verify_own_key to this new func.
+        (register_trusted_key): New.
+
+Fri Aug 25 16:05:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * parse-packet.c (dump_sig_subpkt): Print info about the ARR.
+
+        * openfile.c (overwrite_filep): Always return okay if the file is
+        called /dev/null. 
+        (make_outfile_name): Add ".sign" to the list of know extensions.
+        (open_sigfile): Ditto.
+
+Wed Aug 23 19:52:51 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * g10.c: New option --allow-freeform-uid. By Jeroen C. van Gelderen.
+        * keygen.c (ask_user_id): Implemented here.
+
+Fri Aug  4 14:23:05 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * status.c (do_get_from_fd): Ooops, we used fd instead of opt.command_fd.
+  Thanks to Michael Tokarev.
+
+Tue Aug  1 20:06:23 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * g10.c: New opttion --try-all-secrets on suggestion from Matthias Urlichs.
+  * pubkey-enc.c (get_session_key): Quite easy to implement here.
+
+Thu Jul 27 17:33:04 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * g10.c: New option --merge-only.  Suggested by Brendan O'Dea.
+  * import.c (import_one): Implemented it here
+  (import_secret_one): Ditto.
+  (print_stats): and give some stats.
+
+Thu Jul 27 12:01:00 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * g10.c: New options --show-session-key and --override-session-key
+  * pubkey-enc.c (hextobyte): New.
+  (get_override_session_key): New.
+  * mainproc.c (proc_pubkey_enc): Add session-key stuff.
+  * status.h, status.c (STATUS_SESSION_KEY): New.
+
+Thu Jul 27 10:02:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * g10.c (main): Use setmode(O_BINARY) for MSDOS while generating random bytes
+  (print_mds): Likewise for stdin.
+  * plaintext.c (handle_plaintext): Likewise for stdout.
+
+Mon Jul 24 10:30:17 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * keyedit.c (menu_expire): expire date for primary key can be set again.
+
+Wed Jul 19 11:26:43 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * keylist.c (is_uid_valid): New.
+  (list_keyblock): Print validity information for all user IDs.  Note, this
+  has to be done at other places too; for now we have only minimal support.
+
+Wed Jul 12 13:32:06 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * helptext.c, pkclist.c: s/superseeded/superseded/
+
+Mon Jul 10 16:08:57 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * parse-packet.c (enum_sig_subpkt): Fixed testing on crtitical bit in case
+  of a NULL buffer.  Reported by Peter Marschall.
+
+Wed Jul  5 13:28:45 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * keyedit.c, keyid.c: Add some _()
+
+  * argparse.c:  Changed the flag to suppress --version handling to also
+  suppress --help.
+
+Wed Jun 28 11:54:44 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * armor.c (armor_filter): Set sigclass to 0 in case of non-dash-escaped
+  clearsig.  This makes this mode work again.
+
+  * mainproc.c (proc_tree): Fixed handling of one-pass-sig packets in textmode.
+  Disabled the ugly workaround for PGP 5 - let's see whether thi breaks less
+  cases. Found by Ted Cabeen.
+
+  * options.h (DBG_HASHING): New.  All commented md_start_debug are now
+  controlled by this debug option.
+
+  * sign.c (print_status_sig_created): New and called from 2 places.
+
+  * keygen.c (gen_rsa): New, but commented.
+  (ask_algo): Commented support for RSA.
+
+  * seckey-cert.c (protect_secret_key): Started to fix the code for v4 RSA
+  keys - it is not solved yet. However, we have time until, Sep 20th ;)
+
+Wed Jun 14 12:27:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * status.c (init_shm_coprocessing): Changed the sequence of the get,attach
+  to cope with the changes in newer Linux kernels.  This bug has been found
+  by <dmitri@advantrix.com> who also proposed this solution.  Hopefully
+  this does not break gpg on to many systems.
+
+  * cipher.c (write_header): Protect the IV with the MDC too.
+  * encr-data.c (decrypt_data): Likewise.
+
+Fri Jun  9 10:09:52 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * g10.c: New options --no-auto-key-retrieve
+  * options.h (auto_key_retrieve): New.
+  * mainproc.c (check_sig_and_print): Implemented that.
+
+Wed Jun  7 19:19:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * sig-check.c (do_check): Use EMULATE_MDENCODE also on v4 packets.
+
+Wed Jun  7 17:25:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * cipher.c (write_header): Use plain CFB mode for MDC encrypted packets.
+  * encr-data.c (decrypt_data): Ditto.
+
+Mon Jun  5 23:41:54 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * seskey.c (do_encode_md, encode_md_value): Add new arg v3compathack to work
+  around a bug in old versions.
+  * sig-check.c (do_check): use the aboved workaround when enabled.
+  * g10.c: New option --emulate-md-decode-bug
+
+Mon Jun  5 12:37:43 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * build-packet.c (do_mdc): New.
+  (do_encrypted_mdc): Changed for the new proposal.
+  * parse-packet.c (parse_mdc): New.
+  (parse_encrypted): Fixed for the new proposal.
+  * packet.h (PKT_MDC): New.
+  * cipher.c (cipher_filter): Build the MDC packet here.
+  * g10.c (main): Enable --force-mdc.
+  * encr-data.c (mdc_decode_filter): Fixed for new MDC method
+
+  * options.h(rfc2440): New.
+  * g10.c (main): Changed the selected values for --openpgp to not include
+  optional algorithms.
+
+Thu May 18 11:38:54 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * keyedit.c (keyedit_menu): Add a keyword arg to the prompt.
+
+       * status.c, status.h: Added 3 new status tokens.
+       * status.c (do_get_from_fd): New.
+       (cpr_enabled,cpr_get,cpr_get_hidden,cpr_kill_prompt,
+        cpr_get_answer_is_yes,cpr_get_answer_yes_no_quit): Modified to work
+        with the new function.
+       * g10.c: Add new option --command-fd.
+
+       * status.c (progress_cb): New.
+       (set_status_fd): Register progress functions
+
+Fri May 12 14:01:20 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * delkey.c (delete_key): Add 2 new status messages
+       * status.c, status.h (STATUS_DELETE_PROBLEM): New.
+
+       Fixed years of copyright in all source files.
+
+Mon May  1 17:08:14 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * trustdb.c (propagate_validity): Fixed the bug that only one uid
+       gets fully trusted even when all are signed by an ultimate key.
+
+Mon May  1 15:38:04 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * getkey.c (key_byname): Always returned a defined context.  Fixed
+       a segv for invalid user id specifications. Reported by Walter Koch.
+
+       * getkey.c (get_user_id): I18ned "no user id" string. By Walter.
+
+       * pkclist.c (do_show_revocation_reason): Typo fixes.
+       * helptext.c: Ditto.
+
+       * armor.c (armor_filter): Fixed some CRLF issues.  By Mike McEwan.
+
+Fri Apr 14 19:37:08 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * pkclist.c (do_show_revocation_reason): New.
+       (show_revocation_reason): New and called at various places.
+
+       * g10.c (main): Fixed small typo.
+
+       * pkclist.c (do_we_trust): Act on always_trust but not for revoked
+       keys. Suggested by Chip Salzenberg.
+
+       * g10.c: New option --lock-never.
+
+       * ringedit.c (get_writable_keyblock_file): New.
+       * keygen.c (do_generate_keypair): Use this instead of the hardwired one.
+
+       * keygen.c (ask_user_id): Check that the email address is in the
+       correct field.  Suggested by Christian Kurz.
+
+Mon Apr 10 13:34:19 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * keyedit.c (show_key_with_all_names): s/sbb/ssb/
+
+Tue Mar 28 14:26:58 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * trustdb.c (verify_own_keys): Do not print warning about unprotected
+       key when in quiet mode.
+
+Wed Mar 22 13:50:24 CET 2000  Werner Koch  <wk@openit.de>
+
+       * mainproc.c (print_userid): Do UTF8 conversion before printing.
+       * import.c (import_one): Ditto.
+       (import_secret_one): Ditto.
+       (delete_inv_parts): Ditto.
+
+Thu Mar 16 16:20:23 CET 2000  Werner Koch  <wk@openit.de>
+
+       * keylist.c (print_key_data): Handle a NULL pk gracefully.
+
+       * getkey.c (merge_one_pk_and_selfsig): Fixed silly code for
+       getting the primary keys keyID but kept using the one from the
+       subkey.
+       * pubkey-enc.c (get_it): Print a note for expired subkeys.
+
+       * getkey.c (has_expired): New.
+       (subkeys_expiretime): New.
+       (finish_lookup): Check for expired subkeys needed for encryption.
+       (merge_keys_and_selfsig): Fixed expiration date merging for subkeys.
+
+       * keylist.c (list_keyblock): Print expiration time for "sub".
+       (list_one): Add missing merging for public keys.
+       * mainproc.c (list_node): Ditto.
+
+2000-03-14 13:49:38  Werner Koch  (wk@habibti.openit.de)
+
+       * keygen.c (keyedit_menu): Do not allow to use certain commands
+       while the secret key is selected.
+
+2000-03-09 12:53:09  Werner Koch  (wk@habibti.openit.de)
+
+       * keygen.c (ask_expire_interval): Movede parsig to ...
+       (parse_expire_string): ... this new function. And some new control
+       commands.
+       (proc_parameter_file): Add expire date parsing.
+       (do_generate_keypair): Allow the use of specified output files.
+
+2000-03-08 10:38:38  Werner Koch  (wk@habibti.openit.de)
+
+       * keygen.c (ask_algo): Removed is_v4 return value and the commented
+       code to create Elg keys in a v3 packet. Removed the rounding
+       of key sizes here.
+       (do_create): Likewise removed arg v4_packet.
+       (gen_elg): Likewise removed arg version. Now rounding keysizes here.
+       (gen_dsa): Rounding keysize now here.
+       (release_parameter_list): New
+       (get_parameter*): New.
+       (proc_parameter_file): New.
+       (read_parameter_file): New.
+       (generate_keypair): Splitted. Now uses read_parameter_file when in
+       batch mode.  Additional argument to specify a parameter file.
+       (do_generate_keypair): Main bulk of above fucntion and uses the
+       parameter list.
+       (do_create): Don't print long notice in batch mode.
+       * g10.c (main): Allow batched key generation.
+
+Thu Mar  2 15:37:46 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * pubkey-enc.c (get_it): Print a note about unknown cipher algos.
+
+       * g10.c (opts): Add a note to the help listing about the man page
+       and removed some options from the help listing.
+
+       * keyedit.c (print_and_check_one_sig): Use a new function to truncate
+       the output of the user ID.  Suggested by Jan-Benedict Glaw.
+
+Wed Feb 23 10:07:57 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * helptext.c: typo fix.
+
+Thu Feb 17 13:39:32 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * revoke.c: Removed a bunch of commented code.
+
+       * packet.h (SIGSUBPKT_REVOC_REASON): New.
+       * build-packet.c (build_sig_subpkt): Support new sub packet.
+       * parse-packet.c (parse_one_sig_subpkt): Ditto.
+       (dump_sig_subpkt): Ditto.
+       * revoke.c (ask_revocation_reason): New.
+       (release_revocation_reason_info): New.
+       (revocation_reason_build_cb): New.
+       (gen_revoke): Ask for reason.
+       * main.h (struct revocation_reason_info): Add declaration.
+       * keyedit.c (menu_revsig): Add support for revocation reason.
+       (menu_revkey): Ditto.
+       (sign_uid_mk_attrib): Renamed to ...
+       (sign_mk_attrib): ... this, made static and add support for reasons.
+
+Tue Feb 15 08:48:13 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * build-packet.c (build_packet): Fixed fixing of old comment packets.
+
+       * import.c (import_keys): Fixed importing from stdin when called with
+       nnames set to zero as it normally happens.
+
+Mon Feb 14 14:30:20 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * sig-check.c (check_key_signature2): Add new arg r_expired.
+       (do_signature_check): New arg to pass it down to ...
+       (do_check): New arg r-expire which is set when the signature
+       has expired.
+       * trustdb.c (check_sig_record): Set SIGF_EXPIRED flag and set
+       the expiretime to zero so that thi signature will not be checked
+       anymore.
+
+Fri Feb 11 17:44:40 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * g10.c (g10_exit): Update the random seed_file.
+       (main): Set the random seed file.  New option --no-random-seed-file.
+
+Thu Feb 10 17:39:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * keyedit.c (menu_expire): Fixed segv due to unitialized sub_pk.
+       By Rémi.
+
+Thu Feb 10 11:39:41 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * keylist.c (list_keyblock): Don't print warnings in the middle of
+       regulat output lines.  By Rémi.
+
+       * sig-check.c: Include options.h
+
+Wed Feb  9 15:33:44 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * gpg.c: New option --ignore-time-conflict
+       * sig-check.c (do_check): Implemented this option.
+       * trustdb.c (check_trust): Ditto.
+       * sign.c (do_sign): Ditto.
+       * keygen.c (generate_subkeypair): Ditto.
+
+       * encode.c (encode_simple): use iobuf_cancel after open failure.
+       Reported by Huy Le.
+
+Fri Jan 14 18:32:01 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * packet.h (STRING2KEY): Changed mode from byte to int.
+       * parse-packet.c (parse_key): Add the special GNU protection stuff
+       * build-packet.c (so_secret_key): Ditto.
+       * seckey-cert.c (do_check): Ditto.
+       * keyedit.c (change_passphrase): Ditto.
+       * export.c (export_secsubkeys): New.
+       (do_export_stream): Hack to export the primary key using mode 1001.
+       * g10.c: New command --export-secret-subkeys
+
+Thu Jan 13 19:31:58 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * armor.c (is_armored): Check for 1-pass-sig packets. Reported by
+       David Hallinan <hallinan@rtd.com>.
+       (armor_filter): Replaced one LF by the LF macro.  Reported by
+       Wolfgang Redtenbacher.
+
+Wed Jan  5 11:51:17 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * g10.c (main): Reset new global flag opt.pgp2_workarounds
+       when --openpgp is used.
+       * mainproc.c (proc_plaintext): Do the PGP2,5 workarounds only
+       when the global flag is set.
+       (proc_tree): Ditto.
+       * textfilter.c (copy_clearsig_text): Ditto.
+       * armor.c (armor_filter): Ditto.
+
+       * g10.c: New option --list-only
+       * mainproc.c (proc_tree): Don't do it if opt.list_only is active.
+       (proc_pubkey_enc): Implement option.
+
+       * status.h, status.c ({BEGIN,END}_{EN,DE}CRYPTION): New.
+       * cipher.c (cipher_filter): New status outputs.
+       * mainproc.c (proc_encrypted): New status outputs.
+
+Fri Dec 31 14:08:15 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * armor.c (armor_filter): Made the "Comment:" header translatable.
+
+       * hkp.c (hkp_import): Make sure that the program does not return
+       success when there is a connection problem.  Reported by Phillip Jones.
+
+Sun Dec 19 15:22:26 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * armor.c (LF): Use this new macro at all places where a line LF
+       is needed.  This way DOSish textfiles should be created when the
+       input data is also in dos mode.
+       * sign.c (LF): Ditto.
+       * textfilter.c (LF): Ditto.
+       (copy_clearsig_text): Disabled the forcing of CR,LF sequences
+       for DOS systems.
+
+       * plaintext.c (handle_plaintext): Fixes for line endings on DOS.
+       and react on a LF in cleartext.
+       * armor.c (fake_packet): Restore the original line ending after
+       removing trailing spaces.
+
+       * signal.c (got_fatal_signal): DOS fix.
+
+Thu Dec 16 10:07:58 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * mainproc.c (print_failed_pkenc): Fix for unknown algorithm.
+       Found by fygrave@epr0.org.
+
+Thu Dec  9 10:31:05 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * hkp.c: i18n the strings.
+
+Sat Dec  4 15:32:20 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * trustdb.c (verify_key): Shortcut for ultimately trusted keys.
+
+Sat Dec  4 12:30:28 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * pkclist.c (build_pk_list): Validate the trust using the namehash
+       if this one has been set by the key lookup.
+
+       * g10.c: Add --delete-secret-key to the help page.
+
+       * openfile.c (copy_options_file): Made static.
+       (try_make_homedir): New.
+       * ringedit.c (add_keyblock_resource): Use the try_make_hoemdir logic.
+       * tdbio.c (tdbio_set_dbname): Likewise.
+
+       * keygen.c (generate_user_id): Use m_alloc_clear() here. We should
+       better use an allocation function specific to the user_id packet.
+
+       * keygen.c (keygen_add_std_prefs): Changed symmetric preferences
+       to include Blowfish again.  This is due to it's better speed compared
+       to CAST5.
+
+       * g10.c (strusage): Print the home directory.
+
+       * armor.c (armor_filter): Take action on the cancel control msg.
+       * filter.h (armor_filter_context_t): Add cancel flag.
+
+Mon Nov 29 21:52:11 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * g10.c: New option --fast-list-mode ..
+       * keylist.c (list_keyblock): .. and implemented.
+       * mainproc.c (list_node): Ditto.
+
+       * import.c (mark_non_selfsigned_uids_valid): Fixed the case that there
+       is a uid without any packet following.
+
+Mon Nov 22 11:14:53 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * mainproc.c (proc_plaintext): Never enable the hash processing
+       when skip_verify is active.
+
+       * armor.c (parse_header_line): Stop parsing on a WS line too.
+       Suggested by Aric Cyr.
+
+       * tdbdump.c (HEXTOBIN): Changed the name of the argument, so that
+       traditional cpp don't mess up the macros. Suggested by Jos Backus.
+
+       * mainproc.c (list_node): Print the PK algo in the --with-colon mode.
+       * keylist.c (list_keyblock): Ditto.
+
+       * signal.c (got_fatal_signal): Found the reason why exit(8) did not
+       work - it is better to set the disposition back to default before
+       raising the signal.  Print the notice on stderr always.
+
+Fri Nov 12 20:33:19 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * g10.c (make_username): Swapped the logic.
+       * keylist.c (public_key_list): Now takes a STRLIST as arg and moved
+       the creation ot this list to the caller, so that he can copy with
+       UTF-conversion of user IDs.  Changed all callers.
+       (secret_key_list): Likewise.
+
+       * getkey.c (get_user_id_string_native): New and ...
+       * encode.c (write_pubkey_enc_from_list): ... use it here.
+
+       * pubring.asc: Updated.
+
+       * packet.h (PKT_PHOTO_ID): New.
+       * parse-packet.c (parse_photo_id): New.
+       * build-packet.c (do_user_id: Handle photo IDs.
+       (build_packet): Change CTB for photo IDs
+       * free-packet.c (free_user_id): Release memory used for photo IDs
+       * sig-check.c (hash_uid_node): Handle photo IDs too.
+       * trustdb.c (print_uid_from_keyblock): Hash photo ID.
+       (make_uid_records): Ditto.
+       * getkey.c (find_by_name): Ditto.
+       * keyedit.c (show_prefs): Ditto.
+       * keylist.c (list_keyblock): Ditto.
+
+Thu Oct 28 16:08:20 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * keygen.c (ask_expire_interval): Print a warning for systems
+       with a signed 32 time_t if the exiration time is beyoind 2038.
+
+Fri Oct  8 20:40:50 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * ringedit.c (enum_keyblocks): The last fix way really stupid;
+       reverted and set rt to Unknown.
+
+Fri Oct  8 20:32:01 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * ringedit.c (enum_keyblocks): Zero the entire kbpos out on open.
+
+       * g10.c (oEntropyDLL): Removed option.
+       (main): Made the warning on development versions more verbose.
+
+       * g10.c (oHonorHttpProxy): New option.
+       * hkp.c (hkp_ask_import,hkp_export): Implement this option.
+       * options.skel: Enable this option for new installations
+
+Mon Oct  4 21:23:04 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * import.c (import_keys): Changed calling interface, adjusted caller.
+       (import): Moved printing of stats out ...
+       (print_stats): New. ... to here.
+       (import_keys_stream): Call stats print here.
+       (import_keys): Print stats as totals for all files.
+
+       * tdbio.h (DIRF_NEWKEYS): New
+       * tdbio.c (tdbio_dump_record): Print the new flag.
+       * trustdb.c (check_trust_record): New arg sigs_only.  Adapted all
+       callers.
+       (do_update_trust_record): Removed recheck arg and add a new sigs_only
+       do we can later improve on the performance.  Changed all callers too.
+       (check_trustdb): Evalutate the new flag and add a status output.
+       Do a check when the dir record has not been checked.
+       (build_cert_tree): Evaluate the new flag.
+       (check_trust): Ditto.  Do a trust_record check, when the dir record
+       is not marked as checked.
+       (mark_fresh_keys): New.
+       (clear_lid_table): New.
+       (sync_trustdb): New.
+       * import.c (import_keys): Call sync_trustdb() after processing.
+       (import_keys_stream): Ditto.
+       * tdbdump.c (import_ownertrust): Ditto.
+
+       * import.c (import_revoke_cert): Notify the trust DB.
+       (do_update_trust_record): Use |= to set the REVOKED bit and not &=;
+       shame on me for this bad copy+paste introduced bug.
+       (do_we_trust): Add trustmask to allow revoked key override to work.
+       Chnaged are to allow return of a mofified trustlevel. Adapted the
+       one caller.
+
+       * g10.c: New options --emulate-3des-s2k-bug
+       * passphrase.c (hash_passphrase): Implemented above.
+
+       * mainproc.c (proc_tree): Check for standalone signatures.
+       (do_check_sig): Print a notice for a standalone revocation
+       (check_sig_and_print): Do not print an error for unchecked standalone
+       revocations.
+
+Tue Sep 28 20:54:37 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * encode.c (encode_simple): Use new CTB when we don't have the
+       length of the file.  This is somewhat strange as the comment above
+       indicates that this part is actually fixed for PGP 5 - maybe I simply
+       lost the source line, tsss.
+
+       * armor.c (armor_filter): Set a flag if no OpenPGP data has been found.
+       * verify.c (verify_signatures): Add an error helptext.
+
+Thu Sep 23 19:24:30 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * openfile.c (open_outfile): Fixed the 8dot3 handling.
+
+       * passphrase.c (passphrase_to_dek): Print uid using utf8 func.
+       * delkey.c (delete_key): Ditto.
+       * pkclist.c (show_paths,do_edit_ownertrust,do_we_trust): Ditto
+       (do_we_trust_pre): Ditto.
+       * trustdb.c (print_user_id,check_uidsigs): Ditto.
+       * revoke.c (gen_revoke,ask_revoke_sig): Ditto.
+
+Thu Sep 23 09:52:58 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * verify.c (print_file_status): New.
+       (verify_one_file): Moved status print to th new fnc. Add error status.
+       * status.c, status.h (STATUS_FILE_ERROR): New
+
+Wed Sep 22 10:14:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * openfile.c (make_outfile_name): Use case-insenstive compare for
+       DOS systems.  Add ".pgp" to the list of know extensions.
+       (open_outfile): For DOS systems try to replace the suffiy instead of
+       appending it.
+
+       * status.c, status.h: Add STATUS_FILE_{START,DONE}.
+       * verify.c (verify_one_file): Emit these new stati.
+
+       * sign.c (clearsign_file): Avoid duplicated Entries in the "Hash:"
+       line.  Those headers are now only _not_ printed when there are
+       only old-style keys _and_ all hashs are MD5.
+
+Mon Sep 20 12:24:41 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * verify.c (verify_files, ferify_one_file): New.
+       * g10.c:  New command --verify-files
+
+Fri Sep 17 12:56:42 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c: Add UK spelling as alias for armor options ;-)
+
+       * import.c (append_uid): Fixed a SEGV when there is no selfsig and
+       no subkey.
+       (merge_sigs): Ditto.  Removed the assertion.
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c: New option --entropy-dll-name
+
+Mon Sep 13 10:51:29 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * signal.c (got_fatal_signal): Print message using write(2) and
+       only for development versions.
+
+Mon Sep  6 19:59:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * tdbio.c (tdbio_set_dbname): Use mkdir macro
+       * ringedit.c (add_keyblock_resource): Ditto.
+
+Fri Sep  3 10:04:45 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (build_pk_list): Skip keys set with --encrypt-to also
+       when asking for a key.
+
+       * plaintext.c (handle_plaintext): Make sure that we don't read a
+       second EOF in the read loop for partial length packets.
+
+       * mainproc.c (check_sig_and_print): print user ID as utf-8.
+
+Thu Sep  2 16:40:55 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * import.c (merge_blocks): First add new subkeys, then merge subkey
+       certificates.
+       (merge_sigs): Don't merge subkey signatures here.
+
+Wed Sep  1 15:30:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keygen.c (ask_expire_interval): Fixed bug related to cpr_xx (tnx
+       Francis J. Lacoste).
+
+Tue Aug 31 17:20:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * plaintext.c (do_hash): Hash CR,LF for a single CR.
+       (ask_for_detached_datafile): Changed arguments to be closer to
+       those of hash_datafiles and cleanup the code a bit.
+       * mainproc.c (proc_tree): Workaround for pgp5 textmode detached
+       signatures.  Changed behavior of asking for data file to be the same
+       as with provided data files.
+
+       * keylist.c (list_keyblock): Use UTF8 print functions.
+
+Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * import.c (chk_self_sigs): some s/log_error/log_info/ so that gpg
+       does not return an error if a key has some invalid packets.
+
+       * helptext.c: Fixed some typos and changed the way the
+       translation works.  The english text is now the keyword for gettext
+       and not anymore the keyword supplied to the function.  Done after
+       some discussion with Walter who thinks this is much easier for the
+       translators.
+
+       * misc.c (disable_core_dumps): Don't do it for DOSish systems.
+
+       * signal.c (signal_name): Bounds check on signum.
+
+Wed Aug  4 10:34:18 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pubring.asc: Updated.
+
+       * pkclist.c (do_we_trust_pre,check_signatures_trust): Do not print
+       the warning about --always_trust when --quiet is used.
+
+       * pkclist.c (fpr_info): New and called at several places.
+
+       * parse-packet.c (dump_sig_subpkt): List revocation key contents.
+
+Mon Jul 26 09:34:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (build_pk_list): Fixed typo in format string.
+
+       * trustdb.c (create_shadow_dir): Don't translate the error string.
+
+       * g10.c (main): Fixed spelling of user-id.
+       * getkey.c (find_by_name_pk,find_by_name_sk,
+       find_by_keyid,find_by_keyid_sk): Ditto and translate it.
+       * import.c (mark_non_selfsigned_uids_valid,delete_inv_parts): Ditto.
+
+
+Mon Jul 26 01:01:39 CEST 1999  Michael Roth <mroth@nessie.de>
+
+       * g10.c, options.h: New options --no-literal and --set-filesize
+
+       * encode.c (encode_simple, encode_crypt): Support for the options
+       --no-literal and --set-filesize.
+
+       * sign.c (sign_file): ditto.
+
+Fri Jul 23 13:53:03 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * ringedit.c (enum_keyblocks): Removed annoying error message in cases
+       when we have no keyring at all to enum.
+
+       * getkey.c (classify_user_id): Rewrote to relax the recognition of
+       keyIDs and fingerprints (Michael).
+
+       * mainproc.c (check_sig_and_print): Print status NO_PUBKEY.
+       (print_failed_pkenc): Print status NO_SECKEY.
+
+       * import.c (mark_non_selfsigned_uids_valid): New.
+       * g10.c: New option --allow-non-selfsigned-uid.
+
+       * pkclist.c (print_fpr): New.
+       (do_we_trust_pre): Print the fpr before asking whether to use the key
+       anyway.
+       (do_edit_ownertrust): Likewise.
+
+Thu Jul 22 20:03:03 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * ringedit.c (enum_keyblocks): Removed annoying error message in cases
+       when we have no keyring at all to enum.
+
+       * getkey.c (classify_user_id): Rewrote to relax the recognition of
+       keyIDs and fingerprints (Michael).
+
+       * mainproc.c (check_sig_and_print): Print status NO_PUBKEY.
+       (print_failed_pkenc): Print status NO_SECKEY.
+
+       * import.c (mark_non_selfsigned_uids_valid): New.
+       * g10.c: New option --allow-non-selfsigned-uid.
+
+Thu Jul 15 10:15:35 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c: New options --disable-{cipher,pubkey}-algo.
+
+Wed Jul 14 19:42:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * status.h (STATUS_IMPORTED): New.
+       * import.c (import): Print some status information (Holger Schurig).
+
+       * g10.c (main): Make --no-greeting work again. Add a warning when
+       --force-mds is used.
+
+Tue Jul 13 17:39:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (do_edit_ownertrust): Changed the way help works.
+       (build_pk_list): Implemented default recipient stuff.
+       * g10.c: New options --default-recipient[-self]
+       (main): Suppress greeting in most cases, entering a passphrase or
+       a missing value is not considered to be interactive use.
+       Merged --print-md and --print-mds; the latter is now obsolete.
+       Changed the way --gen-random works and documented it.
+       Changed the way --gen-prime works and add a man entry.
+       * g10.c (MAINTAINER_OPTIONS): Removed.
+
+Mon Jul 12 18:45:57 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keyedit.c (keyedit_menu): Add arg sign_mode and changed callers
+       * g10.c (main): New command --lsign-key.
+
+Mon Jul 12 14:55:34 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mainproc.c (kidlist_item): New.
+       (release_list): Release failed pk-enc-list.
+       (print_failed_pkenc): New
+       (proc_encrypted): Print info about failed PK enc.
+
+       * openfile.c (make_outfile_name): s/error/info/
+
+       * passphrase.c (passphrase_to_dek): Return an empty passphrase when
+       in batch mode and don't make the warning message fatal
+       * seckey-cert.c (check_secret_key): Try only once when in batch mode.
+
+       * g10.c (make_username): New.
+
+Thu Jul  8 16:21:27 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * packet.h (PKT_ring_trust): New
+       * parse-packet.c (parse_trust): Store trust value
+       * build-packet (build_packet): Ignore ring trust packets.
+       * mainproc.c (add_ring_trust): New.
+       (list_node): Print "rtv" records.
+       * g10.c: New option --with-fingerprint.
+
+       * trustdb.c (verify_own_keys): Don't insert if we are dry running
+       (check_trust): Ditto.
+
+Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Support for libtool.
+
+       * keygen.c (ask_expire_interval): Hack to allow for an expire date.
+
+       * trustdb.c (do_update_trust_record,update_trust_record): Splitted.
+       (check_trust_record): New.
+       (check_trust,build_cert_tree): Check the dir record as needed.
+       (upd_pref_record): Removed.
+       (make_pref_record): New.
+       (propagate_validity): Stop as soon as we have enough validity.
+
+       * tbdio.c (MAX_CACHE_ENTRIES_HARD): Increased the limit.
+
+
+Fri Jul  2 11:45:54 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c (g10_exit): Dump random stats.
+
+       * sig-check.c (check_key_signature,check_key_signature2): Enhanced
+       version and wrapper for old function.
+       (do_signature_check,signature_check): Ditto.
+
+Thu Jul  1 12:47:31 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * keyedit.c (show_key_with_all_names): Print a notice for disabled keys.
+       (enable_disable_keys): Add functionality
+       * pkclist.c (edit_ownertrust): preserve disabled state.
+       (build_pk_list): Skip disabled keys.
+       * trustdb.c (upd_one_ownertrust): Ditto.
+       (build_cert_tree): Mask the ownertrust.
+       (trust_letter): Mask the value.
+       (do_check): Take disabled flag into account.
+
+       * passphrase.c (passphrase_to_dek): Add a pubkey_algo arg and changed
+       all callers.
+
+       * g10.c (utf8_strings): 2 new options.
+
+       * trustdb.c (insert_trust_record_by_pk): New, replaces the next one.
+       (insert_trust_record): Now takes a keyblock as arg.  Changed all
+       callers to use the appropritae function.
+
+       * openfile.c (ask_outfile_name): New.
+       * plaintext.c (handle_plaintext): Ask for filename if there is
+       no valid syntax. Don't use fname varbatim but filter it.
+
+Tue Jun 29 21:44:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * trustdb.h (TRUST_FLAG_DISABLED): New.
+
+       * status.c (USE_CAPABILITIES): Capabilities support (Remi).
+
+       * tdbio.c : Added new fields to the DIR record.
+       (tdbio_write_record): Fixed the update of the hash tables.
+       (tdbio_delete_record): Drop the record from the hash tables.
+       (drop_from_hashtbl): New.
+
+       * status.c (cpr_get): Special online help mode.
+       * helptext.c ("keyedit.cmd"): Removed.
+       * keyedit.c (keyedit_menu): Use only help system.
+       (enable_disable_key): New bit doies not yet work.
+
+Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * dearmor.c (enarmor_file): Fixed comment string.
+       * tdbdump.c (export_ownertrust): Text fix.
+       * tbio.c (tdbio_invalid): Ditto.
+
+       * parse-packet.c (parse_key): Made temp buffer larger.
+
+       * Makefile.am (install-data-local): Add missing backslashes
+
+Tue Jun 15 12:21:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c (main): Made iterated+salted the default S2K method.
+
+       * Makefile.am (install-data-local): Use DESTDIR.
+
+       * passphrase.c (passphrase_to_dek): Emit missing-passphrase while in
+       batchmode.
+
+       * parse-packet.c (parse_pubkeyenc): Fixed a SEGV.
+
+Mon Jun 14 21:18:54 CEST 1999 Michael Roth <mroth@nessie.de>
+
+       * g10.c: New options --openpgp, --no-tty, --emit-version,
+         --default-comment and --lock-multiple
+
+Thu Jun 10 14:18:23 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * free-packet.c (free_encrypted): Fixed EOF case (Remi).
+       (free_plaintext): Ditto.
+
+       * helptext.c (keyedit.delsig.unknown): New (Remi).
+       * keyedit.c (print_and_check_one_sig): Add arg print_without_key and
+       changed all callers to make use of it (Remi):
+
+Tue Jun  8 13:36:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keylist.c (print_key_data): New and called elsewhere.
+       * g10.c: New option --with-key-data
+
+Wed Jun  2 14:17:19 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mainproc.c (proc_tree): Yet another bad hack to cope with
+       broken pgp2 created detached messages in textmode.
+
+Tue Jun  1 16:01:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * openfile.c (make_outfile_name): New.
+       * plaintext.c (handle_plaintext): Outputfile is now the inputfile
+       without the suffix.
+       * g10.c: New option --use-embedded-filename
+
+Mon May 31 19:41:10 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c (main): Fix for SHM init (Michael).
+
+       * compress.c, encr-data.c, mdfilter.c,
+         plaintext.c, free-packet.c: Speed patches (Rémi).
+
+Thu May 27 09:40:55 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * status.c (cpr_get_answer_yes_no_quit): New.
+       * keyedit.c (menu_delsig): New.
+       (check_all_keysigs): Splitted.
+       (print_and_check_one_sig): New.
+
+Wed May 26 14:36:29 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * build-packet.c (build_sig_subpkt): Support large packets.
+       * parse-packet.c (enum_sig_subpkt): Replaces parse_sig_subpkt.
+       * mainproc.c (print_notation_data): Print all notation packets.
+       * g10.c (add_notation_data): Add a way to specify the critical flag.
+       (main): Add option --set-policy-url.
+       (check_policy_url): Basic checks.
+       * sign.c (mk_notation_and_policy): Replaces mk_notation.
+
+       * parse-packet.c (can_handle_critical): Moved decision whether we can
+       handle critical subpacket to an extra function.
+
+Tue May 25 19:50:32 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * sign.c (sign_file): Always use compression algo 1 for signed
+       onyl file becuase we can´ be sure the the verifier supports other
+       algorithms.
+
+       * build-packet.c (build_sig_subpkt): Support for notation data.
+       * sign.c (sign_file,clearsign_file,make_keysig_packet): Ditto.
+       (mk_notation): New.
+       * g10.c (add_notation_data): New and add option -N
+       * mainproc.c (print_notation_data): New.
+       (check_sig_and_print): Print any notation data of the signed text.
+
+Sun May 23 14:20:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (check_signatures_trust): Print a warning and return
+       immediateley if opt.always_trust is true.
+
+       * g10.c (main): Corrected handling of no-default-keyring
+
+       * pkclist.c (algo_available): Disable Twofish until we have settled
+       how to do the MDC.
+
+       * hkp.c: Disable everything for mingw32
+
+Sat May 22 22:47:26 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mainproc.c (check_sig_and_print): Add sig creation time to the
+       VALIDSIG status output. Add more info to the ERRSIG output.
+       * sig-check.c (signature_check): Add sig time after epoch to SIG_ID.
+
+       * import.c (import_one): Merge duplicate user IDs.
+       (collapse_uids): New.
+       * kbnode.c (move_kbnode): New.
+       (remove_kbnode): New.
+       * keyedit.c (keyedit_menu): Call collapse_uids.
+
+       * g10.c: new option --logger-fd.
+
+       * import.c: s/log_*_f/log_*/
+
+Thu May 20 14:04:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * misc.c (pull_in_libs): do the volatile only for gcc
+
+       * sig-check (signature_check): Emit SIG_iD only for classes 0 and 1.
+
+       * armor.c (armor_filter): Add detection of PGP2 created clearsigs.
+       (fake_packet): A tab is not a WS for pgp2 - handle this.
+       * textfilter.c (len_without_trailing_chars): New.
+       (copy_clearsig_text): Add pgp2mode arg.
+       * sign.c (clearsign_file): pass old_style to the above fnc.
+
+
+Wed May 19 16:04:30 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c: New option --interactive.
+
+       * mainproc.c (proc_plaintext): Add workaround for pgp2 bug
+       (do_check_sig): Ditto.
+       (proc_tree): Ditto.
+       * plaintext.c (do_hash): Ditto.
+       (hash_datafiles): Ditto, add an arg, changed all callers.
+       * mdfilter.c (md_filter): Add support for the alternate hash context.
+
+Mon May 17 21:54:43 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * parse-packet.c (parse_encrypted): Support for PKT_ENCRYPTED_MDC.
+       * build-packet.c (do_encrypted_mdc): Ditto.
+       * cipher.c (write_header): Add mdc hashing.
+       (cipher_filter): write out the hash.
+       * mainproc.c (do_proc_packets): Add PKT_ENCRYPTED_MDC.
+       * encr-data.c (decrypt_data): Add mdc hashing.
+       (mdc_decode_filter): New.
+
+       * parse-packet.c (parse_sig_subpkt): Fixed stupid bug for subpkt
+       length calculation
+       (parse_signature): Fixed even more stupid bug.
+
+Sat May  8 19:28:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * build-packet.c (do_signature): Removed MDC hack.
+       * encode.c (encode_crypt_mdc): Removed.
+       * mainproc.c (do_check_sig): Removed MDC hack.
+       (check_sig_and_print): Ditto.
+       * parse-packet.c (parse_signature): Ditto.
+       * sig-check.c (mdc_kludge_check): Ditto.
+       * free-packte.c (copy_signature, free_seckey_enc): Ditto.
+
+       * parse-packet.c (parse_signature,parse_key): Store data of
+       unknown algorithms with mpi_set_opaque inseatd of the old
+       faked data stuff.
+       (read_rest): Removed.
+       (read_rest2): Renamed to read_rest
+       * build-packet.c (write_fake_data): Use mpi_get_opaque.
+       * free-packet.c (cp_fake_data): Removed and cahnged all callers
+       to use mpi_copy.
+       (free_pubkey_enc,free_seckey_enc,release_public_key_parts,
+        release_secret_key_parts): Use mpi_free for opaque data.
+
+Thu May  6 14:18:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * trustdb.c (check_trust): Check for revoked subkeys.
+       * pkclist.c (do_we_trust): Handled revoked subkeys.
+       (do_we_trust_pre): Ditto.
+       (check_signatures_trust): Ditto.
+
+       * build-packet.c (hash_public_key): Fix for ancient g10 keys.
+
+       * mainproc.c (do_proc_packets): Return EOF if no data has been read.
+       * g10.c (main): Catch errors for default operation.
+
+Thu Apr 29 12:29:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * sign.c (sign_file): Fixed hashing in case of no subpackets.
+       (clearsign_file): Ditto.
+       (make_keysig_packet): Ditto.
+
+Wed Apr 28 13:03:03 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keyedit.c (keyedit_menu): Add new command revkey.
+       * (menu_revkey): New.
+
+
+Mon Apr 26 17:48:15 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * parse-packet.c (parse_signature): Add the MDC hack.
+       * build-packet.c (do_signature): Ditto.
+       * free-packet.c (free_seckey_enc,copy_signature,cmp_signatures): Ditto.
+       * mainproc.c (do_check_sig): Ditto.
+       * sig-check.c (mdc_kludge_check): New.
+       * encode.c (encrypt_mdc_file): New.
+
+       * keyedit.c (check_all_keysigs): List revocations.
+       * (menu_revsig): New.
+       * sign (make_keysig_packet): Support for class 0x30.
+
+Sun Apr 18 20:48:15 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (select_algo_from_prefs): Fixed the case that one key
+       has no preferences (Remi Guyomarch).
+
+       keylist.c (list_keyblock): ulti_hack to propagate trust to all uids.
+
+Sun Apr 18 10:11:28 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * seckey-cert.c (do_check): Use real IV instead of a 0 one, so that
+       it works even if the length of the IV doesn't match the blocksize.
+       Removed the save_iv stuff.
+       (protect_secret_key): Likewise.  Create the IV here.
+       * packet.h (PKT_secret_key): Increased size of IV field and add a
+       ivlen field.
+       * parse-packet.c (parse_key): Use the len protect.ivlen.
+       * build-packet.c (do_secret_key). Ditto.
+
+       * getkey.c (key_byname): Close keyblocks.
+
+       * Makefile.am (gpgm): Removed this
+       * g10.c: Merged gpg and gpgm
+
+       * import.c (import): Utilize option quiet.
+       * tdbio.c (tdbio_set_dbname): Ditto.
+       * ringedit.c (add_keyblock_resource,keyring_copy): Ditto.
+
+       * keyedit.c (sign_uids): Add some batch support.
+
+       * g10.c (main): add call to tty_batchmode.
+
+Fri Apr  9 12:26:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * status.c (write_status_text): Some more status codes.
+       * passphrase_to_dek (passphrase_to_dek): add a status code.
+       * seckey_cert.c (check_secret_key): Likewise.
+
+       * encr-data.c (decrypt_data): Reverse the last changes
+       * cipher.c (write_header): Ditto.
+
+       * parse-packet.c (parse_key): Dropped kludge for ancient blowfish mode.
+
+Thu Apr  8 09:35:53 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mainproc.c (proc_encrypted): Add a new status output
+       * passphrase.c (passphrase_to_dek): Ditto.
+       * status.h status.c: Add new status tokens.
+
+Wed Apr  7 20:51:39 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * encr-data.c (decrypt_data): Fixes for 128 bit blocksize
+       * cipher.c (write_header): Ditto.
+       * seckey-cert.c (do_check): Ditto.
+       (protect_secret_key). Ditto.
+       * misc.c (print_cipher_algo_note): Twofish is now a standard algo.
+
+       * keygen.c (do_create): Fixed spelling (Gaël Quéri)
+       (ask_keysize): Only allow keysizes up to 4096
+
+       * ringedit.c (add_keyblock_resource): chmod newly created secrings.
+
+       * import.c (delete_inv_parts): Fixed accidently deleted subkeys.
+
+Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c: Removed duped include (John Bley)
+       * mainproc.c: Ditto.
+
+       * build-packet.c (hash_public_key): Fixed hashing of the header.
+
+       * import.c (delete_inv_parts): Allow import of own non-exportable sigs.
+
+Sat Mar 20 13:59:47 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c (fake_packet): Fix for not not-dash-escaped
+
+Sat Mar 20 11:44:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c (main): Added command --recv-keys
+       * hkp.c (hkp_import): New.
+
+Wed Mar 17 13:09:03 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * trustdb.c (check_trust): add new arg add_fnc and changed all callers.
+       (do_check): Ditto.
+       (verify_key): Ditto.
+       (propagate_validity): Use the new add_fnc arg.
+       (print_user_id): Add the FILE arg.
+       (propagate_ownertrust): New.
+       * pkclist.c (add_ownertrust_cb): New and changed the add_ownertrust
+       logic.
+
+       * getkey.c (get_keyblock_bylid): New.
+       * trustdb.c (print_uid_from_keyblock): New.
+       (dump_tn_tree_with_colons): New.
+       (list_trust_path): Add colon print mode.
+
+       * trustdb.c (insert_trust_record): Always use the primary key.
+
+       * encode.c (encode_simple): Added text_mode filter (Rémi Guyomarch)
+       (encode_crypt): Ditto.
+
+       * mainproc.c (proc_pubkey_enc): Added status ENC_TO.
+       * armor.c (armor_filter): Added status NODATA.
+       * passphrase.c (passphrase_to_dek): Always print NEED_PASSPHRASE
+       * seckey_cert.c (check_secret_key): Added BAD_PASS status.
+
+       * g10.c (main): Set g10_opt_homedir.
+
+Sun Mar 14 19:34:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keygen.c (do_create): Changed wording of the note (Hugh Daniel)
+
+Thu Mar 11 16:39:46 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * tdbdump.c: New
+
+       * trustdb.c (walk_sigrecs,do_list_sigs,list_sigs,
+       list_records,list_trustdb,export_ownertrust,import_ownertrust): Moved
+       to tdbdump.c
+       (init_trustdb): renamed to setup_trustdb.  Changed all callers.
+       (do_init_trustdb): renamed to init_trustdb().
+       * trustdb.c (die_invalid_db): replaced by tdbio_invalid.
+       * tdbio.c (tdbio_invalid): New.
+
+       * import.c (delete_inv_parts): Skip non exportable signatures.
+       * keyedit.c (sign_uid_mk_attrib): New.
+       (sign_uids): Add the local argument.
+       (keyedit_menu): New "lsign" command.
+       * trustdb.c (register_trusted_key): Removed this and all related stuff.
+       * g10.c (oTrustedKey): Removed option.
+
+       * tdbio.h (dir.valcheck): New trustdb field.
+       * tdbio.c: Add support for this field
+       (tdbio_read_modify_stamp): New.
+       (tdbio_write_modify_stamp): New.
+       * trustdb.c (do_check): Check against this field. Removed cache update.
+       (verify_key): Add cache update.
+       (upd_uid_record): Some functional changes.
+       (upd_cert_record): Ditto
+
+Wed Mar 10 11:26:18 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keylist.c (list_keyblock): Fixed segv in uid. Print 'u' as
+       validity of sks.
+
+Mon Mar  8 20:47:17 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * getkey.c (classify_user_id): Add new mode 12 (#<lid>).
+
+       * seckey-cert.c (check_secret_key): replaced error by info.
+
+       * trustdb.c (query_trust_info): Add another arg, changed all callers.
+       (check_trust): Ditto.
+       (do_check): Ditto.
+       (verify_key): Handle namehash.
+       * keylist.c (list_keyblock): print trust info for user ids.
+
+       * sig-check.c (signature_check): Add sig-created to status output.
+
+Tue Mar  2 16:44:57 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * textfilter.c (copy_clearsig_text): New.
+       (clearsign): Removed.
+       * sign.c (clearsign_file): does not use textfiler anymore.
+
+       * keygen.c (ask_user_id): print a note about the used charset.
+
+Tue Mar  2 10:38:42 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * sig-check.c (signature_check): sig-id now works for all algos.
+
+       * armor.c (armor_filter): Fixed armor bypassing.
+
+Sun Feb 28 19:11:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keygen.c (ask_user_id): Don't change the case of email addresses.
+       (has_invalid_email_chars): Adjusted.
+
+       * keylist.c (list_one): Really list serect keys (Remi Guyomarch)
+
+       * keyedit.c (menu_select_uid): Add some braces to make egcs happy.
+       (menu_select_key): Ditto.
+
+       * mainproc.c (do_proc_packets): List sym-enc packets (Remi Guyomarch)
+
+Fri Feb 26 17:55:41 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (build_pk_list): Return error if there are no recipients.
+
+       * sig-check.c (signature_check): New signature id feature.
+       * armor.c (make_radic64_string): New.
+
+       * mainproc.c (proc_pubkey_enc): early check for seckey availability.
+
+       * pkclist.c (do_we_trust_pre): print user id before asking.
+
+       * ringedit.c (add_keyblock_resource,get_keyblock_handle): Cleaner
+       handling of default resource.
+
+
+Thu Feb 25 18:47:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (algo_available): New.
+       (select_algo_from_prefs): Check whether algo is available.
+
+       * ringedit.c (keyring_copy): Take care of opt.dry_run.
+       (do_gdbm_store): Ditto.
+       * openfile.c (open_outfile). Ditto.
+       (copy_options_file): Ditto.
+       * trustdb.c (update_trustdb): Ditto.
+       (clear_trust_checked_flag): Ditto.
+       (update_trust_record): Ditto.
+       (insert_trust_record): Ditto.
+
+Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * keylist.c (secret_key_list): Now really list the secret key.
+
+       * trustdb.c (do_init_trustdb): New. Init is now deferred.
+
+Mon Feb 22 20:04:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * getkey.c (lookup_sk): Return G10ERR_NO_SECKEY and not x_PUBKEY.
+
+Fri Feb 19 15:49:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (select_algo_from_prefs): retrieve LID if not there.
+
+       * armor.c (fake_packet): Replaced ugly lineending handling.
+
+       * g10.c (oNoEncryptTo): New.
+       * pkclist.c (build_pk_list): Implemented this option.
+
+       * g10.c (main): Greeting is now printed to stderr and not to tty.
+       Use add_to_strlist() instead of direct coding.
+
+       * import.c (import): Use iobuf_push_filter2.
+
+       * mainproc.c (check_sig_and_print): Print all user ids
+       for good signatures.
+       * getkey.c (get_pubkeyblock): New.
+
+       * import.c (chk_self_sigs): Fixed SEGV for unbounded class 0x18 keys.
+       (delete_inv_parts): Delete special marked packets.
+
+Tue Feb 16 14:10:02 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c (main): New option --encrypt-to
+
+       * pkclist.c (build_pk_list): Implemented encrypt-to.
+
+       * parse-packet.c (parse_user_id): Removed the hack to work with
+       utf-8 strings.
+
+       * g10.c (main): Install lockfile cleanup handler.
+       * tdbio.c (cleanup): Removed: this is now handled by dotlock.
+
+Sat Feb 13 14:13:04 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * tdbio.c (tdbio_set_dbname): Init lockhandle for a new trustdb
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c (main): check for development version now in configure
+
+       * tdbio.c (tdbio_write_record): Add uid.validity
+       (tdbio_read_record) : Ditto.
+       (tdbio_dump_record) : Ditto.
+
+       * keygen.c (keygen_add_std_prefs): Replaced Blowfish by Twofish,
+       removed MD5 and Tiger.
+       * pubkey-enc.c (get_it): Suppress warning about missing Blowfish
+       in preferences in certain cases.
+
+       * ringedit.c (lock_rentry,unlock_rentry): New.
+
+       * getkey.c (key_byname): Pass ret_kb down to lookup_xx.
+
+       * armor.c (armor_filter): No output of of empty comment lines.
+       Add option --no-version to suppress the output of the version string.
+
+       * getkey.c: Release the getkey context for auto context variables.
+
+Sun Jan 24 18:16:26 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * getkey.c: Changed the internal design to allow simultaneous
+       lookup of multible user ids
+       (get_pubkey_bynames): New.
+       (get_seckey_bynames): New.
+       (get_seckey_next): New.
+       (get_seckey_end): New.
+       * keylist.c (list_one): Use the new functions.
+
+       * keylist.c (list_keyblock): add a newline for normal listings.
+
+       * g10.c (--recipient): New option name to replace --remote-user
+
+
+Wed Jan 20 18:59:49 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * textfilter.c: Mostly rewritten
+       * plaintext.c (handle_plaintext): Use now text_filter semantics.
+
+Tue Jan 19 19:34:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * export.c (export_pubkeys_stream): New.
+       (do_export_stream): New.
+       * g10.c (aSendKeys): New command.
+       * hkp.c (hkp_export): New.
+
+       * compress.c (do_uncompress): Hack for algo 1 and 1.1.3
+
+Sun Jan 17 11:04:33 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * textfilter.c (text_filter): Now uses iobuf_read_line().
+       (read_line): Removed.
+
+       * armor.c (trim_trailing_spaces): Removed and replaced
+       by trim_trailing_ws from libutil
+
+Sat Jan 16 12:03:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * hkp.c (hkp_ask_import): Use only the short keyid
+
+Sat Jan 16 09:27:30 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * import.c (import_key_stream): New
+       (import): New, moved most of import_keys here.
+       * g10.c: New option --keyserver
+       * mainproc.c (check_sig_and_print): Hook to import a pubkey.
+
+       * pref.c pref.h : Removed
+
+       * hkp.c hkp.h: New
+
+Wed Jan 13 14:10:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c (radix64_read): Print an error if a bad armor was detected.
+
+Wed Jan 13 12:49:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c (radix64_read): Now handles malformed armors produced
+       by some buggy MUAs.
+
+Tue Jan 12 11:17:18 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * ringedit.c (find_keyblock_bysk): New.
+
+       * skc_list.c (is_insecure): New.
+       (build_sk_list): usage check for insecure keys.
+
+       * import.c (chk_self_sigs): Add handling for subkeys.
+       (delete_inv_parts): Skip unsigned subkeys
+
+       * sig-check.c (do_check): Print info if the signature is older
+       than the key.
+       * keygen.c (generate_subkeypair): Fail on time warp.
+       * sign.c (do_sign): Ditto.
+
+Sun Jan 10 15:10:02 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c (fake_packet): Fixed not-dash-escaped bug.
+
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * sig-check.c (do_check): Output time diff on error
+
+       * status.c (STATUS_VALIDSIG): New.
+       (is_status_enabled): New.
+       * mainproc.c (check_sig_and_print): Issue that status message.
+
+       * plaintext.c (special_md_putc): Removed
+
+       * armor.c (armor_filter): print error for truncated lines.
+
+       * free-packet.c (free_encrypted): Revomed call to set_block_mode.
+       (free_plaintext): Ditto.
+
+Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (add_ownertrust): Fixed return value.
+
+       * encr-data.c (decrypt_data): Disabled iobuf_set_limit and
+       iobuf_pop_filter stuff.
+       * compress.c (handle_compressed): Disabled iobuf_pop_filter.
+
+       * packet.h (PKT_secret_key): Add is_primary flag.
+       * parse-packet.c (parse_key): Set this flag.
+       * passphrase.c (passphrase_to_dek): Kludge to print the primary
+       keyid - changed the API: keyid must now hold 2 keyids.
+       * getkey.c (get_primary_seckey): New.
+       * seckey-cert.c (do_check): pass primary keyid to passphrase query
+
+       * tbdio.c (open_db): removed the atexit
+       (tdbio_set_dbname): and moved it to here.
+
+       * armor.c: Rewrote large parts.
+
+Tue Dec 29 19:55:38 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * revoke.c (gen_revoke): Removed compression.
+
+       * pkclist.c (do_we_trust_pre): special check for revoked keys
+
+       * trustdb.c (update_trust_record): Fixed revoke flag.
+
+Tue Dec 29 14:41:47 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * misc.c (disable_core_dumps): Check for EINVAL (Atari)
+
+       * getkey (merge_one_pk_and_selfsig): Fixed search of expiredate.
+       (merge_keys_and_selfsig): Ditto.
+
+       * free-packet.c (cmp_public_keys): cmp expire only for v3 packets
+       (cmp_secret_keys): Ditto.
+       (cmp_public_secret_key): Ditto.
+
+Wed Dec 23 17:12:24 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * armor.c (find_header): Reset not_dashed at every header
+
+Wed Dec 23 13:18:14 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pkclist.c (add_ownertrust): Refresh validity values.
+
+       * trustdb.c (enum_cert_paths_print): New arg refresh.
+
+       * ringedit.c: Fixed problems fix keyrings
+       * parse-packet.c (dbg_parse_packet): New debug functions.
+
+       * getkey.c (getkey_disable_caches): New.
+       * import.c (import_keys): Disable caches.
+
+Thu Dec 17 18:31:15 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * misc.c (trap_unaligned): Only for glibc 1
+
+       * sign.c (write_dash_escaped): Now escapes "From " lines
+       * g10.c: New option --escape-from-lines
+
+       * trustdb.c (sort_tsl_list): New
+       (list_trust_path): Now prints sorted list.
+       (enum_cert_paths): Likewise.
+       (enum_cert_paths_print): New.
+       (print_paths): New printing format.
+       * pkclist.c (add_ownertrust): New arg quit.
+       (edit_ownertrust): New quit selection and does not query
+       the recipients ownertrust anymore.
+       (add_ownertrust): Print the ceritficate path.
+
+
+Mon Dec 14 21:18:49 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * parse-packet.c (parse_signature): Now checks for critical bit
+       (parse_sig_subpkt): Splitted.
+       (parse_one_sig_subpkt): New.
+       * sig-check.c (do_check): handle critical bit.
+
+Sun Dec 13 14:10:56 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pcklist.c (select_algo_from_prefs): Preferences should
+       now work (lost the != ? )
+
+Thu Dec 10 20:15:36 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * ringedit.c (gdbm_store): Fix for inserts
+
+       * g10.c (main): New option --export-all
+       * export.c (export_pubkeys): New arg.
+       (do_export): Now may skip old keys.
+
+       * status.c: Minor patches for Sun's cc
+
+       * keygen.c (ask_algo): Disabled v3 ElGamal choice, rearranged
+        the numbers.  Add a warning question when a sign+encrypt key
+        is selected.
+
+       * g10.c (do_not_use_RSA): Removed.
+       * misc.c (print_pubkey_algo_note): New as replacement for the
+       do_not_use_RSA() and chnaged all callers.
+       (print_cipher_algo_note): New.
+       (print_hash_algo_note): New.
+
+       * cipher.c (write_header): Add a call to print_cipher_algo_note.
+       * seckey-cert.c (protect_secret_key): Ditto
+       * sign.c (do_sign): Add a call to print_digest_algo_note.
+
+       * getkey.c (get_long_user_id_string): New.
+       * mainproc.c (check_sig_and_print): Changed the format of the
+       status output.
+
+       * encrypt.c (write_pubkey_enc_from_list): print used symmetric cipher.
+
+       * pkclist.c (do_we_trust): Changed a message.
+
+Wed Dec  9 13:41:06 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * misc.c (trap_unaligned) [ALPHA]: Only if UAC_SIGBUS is defined.
+
+       * sign.c (write_dash_escaped): Add the forgotten patch by Brian Moore.
+
+       * compress.c (do_uncompress): Fixed the inflating bug.
+
+
+Tue Dec  8 13:15:16 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * trustdb.c (upd_uid_record): Now uses the newest self-signature
+       (insert_trust_record): Now calls update with recheck set to true.
+       (register_trusted_key): New.
+       (verify_own_keys): Enhanced by list of trusted keys.
+
+       * g10.c (main): Print a warning when a devel version is used.
+       (main): New option --trusted-key
+
+       * import.c (merge_blocks): Fixed merging of new user ids and
+       added merging of subkeys.
+       (append_uid): Ditto.
+       (merge_keysig): New.
+       (append_key): New.
+       * getkey.c (merge_one_pk_and_selfsig): Get the expiration time
+       from the newest self-signature.
+       (merge_keys_and_selfsig): Ditto.
+
+       * free-packet.c (cmp_secret_key): New.
+
+
+Fri Nov 27 21:37:41 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10.c: New option --lock-once
+       * tdbio.c (open_db): Add an atexit
+       (cleanup): New.
+       (tdbio_sync): Add locking.
+       (tdbio_end_transaction): Ditto.
+       (put_record_into_cache): Ditto.
+       * ringedit.c (keyring_copy): Ditto.
+       (cleanup): New.
+       (add_keyblock_resource): Add an atexit.
+
+Fri Nov 27 15:30:24 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+        * armor.c (find_header): Another fix for clearsigs.
+
+Fri Nov 27 12:39:29 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * status.c (display_help): Removed.
+       * helptext.c: New and removed the N_() from all cpr_gets.
+
+
+Fri Nov 20 16:54:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): New option --not-dash-escaped
+       * sign.c (write_dashed_escaped): Ditto.
+       * armor.c (find_header): Support for NotDashEscaped header.
+
+       * getkey.c: print "disabled cache.." only if verbose is used.
+
+Thu Nov 19 07:17:31 1998  Werner Koch  <werner.koch@guug.de>
+
+       * parse-packet.c (dump_sig_subpkt): Fixed expire listing
+       * getkey.c (merge_keys_and_selfsig): Fixed expire calculation.
+       (merge_one_pk_and_selfsig): Ditto.
+       * keyedit.c (menu_expire). Ditto.
+       * keygen.c (keygen_add_key_expire): Ditto.
+       (ask_expire_interval): New and changed all local function to use
+       this instead.
+       (keygen_add_key_expire): Opaque should now be a public key;
+       changed all callers.
+
+       * parse.packet.c (parse): use skip_rest to skip packets.
+
+       * keyedit.c (keyedit_menu): New arg for cmdline cmds.
+
+Wed Nov 18 20:33:50 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (check_trustdb): Now rechecks all gived userids.
+       (collect_paths): Some fixes.
+       (upd_pref_records): Skips empty items, evaluate all items.
+
+       * parse-packet.c (dump_sig_subpkt): Better listing of prefs.
+       (skip_packet): Now knows about marker packet
+
+       * g10.c: removed cmd "--edit-sig".
+
+       * pubring.asc: Updated.
+
+Sat Nov 14 14:01:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Changed syntax of --list-trust-path
+       * trustdb.c (list_trust_path): Replaced max_depth by
+       opt.max_cert_depth
+
+Fri Nov 13 07:39:58 1998  Werner Koch  <werner.koch@guug.de>
+
+       * trustdb.c (collect_paths): Removed a warning message.
+       (enum_trust_web): Removed.
+       (enum_cert_paths): New.
+       * pkclist.c (add_ownertrust): Changed to use enum_cert_paths.
+       (edit_ownertrust): Now list ceritficates on request.
+       (show_paths): New.
+
+Wed Nov 11 18:05:44 1998  Werner Koch  <werner.koch@guug.de>
+
+       * g10.c (main): New option --max-cert-depth
+       * tdbio.h: add new fields to ver and dir record.
+       * tdbio.c: read/write/dump of these fields.
+       (tdbio_db_matches_options): New.
+       * trustdb.c: replaced MAC_CERT_DEPTH by opt.max_cert_depth.
+       (do_check): cache validity and changed other functions
+       to reset the cached value.
+
+       * keylist.c (list_one): Now lists the ownertrust.
+       * mainproc.c (list_node): Ditto.
+
+Tue Nov 10 10:08:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (g10_exit): Now looks at the new g10_errors_seen.
+       * mainproc.c (check_sig_and_print): Sets g10_errors_seen.
+
+       * *.c : i18n many more strings.
+
+       * ringedit.c (locate_keyblock_by_keyid): Add HAVE_LIBGDBM
+       (locate_keyblock_by_fpr): Ditto.
+
+       * g10.c (main): removed unsused "int errors".
+       (main): Add new option --charset.
+
+       * g10.c (main): special message for the unix newbie.
+
+Mon Nov  9 07:17:42 1998  Werner Koch  <werner.koch@guug.de>
+
+       * getkey.c (finish_lookup): Kludge to prefere algo 16.
+
+       * trustdb.c (new_lid_table): Clear cached item.
+
+       * status.c (cpr_get_utf8): New.
+       * pkclist.c (build_pk_list): Uses this.
+
+Sun Nov  8 17:20:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mainproc.c (check_sig_and_print): Why did I use strlen()-1
+       in the printf? - This truncated the TZ.
+
+Sat Nov  7 15:57:28 1998  me,,,  (wk@tobold)
+
+       * getkey.c (lookup): Changes to support a read_next.
+       (get_pubkey): Fixed a memory leak.
+
+       * keylist.c (list_one): Now lists all matching user IDs.
+
+Tue Nov  3 16:19:21 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (ask_user_id): Now converted to UTF-8
+
+       * g10.c (main): Kludge for pgp clearsigs and textmode.
+
+Fri Oct 30 16:40:39 1998  me,,,  (wk@tobold)
+
+       * signal.c (block_all_signals): New.
+       (unblock_all_signals): New
+       * tdbio.c (tdbio_end_transaction): Now blocks all signals.
+
+       * trustdb.c (new_lid_table): Changed the representation of the
+       former local_lid_info stuff.
+
+       * trustdb.c (update_trust_record): Reorganized the whole thing.
+       * sig-check.c (check_key_signature): Now handles class 0x28
+
+
+Wed Oct 28 18:56:33 1998  me,,,  (wk@tobold)
+
+       * export.c (do_export): Takes care of the exportable sig flag.
+
+Tue Oct 27 14:53:04 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (update_trust_record): New "fast" parameter.
+
+Sun Oct 25 19:32:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * openfile.c (copy_options_File): New.
+       * ringedit.c (add_keyblock_resource): Creates options file
+       * tdbio.c (tdbio_set_dbname): Ditto.
+
+Sat Oct 24 14:10:53 1998  brian moore <bem@cmc.net>
+
+       * mainproc.c (proc_pubkey_enc): Don't release the DEK
+       (do_proc_packets): Ditto.
+
+Fri Oct 23 06:49:38 1998  me,,,  (wk@tobold)
+
+       * keyedit.c (keyedit_menu): Comments are now allowed
+
+       * trustdb.c: Rewrote large parts.
+
+
+Thu Oct 22 15:56:45 1998  Michael Roth (mroth@nessie.de)
+
+       * encode.c: (encode_simple): Only the plain filename without
+       a given directory is stored in generated packets.
+       (encode_crypt): Ditto.
+
+       * sign.c: (sign_file) Ditto.
+
+
+Thu Oct 22 10:53:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (update_trust_record): Add new optional arg.
+
+       * import.c (import_keys): Add statistics output
+       * trustdb.c (update_trustdb): Ditto.
+       (insert_trustdb): Ditto.
+
+       * tdbio.c (tdbio_begin_transaction): New.
+       (tdbio_end_transaction): New.
+       (tdbio_cancel_transaction): New.
+
+       * g10.c (main): New option --quit.
+
+       * trustdb.c (check_hint_sig): No tests for user-id w/o sig.
+       This caused an assert while checking the sigs.
+
+       * trustdb.c (upd_sig_record): Splitted into several functions.
+
+       * import.c (import_keys): New arg "fast".
+       * g10.c (main): New command --fast-import.
+
+Wed Oct 21 18:19:36 1998  Michael Roth <mroth@nessie.de>
+
+       * ringedit.c (add_keyblock_resource): Directory is now created.
+       * tdbio.c (tdbio_set_dbname): New info message.
+
+Wed Oct 21 11:52:04 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (update_trustdb): released keyblock in loop.
+
+       * keylist.c (list_block): New.
+       (list_all): Changed to use list_block.
+
+       * trustdb.c: Completed support for GDBM
+
+       * sign.c (only_old_style): Changed the way force_v3 is handled
+       (sign_file): Ditto.
+       (clearsign_file): Ditto.
+
+       * keygen.c (has_invalid_email_chars): Splitted into mailbox and
+       host part.
+
+       * keylist.c (list_one): Add a merge_keys_and_selfsig.
+       * mainproc.c (proc_tree): Ditto.
+
+Sun Oct 18 11:49:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sign.c (only_old_style): Add option force_v3_sigs
+       (sign_file): Fixed a bug in sig->version
+       (clearsign_file): Ditto.
+
+       * parse-packet.c (dump_sig_subpkt): New
+
+       * keyedit.c (menu_expire): New.
+       * free-packet.c (cmp_signatures): New
+
+
+Sat Oct 17 10:22:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c: changed output line length from 72 to 64.
+
+       * keyedit.c (fix_keyblock): New.
+
+Fri Oct 16 10:24:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c: Rewrote most.
+       * tdbio.c: Add cache and generalized hash tables.
+
+       * options.h (ENABLE_COMMENT_PACKETS): New but undef'ed.
+       * encode.c, sign.c, keygen.c: Disabled comment packets.
+       * export.c (do_export): Comment packets are never exported,
+       except for those in the secret keyring.
+
+       * g10.c (main): Removed option do-no-export-rsa; should be
+       be replaced by a secpial tool.
+       * export.c (do_export): Removed the code for the above option.
+
+       * armor.c (find_header): Support for new only_keyblocks.
+       * import.c (import_keys): Only looks for keyblock armors.
+
+       * packet.h: replaced valid_days by expiredate and changed all users.
+       * build-packet.c (do_public_key): calculates valid-days
+       (do_secret_key): Ditto.
+       * parse-packet.c (parse_key): expiredate is calucated from the
+       valid_period in v3 packets.
+       * keyid.c (do_fingerprint_md): calculates valid_dates.
+
+       * keygen.c (add_key_expire): fixed key expiration time for v4 packets.
+
+       * armor.c (find_header): A LF in the first 28 bytes
+       was skipped for non-armored data.
+
+Thu Oct  8 11:35:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (is_armored): Add test on old comment packets.
+
+       * tdbio.c (tdbio_search_dir_bypk): fixed memory leak.
+
+       * getkey.c: Changed the caching algorithms.
+
+Wed Oct  7 19:33:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * kbnodes.c (unused_nodes): New.
+
+Wed Oct  7 11:15:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keyedit.c (sign_uids): Fixed a problem with SK which could caused
+       a save of an unprotected key.
+       (menu_adduid): Ditto.
+
+       * keyedit.c (keyedit_menu): Prefs are now correctly listed for
+       new user ids.
+
+       * trustdb.c (update_trust_record): New.
+       (insert_trust_record): Now makes use of update_trust_record.
+
+Tue Oct  6 16:18:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (read_record): replaces most of the tdbio_read_records.
+       (write_record): Ditto.
+
+Sat Oct  3 11:01:21 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (ask_alogo): enable ElGamal enc-only only for addmode.
+
+Wed Sep 30 10:15:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * import.c (import_one): Fixed update of wrong keyblock.
+
+Tue Sep 29 08:32:08 1998  me,,,  (wk@tobold)
+
+       * mainproc.c (proc_plaintext): Display note for special filename.
+       * plaintext.c (handle_plaintext): Suppress output of special file.
+
+Mon Sep 28 12:57:12 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (verify_own_keys): Add warning if a key is not protected.
+
+       * passphrase (hash_passphrase): Fixed iterated+salted mode and
+       setup for keysizes > hashsize.
+
+       * g10.c (main): New options: --s2k-{cipher,digest,mode}.
+
+Fri Sep 25 09:34:23 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c: Chnaged some help texts.
+
+Tue Sep 22 19:34:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * passphrase.c (read_passphrase_from_fd): fixed bug for long
+       passphrases.
+
+Mon Sep 21 11:28:05 1998  Werner Koch  (wk@(none))
+
+       * getkey.c (lookup): Add code to use the sub key if the primary one
+       does not match the usage.
+
+       * armor.c (armor_filter): New error message: no valid data found.
+       (radix64_read): Changes to support multiple messages.
+       (i18n.h): New.
+       * mainproc.c (add_onepass_sig): bug fix.
+
+Mon Sep 21 08:03:16 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * pkclist.c (do_we_trust): Add keyid to most messages.
+
+       * passphrase.c (read_passphrase_from_fd): New.
+       (have_static_passphrase): New
+       (get_passphrase_fd): Removed.
+       (set_passphrase_fd): Removed.
+       * g10.c (main): passphrase is now read here.
+
+       * keyedit.c (keyedit_menu): "help" texts should now translate fine.
+
+Mon Sep 21 06:40:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * encode.c (encode_simple): Now disables compression
+       when --rfc1991 is used.
+       (encode_crypt): Ditto.
+
+Fri Sep 18 16:50:32 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * getkey.c (merge_key_and_selfsig): New.
+
+Fri Sep 18 10:20:11 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * pkclist.c (select_algo_from_prefs): Removed 3DES kludge.
+
+       * seskey.c (make_session_key): Fixed SERIOUS bug introduced
+       by adding the weak key detection code.
+
+       * sign.c (sign_file): Changed aremor header in certain cases.
+
+Tue Sep 15 17:52:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mainproc.c (check_sig_and_print): Replaced ascime by asctimestamp.
+
+Mon Sep 14 11:40:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seskey.c (make_session_key): Now detects weak keys.
+
+       * trustdb (clear_trust_checked_flag): New.
+
+       * plaintext.c (handle_plaintext): Does no anymore suppress CR from
+       cleartext signed messages.
+
+Sun Sep 13 12:54:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (insert_trust_record): Fixed a stupid bug in the free
+       liunked list loops.
+
+Sat Sep 12 15:49:16 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * status.c (remove_shmid): New.
+       (init_shm_comprocess): Now sets permission to the real uid.
+
+Wed Sep  9 11:15:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h (PKT_pubkey_enc): New flah throw_keyid, and add logic to
+       implement it.
+       * g10.c (main): New Option --throw-keyid
+
+       * getkey.c (enum_secret_keys): Add new ar and changed all callers.
+
+Tue Sep  8 20:04:09 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * delkey.c (delete_key): Moved from keyedit.c.
+
+Mon Sep  7 16:37:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * build-packet.c (calc_length_header): New arg new_ctb to correctly
+       calculate the length of new style packets.
+
+       * armor.c (is_armored): Checks for symkey_enc packets.
+
+       * pkclist.c (select_algo_from_prefs): 3DEs substitute is now CAST5.
+
+Tue Aug 11 17:54:50 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * build-packet.c (do_secret_key): Fixed handling of old keys.
+
+       * getkey.c (compare_name): Fixed exact and email matching
+
+       * openfile.c (open_outfile): Changed arguments and all callers.
+
+Tue Aug 11 09:14:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * encode.c (encode_simple): Applied option set-filename and comment.
+       (encode_crypt): Ditto.
+       * sign.c (sign_file): Ditto.
+       * armor.c (armor_filter): Applied option comment.
+
+       * encode.c (encode_crypt): Moved init_packet to the begin.
+       (encode_simple): add an init_packet().
+
+       * comment (write_comment): Now enforces a hash sign as the 1st byte.
+
+       * import.c (import_one): Add explanation for "no user ids".
+
+       * compress.c (do_uncompress): Applied Brian Warner's patch to support
+       zlib 1.1.3 etc.
+
+       * trustdb.c (check_trust): Fixed a problem after inserting new keys.
+
+       * getkey (lookup): do not return the primary key if usage is given
+       (lookup_sk): Ditto and take usage into account.
+
+       * status.c (cpr_get_answer_is_yes): add display_help.
+
+Mon Aug 10 10:11:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * getkey.c (lookup_sk): Now always returns the primary if arg
+       primary is true.
+       (lookup): Likewise.
+       (get_pubkey_byname): Now returns the primary key
+       (get_seckey_byname): Ditto.
+
+
+Mon Aug 10 08:34:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keyid.c (pubkey_letter): ELG_E is now a small g.
+
+Sat Aug  8 17:26:12 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * openfile (overwrite_filep): Changed semantics and all callers.
+
+Sat Aug  8 12:17:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * status.c (display_help): New.
+
+Thu Aug  6 16:30:41 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * seskey.c (encode_session_key): Now uses get_random_bits().
+
+Thu Aug  6 07:34:56 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * ringedit.c (keyring_copy): No more backupfiles for
+       secret keyrings and add additional warning in case of
+       a failed secret keyring operation.
+
+Wed Aug  5 11:54:37 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (check_opts): Moved to main.  Changed def_cipher_algo
+       semantics and chnaged all users.
+
+       * pubkey-enc.c (get_sssion_key): New informational output
+       about preferences.
+
+       * parse-packet.c (parse_symkeyenc): Fixed salted+iterated S2K
+       (parse_key): Ditto.
+       * build-packet.c (do_secret_key): Ditto.
+       (do_symkey_enc): Ditto.
+
+Tue Aug  4 08:59:10 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * getkey.c (enum_secret_keys): Now returns only primary keys.
+
+       * getkey (lookup): Now sets the new namehash field.
+
+       * parse-packet.c (parse_sig_subpkt2): New.
+
+       * sign.c (sign_file): one-pass sigs are now emiited reverse.
+       Preference data is considered when selecting the compress algo.
+
+Wed Jul 29 12:53:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * free-packet.c (copy_signature): New.
+
+       * keygen.c (generate_subkeypair): rewritten
+       * g10.c (aKeyadd): Removed option --add-key
+
+Mon Jul 27 10:37:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seckey-cert.c (do_check): Additional check on cipher blocksize.
+       (protect_secret_key): Ditto.
+       * encr-data.c: Support for other blocksizes.
+       * cipher.c (write_header): Ditto.
+
+Fri Jul 24 16:47:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * kbnode.c (insert_kbnode): Changed semantics and all callers.
+       * keyedit.c : More or less a complete rewrite
+
+Wed Jul 22 17:10:04 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * build-packet.c (write_sign_packet_header): New.
+
+Tue Jul 21 14:37:09 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * import.c (import_one): Now creates a trustdb record.
+
+       * g10.c (main): New command --check-trustdb
+
+Mon Jul 20 11:15:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * genkey.c (generate_keypair): Default key is now DSA with
+       encryption only ElGamal subkey.
+
+Thu Jul 16 10:58:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keyid.c (keyid_from_fingerprint): New.
+       * getkey.c (get_pubkey_byfprint): New.
+
+Tue Jul 14 18:09:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keyid.c (fingerprint_from_pk): Add argument and changed all callers.
+       (fingerprint_from_sk): Ditto.
+
+Tue Jul 14 10:10:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * plaintext.c (handle_plaintext): Now returns create error if
+       the file could not be created or the user responded not to overwrite
+       the file.
+       * mainproc.c (proc_plaintext): Tries again if the file could not
+       be created to check the signature without output.
+
+       * misc.c (disable_core_dumps): New.
+       * g10.c (main): disable coredumps for gpg
+
+       * g10.c (MAINTAINER_OPTIONS): New to disable some options
+
+Mon Jul 13 16:47:54 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * plaintext.c (hash_datafiles): New arg for better support of
+       detached sigs. Changed all callers.
+       * mainproc.c (proc_signature_packets): Ditto.
+
+       * g10.c (main): New option "compress-sigs"
+       * sig.c (sign_file): detached signatures are not anymore compressed
+       unless the option --compress-sigs is used.
+
+Thu Jul  9 19:54:54 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c: Fixes to allow zero length cleartext signatures
+
+Thu Jul  9 14:52:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (build_list): Now drops setuid.
+       (main): Changed the way keyrings  and algorithms are registered .
+
+Wed Jul  8 14:17:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h (PKT_public_key): Add field keyid.
+       * parse-packet.c (parse_key): Reset the above field.
+       * keyid.c (keyid_from_pk): Use above field as cache.
+
+       * tdbio.c, tdbio.h: New
+       * trustdb.c: Moved some functions to tdbio.c.
+       (print_keyid): New.
+
+       * pkclist.c (check_signatures_trust): New.
+
+Wed Jul  8 10:45:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * plaintext.c (special_md_putc): New.
+       (handle_plaintext): add clearsig argument
+       * mainproc.c (proc_plaintext): detection of clearsig
+       * sign.c (write_dased_escaped): Changed clearsig format
+
+Tue Jul  7 18:56:19 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (find_header): Now makes sure that there is only one
+       empty line for clearsigs, as this is what OP now says.
+
+Mon Jul  6 13:09:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): New option default-secret-key
+       * getkey.c (get_seckey_byname): support for this option.
+
+Mon Jul  6 09:03:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * getkey.c (add_keyring): Keyrings are now added to end of the
+       list of keyrings.  The first added keyringwill be created.
+       (add_secret_keyring): Likewise.
+
+       * ringedit.c (add_keyblock_resource): Files are created here.
+
+       * g10.c (aNOP): Removed
+
+       * getkey.c (lookup): Add checking of usage for name lookups
+       * packet.h (pubkey_usage): Add a field which may be used to store
+       usage capabilities.
+       * pkclist.c (build_pk_list): getkey now called with usage arg.
+       * skclist.c (build_sk_list): Ditto.
+
+       * sign.c (clearsign_file): Fixed "Hash:" headers
+
+Sat Jul  4 13:33:31 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (list_ownertrust): New.
+       * g10.c (aListOwnerTrust): New.
+
+       * g10.c (def_pubkey_algo): Removed.
+
+       * trustdb.c (verify_private_data): Removed and also the call to it.
+       (sign_private_data): Removed.
+
+Fri Jul  3 13:26:10 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (aEditKey): was aEditSig. Changed usage msg.
+
+       * keyedit.c: Done some i18n stuff.
+
+       * g10.c (do_not_use_RSA): New.
+       * sign.c (do_sign): Add call to above function.
+       * encode.c (write_pubkey_enc_from_list): Ditto.
+
+Thu Jul  2 21:01:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c: Now is able sto store data of unknown
+       algorithms.
+       * free-packet.c: Support for this.
+       * build-packet.c: Can write data of packet with unknown algos.
+
+Thu Jul  2 11:46:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c (parse): fixed 4 byte length header
+
+Wed Jul  1 12:36:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h (new_ctb): New field for some packets
+       * build-packet.c (build_packet): Support for new_ctb
+       * parse-packet.c (parse): Ditto.
+
+Mon Jun 29 12:54:45 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h: changed all "_cert" to "_key", "subcert" to "subkey".
+
+       * free-packet.c (free_packet): Removed memory leak for subkeys.
+
+Sun Jun 28 18:32:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * import.c (import_keys): Renamed from import_pubkeys.
+       (import_secret_one): New.
+
+       * g10.c (aExportSecret): New.
+
+       * export.c (export_seckeys): New.
+
+       * parse-packet.c (parse_certificate): Cleaned up.
+       (parse_packet): Trust packets are now considered as unknown.
+       (parse_pubkey_warning): New.
+
+Fri Jun 26 10:37:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (has_invalid_email_chars): New.
+
+Wed Jun 24 16:40:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (armor_filter): Now creates valid onepass_sig packets
+       with all detected hash algorithms.
+       * mainproc.c (proc_plaintext): Now uses the hash algos as specified
+       in the onepass_sig packets (if there are any)
+
+Mon Jun 22 11:54:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * plaintext.c (handle_plaintext): add arg to disable outout
+       * mainproc.c (proc_plaintext): disable output when in sigs_only mode.
+
+Thu Jun 18 13:17:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c: Removed all rsa packet stuff, chnaged defaults
+       for key generation.
+
+Sun Jun 14 21:28:31 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * misc.c (checksum_u16): Fixed a stupid bug which caused a
+       wrong checksum calculation for the secret key protection and
+       add a backward compatibility option.
+       * g10.c (main): Add option --emulate-checksum-bug.
+
+Thu Jun 11 13:26:44 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h: Major changes to the structure of public key material
+       which is now stored in an array and not anaymore in a union of
+       algorithm specific structures.  These is needed to make the system
+       more extendable and makes a lot of stuff much simpler. Changed
+       all over the system.
+
+       * dsa.c, rsa.c, elg.c: Removed.
+
+Wed Jun 10 07:22:02 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * g10.c ("load-extension"): New option.
+
+Mon Jun  8 22:23:37 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seckey-cert.c (do_check): Removed cipher constants
+       (protect_secret_key): Ditto.
+
+Fri May 29 10:00:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (query_trust_info): New.
+       * keylist.c (list_one): Add output of trust info
+       * mainproc (list_node): ditto.
+       * g10.c (main): full trustdb init if -with-colons and any of the
+       key list modes.
+
+Thu May 28 10:34:42 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * status.c (STATUS_RSA_OR_IDEA): New.
+       * sig-check.c (check_signature): Output special status message.
+       * pubkey-enc.c (get_session_key): Ditto.
+
+       * mainproc.c (check_sig_and_print): Changed format of output.
+       * passpharse.c (passphrase_to_dek): Likewise.
+
+Wed May 27 13:46:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (aListSecretKeys): New option --list-secret-keys
+       * keylist.c (std_key_list): Renamed to public_key_list.
+       (secret_key_list): New
+       (list_one, list_all): Add support for secret keys.
+       * getkey.c (get_secret_keyring): New.
+       * mainproc.c (list_node): Add option --with-colons for secret keys
+
+       * sig-check.c (check_key_signature): detection of selfsigs
+       * mainproc.c (list_node): fixed listing.
+
+       * g10.c (aListSecretKeys): New option --always-trust
+       * pkclist.c (do_we_trust): Override per option added
+
+       * status.c (write_status_text): Add a prefix to every output line.
+
+Wed May 27 07:49:21 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10 (--compress-keys): New.
+       * options.h (compress_keys): New.
+       * export.c (export_pubkeys): Only compresses with the new option.
+
+Tue May 26 11:24:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * passphrase.c (get_last_passphrase): New
+       (set_next_passphrase): New.
+       (passphrase_to_dek): add support for the above functions.
+       * keyedit.c (make_keysig_packet): Add sigclass 0x18,
+       changed all callers due to a new argument.
+       * keygen.c (write_keybinding): New
+       (generate_subkeypair): Add functionality
+       (ask_algo, ask_keysize, ask_valid_days): Broke out of generate_keypair
+       (ask_user_id, ask_passphrase): Ditto.
+
+Thu May 21 11:26:13 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c,gpgd.c (main): Does now return an int, so that egcs does
+       not complain.
+
+       * armor.c (fake_packet): Removed erro message and add a noticed
+       that this part should be fixed.
+
+       * sign.c (sign_file): Compression now comes in front of encryption.
+       * encode.c (encode_simple): Ditto.
+       (encode_crypt): Ditto.
+
+Tue May 19 16:18:19 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (fake_packet): Changed assertion to log_error
+
+Sat May 16 16:02:06 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * build-packet.c (build_packet): Add SUBKEY packets.
+
+Fri May 15 17:57:23 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sign.c (hash_for): New and used in all places here.
+       * main.h (DEFAULT_): new macros.
+       * g10.c  (opt.def_digest_algo): Now set to 0
+
+       * compress.c (init_compress): Add support for algo 1
+       * options.h (def_compress_algo): New
+       * g10.c (main): New option --compress-algo
+
+Fri May 15 13:23:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (print_mds): New feature to print only one hash,
+       chnaged formatting.
+
+Thu May 14 15:36:24 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * misc.c (trap_unaligned) [__alpha__]: New
+       * g10.c (trap_unaligned): Add call to this to track down SIGBUS
+       on Alphas (to avoid the slow emulation code).
+
+Wed May 13 11:48:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * build-packet.c (do_signature): Support for v4 pakets.
+       * keyedit.c (make_keysig_packet): Ditto.
+       * build-packet.c (build_sig_subpkt_from_sig): New.
+       (build_sig_subpkt): New.
+
+       * elg.c (g10_elg_sign): removed keyid_from_skc.
+       * dsa.c (g10_dsa_sign): Ditto.
+       * rsa.c (g10_rsa_sign): Ditto.
+       * keyedit.c (make_keysig_packet): Add call to keyid_from_skc
+
+       * sign.c (clearsign_file): Support for v4 signatures.
+       (sign_file): Ditto.
+
+Wed May  6 09:31:24 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c (do_parse): add support for 5 byte length leader.
+       (parse_subpkt): Ditto.
+       * build-packet.c (write_new_header): Ditto.
+
+       * packet.h (SIGSUBPKT_): New constants.
+       * parse-packet.c (parse_sig_subpkt): Changed name, made global,
+       and arg to return packet length, chnaged all callers
+
+
+Tue May  5 22:11:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (gen_dsa): New.
+       * build_packet.c (do_secret_cert): Support for DSA
+
+Mon May  4 19:01:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * compress.c: doubled buffer sizes
+       * parse-packet.c (do_plaintext): now uses iobuf_read/write.
+
+Mon May  4 09:35:53 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seskey.c (encode_md_value): Add optional argument hash_algo,
+       changed all callers.
+
+       * passphrase.c (make_dek_from_passphrase): Removed
+       * (get_passhrase_hash): Changed name to passphrase_to_dek, add arg,
+       changed all callers.
+
+       * all: Introduced the new ELG identifier and added support for the
+       encryption only one (which is okay to use by GNUPG for signatures).
+
+Sun May  3 17:50:26 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h (PKT_OLD_COMMENT): New name for type 16.
+       * parse-packet.c (parse_comment): Now uses type 61
+
+Fri May  1 12:44:39 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * packet.h (count): Chnaged s2k count from byte to u32.
+       * seckey-cert.c (do_check): Changed s2k algo 3 to 4, changed
+       reading of count.
+       * build-packet.c (do_secret_cert): ditto.
+       * parse-packet.c (parse_certificate): ditto.
+
+       * parse-packet.c (parse_symkeyenc): New.
+       * build-packet.c (do_symkey_enc): New.
+
+Thu Apr 30 16:33:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sign.c (clearsign_file): Fixed "Hash: " armor line.
+
+Tue Apr 28 14:27:42 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c (parse_subpkt): Some new types.
+
+Mon Apr 27 12:53:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Add option --skip-verify.
+       * mainproc.c (check_sig_and_print): Ditto.
+
+       * g10.c (print_mds): Add output for Tiger.
+
+       * sign.c (sign_file): Now uses partial length headers if used
+       in canonical textmode (kludge to fix a bug).
+
+       * parse-packet.c (parse_certificate): Changed BLOWFISH id.
+       * pubkey-enc.c (get_session_key): Ditto.
+       * seskey.c (make_session_key): Ditto.
+       * seckey-cert.c (protect_secret_key,do_check): Add BLOWFISH160.
+
+Fri Apr 24 17:38:48 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * sig-check.c (check_key_signature): Add sig-class 0x14..0x17
+       * keyedit.c (sign-key): Some changes to start with support of
+       the above new sig-classes.
+
+Wed Apr 22 09:01:57 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * getkey.c (compare_name): add email matching
+
+Tue Apr 21 16:17:12 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * armor.c (armor_filter): fixed missing last LF before CSUM.
+
+Thu Apr  9 11:35:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seckey-cert.c (do_check): New; combines all the check functions
+       into one.
+
+       * sign.c: removed all key management functions
+       * keyedit.c: New.
+
+Thu Apr  9 09:49:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * import.c (chk_self_sigs): Changed an error message.
+
+Wed Apr  8 16:19:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * packet.h: packet structs now uses structs from the pubkey,
+       removed all copy operations from packet to pubkey structs.
+
+Wed Apr  8 13:40:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (verify_own_certs): Fixed "public key not found".
+
+       * getkey.c (key_byname): New, combines public and secret key search.
+
+       * pkclist.c (build_pkc_list): Add new arg usage, changed all callers.
+       * skclist.c (build_skc_list): Likewise.
+
+       * ringedit.c (find_keyblock, keyring_search2): Removed.
+
+Wed Apr  8 09:47:21 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sig-check.c (do_check): Applied small fix from Ulf Möller.
+
+Tue Apr  7 19:28:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c, encr-data.c, seckey-cert.c: Now uses cipher_xxxx
+       functions instead of blowfish_xxx or cast_xxx
+
+Tue Apr  7 11:04:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (g10maint.o): Changed the way it is created.
+
+Mon Apr  6 11:17:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * misc.c: New.
+       * keygen.c (checksum,checksum_u16,checksum_mpi): Moved to misc.c
+       * seckey-cert.c: Kludge for wrong ELG checksum implementation.
+
+Sat Apr  4 20:07:01 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.c (cipher_filter): Support for CAST5
+       * encr-data.c (decode_filter): Ditto.
+       (decrypt_data): Ditto.
+       * seskey.c (make_session_key): Ditto.
+       * seckey-cert.c (check_elg, check_dsa): Ditto,
+       (protect_secret_key): Ditto.
+       * pubkey-enc.c (get_session_key): Ditto.
+       * passphrase.c (hash_passphrase): Ditto.
+
+Thu Apr  2 20:22:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * gpgd.c: New
+
+Thu Apr  2 10:38:16 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (generate_keypair): Add valid_days stuff.
+       * trustdb.c (check_trust): Add check for valid_days.
+
+Wed Apr  1 16:15:58 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (generate_keypair): Addional question whether the
+       selected large keysize is really needed.
+
+Wed Apr  1 15:56:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * seckey-cert.c (protect_secret_key): merged protect_xxx to here.
+
+Wed Apr  1 10:34:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (g10maint.c): Changed creation rule, so that it works
+       on FreeBSD (missing CFLAGS).
+
+       * parse-packet.c (parse_subkey): Removed.
+
+Thu Mar 19 15:22:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ringedit.c (keyring_enum): Fixed problem with reading too
+       many packets. Add support to read secret keyrings.
+
+       * getkey.c (scan_keyring): Removed
+       (lookup): New to replace scan_keyring.
+       (scan_secret_keyring): Removed.
+       (lookup_skc): New.
+
+Wed Mar 18 11:47:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ringedit.c (enum_keyblocks): New read mode 11.
+
+       * keyid.c (elg_fingerprint_md): New and changed all other functions
+       to call this if the packet version is 4 or above.
+
+Tue Mar 17 20:46:16 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c (parse_certificate): Add listing support for subkeys.
+
+Tue Mar 17 20:32:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (is_armored): Allow marker packet.
+
+Thu Mar 12 13:36:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (check_trust): Checks timestamp of pubkey.
+       * sig-check. (do_check): Compares timestamps.
+
+Tue Mar 10 17:01:56 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Add call to init_signals.
+       * signal.c: New.
+
+Mon Mar  9 12:43:42 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * dsa.c: New
+       * packet.h, free-packet.c, parse-packet.c : Add support for DSA
+       * sig-check.c, getkey.c, keyid.c, ringedit.c: Ditto.
+       * seckey-cert.c: Ditto.
+
+       * packet.h : Moved .digest_algo of signature packets to outer
+       structure. Changed all references
+
+Sun Mar  8 13:06:42 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * openfile.c : Support for stdout filename "-".
+
+       * mainproc.c (check_sig_and_print): Enhanced status output:
+       * status.c (write_status_text): New.
+
+Fri Mar  6 16:10:54 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * kbnode.c (clone_kbnode): Fixed private_flag.
+
+       * mainproc.c (list_node): Output of string "Revoked" as user-id.
+
+Fri Mar  6 14:26:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Add userids to "-kv" and cleaned up this stuff.
+
+Fri Mar  6 12:45:58 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Changed semantics of the list-... commands
+       and added a new one. Removed option "-d"
+
+       * decrypt.c: New.
+
+       * trustdb.c (init_trustdb): Autocreate directory only if it ends
+       in "/.gnupg".
+
+Thu Mar  5 12:12:11 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mainproc.c (do_proc_packets): New. Common part of proc_packet.
+       (proc_signature_packets): special version to handle signature data.
+       * verify.c: New.
+       * g10.c (aVerify): New.
+       * plaintext.c (hash_datafiles): New.
+       * compress.c (handle_compressed): Add callback arg, changed caller.
+
+Thu Mar  5 10:20:06 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c: Is nom the common source for gpg and gpgm
+       * g10maint.c: Removed
+       * Makefile.am: Add rule to build g10maint.c
+
+Thu Mar  5 08:43:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Changed the way clear text sigs are faked.
+
+Wed Mar  4 19:47:37 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10maint.c (aMuttKeyList): New
+       * keylist.c: New.
+
+Wed Mar  4 17:20:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * getkey.c (get_pubkey_byname): Kludge to allow 0x prefix.
+
+Tue Mar  3 13:46:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10maint.c (main): New option --gen-random.
+
+Tue Mar  3 09:50:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (aDeleteSecretKey): New.
+       (aEditSig): Add option "--edit-key" as synonym for "--edit-sig".
+       (aDeleteSecretKey): New.
+       * getkey.c (seckey_available): New.
+       * sign.c (delete_key): Enhanced to delete secret keys, changed all
+       callers.
+
+Mon Mar  2 21:23:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * pkc_list.c (build_pkc_list): Add interactive input of user ID.
+
+Mon Mar  2 20:54:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * pkclist.c (do_we_trust_pre): New.
+       (add_ownertrust): Add message.
+       * trustdb.c (enum_trust_web): Quick fix.
+
+Mon Mar  2 13:50:53 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): New action aDeleteKey
+       * sign.c (delete_key): New.
+
+Sun Mar  1 16:38:58 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (do_check): No returns TRUST_UNDEFINED instead of
+       eof error.
+
+Fri Feb 27 18:14:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (find_header): Removed trailing CR on headers.
+
+Fri Feb 27 18:02:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ringedit.c (keyring_search) [MINGW32]: Open and close file here
+       because rename does not work on open files. Chnaged callers.
+
+Fri Feb 27 16:43:11 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sig-check.c (do_check): Add an md_enable.
+       * mainproc.c (do_check_sig): Use md_open in case of detached sig
+       (proc_tree): Take detached sigs into account.
+
+Fri Feb 27 15:22:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): Make use of GNUPGHOME envvar.
+       * g10main.c (main): Ditto.
+
+Wed Feb 25 11:40:04 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * plaintext.c (ask_for_detached_datafile): add opt.verbose to
+       info output.
+
+       * openfile.c (open_sigfile): Try also name ending in ".asc"
+
+Wed Feb 25 08:41:00 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * keygen.c (generate_keypair): Fixed memory overflow.
+
+Tue Feb 24 15:51:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c (parse_certificate): Support for S2K.
+       * build-packet.c (do_secret_cert): Ditto.
+       * keygen.c (gen_elg): Ditto.
+       * seckey-cert.c (check_elg): Ditto
+       (protect_elg): Ditto.
+       * sign.c (chnage_passphrase): Ditto.
+       * passphrase.c (get_passphrase_hash): Support for a salt and
+       changed all callers.
+       (make_dek_from_passphrase): Ditto.
+
+Tue Feb 24 12:30:56 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * build-packet.c (hash_public_cert): Disabled debug output.
+
+Fri Feb 20 17:22:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (init_trustdb) [MINGW32]: Removed 2nd mkdir arg.
+       (keyring_copy) [MINGW32]: Add a remove prior to the renames.
+
+Wed Feb 18 18:39:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (OMIT_DEPENDENCIES): New.
+
+       * rsa.c: Replaced log_bug by BUG.
+
+Wed Feb 18 13:35:58 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mainproc.c (do_check_sig): Now uses hash_public_cert.
+       * parse-packet.c (parse_certificate): Removed hashing.
+       * packet.h (public_cert): Removed hash variable.
+       * free-packet.c (copy_public_cert, free_public_cert): Likewise.
+
+       * sig-check.c (check_key_signatures): Changed semantics.
+
+Wed Feb 18 12:11:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * trustdb.c (do_check): Add handling for revocation certificates.
+       (build_sigrecs): Ditto.
+       (check_sigs): Ditto.
+
+Wed Feb 18 09:31:04 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (armor_filter): Add afx->hdrlines.
+       * revoke.c (gen_revoke): Add comment line.
+       * dearmor.c (enarmor_file): Ditto.
+
+       * sig-check.c (check_key_signature): Add handling for class 0x20.
+       * mainproc.c : Ditto.
+
+Tue Feb 17 21:24:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c : Add header lines "...ARMORED FILE .."
+       * dearmor.c (enarmor_file): New.
+       * g10maint.c (main): New option "--enarmor"
+
+Tue Feb 17 19:03:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mainproc.c : Changed a lot, because the packets are now stored
+       a simple linlked list and not anymore in a complicatd tree structure.
+
+Tue Feb 17 10:14:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * free_packet.c (cmp_public_certs): New.
+       (cmp_user_ids): New.
+
+       * kbnode.c (clone_kbnode): New.
+       (release_kbnode): Add clone support.
+
+       * ringedit.c (find_keyblock_bypkc): New.
+
+       * sign.c (remove_keysigs): Self signatures are now skipped,
+       changed arguments and all callers.
+
+       * import.c : Add functionality.
+
+Tue Feb 17 09:31:40 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * options.h (homedir): New option.
+       * g10.c, g10maint.c, getkey.c, keygen.c, trustdb.c (opt.homedir): New.
+
+       * trustdb.c (init_trustdb): mkdir for hoem directory
+       (sign_private_data): Renamed "sig" to "g10.sig"
+
+Mon Feb 16 20:02:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * kbnode.c (commit_kbnode): New.
+       (delete_kbnode): removed unused first arg. Changed all Callers.
+
+       * ringedit.c (keyblock_resource_name): New.
+       (get_keyblock_handle): NULL for filename returns default resource.
+
+Mon Feb 16 19:38:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * sig-check.s (check_key_signature): Now uses the supplied
+       public key to check the signature and not any more the one
+       from the getkey.c
+       (do_check): New.
+       (check_signature): Most work moved to do_check.
+
+Mon Feb 16 14:48:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (find_header): Fixed another bug.
+
+Mon Feb 16 12:18:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * getkey.c (scan_keyring): Add handling of compressed keyrings.
+
+Mon Feb 16 10:44:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c, g10maint.c (strusage): Rewrote.
+       (build_list): New
+
+Mon Feb 16 08:58:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (use_armor): New.
+
+Sat Feb 14 14:30:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mainproc.c (proc_tree): Sigclass fix.
+
+Sat Feb 14 14:16:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * armor.c (armor_filter): Changed version and comment string.
+       * encode.c, sign.c, keygen.c: Changed all comment packet strings.
+
+Sat Feb 14 12:39:24 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (aGenRevoke): New command.
+       * revoke.c: New.
+       * sign.c (make_keysig_packet): Add support for sigclass 0x20.
+
+Fri Feb 13 20:18:14 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ringedit.c (enum_keyblocks, keyring_enum): New.
+
+Fri Feb 13 19:33:40 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * export.c: Add functionality.
+
+       * keygen.c (generate_keypair): Moved the leading comment behind the
+       key packet.
+       * kbnode.c (walk_kbnode): Fixed.
+
+       * g10.c (main): listing armored keys now work.
+
+Fri Feb 13 16:17:43 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * parse-packet.c (parse_publickey, parse_signature): Fixed calls
+       to mpi_read used for ELG b.
+
+Fri Feb 13 15:13:23 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10.c (main): changed formatting of help output.
+
+Thu Feb 12 22:24:42 1998  Werner Koch  (wk@frodo)
+
+       * pubkey-enc.c (get_session_key): rewritten
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003,
+          2004, 2005, 2006 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/g10/Makefile.am b/g10/Makefile.am
new file mode 100644 (file)
index 0000000..fa4e0b5
--- /dev/null
@@ -0,0 +1,156 @@
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+#               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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/intl @LIBUSB_CPPFLAGS@
+
+EXTRA_DIST = options.skel
+# it seems that we can't use this with automake 1.5
+#OMIT_DEPENDENCIES = zlib.h zconf.h
+
+if ! HAVE_DOSISH_SYSTEM
+AM_CPPFLAGS += -DGNUPG_LIBEXECDIR="\"$(libexecdir)/@PACKAGE@\""
+endif
+
+needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
+other_libs = $(LIBICONV) $(DNSLIBS) $(LIBINTL) $(CAPLIBS)
+
+bin_PROGRAMS = gpg gpgv
+
+if ENABLE_BZIP2_SUPPORT
+bzip2_source = compress-bz2.c
+else
+bzip2_source =
+endif
+
+common_source =  \
+             global.h          \
+             build-packet.c    \
+             compress.c        \
+             $(bzip2_source)   \
+             filter.h          \
+             free-packet.c     \
+             getkey.c          \
+             keydb.c keydb.h    \
+             keyring.c keyring.h \
+             seskey.c          \
+             kbnode.c          \
+             main.h            \
+             mainproc.c        \
+             armor.c           \
+             mdfilter.c        \
+             textfilter.c      \
+             progress.c        \
+             misc.c            \
+             options.h         \
+             openfile.c        \
+             keyid.c           \
+             packet.h          \
+             parse-packet.c    \
+             status.c          \
+             status.h          \
+             plaintext.c       \
+             sig-check.c       \
+             keylist.c         \
+             signal.c
+
+if ENABLE_CARD_SUPPORT
+card_support_source_gpg = card-util.c 
+card_support_source_scd = \
+       app-common.h \
+       app-openpgp.c \
+       iso7816.c iso7816.h \
+       apdu.c apdu.h \
+       ccid-driver.c ccid-driver.h
+card_support_source_local = cardglue.c cardglue.h tlv.c tlv.h
+else
+card_support_source_gpg =
+card_support_source_scd = 
+card_support_source_local =
+endif
+
+card_support_source = $(card_support_source_local) $(card_support_source_gpg) $(card_support_source_scd)
+
+gpg_SOURCES  = gpg.c           \
+             $(common_source)  \
+             $(card_support_source) \
+             pkclist.c         \
+             skclist.c         \
+             pubkey-enc.c      \
+             passphrase.c      \
+             seckey-cert.c     \
+             encr-data.c       \
+             cipher.c          \
+             encode.c          \
+             sign.c            \
+             verify.c          \
+             revoke.c          \
+             decrypt.c         \
+             keyedit.c         \
+             dearmor.c         \
+             import.c          \
+             export.c          \
+             trustdb.c         \
+             trustdb.h         \
+             tdbdump.c         \
+             tdbio.c           \
+             tdbio.h           \
+             delkey.c          \
+             keygen.c          \
+             pipemode.c        \
+             helptext.c        \
+             keyserver.c       \
+             keyserver-internal.h \
+             photoid.c photoid.h \
+             exec.c exec.h
+
+gpgv_SOURCES = gpgv.c           \
+             $(common_source)  \
+             verify.c          
+
+LDADD =  $(needed_libs) $(other_libs) @ZLIBS@ @W32LIBS@ @LIBREADLINE@
+gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@
+
+$(PROGRAMS): $(needed_libs)
+
+install-data-local:
+       $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+       $(INSTALL_DATA) $(srcdir)/options.skel \
+                               $(DESTDIR)$(pkgdatadir)/options.skel
+       @set -e;\
+        if test -f $(DESTDIR)$(bindir)/gpgm ; then \
+          echo "removing obsolete gpgm binary" ;   \
+          rm $(DESTDIR)$(bindir)/gpgm ;            \
+        fi
+
+# Helper to update some source files.
+update-source-from-gnupg-2:
+       @set -e; \
+        if test -d ../../gnupg-1.9/scd; then dir="../../gnupg-1.9"; \
+        elif test -d ../../gnupg/scd; then dir="../../gnupg"; \
+        else exit 1; \
+        fi; \
+        for i in $(card_support_source_scd); do \
+           cp $$dir/scd/$$i $$i; echo $$i; \
+        done ;\
+        for i in $(card_support_source_gpg); do \
+           cp $$dir/g10/$$i $$i; echo $$i; \
+        done ; \
+        echo "Please remember to update the ChangeLog accordingly!"
diff --git a/g10/Makefile.in b/g10/Makefile.in
new file mode 100644 (file)
index 0000000..20d7899
--- /dev/null
@@ -0,0 +1,801 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+#               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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+# it seems that we can't use this with automake 1.5
+#OMIT_DEPENDENCIES = zlib.h zconf.h
+@HAVE_DOSISH_SYSTEM_FALSE@am__append_1 = -DGNUPG_LIBEXECDIR="\"$(libexecdir)/@PACKAGE@\""
+bin_PROGRAMS = gpg$(EXEEXT) gpgv$(EXEEXT)
+subdir = g10
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am__gpg_SOURCES_DIST = gpg.c global.h build-packet.c compress.c \
+       compress-bz2.c filter.h free-packet.c getkey.c keydb.c keydb.h \
+       keyring.c keyring.h seskey.c kbnode.c main.h mainproc.c \
+       armor.c mdfilter.c textfilter.c progress.c misc.c options.h \
+       openfile.c keyid.c packet.h parse-packet.c status.c status.h \
+       plaintext.c sig-check.c keylist.c signal.c cardglue.c \
+       cardglue.h tlv.c tlv.h card-util.c app-common.h app-openpgp.c \
+       iso7816.c iso7816.h apdu.c apdu.h ccid-driver.c ccid-driver.h \
+       pkclist.c skclist.c pubkey-enc.c passphrase.c seckey-cert.c \
+       encr-data.c cipher.c encode.c sign.c verify.c revoke.c \
+       decrypt.c keyedit.c dearmor.c import.c export.c trustdb.c \
+       trustdb.h tdbdump.c tdbio.c tdbio.h delkey.c keygen.c \
+       pipemode.c helptext.c keyserver.c keyserver-internal.h \
+       photoid.c photoid.h exec.c exec.h
+@ENABLE_BZIP2_SUPPORT_TRUE@am__objects_1 = compress-bz2.$(OBJEXT)
+am__objects_2 = build-packet.$(OBJEXT) compress.$(OBJEXT) \
+       $(am__objects_1) free-packet.$(OBJEXT) getkey.$(OBJEXT) \
+       keydb.$(OBJEXT) keyring.$(OBJEXT) seskey.$(OBJEXT) \
+       kbnode.$(OBJEXT) mainproc.$(OBJEXT) armor.$(OBJEXT) \
+       mdfilter.$(OBJEXT) textfilter.$(OBJEXT) progress.$(OBJEXT) \
+       misc.$(OBJEXT) openfile.$(OBJEXT) keyid.$(OBJEXT) \
+       parse-packet.$(OBJEXT) status.$(OBJEXT) plaintext.$(OBJEXT) \
+       sig-check.$(OBJEXT) keylist.$(OBJEXT) signal.$(OBJEXT)
+@ENABLE_CARD_SUPPORT_TRUE@am__objects_3 = cardglue.$(OBJEXT) \
+@ENABLE_CARD_SUPPORT_TRUE@     tlv.$(OBJEXT)
+@ENABLE_CARD_SUPPORT_TRUE@am__objects_4 = card-util.$(OBJEXT)
+@ENABLE_CARD_SUPPORT_TRUE@am__objects_5 = app-openpgp.$(OBJEXT) \
+@ENABLE_CARD_SUPPORT_TRUE@     iso7816.$(OBJEXT) apdu.$(OBJEXT) \
+@ENABLE_CARD_SUPPORT_TRUE@     ccid-driver.$(OBJEXT)
+am__objects_6 = $(am__objects_3) $(am__objects_4) $(am__objects_5)
+am_gpg_OBJECTS = gpg.$(OBJEXT) $(am__objects_2) $(am__objects_6) \
+       pkclist.$(OBJEXT) skclist.$(OBJEXT) pubkey-enc.$(OBJEXT) \
+       passphrase.$(OBJEXT) seckey-cert.$(OBJEXT) encr-data.$(OBJEXT) \
+       cipher.$(OBJEXT) encode.$(OBJEXT) sign.$(OBJEXT) \
+       verify.$(OBJEXT) revoke.$(OBJEXT) decrypt.$(OBJEXT) \
+       keyedit.$(OBJEXT) dearmor.$(OBJEXT) import.$(OBJEXT) \
+       export.$(OBJEXT) trustdb.$(OBJEXT) tdbdump.$(OBJEXT) \
+       tdbio.$(OBJEXT) delkey.$(OBJEXT) keygen.$(OBJEXT) \
+       pipemode.$(OBJEXT) helptext.$(OBJEXT) keyserver.$(OBJEXT) \
+       photoid.$(OBJEXT) exec.$(OBJEXT)
+gpg_OBJECTS = $(am_gpg_OBJECTS)
+am__DEPENDENCIES_1 = ../cipher/libcipher.a ../mpi/libmpi.a \
+       ../util/libutil.a
+am__DEPENDENCIES_2 =
+am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_2) \
+       $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_2)
+am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+gpg_DEPENDENCIES = $(am__DEPENDENCIES_4)
+am__gpgv_SOURCES_DIST = gpgv.c global.h build-packet.c compress.c \
+       compress-bz2.c filter.h free-packet.c getkey.c keydb.c keydb.h \
+       keyring.c keyring.h seskey.c kbnode.c main.h mainproc.c \
+       armor.c mdfilter.c textfilter.c progress.c misc.c options.h \
+       openfile.c keyid.c packet.h parse-packet.c status.c status.h \
+       plaintext.c sig-check.c keylist.c signal.c verify.c
+am_gpgv_OBJECTS = gpgv.$(OBJEXT) $(am__objects_2) verify.$(OBJEXT)
+gpgv_OBJECTS = $(am_gpgv_OBJECTS)
+gpgv_LDADD = $(LDADD)
+gpgv_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(gpg_SOURCES) $(gpgv_SOURCES)
+DIST_SOURCES = $(am__gpg_SOURCES_DIST) $(am__gpgv_SOURCES_DIST)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/intl \
+       @LIBUSB_CPPFLAGS@ $(am__append_1)
+EXTRA_DIST = options.skel
+needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a
+other_libs = $(LIBICONV) $(DNSLIBS) $(LIBINTL) $(CAPLIBS)
+@ENABLE_BZIP2_SUPPORT_FALSE@bzip2_source = 
+@ENABLE_BZIP2_SUPPORT_TRUE@bzip2_source = compress-bz2.c
+common_source = \
+             global.h          \
+             build-packet.c    \
+             compress.c        \
+             $(bzip2_source)   \
+             filter.h          \
+             free-packet.c     \
+             getkey.c          \
+             keydb.c keydb.h    \
+             keyring.c keyring.h \
+             seskey.c          \
+             kbnode.c          \
+             main.h            \
+             mainproc.c        \
+             armor.c           \
+             mdfilter.c        \
+             textfilter.c      \
+             progress.c        \
+             misc.c            \
+             options.h         \
+             openfile.c        \
+             keyid.c           \
+             packet.h          \
+             parse-packet.c    \
+             status.c          \
+             status.h          \
+             plaintext.c       \
+             sig-check.c       \
+             keylist.c         \
+             signal.c
+
+@ENABLE_CARD_SUPPORT_FALSE@card_support_source_gpg = 
+@ENABLE_CARD_SUPPORT_TRUE@card_support_source_gpg = card-util.c 
+@ENABLE_CARD_SUPPORT_FALSE@card_support_source_scd = 
+@ENABLE_CARD_SUPPORT_TRUE@card_support_source_scd = \
+@ENABLE_CARD_SUPPORT_TRUE@     app-common.h \
+@ENABLE_CARD_SUPPORT_TRUE@     app-openpgp.c \
+@ENABLE_CARD_SUPPORT_TRUE@     iso7816.c iso7816.h \
+@ENABLE_CARD_SUPPORT_TRUE@     apdu.c apdu.h \
+@ENABLE_CARD_SUPPORT_TRUE@     ccid-driver.c ccid-driver.h
+
+@ENABLE_CARD_SUPPORT_FALSE@card_support_source_local = 
+@ENABLE_CARD_SUPPORT_TRUE@card_support_source_local = cardglue.c cardglue.h tlv.c tlv.h
+card_support_source = $(card_support_source_local) $(card_support_source_gpg) $(card_support_source_scd)
+gpg_SOURCES = gpg.c            \
+             $(common_source)  \
+             $(card_support_source) \
+             pkclist.c         \
+             skclist.c         \
+             pubkey-enc.c      \
+             passphrase.c      \
+             seckey-cert.c     \
+             encr-data.c       \
+             cipher.c          \
+             encode.c          \
+             sign.c            \
+             verify.c          \
+             revoke.c          \
+             decrypt.c         \
+             keyedit.c         \
+             dearmor.c         \
+             import.c          \
+             export.c          \
+             trustdb.c         \
+             trustdb.h         \
+             tdbdump.c         \
+             tdbio.c           \
+             tdbio.h           \
+             delkey.c          \
+             keygen.c          \
+             pipemode.c        \
+             helptext.c        \
+             keyserver.c       \
+             keyserver-internal.h \
+             photoid.c photoid.h \
+             exec.c exec.h
+
+gpgv_SOURCES = gpgv.c           \
+             $(common_source)  \
+             verify.c          
+
+LDADD = $(needed_libs) $(other_libs) @ZLIBS@ @W32LIBS@ @LIBREADLINE@
+gpg_LDADD = $(LDADD) @DLLIBS@ @NETLIBS@ @LIBUSB@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  g10/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  g10/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+         if test -f $$p \
+         ; then \
+           f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+          echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+          $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+         rm -f "$(DESTDIR)$(bindir)/$$f"; \
+       done
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+installcheck-binPROGRAMS: $(bin_PROGRAMS)
+       bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \
+         case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+          *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+         esac; \
+         f=`echo "$$p" | \
+            sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         for opt in --help --version; do \
+           if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \
+                2>c$${pid}_.err </dev/null \
+                && test -n "`cat c$${pid}_.out`" \
+                && test -z "`cat c$${pid}_.err`"; then :; \
+           else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+         done; \
+       done; rm -f c$${pid}_.???; exit $$bad
+gpg$(EXEEXT): $(gpg_OBJECTS) $(gpg_DEPENDENCIES) 
+       @rm -f gpg$(EXEEXT)
+       $(LINK) $(gpg_LDFLAGS) $(gpg_OBJECTS) $(gpg_LDADD) $(LIBS)
+gpgv$(EXEEXT): $(gpgv_OBJECTS) $(gpgv_DEPENDENCIES) 
+       @rm -f gpgv$(EXEEXT)
+       $(LINK) $(gpgv_LDFLAGS) $(gpgv_OBJECTS) $(gpgv_LDADD) $(LIBS)
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/apdu.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/app-openpgp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/armor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/build-packet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/card-util.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cardglue.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ccid-driver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cipher.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress-bz2.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dearmor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decrypt.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delkey.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encr-data.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/export.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/free-packet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getkey.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpg.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helptext.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/import.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso7816.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kbnode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keydb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyedit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keygen.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keylist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyring.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyserver.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainproc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdfilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/openfile.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-packet.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/passphrase.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/photoid.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pipemode.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkclist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plaintext.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/progress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubkey-enc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revoke.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/seckey-cert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/seskey.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig-check.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sign.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/skclist.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/status.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdbdump.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tdbio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/textfilter.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trustdb.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am: installcheck-binPROGRAMS
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+       clean-generic ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-binPROGRAMS \
+       install-data install-data-am install-data-local install-exec \
+       install-exec-am install-info install-info-am install-man \
+       install-strip installcheck installcheck-am \
+       installcheck-binPROGRAMS installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-binPROGRAMS uninstall-info-am
+
+
+$(PROGRAMS): $(needed_libs)
+
+install-data-local:
+       $(mkinstalldirs) $(DESTDIR)$(pkgdatadir)
+       $(INSTALL_DATA) $(srcdir)/options.skel \
+                               $(DESTDIR)$(pkgdatadir)/options.skel
+       @set -e;\
+        if test -f $(DESTDIR)$(bindir)/gpgm ; then \
+          echo "removing obsolete gpgm binary" ;   \
+          rm $(DESTDIR)$(bindir)/gpgm ;            \
+        fi
+
+# Helper to update some source files.
+update-source-from-gnupg-2:
+       @set -e; \
+        if test -d ../../gnupg-1.9/scd; then dir="../../gnupg-1.9"; \
+        elif test -d ../../gnupg/scd; then dir="../../gnupg"; \
+        else exit 1; \
+        fi; \
+        for i in $(card_support_source_scd); do \
+           cp $$dir/scd/$$i $$i; echo $$i; \
+        done ;\
+        for i in $(card_support_source_gpg); do \
+           cp $$dir/g10/$$i $$i; echo $$i; \
+        done ; \
+        echo "Please remember to update the ChangeLog accordingly!"
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/g10/apdu.c b/g10/apdu.c
new file mode 100644 (file)
index 0000000..5df9ebf
--- /dev/null
@@ -0,0 +1,3013 @@
+/* apdu.c - ISO 7816 APDU functions and low level I/O
+ *     Copyright (C) 2003, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * $Id: apdu.c 4034 2006-03-05 15:13:18Z wk $
+ */
+
+/* NOTE: This module is also used by other software, thus the use of
+   the macro USE_GNU_PTH is mandatory.  For GnuPG this macro is
+   guaranteed to be defined true. */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <signal.h>
+#ifdef USE_GNU_PTH
+# include <pth.h>
+# include <unistd.h>
+# include <fcntl.h>
+#endif
+
+
+/* If requested include the definitions for the remote APDU protocol
+   code. */
+#ifdef USE_G10CODE_RAPDU
+#include "rapdu.h"
+#endif /*USE_G10CODE_RAPDU*/
+
+#if defined(GNUPG_SCD_MAIN_HEADER)
+#include GNUPG_SCD_MAIN_HEADER
+#elif GNUPG_MAJOR_VERSION == 1
+/* This is used with GnuPG version < 1.9.  The code has been source
+   copied from the current GnuPG >= 1.9  and is maintained over
+   there. */
+#include "options.h"
+#include "errors.h"
+#include "memory.h"
+#include "util.h"
+#include "i18n.h"
+#include "cardglue.h"
+#else /* GNUPG_MAJOR_VERSION != 1 */
+#include "scdaemon.h"
+#endif /* GNUPG_MAJOR_VERSION != 1 */
+
+#include "apdu.h"
+#include "dynload.h"
+#include "ccid-driver.h"
+
+
+/* Due to conflicting use of threading libraries we usually can't link
+   against libpcsclite.   Instead we use a wrapper program.  */
+#ifdef USE_GNU_PTH
+#if !defined(HAVE_W32_SYSTEM) && !defined(__CYGWIN__)
+#define NEED_PCSC_WRAPPER 1
+#endif
+#endif
+
+
+#define MAX_READER 4 /* Number of readers we support concurrently. */
+
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+#define DLSTDCALL __stdcall
+#else
+#define DLSTDCALL
+#endif
+
+#ifdef _POSIX_OPEN_MAX
+#define MAX_OPEN_FDS _POSIX_OPEN_MAX
+#else
+#define MAX_OPEN_FDS 20
+#endif
+
+/* Helper to pass patrameters related to keypad based operations. */
+struct pininfo_s
+{
+  int mode;
+  int minlen;
+  int maxlen;
+  int padlen;
+};
+
+/* A structure to collect information pertaining to one reader
+   slot. */
+struct reader_table_s {
+  int used;            /* True if slot is used. */
+  unsigned short port; /* Port number:  0 = unused, 1 - dev/tty */
+
+  /* Function pointers intialized to the various backends.  */
+  int (*close_reader)(int);
+  int (*shutdown_reader)(int);
+  int (*reset_reader)(int);
+  int (*get_status_reader)(int, unsigned int *);
+  int (*send_apdu_reader)(int,unsigned char *,size_t,
+                          unsigned char *, size_t *, struct pininfo_s *);
+  int (*check_keypad)(int, int, int, int, int, int);
+  void (*dump_status_reader)(int);
+
+  struct {
+    ccid_driver_t handle;
+  } ccid;
+  struct {
+    unsigned long context;
+    unsigned long card;
+    unsigned long protocol;
+#ifdef NEED_PCSC_WRAPPER
+    int req_fd;
+    int rsp_fd;
+    pid_t pid;
+#endif /*NEED_PCSC_WRAPPER*/
+  } pcsc;
+#ifdef USE_G10CODE_RAPDU
+  struct {
+    rapdu_t handle;
+  } rapdu;
+#endif /*USE_G10CODE_RAPDU*/
+  char *rdrname;     /* Name of the connected reader or NULL if unknown. */
+  int last_status;
+  int status;
+  int is_t0;         /* True if we know that we are running T=0. */
+  unsigned char atr[33];
+  size_t atrlen;           /* A zero length indicates that the ATR has
+                              not yet been read; i.e. the card is not
+                              ready for use. */
+  unsigned int change_counter;
+#ifdef USE_GNU_PTH
+  int lock_initialized;
+  pth_mutex_t lock;
+#endif
+};
+typedef struct reader_table_s *reader_table_t;
+
+/* A global table to keep track of active readers. */
+static struct reader_table_s reader_table[MAX_READER];
+
+
+/* ct API function pointer. */
+static char (* DLSTDCALL CT_init) (unsigned short ctn, unsigned short Pn);
+static char (* DLSTDCALL CT_data) (unsigned short ctn, unsigned char *dad,
+                                   unsigned char *sad, unsigned short lc,
+                                   unsigned char *cmd, unsigned short *lr,
+                                   unsigned char *rsp);
+static char (* DLSTDCALL CT_close) (unsigned short ctn);
+
+/* PC/SC constants and function pointer. */
+#define PCSC_SCOPE_USER      0
+#define PCSC_SCOPE_TERMINAL  1
+#define PCSC_SCOPE_SYSTEM    2
+#define PCSC_SCOPE_GLOBAL    3
+
+#define PCSC_PROTOCOL_T0     1
+#define PCSC_PROTOCOL_T1     2
+#define PCSC_PROTOCOL_RAW    4
+
+#define PCSC_SHARE_EXCLUSIVE 1
+#define PCSC_SHARE_SHARED    2
+#define PCSC_SHARE_DIRECT    3
+
+#define PCSC_LEAVE_CARD      0
+#define PCSC_RESET_CARD      1
+#define PCSC_UNPOWER_CARD    2
+#define PCSC_EJECT_CARD      3
+
+#define PCSC_UNKNOWN    0x0001
+#define PCSC_ABSENT     0x0002  /* Card is absent.  */
+#define PCSC_PRESENT    0x0004  /* Card is present.  */
+#define PCSC_SWALLOWED  0x0008  /* Card is present and electrical connected. */
+#define PCSC_POWERED    0x0010  /* Card is powered.  */
+#define PCSC_NEGOTIABLE 0x0020  /* Card is awaiting PTS.  */
+#define PCSC_SPECIFIC   0x0040  /* Card is ready for use.  */
+
+#define PCSC_STATE_UNAWARE     0x0000  /* Want status.  */
+#define PCSC_STATE_IGNORE      0x0001  /* Ignore this reader.  */
+#define PCSC_STATE_CHANGED     0x0002  /* State has changed.  */
+#define PCSC_STATE_UNKNOWN     0x0004  /* Reader unknown.  */
+#define PCSC_STATE_UNAVAILABLE 0x0008  /* Status unavailable.  */
+#define PCSC_STATE_EMPTY       0x0010  /* Card removed.  */
+#define PCSC_STATE_PRESENT     0x0020  /* Card inserted.  */
+#define PCSC_STATE_ATRMATCH    0x0040  /* ATR matches card. */
+#define PCSC_STATE_EXCLUSIVE   0x0080  /* Exclusive Mode.  */
+#define PCSC_STATE_INUSE       0x0100  /* Shared mode.  */
+#define PCSC_STATE_MUTE               0x0200  /* Unresponsive card.  */
+
+/* Some PC/SC error codes.  */
+#define PCSC_E_CANCELLED               0x80100002
+#define PCSC_E_CANT_DISPOSE            0x8010000E
+#define PCSC_E_INSUFFICIENT_BUFFER     0x80100008
+#define PCSC_E_INVALID_ATR             0x80100015
+#define PCSC_E_INVALID_HANDLE          0x80100003
+#define PCSC_E_INVALID_PARAMETER       0x80100004
+#define PCSC_E_INVALID_TARGET          0x80100005
+#define PCSC_E_INVALID_VALUE           0x80100011
+#define PCSC_E_NO_MEMORY               0x80100006
+#define PCSC_E_UNKNOWN_READER          0x80100009
+#define PCSC_E_TIMEOUT                 0x8010000A
+#define PCSC_E_SHARING_VIOLATION       0x8010000B
+#define PCSC_E_NO_SMARTCARD            0x8010000C
+#define PCSC_E_UNKNOWN_CARD            0x8010000D
+#define PCSC_E_PROTO_MISMATCH          0x8010000F
+#define PCSC_E_NOT_READY               0x80100010
+#define PCSC_E_SYSTEM_CANCELLED        0x80100012
+#define PCSC_E_NOT_TRANSACTED          0x80100016
+#define PCSC_E_READER_UNAVAILABLE      0x80100017
+#define PCSC_W_REMOVED_CARD            0x80100069
+
+
+struct pcsc_io_request_s
+{
+  unsigned long protocol;
+  unsigned long pci_len;
+};
+
+typedef struct pcsc_io_request_s *pcsc_io_request_t;
+
+struct pcsc_readerstate_s
+{
+  const char *reader;
+  void *user_data;
+  unsigned long current_state;
+  unsigned long event_state;
+  unsigned long atrlen;
+  unsigned char atr[33];
+};
+
+typedef struct pcsc_readerstate_s *pcsc_readerstate_t;
+
+long (* DLSTDCALL pcsc_establish_context) (unsigned long scope,
+                                           const void *reserved1,
+                                           const void *reserved2,
+                                           unsigned long *r_context);
+long (* DLSTDCALL pcsc_release_context) (unsigned long context);
+long (* DLSTDCALL pcsc_list_readers) (unsigned long context,
+                                      const char *groups,
+                                      char *readers, unsigned long*readerslen);
+long (* DLSTDCALL pcsc_get_status_change) (unsigned long context,
+                                           unsigned long timeout,
+                                           pcsc_readerstate_t readerstates,
+                                           unsigned long nreaderstates);
+long (* DLSTDCALL pcsc_connect) (unsigned long context,
+                                 const char *reader,
+                                 unsigned long share_mode,
+                                 unsigned long preferred_protocols,
+                                 unsigned long *r_card,
+                                 unsigned long *r_active_protocol);
+long (* DLSTDCALL pcsc_reconnect) (unsigned long card,
+                                   unsigned long share_mode,
+                                   unsigned long preferred_protocols,
+                                   unsigned long initialization,
+                                   unsigned long *r_active_protocol);
+long (* DLSTDCALL pcsc_disconnect) (unsigned long card,
+                                    unsigned long disposition);
+long (* DLSTDCALL pcsc_status) (unsigned long card,
+                                char *reader, unsigned long *readerlen,
+                                unsigned long *r_state,
+                                unsigned long *r_protocol,
+                                unsigned char *atr, unsigned long *atrlen);
+long (* DLSTDCALL pcsc_begin_transaction) (unsigned long card);
+long (* DLSTDCALL pcsc_end_transaction) (unsigned long card);
+long (* DLSTDCALL pcsc_transmit) (unsigned long card,
+                                  const pcsc_io_request_t send_pci,
+                                  const unsigned char *send_buffer,
+                                  unsigned long send_len,
+                                  pcsc_io_request_t recv_pci,
+                                  unsigned char *recv_buffer,
+                                  unsigned long *recv_len);
+long (* DLSTDCALL pcsc_set_timeout) (unsigned long context,
+                                     unsigned long timeout);
+
+
+/*  Prototypes.  */
+static int pcsc_get_status (int slot, unsigned int *status);
+
+
+\f
+/*
+      Helper
+ */
+
+
+/* Find an unused reader slot for PORTSTR and put it into the reader
+   table.  Return -1 on error or the index into the reader table. */
+static int
+new_reader_slot (void)
+{
+  int i, reader = -1;
+
+  for (i=0; i < MAX_READER; i++)
+    {
+      if (!reader_table[i].used && reader == -1)
+        reader = i;
+    }
+  if (reader == -1)
+    {
+      log_error ("new_reader_slot: out of slots\n");
+      return -1;
+    }
+#ifdef USE_GNU_PTH
+  if (!reader_table[reader].lock_initialized)
+    {
+      if (!pth_mutex_init (&reader_table[reader].lock))
+        {
+          log_error ("error initializing mutex: %s\n", strerror (errno));
+          return -1;
+        }
+      reader_table[reader].lock_initialized = 1;
+    }
+#endif /*USE_GNU_PTH*/
+  reader_table[reader].close_reader = NULL;
+  reader_table[reader].shutdown_reader = NULL;
+  reader_table[reader].reset_reader = NULL;
+  reader_table[reader].get_status_reader = NULL;
+  reader_table[reader].send_apdu_reader = NULL;
+  reader_table[reader].check_keypad = NULL;
+  reader_table[reader].dump_status_reader = NULL;
+
+  reader_table[reader].used = 1;
+  reader_table[reader].last_status = 0;
+  reader_table[reader].is_t0 = 1;
+#ifdef NEED_PCSC_WRAPPER
+  reader_table[reader].pcsc.req_fd = -1;
+  reader_table[reader].pcsc.rsp_fd = -1;
+  reader_table[reader].pcsc.pid = (pid_t)(-1);
+#endif
+
+  return reader;
+}
+
+
+static void
+dump_reader_status (int slot)
+{
+  if (!opt.verbose)
+    return;
+
+  if (reader_table[slot].dump_status_reader)
+    reader_table[slot].dump_status_reader (slot);
+
+  if (reader_table[slot].status != -1
+      && reader_table[slot].atrlen)
+    {
+      log_info ("slot %d: ATR=", slot);
+      log_printhex ("", reader_table[slot].atr, reader_table[slot].atrlen);
+    }
+}
+
+
+
+static const char *
+host_sw_string (long err)
+{
+  switch (err)
+    {
+    case 0: return "okay";
+    case SW_HOST_OUT_OF_CORE: return "out of core";
+    case SW_HOST_INV_VALUE: return "invalid value";
+    case SW_HOST_NO_DRIVER: return "no driver";
+    case SW_HOST_NOT_SUPPORTED: return "not supported";
+    case SW_HOST_LOCKING_FAILED: return "locking failed";
+    case SW_HOST_BUSY: return "busy";
+    case SW_HOST_NO_CARD: return "no card";
+    case SW_HOST_CARD_INACTIVE: return "card inactive";
+    case SW_HOST_CARD_IO_ERROR: return "card I/O error";
+    case SW_HOST_GENERAL_ERROR: return "general error";
+    case SW_HOST_NO_READER: return "no reader";
+    case SW_HOST_ABORTED: return "aborted";
+    case SW_HOST_NO_KEYPAD: return "no keypad"; 
+    default: return "unknown host status error";
+    }
+}
+
+
+const char *
+apdu_strerror (int rc)
+{
+  switch (rc)
+    {
+    case SW_EOF_REACHED    : return "eof reached";
+    case SW_EEPROM_FAILURE : return "eeprom failure";
+    case SW_WRONG_LENGTH   : return "wrong length";
+    case SW_CHV_WRONG      : return "CHV wrong";
+    case SW_CHV_BLOCKED    : return "CHV blocked";
+    case SW_USE_CONDITIONS : return "use conditions not satisfied";
+    case SW_BAD_PARAMETER  : return "bad parameter";
+    case SW_NOT_SUPPORTED  : return "not supported";
+    case SW_FILE_NOT_FOUND : return "file not found";
+    case SW_RECORD_NOT_FOUND:return "record not found";
+    case SW_REF_NOT_FOUND  : return "reference not found";
+    case SW_BAD_P0_P1      : return "bad P0 or P1";
+    case SW_INS_NOT_SUP    : return "instruction not supported";
+    case SW_CLA_NOT_SUP    : return "class not supported";
+    case SW_SUCCESS        : return "success";
+    default:
+      if ((rc & ~0x00ff) == SW_MORE_DATA)
+        return "more data available";
+      if ( (rc & 0x10000) )
+        return host_sw_string (rc);
+      return "unknown status error";
+    }
+}
+
+
+\f
+/*
+       ct API Interface
+ */
+
+static const char *
+ct_error_string (long err)
+{
+  switch (err)
+    {
+    case 0: return "okay";
+    case -1: return "invalid data";
+    case -8: return "ct error";
+    case -10: return "transmission error";
+    case -11: return "memory allocation error";
+    case -128: return "HTSI error";
+    default: return "unknown CT-API error";
+    }
+}
+
+
+static void
+ct_dump_reader_status (int slot)
+{
+  log_info ("reader slot %d: %s\n", slot,
+            reader_table[slot].status == 1? "Processor ICC present" :
+            reader_table[slot].status == 0? "Memory ICC present" :
+            "ICC not present" );
+}
+
+
+/* Wait for the card in SLOT and activate it.  Return a status word
+   error or 0 on success. */
+static int
+ct_activate_card (int slot)
+{
+  int rc;
+  unsigned char dad[1], sad[1], cmd[11], buf[256];
+  unsigned short buflen;
+
+  /* Check whether card has been inserted. */
+  dad[0] = 1;     /* Destination address: CT. */
+  sad[0] = 2;     /* Source address: Host. */
+
+  cmd[0] = 0x20;  /* Class byte. */
+  cmd[1] = 0x13;  /* Request status. */
+  cmd[2] = 0x00;  /* From kernel. */
+  cmd[3] = 0x80;  /* Return card's DO. */
+  cmd[4] = 0x00;
+
+  buflen = DIM(buf);
+
+  rc = CT_data (slot, dad, sad, 5, cmd, &buflen, buf);
+  if (rc || buflen < 2 || buf[buflen-2] != 0x90)
+    {
+      log_error ("ct_activate_card: can't get status of reader %d: %s\n",
+                 slot, ct_error_string (rc));
+      return SW_HOST_CARD_IO_ERROR;
+    }
+
+  /* Connected, now activate the card. */
+  dad[0] = 1;    /* Destination address: CT. */
+  sad[0] = 2;    /* Source address: Host. */
+
+  cmd[0] = 0x20;  /* Class byte. */
+  cmd[1] = 0x12;  /* Request ICC. */
+  cmd[2] = 0x01;  /* From first interface. */
+  cmd[3] = 0x01;  /* Return card's ATR. */
+  cmd[4] = 0x00;
+
+  buflen = DIM(buf);
+
+  rc = CT_data (slot, dad, sad, 5, cmd, &buflen, buf);
+  if (rc || buflen < 2 || buf[buflen-2] != 0x90)
+    {
+      log_error ("ct_activate_card(%d): activation failed: %s\n",
+                 slot, ct_error_string (rc));
+      if (!rc)
+        log_printhex ("  received data:", buf, buflen);
+      return SW_HOST_CARD_IO_ERROR;
+    }
+
+  /* Store the type and the ATR. */
+  if (buflen - 2 > DIM (reader_table[0].atr))
+    {
+      log_error ("ct_activate_card(%d): ATR too long\n", slot);
+      return SW_HOST_CARD_IO_ERROR;
+    }
+
+  reader_table[slot].status = buf[buflen - 1];
+  memcpy (reader_table[slot].atr, buf, buflen - 2);
+  reader_table[slot].atrlen = buflen - 2;
+  return 0;
+}
+
+
+static int
+close_ct_reader (int slot)
+{
+  CT_close (slot);
+  reader_table[slot].used = 0;
+  return 0;
+}
+
+static int
+reset_ct_reader (int slot)
+{
+  /* FIXME: Check is this is sufficient do do a reset. */
+  return ct_activate_card (slot);
+}
+
+
+static int
+ct_get_status (int slot, unsigned int *status)
+{
+  *status = 1|2|4;  /* FIXME */
+  return 0;
+
+  return SW_HOST_NOT_SUPPORTED;
+}
+
+/* Actually send the APDU of length APDULEN to SLOT and return a
+   maximum of *BUFLEN data in BUFFER, the actual retruned size will be
+   set to BUFLEN.  Returns: CT API error code. */
+static int
+ct_send_apdu (int slot, unsigned char *apdu, size_t apdulen,
+              unsigned char *buffer, size_t *buflen, struct pininfo_s *pininfo)
+{
+  int rc;
+  unsigned char dad[1], sad[1];
+  unsigned short ctbuflen;
+
+  /* If we don't have an ATR, we need to reset the reader first. */
+  if (!reader_table[slot].atrlen
+      && (rc = reset_ct_reader (slot)))
+    return rc;
+
+  dad[0] = 0;     /* Destination address: Card. */
+  sad[0] = 2;     /* Source address: Host. */
+  ctbuflen = *buflen;
+  if (DBG_CARD_IO)
+    log_printhex ("  CT_data:", apdu, apdulen);
+  rc = CT_data (slot, dad, sad, apdulen, apdu, &ctbuflen, buffer);
+  *buflen = ctbuflen;
+
+  return rc? SW_HOST_CARD_IO_ERROR: 0;
+}
+
+
+
+/* Open a reader and return an internal handle for it.  PORT is a
+   non-negative value with the port number of the reader. USB readers
+   do have port numbers starting at 32769. */
+static int
+open_ct_reader (int port)
+{
+  int rc, reader;
+
+  if (port < 0 || port > 0xffff)
+    {
+      log_error ("open_ct_reader: invalid port %d requested\n", port);
+      return -1;
+    }
+  reader = new_reader_slot ();
+  if (reader == -1)
+    return reader;
+  reader_table[reader].port = port;
+
+  rc = CT_init (reader, (unsigned short)port);
+  if (rc)
+    {
+      log_error ("apdu_open_ct_reader failed on port %d: %s\n",
+                 port, ct_error_string (rc));
+      reader_table[reader].used = 0;
+      return -1;
+    }
+
+  /* Only try to activate the card. */
+  rc = ct_activate_card (reader);
+  if (rc)
+    {
+      reader_table[reader].atrlen = 0;
+      rc = 0;
+    }
+
+  reader_table[reader].close_reader = close_ct_reader;
+  reader_table[reader].reset_reader = reset_ct_reader;
+  reader_table[reader].get_status_reader = ct_get_status;
+  reader_table[reader].send_apdu_reader = ct_send_apdu;
+  reader_table[reader].check_keypad = NULL;
+  reader_table[reader].dump_status_reader = ct_dump_reader_status;
+
+  dump_reader_status (reader);
+  return reader;
+}
+
+\f
+/*
+       PC/SC Interface
+ */
+
+#ifdef NEED_PCSC_WRAPPER
+static int
+writen (int fd, const void *buf, size_t nbytes)
+{
+  size_t nleft = nbytes;
+  int nwritten;
+
+/*   log_printhex (" writen:", buf, nbytes); */
+
+  while (nleft > 0)
+    {
+#ifdef USE_GNU_PTH
+      nwritten = pth_write (fd, buf, nleft);
+#else
+      nwritten = write (fd, buf, nleft);
+#endif
+      if (nwritten < 0 && errno == EINTR)
+        continue;
+      if (nwritten < 0)
+        return -1;
+      nleft -= nwritten;
+      buf = (const char*)buf + nwritten;
+    }
+  return 0;
+}
+
+/* Read up to BUFLEN bytes from FD and return the number of bytes
+   actually read in NREAD.  Returns -1 on error or 0 on success. */
+static int
+readn (int fd, void *buf, size_t buflen, size_t *nread)
+{
+  size_t nleft = buflen;
+  int n;
+/*   void *orig_buf = buf; */
+
+  while (nleft > 0)
+    {
+#ifdef USE_GNU_PTH
+      n = pth_read (fd, buf, nleft);
+#else
+      n = read (fd, buf, nleft);
+#endif
+      if (n < 0 && errno == EINTR)
+        continue;
+      if (n < 0)
+        return -1; /* read error. */
+      if (!n)
+        break; /* EOF */
+      nleft -= n;
+      buf = (char*)buf + n;
+    }
+  if (nread)
+    *nread = buflen - nleft;
+
+/*   log_printhex ("  readn:", orig_buf, *nread); */
+
+  return 0;
+}
+#endif /*NEED_PCSC_WRAPPER*/
+
+static const char *
+pcsc_error_string (long err)
+{
+  const char *s;
+
+  if (!err)
+    return "okay";
+  if ((err & 0x80100000) != 0x80100000)
+    return "invalid PC/SC error code";
+  err &= 0xffff;
+  switch (err)
+    {
+    case 0x0002: s = "cancelled"; break;
+    case 0x000e: s = "can't dispose"; break;
+    case 0x0008: s = "insufficient buffer"; break;
+    case 0x0015: s = "invalid ATR"; break;
+    case 0x0003: s = "invalid handle"; break;
+    case 0x0004: s = "invalid parameter"; break;
+    case 0x0005: s = "invalid target"; break;
+    case 0x0011: s = "invalid value"; break;
+    case 0x0006: s = "no memory"; break;
+    case 0x0013: s = "comm error"; break;
+    case 0x0001: s = "internal error"; break;
+    case 0x0014: s = "unknown error"; break;
+    case 0x0007: s = "waited too long"; break;
+    case 0x0009: s = "unknown reader"; break;
+    case 0x000a: s = "timeout"; break;
+    case 0x000b: s = "sharing violation"; break;
+    case 0x000c: s = "no smartcard"; break;
+    case 0x000d: s = "unknown card"; break;
+    case 0x000f: s = "proto mismatch"; break;
+    case 0x0010: s = "not ready"; break;
+    case 0x0012: s = "system cancelled"; break;
+    case 0x0016: s = "not transacted"; break;
+    case 0x0017: s = "reader unavailable"; break;
+    case 0x0065: s = "unsupported card"; break;
+    case 0x0066: s = "unresponsive card"; break;
+    case 0x0067: s = "unpowered card"; break;
+    case 0x0068: s = "reset card"; break;
+    case 0x0069: s = "removed card"; break;
+    case 0x006a: s = "inserted card"; break;
+    case 0x001f: s = "unsupported feature"; break;
+    case 0x0019: s = "PCI too small"; break;
+    case 0x001a: s = "reader unsupported"; break;
+    case 0x001b: s = "duplicate reader"; break;
+    case 0x001c: s = "card unsupported"; break;
+    case 0x001d: s = "no service"; break;
+    case 0x001e: s = "service stopped"; break;
+    default:     s = "unknown PC/SC error code"; break;
+    }
+  return s;
+}
+
+/* Map PC/SC error codes to our special host status words.  */
+static int
+pcsc_error_to_sw (long ec)
+{
+  int rc;
+
+  switch (ec)
+    {
+    case 0:  rc = 0; break;
+
+    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_SHARING_VIOLATION:   rc = SW_HOST_LOCKING_FAILED; break;
+    case PCSC_E_NO_SMARTCARD:        rc = SW_HOST_NO_CARD; break;
+    case PCSC_W_REMOVED_CARD:        rc = SW_HOST_NO_CARD; break;
+
+    case PCSC_E_INVALID_TARGET:
+    case PCSC_E_INVALID_VALUE:
+    case PCSC_E_INVALID_HANDLE: 
+    case PCSC_E_INVALID_PARAMETER:
+    case PCSC_E_INSUFFICIENT_BUFFER: rc = SW_HOST_INV_VALUE; break;
+
+    default:  rc = SW_HOST_GENERAL_ERROR; break;
+    }
+
+  return rc;
+}
+
+static void
+dump_pcsc_reader_status (int slot)
+{
+  log_info ("reader slot %d: active protocol:", slot);
+  if ((reader_table[slot].pcsc.protocol & PCSC_PROTOCOL_T0))
+    log_printf (" T0");
+  else if ((reader_table[slot].pcsc.protocol & PCSC_PROTOCOL_T1))
+    log_printf (" T1");
+  else if ((reader_table[slot].pcsc.protocol & PCSC_PROTOCOL_RAW))
+    log_printf (" raw");
+  log_printf ("\n");
+}
+
+
+/* Send an PC/SC reset command and return a status word on error or 0
+   on success. */
+static int
+reset_pcsc_reader (int slot)
+{
+#ifdef NEED_PCSC_WRAPPER
+  long err;
+  reader_table_t slotp;
+  size_t len;
+  int i, n;
+  unsigned char msgbuf[9];
+  unsigned int dummy_status;
+  int sw = SW_HOST_CARD_IO_ERROR;
+
+  slotp = reader_table + slot;
+
+  if (slotp->pcsc.req_fd == -1
+      || slotp->pcsc.rsp_fd == -1
+      || slotp->pcsc.pid == (pid_t)(-1) )
+    {
+      log_error ("pcsc_get_status: pcsc-wrapper not running\n");
+      return sw;
+    }
+
+  msgbuf[0] = 0x05; /* RESET command. */
+  len = 0;
+  msgbuf[1] = (len >> 24);
+  msgbuf[2] = (len >> 16);
+  msgbuf[3] = (len >>  8);
+  msgbuf[4] = (len      );
+  if ( writen (slotp->pcsc.req_fd, msgbuf, 5) )
+    {
+      log_error ("error sending PC/SC RESET request: %s\n",
+                 strerror (errno));
+      goto command_failed;
+    }
+
+  /* Read the response. */
+  if ((i=readn (slotp->pcsc.rsp_fd, msgbuf, 9, &len)) || len != 9)
+    {
+      log_error ("error receiving PC/SC RESET response: %s\n",
+                 i? strerror (errno) : "premature EOF");
+      goto command_failed;
+    }
+  len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4];
+  if (msgbuf[0] != 0x81 || len < 4)
+    {
+      log_error ("invalid response header from PC/SC received\n");
+      goto command_failed;
+    }
+  len -= 4; /* Already read the error code. */
+  if (len > DIM (slotp->atr))
+    {
+      log_error ("PC/SC returned a too large ATR (len=%lx)\n",
+                 (unsigned long)len);
+      sw = SW_HOST_GENERAL_ERROR;
+      goto command_failed;
+    }
+  err = (msgbuf[5] << 24) | (msgbuf[6] << 16) | (msgbuf[7] << 8 ) | msgbuf[8];
+  if (err)
+    {
+      log_error ("PC/SC RESET failed: %s (0x%lx)\n",
+                 pcsc_error_string (err), err);
+      /* If the error code is no smart card, we should not considere
+         this a major error and close the wrapper.  */
+      sw = pcsc_error_to_sw (err);
+      if (err == PCSC_E_NO_SMARTCARD)
+        return sw;
+      goto command_failed;
+    }
+
+  /* The open function may return a zero for the ATR length to
+     indicate that no card is present.  */
+  n = len;
+  if (n)
+    {
+      if ((i=readn (slotp->pcsc.rsp_fd, slotp->atr, n, &len)) || len != n)
+        {
+          log_error ("error receiving PC/SC RESET response: %s\n",
+                     i? strerror (errno) : "premature EOF");
+          goto command_failed;
+        }
+    }
+  slotp->atrlen = len;
+
+  /* Read the status so that IS_T0 will be set. */
+  pcsc_get_status (slot, &dummy_status);
+
+  return 0;
+
+ command_failed:
+  close (slotp->pcsc.req_fd);
+  close (slotp->pcsc.rsp_fd);
+  slotp->pcsc.req_fd = -1;
+  slotp->pcsc.rsp_fd = -1;
+  kill (slotp->pcsc.pid, SIGTERM);
+  slotp->pcsc.pid = (pid_t)(-1);
+  slotp->used = 0;
+  return sw;
+
+#else /* !NEED_PCSC_WRAPPER */
+  long err;
+  char reader[250];
+  unsigned long nreader, atrlen;
+  unsigned long card_state, card_protocol;
+
+  if (reader_table[slot].pcsc.card)
+    {
+      err = pcsc_disconnect (reader_table[slot].pcsc.card, PCSC_LEAVE_CARD);
+      if (err)
+        {
+          log_error ("pcsc_disconnect failed: %s (0x%lx)\n",
+                     pcsc_error_string (err), err);
+          return SW_HOST_CARD_IO_ERROR;
+        }
+      reader_table[slot].pcsc.card = 0;
+    }
+
+  err = pcsc_connect (reader_table[slot].pcsc.context,
+                      reader_table[slot].rdrname,
+                      PCSC_SHARE_EXCLUSIVE,
+                      PCSC_PROTOCOL_T0|PCSC_PROTOCOL_T1,
+                      &reader_table[slot].pcsc.card,
+                      &reader_table[slot].pcsc.protocol);
+  if (err)
+    {
+      log_error ("pcsc_connect failed: %s (0x%lx)\n",
+                  pcsc_error_string (err), err);
+      reader_table[slot].pcsc.card = 0;
+      return pcsc_error_to_sw (err);
+    }
+
+
+  atrlen = 33;
+  nreader = sizeof reader - 1;
+  err = pcsc_status (reader_table[slot].pcsc.card,
+                     reader, &nreader,
+                     &card_state, &card_protocol,
+                     reader_table[slot].atr, &atrlen);
+  if (err)
+    {
+      log_error ("pcsc_status failed: %s (0x%lx)\n",
+                  pcsc_error_string (err), err);
+      reader_table[slot].atrlen = 0;
+      return pcsc_error_to_sw (err);
+    }
+  if (atrlen >= DIM (reader_table[0].atr))
+    log_bug ("ATR returned by pcsc_status is too large\n");
+  reader_table[slot].atrlen = atrlen;
+  reader_table[slot].is_t0 = !!(card_protocol & PCSC_PROTOCOL_T0);
+
+  return 0;
+#endif /* !NEED_PCSC_WRAPPER */
+}
+
+
+static int
+pcsc_get_status (int slot, unsigned int *status)
+{
+#ifdef NEED_PCSC_WRAPPER
+  long err;
+  reader_table_t slotp;
+  size_t len, full_len;
+  int i, n;
+  unsigned char msgbuf[9];
+  unsigned char buffer[16];
+  int sw = SW_HOST_CARD_IO_ERROR;
+
+  slotp = reader_table + slot;
+
+  if (slotp->pcsc.req_fd == -1
+      || slotp->pcsc.rsp_fd == -1
+      || slotp->pcsc.pid == (pid_t)(-1) )
+    {
+      log_error ("pcsc_get_status: pcsc-wrapper not running\n");
+      return sw;
+    }
+
+  msgbuf[0] = 0x04; /* STATUS command. */
+  len = 0;
+  msgbuf[1] = (len >> 24);
+  msgbuf[2] = (len >> 16);
+  msgbuf[3] = (len >>  8);
+  msgbuf[4] = (len      );
+  if ( writen (slotp->pcsc.req_fd, msgbuf, 5) )
+    {
+      log_error ("error sending PC/SC STATUS request: %s\n",
+                 strerror (errno));
+      goto command_failed;
+    }
+
+  /* Read the response. */
+  if ((i=readn (slotp->pcsc.rsp_fd, msgbuf, 9, &len)) || len != 9)
+    {
+      log_error ("error receiving PC/SC STATUS response: %s\n",
+                 i? strerror (errno) : "premature EOF");
+      goto command_failed;
+    }
+  len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4];
+  if (msgbuf[0] != 0x81 || len < 4)
+    {
+      log_error ("invalid response header from PC/SC received\n");
+      goto command_failed;
+    }
+  len -= 4; /* Already read the error code. */
+  err = (msgbuf[5] << 24) | (msgbuf[6] << 16) | (msgbuf[7] << 8 ) | msgbuf[8];
+  if (err)
+    {
+      log_error ("pcsc_status failed: %s (0x%lx)\n",
+                 pcsc_error_string (err), err);
+      /* This is a proper error code, so return immediately.  */
+      return pcsc_error_to_sw (err);
+    }
+
+  full_len = len;
+
+  /* The current version returns 3 words but we allow also for old
+     versions returning only 2 words. */
+  n = 12 < len ? 12 : len;
+  if ((i=readn (slotp->pcsc.rsp_fd, buffer, n, &len))
+      || (len != 8 && len != 12))
+    {
+      log_error ("error receiving PC/SC STATUS response: %s\n",
+                 i? strerror (errno) : "premature EOF");
+      goto command_failed;
+    }
+
+  slotp->is_t0 = (len == 12 && !!(buffer[11] & PCSC_PROTOCOL_T0));
+
+
+  full_len -= len;
+  /* Newer versions of the wrapper might send more status bytes.
+     Read them. */
+  while (full_len)
+    {
+      unsigned char dummybuf[128];
+
+      n = full_len < DIM (dummybuf) ? full_len : DIM (dummybuf);
+      if ((i=readn (slotp->pcsc.rsp_fd, dummybuf, n, &len)) || len != n)
+        {
+          log_error ("error receiving PC/SC TRANSMIT response: %s\n",
+                     i? strerror (errno) : "premature EOF");
+          goto command_failed;
+        }
+      full_len -= n;
+    }
+
+  /* We are lucky: The wrapper already returns the data in the
+     required format. */
+  *status = buffer[3];
+
+  return 0;
+
+ command_failed:
+  close (slotp->pcsc.req_fd);
+  close (slotp->pcsc.rsp_fd);
+  slotp->pcsc.req_fd = -1;
+  slotp->pcsc.rsp_fd = -1;
+  kill (slotp->pcsc.pid, SIGTERM);
+  slotp->pcsc.pid = (pid_t)(-1);
+  slotp->used = 0;
+  return sw;
+
+#else /*!NEED_PCSC_WRAPPER*/
+
+  long err;
+  struct pcsc_readerstate_s rdrstates[1];
+
+  memset (rdrstates, 0, sizeof *rdrstates);
+  rdrstates[0].reader = reader_table[slot].rdrname;
+  rdrstates[0].current_state = PCSC_STATE_UNAWARE;
+  err = pcsc_get_status_change (reader_table[slot].pcsc.context,
+                                0,
+                                rdrstates, 1);
+  if (err == PCSC_E_TIMEOUT)
+    err = 0; /* Timeout is no error error here. */
+  if (err)
+    {
+      log_error ("pcsc_get_status_change failed: %s (0x%lx)\n",
+                 pcsc_error_string (err), err);
+      return pcsc_error_to_sw (err);
+    }
+
+
+  /*   log_debug  */
+  /*     ("pcsc_get_status_change: %s%s%s%s%s%s%s%s%s%s\n", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_IGNORE)? " ignore":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_CHANGED)? " changed":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_UNKNOWN)? " unknown":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_UNAVAILABLE)?" unavail":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_EMPTY)? " empty":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_PRESENT)? " present":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_ATRMATCH)? " atr":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_EXCLUSIVE)? " excl":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_INUSE)? " unuse":"", */
+  /*      (rdrstates[0].event_state & PCSC_STATE_MUTE)? " mute":"" ); */
+
+  *status = 0;
+  if ( (rdrstates[0].event_state & PCSC_STATE_PRESENT) )
+    *status |= 2;
+  if ( !(rdrstates[0].event_state & PCSC_STATE_MUTE) )
+    *status |= 4;
+  /* We indicate a useful card if it is not in use by another
+     application.  This is because we only use exclusive access
+     mode.  */
+  if ( (*status & 6) == 6
+       && !(rdrstates[0].event_state & PCSC_STATE_INUSE) )
+    *status |= 1;
+
+  return 0;
+#endif /*!NEED_PCSC_WRAPPER*/
+}
+
+
+/* Actually send the APDU of length APDULEN to SLOT and return a
+   maximum of *BUFLEN data in BUFFER, the actual returned size will be
+   set to BUFLEN.  Returns: CT API error code. */
+static int
+pcsc_send_apdu (int slot, unsigned char *apdu, size_t apdulen,
+                unsigned char *buffer, size_t *buflen, 
+                struct pininfo_s *pininfo)
+{
+#ifdef NEED_PCSC_WRAPPER
+  long err;
+  reader_table_t slotp;
+  size_t len, full_len;
+  int i, n;
+  unsigned char msgbuf[9];
+  int sw = SW_HOST_CARD_IO_ERROR;
+
+  if (!reader_table[slot].atrlen
+      && (err = reset_pcsc_reader (slot)))
+    return err;
+
+  if (DBG_CARD_IO)
+    log_printhex ("  PCSC_data:", apdu, apdulen);
+
+  slotp = reader_table + slot;
+
+  if (slotp->pcsc.req_fd == -1
+      || slotp->pcsc.rsp_fd == -1
+      || slotp->pcsc.pid == (pid_t)(-1) )
+    {
+      log_error ("pcsc_send_apdu: pcsc-wrapper not running\n");
+      return sw;
+    }
+
+  msgbuf[0] = 0x03; /* TRANSMIT command. */
+  len = apdulen;
+  msgbuf[1] = (len >> 24);
+  msgbuf[2] = (len >> 16);
+  msgbuf[3] = (len >>  8);
+  msgbuf[4] = (len      );
+  if ( writen (slotp->pcsc.req_fd, msgbuf, 5)
+       || writen (slotp->pcsc.req_fd, apdu, len))
+    {
+      log_error ("error sending PC/SC TRANSMIT request: %s\n",
+                 strerror (errno));
+      goto command_failed;
+    }
+
+  /* Read the response. */
+  if ((i=readn (slotp->pcsc.rsp_fd, msgbuf, 9, &len)) || len != 9)
+    {
+      log_error ("error receiving PC/SC TRANSMIT response: %s\n",
+                 i? strerror (errno) : "premature EOF");
+      goto command_failed;
+    }
+  len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4];
+  if (msgbuf[0] != 0x81 || len < 4)
+    {
+      log_error ("invalid response header from PC/SC received\n");
+      goto command_failed;
+    }
+  len -= 4; /* Already read the error code. */
+  err = (msgbuf[5] << 24) | (msgbuf[6] << 16) | (msgbuf[7] << 8 ) | msgbuf[8];
+  if (err)
+    {
+      log_error ("pcsc_transmit failed: %s (0x%lx)\n",
+                 pcsc_error_string (err), err);
+      return pcsc_error_to_sw (err);
+    }
+
+   full_len = len;
+
+   n = *buflen < len ? *buflen : len;
+   if ((i=readn (slotp->pcsc.rsp_fd, buffer, n, &len)) || len != n)
+     {
+       log_error ("error receiving PC/SC TRANSMIT response: %s\n",
+                  i? strerror (errno) : "premature EOF");
+       goto command_failed;
+     }
+   *buflen = n;
+
+   full_len -= len;
+   if (full_len)
+     {
+       log_error ("pcsc_send_apdu: provided buffer too short - truncated\n");
+       err = SW_HOST_INV_VALUE;
+     }
+   /* We need to read any rest of the response, to keep the
+      protocol runnng. */
+   while (full_len)
+     {
+       unsigned char dummybuf[128];
+
+       n = full_len < DIM (dummybuf) ? full_len : DIM (dummybuf);
+       if ((i=readn (slotp->pcsc.rsp_fd, dummybuf, n, &len)) || len != n)
+         {
+           log_error ("error receiving PC/SC TRANSMIT response: %s\n",
+                      i? strerror (errno) : "premature EOF");
+           goto command_failed;
+         }
+       full_len -= n;
+     }
+
+   return err;
+
+ command_failed:
+  close (slotp->pcsc.req_fd);
+  close (slotp->pcsc.rsp_fd);
+  slotp->pcsc.req_fd = -1;
+  slotp->pcsc.rsp_fd = -1;
+  kill (slotp->pcsc.pid, SIGTERM);
+  slotp->pcsc.pid = (pid_t)(-1);
+  slotp->used = 0;
+  return sw;
+
+#else /*!NEED_PCSC_WRAPPER*/
+
+  long err;
+  struct pcsc_io_request_s send_pci;
+  unsigned long recv_len;
+
+  if (!reader_table[slot].atrlen
+      && (err = reset_pcsc_reader (slot)))
+    return err;
+
+  if (DBG_CARD_IO)
+    log_printhex ("  PCSC_data:", apdu, apdulen);
+
+  if ((reader_table[slot].pcsc.protocol & PCSC_PROTOCOL_T1))
+      send_pci.protocol = PCSC_PROTOCOL_T1;
+  else
+      send_pci.protocol = PCSC_PROTOCOL_T0;
+  send_pci.pci_len = sizeof send_pci;
+  recv_len = *buflen;
+  err = pcsc_transmit (reader_table[slot].pcsc.card,
+                       &send_pci, apdu, apdulen,
+                       NULL, buffer, &recv_len);
+  *buflen = recv_len;
+  if (err)
+    log_error ("pcsc_transmit failed: %s (0x%lx)\n",
+               pcsc_error_string (err), err);
+
+  return pcsc_error_to_sw (err);
+#endif /*!NEED_PCSC_WRAPPER*/
+}
+
+
+static int
+close_pcsc_reader (int slot)
+{
+#ifdef NEED_PCSC_WRAPPER
+  long err;
+  reader_table_t slotp;
+  size_t len;
+  int i;
+  unsigned char msgbuf[9];
+
+  slotp = reader_table + slot;
+
+  if (slotp->pcsc.req_fd == -1
+      || slotp->pcsc.rsp_fd == -1
+      || slotp->pcsc.pid == (pid_t)(-1) )
+    {
+      log_error ("close_pcsc_reader: pcsc-wrapper not running\n");
+      return 0;
+    }
+
+  msgbuf[0] = 0x02; /* CLOSE command. */
+  len = 0;
+  msgbuf[1] = (len >> 24);
+  msgbuf[2] = (len >> 16);
+  msgbuf[3] = (len >>  8);
+  msgbuf[4] = (len      );
+  if ( writen (slotp->pcsc.req_fd, msgbuf, 5) )
+    {
+      log_error ("error sending PC/SC CLOSE request: %s\n",
+                 strerror (errno));
+      goto command_failed;
+    }
+
+  /* Read the response. */
+  if ((i=readn (slotp->pcsc.rsp_fd, msgbuf, 9, &len)) || len != 9)
+    {
+      log_error ("error receiving PC/SC CLOSE response: %s\n",
+                 i? strerror (errno) : "premature EOF");
+      goto command_failed;
+    }
+  len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4];
+  if (msgbuf[0] != 0x81 || len < 4)
+    {
+      log_error ("invalid response header from PC/SC received\n");
+      goto command_failed;
+    }
+  len -= 4; /* Already read the error code. */
+  err = (msgbuf[5] << 24) | (msgbuf[6] << 16) | (msgbuf[7] << 8 ) | msgbuf[8];
+  if (err)
+    log_error ("pcsc_close failed: %s (0x%lx)\n",
+               pcsc_error_string (err), err);
+
+  /* We will close the wrapper in any case - errors are merely
+     informational. */
+
+ command_failed:
+  close (slotp->pcsc.req_fd);
+  close (slotp->pcsc.rsp_fd);
+  slotp->pcsc.req_fd = -1;
+  slotp->pcsc.rsp_fd = -1;
+  kill (slotp->pcsc.pid, SIGTERM);
+  slotp->pcsc.pid = (pid_t)(-1);
+  slotp->used = 0;
+  return 0;
+
+#else /*!NEED_PCSC_WRAPPER*/
+
+  pcsc_release_context (reader_table[slot].pcsc.context);
+  xfree (reader_table[slot].rdrname);
+  reader_table[slot].rdrname = NULL;
+  reader_table[slot].used = 0;
+  return 0;
+#endif /*!NEED_PCSC_WRAPPER*/
+}
+
+/* Note:  It is a pitty that we can't return proper error codes.  */
+static int
+open_pcsc_reader (const char *portstr)
+{
+#ifdef NEED_PCSC_WRAPPER
+/* Open the PC/SC reader using the pcsc_wrapper program.  This is
+   needed to cope with different thread models and other peculiarities
+   of libpcsclite. */
+  int slot;
+  reader_table_t slotp;
+  int fd, rp[2], wp[2];
+  int n, i;
+  pid_t pid;
+  size_t len;
+  unsigned char msgbuf[9];
+  int err;
+  unsigned int dummy_status;
+  int sw = SW_HOST_CARD_IO_ERROR;
+
+  slot = new_reader_slot ();
+  if (slot == -1)
+    return -1;
+  slotp = reader_table + slot;
+
+  /* Fire up the pcsc wrapper.  We don't use any fork/exec code from
+     the common directy but implement it direclty so that this file
+     may still be source copied. */
+
+  if (pipe (rp) == -1)
+    {
+      log_error ("error creating a pipe: %s\n", strerror (errno));
+      slotp->used = 0;
+      return -1;
+    }
+  if (pipe (wp) == -1)
+    {
+      log_error ("error creating a pipe: %s\n", strerror (errno));
+      close (rp[0]);
+      close (rp[1]);
+      slotp->used = 0;
+      return -1;
+    }
+
+  pid = fork ();
+  if (pid == -1)
+    {
+      log_error ("error forking process: %s\n", strerror (errno));
+      close (rp[0]);
+      close (rp[1]);
+      close (wp[0]);
+      close (wp[1]);
+      slotp->used = 0;
+      return -1;
+    }
+  slotp->pcsc.pid = pid;
+
+  if (!pid)
+    { /*
+         === Child ===
+       */
+
+      /* Double fork. */
+      pid = fork ();
+      if (pid == -1)
+        _exit (31);
+      if (pid)
+        _exit (0); /* Immediate exit this parent, so that the child
+                      gets cleaned up by the init process. */
+
+      /* Connect our pipes. */
+      if (wp[0] != 0 && dup2 (wp[0], 0) == -1)
+        log_fatal ("dup2 stdin failed: %s\n", strerror (errno));
+      if (rp[1] != 1 && dup2 (rp[1], 1) == -1)
+        log_fatal ("dup2 stdout failed: %s\n", strerror (errno));
+
+      /* Send stderr to the bit bucket. */
+      fd = open ("/dev/null", O_WRONLY);
+      if (fd == -1)
+        log_fatal ("can't open `/dev/null': %s", strerror (errno));
+      if (fd != 2 && dup2 (fd, 2) == -1)
+        log_fatal ("dup2 stderr failed: %s\n", strerror (errno));
+
+      /* Close all other files. */
+      n = sysconf (_SC_OPEN_MAX);
+      if (n < 0)
+        n = MAX_OPEN_FDS;
+      for (i=3; i < n; i++)
+        close(i);
+      errno = 0;
+
+      execl (GNUPG_LIBDIR "/pcsc-wrapper",
+             "pcsc-wrapper",
+             "--",
+             "1", /* API version */
+             opt.pcsc_driver, /* Name of the PC/SC library. */
+              NULL);
+      _exit (31);
+    }
+
+  /*
+     === Parent ===
+   */
+  close (wp[0]);
+  close (rp[1]);
+  slotp->pcsc.req_fd = wp[1];
+  slotp->pcsc.rsp_fd = rp[0];
+
+  /* Wait for the intermediate child to terminate. */
+#ifdef USE_GNU_PTH
+#define WAIT pth_waitpid
+#else
+#define WAIT waitpid
+#endif
+  while ( (i=WAIT (pid, NULL, 0)) == -1 && errno == EINTR)
+    ;
+#undef X
+
+  /* Now send the open request. */
+  msgbuf[0] = 0x01; /* OPEN command. */
+  len = portstr? strlen (portstr):0;
+  msgbuf[1] = (len >> 24);
+  msgbuf[2] = (len >> 16);
+  msgbuf[3] = (len >>  8);
+  msgbuf[4] = (len      );
+  if ( writen (slotp->pcsc.req_fd, msgbuf, 5)
+       || (portstr && writen (slotp->pcsc.req_fd, portstr, len)))
+    {
+      log_error ("error sending PC/SC OPEN request: %s\n",
+                 strerror (errno));
+      goto command_failed;
+    }
+  /* Read the response. */
+  if ((i=readn (slotp->pcsc.rsp_fd, msgbuf, 9, &len)) || len != 9)
+    {
+      log_error ("error receiving PC/SC OPEN response: %s\n",
+                 i? strerror (errno) : "premature EOF");
+      goto command_failed;
+    }
+  len = (msgbuf[1] << 24) | (msgbuf[2] << 16) | (msgbuf[3] << 8 ) | msgbuf[4];
+  if (msgbuf[0] != 0x81 || len < 4)
+    {
+      log_error ("invalid response header from PC/SC received\n");
+      goto command_failed;
+    }
+  len -= 4; /* Already read the error code. */
+  if (len > DIM (slotp->atr))
+    {
+      log_error ("PC/SC returned a too large ATR (len=%lx)\n",
+                 (unsigned long)len);
+      goto command_failed;
+    }
+  err = (msgbuf[5] << 24) | (msgbuf[6] << 16) | (msgbuf[7] << 8 ) | msgbuf[8];
+  if (err)
+    {
+      log_error ("PC/SC OPEN failed: %s\n", pcsc_error_string (err));
+      sw = pcsc_error_to_sw (err);
+      goto command_failed;
+    }
+
+  slotp->last_status = 0;
+
+  /* The open request may return a zero for the ATR length to
+     indicate that no card is present.  */
+  n = len;
+  if (n)
+    {
+      if ((i=readn (slotp->pcsc.rsp_fd, slotp->atr, n, &len)) || len != n)
+        {
+          log_error ("error receiving PC/SC OPEN response: %s\n",
+                     i? strerror (errno) : "premature EOF");
+          goto command_failed;
+        }
+      /* If we got to here we know that a card is present
+         and usable.  Thus remember this.  */
+      slotp->last_status = (1|2|4| 0x8000);
+    }
+  slotp->atrlen = len;
+
+  reader_table[slot].close_reader = close_pcsc_reader;
+  reader_table[slot].reset_reader = reset_pcsc_reader;
+  reader_table[slot].get_status_reader = pcsc_get_status;
+  reader_table[slot].send_apdu_reader = pcsc_send_apdu;
+  reader_table[slot].check_keypad = NULL;
+  reader_table[slot].dump_status_reader = dump_pcsc_reader_status;
+
+  /* Read the status so that IS_T0 will be set. */
+  pcsc_get_status (slot, &dummy_status);
+
+  dump_reader_status (slot);
+  return slot;
+
+ command_failed:
+  close (slotp->pcsc.req_fd);
+  close (slotp->pcsc.rsp_fd);
+  slotp->pcsc.req_fd = -1;
+  slotp->pcsc.rsp_fd = -1;
+  kill (slotp->pcsc.pid, SIGTERM);
+  slotp->pcsc.pid = (pid_t)(-1);
+  slotp->used = 0;
+  /* There is no way to return SW. */
+  return -1;
+
+#else /*!NEED_PCSC_WRAPPER */
+  long err;
+  int slot;
+  char *list = NULL;
+  unsigned long nreader, listlen, atrlen;
+  char *p;
+  unsigned long card_state, card_protocol;
+
+  slot = new_reader_slot ();
+  if (slot == -1)
+    return -1;
+
+  err = pcsc_establish_context (PCSC_SCOPE_SYSTEM, NULL, NULL,
+                                &reader_table[slot].pcsc.context);
+  if (err)
+    {
+      log_error ("pcsc_establish_context failed: %s (0x%lx)\n",
+                 pcsc_error_string (err), err);
+      reader_table[slot].used = 0;
+      return -1;
+    }
+
+  err = pcsc_list_readers (reader_table[slot].pcsc.context,
+                           NULL, NULL, &nreader);
+  if (!err)
+    {
+      list = xtrymalloc (nreader+1); /* Better add 1 for safety reasons. */
+      if (!list)
+        {
+          log_error ("error allocating memory for reader list\n");
+          pcsc_release_context (reader_table[slot].pcsc.context);
+          reader_table[slot].used = 0;
+          return -1 /*SW_HOST_OUT_OF_CORE*/;
+        }
+      err = pcsc_list_readers (reader_table[slot].pcsc.context,
+                               NULL, list, &nreader);
+    }
+  if (err)
+    {
+      log_error ("pcsc_list_readers failed: %s (0x%lx)\n",
+                 pcsc_error_string (err), err);
+      pcsc_release_context (reader_table[slot].pcsc.context);
+      reader_table[slot].used = 0;
+      xfree (list);
+      return -1 /*pcsc_error_to_sw (err)*/;
+    }
+
+  listlen = nreader;
+  p = list;
+  while (nreader)
+    {
+      if (!*p && !p[1])
+        break;
+      if (*p)
+        log_info ("detected reader `%s'\n", p);
+      if (nreader < (strlen (p)+1))
+        {
+          log_error ("invalid response from pcsc_list_readers\n");
+          break;
+        }
+      nreader -= strlen (p)+1;
+      p += strlen (p) + 1;
+    }
+
+  reader_table[slot].rdrname = xtrymalloc (strlen (portstr? portstr : list)+1);
+  if (!reader_table[slot].rdrname)
+    {
+      log_error ("error allocating memory for reader name\n");
+      pcsc_release_context (reader_table[slot].pcsc.context);
+      reader_table[slot].used = 0;
+      return -1 /*SW_HOST_OUT_OF_CORE*/;
+    }
+  strcpy (reader_table[slot].rdrname, portstr? portstr : list);
+  xfree (list);
+  list = NULL;
+
+  err = pcsc_connect (reader_table[slot].pcsc.context,
+                      reader_table[slot].rdrname,
+                      PCSC_SHARE_EXCLUSIVE,
+                      PCSC_PROTOCOL_T0|PCSC_PROTOCOL_T1,
+                      &reader_table[slot].pcsc.card,
+                      &reader_table[slot].pcsc.protocol);
+  if (err == PCSC_E_NO_SMARTCARD) 
+    reader_table[slot].pcsc.card = 0;
+  else if (err)
+    {
+      log_error ("pcsc_connect failed: %s (0x%lx)\n",
+                  pcsc_error_string (err), err);
+      pcsc_release_context (reader_table[slot].pcsc.context);
+      xfree (reader_table[slot].rdrname);
+      reader_table[slot].rdrname = NULL;
+      reader_table[slot].used = 0;
+      return -1 /*pcsc_error_to_sw (err)*/;
+    }
+
+  reader_table[slot].atrlen = 0;
+  reader_table[slot].last_status = 0;
+  if (!err)
+    {
+      char reader[250];
+      unsigned long readerlen;
+
+      atrlen = 32;
+      readerlen = sizeof reader -1 ;
+      err = pcsc_status (reader_table[slot].pcsc.card,
+                         reader, &readerlen,
+                         &card_state, &card_protocol,
+                         reader_table[slot].atr, &atrlen);
+      if (err)
+        log_error ("pcsc_status failed: %s (0x%lx) %lu\n",
+                   pcsc_error_string (err), err, readerlen);
+      else
+        {
+          if (atrlen >= DIM (reader_table[0].atr))
+            log_bug ("ATR returned by pcsc_status is too large\n");
+          reader_table[slot].atrlen = atrlen;
+          /* If we got to here we know that a card is present
+             and usable.  Thus remember this.  */
+          reader_table[slot].last_status = (1|2|4| 0x8000);
+          reader_table[slot].is_t0 = !!(card_protocol & PCSC_PROTOCOL_T0);
+        }
+    }
+
+  reader_table[slot].close_reader = close_pcsc_reader;
+  reader_table[slot].reset_reader = reset_pcsc_reader;
+  reader_table[slot].get_status_reader = pcsc_get_status;
+  reader_table[slot].send_apdu_reader = pcsc_send_apdu;
+  reader_table[slot].check_keypad = NULL;
+  reader_table[slot].dump_status_reader = dump_pcsc_reader_status;
+
+/*   log_debug ("state    from pcsc_status: 0x%lx\n", card_state); */
+/*   log_debug ("protocol from pcsc_status: 0x%lx\n", card_protocol); */
+
+  dump_reader_status (slot);
+  return slot;
+#endif /*!NEED_PCSC_WRAPPER */
+}
+
+
+
+\f
+#ifdef HAVE_LIBUSB
+/*
+     Internal CCID driver interface.
+ */
+
+
+static void
+dump_ccid_reader_status (int slot)
+{
+  log_info ("reader slot %d: using ccid driver\n", slot);
+}
+
+static int
+close_ccid_reader (int slot)
+{
+  ccid_close_reader (reader_table[slot].ccid.handle);
+  reader_table[slot].used = 0;
+  return 0;
+}
+
+
+static int
+shutdown_ccid_reader (int slot)
+{
+  ccid_shutdown_reader (reader_table[slot].ccid.handle);
+  return 0;
+}
+
+
+static int
+reset_ccid_reader (int slot)
+{
+  int err;
+  reader_table_t slotp = reader_table + slot;
+  unsigned char atr[33];
+  size_t atrlen;
+
+  err = ccid_get_atr (slotp->ccid.handle, atr, sizeof atr, &atrlen);
+  if (err)
+    return err;
+  /* If the reset was successful, update the ATR. */
+  assert (sizeof slotp->atr >= sizeof atr);
+  slotp->atrlen = atrlen;
+  memcpy (slotp->atr, atr, atrlen);
+  dump_reader_status (slot);
+  return 0;
+}
+
+
+static int
+get_status_ccid (int slot, unsigned int *status)
+{
+  int rc;
+  int bits;
+
+  rc = ccid_slot_status (reader_table[slot].ccid.handle, &bits);
+  if (rc)
+    return -1;
+
+  if (bits == 0)
+    *status = 1|2|4;
+  else if (bits == 1)
+    *status = 2;
+  else
+    *status = 0;
+
+  return 0;
+}
+
+
+/* Actually send the APDU of length APDULEN to SLOT and return a
+   maximum of *BUFLEN data in BUFFER, the actual returned size will be
+   set to BUFLEN.  Returns: Internal CCID driver error code. */
+static int
+send_apdu_ccid (int slot, unsigned char *apdu, size_t apdulen,
+                unsigned char *buffer, size_t *buflen,
+                struct pininfo_s *pininfo)
+{
+  long err;
+  size_t maxbuflen;
+
+  /* If we don't have an ATR, we need to reset the reader first. */
+  if (!reader_table[slot].atrlen
+      && (err = reset_ccid_reader (slot)))
+    return err;
+
+  if (DBG_CARD_IO)
+    log_printhex ("  APDU_data:", apdu, apdulen);
+
+  maxbuflen = *buflen;
+  if (pininfo)
+    err = ccid_transceive_secure (reader_table[slot].ccid.handle,
+                                  apdu, apdulen,
+                                  pininfo->mode,
+                                  pininfo->minlen,
+                                  pininfo->maxlen,
+                                  pininfo->padlen,
+                                  buffer, maxbuflen, buflen);
+  else
+    err = ccid_transceive (reader_table[slot].ccid.handle,
+                           apdu, apdulen,
+                           buffer, maxbuflen, buflen);
+  if (err)
+    log_error ("ccid_transceive failed: (0x%lx)\n",
+               err);
+
+  return err;
+}
+
+
+/* Check whether the CCID reader supports the ISO command code COMMAND
+   on the keypad.  Return 0 on success.  For a description of the pin
+   parameters, see ccid-driver.c */
+static int
+check_ccid_keypad (int slot, int command, int pin_mode,
+                   int pinlen_min, int pinlen_max, int pin_padlen)
+{
+  unsigned char apdu[] = { 0, 0, 0, 0x81 };
+
+  apdu[1] = command;
+  return ccid_transceive_secure (reader_table[slot].ccid.handle,
+                                 apdu, sizeof apdu,
+                                 pin_mode, pinlen_min, pinlen_max, pin_padlen,
+                                 NULL, 0, NULL);
+}
+
+
+/* Open the reader and try to read an ATR.  */
+static int
+open_ccid_reader (const char *portstr)
+{
+  int err;
+  int slot;
+  reader_table_t slotp;
+
+  slot = new_reader_slot ();
+  if (slot == -1)
+    return -1;
+  slotp = reader_table + slot;
+
+  err = ccid_open_reader (&slotp->ccid.handle, portstr);
+  if (err)
+    {
+      slotp->used = 0;
+      return -1;
+    }
+
+  err = ccid_get_atr (slotp->ccid.handle,
+                      slotp->atr, sizeof slotp->atr, &slotp->atrlen);
+  if (err)
+    {
+      slotp->atrlen = 0;
+      err = 0;
+    }
+  else
+    {
+      /* If we got to here we know that a card is present
+         and usable.  Thus remember this.  */
+      reader_table[slot].last_status = (1|2|4| 0x8000);
+    }
+
+  reader_table[slot].close_reader = close_ccid_reader;
+  reader_table[slot].shutdown_reader = shutdown_ccid_reader;
+  reader_table[slot].reset_reader = reset_ccid_reader;
+  reader_table[slot].get_status_reader = get_status_ccid;
+  reader_table[slot].send_apdu_reader = send_apdu_ccid;
+  reader_table[slot].check_keypad = check_ccid_keypad;
+  reader_table[slot].dump_status_reader = dump_ccid_reader_status;
+
+  dump_reader_status (slot);
+  return slot;
+}
+
+
+
+#endif /* HAVE_LIBUSB */
+
+
+\f
+#ifdef USE_G10CODE_RAPDU
+/*
+     The Remote APDU Interface.
+
+     This uses the Remote APDU protocol to contact a reader.
+
+     The port number is actually an index into the list of ports as
+     returned via the protocol.
+ */
+
+
+static int
+rapdu_status_to_sw (int status)
+{
+  int rc;
+
+  switch (status)
+    {
+    case RAPDU_STATUS_SUCCESS:  rc = 0; break;
+
+    case RAPDU_STATUS_INVCMD:
+    case RAPDU_STATUS_INVPROT:
+    case RAPDU_STATUS_INVSEQ:
+    case RAPDU_STATUS_INVCOOKIE:
+    case RAPDU_STATUS_INVREADER:  rc = SW_HOST_INV_VALUE;  break;
+
+    case RAPDU_STATUS_TIMEOUT:  rc = SW_HOST_CARD_IO_ERROR; break;
+    case RAPDU_STATUS_CARDIO:   rc = SW_HOST_CARD_IO_ERROR; break;
+    case RAPDU_STATUS_NOCARD:   rc = SW_HOST_NO_CARD; break;
+    case RAPDU_STATUS_CARDCHG:  rc = SW_HOST_NO_CARD; break;
+    case RAPDU_STATUS_BUSY:     rc = SW_HOST_BUSY; break;
+    case RAPDU_STATUS_NEEDRESET: rc = SW_HOST_CARD_INACTIVE; break;
+
+    default: rc = SW_HOST_GENERAL_ERROR; break;
+    }
+
+  return rc;
+}
+
+
+
+static int
+close_rapdu_reader (int slot)
+{
+  rapdu_release (reader_table[slot].rapdu.handle);
+  reader_table[slot].used = 0;
+  return 0;
+}
+
+
+static int
+reset_rapdu_reader (int slot)
+{
+  int err;
+  reader_table_t slotp;
+  rapdu_msg_t msg = NULL;
+
+  slotp = reader_table + slot;
+
+  err = rapdu_send_cmd (slotp->rapdu.handle, RAPDU_CMD_RESET);
+  if (err)
+    {
+      log_error ("sending rapdu command RESET failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      rapdu_msg_release (msg);
+      return rapdu_status_to_sw (err);
+    }
+  err = rapdu_read_msg (slotp->rapdu.handle, &msg);
+  if (err)
+    {
+      log_error ("receiving rapdu message failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      rapdu_msg_release (msg);
+      return rapdu_status_to_sw (err);
+    }
+  if (msg->cmd != RAPDU_STATUS_SUCCESS || !msg->datalen)
+    {
+      int sw = rapdu_status_to_sw (msg->cmd);
+      log_error ("rapdu command RESET failed: %s\n",
+                 rapdu_strerror (msg->cmd));
+      rapdu_msg_release (msg);
+      return sw;
+    }
+  if (msg->datalen >= DIM (slotp->atr))
+    {
+      log_error ("ATR returned by the RAPDU layer is too large\n");
+      rapdu_msg_release (msg);
+      return SW_HOST_INV_VALUE;
+    }
+  slotp->atrlen = msg->datalen;
+  memcpy (slotp->atr, msg->data, msg->datalen);
+
+  rapdu_msg_release (msg);
+  return 0;
+}
+
+
+static int
+my_rapdu_get_status (int slot, unsigned int *status)
+{
+  int err;
+  reader_table_t slotp;
+  rapdu_msg_t msg = NULL;
+  int oldslot;
+
+  slotp = reader_table + slot;
+
+  oldslot = rapdu_set_reader (slotp->rapdu.handle, slot);
+  err = rapdu_send_cmd (slotp->rapdu.handle, RAPDU_CMD_GET_STATUS);
+  rapdu_set_reader (slotp->rapdu.handle, oldslot);
+  if (err)
+    {
+      log_error ("sending rapdu command GET_STATUS failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      return rapdu_status_to_sw (err);
+    }
+  err = rapdu_read_msg (slotp->rapdu.handle, &msg);
+  if (err)
+    {
+      log_error ("receiving rapdu message failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      rapdu_msg_release (msg);
+      return rapdu_status_to_sw (err);
+    }
+  if (msg->cmd != RAPDU_STATUS_SUCCESS || !msg->datalen)
+    {
+      int sw = rapdu_status_to_sw (msg->cmd);
+      log_error ("rapdu command GET_STATUS failed: %s\n",
+                 rapdu_strerror (msg->cmd));
+      rapdu_msg_release (msg);
+      return sw;
+    }
+  *status = msg->data[0];
+
+  rapdu_msg_release (msg);
+  return 0;
+}
+
+
+/* Actually send the APDU of length APDULEN to SLOT and return a
+   maximum of *BUFLEN data in BUFFER, the actual returned size will be
+   set to BUFLEN.  Returns: APDU error code. */
+static int
+my_rapdu_send_apdu (int slot, unsigned char *apdu, size_t apdulen,
+                    unsigned char *buffer, size_t *buflen,
+                    struct pininfo_s *pininfo)
+{
+  int err;
+  reader_table_t slotp;
+  rapdu_msg_t msg = NULL;
+  size_t maxlen = *buflen;
+
+  slotp = reader_table + slot;
+
+  *buflen = 0;
+  if (DBG_CARD_IO)
+    log_printhex ("  APDU_data:", apdu, apdulen);
+
+  if (apdulen < 4)
+    {
+      log_error ("rapdu_send_apdu: APDU is too short\n");
+      return SW_HOST_INV_VALUE;
+    }
+
+  err = rapdu_send_apdu (slotp->rapdu.handle, apdu, apdulen);
+  if (err)
+    {
+      log_error ("sending rapdu command APDU failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      rapdu_msg_release (msg);
+      return rapdu_status_to_sw (err);
+    }
+  err = rapdu_read_msg (slotp->rapdu.handle, &msg);
+  if (err)
+    {
+      log_error ("receiving rapdu message failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      rapdu_msg_release (msg);
+      return rapdu_status_to_sw (err);
+    }
+  if (msg->cmd != RAPDU_STATUS_SUCCESS || !msg->datalen)
+    {
+      int sw = rapdu_status_to_sw (msg->cmd);
+      log_error ("rapdu command APDU failed: %s\n",
+                 rapdu_strerror (msg->cmd));
+      rapdu_msg_release (msg);
+      return sw;
+    }
+
+  if (msg->datalen > maxlen)
+    {
+      log_error ("rapdu response apdu too large\n");
+      rapdu_msg_release (msg);
+      return SW_HOST_INV_VALUE;
+    }
+
+  *buflen = msg->datalen;
+  memcpy (buffer, msg->data, msg->datalen);
+
+  rapdu_msg_release (msg);
+  return 0;
+}
+
+static int
+open_rapdu_reader (int portno,
+                   const unsigned char *cookie, size_t length,
+                   int (*readfnc) (void *opaque,
+                                   void *buffer, size_t size),
+                   void *readfnc_value,
+                   int (*writefnc) (void *opaque,
+                                    const void *buffer, size_t size),
+                   void *writefnc_value,
+                   void (*closefnc) (void *opaque),
+                   void *closefnc_value)
+{
+  int err;
+  int slot;
+  reader_table_t slotp;
+  rapdu_msg_t msg = NULL;
+
+  slot = new_reader_slot ();
+  if (slot == -1)
+    return -1;
+  slotp = reader_table + slot;
+
+  slotp->rapdu.handle = rapdu_new ();
+  if (!slotp->rapdu.handle)
+    {
+      slotp->used = 0;
+      return -1;
+    }
+
+  rapdu_set_reader (slotp->rapdu.handle, portno);
+
+  rapdu_set_iofunc (slotp->rapdu.handle,
+                    readfnc, readfnc_value,
+                    writefnc, writefnc_value,
+                    closefnc, closefnc_value);
+  rapdu_set_cookie (slotp->rapdu.handle, cookie, length);
+
+  /* First try to get the current ATR, but if the card is inactive
+     issue a reset instead.  */
+  err = rapdu_send_cmd (slotp->rapdu.handle, RAPDU_CMD_GET_ATR);
+  if (err == RAPDU_STATUS_NEEDRESET)
+    err = rapdu_send_cmd (slotp->rapdu.handle, RAPDU_CMD_RESET);
+  if (err)
+    {
+      log_info ("sending rapdu command GET_ATR/RESET failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      goto failure;
+    }
+  err = rapdu_read_msg (slotp->rapdu.handle, &msg);
+  if (err)
+    {
+      log_info ("receiving rapdu message failed: %s\n",
+                err < 0 ? strerror (errno): rapdu_strerror (err));
+      goto failure;
+    }
+  if (msg->cmd != RAPDU_STATUS_SUCCESS || !msg->datalen)
+    {
+      log_info ("rapdu command GET ATR failed: %s\n",
+                 rapdu_strerror (msg->cmd));
+      goto failure;
+    }
+  if (msg->datalen >= DIM (slotp->atr))
+    {
+      log_error ("ATR returned by the RAPDU layer is too large\n");
+      goto failure;
+    }
+  slotp->atrlen = msg->datalen;
+  memcpy (slotp->atr, msg->data, msg->datalen);
+
+  reader_table[slot].close_reader = close_rapdu_reader;
+  reader_table[slot].reset_reader = reset_rapdu_reader;
+  reader_table[slot].get_status_reader = my_rapdu_get_status;
+  reader_table[slot].send_apdu_reader = my_rapdu_send_apdu;
+  reader_table[slot].check_keypad = NULL;
+  reader_table[slot].dump_status_reader = NULL;
+
+  dump_reader_status (slot);
+  rapdu_msg_release (msg);
+  return slot;
+
+ failure:
+  rapdu_msg_release (msg);
+  rapdu_release (slotp->rapdu.handle);
+  slotp->used = 0;
+  return -1;
+}
+
+#endif /*USE_G10CODE_RAPDU*/
+
+
+\f
+/*
+       Driver Access
+ */
+
+
+static int
+lock_slot (int slot)
+{
+#ifdef USE_GNU_PTH
+  if (!pth_mutex_acquire (&reader_table[slot].lock, 0, NULL))
+    {
+      log_error ("failed to acquire apdu lock: %s\n", strerror (errno));
+      return SW_HOST_LOCKING_FAILED;
+    }
+#endif /*USE_GNU_PTH*/
+  return 0;
+}
+
+static int
+trylock_slot (int slot)
+{
+#ifdef USE_GNU_PTH
+  if (!pth_mutex_acquire (&reader_table[slot].lock, TRUE, NULL))
+    {
+      if (errno == EBUSY)
+        return SW_HOST_BUSY;
+      log_error ("failed to acquire apdu lock: %s\n", strerror (errno));
+      return SW_HOST_LOCKING_FAILED;
+    }
+#endif /*USE_GNU_PTH*/
+  return 0;
+}
+
+static void
+unlock_slot (int slot)
+{
+#ifdef USE_GNU_PTH
+  if (!pth_mutex_release (&reader_table[slot].lock))
+    log_error ("failed to release apdu lock: %s\n", strerror (errno));
+#endif /*USE_GNU_PTH*/
+}
+
+
+/* Open the reader and return an internal slot number or -1 on
+   error. If PORTSTR is NULL we default to a suitable port (for ctAPI:
+   the first USB reader.  For PC/SC the first listed reader). */
+int
+apdu_open_reader (const char *portstr)
+{
+  static int pcsc_api_loaded, ct_api_loaded;
+
+#ifdef HAVE_LIBUSB
+  if (!opt.disable_ccid)
+    {
+      int slot, i;
+      const char *s;
+
+      slot = open_ccid_reader (portstr);
+      if (slot != -1)
+        return slot; /* got one */
+
+      /* If a CCID reader specification has been given, the user does
+         not want a fallback to other drivers. */
+      if (portstr)
+        for (s=portstr, i=0; *s; s++)
+          if (*s == ':' && (++i == 3))
+            return -1;
+    }
+
+#endif /* HAVE_LIBUSB */
+
+  if (opt.ctapi_driver && *opt.ctapi_driver)
+    {
+      int port = portstr? atoi (portstr) : 32768;
+
+      if (!ct_api_loaded)
+        {
+          void *handle;
+
+          handle = dlopen (opt.ctapi_driver, RTLD_LAZY);
+          if (!handle)
+            {
+              log_error ("apdu_open_reader: failed to open driver: %s\n",
+                         dlerror ());
+              return -1;
+            }
+          CT_init = dlsym (handle, "CT_init");
+          CT_data = dlsym (handle, "CT_data");
+          CT_close = dlsym (handle, "CT_close");
+          if (!CT_init || !CT_data || !CT_close)
+            {
+              log_error ("apdu_open_reader: invalid CT-API driver\n");
+              dlclose (handle);
+              return -1;
+            }
+          ct_api_loaded = 1;
+        }
+      return open_ct_reader (port);
+    }
+
+
+  /* No ctAPI configured, so lets try the PC/SC API */
+  if (!pcsc_api_loaded)
+    {
+#ifndef NEED_PCSC_WRAPPER
+      void *handle;
+
+      handle = dlopen (opt.pcsc_driver, RTLD_LAZY);
+      if (!handle)
+        {
+          log_error ("apdu_open_reader: failed to open driver `%s': %s\n",
+                     opt.pcsc_driver, dlerror ());
+          return -1;
+        }
+
+      pcsc_establish_context = dlsym (handle, "SCardEstablishContext");
+      pcsc_release_context   = dlsym (handle, "SCardReleaseContext");
+      pcsc_list_readers      = dlsym (handle, "SCardListReaders");
+#if defined(_WIN32) || defined(__CYGWIN__)
+      if (!pcsc_list_readers)
+        pcsc_list_readers    = dlsym (handle, "SCardListReadersA");
+#endif
+      pcsc_get_status_change = dlsym (handle, "SCardGetStatusChange");
+#if defined(_WIN32) || defined(__CYGWIN__)
+      if (!pcsc_get_status_change)
+        pcsc_get_status_change = dlsym (handle, "SCardGetStatusChangeA");
+#endif
+      pcsc_connect           = dlsym (handle, "SCardConnect");
+#if defined(_WIN32) || defined(__CYGWIN__)
+      if (!pcsc_connect)
+        pcsc_connect         = dlsym (handle, "SCardConnectA");
+#endif
+      pcsc_reconnect         = dlsym (handle, "SCardReconnect");
+#if defined(_WIN32) || defined(__CYGWIN__)
+      if (!pcsc_reconnect)
+        pcsc_reconnect       = dlsym (handle, "SCardReconnectA");
+#endif
+      pcsc_disconnect        = dlsym (handle, "SCardDisconnect");
+      pcsc_status            = dlsym (handle, "SCardStatus");
+#if defined(_WIN32) || defined(__CYGWIN__)
+      if (!pcsc_status)
+        pcsc_status          = dlsym (handle, "SCardStatusA");
+#endif
+      pcsc_begin_transaction = dlsym (handle, "SCardBeginTransaction");
+      pcsc_end_transaction   = dlsym (handle, "SCardEndTransaction");
+      pcsc_transmit          = dlsym (handle, "SCardTransmit");
+      pcsc_set_timeout       = dlsym (handle, "SCardSetTimeout");
+
+      if (!pcsc_establish_context
+          || !pcsc_release_context
+          || !pcsc_list_readers
+          || !pcsc_get_status_change
+          || !pcsc_connect
+          || !pcsc_reconnect
+          || !pcsc_disconnect
+          || !pcsc_status
+          || !pcsc_begin_transaction
+          || !pcsc_end_transaction
+          || !pcsc_transmit
+          /* || !pcsc_set_timeout */)
+        {
+          /* Note that set_timeout is currently not used and also not
+             available under Windows. */
+          log_error ("apdu_open_reader: invalid PC/SC driver "
+                     "(%d%d%d%d%d%d%d%d%d%d%d%d)\n",
+                     !!pcsc_establish_context,
+                     !!pcsc_release_context,
+                     !!pcsc_list_readers,
+                     !!pcsc_get_status_change,
+                     !!pcsc_connect,
+                     !!pcsc_reconnect,
+                     !!pcsc_disconnect,
+                     !!pcsc_status,
+                     !!pcsc_begin_transaction,
+                     !!pcsc_end_transaction,
+                     !!pcsc_transmit,
+                     !!pcsc_set_timeout );
+          dlclose (handle);
+          return -1;
+        }
+#endif /*!NEED_PCSC_WRAPPER*/
+      pcsc_api_loaded = 1;
+    }
+
+  return open_pcsc_reader (portstr);
+}
+
+
+/* Open an remote reader and return an internal slot number or -1 on
+   error. This function is an alternative to apdu_open_reader and used
+   with remote readers only.  Note that the supplied CLOSEFNC will
+   only be called once and the slot will not be valid afther this.
+
+   If PORTSTR is NULL we default to the first availabe port.
+*/
+int
+apdu_open_remote_reader (const char *portstr,
+                         const unsigned char *cookie, size_t length,
+                         int (*readfnc) (void *opaque,
+                                         void *buffer, size_t size),
+                         void *readfnc_value,
+                         int (*writefnc) (void *opaque,
+                                          const void *buffer, size_t size),
+                         void *writefnc_value,
+                         void (*closefnc) (void *opaque),
+                         void *closefnc_value)
+{
+#ifdef USE_G10CODE_RAPDU
+  return open_rapdu_reader (portstr? atoi (portstr) : 0,
+                            cookie, length,
+                            readfnc, readfnc_value,
+                            writefnc, writefnc_value,
+                            closefnc, closefnc_value);
+#else
+#ifdef _WIN32
+  errno = ENOENT;
+#else
+  errno = ENOSYS;
+#endif
+  return -1;
+#endif
+}
+
+
+int
+apdu_close_reader (int slot)
+{
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+  if (reader_table[slot].close_reader)
+    return reader_table[slot].close_reader (slot);
+  return SW_HOST_NOT_SUPPORTED;
+}
+
+/* Shutdown a reader; that is basically the same as a close but keeps
+   the handle ready for later use. A apdu_reset_header should be used
+   to get it active again. */
+int
+apdu_shutdown_reader (int slot)
+{
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+  if (reader_table[slot].shutdown_reader)
+    return reader_table[slot].shutdown_reader (slot);
+  return SW_HOST_NOT_SUPPORTED;
+}
+
+/* Enumerate all readers and return information on whether this reader
+   is in use.  The caller should start with SLOT set to 0 and
+   increment it with each call until an error is returned. */
+int
+apdu_enum_reader (int slot, int *used)
+{
+  if (slot < 0 || slot >= MAX_READER)
+    return SW_HOST_NO_DRIVER;
+  *used = reader_table[slot].used;
+  return 0;
+}
+
+/* Do a reset for the card in reader at SLOT. */
+int
+apdu_reset (int slot)
+{
+  int sw;
+
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if ((sw = lock_slot (slot)))
+    return sw;
+
+  reader_table[slot].last_status = 0;
+  if (reader_table[slot].reset_reader)
+    sw = reader_table[slot].reset_reader (slot);
+
+  if (!sw)
+    {
+      /* If we got to here we know that a card is present
+         and usable.  Thus remember this.  */
+      reader_table[slot].last_status = (1|2|4| 0x8000);
+    }
+
+  unlock_slot (slot);
+  return sw;
+}
+
+
+/* Activate a card if it has not yet been done.  This is a kind of
+   reset-if-required.  It is useful to test for presence of a card
+   before issuing a bunch of apdu commands.  It does not wait on a
+   locked card. */
+int
+apdu_activate (int slot)
+{
+  int sw;
+  unsigned int s;
+
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if ((sw = trylock_slot (slot)))
+    return sw;
+
+  if (reader_table[slot].get_status_reader)
+    sw = reader_table[slot].get_status_reader (slot, &s);
+
+  if (!sw)
+    {
+      if (!(s & 2))  /* Card not present.  */
+        sw = SW_HOST_NO_CARD;
+      else if ( ((s & 2) && !(s & 4))
+                || !reader_table[slot].atrlen )
+        {
+          /* We don't have an ATR or a card is present though inactive:
+             do a reset now. */
+          if (reader_table[slot].reset_reader)
+            {
+              reader_table[slot].last_status = 0;
+              sw = reader_table[slot].reset_reader (slot);
+              if (!sw)
+                {
+                  /* If we got to here we know that a card is present
+                     and usable.  Thus remember this.  */
+                  reader_table[slot].last_status = (1|2|4| 0x8000);
+                }
+            }
+        }
+    }
+
+  unlock_slot (slot);
+  return sw;
+}
+
+
+
+unsigned char *
+apdu_get_atr (int slot, size_t *atrlen)
+{
+  unsigned char *buf;
+
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return NULL;
+
+  buf = xtrymalloc (reader_table[slot].atrlen);
+  if (!buf)
+    return NULL;
+  memcpy (buf, reader_table[slot].atr, reader_table[slot].atrlen);
+  *atrlen = reader_table[slot].atrlen;
+  return buf;
+}
+
+
+
+/* Retrieve the status for SLOT. The function does only wait for the
+   card to become available if HANG is set to true. On success the
+   bits in STATUS will be set to
+
+     bit 0 = card present and usable
+     bit 1 = card present
+     bit 2 = card active
+     bit 3 = card access locked [not yet implemented]
+
+   For must application, testing bit 0 is sufficient.
+
+   CHANGED will receive the value of the counter tracking the number
+   of card insertions.  This value may be used to detect a card
+   change.
+*/
+int
+apdu_get_status (int slot, int hang,
+                 unsigned int *status, unsigned int *changed)
+{
+  int sw;
+  unsigned int s;
+
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if ((sw = hang? lock_slot (slot) : trylock_slot (slot)))
+    return sw;
+
+  if (reader_table[slot].get_status_reader)
+    sw = reader_table[slot].get_status_reader (slot, &s);
+
+  unlock_slot (slot);
+
+  if (sw)
+    {
+      reader_table[slot].last_status = 0;
+      return sw;
+    }
+
+  /* Keep track of changes.  We use one extra bit to test whether we
+     have checked the status at least once. */
+  if ( s != (reader_table[slot].last_status & 0x07ff)
+       || !reader_table[slot].last_status )
+    {
+      reader_table[slot].change_counter++;
+      /* Make sure that the ATR is invalid so that a reset will be by
+         activate.  */
+      reader_table[slot].atrlen = 0;
+    }
+  reader_table[slot].last_status = (s | 0x8000);
+
+  if (status)
+    *status = s;
+  if (changed)
+    *changed = reader_table[slot].change_counter;
+  return 0;
+}
+
+
+/* Check whether the reader supports the ISO command code COMMAND on
+   the keypad.  Return 0 on success.  For a description of the pin
+   parameters, see ccid-driver.c */
+int
+apdu_check_keypad (int slot, int command, int pin_mode,
+                   int pinlen_min, int pinlen_max, int pin_padlen)
+{
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if (reader_table[slot].check_keypad)
+    return reader_table[slot].check_keypad (slot, command,
+                                            pin_mode, pinlen_min, pinlen_max,
+                                            pin_padlen);
+  else
+    return SW_HOST_NOT_SUPPORTED;
+}
+
+
+/* Dispatcher for the actual send_apdu function. Note, that this
+   function should be called in locked state. */
+static int
+send_apdu (int slot, unsigned char *apdu, size_t apdulen,
+           unsigned char *buffer, size_t *buflen, struct pininfo_s *pininfo)
+{
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if (reader_table[slot].send_apdu_reader)
+    return reader_table[slot].send_apdu_reader (slot,
+                                                apdu, apdulen,
+                                                buffer, buflen, pininfo);
+  else
+    return SW_HOST_NOT_SUPPORTED;
+}
+
+
+/* Core APDU trabceiver function. Parameters are described at
+   apdu_send_le with the exception of PININFO which indicates keypad
+   related operations if not NULL. */
+static int
+send_le (int slot, int class, int ins, int p0, int p1,
+         int lc, const char *data, int le,
+         unsigned char **retbuf, size_t *retbuflen,
+         struct pininfo_s *pininfo)
+{
+#define RESULTLEN 256
+  unsigned char result[RESULTLEN+10]; /* 10 extra in case of bugs in
+                                         the driver. */
+  size_t resultlen;
+  unsigned char apdu[5+256+1];
+  size_t apdulen;
+  int sw;
+  long rc; /* we need a long here due to PC/SC. */
+
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if (DBG_CARD_IO)
+    log_debug ("send apdu: c=%02X i=%02X p0=%02X p1=%02X lc=%d le=%d\n",
+               class, ins, p0, p1, lc, le);
+
+  if (lc != -1 && (lc > 255 || lc < 0))
+    return SW_WRONG_LENGTH;
+  if (le != -1 && (le > 256 || le < 0))
+    return SW_WRONG_LENGTH;
+  if ((!data && lc != -1) || (data && lc == -1))
+    return SW_HOST_INV_VALUE;
+
+  if ((sw = lock_slot (slot)))
+    return sw;
+
+  apdulen = 0;
+  apdu[apdulen++] = class;
+  apdu[apdulen++] = ins;
+  apdu[apdulen++] = p0;
+  apdu[apdulen++] = p1;
+  if (lc != -1)
+    {
+      apdu[apdulen++] = lc;
+      memcpy (apdu+apdulen, data, lc);
+      apdulen += lc;
+      /* T=0 does not allow the use of Lc together with Le; thus
+         disable Le in this case. */
+      if (reader_table[slot].is_t0)
+        le = -1;
+    }
+  if (le != -1)
+    apdu[apdulen++] = le; /* Truncation is okay because 0 means 256. */
+  assert (sizeof (apdu) >= apdulen);
+  /* As safeguard don't pass any garbage from the stack to the driver. */
+  memset (apdu+apdulen, 0, sizeof (apdu) - apdulen);
+  resultlen = RESULTLEN;
+  rc = send_apdu (slot, apdu, apdulen, result, &resultlen, pininfo);
+  if (rc || resultlen < 2)
+    {
+      log_error ("apdu_send_simple(%d) failed: %s\n",
+                 slot, apdu_strerror (rc));
+      unlock_slot (slot);
+      return rc? rc : SW_HOST_INCOMPLETE_CARD_RESPONSE;
+    }
+  sw = (result[resultlen-2] << 8) | result[resultlen-1];
+  /* store away the returned data but strip the statusword. */
+  resultlen -= 2;
+  if (DBG_CARD_IO)
+    {
+      log_debug (" response: sw=%04X  datalen=%d\n",
+                 sw, (unsigned int)resultlen);
+      if ( !retbuf && (sw == SW_SUCCESS || (sw & 0xff00) == SW_MORE_DATA))
+        log_printhex ("     dump: ", result, resultlen);
+    }
+
+  if (sw == SW_SUCCESS || sw == SW_EOF_REACHED)
+    {
+      if (retbuf)
+        {
+          *retbuf = xtrymalloc (resultlen? resultlen : 1);
+          if (!*retbuf)
+            {
+              unlock_slot (slot);
+              return SW_HOST_OUT_OF_CORE;
+            }
+          *retbuflen = resultlen;
+          memcpy (*retbuf, result, resultlen);
+        }
+    }
+  else if ((sw & 0xff00) == SW_MORE_DATA)
+    {
+      unsigned char *p = NULL, *tmp;
+      size_t bufsize = 4096;
+
+      /* It is likely that we need to return much more data, so we
+         start off with a large buffer. */
+      if (retbuf)
+        {
+          *retbuf = p = xtrymalloc (bufsize);
+          if (!*retbuf)
+            {
+              unlock_slot (slot);
+              return SW_HOST_OUT_OF_CORE;
+            }
+          assert (resultlen < bufsize);
+          memcpy (p, result, resultlen);
+          p += resultlen;
+        }
+
+      do
+        {
+          int len = (sw & 0x00ff);
+
+          if (DBG_CARD_IO)
+            log_debug ("apdu_send_simple(%d): %d more bytes available\n",
+                       slot, len);
+          apdulen = 0;
+          apdu[apdulen++] = class;
+          apdu[apdulen++] = 0xC0;
+          apdu[apdulen++] = 0;
+          apdu[apdulen++] = 0;
+          apdu[apdulen++] = len;
+          memset (apdu+apdulen, 0, sizeof (apdu) - apdulen);
+          resultlen = RESULTLEN;
+          rc = send_apdu (slot, apdu, apdulen, result, &resultlen, NULL);
+          if (rc || resultlen < 2)
+            {
+              log_error ("apdu_send_simple(%d) for get response failed: %s\n",
+                         slot, apdu_strerror (rc));
+              unlock_slot (slot);
+              return rc? rc : SW_HOST_INCOMPLETE_CARD_RESPONSE;
+            }
+          sw = (result[resultlen-2] << 8) | result[resultlen-1];
+          resultlen -= 2;
+          if (DBG_CARD_IO)
+            {
+              log_debug ("     more: sw=%04X  datalen=%d\n",
+                         sw, (unsigned int)resultlen);
+              if (!retbuf && (sw==SW_SUCCESS || (sw&0xff00)==SW_MORE_DATA))
+                log_printhex ("     dump: ", result, resultlen);
+            }
+
+          if ((sw & 0xff00) == SW_MORE_DATA
+              || sw == SW_SUCCESS
+              || sw == SW_EOF_REACHED )
+            {
+              if (retbuf && resultlen)
+                {
+                  if (p - *retbuf + resultlen > bufsize)
+                    {
+                      bufsize += resultlen > 4096? resultlen: 4096;
+                      tmp = xtryrealloc (*retbuf, bufsize);
+                      if (!tmp)
+                        {
+                          unlock_slot (slot);
+                          return SW_HOST_OUT_OF_CORE;
+                        }
+                      p = tmp + (p - *retbuf);
+                      *retbuf = tmp;
+                    }
+                  memcpy (p, result, resultlen);
+                  p += resultlen;
+                }
+            }
+          else
+            log_info ("apdu_send_simple(%d) "
+                      "got unexpected status %04X from get response\n",
+                      slot, sw);
+        }
+      while ((sw & 0xff00) == SW_MORE_DATA);
+
+      if (retbuf)
+        {
+          *retbuflen = p - *retbuf;
+          tmp = xtryrealloc (*retbuf, *retbuflen);
+          if (tmp)
+            *retbuf = tmp;
+        }
+    }
+
+  unlock_slot (slot);
+
+  if (DBG_CARD_IO && retbuf && sw == SW_SUCCESS)
+    log_printhex ("      dump: ", *retbuf, *retbuflen);
+
+  return sw;
+#undef RESULTLEN
+}
+
+/* Send an APDU to the card in SLOT.  The APDU is created from all
+   given parameters: CLASS, INS, P0, P1, LC, DATA, LE.  A value of -1
+   for LC won't sent this field and the data field; in this case DATA
+   must also be passed as NULL.  The return value is the status word
+   or -1 for an invalid SLOT or other non card related error.  If
+   RETBUF is not NULL, it will receive an allocated buffer with the
+   returned data.  The length of that data will be put into
+   *RETBUFLEN.  The caller is reponsible for releasing the buffer even
+   in case of errors.  */
+int
+apdu_send_le(int slot, int class, int ins, int p0, int p1,
+             int lc, const char *data, int le,
+             unsigned char **retbuf, size_t *retbuflen)
+{
+  return send_le (slot, class, ins, p0, p1,
+                  lc, data, le,
+                  retbuf, retbuflen,
+                  NULL);
+}
+
+
+/* Send an APDU to the card in SLOT.  The APDU is created from all
+   given parameters: CLASS, INS, P0, P1, LC, DATA.  A value of -1 for
+   LC won't sent this field and the data field; in this case DATA must
+   also be passed as NULL. The return value is the status word or -1
+   for an invalid SLOT or other non card related error.  If RETBUF is
+   not NULL, it will receive an allocated buffer with the returned
+   data.  The length of that data will be put into *RETBUFLEN.  The
+   caller is reponsible for releasing the buffer even in case of
+   errors.  */
+int
+apdu_send (int slot, int class, int ins, int p0, int p1,
+           int lc, const char *data, unsigned char **retbuf, size_t *retbuflen)
+{
+  return send_le (slot, class, ins, p0, p1, lc, data, 256,
+                  retbuf, retbuflen, NULL);
+}
+
+/* Send an APDU to the card in SLOT.  The APDU is created from all
+   given parameters: CLASS, INS, P0, P1, LC, DATA.  A value of -1 for
+   LC won't sent this field and the data field; in this case DATA must
+   also be passed as NULL. The return value is the status word or -1
+   for an invalid SLOT or other non card related error.  No data will be
+   returned. */
+int
+apdu_send_simple (int slot, int class, int ins, int p0, int p1,
+                  int lc, const char *data)
+{
+  return send_le (slot, class, ins, p0, p1, lc, data, -1, NULL, NULL, NULL);
+}
+
+
+/* Same as apdu_send_simple but uses the keypad of the reader. */
+int
+apdu_send_simple_kp (int slot, int class, int ins, int p0, int p1,
+                     int lc, const char *data,  
+                     int pin_mode,
+                     int pinlen_min, int pinlen_max, int pin_padlen)
+{
+  struct pininfo_s pininfo;
+
+  pininfo.mode = pin_mode;
+  pininfo.minlen = pinlen_min;
+  pininfo.maxlen = pinlen_max;
+  pininfo.padlen = pin_padlen;
+  return send_le (slot, class, ins, p0, p1, lc, data, -1,
+                  NULL, NULL, &pininfo);
+}
+
+
+/* This is a more generic version of the apdu sending routine.  It
+   takes an already formatted APDU in APDUDATA or length APDUDATALEN
+   and returns the with the APDU including the status word.  With
+   HANDLE_MORE set to true this function will handle the MORE DATA
+   status and return all APDUs concatenated with one status word at
+   the end.  The function does not return a regular status word but 0
+   on success.  If the slot is locked, the fucntion returns
+   immediately.*/
+int
+apdu_send_direct (int slot, const unsigned char *apdudata, size_t apdudatalen,
+                  int handle_more,
+                  unsigned char **retbuf, size_t *retbuflen)
+{
+#define RESULTLEN 256
+  unsigned char apdu[5+256+1];
+  size_t apdulen;
+  unsigned char result[RESULTLEN+10]; /* 10 extra in case of bugs in
+                                         the driver. */
+  size_t resultlen;
+  int sw;
+  long rc; /* we need a long here due to PC/SC. */
+  int class;
+
+  if (slot < 0 || slot >= MAX_READER || !reader_table[slot].used )
+    return SW_HOST_NO_DRIVER;
+
+  if ((sw = trylock_slot (slot)))
+    return sw;
+
+  /* We simply trunctate a too long APDU.  */
+  if (apdudatalen > sizeof apdu)
+    apdudatalen = sizeof apdu;
+  apdulen = apdudatalen;
+  memcpy (apdu, apdudata, apdudatalen);
+  class = apdulen? *apdu : 0;
+
+  resultlen = RESULTLEN;
+  rc = send_apdu (slot, apdu, apdulen, result, &resultlen, NULL);
+  if (rc || resultlen < 2)
+    {
+      log_error ("apdu_send_direct(%d) failed: %s\n",
+                 slot, apdu_strerror (rc));
+      unlock_slot (slot);
+      return rc? rc : SW_HOST_INCOMPLETE_CARD_RESPONSE;
+    }
+  sw = (result[resultlen-2] << 8) | result[resultlen-1];
+  /* Store away the returned data but strip the statusword. */
+  resultlen -= 2;
+  if (DBG_CARD_IO)
+    {
+      log_debug (" response: sw=%04X  datalen=%d\n",
+                 sw, (unsigned int)resultlen);
+      if ( !retbuf && (sw == SW_SUCCESS || (sw & 0xff00) == SW_MORE_DATA))
+        log_printhex ("     dump: ", result, resultlen);
+    }
+
+  if (handle_more && (sw & 0xff00) == SW_MORE_DATA)
+    {
+      unsigned char *p = NULL, *tmp;
+      size_t bufsize = 4096;
+
+      /* It is likely that we need to return much more data, so we
+         start off with a large buffer. */
+      if (retbuf)
+        {
+          *retbuf = p = xtrymalloc (bufsize + 2);
+          if (!*retbuf)
+            {
+              unlock_slot (slot);
+              return SW_HOST_OUT_OF_CORE;
+            }
+          assert (resultlen < bufsize);
+          memcpy (p, result, resultlen);
+          p += resultlen;
+        }
+
+      do
+        {
+          int len = (sw & 0x00ff);
+
+          if (DBG_CARD_IO)
+            log_debug ("apdu_send_direct(%d): %d more bytes available\n",
+                       slot, len);
+          apdulen = 0;
+          apdu[apdulen++] = class;
+          apdu[apdulen++] = 0xC0;
+          apdu[apdulen++] = 0;
+          apdu[apdulen++] = 0;
+          apdu[apdulen++] = len;
+          memset (apdu+apdulen, 0, sizeof (apdu) - apdulen);
+          resultlen = RESULTLEN;
+          rc = send_apdu (slot, apdu, apdulen, result, &resultlen, NULL);
+          if (rc || resultlen < 2)
+            {
+              log_error ("apdu_send_direct(%d) for get response failed: %s\n",
+                         slot, apdu_strerror (rc));
+              unlock_slot (slot);
+              return rc ? rc : SW_HOST_INCOMPLETE_CARD_RESPONSE;
+            }
+          sw = (result[resultlen-2] << 8) | result[resultlen-1];
+          resultlen -= 2;
+          if (DBG_CARD_IO)
+            {
+              log_debug ("     more: sw=%04X  datalen=%d\n",
+                         sw, (unsigned int)resultlen);
+              if (!retbuf && (sw==SW_SUCCESS || (sw&0xff00)==SW_MORE_DATA))
+                log_printhex ("     dump: ", result, resultlen);
+            }
+
+          if ((sw & 0xff00) == SW_MORE_DATA
+              || sw == SW_SUCCESS
+              || sw == SW_EOF_REACHED )
+            {
+              if (retbuf && resultlen)
+                {
+                  if (p - *retbuf + resultlen > bufsize)
+                    {
+                      bufsize += resultlen > 4096? resultlen: 4096;
+                      tmp = xtryrealloc (*retbuf, bufsize + 2);
+                      if (!tmp)
+                        {
+                          unlock_slot (slot);
+                          return SW_HOST_OUT_OF_CORE;
+                        }
+                      p = tmp + (p - *retbuf);
+                      *retbuf = tmp;
+                    }
+                  memcpy (p, result, resultlen);
+                  p += resultlen;
+                }
+            }
+          else
+            log_info ("apdu_send_sdirect(%d) "
+                      "got unexpected status %04X from get response\n",
+                      slot, sw);
+        }
+      while ((sw & 0xff00) == SW_MORE_DATA);
+
+      if (retbuf)
+        {
+          *retbuflen = p - *retbuf;
+          tmp = xtryrealloc (*retbuf, *retbuflen + 2);
+          if (tmp)
+            *retbuf = tmp;
+        }
+    }
+  else
+    {
+      if (retbuf)
+        {
+          *retbuf = xtrymalloc ((resultlen? resultlen : 1)+2);
+          if (!*retbuf)
+            {
+              unlock_slot (slot);
+              return SW_HOST_OUT_OF_CORE;
+            }
+          *retbuflen = resultlen;
+          memcpy (*retbuf, result, resultlen);
+        }
+    }
+
+  unlock_slot (slot);
+
+  /* Append the status word - we reseved the two extra bytes while
+     allocating the buffer. */
+  if (retbuf)
+    {
+      (*retbuf)[(*retbuflen)++] = (sw >> 8);
+      (*retbuf)[(*retbuflen)++] = sw;
+    }
+
+  if (DBG_CARD_IO && retbuf)
+    log_printhex ("      dump: ", *retbuf, *retbuflen);
+
+  return 0;
+#undef RESULTLEN
+}
diff --git a/g10/apdu.h b/g10/apdu.h
new file mode 100644 (file)
index 0000000..d8e3b36
--- /dev/null
@@ -0,0 +1,123 @@
+/* apdu.h - ISO 7816 APDU functions and low level I/O
+ *     Copyright (C) 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * $Id: apdu.h 3916 2005-10-27 09:14:27Z wk $
+ */
+
+#ifndef APDU_H
+#define APDU_H
+
+/* ISO 7816 values for the statusword are defined here because they
+   should not be visible to the users of the actual ISO command
+   API. */
+enum {
+  SW_MORE_DATA      = 0x6100, /* Note: that the low byte must be
+                                 masked of.*/
+  SW_EOF_REACHED    = 0x6282,
+  SW_EEPROM_FAILURE = 0x6581,
+  SW_WRONG_LENGTH   = 0x6700,
+  SW_CHV_WRONG      = 0x6982,
+  SW_CHV_BLOCKED    = 0x6983,
+  SW_USE_CONDITIONS = 0x6985,
+  SW_BAD_PARAMETER  = 0x6a80, /* (in the data field) */
+  SW_NOT_SUPPORTED  = 0x6a81,
+  SW_FILE_NOT_FOUND = 0x6a82,
+  SW_RECORD_NOT_FOUND = 0x6a83,
+  SW_REF_NOT_FOUND  = 0x6a88,
+  SW_BAD_P0_P1      = 0x6b00,
+  SW_EXACT_LENGTH   = 0x6c00,
+  SW_INS_NOT_SUP    = 0x6d00,
+  SW_CLA_NOT_SUP    = 0x6e00,
+  SW_SUCCESS        = 0x9000,
+
+  /* The follwoing statuswords are no real ones but used to map host
+     OS errors into status words.  A status word is 16 bit so that
+     those values can't be issued by a card. */
+  SW_HOST_OUT_OF_CORE = 0x10001,  /* No way yet to differentiate
+                                     between errnos on a failed malloc. */
+  SW_HOST_INV_VALUE     = 0x10002,
+  SW_HOST_INCOMPLETE_CARD_RESPONSE = 0x10003,
+  SW_HOST_NO_DRIVER     = 0x10004,
+  SW_HOST_NOT_SUPPORTED = 0x10005,
+  SW_HOST_LOCKING_FAILED= 0x10006,
+  SW_HOST_BUSY          = 0x10007,
+  SW_HOST_NO_CARD       = 0x10008,
+  SW_HOST_CARD_INACTIVE = 0x10009,
+  SW_HOST_CARD_IO_ERROR = 0x1000a,
+  SW_HOST_GENERAL_ERROR = 0x1000b,
+  SW_HOST_NO_READER     = 0x1000c,
+  SW_HOST_ABORTED       = 0x1000d,
+  SW_HOST_NO_KEYPAD     = 0x1000e
+};
+
+
+#define SW_EXACT_LENGTH_P(a) (((a)&~0xff) == SW_EXACT_LENGTH)
+
+
+/* Note , that apdu_open_reader returns no status word but -1 on error. */
+int apdu_open_reader (const char *portstr);
+int apdu_open_remote_reader (const char *portstr,
+                             const unsigned char *cookie, size_t length,
+                             int (*readfnc) (void *opaque,
+                                             void *buffer, size_t size),
+                             void *readfnc_value,
+                             int (*writefnc) (void *opaque,
+                                              const void *buffer, size_t size),
+                             void *writefnc_value,
+                             void (*closefnc) (void *opaque),
+                             void *closefnc_value);
+int apdu_shutdown_reader (int slot);
+int apdu_close_reader (int slot);
+int apdu_enum_reader (int slot, int *used);
+unsigned char *apdu_get_atr (int slot, size_t *atrlen);
+
+const char *apdu_strerror (int rc);
+
+
+/* These apdu functions do return status words. */
+
+int apdu_activate (int slot);
+int apdu_reset (int slot);
+int apdu_get_status (int slot, int hang,
+                     unsigned int *status, unsigned int *changed);
+int apdu_check_keypad (int slot, int command, int pin_mode,
+                       int pinlen_min, int pinlen_max, int pin_padlen);
+int apdu_send_simple (int slot, int class, int ins, int p0, int p1,
+                      int lc, const char *data);
+int apdu_send_simple_kp (int slot, int class, int ins, int p0, int p1,
+                         int lc, const char *data,  
+                         int pin_mode,
+                         int pinlen_min, int pinlen_max, int pin_padlen);
+int apdu_send (int slot, int class, int ins, int p0, int p1,
+               int lc, const char *data,
+               unsigned char **retbuf, size_t *retbuflen);
+int apdu_send_le (int slot, int class, int ins, int p0, int p1,
+                  int lc, const char *data, int le,
+                  unsigned char **retbuf, size_t *retbuflen);
+int apdu_send_direct (int slot,
+                      const unsigned char *apdudata, size_t apdudatalen,
+                      int handle_more,
+                      unsigned char **retbuf, size_t *retbuflen);
+
+
+#endif /*APDU_H*/
+
+
+
diff --git a/g10/app-common.h b/g10/app-common.h
new file mode 100644 (file)
index 0000000..d517425
--- /dev/null
@@ -0,0 +1,197 @@
+/* app-common.h - Common declarations for all card applications
+ *     Copyright (C) 2003, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * $Id: app-common.h 3754 2005-05-31 10:11:01Z wk $
+ */
+
+#ifndef GNUPG_SCD_APP_COMMON_H
+#define GNUPG_SCD_APP_COMMON_H
+
+#if GNUPG_MAJOR_VERSION == 1
+# ifdef ENABLE_AGENT_SUPPORT
+# include "assuan.h"
+# endif 
+#else
+# include <ksba.h>
+#endif
+
+
+struct app_local_s;  /* Defined by all app-*.c.  */
+
+struct app_ctx_s {
+  int initialized;  /* The application has been initialied and the
+                       function pointers may be used.  Note that for
+                       unsupported operations the particular
+                       function pointer is set to NULL */
+  int slot;         /* Used reader. */
+
+  /* If this is used by GnuPG 1.4 we need to know the assuan context
+     in case we need to divert the operation to an already running
+     agent.  This if ASSUAN_CTX is not NULL we take this as indication
+     that all operations are diverted to gpg-agent. */
+#if GNUPG_MAJOR_VERSION == 1
+  assuan_context_t assuan_ctx;
+#endif /*GNUPG_MAJOR_VERSION == 1*/
+
+  unsigned char *serialno; /* Serialnumber in raw form, allocated. */
+  size_t serialnolen;      /* Length in octets of serialnumber. */
+  const char *apptype;
+  unsigned int card_version;
+  int did_chv1;
+  int force_chv1;   /* True if the card does not cache CHV1. */
+  int did_chv2;
+  int did_chv3;
+  struct app_local_s *app_local;  /* Local to the application. */
+  struct {
+    void (*deinit) (app_t app);
+    gpg_error_t (*learn_status) (app_t app, ctrl_t ctrl);
+    gpg_error_t (*readcert) (app_t app, const char *certid,
+                     unsigned char **cert, size_t *certlen);
+    gpg_error_t (*readkey) (app_t app, const char *certid,
+                    unsigned char **pk, size_t *pklen);
+    gpg_error_t (*getattr) (app_t app, ctrl_t ctrl, const char *name);
+    gpg_error_t (*setattr) (app_t app, const char *name,
+                    gpg_error_t (*pincb)(void*, const char *, char **),
+                    void *pincb_arg,
+                    const unsigned char *value, size_t valuelen);
+    gpg_error_t (*sign) (app_t app,
+                 const char *keyidstr, int hashalgo,
+                 gpg_error_t (*pincb)(void*, const char *, char **),
+                 void *pincb_arg,
+                 const void *indata, size_t indatalen,
+                 unsigned char **outdata, size_t *outdatalen );
+    gpg_error_t (*auth) (app_t app, const char *keyidstr,
+                 gpg_error_t (*pincb)(void*, const char *, char **),
+                 void *pincb_arg,
+                 const void *indata, size_t indatalen,
+                 unsigned char **outdata, size_t *outdatalen);
+    gpg_error_t (*decipher) (app_t app, const char *keyidstr,
+                     gpg_error_t (*pincb)(void*, const char *, char **),
+                     void *pincb_arg,
+                     const void *indata, size_t indatalen,
+                     unsigned char **outdata, size_t *outdatalen);
+    gpg_error_t (*writekey) (app_t app, ctrl_t ctrl,
+                             const char *certid, unsigned int flags,
+                             gpg_error_t (*pincb)(void*,const char *,char **),
+                             void *pincb_arg,
+                             const unsigned char *pk, size_t pklen);
+    gpg_error_t (*genkey) (app_t app, ctrl_t ctrl,
+                   const char *keynostr, unsigned int flags,
+                   gpg_error_t (*pincb)(void*, const char *, char **),
+                   void *pincb_arg);
+    gpg_error_t (*change_pin) (app_t app, ctrl_t ctrl,
+                       const char *chvnostr, int reset_mode,
+                       gpg_error_t (*pincb)(void*, const char *, char **),
+                       void *pincb_arg);
+    gpg_error_t (*check_pin) (app_t app, const char *keyidstr,
+                      gpg_error_t (*pincb)(void*, const char *, char **),
+                      void *pincb_arg);
+  } fnc;
+
+};
+
+#if GNUPG_MAJOR_VERSION == 1
+gpg_error_t app_select_openpgp (app_t app);
+gpg_error_t app_get_serial_and_stamp (app_t app, char **serial, time_t *stamp);
+gpg_error_t app_openpgp_storekey (app_t app, int keyno,
+                          unsigned char *template, size_t template_len,
+                          time_t created_at,
+                          const unsigned char *m, size_t mlen,
+                          const unsigned char *e, size_t elen,
+                          gpg_error_t (*pincb)(void*, const char *, char **),
+                          void *pincb_arg);
+#else
+/*-- app-help.c --*/
+gpg_error_t app_help_get_keygrip_string (ksba_cert_t cert, char *hexkeygrip);
+size_t app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff);
+
+
+/*-- app.c --*/
+gpg_error_t select_application (ctrl_t ctrl, int slot, const char *name,
+                                app_t *r_app);
+void release_application (app_t app);
+gpg_error_t app_munge_serialno (app_t app);
+gpg_error_t app_get_serial_and_stamp (app_t app, char **serial, time_t *stamp);
+gpg_error_t app_write_learn_status (app_t app, ctrl_t ctrl);
+gpg_error_t app_readcert (app_t app, const char *certid,
+                  unsigned char **cert, size_t *certlen);
+gpg_error_t app_readkey (app_t app, const char *keyid,
+                 unsigned char **pk, size_t *pklen);
+gpg_error_t app_getattr (app_t app, ctrl_t ctrl, const char *name);
+gpg_error_t app_setattr (app_t app, const char *name,
+                 gpg_error_t (*pincb)(void*, const char *, char **),
+                 void *pincb_arg,
+                 const unsigned char *value, size_t valuelen);
+gpg_error_t app_sign (app_t app, const char *keyidstr, int hashalgo,
+              gpg_error_t (*pincb)(void*, const char *, char **),
+              void *pincb_arg,
+              const void *indata, size_t indatalen,
+              unsigned char **outdata, size_t *outdatalen );
+gpg_error_t app_auth (app_t app, const char *keyidstr,
+              gpg_error_t (*pincb)(void*, const char *, char **),
+              void *pincb_arg,
+              const void *indata, size_t indatalen,
+              unsigned char **outdata, size_t *outdatalen);
+gpg_error_t app_decipher (app_t app, const char *keyidstr,
+                  gpg_error_t (*pincb)(void*, const char *, char **),
+                  void *pincb_arg,
+                  const void *indata, size_t indatalen,
+                  unsigned char **outdata, size_t *outdatalen );
+gpg_error_t app_writekey (app_t app, ctrl_t ctrl,
+                          const char *keyidstr, unsigned int flags,
+                          gpg_error_t (*pincb)(void*, const char *, char **),
+                          void *pincb_arg,
+                          const unsigned char *keydata, size_t keydatalen);
+gpg_error_t app_genkey (app_t app, ctrl_t ctrl,
+                const char *keynostr, unsigned int flags,
+                gpg_error_t (*pincb)(void*, const char *, char **),
+                void *pincb_arg);
+gpg_error_t app_get_challenge (app_t app, size_t nbytes,
+                               unsigned char *buffer);
+gpg_error_t app_change_pin (app_t app, ctrl_t ctrl,
+                    const char *chvnostr, int reset_mode,
+                    gpg_error_t (*pincb)(void*, const char *, char **),
+                    void *pincb_arg);
+gpg_error_t app_check_pin (app_t app, const char *keyidstr,
+                   gpg_error_t (*pincb)(void*, const char *, char **),
+                   void *pincb_arg);
+
+
+/*-- app-openpgp.c --*/
+gpg_error_t app_select_openpgp (app_t app);
+
+/*-- app-nks.c --*/
+gpg_error_t app_select_nks (app_t app);
+
+/*-- app-dinsig.c --*/
+gpg_error_t app_select_dinsig (app_t app);
+
+/*-- app-p15.c --*/
+gpg_error_t app_select_p15 (app_t app);
+
+
+#endif
+
+
+
+#endif /*GNUPG_SCD_APP_COMMON_H*/
+
+
+
diff --git a/g10/app-openpgp.c b/g10/app-openpgp.c
new file mode 100644 (file)
index 0000000..1d83963
--- /dev/null
@@ -0,0 +1,2528 @@
+/* app-openpgp.c - The OpenPGP card application.
+ *     Copyright (C) 2003, 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * $Id: app-openpgp.c 4178 2006-06-28 09:37:42Z wk $
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+#if GNUPG_MAJOR_VERSION == 1
+/* This is used with GnuPG version < 1.9.  The code has been source
+   copied from the current GnuPG >= 1.9  and is maintained over
+   there. */
+#include "options.h"
+#include "errors.h"
+#include "memory.h"
+#include "util.h"
+#include "cardglue.h"
+#else /* GNUPG_MAJOR_VERSION != 1 */
+#include "scdaemon.h"
+#endif /* GNUPG_MAJOR_VERSION != 1 */
+
+#include "i18n.h"
+#include "iso7816.h"
+#include "app-common.h"
+#include "tlv.h"
+
+
+static struct {
+  int tag;
+  int constructed;
+  int get_from;  /* Constructed DO with this DO or 0 for direct access. */
+  int binary;
+  int dont_cache;
+  int flush_on_error;
+  int get_immediate_in_v11; /* Enable a hack to bypass the cache of
+                               this data object if it is used in 1.1
+                               and later versions of the card.  This
+                               does not work with composite DO and is
+                               currently only useful for the CHV
+                               status bytes. */
+  char *desc;
+} data_objects[] = {
+  { 0x005E, 0,    0, 1, 0, 0, 0, "Login Data" },
+  { 0x5F50, 0,    0, 0, 0, 0, 0, "URL" },
+  { 0x0065, 1,    0, 1, 0, 0, 0, "Cardholder Related Data"},
+  { 0x005B, 0, 0x65, 0, 0, 0, 0, "Name" },
+  { 0x5F2D, 0, 0x65, 0, 0, 0, 0, "Language preferences" },
+  { 0x5F35, 0, 0x65, 0, 0, 0, 0, "Sex" },
+  { 0x006E, 1,    0, 1, 0, 0, 0, "Application Related Data" },
+  { 0x004F, 0, 0x6E, 1, 0, 0, 0, "AID" },
+  { 0x0073, 1,    0, 1, 0, 0, 0, "Discretionary Data Objects" },
+  { 0x0047, 0, 0x6E, 1, 1, 0, 0, "Card Capabilities" },
+  { 0x00C0, 0, 0x6E, 1, 1, 0, 0, "Extended Card Capabilities" },
+  { 0x00C1, 0, 0x6E, 1, 1, 0, 0, "Algorithm Attributes Signature" },
+  { 0x00C2, 0, 0x6E, 1, 1, 0, 0, "Algorithm Attributes Decryption" },
+  { 0x00C3, 0, 0x6E, 1, 1, 0, 0, "Algorithm Attributes Authentication" },
+  { 0x00C4, 0, 0x6E, 1, 0, 1, 1, "CHV Status Bytes" },
+  { 0x00C5, 0, 0x6E, 1, 0, 0, 0, "Fingerprints" },
+  { 0x00C6, 0, 0x6E, 1, 0, 0, 0, "CA Fingerprints" },
+  { 0x00CD, 0, 0x6E, 1, 0, 0, 0, "Generation time" },
+  { 0x007A, 1,    0, 1, 0, 0, 0, "Security Support Template" },
+  { 0x0093, 0, 0x7A, 1, 1, 0, 0, "Digital Signature Counter" },
+  { 0x0101, 0,    0, 0, 0, 0, 0, "Private DO 1"},
+  { 0x0102, 0,    0, 0, 0, 0, 0, "Private DO 2"},
+  { 0x0103, 0,    0, 0, 0, 0, 0, "Private DO 3"},
+  { 0x0104, 0,    0, 0, 0, 0, 0, "Private DO 4"},
+  { 0 }
+};
+
+
+/* One cache item for DOs.  */
+struct cache_s {
+  struct cache_s *next;
+  int tag;
+  size_t length;
+  unsigned char data[1];
+};
+
+
+/* Object with application (i.e. OpenPGP card) specific data.  */
+struct app_local_s {
+  /* A linked list with cached DOs.  */
+  struct cache_s *cache;
+  
+  /* Keep track of the public keys.  */
+  struct
+  {
+    int read_done;   /* True if we have at least tried to read them.  */
+    unsigned char *key; /* This is a malloced buffer with a canonical
+                           encoded S-expression encoding a public
+                           key. Might be NULL if key is not
+                           available.  */
+    size_t keylen;      /* The length of the above S-expression.  Thsi
+                           is usullay only required for corss checks
+                           because the length of an S-expression is
+                           implicitly available.  */
+  } pk[3];
+
+  /* Keep track of card capabilities.  */
+  struct 
+  {
+    unsigned int get_challenge:1;
+    unsigned int key_import:1;
+    unsigned int change_force_chv:1;
+    unsigned int private_dos:1;
+  } extcap;
+
+  /* Flags used to control the application.  */
+  struct
+  {
+    unsigned int no_sync:1;   /* Do not sync CHV1 and CHV2 */
+    unsigned int def_chv2:1;  /* Use 123456 for CHV2.  */
+  } flags;
+};
+
+
+
+/***** Local prototypes  *****/
+static unsigned long convert_sig_counter_value (const unsigned char *value,
+                                                size_t valuelen);
+static unsigned long get_sig_counter (app_t app);
+
+
+
+
+\f
+/* Deconstructor. */
+static void
+do_deinit (app_t app)
+{
+  if (app && app->app_local)
+    {
+      struct cache_s *c, *c2;
+      int i;
+
+      for (c = app->app_local->cache; c; c = c2)
+        {
+          c2 = c->next;
+          xfree (c);
+        }
+
+      for (i=0; i < DIM (app->app_local->pk); i++)
+        {
+          xfree (app->app_local->pk[i].key);
+          app->app_local->pk[i].read_done = 0;
+        }
+      xfree (app->app_local);
+      app->app_local = NULL;
+    }
+}
+
+
+/* Wrapper around iso7816_get_data which first tries to get the data
+   from the cache.  With GET_IMMEDIATE passed as true, the cache is
+   bypassed. */
+static gpg_error_t
+get_cached_data (app_t app, int tag, 
+                 unsigned char **result, size_t *resultlen,
+                 int get_immediate)
+{
+  gpg_error_t err;
+  int i;
+  unsigned char *p;
+  size_t len;
+  struct cache_s *c;
+
+  *result = NULL;
+  *resultlen = 0;
+
+  if (!get_immediate)
+    {
+      for (c=app->app_local->cache; c; c = c->next)
+        if (c->tag == tag)
+          {
+            if(c->length)
+              {
+                p = xtrymalloc (c->length);
+                if (!p)
+                  return gpg_error (gpg_err_code_from_errno (errno));
+                memcpy (p, c->data, c->length);
+                *result = p;
+              }
+            
+            *resultlen = c->length;
+            
+            return 0;
+          }
+    }
+  
+  err = iso7816_get_data (app->slot, tag, &p, &len);
+  if (err)
+    return err;
+  *result = p;
+  *resultlen = len;
+
+  /* Check whether we should cache this object. */
+  if (get_immediate)
+    return 0;
+
+  for (i=0; data_objects[i].tag; i++)
+    if (data_objects[i].tag == tag)
+      {
+        if (data_objects[i].dont_cache)
+          return 0;
+        break;
+      }
+
+  /* Okay, cache it. */
+  for (c=app->app_local->cache; c; c = c->next)
+    assert (c->tag != tag);
+  
+  c = xtrymalloc (sizeof *c + len);
+  if (c)
+    {
+      memcpy (c->data, p, len);
+      c->length = len;
+      c->tag = tag;
+      c->next = app->app_local->cache;
+      app->app_local->cache = c;
+    }
+
+  return 0;
+}
+
+/* Remove DO at TAG from the cache. */
+static void
+flush_cache_item (app_t app, int tag)
+{
+  struct cache_s *c, *cprev;
+  int i;
+
+  if (!app->app_local)
+    return;
+
+  for (c=app->app_local->cache, cprev=NULL; c ; cprev=c, c = c->next)
+    if (c->tag == tag)
+      {
+        if (cprev)
+          cprev->next = c->next;
+        else
+          app->app_local->cache = c->next;
+        xfree (c);
+
+        for (c=app->app_local->cache; c ; c = c->next)
+          {
+            assert (c->tag != tag); /* Oops: duplicated entry. */
+          }
+        return;
+      }
+
+  /* Try again if we have an outer tag. */
+  for (i=0; data_objects[i].tag; i++)
+    if (data_objects[i].tag == tag && data_objects[i].get_from
+        && data_objects[i].get_from != tag)
+      flush_cache_item (app, data_objects[i].get_from);
+}
+
+/* Flush all entries from the cache which might be out of sync after
+   an error. */
+static void
+flush_cache_after_error (app_t app)
+{
+  int i;
+
+  for (i=0; data_objects[i].tag; i++)
+    if (data_objects[i].flush_on_error)
+      flush_cache_item (app, data_objects[i].tag);
+}
+
+
+/* Flush the entire cache. */
+static void
+flush_cache (app_t app)
+{
+  if (app && app->app_local)
+    {
+      struct cache_s *c, *c2;
+
+      for (c = app->app_local->cache; c; c = c2)
+        {
+          c2 = c->next;
+          xfree (c);
+        }
+      app->app_local->cache = NULL;
+    }
+}
+
+
+/* Get the DO identified by TAG from the card in SLOT and return a
+   buffer with its content in RESULT and NBYTES.  The return value is
+   NULL if not found or a pointer which must be used to release the
+   buffer holding value. */
+static void *
+get_one_do (app_t app, int tag, unsigned char **result, size_t *nbytes,
+            int *r_rc)
+{
+  int rc, i;
+  unsigned char *buffer;
+  size_t buflen;
+  unsigned char *value;
+  size_t valuelen;
+  int dummyrc;
+
+  if (!r_rc)
+    r_rc = &dummyrc;
+
+  *result = NULL;
+  *nbytes = 0;
+  *r_rc = 0;
+  for (i=0; data_objects[i].tag && data_objects[i].tag != tag; i++)
+    ;
+
+  if (app->card_version > 0x0100 && data_objects[i].get_immediate_in_v11)
+    {
+      rc = iso7816_get_data (app->slot, tag, &buffer, &buflen);
+      if (rc)
+        {
+          *r_rc = rc;
+          return NULL;
+        }
+      *result = buffer;
+      *nbytes = buflen;
+      return buffer;
+    }
+
+  value = NULL;
+  rc = -1;
+  if (data_objects[i].tag && data_objects[i].get_from)
+    {
+      rc = get_cached_data (app, data_objects[i].get_from,
+                            &buffer, &buflen,
+                            (data_objects[i].dont_cache 
+                             || data_objects[i].get_immediate_in_v11));
+      if (!rc)
+        {
+          const unsigned char *s;
+
+          s = find_tlv_unchecked (buffer, buflen, tag, &valuelen);
+          if (!s)
+            value = NULL; /* not found */
+          else if (valuelen > buflen - (s - buffer))
+            {
+              log_error ("warning: constructed DO too short\n");
+              value = NULL;
+              xfree (buffer); buffer = NULL;
+            }
+          else
+            value = buffer + (s - buffer);
+        }
+    }
+
+  if (!value) /* Not in a constructed DO, try simple. */
+    {
+      rc = get_cached_data (app, tag, &buffer, &buflen,
+                            (data_objects[i].dont_cache 
+                             || data_objects[i].get_immediate_in_v11));
+      if (!rc)
+        {
+          value = buffer;
+          valuelen = buflen;
+        }
+    }
+
+  if (!rc)
+    {
+      *nbytes = valuelen;
+      *result = value;
+      return buffer;
+    }
+  *r_rc = rc;
+  return NULL;
+}
+
+
+static void
+dump_all_do (int slot)
+{
+  int rc, i, j;
+  unsigned char *buffer;
+  size_t buflen;
+  
+  for (i=0; data_objects[i].tag; i++)
+    {
+      if (data_objects[i].get_from)
+        continue;
+
+      rc = iso7816_get_data (slot, data_objects[i].tag, &buffer, &buflen);
+      if (gpg_err_code (rc) == GPG_ERR_NO_OBJ)
+        ;
+      else if (rc) 
+        log_info ("DO `%s' not available: %s\n",
+                  data_objects[i].desc, gpg_strerror (rc));
+      else
+        {
+          if (data_objects[i].binary)
+            {
+              log_info ("DO `%s': ", data_objects[i].desc);
+              log_printhex ("", buffer, buflen);
+            }
+          else
+            log_info ("DO `%s': `%.*s'\n",
+                      data_objects[i].desc,
+                      (int)buflen, buffer); /* FIXME: sanitize */
+
+          if (data_objects[i].constructed)
+            {
+              for (j=0; data_objects[j].tag; j++)
+                {
+                  const unsigned char *value;
+                  size_t valuelen;
+                  
+                  if (j==i || data_objects[i].tag != data_objects[j].get_from)
+                    continue;
+                  value = find_tlv_unchecked (buffer, buflen,
+                                              data_objects[j].tag, &valuelen);
+                  if (!value)
+                    ; /* not found */
+                  else if (valuelen > buflen - (value - buffer))
+                    log_error ("warning: constructed DO too short\n");
+                  else
+                    {
+                      if (data_objects[j].binary)
+                        {
+                          log_info ("DO `%s': ", data_objects[j].desc);
+                          log_printhex ("", value, valuelen);
+                        }
+                      else
+                        log_info ("DO `%s': `%.*s'\n",
+                                  data_objects[j].desc,
+                                  (int)valuelen, value); /* FIXME: sanitize */
+                    }
+                }
+            }
+        }
+      xfree (buffer); buffer = NULL;
+    }
+}
+
+
+/* Count the number of bits, assuming the A represents an unsigned big
+   integer of length LEN bytes. */
+static unsigned int
+count_bits (const unsigned char *a, size_t len)
+{
+  unsigned int n = len * 8;
+  int i;
+
+  for (; len && !*a; len--, a++, n -=8)
+    ;
+  if (len)
+    {
+      for (i=7; i && !(*a & (1<<i)); i--)
+        n--;
+    }
+  return n;
+}
+
+/* GnuPG makes special use of the login-data DO, this fucntion parses
+   the login data to store the flags for later use.  It may be called
+   at any time and should be called after changing the login-data DO.
+
+   Everything up to a LF is considered a mailbox or account name.  If
+   the first LF is followed by DC4 (0x14) control sequence are
+   expected up to the next LF.  Control sequences are separated by FS
+   (0x28) and consist of key=value pairs.  There is one key defined:
+
+    F=<flags>
+
+    Were FLAGS is a plain hexadecimal number representing flag values.
+    The lsb is here the rightmost bit.  Defined flags bits are:
+
+      Bit 0 = CHV1 and CHV2 are not syncronized
+      Bit 1 = CHV2 has been been set to the default PIN of "123456"
+              (this implies that bit 0 is also set).
+
+*/
+static void
+parse_login_data (app_t app)
+{
+  unsigned char *buffer, *p;
+  size_t buflen, len;
+  void *relptr;
+
+  /* Set defaults.  */
+  app->app_local->flags.no_sync = 0;
+  app->app_local->flags.def_chv2 = 0;
+
+  /* Read the DO.  */
+  relptr = get_one_do (app, 0x005E, &buffer, &buflen, NULL);
+  if (!relptr)
+    return; /* Ooops. */
+  for (; buflen; buflen--, buffer++)
+    if (*buffer == '\n')
+      break;
+  if (buflen < 2 || buffer[1] != '\x14')
+    return; /* No control sequences.  */
+  buflen--;
+  buffer++;
+  do
+    {
+      buflen--;
+      buffer++;
+      if (buflen > 1 && *buffer == 'F' && buffer[1] == '=')
+        {
+          /* Flags control sequence found.  */
+          int lastdig = 0;
+
+          /* For now we are only interested in the last digit, so skip
+             any leading digits but bail out on invalid characters. */
+          for (p=buffer+2, len = buflen-2; len && hexdigitp (p); p++, len--)
+            lastdig = xtoi_1 (p);
+          if (len && !(*p == '\n' || *p == '\x18'))
+            goto next;  /* Invalid characters in field.  */
+          app->app_local->flags.no_sync = !!(lastdig & 1);
+          app->app_local->flags.def_chv2 = (lastdig & 3) == 3;
+        }
+    next:
+      for (; buflen && *buffer != '\x18'; buflen--, buffer++)
+        if (*buffer == '\n')
+          buflen = 1; 
+    }
+  while (buflen);
+
+  xfree (relptr);
+}
+
+/* Note, that FPR must be at least 20 bytes. */
+static gpg_error_t 
+store_fpr (int slot, int keynumber, u32 timestamp,
+           const unsigned char *m, size_t mlen,
+           const unsigned char *e, size_t elen, 
+           unsigned char *fpr, unsigned int card_version)
+{
+  unsigned int n, nbits;
+  unsigned char *buffer, *p;
+  int rc;
+  
+  for (; mlen && !*m; mlen--, m++) /* strip leading zeroes */
+    ;
+  for (; elen && !*e; elen--, e++) /* strip leading zeroes */
+    ;
+
+  n = 6 + 2 + mlen + 2 + elen;
+  p = buffer = xtrymalloc (3 + n);
+  if (!buffer)
+    return gpg_error_from_errno (errno);
+  
+  *p++ = 0x99;     /* ctb */
+  *p++ = n >> 8;   /* 2 byte length header */
+  *p++ = n;
+  *p++ = 4;        /* key packet version */
+  *p++ = timestamp >> 24;
+  *p++ = timestamp >> 16;
+  *p++ = timestamp >>  8;
+  *p++ = timestamp;
+  *p++ = 1; /* RSA */
+  nbits = count_bits (m, mlen);
+  *p++ = nbits >> 8;
+  *p++ = nbits;
+  memcpy (p, m, mlen); p += mlen;
+  nbits = count_bits (e, elen);
+  *p++ = nbits >> 8;
+  *p++ = nbits;
+  memcpy (p, e, elen); p += elen;
+    
+  gcry_md_hash_buffer (GCRY_MD_SHA1, fpr, buffer, n+3);
+
+  xfree (buffer);
+
+  rc = iso7816_put_data (slot, (card_version > 0x0007? 0xC7 : 0xC6)
+                               + keynumber, fpr, 20);
+  if (rc)
+    log_error (_("failed to store the fingerprint: %s\n"),gpg_strerror (rc));
+
+  if (!rc && card_version > 0x0100)
+    {
+      unsigned char buf[4];
+
+      buf[0] = timestamp >> 24;
+      buf[1] = timestamp >> 16;
+      buf[2] = timestamp >>  8;
+      buf[3] = timestamp;
+
+      rc = iso7816_put_data (slot, 0xCE + keynumber, buf, 4);
+      if (rc)
+        log_error (_("failed to store the creation date: %s\n"),
+                   gpg_strerror (rc));
+    }
+
+  return rc;
+}
+
+       
+static void
+send_fpr_if_not_null (ctrl_t ctrl, const char *keyword,
+                      int number, const unsigned char *fpr)
+{                      
+  int i;
+  char buf[41];
+  char numbuf[25];
+
+  for (i=0; i < 20 && !fpr[i]; i++)
+    ;
+  if (i==20)
+    return; /* All zero. */
+  for (i=0; i< 20; i++)
+    sprintf (buf+2*i, "%02X", fpr[i]);
+  if (number == -1)
+    *numbuf = 0; /* Don't print the key number */
+  else
+    sprintf (numbuf, "%d", number);
+  send_status_info (ctrl, keyword,
+                    numbuf, (size_t)strlen(numbuf),
+                    buf, (size_t)strlen (buf), NULL, 0);
+}
+
+static void
+send_fprtime_if_not_null (ctrl_t ctrl, const char *keyword,
+                          int number, const unsigned char *stamp)
+{                      
+  char numbuf1[50], numbuf2[50];
+  unsigned long value;
+
+  value = (stamp[0] << 24) | (stamp[1]<<16) | (stamp[2]<<8) | stamp[3];
+  if (!value)
+    return;
+  sprintf (numbuf1, "%d", number);
+  sprintf (numbuf2, "%lu", value);
+  send_status_info (ctrl, keyword,
+                    numbuf1, (size_t)strlen(numbuf1),
+                    numbuf2, (size_t)strlen(numbuf2), NULL, 0);
+}
+
+static void
+send_key_data (ctrl_t ctrl, const char *name, 
+               const unsigned char *a, size_t alen)
+{
+  char *p, *buf = xmalloc (alen*2+1);
+  
+  for (p=buf; alen; a++, alen--, p += 2)
+    sprintf (p, "%02X", *a);
+
+  send_status_info (ctrl, "KEY-DATA",
+                    name, (size_t)strlen(name), 
+                    buf, (size_t)strlen (buf),
+                    NULL, 0);
+  xfree (buf);
+}
+
+/* Implement the GETATTR command.  This is similar to the LEARN
+   command but returns just one value via the status interface. */
+static gpg_error_t 
+do_getattr (app_t app, ctrl_t ctrl, const char *name)
+{
+  static struct {
+    const char *name;
+    int tag;
+    int special;
+  } table[] = {
+    { "DISP-NAME",    0x005B },
+    { "LOGIN-DATA",   0x005E },
+    { "DISP-LANG",    0x5F2D },
+    { "DISP-SEX",     0x5F35 },
+    { "PUBKEY-URL",   0x5F50 },
+    { "KEY-FPR",      0x00C5, 3 },
+    { "KEY-TIME",     0x00CD, 4 },
+    { "CA-FPR",       0x00C6, 3 },
+    { "CHV-STATUS",   0x00C4, 1 }, 
+    { "SIG-COUNTER",  0x0093, 2 },
+    { "SERIALNO",     0x004F, -1 },
+    { "AID",          0x004F },
+    { "EXTCAP",       0x0000, -2 },
+    { "PRIVATE-DO-1", 0x0101 },
+    { "PRIVATE-DO-2", 0x0102 },
+    { "PRIVATE-DO-3", 0x0103 },
+    { "PRIVATE-DO-4", 0x0104 },
+    { NULL, 0 }
+  };
+  int idx, i, rc;
+  void *relptr;
+  unsigned char *value;
+  size_t valuelen;
+
+  for (idx=0; table[idx].name && strcmp (table[idx].name, name); idx++)
+    ;
+  if (!table[idx].name)
+    return gpg_error (GPG_ERR_INV_NAME); 
+  
+  if (table[idx].special == -1)
+    {
+      /* The serial number is very special.  We could have used the
+         AID DO to retrieve it, but we have it already in the app
+         context and the stamp argument is required anyway which we
+         can't by other means. The AID DO is available anyway but not
+         hex formatted. */
+      char *serial;
+      time_t stamp;
+      char tmp[50];
+
+      if (!app_get_serial_and_stamp (app, &serial, &stamp))
+        {
+          sprintf (tmp, "%lu", (unsigned long)stamp);
+          send_status_info (ctrl, "SERIALNO",
+                            serial, strlen (serial),
+                            tmp, strlen (tmp),
+                            NULL, 0);
+          xfree (serial);
+        }
+      return 0;
+    }
+  if (table[idx].special == -2)
+    {
+      char tmp[50];
+
+      sprintf (tmp, "gc=%d ki=%d fc=%d pd=%d", 
+               app->app_local->extcap.get_challenge,
+               app->app_local->extcap.key_import,
+               app->app_local->extcap.change_force_chv,
+               app->app_local->extcap.private_dos);
+      send_status_info (ctrl, table[idx].name, tmp, strlen (tmp), NULL, 0);
+      return 0;
+    }
+
+  relptr = get_one_do (app, table[idx].tag, &value, &valuelen, &rc);
+  if (relptr)
+    {
+      if (table[idx].special == 1)
+        {
+          char numbuf[7*23];
+          
+          for (i=0,*numbuf=0; i < valuelen && i < 7; i++)
+            sprintf (numbuf+strlen (numbuf), " %d", value[i]); 
+          send_status_info (ctrl, table[idx].name,
+                            numbuf, strlen (numbuf), NULL, 0);
+        }
+      else if (table[idx].special == 2)
+        {
+          char numbuf[50];
+
+          sprintf (numbuf, "%lu", convert_sig_counter_value (value, valuelen));
+          send_status_info (ctrl, table[idx].name,
+                            numbuf, strlen (numbuf), NULL, 0);
+        }
+      else if (table[idx].special == 3)
+        {
+          if (valuelen >= 60)
+            for (i=0; i < 3; i++)
+              send_fpr_if_not_null (ctrl, table[idx].name, i+1, value+i*20);
+        }
+      else if (table[idx].special == 4)
+        {
+          if (valuelen >= 12)
+            for (i=0; i < 3; i++)
+              send_fprtime_if_not_null (ctrl, table[idx].name, i+1, value+i*4);
+        }
+      else
+        send_status_info (ctrl, table[idx].name, value, valuelen, NULL, 0);
+
+      xfree (relptr);
+    }
+  return rc;
+}
+
+/* Retrieve the fingerprint from the card inserted in SLOT and write
+   the according hex representation to FPR.  Caller must have provide
+   a buffer at FPR of least 41 bytes.  Returns 0 on success or an
+   error code. */
+#if GNUPG_MAJOR_VERSION > 1
+static gpg_error_t
+retrieve_fpr_from_card (app_t app, int keyno, char *fpr)
+{
+  gpg_error_t err = 0;
+  void *relptr;
+  unsigned char *value;
+  size_t valuelen;
+  int i;
+
+  assert (keyno >=0 && keyno <= 2);
+
+  relptr = get_one_do (app, 0x00C5, &value, &valuelen, NULL);
+  if (relptr && valuelen >= 60)
+    {
+      for (i = 0; i < 20; i++)
+        sprintf (fpr + (i * 2), "%02X", value[(keyno*20)+i]);
+    }
+  else
+    err = gpg_error (GPG_ERR_NOT_FOUND);
+  xfree (relptr);
+  return err;
+}
+#endif /*GNUPG_MAJOR_VERSION > 1*/
+
+
+/* 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.  */
+#if GNUPG_MAJOR_VERSION > 1
+static gpg_error_t
+retrieve_key_material (FILE *fp, const char *hexkeyid,
+                      const unsigned char **m, size_t *mlen,
+                      const unsigned char **e, size_t *elen)
+{
+  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. */
+  unsigned char *m_new = NULL;
+  unsigned char *e_new = NULL;
+  size_t m_new_n = 0;
+  size_t e_new_n = 0;
+
+  /* Loop over all records until we have found the subkey
+     corresponsing to the fingerprint. Inm 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;
+      int i;
+
+      max_length = 4096;
+      i = read_line (fp, &line, &line_size, &max_length);
+      if (!i)
+        break; /* EOF. */
+      if (i < 0)
+       {
+         err = gpg_error_from_errno (errno);
+         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 && !strcmp (fields[4], hexkeyid))
+            found_key = 1;
+          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.  */
+      i = 0; /* Avoid erroneous compiler warning. */
+      if ( nfields < 4 || (i = atoi (fields[1])) < 0 || i > 1
+           || (!i && m_new) || (i && e_new))
+        {
+          err = gpg_error (GPG_ERR_GENERAL);
+          goto leave; /* Error: Invalid key data record or not an RSA key.  */
+        }
+      
+      err = gcry_mpi_scan (&mpi, GCRYMPI_FMT_HEX, fields[3], 0, NULL);
+      if (err)
+        mpi = NULL;
+      else if (!i)
+        err = gcry_mpi_aprint (GCRYMPI_FMT_STD, &m_new, &m_new_n, mpi);
+      else
+        err = gcry_mpi_aprint (GCRYMPI_FMT_STD, &e_new, &e_new_n, mpi);
+      gcry_mpi_release (mpi);
+      if (err)
+        goto leave;
+    }
+  
+  if (m_new && e_new)
+    {
+      *m = m_new;
+      *mlen = m_new_n;
+      m_new = NULL;
+      *e = e_new;
+      *elen = e_new_n;
+      e_new = NULL;
+    }
+  else
+    err = gpg_error (GPG_ERR_GENERAL);
+
+ leave:
+  xfree (m_new);
+  xfree (e_new);
+  xfree (line);
+  return err;
+}
+#endif /*GNUPG_MAJOR_VERSION > 1*/
+
+
+/* Get the public key for KEYNO and store it as an S-expresion with
+   the APP handle.  On error that field gets cleared.  If we already
+   know about the public key we will just return.  Note that this does
+   not mean a key is available; this is soley indicated by the
+   presence of the app->app_local->pk[KEYNO-1].key field.
+
+   Note that GnuPG 1.x does not need this and it would be too time
+   consuming to send it just for the fun of it. However, given that we
+   use the same code in gpg 1.4, we can't use the gcry S-expresion
+   here but need to open encode it. */
+#if GNUPG_MAJOR_VERSION > 1
+static gpg_error_t
+get_public_key (app_t app, int keyno)
+{
+  gpg_error_t err = 0;
+  unsigned char *buffer;
+  const unsigned char *keydata, *m, *e;
+  size_t buflen, keydatalen, mlen, elen;
+  unsigned char *mbuf = NULL;
+  unsigned char *ebuf = NULL;
+  unsigned char *keybuf = NULL;
+  unsigned char *keybuf_p;
+
+  if (keyno < 1 || keyno > 3)
+    return gpg_error (GPG_ERR_INV_ID);
+  keyno--;
+
+  /* Already cached? */
+  if (app->app_local->pk[keyno].read_done)
+    return 0;
+
+  xfree (app->app_local->pk[keyno].key);
+  app->app_local->pk[keyno].key = NULL;
+  app->app_local->pk[keyno].keylen = 0;
+
+  if (app->card_version > 0x0100)
+    {
+      /* We may simply read the public key out of these cards.  */
+      err = iso7816_read_public_key (app->slot, 
+                                    keyno == 0? "\xB6" :
+                                    keyno == 1? "\xB8" : "\xA4",
+                                    2,  
+                                    &buffer, &buflen);
+      if (err)
+        {
+          log_error (_("reading public key failed: %s\n"), gpg_strerror (err));
+          goto leave;
+        }
+
+      keydata = find_tlv (buffer, buflen, 0x7F49, &keydatalen);
+      if (!keydata)
+        {
+          err = gpg_error (GPG_ERR_CARD);
+          log_error (_("response does not contain the public key data\n"));
+          goto leave;
+        }
+      m = find_tlv (keydata, keydatalen, 0x0081, &mlen);
+      if (!m)
+        {
+          err = gpg_error (GPG_ERR_CARD);
+          log_error (_("response does not contain the RSA modulus\n"));
+          goto leave;
+        }
+      
+
+      e = find_tlv (keydata, keydatalen, 0x0082, &elen);
+      if (!e)
+        {
+          err = gpg_error (GPG_ERR_CARD);
+          log_error (_("response does not contain the RSA public exponent\n"));
+          goto leave;
+        }
+
+      /* Prepend numbers with a 0 if needed.  */
+      if (mlen && (*m & 0x80))
+        {
+          mbuf = xtrymalloc ( mlen + 1);
+          if (!mbuf)
+            {
+              err = gpg_error_from_errno (errno);
+              goto leave;
+            }
+          *mbuf = 0;
+          memcpy (mbuf+1, m, mlen);
+          mlen++;
+          m = mbuf;
+        }
+      if (elen && (*e & 0x80))
+        {
+          ebuf = xtrymalloc ( elen + 1);
+          if (!ebuf)
+            {
+              err = gpg_error_from_errno (errno);
+              goto leave;
+            }
+          *ebuf = 0;
+          memcpy (ebuf+1, e, elen);
+          elen++;
+          e = ebuf;
+        }
+
+    }
+  else
+    {
+      /* Due to a design problem in v1.0 cards we can't get the public
+         key out of these cards without doing a verify on CHV3.
+         Clearly that is not an option and thus we try to locate the
+         key using an external helper.
+
+        The helper we use here is gpg itself, which should know about
+        the key in any case.  */
+
+      char fpr[41];
+      char *hexkeyid;
+      char *command = NULL;
+      FILE *fp;
+      int ret;
+
+      buffer = NULL; /* We don't need buffer.  */
+
+      err = retrieve_fpr_from_card (app, keyno, fpr);
+      if (err)
+       {
+         log_error ("error while retrieving fpr from card: %s\n",
+                    gpg_strerror (err));
+         goto leave;
+       }
+      hexkeyid = fpr + 24;
+
+      ret = asprintf (&command,
+                     "gpg --list-keys --with-colons --with-key-data '%s'",
+                     fpr);
+      if (ret < 0)
+       {
+         err = gpg_error_from_errno (errno);
+         goto leave;
+       }
+
+      fp = popen (command, "r");
+      free (command);
+      if (!fp)
+       {
+         err = gpg_error_from_errno (errno);
+         log_error ("running gpg failed: %s\n", gpg_strerror (err));
+         goto leave;
+       }
+
+      err = retrieve_key_material (fp, hexkeyid, &m, &mlen, &e, &elen);
+      fclose (fp);
+      if (err)
+       {
+         log_error ("error while retrieving key material through pipe: %s\n",
+                     gpg_strerror (err));
+         goto leave;
+       }
+    }
+
+  /* Allocate a buffer to construct the S-expression.  */
+  /* FIXME: We should provide a generalized S-expression creation
+     mechanism. */
+  keybuf = xtrymalloc (50 + 2*35 + mlen + elen + 1);
+  if (!keybuf)
+    {
+      err = gpg_error_from_errno (errno);
+      goto leave;
+    }
+  
+  sprintf (keybuf, "(10:public-key(3:rsa(1:n%u:", (unsigned int) mlen);
+  keybuf_p = keybuf + strlen (keybuf);
+  memcpy (keybuf_p, m, mlen);
+  keybuf_p += mlen;
+  sprintf (keybuf_p, ")(1:e%u:", (unsigned int)elen);
+  keybuf_p += strlen (keybuf_p);
+  memcpy (keybuf_p, e, elen);
+  keybuf_p += elen;
+  strcpy (keybuf_p, ")))");
+  keybuf_p += strlen (keybuf_p);
+  
+  app->app_local->pk[keyno].key = keybuf;
+  app->app_local->pk[keyno].keylen = (keybuf_p - keybuf);
+
+ leave:
+  /* Set a flag to indicate that we tried to read the key.  */
+  app->app_local->pk[keyno].read_done = 1;
+
+  xfree (buffer);
+  xfree (mbuf);
+  xfree (ebuf);
+  return 0;
+}
+#endif /* GNUPG_MAJOR_VERSION > 1 */
+
+
+
+/* Send the KEYPAIRINFO back. KEYNO needs to be in the range [1,3].
+   This is used by the LEARN command. */
+static gpg_error_t
+send_keypair_info (app_t app, ctrl_t ctrl, int keyno)
+{
+  gpg_error_t err = 0;
+  /* Note that GnuPG 1.x does not need this and it would be too time
+     consuming to send it just for the fun of it. */
+#if GNUPG_MAJOR_VERSION > 1
+  unsigned char grip[20];
+  char gripstr[41];
+  char idbuf[50];
+  int i;
+
+  err = get_public_key (app, keyno);
+  if (err)
+    goto leave;
+  
+  assert (keyno >= 1 && keyno <= 3);
+  if (!app->app_local->pk[keyno-1].key)
+    goto leave; /* No such key - ignore. */
+
+  err = keygrip_from_canon_sexp (app->app_local->pk[keyno-1].key,
+                                 app->app_local->pk[keyno-1].keylen,
+                                 grip);
+  if (err)
+    goto leave;
+  
+  for (i=0; i < 20; i++)
+    sprintf (gripstr+i*2, "%02X", grip[i]);
+
+  sprintf (idbuf, "OPENPGP.%d", keyno);
+  send_status_info (ctrl, "KEYPAIRINFO", 
+                    gripstr, 40, 
+                    idbuf, strlen (idbuf), 
+                    NULL, (size_t)0);
+
+ leave:
+#endif /* GNUPG_MAJOR_VERSION > 1 */
+
+  return err; 
+}
+
+
+/* Handle the LEARN command for OpenPGP.  */
+static gpg_error_t
+do_learn_status (app_t app, ctrl_t ctrl)
+{
+  do_getattr (app, ctrl, "EXTCAP");
+  do_getattr (app, ctrl, "DISP-NAME");
+  do_getattr (app, ctrl, "DISP-LANG");
+  do_getattr (app, ctrl, "DISP-SEX");
+  do_getattr (app, ctrl, "PUBKEY-URL");
+  do_getattr (app, ctrl, "LOGIN-DATA");
+  do_getattr (app, ctrl, "KEY-FPR");
+  if (app->card_version > 0x0100)
+    do_getattr (app, ctrl, "KEY-TIME");
+  do_getattr (app, ctrl, "CA-FPR");
+  do_getattr (app, ctrl, "CHV-STATUS");
+  do_getattr (app, ctrl, "SIG-COUNTER");
+  if (app->app_local->extcap.private_dos)
+    {
+      do_getattr (app, ctrl, "PRIVATE-DO-1");
+      do_getattr (app, ctrl, "PRIVATE-DO-2");
+      if (app->did_chv2)
+        do_getattr (app, ctrl, "PRIVATE-DO-3");
+      if (app->did_chv3)
+        do_getattr (app, ctrl, "PRIVATE-DO-4");
+    }
+  send_keypair_info (app, ctrl, 1);
+  send_keypair_info (app, ctrl, 2);
+  send_keypair_info (app, ctrl, 3);
+  return 0;
+}
+
+
+/* Handle the READKEY command for OpenPGP.  On success a canonical
+   encoded S-expression with the public key will get stored at PK and
+   its length (for assertions) at PKLEN; the caller must release that
+   buffer. On error PK and PKLEN are not changed and an error code is
+   returned.  */
+static gpg_error_t
+do_readkey (app_t app, const char *keyid, unsigned char **pk, size_t *pklen)
+{
+#if GNUPG_MAJOR_VERSION > 1
+  gpg_error_t err;
+  int keyno;
+  unsigned char *buf;
+
+  if (!strcmp (keyid, "OPENPGP.1"))
+    keyno = 1;
+  else if (!strcmp (keyid, "OPENPGP.2"))
+    keyno = 2;
+  else if (!strcmp (keyid, "OPENPGP.3"))
+    keyno = 3;
+  else
+    return gpg_error (GPG_ERR_INV_ID);
+
+  err = get_public_key (app, keyno);
+  if (err)
+    return err;
+
+  buf = app->app_local->pk[keyno-1].key;
+  if (!buf)
+    return gpg_error (GPG_ERR_NO_PUBKEY);
+  *pk = buf;
+  *pklen = app->app_local->pk[keyno-1].keylen;;
+  return 0;
+#else
+  return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+#endif
+}
+
+
+
+/* Verify CHV2 if required.  Depending on the configuration of the
+   card CHV1 will also be verified. */
+static gpg_error_t
+verify_chv2 (app_t app,
+             gpg_error_t (*pincb)(void*, const char *, char **),
+             void *pincb_arg)
+{
+  int rc = 0;
+
+  if (!app->did_chv2) 
+    {
+      char *pinvalue;
+
+      rc = pincb (pincb_arg, "PIN", &pinvalue); 
+      if (rc)
+        {
+          log_info (_("PIN callback returned error: %s\n"), gpg_strerror (rc));
+          return rc;
+        }
+
+      if (strlen (pinvalue) < 6)
+        {
+          log_error (_("PIN for CHV%d is too short;"
+                       " minimum length is %d\n"), 2, 6);
+          xfree (pinvalue);
+          return gpg_error (GPG_ERR_BAD_PIN);
+        }
+
+      rc = iso7816_verify (app->slot, 0x82, pinvalue, strlen (pinvalue));
+      if (rc)
+        {
+          log_error (_("verify CHV%d failed: %s\n"), 2, gpg_strerror (rc));
+          xfree (pinvalue);
+          flush_cache_after_error (app);
+          return rc;
+        }
+      app->did_chv2 = 1;
+
+      if (!app->did_chv1 && !app->force_chv1)
+        {
+          rc = iso7816_verify (app->slot, 0x81, pinvalue, strlen (pinvalue));
+          if (gpg_err_code (rc) == GPG_ERR_BAD_PIN)
+            rc = gpg_error (GPG_ERR_PIN_NOT_SYNCED);
+          if (rc)
+            {
+              log_error (_("verify CHV%d failed: %s\n"), 1, gpg_strerror (rc));
+              xfree (pinvalue);
+              flush_cache_after_error (app);
+              return rc;
+            }
+          app->did_chv1 = 1;
+        }
+      xfree (pinvalue);
+    }
+  return rc;
+}
+
+/* Verify CHV3 if required. */
+static gpg_error_t
+verify_chv3 (app_t app,
+             gpg_error_t (*pincb)(void*, const char *, char **),
+             void *pincb_arg)
+{
+  int rc = 0;
+
+#if GNUPG_MAJOR_VERSION != 1
+  if (!opt.allow_admin)
+    {
+      log_info (_("access to admin commands is not configured\n"));
+      return gpg_error (GPG_ERR_EACCES);
+    }
+#endif
+      
+  if (!app->did_chv3) 
+    {
+      char *pinvalue;
+      void *relptr;
+      unsigned char *value;
+      size_t valuelen;
+
+      relptr = get_one_do (app, 0x00C4, &value, &valuelen, NULL);
+      if (!relptr || valuelen < 7)
+        {
+          log_error (_("error retrieving CHV status from card\n"));
+          xfree (relptr);
+          return gpg_error (GPG_ERR_CARD);
+        }
+      if (value[6] == 0)
+        {
+          log_info (_("card is permanently locked!\n"));
+          xfree (relptr);
+          return gpg_error (GPG_ERR_BAD_PIN);
+        }
+
+      log_info(_("%d Admin PIN attempts remaining before card"
+                 " is permanently locked\n"), value[6]);
+      xfree (relptr);
+
+      /* TRANSLATORS: Do not translate the "|A|" prefix but
+         keep it at the start of the string.  We need this elsewhere
+         to get some infos on the string. */
+      rc = pincb (pincb_arg, _("|A|Admin PIN"), &pinvalue); 
+      if (rc)
+        {
+          log_info (_("PIN callback returned error: %s\n"), gpg_strerror (rc));
+          return rc;
+        }
+
+      if (strlen (pinvalue) < 8)
+        {
+          log_error (_("PIN for CHV%d is too short;"
+                       " minimum length is %d\n"), 3, 8);
+          xfree (pinvalue);
+          return gpg_error (GPG_ERR_BAD_PIN);
+        }
+
+      rc = iso7816_verify (app->slot, 0x83, pinvalue, strlen (pinvalue));
+      xfree (pinvalue);
+      if (rc)
+        {
+          log_error (_("verify CHV%d failed: %s\n"), 3, gpg_strerror (rc));
+          flush_cache_after_error (app);
+          return rc;
+        }
+      app->did_chv3 = 1;
+    }
+  return rc;
+}
+
+
+/* Handle the SETATTR operation. All arguments are already basically
+   checked. */
+static gpg_error_t 
+do_setattr (app_t app, const char *name,
+            gpg_error_t (*pincb)(void*, const char *, char **),
+            void *pincb_arg,
+            const unsigned char *value, size_t valuelen)
+{
+  gpg_error_t rc;
+  int idx;
+  static struct {
+    const char *name;
+    int tag;
+    int need_chv;
+    int special;
+  } table[] = {
+    { "DISP-NAME",    0x005B, 3 },
+    { "LOGIN-DATA",   0x005E, 3, 2 },
+    { "DISP-LANG",    0x5F2D, 3 },
+    { "DISP-SEX",     0x5F35, 3 },
+    { "PUBKEY-URL",   0x5F50, 3 },
+    { "CHV-STATUS-1", 0x00C4, 3, 1 },
+    { "CA-FPR-1",     0x00CA, 3 },
+    { "CA-FPR-2",     0x00CB, 3 },
+    { "CA-FPR-3",     0x00CC, 3 },
+    { "PRIVATE-DO-1", 0x0101, 2 },
+    { "PRIVATE-DO-2", 0x0102, 3 },
+    { "PRIVATE-DO-3", 0x0103, 2 },
+    { "PRIVATE-DO-4", 0x0104, 3 },
+    { NULL, 0 }
+  };
+
+
+  for (idx=0; table[idx].name && strcmp (table[idx].name, name); idx++)
+    ;
+  if (!table[idx].name)
+    return gpg_error (GPG_ERR_INV_NAME); 
+
+  switch (table[idx].need_chv)
+    {
+    case 2:
+      rc = verify_chv2 (app, pincb, pincb_arg);
+      break;
+    case 3:
+      rc = verify_chv3 (app, pincb, pincb_arg);
+      break;
+    default:
+      rc = 0;
+    }
+  if (rc)
+    return rc;
+
+  /* Flush the cache before writing it, so that the next get operation
+     will reread the data from the card and thus get synced in case of
+     errors (e.g. data truncated by the card). */
+  flush_cache_item (app, table[idx].tag);
+  rc = iso7816_put_data (app->slot, table[idx].tag, value, valuelen);
+  if (rc)
+    log_error ("failed to set `%s': %s\n", table[idx].name, gpg_strerror (rc));
+
+  if (table[idx].special == 1)
+    app->force_chv1 = (valuelen && *value == 0);
+  else if (table[idx].special == 2)
+    parse_login_data (app);
+
+  return rc;
+}
+
+
+/* Handle the PASSWD command. */
+static gpg_error_t 
+do_change_pin (app_t app, ctrl_t ctrl,  const char *chvnostr, int reset_mode,
+               gpg_error_t (*pincb)(void*, const char *, char **),
+               void *pincb_arg)
+{
+  int rc = 0;
+  int chvno = atoi (chvnostr);
+  char *pinvalue;
+
+  if (reset_mode && chvno == 3)
+    {
+      rc = gpg_error (GPG_ERR_INV_ID);
+      goto leave;
+    }
+  else if (reset_mode || chvno == 3)
+    {
+      /* we always require that the PIN is entered. */
+      app->did_chv3 = 0;
+      rc = verify_chv3 (app, pincb, pincb_arg);
+      if (rc)
+        goto leave;
+    }
+  else if (chvno == 1 || chvno == 2)
+    {
+      /* CHV1 and CVH2 should always have the same value, thus we
+         enforce it here.  */
+      int save_force = app->force_chv1;
+
+      app->force_chv1 = 0;
+      app->did_chv1 = 0;
+      app->did_chv2 = 0;
+      rc = verify_chv2 (app, pincb, pincb_arg);
+      app->force_chv1 = save_force;
+      if (rc)
+        goto leave;
+    }
+  else
+    {
+      rc = gpg_error (GPG_ERR_INV_ID);
+      goto leave;
+    }
+
+  if (chvno == 3)
+    app->did_chv3 = 0;
+  else
+    app->did_chv1 = app->did_chv2 = 0;
+
+  /* TRANSLATORS: Do not translate the "|*|" prefixes but
+     keep it at the start of the string.  We need this elsewhere
+     to get some infos on the string. */
+  rc = pincb (pincb_arg, chvno == 3? _("|AN|New Admin PIN") : _("|N|New PIN"), 
+              &pinvalue); 
+  if (rc)
+    {
+      log_error (_("error getting new PIN: %s\n"), gpg_strerror (rc));
+      goto leave;
+    }
+
+  if (reset_mode)
+    {
+      rc = iso7816_reset_retry_counter (app->slot, 0x81,
+                                        pinvalue, strlen (pinvalue));
+      if (!rc)
+        rc = iso7816_reset_retry_counter (app->slot, 0x82,
+                                          pinvalue, strlen (pinvalue));
+    }
+  else
+    {
+      if (chvno == 1 || chvno == 2)
+        {
+          rc = iso7816_change_reference_data (app->slot, 0x81, NULL, 0,
+                                              pinvalue, strlen (pinvalue));
+          if (!rc)
+            rc = iso7816_change_reference_data (app->slot, 0x82, NULL, 0,
+                                                pinvalue, strlen (pinvalue));
+        }
+      else
+        rc = iso7816_change_reference_data (app->slot, 0x80 + chvno, NULL, 0,
+                                            pinvalue, strlen (pinvalue));
+    }
+  xfree (pinvalue);
+  if (rc)
+    flush_cache_after_error (app);
+
+ leave:
+  return rc;
+}
+
+
+/* Check whether a key already exists.  KEYIDX is the index of the key
+   (0..2).  If FORCE is TRUE a diagnositic will be printed but no
+   error returned if the key already exists. */
+static gpg_error_t
+does_key_exist (app_t app, int keyidx, int force)
+{
+  const unsigned char *fpr;
+  unsigned char *buffer;
+  size_t buflen, n;
+  int i;
+
+  assert (keyidx >=0 && keyidx <= 2);
+
+  if (iso7816_get_data (app->slot, 0x006E, &buffer, &buflen))
+    {
+      log_error (_("error reading application data\n"));
+      return gpg_error (GPG_ERR_GENERAL);
+    }
+  fpr = find_tlv (buffer, buflen, 0x00C5, &n);
+  if (!fpr || n < 60)
+    {
+      log_error (_("error reading fingerprint DO\n"));
+      xfree (buffer);
+      return gpg_error (GPG_ERR_GENERAL);
+    }
+  fpr += 20*keyidx;
+  for (i=0; i < 20 && !fpr[i]; i++)
+    ;
+  xfree (buffer);
+  if (i!=20 && !force)
+    {
+      log_error (_("key already exists\n"));
+      return gpg_error (GPG_ERR_EEXIST);
+    }
+  else if (i!=20)
+    log_info (_("existing key will be replaced\n"));
+  else
+    log_info (_("generating new key\n"));
+  return 0;
+}
+
+
+
+/* Handle the WRITEKEY command for OpenPGP.  This function expects a
+   canonical encoded S-expression with the secret key in KEYDATA and
+   its length (for assertions) in KEYDATALEN.  KEYID needs to be the
+   usual keyid which for OpenPGP is the string "OPENPGP.n" with
+   n=1,2,3.  Bit 0 of FLAGS indicates whether an existing key shall
+   get overwritten.  PINCB and PINCB_ARG are the usual arguments for
+   the pinentry callback.  */
+static gpg_error_t
+do_writekey (app_t app, ctrl_t ctrl,
+             const char *keyid, unsigned int flags,
+             gpg_error_t (*pincb)(void*, const char *, char **),
+             void *pincb_arg,
+             const unsigned char *keydata, size_t keydatalen)
+{
+  gpg_error_t err;
+  int force = (flags & 1);
+  int keyno;
+  const unsigned char *buf, *tok;
+  size_t buflen, toklen;
+  int depth, last_depth1, last_depth2;
+  const unsigned char *rsa_n = NULL;
+  const unsigned char *rsa_e = NULL;
+  const unsigned char *rsa_p = NULL;
+  const unsigned char *rsa_q = NULL;
+  size_t rsa_n_len, rsa_e_len, rsa_p_len, rsa_q_len;
+  unsigned int nbits;
+  unsigned char *template = NULL;
+  unsigned char *tp;
+  size_t template_len;
+  unsigned char fprbuf[20];
+  u32 created_at = 0;
+
+  if (!strcmp (keyid, "OPENPGP.1"))
+    keyno = 0;
+  else if (!strcmp (keyid, "OPENPGP.2"))
+    keyno = 1;
+  else if (!strcmp (keyid, "OPENPGP.3"))
+    keyno = 2;
+  else
+    return gpg_error (GPG_ERR_INV_ID);
+  
+  err = does_key_exist (app, keyno, force);
+  if (err)
+    return err;
+
+
+  /* 
+     Parse the S-expression
+   */
+  buf = keydata;
+  buflen = keydatalen;
+  depth = 0;
+  if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+    goto leave;
+  if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+    goto leave;
+  if (!tok || toklen != 11 || memcmp ("private-key", tok, toklen))
+    {
+      if (!tok)
+        ;
+      else if (toklen == 21 && !memcmp ("protected-private-key", tok, toklen))
+        log_info ("protected-private-key passed to writekey\n");
+      else if (toklen == 20 && !memcmp ("shadowed-private-key", tok, toklen))
+        log_info ("shadowed-private-key passed to writekey\n");
+      err = gpg_error (GPG_ERR_BAD_SECKEY);
+      goto leave;
+    }
+  if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+    goto leave;
+  if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+    goto leave;
+  if (!tok || toklen != 3 || memcmp ("rsa", tok, toklen))
+    {
+      err = gpg_error (GPG_ERR_WRONG_PUBKEY_ALGO);
+      goto leave;
+    }
+  last_depth1 = depth;
+  while (!(err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen))
+         && depth && depth >= last_depth1)
+    {
+      if (tok)
+        {
+          err = gpg_error (GPG_ERR_UNKNOWN_SEXP);
+          goto leave;
+        }
+      if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+        goto leave;
+      if (tok && toklen == 1)
+        {
+          const unsigned char **mpi;
+          size_t *mpi_len;
+
+          switch (*tok)
+            {
+            case 'n': mpi = &rsa_n; mpi_len = &rsa_n_len; break; 
+            case 'e': mpi = &rsa_e; mpi_len = &rsa_e_len; break; 
+            case 'p': mpi = &rsa_p; mpi_len = &rsa_p_len; break; 
+            case 'q': mpi = &rsa_q; mpi_len = &rsa_q_len;break; 
+            default: mpi = NULL;  mpi_len = NULL; break;
+            }
+          if (mpi && *mpi)
+            {
+              err = gpg_error (GPG_ERR_DUP_VALUE);
+              goto leave;
+            }
+          if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+            goto leave;
+          if (tok && mpi)
+            {
+              /* Strip off leading zero bytes and save. */
+              for (;toklen && !*tok; toklen--, tok++)
+                ;
+              *mpi = tok;
+              *mpi_len = toklen;
+            }
+        }
+      /* Skip until end of list. */
+      last_depth2 = depth;
+      while (!(err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen))
+             && depth && depth >= last_depth2)
+        ;
+      if (err)
+        goto leave;
+    }
+  /* Parse other attributes. */
+  last_depth1 = depth;
+  while (!(err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen))
+         && depth && depth >= last_depth1)
+    {
+      if (tok)
+        {
+          err = gpg_error (GPG_ERR_UNKNOWN_SEXP);
+          goto leave;
+        }
+      if ((err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen)))
+        goto leave;
+      if (tok && toklen == 10 && !memcmp ("created-at", tok, toklen))
+        {
+          if ((err = parse_sexp (&buf,&buflen,&depth,&tok,&toklen)))
+            goto leave;
+          if (tok)
+            {
+              for (created_at=0; toklen && *tok && *tok >= '0' && *tok <= '9';
+                   tok++, toklen--)
+                created_at = created_at*10 + (*tok - '0');
+            }
+        }
+      /* Skip until end of list. */
+      last_depth2 = depth;
+      while (!(err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen))
+             && depth && depth >= last_depth2)
+        ;
+      if (err)
+        goto leave;
+    }
+
+
+  /* Check that we have all parameters and that they match the card
+     description. */
+  if (!created_at)
+    {
+      log_error (_("creation timestamp missing\n"));
+      err = gpg_error (GPG_ERR_INV_VALUE);
+      goto leave;
+    }
+  nbits = rsa_n? count_bits (rsa_n, rsa_n_len) : 0;
+  if (nbits != 1024)
+    {
+      log_error (_("RSA modulus missing or not of size %d bits\n"), 1024);
+      err = gpg_error (GPG_ERR_BAD_SECKEY);
+      goto leave;
+    }
+  nbits = rsa_e? count_bits (rsa_e, rsa_e_len) : 0;
+  if (nbits < 2 || nbits > 32)
+    {
+      log_error (_("RSA public exponent missing or larger than %d bits\n"),
+                 32);
+      err = gpg_error (GPG_ERR_BAD_SECKEY);
+      goto leave;
+    }
+  nbits = rsa_p? count_bits (rsa_p, rsa_p_len) : 0;
+  if (nbits != 512)
+    {
+      log_error (_("RSA prime %s missing or not of size %d bits\n"), "P", 512);
+      err = gpg_error (GPG_ERR_BAD_SECKEY);
+      goto leave;
+    }
+  nbits = rsa_q? count_bits (rsa_q, rsa_q_len) : 0;
+  if (nbits != 512)
+    {
+      log_error (_("RSA prime %s missing or not of size %d bits\n"), "Q", 512);
+      err = gpg_error (GPG_ERR_BAD_SECKEY);
+      goto leave;
+    }
+  
+
+  /* Build the private key template as described in section 4.3.3.6 of
+     the OpenPGP card specs:
+         0xC0   <length> public exponent
+         0xC1   <length> prime p 
+         0xC2   <length> prime q 
+  */
+  assert (rsa_e_len <= 4);
+  template_len = (1 + 1 + 4
+                  + 1 + 1 + rsa_p_len
+                  + 1 + 1 + rsa_q_len);
+  template = tp = xtrymalloc_secure (template_len);
+  if (!template)
+    {
+      err = gpg_error_from_errno (errno);
+      goto leave;
+    }
+  *tp++ = 0xC0;
+  *tp++ = 4;
+  memcpy (tp, rsa_e, rsa_e_len);
+  if (rsa_e_len < 4)
+    {
+      /* Right justify E. */
+      memmove (tp+4-rsa_e_len, tp, rsa_e_len);
+      memset (tp, 0, 4-rsa_e_len);
+    }                 
+  tp += 4;
+
+  *tp++ = 0xC1;
+  *tp++ = rsa_p_len;
+  memcpy (tp, rsa_p, rsa_p_len);
+  tp += rsa_p_len;
+
+  *tp++ = 0xC2;
+  *tp++ = rsa_q_len;
+  memcpy (tp, rsa_q, rsa_q_len);
+  tp += rsa_q_len;
+
+  assert (tp - template == template_len);
+
+
+  /* Obviously we need to remove the cached public key.  */
+  xfree (app->app_local->pk[keyno].key);
+  app->app_local->pk[keyno].key = NULL;
+  app->app_local->pk[keyno].keylen = 0;
+  app->app_local->pk[keyno].read_done = 0;
+
+  /* Prepare for storing the key.  */
+  err = verify_chv3 (app, pincb, pincb_arg);
+  if (err)
+    goto leave;
+
+  /* Store the key. */
+  err = iso7816_put_data (app->slot,
+                         (app->card_version > 0x0007? 0xE0 : 0xE9) + keyno,
+                         template, template_len);
+  if (err)
+    {
+      log_error (_("failed to store the key: %s\n"), gpg_strerror (err));
+      goto leave;
+    }
+  err = store_fpr (app->slot, keyno, created_at,
+                  rsa_n, rsa_n_len, rsa_e, rsa_e_len,
+                  fprbuf, app->card_version);
+  if (err)
+    goto leave;
+
+
+ leave:
+  xfree (template);
+  return err;
+}
+
+
+/* Handle the GENKEY command. */
+static gpg_error_t 
+do_genkey (app_t app, ctrl_t ctrl,  const char *keynostr, unsigned int flags,
+          gpg_error_t (*pincb)(void*, const char *, char **),
+          void *pincb_arg)
+{
+  int rc;
+  char numbuf[30];
+  unsigned char fprbuf[20];
+  const unsigned char *keydata, *m, *e;
+  unsigned char *buffer = NULL;
+  size_t buflen, keydatalen, mlen, elen;
+  time_t created_at;
+  int keyno = atoi (keynostr);
+  int force = (flags & 1);
+  time_t start_at;
+
+  if (keyno < 1 || keyno > 3)
+    return gpg_error (GPG_ERR_INV_ID);
+  keyno--;
+
+  /* We flush the cache to increase the traffic before a key
+     generation.  This _might_ help a card to gather more entropy. */
+  flush_cache (app);
+
+  /* Obviously we need to remove the cached public key.  */
+  xfree (app->app_local->pk[keyno].key);
+  app->app_local->pk[keyno].key = NULL;
+  app->app_local->pk[keyno].keylen = 0;
+  app->app_local->pk[keyno].read_done = 0;
+
+  /* Check whether a key already exists.  */
+  rc = does_key_exist (app, keyno, force);
+  if (rc)
+    return rc;
+
+  /* Prepare for key generation by verifying the ADmin PIN.  */
+  rc = verify_chv3 (app, pincb, pincb_arg);
+  if (rc)
+    goto leave;
+   
+#if 1
+  log_info (_("please wait while key is being generated ...\n"));
+  start_at = time (NULL);
+  rc = iso7816_generate_keypair 
+#else
+#warning key generation temporary replaced by reading an existing key.
+  rc = iso7816_read_public_key
+#endif
+                              (app->slot, 
+                                 keyno == 0? "\xB6" :
+                                 keyno == 1? "\xB8" : "\xA4",
+                                 2,
+                                 &buffer, &buflen);
+  if (rc)
+    {
+      rc = gpg_error (GPG_ERR_CARD);
+      log_error (_("generating key failed\n"));
+      goto leave;
+    }
+  log_info (_("key generation completed (%d seconds)\n"),
+            (int)(time (NULL) - start_at));
+  keydata = find_tlv (buffer, buflen, 0x7F49, &keydatalen);
+  if (!keydata)
+    {
+      rc = gpg_error (GPG_ERR_CARD);
+      log_error (_("response does not contain the public key data\n"));
+      goto leave;
+    }
+  m = find_tlv (keydata, keydatalen, 0x0081, &mlen);
+  if (!m)
+    {
+      rc = gpg_error (GPG_ERR_CARD);
+      log_error (_("response does not contain the RSA modulus\n"));
+      goto leave;
+    }
+/*    log_printhex ("RSA n:", m, mlen); */
+  send_key_data (ctrl, "n", m, mlen);
+
+  e = find_tlv (keydata, keydatalen, 0x0082, &elen);
+  if (!e)
+    {
+      rc = gpg_error (GPG_ERR_CARD);
+      log_error (_("response does not contain the RSA public exponent\n"));
+      goto leave;
+    }
+/*    log_printhex ("RSA e:", e, elen); */
+  send_key_data (ctrl, "e", e, elen);
+
+  created_at = gnupg_get_time ();
+  sprintf (numbuf, "%lu", (unsigned long)created_at);
+  send_status_info (ctrl, "KEY-CREATED-AT",
+                    numbuf, (size_t)strlen(numbuf), NULL, 0);
+
+  rc = store_fpr (app->slot, keyno, (u32)created_at,
+                  m, mlen, e, elen, fprbuf, app->card_version);
+  if (rc)
+    goto leave;
+  send_fpr_if_not_null (ctrl, "KEY-FPR", -1, fprbuf);
+
+
+ leave:
+  xfree (buffer);
+  return rc;
+}
+
+
+static unsigned long
+convert_sig_counter_value (const unsigned char *value, size_t valuelen)
+{
+  unsigned long ul;
+
+  if (valuelen == 3 )
+    ul = (value[0] << 16) | (value[1] << 8) | value[2];
+  else
+    {
+      log_error (_("invalid structure of OpenPGP card (DO 0x93)\n"));
+      ul = 0;
+    }
+  return ul;
+}
+
+static unsigned long
+get_sig_counter (app_t app)
+{
+  void *relptr;
+  unsigned char *value;
+  size_t valuelen;
+  unsigned long ul;
+
+  relptr = get_one_do (app, 0x0093, &value, &valuelen, NULL);
+  if (!relptr)
+    return 0;
+  ul = convert_sig_counter_value (value, valuelen);
+  xfree (relptr);
+  return ul;
+}
+
+static gpg_error_t
+compare_fingerprint (app_t app, int keyno, unsigned char *sha1fpr)
+{
+  const unsigned char *fpr;
+  unsigned char *buffer;
+  size_t buflen, n;
+  int rc, i;
+  
+  assert (keyno >= 1 && keyno <= 3);
+
+  rc = get_cached_data (app, 0x006E, &buffer, &buflen, 0);
+  if (rc)
+    {
+      log_error (_("error reading application data\n"));
+      return gpg_error (GPG_ERR_GENERAL);
+    }
+  fpr = find_tlv (buffer, buflen, 0x00C5, &n);
+  if (!fpr || n != 60)
+    {
+      xfree (buffer);
+      log_error (_("error reading fingerprint DO\n"));
+      return gpg_error (GPG_ERR_GENERAL);
+    }
+  fpr += (keyno-1)*20;
+  for (i=0; i < 20; i++)
+    if (sha1fpr[i] != fpr[i])
+      {
+        xfree (buffer);
+        return gpg_error (GPG_ERR_WRONG_SECKEY);
+      }
+  xfree (buffer);
+  return 0;
+}
+
+
+  /* If a fingerprint has been specified check it against the one on
+     the card.  This is allows for a meaningful error message in case
+     the key on the card has been replaced but the shadow information
+     known to gpg was not updated.  If there is no fingerprint we
+     assume that this is okay. */
+static gpg_error_t
+check_against_given_fingerprint (app_t app, const char *fpr, int keyno)
+{
+  unsigned char tmp[20];
+  const char *s;
+  int n;
+
+  for (s=fpr, n=0; hexdigitp (s); s++, n++)
+    ;
+  if (n != 40)
+    return gpg_error (GPG_ERR_INV_ID);
+  else if (!*s)
+    ; /* okay */
+  else
+    return gpg_error (GPG_ERR_INV_ID);
+
+  for (s=fpr, n=0; n < 20; s += 2, n++)
+        tmp[n] = xtoi_2 (s);
+  return compare_fingerprint (app, keyno, tmp);
+}
+
+
+
+/* Compute a digital signature on INDATA which is expected to be the
+   raw message digest. For this application the KEYIDSTR consists of
+   the serialnumber and the fingerprint delimited by a slash.
+
+   Note that this fucntion may return the error code
+   GPG_ERR_WRONG_CARD to indicate that the card currently present does
+   not match the one required for the requested action (e.g. the
+   serial number does not match). */
+static gpg_error_t 
+do_sign (app_t app, const char *keyidstr, int hashalgo,
+         gpg_error_t (*pincb)(void*, const char *, char **),
+         void *pincb_arg,
+         const void *indata, size_t indatalen,
+         unsigned char **outdata, size_t *outdatalen )
+{
+  static unsigned char sha1_prefix[15] = /* Object ID is 1.3.14.3.2.26 */
+  { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
+    0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 };
+  static unsigned char rmd160_prefix[15] = /* Object ID is 1.3.36.3.2.1 */
+  { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x24, 0x03,
+    0x02, 0x01, 0x05, 0x00, 0x04, 0x14 };
+  int rc;
+  unsigned char data[35];
+  unsigned char tmp_sn[20]; /* actually 16 but we use it also for the fpr. */
+  const char *s;
+  int n;
+  const char *fpr = NULL;
+  unsigned long sigcount;
+
+  if (!keyidstr || !*keyidstr)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  if (indatalen == 20)
+    ;
+  else if (indatalen == (15 + 20) && hashalgo == GCRY_MD_SHA1
+           && !memcmp (indata, sha1_prefix, 15))
+    ;
+  else if (indatalen == (15 + 20) && hashalgo == GCRY_MD_RMD160
+           && !memcmp (indata, rmd160_prefix, 15))
+    ;
+  else
+    {
+      log_error(_("card does not support digest algorithm %s\n"),
+               digest_algo_to_string(hashalgo));
+      return gpg_error (GPG_ERR_INV_VALUE);
+    }
+
+  /* Check whether an OpenPGP card of any version has been requested. */
+  if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
+    return gpg_error (GPG_ERR_INV_ID);
+  
+  for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
+    ;
+  if (n != 32)
+    return gpg_error (GPG_ERR_INV_ID);
+  else if (!*s)
+    ; /* no fingerprint given: we allow this for now. */
+  else if (*s == '/')
+    fpr = s + 1; 
+  else
+    return gpg_error (GPG_ERR_INV_ID);
+
+  for (s=keyidstr, n=0; n < 16; s += 2, n++)
+    tmp_sn[n] = xtoi_2 (s);
+
+  if (app->serialnolen != 16)
+    return gpg_error (GPG_ERR_INV_CARD);
+  if (memcmp (app->serialno, tmp_sn, 16))
+    return gpg_error (GPG_ERR_WRONG_CARD);
+
+  /* If a fingerprint has been specified check it against the one on
+     the card.  This is allows for a meaningful error message in case
+     the key on the card has been replaced but the shadow information
+     known to gpg was not updated.  If there is no fingerprint, gpg
+     will detect a bogus signature anyway due to the
+     verify-after-signing feature. */
+  rc = fpr? check_against_given_fingerprint (app, fpr, 1) : 0;
+  if (rc)
+    return rc;
+
+  if (hashalgo == GCRY_MD_SHA1)
+    memcpy (data, sha1_prefix, 15);
+  else if (hashalgo == GCRY_MD_RMD160)
+    memcpy (data, rmd160_prefix, 15);
+  else 
+    return gpg_error (GPG_ERR_UNSUPPORTED_ALGORITHM);
+  memcpy (data+15, indata, indatalen);
+
+  sigcount = get_sig_counter (app);
+  log_info (_("signatures created so far: %lu\n"), sigcount);
+
+  if (!app->did_chv1 || app->force_chv1 ) 
+    {
+      char *pinvalue;
+
+      {
+        char *prompt;
+#define PROMPTSTRING  _("||Please enter the PIN%%0A[sigs done: %lu]")
+
+        prompt = malloc (strlen (PROMPTSTRING) + 50);
+        if (!prompt)
+          return gpg_error_from_errno (errno);
+        sprintf (prompt, PROMPTSTRING, sigcount);
+        rc = pincb (pincb_arg, prompt, &pinvalue); 
+        free (prompt);
+#undef PROMPTSTRING
+      }
+      if (rc)
+        {
+          log_info (_("PIN callback returned error: %s\n"), gpg_strerror (rc));
+          return rc;
+        }
+
+      if (strlen (pinvalue) < 6)
+        {
+          log_error (_("PIN for CHV%d is too short;"
+                       " minimum length is %d\n"), 1, 6);
+          xfree (pinvalue);
+          return gpg_error (GPG_ERR_BAD_PIN);
+        }
+
+      rc = iso7816_verify (app->slot, 0x81, pinvalue, strlen (pinvalue));
+      if (rc)
+        {
+          log_error (_("verify CHV%d failed: %s\n"), 1, gpg_strerror (rc));
+          xfree (pinvalue);
+          flush_cache_after_error (app);
+          return rc;
+        }
+      app->did_chv1 = 1;
+      if (!app->did_chv2)
+        {
+          /* We should also verify CHV2. */
+          rc = iso7816_verify (app->slot, 0x82, pinvalue, strlen (pinvalue));
+          if (gpg_err_code (rc) == GPG_ERR_BAD_PIN)
+            rc = gpg_error (GPG_ERR_PIN_NOT_SYNCED);
+          if (rc)
+            {
+              log_error (_("verify CHV%d failed: %s\n"), 2, gpg_strerror (rc));
+              xfree (pinvalue);
+              flush_cache_after_error (app);
+              return rc;
+            }
+          app->did_chv2 = 1;
+        }
+      xfree (pinvalue);
+    }
+
+  rc = iso7816_compute_ds (app->slot, data, 35, outdata, outdatalen);
+  return rc;
+}
+
+/* Compute a digital signature using the INTERNAL AUTHENTICATE command
+   on INDATA which is expected to be the raw message digest. For this
+   application the KEYIDSTR consists of the serialnumber and the
+   fingerprint delimited by a slash.  Optionally the id OPENPGP.3 may
+   be given.
+
+   Note that this fucntion may return the error code
+   GPG_ERR_WRONG_CARD to indicate that the card currently present does
+   not match the one required for the requested action (e.g. the
+   serial number does not match). */
+static gpg_error_t 
+do_auth (app_t app, const char *keyidstr,
+         gpg_error_t (*pincb)(void*, const char *, char **),
+         void *pincb_arg,
+         const void *indata, size_t indatalen,
+         unsigned char **outdata, size_t *outdatalen )
+{
+  int rc;
+  unsigned char tmp_sn[20]; /* actually 16 but we use it also for the fpr. */
+  const char *s;
+  int n;
+  const char *fpr = NULL;
+
+  if (!keyidstr || !*keyidstr)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  if (indatalen > 50) /* For a 1024 bit key. */
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  /* Check whether an OpenPGP card of any version has been requested. */
+  if (!strcmp (keyidstr, "OPENPGP.3"))
+    ;
+  else if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
+    return gpg_error (GPG_ERR_INV_ID);
+  else
+    {
+      for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
+        ;
+      if (n != 32)
+        return gpg_error (GPG_ERR_INV_ID);
+      else if (!*s)
+        ; /* no fingerprint given: we allow this for now. */
+      else if (*s == '/')
+        fpr = s + 1; 
+      else
+        return gpg_error (GPG_ERR_INV_ID);
+
+      for (s=keyidstr, n=0; n < 16; s += 2, n++)
+        tmp_sn[n] = xtoi_2 (s);
+      
+      if (app->serialnolen != 16)
+        return gpg_error (GPG_ERR_INV_CARD);
+      if (memcmp (app->serialno, tmp_sn, 16))
+        return gpg_error (GPG_ERR_WRONG_CARD);
+    }
+
+  /* If a fingerprint has been specified check it against the one on
+     the card.  This is allows for a meaningful error message in case
+     the key on the card has been replaced but the shadow information
+     known to gpg was not updated.  If there is no fingerprint, gpg
+     will detect a bogus signature anyway due to the
+     verify-after-signing feature. */
+  rc = fpr? check_against_given_fingerprint (app, fpr, 3) : 0;
+  if (rc)
+    return rc;
+
+  rc = verify_chv2 (app, pincb, pincb_arg);
+  if (!rc)
+    rc = iso7816_internal_authenticate (app->slot, indata, indatalen,
+                                        outdata, outdatalen);
+  return rc;
+}
+
+
+static gpg_error_t 
+do_decipher (app_t app, const char *keyidstr,
+             gpg_error_t (*pincb)(void*, const char *, char **),
+             void *pincb_arg,
+             const void *indata, size_t indatalen,
+             unsigned char **outdata, size_t *outdatalen )
+{
+  int rc;
+  unsigned char tmp_sn[20]; /* actually 16 but we use it also for the fpr. */
+  const char *s;
+  int n;
+  const char *fpr = NULL;
+
+  if (!keyidstr || !*keyidstr || !indatalen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  /* Check whether an OpenPGP card of any version has been requested. */
+  if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
+    return gpg_error (GPG_ERR_INV_ID);
+  
+  for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
+    ;
+  if (n != 32)
+    return gpg_error (GPG_ERR_INV_ID);
+  else if (!*s)
+    ; /* no fingerprint given: we allow this for now. */
+  else if (*s == '/')
+    fpr = s + 1; 
+  else
+    return gpg_error (GPG_ERR_INV_ID);
+
+  for (s=keyidstr, n=0; n < 16; s += 2, n++)
+    tmp_sn[n] = xtoi_2 (s);
+
+  if (app->serialnolen != 16)
+    return gpg_error (GPG_ERR_INV_CARD);
+  if (memcmp (app->serialno, tmp_sn, 16))
+    return gpg_error (GPG_ERR_WRONG_CARD);
+
+  /* If a fingerprint has been specified check it against the one on
+     the card.  This is allows for a meaningful error message in case
+     the key on the card has been replaced but the shadow information
+     known to gpg was not updated.  If there is no fingerprint, the
+     decryption will won't produce the right plaintext anyway. */
+  rc = fpr? check_against_given_fingerprint (app, fpr, 2) : 0;
+  if (rc)
+    return rc;
+
+  rc = verify_chv2 (app, pincb, pincb_arg);
+  if (!rc)
+    rc = iso7816_decipher (app->slot, indata, indatalen, 0,
+                           outdata, outdatalen);
+  return rc;
+}
+
+
+/* Perform a simple verify operation for CHV1 and CHV2, so that
+   further operations won't ask for CHV2 and it is possible to do a
+   cheap check on the PIN: If there is something wrong with the PIN
+   entry system, only the regular CHV will get blocked and not the
+   dangerous CHV3.  KEYIDSTR is the usual card's serial number; an
+   optional fingerprint part will be ignored.
+
+   There is a special mode if the keyidstr is "<serialno>[CHV3]" with
+   the "[CHV3]" being a literal string:  The Admin Pin is checked if
+   and only if the retry counter is still at 3. */
+static gpg_error_t 
+do_check_pin (app_t app, const char *keyidstr,
+              gpg_error_t (*pincb)(void*, const char *, char **),
+              void *pincb_arg)
+{
+  unsigned char tmp_sn[20]; 
+  const char *s;
+  int n;
+  int admin_pin = 0;
+
+  if (!keyidstr || !*keyidstr)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  /* Check whether an OpenPGP card of any version has been requested. */
+  if (strlen (keyidstr) < 32 || strncmp (keyidstr, "D27600012401", 12))
+    return gpg_error (GPG_ERR_INV_ID);
+  
+  for (s=keyidstr, n=0; hexdigitp (s); s++, n++)
+    ;
+  if (n != 32)
+    return gpg_error (GPG_ERR_INV_ID);
+  else if (!*s)
+    ; /* No fingerprint given: we allow this for now. */
+  else if (*s == '/')
+    ; /* We ignore a fingerprint. */
+  else if (!strcmp (s, "[CHV3]") )
+    admin_pin = 1;
+  else
+    return gpg_error (GPG_ERR_INV_ID);
+
+  for (s=keyidstr, n=0; n < 16; s += 2, n++)
+    tmp_sn[n] = xtoi_2 (s);
+
+  if (app->serialnolen != 16)
+    return gpg_error (GPG_ERR_INV_CARD);
+  if (memcmp (app->serialno, tmp_sn, 16))
+    return gpg_error (GPG_ERR_WRONG_CARD);
+
+  /* Yes, there is a race conditions: The user might pull the card
+     right here and we won't notice that.  However this is not a
+     problem and the check above is merely for a graceful failure
+     between operations. */
+
+  if (admin_pin)
+    {
+      void *relptr;
+      unsigned char *value;
+      size_t valuelen;
+      int count;
+      
+      relptr = get_one_do (app, 0x00C4, &value, &valuelen, NULL);
+      if (!relptr || valuelen < 7)
+        {
+          log_error (_("error retrieving CHV status from card\n"));
+          xfree (relptr);
+          return gpg_error (GPG_ERR_CARD);
+        }
+      count = value[6];
+      xfree (relptr);
+
+      if (!count)
+        {
+          log_info (_("card is permanently locked!\n"));
+          return gpg_error (GPG_ERR_BAD_PIN);
+        }
+      else if (value[6] < 3)
+        {
+          log_info (_("verification of Admin PIN is currently prohibited "
+                      "through this command\n"));
+          return gpg_error (GPG_ERR_GENERAL);
+        }
+
+      app->did_chv3 = 0; /* Force verification.  */
+      return verify_chv3 (app, pincb, pincb_arg);
+    }
+  else
+    return verify_chv2 (app, pincb, pincb_arg);
+}
+
+
+
+
+/* Select the OpenPGP application on the card in SLOT.  This function
+   must be used before any other OpenPGP application functions. */
+gpg_error_t
+app_select_openpgp (app_t app)
+{
+  static char const aid[] = { 0xD2, 0x76, 0x00, 0x01, 0x24, 0x01 };
+  int slot = app->slot;
+  int rc;
+  unsigned char *buffer;
+  size_t buflen;
+  void *relptr;
+  
+  rc = iso7816_select_application (slot, aid, sizeof aid);
+  if (!rc)
+    {
+      unsigned int manufacturer;
+
+      app->apptype = "OPENPGP";
+
+      app->did_chv1 = 0;
+      app->did_chv2 = 0;
+      app->did_chv3 = 0;
+      app->app_local = NULL;
+
+      /* The OpenPGP card returns the serial number as part of the
+         AID; because we prefer to use OpenPGP serial numbers, we
+         replace a possibly already set one from a EF.GDO with this
+         one.  Note, that for current OpenPGP cards, no EF.GDO exists
+         and thus it won't matter at all. */
+      rc = iso7816_get_data (slot, 0x004F, &buffer, &buflen);
+      if (rc)
+        goto leave;
+      if (opt.verbose)
+        {
+          log_info ("AID: ");
+          log_printhex ("", buffer, buflen);
+        }
+
+      app->card_version = buffer[6] << 8;
+      app->card_version |= buffer[7];
+      manufacturer = (buffer[8]<<8 | buffer[9]);
+
+      xfree (app->serialno);
+      app->serialno = buffer;
+      app->serialnolen = buflen;
+      buffer = NULL;
+      app->app_local = xtrycalloc (1, sizeof *app->app_local);
+      if (!app->app_local)
+        {
+          rc = gpg_error (gpg_err_code_from_errno (errno));
+          goto leave;
+        }
+
+      relptr = get_one_do (app, 0x00C4, &buffer, &buflen, NULL);
+      if (!relptr)
+        {
+          log_error (_("can't access %s - invalid OpenPGP card?\n"),
+                     "CHV Status Bytes");
+          goto leave;
+        }
+      app->force_chv1 = (buflen && *buffer == 0);
+      xfree (relptr);
+
+      relptr = get_one_do (app, 0x00C0, &buffer, &buflen, NULL);
+      if (!relptr)
+        {
+          log_error (_("can't access %s - invalid OpenPGP card?\n"),
+                     "Extended Capability Flags" );
+          goto leave;
+        }
+      if (buflen)
+        {
+          app->app_local->extcap.get_challenge    = !!(*buffer & 0x40);
+          app->app_local->extcap.key_import       = !!(*buffer & 0x20);
+          app->app_local->extcap.change_force_chv = !!(*buffer & 0x10);
+          app->app_local->extcap.private_dos      = !!(*buffer & 0x08);
+        }
+      xfree (relptr);
+      
+      /* Some of the first cards accidently don't set the
+         CHANGE_FORCE_CHV bit but allow it anyway. */
+      if (app->card_version <= 0x0100 && manufacturer == 1)
+        app->app_local->extcap.change_force_chv = 1;
+
+      parse_login_data (app);
+
+      if (opt.verbose > 1)
+        dump_all_do (slot);
+
+      app->fnc.deinit = do_deinit;
+      app->fnc.learn_status = do_learn_status;
+      app->fnc.readkey = do_readkey;
+      app->fnc.getattr = do_getattr;
+      app->fnc.setattr = do_setattr;
+      app->fnc.writekey = do_writekey;
+      app->fnc.genkey = do_genkey;
+      app->fnc.sign = do_sign;
+      app->fnc.auth = do_auth;
+      app->fnc.decipher = do_decipher;
+      app->fnc.change_pin = do_change_pin;
+      app->fnc.check_pin = do_check_pin;
+   }
+
+leave:
+  if (rc)
+    do_deinit (app);
+  return rc;
+}
+
+
+
diff --git a/g10/armor.c b/g10/armor.c
new file mode 100644 (file)
index 0000000..65804a7
--- /dev/null
@@ -0,0 +1,1474 @@
+/* armor.c - Armor flter
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "filter.h"
+#include "packet.h"
+#include "options.h"
+#include "main.h"
+#include "status.h"
+#include "i18n.h"
+
+#define MAX_LINELEN 20000
+
+#define CRCINIT 0xB704CE
+#define CRCPOLY 0X864CFB
+#define CRCUPDATE(a,c) do {                                                \
+                       a = ((a) << 8) ^ crc_table[((a)&0xff >> 16) ^ (c)]; \
+                       a &= 0x00ffffff;                                    \
+                   } while(0)
+static u32 crc_table[256];
+static byte bintoasc[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                        "abcdefghijklmnopqrstuvwxyz"
+                        "0123456789+/";
+static byte asctobin[256]; /* runtime initialized */
+static int is_initialized;
+
+
+typedef enum {
+    fhdrHASArmor = 0,
+    fhdrNOArmor,
+    fhdrINIT,
+    fhdrINITCont,
+    fhdrINITSkip,
+    fhdrCHECKBegin,
+    fhdrWAITHeader,
+    fhdrWAITClearsig,
+    fhdrSKIPHeader,
+    fhdrCLEARSIG,
+    fhdrREADClearsig,
+    fhdrNullClearsig,
+    fhdrEMPTYClearsig,
+    fhdrCHECKClearsig,
+    fhdrCHECKClearsig2,
+    fhdrCHECKDashEscaped,
+    fhdrCHECKDashEscaped2,
+    fhdrCHECKDashEscaped3,
+    fhdrREADClearsigNext,
+    fhdrENDClearsig,
+    fhdrENDClearsigHelp,
+    fhdrTESTSpaces,
+    fhdrCLEARSIGSimple,
+    fhdrCLEARSIGSimpleNext,
+    fhdrTEXT,
+    fhdrTEXTSimple,
+    fhdrERROR,
+    fhdrERRORShow,
+    fhdrEOF
+} fhdr_state_t;
+
+
+/* if we encounter this armor string with this index, go
+ * into a mode which fakes packets and wait for the next armor */
+#define BEGIN_SIGNATURE 2
+#define BEGIN_SIGNED_MSG_IDX 3
+static char *head_strings[] = {
+    "BEGIN PGP MESSAGE",
+    "BEGIN PGP PUBLIC KEY BLOCK",
+    "BEGIN PGP SIGNATURE",
+    "BEGIN PGP SIGNED MESSAGE",
+    "BEGIN PGP ARMORED FILE",       /* gnupg extension */
+    "BEGIN PGP PRIVATE KEY BLOCK",
+    "BEGIN PGP SECRET KEY BLOCK",   /* only used by pgp2 */
+    NULL
+};
+static char *tail_strings[] = {
+    "END PGP MESSAGE",
+    "END PGP PUBLIC KEY BLOCK",
+    "END PGP SIGNATURE",
+    "END dummy",
+    "END PGP ARMORED FILE",
+    "END PGP PRIVATE KEY BLOCK",
+    "END PGP SECRET KEY BLOCK",
+    NULL
+};
+
+
+/* Create a new context for armor filters.  */
+armor_filter_context_t *
+new_armor_context (void)
+{
+  armor_filter_context_t *afx;
+
+  afx = xcalloc (1, sizeof *afx);
+  afx->refcount = 1;
+
+  return afx;
+}
+
+/* Release an armor filter context.  Passing NULL is explicitly
+   allowed and a no-op.  */
+void
+release_armor_context (armor_filter_context_t *afx)
+{
+  if (!afx)
+    return;
+
+  /* In contrast to 2.0, we use in 1.4 heap based contexts only in a
+     very few places and in general keep the stack based contexts.  A
+     REFCOUNT of 0 indicates a stack based context and thus we don't
+     do anything in this case. */
+  if (!afx->refcount)
+    return;
+
+  if ( --afx->refcount )
+    return;
+  xfree (afx);
+}
+
+/* Push the armor filter onto the iobuf stream IOBUF.  */
+int
+push_armor_filter (armor_filter_context_t *afx, iobuf_t iobuf)
+{
+  int rc; 
+
+  if (!afx->refcount)
+    return iobuf_push_filter (iobuf, armor_filter, afx);
+    
+  afx->refcount++;
+  rc = iobuf_push_filter (iobuf, armor_filter, afx);
+  if (rc)
+    afx->refcount--;
+  return rc;
+}
+
+
+
+
+
+static void
+initialize(void)
+{
+    int i, j;
+    u32 t;
+    byte *s;
+
+    /* init the crc lookup table */
+    crc_table[0] = 0;
+    for(i=j=0; j < 128; j++ ) {
+       t = crc_table[j];
+       if( t & 0x00800000 ) {
+           t <<= 1;
+           crc_table[i++] = t ^ CRCPOLY;
+           crc_table[i++] = t;
+       }
+       else {
+           t <<= 1;
+           crc_table[i++] = t;
+           crc_table[i++] = t ^ CRCPOLY;
+       }
+    }
+    /* build the helptable for radix64 to bin conversion */
+    for(i=0; i < 256; i++ )
+       asctobin[i] = 255; /* used to detect invalid characters */
+    for(s=bintoasc,i=0; *s; s++,i++ )
+       asctobin[*s] = i;
+
+    is_initialized=1;
+}
+
+/****************
+ * Check whether this is an armored file or not See also
+ * parse-packet.c for details on this code For unknown historic
+ * reasons we use a string here but only the first byte will be used.
+ * Returns: True if it seems to be armored
+ */
+static int
+is_armored( const byte *buf )
+{
+    int ctb, pkttype;
+
+    ctb = *buf;
+    if( !(ctb & 0x80) )
+       return 1; /* invalid packet: assume it is armored */
+    pkttype =  ctb & 0x40 ? (ctb & 0x3f) : ((ctb>>2)&0xf);
+    switch( pkttype ) {
+      case PKT_MARKER:
+      case PKT_SYMKEY_ENC:
+      case PKT_ONEPASS_SIG:
+      case PKT_PUBLIC_KEY:
+      case PKT_SECRET_KEY:
+      case PKT_PUBKEY_ENC:
+      case PKT_SIGNATURE:
+      case PKT_COMMENT:
+      case PKT_OLD_COMMENT:
+      case PKT_PLAINTEXT:
+      case PKT_COMPRESSED:
+      case PKT_ENCRYPTED:
+       return 0; /* seems to be a regular packet: not armored */
+    }
+
+    return 1;
+}
+
+
+/****************
+ * Try to check whether the iobuf is armored
+ * Returns true if this may be the case; the caller should use the
+ *        filter to do further processing.
+ */
+int
+use_armor_filter( IOBUF a )
+{
+    byte buf[1];
+    int n;
+
+    /* fixme: there might be a problem with iobuf_peek */
+    n = iobuf_peek(a, buf, 1 );
+    if( n == -1 )
+       return 0; /* EOF, doesn't matter whether armored or not */
+    if( !n )
+       return 1; /* can't check it: try armored */
+    return is_armored(buf);
+}
+
+
+
+
+static void
+invalid_armor(void)
+{
+    write_status(STATUS_BADARMOR);
+    g10_exit(1); /* stop here */
+}
+
+
+/****************
+ * check whether the armor header is valid on a signed message.
+ * this is for security reasons: the header lines are not included in the
+ * hash and by using some creative formatting rules, Mallory could fake
+ * any text at the beginning of a document; assuming it is read with
+ * a simple viewer. We only allow the Hash Header.
+ */
+static int
+parse_hash_header( const char *line )
+{
+    const char *s, *s2;
+    unsigned found = 0;
+
+    if( strlen(line) < 6  || strlen(line) > 60 )
+       return 0; /* too short or too long */
+    if( memcmp( line, "Hash:", 5 ) )
+       return 0; /* invalid header */
+    s = line+5;
+    for(s=line+5;;s=s2) {
+       for(; *s && (*s==' ' || *s == '\t'); s++ )
+           ;
+       if( !*s )
+           break;
+       for(s2=s+1; *s2 && *s2!=' ' && *s2 != '\t' && *s2 != ','; s2++ )
+           ;
+       if( !strncmp( s, "RIPEMD160", s2-s ) )
+           found |= 1;
+       else if( !strncmp( s, "SHA1", s2-s ) )
+           found |= 2;
+       else if( !strncmp( s, "MD5", s2-s ) )
+           found |= 4;
+       else if( !strncmp( s, "SHA224", s2-s ) )
+           found |= 8;
+       else if( !strncmp( s, "SHA256", s2-s ) )
+           found |= 16;
+       else if( !strncmp( s, "SHA384", s2-s ) )
+           found |= 32;
+       else if( !strncmp( s, "SHA512", s2-s ) )
+           found |= 64;
+       else
+           return 0;
+       for(; *s2 && (*s2==' ' || *s2 == '\t'); s2++ )
+           ;
+       if( *s2 && *s2 != ',' )
+           return 0;
+       if( *s2 )
+           s2++;
+    }
+    return found;
+}
+
+
+
+/****************
+ * Check whether this is a armor line.
+ * returns: -1 if it is not a armor header or the index number of the
+ * armor header.
+ */
+static int
+is_armor_header( byte *line, unsigned len )
+{
+    const char *s;
+    byte *save_p, *p;
+    int save_c;
+    int i;
+
+    if( len < 15 )
+       return -1; /* too short */
+    if( memcmp( line, "-----", 5 ) )
+       return -1; /* no */
+    p = strstr( line+5, "-----");
+    if( !p )
+       return -1;
+    save_p = p;
+    p += 5;
+
+    /* Some Windows environments seem to add whitespace to the end of
+       the line, so we strip it here.  This becomes strict if
+       --rfc2440 is set since 2440 reads "The header lines, therefore,
+       MUST start at the beginning of a line, and MUST NOT have text
+       following them on the same line."  It is unclear whether "text"
+       refers to all text or just non-whitespace text. */
+
+    if(RFC2440)
+      {
+       if( *p == '\r' )
+         p++;
+       if( *p == '\n' )
+         p++;
+      }
+    else
+      while(*p==' ' || *p=='\r' || *p=='\n' || *p=='\t')
+       p++;
+
+    if( *p )
+       return -1; /* garbage after dashes */
+    save_c = *save_p; *save_p = 0;
+    p = line+5;
+    for(i=0; (s=head_strings[i]); i++ )
+       if( !strcmp(s, p) )
+           break;
+    *save_p = save_c;
+    if( !s )
+       return -1; /* unknown armor line */
+
+    if( opt.verbose > 1 )
+       log_info(_("armor: %s\n"), head_strings[i]);
+    return i;
+}
+
+
+
+/****************
+ * Parse a header lines
+ * Return 0: Empty line (end of header lines)
+ *      -1: invalid header line
+ *      >0: Good header line
+ */
+static int
+parse_header_line( armor_filter_context_t *afx, byte *line, unsigned int len )
+{
+    byte *p;
+    int hashes=0;
+    unsigned int len2;
+
+    len2 = check_trailing_ws( line, len );
+    if( !len2 ) {
+        afx->buffer_pos = len2;  /* (it is not the fine way to do it here) */
+       return 0; /* WS only: same as empty line */
+    }
+
+    /*
+      This is fussy.  The spec says that a header line is delimited
+      with a colon-space pair.  This means that a line such as
+      "Comment: " (with nothing else) is actually legal as an empty
+      string comment.  However, email and cut-and-paste being what it
+      is, that trailing space may go away.  Therefore, we accept empty
+      headers delimited with only a colon.  --rfc2440, as always,
+      makes this strict and enforces the colon-space pair. -dms
+    */
+
+    p = strchr( line, ':');
+    if( !p || (RFC2440 && p[1]!=' ')
+       || (!RFC2440 && p[1]!=' ' && p[1]!='\n' && p[1]!='\r'))
+      {
+       log_error(_("invalid armor header: "));
+       print_string( stderr, line, len, 0 );
+       putc('\n', stderr);
+       return -1;
+      }
+
+    /* Chop off the whitespace we detected before */
+    len=len2;
+    line[len2]='\0';
+
+    if( opt.verbose ) {
+       log_info(_("armor header: "));
+       print_string( stderr, line, len, 0 );
+       putc('\n', stderr);
+    }
+
+    if( afx->in_cleartext ) {
+       if( (hashes=parse_hash_header( line )) )
+           afx->hashes |= hashes;
+       else if( strlen(line) > 15 && !memcmp( line, "NotDashEscaped:", 15 ) )
+           afx->not_dash_escaped = 1;
+       else {
+           log_error(_("invalid clearsig header\n"));
+           return -1;
+       }
+    }
+    return 1;
+}
+
+
+
+/* figure out whether the data is armored or not */
+static int
+check_input( armor_filter_context_t *afx, IOBUF a )
+{
+    int rc = 0;
+    int i;
+    byte *line;
+    unsigned len;
+    unsigned maxlen;
+    int hdr_line = -1;
+
+    /* read the first line to see whether this is armored data */
+    maxlen = MAX_LINELEN;
+    len = afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                            &afx->buffer_size, &maxlen );
+    line = afx->buffer;
+    if( !maxlen ) {
+       /* line has been truncated: assume not armored */
+       afx->inp_checked = 1;
+       afx->inp_bypass = 1;
+       return 0;
+    }
+
+    if( !len ) {
+       return -1; /* eof */
+    }
+
+    /* (the line is always a C string but maybe longer) */
+    if( *line == '\n' || ( len && (*line == '\r' && line[1]=='\n') ) )
+       ;
+    else if( !is_armored( line ) ) {
+       afx->inp_checked = 1;
+       afx->inp_bypass = 1;
+       return 0;
+    }
+
+    /* find the armor header */
+    while(len) {
+       i = is_armor_header( line, len );
+       if( i >= 0 && !(afx->only_keyblocks && i != 1 && i != 5 && i != 6 )) {
+           hdr_line = i;
+           if( hdr_line == BEGIN_SIGNED_MSG_IDX ) {
+               if( afx->in_cleartext ) {
+                   log_error(_("nested clear text signatures\n"));
+                   rc = G10ERR_INVALID_ARMOR;
+               }
+               afx->in_cleartext = 1;
+           }
+           break;
+       }
+       /* read the next line (skip all truncated lines) */
+       do {
+           maxlen = MAX_LINELEN;
+           afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                              &afx->buffer_size, &maxlen );
+           line = afx->buffer;
+           len = afx->buffer_len;
+       } while( !maxlen );
+    }
+
+    /* Parse the header lines.  */
+    while(len) {
+       /* Read the next line (skip all truncated lines). */
+       do {
+           maxlen = MAX_LINELEN;
+           afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                              &afx->buffer_size, &maxlen );
+           line = afx->buffer;
+           len = afx->buffer_len;
+       } while( !maxlen );
+
+       i = parse_header_line( afx, line, len );
+       if( i <= 0 ) {
+           if (i && RFC2440)
+               rc = G10ERR_INVALID_ARMOR;
+           break;
+       }
+    }
+
+
+    if( rc )
+       invalid_armor();
+    else if( afx->in_cleartext )
+       afx->faked = 1;
+    else {
+       afx->inp_checked = 1;
+       afx->crc = CRCINIT;
+       afx->idx = 0;
+       afx->radbuf[0] = 0;
+    }
+
+    return rc;
+}
+
+#define PARTIAL_CHUNK 512
+#define PARTIAL_POW   9
+
+/****************
+ * Fake a literal data packet and wait for the next armor line
+ * fixme: empty line handling and null length clear text signature are
+ *       not implemented/checked.
+ */
+static int
+fake_packet( armor_filter_context_t *afx, IOBUF a,
+            size_t *retn, byte *buf, size_t size  )
+{
+    int rc = 0;
+    size_t len = 0;
+    int lastline = 0;
+    unsigned maxlen, n;
+    byte *p;
+    byte tempbuf[PARTIAL_CHUNK];
+    size_t tempbuf_len=0;
+
+    while( !rc && size-len>=(PARTIAL_CHUNK+1)) {
+       /* copy what we have in the line buffer */
+       if( afx->faked == 1 )
+           afx->faked++; /* skip the first (empty) line */
+       else
+         {
+           /* It's full, so write this partial chunk */
+           if(tempbuf_len==PARTIAL_CHUNK)
+             {
+               buf[len++]=0xE0+PARTIAL_POW;
+               memcpy(&buf[len],tempbuf,PARTIAL_CHUNK);
+               len+=PARTIAL_CHUNK;
+               tempbuf_len=0;
+               continue;
+             }
+
+           while( tempbuf_len < PARTIAL_CHUNK
+                  && afx->buffer_pos < afx->buffer_len )
+             tempbuf[tempbuf_len++] = afx->buffer[afx->buffer_pos++];
+           if( tempbuf_len==PARTIAL_CHUNK )
+             continue;
+         }
+
+       /* read the next line */
+       maxlen = MAX_LINELEN;
+       afx->buffer_pos = 0;
+       afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                          &afx->buffer_size, &maxlen );
+       if( !afx->buffer_len ) {
+           rc = -1; /* eof (should not happen) */
+           continue;
+       }
+       if( !maxlen )
+           afx->truncated++;
+
+       p = afx->buffer;
+       n = afx->buffer_len;
+
+       /* Armor header or dash-escaped line? */
+       if(p[0]=='-')
+         {
+           /* 2440bis-10: When reversing dash-escaping, an
+              implementation MUST strip the string "- " if it occurs
+              at the beginning of a line, and SHOULD warn on "-" and
+              any character other than a space at the beginning of a
+              line.  */
+
+           if(p[1]==' ' && !afx->not_dash_escaped)
+             {
+               /* It's a dash-escaped line, so skip over the
+                  escape. */
+               afx->buffer_pos = 2;
+             }
+           else if(p[1]=='-' && p[2]=='-' && p[3]=='-' && p[4]=='-')
+             {
+               /* Five dashes in a row mean it's probably armor
+                  header. */
+               int type = is_armor_header( p, n );
+               if( afx->not_dash_escaped && type != BEGIN_SIGNATURE )
+                 ; /* this is okay */
+               else
+                 {
+                   if( type != BEGIN_SIGNATURE )
+                     {
+                       log_info(_("unexpected armor: "));
+                       print_string( stderr, p, n, 0 );
+                       putc('\n', stderr);
+                     }
+
+                   lastline = 1;
+                   rc = -1;
+                 }
+             }
+           else if(!afx->not_dash_escaped)
+             {
+               /* Bad dash-escaping. */
+               log_info(_("invalid dash escaped line: "));
+               print_string( stderr, p, n, 0 );
+               putc('\n', stderr);
+             }
+         }
+
+       /* Now handle the end-of-line canonicalization */
+       if( !afx->not_dash_escaped )
+         {
+           int crlf = n > 1 && p[n-2] == '\r' && p[n-1]=='\n';
+
+           /* PGP2 does not treat a tab as white space character */
+           afx->buffer_len=
+             trim_trailing_chars( &p[afx->buffer_pos], n-afx->buffer_pos,
+                                  afx->pgp2mode ? " \r\n" : " \t\r\n");
+           afx->buffer_len+=afx->buffer_pos;
+           /* the buffer is always allocated with enough space to append
+            * the removed [CR], LF and a Nul
+            * The reason for this complicated procedure is to keep at least
+            * the original type of lineending - handling of the removed
+            * trailing spaces seems to be impossible in our method
+            * of faking a packet; either we have to use a temporary file
+            * or calculate the hash here in this module and somehow find
+            * a way to send the hash down the processing line (well, a special
+            * faked packet could do the job).
+            */
+           if( crlf )
+             afx->buffer[afx->buffer_len++] = '\r';
+           afx->buffer[afx->buffer_len++] = '\n';
+           afx->buffer[afx->buffer_len] = '\0';
+         }
+    }
+
+    if( lastline ) { /* write last (ending) length header */
+        if(tempbuf_len<192)
+         buf[len++]=tempbuf_len;
+       else
+         {
+           buf[len++]=((tempbuf_len-192)/256) + 192;
+           buf[len++]=(tempbuf_len-192) % 256;
+         }
+       memcpy(&buf[len],tempbuf,tempbuf_len);
+       len+=tempbuf_len;
+
+       rc = 0;
+       afx->faked = 0;
+       afx->in_cleartext = 0;
+       /* and now read the header lines */
+       afx->buffer_pos = 0;
+       for(;;) {
+           int i;
+
+           /* read the next line (skip all truncated lines) */
+           do {
+               maxlen = MAX_LINELEN;
+               afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                                &afx->buffer_size, &maxlen );
+           } while( !maxlen );
+           p = afx->buffer;
+           n = afx->buffer_len;
+           if( !n ) {
+               rc = -1;
+               break; /* eof */
+           }
+           i = parse_header_line( afx, p , n );
+           if( i <= 0 ) {
+               if( i )
+                   invalid_armor();
+               break;
+           }
+       }
+       afx->inp_checked = 1;
+       afx->crc = CRCINIT;
+       afx->idx = 0;
+       afx->radbuf[0] = 0;
+    }
+
+    *retn = len;
+    return rc;
+}
+
+
+static int
+invalid_crc(void)
+{
+    if ( opt.ignore_crc_error )
+        return 0;
+    log_inc_errorcount();
+    return G10ERR_INVALID_ARMOR;
+}
+
+
+static int
+radix64_read( armor_filter_context_t *afx, IOBUF a, size_t *retn,
+             byte *buf, size_t size )
+{
+    byte val;
+    int c=0, c2; /*init c because gcc is not clever enough for the continue*/
+    int checkcrc=0;
+    int rc = 0;
+    size_t n = 0;
+    int  idx, i, onlypad=0;
+    u32 crc;
+
+    crc = afx->crc;
+    idx = afx->idx;
+    val = afx->radbuf[0];
+    for( n=0; n < size; ) {
+
+       if( afx->buffer_pos < afx->buffer_len )
+           c = afx->buffer[afx->buffer_pos++];
+       else { /* read the next line */
+           unsigned maxlen = MAX_LINELEN;
+           afx->buffer_pos = 0;
+           afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                              &afx->buffer_size, &maxlen );
+           if( !maxlen )
+               afx->truncated++;
+           if( !afx->buffer_len )
+               break; /* eof */
+           continue;
+       }
+
+      again:
+       if( c == '\n' || c == ' ' || c == '\r' || c == '\t' )
+           continue;
+       else if( c == '=' ) { /* pad character: stop */
+           /* some mailers leave quoted-printable encoded characters
+            * so we try to workaround this */
+           if( afx->buffer_pos+2 < afx->buffer_len ) {
+               int cc1, cc2, cc3;
+               cc1 = afx->buffer[afx->buffer_pos];
+               cc2 = afx->buffer[afx->buffer_pos+1];
+               cc3 = afx->buffer[afx->buffer_pos+2];
+               if( isxdigit(cc1) && isxdigit(cc2)
+                                 && strchr( "=\n\r\t ", cc3 )) {
+                   /* well it seems to be the case - adjust */
+                   c = isdigit(cc1)? (cc1 - '0'): (ascii_toupper(cc1)-'A'+10);
+                   c <<= 4;
+                   c |= isdigit(cc2)? (cc2 - '0'): (ascii_toupper(cc2)-'A'+10);
+                   afx->buffer_pos += 2;
+                   afx->qp_detected = 1;
+                   goto again;
+               }
+           }
+           else if(n==0)
+             onlypad=1;
+
+           if( idx == 1 )
+               buf[n++] = val;
+           checkcrc++;
+           break;
+       }
+       else if( (c = asctobin[(c2=c)]) == 255 ) {
+           log_error(_("invalid radix64 character %02X skipped\n"), c2);
+           continue;
+       }
+       switch(idx) {
+         case 0: val =  c << 2; break;
+         case 1: val |= (c>>4)&3; buf[n++]=val;val=(c<<4)&0xf0;break;
+         case 2: val |= (c>>2)&15; buf[n++]=val;val=(c<<6)&0xc0;break;
+         case 3: val |= c&0x3f; buf[n++] = val; break;
+       }
+       idx = (idx+1) % 4;
+    }
+
+    for(i=0; i < n; i++ )
+       crc = (crc << 8) ^ crc_table[((crc >> 16)&0xff) ^ buf[i]];
+    crc &= 0x00ffffff;
+    afx->crc = crc;
+    afx->idx = idx;
+    afx->radbuf[0] = val;
+
+    if( checkcrc ) {
+       afx->any_data = 1;
+       afx->inp_checked=0;
+       afx->faked = 0;
+       for(;;) { /* skip lf and pad characters */
+           if( afx->buffer_pos < afx->buffer_len )
+               c = afx->buffer[afx->buffer_pos++];
+           else { /* read the next line */
+               unsigned maxlen = MAX_LINELEN;
+               afx->buffer_pos = 0;
+               afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                                  &afx->buffer_size, &maxlen );
+               if( !maxlen )
+                   afx->truncated++;
+               if( !afx->buffer_len )
+                   break; /* eof */
+               continue;
+           }
+           if( c == '\n' || c == ' ' || c == '\r'
+               || c == '\t' || c == '=' )
+               continue;
+           break;
+       }
+       if( c == -1 )
+           log_error(_("premature eof (no CRC)\n"));
+       else {
+           u32 mycrc = 0;
+           idx = 0;
+           do {
+               if( (c = asctobin[c]) == 255 )
+                   break;
+               switch(idx) {
+                 case 0: val =  c << 2; break;
+                 case 1: val |= (c>>4)&3; mycrc |= val << 16;val=(c<<4)&0xf0;break;
+                 case 2: val |= (c>>2)&15; mycrc |= val << 8;val=(c<<6)&0xc0;break;
+                 case 3: val |= c&0x3f; mycrc |= val; break;
+               }
+               for(;;) {
+                   if( afx->buffer_pos < afx->buffer_len )
+                       c = afx->buffer[afx->buffer_pos++];
+                   else { /* read the next line */
+                       unsigned maxlen = MAX_LINELEN;
+                       afx->buffer_pos = 0;
+                       afx->buffer_len = iobuf_read_line( a, &afx->buffer,
+                                                          &afx->buffer_size,
+                                                               &maxlen );
+                       if( !maxlen )
+                           afx->truncated++;
+                       if( !afx->buffer_len )
+                           break; /* eof */
+                       continue;
+                   }
+                   break;
+               }
+               if( !afx->buffer_len )
+                   break; /* eof */
+           } while( ++idx < 4 );
+           if( c == -1 ) {
+               log_info(_("premature eof (in CRC)\n"));
+               rc = invalid_crc();
+           }
+           else if( idx == 0 ) {
+               /* No CRC at all is legal ("MAY") */
+               rc=0;
+           }
+           else if( idx != 4 ) {
+               log_info(_("malformed CRC\n"));
+               rc = invalid_crc();
+           }
+           else if( mycrc != afx->crc ) {
+                log_info (_("CRC error; %06lX - %06lX\n"),
+                                   (ulong)afx->crc, (ulong)mycrc);
+                rc = invalid_crc();
+           }
+           else {
+               rc = 0;
+                /* FIXME: Here we should emit another control packet,
+                 * so that we know in mainproc that we are processing
+                 * a clearsign message */
+#if 0
+               for(rc=0;!rc;) {
+                   rc = 0 /*check_trailer( &fhdr, c )*/;
+                   if( !rc ) {
+                       if( (c=iobuf_get(a)) == -1 )
+                           rc = 2;
+                   }
+               }
+               if( rc == -1 )
+                   rc = 0;
+               else if( rc == 2 ) {
+                   log_error(_("premature eof (in trailer)\n"));
+                   rc = G10ERR_INVALID_ARMOR;
+               }
+               else {
+                   log_error(_("error in trailer line\n"));
+                   rc = G10ERR_INVALID_ARMOR;
+               }
+#endif
+           }
+       }
+    }
+
+    if( !n && !onlypad )
+       rc = -1;
+
+    *retn = n;
+    return rc;
+}
+
+/****************
+ * This filter is used to handle the armor stuff
+ */
+int
+armor_filter( void *opaque, int control,
+            IOBUF a, byte *buf, size_t *ret_len)
+{
+    size_t size = *ret_len;
+    armor_filter_context_t *afx = opaque;
+    int rc=0, i, c;
+    byte radbuf[3];
+    int  idx, idx2;
+    size_t n=0;
+    u32 crc;
+#if 0
+    static FILE *fp ;
+
+    if( !fp ) {
+       fp = fopen("armor.out", "w");
+       assert(fp);
+    }
+#endif
+
+    if( DBG_FILTER )
+       log_debug("armor-filter: control: %d\n", control );
+    if( control == IOBUFCTRL_UNDERFLOW && afx->inp_bypass ) {
+       n = 0;
+       if( afx->buffer_len ) {
+           for(; n < size && afx->buffer_pos < afx->buffer_len; n++ )
+               buf[n++] = afx->buffer[afx->buffer_pos++];
+           if( afx->buffer_pos >= afx->buffer_len )
+               afx->buffer_len = 0;
+       }
+       for(; n < size; n++ ) {
+           if( (c=iobuf_get(a)) == -1 )
+               break;
+           buf[n] = c & 0xff;
+       }
+       if( !n )
+           rc = -1;
+       *ret_len = n;
+    }
+    else if( control == IOBUFCTRL_UNDERFLOW ) {
+        /* We need some space for the faked packet.  The minmum
+         * required size is the PARTIAL_CHUNK size plus a byte for the
+         * length itself */
+       if( size < PARTIAL_CHUNK+1 ) 
+           BUG(); /* supplied buffer too short */
+
+       if( afx->faked )
+           rc = fake_packet( afx, a, &n, buf, size );
+       else if( !afx->inp_checked ) {
+           rc = check_input( afx, a );
+           if( afx->inp_bypass ) {
+               for(n=0; n < size && afx->buffer_pos < afx->buffer_len; )
+                   buf[n++] = afx->buffer[afx->buffer_pos++];
+               if( afx->buffer_pos >= afx->buffer_len )
+                   afx->buffer_len = 0;
+               if( !n )
+                   rc = -1;
+           }
+           else if( afx->faked ) {
+               unsigned int hashes = afx->hashes;
+                const byte *sesmark;
+                size_t sesmarklen;
+                
+                sesmark = get_session_marker( &sesmarklen );
+                if ( sesmarklen > 20 )
+                    BUG();
+
+               /* the buffer is at least 15+n*15 bytes long, so it
+                * is easy to construct the packets */
+
+               hashes &= 1|2|4|8|16|32|64;
+               if( !hashes ) {
+                   hashes |= 4;  /* default to MD 5 */
+                   /* This is non-ideal since PGP 5-8 have the same
+                      end-of-line bugs as PGP 2. However, we only
+                      enable pgp2mode if there is no Hash: header. */
+                   if( opt.pgp2_workarounds )
+                       afx->pgp2mode = 1;
+               }
+               n=0;
+                /* First a gpg control packet... */
+                buf[n++] = 0xff; /* new format, type 63, 1 length byte */
+                n++;   /* see below */
+                memcpy(buf+n, sesmark, sesmarklen ); n+= sesmarklen;
+                buf[n++] = CTRLPKT_CLEARSIGN_START; 
+                buf[n++] = afx->not_dash_escaped? 0:1; /* sigclass */
+                if( hashes & 1 )
+                    buf[n++] = DIGEST_ALGO_RMD160;
+                if( hashes & 2 )
+                    buf[n++] = DIGEST_ALGO_SHA1;
+                if( hashes & 4 )
+                    buf[n++] = DIGEST_ALGO_MD5;
+                if( hashes & 8 )
+                    buf[n++] = DIGEST_ALGO_SHA224;
+                if( hashes & 16 )
+                    buf[n++] = DIGEST_ALGO_SHA256;
+                if( hashes & 32 )
+                    buf[n++] = DIGEST_ALGO_SHA384;
+                if( hashes & 64 )
+                    buf[n++] = DIGEST_ALGO_SHA512;
+                buf[1] = n - 2;
+
+               /* ...followed by an invented plaintext packet.
+                  Amusingly enough, this packet is not compliant with
+                  2440 as the initial partial length is less than 512
+                  bytes.  Of course, we'll accept it anyway ;) */
+
+               buf[n++] = 0xCB; /* new packet format, type 11 */
+               buf[n++] = 0xE1; /* 2^1 == 2 bytes */
+               buf[n++] = 't';  /* canonical text mode */
+               buf[n++] = 0;    /* namelength */
+               buf[n++] = 0xE2; /* 2^2 == 4 more bytes */
+               memset(buf+n, 0, 4); /* timestamp */
+               n += 4;
+           }
+           else if( !rc )
+               rc = radix64_read( afx, a, &n, buf, size );
+       }
+       else
+           rc = radix64_read( afx, a, &n, buf, size );
+#if 0
+       if( n )
+           if( fwrite(buf, n, 1, fp ) != 1 )
+               BUG();
+#endif
+       *ret_len = n;
+    }
+    else if( control == IOBUFCTRL_FLUSH && !afx->cancel ) {
+       if( !afx->status ) { /* write the header line */
+           const char *s;
+           STRLIST comment=opt.comments;
+
+           if( afx->what >= DIM(head_strings) )
+               log_bug("afx->what=%d", afx->what);
+           iobuf_writestr(a, "-----");
+           iobuf_writestr(a, head_strings[afx->what] );
+           iobuf_writestr(a, "-----" );
+           iobuf_writestr(a,afx->eol);
+           if( !opt.no_version )
+             {
+               iobuf_writestr(a, "Version: GnuPG v"  VERSION " ("
+                              PRINTABLE_OS_NAME ")" );
+               iobuf_writestr(a,afx->eol);
+             }
+
+           /* write the comment strings */
+           for(s=comment->d;comment;comment=comment->next,s=comment->d)
+             {
+               iobuf_writestr(a, "Comment: " );
+               for( ; *s; s++ )
+                 {
+                   if( *s == '\n' )
+                     iobuf_writestr(a, "\\n" );
+                   else if( *s == '\r' )
+                     iobuf_writestr(a, "\\r" );
+                   else if( *s == '\v' )
+                     iobuf_writestr(a, "\\v" );
+                   else
+                     iobuf_put(a, *s );
+                 }
+
+               iobuf_writestr(a,afx->eol);
+             }
+
+           if ( afx->hdrlines ) {
+                for ( s = afx->hdrlines; *s; s++ ) {
+#ifdef HAVE_DOSISH_SYSTEM
+                    if ( *s == '\n' )
+                        iobuf_put( a, '\r');
+#endif
+                    iobuf_put(a, *s );
+                }
+            }
+
+           iobuf_writestr(a,afx->eol);
+           afx->status++;
+           afx->idx = 0;
+           afx->idx2 = 0;
+           afx->crc = CRCINIT;
+
+       }
+       crc = afx->crc;
+       idx = afx->idx;
+       idx2 = afx->idx2;
+       for(i=0; i < idx; i++ )
+           radbuf[i] = afx->radbuf[i];
+
+       for(i=0; i < size; i++ )
+           crc = (crc << 8) ^ crc_table[((crc >> 16)&0xff) ^ buf[i]];
+       crc &= 0x00ffffff;
+
+       for( ; size; buf++, size-- ) {
+           radbuf[idx++] = *buf;
+           if( idx > 2 ) {
+               idx = 0;
+               c = bintoasc[(*radbuf >> 2) & 077];
+               iobuf_put(a, c);
+               c = bintoasc[(((*radbuf<<4)&060)|((radbuf[1] >> 4)&017))&077];
+               iobuf_put(a, c);
+               c = bintoasc[(((radbuf[1]<<2)&074)|((radbuf[2]>>6)&03))&077];
+               iobuf_put(a, c);
+               c = bintoasc[radbuf[2]&077];
+               iobuf_put(a, c);
+               if( ++idx2 >= (64/4) )
+                 { /* pgp doesn't like 72 here */
+                   iobuf_writestr(a,afx->eol);
+                   idx2=0;
+                 }
+           }
+       }
+       for(i=0; i < idx; i++ )
+           afx->radbuf[i] = radbuf[i];
+       afx->idx = idx;
+       afx->idx2 = idx2;
+       afx->crc  = crc;
+    }
+    else if( control == IOBUFCTRL_INIT )
+      {
+       if( !is_initialized )
+         initialize();
+
+       /* Figure out what we're using for line endings if the caller
+          didn't specify. */
+       if(afx->eol[0]==0)
+         {
+#ifdef HAVE_DOSISH_SYSTEM
+           afx->eol[0]='\r';
+           afx->eol[1]='\n';
+#else
+           afx->eol[0]='\n';
+#endif
+         }
+      }
+    else if( control == IOBUFCTRL_CANCEL ) {
+       afx->cancel = 1;
+    }
+    else if( control == IOBUFCTRL_FREE ) {
+       if( afx->cancel )
+           ;
+       else if( afx->status ) { /* pad, write cecksum, and bottom line */
+           crc = afx->crc;
+           idx = afx->idx;
+           idx2 = afx->idx2;
+           for(i=0; i < idx; i++ )
+               radbuf[i] = afx->radbuf[i];
+           if( idx ) {
+               c = bintoasc[(*radbuf>>2)&077];
+               iobuf_put(a, c);
+               if( idx == 1 ) {
+                   c = bintoasc[((*radbuf << 4) & 060) & 077];
+                   iobuf_put(a, c);
+                   iobuf_put(a, '=');
+                   iobuf_put(a, '=');
+               }
+               else { /* 2 */
+                   c = bintoasc[(((*radbuf<<4)&060)|((radbuf[1]>>4)&017))&077];
+                   iobuf_put(a, c);
+                   c = bintoasc[((radbuf[1] << 2) & 074) & 077];
+                   iobuf_put(a, c);
+                   iobuf_put(a, '=');
+               }
+               if( ++idx2 >= (64/4) )
+                 { /* pgp doesn't like 72 here */
+                   iobuf_writestr(a,afx->eol);
+                   idx2=0;
+                 }
+           }
+           /* may need a linefeed */
+           if( idx2 )
+             iobuf_writestr(a,afx->eol);
+           /* write the CRC */
+           iobuf_put(a, '=');
+           radbuf[0] = crc >>16;
+           radbuf[1] = crc >> 8;
+           radbuf[2] = crc;
+           c = bintoasc[(*radbuf >> 2) & 077];
+           iobuf_put(a, c);
+           c = bintoasc[(((*radbuf<<4)&060)|((radbuf[1] >> 4)&017))&077];
+           iobuf_put(a, c);
+           c = bintoasc[(((radbuf[1]<<2)&074)|((radbuf[2]>>6)&03))&077];
+           iobuf_put(a, c);
+           c = bintoasc[radbuf[2]&077];
+           iobuf_put(a, c);
+           iobuf_writestr(a,afx->eol);
+           /* and the the trailer */
+           if( afx->what >= DIM(tail_strings) )
+               log_bug("afx->what=%d", afx->what);
+           iobuf_writestr(a, "-----");
+           iobuf_writestr(a, tail_strings[afx->what] );
+           iobuf_writestr(a, "-----" );
+           iobuf_writestr(a,afx->eol);
+       }
+       else if( !afx->any_data && !afx->inp_bypass ) {
+           log_error(_("no valid OpenPGP data found.\n"));
+           afx->no_openpgp_data = 1;
+           write_status_text( STATUS_NODATA, "1" );
+       }
+       if( afx->truncated )
+           log_info(_("invalid armor: line longer than %d characters\n"),
+                     MAX_LINELEN );
+       /* issue an error to enforce dissemination of correct software */
+       if( afx->qp_detected )
+           log_error(_("quoted printable character in armor - "
+                       "probably a buggy MTA has been used\n") );
+       xfree( afx->buffer );
+       afx->buffer = NULL;
+        release_armor_context (afx);
+    }
+    else if( control == IOBUFCTRL_DESC )
+       *(char**)buf = "armor_filter";
+    return rc;
+}
+
+
+/****************
+ * create a radix64 encoded string.
+ */
+char *
+make_radix64_string( const byte *data, size_t len )
+{
+    char *buffer, *p;
+
+    buffer = p = xmalloc( (len+2)/3*4 + 1 );
+    for( ; len >= 3 ; len -= 3, data += 3 ) {
+       *p++ = bintoasc[(data[0] >> 2) & 077];
+       *p++ = bintoasc[(((data[0] <<4)&060)|((data[1] >> 4)&017))&077];
+       *p++ = bintoasc[(((data[1]<<2)&074)|((data[2]>>6)&03))&077];
+       *p++ = bintoasc[data[2]&077];
+    }
+    if( len == 2 ) {
+       *p++ = bintoasc[(data[0] >> 2) & 077];
+       *p++ = bintoasc[(((data[0] <<4)&060)|((data[1] >> 4)&017))&077];
+       *p++ = bintoasc[((data[1]<<2)&074)];
+    }
+    else if( len == 1 ) {
+       *p++ = bintoasc[(data[0] >> 2) & 077];
+       *p++ = bintoasc[(data[0] <<4)&060];
+    }
+    *p = 0;
+    return buffer;
+}
+
+
+/***********************************************
+ *  For the pipemode command we can't use the armor filter for various
+ *  reasons, so we use this new unarmor_pump stuff to remove the armor 
+ */
+
+enum unarmor_state_e {
+    STA_init = 0,
+    STA_bypass,
+    STA_wait_newline,
+    STA_wait_dash,
+    STA_first_dash, 
+    STA_compare_header,
+    STA_found_header_wait_newline,
+    STA_skip_header_lines,
+    STA_skip_header_lines_non_ws,
+    STA_read_data,
+    STA_wait_crc,
+    STA_read_crc,
+    STA_ready
+};
+
+struct unarmor_pump_s {
+    enum unarmor_state_e state;
+    byte val;
+    int checkcrc;
+    int pos;   /* counts from 0..3 */
+    u32 crc;
+    u32 mycrc; /* the one store in the data */
+};
+
+
+
+UnarmorPump
+unarmor_pump_new (void)
+{
+    UnarmorPump x;
+
+    if( !is_initialized )
+        initialize();
+    x = xmalloc_clear (sizeof *x);
+    return x;
+}
+
+void
+unarmor_pump_release (UnarmorPump x)
+{
+    xfree (x);
+}
+
+/* 
+ * Get the next character from the ascii armor taken from the IOBUF
+ * created earlier by unarmor_pump_new().
+ * Return:  c = Character
+ *        256 = ignore this value
+ *         -1 = End of current armor 
+ *         -2 = Premature EOF (not used)
+ *         -3 = Invalid armor
+ */
+int
+unarmor_pump (UnarmorPump x, int c)
+{
+    int rval = 256; /* default is to ignore the return value */
+
+    switch (x->state) {
+      case STA_init:
+        { 
+            byte tmp[1];
+            tmp[0] = c; 
+            if ( is_armored (tmp) )
+                x->state = c == '-'? STA_first_dash : STA_wait_newline;
+            else {
+                x->state = STA_bypass;
+                return c;
+            }
+        }
+        break;
+      case STA_bypass:
+        return c; /* return here to avoid crc calculation */
+      case STA_wait_newline:
+        if (c == '\n')
+            x->state = STA_wait_dash;
+        break;
+      case STA_wait_dash:
+        x->state = c == '-'? STA_first_dash : STA_wait_newline;
+        break;
+      case STA_first_dash: /* just need for initalization */
+        x->pos = 0;
+        x->state = STA_compare_header;
+      case STA_compare_header:
+        if ( "-----BEGIN PGP SIGNATURE-----"[++x->pos] == c ) {
+            if ( x->pos == 28 ) 
+                x->state = STA_found_header_wait_newline;
+        }
+        else 
+            x->state = c == '\n'? STA_wait_dash : STA_wait_newline;
+        break;
+      case STA_found_header_wait_newline:
+        /* to make CR,LF issues easier we simply allow for white space
+           behind the 5 dashes */
+        if ( c == '\n' )
+            x->state = STA_skip_header_lines;
+        else if ( c != '\r' && c != ' ' && c != '\t' )
+            x->state = STA_wait_dash; /* garbage after the header line */
+        break;
+      case STA_skip_header_lines:
+        /* i.e. wait for one empty line */
+        if ( c == '\n' ) {
+            x->state = STA_read_data;
+            x->crc = CRCINIT;
+            x->val = 0;
+            x->pos = 0;
+        }
+        else if ( c != '\r' && c != ' ' && c != '\t' )
+            x->state = STA_skip_header_lines_non_ws;
+        break;
+      case STA_skip_header_lines_non_ws:
+        /* like above but we already encountered non white space */
+        if ( c == '\n' )
+            x->state = STA_skip_header_lines;
+        break;
+      case STA_read_data:
+        /* fixme: we don't check for the trailing dash lines but rely
+         * on the armor stop characters */
+        if( c == '\n' || c == ' ' || c == '\r' || c == '\t' )
+            break; /* skip all kind of white space */
+
+        if( c == '=' ) { /* pad character: stop */
+            if( x->pos == 1 ) /* in this case val has some value */
+                rval = x->val;
+            x->state = STA_wait_crc;
+            break;
+        }
+
+        {
+            int c2;
+            if( (c = asctobin[(c2=c)]) == 255 ) {
+                log_error(_("invalid radix64 character %02X skipped\n"), c2);
+                break;
+            }
+        }
+        
+        switch(x->pos) {
+          case 0:
+            x->val = c << 2;
+            break;
+          case 1:
+            x->val |= (c>>4)&3;
+            rval = x->val;
+            x->val = (c<<4)&0xf0;
+            break;
+          case 2:
+            x->val |= (c>>2)&15;
+            rval = x->val;
+            x->val = (c<<6)&0xc0;
+            break;
+          case 3:
+            x->val |= c&0x3f;
+            rval = x->val;
+            break;
+        }
+        x->pos = (x->pos+1) % 4;
+        break;
+      case STA_wait_crc:
+        if( c == '\n' || c == ' ' || c == '\r' || c == '\t' || c == '=' )
+            break; /* skip ws and pad characters */
+        /* assume that we are at the next line */
+        x->state = STA_read_crc;
+        x->pos = 0;
+        x->mycrc = 0;
+      case STA_read_crc:
+        if( (c = asctobin[c]) == 255 ) {
+            rval = -1; /* ready */
+            if( x->crc != x->mycrc ) {
+                log_info (_("CRC error; %06lX - %06lX\n"),
+                          (ulong)x->crc, (ulong)x->mycrc);
+                if ( invalid_crc() )
+                    rval = -3;
+            }
+            x->state = STA_ready; /* not sure whether this is correct */
+            break;
+        }
+        
+        switch(x->pos) {
+          case 0:
+            x->val = c << 2;
+            break;
+          case 1:
+            x->val |= (c>>4)&3;
+            x->mycrc |= x->val << 16;
+            x->val = (c<<4)&0xf0;
+            break;
+          case 2:
+            x->val |= (c>>2)&15;
+            x->mycrc |= x->val << 8;
+            x->val = (c<<6)&0xc0;
+            break;
+          case 3:
+            x->val |= c&0x3f;
+            x->mycrc |= x->val;
+            break;
+        }
+        x->pos = (x->pos+1) % 4;
+        break;
+      case STA_ready:
+        rval = -1;
+        break;
+    }
+
+    if ( !(rval & ~255) ) { /* compute the CRC */
+        x->crc = (x->crc << 8) ^ crc_table[((x->crc >> 16)&0xff) ^ rval];
+        x->crc &= 0x00ffffff;
+    }
+
+    return rval;
+}
diff --git a/g10/build-packet.c b/g10/build-packet.c
new file mode 100644 (file)
index 0000000..a7ac5d8
--- /dev/null
@@ -0,0 +1,1308 @@
+/* build-packet.c - assemble packets and write them
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "mpi.h"
+#include "util.h"
+#include "cipher.h"
+#include "memory.h"
+#include "i18n.h"
+#include "options.h"
+
+static int do_user_id( IOBUF out, int ctb, PKT_user_id *uid );
+static int do_public_key( IOBUF out, int ctb, PKT_public_key *pk );
+static int do_secret_key( IOBUF out, int ctb, PKT_secret_key *pk );
+static int do_symkey_enc( IOBUF out, int ctb, PKT_symkey_enc *enc );
+static int do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc );
+static u32 calc_plaintext( PKT_plaintext *pt );
+static int do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt );
+static int do_encrypted( IOBUF out, int ctb, PKT_encrypted *ed );
+static int do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed );
+static int do_compressed( IOBUF out, int ctb, PKT_compressed *cd );
+static int do_signature( IOBUF out, int ctb, PKT_signature *sig );
+static int do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops );
+
+static int calc_header_length( u32 len, int new_ctb );
+static int write_16(IOBUF inp, u16 a);
+static int write_32(IOBUF inp, u32 a);
+static int write_header( IOBUF out, int ctb, u32 len );
+static int write_sign_packet_header( IOBUF out, int ctb, u32 len );
+static int write_header2( IOBUF out, int ctb, u32 len, int hdrlen );
+static int write_new_header( IOBUF out, int ctb, u32 len, int hdrlen );
+static int write_version( IOBUF out, int ctb );
+
+/****************
+ * Build a packet and write it to INP
+ * Returns: 0 := okay
+ *        >0 := error
+ * Note: Caller must free the packet
+ */
+int
+build_packet( IOBUF out, PACKET *pkt )
+{
+    int new_ctb=0, rc=0, ctb;
+    int pkttype;
+
+    if( DBG_PACKET )
+       log_debug("build_packet() type=%d\n", pkt->pkttype );
+    assert( pkt->pkt.generic );
+
+    switch( (pkttype = pkt->pkttype) )
+      {
+      case PKT_PLAINTEXT: new_ctb = pkt->pkt.plaintext->new_ctb; break;
+      case PKT_ENCRYPTED:
+      case PKT_ENCRYPTED_MDC: new_ctb = pkt->pkt.encrypted->new_ctb; break;
+      case PKT_COMPRESSED:new_ctb = pkt->pkt.compressed->new_ctb; break;
+      case PKT_USER_ID:
+       if( pkt->pkt.user_id->attrib_data )
+         pkttype = PKT_ATTRIBUTE;
+       break;
+      default: break;
+      }
+
+    if( new_ctb || pkttype > 15 ) /* new format */
+       ctb = 0xc0 | (pkttype & 0x3f);
+    else
+       ctb = 0x80 | ((pkttype & 15)<<2);
+    switch( pkttype )
+      {
+      case PKT_ATTRIBUTE:
+      case PKT_USER_ID:
+       rc = do_user_id( out, ctb, pkt->pkt.user_id );
+       break;
+      case PKT_OLD_COMMENT:
+      case PKT_COMMENT:
+       /*
+         Ignore these.  Theoretically, this will never be called as
+         we have no way to output comment packets any longer, but
+         just in case there is some code path that would end up
+         outputting a comment that was written before comments were
+         dropped (in the public key?) this is a no-op.
+       */
+       break;
+      case PKT_PUBLIC_SUBKEY:
+      case PKT_PUBLIC_KEY:
+       rc = do_public_key( out, ctb, pkt->pkt.public_key );
+       break;
+      case PKT_SECRET_SUBKEY:
+      case PKT_SECRET_KEY:
+       rc = do_secret_key( out, ctb, pkt->pkt.secret_key );
+       break;
+      case PKT_SYMKEY_ENC:
+       rc = do_symkey_enc( out, ctb, pkt->pkt.symkey_enc );
+       break;
+      case PKT_PUBKEY_ENC:
+       rc = do_pubkey_enc( out, ctb, pkt->pkt.pubkey_enc );
+       break;
+      case PKT_PLAINTEXT:
+       rc = do_plaintext( out, ctb, pkt->pkt.plaintext );
+       break;
+      case PKT_ENCRYPTED:
+       rc = do_encrypted( out, ctb, pkt->pkt.encrypted );
+       break;
+      case PKT_ENCRYPTED_MDC:
+       rc = do_encrypted_mdc( out, ctb, pkt->pkt.encrypted );
+       break;
+      case PKT_COMPRESSED:
+       rc = do_compressed( out, ctb, pkt->pkt.compressed );
+       break;
+      case PKT_SIGNATURE:
+       rc = do_signature( out, ctb, pkt->pkt.signature );
+       break;
+      case PKT_ONEPASS_SIG:
+       rc = do_onepass_sig( out, ctb, pkt->pkt.onepass_sig );
+       break;
+      case PKT_RING_TRUST:
+       break; /* ignore it (keyring.c does write it directly)*/
+      case PKT_MDC: /* we write it directly, so we should never see it here. */
+      default:
+       log_bug("invalid packet type in build_packet()\n");
+       break;
+      }
+
+    return rc;
+}
+
+/****************
+ * calculate the length of a packet described by PKT
+ */
+u32
+calc_packet_length( PACKET *pkt )
+{
+    u32 n=0;
+    int new_ctb = 0;
+
+    assert( pkt->pkt.generic );
+    switch( pkt->pkttype ) {
+      case PKT_PLAINTEXT:
+       n = calc_plaintext( pkt->pkt.plaintext );
+       new_ctb = pkt->pkt.plaintext->new_ctb;
+       break;
+      case PKT_ATTRIBUTE:
+      case PKT_USER_ID:
+      case PKT_COMMENT:
+      case PKT_PUBLIC_KEY:
+      case PKT_SECRET_KEY:
+      case PKT_SYMKEY_ENC:
+      case PKT_PUBKEY_ENC:
+      case PKT_ENCRYPTED:
+      case PKT_SIGNATURE:
+      case PKT_ONEPASS_SIG:
+      case PKT_RING_TRUST:
+      case PKT_COMPRESSED:
+      default:
+       log_bug("invalid packet type in calc_packet_length()");
+       break;
+    }
+
+    n += calc_header_length(n, new_ctb);
+    return n;
+}
+
+static void
+write_fake_data( IOBUF out, MPI a )
+{
+    if( a ) {
+        unsigned int i;
+       void *p;
+
+       p = mpi_get_opaque( a, &i );
+       iobuf_write( out, p, i );
+    }
+}
+
+static int
+do_user_id( IOBUF out, int ctb, PKT_user_id *uid )
+{
+    if( uid->attrib_data )
+      {
+       write_header(out, ctb, uid->attrib_len);
+       if( iobuf_write( out, uid->attrib_data, uid->attrib_len ) )
+         return G10ERR_WRITE_FILE;
+      }
+    else
+      {
+        write_header2( out, ctb, uid->len, 2 );
+       if( iobuf_write( out, uid->name, uid->len ) )
+         return G10ERR_WRITE_FILE;
+      }
+    return 0;
+}
+
+static int
+do_public_key( IOBUF out, int ctb, PKT_public_key *pk )
+{
+    int rc = 0;
+    int n, i;
+    IOBUF a = iobuf_temp();
+
+    if( !pk->version )
+       iobuf_put( a, 3 );
+    else
+       iobuf_put( a, pk->version );
+    write_32(a, pk->timestamp );
+    if( pk->version < 4 ) {
+       u16 ndays;
+       if( pk->expiredate )
+           ndays = (u16)((pk->expiredate - pk->timestamp) / 86400L);
+       else
+           ndays = 0;
+       write_16(a, ndays );
+    }
+    iobuf_put(a, pk->pubkey_algo );
+    n = pubkey_get_npkey( pk->pubkey_algo );
+    if( !n )
+       write_fake_data( a, pk->pkey[0] );
+    for(i=0; i < n; i++ )
+       mpi_write(a, pk->pkey[i] );
+
+    write_header2(out, ctb, iobuf_get_temp_length(a), pk->hdrbytes);
+    if( iobuf_write_temp( out, a ) )
+       rc = G10ERR_WRITE_FILE;
+
+    iobuf_close(a);
+    return rc;
+}
+
+
+static int
+do_secret_key( IOBUF out, int ctb, PKT_secret_key *sk )
+{
+    int rc = 0;
+    int i, nskey, npkey;
+    IOBUF a = iobuf_temp(); /* build in a self-enlarging buffer */
+
+    /* Write the version number - if none is specified, use 3 */
+    if( !sk->version )
+       iobuf_put( a, 3 );
+    else
+       iobuf_put( a, sk->version );
+    write_32(a, sk->timestamp );
+
+    /* v3  needs the expiration time */
+    if( sk->version < 4 ) {
+       u16 ndays;
+       if( sk->expiredate )
+           ndays = (u16)((sk->expiredate - sk->timestamp) / 86400L);
+       else
+           ndays = 0;
+       write_16(a, ndays);
+    }
+
+    iobuf_put(a, sk->pubkey_algo );
+
+    /* get number of secret and public parameters.  They are held in
+       one array first the public ones, then the secret ones */
+    nskey = pubkey_get_nskey( sk->pubkey_algo );
+    npkey = pubkey_get_npkey( sk->pubkey_algo );
+
+    /* If we don't have any public parameters - which is the case if
+       we don't know the algorithm used - the parameters are stored as
+       one blob in a faked (opaque) MPI */
+    if( !npkey ) {
+       write_fake_data( a, sk->skey[0] );
+       goto leave;
+    }
+    assert( npkey < nskey );
+
+    /* Writing the public parameters is easy */
+    for(i=0; i < npkey; i++ )
+       mpi_write(a, sk->skey[i] );
+
+    /* build the header for protected (encrypted) secret parameters */
+    if( sk->is_protected ) {
+       if( is_RSA(sk->pubkey_algo) && sk->version < 4
+                                   && !sk->protect.s2k.mode ) {
+            /* the simple rfc1991 (v3) way */
+           iobuf_put(a, sk->protect.algo );
+           iobuf_write(a, sk->protect.iv, sk->protect.ivlen );
+       }
+       else {
+          /* OpenPGP protection according to rfc2440 */
+           iobuf_put(a, sk->protect.sha1chk? 0xfe : 0xff );
+           iobuf_put(a, sk->protect.algo );
+           if( sk->protect.s2k.mode >= 1000 ) {
+                /* These modes are not possible in OpenPGP, we use them
+                   to implement our extensions, 101 can be seen as a
+                   private/experimental extension (this is not
+                   specified in rfc2440 but the same scheme is used
+                   for all other algorithm identifiers) */
+               iobuf_put(a, 101 ); 
+               iobuf_put(a, sk->protect.s2k.hash_algo );
+               iobuf_write(a, "GNU", 3 );
+               iobuf_put(a, sk->protect.s2k.mode - 1000 );
+           }
+           else {
+               iobuf_put(a, sk->protect.s2k.mode );
+               iobuf_put(a, sk->protect.s2k.hash_algo );
+           }
+           if( sk->protect.s2k.mode == 1
+               || sk->protect.s2k.mode == 3 )
+               iobuf_write(a, sk->protect.s2k.salt, 8 );
+           if( sk->protect.s2k.mode == 3 )
+               iobuf_put(a, sk->protect.s2k.count ); 
+
+            /* For out special modes 1001, 1002 we do not need an IV */
+           if( sk->protect.s2k.mode != 1001 
+              && sk->protect.s2k.mode != 1002 )
+               iobuf_write(a, sk->protect.iv, sk->protect.ivlen );
+       }
+    }
+    else
+       iobuf_put(a, 0 );
+
+    if( sk->protect.s2k.mode == 1001 )
+        ; /* GnuPG extension - don't write a secret key at all */ 
+    else if( sk->protect.s2k.mode == 1002 )
+      {  /* GnuPG extension - divert to OpenPGP smartcard. */ 
+       iobuf_put(a, sk->protect.ivlen ); /* length of the serial
+                                             number or 0 for no serial
+                                             number. */
+        /* The serial number gets stored in the IV field. */
+        iobuf_write(a, sk->protect.iv, sk->protect.ivlen);
+      }
+    else if( sk->is_protected && sk->version >= 4 ) {
+        /* The secret key is protected - write it out as it is */
+       byte *p;
+       unsigned int ndata;
+
+       assert( mpi_is_opaque( sk->skey[npkey] ) );
+       p = mpi_get_opaque( sk->skey[npkey], &ndata );
+       iobuf_write(a, p, ndata );
+    }
+    else if( sk->is_protected ) {
+        /* The secret key is protected te old v4 way. */
+       for(   ; i < nskey; i++ ) {
+            byte *p;
+            unsigned int ndata;
+
+            assert (mpi_is_opaque (sk->skey[i]));
+            p = mpi_get_opaque (sk->skey[i], &ndata);
+            iobuf_write (a, p, ndata);
+        }
+       write_16(a, sk->csum );
+    }
+    else {
+        /* non-protected key */
+       for(   ; i < nskey; i++ )
+           mpi_write(a, sk->skey[i] );
+       write_16(a, sk->csum );
+    }
+
+  leave:
+    /* Build the header of the packet - which we must do after writing all
+       the other stuff, so that we know the length of the packet */
+    write_header2(out, ctb, iobuf_get_temp_length(a), sk->hdrbytes);
+    /* And finally write it out the real stream */
+    if( iobuf_write_temp( out, a ) )
+       rc = G10ERR_WRITE_FILE;
+
+    iobuf_close(a); /* close the remporary buffer */
+    return rc;
+}
+
+static int
+do_symkey_enc( IOBUF out, int ctb, PKT_symkey_enc *enc )
+{
+    int rc = 0;
+    IOBUF a = iobuf_temp();
+
+    assert( enc->version == 4 );
+    switch( enc->s2k.mode ) {
+      case 0: case 1: case 3: break;
+      default: log_bug("do_symkey_enc: s2k=%d\n", enc->s2k.mode );
+    }
+    iobuf_put( a, enc->version );
+    iobuf_put( a, enc->cipher_algo );
+    iobuf_put( a, enc->s2k.mode );
+    iobuf_put( a, enc->s2k.hash_algo );
+    if( enc->s2k.mode == 1 || enc->s2k.mode == 3 ) {
+       iobuf_write(a, enc->s2k.salt, 8 );
+       if( enc->s2k.mode == 3 )
+           iobuf_put(a, enc->s2k.count);
+    }
+    if( enc->seskeylen )
+       iobuf_write(a, enc->seskey, enc->seskeylen );
+
+    write_header(out, ctb, iobuf_get_temp_length(a) );
+    if( iobuf_write_temp( out, a ) )
+       rc = G10ERR_WRITE_FILE;
+
+    iobuf_close(a);
+    return rc;
+}
+
+
+static int
+do_pubkey_enc( IOBUF out, int ctb, PKT_pubkey_enc *enc )
+{
+    int rc = 0;
+    int n, i;
+    IOBUF a = iobuf_temp();
+
+    write_version( a, ctb );
+    if( enc->throw_keyid ) {
+       write_32(a, 0 );  /* don't tell Eve who can decrypt the message */
+       write_32(a, 0 );
+    }
+    else {
+       write_32(a, enc->keyid[0] );
+       write_32(a, enc->keyid[1] );
+    }
+    iobuf_put(a,enc->pubkey_algo );
+    n = pubkey_get_nenc( enc->pubkey_algo );
+    if( !n )
+       write_fake_data( a, enc->data[0] );
+    for(i=0; i < n; i++ )
+       mpi_write(a, enc->data[i] );
+
+    write_header(out, ctb, iobuf_get_temp_length(a) );
+    if( iobuf_write_temp( out, a ) )
+       rc = G10ERR_WRITE_FILE;
+
+    iobuf_close(a);
+    return rc;
+}
+
+
+static u32
+calc_plaintext( PKT_plaintext *pt )
+{
+  /* Truncate namelen to the maximum 255 characters.  Note this means
+     that a function that calls build_packet with an illegal literal
+     packet will get it back legalized. */
+
+  if(pt->namelen>255)
+    pt->namelen=255;
+
+  return pt->len? (1 + 1 + pt->namelen + 4 + pt->len) : 0;
+}
+
+static int
+do_plaintext( IOBUF out, int ctb, PKT_plaintext *pt )
+{
+    int i, rc = 0;
+    u32 n;
+    byte buf[1000]; /* this buffer has the plaintext! */
+    int nbytes;
+
+    write_header(out, ctb, calc_plaintext( pt ) );
+    iobuf_put(out, pt->mode );
+    iobuf_put(out, pt->namelen );
+    for(i=0; i < pt->namelen; i++ )
+       iobuf_put(out, pt->name[i] );
+    if( write_32(out, pt->timestamp ) )
+       rc = G10ERR_WRITE_FILE;
+
+    n = 0;
+    while( (nbytes=iobuf_read(pt->buf, buf, 1000)) != -1 ) {
+       if( iobuf_write(out, buf, nbytes) == -1 ) {
+           rc = G10ERR_WRITE_FILE;
+           break;
+       }
+       n += nbytes;
+    }
+    wipememory(buf,1000); /* burn the buffer */
+    if( (ctb&0x40) && !pt->len )
+      iobuf_set_partial_block_mode(out, 0 ); /* turn off partial */
+    if( pt->len && n != pt->len )
+      log_error("do_plaintext(): wrote %lu bytes but expected %lu bytes\n",
+               (ulong)n, (ulong)pt->len );
+
+    return rc;
+}
+
+
+
+static int
+do_encrypted( IOBUF out, int ctb, PKT_encrypted *ed )
+{
+    int rc = 0;
+    u32 n;
+
+    n = ed->len ? (ed->len + ed->extralen) : 0;
+    write_header(out, ctb, n );
+
+    /* This is all. The caller has to write the real data */
+
+    return rc;
+}
+
+static int
+do_encrypted_mdc( IOBUF out, int ctb, PKT_encrypted *ed )
+{
+    int rc = 0;
+    u32 n;
+
+    assert( ed->mdc_method );
+
+    /* Take version number and the following MDC packet in account. */
+    n = ed->len ? (ed->len + ed->extralen + 1 + 22) : 0;
+    write_header(out, ctb, n );
+    iobuf_put(out, 1 );  /* version */
+
+    /* This is all. The caller has to write the real data */
+
+    return rc;
+}
+
+
+static int
+do_compressed( IOBUF out, int ctb, PKT_compressed *cd )
+{
+    int rc = 0;
+
+    /* We must use the old convention and don't use blockmode for tyhe
+       sake of PGP 2 compatibility.  However if the new_ctb flag was
+       set, CTB is already formatted as new style and write_header2
+       does create a partial length encoding using new the new
+       style. */
+    write_header2(out, ctb, 0, 0);
+    iobuf_put(out, cd->algorithm );
+
+    /* This is all. The caller has to write the real data */
+
+    return rc;
+}
+
+
+/****************
+ * Delete all subpackets of type REQTYPE and return a bool whether a packet
+ * was deleted.
+ */
+int
+delete_sig_subpkt (subpktarea_t *area, sigsubpkttype_t reqtype )
+{
+    int buflen;
+    sigsubpkttype_t type;
+    byte *buffer, *bufstart;
+    size_t n;
+    size_t unused = 0;
+    int okay = 0;
+
+    if( !area )
+       return 0;
+    buflen = area->len;
+    buffer = area->data;
+    for(;;) {
+       if( !buflen ) {
+            okay = 1;
+            break;
+        }
+       bufstart = buffer;
+       n = *buffer++; buflen--;
+       if( n == 255 ) {
+           if( buflen < 4 )
+               break;
+           n = (buffer[0] << 24) | (buffer[1] << 16)
+                | (buffer[2] << 8) | buffer[3];
+           buffer += 4;
+           buflen -= 4;
+       }
+       else if( n >= 192 ) {
+           if( buflen < 2 )
+               break;
+           n = (( n - 192 ) << 8) + *buffer + 192;
+           buffer++;
+           buflen--;
+       }
+       if( buflen < n )
+           break;
+        
+       type = *buffer & 0x7f;
+       if( type == reqtype ) {
+           buffer++;
+            buflen--;
+           n--;
+           if( n > buflen )
+               break;
+            buffer += n; /* point to next subpkt */
+            buflen -= n;
+            memmove (bufstart, buffer, buflen); /* shift */
+            unused +=  buffer - bufstart;
+            buffer = bufstart;
+       }
+        else {
+            buffer += n; buflen -=n;
+        }
+    }
+
+    if (!okay)
+        log_error ("delete_subpkt: buffer shorter than subpacket\n");
+    assert (unused <= area->len);
+    area->len -= unused;
+    return !!unused;
+}
+
+
+/****************
+ * Create or update a signature subpacket for SIG of TYPE.  This
+ * functions knows where to put the data (hashed or unhashed).  The
+ * function may move data from the unhashed part to the hashed one.
+ * Note: All pointers into sig->[un]hashed (e.g. returned by
+ * parse_sig_subpkt) are not valid after a call to this function.  The
+ * data to put into the subpaket should be in a buffer with a length
+ * of buflen. 
+ */
+void
+build_sig_subpkt (PKT_signature *sig, sigsubpkttype_t type,
+                 const byte *buffer, size_t buflen )
+{
+    byte *p;
+    int critical, hashed;
+    subpktarea_t *oldarea, *newarea;
+    size_t nlen, n, n0;
+
+    critical = (type & SIGSUBPKT_FLAG_CRITICAL);
+    type &= ~SIGSUBPKT_FLAG_CRITICAL;
+
+    /* Sanity check buffer sizes */
+    if(parse_one_sig_subpkt(buffer,buflen,type)<0)
+      BUG();
+
+    switch(type)
+      {
+      case SIGSUBPKT_NOTATION:
+      case SIGSUBPKT_POLICY:
+      case SIGSUBPKT_REV_KEY:
+      case SIGSUBPKT_SIGNATURE:
+       /* we do allow multiple subpackets */
+       break;
+
+      default:
+       /* we don't allow multiple subpackets */
+       delete_sig_subpkt(sig->hashed,type);
+       delete_sig_subpkt(sig->unhashed,type);
+       break;
+      }
+
+    /* Any special magic that needs to be done for this type so the
+       packet doesn't need to be reparsed? */
+    switch(type)
+      {
+      case SIGSUBPKT_NOTATION:
+       sig->flags.notation=1;
+       break;
+
+      case SIGSUBPKT_POLICY:
+       sig->flags.policy_url=1;
+       break;
+
+      case SIGSUBPKT_PREF_KS:
+       sig->flags.pref_ks=1;
+       break;
+
+      case SIGSUBPKT_EXPORTABLE:
+       if(buffer[0])
+         sig->flags.exportable=1;
+       else
+         sig->flags.exportable=0;
+       break;
+
+      case SIGSUBPKT_REVOCABLE:
+       if(buffer[0])
+         sig->flags.revocable=1;
+       else
+         sig->flags.revocable=0;
+       break;
+
+      case SIGSUBPKT_TRUST:
+       sig->trust_depth=buffer[0];
+       sig->trust_value=buffer[1];
+       break;
+
+      case SIGSUBPKT_REGEXP:
+       sig->trust_regexp=buffer;
+       break;
+
+       /* This should never happen since we don't currently allow
+          creating such a subpacket, but just in case... */
+      case SIGSUBPKT_SIG_EXPIRE:
+       if(buffer_to_u32(buffer)+sig->timestamp<=make_timestamp())
+         sig->flags.expired=1;
+       else
+         sig->flags.expired=0;
+       break;
+
+      default:
+       break;
+      }
+
+    if( (buflen+1) >= 8384 )
+       nlen = 5; /* write 5 byte length header */
+    else if( (buflen+1) >= 192 )
+       nlen = 2; /* write 2 byte length header */
+    else
+       nlen = 1; /* just a 1 byte length header */
+
+    switch( type )
+      {
+       /* The issuer being unhashed is a historical oddity.  It
+          should work equally as well hashed.  Of course, if even an
+          unhashed issuer is tampered with, it makes it awfully hard
+          to verify the sig... */
+      case SIGSUBPKT_ISSUER:
+      case SIGSUBPKT_SIGNATURE:
+        hashed = 0;
+        break;
+      default: 
+        hashed = 1;
+        break;
+      }
+
+    if( critical )
+       type |= SIGSUBPKT_FLAG_CRITICAL;
+
+    oldarea = hashed? sig->hashed : sig->unhashed;
+
+    /* Calculate new size of the area and allocate */
+    n0 = oldarea? oldarea->len : 0;
+    n = n0 + nlen + 1 + buflen; /* length, type, buffer */
+    if (oldarea && n <= oldarea->size) { /* fits into the unused space */
+        newarea = oldarea;
+        /*log_debug ("updating area for type %d\n", type );*/
+    }
+    else if (oldarea) {
+        newarea = xrealloc (oldarea, sizeof (*newarea) + n - 1);
+        newarea->size = n;
+        /*log_debug ("reallocating area for type %d\n", type );*/
+    }
+    else {
+        newarea = xmalloc (sizeof (*newarea) + n - 1);
+        newarea->size = n;
+        /*log_debug ("allocating area for type %d\n", type );*/
+    }
+    newarea->len = n;
+
+    p = newarea->data + n0;
+    if (nlen == 5) {
+       *p++ = 255;
+       *p++ = (buflen+1) >> 24;
+       *p++ = (buflen+1) >> 16;
+       *p++ = (buflen+1) >>  8;
+       *p++ = (buflen+1);
+       *p++ = type;
+       memcpy (p, buffer, buflen);
+    }
+    else if (nlen == 2) {
+       *p++ = (buflen+1-192) / 256 + 192;
+       *p++ = (buflen+1-192) % 256;
+       *p++ = type;
+       memcpy (p, buffer, buflen);
+    }
+    else {
+       *p++ = buflen+1;
+       *p++ = type;
+       memcpy (p, buffer, buflen);
+    }
+
+    if (hashed) 
+       sig->hashed = newarea;
+    else
+       sig->unhashed = newarea;
+}
+
+/****************
+ * Put all the required stuff from SIG into subpackets of sig.
+ * Hmmm, should we delete those subpackets which are in a wrong area?
+ */
+void
+build_sig_subpkt_from_sig( PKT_signature *sig )
+{
+    u32  u;
+    byte buf[8];
+
+    u = sig->keyid[0];
+    buf[0] = (u >> 24) & 0xff;
+    buf[1] = (u >> 16) & 0xff;
+    buf[2] = (u >>  8) & 0xff;
+    buf[3] = u & 0xff;
+    u = sig->keyid[1];
+    buf[4] = (u >> 24) & 0xff;
+    buf[5] = (u >> 16) & 0xff;
+    buf[6] = (u >>  8) & 0xff;
+    buf[7] = u & 0xff;
+    build_sig_subpkt( sig, SIGSUBPKT_ISSUER, buf, 8 );
+
+    u = sig->timestamp;
+    buf[0] = (u >> 24) & 0xff;
+    buf[1] = (u >> 16) & 0xff;
+    buf[2] = (u >>  8) & 0xff;
+    buf[3] = u & 0xff;
+    build_sig_subpkt( sig, SIGSUBPKT_SIG_CREATED, buf, 4 );
+
+    if(sig->expiredate)
+      {
+       if(sig->expiredate>sig->timestamp)
+         u=sig->expiredate-sig->timestamp;
+       else
+         u=1; /* A 1-second expiration time is the shortest one
+                 OpenPGP has */
+
+       buf[0] = (u >> 24) & 0xff;
+       buf[1] = (u >> 16) & 0xff;
+       buf[2] = (u >>  8) & 0xff;
+       buf[3] = u & 0xff;
+
+       /* Mark this CRITICAL, so if any implementation doesn't
+           understand sigs that can expire, it'll just disregard this
+           sig altogether. */
+
+       build_sig_subpkt( sig, SIGSUBPKT_SIG_EXPIRE | SIGSUBPKT_FLAG_CRITICAL,
+                         buf, 4 );
+      }
+}
+
+void
+build_attribute_subpkt(PKT_user_id *uid,byte type,
+                      const void *buf,u32 buflen,
+                      const void *header,u32 headerlen)
+{
+  byte *attrib;
+  int idx;
+
+  if(1+headerlen+buflen>8383)
+    idx=5;
+  else if(1+headerlen+buflen>191)
+    idx=2;
+  else
+    idx=1;
+
+  /* realloc uid->attrib_data to the right size */
+
+  uid->attrib_data=xrealloc(uid->attrib_data,
+                            uid->attrib_len+idx+1+headerlen+buflen);
+
+  attrib=&uid->attrib_data[uid->attrib_len];
+
+  if(idx==5)
+    {
+      attrib[0]=255;
+      attrib[1]=(1+headerlen+buflen) >> 24;
+      attrib[2]=(1+headerlen+buflen) >> 16;
+      attrib[3]=(1+headerlen+buflen) >> 8;
+      attrib[4]=1+headerlen+buflen;
+    }
+  else if(idx==2)
+    {
+      attrib[0]=(1+headerlen+buflen-192) / 256 + 192;
+      attrib[1]=(1+headerlen+buflen-192) % 256;
+    }
+  else
+    attrib[0]=1+headerlen+buflen; /* Good luck finding a JPEG this small! */
+
+  attrib[idx++]=type;
+
+  /* Tack on our data at the end */
+
+  if(headerlen>0)
+    memcpy(&attrib[idx],header,headerlen);
+  memcpy(&attrib[idx+headerlen],buf,buflen);
+  uid->attrib_len+=idx+headerlen+buflen;
+}
+
+struct notation *
+string_to_notation(const char *string,int is_utf8)
+{
+  const char *s;
+  int saw_at=0;
+  struct notation *notation;
+
+  notation=xmalloc_clear(sizeof(*notation));
+
+  if(*string=='-')
+    {
+      notation->flags.ignore=1;
+      string++;
+    }
+
+  if(*string=='!')
+    {
+      notation->flags.critical=1;
+      string++;
+    }
+
+  /* If and when the IETF assigns some official name tags, we'll have
+     to add them here. */
+
+  for( s=string ; *s != '='; s++ )
+    {
+      if( *s=='@')
+       saw_at++;
+
+      /* -notationname is legal without an = sign */
+      if(!*s && notation->flags.ignore)
+       break;
+
+      if( !*s || !isascii (*s) || (!isgraph(*s) && !isspace(*s)) )
+       {
+         log_error(_("a notation name must have only printable characters"
+                     " or spaces, and end with an '='\n") );
+         goto fail;
+       }
+    }
+
+  notation->name=xmalloc((s-string)+1);
+  strncpy(notation->name,string,s-string);
+  notation->name[s-string]='\0';
+
+  if(!saw_at && !opt.expert)
+    {
+      log_error(_("a user notation name must contain the '@' character\n"));
+      goto fail;
+    }
+
+  if (saw_at > 1)
+    {
+      log_error(_("a notation name must not contain more than"
+                 " one '@' character\n"));
+      goto fail;
+    }
+
+  if(*s)
+    {
+      const char *i=s+1;
+      int highbit=0;
+
+      /* we only support printable text - therefore we enforce the use
+        of only printable characters (an empty value is valid) */
+      for(s++; *s ; s++ )
+       {
+         if ( !isascii (*s) )
+           highbit=1;
+         else if (iscntrl(*s))
+           {
+             log_error(_("a notation value must not use any"
+                         " control characters\n"));
+             goto fail;
+           }
+       }
+
+      if(!highbit || is_utf8)
+       notation->value=xstrdup(i);
+      else
+       notation->value=native_to_utf8(i);
+    }
+
+  return notation;
+
+ fail:
+  free_notation(notation);
+  return NULL;
+}
+
+struct notation *
+sig_to_notation(PKT_signature *sig)
+{
+  const byte *p;
+  size_t len;
+  int seq=0,crit;
+  struct notation *list=NULL;
+
+  while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_NOTATION,&len,&seq,&crit)))
+    {
+      int n1,n2;
+      struct notation *n=NULL;
+
+      if(len<8)
+       {
+         log_info(_("WARNING: invalid notation data found\n"));
+         continue;
+       }
+
+      n1=(p[4]<<8)|p[5];
+      n2=(p[6]<<8)|p[7];
+
+      if(8+n1+n2!=len)
+       {
+         log_info(_("WARNING: invalid notation data found\n"));
+         continue;
+       }
+
+      n=xmalloc_clear(sizeof(*n));
+      n->name=xmalloc(n1+1);
+
+      memcpy(n->name,&p[8],n1);
+      n->name[n1]='\0';
+
+      if(p[0]&0x80)
+       {
+         n->value=xmalloc(n2+1);
+         memcpy(n->value,&p[8+n1],n2);
+         n->value[n2]='\0';
+       }
+      else
+       {
+         n->bdat=xmalloc(n2);
+         n->blen=n2;
+         memcpy(n->bdat,&p[8+n1],n2);
+
+         n->value=xmalloc(2+strlen(_("not human readable"))+2+1);
+         strcpy(n->value,"[ ");
+         strcat(n->value,_("not human readable"));
+         strcat(n->value," ]");
+       }
+
+      n->flags.critical=crit;
+
+      n->next=list;
+      list=n;
+    }
+
+  return list;
+}
+
+void
+free_notation(struct notation *notation)
+{
+  while(notation)
+    {
+      struct notation *n=notation;
+
+      xfree(n->name);
+      xfree(n->value);
+      xfree(n->altvalue);
+      xfree(n->bdat);
+      notation=n->next;
+      xfree(n);
+    }
+}
+
+static int
+do_signature( IOBUF out, int ctb, PKT_signature *sig )
+{
+    int rc = 0;
+    int n, i;
+    IOBUF a = iobuf_temp();
+
+    if( !sig->version )
+       iobuf_put( a, 3 );
+    else
+       iobuf_put( a, sig->version );
+    if( sig->version < 4 )
+       iobuf_put(a, 5 ); /* constant */
+    iobuf_put(a, sig->sig_class );
+    if( sig->version < 4 ) {
+       write_32(a, sig->timestamp );
+       write_32(a, sig->keyid[0] );
+       write_32(a, sig->keyid[1] );
+    }
+    iobuf_put(a, sig->pubkey_algo );
+    iobuf_put(a, sig->digest_algo );
+    if( sig->version >= 4 ) {
+       size_t nn;
+       /* timestamp and keyid must have been packed into the
+        * subpackets prior to the call of this function, because
+        * these subpackets are hashed */
+       nn = sig->hashed? sig->hashed->len : 0;
+       write_16(a, nn);
+       if( nn )
+           iobuf_write( a, sig->hashed->data, nn );
+       nn = sig->unhashed? sig->unhashed->len : 0;
+       write_16(a, nn);
+       if( nn )
+           iobuf_write( a, sig->unhashed->data, nn );
+    }
+    iobuf_put(a, sig->digest_start[0] );
+    iobuf_put(a, sig->digest_start[1] );
+    n = pubkey_get_nsig( sig->pubkey_algo );
+    if( !n )
+       write_fake_data( a, sig->data[0] );
+    for(i=0; i < n; i++ )
+       mpi_write(a, sig->data[i] );
+
+    if( is_RSA(sig->pubkey_algo) && sig->version < 4 )
+       write_sign_packet_header(out, ctb, iobuf_get_temp_length(a) );
+    else
+       write_header(out, ctb, iobuf_get_temp_length(a) );
+    if( iobuf_write_temp( out, a ) )
+       rc = G10ERR_WRITE_FILE;
+
+    iobuf_close(a);
+    return rc;
+}
+
+
+static int
+do_onepass_sig( IOBUF out, int ctb, PKT_onepass_sig *ops )
+{
+    int rc = 0;
+    IOBUF a = iobuf_temp();
+
+    write_version( a, ctb );
+    iobuf_put(a, ops->sig_class );
+    iobuf_put(a, ops->digest_algo );
+    iobuf_put(a, ops->pubkey_algo );
+    write_32(a, ops->keyid[0] );
+    write_32(a, ops->keyid[1] );
+    iobuf_put(a, ops->last );
+
+    write_header(out, ctb, iobuf_get_temp_length(a) );
+    if( iobuf_write_temp( out, a ) )
+       rc = G10ERR_WRITE_FILE;
+
+    iobuf_close(a);
+    return rc;
+}
+
+
+static int
+write_16(IOBUF out, u16 a)
+{
+    iobuf_put(out, a>>8);
+    if( iobuf_put(out,a) )
+       return -1;
+    return 0;
+}
+
+static int
+write_32(IOBUF out, u32 a)
+{
+    iobuf_put(out, a>> 24);
+    iobuf_put(out, a>> 16);
+    iobuf_put(out, a>> 8);
+    if( iobuf_put(out, a) )
+       return -1;
+    return 0;
+}
+
+
+/****************
+ * calculate the length of a header
+ */
+static int
+calc_header_length( u32 len, int new_ctb )
+{
+    if( !len )
+       return 1; /* only the ctb */
+
+    if( new_ctb ) {
+       if( len < 192 )
+           return 2;
+       if( len < 8384 )
+           return 3;
+       else
+           return 6;
+    }
+    if( len < 256 )
+       return 2;
+    if( len < 65536 )
+       return 3;
+
+    return 5;
+}
+
+/****************
+ * Write the CTB and the packet length
+ */
+static int
+write_header( IOBUF out, int ctb, u32 len )
+{
+    return write_header2( out, ctb, len, 0 );
+}
+
+
+static int
+write_sign_packet_header( IOBUF out, int ctb, u32 len )
+{
+    /* work around a bug in the pgp read function for signature packets,
+     * which are not correctly coded and silently assume at some
+     * point 2 byte length headers.*/
+    iobuf_put(out, 0x89 );
+    iobuf_put(out, len >> 8 );
+    return iobuf_put(out, len ) == -1 ? -1:0;
+}
+
+/****************
+ * If HDRLEN is > 0, try to build a header of this length.  We need
+ * this so that we can hash packets without reading them again.  If
+ * len is 0, write a partial or indeterminate length header, unless
+ * hdrlen is specified in which case write an actual zero length
+ * (using the specified hdrlen).
+ */
+static int
+write_header2( IOBUF out, int ctb, u32 len, int hdrlen )
+{
+  if( ctb & 0x40 )
+    return write_new_header( out, ctb, len, hdrlen );
+
+  if( hdrlen )
+    {
+      if( hdrlen == 2 && len < 256 )
+       ;
+      else if( hdrlen == 3 && len < 65536 )
+       ctb |= 1;
+      else
+       ctb |= 2;
+    }
+  else
+    {
+      if( !len )
+       ctb |= 3;
+      else if( len < 256 )
+       ;
+      else if( len < 65536 )
+       ctb |= 1;
+      else
+       ctb |= 2;
+    }
+
+  if( iobuf_put(out, ctb ) )
+    return -1;
+
+  if( len || hdrlen )
+    {
+      if( ctb & 2 )
+       {
+         if(iobuf_put(out, len >> 24 ))
+           return -1;
+         if(iobuf_put(out, len >> 16 ))
+           return -1;
+       }
+
+      if( ctb & 3 )
+       if(iobuf_put(out, len >> 8 ))
+         return -1;
+
+      if( iobuf_put(out, len ) )
+       return -1;
+    }
+
+  return 0;
+}
+
+
+static int
+write_new_header( IOBUF out, int ctb, u32 len, int hdrlen )
+{
+    if( hdrlen )
+       log_bug("can't cope with hdrlen yet\n");
+
+    if( iobuf_put(out, ctb ) )
+       return -1;
+    if( !len ) {
+       iobuf_set_partial_block_mode(out, 512 );
+    }
+    else {
+       if( len < 192 ) {
+           if( iobuf_put(out, len ) )
+               return -1;
+       }
+       else if( len < 8384 ) {
+           len -= 192;
+           if( iobuf_put( out, (len / 256) + 192) )
+               return -1;
+           if( iobuf_put( out, (len % 256) )  )
+               return -1;
+       }
+       else {
+           if( iobuf_put( out, 0xff ) )
+               return -1;
+           if( iobuf_put( out, (len >> 24)&0xff ) )
+               return -1;
+           if( iobuf_put( out, (len >> 16)&0xff ) )
+               return -1;
+           if( iobuf_put( out, (len >> 8)&0xff )  )
+               return -1;
+           if( iobuf_put( out, len & 0xff ) )
+               return -1;
+       }
+    }
+    return 0;
+}
+
+static int
+write_version( IOBUF out, int ctb )
+{
+    if( iobuf_put( out, 3 ) )
+       return -1;
+    return 0;
+}
diff --git a/g10/card-util.c b/g10/card-util.c
new file mode 100644 (file)
index 0000000..0c83654
--- /dev/null
@@ -0,0 +1,1610 @@
+/* card-util.c - Utility functions for the OpenPGP card.
+ *     Copyright (C) 2003, 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#if GNUPG_MAJOR_VERSION != 1
+#include "gpg.h"
+#endif /*GNUPG_MAJOR_VERSION != 1*/
+#include "util.h"
+#include "i18n.h"
+#include "ttyio.h"
+#include "status.h"
+#include "options.h"
+#include "main.h"
+#include "keyserver-internal.h"
+#if GNUPG_MAJOR_VERSION == 1
+#ifdef HAVE_LIBREADLINE
+#include <stdio.h>
+#include <readline/readline.h>
+#endif /*HAVE_LIBREADLINE*/
+#include "cardglue.h"
+#else /*GNUPG_MAJOR_VERSION!=1*/
+#include "call-agent.h"
+#endif /*GNUPG_MAJOR_VERSION!=1*/
+
+#define CONTROL_D ('D' - 'A' + 1)
+
+
+/* Change the PIN of a an OpenPGP card.  This is an interactive
+   function. */
+void
+change_pin (int chvno, int allow_admin)
+{
+  struct agent_card_info_s info;
+  int rc;
+
+  rc = agent_learn (&info);
+  if (rc)
+    {
+      log_error (_("OpenPGP card not available: %s\n"),
+                  gpg_strerror (rc));
+      return;
+    }
+  
+  log_info (_("OpenPGP card no. %s detected\n"),
+              info.serialno? info.serialno : "[none]");
+
+  agent_clear_pin_cache (info.serialno);
+
+  if (opt.batch)
+    {
+      agent_release_card_info (&info);
+      log_error (_("can't do this in batch mode\n"));
+      return;
+    }
+
+  if(!allow_admin)
+    {
+      rc = agent_scd_change_pin (1, info.serialno);
+      if (rc)
+       tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc));
+      else
+        {
+          write_status (STATUS_SC_OP_SUCCESS);
+          tty_printf ("PIN changed.\n");
+        }
+    }
+  else
+    for (;;)
+      {
+       char *answer;
+
+       tty_printf ("\n");
+       tty_printf ("1 - change PIN\n"
+                   "2 - unblock PIN\n"
+                   "3 - change Admin PIN\n"
+                   "Q - quit\n");
+       tty_printf ("\n");
+
+       answer = cpr_get("cardutil.change_pin.menu",_("Your selection? "));
+       cpr_kill_prompt();
+       if (strlen (answer) != 1)
+         continue;
+
+       rc = 0;
+       if (*answer == '1')
+         {
+           rc = agent_scd_change_pin (1, info.serialno);
+           if (rc)
+             tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc));
+           else
+              {
+                write_status (STATUS_SC_OP_SUCCESS);
+                tty_printf ("PIN changed.\n");
+              }
+         }
+       else if (*answer == '2')
+         {
+           rc = agent_scd_change_pin (101, info.serialno);
+           if (rc)
+             tty_printf ("Error unblocking the PIN: %s\n", gpg_strerror (rc));
+           else
+              {
+                write_status (STATUS_SC_OP_SUCCESS);
+                tty_printf ("PIN unblocked and new PIN set.\n");
+              }
+          }
+       else if (*answer == '3')
+         {
+           rc = agent_scd_change_pin (3, info.serialno);
+           if (rc)
+             tty_printf ("Error changing the PIN: %s\n", gpg_strerror (rc));
+           else
+              {
+                write_status (STATUS_SC_OP_SUCCESS);
+                tty_printf ("PIN changed.\n");
+              }
+         }
+       else if (*answer == 'q' || *answer == 'Q')
+         {
+           break;
+         }
+      }
+
+  agent_release_card_info (&info);
+}
+
+static const char *
+get_manufacturer (unsigned int no)
+{
+  /* Note:  Make sure that there is no colon or linefeed in the string. */
+  switch (no)
+    {
+    case 0:
+    case 0xffff: return "test card";
+    case 0x0001: return "PPC Card Systems";
+    case 0x0002: return "Prism";
+    case 0x0003: return "OpenFortress";
+    default: return "unknown";
+    }
+}
+
+
+static void
+print_sha1_fpr (FILE *fp, const unsigned char *fpr)
+{
+  int i;
+
+  if (fpr)
+    {
+      for (i=0; i < 20 ; i+=2, fpr += 2 )
+        {
+          if (i == 10 )
+            tty_fprintf (fp, " ");
+          tty_fprintf (fp, " %02X%02X", *fpr, fpr[1]);
+        }
+    }
+  else
+    tty_fprintf (fp, " [none]");
+  tty_fprintf (fp, "\n");
+}
+
+
+static void
+print_sha1_fpr_colon (FILE *fp, const unsigned char *fpr)
+{
+  int i;
+
+  if (fpr)
+    {
+      for (i=0; i < 20 ; i++, fpr++)
+        fprintf (fp, "%02X", *fpr);
+    }
+  putc (':', fp);
+}
+
+
+static void
+print_name (FILE *fp, const char *text, const char *name)
+{
+  tty_fprintf (fp, "%s", text);
+
+  /* FIXME: tty_printf_utf8_string2 eats everything after and
+     including an @ - e.g. when printing an url. */
+  if (name && *name)
+    {
+      if (fp)
+        print_utf8_string2 (fp, name, strlen (name), '\n');
+      else
+        tty_print_utf8_string2 (name, strlen (name), 0);
+    }
+  else
+    tty_fprintf (fp, _("[not set]"));
+  tty_fprintf (fp, "\n");
+}
+
+static void
+print_isoname (FILE *fp, const char *text, const char *tag, const char *name)
+{
+  if (opt.with_colons)
+    fprintf (fp, "%s:", tag);
+  else
+    tty_fprintf (fp, "%s", text);
+
+  if (name && *name)
+    {
+      char *p, *given, *buf = xstrdup (name);
+
+      given = strstr (buf, "<<");
+      for (p=buf; *p; p++)
+        if (*p == '<')
+          *p = ' ';
+      if (given && given[2])
+        {
+          *given = 0;
+          given += 2;
+          if (opt.with_colons)
+            print_string (fp, given, strlen (given), ':');
+          else if (fp)
+            print_utf8_string2 (fp, given, strlen (given), '\n');
+          else
+            tty_print_utf8_string2 (given, strlen (given), 0);
+
+          if (opt.with_colons)
+            putc (':', fp);
+          else if (*buf)
+            tty_fprintf (fp, " ");
+        }
+
+      if (opt.with_colons)
+        print_string (fp, buf, strlen (buf), ':');
+      else if (fp)
+        print_utf8_string2 (fp, buf, strlen (buf), '\n');
+      else
+        tty_print_utf8_string2 (buf, strlen (buf), 0);
+      xfree (buf);
+    }
+  else
+    {
+      if (opt.with_colons)
+        putc (':', fp);
+      else
+        tty_fprintf (fp, _("[not set]"));
+    }
+
+  if (opt.with_colons)
+    fputs (":\n", fp);
+  else
+    tty_fprintf (fp, "\n");
+}
+
+/* Return true if the SHA1 fingerprint FPR consists only of zeroes. */
+static int
+fpr_is_zero (const char *fpr)
+{
+  int i;
+
+  for (i=0; i < 20 && !fpr[i]; i++)
+    ;
+  return (i == 20);
+}
+
+
+/* Print all available information about the current card. */
+void
+card_status (FILE *fp, char *serialno, size_t serialnobuflen)
+{
+  struct agent_card_info_s info;
+  PKT_public_key *pk = xcalloc (1, sizeof *pk);
+  int rc;
+  unsigned int uval;
+  const unsigned char *thefpr;
+  int i;
+
+  if (serialno && serialnobuflen)
+    *serialno = 0;
+
+  rc = agent_learn (&info);
+  if (rc)
+    {
+      if (opt.with_colons)
+        fputs ("AID:::\n", fp);
+      log_error (_("OpenPGP card not available: %s\n"),
+                  gpg_strerror (rc));
+      xfree (pk);
+      return;
+    }
+
+  if (opt.with_colons)
+    fprintf (fp, "AID:%s:", info.serialno? info.serialno : "");
+  else
+    tty_fprintf (fp, "Application ID ...: %s\n",
+                 info.serialno? info.serialno : "[none]");
+  if (!info.serialno || strncmp (info.serialno, "D27600012401", 12) 
+      || strlen (info.serialno) != 32 )
+    {
+      if (opt.with_colons)
+        fputs ("unknown:\n", fp);
+      log_info ("not an OpenPGP card\n");
+      agent_release_card_info (&info);
+      xfree (pk);
+      return;
+    }
+
+  if (!serialno)
+    ;
+  else if (strlen (serialno)+1 > serialnobuflen)
+    log_error ("serial number longer than expected\n");
+  else 
+    strcpy (serialno, info.serialno);
+
+  if (opt.with_colons)
+    fputs ("openpgp-card:\n", fp);
+
+
+  if (opt.with_colons)
+    {
+      fprintf (fp, "version:%.4s:\n", info.serialno+12);
+      uval = xtoi_2(info.serialno+16)*256 + xtoi_2 (info.serialno+18);
+      fprintf (fp, "vendor:%04x:%s:\n", uval, get_manufacturer (uval));
+      fprintf (fp, "serial:%.8s:\n", info.serialno+20);
+      
+      print_isoname (fp, "Name of cardholder: ", "name", info.disp_name);
+
+      fputs ("lang:", fp);
+      if (info.disp_lang)
+        print_string (fp, info.disp_lang, strlen (info.disp_lang), ':');
+      fputs (":\n", fp);
+
+      fprintf (fp, "sex:%c:\n", (info.disp_sex == 1? 'm':
+                                 info.disp_sex == 2? 'f' : 'u'));
+
+      fputs ("url:", fp);
+      if (info.pubkey_url)
+        print_string (fp, info.pubkey_url, strlen (info.pubkey_url), ':');
+      fputs (":\n", fp);
+
+      fputs ("login:", fp);
+      if (info.login_data)
+        print_string (fp, info.login_data, strlen (info.login_data), ':');
+      fputs (":\n", fp);
+
+      fprintf (fp, "forcepin:%d:::\n", !info.chv1_cached);
+      fprintf (fp, "maxpinlen:%d:%d:%d:\n",
+                   info.chvmaxlen[0], info.chvmaxlen[1], info.chvmaxlen[2]);
+      fprintf (fp, "pinretry:%d:%d:%d:\n",
+                   info.chvretry[0], info.chvretry[1], info.chvretry[2]);
+      fprintf (fp, "sigcount:%lu:::\n", info.sig_counter);
+
+      for (i=0; i < 4; i++)
+        {
+          if (info.private_do[i])
+            {
+              fprintf (fp, "private_do:%d:", i+1);
+              print_string (fp, info.private_do[i],
+                            strlen (info.private_do[i]), ':');
+              fputs (":\n", fp);
+            }
+        }
+
+      fputs ("cafpr:", fp);
+      print_sha1_fpr_colon (fp, info.cafpr1valid? info.cafpr1:NULL);
+      print_sha1_fpr_colon (fp, info.cafpr2valid? info.cafpr2:NULL);
+      print_sha1_fpr_colon (fp, info.cafpr3valid? info.cafpr3:NULL);
+      putc ('\n', fp);
+      fputs ("fpr:", fp);
+      print_sha1_fpr_colon (fp, info.fpr1valid? info.fpr1:NULL);
+      print_sha1_fpr_colon (fp, info.fpr2valid? info.fpr2:NULL);
+      print_sha1_fpr_colon (fp, info.fpr3valid? info.fpr3:NULL);
+      putc ('\n', fp);
+      fprintf (fp, "fprtime:%lu:%lu:%lu:\n",
+               (unsigned long)info.fpr1time, (unsigned long)info.fpr2time,
+               (unsigned long)info.fpr3time);
+    }
+  else 
+    {
+      tty_fprintf (fp, "Version ..........: %.1s%c.%.1s%c\n",
+                   info.serialno[12] == '0'?"":info.serialno+12,
+                   info.serialno[13],
+                   info.serialno[14] == '0'?"":info.serialno+14,
+                   info.serialno[15]);
+      tty_fprintf (fp, "Manufacturer .....: %s\n", 
+                   get_manufacturer (xtoi_2(info.serialno+16)*256
+                                     + xtoi_2 (info.serialno+18)));
+      tty_fprintf (fp, "Serial number ....: %.8s\n", info.serialno+20);
+      
+      print_isoname (fp, "Name of cardholder: ", "name", info.disp_name);
+      print_name (fp, "Language prefs ...: ", info.disp_lang);
+      tty_fprintf (fp,    "Sex ..............: %s\n",
+                   info.disp_sex == 1? _("male"):
+                   info.disp_sex == 2? _("female") : _("unspecified"));
+      print_name (fp, "URL of public key : ", info.pubkey_url);
+      print_name (fp, "Login data .......: ", info.login_data);
+      if (info.private_do[0])
+        print_name (fp, "Private DO 1 .....: ", info.private_do[0]);
+      if (info.private_do[1])
+        print_name (fp, "Private DO 2 .....: ", info.private_do[1]);
+      if (info.private_do[2])
+        print_name (fp, "Private DO 3 .....: ", info.private_do[2]);
+      if (info.private_do[3])
+        print_name (fp, "Private DO 4 .....: ", info.private_do[3]);
+      if (info.cafpr1valid)
+        {
+          tty_fprintf (fp, "CA fingerprint %d .:", 1);
+          print_sha1_fpr (fp, info.cafpr1);
+        }
+      if (info.cafpr2valid)
+        {
+          tty_fprintf (fp, "CA fingerprint %d .:", 2);
+          print_sha1_fpr (fp, info.cafpr2);
+        }
+      if (info.cafpr3valid)
+        {
+          tty_fprintf (fp, "CA fingerprint %d .:", 3);
+          print_sha1_fpr (fp, info.cafpr3);
+        }
+      tty_fprintf (fp,    "Signature PIN ....: %s\n",
+                   info.chv1_cached? _("not forced"): _("forced"));
+      tty_fprintf (fp,    "Max. PIN lengths .: %d %d %d\n",
+                   info.chvmaxlen[0], info.chvmaxlen[1], info.chvmaxlen[2]);
+      tty_fprintf (fp,    "PIN retry counter : %d %d %d\n",
+                   info.chvretry[0], info.chvretry[1], info.chvretry[2]);
+      tty_fprintf (fp,    "Signature counter : %lu\n", info.sig_counter);
+      tty_fprintf (fp, "Signature key ....:");
+      print_sha1_fpr (fp, info.fpr1valid? info.fpr1:NULL);
+      if (info.fpr1valid && info.fpr1time)
+        tty_fprintf (fp, "      created ....: %s\n",
+                     isotimestamp (info.fpr1time));
+      tty_fprintf (fp, "Encryption key....:");
+      print_sha1_fpr (fp, info.fpr2valid? info.fpr2:NULL);
+      if (info.fpr2valid && info.fpr2time)
+        tty_fprintf (fp, "      created ....: %s\n",
+                     isotimestamp (info.fpr2time));
+      tty_fprintf (fp, "Authentication key:");
+      print_sha1_fpr (fp, info.fpr3valid? info.fpr3:NULL);
+      if (info.fpr3valid && info.fpr3time)
+        tty_fprintf (fp, "      created ....: %s\n",
+                     isotimestamp (info.fpr3time));
+      tty_fprintf (fp, "General key info..: "); 
+
+      thefpr = (info.fpr1valid? info.fpr1 : info.fpr2valid? info.fpr2 : 
+                info.fpr3valid? info.fpr3 : NULL);
+      if ( thefpr && !get_pubkey_byfprint (pk, thefpr, 20))
+        {
+          KBNODE keyblock = NULL;
+
+          print_pubkey_info (fp, pk);
+
+          if ( !get_seckeyblock_byfprint (&keyblock, thefpr, 20) )
+            print_card_key_info (fp, keyblock);
+          else if ( !get_keyblock_byfprint (&keyblock, thefpr, 20) )
+            {
+              release_kbnode (keyblock);
+              keyblock = NULL;
+              
+              if (!auto_create_card_key_stub (info.serialno,
+                                              info.fpr1valid? info.fpr1:NULL,
+                                              info.fpr2valid? info.fpr2:NULL,
+                                              info.fpr3valid? info.fpr3:NULL))
+                {
+                  if ( !get_seckeyblock_byfprint (&keyblock, thefpr, 20) )
+                    print_card_key_info (fp, keyblock);
+                }
+            }
+
+          release_kbnode (keyblock);
+        }
+      else
+        tty_fprintf (fp, "[none]\n");
+    }
+      
+  free_public_key (pk);
+  agent_release_card_info (&info);
+}
+
+
+static char *
+get_one_name (const char *prompt1, const char *prompt2)
+{
+  char *name;
+  int i;
+
+  for (;;)
+    {
+      name = cpr_get (prompt1, prompt2);
+      if (!name)
+        return NULL;
+      trim_spaces (name);
+      cpr_kill_prompt ();
+      for (i=0; name[i] && name[i] >= ' ' && name[i] <= 126; i++)
+        ;
+
+      /* The name must be in Latin-1 and not UTF-8 - lacking the code
+         to ensure this we restrict it to ASCII. */
+      if (name[i])
+        tty_printf (_("Error: Only plain ASCII is currently allowed.\n"));
+      else if (strchr (name, '<'))
+        tty_printf (_("Error: The \"<\" character may not be used.\n"));
+      else if (strstr (name, "  "))
+        tty_printf (_("Error: Double spaces are not allowed.\n"));    
+      else
+        return name;
+      xfree (name);
+    }
+}
+
+
+
+static int
+change_name (void)
+{
+  char *surname = NULL, *givenname = NULL;
+  char *isoname, *p;
+  int rc;
+
+  surname = get_one_name ("keygen.smartcard.surname",
+                                    _("Cardholder's surname: "));
+  givenname = get_one_name ("keygen.smartcard.givenname",
+                                       _("Cardholder's given name: "));
+  if (!surname || !givenname || (!*surname && !*givenname))
+    {
+      xfree (surname);
+      xfree (givenname);
+      return -1; /*canceled*/
+    }
+
+  isoname = xmalloc ( strlen (surname) + 2 + strlen (givenname) + 1);
+  strcpy (stpcpy (stpcpy (isoname, surname), "<<"), givenname);
+  xfree (surname);
+  xfree (givenname);
+  for (p=isoname; *p; p++)
+    if (*p == ' ')
+      *p = '<';
+
+  if (strlen (isoname) > 39 )
+    {
+      tty_printf (_("Error: Combined name too long "
+                    "(limit is %d characters).\n"), 39);    
+      xfree (isoname);
+      return -1;
+    }
+
+  rc = agent_scd_setattr ("DISP-NAME", isoname, strlen (isoname), NULL );
+  if (rc)
+    log_error ("error setting Name: %s\n", gpg_strerror (rc));
+
+  xfree (isoname);
+  return rc;
+}
+
+
+static int
+change_url (void)
+{
+  char *url;
+  int rc;
+
+  url = cpr_get ("cardedit.change_url", _("URL to retrieve public key: "));
+  if (!url)
+    return -1;
+  trim_spaces (url);
+  cpr_kill_prompt ();
+
+  if (strlen (url) > 254 )
+    {
+      tty_printf (_("Error: URL too long "
+                    "(limit is %d characters).\n"), 254);    
+      xfree (url);
+      return -1;
+    }
+
+  rc = agent_scd_setattr ("PUBKEY-URL", url, strlen (url), NULL );
+  if (rc)
+    log_error ("error setting URL: %s\n", gpg_strerror (rc));
+  xfree (url);
+  return rc;
+}
+
+
+/* Fetch the key from the URL given on the card or try to get it from
+   the default keyserver.  */
+static int
+fetch_url(void)
+{
+#if GNUPG_MAJOR_VERSION == 1
+  int rc;
+  struct agent_card_info_s info;
+
+  memset(&info,0,sizeof(info));
+
+  rc=agent_scd_getattr("PUBKEY-URL",&info);
+  if(rc)
+    log_error("error retrieving URL from card: %s\n",gpg_strerror(rc));
+  else
+    {
+      struct keyserver_spec *spec=NULL;
+
+      rc=agent_scd_getattr("KEY-FPR",&info);
+      if(rc)
+       log_error("error retrieving key fingerprint from card: %s\n",
+                 gpg_strerror(rc));
+      else if (info.pubkey_url && *info.pubkey_url)
+       {
+         spec=parse_keyserver_uri(info.pubkey_url,1,NULL,0);
+         if(spec && info.fpr1valid)
+           {
+             /* This is not perfectly right.  Currently, all card
+                fingerprints are 20 digits, but what about
+                fingerprints for a future v5 key?  We should get the
+                length from somewhere lower in the code.  In any
+                event, the fpr/keyid is not meaningful for straight
+                HTTP fetches, but using it allows the card to point
+                to HKP and LDAP servers as well. */
+             rc=keyserver_import_fprint(info.fpr1,20,spec);
+             free_keyserver_spec(spec);
+           }
+       }
+      else if (info.fpr1valid)
+       {
+          rc = keyserver_import_fprint (info.fpr1, 20, opt.keyserver);
+       }
+    }
+
+  return rc;
+#else
+  return 0;
+#endif
+}
+
+
+static int
+change_login (const char *args)
+{
+  char *data;
+  int n;
+  int rc;
+
+  if (args && *args == '<')  /* Read it from a file */
+    {
+      FILE *fp;
+
+      for (args++; spacep (args); args++)
+        ;
+      fp = fopen (args, "rb");
+#if GNUPG_MAJOR_VERSION == 1
+      if (fp && is_secured_file (fileno (fp)))
+        {
+          fclose (fp);
+          fp = NULL;
+          errno = EPERM;
+        }
+#endif
+      if (!fp)
+        {
+          tty_printf (_("can't open `%s': %s\n"), args, strerror (errno));
+          return -1;
+        }
+          
+      data = xmalloc (254);
+      n = fread (data, 1, 254, fp);
+      fclose (fp);
+      if (n < 0)
+        {
+          tty_printf (_("error reading `%s': %s\n"), args, strerror (errno));
+          xfree (data);
+          return -1;
+        }
+    }
+  else
+    {
+      data = cpr_get ("cardedit.change_login",
+                      _("Login data (account name): "));
+      if (!data)
+        return -1;
+      trim_spaces (data);
+      cpr_kill_prompt ();
+      n = strlen (data);
+    }
+
+  if (n > 254 )
+    {
+      tty_printf (_("Error: Login data too long "
+                    "(limit is %d characters).\n"), 254);    
+      xfree (data);
+      return -1;
+    }
+
+  rc = agent_scd_setattr ("LOGIN-DATA", data, n, NULL );
+  if (rc)
+    log_error ("error setting login data: %s\n", gpg_strerror (rc));
+  xfree (data);
+  return rc;
+}
+
+static int
+change_private_do (const char *args, int nr)
+{
+  char do_name[] = "PRIVATE-DO-X";
+  char *data;
+  int n;
+  int rc; 
+
+  assert (nr >= 1 && nr <= 4);
+  do_name[11] = '0' + nr;
+
+  if (args && (args = strchr (args, '<')))  /* Read it from a file */
+    {
+      FILE *fp;
+
+      /* Fixme: Factor this duplicated code out. */
+      for (args++; spacep (args); args++)
+        ;
+      fp = fopen (args, "rb");
+#if GNUPG_MAJOR_VERSION == 1
+      if (fp && is_secured_file (fileno (fp)))
+        {
+          fclose (fp);
+          fp = NULL;
+          errno = EPERM;
+        }
+#endif
+      if (!fp)
+        {
+          tty_printf (_("can't open `%s': %s\n"), args, strerror (errno));
+          return -1;
+        }
+          
+      data = xmalloc (254);
+      n = fread (data, 1, 254, fp);
+      fclose (fp);
+      if (n < 0)
+        {
+          tty_printf (_("error reading `%s': %s\n"), args, strerror (errno));
+          xfree (data);
+          return -1;
+        }
+    }
+  else
+    {
+      data = cpr_get ("cardedit.change_private_do",
+                      _("Private DO data: "));
+      if (!data)
+        return -1;
+      trim_spaces (data);
+      cpr_kill_prompt ();
+      n = strlen (data);
+    }
+
+  if (n > 254 )
+    {
+      tty_printf (_("Error: Private DO too long "
+                    "(limit is %d characters).\n"), 254);    
+      xfree (data);
+      return -1;
+    }
+
+  rc = agent_scd_setattr (do_name, data, n, NULL );
+  if (rc)
+    log_error ("error setting private DO: %s\n", gpg_strerror (rc));
+  xfree (data);
+  return rc;
+}
+
+static int
+change_lang (void)
+{
+  char *data, *p;
+  int rc;
+
+  data = cpr_get ("cardedit.change_lang",
+                  _("Language preferences: "));
+  if (!data)
+    return -1;
+  trim_spaces (data);
+  cpr_kill_prompt ();
+
+  if (strlen (data) > 8 || (strlen (data) & 1))
+    {
+      tty_printf (_("Error: invalid length of preference string.\n"));
+      xfree (data);
+      return -1;
+    }
+
+  for (p=data; *p && *p >= 'a' && *p <= 'z'; p++)
+    ;
+  if (*p)
+    {
+      tty_printf (_("Error: invalid characters in preference string.\n"));
+      xfree (data);
+      return -1;
+    }
+
+  rc = agent_scd_setattr ("DISP-LANG", data, strlen (data), NULL );
+  if (rc)
+    log_error ("error setting lang: %s\n", gpg_strerror (rc));
+  xfree (data);
+  return rc;
+}
+
+
+static int
+change_sex (void)
+{
+  char *data;
+  const char *str;
+  int rc;
+
+  data = cpr_get ("cardedit.change_sex",
+                  _("Sex ((M)ale, (F)emale or space): "));
+  if (!data)
+    return -1;
+  trim_spaces (data);
+  cpr_kill_prompt ();
+
+  if (!*data)
+    str = "9";
+  else if ((*data == 'M' || *data == 'm') && !data[1])
+    str = "1";
+  else if ((*data == 'F' || *data == 'f') && !data[1])
+    str = "2";
+  else 
+    {
+      tty_printf (_("Error: invalid response.\n"));
+      xfree (data);
+      return -1;
+    }
+     
+  rc = agent_scd_setattr ("DISP-SEX", str, 1, NULL );
+  if (rc)
+    log_error ("error setting sex: %s\n", gpg_strerror (rc));
+  xfree (data);
+  return rc;
+}
+
+
+static int
+change_cafpr (int fprno)
+{
+  char *data;
+  const char *s;
+  int i, c, rc;
+  unsigned char fpr[20];
+
+  data = cpr_get ("cardedit.change_cafpr", _("CA fingerprint: "));
+  if (!data)
+    return -1;
+  trim_spaces (data);
+  cpr_kill_prompt ();
+
+  for (i=0, s=data; i < 20 && *s; )
+    {
+      while (spacep(s))
+        s++;
+      if (*s == ':')
+        s++;
+      while (spacep(s))
+        s++;
+      c = hextobyte (s);
+      if (c == -1)
+        break;
+      fpr[i++] = c;
+      s += 2;
+    }
+  xfree (data);
+  if (i != 20 || *s)
+    {
+      tty_printf (_("Error: invalid formatted fingerprint.\n"));
+      return -1;
+    }
+
+  rc = agent_scd_setattr (fprno==1?"CA-FPR-1":
+                          fprno==2?"CA-FPR-2":
+                          fprno==3?"CA-FPR-3":"x", fpr, 20, NULL );
+  if (rc)
+    log_error ("error setting cafpr: %s\n", gpg_strerror (rc));
+  return rc;
+}
+
+
+
+static void
+toggle_forcesig (void)
+{
+  struct agent_card_info_s info;
+  int rc;
+  int newstate;
+
+  memset (&info, 0, sizeof info);
+  rc = agent_scd_getattr ("CHV-STATUS", &info);
+  if (rc)
+    {
+      log_error ("error getting current status: %s\n", gpg_strerror (rc));
+      return;
+    }
+  newstate = !info.chv1_cached;
+  agent_release_card_info (&info);
+
+  rc = agent_scd_setattr ("CHV-STATUS-1", newstate? "\x01":"", 1, NULL);
+  if (rc)
+    log_error ("error toggling signature PIN flag: %s\n", gpg_strerror (rc));
+}
+
+
+/* Helper for the key generation/edit functions.  */
+static int
+get_info_for_key_operation (struct agent_card_info_s *info)
+{
+  int rc;
+
+  memset (info, 0, sizeof *info);
+  rc = agent_scd_getattr ("SERIALNO", info);
+  if (rc || !info->serialno || strncmp (info->serialno, "D27600012401", 12) 
+      || strlen (info->serialno) != 32 )
+    {
+      log_error (_("key operation not possible: %s\n"),
+                 rc ? gpg_strerror (rc) : _("not an OpenPGP card"));
+      return rc? rc: -1;
+    }
+  rc = agent_scd_getattr ("KEY-FPR", info);
+  if (!rc)
+    rc = agent_scd_getattr ("CHV-STATUS", info);
+  if (!rc)
+    rc = agent_scd_getattr ("DISP-NAME", info);
+  if (rc)
+    log_error (_("error getting current key info: %s\n"), gpg_strerror (rc));
+  return rc;
+}
+
+
+/* Helper for the key generation/edit functions.  */
+static int
+check_pin_for_key_operation (struct agent_card_info_s *info, int *forced_chv1)
+{     
+  int rc = 0;
+
+  agent_clear_pin_cache (info->serialno);
+
+  *forced_chv1 = !info->chv1_cached;
+  if (*forced_chv1)
+    { /* Switch of the forced mode so that during key generation we
+         don't get bothered with PIN queries for each
+         self-signature. */
+      rc = agent_scd_setattr ("CHV-STATUS-1", "\x01", 1, info->serialno);
+      if (rc)
+        {
+          log_error ("error clearing forced signature PIN flag: %s\n",
+                     gpg_strerror (rc));
+          *forced_chv1 = 0;
+        }
+    }
+
+  if (!rc)
+    {
+      /* Check the PIN now, so that we won't get asked later for each
+         binding signature. */
+      rc = agent_scd_checkpin (info->serialno);
+      if (rc)
+        log_error ("error checking the PIN: %s\n", gpg_strerror (rc));
+    }
+  return rc;
+}
+
+/* Helper for the key generation/edit functions.  */
+static void 
+restore_forced_chv1 (int *forced_chv1)
+{
+  int rc;
+
+  if (*forced_chv1)
+    { /* Switch back to forced state. */
+      rc = agent_scd_setattr ("CHV-STATUS-1", "", 1, NULL);
+      if (rc)
+        {
+          log_error ("error setting forced signature PIN flag: %s\n",
+                     gpg_strerror (rc));
+        }
+    }
+}
+
+#if GNUPG_MAJOR_VERSION == 1
+/* Helper for the key generation/edit functions.  */
+static void
+show_card_key_info (struct agent_card_info_s *info)
+{
+  tty_fprintf (NULL, "Signature key ....:");
+  print_sha1_fpr (NULL, info->fpr1valid? info->fpr1:NULL);
+  tty_fprintf (NULL, "Encryption key....:");
+  print_sha1_fpr (NULL, info->fpr2valid? info->fpr2:NULL);
+  tty_fprintf (NULL, "Authentication key:");
+  print_sha1_fpr (NULL, info->fpr3valid? info->fpr3:NULL);
+  tty_printf ("\n");
+}
+#endif
+
+#if GNUPG_MAJOR_VERSION == 1
+/* Helper for the key generation/edit functions.  */
+static int
+replace_existing_key_p (struct agent_card_info_s *info, int keyno)
+{
+  assert (keyno >= 0 && keyno <= 3);
+
+  if ((keyno == 1 && info->fpr1valid)
+      || (keyno == 2 && info->fpr2valid)
+      || (keyno == 3 && info->fpr3valid))
+    {
+      tty_printf ("\n");
+      log_info ("WARNING: such a key has already been stored on the card!\n");
+      tty_printf ("\n");
+      if ( !cpr_get_answer_is_yes( "cardedit.genkeys.replace_key",
+                                  _("Replace existing key? (y/N) ")))
+        return -1;
+    }
+  return 0;
+}
+#endif
+
+
+static void
+generate_card_keys (const char *serialno)
+{
+  struct agent_card_info_s info;
+  int forced_chv1;
+  int want_backup;
+
+  if (get_info_for_key_operation (&info))
+    return;
+
+#if GNUPG_MAJOR_VERSION == 1
+  {
+    char *answer=cpr_get("cardedit.genkeys.backup_enc",
+                        _("Make off-card backup of encryption key? (Y/n) "));
+
+    want_backup=answer_is_yes_no_default(answer,1);
+    cpr_kill_prompt();
+    xfree(answer);
+  }
+#else
+  want_backup = cpr_get_answer_is_yes 
+                  ( "cardedit.genkeys.backup_enc",
+                    _("Make off-card backup of encryption key? (Y/n) "));
+  /*FIXME: we need answer_is_yes_no_default()*/
+#endif
+
+  if ( (info.fpr1valid && !fpr_is_zero (info.fpr1))
+       || (info.fpr2valid && !fpr_is_zero (info.fpr2))
+       || (info.fpr3valid && !fpr_is_zero (info.fpr3)))
+    {
+      tty_printf ("\n");
+      log_info ("NOTE: keys are already stored on the card!\n");
+      tty_printf ("\n");
+      if ( !cpr_get_answer_is_yes( "cardedit.genkeys.replace_keys",
+                                  _("Replace existing keys? (y/N) ")))
+        {
+          agent_release_card_info (&info);
+          return;
+        }
+    }
+  else if (!info.disp_name || !*info.disp_name)
+    {
+      tty_printf ("\n");
+      tty_printf (_("Please note that the factory settings of the PINs are\n"
+                    "   PIN = `%s'     Admin PIN = `%s'\n"
+                    "You should change them using the command --change-pin\n"),
+                  "123456", "12345678");
+      tty_printf ("\n");
+    }
+
+  if (check_pin_for_key_operation (&info, &forced_chv1))
+    goto leave;
+  
+#if GNUPG_MAJOR_VERSION == 1
+  generate_keypair (NULL, info.serialno,
+                    want_backup? opt.homedir:NULL);
+#else
+  generate_keypair (NULL, info.serialno);
+#endif
+
+ leave:
+  agent_release_card_info (&info);
+  restore_forced_chv1 (&forced_chv1);
+}
+
+
+/* This function is used by the key edit menu to generate an arbitrary
+   subkey. */
+int
+card_generate_subkey (KBNODE pub_keyblock, KBNODE sec_keyblock)
+{
+#if GNUPG_MAJOR_VERSION == 1
+  struct agent_card_info_s info;
+  int okay = 0;
+  int forced_chv1 = 0;
+  int keyno;
+
+  if (get_info_for_key_operation (&info))
+    return 0;
+
+  show_card_key_info (&info);
+
+  tty_printf (_("Please select the type of key to generate:\n"));
+
+  tty_printf (_("   (1) Signature key\n"));
+  tty_printf (_("   (2) Encryption key\n"));
+  tty_printf (_("   (3) Authentication key\n"));
+
+  for (;;) 
+    {
+      char *answer = cpr_get ("cardedit.genkeys.subkeytype",
+                              _("Your selection? "));
+      cpr_kill_prompt();
+      if (*answer == CONTROL_D)
+        {
+          xfree (answer);
+          goto leave;
+        }
+      keyno = *answer? atoi(answer): 0;
+      xfree(answer);
+      if (keyno >= 1 && keyno <= 3)
+        break; /* Okay. */
+      tty_printf(_("Invalid selection.\n"));
+    }
+
+  if (replace_existing_key_p (&info, keyno))
+    goto leave;
+
+  if (check_pin_for_key_operation (&info, &forced_chv1))
+    goto leave;
+
+  okay = generate_card_subkeypair (pub_keyblock, sec_keyblock,
+                                   keyno, info.serialno);
+
+ leave:
+  agent_release_card_info (&info);
+  restore_forced_chv1 (&forced_chv1);
+  return okay;
+#else
+  return 0;
+#endif
+}
+
+
+/* Store the key at NODE into the smartcard and modify NODE to
+   carry the serialno stuff instead of the actual secret key
+   parameters.  USE is the usage for that key; 0 means any
+   usage. */
+int 
+card_store_subkey (KBNODE node, int use)
+{
+#if GNUPG_MAJOR_VERSION == 1
+  struct agent_card_info_s info;
+  int okay = 0;
+  int rc;
+  int keyno, i;
+  PKT_secret_key *copied_sk = NULL;
+  PKT_secret_key *sk;
+  size_t n;
+  const char *s;
+  int allow_keyno[3];
+
+  assert (node->pkt->pkttype == PKT_SECRET_KEY
+          || node->pkt->pkttype == PKT_SECRET_SUBKEY);
+  sk = node->pkt->pkt.secret_key;
+
+  if (get_info_for_key_operation (&info))
+    return 0;
+
+  show_card_key_info (&info);
+
+  if (!is_RSA (sk->pubkey_algo) || nbits_from_sk (sk) != 1024 )
+    {
+      tty_printf ("You may only store a 1024 bit RSA key on the card\n");
+      tty_printf ("\n");
+      goto leave;
+    }
+
+  allow_keyno[0] = (!use || (use & (PUBKEY_USAGE_SIG)));
+  allow_keyno[1] = (!use || (use & (PUBKEY_USAGE_ENC)));
+  allow_keyno[2] = (!use || (use & (PUBKEY_USAGE_SIG|PUBKEY_USAGE_AUTH)));
+
+  tty_printf (_("Please select where to store the key:\n"));
+
+  if (allow_keyno[0])
+    tty_printf (_("   (1) Signature key\n"));
+  if (allow_keyno[1])
+    tty_printf (_("   (2) Encryption key\n"));
+  if (allow_keyno[2])
+    tty_printf (_("   (3) Authentication key\n"));
+
+  for (;;) 
+    {
+      char *answer = cpr_get ("cardedit.genkeys.storekeytype",
+                              _("Your selection? "));
+      cpr_kill_prompt();
+      if (*answer == CONTROL_D || !*answer)
+        {
+          xfree (answer);
+          goto leave;
+        }
+      keyno = *answer? atoi(answer): 0;
+      xfree(answer);
+      if (keyno >= 1 && keyno <= 3 && allow_keyno[keyno-1])
+        break; /* Okay. */
+      tty_printf(_("Invalid selection.\n"));
+    }
+
+  if (replace_existing_key_p (&info, keyno))
+    goto leave;
+
+  /* Unprotect key.  */
+  switch (is_secret_key_protected (sk) )
+    {
+    case 0: /* Not protected. */
+      break;
+    case -1:
+      log_error (_("unknown key protection algorithm\n"));
+      goto leave;
+    default:
+      if (sk->protect.s2k.mode == 1001)
+        {
+          log_error (_("secret parts of key are not available\n"));
+          goto leave;
+       }
+      if (sk->protect.s2k.mode == 1002)
+        {
+          log_error (_("secret key already stored on a card\n"));
+          goto leave;
+       }
+      /* We better copy the key before we unprotect it.  */
+      copied_sk = sk = copy_secret_key (NULL, sk);
+      rc = check_secret_key (sk, 0);
+      if (rc)
+        goto leave;
+    }
+
+  rc = save_unprotected_key_to_card (sk, keyno);
+  if (rc)
+    goto leave;
+
+  /* Get back to the maybe protected original secret key.  */
+  if (copied_sk)
+    {
+      free_secret_key (copied_sk);
+      copied_sk = NULL; 
+    }
+  sk = node->pkt->pkt.secret_key;
+
+  /* Get rid of the secret key parameters and store the serial numer. */
+  n = pubkey_get_nskey (sk->pubkey_algo);
+  for (i=pubkey_get_npkey (sk->pubkey_algo); i < n; i++)
+    {
+      mpi_free (sk->skey[i]);
+      sk->skey[i] = NULL;
+    }
+  i = pubkey_get_npkey (sk->pubkey_algo);
+  sk->skey[i] = mpi_set_opaque (NULL, xstrdup ("dummydata"), 10);
+  sk->is_protected = 1;
+  sk->protect.s2k.mode = 1002;
+  s = info.serialno;
+  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);
+
+  okay = 1;
+
+ leave:
+  if (copied_sk)
+    free_secret_key (copied_sk);
+  agent_release_card_info (&info);
+  return okay;
+#else
+  return 0;
+#endif
+}
+
+
+\f
+/* Data used by the command parser.  This needs to be outside of the
+   function scope to allow readline based command completion.  */
+enum cmdids
+  {
+    cmdNOP = 0,
+    cmdQUIT, cmdADMIN, cmdHELP, cmdLIST, cmdDEBUG, cmdVERIFY,
+    cmdNAME, cmdURL, cmdFETCH, cmdLOGIN, cmdLANG, cmdSEX, cmdCAFPR,
+    cmdFORCESIG, cmdGENERATE, cmdPASSWD, cmdPRIVATEDO,
+    cmdINVCMD
+  };
+
+static struct
+{
+  const char *name;
+  enum cmdids id;
+  int admin_only;
+  const char *desc;
+} cmds[] =
+  {
+    { "quit"    , cmdQUIT  , 0, N_("quit this menu")},
+    { "q"       , cmdQUIT  , 0, NULL },
+    { "admin"   , cmdADMIN , 0, N_("show admin commands")},
+    { "help"    , cmdHELP  , 0, N_("show this help")},
+    { "?"       , cmdHELP  , 0, NULL },
+    { "list"    , cmdLIST  , 0, N_("list all available data")},
+    { "l"       , cmdLIST  , 0, NULL },
+    { "debug"   , cmdDEBUG , 0, NULL },
+    { "name"    , cmdNAME  , 1, N_("change card holder's name")},
+    { "url"     , cmdURL   , 1, N_("change URL to retrieve key")},
+    { "fetch"   , cmdFETCH , 0, N_("fetch the key specified in the card URL")},
+    { "login"   , cmdLOGIN , 1, N_("change the login name")},
+    { "lang"    , cmdLANG  , 1, N_("change the language preferences")},
+    { "sex"     , cmdSEX   , 1, N_("change card holder's sex")},
+    { "cafpr"   , cmdCAFPR , 1, N_("change a CA fingerprint")},
+    { "forcesig", cmdFORCESIG, 1, N_("toggle the signature force PIN flag")},
+    { "generate", cmdGENERATE, 1, N_("generate new keys")},
+    { "passwd"  , cmdPASSWD, 0, N_("menu to change or unblock the PIN")},
+    { "verify"  , cmdVERIFY, 0, N_("verify the PIN and list all data")},
+    /* Note, that we do not announce this command yet. */
+    { "privatedo", cmdPRIVATEDO, 0, NULL },
+    { NULL, cmdINVCMD, 0, NULL } 
+  };
+
+
+#if GNUPG_MAJOR_VERSION == 1 && defined (HAVE_LIBREADLINE)
+
+/* These two functions are used by readline for command completion. */
+
+static char *
+command_generator(const char *text,int state)
+{
+  static int list_index,len;
+  const char *name;
+
+  /* If this is a new word to complete, initialize now.  This includes
+     saving the length of TEXT for efficiency, and initializing the
+     index variable to 0. */
+  if(!state)
+    {
+      list_index=0;
+      len=strlen(text);
+    }
+
+  /* Return the next partial match */
+  while((name=cmds[list_index].name))
+    {
+      /* Only complete commands that have help text */
+      if(cmds[list_index++].desc && strncmp(name,text,len)==0)
+       return strdup(name);
+    }
+
+  return NULL;
+}
+
+static char **
+card_edit_completion(const char *text, int start, int end)
+{
+  /* If we are at the start of a line, we try and command-complete.
+     If not, just do nothing for now. */
+
+  if(start==0)
+    return rl_completion_matches(text,command_generator);
+
+  rl_attempted_completion_over=1;
+
+  return NULL;
+}
+#endif /* GNUPG_MAJOR_VERSION == 1 && HAVE_LIBREADLINE */
+
+/* Menu to edit all user changeable values on an OpenPGP card.  Only
+   Key creation is not handled here. */
+void
+card_edit (STRLIST commands)
+{
+  enum cmdids cmd = cmdNOP;
+  int have_commands = !!commands;
+  int redisplay = 1;
+  char *answer = NULL;
+  int did_checkpin = 0, allow_admin=0;
+  char serialnobuf[50];
+
+
+  if (opt.command_fd != -1)
+    ;
+  else if (opt.batch && !have_commands)
+    {
+      log_error(_("can't do this in batch mode\n"));
+      goto leave;
+    }
+
+  for (;;)
+    {
+      int arg_number;
+      const char *arg_string = "";
+      char *p;
+      int i;
+      int cmd_admin_only;
+      
+      tty_printf("\n");
+      if (redisplay )
+        {
+          if (opt.with_colons)
+            {
+              card_status (stdout, serialnobuf, DIM (serialnobuf));
+              fflush (stdout);
+            }
+          else
+            {
+              card_status (NULL, serialnobuf, DIM (serialnobuf));
+              tty_printf("\n");
+            }
+          redisplay = 0;
+       }
+
+      do
+        {
+          xfree (answer);
+          if (have_commands)
+            {
+              if (commands)
+                {
+                  answer = xstrdup (commands->d);
+                  commands = commands->next;
+               }
+              else if (opt.batch)
+                {
+                  answer = xstrdup ("quit");
+               }
+              else
+                have_commands = 0;
+           }
+
+           if (!have_commands)
+              {
+#if GNUPG_MAJOR_VERSION == 1
+               tty_enable_completion (card_edit_completion);
+#endif
+               answer = cpr_get_no_help("cardedit.prompt", _("Command> "));
+               cpr_kill_prompt();
+#if GNUPG_MAJOR_VERSION == 1
+               tty_disable_completion ();
+#endif
+           }
+           trim_spaces(answer);
+       }
+      while ( *answer == '#' );
+
+      arg_number = 0; /* Yes, here is the init which egcc complains about */
+      cmd_admin_only = 0;
+      if (!*answer)
+        cmd = cmdLIST; /* Default to the list command */
+      else if (*answer == CONTROL_D)
+        cmd = cmdQUIT;
+      else 
+        {
+          if ((p=strchr (answer,' ')))
+            {
+              *p++ = 0;
+              trim_spaces (answer);
+              trim_spaces (p);
+              arg_number = atoi(p);
+              arg_string = p;
+            }
+          
+          for (i=0; cmds[i].name; i++ )
+            if (!ascii_strcasecmp (answer, cmds[i].name ))
+              break;
+
+          cmd = cmds[i].id;
+          cmd_admin_only = cmds[i].admin_only;
+        }
+
+      if (!allow_admin && cmd_admin_only)
+       {
+          tty_printf ("\n");
+          tty_printf (_("Admin-only command\n"));
+          continue;
+        }
+
+      switch (cmd)
+        {
+        case cmdHELP:
+          for (i=0; cmds[i].name; i++ )
+            if(cmds[i].desc
+              && (!cmds[i].admin_only || (cmds[i].admin_only && allow_admin)))
+              tty_printf("%-10s %s\n", cmds[i].name, _(cmds[i].desc) );
+          break;
+
+       case cmdADMIN:
+          if ( !strcmp (arg_string, "on") )
+            allow_admin = 1;
+          else if ( !strcmp (arg_string, "off") )
+            allow_admin = 0;
+          else if ( !strcmp (arg_string, "verify") )
+            {
+              /* Force verification of the Admin Command.  However,
+                 this is only done if the retry counter is at initial
+                 state.  */
+              char *tmp = xmalloc (strlen (serialnobuf) + 6 + 1);
+              strcpy (stpcpy (tmp, serialnobuf), "[CHV3]");
+              allow_admin = !agent_scd_checkpin (tmp);
+              xfree (tmp);
+            }
+          else /* Toggle. */
+            allow_admin=!allow_admin;
+         if(allow_admin)
+           tty_printf(_("Admin commands are allowed\n"));
+         else
+           tty_printf(_("Admin commands are not allowed\n"));
+         break;
+
+        case cmdVERIFY:
+          agent_scd_checkpin (serialnobuf);
+          redisplay = 1;
+          break;
+
+        case cmdLIST:
+          redisplay = 1;
+          break;
+
+        case cmdNAME:
+         change_name ();
+          break;
+
+        case cmdURL:
+         change_url ();
+          break;
+
+       case cmdFETCH:
+         fetch_url();
+         break;
+
+        case cmdLOGIN:
+         change_login (arg_string);
+          break;
+
+        case cmdLANG:
+         change_lang ();
+          break;
+
+        case cmdSEX:
+         change_sex ();
+          break;
+
+        case cmdCAFPR:
+          if ( arg_number < 1 || arg_number > 3 )
+            tty_printf ("usage: cafpr N\n"
+                        "       1 <= N <= 3\n");
+          else
+            change_cafpr (arg_number);
+          break;
+
+        case cmdPRIVATEDO:
+          if ( arg_number < 1 || arg_number > 4 )
+            tty_printf ("usage: privatedo N\n"
+                        "       1 <= N <= 4\n");
+          else
+            change_private_do (arg_string, arg_number);
+          break;
+
+        case cmdFORCESIG:
+          toggle_forcesig ();
+          break;
+
+        case cmdGENERATE:
+          generate_card_keys (serialnobuf);
+          break;
+
+        case cmdPASSWD:
+          change_pin (0, allow_admin);
+          did_checkpin = 0; /* Need to reset it of course. */
+          break;
+
+        case cmdQUIT:
+          goto leave;
+
+        case cmdNOP:
+          break;
+
+        case cmdINVCMD:
+        default:
+          tty_printf ("\n");
+          tty_printf (_("Invalid command  (try \"help\")\n"));
+          break;
+        } /* End command switch. */
+    } /* End of main menu loop. */
+
+ leave:
+  xfree (answer);
+}
+
diff --git a/g10/cardglue.c b/g10/cardglue.c
new file mode 100644 (file)
index 0000000..1bfb9e4
--- /dev/null
@@ -0,0 +1,1432 @@
+/* cardglue.c - mainly dispatcher for card related functions.
+ * Copyright (C) 2003, 2004, 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#ifndef ENABLE_CARD_SUPPORT
+#error  not configured for card support.
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <assert.h>
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "status.h"
+#include "ttyio.h"
+#include "i18n.h"
+
+#include "cardglue.h"
+#include "apdu.h"
+#include "app-common.h"
+
+
+
+struct ctrl_ctx_s 
+{
+  assuan_error_t (*status_cb)(void *opaque, const char *line);
+  void *status_cb_arg;
+};
+
+
+struct pincb_parm_s
+{
+  const char *sn;
+};
+
+
+struct writekey_parm_s
+{
+  assuan_context_t ctx;
+  const unsigned char *keydata;
+  size_t keydatalen;
+};
+
+
+
+static char *default_reader_port;
+static app_t current_app;
+
+
+/* Local prototypes. */
+static assuan_error_t learn_status_cb (void *opaque, const char *line);
+
+
+/* To avoid cluttering the code with bunches of ifdefs we use a few
+   dummy functions instead and defines. */
+#ifndef ENABLE_AGENT_SUPPORT
+
+#define ASSUAN_LINELENGTH 100
+
+static assuan_context_t 
+agent_open (int try, const char *orig_codeset)
+{
+  return NULL;
+}
+
+void 
+agent_close (assuan_context_t ctx)
+{
+}
+
+const char *
+assuan_strerror (assuan_error_t err)
+{
+  return "no Assuan support";
+}
+
+assuan_error_t 
+assuan_transact (assuan_context_t ctx,
+                 const char *command,
+                 assuan_error_t (*data_cb)(void *, const void *, size_t),
+                 void *data_cb_arg,
+                 assuan_error_t (*inquire_cb)(void*, const char *),
+                 void *inquire_cb_arg,
+                 assuan_error_t (*status_cb)(void*, const char *),
+                 void *status_cb_arg)
+{
+  return 100; /* ASSUAN_NOT_IMPLEMENTED */
+}
+assuan_error_t 
+assuan_send_data (assuan_context_t ctx, const void *buffer, size_t length)
+{
+  return 100; /* ASSUAN_NOT_IMPLEMENTED */
+}  
+#endif /*!ENABLE_AGENT_SUPPORT*/
+
+\f
+/* Create a serialno/fpr string from the serial number and the secret
+   key.  caller must free the returned string.  There is no error
+   return. [Taken from 1.9's keyid.c]*/
+char *
+serialno_and_fpr_from_sk (const unsigned char *sn, size_t snlen,
+                          PKT_secret_key *sk)
+{
+  unsigned char fpr[MAX_FINGERPRINT_LEN];
+  size_t fprlen;
+  char *buffer, *p;
+  int i;
+  
+  fingerprint_from_sk (sk, fpr, &fprlen);
+  buffer = p = xmalloc (snlen*2 + 1 + fprlen*2 + 1);
+  for (i=0; i < snlen; i++, p+=2)
+    sprintf (p, "%02X", sn[i]);
+  *p++ = '/';
+  for (i=0; i < fprlen; i++, p+=2)
+    sprintf (p, "%02X", fpr[i]);
+  *p = 0;
+  return buffer;
+}
+
+
+/* Send a line with status information via assuan and escape all given
+   buffers. The variable elements are pairs of (char *, size_t),
+   terminated with a (NULL, 0). */
+void
+send_status_info (ctrl_t ctrl, const char *keyword, ...)
+{
+  va_list arg_ptr;
+  const unsigned char *value;
+  size_t valuelen;
+  char buf[950], *p;
+  size_t n;
+  
+  va_start (arg_ptr, keyword);
+
+  p = buf; 
+  n = 0;
+  valuelen = strlen (keyword);
+  for ( ; valuelen && n < DIM (buf)-2; n++, valuelen--, keyword++)
+    *p++ = *keyword;
+
+  while ( (value = va_arg (arg_ptr, const unsigned char *)) )
+    {
+      valuelen = va_arg (arg_ptr, size_t);
+      if (!valuelen)
+        continue; /* empty buffer */
+      if (n)
+        {
+          *p++ = ' ';
+          n++;
+        }
+      for ( ; valuelen && n < DIM (buf)-2; n++, valuelen--, value++)
+        {
+          if (*value < ' ' || *value == '+')
+            {
+              sprintf (p, "%%%02X", *value);
+              p += 3;
+            }
+          else if (*value == ' ')
+            *p++ = '+';
+          else
+            *p++ = *value;
+        }
+    }
+  *p = 0;
+  if (ctrl && ctrl->status_cb)
+    ctrl->status_cb (ctrl->status_cb_arg, buf);
+
+  va_end (arg_ptr);
+}
+
+
+/* Replacement function of the Libgcrypt onewhich is used in gnupg
+   1.9.  Thus function computes the digest of ALGO from the data in
+   BUFFER of LENGTH.  ALGO must be supported. */
+void 
+gcry_md_hash_buffer (int algo, void *digest,
+                     const void *buffer, size_t length)
+{
+  MD_HANDLE h = md_open (algo, 0);
+  if (!h)
+    BUG();
+  md_write (h, (byte *) buffer, length);
+  md_final (h);
+  memcpy (digest, md_read (h, algo), md_digest_length (algo));
+  md_close (h);
+}
+
+
+/* This is a limited version of the one in 1.9 but it should be
+   sufficient here. */
+void
+log_printf (const char *fmt, ...)
+{
+  va_list arg_ptr;
+
+  va_start (arg_ptr, fmt);
+  vfprintf (log_stream (), fmt, arg_ptr);
+  va_end (arg_ptr);
+}
+
+
+
+/* Print a hexdump of BUFFER.  With TEXT of NULL print just the raw
+   dump, with TEXT just an empty string, print a trailing linefeed,
+   otherwise print an entire debug line. */
+void
+log_printhex (const char *text, const void *buffer, size_t length)
+{
+  if (text && *text)
+    log_debug ("%s ", text);
+  if (length)
+    {
+      const unsigned char *p = buffer;
+      log_printf ("%02X", *p);
+      for (length--, p++; length--; p++)
+        log_printf (" %02X", *p);
+    }
+  if (text)
+    log_printf ("\n");
+}
+
+
+
+void
+app_set_default_reader_port (const char *portstr)
+{
+  xfree (default_reader_port);
+  default_reader_port = portstr? xstrdup (portstr): NULL;
+}
+
+
+void
+card_set_reader_port (const char *portstr)
+{
+  app_set_default_reader_port (portstr);
+}
+
+
+/* Retrieve the serial number and the time of the last update of the
+   card.  The serial number is returned as a malloced string (hex
+   encoded) in SERIAL and the time of update is returned in STAMP.  If
+   no update time is available the returned value is 0.  Caller must
+   free SERIAL unless the function returns an error. */
+int 
+app_get_serial_and_stamp (app_t app, char **serial, time_t *stamp)
+{
+  unsigned char *buf, *p;
+  int i;
+
+  if (!app || !serial || !stamp)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  *serial = NULL;
+  *stamp = 0; /* not available */
+
+  buf = xtrymalloc (app->serialnolen * 2 + 1);
+  if (!buf)
+    return gpg_error_from_errno (errno);
+  for (p=buf, i=0; i < app->serialnolen; p +=2, i++)
+    sprintf (p, "%02X", app->serialno[i]);
+  *p = 0;
+  *serial = buf;
+  return 0;
+}
+
+
+
+/* Release the card info structure. */
+void 
+agent_release_card_info (struct agent_card_info_s *info)
+{
+  int i;
+
+  if (!info)
+    return;
+
+  xfree (info->serialno); info->serialno = NULL;
+  xfree (info->disp_name); info->disp_name = NULL;
+  xfree (info->disp_lang); info->disp_lang = NULL;
+  xfree (info->pubkey_url); info->pubkey_url = NULL;
+  xfree (info->login_data); info->login_data = NULL;
+  info->fpr1valid = info->fpr2valid = info->fpr3valid = 0;
+  info->cafpr1valid = info->cafpr2valid = info->cafpr3valid = 0;
+  for (i=0; i < 4; i++)
+    {
+      xfree (info->private_do[i]);
+      info->private_do[i] = NULL;
+    }
+}
+
+
+/* Print an error message for a failed assuan_transact and return a
+   gpg error code. No error is printed if RC is 0. */
+static gpg_error_t
+test_transact (int rc, const char *command)
+{
+  if (!rc)
+    return 0;
+  log_error ("sending command `%s' to agent failed: %s\n",
+             command, assuan_strerror (rc));
+  return gpg_error (GPG_ERR_CARD);
+}
+
+
+/* Try to open a card using an already running agent.  Prepare a
+   proper application context and return it. */
+static app_t
+open_card_via_agent (int *scd_available)
+{
+  assuan_context_t ctx;
+  app_t app;
+  struct agent_card_info_s info;
+  int rc;
+
+  *scd_available = 0;
+  ctx = agent_open (1, NULL);
+  if (!ctx)
+    return NULL;
+
+  /* Request the serialbnumber of the card.  If we get
+     NOT_SUPPORTED or NO_SCDAEMON back, the gpg-agent either has
+     disabled scdaemon or it can't be used.  We close the connection
+     in this case and use our own code.  This may happen if just the
+     gpg-agent has been installed for the sake of passphrase
+     caching. */
+  memset (&info, 0, sizeof info);
+  rc = assuan_transact (ctx, "SCD SERIALNO openpgp",
+                        NULL, NULL, NULL, NULL,
+                        learn_status_cb, &info);
+  if (rc)
+    {
+      if ((rc & 0xffff) == 60 || (rc & 0xffff) == 119)
+        ;  /* No scdaemon available to gpg-agent. */
+      else
+        {
+          write_status_text (STATUS_CARDCTRL, "4");
+          log_info ("selecting openpgp failed: %s\n", assuan_strerror (rc));
+          *scd_available = 1;
+        }
+      agent_release_card_info (&info);
+      agent_close (ctx);
+      return NULL;
+    }
+  
+  app = xcalloc (1, sizeof *app);
+  app->assuan_ctx = ctx;
+
+  return app;
+}
+
+
+
+/* Open the current card and select the openpgp application.  Return
+   an APP context handle to be used for further procesing or NULL on
+   error or if no OpenPGP application exists.*/
+static app_t
+open_card (void)
+{
+  int slot = -1;
+  int rc;
+  app_t app;
+  int did_shutdown = 0;
+  int retry_count = 0;
+
+  /* First check whether we can contact a gpg-agent and divert all
+     operation to it. This is required because gpg as well as the
+     agent require exclusive access to the reader. */
+  if (opt.use_agent)
+    {
+      int scd_available;
+
+      app = open_card_via_agent (&scd_available);
+      if (app)
+        goto ready; /* Yes, there is a agent with a usable card, go that way. */
+      if (scd_available)
+        return NULL; /* agent avilabale but card problem. */
+    }
+
+
+  /* No agent or usable agent, thus we do it on our own. */
+  card_close ();
+  
+ retry:
+  if (did_shutdown)
+    apdu_reset (slot);
+  else
+    {
+      slot = apdu_open_reader (default_reader_port);
+      if (slot == -1)
+        {
+          write_status_text (STATUS_CARDCTRL, "5");
+          log_error (_("card reader not available\n"));
+          return NULL;
+        }
+    }
+
+  app = xcalloc (1, sizeof *app);
+  app->slot = slot;
+  rc = app_select_openpgp (app);
+  if (opt.limit_card_insert_tries 
+      && ++retry_count >= opt.limit_card_insert_tries)
+    ;
+  else if (rc && !opt.batch)
+    {
+      write_status_text (STATUS_CARDCTRL, "1");
+      
+      did_shutdown = !!apdu_shutdown_reader (slot);
+
+      if ( cpr_get_answer_okay_cancel ("cardctrl.insert_card.okay",
+           _("Please insert the card and hit return or enter 'c' to cancel: "),
+                                       1) )
+        {
+          if (!did_shutdown)
+            apdu_close_reader (slot);
+          xfree (app);
+          goto retry;
+        }
+    }
+  if (rc)
+    {
+      write_status_text (STATUS_CARDCTRL, "4");
+      log_info (_("selecting openpgp failed: %s\n"), gpg_strerror (rc));
+      apdu_close_reader (slot);
+      xfree (app);
+      return NULL;
+    }
+
+ ready:
+  app->initialized = 1;
+  current_app = app;
+  if (is_status_enabled () )
+    {
+      int i;
+      char *p, *buf;
+
+      buf = xmalloc (5 + app->serialnolen * 2 + 1);
+      p = stpcpy (buf, "3 ");
+      for (i=0; i < app->serialnolen; p +=2, i++)
+        sprintf (p, "%02X", app->serialno[i]);
+      write_status_text (STATUS_CARDCTRL, buf);
+      xfree (buf);
+    }
+
+  return app;
+}
+
+
+void
+card_close (void)
+{
+  if (current_app)
+    {
+      app_t app = current_app;
+      current_app = NULL;
+
+      if (app->assuan_ctx)
+        agent_close (app->assuan_ctx);
+      else
+        apdu_close_reader (app->slot);
+      xfree (app);
+    }
+}
+
+
+/* Format a cache ID from the serialnumber in SN and return it as an
+   allocated string.  In case of an error NULL is returned. */
+static char *
+format_cacheid (const char *sn)
+{
+  const char *s;
+  size_t snlen;
+  char *cacheid = NULL;
+
+  /* The serialnumber we use for a card is "CARDSN:serialno".  Where
+     serialno is the BCD string (i.e. hex string) with the full
+     number.  The serial number expect here constsis of hexdigits
+     followed by other characters, we cut off these other
+     characters. */
+  if (sn)
+    {
+      for (s=sn,snlen=0; hexdigitp (s); s++, snlen++)
+        ;
+      if (snlen == 32)
+        {
+          /* Yes, this looks indeed like an OpenPGP card S/N. */
+          cacheid = xtrymalloc (7+snlen+1);
+          if (cacheid)
+            {
+              memcpy (cacheid, "CARDSN:", 7);
+              memcpy (cacheid+7, sn, snlen);
+              cacheid[7+snlen] = 0;
+            }
+        }
+    }
+  return cacheid;
+}
+
+
+/* If RC is not 0, write an appropriate status message. */
+static void
+status_sc_op_failure (int rc)
+{
+  if (rc == G10ERR_CANCELED)
+    write_status_text (STATUS_SC_OP_FAILURE, "1");
+  else if (rc == G10ERR_BAD_PASS)
+    write_status_text (STATUS_SC_OP_FAILURE, "2");
+  else if (rc)
+    write_status (STATUS_SC_OP_FAILURE);
+}  
+
+
+/* Check that the serial number of the current card (as described by
+   APP) matches SERIALNO.  If there is no match and we are not in
+   batch mode, present a prompt to insert the desired card.  The
+   function returnd 0 if the present card is okay, -1 if the user
+   selected to insert a new card or an error value.  Note that the
+   card context will be closed in all cases except for 0 as return
+   value and if it was possible to merely shutdown the reader. */
+static int
+check_card_serialno (app_t app, const char *serialno)
+{
+  const char *s;
+  int ask = 0;
+  int n;
+
+  for (s = serialno, n=0; *s != '/' && hexdigitp (s); s++, n++)
+    ;
+  if (n != 32)
+    {
+      log_error ("invalid serial number in keyring detected\n");
+      return gpg_error (GPG_ERR_INV_ID);
+    }
+  if (app->serialnolen != 16)
+    ask = 1;
+  for (s = serialno, n=0; !ask && n < 16; s += 2, n++)
+    if (app->serialno[n] != xtoi_2 (s))
+      ask = 1;
+  if (ask)
+    {
+      char buf[5+32+1];
+      int did_shutdown = 0;
+
+      if (current_app && !apdu_shutdown_reader (current_app->slot))
+        did_shutdown = 1;
+      else
+        card_close ();
+
+      if (!opt.batch)
+        tty_printf (_("Please remove the current card and "
+                      "insert the one with serial number:\n"
+                      "   %.*s\n"), 32, serialno);
+
+      sprintf (buf, "1 %.32s", serialno);
+      write_status_text (STATUS_CARDCTRL, buf);
+
+      if ( !opt.batch
+           && cpr_get_answer_okay_cancel ("cardctrl.change_card.okay",
+                                          _("Hit return when ready "
+                                            "or enter 'c' to cancel: "),
+                                          1) )
+        {
+          card_close ();
+          return -1;
+        }
+      if (did_shutdown)
+        apdu_reset (current_app->slot);
+      else
+        card_close ();
+      return gpg_error (GPG_ERR_INV_ID);
+    }
+  return 0;
+}
+
+
+/* Take a 20 byte hexencoded string and put it into the the provided
+   20 byte buffer FPR in binary format. */
+static int
+unhexify_fpr (const char *hexstr, unsigned char *fpr)
+{
+  const char *s;
+  int n;
+
+  for (s=hexstr, n=0; hexdigitp (s); s++, n++)
+    ;
+  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 */
+}
+
+/* Take the serial number from LINE and return it verbatim in a newly
+   allocated string.  We make sure that only hex characters are
+   returned. */
+static char *
+store_serialno (const char *line)
+{
+  const char *s;
+  char *p;
+
+  for (s=line; hexdigitp (s); s++)
+    ;
+  p = xmalloc (s + 1 - line);
+  memcpy (p, line, s-line);
+  p[s-line] = 0;
+  return p;
+}
+
+
+
+static assuan_error_t
+learn_status_cb (void *opaque, const char *line)
+{
+  struct agent_card_info_s *parm = opaque;
+  const char *keyword = line;
+  int keywordlen;
+  int i;
+
+/*   log_debug ("got status line `%s'\n", line); */
+  for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
+    ;
+  while (spacep (line))
+    line++;
+
+  if (keywordlen == 8 && !memcmp (keyword, "SERIALNO", keywordlen))
+    {
+      xfree (parm->serialno);
+      parm->serialno = store_serialno (line);
+    }
+  else if (keywordlen == 9 && !memcmp (keyword, "DISP-NAME", keywordlen))
+    {
+      xfree (parm->disp_name);
+      parm->disp_name = unescape_percent_string (line);
+    }
+  else if (keywordlen == 9 && !memcmp (keyword, "DISP-LANG", keywordlen))
+    {
+      xfree (parm->disp_lang);
+      parm->disp_lang = unescape_percent_string (line);
+    }
+  else if (keywordlen == 8 && !memcmp (keyword, "DISP-SEX", keywordlen))
+    {
+      parm->disp_sex = *line == '1'? 1 : *line == '2' ? 2: 0;
+    }
+  else if (keywordlen == 10 && !memcmp (keyword, "PUBKEY-URL", keywordlen))
+    {
+      xfree (parm->pubkey_url);
+      parm->pubkey_url = unescape_percent_string (line);
+    }
+  else if (keywordlen == 10 && !memcmp (keyword, "LOGIN-DATA", keywordlen))
+    {
+      xfree (parm->login_data);
+      parm->login_data = unescape_percent_string (line);
+    }
+  else if (keywordlen == 11 && !memcmp (keyword, "SIG-COUNTER", keywordlen))
+    {
+      parm->sig_counter = strtoul (line, NULL, 0);
+    }
+  else if (keywordlen == 10 && !memcmp (keyword, "CHV-STATUS", keywordlen))
+    {
+      char *p, *buf;
+
+      buf = p = unescape_percent_string (line);
+      if (buf)
+        {
+          while (spacep (p))
+            p++;
+          parm->chv1_cached = atoi (p);
+          while (*p && !spacep (p))
+            p++;
+          while (spacep (p))
+            p++;
+          for (i=0; *p && i < 3; i++)
+            {
+              parm->chvmaxlen[i] = atoi (p);
+              while (*p && !spacep (p))
+                p++;
+              while (spacep (p))
+                p++;
+            }
+          for (i=0; *p && i < 3; i++)
+            {
+              parm->chvretry[i] = atoi (p);
+              while (*p && !spacep (p))
+                p++;
+              while (spacep (p))
+                p++;
+            }
+          xfree (buf);
+        }
+    }
+  else if (keywordlen == 7 && !memcmp (keyword, "KEY-FPR", keywordlen))
+    {
+      int no = atoi (line);
+      while (* line && !spacep (line))
+        line++;
+      while (spacep (line))
+        line++;
+      if (no == 1)
+        parm->fpr1valid = unhexify_fpr (line, parm->fpr1);
+      else if (no == 2)
+        parm->fpr2valid = unhexify_fpr (line, parm->fpr2);
+      else if (no == 3)
+        parm->fpr3valid = unhexify_fpr (line, parm->fpr3);
+    }
+  else if (keywordlen == 8 && !memcmp (keyword, "KEY-TIME", keywordlen))
+    {
+      int no = atoi (line);
+      while (* line && !spacep (line))
+        line++;
+      while (spacep (line))
+        line++;
+      if (no == 1)
+        parm->fpr1time = strtoul (line, NULL, 10);
+      else if (no == 2)
+        parm->fpr2time = strtoul (line, NULL, 10);
+      else if (no == 3)
+        parm->fpr3time = strtoul (line, NULL, 10);
+    }
+  else if (keywordlen == 6 && !memcmp (keyword, "CA-FPR", keywordlen))
+    {
+      int no = atoi (line);
+      while (*line && !spacep (line))
+        line++;
+      while (spacep (line))
+        line++;
+      if (no == 1)
+        parm->cafpr1valid = unhexify_fpr (line, parm->cafpr1);
+      else if (no == 2)
+        parm->cafpr2valid = unhexify_fpr (line, parm->cafpr2);
+      else if (no == 3)
+        parm->cafpr3valid = unhexify_fpr (line, parm->cafpr3);
+    }
+  else if (keywordlen == 12 && !memcmp (keyword, "PRIVATE-DO-", 11)
+           && strchr ("1234", keyword[11]))
+    {
+      int no = keyword[11] - '1';
+      assert (no >= 0 && no <= 3);
+      xfree (parm->private_do[no]);
+      parm->private_do[no] = unescape_percent_string (line);
+    }
+  return 0;
+}
+
+
+/* Return card info. */
+int 
+agent_learn (struct agent_card_info_s *info)
+{
+  app_t app;
+  int rc;
+  struct ctrl_ctx_s ctrl;
+  time_t stamp;
+  char *serial;
+  
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  memset (info, 0, sizeof *info);
+
+  if (app->assuan_ctx)
+    {
+      rc = assuan_transact (app->assuan_ctx, "SCD LEARN --force",
+                            NULL, NULL, NULL, NULL,
+                            learn_status_cb, info);
+      rc = test_transact (rc, "SCD LEARN");
+    }
+  else
+    {
+      memset (&ctrl, 0, sizeof ctrl);
+      ctrl.status_cb = learn_status_cb;
+      ctrl.status_cb_arg = info;
+
+      rc = app_get_serial_and_stamp (app, &serial, &stamp);
+      if (!rc)
+        {
+          send_status_info (&ctrl, "SERIALNO",
+                            serial, strlen(serial), NULL, 0);
+          xfree (serial);
+          rc = app->fnc.learn_status (app, &ctrl);
+        }
+    }
+
+  return rc;
+}
+
+
+/* Get an attribute from the card. Make sure info is initialized. */
+int 
+agent_scd_getattr (const char *name, struct agent_card_info_s *info)
+{
+  int rc;
+  app_t app;
+  struct ctrl_ctx_s ctrl;
+
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      char line[ASSUAN_LINELENGTH];
+
+      /* We assume that NAME does not need escaping. */
+      if (12 + strlen (name) > DIM(line)-1)
+        return gpg_error (GPG_ERR_CARD);
+      stpcpy (stpcpy (line, "SCD GETATTR "), name); 
+
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL,
+                                           learn_status_cb, info),
+                          "SCD GETATTR");
+    }
+  else
+    {
+      ctrl.status_cb = learn_status_cb;
+      ctrl.status_cb_arg = info;
+      rc = app->fnc.getattr (app, &ctrl, name);
+    }
+
+  return rc;
+}
+
+
+
+static int 
+pin_cb (void *opaque, const char *info, char **retstr)
+{
+  struct pincb_parm_s *parm = opaque;
+  char *value;
+  int canceled;
+  int isadmin = 0;
+  int newpin = 0;
+  const char *again_text = NULL;
+  const char *ends, *s;
+  char *cacheid = NULL;
+
+  *retstr = NULL;
+  /*   log_debug ("asking for PIN '%s'\n", info); */
+
+  /* We use a special prefix to check whether the Admin PIN has been
+     requested. */
+  if (info && *info =='|' && (ends=strchr (info+1, '|')))
+    {
+      for (s=info+1; s < ends; s++)
+        {
+          if (*s == 'A')
+            isadmin = 1;
+          else if (*s == 'N')
+            newpin = 1;
+        }
+      info = ends+1;
+    }
+  else if (info && *info == '|')
+    log_debug ("pin_cb called without proper PIN info hack\n");
+
+  /* If we are not requesting a new PIN and we are not requesting an
+     AdminPIN, compute a string to be used as the cacheID for
+     gpg-agent. */
+  if (!newpin && !isadmin && parm)
+    {
+      cacheid = format_cacheid (parm->sn);
+    }
+  else if (newpin && parm)
+    {
+      /* Make really sure that it is not cached anymore. */
+      agent_clear_pin_cache (parm->sn);
+    }
+
+
+ again:
+  if (is_status_enabled())
+    {
+      if (parm && parm->sn && *parm->sn)
+        {
+          char *buf = xmalloc ( 10 + strlen (parm->sn) + 1);
+          strcpy (stpcpy (buf, isadmin? "OPENPGP 3 ":"OPENPGP 1 "), parm->sn);
+          write_status_text (STATUS_NEED_PASSPHRASE_PIN, buf);
+          xfree (buf);
+        }
+      else  
+        write_status_text (STATUS_NEED_PASSPHRASE_PIN,
+                           isadmin? "OPENPGP 3" : "OPENPGP 1");
+    }
+
+  value = ask_passphrase (info, again_text,
+                          newpin && isadmin? "passphrase.adminpin.new.ask" :
+                          newpin?  "passphrase.pin.new.ask" :
+                          isadmin? "passphrase.adminpin.ask" :
+                                   "passphrase.pin.ask", 
+                          newpin && isadmin? _("Enter New Admin PIN: ") :
+                          newpin?  _("Enter New PIN: ") :
+                          isadmin? _("Enter Admin PIN: ")
+                                 : _("Enter PIN: "),
+                          cacheid,
+                          &canceled);
+  xfree (cacheid);
+  cacheid = NULL;
+  again_text = NULL;
+  if (!value && canceled)
+    return G10ERR_CANCELED;
+  else if (!value)
+    return G10ERR_GENERAL;
+
+  if (newpin)
+    {
+      char *value2;
+
+      value2 = ask_passphrase (info, NULL,
+                               "passphrase.pin.repeat", 
+                               _("Repeat this PIN: "),
+                               NULL,
+                               &canceled);
+      if (!value2 && canceled)
+        {
+          xfree (value);
+          return G10ERR_CANCELED;
+        }
+      else if (!value2)
+        {
+          xfree (value);
+          return G10ERR_GENERAL;
+        }
+      if (strcmp (value, value2))
+        {
+          again_text = N_("PIN not correctly repeated; try again");
+          xfree (value2);
+          xfree (value);
+          value = NULL;
+          goto again;
+        }
+      xfree (value2);
+    }
+
+  *retstr = value;
+  return 0;
+}
+
+
+
+/* Send a SETATTR command to the SCdaemon. */
+int 
+agent_scd_setattr (const char *name,
+                   const unsigned char *value, size_t valuelen,
+                   const char *serialno)
+{
+  app_t app;
+  int rc;
+  struct pincb_parm_s parm;
+
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialno;
+
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      char line[ASSUAN_LINELENGTH];
+      char *p;
+
+      /* We assume that NAME does not need escaping. */
+      if (12 + strlen (name) > DIM(line)-1)
+        return gpg_error (GPG_ERR_CARD);
+      p = stpcpy (stpcpy (line, "SCD SETATTR "), name); 
+      *p++ = ' ';
+      for (; valuelen; value++, valuelen--)
+        {
+          if (p >= line + DIM(line)-5 )
+            return gpg_error (GPG_ERR_CARD);
+          if (*value < ' ' || *value == '+' || *value == '%')
+            {
+              sprintf (p, "%%%02X", *value);
+              p += 3;
+            }
+          else if (*value == ' ')
+            *p++ = '+';
+          else
+            *p++ = *value;
+        }
+      *p = 0;
+
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL, NULL, NULL),
+                          "SCD SETATTR");
+    }
+  else
+    {
+      rc = app->fnc.setattr (app, name, pin_cb, &parm, value, valuelen);
+    }
+
+  status_sc_op_failure (rc);
+  return rc;
+}
+
+
+/* Handle a KEYDATA inquiry.  Note, we only send the data,
+   assuan_transact takes care of flushing and writing the end */
+static assuan_error_t
+inq_writekey_parms (void *opaque, const char *keyword)
+{
+  struct writekey_parm_s *parm = opaque; 
+
+  return assuan_send_data (parm->ctx, parm->keydata, parm->keydatalen);
+}
+
+
+/* Send a WRITEKEY command to the SCdaemon. */
+int 
+agent_scd_writekey (int keyno, const char *serialno,
+                    const unsigned char *keydata, size_t keydatalen)
+{
+  app_t app;
+  int rc;
+  char line[ASSUAN_LINELENGTH];
+  struct pincb_parm_s parm;
+
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialno;
+
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      struct writekey_parm_s parms;
+
+      snprintf (line, DIM(line)-1, "SCD WRITEKEY --force OPENPGP.%d", keyno);
+      line[DIM(line)-1] = 0;
+      parms.ctx = app->assuan_ctx;
+      parms.keydata = keydata;
+      parms.keydatalen = keydatalen;
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL,
+                                           inq_writekey_parms, &parms,
+                                           NULL, NULL),
+                          "SCD WRITEKEY");
+    }
+  else
+    {
+      snprintf (line, DIM(line)-1, "OPENPGP.%d", keyno);
+      line[DIM(line)-1] = 0;
+      rc = app->fnc.writekey (app, NULL, line, 0x0001,
+                              pin_cb, &parm,
+                              keydata, keydatalen);
+    }
+
+  status_sc_op_failure (rc);
+  return rc;
+}
+
+
+
+static assuan_error_t
+genkey_status_cb (void *opaque, const char *line)
+{
+  struct agent_card_genkey_s *parm = opaque;
+  const char *keyword = line;
+  int keywordlen;
+
+/*   log_debug ("got status line `%s'\n", line); */
+  for (keywordlen=0; *line && !spacep (line); line++, keywordlen++)
+    ;
+  while (spacep (line))
+    line++;
+
+  if (keywordlen == 7 && !memcmp (keyword, "KEY-FPR", keywordlen))
+    {
+      parm->fprvalid = unhexify_fpr (line, parm->fpr);
+    }
+  if (keywordlen == 8 && !memcmp (keyword, "KEY-DATA", keywordlen))
+    {
+      MPI a;
+      const char *name = line;
+      char *buf;
+
+      while (*line && !spacep (line))
+        line++;
+      while (spacep (line))
+        line++;
+
+      buf = xmalloc ( 2 + strlen (line) + 1);
+      strcpy (stpcpy (buf, "0x"), line);
+      a = mpi_alloc (300);
+      if( mpi_fromstr (a, buf) )
+        log_error ("error parsing received key data\n");
+      else if (*name == 'n' && spacep (name+1))
+        parm->n = a;
+      else if (*name == 'e' && spacep (name+1))
+        parm->e = a;
+      else
+        {
+          log_info ("unknown parameter name in received key data\n");
+          mpi_free (a);
+        }
+      xfree (buf);
+    }
+  else if (keywordlen == 14 && !memcmp (keyword,"KEY-CREATED-AT", keywordlen))
+    {
+      parm->created_at = (u32)strtoul (line, NULL, 10);
+    }
+
+  return 0;
+}
+
+/* Send a GENKEY command to the SCdaemon. */
+int 
+agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force,
+                  const char *serialno)
+{
+  app_t app;
+  char line[ASSUAN_LINELENGTH];
+  struct ctrl_ctx_s ctrl;
+  int rc;
+  struct pincb_parm_s parm;
+
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialno;
+
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  memset (info, 0, sizeof *info);
+
+  if (app->assuan_ctx)
+    {
+      snprintf (line, DIM(line)-1, "SCD GENKEY %s%d",
+                force? "--force ":"", keyno);
+      line[DIM(line)-1] = 0;
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL,
+                                           genkey_status_cb, info),
+                          "SCD GENKEY");
+    }
+  else
+    {
+      snprintf (line, DIM(line)-1, "%d", keyno);
+      ctrl.status_cb = genkey_status_cb;
+      ctrl.status_cb_arg = info;
+      rc = app->fnc.genkey (app, &ctrl, line,
+                            force? 1:0,
+                            pin_cb, &parm);
+    }
+
+  status_sc_op_failure (rc);
+  return rc;
+}
+
+
+static assuan_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;
+}
+  
+
+/* Send a PKSIGN command to the SCdaemon. */
+int 
+agent_scd_pksign (const char *serialno, int hashalgo,
+                  const unsigned char *indata, size_t indatalen,
+                  unsigned char **r_buf, size_t *r_buflen)
+{
+  struct pincb_parm_s parm;
+  app_t app;
+  int rc;
+
+  *r_buf = NULL;
+  *r_buflen = 0;
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialno;
+ retry:
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      char *p, line[ASSUAN_LINELENGTH];
+      membuf_t data;
+      size_t len;
+      int i;
+
+      if (indatalen*2 + 50 > DIM(line))
+        return gpg_error (GPG_ERR_GENERAL);
+
+      p = stpcpy (line, "SCD SETDATA ");
+      for (i=0; i < indatalen ; i++, p += 2 )
+        sprintf (p, "%02X", indata[i]);
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL, NULL, NULL),
+                          "SCD SETDATA");
+      if (!rc)
+        {
+          init_membuf (&data, 1024);
+          snprintf (line, DIM(line)-1, "SCD PKSIGN %s%s",
+                    hashalgo == GCRY_MD_RMD160? "--hash=rmd160 ": "",
+                    serialno);
+          line[DIM(line)-1] = 0;
+          rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                               membuf_data_cb, &data,
+                                               NULL, NULL, NULL, NULL),
+                              "SCD PKSIGN");
+          if (rc)
+            xfree (get_membuf (&data, &len));
+          else
+            *r_buf = get_membuf (&data, r_buflen);
+        }
+    }
+  else
+    {
+      /* Check that the card's serialnumber is as required.*/
+      rc = check_card_serialno (app, serialno);
+      if (rc == -1)
+        goto retry;
+
+      if (!rc)
+        rc = app->fnc.sign (app, serialno, hashalgo,
+                            pin_cb, &parm,
+                            indata, indatalen,
+                            r_buf, r_buflen);
+    }
+
+  if (rc)
+    {
+      status_sc_op_failure (rc);
+      if (!app->assuan_ctx)
+        agent_clear_pin_cache (serialno);
+    }
+  return rc;
+}
+
+
+/* Send a PKDECRYPT command to the SCdaemon. */
+int 
+agent_scd_pkdecrypt (const char *serialno,
+                     const unsigned char *indata, size_t indatalen,
+                     unsigned char **r_buf, size_t *r_buflen)
+{
+  struct pincb_parm_s parm;
+  app_t app;
+  int rc;
+
+  *r_buf = NULL;
+  *r_buflen = 0;
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialno;
+ retry:
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      char *p, line[ASSUAN_LINELENGTH];
+      membuf_t data;
+      size_t len;
+      int i;
+
+      if (indatalen*2 + 50 > DIM(line))
+        return gpg_error (GPG_ERR_GENERAL);
+
+      p = stpcpy (line, "SCD SETDATA ");
+      for (i=0; i < indatalen ; i++, p += 2 )
+        sprintf (p, "%02X", indata[i]);
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL, NULL, NULL),
+                          "SCD SETDATA");
+      if (!rc)
+        {
+          init_membuf (&data, 1024);
+          snprintf (line, DIM(line)-1, "SCD PKDECRYPT %s", serialno);
+          line[DIM(line)-1] = 0;
+          rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                               membuf_data_cb, &data,
+                                               NULL, NULL, NULL, NULL),
+                              "SCD PKDECRYPT");
+          if (rc)
+            xfree (get_membuf (&data, &len));
+          else
+            *r_buf = get_membuf (&data, r_buflen);
+        }
+    }
+  else
+    {
+      /* Check that the card's serialnumber is as required.*/
+      rc = check_card_serialno (app, serialno);
+      if (rc == -1)
+        goto retry;
+      
+      if (!rc)
+        rc = app->fnc.decipher (app, serialno, 
+                                pin_cb, &parm,
+                                indata, indatalen,
+                                r_buf, r_buflen);
+    }
+
+  if (rc)
+    {
+      status_sc_op_failure (rc);
+      if (!app->assuan_ctx)
+        agent_clear_pin_cache (serialno);
+    }
+  return rc;
+}
+
+/* Change the PIN of an OpenPGP card or reset the retry
+   counter. SERIALNO may be NULL or a hex string finally passed to the
+   passphrase callback. */
+int 
+agent_scd_change_pin (int chvno, const char *serialno)
+{
+  app_t app;
+  int reset = 0;
+  int rc;
+  struct pincb_parm_s parm;
+
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialno;
+
+  reset = (chvno >= 100);
+  chvno %= 100;
+
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      char line[ASSUAN_LINELENGTH];
+
+      snprintf (line, DIM(line)-1, "SCD PASSWD%s %d",
+                reset? " --reset":"", chvno);
+      line[DIM(line)-1] = 0;
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL, NULL, NULL),
+                          "SCD PASSWD");
+    }
+  else
+    {
+      char chvnostr[50];
+
+      sprintf (chvnostr, "%d", chvno);
+      rc = app->fnc.change_pin (app, NULL, chvnostr, reset,
+                                pin_cb, &parm);
+    }
+
+  status_sc_op_failure (rc);
+  return rc;
+}
+
+/* Perform a CHECKPIN operation.  SERIALNO should be the serial
+   number of the card - optionally followed by the fingerprint;
+   however the fingerprint is ignored here. */
+int
+agent_scd_checkpin (const char *serialnobuf)
+{
+  app_t app;
+  int rc;
+  struct pincb_parm_s parm;
+
+  memset (&parm, 0, sizeof parm);
+  parm.sn = serialnobuf;
+
+  app = current_app? current_app : open_card ();
+  if (!app)
+    return gpg_error (GPG_ERR_CARD);
+
+  if (app->assuan_ctx)
+    {
+      char line[ASSUAN_LINELENGTH];
+
+      if (15 + strlen (serialnobuf) > DIM(line)-1)
+        return gpg_error (GPG_ERR_CARD);
+      stpcpy (stpcpy (line, "SCD CHECKPIN "), serialnobuf); 
+      rc = test_transact (assuan_transact (app->assuan_ctx, line,
+                                           NULL, NULL, NULL, NULL, NULL, NULL),
+                          "SCD CHECKPIN");
+    }
+  else
+    {
+      rc = app->fnc.check_pin (app, serialnobuf, pin_cb, &parm);
+    }
+
+  status_sc_op_failure (rc);
+  return rc;
+}
+
+
+
+void
+agent_clear_pin_cache (const char *sn)
+{
+  char *cacheid = format_cacheid (sn);
+  if (cacheid)
+    {
+      passphrase_clear_cache (NULL, cacheid, 0);
+      xfree (cacheid);
+    }
+}
diff --git a/g10/cardglue.h b/g10/cardglue.h
new file mode 100644 (file)
index 0000000..b1f2811
--- /dev/null
@@ -0,0 +1,211 @@
+/* cardglue.h - Divert operations to the agent
+ * Copyright (C) 2003, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef GNUPG_G10_CARDGLUE_H
+#define GNUPG_G10_CARDGLUE_H 
+
+#ifdef ENABLE_CARD_SUPPORT
+/* 
+   Note, that most card related code has been taken from 1.9.x branch
+   and is maintained over there if at all possible.  Thus, if you make
+   changes here, please check that a similar change has been commited
+   to the 1.9.x branch.
+*/
+
+
+struct agent_card_info_s {
+  int error;         /* private. */
+  char *serialno;    /* malloced hex string. */
+  char *disp_name;   /* malloced. */
+  char *disp_lang;   /* malloced. */
+  int  disp_sex;     /* 0 = unspecified, 1 = male, 2 = female */
+  char *pubkey_url;  /* malloced. */
+  char *login_data;  /* malloced. */
+  char *private_do[4]; /* malloced. */
+  char cafpr1valid;
+  char cafpr2valid;
+  char cafpr3valid;
+  char cafpr1[20];
+  char cafpr2[20];
+  char cafpr3[20];
+  char fpr1valid;
+  char fpr2valid;
+  char fpr3valid;
+  char fpr1[20];
+  char fpr2[20];
+  char fpr3[20];
+  u32  fpr1time;
+  u32  fpr2time;
+  u32  fpr3time;
+  unsigned long sig_counter;
+  int chv1_cached;   /* True if a PIN is not required for each
+                        signing.  Note that the gpg-agent might cache
+                        it anyway. */
+  int chvmaxlen[3];  /* Maximum allowed length of a CHV. */
+  int chvretry[3];   /* Allowed retries for the CHV; 0 = blocked. */
+};
+
+struct agent_card_genkey_s {
+  char fprvalid;
+  char fpr[20];
+  u32  created_at;
+  MPI  n;
+  MPI  e;
+};
+
+
+struct app_ctx_s;
+struct ctrl_ctx_s;
+
+typedef struct app_ctx_s *APP; /* deprecated. */
+typedef struct app_ctx_s *app_t;
+typedef struct ctrl_ctx_s *CTRL; /* deprecated. */
+typedef struct ctrl_ctx_s *ctrl_t;
+
+
+#define GPG_ERR_GENERAL           G10ERR_GENERAL
+#define GPG_ERR_BAD_PIN           G10ERR_BAD_PASS
+#define GPG_ERR_BAD_KEY           G10ERR_BAD_KEY
+#define GPG_ERR_CARD              G10ERR_GENERAL
+#define GPG_ERR_EEXIST            G10ERR_FILE_EXISTS
+#define GPG_ERR_ENOMEM            G10ERR_RESOURCE_LIMIT
+#define GPG_ERR_GENERAL           G10ERR_GENERAL
+#define GPG_ERR_HARDWARE          G10ERR_GENERAL
+#define GPG_ERR_INV_CARD          G10ERR_GENERAL
+#define GPG_ERR_INV_ID            G10ERR_GENERAL
+#define GPG_ERR_INV_NAME          G10ERR_GENERAL
+#define GPG_ERR_INV_VALUE         G10ERR_INV_ARG
+#define GPG_ERR_INV_SEXP          G10ERR_INV_ARG
+#define GPG_ERR_NOT_SUPPORTED     G10ERR_UNSUPPORTED
+#define GPG_ERR_NO_OBJ            G10ERR_GENERAL
+#define GPG_ERR_PIN_BLOCKED       G10ERR_PASSPHRASE
+#define GPG_ERR_UNSUPPORTED_ALGORITHM G10ERR_PUBKEY_ALGO 
+#define GPG_ERR_USE_CONDITIONS    G10ERR_GENERAL
+#define GPG_ERR_WRONG_CARD        G10ERR_GENERAL
+#define GPG_ERR_WRONG_SECKEY      G10ERR_WRONG_SECKEY
+#define GPG_ERR_PIN_NOT_SYNCED    G10ERR_GENERAL
+#define GPG_ERR_NOT_FOUND         G10ERR_GENERAL
+#define GPG_ERR_BUG               G10ERR_GENERAL
+#define GPG_ERR_NOT_IMPLEMENTED   G10ERR_GENERAL
+#define GPG_ERR_BAD_BER           G10ERR_GENERAL
+#define GPG_ERR_EOF               (-1)
+#define GPG_ERR_CARD_NOT_PRESENT  G10ERR_NO_CARD
+#define GPG_ERR_CARD_RESET        G10ERR_GENERAL
+#define GPG_ERR_WRONG_PUBKEY_ALGO G10ERR_PUBKEY_ALGO
+#define GPG_ERR_UNKNOWN_SEXP      G10ERR_INV_ARG
+#define GPG_ERR_DUP_VALUE         G10ERR_INV_ARG
+#define GPG_ERR_BAD_SECKEY        G10ERR_BAD_SECKEY
+#define GPG_ERR_TOO_LARGE         G10ERR_GENERAL
+
+#define GPG_ERR_EBUSY             G10ERR_GENERAL
+#define GPG_ERR_ENOENT            G10ERR_OPEN_FILE
+#define GPG_ERR_EACCES            G10ERR_UNSUPPORTED
+#define GPG_ERR_EIO               G10ERR_GENERAL
+#define GPG_ERR_ENODEV            G10ERR_GENERAL
+#define GPG_ERR_CANCELED          G10ERR_CANCELED
+
+typedef int gpg_error_t;
+typedef int gpg_err_code_t;
+
+#define gpg_error(n) (n)
+#define gpg_err_code(n) (n)
+#define gpg_strerror(n) g10_errstr ((n))
+#define gpg_error_from_errno(n) (G10ERR_GENERAL) /*FIXME*/
+#define gpg_err_code_from_errno(n) (G10ERR_GENERAL)
+
+/* We are not using it in a library, so we even let xtrymalloc
+   abort. Because we won't never return from these malloc functions,
+   we also don't need the out_of_core function, we simply define it to
+   return -1 */
+#define xtrymalloc(n)    xmalloc((n))
+#define xtrycalloc(n,m)  xcalloc((n),(m))
+#define xtryrealloc(n,m) xrealloc((n),(m))
+#define xtrymalloc_secure(n)  xmalloc_secure((n))
+#define out_of_core()    (-1) 
+
+#define gnupg_get_time() make_timestamp ()
+
+
+void card_set_reader_port (const char *portstr);
+
+char *serialno_and_fpr_from_sk (const unsigned char *sn, size_t snlen,
+                                PKT_secret_key *sk);
+void send_status_info (ctrl_t ctrl, const char *keyword, ...);
+void gcry_md_hash_buffer (int algo, void *digest,
+                         const void *buffer, size_t length);
+void log_printf (const char *fmt, ...);
+void log_printhex (const char *text, const void *buffer, size_t length);
+
+
+#define GCRY_MD_SHA1 DIGEST_ALGO_SHA1
+#define GCRY_MD_RMD160 DIGEST_ALGO_RMD160
+
+void card_close (void);
+
+
+/* Release the card info structure. */
+void agent_release_card_info (struct agent_card_info_s *info);
+
+/* Return card info. */
+int agent_learn (struct agent_card_info_s *info);
+
+/* Check whether the secret key for the key identified by HEXKEYGRIP
+   is available.  Return 0 for yes or an error code. */
+int agent_havekey (const char *hexkeygrip);
+
+/* Return card info. */
+int agent_scd_getattr (const char *name, struct agent_card_info_s *info);
+
+/* Send a SETATTR command to the SCdaemon. */
+int agent_scd_setattr (const char *name,
+                       const unsigned char *value, size_t valuelen,
+                       const char *serialno);
+
+/* Send a WRITEKEY command to the SCdaemon. */
+int agent_scd_writekey (int keyno, const char *serialno,
+                        const unsigned char *keydata, size_t keydatalen);
+
+/* Send a GENKEY command to the SCdaemon. */
+int agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force,
+                      const char *serialno);
+
+/* Send a PKSIGN command to the SCdaemon. */
+int agent_scd_pksign (const char *keyid, int hashalgo,
+                      const unsigned char *indata, size_t indatalen,
+                      unsigned char **r_buf, size_t *r_buflen);
+
+/* Send a PKDECRYPT command to the SCdaemon. */
+int agent_scd_pkdecrypt (const char *serialno,
+                         const unsigned char *indata, size_t indatalen,
+                         unsigned char **r_buf, size_t *r_buflen);
+
+/* Change the PIN of an OpenPGP card or reset the retry counter. */
+int agent_scd_change_pin (int chvno, const char *serialno);
+
+/* Send a CHECKPIN command. */
+int agent_scd_checkpin (const char *serialnobuf);
+
+/* Clear a cached PIN. */
+void agent_clear_pin_cache (const char *sn);
+
+
+#endif /*ENABLE_CARD_SUPPORT*/
+#endif /*GNUPG_G10_CARDGLUE_H*/
+
diff --git a/g10/ccid-driver.c b/g10/ccid-driver.c
new file mode 100644 (file)
index 0000000..da8edb0
--- /dev/null
@@ -0,0 +1,2745 @@
+/* ccid-driver.c - USB ChipCardInterfaceDevices driver
+ *     Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+ *      Written by Werner Koch.
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * ALTERNATIVELY, this file may be distributed under the terms of the
+ * following license, in which case the provisions of this license are
+ * required INSTEAD OF the GNU General Public License. If you wish to
+ * allow use of your version of this file only under the terms of the
+ * GNU General Public License, and not to allow others to use your
+ * version of this file under the terms of the following license,
+ * indicate your decision by deleting this paragraph and the license
+ * below.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, and the entire permission notice in its entirety,
+ *    including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Date: 2006-02-14 17:28:34 +0100 (Tue, 14 Feb 2006) $
+ */
+
+
+/* CCID (ChipCardInterfaceDevices) is a specification for accessing
+   smartcard via a reader connected to the USB.  
+
+   This is a limited driver allowing to use some CCID drivers directly
+   without any other specila drivers. This is a fallback driver to be
+   used when nothing else works or the system should be kept minimal
+   for security reasons.  It makes use of the libusb library to gain
+   portable access to USB.
+
+   This driver has been tested with the SCM SCR335 and SPR532
+   smartcard readers and requires that a reader implements APDU or
+   TPDU level exchange and does fully automatic initialization.
+*/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined(HAVE_LIBUSB) || defined(TEST)
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <usb.h>
+
+#include "ccid-driver.h"
+
+#define DRVNAME "ccid-driver: "
+
+
+/* Depending on how this source is used we either define our error
+   output to go to stderr or to the jnlib based logging functions.  We
+   use the latter when GNUPG_MAJOR_VERSION is defines or when both,
+   GNUPG_SCD_MAIN_HEADER and HAVE_JNLIB_LOGGING are defined.
+*/
+#if defined(GNUPG_MAJOR_VERSION) \
+    || (defined(GNUPG_SCD_MAIN_HEADER) && defined(HAVE_JNLIB_LOGGING))
+
+#if defined(GNUPG_SCD_MAIN_HEADER)
+#  include GNUPG_SCD_MAIN_HEADER
+#elif GNUPG_MAJOR_VERSION == 1 /* GnuPG Version is < 1.9. */
+#  include "options.h"
+#  include "util.h"
+#  include "memory.h"
+#  include "cardglue.h"
+# else /* This is the modularized GnuPG 1.9 or later. */
+#  include "scdaemon.h"
+#endif
+
+
+# define DEBUGOUT(t)         do { if (debug_level) \
+                                  log_debug (DRVNAME t); } while (0)
+# define DEBUGOUT_1(t,a)     do { if (debug_level) \
+                                  log_debug (DRVNAME t,(a)); } while (0)
+# define DEBUGOUT_2(t,a,b)   do { if (debug_level) \
+                                  log_debug (DRVNAME t,(a),(b)); } while (0)
+# define DEBUGOUT_3(t,a,b,c) do { if (debug_level) \
+                                  log_debug (DRVNAME t,(a),(b),(c));} while (0)
+# define DEBUGOUT_4(t,a,b,c,d) do { if (debug_level) \
+                              log_debug (DRVNAME t,(a),(b),(c),(d));} while (0)
+# define DEBUGOUT_CONT(t)    do { if (debug_level) \
+                                  log_printf (t); } while (0)
+# define DEBUGOUT_CONT_1(t,a)  do { if (debug_level) \
+                                  log_printf (t,(a)); } while (0)
+# define DEBUGOUT_CONT_2(t,a,b)   do { if (debug_level) \
+                                  log_printf (t,(a),(b)); } while (0)
+# define DEBUGOUT_CONT_3(t,a,b,c) do { if (debug_level) \
+                                  log_printf (t,(a),(b),(c)); } while (0)
+# define DEBUGOUT_LF()       do { if (debug_level) \
+                                  log_printf ("\n"); } while (0)
+
+#else /* Other usage of this source - don't use gnupg specifics. */
+
+# define DEBUGOUT(t)          do { if (debug_level) \
+                     fprintf (stderr, DRVNAME t); } while (0)
+# define DEBUGOUT_1(t,a)      do { if (debug_level) \
+                     fprintf (stderr, DRVNAME t, (a)); } while (0)
+# define DEBUGOUT_2(t,a,b)    do { if (debug_level) \
+                     fprintf (stderr, DRVNAME t, (a), (b)); } while (0)
+# define DEBUGOUT_3(t,a,b,c)  do { if (debug_level) \
+                     fprintf (stderr, DRVNAME t, (a), (b), (c)); } while (0)
+# define DEBUGOUT_4(t,a,b,c,d)  do { if (debug_level) \
+                     fprintf (stderr, DRVNAME t, (a), (b), (c), (d));} while(0)
+# define DEBUGOUT_CONT(t)     do { if (debug_level) \
+                     fprintf (stderr, t); } while (0)
+# define DEBUGOUT_CONT_1(t,a) do { if (debug_level) \
+                     fprintf (stderr, t, (a)); } while (0)
+# define DEBUGOUT_CONT_2(t,a,b) do { if (debug_level) \
+                     fprintf (stderr, t, (a), (b)); } while (0)
+# define DEBUGOUT_CONT_3(t,a,b,c) do { if (debug_level) \
+                     fprintf (stderr, t, (a), (b), (c)); } while (0)
+# define DEBUGOUT_LF()        do { if (debug_level) \
+                     putc ('\n', stderr); } while (0)
+
+#endif /* This source not used by scdaemon. */
+
+
+
+enum {
+  RDR_to_PC_NotifySlotChange= 0x50,
+  RDR_to_PC_HardwareError   = 0x51,
+
+  PC_to_RDR_SetParameters   = 0x61,
+  PC_to_RDR_IccPowerOn      = 0x62,
+  PC_to_RDR_IccPowerOff     = 0x63,
+  PC_to_RDR_GetSlotStatus   = 0x65,
+  PC_to_RDR_Secure          = 0x69,
+  PC_to_RDR_T0APDU          = 0x6a,
+  PC_to_RDR_Escape          = 0x6b,
+  PC_to_RDR_GetParameters   = 0x6c,
+  PC_to_RDR_ResetParameters = 0x6d,
+  PC_to_RDR_IccClock        = 0x6e,
+  PC_to_RDR_XfrBlock        = 0x6f,
+  PC_to_RDR_Mechanical      = 0x71,
+  PC_to_RDR_Abort           = 0x72,
+  PC_to_RDR_SetDataRate     = 0x73,
+
+  RDR_to_PC_DataBlock       = 0x80,
+  RDR_to_PC_SlotStatus      = 0x81,
+  RDR_to_PC_Parameters      = 0x82,
+  RDR_to_PC_Escape          = 0x83,
+  RDR_to_PC_DataRate        = 0x84
+};
+
+
+/* Two macro to detect whether a CCID command has failed and to get
+   the error code.  These macros assume that we can access the
+   mandatory first 10 bytes of a CCID message in BUF. */
+#define CCID_COMMAND_FAILED(buf) ((buf)[7] & 0x40)
+#define CCID_ERROR_CODE(buf)     (((unsigned char *)(buf))[8])
+
+
+/* We need to know the vendor to do some hacks. */
+enum {
+  VENDOR_CHERRY = 0x046a,
+  VENDOR_SCM    = 0x04e6,
+  VENDOR_OMNIKEY= 0x076b,
+  VENDOR_GEMPC  = 0x08e6
+};
+
+/* A list and a table with special transport descriptions. */
+enum {
+  TRANSPORT_USB    = 0, /* Standard USB transport. */
+  TRANSPORT_CM4040 = 1  /* As used by the Cardman 4040. */
+};
+
+static struct
+{ 
+  char *name;  /* Device name. */
+  int  type;
+
+} transports[] = {
+  { "/dev/cmx0", TRANSPORT_CM4040 },  
+  { "/dev/cmx1", TRANSPORT_CM4040 },  
+  { NULL },
+};
+
+
+/* Store information on the driver's state.  A pointer to such a
+   structure is used as handle for most functions. */
+struct ccid_driver_s 
+{
+  usb_dev_handle *idev;
+  char *rid;
+  int dev_fd;  /* -1 for USB transport or file descriptor of the
+                   transport device. */
+  unsigned short id_vendor;
+  unsigned short id_product;
+  unsigned short bcd_device;
+  int ifc_no;
+  int ep_bulk_out;
+  int ep_bulk_in;
+  int ep_intr;
+  int seqno;
+  unsigned char t1_ns;
+  unsigned char t1_nr;
+  int nonnull_nad;
+  int auto_ifsd;
+  int max_ifsd;
+  int ifsd;
+  int powered_off;
+  int has_pinpad;
+  int apdu_level;     /* Reader supports short APDU level exchange.  */
+};
+
+
+static int initialized_usb; /* Tracks whether USB has been initialized. */
+static int debug_level;     /* Flag to control the debug output. 
+                               0 = No debugging
+                               1 = USB I/O info
+                               2 = T=1 protocol tracing
+                              */
+
+
+static unsigned int compute_edc (const unsigned char *data, size_t datalen,
+                                 int use_crc);
+static int bulk_out (ccid_driver_t handle, unsigned char *msg, size_t msglen);
+static int bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length,
+                    size_t *nread, int expected_type, int seqno, int timeout,
+                    int no_debug);
+
+/* Convert a little endian stored 4 byte value into an unsigned
+   integer. */
+static unsigned int 
+convert_le_u32 (const unsigned char *buf)
+{
+  return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); 
+}
+
+static void
+set_msg_len (unsigned char *msg, unsigned int length)
+{
+  msg[1] = length;
+  msg[2] = length >> 8;
+  msg[3] = length >> 16;
+  msg[4] = length >> 24;
+}
+
+
+/* Pint an error message for a failed CCID command including a textual
+   error code.  MSG is shall be the CCID message of at least 10 bytes. */
+static void
+print_command_failed (const unsigned char *msg)
+{
+  const char *t;
+  char buffer[100];
+  int ec;
+
+  if (!debug_level)
+    return;
+
+  ec = CCID_ERROR_CODE (msg);
+  switch (ec)
+    {
+    case 0x00: t = "Command not supported"; break;
+    
+    case 0xE0: t = "Slot busy"; break;
+    case 0xEF: t = "PIN cancelled"; break;
+    case 0xF0: t = "PIN timeout"; break;
+
+    case 0xF2: t = "Automatic sequence ongoing"; break;
+    case 0xF3: t = "Deactivated Protocol"; break;
+    case 0xF4: t = "Procedure byte conflict"; break;
+    case 0xF5: t = "ICC class not supported"; break;
+    case 0xF6: t = "ICC protocol not supported"; break;
+    case 0xF7: t = "Bad checksum in ATR"; break;
+    case 0xF8: t = "Bad TS in ATR"; break;
+
+    case 0xFB: t = "An all inclusive hardware error occurred"; break;
+    case 0xFC: t = "Overrun error while talking to the ICC"; break;
+    case 0xFD: t = "Parity error while talking to the ICC"; break;
+    case 0xFE: t = "CCID timed out while talking to the ICC"; break;
+    case 0xFF: t = "Host aborted the current activity"; break;
+
+    default:
+      if (ec > 0 && ec < 128)
+        sprintf (buffer, "Parameter error at offset %d", ec);
+      else
+        sprintf (buffer, "Error code %02X", ec);
+      t = buffer;
+      break;
+    }
+  DEBUGOUT_1 ("CCID command failed: %s\n", t);
+}
+  
+
+/* Given a handle used for special transport prepare it for use.  In
+   particular setup all information in way that resembles what
+   parse_cccid_descriptor does. */
+static void
+prepare_special_transport (ccid_driver_t handle)
+{
+  assert (!handle->id_vendor);
+
+  handle->nonnull_nad = 0;
+  handle->auto_ifsd = 0;
+  handle->max_ifsd = 32;
+  handle->ifsd = 0;
+  handle->has_pinpad = 0;
+  handle->apdu_level = 0;
+  switch (handle->id_product)
+    {
+    case TRANSPORT_CM4040:
+      DEBUGOUT ("setting up transport for CardMan 4040\n");
+      handle->apdu_level = 1;
+      break;
+
+    default: assert (!"transport not defined");
+    }
+}
+
+/* Parse a CCID descriptor, optionally print all available features
+   and test whether this reader is usable by this driver.  Returns 0
+   if it is usable.
+
+   Note, that this code is based on the one in lsusb.c of the
+   usb-utils package, I wrote on 2003-09-01. -wk. */
+static int
+parse_ccid_descriptor (ccid_driver_t handle,
+                       const unsigned char *buf, size_t buflen)
+{
+  unsigned int i;
+  unsigned int us;
+  int have_t1 = 0, have_tpdu=0, have_auto_conf = 0;
+
+
+  handle->nonnull_nad = 0;
+  handle->auto_ifsd = 0;
+  handle->max_ifsd = 32;
+  handle->ifsd = 0;
+  handle->has_pinpad = 0;
+  handle->apdu_level = 0;
+  DEBUGOUT_3 ("idVendor: %04X  idProduct: %04X  bcdDevice: %04X\n",
+              handle->id_vendor, handle->id_product, handle->bcd_device);
+  if (buflen < 54 || buf[0] < 54)
+    {
+      DEBUGOUT ("CCID device descriptor is too short\n");
+      return -1;
+    }
+
+  DEBUGOUT   ("ChipCard Interface Descriptor:\n");
+  DEBUGOUT_1 ("  bLength             %5u\n", buf[0]);
+  DEBUGOUT_1 ("  bDescriptorType     %5u\n", buf[1]);
+  DEBUGOUT_2 ("  bcdCCID             %2x.%02x", buf[3], buf[2]);
+    if (buf[3] != 1 || buf[2] != 0) 
+      DEBUGOUT_CONT("  (Warning: Only accurate for version 1.0)");
+  DEBUGOUT_LF ();
+
+  DEBUGOUT_1 ("  nMaxSlotIndex       %5u\n", buf[4]);
+  DEBUGOUT_2 ("  bVoltageSupport     %5u  %s\n",
+              buf[5], (buf[5] == 1? "5.0V" : buf[5] == 2? "3.0V"
+                       : buf[5] == 3? "1.8V":"?"));
+
+  us = convert_le_u32 (buf+6);
+  DEBUGOUT_1 ("  dwProtocols         %5u ", us);
+  if ((us & 1))
+    DEBUGOUT_CONT (" T=0");
+  if ((us & 2))
+    {
+      DEBUGOUT_CONT (" T=1");
+      have_t1 = 1;
+    }
+  if ((us & ~3))
+    DEBUGOUT_CONT (" (Invalid values detected)");
+  DEBUGOUT_LF ();
+
+  us = convert_le_u32(buf+10);
+  DEBUGOUT_1 ("  dwDefaultClock      %5u\n", us);
+  us = convert_le_u32(buf+14);
+  DEBUGOUT_1 ("  dwMaxiumumClock     %5u\n", us);
+  DEBUGOUT_1 ("  bNumClockSupported  %5u\n", buf[18]);
+  us = convert_le_u32(buf+19);
+  DEBUGOUT_1 ("  dwDataRate        %7u bps\n", us);
+  us = convert_le_u32(buf+23);
+  DEBUGOUT_1 ("  dwMaxDataRate     %7u bps\n", us);
+  DEBUGOUT_1 ("  bNumDataRatesSupp.  %5u\n", buf[27]);
+        
+  us = convert_le_u32(buf+28);
+  DEBUGOUT_1 ("  dwMaxIFSD           %5u\n", us);
+  handle->max_ifsd = us;
+
+  us = convert_le_u32(buf+32);
+  DEBUGOUT_1 ("  dwSyncProtocols  %08X ", us);
+  if ((us&1))
+    DEBUGOUT_CONT ( " 2-wire");
+  if ((us&2))
+    DEBUGOUT_CONT ( " 3-wire");
+  if ((us&4))
+    DEBUGOUT_CONT ( " I2C");
+  DEBUGOUT_LF ();
+
+  us = convert_le_u32(buf+36);
+  DEBUGOUT_1 ("  dwMechanical     %08X ", us);
+  if ((us & 1))
+    DEBUGOUT_CONT (" accept");
+  if ((us & 2))
+    DEBUGOUT_CONT (" eject");
+  if ((us & 4))
+    DEBUGOUT_CONT (" capture");
+  if ((us & 8))
+    DEBUGOUT_CONT (" lock");
+  DEBUGOUT_LF ();
+
+  us = convert_le_u32(buf+40);
+  DEBUGOUT_1 ("  dwFeatures       %08X\n", us);
+  if ((us & 0x0002))
+    {
+      DEBUGOUT ("    Auto configuration based on ATR\n");
+      have_auto_conf = 1;
+    }
+  if ((us & 0x0004))
+    DEBUGOUT ("    Auto activation on insert\n");
+  if ((us & 0x0008))
+    DEBUGOUT ("    Auto voltage selection\n");
+  if ((us & 0x0010))
+    DEBUGOUT ("    Auto clock change\n");
+  if ((us & 0x0020))
+    DEBUGOUT ("    Auto baud rate change\n");
+  if ((us & 0x0040))
+    DEBUGOUT ("    Auto parameter negotation made by CCID\n");
+  else if ((us & 0x0080))
+    DEBUGOUT ("    Auto PPS made by CCID\n");
+  else if ((us & (0x0040 | 0x0080)))
+    DEBUGOUT ("    WARNING: conflicting negotation features\n");
+
+  if ((us & 0x0100))
+    DEBUGOUT ("    CCID can set ICC in clock stop mode\n");
+  if ((us & 0x0200))
+    {
+      DEBUGOUT ("    NAD value other than 0x00 accepted\n");
+      handle->nonnull_nad = 1;
+    }
+  if ((us & 0x0400))
+    {
+      DEBUGOUT ("    Auto IFSD exchange\n");
+      handle->auto_ifsd = 1;
+    }
+
+  if ((us & 0x00010000))
+    {
+      DEBUGOUT ("    TPDU level exchange\n");
+      have_tpdu = 1;
+    } 
+  else if ((us & 0x00020000))
+    {
+      DEBUGOUT ("    Short APDU level exchange\n");
+      handle->apdu_level = 1;
+    }
+  else if ((us & 0x00040000))
+    {
+      DEBUGOUT ("    Short and extended APDU level exchange\n");
+      handle->apdu_level = 1;
+    }
+  else if ((us & 0x00070000))
+    DEBUGOUT ("    WARNING: conflicting exchange levels\n");
+
+  us = convert_le_u32(buf+44);
+  DEBUGOUT_1 ("  dwMaxCCIDMsgLen     %5u\n", us);
+
+  DEBUGOUT (  "  bClassGetResponse    ");
+  if (buf[48] == 0xff)
+    DEBUGOUT_CONT ("echo\n");
+  else
+    DEBUGOUT_CONT_1 ("  %02X\n", buf[48]);
+
+  DEBUGOUT (  "  bClassEnvelope       ");
+  if (buf[49] == 0xff)
+    DEBUGOUT_CONT ("echo\n");
+  else
+    DEBUGOUT_CONT_1 ("  %02X\n", buf[48]);
+
+  DEBUGOUT (  "  wlcdLayout           ");
+  if (!buf[50] && !buf[51])
+    DEBUGOUT_CONT ("none\n");
+  else
+    DEBUGOUT_CONT_2 ("%u cols %u lines\n", buf[50], buf[51]);
+        
+  DEBUGOUT_1 ("  bPINSupport         %5u ", buf[52]);
+  if ((buf[52] & 1))
+    {
+      DEBUGOUT_CONT ( " verification");
+      handle->has_pinpad |= 1;
+    }
+  if ((buf[52] & 2))
+    {
+      DEBUGOUT_CONT ( " modification");
+      handle->has_pinpad |= 2;
+    }
+  DEBUGOUT_LF ();
+        
+  DEBUGOUT_1 ("  bMaxCCIDBusySlots   %5u\n", buf[53]);
+
+  if (buf[0] > 54) {
+    DEBUGOUT ("  junk             ");
+    for (i=54; i < buf[0]-54; i++)
+      DEBUGOUT_CONT_1 (" %02X", buf[i]);
+    DEBUGOUT_LF ();
+  }
+
+  if (!have_t1 || !(have_tpdu  || handle->apdu_level) || !have_auto_conf)
+    {
+      DEBUGOUT ("this drivers requires that the reader supports T=1, "
+                "TPDU or APDU level exchange and auto configuration - "
+                "this is not available\n");
+      return -1;
+    }
+
+
+  /* SCM drivers get stuck in their internal USB stack if they try to
+     send a frame of n*wMaxPacketSize back to us.  Given that
+     wMaxPacketSize is 64 for these readers we set the IFSD to a value
+     lower than that:
+        64 - 10 CCID header -  4 T1frame - 2 reserved = 48
+     Product Ids:
+        0xe001 - SCR 331 
+        0x5111 - SCR 331-DI 
+        0x5115 - SCR 335 
+        0xe003 - SPR 532 
+  */
+  if (handle->id_vendor == VENDOR_SCM
+      && handle->max_ifsd > 48      
+      && (  (handle->id_product == 0xe001 && handle->bcd_device < 0x0516)
+          ||(handle->id_product == 0x5111 && handle->bcd_device < 0x0620)
+          ||(handle->id_product == 0x5115 && handle->bcd_device < 0x0514)
+          ||(handle->id_product == 0xe003 && handle->bcd_device < 0x0504)
+          ))
+    {
+      DEBUGOUT ("enabling workaround for buggy SCM readers\n");
+      handle->max_ifsd = 48;
+    }
+
+
+  return 0;
+}
+
+
+static char *
+get_escaped_usb_string (usb_dev_handle *idev, int idx,
+                        const char *prefix, const char *suffix)
+{
+  int rc;
+  unsigned char buf[280];
+  unsigned char *s;
+  unsigned int langid;
+  size_t i, n, len;
+  char *result;
+
+  if (!idx)
+    return NULL;
+
+  /* Fixme: The next line is for the current Valgrid without support
+     for USB IOCTLs. */
+  memset (buf, 0, sizeof buf);
+
+  /* First get the list of supported languages and use the first one.
+     If we do don't find it we try to use English.  Note that this is
+     all in a 2 bute Unicode encoding using little endian. */
+  rc = usb_control_msg (idev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
+                        (USB_DT_STRING << 8), 0, 
+                        (char*)buf, sizeof buf, 1000 /* ms timeout */);
+  if (rc < 4)
+    langid = 0x0409; /* English.  */
+  else
+    langid = (buf[3] << 8) | buf[2];
+
+  rc = usb_control_msg (idev, USB_ENDPOINT_IN, USB_REQ_GET_DESCRIPTOR,
+                        (USB_DT_STRING << 8) + idx, langid,
+                        (char*)buf, sizeof buf, 1000 /* ms timeout */);
+  if (rc < 2 || buf[1] != USB_DT_STRING)
+    return NULL; /* Error or not a string. */
+  len = buf[0];
+  if (len > rc)
+    return NULL; /* Larger than our buffer. */
+
+  for (s=buf+2, i=2, n=0; i+1 < len; i += 2, s += 2)
+    {
+      if (s[1])
+        n++; /* High byte set. */
+      else if (*s <= 0x20 || *s >= 0x7f || *s == '%' || *s == ':')
+        n += 3 ;
+      else 
+        n++;
+    }
+
+  result = malloc (strlen (prefix) + n + strlen (suffix) + 1);
+  if (!result)
+    return NULL;
+
+  strcpy (result, prefix);
+  n = strlen (prefix);
+  for (s=buf+2, i=2; i+1 < len; i += 2, s += 2)
+    {
+      if (s[1])
+        result[n++] = '\xff'; /* High byte set. */
+      else if (*s <= 0x20 || *s >= 0x7f || *s == '%' || *s == ':')
+        {
+          sprintf (result+n, "%%%02X", *s);
+          n += 3;
+        }
+      else 
+        result[n++] = *s;
+    }
+  strcpy (result+n, suffix);
+
+  return result;
+}
+
+/* This function creates an reader id to be used to find the same
+   physical reader after a reset.  It returns an allocated and possibly
+   percent escaped string or NULL if not enough memory is available. */
+static char *
+make_reader_id (usb_dev_handle *idev,
+                unsigned int vendor, unsigned int product,
+                unsigned char serialno_index)
+{
+  char *rid;
+  char prefix[20];
+
+  sprintf (prefix, "%04X:%04X:", (vendor & 0xffff), (product & 0xffff));
+  rid = get_escaped_usb_string (idev, serialno_index, prefix, ":0");
+  if (!rid)
+    {
+      rid = malloc (strlen (prefix) + 3 + 1);
+      if (!rid)
+        return NULL;
+      strcpy (rid, prefix);
+      strcat (rid, "X:0");
+    }
+  return rid;
+}
+
+
+/* Helper to find the endpoint from an interface descriptor.  */
+static int
+find_endpoint (struct usb_interface_descriptor *ifcdesc, int mode)
+{
+  int no;
+  int want_bulk_in = 0;
+
+  if (mode == 1)
+    want_bulk_in = 0x80;
+  for (no=0; no < ifcdesc->bNumEndpoints; no++)
+    {
+      struct usb_endpoint_descriptor *ep = ifcdesc->endpoint + no;
+      if (ep->bDescriptorType != USB_DT_ENDPOINT)
+        ;
+      else if (mode == 2
+          && ((ep->bmAttributes & USB_ENDPOINT_TYPE_MASK)
+              == USB_ENDPOINT_TYPE_INTERRUPT)
+          && (ep->bEndpointAddress & 0x80))
+        return (ep->bEndpointAddress & 0x0f);
+      else if (((ep->bmAttributes & USB_ENDPOINT_TYPE_MASK)
+                == USB_ENDPOINT_TYPE_BULK)
+               && (ep->bEndpointAddress & 0x80) == want_bulk_in)
+        return (ep->bEndpointAddress & 0x0f);
+    }
+  /* Should never happen.  */
+  return mode == 2? 0x83 : mode == 1? 0x82 :1;
+}
+
+
+/* Helper for scan_or_find_devices. This function returns true if a
+   requested device has been found or the caller should stop scanning
+   for other reasons. */
+static int
+scan_or_find_usb_device (int scan_mode,
+                         int *readerno, int *count, char **rid_list,
+                         const char *readerid,
+                         struct usb_device *dev,
+                         char **r_rid,
+                         struct usb_device **r_dev,
+                         usb_dev_handle **r_idev,
+                         unsigned char **ifcdesc_extra,
+                         size_t *ifcdesc_extra_len,
+                         int *interface_number,
+                         int *ep_bulk_out, int *ep_bulk_in, int *ep_intr)
+{
+  int cfg_no;
+  int ifc_no;
+  int set_no;
+  struct usb_config_descriptor *config;
+  struct usb_interface *interface;          
+  struct usb_interface_descriptor *ifcdesc;
+  char *rid;
+  usb_dev_handle *idev;
+
+  *r_idev = NULL;
+
+  for (cfg_no=0; cfg_no < dev->descriptor.bNumConfigurations; cfg_no++)
+    {
+      config = dev->config + cfg_no;
+      if(!config)
+        continue;
+
+      for (ifc_no=0; ifc_no < config->bNumInterfaces; ifc_no++)
+        {
+          interface = config->interface + ifc_no;
+          if (!interface)
+            continue;
+                  
+          for (set_no=0; set_no < interface->num_altsetting; set_no++)
+            {
+              ifcdesc = (interface->altsetting + set_no);
+              /* The second condition is for older SCM SPR 532 who did
+                 not know about the assigned CCID class.  Instead of
+                 trying to interpret the strings we simply check the
+                 product ID. */
+              if (ifcdesc && ifcdesc->extra
+                  && ((ifcdesc->bInterfaceClass == 11
+                       && ifcdesc->bInterfaceSubClass == 0
+                       && ifcdesc->bInterfaceProtocol == 0)
+                      || (ifcdesc->bInterfaceClass == 255
+                          && dev->descriptor.idVendor == VENDOR_SCM
+                          && dev->descriptor.idProduct == 0xe003)))
+                {
+                  idev = usb_open (dev);
+                  if (!idev)
+                    {
+                      DEBUGOUT_1 ("usb_open failed: %s\n",
+                                  strerror (errno));
+                      continue; /* with next setting. */
+                    }
+                  
+                  rid = make_reader_id (idev,
+                                        dev->descriptor.idVendor,
+                                        dev->descriptor.idProduct,
+                                        dev->descriptor.iSerialNumber);
+                  if (rid)
+                    {
+                      if (scan_mode)
+                        {
+                          char *p;
+                          
+                          /* We are collecting infos about all
+                             available CCID readers.  Store them and
+                             continue. */
+                          DEBUGOUT_2 ("found CCID reader %d (ID=%s)\n",
+                                      *count, rid );
+                          p = malloc ((*rid_list? strlen (*rid_list):0) + 1
+                                      + strlen (rid) + 1);
+                          if (p)
+                            {
+                              *p = 0;
+                              if (*rid_list)
+                                {
+                                  strcat (p, *rid_list);
+                                  free (*rid_list);
+                                }
+                              strcat (p, rid);
+                              strcat (p, "\n");
+                              *rid_list = p;
+                            }
+                          else /* Out of memory. */
+                            free (rid);
+                          
+                          rid = NULL;
+                          ++*count;
+                        }
+                      else if (!*readerno
+                               || (*readerno < 0
+                                   && readerid
+                                   && !strcmp (readerid, rid)))
+                        {
+                          /* We found the requested reader. */
+                          if (ifcdesc_extra && ifcdesc_extra_len)
+                            {
+                              *ifcdesc_extra = malloc (ifcdesc
+                                                       ->extralen);
+                              if (!*ifcdesc_extra)
+                                {
+                                  usb_close (idev);
+                                  free (rid);
+                                  return 1; /* Out of core. */
+                                }
+                              memcpy (*ifcdesc_extra, ifcdesc->extra,
+                                      ifcdesc->extralen);
+                              *ifcdesc_extra_len = ifcdesc->extralen;
+                            }
+
+                          if (interface_number)
+                            *interface_number = (ifcdesc->bInterfaceNumber);
+
+                          if (ep_bulk_out)
+                            *ep_bulk_out = find_endpoint (ifcdesc, 0);
+                          if (ep_bulk_in)
+                            *ep_bulk_in = find_endpoint (ifcdesc, 1);
+                          if (ep_intr)
+                            *ep_intr = find_endpoint (ifcdesc, 2);
+
+                          if (r_dev)
+                            *r_dev = dev;
+                          if (r_rid)
+                            {
+                              *r_rid = rid;
+                              rid = NULL;
+                            }
+                          else
+                            free (rid);
+                          
+                          *r_idev = idev;
+                          return 1; /* Found requested device. */
+                        }
+                      else
+                        {
+                          /* This is not yet the reader we want.
+                             fixme: We should avoid the extra usb_open
+                             in this case. */
+                          if (*readerno >= 0)
+                            --*readerno;
+                        }
+                      free (rid);
+                    }
+                  
+                  usb_close (idev);
+                  idev = NULL;
+                  return 0;
+                }
+            }
+        }
+    }
+
+  return 0;
+}
+
+/* Combination function to either scan all CCID devices or to find and
+   open one specific device. 
+
+   The function returns 0 if a reader has been found or when a scan
+   returned without error.
+
+   With READERNO = -1 and READERID is NULL, scan mode is used and
+   R_RID should be the address where to store the list of reader_ids
+   we found.  If on return this list is empty, no CCID device has been
+   found; otherwise it points to an allocated linked list of reader
+   IDs.  Note that in this mode the function always returns NULL.
+
+   With READERNO >= 0 or READERID is not NULL find mode is used.  This
+   uses the same algorithm as the scan mode but stops and returns at
+   the entry number READERNO and return the handle for the the opened
+   USB device. If R_RID is not NULL it will receive the reader ID of
+   that device.  If R_DEV is not NULL it will the device pointer of
+   that device.  If IFCDESC_EXTRA is NOT NULL it will receive a
+   malloced copy of the interfaces "extra: data filed;
+   IFCDESC_EXTRA_LEN receive the length of this field.  If there is
+   no reader with number READERNO or that reader is not usable by our
+   implementation NULL will be returned.  The caller must close a
+   returned USB device handle and free (if not passed as NULL) the
+   returned reader ID info as well as the IFCDESC_EXTRA.  On error
+   NULL will get stored at R_RID, R_DEV, IFCDESC_EXTRA and
+   IFCDESC_EXTRA_LEN.  With READERID being -1 the function stops if
+   the READERID was found.
+
+   If R_FD is not -1 on return the device is not using USB for
+   transport but the device associated with that file descriptor.  In
+   this case INTERFACE will receive the transport type and the other
+   USB specific return values are not used; the return value is
+   (void*)(1).
+
+   Note that the first entry of the returned reader ID list in scan mode
+   corresponds with a READERNO of 0 in find mode.
+*/
+static int
+scan_or_find_devices (int readerno, const char *readerid,
+                      char **r_rid,
+                      struct usb_device **r_dev,
+                      unsigned char **ifcdesc_extra,
+                      size_t *ifcdesc_extra_len,
+                      int *interface_number,
+                      int *ep_bulk_out, int *ep_bulk_in, int *ep_intr,
+                      usb_dev_handle **r_idev,
+                      int *r_fd)
+{
+  char *rid_list = NULL;
+  int count = 0;
+  struct usb_bus *busses, *bus;
+  struct usb_device *dev = NULL;
+  usb_dev_handle *idev = NULL;
+  int scan_mode = (readerno == -1 && !readerid);
+  int i;
+
+  /* Set return values to a default. */
+  if (r_rid)
+    *r_rid = NULL;
+  if (r_dev)
+    *r_dev = NULL; 
+  if (ifcdesc_extra)
+    *ifcdesc_extra = NULL;
+  if (ifcdesc_extra_len)
+    *ifcdesc_extra_len = 0;
+  if (interface_number)
+    *interface_number = 0;
+  if (r_idev)
+    *r_idev = NULL;
+  if (r_fd)
+    *r_fd = -1;
+
+  /* See whether we want scan or find mode. */
+  if (scan_mode) 
+    {
+      assert (r_rid);
+    }
+
+  usb_find_busses();
+  usb_find_devices();
+
+#ifdef HAVE_USB_GET_BUSSES
+  busses = usb_get_busses();
+#else
+  busses = usb_busses;
+#endif
+
+  for (bus = busses; bus; bus = bus->next) 
+    {
+      for (dev = bus->devices; dev; dev = dev->next)
+        {
+          if (scan_or_find_usb_device (scan_mode, &readerno, &count, &rid_list,
+                                       readerid,
+                                       dev,
+                                       r_rid,
+                                       r_dev,
+                                       &idev,
+                                       ifcdesc_extra,
+                                       ifcdesc_extra_len,
+                                       interface_number,
+                                       ep_bulk_out, ep_bulk_in, ep_intr))
+            {
+              /* Found requested device or out of core. */
+              if (!idev)
+                {
+                  free (rid_list);
+                  return -1; /* error */
+                }
+              *r_idev = idev;
+              return 0; 
+            }
+        }
+    }
+
+  /* Now check whether there are any devices with special transport types. */
+  for (i=0; transports[i].name; i++)
+    {
+      int fd;
+      char *rid, *p;
+
+      fd = open (transports[i].name, O_RDWR);
+      if (fd == -1)
+        continue;
+
+      rid = malloc (strlen (transports[i].name) + 30 + 10);
+      if (!rid)
+        {
+          close (fd);
+          free (rid_list);
+          return -1; /* Error. */
+        }
+      sprintf (rid, "0000:%04X:%s:0", transports[i].type, transports[i].name);
+      if (scan_mode)
+        {
+          DEBUGOUT_2 ("found CCID reader %d (ID=%s)\n", count, rid);
+          p = malloc ((rid_list? strlen (rid_list):0) + 1 + strlen (rid) + 1);
+          if (!p)
+            {
+              close (fd);
+              free (rid_list);
+              free (rid);
+              return -1; /* Error. */
+            }
+          *p = 0;
+          if (rid_list)
+            {
+              strcat (p, rid_list);
+              free (rid_list);
+            }
+          strcat (p, rid);
+          strcat (p, "\n");
+          rid_list = p;
+          ++count;
+        }
+      else if (!readerno ||
+               (readerno < 0 && readerid && !strcmp (readerid, rid)))
+        {
+          /* Found requested device. */
+          if (interface_number)
+            *interface_number = transports[i].type;
+          if (r_rid)
+            *r_rid = rid;
+          else
+            free (rid);
+          if (r_fd)
+            *r_fd = fd;
+          return 0; /* Okay, found device */
+        }
+      else /* This is not yet the reader we want. */
+        {
+          if (readerno >= 0)
+            --readerno;
+        }
+      free (rid);
+      close (fd);
+    }
+
+  if (scan_mode)
+    {
+      *r_rid = rid_list;
+      return 0;
+    }
+  else
+    return -1;
+}
+
+
+/* Set the level of debugging to LEVEL and return the old level.  -1
+   just returns the old level.  A level of 0 disables debugging, 1
+   enables debugging, 2 enables additional tracing of the T=1
+   protocol, other values are not yet defined. */
+int
+ccid_set_debug_level (int level)
+{
+  int old = debug_level;
+  if (level != -1)
+    debug_level = level;
+  return old;
+}
+
+
+char *
+ccid_get_reader_list (void)
+{
+  char *reader_list;
+
+  if (!initialized_usb)
+    {
+      usb_init ();
+      initialized_usb = 1;
+    }
+
+  if (scan_or_find_devices (-1, NULL, &reader_list, NULL, NULL, NULL, NULL,
+                            NULL, NULL, NULL, NULL, NULL))
+    return NULL; /* Error. */
+  return reader_list;
+}
+
+
+/* Open the reader with the internal number READERNO and return a 
+   pointer to be used as handle in HANDLE.  Returns 0 on success. */
+int 
+ccid_open_reader (ccid_driver_t *handle, const char *readerid)
+{
+  int rc = 0;
+  struct usb_device *dev = NULL;
+  usb_dev_handle *idev = NULL;
+  int dev_fd = -1;
+  char *rid = NULL;
+  unsigned char *ifcdesc_extra = NULL;
+  size_t ifcdesc_extra_len;
+  int readerno;
+  int ifc_no, ep_bulk_out, ep_bulk_in, ep_intr;
+
+  *handle = NULL;
+
+  if (!initialized_usb)
+    {
+      usb_init ();
+      initialized_usb = 1;
+    }
+
+  /* See whether we want to use the reader ID string or a reader
+     number. A readerno of -1 indicates that the reader ID string is
+     to be used. */
+  if (readerid && strchr (readerid, ':'))
+    readerno = -1; /* We want to use the readerid.  */
+  else if (readerid)
+    {
+      readerno = atoi (readerid);
+      if (readerno < 0)
+        {
+          DEBUGOUT ("no CCID readers found\n");
+          rc = CCID_DRIVER_ERR_NO_READER;
+          goto leave;
+        }
+    }
+  else
+    readerno = 0;  /* Default. */
+
+  if (scan_or_find_devices (readerno, readerid, &rid, &dev,
+                            &ifcdesc_extra, &ifcdesc_extra_len,
+                            &ifc_no, &ep_bulk_out, &ep_bulk_in, &ep_intr,
+                            &idev, &dev_fd) )
+    {
+      if (readerno == -1)
+        DEBUGOUT_1 ("no CCID reader with ID %s\n", readerid );
+      else
+        DEBUGOUT_1 ("no CCID reader with number %d\n", readerno );
+      rc = CCID_DRIVER_ERR_NO_READER;
+      goto leave;
+    }
+
+  /* Okay, this is a CCID reader. */
+  *handle = calloc (1, sizeof **handle);
+  if (!*handle)
+    {
+      DEBUGOUT ("out of memory\n");
+      rc = CCID_DRIVER_ERR_OUT_OF_CORE;
+      goto leave;
+    }
+  (*handle)->rid = rid;
+  if (idev) /* Regular USB transport. */
+    {
+      (*handle)->idev = idev;
+      (*handle)->dev_fd = -1;
+      (*handle)->id_vendor = dev->descriptor.idVendor;
+      (*handle)->id_product = dev->descriptor.idProduct;
+      (*handle)->bcd_device = dev->descriptor.bcdDevice;
+      (*handle)->ifc_no = ifc_no;
+      (*handle)->ep_bulk_out = ep_bulk_out;
+      (*handle)->ep_bulk_in = ep_bulk_in;
+      (*handle)->ep_intr = ep_intr;
+    }
+  else if (dev_fd != -1) /* Device transport. */
+    {
+      (*handle)->idev = NULL;
+      (*handle)->dev_fd = dev_fd;
+      (*handle)->id_vendor = 0;  /* Magic vendor for special transport. */
+      (*handle)->id_product = ifc_no; /* Transport type */
+      prepare_special_transport (*handle);
+    }
+  else
+    {
+      assert (!"no transport"); /* Bug. */
+    }
+
+  DEBUGOUT_2 ("using CCID reader %d (ID=%s)\n",  readerno, rid );
+
+  if (idev)
+    {
+      if (parse_ccid_descriptor (*handle, ifcdesc_extra, ifcdesc_extra_len))
+        {
+          DEBUGOUT ("device not supported\n");
+          rc = CCID_DRIVER_ERR_NO_READER;
+          goto leave;
+        }
+      
+      rc = usb_claim_interface (idev, ifc_no);
+      if (rc)
+        {
+          DEBUGOUT_1 ("usb_claim_interface failed: %d\n", rc);
+          rc = CCID_DRIVER_ERR_CARD_IO_ERROR;
+          goto leave;
+        }
+    }
+
+ leave:
+  free (ifcdesc_extra);
+  if (rc)
+    {
+      free (rid);
+      if (idev)
+        usb_close (idev);
+      if (dev_fd != -1)
+        close (dev_fd);
+      free (*handle);
+      *handle = NULL;
+    }
+
+  return rc;
+}
+
+
+static void
+do_close_reader (ccid_driver_t handle)
+{
+  int rc;
+  unsigned char msg[100];
+  size_t msglen;
+  unsigned char seqno;
+  
+  if (!handle->powered_off)
+    {
+      msg[0] = PC_to_RDR_IccPowerOff;
+      msg[5] = 0; /* slot */
+      msg[6] = seqno = handle->seqno++;
+      msg[7] = 0; /* RFU */
+      msg[8] = 0; /* RFU */
+      msg[9] = 0; /* RFU */
+      set_msg_len (msg, 0);
+      msglen = 10;
+      
+      rc = bulk_out (handle, msg, msglen);
+      if (!rc)
+        bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus,
+                 seqno, 2000, 0);
+      handle->powered_off = 1;
+    }
+  if (handle->idev)
+    {
+      usb_release_interface (handle->idev, handle->ifc_no);
+      usb_close (handle->idev);
+      handle->idev = NULL;
+    }
+  if (handle->dev_fd != -1)
+    {
+      close (handle->dev_fd);
+      handle->dev_fd = -1;
+    }
+}
+
+
+/* Reset a reader on HANDLE.  This is useful in case a reader has been
+   plugged of and inserted at a different port.  By resetting the
+   handle, the same reader will be get used.  Note, that on error the
+   handle won't get released. 
+
+   This does not return an ATR, so ccid_get_atr should be called right
+   after this one.
+*/
+int 
+ccid_shutdown_reader (ccid_driver_t handle)
+{
+  int rc = 0;
+  struct usb_device *dev = NULL;
+  usb_dev_handle *idev = NULL;
+  unsigned char *ifcdesc_extra = NULL;
+  size_t ifcdesc_extra_len;
+  int ifc_no, ep_bulk_out, ep_bulk_in, ep_intr;
+
+  if (!handle || !handle->rid)
+    return CCID_DRIVER_ERR_INV_VALUE;
+
+  do_close_reader (handle);
+
+  if (scan_or_find_devices (-1, handle->rid, NULL, &dev,
+                            &ifcdesc_extra, &ifcdesc_extra_len,
+                            &ifc_no, &ep_bulk_out, &ep_bulk_in, &ep_intr,
+                            &idev, NULL) || !idev)
+    {
+      DEBUGOUT_1 ("no CCID reader with ID %s\n", handle->rid);
+      return CCID_DRIVER_ERR_NO_READER;
+    }
+
+  if (idev)
+    {
+      handle->idev = idev;
+      handle->ifc_no = ifc_no;
+      handle->ep_bulk_out = ep_bulk_out;
+      handle->ep_bulk_in = ep_bulk_in;
+      handle->ep_intr = ep_intr;
+
+      if (parse_ccid_descriptor (handle, ifcdesc_extra, ifcdesc_extra_len))
+        {
+          DEBUGOUT ("device not supported\n");
+          rc = CCID_DRIVER_ERR_NO_READER;
+          goto leave;
+        }
+      
+      rc = usb_claim_interface (idev, ifc_no);
+      if (rc)
+        {
+          DEBUGOUT_1 ("usb_claim_interface failed: %d\n", rc);
+          rc = CCID_DRIVER_ERR_CARD_IO_ERROR;
+          goto leave;
+        }
+    }
+
+ leave:
+  free (ifcdesc_extra);
+  if (rc)
+    {
+      if (handle->idev)
+        usb_close (handle->idev);
+      handle->idev = NULL;
+      if (handle->dev_fd != -1)
+        close (handle->dev_fd);
+      handle->dev_fd = -1;
+    }
+
+  return rc;
+
+}
+
+
+/* Close the reader HANDLE. */
+int 
+ccid_close_reader (ccid_driver_t handle)
+{
+  if (!handle || (!handle->idev && handle->dev_fd == -1))
+    return 0;
+
+  do_close_reader (handle);
+  free (handle->rid);
+  free (handle);
+  return 0;
+}
+
+
+/* Return False if a card is present and powered. */
+int
+ccid_check_card_presence (ccid_driver_t handle)
+{
+
+  return -1;
+}
+
+
+/* Write NBYTES of BUF to file descriptor FD. */
+static int
+writen (int fd, const void *buf, size_t nbytes)
+{
+  size_t nleft = nbytes;
+  int nwritten;
+  
+  while (nleft > 0)
+    {
+      nwritten = write (fd, buf, nleft);
+      if (nwritten < 0)
+        {
+          if (errno == EINTR)
+            nwritten = 0;
+          else
+            return -1;
+        }
+      nleft -= nwritten;
+      buf = (const char*)buf + nwritten;
+    }
+    
+  return 0;
+}
+
+
+/* Write a MSG of length MSGLEN to the designated bulk out endpoint.
+   Returns 0 on success. */
+static int
+bulk_out (ccid_driver_t handle, unsigned char *msg, size_t msglen)
+{
+  int rc;
+
+  if (handle->idev)
+    {
+      rc = usb_bulk_write (handle->idev, 
+                           handle->ep_bulk_out,
+                           (char*)msg, msglen,
+                           1000 /* ms timeout */);
+      if (rc == msglen)
+        return 0;
+      if (rc == -1)
+        DEBUGOUT_1 ("usb_bulk_write error: %s\n", strerror (errno));
+      else
+        DEBUGOUT_1 ("usb_bulk_write failed: %d\n", rc);
+    }
+  else
+    {
+      rc = writen (handle->dev_fd, msg, msglen);
+      if (!rc)
+        return 0;
+      DEBUGOUT_2 ("writen to %d failed: %s\n",
+                  handle->dev_fd, strerror (errno));
+      
+    }
+  return CCID_DRIVER_ERR_CARD_IO_ERROR;
+}
+
+
+/* Read a maximum of LENGTH bytes from the bulk in endpoint into
+   BUFFER and return the actual read number if bytes in NREAD. SEQNO
+   is the sequence number used to send the request and EXPECTED_TYPE
+   the type of message we expect. Does checks on the ccid
+   header. TIMEOUT is the timeout value in ms. NO_DEBUG may be set to
+   avoid debug messages in case of no error. Returns 0 on success. */
+static int
+bulk_in (ccid_driver_t handle, unsigned char *buffer, size_t length,
+         size_t *nread, int expected_type, int seqno, int timeout,
+         int no_debug)
+{
+  int i, rc;
+  size_t msglen;
+
+  /* Fixme: The next line for the current Valgrind without support
+     for USB IOCTLs. */
+  memset (buffer, 0, length);
+ retry:
+  if (handle->idev)
+    {
+      rc = usb_bulk_read (handle->idev, 
+                          handle->ep_bulk_in,
+                          (char*)buffer, length,
+                          timeout);
+      if (rc < 0)
+        {
+          DEBUGOUT_1 ("usb_bulk_read error: %s\n", strerror (errno));
+          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+      *nread = msglen = rc;
+    }
+  else
+    {
+      rc = read (handle->dev_fd, buffer, length);
+      if (rc < 0)
+        {
+          DEBUGOUT_2 ("read from %d failed: %s\n",
+                      handle->dev_fd, strerror (errno));
+          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+      *nread = msglen = rc;
+    }
+
+
+  if (msglen < 10)
+    {
+      DEBUGOUT_1 ("bulk-in msg too short (%u)\n", (unsigned int)msglen);
+      return CCID_DRIVER_ERR_INV_VALUE;
+    }
+  if (buffer[0] != expected_type)
+    {
+      DEBUGOUT_1 ("unexpected bulk-in msg type (%02x)\n", buffer[0]);
+      return CCID_DRIVER_ERR_INV_VALUE;
+    }
+  if (buffer[5] != 0)    
+    {
+      DEBUGOUT_1 ("unexpected bulk-in slot (%d)\n", buffer[5]);
+      return CCID_DRIVER_ERR_INV_VALUE;
+    }
+  if (buffer[6] != seqno)    
+    {
+      DEBUGOUT_2 ("bulk-in seqno does not match (%d/%d)\n",
+                  seqno, buffer[6]);
+      return CCID_DRIVER_ERR_INV_VALUE;
+    }
+
+  if ( !(buffer[7] & 0x03) && (buffer[7] & 0xC0) == 0x80)
+    { 
+      /* Card present and active, time extension requested. */
+      DEBUGOUT_2 ("time extension requested (%02X,%02X)\n",
+                  buffer[7], buffer[8]);
+      goto retry;
+    }
+
+  if (!no_debug)
+    {
+      DEBUGOUT_3 ("status: %02X  error: %02X  octet[9]: %02X\n"
+                  "               data:",  buffer[7], buffer[8], buffer[9] );
+      for (i=10; i < msglen; i++)
+        DEBUGOUT_CONT_1 (" %02X", buffer[i]);
+      DEBUGOUT_LF ();
+    }
+  if (CCID_COMMAND_FAILED (buffer))
+    print_command_failed (buffer);
+
+  /* Check whether a card is at all available.  Note: If you add new
+     error codes here, check whether they need to be ignored in
+     send_escape_cmd. */
+  switch ((buffer[7] & 0x03))
+    {
+    case 0: /* no error */ break;
+    case 1: return CCID_DRIVER_ERR_CARD_INACTIVE;
+    case 2: return CCID_DRIVER_ERR_NO_CARD;
+    case 3: /* RFU */ break;
+    }
+  return 0;
+}
+
+
+/* Note that this function won't return the error codes NO_CARD or
+   CARD_INACTIVE.  IF RESULT is not NULL, the result from the
+   operation will get returned in RESULT and its length in RESULTLEN.
+   If the response is larger than RESULTMAX, an error is returned and
+   the required buffer length returned in RESULTLEN.  */
+static int 
+send_escape_cmd (ccid_driver_t handle,
+                 const unsigned char *data, size_t datalen,
+                 unsigned char *result, size_t resultmax, size_t *resultlen)
+{
+  int i, rc;
+  unsigned char msg[100];
+  size_t msglen;
+  unsigned char seqno;
+
+  if (resultlen)
+    *resultlen = 0;
+
+  if (datalen > sizeof msg - 10)
+    return CCID_DRIVER_ERR_INV_VALUE; /* Escape data too large.  */
+
+  msg[0] = PC_to_RDR_Escape;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 0; /* RFU */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  memcpy (msg+10, data, datalen);
+  msglen = 10 + datalen;
+  set_msg_len (msg, datalen);
+
+  DEBUGOUT ("sending");
+  for (i=0; i < msglen; i++)
+    DEBUGOUT_CONT_1 (" %02X", msg[i]);
+  DEBUGOUT_LF ();
+  rc = bulk_out (handle, msg, msglen);
+  if (rc)
+    return rc;
+  rc = bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_Escape,
+                seqno, 5000, 0);
+  if (result)
+    switch (rc)
+      {
+        /* We need to ignore certain errorcode here. */
+      case 0:
+      case CCID_DRIVER_ERR_CARD_INACTIVE:
+      case CCID_DRIVER_ERR_NO_CARD:
+        {
+          if (msglen > resultmax)
+            rc = CCID_DRIVER_ERR_INV_VALUE; /* Response too large. */
+          else
+            {
+              memcpy (result, msg, msglen);
+              *resultlen = msglen;
+            }
+          rc = 0;
+        }
+        break;
+      default:
+        break;
+      }
+  
+  return rc;
+}
+
+
+int
+ccid_transceive_escape (ccid_driver_t handle,
+                        const unsigned char *data, size_t datalen,
+                        unsigned char *resp, size_t maxresplen, size_t *nresp)
+{
+  return send_escape_cmd (handle, data, datalen, resp, maxresplen, nresp);
+}
+
+
+
+/* experimental */
+int
+ccid_poll (ccid_driver_t handle)
+{
+  int rc;
+  unsigned char msg[10];
+  size_t msglen;
+  int i, j;
+
+  if (handle->idev)
+    {
+      rc = usb_bulk_read (handle->idev, 
+                          handle->ep_intr,
+                          (char*)msg, sizeof msg,
+                          0 /* ms timeout */ );
+      if (rc < 0 && errno == ETIMEDOUT)
+        return 0;
+    }
+  else 
+    return 0;
+
+  if (rc < 0)
+    {
+      DEBUGOUT_1 ("usb_intr_read error: %s\n", strerror (errno));
+      return CCID_DRIVER_ERR_CARD_IO_ERROR;
+    }
+
+  msglen = rc;
+  rc = 0;
+
+  if (msglen < 1)
+    {
+      DEBUGOUT ("intr-in msg too short\n");
+      return CCID_DRIVER_ERR_INV_VALUE;
+    }
+
+  if (msg[0] == RDR_to_PC_NotifySlotChange)
+    {
+      DEBUGOUT ("notify slot change:");
+      for (i=1; i < msglen; i++)
+        for (j=0; j < 4; j++)
+          DEBUGOUT_CONT_3 (" %d:%c%c",
+                           (i-1)*4+j, 
+                           (msg[i] & (1<<(j*2)))? 'p':'-',
+                           (msg[i] & (2<<(j*2)))? '*':' ');
+      DEBUGOUT_LF ();
+    }
+  else if (msg[0] == RDR_to_PC_HardwareError)    
+    {
+      DEBUGOUT ("hardware error occured\n");
+    }
+  else
+    {
+      DEBUGOUT_1 ("unknown intr-in msg of type %02X\n", msg[0]);
+    }
+
+  return 0;
+}
+
+
+/* Note that this fucntion won't return the error codes NO_CARD or
+   CARD_INACTIVE */
+int 
+ccid_slot_status (ccid_driver_t handle, int *statusbits)
+{
+  int rc;
+  unsigned char msg[100];
+  size_t msglen;
+  unsigned char seqno;
+  int retries = 0;
+
+ retry:
+  msg[0] = PC_to_RDR_GetSlotStatus;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 0; /* RFU */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  set_msg_len (msg, 0);
+
+  rc = bulk_out (handle, msg, 10);
+  if (rc)
+    return rc;
+  /* Note that we set the NO_DEBUG flag here, so that the logs won't
+     get cluttered up by a ticker function checking for the slot
+     status and debugging enabled. */
+  rc = bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_SlotStatus,
+                seqno, retries? 1000 : 200, 1);
+  if (rc == CCID_DRIVER_ERR_CARD_IO_ERROR && retries < 3)
+    {
+      if (!retries)
+        {
+          DEBUGOUT ("USB: CALLING USB_CLEAR_HALT\n");
+          usb_clear_halt (handle->idev, handle->ep_bulk_in);
+          usb_clear_halt (handle->idev, handle->ep_bulk_out);
+        }
+      else
+          DEBUGOUT ("USB: RETRYING bulk_in AGAIN\n");
+      retries++;
+      goto retry;
+    }
+  if (rc && rc != CCID_DRIVER_ERR_NO_CARD
+      && rc != CCID_DRIVER_ERR_CARD_INACTIVE)
+    return rc;
+  *statusbits = (msg[7] & 3);
+
+  return 0;
+}
+
+
+int 
+ccid_get_atr (ccid_driver_t handle,
+              unsigned char *atr, size_t maxatrlen, size_t *atrlen)
+{
+  int rc;
+  int statusbits;
+  unsigned char msg[100];
+  unsigned char *tpdu;
+  size_t msglen, tpdulen;
+  unsigned char seqno;
+  int use_crc = 0;
+  unsigned int edc;
+  int i;
+  int tried_iso = 0;
+  int got_param;
+
+  /* First check whether a card is available.  */
+  rc = ccid_slot_status (handle, &statusbits);
+  if (rc)
+    return rc;
+  if (statusbits == 2)
+    return CCID_DRIVER_ERR_NO_CARD;
+
+    
+  /* For an inactive and also for an active card, issue the PowerOn
+     command to get the ATR.  */
+ again:
+  msg[0] = PC_to_RDR_IccPowerOn;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 0; /* power select (0=auto, 1=5V, 2=3V, 3=1.8V) */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  set_msg_len (msg, 0);
+  msglen = 10;
+
+  rc = bulk_out (handle, msg, msglen);
+  if (rc)
+    return rc;
+  rc = bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_DataBlock,
+                seqno, 5000, 0);
+  if (rc)
+    return rc;
+  if (!tried_iso && CCID_COMMAND_FAILED (msg) && CCID_ERROR_CODE (msg) == 0xbb
+      && ((handle->id_vendor == VENDOR_CHERRY
+           && handle->id_product == 0x0005)
+          || (handle->id_vendor == VENDOR_GEMPC
+              && handle->id_product == 0x4433)
+          ))
+    {
+      tried_iso = 1;
+      /* Try switching to ISO mode. */
+      if (!send_escape_cmd (handle, (const unsigned char*)"\xF1\x01", 2,
+                            NULL, 0, NULL))
+        goto again;
+    }
+  else if (CCID_COMMAND_FAILED (msg))
+    return CCID_DRIVER_ERR_CARD_IO_ERROR;
+
+
+  handle->powered_off = 0;
+  
+  if (atr)
+    {
+      size_t n = msglen - 10;
+
+      if (n > maxatrlen)
+        n = maxatrlen;
+      memcpy (atr, msg+10, n);
+      *atrlen = n;
+    }
+
+  got_param = 0;
+  msg[0] = PC_to_RDR_GetParameters;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 0; /* RFU */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  set_msg_len (msg, 0);
+  msglen = 10;
+  rc = bulk_out (handle, msg, msglen);
+  if (!rc)
+    rc = bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_Parameters,
+                  seqno, 2000, 0);
+  if (rc)
+    DEBUGOUT ("GetParameters failed\n");
+  else
+    {
+      DEBUGOUT ("GetParametes returned");
+      for (i=0; i < msglen; i++)
+        DEBUGOUT_CONT_1 (" %02X", msg[i]);
+      DEBUGOUT_LF ();
+      if (msglen >= 10)
+        {
+          DEBUGOUT_1 ("  protocol ..........: T=%d\n", msg[9]);
+          if (msglen == 17 && msg[9] == 1)
+            {
+              DEBUGOUT_1 ("  bmFindexDindex ....: %02X\n", msg[10]);
+              DEBUGOUT_1 ("  bmTCCKST1 .........: %02X\n", msg[11]);
+              DEBUGOUT_1 ("  bGuardTimeT1 ......: %02X\n", msg[12]);
+              DEBUGOUT_1 ("  bmWaitingIntegersT1: %02X\n", msg[13]);
+              DEBUGOUT_1 ("  bClockStop ........: %02X\n", msg[14]);
+              DEBUGOUT_1 ("  bIFSC .............: %d\n", msg[15]);
+              DEBUGOUT_1 ("  bNadValue .........: %d\n", msg[16]);
+              got_param = 1;
+            }
+        }
+    }
+
+  /* Setup parameters to select T=1. */
+  msg[0] = PC_to_RDR_SetParameters;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 1; /* Select T=1. */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+
+  if (!got_param)
+    {
+      /* FIXME: Get those values from the ATR. */
+      msg[10]= 0x01; /* Fi/Di */
+      msg[11]= 0x10; /* LRC, direct convention. */
+      msg[12]= 0;    /* Extra guardtime. */
+      msg[13]= 0x41; /* BWI/CWI */
+      msg[14]= 0;    /* No clock stoppping. */
+      msg[15]= 254;  /* IFSC */
+      msg[16]= 0;    /* Does not support non default NAD values. */
+    }
+  set_msg_len (msg, 7);
+  msglen = 10 + 7;
+
+  DEBUGOUT ("sending");
+  for (i=0; i < msglen; i++)
+    DEBUGOUT_CONT_1 (" %02X", msg[i]);
+  DEBUGOUT_LF ();
+
+  rc = bulk_out (handle, msg, msglen);
+  if (rc)
+    return rc;
+  rc = bulk_in (handle, msg, sizeof msg, &msglen, RDR_to_PC_Parameters,
+                seqno, 5000, 0);
+  if (rc)
+    DEBUGOUT ("SetParameters failed (ignored)\n");
+
+  handle->t1_ns = 0;
+  handle->t1_nr = 0;
+
+  /* Send an S-Block with our maximum IFSD to the CCID.  */
+  if (!handle->apdu_level && !handle->auto_ifsd)
+    {
+      tpdu = msg+10;
+      /* NAD: DAD=1, SAD=0 */
+      tpdu[0] = handle->nonnull_nad? ((1 << 4) | 0): 0;
+      tpdu[1] = (0xc0 | 0 | 1); /* S-block request: change IFSD */
+      tpdu[2] = 1;
+      tpdu[3] = handle->max_ifsd? handle->max_ifsd : 32; 
+      tpdulen = 4;
+      edc = compute_edc (tpdu, tpdulen, use_crc);
+      if (use_crc)
+        tpdu[tpdulen++] = (edc >> 8);
+      tpdu[tpdulen++] = edc;
+
+      msg[0] = PC_to_RDR_XfrBlock;
+      msg[5] = 0; /* slot */
+      msg[6] = seqno = handle->seqno++;
+      msg[7] = 0; 
+      msg[8] = 0; /* RFU */
+      msg[9] = 0; /* RFU */
+      set_msg_len (msg, tpdulen);
+      msglen = 10 + tpdulen;
+
+      DEBUGOUT ("sending");
+      for (i=0; i < msglen; i++)
+        DEBUGOUT_CONT_1 (" %02X", msg[i]);
+      DEBUGOUT_LF ();
+
+      if (debug_level > 1)
+        DEBUGOUT_3 ("T=1: put %c-block seq=%d%s\n",
+                      ((msg[11] & 0xc0) == 0x80)? 'R' :
+                                (msg[11] & 0x80)? 'S' : 'I',
+                      ((msg[11] & 0x80)? !!(msg[11]& 0x10)
+                                       : !!(msg[11] & 0x40)),
+                    (!(msg[11] & 0x80) && (msg[11] & 0x20)? " [more]":""));
+
+      rc = bulk_out (handle, msg, msglen);
+      if (rc)
+        return rc;
+
+
+      rc = bulk_in (handle, msg, sizeof msg, &msglen,
+                    RDR_to_PC_DataBlock, seqno, 5000, 0);
+      if (rc)
+        return rc;
+      
+      tpdu = msg + 10;
+      tpdulen = msglen - 10;
+      
+      if (tpdulen < 4) 
+        return CCID_DRIVER_ERR_ABORTED; 
+
+      if (debug_level > 1)
+        DEBUGOUT_4 ("T=1: got %c-block seq=%d err=%d%s\n",
+                    ((msg[11] & 0xc0) == 0x80)? 'R' :
+                              (msg[11] & 0x80)? 'S' : 'I',
+                    ((msg[11] & 0x80)? !!(msg[11]& 0x10)
+                                     : !!(msg[11] & 0x40)),
+                    ((msg[11] & 0xc0) == 0x80)? (msg[11] & 0x0f) : 0,
+                    (!(msg[11] & 0x80) && (msg[11] & 0x20)? " [more]":""));
+
+      if ((tpdu[1] & 0xe0) != 0xe0 || tpdu[2] != 1)
+        {
+          DEBUGOUT ("invalid response for S-block (Change-IFSD)\n");
+          return -1;
+        }
+      DEBUGOUT_1 ("IFSD has been set to %d\n", tpdu[3]);
+    }
+
+  return 0;
+}
+
+
+\f
+
+static unsigned int 
+compute_edc (const unsigned char *data, size_t datalen, int use_crc)
+{
+  if (use_crc)
+    {
+      return 0x42; /* Not yet implemented. */
+    }
+  else
+    {
+      unsigned char crc = 0;
+      
+      for (; datalen; datalen--)
+        crc ^= *data++;
+      return crc;
+    }
+}
+
+
+/* Helper for ccid_transceive used for APDU level exchanges.  */
+static int
+ccid_transceive_apdu_level (ccid_driver_t handle,
+                            const unsigned char *apdu_buf, size_t apdu_buflen,
+                            unsigned char *resp, size_t maxresplen,
+                            size_t *nresp)
+{
+  int rc;
+  unsigned char send_buffer[10+259], recv_buffer[10+259];
+  const unsigned char *apdu;
+  size_t apdulen;
+  unsigned char *msg;
+  size_t msglen;
+  unsigned char seqno;
+  int i;
+
+  msg = send_buffer;
+
+  apdu = apdu_buf;
+  apdulen = apdu_buflen;
+  assert (apdulen);
+
+  if (apdulen > 254)
+    return CCID_DRIVER_ERR_INV_VALUE; /* Invalid length. */
+
+  msg[0] = PC_to_RDR_XfrBlock;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 4; /* bBWI */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  memcpy (msg+10, apdu, apdulen);
+  set_msg_len (msg, apdulen);
+  msglen = 10 + apdulen;
+
+  DEBUGOUT ("sending");
+  for (i=0; i < msglen; i++)
+    DEBUGOUT_CONT_1 (" %02X", msg[i]);
+  DEBUGOUT_LF ();
+  
+  rc = bulk_out (handle, msg, msglen);
+  if (rc)
+    return rc;
+
+  msg = recv_buffer;
+  rc = bulk_in (handle, msg, sizeof recv_buffer, &msglen,
+                RDR_to_PC_DataBlock, seqno, 5000, 0);
+  if (rc)
+    return rc;
+      
+  apdu = msg + 10;
+  apdulen = msglen - 10;
+      
+  if (resp)
+    {
+      if (apdulen > maxresplen)
+        {
+          DEBUGOUT_2 ("provided buffer too short for received data "
+                      "(%u/%u)\n",
+                      (unsigned int)apdulen, (unsigned int)maxresplen);
+          return CCID_DRIVER_ERR_INV_VALUE;
+        }
+      
+      memcpy (resp, apdu, apdulen); 
+      *nresp = apdulen;
+    }
+          
+  return 0;
+}
+
+
+
+/*
+  Protocol T=1 overview
+
+  Block Structure:
+           Prologue Field:
+   1 byte     Node Address (NAD) 
+   1 byte     Protocol Control Byte (PCB)
+   1 byte     Length (LEN) 
+           Information Field:
+   0-254 byte APDU or Control Information (INF)
+           Epilogue Field:
+   1 byte     Error Detection Code (EDC)
+
+  NAD:  
+   bit 7     unused
+   bit 4..6  Destination Node Address (DAD)
+   bit 3     unused
+   bit 2..0  Source Node Address (SAD)
+
+   If node adresses are not used, SAD and DAD should be set to 0 on
+   the first block sent to the card.  If they are used they should
+   have different values (0 for one is okay); that first block sets up
+   the addresses of the nodes.
+
+  PCB:
+   Information Block (I-Block):
+      bit 7    0
+      bit 6    Sequence number (yep, that is modulo 2)
+      bit 5    Chaining flag 
+      bit 4..0 reserved
+   Received-Ready Block (R-Block):
+      bit 7    1
+      bit 6    0
+      bit 5    0
+      bit 4    Sequence number
+      bit 3..0  0 = no error
+                1 = EDC or parity error
+                2 = other error
+                other values are reserved
+   Supervisory Block (S-Block):
+      bit 7    1
+      bit 6    1
+      bit 5    clear=request,set=response
+      bit 4..0  0 = resyncronisation request
+                1 = information field size request
+                2 = abort request
+                3 = extension of BWT request
+                4 = VPP error
+                other values are reserved
+
+*/
+
+int
+ccid_transceive (ccid_driver_t handle,
+                 const unsigned char *apdu_buf, size_t apdu_buflen,
+                 unsigned char *resp, size_t maxresplen, size_t *nresp)
+{
+  int rc;
+  unsigned char send_buffer[10+259], recv_buffer[10+259];
+  const unsigned char *apdu;
+  size_t apdulen;
+  unsigned char *msg, *tpdu, *p;
+  size_t msglen, tpdulen, last_tpdulen, n;
+  unsigned char seqno;
+  int i;
+  unsigned int edc;
+  int use_crc = 0;
+  size_t dummy_nresp;
+  int next_chunk = 1;
+  int sending = 1;
+  int retries = 0;
+
+  if (!nresp)
+    nresp = &dummy_nresp;
+  *nresp = 0;
+
+  /* Smarter readers allow to send APDUs directly; divert here. */
+  if (handle->apdu_level)
+    return ccid_transceive_apdu_level (handle, apdu_buf, apdu_buflen,
+                                       resp, maxresplen, nresp);
+
+  /* The other readers we support require sending TPDUs.  */
+
+  tpdulen = 0; /* Avoid compiler warning about no initialization. */
+  msg = send_buffer;
+  for (;;)
+    {
+      if (next_chunk)
+        {
+          next_chunk = 0;
+
+          apdu = apdu_buf;
+          apdulen = apdu_buflen;
+          assert (apdulen);
+
+          /* Construct an I-Block. */
+          if (apdulen > 254)
+            return CCID_DRIVER_ERR_INV_VALUE; /* Invalid length. */
+
+          tpdu = msg+10;
+          /* NAD: DAD=1, SAD=0 */
+          tpdu[0] = handle->nonnull_nad? ((1 << 4) | 0): 0;
+          tpdu[1] = ((handle->t1_ns & 1) << 6); /* I-block */
+          if (apdulen > 128 /* fixme: replace by ifsc */)
+            {
+              apdulen = 128;
+              apdu_buf += 128;  
+              apdu_buflen -= 128;
+              tpdu[1] |= (1 << 5); /* Set more bit. */
+            }
+          tpdu[2] = apdulen;
+          memcpy (tpdu+3, apdu, apdulen);
+          tpdulen = 3 + apdulen;
+          edc = compute_edc (tpdu, tpdulen, use_crc);
+          if (use_crc)
+            tpdu[tpdulen++] = (edc >> 8);
+          tpdu[tpdulen++] = edc;
+        }
+
+      msg[0] = PC_to_RDR_XfrBlock;
+      msg[5] = 0; /* slot */
+      msg[6] = seqno = handle->seqno++;
+      msg[7] = 4; /* bBWI */
+      msg[8] = 0; /* RFU */
+      msg[9] = 0; /* RFU */
+      set_msg_len (msg, tpdulen);
+      msglen = 10 + tpdulen;
+      last_tpdulen = tpdulen;
+
+      DEBUGOUT ("sending");
+      for (i=0; i < msglen; i++)
+        DEBUGOUT_CONT_1 (" %02X", msg[i]);
+      DEBUGOUT_LF ();
+
+      if (debug_level > 1)
+          DEBUGOUT_3 ("T=1: put %c-block seq=%d%s\n",
+                      ((msg[11] & 0xc0) == 0x80)? 'R' :
+                                (msg[11] & 0x80)? 'S' : 'I',
+                      ((msg[11] & 0x80)? !!(msg[11]& 0x10)
+                                       : !!(msg[11] & 0x40)),
+                      (!(msg[11] & 0x80) && (msg[11] & 0x20)? " [more]":""));
+
+      rc = bulk_out (handle, msg, msglen);
+      if (rc)
+        return rc;
+
+      msg = recv_buffer;
+      rc = bulk_in (handle, msg, sizeof recv_buffer, &msglen,
+                    RDR_to_PC_DataBlock, seqno, 5000, 0);
+      if (rc)
+        return rc;
+      
+      tpdu = msg + 10;
+      tpdulen = msglen - 10;
+      
+      if (tpdulen < 4) 
+        {
+          usb_clear_halt (handle->idev, handle->ep_bulk_in);
+          return CCID_DRIVER_ERR_ABORTED; 
+        }
+
+      if (debug_level > 1)
+        DEBUGOUT_4 ("T=1: got %c-block seq=%d err=%d%s\n",
+                    ((msg[11] & 0xc0) == 0x80)? 'R' :
+                              (msg[11] & 0x80)? 'S' : 'I',
+                    ((msg[11] & 0x80)? !!(msg[11]& 0x10) : !!(msg[11] & 0x40)),
+                    ((msg[11] & 0xc0) == 0x80)? (msg[11] & 0x0f) : 0,
+                    (!(msg[11] & 0x80) && (msg[11] & 0x20)? " [more]":""));
+
+      if (!(tpdu[1] & 0x80))
+        { /* This is an I-block. */
+          retries = 0;
+          if (sending)
+            { /* last block sent was successful. */
+              handle->t1_ns ^= 1;
+              sending = 0;
+            }
+
+          if (!!(tpdu[1] & 0x40) != handle->t1_nr)
+            { /* Reponse does not match our sequence number. */
+              msg = send_buffer;
+              tpdu = msg+10;
+              /* NAD: DAD=1, SAD=0 */
+              tpdu[0] = handle->nonnull_nad? ((1 << 4) | 0): 0;
+              tpdu[1] = (0x80 | (handle->t1_nr & 1) << 4 | 2); /* R-block */
+              tpdu[2] = 0;
+              tpdulen = 3;
+              edc = compute_edc (tpdu, tpdulen, use_crc);
+              if (use_crc)
+                tpdu[tpdulen++] = (edc >> 8);
+              tpdu[tpdulen++] = edc;
+
+              continue;
+            }
+
+          handle->t1_nr ^= 1;
+
+          p = tpdu + 3; /* Skip the prologue field. */
+          n = tpdulen - 3 - 1; /* Strip the epilogue field. */
+          /* fixme: verify the checksum. */
+          if (resp)
+            {
+              if (n > maxresplen)
+                {
+                  DEBUGOUT_2 ("provided buffer too short for received data "
+                              "(%u/%u)\n",
+                              (unsigned int)n, (unsigned int)maxresplen);
+                  return CCID_DRIVER_ERR_INV_VALUE;
+                }
+              
+              memcpy (resp, p, n); 
+              resp += n;
+              *nresp += n;
+              maxresplen -= n;
+            }
+          
+          if (!(tpdu[1] & 0x20))
+            return 0; /* No chaining requested - ready. */
+          
+          msg = send_buffer;
+          tpdu = msg+10;
+          /* NAD: DAD=1, SAD=0 */
+          tpdu[0] = handle->nonnull_nad? ((1 << 4) | 0): 0;
+          tpdu[1] = (0x80 | (handle->t1_nr & 1) << 4); /* R-block */
+          tpdu[2] = 0;
+          tpdulen = 3;
+          edc = compute_edc (tpdu, tpdulen, use_crc);
+          if (use_crc)
+            tpdu[tpdulen++] = (edc >> 8);
+          tpdu[tpdulen++] = edc;
+        }
+      else if ((tpdu[1] & 0xc0) == 0x80)
+        { /* This is a R-block. */
+          if ( (tpdu[1] & 0x0f)) 
+            { /* Error: repeat last block */
+              if (++retries > 3)
+                {
+                  DEBUGOUT ("3 failed retries\n");
+                  return CCID_DRIVER_ERR_CARD_IO_ERROR;
+                }
+              msg = send_buffer;
+              tpdulen = last_tpdulen;
+            }
+          else if (sending && !!(tpdu[1] & 0x10) == handle->t1_ns)
+            { /* Response does not match our sequence number. */
+              DEBUGOUT ("R-block with wrong seqno received on more bit\n");
+              return CCID_DRIVER_ERR_CARD_IO_ERROR;
+            }
+          else if (sending)
+            { /* Send next chunk. */
+              retries = 0;
+              msg = send_buffer;
+              next_chunk = 1;
+              handle->t1_ns ^= 1;
+            }
+          else
+            {
+              DEBUGOUT ("unexpected ACK R-block received\n");
+              return CCID_DRIVER_ERR_CARD_IO_ERROR;
+            }
+        }
+      else 
+        { /* This is a S-block. */
+          retries = 0;
+          DEBUGOUT_2 ("T=1 S-block %s received cmd=%d\n",
+                      (tpdu[1] & 0x20)? "response": "request",
+                      (tpdu[1] & 0x1f));
+          if ( !(tpdu[1] & 0x20) && (tpdu[1] & 0x1f) == 3 && tpdu[2])
+            { /* Wait time extension request. */
+              unsigned char bwi = tpdu[3];
+              msg = send_buffer;
+              tpdu = msg+10;
+              /* NAD: DAD=1, SAD=0 */
+              tpdu[0] = handle->nonnull_nad? ((1 << 4) | 0): 0;
+              tpdu[1] = (0xc0 | 0x20 | 3); /* S-block response */
+              tpdu[2] = 1;
+              tpdu[3] = bwi;
+              tpdulen = 4;
+              edc = compute_edc (tpdu, tpdulen, use_crc);
+              if (use_crc)
+                tpdu[tpdulen++] = (edc >> 8);
+              tpdu[tpdulen++] = edc;
+              DEBUGOUT_1 ("T=1 waittime extension of bwi=%d\n", bwi);
+            }
+          else
+            return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+    } /* end T=1 protocol loop. */
+
+  return 0;
+}
+
+
+/* Send the CCID Secure command to the reader.  APDU_BUF should
+   contain the APDU template.  PIN_MODE defines how the pin gets
+   formatted:
+   
+     1 := The PIN is ASCII encoded and of variable length.  The
+          length of the PIN entered will be put into Lc by the reader.
+          The APDU should me made up of 4 bytes without Lc.
+
+   PINLEN_MIN and PINLEN_MAX define the limits for the pin length. 0
+   may be used t enable reasonable defaults.  PIN_PADLEN should be 0.
+   
+   When called with RESP and NRESP set to NULL, the function will
+   merely check whether the reader supports the secure command for the
+   given APDU and PIN_MODE. */
+int
+ccid_transceive_secure (ccid_driver_t handle,
+                        const unsigned char *apdu_buf, size_t apdu_buflen,
+                        int pin_mode, int pinlen_min, int pinlen_max,
+                        int pin_padlen, 
+                        unsigned char *resp, size_t maxresplen, size_t *nresp)
+{
+  int rc;
+  unsigned char send_buffer[10+259], recv_buffer[10+259];
+  unsigned char *msg, *tpdu, *p;
+  size_t msglen, tpdulen, n;
+  unsigned char seqno;
+  int i;
+  size_t dummy_nresp;
+  int testmode;
+
+  testmode = !resp && !nresp;
+
+  if (!nresp)
+    nresp = &dummy_nresp;
+  *nresp = 0;
+
+  if (apdu_buflen >= 4 && apdu_buf[1] == 0x20 && (handle->has_pinpad & 1))
+    ;
+  else if (apdu_buflen >= 4 && apdu_buf[1] == 0x24 && (handle->has_pinpad & 2))
+    return CCID_DRIVER_ERR_NOT_SUPPORTED; /* Not yet by our code. */
+  else
+    return CCID_DRIVER_ERR_NO_KEYPAD;
+    
+  if (pin_mode != 1)
+    return CCID_DRIVER_ERR_NOT_SUPPORTED;
+
+  if (pin_padlen != 0)
+    return CCID_DRIVER_ERR_NOT_SUPPORTED;
+
+  if (!pinlen_min)
+    pinlen_min = 1;
+  if (!pinlen_max)
+    pinlen_max = 25;
+
+  /* Note that the 25 is the maximum value the SPR532 allows.  */
+  if (pinlen_min < 1 || pinlen_min > 25
+      || pinlen_max < 1 || pinlen_max > 25 
+      || pinlen_min > pinlen_max)
+    return CCID_DRIVER_ERR_INV_VALUE;
+
+  /* We have only tested this with an SCM reader so better don't risk
+     anything and do not allow the use with other readers. */
+  if (handle->id_vendor != VENDOR_SCM)
+    return CCID_DRIVER_ERR_NOT_SUPPORTED;
+
+  if (testmode)
+    return 0; /* Success */
+    
+  msg = send_buffer;
+  if (handle->id_vendor == VENDOR_SCM)
+    {
+      DEBUGOUT ("sending escape sequence to switch to a case 1 APDU\n");
+      rc = send_escape_cmd (handle, (const unsigned char*)"\x80\x02\x00", 3,
+                            NULL, 0, NULL);
+      if (rc)
+        return rc;
+    }
+
+  msg[0] = PC_to_RDR_Secure;
+  msg[5] = 0; /* slot */
+  msg[6] = seqno = handle->seqno++;
+  msg[7] = 4; /* bBWI */
+  msg[8] = 0; /* RFU */
+  msg[9] = 0; /* RFU */
+  msg[10] = 0; /* Perform PIN verification. */
+  msg[11] = 0; /* Timeout in seconds. */
+  msg[12] = 0x82; /* bmFormatString: Byte, pos=0, left, ASCII. */
+  if (handle->id_vendor == VENDOR_SCM)
+    {
+      /* For the SPR532 the next 2 bytes need to be zero.  We do this
+         for all SCM product. Kudos to Martin Paljak for this
+         hint.  */
+      msg[13] = msg[14] = 0;
+    }
+  else
+    {
+      msg[13] = 0x00; /* bmPINBlockString:
+                         0 bits of pin length to insert. 
+                         0 bytes of PIN block size.  */
+      msg[14] = 0x00; /* bmPINLengthFormat:
+                         Units are bytes, position is 0. */
+    }
+  msg[15] = pinlen_min;   /* wPINMaxExtraDigit-Minimum.  */
+  msg[16] = pinlen_max;   /* wPINMaxExtraDigit-Maximum.  */
+  msg[17] = 0x02; /* bEntryValidationCondition:
+                     Validation key pressed */
+  if (pinlen_min && pinlen_max && pinlen_min == pinlen_max)
+    msg[17] |= 0x01; /* Max size reached.  */
+  msg[18] = 0xff; /* bNumberMessage: Default. */
+  msg[19] = 0x04; /* wLangId-High. */
+  msg[20] = 0x09; /* wLangId-Low:  English FIXME: use the first entry. */
+  msg[21] = 0;    /* bMsgIndex. */
+  /* bTeoProlog follows: */
+  msg[22] = handle->nonnull_nad? ((1 << 4) | 0): 0;
+  msg[23] = ((handle->t1_ns & 1) << 6); /* I-block */
+  msg[24] = 4; /* apdulen.  */
+  /* APDU follows:  */
+  msg[25] = apdu_buf[0]; /* CLA */
+  msg[26] = apdu_buf[1]; /* INS */
+  msg[27] = apdu_buf[2]; /* P1 */
+  msg[28] = apdu_buf[3]; /* P2 */
+  msglen = 29;
+  set_msg_len (msg, msglen - 10);
+
+  DEBUGOUT ("sending");
+  for (i=0; i < msglen; i++)
+    DEBUGOUT_CONT_1 (" %02X", msg[i]);
+  DEBUGOUT_LF ();
+  
+  rc = bulk_out (handle, msg, msglen);
+  if (rc)
+    return rc;
+  
+  msg = recv_buffer;
+  rc = bulk_in (handle, msg, sizeof recv_buffer, &msglen,
+                RDR_to_PC_DataBlock, seqno, 5000, 0);
+  if (rc)
+    return rc;
+  
+  tpdu = msg + 10;
+  tpdulen = msglen - 10;
+  
+  if (tpdulen < 4) 
+    {
+      usb_clear_halt (handle->idev, handle->ep_bulk_in);
+      return CCID_DRIVER_ERR_ABORTED; 
+    }
+  if (debug_level > 1)
+    DEBUGOUT_4 ("T=1: got %c-block seq=%d err=%d%s\n",
+                ((msg[11] & 0xc0) == 0x80)? 'R' :
+                          (msg[11] & 0x80)? 'S' : 'I',
+                ((msg[11] & 0x80)? !!(msg[11]& 0x10) : !!(msg[11] & 0x40)),
+                ((msg[11] & 0xc0) == 0x80)? (msg[11] & 0x0f) : 0,
+                (!(msg[11] & 0x80) && (msg[11] & 0x20)? " [more]":""));
+
+  if (!(tpdu[1] & 0x80))
+    { /* This is an I-block. */
+      /* Last block sent was successful. */
+      handle->t1_ns ^= 1;
+
+      if (!!(tpdu[1] & 0x40) != handle->t1_nr)
+        { /* Reponse does not match our sequence number. */
+          DEBUGOUT ("I-block with wrong seqno received\n");
+          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+
+      handle->t1_nr ^= 1;
+
+      p = tpdu + 3; /* Skip the prologue field. */
+      n = tpdulen - 3 - 1; /* Strip the epilogue field. */
+      /* fixme: verify the checksum. */
+      if (resp)
+        {
+          if (n > maxresplen)
+            {
+              DEBUGOUT_2 ("provided buffer too short for received data "
+                          "(%u/%u)\n",
+                          (unsigned int)n, (unsigned int)maxresplen);
+              return CCID_DRIVER_ERR_INV_VALUE;
+            }
+              
+          memcpy (resp, p, n); 
+          resp += n;
+          *nresp += n;
+          maxresplen -= n;
+        }
+          
+      if (!(tpdu[1] & 0x20))
+        return 0; /* No chaining requested - ready. */
+      
+      DEBUGOUT ("chaining requested but not supported for Secure operation\n");
+      return CCID_DRIVER_ERR_CARD_IO_ERROR;
+    }
+  else if ((tpdu[1] & 0xc0) == 0x80)
+    { /* This is a R-block. */
+      if ( (tpdu[1] & 0x0f)) 
+        { /* Error: repeat last block */
+          DEBUGOUT ("No retries supported for Secure operation\n");
+          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+      else if (!!(tpdu[1] & 0x10) == handle->t1_ns)
+        { /* Reponse does not match our sequence number. */
+          DEBUGOUT ("R-block with wrong seqno received on more bit\n");
+          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+      else
+        { /* Send next chunk. */
+          DEBUGOUT ("chaining not supported on Secure operation\n");
+          return CCID_DRIVER_ERR_CARD_IO_ERROR;
+        }
+    }
+  else 
+    { /* This is a S-block. */
+      DEBUGOUT_2 ("T=1 S-block %s received cmd=%d for Secure operation\n",
+                  (tpdu[1] & 0x20)? "response": "request",
+                  (tpdu[1] & 0x1f));
+      return CCID_DRIVER_ERR_CARD_IO_ERROR;
+    } 
+
+  return 0;
+}
+
+
+
+
+#ifdef TEST
+
+
+static void
+print_error (int err)
+{
+  const char *p;
+  char buf[50];
+
+  switch (err)
+    {
+    case 0: p = "success";
+    case CCID_DRIVER_ERR_OUT_OF_CORE: p = "out of core"; break;
+    case CCID_DRIVER_ERR_INV_VALUE: p = "invalid value"; break;
+    case CCID_DRIVER_ERR_NO_DRIVER: p = "no driver"; break;
+    case CCID_DRIVER_ERR_NOT_SUPPORTED: p = "not supported"; break;
+    case CCID_DRIVER_ERR_LOCKING_FAILED: p = "locking failed"; break;
+    case CCID_DRIVER_ERR_BUSY: p = "busy"; break;
+    case CCID_DRIVER_ERR_NO_CARD: p = "no card"; break;
+    case CCID_DRIVER_ERR_CARD_INACTIVE: p = "card inactive"; break;
+    case CCID_DRIVER_ERR_CARD_IO_ERROR: p = "card I/O error"; break;
+    case CCID_DRIVER_ERR_GENERAL_ERROR: p = "general error"; break;
+    case CCID_DRIVER_ERR_NO_READER: p = "no reader"; break;
+    case CCID_DRIVER_ERR_ABORTED: p = "aborted"; break;
+    default: sprintf (buf, "0x%05x", err); p = buf; break;
+    }
+  fprintf (stderr, "operation failed: %s\n", p);
+}
+
+static void
+print_data (const unsigned char *data, size_t length)
+{
+  if (length >= 2)
+    {
+      fprintf (stderr, "operation status: %02X%02X\n",
+               data[length-2], data[length-1]);
+      length -= 2;
+    }
+  if (length)
+    {
+        fputs ("   returned data:", stderr);
+        for (; length; length--, data++)
+          fprintf (stderr, " %02X", *data);
+        putc ('\n', stderr);
+    }
+}
+
+static void
+print_result (int rc, const unsigned char *data, size_t length)
+{
+  if (rc)
+    print_error (rc);
+  else if (data)
+    print_data (data, length);
+}
+
+int
+main (int argc, char **argv)
+{
+  int rc;
+  ccid_driver_t ccid;
+  unsigned int slotstat;
+  unsigned char result[512];
+  size_t resultlen;
+  int no_pinpad = 0;
+  int verify_123456 = 0;
+  int did_verify = 0;
+  int no_poll = 0;
+
+  if (argc)
+    {
+      argc--;
+      argv++;
+    }
+
+  while (argc)
+    {
+      if ( !strcmp (*argv, "--list"))
+        {
+          char *p;
+          p = ccid_get_reader_list ();
+          if (!p)
+            return 1;
+          fputs (p, stderr);
+          free (p);
+          return 0;
+        }
+      else if ( !strcmp (*argv, "--debug"))
+        {
+          ccid_set_debug_level (1);
+          argc--; argv++;
+        }
+      else if ( !strcmp (*argv, "--no-poll"))
+        {
+          no_poll = 1;
+          argc--; argv++;
+        }
+      else if ( !strcmp (*argv, "--no-pinpad"))
+        {
+          no_pinpad = 1;
+          argc--; argv++;
+        }
+      else if ( !strcmp (*argv, "--verify-123456"))
+        {
+          verify_123456 = 1;
+          argc--; argv++;
+        }
+      else
+        break;
+    }
+
+  rc = ccid_open_reader (&ccid, argc? *argv:NULL);
+  if (rc)
+    return 1;
+
+  if (!no_poll)
+    ccid_poll (ccid);
+  fputs ("getting ATR ...\n", stderr);
+  rc = ccid_get_atr (ccid, NULL, 0, NULL);
+  if (rc)
+    {
+      print_error (rc);
+      return 1;
+    }
+
+  if (!no_poll)
+    ccid_poll (ccid);
+  fputs ("getting slot status ...\n", stderr);
+  rc = ccid_slot_status (ccid, &slotstat);
+  if (rc)
+    {
+      print_error (rc);
+      return 1;
+    }
+
+  if (!no_poll)
+    ccid_poll (ccid);
+
+  fputs ("selecting application OpenPGP ....\n", stderr);
+  {
+    static unsigned char apdu[] = {
+      0, 0xA4, 4, 0, 6, 0xD2, 0x76, 0x00, 0x01, 0x24, 0x01};
+    rc = ccid_transceive (ccid,
+                          apdu, sizeof apdu,
+                          result, sizeof result, &resultlen);
+    print_result (rc, result, resultlen);
+  }
+  
+
+  if (!no_poll)
+    ccid_poll (ccid);
+
+  fputs ("getting OpenPGP DO 0x65 ....\n", stderr);
+  {
+    static unsigned char apdu[] = { 0, 0xCA, 0, 0x65, 254 };
+    rc = ccid_transceive (ccid, apdu, sizeof apdu,
+                          result, sizeof result, &resultlen);
+    print_result (rc, result, resultlen);
+  }
+
+  if (!no_pinpad)
+    {
+    }
+
+  if (!no_pinpad)
+    {
+      static unsigned char apdu[] = { 0, 0x20, 0, 0x81 };
+
+      
+      if (ccid_transceive_secure (ccid,
+                                  apdu, sizeof apdu,
+                                  1, 0, 0, 0,
+                                  NULL, 0, NULL))
+        fputs ("can't verify using a PIN-Pad reader\n", stderr);
+      else
+        {
+          fputs ("verifying CHV1 using the PINPad ....\n", stderr);
+          
+          rc = ccid_transceive_secure (ccid,
+                                       apdu, sizeof apdu,
+                                       1, 0, 0, 0,
+                                       result, sizeof result, &resultlen);
+          print_result (rc, result, resultlen);
+          did_verify = 1;
+        }
+    }
+  
+  if (verify_123456 && !did_verify)
+    {
+      fputs ("verifying that CHV1 is 123456....\n", stderr);
+      {
+        static unsigned char apdu[] = {0, 0x20, 0, 0x81,
+                                       6, '1','2','3','4','5','6'};
+        rc = ccid_transceive (ccid, apdu, sizeof apdu,
+                              result, sizeof result, &resultlen);
+        print_result (rc, result, resultlen);
+      }
+    }
+
+  if (!rc)
+    {
+      fputs ("getting OpenPGP DO 0x5E ....\n", stderr);
+      {
+        static unsigned char apdu[] = { 0, 0xCA, 0, 0x5E, 254 };
+        rc = ccid_transceive (ccid, apdu, sizeof apdu,
+                              result, sizeof result, &resultlen);
+        print_result (rc, result, resultlen);
+      }
+    }
+
+  ccid_close_reader (ccid);
+
+  return 0;
+}
+
+/*
+ * Local Variables:
+ *  compile-command: "gcc -DTEST -Wall -I/usr/local/include -lusb -g ccid-driver.c"
+ * End:
+ */
+#endif /*TEST*/
+#endif /*HAVE_LIBUSB*/
diff --git a/g10/ccid-driver.h b/g10/ccid-driver.h
new file mode 100644 (file)
index 0000000..54adffc
--- /dev/null
@@ -0,0 +1,108 @@
+/* ccid-driver.c - USB ChipCardInterfaceDevices driver
+ *     Copyright (C) 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * ALTERNATIVELY, this file may be distributed under the terms of the
+ * following license, in which case the provisions of this license are
+ * required INSTEAD OF the GNU General Public License. If you wish to
+ * allow use of your version of this file only under the terms of the
+ * GNU General Public License, and not to allow others to use your
+ * version of this file under the terms of the following license,
+ * indicate your decision by deleting this paragraph and the license
+ * below.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, and the entire permission notice in its entirety,
+ *    including the disclaimer of warranties.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id: ccid-driver.h 3995 2006-02-06 16:34:20Z wk $
+ */
+
+#ifndef CCID_DRIVER_H
+#define CCID_DRIVER_H
+
+/* The CID driver returns the same error codes as the status words
+   used by GnuPG's apdu.h.  For ease of maintenance they should always
+   match.  */
+#define CCID_DRIVER_ERR_OUT_OF_CORE    0x10001 
+#define CCID_DRIVER_ERR_INV_VALUE      0x10002
+#define CCID_DRIVER_ERR_INCOMPLETE_CARD_RESPONSE = 0x10003
+#define CCID_DRIVER_ERR_NO_DRIVER      0x10004
+#define CCID_DRIVER_ERR_NOT_SUPPORTED  0x10005
+#define CCID_DRIVER_ERR_LOCKING_FAILED 0x10006
+#define CCID_DRIVER_ERR_BUSY           0x10007
+#define CCID_DRIVER_ERR_NO_CARD        0x10008
+#define CCID_DRIVER_ERR_CARD_INACTIVE  0x10009
+#define CCID_DRIVER_ERR_CARD_IO_ERROR  0x1000a
+#define CCID_DRIVER_ERR_GENERAL_ERROR  0x1000b
+#define CCID_DRIVER_ERR_NO_READER      0x1000c
+#define CCID_DRIVER_ERR_ABORTED        0x1000d
+#define CCID_DRIVER_ERR_NO_KEYPAD      0x1000e
+
+struct ccid_driver_s;
+typedef struct ccid_driver_s *ccid_driver_t;
+
+int ccid_set_debug_level (int level);
+char *ccid_get_reader_list (void);
+int ccid_open_reader (ccid_driver_t *handle, const char *readerid);
+int ccid_shutdown_reader (ccid_driver_t handle);
+int ccid_close_reader (ccid_driver_t handle);
+int ccid_get_atr (ccid_driver_t handle,
+                  unsigned char *atr, size_t maxatrlen, size_t *atrlen);
+int ccid_slot_status (ccid_driver_t handle, int *statusbits);
+int ccid_transceive (ccid_driver_t handle,
+                     const unsigned char *apdu, size_t apdulen,
+                     unsigned char *resp, size_t maxresplen, size_t *nresp);
+int ccid_transceive_secure (ccid_driver_t handle,
+                     const unsigned char *apdu, size_t apdulen,
+                     int pin_mode, 
+                     int pinlen_min, int pinlen_max, int pin_padlen, 
+                     unsigned char *resp, size_t maxresplen, size_t *nresp);
+int ccid_transceive_escape (ccid_driver_t handle,
+                            const unsigned char *data, size_t datalen,
+                            unsigned char *resp, size_t maxresplen,
+                            size_t *nresp);
+
+
+
+#endif /*CCID_DRIVER_H*/
+
+
+
diff --git a/g10/cipher.c b/g10/cipher.c
new file mode 100644 (file)
index 0000000..f7332ba
--- /dev/null
@@ -0,0 +1,153 @@
+/* cipher.c - En-/De-ciphering filter
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "filter.h"
+#include "packet.h"
+#include "options.h"
+#include "main.h"
+#include "status.h"
+
+
+#define MIN_PARTIAL_SIZE 512
+
+
+static void
+write_header( cipher_filter_context_t *cfx, IOBUF a )
+{
+    PACKET pkt;
+    PKT_encrypted ed;
+    byte temp[18];
+    unsigned blocksize;
+    unsigned nprefix;
+
+    blocksize = cipher_get_blocksize( cfx->dek->algo );
+    if( blocksize < 8 || blocksize > 16 )
+       log_fatal("unsupported blocksize %u\n", blocksize );
+
+    memset( &ed, 0, sizeof ed );
+    ed.len = cfx->datalen;
+    ed.extralen = blocksize+2;
+    ed.new_ctb = !ed.len && !RFC1991;
+    if( cfx->dek->use_mdc ) {
+       ed.mdc_method = DIGEST_ALGO_SHA1;
+       cfx->mdc_hash = md_open( DIGEST_ALGO_SHA1, 0 );
+       if ( DBG_HASHING )
+           md_start_debug( cfx->mdc_hash, "creatmdc" );
+    }
+
+    {
+        char buf[20];
+        
+        sprintf (buf, "%d %d", ed.mdc_method, cfx->dek->algo);
+        write_status_text (STATUS_BEGIN_ENCRYPTION, buf);
+    }
+
+    init_packet( &pkt );
+    pkt.pkttype = cfx->dek->use_mdc? PKT_ENCRYPTED_MDC : PKT_ENCRYPTED;
+    pkt.pkt.encrypted = &ed;
+    if( build_packet( a, &pkt ))
+       log_bug("build_packet(ENCR_DATA) failed\n");
+    nprefix = blocksize;
+    randomize_buffer( temp, nprefix, 1 );
+    temp[nprefix] = temp[nprefix-2];
+    temp[nprefix+1] = temp[nprefix-1];
+    print_cipher_algo_note( cfx->dek->algo );
+    cfx->cipher_hd = cipher_open( cfx->dek->algo,
+                                 cfx->dek->use_mdc? CIPHER_MODE_CFB
+                                        : CIPHER_MODE_AUTO_CFB, 1 );
+/*   log_hexdump( "thekey", cfx->dek->key, cfx->dek->keylen );*/
+    cipher_setkey( cfx->cipher_hd, cfx->dek->key, cfx->dek->keylen );
+    cipher_setiv( cfx->cipher_hd, NULL, 0 );
+/*  log_hexdump( "prefix", temp, nprefix+2 ); */
+    if( cfx->mdc_hash ) /* hash the "IV" */
+       md_write( cfx->mdc_hash, temp, nprefix+2 );
+    cipher_encrypt( cfx->cipher_hd, temp, temp, nprefix+2);
+    cipher_sync( cfx->cipher_hd );
+    iobuf_write(a, temp, nprefix+2);
+    cfx->header=1;
+}
+
+
+
+/****************
+ * This filter is used to en/de-cipher data with a conventional algorithm
+ */
+int
+cipher_filter( void *opaque, int control,
+              IOBUF a, byte *buf, size_t *ret_len)
+{
+    size_t size = *ret_len;
+    cipher_filter_context_t *cfx = opaque;
+    int rc=0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) { /* decrypt */
+       rc = -1; /* not yet used */
+    }
+    else if( control == IOBUFCTRL_FLUSH ) { /* encrypt */
+       assert(a);
+       if( !cfx->header ) {
+           write_header( cfx, a );
+       }
+       if( cfx->mdc_hash )
+           md_write( cfx->mdc_hash, buf, size );
+       cipher_encrypt( cfx->cipher_hd, buf, buf, size);
+       if( iobuf_write( a, buf, size ) )
+           rc = G10ERR_WRITE_FILE;
+    }
+    else if( control == IOBUFCTRL_FREE ) {
+       if( cfx->mdc_hash ) {
+           byte *hash;
+           int hashlen = md_digest_length( md_get_algo( cfx->mdc_hash ) );
+           byte temp[22];
+
+           assert( hashlen == 20 );
+           /* we must hash the prefix of the MDC packet here */
+           temp[0] = 0xd3;
+           temp[1] = 0x14;
+           md_putc( cfx->mdc_hash, temp[0] );
+           md_putc( cfx->mdc_hash, temp[1] );
+
+           md_final( cfx->mdc_hash );
+           hash = md_read( cfx->mdc_hash, 0 );
+           memcpy(temp+2, hash, 20);
+           cipher_encrypt( cfx->cipher_hd, temp, temp, 22 );
+           md_close( cfx->mdc_hash ); cfx->mdc_hash = NULL;
+           if( iobuf_write( a, temp, 22 ) )
+               log_error("writing MDC packet failed\n" );
+       }
+       cipher_close(cfx->cipher_hd);
+    }
+    else if( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "cipher_filter";
+    }
+    return rc;
+}
diff --git a/g10/compress-bz2.c b/g10/compress-bz2.c
new file mode 100644 (file)
index 0000000..7a8075a
--- /dev/null
@@ -0,0 +1,242 @@
+/* compress.c - bzip2 compress filter
+ * Copyright (C) 2003, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <string.h>
+#include <stdio.h> /* Early versions of bzlib (1.0) require stdio.h */
+#include <bzlib.h>
+
+#include "util.h"
+#include "memory.h"
+#include "packet.h"
+#include "filter.h"
+#include "main.h"
+#include "options.h"
+
+/* Note that the code in compress.c is nearly identical to the code
+   here, so if you fix a bug here, look there to see if a matching bug
+   needs to be fixed.  I tried to have one set of functions that could
+   do ZIP, ZLIB, and BZIP2, but it became dangerously unreadable with
+   #ifdefs and if(algo) -dshaw */
+
+static void
+init_compress( compress_filter_context_t *zfx, bz_stream *bzs )
+{
+  int rc;
+  int level;
+
+  if( opt.bz2_compress_level >= 1 && opt.bz2_compress_level <= 9 )
+    level = opt.bz2_compress_level;
+  else if( opt.bz2_compress_level == -1 )
+    level = 6; /* no particular reason, but it seems reasonable */
+  else
+    {
+      log_error("invalid compression level; using default level\n");
+      level = 6;
+    }
+
+  if((rc=BZ2_bzCompressInit(bzs,level,0,0))!=BZ_OK)
+    log_fatal("bz2lib problem: %d\n",rc);
+
+  zfx->outbufsize = 8192;
+  zfx->outbuf = xmalloc( zfx->outbufsize );
+}
+
+static int
+do_compress(compress_filter_context_t *zfx, bz_stream *bzs, int flush, IOBUF a)
+{
+  int zrc;
+  unsigned n;
+
+  do
+    {
+      bzs->next_out = zfx->outbuf;
+      bzs->avail_out = zfx->outbufsize;
+      if( DBG_FILTER )
+       log_debug("enter bzCompress: avail_in=%u, avail_out=%u, flush=%d\n",
+                 (unsigned)bzs->avail_in, (unsigned)bzs->avail_out, flush );
+      zrc = BZ2_bzCompress( bzs, flush );
+      if( zrc == BZ_STREAM_END && flush == BZ_FINISH )
+       ;
+      else if( zrc != BZ_RUN_OK && zrc != BZ_FINISH_OK )
+       log_fatal("bz2lib deflate problem: rc=%d\n", zrc );
+
+      n = zfx->outbufsize - bzs->avail_out;
+      if( DBG_FILTER )
+       log_debug("leave bzCompress:"
+                 " avail_in=%u, avail_out=%u, n=%u, zrc=%d\n",
+                 (unsigned)bzs->avail_in, (unsigned)bzs->avail_out,
+                 (unsigned)n, zrc );
+
+      if( iobuf_write( a, zfx->outbuf, n ) )
+       {
+         log_debug("bzCompress: iobuf_write failed\n");
+         return G10ERR_WRITE_FILE;
+       }
+    }
+  while( bzs->avail_in || (flush == BZ_FINISH && zrc != BZ_STREAM_END) );
+
+  return 0;
+}
+
+static void
+init_uncompress( compress_filter_context_t *zfx, bz_stream *bzs )
+{
+  int rc;
+
+  if((rc=BZ2_bzDecompressInit(bzs,0,opt.bz2_decompress_lowmem))!=BZ_OK)
+    log_fatal("bz2lib problem: %d\n",rc);
+
+  zfx->inbufsize = 2048;
+  zfx->inbuf = xmalloc( zfx->inbufsize );
+  bzs->avail_in = 0;
+}
+
+static int
+do_uncompress( compress_filter_context_t *zfx, bz_stream *bzs,
+              IOBUF a, size_t *ret_len )
+{
+  int zrc;
+  int rc=0;
+  size_t n;
+  int nread, count;
+  int refill = !bzs->avail_in;
+
+  if( DBG_FILTER )
+    log_debug("begin bzDecompress: avail_in=%u, avail_out=%u, inbuf=%u\n",
+             (unsigned)bzs->avail_in, (unsigned)bzs->avail_out,
+             (unsigned)zfx->inbufsize );
+  do
+    {
+      if( bzs->avail_in < zfx->inbufsize && refill )
+       {
+         n = bzs->avail_in;
+         if( !n )
+           bzs->next_in = zfx->inbuf;
+         count = zfx->inbufsize - n;
+         nread = iobuf_read( a, zfx->inbuf + n, count );
+         if( nread == -1 ) nread = 0;
+         n += nread;
+         bzs->avail_in = n;
+       }
+
+      refill = 1;
+
+      if( DBG_FILTER )
+       log_debug("enter bzDecompress: avail_in=%u, avail_out=%u\n",
+                 (unsigned)bzs->avail_in, (unsigned)bzs->avail_out);
+
+      zrc=BZ2_bzDecompress(bzs);
+      if( DBG_FILTER )
+       log_debug("leave bzDecompress: avail_in=%u, avail_out=%u, zrc=%d\n",
+                 (unsigned)bzs->avail_in, (unsigned)bzs->avail_out, zrc);
+      if( zrc == BZ_STREAM_END )
+       rc = -1; /* eof */
+      else if( zrc != BZ_OK && zrc != BZ_PARAM_ERROR )
+       log_fatal("bz2lib inflate problem: rc=%d\n", zrc );
+    }
+  while( bzs->avail_out && zrc != BZ_STREAM_END && zrc != BZ_PARAM_ERROR );
+
+  /* I'm not completely happy with the two uses of BZ_PARAM_ERROR
+     here.  The corresponding zlib function is Z_BUF_ERROR, which
+     covers a narrower scope than BZ_PARAM_ERROR. -dshaw */
+
+  *ret_len = zfx->outbufsize - bzs->avail_out;
+  if( DBG_FILTER )
+    log_debug("do_uncompress: returning %u bytes\n", (unsigned)*ret_len );
+  return rc;
+}
+
+int
+compress_filter_bz2( void *opaque, int control,
+                    IOBUF a, byte *buf, size_t *ret_len)
+{
+  size_t size = *ret_len;
+  compress_filter_context_t *zfx = opaque;
+  bz_stream *bzs = zfx->opaque;
+  int rc=0;
+
+  if( control == IOBUFCTRL_UNDERFLOW )
+    {
+      if( !zfx->status )
+       {
+         bzs = zfx->opaque = xmalloc_clear( sizeof *bzs );
+         init_uncompress( zfx, bzs );
+         zfx->status = 1;
+       }
+
+      bzs->next_out = buf;
+      bzs->avail_out = size;
+      zfx->outbufsize = size; /* needed only for calculation */
+      rc = do_uncompress( zfx, bzs, a, ret_len );
+    }
+  else if( control == IOBUFCTRL_FLUSH )
+    {
+      if( !zfx->status )
+       {
+         PACKET pkt;
+         PKT_compressed cd;
+
+         if( zfx->algo != COMPRESS_ALGO_BZIP2 )
+           BUG();
+         memset( &cd, 0, sizeof cd );
+         cd.len = 0;
+         cd.algorithm = zfx->algo;
+         init_packet( &pkt );
+         pkt.pkttype = PKT_COMPRESSED;
+         pkt.pkt.compressed = &cd;
+         if( build_packet( a, &pkt ))
+           log_bug("build_packet(PKT_COMPRESSED) failed\n");
+         bzs = zfx->opaque = xmalloc_clear( sizeof *bzs );
+         init_compress( zfx, bzs );
+         zfx->status = 2;
+       }
+
+      bzs->next_in = buf;
+      bzs->avail_in = size;
+      rc = do_compress( zfx, bzs, BZ_RUN, a );
+    }
+  else if( control == IOBUFCTRL_FREE )
+    {
+      if( zfx->status == 1 )
+       {
+         BZ2_bzDecompressEnd(bzs);
+         xfree(bzs);
+         zfx->opaque = NULL;
+         xfree(zfx->outbuf); zfx->outbuf = NULL;
+       }
+      else if( zfx->status == 2 )
+       {
+         bzs->next_in = buf;
+         bzs->avail_in = 0;
+         do_compress( zfx, bzs, BZ_FINISH, a );
+         BZ2_bzCompressEnd(bzs);
+         xfree(bzs);
+         zfx->opaque = NULL;
+         xfree(zfx->outbuf); zfx->outbuf = NULL;
+       }
+      if (zfx->release)
+       zfx->release (zfx);
+    }
+  else if( control == IOBUFCTRL_DESC )
+    *(char**)buf = "compress_filter";
+  return rc;
+}
diff --git a/g10/compress.c b/g10/compress.c
new file mode 100644 (file)
index 0000000..0cee5ae
--- /dev/null
@@ -0,0 +1,365 @@
+/* compress.c - compress filter
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* Note that the code in compress-bz2.c is nearly identical to the
+   code here, so if you fix a bug here, look there to see if a
+   matching bug needs to be fixed.  I tried to have one set of
+   functions that could do ZIP, ZLIB, and BZIP2, but it became
+   dangerously unreadable with #ifdefs and if(algo) -dshaw */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+#include <errno.h>
+#include <zlib.h>
+#if defined(__riscos__) && defined(USE_ZLIBRISCOS)
+# include "zlib-riscos.h"
+#endif
+
+#include "util.h"
+#include "memory.h"
+#include "packet.h"
+#include "filter.h"
+#include "main.h"
+#include "options.h"
+
+int compress_filter_bz2( void *opaque, int control,
+                        IOBUF a, byte *buf, size_t *ret_len);
+
+static void
+init_compress( compress_filter_context_t *zfx, z_stream *zs )
+{
+    int rc;
+    int level;
+
+#if defined(__riscos__) && defined(USE_ZLIBRISCOS)
+    static int zlib_initialized = 0;
+
+    if (!zlib_initialized)
+        zlib_initialized = riscos_load_module("ZLib", zlib_path, 1);
+#endif
+
+    if( opt.compress_level >= 1 && opt.compress_level <= 9 )
+       level = opt.compress_level;
+    else if( opt.compress_level == -1 )
+       level = Z_DEFAULT_COMPRESSION;
+    else {
+       log_error("invalid compression level; using default level\n");
+       level = Z_DEFAULT_COMPRESSION;
+    }
+
+    if( (rc = zfx->algo == 1? deflateInit2( zs, level, Z_DEFLATED,
+                                           -13, 8, Z_DEFAULT_STRATEGY)
+                           : deflateInit( zs, level )
+                           ) != Z_OK ) {
+       log_fatal("zlib problem: %s\n", zs->msg? zs->msg :
+                              rc == Z_MEM_ERROR ? "out of core" :
+                              rc == Z_VERSION_ERROR ? "invalid lib version" :
+                                                      "unknown error" );
+    }
+
+    zfx->outbufsize = 8192;
+    zfx->outbuf = xmalloc( zfx->outbufsize );
+}
+
+static int
+do_compress( compress_filter_context_t *zfx, z_stream *zs, int flush, IOBUF a )
+{
+    int zrc;
+    unsigned n;
+
+    do {
+#ifndef __riscos__
+       zs->next_out = zfx->outbuf;
+#else /* __riscos__ */
+       zs->next_out = (Bytef *) zfx->outbuf;
+#endif /* __riscos__ */
+       zs->avail_out = zfx->outbufsize;
+       if( DBG_FILTER )
+           log_debug("enter deflate: avail_in=%u, avail_out=%u, flush=%d\n",
+                   (unsigned)zs->avail_in, (unsigned)zs->avail_out, flush );
+       zrc = deflate( zs, flush );
+       if( zrc == Z_STREAM_END && flush == Z_FINISH )
+           ;
+       else if( zrc != Z_OK ) {
+           if( zs->msg )
+               log_fatal("zlib deflate problem: %s\n", zs->msg );
+           else
+               log_fatal("zlib deflate problem: rc=%d\n", zrc );
+       }
+       n = zfx->outbufsize - zs->avail_out;
+       if( DBG_FILTER )
+           log_debug("leave deflate: "
+                     "avail_in=%u, avail_out=%u, n=%u, zrc=%d\n",
+               (unsigned)zs->avail_in, (unsigned)zs->avail_out,
+                                              (unsigned)n, zrc );
+
+       if( iobuf_write( a, zfx->outbuf, n ) ) {
+           log_debug("deflate: iobuf_write failed\n");
+           return G10ERR_WRITE_FILE;
+       }
+    } while( zs->avail_in || (flush == Z_FINISH && zrc != Z_STREAM_END) );
+    return 0;
+}
+
+static void
+init_uncompress( compress_filter_context_t *zfx, z_stream *zs )
+{
+    int rc;
+
+    /****************
+     * PGP uses a windowsize of 13 bits. Using a negative value for
+     * it forces zlib not to expect a zlib header.  This is a
+     * undocumented feature Peter Gutmann told me about.
+     *    
+     * We must use 15 bits for the inflator because CryptoEx uses 15
+     * bits thus the output would get scrambled w/o error indication
+     * if we would use 13 bits.  For the uncompressing this does not
+     * matter at all.
+     */
+    if( (rc = zfx->algo == 1? inflateInit2( zs, -15)
+                           : inflateInit( zs )) != Z_OK ) {
+       log_fatal("zlib problem: %s\n", zs->msg? zs->msg :
+                              rc == Z_MEM_ERROR ? "out of core" :
+                              rc == Z_VERSION_ERROR ? "invalid lib version" :
+                                                      "unknown error" );
+    }
+
+    zfx->inbufsize = 2048;
+    zfx->inbuf = xmalloc( zfx->inbufsize );
+    zs->avail_in = 0;
+}
+
+static int
+do_uncompress( compress_filter_context_t *zfx, z_stream *zs,
+              IOBUF a, size_t *ret_len )
+{
+    int zrc;
+    int rc=0;
+    size_t n;
+    int nread, count;
+    int refill = !zs->avail_in;
+
+    if( DBG_FILTER )
+       log_debug("begin inflate: avail_in=%u, avail_out=%u, inbuf=%u\n",
+               (unsigned)zs->avail_in, (unsigned)zs->avail_out,
+               (unsigned)zfx->inbufsize );
+    do {
+       if( zs->avail_in < zfx->inbufsize && refill ) {
+           n = zs->avail_in;
+           if( !n )
+#ifndef __riscos__
+               zs->next_in = zfx->inbuf;
+#else /* __riscos__ */
+               zs->next_in = (Bytef *) zfx->inbuf;
+#endif /* __riscos__ */
+           count = zfx->inbufsize - n;
+           nread = iobuf_read( a, zfx->inbuf + n, count );
+           if( nread == -1 ) nread = 0;
+           n += nread;
+           /* If we use the undocumented feature to suppress
+            * the zlib header, we have to give inflate an
+            * extra dummy byte to read */
+           if( nread < count && zfx->algo == 1 ) {
+               *(zfx->inbuf + n) = 0xFF; /* is it really needed ? */
+               zfx->algo1hack = 1;
+               n++;
+           }
+           zs->avail_in = n;
+       }
+       refill = 1;
+       if( DBG_FILTER )
+           log_debug("enter inflate: avail_in=%u, avail_out=%u\n",
+                   (unsigned)zs->avail_in, (unsigned)zs->avail_out);
+#ifdef Z_SYNC_FLUSH
+       zrc = inflate( zs, Z_SYNC_FLUSH );
+#else
+       zrc = inflate( zs, Z_PARTIAL_FLUSH );
+#endif
+       if( DBG_FILTER )
+           log_debug("leave inflate: avail_in=%u, avail_out=%u, zrc=%d\n",
+                  (unsigned)zs->avail_in, (unsigned)zs->avail_out, zrc);
+       if( zrc == Z_STREAM_END )
+           rc = -1; /* eof */
+       else if( zrc != Z_OK && zrc != Z_BUF_ERROR ) {
+           if( zs->msg )
+               log_fatal("zlib inflate problem: %s\n", zs->msg );
+           else
+               log_fatal("zlib inflate problem: rc=%d\n", zrc );
+       }
+    } while( zs->avail_out && zrc != Z_STREAM_END  && zrc != Z_BUF_ERROR );
+    *ret_len = zfx->outbufsize - zs->avail_out;
+    if( DBG_FILTER )
+       log_debug("do_uncompress: returning %u bytes\n", (unsigned)*ret_len );
+    return rc;
+}
+
+static int
+compress_filter( void *opaque, int control,
+                IOBUF a, byte *buf, size_t *ret_len)
+{
+    size_t size = *ret_len;
+    compress_filter_context_t *zfx = opaque;
+    z_stream *zs = zfx->opaque;
+    int rc=0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       if( !zfx->status ) {
+           zs = zfx->opaque = xmalloc_clear( sizeof *zs );
+           init_uncompress( zfx, zs );
+           zfx->status = 1;
+       }
+
+#ifndef __riscos__
+       zs->next_out = buf;
+#else /* __riscos__ */
+       zs->next_out = (Bytef *) buf;
+#endif /* __riscos__ */
+       zs->avail_out = size;
+       zfx->outbufsize = size; /* needed only for calculation */
+       rc = do_uncompress( zfx, zs, a, ret_len );
+    }
+    else if( control == IOBUFCTRL_FLUSH ) {
+       if( !zfx->status ) {
+           PACKET pkt;
+           PKT_compressed cd;
+           if(zfx->algo != COMPRESS_ALGO_ZIP
+              && zfx->algo != COMPRESS_ALGO_ZLIB)
+             BUG();
+           memset( &cd, 0, sizeof cd );
+           cd.len = 0;
+           cd.algorithm = zfx->algo;
+           init_packet( &pkt );
+           pkt.pkttype = PKT_COMPRESSED;
+           pkt.pkt.compressed = &cd;
+           if( build_packet( a, &pkt ))
+               log_bug("build_packet(PKT_COMPRESSED) failed\n");
+           zs = zfx->opaque = xmalloc_clear( sizeof *zs );
+           init_compress( zfx, zs );
+           zfx->status = 2;
+       }
+
+#ifndef __riscos__
+       zs->next_in = buf;
+#else /* __riscos__ */
+       zs->next_in = (Bytef *) buf;
+#endif /* __riscos__ */
+       zs->avail_in = size;
+       rc = do_compress( zfx, zs, Z_NO_FLUSH, a );
+    }
+    else if( control == IOBUFCTRL_FREE ) {
+       if( zfx->status == 1 ) {
+           inflateEnd(zs);
+           xfree(zs);
+           zfx->opaque = NULL;
+           xfree(zfx->outbuf); zfx->outbuf = NULL;
+       }
+       else if( zfx->status == 2 ) {
+#ifndef __riscos__
+           zs->next_in = buf;
+#else /* __riscos__ */
+           zs->next_in = (Bytef *) buf;
+#endif /* __riscos__ */
+           zs->avail_in = 0;
+           do_compress( zfx, zs, Z_FINISH, a );
+           deflateEnd(zs);
+           xfree(zs);
+           zfx->opaque = NULL;
+           xfree(zfx->outbuf); zfx->outbuf = NULL;
+       }
+        if (zfx->release)
+          zfx->release (zfx);
+    }
+    else if( control == IOBUFCTRL_DESC )
+       *(char**)buf = "compress_filter";
+    return rc;
+}
+
+
+static void
+release_context (compress_filter_context_t *ctx)
+{
+  xfree (ctx);
+}
+
+/****************
+ * Handle a compressed packet
+ */
+int
+handle_compressed( void *procctx, PKT_compressed *cd,
+                  int (*callback)(IOBUF, void *), void *passthru )
+{
+    compress_filter_context_t *cfx;
+    int rc;
+
+    if(check_compress_algo(cd->algorithm))
+      return G10ERR_COMPR_ALGO;
+    cfx = xmalloc_clear (sizeof *cfx);
+    cfx->release = release_context;
+    cfx->algo = cd->algorithm;
+    push_compress_filter(cd->buf,cfx,cd->algorithm);
+    if( callback )
+       rc = callback(cd->buf, passthru );
+    else
+       rc = proc_packets(procctx, cd->buf);
+    cd->buf = NULL;
+    return rc;
+}
+
+void
+push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo)
+{
+  push_compress_filter2(out,zfx,algo,0);
+}
+
+void
+push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
+                     int algo,int rel)
+{
+  if(algo>=0)
+    zfx->algo=algo;
+  else
+    zfx->algo=DEFAULT_COMPRESS_ALGO;
+
+  switch(zfx->algo)
+    {
+    case COMPRESS_ALGO_NONE:
+      break;
+
+    case COMPRESS_ALGO_ZIP:
+    case COMPRESS_ALGO_ZLIB:
+      iobuf_push_filter2(out,compress_filter,zfx,rel);
+      break;
+
+#ifdef HAVE_BZIP2
+    case COMPRESS_ALGO_BZIP2:
+      iobuf_push_filter2(out,compress_filter_bz2,zfx,rel);
+      break;
+#endif
+
+    default:
+      BUG();
+    }
+}
diff --git a/g10/dearmor.c b/g10/dearmor.c
new file mode 100644 (file)
index 0000000..8d7c60a
--- /dev/null
@@ -0,0 +1,137 @@
+/* dearmor.c - Armor utility
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "filter.h"
+#include "packet.h"
+#include "options.h"
+#include "main.h"
+#include "i18n.h"
+
+/****************
+ * Take an armor file and write it out without armor
+ */
+int
+dearmor_file( const char *fname )
+{
+    armor_filter_context_t afx;
+    IOBUF inp = NULL, out = NULL;
+    int rc = 0;
+    int c;
+
+    memset( &afx, 0, sizeof afx);
+
+    /* prepare iobufs */
+    inp = iobuf_open(fname);
+    if (inp && is_secured_file (iobuf_get_fd (inp)))
+      {
+        iobuf_close (inp);
+        inp = NULL;
+        errno = EPERM;
+      }
+    if (!inp) {
+       log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]",
+                                       strerror(errno) );
+       rc = G10ERR_OPEN_FILE;
+       goto leave;
+    }
+
+    iobuf_push_filter( inp, armor_filter, &afx );
+
+    if( (rc = open_outfile( fname, 0, &out )) )
+       goto leave;
+
+
+
+    while( (c = iobuf_get(inp)) != -1 )
+       iobuf_put( out, c );
+
+
+  leave:
+    if( rc )
+       iobuf_cancel(out);
+    else
+       iobuf_close(out);
+    iobuf_close(inp);
+    return rc;
+}
+
+
+/****************
+ * Take file and write it out with armor
+ */
+int
+enarmor_file( const char *fname )
+{
+    armor_filter_context_t afx;
+    IOBUF inp = NULL, out = NULL;
+    int rc = 0;
+    int c;
+
+    memset( &afx, 0, sizeof afx);
+
+    /* prepare iobufs */
+    inp = iobuf_open(fname);
+    if (inp && is_secured_file (iobuf_get_fd (inp)))
+      {
+        iobuf_close (inp);
+        inp = NULL;
+        errno = EPERM;
+      }
+    if (!inp) {
+       log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]",
+                  strerror(errno) );
+       rc = G10ERR_OPEN_FILE;
+       goto leave;
+    }
+
+
+    if( (rc = open_outfile( fname, 1, &out )) )
+       goto leave;
+
+    afx.what = 4;
+    afx.hdrlines = "Comment: Use \"gpg --dearmor\" for unpacking\n";
+    iobuf_push_filter( out, armor_filter, &afx );
+
+    while( (c = iobuf_get(inp)) != -1 )
+       iobuf_put( out, c );
+
+
+  leave:
+    if( rc )
+       iobuf_cancel(out);
+    else
+       iobuf_close(out);
+    iobuf_close(inp);
+    return rc;
+}
+
+
diff --git a/g10/decrypt.c b/g10/decrypt.c
new file mode 100644 (file)
index 0000000..171e265
--- /dev/null
@@ -0,0 +1,191 @@
+/* decrypt.c - verify signed data
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "status.h"
+#include "i18n.h"
+
+
+
+/****************
+ * Assume that the input is an encrypted message and decrypt
+ * (and if signed, verify the signature on) it.
+ * This command differs from the default operation, as it never
+ * writes to the filename which is included in the file and it
+ * rejects files which don't begin with an encrypted message.
+ */
+
+int
+decrypt_message( const char *filename )
+{
+    IOBUF fp;
+    armor_filter_context_t afx;
+    progress_filter_context_t pfx;
+    int rc;
+    int no_out=0;
+
+    /* open the message file */
+    fp = iobuf_open(filename);
+    if (fp && is_secured_file (iobuf_get_fd (fp)))
+      {
+        iobuf_close (fp);
+        fp = NULL;
+        errno = EPERM;
+      }
+    if( !fp ) {
+       log_error(_("can't open `%s'\n"), print_fname_stdin(filename));
+       return G10ERR_OPEN_FILE;
+    }
+
+    handle_progress (&pfx, fp, filename);
+
+    if( !opt.no_armor ) {
+       if( use_armor_filter( fp ) ) {
+           memset( &afx, 0, sizeof afx);
+           iobuf_push_filter( fp, armor_filter, &afx );
+       }
+    }
+
+    if( !opt.outfile ) {
+       no_out = 1;
+       opt.outfile = "-";
+    }
+    rc = proc_encryption_packets( NULL, fp );
+    if( no_out )
+       opt.outfile = NULL;
+    iobuf_close(fp);
+    return rc;
+}
+
+void
+decrypt_messages(int nfiles, char *files[])
+{
+  IOBUF fp;
+  armor_filter_context_t afx;  
+  progress_filter_context_t pfx;
+  char *p, *output = NULL;
+  int rc=0,use_stdin=0;
+  unsigned int lno=0;
+  
+  if (opt.outfile)
+    {
+      log_error(_("--output doesn't work for this command\n"));
+      return;
+        
+    }
+
+  if(!nfiles)
+    use_stdin=1;
+
+  for(;;)
+    {
+      char line[2048];
+      char *filename=NULL;
+
+      if(use_stdin)
+       {
+         if(fgets(line, DIM(line), stdin))
+           {
+             lno++;
+             if (!*line || line[strlen(line)-1] != '\n')
+               log_error("input line %u too long or missing LF\n", lno);
+             else
+               {
+                 line[strlen(line)-1] = '\0';
+                 filename=line;
+               }
+           }
+       }
+      else
+       {
+         if(nfiles)
+           {
+             filename=*files;
+             nfiles--;
+             files++;
+           }
+       }
+
+      if(filename==NULL)
+       break;
+
+      print_file_status(STATUS_FILE_START, filename, 3);      
+      output = make_outfile_name(filename);
+      if (!output)
+        goto next_file;
+      fp = iobuf_open(filename);
+      if (fp)
+        iobuf_ioctl (fp,3,1,NULL); /* disable fd caching */
+      if (fp && is_secured_file (iobuf_get_fd (fp)))
+        {
+          iobuf_close (fp);
+          fp = NULL;
+          errno = EPERM;
+        }
+      if (!fp)
+        {
+          log_error(_("can't open `%s'\n"), print_fname_stdin(filename));
+          goto next_file;
+        }
+
+      handle_progress (&pfx, fp, filename);
+
+      if (!opt.no_armor)
+        {
+          if (use_armor_filter(fp))
+            {
+              memset(&afx, 0, sizeof afx);
+              iobuf_push_filter(fp, armor_filter, &afx);
+            }
+        }
+      rc = proc_packets(NULL, fp);
+      iobuf_close(fp);
+      if (rc)
+        log_error("%s: decryption failed: %s\n", print_fname_stdin(filename),
+                  g10_errstr(rc));
+      p = get_last_passphrase();
+      set_next_passphrase(p);
+      xfree (p);
+
+    next_file:
+      /* Note that we emit file_done even after an error. */
+      write_status( STATUS_FILE_DONE );
+      iobuf_ioctl( NULL, 2, 0, NULL); /* Invalidate entire cache. */
+      xfree(output);
+    }
+
+  set_next_passphrase(NULL);  
+}
diff --git a/g10/delkey.c b/g10/delkey.c
new file mode 100644 (file)
index 0000000..354851d
--- /dev/null
@@ -0,0 +1,221 @@
+/* delkey.c - delete keys
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "trustdb.h"
+#include "filter.h"
+#include "ttyio.h"
+#include "status.h"
+#include "i18n.h"
+
+
+/****************
+ * Delete a public or secret key from a keyring.
+ * r_sec_avail will be set if a secret key is available and the public
+ * key can't be deleted for that reason.
+ */
+static int
+do_delete_key( const char *username, int secret, int force, int *r_sec_avail )
+{
+    int rc = 0;
+    KBNODE keyblock = NULL;
+    KBNODE node;
+    KEYDB_HANDLE hd = keydb_new (secret);
+    PKT_public_key *pk = NULL;
+    PKT_secret_key *sk = NULL;
+    u32 keyid[2];
+    int okay=0;
+    int yes;
+    KEYDB_SEARCH_DESC desc;
+    int exactmatch;
+
+    *r_sec_avail = 0;
+
+    /* search the userid */
+    classify_user_id (username, &desc);
+    exactmatch = (desc.mode == KEYDB_SEARCH_MODE_FPR
+                  || desc.mode == KEYDB_SEARCH_MODE_FPR16
+                  || desc.mode == KEYDB_SEARCH_MODE_FPR20);
+    rc = desc.mode? keydb_search (hd, &desc, 1):G10ERR_INV_USER_ID;
+    if (rc) {
+       log_error (_("key \"%s\" not found: %s\n"), username, g10_errstr (rc));
+       write_status_text( STATUS_DELETE_PROBLEM, "1" );
+       goto leave;
+    }
+
+    /* read the keyblock */
+    rc = keydb_get_keyblock (hd, &keyblock );
+    if (rc) {
+       log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+       goto leave;
+    }
+
+    /* get the keyid from the keyblock */
+    node = find_kbnode( keyblock, secret? PKT_SECRET_KEY:PKT_PUBLIC_KEY );
+    if( !node ) {
+       log_error("Oops; key not found anymore!\n");
+       rc = G10ERR_GENERAL;
+       goto leave;
+    }
+
+    if( secret )
+      {
+       sk = node->pkt->pkt.secret_key;
+       keyid_from_sk( sk, keyid );
+      }
+    else
+      {
+       /* public */
+       pk = node->pkt->pkt.public_key;
+       keyid_from_pk( pk, keyid );
+
+       if(!force)
+         {
+           rc = seckey_available( keyid );
+           if( !rc )
+             {
+               *r_sec_avail = 1;
+               rc = -1;
+               goto leave;
+             }
+           else if( rc != G10ERR_NO_SECKEY )
+             log_error("%s: get secret key: %s\n", username, g10_errstr(rc) );
+           else
+             rc = 0;
+         }
+      }
+
+    if( rc )
+       rc = 0;
+    else if (opt.batch && exactmatch)
+        okay++;
+    else if( opt.batch && secret )
+      {
+       log_error(_("can't do this in batch mode\n"));
+        log_info (_("(unless you specify the key by fingerprint)\n"));
+      }
+    else if( opt.batch && opt.answer_yes )
+       okay++;
+    else if( opt.batch )
+      {
+       log_error(_("can't do this in batch mode without \"--yes\"\n"));
+        log_info (_("(unless you specify the key by fingerprint)\n"));
+      }
+    else {
+        if( secret )
+            print_seckey_info( sk );
+        else
+            print_pubkey_info(NULL, pk );
+       tty_printf( "\n" );
+
+       yes = cpr_get_answer_is_yes( secret? "delete_key.secret.okay"
+                                          : "delete_key.okay",
+                             _("Delete this key from the keyring? (y/N) "));
+       if( !cpr_enabled() && secret && yes ) {
+           /* I think it is not required to check a passphrase; if
+            * the user is so stupid as to let others access his secret keyring
+            * (and has no backup) - it is up him to read some very
+            * basic texts about security.
+            */
+           yes = cpr_get_answer_is_yes("delete_key.secret.okay",
+                        _("This is a secret key! - really delete? (y/N) "));
+       }
+       if( yes )
+           okay++;
+    }
+
+
+    if( okay ) {
+       rc = keydb_delete_keyblock (hd);
+       if (rc) {
+           log_error (_("deleting keyblock failed: %s\n"), g10_errstr(rc) );
+           goto leave;
+       }
+
+       /* Note that the ownertrust being cleared will trigger a
+           revalidation_mark().  This makes sense - only deleting keys
+           that have ownertrust set should trigger this. */
+
+        if (!secret && pk && clear_ownertrusts (pk)) {
+          if (opt.verbose)
+            log_info (_("ownertrust information cleared\n"));
+        }
+    }
+
+  leave:
+    keydb_release (hd);
+    release_kbnode (keyblock);
+    return rc;
+}
+
+/****************
+ * Delete a public or secret key from a keyring.
+ */
+int
+delete_keys( STRLIST names, int secret, int allow_both )
+{
+    int rc, avail, force=(!allow_both && !secret && opt.expert);
+
+    /* Force allows us to delete a public key even if a secret key
+       exists. */
+
+    for(;names;names=names->next) {
+       rc = do_delete_key (names->d, secret, force, &avail );
+       if ( rc && avail ) { 
+        if ( allow_both ) {
+          rc = do_delete_key (names->d, 1, 0, &avail );
+          if ( !rc )
+            rc = do_delete_key (names->d, 0, 0, &avail );
+        }
+        else {
+          log_error(_(
+             "there is a secret key for public key \"%s\"!\n"),names->d);
+          log_info(_(
+             "use option \"--delete-secret-keys\" to delete it first.\n"));
+          write_status_text( STATUS_DELETE_PROBLEM, "2" );
+          return rc;
+        }
+       }
+
+       if(rc) {
+        log_error("%s: delete key failed: %s\n", names->d, g10_errstr(rc) );
+        return rc;
+       }
+    }
+
+    return 0;
+}
diff --git a/g10/encode.c b/g10/encode.c
new file mode 100644 (file)
index 0000000..251ea3e
--- /dev/null
@@ -0,0 +1,877 @@
+/* encode.c - encode data
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "filter.h"
+#include "trustdb.h"
+#include "i18n.h"
+#include "status.h"
+
+static int encode_simple( const char *filename, int mode, int use_seskey );
+static int write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out );
+
+/****************
+ * Encode FILENAME with only the symmetric cipher.  Take input from
+ * stdin if FILENAME is NULL.
+ */
+int
+encode_symmetric( const char *filename )
+{
+    return encode_simple( filename, 1, 0 );
+}
+
+/****************
+ * Encode FILENAME as a literal data packet only. Take input from
+ * stdin if FILENAME is NULL.
+ */
+int
+encode_store( const char *filename )
+{
+    return encode_simple( filename, 0, 0 );
+}
+
+static void
+encode_seskey( DEK *dek, DEK **seskey, byte *enckey )
+{
+    CIPHER_HANDLE hd;
+    byte buf[33];
+
+    assert ( dek->keylen <= 32 );
+    if(!*seskey)
+      {
+       *seskey=xmalloc_clear(sizeof(DEK));
+       (*seskey)->keylen=dek->keylen;
+       (*seskey)->algo=dek->algo;
+       make_session_key(*seskey);
+       /*log_hexdump( "thekey", c->key, c->keylen );*/
+      }
+
+    buf[0] = (*seskey)->algo;
+    memcpy( buf + 1, (*seskey)->key, (*seskey)->keylen );
+    
+    hd = cipher_open( dek->algo, CIPHER_MODE_CFB, 1 );
+    cipher_setkey( hd, dek->key, dek->keylen );
+    cipher_setiv( hd, NULL, 0 );
+    cipher_encrypt( hd, buf, buf, (*seskey)->keylen + 1 );
+    cipher_close( hd );
+
+    memcpy( enckey, buf, (*seskey)->keylen + 1 );
+    wipememory( buf, sizeof buf ); /* burn key */
+}
+
+/* We try very hard to use a MDC */
+static int
+use_mdc(PK_LIST pk_list,int algo)
+{
+  /* RFC-1991 and 2440 don't have MDC */
+  if(RFC1991 || RFC2440)
+    return 0;
+
+  /* --force-mdc overrides --disable-mdc */
+  if(opt.force_mdc)
+    return 1;
+
+  if(opt.disable_mdc)
+    return 0;
+
+  /* Do the keys really support MDC? */
+
+  if(select_mdc_from_pklist(pk_list))
+    return 1;
+  
+  /* The keys don't support MDC, so now we do a bit of a hack - if any
+     of the AESes or TWOFISH are in the prefs, we assume that the user
+     can handle a MDC.  This is valid for PGP 7, which can handle MDCs
+     though it will not generate them.  2440bis allows this, by the
+     way. */
+
+  if(select_algo_from_prefs(pk_list,PREFTYPE_SYM,
+                           CIPHER_ALGO_AES,NULL)==CIPHER_ALGO_AES)
+    return 1;
+
+  if(select_algo_from_prefs(pk_list,PREFTYPE_SYM,
+                           CIPHER_ALGO_AES192,NULL)==CIPHER_ALGO_AES192)
+    return 1;
+
+  if(select_algo_from_prefs(pk_list,PREFTYPE_SYM,
+                           CIPHER_ALGO_AES256,NULL)==CIPHER_ALGO_AES256)
+    return 1;
+
+  if(select_algo_from_prefs(pk_list,PREFTYPE_SYM,
+                           CIPHER_ALGO_TWOFISH,NULL)==CIPHER_ALGO_TWOFISH)
+    return 1;
+
+  /* Last try.  Use MDC for the modern ciphers. */
+
+  if(cipher_get_blocksize(algo)!=8)
+    return 1;
+
+  return 0; /* No MDC */
+}
+
+/* We don't want to use use_seskey yet because older gnupg versions
+   can't handle it, and there isn't really any point unless we're
+   making a message that can be decrypted by a public key or
+   passphrase. */
+static int
+encode_simple( const char *filename, int mode, int use_seskey )
+{
+    IOBUF inp, out;
+    PACKET pkt;
+    PKT_plaintext *pt = NULL;
+    STRING2KEY *s2k = NULL;
+    byte enckey[33];
+    int rc = 0;
+    int seskeylen = 0;
+    u32 filesize;
+    cipher_filter_context_t cfx;
+    armor_filter_context_t afx;
+    compress_filter_context_t zfx;
+    text_filter_context_t tfx;
+    progress_filter_context_t pfx;
+    int do_compress = !RFC1991 && default_compress_algo();
+
+    memset( &cfx, 0, sizeof cfx);
+    memset( &afx, 0, sizeof afx);
+    memset( &zfx, 0, sizeof zfx);
+    memset( &tfx, 0, sizeof tfx);
+    init_packet(&pkt);
+    
+    /* prepare iobufs */
+    inp = iobuf_open(filename);
+    if (inp)
+      iobuf_ioctl (inp,3,1,NULL); /* disable fd caching */
+    if (inp && is_secured_file (iobuf_get_fd (inp)))
+      {
+        iobuf_close (inp);
+        inp = NULL;
+        errno = EPERM;
+      }
+    if( !inp ) {
+       log_error(_("can't open `%s': %s\n"), filename? filename: "[stdin]",
+                  strerror(errno) );
+       return G10ERR_OPEN_FILE;
+    }
+
+    handle_progress (&pfx, inp, filename);
+
+    if( opt.textmode )
+       iobuf_push_filter( inp, text_filter, &tfx );
+
+    /* Due the the fact that we use don't use an IV to encrypt the
+       session key we can't use the new mode with RFC1991 because
+       it has no S2K salt. RFC1991 always uses simple S2K. */
+    if ( RFC1991 && use_seskey )
+        use_seskey = 0;
+    
+    cfx.dek = NULL;
+    if( mode ) {
+       s2k = xmalloc_clear( sizeof *s2k );
+       s2k->mode = RFC1991? 0:opt.s2k_mode;
+       s2k->hash_algo=S2K_DIGEST_ALGO;
+       cfx.dek = passphrase_to_dek( NULL, 0,
+                                    default_cipher_algo(), s2k, 2,
+                                     NULL, NULL);
+       if( !cfx.dek || !cfx.dek->keylen ) {
+           rc = G10ERR_PASSPHRASE;
+           xfree(cfx.dek);
+           xfree(s2k);
+           iobuf_close(inp);
+           log_error(_("error creating passphrase: %s\n"), g10_errstr(rc) );
+           return rc;
+       }
+        if (use_seskey && s2k->mode != 1 && s2k->mode != 3) {
+            use_seskey = 0;
+            log_info (_("can't use a symmetric ESK packet "
+                        "due to the S2K mode\n"));
+        }
+
+        if ( use_seskey )
+         {
+           DEK *dek = NULL;
+            seskeylen = cipher_get_keylen( default_cipher_algo() ) / 8;
+            encode_seskey( cfx.dek, &dek, enckey );
+            xfree( cfx.dek ); cfx.dek = dek;
+         }
+
+       if(opt.verbose)
+         log_info(_("using cipher %s\n"),
+                  cipher_algo_to_string(cfx.dek->algo));
+
+       cfx.dek->use_mdc=use_mdc(NULL,cfx.dek->algo);
+    }
+
+    if (do_compress && cfx.dek && cfx.dek->use_mdc
+       && is_file_compressed(filename, &rc))
+      {
+        if (opt.verbose)
+          log_info(_("`%s' already compressed\n"), filename);
+        do_compress = 0;        
+      }
+
+    if( rc || (rc = open_outfile( filename, opt.armor? 1:0, &out )) ) {
+       iobuf_cancel(inp);
+       xfree(cfx.dek);
+       xfree(s2k);
+       return rc;
+    }
+
+    if( opt.armor )
+       iobuf_push_filter( out, armor_filter, &afx );
+
+    if( s2k && !RFC1991 ) {
+       PKT_symkey_enc *enc = xmalloc_clear( sizeof *enc + seskeylen + 1 );
+       enc->version = 4;
+       enc->cipher_algo = cfx.dek->algo;
+       enc->s2k = *s2k;
+        if ( use_seskey && seskeylen ) {
+            enc->seskeylen = seskeylen + 1; /* algo id */
+            memcpy( enc->seskey, enckey, seskeylen + 1 );
+        }
+       pkt.pkttype = PKT_SYMKEY_ENC;
+       pkt.pkt.symkey_enc = enc;
+       if( (rc = build_packet( out, &pkt )) )
+           log_error("build symkey packet failed: %s\n", g10_errstr(rc) );
+       xfree(enc);
+    }
+
+    if (!opt.no_literal)
+      pt=setup_plaintext_name(filename,inp);
+
+    /* Note that PGP 5 has problems decrypting symmetrically encrypted
+       data if the file length is in the inner packet. It works when
+       only partial length headers are use.  In the past, we always
+       used partial body length here, but since PGP 2, PGP 6, and PGP
+       7 need the file length, and nobody should be using PGP 5
+       nowadays anyway, this is now set to the file length.  Note also
+       that this only applies to the RFC-1991 style symmetric
+       messages, and not the RFC-2440 style.  PGP 6 and 7 work with
+       either partial length or fixed length with the new style
+       messages. */
+
+    if ( !iobuf_is_pipe_filename (filename) && *filename && !opt.textmode )
+      {
+        off_t tmpsize;
+        int overflow;
+
+       if ( !(tmpsize = iobuf_get_filelength(inp, &overflow))
+             && !overflow )
+          log_info(_("WARNING: `%s' is an empty file\n"), filename );
+        /* We can't encode the length of very large files because
+           OpenPGP uses only 32 bit for file sizes.  So if the the
+           size of a file is larger than 2^32 minus some bytes for
+           packet headers, we switch to partial length encoding. */
+        if ( tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536) )
+          filesize = tmpsize;
+        else
+          filesize = 0;
+      }
+    else
+      filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
+
+    if (!opt.no_literal) {
+       pt->timestamp = make_timestamp();
+       pt->mode = opt.textmode? 't' : 'b';
+       pt->len = filesize;
+       pt->new_ctb = !pt->len && !RFC1991;
+       pt->buf = inp;
+       pkt.pkttype = PKT_PLAINTEXT;
+       pkt.pkt.plaintext = pt;
+       cfx.datalen = filesize && !do_compress ? calc_packet_length( &pkt ) : 0;
+    }
+    else
+      {
+        cfx.datalen = filesize && !do_compress ? filesize : 0;
+        pkt.pkttype = 0;
+        pkt.pkt.generic = NULL;
+      }
+
+    /* register the cipher filter */
+    if( mode )
+       iobuf_push_filter( out, cipher_filter, &cfx );
+    /* register the compress filter */
+    if( do_compress )
+      {
+        if (cfx.dek && cfx.dek->use_mdc)
+          zfx.new_ctb = 1;
+       push_compress_filter(out,&zfx,default_compress_algo());
+      }
+
+    /* do the work */
+    if (!opt.no_literal) {
+       if( (rc = build_packet( out, &pkt )) )
+           log_error("build_packet failed: %s\n", g10_errstr(rc) );
+    }
+    else {
+       /* user requested not to create a literal packet,
+        * so we copy the plain data */
+       byte copy_buffer[4096];
+       int  bytes_copied;
+       while ((bytes_copied = iobuf_read(inp, copy_buffer, 4096)) != -1)
+           if (iobuf_write(out, copy_buffer, bytes_copied) == -1) {
+               rc = G10ERR_WRITE_FILE;
+               log_error("copying input to output failed: %s\n", g10_errstr(rc) );
+               break;
+           }
+       wipememory(copy_buffer, 4096); /* burn buffer */
+    }
+
+    /* finish the stuff */
+    iobuf_close(inp);
+    if (rc)
+       iobuf_cancel(out);
+    else {
+       iobuf_close(out); /* fixme: check returncode */
+        if (mode)
+            write_status( STATUS_END_ENCRYPTION );
+    }
+    if (pt)
+       pt->buf = NULL;
+    free_packet(&pkt);
+    xfree(cfx.dek);
+    xfree(s2k);
+    return rc;
+}
+
+int
+setup_symkey(STRING2KEY **symkey_s2k,DEK **symkey_dek)
+{
+  *symkey_s2k=xmalloc_clear(sizeof(STRING2KEY));
+  (*symkey_s2k)->mode = opt.s2k_mode;
+  (*symkey_s2k)->hash_algo = S2K_DIGEST_ALGO;
+
+  *symkey_dek=passphrase_to_dek(NULL,0,opt.s2k_cipher_algo,
+                               *symkey_s2k,2,NULL,NULL);
+  if(!*symkey_dek || !(*symkey_dek)->keylen)
+    {
+      xfree(*symkey_dek);
+      xfree(*symkey_s2k);
+      return G10ERR_PASSPHRASE;
+    }
+
+  return 0;
+}
+
+static int
+write_symkey_enc(STRING2KEY *symkey_s2k,DEK *symkey_dek,DEK *dek,IOBUF out)
+{
+  int rc,seskeylen=cipher_get_keylen(dek->algo)/8;
+
+  PKT_symkey_enc *enc;
+  byte enckey[33];
+  PACKET pkt;
+
+  enc=xmalloc_clear(sizeof(PKT_symkey_enc)+seskeylen+1);
+  encode_seskey(symkey_dek,&dek,enckey);
+
+  enc->version = 4;
+  enc->cipher_algo = opt.s2k_cipher_algo;
+  enc->s2k = *symkey_s2k;
+  enc->seskeylen = seskeylen + 1; /* algo id */
+  memcpy( enc->seskey, enckey, seskeylen + 1 );
+
+  pkt.pkttype = PKT_SYMKEY_ENC;
+  pkt.pkt.symkey_enc = enc;
+
+  if((rc=build_packet(out,&pkt)))
+    log_error("build symkey_enc packet failed: %s\n",g10_errstr(rc));
+
+  xfree(enc);
+  return rc;
+}
+
+/****************
+ * Encrypt the file with the given userids (or ask if none
+ * is supplied).
+ */
+int
+encode_crypt( const char *filename, STRLIST remusr, int use_symkey )
+{
+    IOBUF inp = NULL, out = NULL;
+    PACKET pkt;
+    PKT_plaintext *pt = NULL;
+    DEK *symkey_dek = NULL;
+    STRING2KEY *symkey_s2k = NULL;
+    int rc = 0, rc2 = 0;
+    u32 filesize;
+    cipher_filter_context_t cfx;
+    armor_filter_context_t afx;
+    compress_filter_context_t zfx;
+    text_filter_context_t tfx;
+    progress_filter_context_t pfx;
+    PK_LIST pk_list,work_list;
+    int do_compress = opt.compress_algo && !RFC1991;
+
+    memset( &cfx, 0, sizeof cfx);
+    memset( &afx, 0, sizeof afx);
+    memset( &zfx, 0, sizeof zfx);
+    memset( &tfx, 0, sizeof tfx);
+    init_packet(&pkt);
+
+    if(use_symkey
+       && (rc=setup_symkey(&symkey_s2k,&symkey_dek)))
+      return rc;
+
+    if( (rc=build_pk_list( remusr, &pk_list, PUBKEY_USAGE_ENC)) )
+       return rc;
+
+    if(PGP2) {
+      for(work_list=pk_list; work_list; work_list=work_list->next)
+       if(!(is_RSA(work_list->pk->pubkey_algo) &&
+            nbits_from_pk(work_list->pk)<=2048))
+         {
+           log_info(_("you can only encrypt to RSA keys of 2048 bits or "
+                      "less in --pgp2 mode\n"));
+           compliance_failure();
+           break;
+         }
+    }
+
+    /* prepare iobufs */
+    inp = iobuf_open(filename);
+    if (inp)
+      iobuf_ioctl (inp,3,1,NULL); /* disable fd caching */
+    if (inp && is_secured_file (iobuf_get_fd (inp)))
+      {
+        iobuf_close (inp);
+        inp = NULL;
+        errno = EPERM;
+      }
+    if( !inp ) {
+       log_error(_("can't open `%s': %s\n"), filename? filename: "[stdin]",
+                                       strerror(errno) );
+       rc = G10ERR_OPEN_FILE;
+       goto leave;
+    }
+    else if( opt.verbose )
+       log_info(_("reading from `%s'\n"), filename? filename: "[stdin]");
+
+    handle_progress (&pfx, inp, filename);
+
+    if( opt.textmode )
+       iobuf_push_filter( inp, text_filter, &tfx );
+
+    if( (rc = open_outfile( filename, opt.armor? 1:0, &out )) )
+       goto leave;
+
+    if( opt.armor )
+       iobuf_push_filter( out, armor_filter, &afx );
+
+    /* create a session key */
+    cfx.dek = xmalloc_secure_clear (sizeof *cfx.dek);
+    if( !opt.def_cipher_algo ) { /* try to get it from the prefs */
+       cfx.dek->algo = select_algo_from_prefs(pk_list,PREFTYPE_SYM,-1,NULL);
+       /* The only way select_algo_from_prefs can fail here is when
+           mixing v3 and v4 keys, as v4 keys have an implicit
+           preference entry for 3DES, and the pk_list cannot be empty.
+           In this case, use 3DES anyway as it's the safest choice -
+           perhaps the v3 key is being used in an OpenPGP
+           implementation and we know that the implementation behind
+           any v4 key can handle 3DES. */
+       if( cfx.dek->algo == -1 ) {
+           cfx.dek->algo = CIPHER_ALGO_3DES;
+
+           if( PGP2 ) {
+             log_info(_("unable to use the IDEA cipher for all of the keys "
+                        "you are encrypting to.\n"));
+             compliance_failure();
+           }
+       }
+    }
+    else {
+      if(!opt.expert &&
+        select_algo_from_prefs(pk_list,PREFTYPE_SYM,
+                               opt.def_cipher_algo,NULL)!=opt.def_cipher_algo)
+       log_info(_("WARNING: forcing symmetric cipher %s (%d)"
+                  " violates recipient preferences\n"),
+                cipher_algo_to_string(opt.def_cipher_algo),
+                opt.def_cipher_algo);
+
+      cfx.dek->algo = opt.def_cipher_algo;
+    }
+
+    cfx.dek->use_mdc=use_mdc(pk_list,cfx.dek->algo);
+
+    /* Only do the is-file-already-compressed check if we are using a
+       MDC.  This forces compressed files to be re-compressed if we do
+       not have a MDC to give some protection against chosen
+       ciphertext attacks. */
+
+    if (do_compress && cfx.dek->use_mdc && is_file_compressed(filename, &rc2) )
+      {
+        if (opt.verbose)
+          log_info(_("`%s' already compressed\n"), filename);
+        do_compress = 0;        
+      }
+    if (rc2)
+      {
+        rc = rc2;
+        goto leave;
+      }
+
+    make_session_key( cfx.dek );
+    if( DBG_CIPHER )
+       log_hexdump("DEK is: ", cfx.dek->key, cfx.dek->keylen );
+
+    rc = write_pubkey_enc_from_list( pk_list, cfx.dek, out );
+    if( rc  )
+       goto leave;
+
+    /* We put the passphrase (if any) after any public keys as this
+       seems to be the most useful on the recipient side - there is no
+       point in prompting a user for a passphrase if they have the
+       secret key needed to decrypt. */
+    if(use_symkey && (rc=write_symkey_enc(symkey_s2k,symkey_dek,cfx.dek,out)))
+      goto leave;
+
+    if (!opt.no_literal) {
+       /* setup the inner packet */
+       if( filename || opt.set_filename ) {
+           char *s = make_basename( opt.set_filename ? opt.set_filename
+                                                     : filename,
+                                    iobuf_get_real_fname( inp ) );
+           pt = xmalloc( sizeof *pt + strlen(s) - 1 );
+           pt->namelen = strlen(s);
+           memcpy(pt->name, s, pt->namelen );
+           xfree(s);
+       }
+       else { /* no filename */
+           pt = xmalloc( sizeof *pt - 1 );
+           pt->namelen = 0;
+       }
+    }
+
+    if (!iobuf_is_pipe_filename (filename) && *filename && !opt.textmode )
+      {
+        off_t tmpsize;
+        int overflow;
+
+       if ( !(tmpsize = iobuf_get_filelength(inp, &overflow))
+             && !overflow )
+          log_info(_("WARNING: `%s' is an empty file\n"), filename );
+        /* We can't encode the length of very large files because
+           OpenPGP uses only 32 bit for file sizes.  So if the the
+           size of a file is larger than 2^32 minus some bytes for
+           packet headers, we switch to partial length encoding. */
+        if (tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536) )
+          filesize = tmpsize;
+        else
+          filesize = 0;
+      }
+    else
+      filesize = opt.set_filesize ? opt.set_filesize : 0; /* stdin */
+
+    if (!opt.no_literal) {
+       pt->timestamp = make_timestamp();
+       pt->mode = opt.textmode ? 't' : 'b';
+       pt->len = filesize;
+       pt->new_ctb = !pt->len && !RFC1991;
+       pt->buf = inp;
+       pkt.pkttype = PKT_PLAINTEXT;
+       pkt.pkt.plaintext = pt;
+       cfx.datalen = filesize && !do_compress? calc_packet_length( &pkt ) : 0;
+    }
+    else
+       cfx.datalen = filesize && !do_compress ? filesize : 0;
+
+    /* register the cipher filter */
+    iobuf_push_filter( out, cipher_filter, &cfx );
+
+    /* register the compress filter */
+    if( do_compress ) {
+       int compr_algo = opt.compress_algo;
+
+       if(compr_algo==-1)
+         {
+           if((compr_algo=
+               select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
+             compr_algo=DEFAULT_COMPRESS_ALGO;
+           /* Theoretically impossible to get here since uncompressed
+              is implicit. */
+         }
+       else if(!opt.expert &&
+               select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
+                                      compr_algo,NULL)!=compr_algo)
+         log_info(_("WARNING: forcing compression algorithm %s (%d)"
+                    " violates recipient preferences\n"),
+                  compress_algo_to_string(compr_algo),compr_algo);
+
+       /* algo 0 means no compression */
+       if( compr_algo )
+         {
+            if (cfx.dek && cfx.dek->use_mdc)
+              zfx.new_ctb = 1;
+           push_compress_filter(out,&zfx,compr_algo);
+         }
+    }
+
+    /* do the work */
+    if (!opt.no_literal) {
+       if( (rc = build_packet( out, &pkt )) )
+           log_error("build_packet failed: %s\n", g10_errstr(rc) );
+    }
+    else {
+       /* user requested not to create a literal packet, so we copy
+           the plain data */
+       byte copy_buffer[4096];
+       int  bytes_copied;
+       while ((bytes_copied = iobuf_read(inp, copy_buffer, 4096)) != -1)
+           if (iobuf_write(out, copy_buffer, bytes_copied) == -1) {
+               rc = G10ERR_WRITE_FILE;
+               log_error("copying input to output failed: %s\n",
+                          g10_errstr(rc) );
+               break;
+           }
+       wipememory(copy_buffer, 4096); /* burn buffer */
+    }
+
+    /* finish the stuff */
+  leave:
+    iobuf_close(inp);
+    if( rc )
+       iobuf_cancel(out);
+    else {
+       iobuf_close(out); /* fixme: check returncode */
+        write_status( STATUS_END_ENCRYPTION );
+    }
+    if( pt )
+       pt->buf = NULL;
+    free_packet(&pkt);
+    xfree(cfx.dek);
+    xfree(symkey_dek);
+    xfree(symkey_s2k);
+    release_pk_list( pk_list );
+    return rc;
+}
+
+
+
+
+/****************
+ * Filter to do a complete public key encryption.
+ */
+int
+encrypt_filter( void *opaque, int control,
+              IOBUF a, byte *buf, size_t *ret_len)
+{
+    size_t size = *ret_len;
+    encrypt_filter_context_t *efx = opaque;
+    int rc=0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) { /* decrypt */
+       BUG(); /* not used */
+    }
+    else if( control == IOBUFCTRL_FLUSH ) { /* encrypt */
+       if( !efx->header_okay ) {
+           efx->cfx.dek = xmalloc_secure_clear( sizeof *efx->cfx.dek );
+
+           if( !opt.def_cipher_algo  ) { /* try to get it from the prefs */
+               efx->cfx.dek->algo =
+                 select_algo_from_prefs(efx->pk_list,PREFTYPE_SYM,-1,NULL);
+               if( efx->cfx.dek->algo == -1 ) {
+                    /* because 3DES is implicitly in the prefs, this can only
+                     * happen if we do not have any public keys in the list */
+                   efx->cfx.dek->algo = DEFAULT_CIPHER_ALGO;
+                }
+           }
+           else {
+             if(!opt.expert &&
+                select_algo_from_prefs(efx->pk_list,PREFTYPE_SYM,
+                                       opt.def_cipher_algo,
+                                       NULL)!=opt.def_cipher_algo)
+               log_info(_("forcing symmetric cipher %s (%d) "
+                          "violates recipient preferences\n"),
+                        cipher_algo_to_string(opt.def_cipher_algo),
+                        opt.def_cipher_algo);
+
+             efx->cfx.dek->algo = opt.def_cipher_algo;
+           }
+
+            efx->cfx.dek->use_mdc = use_mdc(efx->pk_list,efx->cfx.dek->algo);
+
+           make_session_key( efx->cfx.dek );
+           if( DBG_CIPHER )
+               log_hexdump("DEK is: ",
+                            efx->cfx.dek->key, efx->cfx.dek->keylen );
+
+           rc = write_pubkey_enc_from_list( efx->pk_list, efx->cfx.dek, a );
+           if( rc )
+               return rc;
+
+           if(efx->symkey_s2k && efx->symkey_dek)
+             {
+               rc=write_symkey_enc(efx->symkey_s2k,efx->symkey_dek,
+                                   efx->cfx.dek,a);
+               if(rc)
+                 return rc;
+             }
+
+           iobuf_push_filter( a, cipher_filter, &efx->cfx );
+
+           efx->header_okay = 1;
+       }
+       rc = iobuf_write( a, buf, size );
+
+    }
+    else if( control == IOBUFCTRL_FREE )
+      {
+       xfree(efx->symkey_dek);
+       xfree(efx->symkey_s2k);
+      }
+    else if( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "encrypt_filter";
+    }
+    return rc;
+}
+
+
+/****************
+ * Write pubkey-enc packets from the list of PKs to OUT.
+ */
+static int
+write_pubkey_enc_from_list( PK_LIST pk_list, DEK *dek, IOBUF out )
+{
+    PACKET pkt;
+    PKT_public_key *pk;
+    PKT_pubkey_enc  *enc;
+    int rc;
+
+    for( ; pk_list; pk_list = pk_list->next ) {
+       MPI frame;
+
+       pk = pk_list->pk;
+
+       print_pubkey_algo_note( pk->pubkey_algo );
+       enc = xmalloc_clear( sizeof *enc );
+       enc->pubkey_algo = pk->pubkey_algo;
+       keyid_from_pk( pk, enc->keyid );
+       enc->throw_keyid = (opt.throw_keyid || (pk_list->flags&1));
+
+       if(opt.throw_keyid && (PGP2 || PGP6 || PGP7 || PGP8))
+         {
+           log_info(_("you may not use %s while in %s mode\n"),
+                    "--throw-keyid",compliance_option_string());
+           compliance_failure();
+         }
+
+       /* Okay, what's going on: We have the session key somewhere in
+        * the structure DEK and want to encode this session key in
+        * an integer value of n bits.  pubkey_nbits gives us the
+        * number of bits we have to use.  We then encode the session
+        * key in some way and we get it back in the big intger value
+        * FRAME.  Then we use FRAME, the public key PK->PKEY and the
+        * algorithm number PK->PUBKEY_ALGO and pass it to pubkey_encrypt
+        * which returns the encrypted value in the array ENC->DATA.
+        * This array has a size which depends on the used algorithm
+        * (e.g. 2 for Elgamal).  We don't need frame anymore because we
+        * have everything now in enc->data which is the passed to
+        * build_packet()
+        */
+       frame = encode_session_key( dek, pubkey_nbits( pk->pubkey_algo,
+                                                         pk->pkey ) );
+       rc = pubkey_encrypt( pk->pubkey_algo, enc->data, frame, pk->pkey );
+       mpi_free( frame );
+       if( rc )
+           log_error("pubkey_encrypt failed: %s\n", g10_errstr(rc) );
+       else {
+           if( opt.verbose ) {
+               char *ustr = get_user_id_string_native (enc->keyid);
+               log_info(_("%s/%s encrypted for: \"%s\"\n"),
+                   pubkey_algo_to_string(enc->pubkey_algo),
+                   cipher_algo_to_string(dek->algo), ustr );
+               xfree(ustr);
+           }
+           /* and write it */
+           init_packet(&pkt);
+           pkt.pkttype = PKT_PUBKEY_ENC;
+           pkt.pkt.pubkey_enc = enc;
+           rc = build_packet( out, &pkt );
+           if( rc )
+              log_error("build_packet(pubkey_enc) failed: %s\n", g10_errstr(rc));
+       }
+       free_pubkey_enc(enc);
+       if( rc )
+           return rc;
+    }
+    return 0;
+}
+
+void
+encode_crypt_files(int nfiles, char **files, STRLIST remusr)
+{
+  int rc = 0;
+
+  if (opt.outfile)
+    {
+      log_error(_("--output doesn't work for this command\n"));
+      return;        
+    }
+    
+  if (!nfiles)
+    {
+      char line[2048];
+      unsigned int lno = 0;
+      while ( fgets(line, DIM(line), stdin) )
+        {
+          lno++;
+          if (!*line || line[strlen(line)-1] != '\n')
+            {
+              log_error("input line %u too long or missing LF\n", lno);
+              return;
+            }
+          line[strlen(line)-1] = '\0';
+          print_file_status(STATUS_FILE_START, line, 2);
+          if ( (rc = encode_crypt(line, remusr, 0)) )
+            log_error("encryption of `%s' failed: %s\n",
+                      print_fname_stdin(line), g10_errstr(rc) );
+          write_status( STATUS_FILE_DONE );
+          iobuf_ioctl( NULL, 2, 0, NULL); /* Invalidate entire cache. */
+        }
+    }
+  else
+    {
+      while (nfiles--)
+        {
+          print_file_status(STATUS_FILE_START, *files, 2);
+          if ( (rc = encode_crypt(*files, remusr, 0)) )
+            log_error("encryption of `%s' failed: %s\n",
+                      print_fname_stdin(*files), g10_errstr(rc) );
+          write_status( STATUS_FILE_DONE );
+          iobuf_ioctl( NULL, 2, 0, NULL); /* Invalidate entire cache. */
+          files++;
+        }
+    }
+}
diff --git a/g10/encr-data.c b/g10/encr-data.c
new file mode 100644 (file)
index 0000000..acb090a
--- /dev/null
@@ -0,0 +1,320 @@
+/* encr-data.c -  process an encrypted data packet
+ * Copyright (C) 1998, 1999, 2000, 2001, 2005,
+ *               2006  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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "packet.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "options.h"
+#include "i18n.h"
+
+
+static int mdc_decode_filter( void *opaque, int control, IOBUF a,
+                                             byte *buf, size_t *ret_len);
+static int decode_filter( void *opaque, int control, IOBUF a,
+                                       byte *buf, size_t *ret_len);
+
+typedef struct {
+    CIPHER_HANDLE cipher_hd;
+    MD_HANDLE mdc_hash;
+    char defer[22];
+    int  defer_filled;
+    int  eof_seen;
+    int  refcount;
+} *decode_filter_ctx_t;
+
+
+/* Helper to release the decode context.  */
+static void
+release_dfx_context (decode_filter_ctx_t dfx)
+{
+  if (!dfx)
+    return;
+
+  assert (dfx->refcount);
+  if ( !--dfx->refcount )
+    {
+      cipher_close (dfx->cipher_hd);
+      dfx->cipher_hd = NULL;
+      md_close (dfx->mdc_hash);
+      dfx->mdc_hash = NULL;
+      xfree (dfx);
+    }
+}
+
+
+/****************
+ * Decrypt the data, specified by ED with the key DEK.
+ */
+int
+decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek )
+{
+    decode_filter_ctx_t dfx;
+    byte *p;
+    int rc=0, c, i;
+    byte temp[32];
+    unsigned blocksize;
+    unsigned nprefix;
+
+
+    dfx = xcalloc (1, sizeof *dfx);
+    dfx->refcount = 1;
+
+    if( opt.verbose && !dek->algo_info_printed ) {
+       const char *s = cipher_algo_to_string( dek->algo );
+       if( s )
+           log_info(_("%s encrypted data\n"), s );
+       else
+           log_info(_("encrypted with unknown algorithm %d\n"), dek->algo );
+        dek->algo_info_printed = 1;
+    }
+    if( (rc=check_cipher_algo(dek->algo)) )
+       goto leave;
+    blocksize = cipher_get_blocksize(dek->algo);
+    if( !blocksize || blocksize > 16 )
+       log_fatal("unsupported blocksize %u\n", blocksize );
+    nprefix = blocksize;
+    if( ed->len && ed->len < (nprefix+2) )
+       BUG();
+
+    if( ed->mdc_method ) {
+       dfx->mdc_hash = md_open ( ed->mdc_method, 0 );
+       if ( DBG_HASHING )
+           md_start_debug (dfx->mdc_hash, "checkmdc");
+    }
+    dfx->cipher_hd = cipher_open ( dek->algo,
+                                   ed->mdc_method? CIPHER_MODE_CFB
+                                                 : CIPHER_MODE_AUTO_CFB, 1 );
+    /* log_hexdump( "thekey", dek->key, dek->keylen );*/
+    rc = cipher_setkey ( dfx->cipher_hd, dek->key, dek->keylen );
+    if( rc == G10ERR_WEAK_KEY )
+      {
+       log_info(_("WARNING: message was encrypted with"
+                  " a weak key in the symmetric cipher.\n"));
+       rc=0;
+      }
+    else if( rc )
+      {
+       log_error("key setup failed: %s\n", g10_errstr(rc) );
+       goto leave;
+      
+      }
+    if (!ed->buf) {
+        log_error(_("problem handling encrypted packet\n"));
+        goto leave;
+    }
+
+    cipher_setiv ( dfx->cipher_hd, NULL, 0 );
+
+    if( ed->len ) {
+       for(i=0; i < (nprefix+2) && ed->len; i++, ed->len-- ) {
+           if( (c=iobuf_get(ed->buf)) == -1 )
+               break;
+           else
+               temp[i] = c;
+       }
+    }
+    else {
+       for(i=0; i < (nprefix+2); i++ )
+           if( (c=iobuf_get(ed->buf)) == -1 )
+               break;
+           else
+               temp[i] = c;
+    }
+    cipher_decrypt ( dfx->cipher_hd, temp, temp, nprefix+2);
+    cipher_sync ( dfx->cipher_hd );
+    p = temp;
+/* log_hexdump( "prefix", temp, nprefix+2 ); */
+    if(dek->symmetric
+       && (p[nprefix-2] != p[nprefix] || p[nprefix-1] != p[nprefix+1]) )
+      {
+       rc = G10ERR_BAD_KEY;
+       goto leave;
+      }
+
+    if ( dfx->mdc_hash )
+       md_write ( dfx->mdc_hash, temp, nprefix+2 );
+
+    dfx->refcount++;
+    if ( ed->mdc_method )
+       iobuf_push_filter( ed->buf, mdc_decode_filter, dfx );
+    else
+       iobuf_push_filter( ed->buf, decode_filter, dfx );
+
+    proc_packets( procctx, ed->buf );
+    ed->buf = NULL;
+    if( ed->mdc_method && dfx->eof_seen == 2 )
+       rc = G10ERR_INVALID_PACKET;
+    else if( ed->mdc_method ) { /* check the mdc */
+        /* We used to let parse-packet.c handle the MDC packet but
+           this turned out to be a problem with compressed packets:
+           With old style packets there is no length information
+           available and the decompressor uses an implicit end.
+           However we can't know this implicit end beforehand (:-) and
+           thus may feed the decompressor with more bytes than
+           actually needed.  It would be possible to unread the extra
+           bytes but due to our weird iobuf system any unread is non
+           reliable due to filters already popped off.  The easy and
+           sane solution is to care about the MDC packet only here and
+           never pass it to the packet parser.  Fortunatley the
+           OpenPGP spec requires a strict format for the MDC packet so
+           that we know that 22 bytes are appended.  */
+       int datalen = md_digest_length( ed->mdc_method );
+
+        assert (dfx->cipher_hd);
+        assert (dfx->mdc_hash);
+       cipher_decrypt ( dfx->cipher_hd, dfx->defer, dfx->defer, 22);
+        md_write ( dfx->mdc_hash, dfx->defer, 2);
+       md_final ( dfx->mdc_hash );
+        if (dfx->defer[0] != '\xd3' || dfx->defer[1] != '\x14' ) {
+            log_error("mdc_packet with invalid encoding\n");
+            rc = G10ERR_INVALID_PACKET;
+        }
+       else if ( datalen != 20
+           || memcmp(md_read( dfx->mdc_hash, 0 ), dfx->defer+2, datalen) )
+           rc = G10ERR_BAD_SIGN;
+       /*log_hexdump("MDC calculated:",md_read( dfx->mdc_hash, 0), datalen);*/
+       /*log_hexdump("MDC message   :", dfx->defer, 20);*/
+    }
+    
+
+  leave:
+    release_dfx_context (dfx);
+    return rc;
+}
+
+
+
+/* I think we should merge this with cipher_filter */
+static int
+mdc_decode_filter( void *opaque, int control, IOBUF a,
+                                             byte *buf, size_t *ret_len)
+{
+    decode_filter_ctx_t dfx = opaque;
+    size_t n, size = *ret_len;
+    int rc = 0;
+    int c;
+
+    if( control == IOBUFCTRL_UNDERFLOW && dfx->eof_seen ) {
+       *ret_len = 0;
+       rc = -1;
+    }
+    else if( control == IOBUFCTRL_UNDERFLOW ) {
+       assert(a);
+       assert( size > 44 );
+
+       /* get at least 20 bytes and put it somewhere ahead in the buffer */
+       for(n=22; n < 44 ; n++ ) {
+           if( (c = iobuf_get(a)) == -1 )
+               break;
+           buf[n] = c;
+       }
+       if( n == 44 ) {
+           /* we have enough stuff - flush the deferred stuff */
+           /* (we have asserted that the buffer is large enough) */
+           if( !dfx->defer_filled ) { /* the first time */
+               memcpy(buf, buf+22, 22 );
+               n = 22;
+           }
+           else {
+               memcpy(buf, dfx->defer, 22 );
+           }
+           /* now fill up */
+           for(; n < size; n++ ) {
+               if( (c = iobuf_get(a)) == -1 )
+                   break;
+               buf[n] = c;
+           }
+           /* Move the last 22 bytes back to the defer buffer. */
+           /* (okay, we are wasting 22 bytes of supplied buffer) */
+           n -= 22;
+           memcpy( dfx->defer, buf+n, 22 );
+           dfx->defer_filled = 1;
+       }
+       else if( !dfx->defer_filled ) { /* eof seen buf empty defer */
+           /* this is bad because there is an incomplete hash */
+           n -= 22;
+           memcpy(buf, buf+22, n );
+           dfx->eof_seen = 2; /* eof with incomplete hash */
+       }
+       else { /* eof seen */
+           memcpy (buf, dfx->defer, 22 );
+           n -= 22;
+           memcpy( dfx->defer, buf+n, 22 );
+           dfx->eof_seen = 1; /* normal eof */
+       }
+
+       if( n ) {
+            if (dfx->cipher_hd)
+                cipher_decrypt( dfx->cipher_hd, buf, buf, n);
+            if (dfx->mdc_hash)
+                md_write( dfx->mdc_hash, buf, n );
+       }
+       else {
+           assert( dfx->eof_seen );
+           rc = -1; /* eof */
+       }
+       *ret_len = n;
+    }
+    else if ( control == IOBUFCTRL_FREE ) {
+        release_dfx_context (dfx);
+    }
+    else if( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "mdc_decode_filter";
+    }
+    return rc;
+}
+
+static int
+decode_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len)
+{
+    decode_filter_ctx_t fc = opaque;
+    size_t n, size = *ret_len;
+    int rc = 0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       assert(a);
+       n = iobuf_read( a, buf, size );
+       if( n == -1 ) n = 0;
+       if( n ) {
+            if (fc->cipher_hd)
+                cipher_decrypt( fc->cipher_hd, buf, buf, n);
+        }
+       else
+           rc = -1; /* eof */
+       *ret_len = n;
+    }
+    else if ( control == IOBUFCTRL_FREE ) {
+        release_dfx_context (fc);
+    }
+    else if( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "decode_filter";
+    }
+    return rc;
+}
+
diff --git a/g10/exec.c b/g10/exec.c
new file mode 100644 (file)
index 0000000..d99bb5e
--- /dev/null
@@ -0,0 +1,626 @@
+/* exec.c - generic call-a-program code
+ * Copyright (C) 2001, 2002, 2003, 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#ifndef EXEC_TEMPFILE_ONLY
+#include <sys/wait.h>
+#endif
+#ifdef HAVE_DOSISH_SYSTEM
+#include <windows.h>
+#endif
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include "options.h"
+#include "memory.h"
+#include "i18n.h"
+#include "iobuf.h"
+#include "util.h"
+#include "exec.h"
+
+#ifdef NO_EXEC
+int exec_write(struct exec_info **info,const char *program,
+              const char *args_in,const char *name,int writeonly,int binary)
+{
+  log_error(_("no remote program execution supported\n"));
+  return G10ERR_GENERAL;
+}
+
+int exec_read(struct exec_info *info) { return G10ERR_GENERAL; }
+int exec_finish(struct exec_info *info) { return G10ERR_GENERAL; }
+int set_exec_path(const char *path) { return G10ERR_GENERAL; }
+
+#else /* ! NO_EXEC */
+
+#ifndef HAVE_MKDTEMP
+char *mkdtemp(char *template);
+#endif
+
+#if defined (_WIN32)
+/* This is a nicer system() for windows that waits for programs to
+   return before returning control to the caller.  I hate helpful
+   computers. */
+static int win_system(const char *command)
+{
+  PROCESS_INFORMATION pi;
+  STARTUPINFO si;
+  char *string;
+
+  /* We must use a copy of the command as CreateProcess modifies this
+     argument. */
+  string=xstrdup(command);
+
+  memset(&pi,0,sizeof(pi));
+  memset(&si,0,sizeof(si));
+  si.cb=sizeof(si);
+
+  if(!CreateProcess(NULL,string,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
+    return -1;
+
+  /* Wait for the child to exit */
+  WaitForSingleObject(pi.hProcess,INFINITE);
+
+  CloseHandle(pi.hProcess);
+  CloseHandle(pi.hThread);
+  xfree(string);
+
+  return 0;
+}
+#endif
+
+/* Replaces current $PATH */
+int set_exec_path(const char *path)
+{
+  char *p;
+
+  p=xmalloc(5+strlen(path)+1);
+  strcpy(p,"PATH=");
+  strcat(p,path);
+
+  if(DBG_EXTPROG)
+    log_debug("set_exec_path: %s\n",p);
+
+  /* Notice that path is never freed.  That is intentional due to the
+     way putenv() works.  This leaks a few bytes if we call
+     set_exec_path multiple times. */
+
+  if(putenv(p)!=0)
+    return G10ERR_GENERAL;
+  else
+    return 0;
+}
+
+/* Makes a temp directory and filenames */
+static int make_tempdir(struct exec_info *info)
+{
+  char *tmp=opt.temp_dir,*namein=info->name,*nameout;
+
+  if(!namein)
+    namein=info->flags.binary?"tempin" EXTSEP_S "bin":"tempin" EXTSEP_S "txt";
+
+  nameout=info->flags.binary?"tempout" EXTSEP_S "bin":"tempout" EXTSEP_S "txt";
+
+  /* Make up the temp dir and files in case we need them */
+
+  if(tmp==NULL)
+    {
+#if defined (_WIN32)
+      int err;
+
+      tmp=xmalloc(MAX_PATH);
+      err=GetTempPath(MAX_PATH,tmp);
+      if(err==0 || err>MAX_PATH)
+       strcpy(tmp,"c:\\windows\\temp");
+      else
+       {
+         int len=strlen(tmp);
+
+         /* GetTempPath may return with \ on the end */
+         while(len>0 && tmp[len-1]=='\\')
+           {
+             tmp[len-1]='\0';
+             len--;
+           }
+       }
+#else /* More unixish systems */
+      tmp=getenv("TMPDIR");
+      if(tmp==NULL)
+       {
+         tmp=getenv("TMP");
+         if(tmp==NULL)
+           {
+#ifdef __riscos__
+             tmp="<Wimp$ScrapDir>.GnuPG";
+             mkdir(tmp,0700); /* Error checks occur later on */
+#else
+             tmp="/tmp";
+#endif
+           }
+       }
+#endif
+    }
+
+  info->tempdir=xmalloc(strlen(tmp)+strlen(DIRSEP_S)+10+1);
+
+  sprintf(info->tempdir,"%s" DIRSEP_S "gpg-XXXXXX",tmp);
+
+#if defined (_WIN32)
+  xfree(tmp);
+#endif
+
+  if(mkdtemp(info->tempdir)==NULL)
+    log_error(_("can't create directory `%s': %s\n"),
+             info->tempdir,strerror(errno));
+  else
+    {
+      info->flags.madedir=1;
+
+      info->tempfile_in=xmalloc(strlen(info->tempdir)+
+                               strlen(DIRSEP_S)+strlen(namein)+1);
+      sprintf(info->tempfile_in,"%s" DIRSEP_S "%s",info->tempdir,namein);
+
+      if(!info->flags.writeonly)
+       {
+         info->tempfile_out=xmalloc(strlen(info->tempdir)+
+                                    strlen(DIRSEP_S)+strlen(nameout)+1);
+         sprintf(info->tempfile_out,"%s" DIRSEP_S "%s",info->tempdir,nameout);
+       }
+    }
+
+  return info->flags.madedir?0:G10ERR_GENERAL;
+}
+
+/* Expands %i and %o in the args to the full temp files within the
+   temp directory. */
+static int expand_args(struct exec_info *info,const char *args_in)
+{
+  const char *ch=args_in;
+  unsigned int size,len;
+
+  info->flags.use_temp_files=0;
+  info->flags.keep_temp_files=0;
+
+  if(DBG_EXTPROG)
+    log_debug("expanding string \"%s\"\n",args_in);
+
+  size=100;
+  info->command=xmalloc(size);
+  len=0;
+  info->command[0]='\0';
+
+  while(*ch!='\0')
+    {
+      if(*ch=='%')
+       {
+         char *append=NULL;
+
+         ch++;
+
+         switch(*ch)
+           {
+           case 'O':
+             info->flags.keep_temp_files=1;
+             /* fall through */
+
+           case 'o': /* out */
+             if(!info->flags.madedir)
+               {
+                 if(make_tempdir(info))
+                   goto fail;
+               }
+             append=info->tempfile_out;
+             info->flags.use_temp_files=1;
+             break;
+
+           case 'I':
+             info->flags.keep_temp_files=1;
+             /* fall through */
+
+           case 'i': /* in */
+             if(!info->flags.madedir)
+               {
+                 if(make_tempdir(info))
+                   goto fail;
+               }
+             append=info->tempfile_in;
+             info->flags.use_temp_files=1;
+             break;
+
+           case '%':
+             append="%";
+             break;
+           }
+
+         if(append)
+           {
+             size_t applen=strlen(append);
+
+             if(applen+len>size-1)
+               {
+                 if(applen<100)
+                   applen=100;
+
+                 size+=applen;
+                 info->command=xrealloc(info->command,size);
+               }
+
+             strcat(info->command,append);
+             len+=strlen(append);
+           }
+       }
+      else
+       {
+         if(len==size-1) /* leave room for the \0 */
+           {
+             size+=100;
+             info->command=xrealloc(info->command,size);
+           }
+
+         info->command[len++]=*ch;
+         info->command[len]='\0';
+       }
+
+      ch++;
+    }
+
+  if(DBG_EXTPROG)
+    log_debug("args expanded to \"%s\", use %u, keep %u\n",info->command,
+             info->flags.use_temp_files,info->flags.keep_temp_files);
+
+  return 0;
+
+ fail:
+
+  xfree(info->command);
+  info->command=NULL;
+
+  return G10ERR_GENERAL;
+}
+
+/* Either handles the tempfile creation, or the fork/exec.  If it
+   returns ok, then info->tochild is a FILE * that can be written to.
+   The rules are: if there are no args, then it's a fork/exec/pipe.
+   If there are args, but no tempfiles, then it's a fork/exec/pipe via
+   shell -c.  If there are tempfiles, then it's a system. */
+
+int exec_write(struct exec_info **info,const char *program,
+              const char *args_in,const char *name,int writeonly,int binary)
+{
+  int ret=G10ERR_GENERAL;
+
+  if(opt.exec_disable && !opt.no_perm_warn)
+    {
+      log_info(_("external program calls are disabled due to unsafe "
+                "options file permissions\n"));
+
+      return ret;
+    }
+
+#if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
+  /* There should be no way to get to this spot while still carrying
+     setuid privs.  Just in case, bomb out if we are. */
+  if(getuid()!=geteuid())
+    BUG();
+#endif
+
+  if(program==NULL && args_in==NULL)
+    BUG();
+
+  *info=xmalloc_clear(sizeof(struct exec_info));
+
+  if(name)
+    (*info)->name=xstrdup(name);
+  (*info)->flags.binary=binary;
+  (*info)->flags.writeonly=writeonly;
+
+  /* Expand the args, if any */
+  if(args_in && expand_args(*info,args_in))
+    goto fail;
+
+#ifdef EXEC_TEMPFILE_ONLY
+  if(!(*info)->flags.use_temp_files)
+    {
+      log_error(_("this platform requires temporary files when calling"
+                 " external programs\n"));
+      goto fail;
+    }
+
+#else /* !EXEC_TEMPFILE_ONLY */
+
+  /* If there are no args, or there are args, but no temp files, we
+     can use fork/exec/pipe */
+  if(args_in==NULL || (*info)->flags.use_temp_files==0)
+    {
+      int to[2],from[2];
+
+      if(pipe(to)==-1)
+       goto fail;
+
+      if(pipe(from)==-1)
+       {
+         close(to[0]);
+         close(to[1]);
+         goto fail;
+       }
+
+      if(((*info)->child=fork())==-1)
+       {
+         close(to[0]);
+         close(to[1]);
+         close(from[0]);
+         close(from[1]);
+         goto fail;
+       }
+
+      if((*info)->child==0)
+       {
+         char *shell=getenv("SHELL");
+
+         if(shell==NULL)
+           shell="/bin/sh";
+
+         /* I'm the child */
+
+         /* If the program isn't going to respond back, they get to
+             keep their stdout/stderr */
+         if(!(*info)->flags.writeonly)
+           {
+             /* implied close of STDERR */
+             if(dup2(STDOUT_FILENO,STDERR_FILENO)==-1)
+               _exit(1);
+
+             /* implied close of STDOUT */
+             close(from[0]);
+             if(dup2(from[1],STDOUT_FILENO)==-1)
+               _exit(1);
+           }
+
+         /* implied close of STDIN */
+         close(to[1]);
+         if(dup2(to[0],STDIN_FILENO)==-1)
+           _exit(1);
+
+         if(args_in==NULL)
+           {
+             if(DBG_EXTPROG)
+               log_debug("execlp: %s\n",program);
+
+             execlp(program,program,(void *)NULL);
+           }
+         else
+           {
+             if(DBG_EXTPROG)
+               log_debug("execlp: %s -c %s\n",shell,(*info)->command);
+
+             execlp(shell,shell,"-c",(*info)->command,(void *)NULL);
+           }
+
+         /* If we get this far the exec failed.  Clean up and return. */
+
+         if(args_in==NULL)
+           log_error(_("unable to execute program `%s': %s\n"),
+                     program,strerror(errno));
+         else
+           log_error(_("unable to execute shell `%s': %s\n"),
+                     shell,strerror(errno));
+
+         /* This mimics the POSIX sh behavior - 127 means "not found"
+             from the shell. */
+         if(errno==ENOENT)
+           _exit(127);
+
+         _exit(1);
+       }
+
+      /* I'm the parent */
+
+      close(to[0]);
+
+      (*info)->tochild=fdopen(to[1],binary?"wb":"w");
+      if((*info)->tochild==NULL)
+       {
+         close(to[1]);
+         ret=G10ERR_WRITE_FILE;
+         goto fail;
+       }
+
+      close(from[1]);
+
+      (*info)->fromchild=iobuf_fdopen(from[0],"r");
+      if((*info)->fromchild==NULL)
+       {
+         close(from[0]);
+         ret=G10ERR_READ_FILE;
+         goto fail;
+       }
+
+      /* fd iobufs are cached?! */
+      iobuf_ioctl((*info)->fromchild,3,1,NULL);
+
+      return 0;
+    }
+#endif /* !EXEC_TEMPFILE_ONLY */
+
+  if(DBG_EXTPROG)
+    log_debug("using temp file `%s'\n",(*info)->tempfile_in);
+
+  /* It's not fork/exec/pipe, so create a temp file */
+  if( is_secured_filename ((*info)->tempfile_in) )
+    {
+      (*info)->tochild = NULL;
+      errno = EPERM;
+    }
+  else
+    (*info)->tochild=fopen((*info)->tempfile_in,binary?"wb":"w");
+  if((*info)->tochild==NULL)
+    {
+      log_error(_("can't create `%s': %s\n"),
+               (*info)->tempfile_in,strerror(errno));
+      ret=G10ERR_WRITE_FILE;
+      goto fail;
+    }
+
+  ret=0;
+
+ fail:
+  return ret;
+}
+
+int exec_read(struct exec_info *info)
+{
+  int ret=G10ERR_GENERAL;
+
+  fclose(info->tochild);
+  info->tochild=NULL;
+
+  if(info->flags.use_temp_files)
+    {
+      if(DBG_EXTPROG)
+       log_debug("system() command is %s\n",info->command);
+
+#if defined (_WIN32)
+      info->progreturn=win_system(info->command);
+#else
+      info->progreturn=system(info->command);
+#endif
+
+      if(info->progreturn==-1)
+       {
+         log_error(_("system error while calling external program: %s\n"),
+                   strerror(errno));
+         info->progreturn=127;
+         goto fail;
+       }
+
+#if defined(WIFEXITED) && defined(WEXITSTATUS)
+      if(WIFEXITED(info->progreturn))
+       info->progreturn=WEXITSTATUS(info->progreturn);
+      else
+       {
+         log_error(_("unnatural exit of external program\n"));
+         info->progreturn=127;
+         goto fail;
+       }
+#else
+      /* If we don't have the macros, do the best we can. */
+      info->progreturn = (info->progreturn & 0xff00) >> 8;
+#endif
+
+      /* 127 is the magic value returned from system() to indicate
+         that the shell could not be executed, or from /bin/sh to
+         indicate that the program could not be executed. */
+
+      if(info->progreturn==127)
+       {
+         log_error(_("unable to execute external program\n"));
+         goto fail;
+       }
+
+      if(!info->flags.writeonly)
+       {
+         info->fromchild=iobuf_open(info->tempfile_out);
+          if (info->fromchild
+              && is_secured_file (iobuf_get_fd (info->fromchild)))
+            {
+              iobuf_close (info->fromchild);
+              info->fromchild = NULL;
+              errno = EPERM;
+            }
+         if(info->fromchild==NULL)
+           {
+             log_error(_("unable to read external program response: %s\n"),
+                       strerror(errno));
+             ret=G10ERR_READ_FILE;
+             goto fail;
+           }
+
+         /* Do not cache this iobuf on close */
+         iobuf_ioctl(info->fromchild,3,1,NULL);
+       }
+    }
+
+  ret=0;
+
+ fail:
+  return ret;
+}
+
+int exec_finish(struct exec_info *info)
+{
+  int ret=info->progreturn;
+
+  if(info->fromchild)
+    iobuf_close(info->fromchild);
+
+  if(info->tochild)
+    fclose(info->tochild);
+
+#ifndef EXEC_TEMPFILE_ONLY
+  if(info->child>0)
+    {
+      if(waitpid(info->child,&info->progreturn,0)!=0 &&
+        WIFEXITED(info->progreturn))
+       ret=WEXITSTATUS(info->progreturn);
+      else
+       {
+         log_error(_("unnatural exit of external program\n"));
+         ret=127;
+       }
+    }
+#endif
+
+  if(info->flags.madedir && !info->flags.keep_temp_files)
+    {
+      if(info->tempfile_in)
+       {
+         if(unlink(info->tempfile_in)==-1)
+           log_info(_("WARNING: unable to remove tempfile (%s) `%s': %s\n"),
+                    "in",info->tempfile_in,strerror(errno));
+       }
+  
+      if(info->tempfile_out)
+       {
+         if(unlink(info->tempfile_out)==-1)
+           log_info(_("WARNING: unable to remove tempfile (%s) `%s': %s\n"),
+                    "out",info->tempfile_out,strerror(errno));
+       }
+
+      if(rmdir(info->tempdir)==-1)
+       log_info(_("WARNING: unable to remove temp directory `%s': %s\n"),
+                info->tempdir,strerror(errno));
+    }
+
+  xfree(info->command);
+  xfree(info->name);
+  xfree(info->tempdir);
+  xfree(info->tempfile_in);
+  xfree(info->tempfile_out);
+  xfree(info);
+
+  return ret;
+}
+#endif /* ! NO_EXEC */
diff --git a/g10/exec.h b/g10/exec.h
new file mode 100644 (file)
index 0000000..b4a6f0e
--- /dev/null
@@ -0,0 +1,52 @@
+/* exec.h
+ * Copyright (C) 2001, 2002, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef _EXEC_H_
+#define _EXEC_H_
+
+#include <unistd.h>
+#include <stdio.h>
+#include "iobuf.h"
+
+struct exec_info
+{
+  int progreturn;
+  struct
+  {
+    unsigned int binary:1;
+    unsigned int writeonly:1;
+    unsigned int madedir:1;
+    unsigned int use_temp_files:1;
+    unsigned int keep_temp_files:1;
+  } flags;
+  pid_t child;
+  FILE *tochild;
+  IOBUF fromchild;
+  char *command,*name,*tempdir,*tempfile_in,*tempfile_out;
+};
+
+int exec_write(struct exec_info **info,const char *program,
+              const char *args_in,const char *name,int writeonly,int binary);
+int exec_read(struct exec_info *info);
+int exec_finish(struct exec_info *info);
+int set_exec_path(const char *path);
+
+#endif /* !_EXEC_H_ */
diff --git a/g10/export.c b/g10/export.c
new file mode 100644 (file)
index 0000000..626b7d0
--- /dev/null
@@ -0,0 +1,600 @@
+/* export.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "i18n.h"
+#include "trustdb.h"
+
+
+/* An object to keep track of subkeys. */
+struct subkey_list_s
+{
+  struct subkey_list_s *next;
+  u32 kid[2];
+};
+typedef struct subkey_list_s *subkey_list_t;
+
+
+static int do_export( STRLIST users, int secret, unsigned int options );
+static int do_export_stream( IOBUF out, STRLIST users, int secret,
+                            KBNODE *keyblock_out, unsigned int options,
+                            int *any );
+
+int
+parse_export_options(char *str,unsigned int *options,int noisy)
+{
+  struct parse_options export_opts[]=
+    {
+      {"export-local-sigs",EXPORT_LOCAL_SIGS,NULL,
+       N_("export signatures that are marked as local-only")},
+      {"export-attributes",EXPORT_ATTRIBUTES,NULL,
+       N_("export attribute user IDs (generally photo IDs)")},
+      {"export-sensitive-revkeys",EXPORT_SENSITIVE_REVKEYS,NULL,
+       N_("export revocation keys marked as \"sensitive\"")},
+      {"export-reset-subkey-passwd",EXPORT_RESET_SUBKEY_PASSWD,NULL,
+       N_("remove the passphrase from exported subkeys")},
+      {"export-clean",EXPORT_CLEAN,NULL,
+       N_("remove unusable parts from key during export")},
+      {"export-minimal",EXPORT_MINIMAL|EXPORT_CLEAN,NULL,
+       N_("remove as much as possible from key during export")},
+      /* Aliases for backward compatibility */
+      {"include-local-sigs",EXPORT_LOCAL_SIGS,NULL,NULL},
+      {"include-attributes",EXPORT_ATTRIBUTES,NULL,NULL},
+      {"include-sensitive-revkeys",EXPORT_SENSITIVE_REVKEYS,NULL,NULL},
+      /* dummy */
+      {"export-unusable-sigs",0,NULL,NULL},
+      {"export-clean-sigs",0,NULL,NULL},
+      {"export-clean-uids",0,NULL,NULL},
+      {NULL,0,NULL,NULL}
+      /* add tags for include revoked and disabled? */
+    };
+
+  return parse_options(str,options,export_opts,noisy);
+}
+
+
+/****************
+ * Export the public keys (to standard out or --output).
+ * Depending on opt.armor the output is armored.
+ * options are defined in main.h.
+ * If USERS is NULL, the complete ring will be exported.  */
+int
+export_pubkeys( STRLIST users, unsigned int options )
+{
+    return do_export( users, 0, options );
+}
+
+/****************
+ * Export to an already opened stream; return -1 if no keys have
+ * been exported
+ */
+int
+export_pubkeys_stream( IOBUF out, STRLIST users,
+                      KBNODE *keyblock_out, unsigned int options )
+{
+    int any, rc;
+
+    rc = do_export_stream( out, users, 0, keyblock_out, options, &any );
+    if( !rc && !any )
+       rc = -1;
+    return rc;
+}
+
+int
+export_seckeys( STRLIST users )
+{
+    return do_export( users, 1, 0 );
+}
+
+int
+export_secsubkeys( STRLIST users )
+{
+    return do_export( users, 2, 0 );
+}
+
+static int
+do_export( STRLIST users, int secret, unsigned int options )
+{
+    IOBUF out = NULL;
+    int any, rc;
+    armor_filter_context_t afx;
+    compress_filter_context_t zfx;
+
+    memset( &afx, 0, sizeof afx);
+    memset( &zfx, 0, sizeof zfx);
+
+    rc = open_outfile( NULL, 0, &out );
+    if( rc )
+       return rc;
+
+    if( opt.armor ) {
+       afx.what = secret?5:1;
+       iobuf_push_filter( out, armor_filter, &afx );
+    }
+    if( opt.compress_keys )
+      push_compress_filter(out,&zfx,default_compress_algo());
+
+    rc = do_export_stream( out, users, secret, NULL, options, &any );
+    if( rc || !any )
+       iobuf_cancel(out);
+    else
+       iobuf_close(out);
+    return rc;
+}
+
+
+
+/* Release an entire subkey list. */
+static void
+release_subkey_list (subkey_list_t list)
+{
+  while (list)
+    {
+      subkey_list_t tmp = list->next;;
+      xfree (list);
+      list = tmp;
+    }
+}
+
+
+/* Returns true if NODE is a subkey and contained in LIST. */
+static int
+subkey_in_list_p (subkey_list_t list, KBNODE node)
+{
+  if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+      || node->pkt->pkttype == PKT_SECRET_SUBKEY )
+    {
+      u32 kid[2];
+
+      if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        keyid_from_pk (node->pkt->pkt.public_key, kid);
+      else
+        keyid_from_sk (node->pkt->pkt.secret_key, kid);
+      
+      for (; list; list = list->next)
+        if (list->kid[0] == kid[0] && list->kid[1] == kid[1])
+          return 1;
+    }
+  return 0;
+}
+
+/* Allocate a new subkey list item from NODE. */
+static subkey_list_t
+new_subkey_list_item (KBNODE node)
+{
+  subkey_list_t list = xcalloc (1, sizeof *list);
+
+  if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+    keyid_from_pk (node->pkt->pkt.public_key, list->kid);
+  else if (node->pkt->pkttype == PKT_SECRET_SUBKEY)
+    keyid_from_sk (node->pkt->pkt.secret_key, list->kid);
+
+  return list;
+}
+
+
+/* Helper function to check whether the subkey at NODE actually
+   matches the description at DESC.  The function returns true if the
+   key under question has been specified by an exact specification
+   (keyID or fingerprint) and does match the one at NODE.  It is
+   assumed that the packet at NODE is either a public or secret
+   subkey. */
+static int
+exact_subkey_match_p (KEYDB_SEARCH_DESC *desc, KBNODE node)
+{
+  u32 kid[2];
+  byte fpr[MAX_FINGERPRINT_LEN];
+  size_t fprlen;
+  int result = 0;
+
+  switch(desc->mode)
+    {
+    case KEYDB_SEARCH_MODE_SHORT_KID:
+    case KEYDB_SEARCH_MODE_LONG_KID:
+      if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        keyid_from_pk (node->pkt->pkt.public_key, kid);
+      else
+        keyid_from_sk (node->pkt->pkt.secret_key, kid);
+      break;
+      
+    case KEYDB_SEARCH_MODE_FPR16:
+    case KEYDB_SEARCH_MODE_FPR20:
+    case KEYDB_SEARCH_MODE_FPR:
+      if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        fingerprint_from_pk (node->pkt->pkt.public_key, fpr,&fprlen);
+      else
+        fingerprint_from_sk (node->pkt->pkt.secret_key, fpr,&fprlen);
+      break;
+      
+    default:
+      break;
+    }
+  
+  switch(desc->mode)
+    {
+    case KEYDB_SEARCH_MODE_SHORT_KID:
+      if (desc->u.kid[1] == kid[1])
+        result = 1;
+      break;
+
+    case KEYDB_SEARCH_MODE_LONG_KID:
+      if (desc->u.kid[0] == kid[0] && desc->u.kid[1] == kid[1])
+        result = 1;
+      break;
+
+    case KEYDB_SEARCH_MODE_FPR16:
+      if (!memcmp (desc->u.fpr, fpr, 16))
+        result = 1;
+      break;
+
+    case KEYDB_SEARCH_MODE_FPR20:
+    case KEYDB_SEARCH_MODE_FPR:
+      if (!memcmp (desc->u.fpr, fpr, 20))
+        result = 1;
+      break;
+
+    default:
+      break;
+    }
+
+  return result;
+}
+
+
+/* If keyblock_out is non-NULL, AND the exit code is zero, then it
+   contains a pointer to the first keyblock found and exported.  No
+   other keyblocks are exported.  The caller must free it. */
+static int
+do_export_stream( IOBUF out, STRLIST users, int secret,
+                 KBNODE *keyblock_out, unsigned int options, int *any )
+{
+    int rc = 0;
+    PACKET pkt;
+    KBNODE keyblock = NULL;
+    KBNODE kbctx, node;
+    size_t ndesc, descindex;
+    KEYDB_SEARCH_DESC *desc = NULL;
+    subkey_list_t subkey_list = NULL;  /* Track alreay processed subkeys. */
+    KEYDB_HANDLE kdbhd;
+    STRLIST sl;
+
+    *any = 0;
+    init_packet( &pkt );
+    kdbhd = keydb_new (secret);
+
+    if (!users) {
+        ndesc = 1;
+        desc = xcalloc ( ndesc, sizeof *desc );
+        desc[0].mode = KEYDB_SEARCH_MODE_FIRST;
+    }
+    else {
+        for (ndesc=0, sl=users; sl; sl = sl->next, ndesc++) 
+            ;
+        desc = xmalloc ( ndesc * sizeof *desc);
+        
+        for (ndesc=0, sl=users; sl; sl = sl->next) {
+           if (classify_user_id (sl->d, desc+ndesc))
+                ndesc++;
+            else
+                log_error (_("key \"%s\" not found: %s\n"),
+                           sl->d, g10_errstr (G10ERR_INV_USER_ID));
+        }
+
+        /* It would be nice to see which of the given users did
+           actually match one in the keyring.  To implement this we
+           need to have a found flag for each entry in desc and to set
+           this we must check all those entries after a match to mark
+           all matched one - currently we stop at the first match.  To
+           do this we need an extra flag to enable this feature so */
+    }
+
+#ifdef ENABLE_SELINUX_HACKS
+    if (secret) {
+        log_error (_("exporting secret keys not allowed\n"));
+        rc = G10ERR_GENERAL;
+        goto leave;
+    }
+#endif
+
+    while (!(rc = keydb_search2 (kdbhd, desc, ndesc, &descindex))) {
+        int sha1_warned=0,skip_until_subkey=0;
+       u32 sk_keyid[2];
+
+       if (!users) 
+            desc[0].mode = KEYDB_SEARCH_MODE_NEXT;
+
+        /* Read the keyblock. */
+        rc = keydb_get_keyblock (kdbhd, &keyblock );
+       if( rc ) {
+            log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+           goto leave;
+       }
+
+       if((node=find_kbnode(keyblock,PKT_SECRET_KEY)))
+         {
+           PKT_secret_key *sk=node->pkt->pkt.secret_key;
+
+           keyid_from_sk(sk,sk_keyid);
+
+           /* We can't apply GNU mode 1001 on an unprotected key. */
+           if( secret == 2 && !sk->is_protected )
+             {
+               log_info(_("key %s: not protected - skipped\n"),
+                        keystr(sk_keyid));
+               continue;
+             }
+
+           /* No v3 keys with GNU mode 1001. */
+           if( secret == 2 && sk->version == 3 )
+             {
+               log_info(_("key %s: PGP 2.x style key - skipped\n"),
+                        keystr(sk_keyid));
+               continue;
+             }
+
+            /* It does not make sense to export a key with a primary
+               key on card using a non-key stub.  We simply skip those
+               keys when used with --export-secret-subkeys. */
+            if (secret == 2 && sk->is_protected
+                && sk->protect.s2k.mode == 1002 ) 
+              {
+               log_info(_("key %s: key material on-card - skipped\n"),
+                        keystr(sk_keyid));
+               continue;
+              }
+         }
+       else
+         {
+           /* It's a public key export, so do the cleaning if
+              requested.  Note that both export-clean and
+              export-minimal only apply to UID sigs (0x10, 0x11,
+              0x12, and 0x13).  A designated revocation is never
+              stripped, even with export-minimal set. */
+
+           if(options&EXPORT_CLEAN)
+             clean_key(keyblock,opt.verbose,options&EXPORT_MINIMAL,NULL,NULL);
+         }
+
+       /* And write it. */
+       for( kbctx=NULL; (node = walk_kbnode( keyblock, &kbctx, 0 )); ) {
+           if( skip_until_subkey )
+             {
+               if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY
+                  || node->pkt->pkttype==PKT_SECRET_SUBKEY)
+                 skip_until_subkey=0;
+               else
+                 continue;
+             }
+
+           /* We used to use comment packets, but not any longer.  In
+              case we still have comments on a key, strip them here
+              before we call build_packet(). */
+           if( node->pkt->pkttype == PKT_COMMENT )
+             continue;
+
+            /* Make sure that ring_trust packets never get exported. */
+            if (node->pkt->pkttype == PKT_RING_TRUST)
+              continue;
+
+           /* If exact is set, then we only export what was requested
+              (plus the primary key, if the user didn't specifically
+              request it). */
+           if(desc[descindex].exact
+              && (node->pkt->pkttype==PKT_PUBLIC_SUBKEY
+                  || node->pkt->pkttype==PKT_SECRET_SUBKEY))
+             {
+                if (!exact_subkey_match_p (desc+descindex, node))
+                  {
+                    /* Before skipping this subkey, check whether any
+                       other description wants an exact match on a
+                       subkey and include that subkey into the output
+                       too.  Need to add this subkey to a list so that
+                       it won't get processed a second time.
+                   
+                       So the first step here is to check that list and
+                       skip in any case if the key is in that list.
+
+                       We need this whole mess because the import
+                       function is not able to merge secret keys and
+                       thus it is useless to output them as two
+                       separate keys and have import merge them.  */
+                    if (subkey_in_list_p (subkey_list, node))  
+                      skip_until_subkey = 1; /* Already processed this one. */
+                    else
+                      {
+                        size_t j;
+
+                        for (j=0; j < ndesc; j++)
+                          if (j != descindex && desc[j].exact
+                              && exact_subkey_match_p (desc+j, node))
+                            break;
+                        if (!(j < ndesc))
+                          skip_until_subkey = 1; /* No other one matching. */ 
+                      }
+                  }
+
+               if(skip_until_subkey)
+                 continue;
+
+                /* Mark this one as processed. */
+                {
+                  subkey_list_t tmp = new_subkey_list_item (node);
+                  tmp->next = subkey_list;
+                  subkey_list = tmp;
+                }
+             }
+
+           if(node->pkt->pkttype==PKT_SIGNATURE)
+             {
+               /* do not export packets which are marked as not
+                  exportable */
+               if(!(options&EXPORT_LOCAL_SIGS)
+                  && !node->pkt->pkt.signature->flags.exportable)
+                 continue; /* not exportable */
+
+               /* Do not export packets with a "sensitive" revocation
+                  key unless the user wants us to.  Note that we do
+                  export these when issuing the actual revocation
+                  (see revoke.c). */
+               if(!(options&EXPORT_SENSITIVE_REVKEYS)
+                  && node->pkt->pkt.signature->revkey)
+                 {
+                   int i;
+
+                   for(i=0;i<node->pkt->pkt.signature->numrevkeys;i++)
+                     if(node->pkt->pkt.signature->revkey[i]->class & 0x40)
+                       break;
+
+                   if(i<node->pkt->pkt.signature->numrevkeys)
+                     continue;
+                 }
+             }
+
+           /* Don't export attribs? */
+           if( !(options&EXPORT_ATTRIBUTES) &&
+               node->pkt->pkttype == PKT_USER_ID &&
+               node->pkt->pkt.user_id->attrib_data ) {
+             /* Skip until we get to something that is not an attrib
+                or a signature on an attrib */
+             while(kbctx->next && kbctx->next->pkt->pkttype==PKT_SIGNATURE) {
+               kbctx=kbctx->next;
+             }
+             continue;
+           }
+
+           if( secret == 2 && node->pkt->pkttype == PKT_SECRET_KEY )
+             {
+               /* We don't want to export the secret parts of the
+                * primary key, this is done by using GNU protection mode 1001
+                */
+               int save_mode = node->pkt->pkt.secret_key->protect.s2k.mode;
+               node->pkt->pkt.secret_key->protect.s2k.mode = 1001;
+               rc = build_packet( out, node->pkt );
+               node->pkt->pkt.secret_key->protect.s2k.mode = save_mode;
+             }
+           else if (secret == 2 && node->pkt->pkttype == PKT_SECRET_SUBKEY
+                     && (opt.export_options&EXPORT_RESET_SUBKEY_PASSWD))
+              {
+                /* If the subkey is protected reset the passphrase to
+                   export an unprotected subkey.  This feature is
+                   useful in cases of a subkey copied to an unattended
+                   machine where a passphrase is not required. */
+                PKT_secret_key *sk_save, *sk;
+
+                sk_save = node->pkt->pkt.secret_key;
+                sk = copy_secret_key (NULL, sk_save);
+                node->pkt->pkt.secret_key = sk;
+
+                log_info (_("about to export an unprotected subkey\n"));
+                switch (is_secret_key_protected (sk))
+                  {
+                  case -1:
+                    rc = G10ERR_PUBKEY_ALGO;
+                    break;
+                  case 0:
+                    break;
+                  default:
+                    if (sk->protect.s2k.mode == 1001)
+                      ; /* No secret parts. */
+                    else if( sk->protect.s2k.mode == 1002 ) 
+                      ; /* Card key stub. */
+                    else 
+                      {
+                        rc = check_secret_key( sk, 0 );
+                      }
+                    break;
+                  }
+                if (rc)
+                  {
+                    node->pkt->pkt.secret_key = sk_save;
+                    free_secret_key (sk);
+                    log_error (_("failed to unprotect the subkey: %s\n"),
+                               g10_errstr (rc));
+                    goto leave;
+                  }
+
+               rc = build_packet (out, node->pkt);
+
+                node->pkt->pkt.secret_key = sk_save;
+                free_secret_key (sk);
+              }
+           else
+             {
+               /* Warn the user if the secret key or any of the secret
+                  subkeys are protected with SHA1 and we have
+                  simple_sk_checksum set. */
+               if(!sha1_warned && opt.simple_sk_checksum &&
+                  (node->pkt->pkttype==PKT_SECRET_KEY ||
+                   node->pkt->pkttype==PKT_SECRET_SUBKEY) &&
+                  node->pkt->pkt.secret_key->protect.sha1chk)
+                 {
+                   /* I hope this warning doesn't confuse people. */
+                   log_info(_("WARNING: secret key %s does not have a "
+                              "simple SK checksum\n"),keystr(sk_keyid));
+
+                   sha1_warned=1;
+                 }
+
+               rc = build_packet( out, node->pkt );
+             }
+
+           if( rc ) {
+               log_error("build_packet(%d) failed: %s\n",
+                           node->pkt->pkttype, g10_errstr(rc) );
+               rc = G10ERR_WRITE_FILE;
+               goto leave;
+           }
+       }
+       ++*any;
+       if(keyblock_out)
+         {
+           *keyblock_out=keyblock;
+           break;
+         }
+    }
+    if( rc == -1 )
+       rc = 0;
+
+  leave:
+    release_subkey_list (subkey_list);
+    xfree(desc);
+    keydb_release (kdbhd);
+    if(rc || keyblock_out==NULL)
+      release_kbnode( keyblock );
+    if( !*any )
+       log_info(_("WARNING: nothing exported\n"));
+    return rc;
+}
diff --git a/g10/filter.h b/g10/filter.h
new file mode 100644 (file)
index 0000000..c9fe872
--- /dev/null
@@ -0,0 +1,167 @@
+/* filter.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_FILTER_H
+#define G10_FILTER_H
+
+#include "types.h"
+#include "cipher.h"
+
+typedef struct {
+    MD_HANDLE md;      /* catch all */
+    MD_HANDLE md2;     /* if we want to calculate an alternate hash */
+    size_t maxbuf_size;
+} md_filter_context_t;
+
+typedef struct {
+    int refcount;           /* Reference counter.  If 0 this structure
+                               is not allocated on the heap. */
+
+    /* these fields may be initialized */
+    int what;              /* what kind of armor headers to write */
+    int only_keyblocks;     /* skip all headers but ".... key block" */
+    const char *hdrlines;   /* write these headerlines */
+
+    /* these fileds must be initialized to zero */
+    int no_openpgp_data;    /* output flag: "No valid OpenPGP data found" */
+
+    /* the following fields must be initialized to zero */
+    int inp_checked;       /* set if the input has been checked */
+    int inp_bypass;        /* set if the input is not armored */
+    int in_cleartext;      /* clear text message */
+    int not_dash_escaped;   /* clear text is not dash escaped */
+    int hashes;            /* detected hash algorithms */
+    int faked;             /* we are faking a literal data packet */
+    int truncated;         /* number of truncated lines */
+    int qp_detected;
+    int pgp2mode;
+    byte eol[3];            /* The end of line characters as a
+                              zero-terminated string.  Defaults
+                              (eol[0]=='\0') to whatever the local
+                              platform uses. */
+
+    byte *buffer;          /* malloced buffer */
+    unsigned buffer_size;   /* and size of this buffer */
+    unsigned buffer_len;    /* used length of the buffer */
+    unsigned buffer_pos;    /* read position */
+
+    byte radbuf[4];
+    int idx, idx2;
+    u32 crc;
+
+    int status;            /* an internal state flag */
+    int cancel;
+    int any_data;          /* any valid armored data seen */
+    int pending_lf;        /* used together with faked */
+} armor_filter_context_t;
+
+struct unarmor_pump_s;
+typedef struct unarmor_pump_s *UnarmorPump;
+
+
+struct compress_filter_context_s {
+    int status;
+    void *opaque;   /* (used for z_stream) */
+    byte *inbuf;
+    unsigned inbufsize;
+    byte *outbuf;
+    unsigned outbufsize;
+    int algo;   /* compress algo */
+    int algo1hack;
+    int new_ctb;
+    void (*release)(struct compress_filter_context_s*);
+};
+typedef struct compress_filter_context_s compress_filter_context_t;
+
+
+typedef struct {
+    DEK *dek;
+    u32 datalen;
+    CIPHER_HANDLE cipher_hd;
+    int header;
+    MD_HANDLE mdc_hash;
+    byte enchash[20];
+    int create_mdc; /* flag will be set by the cipher filter */
+} cipher_filter_context_t;
+
+
+
+typedef struct {
+    byte *buffer;          /* malloced buffer */
+    unsigned buffer_size;   /* and size of this buffer */
+    unsigned buffer_len;    /* used length of the buffer */
+    unsigned buffer_pos;    /* read position */
+    int truncated;         /* number of truncated lines */
+    int not_dash_escaped;
+    int escape_from;
+    MD_HANDLE md;
+    int pending_lf;
+    int pending_esc;
+} text_filter_context_t;
+
+
+typedef struct {
+    char *what;                        /* description */
+    u32 last_time;             /* last time reported */
+    unsigned long last;                /* last amount reported */
+    unsigned long offset;      /* current amount */
+    unsigned long total;       /* total amount */
+} progress_filter_context_t;
+
+/* encrypt_filter_context_t defined in main.h */
+
+/*-- mdfilter.c --*/
+int md_filter( void *opaque, int control, IOBUF a, byte *buf, size_t *ret_len);
+void free_md_filter_context( md_filter_context_t *mfx );
+
+/*-- armor.c --*/
+armor_filter_context_t *new_armor_context (void);
+void release_armor_context (armor_filter_context_t *afx);
+int push_armor_filter (armor_filter_context_t *afx, IOBUF iobuf);
+int use_armor_filter( IOBUF a );
+int armor_filter( void *opaque, int control,
+                 IOBUF chain, byte *buf, size_t *ret_len);
+UnarmorPump unarmor_pump_new (void);
+void        unarmor_pump_release (UnarmorPump x);
+int         unarmor_pump (UnarmorPump x, int c);
+
+/*-- compress.c --*/
+void push_compress_filter(IOBUF out,compress_filter_context_t *zfx,int algo);
+void push_compress_filter2(IOBUF out,compress_filter_context_t *zfx,
+                          int algo,int rel);
+
+/*-- cipher.c --*/
+int cipher_filter( void *opaque, int control,
+                  IOBUF chain, byte *buf, size_t *ret_len);
+
+/*-- textfilter.c --*/
+int text_filter( void *opaque, int control,
+                IOBUF chain, byte *buf, size_t *ret_len);
+int copy_clearsig_text( IOBUF out, IOBUF inp, MD_HANDLE md,
+                         int escape_dash, int escape_from, int pgp2mode );
+
+/*-- progress.c --*/
+int progress_filter (void *opaque, int control,
+                    IOBUF a, byte *buf, size_t *ret_len);
+void handle_progress (progress_filter_context_t *pfx,
+                     IOBUF inp, const char *name);
+
+#endif /*G10_FILTER_H*/
diff --git a/g10/free-packet.c b/g10/free-packet.c
new file mode 100644 (file)
index 0000000..be49bb5
--- /dev/null
@@ -0,0 +1,569 @@
+/* free-packet.c - cleanup stuff for packets
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "packet.h"
+#include "iobuf.h"
+#include "mpi.h"
+#include "util.h"
+#include "cipher.h"
+#include "memory.h"
+#include "options.h"
+
+void
+free_symkey_enc( PKT_symkey_enc *enc )
+{
+    xfree(enc);
+}
+
+void
+free_pubkey_enc( PKT_pubkey_enc *enc )
+{
+    int n, i;
+    n = pubkey_get_nenc( enc->pubkey_algo );
+    if( !n )
+       mpi_free(enc->data[0]);
+    for(i=0; i < n; i++ )
+       mpi_free( enc->data[i] );
+    xfree(enc);
+}
+
+void
+free_seckey_enc( PKT_signature *sig )
+{
+  int n, i;
+
+  n = pubkey_get_nsig( sig->pubkey_algo );
+  if( !n )
+    mpi_free(sig->data[0]);
+  for(i=0; i < n; i++ )
+    mpi_free( sig->data[i] );
+
+  xfree(sig->revkey);
+  xfree(sig->hashed);
+  xfree(sig->unhashed);
+
+  if (sig->pka_info)
+    {
+      xfree (sig->pka_info->uri);
+      xfree (sig->pka_info);
+    }
+
+  xfree(sig);
+}
+
+
+void
+release_public_key_parts( PKT_public_key *pk )
+{
+    int n, i;
+    n = pubkey_get_npkey( pk->pubkey_algo );
+    if( !n )
+       mpi_free(pk->pkey[0]);
+    for(i=0; i < n; i++ ) {
+       mpi_free( pk->pkey[i] );
+       pk->pkey[i] = NULL;
+    }
+    if (pk->prefs) {
+        xfree (pk->prefs);
+        pk->prefs = NULL;
+    }
+    if (pk->user_id) {
+        free_user_id (pk->user_id);
+        pk->user_id = NULL;
+    }
+    if (pk->revkey) {
+        xfree(pk->revkey);
+       pk->revkey=NULL;
+       pk->numrevkeys=0;
+    }
+}
+
+
+void
+free_public_key( PKT_public_key *pk )
+{
+    release_public_key_parts( pk );
+    xfree(pk);
+}
+
+
+static subpktarea_t *
+cp_subpktarea (subpktarea_t *s )
+{
+    subpktarea_t *d;
+
+    if( !s )
+       return NULL;
+    d = xmalloc (sizeof (*d) + s->size - 1 );
+    d->size = s->size;
+    d->len = s->len;
+    memcpy (d->data, s->data, s->len);
+    return d;
+}
+
+/*
+ * Return a copy of the preferences 
+ */
+prefitem_t *
+copy_prefs (const prefitem_t *prefs)
+{
+    size_t n;
+    prefitem_t *new;
+
+    if (!prefs)
+        return NULL;
+    
+    for (n=0; prefs[n].type; n++)
+        ;
+    new = xmalloc ( sizeof (*new) * (n+1));
+    for (n=0; prefs[n].type; n++) {
+        new[n].type = prefs[n].type;
+        new[n].value = prefs[n].value;
+    }
+    new[n].type = PREFTYPE_NONE;
+    new[n].value = 0;
+
+    return new;
+}
+
+
+PKT_public_key *
+copy_public_key ( PKT_public_key *d, PKT_public_key *s)
+{
+    int n, i;
+
+    if( !d )
+       d = xmalloc(sizeof *d);
+    memcpy( d, s, sizeof *d );
+    d->user_id = scopy_user_id (s->user_id);
+    d->prefs = copy_prefs (s->prefs);
+    n = pubkey_get_npkey( s->pubkey_algo );
+    if( !n )
+       d->pkey[0] = mpi_copy(s->pkey[0]);
+    else {
+       for(i=0; i < n; i++ )
+           d->pkey[i] = mpi_copy( s->pkey[i] );
+    }
+    if( !s->revkey && s->numrevkeys )
+        BUG();
+    if( s->numrevkeys ) {
+        d->revkey = xmalloc(sizeof(struct revocation_key)*s->numrevkeys);
+        memcpy(d->revkey,s->revkey,sizeof(struct revocation_key)*s->numrevkeys);
+    }
+    else
+        d->revkey = NULL;
+    return d;
+}
+
+/****************
+ * Replace all common parts of a sk by the one from the public key.
+ * This is a hack and a better solution will be to just store the real secret
+ * parts somewhere and don't duplicate all the other stuff.
+ */
+void
+copy_public_parts_to_secret_key( PKT_public_key *pk, PKT_secret_key *sk )
+{
+    sk->expiredate  = pk->expiredate;     
+    sk->pubkey_algo = pk->pubkey_algo;    
+    sk->pubkey_usage= pk->pubkey_usage;
+    sk->req_usage   = pk->req_usage;
+    sk->req_algo    = pk->req_algo;
+    sk->has_expired = pk->has_expired;    
+    sk->is_revoked  = pk->is_revoked;     
+    sk->is_valid    = pk->is_valid;    
+    sk->main_keyid[0]= pk->main_keyid[0];
+    sk->main_keyid[1]= pk->main_keyid[1];
+    sk->keyid[0]    = pk->keyid[0];
+    sk->keyid[1]    = pk->keyid[1];
+}
+
+
+static pka_info_t *
+cp_pka_info (const pka_info_t *s)
+{
+  pka_info_t *d = xmalloc (sizeof *s + strlen (s->email));
+  
+  d->valid = s->valid;
+  d->checked = s->checked;
+  d->uri = s->uri? xstrdup (s->uri):NULL;
+  memcpy (d->fpr, s->fpr, sizeof s->fpr);
+  strcpy (d->email, s->email);
+  return d;
+}
+
+
+PKT_signature *
+copy_signature( PKT_signature *d, PKT_signature *s )
+{
+    int n, i;
+
+    if( !d )
+       d = xmalloc(sizeof *d);
+    memcpy( d, s, sizeof *d );
+    n = pubkey_get_nsig( s->pubkey_algo );
+    if( !n )
+       d->data[0] = mpi_copy(s->data[0]);
+    else {
+       for(i=0; i < n; i++ )
+           d->data[i] = mpi_copy( s->data[i] );
+    }
+    d->pka_info = s->pka_info? cp_pka_info (s->pka_info) : NULL;
+    d->hashed = cp_subpktarea (s->hashed);
+    d->unhashed = cp_subpktarea (s->unhashed);
+    if(s->numrevkeys)
+      {
+       d->revkey=NULL;
+       d->numrevkeys=0;
+       parse_revkeys(d);
+      }
+    return d;
+}
+
+
+/*
+ * shallow copy of the user ID
+ */
+PKT_user_id *
+scopy_user_id (PKT_user_id *s)
+{
+    if (s)
+        s->ref++;
+    return s;
+}
+
+
+
+void
+release_secret_key_parts( PKT_secret_key *sk )
+{
+    int n, i;
+
+    n = pubkey_get_nskey( sk->pubkey_algo );
+    if( !n )
+       mpi_free(sk->skey[0]);
+    for(i=0; i < n; i++ ) {
+       mpi_free( sk->skey[i] );
+       sk->skey[i] = NULL;
+    }
+}
+
+void
+free_secret_key( PKT_secret_key *sk )
+{
+    release_secret_key_parts( sk );
+    xfree(sk);
+}
+
+PKT_secret_key *
+copy_secret_key( PKT_secret_key *d, PKT_secret_key *s )
+{
+    int n, i;
+
+    if( !d )
+       d = xmalloc_secure(sizeof *d);
+    else
+        release_secret_key_parts (d);
+    memcpy( d, s, sizeof *d );
+    n = pubkey_get_nskey( s->pubkey_algo );
+    if( !n )
+       d->skey[0] = mpi_copy(s->skey[0]);
+    else {
+       for(i=0; i < n; i++ )
+           d->skey[i] = mpi_copy( s->skey[i] );
+    }
+
+    return d;
+}
+
+void
+free_comment( PKT_comment *rem )
+{
+    xfree(rem);
+}
+
+void
+free_attributes(PKT_user_id *uid)
+{
+  xfree(uid->attribs);
+  xfree(uid->attrib_data);
+
+  uid->attribs=NULL;
+  uid->attrib_data=NULL;
+  uid->attrib_len=0;
+}
+
+void
+free_user_id (PKT_user_id *uid)
+{
+    assert (uid->ref > 0);
+    if (--uid->ref)
+        return;
+
+    free_attributes(uid);
+    xfree (uid->prefs);
+    xfree (uid->namehash);
+    xfree (uid);
+}
+
+void
+free_compressed( PKT_compressed *zd )
+{
+    if( zd->buf ) { /* have to skip some bytes */
+       /* don't have any information about the length, so
+        * we assume this is the last packet */
+       while( iobuf_read( zd->buf, NULL, 1<<30 ) != -1 )
+           ;
+    }
+    xfree(zd);
+}
+
+void
+free_encrypted( PKT_encrypted *ed )
+{
+    if( ed->buf ) { /* have to skip some bytes */
+       if( ed->is_partial ) {
+           while( iobuf_read( ed->buf, NULL, 1<<30 ) != -1 )
+               ;
+       }
+       else {
+          while( ed->len ) { /* skip the packet */
+              int n = iobuf_read( ed->buf, NULL, ed->len );
+              if( n == -1 )
+                  ed->len = 0;
+              else
+                  ed->len -= n;
+          }
+       }
+    }
+    xfree(ed);
+}
+
+
+void
+free_plaintext( PKT_plaintext *pt )
+{
+    if( pt->buf ) { /* have to skip some bytes */
+       if( pt->is_partial ) {
+           while( iobuf_read( pt->buf, NULL, 1<<30 ) != -1 )
+               ;
+       }
+       else {
+          while( pt->len ) { /* skip the packet */
+              int n = iobuf_read( pt->buf, NULL, pt->len );
+              if( n == -1 )
+                  pt->len = 0;
+              else
+                  pt->len -= n;
+          }
+       }
+    }
+    xfree(pt);
+}
+
+/****************
+ * Free the packet in pkt.
+ */
+void
+free_packet( PACKET *pkt )
+{
+    if( !pkt || !pkt->pkt.generic )
+       return;
+
+    if( DBG_MEMORY )
+       log_debug("free_packet() type=%d\n", pkt->pkttype );
+
+    switch( pkt->pkttype ) {
+      case PKT_SIGNATURE:
+       free_seckey_enc( pkt->pkt.signature );
+       break;
+      case PKT_PUBKEY_ENC:
+       free_pubkey_enc( pkt->pkt.pubkey_enc );
+       break;
+      case PKT_SYMKEY_ENC:
+       free_symkey_enc( pkt->pkt.symkey_enc );
+       break;
+      case PKT_PUBLIC_KEY:
+      case PKT_PUBLIC_SUBKEY:
+       free_public_key( pkt->pkt.public_key );
+       break;
+      case PKT_SECRET_KEY:
+      case PKT_SECRET_SUBKEY:
+       free_secret_key( pkt->pkt.secret_key );
+       break;
+      case PKT_COMMENT:
+       free_comment( pkt->pkt.comment );
+       break;
+      case PKT_USER_ID:
+       free_user_id( pkt->pkt.user_id );
+       break;
+      case PKT_COMPRESSED:
+       free_compressed( pkt->pkt.compressed);
+       break;
+      case PKT_ENCRYPTED:
+      case PKT_ENCRYPTED_MDC:
+       free_encrypted( pkt->pkt.encrypted );
+       break;
+      case PKT_PLAINTEXT:
+       free_plaintext( pkt->pkt.plaintext );
+       break;
+      default:
+       xfree( pkt->pkt.generic );
+       break;
+    }
+    pkt->pkt.generic = NULL;
+}
+
+/****************
+ * returns 0 if they match.
+ */
+int
+cmp_public_keys( PKT_public_key *a, PKT_public_key *b )
+{
+    int n, i;
+
+    if( a->timestamp != b->timestamp )
+       return -1;
+    if( a->version < 4 && a->expiredate != b->expiredate )
+       return -1;
+    if( a->pubkey_algo != b->pubkey_algo )
+       return -1;
+
+    n = pubkey_get_npkey( b->pubkey_algo );
+    if( !n )
+       return -1; /* can't compare due to unknown algorithm */
+    for(i=0; i < n; i++ ) {
+       if( mpi_cmp( a->pkey[i], b->pkey[i] ) )
+           return -1;
+    }
+
+    return 0;
+}
+
+/****************
+ * Returns 0 if they match.
+ * We only compare the public parts.
+ */
+int
+cmp_secret_keys( PKT_secret_key *a, PKT_secret_key *b )
+{
+    int n, i;
+
+    if( a->timestamp != b->timestamp )
+       return -1;
+    if( a->version < 4 && a->expiredate != b->expiredate )
+       return -1;
+    if( a->pubkey_algo != b->pubkey_algo )
+       return -1;
+
+    n = pubkey_get_npkey( b->pubkey_algo );
+    if( !n )
+       return -1; /* can't compare due to unknown algorithm */
+    for(i=0; i < n; i++ ) {
+       if( mpi_cmp( a->skey[i], b->skey[i] ) )
+           return -1;
+    }
+
+    return 0;
+}
+
+/****************
+ * Returns 0 if they match.
+ */
+int
+cmp_public_secret_key( PKT_public_key *pk, PKT_secret_key *sk )
+{
+    int n, i;
+
+    if( pk->timestamp != sk->timestamp )
+       return -1;
+    if( pk->version < 4 && pk->expiredate != sk->expiredate )
+       return -1;
+    if( pk->pubkey_algo != sk->pubkey_algo )
+       return -1;
+
+    n = pubkey_get_npkey( pk->pubkey_algo );
+    if( !n )
+       return -1; /* can't compare due to unknown algorithm */
+    for(i=0; i < n; i++ ) {
+       if( mpi_cmp( pk->pkey[i] , sk->skey[i] ) )
+           return -1;
+    }
+    return 0;
+}
+
+
+
+int
+cmp_signatures( PKT_signature *a, PKT_signature *b )
+{
+    int n, i;
+
+    if( a->keyid[0] != b->keyid[0] )
+       return -1;
+    if( a->keyid[1] != b->keyid[1] )
+       return -1;
+    if( a->pubkey_algo != b->pubkey_algo )
+       return -1;
+
+    n = pubkey_get_nsig( a->pubkey_algo );
+    if( !n )
+       return -1; /* can't compare due to unknown algorithm */
+    for(i=0; i < n; i++ ) {
+       if( mpi_cmp( a->data[i] , b->data[i] ) )
+           return -1;
+    }
+    return 0;
+}
+
+
+/****************
+ * Returns: true if the user ids do not match
+ */
+int
+cmp_user_ids( PKT_user_id *a, PKT_user_id *b )
+{
+    int res=1;
+
+    if( a == b )
+        return 0;
+
+    if( a->attrib_data && b->attrib_data )
+      {
+       res = a->attrib_len - b->attrib_len;
+       if( !res )
+         res = memcmp( a->attrib_data, b->attrib_data, a->attrib_len );
+      }
+    else if( !a->attrib_data && !b->attrib_data )
+      {
+       res = a->len - b->len;
+       if( !res )
+         res = memcmp( a->name, b->name, a->len );
+      }
+
+    return res;
+}
diff --git a/g10/getkey.c b/g10/getkey.c
new file mode 100644 (file)
index 0000000..74c0a74
--- /dev/null
@@ -0,0 +1,3003 @@
+/* getkey.c -  Get a key from the database
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+#include "util.h"
+#include "packet.h"
+#include "memory.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "options.h"
+#include "main.h"
+#include "trustdb.h"
+#include "i18n.h"
+#include "keyserver-internal.h"
+
+#define MAX_PK_CACHE_ENTRIES   PK_UID_CACHE_SIZE
+#define MAX_UID_CACHE_ENTRIES  PK_UID_CACHE_SIZE
+
+#if MAX_PK_CACHE_ENTRIES < 2
+#error We need the cache for key creation
+#endif
+
+struct getkey_ctx_s {
+    int exact;
+    KBNODE keyblock;
+    KBPOS  kbpos;
+    KBNODE found_key; /* pointer into some keyblock */
+    int last_rc;
+    int req_usage;
+    int req_algo;
+    KEYDB_HANDLE kr_handle;
+    int not_allocated;
+    int nitems;
+    KEYDB_SEARCH_DESC items[1];
+};
+
+#if 0
+static struct {
+    int any;
+    int okay_count;
+    int nokey_count;
+    int error_count;
+} lkup_stats[21];
+#endif
+
+typedef struct keyid_list {
+    struct keyid_list *next;
+    u32 keyid[2];
+} *keyid_list_t;
+
+
+#if MAX_PK_CACHE_ENTRIES
+  typedef struct pk_cache_entry {
+      struct pk_cache_entry *next;
+      u32 keyid[2];
+      PKT_public_key *pk;
+  } *pk_cache_entry_t;
+  static pk_cache_entry_t pk_cache;
+  static int pk_cache_entries;  /* number of entries in pk cache */
+  static int pk_cache_disabled;
+#endif
+
+#if MAX_UID_CACHE_ENTRIES < 5
+#error we really need the userid cache
+#endif
+typedef struct user_id_db {
+    struct user_id_db *next;
+    keyid_list_t keyids;
+    int len;
+    char name[1];
+} *user_id_db_t;
+static user_id_db_t user_id_db;
+static int uid_cache_entries;  /* number of entries in uid cache */
+
+static void merge_selfsigs( KBNODE keyblock );
+static int lookup( GETKEY_CTX ctx, KBNODE *ret_keyblock, int secmode );
+
+#if 0
+static void
+print_stats()
+{
+    int i;
+    for(i=0; i < DIM(lkup_stats); i++ ) {
+       if( lkup_stats[i].any )
+           fprintf(stderr,
+                   "lookup stats: mode=%-2d  ok=%-6d  nokey=%-6d  err=%-6d\n",
+                   i,
+                   lkup_stats[i].okay_count,
+                   lkup_stats[i].nokey_count,
+                   lkup_stats[i].error_count );
+    }
+}
+#endif
+
+
+void
+cache_public_key( PKT_public_key *pk )
+{
+#if MAX_PK_CACHE_ENTRIES
+    pk_cache_entry_t ce;
+    u32 keyid[2];
+
+    if( pk_cache_disabled )
+       return;
+
+    if( pk->dont_cache )
+        return;
+
+    if( is_ELGAMAL(pk->pubkey_algo)
+       || pk->pubkey_algo == PUBKEY_ALGO_DSA
+       || is_RSA(pk->pubkey_algo) ) {
+       keyid_from_pk( pk, keyid );
+    }
+    else
+       return; /* don't know how to get the keyid */
+
+    for( ce = pk_cache; ce; ce = ce->next )
+       if( ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1] ) {
+           if( DBG_CACHE )
+               log_debug("cache_public_key: already in cache\n");
+           return;
+       }
+
+    if( pk_cache_entries >= MAX_PK_CACHE_ENTRIES ) {
+       /* fixme: use another algorithm to free some cache slots */
+       pk_cache_disabled=1;
+       if( opt.verbose > 1 )
+           log_info(_("too many entries in pk cache - disabled\n"));
+       return;
+    }
+    pk_cache_entries++;
+    ce = xmalloc( sizeof *ce );
+    ce->next = pk_cache;
+    pk_cache = ce;
+    ce->pk = copy_public_key( NULL, pk );
+    ce->keyid[0] = keyid[0];
+    ce->keyid[1] = keyid[1];
+#endif
+}
+
+
+/* Return a const utf-8 string with the text "[User ID not found]".
+   This fucntion is required so that we don't need to switch gettext's
+   encoding temporary. */
+static const char *
+user_id_not_found_utf8 (void)
+{
+  static char *text;
+
+  if (!text)
+    text = native_to_utf8 (_("[User ID not found]"));
+  return text;
+}
+
+
+
+/*
+ * Return the user ID from the given keyblock.
+ * We use the primary uid flag which has been set by the merge_selfsigs
+ * function.  The returned value is only valid as long as then given
+ * keyblock is not changed
+ */
+static const char *
+get_primary_uid ( KBNODE keyblock, size_t *uidlen )
+{
+    KBNODE k;
+    const char *s;
+
+    for (k=keyblock; k; k=k->next ) {
+        if ( k->pkt->pkttype == PKT_USER_ID
+             && !k->pkt->pkt.user_id->attrib_data
+             && k->pkt->pkt.user_id->is_primary ) {
+            *uidlen = k->pkt->pkt.user_id->len;
+            return k->pkt->pkt.user_id->name;
+        }
+    } 
+    s = user_id_not_found_utf8 ();
+    *uidlen = strlen (s);
+    return s;
+}
+
+
+static void
+release_keyid_list ( keyid_list_t k )
+{
+    while (  k ) {
+        keyid_list_t k2 = k->next;
+        xfree (k);
+        k = k2;
+    }
+}
+
+/****************
+ * Store the association of keyid and userid
+ * Feed only public keys to this function.
+ */
+static void
+cache_user_id( KBNODE keyblock )
+{
+    user_id_db_t r;
+    const char *uid;
+    size_t uidlen;
+    keyid_list_t keyids = NULL;
+    KBNODE k;
+
+    for (k=keyblock; k; k = k->next ) {
+        if ( k->pkt->pkttype == PKT_PUBLIC_KEY
+             || k->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+            keyid_list_t a = xmalloc_clear ( sizeof *a );
+            /* Hmmm: For a long list of keyids it might be an advantage
+             * to append the keys */
+            keyid_from_pk( k->pkt->pkt.public_key, a->keyid );
+            /* first check for duplicates */
+            for(r=user_id_db; r; r = r->next ) {
+                keyid_list_t b = r->keyids;
+                for ( b = r->keyids; b; b = b->next ) {
+                    if( b->keyid[0] == a->keyid[0]
+                        && b->keyid[1] == a->keyid[1] ) {
+                        if( DBG_CACHE )
+                            log_debug("cache_user_id: already in cache\n");
+                        release_keyid_list ( keyids );
+                        xfree ( a );
+                        return;
+                    }
+                }
+            }
+            /* now put it into the cache */
+            a->next = keyids;
+            keyids = a;
+        }
+    }
+    if ( !keyids )
+        BUG (); /* No key no fun */
+
+
+    uid = get_primary_uid ( keyblock, &uidlen );
+
+    if( uid_cache_entries >= MAX_UID_CACHE_ENTRIES ) {
+       /* fixme: use another algorithm to free some cache slots */
+       r = user_id_db;
+       user_id_db = r->next;
+        release_keyid_list ( r->keyids );
+       xfree(r);
+       uid_cache_entries--;
+    }
+    r = xmalloc( sizeof *r + uidlen-1 );
+    r->keyids = keyids;
+    r->len = uidlen;
+    memcpy(r->name, uid, r->len);
+    r->next = user_id_db;
+    user_id_db = r;
+    uid_cache_entries++;
+}
+
+
+void
+getkey_disable_caches()
+{
+#if MAX_PK_CACHE_ENTRIES
+    {
+       pk_cache_entry_t ce, ce2;
+
+       for( ce = pk_cache; ce; ce = ce2 ) {
+           ce2 = ce->next;
+           free_public_key( ce->pk );
+           xfree( ce );
+       }
+       pk_cache_disabled=1;
+       pk_cache_entries = 0;
+       pk_cache = NULL;
+    }
+#endif
+    /* fixme: disable user id cache ? */
+}
+
+
+static void
+pk_from_block ( GETKEY_CTX ctx, PKT_public_key *pk, KBNODE keyblock )
+{
+    KBNODE a = ctx->found_key ? ctx->found_key : keyblock;
+
+    assert ( a->pkt->pkttype == PKT_PUBLIC_KEY
+             ||  a->pkt->pkttype == PKT_PUBLIC_SUBKEY );
+     
+    copy_public_key ( pk, a->pkt->pkt.public_key );
+}
+
+static void
+sk_from_block ( GETKEY_CTX ctx,
+                PKT_secret_key *sk, KBNODE keyblock )
+{
+    KBNODE a = ctx->found_key ? ctx->found_key : keyblock;
+
+    assert ( a->pkt->pkttype == PKT_SECRET_KEY
+             ||  a->pkt->pkttype == PKT_SECRET_SUBKEY );
+     
+    copy_secret_key( sk, a->pkt->pkt.secret_key);
+}
+
+
+/****************
+ * Get a public key and store it into the allocated pk
+ * can be called with PK set to NULL to just read it into some
+ * internal structures.
+ */
+int
+get_pubkey( PKT_public_key *pk, u32 *keyid )
+{
+    int internal = 0;
+    int rc = 0;
+
+#if MAX_PK_CACHE_ENTRIES
+    if(pk)
+      {
+       /* Try to get it from the cache.  We don't do this when pk is
+          NULL as it does not guarantee that the user IDs are
+          cached. */
+       pk_cache_entry_t ce;
+       for( ce = pk_cache; ce; ce = ce->next )
+         {
+           if( ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1] )
+             {
+               copy_public_key( pk, ce->pk );
+               return 0;
+             }
+         }
+      }
+#endif
+    /* more init stuff */
+    if( !pk ) {
+       pk = xmalloc_clear( sizeof *pk );
+       internal++;
+    }
+
+
+    /* do a lookup */
+    {  struct getkey_ctx_s ctx;
+        KBNODE kb = NULL;
+       memset( &ctx, 0, sizeof ctx );
+        ctx.exact = 1; /* use the key ID exactly as given */
+       ctx.not_allocated = 1;
+        ctx.kr_handle = keydb_new (0);
+       ctx.nitems = 1;
+       ctx.items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
+       ctx.items[0].u.kid[0] = keyid[0];
+       ctx.items[0].u.kid[1] = keyid[1];
+        ctx.req_algo  = pk->req_algo;
+        ctx.req_usage = pk->req_usage;
+       rc = lookup( &ctx, &kb, 0 );
+        if ( !rc ) {
+            pk_from_block ( &ctx, pk, kb );
+        }
+       get_pubkey_end( &ctx );
+        release_kbnode ( kb );
+    }
+    if( !rc )
+       goto leave;
+
+    rc = G10ERR_NO_PUBKEY;
+
+  leave:
+    if( !rc )
+       cache_public_key( pk );
+    if( internal )
+       free_public_key(pk);
+    return rc;
+}
+
+
+/* Get a public key and store it into the allocated pk.  This function
+   differs from get_pubkey() in that it does not do a check of the key
+   to avoid recursion.  It should be used only in very certain cases.
+   It will only retrieve primary keys. */
+int
+get_pubkey_fast (PKT_public_key *pk, u32 *keyid)
+{
+  int rc = 0;
+  KEYDB_HANDLE hd;
+  KBNODE keyblock;
+  u32 pkid[2];
+  
+  assert (pk);
+#if MAX_PK_CACHE_ENTRIES
+  { /* Try to get it from the cache */
+    pk_cache_entry_t ce;
+
+    for (ce = pk_cache; ce; ce = ce->next)
+      {
+        if (ce->keyid[0] == keyid[0] && ce->keyid[1] == keyid[1])
+          {
+            if (pk)
+              copy_public_key (pk, ce->pk);
+            return 0;
+          }
+      }
+  }
+#endif
+
+  hd = keydb_new (0);
+  rc = keydb_search_kid (hd, keyid);
+  if (rc == -1)
+    {
+      keydb_release (hd);
+      return G10ERR_NO_PUBKEY;
+    }
+  rc = keydb_get_keyblock (hd, &keyblock);
+  keydb_release (hd);
+  if (rc) 
+    {
+      log_error ("keydb_get_keyblock failed: %s\n", g10_errstr(rc));
+      return G10ERR_NO_PUBKEY;
+    }
+
+  assert ( keyblock->pkt->pkttype == PKT_PUBLIC_KEY
+           ||  keyblock->pkt->pkttype == PKT_PUBLIC_SUBKEY );
+
+  keyid_from_pk(keyblock->pkt->pkt.public_key,pkid);
+  if(keyid[0]==pkid[0] && keyid[1]==pkid[1])
+    copy_public_key (pk, keyblock->pkt->pkt.public_key );
+  else
+    rc=G10ERR_NO_PUBKEY;
+
+  release_kbnode (keyblock);
+
+  /* Not caching key here since it won't have all of the fields
+     properly set. */
+
+  return rc;
+}
+
+
+KBNODE
+get_pubkeyblock( u32 *keyid )
+{
+    struct getkey_ctx_s ctx;
+    int rc = 0;
+    KBNODE keyblock = NULL;
+
+    memset( &ctx, 0, sizeof ctx );
+    /* no need to set exact here because we want the entire block */
+    ctx.not_allocated = 1;
+    ctx.kr_handle = keydb_new (0);
+    ctx.nitems = 1;
+    ctx.items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
+    ctx.items[0].u.kid[0] = keyid[0];
+    ctx.items[0].u.kid[1] = keyid[1];
+    rc = lookup( &ctx, &keyblock, 0 );
+    get_pubkey_end( &ctx );
+
+    return rc ? NULL : keyblock;
+}
+
+
+
+
+/****************
+ * Get a secret key and store it into sk
+ */
+int
+get_seckey( PKT_secret_key *sk, u32 *keyid )
+{
+    int rc;
+    struct getkey_ctx_s ctx;
+    KBNODE kb = NULL;
+
+    memset( &ctx, 0, sizeof ctx );
+    ctx.exact = 1; /* use the key ID exactly as given */
+    ctx.not_allocated = 1;
+    ctx.kr_handle = keydb_new (1);
+    ctx.nitems = 1;
+    ctx.items[0].mode = KEYDB_SEARCH_MODE_LONG_KID;
+    ctx.items[0].u.kid[0] = keyid[0];
+    ctx.items[0].u.kid[1] = keyid[1];
+    ctx.req_algo  = sk->req_algo;
+    ctx.req_usage = sk->req_usage;
+    rc = lookup( &ctx, &kb, 1 );
+    if ( !rc ) {
+        sk_from_block ( &ctx, sk, kb );
+    }
+    get_seckey_end( &ctx );
+    release_kbnode ( kb );
+
+    if( !rc ) {
+       /* check the secret key (this may prompt for a passprase to
+        * unlock the secret key
+        */
+       rc = check_secret_key( sk, 0 );
+    }
+
+    return rc;
+}
+
+
+/****************
+ * Check whether the secret key is available.  This is just a fast
+ * check and does not tell us whether the secret key is valid.  It
+ * merely tells other whether there is some secret key.
+ * Returns: 0 := key is available
+ * G10ERR_NO_SECKEY := not availabe
+ */
+int
+seckey_available( u32 *keyid )
+{
+    int rc;
+    KEYDB_HANDLE hd = keydb_new (1);
+
+    rc = keydb_search_kid (hd, keyid);
+    if ( rc == -1 )
+        rc = G10ERR_NO_SECKEY;
+    keydb_release (hd);
+    return rc;
+}
+
+
+/****************
+ * Return the type of the user id:
+ *
+ * Please use the constants KEYDB_SERCH_MODE_xxx
+ *  0 = Invalid user ID
+ *  1 = exact match
+ *  2 = match a substring
+ *  3 = match an email address
+ *  4 = match a substring of an email address
+ *  5 = match an email address, but compare from end
+ *  6 = word match mode
+ * 10 = it is a short KEYID (don't care about keyid[0])
+ * 11 = it is a long  KEYID
+ * 12 = it is a trustdb index (keyid is looked up)
+ * 16 = it is a 16 byte fingerprint
+ * 20 = it is a 20 byte fingerprint
+ * 21 = Unified fingerprint :fpr:pk_algo:
+ *      (We don't use pk_algo yet)
+ *
+ * Rules used:
+ * - If the username starts with 8,9,16 or 17 hex-digits (the first one
+ *   must be in the range 0..9), this is considered a keyid; depending
+ *   on the length a short or complete one.
+ * - If the username starts with 32,33,40 or 41 hex-digits (the first one
+ *   must be in the range 0..9), this is considered a fingerprint.
+ * - If the username starts with a left angle, we assume it is a complete
+ *   email address and look only at this part.
+ * - If the username starts with a colon we assume it is a unified 
+ *   key specfification. 
+ * - If the username starts with a '.', we assume it is the ending
+ *   part of an email address
+ * - If the username starts with an '@', we assume it is a part of an
+ *   email address
+ * - If the userid start with an '=' an exact compare is done.
+ * - If the userid starts with a '*' a case insensitive substring search is
+ *   done (This is the default).
+ * - If the userid starts with a '+' we will compare individual words
+ *   and a match requires that all the words are in the userid.
+ *   Words are delimited by white space or "()<>[]{}.@-+_,;/&!"
+ *   (note that you can't search for these characters). Compare
+ *   is not case sensitive.
+ */
+
+int
+classify_user_id( const char *name, KEYDB_SEARCH_DESC *desc )
+{
+    const char *s;
+    int hexprefix = 0;
+    int hexlength;
+    int mode = 0;   
+    KEYDB_SEARCH_DESC dummy_desc;
+
+    if (!desc)
+        desc = &dummy_desc;
+
+    /* clear the structure so that the mode field is set to zero unless
+     * we set it to the correct value right at the end of this function */
+    memset (desc, 0, sizeof *desc);
+
+    /* skip leading spaces.  Fixme: what is with trailing spaces? */
+    for(s = name; *s && spacep (s); s++ )
+       ;
+
+    switch (*s) {
+       case 0:    /* empty string is an error */
+           return 0;
+
+#if 0
+       case '.':  /* an email address, compare from end */
+           mode = KEYDB_SEARCH_MODE_MAILEND;
+           s++;
+            desc->u.name = s;
+           break;
+#endif
+
+       case '<':  /* an email address */
+           mode = KEYDB_SEARCH_MODE_MAIL;
+            desc->u.name = s;
+           break;
+
+       case '@':  /* part of an email address */
+           mode = KEYDB_SEARCH_MODE_MAILSUB;
+           s++;
+            desc->u.name = s;
+           break;
+
+       case '=':  /* exact compare */
+           mode = KEYDB_SEARCH_MODE_EXACT;
+           s++;
+            desc->u.name = s;
+           break;
+
+       case '*':  /* case insensitive substring search */
+           mode = KEYDB_SEARCH_MODE_SUBSTR;
+           s++;
+            desc->u.name = s;
+           break;
+
+#if 0
+       case '+':  /* compare individual words */
+           mode = KEYDB_SEARCH_MODE_WORDS;
+           s++;
+            desc->u.name = s;
+           break;
+#endif
+
+       case '#':  /* local user id */
+            return 0; /* This is now obsolete and van't not be used anymore*/
+        
+        case ':': /*Unified fingerprint */
+            {  
+                const char *se, *si;
+                int i;
+                
+                se = strchr( ++s,':');
+                if ( !se )
+                    return 0;
+                for (i=0,si=s; si < se; si++, i++ ) {
+                    if ( !strchr("01234567890abcdefABCDEF", *si ) )
+                        return 0; /* invalid digit */
+                }
+                if (i != 32 && i != 40)
+                    return 0; /* invalid length of fpr*/
+                for (i=0,si=s; si < se; i++, si +=2) 
+                    desc->u.fpr[i] = hextobyte(si);
+                for ( ; i < 20; i++)
+                    desc->u.fpr[i]= 0;
+                s = se + 1;
+                mode = KEYDB_SEARCH_MODE_FPR;
+            } 
+            break;
+           
+       default:
+           if (s[0] == '0' && s[1] == 'x') {
+               hexprefix = 1;
+               s += 2;
+           }
+
+           hexlength = strspn(s, "0123456789abcdefABCDEF");
+            if (hexlength >= 8 && s[hexlength] =='!') {
+               desc->exact = 1;
+                hexlength++; /* just for the following check */
+            }
+
+           /* check if a hexadecimal number is terminated by EOS or blank */
+           if (hexlength && s[hexlength] && !spacep(s+hexlength)) {
+               if (hexprefix)      /* a "0x" prefix without correct */
+                   return 0;       /* termination is an error */
+               else                /* The first chars looked like */
+                   hexlength = 0;  /* a hex number, but really were not. */
+           }
+
+            if (desc->exact)
+                hexlength--;
+
+           if (hexlength == 8
+                || (!hexprefix && hexlength == 9 && *s == '0')){
+               /* short keyid */
+               if (hexlength == 9)
+                   s++;
+                desc->u.kid[0] = 0;
+                desc->u.kid[1] = strtoul( s, NULL, 16 );
+               mode = KEYDB_SEARCH_MODE_SHORT_KID;
+           }
+           else if (hexlength == 16
+                     || (!hexprefix && hexlength == 17 && *s == '0')) {
+               /* complete keyid */
+               char buf[9];
+               if (hexlength == 17)
+                   s++;
+               mem2str(buf, s, 9 );
+               desc->u.kid[0] = strtoul( buf, NULL, 16 );
+               desc->u.kid[1] = strtoul( s+8, NULL, 16 );
+               mode = KEYDB_SEARCH_MODE_LONG_KID;
+           }
+           else if (hexlength == 32 || (!hexprefix && hexlength == 33
+                                                           && *s == '0')) {
+               /* md5 fingerprint */
+               int i;
+               if (hexlength == 33)
+                   s++;
+                memset(desc->u.fpr+16, 0, 4); 
+                for (i=0; i < 16; i++, s+=2) {
+                    int c = hextobyte(s);
+                    if (c == -1)
+                        return 0;
+                    desc->u.fpr[i] = c;
+                }
+               mode = KEYDB_SEARCH_MODE_FPR16;
+           }
+           else if (hexlength == 40 || (!hexprefix && hexlength == 41
+                                                             && *s == '0')) {
+               /* sha1/rmd160 fingerprint */
+               int i;
+               if (hexlength == 41)
+                   s++;
+                for (i=0; i < 20; i++, s+=2) {
+                    int c = hextobyte(s);
+                    if (c == -1)
+                        return 0;
+                    desc->u.fpr[i] = c;
+                }
+               mode = KEYDB_SEARCH_MODE_FPR20;
+           }
+           else {
+               if (hexprefix)  /* This was a hex number with a prefix */
+                   return 0;   /* and a wrong length */
+
+               desc->exact = 0;
+                desc->u.name = s;
+               mode = KEYDB_SEARCH_MODE_SUBSTR;   /* default mode */
+           }
+    }
+
+    desc->mode = mode;
+    return mode;
+}
+
+
+static int
+skip_unusable(void *dummy,u32 *keyid,PKT_user_id *uid)
+{
+  int unusable=0;
+  KBNODE keyblock;
+
+  keyblock=get_pubkeyblock(keyid);
+  if(!keyblock)
+    {
+      log_error("error checking usability status of %s\n",keystr(keyid));
+      goto leave;
+    }
+
+  /* Is the user ID in question revoked/expired? */
+  if(uid)
+    {
+      KBNODE node;
+
+      for(node=keyblock;node;node=node->next)
+       {
+         if(node->pkt->pkttype==PKT_USER_ID)
+           {
+             if(cmp_user_ids(uid,node->pkt->pkt.user_id)==0
+                && (node->pkt->pkt.user_id->is_revoked
+                    || node->pkt->pkt.user_id->is_expired))
+               {
+                 unusable=1;
+                 break;
+               }
+           }
+       }
+    }
+
+  if(!unusable)
+    unusable=pk_is_disabled(keyblock->pkt->pkt.public_key);
+
+ leave:
+  release_kbnode(keyblock);
+  return unusable;
+}
+
+/****************
+ * Try to get the pubkey by the userid. This function looks for the
+ * first pubkey certificate which has the given name in a user_id.  if
+ * pk/sk has the pubkey algo set, the function will only return a
+ * pubkey with that algo.  If namelist is NULL, the first key is
+ * returned.  The caller should provide storage for either the pk or
+ * the sk.  If ret_kb is not NULL the function will return the
+ * keyblock there.
+ */
+
+static int
+key_byname( GETKEY_CTX *retctx, STRLIST namelist,
+           PKT_public_key *pk, PKT_secret_key *sk,
+           int secmode, int include_unusable,
+            KBNODE *ret_kb, KEYDB_HANDLE *ret_kdbhd )
+{
+    int rc = 0;
+    int n;
+    STRLIST r;
+    GETKEY_CTX ctx;
+    KBNODE help_kb = NULL;
+    
+    if( retctx ) {/* reset the returned context in case of error */
+        assert (!ret_kdbhd);  /* not allowed because the handle is
+                                 stored in the context */
+       *retctx = NULL;
+    }
+    if (ret_kdbhd)
+        *ret_kdbhd = NULL;
+
+    if(!namelist)
+      {
+       ctx = xmalloc_clear (sizeof *ctx);
+       ctx->nitems = 1;
+       ctx->items[0].mode=KEYDB_SEARCH_MODE_FIRST;
+       if(!include_unusable)
+         ctx->items[0].skipfnc=skip_unusable;
+      }
+    else
+      {
+       /* build the search context */
+       for(n=0, r=namelist; r; r = r->next )
+         n++;
+
+       ctx = xmalloc_clear (sizeof *ctx + (n-1)*sizeof ctx->items );
+       ctx->nitems = n;
+
+       for(n=0, r=namelist; r; r = r->next, n++ )
+         {
+           classify_user_id (r->d, &ctx->items[n]);
+        
+           if (ctx->items[n].exact)
+             ctx->exact = 1;
+           if (!ctx->items[n].mode)
+             {
+               xfree (ctx);
+               return G10ERR_INV_USER_ID;
+             }
+           if(!include_unusable
+              && ctx->items[n].mode!=KEYDB_SEARCH_MODE_SHORT_KID
+              && ctx->items[n].mode!=KEYDB_SEARCH_MODE_LONG_KID
+              && ctx->items[n].mode!=KEYDB_SEARCH_MODE_FPR16
+              && ctx->items[n].mode!=KEYDB_SEARCH_MODE_FPR20
+              && ctx->items[n].mode!=KEYDB_SEARCH_MODE_FPR)
+             ctx->items[n].skipfnc=skip_unusable;
+         }
+      }
+
+    ctx->kr_handle = keydb_new (secmode);
+    if ( !ret_kb ) 
+        ret_kb = &help_kb;
+
+    if( secmode ) {
+        if (sk) {
+            ctx->req_algo  = sk->req_algo;
+            ctx->req_usage = sk->req_usage;
+        }
+       rc = lookup( ctx, ret_kb, 1 );
+        if ( !rc && sk ) {
+            sk_from_block ( ctx, sk, *ret_kb );
+        }
+    }
+    else {
+        if (pk) {
+            ctx->req_algo  = pk->req_algo;
+            ctx->req_usage = pk->req_usage;
+        }
+       rc = lookup( ctx, ret_kb, 0 );
+        if ( !rc && pk ) {
+            pk_from_block ( ctx, pk, *ret_kb );
+        }
+    }
+
+    release_kbnode ( help_kb );
+
+    if (retctx) /* caller wants the context */
+       *retctx = ctx;
+    else {
+        if (ret_kdbhd) {
+            *ret_kdbhd = ctx->kr_handle;
+            ctx->kr_handle = NULL;
+        }
+        get_pubkey_end (ctx);
+    }
+
+    return rc;
+}
+
+
+
+/* Find a public key from NAME and return the keyblock or the key.  If
+   ret_kdb is not NULL, the KEYDB handle used to locate this keyblock
+   is returned and the caller is responsible for closing it.  If a key
+   was not found and NAME is a valid RFC822 mailbox and PKA retrieval
+   has been enabled, we try to import the pkea via the PKA
+   mechanism. */
+int
+get_pubkey_byname (PKT_public_key *pk,
+                  const char *name, KBNODE *ret_keyblock,
+                   KEYDB_HANDLE *ret_kdbhd, int include_unusable )
+{
+  int rc;
+  STRLIST namelist = NULL;
+
+  add_to_strlist( &namelist, name );
+
+  rc = key_byname( NULL, namelist, pk, NULL, 0,
+                   include_unusable, ret_keyblock, ret_kdbhd);
+
+  /* If the requested name resembles a valid mailbox and automatic
+     retrieval has been enabled, we try to import the key. */
+
+  if (rc == G10ERR_NO_PUBKEY && is_valid_mailbox(name))
+    {
+      struct akl *akl;
+
+      for(akl=opt.auto_key_locate;akl;akl=akl->next)
+       {
+         unsigned char *fpr=NULL;
+         size_t fpr_len;
+
+         switch(akl->type)
+           {
+           case AKL_CERT:
+             glo_ctrl.in_auto_key_retrieve++;
+             rc=keyserver_import_cert(name,&fpr,&fpr_len);
+             glo_ctrl.in_auto_key_retrieve--;
+
+             if(rc==0)
+               log_info(_("automatically retrieved `%s' via %s\n"),
+                        name,"DNS CERT");
+             break;
+
+           case AKL_PKA:
+             glo_ctrl.in_auto_key_retrieve++;
+             rc=keyserver_import_pka(name,&fpr,&fpr_len);
+             glo_ctrl.in_auto_key_retrieve--;
+
+             if(rc==0)
+               log_info(_("automatically retrieved `%s' via %s\n"),
+                        name,"PKA");
+             break;
+
+           case AKL_LDAP:
+             glo_ctrl.in_auto_key_retrieve++;
+             rc=keyserver_import_ldap(name,&fpr,&fpr_len);
+             glo_ctrl.in_auto_key_retrieve--;
+
+             if(rc==0)
+               log_info(_("automatically retrieved `%s' via %s\n"),
+                        name,"LDAP");
+             break;
+
+           case AKL_KEYSERVER:
+             /* Strictly speaking, we don't need to only use a valid
+                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)
+               {
+                 glo_ctrl.in_auto_key_retrieve++;
+                 rc=keyserver_import_name(name,&fpr,&fpr_len,opt.keyserver);
+                 glo_ctrl.in_auto_key_retrieve--;
+
+                 if(rc==0)
+                   log_info(_("automatically retrieved `%s' via %s\n"),
+                            name,opt.keyserver->uri);
+               }
+             break;
+
+           case AKL_SPEC:
+             {
+               struct keyserver_spec *keyserver;
+
+               keyserver=keyserver_match(akl->spec);
+               glo_ctrl.in_auto_key_retrieve++;
+               rc=keyserver_import_name(name,&fpr,&fpr_len,keyserver);
+               glo_ctrl.in_auto_key_retrieve--;
+
+               if(rc==0)
+                 log_info(_("automatically retrieved `%s' via %s\n"),
+                          name,akl->spec->uri);
+             }
+             break;
+           }
+
+         /* Use the fingerprint of the key that we actually fetched.
+            This helps prevent problems where the key that we fetched
+            doesn't have the same name that we used to fetch it.  In
+            the case of CERT and PKA, this is an actual security
+            requirement as the URL might point to a key put in by an
+            attacker.  By forcing the use of the fingerprint, we
+            won't use the attacker's key here. */
+         if(rc==0 && fpr)
+           {
+             int i;
+             char fpr_string[MAX_FINGERPRINT_LEN*2+1];
+
+             assert(fpr_len<=MAX_FINGERPRINT_LEN);
+
+             free_strlist(namelist);
+             namelist=NULL;
+
+             for(i=0;i<fpr_len;i++)
+               sprintf(fpr_string+2*i,"%02X",fpr[i]);
+
+             if(opt.verbose)
+               log_info("auto-key-locate found fingerprint %s\n",fpr_string);
+
+             add_to_strlist( &namelist, fpr_string );
+
+             xfree(fpr);
+           }
+
+         rc = key_byname( NULL, namelist, pk, NULL, 0,
+                          include_unusable, ret_keyblock, ret_kdbhd);
+         if(rc!=G10ERR_NO_PUBKEY)
+           break;
+       }
+    }
+
+  free_strlist( namelist );
+  return rc;
+}
+
+int
+get_pubkey_bynames( GETKEY_CTX *retctx, PKT_public_key *pk,
+                   STRLIST names, KBNODE *ret_keyblock )
+{
+    return key_byname( retctx, names, pk, NULL, 0, 1, ret_keyblock, NULL);
+}
+
+int
+get_pubkey_next( GETKEY_CTX ctx, PKT_public_key *pk, KBNODE *ret_keyblock )
+{
+    int rc;
+
+    rc = lookup( ctx, ret_keyblock, 0 );
+    if ( !rc && pk && ret_keyblock )
+        pk_from_block ( ctx, pk, *ret_keyblock );
+    
+    return rc;
+}
+
+void
+get_pubkey_end( GETKEY_CTX ctx )
+{
+    if( ctx ) {
+        memset (&ctx->kbpos, 0, sizeof ctx->kbpos);
+        keydb_release (ctx->kr_handle);
+       if( !ctx->not_allocated )
+           xfree( ctx );
+    }
+}
+
+
+/****************
+ * Search for a key with the given fingerprint.
+ * FIXME:
+ * We should replace this with the _byname function.  Thiscsan be done
+ * by creating a userID conforming to the unified fingerprint style. 
+ */
+int
+get_pubkey_byfprint( PKT_public_key *pk,
+                     const byte *fprint, size_t fprint_len)
+{
+    int rc;
+
+    if( fprint_len == 20 || fprint_len == 16 ) {
+       struct getkey_ctx_s ctx;
+        KBNODE kb = NULL;
+
+       memset( &ctx, 0, sizeof ctx );
+        ctx.exact = 1 ;
+       ctx.not_allocated = 1;
+        ctx.kr_handle = keydb_new (0);
+       ctx.nitems = 1;
+       ctx.items[0].mode = fprint_len==16? KEYDB_SEARCH_MODE_FPR16
+                                          : KEYDB_SEARCH_MODE_FPR20;
+       memcpy( ctx.items[0].u.fpr, fprint, fprint_len );
+       rc = lookup( &ctx, &kb, 0 );
+        if (!rc && pk )
+            pk_from_block ( &ctx, pk, kb );
+        release_kbnode ( kb );
+       get_pubkey_end( &ctx );
+    }
+    else
+       rc = G10ERR_GENERAL; /* Oops */
+    return rc;
+}
+
+
+/* Get a public key and store it into the allocated pk.  This function
+   differs from get_pubkey_byfprint() in that it does not do a check
+   of the key to avoid recursion.  It should be used only in very
+   certain cases.  PK may be NULL to check just for the existance of
+   the key. */
+int
+get_pubkey_byfprint_fast (PKT_public_key *pk,
+                          const byte *fprint, size_t fprint_len)
+{
+  int rc = 0;
+  KEYDB_HANDLE hd;
+  KBNODE keyblock;
+  byte fprbuf[MAX_FINGERPRINT_LEN];
+  int i;
+  
+  for (i=0; i < MAX_FINGERPRINT_LEN && i < fprint_len; i++)
+    fprbuf[i] = fprint[i];
+  while (i < MAX_FINGERPRINT_LEN) 
+    fprbuf[i++] = 0;
+
+  hd = keydb_new (0);
+  rc = keydb_search_fpr (hd, fprbuf);
+  if (rc == -1)
+    {
+      keydb_release (hd);
+      return G10ERR_NO_PUBKEY;
+    }
+  rc = keydb_get_keyblock (hd, &keyblock);
+  keydb_release (hd);
+  if (rc) 
+    {
+      log_error ("keydb_get_keyblock failed: %s\n", g10_errstr(rc));
+      return G10ERR_NO_PUBKEY;
+    }
+  
+  assert ( keyblock->pkt->pkttype == PKT_PUBLIC_KEY
+           ||  keyblock->pkt->pkttype == PKT_PUBLIC_SUBKEY );
+  if (pk)
+    copy_public_key (pk, keyblock->pkt->pkt.public_key );
+  release_kbnode (keyblock);
+
+  /* Not caching key here since it won't have all of the fields
+     properly set. */
+
+  return 0;
+}
+
+/****************
+ * Search for a key with the given fingerprint and return the
+ * complete keyblock which may have more than only this key.
+ */
+int
+get_keyblock_byfprint( KBNODE *ret_keyblock, const byte *fprint,
+                                               size_t fprint_len )
+{
+    int rc;
+
+    if( fprint_len == 20 || fprint_len == 16 ) {
+       struct getkey_ctx_s ctx;
+
+       memset( &ctx, 0, sizeof ctx );
+       ctx.not_allocated = 1;
+        ctx.kr_handle = keydb_new (0);
+       ctx.nitems = 1;
+       ctx.items[0].mode = fprint_len==16? KEYDB_SEARCH_MODE_FPR16
+                                          : KEYDB_SEARCH_MODE_FPR20;
+       memcpy( ctx.items[0].u.fpr, fprint, fprint_len );
+       rc = lookup( &ctx, ret_keyblock, 0 );
+       get_pubkey_end( &ctx );
+    }
+    else
+       rc = G10ERR_GENERAL; /* Oops */
+
+    return rc;
+}
+
+
+/****************
+ * Get a secret key by name and store it into sk
+ * If NAME is NULL use the default key
+ */
+static int
+get_seckey_byname2( GETKEY_CTX *retctx,
+                   PKT_secret_key *sk, const char *name, int unprotect,
+                   KBNODE *retblock )
+{
+  STRLIST namelist = NULL;
+  int rc,include_unusable=1;
+
+  /* If we have no name, try to use the default secret key.  If we
+     have no default, we'll use the first usable one. */
+
+  if( !name && opt.def_secret_key && *opt.def_secret_key )
+    add_to_strlist( &namelist, opt.def_secret_key );
+  else if(name)
+    add_to_strlist( &namelist, name );
+  else
+    include_unusable=0;
+
+  rc = key_byname( retctx, namelist, NULL, sk, 1, include_unusable,
+                  retblock, NULL );
+
+  free_strlist( namelist );
+
+  if( !rc && unprotect )
+    rc = check_secret_key( sk, 0 );
+
+  return rc;
+}
+
+int 
+get_seckey_byname( PKT_secret_key *sk, const char *name, int unlock )
+{
+    return get_seckey_byname2 ( NULL, sk, name, unlock, NULL );
+}
+
+
+int
+get_seckey_bynames( GETKEY_CTX *retctx, PKT_secret_key *sk,
+                   STRLIST names, KBNODE *ret_keyblock )
+{
+    return key_byname( retctx, names, NULL, sk, 1, 1, ret_keyblock, NULL );
+}
+
+
+int
+get_seckey_next( GETKEY_CTX ctx, PKT_secret_key *sk, KBNODE *ret_keyblock )
+{
+    int rc;
+
+    rc = lookup( ctx, ret_keyblock, 1 );
+    if ( !rc && sk && ret_keyblock )
+        sk_from_block ( ctx, sk, *ret_keyblock );
+
+    return rc;
+}
+
+
+void
+get_seckey_end( GETKEY_CTX ctx )
+{
+    get_pubkey_end( ctx );
+}
+
+
+/****************
+ * Search for a key with the given fingerprint.
+ * FIXME:
+ * We should replace this with the _byname function.  Thiscsan be done
+ * by creating a userID conforming to the unified fingerprint style. 
+ */
+int
+get_seckey_byfprint( PKT_secret_key *sk,
+                     const byte *fprint, size_t fprint_len)
+{
+    int rc;
+
+    if( fprint_len == 20 || fprint_len == 16 ) {
+       struct getkey_ctx_s ctx;
+        KBNODE kb = NULL;
+
+       memset( &ctx, 0, sizeof ctx );
+        ctx.exact = 1 ;
+       ctx.not_allocated = 1;
+        ctx.kr_handle = keydb_new (1);
+       ctx.nitems = 1;
+       ctx.items[0].mode = fprint_len==16? KEYDB_SEARCH_MODE_FPR16
+                                          : KEYDB_SEARCH_MODE_FPR20;
+       memcpy( ctx.items[0].u.fpr, fprint, fprint_len );
+       rc = lookup( &ctx, &kb, 1 );
+        if (!rc && sk )
+            sk_from_block ( &ctx, sk, kb );
+        release_kbnode ( kb );
+       get_seckey_end( &ctx );
+    }
+    else
+       rc = G10ERR_GENERAL; /* Oops */
+    return rc;
+}
+
+
+/* Search for a secret key with the given fingerprint and return the
+   complete keyblock which may have more than only this key. */
+int
+get_seckeyblock_byfprint (KBNODE *ret_keyblock, const byte *fprint,
+                          size_t fprint_len )
+{
+  int rc;
+  struct getkey_ctx_s ctx;
+  
+  if (fprint_len != 20 && fprint_len == 16)
+    return G10ERR_GENERAL; /* Oops */
+    
+  memset (&ctx, 0, sizeof ctx);
+  ctx.not_allocated = 1;
+  ctx.kr_handle = keydb_new (1);
+  ctx.nitems = 1;
+  ctx.items[0].mode = (fprint_len==16
+                       ? KEYDB_SEARCH_MODE_FPR16
+                       : KEYDB_SEARCH_MODE_FPR20);
+  memcpy (ctx.items[0].u.fpr, fprint, fprint_len);
+  rc = lookup (&ctx, ret_keyblock, 1);
+  get_seckey_end (&ctx);
+  
+  return rc;
+}
+
+
+\f
+/************************************************
+ ************* Merging stuff ********************
+ ************************************************/
+
+/****************
+ * merge all selfsignatures with the keys.
+ * FIXME: replace this at least for the public key parts
+ *        by merge_selfsigs.
+ *        It is still used in keyedit.c and
+ *        at 2 or 3 other places - check whether it is really needed.
+ *        It might be needed by the key edit and import stuff because
+ *        the keylock is changed.
+ */
+void
+merge_keys_and_selfsig( KBNODE keyblock )
+{
+    PKT_public_key *pk = NULL;
+    PKT_secret_key *sk = NULL;
+    PKT_signature *sig;
+    KBNODE k;
+    u32 kid[2] = { 0, 0 };
+    u32 sigdate = 0;
+
+    if (keyblock && keyblock->pkt->pkttype == PKT_PUBLIC_KEY ) {
+        /* divert to our new function */
+        merge_selfsigs (keyblock);
+        return;
+    }
+    /* still need the old one because the new one can't handle secret keys */
+
+    for(k=keyblock; k; k = k->next ) {
+       if( k->pkt->pkttype == PKT_PUBLIC_KEY
+           || k->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+           pk = k->pkt->pkt.public_key; sk = NULL;
+           if( pk->version < 4 )
+               pk = NULL; /* not needed for old keys */
+           else if( k->pkt->pkttype == PKT_PUBLIC_KEY )
+               keyid_from_pk( pk, kid );
+           else if( !pk->expiredate ) { /* and subkey */
+               /* insert the expiration date here */
+               /*FIXME!!! pk->expiredate = subkeys_expiretime( k, kid );*/
+           }
+           sigdate = 0;
+       }
+       else if( k->pkt->pkttype == PKT_SECRET_KEY
+           || k->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+           pk = NULL; sk = k->pkt->pkt.secret_key;
+           if( sk->version < 4 )
+               sk = NULL;
+           else if( k->pkt->pkttype == PKT_SECRET_KEY )
+               keyid_from_sk( sk, kid );
+           sigdate = 0;
+       }
+       else if( (pk || sk ) && k->pkt->pkttype == PKT_SIGNATURE
+                && (sig=k->pkt->pkt.signature)->sig_class >= 0x10
+                && sig->sig_class <= 0x30 && sig->version > 3
+                && !(sig->sig_class == 0x18 || sig->sig_class == 0x28)
+                && sig->keyid[0] == kid[0] && sig->keyid[1] == kid[1] ) {
+           /* okay this is a self-signature which can be used.
+            * This is not used for subkey binding signature, becuase this
+            * is done above.
+            * FIXME: We should only use this if the signature is valid
+            *        but this is time consuming - we must provide another
+            *        way to handle this
+            */
+           const byte *p;
+           u32 ed;
+
+           p = parse_sig_subpkt( sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL );
+           if( pk ) {
+               ed = p? pk->timestamp + buffer_to_u32(p):0;
+               if( sig->timestamp > sigdate ) {
+                   pk->expiredate = ed;
+                   sigdate = sig->timestamp;
+               }
+           }
+           else {
+               ed = p? sk->timestamp + buffer_to_u32(p):0;
+               if( sig->timestamp > sigdate ) {
+                   sk->expiredate = ed;
+                   sigdate = sig->timestamp;
+               }
+           }
+       }
+
+       if(pk && (pk->expiredate==0 ||
+                 (pk->max_expiredate && pk->expiredate>pk->max_expiredate)))
+         pk->expiredate=pk->max_expiredate;
+
+       if(sk && (sk->expiredate==0 ||
+                 (sk->max_expiredate && sk->expiredate>sk->max_expiredate)))
+         sk->expiredate=sk->max_expiredate;
+    }
+}
+
+static int
+parse_key_usage(PKT_signature *sig)
+{
+  int key_usage=0;
+  const byte *p;
+  size_t n;
+  byte flags;
+
+  p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_KEY_FLAGS,&n);
+  if(p && n)
+    {
+      /* first octet of the keyflags */
+      flags=*p;
+
+      if(flags & 1)
+       {
+         key_usage |= PUBKEY_USAGE_CERT;
+         flags&=~1;
+       }
+
+      if(flags & 2)
+       {
+         key_usage |= PUBKEY_USAGE_SIG;
+         flags&=~2;
+       }
+
+      /* We do not distinguish between encrypting communications and
+        encrypting storage. */
+      if(flags & (0x04|0x08))
+       {
+         key_usage |= PUBKEY_USAGE_ENC;
+         flags&=~(0x04|0x08);
+       }
+
+      if(flags & 0x20)
+       {
+         key_usage |= PUBKEY_USAGE_AUTH;
+         flags&=~0x20;
+       }
+
+      if(flags)
+       key_usage |= PUBKEY_USAGE_UNKNOWN;
+    }
+
+  /* We set PUBKEY_USAGE_UNKNOWN to indicate that this key has a
+     capability that we do not handle.  This serves to distinguish
+     between a zero key usage which we handle as the default
+     capabilities for that algorithm, and a usage that we do not
+     handle. */
+
+  return key_usage;
+}
+
+/*
+ * Apply information from SIGNODE (which is the valid self-signature
+ * associated with that UID) to the UIDNODE:
+ * - wether the UID has been revoked
+ * - assumed creation date of the UID
+ * - temporary store the keyflags here
+ * - temporary store the key expiration time here
+ * - mark whether the primary user ID flag hat been set.
+ * - store the preferences
+ */
+static void
+fixup_uidnode ( KBNODE uidnode, KBNODE signode, u32 keycreated )
+{
+    PKT_user_id   *uid = uidnode->pkt->pkt.user_id;
+    PKT_signature *sig = signode->pkt->pkt.signature;
+    const byte *p, *sym, *hash, *zip;
+    size_t n, nsym, nhash, nzip;
+
+    sig->flags.chosen_selfsig = 1; /* we chose this one */
+    uid->created = 0; /* not created == invalid */
+    if ( IS_UID_REV ( sig ) ) {
+        uid->is_revoked = 1;
+        return; /* has been revoked */
+    }
+
+    uid->expiredate = sig->expiredate;
+
+    if(sig->flags.expired)
+      {
+       uid->is_expired = 1;
+       return; /* has expired */
+      }
+
+    uid->created = sig->timestamp; /* this one is okay */
+    uid->selfsigversion = sig->version;
+    /* If we got this far, it's not expired :) */
+    uid->is_expired = 0;
+
+    /* store the key flags in the helper variable for later processing */
+    uid->help_key_usage=parse_key_usage(sig);
+
+    /* ditto for the key expiration */
+    p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
+    if( p && buffer_to_u32(p) )
+      uid->help_key_expire = keycreated + buffer_to_u32(p);
+    else
+      uid->help_key_expire = 0;
+
+    /* Set the primary user ID flag - we will later wipe out some
+     * of them to only have one in our keyblock */
+    uid->is_primary = 0;
+    p = parse_sig_subpkt ( sig->hashed, SIGSUBPKT_PRIMARY_UID, NULL );
+    if ( p && *p )
+        uid->is_primary = 2;
+    /* We could also query this from the unhashed area if it is not in
+     * the hased area and then later try to decide which is the better
+     * there should be no security problem with this.
+     * For now we only look at the hashed one. 
+     */
+
+    /* Now build the preferences list.  These must come from the
+       hashed section so nobody can modify the ciphers a key is
+       willing to accept. */
+    p = parse_sig_subpkt ( sig->hashed, SIGSUBPKT_PREF_SYM, &n );
+    sym = p; nsym = p?n:0;
+    p = parse_sig_subpkt ( sig->hashed, SIGSUBPKT_PREF_HASH, &n );
+    hash = p; nhash = p?n:0;
+    p = parse_sig_subpkt ( sig->hashed, SIGSUBPKT_PREF_COMPR, &n );
+    zip = p; nzip = p?n:0;
+    if (uid->prefs) 
+        xfree (uid->prefs);
+    n = nsym + nhash + nzip;
+    if (!n)
+        uid->prefs = NULL;
+    else {
+        uid->prefs = xmalloc (sizeof (*uid->prefs) * (n+1));
+        n = 0;
+        for (; nsym; nsym--, n++) {
+            uid->prefs[n].type = PREFTYPE_SYM;
+            uid->prefs[n].value = *sym++;
+        }
+        for (; nhash; nhash--, n++) {
+            uid->prefs[n].type = PREFTYPE_HASH;
+            uid->prefs[n].value = *hash++;
+        }
+        for (; nzip; nzip--, n++) {
+            uid->prefs[n].type = PREFTYPE_ZIP;
+            uid->prefs[n].value = *zip++;
+        }
+        uid->prefs[n].type = PREFTYPE_NONE; /* end of list marker */
+        uid->prefs[n].value = 0;
+    }
+
+    /* see whether we have the MDC feature */
+    uid->flags.mdc = 0;
+    p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_FEATURES, &n);
+    if (p && n && (p[0] & 0x01))
+        uid->flags.mdc = 1;
+
+    /* and the keyserver modify flag */
+    uid->flags.ks_modify = 1;
+    p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KS_FLAGS, &n);
+    if (p && n && (p[0] & 0x80))
+        uid->flags.ks_modify = 0;
+}
+
+static void
+sig_to_revoke_info(PKT_signature *sig,struct revoke_info *rinfo)
+{
+  rinfo->date = sig->timestamp;
+  rinfo->algo = sig->pubkey_algo;
+  rinfo->keyid[0] = sig->keyid[0];
+  rinfo->keyid[1] = sig->keyid[1];
+}
+
+static void
+merge_selfsigs_main(KBNODE keyblock, int *r_revoked, struct revoke_info *rinfo)
+{
+    PKT_public_key *pk = NULL;
+    KBNODE k;
+    u32 kid[2];
+    u32 sigdate, uiddate, uiddate2;
+    KBNODE signode, uidnode, uidnode2;
+    u32 curtime = make_timestamp ();
+    unsigned int key_usage = 0;
+    u32 keytimestamp = 0;
+    u32 key_expire = 0;
+    int key_expire_seen = 0;
+    byte sigversion = 0;
+
+    *r_revoked = 0;
+    memset(rinfo,0,sizeof(*rinfo));
+
+    if ( keyblock->pkt->pkttype != PKT_PUBLIC_KEY )
+        BUG ();
+    pk = keyblock->pkt->pkt.public_key;
+    keytimestamp = pk->timestamp;
+
+    keyid_from_pk( pk, kid );
+    pk->main_keyid[0] = kid[0];
+    pk->main_keyid[1] = kid[1];
+
+    if ( pk->version < 4 ) {
+        /* before v4 the key packet itself contains the expiration
+         * date and there was no way to change it, so we start with
+         * the one from the key packet */
+        key_expire = pk->max_expiredate;
+        key_expire_seen = 1;
+    }
+
+    /* first pass: find the latest direct key self-signature.
+     * We assume that the newest one overrides all others
+     */
+
+    /* In case this key was already merged */
+    xfree(pk->revkey);
+    pk->revkey=NULL;
+    pk->numrevkeys=0;
+
+    signode = NULL;
+    sigdate = 0; /* helper to find the latest signature */
+    for(k=keyblock; k && k->pkt->pkttype != PKT_USER_ID; k = k->next ) {
+        if ( k->pkt->pkttype == PKT_SIGNATURE ) {
+            PKT_signature *sig = k->pkt->pkt.signature;
+            if ( sig->keyid[0] == kid[0] && sig->keyid[1]==kid[1] ) { 
+               if ( check_key_signature( keyblock, k, NULL ) )
+                    ; /* signature did not verify */
+                else if ( IS_KEY_REV (sig) ){
+                    /* key has been revoked - there is no way to override
+                     * such a revocation, so we theoretically can stop now.
+                     * We should not cope with expiration times for revocations
+                     * here because we have to assume that an attacker can
+                     * generate all kinds of signatures.  However due to the
+                     * fact that the key has been revoked it does not harm
+                     * either and by continuing we gather some more info on 
+                     * that key.
+                     */ 
+                    *r_revoked = 1;
+                   sig_to_revoke_info(sig,rinfo);
+                }
+                else if ( IS_KEY_SIG (sig) ) {
+                 /* Add any revocation keys onto the pk.  This is
+                    particularly interesting since we normally only
+                    get data from the most recent 1F signature, but
+                    you need multiple 1F sigs to properly handle
+                    revocation keys (PGP does it this way, and a
+                    revocation key could be sensitive and hence in a
+                    different signature). */
+                 if(sig->revkey) {
+                   int i;
+
+                   pk->revkey=
+                     xrealloc(pk->revkey,sizeof(struct revocation_key)*
+                               (pk->numrevkeys+sig->numrevkeys));
+
+                   for(i=0;i<sig->numrevkeys;i++)
+                     memcpy(&pk->revkey[pk->numrevkeys++],
+                            sig->revkey[i],
+                            sizeof(struct revocation_key));
+                 }
+
+                 if( sig->timestamp >= sigdate ) {
+                   if(sig->flags.expired)
+                        ; /* signature has expired - ignore it */
+                    else {
+                        sigdate = sig->timestamp;
+                        signode = k;
+                       if( sig->version > sigversion )
+                         sigversion = sig->version;
+
+                   }
+                 }
+                }
+            }
+        }
+    }
+
+    /* Remove dupes from the revocation keys */
+
+    if(pk->revkey)
+      {
+       int i,j,x,changed=0;
+
+       for(i=0;i<pk->numrevkeys;i++)
+         {
+           for(j=i+1;j<pk->numrevkeys;j++)
+             {
+               if(memcmp(&pk->revkey[i],&pk->revkey[j],
+                         sizeof(struct revocation_key))==0)
+                 {
+                   /* remove j */
+
+                   for(x=j;x<pk->numrevkeys-1;x++)
+                     pk->revkey[x]=pk->revkey[x+1];
+
+                   pk->numrevkeys--;
+                   j--;
+                   changed=1;
+                 }
+             }
+         }
+
+       if(changed)
+         pk->revkey=xrealloc(pk->revkey,
+                              pk->numrevkeys*sizeof(struct revocation_key));
+      }
+
+    if ( signode )
+      {
+        /* some information from a direct key signature take precedence
+         * over the same information given in UID sigs.
+         */
+        PKT_signature *sig = signode->pkt->pkt.signature;
+        const byte *p;
+
+       key_usage=parse_key_usage(sig);
+
+       p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
+       if( p && buffer_to_u32(p) )
+         {
+           key_expire = keytimestamp + buffer_to_u32(p);
+           key_expire_seen = 1;
+         }
+
+        /* mark that key as valid: one direct key signature should 
+         * render a key as valid */
+        pk->is_valid = 1;
+      }
+
+    /* pass 1.5: look for key revocation signatures that were not made
+       by the key (i.e. did a revocation key issue a revocation for
+       us?).  Only bother to do this if there is a revocation key in
+       the first place and we're not revoked already. */
+
+    if(!*r_revoked && pk->revkey)
+      for(k=keyblock; k && k->pkt->pkttype != PKT_USER_ID; k = k->next )
+       {
+         if ( k->pkt->pkttype == PKT_SIGNATURE )
+           {
+             PKT_signature *sig = k->pkt->pkt.signature;
+
+             if(IS_KEY_REV(sig) &&
+                (sig->keyid[0]!=kid[0] || sig->keyid[1]!=kid[1]))
+               { 
+                 int rc=check_revocation_keys(pk,sig);
+                 if(rc==0)
+                   {
+                     *r_revoked=2;
+                     sig_to_revoke_info(sig,rinfo);
+                     /* don't continue checking since we can't be any
+                        more revoked than this */
+                     break;
+                   }
+                 else if(rc==G10ERR_NO_PUBKEY)
+                   pk->maybe_revoked=1;
+
+                 /* A failure here means the sig did not verify, was
+                    not issued by a revocation key, or a revocation
+                    key loop was broken.  If a revocation key isn't
+                    findable, however, the key might be revoked and
+                    we don't know it. */
+
+                 /* TODO: In the future handle subkey and cert
+                     revocations?  PGP doesn't, but it's in 2440. */
+               }
+           }
+       }
+
+    /* second pass: look at the self-signature of all user IDs */
+    signode = uidnode = NULL;
+    sigdate = 0; /* helper to find the latest signature in one user ID */
+    for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k = k->next ) {
+       if ( k->pkt->pkttype == PKT_USER_ID ) {
+            if ( uidnode && signode ) 
+             {
+                fixup_uidnode ( uidnode, signode, keytimestamp );
+               pk->is_valid=1;
+             }
+            uidnode = k;
+            signode = NULL;
+            sigdate = 0;
+       }
+        else if ( k->pkt->pkttype == PKT_SIGNATURE && uidnode ) {
+            PKT_signature *sig = k->pkt->pkt.signature;
+            if ( sig->keyid[0] == kid[0] && sig->keyid[1]==kid[1] ) { 
+                if ( check_key_signature( keyblock, k, NULL ) )
+                    ; /* signature did not verify */
+                else if ( (IS_UID_SIG (sig) || IS_UID_REV (sig))
+                          && sig->timestamp >= sigdate )
+                 {
+                    /* Note: we allow to invalidate cert revocations
+                     * by a newer signature.  An attacker can't use this
+                     * because a key should be revoced with a key revocation.
+                     * The reason why we have to allow for that is that at
+                     * one time an email address may become invalid but later
+                     * the same email address may become valid again (hired,
+                     * fired, hired again).
+                     */
+
+                   sigdate = sig->timestamp;
+                   signode = k;
+                   signode->pkt->pkt.signature->flags.chosen_selfsig=0;
+                   if( sig->version > sigversion )
+                     sigversion = sig->version;
+                 }
+            }
+        }
+    }
+    if ( uidnode && signode ) {
+        fixup_uidnode ( uidnode, signode, keytimestamp );
+        pk->is_valid = 1;
+    }
+
+    /* If the key isn't valid yet, and we have
+       --allow-non-selfsigned-uid set, then force it valid. */
+    if(!pk->is_valid && opt.allow_non_selfsigned_uid)
+      {
+       if(opt.verbose)
+         log_info(_("Invalid key %s made valid by"
+                    " --allow-non-selfsigned-uid\n"),keystr_from_pk(pk));
+       pk->is_valid = 1;
+      }
+
+    /* The key STILL isn't valid, so try and find an ultimately
+       trusted signature. */
+    if(!pk->is_valid)
+      {
+       uidnode=NULL;
+
+       for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k=k->next)
+         {
+           if ( k->pkt->pkttype == PKT_USER_ID )
+             uidnode = k;
+           else if ( k->pkt->pkttype == PKT_SIGNATURE && uidnode )
+             {
+               PKT_signature *sig = k->pkt->pkt.signature;
+
+               if(sig->keyid[0] != kid[0] || sig->keyid[1]!=kid[1])
+                 {
+                   PKT_public_key *ultimate_pk;
+
+                   ultimate_pk=xmalloc_clear(sizeof(*ultimate_pk));
+
+                    /* We don't want to use the full get_pubkey to
+                       avoid infinite recursion in certain cases.
+                       There is no reason to check that an ultimately
+                       trusted key is still valid - if it has been
+                       revoked or the user should also renmove the
+                       ultimate trust flag.  */
+                   if(get_pubkey_fast(ultimate_pk,sig->keyid)==0
+                      && check_key_signature2(keyblock,k,ultimate_pk,
+                                              NULL,NULL,NULL,NULL)==0
+                      && get_ownertrust(ultimate_pk)==TRUST_ULTIMATE)
+                     {
+                       free_public_key(ultimate_pk);
+                       pk->is_valid=1;
+                       break;
+                     }
+
+                   free_public_key(ultimate_pk);
+                 }
+             }
+         }
+      }
+
+    /* Record the highest selfsig version so we know if this is a v3
+       key through and through, or a v3 key with a v4 selfsig
+       somewhere.  This is useful in a few places to know if the key
+       must be treated as PGP2-style or OpenPGP-style.  Note that a
+       selfsig revocation with a higher version number will also raise
+       this value.  This is okay since such a revocation must be
+       issued by the user (i.e. it cannot be issued by someone else to
+       modify the key behavior.) */
+
+    pk->selfsigversion=sigversion;
+
+    /* Now that we had a look at all user IDs we can now get some information
+     * from those user IDs.
+     */
+    
+    if ( !key_usage ) {
+        /* find the latest user ID with key flags set */
+        uiddate = 0; /* helper to find the latest user ID */
+        for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
+            k = k->next ) {
+            if ( k->pkt->pkttype == PKT_USER_ID ) {
+                PKT_user_id *uid = k->pkt->pkt.user_id;
+                if ( uid->help_key_usage && uid->created > uiddate ) {
+                    key_usage = uid->help_key_usage;
+                    uiddate = uid->created;
+                }
+            }
+       }
+    }
+    if ( !key_usage ) { /* no key flags at all: get it from the algo */
+        key_usage = openpgp_pk_algo_usage ( pk->pubkey_algo );
+    }
+    else { /* check that the usage matches the usage as given by the algo */
+        int x = openpgp_pk_algo_usage ( pk->pubkey_algo );
+        if ( x ) /* mask it down to the actual allowed usage */
+            key_usage &= x; 
+    }
+
+    /* Whatever happens, it's a primary key, so it can certify. */
+    pk->pubkey_usage = key_usage|PUBKEY_USAGE_CERT;
+
+    if ( !key_expire_seen ) {
+        /* find the latest valid user ID with a key expiration set 
+         * Note, that this may be a different one from the above because
+         * some user IDs may have no expiration date set */
+        uiddate = 0; 
+        for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
+            k = k->next ) {
+            if ( k->pkt->pkttype == PKT_USER_ID ) {
+                PKT_user_id *uid = k->pkt->pkt.user_id;
+                if ( uid->help_key_expire && uid->created > uiddate ) {
+                    key_expire = uid->help_key_expire;
+                    uiddate = uid->created;
+                }
+            }
+       }
+    }
+
+    /* Currently only v3 keys have a maximum expiration date, but I'll
+       bet v5 keys get this feature again. */
+    if(key_expire==0 || (pk->max_expiredate && key_expire>pk->max_expiredate))
+      key_expire=pk->max_expiredate;
+
+    pk->has_expired = key_expire >= curtime? 0 : key_expire;
+    pk->expiredate = key_expire;
+
+    /* Fixme: we should see how to get rid of the expiretime fields  but
+     * this needs changes at other places too. */
+
+    /* and now find the real primary user ID and delete all others */
+    uiddate = uiddate2 = 0;
+    uidnode = uidnode2 = NULL;
+    for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k = k->next ) {
+        if ( k->pkt->pkttype == PKT_USER_ID &&
+            !k->pkt->pkt.user_id->attrib_data) {
+            PKT_user_id *uid = k->pkt->pkt.user_id;
+            if (uid->is_primary)
+             {
+               if(uid->created > uiddate)
+                 {
+                   uiddate = uid->created;
+                   uidnode = k;
+                 }
+               else if(uid->created==uiddate && uidnode)
+                 {
+                   /* The dates are equal, so we need to do a
+                      different (and arbitrary) comparison.  This
+                      should rarely, if ever, happen.  It's good to
+                      try and guarantee that two different GnuPG
+                      users with two different keyrings at least pick
+                      the same primary. */
+                   if(cmp_user_ids(uid,uidnode->pkt->pkt.user_id)>0)
+                     uidnode=k;
+                 }
+             }
+           else
+             {
+               if(uid->created > uiddate2)
+                 {
+                   uiddate2 = uid->created;
+                   uidnode2 = k;
+                 }
+               else if(uid->created==uiddate2 && uidnode2)
+                 {
+                   if(cmp_user_ids(uid,uidnode2->pkt->pkt.user_id)>0)
+                     uidnode2=k;
+                 }
+             }
+        }
+    }
+    if ( uidnode ) {
+        for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
+            k = k->next ) {
+            if ( k->pkt->pkttype == PKT_USER_ID &&
+                !k->pkt->pkt.user_id->attrib_data) {
+                PKT_user_id *uid = k->pkt->pkt.user_id;
+                if ( k != uidnode ) 
+                    uid->is_primary = 0;
+            }
+        }
+    }
+    else if( uidnode2 ) {
+        /* none is flagged primary - use the latest user ID we have,
+          and disambiguate with the arbitrary packet comparison. */
+        uidnode2->pkt->pkt.user_id->is_primary = 1;
+    }
+    else
+      {
+       /* None of our uids were self-signed, so pick the one that
+          sorts first to be the primary.  This is the best we can do
+          here since there are no self sigs to date the uids. */
+
+       uidnode = NULL;
+
+       for(k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
+           k = k->next )
+         {
+           if(k->pkt->pkttype==PKT_USER_ID
+              && !k->pkt->pkt.user_id->attrib_data)
+             {
+               if(!uidnode)
+                 {
+                   uidnode=k;
+                   uidnode->pkt->pkt.user_id->is_primary=1;
+                   continue;
+                 }
+               else
+                 {
+                   if(cmp_user_ids(k->pkt->pkt.user_id,
+                                   uidnode->pkt->pkt.user_id)>0)
+                     {
+                       uidnode->pkt->pkt.user_id->is_primary=0;
+                       uidnode=k;
+                       uidnode->pkt->pkt.user_id->is_primary=1;
+                     }
+                   else
+                     k->pkt->pkt.user_id->is_primary=0; /* just to be
+                                                           safe */
+                 }
+             }
+         }
+      }
+}
+
+
+static void
+merge_selfsigs_subkey( KBNODE keyblock, KBNODE subnode )
+{
+    PKT_public_key *mainpk = NULL, *subpk = NULL;
+    PKT_signature *sig;
+    KBNODE k;
+    u32 mainkid[2];
+    u32 sigdate = 0;
+    KBNODE signode;
+    u32 curtime = make_timestamp ();
+    unsigned int key_usage = 0;
+    u32 keytimestamp = 0;
+    u32 key_expire = 0;
+    const byte *p;
+
+    if ( subnode->pkt->pkttype != PKT_PUBLIC_SUBKEY )
+        BUG ();
+    mainpk = keyblock->pkt->pkt.public_key;
+    if ( mainpk->version < 4 )
+        return; /* (actually this should never happen) */
+    keyid_from_pk( mainpk, mainkid );
+    subpk = subnode->pkt->pkt.public_key;
+    keytimestamp = subpk->timestamp;
+
+    subpk->is_valid = 0;
+    subpk->main_keyid[0] = mainpk->main_keyid[0];
+    subpk->main_keyid[1] = mainpk->main_keyid[1];
+
+    /* find the latest key binding self-signature. */
+    signode = NULL;
+    sigdate = 0; /* helper to find the latest signature */
+    for(k=subnode->next; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY;
+                                                        k = k->next ) {
+        if ( k->pkt->pkttype == PKT_SIGNATURE ) {
+            sig = k->pkt->pkt.signature;
+            if ( sig->keyid[0] == mainkid[0] && sig->keyid[1]==mainkid[1] ) { 
+               if ( check_key_signature( keyblock, k, NULL ) )
+                    ; /* signature did not verify */
+                else if ( IS_SUBKEY_REV (sig) ) {
+                 /* Note that this means that the date on a
+                     revocation sig does not matter - even if the
+                     binding sig is dated after the revocation sig,
+                     the subkey is still marked as revoked.  This
+                     seems ok, as it is just as easy to make new
+                     subkeys rather than re-sign old ones as the
+                     problem is in the distribution.  Plus, PGP (7)
+                     does this the same way.  */
+                    subpk->is_revoked = 1;
+                   sig_to_revoke_info(sig,&subpk->revoked);
+                    /* although we could stop now, we continue to 
+                     * figure out other information like the old expiration
+                     * time */
+                }
+                else if ( IS_SUBKEY_SIG (sig) && sig->timestamp >= sigdate )
+                 {
+                   if(sig->flags.expired)
+                     ; /* signature has expired - ignore it */
+                    else
+                     {
+                        sigdate = sig->timestamp;
+                        signode = k;
+                       signode->pkt->pkt.signature->flags.chosen_selfsig=0;
+                     }
+                 }
+            }
+        }
+    }
+
+    /* no valid key binding */
+    if ( !signode )
+      return;
+
+    sig = signode->pkt->pkt.signature;
+    sig->flags.chosen_selfsig=1; /* so we know which selfsig we chose later */
+
+    key_usage=parse_key_usage(sig);
+    if ( !key_usage )
+      {
+       /* no key flags at all: get it from the algo */
+        key_usage = openpgp_pk_algo_usage ( subpk->pubkey_algo );
+      }
+    else
+      {
+       /* check that the usage matches the usage as given by the algo */
+        int x = openpgp_pk_algo_usage ( subpk->pubkey_algo );
+        if ( x ) /* mask it down to the actual allowed usage */
+         key_usage &= x; 
+      }
+
+    subpk->pubkey_usage = key_usage;
+    
+    p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE, NULL);
+    if ( p && buffer_to_u32(p) )
+        key_expire = keytimestamp + buffer_to_u32(p);
+    else
+        key_expire = 0;
+    subpk->has_expired = key_expire >= curtime? 0 : key_expire;
+    subpk->expiredate = key_expire;
+
+    /* algo doesn't exist */
+    if(check_pubkey_algo(subpk->pubkey_algo))
+      return;
+
+    subpk->is_valid = 1;
+
+    /* Find the first 0x19 embedded signature on our self-sig. */
+    if(subpk->backsig==0)
+      {
+       int seq=0;
+       size_t n;
+
+       /* We do this while() since there may be other embedded
+          signatures in the future.  We only want 0x19 here. */
+       while((p=enum_sig_subpkt(sig->hashed,
+                                SIGSUBPKT_SIGNATURE,&n,&seq,NULL)))
+         if(n>3 && ((p[0]==3 && p[2]==0x19) || (p[0]==4 && p[1]==0x19)))
+           break;
+
+       if(p==NULL)
+         {
+           seq=0;
+           /* It is safe to have this in the unhashed area since the
+              0x19 is located on the selfsig for convenience, not
+              security. */
+           while((p=enum_sig_subpkt(sig->unhashed,SIGSUBPKT_SIGNATURE,
+                                    &n,&seq,NULL)))
+             if(n>3 && ((p[0]==3 && p[2]==0x19) || (p[0]==4 && p[1]==0x19)))
+               break;
+         }
+
+       if(p)
+         {
+           PKT_signature *backsig=xmalloc_clear(sizeof(PKT_signature));
+           IOBUF backsig_buf=iobuf_temp_with_content(p,n);
+
+           if(parse_signature(backsig_buf,PKT_SIGNATURE,n,backsig)==0)
+             {
+               if(check_backsig(mainpk,subpk,backsig)==0)
+                 subpk->backsig=2;
+               else
+                 subpk->backsig=1;
+             }
+
+           iobuf_close(backsig_buf);
+           free_seckey_enc(backsig);
+         }
+      }
+}
+
+
+/* 
+ * Merge information from the self-signatures with the key, so that
+ * we can later use them more easy.
+ * The function works by first applying the self signatures to the
+ * primary key and the to each subkey.
+ * Here are the rules we use to decide which inormation from which
+ * self-signature is used:
+ * We check all self signatures or validity and ignore all invalid signatures.
+ * All signatures are then ordered by their creation date ....
+ * For the primary key:
+ *   FIXME the docs    
+ */
+static void
+merge_selfsigs( KBNODE keyblock )
+{
+    KBNODE k;
+    int revoked;
+    struct revoke_info rinfo;
+    PKT_public_key *main_pk;
+    prefitem_t *prefs;
+    int mdc_feature;
+
+    if ( keyblock->pkt->pkttype != PKT_PUBLIC_KEY ) {
+        if (keyblock->pkt->pkttype == PKT_SECRET_KEY ) {
+            log_error ("expected public key but found secret key "
+                       "- must stop\n");
+            /* we better exit here becuase a public key is expected at
+               other places too.  FIXME: Figure this out earlier and
+               don't get to here at all */
+            g10_exit (1);
+        }
+        BUG ();
+    }
+
+    merge_selfsigs_main ( keyblock, &revoked, &rinfo );
+
+    /* now merge in the data from each of the subkeys */
+    for(k=keyblock; k; k = k->next ) {
+       if (  k->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+            merge_selfsigs_subkey ( keyblock, k );
+        }
+    }
+
+    main_pk = keyblock->pkt->pkt.public_key;
+    if ( revoked || main_pk->has_expired || !main_pk->is_valid ) {
+        /* if the primary key is revoked, expired, or invalid we
+         * better set the appropriate flags on that key and all
+         * subkeys */
+        for(k=keyblock; k; k = k->next ) {
+            if ( k->pkt->pkttype == PKT_PUBLIC_KEY
+                || k->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+                PKT_public_key *pk = k->pkt->pkt.public_key;
+               if(!main_pk->is_valid)
+                 pk->is_valid = 0;
+               if(revoked && !pk->is_revoked)
+                 {
+                   pk->is_revoked = revoked;
+                   memcpy(&pk->revoked,&rinfo,sizeof(rinfo));
+                 }
+                if(main_pk->has_expired)
+                 pk->has_expired = main_pk->has_expired;
+            }
+       }
+       return;
+    }
+
+    /* set the preference list of all keys to those of the primary real
+     * user ID.  Note: we use these preferences when we don't know by
+     * which user ID the key has been selected.
+     * fixme: we should keep atoms of commonly used preferences or
+     * use reference counting to optimize the preference lists storage.
+     * FIXME: it might be better to use the intersection of 
+     * all preferences.
+     * Do a similar thing for the MDC feature flag.
+     */
+    prefs = NULL;
+    mdc_feature = 0;
+    for (k=keyblock; k && k->pkt->pkttype != PKT_PUBLIC_SUBKEY; k = k->next) {
+        if (k->pkt->pkttype == PKT_USER_ID
+           && !k->pkt->pkt.user_id->attrib_data
+            && k->pkt->pkt.user_id->is_primary) {
+            prefs = k->pkt->pkt.user_id->prefs;
+            mdc_feature = k->pkt->pkt.user_id->flags.mdc;
+            break;
+        }
+    }    
+    for(k=keyblock; k; k = k->next ) {
+        if ( k->pkt->pkttype == PKT_PUBLIC_KEY
+             || k->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+            PKT_public_key *pk = k->pkt->pkt.public_key;
+            if (pk->prefs)
+                xfree (pk->prefs);
+            pk->prefs = copy_prefs (prefs);
+            pk->mdc_feature = mdc_feature;
+        }
+    }
+}
+
+
+/*
+ * Merge the secret keys from secblock into the pubblock thereby
+ * replacing the public (sub)keys with their secret counterparts Hmmm:
+ * It might be better to get away from the concept of entire secret
+ * keys at all and have a way to store just the real secret parts
+ * from the key.
+ */
+static void
+merge_public_with_secret ( KBNODE pubblock, KBNODE secblock )
+{
+    KBNODE pub;
+
+    assert ( pubblock->pkt->pkttype == PKT_PUBLIC_KEY );
+    assert ( secblock->pkt->pkttype == PKT_SECRET_KEY );
+    
+    for (pub=pubblock; pub; pub = pub->next ) {
+        if ( pub->pkt->pkttype == PKT_PUBLIC_KEY ) {
+             PKT_public_key *pk = pub->pkt->pkt.public_key;
+             PKT_secret_key *sk = secblock->pkt->pkt.secret_key;
+             assert ( pub == pubblock ); /* only in the first node */
+             /* there is nothing to compare in this case, so just replace
+              * some information */
+             copy_public_parts_to_secret_key ( pk, sk );
+             free_public_key ( pk );
+             pub->pkt->pkttype = PKT_SECRET_KEY;
+             pub->pkt->pkt.secret_key = copy_secret_key (NULL, sk);
+        }
+        else if ( pub->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+            KBNODE sec;
+            PKT_public_key *pk = pub->pkt->pkt.public_key;
+
+            /* this is more complicated: it may happen that the sequence
+             * of the subkeys dosn't match, so we have to find the
+             * appropriate secret key */
+            for (sec=secblock->next; sec; sec = sec->next ) {
+                if ( sec->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                    PKT_secret_key *sk = sec->pkt->pkt.secret_key;
+                    if ( !cmp_public_secret_key ( pk, sk ) ) {
+                        copy_public_parts_to_secret_key ( pk, sk );
+                        free_public_key ( pk );
+                        pub->pkt->pkttype = PKT_SECRET_SUBKEY;
+                        pub->pkt->pkt.secret_key = copy_secret_key (NULL, sk);
+                        break;
+                    }
+                }
+            }
+            if ( !sec ) 
+                BUG(); /* already checked in premerge */
+        }
+    }
+}
+
+/* This function checks that for every public subkey a corresponding
+ * secret subkey is available and deletes the public subkey otherwise.
+ * We need this function because we can't delete it later when we
+ * actually merge the secret parts into the pubring.
+ * The function also plays some games with the node flags.
+ */
+static void
+premerge_public_with_secret ( KBNODE pubblock, KBNODE secblock )
+{
+    KBNODE last, pub;
+
+    assert ( pubblock->pkt->pkttype == PKT_PUBLIC_KEY );
+    assert ( secblock->pkt->pkttype == PKT_SECRET_KEY );
+    
+    for (pub=pubblock,last=NULL; pub; last = pub, pub = pub->next ) {
+        pub->flag &= ~3; /* reset bits 0 and 1 */
+        if ( pub->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+            KBNODE sec;
+            PKT_public_key *pk = pub->pkt->pkt.public_key;
+
+            for (sec=secblock->next; sec; sec = sec->next ) {
+                if ( sec->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                    PKT_secret_key *sk = sec->pkt->pkt.secret_key;
+                    if ( !cmp_public_secret_key ( pk, sk ) ) {
+                        if ( sk->protect.s2k.mode == 1001 ) {
+                            /* The secret parts are not available so
+                               we can't use that key for signing etc.
+                               Fix the pubkey usage */
+                            pk->pubkey_usage &= ~(PUBKEY_USAGE_SIG
+                                                  |PUBKEY_USAGE_AUTH);
+                        }
+                        /* transfer flag bits 0 and 1 to the pubblock */
+                        pub->flag |= (sec->flag &3);
+                        break;
+                    }
+                }
+            }
+            if ( !sec ) {
+                KBNODE next, ll;
+
+                if (opt.verbose)
+                  log_info (_("no secret subkey"
+                             " for public subkey %s - ignoring\n"),  
+                           keystr_from_pk (pk));
+                /* we have to remove the subkey in this case */
+                assert ( last );
+                /* find the next subkey */
+                for (next=pub->next,ll=pub;
+                     next && next->pkt->pkttype != PKT_PUBLIC_SUBKEY;
+                     ll = next, next = next->next ) 
+                    ;
+                /* make new link */
+                last->next = next;
+                /* release this public subkey with all sigs */
+                ll->next = NULL;
+                release_kbnode( pub );
+                /* let the loop continue */
+                pub = last;
+            }
+        }
+    }
+    /* We need to copy the found bits (0 and 1) from the secret key to
+       the public key.  This has already been done for the subkeys but
+       got lost on the primary key - fix it here *. */
+    pubblock->flag |= (secblock->flag & 3);
+}
+
+
+
+\f
+/* See see whether the key fits
+ * our requirements and in case we do not
+ * request the primary key, we should select
+ * a suitable subkey.
+ * FIXME: Check against PGP 7 whether we still need a kludge
+ *        to favor type 16 keys over type 20 keys when type 20
+ *        has not been explitely requested.
+ * Returns: True when a suitable key has been found.
+ *
+ * We have to distinguish four cases:  FIXME!
+ *  1. No usage and no primary key requested
+ *     Examples for this case are that we have a keyID to be used
+ *     for decrytion or verification.
+ *  2. No usage but primary key requested
+ *     This is the case for all functions which work on an
+ *     entire keyblock, e.g. for editing or listing
+ *  3. Usage and primary key requested
+ *     FXME
+ *  4. Usage but no primary key requested
+ *     FIXME
+ * FIXME: Tell what is going to happen here and something about the rationale
+ * Note: We don't use this function if no specific usage is requested;
+ *       This way the getkey functions can be used for plain key listings.
+ *
+ * CTX ist the keyblock we are investigating, if FOUNDK is not NULL this
+ * is the key we actually found by looking at the keyid or a fingerprint and
+ * may eitehr point to the primary or one of the subkeys.
+ */
+
+static int
+finish_lookup (GETKEY_CTX ctx)
+{
+    KBNODE keyblock = ctx->keyblock;
+    KBNODE k;
+    KBNODE foundk = NULL;
+    PKT_user_id *foundu = NULL;
+#define USAGE_MASK  (PUBKEY_USAGE_SIG|PUBKEY_USAGE_ENC|PUBKEY_USAGE_CERT)
+    unsigned int req_usage = ( ctx->req_usage & USAGE_MASK );
+    /* Request the primary if we're certifying another key, and also
+       if signing data while --pgp6 or --pgp7 is on since pgp 6 and 7
+       do not understand signatures made by a signing subkey.  PGP 8
+       does. */
+    int req_prim = (ctx->req_usage & PUBKEY_USAGE_CERT) ||
+      ((PGP6 || PGP7) && (ctx->req_usage & PUBKEY_USAGE_SIG));
+    u32 latest_date;
+    KBNODE latest_key;
+    u32 curtime = make_timestamp ();
+
+    assert( keyblock->pkt->pkttype == PKT_PUBLIC_KEY );
+   
+    ctx->found_key = NULL;
+
+    if (ctx->exact) {
+        for (k=keyblock; k; k = k->next) {
+            if ( (k->flag & 1) ) {
+                assert ( k->pkt->pkttype == PKT_PUBLIC_KEY
+                         || k->pkt->pkttype == PKT_PUBLIC_SUBKEY );
+                foundk = k;
+                break;
+            }
+        }
+    }
+
+    for (k=keyblock; k; k = k->next) {
+        if ( (k->flag & 2) ) {
+            assert (k->pkt->pkttype == PKT_USER_ID);
+            foundu = k->pkt->pkt.user_id;
+            break;
+        }
+    }
+
+    if ( DBG_CACHE )
+        log_debug( "finish_lookup: checking key %08lX (%s)(req_usage=%x)\n",
+                   (ulong)keyid_from_pk( keyblock->pkt->pkt.public_key, NULL),
+                   foundk? "one":"all", req_usage);
+
+    if (!req_usage) {
+        latest_key = foundk? foundk:keyblock;
+        goto found;
+    }
+    
+    if (!req_usage) {
+        PKT_public_key *pk = foundk->pkt->pkt.public_key;
+        if (pk->user_id)
+            free_user_id (pk->user_id);
+        pk->user_id = scopy_user_id (foundu);
+        ctx->found_key = foundk;
+        cache_user_id( keyblock );
+        return 1; /* found */
+    }
+    
+    latest_date = 0;
+    latest_key  = NULL;
+    /* do not look at subkeys if a certification key is requested */
+    if ((!foundk || foundk->pkt->pkttype == PKT_PUBLIC_SUBKEY) && !req_prim) {
+        KBNODE nextk;
+        /* either start a loop or check just this one subkey */
+        for (k=foundk?foundk:keyblock; k; k = nextk ) {
+            PKT_public_key *pk;
+            nextk = k->next;
+            if ( k->pkt->pkttype != PKT_PUBLIC_SUBKEY )
+                continue;
+            if ( foundk )
+                nextk = NULL;  /* what a hack */
+            pk = k->pkt->pkt.public_key;
+            if (DBG_CACHE)
+                log_debug( "\tchecking subkey %08lX\n",
+                           (ulong)keyid_from_pk( pk, NULL));
+            if ( !pk->is_valid ) {
+                if (DBG_CACHE)
+                    log_debug( "\tsubkey not valid\n");
+                continue;
+            }
+            if ( pk->is_revoked ) {
+                if (DBG_CACHE)
+                    log_debug( "\tsubkey has been revoked\n");
+                continue;
+            }
+            if ( pk->has_expired ) {
+                if (DBG_CACHE)
+                    log_debug( "\tsubkey has expired\n");
+                continue;
+            }
+            if ( pk->timestamp > curtime && !opt.ignore_valid_from ) {
+                if (DBG_CACHE)
+                    log_debug( "\tsubkey not yet valid\n");
+                continue;
+            }
+            
+            if ( !((pk->pubkey_usage&USAGE_MASK) & req_usage) ) {
+                if (DBG_CACHE)
+                    log_debug( "\tusage does not match: want=%x have=%x\n",
+                               req_usage, pk->pubkey_usage );
+                continue;
+            }
+
+            if (DBG_CACHE)
+                log_debug( "\tsubkey looks fine\n");
+            if ( pk->timestamp > latest_date ) {
+                latest_date = pk->timestamp;
+                latest_key  = k;
+            }
+        }
+    }
+
+    /* Okay now try the primary key unless we want an exact 
+     * key ID match on a subkey */
+    if ((!latest_key && !(ctx->exact && foundk != keyblock)) || req_prim) {
+        PKT_public_key *pk;
+        if (DBG_CACHE && !foundk && !req_prim )
+            log_debug( "\tno suitable subkeys found - trying primary\n");
+        pk = keyblock->pkt->pkt.public_key;
+        if ( !pk->is_valid ) {
+            if (DBG_CACHE)
+                log_debug( "\tprimary key not valid\n");
+        }
+        else if ( pk->is_revoked ) {
+            if (DBG_CACHE)
+                log_debug( "\tprimary key has been revoked\n");
+        }
+        else if ( pk->has_expired ) {
+            if (DBG_CACHE)
+                log_debug( "\tprimary key has expired\n");
+        }
+        else  if ( !((pk->pubkey_usage&USAGE_MASK) & req_usage) ) {
+            if (DBG_CACHE)
+                log_debug( "\tprimary key usage does not match: "
+                           "want=%x have=%x\n",
+                           req_usage, pk->pubkey_usage );
+        }
+        else { /* okay */
+            if (DBG_CACHE)
+                log_debug( "\tprimary key may be used\n");
+            latest_key = keyblock;
+            latest_date = pk->timestamp;
+        }
+    }
+    
+    if ( !latest_key ) {
+        if (DBG_CACHE)
+            log_debug("\tno suitable key found -  giving up\n");
+        return 0;
+    }
+
+ found:
+    if (DBG_CACHE)
+        log_debug( "\tusing key %08lX\n",
+                (ulong)keyid_from_pk( latest_key->pkt->pkt.public_key, NULL) );
+
+    if (latest_key) {
+        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);
+    }    
+        
+    ctx->found_key = latest_key;
+
+    if (latest_key != keyblock && opt.verbose)
+      {
+       char *tempkeystr=
+         xstrdup(keystr_from_pk(latest_key->pkt->pkt.public_key));
+        log_info(_("using subkey %s instead of primary key %s\n"),
+                 tempkeystr, keystr_from_pk(keyblock->pkt->pkt.public_key));
+       xfree(tempkeystr);
+      }
+
+    cache_user_id( keyblock );
+    
+    return 1; /* found */
+}
+
+
+static int
+lookup( GETKEY_CTX ctx, KBNODE *ret_keyblock, int secmode )
+{
+    int rc;
+    KBNODE secblock = NULL; /* helper */
+    int no_suitable_key = 0;
+    
+    rc = 0;
+    while (!(rc = keydb_search (ctx->kr_handle, ctx->items, ctx->nitems))) {
+        /* If we are searching for the first key we have to make sure
+           that the next interation does not no an implicit reset.
+           This can be triggered by an empty key ring. */
+        if (ctx->nitems && ctx->items->mode == KEYDB_SEARCH_MODE_FIRST)
+            ctx->items->mode = KEYDB_SEARCH_MODE_NEXT;
+
+        rc = keydb_get_keyblock (ctx->kr_handle, &ctx->keyblock);
+        if (rc) {
+            log_error ("keydb_get_keyblock failed: %s\n", g10_errstr(rc));
+            rc = 0;
+            goto skip;
+        }
+                       
+        if ( secmode ) {
+            /* find the correspondig public key and use this 
+             * this one for the selection process */
+            u32 aki[2];
+            KBNODE k = ctx->keyblock;
+            
+            if (k->pkt->pkttype != PKT_SECRET_KEY)
+                BUG();
+
+            keyid_from_sk (k->pkt->pkt.secret_key, aki);
+            k = get_pubkeyblock (aki);
+            if( !k )
+             {
+                if (!opt.quiet)
+                 log_info(_("key %s: secret key without public key"
+                            " - skipped\n"), keystr(aki));
+                goto skip;
+             }
+            secblock = ctx->keyblock;
+            ctx->keyblock = k;
+
+            premerge_public_with_secret ( ctx->keyblock, secblock );
+        }
+
+        /* warning: node flag bits 0 and 1 should be preserved by
+         * merge_selfsigs.  For secret keys, premerge did tranfer the
+         * keys to the keyblock */
+        merge_selfsigs ( ctx->keyblock );
+        if ( finish_lookup (ctx) ) {
+            no_suitable_key = 0;
+            if ( secmode ) {
+                merge_public_with_secret ( ctx->keyblock,
+                                           secblock);
+                release_kbnode (secblock);
+                secblock = NULL;
+            }
+            goto found;
+        }
+        else
+            no_suitable_key = 1;
+        
+      skip:
+        /* release resources and continue search */
+        if ( secmode ) {
+            release_kbnode( secblock );
+            secblock = NULL;
+        }
+        release_kbnode( ctx->keyblock );
+        ctx->keyblock = NULL;
+    }
+
+  found:
+    if( rc && rc != -1 )
+       log_error("keydb_search failed: %s\n", g10_errstr(rc));
+
+    if( !rc ) {
+        *ret_keyblock = ctx->keyblock; /* return the keyblock */
+        ctx->keyblock = NULL;
+    }
+    else if (rc == -1 && no_suitable_key)
+        rc = secmode ? G10ERR_UNU_SECKEY : G10ERR_UNU_PUBKEY;
+    else if( rc == -1 )
+       rc = secmode ? G10ERR_NO_SECKEY : G10ERR_NO_PUBKEY;
+
+    if ( secmode ) {
+        release_kbnode( secblock );
+        secblock = NULL;
+    }
+    release_kbnode( ctx->keyblock );
+    ctx->keyblock = NULL;
+
+    ctx->last_rc = rc;
+    return rc;
+}
+
+
+
+
+/****************
+ * FIXME: Replace by the generic function 
+ *        It does not work as it is right now - it is used at 
+ *        2 places:  a) to get the key for an anonyous recipient
+ *                   b) to get the ultimately trusted keys.
+ *        The a) usage might have some problems.
+ *
+ * set with_subkeys true to include subkeys
+ * set with_spm true to include secret-parts-missing keys
+ *
+ * Enumerate all primary secret keys.  Caller must use these procedure:
+ *  1) create a void pointer and initialize it to NULL
+ *  2) pass this void pointer by reference to this function
+ *     and provide space for the secret key (pass a buffer for sk)
+ *  3) call this function as long as it does not return -1
+ *     to indicate EOF.
+ *  4) Always call this function a last time with SK set to NULL,
+ *     so that can free it's context.
+ */
+int
+enum_secret_keys( void **context, PKT_secret_key *sk,
+                 int with_subkeys, int with_spm )
+{
+    int rc=0;
+    struct {
+       int eof;
+        int first;
+       KEYDB_HANDLE hd;
+        KBNODE keyblock;
+        KBNODE node;
+    } *c = *context;
+
+
+    if( !c ) { /* make a new context */
+       c = xmalloc_clear( sizeof *c );
+       *context = c;
+       c->hd = keydb_new (1);
+        c->first = 1;
+        c->keyblock = NULL;
+        c->node = NULL;
+    }
+
+    if( !sk ) { /* free the context */
+        keydb_release (c->hd);
+        release_kbnode (c->keyblock);
+       xfree( c );
+       *context = NULL;
+       return 0;
+    }
+
+    if( c->eof )
+       return -1;
+
+    do {
+        /* get the next secret key from the current keyblock */
+        for (; c->node; c->node = c->node->next) {
+            if ((c->node->pkt->pkttype == PKT_SECRET_KEY
+                || (with_subkeys
+                    && c->node->pkt->pkttype == PKT_SECRET_SUBKEY) )
+               && !(c->node->pkt->pkt.secret_key->protect.s2k.mode==1001
+                    && !with_spm)) {
+                copy_secret_key (sk, c->node->pkt->pkt.secret_key );
+                c->node = c->node->next;
+                return 0; /* found */
+            }
+        }
+        release_kbnode (c->keyblock);
+        c->keyblock = c->node = NULL;
+        
+        rc = c->first? keydb_search_first (c->hd) : keydb_search_next (c->hd);
+        c->first = 0;
+        if (rc) {
+            keydb_release (c->hd); c->hd = NULL;
+            c->eof = 1;
+            return -1; /* eof */
+        }
+        
+        rc = keydb_get_keyblock (c->hd, &c->keyblock);
+        c->node = c->keyblock;
+    } while (!rc);
+
+    return rc; /* error */
+}
+
+
+\f
+/*********************************************
+ ***********  user ID printing helpers *******
+ *********************************************/
+
+/****************
+ * Return a string with a printable representation of the user_id.
+ * this string must be freed by xfree.
+ */
+char*
+get_user_id_string( u32 *keyid )
+{
+  user_id_db_t r;
+  char *p;
+  int pass=0;
+  /* try it two times; second pass reads from key resources */
+  do
+    {
+      for(r=user_id_db; r; r = r->next )
+       {
+         keyid_list_t a;
+         for (a=r->keyids; a; a= a->next )
+           {
+             if( a->keyid[0] == keyid[0] && a->keyid[1] == keyid[1] )
+               {
+                 p = xmalloc( keystrlen() + 1 + r->len + 1 );
+                 sprintf(p, "%s %.*s", keystr(keyid), r->len, r->name );
+                 return p;
+               }
+           }
+        }
+    } while( ++pass < 2 && !get_pubkey( NULL, keyid ) );
+  p = xmalloc( keystrlen() + 5 );
+  sprintf(p, "%s [?]", keystr(keyid));
+  return p;
+}
+
+
+char*
+get_user_id_string_native ( u32 *keyid )
+{
+  char *p = get_user_id_string( keyid );
+  char *p2 = utf8_to_native( p, strlen(p), 0 );
+  xfree(p);
+  return p2;
+}
+
+
+char*
+get_long_user_id_string( u32 *keyid )
+{
+    user_id_db_t r;
+    char *p;
+    int pass=0;
+    /* try it two times; second pass reads from key resources */
+    do {
+       for(r=user_id_db; r; r = r->next ) {
+            keyid_list_t a;
+            for (a=r->keyids; a; a= a->next ) {
+                if( a->keyid[0] == keyid[0] && a->keyid[1] == keyid[1] ) {
+                    p = xmalloc( r->len + 20 );
+                    sprintf(p, "%08lX%08lX %.*s",
+                            (ulong)keyid[0], (ulong)keyid[1],
+                            r->len, r->name );
+                    return p;
+                }
+            }
+        }
+    } while( ++pass < 2 && !get_pubkey( NULL, keyid ) );
+    p = xmalloc( 25 );
+    sprintf(p, "%08lX%08lX [?]", (ulong)keyid[0], (ulong)keyid[1] );
+    return p;
+}
+
+char*
+get_user_id( u32 *keyid, size_t *rn )
+{
+    user_id_db_t r;
+    char *p;
+    int pass=0;
+
+    /* try it two times; second pass reads from key resources */
+    do {
+       for(r=user_id_db; r; r = r->next ) {
+            keyid_list_t a;
+            for (a=r->keyids; a; a= a->next ) {
+                if( a->keyid[0] == keyid[0] && a->keyid[1] == keyid[1] ) {
+                    p = xmalloc( r->len );
+                    memcpy(p, r->name, r->len );
+                    *rn = r->len;
+                    return p;
+                }
+            }
+        }
+    } while( ++pass < 2 && !get_pubkey( NULL, keyid ) );
+    p = xstrdup( user_id_not_found_utf8 () );
+    *rn = strlen(p);
+    return p;
+}
+
+char*
+get_user_id_native( u32 *keyid )
+{
+  size_t rn;
+  char *p = get_user_id( keyid, &rn );
+  char *p2 = utf8_to_native( p, rn, 0 );
+  xfree(p);
+  return p2;
+}
+
+KEYDB_HANDLE
+get_ctx_handle(GETKEY_CTX ctx)
+{
+  return ctx->kr_handle;
+}
+
+static void
+free_akl(struct akl *akl)
+{
+  if(akl->spec)
+    free_keyserver_spec(akl->spec);
+
+  xfree(akl);
+}
+
+void
+release_akl(void)
+{
+  while(opt.auto_key_locate)
+    {
+      struct akl *akl2=opt.auto_key_locate;
+      opt.auto_key_locate=opt.auto_key_locate->next;
+      free_akl(akl2);
+    }
+}
+
+int
+parse_auto_key_locate(char *options)
+{
+  char *tok;
+
+  while((tok=optsep(&options)))
+    {
+      struct akl *akl,*check,*last=NULL;
+      int dupe=0;
+
+      if(tok[0]=='\0')
+       continue;
+
+      akl=xmalloc_clear(sizeof(*akl));
+
+      if(ascii_strcasecmp(tok,"ldap")==0)
+       akl->type=AKL_LDAP;
+      else if(ascii_strcasecmp(tok,"keyserver")==0)
+       akl->type=AKL_KEYSERVER;
+#ifdef USE_DNS_CERT
+      else if(ascii_strcasecmp(tok,"cert")==0)
+       akl->type=AKL_CERT;
+#endif
+#ifdef USE_DNS_PKA
+      else if(ascii_strcasecmp(tok,"pka")==0)
+       akl->type=AKL_PKA;
+#endif
+      else if((akl->spec=parse_keyserver_uri(tok,1,NULL,0)))
+       akl->type=AKL_SPEC;
+      else
+       {
+         free_akl(akl);
+         return 0;
+       }
+
+      /* We must maintain the order the user gave us */
+      for(check=opt.auto_key_locate;check;last=check,check=check->next)
+       {
+         /* Check for duplicates */
+         if(check->type==akl->type
+            && (akl->type!=AKL_SPEC
+                || (akl->type==AKL_SPEC
+                    && strcmp(check->spec->uri,akl->spec->uri)==0)))
+           {
+             dupe=1;
+             free_akl(akl);
+             break;
+           }
+       }
+
+      if(!dupe)
+       {
+         if(last)
+           last->next=akl;
+         else
+           opt.auto_key_locate=akl;
+       }
+    }
+
+  return 1;
+}
diff --git a/g10/global.h b/g10/global.h
new file mode 100644 (file)
index 0000000..1b2f872
--- /dev/null
@@ -0,0 +1,30 @@
+/* global.h - Local typedefs and constants
+ * Copyright (C) 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef GPG_GLOBAL_H
+#define GPG_GLOBAL_H
+
+#define MAX_FINGERPRINT_LEN 20
+
+typedef struct kbnode_struct *KBNODE;
+typedef struct keydb_search_desc KEYDB_SEARCH_DESC;
+
+#endif /*GPG_GLOBAL_H*/
diff --git a/g10/gpg.c b/g10/gpg.c
new file mode 100644 (file)
index 0000000..691cfff
--- /dev/null
+++ b/g10/gpg.c
@@ -0,0 +1,4207 @@
+/* gpg.c - The GnuPG utility (main for gpg)
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <assert.h>
+#ifdef HAVE_DOSISH_SYSTEM
+#include <fcntl.h> /* for setmode() */
+#endif
+#ifdef HAVE_STAT
+#include <sys/stat.h> /* for stat() */
+#endif
+#include <fcntl.h>
+#ifdef HAVE_W32_SYSTEM
+#include <windows.h>
+#endif
+
+#define INCLUDED_BY_MAIN_MODULE 1
+#include "packet.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "options.h"
+#include "keydb.h"
+#include "trustdb.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "filter.h"
+#include "ttyio.h"
+#include "i18n.h"
+#include "status.h"
+#include "g10defs.h"
+#include "keyserver-internal.h"
+#include "exec.h"
+#include "cardglue.h"
+#ifdef ENABLE_CARD_SUPPORT
+#include "ccid-driver.h"
+#endif
+
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
+#define MY_O_BINARY  O_BINARY
+#ifndef S_IRGRP
+# define S_IRGRP 0
+# define S_IWGRP 0
+#endif
+#else
+#define MY_O_BINARY  0
+#endif
+
+
+enum cmd_and_opt_values
+  {
+    aNull = 0,
+    oArmor       = 'a',
+    aDetachedSign = 'b',
+    aSym         = 'c',
+    aDecrypt     = 'd',
+    aEncr        = 'e',
+    oInteractive  = 'i',
+    oKOption     = 'k',
+    oDryRun      = 'n',
+    oOutput      = 'o',
+    oQuiet       = 'q',
+    oRecipient   = 'r',
+    oHiddenRecipient = 'R',
+    aSign        = 's',
+    oTextmodeShort= 't',
+    oLocalUser   = 'u',
+    oVerbose     = 'v',
+    oCompress    = 'z',
+    oSetNotation  = 'N',
+    aListSecretKeys = 'K',
+    oBatch       = 500,
+    oMaxOutput,
+    oSigNotation,
+    oCertNotation,
+    oShowNotation,
+    oNoShowNotation,
+    aEncrFiles,
+    aEncrSym,
+    aDecryptFiles,
+    aClearsign,
+    aStore,
+    aKeygen,
+    aSignEncr,
+    aSignEncrSym,
+    aSignSym,
+    aSignKey,
+    aLSignKey,
+    aListConfig,
+    aGPGConfList,
+    aGPGConfTest,
+    aListPackets,
+    aEditKey,
+    aDeleteKeys,
+    aDeleteSecretKeys,
+    aDeleteSecretAndPublicKeys,
+    aKMode,
+    aKModeC,
+    aImport,
+    aFastImport,
+    aVerify,
+    aVerifyFiles,
+    aListKeys,
+    aListSigs,
+    aSendKeys,
+    aRecvKeys,
+    aSearchKeys,
+    aRefreshKeys,
+    aFetchKeys,
+    aExport,
+    aExportSecret,
+    aExportSecretSub,
+    aCheckKeys,
+    aGenRevoke,
+    aDesigRevoke,
+    aPrimegen,
+    aPrintMD,
+    aPrintMDs,
+    aCheckTrustDB,
+    aUpdateTrustDB,
+    aFixTrustDB,
+    aListTrustDB,
+    aListTrustPath,
+    aExportOwnerTrust,
+    aListOwnerTrust,
+    aImportOwnerTrust,
+    aDeArmor,
+    aEnArmor,
+    aGenRandom,
+    aPipeMode,
+    aRebuildKeydbCaches,
+    aCardStatus,
+    aCardEdit,
+    aChangePIN,
+
+    oTextmode,
+    oNoTextmode,
+    oExpert,
+    oNoExpert,
+    oDefSigExpire,
+    oAskSigExpire,
+    oNoAskSigExpire,
+    oDefCertExpire,
+    oAskCertExpire,
+    oNoAskCertExpire,
+    oDefCertLevel,
+    oMinCertLevel,
+    oAskCertLevel,
+    oNoAskCertLevel,
+    oFingerprint,
+    oWithFingerprint,
+    oAnswerYes,
+    oAnswerNo,
+    oKeyring,
+    oPrimaryKeyring,
+    oSecretKeyring,
+    oShowKeyring,
+    oDefaultKey,
+    oDefRecipient,
+    oDefRecipientSelf,
+    oNoDefRecipient,
+    oOptions,
+    oDebug,
+    oDebugAll,
+    oDebugCCIDDriver,
+    oStatusFD,
+    oStatusFile,
+    oAttributeFD,
+    oAttributeFile,
+    oEmitVersion,
+    oNoEmitVersion,
+    oCompletesNeeded,
+    oMarginalsNeeded,
+    oMaxCertDepth,
+    oLoadExtension,
+    oGnuPG,
+    oRFC1991,
+    oRFC2440,
+    oOpenPGP,
+    oPGP2,
+    oPGP6,
+    oPGP7,
+    oPGP8,
+    oRFC2440Text,
+    oNoRFC2440Text,
+    oCipherAlgo,
+    oDigestAlgo,
+    oCertDigestAlgo,
+    oCompressAlgo,
+    oCompressLevel,
+    oBZ2CompressLevel,
+    oBZ2DecompressLowmem,
+    oPasswd,
+    oPasswdFD,
+    oPasswdFile,
+    oPasswdRepeat,
+    oCommandFD,
+    oCommandFile,
+    oQuickRandom,
+    oNoVerbose,
+    oTrustDBName,
+    oNoSecmemWarn,
+    oRequireSecmem,
+    oNoRequireSecmem,
+    oNoPermissionWarn,
+    oNoMDCWarn,
+    oNoArmor,
+    oNoDefKeyring,
+    oNoGreeting,
+    oNoTTY,
+    oNoOptions,
+    oNoBatch,
+    oHomedir,
+    oWithColons,
+    oWithKeyData,
+    oSkipVerify,
+    oCompressKeys,
+    oCompressSigs,
+    oAlwaysTrust,
+    oTrustModel,
+    oForceOwnertrust,
+    oRunAsShmCP,
+    oSetFilename,
+    oForYourEyesOnly,
+    oNoForYourEyesOnly,
+    oSetPolicyURL,
+    oSigPolicyURL,
+    oCertPolicyURL,
+    oShowPolicyURL,
+    oNoShowPolicyURL,
+    oSigKeyserverURL,
+    oUseEmbeddedFilename,
+    oNoUseEmbeddedFilename,
+    oComment,
+    oDefaultComment,
+    oNoComments,
+    oThrowKeyids,
+    oNoThrowKeyids,
+    oShowPhotos,
+    oNoShowPhotos,
+    oPhotoViewer,
+    oForceV3Sigs,
+    oNoForceV3Sigs,
+    oForceV4Certs,
+    oNoForceV4Certs,
+    oForceMDC,
+    oNoForceMDC,
+    oDisableMDC,
+    oNoDisableMDC,
+    oS2KMode,
+    oS2KDigest,
+    oS2KCipher,
+    oS2KCount,
+    oSimpleSKChecksum,                          
+    oDisplayCharset,
+    oNotDashEscaped,
+    oEscapeFrom,
+    oNoEscapeFrom,
+    oLockOnce,
+    oLockMultiple,
+    oLockNever,
+    oKeyServer,
+    oKeyServerOptions,
+    oImportOptions,
+    oExportOptions,
+    oListOptions,
+    oVerifyOptions,
+    oTempDir,
+    oExecPath,
+    oEncryptTo,
+    oHiddenEncryptTo,
+    oNoEncryptTo,
+    oLoggerFD,
+    oLoggerFile,
+    oUtf8Strings,
+    oNoUtf8Strings,
+    oDisableCipherAlgo,
+    oDisablePubkeyAlgo,
+    oAllowNonSelfsignedUID,
+    oNoAllowNonSelfsignedUID,
+    oAllowFreeformUID,
+    oNoAllowFreeformUID,
+    oAllowSecretKeyImport,                      
+    oEnableSpecialFilenames,
+    oNoLiteral,
+    oSetFilesize,
+    oHonorHttpProxy,
+    oFastListMode,
+    oListOnly,
+    oIgnoreTimeConflict,
+    oIgnoreValidFrom,
+    oIgnoreCrcError,
+    oIgnoreMDCError,
+    oShowSessionKey,
+    oOverrideSessionKey,
+    oNoRandomSeedFile,
+    oAutoKeyRetrieve,
+    oNoAutoKeyRetrieve,
+    oUseAgent,
+    oNoUseAgent,
+    oGpgAgentInfo,
+    oMergeOnly,
+    oTryAllSecrets,
+    oTrustedKey,
+    oNoExpensiveTrustChecks,
+    oFixedListMode,
+    oNoSigCache,
+    oNoSigCreateCheck,
+    oAutoCheckTrustDB,
+    oNoAutoCheckTrustDB,
+    oPreservePermissions,
+    oDefaultPreferenceList,
+    oDefaultKeyserverURL,
+    oPersonalCipherPreferences,
+    oPersonalDigestPreferences,
+    oPersonalCompressPreferences,
+    oDisplay,
+    oTTYname,
+    oTTYtype,
+    oLCctype,
+    oLCmessages,
+    oGroup,
+    oUnGroup,
+    oNoGroups,
+    oStrict,
+    oNoStrict,
+    oMangleDosFilenames,
+    oNoMangleDosFilenames,
+    oEnableProgressFilter,
+    oMultifile,
+    oKeyidFormat,
+    oExitOnStatusWriteError,
+    oLimitCardInsertTries,
+    oReaderPort,
+    octapiDriver,
+    opcscDriver,
+    oDisableCCID,
+    oRequireCrossCert,
+    oNoRequireCrossCert,
+    oAutoKeyLocate,
+    oNoAutoKeyLocate,
+    oAllowMultisigVerification,
+    oEnableDSA2,
+    oDisableDSA2,
+
+    oNoop
+  };
+
+
+static ARGPARSE_OPTS opts[] = {
+
+    { 300, NULL, 0, N_("@Commands:\n ") },
+
+    { aSign, "sign",      256, N_("|[file]|make a signature")},
+    { aClearsign, "clearsign", 256, N_("|[file]|make a clear text signature")},
+    { aDetachedSign, "detach-sign", 256, N_("make a detached signature")},
+    { aEncr, "encrypt",   256, N_("encrypt data")},
+    { aEncrFiles, "encrypt-files", 256, "@"},
+    { aSym, "symmetric", 256, N_("encryption only with symmetric cipher")},
+    { aStore, "store",     256, "@"},
+    { aDecrypt, "decrypt",   256, N_("decrypt data (default)")},
+    { aDecryptFiles, "decrypt-files", 256, "@"},
+    { aVerify, "verify"   , 256, N_("verify a signature")},
+    { aVerifyFiles, "verify-files" , 256, "@" },
+    { aListKeys, "list-keys", 256, N_("list keys")},
+    { aListKeys, "list-public-keys", 256, "@" },
+    { aListSigs, "list-sigs", 256, N_("list keys and signatures")},
+    { aCheckKeys, "check-sigs",256, N_("list and check key signatures")},
+    { oFingerprint, "fingerprint", 256, N_("list keys and fingerprints")},
+    { aListSecretKeys, "list-secret-keys", 256, N_("list secret keys")},
+    { aKeygen,    "gen-key",  256, N_("generate a new key pair")},
+    { aDeleteKeys,"delete-keys",256,N_("remove keys from the public keyring")},
+    { aDeleteSecretKeys, "delete-secret-keys",256,
+                                   N_("remove keys from the secret keyring")},
+    { aSignKey,  "sign-key"   ,256, N_("sign a key")},
+    { aLSignKey, "lsign-key"  ,256, N_("sign a key locally")},
+    { aEditKey,  "edit-key"   ,256, N_("sign or edit a key")},
+    { aGenRevoke, "gen-revoke",256, N_("generate a revocation certificate")},
+    { aDesigRevoke, "desig-revoke",256, "@" },
+    { aExport, "export"           , 256, N_("export keys") },
+    { aSendKeys, "send-keys"     , 256, N_("export keys to a key server") },
+    { aRecvKeys, "recv-keys"     , 256, N_("import keys from a key server") },
+    { aSearchKeys, "search-keys" , 256,
+                                    N_("search for keys on a key server") },
+    { aRefreshKeys, "refresh-keys", 256,
+                                    N_("update all keys from a keyserver")},
+    { aFetchKeys, "fetch-keys" , 256, "@" },
+    { aExportSecret, "export-secret-keys" , 256, "@" },
+    { aExportSecretSub, "export-secret-subkeys" , 256, "@" },
+    { aImport, "import",      256     , N_("import/merge keys")},
+    { aFastImport, "fast-import",  256 , "@"},
+#ifdef ENABLE_CARD_SUPPORT
+    { aCardStatus,  "card-status", 256, N_("print the card status")},
+    { aCardEdit,   "card-edit",  256, N_("change data on a card")},
+    { aChangePIN,  "change-pin", 256, N_("change a card's PIN")},
+#endif
+    { aListConfig, "list-config", 256, "@"},
+    { aGPGConfList, "gpgconf-list", 256, "@" },
+    { aGPGConfTest, "gpgconf-test", 256, "@" },
+    { aListPackets, "list-packets",256, "@"},
+    { aExportOwnerTrust, "export-ownertrust", 256, "@"},
+    { aImportOwnerTrust, "import-ownertrust", 256, "@"},
+    { aUpdateTrustDB,
+             "update-trustdb",0 , N_("update the trust database")},
+    { aCheckTrustDB, "check-trustdb", 0, "@"},
+    { aFixTrustDB, "fix-trustdb", 0, "@"},
+    { aDeArmor, "dearmor", 256, "@"},
+    { aDeArmor, "dearmour", 256, "@"},
+    { aEnArmor, "enarmor", 256, "@"},
+    { aEnArmor, "enarmour", 256, "@"},
+    { aPrintMD,  "print-md" , 256, N_("|algo [files]|print message digests")},
+    { aPrimegen, "gen-prime" , 256, "@" },
+    { aGenRandom, "gen-random" , 256, "@" },
+
+    { 301, NULL, 0, N_("@\nOptions:\n ") },
+
+    { oArmor, "armor",     0, N_("create ascii armored output")},
+    { oArmor, "armour",     0, "@" },
+    { oRecipient, "recipient", 2, N_("|NAME|encrypt for NAME")},
+    { oHiddenRecipient, "hidden-recipient", 2, "@" },
+    { oRecipient, "remote-user", 2, "@"},  /* old option name */
+    { oDefRecipient, "default-recipient", 2, "@"},
+    { oDefRecipientSelf, "default-recipient-self", 0, "@"},
+    { oNoDefRecipient, "no-default-recipient", 0, "@" },
+    { oTempDir, "temp-directory", 2, "@" },
+    { oExecPath, "exec-path", 2, "@" },
+    { oEncryptTo, "encrypt-to", 2, "@" },
+    { oHiddenEncryptTo, "hidden-encrypt-to", 2, "@" },
+    { oNoEncryptTo, "no-encrypt-to", 0, "@" },
+    { oLocalUser, "local-user",2, N_("use this user-id to sign or decrypt")},
+    { oCompress, NULL, 1, N_("|N|set compress level N (0 disables)") },
+    { oCompressLevel, "compress-level", 1, "@" },
+    { oBZ2CompressLevel, "bzip2-compress-level", 1, "@" },
+    { oBZ2DecompressLowmem, "bzip2-decompress-lowmem", 0, "@" },
+    { oTextmodeShort, NULL,   0, "@"},
+    { oTextmode, "textmode",  0, N_("use canonical text mode")},
+    { oNoTextmode, "no-textmode",  0, "@"},
+    { oExpert, "expert",   0, "@"},
+    { oNoExpert, "no-expert",   0, "@"},
+    { oDefSigExpire, "default-sig-expire", 2, "@"},
+    { oAskSigExpire, "ask-sig-expire",   0, "@"},
+    { oNoAskSigExpire, "no-ask-sig-expire",   0, "@"},
+    { oDefCertExpire, "default-cert-expire", 2, "@"},
+    { oAskCertExpire, "ask-cert-expire",   0, "@"},
+    { oNoAskCertExpire, "no-ask-cert-expire",   0, "@"},
+    { oDefCertLevel, "default-cert-level", 1, "@"},
+    { oMinCertLevel, "min-cert-level", 1, "@"},
+    { oAskCertLevel, "ask-cert-level",   0, "@"},
+    { oNoAskCertLevel, "no-ask-cert-level",   0, "@"},
+    { oOutput, "output",    2, N_("use as output file")},
+    { oMaxOutput, "max-output", 16|4, "@" },
+    { oVerbose, "verbose",   0, N_("verbose") },
+    { oQuiet,  "quiet",   0, "@"},
+    { oNoTTY, "no-tty", 0, "@"},
+    { oForceV3Sigs, "force-v3-sigs", 0, "@"},
+    { oNoForceV3Sigs, "no-force-v3-sigs", 0, "@"},
+    { oForceV4Certs, "force-v4-certs", 0, "@"},
+    { oNoForceV4Certs, "no-force-v4-certs", 0, "@"},
+    { oForceMDC, "force-mdc", 0, "@"},
+    { oNoForceMDC, "no-force-mdc", 0, "@" },
+    { oDisableMDC, "disable-mdc", 0, "@"},
+    { oNoDisableMDC, "no-disable-mdc", 0, "@" },
+    { oDryRun, "dry-run",   0, N_("do not make any changes") },
+    { oInteractive, "interactive", 0, N_("prompt before overwriting") },
+    { oUseAgent, "use-agent",0, "@"},
+    { oNoUseAgent, "no-use-agent",0, "@"},
+    { oGpgAgentInfo, "gpg-agent-info",2, "@"},
+    { oBatch, "batch", 0, "@"},
+    { oAnswerYes, "yes", 0, "@"},
+    { oAnswerNo, "no", 0, "@"},
+    { oKeyring, "keyring", 2, "@"},
+    { oPrimaryKeyring, "primary-keyring",2, "@" },
+    { oSecretKeyring, "secret-keyring", 2, "@"},
+    { oShowKeyring, "show-keyring", 0, "@"},
+    { oDefaultKey, "default-key", 2, "@"},
+    { oKeyServer, "keyserver", 2, "@"},
+    { oKeyServerOptions, "keyserver-options",2,"@"},
+    { oImportOptions, "import-options",2,"@"},
+    { oExportOptions, "export-options",2,"@"},
+    { oListOptions, "list-options",2,"@"},
+    { oVerifyOptions, "verify-options",2,"@"},
+    { oDisplayCharset, "display-charset", 2, "@"},
+    { oDisplayCharset, "charset", 2, "@"},
+    { oOptions, "options", 2, "@"},
+    { oDebug, "debug"     ,4|16, "@"},
+    { oDebugAll, "debug-all" ,0, "@"},
+    { oStatusFD, "status-fd" ,1, "@"},
+    { oStatusFile, "status-file" ,2, "@"},
+    { oAttributeFD, "attribute-fd" ,1, "@" },
+    { oAttributeFile, "attribute-file" ,2, "@" },
+    { oNoop, "sk-comments", 0,   "@"},
+    { oNoop, "no-sk-comments", 0,   "@"},
+    { oCompletesNeeded, "completes-needed", 1, "@"},
+    { oMarginalsNeeded, "marginals-needed", 1, "@"},
+    { oMaxCertDepth,   "max-cert-depth", 1, "@" },
+    { oTrustedKey, "trusted-key", 2, "@"},
+    { oLoadExtension, "load-extension", 2, "@"},
+    { oGnuPG, "gnupg",   0, "@"},
+    { oGnuPG, "no-pgp2", 0, "@"},
+    { oGnuPG, "no-pgp6", 0, "@"},
+    { oGnuPG, "no-pgp7", 0, "@"},
+    { oGnuPG, "no-pgp8", 0, "@"},
+    { oRFC1991, "rfc1991",   0, "@"},
+    { oRFC2440, "rfc2440", 0, "@" },
+    { oOpenPGP, "openpgp", 0, N_("use strict OpenPGP behavior")},
+    { oPGP2, "pgp2", 0, N_("generate PGP 2.x compatible messages")},
+    { oPGP6, "pgp6", 0, "@"},
+    { oPGP7, "pgp7", 0, "@"},
+    { oPGP8, "pgp8", 0, "@"},
+    { oRFC2440Text, "rfc2440-text", 0, "@"},
+    { oNoRFC2440Text, "no-rfc2440-text", 0, "@"},
+    { oS2KMode, "s2k-mode", 1, "@"},
+    { oS2KDigest, "s2k-digest-algo", 2, "@"},
+    { oS2KCipher, "s2k-cipher-algo", 2, "@"},
+    { oS2KCount, "s2k-count", 1, "@"},
+    { oSimpleSKChecksum, "simple-sk-checksum", 0, "@"},
+    { oCipherAlgo, "cipher-algo", 2, "@"},
+    { oDigestAlgo, "digest-algo", 2, "@"},
+    { oCertDigestAlgo, "cert-digest-algo", 2 , "@" },
+    { oCompressAlgo,"compress-algo", 2, "@"},
+    { oCompressAlgo, "compression-algo", 2, "@"}, /* Alias */
+    { oThrowKeyids, "throw-keyid", 0, "@"},
+    { oThrowKeyids, "throw-keyids", 0, "@"},
+    { oNoThrowKeyids, "no-throw-keyid", 0, "@" },
+    { oNoThrowKeyids, "no-throw-keyids", 0, "@" },
+    { oShowPhotos,   "show-photos", 0, "@" },
+    { oNoShowPhotos, "no-show-photos", 0, "@" },
+    { oPhotoViewer,  "photo-viewer", 2, "@" },
+    { oSetNotation,  "set-notation", 2, "@" },
+    { oSetNotation,  "notation-data", 2, "@" }, /* Alias */
+    { oSigNotation,  "sig-notation", 2, "@" },
+    { oCertNotation, "cert-notation", 2, "@" },
+
+    { 302, NULL, 0, N_(
+  "@\n(See the man page for a complete listing of all commands and options)\n"
+                     )},
+
+    { 303, NULL, 0, N_("@\nExamples:\n\n"
+    " -se -r Bob [file]          sign and encrypt for user Bob\n"
+    " --clearsign [file]         make a clear text signature\n"
+    " --detach-sign [file]       make a detached signature\n"
+    " --list-keys [names]        show keys\n"
+    " --fingerprint [names]      show fingerprints\n"  ) },
+
+  /* hidden options */
+    { aListOwnerTrust, "list-ownertrust", 256, "@"}, /* deprecated */
+    { aPrintMDs, "print-mds" , 256, "@"}, /* old */
+    { aListTrustDB, "list-trustdb",0 , "@"},
+    /* Not yet used */
+    /* { aListTrustPath, "list-trust-path",0, "@"}, */
+    { aPipeMode,  "pipemode", 0, "@" },
+    { oKOption, NULL,   0, "@"},
+    { oPasswd, "passphrase",2, "@" },
+    { oPasswdFD, "passphrase-fd",1, "@" },
+    { oPasswdFile, "passphrase-file",2, "@" },
+    { oPasswdRepeat, "passphrase-repeat", 1, "@"},
+    { oCommandFD, "command-fd",1, "@" },
+    { oCommandFile, "command-file",2, "@" },
+    { oQuickRandom, "quick-random", 0, "@"},
+    { oNoVerbose, "no-verbose", 0, "@"},
+    { oTrustDBName, "trustdb-name", 2, "@" },
+    { oNoSecmemWarn, "no-secmem-warning", 0, "@" },
+    { oRequireSecmem,"require-secmem", 0, "@" },
+    { oNoRequireSecmem,"no-require-secmem", 0, "@" },
+    { oNoPermissionWarn, "no-permission-warning", 0, "@" },
+    { oNoMDCWarn, "no-mdc-warning", 0, "@" },
+    { oNoArmor, "no-armor",   0, "@"},
+    { oNoArmor, "no-armour",   0, "@"},
+    { oNoDefKeyring, "no-default-keyring", 0, "@" },
+    { oNoGreeting, "no-greeting", 0, "@" },
+    { oNoOptions, "no-options", 0, "@" }, /* shortcut for --options /dev/null */
+    { oHomedir, "homedir", 2, "@" },   /* defaults to "~/.gnupg" */
+    { oNoBatch, "no-batch", 0, "@" },
+    { oWithColons, "with-colons", 0, "@"},
+    { oWithKeyData,"with-key-data", 0, "@"},
+    { aListKeys, "list-key", 0, "@" }, /* alias */
+    { aListSigs, "list-sig", 0, "@" }, /* alias */
+    { aCheckKeys, "check-sig",0, "@" }, /* alias */
+    { oSkipVerify, "skip-verify",0, "@" },
+    { oCompressKeys, "compress-keys",0, "@"},
+    { oCompressSigs, "compress-sigs",0, "@"},
+    { oDefCertLevel, "default-cert-check-level", 1, "@"}, /* Old option */
+    { oAlwaysTrust, "always-trust", 0, "@"},
+    { oTrustModel, "trust-model", 2, "@"},
+    { oForceOwnertrust, "force-ownertrust", 2, "@"},
+    { oRunAsShmCP, "run-as-shm-coprocess", 4, "@" },
+    { oSetFilename, "set-filename", 2, "@" },
+    { oForYourEyesOnly, "for-your-eyes-only", 0, "@" },
+    { oNoForYourEyesOnly, "no-for-your-eyes-only", 0, "@" },
+    { oSetPolicyURL, "set-policy-url", 2, "@" },
+    { oSigPolicyURL, "sig-policy-url", 2, "@" },
+    { oCertPolicyURL, "cert-policy-url", 2, "@" },
+    { oShowPolicyURL, "show-policy-url", 0, "@" },
+    { oNoShowPolicyURL, "no-show-policy-url", 0, "@" },
+    { oSigKeyserverURL, "sig-keyserver-url", 2, "@" },
+    { oShowNotation, "show-notation", 0, "@" },
+    { oNoShowNotation, "no-show-notation", 0, "@" },
+    { oComment, "comment", 2, "@" },
+    { oDefaultComment, "default-comment", 0, "@" },
+    { oNoComments, "no-comments", 0, "@" },
+    { oEmitVersion, "emit-version", 0, "@"},
+    { oNoEmitVersion, "no-emit-version", 0, "@"},
+    { oNoEmitVersion, "no-version", 0, "@"}, /* alias */
+    { oNotDashEscaped, "not-dash-escaped", 0, "@" },
+    { oEscapeFrom, "escape-from-lines", 0, "@" },
+    { oNoEscapeFrom, "no-escape-from-lines", 0, "@" },
+    { oLockOnce, "lock-once", 0, "@" },
+    { oLockMultiple, "lock-multiple", 0, "@" },
+    { oLockNever, "lock-never", 0, "@" },
+    { oLoggerFD, "logger-fd",1, "@" },
+    { oLoggerFile, "logger-file",2, "@" },
+    { oUseEmbeddedFilename, "use-embedded-filename", 0, "@" },
+    { oNoUseEmbeddedFilename, "no-use-embedded-filename", 0, "@" },
+    { oUtf8Strings, "utf8-strings", 0, "@" },
+    { oNoUtf8Strings, "no-utf8-strings", 0, "@" },
+    { oWithFingerprint, "with-fingerprint", 0, "@" },
+    { oDisableCipherAlgo,  "disable-cipher-algo", 2, "@" },
+    { oDisablePubkeyAlgo,  "disable-pubkey-algo", 2, "@" },
+    { oAllowNonSelfsignedUID, "allow-non-selfsigned-uid", 0, "@" },
+    { oNoAllowNonSelfsignedUID, "no-allow-non-selfsigned-uid", 0, "@" },
+    { oAllowFreeformUID, "allow-freeform-uid", 0, "@" },
+    { oNoAllowFreeformUID, "no-allow-freeform-uid", 0, "@" },
+    { oNoLiteral, "no-literal", 0, "@" },
+    { oSetFilesize, "set-filesize", 20, "@" },
+    { oHonorHttpProxy,"honor-http-proxy", 0, "@" },
+    { oFastListMode,"fast-list-mode", 0, "@" },
+    { oFixedListMode,"fixed-list-mode", 0, "@" },
+    { oListOnly, "list-only", 0, "@"},
+    { oIgnoreTimeConflict, "ignore-time-conflict", 0, "@" },
+    { oIgnoreValidFrom,    "ignore-valid-from",    0, "@" },
+    { oIgnoreCrcError, "ignore-crc-error", 0,"@" },
+    { oIgnoreMDCError, "ignore-mdc-error", 0,"@" },
+    { oShowSessionKey, "show-session-key", 0, "@" },
+    { oOverrideSessionKey, "override-session-key", 2, "@" },
+    { oNoRandomSeedFile,  "no-random-seed-file", 0, "@" },
+    { oAutoKeyRetrieve, "auto-key-retrieve", 0, "@" },
+    { oNoAutoKeyRetrieve, "no-auto-key-retrieve", 0, "@" },
+    { oNoSigCache,         "no-sig-cache", 0, "@" },
+    { oNoSigCreateCheck,   "no-sig-create-check", 0, "@" },
+    { oAutoCheckTrustDB, "auto-check-trustdb", 0, "@"},
+    { oNoAutoCheckTrustDB, "no-auto-check-trustdb", 0, "@"},
+    { oMergeOnly,        "merge-only", 0, "@" },
+    { oAllowSecretKeyImport, "allow-secret-key-import", 0, "@" },
+    { oTryAllSecrets,  "try-all-secrets", 0, "@" },
+    { oEnableSpecialFilenames, "enable-special-filenames", 0, "@" },
+    { oNoExpensiveTrustChecks, "no-expensive-trust-checks", 0, "@" },
+    { aDeleteSecretAndPublicKeys, "delete-secret-and-public-keys",256, "@" },
+    { aRebuildKeydbCaches, "rebuild-keydb-caches", 256, "@"},
+    { oPreservePermissions, "preserve-permissions", 0, "@"},
+    { oDefaultPreferenceList,  "default-preference-list", 2, "@"},
+    { oDefaultKeyserverURL,  "default-keyserver-url", 2, "@"},
+    { oPersonalCipherPreferences,  "personal-cipher-preferences", 2, "@"},
+    { oPersonalDigestPreferences,  "personal-digest-preferences", 2, "@"},
+    { oPersonalCompressPreferences,  "personal-compress-preferences", 2, "@"},
+    /* Aliases.  I constantly mistype these, and assume other people
+       do as well. */
+    { oPersonalCipherPreferences, "personal-cipher-prefs", 2, "@"},
+    { oPersonalDigestPreferences, "personal-digest-prefs", 2, "@"},
+    { oPersonalCompressPreferences, "personal-compress-prefs", 2, "@"},
+    { oDisplay,    "display",     2, "@" },
+    { oTTYname,    "ttyname",     2, "@" },
+    { oTTYtype,    "ttytype",     2, "@" },
+    { oLCctype,    "lc-ctype",    2, "@" },
+    { oLCmessages, "lc-messages", 2, "@" },
+    { oGroup,      "group",       2, "@" },
+    { oUnGroup,    "ungroup",     2, "@" },
+    { oNoGroups,   "no-groups",    0, "@" },
+    { oStrict,     "strict",      0, "@" },
+    { oNoStrict,   "no-strict",   0, "@" },
+    { oMangleDosFilenames, "mangle-dos-filenames", 0, "@" },
+    { oNoMangleDosFilenames, "no-mangle-dos-filenames", 0, "@" },
+    { oEnableProgressFilter, "enable-progress-filter", 0, "@" },
+    { oMultifile, "multifile", 0, "@" },
+    { oKeyidFormat, "keyid-format", 2, "@" },
+    { oExitOnStatusWriteError, "exit-on-status-write-error", 0, "@" },
+    { oLimitCardInsertTries, "limit-card-insert-tries", 1, "@"},
+
+    { oReaderPort, "reader-port",    2, "@"},
+    { octapiDriver, "ctapi-driver",  2, "@"},
+    { opcscDriver, "pcsc-driver",    2, "@"},
+    { oDisableCCID, "disable-ccid", 0, "@"},
+#if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB)
+    { oDebugCCIDDriver, "debug-ccid-driver", 0, "@"},
+#endif
+    { oAllowMultisigVerification, "allow-multisig-verification", 0, "@"},
+    { oEnableDSA2, "enable-dsa2", 0, "@"},
+    { oDisableDSA2, "disable-dsa2", 0, "@"},
+
+    /* These two are aliases to help users of the PGP command line
+       product use gpg with minimal pain.  Many commands are common
+       already as they seem to have borrowed commands from us.  Now
+       I'm returning the favor. */
+    { oLocalUser, "sign-with", 2, "@" },
+    { oRecipient, "user", 2, "@" },
+    { oRequireCrossCert, "require-backsigs", 0, "@"},
+    { oRequireCrossCert, "require-cross-certification", 0, "@"},
+    { oNoRequireCrossCert, "no-require-backsigs", 0, "@"},
+    { oNoRequireCrossCert, "no-require-cross-certification", 0, "@"},
+    { oAutoKeyLocate, "auto-key-locate", 2, "@"},
+    { oNoAutoKeyLocate, "no-auto-key-locate", 0, "@"},
+    {0,NULL,0,NULL}
+};
+
+
+#ifdef ENABLE_SELINUX_HACKS
+#define ALWAYS_ADD_KEYRINGS 1
+#else
+#define ALWAYS_ADD_KEYRINGS 0
+#endif
+
+
+int g10_errors_seen = 0;
+
+static int utf8_strings = 0;
+static int maybe_setuid = 1;
+
+static char *build_list( const char *text, char letter,
+                        const char *(*mapf)(int), int (*chkf)(int) );
+static void set_cmd( enum cmd_and_opt_values *ret_cmd,
+                       enum cmd_and_opt_values new_cmd );
+static void print_mds( const char *fname, int algo );
+static void add_notation_data( const char *string, int which );
+static void add_policy_url( const char *string, int which );
+static void add_keyserver_url( const char *string, int which );
+
+const char *
+strusage( int level )
+{
+  static char *digests, *pubkeys, *ciphers, *zips;
+    const char *p;
+    switch( level ) {
+      case 11: p = "gpg (GnuPG)";
+       break;
+      case 13: p = VERSION; break;
+      case 17: p = PRINTABLE_OS_NAME; break;
+      case 19: p =
+           _("Please report bugs to <gnupg-bugs@gnu.org>.\n");
+       break;
+
+#ifdef IS_DEVELOPMENT_VERSION
+      case 20:
+       p="NOTE: THIS IS A DEVELOPMENT VERSION!";
+       break;
+      case 21:
+       p="It is only intended for test purposes and should NOT be";
+       break;
+      case 22:
+       p="used in a production environment or with production keys!";
+       break;
+#endif
+
+      case 1:
+      case 40: p =
+           _("Usage: gpg [options] [files] (-h for help)");
+       break;
+      case 41: p =
+           _("Syntax: gpg [options] [files]\n"
+             "sign, check, encrypt or decrypt\n"
+             "default operation depends on the input data\n");
+       break;
+
+      case 31: p = "\nHome: "; break;
+#ifndef __riscos__
+      case 32: p = opt.homedir; break;
+#else /* __riscos__ */
+      case 32: p = make_filename(opt.homedir, NULL); break;
+#endif /* __riscos__ */
+      case 33: p = _("\nSupported algorithms:\n"); break;
+      case 34:
+       if( !pubkeys )
+           pubkeys = build_list(_("Pubkey: "), 0, pubkey_algo_to_string,
+                                                       check_pubkey_algo );
+       p = pubkeys;
+       break;
+      case 35:
+       if( !ciphers )
+           ciphers = build_list(_("Cipher: "), 'S', cipher_algo_to_string,
+                                                       check_cipher_algo );
+       p = ciphers;
+       break;
+      case 36:
+       if( !digests )
+           digests = build_list(_("Hash: "), 'H', digest_algo_to_string,
+                                                       check_digest_algo );
+       p = digests;
+       break;
+      case 37:
+       if( !zips )
+           zips = build_list(_("Compression: "),'Z',compress_algo_to_string,
+                                                       check_compress_algo);
+       p = zips;
+       break;
+
+      default: p = default_strusage(level);
+    }
+    return p;
+}
+
+
+static char *
+build_list( const char *text, char letter,
+           const char * (*mapf)(int), int (*chkf)(int) )
+{
+    int i;
+    const char *s;
+    size_t n=strlen(text)+2;
+    char *list, *p, *line=NULL;
+
+    if( maybe_setuid )
+       secmem_init( 0 );    /* drop setuid */
+
+    for(i=0; i <= 110; i++ )
+       if( !chkf(i) && (s=mapf(i)) )
+           n += strlen(s) + 7 + 2;
+    list = xmalloc( 21 + n ); *list = 0;
+    for(p=NULL, i=0; i <= 110; i++ ) {
+       if( !chkf(i) && (s=mapf(i)) ) {
+           if( !p ) {
+               p = stpcpy( list, text );
+               line=p;
+           }
+           else
+               p = stpcpy( p, ", ");
+
+           if(strlen(line)>60) {
+             int spaces=strlen(text);
+
+             list=xrealloc(list,n+spaces+1);
+             /* realloc could move the block, so find the end again */
+             p=list;
+             while(*p)
+               p++;
+
+             p=stpcpy(p, "\n");
+             line=p;
+             for(;spaces;spaces--)
+               p=stpcpy(p, " ");
+           }
+
+           p = stpcpy(p, s );
+           if(opt.verbose && letter)
+             {
+               char num[8];
+               sprintf(num," (%c%d)",letter,i);
+               p = stpcpy(p,num);
+             }
+       }
+    }
+    if( p )
+       p = stpcpy(p, "\n" );
+    return list;
+}
+
+
+static void
+i18n_init(void)
+{
+#ifdef USE_SIMPLE_GETTEXT
+    set_gettext_file (PACKAGE, "Software\\GNU\\GnuPG");
+#else
+#ifdef ENABLE_NLS
+    setlocale( LC_ALL, "" );
+    bindtextdomain( PACKAGE, G10_LOCALEDIR );
+    textdomain( PACKAGE );
+#endif
+#endif
+}
+
+static void
+wrong_args( const char *text)
+{
+    fputs(_("usage: gpg [options] "),stderr);
+    fputs(text,stderr);
+    putc('\n',stderr);
+    g10_exit(2);
+}
+
+
+static char *
+make_username( const char *string )
+{
+    char *p;
+    if( utf8_strings )
+       p = xstrdup(string);
+    else
+       p = native_to_utf8( string );
+    return p;
+}
+
+
+static void
+set_debug(void)
+{
+    if( opt.debug & DBG_MEMORY_VALUE )
+       memory_debug_mode = 1;
+    if( opt.debug & DBG_MEMSTAT_VALUE )
+       memory_stat_debug_mode = 1;
+    if( opt.debug & DBG_MPI_VALUE )
+       mpi_debug_mode = 1;
+    if( opt.debug & DBG_CIPHER_VALUE )
+       g10c_debug_mode = 1;
+    if( opt.debug & DBG_IOBUF_VALUE )
+       iobuf_debug_mode = 1;
+
+}
+
+
+/* We need the home directory also in some other directories, so make
+   sure that both variables are always in sync. */
+static void
+set_homedir (char *dir)
+{
+  if (!dir)
+    dir = "";
+  g10_opt_homedir = opt.homedir = dir;
+}
+
+
+/* We set the screen dimensions for UI purposes.  Do not allow screens
+   smaller than 80x24 for the sake of simplicity. */
+static void
+set_screen_dimensions(void)
+{
+#ifndef _WIN32
+  char *str;
+
+  str=getenv("COLUMNS");
+  if(str)
+    opt.screen_columns=atoi(str);
+
+  str=getenv("LINES");
+  if(str)
+    opt.screen_lines=atoi(str);
+#endif
+
+  if(opt.screen_columns<80 || opt.screen_columns>255)
+    opt.screen_columns=80;
+
+  if(opt.screen_lines<24 || opt.screen_lines>255)
+    opt.screen_lines=24;
+}
+
+
+/* Helper to open a file FNAME either for reading or writing to be
+   used with --status-file etc functions.  Not generally useful but it
+   avoids the riscos specific functions and well some Windows people
+   might like it too.  Prints an error message and returns -1 on
+   error. On success the file descriptor is returned.  */
+static int
+open_info_file (const char *fname, int for_write)
+{
+#ifdef __riscos__
+  return riscos_fdopenfile (fname, for_write);
+#elif defined (ENABLE_SELINUX_HACKS)
+  /* We can't allow these even when testing for a secured filename
+     because files to be secured might not yet been secured.  This is
+     similar to the option file but in that case it is unlikely that
+     sensitive information may be retrieved by means of error
+     messages.  */
+  return -1;
+#else 
+  int fd;
+
+/*   if (is_secured_filename (fname)) */
+/*     { */
+/*       fd = -1; */
+/*       errno = EPERM; */
+/*     } */
+/*   else */
+/*     { */
+      do
+        {
+          if (for_write)
+            fd = open (fname, O_CREAT | O_TRUNC | O_WRONLY,
+                        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
+          else
+            fd = open (fname, O_RDONLY | MY_O_BINARY);
+        }
+      while (fd == -1 && errno == EINTR);
+/*     } */
+  if ( fd == -1)
+    log_error ( for_write? _("can't create `%s': %s\n")
+                         : _("can't open `%s': %s\n"), fname, strerror(errno));
+  
+  return fd;
+#endif
+}
+
+static void
+set_cmd( enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd )
+{
+    enum cmd_and_opt_values cmd = *ret_cmd;
+
+    if( !cmd || cmd == new_cmd )
+       cmd = new_cmd;
+    else if( cmd == aSign && new_cmd == aEncr )
+       cmd = aSignEncr;
+    else if( cmd == aEncr && new_cmd == aSign )
+       cmd = aSignEncr;
+    else if( cmd == aSign && new_cmd == aSym )
+       cmd = aSignSym;
+    else if( cmd == aSym && new_cmd == aSign )
+       cmd = aSignSym;
+    else if( cmd == aSym && new_cmd == aEncr )
+       cmd = aEncrSym;
+    else if( cmd == aEncr && new_cmd == aSym )
+       cmd = aEncrSym;
+    else if( cmd == aKMode && new_cmd == aSym )
+       cmd = aKModeC;
+    else if (cmd == aSignEncr && new_cmd == aSym)
+        cmd = aSignEncrSym;
+    else if (cmd == aSignSym && new_cmd == aEncr)
+        cmd = aSignEncrSym;
+    else if (cmd == aEncrSym && new_cmd == aSign)
+        cmd = aSignEncrSym;
+    else if(   ( cmd == aSign     && new_cmd == aClearsign )
+            || ( cmd == aClearsign && new_cmd == aSign )  )
+       cmd = aClearsign;
+    else {
+       log_error(_("conflicting commands\n"));
+       g10_exit(2);
+    }
+
+    *ret_cmd = cmd;
+}
+
+
+static void
+add_group(char *string)
+{
+  char *name,*value;
+  struct groupitem *item;
+
+  /* Break off the group name */
+  name=strsep(&string,"=");
+  if(string==NULL)
+    {
+      log_error(_("no = sign found in group definition `%s'\n"),name);
+      return;
+    }
+
+  trim_trailing_ws(name,strlen(name));
+
+  /* Does this group already exist? */
+  for(item=opt.grouplist;item;item=item->next)
+    if(strcasecmp(item->name,name)==0)
+      break;
+
+  if(!item)
+    {
+      item=xmalloc(sizeof(struct groupitem));
+      item->name=name;
+      item->next=opt.grouplist;
+      item->values=NULL;
+      opt.grouplist=item;
+    }
+
+  /* Break apart the values */
+  while ((value= strsep(&string," \t")))
+    {
+      if (*value)
+        add_to_strlist2(&item->values,value,utf8_strings);
+    }
+}
+
+
+static void
+rm_group(char *name)
+{
+  struct groupitem *item,*last=NULL;
+
+  trim_trailing_ws(name,strlen(name));
+
+  for(item=opt.grouplist;item;last=item,item=item->next)
+    {
+      if(strcasecmp(item->name,name)==0)
+       {
+         if(last)
+           last->next=item->next;
+         else
+           opt.grouplist=item->next;
+
+         free_strlist(item->values);
+         xfree(item);
+         break;
+       }
+    }
+}
+
+
+/* We need to check three things.
+
+   0) The homedir.  It must be x00, a directory, and owned by the
+   user.
+
+   1) The options/gpg.conf file.  Okay unless it or its containing
+   directory is group or other writable or not owned by us.  Disable
+   exec in this case.
+
+   2) Extensions.  Same as #1.
+
+   Returns true if the item is unsafe. */
+static int
+check_permissions(const char *path,int item)
+{
+#if defined(HAVE_STAT) && !defined(HAVE_DOSISH_SYSTEM)
+  static int homedir_cache=-1;
+  char *tmppath,*dir;
+  struct stat statbuf,dirbuf;
+  int homedir=0,ret=0,checkonly=0;
+  int perm=0,own=0,enc_dir_perm=0,enc_dir_own=0;
+
+  if(opt.no_perm_warn)
+    return 0;
+
+  assert(item==0 || item==1 || item==2);
+
+  /* extensions may attach a path */
+  if(item==2 && path[0]!=DIRSEP_C)
+    {
+      if(strchr(path,DIRSEP_C))
+       tmppath=make_filename(path,NULL);
+      else
+       tmppath=make_filename(GNUPG_LIBDIR,path,NULL);
+    }
+  else
+    tmppath=xstrdup(path);
+
+  /* If the item is located in the homedir, but isn't the homedir,
+     don't continue if we already checked the homedir itself.  This is
+     to avoid user confusion with an extra options file warning which
+     could be rectified if the homedir itself had proper
+     permissions. */
+  if(item!=0 && homedir_cache>-1
+     && ascii_strncasecmp(opt.homedir,tmppath,strlen(opt.homedir))==0)
+    {
+      ret=homedir_cache;
+      goto end;
+    }
+
+  /* It's okay if the file or directory doesn't exist */
+  if(stat(tmppath,&statbuf)!=0)
+    {
+      ret=0;
+      goto end;
+    }
+
+  /* Now check the enclosing directory.  Theoretically, we could walk
+     this test up to the root directory /, but for the sake of sanity,
+     I'm stopping at one level down. */
+  dir=make_dirname(tmppath);
+
+  if(stat(dir,&dirbuf)!=0 || !S_ISDIR(dirbuf.st_mode))
+    {
+      /* Weird error */
+      ret=1;
+      goto end;
+    }
+
+  xfree(dir);
+
+  /* Assume failure */
+  ret=1;
+
+  if(item==0)
+    {
+      /* The homedir must be x00, a directory, and owned by the user. */
+
+      if(S_ISDIR(statbuf.st_mode))
+       {
+         if(statbuf.st_uid==getuid())
+           {
+             if((statbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
+               ret=0;
+             else
+               perm=1;
+           }
+         else
+           own=1;
+
+         homedir_cache=ret;
+       }
+    }
+  else if(item==1 || item==2)
+    {
+      /* The options or extension file.  Okay unless it or its
+        containing directory is group or other writable or not owned
+        by us or root. */
+
+      if(S_ISREG(statbuf.st_mode))
+       {
+         if(statbuf.st_uid==getuid() || statbuf.st_uid==0)
+           {
+             if((statbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
+               {
+                 /* it's not writable, so make sure the enclosing
+                     directory is also not writable */
+                 if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
+                   {
+                     if((dirbuf.st_mode & (S_IWGRP|S_IWOTH))==0)
+                       ret=0;
+                     else
+                       enc_dir_perm=1;
+                   }
+                 else
+                   enc_dir_own=1;
+               }
+             else
+               {
+                 /* it's writable, so the enclosing directory had
+                     better not let people get to it. */
+                 if(dirbuf.st_uid==getuid() || dirbuf.st_uid==0)
+                   {
+                     if((dirbuf.st_mode & (S_IRWXG|S_IRWXO))==0)
+                       ret=0;
+                     else
+                       perm=enc_dir_perm=1; /* unclear which one to fix! */
+                   }
+                 else
+                   enc_dir_own=1;
+               }
+           }
+         else
+           own=1;
+       }
+    }
+  else
+    BUG();
+
+  if(!checkonly)
+    {
+      if(own)
+       {
+         if(item==0)
+           log_info(_("WARNING: unsafe ownership on"
+                      " homedir `%s'\n"),tmppath);
+         else if(item==1)
+           log_info(_("WARNING: unsafe ownership on"
+                      " configuration file `%s'\n"),tmppath);
+         else
+           log_info(_("WARNING: unsafe ownership on"
+                      " extension `%s'\n"),tmppath);
+       }
+      if(perm)
+       {
+         if(item==0)
+           log_info(_("WARNING: unsafe permissions on"
+                      " homedir `%s'\n"),tmppath);
+         else if(item==1)
+           log_info(_("WARNING: unsafe permissions on"
+                      " configuration file `%s'\n"),tmppath);
+         else
+           log_info(_("WARNING: unsafe permissions on"
+                      " extension `%s'\n"),tmppath);
+       }
+      if(enc_dir_own)
+       {
+         if(item==0)
+           log_info(_("WARNING: unsafe enclosing directory ownership on"
+                      " homedir `%s'\n"),tmppath);
+         else if(item==1)
+           log_info(_("WARNING: unsafe enclosing directory ownership on"
+                      " configuration file `%s'\n"),tmppath);
+         else
+           log_info(_("WARNING: unsafe enclosing directory ownership on"
+                      " extension `%s'\n"),tmppath);
+       }
+      if(enc_dir_perm)
+       {
+         if(item==0)
+           log_info(_("WARNING: unsafe enclosing directory permissions on"
+                      " homedir `%s'\n"),tmppath);
+         else if(item==1)
+           log_info(_("WARNING: unsafe enclosing directory permissions on"
+                      " configuration file `%s'\n"),tmppath);
+         else
+           log_info(_("WARNING: unsafe enclosing directory permissions on"
+                      " extension `%s'\n"),tmppath);
+       }
+    }
+
+ end:
+  xfree(tmppath);
+
+  if(homedir)
+    homedir_cache=ret;
+
+  return ret;
+
+#endif /* HAVE_STAT && !HAVE_DOSISH_SYSTEM */
+
+  return 0;
+}
+
+
+static void
+print_algo_numbers(int (*checker)(int))
+{
+  int i,first=1;
+
+  for(i=0;i<=110;i++)
+    {
+      if(!checker(i))
+       {
+         if(first)
+           first=0;
+         else
+           printf(";");
+         printf("%d",i);
+       }
+    }
+}
+
+
+/* In the future, we can do all sorts of interesting configuration
+   output here.  For now, just give "group" as the Enigmail folks need
+   it, and pubkey, cipher, hash, and compress as they may be useful
+   for frontends. */
+static void
+list_config(char *items)
+{
+  int show_all=(items==NULL);
+  char *name=NULL;
+
+  if(!opt.with_colons)
+    return;
+
+  while(show_all || (name=strsep(&items," ")))
+    {
+      int any=0;
+
+      if(show_all || ascii_strcasecmp(name,"group")==0)
+       {
+         struct groupitem *iter;
+
+         for(iter=opt.grouplist;iter;iter=iter->next)
+           {
+             STRLIST sl;
+
+             printf("cfg:group:");
+             print_string(stdout,iter->name,strlen(iter->name),':');
+             printf(":");
+
+             for(sl=iter->values;sl;sl=sl->next)
+               {
+                 print_string2(stdout,sl->d,strlen(sl->d),':',';');
+                 if(sl->next)
+                   printf(";");
+               }
+
+             printf("\n");
+           }
+
+         any=1;
+       }
+
+      if(show_all || ascii_strcasecmp(name,"version")==0)
+       {
+         printf("cfg:version:");
+         print_string(stdout,VERSION,strlen(VERSION),':');
+         printf("\n");
+         any=1;
+       }
+
+      if(show_all || ascii_strcasecmp(name,"pubkey")==0)
+       {
+         printf("cfg:pubkey:");
+         print_algo_numbers(check_pubkey_algo);
+         printf("\n");
+         any=1;
+       }
+
+      if(show_all || ascii_strcasecmp(name,"cipher")==0)
+       {
+         printf("cfg:cipher:");
+         print_algo_numbers(check_cipher_algo);
+         printf("\n");
+         any=1;
+       }
+
+      if(show_all
+        || ascii_strcasecmp(name,"digest")==0
+        || ascii_strcasecmp(name,"hash")==0)
+       {
+         printf("cfg:digest:");
+         print_algo_numbers(check_digest_algo);
+         printf("\n");
+         any=1;
+       }
+
+      if(show_all || ascii_strcasecmp(name,"compress")==0)
+       {
+         printf("cfg:compress:");
+         print_algo_numbers(check_compress_algo);
+         printf("\n");
+         any=1;
+       }
+
+      if(show_all || ascii_strcasecmp(name,"ccid-reader-id")==0)
+       {
+#if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB)
+          char *p, *p2, *list = ccid_get_reader_list ();
+
+          for (p=list; p && (p2 = strchr (p, '\n')); p = p2+1)
+            {
+              *p2 = 0;
+              printf("cfg:ccid-reader-id:%s\n", p);
+            }
+          free (list);
+#endif
+         any=1;
+       }
+
+      if(show_all)
+       break;
+
+      if(!any)
+       log_error(_("unknown configuration item `%s'\n"),name);
+    }
+}
+
+
+/* List options and default values in the GPG Conf format.  This is a
+   new tool distributed with gnupg 1.9.x but we also want some limited
+   support in older gpg versions.  The output is the name of the
+   configuration file and a list of options available for editing by
+   gpgconf.  */
+static void
+gpgconf_list (const char *configfile)
+{
+  /* The following definitions are taken from gnupg/tools/gpgconf-comp.c.  */
+#define GC_OPT_FLAG_NONE       0UL
+#define GC_OPT_FLAG_DEFAULT    (1UL << 4)
+
+  printf ("gpgconf-gpg.conf:%lu:\"%s\n",
+          GC_OPT_FLAG_DEFAULT,configfile?configfile:"/dev/null");
+  printf ("verbose:%lu:\n", GC_OPT_FLAG_NONE);
+  printf ("quiet:%lu:\n",   GC_OPT_FLAG_NONE);
+  printf ("keyserver:%lu:\n", GC_OPT_FLAG_NONE);
+  printf ("reader-port:%lu:\n", GC_OPT_FLAG_NONE);
+}
+
+
+static int
+parse_subpacket_list(char *list)
+{
+  char *tok;
+  byte subpackets[128],i;
+  int count=0;
+
+  if(!list)
+    {
+      /* No arguments means all subpackets */
+      memset(subpackets+1,1,sizeof(subpackets)-1);
+      count=127;
+    }
+  else
+    {
+      memset(subpackets,0,sizeof(subpackets));
+
+      /* Merge with earlier copy */
+      if(opt.show_subpackets)
+       {
+         byte *in;
+
+         for(in=opt.show_subpackets;*in;in++)
+           {
+             if(*in>127 || *in<1)
+               BUG();
+
+             if(!subpackets[*in])
+               count++;
+             subpackets[*in]=1;
+           }
+       }
+
+      while((tok=strsep(&list," ,")))
+       {
+         if(!*tok)
+           continue;
+
+         i=atoi(tok);
+         if(i>127 || i<1)
+           return 0;
+
+         if(!subpackets[i])
+           count++;
+         subpackets[i]=1;
+       }
+    }
+
+  xfree(opt.show_subpackets);
+  opt.show_subpackets=xmalloc(count+1);
+  opt.show_subpackets[count--]=0;
+
+  for(i=1;i<128 && count>=0;i++)
+    if(subpackets[i])
+      opt.show_subpackets[count--]=i;
+
+  return 1;
+}
+
+
+static int
+parse_list_options(char *str)
+{
+  char *subpackets=""; /* something that isn't NULL */
+  struct parse_options lopts[]=
+    {
+      {"show-photos",LIST_SHOW_PHOTOS,NULL,
+       N_("display photo IDs during key listings")},
+      {"show-policy-urls",LIST_SHOW_POLICY_URLS,NULL,
+       N_("show policy URLs during signature listings")},
+      {"show-notations",LIST_SHOW_NOTATIONS,NULL,
+       N_("show all notations during signature listings")},
+      {"show-std-notations",LIST_SHOW_STD_NOTATIONS,NULL,
+       N_("show IETF standard notations during signature listings")},
+      {"show-standard-notations",LIST_SHOW_STD_NOTATIONS,NULL,
+       NULL},
+      {"show-user-notations",LIST_SHOW_USER_NOTATIONS,NULL,
+       N_("show user-supplied notations during signature listings")},
+      {"show-keyserver-urls",LIST_SHOW_KEYSERVER_URLS,NULL,
+       N_("show preferred keyserver URLs during signature listings")},
+      {"show-uid-validity",LIST_SHOW_UID_VALIDITY,NULL,
+       N_("show user ID validity during key listings")},
+      {"show-unusable-uids",LIST_SHOW_UNUSABLE_UIDS,NULL,
+       N_("show revoked and expired user IDs in key listings")},
+      {"show-unusable-subkeys",LIST_SHOW_UNUSABLE_SUBKEYS,NULL,
+       N_("show revoked and expired subkeys in key listings")},
+      {"show-keyring",LIST_SHOW_KEYRING,NULL,
+       N_("show the keyring name in key listings")},
+      {"show-sig-expire",LIST_SHOW_SIG_EXPIRE,NULL,
+       N_("show expiration dates during signature listings")},
+      {"show-sig-subpackets",LIST_SHOW_SIG_SUBPACKETS,NULL,
+       NULL},
+      {NULL,0,NULL,NULL}
+    };
+
+  /* C99 allows for non-constant initializers, but we'd like to
+     compile everywhere, so fill in the show-sig-subpackets argument
+     here.  Note that if the parse_options array changes, we'll have
+     to change the subscript here. */
+  lopts[12].value=&subpackets;
+
+  if(parse_options(str,&opt.list_options,lopts,1))
+    {
+      if(opt.list_options&LIST_SHOW_SIG_SUBPACKETS)
+       {
+         /* Unset so users can pass multiple lists in. */
+         opt.list_options&=~LIST_SHOW_SIG_SUBPACKETS;
+         if(!parse_subpacket_list(subpackets))
+           return 0;
+       }
+      else if(subpackets==NULL && opt.show_subpackets)
+       {
+         /* User did 'no-show-subpackets' */
+         xfree(opt.show_subpackets);
+         opt.show_subpackets=NULL;
+       }
+
+      return 1;
+    }
+  else
+    return 0;
+}
+
+
+/* Collapses argc/argv into a single string that must be freed */
+static char *
+collapse_args(int argc,char *argv[])
+{
+  char *str=NULL;
+  int i,first=1,len=0;
+
+  for(i=0;i<argc;i++)
+    {
+      len+=strlen(argv[i])+2;
+      str=xrealloc(str,len);
+      if(first)
+       {
+         str[0]='\0';
+         first=0;
+       }
+      else
+       strcat(str," ");
+
+      strcat(str,argv[i]);
+    }
+
+  return str;
+}
+
+static void
+parse_trust_model(const char *model)
+{
+  if(ascii_strcasecmp(model,"pgp")==0)
+    opt.trust_model=TM_PGP;
+  else if(ascii_strcasecmp(model,"classic")==0)
+    opt.trust_model=TM_CLASSIC;
+  else if(ascii_strcasecmp(model,"always")==0)
+    opt.trust_model=TM_ALWAYS;
+  else if(ascii_strcasecmp(model,"direct")==0)
+    opt.trust_model=TM_DIRECT;
+  else if(ascii_strcasecmp(model,"auto")==0)
+    opt.trust_model=TM_AUTO;
+  else
+    log_error("unknown trust model `%s'\n",model);
+}
+
+/* Must be called before we open any files. */
+static void
+reopen_std(void)
+{  
+#if defined(HAVE_STAT) && !defined(HAVE_W32_SYSTEM)
+  struct stat statbuf;
+  int did_stdin=0,did_stdout=0,did_stderr=0;
+  FILE *complain;
+
+  if(fstat(STDIN_FILENO,&statbuf)==-1 && errno==EBADF)
+    {
+      if(open("/dev/null",O_RDONLY)==STDIN_FILENO)
+       did_stdin=1;
+      else
+       did_stdin=2;
+    }
+
+  if(fstat(STDOUT_FILENO,&statbuf)==-1 && errno==EBADF)
+    {
+      if(open("/dev/null",O_WRONLY)==STDOUT_FILENO)
+       did_stdout=1;
+      else
+       did_stdout=2;
+    }
+
+  if(fstat(STDERR_FILENO,&statbuf)==-1 && errno==EBADF)
+    {
+      if(open("/dev/null",O_WRONLY)==STDERR_FILENO)
+       did_stderr=1;
+      else
+       did_stderr=2;
+    }
+
+  /* It's hard to log this sort of thing since the filehandle we would
+     complain to may be closed... */
+  if(did_stderr==0)
+    complain=stderr;
+  else if(did_stdout==0)
+    complain=stdout;
+  else
+    complain=NULL;
+
+  if(complain)
+    {
+      if(did_stdin==1)
+       fprintf(complain,"gpg: WARNING: standard input reopened\n");
+      if(did_stdout==1)
+       fprintf(complain,"gpg: WARNING: standard output reopened\n");
+      if(did_stderr==1)
+       fprintf(complain,"gpg: WARNING: standard error reopened\n");
+
+      if(did_stdin==2 || did_stdout==2 || did_stderr==2)
+       fprintf(complain,"gpg: fatal: unable to reopen standard input,"
+               " output, or error\n");
+    }
+
+  if(did_stdin==2 || did_stdout==2 || did_stderr==2)
+    exit(3);
+#endif /* HAVE_STAT && !HAVE_W32_SYSTEM */
+}
+
+/* Pack an s2k iteration count into the form specified in 2440.  If
+   we're in between valid values, round up. */
+static unsigned char
+encode_s2k_iterations(int iterations)
+{
+  unsigned char c=0,result;
+  unsigned int count;
+
+  if(iterations<=1024)
+    return 0;
+
+  if(iterations>=65011712)
+    return 255;
+
+  /* Need count to be in the range 16-31 */
+  for(count=iterations>>6;count>=32;count>>=1)
+    c++;
+
+  result=(c<<4)|(count-16);
+
+  if(S2K_DECODE_COUNT(result)<iterations)
+    result++;
+
+  return result;
+}
+
+int
+main (int argc, char **argv )
+{
+    ARGPARSE_ARGS pargs;
+    IOBUF a;
+    int rc=0;
+    int orig_argc;
+    char **orig_argv;
+    const char *fname;
+    char *username;
+    int may_coredump;
+    STRLIST sl, remusr= NULL, locusr=NULL;
+    STRLIST nrings=NULL, sec_nrings=NULL;
+    armor_filter_context_t afx;
+    int detached_sig = 0;
+    FILE *configfp = NULL;
+    char *configname = NULL;
+    char *save_configname = NULL;
+    unsigned configlineno;
+    int parse_debug = 0;
+    int default_config = 1;
+    int default_keyring = 1;
+    int greeting = 0;
+    int nogreeting = 0;
+    int use_random_seed = 1;
+    enum cmd_and_opt_values cmd = 0;
+    const char *trustdb_name = NULL;
+    char *def_cipher_string = NULL;
+    char *def_digest_string = NULL;
+    char *compress_algo_string = NULL;
+    char *cert_digest_string = NULL;
+    char *s2k_cipher_string = NULL;
+    char *s2k_digest_string = NULL;
+    char *pers_cipher_list = NULL;
+    char *pers_digest_list = NULL;
+    char *pers_compress_list = NULL;
+    int eyes_only=0;
+    int multifile=0;
+    int pwfd = -1;
+    int with_fpr = 0; /* make an option out of --fingerprint */
+    int any_explicit_recipient = 0;
+    int require_secmem=0,got_secmem=0;
+#ifdef USE_SHM_COPROCESSING
+    ulong requested_shm_size=0;
+#endif
+
+#ifdef __riscos__
+    opt.lock_once = 1;
+#endif /* __riscos__ */
+
+    reopen_std();
+    trap_unaligned();
+    secmem_set_flags( secmem_get_flags() | 2 ); /* suspend warnings */
+    /* Please note that we may running SUID(ROOT), so be very CAREFUL
+     * when adding any stuff between here and the call to
+     * secmem_init()  somewhere after the option parsing
+     */
+    log_set_name("gpg");
+    secure_randoxmalloc(); /* put random number into secure memory */
+    may_coredump = disable_core_dumps();
+    init_signals();
+    create_dotlock(NULL); /* register locking cleanup */
+    i18n_init();
+    opt.command_fd = -1; /* no command fd */
+    opt.compress_level = -1; /* defaults to standard compress level */
+    opt.bz2_compress_level = -1; /* defaults to standard compress level */
+    /* note: if you change these lines, look at oOpenPGP */
+    opt.def_cipher_algo = 0;
+    opt.def_digest_algo = 0;
+    opt.cert_digest_algo = 0;
+    opt.compress_algo = -1; /* defaults to DEFAULT_COMPRESS_ALGO */
+    opt.s2k_mode = 3; /* iterated+salted */
+    opt.s2k_count = 96; /* 65536 iterations */
+#ifdef USE_CAST5
+    opt.s2k_cipher_algo = CIPHER_ALGO_CAST5;
+#else
+    opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
+#endif
+    opt.completes_needed = 1;
+    opt.marginals_needed = 3;
+    opt.max_cert_depth = 5;
+    opt.pgp2_workarounds = 1;
+    opt.force_v3_sigs = 1;
+    opt.escape_from = 1;
+    opt.import_options=IMPORT_SK2PK;
+    opt.export_options=EXPORT_ATTRIBUTES;
+    opt.keyserver_options.import_options=IMPORT_REPAIR_PKS_SUBKEY_BUG;
+    opt.keyserver_options.export_options=EXPORT_ATTRIBUTES;
+    opt.keyserver_options.options=
+      KEYSERVER_HONOR_KEYSERVER_URL|KEYSERVER_HONOR_PKA_RECORD;
+    opt.verify_options=
+      VERIFY_SHOW_POLICY_URLS|VERIFY_SHOW_STD_NOTATIONS|VERIFY_SHOW_KEYSERVER_URLS;
+    opt.trust_model=TM_AUTO;
+    opt.mangle_dos_filenames=0;
+    opt.min_cert_level=2;
+    set_screen_dimensions();
+    opt.keyid_format=KF_SHORT;
+    opt.rfc2440_text=1;
+    opt.def_sig_expire="0";
+    opt.def_cert_expire="0";
+    set_homedir ( default_homedir () );
+    opt.passwd_repeat=1;
+
+#ifdef ENABLE_CARD_SUPPORT
+#if defined(_WIN32) || defined(__CYGWIN__)
+    opt.pcsc_driver = "winscard.dll";
+#elif defined(__APPLE__)
+    opt.pcsc_driver = "/System/Library/Frameworks/PCSC.framework/PCSC";
+#elif defined(__GLIBC__)
+    opt.pcsc_driver = "libpcsclite.so.1"; 
+#else
+    opt.pcsc_driver = "libpcsclite.so"; 
+#endif
+#endif /*ENABLE_CARD_SUPPORT*/
+
+    /* check whether we have a config file on the commandline */
+    orig_argc = argc;
+    orig_argv = argv;
+    pargs.argc = &argc;
+    pargs.argv = &argv;
+    pargs.flags= 1|(1<<6);  /* do not remove the args, ignore version */
+    while( arg_parse( &pargs, opts) ) {
+       if( pargs.r_opt == oDebug || pargs.r_opt == oDebugAll )
+           parse_debug++;
+       else if( pargs.r_opt == oOptions ) {
+           /* yes there is one, so we do not try the default one, but
+            * read the option file when it is encountered at the commandline
+            */
+           default_config = 0;
+       }
+       else if( pargs.r_opt == oNoOptions )
+           default_config = 0; /* --no-options */
+       else if( pargs.r_opt == oHomedir )
+           set_homedir ( pargs.r.ret_str );
+       else if( pargs.r_opt == oNoPermissionWarn )
+           opt.no_perm_warn=1;
+       else if (pargs.r_opt == oStrict )
+         {
+           opt.strict=1;
+           log_set_strict(1);
+         }
+       else if (pargs.r_opt == oNoStrict )
+         {
+           opt.strict=0;
+           log_set_strict(0);
+         }
+#ifdef USE_SHM_COPROCESSING
+       else if( pargs.r_opt == oRunAsShmCP ) {
+           /* does not make sense in a options file, we do it here,
+            * so that we are the able to drop setuid as soon as possible */
+           opt.shm_coprocess = 1;
+           requested_shm_size = pargs.r.ret_ulong;
+       }
+       else if ( pargs.r_opt == oStatusFD ) {
+           /* this is needed to ensure that the status-fd filedescriptor is
+            * initialized when init_shm_coprocessing() is called */
+           set_status_fd( iobuf_translate_file_handle (pargs.r.ret_int, 1) );
+       }
+#endif
+    }
+
+#ifdef HAVE_DOSISH_SYSTEM
+    if ( strchr (opt.homedir,'\\') ) {
+        char *d, *buf = xmalloc (strlen (opt.homedir)+1);
+        const char *s = opt.homedir;
+        for (d=buf,s=opt.homedir; *s; s++)
+          {
+            *d++ = *s == '\\'? '/': *s;
+#ifdef HAVE_W32_SYSTEM
+            if (s[1] && IsDBCSLeadByte (*s))
+              *d++ = *++s;
+#endif
+          }
+        *d = 0;
+        set_homedir (buf);
+    }
+#endif
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess ) {
+       init_shm_coprocessing(requested_shm_size, 1 );
+    }
+#endif
+    /* initialize the secure memory. */
+    got_secmem=secmem_init( 32768 );
+    maybe_setuid = 0;
+    /* Okay, we are now working under our real uid */
+
+#if defined(HAVE_GETUID) && defined(HAVE_GETEUID)
+    /* There should be no way to get to this spot while still carrying
+       setuid privs.  Just in case, bomb out if we are. */
+    if(getuid()!=geteuid())
+      BUG();
+#endif
+
+    set_native_charset (NULL); /* Try to auto set the character set */
+
+    /* Try for a version specific config file first */
+    if( default_config )
+      {
+       char *name=xstrdup("gpg" EXTSEP_S "conf-" SAFE_VERSION);
+       char *ver=&name[strlen("gpg" EXTSEP_S "conf-")];
+
+       do
+         {
+           if(configname)
+             {
+               char *tok;
+
+               xfree(configname);
+               configname=NULL;
+
+               if((tok=strrchr(ver,SAFE_VERSION_DASH)))
+                 *tok='\0';
+               else if((tok=strrchr(ver,SAFE_VERSION_DOT)))
+                 *tok='\0';
+               else
+                 break;
+             }
+
+           configname = make_filename(opt.homedir,name,NULL);
+         }
+       while(access(configname,R_OK));
+
+       xfree(name);
+
+       if(!configname)
+         configname=make_filename(opt.homedir, "gpg" EXTSEP_S "conf", NULL );
+        if (!access (configname, R_OK))
+          { /* Print a warning when both config files are present. */
+            char *p = make_filename(opt.homedir, "options", NULL );
+            if (!access (p, R_OK))
+              log_info (_("NOTE: old default options file `%s' ignored\n"), p);
+            xfree (p);
+          }
+        else
+          { /* Keep on using the old default one. */
+            xfree (configname);
+            configname = make_filename(opt.homedir, "options", NULL );
+          }
+      }
+    argc = orig_argc;
+    argv = orig_argv;
+    pargs.argc = &argc;
+    pargs.argv = &argv;
+    pargs.flags=  1;  /* do not remove the args */
+
+    /* By this point we have a homedir, and cannot change it. */
+    check_permissions(opt.homedir,0);
+
+  next_pass:
+    if( configname ) {
+      if(check_permissions(configname,1))
+       {
+         /* If any options file is unsafe, then disable any external
+            programs for keyserver calls or photo IDs.  Since the
+            external program to call is set in the options file, a
+            unsafe options file can lead to an arbitrary program
+            being run. */
+
+         opt.exec_disable=1;
+       }
+
+       configlineno = 0;
+       configfp = fopen( configname, "r" );
+        if (configfp && is_secured_file (fileno (configfp)))
+          {
+            fclose (configfp);
+            configfp = NULL;
+            errno = EPERM;
+          }
+       if( !configfp ) {
+           if( default_config ) {
+               if( parse_debug )
+                   log_info(_("NOTE: no default option file `%s'\n"),
+                                                           configname );
+           }
+           else {
+               log_error(_("option file `%s': %s\n"),
+                                   configname, strerror(errno) );
+               g10_exit(2);
+           }
+           xfree(configname); configname = NULL;
+       }
+       if( parse_debug && configname )
+           log_info(_("reading options from `%s'\n"), configname );
+       default_config = 0;
+    }
+
+    while( optfile_parse( configfp, configname, &configlineno,
+                                               &pargs, opts) )
+      {
+       switch( pargs.r_opt )
+         {
+         case aCheckKeys: 
+         case aListConfig:
+          case aGPGConfList:
+          case aGPGConfTest:
+         case aListPackets:
+         case aImport: 
+         case aFastImport: 
+         case aSendKeys: 
+         case aRecvKeys: 
+         case aSearchKeys:
+         case aRefreshKeys:
+         case aFetchKeys:
+         case aExport: 
+            set_cmd (&cmd, pargs.r_opt);
+            break;
+         case aListKeys: set_cmd( &cmd, aListKeys); break;
+         case aListSigs: set_cmd( &cmd, aListSigs); break;
+         case aExportSecret: set_cmd( &cmd, aExportSecret); break;
+         case aExportSecretSub: set_cmd( &cmd, aExportSecretSub); break;
+         case aDeleteSecretKeys:
+           set_cmd( &cmd, aDeleteSecretKeys);
+           greeting=1;
+           break;
+         case aDeleteSecretAndPublicKeys:
+            set_cmd( &cmd, aDeleteSecretAndPublicKeys);
+            greeting=1; 
+            break;
+         case aDeleteKeys: set_cmd( &cmd, aDeleteKeys); greeting=1; break;
+
+         case aDetachedSign: detached_sig = 1; set_cmd( &cmd, aSign ); break;
+         case aSym: set_cmd( &cmd, aSym); break;
+
+         case aDecryptFiles: multifile=1; /* fall through */
+         case aDecrypt: set_cmd( &cmd, aDecrypt); break;
+
+         case aEncrFiles: multifile=1; /* fall through */
+         case aEncr: set_cmd( &cmd, aEncr); break;
+
+         case aVerifyFiles: multifile=1; /* fall through */
+         case aVerify: set_cmd( &cmd, aVerify); break;
+
+         case aSign: set_cmd( &cmd, aSign );  break;
+         case aKeygen: set_cmd( &cmd, aKeygen); greeting=1; break;
+         case aSignKey: set_cmd( &cmd, aSignKey); break;
+         case aLSignKey: set_cmd( &cmd, aLSignKey); break;
+         case aStore: set_cmd( &cmd, aStore); break;
+         case aEditKey: set_cmd( &cmd, aEditKey); greeting=1; break;
+         case aClearsign: set_cmd( &cmd, aClearsign); break;
+         case aGenRevoke: set_cmd( &cmd, aGenRevoke); break;
+         case aDesigRevoke: set_cmd( &cmd, aDesigRevoke); break;
+         case aPrimegen: set_cmd( &cmd, aPrimegen); break;
+         case aGenRandom: set_cmd( &cmd, aGenRandom); break;
+         case aPrintMD: set_cmd( &cmd, aPrintMD); break;
+         case aPrintMDs: set_cmd( &cmd, aPrintMDs); break;
+         case aListTrustDB: set_cmd( &cmd, aListTrustDB); break;
+         case aCheckTrustDB: set_cmd( &cmd, aCheckTrustDB); break;
+         case aUpdateTrustDB: set_cmd( &cmd, aUpdateTrustDB); break;
+         case aFixTrustDB: set_cmd( &cmd, aFixTrustDB); break;
+         case aListTrustPath: set_cmd( &cmd, aListTrustPath); break;
+         case aDeArmor: set_cmd( &cmd, aDeArmor); break;
+         case aEnArmor: set_cmd( &cmd, aEnArmor); break;
+         case aListOwnerTrust:
+           deprecated_warning(configname,configlineno,
+                              "--list-ownertrust","--export-ownertrust","");
+         case aExportOwnerTrust: set_cmd( &cmd, aExportOwnerTrust); break;
+         case aImportOwnerTrust: set_cmd( &cmd, aImportOwnerTrust); break;
+          case aPipeMode:
+           deprecated_command ("--pipemode");
+            set_cmd( &cmd, aPipeMode);
+            break;
+
+          case aRebuildKeydbCaches: set_cmd( &cmd, aRebuildKeydbCaches); break;
+
+#ifdef ENABLE_CARD_SUPPORT
+          case aCardStatus: set_cmd (&cmd, aCardStatus); break;
+          case aCardEdit: set_cmd (&cmd, aCardEdit); break;
+          case aChangePIN: set_cmd (&cmd, aChangePIN); break;
+          case oReaderPort:
+            card_set_reader_port (pargs.r.ret_str);
+            break;
+          case octapiDriver: opt.ctapi_driver = pargs.r.ret_str; break;
+          case opcscDriver: opt.pcsc_driver = pargs.r.ret_str; break;
+          case oDisableCCID: opt.disable_ccid = 1; break;
+#endif /* ENABLE_CARD_SUPPORT*/
+
+         case oArmor: opt.armor = 1; opt.no_armor=0; break;
+         case oOutput: opt.outfile = pargs.r.ret_str; break;
+         case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
+         case oQuiet: opt.quiet = 1; break;
+         case oNoTTY: tty_no_terminal(1); break;
+         case oDryRun: opt.dry_run = 1; break;
+         case oInteractive: opt.interactive = 1; break;
+         case oVerbose:
+           g10_opt_verbose++;
+           opt.verbose++;
+           opt.list_options|=LIST_SHOW_UNUSABLE_UIDS;
+           opt.list_options|=LIST_SHOW_UNUSABLE_SUBKEYS;
+           break;
+         case oKOption: set_cmd( &cmd, aKMode ); break;
+
+         case oBatch: opt.batch = 1; nogreeting = 1; break;
+          case oUseAgent:
+#ifndef __riscos__
+            opt.use_agent = 1;
+#else /* __riscos__ */
+            opt.use_agent = 0;
+            riscos_not_implemented("use-agent");
+#endif /* __riscos__ */
+            break;
+          case oNoUseAgent: opt.use_agent = 0; break;
+         case oGpgAgentInfo: opt.gpg_agent_info = pargs.r.ret_str; break;
+         case oAnswerYes: opt.answer_yes = 1; break;
+         case oAnswerNo: opt.answer_no = 1; break;
+         case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
+         case oPrimaryKeyring:
+           sl=append_to_strlist( &nrings, pargs.r.ret_str);
+           sl->flags=2;
+           break;
+         case oShowKeyring:
+           deprecated_warning(configname,configlineno,"--show-keyring",
+                              "--list-options ","show-keyring");
+           opt.list_options|=LIST_SHOW_KEYRING;
+           break;
+         case oDebug: opt.debug |= pargs.r.ret_ulong; break;
+         case oDebugAll: opt.debug = ~0; break;
+          case oDebugCCIDDriver: 
+#if defined(ENABLE_CARD_SUPPORT) && defined(HAVE_LIBUSB)
+            ccid_set_debug_level (ccid_set_debug_level (1)+1);
+#endif
+            break;
+         case oStatusFD:
+            set_status_fd( iobuf_translate_file_handle (pargs.r.ret_int, 1) );
+            break;
+         case oStatusFile:
+            set_status_fd ( open_info_file (pargs.r.ret_str, 1) );
+            break;
+         case oAttributeFD:
+            set_attrib_fd(iobuf_translate_file_handle (pargs.r.ret_int, 1));
+            break;
+         case oAttributeFile:
+            set_attrib_fd ( open_info_file (pargs.r.ret_str, 1) );
+            break;
+         case oLoggerFD:
+            log_set_logfile( NULL,
+                             iobuf_translate_file_handle (pargs.r.ret_int, 1));
+            break;
+         case oLoggerFile:
+            log_set_logfile( NULL, open_info_file (pargs.r.ret_str, 1) );
+            break;
+
+         case oWithFingerprint:
+            opt.with_fingerprint = 1;
+            with_fpr=1; /*fall thru*/
+         case oFingerprint: opt.fingerprint++; break;
+         case oSecretKeyring:
+            append_to_strlist( &sec_nrings, pargs.r.ret_str);
+            break;
+         case oOptions:
+           /* config files may not be nested (silently ignore them) */
+           if( !configfp ) {
+               xfree(configname);
+               configname = xstrdup(pargs.r.ret_str);
+               goto next_pass;
+           }
+           break;
+         case oNoArmor: opt.no_armor=1; opt.armor=0; break;
+         case oNoDefKeyring: default_keyring = 0; break;
+         case oNoGreeting: nogreeting = 1; break;
+         case oNoVerbose: g10_opt_verbose = 0;
+                          opt.verbose = 0; opt.list_sigs=0; break;
+         case oQuickRandom: quick_random_gen(1); break;
+         case oEmitVersion: opt.no_version=0; break;
+         case oNoEmitVersion: opt.no_version=1; break;
+         case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
+         case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
+         case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
+         case oTrustDBName: trustdb_name = pargs.r.ret_str; break;
+         case oDefaultKey: opt.def_secret_key = pargs.r.ret_str; break;
+         case oDefRecipient:
+                   if( *pargs.r.ret_str )
+                       opt.def_recipient = make_username(pargs.r.ret_str);
+                   break;
+         case oDefRecipientSelf:
+                   xfree(opt.def_recipient); opt.def_recipient = NULL;
+                   opt.def_recipient_self = 1;
+                   break;
+         case oNoDefRecipient:
+                   xfree(opt.def_recipient); opt.def_recipient = NULL;
+                   opt.def_recipient_self = 0;
+                   break;
+         case oNoOptions: opt.no_homedir_creation = 1; break; /* no-options */
+         case oHomedir: break;
+         case oNoBatch: opt.batch = 0; break;
+         case oWithKeyData: opt.with_key_data=1; /* fall thru */
+         case oWithColons: opt.with_colons=':'; break;
+
+         case oSkipVerify: opt.skip_verify=1; break;
+         case oCompressKeys: opt.compress_keys = 1; break;
+         case aListSecretKeys: set_cmd( &cmd, aListSecretKeys); break;
+           /* There are many programs (like mutt) that call gpg with
+              --always-trust so keep this option around for a long
+              time. */
+         case oAlwaysTrust: opt.trust_model=TM_ALWAYS; break;
+         case oTrustModel:
+           parse_trust_model(pargs.r.ret_str);
+           break;
+         case oForceOwnertrust:
+           log_info(_("NOTE: %s is not for normal use!\n"),
+                    "--force-ownertrust");
+           opt.force_ownertrust=string_to_trust_value(pargs.r.ret_str);
+           if(opt.force_ownertrust==-1)
+             {
+               log_error("invalid ownertrust `%s'\n",pargs.r.ret_str);
+               opt.force_ownertrust=0;
+             }
+           break;
+         case oLoadExtension:
+#ifndef __riscos__
+#if defined(USE_DYNAMIC_LINKING) || defined(_WIN32)
+           if(check_permissions(pargs.r.ret_str,2))
+             log_info(_("cipher extension `%s' not loaded due to"
+                        " unsafe permissions\n"),pargs.r.ret_str);
+           else
+             register_cipher_extension(orig_argc? *orig_argv:NULL,
+                                       pargs.r.ret_str);
+#endif
+#else /* __riscos__ */
+            riscos_not_implemented("load-extension");
+#endif /* __riscos__ */
+           break;
+         case oRFC1991:
+           opt.compliance = CO_RFC1991;
+           opt.force_v4_certs = 0;
+           opt.escape_from = 1;
+           break;
+         case oOpenPGP:
+         case oRFC2440:
+           /* TODO: When 2440bis becomes a RFC, set new values for
+              oOpenPGP. */
+           opt.rfc2440_text=1;
+           opt.compliance = CO_RFC2440;
+           opt.allow_non_selfsigned_uid = 1;
+           opt.allow_freeform_uid = 1;
+           opt.pgp2_workarounds = 0;
+           opt.escape_from = 0;
+           opt.force_v3_sigs = 0;
+           opt.compress_keys = 0;          /* not mandated, but we do it */
+           opt.compress_sigs = 0;          /* ditto. */
+           opt.not_dash_escaped = 0;
+           opt.def_cipher_algo = 0;
+           opt.def_digest_algo = 0;
+           opt.cert_digest_algo = 0;
+           opt.compress_algo = -1;
+            opt.s2k_mode = 3; /* iterated+salted */
+           opt.s2k_digest_algo = DIGEST_ALGO_SHA1;
+           opt.s2k_cipher_algo = CIPHER_ALGO_3DES;
+           break;
+         case oPGP2:  opt.compliance = CO_PGP2;  break;
+         case oPGP6:  opt.compliance = CO_PGP6;  break;
+         case oPGP7:  opt.compliance = CO_PGP7;  break;
+         case oPGP8:  opt.compliance = CO_PGP8;  break;
+         case oGnuPG: opt.compliance = CO_GNUPG; break;
+         case oCompressSigs: opt.compress_sigs = 1; break;
+         case oRFC2440Text: opt.rfc2440_text=1; break;
+         case oNoRFC2440Text: opt.rfc2440_text=0; break;
+         case oRunAsShmCP:
+#ifndef __riscos__
+# ifndef USE_SHM_COPROCESSING
+           /* not possible in the option file,
+            * but we print the warning here anyway */
+           log_error("shared memory coprocessing is not available\n");
+# endif
+#else /* __riscos__ */
+            riscos_not_implemented("run-as-shm-coprocess");
+#endif /* __riscos__ */
+           break;
+         case oSetFilename:
+           if(utf8_strings)
+             opt.set_filename = pargs.r.ret_str;
+           else
+             opt.set_filename = native_to_utf8(pargs.r.ret_str);
+           break;
+         case oForYourEyesOnly: eyes_only = 1; break;
+         case oNoForYourEyesOnly: eyes_only = 0; break;
+         case oSetPolicyURL:
+           add_policy_url(pargs.r.ret_str,0);
+           add_policy_url(pargs.r.ret_str,1);
+           break;
+         case oSigPolicyURL: add_policy_url(pargs.r.ret_str,0); break;
+         case oCertPolicyURL: add_policy_url(pargs.r.ret_str,1); break;
+          case oShowPolicyURL:
+           deprecated_warning(configname,configlineno,"--show-policy-url",
+                              "--list-options ","show-policy-urls");
+           deprecated_warning(configname,configlineno,"--show-policy-url",
+                              "--verify-options ","show-policy-urls");
+           opt.list_options|=LIST_SHOW_POLICY_URLS;
+           opt.verify_options|=VERIFY_SHOW_POLICY_URLS;
+           break;
+         case oNoShowPolicyURL:
+           deprecated_warning(configname,configlineno,"--no-show-policy-url",
+                              "--list-options ","no-show-policy-urls");
+           deprecated_warning(configname,configlineno,"--no-show-policy-url",
+                              "--verify-options ","no-show-policy-urls");
+           opt.list_options&=~LIST_SHOW_POLICY_URLS;
+           opt.verify_options&=~VERIFY_SHOW_POLICY_URLS;
+           break;
+         case oSigKeyserverURL: add_keyserver_url(pargs.r.ret_str,0); break;
+         case oUseEmbeddedFilename:
+           opt.flags.use_embedded_filename=1;
+           break;
+         case oNoUseEmbeddedFilename:
+           opt.flags.use_embedded_filename=0;
+           break;
+         case oComment:
+           if(pargs.r.ret_str[0])
+             append_to_strlist(&opt.comments,pargs.r.ret_str);
+           break;
+         case oDefaultComment:
+           deprecated_warning(configname,configlineno,
+                              "--default-comment","--no-comments","");
+           /* fall through */
+         case oNoComments:
+           free_strlist(opt.comments);
+           opt.comments=NULL;
+           break;
+         case oThrowKeyids: opt.throw_keyid = 1; break;
+         case oNoThrowKeyids: opt.throw_keyid = 0; break;
+         case oShowPhotos:
+           deprecated_warning(configname,configlineno,"--show-photos",
+                              "--list-options ","show-photos");
+           deprecated_warning(configname,configlineno,"--show-photos",
+                              "--verify-options ","show-photos");
+           opt.list_options|=LIST_SHOW_PHOTOS;
+           opt.verify_options|=VERIFY_SHOW_PHOTOS;
+           break;
+         case oNoShowPhotos:
+           deprecated_warning(configname,configlineno,"--no-show-photos",
+                              "--list-options ","no-show-photos");
+           deprecated_warning(configname,configlineno,"--no-show-photos",
+                              "--verify-options ","no-show-photos");
+           opt.list_options&=~LIST_SHOW_PHOTOS;
+           opt.verify_options&=~VERIFY_SHOW_PHOTOS;
+           break;
+         case oPhotoViewer: opt.photo_viewer = pargs.r.ret_str; break;
+         case oForceV3Sigs: opt.force_v3_sigs = 1; break;
+         case oNoForceV3Sigs: opt.force_v3_sigs = 0; break;
+          case oForceV4Certs: opt.force_v4_certs = 1; break;
+          case oNoForceV4Certs: opt.force_v4_certs = 0; break;
+         case oForceMDC: opt.force_mdc = 1; break;
+         case oNoForceMDC: opt.force_mdc = 0; break;
+         case oDisableMDC: opt.disable_mdc = 1; break;
+         case oNoDisableMDC: opt.disable_mdc = 0; break;
+         case oS2KMode:   opt.s2k_mode = pargs.r.ret_int; break;
+         case oS2KDigest: s2k_digest_string = xstrdup(pargs.r.ret_str); break;
+         case oS2KCipher: s2k_cipher_string = xstrdup(pargs.r.ret_str); break;
+         case oS2KCount:
+           opt.s2k_count=encode_s2k_iterations(pargs.r.ret_int);
+           break;
+          case oSimpleSKChecksum: opt.simple_sk_checksum = 1; break;
+         case oNoEncryptTo: opt.no_encrypt_to = 1; break;
+         case oEncryptTo: /* store the recipient in the second list */
+           sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
+           sl->flags = 1;
+           break;
+         case oHiddenEncryptTo: /* store the recipient in the second list */
+           sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
+           sl->flags = 1|2;
+           break;
+         case oRecipient: /* store the recipient */
+           add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
+            any_explicit_recipient = 1;
+           break;
+         case oHiddenRecipient: /* store the recipient with a flag */
+           sl = add_to_strlist2( &remusr, pargs.r.ret_str, utf8_strings );
+           sl->flags = 2;
+            any_explicit_recipient = 1;
+           break;
+         case oTextmodeShort: opt.textmode = 2; break;
+         case oTextmode: opt.textmode=1;  break;
+         case oNoTextmode: opt.textmode=0;  break;
+         case oExpert: opt.expert = 1; break;
+         case oNoExpert: opt.expert = 0; break;
+         case oDefSigExpire:
+           if(*pargs.r.ret_str!='\0')
+             {
+               if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
+                 log_error(_("`%s' is not a valid signature expiration\n"),
+                           pargs.r.ret_str);
+               else
+                 opt.def_sig_expire=pargs.r.ret_str;
+             }
+           break;
+         case oAskSigExpire: opt.ask_sig_expire = 1; break;
+         case oNoAskSigExpire: opt.ask_sig_expire = 0; break;
+         case oDefCertExpire:
+           if(*pargs.r.ret_str!='\0')
+             {
+               if(parse_expire_string(pargs.r.ret_str)==(u32)-1)
+                 log_error(_("`%s' is not a valid signature expiration\n"),
+                           pargs.r.ret_str);
+               else
+                 opt.def_cert_expire=pargs.r.ret_str;
+             }
+           break;
+         case oAskCertExpire: opt.ask_cert_expire = 1; break;
+         case oNoAskCertExpire: opt.ask_cert_expire = 0; break;
+          case oDefCertLevel: opt.def_cert_level=pargs.r.ret_int; break;
+          case oMinCertLevel: opt.min_cert_level=pargs.r.ret_int; break;
+         case oAskCertLevel: opt.ask_cert_level = 1; break;
+         case oNoAskCertLevel: opt.ask_cert_level = 0; break;
+         case oLocalUser: /* store the local users */
+           add_to_strlist2( &locusr, pargs.r.ret_str, utf8_strings );
+           break;
+         case oCompress:
+           /* this is the -z command line option */
+           opt.compress_level = opt.bz2_compress_level = pargs.r.ret_int;
+           break;
+         case oCompressLevel: opt.compress_level = pargs.r.ret_int; break;
+         case oBZ2CompressLevel: opt.bz2_compress_level = pargs.r.ret_int; break;
+         case oBZ2DecompressLowmem: opt.bz2_decompress_lowmem=1; break;
+         case oPasswd:
+           set_passphrase_from_string(pargs.r.ret_str);
+           break;
+         case oPasswdFD:
+            pwfd = iobuf_translate_file_handle (pargs.r.ret_int, 0);
+            opt.use_agent = 0;
+            break;
+         case oPasswdFile:
+            pwfd = open_info_file (pargs.r.ret_str, 0);
+            break;
+         case oPasswdRepeat: opt.passwd_repeat=pargs.r.ret_int; break;
+         case oCommandFD:
+            opt.command_fd = iobuf_translate_file_handle (pargs.r.ret_int, 0);
+            break;
+         case oCommandFile:
+            opt.command_fd = open_info_file (pargs.r.ret_str, 0);
+            break;
+         case oCipherAlgo: 
+            def_cipher_string = xstrdup(pargs.r.ret_str);
+            break;
+         case oDigestAlgo:
+            def_digest_string = xstrdup(pargs.r.ret_str);
+            break;
+         case oCompressAlgo:
+           /* If it is all digits, stick a Z in front of it for
+              later.  This is for backwards compatibility with
+              versions that took the compress algorithm number. */
+           {
+             char *pt=pargs.r.ret_str;
+             while(*pt)
+               {
+                 if (!isascii (*pt) || !isdigit (*pt))
+                   break;
+
+                 pt++;
+               }
+
+             if(*pt=='\0')
+               {
+                 compress_algo_string=xmalloc(strlen(pargs.r.ret_str)+2);
+                 strcpy(compress_algo_string,"Z");
+                 strcat(compress_algo_string,pargs.r.ret_str);
+               }
+             else
+               compress_algo_string = xstrdup(pargs.r.ret_str);
+           }
+           break;
+         case oCertDigestAlgo: cert_digest_string = xstrdup(pargs.r.ret_str); break;
+         case oNoSecmemWarn: secmem_set_flags( secmem_get_flags() | 1 ); break;
+         case oRequireSecmem: require_secmem=1; break;
+         case oNoRequireSecmem: require_secmem=0; break;
+         case oNoPermissionWarn: opt.no_perm_warn=1; break;
+         case oNoMDCWarn: opt.no_mdc_warn=1; break;
+          case oDisplayCharset:
+           if( set_native_charset( pargs.r.ret_str ) )
+               log_error(_("`%s' is not a valid character set\n"),
+                         pargs.r.ret_str);
+           break;
+         case oNotDashEscaped: opt.not_dash_escaped = 1; break;
+         case oEscapeFrom: opt.escape_from = 1; break;
+         case oNoEscapeFrom: opt.escape_from = 0; break;
+         case oLockOnce: opt.lock_once = 1; break;
+         case oLockNever:
+            disable_dotlock ();
+            random_disable_locking ();
+            break;
+         case oLockMultiple:
+#ifndef __riscos__
+           opt.lock_once = 0;
+#else /* __riscos__ */
+            riscos_not_implemented("lock-multiple");
+#endif /* __riscos__ */
+            break;
+         case oKeyServer:
+           {
+             struct keyserver_spec *keyserver;
+             keyserver=parse_keyserver_uri(pargs.r.ret_str,0,
+                                           configname,configlineno);
+             if(!keyserver)
+               log_error(_("could not parse keyserver URL\n"));
+             else
+               {
+                 keyserver->next=opt.keyserver;
+                 opt.keyserver=keyserver;
+               }
+           }
+           break;
+         case oKeyServerOptions:
+           if(!parse_keyserver_options(pargs.r.ret_str))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid keyserver options\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid keyserver options\n"));
+             }
+           break;
+         case oImportOptions:
+           if(!parse_import_options(pargs.r.ret_str,&opt.import_options,1))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid import options\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid import options\n"));
+             }
+           break;
+         case oExportOptions:
+           if(!parse_export_options(pargs.r.ret_str,&opt.export_options,1))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid export options\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid export options\n"));
+             }
+           break;
+         case oListOptions:
+           if(!parse_list_options(pargs.r.ret_str))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid list options\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid list options\n"));
+             }
+           break;
+         case oVerifyOptions:
+           {
+             struct parse_options vopts[]=
+               {
+                 {"show-photos",VERIFY_SHOW_PHOTOS,NULL,
+                  N_("display photo IDs during signature verification")},
+                 {"show-policy-urls",VERIFY_SHOW_POLICY_URLS,NULL,
+                  N_("show policy URLs during signature verification")},
+                 {"show-notations",VERIFY_SHOW_NOTATIONS,NULL,
+                  N_("show all notations during signature verification")},
+                 {"show-std-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
+                  N_("show IETF standard notations during signature verification")},
+                 {"show-standard-notations",VERIFY_SHOW_STD_NOTATIONS,NULL,
+                  NULL},
+                 {"show-user-notations",VERIFY_SHOW_USER_NOTATIONS,NULL,
+                  N_("show user-supplied notations during signature verification")},
+                 {"show-keyserver-urls",VERIFY_SHOW_KEYSERVER_URLS,NULL,
+                  N_("show preferred keyserver URLs during signature verification")},
+                 {"show-uid-validity",VERIFY_SHOW_UID_VALIDITY,NULL,
+                  N_("show user ID validity during signature verification")},
+                 {"show-unusable-uids",VERIFY_SHOW_UNUSABLE_UIDS,NULL,
+                  N_("show revoked and expired user IDs in signature verification")},
+                 {"pka-lookups",VERIFY_PKA_LOOKUPS,NULL,
+                  N_("validate signatures with PKA data")},
+                 {"pka-trust-increase",VERIFY_PKA_TRUST_INCREASE,NULL,
+                  N_("elevate the trust of signatures with valid PKA data")},
+                 {NULL,0,NULL,NULL}
+               };
+
+             if(!parse_options(pargs.r.ret_str,&opt.verify_options,vopts,1))
+               {
+                 if(configname)
+                   log_error(_("%s:%d: invalid verify options\n"),
+                             configname,configlineno);
+                 else
+                   log_error(_("invalid verify options\n"));
+               }
+           }
+           break;
+         case oTempDir: opt.temp_dir=pargs.r.ret_str; break;
+         case oExecPath:
+           if(set_exec_path(pargs.r.ret_str))
+             log_error(_("unable to set exec-path to %s\n"),pargs.r.ret_str);
+           else
+             opt.exec_path_set=1;
+           break;
+         case oSetNotation:
+           add_notation_data( pargs.r.ret_str, 0 );
+           add_notation_data( pargs.r.ret_str, 1 );
+           break;
+         case oSigNotation: add_notation_data( pargs.r.ret_str, 0 ); break;
+         case oCertNotation: add_notation_data( pargs.r.ret_str, 1 ); break;
+         case oShowNotation:
+           deprecated_warning(configname,configlineno,"--show-notation",
+                              "--list-options ","show-notations");
+           deprecated_warning(configname,configlineno,"--show-notation",
+                              "--verify-options ","show-notations");
+           opt.list_options|=LIST_SHOW_NOTATIONS;
+           opt.verify_options|=VERIFY_SHOW_NOTATIONS;
+           break;
+         case oNoShowNotation:
+           deprecated_warning(configname,configlineno,"--no-show-notation",
+                              "--list-options ","no-show-notations");
+           deprecated_warning(configname,configlineno,"--no-show-notation",
+                              "--verify-options ","no-show-notations");
+           opt.list_options&=~LIST_SHOW_NOTATIONS;
+           opt.verify_options&=~VERIFY_SHOW_NOTATIONS;
+           break;
+         case oUtf8Strings: utf8_strings = 1; break;
+         case oNoUtf8Strings: utf8_strings = 0; break;
+         case oDisableCipherAlgo:
+               disable_cipher_algo( string_to_cipher_algo(pargs.r.ret_str) );
+               break;
+         case oDisablePubkeyAlgo:
+               disable_pubkey_algo( string_to_pubkey_algo(pargs.r.ret_str) );
+               break;
+          case oNoSigCache: opt.no_sig_cache = 1; break;
+          case oNoSigCreateCheck: opt.no_sig_create_check = 1; break;
+         case oAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid = 1; break;
+         case oNoAllowNonSelfsignedUID: opt.allow_non_selfsigned_uid=0; break;
+         case oAllowFreeformUID: opt.allow_freeform_uid = 1; break;
+         case oNoAllowFreeformUID: opt.allow_freeform_uid = 0; break;
+         case oNoLiteral: opt.no_literal = 1; break;
+         case oSetFilesize: opt.set_filesize = pargs.r.ret_ulong; break;
+         case oHonorHttpProxy:
+               add_to_strlist(&opt.keyserver_options.other,"http-proxy");
+               deprecated_warning(configname,configlineno,
+                                  "--honor-http-proxy",
+                                  "--keyserver-options ","http-proxy");
+               break;
+         case oFastListMode: opt.fast_list_mode = 1; break;
+         case oFixedListMode: opt.fixed_list_mode = 1; break;
+         case oListOnly: opt.list_only=1; break;
+         case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
+         case oIgnoreValidFrom: opt.ignore_valid_from = 1; break;
+         case oIgnoreCrcError: opt.ignore_crc_error = 1; break;
+         case oIgnoreMDCError: opt.ignore_mdc_error = 1; break;
+         case oNoRandomSeedFile: use_random_seed = 0; break;
+         case oAutoKeyRetrieve:
+         case oNoAutoKeyRetrieve:
+               if(pargs.r_opt==oAutoKeyRetrieve)
+                 opt.keyserver_options.options|=KEYSERVER_AUTO_KEY_RETRIEVE;
+               else
+                 opt.keyserver_options.options&=~KEYSERVER_AUTO_KEY_RETRIEVE;
+
+               deprecated_warning(configname,configlineno,
+                          pargs.r_opt==oAutoKeyRetrieve?"--auto-key-retrieve":
+                              "--no-auto-key-retrieve","--keyserver-options ",
+                          pargs.r_opt==oAutoKeyRetrieve?"auto-key-retrieve":
+                              "no-auto-key-retrieve");
+               break;
+         case oShowSessionKey: opt.show_session_key = 1; break;
+         case oOverrideSessionKey:
+               opt.override_session_key = pargs.r.ret_str;
+               break;
+         case oMergeOnly:
+               deprecated_warning(configname,configlineno,"--merge-only",
+                                  "--import-options ","merge-only");
+               opt.import_options|=IMPORT_MERGE_ONLY;
+           break;
+          case oAllowSecretKeyImport: /* obsolete */ break;
+         case oTryAllSecrets: opt.try_all_secrets = 1; break;
+          case oTrustedKey: register_trusted_key( pargs.r.ret_str ); break;
+          case oEnableSpecialFilenames:
+            iobuf_enable_special_filenames (1);
+            break;
+          case oNoExpensiveTrustChecks: opt.no_expensive_trust_checks=1; break;
+          case oAutoCheckTrustDB: opt.no_auto_check_trustdb=0; break;
+          case oNoAutoCheckTrustDB: opt.no_auto_check_trustdb=1; break;
+          case oPreservePermissions: opt.preserve_permissions=1; break;
+          case oDefaultPreferenceList:
+           opt.def_preference_list = pargs.r.ret_str;
+           break;
+         case oDefaultKeyserverURL:
+           {
+             struct keyserver_spec *keyserver;
+             keyserver=parse_keyserver_uri(pargs.r.ret_str,1,
+                                           configname,configlineno);
+             if(!keyserver)
+               log_error(_("could not parse keyserver URL\n"));
+             else
+               free_keyserver_spec(keyserver);
+
+             opt.def_keyserver_url = pargs.r.ret_str;
+           }
+           break;
+          case oPersonalCipherPreferences:
+           pers_cipher_list=pargs.r.ret_str;
+           break;
+          case oPersonalDigestPreferences:
+           pers_digest_list=pargs.r.ret_str;
+           break;
+          case oPersonalCompressPreferences:
+           pers_compress_list=pargs.r.ret_str;
+           break;
+          case oDisplay: opt.display = pargs.r.ret_str; break;
+          case oTTYname: opt.ttyname = pargs.r.ret_str; break;
+          case oTTYtype: opt.ttytype = pargs.r.ret_str; break;
+          case oLCctype: opt.lc_ctype = pargs.r.ret_str; break;
+          case oLCmessages: opt.lc_messages = pargs.r.ret_str; break;
+         case oGroup: add_group(pargs.r.ret_str); break;
+         case oUnGroup: rm_group(pargs.r.ret_str); break;
+         case oNoGroups:
+           while(opt.grouplist)
+             {
+               struct groupitem *iter=opt.grouplist;
+               free_strlist(iter->values);
+               opt.grouplist=opt.grouplist->next;
+               xfree(iter);
+             }
+           break;
+         case oStrict: opt.strict=1; log_set_strict(1); break;
+         case oNoStrict: opt.strict=0; log_set_strict(0); break;
+          case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break;
+          case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break;
+          case oEnableProgressFilter: opt.enable_progress_filter = 1; break;
+         case oMultifile: multifile=1; break;
+         case oKeyidFormat:
+           if(ascii_strcasecmp(pargs.r.ret_str,"short")==0)
+             opt.keyid_format=KF_SHORT;
+           else if(ascii_strcasecmp(pargs.r.ret_str,"long")==0)
+             opt.keyid_format=KF_LONG;
+           else if(ascii_strcasecmp(pargs.r.ret_str,"0xshort")==0)
+             opt.keyid_format=KF_0xSHORT;
+           else if(ascii_strcasecmp(pargs.r.ret_str,"0xlong")==0)
+             opt.keyid_format=KF_0xLONG;
+           else
+             log_error("unknown keyid-format `%s'\n",pargs.r.ret_str);
+           break;
+
+          case oExitOnStatusWriteError:
+            opt.exit_on_status_write_error = 1;
+            break;
+
+         case oLimitCardInsertTries: 
+            opt.limit_card_insert_tries = pargs.r.ret_int; 
+            break;
+
+         case oRequireCrossCert: opt.flags.require_cross_cert=1; break;
+         case oNoRequireCrossCert: opt.flags.require_cross_cert=0; break;
+
+         case oAutoKeyLocate:
+           if(!parse_auto_key_locate(pargs.r.ret_str))
+             {
+               if(configname)
+                 log_error(_("%s:%d: invalid auto-key-locate list\n"),
+                           configname,configlineno);
+               else
+                 log_error(_("invalid auto-key-locate list\n"));
+             }
+           break;
+         case oNoAutoKeyLocate:
+           release_akl();
+           break;
+
+          case oAllowMultisigVerification:
+            opt.allow_multisig_verification = 1;
+            break;
+
+         case oEnableDSA2: opt.flags.dsa2=1; break;
+         case oDisableDSA2: opt.flags.dsa2=0; break;
+
+         case oNoop: break;
+
+         default : pargs.err = configfp? 1:2; break;
+         }
+      }
+
+
+    if( configfp ) {
+       fclose( configfp );
+       configfp = NULL;
+        /* Remember the first config file name. */
+        if (!save_configname)
+          save_configname = configname;
+        else
+          xfree(configname);
+        configname = NULL;
+       goto next_pass;
+    }
+    xfree( configname ); configname = NULL;
+    if( log_get_errorcount(0) )
+       g10_exit(2);
+
+    /* The command --gpgconf-list is pretty simple and may be called
+       directly after the option parsing. */
+    if (cmd == aGPGConfList)
+      {
+        gpgconf_list (save_configname);
+        g10_exit (0);
+      }
+    xfree (save_configname);
+
+    if( nogreeting )
+       greeting = 0;
+
+    if( greeting ) {
+       fprintf(stderr, "%s %s; %s\n",
+                       strusage(11), strusage(13), strusage(14) );
+       fprintf(stderr, "%s\n", strusage(15) );
+    }
+#ifdef IS_DEVELOPMENT_VERSION
+    if( !opt.batch )
+      {
+       const char *s;
+
+       if((s=strusage(20)))
+         log_info("%s\n",s);
+       if((s=strusage(21)))
+         log_info("%s\n",s);
+       if((s=strusage(22)))
+         log_info("%s\n",s);
+      }
+#endif
+
+    if (opt.verbose > 2)
+        log_info ("using character set `%s'\n", get_native_charset ());
+
+    if( may_coredump && !opt.quiet )
+       log_info(_("WARNING: program may create a core file!\n"));
+
+    if (eyes_only) {
+      if (opt.set_filename)
+         log_info(_("WARNING: %s overrides %s\n"),
+                  "--for-your-eyes-only","--set-filename");
+
+      opt.set_filename="_CONSOLE";
+    }
+
+    if (opt.no_literal) {
+       log_info(_("NOTE: %s is not for normal use!\n"), "--no-literal");
+       if (opt.textmode)
+           log_error(_("%s not allowed with %s!\n"),
+                      "--textmode", "--no-literal" );
+       if (opt.set_filename)
+           log_error(_("%s makes no sense with %s!\n"),
+                       eyes_only?"--for-your-eyes-only":"--set-filename",
+                       "--no-literal" );
+    }
+
+#ifndef ENABLE_AGENT_SUPPORT   
+    if (opt.use_agent) {
+      log_info(_("NOTE: %s is not available in this version\n"),
+               "--use-agent");
+      opt.use_agent = 0;
+    }
+#endif /*!ENABLE_AGENT_SUPPORT*/
+
+    if (opt.set_filesize)
+       log_info(_("NOTE: %s is not for normal use!\n"), "--set-filesize");
+    if( opt.batch )
+       tty_batchmode( 1 );
+
+    secmem_set_flags( secmem_get_flags() & ~2 ); /* resume warnings */
+
+    if(require_secmem && !got_secmem)
+      {
+       log_info(_("will not run with insecure memory due to %s\n"),
+                "--require-secmem");
+       g10_exit(2);
+      }
+
+    set_debug();
+
+    /* Do these after the switch(), so they can override settings. */
+    if(PGP2)
+      {
+       int unusable=0;
+
+       if(cmd==aSign && !detached_sig)
+         {
+           log_info(_("you can only make detached or clear signatures "
+                      "while in --pgp2 mode\n"));
+           unusable=1;
+         }
+       else if(cmd==aSignEncr || cmd==aSignSym)
+         {
+           log_info(_("you can't sign and encrypt at the "
+                      "same time while in --pgp2 mode\n"));
+           unusable=1;
+         }
+       else if(argc==0 && (cmd==aSign || cmd==aEncr || cmd==aSym))
+         {
+           log_info(_("you must use files (and not a pipe) when "
+                      "working with --pgp2 enabled.\n"));
+           unusable=1;
+         }
+       else if(cmd==aEncr || cmd==aSym)
+         {
+           /* Everything else should work without IDEA (except using
+              a secret key encrypted with IDEA and setting an IDEA
+              preference, but those have their own error
+              messages). */
+
+           if(check_cipher_algo(CIPHER_ALGO_IDEA))
+             {
+               log_info(_("encrypting a message in --pgp2 mode requires "
+                          "the IDEA cipher\n"));
+               idea_cipher_warn(1);
+               unusable=1;
+             }
+           else if(cmd==aSym)
+             {
+               /* This only sets IDEA for symmetric encryption
+                  since it is set via select_algo_from_prefs for
+                  pk encryption. */
+               xfree(def_cipher_string);
+               def_cipher_string = xstrdup("idea");
+             }
+
+           /* PGP2 can't handle the output from the textmode
+              filter, so we disable it for anything that could
+              create a literal packet (only encryption and
+              symmetric encryption, since we disable signing
+              above). */
+           if(!unusable)
+             opt.textmode=0;
+         }
+
+       if(unusable)
+         compliance_failure();
+       else
+         {
+           opt.force_v4_certs = 0;
+           opt.escape_from = 1;
+           opt.force_v3_sigs = 1;
+           opt.pgp2_workarounds = 1;
+           opt.ask_sig_expire = 0;
+           opt.ask_cert_expire = 0;
+           xfree(def_digest_string);
+           def_digest_string = xstrdup("md5");
+           xfree(s2k_digest_string);
+           s2k_digest_string = xstrdup("md5");
+           opt.compress_algo = COMPRESS_ALGO_ZIP;
+         }
+      }
+    else if(PGP6)
+      {
+       opt.escape_from=1;
+       opt.force_v3_sigs=1;
+       opt.ask_sig_expire=0;
+      }
+    else if(PGP7)
+      {
+       opt.escape_from=1;
+       opt.force_v3_sigs=1;
+       opt.ask_sig_expire=0;
+      }
+    else if(PGP8)
+      {
+       opt.escape_from=1;
+      }
+
+    /* must do this after dropping setuid, because string_to...
+     * may try to load an module */
+    if( def_cipher_string ) {
+       opt.def_cipher_algo = string_to_cipher_algo(def_cipher_string);
+       if(opt.def_cipher_algo==0 &&
+          (ascii_strcasecmp(def_cipher_string,"idea")==0
+           || ascii_strcasecmp(def_cipher_string,"s1")==0))
+         idea_cipher_warn(1);
+       xfree(def_cipher_string); def_cipher_string = NULL;
+       if( check_cipher_algo(opt.def_cipher_algo) )
+           log_error(_("selected cipher algorithm is invalid\n"));
+    }
+    if( def_digest_string ) {
+       opt.def_digest_algo = string_to_digest_algo(def_digest_string);
+       xfree(def_digest_string); def_digest_string = NULL;
+       if( check_digest_algo(opt.def_digest_algo) )
+           log_error(_("selected digest algorithm is invalid\n"));
+    }
+    if( compress_algo_string ) {
+       opt.compress_algo = string_to_compress_algo(compress_algo_string);
+       xfree(compress_algo_string); compress_algo_string = NULL;
+       if( check_compress_algo(opt.compress_algo) )
+           log_error(_("selected compression algorithm is invalid\n"));
+    }
+    if( cert_digest_string ) {
+       opt.cert_digest_algo = string_to_digest_algo(cert_digest_string);
+       xfree(cert_digest_string); cert_digest_string = NULL;
+       if( check_digest_algo(opt.cert_digest_algo) )
+           log_error(_("selected certification digest algorithm is invalid\n"));
+    }
+    if( s2k_cipher_string ) {
+       opt.s2k_cipher_algo = string_to_cipher_algo(s2k_cipher_string);
+       xfree(s2k_cipher_string); s2k_cipher_string = NULL;
+       if( check_cipher_algo(opt.s2k_cipher_algo) )
+           log_error(_("selected cipher algorithm is invalid\n"));
+    }
+    if( s2k_digest_string ) {
+       opt.s2k_digest_algo = string_to_digest_algo(s2k_digest_string);
+       xfree(s2k_digest_string); s2k_digest_string = NULL;
+       if( check_digest_algo(opt.s2k_digest_algo) )
+           log_error(_("selected digest algorithm is invalid\n"));
+    }
+    if( opt.completes_needed < 1 )
+      log_error(_("completes-needed must be greater than 0\n"));
+    if( opt.marginals_needed < 2 )
+      log_error(_("marginals-needed must be greater than 1\n"));
+    if( opt.max_cert_depth < 1 || opt.max_cert_depth > 255 )
+      log_error(_("max-cert-depth must be in the range from 1 to 255\n"));
+    if(opt.def_cert_level<0 || opt.def_cert_level>3)
+      log_error(_("invalid default-cert-level; must be 0, 1, 2, or 3\n"));
+    if( opt.min_cert_level < 1 || opt.min_cert_level > 3 )
+      log_error(_("invalid min-cert-level; must be 1, 2, or 3\n"));
+    switch( opt.s2k_mode ) {
+      case 0:
+       log_info(_("NOTE: simple S2K mode (0) is strongly discouraged\n"));
+       break;
+      case 1: case 3: break;
+      default:
+       log_error(_("invalid S2K mode; must be 0, 1 or 3\n"));
+    }
+
+    /* This isn't actually needed, but does serve to error out if the
+       string is invalid. */
+    if(opt.def_preference_list &&
+       keygen_set_std_prefs(opt.def_preference_list,0))
+      log_error(_("invalid default preferences\n"));
+
+    /* We provide defaults for the personal digest list.  This is
+       SHA-1. */
+    if(!pers_digest_list)
+      pers_digest_list="h2";
+
+    if(pers_cipher_list &&
+       keygen_set_std_prefs(pers_cipher_list,PREFTYPE_SYM))
+      log_error(_("invalid personal cipher preferences\n"));
+
+    if(pers_digest_list &&
+       keygen_set_std_prefs(pers_digest_list,PREFTYPE_HASH))
+      log_error(_("invalid personal digest preferences\n"));
+
+    if(pers_compress_list &&
+       keygen_set_std_prefs(pers_compress_list,PREFTYPE_ZIP))
+      log_error(_("invalid personal compress preferences\n"));
+
+    /* We don't support all possible commands with multifile yet */
+    if(multifile)
+      {
+       char *cmdname;
+
+       switch(cmd)
+         {
+         case aSign:
+           cmdname="--sign";
+           break;
+         case aClearsign:
+           cmdname="--clearsign";
+           break;
+         case aDetachedSign:
+           cmdname="--detach-sign";
+           break;
+         case aSym:
+           cmdname="--symmetric";
+           break;
+         case aEncrSym:
+           cmdname="--symmetric --encrypt";
+           break;
+         case aStore:
+           cmdname="--store";
+           break;
+         default:
+           cmdname=NULL;
+           break;
+         }
+
+       if(cmdname)
+         log_error(_("%s does not yet work with %s\n"),cmdname,"--multifile");
+      }
+
+    if( log_get_errorcount(0) )
+       g10_exit(2);
+
+    if(opt.compress_level==0)
+      opt.compress_algo=COMPRESS_ALGO_NONE;
+
+    /* Check our chosen algorithms against the list of legal
+       algorithms. */
+
+    if(!GNUPG)
+      {
+       const char *badalg=NULL;
+       preftype_t badtype=PREFTYPE_NONE;
+
+       if(opt.def_cipher_algo
+          && !algo_available(PREFTYPE_SYM,opt.def_cipher_algo,NULL))
+         {
+           badalg=cipher_algo_to_string(opt.def_cipher_algo);
+           badtype=PREFTYPE_SYM;
+         }
+       else if(opt.def_digest_algo
+               && !algo_available(PREFTYPE_HASH,opt.def_digest_algo,NULL))
+         {
+           badalg=digest_algo_to_string(opt.def_digest_algo);
+           badtype=PREFTYPE_HASH;
+         }
+       else if(opt.cert_digest_algo
+               && !algo_available(PREFTYPE_HASH,opt.cert_digest_algo,NULL))
+         {
+           badalg=digest_algo_to_string(opt.cert_digest_algo);
+           badtype=PREFTYPE_HASH;
+         }
+       else if(opt.compress_algo!=-1
+               && !algo_available(PREFTYPE_ZIP,opt.compress_algo,NULL))
+         {
+           badalg=compress_algo_to_string(opt.compress_algo);
+           badtype=PREFTYPE_ZIP;
+         }
+
+       if(badalg)
+         {
+           switch(badtype)
+             {
+             case PREFTYPE_SYM:
+               log_info(_("you may not use cipher algorithm `%s'"
+                          " while in %s mode\n"),
+                        badalg,compliance_option_string());
+               break;
+             case PREFTYPE_HASH:
+               log_info(_("you may not use digest algorithm `%s'"
+                          " while in %s mode\n"),
+                        badalg,compliance_option_string());
+               break;
+             case PREFTYPE_ZIP:
+               log_info(_("you may not use compression algorithm `%s'"
+                          " while in %s mode\n"),
+                        badalg,compliance_option_string());
+               break;
+             default:
+               BUG();
+             }
+
+           compliance_failure();
+         }
+      }
+
+    /* set the random seed file */
+    if( use_random_seed ) {
+       char *p = make_filename(opt.homedir, "random_seed", NULL );
+       set_random_seed_file(p);
+        if (!access (p, F_OK))
+          register_secured_file (p);
+       xfree(p);
+    }
+
+    if( !cmd && opt.fingerprint && !with_fpr ) {
+       set_cmd( &cmd, aListKeys);
+    }
+
+    if( cmd == aKMode || cmd == aKModeC ) { /* kludge to be compatible to pgp */
+       if( cmd == aKModeC ) {
+           opt.fingerprint = 1;
+           cmd = aKMode;
+       }
+       opt.list_sigs = 0;
+       if( opt.verbose > 2 )
+           opt.check_sigs++;
+       if( opt.verbose > 1 )
+           opt.list_sigs++;
+
+       opt.verbose = opt.verbose > 1;
+       g10_opt_verbose = opt.verbose;
+    }
+
+    /* kludge to let -sat generate a clear text signature */
+    if( opt.textmode == 2 && !detached_sig && opt.armor && cmd == aSign )
+       cmd = aClearsign;
+
+    if( opt.verbose > 1 )
+       set_packet_list_mode(1);
+
+    if (cmd == aGPGConfTest)
+      g10_exit(0);
+
+    /* Add the keyrings, but not for some special commands and not in
+       case of "-kvv userid keyring".  Also avoid adding the secret
+       keyring for a couple of commands to avoid unneeded access in
+       case the secrings are stored on a floppy.
+       
+       We always need to add the keyrings if we are running under
+       SELinux, this is so that the rings are added to the list of
+       secured files. */
+    if( ALWAYS_ADD_KEYRINGS 
+        || (cmd != aDeArmor && cmd != aEnArmor
+            && !(cmd == aKMode && argc == 2 )) ) 
+      {
+        if (ALWAYS_ADD_KEYRINGS
+            || (cmd != aCheckKeys && cmd != aListSigs && cmd != aListKeys
+                && cmd != aVerify && cmd != aSym))
+          {
+            if (!sec_nrings || default_keyring) /* add default secret rings */
+              keydb_add_resource ("secring" EXTSEP_S "gpg", 4, 1);
+            for (sl = sec_nrings; sl; sl = sl->next)
+              keydb_add_resource ( sl->d, 0, 1 );
+          }
+       if( !nrings || default_keyring )  /* add default ring */
+           keydb_add_resource ("pubring" EXTSEP_S "gpg", 4, 0);
+       for(sl = nrings; sl; sl = sl->next )
+           keydb_add_resource ( sl->d, sl->flags, 0 );
+      }
+    FREE_STRLIST(nrings);
+    FREE_STRLIST(sec_nrings);
+
+
+    if( pwfd != -1 )  /* read the passphrase now. */
+       read_passphrase_from_fd( pwfd );
+
+    fname = argc? *argv : NULL;
+
+    if(fname && utf8_strings)
+      opt.flags.utf8_filename=1;
+
+    switch( cmd ) {
+      case aPrimegen:
+      case aPrintMD:
+      case aPrintMDs:
+      case aGenRandom:
+      case aDeArmor:
+      case aEnArmor:
+      case aFixTrustDB:
+       break;
+      case aExportOwnerTrust: rc = setup_trustdb( 0, trustdb_name ); break;
+      case aListTrustDB: rc = setup_trustdb( argc? 1:0, trustdb_name ); break;
+      default: rc = setup_trustdb(1, trustdb_name ); break;
+    }
+    if( rc )
+       log_error(_("failed to initialize the TrustDB: %s\n"), g10_errstr(rc));
+
+
+    switch (cmd)
+      {
+      case aStore: 
+      case aSym:  
+      case aSign: 
+      case aSignSym: 
+      case aClearsign: 
+        if (!opt.quiet && any_explicit_recipient)
+          log_info (_("WARNING: recipients (-r) given "
+                      "without using public key encryption\n"));
+       break;
+      default:
+        break;
+      }
+
+    switch( cmd )
+      {
+      case aStore: /* only store the file */
+       if( argc > 1 )
+           wrong_args(_("--store [filename]"));
+       if( (rc = encode_store(fname)) )
+           log_error ("storing `%s' failed: %s\n",
+                       print_fname_stdin(fname),g10_errstr(rc) );
+       break;
+      case aSym: /* encrypt the given file only with the symmetric cipher */
+       if( argc > 1 )
+           wrong_args(_("--symmetric [filename]"));
+       if( (rc = encode_symmetric(fname)) )
+            log_error (_("symmetric encryption of `%s' failed: %s\n"),
+                        print_fname_stdin(fname),g10_errstr(rc) );
+       break;
+
+      case aEncr: /* encrypt the given file */
+       if(multifile)
+         encode_crypt_files(argc, argv, remusr);
+       else
+         {
+           if( argc > 1 )
+             wrong_args(_("--encrypt [filename]"));
+           if( (rc = encode_crypt(fname,remusr,0)) )
+             log_error("%s: encryption failed: %s\n",
+                       print_fname_stdin(fname), g10_errstr(rc) );
+         }
+       break;
+
+      case aEncrSym:
+       /* This works with PGP 8 in the sense that it acts just like a
+          symmetric message.  It doesn't work at all with 2 or 6.  It
+          might work with 7, but alas, I don't have a copy to test
+          with right now. */
+       if( argc > 1 )
+         wrong_args(_("--symmetric --encrypt [filename]"));
+       else if(opt.s2k_mode==0)
+         log_error(_("you cannot use --symmetric --encrypt"
+                     " with --s2k-mode 0\n"));
+       else if(PGP2 || PGP6 || PGP7 || RFC1991)
+         log_error(_("you cannot use --symmetric --encrypt"
+                     " while in %s mode\n"),compliance_option_string());
+       else
+         {
+           if( (rc = encode_crypt(fname,remusr,1)) )
+             log_error("%s: encryption failed: %s\n",
+                       print_fname_stdin(fname), g10_errstr(rc) );
+         }
+       break;
+
+      case aSign: /* sign the given file */
+       sl = NULL;
+       if( detached_sig ) { /* sign all files */
+           for( ; argc; argc--, argv++ )
+               add_to_strlist( &sl, *argv );
+       }
+       else {
+           if( argc > 1 )
+               wrong_args(_("--sign [filename]"));
+           if( argc ) {
+               sl = xmalloc_clear( sizeof *sl + strlen(fname));
+               strcpy(sl->d, fname);
+           }
+       }
+       if( (rc = sign_file( sl, detached_sig, locusr, 0, NULL, NULL)) )
+           log_error("signing failed: %s\n", g10_errstr(rc) );
+       free_strlist(sl);
+       break;
+
+      case aSignEncr: /* sign and encrypt the given file */
+       if( argc > 1 )
+           wrong_args(_("--sign --encrypt [filename]"));
+       if( argc ) {
+           sl = xmalloc_clear( sizeof *sl + strlen(fname));
+           strcpy(sl->d, fname);
+       }
+       else
+           sl = NULL;
+       if( (rc = sign_file(sl, detached_sig, locusr, 1, remusr, NULL)) )
+           log_error("%s: sign+encrypt failed: %s\n",
+                     print_fname_stdin(fname), g10_errstr(rc) );
+       free_strlist(sl);
+       break;
+
+      case aSignEncrSym: /* sign and encrypt the given file */
+       if( argc > 1 )
+           wrong_args(_("--symmetric --sign --encrypt [filename]"));
+       else if(opt.s2k_mode==0)
+         log_error(_("you cannot use --symmetric --sign --encrypt"
+                     " with --s2k-mode 0\n"));
+       else if(PGP2 || PGP6 || PGP7 || RFC1991)
+         log_error(_("you cannot use --symmetric --sign --encrypt"
+                     " while in %s mode\n"),compliance_option_string());
+       else
+         {
+           if( argc )
+             {
+               sl = xmalloc_clear( sizeof *sl + strlen(fname));
+               strcpy(sl->d, fname);
+             }
+           else
+             sl = NULL;
+           if( (rc = sign_file(sl, detached_sig, locusr, 2, remusr, NULL)) )
+             log_error("%s: symmetric+sign+encrypt failed: %s\n",
+                       print_fname_stdin(fname), g10_errstr(rc) );
+           free_strlist(sl);
+         }
+       break;
+
+      case aSignSym: /* sign and conventionally encrypt the given file */
+       if (argc > 1)
+           wrong_args(_("--sign --symmetric [filename]"));
+       rc = sign_symencrypt_file (fname, locusr);
+        if (rc)
+           log_error("%s: sign+symmetric failed: %s\n",
+                      print_fname_stdin(fname), g10_errstr(rc) );
+       break;
+
+      case aClearsign: /* make a clearsig */
+       if( argc > 1 )
+           wrong_args(_("--clearsign [filename]"));
+       if( (rc = clearsign_file(fname, locusr, NULL)) )
+           log_error("%s: clearsign failed: %s\n",
+                      print_fname_stdin(fname), g10_errstr(rc) );
+       break;
+
+      case aVerify:
+       if(multifile)
+         {
+           if( (rc = verify_files( argc, argv ) ))
+             log_error("verify files failed: %s\n", g10_errstr(rc) );
+         }
+       else
+         {
+           if( (rc = verify_signatures( argc, argv ) ))
+             log_error("verify signatures failed: %s\n", g10_errstr(rc) );
+         }
+       break;
+
+      case aDecrypt:
+        if(multifile)
+         decrypt_messages(argc, argv);
+       else
+         {
+           if( argc > 1 )
+             wrong_args(_("--decrypt [filename]"));
+           if( (rc = decrypt_message( fname ) ))
+             log_error("decrypt_message failed: %s\n", g10_errstr(rc) );
+         }
+       break;
+            
+      case aSignKey:
+       if( argc != 1 )
+         wrong_args(_("--sign-key user-id"));
+       /* fall through */
+      case aLSignKey:
+       if( argc != 1 )
+         wrong_args(_("--lsign-key user-id"));
+       /* fall through */
+
+       sl=NULL;
+
+       if(cmd==aSignKey)
+         append_to_strlist(&sl,"sign");
+       else if(cmd==aLSignKey)
+         append_to_strlist(&sl,"lsign");
+       else
+         BUG();
+
+       append_to_strlist( &sl, "save" );
+       username = make_username( fname );
+       keyedit_menu(fname, locusr, sl, 0, 0 );
+       xfree(username);
+       free_strlist(sl);
+       break;
+
+      case aEditKey: /* Edit a key signature */
+       if( !argc )
+           wrong_args(_("--edit-key user-id [commands]"));
+       username = make_username( fname );
+       if( argc > 1 ) {
+           sl = NULL;
+           for( argc--, argv++ ; argc; argc--, argv++ )
+               append_to_strlist( &sl, *argv );
+           keyedit_menu( username, locusr, sl, 0, 1 );
+           free_strlist(sl);
+       }
+       else
+           keyedit_menu(username, locusr, NULL, 0, 1 );
+       xfree(username);
+       break;
+
+      case aDeleteKeys:
+      case aDeleteSecretKeys:
+      case aDeleteSecretAndPublicKeys:
+       sl = NULL;
+       /* I'm adding these in reverse order as add_to_strlist2
+           reverses them again, and it's easier to understand in the
+           proper order :) */
+       for( ; argc; argc-- )
+         add_to_strlist2( &sl, argv[argc-1], utf8_strings );
+       delete_keys(sl,cmd==aDeleteSecretKeys,cmd==aDeleteSecretAndPublicKeys);
+       free_strlist(sl);
+       break;
+
+      case aCheckKeys:
+       opt.check_sigs = 1;
+      case aListSigs:
+       opt.list_sigs = 1;
+      case aListKeys:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           add_to_strlist2( &sl, *argv, utf8_strings );
+       public_key_list( sl );
+       free_strlist(sl);
+       break;
+      case aListSecretKeys:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           add_to_strlist2( &sl, *argv, utf8_strings );
+       secret_key_list( sl );
+       free_strlist(sl);
+       break;
+
+      case aKMode: /* list keyring -- NOTE: This will be removed soon */
+       if( argc < 2 ) { /* -kv [userid] */
+           sl = NULL;
+           if (argc && **argv)
+               add_to_strlist2( &sl, *argv, utf8_strings );
+           public_key_list( sl );
+           free_strlist(sl);
+       }
+       else if( argc == 2 ) { /* -kv userid keyring */
+           if( access( argv[1], R_OK ) ) {
+               log_error(_("can't open `%s': %s\n"),
+                              print_fname_stdin(argv[1]), strerror(errno));
+           }
+           else {
+               /* add keyring (default keyrings are not registered in this
+                * special case */
+               keydb_add_resource( argv[1], 0, 0 );
+               sl = NULL;
+               if (**argv)
+                   add_to_strlist2( &sl, *argv, utf8_strings );
+               public_key_list( sl );
+               free_strlist(sl);
+           }
+       }
+       else
+           wrong_args(_("-k[v][v][v][c] [user-id] [keyring]") );
+       break;
+
+      case aKeygen: /* generate a key */
+       if( opt.batch ) {
+           if( argc > 1 )
+               wrong_args("--gen-key [parameterfile]");
+           generate_keypair( argc? *argv : NULL, NULL, NULL );
+       }
+       else {
+           if( argc )
+               wrong_args("--gen-key");
+           generate_keypair(NULL, NULL, NULL);
+       }
+       break;
+
+      case aFastImport:
+        opt.import_options |= IMPORT_FAST;
+      case aImport:
+       import_keys( argc? argv:NULL, argc, NULL, opt.import_options );
+       break;
+
+       /* TODO: There are a number of command that use this same
+          "make strlist, call function, report error, free strlist"
+          pattern.  Join them together here and avoid all that
+          duplicated code. */
+
+      case aExport:
+      case aSendKeys:
+      case aRecvKeys:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           append_to_strlist2( &sl, *argv, utf8_strings );
+       if( cmd == aSendKeys )
+           rc=keyserver_export( sl );
+       else if( cmd == aRecvKeys )
+           rc=keyserver_import( sl );
+       else
+           rc=export_pubkeys( sl, opt.export_options );
+       if(rc)
+         {
+           if(cmd==aSendKeys)
+             log_error(_("keyserver send failed: %s\n"),g10_errstr(rc));
+           else if(cmd==aRecvKeys)
+             log_error(_("keyserver receive failed: %s\n"),g10_errstr(rc));
+           else
+             log_error(_("key export failed: %s\n"),g10_errstr(rc));
+         }
+       free_strlist(sl);
+       break;
+
+     case aSearchKeys:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+         append_to_strlist2( &sl, *argv, utf8_strings );
+       rc=keyserver_search( sl );
+       if(rc)
+         log_error(_("keyserver search failed: %s\n"),g10_errstr(rc));
+       free_strlist(sl);
+       break;
+
+      case aRefreshKeys:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           append_to_strlist2( &sl, *argv, utf8_strings );
+       rc=keyserver_refresh(sl);
+       if(rc)
+         log_error(_("keyserver refresh failed: %s\n"),g10_errstr(rc));
+       free_strlist(sl);
+       break;
+
+      case aFetchKeys:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           append_to_strlist2( &sl, *argv, utf8_strings );
+       rc=keyserver_fetch(sl);
+       if(rc)
+         log_error("key fetch failed: %s\n",g10_errstr(rc));
+       free_strlist(sl);
+       break;
+
+      case aExportSecret:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           add_to_strlist2( &sl, *argv, utf8_strings );
+       export_seckeys( sl );
+       free_strlist(sl);
+       break;
+
+      case aExportSecretSub:
+       sl = NULL;
+       for( ; argc; argc--, argv++ )
+           add_to_strlist2( &sl, *argv, utf8_strings );
+       export_secsubkeys( sl );
+       free_strlist(sl);
+       break;
+
+      case aGenRevoke:
+       if( argc != 1 )
+           wrong_args("--gen-revoke user-id");
+       username =  make_username(*argv);
+       gen_revoke( username );
+       xfree( username );
+       break;
+
+      case aDesigRevoke:
+       if( argc != 1 )
+           wrong_args("--desig-revoke user-id");
+       username =  make_username(*argv);
+       gen_desig_revoke( username, locusr );
+       xfree( username );
+       break;
+
+      case aDeArmor:
+       if( argc > 1 )
+           wrong_args("--dearmor [file]");
+       rc = dearmor_file( argc? *argv: NULL );
+       if( rc )
+           log_error(_("dearmoring failed: %s\n"), g10_errstr(rc));
+       break;
+
+      case aEnArmor:
+       if( argc > 1 )
+           wrong_args("--enarmor [file]");
+       rc = enarmor_file( argc? *argv: NULL );
+       if( rc )
+           log_error(_("enarmoring failed: %s\n"), g10_errstr(rc));
+       break;
+
+
+      case aPrimegen:
+       {   int mode = argc < 2 ? 0 : atoi(*argv);
+
+           if( mode == 1 && argc == 2 ) {
+               mpi_print( stdout, generate_public_prime( atoi(argv[1]) ), 1);
+           }
+           else if( mode == 2 && argc == 3 ) {
+               mpi_print( stdout, generate_elg_prime(
+                                            0, atoi(argv[1]),
+                                            atoi(argv[2]), NULL,NULL ), 1);
+           }
+           else if( mode == 3 && argc == 3 ) {
+               MPI *factors;
+               mpi_print( stdout, generate_elg_prime(
+                                            1, atoi(argv[1]),
+                                            atoi(argv[2]), NULL,&factors ), 1);
+               putchar('\n');
+               mpi_print( stdout, factors[0], 1 ); /* print q */
+           }
+           else if( mode == 4 && argc == 3 ) {
+               MPI g = mpi_alloc(1);
+               mpi_print( stdout, generate_elg_prime(
+                                                0, atoi(argv[1]),
+                                                atoi(argv[2]), g, NULL ), 1);
+               putchar('\n');
+               mpi_print( stdout, g, 1 );
+               mpi_free(g);
+           }
+           else
+               wrong_args("--gen-prime mode bits [qbits] ");
+           putchar('\n');
+       }
+       break;
+
+      case aGenRandom:
+       {
+           int level = argc ? atoi(*argv):0;
+           int count = argc > 1 ? atoi(argv[1]): 0;
+           int endless = !count;
+
+           if( argc < 1 || argc > 2 || level < 0 || level > 2 || count < 0 )
+               wrong_args("--gen-random 0|1|2 [count]");
+
+           while( endless || count ) {
+               byte *p;
+                /* Wee need a multiple of 3, so that in case of
+                   armored output we get a correct string.  No
+                   linefolding is done, as it is best to levae this to
+                   other tools */
+               size_t n = !endless && count < 99? count : 99;
+
+               p = get_random_bits( n*8, level, 0);
+#ifdef HAVE_DOSISH_SYSTEM
+               setmode ( fileno(stdout), O_BINARY );
+#endif
+                if (opt.armor) {
+                    char *tmp = make_radix64_string (p, n);
+                    fputs (tmp, stdout);
+                    xfree (tmp);
+                    if (n%3 == 1)
+                      putchar ('=');
+                    if (n%3)
+                      putchar ('=');
+                } else {
+                    fwrite( p, n, 1, stdout );
+                }
+               xfree(p);
+               if( !endless )
+                   count -= n;
+           }
+            if (opt.armor)
+                putchar ('\n');
+       }
+       break;
+
+      case aPrintMD:
+       if( argc < 1)
+           wrong_args("--print-md algo [files]");
+       {
+           int all_algos = (**argv=='*' && !(*argv)[1]);
+           int algo = all_algos? 0 : string_to_digest_algo(*argv);
+
+           if( !algo && !all_algos )
+               log_error(_("invalid hash algorithm `%s'\n"), *argv );
+           else {
+               argc--; argv++;
+               if( !argc )
+                   print_mds(NULL, algo);
+               else {
+                   for(; argc; argc--, argv++ )
+                       print_mds(*argv, algo);
+               }
+           }
+       }
+       break;
+
+      case aPrintMDs: /* old option */
+       if( !argc )
+           print_mds(NULL,0);
+       else {
+           for(; argc; argc--, argv++ )
+               print_mds(*argv,0);
+       }
+       break;
+
+      case aListTrustDB:
+       if( !argc )
+           list_trustdb(NULL);
+       else {
+           for( ; argc; argc--, argv++ )
+               list_trustdb( *argv );
+       }
+       break;
+
+      case aUpdateTrustDB:
+       if( argc )
+           wrong_args("--update-trustdb");
+       update_trustdb();
+       break;
+
+      case aCheckTrustDB:
+        /* Old versions allowed for arguments - ignore them */
+        check_trustdb();
+       break;
+
+      case aFixTrustDB:
+       log_error("this command is not yet implemented.\n");
+       log_error("A workaround is to use \"--export-ownertrust\", remove\n");
+       log_error("the trustdb file and do an \"--import-ownertrust\".\n" );
+       break;
+
+      case aListTrustPath:
+       if( !argc )
+           wrong_args("--list-trust-path <user-ids>");
+       for( ; argc; argc--, argv++ ) {
+           username = make_username( *argv );
+           list_trust_path( username );
+           xfree(username);
+       }
+       break;
+
+      case aExportOwnerTrust:
+       if( argc )
+           wrong_args("--export-ownertrust");
+       export_ownertrust();
+       break;
+
+      case aImportOwnerTrust:
+       if( argc > 1 )
+           wrong_args("--import-ownertrust [file]");
+       import_ownertrust( argc? *argv:NULL );
+       break;
+      
+      case aPipeMode:
+        if ( argc )
+            wrong_args ("--pipemode");
+        run_in_pipemode ();
+        break;
+
+      case aRebuildKeydbCaches:
+        if (argc)
+            wrong_args ("--rebuild-keydb-caches");
+        keydb_rebuild_caches (1);
+        break;
+
+#ifdef ENABLE_CARD_SUPPORT
+      case aCardStatus:
+        if (argc)
+            wrong_args ("--card-status");
+        card_status (stdout, NULL, 0);
+        break;
+
+      case aCardEdit:
+        if (argc) {
+            sl = NULL;
+            for (argc--, argv++ ; argc; argc--, argv++)
+                append_to_strlist (&sl, *argv);
+            card_edit (sl);
+            free_strlist (sl);
+       }
+        else
+            card_edit (NULL);
+        break;
+
+      case aChangePIN:
+        if (!argc)
+            change_pin (0,1);
+        else if (argc == 1)
+            change_pin (atoi (*argv),1);
+        else
+        wrong_args ("--change-pin [no]");
+        break;
+#endif /* ENABLE_CARD_SUPPORT*/
+
+      case aListConfig:
+       {
+         char *str=collapse_args(argc,argv);
+         list_config(str);
+         xfree(str);
+       }
+       break;
+
+      case aListPackets:
+       opt.list_packets=2;
+      default:
+       if( argc > 1 )
+           wrong_args(_("[filename]"));
+       /* Issue some output for the unix newbie */
+       if( !fname && !opt.outfile && isatty( fileno(stdin) )
+               && isatty( fileno(stdout) ) && isatty( fileno(stderr) ) )
+           log_info(_("Go ahead and type your message ...\n"));
+
+       a = iobuf_open(fname);
+        if (a && is_secured_file (iobuf_get_fd (a)))
+          {
+            iobuf_close (a);
+            a = NULL;
+            errno = EPERM;
+          }
+       if( !a )
+           log_error(_("can't open `%s'\n"), print_fname_stdin(fname));
+       else {
+
+           if( !opt.no_armor ) {
+               if( use_armor_filter( a ) ) {
+                   memset( &afx, 0, sizeof afx);
+                   iobuf_push_filter( a, armor_filter, &afx );
+               }
+           }
+           if( cmd == aListPackets ) {
+               set_packet_list_mode(1);
+               opt.list_packets=1;
+           }
+           rc = proc_packets(NULL, a );
+           if( rc )
+               log_error("processing message failed: %s\n", g10_errstr(rc) );
+           iobuf_close(a);
+       }
+       break;
+      }
+
+    /* cleanup */
+    FREE_STRLIST(remusr);
+    FREE_STRLIST(locusr);
+    g10_exit(0);
+    return 8; /*NEVER REACHED*/
+}
+
+
+void
+g10_exit( int rc )
+{
+#ifdef ENABLE_CARD_SUPPORT
+    card_close ();
+#endif
+    update_random_seed_file();
+    if( opt.debug & DBG_MEMSTAT_VALUE ) {
+       m_print_stats("on exit");
+       random_dump_stats();
+    }
+    if( opt.debug )
+       secmem_dump_stats();
+    secmem_term();
+    rc = rc? rc : log_get_errorcount(0)? 2 :
+                       g10_errors_seen? 1 : 0;
+    exit(rc );
+}
+
+
+/* Pretty-print hex hashes.  This assumes at least an 80-character
+   display, but there are a few other similar assumptions in the
+   display code. */
+static void
+print_hex( MD_HANDLE md, int algo, const char *fname )
+{
+  int i,n,count,indent=0;
+  const byte *p;
+
+  if(fname)
+    indent=printf("%s: ",fname);
+
+  if(indent>40)
+    {
+      printf("\n");
+      indent=0;
+    }
+
+  if(algo==DIGEST_ALGO_RMD160)
+    indent+=printf("RMD160 = ");
+  else if(algo>0)
+    indent+=printf("%6s = ",digest_algo_to_string(algo));
+  else
+    algo=abs(algo);
+
+  count=indent;
+
+  p = md_read( md, algo );
+  n = md_digest_length(algo);
+
+  count+=printf("%02X",*p++);
+
+  for(i=1;i<n;i++,p++)
+    {
+      if(n==16)
+       {
+         if(count+2>79)
+           {
+             printf("\n%*s",indent," ");
+             count=indent;
+           }
+         else
+           count+=printf(" ");
+
+         if(!(i%8))
+           count+=printf(" ");
+       }
+      else if (n==20)
+       {
+         if(!(i%2))
+           {
+             if(count+4>79)
+               {
+                 printf("\n%*s",indent," ");
+                 count=indent;
+               }
+             else
+               count+=printf(" ");
+           }
+
+         if(!(i%10))
+           count+=printf(" ");
+       }
+      else
+       {
+         if(!(i%4))
+           {
+             if(count+8>79)
+               {
+                 printf("\n%*s",indent," ");
+                 count=indent;
+               }
+             else
+               count+=printf(" ");
+           }
+       }
+
+      count+=printf("%02X",*p);
+    }
+
+  printf("\n");
+}
+
+static void
+print_hashline( MD_HANDLE md, int algo, const char *fname )
+{
+    int i, n;
+    const byte *p;
+    
+    if ( fname ) {
+        for (p = fname; *p; p++ ) {
+            if ( *p <= 32 || *p > 127 || *p == ':' || *p == '%' )
+                printf("%%%02X", *p );
+            else 
+                putchar( *p );
+        }
+    }
+    putchar(':');
+    printf("%d:", algo );
+    p = md_read( md, algo );
+    n = md_digest_length(algo);
+    for(i=0; i < n ; i++, p++ ) 
+        printf("%02X", *p );
+    putchar(':');
+    putchar('\n');
+}
+
+static void
+print_mds( const char *fname, int algo )
+{
+    FILE *fp;
+    char buf[1024];
+    size_t n;
+    MD_HANDLE md;
+
+    if( !fname ) {
+       fp = stdin;
+#ifdef HAVE_DOSISH_SYSTEM
+       setmode ( fileno(fp) , O_BINARY );
+#endif
+    }
+    else {
+       fp = fopen( fname, "rb" );
+        if (fp && is_secured_file (fileno (fp)))
+          {
+            fclose (fp);
+            fp = NULL;
+            errno = EPERM;
+          }
+    }
+    if( !fp ) {
+       log_error("%s: %s\n", fname?fname:"[stdin]", strerror(errno) );
+       return;
+    }
+
+    md = md_open( 0, 0 );
+    if( algo )
+       md_enable( md, algo );
+    else {
+       md_enable( md, DIGEST_ALGO_MD5 );
+       md_enable( md, DIGEST_ALGO_SHA1 );
+       md_enable( md, DIGEST_ALGO_RMD160 );
+#ifdef USE_SHA256
+       md_enable( md, DIGEST_ALGO_SHA224 );
+       md_enable( md, DIGEST_ALGO_SHA256 );
+#endif
+#ifdef USE_SHA512
+       md_enable( md, DIGEST_ALGO_SHA384 );
+       md_enable( md, DIGEST_ALGO_SHA512 );
+#endif
+    }
+
+    while( (n=fread( buf, 1, DIM(buf), fp )) )
+       md_write( md, buf, n );
+    if( ferror(fp) )
+       log_error("%s: %s\n", fname?fname:"[stdin]", strerror(errno) );
+    else {
+       md_final(md);
+        if ( opt.with_colons ) {
+            if ( algo ) 
+                print_hashline( md, algo, fname );
+            else {
+                print_hashline( md, DIGEST_ALGO_MD5, fname );
+                print_hashline( md, DIGEST_ALGO_SHA1, fname );
+                print_hashline( md, DIGEST_ALGO_RMD160, fname );
+#ifdef USE_SHA256
+                print_hashline( md, DIGEST_ALGO_SHA224, fname );
+                print_hashline( md, DIGEST_ALGO_SHA256, fname );
+#endif
+#ifdef USE_SHA512
+               print_hashline( md, DIGEST_ALGO_SHA384, fname );
+               print_hashline( md, DIGEST_ALGO_SHA512, fname );
+#endif
+            }
+        }
+        else {
+            if( algo )
+              print_hex(md,-algo,fname);
+            else {
+                print_hex( md, DIGEST_ALGO_MD5, fname );
+                print_hex( md, DIGEST_ALGO_SHA1, fname );
+                print_hex( md, DIGEST_ALGO_RMD160, fname );
+#ifdef USE_SHA256
+                print_hex( md, DIGEST_ALGO_SHA224, fname );
+                print_hex( md, DIGEST_ALGO_SHA256, fname );
+#endif
+#ifdef USE_SHA512
+               print_hex( md, DIGEST_ALGO_SHA384, fname );
+               print_hex( md, DIGEST_ALGO_SHA512, fname );
+#endif
+            }
+        }
+    }
+    md_close(md);
+
+    if( fp != stdin )
+       fclose(fp);
+}
+
+
+/****************
+ * Check the supplied name,value string and add it to the notation
+ * data to be used for signatures.  which==0 for sig notations, and 1
+ * for cert notations.
+*/
+static void
+add_notation_data( const char *string, int which )
+{
+  struct notation *notation;
+
+  notation=string_to_notation(string,utf8_strings);
+  if(notation)
+    {
+      if(which)
+       {
+         notation->next=opt.cert_notations;
+         opt.cert_notations=notation;
+       }
+      else
+       {
+         notation->next=opt.sig_notations;
+         opt.sig_notations=notation;
+       }
+    }
+}
+
+static void
+add_policy_url( const char *string, int which )
+{
+  unsigned int i,critical=0;
+  STRLIST sl;
+
+  if(*string=='!')
+    {
+      string++;
+      critical=1;
+    }
+
+  for(i=0;i<strlen(string);i++)
+    if( !isascii (string[i]) || iscntrl(string[i]))
+      break;
+
+  if(i==0 || i<strlen(string))
+    {
+      if(which)
+       log_error(_("the given certification policy URL is invalid\n"));
+      else
+       log_error(_("the given signature policy URL is invalid\n"));
+    }
+
+  if(which)
+    sl=add_to_strlist( &opt.cert_policy_url, string );
+  else
+    sl=add_to_strlist( &opt.sig_policy_url, string );
+
+  if(critical)
+    sl->flags |= 1;    
+}
+
+static void
+add_keyserver_url( const char *string, int which )
+{
+  unsigned int i,critical=0;
+  STRLIST sl;
+
+  if(*string=='!')
+    {
+      string++;
+      critical=1;
+    }
+
+  for(i=0;i<strlen(string);i++)
+    if( !isascii (string[i]) || iscntrl(string[i]))
+      break;
+
+  if(i==0 || i<strlen(string))
+    {
+      if(which)
+       BUG();
+      else
+       log_error(_("the given preferred keyserver URL is invalid\n"));
+    }
+
+  if(which)
+    BUG();
+  else
+    sl=add_to_strlist( &opt.sig_keyserver_url, string );
+
+  if(critical)
+    sl->flags |= 1;    
+}
diff --git a/g10/gpgv.c b/g10/gpgv.c
new file mode 100644 (file)
index 0000000..5192c26
--- /dev/null
@@ -0,0 +1,434 @@
+/* gpgv.c - The GnuPG signature verify utility
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#ifdef HAVE_DOSISH_SYSTEM
+#include <fcntl.h> /* for setmode() */
+#endif
+#ifdef HAVE_LIBREADLINE
+#include <stdio.h>
+#include <readline/readline.h>
+#endif
+
+#define INCLUDED_BY_MAIN_MODULE 1
+#include "packet.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "options.h"
+#include "keydb.h"
+#include "trustdb.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "filter.h"
+#include "ttyio.h"
+#include "i18n.h"
+#include "status.h"
+#include "g10defs.h"
+#include "cardglue.h"
+
+
+enum cmd_and_opt_values { aNull = 0,
+    oQuiet       = 'q',
+    oVerbose     = 'v',
+    oBatch       = 500,
+    oKeyring,
+    oIgnoreTimeConflict,                      
+    oStatusFD,
+    oLoggerFD,
+    oHomedir,
+aTest };
+
+
+static ARGPARSE_OPTS opts[] = {
+
+    { 301, NULL, 0, N_("@\nOptions:\n ") },
+
+    { oVerbose, "verbose",   0, N_("verbose") },
+    { oQuiet,  "quiet",     0, N_("be somewhat more quiet") },
+    { oKeyring, "keyring"   ,2, N_("take the keys from this keyring")},
+    { oIgnoreTimeConflict, "ignore-time-conflict", 0, 
+                           N_("make timestamp conflicts only a warning") },
+    { oStatusFD, "status-fd" ,1, N_("|FD|write status info to this FD") },
+    { oLoggerFD, "logger-fd",1, "@" },
+    { oHomedir, "homedir", 2, "@" },   /* defaults to "~/.gnupg" */
+
+{0} };
+
+
+
+int g10_errors_seen = 0;
+
+const char *
+strusage( int level )
+{
+    const char *p;
+    switch( level ) {
+      case 11: p = "gpgv (GnuPG)";
+       break;
+      case 13: p = VERSION; break;
+      case 17: p = PRINTABLE_OS_NAME; break;
+      case 19: p =
+           _("Please report bugs to <gnupg-bugs@gnu.org>.\n");
+       break;
+      case 1:
+      case 40: p =
+           _("Usage: gpgv [options] [files] (-h for help)");
+       break;
+      case 41: p =
+           _("Syntax: gpg [options] [files]\n"
+             "Check signatures against known trusted keys\n");
+       break;
+
+      default: p = default_strusage(level);
+    }
+    return p;
+}
+
+
+
+
+static void
+i18n_init(void)
+{
+#ifdef USE_SIMPLE_GETTEXT
+    set_gettext_file (PACKAGE, "Software\\GNU\\GnuPG");
+#else
+#ifdef ENABLE_NLS
+    setlocale( LC_ALL, "" );
+    bindtextdomain( PACKAGE, G10_LOCALEDIR );
+    textdomain( PACKAGE );
+#endif
+#endif
+}
+
+
+int
+main( int argc, char **argv )
+{
+    ARGPARSE_ARGS pargs;
+    int rc=0;
+    STRLIST sl;
+    STRLIST nrings=NULL;
+    unsigned configlineno;
+
+    log_set_name("gpgv");
+    init_signals();
+    i18n_init();
+    opt.command_fd = -1; /* no command fd */
+    opt.pgp2_workarounds = 1;
+    opt.keyserver_options.options|=KEYSERVER_AUTO_KEY_RETRIEVE;
+    opt.trust_model = TM_ALWAYS;
+    opt.batch = 1;
+
+    opt.homedir = default_homedir ();
+
+    tty_no_terminal(1);
+    tty_batchmode(1);
+    disable_dotlock();
+
+    set_native_charset (NULL); /* Try to auto set the character set */
+    
+    pargs.argc = &argc;
+    pargs.argv = &argv;
+    pargs.flags=  1;  /* do not remove the args */
+    while( optfile_parse( NULL, NULL, &configlineno, &pargs, opts) ) {
+       switch( pargs.r_opt ) {
+         case oQuiet: opt.quiet = 1; break;
+          case oVerbose: g10_opt_verbose++;
+                 opt.verbose++; opt.list_sigs=1; break;
+          case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break;
+         case oStatusFD: set_status_fd( pargs.r.ret_int ); break;
+         case oLoggerFD: log_set_logfile( NULL, pargs.r.ret_int ); break;
+         case oHomedir: opt.homedir = pargs.r.ret_str; break;
+         case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break;
+         default : pargs.err = 2; break;
+       }
+    }
+
+    if( log_get_errorcount(0) )
+       g10_exit(2);
+
+    g10_opt_homedir = opt.homedir;
+
+    if( opt.verbose > 1 )
+       set_packet_list_mode(1);
+
+    if( !nrings )  /* no keyring given: use default one */
+        keydb_add_resource ("trustedkeys" EXTSEP_S "gpg", 0, 0);
+    for(sl = nrings; sl; sl = sl->next )
+        keydb_add_resource (sl->d, 0, 0 );
+    
+    FREE_STRLIST(nrings);
+    
+    if( (rc = verify_signatures( argc, argv ) ))
+        log_error("verify signatures failed: %s\n", g10_errstr(rc) );
+
+    /* cleanup */
+    g10_exit(0);
+    return 8; /*NEVER REACHED*/
+}
+
+
+void
+g10_exit( int rc )
+{
+    rc = rc? rc : log_get_errorcount(0)? 2 :
+                       g10_errors_seen? 1 : 0;
+    exit(rc );
+}
+
+
+/* Stub:
+ * We have to override the trustcheck from pkclist.c becuase 
+ * this utility assumes that all keys in the keyring are trustworthy
+ */
+int
+check_signatures_trust( PKT_signature *sig )
+{
+    return 0;
+}
+
+void
+read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck,
+                  byte *marginals,byte *completes,byte *cert_depth) {}
+
+/* Stub: 
+ * We don't have the trustdb , so we have to provide some stub functions
+ * instead
+ */
+
+int
+cache_disabled_value(PKT_public_key *pk)
+{
+  return 0;
+}
+
+void
+check_trustdb_stale(void) {}
+
+int
+get_validity_info (PKT_public_key *pk, PKT_user_id *uid)
+{
+    return '?';
+}
+
+unsigned int
+get_validity (PKT_public_key *pk, PKT_user_id *uid)
+{
+  return 0;
+}
+
+const char *
+trust_value_to_string (unsigned int value)
+{
+  return "err";
+}
+
+const char *
+uid_trust_string_fixed(PKT_public_key *key,PKT_user_id *uid)
+{
+  return "err";
+}
+
+int
+get_ownertrust_info (PKT_public_key *pk)
+{
+    return '?';
+}
+
+unsigned int
+get_ownertrust (PKT_public_key *pk)
+{
+    return TRUST_UNKNOWN;
+}
+
+
+/* Stubs:
+ * Because we only work with trusted keys, it does not make sense to
+ * get them from a keyserver
+ */
+
+struct keyserver_spec *
+keyserver_match(struct keyserver_spec *spec) { return NULL; }
+
+int
+keyserver_import_keyid( u32 *keyid, void *dummy )
+{
+    return -1;
+}
+
+int
+keyserver_import_cert(const char *name) { return -1; }
+
+int
+keyserver_import_pka(const char *name,unsigned char *fpr) { return -1; }
+
+int
+keyserver_import_name(const char *name,struct keyserver_spec *spec)
+{
+  return -1;
+}
+
+int
+keyserver_import_ldap(const char *name) { return -1; }
+
+/* Stub:
+ * No encryption here but mainproc links to these functions.
+ */
+int
+get_session_key( PKT_pubkey_enc *k, DEK *dek )
+{
+    return G10ERR_GENERAL;
+}
+/* Stub: */
+int
+get_override_session_key( DEK *dek, const char *string )
+{
+    return G10ERR_GENERAL;
+}
+/* Stub: */
+int
+decrypt_data( void *procctx, PKT_encrypted *ed, DEK *dek )
+{
+    return G10ERR_GENERAL;
+}
+
+
+/* Stub:
+ * No interactive commnds, so we don't need the helptexts
+ */
+void
+display_online_help( const char *keyword )
+{
+}
+
+/* Stub:
+ * We don't use secret keys, but getkey.c links to this
+ */
+int
+check_secret_key( PKT_secret_key *sk, int n )
+{
+    return G10ERR_GENERAL;
+}
+
+/* Stub:
+ * No secret key, so no passphrase needed 
+ */
+DEK *
+passphrase_to_dek( u32 *keyid, int pubkey_algo,
+                  int cipher_algo, STRING2KEY *s2k, int mode,
+                   const char *tmp, int *canceled)
+{
+  if (canceled)
+    *canceled = 0;
+  return NULL;
+}
+
+struct keyserver_spec *parse_preferred_keyserver(PKT_signature *sig) {return NULL;}
+struct keyserver_spec *parse_keyserver_uri(const char *uri,int require_scheme,
+                                           const char *configname,
+                                           unsigned int configlineno)
+{
+  return NULL;
+}
+
+void free_keyserver_spec(struct keyserver_spec *keyserver) {}
+
+/* Stubs to avoid linking to photoid.c */
+void show_photos(const struct user_attribute *attrs,int count,PKT_public_key *pk) {}
+int parse_image_header(const struct user_attribute *attr,byte *type,u32 *len) {return 0;}
+char *image_type_to_string(byte type,int string) {return NULL;}
+
+#ifdef ENABLE_CARD_SUPPORT
+int agent_scd_getattr (const char *name, struct agent_card_info_s *info) {return 0;}
+#endif /* ENABLE_CARD_SUPPORT */
+
+/* Stubs to void linking to ../cipher/cipher.c */
+int string_to_cipher_algo( const char *string ) { return 0; }
+const char *cipher_algo_to_string( int algo ) { return "?";}
+void disable_cipher_algo( int algo ) {}
+int check_cipher_algo( int algo ) { return -1;}
+unsigned int cipher_get_keylen( int algo ) { return 0; }
+unsigned int cipher_get_blocksize( int algo ) {return 0;}
+CIPHER_HANDLE cipher_open( int algo, int mode, int secure ) { return NULL;}
+void cipher_close( CIPHER_HANDLE c ) {}
+int cipher_setkey( CIPHER_HANDLE c, byte *key, unsigned keylen ) { return -1;}
+void cipher_setiv( CIPHER_HANDLE c, const byte *iv, unsigned ivlen ){}
+void cipher_encrypt( CIPHER_HANDLE c, byte *outbuf,
+                     byte *inbuf, unsigned nbytes ) {}
+void cipher_decrypt( CIPHER_HANDLE c, byte *outbuf,
+                     byte *inbuf, unsigned nbytes ) {}
+void cipher_sync( CIPHER_HANDLE c ) {}
+
+/* Stubs to avoid linking to ../cipher/random.c */
+void random_dump_stats(void) {}
+int quick_random_gen( int onoff ) { return -1;}
+void randomize_buffer( byte *buffer, size_t length, int level ) {}
+int random_is_faked() { return -1;}
+byte *get_random_bits( size_t nbits, int level, int secure ) { return NULL;}
+void set_random_seed_file( const char *name ) {}
+void update_random_seed_file() {}
+void fast_random_poll() {}
+
+/* Stubs to avoid linking of ../cipher/primegen.c */
+void register_primegen_progress ( void (*cb)( void *, int), void *cb_data ) {}
+MPI generate_secret_prime( unsigned  nbits ) { return NULL;}
+MPI generate_public_prime( unsigned  nbits ) { return NULL;}
+MPI generate_elg_prime( int mode, unsigned pbits, unsigned qbits,
+                        MPI g, MPI **ret_factors ) { return NULL;}
+
+/* Do not link to ../cipher/rndlinux.c */
+void rndlinux_constructor(void) {}
+
+
+/* Stubs to avoid linking to ../util/ttyio.c */
+int tty_batchmode( int onoff ) { return 0; }
+void tty_printf( const char *fmt, ... ) { }
+void tty_fprintf (FILE *fp, const char *fmt, ... ) { }
+void tty_print_string( const byte *p, size_t n ) { }
+void tty_print_utf8_string( const byte *p, size_t n ) {}
+void tty_print_utf8_string2( const byte *p, size_t n, size_t max_n ) {}
+char *tty_get( const char *prompt ) { return NULL;}
+char *tty_get_hidden( const char *prompt ) {return NULL; }
+void tty_kill_prompt(void) {}
+int tty_get_answer_is_yes( const char *prompt ) {return 0;}
+int tty_no_terminal(int onoff) {return 0;}
+#ifdef HAVE_LIBREADLINE
+void tty_enable_completion(rl_completion_func_t *completer) {}
+void tty_disable_completion(void) {}
+#endif
+
+/* We do not do any locking, so use these stubs here */
+void disable_dotlock(void) {}
+DOTLOCK create_dotlock( const char *file_to_lock ) { return NULL; }
+void destroy_dotlock (DOTLOCK h) {}
+int make_dotlock( DOTLOCK h, long timeout ) { return 0;}
+int release_dotlock( DOTLOCK h ) {return 0;}
+void remove_lockfiles(void) {}
diff --git a/g10/helptext.c b/g10/helptext.c
new file mode 100644 (file)
index 0000000..e1f7851
--- /dev/null
@@ -0,0 +1,300 @@
+/* helptext.c  - English help texts
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "util.h"
+#include "ttyio.h"
+#include "main.h"
+#include "i18n.h"
+
+
+/****************
+ * These helptexts are used for the "online" help feature. We use
+ * a key consisting of words and dots. Because the lookup is only
+ * done in an interactive mode on a user request (when she enters a "?"
+ * as response to a prompt) we can use a simple search through the list.
+ *
+ * Mini glossary:
+ *
+ * "user ID", "trustdb", "NOTE" and "WARNING".
+ */
+
+static struct helptexts { const char *key; const char *help; } helptexts[] = {
+
+/* begin of list */
+
+{ "edit_ownertrust.value", N_(
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+)},
+
+{ "edit_ownertrust.set_ultimate.okay", N_(
+ "To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+ "ultimately trusted - those are usually the keys for which you have\n"
+ "access to the secret key.  Answer \"yes\" to set this key to\n"
+ "ultimately trusted\n"
+)},
+
+{ "untrusted_key.override", N_(
+"If you want to use this untrusted key anyway, answer \"yes\"."
+)},
+
+{ "pklist.user_id.enter", N_(
+"Enter the user ID of the addressee to whom you want to send the message."
+)},
+
+{ "keygen.algo", N_(
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+)},
+
+
+{ "keygen.algo.rsa_se", N_(
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+)},
+
+
+{ "keygen.size", N_(
+ "Enter the size of the key"
+)},
+
+{ "keygen.size.huge.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+
+{ "keygen.size.large.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+
+{ "keygen.valid", N_(
+ "Enter the required value as shown in the prompt.\n"
+ "It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+ "get a good error response - instead the system tries to interpret\n"
+ "the given value as an interval."
+)},
+
+{ "keygen.valid.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+
+{ "keygen.name", N_(
+ "Enter the name of the key holder"
+)},
+
+
+{ "keygen.email", N_(
+ "please enter an optional but highly suggested email address"
+)},
+
+{ "keygen.comment", N_(
+ "Please enter an optional comment"
+)},
+
+
+{ "keygen.userid.cmd", N_(
+ ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+)},
+
+{ "keygen.sub.okay", N_(
+ "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+)},
+
+{ "sign_uid.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+{ "sign_uid.class", N_(
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n\n"
+"\"0\" means you make no particular claim as to how carefully you verified the\n"
+"    key.\n\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous user.\n\n"
+"\"2\" means you did casual verification of the key.  For example, this could\n"
+"    mean that you verified the key fingerprint and checked the user ID on the\n"
+"    key against a photo ID.\n\n"
+"\"3\" means you did extensive verification of the key.  For example, this could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with a\n"
+"    photo ID (such as a passport) that the name of the key owner matches the\n"
+"    name in the user ID on the key, and finally that you verified (by exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive\"\n"
+"mean to you when you sign other keys.\n\n"
+"If you don't know what the right answer is, answer \"0\"."
+)},
+
+{ "change_passwd.empty.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+
+{ "keyedit.save.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+
+{ "keyedit.cancel.okay", N_(
+ "Answer \"yes\" or \"no\""
+)},
+
+{ "keyedit.sign_all.okay", N_(
+ "Answer \"yes\" if you want to sign ALL the user IDs"
+)},
+
+{ "keyedit.remove.uid.okay", N_(
+ "Answer \"yes\" if you really want to delete this user ID.\n"
+ "All certificates are then also lost!"
+)},
+
+{ "keyedit.remove.subkey.okay", N_(
+ "Answer \"yes\" if it is okay to delete the subkey"
+)},
+
+
+{ "keyedit.delsig.valid", N_(
+ "This is a valid signature on the key; you normally don't want\n"
+ "to delete this signature because it may be important to establish a\n"
+ "trust connection to the key or another key certified by this key."
+)},
+{ "keyedit.delsig.unknown", N_(
+ "This signature can't be checked because you don't have the\n"
+ "corresponding key.  You should postpone its deletion until you\n"
+ "know which key was used because this signing key might establish\n"
+ "a trust connection through another already certified key."
+)},
+{ "keyedit.delsig.invalid", N_(
+ "The signature is not valid.  It does make sense to remove it from\n"
+ "your keyring."
+)},
+{ "keyedit.delsig.selfsig", N_(
+ "This is a signature which binds the user ID to the key. It is\n"
+ "usually not a good idea to remove such a signature.  Actually\n"
+ "GnuPG might not be able to use this key anymore.  So do this\n"
+ "only if this self-signature is for some reason not valid and\n"
+ "a second one is available."
+)},
+
+{ "keyedit.updpref.okay", N_(
+ "Change the preferences of all user IDs (or just of the selected ones)\n"
+ "to the current list of preferences.  The timestamp of all affected\n"
+ "self-signatures will be advanced by one second.\n"
+)},
+
+
+{ "passphrase.enter", N_(
+ ""
+"Please enter the passhrase; this is a secret sentence \n"
+)},
+
+
+{ "passphrase.repeat", N_(
+ "Please repeat the last passphrase, so you are sure what you typed in."
+)},
+
+{ "detached_signature.filename", N_(
+ "Give the name of the file to which the signature applies"
+)},
+
+/* openfile.c (overwrite_filep) */
+{ "openfile.overwrite.okay", N_(
+ "Answer \"yes\" if it is okay to overwrite the file"
+)},
+
+/* openfile.c (ask_outfile_name) */
+{ "openfile.askoutname", N_(
+ "Please enter a new filename. If you just hit RETURN the default\n"
+ "file (which is shown in brackets) will be used."
+)},
+
+/* revoke.c (ask_revocation_reason) */
+{ "ask_revocation_reason.code", N_(
+ "You should specify a reason for the certification.  Depending on the\n"
+ "context you have the ability to choose from this list:\n"
+ "  \"Key has been compromised\"\n"
+ "      Use this if you have a reason to believe that unauthorized persons\n"
+ "      got access to your secret key.\n"
+ "  \"Key is superseded\"\n"
+ "      Use this if you have replaced this key with a newer one.\n"
+ "  \"Key is no longer used\"\n"
+ "      Use this if you have retired this key.\n"
+ "  \"User ID is no longer valid\"\n"
+ "      Use this to state that the user ID should not longer be used;\n"
+ "      this is normally used to mark an email address invalid.\n"
+)},
+
+/* revoke.c (ask_revocation_reason) */
+{ "ask_revocation_reason.text", N_(
+ "If you like, you can enter a text describing why you issue this\n"
+ "revocation certificate.  Please keep this text concise.\n"
+ "An empty line ends the text.\n"
+)},
+
+/* end of list */
+{ NULL, NULL } };
+
+
+void
+display_online_help( const char *keyword )
+{
+
+    tty_kill_prompt();
+    if( !keyword )
+       tty_printf(_("No help available") );
+    else {
+       const char *p;
+       int i;
+
+       for(i=0; (p=helptexts[i].key) && strcmp( p, keyword ); i++ )
+           ;
+       if( !p || !*helptexts[i].help )
+           tty_printf(_("No help available for `%s'"), keyword );
+       else
+           tty_printf("%s", _(helptexts[i].help) );
+    }
+    tty_printf("\n");
+}
diff --git a/g10/import.c b/g10/import.c
new file mode 100644 (file)
index 0000000..7260301
--- /dev/null
@@ -0,0 +1,2396 @@
+/* import.c - import a key into our key storage.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "trustdb.h"
+#include "main.h"
+#include "i18n.h"
+#include "ttyio.h"
+#include "status.h"
+#include "keyserver-internal.h"
+
+struct stats_s {
+    ulong count;
+    ulong no_user_id;
+    ulong imported;
+    ulong imported_rsa;
+    ulong n_uids;
+    ulong n_sigs;
+    ulong n_subk;
+    ulong unchanged;
+    ulong n_revoc;
+    ulong secret_read;
+    ulong secret_imported;
+    ulong secret_dups;
+    ulong skipped_new_keys;
+    ulong not_imported;
+    ulong n_sigs_cleaned;
+    ulong n_uids_cleaned;
+};
+
+
+static int import( IOBUF inp, const char* fname,struct stats_s *stats,
+                  unsigned char **fpr,size_t *fpr_len,unsigned int options );
+static int read_block( IOBUF a, PACKET **pending_pkt, KBNODE *ret_root );
+static void revocation_present(KBNODE keyblock);
+static int import_one(const char *fname, KBNODE keyblock,struct stats_s *stats,
+                     unsigned char **fpr,size_t *fpr_len,
+                     unsigned int options,int from_sk);
+static int import_secret_one( const char *fname, KBNODE keyblock,
+                              struct stats_s *stats, unsigned int options);
+static int import_revoke_cert( const char *fname, KBNODE node,
+                               struct stats_s *stats);
+static int chk_self_sigs( const char *fname, KBNODE keyblock,
+                         PKT_public_key *pk, u32 *keyid, int *non_self );
+static int delete_inv_parts( const char *fname, KBNODE keyblock,
+                            u32 *keyid, unsigned int options );
+static int merge_blocks( const char *fname, KBNODE keyblock_orig,
+                        KBNODE keyblock, u32 *keyid,
+                        int *n_uids, int *n_sigs, int *n_subk );
+static int append_uid( KBNODE keyblock, KBNODE node, int *n_sigs,
+                            const char *fname, u32 *keyid );
+static int append_key( KBNODE keyblock, KBNODE node, int *n_sigs,
+                            const char *fname, u32 *keyid );
+static int merge_sigs( KBNODE dst, KBNODE src, int *n_sigs,
+                            const char *fname, u32 *keyid );
+static int merge_keysigs( KBNODE dst, KBNODE src, int *n_sigs,
+                            const char *fname, u32 *keyid );
+
+int
+parse_import_options(char *str,unsigned int *options,int noisy)
+{
+  struct parse_options import_opts[]=
+    {
+      {"import-local-sigs",IMPORT_LOCAL_SIGS,NULL,
+       N_("import signatures that are marked as local-only")},
+      {"repair-pks-subkey-bug",IMPORT_REPAIR_PKS_SUBKEY_BUG,NULL,
+       N_("repair damage from the pks keyserver during import")},
+      {"fast-import",IMPORT_FAST,NULL,
+       N_("do not update the trustdb after import")},
+      {"convert-sk-to-pk",IMPORT_SK2PK,NULL,
+       N_("create a public key when importing a secret key")},
+      {"merge-only",IMPORT_MERGE_ONLY,NULL,
+       N_("only accept updates to existing keys")},
+      {"import-clean",IMPORT_CLEAN,NULL,
+       N_("remove unusable parts from key after import")},
+      {"import-minimal",IMPORT_MINIMAL|IMPORT_CLEAN,NULL,
+       N_("remove as much as possible from key after import")},
+      /* Aliases for backward compatibility */
+      {"allow-local-sigs",IMPORT_LOCAL_SIGS,NULL,NULL},
+      {"repair-hkp-subkey-bug",IMPORT_REPAIR_PKS_SUBKEY_BUG,NULL,NULL},
+      /* dummy */
+      {"import-unusable-sigs",0,NULL,NULL},
+      {"import-clean-sigs",0,NULL,NULL},
+      {"import-clean-uids",0,NULL,NULL},
+      {NULL,0,NULL,NULL}
+    };
+
+  return parse_options(str,options,import_opts,noisy);
+}
+
+void *
+import_new_stats_handle (void)
+{
+    return xmalloc_clear ( sizeof (struct stats_s) );
+}
+
+void
+import_release_stats_handle (void *p)
+{
+    xfree (p);
+}
+
+/****************
+ * Import the public keys from the given filename. Input may be armored.
+ * This function rejects all keys which are not validly self signed on at
+ * least one userid. Only user ids which are self signed will be imported.
+ * Other signatures are not checked.
+ *
+ * Actually this function does a merge. It works like this:
+ *
+ *  - get the keyblock
+ *  - check self-signatures and remove all userids and their signatures
+ *    without/invalid self-signatures.
+ *  - reject the keyblock, if we have no valid userid.
+ *  - See whether we have this key already in one of our pubrings.
+ *    If not, simply add it to the default keyring.
+ *  - Compare the key and the self-signatures of the new and the one in
+ *    our keyring.  If they are different something weird is going on;
+ *    ask what to do.
+ *  - See whether we have only non-self-signature on one user id; if not
+ *    ask the user what to do.
+ *  - compare the signatures: If we already have this signature, check
+ *    that they compare okay; if not, issue a warning and ask the user.
+ *    (consider looking at the timestamp and use the newest?)
+ *  - Simply add the signature.  Can't verify here because we may not have
+ *    the signature's public key yet; verification is done when putting it
+ *    into the trustdb, which is done automagically as soon as this pubkey
+ *    is used.
+ *  - Proceed with next signature.
+ *
+ *  Key revocation certificates have special handling.
+ *
+ */
+static int
+import_keys_internal( IOBUF inp, char **fnames, int nnames,
+                     void *stats_handle, unsigned char **fpr, size_t *fpr_len,
+                     unsigned int options )
+{
+    int i, rc = 0;
+    struct stats_s *stats = stats_handle;
+
+    if (!stats)
+        stats = import_new_stats_handle ();
+
+    if (inp) {
+        rc = import( inp, "[stream]", stats, fpr, fpr_len, options);
+    }
+    else {
+        if( !fnames && !nnames )
+           nnames = 1;  /* Ohh what a ugly hack to jump into the loop */
+
+       for(i=0; i < nnames; i++ ) {
+           const char *fname = fnames? fnames[i] : NULL;
+           IOBUF inp2 = iobuf_open(fname);
+           if( !fname )
+               fname = "[stdin]";
+            if (inp2 && is_secured_file (iobuf_get_fd (inp2)))
+              {
+                iobuf_close (inp2);
+                inp2 = NULL;
+                errno = EPERM;
+              }
+           if( !inp2 )
+               log_error(_("can't open `%s': %s\n"), fname, strerror(errno) );
+           else
+             {
+               rc = import( inp2, fname, stats, fpr, fpr_len, options );
+               iobuf_close(inp2);
+                /* Must invalidate that ugly cache to actually close it. */
+                iobuf_ioctl (NULL, 2, 0, (char*)fname);
+               if( rc )
+                 log_error("import from `%s' failed: %s\n", fname,
+                           g10_errstr(rc) );
+             }
+           if( !fname )
+               break;
+       }
+    }
+    if (!stats_handle) {
+        import_print_stats (stats);
+        import_release_stats_handle (stats);
+    }
+
+    /* If no fast import and the trustdb is dirty (i.e. we added a key
+       or userID that had something other than a selfsig, a signature
+       that was other than a selfsig, or any revocation), then
+       update/check the trustdb if the user specified by setting
+       interactive or by not setting no-auto-check-trustdb */
+
+    if(!(options&IMPORT_FAST))
+      trustdb_check_or_update();
+
+    return rc;
+}
+
+void
+import_keys( char **fnames, int nnames,
+            void *stats_handle, unsigned int options )
+{
+  import_keys_internal(NULL,fnames,nnames,stats_handle,NULL,NULL,options);
+}
+
+int
+import_keys_stream( IOBUF inp, void *stats_handle,
+                   unsigned char **fpr, size_t *fpr_len,unsigned int options )
+{
+  return import_keys_internal(inp,NULL,0,stats_handle,fpr,fpr_len,options);
+}
+
+static int
+import( IOBUF inp, const char* fname,struct stats_s *stats,
+       unsigned char **fpr,size_t *fpr_len,unsigned int options )
+{
+    PACKET *pending_pkt = NULL;
+    KBNODE keyblock = NULL;
+    int rc = 0;
+
+    getkey_disable_caches();
+
+    if( !opt.no_armor ) { /* armored reading is not disabled */
+       armor_filter_context_t *afx = new_armor_context ();
+       afx->only_keyblocks = 1;
+       push_armor_filter (afx, inp);
+        release_armor_context (afx);
+    }
+
+    while( !(rc = read_block( inp, &pending_pkt, &keyblock) )) {
+       if( keyblock->pkt->pkttype == PKT_PUBLIC_KEY )
+           rc = import_one( fname, keyblock, stats, fpr, fpr_len, options, 0);
+       else if( keyblock->pkt->pkttype == PKT_SECRET_KEY ) 
+                rc = import_secret_one( fname, keyblock, stats, options );
+       else if( keyblock->pkt->pkttype == PKT_SIGNATURE
+                && keyblock->pkt->pkt.signature->sig_class == 0x20 )
+           rc = import_revoke_cert( fname, keyblock, stats );
+       else {
+           log_info( _("skipping block of type %d\n"),
+                                           keyblock->pkt->pkttype );
+       }
+       release_kbnode(keyblock);
+        /* fixme: we should increment the not imported counter but this
+           does only make sense if we keep on going despite of errors. */
+       if( rc )
+           break;
+       if( !(++stats->count % 100) && !opt.quiet )
+           log_info(_("%lu keys processed so far\n"), stats->count );
+    }
+    if( rc == -1 )
+       rc = 0;
+    else if( rc && rc != G10ERR_INV_KEYRING )
+       log_error( _("error reading `%s': %s\n"), fname, g10_errstr(rc));
+
+    return rc;
+}
+
+
+void
+import_print_stats (void *hd)
+{
+    struct stats_s *stats = hd;
+
+    if( !opt.quiet ) {
+       log_info(_("Total number processed: %lu\n"), stats->count );
+       if( stats->skipped_new_keys )
+           log_info(_("      skipped new keys: %lu\n"),
+                                               stats->skipped_new_keys );
+       if( stats->no_user_id )
+           log_info(_("          w/o user IDs: %lu\n"), stats->no_user_id );
+       if( stats->imported || stats->imported_rsa ) {
+           log_info(_("              imported: %lu"), stats->imported );
+           if( stats->imported_rsa )
+               fprintf(stderr, "  (RSA: %lu)", stats->imported_rsa );
+           putc('\n', stderr);
+       }
+       if( stats->unchanged )
+           log_info(_("             unchanged: %lu\n"), stats->unchanged );
+       if( stats->n_uids )
+           log_info(_("          new user IDs: %lu\n"), stats->n_uids );
+       if( stats->n_subk )
+           log_info(_("           new subkeys: %lu\n"), stats->n_subk );
+       if( stats->n_sigs )
+           log_info(_("        new signatures: %lu\n"), stats->n_sigs );
+       if( stats->n_revoc )
+           log_info(_("   new key revocations: %lu\n"), stats->n_revoc );
+       if( stats->secret_read )
+           log_info(_("      secret keys read: %lu\n"), stats->secret_read );
+       if( stats->secret_imported )
+           log_info(_("  secret keys imported: %lu\n"), stats->secret_imported );
+       if( stats->secret_dups )
+           log_info(_(" secret keys unchanged: %lu\n"), stats->secret_dups );
+       if( stats->not_imported )
+           log_info(_("          not imported: %lu\n"), stats->not_imported );
+       if( stats->n_sigs_cleaned)
+           log_info(_("    signatures cleaned: %lu\n"),stats->n_sigs_cleaned);
+       if( stats->n_uids_cleaned)
+           log_info(_("      user IDs cleaned: %lu\n"),stats->n_uids_cleaned);
+    }
+
+    if( is_status_enabled() ) {
+       char buf[14*20];
+       sprintf(buf, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
+               stats->count,
+               stats->no_user_id,
+               stats->imported,
+               stats->imported_rsa,
+               stats->unchanged,
+               stats->n_uids,
+               stats->n_subk,
+               stats->n_sigs,
+               stats->n_revoc,
+               stats->secret_read,
+               stats->secret_imported,
+               stats->secret_dups,
+               stats->skipped_new_keys,
+                stats->not_imported );
+       write_status_text( STATUS_IMPORT_RES, buf );
+    }
+}
+
+
+/****************
+ * Read the next keyblock from stream A.
+ * PENDING_PKT should be initialzed to NULL
+ * and not chnaged form the caller.
+ * Retunr: 0 = okay, -1 no more blocks or another errorcode.
+ */
+static int
+read_block( IOBUF a, PACKET **pending_pkt, KBNODE *ret_root )
+{
+    int rc;
+    PACKET *pkt;
+    KBNODE root = NULL;
+    int in_cert;
+
+    if( *pending_pkt ) {
+       root = new_kbnode( *pending_pkt );
+       *pending_pkt = NULL;
+       in_cert = 1;
+    }
+    else
+       in_cert = 0;
+    pkt = xmalloc( sizeof *pkt );
+    init_packet(pkt);
+    while( (rc=parse_packet(a, pkt)) != -1 ) {
+       if( rc ) {  /* ignore errors */
+           if( rc != G10ERR_UNKNOWN_PACKET ) {
+               log_error("read_block: read error: %s\n", g10_errstr(rc) );
+               rc = G10ERR_INV_KEYRING;
+               goto ready;
+           }
+           free_packet( pkt );
+           init_packet(pkt);
+           continue;
+       }
+
+       if( !root && pkt->pkttype == PKT_SIGNATURE
+                 && pkt->pkt.signature->sig_class == 0x20 ) {
+           /* this is a revocation certificate which is handled
+            * in a special way */
+           root = new_kbnode( pkt );
+           pkt = NULL;
+           goto ready;
+       }
+
+       /* make a linked list of all packets */
+       switch( pkt->pkttype ) {
+         case PKT_COMPRESSED:
+           if(check_compress_algo(pkt->pkt.compressed->algorithm))
+             {
+               rc = G10ERR_COMPR_ALGO;
+               goto ready;
+             }
+           else
+             {
+               compress_filter_context_t *cfx = xmalloc_clear( sizeof *cfx );
+               pkt->pkt.compressed->buf = NULL;
+               push_compress_filter2(a,cfx,pkt->pkt.compressed->algorithm,1);
+             }
+           free_packet( pkt );
+           init_packet(pkt);
+           break;
+
+          case PKT_RING_TRUST:
+            /* skip those packets */
+           free_packet( pkt );
+           init_packet(pkt);
+            break;
+
+         case PKT_PUBLIC_KEY:
+         case PKT_SECRET_KEY:
+           if( in_cert ) { /* store this packet */
+               *pending_pkt = pkt;
+               pkt = NULL;
+               goto ready;
+           }
+           in_cert = 1;
+         default:
+           if( in_cert ) {
+               if( !root )
+                   root = new_kbnode( pkt );
+               else
+                   add_kbnode( root, new_kbnode( pkt ) );
+               pkt = xmalloc( sizeof *pkt );
+           }
+           init_packet(pkt);
+           break;
+       }
+    }
+  ready:
+    if( rc == -1 && root )
+       rc = 0;
+
+    if( rc )
+       release_kbnode( root );
+    else
+       *ret_root = root;
+    free_packet( pkt );
+    xfree( pkt );
+    return rc;
+}
+
+/* Walk through the subkeys on a pk to find if we have the PKS
+   disease: multiple subkeys with their binding sigs stripped, and the
+   sig for the first subkey placed after the last subkey.  That is,
+   instead of "pk uid sig sub1 bind1 sub2 bind2 sub3 bind3" we have
+   "pk uid sig sub1 sub2 sub3 bind1".  We can't do anything about sub2
+   and sub3, as they are already lost, but we can try and rescue sub1
+   by reordering the keyblock so that it reads "pk uid sig sub1 bind1
+   sub2 sub3".  Returns TRUE if the keyblock was modified. */
+
+static int
+fix_pks_corruption(KBNODE keyblock)
+{
+  int changed=0,keycount=0;
+  KBNODE node,last=NULL,sknode=NULL;
+
+  /* First determine if we have the problem at all.  Look for 2 or
+     more subkeys in a row, followed by a single binding sig. */
+  for(node=keyblock;node;last=node,node=node->next)
+    {
+      if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY)
+       {
+         keycount++;
+         if(!sknode)
+           sknode=node;
+       }
+      else if(node->pkt->pkttype==PKT_SIGNATURE &&
+             node->pkt->pkt.signature->sig_class==0x18 &&
+             keycount>=2 && node->next==NULL)
+       {
+         /* We might have the problem, as this key has two subkeys in
+            a row without any intervening packets. */
+
+         /* Sanity check */
+         if(last==NULL)
+           break;
+
+         /* Temporarily attach node to sknode. */
+         node->next=sknode->next;
+         sknode->next=node;
+         last->next=NULL;
+
+         /* Note we aren't checking whether this binding sig is a
+            selfsig.  This is not necessary here as the subkey and
+            binding sig will be rejected later if that is the
+            case. */
+         if(check_key_signature(keyblock,node,NULL))
+           {
+             /* Not a match, so undo the changes. */
+             sknode->next=node->next;
+             last->next=node;
+             node->next=NULL;
+             break;
+           }
+         else
+           {
+             sknode->flag |= 1; /* Mark it good so we don't need to
+                                    check it again */
+             changed=1;
+             break;
+           }
+       }
+      else
+       keycount=0;
+    }
+
+  return changed;
+}
+
+
+static void
+print_import_ok (PKT_public_key *pk, PKT_secret_key *sk, unsigned int reason)
+{
+  byte array[MAX_FINGERPRINT_LEN], *s;
+  char buf[MAX_FINGERPRINT_LEN*2+30], *p;
+  size_t i, n;
+
+  sprintf (buf, "%u ", reason);
+  p = buf + strlen (buf);
+
+  if (pk)
+    fingerprint_from_pk (pk, array, &n);
+  else
+    fingerprint_from_sk (sk, array, &n);
+  s = array;
+  for (i=0; i < n ; i++, s++, p += 2)
+    sprintf (p, "%02X", *s);
+
+  write_status_text (STATUS_IMPORT_OK, buf);
+}
+
+static void
+print_import_check (PKT_public_key * pk, PKT_user_id * id)
+{
+    char * buf;
+    byte fpr[24];
+    u32 keyid[2];
+    size_t i, pos = 0, n;
+
+    buf = xmalloc (17+41+id->len+32);
+    keyid_from_pk (pk, keyid);
+    sprintf (buf, "%08X%08X ", keyid[0], keyid[1]);
+    pos = 17;
+    fingerprint_from_pk (pk, fpr, &n);
+    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);
+}
+
+static void
+check_prefs_warning(PKT_public_key *pk)
+{
+  log_info(_("WARNING: key %s contains preferences for unavailable\n"),
+            keystr_from_pk(pk));
+  /* TRANSLATORS: This string is belongs to the previous one.  They are
+     only split up to allow printing of a common prefix. */
+  log_info(_("         algorithms on these user IDs:\n"));
+}
+
+static void
+check_prefs(KBNODE keyblock)
+{
+  KBNODE node;
+  PKT_public_key *pk;
+  int problem=0;
+  
+  merge_keys_and_selfsig(keyblock);
+  pk=keyblock->pkt->pkt.public_key;
+
+  for(node=keyblock;node;node=node->next)
+    {
+      if(node->pkt->pkttype==PKT_USER_ID
+        && node->pkt->pkt.user_id->created
+        && node->pkt->pkt.user_id->prefs)
+       {
+         PKT_user_id *uid=node->pkt->pkt.user_id;
+         prefitem_t *prefs=uid->prefs;
+         char *user=utf8_to_native(uid->name,strlen(uid->name),0);
+
+         for(;prefs->type;prefs++)
+           {
+             char num[10]; /* prefs->value is a byte, so we're over
+                              safe here */
+
+             sprintf(num,"%u",prefs->value);
+
+             if(prefs->type==PREFTYPE_SYM)
+               {
+                 if(check_cipher_algo(prefs->value))
+                   {
+                     const char *algo=cipher_algo_to_string(prefs->value);
+                     if(!problem)
+                       check_prefs_warning(pk);
+                     log_info(_("         \"%s\": preference for cipher"
+                                " algorithm %s\n"),user,algo?algo:num);
+                     problem=1;
+                   }
+               }
+             else if(prefs->type==PREFTYPE_HASH)
+               {
+                 if(check_digest_algo(prefs->value))
+                   {
+                     const char *algo=digest_algo_to_string(prefs->value);
+                     if(!problem)
+                       check_prefs_warning(pk);
+                     log_info(_("         \"%s\": preference for digest"
+                                " algorithm %s\n"),user,algo?algo:num);
+                     problem=1;
+                   }
+               }
+             else if(prefs->type==PREFTYPE_ZIP)
+               {
+                 if(check_compress_algo(prefs->value))
+                   {
+                     const char *algo=compress_algo_to_string(prefs->value);
+                     if(!problem)
+                       check_prefs_warning(pk);
+                     log_info(_("         \"%s\": preference for compression"
+                                " algorithm %s\n"),user,algo?algo:num);
+                     problem=1;
+                   }
+               }
+           }
+
+         xfree(user);
+       }
+    }
+
+  if(problem)
+    {
+      log_info(_("it is strongly suggested that you update"
+                " your preferences and\n"));
+      log_info(_("re-distribute this key to avoid potential algorithm"
+                " mismatch problems\n"));
+
+      if(!opt.batch)
+       {
+         STRLIST sl=NULL,locusr=NULL;
+         size_t fprlen=0;
+         byte fpr[MAX_FINGERPRINT_LEN],*p;
+         char username[(MAX_FINGERPRINT_LEN*2)+1];
+         unsigned int i;
+
+         p=fingerprint_from_pk(pk,fpr,&fprlen);
+         for(i=0;i<fprlen;i++,p++)
+           sprintf(username+2*i,"%02X",*p);
+         add_to_strlist(&locusr,username);
+
+         append_to_strlist(&sl,"updpref");
+         append_to_strlist(&sl,"save");
+
+         keyedit_menu( username, locusr, sl, 1, 1 );
+         free_strlist(sl);
+         free_strlist(locusr);
+       }
+      else if(!opt.quiet)
+       log_info(_("you can update your preferences with:"
+                  " gpg --edit-key %s updpref save\n"),keystr_from_pk(pk));
+    }
+}
+
+/****************
+ * Try to import one keyblock. Return an error only in serious cases, but
+ * never for an invalid keyblock.  It uses log_error to increase the
+ * internal errorcount, so that invalid input can be detected by programs
+ * which called g10.
+ */
+static int
+import_one( const char *fname, KBNODE keyblock, struct stats_s *stats,
+           unsigned char **fpr,size_t *fpr_len,unsigned int options,
+           int from_sk )
+{
+    PKT_public_key *pk;
+    PKT_public_key *pk_orig;
+    KBNODE node, uidnode;
+    KBNODE keyblock_orig = NULL;
+    u32 keyid[2];
+    int rc = 0;
+    int new_key = 0;
+    int mod_key = 0;
+    int non_self = 0;
+
+    /* get the key and print some info about it */
+    node = find_kbnode( keyblock, PKT_PUBLIC_KEY );
+    if( !node )
+       BUG();
+
+    pk = node->pkt->pkt.public_key;
+
+    keyid_from_pk( pk, keyid );
+    uidnode = find_next_kbnode( keyblock, PKT_USER_ID );
+
+    if( opt.verbose && !opt.interactive )
+      {
+       log_info( "pub  %4u%c/%s %s  ",
+                 nbits_from_pk( pk ),
+                 pubkey_letter( pk->pubkey_algo ),
+                 keystr_from_pk(pk), datestr_from_pk(pk) );
+       if( uidnode )
+         print_utf8_string( stderr, uidnode->pkt->pkt.user_id->name,
+                            uidnode->pkt->pkt.user_id->len );
+       putc('\n', stderr);
+      }
+
+    if( !uidnode )
+      {
+       log_error( _("key %s: no user ID\n"), keystr_from_pk(pk));
+       return 0;
+      }
+    
+    if (opt.interactive) {
+        if(is_status_enabled())
+         print_import_check (pk, uidnode->pkt->pkt.user_id);
+       merge_keys_and_selfsig (keyblock);
+        tty_printf ("\n");
+        show_basic_key_info (keyblock);
+        tty_printf ("\n");
+        if (!cpr_get_answer_is_yes ("import.okay",
+                                    "Do you want to import this key? (y/N) "))
+            return 0;
+    }
+
+    collapse_uids(&keyblock);
+
+    /* Clean the key that we're about to import, to cut down on things
+       that we have to clean later.  This has no practical impact on
+       the end result, but does result in less logging which might
+       confuse the user. */
+    if(options&IMPORT_CLEAN)
+      clean_key(keyblock,opt.verbose,options&IMPORT_MINIMAL,NULL,NULL);
+
+    clear_kbnode_flags( keyblock );
+
+    if((options&IMPORT_REPAIR_PKS_SUBKEY_BUG) && fix_pks_corruption(keyblock)
+       && opt.verbose)
+      log_info(_("key %s: PKS subkey corruption repaired\n"),
+              keystr_from_pk(pk));
+
+    rc = chk_self_sigs( fname, keyblock , pk, keyid, &non_self );
+    if( rc )
+       return rc== -1? 0:rc;
+
+    /* If we allow such a thing, mark unsigned uids as valid */
+    if( opt.allow_non_selfsigned_uid )
+      for( node=keyblock; node; node = node->next )
+       if( node->pkt->pkttype == PKT_USER_ID && !(node->flag & 1) )
+         {
+           char *user=utf8_to_native(node->pkt->pkt.user_id->name,
+                                     node->pkt->pkt.user_id->len,0);
+           node->flag |= 1;
+           log_info( _("key %s: accepted non self-signed user ID \"%s\"\n"),
+                     keystr_from_pk(pk),user);
+           xfree(user);
+         }
+
+    if( !delete_inv_parts( fname, keyblock, keyid, options ) ) {
+        log_error( _("key %s: no valid user IDs\n"), keystr_from_pk(pk));
+       if( !opt.quiet )
+         log_info(_("this may be caused by a missing self-signature\n"));
+       stats->no_user_id++;
+       return 0;
+    }
+
+    /* do we have this key already in one of our pubrings ? */
+    pk_orig = xmalloc_clear( sizeof *pk_orig );
+    rc = get_pubkey_fast ( pk_orig, keyid );
+    if( rc && rc != G10ERR_NO_PUBKEY && rc != G10ERR_UNU_PUBKEY )
+      {
+       log_error( _("key %s: public key not found: %s\n"),
+                  keystr(keyid), g10_errstr(rc));
+      }
+    else if ( rc && (opt.import_options&IMPORT_MERGE_ONLY) )
+      {
+       if( opt.verbose )
+         log_info( _("key %s: new key - skipped\n"), keystr(keyid));
+       rc = 0;
+       stats->skipped_new_keys++;
+      }
+    else if( rc ) { /* insert this key */
+        KEYDB_HANDLE hd = keydb_new (0);
+
+        rc = keydb_locate_writable (hd, NULL);
+       if (rc) {
+           log_error (_("no writable keyring found: %s\n"), g10_errstr (rc));
+            keydb_release (hd);
+           return G10ERR_GENERAL;
+       }
+       if( opt.verbose > 1 )
+           log_info (_("writing to `%s'\n"), keydb_get_resource_name (hd) );
+
+       rc = keydb_insert_keyblock (hd, keyblock );
+        if (rc)
+          log_error (_("error writing keyring `%s': %s\n"),
+                      keydb_get_resource_name (hd), g10_errstr(rc));
+       else
+         {
+           /* This should not be possible since we delete the
+              ownertrust when a key is deleted, but it can happen if
+              the keyring and trustdb are out of sync.  It can also
+              be made to happen with the trusted-key command. */
+
+           clear_ownertrusts (pk);
+           if(non_self)
+             revalidation_mark ();
+         }
+        keydb_release (hd);
+
+       /* we are ready */
+       if( !opt.quiet )
+         {
+           char *p=get_user_id_native (keyid);
+           log_info( _("key %s: public key \"%s\" imported\n"),
+                     keystr(keyid),p);
+           xfree(p);
+         }
+       if( is_status_enabled() )
+         {
+           char *us = get_long_user_id_string( keyid );
+           write_status_text( STATUS_IMPORTED, us );
+           xfree(us);
+            print_import_ok (pk,NULL, 1);
+         }
+       stats->imported++;
+       if( is_RSA( pk->pubkey_algo ) )
+           stats->imported_rsa++;
+       new_key = 1;
+    }
+    else { /* merge */
+        KEYDB_HANDLE hd;
+       int n_uids, n_sigs, n_subk, n_sigs_cleaned, n_uids_cleaned;
+
+       /* Compare the original against the new key; just to be sure nothing
+        * weird is going on */
+       if( cmp_public_keys( pk_orig, pk ) )
+         {
+           log_error( _("key %s: doesn't match our copy\n"),keystr(keyid));
+           goto leave;
+         }
+
+       /* now read the original keyblock */
+        hd = keydb_new (0);
+        {
+            byte afp[MAX_FINGERPRINT_LEN];
+            size_t an;
+
+            fingerprint_from_pk (pk_orig, afp, &an);
+            while (an < MAX_FINGERPRINT_LEN) 
+                afp[an++] = 0;
+            rc = keydb_search_fpr (hd, afp);
+        }
+       if( rc )
+         {
+           log_error (_("key %s: can't locate original keyblock: %s\n"),
+                      keystr(keyid), g10_errstr(rc));
+            keydb_release (hd);
+           goto leave;
+         }
+       rc = keydb_get_keyblock (hd, &keyblock_orig );
+       if (rc)
+         {
+           log_error (_("key %s: can't read original keyblock: %s\n"),
+                      keystr(keyid), g10_errstr(rc));
+            keydb_release (hd);
+           goto leave;
+         }
+
+       /* and try to merge the block */
+       clear_kbnode_flags( keyblock_orig );
+       clear_kbnode_flags( keyblock );
+       n_uids = n_sigs = n_subk = n_sigs_cleaned = n_uids_cleaned = 0;
+       rc = merge_blocks( fname, keyblock_orig, keyblock,
+                          keyid, &n_uids, &n_sigs, &n_subk );
+       if( rc )
+         {
+            keydb_release (hd);
+           goto leave;
+         }
+
+       if(options&IMPORT_CLEAN)
+         clean_key(keyblock_orig,opt.verbose,options&IMPORT_MINIMAL,
+                   &n_uids_cleaned,&n_sigs_cleaned);
+
+       if( n_uids || n_sigs || n_subk || n_sigs_cleaned || n_uids_cleaned) {
+           mod_key = 1;
+           /* keyblock_orig has been updated; write */
+           rc = keydb_update_keyblock (hd, keyblock_orig);
+            if (rc)
+               log_error (_("error writing keyring `%s': %s\n"),
+                            keydb_get_resource_name (hd), g10_errstr(rc) );
+           else if(non_self)
+             revalidation_mark ();
+
+           /* we are ready */
+           if( !opt.quiet )
+             {
+               char *p=get_user_id_native(keyid);
+               if( n_uids == 1 )
+                 log_info( _("key %s: \"%s\" 1 new user ID\n"),
+                          keystr(keyid),p);
+               else if( n_uids )
+                 log_info( _("key %s: \"%s\" %d new user IDs\n"),
+                           keystr(keyid),p,n_uids);
+               if( n_sigs == 1 )
+                 log_info( _("key %s: \"%s\" 1 new signature\n"),
+                           keystr(keyid), p);
+               else if( n_sigs )
+                 log_info( _("key %s: \"%s\" %d new signatures\n"),
+                           keystr(keyid), p, n_sigs );
+               if( n_subk == 1 )
+                 log_info( _("key %s: \"%s\" 1 new subkey\n"),
+                           keystr(keyid), p);
+               else if( n_subk )
+                 log_info( _("key %s: \"%s\" %d new subkeys\n"),
+                           keystr(keyid), p, n_subk );
+               if(n_sigs_cleaned==1)
+                 log_info(_("key %s: \"%s\" %d signature cleaned\n"),
+                          keystr(keyid),p,n_sigs_cleaned);
+               else if(n_sigs_cleaned)
+                 log_info(_("key %s: \"%s\" %d signatures cleaned\n"),
+                          keystr(keyid),p,n_sigs_cleaned);
+               if(n_uids_cleaned==1)
+                 log_info(_("key %s: \"%s\" %d user ID cleaned\n"),
+                          keystr(keyid),p,n_uids_cleaned);
+               else if(n_uids_cleaned)
+                 log_info(_("key %s: \"%s\" %d user IDs cleaned\n"),
+                          keystr(keyid),p,n_uids_cleaned);
+               xfree(p);
+             }
+
+           stats->n_uids +=n_uids;
+           stats->n_sigs +=n_sigs;
+           stats->n_subk +=n_subk;
+           stats->n_sigs_cleaned +=n_sigs_cleaned;
+           stats->n_uids_cleaned +=n_uids_cleaned;
+
+            if (is_status_enabled ()) 
+                 print_import_ok (pk, NULL,
+                                  ((n_uids?2:0)|(n_sigs?4:0)|(n_subk?8:0)));
+       }
+       else
+         {
+           if (is_status_enabled ()) 
+             print_import_ok (pk, NULL, 0);
+
+           if( !opt.quiet )
+             {
+               char *p=get_user_id_native(keyid);
+               log_info( _("key %s: \"%s\" not changed\n"),keystr(keyid),p);
+               xfree(p);
+             }
+
+           stats->unchanged++;
+         }
+
+        keydb_release (hd); hd = NULL;
+    }
+
+  leave:
+
+    /* Now that the key is definitely incorporated into the keydb, we
+       need to check if a designated revocation is present or if the
+       prefs are not rational so we can warn the user. */
+
+    if(mod_key)
+      {
+       revocation_present(keyblock_orig);
+       if(!from_sk && seckey_available(keyid)==0)
+         check_prefs(keyblock_orig);
+      }
+    else if(new_key)
+      {
+       /* A little explanation for this: we fill in the fingerprint
+          when importing keys as it can be useful to know the
+          fingerprint in certain keyserver-related cases (a keyserver
+          asked for a particular name, but the key doesn't have that
+          name).  However, in cases where we're importing more than
+          one key at a time, we cannot know which key to fingerprint.
+          In these cases, rather than guessing, we do not fingerpring
+          at all, and we must hope the user ID on the keys are
+          useful. */
+       if(fpr)
+         {
+           xfree(*fpr);
+           if(stats->imported==1)
+             *fpr=fingerprint_from_pk(pk,NULL,fpr_len);
+           else
+             *fpr=NULL;
+         }
+
+       revocation_present(keyblock);
+       if(!from_sk && seckey_available(keyid)==0)
+         check_prefs(keyblock);
+      }
+
+    release_kbnode( keyblock_orig );
+    free_public_key( pk_orig );
+
+    return rc;
+}
+
+/* Walk a secret keyblock and produce a public keyblock out of it. */
+static KBNODE
+sec_to_pub_keyblock(KBNODE sec_keyblock)
+{
+  KBNODE secnode,pub_keyblock=NULL,ctx=NULL;
+
+  while((secnode=walk_kbnode(sec_keyblock,&ctx,0)))
+    {
+      KBNODE pubnode;
+
+      if(secnode->pkt->pkttype==PKT_SECRET_KEY ||
+        secnode->pkt->pkttype==PKT_SECRET_SUBKEY)
+       {
+         /* Make a public key.  We only need to convert enough to
+            write the keyblock out. */
+
+         PKT_secret_key *sk=secnode->pkt->pkt.secret_key;
+         PACKET *pkt=xmalloc_clear(sizeof(PACKET));
+         PKT_public_key *pk=xmalloc_clear(sizeof(PKT_public_key));
+         int n;
+
+         if(secnode->pkt->pkttype==PKT_SECRET_KEY)
+           pkt->pkttype=PKT_PUBLIC_KEY;
+         else
+           pkt->pkttype=PKT_PUBLIC_SUBKEY;
+
+         pkt->pkt.public_key=pk;
+
+         pk->version=sk->version;
+         pk->timestamp=sk->timestamp;
+         pk->expiredate=sk->expiredate;
+         pk->pubkey_algo=sk->pubkey_algo;
+
+         n=pubkey_get_npkey(pk->pubkey_algo);
+         if(n==0)
+           {
+             /* we can't properly extract the pubkey without knowing
+                the number of MPIs */
+             release_kbnode(pub_keyblock);
+             return NULL;
+           }
+         else
+           {
+             int i;
+
+             for(i=0;i<n;i++)
+               pk->pkey[i]=mpi_copy(sk->skey[i]);
+           }
+
+         pubnode=new_kbnode(pkt);
+       }
+      else
+       {
+         pubnode=clone_kbnode(secnode);
+       }
+
+      if(pub_keyblock==NULL)
+       pub_keyblock=pubnode;
+      else
+       add_kbnode(pub_keyblock,pubnode);
+    }
+
+  return pub_keyblock;
+}
+
+/****************
+ * Ditto for secret keys.  Handling is simpler than for public keys.
+ * We allow secret key importing only when allow is true, this is so
+ * that a secret key can not be imported accidently and thereby tampering
+ * with the trust calculation.
+ */
+static int
+import_secret_one( const char *fname, KBNODE keyblock, 
+                   struct stats_s *stats, unsigned int options)
+{
+    PKT_secret_key *sk;
+    KBNODE node, uidnode;
+    u32 keyid[2];
+    int rc = 0;
+
+    /* get the key and print some info about it */
+    node = find_kbnode( keyblock, PKT_SECRET_KEY );
+    if( !node )
+       BUG();
+
+    sk = node->pkt->pkt.secret_key;
+    keyid_from_sk( sk, keyid );
+    uidnode = find_next_kbnode( keyblock, PKT_USER_ID );
+
+    if( opt.verbose )
+      {
+       log_info( "sec  %4u%c/%s %s   ",
+                 nbits_from_sk( sk ),
+                 pubkey_letter( sk->pubkey_algo ),
+                 keystr_from_sk(sk), datestr_from_sk(sk) );
+       if( uidnode )
+         print_utf8_string( stderr, uidnode->pkt->pkt.user_id->name,
+                            uidnode->pkt->pkt.user_id->len );
+       putc('\n', stderr);
+      }
+    stats->secret_read++;
+
+    if( !uidnode )
+      {
+       log_error( _("key %s: no user ID\n"), keystr_from_sk(sk));
+       return 0;
+      }
+
+    if(sk->protect.algo>110)
+      {
+       log_error(_("key %s: secret key with invalid cipher %d"
+                   " - skipped\n"),keystr_from_sk(sk),sk->protect.algo);
+       return 0;
+      }
+
+#ifdef ENABLE_SELINUX_HACKS
+    if (1)
+      {
+        /* We don't allow to import secret keys because that may be used
+           to put a secret key into the keyring and the user might later
+           be tricked into signing stuff with that key.  */
+        log_error (_("importing secret keys not allowed\n"));
+        return 0;
+      }
+#endif 
+    
+    clear_kbnode_flags( keyblock );
+
+    /* do we have this key already in one of our secrings ? */
+    rc = seckey_available( keyid );
+    if( rc == G10ERR_NO_SECKEY && !(opt.import_options&IMPORT_MERGE_ONLY) )
+      {
+       /* simply insert this key */
+        KEYDB_HANDLE hd = keydb_new (1);
+
+       /* get default resource */
+        rc = keydb_locate_writable (hd, NULL);
+       if (rc) {
+         log_error (_("no default secret keyring: %s\n"), g10_errstr (rc));
+         keydb_release (hd);
+         return G10ERR_GENERAL;
+       }
+       rc = keydb_insert_keyblock (hd, keyblock );
+        if (rc)
+         log_error (_("error writing keyring `%s': %s\n"),
+                    keydb_get_resource_name (hd), g10_errstr(rc) );
+        keydb_release (hd);
+       /* we are ready */
+       if( !opt.quiet )
+         log_info( _("key %s: secret key imported\n"), keystr_from_sk(sk));
+       stats->secret_imported++;
+        if (is_status_enabled ()) 
+         print_import_ok (NULL, sk, 1|16);
+
+       if(options&IMPORT_SK2PK)
+         {
+           /* Try and make a public key out of this. */
+
+           KBNODE pub_keyblock=sec_to_pub_keyblock(keyblock);
+           if(pub_keyblock)
+             {
+               import_one(fname,pub_keyblock,stats,
+                          NULL,NULL,opt.import_options,1);
+               release_kbnode(pub_keyblock);
+             }
+         }
+
+       /* Now that the key is definitely incorporated into the keydb,
+          if we have the public part of this key, we need to check if
+          the prefs are rational. */
+       node=get_pubkeyblock(keyid);
+       if(node)
+         {
+           check_prefs(node);
+           release_kbnode(node);
+         }
+      }
+    else if( !rc )
+      { /* we can't merge secret keys */
+       log_error( _("key %s: already in secret keyring\n"),
+                  keystr_from_sk(sk));
+       stats->secret_dups++;
+        if (is_status_enabled ()) 
+         print_import_ok (NULL, sk, 16);
+
+       /* TODO: if we ever do merge secret keys, make sure to handle
+          the sec_to_pub_keyblock feature as well. */
+      }
+    else
+      log_error( _("key %s: secret key not found: %s\n"),
+                keystr_from_sk(sk), g10_errstr(rc));
+
+    return rc;
+}
+
+
+/****************
+ * Import a revocation certificate; this is a single signature packet.
+ */
+static int
+import_revoke_cert( const char *fname, KBNODE node, struct stats_s *stats )
+{
+    PKT_public_key *pk=NULL;
+    KBNODE onode, keyblock = NULL;
+    KEYDB_HANDLE hd = NULL;
+    u32 keyid[2];
+    int rc = 0;
+
+    assert( !node->next );
+    assert( node->pkt->pkttype == PKT_SIGNATURE );
+    assert( node->pkt->pkt.signature->sig_class == 0x20 );
+
+    keyid[0] = node->pkt->pkt.signature->keyid[0];
+    keyid[1] = node->pkt->pkt.signature->keyid[1];
+
+    pk = xmalloc_clear( sizeof *pk );
+    rc = get_pubkey( pk, keyid );
+    if( rc == G10ERR_NO_PUBKEY )
+      {
+       log_error(_("key %s: no public key -"
+                   " can't apply revocation certificate\n"), keystr(keyid));
+       rc = 0;
+       goto leave;
+      }
+    else if( rc )
+      {
+       log_error(_("key %s: public key not found: %s\n"),
+                 keystr(keyid), g10_errstr(rc));
+       goto leave;
+      }
+
+    /* read the original keyblock */
+    hd = keydb_new (0);
+    {
+        byte afp[MAX_FINGERPRINT_LEN];
+        size_t an;
+        
+        fingerprint_from_pk (pk, afp, &an);
+        while (an < MAX_FINGERPRINT_LEN) 
+            afp[an++] = 0;
+        rc = keydb_search_fpr (hd, afp);
+    }
+    if (rc)
+      {
+       log_error (_("key %s: can't locate original keyblock: %s\n"),
+                   keystr(keyid), g10_errstr(rc));
+       goto leave;
+      }
+    rc = keydb_get_keyblock (hd, &keyblock );
+    if (rc)
+      {
+       log_error (_("key %s: can't read original keyblock: %s\n"),
+                   keystr(keyid), g10_errstr(rc));
+       goto leave;
+      }
+
+    /* it is okay, that node is not in keyblock because
+     * check_key_signature works fine for sig_class 0x20 in this
+     * special case. */
+    rc = check_key_signature( keyblock, node, NULL);
+    if( rc )
+      {
+       log_error( _("key %s: invalid revocation certificate"
+                    ": %s - rejected\n"), keystr(keyid), g10_errstr(rc));
+       goto leave;
+      }
+
+    /* check whether we already have this */
+    for(onode=keyblock->next; onode; onode=onode->next ) {
+       if( onode->pkt->pkttype == PKT_USER_ID )
+           break;
+       else if( onode->pkt->pkttype == PKT_SIGNATURE
+                && !cmp_signatures(node->pkt->pkt.signature,
+                                   onode->pkt->pkt.signature))
+         {
+           rc = 0;
+           goto leave; /* yes, we already know about it */
+         }
+    }
+
+
+    /* insert it */
+    insert_kbnode( keyblock, clone_kbnode(node), 0 );
+
+    /* and write the keyblock back */
+    rc = keydb_update_keyblock (hd, keyblock );
+    if (rc)
+       log_error (_("error writing keyring `%s': %s\n"),
+                   keydb_get_resource_name (hd), g10_errstr(rc) );
+    keydb_release (hd); hd = NULL;
+    /* we are ready */
+    if( !opt.quiet )
+      {
+        char *p=get_user_id_native (keyid);
+       log_info( _("key %s: \"%s\" revocation certificate imported\n"),
+                 keystr(keyid),p);
+       xfree(p);
+      }
+    stats->n_revoc++;
+
+    /* If the key we just revoked was ultimately trusted, remove its
+       ultimate trust.  This doesn't stop the user from putting the
+       ultimate trust back, but is a reasonable solution for now. */
+    if(get_ownertrust(pk)==TRUST_ULTIMATE)
+      clear_ownertrusts(pk);
+
+    revalidation_mark ();
+
+  leave:
+    keydb_release (hd);
+    release_kbnode( keyblock );
+    free_public_key( pk );
+    return rc;
+}
+
+
+/****************
+ * loop over the keyblock and check all self signatures.
+ * Mark all user-ids with a self-signature by setting flag bit 0.
+ * Mark all user-ids with an invalid self-signature by setting bit 1.
+ * This works also for subkeys, here the subkey is marked.  Invalid or
+ * extra subkey sigs (binding or revocation) are marked for deletion.
+ * non_self is set to true if there are any sigs other than self-sigs
+ * in this keyblock.
+ */
+static int
+chk_self_sigs( const char *fname, KBNODE keyblock,
+              PKT_public_key *pk, u32 *keyid, int *non_self )
+{
+    KBNODE n,knode=NULL;
+    PKT_signature *sig;
+    int rc;
+    u32 bsdate=0,rsdate=0;
+    KBNODE bsnode=NULL,rsnode=NULL;
+
+    for( n=keyblock; (n = find_next_kbnode(n, 0)); ) {
+      if(n->pkt->pkttype==PKT_PUBLIC_SUBKEY)
+       {
+         knode=n;
+         bsdate=0;
+         rsdate=0;
+         bsnode=NULL;
+         rsnode=NULL;
+         continue;
+       }
+      else if( n->pkt->pkttype != PKT_SIGNATURE )
+           continue;
+       sig = n->pkt->pkt.signature;
+       if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] ) {
+
+           /* This just caches the sigs for later use.  That way we
+              import a fully-cached key which speeds things up. */
+           if(!opt.no_sig_cache)
+             check_key_signature(keyblock,n,NULL);
+
+           if( IS_UID_SIG(sig) || IS_UID_REV(sig) )
+             {
+               KBNODE unode = find_prev_kbnode( keyblock, n, PKT_USER_ID );
+               if( !unode )
+                 {
+                   log_error( _("key %s: no user ID for signature\n"),
+                              keystr(keyid));
+                   return -1;  /* the complete keyblock is invalid */
+                 }
+
+               /* If it hasn't been marked valid yet, keep trying */
+               if(!(unode->flag&1)) {
+                 rc = check_key_signature( keyblock, n, NULL);
+                 if( rc )
+                   {
+                     if( opt.verbose )
+                       {
+                         char *p=utf8_to_native(unode->pkt->pkt.user_id->name,
+                                     strlen(unode->pkt->pkt.user_id->name),0);
+                         log_info( rc == G10ERR_PUBKEY_ALGO ?
+                                   _("key %s: unsupported public key "
+                                     "algorithm on user ID \"%s\"\n"):
+                                   _("key %s: invalid self-signature "
+                                     "on user ID \"%s\"\n"),
+                                   keystr(keyid),p);
+                         xfree(p);
+                       }
+                   }
+                 else
+                   unode->flag |= 1; /* mark that signature checked */
+               }
+             }
+           else if( sig->sig_class == 0x18 ) {
+             /* Note that this works based solely on the timestamps
+                like the rest of gpg.  If the standard gets
+                revocation targets, this may need to be revised. */
+
+               if( !knode )
+                 {
+                   if(opt.verbose)
+                     log_info( _("key %s: no subkey for key binding\n"),
+                               keystr(keyid));
+                   n->flag |= 4; /* delete this */
+                 }
+               else
+                 {
+                   rc = check_key_signature( keyblock, n, NULL);
+                   if( rc )
+                     {
+                       if(opt.verbose)
+                         log_info(rc == G10ERR_PUBKEY_ALGO ?
+                                  _("key %s: unsupported public key"
+                                    " algorithm\n"):
+                                  _("key %s: invalid subkey binding\n"),
+                                  keystr(keyid));
+                       n->flag|=4;
+                     }
+                   else
+                     {
+                       /* It's valid, so is it newer? */
+                       if(sig->timestamp>=bsdate) {
+                         knode->flag |= 1;  /* the subkey is valid */
+                         if(bsnode)
+                           {
+                             bsnode->flag|=4; /* Delete the last binding
+                                                 sig since this one is
+                                                 newer */
+                             if(opt.verbose)
+                               log_info(_("key %s: removed multiple subkey"
+                                          " binding\n"),keystr(keyid));
+                           }
+
+                         bsnode=n;
+                         bsdate=sig->timestamp;
+                       }
+                       else
+                         n->flag|=4; /* older */
+                     }
+                 }
+           }
+           else if( sig->sig_class == 0x28 ) {
+             /* We don't actually mark the subkey as revoked right
+                 now, so just check that the revocation sig is the
+                 most recent valid one.  Note that we don't care if
+                 the binding sig is newer than the revocation sig.
+                 See the comment in getkey.c:merge_selfsigs_subkey for
+                 more */
+               if( !knode )
+                 {
+                   if(opt.verbose)
+                     log_info( _("key %s: no subkey for key revocation\n"),
+                               keystr(keyid));
+                   n->flag |= 4; /* delete this */
+                 }
+               else
+                 {
+                   rc = check_key_signature( keyblock, n, NULL);
+                   if( rc )
+                     {
+                       if(opt.verbose)
+                         log_info(rc == G10ERR_PUBKEY_ALGO ?
+                                  _("key %s: unsupported public"
+                                    " key algorithm\n"):
+                                  _("key %s: invalid subkey revocation\n"),
+                                  keystr(keyid));
+                       n->flag|=4;
+                     }
+                   else
+                     {
+                       /* It's valid, so is it newer? */
+                       if(sig->timestamp>=rsdate)
+                         {
+                           if(rsnode)
+                             {
+                               rsnode->flag|=4; /* Delete the last revocation
+                                                   sig since this one is
+                                                   newer */
+                               if(opt.verbose)
+                                 log_info(_("key %s: removed multiple subkey"
+                                            " revocation\n"),keystr(keyid));
+                             }
+
+                           rsnode=n;
+                           rsdate=sig->timestamp;
+                         }
+                       else
+                         n->flag|=4; /* older */
+                     }
+                 }
+           }
+       }
+       else
+         *non_self=1;
+    }
+
+    return 0;
+}
+
+/****************
+ * delete all parts which are invalid and those signatures whose
+ * public key algorithm is not available in this implemenation;
+ * but consider RSA as valid, because parse/build_packets knows
+ * about it.
+ * returns: true if at least one valid user-id is left over.
+ */
+static int
+delete_inv_parts( const char *fname, KBNODE keyblock,
+                 u32 *keyid, unsigned int options)
+{
+    KBNODE node;
+    int nvalid=0, uid_seen=0, subkey_seen=0;
+
+    for(node=keyblock->next; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           uid_seen = 1;
+           if( (node->flag & 2) || !(node->flag & 1) ) {
+               if( opt.verbose )
+                 {
+                   char *p=utf8_to_native(node->pkt->pkt.user_id->name,
+                                          node->pkt->pkt.user_id->len,0);
+                   log_info( _("key %s: skipped user ID \"%s\"\n"),
+                             keystr(keyid),p);
+                   xfree(p);
+                 }
+               delete_kbnode( node ); /* the user-id */
+               /* and all following packets up to the next user-id */
+               while( node->next
+                      && node->next->pkt->pkttype != PKT_USER_ID
+                      && node->next->pkt->pkttype != PKT_PUBLIC_SUBKEY
+                      && node->next->pkt->pkttype != PKT_SECRET_SUBKEY ){
+                   delete_kbnode( node->next );
+                   node = node->next;
+               }
+           }
+           else
+               nvalid++;
+       }
+       else if(    node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                || node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+           if( (node->flag & 2) || !(node->flag & 1) ) {
+               if( opt.verbose )
+                 log_info( _("key %s: skipped subkey\n"),keystr(keyid));
+
+               delete_kbnode( node ); /* the subkey */
+               /* and all following signature packets */
+               while( node->next
+                      && node->next->pkt->pkttype == PKT_SIGNATURE ) {
+                   delete_kbnode( node->next );
+                   node = node->next;
+               }
+           }
+           else
+             subkey_seen = 1;
+       }
+       else if( node->pkt->pkttype == PKT_SIGNATURE
+                && check_pubkey_algo( node->pkt->pkt.signature->pubkey_algo)
+                && node->pkt->pkt.signature->pubkey_algo != PUBKEY_ALGO_RSA )
+           delete_kbnode( node ); /* build_packet() can't handle this */
+       else if( node->pkt->pkttype == PKT_SIGNATURE &&
+                !node->pkt->pkt.signature->flags.exportable &&
+                !(options&IMPORT_LOCAL_SIGS) &&
+                seckey_available( node->pkt->pkt.signature->keyid ) )
+         {
+           /* here we violate the rfc a bit by still allowing
+            * to import non-exportable signature when we have the
+            * the secret key used to create this signature - it
+            * seems that this makes sense */
+           if(opt.verbose)
+             log_info( _("key %s: non exportable signature"
+                         " (class 0x%02X) - skipped\n"),
+                       keystr(keyid), node->pkt->pkt.signature->sig_class );
+           delete_kbnode( node );
+         }
+       else if( node->pkt->pkttype == PKT_SIGNATURE
+                && node->pkt->pkt.signature->sig_class == 0x20 )  {
+           if( uid_seen )
+             {
+               if(opt.verbose)
+                 log_info( _("key %s: revocation certificate"
+                             " at wrong place - skipped\n"),keystr(keyid));
+               delete_kbnode( node );
+             }
+           else {
+             /* If the revocation cert is from a different key than
+                 the one we're working on don't check it - it's
+                 probably from a revocation key and won't be
+                 verifiable with this key anyway. */
+
+             if(node->pkt->pkt.signature->keyid[0]==keyid[0] &&
+                node->pkt->pkt.signature->keyid[1]==keyid[1])
+               {
+                 int rc = check_key_signature( keyblock, node, NULL);
+                 if( rc )
+                   {
+                     if(opt.verbose)
+                       log_info( _("key %s: invalid revocation"
+                                   " certificate: %s - skipped\n"),
+                                 keystr(keyid), g10_errstr(rc));
+                     delete_kbnode( node );
+                   }
+               }
+           }
+       }
+       else if( node->pkt->pkttype == PKT_SIGNATURE &&
+                (node->pkt->pkt.signature->sig_class == 0x18 ||
+                 node->pkt->pkt.signature->sig_class == 0x28) &&
+                !subkey_seen )
+         {
+           if(opt.verbose)
+             log_info( _("key %s: subkey signature"
+                         " in wrong place - skipped\n"), keystr(keyid));
+           delete_kbnode( node );
+         }
+       else if( node->pkt->pkttype == PKT_SIGNATURE
+                && !IS_CERT(node->pkt->pkt.signature))
+         {
+           if(opt.verbose)
+             log_info(_("key %s: unexpected signature class (0x%02X) -"
+                        " skipped\n"),keystr(keyid),
+                      node->pkt->pkt.signature->sig_class);
+           delete_kbnode(node);
+         }
+       else if( (node->flag & 4) ) /* marked for deletion */
+         delete_kbnode( node );
+    }
+
+    /* note: because keyblock is the public key, it is never marked
+     * for deletion and so keyblock cannot change */
+    commit_kbnode( &keyblock );
+    return nvalid;
+}
+
+
+/****************
+ * It may happen that the imported keyblock has duplicated user IDs.
+ * We check this here and collapse those user IDs together with their
+ * sigs into one.
+ * Returns: True if the keyblock hash changed.
+ */
+int
+collapse_uids( KBNODE *keyblock )
+{
+    KBNODE n, n2;
+    int in_uid;
+    int any=0;
+
+  restart:
+    for( n = *keyblock; n; n = n->next ) {
+       if( n->pkt->pkttype != PKT_USER_ID )
+           continue;
+       for( n2 = n->next; n2; n2 = n2->next ) {
+           if( n2->pkt->pkttype == PKT_USER_ID
+               && !cmp_user_ids( n->pkt->pkt.user_id,
+                                 n2->pkt->pkt.user_id ) ) {
+               /* found a duplicate */
+               any = 1;
+               if( !n2->next
+                   || n2->next->pkt->pkttype == PKT_USER_ID
+                   || n2->next->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                   || n2->next->pkt->pkttype == PKT_SECRET_SUBKEY  ) {
+                   /* no more signatures: delete the user ID
+                    * and start over */
+                   remove_kbnode( keyblock, n2 );
+               }
+               else {
+                   /* The simple approach: Move one signature and
+                    * then start over to delete the next one :-( */
+                   move_kbnode( keyblock, n2->next, n->next );
+               }
+               goto restart;
+           }
+       }
+    }
+    if( !any )
+       return 0;
+
+  restart_sig:
+    /* now we may have duplicate signatures on one user ID: fix this */
+    for( in_uid = 0, n = *keyblock; n; n = n->next ) {
+       if( n->pkt->pkttype == PKT_USER_ID )
+           in_uid = 1;
+       else if( n->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                || n->pkt->pkttype == PKT_SECRET_SUBKEY )
+           in_uid = 0;
+       else if( in_uid ) {
+           n2 = n;
+           do {
+               KBNODE ncmp = NULL;
+               for( ; n2; n2 = n2->next ) {
+                   if(    n2->pkt->pkttype == PKT_USER_ID
+                       || n2->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                       || n2->pkt->pkttype == PKT_SECRET_SUBKEY )
+                       break;
+                   if( n2->pkt->pkttype != PKT_SIGNATURE )
+                       ;
+                   else if( !ncmp )
+                       ncmp = n2;
+                   else if( !cmp_signatures( ncmp->pkt->pkt.signature,
+                                               n2->pkt->pkt.signature )) {
+                       remove_kbnode( keyblock, n2 );
+                       goto restart_sig;
+                   }
+               }
+               n2 = ncmp? ncmp->next : NULL;
+           } while( n2 );
+       }
+    }
+
+    if(!opt.quiet)
+      {
+       const char *key="???";
+
+       if( (n = find_kbnode( *keyblock, PKT_PUBLIC_KEY )) )
+         key=keystr_from_pk(n->pkt->pkt.public_key);
+       else if( (n = find_kbnode( *keyblock, PKT_SECRET_KEY )) )
+         key=keystr_from_sk(n->pkt->pkt.secret_key);
+
+       log_info(_("key %s: duplicated user ID detected - merged\n"),key);
+      }
+
+    return 1;
+}
+
+/* Check for a 0x20 revocation from a revocation key that is not
+   present.  This may be called without the benefit of merge_xxxx so
+   you can't rely on pk->revkey and friends. */
+static void
+revocation_present(KBNODE keyblock)
+{
+  KBNODE onode,inode;
+  PKT_public_key *pk=keyblock->pkt->pkt.public_key;
+
+  for(onode=keyblock->next;onode;onode=onode->next)
+    {
+      /* If we reach user IDs, we're done. */
+      if(onode->pkt->pkttype==PKT_USER_ID)
+       break;
+
+      if(onode->pkt->pkttype==PKT_SIGNATURE &&
+        onode->pkt->pkt.signature->sig_class==0x1F &&
+        onode->pkt->pkt.signature->revkey)
+       {
+         int idx;
+         PKT_signature *sig=onode->pkt->pkt.signature;
+
+         for(idx=0;idx<sig->numrevkeys;idx++)
+           {
+             u32 keyid[2];
+
+             keyid_from_fingerprint(sig->revkey[idx]->fpr,
+                                    MAX_FINGERPRINT_LEN,keyid);
+
+             for(inode=keyblock->next;inode;inode=inode->next)
+               {
+                 /* If we reach user IDs, we're done. */
+                 if(inode->pkt->pkttype==PKT_USER_ID)
+                   break;
+
+                 if(inode->pkt->pkttype==PKT_SIGNATURE &&
+                    inode->pkt->pkt.signature->sig_class==0x20 &&
+                    inode->pkt->pkt.signature->keyid[0]==keyid[0] &&
+                    inode->pkt->pkt.signature->keyid[1]==keyid[1])
+                   {
+                     /* Okay, we have a revocation key, and a
+                         revocation issued by it.  Do we have the key
+                         itself? */
+                     int rc;
+
+                     rc=get_pubkey_byfprint_fast (NULL,sig->revkey[idx]->fpr,
+                                                   MAX_FINGERPRINT_LEN);
+                     if(rc==G10ERR_NO_PUBKEY || rc==G10ERR_UNU_PUBKEY)
+                       {
+                         char *tempkeystr=xstrdup(keystr_from_pk(pk));
+
+                         /* No, so try and get it */
+                         if(opt.keyserver
+                            && (opt.keyserver_options.options
+                                & KEYSERVER_AUTO_KEY_RETRIEVE))
+                           {
+                             log_info(_("WARNING: key %s may be revoked:"
+                                        " fetching revocation key %s\n"),
+                                      tempkeystr,keystr(keyid));
+                             keyserver_import_fprint(sig->revkey[idx]->fpr,
+                                                     MAX_FINGERPRINT_LEN,
+                                                     opt.keyserver);
+
+                             /* Do we have it now? */
+                             rc=get_pubkey_byfprint_fast (NULL,
+                                                    sig->revkey[idx]->fpr,
+                                                    MAX_FINGERPRINT_LEN);
+                           }
+
+                         if(rc==G10ERR_NO_PUBKEY || rc==G10ERR_UNU_PUBKEY)
+                           log_info(_("WARNING: key %s may be revoked:"
+                                      " revocation key %s not present.\n"),
+                                    tempkeystr,keystr(keyid));
+
+                         xfree(tempkeystr);
+                       }
+                   }
+               }
+           }
+       }
+    }
+}
+
+/****************
+ * compare and merge the blocks
+ *
+ * o compare the signatures: If we already have this signature, check
+ *   that they compare okay; if not, issue a warning and ask the user.
+ * o Simply add the signature. Can't verify here because we may not have
+ *   the signature's public key yet; verification is done when putting it
+ *   into the trustdb, which is done automagically as soon as this pubkey
+ *   is used.
+ * Note: We indicate newly inserted packets with flag bit 0
+ */
+static int
+merge_blocks( const char *fname, KBNODE keyblock_orig, KBNODE keyblock,
+             u32 *keyid, int *n_uids, int *n_sigs, int *n_subk )
+{
+    KBNODE onode, node;
+    int rc, found;
+
+    /* 1st: handle revocation certificates */
+    for(node=keyblock->next; node; node=node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID )
+           break;
+       else if( node->pkt->pkttype == PKT_SIGNATURE
+                && node->pkt->pkt.signature->sig_class == 0x20 )  {
+           /* check whether we already have this */
+           found = 0;
+           for(onode=keyblock_orig->next; onode; onode=onode->next ) {
+               if( onode->pkt->pkttype == PKT_USER_ID )
+                   break;
+               else if( onode->pkt->pkttype == PKT_SIGNATURE
+                        && onode->pkt->pkt.signature->sig_class == 0x20
+                        && !cmp_signatures(onode->pkt->pkt.signature,
+                                           node->pkt->pkt.signature))
+                 {
+                   found = 1;
+                   break;
+                 }
+           }
+           if( !found ) {
+               KBNODE n2 = clone_kbnode(node);
+               insert_kbnode( keyblock_orig, n2, 0 );
+               n2->flag |= 1;
+                ++*n_sigs;
+               if(!opt.quiet)
+                 {
+                   char *p=get_user_id_native (keyid);
+                   log_info(_("key %s: \"%s\" revocation"
+                              " certificate added\n"), keystr(keyid),p);
+                   xfree(p);
+                 }
+           }
+       }
+    }
+
+    /* 2nd: merge in any direct key (0x1F) sigs */
+    for(node=keyblock->next; node; node=node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID )
+           break;
+       else if( node->pkt->pkttype == PKT_SIGNATURE
+                && node->pkt->pkt.signature->sig_class == 0x1F )  {
+           /* check whether we already have this */
+           found = 0;
+           for(onode=keyblock_orig->next; onode; onode=onode->next ) {
+               if( onode->pkt->pkttype == PKT_USER_ID )
+                   break;
+               else if( onode->pkt->pkttype == PKT_SIGNATURE
+                        && onode->pkt->pkt.signature->sig_class == 0x1F
+                        && !cmp_signatures(onode->pkt->pkt.signature,
+                                           node->pkt->pkt.signature)) {
+                   found = 1;
+                   break;
+               }
+           }
+           if( !found )
+             {
+               KBNODE n2 = clone_kbnode(node);
+               insert_kbnode( keyblock_orig, n2, 0 );
+               n2->flag |= 1;
+                ++*n_sigs;
+               if(!opt.quiet)
+                 log_info( _("key %s: direct key signature added\n"),
+                           keystr(keyid));
+             }
+       }
+    }
+
+    /* 3rd: try to merge new certificates in */
+    for(onode=keyblock_orig->next; onode; onode=onode->next ) {
+       if( !(onode->flag & 1) && onode->pkt->pkttype == PKT_USER_ID) {
+           /* find the user id in the imported keyblock */
+           for(node=keyblock->next; node; node=node->next )
+               if( node->pkt->pkttype == PKT_USER_ID
+                   && !cmp_user_ids( onode->pkt->pkt.user_id,
+                                         node->pkt->pkt.user_id ) )
+                   break;
+           if( node ) { /* found: merge */
+               rc = merge_sigs( onode, node, n_sigs, fname, keyid );
+               if( rc )
+                   return rc;
+           }
+       }
+    }
+
+    /* 4th: add new user-ids */
+    for(node=keyblock->next; node; node=node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID) {
+           /* do we have this in the original keyblock */
+           for(onode=keyblock_orig->next; onode; onode=onode->next )
+               if( onode->pkt->pkttype == PKT_USER_ID
+                   && !cmp_user_ids( onode->pkt->pkt.user_id,
+                                     node->pkt->pkt.user_id ) )
+                   break;
+           if( !onode ) { /* this is a new user id: append */
+               rc = append_uid( keyblock_orig, node, n_sigs, fname, keyid);
+               if( rc )
+                   return rc;
+               ++*n_uids;
+           }
+       }
+    }
+
+    /* 5th: add new subkeys */
+    for(node=keyblock->next; node; node=node->next ) {
+       onode = NULL;
+       if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+           /* do we have this in the original keyblock? */
+           for(onode=keyblock_orig->next; onode; onode=onode->next )
+               if( onode->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                   && !cmp_public_keys( onode->pkt->pkt.public_key,
+                                        node->pkt->pkt.public_key ) )
+                   break;
+           if( !onode ) { /* this is a new subkey: append */
+               rc = append_key( keyblock_orig, node, n_sigs, fname, keyid);
+               if( rc )
+                   return rc;
+               ++*n_subk;
+           }
+       }
+       else if( node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+           /* do we have this in the original keyblock? */
+           for(onode=keyblock_orig->next; onode; onode=onode->next )
+               if( onode->pkt->pkttype == PKT_SECRET_SUBKEY
+                   && !cmp_secret_keys( onode->pkt->pkt.secret_key,
+                                        node->pkt->pkt.secret_key ) )
+                   break;
+           if( !onode ) { /* this is a new subkey: append */
+               rc = append_key( keyblock_orig, node, n_sigs, fname, keyid);
+               if( rc )
+                   return rc;
+               ++*n_subk;
+           }
+       }
+    }
+
+    /* 6th: merge subkey certificates */
+    for(onode=keyblock_orig->next; onode; onode=onode->next ) {
+       if( !(onode->flag & 1)
+           &&  (   onode->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                || onode->pkt->pkttype == PKT_SECRET_SUBKEY) ) {
+           /* find the subkey in the imported keyblock */
+           for(node=keyblock->next; node; node=node->next ) {
+               if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                   && !cmp_public_keys( onode->pkt->pkt.public_key,
+                                         node->pkt->pkt.public_key ) )
+                   break;
+               else if( node->pkt->pkttype == PKT_SECRET_SUBKEY
+                   && !cmp_secret_keys( onode->pkt->pkt.secret_key,
+                                         node->pkt->pkt.secret_key ) )
+                   break;
+           }
+           if( node ) { /* found: merge */
+               rc = merge_keysigs( onode, node, n_sigs, fname, keyid );
+               if( rc )
+                   return rc;
+           }
+       }
+    }
+
+
+    return 0;
+}
+
+
+/****************
+ * append the userid starting with NODE and all signatures to KEYBLOCK.
+ */
+static int
+append_uid( KBNODE keyblock, KBNODE node, int *n_sigs,
+                                         const char *fname, u32 *keyid )
+{
+    KBNODE n, n_where=NULL;
+
+    assert(node->pkt->pkttype == PKT_USER_ID );
+
+    /* find the position */
+    for( n = keyblock; n; n_where = n, n = n->next ) {
+       if( n->pkt->pkttype == PKT_PUBLIC_SUBKEY
+           || n->pkt->pkttype == PKT_SECRET_SUBKEY )
+           break;
+    }
+    if( !n )
+       n_where = NULL;
+
+    /* and append/insert */
+    while( node ) {
+       /* we add a clone to the original keyblock, because this
+        * one is released first */
+       n = clone_kbnode(node);
+       if( n_where ) {
+           insert_kbnode( n_where, n, 0 );
+           n_where = n;
+       }
+       else
+           add_kbnode( keyblock, n );
+       n->flag |= 1;
+       node->flag |= 1;
+       if( n->pkt->pkttype == PKT_SIGNATURE )
+           ++*n_sigs;
+
+       node = node->next;
+       if( node && node->pkt->pkttype != PKT_SIGNATURE )
+           break;
+    }
+
+    return 0;
+}
+
+
+/****************
+ * Merge the sigs from SRC onto DST. SRC and DST are both a PKT_USER_ID.
+ * (how should we handle comment packets here?)
+ */
+static int
+merge_sigs( KBNODE dst, KBNODE src, int *n_sigs,
+                                   const char *fname, u32 *keyid )
+{
+    KBNODE n, n2;
+    int found=0;
+
+    assert(dst->pkt->pkttype == PKT_USER_ID );
+    assert(src->pkt->pkttype == PKT_USER_ID );
+
+    for(n=src->next; n && n->pkt->pkttype != PKT_USER_ID; n = n->next ) {
+       if( n->pkt->pkttype != PKT_SIGNATURE )
+           continue;
+       if( n->pkt->pkt.signature->sig_class == 0x18
+           || n->pkt->pkt.signature->sig_class == 0x28 )
+           continue; /* skip signatures which are only valid on subkeys */
+       found = 0;
+       for(n2=dst->next; n2 && n2->pkt->pkttype != PKT_USER_ID; n2 = n2->next)
+         if(!cmp_signatures(n->pkt->pkt.signature,n2->pkt->pkt.signature))
+           {
+             found++;
+             break;
+           }
+       if( !found ) {
+           /* This signature is new or newer, append N to DST.
+            * We add a clone to the original keyblock, because this
+            * one is released first */
+           n2 = clone_kbnode(n);
+           insert_kbnode( dst, n2, PKT_SIGNATURE );
+           n2->flag |= 1;
+           n->flag |= 1;
+           ++*n_sigs;
+       }
+    }
+
+    return 0;
+}
+
+/****************
+ * Merge the sigs from SRC onto DST. SRC and DST are both a PKT_xxx_SUBKEY.
+ */
+static int
+merge_keysigs( KBNODE dst, KBNODE src, int *n_sigs,
+                                   const char *fname, u32 *keyid )
+{
+    KBNODE n, n2;
+    int found=0;
+
+    assert(   dst->pkt->pkttype == PKT_PUBLIC_SUBKEY
+          || dst->pkt->pkttype == PKT_SECRET_SUBKEY );
+
+    for(n=src->next; n ; n = n->next ) {
+       if( n->pkt->pkttype == PKT_PUBLIC_SUBKEY
+           || n->pkt->pkttype == PKT_PUBLIC_KEY )
+           break;
+       if( n->pkt->pkttype != PKT_SIGNATURE )
+           continue;
+       found = 0;
+       for(n2=dst->next; n2; n2 = n2->next){
+           if( n2->pkt->pkttype == PKT_PUBLIC_SUBKEY
+               || n2->pkt->pkttype == PKT_PUBLIC_KEY )
+               break;
+           if( n2->pkt->pkttype == PKT_SIGNATURE
+               && n->pkt->pkt.signature->keyid[0]
+                  == n2->pkt->pkt.signature->keyid[0]
+               && n->pkt->pkt.signature->keyid[1]
+                  == n2->pkt->pkt.signature->keyid[1]
+               && n->pkt->pkt.signature->timestamp
+                  <= n2->pkt->pkt.signature->timestamp
+               && n->pkt->pkt.signature->sig_class
+                  == n2->pkt->pkt.signature->sig_class ) {
+               found++;
+               break;
+           }
+       }
+       if( !found ) {
+           /* This signature is new or newer, append N to DST.
+            * We add a clone to the original keyblock, because this
+            * one is released first */
+           n2 = clone_kbnode(n);
+           insert_kbnode( dst, n2, PKT_SIGNATURE );
+           n2->flag |= 1;
+           n->flag |= 1;
+           ++*n_sigs;
+       }
+    }
+
+    return 0;
+}
+
+/****************
+ * append the subkey starting with NODE and all signatures to KEYBLOCK.
+ * Mark all new and copied packets by setting flag bit 0.
+ */
+static int
+append_key( KBNODE keyblock, KBNODE node, int *n_sigs,
+                                         const char *fname, u32 *keyid )
+{
+    KBNODE n;
+
+    assert( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+          || node->pkt->pkttype == PKT_SECRET_SUBKEY );
+
+    while(  node ) {
+       /* we add a clone to the original keyblock, because this
+        * one is released first */
+       n = clone_kbnode(node);
+       add_kbnode( keyblock, n );
+       n->flag |= 1;
+       node->flag |= 1;
+       if( n->pkt->pkttype == PKT_SIGNATURE )
+           ++*n_sigs;
+
+       node = node->next;
+       if( node && node->pkt->pkttype != PKT_SIGNATURE )
+           break;
+    }
+
+    return 0;
+}
+
+
+
+/* Walk a public keyblock and produce a secret keyblock out of it.
+   Instead of inserting the secret key parameters (which we don't
+   have), we insert a stub.  */
+static KBNODE
+pub_to_sec_keyblock (KBNODE pub_keyblock)
+{
+  KBNODE pubnode, secnode;
+  KBNODE sec_keyblock = NULL;
+  KBNODE walkctx = NULL;
+
+  while((pubnode = walk_kbnode (pub_keyblock,&walkctx,0)))
+    {
+      if (pubnode->pkt->pkttype == PKT_PUBLIC_KEY
+          || pubnode->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+       {
+         /* Make a secret key.  We only need to convert enough to
+            write the keyblock out. */
+         PKT_public_key *pk = pubnode->pkt->pkt.public_key;
+         PACKET *pkt = xmalloc_clear (sizeof *pkt);
+         PKT_secret_key *sk = xmalloc_clear (sizeof *sk);
+          int i, n;
+          
+          if (pubnode->pkt->pkttype == PKT_PUBLIC_KEY)
+           pkt->pkttype = PKT_SECRET_KEY;
+         else
+           pkt->pkttype = PKT_SECRET_SUBKEY;
+          
+         pkt->pkt.secret_key = sk;
+
+          copy_public_parts_to_secret_key ( pk, sk );
+         sk->version     = pk->version;
+         sk->timestamp   = pk->timestamp;
+        
+          n = pubkey_get_npkey (pk->pubkey_algo);
+          if (!n)
+            n = 1; /* Unknown number of parameters, however the data
+                      is stored in the first mpi. */
+          for (i=0; i < n; i++ )
+            sk->skey[i] = mpi_copy (pk->pkey[i]);
+  
+          sk->is_protected = 1;
+          sk->protect.s2k.mode = 1001;
+  
+         secnode = new_kbnode (pkt);
+        }
+      else
+       {
+         secnode = clone_kbnode (pubnode);
+       }
+      
+      if(!sec_keyblock)
+       sec_keyblock = secnode;
+      else
+       add_kbnode (sec_keyblock, secnode);
+    }
+
+  return sec_keyblock;
+}
+
+
+/* Walk over the secret keyring SEC_KEYBLOCK and update any simple
+   stub keys with the serial number SNNUM of the card if one of the
+   fingerprints FPR1, FPR2 or FPR3 match.  Print a note if the key is
+   a duplicate (may happen in case of backed uped keys). 
+   
+   Returns: True if anything changed.
+*/
+static int
+update_sec_keyblock_with_cardinfo (KBNODE sec_keyblock, 
+                                   const unsigned char *fpr1,
+                                   const unsigned char *fpr2,
+                                   const unsigned char *fpr3,
+                                   const char *serialnostr)
+{
+  KBNODE node;
+  KBNODE walkctx = NULL;
+  PKT_secret_key *sk;
+  byte array[MAX_FINGERPRINT_LEN];
+  size_t n;
+  int result = 0;
+  const char *s;
+
+  while((node = walk_kbnode (sec_keyblock, &walkctx, 0)))
+    {
+      if (node->pkt->pkttype != PKT_SECRET_KEY
+          && node->pkt->pkttype != PKT_SECRET_SUBKEY)
+        continue;
+      sk = node->pkt->pkt.secret_key;
+      
+      fingerprint_from_sk (sk, array, &n);
+      if (n != 20)
+        continue; /* Can't be a card key.  */
+      if ( !((fpr1 && !memcmp (array, fpr1, 20))
+             || (fpr2 && !memcmp (array, fpr2, 20))
+             || (fpr3 && !memcmp (array, fpr3, 20))) )
+        continue;  /* No match.  */
+
+      if (sk->is_protected == 1 && sk->protect.s2k.mode == 1001)
+        {
+          /* Standard case: migrate that stub to a key stub.  */
+          sk->protect.s2k.mode = 1002;
+          s = serialnostr;
+          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);
+          result = 1;
+        }
+      else if (sk->is_protected == 1 && sk->protect.s2k.mode == 1002)
+        {
+          s = serialnostr;
+          for (sk->protect.ivlen=0; sk->protect.ivlen < 16 && *s && s[1];
+               sk->protect.ivlen++, s += 2)
+            if (sk->protect.iv[sk->protect.ivlen] != xtoi_2 (s))
+              {
+                log_info (_("NOTE: a key's S/N does not "
+                            "match the card's one\n"));
+                break;
+              }
+        }
+      else
+        {
+          if (node->pkt->pkttype != PKT_SECRET_KEY)
+            log_info (_("NOTE: primary key is online and stored on card\n"));
+          else
+            log_info (_("NOTE: secondary key is online and stored on card\n"));
+        }
+    }
+
+  return result;
+}
+
+
+
+/* Check whether a secret key stub exists for the public key PK.  If
+   not create such a stub key and store it into the secring.  If it
+   exists, add appropriate subkey stubs and update the secring.
+   Return 0 if the key could be created. */
+int
+auto_create_card_key_stub ( const char *serialnostr, 
+                            const unsigned char *fpr1,
+                            const unsigned char *fpr2,
+                            const unsigned char *fpr3)
+{
+  KBNODE pub_keyblock;
+  KBNODE sec_keyblock;
+  KEYDB_HANDLE hd;
+  int rc;
+
+  /* We only want to do this for an OpenPGP card.  */
+  if (!serialnostr || strncmp (serialnostr, "D27600012401", 12) 
+      || strlen (serialnostr) != 32 )
+    return G10ERR_GENERAL;
+
+  /* First get the public keyring from any of the provided fingerprints. */
+  if ( (fpr1 && !get_keyblock_byfprint (&pub_keyblock, fpr1, 20))
+       || (fpr2 && !get_keyblock_byfprint (&pub_keyblock, fpr2, 20))
+       || (fpr3 && !get_keyblock_byfprint (&pub_keyblock, fpr3, 20)))
+    ;
+  else
+    return G10ERR_GENERAL;
+  hd = keydb_new (1);
+
+  /* Now check whether there is a secret keyring.  */
+  {
+    PKT_public_key *pk = pub_keyblock->pkt->pkt.public_key;
+    byte afp[MAX_FINGERPRINT_LEN];
+    size_t an;
+
+    fingerprint_from_pk (pk, afp, &an);
+    memset (afp, 0, MAX_FINGERPRINT_LEN);
+    rc = keydb_search_fpr (hd, afp);
+  }
+
+  if (!rc)
+    {
+      rc = keydb_get_keyblock (hd, &sec_keyblock);
+      if (rc)
+        {
+          log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+          rc = G10ERR_GENERAL;
+        }
+      else
+        {
+          merge_keys_and_selfsig (sec_keyblock);
+          
+          /* FIXME: We need to add new subkeys first.  */
+          if (update_sec_keyblock_with_cardinfo (sec_keyblock,
+                                                 fpr1, fpr2, fpr3,
+                                                 serialnostr))
+            {
+              rc = keydb_update_keyblock (hd, sec_keyblock );
+              if (rc)
+                log_error (_("error writing keyring `%s': %s\n"),
+                           keydb_get_resource_name (hd), g10_errstr(rc) );
+            }
+        }
+    }
+  else  /* A secret key does not exists - create it.  */
+    {
+      sec_keyblock = pub_to_sec_keyblock (pub_keyblock);
+      update_sec_keyblock_with_cardinfo (sec_keyblock,
+                                         fpr1, fpr2, fpr3,
+                                         serialnostr);
+
+      rc = keydb_locate_writable (hd, NULL);
+      if (rc)
+        {
+          log_error (_("no default secret keyring: %s\n"), g10_errstr (rc));
+          rc = G10ERR_GENERAL;
+        }
+      else
+        {
+          rc = keydb_insert_keyblock (hd, sec_keyblock );
+          if (rc)
+            log_error (_("error writing keyring `%s': %s\n"),
+                       keydb_get_resource_name (hd), g10_errstr(rc) );
+        }
+    }
+    
+  release_kbnode (sec_keyblock);
+  release_kbnode (pub_keyblock);
+  keydb_release (hd);
+  return rc;
+}
+
diff --git a/g10/iso7816.c b/g10/iso7816.c
new file mode 100644 (file)
index 0000000..35d0aa9
--- /dev/null
@@ -0,0 +1,685 @@
+/* iso7816.c - ISO 7816 commands
+ *     Copyright (C) 2003, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * $Id: iso7816.c 3886 2005-09-07 17:05:42Z wk $
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(GNUPG_SCD_MAIN_HEADER)
+#include GNUPG_SCD_MAIN_HEADER
+#elif GNUPG_MAJOR_VERSION == 1
+/* This is used with GnuPG version < 1.9.  The code has been source
+   copied from the current GnuPG >= 1.9  and is maintained over
+   there. */
+#include "options.h"
+#include "errors.h"
+#include "memory.h"
+#include "util.h"
+#include "i18n.h"
+#else /* GNUPG_MAJOR_VERSION != 1 */
+#include "scdaemon.h"
+#endif /* GNUPG_MAJOR_VERSION != 1 */
+
+#include "iso7816.h"
+#include "apdu.h"
+
+
+#define CMD_SELECT_FILE 0xA4
+#define CMD_VERIFY      0x20
+#define CMD_CHANGE_REFERENCE_DATA 0x24
+#define CMD_RESET_RETRY_COUNTER   0x2C
+#define CMD_GET_DATA    0xCA
+#define CMD_PUT_DATA    0xDA
+#define CMD_MSE         0x22
+#define CMD_PSO         0x2A
+#define CMD_INTERNAL_AUTHENTICATE 0x88
+#define CMD_GENERATE_KEYPAIR      0x47
+#define CMD_GET_CHALLENGE         0x84
+#define CMD_READ_BINARY 0xB0
+#define CMD_READ_RECORD 0xB2
+
+static gpg_error_t
+map_sw (int sw)
+{
+  gpg_err_code_t ec;
+
+  switch (sw)
+    {
+    case SW_EEPROM_FAILURE: ec = GPG_ERR_HARDWARE; break;
+    case SW_WRONG_LENGTH:   ec = GPG_ERR_INV_VALUE; break;
+    case SW_CHV_WRONG:      ec = GPG_ERR_BAD_PIN; break;
+    case SW_CHV_BLOCKED:    ec = GPG_ERR_PIN_BLOCKED; break;
+    case SW_USE_CONDITIONS: ec = GPG_ERR_USE_CONDITIONS; break;
+    case SW_NOT_SUPPORTED:  ec = GPG_ERR_NOT_SUPPORTED; break;
+    case SW_BAD_PARAMETER:  ec = GPG_ERR_INV_VALUE; break;
+    case SW_FILE_NOT_FOUND: ec = GPG_ERR_ENOENT; break;
+    case SW_RECORD_NOT_FOUND:ec= GPG_ERR_NOT_FOUND; break;
+    case SW_REF_NOT_FOUND:  ec = GPG_ERR_NO_OBJ; break;
+    case SW_BAD_P0_P1:      ec = GPG_ERR_INV_VALUE; break;
+    case SW_EXACT_LENGTH:   ec = GPG_ERR_INV_VALUE; break;
+    case SW_INS_NOT_SUP:    ec = GPG_ERR_CARD; break;
+    case SW_CLA_NOT_SUP:    ec = GPG_ERR_CARD; break;
+    case SW_SUCCESS:        ec = 0; break;
+
+    case SW_HOST_OUT_OF_CORE: ec = GPG_ERR_ENOMEM; break;
+    case SW_HOST_INV_VALUE:   ec = GPG_ERR_INV_VALUE; break;
+    case SW_HOST_INCOMPLETE_CARD_RESPONSE: ec = GPG_ERR_CARD; break;
+    case SW_HOST_NOT_SUPPORTED: ec = GPG_ERR_NOT_SUPPORTED; break;
+    case SW_HOST_LOCKING_FAILED: ec = GPG_ERR_BUG; break;
+    case SW_HOST_BUSY:           ec = GPG_ERR_EBUSY; break;
+    case SW_HOST_NO_CARD:        ec = GPG_ERR_CARD_NOT_PRESENT; break;
+    case SW_HOST_CARD_INACTIVE:  ec = GPG_ERR_CARD_RESET; break;
+    case SW_HOST_CARD_IO_ERROR:  ec = GPG_ERR_EIO; break;
+    case SW_HOST_GENERAL_ERROR:  ec = GPG_ERR_GENERAL; break;
+    case SW_HOST_NO_READER:      ec = GPG_ERR_ENODEV; break;
+    case SW_HOST_ABORTED:        ec = GPG_ERR_CANCELED; break;
+
+    default:
+      if ((sw & 0x010000))
+        ec = GPG_ERR_GENERAL; /* Should not happen. */
+      else if ((sw & 0xff00) == SW_MORE_DATA)
+        ec = 0; /* This should actually never been seen here. */
+      else
+        ec = GPG_ERR_CARD;
+    }
+  return gpg_error (ec);
+}
+
+/* Map a status word from the APDU layer to a gpg-error code.  */
+gpg_error_t
+iso7816_map_sw (int sw)
+{
+  /* All APDU functions should return 0x9000 on success but for
+     historical reasons of the implementation some return 0 to
+     indicate success.  We allow for that here. */
+  return sw? map_sw (sw) : 0;
+}
+
+
+/* This function is specialized version of the SELECT FILE command.
+   SLOT is the card and reader as created for example by
+   apdu_open_reader (), AID is a buffer of size AIDLEN holding the
+   requested application ID.  The function can't be used to enumerate
+   AIDs and won't return the AID on success.  The return value is 0
+   for okay or a GPG error code.  Note that ISO error codes are
+   internally mapped. */
+gpg_error_t
+iso7816_select_application (int slot, const char *aid, size_t aidlen)
+{
+  int sw;
+  sw = apdu_send_simple (slot, 0x00, CMD_SELECT_FILE, 4, 0, aidlen, aid);
+  return map_sw (sw);
+}
+
+
+gpg_error_t
+iso7816_select_file (int slot, int tag, int is_dir,
+                     unsigned char **result, size_t *resultlen)
+{
+  int sw, p0, p1;
+  unsigned char tagbuf[2];
+
+  tagbuf[0] = (tag >> 8) & 0xff;
+  tagbuf[1] = tag & 0xff;
+
+  if (result || resultlen)
+    {
+      *result = NULL;
+      *resultlen = 0;
+      return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+    }
+  else
+    {
+      p0 = (tag == 0x3F00)? 0: is_dir? 1:2;
+      p1 = 0x0c; /* No FC return. */
+      sw = apdu_send_simple (slot, 0x00, CMD_SELECT_FILE,
+                             p0, p1, 2, (char*)tagbuf );
+      return map_sw (sw);
+    }
+
+  return 0;
+}
+
+
+/* Do a select file command with a direct path. */
+gpg_error_t
+iso7816_select_path (int slot, const unsigned short *path, size_t pathlen,
+                     unsigned char **result, size_t *resultlen)
+{
+  int sw, p0, p1;
+  unsigned char buffer[100];
+  int buflen;
+  
+  if (result || resultlen)
+    {
+      *result = NULL;
+      *resultlen = 0;
+      return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+    }
+  
+  if (pathlen/2 >= sizeof buffer)
+    return gpg_error (GPG_ERR_TOO_LARGE);
+  
+  for (buflen = 0; pathlen; pathlen--, path++)
+    {
+      buffer[buflen++] = (*path >> 8);
+      buffer[buflen++] = *path;
+    }
+
+  p0 = 0x08;
+  p1 = 0x0c; /* No FC return. */
+  sw = apdu_send_simple (slot, 0x00, CMD_SELECT_FILE,
+                         p0, p1, buflen, (char*)buffer );
+  return map_sw (sw);
+}
+
+
+/* This is a private command currently only working for TCOS cards. */
+gpg_error_t
+iso7816_list_directory (int slot, int list_dirs,
+                        unsigned char **result, size_t *resultlen)
+{
+  int sw;
+
+  if (!result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  sw = apdu_send (slot, 0x80, 0xAA, list_dirs? 1:2, 0, -1, NULL,
+                  result, resultlen);
+  if (sw != SW_SUCCESS)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+    }
+  return map_sw (sw);
+}
+
+
+
+/* Perform a VERIFY command on SLOT using the card holder verification
+   vector CHVNO with a CHV of lenght CHVLEN.  Returns 0 on success. */
+gpg_error_t
+iso7816_verify (int slot, int chvno, const char *chv, size_t chvlen)
+{
+  int sw;
+
+  sw = apdu_send_simple (slot, 0x00, CMD_VERIFY, 0, chvno, chvlen, chv);
+  return map_sw (sw);
+}
+
+/* Perform a CHANGE_REFERENCE_DATA command on SLOT for the card holder
+   verification vector CHVNO.  If the OLDCHV is NULL (and OLDCHVLEN
+   0), a "change reference data" is done, otherwise an "exchange
+   reference data".  The new reference data is expected in NEWCHV of
+   length NEWCHVLEN.  */
+gpg_error_t
+iso7816_change_reference_data (int slot, int chvno,
+                               const char *oldchv, size_t oldchvlen,
+                               const char *newchv, size_t newchvlen)
+{
+  int sw;
+  char *buf;
+
+  if ((!oldchv && oldchvlen)
+      || (oldchv && !oldchvlen)
+      || !newchv || !newchvlen )
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  buf = xtrymalloc (oldchvlen + newchvlen);
+  if (!buf)
+    return gpg_error (gpg_err_code_from_errno (errno));
+  if (oldchvlen)
+    memcpy (buf, oldchv, oldchvlen);
+  memcpy (buf+oldchvlen, newchv, newchvlen);
+
+  sw = apdu_send_simple (slot, 0x00, CMD_CHANGE_REFERENCE_DATA,
+                         oldchvlen? 0 : 1, chvno, oldchvlen+newchvlen, buf);
+  xfree (buf);
+  return map_sw (sw);
+
+}
+
+gpg_error_t
+iso7816_reset_retry_counter (int slot, int chvno,
+                             const char *newchv, size_t newchvlen)
+{
+  int sw;
+
+  if (!newchv || !newchvlen )
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  sw = apdu_send_simple (slot, 0x00, CMD_RESET_RETRY_COUNTER,
+                         2, chvno, newchvlen, newchv);
+  return map_sw (sw);
+}
+
+
+/* Perform a GET DATA command requesting TAG and storing the result in
+   a newly allocated buffer at the address passed by RESULT.  Return
+   the length of this data at the address of RESULTLEN. */
+gpg_error_t
+iso7816_get_data (int slot, int tag,
+                  unsigned char **result, size_t *resultlen)
+{
+  int sw;
+
+  if (!result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  sw = apdu_send (slot, 0x00, CMD_GET_DATA,
+                  ((tag >> 8) & 0xff), (tag & 0xff), -1, NULL,
+                  result, resultlen);
+  if (sw != SW_SUCCESS)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+      return map_sw (sw);
+    }
+
+  return 0;
+}
+
+
+/* Perform a PUT DATA command on card in SLOT.  Write DATA of length
+   DATALEN to TAG. */
+gpg_error_t
+iso7816_put_data (int slot, int tag,
+                  const unsigned char *data, size_t datalen)
+{
+  int sw;
+
+  sw = apdu_send_simple (slot, 0x00, CMD_PUT_DATA,
+                         ((tag >> 8) & 0xff), (tag & 0xff),
+                         datalen, (const char*)data);
+  return map_sw (sw);
+}
+
+/* Manage Security Environment.  This is a weird operation and there
+   is no easy abstraction for it.  Furthermore, some card seem to have
+   a different interpreation of 7816-8 and thus we resort to let the
+   caller decide what to do. */
+gpg_error_t
+iso7816_manage_security_env (int slot, int p1, int p2,
+                             const unsigned char *data, size_t datalen)
+{
+  int sw;
+
+  if (p1 < 0 || p1 > 255 || p2 < 0 || p2 > 255 )
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  sw = apdu_send_simple (slot, 0x00, CMD_MSE, p1, p2, 
+                         data? datalen : -1, (const char*)data);
+  return map_sw (sw);
+}
+
+
+/* Perform the security operation COMPUTE DIGITAL SIGANTURE.  On
+   success 0 is returned and the data is availavle in a newly
+   allocated buffer stored at RESULT with its length stored at
+   RESULTLEN. */
+gpg_error_t
+iso7816_compute_ds (int slot, const unsigned char *data, size_t datalen,
+                    unsigned char **result, size_t *resultlen)
+{
+  int sw;
+
+  if (!data || !datalen || !result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  sw = apdu_send (slot, 0x00, CMD_PSO, 0x9E, 0x9A, datalen, (const char*)data,
+                  result, resultlen);
+  if (sw != SW_SUCCESS)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+      return map_sw (sw);
+    }
+
+  return 0;
+}
+
+
+/* Perform the security operation DECIPHER.  PADIND is the padding
+   indicator to be used.  It should be 0 if no padding is required, a
+   value of -1 suppresses the padding byte.  On success 0 is returned
+   and the plaintext is available in a newly allocated buffer stored
+   at RESULT with its length stored at RESULTLEN. */
+gpg_error_t
+iso7816_decipher (int slot, const unsigned char *data, size_t datalen,
+                  int padind, unsigned char **result, size_t *resultlen)
+{
+  int sw;
+  unsigned char *buf;
+
+  if (!data || !datalen || !result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  if (padind >= 0)
+    {
+      /* We need to prepend the padding indicator. */
+      buf = xtrymalloc (datalen + 1);
+      if (!buf)
+        return gpg_error (gpg_err_code_from_errno (errno));
+
+      *buf = padind; /* Padding indicator. */
+      memcpy (buf+1, data, datalen);
+      sw = apdu_send (slot, 0x00, CMD_PSO, 0x80, 0x86,
+                      datalen+1, (char*)buf,
+                      result, resultlen);
+      xfree (buf);
+    }
+  else
+    {
+      sw = apdu_send (slot, 0x00, CMD_PSO, 0x80, 0x86,
+                      datalen, (const char *)data,
+                      result, resultlen);
+    }
+  if (sw != SW_SUCCESS)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+      return map_sw (sw);
+    }
+
+  return 0;
+}
+
+
+gpg_error_t
+iso7816_internal_authenticate (int slot,
+                               const unsigned char *data, size_t datalen,
+                               unsigned char **result, size_t *resultlen)
+{
+  int sw;
+
+  if (!data || !datalen || !result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  sw = apdu_send (slot, 0x00, CMD_INTERNAL_AUTHENTICATE, 0, 0,
+                  datalen, (const char*)data,  result, resultlen);
+  if (sw != SW_SUCCESS)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+      return map_sw (sw);
+    }
+
+  return 0;
+}
+
+
+static gpg_error_t
+do_generate_keypair (int slot, int readonly,
+                  const unsigned char *data, size_t datalen,
+                  unsigned char **result, size_t *resultlen)
+{
+  int sw;
+
+  if (!data || !datalen || !result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  sw = apdu_send (slot, 0x00, CMD_GENERATE_KEYPAIR, readonly? 0x81:0x80, 0,
+                  datalen, (const char*)data,  result, resultlen);
+  if (sw != SW_SUCCESS)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+      return map_sw (sw);
+    }
+
+  return 0;
+}
+
+
+gpg_error_t
+iso7816_generate_keypair (int slot,
+                          const unsigned char *data, size_t datalen,
+                          unsigned char **result, size_t *resultlen)
+{
+  return do_generate_keypair (slot, 0, data, datalen, result, resultlen);
+}
+
+
+gpg_error_t
+iso7816_read_public_key (int slot,
+                          const unsigned char *data, size_t datalen,
+                          unsigned char **result, size_t *resultlen)
+{
+  return do_generate_keypair (slot, 1, data, datalen, result, resultlen);
+}
+
+
+
+gpg_error_t
+iso7816_get_challenge (int slot, int length, unsigned char *buffer)
+{
+  int sw;
+  unsigned char *result;
+  size_t resultlen, n;
+
+  if (!buffer || length < 1)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  do
+    {
+      result = NULL;
+      n = length > 254? 254 : length;
+      sw = apdu_send_le (slot, 0x00, CMD_GET_CHALLENGE, 0, 0, -1, NULL,
+                         n,
+                         &result, &resultlen);
+      if (sw != SW_SUCCESS)
+        {
+          /* Make sure that pending buffers are released. */
+          xfree (result);
+          return map_sw (sw);
+        }
+      if (resultlen > n)
+        resultlen = n;
+      memcpy (buffer, result, resultlen);
+      buffer += resultlen;
+      length -= resultlen;
+      xfree (result);
+    }
+  while (length > 0);
+
+  return 0;
+}
+
+/* Perform a READ BINARY command requesting a maximum of NMAX bytes
+   from OFFSET.  With NMAX = 0 the entire file is read. The result is
+   stored in a newly allocated buffer at the address passed by RESULT.
+   Returns the length of this data at the address of RESULTLEN. */
+gpg_error_t
+iso7816_read_binary (int slot, size_t offset, size_t nmax,
+                     unsigned char **result, size_t *resultlen)
+{
+  int sw;
+  unsigned char *buffer;
+  size_t bufferlen;
+  int read_all = !nmax;
+  size_t n;
+
+  if (!result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  /* We can only encode 15 bits in p0,p1 to indicate an offset. Thus
+     we check for this limit. */
+  if (offset > 32767)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  do
+    {
+      buffer = NULL;
+      bufferlen = 0;
+      /* Note, that we to set N to 254 due to problems either with the
+         ccid driver or some TCOS cards.  It actually should be 0
+         which is the official ISO value to read a variable length
+         object. */
+      if (read_all || nmax > 254)
+        n = 254;
+      else
+        n = nmax;
+      sw = apdu_send_le (slot, 0x00, CMD_READ_BINARY,
+                         ((offset>>8) & 0xff), (offset & 0xff) , -1, NULL,
+                         n, &buffer, &bufferlen);
+      if ( SW_EXACT_LENGTH_P(sw) )
+        {
+          n = (sw & 0x00ff);
+          sw = apdu_send_le (slot, 0x00, CMD_READ_BINARY,
+                             ((offset>>8) & 0xff), (offset & 0xff) , -1, NULL,
+                             n, &buffer, &bufferlen);
+        }
+
+      if (*result && sw == SW_BAD_P0_P1)
+        {
+          /* Bad Parameter means that the offset is outside of the
+             EF. When reading all data we take this as an indication
+             for EOF.  */
+          break;
+        }
+
+      if (sw != SW_SUCCESS && sw != SW_EOF_REACHED)
+        {
+          /* Make sure that pending buffers are released. */
+          xfree (buffer);
+          xfree (*result);
+          *result = NULL;
+          *resultlen = 0;
+          return map_sw (sw);
+        }
+      if (*result) /* Need to extend the buffer. */
+        {
+          unsigned char *p = xtryrealloc (*result, *resultlen + bufferlen);
+          if (!p)
+            {
+              gpg_error_t err = gpg_error_from_errno (errno);
+              xfree (buffer);
+              xfree (*result);
+              *result = NULL;
+              *resultlen = 0;
+              return err;
+            }
+          *result = p;
+          memcpy (*result + *resultlen, buffer, bufferlen);
+          *resultlen += bufferlen;
+          xfree (buffer);
+          buffer = NULL;
+        }
+      else /* Transfer the buffer into our result. */
+        {
+          *result = buffer;
+          *resultlen = bufferlen;
+        }
+      offset += bufferlen;
+      if (offset > 32767)
+        break; /* We simply truncate the result for too large
+                  files. */
+      if (nmax > bufferlen)
+        nmax -= bufferlen;
+      else
+        nmax = 0;
+    }
+  while ((read_all && sw != SW_EOF_REACHED) || (!read_all && nmax));
+  
+  return 0;
+}
+
+/* Perform a READ RECORD command. RECNO gives the record number to
+   read with 0 indicating the current record.  RECCOUNT must be 1 (not
+   all cards support reading of more than one record).  SHORT_EF
+   should be 0 to read the current EF or contain a short EF. The
+   result is stored in a newly allocated buffer at the address passed
+   by RESULT.  Returns the length of this data at the address of
+   RESULTLEN. */
+gpg_error_t
+iso7816_read_record (int slot, int recno, int reccount, int short_ef,
+                     unsigned char **result, size_t *resultlen)
+{
+  int sw;
+  unsigned char *buffer;
+  size_t bufferlen;
+
+  if (!result || !resultlen)
+    return gpg_error (GPG_ERR_INV_VALUE);
+  *result = NULL;
+  *resultlen = 0;
+
+  /* We can only encode 15 bits in p0,p1 to indicate an offset. Thus
+     we check for this limit. */
+  if (recno < 0 || recno > 255 || reccount != 1
+      || short_ef < 0 || short_ef > 254 )
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  buffer = NULL;
+  bufferlen = 0;
+  /* Fixme: Either the ccid driver or the TCOS cards have problems
+     with an Le of 0. */
+  sw = apdu_send_le (slot, 0x00, CMD_READ_RECORD,
+                     recno, 
+                     short_ef? short_ef : 0x04,
+                     -1, NULL,
+                     254, &buffer, &bufferlen);
+
+  if (sw != SW_SUCCESS && sw != SW_EOF_REACHED)
+    {
+      /* Make sure that pending buffers are released. */
+      xfree (buffer);
+      xfree (*result);
+      *result = NULL;
+      *resultlen = 0;
+      return map_sw (sw);
+    }
+  *result = buffer;
+  *resultlen = bufferlen;
+  
+  return 0;
+}
+
diff --git a/g10/iso7816.h b/g10/iso7816.h
new file mode 100644 (file)
index 0000000..c2e742a
--- /dev/null
@@ -0,0 +1,81 @@
+/* iso7816.h - ISO 7816 commands
+ *     Copyright (C) 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * $Id: iso7816.h 3886 2005-09-07 17:05:42Z wk $
+ */
+
+#ifndef ISO7816_H
+#define ISO7816_H
+
+#if GNUPG_MAJOR_VERSION == 1
+#include "cardglue.h"
+#endif
+
+gpg_error_t iso7816_map_sw (int sw);
+
+gpg_error_t iso7816_select_application (int slot,
+                                        const char *aid, size_t aidlen);
+gpg_error_t iso7816_select_file (int slot, int tag, int is_dir,
+                                 unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_select_path (int slot,
+                                 const unsigned short *path, size_t pathlen,
+                                 unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_list_directory (int slot, int list_dirs,
+                                    unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_verify (int slot,
+                            int chvno, const char *chv, size_t chvlen);
+gpg_error_t iso7816_change_reference_data (int slot, int chvno,
+                               const char *oldchv, size_t oldchvlen,
+                               const char *newchv, size_t newchvlen);
+gpg_error_t iso7816_reset_retry_counter (int slot, int chvno,
+                                         const char *newchv, size_t newchvlen);
+gpg_error_t iso7816_get_data (int slot, int tag,
+                              unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_put_data (int slot, int tag,
+                              const unsigned char *data, size_t datalen);
+gpg_error_t iso7816_manage_security_env (int slot, int p1, int p2,
+                                         const unsigned char *data,
+                                         size_t datalen);
+gpg_error_t iso7816_compute_ds (int slot,
+                                const unsigned char *data, size_t datalen,
+                                unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_decipher (int slot,
+                              const unsigned char *data, size_t datalen,
+                              int padind,
+                              unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_internal_authenticate (int slot,
+                                   const unsigned char *data, size_t datalen,
+                                   unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_generate_keypair (int slot,
+                                   const unsigned char *data, size_t datalen,
+                                   unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_read_public_key (int slot,
+                                   const unsigned char *data, size_t datalen,
+                                   unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_get_challenge (int slot,
+                                   int length, unsigned char *buffer);
+
+gpg_error_t iso7816_read_binary (int slot, size_t offset, size_t nmax,
+                                 unsigned char **result, size_t *resultlen);
+gpg_error_t iso7816_read_record (int slot, int recno, int reccount,
+                                 int short_ef,
+                                 unsigned char **result, size_t *resultlen);
+
+#endif /*ISO7816_H*/
diff --git a/g10/kbnode.c b/g10/kbnode.c
new file mode 100644 (file)
index 0000000..9038f5b
--- /dev/null
@@ -0,0 +1,399 @@
+/* kbnode.c -  keyblock node utility functions
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "packet.h"
+#include "keydb.h"
+
+#define USE_UNUSED_NODES 1
+
+static KBNODE unused_nodes;
+
+static KBNODE
+alloc_node(void)
+{
+    KBNODE n;
+
+    n = unused_nodes;
+    if( n )
+       unused_nodes = n->next;
+    else
+       n = xmalloc( sizeof *n );
+    n->next = NULL;
+    n->pkt = NULL;
+    n->flag = 0;
+    n->private_flag=0;
+    n->recno = 0;
+    return n;
+}
+
+static void
+free_node( KBNODE n )
+{
+    if( n ) {
+#if USE_UNUSED_NODES
+       n->next = unused_nodes;
+       unused_nodes = n;
+#else
+       xfree( n );
+#endif
+    }
+}
+
+
+
+KBNODE
+new_kbnode( PACKET *pkt )
+{
+    KBNODE n = alloc_node();
+    n->pkt = pkt;
+    return n;
+}
+
+
+KBNODE
+clone_kbnode( KBNODE node )
+{
+    KBNODE n = alloc_node();
+
+    n->pkt = node->pkt;
+    n->private_flag = node->private_flag | 2; /* mark cloned */
+    return n;
+}
+
+
+void
+release_kbnode( KBNODE n )
+{
+    KBNODE n2;
+
+    while( n ) {
+       n2 = n->next;
+       if( !is_cloned_kbnode(n) ) {
+           free_packet( n->pkt );
+           xfree( n->pkt );
+       }
+       free_node( n );
+       n = n2;
+    }
+}
+
+
+/****************
+ * Delete NODE.
+ * Note: This only works with walk_kbnode!!
+ */
+void
+delete_kbnode( KBNODE node )
+{
+    node->private_flag |= 1;
+}
+
+/****************
+ * Append NODE to ROOT.  ROOT must exist!
+ */
+void
+add_kbnode( KBNODE root, KBNODE node )
+{
+    KBNODE n1;
+
+    for(n1=root; n1->next; n1 = n1->next)
+       ;
+    n1->next = node;
+}
+
+/****************
+ * Insert NODE into the list after root but before a packet which is not of
+ * type PKTTYPE
+ * (only if PKTTYPE != 0)
+ */
+void
+insert_kbnode( KBNODE root, KBNODE node, int pkttype )
+{
+    if( !pkttype ) {
+       node->next = root->next;
+       root->next = node;
+    }
+    else {
+       KBNODE n1;
+
+       for(n1=root; n1->next;  n1 = n1->next)
+           if( pkttype != n1->next->pkt->pkttype ) {
+               node->next = n1->next;
+               n1->next = node;
+               return;
+           }
+       /* no such packet, append */
+       node->next = NULL;
+       n1->next = node;
+    }
+}
+
+
+/****************
+ * Find the previous node (if PKTTYPE = 0) or the previous node
+ * with pkttype PKTTYPE in the list starting with ROOT of NODE.
+ */
+KBNODE
+find_prev_kbnode( KBNODE root, KBNODE node, int pkttype )
+{
+    KBNODE n1;
+
+    for (n1=NULL; root && root != node; root = root->next ) {
+        if (!pkttype ||root->pkt->pkttype == pkttype)
+            n1 = root;
+    }
+    return n1;
+}
+
+/****************
+ * Ditto, but find the next packet.  The behaviour is trivial if
+ * PKTTYPE is 0 but if it is specified, the next node with a packet
+ * of this type is returned.  The function has some knowledge about
+ * the valid ordering of packets: e.g. if the next signature packet
+ * is requested, the function will not return one if it encounters
+ * a user-id.
+ */
+KBNODE
+find_next_kbnode( KBNODE node, int pkttype )
+{
+    for( node=node->next ; node; node = node->next ) {
+       if( !pkttype )
+           return node;
+       else if( pkttype == PKT_USER_ID 
+                && (   node->pkt->pkttype == PKT_PUBLIC_KEY
+                    || node->pkt->pkttype == PKT_SECRET_KEY ) )
+           return NULL;
+       else if( pkttype == PKT_SIGNATURE
+                && (   node->pkt->pkttype == PKT_USER_ID
+                    || node->pkt->pkttype == PKT_PUBLIC_KEY
+                    || node->pkt->pkttype == PKT_SECRET_KEY ) )
+           return NULL;
+       else if( node->pkt->pkttype == pkttype )
+           return node;
+    }
+    return NULL;
+}
+
+
+KBNODE
+find_kbnode( KBNODE node, int pkttype )
+{
+    for( ; node; node = node->next ) {
+       if( node->pkt->pkttype == pkttype )
+           return node;
+    }
+    return NULL;
+}
+
+
+
+/****************
+ * Walk through a list of kbnodes. This function returns
+ * the next kbnode for each call; before using the function the first
+ * time, the caller must set CONTEXT to NULL (This has simply the effect
+ * to start with ROOT).
+ */
+KBNODE
+walk_kbnode( KBNODE root, KBNODE *context, int all )
+{
+    KBNODE n;
+
+    do {
+       if( !*context ) {
+           *context = root;
+           n = root;
+       }
+       else {
+           n = (*context)->next;
+           *context = n;
+       }
+    } while( !all && n && is_deleted_kbnode(n) );
+
+    return n;
+}
+
+void
+clear_kbnode_flags( KBNODE n )
+{
+    for( ; n; n = n->next ) {
+       n->flag = 0;
+    }
+}
+
+
+/****************
+ * Commit changes made to the kblist at ROOT. Note that ROOT my change,
+ * and it is therefore passed by reference.
+ * The function has the effect of removing all nodes marked as deleted.
+ * returns true if any node has been changed
+ */
+int
+commit_kbnode( KBNODE *root )
+{
+    KBNODE n, nl;
+    int changed = 0;
+
+    for( n = *root, nl=NULL; n; n = nl->next ) {
+       if( is_deleted_kbnode(n) ) {
+           if( n == *root )
+               *root = nl = n->next;
+           else
+               nl->next = n->next;
+           if( !is_cloned_kbnode(n) ) {
+               free_packet( n->pkt );
+               xfree( n->pkt );
+           }
+           free_node( n );
+           changed = 1;
+       }
+       else
+           nl = n;
+    }
+    return changed;
+}
+
+void
+remove_kbnode( KBNODE *root, KBNODE node )
+{
+    KBNODE n, nl;
+
+    for( n = *root, nl=NULL; n; n = nl->next ) {
+       if( n == node ) {
+           if( n == *root )
+               *root = nl = n->next;
+           else
+               nl->next = n->next;
+           if( !is_cloned_kbnode(n) ) {
+               free_packet( n->pkt );
+               xfree( n->pkt );
+           }
+           free_node( n );
+       }
+       else
+           nl = n;
+    }
+}
+
+
+/****************
+ * Move NODE behind right after WHERE or to the beginning if WHERE is NULL.
+ */
+void
+move_kbnode( KBNODE *root, KBNODE node, KBNODE where )
+{
+    KBNODE tmp, prev;
+
+    if( !root || !*root || !node )
+       return;  /* sanity check */
+    for( prev = *root; prev && prev->next != node; prev = prev->next )
+       ;
+    if( !prev )
+       return; /* node is not in the list */
+
+    if( !where ) {  /* move node before root */
+       if( node == *root ) /* move to itself */
+           return;
+       prev->next = node->next;
+       node->next = *root;
+       *root = node;
+       return;
+    }
+    /* move it after where */
+    if( node == where )
+       return;
+    tmp = node->next;
+    node->next = where->next;
+    where->next = node;
+    prev->next = tmp;
+}
+
+
+
+
+void
+dump_kbnode( KBNODE node )
+{
+    for(; node; node = node->next ) {
+       const char *s;
+       switch( node->pkt->pkttype ) {
+         case 0:               s="empty"; break;
+         case PKT_PUBLIC_KEY:  s="public-key"; break;
+         case PKT_SECRET_KEY:  s="secret-key"; break;
+         case PKT_SECRET_SUBKEY: s= "secret-subkey"; break;
+         case PKT_PUBKEY_ENC:  s="public-enc"; break;
+         case PKT_SIGNATURE:   s="signature"; break;
+         case PKT_ONEPASS_SIG: s="onepass-sig"; break;
+         case PKT_USER_ID:     s="user-id"; break;
+         case PKT_PUBLIC_SUBKEY: s="public-subkey"; break;
+         case PKT_COMMENT:     s="comment"; break;
+         case PKT_RING_TRUST:  s="trust"; break;
+         case PKT_PLAINTEXT:   s="plaintext"; break;
+         case PKT_COMPRESSED:  s="compressed"; break;
+         case PKT_ENCRYPTED:   s="encrypted"; break;
+          case PKT_GPG_CONTROL: s="gpg-control"; break;
+         default:              s="unknown"; break;
+       }
+       fprintf(stderr, "node %p %02x/%02x type=%s",
+               node, node->flag, node->private_flag, s);
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+            PKT_user_id *uid = node->pkt->pkt.user_id;
+           fputs("  \"", stderr);
+           print_string( stderr, uid->name, uid->len, 0 );
+           fprintf (stderr, "\" %c%c%c%c\n",
+                     uid->is_expired? 'e':'.',
+                     uid->is_revoked? 'r':'.',
+                     uid->created?    'v':'.',
+                     uid->is_primary? 'p':'.' );
+       }
+       else if( node->pkt->pkttype == PKT_SIGNATURE ) {
+           fprintf(stderr, "  class=%02x keyid=%08lX ts=%lu\n",
+                  node->pkt->pkt.signature->sig_class,
+                  (ulong)node->pkt->pkt.signature->keyid[1],
+                   (ulong)node->pkt->pkt.signature->timestamp);
+       }
+       else if( node->pkt->pkttype == PKT_GPG_CONTROL ) {
+           fprintf(stderr, " ctrl=%d len=%u\n",
+                    node->pkt->pkt.gpg_control->control,
+                    (unsigned int)node->pkt->pkt.gpg_control->datalen);
+       }
+       else if( node->pkt->pkttype == PKT_PUBLIC_KEY
+                || node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+            PKT_public_key *pk = node->pkt->pkt.public_key;
+           fprintf(stderr, "  keyid=%08lX a=%d u=%d %c%c%c%c\n",
+                    (ulong)keyid_from_pk( pk, NULL ),
+                    pk->pubkey_algo, pk->pubkey_usage,
+                    pk->has_expired? 'e':'.',  
+                    pk->is_revoked?  'r':'.',  
+                    pk->is_valid?    'v':'.',
+                    pk->mdc_feature? 'm':'.');
+       }
+       else
+           fputs("\n", stderr);
+    }
+}
diff --git a/g10/keydb.c b/g10/keydb.c
new file mode 100644 (file)
index 0000000..b1a7268
--- /dev/null
@@ -0,0 +1,807 @@
+/* keydb.c - key database dispatcher
+ * Copyright (C) 2001, 2002, 2003, 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "util.h"
+#include "options.h"
+#include "main.h" /*try_make_homedir ()*/
+#include "packet.h"
+#include "keyring.h"
+#include "keydb.h" 
+#include "i18n.h"
+
+static int active_handles;
+
+typedef enum {
+    KEYDB_RESOURCE_TYPE_NONE = 0,
+    KEYDB_RESOURCE_TYPE_KEYRING
+} KeydbResourceType;
+#define MAX_KEYDB_RESOURCES 40
+
+struct resource_item {
+  KeydbResourceType type;
+  union {
+    KEYRING_HANDLE kr;
+  } u;
+  void *token;
+  int secret;
+};
+
+static struct resource_item all_resources[MAX_KEYDB_RESOURCES];
+static int used_resources;
+static void *primary_keyring=NULL;
+
+struct keydb_handle {
+  int locked;
+  int found;
+  int current;
+  int used; /* items in active */
+  struct resource_item active[MAX_KEYDB_RESOURCES];
+};
+
+
+static int lock_all (KEYDB_HANDLE hd);
+static void unlock_all (KEYDB_HANDLE hd);
+
+
+/* Handle the creation of a keyring if it does not yet exist.  Take
+   into acount that other processes might have the keyring already
+   locked.  This lock check does not work if the directory itself is
+   not yet available. */
+static int
+maybe_create_keyring (char *filename, int force)
+{
+  DOTLOCK lockhd = NULL;
+  IOBUF iobuf;
+  int rc;
+  mode_t oldmask;
+  char *last_slash_in_filename;
+
+  /* A quick test whether the filename already exists. */
+  if (!access (filename, F_OK))
+    return 0;
+
+  /* If we don't want to create a new file at all, there is no need to
+     go any further - bail out right here.  */
+  if (!force) 
+    return G10ERR_OPEN_FILE;
+
+  /* First of all we try to create the home directory.  Note, that we
+     don't do any locking here because any sane application of gpg
+     would create the home directory by itself and not rely on gpg's
+     tricky auto-creation which is anyway only done for some home
+     directory name patterns. */
+  last_slash_in_filename = strrchr (filename, DIRSEP_C);
+  *last_slash_in_filename = 0;
+  if (access(filename, F_OK))
+    { 
+      static int tried;
+      
+      if (!tried)
+        {
+          tried = 1;
+          try_make_homedir (filename);
+        }
+      if (access (filename, F_OK))
+        {
+          rc = G10ERR_OPEN_FILE;
+          *last_slash_in_filename = DIRSEP_C;
+          goto leave;
+        }
+    }
+  *last_slash_in_filename = DIRSEP_C;
+
+
+  /* To avoid races with other instances of gpg trying to create or
+     update the keyring (it is removed during an update for a short
+     time), we do the next stuff in a locked state. */
+  lockhd = create_dotlock (filename);
+  if (!lockhd)
+    {
+      /* A reason for this to fail is that the directory is not
+         writable. However, this whole locking stuff does not make
+         sense if this is the case. An empty non-writable directory
+         with no keyring is not really useful at all. */
+      if (opt.verbose)
+        log_info ("can't allocate lock for `%s'\n", filename );
+
+      if (!force) 
+        return G10ERR_OPEN_FILE; 
+      else
+        return G10ERR_GENERAL;
+    }
+
+  if ( make_dotlock (lockhd, -1) )
+    {
+      /* This is something bad.  Probably a stale lockfile.  */
+      log_info ("can't lock `%s'\n", filename );
+      rc = G10ERR_GENERAL;
+      goto leave;
+    }
+
+  /* Now the real test while we are locked. */
+  if (!access(filename, F_OK))
+    {
+      rc = 0;  /* Okay, we may access the file now.  */
+      goto leave;
+    }
+
+  /* The file does not yet exist, create it now. */
+  oldmask = umask (077);
+  if (is_secured_filename (filename))
+    {
+      iobuf = NULL;
+      errno = EPERM;
+    }
+  else
+    iobuf = iobuf_create (filename);
+  umask (oldmask);
+  if (!iobuf) 
+    {
+      log_error ( _("error creating keyring `%s': %s\n"),
+                  filename, strerror(errno));
+      rc = G10ERR_OPEN_FILE;
+      goto leave;
+    }
+
+  if (!opt.quiet)
+    log_info (_("keyring `%s' created\n"), filename);
+
+  iobuf_close (iobuf);
+  /* Must invalidate that ugly cache */
+  iobuf_ioctl (NULL, 2, 0, filename);
+  rc = 0;
+
+ leave:
+  if (lockhd)
+    {
+      release_dotlock (lockhd);
+      destroy_dotlock (lockhd);
+    }
+  return rc;
+}
+
+
+/*
+ * Register a resource (which currently may only be a keyring file).
+ * The first keyring which is added by this function is
+ * created if it does not exist.
+ * Note: this function may be called before secure memory is
+ * available.
+ * Flag 1 == force
+ * Flag 2 == mark resource as primary
+ * Flag 4 == This is a default resources
+ */
+int
+keydb_add_resource (const char *url, int flags, int secret)
+{
+    static int any_secret, any_public;
+    const char *resname = url;
+    char *filename = NULL;
+    int force=(flags&1);
+    int rc = 0;
+    KeydbResourceType rt = KEYDB_RESOURCE_TYPE_NONE;
+    void *token;
+
+    /* Do we have an URL?
+     * gnupg-ring:filename  := this is a plain keyring
+     * filename := See what is is, but create as plain keyring.
+     */
+    if (strlen (resname) > 11) {
+       if (!strncmp( resname, "gnupg-ring:", 11) ) {
+           rt = KEYDB_RESOURCE_TYPE_KEYRING;
+           resname += 11;
+       }
+#if !defined(HAVE_DRIVE_LETTERS) && !defined(__riscos__)
+       else if (strchr (resname, ':')) {
+           log_error ("invalid key resource URL `%s'\n", url );
+           rc = G10ERR_GENERAL;
+           goto leave;
+       }
+#endif /* !HAVE_DRIVE_LETTERS && !__riscos__ */
+    }
+
+    if (*resname != DIRSEP_C ) { /* do tilde expansion etc */
+       if (strchr(resname, DIRSEP_C) )
+           filename = make_filename (resname, NULL);
+       else
+           filename = make_filename (opt.homedir, resname, NULL);
+    }
+    else
+       filename = xstrdup (resname);
+
+    if (!force)
+       force = secret? !any_secret : !any_public;
+
+    /* see whether we can determine the filetype */
+    if (rt == KEYDB_RESOURCE_TYPE_NONE) {
+       FILE *fp = fopen( filename, "rb" );
+
+       if (fp) {
+           u32 magic;
+
+           if (fread( &magic, 4, 1, fp) == 1 ) {
+               if (magic == 0x13579ace || magic == 0xce9a5713)
+                   ; /* GDBM magic - no more support */
+               else
+                   rt = KEYDB_RESOURCE_TYPE_KEYRING;
+           }
+           else /* maybe empty: assume ring */
+               rt = KEYDB_RESOURCE_TYPE_KEYRING;
+           fclose( fp );
+       }
+       else /* no file yet: create ring */
+           rt = KEYDB_RESOURCE_TYPE_KEYRING;
+    }
+
+    switch (rt) {
+      case KEYDB_RESOURCE_TYPE_NONE:
+       log_error ("unknown type of key resource `%s'\n", url );
+       rc = G10ERR_GENERAL;
+       goto leave;
+
+      case KEYDB_RESOURCE_TYPE_KEYRING:
+        rc = maybe_create_keyring (filename, force);
+        if (rc)
+          goto leave;
+
+        if(keyring_register_filename (filename, secret, &token))
+         {
+           if (used_resources >= MAX_KEYDB_RESOURCES)
+             rc = G10ERR_RESOURCE_LIMIT;
+           else 
+             {
+               if(flags&2)
+                 primary_keyring=token;
+               all_resources[used_resources].type = rt;
+               all_resources[used_resources].u.kr = NULL; /* Not used here */
+               all_resources[used_resources].token = token;
+               all_resources[used_resources].secret = secret;
+               used_resources++;
+             }
+         }
+       else
+         {
+           /* This keyring was already registered, so ignore it.
+              However, we can still mark it as primary even if it was
+              already registered. */
+           if(flags&2)
+             primary_keyring=token;
+         }
+       break;
+
+      default:
+       log_error ("resource type of `%s' not supported\n", url);
+       rc = G10ERR_GENERAL;
+       goto leave;
+    }
+
+    /* fixme: check directory permissions and print a warning */
+
+  leave:
+    if (rc)
+      {
+        /* Secret keyrings are not required in all cases.  To avoid
+           having gpg return failure we use log_info here if the
+           rewsource is a secret one and marked as default
+           resource.  */
+        if ((flags&4) && secret)
+          log_info (_("keyblock resource `%s': %s\n"),
+                    filename, g10_errstr(rc));
+        else
+          log_error (_("keyblock resource `%s': %s\n"),
+                     filename, g10_errstr(rc));
+      }
+    else if (secret)
+       any_secret = 1;
+    else
+       any_public = 1;
+    xfree (filename);
+    return rc;
+}
+
+
+
+
+KEYDB_HANDLE
+keydb_new (int secret)
+{
+  KEYDB_HANDLE hd;
+  int i, j;
+  
+  hd = xmalloc_clear (sizeof *hd);
+  hd->found = -1;
+  
+  assert (used_resources <= MAX_KEYDB_RESOURCES);
+  for (i=j=0; i < used_resources; i++)
+    {
+      if (!all_resources[i].secret != !secret)
+        continue;
+      switch (all_resources[i].type)
+        {
+        case KEYDB_RESOURCE_TYPE_NONE: /* ignore */
+          break;
+        case KEYDB_RESOURCE_TYPE_KEYRING:
+          hd->active[j].type   = all_resources[i].type;
+          hd->active[j].token  = all_resources[i].token;
+          hd->active[j].secret = all_resources[i].secret;
+          hd->active[j].u.kr = keyring_new (all_resources[i].token, secret);
+          if (!hd->active[j].u.kr) {
+            xfree (hd);
+            return NULL; /* fixme: release all previously allocated handles*/
+          }
+          j++;
+          break;
+        }
+    }
+  hd->used = j;
+  
+  active_handles++;
+  return hd;
+}
+
+void 
+keydb_release (KEYDB_HANDLE hd)
+{
+    int i;
+
+    if (!hd)
+        return;
+    assert (active_handles > 0);
+    active_handles--;
+
+    unlock_all (hd);
+    for (i=0; i < hd->used; i++) {
+        switch (hd->active[i].type) {
+          case KEYDB_RESOURCE_TYPE_NONE:
+            break;
+          case KEYDB_RESOURCE_TYPE_KEYRING:
+            keyring_release (hd->active[i].u.kr);
+            break;
+        }
+    }
+
+    xfree (hd);
+}
+
+
+/*
+ * Return the name of the current resource.  This is function first
+ * looks for the last found found, then for the current search
+ * position, and last returns the first available resource.  The
+ * returned string is only valid as long as the handle exists.  This
+ * function does only return 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)
+{
+    int idx;
+    const char *s = NULL;
+
+    if (!hd) 
+        return NULL;
+
+    if ( hd->found >= 0 && hd->found < hd->used) 
+        idx = hd->found;
+    else if ( hd->current >= 0 && hd->current < hd->used) 
+        idx = hd->current;
+    else
+        idx = 0;
+
+    switch (hd->active[idx].type) {
+      case KEYDB_RESOURCE_TYPE_NONE:
+        s = NULL; 
+        break;
+      case KEYDB_RESOURCE_TYPE_KEYRING:
+        s = keyring_get_resource_name (hd->active[idx].u.kr);
+        break;
+    }
+
+    return s? s: "";
+}
+
+
+
+static int 
+lock_all (KEYDB_HANDLE hd)
+{
+    int i, rc = 0;
+
+    for (i=0; !rc && i < hd->used; i++) {
+        switch (hd->active[i].type) {
+          case KEYDB_RESOURCE_TYPE_NONE:
+            break;
+          case KEYDB_RESOURCE_TYPE_KEYRING:
+            rc = keyring_lock (hd->active[i].u.kr, 1);
+            break;
+        }
+    }
+
+    if (rc) {
+        /* revert the already set locks */
+        for (i--; i >= 0; i--) {
+            switch (hd->active[i].type) {
+              case KEYDB_RESOURCE_TYPE_NONE:
+                break;
+              case KEYDB_RESOURCE_TYPE_KEYRING:
+                keyring_lock (hd->active[i].u.kr, 0);
+                break;
+            }
+        }
+    }
+    else
+        hd->locked = 1;
+
+    return rc;
+}
+
+static void
+unlock_all (KEYDB_HANDLE hd)
+{
+    int i;
+
+    if (!hd->locked)
+        return;
+
+    for (i=hd->used-1; i >= 0; i--) {
+        switch (hd->active[i].type) {
+          case KEYDB_RESOURCE_TYPE_NONE:
+            break;
+          case KEYDB_RESOURCE_TYPE_KEYRING:
+            keyring_lock (hd->active[i].u.kr, 0);
+            break;
+        }
+    }
+    hd->locked = 0;
+}
+
+
+/*
+ * Return the last found keyring.  Caller must free it.
+ * The returned keyblock has the kbode 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.
+ */
+int
+keydb_get_keyblock (KEYDB_HANDLE hd, KBNODE *ret_kb)
+{
+    int rc = 0;
+
+    if (!hd)
+        return G10ERR_INV_ARG;
+
+    if ( hd->found < 0 || hd->found >= hd->used) 
+        return -1; /* nothing found */
+
+    switch (hd->active[hd->found].type) {
+      case KEYDB_RESOURCE_TYPE_NONE:
+        rc = G10ERR_GENERAL; /* oops */
+        break;
+      case KEYDB_RESOURCE_TYPE_KEYRING:
+        rc = keyring_get_keyblock (hd->active[hd->found].u.kr, ret_kb);
+        break;
+    }
+
+    return rc;
+}
+
+/* 
+ * update the current keyblock with KB
+ */
+int
+keydb_update_keyblock (KEYDB_HANDLE hd, KBNODE kb)
+{
+    int rc = 0;
+
+    if (!hd)
+        return G10ERR_INV_ARG;
+
+    if ( hd->found < 0 || hd->found >= hd->used) 
+        return -1; /* nothing found */
+
+    if( opt.dry_run )
+       return 0;
+
+    rc = lock_all (hd);
+    if (rc)
+        return rc;
+
+    switch (hd->active[hd->found].type) {
+      case KEYDB_RESOURCE_TYPE_NONE:
+        rc = G10ERR_GENERAL; /* oops */
+        break;
+      case KEYDB_RESOURCE_TYPE_KEYRING:
+        rc = keyring_update_keyblock (hd->active[hd->found].u.kr, kb);
+        break;
+    }
+
+    unlock_all (hd);
+    return rc;
+}
+
+
+/* 
+ * Insert a new KB into one of the resources. 
+ */
+int
+keydb_insert_keyblock (KEYDB_HANDLE hd, KBNODE kb)
+{
+    int rc = -1;
+    int idx;
+
+    if (!hd) 
+        return G10ERR_INV_ARG;
+
+    if( opt.dry_run )
+       return 0;
+
+    if ( hd->found >= 0 && hd->found < hd->used) 
+        idx = hd->found;
+    else if ( hd->current >= 0 && hd->current < hd->used) 
+        idx = hd->current;
+    else
+        return G10ERR_GENERAL;
+
+    rc = lock_all (hd);
+    if (rc)
+        return rc;
+
+    switch (hd->active[idx].type) {
+      case KEYDB_RESOURCE_TYPE_NONE:
+        rc = G10ERR_GENERAL; /* oops */
+        break;
+      case KEYDB_RESOURCE_TYPE_KEYRING:
+        rc = keyring_insert_keyblock (hd->active[idx].u.kr, kb);
+        break;
+    }
+
+    unlock_all (hd);
+    return rc;
+}
+
+
+/* 
+ * The current keyblock will be deleted.
+ */
+int
+keydb_delete_keyblock (KEYDB_HANDLE hd)
+{
+    int rc = -1;
+
+    if (!hd)
+        return G10ERR_INV_ARG;
+
+    if ( hd->found < 0 || hd->found >= hd->used) 
+        return -1; /* nothing found */
+
+    if( opt.dry_run )
+       return 0;
+
+    rc = lock_all (hd);
+    if (rc)
+        return rc;
+
+    switch (hd->active[hd->found].type) {
+      case KEYDB_RESOURCE_TYPE_NONE:
+        rc = G10ERR_GENERAL; /* oops */
+        break;
+      case KEYDB_RESOURCE_TYPE_KEYRING:
+        rc = keyring_delete_keyblock (hd->active[hd->found].u.kr);
+        break;
+    }
+
+    unlock_all (hd);
+    return rc;
+}
+
+\f
+/*
+ * Locate the default writable key resource, so that the next
+ * operation (which is only relevant for inserts) will be done on this
+ * resource.  
+ */
+int
+keydb_locate_writable (KEYDB_HANDLE hd, const char *reserved)
+{
+  int rc;
+  
+  if (!hd)
+    return G10ERR_INV_ARG;
+  
+  rc = keydb_search_reset (hd); /* this does reset hd->current */
+  if (rc)
+    return rc;
+
+  /* If we have a primary set, try that one first */
+  if(primary_keyring)
+    {
+      for ( ; hd->current >= 0 && hd->current < hd->used; hd->current++)
+       {
+         if(hd->active[hd->current].token==primary_keyring)
+           {
+             if(keyring_is_writable (hd->active[hd->current].token))
+               return 0;
+             else
+               break;
+           }
+       }
+
+      rc = keydb_search_reset (hd); /* this does reset hd->current */
+      if (rc)
+       return rc;
+    }
+
+  for ( ; hd->current >= 0 && hd->current < hd->used; hd->current++) 
+    {
+      switch (hd->active[hd->current].type) 
+        {
+        case KEYDB_RESOURCE_TYPE_NONE:
+          BUG();
+          break;
+        case KEYDB_RESOURCE_TYPE_KEYRING:
+          if (keyring_is_writable (hd->active[hd->current].token))
+            return 0; /* found (hd->current is set to it) */
+          break;
+        }
+    }
+  
+  return -1;
+}
+
+/*
+ * Rebuild the caches of all key resources.
+ */
+void
+keydb_rebuild_caches (int noisy)
+{
+  int i, rc;
+  
+  for (i=0; i < used_resources; i++)
+    {
+      if (all_resources[i].secret)
+        continue;
+      switch (all_resources[i].type)
+        {
+        case KEYDB_RESOURCE_TYPE_NONE: /* ignore */
+          break;
+        case KEYDB_RESOURCE_TYPE_KEYRING:
+          rc = keyring_rebuild_cache (all_resources[i].token,noisy);
+          if (rc)
+            log_error (_("failed to rebuild keyring cache: %s\n"),
+                       g10_errstr (rc));
+          break;
+        }
+    }
+}
+
+
+
+/* 
+ * Start the next search on this handle right at the beginning
+ */
+int 
+keydb_search_reset (KEYDB_HANDLE hd)
+{
+    int i, rc = 0;
+
+    if (!hd)
+        return G10ERR_INV_ARG;
+
+    hd->current = 0; 
+    hd->found = -1;
+    /* and reset all resources */
+    for (i=0; !rc && i < hd->used; i++) {
+        switch (hd->active[i].type) {
+          case KEYDB_RESOURCE_TYPE_NONE:
+            break;
+          case KEYDB_RESOURCE_TYPE_KEYRING:
+            rc = keyring_search_reset (hd->active[i].u.kr);
+            break;
+        }
+    }
+    return rc; 
+}
+
+
+/* 
+ * Search through all keydb resources, starting at the current position,
+ * for a keyblock which contains one of the keys described in the DESC array.
+ */
+int 
+keydb_search2 (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
+              size_t ndesc, size_t *descindex)
+{
+    int rc = -1;
+
+    if (!hd)
+        return G10ERR_INV_ARG;
+
+    while (rc == -1 && hd->current >= 0 && hd->current < hd->used) {
+        switch (hd->active[hd->current].type) {
+          case KEYDB_RESOURCE_TYPE_NONE:
+            BUG(); /* we should never see it here */
+            break;
+          case KEYDB_RESOURCE_TYPE_KEYRING:
+            rc = keyring_search (hd->active[hd->current].u.kr, desc,
+                                ndesc, descindex);
+            break;
+        }
+        if (rc == -1) /* EOF -> switch to next resource */
+            hd->current++; 
+        else if (!rc)
+            hd->found = hd->current;
+    }
+
+    return rc; 
+}
+
+int
+keydb_search_first (KEYDB_HANDLE hd)
+{
+    KEYDB_SEARCH_DESC desc;
+
+    memset (&desc, 0, sizeof desc);
+    desc.mode = KEYDB_SEARCH_MODE_FIRST;
+    return keydb_search (hd, &desc, 1);
+}
+
+int
+keydb_search_next (KEYDB_HANDLE hd)
+{
+    KEYDB_SEARCH_DESC desc;
+
+    memset (&desc, 0, sizeof desc);
+    desc.mode = KEYDB_SEARCH_MODE_NEXT;
+    return keydb_search (hd, &desc, 1);
+}
+
+int
+keydb_search_kid (KEYDB_HANDLE hd, u32 *kid)
+{
+    KEYDB_SEARCH_DESC desc;
+
+    memset (&desc, 0, sizeof desc);
+    desc.mode = KEYDB_SEARCH_MODE_LONG_KID;
+    desc.u.kid[0] = kid[0];
+    desc.u.kid[1] = kid[1];
+    return keydb_search (hd, &desc, 1);
+}
+
+int
+keydb_search_fpr (KEYDB_HANDLE hd, const byte *fpr)
+{
+    KEYDB_SEARCH_DESC desc;
+
+    memset (&desc, 0, sizeof desc);
+    desc.mode = KEYDB_SEARCH_MODE_FPR;
+    memcpy (desc.u.fpr, fpr, MAX_FINGERPRINT_LEN);
+    return keydb_search (hd, &desc, 1);
+}
diff --git a/g10/keydb.h b/g10/keydb.h
new file mode 100644 (file)
index 0000000..b588381
--- /dev/null
@@ -0,0 +1,317 @@
+/* keydb.h - Key database
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_KEYDB_H
+#define G10_KEYDB_H
+
+#include "types.h"
+#include "global.h"
+#include "packet.h"
+#include "cipher.h"
+#ifdef ENABLE_AGENT_SUPPORT
+#include "assuan.h"
+#endif
+
+/* What qualifies as a certification (rather than a signature?) */
+#define IS_CERT(s)       (IS_KEY_SIG(s) || IS_UID_SIG(s) || IS_SUBKEY_SIG(s) \
+                         || IS_KEY_REV(s) || IS_UID_REV(s) || IS_SUBKEY_REV(s))
+#define IS_SIG(s)        (!IS_CERT(s))
+#define IS_KEY_SIG(s)    ((s)->sig_class == 0x1f)
+#define IS_UID_SIG(s)    (((s)->sig_class & ~3) == 0x10)
+#define IS_SUBKEY_SIG(s) ((s)->sig_class == 0x18)
+#define IS_KEY_REV(s)    ((s)->sig_class == 0x20)
+#define IS_UID_REV(s)    ((s)->sig_class == 0x30)
+#define IS_SUBKEY_REV(s) ((s)->sig_class == 0x28)
+
+struct getkey_ctx_s;
+typedef struct getkey_ctx_s *GETKEY_CTX;
+
+/****************
+ * A Keyblock is all packets which form an entire certificate;
+ * i.e. the public key, certificate, trust packets, user ids,
+ * signatures, and subkey.
+ *
+ * This structure is also used to bind arbitrary packets together.
+ */
+
+struct kbnode_struct {
+    KBNODE next;
+    PACKET *pkt;
+    int flag;
+    int private_flag;
+    ulong recno;  /* used while updating the trustdb */
+};
+
+#define is_deleted_kbnode(a)  ((a)->private_flag & 1)
+#define is_cloned_kbnode(a)   ((a)->private_flag & 2)
+
+
+enum resource_type {
+    rt_UNKNOWN = 0,
+    rt_RING = 1
+};
+
+
+/****************
+ * A data structre to hold information about the external position
+ * of a keyblock.
+ */
+struct keyblock_pos_struct {
+    int   resno;     /* resource number */
+    enum resource_type rt;
+    off_t offset;    /* position information */
+    unsigned count;  /* length of the keyblock in packets */
+    IOBUF  fp;      /* used by enum_keyblocks */
+    int secret;      /* working on a secret keyring */
+    PACKET *pkt;     /* ditto */
+    int valid;
+};
+typedef struct keyblock_pos_struct KBPOS;
+
+/* structure to hold a couple of public key certificates */
+typedef struct pk_list *PK_LIST;
+struct pk_list {
+    PK_LIST next;
+    PKT_public_key *pk;
+    int flags; /* flag bit 1==throw_keyid */
+};
+
+/* structure to hold a couple of secret key certificates */
+typedef struct sk_list *SK_LIST;
+struct sk_list {
+    SK_LIST next;
+    PKT_secret_key *sk;
+    int mark; /* not used */
+};
+
+/* structure to collect all information which can be used to
+ * identify a public key */
+typedef struct pubkey_find_info *PUBKEY_FIND_INFO;
+struct pubkey_find_info {
+    u32  keyid[2];
+    unsigned nbits;
+    byte pubkey_algo;
+    byte fingerprint[MAX_FINGERPRINT_LEN];
+    char userid[1];
+};
+
+
+typedef struct keydb_handle *KEYDB_HANDLE;
+
+typedef enum {
+    KEYDB_SEARCH_MODE_NONE,
+    KEYDB_SEARCH_MODE_EXACT,
+    KEYDB_SEARCH_MODE_SUBSTR,
+    KEYDB_SEARCH_MODE_MAIL,
+    KEYDB_SEARCH_MODE_MAILSUB,
+    KEYDB_SEARCH_MODE_MAILEND,
+    KEYDB_SEARCH_MODE_WORDS,
+    KEYDB_SEARCH_MODE_SHORT_KID,
+    KEYDB_SEARCH_MODE_LONG_KID,
+    KEYDB_SEARCH_MODE_FPR16,
+    KEYDB_SEARCH_MODE_FPR20,
+    KEYDB_SEARCH_MODE_FPR,
+    KEYDB_SEARCH_MODE_FIRST,
+    KEYDB_SEARCH_MODE_NEXT
+} KeydbSearchMode;
+
+struct keydb_search_desc {
+    KeydbSearchMode mode;
+    int (*skipfnc)(void *,u32*,PKT_user_id*);
+    void *skipfncvalue;
+    union {
+        const char *name;
+        byte fpr[MAX_FINGERPRINT_LEN];
+        u32  kid[2];
+    } u;
+    int exact;
+};
+
+/*-- keydb.c --*/
+
+/*
+  Flag 1 == force
+  Flag 2 == default
+*/
+int keydb_add_resource (const char *url, int flags, int secret);
+KEYDB_HANDLE keydb_new (int secret);
+void keydb_release (KEYDB_HANDLE hd);
+const char *keydb_get_resource_name (KEYDB_HANDLE hd);
+int keydb_get_keyblock (KEYDB_HANDLE hd, KBNODE *ret_kb);
+int keydb_update_keyblock (KEYDB_HANDLE hd, KBNODE kb);
+int keydb_insert_keyblock (KEYDB_HANDLE hd, KBNODE kb);
+int keydb_delete_keyblock (KEYDB_HANDLE hd);
+int keydb_locate_writable (KEYDB_HANDLE hd, const char *reserved);
+void keydb_rebuild_caches (int noisy);
+int keydb_search_reset (KEYDB_HANDLE hd);
+#define keydb_search(a,b,c) keydb_search2((a),(b),(c),NULL)
+int keydb_search2 (KEYDB_HANDLE hd, KEYDB_SEARCH_DESC *desc,
+                  size_t ndesc, size_t *descindex);
+int keydb_search_first (KEYDB_HANDLE hd);
+int keydb_search_next (KEYDB_HANDLE hd);
+int keydb_search_kid (KEYDB_HANDLE hd, u32 *kid);
+int keydb_search_fpr (KEYDB_HANDLE hd, const byte *fpr);
+
+
+/*-- pkclist.c --*/
+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( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned use );
+union pref_hint
+{
+  int digest_length;
+};
+int  algo_available( preftype_t preftype, int algo,
+                    const union pref_hint *hint );
+int  select_algo_from_prefs( PK_LIST pk_list, int preftype,
+                            int request, const union pref_hint *hint );
+int  select_mdc_from_pklist (PK_LIST pk_list);
+
+/*-- skclist.c --*/
+void release_sk_list( SK_LIST sk_list );
+int  build_sk_list( STRLIST locusr, SK_LIST *ret_sk_list,
+                                           int unlock, unsigned use );
+
+/*-- passphrase.h --*/
+#ifdef ENABLE_AGENT_SUPPORT
+assuan_context_t agent_open (int try, const char *orig_codeset);
+void agent_close (assuan_context_t ctx);
+#else
+/* If we build w/o agent support, assuan.h won't get included and thus
+   we need to define a replacement for some Assuan types. */
+typedef int assuan_error_t;
+typedef void *assuan_context_t;
+#endif
+int  have_static_passphrase(void);
+void set_passphrase_from_string(const char *pass);
+void read_passphrase_from_fd( int fd );
+void passphrase_clear_cache ( u32 *keyid, const char *cacheid, int algo );
+char *ask_passphrase (const char *description,
+                      const char *tryagain_text,
+                      const char *promptid,
+                      const char *prompt, 
+                      const char *cacheid, int *canceled);
+DEK *passphrase_to_dek( u32 *keyid, int pubkey_algo,
+                       int cipher_algo, STRING2KEY *s2k, int mode,
+                        const char *tryagain_text, int *canceled);
+void set_next_passphrase( const char *s );
+char *get_last_passphrase(void);
+void next_to_last_passphrase(void);
+
+/*-- getkey.c --*/
+int classify_user_id( const char *name, KEYDB_SEARCH_DESC *desc);
+void cache_public_key( PKT_public_key *pk );
+void getkey_disable_caches(void);
+int get_pubkey( PKT_public_key *pk, u32 *keyid );
+int get_pubkey_fast ( PKT_public_key *pk, u32 *keyid );
+KBNODE get_pubkeyblock( u32 *keyid );
+int get_pubkey_byname( PKT_public_key *pk,  const char *name,
+                       KBNODE *ret_keyblock, KEYDB_HANDLE *ret_kdbhd,
+                      int include_unusable );
+int get_pubkey_bynames( GETKEY_CTX *rx, PKT_public_key *pk,
+                       STRLIST names, KBNODE *ret_keyblock );
+int get_pubkey_next( GETKEY_CTX ctx, PKT_public_key *pk, KBNODE *ret_keyblock );
+void get_pubkey_end( GETKEY_CTX ctx );
+int get_seckey( PKT_secret_key *sk, u32 *keyid );
+int get_primary_seckey( PKT_secret_key *sk, u32 *keyid );
+int get_pubkey_byfprint( PKT_public_key *pk, const byte *fprint,
+                                                size_t fprint_len );
+int get_pubkey_byfprint_fast (PKT_public_key *pk,
+                              const byte *fprint, size_t fprint_len);
+int get_keyblock_byfprint( KBNODE *ret_keyblock, const byte *fprint,
+                                                size_t fprint_len );
+int get_keyblock_bylid( KBNODE *ret_keyblock, ulong lid );
+int seckey_available( u32 *keyid );
+int get_seckey_byname( PKT_secret_key *sk, const char *name, int unlock );
+int get_seckey_bynames( GETKEY_CTX *rx, PKT_secret_key *sk,
+                       STRLIST names, KBNODE *ret_keyblock );
+int get_seckey_next (GETKEY_CTX ctx, PKT_secret_key *sk, KBNODE *ret_keyblock);
+void get_seckey_end( GETKEY_CTX ctx );
+
+int get_seckey_byfprint( PKT_secret_key *sk,
+                        const byte *fprint, size_t fprint_len);
+int get_seckeyblock_byfprint (KBNODE *ret_keyblock, const byte *fprint,
+                              size_t fprint_len );
+
+
+int enum_secret_keys( void **context, PKT_secret_key *sk,
+                     int with_subkeys, int with_spm );
+void merge_keys_and_selfsig( KBNODE keyblock );
+char*get_user_id_string( u32 *keyid );
+char*get_user_id_string_native( u32 *keyid );
+char*get_long_user_id_string( u32 *keyid );
+char*get_user_id( u32 *keyid, size_t *rn );
+char*get_user_id_native( u32 *keyid );
+KEYDB_HANDLE get_ctx_handle(GETKEY_CTX ctx);
+void release_akl(void);
+int parse_auto_key_locate(char *options);
+
+/*-- keyid.c --*/
+int pubkey_letter( int algo );
+void hash_public_key( MD_HANDLE md, PKT_public_key *pk );
+size_t keystrlen(void);
+const char *keystr(u32 *keyid);
+const char *keystr_from_pk(PKT_public_key *pk);
+const char *keystr_from_sk(PKT_secret_key *sk);
+const char *keystr_from_desc(KEYDB_SEARCH_DESC *desc);
+u32 keyid_from_sk( PKT_secret_key *sk, u32 *keyid );
+u32 keyid_from_pk( PKT_public_key *pk, u32 *keyid );
+u32 keyid_from_sig( PKT_signature *sig, u32 *keyid );
+u32 keyid_from_fingerprint(const byte *fprint, size_t fprint_len, u32 *keyid);
+byte *namehash_from_uid(PKT_user_id *uid);
+unsigned nbits_from_pk( PKT_public_key *pk );
+unsigned nbits_from_sk( PKT_secret_key *sk );
+const char *datestr_from_pk( PKT_public_key *pk );
+const char *datestr_from_sk( PKT_secret_key *sk );
+const char *datestr_from_sig( PKT_signature *sig );
+const char *expirestr_from_pk( PKT_public_key *pk );
+const char *expirestr_from_sk( PKT_secret_key *sk );
+const char *expirestr_from_sig( PKT_signature *sig );
+const char *revokestr_from_pk( PKT_public_key *pk );
+const char *usagestr_from_pk( PKT_public_key *pk );
+const char *colon_strtime (u32 t);
+const char *colon_datestr_from_pk (PKT_public_key *pk);
+const char *colon_datestr_from_sk (PKT_secret_key *sk);
+const char *colon_datestr_from_sig (PKT_signature *sig);
+const char *colon_expirestr_from_sig (PKT_signature *sig);
+byte *fingerprint_from_sk( PKT_secret_key *sk, byte *buf, size_t *ret_len );
+byte *fingerprint_from_pk( PKT_public_key *pk, byte *buf, size_t *ret_len );
+
+/*-- kbnode.c --*/
+KBNODE new_kbnode( PACKET *pkt );
+KBNODE clone_kbnode( KBNODE node );
+void release_kbnode( KBNODE n );
+void delete_kbnode( KBNODE node );
+void add_kbnode( KBNODE root, KBNODE node );
+void insert_kbnode( KBNODE root, KBNODE node, int pkttype );
+void move_kbnode( KBNODE *root, KBNODE node, KBNODE where );
+void remove_kbnode( KBNODE *root, KBNODE node );
+KBNODE find_prev_kbnode( KBNODE root, KBNODE node, int pkttype );
+KBNODE find_next_kbnode( KBNODE node, int pkttype );
+KBNODE find_kbnode( KBNODE node, int pkttype );
+KBNODE walk_kbnode( KBNODE root, KBNODE *context, int all );
+void clear_kbnode_flags( KBNODE n );
+int  commit_kbnode( KBNODE *root );
+void dump_kbnode( KBNODE node );
+
+#endif /*G10_KEYDB_H*/
diff --git a/g10/keyedit.c b/g10/keyedit.c
new file mode 100644 (file)
index 0000000..c1e0ec3
--- /dev/null
@@ -0,0 +1,5094 @@
+/* keyedit.c - keyedit stuff
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <ctype.h>
+#ifdef HAVE_LIBREADLINE
+#include <stdio.h>
+#include <readline/readline.h>
+#endif
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "photoid.h"
+#include "util.h"
+#include "main.h"
+#include "trustdb.h"
+#include "filter.h"
+#include "ttyio.h"
+#include "status.h"
+#include "i18n.h"
+#include "keyserver-internal.h"
+
+static void show_prefs( PKT_user_id *uid, PKT_signature *selfsig, int verbose);
+static void show_names(KBNODE keyblock,PKT_public_key *pk,
+                      unsigned int flag,int with_prefs);
+static void show_key_with_all_names( KBNODE keyblock, int only_marked,
+           int with_revoker, int with_fpr, int with_subkeys, int with_prefs );
+static void show_key_and_fingerprint( KBNODE keyblock );
+static int menu_adduid( KBNODE keyblock, KBNODE sec_keyblock,
+                       int photo, const char *photo_name );
+static void menu_deluid( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_delsig( KBNODE pub_keyblock );
+static int menu_clean(KBNODE keyblock,int self_only);
+static void menu_delkey( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_addrevoker( KBNODE pub_keyblock,
+                           KBNODE sec_keyblock, int sensitive );
+static int menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_backsign(KBNODE pub_keyblock,KBNODE sec_keyblock);
+static int menu_set_primary_uid( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_set_preferences( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_set_keyserver_url (const char *url,
+                                  KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_set_notation(const char *string,
+                            KBNODE pub_keyblock,KBNODE sec_keyblock);
+static int menu_select_uid( KBNODE keyblock, int idx );
+static int menu_select_uid_namehash( KBNODE keyblock, const char *namehash );
+static int menu_select_key( KBNODE keyblock, int idx );
+static int count_uids( KBNODE keyblock );
+static int count_uids_with_flag( KBNODE keyblock, unsigned flag );
+static int count_keys_with_flag( KBNODE keyblock, unsigned flag );
+static int count_selected_uids( KBNODE keyblock );
+static int real_uids_left( KBNODE keyblock );
+static int count_selected_keys( KBNODE keyblock );
+static int menu_revsig( KBNODE keyblock );
+static int menu_revuid( KBNODE keyblock, KBNODE sec_keyblock );
+static int menu_revkey( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int menu_revsubkey( KBNODE pub_keyblock, KBNODE sec_keyblock );
+static int enable_disable_key( KBNODE keyblock, int disable );
+static void menu_showphoto( KBNODE keyblock );
+
+static int update_trust=0;
+
+#define CONTROL_D ('D' - 'A' + 1)
+
+#define NODFLG_BADSIG (1<<0)  /* bad signature */
+#define NODFLG_NOKEY  (1<<1)  /* no public key */
+#define NODFLG_SIGERR (1<<2)  /* other sig error */
+
+#define NODFLG_MARK_A (1<<4)  /* temporary mark */
+#define NODFLG_DELSIG (1<<5)  /* to be deleted */
+
+#define NODFLG_SELUID (1<<8)  /* indicate the selected userid */
+#define NODFLG_SELKEY (1<<9)  /* indicate the selected key */
+#define NODFLG_SELSIG (1<<10) /* indicate a selected signature */
+
+struct sign_attrib {
+    int non_exportable,non_revocable;
+    struct revocation_reason_info *reason;
+    byte trust_depth,trust_value;
+    char *trust_regexp;
+};
+
+
+#ifdef ENABLE_CARD_SUPPORT
+/* Given a node SEC_NODE with a secret key or subkey, locate the
+   corresponding public key from pub_keyblock. */
+static PKT_public_key *
+find_pk_from_sknode (KBNODE pub_keyblock, KBNODE sec_node)
+{
+  KBNODE node = pub_keyblock;
+  PKT_secret_key *sk;
+  PKT_public_key *pk;
+  
+  if (sec_node->pkt->pkttype == PKT_SECRET_KEY
+      && node->pkt->pkttype == PKT_PUBLIC_KEY)
+    return node->pkt->pkt.public_key;
+  if (sec_node->pkt->pkttype != PKT_SECRET_SUBKEY)
+    return NULL;
+  sk = sec_node->pkt->pkt.secret_key;
+  for (; node; node = node->next)
+    if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+      {
+        pk = node->pkt->pkt.public_key;
+        if (pk->keyid[0] == sk->keyid[0] && pk->keyid[1] == sk->keyid[1])
+          return pk;
+      }
+      
+  return NULL;
+}
+#endif /* ENABLE_CARD_SUPPORT */
+
+
+/* TODO: Fix duplicated code between here and the check-sigs/list-sigs
+   code in keylist.c. */
+static int
+print_and_check_one_sig_colon( KBNODE keyblock, KBNODE node,
+                              int *inv_sigs, int *no_key, int *oth_err,
+                              int *is_selfsig, int print_without_key )
+{
+  PKT_signature *sig = node->pkt->pkt.signature;
+  int rc, sigrc;
+
+  /* TODO: Make sure a cached sig record here still has the pk that
+     issued it.  See also keylist.c:list_keyblock_print */
+
+  switch((rc=check_key_signature(keyblock,node,is_selfsig)))
+    {
+    case 0:
+      node->flag &= ~(NODFLG_BADSIG|NODFLG_NOKEY|NODFLG_SIGERR);
+      sigrc = '!';
+      break;
+    case G10ERR_BAD_SIGN:
+      node->flag = NODFLG_BADSIG;
+      sigrc = '-';
+      if( inv_sigs )
+       ++*inv_sigs;
+      break;
+    case G10ERR_NO_PUBKEY:
+    case G10ERR_UNU_PUBKEY:
+      node->flag = NODFLG_NOKEY;
+      sigrc = '?';
+      if( no_key )
+       ++*no_key;
+      break;
+    default:
+      node->flag = NODFLG_SIGERR;
+      sigrc = '%';
+      if( oth_err )
+       ++*oth_err;
+      break;
+    }
+
+  if( sigrc != '?' || print_without_key )
+    {
+      printf("sig:%c::%d:%08lX%08lX:%lu:%lu:",
+            sigrc,sig->pubkey_algo,(ulong)sig->keyid[0],(ulong)sig->keyid[1],
+            (ulong)sig->timestamp,(ulong)sig->expiredate);
+
+      if(sig->trust_depth || sig->trust_value)
+       printf("%d %d",sig->trust_depth,sig->trust_value);
+
+      printf(":");
+
+      if(sig->trust_regexp)
+       print_string(stdout,sig->trust_regexp,strlen(sig->trust_regexp),':');
+
+      printf("::%02x%c\n",sig->sig_class,sig->flags.exportable?'x':'l');
+
+      if(opt.show_subpackets)
+       print_subpackets_colon(sig);
+    }
+
+  return (sigrc == '!');
+}
+
+
+/****************
+ * Print information about a signature, check it and return true
+ * if the signature is okay. NODE must be a signature packet.
+ */
+static int
+print_and_check_one_sig( KBNODE keyblock, KBNODE node,
+                        int *inv_sigs, int *no_key, int *oth_err,
+                       int *is_selfsig, int print_without_key )
+{
+    PKT_signature *sig = node->pkt->pkt.signature;
+    int rc, sigrc;
+    int is_rev = sig->sig_class == 0x30;
+
+    /* TODO: Make sure a cached sig record here still has the pk that
+       issued it.  See also keylist.c:list_keyblock_print */
+
+    switch( (rc = check_key_signature( keyblock, node, is_selfsig)) ) {
+      case 0:
+       node->flag &= ~(NODFLG_BADSIG|NODFLG_NOKEY|NODFLG_SIGERR);
+       sigrc = '!';
+       break;
+      case G10ERR_BAD_SIGN:
+       node->flag = NODFLG_BADSIG;
+       sigrc = '-';
+       if( inv_sigs )
+           ++*inv_sigs;
+       break;
+      case G10ERR_NO_PUBKEY:
+      case G10ERR_UNU_PUBKEY:
+       node->flag = NODFLG_NOKEY;
+       sigrc = '?';
+       if( no_key )
+           ++*no_key;
+       break;
+      default:
+       node->flag = NODFLG_SIGERR;
+       sigrc = '%';
+       if( oth_err )
+           ++*oth_err;
+       break;
+    }
+    if( sigrc != '?' || print_without_key ) {
+        tty_printf("%s%c%c %c%c%c%c%c%c %s %s",
+                  is_rev? "rev":"sig",sigrc,
+                  (sig->sig_class-0x10>0 &&
+                   sig->sig_class-0x10<4)?'0'+sig->sig_class-0x10:' ',
+                  sig->flags.exportable?' ':'L',
+                  sig->flags.revocable?' ':'R',
+                  sig->flags.policy_url?'P':' ',
+                  sig->flags.notation?'N':' ',
+                   sig->flags.expired?'X':' ',
+                  (sig->trust_depth>9)?'T':
+                  (sig->trust_depth>0)?'0'+sig->trust_depth:' ',
+                  keystr(sig->keyid),datestr_from_sig(sig));
+       if(opt.list_options&LIST_SHOW_SIG_EXPIRE)
+         tty_printf(" %s",expirestr_from_sig(sig));
+       tty_printf("  ");
+       if( sigrc == '%' )
+           tty_printf("[%s] ", g10_errstr(rc) );
+       else if( sigrc == '?' )
+           ;
+       else if( *is_selfsig ) {
+           tty_printf( is_rev? _("[revocation]")
+                             : _("[self-signature]") );
+       }
+       else
+         {
+           size_t n;
+           char *p = get_user_id( sig->keyid, &n );
+           tty_print_utf8_string2(p, n, opt.screen_columns-keystrlen()-26-
+                              ((opt.list_options&LIST_SHOW_SIG_EXPIRE)?11:0));
+           xfree(p);
+         }
+       tty_printf("\n");
+
+       if(sig->flags.policy_url && (opt.list_options&LIST_SHOW_POLICY_URLS))
+         show_policy_url(sig,3,0);
+
+       if(sig->flags.notation && (opt.list_options&LIST_SHOW_NOTATIONS))
+         show_notation(sig,3,0,
+                       ((opt.list_options&LIST_SHOW_STD_NOTATIONS)?1:0)+
+                       ((opt.list_options&LIST_SHOW_USER_NOTATIONS)?2:0));
+
+       if(sig->flags.pref_ks && (opt.list_options&LIST_SHOW_KEYSERVER_URLS))
+         show_keyserver_url(sig,3,0);
+    }
+
+    return (sigrc == '!');
+}
+
+
+
+/****************
+ * Check the keysigs and set the flags to indicate errors.
+ * Returns true if error found.
+ */
+static int
+check_all_keysigs( KBNODE keyblock, int only_selected )
+{
+    KBNODE kbctx;
+    KBNODE node;
+    int inv_sigs = 0;
+    int no_key = 0;
+    int oth_err = 0;
+    int has_selfsig = 0;
+    int mis_selfsig = 0;
+    int selected = !only_selected;
+    int anyuid = 0;
+
+    for( kbctx=NULL; (node=walk_kbnode( keyblock, &kbctx, 0)) ; ) {
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           PKT_user_id *uid = node->pkt->pkt.user_id;
+
+           if( only_selected )
+               selected = (node->flag & NODFLG_SELUID);
+           if( selected ) {
+               tty_printf("uid  ");
+               tty_print_utf8_string( uid->name, uid->len );
+               tty_printf("\n");
+               if( anyuid && !has_selfsig )
+                   mis_selfsig++;
+               has_selfsig = 0;
+               anyuid = 1;
+           }
+       }
+       else if( selected && node->pkt->pkttype == PKT_SIGNATURE
+                && ( (node->pkt->pkt.signature->sig_class&~3) == 0x10
+                    || node->pkt->pkt.signature->sig_class == 0x30 )  ) {
+           int selfsig;
+
+           if( print_and_check_one_sig( keyblock, node, &inv_sigs,
+                                       &no_key, &oth_err, &selfsig, 0 ) ) {
+               if( selfsig )
+                   has_selfsig = 1;
+           }
+           /* Hmmm: should we update the trustdb here? */
+       }
+    }
+    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);
+
+    return inv_sigs || no_key || oth_err || mis_selfsig;
+}
+
+
+static int
+sign_mk_attrib( PKT_signature *sig, void *opaque )
+{
+    struct sign_attrib *attrib = opaque;
+    byte buf[8];
+
+    if( attrib->non_exportable ) {
+       buf[0] = 0; /* not exportable */
+       build_sig_subpkt( sig, SIGSUBPKT_EXPORTABLE, buf, 1 );
+    }
+
+    if( attrib->non_revocable ) {
+       buf[0] = 0; /* not revocable */
+       build_sig_subpkt( sig, SIGSUBPKT_REVOCABLE, buf, 1 );
+    }
+
+    if( attrib->reason )
+       revocation_reason_build_cb( sig, attrib->reason );
+
+    if(attrib->trust_depth)
+      {
+       /* Not critical.  If someone doesn't understand trust sigs,
+          this can still be a valid regular signature. */
+        buf[0] = attrib->trust_depth;
+       buf[1] = attrib->trust_value;
+       build_sig_subpkt(sig,SIGSUBPKT_TRUST,buf,2);
+
+       /* Critical.  If someone doesn't understands regexps, this
+          whole sig should be invalid.  Note the +1 for the length -
+          regexps are null terminated. */
+       if(attrib->trust_regexp)
+         build_sig_subpkt(sig,SIGSUBPKT_FLAG_CRITICAL|SIGSUBPKT_REGEXP,
+                          attrib->trust_regexp,
+                          strlen(attrib->trust_regexp)+1);
+      }
+
+    return 0;
+}
+
+static void
+trustsig_prompt(byte *trust_value,byte *trust_depth,char **regexp)
+{
+  char *p;
+
+  *trust_value=0;
+  *trust_depth=0;
+  *regexp=NULL;
+
+  /* Same string as pkclist.c:do_edit_ownertrust */
+  tty_printf(_("Please decide how far you trust this user to correctly verify"
+              " other users' keys\n(by looking at passports, checking"
+              " fingerprints from different sources, etc.)\n"));
+  tty_printf("\n");
+  tty_printf (_("  %d = I trust marginally\n"), 1);
+  tty_printf (_("  %d = I trust fully\n"), 2);
+  tty_printf("\n");
+
+  while(*trust_value==0)
+    {
+      p = cpr_get("trustsig_prompt.trust_value",_("Your selection? "));
+      trim_spaces(p);
+      cpr_kill_prompt();
+      /* 60 and 120 are as per RFC2440 */
+      if(p[0]=='1' && !p[1])
+       *trust_value=60;
+      else if(p[0]=='2' && !p[1])
+       *trust_value=120;
+      xfree(p);
+    }
+
+  tty_printf("\n");
+
+  tty_printf(_(
+             "Please enter the depth of this trust signature.\n"
+             "A depth greater than 1 allows the key you are signing to make\n"
+             "trust signatures on your behalf.\n"));
+  tty_printf("\n");
+
+  while(*trust_depth==0)
+    {
+      p = cpr_get("trustsig_prompt.trust_depth",_("Your selection? "));
+      trim_spaces(p);
+      cpr_kill_prompt();
+      *trust_depth=atoi(p);
+      xfree(p);
+    }
+
+  tty_printf("\n");
+
+  tty_printf(_("Please enter a domain to restrict this signature, "
+              "or enter for none.\n"));
+
+  tty_printf("\n");
+
+  p=cpr_get("trustsig_prompt.trust_regexp",_("Your selection? "));
+  trim_spaces(p);
+  cpr_kill_prompt();
+
+  if(strlen(p)>0)
+    {
+      char *q=p;
+      int regexplen=100,ind;
+
+      *regexp=xmalloc(regexplen);
+
+      /* Now mangle the domain the user entered into a regexp.  To do
+        this, \-escape everything that isn't alphanumeric, and attach
+        "<[^>]+[@.]" to the front, and ">$" to the end. */
+
+      strcpy(*regexp,"<[^>]+[@.]");
+      ind=strlen(*regexp);
+
+      while(*q)
+       {
+         if(!((*q>='A' && *q<='Z')
+              || (*q>='a' && *q<='z') || (*q>='0' && *q<='9')))
+           (*regexp)[ind++]='\\';
+
+         (*regexp)[ind++]=*q;
+
+         if((regexplen-ind)<3)
+           {
+             regexplen+=100;
+             *regexp=xrealloc(*regexp,regexplen);
+           }
+
+         q++;
+       }
+
+      (*regexp)[ind]='\0';
+      strcat(*regexp,">$");
+    }
+
+  xfree(p);
+  tty_printf("\n");
+}
+
+/****************
+ * Loop over all locusr and and sign the uids after asking.
+ * If no user id is marked, all user ids will be signed;
+ * if some user_ids are marked those will be signed.
+ */
+static int
+sign_uids( KBNODE keyblock, STRLIST locusr, int *ret_modified,
+          int local, int nonrevocable, int trust, int interactive )
+{
+    int rc = 0;
+    SK_LIST sk_list = NULL;
+    SK_LIST sk_rover = NULL;
+    PKT_secret_key *sk = NULL;
+    KBNODE node, uidnode;
+    PKT_public_key *primary_pk=NULL;
+    int select_all = !count_selected_uids(keyblock) || interactive;
+    int all_v3=1;
+
+    /* Are there any non-v3 sigs on this key already? */
+    if(PGP2)
+      for(node=keyblock;node;node=node->next)
+       if(node->pkt->pkttype==PKT_SIGNATURE &&
+          node->pkt->pkt.signature->version>3)
+         {
+           all_v3=0;
+           break;
+         }
+
+    /* build a list of all signators.
+     *    
+     * We use the CERT flag to request the primary which must always
+     * be one which is capable of signing keys.  I can't see a reason
+     * why to sign keys using a subkey.  Implementation of USAGE_CERT
+     * is just a hack in getkey.c and does not mean that a subkey
+     * marked as certification capable will be used. */
+    rc=build_sk_list( locusr, &sk_list, 0, PUBKEY_USAGE_CERT);
+    if( rc )
+       goto leave;
+
+    /* loop over all signators */
+    for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+        u32 sk_keyid[2],pk_keyid[2];
+       char *p,*trust_regexp=NULL;
+       int force_v4=0,class=0,selfsig=0;
+       u32 duration=0,timestamp=0;
+       byte trust_depth=0,trust_value=0;
+
+       if(local || nonrevocable || trust ||
+          opt.cert_policy_url || opt.cert_notations)
+         force_v4=1;
+
+       /* we have to use a copy of the sk, because make_keysig_packet
+        * may remove the protection from sk and if we did other
+        * changes to the secret key, we would save the unprotected
+        * version */
+       if( sk )
+           free_secret_key(sk);
+       sk = copy_secret_key( NULL, sk_rover->sk );
+       keyid_from_sk( sk, sk_keyid );
+       /* set mark A for all selected user ids */
+       for( node=keyblock; node; node = node->next ) {
+           if( select_all || (node->flag & NODFLG_SELUID) )
+               node->flag |= NODFLG_MARK_A;
+           else
+               node->flag &= ~NODFLG_MARK_A;
+       }
+       /* reset mark for uids which are already signed */
+       uidnode = NULL;
+       for( node=keyblock; node; node = node->next ) {
+           if( node->pkt->pkttype == PKT_PUBLIC_KEY ) {
+               primary_pk=node->pkt->pkt.public_key;
+               keyid_from_pk( primary_pk, pk_keyid );
+
+               /* Is this a self-sig? */
+               if(pk_keyid[0]==sk_keyid[0] && pk_keyid[1]==sk_keyid[1])
+                 {
+                   selfsig=1;
+                   /* Do not force a v4 sig here, otherwise it would
+                       be difficult to remake a v3 selfsig.  If this
+                       is a v3->v4 promotion case, then we set
+                       force_v4 later anyway. */
+                   force_v4=0;
+                 }
+           }
+           else if( node->pkt->pkttype == PKT_USER_ID )
+             {
+               uidnode = (node->flag & NODFLG_MARK_A)? node : NULL;
+               if(uidnode)
+                 {
+                   int yesreally=0;
+                   char *user=utf8_to_native(uidnode->pkt->pkt.user_id->name,
+                                             uidnode->pkt->pkt.user_id->len,
+                                             0);
+
+                   if(uidnode->pkt->pkt.user_id->is_revoked)
+                     {
+                       tty_printf(_("User ID \"%s\" is revoked."),user);
+
+                       if(selfsig)
+                         tty_printf("\n");
+                       else if(opt.expert)
+                         {
+                           tty_printf("\n");
+                           /* No, so remove the mark and continue */
+                           if(!cpr_get_answer_is_yes("sign_uid.revoke_okay",
+                                                     _("Are you sure you "
+                                                       "still want to sign "
+                                                       "it? (y/N) ")))
+                             {
+                               uidnode->flag &= ~NODFLG_MARK_A;
+                               uidnode=NULL;
+                             }
+                           else if(interactive)
+                             yesreally=1;
+                         }
+                       else
+                         {
+                           uidnode->flag &= ~NODFLG_MARK_A;
+                           uidnode=NULL;
+                           tty_printf(_("  Unable to sign.\n"));
+                         }
+                     }
+                   else if(uidnode->pkt->pkt.user_id->is_expired)
+                     {
+                       tty_printf(_("User ID \"%s\" is expired."),user);
+
+                       if(selfsig)
+                         tty_printf("\n");
+                       else if(opt.expert)
+                         {
+                           tty_printf("\n");
+                           /* No, so remove the mark and continue */
+                           if(!cpr_get_answer_is_yes("sign_uid.expire_okay",
+                                                     _("Are you sure you "
+                                                       "still want to sign "
+                                                       "it? (y/N) ")))
+                             {
+                               uidnode->flag &= ~NODFLG_MARK_A;
+                               uidnode=NULL;
+                             }
+                           else if(interactive)
+                             yesreally=1;
+                         }
+                       else
+                         {
+                           uidnode->flag &= ~NODFLG_MARK_A;
+                           uidnode=NULL;
+                           tty_printf(_("  Unable to sign.\n"));
+                         }
+                     }
+                   else if(!uidnode->pkt->pkt.user_id->created && !selfsig)
+                     {
+                       tty_printf(_("User ID \"%s\" is not self-signed."),
+                                  user);
+
+                       if(opt.expert)
+                         {
+                           tty_printf("\n");
+                           /* No, so remove the mark and continue */
+                           if(!cpr_get_answer_is_yes("sign_uid.nosig_okay",
+                                                     _("Are you sure you "
+                                                       "still want to sign "
+                                                       "it? (y/N) ")))
+                             {
+                               uidnode->flag &= ~NODFLG_MARK_A;
+                               uidnode=NULL;
+                             }
+                           else if(interactive)
+                             yesreally=1;
+                         }
+                       else
+                         {
+                           uidnode->flag &= ~NODFLG_MARK_A;
+                           uidnode=NULL;
+                           tty_printf(_("  Unable to sign.\n"));
+                         }
+                     }
+
+                   if(uidnode && interactive && !yesreally)
+                     {
+                       tty_printf(_("User ID \"%s\" is signable.  "),user);
+                       if(!cpr_get_answer_is_yes("sign_uid.sign_okay",
+                                                 _("Sign it? (y/N) ")))
+                         {
+                           uidnode->flag &= ~NODFLG_MARK_A;
+                           uidnode=NULL;
+                         }
+                     }
+
+                   xfree(user);
+                 }
+             }
+           else if( uidnode && node->pkt->pkttype == PKT_SIGNATURE
+               && (node->pkt->pkt.signature->sig_class&~3) == 0x10 ) {
+               if( sk_keyid[0] == node->pkt->pkt.signature->keyid[0]
+                   && sk_keyid[1] == node->pkt->pkt.signature->keyid[1] ) {
+                    char buf[50];
+                   char *user=utf8_to_native(uidnode->pkt->pkt.user_id->name,
+                                             uidnode->pkt->pkt.user_id->len,
+                                             0);
+
+                   /* It's a v3 self-sig.  Make it into a v4 self-sig? */
+                   if(node->pkt->pkt.signature->version<4 && selfsig)
+                     {
+                       tty_printf(_("The self-signature on \"%s\"\n"
+                                    "is a PGP 2.x-style signature.\n"),user);
+                       /* Note that the regular PGP2 warning below
+                          still applies if there are no v4 sigs on
+                          this key at all. */
+
+                       if(opt.expert)
+                         if(cpr_get_answer_is_yes("sign_uid.v4_promote_okay",
+                                                  _("Do you want to promote "
+                                                    "it to an OpenPGP self-"
+                                                    "signature? (y/N) ")))
+                           {
+                             force_v4=1;
+                             node->flag|=NODFLG_DELSIG;
+                             xfree(user);
+                             continue;
+                           }
+                     }
+
+                   /* Is the current signature expired? */
+                   if(node->pkt->pkt.signature->flags.expired)
+                     {
+                       tty_printf(_("Your current signature on \"%s\"\n"
+                                    "has expired.\n"),user);
+
+                       if(cpr_get_answer_is_yes("sign_uid.replace_expired_okay",
+                                                _("Do you want to issue a "
+                                                  "new signature to replace "
+                                                  "the expired one? (y/N) ")))
+                         {
+                           /* Mark these for later deletion.  We
+                               don't want to delete them here, just in
+                               case the replacement signature doesn't
+                               happen for some reason.  We only delete
+                               these after the replacement is already
+                               in place. */
+
+                           node->flag|=NODFLG_DELSIG;
+                           xfree(user);
+                           continue;
+                         }
+                     }
+
+                   if(!node->pkt->pkt.signature->flags.exportable && !local)
+                     {
+                       /* It's a local sig, and we want to make a
+                           exportable sig. */
+                       tty_printf(_("Your current signature on \"%s\"\n"
+                                    "is a local signature.\n"),user);
+
+                       if(cpr_get_answer_is_yes("sign_uid.local_promote_okay",
+                                                _("Do you want to promote "
+                                                  "it to a full exportable "
+                                                  "signature? (y/N) ")))
+                         {
+                           /* Mark these for later deletion.  We
+                               don't want to delete them here, just in
+                               case the replacement signature doesn't
+                               happen for some reason.  We only delete
+                               these after the replacement is already
+                               in place. */
+
+                           node->flag|=NODFLG_DELSIG;
+                           xfree(user);
+                           continue;
+                         }
+                     }
+
+                   /* Fixme: see whether there is a revocation in which
+                    * case we should allow to sign it again. */
+                    if (!node->pkt->pkt.signature->flags.exportable && local)
+                      tty_printf(_(
+                             "\"%s\" was already locally signed by key %s\n"),
+                                user,keystr_from_sk(sk));
+                    else
+                      tty_printf(_("\"%s\" was already signed by key %s\n"),
+                                 user,keystr_from_sk(sk));
+
+                   if(opt.expert
+                      && cpr_get_answer_is_yes("sign_uid.dupe_okay",
+                                               _("Do you want to sign it "
+                                                 "again anyway? (y/N) ")))
+                     {
+                       /* Don't delete the old sig here since this is
+                          an --expert thing. */
+                       xfree(user);
+                       continue;
+                     }
+
+                    sprintf (buf, "%08lX%08lX",
+                             (ulong)sk->keyid[0], (ulong)sk->keyid[1] );
+                    write_status_text (STATUS_ALREADY_SIGNED, buf);
+                   uidnode->flag &= ~NODFLG_MARK_A; /* remove mark */
+
+                   xfree(user);
+               }
+           }
+       }
+
+       /* check whether any uids are left for signing */
+       if( !count_uids_with_flag(keyblock, NODFLG_MARK_A) )
+         {
+           tty_printf(_("Nothing to sign with key %s\n"),keystr_from_sk(sk));
+           continue;
+         }
+
+       /* Ask whether we really should sign these user id(s) */
+       tty_printf("\n");
+       show_key_with_all_names( keyblock, 1, 0, 1, 0, 0 );
+       tty_printf("\n");
+
+       if(primary_pk->expiredate && !selfsig)
+         {
+           u32 now=make_timestamp();
+
+           if(primary_pk->expiredate<=now)
+             {
+               tty_printf(_("This key has expired!"));
+
+               if(opt.expert)
+                 {
+                   tty_printf("  ");
+                   if(!cpr_get_answer_is_yes("sign_uid.expired_okay",
+                                             _("Are you sure you still "
+                                               "want to sign it? (y/N) ")))
+                     continue;
+                 }
+               else
+                 {
+                   tty_printf(_("  Unable to sign.\n"));
+                   continue;
+                 }
+             }
+           else
+             {
+               tty_printf(_("This key is due to expire on %s.\n"),
+                          expirestr_from_pk(primary_pk));
+
+               if(opt.ask_cert_expire)
+                 {
+                   char *answer=cpr_get("sign_uid.expire",
+                                        _("Do you want your signature to "
+                                          "expire at the same time? (Y/n) "));
+                   if(answer_is_yes_no_default(answer,1))
+                     {
+                       /* This fixes the signature timestamp we're
+                          going to make as now.  This is so the
+                          expiration date is exactly correct, and not
+                          a few seconds off (due to the time it takes
+                          to answer the questions, enter the
+                          passphrase, etc). */
+                       timestamp=now;
+                       duration=primary_pk->expiredate-now;
+                       force_v4=1;
+                     }
+
+                   cpr_kill_prompt();
+                   xfree(answer);
+                 }
+             }
+         }
+
+       /* Only ask for duration if we haven't already set it to match
+           the expiration of the pk */
+       if(!duration && !selfsig)
+         {
+           if(opt.ask_cert_expire)
+             duration=ask_expire_interval(1,opt.def_cert_expire);
+           else
+             duration=parse_expire_string(opt.def_cert_expire);
+         }
+
+       if(duration)
+         force_v4=1;
+
+       /* Is --pgp2 on, it's a v3 key, all the sigs on the key are
+          currently v3 and we're about to sign it with a v4 sig?  If
+          so, danger! */
+       if(PGP2 && all_v3 &&
+          (sk->version>3 || force_v4) && primary_pk->version<=3)
+         {
+           tty_printf(_("You may not make an OpenPGP signature on a "
+                        "PGP 2.x key while in --pgp2 mode.\n"));
+           tty_printf(_("This would make the key unusable in PGP 2.x.\n"));
+
+           if(opt.expert)
+             {
+               if(!cpr_get_answer_is_yes("sign_uid.v4_on_v3_okay",
+                                         _("Are you sure you still "
+                                           "want to sign it? (y/N) ")))
+                 continue;
+
+               all_v3=0;
+             }
+           else
+             continue;
+         }
+
+       if(selfsig)
+         ;
+       else
+         {
+           if(opt.batch || !opt.ask_cert_level)
+             class=0x10+opt.def_cert_level;
+           else
+             {
+               char *answer;
+
+               tty_printf(_("How carefully have you verified the key you are "
+                            "about to sign actually belongs\nto the person "
+                            "named above?  If you don't know what to "
+                            "answer, enter \"0\".\n"));
+               tty_printf("\n");
+               tty_printf(_("   (0) I will not answer.%s\n"),
+                          opt.def_cert_level==0?" (default)":"");
+               tty_printf(_("   (1) I have not checked at all.%s\n"),
+                          opt.def_cert_level==1?" (default)":"");
+               tty_printf(_("   (2) I have done casual checking.%s\n"),
+                          opt.def_cert_level==2?" (default)":"");
+               tty_printf(_("   (3) I have done very careful checking.%s\n"),
+                          opt.def_cert_level==3?" (default)":"");
+               tty_printf("\n");
+
+               while(class==0)
+                 {
+                   answer = cpr_get("sign_uid.class",_("Your selection? "
+                                       "(enter `?' for more information): "));
+                   if(answer[0]=='\0')
+                     class=0x10+opt.def_cert_level; /* Default */
+                   else if(ascii_strcasecmp(answer,"0")==0)
+                     class=0x10; /* Generic */
+                   else if(ascii_strcasecmp(answer,"1")==0)
+                     class=0x11; /* Persona */
+                   else if(ascii_strcasecmp(answer,"2")==0)
+                     class=0x12; /* Casual */
+                   else if(ascii_strcasecmp(answer,"3")==0)
+                     class=0x13; /* Positive */
+                   else
+                     tty_printf(_("Invalid selection.\n"));
+
+                   xfree(answer);
+                 }
+             }
+
+           if(trust)
+             trustsig_prompt(&trust_value,&trust_depth,&trust_regexp);
+         }
+
+       p=get_user_id_native(sk_keyid);
+       tty_printf(_("Are you sure that you want to sign this key with your\n"
+                    "key \"%s\" (%s)\n"),p,keystr_from_sk(sk));
+       xfree(p);
+
+       if(selfsig)
+         {
+            tty_printf("\n");
+           tty_printf(_("This will be a self-signature.\n"));
+
+           if( local )
+              {
+                tty_printf("\n");
+                tty_printf(
+                        _("WARNING: the signature will not be marked "
+                          "as non-exportable.\n"));
+              }
+
+           if( nonrevocable )
+              {
+                tty_printf("\n");
+                tty_printf(
+                        _("WARNING: the signature will not be marked "
+                          "as non-revocable.\n"));
+              }
+         }
+       else
+         {
+           if( local )
+              {
+                tty_printf("\n");
+                tty_printf(
+                    _("The signature will be marked as non-exportable.\n"));
+              }
+
+           if( nonrevocable )
+              {
+                tty_printf("\n");
+                tty_printf(
+                     _("The signature will be marked as non-revocable.\n"));
+              }
+
+           switch(class)
+             {
+             case 0x11:
+                tty_printf("\n");
+               tty_printf(_("I have not checked this key at all.\n"));
+               break;
+
+             case 0x12:
+                tty_printf("\n");
+               tty_printf(_("I have checked this key casually.\n"));
+               break;
+
+             case 0x13:
+                tty_printf("\n");
+               tty_printf(_("I have checked this key very carefully.\n"));
+               break;
+             }
+         }
+
+       tty_printf("\n");
+
+       if( opt.batch && opt.answer_yes )
+         ;
+       else if( !cpr_get_answer_is_yes("sign_uid.okay",
+                                       _("Really sign? (y/N) ")) )
+           continue;
+
+       /* now we can sign the user ids */
+      reloop: /* (must use this, because we are modifing the list) */
+       primary_pk = NULL;
+       for( node=keyblock; node; node = node->next ) {
+           if( node->pkt->pkttype == PKT_PUBLIC_KEY )
+               primary_pk = node->pkt->pkt.public_key;
+           else if( node->pkt->pkttype == PKT_USER_ID
+                    && (node->flag & NODFLG_MARK_A) ) {
+               PACKET *pkt;
+               PKT_signature *sig;
+               struct sign_attrib attrib;
+
+               assert( primary_pk );
+               memset( &attrib, 0, sizeof attrib );
+               attrib.non_exportable = local;
+               attrib.non_revocable = nonrevocable;
+               attrib.trust_depth = trust_depth;
+               attrib.trust_value = trust_value;
+               attrib.trust_regexp = trust_regexp;
+               node->flag &= ~NODFLG_MARK_A;
+
+                /* we force creation of a v4 signature for local
+                 * signatures, otherwise we would not generate the
+                 * subpacket with v3 keys and the signature becomes
+                 * exportable */
+
+               if(selfsig)
+                 rc = make_keysig_packet( &sig, primary_pk,
+                                          node->pkt->pkt.user_id,
+                                          NULL,
+                                          sk,
+                                          0x13, 0, force_v4?4:0, 0, 0,
+                                          keygen_add_std_prefs, primary_pk);
+               else
+                 rc = make_keysig_packet( &sig, primary_pk,
+                                          node->pkt->pkt.user_id,
+                                          NULL,
+                                          sk,
+                                          class, 0, force_v4?4:0,
+                                          timestamp, duration,
+                                          sign_mk_attrib, &attrib );
+               if( rc ) {
+                   log_error(_("signing failed: %s\n"), g10_errstr(rc));
+                   goto leave;
+               }
+
+               *ret_modified = 1; /* we changed the keyblock */
+               update_trust = 1;
+
+               pkt = xmalloc_clear( sizeof *pkt );
+               pkt->pkttype = PKT_SIGNATURE;
+               pkt->pkt.signature = sig;
+               insert_kbnode( node, new_kbnode(pkt), PKT_SIGNATURE );
+               goto reloop;
+           }
+       }
+
+       /* Delete any sigs that got promoted */
+       for( node=keyblock; node; node = node->next )
+         if( node->flag & NODFLG_DELSIG)
+           delete_kbnode(node);
+    } /* end loop over signators */
+
+  leave:
+    release_sk_list( sk_list );
+    if( sk )
+       free_secret_key(sk);
+    return rc;
+}
+
+
+
+/****************
+ * Change the passphrase of the primary and all secondary keys.
+ * We use only one passphrase for all keys.
+ */
+static int
+change_passphrase( KBNODE keyblock )
+{
+    int rc = 0;
+    int changed=0;
+    KBNODE node;
+    PKT_secret_key *sk;
+    char *passphrase = NULL;
+    int no_primary_secrets = 0;
+    int any;
+
+    node = find_kbnode( keyblock, PKT_SECRET_KEY );
+    if( !node ) {
+       log_error("Oops; secret key not found anymore!\n");
+       goto leave;
+    }
+    sk = node->pkt->pkt.secret_key;
+
+    for (any = 0, node=keyblock; node; node = node->next) {
+       if (node->pkt->pkttype == PKT_SECRET_KEY 
+            || node->pkt->pkttype == PKT_SECRET_SUBKEY) {
+           PKT_secret_key *tmpsk = node->pkt->pkt.secret_key;
+            if (!(tmpsk->is_protected
+                  && (tmpsk->protect.s2k.mode == 1001 
+                      || tmpsk->protect.s2k.mode == 1002))) {
+                any = 1;
+                break;
+            }
+        }
+    }
+    if (!any) {
+        tty_printf (_("Key has only stub or on-card key items - "
+                      "no passphrase to change.\n"));
+        goto leave;
+    }
+        
+    /* See how to handle this key.  */
+    switch( is_secret_key_protected( sk ) ) {
+      case -1:
+       rc = G10ERR_PUBKEY_ALGO;
+       break;
+      case 0:
+       tty_printf(_("This key is not protected.\n"));
+       break;
+      default:
+       if( sk->protect.s2k.mode == 1001 ) {
+           tty_printf(_("Secret parts of primary key are not available.\n"));
+           no_primary_secrets = 1;
+       }
+       else if( sk->protect.s2k.mode == 1002 ) {
+           tty_printf(_("Secret parts of primary key are stored on-card.\n"));
+           no_primary_secrets = 1;
+       }
+       else {
+           tty_printf(_("Key is protected.\n"));
+           rc = check_secret_key( sk, 0 );
+           if( !rc )
+               passphrase = get_last_passphrase();
+       }
+       break;
+    }
+
+    /* Unprotect all subkeys (use the supplied passphrase or ask)*/
+    for(node=keyblock; !rc && node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+           PKT_secret_key *subsk = node->pkt->pkt.secret_key;
+            if ( !(subsk->is_protected
+                   && (subsk->protect.s2k.mode == 1001 
+                       || subsk->protect.s2k.mode == 1002))) {
+                set_next_passphrase( passphrase );
+                rc = check_secret_key( subsk, 0 );
+                if( !rc && !passphrase )
+                    passphrase = get_last_passphrase();
+            }
+       }
+    }
+
+    if( rc )
+       tty_printf(_("Can't edit this key: %s\n"), g10_errstr(rc));
+    else {
+       DEK *dek = NULL;
+       STRING2KEY *s2k = xmalloc_secure( sizeof *s2k );
+        const char *errtext = NULL;
+
+       tty_printf(_("Enter the new passphrase for this secret key.\n\n") );
+
+       set_next_passphrase( NULL );
+       for(;;) {
+           s2k->mode = opt.s2k_mode;
+           s2k->hash_algo = S2K_DIGEST_ALGO;
+           dek = passphrase_to_dek( NULL, 0, opt.s2k_cipher_algo,
+                                     s2k, 2, errtext, NULL);
+           if( !dek ) {
+               errtext = N_("passphrase not correctly repeated; try again");
+               tty_printf ("%s.\n", _(errtext));
+           }
+           else if( !dek->keylen ) {
+               rc = 0;
+               tty_printf(_( "You don't want a passphrase -"
+                           " this is probably a *bad* idea!\n\n"));
+               if( cpr_get_answer_is_yes("change_passwd.empty.okay",
+                              _("Do you really want to do this? (y/N) ")))
+                 {
+                   changed++;
+                   break;
+                 }
+           }
+           else { /* okay */
+               rc = 0;
+               if( !no_primary_secrets ) {
+                   sk->protect.algo = dek->algo;
+                   sk->protect.s2k = *s2k;
+                   rc = protect_secret_key( sk, dek );
+               }
+               for(node=keyblock; !rc && node; node = node->next ) {
+                   if( node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                       PKT_secret_key *subsk = node->pkt->pkt.secret_key;
+                        if ( !(subsk->is_protected
+                               && (subsk->protect.s2k.mode == 1001 
+                                   || subsk->protect.s2k.mode == 1002))) {
+                            subsk->protect.algo = dek->algo;
+                            subsk->protect.s2k = *s2k;
+                            rc = protect_secret_key( subsk, dek );
+                        }
+                   }
+               }
+               if( rc )
+                   log_error("protect_secret_key failed: %s\n",
+                              g10_errstr(rc) );
+               else
+                   changed++;
+               break;
+           }
+       }
+       xfree(s2k);
+       xfree(dek);
+    }
+
+  leave:
+    xfree( passphrase );
+    set_next_passphrase( NULL );
+    return changed && !rc;
+}
+
+
+/****************
+ * There are some keys out (due to a bug in gnupg), where the sequence
+ * of the packets is wrong.  This function fixes that.
+ * Returns: true if the keyblock has been fixed.
+ *
+ * Note:  This function does not work if there is more than one user ID.
+ */
+static int
+fix_keyblock( KBNODE keyblock )
+{
+    KBNODE node, last, subkey;
+    int fixed=0;
+
+    /* locate key signatures of class 0x10..0x13 behind sub key packets */
+    for( subkey=last=NULL, node = keyblock; node;
+                                           last=node, node = node->next ) {
+       switch( node->pkt->pkttype ) {
+         case PKT_PUBLIC_SUBKEY:
+         case PKT_SECRET_SUBKEY:
+           if( !subkey )
+               subkey = last; /* actually it is the one before the subkey */
+           break;
+         case PKT_SIGNATURE:
+           if( subkey ) {
+               PKT_signature *sig = node->pkt->pkt.signature;
+               if( sig->sig_class >= 0x10 && sig->sig_class <= 0x13 ) {
+                   log_info(_(
+                       "moving a key signature to the correct place\n"));
+                   last->next = node->next;
+                   node->next = subkey->next;
+                   subkey->next = node;
+                   node = last;
+                   fixed=1;
+               }
+           }
+           break;
+         default: break;
+       }
+    }
+
+    return fixed;
+}
+
+static int
+parse_sign_type(const char *str,int *localsig,int *nonrevokesig,int *trustsig)
+{
+  const char *p=str;
+
+  while(*p)
+    {
+      if(ascii_strncasecmp(p,"l",1)==0)
+       {
+         *localsig=1;
+         p++;
+       }
+      else if(ascii_strncasecmp(p,"nr",2)==0)
+       {
+         *nonrevokesig=1;
+         p+=2;
+       }
+      else if(ascii_strncasecmp(p,"t",1)==0)
+       {
+         *trustsig=1;
+         p++;
+       }
+      else
+       return 0;
+    }
+
+  return 1;
+}
+
+\f
+/****************
+ * Menu driven key editor.  If seckey_check is true, then a secret key
+ * that matches username will be looked for.  If it is false, not all
+ * commands will be available.
+ *
+ * Note: to keep track of some selection we use node->mark MARKBIT_xxxx.
+ */
+
+/* Need an SK for this command */
+#define KEYEDIT_NEED_SK 1
+/* Cannot be viewing the SK for this command */
+#define KEYEDIT_NOT_SK  2
+/* Must be viewing the SK for this command */
+#define KEYEDIT_ONLY_SK 4
+/* Match the tail of the string */
+#define KEYEDIT_TAIL_MATCH 8
+
+enum cmdids
+  {
+    cmdNONE = 0,
+    cmdQUIT, cmdHELP, cmdFPR, cmdLIST, cmdSELUID, cmdCHECK, cmdSIGN,
+    cmdREVSIG, cmdREVKEY, cmdREVUID, cmdDELSIG, cmdPRIMARY, cmdDEBUG,
+    cmdSAVE, cmdADDUID, cmdADDPHOTO, cmdDELUID, cmdADDKEY, cmdDELKEY,
+    cmdADDREVOKER, cmdTOGGLE, cmdSELKEY, cmdPASSWD, cmdTRUST, cmdPREF,
+    cmdEXPIRE, cmdBACKSIGN, cmdENABLEKEY, cmdDISABLEKEY, cmdSHOWPREF,
+    cmdSETPREF, cmdPREFKS, cmdNOTATION, cmdINVCMD, cmdSHOWPHOTO, cmdUPDTRUST,
+    cmdCHKTRUST, cmdADDCARDKEY, cmdKEYTOCARD, cmdBKUPTOCARD, cmdCLEAN,
+    cmdMINIMIZE, cmdNOP
+  };
+
+static struct
+{
+  const char *name;
+  enum cmdids id;
+  int flags;
+  const char *desc;
+} cmds[] =
+  { 
+    { "quit"    , cmdQUIT      , 0, N_("quit this menu") },
+    { "q"       , cmdQUIT      , 0, NULL   },
+    { "save"    , cmdSAVE      , 0, N_("save and quit") },
+    { "help"    , cmdHELP      , 0, N_("show this help") },
+    { "?"       , cmdHELP      , 0, NULL   },
+    { "fpr"     , cmdFPR       , 0, N_("show key fingerprint") },
+    { "list"    , cmdLIST      , 0, N_("list key and user IDs") },
+    { "l"       , cmdLIST      , 0, NULL   },
+    { "uid"     , cmdSELUID    , 0, N_("select user ID N") },
+    { "key"     , cmdSELKEY    , 0, N_("select subkey N") },
+    { "check"   , cmdCHECK     , 0, N_("check signatures") },
+    { "c"       , cmdCHECK     , 0, NULL },
+    { "cross-certify", cmdBACKSIGN  , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK, NULL },
+    { "backsign", cmdBACKSIGN  , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK, NULL },
+    { "sign"    , cmdSIGN      , KEYEDIT_NOT_SK|KEYEDIT_TAIL_MATCH,
+      N_("sign selected user IDs [* see below for related commands]") },
+    { "s"       , cmdSIGN      , KEYEDIT_NOT_SK, NULL },
+    /* "lsign" and friends will never match since "sign" comes first
+       and it is a tail match.  They are just here so they show up in
+       the help menu. */
+    { "lsign"   , cmdNOP       , 0, N_("sign selected user IDs locally") },
+    { "tsign"   , cmdNOP       , 0,
+      N_("sign selected user IDs with a trust signature") },
+    { "nrsign"  , cmdNOP       , 0,
+      N_("sign selected user IDs with a non-revocable signature") },
+
+    { "debug"   , cmdDEBUG     , 0, NULL },
+    { "adduid"  , cmdADDUID    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("add a user ID") },
+    { "addphoto", cmdADDPHOTO  , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("add a photo ID") },
+    { "deluid"  , cmdDELUID    , KEYEDIT_NOT_SK,
+      N_("delete selected user IDs") },
+    /* delphoto is really deluid in disguise */
+    { "delphoto", cmdDELUID    , KEYEDIT_NOT_SK, NULL },
+
+    { "addkey"  , cmdADDKEY    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("add a subkey") },
+
+#ifdef ENABLE_CARD_SUPPORT
+    { "addcardkey", cmdADDCARDKEY , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("add a key to a smartcard") },
+    { "keytocard", cmdKEYTOCARD , KEYEDIT_NEED_SK|KEYEDIT_ONLY_SK, 
+      N_("move a key to a smartcard")},
+    { "bkuptocard", cmdBKUPTOCARD , KEYEDIT_NEED_SK|KEYEDIT_ONLY_SK, 
+      N_("move a backup key to a smartcard")},
+#endif /*ENABLE_CARD_SUPPORT*/
+
+    { "delkey"  , cmdDELKEY    , KEYEDIT_NOT_SK,
+      N_("delete selected subkeys") },
+    { "addrevoker",cmdADDREVOKER,KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("add a revocation key") },
+    { "delsig"  , cmdDELSIG    , KEYEDIT_NOT_SK,
+      N_("delete signatures from the selected user IDs") },
+    { "expire"  , cmdEXPIRE    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("change the expiration date for the key or selected subkeys") },
+    { "primary" , cmdPRIMARY   , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("flag the selected user ID as primary")},
+    { "toggle"  , cmdTOGGLE    , KEYEDIT_NEED_SK,
+      N_("toggle between the secret and public key listings") },
+    { "t"       , cmdTOGGLE    , KEYEDIT_NEED_SK, NULL },
+    { "pref"    , cmdPREF      , KEYEDIT_NOT_SK,
+      N_("list preferences (expert)")},
+    { "showpref", cmdSHOWPREF  , KEYEDIT_NOT_SK,
+      N_("list preferences (verbose)") },
+    { "setpref" , cmdSETPREF   , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("set preference list for the selected user IDs") },
+    /* Alias */
+    { "updpref" , cmdSETPREF   , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK, NULL },
+
+    { "keyserver",cmdPREFKS    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("set the preferred keyserver URL for the selected user IDs")},
+    { "notation", cmdNOTATION  , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("set a notation for the selected user IDs")},
+    { "passwd"  , cmdPASSWD    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("change the passphrase") },
+    /* Alias */
+    { "password", cmdPASSWD    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK, NULL },
+
+    { "trust"   , cmdTRUST     , KEYEDIT_NOT_SK, N_("change the ownertrust") },
+    { "revsig"  , cmdREVSIG    , KEYEDIT_NOT_SK,
+      N_("revoke signatures on the selected user IDs") },
+    { "revuid"  , cmdREVUID    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("revoke selected user IDs") },
+    /* Alias */
+    { "revphoto", cmdREVUID    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK, NULL },
+
+    { "revkey"  , cmdREVKEY    , KEYEDIT_NOT_SK|KEYEDIT_NEED_SK,
+      N_("revoke key or selected subkeys") },
+    { "enable"  , cmdENABLEKEY , KEYEDIT_NOT_SK, N_("enable key") },
+    { "disable" , cmdDISABLEKEY, KEYEDIT_NOT_SK, N_("disable key") },
+    { "showphoto",cmdSHOWPHOTO , 0, N_("show selected photo IDs") },
+    { "clean",    cmdCLEAN     , KEYEDIT_NOT_SK,
+      N_("compact unusable user IDs and remove unusable signatures from key")},
+    { "minimize", cmdMINIMIZE  , KEYEDIT_NOT_SK,
+      N_("compact unusable user IDs and remove all signatures from key") },
+    { NULL, cmdNONE, 0, NULL }
+  };
+
+#ifdef HAVE_LIBREADLINE
+
+/* These two functions are used by readline for command completion. */
+
+static char *
+command_generator(const char *text,int state)
+{
+  static int list_index,len;
+  const char *name;
+
+  /* If this is a new word to complete, initialize now.  This includes
+     saving the length of TEXT for efficiency, and initializing the
+     index variable to 0. */
+  if(!state)
+    {
+      list_index=0;
+      len=strlen(text);
+    }
+
+  /* Return the next partial match */
+  while((name=cmds[list_index].name))
+    {
+      /* Only complete commands that have help text */
+      if(cmds[list_index++].desc && strncmp(name,text,len)==0)
+       return strdup(name);
+    }
+
+  return NULL;
+}
+
+static char **
+keyedit_completion(const char *text, int start, int end)
+{
+  /* If we are at the start of a line, we try and command-complete.
+     If not, just do nothing for now. */
+
+  if(start==0)
+    return rl_completion_matches(text,command_generator);
+
+  rl_attempted_completion_over=1;
+
+  return NULL;
+}
+#endif /* HAVE_LIBREADLINE */
+
+
+void
+keyedit_menu( const char *username, STRLIST locusr,
+             STRLIST commands, int quiet, int seckey_check )
+{
+    enum cmdids cmd = 0;
+    int rc = 0;
+    KBNODE keyblock = NULL;
+    KEYDB_HANDLE kdbhd = NULL;
+    KBNODE sec_keyblock = NULL;
+    KEYDB_HANDLE sec_kdbhd = NULL;
+    KBNODE cur_keyblock;
+    char *answer = NULL;
+    int redisplay = 1;
+    int modified = 0;
+    int sec_modified = 0;
+    int toggle;
+    int have_commands = !!commands;
+
+    if ( opt.command_fd != -1 )
+        ;
+    else if( opt.batch && !have_commands )
+      {
+       log_error(_("can't do this in batch mode\n"));
+       goto leave;
+      }
+
+#ifdef HAVE_W32_SYSTEM
+    /* Due to Windows peculiarities we need to make sure that the
+       trustdb stale check is done before we open another file
+       (i.e. by searching for a key).  In theory we could make sure
+       that the files are closed after use but the open/close caches
+       inhibits that and flushing the cache right before the stale
+       check is not easy to implement.  Thus we take the easy way out
+       and run the stale check as early as possible.  Note, that for
+       non- W32 platforms it is run indirectly trough a call to
+       get_validity ().  */
+    check_trustdb_stale ();
+#endif
+
+    /* Get the public key */
+    rc = get_pubkey_byname (NULL, username, &keyblock, &kdbhd, 1);
+    if( rc )
+       goto leave;
+    if( fix_keyblock( keyblock ) )
+       modified++;
+    if( collapse_uids( &keyblock ) )
+       modified++;
+    reorder_keyblock(keyblock);
+
+    if(seckey_check)
+      {/* see whether we have a matching secret key */
+        PKT_public_key *pk = keyblock->pkt->pkt.public_key;
+
+        sec_kdbhd = keydb_new (1);
+        {
+            byte afp[MAX_FINGERPRINT_LEN];
+            size_t an;
+
+            fingerprint_from_pk (pk, afp, &an);
+            while (an < MAX_FINGERPRINT_LEN) 
+                afp[an++] = 0;
+            rc = keydb_search_fpr (sec_kdbhd, afp);
+        }
+       if (!rc)
+         {
+           rc = keydb_get_keyblock (sec_kdbhd, &sec_keyblock);
+           if (rc)
+             {
+               log_error (_("error reading secret keyblock \"%s\": %s\n"),
+                          username, g10_errstr(rc));
+             }
+            else
+             {
+                merge_keys_and_selfsig( sec_keyblock );
+                if( fix_keyblock( sec_keyblock ) )
+                 sec_modified++;
+             }
+         }
+
+        if (rc) {
+            sec_keyblock = NULL;
+            keydb_release (sec_kdbhd); sec_kdbhd = NULL;
+            rc = 0;
+        }
+
+       if( sec_keyblock && !quiet )
+         tty_printf(_("Secret key is available.\n"));
+    }
+
+    toggle = 0;
+    cur_keyblock = keyblock;
+    for(;;) { /* main loop */
+       int i, arg_number, photo;
+        const char *arg_string = "";
+       char *p;
+       PKT_public_key *pk=keyblock->pkt->pkt.public_key;
+
+       tty_printf("\n");
+
+       if( redisplay && !quiet )
+         {
+           show_key_with_all_names( cur_keyblock, 0, 1, 0, 1, 0 );
+           tty_printf("\n");
+           redisplay = 0;
+         }
+       do {
+           xfree(answer);
+           if( have_commands ) {
+               if( commands ) {
+                   answer = xstrdup( commands->d );
+                   commands = commands->next;
+               }
+               else if( opt.batch ) {
+                   answer = xstrdup("quit");
+               }
+               else
+                   have_commands = 0;
+           }
+           if( !have_commands )
+             {
+               tty_enable_completion(keyedit_completion);
+               answer = cpr_get_no_help("keyedit.prompt", _("Command> "));
+               cpr_kill_prompt();
+               tty_disable_completion();
+             }
+           trim_spaces(answer);
+       } while( *answer == '#' );
+
+       arg_number = 0; /* Yes, here is the init which egcc complains about */
+       photo = 0; /* This too */
+       if( !*answer )
+           cmd = cmdLIST;
+       else if( *answer == CONTROL_D )
+           cmd = cmdQUIT;
+       else if( digitp(answer ) ) {
+           cmd = cmdSELUID;
+           arg_number = atoi(answer);
+       }
+       else {
+           if( (p=strchr(answer,' ')) ) {
+               *p++ = 0;
+               trim_spaces(answer);
+               trim_spaces(p);
+               arg_number = atoi(p);
+                arg_string = p;
+           }
+
+           for(i=0; cmds[i].name; i++ )
+             {
+               if(cmds[i].flags & KEYEDIT_TAIL_MATCH)
+                 {
+                   size_t l=strlen(cmds[i].name);
+                   size_t a=strlen(answer);
+                   if(a>=l)
+                     {
+                       if(ascii_strcasecmp(&answer[a-l],cmds[i].name)==0)
+                         {
+                           answer[a-l]='\0';
+                           break;
+                         }
+                     }
+                 }
+               else if( !ascii_strcasecmp( answer, cmds[i].name ) )
+                 break;
+             }
+           if((cmds[i].flags & KEYEDIT_NEED_SK) && !sec_keyblock )
+             {
+               tty_printf(_("Need the secret key to do this.\n"));
+               cmd = cmdNOP;
+             }
+           else if(((cmds[i].flags & KEYEDIT_NOT_SK) && sec_keyblock
+                    && toggle)
+                    ||((cmds[i].flags & KEYEDIT_ONLY_SK) && sec_keyblock
+                      && !toggle))
+             {
+               tty_printf(_("Please use the command \"toggle\" first.\n"));
+               cmd = cmdNOP;
+             }
+           else
+             cmd = cmds[i].id;
+       }
+       switch( cmd )
+         {
+         case cmdHELP:
+           for(i=0; cmds[i].name; i++ )
+             {
+               if((cmds[i].flags & KEYEDIT_NEED_SK) && !sec_keyblock )
+                 ; /* skip if we do not have the secret key */
+               else if( cmds[i].desc )
+                 tty_printf("%-11s %s\n", cmds[i].name, _(cmds[i].desc) );
+             }
+
+           tty_printf("\n");
+           tty_printf(_(
+"* The `sign' command may be prefixed with an `l' for local "
+"signatures (lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"));
+
+           break;
+
+         case cmdLIST:
+           redisplay = 1;
+           break;
+
+         case cmdFPR:
+           show_key_and_fingerprint( keyblock );
+           break;
+
+         case cmdSELUID:
+           if(strlen(arg_string)==NAMEHASH_LEN*2)
+             redisplay=menu_select_uid_namehash(cur_keyblock,arg_string);
+           else
+             redisplay=menu_select_uid(cur_keyblock,arg_number);
+           break;
+
+         case cmdSELKEY:
+           if( menu_select_key( cur_keyblock, arg_number ) )
+               redisplay = 1;
+           break;
+
+         case cmdCHECK:
+           /* we can only do this with the public key becuase the
+            * check functions can't cope with secret keys and it
+            * is questionable whether this would make sense at all */
+           check_all_keysigs( keyblock, count_selected_uids(keyblock) );
+           break;
+
+         case cmdSIGN: /* sign (only the public key) */
+           {
+             int localsig=0,nonrevokesig=0,trustsig=0,interactive=0;
+
+             if( pk->is_revoked )
+               {
+                 tty_printf(_("Key is revoked."));
+
+                 if(opt.expert)
+                   {
+                     tty_printf("  ");
+                     if(!cpr_get_answer_is_yes("keyedit.sign_revoked.okay",
+                                               _("Are you sure you still want"
+                                                 " to sign it? (y/N) ")))
+                       break;
+                   }
+                 else
+                   {
+                     tty_printf(_("  Unable to sign.\n"));
+                     break;
+                   }
+               }
+
+             if(count_uids(keyblock) > 1 && !count_selected_uids(keyblock)
+                && !cpr_get_answer_is_yes("keyedit.sign_all.okay",
+                                          _("Really sign all user IDs?"
+                                            " (y/N) ")))
+                {
+                  if(opt.interactive)
+                   interactive=1;
+                 else
+                    {
+                     tty_printf(_("Hint: Select the user IDs to sign\n"));
+                      have_commands = 0;
+                      break;
+                    }
+
+                }
+             /* What sort of signing are we doing? */
+             if(!parse_sign_type(answer,&localsig,&nonrevokesig,&trustsig))
+               {
+                 tty_printf(_("Unknown signature type `%s'\n"),answer);
+                 break;
+               }
+
+             sign_uids(keyblock, locusr, &modified,
+                       localsig, nonrevokesig, trustsig, interactive);
+           }
+           break;
+
+         case cmdDEBUG:
+           dump_kbnode( cur_keyblock );
+           break;
+
+         case cmdTOGGLE:
+           toggle = !toggle;
+           cur_keyblock = toggle? sec_keyblock : keyblock;
+           redisplay = 1;
+           break;
+
+         case cmdADDPHOTO:
+            if (RFC2440 || RFC1991 || PGP2)
+              {
+                tty_printf(
+                   _("This command is not allowed while in %s mode.\n"),
+                  RFC2440?"OpenPGP":PGP2?"PGP2":"RFC-1991");
+                break;
+              }
+           photo=1;
+           /* fall through */
+
+         case cmdADDUID:
+           if( menu_adduid( keyblock, sec_keyblock, photo, arg_string ) )
+             {
+               update_trust = 1;
+               redisplay = 1;
+               sec_modified = modified = 1;
+               merge_keys_and_selfsig( sec_keyblock );
+               merge_keys_and_selfsig( keyblock );
+             }
+           break;
+
+         case cmdDELUID: {
+               int n1;
+
+               if( !(n1=count_selected_uids(keyblock)) )
+                   tty_printf(_("You must select at least one user ID.\n"));
+               else if( real_uids_left(keyblock) < 1 )
+                   tty_printf(_("You can't delete the last user ID!\n"));
+               else if( cpr_get_answer_is_yes("keyedit.remove.uid.okay",
+               n1 > 1? _("Really remove all selected user IDs? (y/N) ")
+                           : _("Really remove this user ID? (y/N) ")
+                      ) ) {
+                   menu_deluid( keyblock, sec_keyblock );
+                   redisplay = 1;
+                   modified = 1;
+                   if( sec_keyblock )
+                      sec_modified = 1;
+               }
+           }
+           break;
+
+         case cmdDELSIG: {
+               int n1;
+
+               if( !(n1=count_selected_uids(keyblock)) )
+                   tty_printf(_("You must select at least one user ID.\n"));
+               else if( menu_delsig( keyblock ) ) {
+                   /* no redisplay here, because it may scroll away some
+                    * status output of delsig */
+                   modified = 1;
+               }
+           }
+           break;
+
+         case cmdADDKEY:
+           if( generate_subkeypair( keyblock, sec_keyblock ) ) {
+               redisplay = 1;
+               sec_modified = modified = 1;
+               merge_keys_and_selfsig( sec_keyblock );
+               merge_keys_and_selfsig( keyblock );
+           }
+           break;
+
+#ifdef ENABLE_CARD_SUPPORT
+         case cmdADDCARDKEY:
+           if (card_generate_subkey (keyblock, sec_keyblock)) {
+               redisplay = 1;
+               sec_modified = modified = 1;
+               merge_keys_and_selfsig( sec_keyblock );
+               merge_keys_and_selfsig( keyblock );
+           }
+           break;
+
+        case cmdKEYTOCARD:
+         {
+           KBNODE node=NULL;
+           switch ( count_selected_keys (sec_keyblock) )
+             {
+             case 0:
+               if (cpr_get_answer_is_yes("keyedit.keytocard.use_primary",
+                                    _("Really move the primary key? (y/N) ")))
+                 node = sec_keyblock;
+               break;
+             case 1:
+               for (node = sec_keyblock; node; node = node->next )
+                 {
+                   if (node->pkt->pkttype == PKT_SECRET_SUBKEY 
+                       && node->flag & NODFLG_SELKEY)
+                     break;
+                 }
+               break;
+             default:
+               tty_printf(_("You must select exactly one key.\n"));
+               break;
+             }
+           if (node)
+             {
+               PKT_public_key *xxpk = find_pk_from_sknode (keyblock, node);
+               if (card_store_subkey (node, xxpk?xxpk->pubkey_usage:0))
+                 {
+                   redisplay = 1;
+                   sec_modified = 1;
+                 }
+             }
+         }
+          break;
+
+        case cmdBKUPTOCARD:
+         {
+            /* 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;
+            PACKET *pkt;
+            IOBUF a;
+
+            fname = arg_string;
+            if (!*fname)
+              {
+                tty_printf (_("Command expects a filename argument\n"));
+                break;
+              }
+
+            /* Open that file.  */
+            a = iobuf_open (fname);
+            if (a && is_secured_file (iobuf_get_fd (a)))
+              {
+                iobuf_close (a);
+                a = NULL;
+                errno = EPERM;
+              }
+            if (!a)
+              {
+               tty_printf (_("Can't open `%s': %s\n"),
+                            fname, strerror(errno));
+                break;
+              }
+            
+            /* Parse and check that file.  */
+            pkt = xmalloc (sizeof *pkt);
+            init_packet (pkt);
+            rc = parse_packet (a, pkt);
+            iobuf_close (a);
+            iobuf_ioctl (NULL, 2, 0, (char*)fname); /* (invalidate cache).  */
+            if (!rc 
+                && pkt->pkttype != PKT_SECRET_KEY 
+                && pkt->pkttype != PKT_SECRET_SUBKEY)
+              rc = G10ERR_NO_SECKEY;
+            if (rc)
+              {
+                tty_printf(_("Error reading backup key from `%s': %s\n"),
+                           fname, g10_errstr (rc));
+                free_packet (pkt);
+                xfree (pkt);
+                break;
+              }
+            node = new_kbnode (pkt);
+
+            /* Store it.  */
+            if (card_store_subkey (node, 0))
+              {
+                redisplay = 1;
+                sec_modified = 1;
+              }
+            release_kbnode (node);
+         }
+          break;
+
+#endif /* ENABLE_CARD_SUPPORT */
+
+         case cmdDELKEY: {
+               int n1;
+
+               if( !(n1=count_selected_keys( keyblock )) )
+                   tty_printf(_("You must select at least one key.\n"));
+               else if( !cpr_get_answer_is_yes( "keyedit.remove.subkey.okay",
+                      n1 > 1?
+                  _("Do you really want to delete the selected keys? (y/N) "):
+                       _("Do you really want to delete this key? (y/N) ")
+                      ))
+                   ;
+               else {
+                   menu_delkey( keyblock, sec_keyblock );
+                   redisplay = 1;
+                   modified = 1;
+                   if( sec_keyblock )
+                      sec_modified = 1;
+               }
+           }
+           break;
+
+         case cmdADDREVOKER:
+           {
+             int sensitive=0;
+
+             if(ascii_strcasecmp(arg_string,"sensitive")==0)
+               sensitive=1;
+             if( menu_addrevoker( keyblock, sec_keyblock, sensitive ) ) {
+               redisplay = 1;
+               sec_modified = modified = 1;
+               merge_keys_and_selfsig( sec_keyblock );
+               merge_keys_and_selfsig( keyblock );
+             }
+           }
+           break;
+
+         case cmdREVUID: {
+               int n1;
+
+               if( !(n1=count_selected_uids(keyblock)) )
+                   tty_printf(_("You must select at least one user ID.\n"));
+               else if( cpr_get_answer_is_yes(
+                           "keyedit.revoke.uid.okay",
+                      n1 > 1? _("Really revoke all selected user IDs? (y/N) ")
+                            : _("Really revoke this user ID? (y/N) ")
+                      ) ) {
+                 if(menu_revuid(keyblock,sec_keyblock))
+                   {
+                     modified=1;
+                     redisplay=1;
+                   }
+               }
+           }
+           break;
+
+         case cmdREVKEY:
+           {
+             int n1;
+
+             if( !(n1=count_selected_keys( keyblock )) )
+               {
+                 if(cpr_get_answer_is_yes("keyedit.revoke.subkey.okay",
+                                          _("Do you really want to revoke"
+                                            " the entire key? (y/N) ")))
+                   {
+                     if(menu_revkey(keyblock,sec_keyblock))
+                       modified=1;
+
+                     redisplay=1;
+                   }
+               }
+             else if(cpr_get_answer_is_yes("keyedit.revoke.subkey.okay",
+                                           n1 > 1?
+                                           _("Do you really want to revoke"
+                                             " the selected subkeys? (y/N) "):
+                                           _("Do you really want to revoke"
+                                             " this subkey? (y/N) ")))
+               {
+                 if( menu_revsubkey( keyblock, sec_keyblock ) )
+                   modified = 1;
+
+                 redisplay = 1;
+               }
+
+             if(modified)
+               merge_keys_and_selfsig( keyblock );
+           }
+           break;
+
+         case cmdEXPIRE:
+           if( menu_expire( keyblock, sec_keyblock ) )
+             {
+               merge_keys_and_selfsig( sec_keyblock );
+               merge_keys_and_selfsig( keyblock );
+               sec_modified = 1;
+               modified = 1;
+               redisplay = 1;
+             }
+           break;
+
+         case cmdBACKSIGN:
+           if(menu_backsign(keyblock,sec_keyblock))
+             {
+               sec_modified = 1;
+               modified = 1;
+               redisplay = 1;
+             }
+           break;
+
+         case cmdPRIMARY:
+           if( menu_set_primary_uid ( keyblock, sec_keyblock ) ) {
+               merge_keys_and_selfsig( keyblock );
+               modified = 1;
+               redisplay = 1;
+           }
+           break;
+
+         case cmdPASSWD:
+           if( change_passphrase( sec_keyblock ) )
+               sec_modified = 1;
+           break;
+
+         case cmdTRUST:
+           if(opt.trust_model==TM_EXTERNAL)
+             {
+               tty_printf(_("Owner trust may not be set while "
+                            "using an user provided trust database\n"));
+               break;
+             }
+
+           show_key_with_all_names( keyblock, 0, 0, 0, 1, 0 );
+           tty_printf("\n");
+           if( edit_ownertrust( find_kbnode( keyblock,
+                                 PKT_PUBLIC_KEY )->pkt->pkt.public_key, 1 ) ) {
+               redisplay = 1;
+               /* No real need to set update_trust here as
+                  edit_ownertrust() calls revalidation_mark()
+                  anyway. */
+               update_trust=1;
+            }
+           break;
+
+         case cmdPREF:
+           {
+             int count=count_selected_uids(keyblock);
+             assert(keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+             show_names(keyblock,keyblock->pkt->pkt.public_key,
+                        count?NODFLG_SELUID:0,1);
+           }
+           break;
+
+         case cmdSHOWPREF:
+           {
+             int count=count_selected_uids(keyblock);
+             assert(keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+             show_names(keyblock,keyblock->pkt->pkt.public_key,
+                        count?NODFLG_SELUID:0,2);
+           }
+           break;
+
+          case cmdSETPREF:
+           {
+             PKT_user_id *tempuid;
+
+             keygen_set_std_prefs(!*arg_string?"default" : arg_string, 0);
+
+             tempuid=keygen_get_std_prefs();
+             tty_printf(_("Set preference list to:\n"));
+             show_prefs(tempuid,NULL,1);
+             free_user_id(tempuid);
+
+             if(cpr_get_answer_is_yes("keyedit.setpref.okay",
+                                      count_selected_uids (keyblock)?
+                                      _("Really update the preferences"
+                                        " for the selected user IDs? (y/N) "):
+                                      _("Really update the preferences? (y/N) ")))
+               {
+                 if ( menu_set_preferences (keyblock, sec_keyblock) )
+                   {
+                     merge_keys_and_selfsig (keyblock);
+                     modified = 1;
+                     redisplay = 1;
+                   }
+               }
+           }
+           break;
+
+         case cmdPREFKS:
+           if( menu_set_keyserver_url ( *arg_string?arg_string:NULL,
+                                        keyblock, sec_keyblock ) )
+             {
+               merge_keys_and_selfsig( keyblock );
+               modified = 1;
+               redisplay = 1;
+             }
+           break;
+
+         case cmdNOTATION:
+           if( menu_set_notation ( *arg_string?arg_string:NULL,
+                                   keyblock, sec_keyblock ) )
+             {
+               merge_keys_and_selfsig( keyblock );
+               modified = 1;
+               redisplay = 1;
+             }
+           break;
+
+         case cmdNOP:
+           break;
+
+         case cmdREVSIG:
+           if( menu_revsig( keyblock ) ) {
+               redisplay = 1;
+               modified = 1;
+           }
+           break;
+
+         case cmdENABLEKEY:
+         case cmdDISABLEKEY:
+           if( enable_disable_key( keyblock, cmd == cmdDISABLEKEY ) ) {
+               redisplay = 1;
+               modified = 1;
+           }
+           break;
+
+         case cmdSHOWPHOTO:
+           menu_showphoto(keyblock);
+           break;
+
+         case cmdCLEAN:
+           redisplay=modified=menu_clean(keyblock,0);
+           break;
+
+         case cmdMINIMIZE:
+           redisplay=modified=menu_clean(keyblock,1);
+           break;
+
+         case cmdQUIT:
+           if( have_commands )
+               goto leave;
+           if( !modified && !sec_modified )
+               goto leave;
+           if( !cpr_get_answer_is_yes("keyedit.save.okay",
+                                       _("Save changes? (y/N) ")) ) {
+               if( cpr_enabled()
+                   || cpr_get_answer_is_yes("keyedit.cancel.okay",
+                                            _("Quit without saving? (y/N) ")))
+                   goto leave;
+               break;
+           }
+           /* fall thru */
+         case cmdSAVE:
+           if( modified || sec_modified  ) {
+               if( modified ) {
+                   rc = keydb_update_keyblock (kdbhd, keyblock);
+                   if( rc ) {
+                       log_error(_("update failed: %s\n"), g10_errstr(rc) );
+                       break;
+                   }
+               }
+               if( sec_modified ) {
+                   rc = keydb_update_keyblock (sec_kdbhd, sec_keyblock );
+                   if( rc ) {
+                       log_error( _("update secret failed: %s\n"),
+                                   g10_errstr(rc) );
+                       break;
+                   }
+               }
+           }
+           else
+               tty_printf(_("Key not changed so no update needed.\n"));
+
+           if( update_trust )
+             {
+               revalidation_mark ();
+               update_trust=0;
+             }
+           goto leave;
+
+         case cmdINVCMD:
+         default:
+           tty_printf("\n");
+           tty_printf(_("Invalid command  (try \"help\")\n"));
+           break;
+       }
+    } /* end main loop */
+
+  leave:
+    release_kbnode( keyblock );
+    release_kbnode( sec_keyblock );
+    keydb_release (kdbhd);
+    xfree(answer);
+}
+
+static void
+tty_print_notations(int indent,PKT_signature *sig)
+{
+  int first=1;
+  struct notation *notation,*nd;
+
+  if(indent<0)
+    {
+      first=0;
+      indent=-indent;
+    }
+
+  notation=sig_to_notation(sig);
+
+  for(nd=notation;nd;nd=nd->next)
+    {
+      if(!first)
+       tty_printf("%*s",indent,"");
+      else
+       first=0;
+
+      tty_print_utf8_string(nd->name,strlen(nd->name));
+      tty_printf("=");
+      tty_print_utf8_string(nd->value,strlen(nd->value));
+      tty_printf("\n");
+    }
+
+  free_notation(notation);
+}
+
+/****************
+ * show preferences of a public keyblock.
+ */
+static void
+show_prefs (PKT_user_id *uid, PKT_signature *selfsig, int verbose)
+{
+    const prefitem_t fake={0,0};
+    const prefitem_t *prefs;
+    int i;
+
+    if( !uid )
+        return;
+
+    if( uid->prefs )
+        prefs=uid->prefs;
+    else if(verbose)
+        prefs=&fake;
+    else
+      return;
+
+    if (verbose) {
+        int any, des_seen=0, sha1_seen=0, uncomp_seen=0;
+
+        tty_printf ("     ");
+       tty_printf (_("Cipher: "));
+        for(i=any=0; prefs[i].type; i++ ) {
+            if( prefs[i].type == PREFTYPE_SYM ) {
+                const char *s = cipher_algo_to_string (prefs[i].value);
+                
+                if (any)
+                    tty_printf (", ");
+                any = 1;
+                /* We don't want to display strings for experimental algos */
+                if (s && prefs[i].value < 100 )
+                    tty_printf ("%s", s );
+                else
+                    tty_printf ("[%d]", prefs[i].value);
+                if (prefs[i].value == CIPHER_ALGO_3DES )
+                    des_seen = 1;
+            }    
+        }
+        if (!des_seen) {
+            if (any)
+                tty_printf (", ");
+            tty_printf ("%s",cipher_algo_to_string(CIPHER_ALGO_3DES));
+        }
+        tty_printf ("\n     ");
+       tty_printf (_("Digest: "));
+        for(i=any=0; prefs[i].type; i++ ) {
+            if( prefs[i].type == PREFTYPE_HASH ) {
+                const char *s = digest_algo_to_string (prefs[i].value);
+                
+                if (any)
+                    tty_printf (", ");
+                any = 1;
+                /* We don't want to display strings for experimental algos */
+                if (s && prefs[i].value < 100 )
+                    tty_printf ("%s", s );
+                else
+                    tty_printf ("[%d]", prefs[i].value);
+                if (prefs[i].value == DIGEST_ALGO_SHA1 )
+                    sha1_seen = 1;
+            }
+        }
+        if (!sha1_seen) {
+            if (any)
+                tty_printf (", ");
+            tty_printf ("%s",digest_algo_to_string(DIGEST_ALGO_SHA1));
+        }
+        tty_printf ("\n     ");
+       tty_printf (_("Compression: "));
+        for(i=any=0; prefs[i].type; i++ ) {
+            if( prefs[i].type == PREFTYPE_ZIP ) {
+                const char *s=compress_algo_to_string(prefs[i].value);
+                
+                if (any)
+                    tty_printf (", ");
+                any = 1;
+                /* We don't want to display strings for experimental algos */
+                if (s && prefs[i].value < 100 )
+                    tty_printf ("%s", s );
+                else
+                    tty_printf ("[%d]", prefs[i].value);
+                if (prefs[i].value == COMPRESS_ALGO_NONE )
+                    uncomp_seen = 1;
+            }
+        }
+        if (!uncomp_seen) {
+            if (any)
+                tty_printf (", ");
+           else {
+             tty_printf ("%s",compress_algo_to_string(COMPRESS_ALGO_ZIP));
+             tty_printf (", ");
+           }
+           tty_printf ("%s",compress_algo_to_string(COMPRESS_ALGO_NONE));
+        }
+       if(uid->flags.mdc || !uid->flags.ks_modify)
+         {
+           tty_printf ("\n     ");
+           tty_printf (_("Features: "));
+           any=0;
+           if(uid->flags.mdc)
+             {
+               tty_printf ("MDC");
+               any=1;
+             }
+           if(!uid->flags.ks_modify)
+             {
+               if(any)
+                 tty_printf (", ");
+               tty_printf (_("Keyserver no-modify"));
+             }
+         }
+       tty_printf("\n");
+
+       if(selfsig)
+         {
+           const byte *pref_ks;
+           size_t pref_ks_len;
+
+           pref_ks=parse_sig_subpkt(selfsig->hashed,
+                                    SIGSUBPKT_PREF_KS,&pref_ks_len);
+           if(pref_ks && pref_ks_len)
+             {
+               tty_printf ("     ");
+               tty_printf(_("Preferred keyserver: "));
+               tty_print_utf8_string(pref_ks,pref_ks_len);
+               tty_printf("\n");
+             }
+
+           if(selfsig->flags.notation)
+             {
+               tty_printf ("     ");
+               tty_printf(_("Notations: "));
+               tty_print_notations(5+strlen(_("Notations: ")),selfsig);
+             }
+         }
+    }
+    else {
+        tty_printf("    ");
+        for(i=0; prefs[i].type; i++ ) {
+            tty_printf( " %c%d", prefs[i].type == PREFTYPE_SYM   ? 'S' :
+                                 prefs[i].type == PREFTYPE_HASH  ? 'H' :
+                                 prefs[i].type == PREFTYPE_ZIP ? 'Z':'?',
+                                 prefs[i].value);
+        }
+        if (uid->flags.mdc)
+            tty_printf (" [mdc]");
+        if (!uid->flags.ks_modify)
+            tty_printf (" [no-ks-modify]");
+        tty_printf("\n");
+    }
+}
+
+/* This is the version of show_key_with_all_names used when
+   opt.with_colons is used.  It prints all available data in a easy to
+   parse format and does not translate utf8 */
+static void
+show_key_with_all_names_colon (KBNODE keyblock)
+{
+  KBNODE node;
+  int i, j, ulti_hack=0;
+  byte pk_version=0;
+  PKT_public_key *primary=NULL;
+
+  /* the keys */
+  for ( node = keyblock; node; node = node->next )
+    {
+      if (node->pkt->pkttype == PKT_PUBLIC_KEY
+          || (node->pkt->pkttype == PKT_PUBLIC_SUBKEY) )
+        {
+          PKT_public_key *pk = node->pkt->pkt.public_key;
+          u32 keyid[2];
+
+          if (node->pkt->pkttype == PKT_PUBLIC_KEY)
+            {
+              pk_version = pk->version;
+             primary=pk;
+           }
+
+          keyid_from_pk (pk, keyid);
+
+          fputs (node->pkt->pkttype == PKT_PUBLIC_KEY?"pub:":"sub:", stdout);
+          if (!pk->is_valid)
+            putchar ('i');
+          else if (pk->is_revoked)
+            putchar ('r');
+          else if (pk->has_expired)
+            putchar ('e');
+          else if (!(opt.fast_list_mode || opt.no_expensive_trust_checks ))
+           {
+             int trust = get_validity_info (pk, NULL);
+             if(trust=='u')
+               ulti_hack=1;
+             putchar (trust);
+           }
+
+          printf (":%u:%d:%08lX%08lX:%lu:%lu::",
+                  nbits_from_pk (pk),
+                  pk->pubkey_algo,
+                  (ulong)keyid[0], (ulong)keyid[1],
+                  (ulong)pk->timestamp,
+                  (ulong)pk->expiredate );
+          if (node->pkt->pkttype==PKT_PUBLIC_KEY
+             && !(opt.fast_list_mode || opt.no_expensive_trust_checks ))
+           putchar(get_ownertrust_info (pk));
+          putchar(':');
+          putchar('\n');
+          
+          print_fingerprint (pk, NULL, 0);
+         print_revokers(pk);
+        }
+    }
+  
+    /* the user ids */
+    i = 0;
+    for (node = keyblock; node; node = node->next) 
+      {
+       if ( node->pkt->pkttype == PKT_USER_ID )
+          {
+            PKT_user_id *uid = node->pkt->pkt.user_id;
+
+           ++i;
+
+           if(uid->attrib_data)
+             printf("uat:");
+           else
+             printf("uid:");
+
+           if ( uid->is_revoked )
+             printf("r::::::::");
+           else if ( uid->is_expired )
+             printf("e::::::::");
+           else if ( opt.fast_list_mode || opt.no_expensive_trust_checks )
+             printf("::::::::");
+           else
+             {
+               int uid_validity;
+
+               if( primary && !ulti_hack )
+                 uid_validity = get_validity_info( primary, uid );
+               else
+                 uid_validity = 'u';
+               printf("%c::::::::",uid_validity);
+             }
+
+           if(uid->attrib_data)
+             printf ("%u %lu",uid->numattribs,uid->attrib_len);
+           else
+             print_string (stdout, uid->name, uid->len, ':');
+
+            putchar (':');
+            /* signature class */
+            putchar (':');
+            /* capabilities */
+            putchar (':');
+            /* preferences */
+            if (pk_version>3 || uid->selfsigversion>3)
+              {
+                const prefitem_t *prefs = uid->prefs;
+                
+                for (j=0; prefs && prefs[j].type; j++)
+                  {
+                    if (j)
+                      putchar (' ');
+                    printf ("%c%d", prefs[j].type == PREFTYPE_SYM   ? 'S' :
+                            prefs[j].type == PREFTYPE_HASH  ? 'H' :
+                            prefs[j].type == PREFTYPE_ZIP ? 'Z':'?',
+                            prefs[j].value);
+                  } 
+                if (uid->flags.mdc)
+                  printf (",mdc");
+                if (!uid->flags.ks_modify)
+                  printf (",no-ks-modify");
+              } 
+            putchar (':');
+            /* flags */
+            printf ("%d,", i);
+            if (uid->is_primary)
+              putchar ('p');
+            if (uid->is_revoked)
+              putchar ('r');
+            if (uid->is_expired)
+              putchar ('e');
+            if ((node->flag & NODFLG_SELUID))
+              putchar ('s');
+            if ((node->flag & NODFLG_MARK_A))
+              putchar ('m');
+            putchar (':');
+            putchar('\n');
+          }
+      }
+}
+
+static void
+show_names(KBNODE keyblock,PKT_public_key *pk,unsigned int flag,int with_prefs)
+{
+  KBNODE node;
+  int i=0;
+
+  for( node = keyblock; node; node = node->next )
+    {
+      if( node->pkt->pkttype == PKT_USER_ID
+         && !is_deleted_kbnode(node))
+       {
+         PKT_user_id *uid = node->pkt->pkt.user_id;
+         ++i;
+         if(!flag || (flag && (node->flag & flag)))
+           {
+             if(!(flag&NODFLG_MARK_A) && pk)
+               tty_printf("%s ",uid_trust_string_fixed(pk,uid));
+
+             if( flag & NODFLG_MARK_A )
+               tty_printf("     ");
+             else if( node->flag & NODFLG_SELUID )
+               tty_printf("(%d)* ", i);
+             else if( uid->is_primary )
+               tty_printf("(%d). ", i);
+             else
+               tty_printf("(%d)  ", i);
+             tty_print_utf8_string( uid->name, uid->len );
+             tty_printf("\n");
+             if(with_prefs && pk)
+               {
+                 if(pk->version>3 || uid->selfsigversion>3)
+                   {
+                     PKT_signature *selfsig=NULL;
+                     KBNODE signode;
+
+                     for(signode=node->next;
+                         signode && signode->pkt->pkttype==PKT_SIGNATURE;
+                         signode=signode->next)
+                       {
+                         if(signode->pkt->pkt.signature->
+                            flags.chosen_selfsig)
+                           {
+                             selfsig=signode->pkt->pkt.signature;
+                             break;
+                           }
+                       }
+
+                     show_prefs (uid, selfsig, with_prefs == 2);
+                   }
+                 else
+                   tty_printf(_("There are no preferences on a"
+                                " PGP 2.x-style user ID.\n"));
+               }
+           }
+       }
+    }
+}
+
+/****************
+ * Display the key a the user ids, if only_marked is true, do only
+ * so for user ids with mark A flag set and dont display the index number
+ */
+static void
+show_key_with_all_names( KBNODE keyblock, int only_marked, int with_revoker,
+                        int with_fpr, int with_subkeys, int with_prefs )
+{
+    KBNODE node;
+    int i;
+    int do_warn = 0;
+    byte pk_version=0;
+    PKT_public_key *primary=NULL;
+
+    if (opt.with_colons)
+      {
+        show_key_with_all_names_colon (keyblock);
+        return;
+      }
+
+    /* the keys */
+    for( node = keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_KEY
+           || (with_subkeys && node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+               && !is_deleted_kbnode(node)) ) {
+           PKT_public_key *pk = node->pkt->pkt.public_key;
+           const char *otrust="err",*trust="err";
+
+           if( node->pkt->pkttype == PKT_PUBLIC_KEY ) {
+               /* do it here, so that debug messages don't clutter the
+                * output */
+                static int did_warn = 0;
+
+                trust = get_validity_string (pk, NULL);
+               otrust = get_ownertrust_string (pk);
+
+                /* Show a warning once */
+                if (!did_warn
+                    && (get_validity (pk, NULL) & TRUST_FLAG_PENDING_CHECK)) {
+                    did_warn = 1;
+                    do_warn = 1;
+                }
+
+               pk_version=pk->version;
+               primary=pk;
+           }
+
+           if(pk->is_revoked)
+             {
+               char *user=get_user_id_string_native(pk->revoked.keyid);
+               const char *algo=pubkey_algo_to_string(pk->revoked.algo);
+               tty_printf(_("This key was revoked on %s by %s key %s\n"),
+                          revokestr_from_pk(pk),algo?algo:"?",user);
+               xfree(user);
+             }
+
+           if(with_revoker)
+             {
+               if( !pk->revkey && pk->numrevkeys )
+                 BUG();
+               else
+                 for(i=0;i<pk->numrevkeys;i++)
+                   {
+                     u32 r_keyid[2];
+                     char *user;
+                     const char *algo=
+                       pubkey_algo_to_string(pk->revkey[i].algid);
+
+                     keyid_from_fingerprint(pk->revkey[i].fpr,
+                                            MAX_FINGERPRINT_LEN,r_keyid);
+
+                     user=get_user_id_string_native(r_keyid);
+                     tty_printf(_("This key may be revoked by %s key %s"),
+                                algo?algo:"?",user);
+
+                     if(pk->revkey[i].class&0x40)
+                       {
+                         tty_printf(" ");
+                         tty_printf(_("(sensitive)"));
+                       }
+
+                     tty_printf ("\n");
+                     xfree(user);
+                   }
+             }
+
+           keyid_from_pk(pk,NULL);
+           tty_printf("%s%c %4u%c/%s  ",
+                      node->pkt->pkttype == PKT_PUBLIC_KEY? "pub":"sub",
+                      (node->flag & NODFLG_SELKEY)? '*':' ',
+                      nbits_from_pk( pk ),
+                      pubkey_letter( pk->pubkey_algo ),
+                      keystr(pk->keyid));
+
+           tty_printf(_("created: %s"),datestr_from_pk(pk));
+           tty_printf("  ");
+           if(pk->is_revoked)
+             tty_printf(_("revoked: %s"),revokestr_from_pk(pk));
+           else if(pk->has_expired)
+             tty_printf(_("expired: %s"),expirestr_from_pk(pk));
+           else
+             tty_printf(_("expires: %s"),expirestr_from_pk(pk));
+           tty_printf("  ");
+            tty_printf(_("usage: %s"),usagestr_from_pk(pk));
+           tty_printf("\n");
+
+           if( node->pkt->pkttype == PKT_PUBLIC_KEY )
+             {
+               if(opt.trust_model!=TM_ALWAYS)
+                 {
+                   tty_printf("%*s", (int)keystrlen()+13,"");
+                   /* Ownertrust is only meaningful for the PGP or
+                      classic trust models */
+                   if(opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC)
+                     {
+                       int width=14-strlen(otrust);
+                       if(width<=0)
+                         width=1;
+                       tty_printf(_("trust: %s"), otrust);
+                       tty_printf("%*s",width,"");
+                     }
+                   
+                   tty_printf(_("validity: %s"), trust );
+                   tty_printf("\n");
+                 }
+               if( node->pkt->pkttype == PKT_PUBLIC_KEY
+                   && (get_ownertrust (pk)&TRUST_FLAG_DISABLED))
+                 {
+                   tty_printf("*** ");
+                   tty_printf(_("This key has been disabled"));
+                   tty_printf("\n");
+                 }
+             }
+
+           if( node->pkt->pkttype == PKT_PUBLIC_KEY && with_fpr )
+             {
+               print_fingerprint ( pk, NULL, 2 );
+               tty_printf("\n");
+             }
+       }
+       else if( node->pkt->pkttype == PKT_SECRET_KEY
+           || (with_subkeys && node->pkt->pkttype == PKT_SECRET_SUBKEY) )
+         {
+           PKT_secret_key *sk = node->pkt->pkt.secret_key;
+           tty_printf("%s%c %4u%c/%s  ",
+                      node->pkt->pkttype == PKT_SECRET_KEY? "sec":"ssb",
+                      (node->flag & NODFLG_SELKEY)? '*':' ',
+                      nbits_from_sk( sk ),
+                      pubkey_letter( sk->pubkey_algo ),
+                      keystr_from_sk(sk));
+           tty_printf(_("created: %s"),datestr_from_sk(sk));
+           tty_printf("  ");
+           tty_printf(_("expires: %s"),expirestr_from_sk(sk));
+           tty_printf("\n");
+            if (sk->is_protected && sk->protect.s2k.mode == 1002)
+              {
+               tty_printf("                     ");
+                tty_printf(_("card-no: ")); 
+                if (sk->protect.ivlen == 16
+                    && !memcmp (sk->protect.iv, "\xD2\x76\x00\x01\x24\x01", 6))
+                  { /* This is an OpenPGP card. */
+                    for (i=8; i < 14; i++)
+                      {
+                        if (i == 10)
+                          tty_printf (" ");
+                        tty_printf ("%02X", sk->protect.iv[i]);
+                      }
+                  }
+                else
+                  { /* Something is wrong: Print all. */
+                    for (i=0; i < sk->protect.ivlen; i++)
+                      tty_printf ("%02X", sk->protect.iv[i]);
+                  }
+                tty_printf ("\n");
+              }
+         }
+    }
+
+    show_names(keyblock,primary,only_marked?NODFLG_MARK_A:0,with_prefs);
+
+    if (do_warn)
+        tty_printf (_("Please note that the shown key validity"
+                      " is not necessarily correct\n"
+                      "unless you restart the program.\n")); 
+}
+
+
+/* Display basic key information.  This function is suitable to show
+   information on the key without any dependencies on the trustdb or
+   any other internal GnuPG stuff.  KEYBLOCK may either be a public or
+   a secret key.*/
+void
+show_basic_key_info ( KBNODE keyblock )
+{
+  KBNODE node;
+  int i;
+
+  /* The primary key */
+  for (node = keyblock; node; node = node->next)
+    {
+      if (node->pkt->pkttype == PKT_PUBLIC_KEY)
+        {
+          PKT_public_key *pk = node->pkt->pkt.public_key;
+          
+          /* Note, we use the same format string as in other show
+             functions to make the translation job easier. */
+          tty_printf ("%s  %4u%c/%s  ",
+                      node->pkt->pkttype == PKT_PUBLIC_KEY? "pub":"sub",
+                      nbits_from_pk( pk ),
+                      pubkey_letter( pk->pubkey_algo ),
+                      keystr_from_pk(pk));
+         tty_printf(_("created: %s"),datestr_from_pk(pk));
+         tty_printf("  ");
+         tty_printf(_("expires: %s"),expirestr_from_pk(pk));
+          tty_printf("\n");
+          print_fingerprint ( pk, NULL, 3 );
+          tty_printf("\n");
+       }
+      else if (node->pkt->pkttype == PKT_SECRET_KEY)
+        {
+          PKT_secret_key *sk = node->pkt->pkt.secret_key;
+          tty_printf("%s  %4u%c/%s",
+                     node->pkt->pkttype == PKT_SECRET_KEY? "sec":"ssb",
+                     nbits_from_sk( sk ),
+                     pubkey_letter( sk->pubkey_algo ),
+                     keystr_from_sk(sk));
+         tty_printf(_("created: %s"),datestr_from_sk(sk));
+         tty_printf("  ");
+         tty_printf(_("expires: %s"),expirestr_from_sk(sk));
+          tty_printf("\n");
+          print_fingerprint (NULL, sk, 3 );
+          tty_printf("\n");
+       }
+    }
+
+  /* The user IDs. */
+  for (i=0, node = keyblock; node; node = node->next)
+    {
+      if (node->pkt->pkttype == PKT_USER_ID)
+        {
+          PKT_user_id *uid = node->pkt->pkt.user_id;
+          ++i;
+     
+          tty_printf ("     ");
+          if (uid->is_revoked)
+            tty_printf("[%s] ",_("revoked"));
+          else if ( uid->is_expired )
+            tty_printf("[%s] ",_("expired"));
+          tty_print_utf8_string (uid->name, uid->len);
+          tty_printf ("\n");
+        }
+    }
+}
+
+static void
+show_key_and_fingerprint( KBNODE keyblock )
+{
+  KBNODE node;
+  PKT_public_key *pk = NULL;
+
+  for( node = keyblock; node; node = node->next )
+    {
+      if( node->pkt->pkttype == PKT_PUBLIC_KEY )
+       {
+         pk = node->pkt->pkt.public_key;
+         tty_printf("pub   %4u%c/%s %s ",
+                    nbits_from_pk( pk ),
+                    pubkey_letter( pk->pubkey_algo ),
+                    keystr_from_pk(pk),
+                    datestr_from_pk(pk) );
+       }
+      else if( node->pkt->pkttype == PKT_USER_ID )
+       {
+         PKT_user_id *uid = node->pkt->pkt.user_id;
+         tty_print_utf8_string( uid->name, uid->len );
+         break;
+       }
+    }
+  tty_printf("\n");
+  if( pk )
+    print_fingerprint( pk, NULL, 2 );
+}
+
+
+/* Show a warning if no uids on the key have the primary uid flag
+   set. */
+static void
+no_primary_warning(KBNODE keyblock)
+{
+  KBNODE node;
+  int have_primary=0,uid_count=0;
+
+  /* TODO: if we ever start behaving differently with a primary or
+     non-primary attribute ID, we will need to check for attributes
+     here as well. */
+
+  for(node=keyblock; node; node = node->next)
+    {
+      if(node->pkt->pkttype==PKT_USER_ID
+        && node->pkt->pkt.user_id->attrib_data==NULL)
+       {
+         uid_count++;
+
+         if(node->pkt->pkt.user_id->is_primary==2)
+           {
+             have_primary=1;
+             break;
+           }
+       }
+    }
+
+  if(uid_count>1 && !have_primary)
+    log_info(_("WARNING: no user ID has been marked as primary.  This command"
+              " may\n              cause a different user ID to become"
+              " the assumed primary.\n"));
+}
+
+/****************
+ * Ask for a new user id, do the selfsignature and put it into
+ * both keyblocks.
+ * Return true if there is a new user id
+ */
+static int
+menu_adduid( KBNODE pub_keyblock, KBNODE sec_keyblock,
+            int photo, const char *photo_name)
+{
+    PKT_user_id *uid;
+    PKT_public_key *pk=NULL;
+    PKT_secret_key *sk=NULL;
+    PKT_signature *sig=NULL;
+    PACKET *pkt;
+    KBNODE node;
+    KBNODE pub_where=NULL, sec_where=NULL;
+    int rc;
+
+    for( node = pub_keyblock; node; pub_where = node, node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_KEY )
+           pk = node->pkt->pkt.public_key;
+       else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+           break;
+    }
+    if( !node ) /* no subkey */
+       pub_where = NULL;
+    for( node = sec_keyblock; node; sec_where = node, node = node->next ) {
+       if( node->pkt->pkttype == PKT_SECRET_KEY )
+           sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
+       else if( node->pkt->pkttype == PKT_SECRET_SUBKEY )
+           break;
+    }
+    if( !node ) /* no subkey */
+       sec_where = NULL;
+    assert(pk && sk);
+
+    if(photo) {
+      int hasattrib=0;
+
+      for( node = pub_keyblock; node; node = node->next )
+       if( node->pkt->pkttype == PKT_USER_ID &&
+           node->pkt->pkt.user_id->attrib_data!=NULL)
+         {
+           hasattrib=1;
+           break;
+         }
+
+      /* It is legal but bad for compatibility to add a photo ID to a
+         v3 key as it means that PGP2 will not be able to use that key
+         anymore.  Also, PGP may not expect a photo on a v3 key.
+         Don't bother to ask this if the key already has a photo - any
+         damage has already been done at that point. -dms */
+      if(pk->version==3 && !hasattrib)
+       {
+         if(opt.expert)
+           {
+             tty_printf(_("WARNING: This is a PGP2-style key.  "
+                          "Adding a photo ID may cause some versions\n"
+                          "         of PGP to reject this key.\n"));
+
+             if(!cpr_get_answer_is_yes("keyedit.v3_photo.okay",
+                                       _("Are you sure you still want "
+                                         "to add it? (y/N) ")))
+               return 0;
+           }
+         else
+           {
+             tty_printf(_("You may not add a photo ID to "
+                          "a PGP2-style key.\n"));
+             return 0;
+           }
+       }
+
+      uid = generate_photo_id(pk,photo_name);
+    } else
+      uid = generate_user_id();
+    if( !uid )
+       return 0;
+
+    rc = make_keysig_packet( &sig, pk, uid, NULL, sk, 0x13, 0, 0, 0, 0,
+                            keygen_add_std_prefs, pk );
+    free_secret_key( sk );
+    if( rc ) {
+       log_error("signing failed: %s\n", g10_errstr(rc) );
+       free_user_id(uid);
+       return 0;
+    }
+
+    /* insert/append to secret keyblock */
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_USER_ID;
+    pkt->pkt.user_id = scopy_user_id(uid);
+    node = new_kbnode(pkt);
+    if( sec_where )
+       insert_kbnode( sec_where, node, 0 );
+    else
+       add_kbnode( sec_keyblock, node );
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_SIGNATURE;
+    pkt->pkt.signature = copy_signature(NULL, sig);
+    if( sec_where )
+       insert_kbnode( node, new_kbnode(pkt), 0 );
+    else
+       add_kbnode( sec_keyblock, new_kbnode(pkt) );
+    /* insert/append to public keyblock */
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_USER_ID;
+    pkt->pkt.user_id = uid;
+    node = new_kbnode(pkt);
+    if( pub_where )
+       insert_kbnode( pub_where, node, 0 );
+    else
+       add_kbnode( pub_keyblock, node );
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_SIGNATURE;
+    pkt->pkt.signature = copy_signature(NULL, sig);
+    if( pub_where )
+       insert_kbnode( node, new_kbnode(pkt), 0 );
+    else
+       add_kbnode( pub_keyblock, new_kbnode(pkt) );
+    return 1;
+}
+
+
+/****************
+ * Remove all selected userids from the keyrings
+ */
+static void
+menu_deluid( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    KBNODE node;
+    int selected=0;
+
+    for( node = pub_keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           selected = node->flag & NODFLG_SELUID;
+           if( selected ) {
+               /* Only cause a trust update if we delete a
+                   non-revoked user id */
+               if(!node->pkt->pkt.user_id->is_revoked)
+                 update_trust=1;
+               delete_kbnode( node );
+               if( sec_keyblock ) {
+                   KBNODE snode;
+                   int s_selected = 0;
+                   PKT_user_id *uid = node->pkt->pkt.user_id;
+                   for( snode = sec_keyblock; snode; snode = snode->next ) {
+                       if( snode->pkt->pkttype == PKT_USER_ID ) {
+                           PKT_user_id *suid = snode->pkt->pkt.user_id;
+
+                           s_selected =
+                               (uid->len == suid->len
+                                && !memcmp( uid->name, suid->name, uid->len));
+                           if( s_selected )
+                               delete_kbnode( snode );
+                       }
+                       else if( s_selected
+                                && snode->pkt->pkttype == PKT_SIGNATURE )
+                           delete_kbnode( snode );
+                       else if( snode->pkt->pkttype == PKT_SECRET_SUBKEY )
+                           s_selected = 0;
+                   }
+               }
+           }
+       }
+       else if( selected && node->pkt->pkttype == PKT_SIGNATURE )
+           delete_kbnode( node );
+       else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+           selected = 0;
+    }
+    commit_kbnode( &pub_keyblock );
+    if( sec_keyblock )
+       commit_kbnode( &sec_keyblock );
+}
+
+
+static int
+menu_delsig( KBNODE pub_keyblock )
+{
+    KBNODE node;
+    PKT_user_id *uid = NULL;
+    int changed=0;
+
+    for( node = pub_keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           uid = (node->flag & NODFLG_SELUID)? node->pkt->pkt.user_id : NULL;
+       }
+       else if( uid && node->pkt->pkttype == PKT_SIGNATURE ) {
+          int okay, valid, selfsig, inv_sig, no_key, other_err;
+
+           tty_printf("uid  ");
+           tty_print_utf8_string( uid->name, uid->len );
+           tty_printf("\n");
+
+           okay = inv_sig = no_key = other_err = 0;
+           if(opt.with_colons)
+             valid = print_and_check_one_sig_colon( pub_keyblock, node,
+                                              &inv_sig, &no_key, &other_err,
+                                              &selfsig, 1 );
+           else
+             valid = print_and_check_one_sig( pub_keyblock, node,
+                                              &inv_sig, &no_key, &other_err,
+                                              &selfsig, 1 );
+
+          if( valid ) {
+              okay = cpr_get_answer_yes_no_quit(
+                  "keyedit.delsig.valid",
+                  _("Delete this good signature? (y/N/q)"));
+
+              /* Only update trust if we delete a good signature.
+                  The other two cases do not affect trust. */
+              if(okay)
+                update_trust=1;
+          }
+          else if( inv_sig || other_err )
+              okay = cpr_get_answer_yes_no_quit(
+                  "keyedit.delsig.invalid",
+                  _("Delete this invalid signature? (y/N/q)"));
+          else if( no_key )
+              okay = cpr_get_answer_yes_no_quit(
+                  "keyedit.delsig.unknown",
+                  _("Delete this unknown signature? (y/N/q)"));
+
+           if( okay == -1 )
+               break;
+          if( okay && selfsig && !cpr_get_answer_is_yes(
+                              "keyedit.delsig.selfsig",
+                             _("Really delete this self-signature? (y/N)") ))
+               okay = 0;
+           if( okay ) {
+               delete_kbnode( node );
+               changed++;
+           }
+
+       }
+       else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+           uid = NULL;
+    }
+
+    if( changed ) {
+       commit_kbnode( &pub_keyblock );
+       tty_printf( changed == 1? _("Deleted %d signature.\n")
+                               : _("Deleted %d signatures.\n"), changed );
+    }
+    else
+       tty_printf( _("Nothing deleted.\n") );
+
+    return changed;
+}
+
+static int
+menu_clean(KBNODE keyblock,int self_only)
+{
+  KBNODE uidnode;
+  int modified=0,select_all=!count_selected_uids(keyblock);
+
+  for(uidnode=keyblock->next;
+      uidnode && uidnode->pkt->pkttype!=PKT_PUBLIC_SUBKEY;
+      uidnode=uidnode->next)
+    {
+      if(uidnode->pkt->pkttype==PKT_USER_ID
+        && (uidnode->flag&NODFLG_SELUID || select_all))
+       {
+         int uids=0,sigs=0;
+         char *user=utf8_to_native(uidnode->pkt->pkt.user_id->name,
+                                   uidnode->pkt->pkt.user_id->len,
+                                   0);
+
+         clean_one_uid(keyblock,uidnode,opt.verbose,self_only,&uids,&sigs);
+         if(uids)
+           {
+             const char *reason;
+
+             if(uidnode->pkt->pkt.user_id->is_revoked)
+               reason=_("revoked");
+             else if(uidnode->pkt->pkt.user_id->is_expired)
+               reason=_("expired");
+             else
+               reason=_("invalid");
+
+             tty_printf (_("User ID \"%s\" compacted: %s\n"), user, reason);
+
+             modified=1;
+           }
+         else if(sigs)
+           {
+             tty_printf (sigs==1?
+                         _("User ID \"%s\": %d signature removed\n"):
+                          _("User ID \"%s\": %d signatures removed\n"),
+                          user,sigs);
+
+             modified=1;
+           }
+         else
+           {
+             tty_printf (self_only==1?
+                          _("User ID \"%s\": already minimized\n"):
+                          _("User ID \"%s\": already clean\n"),
+                          user);
+           }
+
+         xfree(user);
+       }
+    }
+
+  return modified;
+}
+
+/****************
+ * Remove some of the secondary keys
+ */
+static void
+menu_delkey( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    KBNODE node;
+    int selected=0;
+
+    for( node = pub_keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+           selected = node->flag & NODFLG_SELKEY;
+           if( selected ) {
+               delete_kbnode( node );
+               if( sec_keyblock ) {
+                   KBNODE snode;
+                   int s_selected = 0;
+                   u32 ki[2];
+
+                   keyid_from_pk( node->pkt->pkt.public_key, ki );
+                   for( snode = sec_keyblock; snode; snode = snode->next ) {
+                       if( snode->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                           u32 ki2[2];
+
+                           keyid_from_sk( snode->pkt->pkt.secret_key, ki2 );
+                           s_selected = (ki[0] == ki2[0] && ki[1] == ki2[1]);
+                           if( s_selected )
+                               delete_kbnode( snode );
+                       }
+                       else if( s_selected
+                                && snode->pkt->pkttype == PKT_SIGNATURE )
+                           delete_kbnode( snode );
+                       else
+                           s_selected = 0;
+                   }
+               }
+           }
+       }
+       else if( selected && node->pkt->pkttype == PKT_SIGNATURE )
+           delete_kbnode( node );
+       else
+           selected = 0;
+    }
+    commit_kbnode( &pub_keyblock );
+    if( sec_keyblock )
+       commit_kbnode( &sec_keyblock );
+
+    /* No need to set update_trust here since signing keys are no
+       longer used to certify other keys, so there is no change in
+       trust when revoking/removing them */
+}
+
+
+/****************
+ * Ask for a new revoker, do the selfsignature and put it into
+ * both keyblocks.
+ * Return true if there is a new revoker
+ */
+static int
+menu_addrevoker( KBNODE pub_keyblock, KBNODE sec_keyblock, int sensitive )
+{
+  PKT_public_key *pk=NULL,*revoker_pk=NULL;
+  PKT_secret_key *sk=NULL;
+  PKT_signature *sig=NULL;
+  PACKET *pkt;
+  struct revocation_key revkey;
+  size_t fprlen;
+  int rc;
+
+  assert(pub_keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+  assert(sec_keyblock->pkt->pkttype==PKT_SECRET_KEY);
+
+  pk=pub_keyblock->pkt->pkt.public_key;
+
+  if(pk->numrevkeys==0 && pk->version==3)
+    {
+      /* It is legal but bad for compatibility to add a revoker to a
+         v3 key as it means that PGP2 will not be able to use that key
+         anymore.  Also, PGP may not expect a revoker on a v3 key.
+         Don't bother to ask this if the key already has a revoker -
+         any damage has already been done at that point. -dms */
+      if(opt.expert)
+       {
+         tty_printf(_("WARNING: This is a PGP 2.x-style key.  "
+                      "Adding a designated revoker may cause\n"
+                      "         some versions of PGP to reject this key.\n"));
+
+         if(!cpr_get_answer_is_yes("keyedit.v3_revoker.okay",
+                                   _("Are you sure you still want "
+                                     "to add it? (y/N) ")))
+           return 0;
+       }
+      else
+       {
+         tty_printf(_("You may not add a designated revoker to "
+                      "a PGP 2.x-style key.\n"));
+         return 0;
+       }
+    }
+
+  sk=copy_secret_key(NULL,sec_keyblock->pkt->pkt.secret_key);
+
+  for(;;)
+    {
+      char *answer;
+
+      if(revoker_pk)
+       free_public_key(revoker_pk);
+
+      revoker_pk=xmalloc_clear(sizeof(*revoker_pk));
+
+      tty_printf("\n");
+
+      answer=cpr_get_utf8("keyedit.add_revoker",
+                         _("Enter the user ID of the designated revoker: "));
+      if(answer[0]=='\0' || answer[0]=='\004')
+       {
+         xfree(answer);
+         goto fail;
+       }
+
+      /* Note that I'm requesting CERT here, which usually implies
+        primary keys only, but some casual testing shows that PGP and
+        GnuPG both can handle a designated revokation from a
+        subkey. */
+      revoker_pk->req_usage=PUBKEY_USAGE_CERT;
+      rc=get_pubkey_byname(revoker_pk,answer,NULL,NULL,1);
+      if(rc)
+       {
+         log_error (_("key \"%s\" not found: %s\n"),answer,g10_errstr(rc));
+         xfree(answer);
+         continue;
+       }
+
+      xfree(answer);
+
+      fingerprint_from_pk(revoker_pk,revkey.fpr,&fprlen);
+      if(fprlen!=20)
+       {
+         log_error(_("cannot appoint a PGP 2.x style key as a "
+                     "designated revoker\n"));
+         continue;
+       }
+
+      revkey.class=0x80;
+      if(sensitive)
+       revkey.class|=0x40;
+      revkey.algid=revoker_pk->pubkey_algo;
+
+      if(cmp_public_keys(revoker_pk,pk)==0)
+       {
+         /* This actually causes no harm (after all, a key that
+            designates itself as a revoker is the same as a
+            regular key), but it's easy enough to check. */
+         log_error(_("you cannot appoint a key as its own "
+                     "designated revoker\n"));
+
+         continue;
+       }
+
+      keyid_from_pk(pk,NULL);
+
+      /* Does this revkey already exist? */
+      if(!pk->revkey && pk->numrevkeys)
+       BUG();
+      else
+       {
+         int i;
+
+         for(i=0;i<pk->numrevkeys;i++)
+           {
+             if(memcmp(&pk->revkey[i],&revkey,
+                       sizeof(struct revocation_key))==0)
+               {
+                 char buf[50];
+
+                 log_error(_("this key has already been designated "
+                             "as a revoker\n"));
+
+                 sprintf(buf,"%08lX%08lX",
+                         (ulong)pk->keyid[0],(ulong)pk->keyid[1]);
+                 write_status_text(STATUS_ALREADY_SIGNED,buf);
+
+                 break;
+               }
+           }
+
+         if(i<pk->numrevkeys)
+           continue;
+       }
+
+      print_pubkey_info(NULL,revoker_pk);
+      print_fingerprint(revoker_pk,NULL,2);
+      tty_printf("\n");
+
+      tty_printf(_("WARNING: appointing a key as a designated revoker "
+                  "cannot be undone!\n"));
+
+      tty_printf("\n");
+
+      if(!cpr_get_answer_is_yes("keyedit.add_revoker.okay",
+                               _("Are you sure you want to appoint this "
+                                 "key as a designated revoker? (y/N) ")))
+       continue;
+
+      free_public_key(revoker_pk);
+      revoker_pk=NULL;
+      break;
+    }
+
+  /* The 1F signature must be at least v4 to carry the revocation key
+     subpacket. */
+  rc = make_keysig_packet( &sig, pk, NULL, NULL, sk, 0x1F, 0, 4, 0, 0,
+                          keygen_add_revkey,&revkey );
+  if( rc )
+    {
+      log_error("signing failed: %s\n", g10_errstr(rc) );
+      goto fail;
+    }
+
+  free_secret_key(sk);
+  sk=NULL;
+
+  /* insert into secret keyblock */
+  pkt = xmalloc_clear( sizeof *pkt );
+  pkt->pkttype = PKT_SIGNATURE;
+  pkt->pkt.signature = copy_signature(NULL, sig);
+  insert_kbnode( sec_keyblock, new_kbnode(pkt), PKT_SIGNATURE );
+
+  /* insert into public keyblock */
+  pkt = xmalloc_clear( sizeof *pkt );
+  pkt->pkttype = PKT_SIGNATURE;
+  pkt->pkt.signature = sig;
+  insert_kbnode( pub_keyblock, new_kbnode(pkt), PKT_SIGNATURE );
+
+  return 1;
+
+ fail:
+  if(sk)
+    free_secret_key(sk);
+  if(sig)
+    free_seckey_enc(sig);
+  if(revoker_pk)
+    free_public_key(revoker_pk);
+
+  return 0;
+}
+
+
+static int
+menu_expire( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    int n1, signumber, rc;
+    u32 expiredate;
+    int mainkey=0;
+    PKT_secret_key *sk;    /* copy of the main sk */
+    PKT_public_key *main_pk, *sub_pk;
+    PKT_user_id *uid;
+    KBNODE node;
+    u32 keyid[2];
+
+    if( count_selected_keys( sec_keyblock ) ) {
+       tty_printf(_("Please remove selections from the secret keys.\n"));
+       return 0;
+    }
+
+    n1 = count_selected_keys( pub_keyblock );
+    if( n1 > 1 ) {
+       tty_printf(_("Please select at most one subkey.\n"));
+       return 0;
+    }
+    else if( n1 )
+       tty_printf(_("Changing expiration time for a subkey.\n"));
+    else
+      {
+       tty_printf(_("Changing expiration time for the primary key.\n"));
+       mainkey=1;
+       no_primary_warning(pub_keyblock);
+      }
+
+    expiredate = ask_expiredate();
+    node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+    sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
+
+    /* Now we can actually change the self signature(s) */
+    main_pk = sub_pk = NULL;
+    uid = NULL;
+    signumber = 0;
+    for( node=pub_keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_KEY ) {
+           main_pk = node->pkt->pkt.public_key;
+           keyid_from_pk( main_pk, keyid );
+           main_pk->expiredate = expiredate;
+       }
+       else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+                && (node->flag & NODFLG_SELKEY ) ) {
+           sub_pk = node->pkt->pkt.public_key;
+           sub_pk->expiredate = expiredate;
+       }
+       else if( node->pkt->pkttype == PKT_USER_ID )
+           uid = node->pkt->pkt.user_id;
+       else if( main_pk && node->pkt->pkttype == PKT_SIGNATURE
+                && ( mainkey || sub_pk ) ) {
+           PKT_signature *sig = node->pkt->pkt.signature;
+           if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
+               && ( (mainkey && uid
+                     && uid->created && (sig->sig_class&~3) == 0x10)
+                    || (!mainkey && sig->sig_class == 0x18)  )
+               && sig->flags.chosen_selfsig )
+             {
+               /* this is a selfsignature which is to be replaced */
+               PKT_signature *newsig;
+               PACKET *newpkt;
+               KBNODE sn;
+               int signumber2 = 0;
+
+               signumber++;
+
+               if( (mainkey && main_pk->version < 4)
+                   || (!mainkey && sub_pk->version < 4 ) ) {
+                   log_info(_(
+                       "You can't change the expiration date of a v3 key\n"));
+                   free_secret_key( sk );
+                   return 0;
+               }
+
+               /* find the corresponding secret self-signature */
+               for( sn=sec_keyblock; sn; sn = sn->next ) {
+                   if( sn->pkt->pkttype == PKT_SIGNATURE ) {
+                       PKT_signature *b = sn->pkt->pkt.signature;
+                       if( keyid[0] == b->keyid[0] && keyid[1] == b->keyid[1]
+                           && sig->sig_class == b->sig_class
+                           && ++signumber2 == signumber )
+                           break;
+                   }
+               }
+               if( !sn )
+                   log_info(_("No corresponding signature in secret ring\n"));
+
+               if( mainkey )
+                 rc = update_keysig_packet(&newsig, sig, main_pk, uid, NULL,
+                                           sk, keygen_add_key_expire, main_pk);
+               else
+                 rc = update_keysig_packet(&newsig, sig, main_pk, NULL, sub_pk,
+                                           sk, keygen_add_key_expire, sub_pk );
+               if( rc ) {
+                   log_error("make_keysig_packet failed: %s\n",
+                                                   g10_errstr(rc));
+                   free_secret_key( sk );
+                   return 0;
+               }
+               /* replace the packet */
+               newpkt = xmalloc_clear( sizeof *newpkt );
+               newpkt->pkttype = PKT_SIGNATURE;
+               newpkt->pkt.signature = newsig;
+               free_packet( node->pkt );
+               xfree( node->pkt );
+               node->pkt = newpkt;
+               if( sn ) {
+                   newpkt = xmalloc_clear( sizeof *newpkt );
+                   newpkt->pkttype = PKT_SIGNATURE;
+                   newpkt->pkt.signature = copy_signature( NULL, newsig );
+                   free_packet( sn->pkt );
+                   xfree( sn->pkt );
+                   sn->pkt = newpkt;
+               }
+               sub_pk = NULL;
+           }
+       }
+    }
+
+    free_secret_key( sk );
+    update_trust=1;
+    return 1;
+}
+
+static int
+menu_backsign(KBNODE pub_keyblock,KBNODE sec_keyblock)
+{
+  int rc,modified=0;
+  PKT_public_key *main_pk;
+  PKT_secret_key *main_sk,*sub_sk=NULL;
+  KBNODE node;
+
+  assert(pub_keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+  assert(sec_keyblock->pkt->pkttype==PKT_SECRET_KEY);
+
+  merge_keys_and_selfsig(pub_keyblock);
+  main_pk=pub_keyblock->pkt->pkt.public_key;
+  main_sk=copy_secret_key(NULL,sec_keyblock->pkt->pkt.secret_key);
+  keyid_from_pk(main_pk,NULL);
+
+  for(node=pub_keyblock;node;node=node->next)
+    {
+      PKT_public_key *sub_pk=NULL;
+      KBNODE node2,sig_pk=NULL,sig_sk=NULL;
+      char *passphrase;
+
+      if(sub_sk)
+       {
+         free_secret_key(sub_sk);
+         sub_sk=NULL;
+       }
+
+      /* Find a signing subkey with no backsig */
+      if(node->pkt->pkttype==PKT_PUBLIC_SUBKEY)
+       {
+         if(node->pkt->pkt.public_key->pubkey_usage&PUBKEY_USAGE_SIG)
+           {
+             if(node->pkt->pkt.public_key->backsig)
+               tty_printf(_("signing subkey %s is already cross-certified\n"),
+                          keystr_from_pk(node->pkt->pkt.public_key));
+             else
+               sub_pk=node->pkt->pkt.public_key;
+           }
+         else
+           tty_printf(_("subkey %s does not sign and so does"
+                        " not need to be cross-certified\n"),
+                      keystr_from_pk(node->pkt->pkt.public_key));
+       }
+
+      if(!sub_pk)
+       continue;
+
+      /* Find the selected selfsig on this subkey */
+      for(node2=node->next;
+         node2 && node2->pkt->pkttype==PKT_SIGNATURE;
+         node2=node2->next)
+       if(node2->pkt->pkt.signature->version>=4
+          && node2->pkt->pkt.signature->flags.chosen_selfsig)
+         {
+           sig_pk=node2;
+           break;
+         }
+
+      if(!sig_pk)
+       continue;
+
+      /* Find the secret subkey that matches the public subkey */
+      for(node2=sec_keyblock;node2;node2=node2->next)
+       if(node2->pkt->pkttype==PKT_SECRET_SUBKEY
+          && !cmp_public_secret_key(sub_pk,node2->pkt->pkt.secret_key))
+         {
+           sub_sk=copy_secret_key(NULL,node2->pkt->pkt.secret_key);
+           break;
+         }
+
+      if(!sub_sk)
+       {
+         tty_printf(_("no secret subkey for public subkey %s - ignoring\n"),
+                    keystr_from_pk(sub_pk));
+         continue;
+       }
+
+      /* Now finally find the matching selfsig on the secret subkey.
+        We can't use chosen_selfsig here (it's not set for secret
+        keys), so we just pick the selfsig with the right class.
+        This is what menu_expire does as well. */
+      for(node2=node2->next;
+         node2 && node2->pkt->pkttype!=PKT_SECRET_SUBKEY;
+         node2=node2->next)
+       if(node2->pkt->pkttype==PKT_SIGNATURE
+          && node2->pkt->pkt.signature->version>=4
+          && node2->pkt->pkt.signature->keyid[0]==sig_pk->pkt->pkt.signature->keyid[0]
+          && node2->pkt->pkt.signature->keyid[1]==sig_pk->pkt->pkt.signature->keyid[1]
+          && node2->pkt->pkt.signature->sig_class==sig_pk->pkt->pkt.signature->sig_class)
+         {
+           sig_sk=node2;
+           break;
+         }
+
+      /* Now we can get to work.  We have a main key and secret part,
+        a signing subkey with signature and secret part possibly with
+        signature. */
+
+      passphrase=get_last_passphrase();
+      set_next_passphrase(passphrase);
+      xfree(passphrase);
+
+      rc=make_backsig(sig_pk->pkt->pkt.signature,main_pk,sub_pk,sub_sk);
+      if(rc==0)
+       {
+         PKT_signature *newsig;
+         PACKET *newpkt;
+
+         passphrase=get_last_passphrase();
+         set_next_passphrase(passphrase);
+         xfree(passphrase);
+
+         rc=update_keysig_packet(&newsig,sig_pk->pkt->pkt.signature,main_pk,
+                                 NULL,sub_pk,main_sk,NULL,NULL);
+         if(rc==0)
+           {
+             /* Put the new sig into place on the pubkey */
+             newpkt=xmalloc_clear(sizeof(*newpkt));
+             newpkt->pkttype=PKT_SIGNATURE;
+             newpkt->pkt.signature=newsig;
+             free_packet(sig_pk->pkt);
+             xfree(sig_pk->pkt);
+             sig_pk->pkt=newpkt;
+
+             if(sig_sk)
+               {
+                 /* Put the new sig into place on the seckey */
+                 newpkt=xmalloc_clear(sizeof(*newpkt));
+                 newpkt->pkttype=PKT_SIGNATURE;
+                 newpkt->pkt.signature=copy_signature(NULL,newsig);
+                 free_packet(sig_sk->pkt);
+                 xfree(sig_sk->pkt);
+                 sig_sk->pkt=newpkt;
+               }
+
+             modified=1;
+           }
+         else
+           {
+             log_error("update_keysig_packet failed: %s\n",g10_errstr(rc));
+             break;
+           }
+       }
+      else
+       {
+         log_error("make_backsig failed: %s\n",g10_errstr(rc));
+         break;
+       }
+    }
+
+  set_next_passphrase(NULL);
+
+  free_secret_key(main_sk);
+  if(sub_sk)
+    free_secret_key(sub_sk);
+
+  return modified;
+}
+
+
+static int
+change_primary_uid_cb ( PKT_signature *sig, void *opaque )
+{
+    byte buf[1];
+
+    /* first clear all primary uid flags so that we are sure none are
+     * lingering around */
+    delete_sig_subpkt (sig->hashed,   SIGSUBPKT_PRIMARY_UID);
+    delete_sig_subpkt (sig->unhashed, SIGSUBPKT_PRIMARY_UID);
+
+    /* if opaque is set,we want to set the primary id */
+    if (opaque) { 
+        buf[0] = 1;
+        build_sig_subpkt (sig, SIGSUBPKT_PRIMARY_UID, buf, 1 );
+    }
+
+    return 0;
+}
+
+
+/*
+ * Set the primary uid flag for the selected UID.  We will also reset
+ * all other primary uid flags.  For this to work with have to update
+ * all the signature timestamps.  If we would do this with the current
+ * time, we lose quite a lot of information, so we use a a kludge to
+ * do this: Just increment the timestamp by one second which is
+ * sufficient to updated a signature during import.
+ */
+static int
+menu_set_primary_uid ( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    PKT_secret_key *sk;    /* copy of the main sk */
+    PKT_public_key *main_pk;
+    PKT_user_id *uid;
+    KBNODE node;
+    u32 keyid[2];
+    int selected;
+    int attribute = 0;
+    int modified = 0;
+
+    if ( count_selected_uids (pub_keyblock) != 1 ) {
+       tty_printf(_("Please select exactly one user ID.\n"));
+       return 0;
+    }
+
+    node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+    sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
+
+    /* Now we can actually change the self signature(s) */
+    main_pk = NULL;
+    uid = NULL;
+    selected = 0;
+
+    /* Is our selected uid an attribute packet? */
+    for ( node=pub_keyblock; node; node = node->next )
+      if (node->pkt->pkttype == PKT_USER_ID && node->flag & NODFLG_SELUID)
+       attribute = (node->pkt->pkt.user_id->attrib_data!=NULL);
+
+    for ( node=pub_keyblock; node; node = node->next ) {
+       if ( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+            break; /* ready */
+
+       if ( node->pkt->pkttype == PKT_PUBLIC_KEY ) {
+           main_pk = node->pkt->pkt.public_key;
+           keyid_from_pk( main_pk, keyid );
+       }
+       else if ( node->pkt->pkttype == PKT_USER_ID ) {
+           uid = node->pkt->pkt.user_id;
+                   selected = node->flag & NODFLG_SELUID;
+        }
+       else if ( main_pk && uid && node->pkt->pkttype == PKT_SIGNATURE ) {
+           PKT_signature *sig = node->pkt->pkt.signature;
+           if ( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
+                && (uid && (sig->sig_class&~3) == 0x10)
+                && attribute == (uid->attrib_data!=NULL)
+                && sig->flags.chosen_selfsig )
+             {
+             if(sig->version < 4) {
+               char *user=utf8_to_native(uid->name,strlen(uid->name),0);
+
+               log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
+                        user);
+               xfree(user);
+             }
+             else {
+               /* This is a selfsignature which is to be replaced.
+                  We can just ignore v3 signatures because they are
+                  not able to carry the primary ID flag.  We also
+                  ignore self-sigs on user IDs that are not of the
+                  same type that we are making primary.  That is, if
+                  we are making a user ID primary, we alter user IDs.
+                  If we are making an attribute packet primary, we
+                  alter attribute packets. */
+
+                /* FIXME: We must make sure that we only have one
+                   self-signature per user ID here (not counting
+                   revocations) */
+               PKT_signature *newsig;
+               PACKET *newpkt;
+                const byte *p;
+                int action;
+
+                /* see whether this signature has the primary UID flag */
+                p = parse_sig_subpkt (sig->hashed,
+                                      SIGSUBPKT_PRIMARY_UID, NULL );
+                if ( !p )
+                    p = parse_sig_subpkt (sig->unhashed,
+                                          SIGSUBPKT_PRIMARY_UID, NULL );
+                if ( p && *p ) /* yes */
+                    action = selected? 0 : -1;
+                else /* no */
+                    action = selected? 1 : 0;
+
+                if (action) {
+                    int rc = update_keysig_packet (&newsig, sig,
+                                              main_pk, uid, NULL,
+                                               sk,
+                                               change_primary_uid_cb,
+                                               action > 0? "x":NULL );
+                    if( rc ) {
+                        log_error ("update_keysig_packet failed: %s\n",
+                                   g10_errstr(rc));
+                        free_secret_key( sk );
+                        return 0;
+                    }
+                    /* replace the packet */
+                    newpkt = xmalloc_clear( sizeof *newpkt );
+                    newpkt->pkttype = PKT_SIGNATURE;
+                    newpkt->pkt.signature = newsig;
+                    free_packet( node->pkt );
+                    xfree( node->pkt );
+                    node->pkt = newpkt;
+                    modified = 1;
+               }
+             }
+           }
+       }
+    }
+
+    free_secret_key( sk );
+    return modified;
+}
+
+
+/* 
+ * Set preferences to new values for the selected user IDs
+ */
+static int
+menu_set_preferences (KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    PKT_secret_key *sk;    /* copy of the main sk */
+    PKT_public_key *main_pk;
+    PKT_user_id *uid;
+    KBNODE node;
+    u32 keyid[2];
+    int selected, select_all;
+    int modified = 0;
+
+    no_primary_warning(pub_keyblock);
+
+    select_all = !count_selected_uids (pub_keyblock);
+
+    node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+    sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
+
+    /* Now we can actually change the self signature(s) */
+    main_pk = NULL;
+    uid = NULL;
+    selected = 0;
+    for ( node=pub_keyblock; node; node = node->next ) {
+       if ( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+            break; /* ready */
+
+       if ( node->pkt->pkttype == PKT_PUBLIC_KEY ) {
+           main_pk = node->pkt->pkt.public_key;
+           keyid_from_pk( main_pk, keyid );
+       }
+       else if ( node->pkt->pkttype == PKT_USER_ID ) {
+           uid = node->pkt->pkt.user_id;
+                   selected = select_all || (node->flag & NODFLG_SELUID);
+        }
+       else if ( main_pk && uid && selected
+                  && node->pkt->pkttype == PKT_SIGNATURE ) {
+           PKT_signature *sig = node->pkt->pkt.signature;
+           if ( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
+                && (uid && (sig->sig_class&~3) == 0x10)
+                && sig->flags.chosen_selfsig ) {
+             if( sig->version < 4 ) {
+               char *user=utf8_to_native(uid->name,strlen(uid->name),0);
+
+               log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
+                        user);
+               xfree(user);
+             }
+             else {
+               /* This is a selfsignature which is to be replaced 
+                 * We have to ignore v3 signatures because they are
+                 * not able to carry the preferences */
+               PKT_signature *newsig;
+               PACKET *newpkt;
+                int rc;
+
+                rc = update_keysig_packet (&newsig, sig,
+                                           main_pk, uid, NULL,
+                                           sk,
+                                           keygen_upd_std_prefs,
+                                           NULL );
+                if( rc ) {
+                    log_error ("update_keysig_packet failed: %s\n",
+                               g10_errstr(rc));
+                    free_secret_key( sk );
+                    return 0;
+                }
+                /* replace the packet */
+                newpkt = xmalloc_clear( sizeof *newpkt );
+                newpkt->pkttype = PKT_SIGNATURE;
+                newpkt->pkt.signature = newsig;
+                free_packet( node->pkt );
+                xfree( node->pkt );
+                node->pkt = newpkt;
+                modified = 1;
+             }
+            }
+       }
+    }
+    
+    free_secret_key( sk );
+    return modified;
+}
+
+
+static int
+menu_set_keyserver_url (const char *url,
+                       KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+  PKT_secret_key *sk;    /* copy of the main sk */
+  PKT_public_key *main_pk;
+  PKT_user_id *uid;
+  KBNODE node;
+  u32 keyid[2];
+  int selected, select_all;
+  int modified = 0;
+  char *answer,*uri;
+
+  no_primary_warning(pub_keyblock);
+
+  if(url)
+    answer=xstrdup(url);
+  else
+    {
+      answer=cpr_get_utf8("keyedit.add_keyserver",
+                         _("Enter your preferred keyserver URL: "));
+      if(answer[0]=='\0' || answer[0]=='\004')
+       {
+         xfree(answer);
+         return 0;
+       }
+    }
+
+  if(ascii_strcasecmp(answer,"none")==0)
+    uri=NULL;
+  else
+    {
+      struct keyserver_spec *keyserver=NULL;
+      /* Sanity check the format */
+      keyserver=parse_keyserver_uri(answer,1,NULL,0);
+      xfree(answer);
+      if(!keyserver)
+       {
+         log_info(_("could not parse keyserver URL\n"));
+         return 0;
+       }
+      uri=xstrdup(keyserver->uri);
+      free_keyserver_spec(keyserver);
+    }
+
+  select_all = !count_selected_uids (pub_keyblock);
+
+  node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+  sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
+
+  /* Now we can actually change the self signature(s) */
+  main_pk = NULL;
+  uid = NULL;
+  selected = 0;
+  for ( node=pub_keyblock; node; node = node->next )
+    {
+      if ( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+       break; /* ready */
+
+      if ( node->pkt->pkttype == PKT_PUBLIC_KEY )
+       {
+         main_pk = node->pkt->pkt.public_key;
+         keyid_from_pk( main_pk, keyid );
+       }
+      else if ( node->pkt->pkttype == PKT_USER_ID )
+       {
+         uid = node->pkt->pkt.user_id;
+         selected = select_all || (node->flag & NODFLG_SELUID);
+       }
+      else if ( main_pk && uid && selected
+               && node->pkt->pkttype == PKT_SIGNATURE )
+       {
+         PKT_signature *sig = node->pkt->pkt.signature;
+         if ( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
+              && (uid && (sig->sig_class&~3) == 0x10)
+              && sig->flags.chosen_selfsig)
+           {
+             char *user=utf8_to_native(uid->name,strlen(uid->name),0);
+             if( sig->version < 4 )
+               log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
+                        user);
+             else
+               {
+                 /* This is a selfsignature which is to be replaced
+                  * We have to ignore v3 signatures because they are
+                  * not able to carry the subpacket. */
+                 PKT_signature *newsig;
+                 PACKET *newpkt;
+                 int rc;
+                 const byte *p;
+                 size_t plen;
+
+                 p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&plen);
+                 if(p && plen)
+                   {
+                     tty_printf("Current preferred keyserver for user"
+                                " ID \"%s\": ",user);
+                     tty_print_utf8_string(p,plen);
+                     tty_printf("\n");
+                     if(!cpr_get_answer_is_yes("keyedit.confirm_keyserver",
+                        uri?_("Are you sure you want to replace it? (y/N) "):
+                            _("Are you sure you want to delete it? (y/N) ")))
+                       continue;
+                   }
+                 else if(uri==NULL)
+                   {
+                     /* There is no current keyserver URL, so there
+                        is no point in trying to un-set it. */
+                     continue;
+                   }
+
+                 rc = update_keysig_packet (&newsig, sig,
+                                            main_pk, uid, NULL,
+                                            sk,
+                                            keygen_add_keyserver_url, uri );
+                 if( rc )
+                   {
+                     log_error ("update_keysig_packet failed: %s\n",
+                                g10_errstr(rc));
+                     free_secret_key( sk );
+                     xfree(uri);
+                     return 0;
+                   }
+                 /* replace the packet */
+                 newpkt = xmalloc_clear( sizeof *newpkt );
+                 newpkt->pkttype = PKT_SIGNATURE;
+                 newpkt->pkt.signature = newsig;
+                 free_packet( node->pkt );
+                 xfree( node->pkt );
+                 node->pkt = newpkt;
+                 modified = 1;
+               }
+
+             xfree(user);
+           }
+       }
+    }
+
+  xfree(uri);
+  free_secret_key( sk );
+  return modified;
+}
+
+static int
+menu_set_notation(const char *string,KBNODE pub_keyblock,KBNODE sec_keyblock)
+{
+  PKT_secret_key *sk;    /* copy of the main sk */
+  PKT_public_key *main_pk;
+  PKT_user_id *uid;
+  KBNODE node;
+  u32 keyid[2];
+  int selected, select_all;
+  int modified = 0;
+  char *answer;
+  struct notation *notation;
+
+  no_primary_warning(pub_keyblock);
+
+  if(string)
+    answer=xstrdup(string);
+  else
+    {
+      answer=cpr_get_utf8("keyedit.add_notation",
+                         _("Enter the notation: "));
+      if(answer[0]=='\0' || answer[0]=='\004')
+       {
+         xfree(answer);
+         return 0;
+       }
+    }
+
+  if(ascii_strcasecmp(answer,"none")==0
+     || ascii_strcasecmp(answer,"-")==0)
+    notation=NULL; /* delete them all */
+  else
+    {
+      notation=string_to_notation(answer,0);
+      if(!notation)
+       {
+         xfree(answer);
+         return 0;
+       }
+    }
+
+  xfree(answer);
+
+  select_all = !count_selected_uids (pub_keyblock);
+
+  node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+  sk = copy_secret_key( NULL, node->pkt->pkt.secret_key);
+
+  /* Now we can actually change the self signature(s) */
+  main_pk = NULL;
+  uid = NULL;
+  selected = 0;
+  for ( node=pub_keyblock; node; node = node->next )
+    {
+      if ( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+       break; /* ready */
+
+      if ( node->pkt->pkttype == PKT_PUBLIC_KEY )
+       {
+         main_pk = node->pkt->pkt.public_key;
+         keyid_from_pk( main_pk, keyid );
+       }
+      else if ( node->pkt->pkttype == PKT_USER_ID )
+       {
+         uid = node->pkt->pkt.user_id;
+         selected = select_all || (node->flag & NODFLG_SELUID);
+       }
+      else if ( main_pk && uid && selected
+               && node->pkt->pkttype == PKT_SIGNATURE )
+       {
+         PKT_signature *sig = node->pkt->pkt.signature;
+         if ( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1]
+              && (uid && (sig->sig_class&~3) == 0x10)
+              && sig->flags.chosen_selfsig)
+           {
+             char *user=utf8_to_native(uid->name,strlen(uid->name),0);
+             if( sig->version < 4 )
+               log_info(_("skipping v3 self-signature on user ID \"%s\"\n"),
+                        user);
+             else
+               {
+                 PKT_signature *newsig;
+                 PACKET *newpkt;
+                 int rc,skip=0,addonly=1;
+
+                 if(sig->flags.notation)
+                   {
+                     tty_printf("Current notations for user ID \"%s\":\n",
+                                user);
+                     tty_print_notations(-9,sig);
+                   }
+                 else
+                   {
+                     tty_printf("No notations on user ID \"%s\"\n",user);
+                     if(notation==NULL)
+                       {
+                         /* There are no current notations, so there
+                            is no point in trying to un-set them. */
+                         continue;
+                       }
+                   }
+
+                 if(notation)
+                   {
+                     struct notation *n;
+                     int deleting=0;
+
+                     notation->next=sig_to_notation(sig);
+
+                     for(n=notation->next;n;n=n->next)
+                       if(strcmp(n->name,notation->name)==0)
+                         {
+                           if(notation->value)
+                             {
+                               if(strcmp(n->value,notation->value)==0)
+                                 {
+                                   if(notation->flags.ignore)
+                                     {
+                                       /* Value match with a delete
+                                          flag. */
+                                       n->flags.ignore=1;
+                                       deleting=1;
+                                     }
+                                   else
+                                     {
+                                       /* Adding the same notation
+                                          twice, so don't add it at
+                                          all. */
+                                       skip=1;
+                                       tty_printf("Skipping notation:"
+                                                  " %s=%s\n",
+                                                  notation->name,
+                                                  notation->value);
+                                       break;
+                                     }
+                                 }
+                             }
+                           else
+                             {
+                               /* No value, so it means delete. */
+                               n->flags.ignore=1;
+                               deleting=1;
+                             }
+
+                           if(n->flags.ignore)
+                             {
+                               tty_printf("Removing notation: %s=%s\n",
+                                          n->name,n->value);
+                               addonly=0;
+                             }
+                         }
+
+                     if(!notation->flags.ignore && !skip)
+                       tty_printf("Adding notation: %s=%s\n",
+                                  notation->name,notation->value);
+
+                     /* We tried to delete, but had no matches */
+                     if(notation->flags.ignore && !deleting)
+                       continue;
+                   }
+                 else
+                   {
+                     tty_printf("Removing all notations\n");
+                     addonly=0;
+                   }
+
+                 if(skip
+                    || (!addonly
+                        && !cpr_get_answer_is_yes("keyedit.confirm_notation",
+                                                  _("Proceed? (y/N) "))))
+                   continue;
+
+                 rc = update_keysig_packet (&newsig, sig,
+                                            main_pk, uid, NULL,
+                                            sk,
+                                            keygen_add_notations, notation );
+                 if( rc )
+                   {
+                     log_error ("update_keysig_packet failed: %s\n",
+                                g10_errstr(rc));
+                     free_secret_key( sk );
+                     free_notation(notation);
+                     xfree(user);
+                     return 0;
+                   }
+
+                 /* replace the packet */
+                 newpkt = xmalloc_clear( sizeof *newpkt );
+                 newpkt->pkttype = PKT_SIGNATURE;
+                 newpkt->pkt.signature = newsig;
+                 free_packet( node->pkt );
+                 xfree( node->pkt );
+                 node->pkt = newpkt;
+                 modified = 1;
+
+                 if(notation)
+                   {
+                     /* Snip off the notation list from the sig */
+                     free_notation(notation->next);
+                     notation->next=NULL;
+                   }
+
+                 xfree(user);
+               }
+           }
+       }
+    }
+
+  free_notation(notation);
+  free_secret_key( sk );
+  return modified;
+}
+
+
+/****************
+ * Select one user id or remove all selection if index is 0.
+ * Returns: True if the selection changed;
+ */
+static int
+menu_select_uid( KBNODE keyblock, int idx )
+{
+    KBNODE node;
+    int i;
+
+    /* first check that the index is valid */
+    if( idx ) {
+       for( i=0, node = keyblock; node; node = node->next ) {
+           if( node->pkt->pkttype == PKT_USER_ID ) {
+               if( ++i == idx )
+                   break;
+           }
+       }
+       if( !node ) {
+           tty_printf(_("No user ID with index %d\n"), idx );
+           return 0;
+       }
+    }
+    else { /* reset all */
+       for( i=0, node = keyblock; node; node = node->next ) {
+           if( node->pkt->pkttype == PKT_USER_ID )
+               node->flag &= ~NODFLG_SELUID;
+       }
+       return 1;
+    }
+    /* and toggle the new index */
+    for( i=0, node = keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           if( ++i == idx ) {
+               if( (node->flag & NODFLG_SELUID) )
+                   node->flag &= ~NODFLG_SELUID;
+               else
+                   node->flag |= NODFLG_SELUID;
+           }
+       }
+    }
+
+    return 1;
+}
+
+/* Search in the keyblock for a uid that matches namehash */
+static int
+menu_select_uid_namehash( KBNODE keyblock, const char *namehash )
+{
+  byte hash[NAMEHASH_LEN];
+  KBNODE node;
+  int i;
+
+  assert(strlen(namehash)==NAMEHASH_LEN*2);
+
+  for(i=0;i<NAMEHASH_LEN;i++)
+    hash[i]=hextobyte(&namehash[i*2]);
+
+  for(node=keyblock->next;node;node=node->next)
+    {
+      if(node->pkt->pkttype==PKT_USER_ID)
+       {
+         namehash_from_uid(node->pkt->pkt.user_id);
+         if(memcmp(node->pkt->pkt.user_id->namehash,hash,NAMEHASH_LEN)==0)
+           {
+             if(node->flag&NODFLG_SELUID)
+               node->flag &= ~NODFLG_SELUID;
+             else
+               node->flag |= NODFLG_SELUID;
+
+             break;
+           }
+       }
+    }
+
+    if(!node)
+      {
+       tty_printf(_("No user ID with hash %s\n"),namehash);
+       return 0;
+      }
+
+  return 1;
+}
+
+/****************
+ * Select secondary keys
+ * Returns: True if the selection changed;
+ */
+static int
+menu_select_key( KBNODE keyblock, int idx )
+{
+    KBNODE node;
+    int i;
+
+    /* first check that the index is valid */
+    if( idx ) {
+       for( i=0, node = keyblock; node; node = node->next ) {
+           if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+               || node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+               if( ++i == idx )
+                   break;
+           }
+       }
+       if( !node ) {
+           tty_printf(_("No subkey with index %d\n"), idx );
+           return 0;
+       }
+    }
+    else { /* reset all */
+       for( i=0, node = keyblock; node; node = node->next ) {
+           if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+               || node->pkt->pkttype == PKT_SECRET_SUBKEY )
+               node->flag &= ~NODFLG_SELKEY;
+       }
+       return 1;
+    }
+    /* and set the new index */
+    for( i=0, node = keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+           || node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+           if( ++i == idx ) {
+               if( (node->flag & NODFLG_SELKEY) )
+                   node->flag &= ~NODFLG_SELKEY;
+               else
+                   node->flag |= NODFLG_SELKEY;
+           }
+       }
+    }
+
+    return 1;
+}
+
+
+static int
+count_uids_with_flag( KBNODE keyblock, unsigned flag )
+{
+    KBNODE node;
+    int i=0;
+
+    for( node = keyblock; node; node = node->next )
+       if( node->pkt->pkttype == PKT_USER_ID && (node->flag & flag) )
+           i++;
+    return i;
+}
+
+static int
+count_keys_with_flag( KBNODE keyblock, unsigned flag )
+{
+    KBNODE node;
+    int i=0;
+
+    for( node = keyblock; node; node = node->next )
+       if( ( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+             || node->pkt->pkttype == PKT_SECRET_SUBKEY)
+           && (node->flag & flag) )
+           i++;
+    return i;
+}
+
+static int
+count_uids( KBNODE keyblock )
+{
+    KBNODE node;
+    int i=0;
+
+    for( node = keyblock; node; node = node->next )
+       if( node->pkt->pkttype == PKT_USER_ID )
+           i++;
+    return i;
+}
+
+
+/****************
+ * Returns true if there is at least one selected user id
+ */
+static int
+count_selected_uids( KBNODE keyblock )
+{
+    return count_uids_with_flag( keyblock, NODFLG_SELUID);
+}
+
+static int
+count_selected_keys( KBNODE keyblock )
+{
+    return count_keys_with_flag( keyblock, NODFLG_SELKEY);
+}
+
+/* returns how many real (i.e. not attribute) uids are unmarked */
+static int
+real_uids_left( KBNODE keyblock )
+{
+  KBNODE node;
+  int real=0;
+
+  for(node=keyblock;node;node=node->next)
+    if(node->pkt->pkttype==PKT_USER_ID && !(node->flag&NODFLG_SELUID) &&
+       !node->pkt->pkt.user_id->attrib_data)
+      real++;
+
+  return real;
+}
+
+/*
+ * Ask whether the signature should be revoked.  If the user commits this,
+ * flag bit MARK_A is set on the signature and the user ID.
+ */
+static void
+ask_revoke_sig( KBNODE keyblock, KBNODE node )
+{
+    int doit=0;
+    PKT_user_id *uid;
+    PKT_signature *sig = node->pkt->pkt.signature;
+    KBNODE unode = find_prev_kbnode( keyblock, node, PKT_USER_ID );
+
+    if( !unode ) {
+       log_error("Oops: no user ID for signature\n");
+       return;
+    }
+
+    uid=unode->pkt->pkt.user_id;
+
+    if(opt.with_colons)
+      {
+       if(uid->attrib_data)
+         printf("uat:::::::::%u %lu",uid->numattribs,uid->attrib_len);
+       else
+         {
+           printf("uid:::::::::");
+           print_string (stdout, uid->name, uid->len, ':');
+         }
+
+       printf("\n");
+
+       print_and_check_one_sig_colon(keyblock,node,NULL,NULL,NULL,NULL,1);
+      }
+    else
+      {
+       char *p=utf8_to_native(unode->pkt->pkt.user_id->name,
+                        unode->pkt->pkt.user_id->len,0);
+       tty_printf(_("user ID: \"%s\"\n"),p);
+       xfree(p);
+
+       tty_printf(_("signed by your key %s on %s%s%s\n"),
+                  keystr(sig->keyid),datestr_from_sig(sig),
+                  sig->flags.exportable?"":_(" (non-exportable)"),"");
+      }
+    if(sig->flags.expired)
+      {
+       tty_printf(_("This signature expired on %s.\n"),
+                  expirestr_from_sig(sig));
+       /* Use a different question so we can have different help text */
+       doit=cpr_get_answer_is_yes("ask_revoke_sig.expired",
+                       _("Are you sure you still want to revoke it? (y/N) "));
+      }
+    else
+      doit=cpr_get_answer_is_yes("ask_revoke_sig.one",
+             _("Create a revocation certificate for this signature? (y/N) "));
+
+    if(doit) {
+      node->flag |= NODFLG_MARK_A;
+      unode->flag |= NODFLG_MARK_A;
+    }
+}
+
+/****************
+ * Display all user ids of the current public key together with signatures
+ * done by one of our keys.  Then walk over all this sigs and ask the user
+ * whether he wants to revoke this signature.
+ * Return: True when the keyblock has changed.
+ */
+static int
+menu_revsig( KBNODE keyblock )
+{
+    PKT_signature *sig;
+    PKT_public_key *primary_pk;
+    KBNODE node;
+    int changed = 0;
+    int rc, any, skip=1, all=!count_selected_uids(keyblock);
+    struct revocation_reason_info *reason = NULL;
+
+    assert(keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+
+    /* FIXME: detect duplicates here  */
+    tty_printf(_("You have signed these user IDs on key %s:\n"),
+              keystr_from_pk(keyblock->pkt->pkt.public_key));
+    for( node = keyblock; node; node = node->next ) {
+       node->flag &= ~(NODFLG_SELSIG | NODFLG_MARK_A);
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           if( node->flag&NODFLG_SELUID || all ) {
+             PKT_user_id *uid = node->pkt->pkt.user_id;
+             /* Hmmm: Should we show only UIDs with a signature? */
+             tty_printf("     ");
+             tty_print_utf8_string( uid->name, uid->len );
+             tty_printf("\n");
+             skip=0;
+           }
+           else
+             skip=1;
+       }
+       else if( !skip && node->pkt->pkttype == PKT_SIGNATURE
+               && ((sig = node->pkt->pkt.signature),
+                     !seckey_available(sig->keyid)  ) )
+         {
+           if( (sig->sig_class&~3) == 0x10 )
+             {
+               tty_printf("   ");
+               tty_printf(_("signed by your key %s on %s%s%s\n"),
+                          keystr(sig->keyid), datestr_from_sig(sig),
+                          sig->flags.exportable?"":_(" (non-exportable)"),
+                          sig->flags.revocable?"":_(" (non-revocable)"));
+               if(sig->flags.revocable)
+                 node->flag |= NODFLG_SELSIG;
+             }
+           else if( sig->sig_class == 0x30 )
+             {
+               tty_printf("   ");
+               tty_printf(_("revoked by your key %s on %s\n"),
+                          keystr(sig->keyid),datestr_from_sig(sig));
+             }
+         }
+    }
+
+    tty_printf("\n");
+
+    /* ask */
+    for( node = keyblock; node; node = node->next ) {
+       if( !(node->flag & NODFLG_SELSIG) )
+           continue;
+       ask_revoke_sig( keyblock, node );
+    }
+
+    /* present selected */
+    any = 0;
+    for( node = keyblock; node; node = node->next ) {
+       if( !(node->flag & NODFLG_MARK_A) )
+           continue;
+       if( !any ) {
+           any = 1;
+           tty_printf(_("You are about to revoke these signatures:\n"));
+       }
+       if( node->pkt->pkttype == PKT_USER_ID ) {
+           PKT_user_id *uid = node->pkt->pkt.user_id;
+           tty_printf("     ");
+           tty_print_utf8_string( uid->name, uid->len );
+           tty_printf("\n");
+       }
+       else if( node->pkt->pkttype == PKT_SIGNATURE ) {
+           sig = node->pkt->pkt.signature;
+           tty_printf("   ");
+           tty_printf(_("signed by your key %s on %s%s%s\n"),
+                      keystr(sig->keyid), datestr_from_sig(sig),"",
+                      sig->flags.exportable?"":_(" (non-exportable)") );
+       }
+    }
+    if( !any )
+       return 0; /* none selected */
+
+    if( !cpr_get_answer_is_yes("ask_revoke_sig.okay",
+        _("Really create the revocation certificates? (y/N) ")) )
+       return 0; /* forget it */
+
+    reason = ask_revocation_reason( 0, 1, 0 );
+    if( !reason ) { /* user decided to cancel */
+       return 0;
+    }
+
+    /* now we can sign the user ids */
+  reloop: /* (must use this, because we are modifing the list) */
+    primary_pk = keyblock->pkt->pkt.public_key;
+    for( node=keyblock; node; node = node->next ) {
+       KBNODE unode;
+       PACKET *pkt;
+       struct sign_attrib attrib;
+       PKT_secret_key *sk;
+
+       if( !(node->flag & NODFLG_MARK_A)
+           || node->pkt->pkttype != PKT_SIGNATURE )
+           continue;
+       unode = find_prev_kbnode( keyblock, node, PKT_USER_ID );
+       assert( unode ); /* we already checked this */
+
+       memset( &attrib, 0, sizeof attrib );
+       attrib.reason = reason;
+       attrib.non_exportable=!node->pkt->pkt.signature->flags.exportable;
+
+       node->flag &= ~NODFLG_MARK_A;
+       sk = xmalloc_secure_clear( sizeof *sk );
+       if( get_seckey( sk, node->pkt->pkt.signature->keyid ) ) {
+           log_info(_("no secret key\n"));
+           continue;
+       }
+       rc = make_keysig_packet( &sig, primary_pk,
+                                      unode->pkt->pkt.user_id,
+                                      NULL,
+                                      sk,
+                                      0x30, 0, 0, 0, 0,
+                                      sign_mk_attrib,
+                                      &attrib );
+       free_secret_key(sk);
+       if( rc ) {
+           log_error(_("signing failed: %s\n"), g10_errstr(rc));
+           release_revocation_reason_info( reason );
+           return changed;
+       }
+       changed = 1; /* we changed the keyblock */
+       update_trust = 1;
+       /* Are we revoking our own uid? */
+       if(primary_pk->keyid[0]==sig->keyid[0] &&
+          primary_pk->keyid[1]==sig->keyid[1])
+         unode->pkt->pkt.user_id->is_revoked=1;
+       pkt = xmalloc_clear( sizeof *pkt );
+       pkt->pkttype = PKT_SIGNATURE;
+       pkt->pkt.signature = sig;
+       insert_kbnode( unode, new_kbnode(pkt), 0 );
+       goto reloop;
+    }
+
+    release_revocation_reason_info( reason );
+    return changed;
+}
+
+/* Revoke a user ID (i.e. revoke a user ID selfsig).  Return true if
+   keyblock changed. */
+static int
+menu_revuid( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+  PKT_public_key *pk = pub_keyblock->pkt->pkt.public_key;
+  PKT_secret_key *sk = copy_secret_key( NULL,
+                                       sec_keyblock->pkt->pkt.secret_key );
+  KBNODE node;
+  int changed = 0;
+  int rc;
+  struct revocation_reason_info *reason = NULL;
+
+  /* Note that this is correct as per the RFCs, but nevertheless
+     somewhat meaningless in the real world.  1991 did define the 0x30
+     sig class, but PGP 2.x did not actually implement it, so it would
+     probably be safe to use v4 revocations everywhere. -ds */
+
+  for( node = pub_keyblock; node; node = node->next )
+    if(pk->version>3 || (node->pkt->pkttype==PKT_USER_ID &&
+                        node->pkt->pkt.user_id->selfsigversion>3))
+      {
+       if((reason = ask_revocation_reason( 0, 1, 4 )))
+         break;
+       else
+         goto leave;
+      }
+
+ reloop: /* (better this way because we are modifing the keyring) */
+  for( node = pub_keyblock; node; node = node->next )
+    if(node->pkt->pkttype == PKT_USER_ID && (node->flag & NODFLG_SELUID))
+      {
+       PKT_user_id *uid=node->pkt->pkt.user_id;
+
+       if(uid->is_revoked)
+         {
+           char *user=utf8_to_native(uid->name,uid->len,0);
+           log_info(_("user ID \"%s\" is already revoked\n"),user);
+           xfree(user);
+         }
+       else
+         {
+           PACKET *pkt;
+           PKT_signature *sig;
+           struct sign_attrib attrib;
+           u32 timestamp=make_timestamp();
+
+           if(uid->created>=timestamp)
+             {
+               /* Okay, this is a problem.  The user ID selfsig was
+                  created in the future, so we need to warn the user and
+                  set our revocation timestamp one second after that so
+                  everything comes out clean. */
+
+               log_info(_("WARNING: a user ID signature is dated %d"
+                          " seconds in the future\n"),uid->created-timestamp);
+
+               timestamp=uid->created+1;
+             }
+
+           memset( &attrib, 0, sizeof attrib );
+           attrib.reason = reason;
+
+           node->flag &= ~NODFLG_SELUID;
+
+           rc = make_keysig_packet( &sig, pk, uid, NULL, sk, 0x30, 0,
+                                    (reason==NULL)?3:0, timestamp, 0,
+                                    sign_mk_attrib, &attrib );
+           if( rc )
+             {
+               log_error(_("signing failed: %s\n"), g10_errstr(rc));
+               goto leave;
+             }
+           else
+             {
+               pkt = xmalloc_clear( sizeof *pkt );
+               pkt->pkttype = PKT_SIGNATURE;
+               pkt->pkt.signature = sig;
+               insert_kbnode( node, new_kbnode(pkt), 0 );
+
+               /* If the trustdb has an entry for this key+uid then the
+                  trustdb needs an update. */
+               if(!update_trust
+                  && (get_validity(pk,uid)&TRUST_MASK)>=TRUST_UNDEFINED)
+                 update_trust=1;
+
+               changed = 1;
+               node->pkt->pkt.user_id->is_revoked=1;
+
+               goto reloop;
+             }
+         }
+      }
+
+  if(changed)
+    commit_kbnode( &pub_keyblock );
+
+ leave:
+  free_secret_key(sk);
+  release_revocation_reason_info( reason );
+  return changed;
+}
+
+/****************
+ * Revoke the whole key.
+ */
+static int
+menu_revkey( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+  PKT_public_key *pk=pub_keyblock->pkt->pkt.public_key;
+  PKT_secret_key *sk;
+  int rc,changed = 0;
+  struct revocation_reason_info *reason;
+  PACKET *pkt;
+  PKT_signature *sig;
+
+  if(pk->is_revoked)
+    {
+      tty_printf(_("Key %s is already revoked.\n"),keystr_from_pk(pk));
+      return 0;
+    }
+
+  reason = ask_revocation_reason( 1, 0, 0 );
+  /* user decided to cancel */
+  if( !reason )
+    return 0;
+
+  sk = copy_secret_key( NULL, sec_keyblock->pkt->pkt.secret_key );
+  rc = make_keysig_packet( &sig, pk, NULL, NULL, sk,
+                          0x20, 0, opt.force_v4_certs?4:0, 0, 0,
+                          revocation_reason_build_cb, reason );
+  free_secret_key(sk);
+  if( rc )
+    {
+      log_error(_("signing failed: %s\n"), g10_errstr(rc));
+      goto scram;
+    }
+
+  changed = 1; /* we changed the keyblock */
+
+  pkt = xmalloc_clear( sizeof *pkt );
+  pkt->pkttype = PKT_SIGNATURE;
+  pkt->pkt.signature = sig;
+  insert_kbnode( pub_keyblock, new_kbnode(pkt), 0 );
+  commit_kbnode( &pub_keyblock );
+
+  update_trust=1;
+
+ scram:
+  release_revocation_reason_info( reason );
+  return changed;
+}
+
+static int
+menu_revsubkey( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    PKT_public_key *mainpk;
+    KBNODE node;
+    int changed = 0;
+    int rc;
+    struct revocation_reason_info *reason = NULL;
+
+    reason = ask_revocation_reason( 1, 0, 0 );
+    if( !reason ) { /* user decided to cancel */
+       return 0;
+    }
+
+  reloop: /* (better this way because we are modifing the keyring) */
+    mainpk = pub_keyblock->pkt->pkt.public_key;
+    for( node = pub_keyblock; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY
+           && (node->flag & NODFLG_SELKEY) ) {
+           PACKET *pkt;
+           PKT_signature *sig;
+           PKT_secret_key *sk;
+           PKT_public_key *subpk = node->pkt->pkt.public_key;
+           struct sign_attrib attrib;
+
+           if(subpk->is_revoked)
+             {
+               tty_printf(_("Subkey %s is already revoked.\n"),
+                          keystr_from_pk(subpk));
+               continue;
+             }
+
+           memset( &attrib, 0, sizeof attrib );
+           attrib.reason = reason;
+
+           node->flag &= ~NODFLG_SELKEY;
+           sk = copy_secret_key( NULL, sec_keyblock->pkt->pkt.secret_key );
+           rc = make_keysig_packet( &sig, mainpk, NULL, subpk, sk,
+                                     0x28, 0, 0, 0, 0,
+                                    sign_mk_attrib, &attrib );
+           free_secret_key(sk);
+           if( rc ) {
+               log_error(_("signing failed: %s\n"), g10_errstr(rc));
+               release_revocation_reason_info( reason );
+               return changed;
+           }
+           changed = 1; /* we changed the keyblock */
+
+           pkt = xmalloc_clear( sizeof *pkt );
+           pkt->pkttype = PKT_SIGNATURE;
+           pkt->pkt.signature = sig;
+           insert_kbnode( node, new_kbnode(pkt), 0 );
+           goto reloop;
+       }
+    }
+    commit_kbnode( &pub_keyblock );
+    /*commit_kbnode( &sec_keyblock );*/
+
+    /* No need to set update_trust here since signing keys no longer
+       are used to certify other keys, so there is no change in trust
+       when revoking/removing them */
+
+    release_revocation_reason_info( reason );
+    return changed;
+}
+
+/* Note that update_ownertrust is going to mark the trustdb dirty when
+   enabling or disabling a key.  This is arguably sub-optimal as
+   disabled keys are still counted in the web of trust, but perhaps
+   not worth adding extra complexity to change. -ds */
+static int
+enable_disable_key( KBNODE keyblock, int disable )
+{
+    PKT_public_key *pk = find_kbnode( keyblock, PKT_PUBLIC_KEY )
+                           ->pkt->pkt.public_key;
+    unsigned int trust, newtrust;
+
+    trust = newtrust = get_ownertrust (pk);
+    newtrust &= ~TRUST_FLAG_DISABLED;
+    if( disable )
+       newtrust |= TRUST_FLAG_DISABLED;
+    if( trust == newtrust )
+       return 0; /* already in that state */
+    update_ownertrust(pk, newtrust );
+    return 0;
+}
+
+
+static void
+menu_showphoto( KBNODE keyblock )
+{
+  KBNODE node;
+  int select_all = !count_selected_uids(keyblock);
+  int count=0;
+  PKT_public_key *pk=NULL;
+
+  /* Look for the public key first.  We have to be really, really,
+     explicit as to which photo this is, and what key it is a UID on
+     since people may want to sign it. */
+
+  for( node = keyblock; node; node = node->next )
+    {
+      if( node->pkt->pkttype == PKT_PUBLIC_KEY )
+       pk = node->pkt->pkt.public_key;
+      else if( node->pkt->pkttype == PKT_USER_ID )
+       {
+         PKT_user_id *uid = node->pkt->pkt.user_id;
+         count++;
+
+         if((select_all || (node->flag & NODFLG_SELUID)) &&
+            uid->attribs!=NULL)
+           {
+             int i;
+
+             for(i=0;i<uid->numattribs;i++)
+               {
+                 byte type;
+                 u32 size;
+
+                 if(uid->attribs[i].type==ATTRIB_IMAGE &&
+                    parse_image_header(&uid->attribs[i],&type,&size))
+                   {
+                     tty_printf(_("Displaying %s photo ID of size %ld for "
+                                  "key %s (uid %d)\n"),
+                                image_type_to_string(type,1),
+                                (ulong)size,keystr_from_pk(pk),count);
+                     show_photos(&uid->attribs[i],1,pk,NULL);
+                   }
+               }
+           }
+       }
+    }
+}
diff --git a/g10/keygen.c b/g10/keygen.c
new file mode 100644 (file)
index 0000000..620274a
--- /dev/null
@@ -0,0 +1,3707 @@
+/* keygen.c - generate a key pair
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include "util.h"
+#include "main.h"
+#include "packet.h"
+#include "cipher.h"
+#include "ttyio.h"
+#include "options.h"
+#include "keydb.h"
+#include "trustdb.h"
+#include "status.h"
+#include "i18n.h"
+#include "cardglue.h"
+#include "keyserver-internal.h"
+
+#define MAX_PREFS 30 
+
+enum para_name {
+  pKEYTYPE,
+  pKEYLENGTH,
+  pKEYUSAGE,
+  pSUBKEYTYPE,
+  pSUBKEYLENGTH,
+  pSUBKEYUSAGE,
+  pAUTHKEYTYPE,
+  pNAMEREAL,
+  pNAMEEMAIL,
+  pNAMECOMMENT,
+  pPREFERENCES,
+  pREVOKER,
+  pUSERID,
+  pEXPIREDATE,
+  pKEYEXPIRE, /* in n seconds */
+  pSUBKEYEXPIRE, /* in n seconds */
+  pPASSPHRASE,
+  pPASSPHRASE_DEK,
+  pPASSPHRASE_S2K,
+  pSERIALNO,
+  pBACKUPENCDIR,
+  pHANDLE,
+  pKEYSERVER
+};
+
+struct para_data_s {
+    struct para_data_s *next;
+    int lnr;
+    enum para_name key;
+    union {
+        DEK *dek;
+        STRING2KEY *s2k;
+        u32 expire;
+        unsigned int usage;
+        struct revocation_key revkey;
+        char value[1];
+    } u;
+};
+
+struct output_control_s {
+    int lnr;
+    int dryrun;
+    int use_files;
+    struct {
+       char  *fname;
+       char  *newfname;
+       IOBUF stream;
+       armor_filter_context_t afx;
+    } pub;
+    struct {
+       char  *fname;
+       char  *newfname;
+       IOBUF stream;
+       armor_filter_context_t afx;
+    } sec;
+};
+
+
+struct opaque_data_usage_and_pk {
+    unsigned int usage;
+    PKT_public_key *pk;
+};
+
+
+static int prefs_initialized = 0;
+static byte sym_prefs[MAX_PREFS];
+static int nsym_prefs;
+static byte hash_prefs[MAX_PREFS];
+static int nhash_prefs;
+static byte zip_prefs[MAX_PREFS];
+static int nzip_prefs;
+static int mdc_available,ks_modify;
+
+static void do_generate_keypair( struct para_data_s *para,
+                                struct output_control_s *outctrl, int card );
+static int  write_keyblock( IOBUF out, KBNODE node );
+static int gen_card_key (int algo, int keyno, int is_primary,
+                         KBNODE pub_root, KBNODE sec_root,
+                        PKT_secret_key **ret_sk,
+                         u32 expireval, struct para_data_s *para);
+static int gen_card_key_with_backup (int algo, int keyno, int is_primary,
+                                     KBNODE pub_root, KBNODE sec_root,
+                                     u32 expireval, struct para_data_s *para,
+                                     const char *backup_dir);
+
+
+static void
+print_status_key_created (int letter, PKT_public_key *pk, const char *handle)
+{
+  byte array[MAX_FINGERPRINT_LEN], *s;
+  char *buf, *p;
+  size_t i, n;
+  
+  if (!handle)
+    handle = "";
+
+  buf = xmalloc (MAX_FINGERPRINT_LEN*2+31 + strlen (handle) + 1);
+
+  p = buf;
+  if (letter || pk)
+    {
+      *p++ = letter;
+      *p++ = ' ';
+      fingerprint_from_pk (pk, array, &n);
+      s = array;
+      for (i=0; i < n ; i++, s++, p += 2)
+        sprintf (p, "%02X", *s);
+    }
+  if (*handle)
+    {
+      *p++ = ' ';
+      for (i=0; handle[i] && i < 100; i++)
+        *p++ = isspace ((unsigned int)handle[i])? '_':handle[i];
+    }
+  *p = 0;
+  write_status_text ((letter || pk)?STATUS_KEY_CREATED:STATUS_KEY_NOT_CREATED,
+                     buf);
+  xfree (buf);
+}
+
+static void
+print_status_key_not_created (const char *handle)
+{
+  print_status_key_created (0, NULL, handle);
+}
+
+
+
+static void
+write_uid( KBNODE root, const char *s )
+{
+    PACKET *pkt = xmalloc_clear(sizeof *pkt );
+    size_t n = strlen(s);
+
+    pkt->pkttype = PKT_USER_ID;
+    pkt->pkt.user_id = xmalloc_clear( sizeof *pkt->pkt.user_id + n - 1 );
+    pkt->pkt.user_id->len = n;
+    pkt->pkt.user_id->ref = 1;
+    strcpy(pkt->pkt.user_id->name, s);
+    add_kbnode( root, new_kbnode( pkt ) );
+}
+
+static void
+do_add_key_flags (PKT_signature *sig, unsigned int use)
+{
+    byte buf[1];
+
+    buf[0] = 0;
+
+    /* The spec says that all primary keys MUST be able to certify. */
+    if(sig->sig_class!=0x18)
+      buf[0] |= 0x01;
+
+    if (use & PUBKEY_USAGE_SIG)
+      buf[0] |= 0x02;
+    if (use & PUBKEY_USAGE_ENC)
+        buf[0] |= 0x04 | 0x08;
+    if (use & PUBKEY_USAGE_AUTH)
+        buf[0] |= 0x20;
+
+    if (!buf[0]) 
+        return;
+
+    build_sig_subpkt (sig, SIGSUBPKT_KEY_FLAGS, buf, 1);
+}
+
+
+int
+keygen_add_key_expire( PKT_signature *sig, void *opaque )
+{
+    PKT_public_key *pk = opaque;
+    byte buf[8];
+    u32  u;
+
+    if( pk->expiredate ) {
+        if(pk->expiredate > pk->timestamp)
+         u= pk->expiredate - pk->timestamp;
+       else
+         u= 1;
+
+       buf[0] = (u >> 24) & 0xff;
+       buf[1] = (u >> 16) & 0xff;
+       buf[2] = (u >>  8) & 0xff;
+       buf[3] = u & 0xff;
+       build_sig_subpkt( sig, SIGSUBPKT_KEY_EXPIRE, buf, 4 );
+    }
+    else
+      {
+       /* Make sure we don't leave a key expiration subpacket lying
+          around */
+       delete_sig_subpkt (sig->hashed, SIGSUBPKT_KEY_EXPIRE);
+      }
+
+    return 0;
+}
+
+static int
+keygen_add_key_flags_and_expire (PKT_signature *sig, void *opaque)
+{
+    struct opaque_data_usage_and_pk *oduap = opaque;
+
+    do_add_key_flags (sig, oduap->usage);
+    return keygen_add_key_expire (sig, oduap->pk);
+}
+
+static int
+set_one_pref (int val, int type, const char *item, byte *buf, int *nbuf)
+{
+    int i;
+
+    for (i=0; i < *nbuf; i++ )
+      if (buf[i] == val)
+       {
+         log_info (_("preference `%s' duplicated\n"), item);
+         return -1;
+        }
+
+    if (*nbuf >= MAX_PREFS)
+      {
+       if(type==1)
+         log_info(_("too many cipher preferences\n"));
+       else if(type==2)
+         log_info(_("too many digest preferences\n"));
+       else if(type==3)
+         log_info(_("too many compression preferences\n"));
+       else
+         BUG();
+
+        return -1;
+      }
+
+    buf[(*nbuf)++] = val;
+    return 0;
+}
+
+/*
+ * Parse the supplied string and use it to set the standard
+ * preferences.  The string may be in a form like the one printed by
+ * "pref" (something like: "S10 S3 H3 H2 Z2 Z1") or the actual
+ * cipher/hash/compress names.  Use NULL to set the default
+ * preferences.  Returns: 0 = okay
+ */
+int
+keygen_set_std_prefs (const char *string,int personal)
+{
+    byte sym[MAX_PREFS], hash[MAX_PREFS], zip[MAX_PREFS];
+    int nsym=0, nhash=0, nzip=0, val, rc=0;
+    int mdc=1, modify=0; /* mdc defaults on, modify defaults off. */
+    char dummy_string[45+1]; /* Enough for 15 items. */
+
+    if (!string || !ascii_strcasecmp (string, "default"))
+      {
+       if (opt.def_preference_list)
+         string=opt.def_preference_list;
+       else
+         {
+           dummy_string[0]='\0';
+
+            /* The rationale why we use the order AES256,192,128 is
+               for compatibility reasons with PGP.  If gpg would
+               define AES128 first, we would get the somewhat
+               confusing situation:
+
+                 gpg -r pgpkey -r gpgkey  ---gives--> AES256
+                 gpg -r gpgkey -r pgpkey  ---gives--> AES
+                 
+               Note that by using --personal-cipher-preferences it is
+               possible to prefer AES128.
+            */
+
+           /* Make sure we do not add more than 15 items here, as we
+              could overflow the size of dummy_string.  We currently
+              have at most 12. */
+           if(!check_cipher_algo(CIPHER_ALGO_AES256))
+             strcat(dummy_string,"S9 ");
+           if(!check_cipher_algo(CIPHER_ALGO_AES192))
+             strcat(dummy_string,"S8 ");
+           if(!check_cipher_algo(CIPHER_ALGO_AES))
+             strcat(dummy_string,"S7 ");
+           if(!check_cipher_algo(CIPHER_ALGO_CAST5))
+             strcat(dummy_string,"S3 ");
+           strcat(dummy_string,"S2 "); /* 3DES */
+           /* If we have it, IDEA goes *after* 3DES so it won't be
+              used unless we're encrypting along with a V3 key.
+              Ideally, we would only put the S1 preference in if the
+              key was RSA and <=2048 bits, as that is what won't
+              break PGP2, but that is difficult with the current
+              code, and not really worth checking as a non-RSA <=2048
+              bit key wouldn't be usable by PGP2 anyway. -dms */
+           if(!check_cipher_algo(CIPHER_ALGO_IDEA))
+             strcat(dummy_string,"S1 ");
+
+           /* SHA-1 */
+           strcat(dummy_string,"H2 ");
+
+           if(!check_digest_algo(DIGEST_ALGO_SHA256))
+             strcat(dummy_string,"H8 ");
+
+           /* RIPEMD160 */
+           strcat(dummy_string,"H3 ");
+
+           /* ZLIB */
+           strcat(dummy_string,"Z2 ");
+
+           if(!check_compress_algo(COMPRESS_ALGO_BZIP2))
+             strcat(dummy_string,"Z3 ");
+
+           /* ZIP */
+           strcat(dummy_string,"Z1");
+
+           string=dummy_string;
+         }
+      }
+    else if (!ascii_strcasecmp (string, "none"))
+        string = "";
+
+    if(strlen(string))
+      {
+       char *tok,*prefstring;
+
+       prefstring=xstrdup(string); /* need a writable string! */
+
+       while((tok=strsep(&prefstring," ,")))
+         {
+           if((val=string_to_cipher_algo(tok)))
+             {
+               if(set_one_pref(val,1,tok,sym,&nsym))
+                 rc=-1;
+             }
+           else if((val=string_to_digest_algo(tok)))
+             {
+               if(set_one_pref(val,2,tok,hash,&nhash))
+                 rc=-1;
+             }
+           else if((val=string_to_compress_algo(tok))>-1)
+             {
+               if(set_one_pref(val,3,tok,zip,&nzip))
+                 rc=-1;
+             }
+           else if (ascii_strcasecmp(tok,"mdc")==0)
+             mdc=1;
+           else if (ascii_strcasecmp(tok,"no-mdc")==0)
+             mdc=0;
+           else if (ascii_strcasecmp(tok,"ks-modify")==0)
+             modify=1;
+           else if (ascii_strcasecmp(tok,"no-ks-modify")==0)
+             modify=0;
+           else
+             {
+               log_info (_("invalid item `%s' in preference string\n"),tok);
+
+               /* Complain if IDEA is not available. */
+               if(ascii_strcasecmp(tok,"s1")==0
+                  || ascii_strcasecmp(tok,"idea")==0)
+                 idea_cipher_warn(1);
+
+               rc=-1;
+             }
+         }
+
+       xfree(prefstring);
+      }
+
+    if(!rc)
+      {
+       if(personal)
+         {
+           if(personal==PREFTYPE_SYM)
+             {
+               xfree(opt.personal_cipher_prefs);
+
+               if(nsym==0)
+                 opt.personal_cipher_prefs=NULL;
+               else
+                 {
+                   int i;
+
+                   opt.personal_cipher_prefs=
+                     xmalloc(sizeof(prefitem_t *)*(nsym+1));
+
+                   for (i=0; i<nsym; i++)
+                     {
+                       opt.personal_cipher_prefs[i].type = PREFTYPE_SYM;
+                       opt.personal_cipher_prefs[i].value = sym[i];
+                     }
+
+                   opt.personal_cipher_prefs[i].type = PREFTYPE_NONE;
+                   opt.personal_cipher_prefs[i].value = 0;
+                 }
+             }
+           else if(personal==PREFTYPE_HASH)
+             {
+               xfree(opt.personal_digest_prefs);
+
+               if(nhash==0)
+                 opt.personal_digest_prefs=NULL;
+               else
+                 {
+                   int i;
+
+                   opt.personal_digest_prefs=
+                     xmalloc(sizeof(prefitem_t *)*(nhash+1));
+
+                   for (i=0; i<nhash; i++)
+                     {
+                       opt.personal_digest_prefs[i].type = PREFTYPE_HASH;
+                       opt.personal_digest_prefs[i].value = hash[i];
+                     }
+
+                   opt.personal_digest_prefs[i].type = PREFTYPE_NONE;
+                   opt.personal_digest_prefs[i].value = 0;
+                 }
+             }
+           else if(personal==PREFTYPE_ZIP)
+             {
+               xfree(opt.personal_compress_prefs);
+
+               if(nzip==0)
+                 opt.personal_compress_prefs=NULL;
+               else
+                 {
+                   int i;
+
+                   opt.personal_compress_prefs=
+                     xmalloc(sizeof(prefitem_t *)*(nzip+1));
+
+                   for (i=0; i<nzip; i++)
+                     {
+                       opt.personal_compress_prefs[i].type = PREFTYPE_ZIP;
+                       opt.personal_compress_prefs[i].value = zip[i];
+                     }
+
+                   opt.personal_compress_prefs[i].type = PREFTYPE_NONE;
+                   opt.personal_compress_prefs[i].value = 0;
+                 }
+             }
+         }
+       else
+         {
+           memcpy (sym_prefs,  sym,  (nsym_prefs=nsym));
+           memcpy (hash_prefs, hash, (nhash_prefs=nhash));
+           memcpy (zip_prefs,  zip,  (nzip_prefs=nzip));
+           mdc_available = mdc;
+           ks_modify = modify;
+           prefs_initialized = 1;
+         }
+      }
+
+    return rc;
+}
+
+/* Return a fake user ID containing the preferences.  Caller must
+   free. */
+PKT_user_id *keygen_get_std_prefs(void)
+{
+  int i,j=0;
+  PKT_user_id *uid=xmalloc_clear(sizeof(PKT_user_id));
+
+  if(!prefs_initialized)
+    keygen_set_std_prefs(NULL,0);
+
+  uid->ref=1;
+
+  uid->prefs=xmalloc((sizeof(prefitem_t *)*
+                     (nsym_prefs+nhash_prefs+nzip_prefs+1)));
+
+  for(i=0;i<nsym_prefs;i++,j++)
+    {
+      uid->prefs[j].type=PREFTYPE_SYM;
+      uid->prefs[j].value=sym_prefs[i];
+    }
+
+  for(i=0;i<nhash_prefs;i++,j++)
+    {
+      uid->prefs[j].type=PREFTYPE_HASH;
+      uid->prefs[j].value=hash_prefs[i];
+    }
+
+  for(i=0;i<nzip_prefs;i++,j++)
+    {
+      uid->prefs[j].type=PREFTYPE_ZIP;
+      uid->prefs[j].value=zip_prefs[i];
+    }
+
+  uid->prefs[j].type=PREFTYPE_NONE;
+  uid->prefs[j].value=0;
+
+  uid->flags.mdc=mdc_available;
+  uid->flags.ks_modify=ks_modify;
+
+  return uid;
+}
+
+static void
+add_feature_mdc (PKT_signature *sig,int enabled)
+{
+    const byte *s;
+    size_t n;
+    int i;
+    char *buf;
+
+    s = parse_sig_subpkt (sig->hashed, SIGSUBPKT_FEATURES, &n );
+    /* Already set or cleared */
+    if (s && n &&
+       ((enabled && (s[0] & 0x01)) || (!enabled && !(s[0] & 0x01))))
+      return;
+
+    if (!s || !n) { /* create a new one */
+        n = 1;
+        buf = xmalloc_clear (n);
+    }
+    else {
+        buf = xmalloc (n);
+        memcpy (buf, s, n);
+    }
+
+    if(enabled)
+      buf[0] |= 0x01; /* MDC feature */
+    else
+      buf[0] &= ~0x01;
+
+    /* Are there any bits set? */
+    for(i=0;i<n;i++)
+      if(buf[i]!=0)
+       break;
+
+    if(i==n)
+      delete_sig_subpkt (sig->hashed, SIGSUBPKT_FEATURES);
+    else
+      build_sig_subpkt (sig, SIGSUBPKT_FEATURES, buf, n);
+
+    xfree (buf);
+}
+
+static void
+add_keyserver_modify (PKT_signature *sig,int enabled)
+{
+  const byte *s;
+  size_t n;
+  int i;
+  char *buf;
+
+  /* The keyserver modify flag is a negative flag (i.e. no-modify) */
+  enabled=!enabled;
+
+  s = parse_sig_subpkt (sig->hashed, SIGSUBPKT_KS_FLAGS, &n );
+  /* Already set or cleared */
+  if (s && n &&
+      ((enabled && (s[0] & 0x80)) || (!enabled && !(s[0] & 0x80))))
+    return;
+
+  if (!s || !n) { /* create a new one */
+    n = 1;
+    buf = xmalloc_clear (n);
+  }
+  else {
+    buf = xmalloc (n);
+    memcpy (buf, s, n);
+  }
+
+  if(enabled)
+    buf[0] |= 0x80; /* no-modify flag */
+  else
+    buf[0] &= ~0x80;
+
+  /* Are there any bits set? */
+  for(i=0;i<n;i++)
+    if(buf[i]!=0)
+      break;
+
+  if(i==n)
+    delete_sig_subpkt (sig->hashed, SIGSUBPKT_KS_FLAGS);
+  else
+    build_sig_subpkt (sig, SIGSUBPKT_KS_FLAGS, buf, n);
+
+  xfree (buf);
+}
+
+int
+keygen_upd_std_prefs( PKT_signature *sig, void *opaque )
+{
+    if (!prefs_initialized)
+        keygen_set_std_prefs (NULL, 0);
+
+    if (nsym_prefs) 
+        build_sig_subpkt (sig, SIGSUBPKT_PREF_SYM, sym_prefs, nsym_prefs);
+    else
+      {
+        delete_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_SYM);
+        delete_sig_subpkt (sig->unhashed, SIGSUBPKT_PREF_SYM);
+      }
+
+    if (nhash_prefs)
+        build_sig_subpkt (sig, SIGSUBPKT_PREF_HASH, hash_prefs, nhash_prefs);
+    else
+      {
+       delete_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_HASH);
+       delete_sig_subpkt (sig->unhashed, SIGSUBPKT_PREF_HASH);
+      }
+
+    if (nzip_prefs)
+        build_sig_subpkt (sig, SIGSUBPKT_PREF_COMPR, zip_prefs, nzip_prefs);
+    else
+      {
+        delete_sig_subpkt (sig->hashed, SIGSUBPKT_PREF_COMPR);
+        delete_sig_subpkt (sig->unhashed, SIGSUBPKT_PREF_COMPR);
+      }
+
+    /* Make sure that the MDC feature flag is set if needed */
+    add_feature_mdc (sig,mdc_available);
+    add_keyserver_modify (sig,ks_modify);
+    keygen_add_keyserver_url(sig,NULL);
+
+    return 0;
+}
+
+
+/****************
+ * Add preference to the self signature packet.
+ * This is only called for packets with version > 3.
+
+ */
+int
+keygen_add_std_prefs( PKT_signature *sig, void *opaque )
+{
+    PKT_public_key *pk = opaque;
+
+    do_add_key_flags (sig, pk->pubkey_usage);
+    keygen_add_key_expire( sig, opaque );
+    keygen_upd_std_prefs (sig, opaque);
+    keygen_add_keyserver_url(sig,NULL);
+
+    return 0;
+}
+
+int
+keygen_add_keyserver_url(PKT_signature *sig, void *opaque)
+{
+  const char *url=opaque;
+
+  if(!url)
+    url=opt.def_keyserver_url;
+
+  if(url)
+    build_sig_subpkt(sig,SIGSUBPKT_PREF_KS,url,strlen(url));
+  else
+    delete_sig_subpkt (sig->hashed,SIGSUBPKT_PREF_KS);
+
+  return 0;
+}
+
+int
+keygen_add_notations(PKT_signature *sig,void *opaque)
+{
+  struct notation *notation;
+
+  /* We always start clean */
+  delete_sig_subpkt(sig->hashed,SIGSUBPKT_NOTATION);
+  delete_sig_subpkt(sig->unhashed,SIGSUBPKT_NOTATION);
+  sig->flags.notation=0;
+
+  for(notation=opaque;notation;notation=notation->next)
+    if(!notation->flags.ignore)
+      {
+       unsigned char *buf;
+       unsigned int n1,n2;
+
+       n1=strlen(notation->name);
+       if(notation->altvalue)
+         n2=strlen(notation->altvalue);
+       else if(notation->bdat)
+         n2=notation->blen;
+       else
+         n2=strlen(notation->value);
+
+       buf = xmalloc( 8 + n1 + n2 );
+
+       /* human readable or not */
+       buf[0] = notation->bdat?0:0x80;
+       buf[1] = buf[2] = buf[3] = 0;
+       buf[4] = n1 >> 8;
+       buf[5] = n1;
+       buf[6] = n2 >> 8;
+       buf[7] = n2;
+       memcpy(buf+8, notation->name, n1 );
+       if(notation->altvalue)
+         memcpy(buf+8+n1, notation->altvalue, n2 );
+       else if(notation->bdat)
+         memcpy(buf+8+n1, notation->bdat, n2 );
+       else
+         memcpy(buf+8+n1, notation->value, n2 );
+       build_sig_subpkt( sig, SIGSUBPKT_NOTATION |
+                         (notation->flags.critical?SIGSUBPKT_FLAG_CRITICAL:0),
+                         buf, 8+n1+n2 );
+       xfree(buf);
+      }
+
+  return 0;
+}
+
+int
+keygen_add_revkey(PKT_signature *sig, void *opaque)
+{
+  struct revocation_key *revkey=opaque;
+  byte buf[2+MAX_FINGERPRINT_LEN];
+
+  buf[0]=revkey->class;
+  buf[1]=revkey->algid;
+  memcpy(&buf[2],revkey->fpr,MAX_FINGERPRINT_LEN);
+
+  build_sig_subpkt(sig,SIGSUBPKT_REV_KEY,buf,2+MAX_FINGERPRINT_LEN);
+
+  /* All sigs with revocation keys set are nonrevocable */
+  sig->flags.revocable=0;
+  buf[0] = 0;
+  build_sig_subpkt( sig, SIGSUBPKT_REVOCABLE, buf, 1 );
+
+  parse_revkeys(sig);
+
+  return 0;
+}
+
+int
+make_backsig(PKT_signature *sig,PKT_public_key *pk,
+            PKT_public_key *sub_pk,PKT_secret_key *sub_sk)
+{
+  PKT_signature *backsig;
+  int rc;
+
+  cache_public_key(sub_pk);
+
+  rc=make_keysig_packet(&backsig,pk,NULL,sub_pk,sub_sk,0x19,0,0,0,0,NULL,NULL);
+  if(rc)
+    log_error("make_keysig_packet failed for backsig: %s\n",g10_errstr(rc));
+  else
+    {
+      /* get it into a binary packed form. */
+      IOBUF backsig_out=iobuf_temp();
+      PACKET backsig_pkt;
+      init_packet(&backsig_pkt);
+      backsig_pkt.pkttype=PKT_SIGNATURE;
+      backsig_pkt.pkt.signature=backsig;
+      rc=build_packet(backsig_out,&backsig_pkt);
+      free_packet(&backsig_pkt);
+      if(rc)
+       log_error("build_packet failed for backsig: %s\n",g10_errstr(rc));
+      else
+       {
+         size_t pktlen=0;
+         byte *buf=iobuf_get_temp_buffer(backsig_out);
+         /* Remove the packet header */
+         if(buf[0]&0x40)
+           {
+             if(buf[1]<192)
+               {
+                 pktlen=buf[1];
+                 buf+=2;
+               }
+             else if(buf[1]<224)
+               {
+                 pktlen=(buf[1]-192)*256;
+                 pktlen+=buf[2]+192;
+                 buf+=3;
+               }
+             else if(buf[1]==255)
+               {
+                 pktlen =buf[2] << 24;
+                 pktlen|=buf[3] << 16;
+                 pktlen|=buf[4] << 8;
+                 pktlen|=buf[5];
+                 buf+=6;
+               }
+             else
+               BUG();
+           }
+         else
+           {
+             int mark=1;
+             switch(buf[0]&3)
+               {
+               case 3:
+                 BUG();
+                 break;
+               case 2:
+                 pktlen =buf[mark++] << 24;
+                 pktlen|=buf[mark++] << 16;
+               case 1:
+                 pktlen|=buf[mark++] << 8;
+               case 0:
+                 pktlen|=buf[mark++];
+               }
+             buf+=mark;
+           }
+         /* now make the binary blob into a subpacket */
+         build_sig_subpkt(sig,SIGSUBPKT_SIGNATURE,buf,pktlen);
+
+         iobuf_close(backsig_out);
+       }
+    }
+  return rc;
+}
+
+
+static int
+write_direct_sig( KBNODE root, KBNODE pub_root, PKT_secret_key *sk,
+                 struct revocation_key *revkey )
+{
+    PACKET *pkt;
+    PKT_signature *sig;
+    int rc=0;
+    KBNODE node;
+    PKT_public_key *pk;
+
+    if( opt.verbose )
+       log_info(_("writing direct signature\n"));
+
+    /* get the pk packet from the pub_tree */
+    node = find_kbnode( pub_root, PKT_PUBLIC_KEY );
+    if( !node )
+       BUG();
+    pk = node->pkt->pkt.public_key;
+
+    /* we have to cache the key, so that the verification of the signature
+     * creation is able to retrieve the public key */
+    cache_public_key (pk);
+
+    /* and make the signature */
+    rc = make_keysig_packet(&sig,pk,NULL,NULL,sk,0x1F,0,0,0,0,
+                           keygen_add_revkey,revkey);
+    if( rc ) {
+       log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_SIGNATURE;
+    pkt->pkt.signature = sig;
+    add_kbnode( root, new_kbnode( pkt ) );
+    return rc;
+}
+
+static int
+write_selfsigs( KBNODE sec_root, KBNODE pub_root, PKT_secret_key *sk,
+               unsigned int use )
+{
+    PACKET *pkt;
+    PKT_signature *sig;
+    PKT_user_id *uid;
+    int rc=0;
+    KBNODE node;
+    PKT_public_key *pk;
+
+    if( opt.verbose )
+       log_info(_("writing self signature\n"));
+
+    /* get the uid packet from the list */
+    node = find_kbnode( pub_root, PKT_USER_ID );
+    if( !node )
+       BUG(); /* no user id packet in tree */
+    uid = node->pkt->pkt.user_id;
+    /* get the pk packet from the pub_tree */
+    node = find_kbnode( pub_root, PKT_PUBLIC_KEY );
+    if( !node )
+       BUG();
+    pk = node->pkt->pkt.public_key;
+    pk->pubkey_usage = use;
+    /* we have to cache the key, so that the verification of the signature
+     * creation is able to retrieve the public key */
+    cache_public_key (pk);
+
+    /* and make the signature */
+    rc = make_keysig_packet( &sig, pk, uid, NULL, sk, 0x13, 0, 0, 0, 0,
+                            keygen_add_std_prefs, pk );
+    if( rc ) {
+       log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_SIGNATURE;
+    pkt->pkt.signature = sig;
+    add_kbnode( sec_root, new_kbnode( pkt ) );
+
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_SIGNATURE;
+    pkt->pkt.signature = copy_signature(NULL,sig);
+    add_kbnode( pub_root, new_kbnode( pkt ) );
+    return rc;
+}
+
+static int
+write_keybinding( KBNODE root, KBNODE pub_root,
+                 PKT_secret_key *pri_sk, PKT_secret_key *sub_sk,
+                  unsigned int use )
+{
+    PACKET *pkt;
+    PKT_signature *sig;
+    int rc=0;
+    KBNODE node;
+    PKT_public_key *pri_pk, *sub_pk;
+    struct opaque_data_usage_and_pk oduap;
+
+    if( opt.verbose )
+       log_info(_("writing key binding signature\n"));
+
+    /* get the pk packet from the pub_tree */
+    node = find_kbnode( pub_root, PKT_PUBLIC_KEY );
+    if( !node )
+       BUG();
+    pri_pk = node->pkt->pkt.public_key;
+    /* we have to cache the key, so that the verification of the signature
+     * creation is able to retrieve the public key */
+    cache_public_key (pri_pk);
+    /* find the last subkey */
+    sub_pk = NULL;
+    for(node=pub_root; node; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+           sub_pk = node->pkt->pkt.public_key;
+    }
+    if( !sub_pk )
+       BUG();
+
+    /* and make the signature */
+    oduap.usage = use;
+    oduap.pk = sub_pk;
+    rc=make_keysig_packet(&sig, pri_pk, NULL, sub_pk, pri_sk, 0x18, 0, 0, 0, 0,
+                         keygen_add_key_flags_and_expire, &oduap );
+    if( rc ) {
+       log_error("make_keysig_packet failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+
+    /* make a backsig */
+    if(use&PUBKEY_USAGE_SIG)
+      {
+       rc=make_backsig(sig,pri_pk,sub_pk,sub_sk);
+       if(rc)
+         return rc;
+      }
+
+    pkt = xmalloc_clear( sizeof *pkt );
+    pkt->pkttype = PKT_SIGNATURE;
+    pkt->pkt.signature = sig;
+    add_kbnode( root, new_kbnode( pkt ) );
+    return rc;
+}
+
+
+static int
+gen_elg(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
+       STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expireval, int is_subkey)
+{
+    int rc;
+    PACKET *pkt;
+    PKT_secret_key *sk;
+    PKT_public_key *pk;
+    MPI skey[4];
+    MPI *factors;
+
+    assert( is_ELGAMAL(algo) );
+
+    if( nbits < 512 ) {
+       nbits = 1024;
+       log_info(_("keysize invalid; using %u bits\n"), nbits );
+    }
+
+    if( (nbits % 32) ) {
+       nbits = ((nbits + 31) / 32) * 32;
+       log_info(_("keysize rounded up to %u bits\n"), nbits );
+    }
+
+    rc = pubkey_generate( algo, nbits, skey, &factors );
+    if( rc ) {
+       log_error("pubkey_generate failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+
+    sk = xmalloc_clear( sizeof *sk );
+    pk = xmalloc_clear( sizeof *pk );
+    sk->timestamp = pk->timestamp = make_timestamp();
+    sk->version = pk->version = 4;
+    if( expireval ) {
+       sk->expiredate = pk->expiredate = sk->timestamp + expireval;
+    }
+    sk->pubkey_algo = pk->pubkey_algo = algo;
+                      pk->pkey[0] = mpi_copy( skey[0] );
+                      pk->pkey[1] = mpi_copy( skey[1] );
+                      pk->pkey[2] = mpi_copy( skey[2] );
+    sk->skey[0] = skey[0];
+    sk->skey[1] = skey[1];
+    sk->skey[2] = skey[2];
+    sk->skey[3] = skey[3];
+    sk->is_protected = 0;
+    sk->protect.algo = 0;
+
+    sk->csum = checksum_mpi( sk->skey[3] );
+    if( ret_sk ) /* return an unprotected version of the sk */
+       *ret_sk = copy_secret_key( NULL, sk );
+
+    if( dek ) {
+       sk->protect.algo = dek->algo;
+       sk->protect.s2k = *s2k;
+       rc = protect_secret_key( sk, dek );
+       if( rc ) {
+           log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
+           free_public_key(pk);
+           free_secret_key(sk);
+           return rc;
+       }
+    }
+
+    pkt = xmalloc_clear(sizeof *pkt);
+    pkt->pkttype = is_subkey ? PKT_PUBLIC_SUBKEY : PKT_PUBLIC_KEY;
+    pkt->pkt.public_key = pk;
+    add_kbnode(pub_root, new_kbnode( pkt ));
+
+    /* don't know whether it makes sense to have the factors, so for now
+     * we store them in the secret keyring (but they are not secret) */
+    pkt = xmalloc_clear(sizeof *pkt);
+    pkt->pkttype = is_subkey ? PKT_SECRET_SUBKEY : PKT_SECRET_KEY;
+    pkt->pkt.secret_key = sk;
+    add_kbnode(sec_root, new_kbnode( pkt ));
+
+    return 0;
+}
+
+
+/****************
+ * Generate a DSA key
+ */
+static int
+gen_dsa(unsigned int nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
+       STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expireval, int is_subkey)
+{
+    int rc;
+    PACKET *pkt;
+    PKT_secret_key *sk;
+    PKT_public_key *pk;
+    MPI skey[5];
+    MPI *factors;
+    unsigned int qbits;
+
+    if( nbits < 512 || (!opt.flags.dsa2 && nbits > 1024))
+      {
+       nbits = 1024;
+       log_info(_("keysize invalid; using %u bits\n"), nbits );
+      }
+    else if(nbits>3072)
+      {
+       nbits = 3072;
+       log_info(_("keysize invalid; using %u bits\n"), nbits );
+      }
+
+    if(nbits % 64)
+      {
+       nbits = ((nbits + 63) / 64) * 64;
+       log_info(_("keysize rounded up to %u bits\n"), nbits );
+      }
+
+    /*
+      Figure out a q size based on the key size.  FIPS 180-3 says:
+
+      L = 1024, N = 160
+      L = 2048, N = 224
+      L = 2048, N = 256
+      L = 3072, N = 256
+
+      2048/256 is an odd pair since there is also a 2048/224 and
+      3072/256.  Matching sizes is not a very exact science.
+      
+      We'll do 256 qbits for nbits over 2048, 224 for nbits over 1024
+      but less than 2048, and 160 for 1024 (DSA1).
+    */
+
+    if(nbits>2048)
+      qbits=256;
+    else if(nbits>1024)
+      qbits=224;
+    else
+      qbits=160;
+
+    if(qbits!=160)
+      log_info("WARNING: some OpenPGP programs can't"
+              " handle a DSA key with this digest size\n");
+
+    rc = dsa2_generate( PUBKEY_ALGO_DSA, nbits, qbits, skey, &factors );
+    if( rc )
+      {
+       log_error("dsa2_generate failed: %s\n", g10_errstr(rc) );
+       return rc;
+      }
+
+    sk = xmalloc_clear( sizeof *sk );
+    pk = xmalloc_clear( sizeof *pk );
+    sk->timestamp = pk->timestamp = make_timestamp();
+    sk->version = pk->version = 4;
+    if( expireval )
+      sk->expiredate = pk->expiredate = sk->timestamp + expireval;
+
+    sk->pubkey_algo = pk->pubkey_algo = PUBKEY_ALGO_DSA;
+                      pk->pkey[0] = mpi_copy( skey[0] );
+                      pk->pkey[1] = mpi_copy( skey[1] );
+                      pk->pkey[2] = mpi_copy( skey[2] );
+                      pk->pkey[3] = mpi_copy( skey[3] );
+    sk->skey[0] = skey[0];
+    sk->skey[1] = skey[1];
+    sk->skey[2] = skey[2];
+    sk->skey[3] = skey[3];
+    sk->skey[4] = skey[4];
+    sk->is_protected = 0;
+    sk->protect.algo = 0;
+
+    sk->csum = checksum_mpi ( sk->skey[4] );
+    if( ret_sk ) /* return an unprotected version of the sk */
+       *ret_sk = copy_secret_key( NULL, sk );
+
+    if( dek ) {
+       sk->protect.algo = dek->algo;
+       sk->protect.s2k = *s2k;
+       rc = protect_secret_key( sk, dek );
+       if( rc ) {
+           log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
+           free_public_key(pk);
+           free_secret_key(sk);
+           return rc;
+       }
+    }
+
+    pkt = xmalloc_clear(sizeof *pkt);
+    pkt->pkttype = is_subkey ? PKT_PUBLIC_SUBKEY : PKT_PUBLIC_KEY;
+    pkt->pkt.public_key = pk;
+    add_kbnode(pub_root, new_kbnode( pkt ));
+
+    /* don't know whether it makes sense to have the factors, so for now
+     * we store them in the secret keyring (but they are not secret)
+     * p = 2 * q * f1 * f2 * ... * fn
+     * We store only f1 to f_n-1;  fn can be calculated because p and q
+     * are known.
+     */
+    pkt = xmalloc_clear(sizeof *pkt);
+    pkt->pkttype = is_subkey ? PKT_SECRET_SUBKEY : PKT_SECRET_KEY;
+    pkt->pkt.secret_key = sk;
+    add_kbnode(sec_root, new_kbnode( pkt ));
+
+    return 0;
+}
+
+
+/* 
+ * Generate an RSA key.
+ */
+static int
+gen_rsa(int algo, unsigned nbits, KBNODE pub_root, KBNODE sec_root, DEK *dek,
+       STRING2KEY *s2k, PKT_secret_key **ret_sk, u32 expireval, int is_subkey)
+{
+    int rc;
+    PACKET *pkt;
+    PKT_secret_key *sk;
+    PKT_public_key *pk;
+    MPI skey[6];
+    MPI *factors;
+
+    assert( is_RSA(algo) );
+
+    if( nbits < 1024 ) {
+       nbits = 1024;
+       log_info(_("keysize invalid; using %u bits\n"), nbits );
+    }
+
+    if( (nbits % 32) ) {
+       nbits = ((nbits + 31) / 32) * 32;
+       log_info(_("keysize rounded up to %u bits\n"), nbits );
+    }
+
+    rc = pubkey_generate( algo, nbits, skey, &factors );
+    if( rc ) {
+       log_error("pubkey_generate failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+
+    sk = xmalloc_clear( sizeof *sk );
+    pk = xmalloc_clear( sizeof *pk );
+    sk->timestamp = pk->timestamp = make_timestamp();
+    sk->version = pk->version = 4;
+    if( expireval ) {
+       sk->expiredate = pk->expiredate = sk->timestamp + expireval;
+    }
+    sk->pubkey_algo = pk->pubkey_algo = algo;
+                      pk->pkey[0] = mpi_copy( skey[0] );
+                      pk->pkey[1] = mpi_copy( skey[1] );
+    sk->skey[0] = skey[0];
+    sk->skey[1] = skey[1];
+    sk->skey[2] = skey[2];
+    sk->skey[3] = skey[3];
+    sk->skey[4] = skey[4];
+    sk->skey[5] = skey[5];
+    sk->is_protected = 0;
+    sk->protect.algo = 0;
+
+    sk->csum  = checksum_mpi (sk->skey[2] );
+    sk->csum += checksum_mpi (sk->skey[3] );
+    sk->csum += checksum_mpi (sk->skey[4] );
+    sk->csum += checksum_mpi (sk->skey[5] );
+    if( ret_sk ) /* return an unprotected version of the sk */
+       *ret_sk = copy_secret_key( NULL, sk );
+
+    if( dek ) {
+       sk->protect.algo = dek->algo;
+       sk->protect.s2k = *s2k;
+       rc = protect_secret_key( sk, dek );
+       if( rc ) {
+           log_error("protect_secret_key failed: %s\n", g10_errstr(rc) );
+           free_public_key(pk);
+           free_secret_key(sk);
+           return rc;
+       }
+    }
+
+    pkt = xmalloc_clear(sizeof *pkt);
+    pkt->pkttype = is_subkey ? PKT_PUBLIC_SUBKEY : PKT_PUBLIC_KEY;
+    pkt->pkt.public_key = pk;
+    add_kbnode(pub_root, new_kbnode( pkt ));
+
+    pkt = xmalloc_clear(sizeof *pkt);
+    pkt->pkttype = is_subkey ? PKT_SECRET_SUBKEY : PKT_SECRET_KEY;
+    pkt->pkt.secret_key = sk;
+    add_kbnode(sec_root, new_kbnode( pkt ));
+
+    return 0;
+}
+
+
+/****************
+ * check valid days:
+ * return 0 on error or the multiplier
+ */
+static int
+check_valid_days( const char *s )
+{
+    if( !digitp(s) )
+       return 0;
+    for( s++; *s; s++)
+       if( !digitp(s) )
+           break;
+    if( !*s )
+       return 1;
+    if( s[1] )
+       return 0; /* e.g. "2323wc" */
+    if( *s == 'd' || *s == 'D' )
+       return 1;
+    if( *s == 'w' || *s == 'W' )
+       return 7;
+    if( *s == 'm' || *s == 'M' )
+       return 30;
+    if( *s == 'y' || *s == 'Y' )
+       return 365;
+    return 0;
+}
+
+
+static void
+print_key_flags(int flags)
+{
+  if(flags&PUBKEY_USAGE_SIG)
+    tty_printf("%s ",_("Sign"));
+
+  if(flags&PUBKEY_USAGE_CERT)
+    tty_printf("%s ",_("Certify"));
+
+  if(flags&PUBKEY_USAGE_ENC)
+    tty_printf("%s ",_("Encrypt"));
+
+  if(flags&PUBKEY_USAGE_AUTH)
+    tty_printf("%s ",_("Authenticate"));
+}
+
+
+/* Returns the key flags */
+static unsigned int
+ask_key_flags(int algo,int subkey)
+{
+  const char *togglers=_("SsEeAaQq");
+  char *answer=NULL;
+  unsigned int current=0;
+  unsigned int possible=openpgp_pk_algo_usage(algo);
+
+  if(strlen(togglers)!=8)
+    BUG();
+
+  /* Only primary keys may certify. */
+  if(subkey)
+    possible&=~PUBKEY_USAGE_CERT;
+
+  /* Preload the current set with the possible set, minus
+     authentication, since nobody really uses auth yet. */
+  current=possible&~PUBKEY_USAGE_AUTH;
+
+  for(;;)
+    {
+      tty_printf("\n");
+      tty_printf(_("Possible actions for a %s key: "),
+                pubkey_algo_to_string(algo));
+      print_key_flags(possible);
+      tty_printf("\n");
+      tty_printf(_("Current allowed actions: "));
+      print_key_flags(current);
+      tty_printf("\n\n");
+
+      if(possible&PUBKEY_USAGE_SIG)
+       tty_printf(_("   (%c) Toggle the sign capability\n"),
+                  togglers[0]);
+      if(possible&PUBKEY_USAGE_ENC)
+       tty_printf(_("   (%c) Toggle the encrypt capability\n"),
+                  togglers[2]);
+      if(possible&PUBKEY_USAGE_AUTH)
+       tty_printf(_("   (%c) Toggle the authenticate capability\n"),
+                  togglers[4]);
+
+      tty_printf(_("   (%c) Finished\n"),togglers[6]);
+      tty_printf("\n");
+
+      xfree(answer);
+      answer = cpr_get("keygen.flags",_("Your selection? "));
+      cpr_kill_prompt();
+
+      if(strlen(answer)>1)
+       tty_printf(_("Invalid selection.\n"));
+      else if(*answer=='\0' || *answer==togglers[6] || *answer==togglers[7])
+       break;
+      else if((*answer==togglers[0] || *answer==togglers[1])
+             && possible&PUBKEY_USAGE_SIG)
+       {
+         if(current&PUBKEY_USAGE_SIG)
+           current&=~PUBKEY_USAGE_SIG;
+         else
+           current|=PUBKEY_USAGE_SIG;
+       }
+      else if((*answer==togglers[2] || *answer==togglers[3])
+             && possible&PUBKEY_USAGE_ENC)
+       {
+         if(current&PUBKEY_USAGE_ENC)
+           current&=~PUBKEY_USAGE_ENC;
+         else
+           current|=PUBKEY_USAGE_ENC;
+       }
+      else if((*answer==togglers[4] || *answer==togglers[5])
+             && possible&PUBKEY_USAGE_AUTH)
+       {
+         if(current&PUBKEY_USAGE_AUTH)
+           current&=~PUBKEY_USAGE_AUTH;
+         else
+           current|=PUBKEY_USAGE_AUTH;
+       }
+      else
+       tty_printf(_("Invalid selection.\n"));
+    }
+
+  xfree(answer);
+
+  return current;
+}
+
+
+/****************
+ * Returns: 0 to create both a DSA and a Elgamal key.
+ *          and only if key flags are to be written the desired usage.
+ */
+static int
+ask_algo (int addmode, unsigned int *r_usage)
+{
+    char *answer;
+    int algo;
+
+    *r_usage = 0;
+    tty_printf(_("Please select what kind of key you want:\n"));
+    if( !addmode )
+       tty_printf(_("   (%d) DSA and Elgamal (default)\n"), 1 );
+    tty_printf(    _("   (%d) DSA (sign only)\n"), 2 );
+    if (opt.expert)
+      tty_printf(  _("   (%d) DSA (set your own capabilities)\n"), 3 );
+    if( addmode )
+       tty_printf(_("   (%d) Elgamal (encrypt only)\n"), 4 );
+    tty_printf(    _("   (%d) RSA (sign only)\n"), 5 );
+    if (addmode)
+        tty_printf(_("   (%d) RSA (encrypt only)\n"), 6 );
+    if (opt.expert)
+      tty_printf(  _("   (%d) RSA (set your own capabilities)\n"), 7 );
+
+    for(;;) {
+       answer = cpr_get("keygen.algo",_("Your selection? "));
+       cpr_kill_prompt();
+       algo = *answer? atoi(answer): 1;
+       xfree(answer);
+       if( algo == 1 && !addmode ) {
+           algo = 0;   /* create both keys */
+           break;
+       }
+       else if( algo == 7 && opt.expert ) {
+           algo = PUBKEY_ALGO_RSA;
+           *r_usage=ask_key_flags(algo,addmode);
+           break;
+       }
+       else if( algo == 6 && addmode ) {
+           algo = PUBKEY_ALGO_RSA;
+            *r_usage = PUBKEY_USAGE_ENC;
+           break;
+       }
+       else if( algo == 5 ) {
+           algo = PUBKEY_ALGO_RSA;
+            *r_usage = PUBKEY_USAGE_SIG;
+           break;
+       }
+       else if( algo == 4 && addmode ) {
+           algo = PUBKEY_ALGO_ELGAMAL_E;
+            *r_usage = PUBKEY_USAGE_ENC;
+           break;
+       }
+       else if( algo == 3 && opt.expert ) {
+           algo = PUBKEY_ALGO_DSA;
+           *r_usage=ask_key_flags(algo,addmode);
+           break;
+       }
+       else if( algo == 2 ) {
+           algo = PUBKEY_ALGO_DSA;
+            *r_usage = PUBKEY_USAGE_SIG;
+           break;
+       }
+       else
+           tty_printf(_("Invalid selection.\n"));
+    }
+
+    return algo;
+}
+
+
+static unsigned
+ask_keysize( int algo )
+{
+  unsigned nbits,min,def=2048,max=4096;
+
+  if(opt.expert)
+    min=512;
+  else
+    min=1024;
+
+  switch(algo)
+    {
+    case PUBKEY_ALGO_DSA:
+      if(opt.flags.dsa2)
+       {
+         def=1024;
+         max=3072;
+       }
+      else
+       {
+         tty_printf(_("DSA keypair will have %u bits.\n"),1024);
+         return 1024;
+       }
+      break;
+
+    case PUBKEY_ALGO_RSA:
+      min=1024;
+      break;
+    }
+
+  tty_printf(_("%s keys may be between %u and %u bits long.\n"),
+            pubkey_algo_to_string(algo),min,max);
+
+  for(;;)
+    {
+      char *prompt,*answer;
+
+#define PROMPTSTRING _("What keysize do you want? (%u) ")
+
+      prompt=xmalloc(strlen(PROMPTSTRING)+20);
+      sprintf(prompt,PROMPTSTRING,def);
+
+#undef PROMPTSTRING
+
+      answer = cpr_get("keygen.size",prompt);
+      cpr_kill_prompt();
+      nbits = *answer? atoi(answer): def;
+      xfree(prompt);
+      xfree(answer);
+      
+      if(nbits<min || nbits>max)
+       tty_printf(_("%s keysizes must be in the range %u-%u\n"),
+                  pubkey_algo_to_string(algo),min,max);
+      else
+       break;
+    }
+
+  tty_printf(_("Requested keysize is %u bits\n"), nbits );
+
+  if( algo == PUBKEY_ALGO_DSA && (nbits % 64) )
+    {
+      nbits = ((nbits + 63) / 64) * 64;
+      tty_printf(_("rounded up to %u bits\n"), nbits );
+    }
+  else if( (nbits % 32) )
+    {
+      nbits = ((nbits + 31) / 32) * 32;
+      tty_printf(_("rounded up to %u bits\n"), nbits );
+    }
+
+  return nbits;
+}
+
+
+/****************
+ * Parse an expire string and return its value in seconds.
+ * Returns (u32)-1 on error.
+ * This isn't perfect since scan_isodatestr returns unix time, and
+ * OpenPGP actually allows a 32-bit time *plus* a 32-bit offset.
+ * Because of this, we only permit setting expirations up to 2106, but
+ * OpenPGP could theoretically allow up to 2242.  I think we'll all
+ * just cope for the next few years until we get a 64-bit time_t or
+ * similar.
+ */
+u32
+parse_expire_string( const char *string )
+{
+    int mult;
+    u32 seconds,abs_date=0,curtime = make_timestamp();
+
+    if( !*string )
+      seconds = 0;
+    else if ( !strncmp (string, "seconds=", 8) )
+      seconds = atoi (string+8);
+    else if( (abs_date = scan_isodatestr(string)) && abs_date > curtime )
+      seconds = abs_date - curtime;
+    else if( (mult=check_valid_days(string)) )
+      seconds = atoi(string) * 86400L * mult;
+    else
+      seconds=(u32)-1;
+
+    return seconds;
+}
+
+/* object == 0 for a key, and 1 for a sig */
+u32
+ask_expire_interval(int object,const char *def_expire)
+{
+    u32 interval;
+    char *answer;
+
+    switch(object)
+      {
+      case 0:
+       if(def_expire)
+         BUG();
+       tty_printf(_("Please specify how long the key should be valid.\n"
+                    "         0 = key does not expire\n"
+                    "      <n>  = key expires in n days\n"
+                    "      <n>w = key expires in n weeks\n"
+                    "      <n>m = key expires in n months\n"
+                    "      <n>y = key expires in n years\n"));
+       break;
+
+      case 1:
+       if(!def_expire)
+         BUG();
+       tty_printf(_("Please specify how long the signature should be valid.\n"
+                    "         0 = signature does not expire\n"
+                    "      <n>  = signature expires in n days\n"
+                    "      <n>w = signature expires in n weeks\n"
+                    "      <n>m = signature expires in n months\n"
+                    "      <n>y = signature expires in n years\n"));
+       break;
+
+      default:
+       BUG();
+      }
+
+    /* Note: The elgamal subkey for DSA has no expiration date because
+     * it must be signed with the DSA key and this one has the expiration
+     * date */
+
+    answer = NULL;
+    for(;;)
+      {
+       u32 curtime=make_timestamp();
+
+       xfree(answer);
+       if(object==0)
+         answer = cpr_get("keygen.valid",_("Key is valid for? (0) "));
+       else
+         {
+           char *prompt;
+
+#define PROMPTSTRING _("Signature is valid for? (%s) ")
+           /* This will actually end up larger than necessary because
+              of the 2 bytes for '%s' */
+           prompt=xmalloc(strlen(PROMPTSTRING)+strlen(def_expire)+1);
+           sprintf(prompt,PROMPTSTRING,def_expire);
+#undef PROMPTSTRING
+
+           answer = cpr_get("siggen.valid",prompt);
+           xfree(prompt);
+
+           if(*answer=='\0')
+             answer=xstrdup(def_expire);
+         }
+       cpr_kill_prompt();
+       trim_spaces(answer);
+       interval = parse_expire_string( answer );
+       if( interval == (u32)-1 )
+         {
+           tty_printf(_("invalid value\n"));
+           continue;
+         }
+
+       if( !interval )
+         {
+            tty_printf((object==0)
+                       ? _("Key does not expire at all\n")
+                       : _("Signature does not expire at all\n"));
+         }
+       else
+         {
+           tty_printf(object==0
+                      ? _("Key expires at %s\n")
+                      : _("Signature expires at %s\n"),
+                      asctimestamp((ulong)(curtime + interval) ) );
+           /* FIXME: This check yields warning on alhas: Write a
+              configure check and to this check here only for 32 bit
+              machines */
+           if( (time_t)((ulong)(curtime+interval)) < 0 )
+             tty_printf(_("Your system can't display dates beyond 2038.\n"
+                          "However, it will be correctly handled up to 2106.\n"));
+         }
+
+       if( cpr_enabled() || cpr_get_answer_is_yes("keygen.valid.okay",
+                                                  _("Is this correct? (y/N) ")) )
+         break;
+      }
+
+    xfree(answer);
+    return interval;
+}
+
+u32
+ask_expiredate()
+{
+    u32 x = ask_expire_interval(0,NULL);
+    return x? make_timestamp() + x : 0;
+}
+
+
+static char *
+ask_user_id( int mode )
+{
+    char *answer;
+    char *aname, *acomment, *amail, *uid;
+
+    if( !mode )
+       tty_printf( _("\n"
+"You need a user ID to identify your key; "
+                                        "the software constructs the user ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n\n") );
+    uid = aname = acomment = amail = NULL;
+    for(;;) {
+       char *p;
+       int fail=0;
+
+       if( !aname ) {
+           for(;;) {
+               xfree(aname);
+               aname = cpr_get("keygen.name",_("Real name: "));
+               trim_spaces(aname);
+               cpr_kill_prompt();
+
+               if( opt.allow_freeform_uid )
+                   break;
+
+               if( strpbrk( aname, "<>" ) )
+                   tty_printf(_("Invalid character in name\n"));
+               else if( digitp(aname) )
+                   tty_printf(_("Name may not start with a digit\n"));
+               else if( strlen(aname) < 5 )
+                   tty_printf(_("Name must be at least 5 characters long\n"));
+               else
+                   break;
+           }
+       }
+       if( !amail ) {
+           for(;;) {
+               xfree(amail);
+               amail = cpr_get("keygen.email",_("Email address: "));
+               trim_spaces(amail);
+               cpr_kill_prompt();
+               if( !*amail || opt.allow_freeform_uid )
+                   break;   /* no email address is okay */
+               else if ( !is_valid_mailbox (amail) )
+                    tty_printf(_("Not a valid email address\n"));
+               else
+                   break;
+           }
+       }
+       if( !acomment ) {
+           for(;;) {
+               xfree(acomment);
+               acomment = cpr_get("keygen.comment",_("Comment: "));
+               trim_spaces(acomment);
+               cpr_kill_prompt();
+               if( !*acomment )
+                   break;   /* no comment is okay */
+               else if( strpbrk( acomment, "()" ) )
+                   tty_printf(_("Invalid character in comment\n"));
+               else
+                   break;
+           }
+       }
+
+
+       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),">");
+
+       /* append a warning if we do not have dev/random
+        * or it is switched into  quick testmode */
+       if( quick_random_gen(-1) )
+           strcpy(p, " (INSECURE!)" );
+
+       /* print a note in case that UTF8 mapping has to be done */
+       for(p=uid; *p; p++ ) {
+           if( *p & 0x80 ) {
+               tty_printf(_("You are using the `%s' character set.\n"),
+                          get_native_charset() );
+               break;
+           }
+       }
+
+       tty_printf(_("You selected this USER-ID:\n    \"%s\"\n\n"), uid);
+       /* fixme: add a warning if this user-id already exists */
+       if( !*amail && !opt.allow_freeform_uid
+           && (strchr( aname, '@' ) || strchr( acomment, '@'))) {
+           fail = 1;
+           tty_printf(_("Please don't put the email address "
+                         "into the real name or the comment\n") );
+       }
+
+       for(;;) {
+            /* TRANSLATORS: These are the allowed answers in
+               lower and uppercase.  Below you will find the matching
+               string which should be translated accordingly and the
+               letter changed to match the one in the answer string.
+               
+                 n = Change name
+                 c = Change comment
+                 e = Change email
+                 o = Okay (ready, continue)
+                 q = Quit
+             */
+           const char *ansstr = _("NnCcEeOoQq");
+
+           if( strlen(ansstr) != 10 )
+               BUG();
+           if( cpr_enabled() ) {
+               answer = xstrdup(ansstr+6);
+               answer[1] = 0;
+           }
+           else {
+               answer = cpr_get("keygen.userid.cmd", fail?
+                 _("Change (N)ame, (C)omment, (E)mail or (Q)uit? ") :
+                 _("Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "));
+               cpr_kill_prompt();
+           }
+           if( strlen(answer) > 1 )
+               ;
+           else if( *answer == ansstr[0] || *answer == ansstr[1] ) {
+               xfree(aname); aname = NULL;
+               break;
+           }
+           else if( *answer == ansstr[2] || *answer == ansstr[3] ) {
+               xfree(acomment); acomment = NULL;
+               break;
+           }
+           else if( *answer == ansstr[4] || *answer == ansstr[5] ) {
+               xfree(amail); amail = NULL;
+               break;
+           }
+           else if( *answer == ansstr[6] || *answer == ansstr[7] ) {
+               if( fail ) {
+                   tty_printf(_("Please correct the error first\n"));
+               }
+               else {
+                   xfree(aname); aname = NULL;
+                   xfree(acomment); acomment = NULL;
+                   xfree(amail); amail = NULL;
+                   break;
+               }
+           }
+           else if( *answer == ansstr[8] || *answer == ansstr[9] ) {
+               xfree(aname); aname = NULL;
+               xfree(acomment); acomment = NULL;
+               xfree(amail); amail = NULL;
+               xfree(uid); uid = NULL;
+               break;
+           }
+           xfree(answer);
+       }
+       xfree(answer);
+       if( !amail && !acomment && !amail )
+           break;
+       xfree(uid); uid = NULL;
+    }
+    if( uid ) {
+       char *p = native_to_utf8( uid );
+       xfree( uid );
+       uid = p;
+    }
+    return uid;
+}
+
+
+/* FIXME: We need a way to cancel this prompt. */
+static DEK *
+do_ask_passphrase( STRING2KEY **ret_s2k )
+{
+    DEK *dek = NULL;
+    STRING2KEY *s2k;
+    const char *errtext = NULL;
+
+    tty_printf(_("You need a Passphrase to protect your secret key.\n\n") );
+
+    s2k = xmalloc_secure( sizeof *s2k );
+    for(;;) {
+       s2k->mode = opt.s2k_mode;
+       s2k->hash_algo = S2K_DIGEST_ALGO;
+       dek = passphrase_to_dek( NULL, 0, opt.s2k_cipher_algo, s2k,2,
+                                 errtext, NULL);
+       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;
+}
+
+
+static int
+do_create( int algo, unsigned int nbits, KBNODE pub_root, KBNODE sec_root,
+          DEK *dek, STRING2KEY *s2k, PKT_secret_key **sk, u32 expiredate,
+          int is_subkey )
+{
+  int rc=0;
+
+  if( !opt.batch )
+    tty_printf(_(
+"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"
+"generator a better chance to gain enough entropy.\n") );
+
+  if( algo == PUBKEY_ALGO_ELGAMAL_E )
+    rc = gen_elg(algo, nbits, pub_root, sec_root, dek, s2k, sk, expiredate,
+                is_subkey);
+  else if( algo == PUBKEY_ALGO_DSA )
+    rc = gen_dsa(nbits, pub_root, sec_root, dek, s2k, sk, expiredate,
+                is_subkey);
+  else if( algo == PUBKEY_ALGO_RSA )
+    rc = gen_rsa(algo, nbits, pub_root, sec_root, dek, s2k, sk, expiredate,
+                is_subkey);
+  else
+    BUG();
+
+  return rc;
+}
+
+
+/****************
+ * Generate a new user id packet, or return NULL if canceled
+ */
+PKT_user_id *
+generate_user_id()
+{
+    PKT_user_id *uid;
+    char *p;
+    size_t n;
+
+    p = ask_user_id( 1 );
+    if( !p )
+       return NULL;
+    n = strlen(p);
+    uid = xmalloc_clear( sizeof *uid + n - 1 );
+    uid->len = n;
+    strcpy(uid->name, p);
+    uid->ref = 1;
+    return uid;
+}
+
+
+static void
+release_parameter_list( struct para_data_s *r )
+{
+    struct para_data_s *r2;
+
+    for( ; r ; r = r2 ) {
+       r2 = r->next;
+       if( r->key == pPASSPHRASE_DEK )
+           xfree( r->u.dek );
+       else if( r->key == pPASSPHRASE_S2K )
+           xfree( r->u.s2k );
+
+       xfree(r);
+    }
+}
+
+static struct para_data_s *
+get_parameter( struct para_data_s *para, enum para_name key )
+{
+    struct para_data_s *r;
+
+    for( r = para; r && r->key != key; r = r->next )
+       ;
+    return r;
+}
+
+static const char *
+get_parameter_value( struct para_data_s *para, enum para_name key )
+{
+    struct para_data_s *r = get_parameter( para, key );
+    return (r && *r->u.value)? r->u.value : NULL;
+}
+
+static int
+get_parameter_algo( struct para_data_s *para, enum para_name key )
+{
+    int i;
+    struct para_data_s *r = get_parameter( para, key );
+    if( !r )
+       return -1;
+    if( digitp( r->u.value ) )
+       i = atoi( r->u.value );
+    else
+        i = string_to_pubkey_algo( r->u.value );
+    if (i == PUBKEY_ALGO_RSA_E || i == PUBKEY_ALGO_RSA_S)
+      i = 0; /* we don't want to allow generation of these algorithms */
+    return i;
+}
+
+/* 
+ * parse the usage parameter and set the keyflags.  Return true on error.
+ */
+static int
+parse_parameter_usage (const char *fname,
+                       struct para_data_s *para, enum para_name key)
+{
+    struct para_data_s *r = get_parameter( para, key );
+    char *p, *pn;
+    unsigned int use;
+
+    if( !r )
+       return 0; /* none (this is an optional parameter)*/
+    
+    use = 0;
+    pn = r->u.value;
+    while ( (p = strsep (&pn, " \t,")) ) {
+        if ( !*p)
+            ;
+        else if ( !ascii_strcasecmp (p, "sign") )
+            use |= PUBKEY_USAGE_SIG;
+        else if ( !ascii_strcasecmp (p, "encrypt") )
+            use |= PUBKEY_USAGE_ENC;
+        else if ( !ascii_strcasecmp (p, "auth") )
+            use |= PUBKEY_USAGE_AUTH;
+        else {
+            log_error("%s:%d: invalid usage list\n", fname, r->lnr );
+            return -1; /* error */
+        }
+    }
+    r->u.usage = use;
+    return 1;
+}
+
+static int
+parse_revocation_key (const char *fname,
+                     struct para_data_s *para, enum para_name key)
+{
+  struct para_data_s *r = get_parameter( para, key );
+  struct revocation_key revkey;
+  char *pn;
+  int i;
+
+  if( !r )
+    return 0; /* none (this is an optional parameter) */
+
+  pn = r->u.value;
+
+  revkey.class=0x80;
+  revkey.algid=atoi(pn);
+  if(!revkey.algid)
+    goto fail;
+
+  /* Skip to the fpr */
+  while(*pn && *pn!=':')
+    pn++;
+
+  if(*pn!=':')
+    goto fail;
+
+  pn++;
+
+  for(i=0;i<MAX_FINGERPRINT_LEN && *pn;i++,pn+=2)
+    {
+      int c=hextobyte(pn);
+      if(c==-1)
+       goto fail;
+
+      revkey.fpr[i]=c;
+    }
+
+  /* skip to the tag */
+  while(*pn && *pn!='s' && *pn!='S')
+    pn++;
+
+  if(ascii_strcasecmp(pn,"sensitive")==0)
+    revkey.class|=0x40;
+
+  memcpy(&r->u.revkey,&revkey,sizeof(struct revocation_key));
+
+  return 0;
+
+  fail:
+  log_error("%s:%d: invalid revocation key\n", fname, r->lnr );
+  return -1; /* error */
+}
+
+
+static u32
+get_parameter_u32( struct para_data_s *para, enum para_name key )
+{
+    struct para_data_s *r = get_parameter( para, key );
+
+    if( !r )
+       return 0;
+    if( r->key == pKEYEXPIRE || r->key == pSUBKEYEXPIRE )
+       return r->u.expire;
+    if( r->key == pKEYUSAGE || r->key == pSUBKEYUSAGE )
+       return r->u.usage;
+
+    return (unsigned int)strtoul( r->u.value, NULL, 10 );
+}
+
+static unsigned int
+get_parameter_uint( struct para_data_s *para, enum para_name key )
+{
+    return get_parameter_u32( para, key );
+}
+
+static DEK *
+get_parameter_dek( struct para_data_s *para, enum para_name key )
+{
+    struct para_data_s *r = get_parameter( para, key );
+    return r? r->u.dek : NULL;
+}
+
+static STRING2KEY *
+get_parameter_s2k( struct para_data_s *para, enum para_name key )
+{
+    struct para_data_s *r = get_parameter( para, key );
+    return r? r->u.s2k : NULL;
+}
+
+static struct revocation_key *
+get_parameter_revkey( struct para_data_s *para, enum para_name key )
+{
+    struct para_data_s *r = get_parameter( para, key );
+    return r? &r->u.revkey : NULL;
+}
+
+static int
+proc_parameter_file( struct para_data_s *para, const char *fname,
+                     struct output_control_s *outctrl, int card )
+{
+  struct para_data_s *r;
+  const char *s1, *s2, *s3;
+  size_t n;
+  char *p;
+  int have_user_id=0,err,algo;
+
+  /* Check that we have all required parameters. */
+  r = get_parameter( para, pKEYTYPE );
+  if(r)
+    {
+      algo=get_parameter_algo(para,pKEYTYPE);
+      if(check_pubkey_algo2(algo,PUBKEY_USAGE_SIG))
+       {
+         log_error("%s:%d: invalid algorithm\n", fname, r->lnr );
+         return -1;
+       }
+    }
+  else
+    {
+      log_error("%s: no Key-Type specified\n",fname);
+      return -1;
+    }
+
+  err=parse_parameter_usage (fname, para, pKEYUSAGE);
+  if(err==0)
+    {
+      /* Default to algo capabilities if key-usage is not provided */
+      r=xmalloc_clear(sizeof(*r));
+      r->key=pKEYUSAGE;
+      r->u.usage=openpgp_pk_algo_usage(algo);
+      r->next=para;
+      para=r;
+    }
+  else if(err==-1)
+    return -1;
+
+  r = get_parameter( para, pSUBKEYTYPE );
+  if(r)
+    {
+      algo=get_parameter_algo( para, pSUBKEYTYPE);
+      if(check_pubkey_algo(algo))
+       {
+         log_error("%s:%d: invalid algorithm\n", fname, r->lnr );
+         return -1;
+       }
+
+      err=parse_parameter_usage (fname, para, pSUBKEYUSAGE);
+      if(err==0)
+       {
+         /* Default to algo capabilities if subkey-usage is not
+            provided */
+         r=xmalloc_clear(sizeof(*r));
+         r->key=pSUBKEYUSAGE;
+         r->u.usage=openpgp_pk_algo_usage(algo);
+         r->next=para;
+         para=r;
+       }
+      else if(err==-1)
+       return -1;
+    }
+
+  if( get_parameter_value( para, pUSERID ) )
+    have_user_id=1;
+  else
+    {
+      /* create the formatted user ID */
+      s1 = get_parameter_value( para, pNAMEREAL );
+      s2 = get_parameter_value( para, pNAMECOMMENT );
+      s3 = get_parameter_value( para, pNAMEEMAIL );
+      if( s1 || s2 || s3 )
+       {
+         n = (s1?strlen(s1):0) + (s2?strlen(s2):0) + (s3?strlen(s3):0);
+         r = xmalloc_clear( sizeof *r + n + 20 );
+         r->key = pUSERID;
+         p = r->u.value;
+         if( s1 )
+           p = stpcpy(p, s1 );
+         if( s2 )
+           p = stpcpy(stpcpy(stpcpy(p," ("), s2 ),")");
+         if( s3 )
+           p = stpcpy(stpcpy(stpcpy(p," <"), s3 ),">");
+         r->next = para;
+         para = r;
+         have_user_id=1;
+       }
+    }
+
+  if(!have_user_id)
+    {
+      log_error("%s: no User-ID specified\n",fname);
+      return -1;
+    }
+
+  /* Set preferences, if any. */
+  keygen_set_std_prefs(get_parameter_value( para, pPREFERENCES ), 0);
+
+  /* Set keyserver, if any. */
+  s1=get_parameter_value( para, pKEYSERVER );
+  if(s1)
+    {
+      struct keyserver_spec *spec;
+
+      spec=parse_keyserver_uri(s1,1,NULL,0);
+      if(spec)
+       {
+         free_keyserver_spec(spec);
+         opt.def_keyserver_url=s1;
+       }
+      else
+       {
+         log_error("%s:%d: invalid keyserver url\n", fname, r->lnr );
+         return -1;
+       }
+    }
+
+  /* Set revoker, if any. */
+  if (parse_revocation_key (fname, para, pREVOKER))
+    return -1;
+
+  /* make DEK and S2K from the Passphrase */
+  r = get_parameter( para, pPASSPHRASE );
+  if( r && *r->u.value ) {
+    /* we have a plain text passphrase - create a DEK from it.
+     * It is a little bit ridiculous to keep it ih secure memory
+     * but becuase we do this alwasy, why not here */
+    STRING2KEY *s2k;
+    DEK *dek;
+
+    s2k = xmalloc_secure( sizeof *s2k );
+    s2k->mode = opt.s2k_mode;
+    s2k->hash_algo = S2K_DIGEST_ALGO;
+    set_next_passphrase( r->u.value );
+    dek = passphrase_to_dek( NULL, 0, opt.s2k_cipher_algo, s2k, 2,
+                            NULL, NULL);
+    set_next_passphrase( NULL );
+    assert( dek );
+    memset( r->u.value, 0, strlen(r->u.value) );
+
+    r = xmalloc_clear( sizeof *r );
+    r->key = pPASSPHRASE_S2K;
+    r->u.s2k = s2k;
+    r->next = para;
+    para = r;
+    r = xmalloc_clear( sizeof *r );
+    r->key = pPASSPHRASE_DEK;
+    r->u.dek = dek;
+    r->next = para;
+    para = r;
+  }
+
+  /* make KEYEXPIRE from Expire-Date */
+  r = get_parameter( para, pEXPIREDATE );
+  if( r && *r->u.value )
+    {
+      u32 seconds;
+
+      seconds = parse_expire_string( r->u.value );
+      if( seconds == (u32)-1 )
+       {
+         log_error("%s:%d: invalid expire date\n", fname, r->lnr );
+         return -1;
+       }
+      r->u.expire = seconds;
+      r->key = pKEYEXPIRE;  /* change hat entry */
+      /* also set it for the subkey */
+      r = xmalloc_clear( sizeof *r + 20 );
+      r->key = pSUBKEYEXPIRE;
+      r->u.expire = seconds;
+      r->next = para;
+      para = r;
+    }
+
+  if( !!outctrl->pub.newfname ^ !!outctrl->sec.newfname ) {
+    log_error("%s:%d: only one ring name is set\n", fname, outctrl->lnr );
+    return -1;
+  }
+
+  do_generate_keypair( para, outctrl, card );
+  return 0;
+}
+
+
+/****************
+ * Kludge to allow non interactive key generation controlled
+ * by a parameter file.
+ * Note, that string parameters are expected to be in UTF-8
+ */
+static void
+read_parameter_file( const char *fname )
+{
+    static struct { const char *name;
+                   enum para_name key;
+    } keywords[] = {
+       { "Key-Type",       pKEYTYPE},
+       { "Key-Length",     pKEYLENGTH },
+       { "Key-Usage",      pKEYUSAGE },
+       { "Subkey-Type",    pSUBKEYTYPE },
+       { "Subkey-Length",  pSUBKEYLENGTH },
+       { "Subkey-Usage",   pSUBKEYUSAGE },
+       { "Name-Real",      pNAMEREAL },
+       { "Name-Email",     pNAMEEMAIL },
+       { "Name-Comment",   pNAMECOMMENT },
+       { "Expire-Date",    pEXPIREDATE },
+       { "Passphrase",     pPASSPHRASE },
+       { "Preferences",    pPREFERENCES },
+       { "Revoker",        pREVOKER },
+        { "Handle",         pHANDLE },
+       { "Keyserver",      pKEYSERVER },
+       { NULL, 0 }
+    };
+    IOBUF fp;
+    byte *line;
+    unsigned int maxlen, nline;
+    char *p;
+    int lnr;
+    const char *err = NULL;
+    struct para_data_s *para, *r;
+    int i;
+    struct output_control_s outctrl;
+
+    memset( &outctrl, 0, sizeof( outctrl ) );
+
+    if( !fname || !*fname)
+      fname = "-";
+
+    fp = iobuf_open (fname);
+    if (fp && is_secured_file (iobuf_get_fd (fp)))
+      {
+        iobuf_close (fp);
+        fp = NULL;
+        errno = EPERM;
+      }
+    if (!fp) {
+      log_error (_("can't open `%s': %s\n"), fname, strerror(errno) );
+      return;
+    }
+    iobuf_ioctl (fp, 3, 1, NULL); /* No file caching. */
+
+    lnr = 0;
+    err = NULL;
+    para = NULL;
+    maxlen = 1024;
+    line = NULL;
+    while ( iobuf_read_line (fp, &line, &nline, &maxlen) ) {
+       char *keyword, *value;
+
+       lnr++;
+       if( !maxlen ) {
+           err = "line too long";
+           break;
+       }
+       for( p = line; isspace(*(byte*)p); p++ )
+           ;
+       if( !*p || *p == '#' )
+           continue;
+       keyword = p;
+       if( *keyword == '%' ) {
+           for( ; !isspace(*(byte*)p); p++ )
+               ;
+           if( *p )
+               *p++ = 0;
+           for( ; isspace(*(byte*)p); p++ )
+               ;
+           value = p;
+           trim_trailing_ws( value, strlen(value) );
+           if( !ascii_strcasecmp( keyword, "%echo" ) )
+               log_info("%s\n", value );
+           else if( !ascii_strcasecmp( keyword, "%dry-run" ) )
+               outctrl.dryrun = 1;
+           else if( !ascii_strcasecmp( keyword, "%commit" ) ) {
+               outctrl.lnr = lnr;
+               if (proc_parameter_file( para, fname, &outctrl, 0 ))
+                  print_status_key_not_created 
+                    (get_parameter_value (para, pHANDLE));
+               release_parameter_list( para );
+               para = NULL;
+           }
+           else if( !ascii_strcasecmp( keyword, "%pubring" ) ) {
+               if( outctrl.pub.fname && !strcmp( outctrl.pub.fname, value ) )
+                   ; /* still the same file - ignore it */
+               else {
+                   xfree( outctrl.pub.newfname );
+                   outctrl.pub.newfname = xstrdup( value );
+                   outctrl.use_files = 1;
+               }
+           }
+           else if( !ascii_strcasecmp( keyword, "%secring" ) ) {
+               if( outctrl.sec.fname && !strcmp( outctrl.sec.fname, value ) )
+                   ; /* still the same file - ignore it */
+               else {
+                  xfree( outctrl.sec.newfname );
+                  outctrl.sec.newfname = xstrdup( value );
+                  outctrl.use_files = 1;
+               }
+           }
+           else
+               log_info("skipping control `%s' (%s)\n", keyword, value );
+
+
+           continue;
+       }
+
+
+       if( !(p = strchr( p, ':' )) || p == keyword ) {
+           err = "missing colon";
+           break;
+       }
+       if( *p )
+           *p++ = 0;
+       for( ; isspace(*(byte*)p); p++ )
+           ;
+       if( !*p ) {
+           err = "missing argument";
+           break;
+       }
+       value = p;
+       trim_trailing_ws( value, strlen(value) );
+
+       for(i=0; keywords[i].name; i++ ) {
+           if( !ascii_strcasecmp( keywords[i].name, keyword ) )
+               break;
+       }
+       if( !keywords[i].name ) {
+           err = "unknown keyword";
+           break;
+       }
+       if( keywords[i].key != pKEYTYPE && !para ) {
+           err = "parameter block does not start with \"Key-Type\"";
+           break;
+       }
+
+       if( keywords[i].key == pKEYTYPE && para ) {
+           outctrl.lnr = lnr;
+           if (proc_parameter_file( para, fname, &outctrl, 0 ))
+              print_status_key_not_created
+                (get_parameter_value (para, pHANDLE));
+           release_parameter_list( para );
+           para = NULL;
+       }
+       else {
+           for( r = para; r; r = r->next ) {
+               if( r->key == keywords[i].key )
+                   break;
+           }
+           if( r ) {
+               err = "duplicate keyword";
+               break;
+           }
+       }
+       r = xmalloc_clear( sizeof *r + strlen( value ) );
+       r->lnr = lnr;
+       r->key = keywords[i].key;
+       strcpy( r->u.value, value );
+       r->next = para;
+       para = r;
+    }
+    if( err )
+       log_error("%s:%d: %s\n", fname, lnr, err );
+    else if( iobuf_error (fp) ) {
+       log_error("%s:%d: read error\n", fname, lnr);
+    }
+    else if( para ) {
+       outctrl.lnr = lnr;
+       if (proc_parameter_file( para, fname, &outctrl, 0 ))
+          print_status_key_not_created (get_parameter_value (para, pHANDLE));
+    }
+
+    if( outctrl.use_files ) { /* close open streams */
+       iobuf_close( outctrl.pub.stream );
+       iobuf_close( outctrl.sec.stream );
+
+        /* Must invalidate that ugly cache to actually close it.  */
+        if (outctrl.pub.fname)
+          iobuf_ioctl (NULL, 2, 0, (char*)outctrl.pub.fname);
+        if (outctrl.sec.fname)
+          iobuf_ioctl (NULL, 2, 0, (char*)outctrl.sec.fname);
+
+       xfree( outctrl.pub.fname );
+       xfree( outctrl.pub.newfname );
+       xfree( outctrl.sec.fname );
+       xfree( outctrl.sec.newfname );
+    }
+
+    release_parameter_list( para );
+    iobuf_close (fp);
+}
+
+
+/*
+ * Generate a keypair (fname is only used in batch mode) If
+ * CARD_SERIALNO is not NULL the fucntion will create the keys on an
+ * OpenPGP Card.  If BACKUP_ENCRYPTION_DIR has been set and
+ * CARD_SERIALNO is NOT NULL, the encryption key for the card gets
+ * generate in software, imported to the card and a backup file
+ * written to directory given by this argument .
+ */
+void
+generate_keypair (const char *fname, const char *card_serialno, 
+                  const char *backup_encryption_dir)
+{
+  unsigned int nbits;
+  char *uid = NULL;
+  DEK *dek;
+  STRING2KEY *s2k;
+  int algo;
+  unsigned int use;
+  int both = 0;
+  u32 expire;
+  struct para_data_s *para = NULL;
+  struct para_data_s *r;
+  struct output_control_s outctrl;
+  
+  memset( &outctrl, 0, sizeof( outctrl ) );
+  
+  if (opt.batch && card_serialno)
+    {
+      /* We don't yet support unattended key generation. */
+      log_error (_("can't do this in batch mode\n"));
+      return;
+    }
+  
+  if (opt.batch)
+    {
+      read_parameter_file( fname );
+      return;
+    }
+
+  if (card_serialno)
+    {
+#ifdef ENABLE_CARD_SUPPORT
+      r = xcalloc (1, sizeof *r + strlen (card_serialno) );
+      r->key = pSERIALNO;
+      strcpy( r->u.value, card_serialno);
+      r->next = para;
+      para = r;
+       
+      algo = PUBKEY_ALGO_RSA;
+       
+      r = xcalloc (1, sizeof *r + 20 );
+      r->key = pKEYTYPE;
+      sprintf( r->u.value, "%d", algo );
+      r->next = para;
+      para = r;
+      r = xcalloc (1, sizeof *r + 20 );
+      r->key = pKEYUSAGE;
+      strcpy (r->u.value, "sign");
+      r->next = para;
+      para = r;
+       
+      r = xcalloc (1, sizeof *r + 20 );
+      r->key = pSUBKEYTYPE;
+      sprintf( r->u.value, "%d", algo );
+      r->next = para;
+      para = r;
+      r = xcalloc (1, sizeof *r + 20 );
+      r->key = pSUBKEYUSAGE;
+      strcpy (r->u.value, "encrypt");
+      r->next = para;
+      para = r;
+       
+      r = xcalloc (1, sizeof *r + 20 );
+      r->key = pAUTHKEYTYPE;
+      sprintf( r->u.value, "%d", algo );
+      r->next = para;
+      para = r;
+
+      if (backup_encryption_dir)
+        {
+          r = xcalloc (1, sizeof *r + strlen (backup_encryption_dir) );
+          r->key = pBACKUPENCDIR;
+          strcpy (r->u.value, backup_encryption_dir);
+          r->next = para;
+          para = r;
+        }
+#endif /*ENABLE_CARD_SUPPORT*/
+    }
+  else
+    {
+      algo = ask_algo( 0, &use );
+      if( !algo )
+        { /* default: DSA with ElG subkey of the specified size */
+          both = 1;
+          r = xmalloc_clear( sizeof *r + 20 );
+          r->key = pKEYTYPE;
+          sprintf( r->u.value, "%d", PUBKEY_ALGO_DSA );
+          r->next = para;
+          para = r;
+         nbits = ask_keysize( PUBKEY_ALGO_DSA );
+         r = xmalloc_clear( sizeof *r + 20 );
+         r->key = pKEYLENGTH;
+         sprintf( r->u.value, "%u", nbits);
+         r->next = para;
+         para = r;
+          r = xmalloc_clear( sizeof *r + 20 );
+          r->key = pKEYUSAGE;
+          strcpy( r->u.value, "sign" );
+          r->next = para;
+          para = r;
+           
+          algo = PUBKEY_ALGO_ELGAMAL_E;
+          r = xmalloc_clear( sizeof *r + 20 );
+          r->key = pSUBKEYTYPE;
+          sprintf( r->u.value, "%d", algo );
+          r->next = para;
+          para = r;
+          r = xmalloc_clear( sizeof *r + 20 );
+          r->key = pSUBKEYUSAGE;
+          strcpy( r->u.value, "encrypt" );
+          r->next = para;
+          para = r;
+        }
+      else 
+        {
+          r = xmalloc_clear( sizeof *r + 20 );
+          r->key = pKEYTYPE;
+          sprintf( r->u.value, "%d", algo );
+          r->next = para;
+          para = r;
+           
+          if (use)
+            {
+              r = xmalloc_clear( sizeof *r + 25 );
+              r->key = pKEYUSAGE;
+              sprintf( r->u.value, "%s%s%s",
+                       (use & PUBKEY_USAGE_SIG)? "sign ":"",
+                       (use & PUBKEY_USAGE_ENC)? "encrypt ":"",
+                       (use & PUBKEY_USAGE_AUTH)? "auth":"" );
+              r->next = para;
+              para = r;
+            }
+           
+        }
+
+      nbits = ask_keysize( algo );
+      r = xmalloc_clear( sizeof *r + 20 );
+      r->key = both? pSUBKEYLENGTH : pKEYLENGTH;
+      sprintf( r->u.value, "%u", nbits);
+      r->next = para;
+      para = r;
+    }
+   
+  expire = ask_expire_interval(0,NULL);
+  r = xmalloc_clear( sizeof *r + 20 );
+  r->key = pKEYEXPIRE;
+  r->u.expire = expire;
+  r->next = para;
+  para = r;
+  r = xmalloc_clear( sizeof *r + 20 );
+  r->key = pSUBKEYEXPIRE;
+  r->u.expire = expire;
+  r->next = para;
+  para = r;
+
+  uid = ask_user_id(0);
+  if( !uid ) 
+    {
+      log_error(_("Key generation canceled.\n"));
+      release_parameter_list( para );
+      return;
+    }
+  r = xmalloc_clear( sizeof *r + strlen(uid) );
+  r->key = pUSERID;
+  strcpy( r->u.value, uid );
+  r->next = para;
+  para = r;
+    
+  dek = card_serialno? NULL : do_ask_passphrase( &s2k );
+  if( dek )
+    {
+      r = xmalloc_clear( sizeof *r );
+      r->key = pPASSPHRASE_DEK;
+      r->u.dek = dek;
+      r->next = para;
+      para = r;
+      r = xmalloc_clear( sizeof *r );
+      r->key = pPASSPHRASE_S2K;
+      r->u.s2k = s2k;
+      r->next = para;
+      para = r;
+    }
+    
+  proc_parameter_file( para, "[internal]", &outctrl, !!card_serialno);
+  release_parameter_list( para );
+}
+
+
+#ifdef ENABLE_CARD_SUPPORT
+/* 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)
+{
+  int rc;
+  DEK *dek = NULL;
+  STRING2KEY *s2k = NULL;
+  PKT_secret_key *sk = NULL;
+  int i;
+  size_t nskey, npkey;
+
+  npkey = pubkey_get_npkey (algo);
+  nskey = pubkey_get_nskey (algo);
+  assert (nskey <= PUBKEY_MAX_NSKEY && npkey < nskey);
+
+  if (nbits < 512)
+    {
+      nbits = 512;
+      log_info (_("keysize invalid; using %u bits\n"), nbits );
+    }
+
+  if ((nbits % 32)) 
+    {
+      nbits = ((nbits + 31) / 32) * 32;
+      log_info(_("keysize rounded up to %u bits\n"), nbits );
+    }
+
+  dek = do_ask_passphrase (&s2k);
+
+  sk = xmalloc_clear (sizeof *sk);
+  sk->timestamp = created_at;
+  sk->version = 4;
+  sk->pubkey_algo = algo;
+
+  rc = pubkey_generate (algo, nbits, sk->skey, NULL);
+  if (rc)
+    {
+      log_error("pubkey_generate failed: %s\n", g10_errstr(rc) );
+      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);
+
+  if (dek)
+    {
+      sk->protect.algo = dek->algo;
+      sk->protect.s2k = *s2k;
+      rc = protect_secret_key (sk, dek);
+      if (rc)
+        {
+          log_error ("protect_secret_key failed: %s\n", g10_errstr(rc));
+          goto leave;
+       }
+    }
+  if (r_sk_protected)
+    {
+      *r_sk_protected = sk;
+      sk = NULL;
+    }
+
+ leave:
+  if (sk)
+    free_secret_key (sk);
+  xfree (dek);
+  xfree (s2k);
+  return rc;
+}
+#endif /* ENABLE_CARD_SUPPORT */
+
+/* Create and delete a dummy packet to start off a list of kbnodes. */
+static void
+start_tree(KBNODE *tree)
+{
+  PACKET *pkt;
+
+  pkt=xmalloc_clear(sizeof(*pkt));
+  pkt->pkttype=PKT_NONE;
+  *tree=new_kbnode(pkt);
+  delete_kbnode(*tree);
+}
+
+static void
+do_generate_keypair( struct para_data_s *para,
+                    struct output_control_s *outctrl, int card )
+{
+    KBNODE pub_root = NULL;
+    KBNODE sec_root = NULL;
+    PKT_secret_key *pri_sk = NULL, *sub_sk = NULL;
+    const char *s;
+    struct revocation_key *revkey;
+    int rc;
+    int did_sub = 0;
+
+    if( outctrl->dryrun )
+      {
+       log_info("dry-run mode - key generation skipped\n");
+       return;
+      }
+
+    if( outctrl->use_files ) {
+       if( outctrl->pub.newfname ) {
+           iobuf_close(outctrl->pub.stream);
+           outctrl->pub.stream = NULL;
+            if (outctrl->pub.fname)
+              iobuf_ioctl (NULL, 2, 0, (char*)outctrl->pub.fname);
+           xfree( outctrl->pub.fname );
+           outctrl->pub.fname =  outctrl->pub.newfname;
+           outctrl->pub.newfname = NULL;
+
+            if (is_secured_filename (outctrl->pub.fname) ) {
+                outctrl->pub.stream = NULL;
+                errno = EPERM;
+            }
+            else
+                outctrl->pub.stream = iobuf_create( outctrl->pub.fname );
+           if( !outctrl->pub.stream ) {
+               log_error(_("can't create `%s': %s\n"), outctrl->pub.newfname,
+                                                    strerror(errno) );
+               return;
+           }
+           if( opt.armor ) {
+               outctrl->pub.afx.what = 1;
+               iobuf_push_filter( outctrl->pub.stream, armor_filter,
+                                                   &outctrl->pub.afx );
+           }
+       }
+       if( outctrl->sec.newfname ) {
+            mode_t oldmask;
+
+           iobuf_close(outctrl->sec.stream);
+           outctrl->sec.stream = NULL;
+            if (outctrl->sec.fname)
+              iobuf_ioctl (NULL, 2, 0, (char*)outctrl->sec.fname);
+           xfree( outctrl->sec.fname );
+           outctrl->sec.fname =  outctrl->sec.newfname;
+           outctrl->sec.newfname = NULL;
+
+           oldmask = umask (077);
+            if (is_secured_filename (outctrl->sec.fname) ) {
+                outctrl->sec.stream = NULL;
+                errno = EPERM;
+            }
+            else
+                outctrl->sec.stream = iobuf_create( outctrl->sec.fname );
+            umask (oldmask);
+           if( !outctrl->sec.stream ) {
+               log_error(_("can't create `%s': %s\n"), outctrl->sec.newfname,
+                                                    strerror(errno) );
+               return;
+           }
+           if( opt.armor ) {
+               outctrl->sec.afx.what = 5;
+               iobuf_push_filter( outctrl->sec.stream, armor_filter,
+                                                   &outctrl->sec.afx );
+           }
+       }
+       assert( outctrl->pub.stream );
+       assert( outctrl->sec.stream );
+        if( opt.verbose ) {
+            log_info(_("writing public key to `%s'\n"), outctrl->pub.fname );
+            if (card)
+              log_info (_("writing secret key stub to `%s'\n"),
+                        outctrl->sec.fname);
+            else
+              log_info(_("writing secret key to `%s'\n"), outctrl->sec.fname );
+        }
+    }
+
+
+    /* we create the packets as a tree of kbnodes. Because the
+     * structure we create is known in advance we simply generate a
+     * linked list.  The first packet is a dummy packet which we flag
+     * as deleted.  The very first packet must always be a KEY packet.
+     */
+    
+    start_tree(&pub_root);
+    start_tree(&sec_root);
+
+    if (!card)
+      {
+        rc = do_create( get_parameter_algo( para, pKEYTYPE ),
+                        get_parameter_uint( para, pKEYLENGTH ),
+                        pub_root, sec_root,
+                        get_parameter_dek( para, pPASSPHRASE_DEK ),
+                        get_parameter_s2k( para, pPASSPHRASE_S2K ),
+                        &pri_sk,
+                        get_parameter_u32( para, pKEYEXPIRE ), 0 );
+      }
+    else
+      {
+        rc = gen_card_key (PUBKEY_ALGO_RSA, 1, 1, pub_root, sec_root, NULL,
+                           get_parameter_u32 (para, pKEYEXPIRE), para);
+        if (!rc)
+          {
+            pri_sk = sec_root->next->pkt->pkt.secret_key;
+            assert (pri_sk);
+          }
+      }
+
+    if(!rc && (revkey=get_parameter_revkey(para,pREVOKER)))
+      {
+       rc=write_direct_sig(pub_root,pub_root,pri_sk,revkey);
+       if(!rc)
+         write_direct_sig(sec_root,pub_root,pri_sk,revkey);
+      }
+
+    if( !rc && (s=get_parameter_value(para, pUSERID)) )
+      {
+       write_uid(pub_root, s );
+       if( !rc )
+         write_uid(sec_root, s );
+
+       if( !rc )
+         rc = write_selfsigs(sec_root, pub_root, pri_sk,
+                             get_parameter_uint (para, pKEYUSAGE));
+      }
+
+    /* Write the auth key to the card before the encryption key.  This
+       is a partial workaround for a PGP bug (as of this writing, all
+       versions including 8.1), that causes it to try and encrypt to
+       the most recent subkey regardless of whether that subkey is
+       actually an encryption type.  In this case, the auth key is an
+       RSA key so it succeeds. */
+
+    if (!rc && card && get_parameter (para, pAUTHKEYTYPE))
+      {
+        rc = gen_card_key (PUBKEY_ALGO_RSA, 3, 0, pub_root, sec_root, NULL,
+                           get_parameter_u32 (para, pKEYEXPIRE), para);
+        
+        if (!rc)
+          rc = write_keybinding (pub_root, pub_root, pri_sk, sub_sk, PUBKEY_USAGE_AUTH);
+        if (!rc)
+          rc = write_keybinding (sec_root, pub_root, pri_sk, sub_sk, PUBKEY_USAGE_AUTH);
+      }
+
+    if( !rc && get_parameter( para, pSUBKEYTYPE ) )
+      {
+        if (!card)
+          {
+            rc = do_create( get_parameter_algo( para, pSUBKEYTYPE ),
+                            get_parameter_uint( para, pSUBKEYLENGTH ),
+                            pub_root, sec_root,
+                            get_parameter_dek( para, pPASSPHRASE_DEK ),
+                            get_parameter_s2k( para, pPASSPHRASE_S2K ),
+                            &sub_sk,
+                            get_parameter_u32( para, pSUBKEYEXPIRE ), 1 );
+          }
+        else
+          {
+            if ((s = get_parameter_value (para, pBACKUPENCDIR)))
+              {
+                /* A backup of the encryption key has been requested.
+                   Generate the key i software and import it then to
+                   the card.  Write a backup file. */
+                rc = gen_card_key_with_backup (PUBKEY_ALGO_RSA, 2, 0,
+                                               pub_root, sec_root,
+                                               get_parameter_u32 (para,
+                                                                  pKEYEXPIRE),
+                                               para, s);
+              }
+            else
+              rc = gen_card_key (PUBKEY_ALGO_RSA, 2, 0, pub_root, sec_root,
+                                NULL,
+                                 get_parameter_u32 (para, pKEYEXPIRE), para);
+          }
+
+        if( !rc )
+          rc = write_keybinding(pub_root, pub_root, pri_sk, sub_sk,
+                                get_parameter_uint (para, pSUBKEYUSAGE));
+        if( !rc )
+          rc = write_keybinding(sec_root, pub_root, pri_sk, sub_sk,
+                                get_parameter_uint (para, pSUBKEYUSAGE));
+        did_sub = 1;
+      }
+
+    if( !rc && outctrl->use_files ) { /* direct write to specified files */
+       rc = write_keyblock( outctrl->pub.stream, pub_root );
+       if( rc )
+           log_error("can't write public key: %s\n", g10_errstr(rc) );
+       if( !rc ) {
+           rc = write_keyblock( outctrl->sec.stream, sec_root );
+           if( rc )
+               log_error("can't write secret key: %s\n", g10_errstr(rc) );
+       }
+
+    }
+    else if( !rc ) { /* write to the standard keyrings */
+       KEYDB_HANDLE pub_hd = keydb_new (0);
+       KEYDB_HANDLE sec_hd = keydb_new (1);
+
+        /* FIXME: we may have to create the keyring first */
+        rc = keydb_locate_writable (pub_hd, NULL);
+        if (rc) 
+           log_error (_("no writable public keyring found: %s\n"),
+                       g10_errstr (rc));
+
+        if (!rc) {  
+            rc = keydb_locate_writable (sec_hd, NULL);
+            if (rc) 
+                log_error (_("no writable secret keyring found: %s\n"),
+                           g10_errstr (rc));
+        }
+
+        if (!rc && opt.verbose) {
+            log_info(_("writing public key to `%s'\n"),
+                     keydb_get_resource_name (pub_hd));
+            if (card)
+              log_info (_("writing secret key stub to `%s'\n"),
+                        keydb_get_resource_name (sec_hd));
+            else
+              log_info(_("writing secret key to `%s'\n"),
+                       keydb_get_resource_name (sec_hd));
+        }
+
+        if (!rc) {
+           rc = keydb_insert_keyblock (pub_hd, pub_root);
+            if (rc)
+                log_error (_("error writing public keyring `%s': %s\n"),
+                           keydb_get_resource_name (pub_hd), g10_errstr(rc));
+        }
+
+        if (!rc) {
+           rc = keydb_insert_keyblock (sec_hd, sec_root);
+            if (rc)
+                log_error (_("error writing secret keyring `%s': %s\n"),
+                           keydb_get_resource_name (pub_hd), g10_errstr(rc));
+        }
+
+        keydb_release (pub_hd);
+        keydb_release (sec_hd);
+
+       if (!rc) {
+            int no_enc_rsa =
+                get_parameter_algo(para, pKEYTYPE) == PUBKEY_ALGO_RSA
+                && get_parameter_uint( para, pKEYUSAGE )
+                && !(get_parameter_uint( para,pKEYUSAGE) & PUBKEY_USAGE_ENC);
+            PKT_public_key *pk = find_kbnode (pub_root, 
+                                    PKT_PUBLIC_KEY)->pkt->pkt.public_key;
+
+           keyid_from_pk(pk,pk->main_keyid);
+           register_trusted_keyid(pk->main_keyid);
+
+           update_ownertrust (pk,
+                              ((get_ownertrust (pk) & ~TRUST_MASK)
+                               | TRUST_ULTIMATE ));
+
+           if (!opt.batch) {
+                tty_printf(_("public and secret key created and signed.\n") );
+               tty_printf("\n");
+               list_keyblock(pub_root,0,1,NULL);
+            }
+            
+
+           if( !opt.batch
+               && ( get_parameter_algo( para, pKEYTYPE ) == PUBKEY_ALGO_DSA
+                     || no_enc_rsa )
+               && !get_parameter( para, pSUBKEYTYPE ) )
+           {
+               tty_printf(_("Note that this key cannot be used for "
+                            "encryption.  You may want to use\n"
+                            "the command \"--edit-key\" to generate a "
+                            "subkey for this purpose.\n") );
+           }
+       }
+    }
+
+    if( rc ) {
+       if( opt.batch )
+           log_error("key generation failed: %s\n", g10_errstr(rc) );
+       else
+           tty_printf(_("Key generation failed: %s\n"), g10_errstr(rc) );
+        print_status_key_not_created ( get_parameter_value (para, pHANDLE) );
+    }
+    else {
+        PKT_public_key *pk = find_kbnode (pub_root, 
+                                    PKT_PUBLIC_KEY)->pkt->pkt.public_key;
+        print_status_key_created (did_sub? 'B':'P', pk,
+                                  get_parameter_value (para, pHANDLE));
+    }
+    release_kbnode( pub_root );
+    release_kbnode( sec_root );
+
+    if( pri_sk && !card) /* the unprotected  secret key unless we have a */
+      free_secret_key(pri_sk); /* shallow copy in card mode. */
+    if( sub_sk )
+       free_secret_key(sub_sk);
+}
+
+
+/****************
+ * add a new subkey to an existing key.
+ * Returns true if a new key has been generated and put into the keyblocks.
+ */
+int
+generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock )
+{
+    int okay=0, rc=0;
+    KBNODE node;
+    PKT_secret_key *pri_sk = NULL, *sub_sk = NULL;
+    int algo;
+    unsigned int use;
+    u32 expire;
+    unsigned nbits;
+    char *passphrase = NULL;
+    DEK *dek = NULL;
+    STRING2KEY *s2k = NULL;
+    u32 cur_time;
+    int ask_pass = 0;
+
+    /* break out the primary secret key */
+    node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+    if( !node ) {
+       log_error("Oops; secret key not found anymore!\n");
+       goto leave;
+    }
+
+    /* make a copy of the sk to keep the protected one in the keyblock */
+    pri_sk = copy_secret_key( NULL, node->pkt->pkt.secret_key );
+
+    cur_time = make_timestamp();
+    if( pri_sk->timestamp > cur_time ) {
+       ulong d = pri_sk->timestamp - cur_time;
+       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 );
+       if( !opt.ignore_time_conflict ) {
+           rc = G10ERR_TIME_CONFLICT;
+           goto leave;
+       }
+    }
+
+    if (pri_sk->version < 4) {
+        log_info (_("NOTE: creating subkeys for v3 keys "
+                    "is not OpenPGP compliant\n"));
+       goto leave;
+    }
+
+    if (pri_sk->is_protected && pri_sk->protect.s2k.mode == 1001) {
+        tty_printf(_("Secret parts of primary key are not available.\n"));
+        rc = G10ERR_NO_SECKEY;
+        goto leave;
+    }
+
+
+    /* Unprotect to get the passphrase.  */
+    switch( is_secret_key_protected( pri_sk ) ) {
+      case -1:
+       rc = G10ERR_PUBKEY_ALGO;
+       break;
+      case 0:
+       tty_printf(_("This key is not protected.\n"));
+       break;
+      case -2:
+        tty_printf(_("Secret parts of primary key are stored on-card.\n"));
+        ask_pass = 1;
+        break;
+      default:
+        tty_printf(_("Key is protected.\n"));
+        rc = check_secret_key( pri_sk, 0 );
+        if( !rc )
+            passphrase = get_last_passphrase();
+        break;
+    }
+    if( rc )
+       goto leave;
+
+    algo = ask_algo( 1, &use );
+    assert(algo);
+    nbits = ask_keysize( algo );
+    expire = ask_expire_interval(0,NULL);
+    if( !cpr_enabled() && !cpr_get_answer_is_yes("keygen.sub.okay",
+                                                 _("Really create? (y/N) ")))
+       goto leave;
+
+    if (ask_pass)
+        dek = do_ask_passphrase (&s2k);
+    else if (passphrase) {
+       s2k = xmalloc_secure( sizeof *s2k );
+       s2k->mode = opt.s2k_mode;
+       s2k->hash_algo = S2K_DIGEST_ALGO;
+       set_next_passphrase( passphrase );
+       dek = passphrase_to_dek( NULL, 0, opt.s2k_cipher_algo, s2k, 2,
+                                 NULL, NULL );
+    }
+
+    rc = do_create( algo, nbits, pub_keyblock, sec_keyblock,
+                   dek, s2k, &sub_sk, expire, 1 );
+    if( !rc )
+       rc = write_keybinding(pub_keyblock, pub_keyblock, pri_sk, sub_sk, use);
+    if( !rc )
+       rc = write_keybinding(sec_keyblock, pub_keyblock, pri_sk, sub_sk, use);
+    if( !rc ) {
+       okay = 1;
+        write_status_text (STATUS_KEY_CREATED, "S");
+    }
+
+  leave:
+    if( rc )
+       log_error(_("Key generation failed: %s\n"), g10_errstr(rc) );
+    xfree( passphrase );
+    xfree( dek );
+    xfree( s2k );
+    /* release the copy of the (now unprotected) secret keys */
+    if( pri_sk )
+       free_secret_key(pri_sk);
+    if( sub_sk )
+       free_secret_key(sub_sk);
+    set_next_passphrase( NULL );
+    return okay;
+}
+
+
+#ifdef ENABLE_CARD_SUPPORT
+/* Generate a subkey on a card. */
+int
+generate_card_subkeypair (KBNODE pub_keyblock, KBNODE sec_keyblock,
+                          int keyno, const char *serialno)
+{
+  int okay=0, rc=0;
+  KBNODE node;
+  PKT_secret_key *pri_sk = NULL, *sub_sk;
+  int algo;
+  unsigned int use;
+  u32 expire;
+  char *passphrase = NULL;
+  u32 cur_time;
+  struct para_data_s *para = NULL;
+
+  assert (keyno >= 1 && keyno <= 3);
+
+  para = xcalloc (1, sizeof *para + strlen (serialno) );
+  para->key = pSERIALNO;
+  strcpy (para->u.value, serialno);
+
+  /* Break out the primary secret key */
+  node = find_kbnode( sec_keyblock, PKT_SECRET_KEY );
+  if(!node)
+    {
+      log_error("Oops; secret key not found anymore!\n");
+      goto leave;
+    }
+
+  /* Make a copy of the sk to keep the protected one in the keyblock */
+  pri_sk = copy_secret_key (NULL, node->pkt->pkt.secret_key);
+
+  cur_time = make_timestamp();
+  if (pri_sk->timestamp > cur_time)
+    {
+      ulong d = pri_sk->timestamp - cur_time;
+      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 );
+       if (!opt.ignore_time_conflict)
+          {
+           rc = G10ERR_TIME_CONFLICT;
+           goto leave;
+          }
+    }
+
+  if (pri_sk->version < 4)
+    {
+      log_info (_("NOTE: creating subkeys for v3 keys "
+                  "is not OpenPGP compliant\n"));
+      goto leave;
+    }
+
+  /* Unprotect to get the passphrase. */
+  switch( is_secret_key_protected (pri_sk) )
+    {
+    case -1:
+      rc = G10ERR_PUBKEY_ALGO;
+      break;
+    case 0:
+      tty_printf("This key is not protected.\n");
+      break;
+    default:
+      tty_printf("Key is protected.\n");
+      rc = check_secret_key( pri_sk, 0 );
+      if (!rc)
+        passphrase = get_last_passphrase();
+      break;
+    }
+  if (rc)
+    goto leave;
+
+  algo = PUBKEY_ALGO_RSA;
+  expire = ask_expire_interval (0,NULL);
+  if (keyno == 1)
+    use = PUBKEY_USAGE_SIG;
+  else if (keyno == 2)
+    use = PUBKEY_USAGE_ENC;
+  else
+    use = PUBKEY_USAGE_AUTH;
+  if (!cpr_enabled() && !cpr_get_answer_is_yes("keygen.cardsub.okay",
+                                               _("Really create? (y/N) ")))
+    goto leave;
+
+  if (passphrase)
+    set_next_passphrase (passphrase);
+  rc = gen_card_key (algo, keyno, 0, pub_keyblock, sec_keyblock,
+                    &sub_sk, expire, para);
+  if (!rc)
+    rc = write_keybinding (pub_keyblock, pub_keyblock, pri_sk, sub_sk, use);
+  if (!rc)
+    rc = write_keybinding (sec_keyblock, pub_keyblock, pri_sk, sub_sk, use);
+  if (!rc)
+    {
+      okay = 1;
+      write_status_text (STATUS_KEY_CREATED, "S");
+    }
+
+ leave:
+  if (rc)
+    log_error (_("Key generation failed: %s\n"), g10_errstr(rc) );
+  xfree (passphrase);
+  /* Release the copy of the (now unprotected) secret keys. */
+  if (pri_sk)
+    free_secret_key (pri_sk);
+  set_next_passphrase( NULL );
+  release_parameter_list (para);
+  return okay;
+}
+#endif /* !ENABLE_CARD_SUPPORT */
+
+
+/****************
+ * Write a keyblock to an output stream
+ */
+static int
+write_keyblock( IOBUF out, KBNODE node )
+{
+  for( ; node ; node = node->next )
+    {
+      if(!is_deleted_kbnode(node))
+       {
+         int rc = build_packet( out, node->pkt );
+         if( rc )
+           {
+             log_error("build_packet(%d) failed: %s\n",
+                       node->pkt->pkttype, g10_errstr(rc) );
+             return G10ERR_WRITE_FILE;
+           }
+       }
+    }
+
+  return 0;
+}
+
+
+static int
+gen_card_key (int algo, int keyno, int is_primary,
+              KBNODE pub_root, KBNODE sec_root, PKT_secret_key **ret_sk,
+              u32 expireval, struct para_data_s *para)
+{
+#ifdef ENABLE_CARD_SUPPORT
+  int rc;
+  const char *s;
+  struct agent_card_genkey_s info;
+  PACKET *pkt;
+  PKT_secret_key *sk;
+  PKT_public_key *pk;
+
+  assert (algo == PUBKEY_ALGO_RSA);
+  
+  /* Fixme: We don't have the serialnumber available, thus passing NULL. */
+  rc = agent_scd_genkey (&info, keyno, 1, NULL);
+/*    if (gpg_err_code (rc) == GPG_ERR_EEXIST) */
+/*      { */
+/*        tty_printf ("\n"); */
+/*        log_error ("WARNING: key does already exists!\n"); */
+/*        tty_printf ("\n"); */
+/*        if ( cpr_get_answer_is_yes( "keygen.card.replace_key", */
+/*                                    _("Replace existing key? "))) */
+/*          rc = agent_scd_genkey (&info, keyno, 1); */
+/*      } */
+
+  if (rc)
+    {
+      log_error ("key generation failed: %s\n", gpg_strerror (rc));
+      return rc;
+    }
+  if ( !info.n || !info.e )
+    {
+      log_error ("communication error with SCD\n");
+      mpi_free (info.n);
+      mpi_free (info.e);
+      return gpg_error (GPG_ERR_GENERAL);
+    }
+  
+
+  pk = xcalloc (1, sizeof *pk );
+  sk = xcalloc (1, sizeof *sk );
+  sk->timestamp = pk->timestamp = info.created_at;
+  sk->version = pk->version = 4;
+  if (expireval)
+      sk->expiredate = pk->expiredate = pk->timestamp + expireval;
+  sk->pubkey_algo = pk->pubkey_algo = algo;
+  pk->pkey[0] = info.n;
+  pk->pkey[1] = info.e; 
+  sk->skey[0] = mpi_copy (pk->pkey[0]);
+  sk->skey[1] = mpi_copy (pk->pkey[1]);
+  sk->skey[2] = mpi_set_opaque (NULL, xstrdup ("dummydata"), 10);
+  sk->is_protected = 1;
+  sk->protect.s2k.mode = 1002;
+  s = get_parameter_value (para, pSERIALNO);
+  if (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);
+    }
+
+  if( ret_sk )
+    *ret_sk = sk;
+
+  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
+  return -1;
+#endif /*!ENABLE_CARD_SUPPORT*/
+}
+
+
+
+static int
+gen_card_key_with_backup (int algo, int keyno, int is_primary,
+                          KBNODE pub_root, KBNODE sec_root,
+                          u32 expireval, struct para_data_s *para,
+                          const char *backup_dir)
+{
+#ifdef ENABLE_CARD_SUPPORT
+  int rc;
+  const char *s;
+  PACKET *pkt;
+  PKT_secret_key *sk, *sk_unprotected, *sk_protected;
+  PKT_public_key *pk;
+  size_t n;
+  int i;
+
+  sk_unprotected = NULL;
+  sk_protected = NULL;
+  rc = generate_raw_key (algo, 1024, make_timestamp (),
+                         &sk_unprotected, &sk_protected);
+  if (rc)
+    return rc;
+
+  /* First, 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"), g10_errstr (rc));
+      free_secret_key (sk_unprotected);
+      free_secret_key (sk_protected);
+      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++)
+    {
+      mpi_free (sk->skey[i]);
+      sk->skey[i] = NULL;
+    }
+  i = pubkey_get_npkey (sk->pubkey_algo);
+  sk->skey[i] = mpi_set_opaque (NULL, xstrdup ("dummydata"), 10);
+  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);
+    sprintf (name_buffer,"sk_%08lX%08lX.gpg",
+             (ulong)sk->keyid[0], (ulong)sk->keyid[1]);
+
+    fname = make_filename (backup_dir, name_buffer, NULL);
+    oldmask = umask (077);
+    if (is_secured_filename (fname))
+      {
+        fp = NULL;
+        errno = EPERM;
+      }
+    else
+      fp = iobuf_create (fname);
+    umask (oldmask);
+    if (!fp) 
+      {
+       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 G10ERR_OPEN_FILE;
+      }
+
+    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", g10_errstr(rc) );
+        iobuf_cancel (fp);
+      }
+    else
+      {
+        byte array[MAX_FINGERPRINT_LEN];
+        char *fprbuf, *p;
+       
+        iobuf_close (fp);
+        iobuf_ioctl (NULL, 2, 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
+  return -1;
+#endif /*!ENABLE_CARD_SUPPORT*/
+}
+
+
+#ifdef ENABLE_CARD_SUPPORT
+int
+save_unprotected_key_to_card (PKT_secret_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;
+  unsigned int 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. */
+  rsa_n = mpi_get_secure_buffer (sk->skey[0], &rsa_n_len, NULL);
+  rsa_e = mpi_get_secure_buffer (sk->skey[1], &rsa_e_len, NULL);
+  rsa_p = mpi_get_secure_buffer (sk->skey[3], &rsa_p_len, NULL);
+  rsa_q = mpi_get_secure_buffer (sk->skey[4], &rsa_q_len, NULL);
+  if (!rsa_n || !rsa_e || !rsa_p || !rsa_q)
+    {
+      rc = G10ERR_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:", rsa_n_len);
+  p = stpcpy (p, numbuf);
+  memcpy (p, rsa_n, rsa_n_len);
+  p += rsa_n_len;
+
+  sprintf (numbuf, ")(1:e%u:", rsa_e_len);
+  p = stpcpy (p, numbuf);
+  memcpy (p, rsa_e, rsa_e_len);
+  p += rsa_e_len;
+
+  sprintf (numbuf, ")(1:p%u:", rsa_p_len);
+  p = stpcpy (p, numbuf);
+  memcpy (p, rsa_p, rsa_p_len);
+  p += rsa_p_len;
+
+  sprintf (numbuf, ")(1:q%u:", 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
new file mode 100644 (file)
index 0000000..86a204f
--- /dev/null
@@ -0,0 +1,753 @@
+/* keyid.c - key ID and fingerprint handling
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+#include <assert.h>
+#include "util.h"
+#include "main.h"
+#include "packet.h"
+#include "options.h"
+#include "mpi.h"
+#include "keydb.h"
+#include "i18n.h"
+
+int
+pubkey_letter( int algo )
+{
+    switch( algo ) {
+      case PUBKEY_ALGO_RSA:    return 'R' ;
+      case PUBKEY_ALGO_RSA_E:  return 'r' ;
+      case PUBKEY_ALGO_RSA_S:  return 's' ;
+      case PUBKEY_ALGO_ELGAMAL_E: return 'g';
+      case PUBKEY_ALGO_ELGAMAL: return 'G' ;
+      case PUBKEY_ALGO_DSA:    return 'D' ;
+      default: return '?';
+    }
+}
+
+/* This function is useful for v4 fingerprints and v3 or v4 key
+   signing. */
+void
+hash_public_key( MD_HANDLE md, PKT_public_key *pk )
+{
+  unsigned n=6;
+  unsigned nb[PUBKEY_MAX_NPKEY];
+  unsigned nn[PUBKEY_MAX_NPKEY];
+  byte *pp[PUBKEY_MAX_NPKEY];
+  int i;
+  int npkey = pubkey_get_npkey( pk->pubkey_algo );
+
+  /* Two extra bytes for the expiration date in v3 */
+  if(pk->version<4)
+    n+=2;
+
+  if(npkey==0 && pk->pkey[0] && mpi_is_opaque(pk->pkey[0]))
+    {
+      pp[0]=mpi_get_opaque(pk->pkey[0],&nn[0]);
+      n+=nn[0];
+    }
+  else
+    for(i=0; i < npkey; i++ )
+      {
+       nb[i] = mpi_get_nbits(pk->pkey[i]);
+       pp[i] = mpi_get_buffer( pk->pkey[i], nn+i, NULL );
+       n += 2 + nn[i];
+      }
+
+  md_putc( md, 0x99 );     /* ctb */
+  /* What does it mean if n is greater than than 0xFFFF ? */
+  md_putc( md, n >> 8 );   /* 2 byte length header */
+  md_putc( md, n );
+  md_putc( md, pk->version );
+
+  md_putc( md, pk->timestamp >> 24 );
+  md_putc( md, pk->timestamp >> 16 );
+  md_putc( md, pk->timestamp >>  8 );
+  md_putc( md, pk->timestamp       );
+
+  if(pk->version<4)
+    {
+      u16 days=0;
+      if(pk->expiredate)
+       days=(u16)((pk->expiredate - pk->timestamp) / 86400L);
+      md_putc( md, days >> 8 );
+      md_putc( md, days );
+    }
+
+  md_putc( md, pk->pubkey_algo );
+
+  if(npkey==0 && pk->pkey[0] && mpi_is_opaque(pk->pkey[0]))
+    md_write(md,pp[0],nn[0]);
+  else
+    for(i=0; i < npkey; i++ )
+      {
+       md_putc( md, nb[i]>>8);
+       md_putc( md, nb[i] );
+       md_write( md, pp[i], nn[i] );
+       xfree(pp[i]);
+      }
+}
+
+static MD_HANDLE
+do_fingerprint_md( PKT_public_key *pk )
+{
+  MD_HANDLE md;
+
+  md = md_open( DIGEST_ALGO_SHA1, 0);
+  hash_public_key(md,pk);
+  md_final( md );
+
+  return md;
+}
+
+static MD_HANDLE
+do_fingerprint_md_sk( PKT_secret_key *sk )
+{
+    PKT_public_key pk;
+    int npkey = pubkey_get_npkey( sk->pubkey_algo ); /* npkey is correct! */
+    int i;
+
+    if(npkey==0)
+      return NULL;
+
+    pk.pubkey_algo = sk->pubkey_algo;
+    pk.version    = sk->version;
+    pk.timestamp = sk->timestamp;
+    pk.expiredate = sk->expiredate;
+    pk.pubkey_algo = sk->pubkey_algo;
+    for( i=0; i < npkey; i++ )
+      pk.pkey[i] = sk->skey[i];
+    return do_fingerprint_md( &pk );
+}
+
+size_t
+keystrlen(void)
+{
+  switch(opt.keyid_format)
+    {
+    case KF_SHORT:
+      return 8;
+
+    case KF_LONG:
+      return 16;
+
+    case KF_0xSHORT:
+      return 10;
+
+    case KF_0xLONG:
+      return 18;
+
+    default:
+      BUG();
+    }
+}
+
+const char *
+keystr(u32 *keyid)
+{  
+  static char keyid_str[19];
+
+  switch(opt.keyid_format)
+    {
+    case KF_SHORT:
+      sprintf(keyid_str,"%08lX",(ulong)keyid[1]);
+      break;
+
+    case KF_LONG:
+      if(keyid[0])
+       sprintf(keyid_str,"%08lX%08lX",(ulong)keyid[0],(ulong)keyid[1]);
+      else
+       sprintf(keyid_str,"%08lX",(ulong)keyid[1]);
+      break;
+
+    case KF_0xSHORT:
+      sprintf(keyid_str,"0x%08lX",(ulong)keyid[1]);
+      break;
+
+    case KF_0xLONG:
+      if(keyid[0])
+       sprintf(keyid_str,"0x%08lX%08lX",(ulong)keyid[0],(ulong)keyid[1]);
+      else
+       sprintf(keyid_str,"0x%08lX",(ulong)keyid[1]);
+      break;
+
+    default:
+      BUG();
+    }
+
+  return keyid_str;
+}
+
+const char *
+keystr_from_pk(PKT_public_key *pk)
+{
+  keyid_from_pk(pk,NULL);
+
+  return keystr(pk->keyid);
+}
+
+const char *
+keystr_from_sk(PKT_secret_key *sk)
+{
+  keyid_from_sk(sk,NULL);
+
+  return keystr(sk->keyid);
+}
+
+const char *
+keystr_from_desc(KEYDB_SEARCH_DESC *desc)
+{
+  switch(desc->mode)
+    {
+    case KEYDB_SEARCH_MODE_LONG_KID:
+    case KEYDB_SEARCH_MODE_SHORT_KID:
+      return keystr(desc->u.kid);
+
+    case KEYDB_SEARCH_MODE_FPR20:
+      {
+       u32 keyid[2];
+
+       keyid[0] = (unsigned char)desc->u.fpr[12] << 24
+         | (unsigned char)desc->u.fpr[13] << 16
+         | (unsigned char)desc->u.fpr[14] << 8
+         | (unsigned char)desc->u.fpr[15] ;
+       keyid[1] = (unsigned char)desc->u.fpr[16] << 24
+         | (unsigned char)desc->u.fpr[17] << 16
+         | (unsigned char)desc->u.fpr[18] << 8
+         | (unsigned char)desc->u.fpr[19] ;
+
+       return keystr(keyid);
+      }
+
+    case KEYDB_SEARCH_MODE_FPR16:
+      return "?v3 fpr?";
+
+    default:
+      BUG();
+    }
+}
+
+/****************
+ * Get the keyid from the secret key and put it into keyid
+ * if this is not NULL. Return the 32 low bits of the keyid.
+ */
+u32
+keyid_from_sk( PKT_secret_key *sk, u32 *keyid )
+{
+  u32 lowbits;
+  u32 dummy_keyid[2];
+
+  if( !keyid )
+    keyid = dummy_keyid;
+
+  if( sk->keyid[0] || sk->keyid[1] )
+    {
+      keyid[0] = sk->keyid[0];
+      keyid[1] = sk->keyid[1];
+      lowbits = keyid[1];
+    }
+  else if( sk->version < 4 )
+    {
+      if( is_RSA(sk->pubkey_algo) )
+       {
+         lowbits = pubkey_get_npkey(sk->pubkey_algo) ?
+           mpi_get_keyid( sk->skey[0], keyid ) : 0; /* take n */
+         sk->keyid[0]=keyid[0];
+         sk->keyid[1]=keyid[1];
+       }
+      else
+       sk->keyid[0]=sk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
+    }
+  else
+    {
+      const byte *dp;
+      MD_HANDLE md;
+      md = do_fingerprint_md_sk(sk);
+      if(md)
+       {
+         dp = md_read( md, 0 );
+         keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ;
+         keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ;
+         lowbits = keyid[1];
+         md_close(md);
+         sk->keyid[0] = keyid[0];
+         sk->keyid[1] = keyid[1];
+       }
+      else
+       sk->keyid[0]=sk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
+    }
+
+  return lowbits;
+}
+
+
+/****************
+ * Get the keyid from the public key and put it into keyid
+ * if this is not NULL. Return the 32 low bits of the keyid.
+ */
+u32
+keyid_from_pk( PKT_public_key *pk, u32 *keyid )
+{
+  u32 lowbits;
+  u32 dummy_keyid[2];
+
+  if( !keyid )
+    keyid = dummy_keyid;
+
+  if( pk->keyid[0] || pk->keyid[1] )
+    {
+      keyid[0] = pk->keyid[0];
+      keyid[1] = pk->keyid[1];
+      lowbits = keyid[1];
+    }
+  else if( pk->version < 4 )
+    {
+      if( is_RSA(pk->pubkey_algo) )
+       {
+         lowbits = pubkey_get_npkey(pk->pubkey_algo) ?
+           mpi_get_keyid( pk->pkey[0], keyid ) : 0 ; /* from n */
+         pk->keyid[0] = keyid[0];
+         pk->keyid[1] = keyid[1];
+       }
+      else
+       pk->keyid[0]=pk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
+    }
+  else
+    {
+      const byte *dp;
+      MD_HANDLE md;
+      md = do_fingerprint_md(pk);
+      if(md)
+       {
+         dp = md_read( md, 0 );
+         keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ;
+         keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ;
+         lowbits = keyid[1];
+         md_close(md);
+         pk->keyid[0] = keyid[0];
+         pk->keyid[1] = keyid[1];
+       }
+      else
+       pk->keyid[0]=pk->keyid[1]=keyid[0]=keyid[1]=lowbits=0xFFFFFFFF;
+    }
+
+  return lowbits;
+}
+
+
+/****************
+ * Get the keyid from the fingerprint. This function is simple for most
+ * keys, but has to do a keylookup for old stayle keys.
+ */
+u32
+keyid_from_fingerprint( const byte *fprint, size_t fprint_len, u32 *keyid )
+{
+    u32 dummy_keyid[2];
+
+    if( !keyid )
+       keyid = dummy_keyid;
+
+    if( fprint_len != 20 ) {
+       /* This is special as we have to lookup the key first */
+       PKT_public_key pk;
+       int rc;
+
+       memset( &pk, 0, sizeof pk );
+       rc = get_pubkey_byfprint( &pk, fprint, fprint_len );
+       if( rc ) {
+           log_error("Oops: keyid_from_fingerprint: no pubkey\n");
+           keyid[0] = 0;
+           keyid[1] = 0;
+       }
+       else
+           keyid_from_pk( &pk, keyid );
+    }
+    else {
+       const byte *dp = fprint;
+       keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ;
+       keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ;
+    }
+
+    return keyid[1];
+}
+
+
+u32
+keyid_from_sig( PKT_signature *sig, u32 *keyid )
+{
+    if( keyid ) {
+       keyid[0] = sig->keyid[0];
+       keyid[1] = sig->keyid[1];
+    }
+    return sig->keyid[1];
+}
+
+byte *
+namehash_from_uid(PKT_user_id *uid)
+{
+  if(uid->namehash==NULL)
+    {
+      uid->namehash=xmalloc(20);
+
+      if(uid->attrib_data)
+       rmd160_hash_buffer(uid->namehash,uid->attrib_data,uid->attrib_len);
+      else
+       rmd160_hash_buffer(uid->namehash,uid->name,uid->len);
+    }
+
+  return uid->namehash;
+}
+
+/****************
+ * return the number of bits used in the pk
+ */
+unsigned
+nbits_from_pk( PKT_public_key *pk )
+{
+    return pubkey_nbits( pk->pubkey_algo, pk->pkey );
+}
+
+/****************
+ * return the number of bits used in the sk
+ */
+unsigned
+nbits_from_sk( PKT_secret_key *sk )
+{
+    return pubkey_nbits( sk->pubkey_algo, sk->skey );
+}
+
+static const char *
+mk_datestr (char *buffer, time_t atime)
+{
+    struct tm *tp;
+
+    if ( atime < 0 ) /* 32 bit time_t and after 2038-01-19 */
+        strcpy (buffer, "????" "-??" "-??"); /* mark this as invalid */
+    else {
+        tp = gmtime (&atime);
+        sprintf (buffer,"%04d-%02d-%02d",
+                 1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
+    }
+    return buffer;
+}
+
+/****************
+ * return a string with the creation date of the pk
+ * Note: this is alloced in a static buffer.
+ *    Format is: yyyy-mm-dd
+ */
+const char *
+datestr_from_pk( PKT_public_key *pk )
+{
+    static char buffer[11+5];
+    time_t atime = pk->timestamp;
+
+    return mk_datestr (buffer, atime);
+}
+
+const char *
+datestr_from_sk( PKT_secret_key *sk )
+{
+    static char buffer[11+5];
+    time_t atime = sk->timestamp;
+
+    return mk_datestr (buffer, atime);
+}
+
+const char *
+datestr_from_sig( PKT_signature *sig )
+{
+    static char buffer[11+5];
+    time_t atime = sig->timestamp;
+
+    return mk_datestr (buffer, atime);
+}
+
+const char *
+expirestr_from_pk( PKT_public_key *pk )
+{
+    static char buffer[11+5];
+    time_t atime;
+
+    if( !pk->expiredate )
+       return _("never     ");
+    atime = pk->expiredate;
+    return mk_datestr (buffer, atime);
+}
+
+const char *
+expirestr_from_sk( PKT_secret_key *sk )
+{
+    static char buffer[11+5];
+    time_t atime;
+
+    if( !sk->expiredate )
+       return _("never     ");
+    atime = sk->expiredate;
+    return mk_datestr (buffer, atime);
+}
+
+const char *
+expirestr_from_sig( PKT_signature *sig )
+{
+    static char buffer[11+5];
+    time_t atime;
+
+    if(!sig->expiredate)
+      return _("never     ");
+    atime=sig->expiredate;
+    return mk_datestr (buffer, atime);
+}
+
+const char *
+revokestr_from_pk( PKT_public_key *pk )
+{
+    static char buffer[11+5];
+    time_t atime;
+
+    if(!pk->revoked.date)
+      return _("never     ");
+    atime=pk->revoked.date;
+    return mk_datestr (buffer, atime);
+}
+
+
+const char *
+usagestr_from_pk( PKT_public_key *pk )
+{
+  static char buffer[10];
+  int i = 0;
+  unsigned int use = pk->pubkey_usage;
+
+  if ( use & PUBKEY_USAGE_SIG )
+    buffer[i++] = 'S';
+
+  if ( use & PUBKEY_USAGE_CERT )
+    buffer[i++] = 'C';
+
+  if ( use & PUBKEY_USAGE_ENC )
+    buffer[i++] = 'E';
+
+  if ( (use & PUBKEY_USAGE_AUTH) )
+    buffer[i++] = 'A';
+
+  while (i < 4)
+    buffer[i++] = ' ';
+
+  buffer[i] = 0;
+  return buffer;
+}
+
+
+const char *
+colon_strtime (u32 t)
+{
+    if (!t)
+        return "";
+    if (opt.fixed_list_mode) {
+        static char buf[15];
+        sprintf (buf, "%lu", (ulong)t);
+        return buf;
+    }
+    return strtimestamp(t);
+}
+
+const char *
+colon_datestr_from_pk (PKT_public_key *pk)
+{
+    if (opt.fixed_list_mode) {
+        static char buf[15];
+        sprintf (buf, "%lu", (ulong)pk->timestamp);
+        return buf;
+    }
+    return datestr_from_pk (pk);
+}
+
+const char *
+colon_datestr_from_sk (PKT_secret_key *sk)
+{
+    if (opt.fixed_list_mode) {
+        static char buf[15];
+        sprintf (buf, "%lu", (ulong)sk->timestamp);
+        return buf;
+    }
+    return datestr_from_sk (sk);
+}
+
+const char *
+colon_datestr_from_sig (PKT_signature *sig)
+{
+    if (opt.fixed_list_mode) {
+        static char buf[15];
+        sprintf (buf, "%lu", (ulong)sig->timestamp);
+        return buf;
+    }
+    return datestr_from_sig (sig);
+}
+
+const char *
+colon_expirestr_from_sig (PKT_signature *sig)
+{
+    if(!sig->expiredate)
+        return "";
+    if (opt.fixed_list_mode) {
+        static char buf[15];
+        sprintf (buf, "%lu", (ulong)sig->expiredate);
+        return buf;
+    }
+    return expirestr_from_sig (sig);
+}
+
+
+/**************** .
+ * Return a byte array with the fingerprint for the given PK/SK
+ * The length of the array is returned in ret_len. Caller must free
+ * the array or provide an array of length MAX_FINGERPRINT_LEN.
+ */
+
+byte *
+fingerprint_from_pk( PKT_public_key *pk, byte *array, size_t *ret_len )
+{
+    byte *p, *buf;
+    const byte *dp;
+    size_t len;
+    unsigned int n;
+
+    if( pk->version < 4 )
+      {
+       if( is_RSA(pk->pubkey_algo) )
+         {
+           /* RSA in version 3 packets is special */
+           MD_HANDLE md;
+
+           md = md_open( DIGEST_ALGO_MD5, 0);
+           if( pubkey_get_npkey( pk->pubkey_algo ) > 1 ) {
+             p = buf = mpi_get_buffer( pk->pkey[0], &n, NULL );
+             md_write( md, p, n );
+             xfree(buf);
+             p = buf = mpi_get_buffer( pk->pkey[1], &n, NULL );
+             md_write( md, p, n );
+             xfree(buf);
+           }
+           md_final(md);
+           if( !array )
+             array = xmalloc( 16 );
+           len = 16;
+           memcpy(array, md_read(md, DIGEST_ALGO_MD5), 16 );
+           md_close(md);
+         }
+       else
+         {
+           if(!array)
+             array=xmalloc(16);
+           len=16;
+           memset(array,0,16);
+         }
+      }
+    else {
+       MD_HANDLE md;
+       md = do_fingerprint_md(pk);
+       dp = md_read( md, 0 );
+       len = md_digest_length( md_get_algo( md ) );
+       assert( len <= MAX_FINGERPRINT_LEN );
+       if( !array )
+           array = xmalloc( len );
+       memcpy(array, dp, len );
+       pk->keyid[0] = dp[12] << 24 | dp[13] << 16 | dp[14] << 8 | dp[15] ;
+       pk->keyid[1] = dp[16] << 24 | dp[17] << 16 | dp[18] << 8 | dp[19] ;
+       md_close(md);
+    }
+
+    *ret_len = len;
+    return array;
+}
+
+byte *
+fingerprint_from_sk( PKT_secret_key *sk, byte *array, size_t *ret_len )
+{
+    byte *p, *buf;
+    const char *dp;
+    size_t len;
+    unsigned n;
+
+    if( sk->version < 4 )
+      {
+       if( is_RSA(sk->pubkey_algo) )
+         {
+           /* RSA in version 3 packets is special */
+           MD_HANDLE md;
+
+           md = md_open( DIGEST_ALGO_MD5, 0);
+           if( pubkey_get_npkey( sk->pubkey_algo ) > 1 ) {
+             p = buf = mpi_get_buffer( sk->skey[0], &n, NULL );
+             md_write( md, p, n );
+             xfree(buf);
+             p = buf = mpi_get_buffer( sk->skey[1], &n, NULL );
+             md_write( md, p, n );
+             xfree(buf);
+           }
+           md_final(md);
+           if( !array )
+             array = xmalloc( 16 );
+           len = 16;
+           memcpy(array, md_read(md, DIGEST_ALGO_MD5), 16 );
+           md_close(md);
+         }
+       else
+         {
+           if(!array)
+             array=xmalloc(16);
+           len=16;
+           memset(array,0,16);
+         }
+      }
+    else {
+       MD_HANDLE md;
+       md = do_fingerprint_md_sk(sk);
+       if(md)
+         {
+           dp = md_read( md, 0 );
+           len = md_digest_length( md_get_algo( md ) );
+           assert( len <= MAX_FINGERPRINT_LEN );
+           if( !array )
+             array = xmalloc( len );
+           memcpy(array, dp, len );
+           md_close(md);
+         }
+       else
+         {
+           len=MAX_FINGERPRINT_LEN;
+           if(!array)
+             array=xmalloc(len);
+           memset(array,0,len);
+         }
+    }
+
+    *ret_len = len;
+    return array;
+}
diff --git a/g10/keylist.c b/g10/keylist.c
new file mode 100644 (file)
index 0000000..19f3d3f
--- /dev/null
@@ -0,0 +1,1638 @@
+/* keylist.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "photoid.h"
+#include "util.h"
+#include "ttyio.h"
+#include "trustdb.h"
+#include "main.h"
+#include "i18n.h"
+#include "status.h"
+
+static void list_all(int);
+static void list_one( STRLIST names, int secret);
+static void print_card_serialno (PKT_secret_key *sk);
+
+struct sig_stats
+{
+  int inv_sigs;
+  int no_key;
+  int oth_err;
+};
+
+static FILE *attrib_fp=NULL;
+
+/****************
+ * List the keys
+ * If list is NULL, all available keys are listed
+ */
+void
+public_key_list( STRLIST list )
+{
+  if(opt.with_colons)
+    {
+      byte trust_model,marginals,completes,cert_depth;
+      ulong created,nextcheck;
+
+      read_trust_options(&trust_model,&created,&nextcheck,
+                        &marginals,&completes,&cert_depth);
+
+      printf("tru:");
+
+      if(nextcheck && nextcheck <= make_timestamp())
+       printf("o");
+      if(trust_model!=opt.trust_model)
+       printf("t");
+      if(opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC)
+       {
+         if(marginals!=opt.marginals_needed)
+           printf("m");
+         if(completes!=opt.completes_needed)
+           printf("c");
+         if(cert_depth!=opt.max_cert_depth)
+           printf("d");
+       }
+
+      printf(":%d:%lu:%lu",trust_model,created,nextcheck);
+
+      /* Only show marginals, completes, and cert_depth in the classic
+        or PGP trust models since they are not meaningful
+        otherwise. */
+
+      if(trust_model==TM_PGP || trust_model==TM_CLASSIC)
+       printf(":%d:%d:%d",marginals,completes,cert_depth);
+
+      printf("\n");
+    }
+
+  /* We need to do the stale check right here because it might need to
+     update the keyring while we already have the keyring open.  This
+     is very bad for W32 because of a sharing violation. For real OSes
+     it might lead to false results if we are later listing a keyring
+     which is associated with the inode of a deleted file.  */
+  check_trustdb_stale ();
+
+  if( !list )
+    list_all(0);
+  else
+    list_one( list, 0 );
+}
+
+void
+secret_key_list( STRLIST list )
+{
+    check_trustdb_stale ();
+
+    if( !list )
+       list_all(1);
+    else  /* List by user id */
+       list_one( list, 1 );
+}
+
+void
+print_seckey_info (PKT_secret_key *sk)
+{
+  u32 keyid[2];
+  char *p;
+
+  keyid_from_sk (sk, keyid);
+  p=get_user_id_native(keyid);
+
+  tty_printf ("\nsec  %4u%c/%s %s %s\n",
+             nbits_from_sk (sk),
+             pubkey_letter (sk->pubkey_algo),
+             keystr(keyid), datestr_from_sk (sk), p);
+    
+  xfree (p);
+}
+
+/* Print information about the public key.  With FP passed as NULL,
+   the tty output interface is used, otherwise output is directted to
+   the given stream. */
+void
+print_pubkey_info (FILE *fp, PKT_public_key *pk)
+{
+  u32 keyid[2];
+  char *p;
+
+  keyid_from_pk (pk, keyid);
+
+  /* If the pk was chosen by a particular user ID, that is the one to
+     print. */
+  if(pk->user_id)
+    p=utf8_to_native(pk->user_id->name,pk->user_id->len,0);
+  else
+    p=get_user_id_native(keyid);
+
+  if (fp)
+    fprintf (fp, "pub  %4u%c/%s %s %s\n",
+             nbits_from_pk (pk),
+             pubkey_letter (pk->pubkey_algo),
+             keystr(keyid), datestr_from_pk (pk), p);
+  else
+    tty_printf ("\npub  %4u%c/%s %s %s\n",
+                nbits_from_pk (pk), pubkey_letter (pk->pubkey_algo),
+                keystr(keyid), datestr_from_pk (pk), p);
+
+  xfree (p);
+}
+
+
+/* Print basic information of a secret key including the card serial
+   number information. */
+void
+print_card_key_info (FILE *fp, KBNODE keyblock)
+{
+  KBNODE node;
+  int i;
+
+  for (node = keyblock; node; node = node->next ) 
+    {
+      if (node->pkt->pkttype == PKT_SECRET_KEY
+          || (node->pkt->pkttype == PKT_SECRET_SUBKEY) )
+        {
+          PKT_secret_key *sk = node->pkt->pkt.secret_key;
+          
+          tty_fprintf (fp, "%s%c  %4u%c/%s  ",
+                      node->pkt->pkttype == PKT_SECRET_KEY? "sec":"ssb",
+                       (sk->protect.s2k.mode==1001)?'#':
+                       (sk->protect.s2k.mode==1002)?'>':' ',
+                      nbits_from_sk (sk),
+                      pubkey_letter (sk->pubkey_algo),
+                      keystr_from_sk(sk));
+          tty_fprintf (fp, _("created: %s"), datestr_from_sk (sk));
+          tty_fprintf (fp, "  ");
+          tty_fprintf (fp, _("expires: %s"), expirestr_from_sk (sk));
+          if (sk->is_protected && sk->protect.s2k.mode == 1002)
+            {
+              tty_fprintf (fp, "\n                      ");
+              tty_fprintf (fp, _("card-no: ")); 
+              if (sk->protect.ivlen == 16
+                  && !memcmp (sk->protect.iv, "\xD2\x76\x00\x01\x24\x01", 6))
+                { 
+                  /* This is an OpenPGP card. */
+                  for (i=8; i < 14; i++)
+                    {
+                      if (i == 10)
+                        tty_fprintf (fp, " ");
+                      tty_fprintf (fp, "%02X", sk->protect.iv[i]);
+                    }
+                }
+              else
+                { /* Something is wrong: Print all. */
+                  for (i=0; i < sk->protect.ivlen; i++)
+                    tty_fprintf (fp, "%02X", sk->protect.iv[i]);
+                }
+            }
+          tty_fprintf (fp, "\n");
+        }
+    }
+}
+
+
+
+/* Flags = 0x01 hashed 0x02 critical */
+static void
+status_one_subpacket(sigsubpkttype_t type,size_t len,int flags,const byte *buf)
+{
+  char status[40];
+
+  /* Don't print these. */
+  if(len>256)
+    return;
+
+  sprintf(status,"%d %u %u ",type,flags,(unsigned int)len);
+
+  write_status_text_and_buffer(STATUS_SIG_SUBPACKET,status,buf,len,0);
+}
+
+/*
+  mode=0 for stdout.
+  mode=1 for log_info + status messages
+  mode=2 for status messages only
+*/
+
+void
+show_policy_url(PKT_signature *sig,int indent,int mode)
+{
+  const byte *p;
+  size_t len;
+  int seq=0,crit;
+  FILE *fp=mode?log_stream():stdout;
+
+  while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_POLICY,&len,&seq,&crit)))
+    {
+      if(mode!=2)
+       {
+         int i;
+         const char *str;
+
+         for(i=0;i<indent;i++)
+           putchar(' ');
+
+         if(crit)
+           str=_("Critical signature policy: ");
+         else
+           str=_("Signature policy: ");
+         if(mode)
+           log_info("%s",str);
+         else
+           printf("%s",str);
+         print_utf8_string(fp,p,len);
+         fprintf(fp,"\n");
+       }
+
+      if(mode)
+       write_status_buffer ( STATUS_POLICY_URL, p, len, 0 );
+    }
+}
+
+/*
+  mode=0 for stdout.
+  mode=1 for log_info + status messages
+  mode=2 for status messages only
+*/
+/* TODO: use this */
+void
+show_keyserver_url(PKT_signature *sig,int indent,int mode)
+{
+  const byte *p;
+  size_t len;
+  int seq=0,crit;
+  FILE *fp=mode?log_stream():stdout;
+
+  while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&len,&seq,&crit)))
+    {
+      if(mode!=2)
+       {
+         int i;
+         const char *str;
+
+         for(i=0;i<indent;i++)
+           putchar(' ');
+
+         if(crit)
+           str=_("Critical preferred keyserver: ");
+         else
+           str=_("Preferred keyserver: ");
+         if(mode)
+           log_info("%s",str);
+         else
+           printf("%s",str);
+         print_utf8_string(fp,p,len);
+         fprintf(fp,"\n");
+       }
+
+      if(mode)
+       status_one_subpacket(SIGSUBPKT_PREF_KS,len,(crit?0x02:0)|0x01,p);
+    }
+}
+
+/*
+  mode=0 for stdout.
+  mode=1 for log_info + status messages
+  mode=2 for status messages only
+
+  which bits:
+  1 == standard notations
+  2 == user notations
+*/
+
+void
+show_notation(PKT_signature *sig,int indent,int mode,int which)
+{
+  FILE *fp=mode?log_stream():stdout;
+  struct notation *nd,*notations;
+
+  if(which==0)
+    which=3;
+
+  notations=sig_to_notation(sig);
+
+  /* There may be multiple notations in the same sig. */
+  for(nd=notations;nd;nd=nd->next)
+    {
+      if(mode!=2)
+       {
+         int has_at=!!strchr(nd->name,'@');
+
+         if((which&1 && !has_at) || (which&2 && has_at))
+           {
+             int i;
+             const char *str;
+
+             for(i=0;i<indent;i++)
+               putchar(' ');
+
+             if(nd->flags.critical)
+               str=_("Critical signature notation: ");
+             else
+               str=_("Signature notation: ");
+             if(mode)
+               log_info("%s",str);
+             else
+               printf("%s",str);
+             /* This is all UTF8 */
+             print_utf8_string(fp,nd->name,strlen(nd->name));
+             fprintf(fp,"=");
+             print_utf8_string(fp,nd->value,strlen(nd->value));
+             fprintf(fp,"\n");
+           }
+       }
+
+      if(mode)
+       {
+         write_status_buffer(STATUS_NOTATION_NAME,
+                             nd->name,strlen(nd->name),0);
+         write_status_buffer(STATUS_NOTATION_DATA,
+                             nd->value,strlen(nd->value),50);
+       }
+    }
+
+  free_notation(notations);
+}
+
+static void
+print_signature_stats(struct sig_stats *s)
+{
+  if( s->inv_sigs == 1 )
+    tty_printf(_("1 bad signature\n") );
+  else if( s->inv_sigs )
+    tty_printf(_("%d bad signatures\n"), s->inv_sigs );
+  if( s->no_key == 1 )
+    tty_printf(_("1 signature not checked due to a missing key\n") );
+  else if( s->no_key )
+    tty_printf(_("%d signatures not checked due to missing keys\n"),s->no_key);
+  if( s->oth_err == 1 )
+    tty_printf(_("1 signature not checked due to an error\n") );
+  else if( s->oth_err )
+    tty_printf(_("%d signatures not checked due to errors\n"), s->oth_err );
+}
+
+static void
+list_all( int secret )
+{
+    KEYDB_HANDLE hd;
+    KBNODE keyblock = NULL;
+    int rc=0;
+    const char *lastresname, *resname;
+    struct sig_stats stats;
+
+    memset(&stats,0,sizeof(stats));
+
+    hd = keydb_new (secret);
+    if (!hd)
+        rc = G10ERR_GENERAL;
+    else
+        rc = keydb_search_first (hd);
+    if( rc ) {
+       if( rc != -1 )
+           log_error("keydb_search_first failed: %s\n", g10_errstr(rc) );
+       goto leave;
+    }
+
+    lastresname = NULL;
+    do {
+        rc = keydb_get_keyblock (hd, &keyblock);
+        if (rc) {
+            log_error ("keydb_get_keyblock failed: %s\n", g10_errstr(rc));
+            goto leave;
+        }
+       if(!opt.with_colons)
+         {
+           resname = keydb_get_resource_name (hd);
+           if (lastresname != resname )
+             {
+               int i;
+
+               printf("%s\n", resname );
+               for(i=strlen(resname); i; i-- )
+                 putchar('-');
+               putchar('\n');
+               lastresname = resname;
+             }
+         }
+        merge_keys_and_selfsig( keyblock );
+       list_keyblock( keyblock, secret, opt.fingerprint,
+                      opt.check_sigs?&stats:NULL);
+       release_kbnode( keyblock ); 
+        keyblock = NULL;
+    } while (!(rc = keydb_search_next (hd)));
+    if( rc && rc != -1 )
+       log_error ("keydb_search_next failed: %s\n", g10_errstr(rc));
+
+    if(opt.check_sigs && !opt.with_colons)
+      print_signature_stats(&stats);
+
+  leave:
+    release_kbnode (keyblock);
+    keydb_release (hd);
+}
+
+
+static void
+list_one( STRLIST names, int secret )
+{
+    int rc = 0;
+    KBNODE keyblock = NULL;
+    GETKEY_CTX ctx;
+    const char *resname;
+    const char *keyring_str = _("Keyring");
+    int i;
+    struct sig_stats stats;
+
+    memset(&stats,0,sizeof(stats));
+
+    /* fixme: using the bynames function has the disadvantage that we
+     * don't know wether one of the names given was not found.  OTOH,
+     * this function has the advantage to list the names in the
+     * sequence as defined by the keyDB and does not duplicate
+     * outputs.  A solution could be do test whether all given have
+     * been listed (this needs a way to use the keyDB search
+     * functions) or to have the search function return indicators for
+     * found names.  Yet another way is to use the keydb search
+     * facilities directly. */
+    if( secret ) {
+       rc = get_seckey_bynames( &ctx, NULL, names, &keyblock );
+       if( rc ) {
+           log_error("error reading key: %s\n",  g10_errstr(rc) );
+           get_seckey_end( ctx );
+           return;
+       }
+       do {
+           if ((opt.list_options&LIST_SHOW_KEYRING) && !opt.with_colons) {
+               resname = keydb_get_resource_name (get_ctx_handle(ctx));
+               printf("%s: %s\n", keyring_str, resname);
+               for(i = strlen(resname) + strlen(keyring_str) + 2; i; i-- )
+                   putchar('-');
+               putchar('\n');
+           }
+           list_keyblock( keyblock, 1, opt.fingerprint, NULL );
+           release_kbnode( keyblock );
+       } while( !get_seckey_next( ctx, NULL, &keyblock ) );
+       get_seckey_end( ctx );
+    }
+    else {
+       rc = get_pubkey_bynames( &ctx, NULL, names, &keyblock );
+       if( rc ) {
+           log_error("error reading key: %s\n", g10_errstr(rc) );
+           get_pubkey_end( ctx );
+           return;
+       }
+       do {
+         if ((opt.list_options&LIST_SHOW_KEYRING) && !opt.with_colons) {
+               resname = keydb_get_resource_name (get_ctx_handle(ctx));
+               printf("%s: %s\n", keyring_str, resname);
+               for(i = strlen(resname) + strlen(keyring_str) + 2; i; i-- )
+                   putchar('-');
+               putchar('\n');
+           }
+           list_keyblock( keyblock, 0, opt.fingerprint,
+                          opt.check_sigs?&stats:NULL );
+           release_kbnode( keyblock );
+       } while( !get_pubkey_next( ctx, NULL, &keyblock ) );
+       get_pubkey_end( ctx );
+    }
+
+    if(opt.check_sigs && !opt.with_colons)
+      print_signature_stats(&stats);
+}
+
+static void
+print_key_data( PKT_public_key *pk )
+{
+    int n = pk ? pubkey_get_npkey( pk->pubkey_algo ) : 0;
+    int i;
+
+    for(i=0; i < n; i++ ) {
+       printf("pkd:%d:%u:", i, mpi_get_nbits( pk->pkey[i] ) );
+       mpi_print(stdout, pk->pkey[i], 1 );
+       putchar(':');
+       putchar('\n');
+    }
+}
+
+static void
+print_capabilities (PKT_public_key *pk, PKT_secret_key *sk, KBNODE keyblock)
+{
+  if(pk || (sk && sk->protect.s2k.mode!=1001))
+    {
+      unsigned int use = pk? pk->pubkey_usage : sk->pubkey_usage;
+    
+      if ( use & PUBKEY_USAGE_ENC )
+        putchar ('e');
+
+      if ( use & PUBKEY_USAGE_SIG )
+       {
+         putchar ('s');
+         if( pk? pk->is_primary : sk->is_primary )
+           putchar ('c');
+       }
+
+      if ( (use & PUBKEY_USAGE_AUTH) )
+        putchar ('a');
+    }
+
+    if ( keyblock ) { /* figure out the usable capabilities */
+        KBNODE k;
+        int enc=0, sign=0, cert=0, auth=0, disabled=0;
+
+        for (k=keyblock; k; k = k->next ) {
+            if ( k->pkt->pkttype == PKT_PUBLIC_KEY 
+                 || k->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+                pk = k->pkt->pkt.public_key;
+
+               if(pk->is_primary)
+                 disabled=pk_is_disabled(pk);
+
+                if ( pk->is_valid && !pk->is_revoked && !pk->has_expired ) {
+                    if ( pk->pubkey_usage & PUBKEY_USAGE_ENC )
+                        enc = 1;
+                    if ( pk->pubkey_usage & PUBKEY_USAGE_SIG )
+                     {
+                       sign = 1;
+                       if(pk->is_primary)
+                         cert = 1;
+                     }
+                    if ( (pk->pubkey_usage & PUBKEY_USAGE_AUTH) )
+                      auth = 1;
+                }
+            }
+            else if ( k->pkt->pkttype == PKT_SECRET_KEY 
+                      || k->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                sk = k->pkt->pkt.secret_key;
+                if ( sk->is_valid && !sk->is_revoked && !sk->has_expired
+                    && sk->protect.s2k.mode!=1001 ) {
+                    if ( sk->pubkey_usage & PUBKEY_USAGE_ENC )
+                        enc = 1;
+                    if ( sk->pubkey_usage & PUBKEY_USAGE_SIG )
+                     {
+                       sign = 1;
+                       if(sk->is_primary)
+                         cert = 1;
+                     }
+                    if ( (sk->pubkey_usage & PUBKEY_USAGE_AUTH) )
+                        auth = 1;
+                }
+            }
+        }
+        if (enc)
+            putchar ('E');
+        if (sign)
+            putchar ('S');
+        if (cert)
+            putchar ('C');
+        if (auth)
+            putchar ('A');
+        if (disabled)
+            putchar ('D');
+    }
+
+    putchar(':');
+}
+
+/* Flags = 0x01 hashed 0x02 critical */
+static void
+print_one_subpacket(sigsubpkttype_t type,size_t len,int flags,const byte *buf)
+{
+  size_t i;
+
+  printf("spk:%d:%u:%u:",type,flags,(unsigned int)len);
+
+  for(i=0;i<len;i++)
+    {
+      /* printable ascii other than : and % */
+      if(buf[i]>=32 && buf[i]<=126 && buf[i]!=':' && buf[i]!='%')
+       printf("%c",buf[i]);
+      else
+       printf("%%%02X",buf[i]);
+    }
+
+  printf("\n");
+}
+
+void
+print_subpackets_colon(PKT_signature *sig)
+{
+  byte *i;
+
+  assert(opt.show_subpackets);
+
+  for(i=opt.show_subpackets;*i;i++)
+    {
+      const byte *p;
+      size_t len;
+      int seq,crit;
+
+      seq=0;
+
+      while((p=enum_sig_subpkt(sig->hashed,*i,&len,&seq,&crit)))
+       print_one_subpacket(*i,len,0x01|(crit?0x02:0),p);
+
+      seq=0;
+
+      while((p=enum_sig_subpkt(sig->unhashed,*i,&len,&seq,&crit)))
+       print_one_subpacket(*i,len,0x00|(crit?0x02:0),p);
+    }
+}
+
+void
+dump_attribs(const PKT_user_id *uid,PKT_public_key *pk,PKT_secret_key *sk)
+{
+  int i;
+
+  if(!attrib_fp)
+    return;
+
+  for(i=0;i<uid->numattribs;i++)
+    {
+      if(is_status_enabled())
+       {
+         byte array[MAX_FINGERPRINT_LEN], *p;
+         char buf[(MAX_FINGERPRINT_LEN*2)+90];
+         size_t j,n;
+
+         if(pk)
+           fingerprint_from_pk( pk, array, &n );
+         else if(sk)
+           fingerprint_from_sk( sk, array, &n );
+         else
+           BUG();
+
+         p = array;
+         for(j=0; j < n ; j++, p++ )
+           sprintf(buf+2*j, "%02X", *p );
+
+         sprintf(buf+strlen(buf)," %lu %u %u %u %lu %lu %u",
+                 (ulong)uid->attribs[i].len,uid->attribs[i].type,i+1,
+                 uid->numattribs,(ulong)uid->created,(ulong)uid->expiredate,
+                 ((uid->is_primary?0x01:0)|
+                  (uid->is_revoked?0x02:0)|
+                  (uid->is_expired?0x04:0)));
+         write_status_text(STATUS_ATTRIBUTE,buf);
+       }
+
+      fwrite(uid->attribs[i].data,uid->attribs[i].len,1,attrib_fp);
+    }
+}
+
+static void
+list_keyblock_print ( KBNODE keyblock, int secret, int fpr, void *opaque )
+{
+    int rc = 0;
+    KBNODE kbctx;
+    KBNODE node;
+    PKT_public_key *pk;
+    PKT_secret_key *sk;
+    struct sig_stats *stats=opaque;
+    int skip_sigs=0;
+
+    /* get the keyid from the keyblock */
+    node = find_kbnode( keyblock, secret? PKT_SECRET_KEY : PKT_PUBLIC_KEY );
+    if( !node ) {
+       log_error("Oops; key lost!\n");
+       dump_kbnode( keyblock );
+       return;
+    }
+
+    if( secret )
+      {
+       pk = NULL;
+       sk = node->pkt->pkt.secret_key;
+
+        printf("sec%c  %4u%c/%s %s",(sk->protect.s2k.mode==1001)?'#':
+              (sk->protect.s2k.mode==1002)?'>':' ',
+              nbits_from_sk( sk ),pubkey_letter( sk->pubkey_algo ),
+              keystr_from_sk(sk),datestr_from_sk( sk ));
+
+       if(sk->has_expired)
+         {
+           printf(" [");
+           printf(_("expired: %s"),expirestr_from_sk(sk));
+           printf("]");
+         }
+       else if(sk->expiredate )
+         {
+           printf(" [");
+           printf(_("expires: %s"),expirestr_from_sk(sk));
+           printf("]");
+         }
+
+       printf("\n");
+      }
+    else
+      {
+       pk = node->pkt->pkt.public_key;
+       sk = NULL;
+
+       check_trustdb_stale();
+
+       printf("pub   %4u%c/%s %s",
+              nbits_from_pk(pk),pubkey_letter(pk->pubkey_algo),
+              keystr_from_pk(pk),datestr_from_pk( pk ));
+
+       /* We didn't include this before in the key listing, but there
+          is room in the new format, so why not? */
+
+       if(pk->is_revoked)
+         {
+           printf(" [");
+           printf(_("revoked: %s"),revokestr_from_pk(pk));
+           printf("]");
+         }
+       else if(pk->has_expired)
+         {
+           printf(" [");
+           printf(_("expired: %s"),expirestr_from_pk(pk));
+           printf("]");
+         }
+       else if(pk->expiredate)
+         {
+           printf(" [");
+           printf(_("expires: %s"),expirestr_from_pk(pk));
+           printf("]");
+         }
+
+#if 0
+       /* I need to think about this some more.  It's easy enough to
+          include, but it looks sort of confusing in the
+          listing... */
+       if(opt.list_options&LIST_SHOW_VALIDITY)
+         {
+           int validity=get_validity(pk,NULL);
+           printf(" [%s]",trust_value_to_string(validity));
+         }
+#endif
+
+       printf("\n");
+      }
+
+    if( fpr )
+      print_fingerprint( pk, sk, 0 );
+    print_card_serialno (sk);
+    if( opt.with_key_data )
+      print_key_data( pk );
+
+    for( kbctx=NULL; (node=walk_kbnode( keyblock, &kbctx, 0)) ; ) {
+       if( node->pkt->pkttype == PKT_USER_ID && !opt.fast_list_mode ) {
+           PKT_user_id *uid=node->pkt->pkt.user_id;
+
+           if(pk && (uid->is_expired || uid->is_revoked)
+              && !(opt.list_options&LIST_SHOW_UNUSABLE_UIDS))
+             {
+               skip_sigs=1;
+               continue;
+             }
+           else
+             skip_sigs=0;
+
+           if(attrib_fp && uid->attrib_data!=NULL)
+             dump_attribs(uid,pk,sk);
+
+           if((uid->is_revoked || uid->is_expired)
+              || ((opt.list_options&LIST_SHOW_UID_VALIDITY) && pk))
+             {
+               const char *validity;
+               int indent;
+
+               validity=uid_trust_string_fixed(pk,uid);
+               indent=(keystrlen()+9)-atoi(uid_trust_string_fixed(NULL,NULL));
+
+               if(indent<0 || indent>40)
+                 indent=0;
+
+               printf("uid%*s%s ",indent,"",validity);
+             }
+           else
+             printf("uid%*s", (int)keystrlen()+10,"");
+
+            print_utf8_string( stdout, uid->name, uid->len );
+           putchar('\n');
+
+           if((opt.list_options&LIST_SHOW_PHOTOS) && uid->attribs!=NULL)
+             show_photos(uid->attribs,uid->numattribs,pk,sk);
+       }
+       else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+         {
+           PKT_public_key *pk2 = node->pkt->pkt.public_key;
+
+           if((pk2->is_revoked || pk2->has_expired)
+              && !(opt.list_options&LIST_SHOW_UNUSABLE_SUBKEYS))
+             {
+               skip_sigs=1;
+               continue;
+             }
+           else
+             skip_sigs=0;
+
+            printf("sub   %4u%c/%s %s",
+                  nbits_from_pk( pk2 ),pubkey_letter( pk2->pubkey_algo ),
+                  keystr_from_pk(pk2),datestr_from_pk(pk2));
+           if( pk2->is_revoked )
+             {
+               printf(" [");
+               printf(_("revoked: %s"),revokestr_from_pk(pk2));
+               printf("]");
+             }
+           else if( pk2->has_expired )
+             {
+               printf(" [");
+               printf(_("expired: %s"),expirestr_from_pk(pk2));
+               printf("]");
+             }
+           else if( pk2->expiredate )
+             {
+               printf(" [");
+               printf(_("expires: %s"),expirestr_from_pk(pk2));
+               printf("]");
+             }
+            putchar('\n');
+           if( fpr > 1 )
+             print_fingerprint( pk2, NULL, 0 );
+           if( opt.with_key_data )
+             print_key_data( pk2 );
+         }
+       else if( node->pkt->pkttype == PKT_SECRET_SUBKEY )
+         {
+           PKT_secret_key *sk2 = node->pkt->pkt.secret_key;
+
+            printf("ssb%c  %4u%c/%s %s",
+                   (sk2->protect.s2k.mode==1001)?'#':
+                   (sk2->protect.s2k.mode==1002)?'>':' ',
+                  nbits_from_sk( sk2 ),pubkey_letter( sk2->pubkey_algo ),
+                  keystr_from_sk(sk2),datestr_from_sk( sk2 ) );
+            if( sk2->expiredate )
+             {
+               printf(" [");
+               printf(_("expires: %s"),expirestr_from_sk(sk2));
+               printf("]");
+             }
+           putchar('\n');
+           if( fpr > 1 )
+              {
+                print_fingerprint( NULL, sk2, 0 );
+                print_card_serialno (sk2);
+              }
+         }
+       else if( opt.list_sigs
+                && node->pkt->pkttype == PKT_SIGNATURE
+                && !skip_sigs ) {
+           PKT_signature *sig = node->pkt->pkt.signature;
+           int sigrc;
+            char *sigstr;
+
+           if( stats ) {
+                /*fflush(stdout);*/
+               rc = check_key_signature( keyblock, node, NULL );
+               switch( rc ) {
+                case 0:                 sigrc = '!'; break;
+                case G10ERR_BAD_SIGN:   stats->inv_sigs++; sigrc = '-'; break;
+                case G10ERR_NO_PUBKEY: 
+                case G10ERR_UNU_PUBKEY: stats->no_key++; continue;
+                default:                stats->oth_err++; sigrc = '%'; break;
+               }
+
+               /* TODO: Make sure a cached sig record here still has
+                   the pk that issued it.  See also
+                   keyedit.c:print_and_check_one_sig */
+           }
+           else {
+               rc = 0;
+               sigrc = ' ';
+           }
+
+           if( sig->sig_class == 0x20 || sig->sig_class == 0x28
+                                      || sig->sig_class == 0x30 )
+              sigstr = "rev";
+           else if( (sig->sig_class&~3) == 0x10 )
+              sigstr = "sig";
+           else if( sig->sig_class == 0x18 )
+              sigstr = "sig";
+           else if( sig->sig_class == 0x1F )
+              sigstr = "sig";
+           else {
+                printf("sig                             "
+                      "[unexpected signature class 0x%02x]\n",sig->sig_class );
+               continue;
+           }
+
+            fputs( sigstr, stdout );
+           printf("%c%c %c%c%c%c%c%c %s %s",
+                   sigrc,(sig->sig_class-0x10>0 &&
+                          sig->sig_class-0x10<4)?'0'+sig->sig_class-0x10:' ',
+                   sig->flags.exportable?' ':'L',
+                   sig->flags.revocable?' ':'R',
+                   sig->flags.policy_url?'P':' ',
+                   sig->flags.notation?'N':' ',
+                   sig->flags.expired?'X':' ',
+                  (sig->trust_depth>9)?'T':
+                  (sig->trust_depth>0)?'0'+sig->trust_depth:' ',
+                  keystr(sig->keyid),datestr_from_sig(sig));
+           if(opt.list_options&LIST_SHOW_SIG_EXPIRE)
+             printf(" %s", expirestr_from_sig(sig));
+           printf("  ");
+           if( sigrc == '%' )
+               printf("[%s] ", g10_errstr(rc) );
+           else if( sigrc == '?' )
+               ;
+           else if ( !opt.fast_list_mode ) {
+               size_t n;
+               char *p = get_user_id( sig->keyid, &n );
+                print_utf8_string( stdout, p, n );
+               xfree(p);
+           }
+           putchar('\n');
+
+           if(sig->flags.policy_url
+              && (opt.list_options&LIST_SHOW_POLICY_URLS))
+             show_policy_url(sig,3,0);
+
+           if(sig->flags.notation && (opt.list_options&LIST_SHOW_NOTATIONS))
+             show_notation(sig,3,0,
+                           ((opt.list_options&LIST_SHOW_STD_NOTATIONS)?1:0)+
+                           ((opt.list_options&LIST_SHOW_USER_NOTATIONS)?2:0));
+
+           if(sig->flags.pref_ks
+              && (opt.list_options&LIST_SHOW_KEYSERVER_URLS))
+             show_keyserver_url(sig,3,0);
+
+           /* fixme: check or list other sigs here */
+       }
+    }
+    putchar('\n');
+}
+
+void
+print_revokers(PKT_public_key *pk)
+{
+  /* print the revoker record */
+  if( !pk->revkey && pk->numrevkeys )
+    BUG();
+  else
+    {
+      int i,j;
+
+      for (i=0; i < pk->numrevkeys; i++)
+       {
+         byte *p;
+
+         printf ("rvk:::%d::::::", pk->revkey[i].algid);
+         p = pk->revkey[i].fpr;
+         for (j=0; j < 20; j++, p++ )
+           printf ("%02X", *p);
+         printf (":%02x%s:\n", pk->revkey[i].class,
+                 (pk->revkey[i].class&0x40)?"s":"");
+       }
+    }
+}
+
+static void
+list_keyblock_colon( KBNODE keyblock, int secret, int fpr )
+{
+    int rc = 0;
+    KBNODE kbctx;
+    KBNODE node;
+    PKT_public_key *pk;
+    PKT_secret_key *sk;
+    u32 keyid[2];
+    int any=0;
+    int trustletter = 0;
+    int ulti_hack = 0;
+    int i;
+
+    /* get the keyid from the keyblock */
+    node = find_kbnode( keyblock, secret? PKT_SECRET_KEY : PKT_PUBLIC_KEY );
+    if( !node ) {
+       log_error("Oops; key lost!\n");
+       dump_kbnode( keyblock );
+       return;
+    }
+
+    if( secret ) {
+       pk = NULL;
+       sk = node->pkt->pkt.secret_key;
+       keyid_from_sk( sk, keyid );
+        printf("sec::%u:%d:%08lX%08lX:%s:%s:::",
+                   nbits_from_sk( sk ),
+                   sk->pubkey_algo,
+                   (ulong)keyid[0],(ulong)keyid[1],
+                   colon_datestr_from_sk( sk ),
+                   colon_strtime (sk->expiredate)
+                   /* fixme: add LID here */ );
+    }
+    else {
+       pk = node->pkt->pkt.public_key;
+       sk = NULL;
+       keyid_from_pk( pk, keyid );
+        fputs( "pub:", stdout );
+        if ( !pk->is_valid )
+            putchar ('i');
+        else if ( pk->is_revoked )
+            putchar ('r');
+        else if ( pk->has_expired )
+            putchar ('e');
+        else if ( opt.fast_list_mode || opt.no_expensive_trust_checks ) 
+            ;
+        else {
+            trustletter = get_validity_info ( pk, NULL );
+            if( trustletter == 'u' )
+                ulti_hack = 1;
+            putchar(trustletter);
+        }
+        printf(":%u:%d:%08lX%08lX:%s:%s::",
+                   nbits_from_pk( pk ),
+                   pk->pubkey_algo,
+                   (ulong)keyid[0],(ulong)keyid[1],
+                   colon_datestr_from_pk( pk ),
+                   colon_strtime (pk->expiredate) );
+        if( !opt.fast_list_mode && !opt.no_expensive_trust_checks  )
+            putchar( get_ownertrust_info(pk) );
+           putchar(':');
+    }
+
+    if (opt.fixed_list_mode) {
+        /* do not merge the first uid with the primary key */
+        putchar(':');
+        putchar(':');
+        print_capabilities (pk, sk, keyblock);
+        if (secret) {
+          putchar(':'); /* End of field 13. */
+          putchar(':'); /* End of field 14. */
+          if (sk->protect.s2k.mode == 1001)
+            putchar('#'); /* Key is just a stub. */
+          else if (sk->protect.s2k.mode == 1002) {
+            /* Key is stored on an external token (card) or handled by
+               the gpg-agent.  Print the serial number of that token
+               here. */
+            for (i=0; i < sk->protect.ivlen; i++)
+              printf ("%02X", sk->protect.iv[i]);
+          }
+          putchar(':'); /* End of field 15. */
+        }
+        putchar('\n');
+       if(pk)
+         print_revokers(pk);
+        if( fpr )
+            print_fingerprint( pk, sk, 0 );
+        if( opt.with_key_data )
+            print_key_data( pk );
+        any = 1;
+    }
+
+    for( kbctx=NULL; (node=walk_kbnode( keyblock, &kbctx, 0)) ; ) {
+       if( node->pkt->pkttype == PKT_USER_ID && !opt.fast_list_mode ) {
+           PKT_user_id *uid=node->pkt->pkt.user_id;
+           if(attrib_fp && node->pkt->pkt.user_id->attrib_data!=NULL)
+             dump_attribs(node->pkt->pkt.user_id,pk,sk);
+            /*
+             * Fixme: We need a is_valid flag here too 
+             */
+           if( any ) {
+               char *str=uid->attrib_data?"uat":"uid";
+               /* If we're listing a secret key, leave out the
+                  validity values for now.  This is handled better in
+                  1.9. */
+               if ( sk )
+                   printf("%s:::::",str);
+                else if ( uid->is_revoked )
+                   printf("%s:r::::",str);
+                else if ( uid->is_expired )
+                   printf("%s:e::::",str);
+               else if ( opt.no_expensive_trust_checks )
+                   printf("%s:::::",str);
+                else {
+                   int uid_validity;
+
+                   if( pk && !ulti_hack )
+                     uid_validity=get_validity_info (pk, uid);
+                   else
+                       uid_validity = 'u';
+                   printf("%s:%c::::",str,uid_validity);
+                }
+
+               printf("%s:",colon_strtime(uid->created));
+               printf("%s:",colon_strtime(uid->expiredate));
+
+               namehash_from_uid(uid);
+
+               for(i=0; i < 20; i++ )
+                 printf("%02X",uid->namehash[i]);
+
+               printf("::");
+           }
+           if(uid->attrib_data)
+             printf("%u %lu",uid->numattribs,uid->attrib_len);
+            else
+             print_string(stdout,uid->name,uid->len, ':' );
+            putchar(':');
+           if (any)
+                putchar('\n');
+            else {
+                putchar(':');
+                print_capabilities (pk, sk, keyblock);
+                putchar('\n');
+               if( fpr )
+                   print_fingerprint( pk, sk, 0 );
+               if( opt.with_key_data )
+                   print_key_data( pk );
+               any = 1;
+           }
+       }
+       else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+           u32 keyid2[2];
+           PKT_public_key *pk2 = node->pkt->pkt.public_key;
+
+           if( !any ) {
+                putchar(':');
+                putchar(':');
+                print_capabilities (pk, sk, keyblock);
+                putchar('\n');
+               if( fpr )
+                   print_fingerprint( pk, sk, 0 ); /* of the main key */
+               any = 1;
+           }
+
+           keyid_from_pk( pk2, keyid2 );
+            fputs ("sub:", stdout );
+            if ( !pk2->is_valid )
+                putchar ('i');
+            else if ( pk2->is_revoked )
+                putchar ('r');
+            else if ( pk2->has_expired )
+                putchar ('e');
+            else if ( opt.fast_list_mode || opt.no_expensive_trust_checks )
+                ;
+            else {
+               /* trustletter should always be defined here */
+               if(trustletter)
+                 printf("%c", trustletter );
+            }
+            printf(":%u:%d:%08lX%08lX:%s:%s:::::",
+                       nbits_from_pk( pk2 ),
+                       pk2->pubkey_algo,
+                       (ulong)keyid2[0],(ulong)keyid2[1],
+                       colon_datestr_from_pk( pk2 ),
+                       colon_strtime (pk2->expiredate)
+                       /* fixme: add LID and ownertrust here */
+                                               );
+            print_capabilities (pk2, NULL, NULL);
+            putchar('\n');
+           if( fpr > 1 )
+               print_fingerprint( pk2, NULL, 0 );
+           if( opt.with_key_data )
+               print_key_data( pk2 );
+       }
+       else if( node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+           u32 keyid2[2];
+           PKT_secret_key *sk2 = node->pkt->pkt.secret_key;
+
+           if( !any ) {
+                putchar(':');
+                putchar(':');
+                print_capabilities (pk, sk, keyblock);
+               putchar('\n');
+               if( fpr )
+                   print_fingerprint( pk, sk, 0 ); /* of the main key */
+               any = 1;
+           }
+
+           keyid_from_sk( sk2, keyid2 );
+            printf("ssb::%u:%d:%08lX%08lX:%s:%s:::::",
+                       nbits_from_sk( sk2 ),
+                       sk2->pubkey_algo,
+                       (ulong)keyid2[0],(ulong)keyid2[1],
+                       colon_datestr_from_sk( sk2 ),
+                       colon_strtime (sk2->expiredate)
+                   /* fixme: add LID */ );
+            print_capabilities (NULL, sk2, NULL);
+            if (opt.fixed_list_mode) {
+              /* We print the serial number only in fixed list mode
+                 for the primary key so, so avoid questions we print
+                 it for subkeys also only in this mode.  There is no
+                 technical reason, though. */
+              putchar(':'); /* End of field 13. */
+              putchar(':'); /* End of field 14. */
+              if (sk2->protect.s2k.mode == 1001)
+                putchar('#'); /* Key is just a stub. */
+              else if (sk2->protect.s2k.mode == 1002) {
+                /* Key is stored on an external token (card) or handled by
+                   the gpg-agent.  Print the serial number of that token
+                   here. */
+                for (i=0; i < sk2->protect.ivlen; i++)
+                  printf ("%02X", sk2->protect.iv[i]);
+              }
+              putchar(':'); /* End of field 15. */
+            }
+            putchar ('\n');
+           if( fpr > 1 )
+              print_fingerprint( NULL, sk2, 0 );
+       }
+       else if( opt.list_sigs && node->pkt->pkttype == PKT_SIGNATURE ) {
+           PKT_signature *sig = node->pkt->pkt.signature;
+           int sigrc,fprokay=0;
+            char *sigstr;
+           size_t fplen;
+           byte fparray[MAX_FINGERPRINT_LEN];
+
+           if( !any ) { /* no user id, (maybe a revocation follows)*/
+               if( sig->sig_class == 0x20 )
+                   fputs("[revoked]:", stdout);
+               else if( sig->sig_class == 0x18 )
+                   fputs("[key binding]:", stdout);
+               else if( sig->sig_class == 0x28 )
+                   fputs("[subkey revoked]:", stdout);
+                else
+                    putchar (':');
+                putchar(':');
+                print_capabilities (pk, sk, keyblock);
+                putchar('\n');
+               if( fpr )
+                   print_fingerprint( pk, sk, 0 );
+               any=1;
+           }
+
+           if( sig->sig_class == 0x20 || sig->sig_class == 0x28
+                                      || sig->sig_class == 0x30 )
+              sigstr = "rev";
+           else if( (sig->sig_class&~3) == 0x10 )
+              sigstr = "sig";
+           else if( sig->sig_class == 0x18 )
+              sigstr = "sig";
+           else if( sig->sig_class == 0x1F )
+              sigstr = "sig";
+           else {
+                printf ("sig::::::::::%02x%c:\n",
+                        sig->sig_class, sig->flags.exportable?'x':'l');
+               continue;
+           }
+           if( opt.check_sigs ) {
+               PKT_public_key *signer_pk=NULL;
+
+               fflush(stdout);
+               if(opt.no_sig_cache)
+                 signer_pk=xmalloc_clear(sizeof(PKT_public_key));
+
+               rc = check_key_signature2( keyblock, node, NULL, signer_pk,
+                                          NULL, NULL, NULL );
+               switch( rc ) {
+                 case 0:                  sigrc = '!'; break;
+                 case G10ERR_BAD_SIGN:    sigrc = '-'; break;
+                 case G10ERR_NO_PUBKEY: 
+                 case G10ERR_UNU_PUBKEY:  sigrc = '?'; break;
+                 default:                 sigrc = '%'; break;
+               }
+
+               if(opt.no_sig_cache)
+                 {
+                   if(rc==0)
+                     {
+                       fingerprint_from_pk (signer_pk, fparray, &fplen);
+                       fprokay=1;
+                     }
+                   free_public_key(signer_pk);
+                 }
+           }
+           else {
+               rc = 0;
+               sigrc = ' ';
+           }
+            fputs( sigstr, stdout );
+            putchar(':');
+            if( sigrc != ' ' )
+                putchar(sigrc);
+            printf("::%d:%08lX%08lX:%s:%s:", sig->pubkey_algo,
+                  (ulong)sig->keyid[0], (ulong)sig->keyid[1],
+                  colon_datestr_from_sig(sig),
+                  colon_expirestr_from_sig(sig));
+
+           if(sig->trust_depth || sig->trust_value)
+             printf("%d %d",sig->trust_depth,sig->trust_value);
+           printf(":");
+
+           if(sig->trust_regexp)
+             print_string(stdout,sig->trust_regexp,
+                          strlen(sig->trust_regexp),':');
+           printf(":");
+
+           if( sigrc == '%' )
+               printf("[%s] ", g10_errstr(rc) );
+           else if( sigrc == '?' )
+               ;
+           else if ( !opt.fast_list_mode ) {
+               size_t n;
+               char *p = get_user_id( sig->keyid, &n );
+                print_string( stdout, p, n, ':' );
+               xfree(p);
+           }
+            printf(":%02x%c:", sig->sig_class,sig->flags.exportable?'x':'l');
+
+           if(opt.no_sig_cache && opt.check_sigs && fprokay)
+             {
+               printf(":");
+
+               for (i=0; i < fplen ; i++ )
+                 printf ("%02X", fparray[i] );
+
+               printf(":");
+             }
+
+           printf("\n");
+
+           if(opt.show_subpackets)
+             print_subpackets_colon(sig);
+
+           /* fixme: check or list other sigs here */
+       }
+    }
+    if( !any ) {/* oops, no user id */
+        putchar(':');
+        putchar(':');
+        print_capabilities (pk, sk, keyblock);
+       putchar('\n');
+    }
+}
+
+/*
+ * Reorder the keyblock so that the primary user ID (and not attribute
+ * packet) comes first.  Fixme: Replace this by a generic sort
+ * function.  */
+static void
+do_reorder_keyblock (KBNODE keyblock,int attr)
+{
+    KBNODE primary = NULL, primary0 = NULL, primary2 = NULL;
+    KBNODE last, node;
+
+    for (node=keyblock; node; primary0=node, node = node->next) {
+       if( node->pkt->pkttype == PKT_USER_ID &&
+           ((attr && node->pkt->pkt.user_id->attrib_data) ||
+            (!attr && !node->pkt->pkt.user_id->attrib_data)) &&
+            node->pkt->pkt.user_id->is_primary ) {
+            primary = primary2 = node;
+            for (node=node->next; node; primary2=node, node = node->next ) {
+                if( node->pkt->pkttype == PKT_USER_ID 
+                    || node->pkt->pkttype == PKT_PUBLIC_SUBKEY 
+                    || node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                    break;
+                }
+            }
+            break;
+        }
+    }
+    if ( !primary )
+        return;  /* no primary key flag found (should not happen) */
+
+    for (last=NULL, node=keyblock; node; last = node, node = node->next) {
+       if( node->pkt->pkttype == PKT_USER_ID )
+            break;
+    }
+    assert (node);
+    assert (last); /* the user ID is never the first packet */
+    assert (primary0);  /* ditto (this is the node before primary) */
+    if ( node == primary )
+        return; /* already the first one */
+
+    last->next = primary;
+    primary0->next = primary2->next;
+    primary2->next = node;
+}
+
+void
+reorder_keyblock (KBNODE keyblock)
+{
+  do_reorder_keyblock(keyblock,1);
+  do_reorder_keyblock(keyblock,0);
+}
+
+void
+list_keyblock( KBNODE keyblock, int secret, int fpr, void *opaque )
+{
+    reorder_keyblock (keyblock);
+    if (opt.with_colons)
+        list_keyblock_colon (keyblock, secret, fpr );
+    else
+        list_keyblock_print (keyblock, secret, fpr, opaque );
+}
+
+/*
+ * standard function to print the finperprint.
+ * mode 0: as used in key listings, opt.with_colons is honored
+ *      1: print using log_info ()
+ *      2: direct use of tty
+ *      3: direct use of tty but only primary key.
+ * modes 1 and 2 will try and print both subkey and primary key fingerprints
+ */
+void
+print_fingerprint (PKT_public_key *pk, PKT_secret_key *sk, int mode )
+{
+    byte array[MAX_FINGERPRINT_LEN], *p;
+    size_t i, n;
+    FILE *fp;
+    const char *text;
+    int primary=0;
+
+    if(sk)
+      {
+       if(sk->main_keyid[0]==sk->keyid[0] && sk->main_keyid[1]==sk->keyid[1])
+         primary=1;
+      }
+    else
+      {
+       if(pk->main_keyid[0]==pk->keyid[0] && pk->main_keyid[1]==pk->keyid[1])
+         primary=1;
+      }
+
+    /* Just to be safe */
+    if(mode&0x80 && !primary)
+      {
+       log_error("primary key is not really primary!\n");
+       return;
+      }
+
+    mode&=~0x80;
+
+    if(!primary && (mode==1 || mode==2))
+      {
+       if(sk)
+         {
+           PKT_secret_key *primary_sk=xmalloc_clear(sizeof(*primary_sk));
+           get_seckey(primary_sk,sk->main_keyid);
+           print_fingerprint(NULL,primary_sk,mode|0x80);
+           free_secret_key(primary_sk);
+         }
+       else
+         {
+           PKT_public_key *primary_pk=xmalloc_clear(sizeof(*primary_pk));
+           get_pubkey(primary_pk,pk->main_keyid);
+           print_fingerprint(primary_pk,NULL,mode|0x80);
+           free_public_key(primary_pk);
+         }
+      }
+
+    if (mode == 1) {
+        fp = log_stream ();
+       if(primary)
+         text = _("Primary key fingerprint:");
+       else
+         text = _("     Subkey fingerprint:");
+    }
+    else if (mode == 2) {
+        fp = NULL; /* use tty */
+       if(primary)
+          /* TRANSLATORS: this should fit into 24 bytes to that the
+           * fingerprint data is properly aligned with the user ID */
+         text = _(" Primary key fingerprint:");
+       else
+         text = _("      Subkey fingerprint:");
+    }
+    else if (mode == 3) {
+        fp = NULL; /* use tty */
+       text = _("      Key fingerprint =");
+    }
+    else {
+        fp = stdout;
+       text = _("      Key fingerprint =");
+    }
+  
+    if (sk)
+       fingerprint_from_sk (sk, array, &n);
+    else
+       fingerprint_from_pk (pk, array, &n);
+    p = array;
+    if (opt.with_colons && !mode) {
+       fprintf (fp, "fpr:::::::::");
+       for (i=0; i < n ; i++, p++ )
+           fprintf (fp, "%02X", *p );
+       putc(':', fp);
+    }
+    else {
+        if (fp)
+            fputs (text, fp);
+        else
+            tty_printf ("%s", text);
+       if (n == 20) {
+           for (i=0; i < n ; i++, i++, p += 2 ) {
+                if (fp) {
+                    if (i == 10 )
+                        putc(' ', fp);
+                    fprintf (fp, " %02X%02X", *p, p[1] );
+                }
+                else {
+                    if (i == 10 )
+                        tty_printf (" ");
+                    tty_printf (" %02X%02X", *p, p[1]);
+                }
+           }
+       }
+       else {
+           for (i=0; i < n ; i++, p++ ) {
+                if (fp) {
+                    if (i && !(i%8) )
+                        putc (' ', fp);
+                    fprintf (fp, " %02X", *p );
+                }
+                else {
+                    if (i && !(i%8) )
+                        tty_printf (" ");
+                    tty_printf (" %02X", *p );
+                }
+           }
+       }
+    }
+    if (fp)
+        putc ('\n', fp);
+    else
+        tty_printf ("\n");
+}
+
+/* Print the serial number of an OpenPGP card if available. */
+static void
+print_card_serialno (PKT_secret_key *sk)
+{
+  int i;
+
+  if (!sk)
+    return;
+  if (!sk->is_protected || sk->protect.s2k.mode != 1002) 
+    return; /* Not a card. */
+  if (opt.with_colons)
+    return; /* Handled elsewhere. */
+
+  fputs (_("      Card serial no. ="), stdout);
+  putchar (' ');
+  if (sk->protect.ivlen == 16
+      && !memcmp (sk->protect.iv, "\xD2\x76\x00\x01\x24\x01", 6) )
+    { /* This is an OpenPGP card. Just print the relevant part. */
+      for (i=8; i < 14; i++)
+        {
+          if (i == 10)
+            putchar (' ');
+          printf ("%02X", sk->protect.iv[i]);
+        }
+    }
+  else
+    { /* Something is wrong: Print all. */
+      for (i=0; i < sk->protect.ivlen; i++)
+        printf ("%02X", sk->protect.iv[i]);
+    }
+  putchar ('\n');
+}
+
+
+
+void set_attrib_fd(int fd)
+{
+  static int last_fd=-1;
+
+  if ( fd != -1 && last_fd == fd )
+    return;
+
+  if ( attrib_fp && attrib_fp != stdout && attrib_fp != stderr )
+    fclose (attrib_fp);
+  attrib_fp = NULL;
+  if ( fd == -1 ) 
+    return;
+
+  if( fd == 1 )
+    attrib_fp = stdout;
+  else if( fd == 2 )
+    attrib_fp = stderr;
+  else
+    attrib_fp = fdopen( fd, "wb" );
+  if( !attrib_fp ) {
+    log_fatal("can't open fd %d for attribute output: %s\n",
+             fd, strerror(errno));
+  }
+
+  last_fd = fd;
+}
diff --git a/g10/keyring.c b/g10/keyring.c
new file mode 100644 (file)
index 0000000..9ef5b1b
--- /dev/null
@@ -0,0 +1,1624 @@
+/* keyring.c - keyring file handling
+ * Copyright (C) 2001, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "util.h"
+#include "keyring.h"
+#include "packet.h"
+#include "keydb.h" 
+#include "options.h"
+#include "main.h" /*for check_key_signature()*/
+#include "i18n.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 {
+  struct keyring_name *next;
+  int secret;
+  DOTLOCK 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;
+
+
+struct keyring_handle {
+  CONST_KR_NAME resource;
+  int secret;             /* this is for a secret keyring */
+  struct {
+    CONST_KR_NAME kr;
+    IOBUF iobuf;
+    int eof;
+    int error;
+  } current;
+  struct {
+    CONST_KR_NAME kr; 
+    off_t offset;
+    size_t pk_no;
+    size_t uid_no;
+    unsigned int n_packets; /*used for delete and update*/
+  } found;
+  struct {
+    char *name;
+    char *pattern;
+  } word_match;
+};
+
+
+
+static int do_copy (int mode, const char *fname, KBNODE root, int secret,
+                    off_t start_offset, unsigned int n_packets );
+
+
+\f
+static struct off_item *
+new_offset_item (void)
+{
+  struct off_item *k;
+  
+  k = xmalloc_clear (sizeof *k);
+  return k;
+}
+
+#if 0
+static void
+release_offset_items (struct off_item *k)
+{
+  struct off_item *k2;
+
+  for (; k; k = k2)
+    {
+      k2 = k->next;
+      xfree (k);
+    }
+}
+#endif
+
+static OffsetHashTable 
+new_offset_hash_table (void)
+{
+  struct off_item **tbl;
+
+  tbl = xmalloc_clear (2048 * sizeof *tbl);
+  return tbl;
+}
+
+#if 0
+static void
+release_offset_hash_table (OffsetHashTable tbl)
+{
+  int i;
+
+  if (!tbl)
+    return;
+  for (i=0; i < 2048; i++)
+    release_offset_items (tbl[i]);
+  xfree (tbl);
+}
+#endif
+
+static struct off_item *
+lookup_offset_hash_table (OffsetHashTable tbl, u32 *kid)
+{
+  struct off_item *k;
+
+  for (k = tbl[(kid[1] & 0x07ff)]; k; k = k->next)
+    if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
+      return k;
+  return NULL;
+}
+
+static void
+update_offset_hash_table (OffsetHashTable tbl, u32 *kid, off_t off)
+{
+  struct off_item *k;
+
+  for (k = tbl[(kid[1] & 0x07ff)]; k; k = k->next)
+    {
+      if (k->kid[0] == kid[0] && k->kid[1] == kid[1]) 
+        {
+          /*k->off = off;*/
+          return;
+        }
+    }
+
+  k = new_offset_item ();
+  k->kid[0] = kid[0];
+  k->kid[1] = kid[1];
+  /*k->off = off;*/
+  k->next = tbl[(kid[1] & 0x07ff)];
+  tbl[(kid[1] & 0x07ff)] = k;
+}
+
+static void
+update_offset_hash_table_from_kb (OffsetHashTable tbl, KBNODE node, off_t off)
+{
+  for (; node; node = node->next)
+    {
+      if (node->pkt->pkttype == PKT_PUBLIC_KEY
+          || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        {
+          u32 aki[2];
+          keyid_from_pk (node->pkt->pkt.public_key, aki);
+          update_offset_hash_table (tbl, aki, off);
+        }
+    }
+}
+
+/* 
+ * 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
+ * pointer if it has already been registered.  The function returns 1
+ * if a new keyring was registered.
+*/
+int
+keyring_register_filename (const char *fname, int secret, void **ptr)
+{
+    KR_NAME kr;
+
+    if (active_handles)
+        BUG (); /* We don't allow that */
+
+    for (kr=kr_names; kr; kr = kr->next)
+      {
+        if ( !compare_filenames (kr->fname, fname) )
+         {
+            *ptr=kr;
+           return 0; /* already registered */
+         }
+      }
+
+    if (secret)
+      register_secured_file (fname);
+
+    kr = xmalloc (sizeof *kr + strlen (fname));
+    strcpy (kr->fname, fname);
+    kr->secret = !!secret;
+    kr->lockhd = NULL;
+    kr->is_locked = 0;
+    kr->did_full_scan = 0;
+    /* keep a list of all issued pointers */
+    kr->next = kr_names;
+    kr_names = kr;
+
+    /* create the offset table the first time a function here is used */
+    if (!kr_offtbl)
+      kr_offtbl = new_offset_hash_table ();
+
+    *ptr=kr;
+
+    return 1;
+}
+
+int
+keyring_is_writable (void *token)
+{
+  KR_NAME r = token;
+
+  return r? !access (r->fname, W_OK) : 0;
+}
+    
+
+\f
+/* Create a new handle for the resource associated with TOKEN.  SECRET
+   is just just as a cross-check.
+   
+   The returned handle must be released using keyring_release (). */
+KEYRING_HANDLE
+keyring_new (void *token, int secret)
+{
+  KEYRING_HANDLE hd;
+  KR_NAME resource = token;
+
+  assert (resource && !resource->secret == !secret);
+  
+  hd = xmalloc_clear (sizeof *hd);
+  hd->resource = resource;
+  hd->secret = !!secret;
+  active_handles++;
+  return hd;
+}
+
+void 
+keyring_release (KEYRING_HANDLE hd)
+{
+    if (!hd)
+        return;
+    assert (active_handles > 0);
+    active_handles--;
+    xfree (hd->word_match.name);
+    xfree (hd->word_match.pattern);
+    iobuf_close (hd->current.iobuf);
+    xfree (hd);
+}
+
+
+const char *
+keyring_get_resource_name (KEYRING_HANDLE hd)
+{
+    if (!hd || !hd->resource)
+      return NULL;
+    return hd->resource->fname;
+}
+
+
+/*
+ * Lock the keyring with the given handle, or unlok if yes is false.
+ * We ignore the handle and lock all registered files.
+ */
+int 
+keyring_lock (KEYRING_HANDLE hd, int yes)
+{
+    KR_NAME kr;
+    int rc = 0;
+
+    if (yes) {
+        /* first make sure the lock handles are created */
+        for (kr=kr_names; kr; kr = kr->next) {
+            if (!keyring_is_writable(kr))
+                continue;
+            if (!kr->lockhd) {
+                kr->lockhd = create_dotlock( kr->fname );
+                if (!kr->lockhd) {
+                    log_info ("can't allocate lock for `%s'\n", kr->fname );
+                    rc = G10ERR_GENERAL;
+                }
+            }
+        }
+        if (rc)
+            return rc;
+        
+        /* and now set the locks */
+        for (kr=kr_names; kr; kr = kr->next) {
+            if (!keyring_is_writable(kr))
+                continue;
+            if (kr->is_locked)
+                ;
+            else if (make_dotlock (kr->lockhd, -1) ) {
+                log_info ("can't lock `%s'\n", kr->fname );
+                rc = G10ERR_GENERAL;
+            }
+            else 
+                kr->is_locked = 1;
+        }
+    }
+
+    if (rc || !yes) {
+        for (kr=kr_names; kr; kr = kr->next) {
+            if (!keyring_is_writable(kr))
+                continue;
+            if (!kr->is_locked)
+                ;
+            else if (release_dotlock (kr->lockhd))
+                log_info ("can't unlock `%s'\n", kr->fname );
+            else 
+                kr->is_locked = 0;
+        }
+    } 
+
+    return rc;
+}
+
+
+\f
+/*
+ * Return the last found keyring.  Caller must free it.
+ * The returned keyblock has the kbode 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.
+ */
+int
+keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb)
+{
+    PACKET *pkt;
+    int rc;
+    KBNODE keyblock = NULL, node, lastnode;
+    IOBUF a;
+    int in_cert = 0;
+    int pk_no = 0;
+    int uid_no = 0;
+    int save_mode;
+
+    if (ret_kb)
+        *ret_kb = NULL;
+
+    if (!hd->found.kr)
+        return -1; /* no successful search */
+
+    a = iobuf_open (hd->found.kr->fname);
+    if (!a)
+      {
+       log_error(_("can't open `%s'\n"), hd->found.kr->fname);
+       return G10ERR_KEYRING_OPEN;
+      }
+
+    if (iobuf_seek (a, hd->found.offset) ) {
+        log_error ("can't seek `%s'\n", hd->found.kr->fname);
+       iobuf_close(a);
+       return G10ERR_KEYRING_OPEN;
+    }
+
+    pkt = xmalloc (sizeof *pkt);
+    init_packet (pkt);
+    hd->found.n_packets = 0;;
+    lastnode = NULL;
+    save_mode = set_packet_list_mode(0);
+    while ((rc=parse_packet (a, pkt)) != -1) {
+        hd->found.n_packets++;
+        if (rc == G10ERR_UNKNOWN_PACKET) {
+           free_packet (pkt);
+           init_packet (pkt);
+           continue;
+       }
+       if (rc) {  
+            log_error ("keyring_get_keyblock: read error: %s\n",
+                       g10_errstr(rc) );
+            rc = G10ERR_INV_KEYRING;
+            break;
+        }
+       if (pkt->pkttype == PKT_COMPRESSED) {
+           log_error ("skipped compressed packet in keyring\n");
+           free_packet(pkt);
+           init_packet(pkt);
+           continue;
+        }
+
+        if (in_cert && (pkt->pkttype == PKT_PUBLIC_KEY
+                        || pkt->pkttype == PKT_SECRET_KEY)) {
+            hd->found.n_packets--; /* fix counter */
+            break; /* ready */
+        }
+
+        in_cert = 1;
+        if (pkt->pkttype == PKT_RING_TRUST) {
+            /*(this code is duplicated after the loop)*/
+            if ( lastnode 
+                 && lastnode->pkt->pkttype == PKT_SIGNATURE
+                 && (pkt->pkt.ring_trust->sigcache & 1) ) {
+                /* this is a ring trust packet with a checked signature 
+                 * status cache following directly a signature paket.
+                 * Set the cache status into that signature packet */
+                PKT_signature *sig = lastnode->pkt->pkt.signature;
+                
+                sig->flags.checked = 1;
+                sig->flags.valid = !!(pkt->pkt.ring_trust->sigcache & 2);
+            }
+            /* reset lastnode, so that we set the cache status only from
+             * the ring trust packet immediately folling a signature */
+            lastnode = NULL;
+        }
+        else {
+            node = lastnode = new_kbnode (pkt);
+            if (!keyblock)
+                keyblock = node;
+            else
+                add_kbnode (keyblock, node);
+
+            if ( pkt->pkttype == PKT_PUBLIC_KEY
+                 || pkt->pkttype == PKT_PUBLIC_SUBKEY
+                 || pkt->pkttype == PKT_SECRET_KEY
+                 || pkt->pkttype == PKT_SECRET_SUBKEY) {
+                if (++pk_no == hd->found.pk_no)
+                    node->flag |= 1;
+            }
+            else if ( pkt->pkttype == PKT_USER_ID) {
+                if (++uid_no == hd->found.uid_no)
+                    node->flag |= 2;
+            }
+        }
+
+        pkt = xmalloc (sizeof *pkt);
+        init_packet(pkt);
+    }
+    set_packet_list_mode(save_mode);
+
+    if (rc == -1 && keyblock) 
+       rc = 0; /* got the entire keyblock */
+
+    if (rc || !ret_kb)
+       release_kbnode (keyblock);
+    else {
+        /*(duplicated form the loop body)*/
+        if ( pkt && pkt->pkttype == PKT_RING_TRUST
+             && lastnode 
+             && lastnode->pkt->pkttype == PKT_SIGNATURE
+             && (pkt->pkt.ring_trust->sigcache & 1) ) {
+            PKT_signature *sig = lastnode->pkt->pkt.signature;
+            sig->flags.checked = 1;
+            sig->flags.valid = !!(pkt->pkt.ring_trust->sigcache & 2);
+        }
+       *ret_kb = keyblock;
+    }
+    free_packet (pkt);
+    xfree (pkt);
+    iobuf_close(a);
+
+    /* Make sure that future search operations fail immediately when
+     * we know that we are working on a invalid keyring 
+     */
+    if (rc == G10ERR_INV_KEYRING)
+        hd->current.error = rc;
+
+    return rc;
+}
+
+int
+keyring_update_keyblock (KEYRING_HANDLE hd, KBNODE kb)
+{
+    int rc;
+
+    if (!hd->found.kr)
+        return -1; /* no successful prior search */
+
+    if (!hd->found.n_packets) {
+        /* need to know the number of packets - do a dummy get_keyblock*/
+        rc = keyring_get_keyblock (hd, NULL);
+        if (rc) {
+            log_error ("re-reading keyblock failed: %s\n", g10_errstr (rc));
+            return rc;
+        }
+        if (!hd->found.n_packets)
+            BUG ();
+    }
+
+    /* The open iobuf isn't needed anymore and in fact is a problem when
+       it comes to renaming the keyring files on some operating systems,
+       so close it here */
+    iobuf_close(hd->current.iobuf);
+    hd->current.iobuf = NULL;
+
+    /* do the update */
+    rc = do_copy (3, hd->found.kr->fname, kb, hd->secret,
+                  hd->found.offset, hd->found.n_packets );
+    if (!rc) {
+      if (!hd->secret && kr_offtbl)
+        {
+          update_offset_hash_table_from_kb (kr_offtbl, kb, 0);
+        }
+      /* better reset the found info */
+      hd->found.kr = NULL;
+      hd->found.offset = 0;
+    }
+    return rc;
+}
+
+int
+keyring_insert_keyblock (KEYRING_HANDLE hd, KBNODE kb)
+{
+    int rc;
+    const char *fname;
+
+    if (!hd)
+        fname = NULL;
+    else if (hd->found.kr)
+        fname = hd->found.kr->fname;
+    else if (hd->current.kr)
+        fname = hd->current.kr->fname;
+    else 
+        fname = hd->resource? hd->resource->fname:NULL;
+
+    if (!fname)
+        return G10ERR_GENERAL; 
+
+    /* close this one otherwise we will lose the position for
+     * a next search.  Fixme: it would be better to adjust the position
+     * after the write opertions.
+     */
+    iobuf_close (hd->current.iobuf);
+    hd->current.iobuf = NULL;
+
+    /* do the insert */
+    rc = do_copy (1, fname, kb, hd->secret, 0, 0 );
+    if (!rc && !hd->secret && kr_offtbl)
+      {
+        update_offset_hash_table_from_kb (kr_offtbl, kb, 0);
+      }
+      
+    return rc;
+}
+
+
+int
+keyring_delete_keyblock (KEYRING_HANDLE hd)
+{
+    int rc;
+
+    if (!hd->found.kr)
+        return -1; /* no successful prior search */
+
+    if (!hd->found.n_packets) {
+        /* need to know the number of packets - do a dummy get_keyblock*/
+        rc = keyring_get_keyblock (hd, NULL);
+        if (rc) {
+            log_error ("re-reading keyblock failed: %s\n", g10_errstr (rc));
+            return rc;
+        }
+        if (!hd->found.n_packets)
+            BUG ();
+    }
+
+    /* close this one otherwise we will lose the position for
+     * a next search.  Fixme: it would be better to adjust the position
+     * after the write opertions.
+     */
+    iobuf_close (hd->current.iobuf);
+    hd->current.iobuf = NULL;
+
+    /* do the delete */
+    rc = do_copy (2, hd->found.kr->fname, NULL, hd->secret,
+                  hd->found.offset, hd->found.n_packets );
+    if (!rc) {
+        /* better reset the found info */
+        hd->found.kr = NULL;
+        hd->found.offset = 0;
+        /* Delete is a rare operations, so we don't remove the keys
+         * from the offset table */
+    }
+    return rc;
+}
+
+
+\f
+/* 
+ * Start the next search on this handle right at the beginning
+ */
+int 
+keyring_search_reset (KEYRING_HANDLE hd)
+{
+    assert (hd);
+
+    hd->current.kr = NULL;
+    iobuf_close (hd->current.iobuf);
+    hd->current.iobuf = NULL;
+    hd->current.eof = 0;
+    hd->current.error = 0;
+    
+    hd->found.kr = NULL;
+    hd->found.offset = 0;
+    return 0; 
+}
+
+
+static int
+prepare_search (KEYRING_HANDLE hd)
+{
+    if (hd->current.error)  
+        return hd->current.error; /* still in error state */
+
+    if (hd->current.kr && !hd->current.eof) {
+        if ( !hd->current.iobuf )
+            return G10ERR_GENERAL; /* position invalid after a modify */
+        return 0; /* okay */
+    }
+
+    if (!hd->current.kr && hd->current.eof)  
+        return -1; /* still EOF */
+
+    if (!hd->current.kr) { /* start search with first keyring */
+        hd->current.kr = hd->resource;
+        if (!hd->current.kr) {
+            hd->current.eof = 1;
+            return -1; /* keyring not available */
+        }
+        assert (!hd->current.iobuf);
+    }
+    else { /* EOF */
+        iobuf_close (hd->current.iobuf); 
+        hd->current.iobuf = NULL;
+        hd->current.kr = NULL;
+        hd->current.eof = 1;
+        return -1;
+    }
+
+    hd->current.eof = 0;
+    hd->current.iobuf = iobuf_open (hd->current.kr->fname);
+    if (!hd->current.iobuf)
+      {
+        log_error(_("can't open `%s'\n"), hd->current.kr->fname );
+        return (hd->current.error = G10ERR_OPEN_FILE);
+      }
+
+    return 0;
+}
+
+\f
+/* A map of the all characters valid used for word_match()
+ * Valid characters are in in this table converted to uppercase.
+ * because the upper 128 bytes have special meaning, we assume
+ * that they are all valid.
+ * Note: We must use numerical values here in case that this program
+ * will be converted to those little blue HAL9000s with their strange
+ * EBCDIC character set (user ids are UTF-8).
+ * wk 2000-04-13: Hmmm, does this really make sense, given the fact that
+ * we can run gpg now on a S/390 running GNU/Linux, where the code
+ * translation is done by the device drivers?
+ */
+static const byte word_match_chars[256] = {
+  /* 00 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 08 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 10 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 18 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 20 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 28 */  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 30 */  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
+  /* 38 */  0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 40 */  0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+  /* 48 */  0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+  /* 50 */  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+  /* 58 */  0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 60 */  0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+  /* 68 */  0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+  /* 70 */  0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+  /* 78 */  0x58, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00,
+  /* 80 */  0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+  /* 88 */  0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+  /* 90 */  0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+  /* 98 */  0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+  /* a0 */  0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
+  /* a8 */  0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+  /* b0 */  0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+  /* b8 */  0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
+  /* c0 */  0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+  /* c8 */  0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+  /* d0 */  0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+  /* d8 */  0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
+  /* e0 */  0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
+  /* e8 */  0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+  /* f0 */  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+  /* f8 */  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
+};
+
+/****************
+ * Do a word match (original user id starts with a '+').
+ * The pattern is already tokenized to a more suitable format:
+ * There are only the real words in it delimited by one space
+ * and all converted to uppercase.
+ *
+ * Returns: 0 if all words match.
+ *
+ * Note: This algorithm is a straightforward one and not very
+ *      fast.  It works for UTF-8 strings.  The uidlen should
+ *      be removed but due to the fact that old versions of
+ *      pgp don't use UTF-8 we still use the length; this should
+ *      be fixed in parse-packet (and replace \0 by some special
+ *      UTF-8 encoding)
+ */
+static int
+word_match( const byte *uid, size_t uidlen, const byte *pattern )
+{
+    size_t wlen, n;
+    const byte *p;
+    const byte *s;
+
+    for( s=pattern; *s; ) {
+       do {
+           /* skip leading delimiters */
+           while( uidlen && !word_match_chars[*uid] )
+               uid++, uidlen--;
+           /* get length of the word */
+           n = uidlen; p = uid;
+           while( n && word_match_chars[*p] )
+               p++, n--;
+           wlen = p - uid;
+           /* and compare against the current word from pattern */
+           for(n=0, p=uid; n < wlen && s[n] != ' ' && s[n] ; n++, p++ ) {
+               if( word_match_chars[*p] != s[n] )
+                   break;
+           }
+           if( n == wlen && (s[n] == ' ' || !s[n]) )
+               break; /* found */
+           uid += wlen;
+           uidlen -= wlen;
+       } while( uidlen );
+       if( !uidlen )
+           return -1; /* not found */
+
+       /* advance to next word in pattern */
+       for(; *s != ' ' && *s ; s++ )
+           ;
+       if( *s )
+           s++ ;
+    }
+    return 0; /* found */
+}
+
+/****************
+ * prepare word word_match; that is parse the name and
+ * build the pattern.
+ * caller has to free the returned pattern
+ */
+static char*
+prepare_word_match (const byte *name)
+{
+    byte *pattern, *p;
+    int c;
+
+    /* the original length is always enough for the pattern */
+    p = pattern = xmalloc(strlen(name)+1);
+    do {
+       /* skip leading delimiters */
+       while( *name && !word_match_chars[*name] )
+           name++;
+       /* copy as long as we don't have a delimiter and convert
+        * to uppercase.
+        * fixme: how can we handle utf8 uppercasing */
+       for( ; *name &&  (c=word_match_chars[*name]); name++ )
+           *p++ = c;
+       *p++ = ' '; /* append pattern delimiter */
+    } while( *name );
+    p[-1] = 0; /* replace last pattern delimiter by EOS */
+
+    return pattern;
+}
+
+
+
+
+static int
+compare_name (int mode, const char *name, const char *uid, size_t uidlen)
+{
+    int i;
+    const char *s, *se;
+
+    if (mode == KEYDB_SEARCH_MODE_EXACT) { 
+       for (i=0; name[i] && uidlen; i++, uidlen--)
+           if (uid[i] != name[i])
+               break;
+       if (!uidlen && !name[i])
+           return 0; /* found */
+    }
+    else if (mode == KEYDB_SEARCH_MODE_SUBSTR) {
+       if (ascii_memistr( uid, uidlen, name ))
+           return 0;
+    }
+    else if (   mode == KEYDB_SEARCH_MODE_MAIL 
+             || mode == KEYDB_SEARCH_MODE_MAILSUB
+             || mode == KEYDB_SEARCH_MODE_MAILEND) {
+       for (i=0, s= uid; i < uidlen && *s != '<'; s++, i++)
+           ;
+       if (i < uidlen)  {
+           /* skip opening delim and one char and look for the closing one*/
+           s++; i++;
+           for (se=s+1, i++; i < uidlen && *se != '>'; se++, i++)
+               ;
+           if (i < uidlen) {
+               i = se - s;
+               if (mode == KEYDB_SEARCH_MODE_MAIL) { 
+                   if( strlen(name)-2 == i
+                        && !ascii_memcasecmp( s, name+1, i) )
+                       return 0;
+               }
+               else if (mode == KEYDB_SEARCH_MODE_MAILSUB) {
+                   if( ascii_memistr( s, i, name ) )
+                       return 0;
+               }
+               else { /* email from end */
+                   /* nyi */
+               }
+           }
+       }
+    }
+    else if (mode == KEYDB_SEARCH_MODE_WORDS)
+       return word_match (uid, uidlen, name);
+    else
+       BUG();
+
+    return -1; /* not found */
+}
+
+\f
+/* 
+ * Search through the keyring(s), starting at the current position,
+ * for a keyblock which contains one of the keys described in the DESC array.
+ */
+int 
+keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
+               size_t ndesc, size_t *descindex)
+{
+  int rc;
+  PACKET pkt;
+  int save_mode;
+  off_t offset, main_offset;
+  size_t n;
+  int need_uid, need_words, need_keyid, need_fpr, any_skip;
+  int pk_no, uid_no;
+  int initial_skip;
+  int use_offtbl;
+  PKT_user_id *uid = NULL;
+  PKT_public_key *pk = NULL;
+  PKT_secret_key *sk = NULL;
+  u32 aki[2];
+
+  /* figure out what information we need */
+  need_uid = need_words = need_keyid = need_fpr = any_skip = 0;
+  for (n=0; n < ndesc; n++) 
+    {
+      switch (desc[n].mode) 
+        {
+        case KEYDB_SEARCH_MODE_EXACT: 
+        case KEYDB_SEARCH_MODE_SUBSTR:
+        case KEYDB_SEARCH_MODE_MAIL:
+        case KEYDB_SEARCH_MODE_MAILSUB:
+        case KEYDB_SEARCH_MODE_MAILEND:
+          need_uid = 1;
+          break;
+        case KEYDB_SEARCH_MODE_WORDS: 
+          need_uid = 1;
+          need_words = 1;
+          break;
+        case KEYDB_SEARCH_MODE_SHORT_KID: 
+        case KEYDB_SEARCH_MODE_LONG_KID:
+          need_keyid = 1;
+          break;
+        case KEYDB_SEARCH_MODE_FPR16: 
+        case KEYDB_SEARCH_MODE_FPR20:
+        case KEYDB_SEARCH_MODE_FPR: 
+          need_fpr = 1;
+          break;
+        case KEYDB_SEARCH_MODE_FIRST:
+          /* always restart the search in this mode */
+          keyring_search_reset (hd);
+          break;
+        default: break;
+       }
+      if (desc[n].skipfnc) 
+        {
+          any_skip = 1;
+          need_keyid = 1;
+        }
+    }
+
+  rc = prepare_search (hd);
+  if (rc)
+    return rc;
+
+  use_offtbl = !hd->secret && kr_offtbl;
+  if (!use_offtbl)
+    ;
+  else if (!kr_offtbl_ready)
+    need_keyid = 1;
+  else if (ndesc == 1 && desc[0].mode == KEYDB_SEARCH_MODE_LONG_KID)
+    {
+      struct off_item *oi;
+            
+      oi = lookup_offset_hash_table (kr_offtbl, desc[0].u.kid);
+      if (!oi)
+        { /* We know that we don't have this key */
+          hd->found.kr = NULL;
+          hd->current.eof = 1;
+          return -1;
+        }
+      /* We could now create a positive search status and return.
+       * However the problem is that another instance of gpg may 
+       * have changed the keyring so that the offsets are not valid
+       * anymore - therefore we don't do it 
+       */
+    }
+
+  if (need_words)
+    {
+      const char *name = NULL;
+
+      log_debug ("word search mode does not yet work\n");
+      /* FIXME: here is a long standing bug in our function and in addition we
+         just use the first search description */
+      for (n=0; n < ndesc && !name; n++) 
+        {
+          if (desc[n].mode == KEYDB_SEARCH_MODE_WORDS) 
+            name = desc[n].u.name;
+        }
+      assert (name);
+      if ( !hd->word_match.name || strcmp (hd->word_match.name, name) ) 
+        {
+          /* name changed */
+          xfree (hd->word_match.name);
+          xfree (hd->word_match.pattern);
+          hd->word_match.name = xstrdup (name);
+          hd->word_match.pattern = prepare_word_match (name);
+        }
+      name = hd->word_match.pattern;
+    }
+
+  init_packet(&pkt);
+  save_mode = set_packet_list_mode(0);
+
+  hd->found.kr = NULL;
+  main_offset = 0;
+  pk_no = uid_no = 0;
+  initial_skip = 1; /* skip until we see the start of a keyblock */
+  while (!(rc=search_packet (hd->current.iobuf, &pkt, &offset, need_uid))) 
+    {
+      byte afp[MAX_FINGERPRINT_LEN];
+      size_t an;
+
+      if (pkt.pkttype == PKT_PUBLIC_KEY  || pkt.pkttype == PKT_SECRET_KEY) 
+        {
+          main_offset = offset;
+          pk_no = uid_no = 0;
+          initial_skip = 0;
+        }
+      if (initial_skip) 
+        {
+          free_packet (&pkt);
+          continue;
+        }
+       
+      pk = NULL;
+      sk = NULL;
+      uid = NULL;
+      if (   pkt.pkttype == PKT_PUBLIC_KEY
+             || pkt.pkttype == PKT_PUBLIC_SUBKEY)
+        {
+          pk = pkt.pkt.public_key;
+          ++pk_no;
+
+          if (need_fpr) {
+            fingerprint_from_pk (pk, afp, &an);
+            while (an < 20) /* fill up to 20 bytes */
+              afp[an++] = 0;
+          }
+          if (need_keyid)
+            keyid_from_pk (pk, aki);
+
+          if (use_offtbl && !kr_offtbl_ready)
+            update_offset_hash_table (kr_offtbl, aki, main_offset);
+        }
+      else if (pkt.pkttype == PKT_USER_ID) 
+        {
+          uid = pkt.pkt.user_id;
+          ++uid_no;
+        }
+      else if (    pkt.pkttype == PKT_SECRET_KEY
+                   || pkt.pkttype == PKT_SECRET_SUBKEY) 
+        {
+          sk = pkt.pkt.secret_key;
+          ++pk_no;
+
+          if (need_fpr) {
+            fingerprint_from_sk (sk, afp, &an);
+            while (an < 20) /* fill up to 20 bytes */
+              afp[an++] = 0;
+          }
+          if (need_keyid)
+            keyid_from_sk (sk, aki);
+            
+        }
+
+      for (n=0; n < ndesc; n++) 
+        {
+          switch (desc[n].mode) {
+          case KEYDB_SEARCH_MODE_NONE: 
+            BUG ();
+            break;
+          case KEYDB_SEARCH_MODE_EXACT: 
+          case KEYDB_SEARCH_MODE_SUBSTR:
+          case KEYDB_SEARCH_MODE_MAIL:
+          case KEYDB_SEARCH_MODE_MAILSUB:
+          case KEYDB_SEARCH_MODE_MAILEND:
+          case KEYDB_SEARCH_MODE_WORDS: 
+            if ( uid && !compare_name (desc[n].mode,
+                                       desc[n].u.name,
+                                       uid->name, uid->len)) 
+              goto found;
+            break;
+                
+          case KEYDB_SEARCH_MODE_SHORT_KID: 
+            if ((pk||sk) && desc[n].u.kid[1] == aki[1])
+              goto found;
+            break;
+          case KEYDB_SEARCH_MODE_LONG_KID:
+            if ((pk||sk) && desc[n].u.kid[0] == aki[0]
+                && desc[n].u.kid[1] == aki[1])
+              goto found;
+            break;
+          case KEYDB_SEARCH_MODE_FPR16:
+            if ((pk||sk) && !memcmp (desc[n].u.fpr, afp, 16))
+              goto found;
+            break;
+          case KEYDB_SEARCH_MODE_FPR20:
+          case KEYDB_SEARCH_MODE_FPR: 
+            if ((pk||sk) && !memcmp (desc[n].u.fpr, afp, 20))
+              goto found;
+            break;
+          case KEYDB_SEARCH_MODE_FIRST: 
+            if (pk||sk)
+              goto found;
+            break;
+          case KEYDB_SEARCH_MODE_NEXT: 
+            if (pk||sk)
+              goto found;
+            break;
+          default: 
+            rc = G10ERR_INV_ARG;
+            goto found;
+          }
+       }
+      free_packet (&pkt);
+      continue;
+    found:
+      /* Record which desc we matched on.  Note this value is only
+        meaningful if this function returns with no errors. */
+      if(descindex)
+       *descindex=n;
+      for (n=any_skip?0:ndesc; n < ndesc; n++) 
+        {
+          if (desc[n].skipfnc
+              && desc[n].skipfnc (desc[n].skipfncvalue, aki, uid))
+            break;
+        }
+      if (n == ndesc)
+        goto real_found;
+      free_packet (&pkt);
+    }
+ real_found:
+  if (!rc)
+    {
+      hd->found.offset = main_offset;
+      hd->found.kr = hd->current.kr;
+      hd->found.pk_no = (pk||sk)? pk_no : 0;
+      hd->found.uid_no = uid? uid_no : 0;
+    }
+  else if (rc == -1)
+    {
+      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)
+        {
+          KR_NAME kr;
+          
+          /* First set the did_full_scan flag for this keyring (ignore
+             secret keyrings) */
+          for (kr=kr_names; kr; kr = kr->next)
+            {
+              if (!kr->secret && hd->resource == kr) 
+                {
+                  kr->did_full_scan = 1;
+                  break;
+                }
+            }
+          /* Then check whether all flags are set and if so, mark the
+             offtbl ready */
+          for (kr=kr_names; kr; kr = kr->next)
+            {
+              if (!kr->secret && !kr->did_full_scan) 
+                break;
+            }
+          if (!kr)
+            kr_offtbl_ready = 1;
+        }
+    }
+  else 
+    hd->current.error = rc;
+
+  free_packet(&pkt);
+  set_packet_list_mode(save_mode);
+  return rc;
+}
+
+
+static int
+create_tmp_file (const char *template,
+                 char **r_bakfname, char **r_tmpfname, IOBUF *r_fp)
+{  
+  char *bakfname, *tmpfname;
+  mode_t oldmask;
+
+  *r_bakfname = NULL;
+  *r_tmpfname = NULL;
+
+# ifdef USE_ONLY_8DOT3
+  /* Here is another Windoze bug?:
+   * you cant 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 "gpg") )
+    {
+      bakfname = xmalloc (strlen (template) + 1);
+      strcpy (bakfname, template);
+      strcpy (bakfname+strlen(template)-4, EXTSEP_S "bak");
+
+      tmpfname = xmalloc (strlen( template ) + 1 );
+      strcpy (tmpfname,template);
+      strcpy (tmpfname+strlen(template)-4, EXTSEP_S "tmp");
+    }
+    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 /* 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 */
+    oldmask=umask(077);
+    if (is_secured_filename (tmpfname))
+      {
+        *r_fp = NULL;
+        errno = EPERM;
+      }
+    else
+      *r_fp = iobuf_create (tmpfname);
+    umask(oldmask);
+    if (!*r_fp)
+      {
+       log_error(_("can't create `%s': %s\n"), tmpfname, strerror(errno) );
+        xfree (tmpfname);
+        xfree (bakfname);
+       return G10ERR_OPEN_FILE;
+      }
+    
+    *r_bakfname = bakfname;
+    *r_tmpfname = tmpfname;
+    return 0;
+}
+
+
+static int
+rename_tmp_file (const char *bakfname, const char *tmpfname,
+                 const char *fname, int secret )
+{
+  int rc=0;
+
+  /* invalidate close caches*/
+  iobuf_ioctl (NULL, 2, 0, (char*)tmpfname );
+  iobuf_ioctl (NULL, 2, 0, (char*)bakfname );
+  iobuf_ioctl (NULL, 2, 0, (char*)fname );
+
+  /* first make a backup file except for secret keyrings */
+  if (!secret)
+    { 
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+      remove (bakfname);
+#endif
+      if (rename (fname, bakfname) )
+        {
+          log_error ("renaming `%s' to `%s' failed: %s\n",
+                     fname, bakfname, strerror(errno) );
+          return G10ERR_RENAME_FILE;
+       }
+    }
+  
+  /* then rename the file */
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+  remove( fname );
+#endif
+  if (secret)
+    unregister_secured_file (fname);
+  if (rename (tmpfname, fname) )
+    {
+      log_error (_("renaming `%s' to `%s' failed: %s\n"),
+                 tmpfname, fname, strerror(errno) );
+      register_secured_file (fname);
+      rc = G10ERR_RENAME_FILE;
+      if (secret)
+        {
+          log_info(_("WARNING: 2 files with confidential"
+                     " information exists.\n"));
+          log_info(_("%s is the unchanged one\n"), fname );
+          log_info(_("%s is the new one\n"), tmpfname );
+          log_info(_("Please fix this possible security flaw\n"));
+       }
+      return rc;
+    }
+
+  /* Now make sure the file has the same permissions as the original */
+
+#ifndef HAVE_DOSISH_SYSTEM
+  {
+    struct stat statbuf;
+
+    statbuf.st_mode=S_IRUSR | S_IWUSR;
+
+    if(((secret && !opt.preserve_permissions) ||
+       (stat(bakfname,&statbuf)==0)) &&
+       (chmod(fname,statbuf.st_mode)==0))
+      ;
+    else
+      log_error("WARNING: unable to restore permissions to `%s': %s",
+               fname,strerror(errno));
+  }
+#endif
+
+  return 0;
+}
+
+
+static int
+write_keyblock (IOBUF fp, KBNODE keyblock)
+{
+  KBNODE kbctx = NULL, node;
+  int rc;
+  
+  while ( (node = walk_kbnode (keyblock, &kbctx, 0)) ) 
+    {
+      if (node->pkt->pkttype == PKT_RING_TRUST) 
+        continue; /* we write it later on our own */
+
+      if ( (rc = build_packet (fp, node->pkt) ))
+        {
+          log_error ("build_packet(%d) failed: %s\n",
+                     node->pkt->pkttype, g10_errstr(rc) );
+          return rc;
+        }
+      if (node->pkt->pkttype == PKT_SIGNATURE) 
+        { /* always write a signature cache packet */
+          PKT_signature *sig = node->pkt->pkt.signature;
+          unsigned int cacheval = 0;
+          
+          if (sig->flags.checked) 
+            {
+              cacheval |= 1;
+              if (sig->flags.valid)
+                cacheval |= 2;
+            }
+          iobuf_put (fp, 0xb0); /* old style packet 12, 1 byte len*/
+          iobuf_put (fp, 2);    /* 2 bytes */
+          iobuf_put (fp, 0);    /* unused */
+          if (iobuf_put (fp, cacheval)) {
+            log_error ("writing sigcache packet failed\n");
+            return G10ERR_WRITE_FILE;
+          }
+        }
+    }
+  return 0;
+}
+
+/* 
+ * Walk over all public keyrings, check the signatures and replace the
+ * keyring with a new one where the signature cache is then updated.
+ * This is only done for the public keyrings.
+ */
+int
+keyring_rebuild_cache (void *token,int noisy)
+{
+  KEYRING_HANDLE hd;
+  KEYDB_SEARCH_DESC desc;
+  KBNODE keyblock = NULL, node;
+  const char *lastresname = NULL, *resname;
+  IOBUF tmpfp = NULL;
+  char *tmpfilename = NULL;
+  char *bakfilename = NULL;
+  int rc;
+  ulong count = 0, sigcount = 0;
+
+  hd = keyring_new (token, 0);
+  memset (&desc, 0, sizeof desc);
+  desc.mode = KEYDB_SEARCH_MODE_FIRST;
+
+  rc=keyring_lock (hd, 1);
+  if(rc)
+    goto leave;
+
+  while ( !(rc = keyring_search (hd, &desc, 1, NULL)) )
+    {
+      desc.mode = KEYDB_SEARCH_MODE_NEXT;
+      resname = keyring_get_resource_name (hd);
+      if (lastresname != resname )
+        { /* we have switched to a new keyring - commit changes */
+          if (tmpfp)
+            {
+              if (iobuf_close (tmpfp))
+                {
+                  log_error ("error closing `%s': %s\n",
+                             tmpfilename, strerror (errno));
+                  rc = G10ERR_CLOSE_FILE;
+                  goto leave;
+                }
+              /* because we have switched resources, we can be sure that
+               * the original file is closed */
+              tmpfp = NULL;
+            }
+          rc = lastresname? rename_tmp_file (bakfilename, tmpfilename, 
+                                             lastresname, 0) : 0;
+          xfree (tmpfilename);  tmpfilename = NULL;
+          xfree (bakfilename);  bakfilename = NULL;
+          if (rc)
+            goto leave;
+          lastresname = resname;
+          if (noisy && !opt.quiet)
+            log_info (_("caching keyring `%s'\n"), resname);
+          rc = create_tmp_file (resname, &bakfilename, &tmpfilename, &tmpfp);
+          if (rc)
+            goto leave;
+        }
+      
+      release_kbnode (keyblock);
+      rc = keyring_get_keyblock (hd, &keyblock);
+      if (rc) 
+        {
+          log_error ("keyring_get_keyblock failed: %s\n", g10_errstr(rc));
+          goto leave;
+        }
+      assert (keyblock->pkt->pkttype == PKT_PUBLIC_KEY);
+
+      /* check all signature to set the signature's cache flags */
+      for (node=keyblock; node; node=node->next)
+        {
+         /* Note that this doesn't cache the result of a revocation
+            issued by a designated revoker.  This is because the pk
+            in question does not carry the revkeys as we haven't
+            merged the key and selfsigs.  It is questionable whether
+            this matters very much since there are very very few
+            designated revoker revocation packets out there. */
+
+          if (node->pkt->pkttype == PKT_SIGNATURE)
+            {
+             PKT_signature *sig=node->pkt->pkt.signature;
+
+             if(!opt.no_sig_cache && sig->flags.checked && sig->flags.valid
+                && (check_digest_algo(sig->digest_algo)
+                    || check_pubkey_algo(sig->pubkey_algo)))
+               sig->flags.checked=sig->flags.valid=0;
+             else
+               check_key_signature (keyblock, node, NULL);
+
+              sigcount++;
+            }
+        }
+      
+      /* write the keyblock to the temporary file */
+      rc = write_keyblock (tmpfp, keyblock);
+      if (rc)
+        goto leave;
+
+      if ( !(++count % 50) && noisy && !opt.quiet)
+        log_info(_("%lu keys cached so far (%lu signatures)\n"),
+                 count, sigcount );
+
+    } /* end main loop */ 
+  if (rc == -1)
+    rc = 0;
+  if (rc) 
+    {
+      log_error ("keyring_search failed: %s\n", g10_errstr(rc));
+      goto leave;
+    }
+  if(noisy || opt.verbose)
+    log_info(_("%lu keys cached (%lu signatures)\n"), count, sigcount );
+  if (tmpfp)
+    {
+      if (iobuf_close (tmpfp))
+        {
+          log_error ("error closing `%s': %s\n",
+                     tmpfilename, strerror (errno));
+          rc = G10ERR_CLOSE_FILE;
+          goto leave;
+        }
+      /* because we have switched resources, we can be sure that
+       * the original file is closed */
+      tmpfp = NULL;
+    }
+  rc = lastresname? rename_tmp_file (bakfilename, tmpfilename,
+                                     lastresname, 0) : 0;
+  xfree (tmpfilename);  tmpfilename = NULL;
+  xfree (bakfilename);  bakfilename = NULL;
+
+ leave:
+  if (tmpfp)
+    iobuf_cancel (tmpfp);
+  xfree (tmpfilename);  
+  xfree (bakfilename);  
+  release_kbnode (keyblock);
+  keyring_lock (hd, 0);
+  keyring_release (hd);
+  return rc;
+}
+
+\f
+/****************
+ * Perform insert/delete/update operation.
+ * mode 1 = insert
+ *     2 = delete
+ *     3 = update
+ */
+static int
+do_copy (int mode, const char *fname, KBNODE root, int secret,
+         off_t start_offset, unsigned int n_packets )
+{
+    IOBUF fp, newfp;
+    int rc=0;
+    char *bakfname = NULL;
+    char *tmpfname = NULL;
+
+    /* Open the source file. Because we do a rename, we have to check the 
+       permissions of the file */
+    if (access (fname, W_OK))
+      return G10ERR_WRITE_FILE;
+
+    fp = iobuf_open (fname);
+    if (mode == 1 && !fp && errno == ENOENT) { 
+       /* insert mode but file does not exist: create a new file */
+       KBNODE kbctx, node;
+       mode_t oldmask;
+
+       oldmask=umask(077);
+        if (!secret && is_secured_filename (fname)) {
+            newfp = NULL;
+            errno = EPERM;
+        }
+        else
+            newfp = iobuf_create (fname);
+       umask(oldmask);
+       if( !newfp )
+         {
+           log_error (_("can't create `%s': %s\n"), fname, strerror(errno));
+           return G10ERR_OPEN_FILE;
+         }
+       if( !opt.quiet )
+           log_info(_("%s: keyring created\n"), fname );
+
+       kbctx=NULL;
+       while ( (node = walk_kbnode( root, &kbctx, 0 )) ) {
+           if( (rc = build_packet( newfp, node->pkt )) ) {
+               log_error("build_packet(%d) failed: %s\n",
+                           node->pkt->pkttype, g10_errstr(rc) );
+               iobuf_cancel(newfp);
+               return G10ERR_WRITE_FILE;
+           }
+       }
+       if( iobuf_close(newfp) ) {
+           log_error ("%s: close failed: %s\n", fname, strerror(errno));
+           return G10ERR_CLOSE_FILE;
+       }
+       return 0; /* ready */
+    }
+
+    if( !fp )
+      {
+       log_error(_("can't open `%s': %s\n"), fname, strerror(errno) );
+       rc = G10ERR_OPEN_FILE;
+       goto leave;
+      }
+
+    /* Create the new file.  */
+    rc = create_tmp_file (fname, &bakfname, &tmpfname, &newfp);
+    if (rc) {
+       iobuf_close(fp);
+       goto leave;
+    }
+    if (secret)
+      register_secured_file (tmpfname);
+
+    if( mode == 1 ) { /* insert */
+       /* copy everything to the new file */
+       rc = copy_all_packets (fp, newfp);
+       if( rc != -1 ) {
+           log_error("%s: copy to `%s' failed: %s\n",
+                     fname, tmpfname, g10_errstr(rc) );
+           iobuf_close(fp);
+            if (secret)
+              unregister_secured_file (tmpfname);
+           iobuf_cancel(newfp);
+           goto leave;
+       }
+       rc = 0;
+    }
+
+    if( mode == 2 || mode == 3 ) { /* delete or update */
+       /* copy first part to the new file */
+       rc = copy_some_packets( fp, newfp, start_offset );
+       if( rc ) { /* should never get EOF here */
+           log_error ("%s: copy to `%s' failed: %s\n",
+                       fname, tmpfname, g10_errstr(rc) );
+           iobuf_close(fp);
+            if (secret)
+              unregister_secured_file (tmpfname);
+           iobuf_cancel(newfp);
+           goto leave;
+       }
+       /* skip this keyblock */
+       assert( n_packets );
+       rc = skip_some_packets( fp, n_packets );
+       if( rc ) {
+           log_error("%s: skipping %u packets failed: %s\n",
+                           fname, n_packets, g10_errstr(rc));
+           iobuf_close(fp);
+            if (secret)
+              unregister_secured_file (tmpfname);
+           iobuf_cancel(newfp);
+           goto leave;
+       }
+    }
+
+    if( mode == 1 || mode == 3 ) { /* insert or update */
+        rc = write_keyblock (newfp, root);
+        if (rc) {
+          iobuf_close(fp);
+          if (secret)
+            unregister_secured_file (tmpfname);
+          iobuf_cancel(newfp);
+          goto leave;
+        }
+    }
+
+    if( mode == 2 || mode == 3 ) { /* delete or update */
+       /* copy the rest */
+       rc = copy_all_packets( fp, newfp );
+       if( rc != -1 ) {
+           log_error("%s: copy to `%s' failed: %s\n",
+                     fname, tmpfname, g10_errstr(rc) );
+           iobuf_close(fp);
+            if (secret)
+              unregister_secured_file (tmpfname);
+           iobuf_cancel(newfp);
+           goto leave;
+       }
+       rc = 0;
+    }
+
+    /* close both files */
+    if( iobuf_close(fp) ) {
+       log_error("%s: close failed: %s\n", fname, strerror(errno) );
+       rc = G10ERR_CLOSE_FILE;
+       goto leave;
+    }
+    if( iobuf_close(newfp) ) {
+       log_error("%s: close failed: %s\n", tmpfname, strerror(errno) );
+       rc = G10ERR_CLOSE_FILE;
+       goto leave;
+    }
+
+    rc = rename_tmp_file (bakfname, tmpfname, fname, secret);
+
+  leave:
+    xfree(bakfname);
+    xfree(tmpfname);
+    return rc;
+}
diff --git a/g10/keyring.h b/g10/keyring.h
new file mode 100644 (file)
index 0000000..8c4ea73
--- /dev/null
@@ -0,0 +1,46 @@
+/* keyring.h - Keyring operations
+ *     Copyright (C) 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef GPG_KEYRING_H
+#define GPG_KEYRING_H 1
+
+#include "global.h"
+
+typedef struct keyring_handle *KEYRING_HANDLE;
+
+int keyring_register_filename (const char *fname, int secret, void **ptr);
+int keyring_is_writable (void *token);
+
+KEYRING_HANDLE keyring_new (void *token, int secret);
+void keyring_release (KEYRING_HANDLE hd);
+const char *keyring_get_resource_name (KEYRING_HANDLE hd);
+int keyring_lock (KEYRING_HANDLE hd, int yes);
+int keyring_get_keyblock (KEYRING_HANDLE hd, KBNODE *ret_kb);
+int keyring_update_keyblock (KEYRING_HANDLE hd, KBNODE kb);
+int keyring_insert_keyblock (KEYRING_HANDLE hd, KBNODE kb);
+int keyring_locate_writable (KEYRING_HANDLE hd);
+int keyring_delete_keyblock (KEYRING_HANDLE hd);
+int keyring_search_reset (KEYRING_HANDLE hd);
+int keyring_search (KEYRING_HANDLE hd, KEYDB_SEARCH_DESC *desc,
+                   size_t ndesc, size_t *descindex);
+int keyring_rebuild_cache (void *token,int noisy);
+
+#endif /*GPG_KEYRING_H*/
diff --git a/g10/keyserver-internal.h b/g10/keyserver-internal.h
new file mode 100644 (file)
index 0000000..a365986
--- /dev/null
@@ -0,0 +1,54 @@
+/* keyserver-internal.h - Keyserver internals
+ * Copyright (C) 2001, 2002, 2004, 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef _KEYSERVER_INTERNAL_H_
+#define _KEYSERVER_INTERNAL_H_
+
+#include <time.h>
+#include "keyserver.h"
+#include "iobuf.h"
+#include "types.h"
+
+int parse_keyserver_options(char *options);
+void free_keyserver_spec(struct keyserver_spec *keyserver);
+struct keyserver_spec *keyserver_match(struct keyserver_spec *spec);
+struct keyserver_spec *parse_keyserver_uri(const char *string,
+                                          int require_scheme,
+                                          const char *configname,
+                                          unsigned int configlineno);
+struct keyserver_spec *parse_preferred_keyserver(PKT_signature *sig);
+int keyserver_export(STRLIST users);
+int keyserver_import(STRLIST users);
+int keyserver_import_fprint(const byte *fprint,size_t fprint_len,
+                           struct keyserver_spec *keyserver);
+int keyserver_import_keyid(u32 *keyid,struct keyserver_spec *keyserver);
+int keyserver_refresh(STRLIST users);
+int keyserver_search(STRLIST tokens);
+int keyserver_fetch(STRLIST urilist);
+int keyserver_import_cert(const char *name,
+                         unsigned char **fpr,size_t *fpr_len);
+int keyserver_import_pka(const char *name,unsigned char **fpr,size_t *fpr_len);
+int keyserver_import_name(const char *name,unsigned char **fpr,size_t *fpr_len,
+                         struct keyserver_spec *keyserver);
+int keyserver_import_ldap(const char *name,
+                         unsigned char **fpr,size_t *fpr_len);
+
+#endif /* !_KEYSERVER_INTERNAL_H_ */
diff --git a/g10/keyserver.c b/g10/keyserver.c
new file mode 100644 (file)
index 0000000..4f69245
--- /dev/null
@@ -0,0 +1,2132 @@
+/* keyserver.c - generic keyserver code
+ * Copyright (C) 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "filter.h"
+#include "keydb.h"
+#include "status.h"
+#include "exec.h"
+#include "main.h"
+#include "i18n.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "ttyio.h"
+#include "options.h"
+#include "packet.h"
+#include "trustdb.h"
+#include "keyserver-internal.h"
+#include "util.h"
+
+struct keyrec
+{
+  KEYDB_SEARCH_DESC desc;
+  u32 createtime,expiretime;
+  int size,flags;
+  byte type;
+  IOBUF uidbuf;
+  unsigned int lines;
+};
+
+enum ks_action {KS_UNKNOWN=0,KS_GET,KS_GETNAME,KS_SEND,KS_SEARCH};
+
+static struct parse_options keyserver_opts[]=
+  {
+    /* some of these options are not real - just for the help
+       message */
+    {"max-cert-size",0,NULL,NULL},
+    {"include-revoked",0,NULL,N_("include revoked keys in search results")},
+    {"include-subkeys",0,NULL,N_("include subkeys when searching by key ID")},
+    {"use-temp-files",0,NULL,
+     N_("use temporary files to pass data to keyserver helpers")},
+    {"keep-temp-files",KEYSERVER_KEEP_TEMP_FILES,NULL,
+     N_("do not delete temporary files after using them")},
+    {"refresh-add-fake-v3-keyids",KEYSERVER_ADD_FAKE_V3,NULL,
+     NULL},
+    {"auto-key-retrieve",KEYSERVER_AUTO_KEY_RETRIEVE,NULL,
+     N_("automatically retrieve keys when verifying signatures")},
+    {"honor-keyserver-url",KEYSERVER_HONOR_KEYSERVER_URL,NULL,
+     N_("honor the preferred keyserver URL set on the key")},
+    {"honor-pka-record",KEYSERVER_HONOR_PKA_RECORD,NULL,
+     N_("honor the PKA record set on a key when retrieving keys")},
+    {NULL,0,NULL,NULL}
+  };
+
+static int keyserver_work(enum ks_action action,STRLIST list,
+                         KEYDB_SEARCH_DESC *desc,int count,
+                         unsigned char **fpr,size_t *fpr_len,
+                         struct keyserver_spec *keyserver);
+
+/* Reasonable guess */
+#define DEFAULT_MAX_CERT_SIZE 16384
+
+static size_t max_cert_size=DEFAULT_MAX_CERT_SIZE;
+
+static void
+add_canonical_option(char *option,STRLIST *list)
+{
+  char *arg=argsplit(option);
+
+  if(arg)
+    {
+      char *joined;
+
+      joined=xmalloc(strlen(option)+1+strlen(arg)+1);
+      /* Make a canonical name=value form with no spaces */
+      strcpy(joined,option);
+      strcat(joined,"=");
+      strcat(joined,arg);
+      append_to_strlist(list,joined);
+      xfree(joined);
+    }
+  else
+    append_to_strlist(list,option);
+}
+
+int
+parse_keyserver_options(char *options)
+{
+  int ret=1;
+  char *tok;
+  char *max_cert=NULL;
+
+  keyserver_opts[0].value=&max_cert;
+
+  while((tok=optsep(&options)))
+    {
+      if(tok[0]=='\0')
+       continue;
+
+      /* For backwards compatibility.  1.2.x used honor-http-proxy and
+        there are a good number of documents published that recommend
+        it. */
+      if(ascii_strcasecmp(tok,"honor-http-proxy")==0)
+       tok="http-proxy";
+      else if(ascii_strcasecmp(tok,"no-honor-http-proxy")==0)
+       tok="no-http-proxy";
+
+      /* We accept quite a few possible options here - some options to
+        handle specially, the keyserver_options list, and import and
+        export options that pertain to keyserver operations.  Note
+        that you must use strncasecmp here as there might be an
+        =argument attached which will foil the use of strcasecmp. */
+
+#ifdef EXEC_TEMPFILE_ONLY
+      if(ascii_strncasecmp(tok,"use-temp-files",14)==0 ||
+             ascii_strncasecmp(tok,"no-use-temp-files",17)==0)
+       log_info(_("WARNING: keyserver option `%s' is not used"
+                  " on this platform\n"),tok);
+#else
+      if(ascii_strncasecmp(tok,"use-temp-files",14)==0)
+       opt.keyserver_options.options|=KEYSERVER_USE_TEMP_FILES;
+      else if(ascii_strncasecmp(tok,"no-use-temp-files",17)==0)
+       opt.keyserver_options.options&=~KEYSERVER_USE_TEMP_FILES;
+#endif
+      else if(!parse_options(tok,&opt.keyserver_options.options,
+                            keyserver_opts,0)
+        && !parse_import_options(tok,
+                                 &opt.keyserver_options.import_options,0)
+        && !parse_export_options(tok,
+                                 &opt.keyserver_options.export_options,0))
+       {
+         /* All of the standard options have failed, so the option is
+            destined for a keyserver plugin. */
+         add_canonical_option(tok,&opt.keyserver_options.other);
+       }
+    }
+
+  if(max_cert)
+    {
+      max_cert_size=strtoul(max_cert,(char **)NULL,10);
+
+      if(max_cert_size==0)
+       max_cert_size=DEFAULT_MAX_CERT_SIZE;
+    }
+
+  return ret;
+}
+
+void
+free_keyserver_spec(struct keyserver_spec *keyserver)
+{
+  xfree(keyserver->uri);
+  xfree(keyserver->scheme);
+  xfree(keyserver->auth);
+  xfree(keyserver->host);
+  xfree(keyserver->port);
+  xfree(keyserver->path);
+  xfree(keyserver->opaque);
+  free_strlist(keyserver->options);
+  xfree(keyserver);
+}
+
+/* Return 0 for match */
+static int
+cmp_keyserver_spec(struct keyserver_spec *one,struct keyserver_spec *two)
+{
+  if(ascii_strcasecmp(one->scheme,two->scheme)==0)
+    {
+      if(one->host && two->host && ascii_strcasecmp(one->host,two->host)==0)
+       {
+         if((one->port && two->port
+             && ascii_strcasecmp(one->port,two->port)==0)
+            || (!one->port && !two->port))
+           return 0;
+       }
+      else if(one->opaque && two->opaque
+             && ascii_strcasecmp(one->opaque,two->opaque)==0)
+       return 0;
+    }
+
+  return 1;
+}
+
+/* Try and match one of our keyservers.  If we can, return that.  If
+   we can't, return our input. */
+struct keyserver_spec *
+keyserver_match(struct keyserver_spec *spec)
+{
+  struct keyserver_spec *ks;
+
+  for(ks=opt.keyserver;ks;ks=ks->next)
+    if(cmp_keyserver_spec(spec,ks)==0)
+      return ks;
+
+  return spec;
+}
+
+/* TODO: once we cut over to an all-curl world, we don't need this
+   parser any longer so it can be removed, or at least moved to
+   keyserver/ksutil.c for limited use in gpgkeys_ldap or the like. */
+
+struct keyserver_spec *
+parse_keyserver_uri(const char *string,int require_scheme,
+                   const char *configname,unsigned int configlineno)
+{
+  int assume_hkp=0;
+  struct keyserver_spec *keyserver;
+  const char *idx;
+  int count;
+  char *uri,*options;
+
+  assert(string!=NULL);
+
+  keyserver=xmalloc_clear(sizeof(struct keyserver_spec));
+
+  uri=xstrdup(string);
+
+  options=strchr(uri,' ');
+  if(options)
+    {
+      char *tok;
+
+      *options='\0';
+      options++;
+
+      while((tok=optsep(&options)))
+       add_canonical_option(tok,&keyserver->options);
+    }
+
+  /* Get the scheme */
+
+  for(idx=uri,count=0;*idx && *idx!=':';idx++)
+    {
+      count++;
+
+      /* Do we see the start of an RFC-2732 ipv6 address here?  If so,
+        there clearly isn't a scheme so get out early. */
+      if(*idx=='[')
+       {
+         /* Was the '[' the first thing in the string?  If not, we
+            have a mangled scheme with a [ in it so fail. */
+         if(count==1)
+           break;
+         else
+           goto fail;
+       }
+    }
+
+  if(count==0)
+    goto fail;
+
+  if(*idx=='\0' || *idx=='[')
+    {
+      if(require_scheme)
+       return NULL;
+
+      /* Assume HKP if there is no scheme */
+      assume_hkp=1;
+      keyserver->scheme=xstrdup("hkp");
+
+      keyserver->uri=xmalloc(strlen(keyserver->scheme)+3+strlen(uri)+1);
+      strcpy(keyserver->uri,keyserver->scheme);
+      strcat(keyserver->uri,"://");
+      strcat(keyserver->uri,uri);
+    }
+  else
+    {
+      int i;
+
+      keyserver->uri=xstrdup(uri);
+
+      keyserver->scheme=xmalloc(count+1);
+
+      /* Force to lowercase */
+      for(i=0;i<count;i++)
+       keyserver->scheme[i]=ascii_tolower(uri[i]);
+
+      keyserver->scheme[i]='\0';
+
+      /* Skip past the scheme and colon */
+      uri+=count+1;
+    }
+
+  if(ascii_strcasecmp(keyserver->scheme,"x-broken-hkp")==0)
+    {
+      deprecated_warning(configname,configlineno,"x-broken-hkp",
+                        "--keyserver-options ","broken-http-proxy");
+      xfree(keyserver->scheme);
+      keyserver->scheme=xstrdup("hkp");
+      append_to_strlist(&opt.keyserver_options.other,"broken-http-proxy");
+    }
+  else if(ascii_strcasecmp(keyserver->scheme,"x-hkp")==0)
+    {
+      /* Canonicalize this to "hkp" so it works with both the internal
+        and external keyserver interface. */
+      xfree(keyserver->scheme);
+      keyserver->scheme=xstrdup("hkp");
+    }
+
+  if(assume_hkp || (uri[0]=='/' && uri[1]=='/'))
+    {
+      /* Two slashes means network path. */
+
+      /* Skip over the "//", if any */
+      if(!assume_hkp)
+       uri+=2;
+
+      /* Do we have userinfo auth data present? */
+      for(idx=uri,count=0;*idx && *idx!='@' && *idx!='/';idx++)
+       count++;
+
+      /* We found a @ before the slash, so that means everything
+        before the @ is auth data. */
+      if(*idx=='@')
+       {
+         if(count==0)
+           goto fail;
+
+         keyserver->auth=xmalloc(count+1);
+         strncpy(keyserver->auth,uri,count);
+         keyserver->auth[count]='\0';
+         uri+=count+1;
+       }
+
+      /* Is it an RFC-2732 ipv6 [literal address] ? */
+      if(*uri=='[')
+       {
+         for(idx=uri+1,count=1;*idx
+               && ((isascii (*idx) && isxdigit(*idx))
+                    || *idx==':' || *idx=='.');idx++)
+           count++;
+
+         /* Is the ipv6 literal address terminated? */
+         if(*idx==']')
+           count++;
+         else
+           goto fail;
+       }
+      else
+       for(idx=uri,count=0;*idx && *idx!=':' && *idx!='/';idx++)
+         count++;
+
+      if(count==0)
+       goto fail;
+
+      keyserver->host=xmalloc(count+1);
+      strncpy(keyserver->host,uri,count);
+      keyserver->host[count]='\0';
+
+      /* Skip past the host */
+      uri+=count;
+
+      if(*uri==':')
+       {
+         /* It would seem to be reasonable to limit the range of the
+            ports to values between 1-65535, but RFC 1738 and 1808
+            imply there is no limit.  Of course, the real world has
+            limits. */
+
+         for(idx=uri+1,count=0;*idx && *idx!='/';idx++)
+           {
+             count++;
+
+             /* Ports are digits only */
+             if(!digitp(idx))
+               goto fail;
+           }
+
+         keyserver->port=xmalloc(count+1);
+         strncpy(keyserver->port,uri+1,count);
+         keyserver->port[count]='\0';
+
+         /* Skip past the colon and port number */
+         uri+=1+count;
+       }
+
+      /* Everything else is the path */
+      if(*uri)
+       keyserver->path=xstrdup(uri);
+      else
+       keyserver->path=xstrdup("/");
+
+      if(keyserver->path[1])
+       keyserver->flags.direct_uri=1;
+    }
+  else if(uri[0]!='/')
+    {
+      /* No slash means opaque.  Just record the opaque blob and get
+        out. */
+      keyserver->opaque=xstrdup(uri);
+    }
+  else
+    {
+      /* One slash means absolute path.  We don't need to support that
+        yet. */
+      goto fail;
+    }
+
+  return keyserver;
+
+ fail:
+  free_keyserver_spec(keyserver);
+
+  return NULL;
+}
+
+struct keyserver_spec *
+parse_preferred_keyserver(PKT_signature *sig)
+{
+  struct keyserver_spec *spec=NULL;
+  const byte *p;
+  size_t plen;
+
+  p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&plen);
+  if(p && plen)
+    {
+      byte *dupe=xmalloc(plen+1);
+
+      memcpy(dupe,p,plen);
+      dupe[plen]='\0';
+      spec=parse_keyserver_uri(dupe,1,NULL,0);
+      xfree(dupe);
+    }
+
+  return spec;
+}
+
+static void
+print_keyrec(int number,struct keyrec *keyrec)
+{
+  int i;
+
+  iobuf_writebyte(keyrec->uidbuf,0);
+  iobuf_flush_temp(keyrec->uidbuf);
+  printf("(%d)\t%s  ",number,iobuf_get_temp_buffer(keyrec->uidbuf));
+
+  if(keyrec->size>0)
+    printf("%d bit ",keyrec->size);
+
+  if(keyrec->type)
+    {
+      const char *str=pubkey_algo_to_string(keyrec->type);
+
+      if(str)
+       printf("%s ",str);
+      else
+       printf("unknown ");
+    }
+
+  switch(keyrec->desc.mode)
+    {
+      /* If the keyserver helper gave us a short keyid, we have no
+        choice but to use it.  Do check --keyid-format to add a 0x if
+        needed. */
+    case KEYDB_SEARCH_MODE_SHORT_KID:
+      printf("key %s%08lX",
+            (opt.keyid_format==KF_0xSHORT
+             || opt.keyid_format==KF_0xLONG)?"0x":"",
+            (ulong)keyrec->desc.u.kid[1]);
+      break;
+
+      /* However, if it gave us a long keyid, we can honor
+        --keyid-format */
+    case KEYDB_SEARCH_MODE_LONG_KID:
+      printf("key %s",keystr(keyrec->desc.u.kid));
+      break;
+
+    case KEYDB_SEARCH_MODE_FPR16:
+      printf("key ");
+      for(i=0;i<16;i++)
+       printf("%02X",keyrec->desc.u.fpr[i]);
+      break;
+
+    case KEYDB_SEARCH_MODE_FPR20:
+      printf("key ");
+      for(i=0;i<20;i++)
+       printf("%02X",keyrec->desc.u.fpr[i]);
+      break;
+
+    default:
+      BUG();
+      break;
+    }
+
+  if(keyrec->createtime>0)
+    {
+      printf(", ");
+      printf(_("created: %s"),strtimestamp(keyrec->createtime));
+    }
+
+  if(keyrec->expiretime>0)
+    {
+      printf(", ");
+      printf(_("expires: %s"),strtimestamp(keyrec->expiretime));
+    }
+
+  if(keyrec->flags&1)
+    printf(" (%s)",_("revoked"));
+  if(keyrec->flags&2)
+    printf(" (%s)",_("disabled"));
+  if(keyrec->flags&4)
+    printf(" (%s)",_("expired"));
+
+  printf("\n");
+}
+
+/* Returns a keyrec (which must be freed) once a key is complete, and
+   NULL otherwise.  Call with a NULL keystring once key parsing is
+   complete to return any unfinished keys. */
+static struct keyrec *
+parse_keyrec(char *keystring)
+{
+  static struct keyrec *work=NULL;
+  struct keyrec *ret=NULL;
+  char *record;
+  int i;
+
+  if(keystring==NULL)
+    {
+      if(work==NULL)
+       return NULL;
+      else if(work->desc.mode==KEYDB_SEARCH_MODE_NONE)
+       {
+         xfree(work);
+         return NULL;
+       }
+      else
+       {
+         ret=work;
+         work=NULL;
+         return ret;
+       }
+    }
+
+  if(work==NULL)
+    {
+      work=xmalloc_clear(sizeof(struct keyrec));
+      work->uidbuf=iobuf_temp();
+    }
+
+  /* Remove trailing whitespace */
+  for(i=strlen(keystring);i>0;i--)
+    if(ascii_isspace(keystring[i-1]))
+      keystring[i-1]='\0';
+    else
+      break;
+
+  if((record=strsep(&keystring,":"))==NULL)
+    return ret;
+
+  if(ascii_strcasecmp("pub",record)==0)
+    {
+      char *tok;
+
+      if(work->desc.mode)
+       {
+         ret=work;
+         work=xmalloc_clear(sizeof(struct keyrec));
+         work->uidbuf=iobuf_temp();
+       }
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      classify_user_id(tok,&work->desc);
+      if(work->desc.mode!=KEYDB_SEARCH_MODE_SHORT_KID
+        && work->desc.mode!=KEYDB_SEARCH_MODE_LONG_KID
+        && work->desc.mode!=KEYDB_SEARCH_MODE_FPR16
+        && work->desc.mode!=KEYDB_SEARCH_MODE_FPR20)
+       {
+         work->desc.mode=KEYDB_SEARCH_MODE_NONE;
+         return ret;
+       }
+
+      /* Note all items after this are optional.  This allows us to
+         have a pub line as simple as pub:keyid and nothing else. */
+
+      work->lines++;
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      work->type=atoi(tok);
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      work->size=atoi(tok);
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      if(atoi(tok)<=0)
+       work->createtime=0;
+      else
+       work->createtime=atoi(tok);
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      if(atoi(tok)<=0)
+       work->expiretime=0;
+      else
+       {
+         work->expiretime=atoi(tok);
+         /* Force the 'e' flag on if this key is expired. */
+         if(work->expiretime<=make_timestamp())
+           work->flags|=4;
+       }
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      while(*tok)
+       switch(*tok++)
+         {
+         case 'r':
+         case 'R':
+           work->flags|=1;
+           break;
+           
+         case 'd':
+         case 'D':
+           work->flags|=2;
+           break;
+
+         case 'e':
+         case 'E':
+           work->flags|=4;
+           break;
+         }
+    }
+  else if(ascii_strcasecmp("uid",record)==0 && work->desc.mode)
+    {
+      char *userid,*tok,*decoded;
+
+      if((tok=strsep(&keystring,":"))==NULL)
+       return ret;
+
+      if(strlen(tok)==0)
+       return ret;
+
+      userid=tok;
+
+      /* By definition, de-%-encoding is always smaller than the
+         original string so we can decode in place. */
+
+      i=0;
+
+      while(*tok)
+       if(tok[0]=='%' && tok[1] && tok[2])
+         {
+           if((userid[i]=hextobyte(&tok[1]))==-1)
+             userid[i]='?';
+
+           i++;
+           tok+=3;
+         }
+       else
+         userid[i++]=*tok++;
+
+      /* We don't care about the other info provided in the uid: line
+         since no keyserver supports marking userids with timestamps
+         or revoked/expired/disabled yet. */
+
+      /* No need to check for control characters, as utf8_to_native
+        does this for us. */
+
+      decoded=utf8_to_native(userid,i,0);
+      if(strlen(decoded)>opt.screen_columns-10)
+       decoded[opt.screen_columns-10]='\0';
+      iobuf_writestr(work->uidbuf,decoded);
+      xfree(decoded);
+      iobuf_writestr(work->uidbuf,"\n\t");
+      work->lines++;
+    }
+
+  /* Ignore any records other than "pri" and "uid" for easy future
+     growth. */
+
+  return ret;
+}
+
+/* TODO: do this as a list sent to keyserver_work rather than calling
+   it once for each key to get the correct counts after the import
+   (cosmetics, really) and to better take advantage of the keyservers
+   that can do multiple fetches in one go (LDAP). */
+static int
+show_prompt(KEYDB_SEARCH_DESC *desc,int numdesc,int count,const char *search)
+{
+  char *answer;
+
+  if(count && opt.command_fd==-1)
+    {
+      static int from=1;
+      tty_printf("Keys %d-%d of %d for \"%s\".  ",from,numdesc,count,search);
+      from=numdesc+1;
+    }
+
+  answer=cpr_get_no_help("keysearch.prompt",
+                        _("Enter number(s), N)ext, or Q)uit > "));
+  /* control-d */
+  if(answer[0]=='\x04')
+    {
+      printf("Q\n");
+      answer[0]='q';
+    }
+
+  if(answer[0]=='q' || answer[0]=='Q')
+    {
+      xfree(answer);
+      return 1;
+    }
+  else if(atoi(answer)>=1 && atoi(answer)<=numdesc)
+    {
+      char *split=answer,*num;
+
+      while((num=strsep(&split," ,"))!=NULL)
+       if(atoi(num)>=1 && atoi(num)<=numdesc)
+         keyserver_work(KS_GET,NULL,&desc[atoi(num)-1],1,
+                        NULL,NULL,opt.keyserver);
+
+      xfree(answer);
+      return 1;
+    }
+
+  return 0;
+}
+
+/* Count and searchstr are just for cosmetics.  If the count is too
+   small, it will grow safely.  If negative it disables the "Key x-y
+   of z" messages.  searchstr should be UTF-8 (rather than native). */
+static void
+keyserver_search_prompt(IOBUF buffer,const char *searchstr)
+{
+  int i=0,validcount=0,started=0,header=0,count=1;
+  unsigned int maxlen,buflen,numlines=0;
+  KEYDB_SEARCH_DESC *desc;
+  byte *line=NULL;
+  char *localstr=NULL;
+
+  if(searchstr)
+    localstr=utf8_to_native(searchstr,strlen(searchstr),0);
+
+  desc=xmalloc(count*sizeof(KEYDB_SEARCH_DESC));
+
+  for(;;)
+    {
+      struct keyrec *keyrec;
+      int rl;
+
+      maxlen=1024;
+      rl=iobuf_read_line(buffer,&line,&buflen,&maxlen);
+
+      if(opt.with_colons)
+       {
+         if(!header && ascii_strncasecmp("SEARCH ",line,7)==0
+            && ascii_strncasecmp(" BEGIN",&line[strlen(line)-7],6)==0)
+           {
+             header=1;
+             continue;
+           }
+         else if(ascii_strncasecmp("SEARCH ",line,7)==0
+                 && ascii_strncasecmp(" END",&line[strlen(line)-5],4)==0)
+           continue;
+
+         printf("%s",line);
+       }
+
+      /* Look for an info: line.  The only current info: values
+        defined are the version and key count. */
+      if(!started && rl>0 && ascii_strncasecmp("info:",line,5)==0)
+       {
+         char *tok,*str=&line[5];
+
+         if((tok=strsep(&str,":"))!=NULL)
+           {
+             int version;
+
+             if(sscanf(tok,"%d",&version)!=1)
+               version=1;
+
+             if(version!=1)
+               {
+                 log_error(_("invalid keyserver protocol "
+                             "(us %d!=handler %d)\n"),1,version);
+                 break;
+               }
+           }
+
+         if((tok=strsep(&str,":"))!=NULL && sscanf(tok,"%d",&count)==1)
+           {
+             if(count==0)
+               goto notfound;
+             else if(count<0)
+               count=10;
+             else
+               validcount=1;
+
+             desc=xrealloc(desc,count*sizeof(KEYDB_SEARCH_DESC));
+           }
+
+         started=1;
+         continue;
+       }
+
+      if(rl==0)
+       {
+         keyrec=parse_keyrec(NULL);
+
+         if(keyrec==NULL)
+           {
+             if(i==0)
+               {
+                 count=0;
+                 break;
+               }
+
+             if(i!=count)
+               validcount=0;
+
+             for(;;)
+               {
+                 if(show_prompt(desc,i,validcount?count:0,localstr))
+                   break;
+                 validcount=0;
+               }
+
+             break;
+           }
+       }
+      else
+       keyrec=parse_keyrec(line);
+
+      if(i==count)
+       {
+         /* keyserver helper sent more keys than they claimed in the
+            info: line. */
+         count+=10;
+         desc=xrealloc(desc,count*sizeof(KEYDB_SEARCH_DESC));
+         validcount=0;
+       }
+
+      if(keyrec)
+       {
+         desc[i]=keyrec->desc;
+
+         if(!opt.with_colons)
+           {
+             /* screen_lines - 1 for the prompt. */
+             if(numlines+keyrec->lines>opt.screen_lines-1)
+               {
+                 if(show_prompt(desc,i,validcount?count:0,localstr))
+                   break;
+                 else
+                   numlines=0;
+               }
+
+             print_keyrec(i+1,keyrec);
+           }
+
+         numlines+=keyrec->lines;
+         iobuf_close(keyrec->uidbuf);
+         xfree(keyrec);
+
+         started=1;
+         i++;
+       }
+    }
+
+ notfound:
+  /* Leave this commented out or now, and perhaps for a very long
+     time.  All HKPish servers return HTML error messages for
+     no-key-found. */
+  /* 
+     if(!started)
+     log_info(_("keyserver does not support searching\n"));
+     else
+  */
+  if(count==0)
+    {
+      if(localstr)
+       log_info(_("key \"%s\" not found on keyserver\n"),localstr);
+      else
+       log_info(_("key not found on keyserver\n"));
+    }
+
+  xfree(localstr);
+  xfree(desc);
+  xfree(line);
+}
+
+/* We sometimes want to use a different gpgkeys_xxx for a given
+   protocol (for example, ldaps is handled by gpgkeys_ldap).  Map
+   these here. */
+static const char *
+keyserver_typemap(const char *type)
+{
+  if(strcmp(type,"ldaps")==0)
+    return "ldap";
+  else
+    return type;
+}
+
+/* The PGP LDAP and the curl fetch-a-LDAP-object methodologies are
+   sufficiently different that we can't use curl to do LDAP. */
+static int
+direct_uri_map(const char *scheme,unsigned int is_direct)
+{
+  if(is_direct && strcmp(scheme,"ldap")==0)
+    return 1;
+
+  return 0;
+}
+
+#define GPGKEYS_PREFIX "gpgkeys_"
+#define GPGKEYS_CURL GPGKEYS_PREFIX "curl" EXEEXT
+#define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_CURL))
+#define KEYSERVER_ARGS_KEEP " -o \"%O\" \"%I\""
+#define KEYSERVER_ARGS_NOKEEP " -o \"%o\" \"%i\""
+
+static int 
+keyserver_spawn(enum ks_action action,STRLIST list,KEYDB_SEARCH_DESC *desc,
+               int count,int *prog,unsigned char **fpr,size_t *fpr_len,
+               struct keyserver_spec *keyserver)
+{
+  int ret=0,i,gotversion=0,outofband=0;
+  STRLIST temp;
+  unsigned int maxlen,buflen;
+  char *command,*end,*searchstr=NULL;
+  byte *line=NULL;
+  struct exec_info *spawn;
+  const char *scheme;
+  const char *libexecdir = get_libexecdir ();
+
+  assert(keyserver);
+
+#ifdef EXEC_TEMPFILE_ONLY
+  opt.keyserver_options.options|=KEYSERVER_USE_TEMP_FILES;
+#endif
+
+  /* Build the filename for the helper to execute */
+  scheme=keyserver_typemap(keyserver->scheme);
+
+#ifdef DISABLE_KEYSERVER_PATH
+  /* Destroy any path we might have.  This is a little tricky,
+     portability-wise.  It's not correct to delete the PATH
+     environment variable, as that may fall back to a system built-in
+     PATH.  Similarly, it is not correct to set PATH to the null
+     string (PATH="") since this actually deletes the PATH environment
+     variable under MinGW.  The safest thing to do here is to force
+     PATH to be GNUPG_LIBEXECDIR.  All this is not that meaningful on
+     Unix-like systems (since we're going to give a full path to
+     gpgkeys_foo), but on W32 it prevents loading any DLLs from
+     directories in %PATH%.
+
+     After some more thinking about this we came to the conclusion
+     that it is better to load the helpers from the directory where
+     the program of this process lives.  Fortunately Windows provides
+     a way to retrieve this and our get_libexecdir function has been
+     modified to return just this.  Setting the exec-path is not
+     anymore required.  
+       set_exec_path(libexecdir);
+ */
+#else
+  if(opt.exec_path_set)
+    {
+      /* If exec-path was set, and DISABLE_KEYSERVER_PATH is
+        undefined, then don't specify a full path to gpgkeys_foo, so
+        that the PATH can work. */
+      command=xmalloc(GPGKEYS_PREFIX_LEN+strlen(scheme)+3+strlen(EXEEXT)+1);
+      command[0]='\0';
+    }
+  else
+#endif
+    {
+      /* Specify a full path to gpgkeys_foo. */
+      command=xmalloc(strlen(libexecdir)+strlen(DIRSEP_S)+
+                     GPGKEYS_PREFIX_LEN+strlen(scheme)+3+strlen(EXEEXT)+1);
+      strcpy(command,libexecdir);
+      strcat(command,DIRSEP_S);
+    }
+
+  end=command+strlen(command);
+
+  /* Build a path for the keyserver helper.  If it is direct_uri
+     (i.e. an object fetch and not a keyserver), then add "_uri" to
+     the end to distinguish the keyserver helper from an object
+     fetcher that can speak that protocol (this is a problem for
+     LDAP). */
+
+  strcat(command,GPGKEYS_PREFIX); 
+  strcat(command,scheme);
+
+  /* This "_uri" thing is in case we need to call a direct handler
+     instead of the keyserver handler.  This lets us use gpgkeys_curl
+     or gpgkeys_ldap_uri (we don't provide it, but a user might)
+     instead of gpgkeys_ldap to fetch things like
+     ldap://keyserver.pgp.com/o=PGP%20keys?pgpkey?sub?pgpkeyid=99242560 */
+
+  if(direct_uri_map(scheme,keyserver->flags.direct_uri))
+    strcat(command,"_uri");
+
+  strcat(command,EXEEXT);
+
+  /* Can we execute it?  If not, try curl as our catchall. */
+  if(path_access(command,X_OK)!=0)
+    strcpy(end,GPGKEYS_CURL);
+
+  if(opt.keyserver_options.options&KEYSERVER_USE_TEMP_FILES)
+    {
+      if(opt.keyserver_options.options&KEYSERVER_KEEP_TEMP_FILES)
+       {
+         command=xrealloc(command,strlen(command)+
+                           strlen(KEYSERVER_ARGS_KEEP)+1);
+         strcat(command,KEYSERVER_ARGS_KEEP);
+       }
+      else
+       {
+         command=xrealloc(command,strlen(command)+
+                           strlen(KEYSERVER_ARGS_NOKEEP)+1);
+         strcat(command,KEYSERVER_ARGS_NOKEEP);  
+       }
+
+      ret=exec_write(&spawn,NULL,command,NULL,0,0);
+    }
+  else
+    ret=exec_write(&spawn,command,NULL,NULL,0,0);
+
+  xfree(command);
+
+  if(ret)
+    return ret;
+
+  fprintf(spawn->tochild,
+         "# This is a GnuPG %s keyserver communications file\n",VERSION);
+  fprintf(spawn->tochild,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
+  fprintf(spawn->tochild,"PROGRAM %s\n",VERSION);
+  fprintf(spawn->tochild,"SCHEME %s\n",keyserver->scheme);
+
+  if(keyserver->opaque)
+    fprintf(spawn->tochild,"OPAQUE %s\n",keyserver->opaque);
+  else
+    {
+      if(keyserver->auth)
+       fprintf(spawn->tochild,"AUTH %s\n",keyserver->auth);
+
+      if(keyserver->host)
+       fprintf(spawn->tochild,"HOST %s\n",keyserver->host);
+
+      if(keyserver->port)
+       fprintf(spawn->tochild,"PORT %s\n",keyserver->port);
+
+      if(keyserver->path)
+       fprintf(spawn->tochild,"PATH %s\n",keyserver->path);
+    }
+
+  /* Write global options */
+
+  for(temp=opt.keyserver_options.other;temp;temp=temp->next)
+    fprintf(spawn->tochild,"OPTION %s\n",temp->d);
+
+  /* Write per-keyserver options */
+
+  for(temp=keyserver->options;temp;temp=temp->next)
+    fprintf(spawn->tochild,"OPTION %s\n",temp->d);
+
+  switch(action)
+    {
+    case KS_GET:
+      {
+       fprintf(spawn->tochild,"COMMAND GET\n\n");
+
+       /* Which keys do we want? */
+
+       for(i=0;i<count;i++)
+         {
+           int quiet=0;
+
+           if(desc[i].mode==KEYDB_SEARCH_MODE_FPR20)
+             {
+               int f;
+
+               fprintf(spawn->tochild,"0x");
+
+               for(f=0;f<MAX_FINGERPRINT_LEN;f++)
+                 fprintf(spawn->tochild,"%02X",desc[i].u.fpr[f]);
+
+               fprintf(spawn->tochild,"\n");
+             }
+           else if(desc[i].mode==KEYDB_SEARCH_MODE_FPR16)
+             {
+               int f;
+
+               fprintf(spawn->tochild,"0x");
+
+               for(f=0;f<16;f++)
+                 fprintf(spawn->tochild,"%02X",desc[i].u.fpr[f]);
+
+               fprintf(spawn->tochild,"\n");
+             }
+           else if(desc[i].mode==KEYDB_SEARCH_MODE_LONG_KID)
+             fprintf(spawn->tochild,"0x%08lX%08lX\n",
+                     (ulong)desc[i].u.kid[0],
+                     (ulong)desc[i].u.kid[1]);
+           else if(desc[i].mode==KEYDB_SEARCH_MODE_SHORT_KID)
+             fprintf(spawn->tochild,"0x%08lX\n",
+                     (ulong)desc[i].u.kid[1]);
+           else if(desc[i].mode==KEYDB_SEARCH_MODE_EXACT)
+             {
+               fprintf(spawn->tochild,"0x0000000000000000\n");
+               quiet=1;
+             }
+           else if(desc[i].mode==KEYDB_SEARCH_MODE_NONE)
+             continue;
+           else
+             BUG();
+
+           if(!quiet)
+             {
+               if(keyserver->host)
+                 log_info(_("requesting key %s from %s server %s\n"),
+                          keystr_from_desc(&desc[i]),
+                          keyserver->scheme,keyserver->host);
+               else
+                 log_info(_("requesting key %s from %s\n"),
+                          keystr_from_desc(&desc[i]),keyserver->uri);
+             }
+         }
+
+       fprintf(spawn->tochild,"\n");
+
+       break;
+      }
+
+    case KS_GETNAME:
+      {
+       STRLIST key;
+
+       fprintf(spawn->tochild,"COMMAND GETNAME\n\n");
+
+       /* Which names do we want? */
+
+       for(key=list;key!=NULL;key=key->next)
+         fprintf(spawn->tochild,"%s\n",key->d);
+
+       fprintf(spawn->tochild,"\n");
+
+       if(keyserver->host)
+         log_info(_("searching for names from %s server %s\n"),
+                  keyserver->scheme,keyserver->host);
+       else
+         log_info(_("searching for names from %s\n"),keyserver->uri);
+
+       break;
+      }
+
+    case KS_SEND:
+      {
+       STRLIST key;
+
+       /* Note the extra \n here to send an empty keylist block */
+       fprintf(spawn->tochild,"COMMAND SEND\n\n\n");
+
+       for(key=list;key!=NULL;key=key->next)
+         {
+           armor_filter_context_t *afx;
+           IOBUF buffer=iobuf_temp();
+           KBNODE block;
+
+           temp=NULL;
+           add_to_strlist(&temp,key->d);
+
+           afx = new_armor_context ();
+           afx->what = 1;
+           /* Tell the armor filter to use Unix-style \n line
+              endings, since we're going to fprintf this to a file
+              that (on Win32) is open in text mode.  The win32 stdio
+              will transform the \n to \r\n and we'll end up with the
+              proper line endings on win32.  This is a no-op on
+              Unix. */
+           afx->eol[0]='\n';
+           push_armor_filter (afx, buffer);
+            release_armor_context (afx);
+
+           /* TODO: Remove Comment: lines from keys exported this
+              way? */
+
+           if(export_pubkeys_stream(buffer,temp,&block,
+                                    opt.keyserver_options.export_options)==-1)
+             iobuf_close(buffer);
+           else
+             {
+               KBNODE node;
+
+               iobuf_flush_temp(buffer);
+
+               merge_keys_and_selfsig(block);
+
+               fprintf(spawn->tochild,"INFO %08lX%08lX BEGIN\n",
+                       (ulong)block->pkt->pkt.public_key->keyid[0],
+                       (ulong)block->pkt->pkt.public_key->keyid[1]);
+
+               for(node=block;node;node=node->next)
+                 {
+                   switch(node->pkt->pkttype)
+                     {
+                     default:
+                       continue;
+
+                     case PKT_PUBLIC_KEY:
+                     case PKT_PUBLIC_SUBKEY:
+                       {
+                         PKT_public_key *pk=node->pkt->pkt.public_key;
+
+                         keyid_from_pk(pk,NULL);
+
+                         fprintf(spawn->tochild,"%sb:%08lX%08lX:%u:%u:%u:%u:",
+                                 node->pkt->pkttype==PKT_PUBLIC_KEY?"pu":"su",
+                                 (ulong)pk->keyid[0],(ulong)pk->keyid[1],
+                                 pk->pubkey_algo,
+                                 nbits_from_pk(pk),
+                                 pk->timestamp,
+                                 pk->expiredate);
+
+                         if(pk->is_revoked)
+                           fprintf(spawn->tochild,"r");
+                         if(pk->has_expired)
+                           fprintf(spawn->tochild,"e");
+
+                         fprintf(spawn->tochild,"\n");
+                       }
+                       break;
+
+                     case PKT_USER_ID:
+                       {
+                         PKT_user_id *uid=node->pkt->pkt.user_id;
+                         int r;
+
+                         if(uid->attrib_data)
+                           continue;
+
+                         fprintf(spawn->tochild,"uid:");
+
+                         /* Quote ':', '%', and any 8-bit
+                            characters */
+                         for(r=0;r<uid->len;r++)
+                           {
+                             if(uid->name[r]==':' || uid->name[r]=='%'
+                                || uid->name[r]&0x80)
+                               fprintf(spawn->tochild,"%%%02X",
+                                       (byte)uid->name[r]);
+                             else
+                               fprintf(spawn->tochild,"%c",uid->name[r]);
+                           }
+
+                         fprintf(spawn->tochild,":%u:%u:",
+                                 uid->created,uid->expiredate);
+
+                         if(uid->is_revoked)
+                           fprintf(spawn->tochild,"r");
+                         if(uid->is_expired)
+                           fprintf(spawn->tochild,"e");
+
+                         fprintf(spawn->tochild,"\n");
+                       }
+                       break;
+
+                       /* This bit is really for the benefit of
+                          people who store their keys in LDAP
+                          servers.  It makes it easy to do queries
+                          for things like "all keys signed by
+                          Isabella". */
+                     case PKT_SIGNATURE:
+                       {
+                         PKT_signature *sig=node->pkt->pkt.signature;
+
+                         if(!IS_UID_SIG(sig))
+                           continue;
+
+                         fprintf(spawn->tochild,"sig:%08lX%08lX:%X:%u:%u\n",
+                                 (ulong)sig->keyid[0],(ulong)sig->keyid[1],
+                                 sig->sig_class,sig->timestamp,
+                                 sig->expiredate);
+                       }
+                       break;
+                     }
+                 }
+
+               fprintf(spawn->tochild,"INFO %08lX%08lX END\n",
+                       (ulong)block->pkt->pkt.public_key->keyid[0],
+                       (ulong)block->pkt->pkt.public_key->keyid[1]);
+
+               fprintf(spawn->tochild,"KEY %08lX%08lX BEGIN\n",
+                       (ulong)block->pkt->pkt.public_key->keyid[0],
+                       (ulong)block->pkt->pkt.public_key->keyid[1]);
+               fwrite(iobuf_get_temp_buffer(buffer),
+                      iobuf_get_temp_length(buffer),1,spawn->tochild);
+               fprintf(spawn->tochild,"KEY %08lX%08lX END\n",
+                       (ulong)block->pkt->pkt.public_key->keyid[0],
+                       (ulong)block->pkt->pkt.public_key->keyid[1]);
+
+               iobuf_close(buffer);
+
+               if(keyserver->host)
+                 log_info(_("sending key %s to %s server %s\n"),
+                          keystr(block->pkt->pkt.public_key->keyid),
+                          keyserver->scheme,keyserver->host);
+               else
+                 log_info(_("sending key %s to %s\n"),
+                          keystr(block->pkt->pkt.public_key->keyid),
+                          keyserver->uri);
+
+               release_kbnode(block);
+             }
+
+           free_strlist(temp);
+         }
+
+       break;
+      }
+
+    case KS_SEARCH:
+      {
+       STRLIST key;
+
+       fprintf(spawn->tochild,"COMMAND SEARCH\n\n");
+
+       /* Which keys do we want?  Remember that the gpgkeys_ program
+           is going to lump these together into a search string. */
+
+       for(key=list;key!=NULL;key=key->next)
+         {
+           fprintf(spawn->tochild,"%s\n",key->d);
+           if(key!=list)
+             {
+               searchstr=xrealloc(searchstr,
+                                   strlen(searchstr)+strlen(key->d)+2);
+               strcat(searchstr," ");
+             }
+           else
+             {
+               searchstr=xmalloc(strlen(key->d)+1);
+               searchstr[0]='\0';
+             }
+
+           strcat(searchstr,key->d);
+         }
+
+       fprintf(spawn->tochild,"\n");
+
+       if(keyserver->host)
+         log_info(_("searching for \"%s\" from %s server %s\n"),
+                  searchstr,keyserver->scheme,keyserver->host);
+       else
+         log_info(_("searching for \"%s\" from %s\n"),
+                  searchstr,keyserver->uri);
+
+       break;
+      }
+
+    default:
+      log_fatal(_("no keyserver action!\n"));
+      break;
+    }
+
+  /* Done sending, so start reading. */
+  ret=exec_read(spawn);
+  if(ret)
+    goto fail;
+
+  /* Now handle the response */
+
+  for(;;)
+    {
+      int plen;
+      char *ptr;
+
+      maxlen=1024;
+      if(iobuf_read_line(spawn->fromchild,&line,&buflen,&maxlen)==0)
+       {
+         ret=G10ERR_READ_FILE;
+         goto fail; /* i.e. EOF */
+       }
+
+      ptr=line;
+
+      /* remove trailing whitespace */
+      plen=strlen(ptr);
+      while(plen>0 && ascii_isspace(ptr[plen-1]))
+       plen--;
+      plen[ptr]='\0';
+
+      if(*ptr=='\0')
+       break;
+
+      if(ascii_strncasecmp(ptr,"VERSION ",8)==0)
+       {
+         gotversion=1;
+
+         if(atoi(&ptr[8])!=KEYSERVER_PROTO_VERSION)
+           {
+             log_error(_("invalid keyserver protocol (us %d!=handler %d)\n"),
+                       KEYSERVER_PROTO_VERSION,atoi(&ptr[8]));
+             goto fail;
+           }
+       }
+      else if(ascii_strncasecmp(ptr,"PROGRAM ",8)==0)
+       {
+         if(ascii_strncasecmp(&ptr[8],VERSION,strlen(VERSION))!=0)
+           log_info(_("WARNING: keyserver handler from a different"
+                      " version of GnuPG (%s)\n"),&ptr[8]);
+       }
+      else if(ascii_strncasecmp(ptr,"OPTION OUTOFBAND",16)==0)
+       outofband=1; /* Currently the only OPTION */
+    }
+
+  if(!gotversion)
+    {
+      log_error(_("keyserver did not send VERSION\n"));
+      goto fail;
+    }
+
+  if(!outofband)
+    switch(action)
+      {
+      case KS_GET:
+      case KS_GETNAME:
+       {
+         void *stats_handle;
+
+         stats_handle=import_new_stats_handle();
+
+         /* Slurp up all the key data.  In the future, it might be
+            nice to look for KEY foo OUTOFBAND and FAILED indicators.
+            It's harmless to ignore them, but ignoring them does make
+            gpg complain about "no valid OpenPGP data found".  One
+            way to do this could be to continue parsing this
+            line-by-line and make a temp iobuf for each key. */
+
+         import_keys_stream(spawn->fromchild,stats_handle,fpr,fpr_len,
+                            opt.keyserver_options.import_options);
+
+         import_print_stats(stats_handle);
+         import_release_stats_handle(stats_handle);
+
+         break;
+       }
+
+       /* Nothing to do here */
+      case KS_SEND:
+       break;
+
+      case KS_SEARCH:
+       keyserver_search_prompt(spawn->fromchild,searchstr);
+       break;
+
+      default:
+       log_fatal(_("no keyserver action!\n"));
+       break;
+      }
+
+ fail:
+  xfree(line);
+  xfree(searchstr);
+
+
+  *prog=exec_finish(spawn);
+
+  return ret;
+}
+
+static int 
+keyserver_work(enum ks_action action,STRLIST list,KEYDB_SEARCH_DESC *desc,
+              int count,unsigned char **fpr,size_t *fpr_len,
+              struct keyserver_spec *keyserver)
+{
+  int rc=0,ret=0;
+
+  if(!keyserver)
+    {
+      log_error(_("no keyserver known (use option --keyserver)\n"));
+      return G10ERR_BAD_URI;
+    }
+
+#ifdef DISABLE_KEYSERVER_HELPERS
+
+  log_error(_("external keyserver calls are not supported in this build\n"));
+  return G10ERR_KEYSERVER;
+
+#else
+  /* Spawn a handler */
+
+  rc=keyserver_spawn(action,list,desc,count,&ret,fpr,fpr_len,keyserver);
+  if(ret)
+    {
+      switch(ret)
+       {
+       case KEYSERVER_SCHEME_NOT_FOUND:
+         log_error(_("no handler for keyserver scheme `%s'\n"),
+                   keyserver->scheme);
+         break;
+
+       case KEYSERVER_NOT_SUPPORTED:
+         log_error(_("action `%s' not supported with keyserver "
+                     "scheme `%s'\n"),
+                   action==KS_GET?"get":action==KS_SEND?"send":
+                   action==KS_SEARCH?"search":"unknown",
+                   keyserver->scheme);
+         break;
+
+       case KEYSERVER_VERSION_ERROR:
+         log_error(_(GPGKEYS_PREFIX "%s does not support"
+                     " handler version %d\n"),
+                   keyserver_typemap(keyserver->scheme),
+                   KEYSERVER_PROTO_VERSION);
+         break;
+
+       case KEYSERVER_TIMEOUT:
+         log_error(_("keyserver timed out\n"));
+         break;
+
+       case KEYSERVER_INTERNAL_ERROR:
+       default:
+         log_error(_("keyserver internal error\n"));
+         break;
+       }
+
+      return G10ERR_KEYSERVER;
+    }
+
+  if(rc)
+    {
+      log_error(_("keyserver communications error: %s\n"),g10_errstr(rc));
+
+      return rc;
+    }
+
+  return 0;
+#endif /* ! DISABLE_KEYSERVER_HELPERS*/
+}
+
+int 
+keyserver_export(STRLIST users)
+{
+  STRLIST sl=NULL;
+  KEYDB_SEARCH_DESC desc;
+  int rc=0;
+
+  /* Weed out descriptors that we don't support sending */
+  for(;users;users=users->next)
+    {
+      classify_user_id (users->d, &desc);
+      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)
+       {
+         log_error(_("\"%s\" not a key ID: skipping\n"),users->d);
+         continue;
+       }
+      else
+       append_to_strlist(&sl,users->d);
+    }
+
+  if(sl)
+    {
+      rc=keyserver_work(KS_SEND,sl,NULL,0,NULL,NULL,opt.keyserver);
+      free_strlist(sl);
+    }
+
+  return rc;
+}
+
+int 
+keyserver_import(STRLIST users)
+{
+  KEYDB_SEARCH_DESC *desc;
+  int num=100,count=0;
+  int rc=0;
+
+  /* Build a list of key ids */
+  desc=xmalloc(sizeof(KEYDB_SEARCH_DESC)*num);
+
+  for(;users;users=users->next)
+    {
+      classify_user_id (users->d, &desc[count]);
+      if(desc[count].mode!=KEYDB_SEARCH_MODE_SHORT_KID &&
+        desc[count].mode!=KEYDB_SEARCH_MODE_LONG_KID &&
+        desc[count].mode!=KEYDB_SEARCH_MODE_FPR16 &&
+        desc[count].mode!=KEYDB_SEARCH_MODE_FPR20)
+       {
+         log_error(_("\"%s\" not a key ID: skipping\n"),users->d);
+         continue;
+       }
+
+      count++;
+      if(count==num)
+       {
+         num+=100;
+         desc=xrealloc(desc,sizeof(KEYDB_SEARCH_DESC)*num);
+       }
+    }
+
+  if(count>0)
+    rc=keyserver_work(KS_GET,NULL,desc,count,NULL,NULL,opt.keyserver);
+
+  xfree(desc);
+
+  return rc;
+}
+
+int
+keyserver_import_fprint(const byte *fprint,size_t fprint_len,
+                       struct keyserver_spec *keyserver)
+{
+  KEYDB_SEARCH_DESC desc;
+
+  memset(&desc,0,sizeof(desc));
+
+  if(fprint_len==16)
+    desc.mode=KEYDB_SEARCH_MODE_FPR16;
+  else if(fprint_len==20)
+    desc.mode=KEYDB_SEARCH_MODE_FPR20;
+  else
+    return -1;
+
+  memcpy(desc.u.fpr,fprint,fprint_len);
+
+  /* TODO: Warn here if the fingerprint we got doesn't match the one
+     we asked for? */
+  return keyserver_work(KS_GET,NULL,&desc,1,NULL,NULL,keyserver);
+}
+
+int 
+keyserver_import_keyid(u32 *keyid,struct keyserver_spec *keyserver)
+{
+  KEYDB_SEARCH_DESC desc;
+
+  memset(&desc,0,sizeof(desc));
+
+  desc.mode=KEYDB_SEARCH_MODE_LONG_KID;
+  desc.u.kid[0]=keyid[0];
+  desc.u.kid[1]=keyid[1];
+
+  return keyserver_work(KS_GET,NULL,&desc,1,NULL,NULL,keyserver);
+}
+
+/* code mostly stolen from do_export_stream */
+static int 
+keyidlist(STRLIST users,KEYDB_SEARCH_DESC **klist,int *count,int fakev3)
+{
+  int rc=0,ndesc,num=100;
+  KBNODE keyblock=NULL,node;
+  KEYDB_HANDLE kdbhd;
+  KEYDB_SEARCH_DESC *desc;
+  STRLIST sl;
+
+  *count=0;
+
+  *klist=xmalloc(sizeof(KEYDB_SEARCH_DESC)*num);
+
+  kdbhd=keydb_new(0);
+
+  if(!users)
+    {
+      ndesc = 1;
+      desc = xmalloc_clear ( ndesc * sizeof *desc);
+      desc[0].mode = KEYDB_SEARCH_MODE_FIRST;
+    }
+  else
+    {
+      for (ndesc=0, sl=users; sl; sl = sl->next, ndesc++) 
+       ;
+      desc = xmalloc ( ndesc * sizeof *desc);
+        
+      for (ndesc=0, sl=users; sl; sl = sl->next)
+       {
+         if(classify_user_id (sl->d, desc+ndesc))
+           ndesc++;
+         else
+           log_error (_("key \"%s\" not found: %s\n"),
+                      sl->d, g10_errstr (G10ERR_INV_USER_ID));
+       }
+    }
+
+  while (!(rc = keydb_search (kdbhd, desc, ndesc)))
+    {
+      if (!users) 
+       desc[0].mode = KEYDB_SEARCH_MODE_NEXT;
+
+      /* read the keyblock */
+      rc = keydb_get_keyblock (kdbhd, &keyblock );
+      if( rc )
+       {
+         log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+         goto leave;
+       }
+
+      if((node=find_kbnode(keyblock,PKT_PUBLIC_KEY)))
+       {
+         /* This is to work around a bug in some keyservers (pksd and
+             OKS) that calculate v4 RSA keyids as if they were v3 RSA.
+             The answer is to refresh both the correct v4 keyid
+             (e.g. 99242560) and the fake v3 keyid (e.g. 68FDDBC7).
+             This only happens for key refresh using the HKP scheme
+             and if the refresh-add-fake-v3-keyids keyserver option is
+             set. */
+         if(fakev3 && is_RSA(node->pkt->pkt.public_key->pubkey_algo) &&
+            node->pkt->pkt.public_key->version>=4)
+           {
+             (*klist)[*count].mode=KEYDB_SEARCH_MODE_LONG_KID;
+             mpi_get_keyid(node->pkt->pkt.public_key->pkey[0],
+                           (*klist)[*count].u.kid);
+             (*count)++;
+
+             if(*count==num)
+               {
+                 num+=100;
+                 *klist=xrealloc(*klist,sizeof(KEYDB_SEARCH_DESC)*num);
+               }
+           }
+
+         /* v4 keys get full fingerprints.  v3 keys get long keyids.
+             This is because it's easy to calculate any sort of keyid
+             from a v4 fingerprint, but not a v3 fingerprint. */
+
+         if(node->pkt->pkt.public_key->version<4)
+           {
+             (*klist)[*count].mode=KEYDB_SEARCH_MODE_LONG_KID;
+             keyid_from_pk(node->pkt->pkt.public_key,
+                           (*klist)[*count].u.kid);
+           }
+         else
+           {
+             size_t dummy;
+
+             (*klist)[*count].mode=KEYDB_SEARCH_MODE_FPR20;
+             fingerprint_from_pk(node->pkt->pkt.public_key,
+                                 (*klist)[*count].u.fpr,&dummy);
+           }
+
+         /* This is a little hackish, using the skipfncvalue as a
+            void* pointer to the keyserver spec, but we don't need
+            the skipfnc here, and it saves having an additional field
+            for this (which would be wasted space most of the
+            time). */
+
+         (*klist)[*count].skipfncvalue=NULL;
+
+         /* Are we honoring preferred keyservers? */
+         if(opt.keyserver_options.options&KEYSERVER_HONOR_KEYSERVER_URL)
+           {
+             PKT_user_id *uid=NULL;
+             PKT_signature *sig=NULL;
+
+             merge_keys_and_selfsig(keyblock);
+
+             for(node=node->next;node;node=node->next)
+               {
+                 if(node->pkt->pkttype==PKT_USER_ID
+                    && node->pkt->pkt.user_id->is_primary)
+                   uid=node->pkt->pkt.user_id;
+                 else if(node->pkt->pkttype==PKT_SIGNATURE
+                         && node->pkt->pkt.signature->
+                         flags.chosen_selfsig && uid)
+                   {
+                     sig=node->pkt->pkt.signature;
+                     break;
+                   }
+               }
+
+             /* Try and parse the keyserver URL.  If it doesn't work,
+                then we end up writing NULL which indicates we are
+                the same as any other key. */
+             if(sig)
+               (*klist)[*count].skipfncvalue=parse_preferred_keyserver(sig);
+           }
+
+         (*count)++;
+
+         if(*count==num)
+           {
+             num+=100;
+             *klist=xrealloc(*klist,sizeof(KEYDB_SEARCH_DESC)*num);
+           }
+       }
+    }
+
+  if(rc==-1)
+    rc=0;
+  
+ leave:
+  if(rc)
+    xfree(*klist);
+  xfree(desc);
+  keydb_release(kdbhd);
+  release_kbnode(keyblock);
+
+  return rc;
+}
+
+/* Note this is different than the original HKP refresh.  It allows
+   usernames to refresh only part of the keyring. */
+
+int
+keyserver_refresh(STRLIST users)
+{
+  int rc,count,numdesc,fakev3=0;
+  KEYDB_SEARCH_DESC *desc;
+  unsigned int options=opt.keyserver_options.import_options;
+
+  /* We switch merge-only on during a refresh, as 'refresh' should
+     never import new keys, even if their keyids match. */
+  opt.keyserver_options.import_options|=IMPORT_MERGE_ONLY;
+
+  /* Similarly, we switch on fast-import, since refresh may make
+     multiple import sets (due to preferred keyserver URLs).  We don't
+     want each set to rebuild the trustdb.  Instead we do it once at
+     the end here. */
+  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. */
+  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))
+    fakev3=1;
+
+  rc=keyidlist(users,&desc,&numdesc,fakev3);
+  if(rc)
+    return rc;
+
+  count=numdesc;
+  if(count>0)
+    {
+      int i;
+
+      /* Try to handle preferred keyserver keys first */
+      for(i=0;i<numdesc;i++)
+       {
+         if(desc[i].skipfncvalue)
+           {
+             struct keyserver_spec *keyserver=desc[i].skipfncvalue;
+
+             /* We use the keyserver structure we parsed out before.
+                Note that a preferred keyserver without a scheme://
+                will be interpreted as hkp:// */
+
+             rc=keyserver_work(KS_GET,NULL,&desc[i],1,NULL,NULL,keyserver);
+             if(rc)
+               log_info(_("WARNING: unable to refresh key %s"
+                          " via %s: %s\n"),keystr_from_desc(&desc[i]),
+                        keyserver->uri,g10_errstr(rc));
+             else
+               {
+                 /* We got it, so mark it as NONE so we don't try and
+                    get it again from the regular keyserver. */
+
+                 desc[i].mode=KEYDB_SEARCH_MODE_NONE;
+                 count--;
+               }
+
+             free_keyserver_spec(keyserver);
+           }
+       }
+    }
+
+  if(count>0)
+    {
+      if(opt.keyserver)
+       {
+         if(count==1)
+           log_info(_("refreshing 1 key from %s\n"),opt.keyserver->uri);
+         else
+           log_info(_("refreshing %d keys from %s\n"),
+                    count,opt.keyserver->uri);
+       }
+
+      rc=keyserver_work(KS_GET,NULL,desc,numdesc,NULL,NULL,opt.keyserver);
+    }
+
+  xfree(desc);
+
+  opt.keyserver_options.import_options=options;
+
+  /* If the original options didn't have fast import, and the trustdb
+     is dirty, rebuild. */
+  if(!(opt.keyserver_options.import_options&IMPORT_FAST))
+    trustdb_check_or_update();
+
+  return rc;
+}
+
+int
+keyserver_search(STRLIST tokens)
+{
+  if(tokens)
+    return keyserver_work(KS_SEARCH,tokens,NULL,0,NULL,NULL,opt.keyserver);
+  else
+    return 0;
+}
+
+int
+keyserver_fetch(STRLIST urilist)
+{
+  KEYDB_SEARCH_DESC desc;
+  STRLIST sl;
+  unsigned int options=opt.keyserver_options.import_options;
+
+  /* Switch on fast-import, since fetch can handle more than one
+     import and we don't want each set to rebuild the trustdb.
+     Instead we do it once at the end. */
+  opt.keyserver_options.import_options|=IMPORT_FAST;
+
+  /* A dummy desc since we're not actually fetching a particular key
+     ID */
+  memset(&desc,0,sizeof(desc));
+  desc.mode=KEYDB_SEARCH_MODE_EXACT;
+
+  for(sl=urilist;sl;sl=sl->next)
+    {
+      struct keyserver_spec *spec;
+
+      spec=parse_keyserver_uri(sl->d,1,NULL,0);
+      if(spec)
+       {
+         int rc;
+
+         rc=keyserver_work(KS_GET,NULL,&desc,1,NULL,NULL,spec);
+         if(rc)
+           log_info (_("WARNING: unable to fetch URI %s: %s\n"),
+                    sl->d,g10_errstr(rc));
+
+         free_keyserver_spec(spec);
+       }
+      else
+       log_info (_("WARNING: unable to parse URI %s\n"),sl->d);
+    }
+
+  opt.keyserver_options.import_options=options;
+
+  /* If the original options didn't have fast import, and the trustdb
+     is dirty, rebuild. */
+  if(!(opt.keyserver_options.import_options&IMPORT_FAST))
+    trustdb_check_or_update();
+
+  return 0;
+}
+
+/* Import key in a CERT or pointed to by a CERT */
+int
+keyserver_import_cert(const char *name,unsigned char **fpr,size_t *fpr_len)
+{
+  char *domain,*look,*url;
+  IOBUF key;
+  int type,rc=G10ERR_GENERAL;
+
+  look=xstrdup(name);
+
+  domain=strrchr(look,'@');
+  if(domain)
+    *domain='.';
+
+  type=get_cert(look,max_cert_size,&key,fpr,fpr_len,&url);
+  if(type==1)
+    {
+      int armor_status=opt.no_armor;
+
+      /* CERTs are always in binary format */
+      opt.no_armor=1;
+
+      rc=import_keys_stream(key,NULL,fpr,fpr_len,
+                           opt.keyserver_options.import_options);
+
+      opt.no_armor=armor_status;
+
+      iobuf_close(key);
+    }
+  else if(type==2 && *fpr)
+    {
+      /* We only consider the IPGP type if a fingerprint was provided.
+        This lets us select the right key regardless of what a URL
+        points to, or get the key from a keyserver. */
+      if(url)
+       {
+         struct keyserver_spec *spec;
+
+         spec=parse_keyserver_uri(url,1,NULL,0);
+         if(spec)
+           {
+             STRLIST list=NULL;
+
+             add_to_strlist(&list,url);
+
+             rc=keyserver_fetch(list);
+
+             free_strlist(list);
+             free_keyserver_spec(spec);
+           }
+       }
+      else if(opt.keyserver)
+       {
+         /* If only a fingerprint is provided, try and fetch it from
+            our --keyserver */
+
+         rc=keyserver_import_fprint(*fpr,*fpr_len,opt.keyserver);
+       }
+      else
+       log_info(_("no keyserver known (use option --keyserver)\n"));
+
+      /* Give a better string here? "CERT fingerprint for \"%s\"
+        found, but no keyserver" " known (use option
+        --keyserver)\n" ? */
+
+      xfree(url);
+    }
+
+  xfree(look);
+
+  return rc;
+}
+
+/* Import key pointed to by a PKA record. Return the requested
+   fingerprint in fpr. */
+int
+keyserver_import_pka(const char *name,unsigned char **fpr,size_t *fpr_len)
+{
+  char *uri;
+  int rc=-1;
+
+  *fpr=xmalloc(20);
+  *fpr_len=20;
+
+  uri = get_pka_info (name, *fpr);
+  if (uri)
+    {
+      struct keyserver_spec *spec;
+      spec = parse_keyserver_uri (uri, 1, NULL, 0);
+      if (spec)
+       {
+         rc=keyserver_import_fprint (*fpr, 20, spec);
+         free_keyserver_spec (spec);
+       }
+      xfree (uri);
+    }
+
+  if(rc!=0)
+    xfree(*fpr);
+
+  return rc;
+}
+
+/* Import all keys that match name */
+int
+keyserver_import_name(const char *name,unsigned char **fpr,size_t *fpr_len,
+                     struct keyserver_spec *keyserver)
+{
+  STRLIST list=NULL;
+  int rc;
+
+  append_to_strlist(&list,name);
+
+  rc=keyserver_work(KS_GETNAME,list,NULL,0,fpr,fpr_len,keyserver);
+
+  free_strlist(list);
+
+  return rc;
+}
+
+/* Use the PGP Universal trick of asking ldap://keys.(maildomain) for
+   the key. */
+int
+keyserver_import_ldap(const char *name,unsigned char **fpr,size_t *fpr_len)
+{
+  char *domain;
+  struct keyserver_spec *keyserver;
+  STRLIST list=NULL;
+  int rc;
+
+  append_to_strlist(&list,name);
+
+  /* Parse out the domain */
+  domain=strrchr(name,'@');
+  if(!domain)
+    return G10ERR_GENERAL;
+
+  domain++;
+
+  keyserver=xmalloc_clear(sizeof(struct keyserver_spec));
+
+  keyserver->scheme=xstrdup("ldap");
+  keyserver->host=xmalloc(5+strlen(domain)+1);
+  strcpy(keyserver->host,"keys.");
+  strcat(keyserver->host,domain);
+  keyserver->uri=xmalloc(strlen(keyserver->scheme)+
+                        3+strlen(keyserver->host)+1);
+  strcpy(keyserver->uri,keyserver->scheme);
+  strcat(keyserver->uri,"://");
+  strcat(keyserver->uri,keyserver->host);
+    
+  rc=keyserver_work(KS_GETNAME,list,NULL,0,fpr,fpr_len,keyserver);
+
+  free_strlist(list);
+
+  free_keyserver_spec(keyserver);
+
+  return rc;
+}
diff --git a/g10/main.h b/g10/main.h
new file mode 100644 (file)
index 0000000..7abb2b3
--- /dev/null
@@ -0,0 +1,300 @@
+/* main.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_MAIN_H
+#define G10_MAIN_H
+#include "types.h"
+#include "iobuf.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "keydb.h"
+
+/* It could be argued that the default cipher should be 3DES rather
+   than CAST5, and the default compression should be 0
+   (i.e. uncompressed) rather than 1 (zip).  However, the real world
+   issues of speed and size come into play here. */
+
+#define DEFAULT_CIPHER_ALGO     CIPHER_ALGO_CAST5
+#define DEFAULT_DIGEST_ALGO     DIGEST_ALGO_SHA1
+#define DEFAULT_COMPRESS_ALGO   COMPRESS_ALGO_ZIP
+#define DEFAULT_S2K_DIGEST_ALGO DIGEST_ALGO_SHA1
+
+#define S2K_DIGEST_ALGO (opt.s2k_digest_algo?opt.s2k_digest_algo:DEFAULT_S2K_DIGEST_ALGO)
+
+typedef struct
+{
+  int header_okay;
+  PK_LIST pk_list;
+  DEK *symkey_dek;
+  STRING2KEY *symkey_s2k;
+  cipher_filter_context_t cfx;
+} encrypt_filter_context_t;
+
+struct groupitem
+{
+  char *name;
+  STRLIST values;
+  struct groupitem *next;
+};
+
+/*-- gpg.c --*/
+extern int g10_errors_seen;
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
+  void g10_exit(int rc) __attribute__ ((noreturn));
+#else
+  void g10_exit(int rc);
+#endif
+void print_pubkey_algo_note( int algo );
+void print_cipher_algo_note( int algo );
+void print_digest_algo_note( int algo );
+
+/*-- armor.c --*/
+char *make_radix64_string( const byte *data, size_t len );
+
+/*-- misc.c --*/
+void trap_unaligned(void);
+int disable_core_dumps(void);
+void register_secured_file (const char *fname);
+void unregister_secured_file (const char *fname);
+int  is_secured_file (int fd);
+int  is_secured_filename (const char *fname);
+u16 checksum_u16( unsigned n );
+u16 checksum( byte *p, unsigned n );
+u16 checksum_mpi( MPI a );
+u32 buffer_to_u32( const byte *buffer );
+const byte *get_session_marker( size_t *rlen );
+int openpgp_cipher_test_algo( int algo );
+int openpgp_pk_test_algo( int algo, unsigned int usage_flags );
+int openpgp_pk_algo_usage ( int algo );
+int openpgp_md_test_algo( int algo );
+
+#ifdef USE_IDEA
+void idea_cipher_warn( int show );
+#else
+#define idea_cipher_warn(a)
+#endif
+
+struct expando_args
+{
+  PKT_public_key *pk;
+  PKT_secret_key *sk;
+  byte imagetype;
+};
+
+char *pct_expando(const char *string,struct expando_args *args);
+void deprecated_warning(const char *configname,unsigned int configlineno,
+                       const char *option,const char *repl1,const char *repl2);
+void deprecated_command (const char *name);
+
+const char *compress_algo_to_string(int algo);
+int string_to_compress_algo(const char *string);
+int check_compress_algo(int algo);
+int default_cipher_algo(void);
+int default_compress_algo(void);
+const char *compliance_option_string(void);
+void compliance_failure(void);
+
+struct parse_options
+{
+  char *name;
+  unsigned int bit;
+  char **value;
+  char *help;
+};
+
+char *optsep(char **stringp);
+char *argsplit(char *string);
+int parse_options(char *str,unsigned int *options,
+                 struct parse_options *opts,int noisy);
+char *unescape_percent_string (const unsigned char *s);
+int has_invalid_email_chars (const char *s);
+int is_valid_mailbox (const char *name);
+char *default_homedir (void);
+const char *get_libexecdir (void);
+int path_access(const char *file,int mode);
+
+/*-- helptext.c --*/
+void display_online_help( const char *keyword );
+
+/*-- encode.c --*/
+int setup_symkey(STRING2KEY **symkey_s2k,DEK **symkey_dek);
+int encode_symmetric( const char *filename );
+int encode_store( const char *filename );
+int encode_crypt( const char *filename, STRLIST remusr, int use_symkey );
+void encode_crypt_files(int nfiles, char **files, STRLIST remusr);
+int encrypt_filter( void *opaque, int control,
+                   IOBUF a, byte *buf, size_t *ret_len);
+
+
+/*-- sign.c --*/
+int complete_sig( PKT_signature *sig, PKT_secret_key *sk, MD_HANDLE md );
+int sign_file( STRLIST filenames, int detached, STRLIST locusr,
+              int do_encrypt, STRLIST remusr, const char *outfile );
+int clearsign_file( const char *fname, STRLIST locusr, const char *outfile );
+int sign_symencrypt_file (const char *fname, STRLIST locusr);
+
+/*-- sig-check.c --*/
+int check_revocation_keys (PKT_public_key *pk, PKT_signature *sig);
+int check_backsig(PKT_public_key *main_pk,PKT_public_key *sub_pk,
+                 PKT_signature *backsig);
+int check_key_signature( KBNODE root, KBNODE node, int *is_selfsig );
+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 );
+
+/*-- delkey.c --*/
+int delete_keys( STRLIST names, int secret, int allow_both );
+
+/*-- keyedit.c --*/
+void keyedit_menu( const char *username, STRLIST locusr,
+                  STRLIST commands, int quiet, int seckey_check );
+void show_basic_key_info (KBNODE keyblock);
+
+/*-- keygen.c --*/
+u32 parse_expire_string(const char *string);
+u32 ask_expire_interval(int object,const char *def_expire);
+u32 ask_expiredate(void);
+void generate_keypair( const char *fname, const char *card_serialno,
+                       const char *backup_encryption_dir );
+int keygen_set_std_prefs (const char *string,int personal);
+PKT_user_id *keygen_get_std_prefs (void);
+int keygen_add_key_expire( PKT_signature *sig, void *opaque );
+int keygen_add_std_prefs( PKT_signature *sig, void *opaque );
+int keygen_upd_std_prefs( PKT_signature *sig, void *opaque );
+int keygen_add_keyserver_url(PKT_signature *sig, void *opaque);
+int keygen_add_notations(PKT_signature *sig,void *opaque);
+int keygen_add_revkey(PKT_signature *sig, void *opaque);
+int make_backsig(PKT_signature *sig,PKT_public_key *pk,
+                PKT_public_key *sub_pk,PKT_secret_key *sub_sk);
+int generate_subkeypair( KBNODE pub_keyblock, KBNODE sec_keyblock );
+#ifdef ENABLE_CARD_SUPPORT
+int generate_card_subkeypair (KBNODE pub_keyblock, KBNODE sec_keyblock,
+                              int keyno, const char *serialno);
+int save_unprotected_key_to_card (PKT_secret_key *sk, int keyno);
+#endif
+
+/*-- openfile.c --*/
+int overwrite_filep( const char *fname );
+char *make_outfile_name( const char *iname );
+char *ask_outfile_name( const char *name, size_t namelen );
+int   open_outfile( const char *iname, int mode, IOBUF *a );
+IOBUF open_sigfile( const char *iname, progress_filter_context_t *pfx );
+void try_make_homedir( const char *fname );
+
+/*-- seskey.c --*/
+void make_session_key( DEK *dek );
+MPI encode_session_key( DEK *dek, unsigned nbits );
+MPI encode_md_value( PKT_public_key *pk, PKT_secret_key *sk,
+                    MD_HANDLE md, int hash_algo );
+
+/*-- import.c --*/
+int parse_import_options(char *str,unsigned int *options,int noisy);
+void import_keys( char **fnames, int nnames,
+                 void *stats_hd, unsigned int options );
+int import_keys_stream( IOBUF inp,void *stats_hd,unsigned char **fpr,
+                       size_t *fpr_len,unsigned int options );
+void *import_new_stats_handle (void);
+void import_release_stats_handle (void *p);
+void import_print_stats (void *hd);
+
+int collapse_uids( KBNODE *keyblock );
+
+int auto_create_card_key_stub ( const char *serialnostr, 
+                                const unsigned char *fpr1,
+                                const unsigned char *fpr2,
+                                const unsigned char *fpr3);
+
+/*-- export.c --*/
+int parse_export_options(char *str,unsigned int *options,int noisy);
+int export_pubkeys( STRLIST users, unsigned int options );
+int export_pubkeys_stream( IOBUF out, STRLIST users,
+                          KBNODE *keyblock_out, unsigned int options );
+int export_seckeys( STRLIST users );
+int export_secsubkeys( STRLIST users );
+
+/* dearmor.c --*/
+int dearmor_file( const char *fname );
+int enarmor_file( const char *fname );
+
+/*-- revoke.c --*/
+struct revocation_reason_info;
+int gen_revoke( const char *uname );
+int gen_desig_revoke( const char *uname, STRLIST locusr);
+int revocation_reason_build_cb( PKT_signature *sig, void *opaque );
+struct revocation_reason_info *
+               ask_revocation_reason( int key_rev, int cert_rev, int hint );
+void release_revocation_reason_info( struct revocation_reason_info *reason );
+
+/*-- keylist.c --*/
+void public_key_list( STRLIST list );
+void secret_key_list( STRLIST list );
+void print_subpackets_colon(PKT_signature *sig);
+void reorder_keyblock (KBNODE keyblock);
+void list_keyblock( KBNODE keyblock, int secret, int fpr, void *opaque );
+void print_fingerprint (PKT_public_key *pk, PKT_secret_key *sk, int mode);
+void print_revokers(PKT_public_key *pk);
+void show_policy_url(PKT_signature *sig,int indent,int mode);
+void show_keyserver_url(PKT_signature *sig,int indent,int mode);
+void show_notation(PKT_signature *sig,int indent,int mode,int which);
+void dump_attribs(const PKT_user_id *uid,
+                 PKT_public_key *pk,PKT_secret_key *sk);
+void set_attrib_fd(int fd);
+void print_seckey_info (PKT_secret_key *sk);
+void print_pubkey_info (FILE *fp, PKT_public_key *pk);
+void print_card_key_info (FILE *fp, KBNODE keyblock);
+
+/*-- verify.c --*/
+void print_file_status( int status, const char *name, int what );
+int verify_signatures( int nfiles, char **files );
+int verify_files( int nfiles, char **files );
+
+/*-- decrypt.c --*/
+int decrypt_message( const char *filename );
+void decrypt_messages(int nfiles, char *files[]);
+
+/*-- plaintext.c --*/
+int hash_datafiles( MD_HANDLE md, MD_HANDLE md2,
+                   STRLIST files, const char *sigfilename, int textmode );
+PKT_plaintext *setup_plaintext_name(const char *filename,IOBUF iobuf);
+
+/*-- pipemode.c --*/
+void run_in_pipemode (void);
+
+/*-- signal.c --*/
+void init_signals(void);
+void pause_on_sigusr( int which );
+void block_all_signals(void);
+void unblock_all_signals(void);
+
+
+#ifdef ENABLE_CARD_SUPPORT
+/*-- card-util.c --*/
+void change_pin (int no, int allow_admin);
+void card_status (FILE *fp, char *serialno, size_t serialnobuflen);
+void card_edit (STRLIST commands);
+int  card_generate_subkey (KBNODE pub_keyblock, KBNODE sec_keyblock);
+int  card_store_subkey (KBNODE node, int use);
+#endif
+
+#define S2K_DECODE_COUNT(_val) ((16ul + ((_val) & 15)) << (((_val) >> 4) + 6))
+
+#endif /*G10_MAIN_H*/
diff --git a/g10/mainproc.c b/g10/mainproc.c
new file mode 100644 (file)
index 0000000..cb4432a
--- /dev/null
@@ -0,0 +1,2083 @@
+/* mainproc.c - handle packets
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+
+#include "packet.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "options.h"
+#include "util.h"
+#include "cipher.h"
+#include "keydb.h"
+#include "filter.h"
+#include "main.h"
+#include "status.h"
+#include "i18n.h"
+#include "trustdb.h"
+#include "keyserver-internal.h"
+#include "photoid.h"
+
+
+struct kidlist_item {
+    struct kidlist_item *next;
+    u32 kid[2];
+    int pubkey_algo;
+    int reason;
+};
+
+
+/****************
+ * Structure to hold the context
+ */
+typedef struct mainproc_context *CTX;
+struct mainproc_context
+{
+  struct mainproc_context *anchor;  /* May be useful in the future. */
+  PKT_public_key *last_pubkey;
+  PKT_secret_key *last_seckey;
+  PKT_user_id     *last_user_id;
+  md_filter_context_t mfx;
+  int sigs_only;    /* Process only signatures and reject all other stuff. */
+  int encrypt_only; /* Process only encryption messages. */
+  STRLIST signed_data;
+  const char *sigfilename;
+  DEK *dek;
+  int last_was_session_key;
+  KBNODE list;      /* The current list of packets. */
+  int have_data;
+  IOBUF iobuf;      /* Used to get the filename etc. */
+  int trustletter;  /* Temporary usage in list_node. */
+  ulong symkeys;
+  struct kidlist_item *pkenc_list; /* List of encryption packets. */
+  struct 
+  {
+    int op;
+    int stop_now;
+  } pipemode;
+  int any_sig_seen;  /* Set to true if a signature packet has been seen. */
+};
+
+
+static int do_proc_packets( CTX c, IOBUF a );
+
+static void list_node( CTX c, KBNODE node );
+static void proc_tree( CTX c, KBNODE node );
+
+
+static void
+release_list( CTX c )
+{
+    if( !c->list )
+       return;
+    proc_tree(c, c->list );
+    release_kbnode( c->list );
+    while( c->pkenc_list ) {
+       struct kidlist_item *tmp = c->pkenc_list->next;
+       xfree( c->pkenc_list );
+       c->pkenc_list = tmp;
+    }
+    c->pkenc_list = NULL;
+    c->list = NULL;
+    c->have_data = 0;
+    c->last_was_session_key = 0;
+    c->pipemode.op = 0;
+    c->pipemode.stop_now = 0;
+    xfree(c->dek); c->dek = NULL;
+}
+
+
+static int
+add_onepass_sig( CTX c, PACKET *pkt )
+{
+  KBNODE node;
+
+  if ( c->list ) /* add another packet */
+    add_kbnode( c->list, new_kbnode( pkt ));
+  else /* insert the first one */
+    c->list = node = new_kbnode( pkt );
+
+  return 1;
+}
+
+
+static int
+add_gpg_control( CTX c, PACKET *pkt )
+{
+    if ( pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START ) {
+        /* New clear text signature.
+         * Process the last one and reset everything */
+        release_list(c);
+    }   
+    else if ( pkt->pkt.gpg_control->control == CTRLPKT_PIPEMODE ) {
+        /* Pipemode control packet */
+        if ( pkt->pkt.gpg_control->datalen < 2 ) 
+            log_fatal ("invalid pipemode control packet length\n");
+        if (pkt->pkt.gpg_control->data[0] == 1) {
+            /* start the whole thing */
+            assert ( !c->list ); /* we should be in a pretty virgin state */
+            assert ( !c->pipemode.op );
+            c->pipemode.op = pkt->pkt.gpg_control->data[1];
+        }
+        else if (pkt->pkt.gpg_control->data[0] == 2) {
+            /* the signed material follows in a plaintext packet */
+            assert ( c->pipemode.op == 'B' );
+        }
+        else if (pkt->pkt.gpg_control->data[0] == 3) {
+            assert ( c->pipemode.op == 'B' );
+            release_list (c);
+            /* and tell the outer loop to terminate */
+            c->pipemode.stop_now = 1;
+        }
+        else 
+            log_fatal ("invalid pipemode control packet code\n");
+        return 0; /* no need to store the packet */
+    }   
+
+    if( c->list )  /* add another packet */
+        add_kbnode( c->list, new_kbnode( pkt ));
+    else /* insert the first one */
+       c->list = new_kbnode( pkt );
+
+    return 1;
+}
+
+
+
+static int
+add_user_id( CTX c, PACKET *pkt )
+{
+    if( !c->list ) {
+       log_error("orphaned user ID\n" );
+       return 0;
+    }
+    add_kbnode( c->list, new_kbnode( pkt ) );
+    return 1;
+}
+
+static int
+add_subkey( CTX c, PACKET *pkt )
+{
+    if( !c->list ) {
+       log_error("subkey w/o mainkey\n" );
+       return 0;
+    }
+    add_kbnode( c->list, new_kbnode( pkt ) );
+    return 1;
+}
+
+static int
+add_ring_trust( CTX c, PACKET *pkt )
+{
+    if( !c->list ) {
+       log_error("ring trust w/o key\n" );
+       return 0;
+    }
+    add_kbnode( c->list, new_kbnode( pkt ) );
+    return 1;
+}
+
+
+static int
+add_signature( CTX c, PACKET *pkt )
+{
+    KBNODE node;
+
+    c->any_sig_seen = 1;
+    if( pkt->pkttype == PKT_SIGNATURE && !c->list ) {
+       /* This is the first signature for the following datafile.
+        * GPG does not write such packets; instead it always uses
+        * onepass-sig packets.  The drawback of PGP's method
+        * of prepending the signature to the data is
+        * that it is not possible to make a signature from data read
+        * from stdin.  (GPG is able to read PGP stuff anyway.) */
+       node = new_kbnode( pkt );
+       c->list = node;
+       return 1;
+    }
+    else if( !c->list )
+       return 0; /* oops (invalid packet sequence)*/
+    else if( !c->list->pkt )
+       BUG();  /* so nicht */
+
+    /* add a new signature node id at the end */
+    node = new_kbnode( pkt );
+    add_kbnode( c->list, node );
+    return 1;
+}
+
+static int
+symkey_decrypt_seskey( DEK *dek, byte *seskey, size_t slen )
+{
+  CIPHER_HANDLE hd;
+
+  if(slen < 17 || slen > 33)
+    {
+      log_error ( _("weird size for an encrypted session key (%d)\n"),
+                 (int)slen);
+      return G10ERR_BAD_KEY;
+    }
+
+  hd = cipher_open( dek->algo, CIPHER_MODE_CFB, 1 );
+  cipher_setkey( hd, dek->key, dek->keylen );
+  cipher_setiv( hd, NULL, 0 );
+  cipher_decrypt( hd, seskey, seskey, slen );
+  cipher_close( hd );
+
+  /* now we replace the dek components with the real session key to
+     decrypt the contents of the sequencing packet. */
+
+  dek->keylen=slen-1;
+  dek->algo=seskey[0];
+
+  if(dek->keylen > DIM(dek->key))
+    BUG ();
+
+  /* This is not completely accurate, since a bad passphrase may have
+     resulted in a garbage algorithm byte, but it's close enough since
+     a bogus byte here will fail later. */
+  if(dek->algo==CIPHER_ALGO_IDEA)
+    idea_cipher_warn(0);
+
+  memcpy(dek->key, seskey + 1, dek->keylen);
+
+  /*log_hexdump( "thekey", dek->key, dek->keylen );*/
+
+  return 0;
+}   
+
+static void
+proc_symkey_enc( CTX c, PACKET *pkt )
+{
+    PKT_symkey_enc *enc;
+
+    enc = pkt->pkt.symkey_enc;
+    if (!enc)
+        log_error ("invalid symkey encrypted packet\n");
+    else if(!c->dek)
+      {
+        int algo = enc->cipher_algo;
+       const char *s = cipher_algo_to_string (algo);
+
+       if(s)
+         {
+           if(!opt.quiet)
+             {
+               if(enc->seskeylen)
+                 log_info(_("%s encrypted session key\n"), s );
+               else
+                 log_info(_("%s encrypted data\n"), s );
+             }
+         }
+       else
+         log_error(_("encrypted with unknown algorithm %d\n"), algo );
+
+       if(check_digest_algo(enc->s2k.hash_algo))
+         {
+           log_error(_("passphrase generated with unknown digest"
+                       " algorithm %d\n"),enc->s2k.hash_algo);
+           s=NULL;
+         }
+
+       c->last_was_session_key = 2;
+       if(!s || opt.list_only)
+         goto leave;
+
+       if(opt.override_session_key)
+         {
+           c->dek = xmalloc_clear( sizeof *c->dek );
+           if(get_override_session_key(c->dek, opt.override_session_key))
+             {
+               xfree(c->dek);
+               c->dek = NULL;
+             }
+         }
+       else
+         {
+            int canceled;
+
+           c->dek = passphrase_to_dek (NULL, 0, algo, &enc->s2k, 0,
+                                        NULL, &canceled);
+            if (canceled)
+              {
+                /* For unknown reasons passphrase_to_dek does only
+                   return NULL if a new passphrase has been requested
+                   and has not been repeated correctly.  Thus even
+                   with a cancel requested (by means of the gpg-agent)
+                   it won't return NULL but an empty passphrase.  We
+                   take the most conservative approach for now and
+                   work around it right here. */
+                xfree (c->dek);
+                c->dek = NULL;
+              }
+
+           if(c->dek)
+             {
+               c->dek->symmetric=1;
+
+               /* FIXME: This doesn't work perfectly if a symmetric
+                  key comes before a public key in the message - if
+                  the user doesn't know the passphrase, then there is
+                  a chance that the "decrypted" algorithm will happen
+                  to be a valid one, which will make the returned dek
+                  appear valid, so we won't try any public keys that
+                  come later. */
+               if(enc->seskeylen)
+                 {
+                   if(symkey_decrypt_seskey(c->dek, enc->seskey,
+                                            enc->seskeylen))
+                     {
+                       xfree(c->dek);
+                       c->dek=NULL;
+                     }
+                 }
+               else
+                 c->dek->algo_info_printed = 1;
+             }
+         }
+      }
+
+ leave:
+    c->symkeys++;
+    free_packet(pkt);
+}
+
+static void
+proc_pubkey_enc( CTX c, PACKET *pkt )
+{
+    PKT_pubkey_enc *enc;
+    int result = 0;
+
+    /* check whether the secret key is available and store in this case */
+    c->last_was_session_key = 1;
+    enc = pkt->pkt.pubkey_enc;
+    /*printf("enc: encrypted by a pubkey with keyid %08lX\n", enc->keyid[1] );*/
+    /* Hmmm: why do I have this algo check here - anyway there is
+     * function to check it. */
+    if( opt.verbose )
+       log_info(_("public key is %s\n"), keystr(enc->keyid) );
+
+    if( is_status_enabled() ) {
+       char buf[50];
+       sprintf(buf, "%08lX%08lX %d 0",
+               (ulong)enc->keyid[0], (ulong)enc->keyid[1], enc->pubkey_algo );
+       write_status_text( STATUS_ENC_TO, buf );
+    }
+
+    if( !opt.list_only && opt.override_session_key ) {
+       /* It does not make much sense to store the session key in
+        * secure memory because it has already been passed on the
+        * command line and the GCHQ knows about it.  */
+       c->dek = xmalloc_clear( sizeof *c->dek );
+       result = get_override_session_key ( c->dek, opt.override_session_key );
+       if ( result ) {
+           xfree(c->dek); c->dek = NULL;
+       }
+    }
+    else if( is_ELGAMAL(enc->pubkey_algo)
+       || enc->pubkey_algo == PUBKEY_ALGO_DSA
+       || is_RSA(enc->pubkey_algo)  ) {
+      /* FIXME:  strore this all in a list and process it later */
+
+       if ( !c->dek && ((!enc->keyid[0] && !enc->keyid[1])
+                          || opt.try_all_secrets
+                         || !seckey_available( enc->keyid )) ) {
+           if( opt.list_only )
+               result = -1;
+           else {
+               c->dek = xmalloc_secure_clear( sizeof *c->dek );
+               if( (result = get_session_key( enc, c->dek )) ) {
+                   /* error: delete the DEK */
+                   xfree(c->dek); c->dek = NULL;
+               }
+           }
+       }
+       else
+           result = G10ERR_NO_SECKEY;
+    }
+    else
+       result = G10ERR_PUBKEY_ALGO;
+
+    if( result == -1 )
+       ;
+    else
+      {
+        /* store it for later display */
+       struct kidlist_item *x = xmalloc( sizeof *x );
+       x->kid[0] = enc->keyid[0];
+       x->kid[1] = enc->keyid[1];
+       x->pubkey_algo = enc->pubkey_algo;
+       x->reason = result;
+       x->next = c->pkenc_list;
+       c->pkenc_list = x;
+
+        if( !result && opt.verbose > 1 )
+         log_info( _("public key encrypted data: good DEK\n") );
+      }
+
+    free_packet(pkt);
+}
+
+
+
+/****************
+ * Print the list of public key encrypted packets which we could
+ * not decrypt.
+ */
+static void
+print_pkenc_list( struct kidlist_item *list, int failed )
+{
+    for( ; list; list = list->next ) {
+       PKT_public_key *pk;
+       const char *algstr;
+        
+        if ( failed && !list->reason )
+            continue;
+        if ( !failed && list->reason )
+            continue;
+
+        algstr = pubkey_algo_to_string( list->pubkey_algo );
+        pk = xmalloc_clear( sizeof *pk );
+
+       if( !algstr )
+           algstr = "[?]";
+       pk->pubkey_algo = list->pubkey_algo;
+       if( !get_pubkey( pk, list->kid ) )
+         {
+           char *p;
+           log_info( _("encrypted with %u-bit %s key, ID %s, created %s\n"),
+                     nbits_from_pk( pk ), algstr, keystr_from_pk(pk),
+                     strtimestamp(pk->timestamp) );
+           p=get_user_id_native(list->kid);
+           fprintf(log_stream(),_("      \"%s\"\n"),p);
+           xfree(p);
+         }
+       else
+         log_info(_("encrypted with %s key, ID %s\n"),
+                  algstr,keystr(list->kid));
+
+       free_public_key( pk );
+
+       if( list->reason == G10ERR_NO_SECKEY ) {
+           if( is_status_enabled() ) {
+               char buf[20];
+               sprintf(buf,"%08lX%08lX", (ulong)list->kid[0],
+                                         (ulong)list->kid[1] );
+               write_status_text( STATUS_NO_SECKEY, buf );
+           }
+       }
+       else if (list->reason)
+           log_info(_("public key decryption failed: %s\n"),
+                                               g10_errstr(list->reason));
+    }
+}
+
+
+static void
+proc_encrypted( CTX c, PACKET *pkt )
+{
+    int result = 0;
+
+    if (!opt.quiet)
+      {
+       if(c->symkeys>1)
+         log_info(_("encrypted with %lu passphrases\n"),c->symkeys);
+       else if(c->symkeys==1)
+         log_info(_("encrypted with 1 passphrase\n"));
+        print_pkenc_list ( c->pkenc_list, 1 );
+        print_pkenc_list ( c->pkenc_list, 0 );
+      }
+
+    /* FIXME: Figure out the session key by looking at all pkenc packets. */
+
+
+    write_status( STATUS_BEGIN_DECRYPTION );
+
+    /*log_debug("dat: %sencrypted data\n", c->dek?"":"conventional ");*/
+    if( opt.list_only )
+       result = -1;
+    else if( !c->dek && !c->last_was_session_key ) {
+        int algo;
+        STRING2KEY s2kbuf, *s2k = NULL;
+
+       if(opt.override_session_key)
+         {
+           c->dek = xmalloc_clear( sizeof *c->dek );
+           result=get_override_session_key(c->dek, opt.override_session_key);
+           if(result)
+             {
+               xfree(c->dek);
+               c->dek = NULL;
+             }
+         }
+       else
+         {
+           /* assume this is old style conventional encrypted data */
+           if ( (algo = opt.def_cipher_algo))
+             log_info (_("assuming %s encrypted data\n"),
+                        cipher_algo_to_string(algo));
+           else if ( check_cipher_algo(CIPHER_ALGO_IDEA) )
+             {
+               algo = opt.def_cipher_algo;
+               if (!algo)
+                 algo = opt.s2k_cipher_algo;
+               idea_cipher_warn(1);
+               log_info (_("IDEA cipher unavailable, "
+                           "optimistically attempting to use %s instead\n"),
+                         cipher_algo_to_string(algo));
+             }
+           else
+             {
+               algo = CIPHER_ALGO_IDEA;
+               if (!opt.s2k_digest_algo)
+                 {
+                   /* If no digest is given we assume MD5 */
+                   s2kbuf.mode = 0;
+                   s2kbuf.hash_algo = DIGEST_ALGO_MD5;
+                   s2k = &s2kbuf;
+                 }
+               log_info (_("assuming %s encrypted data\n"), "IDEA");
+             }
+
+           c->dek = passphrase_to_dek ( NULL, 0, algo, s2k, 0, NULL, NULL );
+           if (c->dek)
+             c->dek->algo_info_printed = 1;
+         }
+    }
+    else if( !c->dek )
+       result = G10ERR_NO_SECKEY;
+    if( !result )
+       result = decrypt_data( c, pkt->pkt.encrypted, c->dek );
+
+    if( result == -1 )
+       ;
+    else if( !result || (result==G10ERR_BAD_SIGN && opt.ignore_mdc_error)) {
+       write_status( STATUS_DECRYPTION_OKAY );
+       if( opt.verbose > 1 )
+           log_info(_("decryption okay\n"));
+       if( pkt->pkt.encrypted->mdc_method && !result )
+           write_status( STATUS_GOODMDC );
+       else if(!opt.no_mdc_warn)
+           log_info (_("WARNING: message was not integrity protected\n"));
+       if(opt.show_session_key)
+         {
+           int i;
+           char *buf = xmalloc ( c->dek->keylen*2 + 20 );
+           sprintf ( buf, "%d:", c->dek->algo );
+           for(i=0; i < c->dek->keylen; i++ )
+             sprintf(buf+strlen(buf), "%02X", c->dek->key[i] );
+           log_info( "session key: `%s'\n", buf );
+           write_status_text ( STATUS_SESSION_KEY, buf );
+         }
+    }
+    else if( result == G10ERR_BAD_SIGN ) {
+       log_error(_("WARNING: encrypted message has been manipulated!\n"));
+       write_status( STATUS_BADMDC );
+       write_status( STATUS_DECRYPTION_FAILED );
+    }
+    else {
+       write_status( STATUS_DECRYPTION_FAILED );
+       log_error(_("decryption failed: %s\n"), g10_errstr(result));
+       /* Hmmm: does this work when we have encrypted using multiple
+        * ways to specify the session key (symmmetric and PK)*/
+    }
+    xfree(c->dek); c->dek = NULL;
+    free_packet(pkt);
+    c->last_was_session_key = 0;
+    write_status( STATUS_END_DECRYPTION );
+}
+
+
+static void
+proc_plaintext( CTX c, PACKET *pkt )
+{
+    PKT_plaintext *pt = pkt->pkt.plaintext;
+    int any, clearsig, only_md5, rc;
+    KBNODE n;
+
+    if( pt->namelen == 8 && !memcmp( pt->name, "_CONSOLE", 8 ) )
+       log_info(_("NOTE: sender requested \"for-your-eyes-only\"\n"));
+    else if( opt.verbose )
+       log_info(_("original file name='%.*s'\n"), pt->namelen, pt->name);
+    free_md_filter_context( &c->mfx );
+    c->mfx.md = md_open( 0, 0);
+    /* fixme: we may need to push the textfilter if we have sigclass 1
+     * and no armoring - Not yet tested
+     * Hmmm, why don't we need it at all if we have sigclass 1
+     * Should we assume that plaintext in mode 't' has always sigclass 1??
+     * See: Russ Allbery's mail 1999-02-09
+     */
+    any = clearsig = only_md5 = 0;
+    for(n=c->list; n; n = n->next )
+      {
+       if( n->pkt->pkttype == PKT_ONEPASS_SIG )
+         {
+           /* For the onepass signature case */
+           if( n->pkt->pkt.onepass_sig->digest_algo )
+             {
+               md_enable( c->mfx.md, n->pkt->pkt.onepass_sig->digest_algo );
+               if( !any && n->pkt->pkt.onepass_sig->digest_algo
+                   == DIGEST_ALGO_MD5 )
+                 only_md5 = 1;
+               else
+                 only_md5 = 0;
+               any = 1;
+             }
+           if( n->pkt->pkt.onepass_sig->sig_class != 0x01 )
+             only_md5 = 0;
+         }
+       else if( n->pkt->pkttype == PKT_GPG_CONTROL
+                 && n->pkt->pkt.gpg_control->control
+                == CTRLPKT_CLEARSIGN_START )
+         {
+           /* For the clearsigned message case */
+            size_t datalen = n->pkt->pkt.gpg_control->datalen;
+            const byte *data = n->pkt->pkt.gpg_control->data;
+
+            /* check that we have at least the sigclass and one hash */
+            if ( datalen < 2 )
+             log_fatal("invalid control packet CTRLPKT_CLEARSIGN_START\n"); 
+            /* Note that we don't set the clearsig flag for not-dash-escaped
+             * documents */
+            clearsig = (*data == 0x01);
+            for( data++, datalen--; datalen; datalen--, data++ )
+             md_enable( c->mfx.md, *data );
+            any = 1;
+            break;  /* Stop here as one-pass signature packets are not
+                       expected.  */
+         }
+       else if(n->pkt->pkttype==PKT_SIGNATURE)
+         {
+           /* For the SIG+LITERAL case that PGP used to use. */
+           md_enable( c->mfx.md, n->pkt->pkt.signature->digest_algo );
+           any=1;
+         }
+      }
+
+    if( !any && !opt.skip_verify )
+      {
+       /* This is for the old GPG LITERAL+SIG case.  It's not legal
+          according to 2440, so hopefully it won't come up that
+          often.  There is no good way to specify what algorithms to
+          use in that case, so these three are the historical
+          answer. */
+       md_enable( c->mfx.md, DIGEST_ALGO_RMD160 );
+       md_enable( c->mfx.md, DIGEST_ALGO_SHA1 );
+       md_enable( c->mfx.md, DIGEST_ALGO_MD5 );
+      }
+    if( opt.pgp2_workarounds && only_md5 && !opt.skip_verify ) {
+       /* This is a kludge to work around a bug in pgp2.  It does only
+        * catch those mails which are armored.  To catch the non-armored
+        * pgp mails we could see whether there is the signature packet
+        * in front of the plaintext.  If someone needs this, send me a patch.
+        */
+       c->mfx.md2 = md_open( DIGEST_ALGO_MD5, 0);
+    }
+    if ( DBG_HASHING ) {
+       md_start_debug( c->mfx.md, "verify" );
+       if ( c->mfx.md2  )
+           md_start_debug( c->mfx.md2, "verify2" );
+    }
+    if ( c->pipemode.op == 'B' )
+        rc = handle_plaintext( pt, &c->mfx, 1, 0 );
+    else {
+        rc = handle_plaintext( pt, &c->mfx, c->sigs_only, clearsig );
+        if( rc == G10ERR_CREATE_FILE && !c->sigs_only) {
+            /* can't write output but we hash it anyway to
+             * check the signature */
+            rc = handle_plaintext( pt, &c->mfx, 1, clearsig );
+        }
+    }
+    if( rc )
+       log_error( "handle plaintext failed: %s\n", g10_errstr(rc));
+    free_packet(pkt);
+    c->last_was_session_key = 0;
+
+    /* We add a marker control packet instead of the plaintext packet.
+     * This is so that we can later detect invalid packet sequences.
+     */
+    n = new_kbnode (create_gpg_control (CTRLPKT_PLAINTEXT_MARK, NULL, 0));
+    if (c->list)
+        add_kbnode (c->list, n);
+    else 
+        c->list = n;
+}
+
+
+static int
+proc_compressed_cb( IOBUF a, void *info )
+{
+    return proc_signature_packets( info, a, ((CTX)info)->signed_data,
+                                           ((CTX)info)->sigfilename );
+}
+
+static int
+proc_encrypt_cb( IOBUF a, void *info )
+{
+    return proc_encryption_packets( info, a );
+}
+
+static void
+proc_compressed( CTX c, PACKET *pkt )
+{
+    PKT_compressed *zd = pkt->pkt.compressed;
+    int rc;
+
+    /*printf("zip: compressed data packet\n");*/
+    if( !zd->algorithm )
+      rc=G10ERR_COMPR_ALGO;
+    else if( c->sigs_only )
+       rc = handle_compressed( c, zd, proc_compressed_cb, c );
+    else if( c->encrypt_only )
+       rc = handle_compressed( c, zd, proc_encrypt_cb, c );
+    else
+       rc = handle_compressed( c, zd, NULL, NULL );
+    if( rc )
+       log_error("uncompressing failed: %s\n", g10_errstr(rc));
+    free_packet(pkt);
+    c->last_was_session_key = 0;
+}
+
+/****************
+ * check the signature
+ * Returns: 0 = valid signature or an error code
+ */
+static int
+do_check_sig( CTX c, KBNODE node, int *is_selfsig,
+             int *is_expkey, int *is_revkey )
+{
+    PKT_signature *sig;
+    MD_HANDLE md = NULL, md2 = NULL;
+    int algo, rc;
+
+    assert( node->pkt->pkttype == PKT_SIGNATURE );
+    if( is_selfsig )
+       *is_selfsig = 0;
+    sig = node->pkt->pkt.signature;
+
+    algo = sig->digest_algo;
+    if( (rc=check_digest_algo(algo)) )
+       return rc;
+
+    if( sig->sig_class == 0x00 ) {
+       if( c->mfx.md )
+           md = md_copy( c->mfx.md );
+       else /* detached signature */
+           md = md_open( 0, 0 ); /* signature_check() will enable the md*/
+    }
+    else if( sig->sig_class == 0x01 ) {
+       /* how do we know that we have to hash the (already hashed) text
+        * in canonical mode ??? (calculating both modes???) */
+       if( c->mfx.md ) {
+           md = md_copy( c->mfx.md );
+           if( c->mfx.md2 )
+              md2 = md_copy( c->mfx.md2 );
+       }
+       else { /* detached signature */
+         log_debug("Do we really need this here?");
+           md = md_open( 0, 0 ); /* signature_check() will enable the md*/
+           md2 = md_open( 0, 0 );
+       }
+    }
+    else if( (sig->sig_class&~3) == 0x10
+            || sig->sig_class == 0x18
+             || sig->sig_class == 0x1f
+            || sig->sig_class == 0x20
+            || sig->sig_class == 0x28
+            || sig->sig_class == 0x30  ) { 
+       if( c->list->pkt->pkttype == PKT_PUBLIC_KEY
+           || c->list->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+           return check_key_signature( c->list, node, is_selfsig );
+       }
+       else if( sig->sig_class == 0x20 ) {
+           log_error (_("standalone revocation - "
+                         "use \"gpg --import\" to apply\n"));
+           return G10ERR_NOT_PROCESSED;
+       }
+       else {
+           log_error("invalid root packet for sigclass %02x\n",
+                                                       sig->sig_class);
+           return G10ERR_SIG_CLASS;
+       }
+    }
+    else
+       return G10ERR_SIG_CLASS;
+    rc = signature_check2( sig, md, NULL, is_expkey, is_revkey, NULL );
+    if( rc == G10ERR_BAD_SIGN && md2 )
+       rc = signature_check2( sig, md2, NULL, is_expkey, is_revkey, NULL );
+    md_close(md);
+    md_close(md2);
+
+    return rc;
+}
+
+
+static void
+print_userid( PACKET *pkt )
+{
+    if( !pkt )
+       BUG();
+    if( pkt->pkttype != PKT_USER_ID ) {
+       printf("ERROR: unexpected packet type %d", pkt->pkttype );
+       return;
+    }
+    if( opt.with_colons )
+      {
+       if(pkt->pkt.user_id->attrib_data)
+         printf("%u %lu",
+                pkt->pkt.user_id->numattribs,
+                pkt->pkt.user_id->attrib_len);
+       else
+         print_string( stdout,  pkt->pkt.user_id->name,
+                       pkt->pkt.user_id->len, ':');
+      }
+    else
+       print_utf8_string( stdout,  pkt->pkt.user_id->name,
+                                    pkt->pkt.user_id->len );
+}
+
+
+/****************
+ * List the certificate in a user friendly way
+ */
+
+static void
+list_node( CTX c, KBNODE node )
+{
+    int any=0;
+    int mainkey;
+
+    if( !node )
+       ;
+    else if( (mainkey = (node->pkt->pkttype == PKT_PUBLIC_KEY) )
+            || node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+       PKT_public_key *pk = node->pkt->pkt.public_key;
+
+       if( opt.with_colons )
+         {
+           u32 keyid[2];
+           keyid_from_pk( pk, keyid );
+           if( mainkey )
+             c->trustletter = opt.fast_list_mode?
+               0 : get_validity_info( pk, NULL );
+           printf("%s:", mainkey? "pub":"sub" );
+           if( c->trustletter )
+             putchar( c->trustletter );
+           printf(":%u:%d:%08lX%08lX:%s:%s::",
+                  nbits_from_pk( pk ),
+                  pk->pubkey_algo,
+                  (ulong)keyid[0],(ulong)keyid[1],
+                  colon_datestr_from_pk( pk ),
+                  colon_strtime (pk->expiredate) );
+           if( mainkey && !opt.fast_list_mode )
+             putchar( get_ownertrust_info (pk) );
+           putchar(':');
+           if( node->next && node->next->pkt->pkttype == PKT_RING_TRUST) {
+             putchar('\n'); any=1;
+             if( opt.fingerprint )
+               print_fingerprint( pk, NULL, 0 );
+             printf("rtv:1:%u:\n",
+                    node->next->pkt->pkt.ring_trust->trustval );
+           }
+         }
+       else
+         printf("%s  %4u%c/%s %s%s",
+                mainkey? "pub":"sub", nbits_from_pk( pk ),
+                pubkey_letter( pk->pubkey_algo ), keystr_from_pk( pk ),
+                datestr_from_pk( pk ), mainkey?" ":"");
+
+       if( mainkey ) {
+           /* and now list all userids with their signatures */
+           for( node = node->next; node; node = node->next ) {
+               if( node->pkt->pkttype == PKT_SIGNATURE ) {
+                   if( !any ) {
+                       if( node->pkt->pkt.signature->sig_class == 0x20 )
+                           puts("[revoked]");
+                       else
+                           putchar('\n');
+                       any = 1;
+                   }
+                   list_node(c,  node );
+               }
+               else if( node->pkt->pkttype == PKT_USER_ID ) {
+                   if( any ) {
+                       if( opt.with_colons )
+                           printf("%s:::::::::",
+                             node->pkt->pkt.user_id->attrib_data?"uat":"uid");
+                       else
+                           printf( "uid%*s", 28, "" );
+                   }
+                   print_userid( node->pkt );
+                   if( opt.with_colons )
+                       putchar(':');
+                   putchar('\n');
+                   if( opt.fingerprint && !any )
+                       print_fingerprint( pk, NULL, 0 );
+                   if( opt.with_colons
+                        && node->next
+                       && node->next->pkt->pkttype == PKT_RING_TRUST ) {
+                       printf("rtv:2:%u:\n",
+                               node->next->pkt->pkt.ring_trust?
+                               node->next->pkt->pkt.ring_trust->trustval : 0);
+                   }
+                   any=1;
+               }
+               else if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+                   if( !any ) {
+                       putchar('\n');
+                       any = 1;
+                   }
+                   list_node(c,  node );
+               }
+           }
+       }
+       else
+         {
+           /* of subkey */
+           if( pk->is_revoked )
+             {
+               printf(" [");
+               printf(_("revoked: %s"),revokestr_from_pk(pk));
+               printf("]");
+             }
+           else if( pk->expiredate )
+             {
+               printf(" [");
+               printf(_("expires: %s"),expirestr_from_pk(pk));
+               printf("]");
+             }
+         }
+
+       if( !any )
+           putchar('\n');
+       if( !mainkey && opt.fingerprint > 1 )
+           print_fingerprint( pk, NULL, 0 );
+    }
+    else if( (mainkey = (node->pkt->pkttype == PKT_SECRET_KEY) )
+            || node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+       PKT_secret_key *sk = node->pkt->pkt.secret_key;
+
+       if( opt.with_colons )
+         {
+           u32 keyid[2];
+           keyid_from_sk( sk, keyid );
+           printf("%s::%u:%d:%08lX%08lX:%s:%s:::",
+                  mainkey? "sec":"ssb",
+                  nbits_from_sk( sk ),
+                  sk->pubkey_algo,
+                  (ulong)keyid[0],(ulong)keyid[1],
+                  colon_datestr_from_sk( sk ),
+                  colon_strtime (sk->expiredate)
+                  /* fixme: add LID */ );
+         }
+       else
+         printf("%s  %4u%c/%s %s ", mainkey? "sec":"ssb",
+                nbits_from_sk( sk ), pubkey_letter( sk->pubkey_algo ),
+                keystr_from_sk( sk ), datestr_from_sk( sk ));
+       if( mainkey ) {
+           /* and now list all userids with their signatures */
+           for( node = node->next; node; node = node->next ) {
+               if( node->pkt->pkttype == PKT_SIGNATURE ) {
+                   if( !any ) {
+                       if( node->pkt->pkt.signature->sig_class == 0x20 )
+                           puts("[revoked]");
+                       else
+                           putchar('\n');
+                       any = 1;
+                   }
+                   list_node(c,  node );
+               }
+               else if( node->pkt->pkttype == PKT_USER_ID ) {
+                   if( any ) {
+                       if( opt.with_colons )
+                           printf("%s:::::::::",
+                             node->pkt->pkt.user_id->attrib_data?"uat":"uid");
+                       else
+                           printf( "uid%*s", 28, "" );
+                   }
+                   print_userid( node->pkt );
+                   if( opt.with_colons )
+                       putchar(':');
+                   putchar('\n');
+                   if( opt.fingerprint && !any )
+                       print_fingerprint( NULL, sk, 0 );
+                   any=1;
+               }
+               else if( node->pkt->pkttype == PKT_SECRET_SUBKEY ) {
+                   if( !any ) {
+                       putchar('\n');
+                       any = 1;
+                   }
+                   list_node(c,  node );
+               }
+           }
+       }
+       if( !any )
+           putchar('\n');
+       if( !mainkey && opt.fingerprint > 1 )
+           print_fingerprint( NULL, sk, 0 );
+    }
+    else if( node->pkt->pkttype == PKT_SIGNATURE  ) {
+       PKT_signature *sig = node->pkt->pkt.signature;
+       int is_selfsig = 0;
+       int rc2=0;
+       size_t n;
+       char *p;
+       int sigrc = ' ';
+
+       if( !opt.verbose )
+           return;
+
+       if( sig->sig_class == 0x20 || sig->sig_class == 0x30 )
+           fputs("rev", stdout);
+       else
+           fputs("sig", stdout);
+       if( opt.check_sigs ) {
+           fflush(stdout);
+           switch( (rc2=do_check_sig( c, node, &is_selfsig, NULL, NULL )) ) {
+             case 0:                  sigrc = '!'; break;
+             case G10ERR_BAD_SIGN:    sigrc = '-'; break;
+             case G10ERR_NO_PUBKEY: 
+             case G10ERR_UNU_PUBKEY:  sigrc = '?'; break;
+             default:                 sigrc = '%'; break;
+           }
+       }
+       else {  /* check whether this is a self signature */
+           u32 keyid[2];
+
+           if( c->list->pkt->pkttype == PKT_PUBLIC_KEY
+               || c->list->pkt->pkttype == PKT_SECRET_KEY ) {
+               if( c->list->pkt->pkttype == PKT_PUBLIC_KEY )
+                   keyid_from_pk( c->list->pkt->pkt.public_key, keyid );
+               else
+                   keyid_from_sk( c->list->pkt->pkt.secret_key, keyid );
+
+               if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] )
+                   is_selfsig = 1;
+           }
+       }
+       if( opt.with_colons ) {
+           putchar(':');
+           if( sigrc != ' ' )
+               putchar(sigrc);
+           printf("::%d:%08lX%08lX:%s:%s:", sig->pubkey_algo,
+                  (ulong)sig->keyid[0], (ulong)sig->keyid[1],
+                  colon_datestr_from_sig(sig),
+                  colon_expirestr_from_sig(sig));
+
+           if(sig->trust_depth || sig->trust_value)
+             printf("%d %d",sig->trust_depth,sig->trust_value);
+           printf(":");
+
+           if(sig->trust_regexp)
+             print_string(stdout,sig->trust_regexp,
+                          strlen(sig->trust_regexp),':');
+           printf(":");
+       }
+       else
+         printf("%c       %s %s   ",
+                sigrc, keystr(sig->keyid), datestr_from_sig(sig));
+       if( sigrc == '%' )
+           printf("[%s] ", g10_errstr(rc2) );
+       else if( sigrc == '?' )
+           ;
+       else if( is_selfsig ) {
+           if( opt.with_colons )
+               putchar(':');
+           fputs( sig->sig_class == 0x18? "[keybind]":"[selfsig]", stdout);
+           if( opt.with_colons )
+               putchar(':');
+       }
+       else if( !opt.fast_list_mode ) {
+           p = get_user_id( sig->keyid, &n );
+           print_string( stdout, p, n, opt.with_colons );
+           xfree(p);
+       }
+       if( opt.with_colons )
+           printf(":%02x%c:", sig->sig_class, sig->flags.exportable?'x':'l');
+       putchar('\n');
+    }
+    else
+       log_error("invalid node with packet of type %d\n", node->pkt->pkttype);
+}
+
+
+
+int
+proc_packets( void *anchor, IOBUF a )
+{
+    int rc;
+    CTX c = xmalloc_clear( sizeof *c );
+
+    c->anchor = anchor;
+    rc = do_proc_packets( c, a );
+    xfree( c );
+    return rc;
+}
+
+
+
+int
+proc_signature_packets( void *anchor, IOBUF a,
+                       STRLIST signedfiles, const char *sigfilename )
+{
+    CTX c = xmalloc_clear( sizeof *c );
+    int rc;
+
+    c->anchor = anchor;
+    c->sigs_only = 1;
+    c->signed_data = signedfiles;
+    c->sigfilename = sigfilename;
+    rc = do_proc_packets( c, a );
+
+    /* If we have not encountered any signature we print an error
+       messages, send a NODATA status back and return an error code.
+       Using log_error is required because verify_files does not check
+       error codes for each file but we want to terminate the process
+       with an error. */ 
+    if (!rc && !c->any_sig_seen)
+      {
+       write_status_text (STATUS_NODATA, "4");
+        log_error (_("no signature found\n"));
+        rc = G10ERR_NO_DATA;
+      }
+
+    /* Propagate the signature seen flag upward. Do this only on
+       success so that we won't issue the nodata status several
+       times. */
+    if (!rc && c->anchor && c->any_sig_seen)
+      c->anchor->any_sig_seen = 1;
+
+    xfree( c );
+    return rc;
+}
+
+int
+proc_encryption_packets( void *anchor, IOBUF a )
+{
+    CTX c = xmalloc_clear( sizeof *c );
+    int rc;
+
+    c->anchor = anchor;
+    c->encrypt_only = 1;
+    rc = do_proc_packets( c, a );
+    xfree( c );
+    return rc;
+}
+
+
+int
+do_proc_packets( CTX c, IOBUF a )
+{
+    PACKET *pkt = xmalloc( sizeof *pkt );
+    int rc=0;
+    int any_data=0;
+    int newpkt;
+
+    c->iobuf = a;
+    init_packet(pkt);
+    while( (rc=parse_packet(a, pkt)) != -1 ) {
+       any_data = 1;
+       if( rc ) {
+           free_packet(pkt);
+            /* stop processing when an invalid packet has been encountered
+             * but don't do so when we are doing a --list-packets. */
+           if( rc == G10ERR_INVALID_PACKET && opt.list_packets != 2 )
+               break;
+           continue;
+       }
+       newpkt = -1;
+       if( opt.list_packets ) {
+           switch( pkt->pkttype ) {
+             case PKT_PUBKEY_ENC:  proc_pubkey_enc( c, pkt ); break;
+             case PKT_SYMKEY_ENC:  proc_symkey_enc( c, pkt ); break;
+             case PKT_ENCRYPTED:
+             case PKT_ENCRYPTED_MDC: proc_encrypted( c, pkt ); break;
+             case PKT_COMPRESSED:  proc_compressed( c, pkt ); break;
+             default: newpkt = 0; break;
+           }
+       }
+       else if( c->sigs_only ) {
+           switch( pkt->pkttype ) {
+             case PKT_PUBLIC_KEY:
+             case PKT_SECRET_KEY:
+             case PKT_USER_ID:
+             case PKT_SYMKEY_ENC:
+             case PKT_PUBKEY_ENC:
+             case PKT_ENCRYPTED:
+             case PKT_ENCRYPTED_MDC:
+                write_status_text( STATUS_UNEXPECTED, "0" );
+               rc = G10ERR_UNEXPECTED;
+               goto leave;
+             case PKT_SIGNATURE:   newpkt = add_signature( c, pkt ); break;
+             case PKT_PLAINTEXT:   proc_plaintext( c, pkt ); break;
+             case PKT_COMPRESSED:  proc_compressed( c, pkt ); break;
+             case PKT_ONEPASS_SIG: newpkt = add_onepass_sig( c, pkt ); break;
+              case PKT_GPG_CONTROL: newpkt = add_gpg_control(c, pkt); break;
+             default: newpkt = 0; break;
+           }
+       }
+       else if( c->encrypt_only ) {
+           switch( pkt->pkttype ) {
+             case PKT_PUBLIC_KEY:
+             case PKT_SECRET_KEY:
+             case PKT_USER_ID:
+                write_status_text( STATUS_UNEXPECTED, "0" );
+               rc = G10ERR_UNEXPECTED;
+               goto leave;
+             case PKT_SIGNATURE:   newpkt = add_signature( c, pkt ); break;
+             case PKT_SYMKEY_ENC:  proc_symkey_enc( c, pkt ); break;
+             case PKT_PUBKEY_ENC:  proc_pubkey_enc( c, pkt ); break;
+             case PKT_ENCRYPTED:
+             case PKT_ENCRYPTED_MDC: proc_encrypted( c, pkt ); break;
+             case PKT_PLAINTEXT:   proc_plaintext( c, pkt ); break;
+             case PKT_COMPRESSED:  proc_compressed( c, pkt ); break;
+             case PKT_ONEPASS_SIG: newpkt = add_onepass_sig( c, pkt ); break;
+             case PKT_GPG_CONTROL: newpkt = add_gpg_control(c, pkt); break;
+             default: newpkt = 0; break;
+           }
+       }
+       else {
+           switch( pkt->pkttype ) {
+             case PKT_PUBLIC_KEY:
+             case PKT_SECRET_KEY:
+               release_list( c );
+               c->list = new_kbnode( pkt );
+               newpkt = 1;
+               break;
+             case PKT_PUBLIC_SUBKEY:
+             case PKT_SECRET_SUBKEY:
+               newpkt = add_subkey( c, pkt );
+               break;
+             case PKT_USER_ID:     newpkt = add_user_id( c, pkt ); break;
+             case PKT_SIGNATURE:   newpkt = add_signature( c, pkt ); break;
+             case PKT_PUBKEY_ENC:  proc_pubkey_enc( c, pkt ); break;
+             case PKT_SYMKEY_ENC:  proc_symkey_enc( c, pkt ); break;
+             case PKT_ENCRYPTED:
+             case PKT_ENCRYPTED_MDC: proc_encrypted( c, pkt ); break;
+             case PKT_PLAINTEXT:   proc_plaintext( c, pkt ); break;
+             case PKT_COMPRESSED:  proc_compressed( c, pkt ); break;
+             case PKT_ONEPASS_SIG: newpkt = add_onepass_sig( c, pkt ); break;
+              case PKT_GPG_CONTROL: newpkt = add_gpg_control(c, pkt); break;
+             case PKT_RING_TRUST:  newpkt = add_ring_trust( c, pkt ); break;
+             default: newpkt = 0; break;
+           }
+       }
+        /* This is a very ugly construct and frankly, I don't remember why
+         * I used it.  Adding the MDC check here is a hack.
+         * The right solution is to initiate another context for encrypted
+         * packet and not to reuse the current one ...  It works right
+         * when there is a compression packet inbetween which adds just
+         * an extra layer.
+         * Hmmm: Rewrite this whole module here?? 
+         */
+       if( pkt->pkttype != PKT_SIGNATURE && pkt->pkttype != PKT_MDC )
+           c->have_data = pkt->pkttype == PKT_PLAINTEXT;
+
+       if( newpkt == -1 )
+           ;
+       else if( newpkt ) {
+           pkt = xmalloc( sizeof *pkt );
+           init_packet(pkt);
+       }
+       else
+           free_packet(pkt);
+        if ( c->pipemode.stop_now ) {
+            /* we won't get an EOF in pipemode, so we have to 
+             * break the loop here */ 
+            rc = -1;
+            break;
+        }
+    }
+    if( rc == G10ERR_INVALID_PACKET )
+       write_status_text( STATUS_NODATA, "3" );
+    if( any_data )
+       rc = 0;
+    else if( rc == -1 )
+       write_status_text( STATUS_NODATA, "2" );
+
+
+  leave:
+    release_list( c );
+    xfree(c->dek);
+    free_packet( pkt );
+    xfree( pkt );
+    free_md_filter_context( &c->mfx );
+    return rc;
+}
+
+
+/* Helper for pka_uri_from_sig to parse the to-be-verified address out
+   of the notation data. */
+static pka_info_t *
+get_pka_address (PKT_signature *sig)
+{
+  pka_info_t *pka = NULL;
+  struct notation *nd,*notation;
+
+  notation=sig_to_notation(sig);
+
+  for(nd=notation;nd;nd=nd->next)
+    {
+      if(strcmp(nd->name,"pka-address@gnupg.org")!=0)
+        continue; /* Not the notation we want. */
+
+      /* For now we only use the first valid PKA notation. In future
+        we might want to keep additional PKA notations in a linked
+        list. */
+      if (is_valid_mailbox (nd->value))
+       {
+         pka = xmalloc (sizeof *pka + strlen(nd->value));
+         pka->valid = 0;
+         pka->checked = 0;
+         pka->uri = NULL;
+         strcpy (pka->email, nd->value);
+         break;
+       }
+    }
+
+  free_notation(notation);
+
+  return pka;
+}
+
+
+/* Return the URI from a DNS PKA record.  If this record has already
+   be retrieved for the signature we merely return it; if not we go
+   out and try to get that DNS record. */
+static const char *
+pka_uri_from_sig (PKT_signature *sig)
+{
+  if (!sig->flags.pka_tried)
+    {
+      assert (!sig->pka_info);
+      sig->flags.pka_tried = 1;
+      sig->pka_info = get_pka_address (sig);
+      if (sig->pka_info)
+        {
+          char *uri;
+
+          uri = get_pka_info (sig->pka_info->email, sig->pka_info->fpr);
+          if (uri)
+            {
+              sig->pka_info->valid = 1;
+              if (!*uri)
+                xfree (uri);
+              else
+                sig->pka_info->uri = uri;
+            }
+        }
+    }
+  return sig->pka_info? sig->pka_info->uri : NULL;
+}
+
+
+static int
+check_sig_and_print( CTX c, KBNODE node )
+{
+  PKT_signature *sig = node->pkt->pkt.signature;
+  const char *astr;
+  int rc, is_expkey=0, is_revkey=0;
+
+  if (opt.skip_verify)
+    {
+      log_info(_("signature verification suppressed\n"));
+      return 0;
+    }
+
+  /* Check that the message composition is valid.
+
+     Per RFC-2440bis (-15) allowed:
+
+     S{1,n}           -- detached signature.
+     S{1,n} P         -- old style PGP2 signature
+     O{1,n} P S{1,n}  -- standard OpenPGP signature.
+     C P S{1,n}       -- cleartext signature.
+
+        
+          O = One-Pass Signature packet.
+          S = Signature packet.
+          P = OpenPGP Message packet (Encrypted | Compressed | Literal)
+                 (Note that the current rfc2440bis draft also allows
+                  for a signed message but that does not work as it
+                  introduces ambiguities.)
+              We keep track of these packages using the marker packet
+              CTRLPKT_PLAINTEXT_MARK.
+          C = Marker packet for cleartext signatures.
+
+     We reject all other messages.
+     
+     Actually we are calling this too often, i.e. for verification of
+     each message but better have some duplicate work than to silently
+     introduce a bug here.
+  */
+  {
+    KBNODE n;
+    int n_onepass, n_sig;
+
+/*     log_debug ("checking signature packet composition\n"); */
+/*     dump_kbnode (c->list); */
+
+    n = c->list;
+    assert (n);
+    if ( n->pkt->pkttype == PKT_SIGNATURE ) 
+      {
+        /* This is either "S{1,n}" case (detached signature) or
+           "S{1,n} P" (old style PGP2 signature). */
+        for (n = n->next; n; n = n->next)
+          if (n->pkt->pkttype != PKT_SIGNATURE)
+            break;
+        if (!n)
+          ; /* Okay, this is a detached signature.  */
+        else if (n->pkt->pkttype == PKT_GPG_CONTROL
+                 && (n->pkt->pkt.gpg_control->control
+                     == CTRLPKT_PLAINTEXT_MARK) )
+          {
+            if (n->next)
+              goto ambiguous;  /* We only allow one P packet. */
+          }
+        else
+          goto ambiguous;
+      }
+    else if (n->pkt->pkttype == PKT_ONEPASS_SIG) 
+      {
+        /* This is the "O{1,n} P S{1,n}" case (standard signature). */
+        for (n_onepass=1, n = n->next;
+             n && n->pkt->pkttype == PKT_ONEPASS_SIG; n = n->next)
+          n_onepass++;
+        if (!n || !(n->pkt->pkttype == PKT_GPG_CONTROL
+                    && (n->pkt->pkt.gpg_control->control
+                        == CTRLPKT_PLAINTEXT_MARK)))
+          goto ambiguous;
+        for (n_sig=0, n = n->next;
+             n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
+          n_sig++;
+        if (!n_sig)
+          goto ambiguous;
+        if (n && !opt.allow_multisig_verification)
+          goto ambiguous;
+        if (n_onepass != n_sig)
+          {
+            log_info ("number of one-pass packets does not match "
+                      "number of signature packets\n");
+            goto ambiguous;
+          }
+      }
+    else if (n->pkt->pkttype == PKT_GPG_CONTROL
+             && n->pkt->pkt.gpg_control->control == CTRLPKT_CLEARSIGN_START )
+      {
+        /* This is the "C P S{1,n}" case (clear text signature). */
+        n = n->next;
+        if (!n || !(n->pkt->pkttype == PKT_GPG_CONTROL
+                    && (n->pkt->pkt.gpg_control->control
+                        == CTRLPKT_PLAINTEXT_MARK)))
+          goto ambiguous;
+        for (n_sig=0, n = n->next;
+             n && n->pkt->pkttype == PKT_SIGNATURE; n = n->next)
+          n_sig++;
+        if (n || !n_sig)
+          goto ambiguous;
+      }
+    else 
+      {
+      ambiguous:
+        log_error(_("can't handle this ambiguous signature data\n"));
+        return 0;
+      }
+
+  }
+
+  /* (Indendation below not yet changed to GNU style.) */
+
+    astr = pubkey_algo_to_string( sig->pubkey_algo );
+    if(keystrlen()>8)
+      {
+       log_info(_("Signature made %s\n"),asctimestamp(sig->timestamp));
+       log_info(_("               using %s key %s\n"),
+                astr? astr: "?",keystr(sig->keyid));
+      }
+    else
+      log_info(_("Signature made %s using %s key ID %s\n"),
+              asctimestamp(sig->timestamp), astr? astr: "?",
+              keystr(sig->keyid));
+
+    rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey );
+
+    /* If the key isn't found, check for a preferred keyserver */
+
+    if(rc==G10ERR_NO_PUBKEY && sig->flags.pref_ks)
+      {
+       const byte *p;
+       int seq=0;
+       size_t n;
+
+       while((p=enum_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,&n,&seq,NULL)))
+         {
+           /* According to my favorite copy editor, in English
+              grammar, you say "at" if the key is located on a web
+              page, but "from" if it is located on a keyserver.  I'm
+              not going to even try to make two strings here :) */
+           log_info(_("Key available at: ") );
+           print_utf8_string( log_stream(), p, n );
+           putc( '\n', log_stream() );
+
+           if(opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE
+              && opt.keyserver_options.options&KEYSERVER_HONOR_KEYSERVER_URL)
+             {
+               struct keyserver_spec *spec;
+
+               spec=parse_preferred_keyserver(sig);
+               if(spec)
+                 {
+                   int res;
+
+                   glo_ctrl.in_auto_key_retrieve++;
+                   res=keyserver_import_keyid(sig->keyid,spec);
+                   glo_ctrl.in_auto_key_retrieve--;
+                   if(!res)
+                     rc=do_check_sig(c, node, NULL, &is_expkey, &is_revkey );
+                   free_keyserver_spec(spec);
+
+                   if(!rc)
+                     break;
+                 }
+             }
+         }
+      }
+
+    /* If the preferred keyserver thing above didn't work, our second
+       try is to use the URI from a DNS PKA record. */
+    if ( rc == G10ERR_NO_PUBKEY 
+        && opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE
+         && opt.keyserver_options.options&KEYSERVER_HONOR_PKA_RECORD)
+      {
+        const char *uri = pka_uri_from_sig (sig);
+        
+        if (uri)
+          {
+            /* FIXME: We might want to locate the key using the
+               fingerprint instead of the keyid. */
+            int res;
+            struct keyserver_spec *spec;
+            
+            spec = parse_keyserver_uri (uri, 1, NULL, 0);
+            if (spec)
+              {
+                glo_ctrl.in_auto_key_retrieve++;
+                res = keyserver_import_keyid (sig->keyid, spec);
+                glo_ctrl.in_auto_key_retrieve--;
+                free_keyserver_spec (spec);
+                if (!res)
+                  rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey );
+              }
+          }
+      }
+
+    /* If the preferred keyserver thing above didn't work and we got
+       no information from the DNS PKA, this is a third try. */
+
+    if( rc == G10ERR_NO_PUBKEY && opt.keyserver
+       && opt.keyserver_options.options&KEYSERVER_AUTO_KEY_RETRIEVE)
+      {
+       int res;
+
+       glo_ctrl.in_auto_key_retrieve++;
+       res=keyserver_import_keyid ( sig->keyid, opt.keyserver );
+       glo_ctrl.in_auto_key_retrieve--;
+       if(!res)
+         rc = do_check_sig(c, node, NULL, &is_expkey, &is_revkey );
+      }
+
+    if( !rc || rc == G10ERR_BAD_SIGN ) {
+       KBNODE un, keyblock;
+       int count=0, statno;
+        char keyid_str[50];
+       PKT_public_key *pk=NULL;
+
+       if(rc)
+         statno=STATUS_BADSIG;
+       else if(sig->flags.expired)
+         statno=STATUS_EXPSIG;
+       else if(is_expkey)
+         statno=STATUS_EXPKEYSIG;
+       else if(is_revkey)
+         statno=STATUS_REVKEYSIG;
+       else
+         statno=STATUS_GOODSIG;
+
+       keyblock = get_pubkeyblock( sig->keyid );
+
+        sprintf (keyid_str, "%08lX%08lX [uncertain] ",
+                 (ulong)sig->keyid[0], (ulong)sig->keyid[1]);
+
+        /* find and print the primary user ID */
+       for( un=keyblock; un; un = un->next ) {
+           char *p;
+           int valid;
+           if(un->pkt->pkttype==PKT_PUBLIC_KEY)
+             {
+               pk=un->pkt->pkt.public_key;
+               continue;
+             }
+           if( un->pkt->pkttype != PKT_USER_ID )
+               continue;
+           if ( !un->pkt->pkt.user_id->created )
+               continue;
+            if ( un->pkt->pkt.user_id->is_revoked )
+                continue;
+            if ( un->pkt->pkt.user_id->is_expired )
+                continue;
+           if ( !un->pkt->pkt.user_id->is_primary )
+               continue;
+           /* We want the textual primary user ID here */
+           if ( un->pkt->pkt.user_id->attrib_data )
+               continue;
+
+           assert(pk);
+
+           /* Get it before we print anything to avoid interrupting
+              the output with the "please do a --check-trustdb"
+              line. */
+           valid=get_validity(pk,un->pkt->pkt.user_id);
+
+            keyid_str[17] = 0; /* cut off the "[uncertain]" part */
+            write_status_text_and_buffer (statno, keyid_str,
+                                          un->pkt->pkt.user_id->name,
+                                          un->pkt->pkt.user_id->len, 
+                                          -1 );
+
+           p=utf8_to_native(un->pkt->pkt.user_id->name,
+                            un->pkt->pkt.user_id->len,0);
+
+           if(rc)
+             log_info(_("BAD signature from \"%s\""),p);
+           else if(sig->flags.expired)
+             log_info(_("Expired signature from \"%s\""),p);
+           else
+             log_info(_("Good signature from \"%s\""),p);
+
+           xfree(p);
+
+           if(opt.verify_options&VERIFY_SHOW_UID_VALIDITY)
+             fprintf(log_stream()," [%s]\n",trust_value_to_string(valid));
+           else
+             fputs("\n", log_stream() );
+            count++;
+       }
+       if( !count ) {  /* just in case that we have no valid textual
+                           userid */
+           char *p;
+
+           /* Try for an invalid textual userid */
+            for( un=keyblock; un; un = un->next ) {
+                if( un->pkt->pkttype == PKT_USER_ID &&
+                   !un->pkt->pkt.user_id->attrib_data )
+                    break;
+            }
+
+           /* Try for any userid at all */
+           if(!un) {
+               for( un=keyblock; un; un = un->next ) {
+                    if( un->pkt->pkttype == PKT_USER_ID )
+                        break;
+               }
+           }
+
+            if (opt.trust_model==TM_ALWAYS || !un)
+                keyid_str[17] = 0; /* cut off the "[uncertain]" part */
+
+            write_status_text_and_buffer (statno, keyid_str,
+                                          un? un->pkt->pkt.user_id->name:"[?]",
+                                          un? un->pkt->pkt.user_id->len:3, 
+                                          -1 );
+
+           if(un)
+             p=utf8_to_native(un->pkt->pkt.user_id->name,
+                               un->pkt->pkt.user_id->len,0);
+           else
+             p=xstrdup("[?]");
+
+           if(rc)
+             log_info(_("BAD signature from \"%s\""),p);
+           else if(sig->flags.expired)
+             log_info(_("Expired signature from \"%s\""),p);
+           else
+             log_info(_("Good signature from \"%s\""),p);
+            if (opt.trust_model!=TM_ALWAYS && un)
+             {
+                putc(' ', log_stream() );
+                fputs(_("[uncertain]"), log_stream() );
+             }
+           fputs("\n", log_stream() );
+       }
+
+        /* If we have a good signature and already printed 
+         * the primary user ID, print all the other user IDs */
+        if ( count && !rc ) {
+           char *p;
+            for( un=keyblock; un; un = un->next ) {
+                if( un->pkt->pkttype != PKT_USER_ID )
+                    continue;
+                if((un->pkt->pkt.user_id->is_revoked
+                   || un->pkt->pkt.user_id->is_expired)
+                  && !(opt.verify_options&VERIFY_SHOW_UNUSABLE_UIDS))
+                 continue;
+               /* Only skip textual primaries */
+                if ( un->pkt->pkt.user_id->is_primary &&
+                    !un->pkt->pkt.user_id->attrib_data )
+                   continue;
+
+               if(un->pkt->pkt.user_id->attrib_data)
+                 {
+                   dump_attribs(un->pkt->pkt.user_id,pk,NULL);
+
+                   if(opt.verify_options&VERIFY_SHOW_PHOTOS)
+                     show_photos(un->pkt->pkt.user_id->attribs,
+                                 un->pkt->pkt.user_id->numattribs,pk,NULL);
+                 }
+
+               p=utf8_to_native(un->pkt->pkt.user_id->name,
+                                un->pkt->pkt.user_id->len,0);
+               log_info(_("                aka \"%s\""),p);
+               xfree(p);
+
+               if(opt.verify_options&VERIFY_SHOW_UID_VALIDITY)
+                 {
+                   const char *valid;
+                   if(un->pkt->pkt.user_id->is_revoked)
+                     valid=_("revoked");
+                   else if(un->pkt->pkt.user_id->is_expired)
+                     valid=_("expired");
+                   else
+                     valid=trust_value_to_string(get_validity(pk,
+                                                              un->pkt->
+                                                              pkt.user_id));
+                   fprintf(log_stream()," [%s]\n",valid);
+                 }
+               else
+                 fputs("\n", log_stream() );
+            }
+       }
+       release_kbnode( keyblock );
+
+       if( !rc )
+         {
+           if(opt.verify_options&VERIFY_SHOW_POLICY_URLS)
+             show_policy_url(sig,0,1);
+           else
+             show_policy_url(sig,0,2);
+
+           if(opt.verify_options&VERIFY_SHOW_KEYSERVER_URLS)
+             show_keyserver_url(sig,0,1);
+           else
+             show_keyserver_url(sig,0,2);
+
+           if(opt.verify_options&VERIFY_SHOW_NOTATIONS)
+             show_notation(sig,0,1,
+                       ((opt.verify_options&VERIFY_SHOW_STD_NOTATIONS)?1:0)+
+                       ((opt.verify_options&VERIFY_SHOW_USER_NOTATIONS)?2:0));
+           else
+             show_notation(sig,0,2,0);
+         }
+
+       if( !rc && is_status_enabled() ) {
+           /* print a status response with the fingerprint */
+           PKT_public_key *vpk = xmalloc_clear( sizeof *vpk );
+
+           if( !get_pubkey( vpk, sig->keyid ) ) {
+               byte array[MAX_FINGERPRINT_LEN], *p;
+               char buf[MAX_FINGERPRINT_LEN*4+90], *bufp;
+               size_t i, n;
+
+                bufp = buf;
+               fingerprint_from_pk( vpk, array, &n );
+               p = array;
+               for(i=0; i < n ; i++, p++, bufp += 2)
+                    sprintf(bufp, "%02X", *p );
+               /* TODO: Replace the reserved '0' in the field below
+                  with bits for status flags (policy url, notation,
+                  etc.).  Remember to make the buffer larger to
+                  match! */
+               sprintf(bufp, " %s %lu %lu %d 0 %d %d %02X ",
+                        strtimestamp( sig->timestamp ),
+                        (ulong)sig->timestamp,(ulong)sig->expiredate,
+                       sig->version,sig->pubkey_algo,sig->digest_algo,
+                       sig->sig_class);
+                bufp = bufp + strlen (bufp);
+                if (!vpk->is_primary) {
+                   u32 akid[2];
+                   akid[0] = vpk->main_keyid[0];
+                   akid[1] = vpk->main_keyid[1];
+                   free_public_key (vpk);
+                   vpk = xmalloc_clear( sizeof *vpk );
+                   if (get_pubkey (vpk, akid)) {
+                     /* impossible error, we simply return a zeroed out fpr */
+                     n = MAX_FINGERPRINT_LEN < 20? MAX_FINGERPRINT_LEN : 20;
+                     memset (array, 0, n);
+                   }
+                   else
+                     fingerprint_from_pk( vpk, array, &n );
+                }
+               p = array;
+               for(i=0; i < n ; i++, p++, bufp += 2)
+                    sprintf(bufp, "%02X", *p );
+               write_status_text( STATUS_VALIDSIG, buf );
+           }
+           free_public_key( vpk );
+       }
+
+       if (!rc)
+          {
+           if(opt.verify_options&VERIFY_PKA_LOOKUPS)
+             pka_uri_from_sig (sig); /* Make sure PKA info is available. */
+           rc = check_signatures_trust( sig );
+          }
+
+       if(sig->flags.expired)
+         {
+           log_info(_("Signature expired %s\n"),
+                    asctimestamp(sig->expiredate));
+           rc=G10ERR_GENERAL; /* need a better error here? */
+         }
+       else if(sig->expiredate)
+         log_info(_("Signature expires %s\n"),asctimestamp(sig->expiredate));
+
+       if(opt.verbose)
+         log_info(_("%s signature, digest algorithm %s\n"),
+                  sig->sig_class==0x00?_("binary"):
+                  sig->sig_class==0x01?_("textmode"):_("unknown"),
+                  digest_algo_to_string(sig->digest_algo));
+
+       if( rc )
+           g10_errors_seen = 1;
+       if( opt.batch && rc )
+           g10_exit(1);
+    }
+    else {
+       char buf[50];
+       sprintf(buf, "%08lX%08lX %d %d %02x %lu %d",
+                    (ulong)sig->keyid[0], (ulong)sig->keyid[1],
+                    sig->pubkey_algo, sig->digest_algo,
+                    sig->sig_class, (ulong)sig->timestamp, rc );
+       write_status_text( STATUS_ERRSIG, buf );
+       if( rc == G10ERR_NO_PUBKEY ) {
+           buf[16] = 0;
+           write_status_text( STATUS_NO_PUBKEY, buf );
+       }
+       if( rc != G10ERR_NOT_PROCESSED )
+           log_error(_("Can't check signature: %s\n"), g10_errstr(rc) );
+    }
+    return rc;
+}
+
+
+/****************
+ * Process the tree which starts at node
+ */
+static void
+proc_tree( CTX c, KBNODE node )
+{
+    KBNODE n1;
+    int rc;
+
+    if( opt.list_packets || opt.list_only )
+       return;
+
+    /* we must skip our special plaintext marker packets here becuase
+       they may be the root packet.  These packets are only used in
+       addionla checks and skipping them here doesn't matter */
+    while ( node
+            && node->pkt->pkttype == PKT_GPG_CONTROL
+            && node->pkt->pkt.gpg_control->control
+                         == CTRLPKT_PLAINTEXT_MARK ) {
+        node = node->next;
+    }
+    if (!node)
+        return;
+
+    c->trustletter = ' ';
+    if( node->pkt->pkttype == PKT_PUBLIC_KEY
+       || node->pkt->pkttype == PKT_PUBLIC_SUBKEY ) {
+       merge_keys_and_selfsig( node );
+       list_node( c, node );
+    }
+    else if( node->pkt->pkttype == PKT_SECRET_KEY ) {
+       merge_keys_and_selfsig( node );
+       list_node( c, node );
+    }
+    else if( node->pkt->pkttype == PKT_ONEPASS_SIG ) {
+       /* check all signatures */
+       if( !c->have_data ) {
+           free_md_filter_context( &c->mfx );
+           /* prepare to create all requested message digests */
+           c->mfx.md = md_open(0, 0);
+
+           /* fixme: why looking for the signature packet and not the
+               one-pass packet? */
+           for( n1 = node; (n1 = find_next_kbnode(n1, PKT_SIGNATURE )); ) {
+               md_enable( c->mfx.md, n1->pkt->pkt.signature->digest_algo);
+           }
+           /* ask for file and hash it */
+           if( c->sigs_only ) {
+               rc = hash_datafiles( c->mfx.md, NULL,
+                                    c->signed_data, c->sigfilename,
+                       n1? (n1->pkt->pkt.onepass_sig->sig_class == 0x01):0 );
+           }
+           else {
+               rc = ask_for_detached_datafile( c->mfx.md, c->mfx.md2,
+                                               iobuf_get_real_fname(c->iobuf),
+                       n1? (n1->pkt->pkt.onepass_sig->sig_class == 0x01):0 );
+           }
+           if( rc ) {
+               log_error("can't hash datafile: %s\n", g10_errstr(rc));
+               return;
+           }
+       }
+        else if ( c->signed_data ) {
+            log_error (_("not a detached signature\n") );
+            return;
+        }
+
+       for( n1 = node; (n1 = find_next_kbnode(n1, PKT_SIGNATURE )); )
+           check_sig_and_print( c, n1 );
+    }
+    else if( node->pkt->pkttype == PKT_GPG_CONTROL
+             && node->pkt->pkt.gpg_control->control
+                == CTRLPKT_CLEARSIGN_START ) {
+        /* clear text signed message */
+       if( !c->have_data ) {
+            log_error("cleartext signature without data\n" );
+            return;
+        }
+        else if ( c->signed_data ) {
+            log_error (_("not a detached signature\n") );
+            return;
+        }
+       
+       for( n1 = node; (n1 = find_next_kbnode(n1, PKT_SIGNATURE )); )
+           check_sig_and_print( c, n1 );
+    }
+    else if( node->pkt->pkttype == PKT_SIGNATURE ) {
+       PKT_signature *sig = node->pkt->pkt.signature;
+       int multiple_ok=1;
+
+       n1=find_next_kbnode(node, PKT_SIGNATURE);
+       if(n1)
+         {
+           byte class=sig->sig_class;
+           byte hash=sig->digest_algo;
+
+           for(; n1; (n1 = find_next_kbnode(n1, PKT_SIGNATURE)))
+             {
+               /* We can't currently handle multiple signatures of
+                  different classes or digests (we'd pretty much have
+                  to run a different hash context for each), but if
+                  they are all the same, make an exception. */
+               if(n1->pkt->pkt.signature->sig_class!=class
+                  || n1->pkt->pkt.signature->digest_algo!=hash)
+                 {
+                   multiple_ok=0;
+                   log_info(_("WARNING: multiple signatures detected.  "
+                              "Only the first will be checked.\n"));
+                   break;
+                 }
+             }
+         }
+
+       if( sig->sig_class != 0x00 && sig->sig_class != 0x01 )
+           log_info(_("standalone signature of class 0x%02x\n"),
+                                                   sig->sig_class);
+       else if( !c->have_data ) {
+           /* detached signature */
+           free_md_filter_context( &c->mfx );
+           c->mfx.md = md_open(sig->digest_algo, 0);
+           if( !opt.pgp2_workarounds )
+               ;
+           else if( sig->digest_algo == DIGEST_ALGO_MD5
+                    && is_RSA( sig->pubkey_algo ) ) {
+               /* enable a workaround for a pgp2 bug */
+               c->mfx.md2 = md_open( DIGEST_ALGO_MD5, 0 );
+           }
+           else if( sig->digest_algo == DIGEST_ALGO_SHA1
+                    && sig->pubkey_algo == PUBKEY_ALGO_DSA
+                    && sig->sig_class == 0x01 ) {
+               /* enable the workaround also for pgp5 when the detached
+                * signature has been created in textmode */
+               c->mfx.md2 = md_open( sig->digest_algo, 0 );
+           }
+#if 0 /* workaround disabled */
+           /* Here we have another hack to work around a pgp 2 bug
+            * It works by not using the textmode for detached signatures;
+            * this will let the first signature check (on md) fail
+            * but the second one (on md2) which adds an extra CR should
+            * then produce the "correct" hash.  This is very, very ugly
+            * hack but it may help in some cases (and break others)
+            */
+                   /*  c->mfx.md2? 0 :(sig->sig_class == 0x01) */
+#endif
+            if ( DBG_HASHING ) {
+                md_start_debug( c->mfx.md, "verify" );
+                if ( c->mfx.md2  )
+                    md_start_debug( c->mfx.md2, "verify2" );
+            }
+           if( c->sigs_only ) {
+               rc = hash_datafiles( c->mfx.md, c->mfx.md2,
+                                    c->signed_data, c->sigfilename,
+                                    (sig->sig_class == 0x01) );
+           }
+           else {
+               rc = ask_for_detached_datafile( c->mfx.md, c->mfx.md2,
+                                               iobuf_get_real_fname(c->iobuf),
+                                               (sig->sig_class == 0x01) );
+           }
+           if( rc ) {
+               log_error("can't hash datafile: %s\n", g10_errstr(rc));
+               return;
+           }
+       }
+        else if ( c->signed_data ) {
+            log_error (_("not a detached signature\n") );
+            return;
+        }
+        else if ( c->pipemode.op == 'B' )
+            ; /* this is a detached signature trough the pipemode handler */
+       else if (!opt.quiet)
+           log_info(_("old style (PGP 2.x) signature\n"));
+
+       if(multiple_ok)
+         for( n1 = node; n1; (n1 = find_next_kbnode(n1, PKT_SIGNATURE )) )
+           check_sig_and_print( c, n1 );
+       else
+         check_sig_and_print( c, node );
+    }
+    else {
+        dump_kbnode (c->list);
+       log_error(_("invalid root packet detected in proc_tree()\n"));
+        dump_kbnode (node);
+    }
+}
diff --git a/g10/mdfilter.c b/g10/mdfilter.c
new file mode 100644 (file)
index 0000000..3605db8
--- /dev/null
@@ -0,0 +1,77 @@
+/* mdfilter.c - filter data and calculate a message digest
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "filter.h"
+
+
+
+/****************
+ * This filter is used to collect a message digest
+ */
+int
+md_filter( void *opaque, int control,
+              IOBUF a, byte *buf, size_t *ret_len)
+{
+    size_t size = *ret_len;
+    md_filter_context_t *mfx = opaque;
+    int i, rc=0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       if( mfx->maxbuf_size && size > mfx->maxbuf_size )
+           size = mfx->maxbuf_size;
+       i = iobuf_read( a, buf, size );
+       if( i == -1 ) i = 0;
+       if( i ) {
+           md_write(mfx->md, buf, i );
+           if( mfx->md2 )
+               md_write(mfx->md2, buf, i );
+       }
+       else
+           rc = -1; /* eof */
+       *ret_len = i;
+    }
+    else if( control == IOBUFCTRL_DESC )
+       *(char**)buf = "md_filter";
+    return rc;
+}
+
+
+void
+free_md_filter_context( md_filter_context_t *mfx )
+{
+    md_close(mfx->md);
+    md_close(mfx->md2);
+    mfx->md = NULL;
+    mfx->md2 = NULL;
+    mfx->maxbuf_size = 0;
+}
+
diff --git a/g10/misc.c b/g10/misc.c
new file mode 100644 (file)
index 0000000..fbe4492
--- /dev/null
@@ -0,0 +1,1284 @@
+/* misc.c -  miscellaneous functions
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#if defined(__linux__) && defined(__alpha__) && __GLIBC__ < 2
+#include <asm/sysinfo.h>
+#include <asm/unistd.h>
+#endif
+#ifdef HAVE_SETRLIMIT
+#include <time.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#endif
+#ifdef ENABLE_SELINUX_HACKS
+#include <sys/stat.h>
+#endif
+#ifdef _WIN32
+#include <time.h>
+#include <process.h>
+#include <windows.h> 
+#include <shlobj.h>
+#ifndef CSIDL_APPDATA
+#define CSIDL_APPDATA 0x001a
+#endif
+#ifndef CSIDL_LOCAL_APPDATA
+#define CSIDL_LOCAL_APPDATA 0x001c
+#endif
+#ifndef CSIDL_FLAG_CREATE
+#define CSIDL_FLAG_CREATE 0x8000
+#endif
+#include "errors.h"
+#include "dynload.h"
+#endif /*_WIN32*/
+
+#include "util.h"
+#include "main.h"
+#include "photoid.h"
+#include "options.h"
+#include "i18n.h"
+#include "cardglue.h"
+
+
+
+
+#ifdef ENABLE_SELINUX_HACKS
+/* A object and a global variable to keep track of files marked as
+   secured. */
+struct secured_file_item 
+{
+  struct secured_file_item *next;
+  ino_t ino;
+  dev_t dev;
+};
+static struct secured_file_item *secured_files;
+#endif /*ENABLE_SELINUX_HACKS*/
+
+
+
+#if defined(__linux__) && defined(__alpha__) && __GLIBC__ < 2
+static int
+setsysinfo(unsigned long op, void *buffer, unsigned long size,
+                    int *start, void *arg, unsigned long flag)
+{
+    return syscall(__NR_osf_setsysinfo, op, buffer, size, start, arg, flag);
+}
+
+void
+trap_unaligned(void)
+{
+    unsigned int buf[2];
+
+    buf[0] = SSIN_UACPROC;
+    buf[1] = UAC_SIGBUS | UAC_NOPRINT;
+    setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0, 0);
+}
+#else
+void
+trap_unaligned(void)
+{  /* dummy */
+}
+#endif
+
+
+int
+disable_core_dumps()
+{
+#ifdef HAVE_DOSISH_SYSTEM
+    return 0;
+#else
+#ifdef HAVE_SETRLIMIT
+    struct rlimit limit;
+
+    limit.rlim_cur = 0;
+    limit.rlim_max = 0;
+    if( !setrlimit( RLIMIT_CORE, &limit ) )
+       return 0;
+    if( errno != EINVAL && errno != ENOSYS )
+       log_fatal(_("can't disable core dumps: %s\n"), strerror(errno) );
+#endif
+    return 1;
+#endif
+}
+
+
+/* For the sake of SELinux we want to restrict access through gpg to
+   certain files we keep under our own control.  This function
+   registers such a file and is_secured_file may then be used to
+   check whether a file has ben registered as secured. */
+void
+register_secured_file (const char *fname)
+{
+#ifdef ENABLE_SELINUX_HACKS
+  struct stat buf;
+  struct secured_file_item *sf;
+
+  /* Note that we stop immediatley if something goes wrong here. */
+  if (stat (fname, &buf))
+    log_fatal (_("fstat of `%s' failed in %s: %s\n"), fname, 
+               "register_secured_file", strerror (errno));
+/*   log_debug ("registering `%s' i=%lu.%lu\n", fname, */
+/*              (unsigned long)buf.st_dev, (unsigned long)buf.st_ino); */
+  for (sf=secured_files; sf; sf = sf->next)
+    {
+      if (sf->ino == buf.st_ino && sf->dev == buf.st_dev)
+        return; /* Already registered.  */
+    }
+
+  sf = xmalloc (sizeof *sf);
+  sf->ino = buf.st_ino;
+  sf->dev = buf.st_dev;
+  sf->next = secured_files;
+  secured_files = sf;
+#endif /*ENABLE_SELINUX_HACKS*/
+}
+
+/* Remove a file registerd as secure. */
+void
+unregister_secured_file (const char *fname)
+{
+#ifdef ENABLE_SELINUX_HACKS
+  struct stat buf;
+  struct secured_file_item *sf, *sfprev;
+
+  if (stat (fname, &buf))
+    {
+      log_error (_("fstat of `%s' failed in %s: %s\n"), fname,
+                 "unregister_secured_file", strerror (errno));
+      return;
+    }
+/*   log_debug ("unregistering `%s' i=%lu.%lu\n", fname,  */
+/*              (unsigned long)buf.st_dev, (unsigned long)buf.st_ino); */
+  for (sfprev=NULL,sf=secured_files; sf; sfprev=sf, sf = sf->next)
+    {
+      if (sf->ino == buf.st_ino && sf->dev == buf.st_dev)
+        {
+          if (sfprev)
+            sfprev->next = sf->next;
+          else
+            secured_files = sf->next;
+          xfree (sf);
+          return;
+        }
+    }
+#endif /*ENABLE_SELINUX_HACKS*/
+}
+
+/* Return true if FD is corresponds to a secured file.  Using -1 for
+   FS is allowed and will return false. */ 
+int 
+is_secured_file (int fd)
+{
+#ifdef ENABLE_SELINUX_HACKS
+  struct stat buf;
+  struct secured_file_item *sf;
+
+  if (fd == -1)
+    return 0; /* No file descriptor so it can't be secured either.  */
+
+  /* Note that we print out a error here and claim that a file is
+     secure if something went wrong. */
+  if (fstat (fd, &buf))
+    {
+      log_error (_("fstat(%d) failed in %s: %s\n"), fd, 
+                 "is_secured_file", strerror (errno));
+      return 1;
+    }
+/*   log_debug ("is_secured_file (%d) i=%lu.%lu\n", fd, */
+/*              (unsigned long)buf.st_dev, (unsigned long)buf.st_ino); */
+  for (sf=secured_files; sf; sf = sf->next)
+    {
+      if (sf->ino == buf.st_ino && sf->dev == buf.st_dev)
+        return 1; /* Yes.  */
+    }
+#endif /*ENABLE_SELINUX_HACKS*/
+  return 0; /* No. */
+}
+
+/* Return true if FNAME is corresponds to a secured file.  Using NULL,
+   "" or "-" for FS is allowed and will return false. This function is
+   used before creating a file, thus it won't fail if the file does
+   not exist. */ 
+int 
+is_secured_filename (const char *fname)
+{
+#ifdef ENABLE_SELINUX_HACKS
+  struct stat buf;
+  struct secured_file_item *sf;
+
+  if (iobuf_is_pipe_filename (fname) || !*fname)
+    return 0; 
+
+  /* Note that we print out a error here and claim that a file is
+     secure if something went wrong. */
+  if (stat (fname, &buf))
+    {
+      if (errno == ENOENT || errno == EPERM || errno == EACCES)
+        return 0;
+      log_error (_("fstat of `%s' failed in %s: %s\n"), fname,
+                 "is_secured_filename", strerror (errno));
+      return 1;
+    }
+/*   log_debug ("is_secured_filename (%s) i=%lu.%lu\n", fname, */
+/*              (unsigned long)buf.st_dev, (unsigned long)buf.st_ino); */
+  for (sf=secured_files; sf; sf = sf->next)
+    {
+      if (sf->ino == buf.st_ino && sf->dev == buf.st_dev)
+        return 1; /* Yes.  */
+    }
+#endif /*ENABLE_SELINUX_HACKS*/
+  return 0; /* No. */
+}
+
+
+
+u16
+checksum_u16( unsigned n )
+{
+    u16 a;
+
+    a  = (n >> 8) & 0xff;
+    a += n & 0xff;
+    return a;
+}
+
+
+u16
+checksum( byte *p, unsigned n )
+{
+    u16 a;
+
+    for(a=0; n; n-- )
+       a += *p++;
+    return a;
+}
+
+u16
+checksum_mpi( MPI a )
+{
+    u16 csum;
+    byte *buffer;
+    unsigned nbytes;
+    unsigned nbits;
+
+    buffer = mpi_get_buffer( a, &nbytes, NULL );
+    nbits = mpi_get_nbits(a);
+    csum = checksum_u16( nbits );
+    csum += checksum( buffer, nbytes );
+    xfree( buffer );
+    return csum;
+}
+
+u32
+buffer_to_u32( const byte *buffer )
+{
+    unsigned long a;
+    a =  *buffer << 24;
+    a |= buffer[1] << 16;
+    a |= buffer[2] << 8;
+    a |= buffer[3];
+    return a;
+}
+
+void
+print_pubkey_algo_note( int algo )
+{
+  if(algo >= 100 && algo <= 110)
+    {
+      static int warn=0;
+      if(!warn)
+       {
+         warn=1;
+         log_info(_("WARNING: using experimental public key algorithm %s\n"),
+                  pubkey_algo_to_string(algo));
+       }
+    }
+}
+
+void
+print_cipher_algo_note( int algo )
+{
+  if(algo >= 100 && algo <= 110)
+    {
+      static int warn=0;
+      if(!warn)
+       {
+         warn=1;
+         log_info(_("WARNING: using experimental cipher algorithm %s\n"),
+                  cipher_algo_to_string(algo));
+       }
+    }
+}
+
+void
+print_digest_algo_note( int algo )
+{
+  if(algo >= 100 && algo <= 110)
+    {
+      static int warn=0;
+      if(!warn)
+       {
+         warn=1;
+         log_info(_("WARNING: using experimental digest algorithm %s\n"),
+                  digest_algo_to_string(algo));
+       }
+    }
+  else if(algo==DIGEST_ALGO_MD5)
+    log_info(_("WARNING: digest algorithm %s is deprecated\n"),
+            digest_algo_to_string(algo));
+}
+
+/* Return a string which is used as a kind of process ID */
+const byte *
+get_session_marker( size_t *rlen )
+{
+    static byte marker[SIZEOF_UNSIGNED_LONG*2];
+    static int initialized;
+
+    if ( !initialized ) {
+        volatile ulong aa, bb; /* we really want the uninitialized value */
+        ulong a, b;
+
+        initialized = 1;
+        /* also this marker is guessable it is not easy to use this 
+         * for a faked control packet because an attacker does not
+         * have enough control about the time the verification does 
+         * take place.  Of course, we can add just more random but 
+         * than we need the random generator even for verification
+         * tasks - which does not make sense. */
+        a = aa ^ (ulong)getpid();
+        b = bb ^ (ulong)time(NULL);
+        memcpy( marker, &a, SIZEOF_UNSIGNED_LONG );
+        memcpy( marker+SIZEOF_UNSIGNED_LONG, &b, SIZEOF_UNSIGNED_LONG );
+    }
+    *rlen = sizeof(marker);
+    return marker;
+}
+
+/****************
+ * Wrapper around the libgcrypt function with addional checks on
+ * openPGP contraints for the algo ID.
+ */
+int
+openpgp_cipher_test_algo( int algo )
+{
+    if( algo < 0 || algo > 110 )
+        return G10ERR_CIPHER_ALGO;
+    return check_cipher_algo(algo);
+}
+
+int
+openpgp_pk_test_algo( int algo, unsigned int usage_flags )
+{
+    if( algo < 0 || algo > 110 )
+       return G10ERR_PUBKEY_ALGO;
+    return check_pubkey_algo2( algo, usage_flags );
+}
+
+int 
+openpgp_pk_algo_usage ( int algo )
+{
+    int use = 0; 
+    
+    /* they are hardwired in gpg 1.0 */
+    switch ( algo ) {    
+      case PUBKEY_ALGO_RSA:
+          use = PUBKEY_USAGE_CERT | PUBKEY_USAGE_SIG | PUBKEY_USAGE_ENC | PUBKEY_USAGE_AUTH;
+          break;
+      case PUBKEY_ALGO_RSA_E:
+          use = PUBKEY_USAGE_ENC;
+          break;
+      case PUBKEY_ALGO_RSA_S:
+          use = PUBKEY_USAGE_CERT | PUBKEY_USAGE_SIG;
+          break;
+      case PUBKEY_ALGO_ELGAMAL_E:
+          use = PUBKEY_USAGE_ENC;
+          break;
+      case PUBKEY_ALGO_DSA:  
+          use = PUBKEY_USAGE_CERT | PUBKEY_USAGE_SIG | PUBKEY_USAGE_AUTH;
+          break;
+      default:
+          break;
+    }
+    return use;
+}
+
+int
+openpgp_md_test_algo( int algo )
+{
+    if( algo < 0 || algo > 110 )
+        return G10ERR_DIGEST_ALGO;
+    return check_digest_algo(algo);
+}
+
+#ifdef USE_IDEA
+/* Special warning for the IDEA cipher */
+void
+idea_cipher_warn(int show)
+{
+  static int warned=0;
+
+  if(!warned || show)
+    {
+      log_info(_("the IDEA cipher plugin is not present\n"));
+      log_info(_("please see %s for more information\n"),
+               "http://www.gnupg.org/faq/why-not-idea.html");
+      warned=1;
+    }
+}
+#endif
+
+static unsigned long get_signature_count(PKT_secret_key *sk)
+{
+#ifdef ENABLE_CARD_SUPPORT
+  if(sk && sk->is_protected && sk->protect.s2k.mode==1002)
+    {
+      struct agent_card_info_s info;
+      if(agent_scd_getattr("SIG-COUNTER",&info)==0)
+       return info.sig_counter;
+    }  
+#endif
+
+  /* How to do this without a card? */
+
+  return 0;
+}
+
+/* Expand %-strings.  Returns a string which must be xfreed.  Returns
+   NULL if the string cannot be expanded (too large). */
+char *
+pct_expando(const char *string,struct expando_args *args)
+{
+  const char *ch=string;
+  int idx=0,maxlen=0,done=0;
+  u32 pk_keyid[2]={0,0},sk_keyid[2]={0,0};
+  char *ret=NULL;
+
+  if(args->pk)
+    keyid_from_pk(args->pk,pk_keyid);
+
+  if(args->sk)
+    keyid_from_sk(args->sk,sk_keyid);
+
+  /* This is used so that %k works in photoid command strings in
+     --list-secret-keys (which of course has a sk, but no pk). */
+  if(!args->pk && args->sk)
+    keyid_from_sk(args->sk,pk_keyid);
+
+  while(*ch!='\0')
+    {
+      char *str=NULL;
+
+      if(!done)
+       {
+         /* 8192 is way bigger than we'll need here */
+         if(maxlen>=8192)
+           goto fail;
+
+         maxlen+=1024;
+         ret=xrealloc(ret,maxlen);
+       }
+
+      done=0;
+
+      if(*ch=='%')
+       {
+         switch(*(ch+1))
+           {
+           case 's': /* short key id */
+             if(idx+8<maxlen)
+               {
+                 sprintf(&ret[idx],"%08lX",(ulong)sk_keyid[1]);
+                 idx+=8;
+                 done=1;
+               }
+             break;
+
+           case 'S': /* long key id */
+             if(idx+16<maxlen)
+               {
+                 sprintf(&ret[idx],"%08lX%08lX",
+                         (ulong)sk_keyid[0],(ulong)sk_keyid[1]);
+                 idx+=16;
+                 done=1;
+               }
+             break;
+
+           case 'k': /* short key id */
+             if(idx+8<maxlen)
+               {
+                 sprintf(&ret[idx],"%08lX",(ulong)pk_keyid[1]);
+                 idx+=8;
+                 done=1;
+               }
+             break;
+
+           case 'K': /* long key id */
+             if(idx+16<maxlen)
+               {
+                 sprintf(&ret[idx],"%08lX%08lX",
+                         (ulong)pk_keyid[0],(ulong)pk_keyid[1]);
+                 idx+=16;
+                 done=1;
+               }
+             break;
+
+           case 'c': /* signature count from card, if any. */
+             if(idx+10<maxlen)
+               {
+                 sprintf(&ret[idx],"%lu",get_signature_count(args->sk));
+                 idx+=strlen(&ret[idx]);
+                 done=1;
+               }             
+             break;
+
+           case 'p': /* primary pk fingerprint of a sk */
+           case 'f': /* pk fingerprint */
+           case 'g': /* sk fingerprint */
+             {
+               byte array[MAX_FINGERPRINT_LEN];
+               size_t len;
+               int i;
+
+               if((*(ch+1))=='p' && args->sk)
+                 {
+                   if(args->sk->is_primary)
+                     fingerprint_from_sk(args->sk,array,&len);
+                   else if(args->sk->main_keyid[0] || args->sk->main_keyid[1])
+                     {
+                       PKT_public_key *pk=
+                         xmalloc_clear(sizeof(PKT_public_key));
+
+                       if(get_pubkey_fast(pk,args->sk->main_keyid)==0)
+                         fingerprint_from_pk(pk,array,&len);
+                       else
+                         memset(array,0,(len=MAX_FINGERPRINT_LEN));
+                       free_public_key(pk);
+                     }
+                   else
+                     memset(array,0,(len=MAX_FINGERPRINT_LEN));
+                 }
+               else if((*(ch+1))=='f' && args->pk)
+                 fingerprint_from_pk(args->pk,array,&len);
+               else if((*(ch+1))=='g' && args->sk)
+                 fingerprint_from_sk(args->sk,array,&len);
+               else
+                 memset(array,0,(len=MAX_FINGERPRINT_LEN));
+
+               if(idx+(len*2)<maxlen)
+                 {
+                   for(i=0;i<len;i++)
+                     {
+                       sprintf(&ret[idx],"%02X",array[i]);
+                       idx+=2;
+                     }
+                   done=1;
+                 }
+             }
+             break;
+
+           case 't': /* e.g. "jpg" */
+             str=image_type_to_string(args->imagetype,0);
+             /* fall through */
+
+           case 'T': /* e.g. "image/jpeg" */
+             if(str==NULL)
+               str=image_type_to_string(args->imagetype,2);
+
+             if(idx+strlen(str)<maxlen)
+               {
+                 strcpy(&ret[idx],str);
+                 idx+=strlen(str);
+                 done=1;
+               }
+             break;
+
+           case '%':
+             if(idx+1<maxlen)
+               {
+                 ret[idx++]='%';
+                 ret[idx]='\0';
+                 done=1;
+               }
+             break;
+
+             /* Any unknown %-keys (like %i, %o, %I, and %O) are
+                passed through for later expansion.  Note this also
+                handles the case where the last character in the
+                string is a '%' - the terminating \0 will end up here
+                and properly terminate the string. */
+           default:
+             if(idx+2<maxlen)
+               {
+                 ret[idx++]='%';
+                 ret[idx++]=*(ch+1);
+                 ret[idx]='\0';
+                 done=1;
+               }
+             break;
+             }
+
+         if(done)
+           ch++;
+       }
+      else
+       {
+         if(idx+1<maxlen)
+           {
+             ret[idx++]=*ch;
+             ret[idx]='\0';
+             done=1;
+           }
+       }
+
+      if(done)
+       ch++;
+    }
+
+  return ret;
+
+ fail:
+  xfree(ret);
+  return NULL;
+}
+
+void
+deprecated_warning(const char *configname,unsigned int configlineno,
+                  const char *option,const char *repl1,const char *repl2)
+{
+  if(configname)
+    {
+      if(strncmp("--",option,2)==0)
+       option+=2;
+
+      if(strncmp("--",repl1,2)==0)
+       repl1+=2;
+
+      log_info(_("%s:%d: deprecated option \"%s\"\n"),
+              configname,configlineno,option);
+    }
+  else
+    log_info(_("WARNING: \"%s\" is a deprecated option\n"),option);
+
+  log_info(_("please use \"%s%s\" instead\n"),repl1,repl2);
+}
+
+
+void
+deprecated_command (const char *name)
+{
+  log_info(_("WARNING: \"%s\" is a deprecated command - do not use it\n"),
+           name);
+}
+
+
+const char *
+compress_algo_to_string(int algo)
+{
+  const char *s=NULL;
+
+  switch(algo)
+    {
+    case COMPRESS_ALGO_NONE:
+      s=_("Uncompressed");
+      break;
+
+    case COMPRESS_ALGO_ZIP:
+      s="ZIP";
+      break;
+
+    case COMPRESS_ALGO_ZLIB:
+      s="ZLIB";
+      break;
+
+#ifdef HAVE_BZIP2
+    case COMPRESS_ALGO_BZIP2:
+      s="BZIP2";
+      break;
+#endif
+    }
+
+  return s;
+}
+
+int
+string_to_compress_algo(const char *string)
+{
+  /* NOTE TO TRANSLATOR: See doc/TRANSLATE about this string. */
+  if(match_multistr(_("uncompressed|none"),string))
+    return 0;
+  else if(ascii_strcasecmp(string,"uncompressed")==0)
+    return 0;
+  else if(ascii_strcasecmp(string,"none")==0)
+    return 0;
+  else if(ascii_strcasecmp(string,"zip")==0)
+    return 1;
+  else if(ascii_strcasecmp(string,"zlib")==0)
+    return 2;
+#ifdef HAVE_BZIP2
+  else if(ascii_strcasecmp(string,"bzip2")==0)
+    return 3;
+#endif
+  else if(ascii_strcasecmp(string,"z0")==0)
+    return 0;
+  else if(ascii_strcasecmp(string,"z1")==0)
+    return 1;
+  else if(ascii_strcasecmp(string,"z2")==0)
+    return 2;
+#ifdef HAVE_BZIP2
+  else if(ascii_strcasecmp(string,"z3")==0)
+    return 3;
+#endif
+  else
+    return -1;
+}
+
+int
+check_compress_algo(int algo)
+{
+#ifdef HAVE_BZIP2
+  if(algo>=0 && algo<=3)
+    return 0;
+#else
+  if(algo>=0 && algo<=2)
+    return 0;
+#endif
+
+  return G10ERR_COMPR_ALGO;
+}
+
+int
+default_cipher_algo(void)
+{
+  if(opt.def_cipher_algo)
+    return opt.def_cipher_algo;
+  else if(opt.personal_cipher_prefs)
+    return opt.personal_cipher_prefs[0].value;
+  else
+    return opt.s2k_cipher_algo;
+}
+
+/* There is no default_digest_algo function, but see
+   sign.c:hash_for() */
+
+int
+default_compress_algo(void)
+{
+  if(opt.compress_algo!=-1)
+    return opt.compress_algo;
+  else if(opt.personal_compress_prefs)
+    return opt.personal_compress_prefs[0].value;
+  else
+    return DEFAULT_COMPRESS_ALGO;
+}
+
+const char *
+compliance_option_string(void)
+{
+  switch(opt.compliance)
+    {
+    case CO_RFC2440:
+      return "--openpgp";
+    case CO_PGP2:
+      return "--pgp2";
+    case CO_PGP6:
+      return "--pgp6";
+    case CO_PGP7:
+      return "--pgp7";
+    case CO_PGP8:
+      return "--pgp8";
+    default:
+      return "???";
+    }
+}
+
+static const char *
+compliance_string(void)
+{
+  switch(opt.compliance)
+    {
+    case CO_RFC2440:
+      return "OpenPGP";
+    case CO_PGP2:
+      return "PGP 2.x";
+    case CO_PGP6:
+      return "PGP 6.x";
+    case CO_PGP7:
+      return "PGP 7.x";
+    case CO_PGP8:
+      return "PGP 8.x";
+    default:
+      return "???";
+    }
+}
+
+void
+compliance_failure(void)
+{
+  log_info(_("this message may not be usable by %s\n"),compliance_string());
+  opt.compliance=CO_GNUPG;
+}
+
+/* Break a string into successive option pieces.  Accepts single word
+   options and key=value argument options. */
+char *
+optsep(char **stringp)
+{
+  char *tok,*end;
+
+  tok=*stringp;
+  if(tok)
+    {
+      end=strpbrk(tok," ,=");
+      if(end)
+       {
+         int sawequals=0;
+         char *ptr=end;
+
+         /* what we need to do now is scan along starting with *end,
+            If the next character we see (ignoring spaces) is an =
+            sign, then there is an argument. */
+
+         while(*ptr)
+           {
+             if(*ptr=='=')
+               sawequals=1;
+             else if(*ptr!=' ')
+               break;
+             ptr++;
+           }
+
+         /* There is an argument, so grab that too.  At this point,
+            ptr points to the first character of the argument. */
+         if(sawequals)
+           {
+             /* Is it a quoted argument? */
+             if(*ptr=='"')
+               {
+                 ptr++;
+                 end=strchr(ptr,'"');
+                 if(end)
+                   end++;
+               }
+             else
+               end=strpbrk(ptr," ,");
+           }
+
+         if(end && *end)
+           {
+             *end='\0';
+             *stringp=end+1;
+           }
+         else
+           *stringp=NULL;
+       }
+      else
+       *stringp=NULL;
+    }
+
+  return tok;
+}
+
+/* Breaks an option value into key and value.  Returns NULL if there
+   is no value.  Note that "string" is modified to remove the =value
+   part. */
+char *
+argsplit(char *string)
+{
+  char *equals,*arg=NULL;
+
+  equals=strchr(string,'=');
+  if(equals)
+    {
+      char *quote,*space;
+
+      *equals='\0';
+      arg=equals+1;
+
+      /* Quoted arg? */
+      quote=strchr(arg,'"');
+      if(quote)
+       {
+         arg=quote+1;
+
+         quote=strchr(arg,'"');
+         if(quote)
+           *quote='\0';
+       }
+      else
+       {
+         size_t spaces;
+
+         /* Trim leading spaces off of the arg */
+         spaces=strspn(arg," ");
+         arg+=spaces;
+       }
+
+      /* Trim tailing spaces off of the tag */
+      space=strchr(string,' ');
+      if(space)
+       *space='\0';
+    }
+
+  return arg;
+}
+
+/* Return the length of the initial token, leaving off any
+   argument. */
+static size_t
+optlen(const char *s)
+{
+  char *end=strpbrk(s," =");
+
+  if(end)
+    return end-s;
+  else
+    return strlen(s);
+}
+
+int
+parse_options(char *str,unsigned int *options,
+             struct parse_options *opts,int noisy)
+{
+  char *tok;
+
+  if (str && !strcmp (str, "help"))
+    {
+      int i,maxlen=0;
+
+      /* Figure out the longest option name so we can line these up
+        neatly. */
+      for(i=0;opts[i].name;i++)
+       if(opts[i].help && maxlen<strlen(opts[i].name))
+         maxlen=strlen(opts[i].name);
+
+      for(i=0;opts[i].name;i++)
+        if(opts[i].help)
+         printf("%s%*s%s\n",opts[i].name,
+                maxlen+2-(int)strlen(opts[i].name),"",_(opts[i].help));
+
+      g10_exit(0);
+    }
+
+  while((tok=optsep(&str)))
+    {
+      int i,rev=0;
+      char *otok=tok;
+
+      if(tok[0]=='\0')
+       continue;
+
+      if(ascii_strncasecmp("no-",tok,3)==0)
+       {
+         rev=1;
+         tok+=3;
+       }
+
+      for(i=0;opts[i].name;i++)
+       {
+         size_t toklen=optlen(tok);
+
+         if(ascii_strncasecmp(opts[i].name,tok,toklen)==0)
+           {
+             /* We have a match, but it might be incomplete */
+             if(toklen!=strlen(opts[i].name))
+               {
+                 int j;
+
+                 for(j=i+1;opts[j].name;j++)
+                   {
+                     if(ascii_strncasecmp(opts[j].name,tok,toklen)==0)
+                       {
+                         if(noisy)
+                           log_info(_("ambiguous option `%s'\n"),otok);
+                         return 0;
+                       }
+                   }
+               }
+
+             if(rev)
+               {
+                 *options&=~opts[i].bit;
+                 if(opts[i].value)
+                   *opts[i].value=NULL;
+               }
+             else
+               {
+                 *options|=opts[i].bit;
+                 if(opts[i].value)
+                   *opts[i].value=argsplit(tok);
+               }
+             break;
+           }
+       }
+
+      if(!opts[i].name)
+       {
+         if(noisy)
+           log_info(_("unknown option `%s'\n"),otok);
+         return 0;
+       }
+    }
+
+  return 1;
+}
+
+
+/* Return a new malloced string by unescaping the string S.  Escaping
+   is percent escaping and '+'/space mapping.  A binary nul will
+   silently be replaced by a 0xFF. */
+char *
+unescape_percent_string (const unsigned char *s)
+{
+  char *buffer, *d;
+
+  buffer = d = xmalloc (strlen (s)+1);
+  while (*s)
+    {
+      if (*s == '%' && s[1] && s[2])
+        { 
+          s++;
+          *d = xtoi_2 (s);
+          if (!*d)
+            *d = '\xff';
+          d++;
+          s += 2;
+        }
+      else if (*s == '+')
+        {
+          *d++ = ' ';
+          s++;
+        }
+      else
+        *d++ = *s++;
+    }
+  *d = 0; 
+  return buffer;
+}
+
+
+int
+has_invalid_email_chars (const char *s)
+{
+  int at_seen=0;
+  const char *valid_chars=
+    "01234567890_-.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+  for ( ; *s; s++ ) 
+    {
+      if ( *s & 0x80 )
+        return 1;
+      if ( *s == '@' )
+        at_seen=1;
+      else if ( !at_seen && !( !!strchr( valid_chars, *s ) || *s == '+' ) )
+        return 1;
+      else if ( at_seen && !strchr( valid_chars, *s ) )
+        return 1;
+    }
+  return 0;
+}
+
+
+/* Check whether NAME represents a valid mailbox according to
+   RFC822. Returns true if so. */
+int
+is_valid_mailbox (const char *name)
+{
+  return !( !name
+            || !*name
+            || has_invalid_email_chars (name)
+            || string_count_chr (name,'@') != 1
+            || *name == '@'
+            || name[strlen(name)-1] == '@'
+            || name[strlen(name)-1] == '.'
+            || strstr (name, "..") );
+}
+
+
+/* This is a helper function to load a Windows function from either of
+   one DLLs. */
+#ifdef HAVE_W32_SYSTEM
+static HRESULT
+w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
+{
+  static int initialized;
+  static HRESULT (WINAPI * func)(HWND,int,HANDLE,DWORD,LPSTR);
+
+  if (!initialized)
+    {
+      static char *dllnames[] = { "shell32.dll", "shfolder.dll", NULL };
+      void *handle;
+      int i;
+
+      initialized = 1;
+
+      for (i=0, handle = NULL; !handle && dllnames[i]; i++)
+        {
+          handle = dlopen (dllnames[i], RTLD_LAZY);
+          if (handle)
+            {
+              func = dlsym (handle, "SHGetFolderPathA");
+              if (!func)
+                {
+                  dlclose (handle);
+                  handle = NULL;
+                }
+            }
+        }
+    }
+
+  if (func)
+    return func (a,b,c,d,e);
+  else
+    return -1;
+}
+#endif /*HAVE_W32_SYSTEM*/
+
+
+/* Set up the default home directory.  The usual --homedir option
+   should be parsed later. */
+char *
+default_homedir (void)
+{
+  char *dir;
+
+  dir = getenv("GNUPGHOME");
+#ifdef HAVE_W32_SYSTEM
+  if (!dir || !*dir)
+    dir = read_w32_registry_string (NULL, "Software\\GNU\\GnuPG", "HomeDir");
+  if (!dir || !*dir)
+    {
+      char path[MAX_PATH];
+      
+      /* It might be better to use LOCAL_APPDATA because this is
+         defined as "non roaming" and thus more likely to be kept
+         locally.  For private keys this is desired.  However, given
+         that many users copy private keys anyway forth and back,
+         using a system roaming serives might be better than to let
+         them do it manually.  A security conscious user will anyway
+         use the registry entry to have better control.  */
+      if (w32_shgetfolderpath (NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE, 
+                               NULL, 0, path) >= 0) 
+        {
+          char *tmp = xmalloc (strlen (path) + 6 +1);
+          strcpy (stpcpy (tmp, path), "\\gnupg");
+          dir = tmp;
+          
+          /* Try to create the directory if it does not yet
+             exists.  */
+          if (access (dir, F_OK))
+            CreateDirectory (dir, NULL);
+        }
+    }
+#endif /*HAVE_W32_SYSTEM*/
+  if (!dir || !*dir)
+    dir = GNUPG_HOMEDIR;
+
+  return dir;
+}
+
+
+/* Return the name of the libexec directory.  The name is allocated in
+   a static area on the first use.  This function won't fail. */
+const char *
+get_libexecdir (void)
+{
+#ifdef HAVE_W32_SYSTEM
+  static int got_dir;
+  static char dir[MAX_PATH+5];
+
+  if (!got_dir)
+    {
+      char *p;
+
+      if ( !GetModuleFileName ( NULL, dir, MAX_PATH) )
+        {
+          log_debug ("GetModuleFileName failed: %s\n", w32_strerror (0));
+          *dir = 0;
+        }
+      got_dir = 1;
+      p = strrchr (dir, DIRSEP_C);
+      if (p)
+        *p = 0;
+      else
+        {
+          log_debug ("bad filename `%s' returned for this process\n", dir);
+          *dir = 0; 
+        }
+    }
+
+  if (*dir)
+    return dir;
+  /* Fallback to the hardwired value. */
+#endif /*HAVE_W32_SYSTEM*/
+
+  return GNUPG_LIBEXECDIR;
+}
+
+/* Similar to access(2), but uses PATH to find the file. */
+int
+path_access(const char *file,int mode)
+{
+  char *envpath;
+  int ret=-1;
+
+  envpath=getenv("PATH");
+
+  if(!envpath
+#ifdef HAVE_DRIVE_LETTERS
+     || (((file[0]>='A' && file[0]<='Z')
+         || (file[0]>='a' && file[0]<='z'))
+        && file[1]==':')
+#else
+     || file[0]=='/'
+#endif
+     )
+    return access(file,mode);
+  else
+    {
+      /* At least as large as, but most often larger than we need. */
+      char *buffer=xmalloc(strlen(envpath)+1+strlen(file)+1);
+      char *split,*item,*path=xstrdup(envpath);
+
+      split=path;
+
+      while((item=strsep(&split,PATHSEP_S)))
+       {
+         strcpy(buffer,item);
+         strcat(buffer,"/");
+         strcat(buffer,file);
+         ret=access(buffer,mode);
+         if(ret==0)
+           break;
+       }
+
+      xfree(path);
+      xfree(buffer);
+    }
+
+  return ret;
+}
diff --git a/g10/openfile.c b/g10/openfile.c
new file mode 100644 (file)
index 0000000..c106cdb
--- /dev/null
@@ -0,0 +1,430 @@
+/* openfile.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "util.h"
+#include "memory.h"
+#include "ttyio.h"
+#include "options.h"
+#include "main.h"
+#include "status.h"
+#include "i18n.h"
+
+#ifdef USE_ONLY_8DOT3
+#define SKELEXT ".skl"
+#else
+#define SKELEXT EXTSEP_S "skel"
+#endif
+
+#if defined (HAVE_DRIVE_LETTERS) || defined (__riscos__)
+#define CMP_FILENAME(a,b) ascii_strcasecmp( (a), (b) )
+#else
+#define CMP_FILENAME(a,b) strcmp( (a), (b) )
+#endif
+
+#ifdef MKDIR_TAKES_ONE_ARG
+#undef mkdir
+#define mkdir(a,b) mkdir(a)
+#endif
+
+/* FIXME:  Implement opt.interactive. */
+
+/****************
+ * Check whether FNAME exists and ask if it's okay to overwrite an
+ * existing one.
+ * Returns: True: it's okay to overwrite or the file does not exist
+ *         False: Do not overwrite
+ */
+int
+overwrite_filep( const char *fname )
+{
+    if( iobuf_is_pipe_filename (fname) )
+       return 1; /* Writing to stdout is always okay */
+
+    if( access( fname, F_OK ) )
+       return 1; /* does not exist */
+
+#ifndef HAVE_DOSISH_SYSTEM
+    if ( !strcmp ( fname, "/dev/null" ) )
+        return 1; /* does not do any harm */
+#endif
+
+    /* fixme: add some backup stuff in case of overwrite */
+    if( opt.answer_yes )
+       return 1;
+    if( opt.answer_no || opt.batch )
+       return 0;  /* do not overwrite */
+
+    tty_printf(_("File `%s' exists. "), fname);
+    if( cpr_enabled () )
+        tty_printf ("\n");
+    if( cpr_get_answer_is_yes("openfile.overwrite.okay",
+                              _("Overwrite? (y/N) ")) )
+       return 1;
+    return 0;
+}
+
+
+/****************
+ * Strip know extensions from iname and return a newly allocated
+ * filename.  Return NULL if we can't do that.
+ */
+char *
+make_outfile_name( const char *iname )
+{
+    size_t n;
+
+    if ( iobuf_is_pipe_filename (iname) )
+       return xstrdup("-");
+
+    n = strlen(iname);
+    if( n > 4 && (    !CMP_FILENAME(iname+n-4, EXTSEP_S "gpg")
+                  || !CMP_FILENAME(iname+n-4, EXTSEP_S "pgp")
+                  || !CMP_FILENAME(iname+n-4, EXTSEP_S "sig")
+                  || !CMP_FILENAME(iname+n-4, EXTSEP_S "asc") ) ) {
+       char *buf = xstrdup( iname );
+       buf[n-4] = 0;
+       return buf;
+    }
+    else if( n > 5 && !CMP_FILENAME(iname+n-5, EXTSEP_S "sign") ) {
+       char *buf = xstrdup( iname );
+       buf[n-5] = 0;
+       return buf;
+    }
+
+    log_info(_("%s: unknown suffix\n"), iname );
+    return NULL;
+}
+
+
+/****************
+ * Ask for a outputfilename and use the given one as default.
+ * Return NULL if no file has been given or it is not possible to
+ * ask the user.
+ */
+char *
+ask_outfile_name( const char *name, size_t namelen )
+{
+    size_t n;
+    const char *s;
+    char *prompt;
+    char *fname;
+    char *defname;
+
+    if( opt.batch )
+       return NULL;
+
+    s = _("Enter new filename");
+
+    defname = name && namelen? make_printable_string( name, namelen, 0): NULL;
+    n = strlen(s) + (defname?strlen (defname):0) + 10;
+    prompt = xmalloc(n);
+    if( defname )
+       sprintf(prompt, "%s [%s]: ", s, defname );
+    else
+       sprintf(prompt, "%s: ", s );
+    tty_enable_completion(NULL);
+    fname = cpr_get("openfile.askoutname", prompt );
+    cpr_kill_prompt();
+    tty_disable_completion();
+    xfree(prompt);
+    if( !*fname ) {
+       xfree( fname ); fname = NULL;
+       fname = defname; defname = NULL;
+    }
+    xfree(defname);
+    if (fname)
+        trim_spaces (fname);
+    return fname;
+}
+
+
+/****************
+ * Make an output filename for the inputfile INAME.
+ * Returns an IOBUF and an errorcode
+ * Mode 0 = use ".gpg"
+ *     1 = use ".asc"
+ *     2 = use ".sig"
+ */
+int
+open_outfile( const char *iname, int mode, IOBUF *a )
+{
+  int rc = 0;
+
+  *a = NULL;
+  if( iobuf_is_pipe_filename (iname) && !opt.outfile ) {
+    *a = iobuf_create(NULL);
+    if( !*a ) {
+      log_error(_("can't open `%s': %s\n"), "[stdout]", strerror(errno) );
+      rc = G10ERR_CREATE_FILE;
+    }
+    else if( opt.verbose )
+      log_info(_("writing to stdout\n"));
+  }
+  else {
+    char *buf = NULL;
+    const char *name;
+    
+    if( opt.dry_run )
+      name = "/dev/null";
+    else if( opt.outfile )
+      name = opt.outfile;
+    else {
+#ifdef USE_ONLY_8DOT3
+      if (opt.mangle_dos_filenames)
+        {
+          /* It is quite common for DOS system to have only one dot in a
+           * a filename So if we have something like this, we simple
+           * replace the suffix except in cases where the suffix is
+           * larger than 3 characters and not identlically to the new one.
+           * We should really map the filenames to 8.3 but this tends to
+           * be more complicated and is probaly a duty of the filesystem
+           */
+          char *dot;
+          const char *newsfx = mode==1 ? ".asc" :
+                               mode==2 ? ".sig" : ".gpg";
+          
+          buf = xmalloc(strlen(iname)+4+1);
+          strcpy(buf,iname);
+          dot = strrchr(buf, '.' );
+          if ( dot && dot > buf && dot[1] && strlen(dot) <= 4
+               && CMP_FILENAME(newsfx, dot) 
+               && !(strchr (dot, '/') || strchr (dot, '\\')))
+            {
+              /* There is a dot, the dot is not the first character,
+                 the suffix is not longer than 3, the suffix is not
+                 equal to the new suffix and tehre is no path delimter
+                 after the dot (e.g. foo.1/bar): Replace the
+                 suffix. */
+              strcpy (dot, newsfx );
+            }
+          else if ( dot && !dot[1] ) /* Don't duplicate a trailing dot. */
+            strcpy ( dot, newsfx+1 );
+          else
+            strcat ( buf, newsfx ); /* Just append the new suffix. */
+        }
+      if (!buf)
+#endif /* USE_ONLY_8DOT3 */
+        {
+          buf = xmalloc(strlen(iname)+4+1);
+          strcpy(stpcpy(buf,iname), mode==1 ? EXTSEP_S "asc" :
+                                  mode==2 ? EXTSEP_S "sig" : EXTSEP_S "gpg");
+        }
+      name = buf;
+    }
+
+    rc = 0;
+    while( !overwrite_filep (name) )
+      {
+        char *tmp = ask_outfile_name (NULL, 0);
+        if ( !tmp || !*tmp )
+          {
+            xfree (tmp);
+            rc = G10ERR_FILE_EXISTS;
+            break;
+          }
+        xfree (buf);
+        name = buf = tmp;
+      }
+    
+    if( !rc )
+      {
+        if (is_secured_filename (name) )
+          {
+            *a = NULL;
+            errno = EPERM;
+          }
+        else
+          *a = iobuf_create( name );
+        if( !*a )
+          {
+            log_error(_("can't create `%s': %s\n"), name, strerror(errno) );
+            rc = G10ERR_CREATE_FILE;
+          }
+        else if( opt.verbose )
+          log_info(_("writing to `%s'\n"), name );
+      }
+    xfree(buf);
+  }
+
+  if (*a)
+    iobuf_ioctl (*a,3,1,NULL); /* disable fd caching */
+
+  return rc;
+}
+
+
+/****************
+ * Try to open a file without the extension ".sig" or ".asc"
+ * Return NULL if such a file is not available.
+ */
+IOBUF
+open_sigfile( const char *iname, progress_filter_context_t *pfx )
+{
+    IOBUF a = NULL;
+    size_t len;
+
+    if( !iobuf_is_pipe_filename (iname) ) {
+       len = strlen(iname);
+       if( len > 4 && ( !strcmp(iname + len - 4, EXTSEP_S "sig")
+                        || ( len > 5 && !strcmp(iname + len - 5, EXTSEP_S "sign") )
+                        || !strcmp(iname + len - 4, EXTSEP_S "asc")) ) {
+           char *buf;
+           buf = xstrdup(iname);
+           buf[len-(buf[len-1]=='n'?5:4)] = 0 ;
+           a = iobuf_open( buf );
+            if (a && is_secured_file (iobuf_get_fd (a)))
+              {
+                iobuf_close (a);
+                a = NULL;
+                errno = EPERM;
+              }
+           if( a && opt.verbose )
+               log_info(_("assuming signed data in `%s'\n"), buf );
+           if (a && pfx)
+             handle_progress (pfx, a, buf);
+            xfree(buf);
+       }
+    }
+    return a;
+}
+
+/****************
+ * Copy the option file skeleton to the given directory.
+ */
+static void
+copy_options_file( const char *destdir )
+{
+    const char *datadir = GNUPG_DATADIR;
+    char *fname;
+    FILE *src, *dst;
+    int linefeeds=0;
+    int c;
+    mode_t oldmask;
+    int esc = 0;
+    int any_option = 0;
+
+    if( opt.dry_run )
+       return;
+
+    fname = xmalloc( strlen(datadir) + strlen(destdir) + 15 );
+    strcpy(stpcpy(fname, datadir), DIRSEP_S "options" SKELEXT );
+    src = fopen( fname, "r" );
+    if (src && is_secured_file (fileno (src)))
+      {
+        fclose (src);
+        src = NULL;
+        errno = EPERM;
+      }
+    if( !src ) {
+       log_error(_("can't open `%s': %s\n"), fname, strerror(errno) );
+       xfree(fname);
+       return;
+    }
+    strcpy(stpcpy(fname, destdir), DIRSEP_S "gpg" EXTSEP_S "conf" );
+    oldmask=umask(077);
+    if ( is_secured_filename (fname) )
+      {
+        dst = NULL;
+        errno = EPERM;
+      }
+    else
+      dst = fopen( fname, "w" );
+    umask(oldmask);
+    if( !dst ) {
+       log_error(_("can't create `%s': %s\n"), fname, strerror(errno) );
+       fclose( src );
+       xfree(fname);
+       return;
+    }
+
+    while( (c=getc(src)) != EOF ) {
+       if( linefeeds < 3 ) {
+           if( c == '\n' )
+               linefeeds++;
+       }
+       else {
+           putc( c, dst );
+            if (c== '\n')
+                esc = 1;
+            else if (esc == 1) {
+                if (c == ' ' || c == '\t')
+                    ;
+                else if (c == '#')
+                    esc = 2;
+                else 
+                    any_option = 1;
+            }
+        }
+    }
+    fclose( dst );
+    fclose( src );
+    log_info(_("new configuration file `%s' created\n"), fname );
+    if (any_option)
+        log_info (_("WARNING: options in `%s'"
+                    " are not yet active during this run\n"),
+                  fname);
+    xfree(fname);
+}
+
+
+void
+try_make_homedir( const char *fname )
+{
+    const char *defhome = GNUPG_HOMEDIR;
+
+    /* Create the directory only if the supplied directory name
+     * is the same as the default one.  This way we avoid to create
+     * arbitrary directories when a non-default homedirectory is used.
+     * To cope with HOME, we do compare only the suffix if we see that
+     * the default homedir does start with a tilde.
+     */
+    if( opt.dry_run || opt.no_homedir_creation )
+       return;
+
+    if ( ( *defhome == '~'
+           && ( strlen(fname) >= strlen (defhome+1)
+                && !strcmp(fname+strlen(fname)-strlen(defhome+1),
+                           defhome+1 ) ))
+         || ( *defhome != '~'
+              && !compare_filenames( fname, defhome ) )
+        ) {
+       if( mkdir( fname, S_IRUSR|S_IWUSR|S_IXUSR ) )
+           log_fatal( _("can't create directory `%s': %s\n"),
+                                       fname,  strerror(errno) );
+       else if( !opt.quiet )
+           log_info( _("directory `%s' created\n"), fname );
+       copy_options_file( fname );
+/*     log_info(_("you have to start GnuPG again, " */
+/*                "so it can read the new configuration file\n") ); */
+/*     g10_exit(1); */
+    }
+}
diff --git a/g10/options.h b/g10/options.h
new file mode 100644 (file)
index 0000000..8f866e2
--- /dev/null
@@ -0,0 +1,335 @@
+/* options.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_OPTIONS_H
+#define G10_OPTIONS_H
+
+#include <sys/types.h>
+#include <types.h>
+#include "main.h"
+#include "packet.h"
+
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+/* Norcraft can't cope with common symbols */
+#if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+#define EXTERN_UNLESS_MAIN_MODULE extern
+#else
+#define EXTERN_UNLESS_MAIN_MODULE 
+#endif
+#endif
+
+EXTERN_UNLESS_MAIN_MODULE
+struct
+{
+  int verbose;
+  int quiet;
+  unsigned debug;
+  int armor;
+  char *outfile;
+  off_t max_output;
+  int dry_run;
+  int list_only;
+  int textmode;
+  int expert;
+  const char *def_sig_expire;
+  int ask_sig_expire;
+  const char *def_cert_expire;
+  int ask_cert_expire;
+  int batch;       /* run in batch mode */
+  int answer_yes; /* answer yes on most questions */
+  int answer_no;  /* answer no on most questions */
+  int check_sigs; /* check key signatures */
+  int with_colons;
+  int with_key_data;
+  int with_fingerprint; /* opt --with-fingerprint active */
+  int fingerprint; /* list fingerprints */
+  int list_sigs;   /* list signatures */
+  int no_armor;
+  int list_packets; /* list-packets mode: 1=normal, 2=invoked by command*/
+  int def_cipher_algo;
+  int force_v3_sigs;
+  int force_v4_certs;
+  int force_mdc;
+  int disable_mdc;
+  int def_digest_algo;
+  int cert_digest_algo;
+  int compress_algo;
+  int compress_level;
+  int bz2_compress_level;
+  int bz2_decompress_lowmem;
+  const char *def_secret_key;
+  char *def_recipient;
+  int def_recipient_self;
+  int def_cert_level;
+  int min_cert_level;
+  int ask_cert_level;
+  int no_version;
+  int marginals_needed;
+  int completes_needed;
+  int max_cert_depth;
+  const char *homedir;
+
+  char *display;      /* 5 options to be passed to the gpg-agent */
+  char *ttyname;     
+  char *ttytype;
+  char *lc_ctype;
+  char *lc_messages;
+
+  int skip_verify;
+  int compress_keys;
+  int compress_sigs;
+  /* TM_CLASSIC must be zero to accomodate trustdbs generated before
+     we started storing the trust model inside the trustdb. */
+  enum
+    {
+      TM_CLASSIC=0, TM_PGP=1, TM_EXTERNAL=2, TM_ALWAYS, TM_DIRECT, TM_AUTO
+    } trust_model;
+  int force_ownertrust;
+  enum
+    {
+      CO_GNUPG=0, CO_RFC2440, CO_RFC1991, CO_PGP2, CO_PGP6, CO_PGP7, CO_PGP8
+    } compliance;
+  enum
+    {
+      KF_SHORT, KF_LONG, KF_0xSHORT, KF_0xLONG
+    } keyid_format;
+  int pgp2_workarounds;
+  int shm_coprocess;
+  const char *set_filename;
+  STRLIST comments;
+  int throw_keyid;
+  const char *photo_viewer;
+  int s2k_mode;
+  int s2k_digest_algo;
+  int s2k_cipher_algo;
+  unsigned char s2k_count; /* This is the encoded form, not the raw
+                             count */
+  int simple_sk_checksum; /* create the deprecated rfc2440 secret key
+                            protection */
+  int not_dash_escaped;
+  int escape_from;
+  int lock_once;
+  struct keyserver_spec
+  {
+    char *uri;
+    char *scheme;
+    char *auth;
+    char *host;
+    char *port;
+    char *path;
+    char *opaque;
+    STRLIST options;
+    struct
+    {
+      unsigned int direct_uri:1;
+    } flags;
+    struct keyserver_spec *next;
+  } *keyserver;
+  struct
+  {
+    unsigned int options;
+    unsigned int import_options;
+    unsigned int export_options;
+    STRLIST other;
+  } keyserver_options;
+  int exec_disable;
+  int exec_path_set;
+  unsigned int import_options;
+  unsigned int export_options;
+  unsigned int list_options;
+  unsigned int verify_options;
+  const char *def_preference_list;
+  const char *def_keyserver_url;
+  prefitem_t *personal_cipher_prefs;
+  prefitem_t *personal_digest_prefs;
+  prefitem_t *personal_compress_prefs;
+  int no_perm_warn;
+  int no_mdc_warn;
+  char *temp_dir;
+  int no_encrypt_to;
+  int interactive;
+  struct notation *sig_notations;
+  struct notation *cert_notations;
+  STRLIST sig_policy_url;
+  STRLIST cert_policy_url;
+  STRLIST sig_keyserver_url;
+  STRLIST cert_subpackets;
+  STRLIST sig_subpackets;
+  int allow_non_selfsigned_uid;
+  int allow_freeform_uid;
+  int no_literal;
+  ulong set_filesize;
+  int fast_list_mode;
+  int fixed_list_mode;
+  int ignore_time_conflict;
+  int ignore_valid_from;
+  int ignore_crc_error;
+  int ignore_mdc_error;
+  int command_fd;
+  const char *override_session_key;
+  int show_session_key;
+  int use_agent;
+  const char *gpg_agent_info;
+  int try_all_secrets;
+  int no_expensive_trust_checks;
+  int no_sig_cache;
+  int no_sig_create_check;
+  int no_auto_check_trustdb;
+  int preserve_permissions;
+  int no_homedir_creation;
+  struct groupitem *grouplist;
+  int strict;
+  int mangle_dos_filenames;
+  int enable_progress_filter;
+  unsigned int screen_columns;
+  unsigned int screen_lines;
+  byte *show_subpackets;
+  int rfc2440_text;
+
+  /* If true, let write failures on the status-fd exit the process. */
+  int exit_on_status_write_error;
+
+  /* If > 0, limit the number of card insertion prompts to this
+     value. */
+  int limit_card_insert_tries; 
+
+#ifdef ENABLE_CARD_SUPPORT
+  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
+       made by signing subkeys.  If not set, a missing backsig is not
+       an error (but an invalid backsig still is). */
+    unsigned int require_cross_cert:1;
+    unsigned int use_embedded_filename:1;
+    unsigned int utf8_filename:1;
+    unsigned int dsa2:1;
+  } flags;
+
+  /* Linked list of ways to find a key if the key isn't on the local
+     keyring. */
+  struct akl
+  {
+    enum {AKL_CERT, AKL_PKA, AKL_LDAP, AKL_KEYSERVER, AKL_SPEC} type;
+    struct keyserver_spec *spec;
+    struct akl *next;
+  } *auto_key_locate;
+
+  /* True if multiple concatenated signatures may be verified. */
+  int allow_multisig_verification; 
+  int passwd_repeat;
+} opt;
+
+/* CTRL is used to keep some global variables we currently can't
+   avoid.  Future concurrent versions of gpg will put it into a per
+   request structure CTRL. */
+EXTERN_UNLESS_MAIN_MODULE
+struct {
+  int in_auto_key_retrieve; /* True if we are doing an
+                               auto_key_retrieve. */
+} glo_ctrl;
+
+#define DBG_PACKET_VALUE  1    /* debug packet reading/writing */
+#define DBG_MPI_VALUE    2     /* debug mpi details */
+#define DBG_CIPHER_VALUE  4    /* debug cipher handling */
+                               /* (may reveal sensitive data) */
+#define DBG_FILTER_VALUE  8    /* debug internal filter handling */
+#define DBG_IOBUF_VALUE   16   /* debug iobuf stuff */
+#define DBG_MEMORY_VALUE  32   /* debug memory allocation stuff */
+#define DBG_CACHE_VALUE   64   /* debug the cacheing */
+#define DBG_MEMSTAT_VALUE 128  /* show memory statistics */
+#define DBG_TRUST_VALUE   256  /* debug the trustdb */
+#define DBG_HASHING_VALUE 512  /* debug hashing operations */
+#define DBG_EXTPROG_VALUE 1024  /* debug external program calls */
+#define DBG_CARD_IO_VALUE 2048  /* debug smart card I/O.  */
+
+#define DBG_PACKET (opt.debug & DBG_PACKET_VALUE)
+#define DBG_FILTER (opt.debug & DBG_FILTER_VALUE)
+#define DBG_CACHE  (opt.debug & DBG_CACHE_VALUE)
+#define DBG_TRUST  (opt.debug & DBG_TRUST_VALUE)
+#define DBG_HASHING (opt.debug & DBG_HASHING_VALUE)
+#define DBG_EXTPROG (opt.debug & DBG_EXTPROG_VALUE)
+#define DBG_CARD_IO (opt.debug & DBG_CARD_IO_VALUE)
+
+
+#define GNUPG   (opt.compliance==CO_GNUPG)
+#define RFC1991 (opt.compliance==CO_RFC1991 || opt.compliance==CO_PGP2)
+#define RFC2440 (opt.compliance==CO_RFC2440)
+#define PGP2    (opt.compliance==CO_PGP2)
+#define PGP6    (opt.compliance==CO_PGP6)
+#define PGP7    (opt.compliance==CO_PGP7)
+#define PGP8    (opt.compliance==CO_PGP8)
+
+/* Various option flags.  Note that there should be no common string
+   names between the IMPORT_ and EXPORT_ flags as they can be mixed in
+   the keyserver-options option. */
+
+#define IMPORT_LOCAL_SIGS                (1<<0)
+#define IMPORT_REPAIR_PKS_SUBKEY_BUG     (1<<1)
+#define IMPORT_FAST                      (1<<2)
+#define IMPORT_SK2PK                     (1<<3)
+#define IMPORT_MERGE_ONLY                (1<<4)
+#define IMPORT_MINIMAL                   (1<<5)
+#define IMPORT_CLEAN                     (1<<6)
+
+#define EXPORT_LOCAL_SIGS                (1<<0)
+#define EXPORT_ATTRIBUTES                (1<<1)
+#define EXPORT_SENSITIVE_REVKEYS         (1<<2)
+#define EXPORT_RESET_SUBKEY_PASSWD       (1<<3)
+#define EXPORT_MINIMAL                   (1<<4)
+#define EXPORT_CLEAN                     (1<<5)
+
+#define LIST_SHOW_PHOTOS                 (1<<0)
+#define LIST_SHOW_POLICY_URLS            (1<<1)
+#define LIST_SHOW_STD_NOTATIONS          (1<<2)
+#define LIST_SHOW_USER_NOTATIONS         (1<<3)
+#define LIST_SHOW_NOTATIONS (LIST_SHOW_STD_NOTATIONS|LIST_SHOW_USER_NOTATIONS)
+#define LIST_SHOW_KEYSERVER_URLS         (1<<4)
+#define LIST_SHOW_UID_VALIDITY           (1<<5)
+#define LIST_SHOW_UNUSABLE_UIDS          (1<<6)
+#define LIST_SHOW_UNUSABLE_SUBKEYS       (1<<7)
+#define LIST_SHOW_KEYRING                (1<<8)
+#define LIST_SHOW_SIG_EXPIRE             (1<<9)
+#define LIST_SHOW_SIG_SUBPACKETS         (1<<10)
+
+#define VERIFY_SHOW_PHOTOS               (1<<0)
+#define VERIFY_SHOW_POLICY_URLS          (1<<1)
+#define VERIFY_SHOW_STD_NOTATIONS        (1<<2)
+#define VERIFY_SHOW_USER_NOTATIONS       (1<<3)
+#define VERIFY_SHOW_NOTATIONS (VERIFY_SHOW_STD_NOTATIONS|VERIFY_SHOW_USER_NOTATIONS)
+#define VERIFY_SHOW_KEYSERVER_URLS       (1<<4)
+#define VERIFY_SHOW_UID_VALIDITY         (1<<5)
+#define VERIFY_SHOW_UNUSABLE_UIDS        (1<<6)
+#define VERIFY_PKA_LOOKUPS               (1<<7)
+#define VERIFY_PKA_TRUST_INCREASE        (1<<8)
+
+#define KEYSERVER_USE_TEMP_FILES         (1<<0)
+#define KEYSERVER_KEEP_TEMP_FILES        (1<<1)
+#define KEYSERVER_ADD_FAKE_V3            (1<<2)
+#define KEYSERVER_AUTO_KEY_RETRIEVE      (1<<3)
+#define KEYSERVER_HONOR_KEYSERVER_URL    (1<<4)
+#define KEYSERVER_HONOR_PKA_RECORD       (1<<5)
+
+#endif /*G10_OPTIONS_H*/
diff --git a/g10/options.skel b/g10/options.skel
new file mode 100644 (file)
index 0000000..83c0949
--- /dev/null
@@ -0,0 +1,241 @@
+# These first three lines are not copied to the gpg.conf file in
+# the users home directory.
+# $Id: options.skel 4106 2006-04-11 19:20:08Z dshaw $
+# Options for GnuPG
+# Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+# 
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+# 
+# This 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.
+#
+# Unless you specify which option file to use (with the command line
+# option "--options filename"), GnuPG uses the file ~/.gnupg/gpg.conf
+# by default.
+#
+# An options file can contain any long options which are available in
+# 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.
+
+# 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
+# default recipient.
+
+#default-recipient some-user-id
+#default-recipient-self
+
+# Use --encrypt-to to add the specified key as a recipient to all
+# messages.  This is useful, for example, when sending mail through a
+# mail client that does not automatically encrypt mail to your key.
+# In the example, this option allows you to read your local copy of
+# encrypted mail that you've sent to others.
+
+#encrypt-to some-key-id
+
+# By default GnuPG creates version 3 signatures for data files.  This
+# is not strictly OpenPGP compliant but PGP 6 and most versions of PGP
+# 7 require them.  To disable this behavior, you may use this option
+# or --openpgp.
+
+#no-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
+
+# 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.  In most cases this option is not required 
+# GnuPG is able to figure out the correct charset and use that.
+
+#charset utf-8
+
+# Group names may be defined like this:
+#   group mynames = paige 0x12345678 joe patti
+#
+# Any time "mynames" is a recipient (-r or --recipient), it will be
+# expanded to the names "paige", "joe", and "patti", and the key ID
+# "0x12345678".  Note there is only one level of expansion - you
+# cannot make an group that points to another group.  Note also that
+# if there are spaces in the recipient name, this will appear as two
+# recipients.  In these cases it is better to use the key ID.
+
+#group mynames = paige 0x12345678 joe patti
+
+# 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, which is usually preferable.
+
+#lock-once
+
+# GnuPG can send and receive keys to and from a keyserver.  These
+# servers can be HKP, email, or LDAP (if GnuPG is built with LDAP
+# support).
+#
+# Example HKP keyserver:
+#      hkp://subkeys.pgp.net
+#
+# Example email keyserver:
+#      mailto:pgp-public-keys@keys.pgp.net
+#
+# Example LDAP keyservers:
+#      ldap://keyserver.pgp.com
+#
+# Regular URL syntax applies, and you can set an alternate port
+# through the usual method:
+#      hkp://keyserver.example.net:22742
+#
+# If you have problems connecting to a HKP server through a buggy http
+# proxy, you can use keyserver option broken-http-proxy (see below),
+# but first you should make sure that you have read the man page
+# regarding proxies (keyserver option honor-http-proxy)
+#
+# Most users just set the name and type of their preferred keyserver.
+# Note that most servers (with the notable exception of
+# ldap://keyserver.pgp.com) synchronize changes with each other.  Note
+# also that a single server name may actually point to multiple
+# servers via DNS round-robin.  hkp://subkeys.pgp.net is an example of
+# such a "server", which spreads the load over a number of physical
+# servers.
+
+keyserver hkp://subkeys.pgp.net
+#keyserver mailto:pgp-public-keys@keys.nl.pgp.net
+#keyserver ldap://keyserver.pgp.com
+
+# Common options for keyserver functions:
+#
+# include-disabled = when searching, include keys marked as "disabled"
+#                    on the keyserver (not all keyservers support this).
+#
+# no-include-revoked = when searching, do not include keys marked as
+#                      "revoked" on the keyserver.
+#
+# verbose = show more information as the keys are fetched.
+#           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
+#                     present on the keyring.
+#
+# no-include-attributes = do not include attribute IDs (aka "photo IDs")
+#                         when sending keys to the keyserver.
+
+#keyserver-options auto-key-retrieve
+
+# Display photo user IDs in key listings
+
+# list-options show-photos
+
+# Display photo user IDs when a signature from a key with a photo is
+# verified
+
+# verify-options show-photos
+
+# Use this program to display photo user IDs
+#
+# %i is expanded to a temporary file that contains the photo.
+# %I is the same as %i, but the file isn't deleted afterwards by GnuPG.
+# %k is expanded to the key ID of the key.
+# %K is expanded to the long OpenPGP key ID of the key.
+# %t is expanded to the extension of the image (e.g. "jpg").
+# %T is expanded to the MIME type of the image (e.g. "image/jpeg").
+# %f is expanded to the fingerprint of the key.
+# %% is %, of course.
+#
+# If %i or %I are not present, then the photo is supplied to the
+# viewer on standard input.  If your platform supports it, standard
+# input is the best way to do this as it avoids the time and effort in
+# generating and then cleaning up a secure temp file.
+#
+# If no photo-viewer is provided, GnuPG will look for xloadimage, eog,
+# or display (ImageMagick).  On Mac OS X and Windows, the default is
+# to use your regular JPEG image viewer.
+#
+# Some other viewers:
+# photo-viewer "qiv %i"
+# photo-viewer "ee %i"
+#
+# This one saves a copy of the photo ID in your home directory:
+# photo-viewer "cat > ~/photoid-for-key-%k.%t"
+#
+# Use your MIME handler to view photos:
+# photo-viewer "metamail -q -d -b -c %T -s 'KeyID 0x%k' -f GnuPG"
+
+# Passphrase agent
+#
+# We support the old experimental passphrase agent protocol as well as
+# the new Assuan based one (currently available in the "newpg" package
+# at ftp.gnupg.org/gcrypt/alpha/aegypten/).  To make use of the agent,
+# you have to run an agent as daemon and use the option
+#
+# use-agent
+# 
+# which tries to use the agent but will fallback to the regular mode
+# if there is a problem connecting to the agent.  The normal way to
+# locate the agent is by looking at the environment variable
+# GPG_AGENT_INFO which should have been set during gpg-agent startup.
+# In certain situations the use of this variable is not possible, thus
+# the option
+# 
+# --gpg-agent-info=<path>:<pid>:1
+#
+# may be used to override it.
+
+# Automatic key location
+#
+# GnuPG can automatically locate and retrieve keys as needed using the
+# auto-key-locate option.  This happens when encrypting to an email
+# address (in the "user@example.com" form), and there are no
+# user@example.com keys on the local keyring.  This option takes the
+# following arguments, in the order they are to be tried:
+# 
+# cert = locate a key using DNS CERT, as specified in 2538bis
+# (currently in draft): http://www.josefsson.org/rfc2538bis/
+#
+# pka = locate a key using DNS PKA.
+#
+# ldap = locate a key using the PGP Universal method of checking
+# "ldap://keys.(thedomain)".
+#
+# keyserver = locate a key using whatever keyserver is defined using
+# the keyserver option.
+#
+# You may also list arbitrary keyservers here by URL.
+#
+# Try CERT, then PKA, then LDAP, then hkp://subkeys.net:
+#auto-key-locate cert pka ldap hkp://subkeys.pgp.net
diff --git a/g10/packet.h b/g10/packet.h
new file mode 100644 (file)
index 0000000..f318133
--- /dev/null
@@ -0,0 +1,569 @@
+/* packet.h - packet definitions
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_PACKET_H
+#define G10_PACKET_H
+
+#include "types.h"
+#include "iobuf.h"
+#include "mpi.h"
+#include "cipher.h"
+#include "filter.h"
+#include "global.h"
+
+#define DEBUG_PARSE_PACKET 1
+
+typedef enum {
+       PKT_NONE           =0,
+       PKT_PUBKEY_ENC     =1, /* public key encrypted packet */
+       PKT_SIGNATURE      =2, /* secret key encrypted packet */
+       PKT_SYMKEY_ENC     =3, /* session key packet (OpenPGP)*/
+       PKT_ONEPASS_SIG    =4, /* one pass sig packet (OpenPGP)*/
+       PKT_SECRET_KEY     =5, /* secret key */
+       PKT_PUBLIC_KEY     =6, /* public key */
+       PKT_SECRET_SUBKEY  =7, /* secret subkey (OpenPGP) */
+       PKT_COMPRESSED     =8, /* compressed data packet */
+       PKT_ENCRYPTED      =9, /* conventional encrypted data */
+       PKT_MARKER        =10, /* marker packet (OpenPGP) */
+       PKT_PLAINTEXT     =11, /* plaintext data with filename and mode */
+       PKT_RING_TRUST    =12, /* keyring trust packet */
+       PKT_USER_ID       =13, /* user id packet */
+       PKT_PUBLIC_SUBKEY =14, /* public subkey (OpenPGP) */
+       PKT_OLD_COMMENT   =16, /* comment packet from an OpenPGP draft */
+       PKT_ATTRIBUTE     =17, /* PGP's attribute packet */
+       PKT_ENCRYPTED_MDC =18, /* integrity protected encrypted data */
+       PKT_MDC           =19, /* manipulation detection code packet */
+       PKT_COMMENT       =61, /* new comment packet (private) */
+        PKT_GPG_CONTROL   =63  /* internal control packet */
+} pkttype_t;
+
+typedef struct packet_struct PACKET;
+
+/* PKT_GPG_CONTROL types */
+typedef enum {
+    CTRLPKT_CLEARSIGN_START = 1,
+    CTRLPKT_PIPEMODE = 2,
+    CTRLPKT_PLAINTEXT_MARK =3
+} ctrlpkttype_t;
+
+typedef enum {
+    PREFTYPE_NONE = 0,
+    PREFTYPE_SYM = 1,
+    PREFTYPE_HASH = 2,
+    PREFTYPE_ZIP = 3
+} preftype_t;
+
+typedef struct {
+    byte type; 
+    byte value;
+} prefitem_t;
+
+typedef struct {
+    int  mode;
+    byte hash_algo;
+    byte salt[8];
+    u32  count;
+} STRING2KEY;
+
+typedef struct {
+    byte version;
+    byte cipher_algo;   /* cipher algorithm used */
+    STRING2KEY s2k;
+    byte seskeylen;   /* keylength in byte or 0 for no seskey */
+    byte seskey[1];
+} PKT_symkey_enc;
+
+typedef struct {
+    u32     keyid[2];      /* 64 bit keyid */
+    byte    version;
+    byte    pubkey_algo;    /* algorithm used for public key scheme */
+    byte    throw_keyid;
+    MPI     data[PUBKEY_MAX_NENC];
+} PKT_pubkey_enc;
+
+
+typedef struct {
+    u32     keyid[2];      /* 64 bit keyid */
+    byte    sig_class;     /* sig classification */
+    byte    digest_algo;    /* algorithm used for digest */
+    byte    pubkey_algo;    /* algorithm used for public key scheme */
+    byte    last;          /* a stupid flag */
+} PKT_onepass_sig;
+
+
+typedef struct {
+    size_t size;  /* allocated */
+    size_t len;   /* used */
+    byte data[1];
+} subpktarea_t;
+
+struct revocation_key {
+  byte class;
+  byte algid;
+  byte fpr[MAX_FINGERPRINT_LEN];
+};
+
+
+/* Object to keep information about a PKA DNS record. */
+typedef struct
+{
+  int valid;    /* An actual PKA record exists for EMAIL. */
+  int checked;  /* Set to true if the FPR has been checked against the
+                   actual key. */
+  char *uri;    /* Malloced string with the URI. NULL if the URI is
+                   not available.*/
+  unsigned char fpr[20]; /* The fingerprint as stored in the PKA RR. */
+  char email[1];/* The email address from the notation data. */
+} pka_info_t;
+
+
+/* Object to keep information pertaining to a signature. */
+typedef struct 
+{
+  struct 
+  {
+    unsigned checked:1;         /* Signature has been checked. */
+    unsigned valid:1;           /* Signature is good (if checked is set). */
+    unsigned chosen_selfsig:1;  /* A selfsig that is the chosen one. */
+    unsigned unknown_critical:1;
+    unsigned exportable:1;
+    unsigned revocable:1;
+    unsigned policy_url:1;  /* At least one policy URL is present */
+    unsigned notation:1;    /* At least one notation is present */
+    unsigned pref_ks:1;     /* At least one preferred keyserver is present */
+    unsigned expired:1;
+    unsigned pka_tried:1;   /* Set if we tried to retrieve the PKA record. */
+  } flags;
+  u32     keyid[2];      /* 64 bit keyid */
+  u32     timestamp;     /* Signature made (seconds since Epoch). */
+  u32     expiredate;     /* Expires at this date or 0 if not at all. */
+  byte    version;
+  byte    sig_class;     /* Sig classification, append for MD calculation. */
+  byte    pubkey_algo;    /* Algorithm used for public key scheme */
+                          /* (PUBKEY_ALGO_xxx) */
+  byte    digest_algo;    /* Algorithm used for digest (DIGEST_ALGO_xxxx). */
+  byte    trust_depth;
+  byte    trust_value;
+  const byte *trust_regexp;
+  struct revocation_key **revkey;
+  int numrevkeys;
+  pka_info_t *pka_info;      /* Malloced PKA data or NULL if not
+                                available.  See also flags.pka_tried. */
+  subpktarea_t *hashed;      /* All subpackets with hashed data (v4 only). */
+  subpktarea_t *unhashed;    /* Ditto for unhashed data. */
+  byte digest_start[2];      /* First 2 bytes of the digest. */
+  MPI  data[PUBKEY_MAX_NSIG];
+} PKT_signature;
+
+#define ATTRIB_IMAGE 1
+
+/* This is the cooked form of attributes */
+struct user_attribute {
+  byte type;
+  const byte *data;
+  u32 len;
+};
+
+typedef struct
+{
+  int ref;              /* reference counter */
+  int len;             /* length of the name */
+  struct user_attribute *attribs;
+  int numattribs;
+  byte *attrib_data;    /* if this is not NULL, the packet is an attribute */
+  unsigned long attrib_len;
+  byte *namehash;
+  int help_key_usage;
+  u32 help_key_expire;
+  int help_full_count;
+  int help_marginal_count;
+  int is_primary;       /* 2 if set via the primary flag, 1 if calculated */
+  int is_revoked;
+  int is_expired;
+  u32 expiredate;       /* expires at this date or 0 if not at all */
+  prefitem_t *prefs;    /* list of preferences (may be NULL)*/
+  u32 created;          /* according to the self-signature */
+  byte selfsigversion;
+  struct
+  {
+    /* TODO: Move more flags here */
+    unsigned mdc:1;
+    unsigned ks_modify:1;
+    unsigned compacted:1;
+  } flags;
+  char name[1];
+} PKT_user_id;
+
+struct revoke_info
+{
+  /* revoked at this date */
+  u32 date;
+  /* the keyid of the revoking key (selfsig or designated revoker) */
+  u32 keyid[2];
+  /* the algo of the revoking key */
+  byte algo;
+};
+
+/****************
+ * Note about the pkey/skey elements:  We assume that the secret keys
+ * has the same elemts as the public key at the begin of the array, so
+ * that npkey < nskey and it is possible to compare the secret and
+ * public keys by comparing the first npkey elements of pkey againts skey.
+ */
+typedef struct {
+    u32     timestamp;     /* key made */
+    u32     expiredate;     /* expires at this date or 0 if not at all */
+    u32     max_expiredate; /* must not expire past this date */
+    struct revoke_info revoked;
+    byte    hdrbytes;      /* number of header bytes */
+    byte    version;
+    byte    selfsigversion; /* highest version of all of the self-sigs */
+    byte    pubkey_algo;    /* algorithm used for public key scheme */
+    byte    pubkey_usage;   /* for now only used to pass it to getkey() */
+    byte    req_usage;      /* hack to pass a request to getkey() */
+    byte    req_algo;       /* Ditto */
+    u32     has_expired;    /* set to the expiration date if expired */ 
+    int     is_revoked;     /* key has been revoked, 1 if by the
+                              owner, 2 if by a designated revoker */
+    int     maybe_revoked;  /* a designated revocation is present, but
+                              without the key to check it */
+    int     is_valid;       /* key (especially subkey) is valid */
+    int     dont_cache;     /* do not cache this */
+    byte    backsig;        /* 0=none, 1=bad, 2=good */
+    u32     main_keyid[2];  /* keyid of the primary key */
+    u32     keyid[2];      /* calculated by keyid_from_pk() */
+    byte    is_primary;
+    byte    is_disabled;    /* 0 for unset, 1 for enabled, 2 for disabled. */
+    prefitem_t *prefs;      /* list of preferences (may be NULL) */
+    int     mdc_feature;    /* mdc feature set */
+    PKT_user_id *user_id;   /* if != NULL: found by that uid */
+    struct revocation_key *revkey;
+    int     numrevkeys;
+    u32     trust_timestamp;
+    byte    trust_depth;
+    byte    trust_value;
+    const byte *trust_regexp;
+    MPI     pkey[PUBKEY_MAX_NPKEY];
+} PKT_public_key;
+
+/* Evaluates as true if the pk is disabled, and false if it isn't.  If
+   there is no disable value cached, fill one in. */
+#define pk_is_disabled(a) (((a)->is_disabled)?((a)->is_disabled==2):(cache_disabled_value((a))))
+
+typedef struct {
+    u32     timestamp;     /* key made */
+    u32     expiredate;     /* expires at this date or 0 if not at all */
+    u32     max_expiredate; /* must not expire past this date */
+    byte    hdrbytes;      /* number of header bytes */
+    byte    version;
+    byte    pubkey_algo;    /* algorithm used for public key scheme */
+    byte    pubkey_usage;
+    byte    req_usage;
+    byte    req_algo;
+    u32     has_expired;    /* set to the expiration date if expired */ 
+    int     is_revoked;     /* key has been revoked */
+    int     is_valid;       /* key (especially subkey) is valid */
+    u32     main_keyid[2];  /* keyid of the primary key */
+    u32     keyid[2];   
+    byte is_primary;
+    byte is_protected; /* The secret info is protected and must */
+                       /* be decrypted before use, the protected */
+                       /* MPIs are simply (void*) pointers to memory */
+                       /* and should never be passed to a mpi_xxx() */
+    struct {
+       byte algo;  /* cipher used to protect the secret information*/
+        byte sha1chk;  /* SHA1 is used instead of a 16 bit checksum */ 
+       STRING2KEY s2k;
+       byte ivlen;  /* used length of the iv */
+       byte iv[16]; /* initialization vector for CFB mode */
+    } protect;
+    MPI skey[PUBKEY_MAX_NSKEY];
+    u16 csum;          /* checksum */
+} PKT_secret_key;
+
+
+typedef struct {
+    int  len;            /* length of data */
+    char data[1];
+} PKT_comment;
+
+typedef struct {
+    u32  len;            /* reserved */
+    byte  new_ctb;
+    byte  algorithm;
+    IOBUF buf;           /* IOBUF reference */
+} PKT_compressed;
+
+typedef struct {
+    u32  len;            /* length of encrypted data */
+    int  extralen;        /* this is (blocksize+2) */
+    byte new_ctb;        /* uses a new CTB */
+    byte is_partial;      /* partial length encoded */
+    byte mdc_method;     /* > 0: integrity protected encrypted data packet */
+    IOBUF buf;           /* IOBUF reference */
+} PKT_encrypted;
+
+typedef struct {
+    byte hash[20];
+} PKT_mdc;
+
+typedef struct {
+    unsigned int trustval;
+    unsigned int sigcache;
+} PKT_ring_trust;
+
+typedef struct {
+    u32  len;            /* length of encrypted data */
+    IOBUF buf;           /* IOBUF reference */
+    byte new_ctb;
+    byte is_partial;      /* partial length encoded */
+    int mode;
+    u32 timestamp;
+    int  namelen;
+    char name[1];
+} PKT_plaintext;
+
+typedef struct {
+    int  control;
+    size_t datalen;
+    char data[1];
+} PKT_gpg_control;
+
+/* combine all packets into a union */
+struct packet_struct {
+    pkttype_t pkttype;
+    union {
+       void *generic;
+       PKT_symkey_enc  *symkey_enc;    /* PKT_SYMKEY_ENC */
+       PKT_pubkey_enc  *pubkey_enc;    /* PKT_PUBKEY_ENC */
+       PKT_onepass_sig *onepass_sig;   /* PKT_ONEPASS_SIG */
+       PKT_signature   *signature;     /* PKT_SIGNATURE */
+       PKT_public_key  *public_key;    /* PKT_PUBLIC_[SUB)KEY */
+       PKT_secret_key  *secret_key;    /* PKT_SECRET_[SUB]KEY */
+       PKT_comment     *comment;       /* PKT_COMMENT */
+       PKT_user_id     *user_id;       /* PKT_USER_ID */
+       PKT_compressed  *compressed;    /* PKT_COMPRESSED */
+       PKT_encrypted   *encrypted;     /* PKT_ENCRYPTED[_MDC] */
+       PKT_mdc         *mdc;           /* PKT_MDC */
+       PKT_ring_trust  *ring_trust;    /* PKT_RING_TRUST */
+       PKT_plaintext   *plaintext;     /* PKT_PLAINTEXT */
+        PKT_gpg_control *gpg_control;   /* PKT_GPG_CONTROL */
+    } pkt;
+};
+
+#define init_packet(a) do { (a)->pkttype = 0;          \
+                           (a)->pkt.generic = NULL;    \
+                      } while(0)
+
+typedef enum {
+    SIGSUBPKT_TEST_CRITICAL=-3,
+    SIGSUBPKT_LIST_UNHASHED=-2,
+    SIGSUBPKT_LIST_HASHED  =-1,
+    SIGSUBPKT_NONE        = 0,
+    SIGSUBPKT_SIG_CREATED  = 2, /* signature creation time */
+    SIGSUBPKT_SIG_EXPIRE   = 3, /* signature expiration time */
+    SIGSUBPKT_EXPORTABLE   = 4, /* exportable */
+    SIGSUBPKT_TRUST       = 5, /* trust signature */
+    SIGSUBPKT_REGEXP      = 6, /* regular expression */
+    SIGSUBPKT_REVOCABLE    = 7, /* revocable */
+    SIGSUBPKT_KEY_EXPIRE   = 9, /* key expiration time */
+    SIGSUBPKT_ARR         =10, /* additional recipient request */
+    SIGSUBPKT_PREF_SYM    =11, /* preferred symmetric algorithms */
+    SIGSUBPKT_REV_KEY     =12, /* revocation key */
+    SIGSUBPKT_ISSUER      =16, /* issuer key ID */
+    SIGSUBPKT_NOTATION    =20, /* notation data */
+    SIGSUBPKT_PREF_HASH    =21, /* preferred hash algorithms */
+    SIGSUBPKT_PREF_COMPR   =22, /* preferred compression algorithms */
+    SIGSUBPKT_KS_FLAGS    =23, /* key server preferences */
+    SIGSUBPKT_PREF_KS     =24, /* preferred key server */
+    SIGSUBPKT_PRIMARY_UID  =25, /* primary user id */
+    SIGSUBPKT_POLICY      =26, /* policy URL */
+    SIGSUBPKT_KEY_FLAGS    =27, /* key flags */
+    SIGSUBPKT_SIGNERS_UID  =28, /* signer's user id */
+    SIGSUBPKT_REVOC_REASON =29, /* reason for revocation */
+    SIGSUBPKT_FEATURES     =30, /* feature flags */
+
+    SIGSUBPKT_SIGNATURE    =32, /* embedded signature */
+
+    SIGSUBPKT_FLAG_CRITICAL=128
+} sigsubpkttype_t;
+
+struct notation
+{
+  char *name;
+  char *value;
+  char *altvalue;
+  unsigned char *bdat;
+  size_t blen;
+  struct
+  {
+    unsigned int critical:1;
+    unsigned int ignore:1;
+  } flags;
+  struct notation *next;
+};
+
+/*-- mainproc.c --*/
+int proc_packets( void *ctx, IOBUF a );
+int proc_signature_packets( void *ctx, IOBUF a,
+                           STRLIST signedfiles, const char *sigfile );
+int proc_encryption_packets( void *ctx, IOBUF a );
+int list_packets( IOBUF a );
+
+/*-- parse-packet.c --*/
+int set_packet_list_mode( int mode );
+
+#if DEBUG_PARSE_PACKET
+int dbg_search_packet( IOBUF inp, PACKET *pkt, off_t *retpos, int with_uid,
+                       const char* file, int lineno  );
+int dbg_parse_packet( IOBUF inp, PACKET *ret_pkt,
+                      const char* file, int lineno );
+int dbg_copy_all_packets( IOBUF inp, IOBUF out,
+                          const char* file, int lineno  );
+int dbg_copy_some_packets( IOBUF inp, IOBUF out, off_t stopoff,
+                           const char* file, int lineno  );
+int dbg_skip_some_packets( IOBUF inp, unsigned n,
+                           const char* file, int lineno        );
+#define search_packet( a,b,c,d )   \
+             dbg_search_packet( (a), (b), (c), (d), __FILE__, __LINE__ )
+#define parse_packet( a, b )  \
+            dbg_parse_packet( (a), (b), __FILE__, __LINE__ )
+#define copy_all_packets( a,b )  \
+             dbg_copy_all_packets((a),(b), __FILE__, __LINE__ )
+#define copy_some_packets( a,b,c ) \
+             dbg_copy_some_packets((a),(b),(c), __FILE__, __LINE__ )
+#define skip_some_packets( a,b ) \
+             dbg_skip_some_packets((a),(b), __FILE__, __LINE__ )
+#else
+int search_packet( IOBUF inp, PACKET *pkt, off_t *retpos, int with_uid );
+int parse_packet( IOBUF inp, PACKET *ret_pkt);
+int copy_all_packets( IOBUF inp, IOBUF out );
+int copy_some_packets( IOBUF inp, IOBUF out, off_t stopoff );
+int skip_some_packets( IOBUF inp, unsigned n );
+#endif
+
+int parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
+                    PKT_signature *sig );
+const byte *enum_sig_subpkt ( const subpktarea_t *subpkts,
+                              sigsubpkttype_t reqtype,
+                              size_t *ret_n, int *start, int *critical );
+const byte *parse_sig_subpkt ( const subpktarea_t *buffer,
+                               sigsubpkttype_t reqtype,
+                               size_t *ret_n );
+const byte *parse_sig_subpkt2 ( PKT_signature *sig,
+                                sigsubpkttype_t reqtype,
+                                size_t *ret_n );
+int parse_one_sig_subpkt( const byte *buffer, size_t n, int type );
+void parse_revkeys(PKT_signature *sig);
+int parse_attribute_subpkts(PKT_user_id *uid);
+void make_attribute_uidname(PKT_user_id *uid, size_t max_namelen);
+PACKET *create_gpg_control ( ctrlpkttype_t type,
+                             const byte *data,
+                             size_t datalen );
+
+/*-- build-packet.c --*/
+int build_packet( IOBUF inp, PACKET *pkt );
+u32 calc_packet_length( PACKET *pkt );
+void build_sig_subpkt( PKT_signature *sig, sigsubpkttype_t type,
+                       const byte *buffer, size_t buflen );
+void build_sig_subpkt_from_sig( PKT_signature *sig );
+int  delete_sig_subpkt(subpktarea_t *buffer, sigsubpkttype_t type );
+void build_attribute_subpkt(PKT_user_id *uid,byte type,
+                           const void *buf,u32 buflen,
+                           const void *header,u32 headerlen);
+struct notation *string_to_notation(const char *string,int is_utf8);
+struct notation *sig_to_notation(PKT_signature *sig);
+void free_notation(struct notation *notation);
+
+/*-- free-packet.c --*/
+void free_symkey_enc( PKT_symkey_enc *enc );
+void free_pubkey_enc( PKT_pubkey_enc *enc );
+void free_seckey_enc( PKT_signature *enc );
+int  digest_algo_from_sig( PKT_signature *sig );
+void release_public_key_parts( PKT_public_key *pk );
+void free_public_key( PKT_public_key *key );
+void release_secret_key_parts( PKT_secret_key *sk );
+void free_secret_key( PKT_secret_key *sk );
+void free_attributes(PKT_user_id *uid);
+void free_user_id( PKT_user_id *uid );
+void free_comment( PKT_comment *rem );
+void free_packet( PACKET *pkt );
+prefitem_t *copy_prefs (const prefitem_t *prefs);
+PKT_public_key *copy_public_key( PKT_public_key *d, PKT_public_key *s );
+void copy_public_parts_to_secret_key( PKT_public_key *pk, PKT_secret_key *sk );
+PKT_secret_key *copy_secret_key( PKT_secret_key *d, PKT_secret_key *s );
+PKT_signature *copy_signature( PKT_signature *d, PKT_signature *s );
+PKT_user_id *scopy_user_id (PKT_user_id *sd );
+int cmp_public_keys( PKT_public_key *a, PKT_public_key *b );
+int cmp_secret_keys( PKT_secret_key *a, PKT_secret_key *b );
+int cmp_signatures( PKT_signature *a, PKT_signature *b );
+int cmp_public_secret_key( PKT_public_key *pk, PKT_secret_key *sk );
+int cmp_user_ids( PKT_user_id *a, PKT_user_id *b );
+
+
+/*-- sig-check.c --*/
+int signature_check( PKT_signature *sig, MD_HANDLE digest );
+int signature_check2( PKT_signature *sig, MD_HANDLE digest, u32 *r_expiredate,
+                     int *r_expired, int *r_revoked, PKT_public_key *ret_pk );
+
+/*-- seckey-cert.c --*/
+int is_secret_key_protected( PKT_secret_key *sk );
+int check_secret_key( PKT_secret_key *sk, int retries );
+int protect_secret_key( PKT_secret_key *sk, DEK *dek );
+
+/*-- pubkey-enc.c --*/
+int get_session_key( PKT_pubkey_enc *k, DEK *dek );
+int get_override_session_key( DEK *dek, const char *string );
+
+/*-- compress.c --*/
+int handle_compressed( void *ctx, PKT_compressed *cd,
+                      int (*callback)(IOBUF, void *), void *passthru );
+
+/*-- encr-data.c --*/
+int decrypt_data( void *ctx, PKT_encrypted *ed, DEK *dek );
+
+/*-- plaintext.c --*/
+int handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
+                                       int nooutput, int clearsig );
+int ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2,
+                              const char *inname, int textmode );
+
+/*-- sign.c --*/
+int make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
+                       PKT_user_id *uid, PKT_public_key *subpk,
+                       PKT_secret_key *sk, int sigclass, int digest_algo,
+                       int sigversion, u32 timestamp, u32 duration,
+                       int (*mksubpkt)(PKT_signature *, void *),
+                       void *opaque  );
+int update_keysig_packet( PKT_signature **ret_sig,
+                      PKT_signature *orig_sig,
+                      PKT_public_key *pk,
+                      PKT_user_id *uid,
+                      PKT_public_key *subpk,
+                      PKT_secret_key *sk,
+                      int (*mksubpkt)(PKT_signature *, void *),
+                      void *opaque   );
+
+/*-- keygen.c --*/
+PKT_user_id *generate_user_id(void);
+
+#endif /*G10_PACKET_H*/
diff --git a/g10/parse-packet.c b/g10/parse-packet.c
new file mode 100644 (file)
index 0000000..31f21bc
--- /dev/null
@@ -0,0 +1,2411 @@
+/* parse-packet.c  - read packets
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "packet.h"
+#include "iobuf.h"
+#include "mpi.h"
+#include "util.h"
+#include "cipher.h"
+#include "memory.h"
+#include "filter.h"
+#include "photoid.h"
+#include "options.h"
+#include "main.h"
+#include "i18n.h"
+
+static int mpi_print_mode;
+static int list_mode;
+static FILE *listfp;
+
+static int  parse( IOBUF inp, PACKET *pkt, int onlykeypkts,
+                  off_t *retpos, int *skip, IOBUF out, int do_skip
+#ifdef DEBUG_PARSE_PACKET
+                  ,const char *dbg_w, const char *dbg_f, int dbg_l
+#endif
+                );
+static int  copy_packet( IOBUF inp, IOBUF out, int pkttype,
+                        unsigned long pktlen, int partial );
+static void skip_packet( IOBUF inp, int pkttype,
+                        unsigned long pktlen, int partial );
+static void *read_rest( IOBUF inp, size_t pktlen, int partial );
+static int  parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                            PACKET *packet );
+static int  parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                            PACKET *packet );
+static int  parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                       PKT_onepass_sig *ops );
+static int  parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
+                                     byte *hdr, int hdrlen, PACKET *packet );
+static int  parse_user_id( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                          PACKET *packet );
+static int  parse_attribute( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                          PACKET *packet );
+static int  parse_comment( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                          PACKET *packet );
+static void parse_trust( IOBUF inp, int pkttype, unsigned long pktlen,
+                                                          PACKET *packet );
+static int  parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen,
+                            PACKET *packet, int new_ctb, int partial);
+static int  parse_compressed( IOBUF inp, int pkttype, unsigned long pktlen,
+                                              PACKET *packet, int new_ctb );
+static int  parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
+                            PACKET *packet, int new_ctb, int partial);
+static int  parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen,
+                                              PACKET *packet, int new_ctb);
+static int  parse_gpg_control( IOBUF inp, int pkttype, unsigned long pktlen,
+                               PACKET *packet, int partial );
+
+static unsigned short
+read_16(IOBUF inp)
+{
+    unsigned short a;
+    a = iobuf_get_noeof(inp) << 8;
+    a |= iobuf_get_noeof(inp);
+    return a;
+}
+
+static unsigned long
+read_32(IOBUF inp)
+{
+    unsigned long a;
+    a =  iobuf_get_noeof(inp) << 24;
+    a |= iobuf_get_noeof(inp) << 16;
+    a |= iobuf_get_noeof(inp) << 8;
+    a |= iobuf_get_noeof(inp);
+    return a;
+}
+
+
+int
+set_packet_list_mode( int mode )
+{
+    int old = list_mode;
+    list_mode = mode;
+    mpi_print_mode = DBG_MPI;
+    /* We use stdout print only if invoked by the --list-packets
+       command but switch to stderr in all otehr cases.  This breaks
+       the previous behaviour but that seems to be more of a bug than
+       intentional.  I don't believe that any application makes use of
+       this long standing annoying way of printing to stdout except
+       when doing a --list-packets. If this assumption fails, it will
+       be easy to add an option for the listing stream.  Note that we
+       initialize it only once; mainly because some code may switch
+       the option value later back to 1 and we want to have all output
+       to the same stream.  
+
+       Using stderr is not actually very clean because it bypasses the
+       logging code but it is a special thing anyay.  I am not sure
+       whether using log_stream() would be better.  Perhaps we should
+       enable the list mdoe only with a special option. */
+    if (!listfp)
+        listfp = opt.list_packets == 2 ? stdout : stderr;
+    return old;
+}
+
+static void
+unknown_pubkey_warning( int algo )
+{
+    static byte unknown_pubkey_algos[256];
+
+    algo &= 0xff;
+    if( !unknown_pubkey_algos[algo] ) {
+       if( opt.verbose )
+           log_info(_("can't handle public key algorithm %d\n"), algo );
+       unknown_pubkey_algos[algo] = 1;
+    }
+}
+
+/****************
+ * Parse a Packet and return it in packet
+ * Returns: 0 := valid packet in pkt
+ *        -1 := no more packets
+ *        >0 := error
+ * Note: The function may return an error and a partly valid packet;
+ * caller must free this packet.
+ */
+#ifdef DEBUG_PARSE_PACKET
+int
+dbg_parse_packet( IOBUF inp, PACKET *pkt, const char *dbg_f, int dbg_l )
+{
+    int skip, rc;
+
+    do {
+       rc = parse( inp, pkt, 0, NULL, &skip, NULL, 0, "parse", dbg_f, dbg_l );
+    } while( skip );
+    return rc;
+}
+#else
+int
+parse_packet( IOBUF inp, PACKET *pkt )
+{
+    int skip, rc;
+
+    do {
+       rc = parse( inp, pkt, 0, NULL, &skip, NULL, 0 );
+    } while( skip );
+    return rc;
+}
+#endif
+
+/****************
+ * Like parse packet, but only return secret or public (sub)key packets.
+ */
+#ifdef DEBUG_PARSE_PACKET
+int
+dbg_search_packet( IOBUF inp, PACKET *pkt, off_t *retpos, int with_uid,
+                  const char *dbg_f, int dbg_l )
+{
+    int skip, rc;
+
+    do {
+       rc = parse( inp, pkt, with_uid?2:1, retpos, &skip, NULL, 0, "search", dbg_f, dbg_l );
+    } while( skip );
+    return rc;
+}
+#else
+int
+search_packet( IOBUF inp, PACKET *pkt, off_t *retpos, int with_uid )
+{
+    int skip, rc;
+
+    do {
+       rc = parse( inp, pkt, with_uid?2:1, retpos, &skip, NULL, 0 );
+    } while( skip );
+    return rc;
+}
+#endif
+
+/****************
+ * Copy all packets from INP to OUT, thereby removing unused spaces.
+ */
+#ifdef DEBUG_PARSE_PACKET
+int
+dbg_copy_all_packets( IOBUF inp, IOBUF out,
+                  const char *dbg_f, int dbg_l )
+{
+    PACKET pkt;
+    int skip, rc=0;
+    do {
+       init_packet(&pkt);
+    } while( !(rc = parse( inp, &pkt, 0, NULL, &skip, out, 0, "copy", dbg_f, dbg_l )));
+    return rc;
+}
+#else
+int
+copy_all_packets( IOBUF inp, IOBUF out )
+{
+    PACKET pkt;
+    int skip, rc=0;
+    do {
+       init_packet(&pkt);
+    } while( !(rc = parse( inp, &pkt, 0, NULL, &skip, out, 0 )));
+    return rc;
+}
+#endif
+
+/****************
+ * Copy some packets from INP to OUT, thereby removing unused spaces.
+ * Stop at offset STOPoff (i.e. don't copy packets at this or later offsets)
+ */
+#ifdef DEBUG_PARSE_PACKET
+int
+dbg_copy_some_packets( IOBUF inp, IOBUF out, off_t stopoff,
+                  const char *dbg_f, int dbg_l )
+{
+    PACKET pkt;
+    int skip, rc=0;
+    do {
+       if( iobuf_tell(inp) >= stopoff )
+           return 0;
+       init_packet(&pkt);
+    } while( !(rc = parse( inp, &pkt, 0, NULL, &skip, out, 0,
+                                    "some", dbg_f, dbg_l )) );
+    return rc;
+}
+#else
+int
+copy_some_packets( IOBUF inp, IOBUF out, off_t stopoff )
+{
+    PACKET pkt;
+    int skip, rc=0;
+    do {
+       if( iobuf_tell(inp) >= stopoff )
+           return 0;
+       init_packet(&pkt);
+    } while( !(rc = parse( inp, &pkt, 0, NULL, &skip, out, 0 )) );
+    return rc;
+}
+#endif
+
+/****************
+ * Skip over N packets
+ */
+#ifdef DEBUG_PARSE_PACKET
+int
+dbg_skip_some_packets( IOBUF inp, unsigned n,
+                  const char *dbg_f, int dbg_l )
+{
+    int skip, rc=0;
+    PACKET pkt;
+
+    for( ;n && !rc; n--) {
+       init_packet(&pkt);
+       rc = parse( inp, &pkt, 0, NULL, &skip, NULL, 1, "skip", dbg_f, dbg_l );
+    }
+    return rc;
+}
+#else
+int
+skip_some_packets( IOBUF inp, unsigned n )
+{
+    int skip, rc=0;
+    PACKET pkt;
+
+    for( ;n && !rc; n--) {
+       init_packet(&pkt);
+       rc = parse( inp, &pkt, 0, NULL, &skip, NULL, 1 );
+    }
+    return rc;
+}
+#endif
+
+
+/****************
+ * Parse packet. Set the variable skip points to 1 if the packet
+ * should be skipped; this is the case if either ONLYKEYPKTS is set
+ * and the parsed packet isn't one or the
+ * packet-type is 0, indicating deleted stuff.
+ * if OUT is not NULL, a special copymode is used.
+ */
+static int
+parse( IOBUF inp, PACKET *pkt, int onlykeypkts, off_t *retpos,
+       int *skip, IOBUF out, int do_skip
+#ifdef DEBUG_PARSE_PACKET
+       ,const char *dbg_w, const char *dbg_f, int dbg_l
+#endif
+     )
+{
+    int rc=0, c, ctb, pkttype, lenbytes;
+    unsigned long pktlen;
+    byte hdr[8];
+    int hdrlen;
+    int new_ctb = 0, partial=0;
+    int with_uid = (onlykeypkts == 2);
+
+    *skip = 0;
+    assert( !pkt->pkt.generic );
+    if( retpos )
+       *retpos = iobuf_tell(inp);
+
+    if( (ctb = iobuf_get(inp)) == -1 ) {
+       rc = -1;
+       goto leave;
+    }
+    hdrlen=0;
+    hdr[hdrlen++] = ctb;
+    if( !(ctb & 0x80) ) {
+        log_error("%s: invalid packet (ctb=%02x)\n", iobuf_where(inp), ctb );
+       rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    pktlen = 0;
+    new_ctb = !!(ctb & 0x40);
+    if( new_ctb ) {
+        pkttype = ctb & 0x3f;
+       if( (c = iobuf_get(inp)) == -1 ) {
+           log_error("%s: 1st length byte missing\n", iobuf_where(inp) );
+           rc = G10ERR_INVALID_PACKET;
+           goto leave;
+       }
+        if (pkttype == PKT_COMPRESSED) {
+             iobuf_set_partial_block_mode(inp, c & 0xff);
+             pktlen = 0;/* to indicate partial length */
+            partial=1;
+        }
+        else {
+             hdr[hdrlen++] = c;
+             if( c < 192 )
+              pktlen = c;
+             else if( c < 224 )
+              {
+                pktlen = (c - 192) * 256;
+                if( (c = iobuf_get(inp)) == -1 )
+                  {
+                    log_error("%s: 2nd length byte missing\n",
+                              iobuf_where(inp) );
+                    rc = G10ERR_INVALID_PACKET;
+                    goto leave;
+                  }
+                hdr[hdrlen++] = c;
+                pktlen += c + 192;
+              }
+             else if( c == 255 )
+              {
+                pktlen  = (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 24;
+                pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 16;
+                pktlen |= (hdr[hdrlen++] = iobuf_get_noeof(inp)) << 8;
+                if( (c = iobuf_get(inp)) == -1 )
+                  {
+                    log_error("%s: 4 byte length invalid\n",
+                              iobuf_where(inp) );
+                    rc = G10ERR_INVALID_PACKET;
+                    goto leave;
+                  }
+                pktlen |= (hdr[hdrlen++] = c );
+              }
+             else
+              {
+                /* Partial body length.  Note that we handled
+                   PKT_COMPRESSED earlier. */
+                if(pkttype==PKT_PLAINTEXT || pkttype==PKT_ENCRYPTED
+                   || pkttype==PKT_ENCRYPTED_MDC)
+                  {
+                    iobuf_set_partial_block_mode(inp, c & 0xff);
+                    pktlen = 0;/* to indicate partial length */
+                    partial=1;
+                  }
+                else
+                  {
+                    log_error("%s: partial length for invalid"
+                              " packet type %d\n",iobuf_where(inp),pkttype);
+                    rc=G10ERR_INVALID_PACKET;
+                    goto leave;
+                  }
+              }
+       }
+    }
+    else
+      {
+       pkttype = (ctb>>2)&0xf;
+       lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3));
+       if( !lenbytes )
+         {
+           pktlen = 0; /* don't know the value */
+           /* This isn't really partial, but we can treat it the same
+              in a "read until the end" sort of way. */
+           partial=1;
+           if(pkttype!=PKT_ENCRYPTED && pkttype!=PKT_PLAINTEXT
+              && pkttype!=PKT_COMPRESSED)
+             {
+               log_error ("%s: indeterminate length for invalid"
+                          " packet type %d\n", iobuf_where(inp), pkttype );
+               rc = G10ERR_INVALID_PACKET;
+               goto leave;
+             }
+         }
+       else
+         {
+           for( ; lenbytes; lenbytes-- )
+             {
+               pktlen <<= 8;
+               pktlen |= hdr[hdrlen++] = iobuf_get_noeof(inp);
+             }
+         }
+      }
+
+    if (pktlen == 0xffffffff) {
+        /* with a some probability this is caused by a problem in the
+         * the uncompressing layer - in some error cases it just loops
+         * and spits out 0xff bytes. */
+        log_error ("%s: garbled packet detected\n", iobuf_where(inp) );
+       g10_exit (2);
+    }
+
+    if( out && pkttype ) {
+       if( iobuf_write( out, hdr, hdrlen ) == -1 )
+           rc = G10ERR_WRITE_FILE;
+       else
+           rc = copy_packet(inp, out, pkttype, pktlen, partial );
+       goto leave;
+    }
+
+    if (with_uid && pkttype == PKT_USER_ID)
+        ;
+    else if( do_skip 
+        || !pkttype
+        || (onlykeypkts && pkttype != PKT_PUBLIC_SUBKEY
+                        && pkttype != PKT_PUBLIC_KEY
+                        && pkttype != PKT_SECRET_SUBKEY
+                        && pkttype != PKT_SECRET_KEY  ) ) {
+       iobuf_skip_rest(inp, pktlen, partial);
+       *skip = 1;
+       rc = 0;
+       goto leave;
+    }
+
+    if( DBG_PACKET ) {
+#ifdef DEBUG_PARSE_PACKET
+       log_debug("parse_packet(iob=%d): type=%d length=%lu%s (%s.%s.%d)\n",
+                  iobuf_id(inp), pkttype, pktlen, new_ctb?" (new_ctb)":"",
+                   dbg_w, dbg_f, dbg_l );
+#else
+       log_debug("parse_packet(iob=%d): type=%d length=%lu%s\n",
+                  iobuf_id(inp), pkttype, pktlen, new_ctb?" (new_ctb)":"" );
+#endif
+    }
+    pkt->pkttype = pkttype;
+    rc = G10ERR_UNKNOWN_PACKET; /* default error */
+    switch( pkttype ) {
+      case PKT_PUBLIC_KEY:
+      case PKT_PUBLIC_SUBKEY:
+       pkt->pkt.public_key = xmalloc_clear(sizeof *pkt->pkt.public_key );
+       rc = parse_key(inp, pkttype, pktlen, hdr, hdrlen, pkt );
+       break;
+      case PKT_SECRET_KEY:
+      case PKT_SECRET_SUBKEY:
+       pkt->pkt.secret_key = xmalloc_clear(sizeof *pkt->pkt.secret_key );
+       rc = parse_key(inp, pkttype, pktlen, hdr, hdrlen, pkt );
+       break;
+      case PKT_SYMKEY_ENC:
+       rc = parse_symkeyenc( inp, pkttype, pktlen, pkt );
+       break;
+      case PKT_PUBKEY_ENC:
+       rc = parse_pubkeyenc(inp, pkttype, pktlen, pkt );
+       break;
+      case PKT_SIGNATURE:
+       pkt->pkt.signature = xmalloc_clear(sizeof *pkt->pkt.signature );
+       rc = parse_signature(inp, pkttype, pktlen, pkt->pkt.signature );
+       break;
+      case PKT_ONEPASS_SIG:
+       pkt->pkt.onepass_sig = xmalloc_clear(sizeof *pkt->pkt.onepass_sig );
+       rc = parse_onepass_sig(inp, pkttype, pktlen, pkt->pkt.onepass_sig );
+       break;
+      case PKT_USER_ID:
+       rc = parse_user_id(inp, pkttype, pktlen, pkt );
+       break;
+      case PKT_ATTRIBUTE:
+       pkt->pkttype = pkttype = PKT_USER_ID;  /* we store it in the userID */
+       rc = parse_attribute(inp, pkttype, pktlen, pkt);
+       break;
+      case PKT_OLD_COMMENT:
+      case PKT_COMMENT:
+       rc = parse_comment(inp, pkttype, pktlen, pkt);
+       break;
+      case PKT_RING_TRUST:
+       parse_trust(inp, pkttype, pktlen, pkt);
+       rc = 0;
+       break;
+      case PKT_PLAINTEXT:
+       rc = parse_plaintext(inp, pkttype, pktlen, pkt, new_ctb, partial );
+       break;
+      case PKT_COMPRESSED:
+       rc = parse_compressed(inp, pkttype, pktlen, pkt, new_ctb );
+       break;
+      case PKT_ENCRYPTED:
+      case PKT_ENCRYPTED_MDC:
+       rc = parse_encrypted(inp, pkttype, pktlen, pkt, new_ctb, partial );
+       break;
+      case PKT_MDC:
+       rc = parse_mdc(inp, pkttype, pktlen, pkt, new_ctb );
+       break;
+      case PKT_GPG_CONTROL:
+        rc = parse_gpg_control(inp, pkttype, pktlen, pkt, partial );
+        break;
+      default:
+       skip_packet(inp, pkttype, pktlen, partial);
+       break;
+    }
+
+  leave:
+    if( !rc && iobuf_error(inp) )
+       rc = G10ERR_INV_KEYRING;
+    return rc;
+}
+
+static void
+dump_hex_line( int c, int *i )
+{
+    if( *i && !(*i%8) ) {
+       if( *i && !(*i%24) )
+           fprintf (listfp, "\n%4d:", *i );
+       else
+           putc (' ', listfp);
+    }
+    if( c == -1 )
+       fprintf (listfp, " EOF" );
+    else
+       fprintf (listfp, " %02x", c );
+    ++*i;
+}
+
+
+static int
+copy_packet( IOBUF inp, IOBUF out, int pkttype,
+            unsigned long pktlen, int partial )
+{
+    int n;
+    char buf[100];
+
+    if( partial ) {
+       while( (n = iobuf_read( inp, buf, 100 )) != -1 )
+           if( iobuf_write(out, buf, n ) )
+               return G10ERR_WRITE_FILE; /* write error */
+    }
+    else if( !pktlen && pkttype == PKT_COMPRESSED ) {
+       log_debug("copy_packet: compressed!\n");
+       /* compressed packet, copy till EOF */
+       while( (n = iobuf_read( inp, buf, 100 )) != -1 )
+           if( iobuf_write(out, buf, n ) )
+               return G10ERR_WRITE_FILE; /* write error */
+    }
+    else {
+       for( ; pktlen; pktlen -= n ) {
+           n = pktlen > 100 ? 100 : pktlen;
+           n = iobuf_read( inp, buf, n );
+           if( n == -1 )
+               return G10ERR_READ_FILE;
+           if( iobuf_write(out, buf, n ) )
+               return G10ERR_WRITE_FILE; /* write error */
+       }
+    }
+    return 0;
+}
+
+
+static void
+skip_packet( IOBUF inp, int pkttype, unsigned long pktlen, int partial )
+{
+    if( list_mode ) {
+       if( pkttype == PKT_MARKER )
+           fputs(":marker packet:\n", listfp );
+       else
+           fprintf (listfp, ":unknown packet: type %2d, length %lu\n",
+                     pkttype, pktlen);
+       if( pkttype ) {
+           int c, i=0 ;
+           if( pkttype != PKT_MARKER )
+               fputs("dump:", listfp );
+           if( partial ) {
+               while( (c=iobuf_get(inp)) != -1 )
+                   dump_hex_line(c, &i);
+           }
+           else {
+               for( ; pktlen; pktlen-- )
+                   dump_hex_line(iobuf_get(inp), &i);
+           }
+           putc ('\n', listfp);
+           return;
+       }
+    }
+    iobuf_skip_rest(inp,pktlen,partial);
+}
+
+
+static void *
+read_rest( IOBUF inp, size_t pktlen, int partial )
+{
+    byte *p;
+    int i;
+
+    if( partial ) {
+       log_error("read_rest: can't store stream data\n");
+       p = NULL;
+    }
+    else {
+       p = xmalloc( pktlen );
+       for(i=0; pktlen; pktlen--, i++ )
+           p[i] = iobuf_get(inp);
+    }
+    return p;
+}
+
+
+
+static int
+parse_symkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
+{
+    PKT_symkey_enc *k;
+    int rc = 0;
+    int i, version, s2kmode, cipher_algo, hash_algo, seskeylen, minlen;
+
+    if( pktlen < 4 ) {
+       log_error("packet(%d) too short\n", pkttype);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    version = iobuf_get_noeof(inp); pktlen--;
+    if( version != 4 ) {
+       log_error("packet(%d) with unknown version %d\n", pkttype, version);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    if( pktlen > 200 ) { /* (we encode the seskeylen in a byte) */
+       log_error("packet(%d) too large\n", pkttype);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    cipher_algo = iobuf_get_noeof(inp); pktlen--;
+    s2kmode = iobuf_get_noeof(inp); pktlen--;
+    hash_algo = iobuf_get_noeof(inp); pktlen--;
+    switch( s2kmode ) {
+      case 0:  /* simple s2k */
+       minlen = 0;
+       break;
+      case 1:  /* salted s2k */
+       minlen = 8;
+       break;
+      case 3:  /* iterated+salted s2k */
+       minlen = 9;
+       break;
+      default:
+       log_error("unknown S2K %d\n", s2kmode );
+       goto leave;
+    }
+    if( minlen > pktlen ) {
+       log_error("packet with S2K %d too short\n", s2kmode );
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    seskeylen = pktlen - minlen;
+    k = packet->pkt.symkey_enc = xmalloc_clear( sizeof *packet->pkt.symkey_enc
+                                               + seskeylen - 1 );
+    k->version = version;
+    k->cipher_algo = cipher_algo;
+    k->s2k.mode = s2kmode;
+    k->s2k.hash_algo = hash_algo;
+    if( s2kmode == 1 || s2kmode == 3 ) {
+       for(i=0; i < 8 && pktlen; i++, pktlen-- )
+           k->s2k.salt[i] = iobuf_get_noeof(inp);
+    }
+    if( s2kmode == 3 ) {
+       k->s2k.count = iobuf_get(inp); pktlen--;
+    }
+    k->seskeylen = seskeylen;
+    if(k->seskeylen)
+      {
+       for(i=0; i < seskeylen && pktlen; i++, pktlen-- )
+         k->seskey[i] = iobuf_get_noeof(inp);
+
+       /* What we're watching out for here is a session key decryptor
+          with no salt.  The RFC says that using salt for this is a
+          MUST. */
+       if(s2kmode!=1 && s2kmode!=3)
+         log_info(_("WARNING: potentially insecure symmetrically"
+                    " encrypted session key\n"));
+      }
+    assert( !pktlen );
+
+    if( list_mode ) {
+       fprintf (listfp, ":symkey enc packet: version %d, cipher %d, s2k %d, hash %d",
+              version, cipher_algo, s2kmode, hash_algo);
+       if(seskeylen)
+         fprintf (listfp, ", seskey %d bits",(seskeylen-1)*8);
+       fprintf (listfp, "\n");
+       if( s2kmode == 1 || s2kmode == 3 ) {
+           fprintf (listfp, "\tsalt ");
+           for(i=0; i < 8; i++ )
+               fprintf (listfp, "%02x", k->s2k.salt[i]);
+           if( s2kmode == 3 )
+               fprintf (listfp, ", count %lu (%lu)",
+                        S2K_DECODE_COUNT((ulong)k->s2k.count),
+                        (ulong)k->s2k.count );
+           fprintf (listfp, "\n");
+       }
+    }
+
+  leave:
+    iobuf_skip_rest(inp, pktlen, 0);
+    return rc;
+}
+
+static int
+parse_pubkeyenc( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
+{
+    unsigned int n;
+    int rc = 0;
+    int i, ndata;
+    PKT_pubkey_enc *k;
+
+    k = packet->pkt.pubkey_enc = xmalloc_clear(sizeof *packet->pkt.pubkey_enc);
+    if( pktlen < 12 ) {
+       log_error("packet(%d) too short\n", pkttype);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    k->version = iobuf_get_noeof(inp); pktlen--;
+    if( k->version != 2 && k->version != 3 ) {
+       log_error("packet(%d) with unknown version %d\n", pkttype, k->version);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    k->keyid[0] = read_32(inp); pktlen -= 4;
+    k->keyid[1] = read_32(inp); pktlen -= 4;
+    k->pubkey_algo = iobuf_get_noeof(inp); pktlen--;
+    k->throw_keyid = 0; /* only used as flag for build_packet */
+    if( list_mode )
+       fprintf (listfp, ":pubkey enc packet: version %d, algo %d, keyid %08lX%08lX\n",
+         k->version, k->pubkey_algo, (ulong)k->keyid[0], (ulong)k->keyid[1]);
+
+    ndata = pubkey_get_nenc(k->pubkey_algo);
+    if( !ndata ) {
+       if( list_mode )
+           fprintf (listfp, "\tunsupported algorithm %d\n", k->pubkey_algo );
+       unknown_pubkey_warning( k->pubkey_algo );
+       k->data[0] = NULL;  /* no need to store the encrypted data */
+    }
+    else {
+       for( i=0; i < ndata; i++ ) {
+           n = pktlen;
+           k->data[i] = mpi_read(inp, &n, 0); pktlen -=n;
+           if( list_mode ) {
+               fprintf (listfp, "\tdata: ");
+               mpi_print(listfp, k->data[i], mpi_print_mode );
+               putc ('\n', listfp);
+           }
+            if (!k->data[i])
+                rc = G10ERR_INVALID_PACKET;
+       }
+    }
+
+  leave:
+    iobuf_skip_rest(inp, pktlen, 0);
+    return rc;
+}
+
+
+static void
+dump_sig_subpkt( int hashed, int type, int critical,
+                const byte *buffer, size_t buflen, size_t length )
+{
+    const char *p=NULL;
+    int i;
+
+    /* The CERT has warning out with explains how to use GNUPG to
+     * detect the ARRs - we print our old message here when it is a faked
+     * ARR and add an additional notice */
+    if ( type == SIGSUBPKT_ARR && !hashed ) {
+        fprintf (listfp,
+                 "\tsubpkt %d len %u (additional recipient request)\n"
+                 "WARNING: PGP versions > 5.0 and < 6.5.8 will automagically "
+                 "encrypt to this key and thereby reveal the plaintext to "
+                 "the owner of this ARR key. Detailed info follows:\n",
+                 type, (unsigned)length );
+    }
+    
+    buffer++;
+    length--;
+   
+    fprintf (listfp, "\t%s%ssubpkt %d len %u (", /*)*/
+             critical ? "critical ":"",
+             hashed ? "hashed ":"", type, (unsigned)length );
+    if( length > buflen ) {
+       fprintf (listfp, "too short: buffer is only %u)\n", (unsigned)buflen );
+       return;
+    }
+    switch( type ) {
+      case SIGSUBPKT_SIG_CREATED:
+       if( length >= 4 )
+           fprintf (listfp, "sig created %s", strtimestamp( buffer_to_u32(buffer) ) );
+       break;
+      case SIGSUBPKT_SIG_EXPIRE:
+       if( length >= 4 )
+         {
+           if(buffer_to_u32(buffer))
+             fprintf (listfp, "sig expires after %s",
+                      strtimevalue( buffer_to_u32(buffer) ) );
+           else
+             fprintf (listfp, "sig does not expire");
+         }
+       break;
+      case SIGSUBPKT_EXPORTABLE:
+       if( length )
+           fprintf (listfp, "%sexportable", *buffer? "":"not ");
+       break;
+      case SIGSUBPKT_TRUST:
+       if(length!=2)
+         p="[invalid trust subpacket]";
+       else
+         fprintf (listfp, "trust signature of depth %d, value %d",buffer[0],buffer[1]);
+       break;
+      case SIGSUBPKT_REGEXP:
+       if(!length)
+         p="[invalid regexp subpacket]";
+       else
+         fprintf (listfp, "regular expression: \"%s\"",buffer);
+       break;
+      case SIGSUBPKT_REVOCABLE:
+       if( length )
+           fprintf (listfp, "%srevocable", *buffer? "":"not ");
+       break;
+      case SIGSUBPKT_KEY_EXPIRE:
+       if( length >= 4 )
+         {
+           if(buffer_to_u32(buffer))
+             fprintf (listfp, "key expires after %s",
+                      strtimevalue( buffer_to_u32(buffer) ) );
+           else
+             fprintf (listfp, "key does not expire");
+         }
+       break;
+      case SIGSUBPKT_PREF_SYM:
+       fputs("pref-sym-algos:", listfp );
+       for( i=0; i < length; i++ )
+           fprintf (listfp, " %d", buffer[i] );
+       break;
+      case SIGSUBPKT_REV_KEY:
+       fputs("revocation key: ", listfp );
+       if( length < 22 )
+           p = "[too short]";
+       else {
+           fprintf (listfp, "c=%02x a=%d f=", buffer[0], buffer[1] );
+           for( i=2; i < length; i++ )
+               fprintf (listfp, "%02X", buffer[i] );
+       }
+       break;
+      case SIGSUBPKT_ISSUER:
+       if( length >= 8 )
+           fprintf (listfp, "issuer key ID %08lX%08lX",
+                     (ulong)buffer_to_u32(buffer),
+                     (ulong)buffer_to_u32(buffer+4) );
+       break;
+      case SIGSUBPKT_NOTATION:
+       {
+           fputs("notation: ", listfp );
+           if( length < 8 )
+               p = "[too short]";
+           else {
+               const byte *s = buffer;
+               size_t n1, n2;
+
+               n1 = (s[4] << 8) | s[5];
+               n2 = (s[6] << 8) | s[7];
+               s += 8;
+               if( 8+n1+n2 != length )
+                   p = "[error]";
+               else {
+                   print_string( listfp, s, n1, ')' );
+                   putc( '=', listfp );
+
+                   if( *buffer & 0x80 )
+                     print_string( listfp, s+n1, n2, ')' );
+                   else
+                     p = "[not human readable]";
+               }
+           }
+       }
+       break;
+      case SIGSUBPKT_PREF_HASH:
+       fputs("pref-hash-algos:", listfp );
+       for( i=0; i < length; i++ )
+           fprintf (listfp, " %d", buffer[i] );
+       break;
+      case SIGSUBPKT_PREF_COMPR:
+       fputs("pref-zip-algos:", listfp );
+       for( i=0; i < length; i++ )
+           fprintf (listfp, " %d", buffer[i] );
+       break;
+      case SIGSUBPKT_KS_FLAGS:
+       fputs("key server preferences:",listfp);
+       for(i=0;i<length;i++)
+         fprintf (listfp, " %02X", buffer[i]);
+       break;
+      case SIGSUBPKT_PREF_KS:
+       fputs("preferred key server: ", listfp );
+       print_string( listfp, buffer, length, ')' );
+       break;
+      case SIGSUBPKT_PRIMARY_UID:
+       p = "primary user ID";
+       break;
+      case SIGSUBPKT_POLICY:
+       fputs("policy: ", listfp );
+       print_string( listfp, buffer, length, ')' );
+       break;
+      case SIGSUBPKT_KEY_FLAGS:
+        fputs ( "key flags:", listfp );
+        for( i=0; i < length; i++ )
+            fprintf (listfp, " %02X", buffer[i] );
+       break;
+      case SIGSUBPKT_SIGNERS_UID:
+       p = "signer's user ID";
+       break;
+      case SIGSUBPKT_REVOC_REASON:
+        if( length ) {
+           fprintf (listfp, "revocation reason 0x%02x (", *buffer );
+           print_string( listfp, buffer+1, length-1, ')' );
+           p = ")";
+       }
+       break;
+      case SIGSUBPKT_ARR:
+        fputs("Big Brother's key (ignored): ", listfp );
+       if( length < 22 )
+           p = "[too short]";
+       else {
+           fprintf (listfp, "c=%02x a=%d f=", buffer[0], buffer[1] );
+           for( i=2; i < length; i++ )
+               fprintf (listfp, "%02X", buffer[i] );
+       }
+        break;
+      case SIGSUBPKT_FEATURES:
+        fputs ( "features:", listfp );
+        for( i=0; i < length; i++ )
+            fprintf (listfp, " %02x", buffer[i] );
+       break;
+      case SIGSUBPKT_SIGNATURE:
+       fputs("signature: ",listfp);
+       if(length<17)
+         p="[too short]";
+       else
+         fprintf (listfp, "v%d, class 0x%02X, algo %d, digest algo %d",
+                buffer[0],
+                buffer[0]==3?buffer[2]:buffer[1],
+                buffer[0]==3?buffer[15]:buffer[2],
+                buffer[0]==3?buffer[16]:buffer[3]);
+       break;
+      default:
+       if(type>=100 && type<=110)
+         p="experimental / private subpacket";
+       else
+         p = "?";
+       break;
+    }
+
+    fprintf (listfp, "%s)\n", p? p: "");
+}
+
+/****************
+ * Returns: >= 0 use this offset into buffer
+ *         -1 explicitly reject returning this type
+ *         -2 subpacket too short
+ */
+int
+parse_one_sig_subpkt( const byte *buffer, size_t n, int type )
+{
+  switch( type )
+    {
+    case SIGSUBPKT_REV_KEY:
+      if(n < 22)
+       break;
+      return 0;
+    case SIGSUBPKT_SIG_CREATED:
+    case SIGSUBPKT_SIG_EXPIRE:
+    case SIGSUBPKT_KEY_EXPIRE:
+      if( n < 4 )
+       break;
+      return 0;
+    case SIGSUBPKT_KEY_FLAGS:
+    case SIGSUBPKT_KS_FLAGS:
+    case SIGSUBPKT_PREF_SYM:
+    case SIGSUBPKT_PREF_HASH:
+    case SIGSUBPKT_PREF_COMPR:
+    case SIGSUBPKT_POLICY:
+    case SIGSUBPKT_PREF_KS:
+    case SIGSUBPKT_FEATURES:
+    case SIGSUBPKT_REGEXP:
+      return 0;
+    case SIGSUBPKT_SIGNATURE:
+    case SIGSUBPKT_EXPORTABLE:
+    case SIGSUBPKT_REVOCABLE:
+    case SIGSUBPKT_REVOC_REASON:
+      if( !n )
+       break;
+      return 0;
+    case SIGSUBPKT_ISSUER: /* issuer key ID */
+      if( n < 8 )
+       break;
+      return 0;
+    case SIGSUBPKT_NOTATION:
+      /* minimum length needed, and the subpacket must be well-formed
+        where the name length and value length all fit inside the
+        packet. */
+      if(n<8 || 8+((buffer[4]<<8)|buffer[5])+((buffer[6]<<8)|buffer[7]) != n)
+       break;
+      return 0;
+    case SIGSUBPKT_PRIMARY_UID:
+      if ( n != 1 )
+       break;
+      return 0;
+    case SIGSUBPKT_TRUST:
+      if ( n != 2 )
+       break;
+      return 0;
+    default: return 0;
+    }
+  return -2;
+}
+
+/* Not many critical notations we understand yet... */
+static int
+can_handle_critical_notation(const byte *name,size_t len)
+{
+  if(len==32 && memcmp(name,"preferred-email-encoding@pgp.com",32)==0)
+    return 1;
+  if(len==21 && memcmp(name,"pka-address@gnupg.org",21)==0)
+    return 1;
+
+  return 0;
+}
+
+static int
+can_handle_critical( const byte *buffer, size_t n, int type )
+{
+  switch( type )
+    {
+    case SIGSUBPKT_NOTATION:
+      if(n>=8)
+       return can_handle_critical_notation(buffer+8,(buffer[4]<<8)|buffer[5]);
+      else
+       return 0;
+    case SIGSUBPKT_SIGNATURE:
+    case SIGSUBPKT_SIG_CREATED:
+    case SIGSUBPKT_SIG_EXPIRE:
+    case SIGSUBPKT_KEY_EXPIRE:
+    case SIGSUBPKT_EXPORTABLE:
+    case SIGSUBPKT_REVOCABLE:
+    case SIGSUBPKT_REV_KEY:
+    case SIGSUBPKT_ISSUER:/* issuer key ID */
+    case SIGSUBPKT_PREF_SYM:
+    case SIGSUBPKT_PREF_HASH:
+    case SIGSUBPKT_PREF_COMPR:
+    case SIGSUBPKT_KEY_FLAGS:
+    case SIGSUBPKT_PRIMARY_UID:
+    case SIGSUBPKT_FEATURES:
+    case SIGSUBPKT_TRUST:
+    case SIGSUBPKT_REGEXP:
+      /* Is it enough to show the policy or keyserver? */
+    case SIGSUBPKT_POLICY:
+    case SIGSUBPKT_PREF_KS:
+      return 1;
+
+    default:
+      return 0;
+    }
+}
+
+
+const byte *
+enum_sig_subpkt( const subpktarea_t *pktbuf, sigsubpkttype_t reqtype,
+                size_t *ret_n, int *start, int *critical )
+{
+    const byte *buffer;
+    int buflen;
+    int type;
+    int critical_dummy;
+    int offset;
+    size_t n;
+    int seq = 0;
+    int reqseq = start? *start: 0;
+
+    if(!critical)
+      critical=&critical_dummy;
+
+    if( !pktbuf || reqseq == -1 ) {
+       /* return some value different from NULL to indicate that
+        * there is no critical bit we do not understand.  The caller
+        * will never use the value.  Yes I know, it is an ugly hack */
+       return reqtype == SIGSUBPKT_TEST_CRITICAL? (const byte*)&pktbuf : NULL;
+    }
+    buffer = pktbuf->data;
+    buflen = pktbuf->len;
+    while( buflen ) {
+       n = *buffer++; buflen--;
+       if( n == 255 ) { /* 4 byte length header */
+           if( buflen < 4 )
+               goto too_short;
+           n = (buffer[0] << 24) | (buffer[1] << 16)
+                | (buffer[2] << 8) | buffer[3];
+           buffer += 4;
+           buflen -= 4;
+       }
+       else if( n >= 192 ) { /* 2 byte special encoded length header */
+           if( buflen < 2 )
+               goto too_short;
+           n = (( n - 192 ) << 8) + *buffer + 192;
+           buffer++;
+           buflen--;
+       }
+       if( buflen < n )
+           goto too_short;
+       type = *buffer;
+       if( type & 0x80 ) {
+           type &= 0x7f;
+           *critical = 1;
+       }
+       else
+           *critical = 0;
+       if( !(++seq > reqseq) )
+           ;
+       else if( reqtype == SIGSUBPKT_TEST_CRITICAL ) {
+           if( *critical ) {
+               if( n-1 > buflen+1 )
+                   goto too_short;
+               if( !can_handle_critical(buffer+1, n-1, type ) )
+                 {
+                   if(opt.verbose)
+                     log_info(_("subpacket of type %d has "
+                                "critical bit set\n"),type);
+                   if( start )
+                     *start = seq;
+                   return NULL; /* this is an error */
+                 }
+           }
+       }
+       else if( reqtype < 0 ) /* list packets */
+           dump_sig_subpkt( reqtype == SIGSUBPKT_LIST_HASHED,
+                                   type, *critical, buffer, buflen, n );
+       else if( type == reqtype ) { /* found */
+           buffer++;
+           n--;
+           if( n > buflen )
+               goto too_short;
+           if( ret_n )
+               *ret_n = n;
+           offset = parse_one_sig_subpkt(buffer, n, type );
+           switch( offset ) {
+             case -2:
+               log_error("subpacket of type %d too short\n", type);
+               return NULL;
+             case -1:
+               return NULL;
+             default:
+               break;
+           }
+           if( start )
+               *start = seq;
+           return buffer+offset;
+       }
+       buffer += n; buflen -=n;
+    }
+    if( reqtype == SIGSUBPKT_TEST_CRITICAL )
+       return buffer; /* as value true to indicate that there is no */
+                      /* critical bit we don't understand */
+    if( start )
+       *start = -1;
+    return NULL; /* end of packets; not found */
+
+  too_short:
+    if(opt.verbose)
+      log_info("buffer shorter than subpacket\n");
+    if( start )
+       *start = -1;
+    return NULL;
+}
+
+
+const byte *
+parse_sig_subpkt (const subpktarea_t *buffer, sigsubpkttype_t reqtype,
+                  size_t *ret_n)
+{
+    return enum_sig_subpkt( buffer, reqtype, ret_n, NULL, NULL );
+}
+
+const byte *
+parse_sig_subpkt2 (PKT_signature *sig, sigsubpkttype_t reqtype,
+                   size_t *ret_n )
+{
+    const byte *p;
+
+    p = parse_sig_subpkt (sig->hashed, reqtype, ret_n );
+    if( !p )
+       p = parse_sig_subpkt (sig->unhashed, reqtype, ret_n );
+    return p;
+}
+
+/* Find all revocation keys. Look in hashed area only. */
+void parse_revkeys(PKT_signature *sig)
+{
+  struct revocation_key *revkey;
+  int seq=0;
+  size_t len;
+
+  if(sig->sig_class!=0x1F)
+    return;
+
+  while((revkey=
+        (struct revocation_key *)enum_sig_subpkt(sig->hashed,
+                                                 SIGSUBPKT_REV_KEY,
+                                                 &len,&seq,NULL)))
+    {
+      if(len==sizeof(struct revocation_key) &&
+        (revkey->class&0x80)) /* 0x80 bit must be set */
+       {
+         sig->revkey=xrealloc(sig->revkey,
+                         sizeof(struct revocation_key *)*(sig->numrevkeys+1));
+         sig->revkey[sig->numrevkeys]=revkey;
+         sig->numrevkeys++;
+       }
+    }
+}
+
+int
+parse_signature( IOBUF inp, int pkttype, unsigned long pktlen,
+                                         PKT_signature *sig )
+{
+    int md5_len=0;
+    unsigned n;
+    int is_v4=0;
+    int rc=0;
+    int i, ndata;
+
+    if( pktlen < 16 ) {
+       log_error("packet(%d) too short\n", pkttype);
+       goto leave;
+    }
+    sig->version = iobuf_get_noeof(inp); pktlen--;
+    if( sig->version == 4 )
+       is_v4=1;
+    else if( sig->version != 2 && sig->version != 3 ) {
+       log_error("packet(%d) with unknown version %d\n", pkttype, sig->version);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+
+    if( !is_v4 ) {
+       md5_len = iobuf_get_noeof(inp); pktlen--;
+    }
+    sig->sig_class = iobuf_get_noeof(inp); pktlen--;
+    if( !is_v4 ) {
+       sig->timestamp = read_32(inp); pktlen -= 4;
+       sig->keyid[0] = read_32(inp); pktlen -= 4;
+       sig->keyid[1] = read_32(inp); pktlen -= 4;
+    }
+    sig->pubkey_algo = iobuf_get_noeof(inp); pktlen--;
+    sig->digest_algo = iobuf_get_noeof(inp); pktlen--;
+    sig->flags.exportable=1;
+    sig->flags.revocable=1;
+    if( is_v4 ) { /* read subpackets */
+       n = read_16(inp); pktlen -= 2; /* length of hashed data */
+       if( n > 10000 ) {
+           log_error("signature packet: hashed data too long\n");
+           rc = G10ERR_INVALID_PACKET;
+           goto leave;
+       }
+       if( n ) {
+           sig->hashed = xmalloc (sizeof (*sig->hashed) + n - 1 );
+            sig->hashed->size = n;
+           sig->hashed->len = n;
+           if( iobuf_read (inp, sig->hashed->data, n ) != n ) {
+               log_error ("premature eof while reading "
+                           "hashed signature data\n");
+               rc = -1;
+               goto leave;
+           }
+           pktlen -= n;
+       }
+       n = read_16(inp); pktlen -= 2; /* length of unhashed data */
+       if( n > 10000 ) {
+           log_error("signature packet: unhashed data too long\n");
+           rc = G10ERR_INVALID_PACKET;
+           goto leave;
+       }
+       if( n ) {
+           sig->unhashed = xmalloc (sizeof(*sig->unhashed) + n - 1 );
+            sig->unhashed->size = n;
+           sig->unhashed->len = n;
+           if( iobuf_read(inp, sig->unhashed->data, n ) != n ) {
+               log_error("premature eof while reading "
+                          "unhashed signature data\n");
+               rc = -1;
+               goto leave;
+           }
+           pktlen -= n;
+       }
+    }
+
+    if( pktlen < 5 ) { /* sanity check */
+       log_error("packet(%d) too short\n", pkttype);
+       rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+
+    sig->digest_start[0] = iobuf_get_noeof(inp); pktlen--;
+    sig->digest_start[1] = iobuf_get_noeof(inp); pktlen--;
+
+    if( is_v4 && sig->pubkey_algo )
+      { /*extract required information */
+       const byte *p;
+       size_t len;
+
+       /* set sig->flags.unknown_critical if there is a
+        * critical bit set for packets which we do not understand */
+       if( !parse_sig_subpkt (sig->hashed, SIGSUBPKT_TEST_CRITICAL, NULL)
+           || !parse_sig_subpkt (sig->unhashed, SIGSUBPKT_TEST_CRITICAL,
+                                 NULL) )
+         sig->flags.unknown_critical = 1;
+
+       p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_SIG_CREATED, NULL );
+       if(p)
+         sig->timestamp = buffer_to_u32(p);
+       else if(!(sig->pubkey_algo>=100 && sig->pubkey_algo<=110)
+               && opt.verbose)
+         log_info ("signature packet without timestamp\n");
+
+       p = parse_sig_subpkt2( sig, SIGSUBPKT_ISSUER, NULL );
+       if(p)
+         {
+           sig->keyid[0] = buffer_to_u32(p);
+           sig->keyid[1] = buffer_to_u32(p+4);
+         }
+       else if(!(sig->pubkey_algo>=100 && sig->pubkey_algo<=110)
+               && opt.verbose)
+         log_info ("signature packet without keyid\n");
+
+       p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_SIG_EXPIRE,NULL);
+       if(p && buffer_to_u32(p))
+         sig->expiredate=sig->timestamp+buffer_to_u32(p);
+       if(sig->expiredate && sig->expiredate<=make_timestamp())
+         sig->flags.expired=1;
+
+       p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_POLICY,NULL);
+       if(p)
+         sig->flags.policy_url=1;
+
+       p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_PREF_KS,NULL);
+       if(p)
+         sig->flags.pref_ks=1;
+
+       p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_NOTATION,NULL);
+       if(p)
+         sig->flags.notation=1;
+
+       p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_REVOCABLE,NULL);
+       if(p && *p==0)
+         sig->flags.revocable=0;
+
+       p=parse_sig_subpkt(sig->hashed,SIGSUBPKT_TRUST,&len);
+       if(p && len==2)
+         {
+           sig->trust_depth=p[0];
+           sig->trust_value=p[1];
+
+           /* Only look for a regexp if there is also a trust
+              subpacket. */
+           sig->trust_regexp=
+             parse_sig_subpkt(sig->hashed,SIGSUBPKT_REGEXP,&len);
+
+           /* If the regular expression is of 0 length, there is no
+              regular expression. */
+           if(len==0)
+             sig->trust_regexp=NULL;
+         }
+
+       /* We accept the exportable subpacket from either the hashed
+          or unhashed areas as older versions of gpg put it in the
+          unhashed area.  In theory, anyway, we should never see this
+          packet off of a local keyring. */
+
+       p=parse_sig_subpkt2(sig,SIGSUBPKT_EXPORTABLE,NULL);
+       if(p && *p==0)
+         sig->flags.exportable=0;
+
+       /* Find all revocation keys. */
+       if(sig->sig_class==0x1F)
+         parse_revkeys(sig);
+      }
+
+    if( list_mode ) {
+       fprintf (listfp, ":signature packet: algo %d, keyid %08lX%08lX\n"
+              "\tversion %d, created %lu, md5len %d, sigclass %02x\n"
+              "\tdigest algo %d, begin of digest %02x %02x\n",
+               sig->pubkey_algo,
+               (ulong)sig->keyid[0], (ulong)sig->keyid[1],
+               sig->version, (ulong)sig->timestamp, md5_len, sig->sig_class,
+               sig->digest_algo,
+               sig->digest_start[0], sig->digest_start[1] );
+       if( is_v4 ) {
+           parse_sig_subpkt (sig->hashed,   SIGSUBPKT_LIST_HASHED, NULL );
+           parse_sig_subpkt (sig->unhashed, SIGSUBPKT_LIST_UNHASHED, NULL);
+       }
+    }
+
+    ndata = pubkey_get_nsig(sig->pubkey_algo);
+    if( !ndata ) {
+       if( list_mode )
+           fprintf (listfp, "\tunknown algorithm %d\n", sig->pubkey_algo );
+       unknown_pubkey_warning( sig->pubkey_algo );
+       /* we store the plain material in data[0], so that we are able
+        * to write it back with build_packet() */
+       sig->data[0]= mpi_set_opaque(NULL, read_rest(inp, pktlen, 0), pktlen );
+       pktlen = 0;
+    }
+    else {
+       for( i=0; i < ndata; i++ ) {
+           n = pktlen;
+           sig->data[i] = mpi_read(inp, &n, 0 );
+           pktlen -=n;
+           if( list_mode ) {
+               fprintf (listfp, "\tdata: ");
+               mpi_print(listfp, sig->data[i], mpi_print_mode );
+               putc ('\n', listfp);
+           }
+            if (!sig->data[i])
+                rc = G10ERR_INVALID_PACKET;
+       }
+    }
+
+  leave:
+    iobuf_skip_rest(inp, pktlen, 0);
+    return rc;
+}
+
+
+static int
+parse_onepass_sig( IOBUF inp, int pkttype, unsigned long pktlen,
+                                            PKT_onepass_sig *ops )
+{
+    int version;
+    int rc = 0;
+
+    if( pktlen < 13 ) {
+       log_error("packet(%d) too short\n", pkttype);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    version = iobuf_get_noeof(inp); pktlen--;
+    if( version != 3 ) {
+       log_error("onepass_sig with unknown version %d\n", version);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    ops->sig_class = iobuf_get_noeof(inp); pktlen--;
+    ops->digest_algo = iobuf_get_noeof(inp); pktlen--;
+    ops->pubkey_algo = iobuf_get_noeof(inp); pktlen--;
+    ops->keyid[0] = read_32(inp); pktlen -= 4;
+    ops->keyid[1] = read_32(inp); pktlen -= 4;
+    ops->last = iobuf_get_noeof(inp); pktlen--;
+    if( list_mode )
+       fprintf (listfp, ":onepass_sig packet: keyid %08lX%08lX\n"
+              "\tversion %d, sigclass %02x, digest %d, pubkey %d, last=%d\n",
+               (ulong)ops->keyid[0], (ulong)ops->keyid[1],
+               version, ops->sig_class,
+               ops->digest_algo, ops->pubkey_algo, ops->last );
+
+
+  leave:
+    iobuf_skip_rest(inp, pktlen, 0);
+    return rc;
+}
+
+
+static MPI
+read_protected_v3_mpi (IOBUF inp, unsigned long *length)
+{
+  int c;
+  unsigned int nbits, nbytes;
+  unsigned char *buf, *p;
+  MPI val;
+
+  if (*length < 2)
+    {
+      log_error ("mpi too small\n");
+      return NULL;
+    }
+
+  if ((c=iobuf_get (inp)) == -1)
+    return NULL;
+  --*length;
+  nbits = c << 8;
+  if ((c=iobuf_get(inp)) == -1)
+    return NULL;
+  --*length;
+  nbits |= c;
+
+  if (nbits > 16384)
+    {
+      log_error ("mpi too large (%u bits)\n", nbits);
+      return NULL;
+    }
+  nbytes = (nbits+7) / 8;
+  buf = p = xmalloc (2 + nbytes);
+  *p++ = nbits >> 8;
+  *p++ = nbits;
+  for (; nbytes && length; nbytes--, --*length)
+    *p++ = iobuf_get (inp);
+  if (nbytes)
+    {
+      log_error ("packet shorter tham mpi\n");
+      xfree (buf);
+      return NULL;
+    }
+
+  /* convert buffer into an opaque MPI */
+  val = mpi_set_opaque (NULL, buf, p-buf); 
+  return val;
+}
+
+
+static int
+parse_key( IOBUF inp, int pkttype, unsigned long pktlen,
+                             byte *hdr, int hdrlen, PACKET *pkt )
+{
+    int i, version, algorithm;
+    unsigned n;
+    unsigned long timestamp, expiredate, max_expiredate;
+    int npkey, nskey;
+    int is_v4=0;
+    int rc=0;
+
+    version = iobuf_get_noeof(inp); pktlen--;
+    if( pkttype == PKT_PUBLIC_SUBKEY && version == '#' ) {
+       /* early versions of G10 use old PGP comments packets;
+        * luckily all those comments are started by a hash */
+       if( list_mode ) {
+           fprintf (listfp, ":rfc1991 comment packet: \"" );
+           for( ; pktlen; pktlen-- ) {
+               int c;
+               c = iobuf_get_noeof(inp);
+               if( c >= ' ' && c <= 'z' )
+                   putc (c, listfp);
+               else
+                   fprintf (listfp, "\\x%02x", c );
+           }
+           fprintf (listfp, "\"\n");
+       }
+       iobuf_skip_rest(inp, pktlen, 0);
+       return 0;
+    }
+    else if( version == 4 )
+       is_v4=1;
+    else if( version != 2 && version != 3 ) {
+       log_error("packet(%d) with unknown version %d\n", pkttype, version);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+
+    if( pktlen < 11 ) {
+       log_error("packet(%d) too short\n", pkttype);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+
+    timestamp = read_32(inp); pktlen -= 4;
+    if( is_v4 ) {
+       expiredate = 0; /* have to get it from the selfsignature */
+       max_expiredate = 0;
+    }
+    else {
+       unsigned short ndays;
+       ndays = read_16(inp); pktlen -= 2;
+       if( ndays )
+           expiredate = timestamp + ndays * 86400L;
+       else
+           expiredate = 0;
+
+       max_expiredate=expiredate;
+    }
+    algorithm = iobuf_get_noeof(inp); pktlen--;
+    if( list_mode )
+       fprintf (listfp, ":%s key packet:\n"
+              "\tversion %d, algo %d, created %lu, expires %lu\n",
+               pkttype == PKT_PUBLIC_KEY? "public" :
+               pkttype == PKT_SECRET_KEY? "secret" :
+               pkttype == PKT_PUBLIC_SUBKEY? "public sub" :
+               pkttype == PKT_SECRET_SUBKEY? "secret sub" : "??",
+               version, algorithm, timestamp, expiredate );
+
+    if( pkttype == PKT_SECRET_KEY || pkttype == PKT_SECRET_SUBKEY )  {
+       PKT_secret_key *sk = pkt->pkt.secret_key;
+
+       sk->timestamp = timestamp;
+       sk->expiredate = expiredate;
+       sk->max_expiredate = max_expiredate;
+       sk->hdrbytes = hdrlen;
+       sk->version = version;
+       sk->is_primary = pkttype == PKT_SECRET_KEY;
+       sk->pubkey_algo = algorithm;
+       sk->req_usage = 0; 
+       sk->pubkey_usage = 0; /* not yet used */
+    }
+    else {
+       PKT_public_key *pk = pkt->pkt.public_key;
+
+       pk->timestamp = timestamp;
+       pk->expiredate = expiredate;
+       pk->max_expiredate = max_expiredate;
+       pk->hdrbytes    = hdrlen;
+       pk->version     = version;
+       pk->is_primary = pkttype == PKT_PUBLIC_KEY;
+       pk->pubkey_algo = algorithm;
+       pk->req_usage = 0; 
+       pk->pubkey_usage = 0; /* not yet used */
+        pk->is_revoked = 0;
+       pk->is_disabled = 0;
+       pk->keyid[0] = 0;
+       pk->keyid[1] = 0;
+    }
+    nskey = pubkey_get_nskey( algorithm );
+    npkey = pubkey_get_npkey( algorithm );
+    if( !npkey ) {
+       if( list_mode )
+           fprintf (listfp, "\tunknown algorithm %d\n", algorithm );
+       unknown_pubkey_warning( algorithm );
+    }
+
+
+    if( pkttype == PKT_SECRET_KEY || pkttype == PKT_SECRET_SUBKEY ) {
+       PKT_secret_key *sk = pkt->pkt.secret_key;
+       byte temp[16];
+        size_t snlen = 0;
+
+       if( !npkey ) {
+           sk->skey[0] = mpi_set_opaque( NULL,
+                                         read_rest(inp, pktlen, 0), pktlen );
+           pktlen = 0;
+           goto leave;
+       }
+
+       for(i=0; i < npkey; i++ ) {
+           n = pktlen; sk->skey[i] = mpi_read(inp, &n, 0 ); pktlen -=n;
+           if( list_mode ) {
+               fprintf (listfp,   "\tskey[%d]: ", i);
+               mpi_print(listfp, sk->skey[i], mpi_print_mode  );
+               putc ('\n', listfp);
+           }
+            if (!sk->skey[i])
+                rc = G10ERR_INVALID_PACKET;
+       }
+        if (rc) /* one of the MPIs were bad */
+            goto leave;
+       sk->protect.algo = iobuf_get_noeof(inp); pktlen--;
+        sk->protect.sha1chk = 0;
+       if( sk->protect.algo ) {
+           sk->is_protected = 1;
+           sk->protect.s2k.count = 0;
+           if( sk->protect.algo == 254 || sk->protect.algo == 255 ) {
+               if( pktlen < 3 ) {
+                   rc = G10ERR_INVALID_PACKET;
+                   goto leave;
+               }
+                sk->protect.sha1chk = (sk->protect.algo == 254);
+               sk->protect.algo = iobuf_get_noeof(inp); pktlen--;
+               /* Note that a sk->protect.algo > 110 is illegal, but
+                  I'm not erroring on it here as otherwise there
+                  would be no way to delete such a key. */
+               sk->protect.s2k.mode  = iobuf_get_noeof(inp); pktlen--;
+               sk->protect.s2k.hash_algo = iobuf_get_noeof(inp); pktlen--;
+               /* check for the special GNU extension */
+               if( is_v4 && sk->protect.s2k.mode == 101 ) {
+                   for(i=0; i < 4 && pktlen; i++, pktlen-- )
+                       temp[i] = iobuf_get_noeof(inp);
+                   if( i < 4 || memcmp( temp, "GNU", 3 ) ) {
+                       if( list_mode )
+                           fprintf (listfp,   "\tunknown S2K %d\n",
+                                               sk->protect.s2k.mode );
+                       rc = G10ERR_INVALID_PACKET;
+                       goto leave;
+                   }
+                   /* here we know that it is a gnu extension
+                    * What follows is the GNU protection mode:
+                    * All values have special meanings
+                    * and they are mapped in the mode with a base of 1000.
+                    */
+                   sk->protect.s2k.mode = 1000 + temp[3];
+               }
+               switch( sk->protect.s2k.mode ) {
+                 case 1:
+                 case 3:
+                   for(i=0; i < 8 && pktlen; i++, pktlen-- )
+                       temp[i] = iobuf_get_noeof(inp);
+                   memcpy(sk->protect.s2k.salt, temp, 8 );
+                   break;
+               }
+               switch( sk->protect.s2k.mode ) {
+                 case 0: if( list_mode ) fprintf (listfp, "\tsimple S2K" );
+                   break;
+                 case 1: if( list_mode ) fprintf (listfp, "\tsalted S2K" );
+                   break;
+                 case 3: if( list_mode ) fprintf (listfp, "\titer+salt S2K" );
+                   break;
+                 case 1001: if( list_mode ) fprintf (listfp,
+                                                      "\tgnu-dummy S2K" );
+                   break;
+                 case 1002: if (list_mode) fprintf (listfp,
+                                                  "\tgnu-divert-to-card S2K");
+                   break;
+                 default:
+                   if( list_mode )
+                       fprintf (listfp,   "\tunknown %sS2K %d\n",
+                                sk->protect.s2k.mode < 1000? "":"GNU ",
+                                                  sk->protect.s2k.mode );
+                   rc = G10ERR_INVALID_PACKET;
+                   goto leave;
+               }
+
+               if( list_mode ) {
+                   fprintf (listfp, ", algo: %d,%s hash: %d",
+                                    sk->protect.algo,
+                                     sk->protect.sha1chk?" SHA1 protection,"
+                                                        :" simple checksum,",
+                                    sk->protect.s2k.hash_algo );
+                   if( sk->protect.s2k.mode == 1
+                       || sk->protect.s2k.mode == 3 ) {
+                       fprintf (listfp, ", salt: ");
+                       for(i=0; i < 8; i++ )
+                           fprintf (listfp, "%02x", sk->protect.s2k.salt[i]);
+                   }
+                   putc ('\n', listfp);
+               }
+
+               if( sk->protect.s2k.mode == 3 ) {
+                   if( pktlen < 1 ) {
+                       rc = G10ERR_INVALID_PACKET;
+                       goto leave;
+                   }
+                   sk->protect.s2k.count = iobuf_get(inp);
+                   pktlen--;
+                   if( list_mode )
+                       fprintf (listfp, "\tprotect count: %lu\n",
+                                           (ulong)sk->protect.s2k.count);
+               }
+               else if( sk->protect.s2k.mode == 1002 ) {
+                    /* Read the serial number. */
+                    if (pktlen < 1) {
+                      rc = G10ERR_INVALID_PACKET;
+                       goto leave;
+                   }
+                   snlen = iobuf_get (inp);
+                   pktlen--;
+                    if (pktlen < snlen || snlen == -1) {
+                       rc = G10ERR_INVALID_PACKET;
+                       goto leave;
+                    }
+               }
+           }
+           /* Note that a sk->protect.algo > 110 is illegal, but I'm
+              not erroring on it here as otherwise there would be no
+              way to delete such a key. */
+           else { /* old version; no S2K, so we set mode to 0, hash MD5 */
+               sk->protect.s2k.mode = 0;
+               sk->protect.s2k.hash_algo = DIGEST_ALGO_MD5;
+               if( list_mode )
+                   fprintf (listfp,   "\tprotect algo: %d  (hash algo: %d)\n",
+                        sk->protect.algo, sk->protect.s2k.hash_algo );
+           }
+           /* It is really ugly that we don't know the size
+            * of the IV here in cases we are not aware of the algorithm.
+            * so a
+            *   sk->protect.ivlen = cipher_get_blocksize(sk->protect.algo);
+            * won't work.  The only solution I see is to hardwire it here.
+            * NOTE: if you change the ivlen above 16, don't forget to
+            * enlarge temp.
+            */
+           switch( sk->protect.algo ) {
+             case 7: case 8: case 9: /* reserved for AES */
+             case 10: /* Twofish */
+               sk->protect.ivlen = 16;
+               break;
+             default:
+               sk->protect.ivlen = 8;
+           }
+           if( sk->protect.s2k.mode == 1001 )
+               sk->protect.ivlen = 0;
+           else if( sk->protect.s2k.mode == 1002 )
+               sk->protect.ivlen = snlen < 16? snlen : 16;
+
+           if( pktlen < sk->protect.ivlen ) {
+               rc = G10ERR_INVALID_PACKET;
+               goto leave;
+           }
+           for(i=0; i < sk->protect.ivlen && pktlen; i++, pktlen-- )
+               temp[i] = iobuf_get_noeof(inp);
+           if( list_mode ) {
+               fprintf (listfp,
+                         sk->protect.s2k.mode == 1002? "\tserial-number: "
+                                                     : "\tprotect IV: ");
+               for(i=0; i < sk->protect.ivlen; i++ )
+                   fprintf (listfp, " %02x", temp[i] );
+               putc ('\n', listfp);
+           }
+           memcpy(sk->protect.iv, temp, sk->protect.ivlen );
+       }
+       else
+           sk->is_protected = 0;
+       /* It does not make sense to read it into secure memory.
+        * If the user is so careless, not to protect his secret key,
+        * we can assume, that he operates an open system :=(.
+        * So we put the key into secure memory when we unprotect it. */
+       if( sk->protect.s2k.mode == 1001 
+            || sk->protect.s2k.mode == 1002 ) {
+           /* better set some dummy stuff here */
+           sk->skey[npkey] = mpi_set_opaque(NULL, xstrdup("dummydata"), 10);
+           pktlen = 0;
+       }
+       else if( is_v4 && sk->is_protected ) {
+           /* ugly; the length is encrypted too, so we read all
+            * stuff up to the end of the packet into the first
+            * skey element */
+           sk->skey[npkey] = mpi_set_opaque(NULL,
+                                            read_rest(inp, pktlen, 0),pktlen);
+           pktlen = 0;
+           if( list_mode ) {
+               fprintf (listfp, "\tencrypted stuff follows\n");
+           }
+       }
+       else { /* v3 method: the mpi length is not encrypted */
+           for(i=npkey; i < nskey; i++ ) {
+                if ( sk->is_protected ) {
+                    sk->skey[i] = read_protected_v3_mpi (inp, &pktlen);
+                    if( list_mode ) 
+                        fprintf (listfp,   "\tskey[%d]: [encrypted]\n", i);
+                }
+                else {
+                    n = pktlen;
+                    sk->skey[i] = mpi_read(inp, &n, 0 );
+                    pktlen -=n;
+                    if( list_mode ) {
+                        fprintf (listfp,   "\tskey[%d]: ", i);
+                        mpi_print(listfp, sk->skey[i], mpi_print_mode  );
+                        putc ('\n', listfp);
+                    }
+                }
+
+                if (!sk->skey[i])
+                    rc = G10ERR_INVALID_PACKET;
+           }
+            if (rc)
+                goto leave;
+
+           sk->csum = read_16(inp); pktlen -= 2;
+           if( list_mode ) {
+               fprintf (listfp, "\tchecksum: %04hx\n", sk->csum);
+           }
+       }
+    }
+    else {
+       PKT_public_key *pk = pkt->pkt.public_key;
+
+       if( !npkey ) {
+           pk->pkey[0] = mpi_set_opaque( NULL,
+                                         read_rest(inp, pktlen, 0), pktlen );
+           pktlen = 0;
+           goto leave;
+       }
+
+       for(i=0; i < npkey; i++ ) {
+           n = pktlen; pk->pkey[i] = mpi_read(inp, &n, 0 ); pktlen -=n;
+           if( list_mode ) {
+               fprintf (listfp,   "\tpkey[%d]: ", i);
+               mpi_print(listfp, pk->pkey[i], mpi_print_mode  );
+               putc ('\n', listfp);
+           }
+            if (!pk->pkey[i])
+                rc = G10ERR_INVALID_PACKET;
+       }
+        if (rc)
+            goto leave;
+    }
+
+  leave:
+    iobuf_skip_rest(inp, pktlen, 0);
+    return rc;
+}
+
+/* Attribute subpackets have the same format as v4 signature
+   subpackets.  This is not part of OpenPGP, but is done in several
+   versions of PGP nevertheless. */
+int
+parse_attribute_subpkts(PKT_user_id *uid)
+{
+  size_t n;
+  int count=0;
+  struct user_attribute *attribs=NULL;
+  const byte *buffer=uid->attrib_data;
+  int buflen=uid->attrib_len;
+  byte type;
+
+  xfree(uid->attribs);
+
+  while(buflen)
+    {
+      n = *buffer++; buflen--;
+      if( n == 255 ) { /* 4 byte length header */
+       if( buflen < 4 )
+         goto too_short;
+       n = (buffer[0] << 24) | (buffer[1] << 16)
+         | (buffer[2] << 8) | buffer[3];
+       buffer += 4;
+       buflen -= 4;
+      }
+      else if( n >= 192 ) { /* 2 byte special encoded length header */
+       if( buflen < 2 )
+         goto too_short;
+       n = (( n - 192 ) << 8) + *buffer + 192;
+       buffer++;
+       buflen--;
+      }
+      if( buflen < n )
+       goto too_short;
+
+      attribs=xrealloc(attribs,(count+1)*sizeof(struct user_attribute));
+      memset(&attribs[count],0,sizeof(struct user_attribute));
+
+      type=*buffer;
+      buffer++;
+      buflen--;
+      n--;
+
+      attribs[count].type=type;
+      attribs[count].data=buffer;
+      attribs[count].len=n;
+      buffer+=n;
+      buflen-=n;
+      count++;
+    }
+
+  uid->attribs=attribs;
+  uid->numattribs=count;
+  return count;
+
+ too_short:
+  if(opt.verbose)
+    log_info("buffer shorter than attribute subpacket\n");
+  uid->attribs=attribs;
+  uid->numattribs=count;
+  return count;
+}
+
+
+static int
+parse_user_id( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
+{
+    byte *p;
+
+    /* Cap the size of a user ID at 2k: a value absurdly large enough
+       that there is no sane user ID string (which is printable text
+       as of RFC2440bis) that won't fit in it, but yet small enough to
+       avoid allocation problems.  A large pktlen may not be
+       allocatable, and a very large pktlen could actually cause our
+       allocation to wrap around in xmalloc to a small number. */
+
+    if(pktlen>2048)
+      {
+       log_error("packet(%d) too large\n", pkttype);
+       iobuf_skip_rest(inp, pktlen, 0);
+       return G10ERR_INVALID_PACKET;
+      }
+
+    packet->pkt.user_id = xmalloc_clear(sizeof *packet->pkt.user_id + pktlen);
+    packet->pkt.user_id->len = pktlen;
+    packet->pkt.user_id->ref=1;
+
+    p = packet->pkt.user_id->name;
+    for( ; pktlen; pktlen--, p++ )
+       *p = iobuf_get_noeof(inp);
+    *p = 0;
+
+    if( list_mode ) {
+       int n = packet->pkt.user_id->len;
+       fprintf (listfp, ":user ID packet: \"");
+       /* fixme: Hey why don't we replace this with print_string?? */
+       for(p=packet->pkt.user_id->name; n; p++, n-- ) {
+           if( *p >= ' ' && *p <= 'z' )
+               putc (*p, listfp);
+           else
+               fprintf (listfp, "\\x%02x", *p );
+       }
+       fprintf (listfp, "\"\n");
+    }
+    return 0;
+}
+
+
+void
+make_attribute_uidname(PKT_user_id *uid, size_t max_namelen)
+{
+  assert ( max_namelen > 70 );
+  if(uid->numattribs<=0)
+    sprintf(uid->name,"[bad attribute packet of size %lu]",uid->attrib_len);
+  else if(uid->numattribs>1)
+    sprintf(uid->name,"[%d attributes of size %lu]",
+           uid->numattribs,uid->attrib_len);
+  else
+    {
+      /* Only one attribute, so list it as the "user id" */
+
+      if(uid->attribs->type==ATTRIB_IMAGE)
+       {
+         u32 len;
+         byte type;
+
+         if(parse_image_header(uid->attribs,&type,&len))
+           sprintf(uid->name,"[%.20s image of size %lu]",
+                   image_type_to_string(type,1),(ulong)len);
+         else
+           sprintf(uid->name,"[invalid image]");
+       }
+      else
+       sprintf(uid->name,"[unknown attribute of size %lu]",
+               (ulong)uid->attribs->len);
+    }
+
+  uid->len = strlen(uid->name);
+}
+
+static int
+parse_attribute( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
+{
+    byte *p;
+
+#define EXTRA_UID_NAME_SPACE 71
+    packet->pkt.user_id = xmalloc_clear(sizeof *packet->pkt.user_id
+                                       + EXTRA_UID_NAME_SPACE);
+    packet->pkt.user_id->ref=1;
+    packet->pkt.user_id->attrib_data = xmalloc(pktlen);
+    packet->pkt.user_id->attrib_len = pktlen;
+
+    p = packet->pkt.user_id->attrib_data;
+    for( ; pktlen; pktlen--, p++ )
+       *p = iobuf_get_noeof(inp);
+
+    /* Now parse out the individual attribute subpackets.  This is
+       somewhat pointless since there is only one currently defined
+       attribute type (jpeg), but it is correct by the spec. */
+    parse_attribute_subpkts(packet->pkt.user_id);
+
+    make_attribute_uidname(packet->pkt.user_id, EXTRA_UID_NAME_SPACE);
+
+    if( list_mode ) {
+       fprintf (listfp, ":attribute packet: %s\n", packet->pkt.user_id->name );
+    }
+    return 0;
+}
+
+
+static int
+parse_comment( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *packet )
+{
+    byte *p;
+
+    /* Cap comment packet at a reasonable value to avoid an integer
+       overflow in the malloc below.  Comment packets are actually not
+       anymore define my OpenPGP and we even stopped to use our
+       private comment packet. */
+    if (pktlen>65536)
+      {
+       log_error ("packet(%d) too large\n", pkttype);
+       iobuf_skip_rest (inp, pktlen, 0);
+       return G10ERR_INVALID_PACKET;
+      }
+    packet->pkt.comment = xmalloc(sizeof *packet->pkt.comment + pktlen - 1);
+    packet->pkt.comment->len = pktlen;
+    p = packet->pkt.comment->data;
+    for( ; pktlen; pktlen--, p++ )
+       *p = iobuf_get_noeof(inp);
+
+    if( list_mode ) {
+       int n = packet->pkt.comment->len;
+       fprintf (listfp, ":%scomment packet: \"", pkttype == PKT_OLD_COMMENT?
+                                        "OpenPGP draft " : "GnuPG " );
+       for(p=packet->pkt.comment->data; n; p++, n-- ) {
+           if( *p >= ' ' && *p <= 'z' )
+               putc (*p, listfp);
+           else
+               fprintf (listfp, "\\x%02x", *p );
+       }
+       fprintf (listfp, "\"\n");
+    }
+    return 0;
+}
+
+
+static void
+parse_trust( IOBUF inp, int pkttype, unsigned long pktlen, PACKET *pkt )
+{
+  int c;
+
+  if (pktlen)
+    {
+      c = iobuf_get_noeof(inp);
+      pktlen--;
+      pkt->pkt.ring_trust = xmalloc( sizeof *pkt->pkt.ring_trust );
+      pkt->pkt.ring_trust->trustval = c;
+      pkt->pkt.ring_trust->sigcache = 0;
+      if (!c && pktlen==1)
+        {
+          c = iobuf_get_noeof (inp);
+          pktlen--;
+          /* we require that bit 7 of the sigcache is 0 (easier eof handling)*/
+          if ( !(c & 0x80) )
+            pkt->pkt.ring_trust->sigcache = c;
+        }
+      if( list_mode )
+       fprintf (listfp, ":trust packet: flag=%02x sigcache=%02x\n",
+               pkt->pkt.ring_trust->trustval,
+               pkt->pkt.ring_trust->sigcache);
+    }
+  else
+    {
+      if( list_mode )
+       fprintf (listfp, ":trust packet: empty\n");
+    }
+  iobuf_skip_rest (inp, pktlen, 0);
+}
+
+
+static int
+parse_plaintext( IOBUF inp, int pkttype, unsigned long pktlen,
+                PACKET *pkt, int new_ctb, int partial )
+{
+    int rc = 0;
+    int mode, namelen;
+    PKT_plaintext *pt;
+    byte *p;
+    int c, i;
+
+    if( !partial && pktlen < 6 ) {
+       log_error("packet(%d) too short (%lu)\n", pkttype, (ulong)pktlen);
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    mode = iobuf_get_noeof(inp); if( pktlen ) pktlen--;
+    namelen = iobuf_get_noeof(inp); if( pktlen ) pktlen--;
+    /* Note that namelen will never exceeds 255 byte. */
+    pt = pkt->pkt.plaintext = xmalloc(sizeof *pkt->pkt.plaintext + namelen -1);
+    pt->new_ctb = new_ctb;
+    pt->mode = mode;
+    pt->namelen = namelen;
+    pt->is_partial = partial;
+    if( pktlen ) {
+       for( i=0; pktlen > 4 && i < namelen; pktlen--, i++ )
+           pt->name[i] = iobuf_get_noeof(inp);
+    }
+    else {
+       for( i=0; i < namelen; i++ )
+           if( (c=iobuf_get(inp)) == -1 )
+               break;
+           else
+               pt->name[i] = c;
+    }
+    pt->timestamp = read_32(inp); if( pktlen) pktlen -= 4;
+    pt->len = pktlen;
+    pt->buf = inp;
+    pktlen = 0;
+
+    if( list_mode ) {
+       fprintf (listfp, ":literal data packet:\n"
+              "\tmode %c (%X), created %lu, name=\"",
+                   mode >= ' ' && mode <'z'? mode : '?', mode,
+                   (ulong)pt->timestamp );
+       for(p=pt->name,i=0; i < namelen; p++, i++ ) {
+           if( *p >= ' ' && *p <= 'z' )
+               putc (*p, listfp);
+           else
+               fprintf (listfp, "\\x%02x", *p );
+       }
+       fprintf (listfp, "\",\n\traw data: ");
+       if(partial)
+         fprintf (listfp, "unknown length\n");
+       else
+         fprintf (listfp, "%lu bytes\n", (ulong)pt->len );
+    }
+
+  leave:
+    return rc;
+}
+
+
+static int
+parse_compressed( IOBUF inp, int pkttype, unsigned long pktlen,
+                 PACKET *pkt, int new_ctb )
+{
+    PKT_compressed *zd;
+
+    /* pktlen is here 0, but data follows
+     * (this should be the last object in a file or
+     * the compress algorithm should know the length)
+     */
+    zd = pkt->pkt.compressed = xmalloc(sizeof *pkt->pkt.compressed );
+    zd->algorithm = iobuf_get_noeof(inp);
+    zd->len = 0; /* not used */ 
+    zd->new_ctb = new_ctb;
+    zd->buf = inp;
+    if( list_mode )
+       fprintf (listfp, ":compressed packet: algo=%d\n", zd->algorithm);
+    return 0;
+}
+
+
+static int
+parse_encrypted( IOBUF inp, int pkttype, unsigned long pktlen,
+                PACKET *pkt, int new_ctb, int partial )
+{
+    int rc = 0;
+    PKT_encrypted *ed;
+    unsigned long orig_pktlen = pktlen;
+
+    ed = pkt->pkt.encrypted =  xmalloc(sizeof *pkt->pkt.encrypted );
+    ed->len = pktlen;
+    /* we don't know the extralen which is (cipher_blocksize+2)
+       because the algorithm ist not specified in this packet.
+       However, it is only important to know this for some sanity
+       checks on the packet length - it doesn't matter that we can't
+       do it */
+    ed->extralen = 0;
+    ed->buf = NULL;
+    ed->new_ctb = new_ctb;
+    ed->is_partial = partial;
+    ed->mdc_method = 0;
+    if( pkttype == PKT_ENCRYPTED_MDC ) {
+       /* fixme: add some pktlen sanity checks */
+       int version;
+
+       version = iobuf_get_noeof(inp); 
+        if (orig_pktlen)
+            pktlen--;
+       if( version != 1 ) {
+           log_error("encrypted_mdc packet with unknown version %d\n",
+                                                               version);
+            /*skip_rest(inp, pktlen); should we really do this? */
+            rc = G10ERR_INVALID_PACKET;
+           goto leave;
+       }
+       ed->mdc_method = DIGEST_ALGO_SHA1;
+    }
+    if( orig_pktlen && pktlen < 10 ) { /* actually this is blocksize+2 */
+       log_error("packet(%d) too short\n", pkttype);
+        rc = G10ERR_INVALID_PACKET;
+       iobuf_skip_rest(inp, pktlen, partial);
+       goto leave;
+    }
+    if( list_mode ) {
+       if( orig_pktlen )
+           fprintf (listfp, ":encrypted data packet:\n\tlength: %lu\n",
+                     orig_pktlen);
+       else
+           fprintf (listfp, ":encrypted data packet:\n\tlength: unknown\n");
+       if( ed->mdc_method )
+           fprintf (listfp, "\tmdc_method: %d\n", ed->mdc_method );
+    }
+
+    ed->buf = inp;
+
+  leave:
+    return rc;
+}
+
+
+static int
+parse_mdc( IOBUF inp, int pkttype, unsigned long pktlen,
+                                  PACKET *pkt, int new_ctb )
+{
+    int rc = 0;
+    PKT_mdc *mdc;
+    byte *p;
+
+    mdc = pkt->pkt.mdc=  xmalloc(sizeof *pkt->pkt.mdc );
+    if( list_mode )
+       fprintf (listfp, ":mdc packet: length=%lu\n", pktlen);
+    if( !new_ctb || pktlen != 20 ) {
+       log_error("mdc_packet with invalid encoding\n");
+        rc = G10ERR_INVALID_PACKET;
+       goto leave;
+    }
+    p = mdc->hash;
+    for( ; pktlen; pktlen--, p++ )
+       *p = iobuf_get_noeof(inp);
+
+  leave:
+    return rc;
+}
+
+
+/*
+ * This packet is internally generated by GPG (by armor.c) to
+ * transfer some information to the lower layer.  To make sure that
+ * this packet is really a GPG faked one and not one comming from outside,
+ * we first check that there is a unique tag in it.
+ * The format of such a control packet is:
+ *   n byte  session marker
+ *   1 byte  control type CTRLPKT_xxxxx
+ *   m byte  control data
+ */
+
+static int
+parse_gpg_control( IOBUF inp, int pkttype,
+                  unsigned long pktlen, PACKET *packet, int partial )
+{
+    byte *p;
+    const byte *sesmark;
+    size_t sesmarklen;
+    int i;
+
+    if ( list_mode )
+        fprintf (listfp, ":packet 63: length %lu ",  pktlen);
+
+    sesmark = get_session_marker ( &sesmarklen );
+    if ( pktlen < sesmarklen+1 ) /* 1 is for the control bytes */
+        goto skipit;
+    for( i=0; i < sesmarklen; i++, pktlen-- ) {
+       if ( sesmark[i] != iobuf_get_noeof(inp) )
+            goto skipit;
+    }
+    if (pktlen > 4096)
+      goto skipit; /* Definitely too large.  We skip it to avoid an
+                      overflow in the malloc. */
+    if ( list_mode )
+        puts ("- gpg control packet");
+
+    packet->pkt.gpg_control = xmalloc(sizeof *packet->pkt.gpg_control
+                                      + pktlen - 1);
+    packet->pkt.gpg_control->control = iobuf_get_noeof(inp); pktlen--;
+    packet->pkt.gpg_control->datalen = pktlen;
+    p = packet->pkt.gpg_control->data;
+    for( ; pktlen; pktlen--, p++ )
+       *p = iobuf_get_noeof(inp);
+
+    return 0;
+
+ skipit:
+    if ( list_mode ) {
+        int c;
+
+        i=0;
+        fprintf (listfp, "- private (rest length %lu)\n",  pktlen);
+        if( partial ) {
+            while( (c=iobuf_get(inp)) != -1 )
+                dump_hex_line(c, &i);
+        }
+        else {
+            for( ; pktlen; pktlen-- )
+                dump_hex_line(iobuf_get(inp), &i);
+        }
+        putc ('\n', listfp);
+    }
+    iobuf_skip_rest(inp,pktlen, 0);
+    return G10ERR_INVALID_PACKET;
+}
+
+/* create a gpg control packet to be used internally as a placeholder */
+PACKET *
+create_gpg_control( ctrlpkttype_t type, const byte *data, size_t datalen )
+{
+    PACKET *packet;
+    byte *p;
+
+    packet = xmalloc( sizeof *packet );
+    init_packet(packet);
+    packet->pkttype = PKT_GPG_CONTROL;
+    packet->pkt.gpg_control = xmalloc(sizeof *packet->pkt.gpg_control
+                                      + datalen - 1);
+    packet->pkt.gpg_control->control = type;
+    packet->pkt.gpg_control->datalen = datalen;
+    p = packet->pkt.gpg_control->data;
+    for( ; datalen; datalen--, p++ )
+       *p = *data++;
+
+    return packet;
+}
diff --git a/g10/passphrase.c b/g10/passphrase.c
new file mode 100644 (file)
index 0000000..4dd2f83
--- /dev/null
@@ -0,0 +1,1084 @@
+/* passphrase.c -  Get a passphrase
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <assert.h>
+#if !defined(HAVE_DOSISH_SYSTEM) && !defined(__riscos__)
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif
+#if defined (_WIN32)
+#include <windows.h>
+#endif
+#include <errno.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#ifdef HAVE_LANGINFO_CODESET
+#include <langinfo.h>
+#endif
+
+#include "util.h"
+#include "memory.h"
+#include "options.h"
+#include "ttyio.h"
+#include "cipher.h"
+#include "keydb.h"
+#include "main.h"
+#include "i18n.h"
+#include "status.h"
+#ifdef ENABLE_AGENT_SUPPORT
+#include "assuan.h"
+#endif /*ENABLE_AGENT_SUPPORT*/
+
+static char *fd_passwd = NULL;
+static char *next_pw = NULL;
+static char *last_pw = NULL;
+
+static void hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create );
+
+int
+have_static_passphrase()
+{
+    if ( opt.use_agent )
+        return 0;
+    return !!fd_passwd;
+}
+
+/****************
+ * Set the passphrase to be used for the next query and only for the next
+ * one.
+ */
+void
+set_next_passphrase( const char *s )
+{
+    xfree(next_pw);
+    next_pw = NULL;
+    if( s ) {
+       next_pw = xmalloc_secure( strlen(s)+1 );
+       strcpy(next_pw, s );
+    }
+}
+
+/****************
+ * Get the last passphrase used in passphrase_to_dek.
+ * Note: This removes the passphrase from this modules and
+ * the caller must free the result.  May return NULL:
+ */
+char *
+get_last_passphrase()
+{
+    char *p = last_pw;
+    last_pw = NULL;
+    return p;
+}
+
+/* As if we had used the passphrase - make it the last_pw. */
+void
+next_to_last_passphrase(void)
+{
+  if(next_pw)
+    {
+      last_pw=next_pw;
+      next_pw=NULL;
+    }
+}
+
+/* Here's an interesting question: since this passphrase was passed in
+   on the command line, is there really any point in using secure
+   memory for it?  I'm going with 'yes', since it doesn't hurt, and
+   might help in some small way (swapping). */
+
+void
+set_passphrase_from_string(const char *pass)
+{
+  xfree( fd_passwd );
+  fd_passwd = xmalloc_secure(strlen(pass)+1);
+  strcpy(fd_passwd,pass);
+}
+
+
+void
+read_passphrase_from_fd( int fd )
+{
+  int i, len;
+  char *pw;
+  
+  if ( opt.use_agent ) 
+    { /* Not used but we have to do a dummy read, so that it won't end
+         up at the begin of the message if the quite usual trick to
+         prepend the passphtrase to the message is used. */
+      char buf[1];
+
+      while (!(read (fd, buf, 1) != 1 || *buf == '\n' ))
+        ;
+      *buf = 0;
+      return; 
+    }
+
+  if (!opt.batch )
+       tty_printf("Reading passphrase from file descriptor %d ...", fd );
+  for (pw = NULL, i = len = 100; ; i++ ) 
+    {
+      if (i >= len-1 ) 
+        {
+          char *pw2 = pw;
+          len += 100;
+          pw = xmalloc_secure( len );
+          if( pw2 )
+            {
+              memcpy(pw, pw2, i );
+              xfree (pw2);
+            }
+          else
+            i=0;
+       }
+      if (read( fd, pw+i, 1) != 1 || pw[i] == '\n' )
+        break;
+    }
+  pw[i] = 0;
+  if (!opt.batch)
+    tty_printf("\b\b\b   \n" );
+
+  xfree( fd_passwd );
+  fd_passwd = pw;
+}
+
+
+
+#ifdef ENABLE_AGENT_SUPPORT
+/* Send one option to the gpg-agent.  */
+static int
+agent_send_option (assuan_context_t ctx, const char *name, const char *value)
+{
+  char *line;
+  int rc; 
+  
+  if (!value || !*value)
+    return 0; /* Avoid sending empty option values. */
+
+  line = xmalloc (7 + strlen (name) + 1 + strlen (value) + 1);
+  strcpy (stpcpy (stpcpy (stpcpy (line, "OPTION "), name), "="), value);
+  rc = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+  xfree (line);
+  return rc? -1 : 0;
+}
+
+/* Send all required options to the gpg-agent.  */
+static int 
+agent_send_all_options (assuan_context_t ctx)
+{
+  char *dft_display = NULL;
+  const char *dft_ttyname = NULL;
+  char *dft_ttytype = NULL;
+  char *old_lc = NULL;
+  char *dft_lc = NULL;
+  int rc = 0;
+
+  dft_display = getenv ("DISPLAY");
+  if (opt.display || dft_display)
+    {
+      if (agent_send_option (ctx, "display",
+                             opt.display ? opt.display : dft_display))
+        return -1;
+    }
+
+  if (!opt.ttyname)
+    {
+      const char *tmp;
+
+      dft_ttyname = getenv ("GPG_TTY");
+      if ((!dft_ttyname || !*dft_ttyname) && (tmp=ttyname (0)))
+        dft_ttyname = tmp;
+      if ((!dft_ttyname || !*dft_ttyname) && (tmp=tty_get_ttyname ()))
+        dft_ttyname = tmp;
+    }
+  if (opt.ttyname || dft_ttyname)
+    {
+      if (agent_send_option (ctx, "ttyname",
+                             opt.ttyname ? opt.ttyname : dft_ttyname))
+        return -1;
+    }
+
+  dft_ttytype = getenv ("TERM");
+  if (opt.ttytype || (dft_ttyname && dft_ttytype))
+    {
+      if (agent_send_option (ctx, "ttytype",
+                             opt.ttyname ? opt.ttytype : dft_ttytype))
+        return -1;
+    }
+
+#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE)
+  old_lc = setlocale (LC_CTYPE, NULL);
+  if (old_lc)
+    old_lc = xstrdup (old_lc);
+  dft_lc = setlocale (LC_CTYPE, "");
+#endif
+  if (opt.lc_ctype || (dft_ttyname && dft_lc))
+    {
+      rc = agent_send_option (ctx, "lc-ctype",
+                              opt.lc_ctype ? opt.lc_ctype : dft_lc);
+    }
+#if defined(HAVE_SETLOCALE) && defined(LC_CTYPE)
+  if (old_lc)
+    {
+      setlocale (LC_CTYPE, old_lc);
+      xfree (old_lc);
+    }
+#endif
+  if (rc)
+    return rc;
+
+#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES)
+  old_lc = setlocale (LC_MESSAGES, NULL);
+  if (old_lc)
+    old_lc = xstrdup (old_lc);
+  dft_lc = setlocale (LC_MESSAGES, "");
+#endif
+  if (opt.lc_messages || (dft_ttyname && dft_lc))
+    {
+      rc = agent_send_option (ctx, "lc-messages",
+                              opt.lc_messages ? opt.lc_messages : dft_lc);
+    }
+#if defined(HAVE_SETLOCALE) && defined(LC_MESSAGES)
+  if (old_lc)
+    {
+      setlocale (LC_MESSAGES, old_lc);
+      xfree (old_lc);
+    }
+#endif
+  return rc;
+}
+#endif /*ENABLE_AGENT_SUPPORT*/
+
+
+/*
+ * Open a connection to the agent and initializes the connection.
+ * Returns: -1 on error; on success an Assuan context for that
+ * connection is returned.  With TRY set to true, no error messages
+ * are printed and the use of the agent won't get disabled on failure.
+ * If ORIG_CODESET is not NULL, the function will swithc the codeset
+ * back to that one before printing error messages.
+ */
+#ifdef ENABLE_AGENT_SUPPORT
+assuan_context_t
+agent_open (int try, const char *orig_codeset)
+{
+  int rc;
+  assuan_context_t ctx;
+  char *infostr, *p;
+  int prot;
+  int pid;
+
+  if (opt.gpg_agent_info)
+    infostr = xstrdup (opt.gpg_agent_info);
+  else
+    {
+      infostr = getenv ( "GPG_AGENT_INFO" );
+      if (!infostr || !*infostr) 
+        {
+          if (!try)
+            {
+#ifdef ENABLE_NLS
+              if (orig_codeset)
+                bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
+              log_info (_("gpg-agent is not available in this session\n"));
+              opt.use_agent = 0;
+            }
+          return NULL;
+        }
+      infostr = xstrdup ( infostr );
+    }
+  
+  if ( !(p = strchr (infostr, PATHSEP_C)) || p == infostr)
+    {
+      if (!try)
+        {
+#ifdef ENABLE_NLS
+          if (orig_codeset)
+            bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
+          log_error ( _("malformed GPG_AGENT_INFO environment variable\n"));
+          opt.use_agent = 0;
+        }
+      xfree (infostr);
+      return NULL;
+    }
+  *p++ = 0;
+  pid = atoi (p);
+  while (*p && *p != PATHSEP_C)
+    p++;
+  prot = *p? atoi (p+1) : 0;
+  if (prot != 1)
+    {
+      if (!try)
+        {
+#ifdef ENABLE_NLS
+          if (orig_codeset)
+            bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
+          log_error (_("gpg-agent protocol version %d is not supported\n"),
+                     prot);
+          opt.use_agent = 0;
+        }
+      xfree (infostr);
+      return NULL;
+    }
+     
+  rc = assuan_socket_connect (&ctx, infostr, pid);
+  if (rc)
+    {
+      if (!try)
+        {
+#ifdef ENABLE_NLS
+          if (orig_codeset)
+            bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
+          log_info ( _("can't connect to `%s': %s\n"), 
+                      infostr, assuan_strerror (rc));
+          opt.use_agent = 0;
+        }
+      xfree (infostr );
+      return NULL;
+    }
+  xfree (infostr);
+
+  if (agent_send_all_options (ctx))
+    {
+      if (!try)
+        {
+#ifdef ENABLE_NLS
+          if (orig_codeset)
+            bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif /*ENABLE_NLS*/
+          log_error (_("problem with the agent - disabling agent use\n"));
+          opt.use_agent = 0;
+        }
+      assuan_disconnect (ctx);
+      return NULL;
+    }
+
+  return ctx;
+}
+#endif/*ENABLE_AGENT_SUPPORT*/
+
+
+#ifdef ENABLE_AGENT_SUPPORT
+void
+agent_close (assuan_context_t ctx)
+{
+  assuan_disconnect (ctx);
+}
+#endif /*ENABLE_AGENT_SUPPORT*/
+
+
+/* Copy the text ATEXT into the buffer P and do plus '+' and percent
+   escaping.  Note that the provided buffer needs to be 3 times the
+   size of ATEXT plus 1.  Returns a pointer to the leading Nul in P. */
+#ifdef ENABLE_AGENT_SUPPORT
+static char *
+percent_plus_escape (char *p, const char *atext)
+{
+  const unsigned char *s;
+
+  for (s=atext; *s; s++)
+    {
+      if (*s < ' ' || *s == '+')
+        {
+          sprintf (p, "%%%02X", *s);
+          p += 3;
+        }
+      else if (*s == ' ')
+        *p++ = '+';
+      else
+        *p++ = *s;
+    }
+  *p = 0;
+  return p;
+}
+#endif /*ENABLE_AGENT_SUPPORT*/
+
+
+#ifdef ENABLE_AGENT_SUPPORT
+
+/* Object for the agent_okay_cb function.  */
+struct agent_okay_cb_s {
+  char *pw;
+};
+
+/* A callback used to get the passphrase from the okay line.  See
+   agent-get_passphrase for details.  LINE is the rest of the OK
+   status line without leading white spaces. */
+static assuan_error_t
+agent_okay_cb (void *opaque, const char *line)
+{ 
+  struct agent_okay_cb_s *parm = opaque;
+  int i;
+
+  /* Note: If the malloc below fails we won't be able to wipe the
+     memory at LINE given the current implementation of the Assuan
+     code. There is no easy ay around this w/o adding a lot of more
+     memory function code to allow wiping arbitrary stuff on memory
+     failure. */
+  parm->pw = xmalloc_secure (strlen (line)/2+2);
+  
+  for (i=0; hexdigitp (line) && hexdigitp (line+1); line += 2)
+    parm->pw[i++] = xtoi_2 (line);
+  parm->pw[i] = 0; 
+  return 0;
+}
+#endif /*ENABLE_AGENT_SUPPORT*/
+
+
+
+/*
+ * Ask the GPG Agent for the passphrase.
+ * Mode 0:  Allow cached passphrase
+ *      1:  No cached passphrase FIXME: Not really implemented
+ *      2:  Ditto, but change the text to "repeat entry"
+ *
+ * Note that TRYAGAIN_TEXT must not be translated.  If canceled is not
+ * NULL, the function does set it to 1 if the user canceled the
+ * operation.  If CACHEID is not NULL, it will be used as the cacheID
+ * for the gpg-agent; if is NULL and a key fingerprint can be
+ * computed, this will be used as the cacheid.
+ */
+static char *
+agent_get_passphrase ( u32 *keyid, int mode, const char *cacheid,
+                       const char *tryagain_text,
+                       const char *custom_description,
+                       const char *custom_prompt, int *canceled)
+{
+#ifdef ENABLE_AGENT_SUPPORT
+  char *atext = NULL;
+  assuan_context_t ctx = NULL;
+  char *pw = NULL;
+  PKT_public_key *pk = xmalloc_clear( sizeof *pk );
+  byte fpr[MAX_FINGERPRINT_LEN];
+  int have_fpr = 0;
+  char *orig_codeset = NULL;
+
+  if (canceled)
+    *canceled = 0;
+
+#if MAX_FINGERPRINT_LEN < 20
+#error agent needs a 20 byte fingerprint
+#endif
+
+  memset (fpr, 0, MAX_FINGERPRINT_LEN );
+  if( keyid && get_pubkey( pk, keyid ) )
+    {
+      if (pk)
+        free_public_key( pk );      
+      pk = NULL; /* oops: no key for some reason */
+    }
+  
+#ifdef ENABLE_NLS
+  /* The Assuan agent protocol requires us to transmit utf-8 strings */
+  orig_codeset = bind_textdomain_codeset (PACKAGE, NULL);
+#ifdef HAVE_LANGINFO_CODESET
+  if (!orig_codeset)
+    orig_codeset = nl_langinfo (CODESET);
+#endif
+  if (orig_codeset)
+    { /* We only switch when we are able to restore the codeset later. */
+      orig_codeset = xstrdup (orig_codeset);
+      if (!bind_textdomain_codeset (PACKAGE, "utf-8"))
+        orig_codeset = NULL; 
+    }
+#endif
+
+  if ( !(ctx = agent_open (0, orig_codeset)) ) 
+    goto failure;
+
+  if (custom_description)
+    atext = native_to_utf8 (custom_description);
+  else if ( !mode && pk && keyid )
+    { 
+      char *uid;
+      size_t uidlen;
+      const char *algo_name = pubkey_algo_to_string ( pk->pubkey_algo );
+      const char *timestr;
+      char *maink;
+      
+      if ( !algo_name )
+        algo_name = "?";
+
+#define KEYIDSTRING _(" (main key ID %s)")
+
+      maink = xmalloc ( strlen (KEYIDSTRING) + keystrlen() + 20 );
+      if( keyid[2] && keyid[3] && keyid[0] != keyid[2] 
+          && keyid[1] != keyid[3] )
+        sprintf( maink, KEYIDSTRING, keystr(&keyid[2]) );
+      else
+        *maink = 0;
+      
+      uid = get_user_id ( keyid, &uidlen ); 
+      timestr = strtimestamp (pk->timestamp);
+
+#undef KEYIDSTRING
+
+#define PROMPTSTRING _("You need a passphrase to unlock the secret" \
+                      " key for user:\n" \
+                      "\"%.*s\"\n" \
+                      "%u-bit %s key, ID %s, created %s%s\n" )
+
+      atext = xmalloc ( 100 + strlen (PROMPTSTRING)  
+                        + uidlen + 15 + strlen(algo_name) + keystrlen()
+                        + strlen (timestr) + strlen (maink) );
+      sprintf (atext, PROMPTSTRING,
+               (int)uidlen, uid,
+               nbits_from_pk (pk), algo_name, keystr(&keyid[0]), timestr,
+               maink  );
+      xfree (uid);
+      xfree (maink);
+
+#undef PROMPTSTRING
+
+      { 
+        size_t dummy;
+        fingerprint_from_pk( pk, fpr, &dummy );
+        have_fpr = 1;
+      }
+      
+    }
+  else if (mode == 2 ) 
+    atext = xstrdup ( _("Repeat passphrase\n") );
+  else
+    atext = xstrdup ( _("Enter passphrase\n") );
+                
+  { 
+      char *line, *p;
+      int i, rc; 
+      struct agent_okay_cb_s okay_cb_parm;
+
+      if (!tryagain_text)
+        tryagain_text = "X";
+      else
+        tryagain_text = _(tryagain_text);
+
+      /* We allocate 23 times the needed space for thye texts so that
+         there is enough space for escaping. */
+      line = xmalloc (15 + 46 
+                      + 3*strlen (atext)
+                      + 3*strlen (custom_prompt? custom_prompt:"")
+                      + (cacheid? (3*strlen (cacheid)): 0)
+                      + 3*strlen (tryagain_text)
+                      + 1);
+      strcpy (line, "GET_PASSPHRASE ");
+      p = line+15;
+      if (!mode && cacheid)
+        {
+          p = percent_plus_escape (p, cacheid);
+        }
+      else if (!mode && have_fpr)
+        {
+          for (i=0; i < 20; i++, p +=2 )
+            sprintf (p, "%02X", fpr[i]);
+        }
+      else
+        *p++ = 'X'; /* No caching. */
+      *p++ = ' ';
+
+      p = percent_plus_escape (p, tryagain_text);
+      *p++ = ' ';
+
+      /* The prompt.  */
+      if (custom_prompt)
+        {
+          char *tmp = native_to_utf8 (custom_prompt);
+          p = percent_plus_escape (p, tmp);
+          xfree (tmp);
+        }
+      else
+        *p++ = 'X'; /* Use the standard prompt. */
+      *p++ = ' ';
+
+      /* Copy description. */
+      percent_plus_escape (p, atext);
+
+      /* Call gpg-agent.  */
+      memset (&okay_cb_parm, 0, sizeof okay_cb_parm);
+      rc = assuan_transact2 (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL,
+                             agent_okay_cb, &okay_cb_parm);
+
+      xfree (line);
+      xfree (atext); atext = NULL;
+      if (!rc)
+        {
+          assert (okay_cb_parm.pw);
+          pw = okay_cb_parm.pw;
+          agent_close (ctx);
+          if (pk)
+            free_public_key( pk );
+#ifdef ENABLE_NLS
+          if (orig_codeset)
+            bind_textdomain_codeset (PACKAGE, orig_codeset);
+#endif
+          xfree (orig_codeset);
+          return pw;
+        }
+      else if (rc && (rc & 0xffff) == 99)
+       {
+         /* 99 is GPG_ERR_CANCELED. */
+          log_info (_("cancelled by user\n") );
+          if (canceled)
+            *canceled = 1;
+        }
+      else 
+        {
+          log_error (_("problem with the agent - disabling agent use\n"));
+          opt.use_agent = 0;
+        }
+  }
+      
+        
+ failure:
+#ifdef ENABLE_NLS
+  if (orig_codeset)
+    {
+      bind_textdomain_codeset (PACKAGE, orig_codeset);
+      xfree (orig_codeset);
+    }
+#endif
+  xfree (atext);
+  agent_close (ctx);
+  xfree (pw );
+  if (pk)
+    free_public_key( pk );
+
+#endif /*ENABLE_AGENT_SUPPORT*/
+
+  return NULL;
+}
+
+
+/*
+ * Clear the cached passphrase.  If CACHEID is not NULL, it will be
+ * used instead of a cache ID derived from KEYID.
+ */
+void
+passphrase_clear_cache ( u32 *keyid, const char *cacheid, int algo )
+{
+#ifdef ENABLE_AGENT_SUPPORT
+  assuan_context_t ctx = NULL;
+  PKT_public_key *pk;
+  byte fpr[MAX_FINGERPRINT_LEN];
+  
+#if MAX_FINGERPRINT_LEN < 20
+#error agent needs a 20 byte fingerprint
+#endif
+    
+  if (!opt.use_agent)
+    return;
+  
+  if (!cacheid)
+    {
+      pk = xcalloc (1, sizeof *pk);
+      memset (fpr, 0, MAX_FINGERPRINT_LEN );
+      if( !keyid || get_pubkey( pk, keyid ) )
+        {
+          goto failure; /* oops: no key for some reason */
+        }
+  
+      {
+        size_t dummy;
+        fingerprint_from_pk( pk, fpr, &dummy );
+      }
+    }
+  else
+    pk = NULL;
+    
+  if ( !(ctx = agent_open (0, NULL)) ) 
+    goto failure;
+
+  { 
+      char *line, *p;
+      int i, rc; 
+
+      if (cacheid)
+        {
+          line = xmalloc (17 + 3*strlen (cacheid) + 2);
+          strcpy (line, "CLEAR_PASSPHRASE ");
+          p = line+17;
+          p = percent_plus_escape (p, cacheid);
+        }
+      else
+        {
+          line = xmalloc (17 + 40 + 2);
+          strcpy (line, "CLEAR_PASSPHRASE ");
+          p = line+17;
+          for (i=0; i < 20; i++, p +=2 )
+            sprintf (p, "%02X", fpr[i]);
+        }
+      *p = 0;
+
+      rc = assuan_transact (ctx, line, NULL, NULL, NULL, NULL, NULL, NULL);
+      xfree (line);
+      if (rc)
+        {
+          log_error (_("problem with the agent - disabling agent use\n"));
+          opt.use_agent = 0;
+        }
+    }
+        
+ failure:
+  agent_close (ctx);
+  if (pk)
+    free_public_key( pk );
+#endif /*ENABLE_AGENT_SUPPORT*/
+}
+
+
+/****************
+ * Ask for a passphrase and return that string.
+ */
+char *
+ask_passphrase (const char *description,
+                const char *tryagain_text,
+                const char *promptid,
+                const char *prompt,
+                const char *cacheid, int *canceled)
+{
+  char *pw = NULL;
+  
+  if (canceled)
+    *canceled = 0;
+
+  if (!opt.batch && description)
+    {
+      if (strchr (description, '%'))
+        {
+          char *tmp = unescape_percent_string (description);
+          tty_printf ("\n%s\n", tmp);
+          xfree (tmp);
+        }
+      else
+        tty_printf ("\n%s\n",description);
+    }
+               
+ agent_died:
+  if ( opt.use_agent ) 
+    {
+      pw = agent_get_passphrase (NULL, 0, cacheid,
+                                 tryagain_text, description, prompt,
+                                 canceled );
+      if (!pw)
+        {
+          if (!opt.use_agent)
+            goto agent_died;
+          pw = NULL;
+        }
+    }
+  else if (fd_passwd) 
+    {
+      pw = xmalloc_secure (strlen(fd_passwd)+1);
+      strcpy (pw, fd_passwd);
+    }
+  else if (opt.batch)
+    {
+      log_error(_("can't query passphrase in batch mode\n"));
+      pw = NULL;
+    }
+  else {
+    if (tryagain_text)
+      tty_printf(_("%s.\n"), tryagain_text);
+    pw = cpr_get_hidden(promptid? promptid : "passphrase.ask",
+                        prompt?prompt : _("Enter passphrase: ") );
+    tty_kill_prompt();
+  }
+
+  if (!pw || !*pw)
+    write_status( STATUS_MISSING_PASSPHRASE );
+
+  return pw;
+}
+
+
+/* Return a new DEK object Using the string-to-key sepcifier S2K.  Use
+ * KEYID and PUBKEY_ALGO to prompt the user.
+
+   MODE 0:  Allow cached passphrase
+        1:  Ignore cached passphrase 
+        2:  Ditto, but change the text to "repeat entry"
+*/
+DEK *
+passphrase_to_dek( u32 *keyid, int pubkey_algo,
+                  int cipher_algo, STRING2KEY *s2k, int mode,
+                   const char *tryagain_text, int *canceled)
+{
+    char *pw = NULL;
+    DEK *dek;
+    STRING2KEY help_s2k;
+
+    if (canceled)
+      *canceled = 0;
+
+    if( !s2k ) {
+        /* This is used for the old rfc1991 mode 
+         * Note: This must match the code in encode.c with opt.rfc1991 set */
+       s2k = &help_s2k;
+       s2k->mode = 0;
+       s2k->hash_algo = S2K_DIGEST_ALGO;
+    }
+
+    /* If we do not have a passphrase available in NEXT_PW and status
+       information are request, we print them now. */
+    if( !next_pw && is_status_enabled() ) {
+       char buf[50];
+       if( keyid ) {
+            u32 used_kid[2];
+            char *us;
+
+           if( keyid[2] && keyid[3] ) {
+                used_kid[0] = keyid[2];
+                used_kid[1] = keyid[3];
+            }
+            else {
+                used_kid[0] = keyid[0];
+                used_kid[1] = keyid[1];
+            }
+
+            us = get_long_user_id_string( keyid );
+            write_status_text( STATUS_USERID_HINT, us );
+            xfree(us);
+
+           sprintf( buf, "%08lX%08lX %08lX%08lX %d 0",
+                     (ulong)keyid[0], (ulong)keyid[1],
+                     (ulong)used_kid[0], (ulong)used_kid[1],
+                     pubkey_algo );
+                     
+           write_status_text( STATUS_NEED_PASSPHRASE, buf );
+       }
+       else {
+           sprintf( buf, "%d %d %d", cipher_algo, s2k->mode, s2k->hash_algo );
+           write_status_text( STATUS_NEED_PASSPHRASE_SYM, buf );
+       }
+    }
+
+    /* If we do have a keyID, we do not have a passphrase available in
+       NEXT_PW, we are not running in batch mode and we do not want to
+       ignore the passphrase cache (mode!=1), print a prompt with
+       information on that key. */
+    if( keyid && !opt.batch && !next_pw && mode!=1 ) {
+       PKT_public_key *pk = xmalloc_clear( sizeof *pk );
+       char *p;
+
+       p=get_user_id_native(keyid);
+       tty_printf("\n");
+       tty_printf(_("You need a passphrase to unlock the secret key for\n"
+                    "user: \"%s\"\n"),p);
+       xfree(p);
+
+       if( !get_pubkey( pk, keyid ) ) {
+           const char *s = pubkey_algo_to_string( pk->pubkey_algo );
+           tty_printf( _("%u-bit %s key, ID %s, created %s"),
+                      nbits_from_pk( pk ), s?s:"?", keystr(keyid),
+                      strtimestamp(pk->timestamp) );
+           if( keyid[2] && keyid[3] && keyid[0] != keyid[2]
+                                    && keyid[1] != keyid[3] )
+             {
+               if(keystrlen()>10)
+                 {
+                   tty_printf("\n");
+                   tty_printf(_("         (subkey on main key ID %s)"),
+                              keystr(&keyid[2]) );
+                 }
+               else
+                 tty_printf( _(" (main key ID %s)"), keystr(&keyid[2]) );
+             }
+           tty_printf("\n");
+       }
+
+       tty_printf("\n");
+        if (pk)
+          free_public_key( pk );
+    }
+
+ agent_died:
+    if( next_pw ) {
+        /* Simply return the passphrase we already have in NEXT_PW. */
+       pw = next_pw;
+       next_pw = NULL;
+    }
+    else if ( opt.use_agent ) {
+      /* Divert to the gpg-agent. */
+        pw = agent_get_passphrase ( keyid, mode == 2? 1: 0, NULL,
+                                    tryagain_text, NULL, NULL, canceled );
+        if (!pw)
+          {
+            if (!opt.use_agent)
+              goto agent_died;
+            pw = xstrdup ("");
+          }
+        if( *pw && mode == 2 )
+         {
+           int i;
+           for(i=0;i<opt.passwd_repeat;i++)
+             {
+               char *pw2 = agent_get_passphrase ( keyid, 2, NULL, NULL, NULL,
+                                                  NULL, canceled );
+               if (!pw2)
+                 {
+                   if (!opt.use_agent)
+                     {
+                       xfree (pw);
+                       pw = NULL;
+                       goto agent_died;
+                     }
+                   pw2 = xstrdup ("");
+                 }
+               if( strcmp(pw, pw2) )
+                 {
+                   xfree(pw2);
+                   xfree(pw);
+                   return NULL;
+                 }
+               xfree(pw2);
+             }
+         }
+    }
+    else if( fd_passwd ) {
+        /* Return the passphrase we have store in FD_PASSWD. */
+       pw = xmalloc_secure( strlen(fd_passwd)+1 );
+       strcpy( pw, fd_passwd );
+    }
+    else if( opt.batch )
+      {
+       log_error(_("can't query passphrase in batch mode\n"));
+       pw = xstrdup( "" ); /* return an empty passphrase */
+      }
+    else {
+        /* Read the passphrase from the tty or the command-fd. */
+       pw = cpr_get_hidden("passphrase.enter", _("Enter passphrase: ") );
+       tty_kill_prompt();
+       if( mode == 2 && !cpr_enabled() )
+         {
+           int i;
+           for(i=0;i<opt.passwd_repeat;i++)
+             {
+               char *pw2 = cpr_get_hidden("passphrase.repeat",
+                                          _("Repeat passphrase: ") );
+               tty_kill_prompt();
+               if( strcmp(pw, pw2) )
+                 {
+                   xfree(pw2);
+                   xfree(pw);
+                   return NULL;
+                 }
+               xfree(pw2);
+             }
+         }
+    }
+
+    if( !pw || !*pw )
+       write_status( STATUS_MISSING_PASSPHRASE );
+
+    /* Hash the passphrase and store it in a newly allocated DEK
+       object.  Keep a copy of the passphrase in LAST_PW for use by
+       get_last_passphrase(). */
+    dek = xmalloc_secure_clear ( sizeof *dek );
+    dek->algo = cipher_algo;
+    if( !*pw && mode == 2 )
+       dek->keylen = 0;
+    else
+       hash_passphrase( dek, pw, s2k, mode==2 );
+    xfree(last_pw);
+    last_pw = pw;
+    return dek;
+}
+
+
+/****************
+ * Hash a passphrase using the supplied s2k. If create is true, create
+ * a new salt or what else must be filled into the s2k for a new key.
+ * always needs: dek->algo, s2k->mode, s2k->hash_algo.
+ */
+static void
+hash_passphrase( DEK *dek, char *pw, STRING2KEY *s2k, int create )
+{
+    MD_HANDLE md;
+    int pass, i;
+    int used = 0;
+    int pwlen = strlen(pw);
+
+    assert( s2k->hash_algo );
+    dek->keylen = cipher_get_keylen( dek->algo ) / 8;
+    if( !(dek->keylen > 0 && dek->keylen <= DIM(dek->key)) )
+       BUG();
+
+    md = md_open( s2k->hash_algo, 1);
+    for(pass=0; used < dek->keylen ; pass++ ) {
+       if( pass ) {
+            md_reset(md);
+           for(i=0; i < pass; i++ ) /* preset the hash context */
+               md_putc(md, 0 );
+       }
+
+       if( s2k->mode == 1 || s2k->mode == 3 ) {
+           int len2 = pwlen + 8;
+           ulong count = len2;
+
+           if( create && !pass ) {
+               randomize_buffer(s2k->salt, 8, 1);
+               if( s2k->mode == 3 )
+                   s2k->count = opt.s2k_count;
+           }
+
+           if( s2k->mode == 3 ) {
+               count = S2K_DECODE_COUNT(s2k->count);
+               if( count < len2 )
+                   count = len2;
+           }
+           /* a little bit complicated because we need a ulong for count */
+           while( count > len2 ) { /* maybe iterated+salted */
+               md_write( md, s2k->salt, 8 );
+               md_write( md, pw, pwlen );
+               count -= len2;
+           }
+           if( count < 8 )
+               md_write( md, s2k->salt, count );
+           else {
+               md_write( md, s2k->salt, 8 );
+               count -= 8;
+                md_write( md, pw, count );
+           }
+       }
+       else
+           md_write( md, pw, pwlen );
+       md_final( md );
+       i = md_digest_length( s2k->hash_algo );
+       if( i > dek->keylen - used )
+           i = dek->keylen - used;
+       memcpy( dek->key+used, md_read(md, s2k->hash_algo), i );
+       used += i;
+    }
+    md_close(md);
+}
+
diff --git a/g10/photoid.c b/g10/photoid.c
new file mode 100644 (file)
index 0000000..3676d38
--- /dev/null
@@ -0,0 +1,385 @@
+/* photoid.c - photo ID handling code
+ * Copyright (C) 2001, 2002, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef _WIN32 
+# include <windows.h>
+# ifndef VER_PLATFORM_WIN32_WINDOWS
+#  define VER_PLATFORM_WIN32_WINDOWS 1
+# endif
+#endif
+#include "packet.h"
+#include "status.h"
+#include "exec.h"
+#include "keydb.h"
+#include "util.h"
+#include "i18n.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "options.h"
+#include "main.h"
+#include "photoid.h"
+#include "ttyio.h"
+
+/* Generate a new photo id packet, or return NULL if canceled */
+PKT_user_id *
+generate_photo_id(PKT_public_key *pk,const char *photo_name)
+{
+  PKT_user_id *uid;
+  int error=1,i;
+  unsigned int len;
+  char *filename;
+  byte *photo=NULL;
+  byte header[16];
+  IOBUF file;
+  int overflow;
+
+  header[0]=0x10; /* little side of photo header length */
+  header[1]=0;    /* big side of photo header length */
+  header[2]=1;    /* 1 == version of photo header */
+  header[3]=1;    /* 1 == JPEG */
+
+  for(i=4;i<16;i++) /* The reserved bytes */
+    header[i]=0;
+
+#define EXTRA_UID_NAME_SPACE 71
+  uid=xmalloc_clear(sizeof(*uid)+71);
+
+  if(photo_name && *photo_name)
+    filename=make_filename(photo_name,(void *)NULL);
+  else
+    {
+      tty_printf(_("\nPick an image to use for your photo ID."
+                  "  The image must be a JPEG file.\n"
+                  "Remember that the image is stored within your public key."
+                  "  If you use a\n"
+                  "very large picture, your key will become very large"
+                  " as well!\n"
+                  "Keeping the image close to 240x288 is a good size"
+                  " to use.\n"));
+      filename=NULL;
+    }
+
+  while(photo==NULL)
+    {
+      if(filename==NULL)
+       {
+         char *tempname;
+
+         tty_printf("\n");
+
+         tty_enable_completion(NULL);
+
+         tempname=cpr_get("photoid.jpeg.add",
+                          _("Enter JPEG filename for photo ID: "));
+
+         tty_disable_completion();
+
+         filename=make_filename(tempname,(void *)NULL);
+
+         xfree(tempname);
+
+         if(strlen(filename)==0)
+           goto scram;
+       }
+
+      file=iobuf_open(filename);
+      if (file && is_secured_file (iobuf_get_fd (file)))
+        {
+          iobuf_close (file);
+          file = NULL;
+          errno = EPERM;
+        }
+      if(!file)
+       {
+         log_error(_("unable to open JPEG file `%s': %s\n"),
+                   filename,strerror(errno));
+         xfree(filename);
+         filename=NULL;
+         continue;
+       }
+
+      
+      len=iobuf_get_filelength(file, &overflow);
+      if(len>6144 || overflow)
+       {
+         tty_printf( _("This JPEG is really large (%d bytes) !\n"),len);
+         if(!cpr_get_answer_is_yes("photoid.jpeg.size",
+                           _("Are you sure you want to use it? (y/N) ")))
+         {
+           iobuf_close(file);
+           xfree(filename);
+           filename=NULL;
+           continue;
+         }
+       }
+
+      photo=xmalloc(len);
+      iobuf_read(file,photo,len);
+      iobuf_close(file);
+
+      /* Is it a JPEG? */
+      if(photo[0]!=0xFF || photo[1]!=0xD8 ||
+        photo[6]!='J' || photo[7]!='F' || photo[8]!='I' || photo[9]!='F')
+       {
+         log_error(_("`%s' is not a JPEG file\n"),filename);
+         xfree(photo);
+         photo=NULL;
+         xfree(filename);
+         filename=NULL;
+         continue;
+       }
+
+      /* Build the packet */
+      build_attribute_subpkt(uid,1,photo,len,header,16);
+      parse_attribute_subpkts(uid);
+      make_attribute_uidname(uid, EXTRA_UID_NAME_SPACE);
+
+      /* Showing the photo is not safe when noninteractive since the
+         "user" may not be able to dismiss a viewer window! */
+      if(opt.command_fd==-1)
+       {
+         show_photos(uid->attribs,uid->numattribs,pk,NULL);
+         switch(cpr_get_answer_yes_no_quit("photoid.jpeg.okay",
+                                        _("Is this photo correct (y/N/q)? ")))
+           {
+           case -1:
+             goto scram;
+           case 0:
+             free_attributes(uid);
+             xfree(photo);
+             photo=NULL;
+             xfree(filename);
+             filename=NULL;
+             continue;
+           }
+       }
+    }
+
+  error=0;
+  uid->ref=1;
+
+ scram:
+  xfree(filename);
+  xfree(photo);
+
+  if(error)
+    {
+      free_attributes(uid);
+      xfree(uid);
+      return NULL;
+    }
+
+  return uid;
+}
+
+/* Returns 0 for error, 1 for valid */
+int parse_image_header(const struct user_attribute *attr,byte *type,u32 *len)
+{
+  u16 headerlen;
+
+  if(attr->len<3)
+    return 0;
+
+  /* For historical reasons (i.e. "oops!"), the header length is
+     little endian. */
+  headerlen=(attr->data[1]<<8) | attr->data[0];
+
+  if(headerlen>attr->len)
+    return 0;
+
+  if(type && attr->len>=4)
+    {
+      if(attr->data[2]==1) /* header version 1 */
+       *type=attr->data[3];
+      else
+       *type=0;
+    }
+
+  *len=attr->len-headerlen;
+
+  if(*len==0)
+    return 0;
+
+  return 1;
+}
+
+/* style==0 for extension, 1 for name, 2 for MIME type.  Remember that
+   the "name" style string could be used in a user ID name field, so
+   make sure it is not too big (see parse-packet.c:parse_attribute).
+   Extensions should be 3 characters long for the best cross-platform
+   compatibility. */
+char *image_type_to_string(byte type,int style)
+{
+  char *string;
+
+  switch(type)
+    {
+    case 1: /* jpeg */
+      if(style==0)
+       string="jpg";
+      else if(style==1)
+       string="jpeg";
+      else
+       string="image/jpeg";
+      break;
+
+    default:
+      if(style==0)
+       string="bin";
+      else if(style==1)
+       string="unknown";
+      else
+       string="image/x-unknown";
+      break;
+    }
+
+  return string;
+}
+
+#if !defined(FIXED_PHOTO_VIEWER) && !defined(DISABLE_PHOTO_VIEWER)
+static const char *
+get_default_photo_command(void)
+{
+#if defined(_WIN32)
+  OSVERSIONINFO osvi;
+
+  memset(&osvi,0,sizeof(osvi));
+  osvi.dwOSVersionInfoSize=sizeof(osvi);
+  GetVersionEx(&osvi);
+
+  if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
+    return "start /w %i";
+  else
+    return "cmd /c start /w %i";
+#elif defined(__APPLE__)
+  /* OS X.  This really needs more than just __APPLE__. */
+  return "open %I";
+#elif defined(__riscos__)
+  return "Filer_Run %I";
+#else
+  if(path_access("xloadimage",X_OK)==0)
+    return "xloadimage -fork -quiet -title 'KeyID 0x%k' stdin";
+  else if(path_access("eog",X_OK)==0)
+    return "eog %i";
+  else if(path_access("display",X_OK)==0)
+    return "display -title 'KeyID 0x%k' %i";
+  else
+    return "";
+#endif
+}
+#endif
+
+void show_photos(const struct user_attribute *attrs,
+                int count,PKT_public_key *pk,PKT_secret_key *sk)
+{
+#ifndef DISABLE_PHOTO_VIEWER
+  int i;
+  struct expando_args args;
+  u32 len;
+  u32 kid[2]={0,0};
+
+  memset(&args,0,sizeof(args));
+  args.pk=pk;
+  args.sk=sk;
+
+  if(pk)
+    keyid_from_pk(pk,kid);
+  else if(sk)
+    keyid_from_sk(sk,kid);
+
+  for(i=0;i<count;i++)
+    if(attrs[i].type==ATTRIB_IMAGE &&
+       parse_image_header(&attrs[i],&args.imagetype,&len))
+      {
+       char *command,*name;
+       struct exec_info *spawn;
+       int offset=attrs[i].len-len;
+
+#ifdef FIXED_PHOTO_VIEWER
+       opt.photo_viewer=FIXED_PHOTO_VIEWER;
+#else
+       if(!opt.photo_viewer)
+         opt.photo_viewer=get_default_photo_command();
+#endif
+
+       if(!*opt.photo_viewer)
+         {
+           log_info(_("no photo viewer set\n"));
+           goto fail;
+         }
+
+       /* make command grow */
+       command=pct_expando(opt.photo_viewer,&args);
+       if(!command)
+         goto fail;
+
+       name=xmalloc(16+strlen(EXTSEP_S)+
+                    strlen(image_type_to_string(args.imagetype,0))+1);
+
+       /* Make the filename.  Notice we are not using the image
+           encoding type for more than cosmetics.  Most external image
+           viewers can handle a multitude of types, and even if one
+           cannot understand a particular type, we have no way to know
+           which.  The spec permits this, by the way. -dms */
+
+#ifdef USE_ONLY_8DOT3
+       sprintf(name,"%08lX" EXTSEP_S "%s",(ulong)kid[1],
+               image_type_to_string(args.imagetype,0));
+#else
+       sprintf(name,"%08lX%08lX" EXTSEP_S "%s",(ulong)kid[0],(ulong)kid[1],
+               image_type_to_string(args.imagetype,0));
+#endif
+
+       if(exec_write(&spawn,NULL,command,name,1,1)!=0)
+         {
+           xfree(name);
+           goto fail;
+         }
+
+#ifdef __riscos__
+        riscos_set_filetype_by_mimetype(spawn->tempfile_in,
+                                        image_type_to_string(args.imagetype,2));
+#endif
+
+       xfree(name);
+
+       fwrite(&attrs[i].data[offset],attrs[i].len-offset,1,spawn->tochild);
+
+       if(exec_read(spawn)!=0)
+         {
+           exec_finish(spawn);
+           goto fail;
+         }
+
+       if(exec_finish(spawn)!=0)
+         goto fail;
+      }
+
+  return;
+
+ fail:
+  log_error(_("unable to display photo ID!\n"));
+#endif
+}
diff --git a/g10/photoid.h b/g10/photoid.h
new file mode 100644 (file)
index 0000000..d13669c
--- /dev/null
@@ -0,0 +1,35 @@
+/* photoid.h
+ * Copyright (C) 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* Photo ID functions */
+
+#ifndef _PHOTOID_H_
+#define _PHOTOID_H_
+
+#include "packet.h"
+
+PKT_user_id *generate_photo_id(PKT_public_key *pk,const char *filename);
+int parse_image_header(const struct user_attribute *attr,byte *type,u32 *len);
+char *image_type_to_string(byte type,int style);
+void show_photos(const struct user_attribute *attrs,
+                int count,PKT_public_key *pk,PKT_secret_key *sk);
+
+#endif /* !_PHOTOID_H_ */
diff --git a/g10/pipemode.c b/g10/pipemode.c
new file mode 100644 (file)
index 0000000..750aa3b
--- /dev/null
@@ -0,0 +1,318 @@
+/* pipemode.c - pipemode handler
+ * Copyright (C) 1998, 1990, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "status.h"
+#include "filter.h"
+
+
+#define CONTROL_PACKET_SPACE 30 
+#define FAKED_LITERAL_PACKET_SPACE (9+2+2)
+
+
+enum pipemode_state_e {
+    STX_init = 0,
+    STX_wait_operation,
+    STX_begin,
+    STX_text,
+    STX_detached_signature,
+    STX_detached_signature_wait_text,
+    STX_signed_data,
+    STX_wait_init
+};
+
+struct pipemode_context_s {
+    enum pipemode_state_e state;
+    int operation;
+    int stop;
+    int block_mode;
+    UnarmorPump unarmor_ctx;
+};
+
+
+static size_t
+make_control ( byte *buf, int code, int operation )
+{
+    const byte *sesmark;
+    size_t sesmarklen, n=0;;
+
+    sesmark = get_session_marker( &sesmarklen );
+    if ( sesmarklen > 20 )
+        BUG();
+
+    buf[n++] = 0xff; /* new format, type 63, 1 length byte */
+    n++;   /* length will fixed below */
+    memcpy(buf+n, sesmark, sesmarklen ); n+= sesmarklen;
+    buf[n++] = CTRLPKT_PIPEMODE;    
+    buf[n++] = code;
+    buf[n++] = operation;
+    buf[1] = n-2;
+    return n;
+}
+
+
+
+static int
+pipemode_filter( void *opaque, int control,
+                IOBUF a, byte *buf, size_t *ret_len)
+{ 
+    size_t size = *ret_len;
+    struct pipemode_context_s *stx = opaque;
+    int rc=0;
+    size_t n = 0;
+    int esc = 0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+        *ret_len = 0;
+        /* reserve some space for one control packet */
+        if ( size <= CONTROL_PACKET_SPACE+FAKED_LITERAL_PACKET_SPACE )
+            BUG();
+        size -= CONTROL_PACKET_SPACE+FAKED_LITERAL_PACKET_SPACE;
+
+        if ( stx->block_mode ) {
+            /* reserve 2 bytes for the block length */
+            buf[n++] = 0;
+            buf[n++] = 0;
+        }
+            
+
+        while ( n < size ) {
+            /* FIXME: we have to make sure that we have a large enough
+             * buffer for a control packet even after we already read 
+             * something. The easest way to do this is probably by ungetting
+             * the control sequence and returning the buffer we have
+             * already assembled */
+            int c = iobuf_get (a);
+            if (c == -1) {
+                if ( stx->state != STX_init ) {
+                    log_error ("EOF encountered at wrong state\n");
+                    stx->stop = 1;
+                    return -1;
+                }
+                break;
+            }
+            if ( esc ) {
+                switch (c) {
+                  case '@':  
+                    if ( stx->state == STX_text ) {
+                        buf[n++] = c;
+                        break;
+                    }
+                    else if ( stx->state == STX_detached_signature ) {
+                        esc = 0;
+                        goto do_unarmor; /* not a very elegant solution */
+                    }
+                    else if ( stx->state == STX_detached_signature_wait_text) {
+                        esc = 0;
+                        break; /* just ignore it in this state */
+                    }
+                    log_error ("@@ not allowed in current state\n");
+                    return -1;
+                  case '<': /* begin of stream part */
+                    if ( stx->state != STX_init ) {
+                        log_error ("nested begin of stream\n");
+                        stx->stop = 1;
+                        return -1;
+                    }
+                    stx->state = STX_wait_operation;
+                    stx->block_mode = 0;
+                    unarmor_pump_release (stx->unarmor_ctx);
+                    stx->unarmor_ctx = NULL;
+                    break;
+                   case '>': /* end of stream part */
+                     if ( stx->state != STX_wait_init ) {
+                        log_error ("invalid state for @>\n");
+                        stx->stop = 1;
+                        return -1;
+                    }
+                    stx->state = STX_init;
+                    break;
+                  case 'V': /* operation = verify */
+                  case 'E': /* operation = encrypt */
+                  case 'S': /* operation = sign */
+                  case 'B': /* operation = detach sign */
+                  case 'C': /* operation = clearsign */
+                  case 'D': /* operation = decrypt */
+                    if ( stx->state != STX_wait_operation ) {
+                        log_error ("invalid state for operation code\n");
+                        stx->stop = 1;
+                        return -1;
+                    }
+                    stx->operation = c;
+                    if ( stx->operation == 'B') {
+                        stx->state = STX_detached_signature;
+                        if ( !opt.no_armor )
+                            stx->unarmor_ctx = unarmor_pump_new ();
+                    }
+                    else
+                        stx->state = STX_begin;
+                    n += make_control ( buf+n, 1, stx->operation );
+                    /* must leave after a control packet */
+                    goto leave;
+
+                  case 't': /* plaintext text follows */
+                    if ( stx->state == STX_detached_signature_wait_text ) 
+                        stx->state = STX_detached_signature;
+                    if ( stx->state == STX_detached_signature ) {
+                        if ( stx->operation != 'B' ) {
+                            log_error ("invalid operation for this state\n");
+                            stx->stop = 1;
+                            return -1;
+                        }
+                        stx->state = STX_signed_data;
+                        n += make_control ( buf+n, 2, 'B' );
+                        /* and now we fake a literal data packet much the same
+                         * as in armor.c */
+                        buf[n++] = 0xaf; /* old packet format, type 11,
+                                            var length */
+                        buf[n++] = 0;   /* set the length header */
+                        buf[n++] = 6;
+                        buf[n++] = 'b';  /* we ignore it anyway */
+                        buf[n++] = 0;   /* namelength */
+                        memset(buf+n, 0, 4); /* timestamp */
+                        n += 4;
+                        /* and return now so that we are sure to have
+                         * more space in the bufer for the next control
+                         * packet */
+                        stx->block_mode = 1;
+                        goto leave2;
+                    }
+                    else {
+                        log_error ("invalid state for @t\n");
+                        stx->stop = 1;
+                        return -1;
+                    }
+                    break;
+
+                  case '.': /* ready */
+                    if ( stx->state == STX_signed_data ) { 
+                        if (stx->block_mode) {
+                            buf[0] = (n-2) >> 8;
+                            buf[1] = (n-2);
+                            if ( buf[0] || buf[1] ) {
+                                /* end of blocks marker */
+                                buf[n++] = 0;
+                                buf[n++] = 0;
+                            }
+                            stx->block_mode = 0;
+                        }
+                        n += make_control ( buf+n, 3, 'B' );
+                    }
+                    else {
+                        log_error ("invalid state for @.\n");
+                        stx->stop = 1;
+                        return -1;
+                    }
+                    stx->state = STX_wait_init;
+                    goto leave;
+
+                 default:      
+                    log_error ("invalid escape sequence 0x%02x in stream\n",
+                               c);
+                    stx->stop = 1;
+                    return -1;
+                }
+                esc = 0;
+            }
+            else if (c == '@') 
+                esc = 1;
+            else if (stx->unarmor_ctx) {
+          do_unarmor: /* used to handle a @@ */
+                c = unarmor_pump (stx->unarmor_ctx, c);
+                if ( !(c & ~255) )
+                    buf[n++] = c;
+                else if ( c < 0 ) {
+                    /* end of armor or error - we don't care becuase
+                      the armor can be modified anyway.  The unarmored
+                      stuff should stand for itself. */ 
+                    unarmor_pump_release (stx->unarmor_ctx);
+                    stx->unarmor_ctx = NULL;
+                    stx->state = STX_detached_signature_wait_text;
+                }
+            }
+            else if (stx->state == STX_detached_signature_wait_text)
+                ; /* just wait */
+            else
+                buf[n++] = c; 
+        }
+
+      leave:      
+        if ( !n ) {
+            stx->stop = 1;
+            rc = -1; /* eof */
+        }
+        if ( stx->block_mode ) {
+            /* fixup the block length */
+            buf[0] = (n-2) >> 8;
+            buf[1] = (n-2);
+        }
+      leave2:
+        /*log_hexdump ("pipemode:", buf, n );*/
+       *ret_len = n;
+    }
+    else if( control == IOBUFCTRL_DESC )
+       *(char**)buf = "pipemode_filter";
+    return rc;
+}
+
+
+
+void
+run_in_pipemode(void)
+{
+    IOBUF fp;
+    armor_filter_context_t afx;
+    struct pipemode_context_s stx;
+    int rc;
+
+    memset( &afx, 0, sizeof afx);
+    memset( &stx, 0, sizeof stx);
+
+    fp = iobuf_open("-");
+    iobuf_push_filter (fp, pipemode_filter, &stx );
+
+    do {
+        write_status (STATUS_BEGIN_STREAM);
+        rc = proc_packets( NULL, fp );
+        write_status (STATUS_END_STREAM);
+    } while ( !stx.stop );
+  
+}
+
+
+
+
+
+
diff --git a/g10/pkclist.c b/g10/pkclist.c
new file mode 100644 (file)
index 0000000..4c0ffd7
--- /dev/null
@@ -0,0 +1,1448 @@
+/* pkclist.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "trustdb.h"
+#include "ttyio.h"
+#include "status.h"
+#include "photoid.h"
+#include "i18n.h"
+
+#define CONTROL_D ('D' - 'A' + 1)
+
+/****************
+ * Show the revocation reason as it is stored with the given signature
+ */
+static void
+do_show_revocation_reason( PKT_signature *sig )
+{
+    size_t n, nn;
+    const byte *p, *pp;
+    int seq = 0;
+    const char *text;
+
+    while( (p = enum_sig_subpkt (sig->hashed, SIGSUBPKT_REVOC_REASON,
+                                &n, &seq, NULL )) ) {
+       if( !n )
+           continue; /* invalid - just skip it */
+
+       if( *p == 0 )
+           text = _("No reason specified");
+       else if( *p == 0x01 )
+           text = _("Key is superseded");
+       else if( *p == 0x02 )
+           text = _("Key has been compromised");
+       else if( *p == 0x03 )
+           text = _("Key is no longer used");
+       else if( *p == 0x20 )
+           text = _("User ID is no longer valid");
+       else
+           text = NULL;
+
+       log_info( _("reason for revocation: ") );
+       if( text )
+           fputs( text, log_stream() );
+       else
+           fprintf( log_stream(), "code=%02x", *p );
+       putc( '\n', log_stream() );
+       n--; p++;
+       pp = NULL;
+       do {
+           /* We don't want any empty lines, so skip them */
+           while( n && *p == '\n' ) {
+               p++;
+               n--;
+           }
+           if( n ) {
+               pp = memchr( p, '\n', n );
+               nn = pp? pp - p : n;
+               log_info( _("revocation comment: ") );
+               print_string( log_stream(), p, nn, 0 );
+               putc( '\n', log_stream() );
+               p += nn; n -= nn;
+           }
+       } while( pp );
+    }
+}
+
+/* Mode 0: try and find the revocation based on the pk (i.e. check
+   subkeys, etc.)  Mode 1: use only the revocation on the main pk */
+
+void
+show_revocation_reason( PKT_public_key *pk, int mode )
+{
+    /* Hmmm, this is not so easy becuase we have to duplicate the code
+     * used in the trustbd to calculate the keyflags.  We need to find
+     * a clean way to check revocation certificates on keys and
+     * signatures.  And there should be no duplicate code.  Because we
+     * enter this function only when the trustdb told us that we have
+     * a revoked key, we could simply look for a revocation cert and
+     * display this one, when there is only one. Let's try to do this
+     * until we have a better solution.  */
+    KBNODE node, keyblock = NULL;
+    byte fingerprint[MAX_FINGERPRINT_LEN];
+    size_t fingerlen;
+    int rc;
+
+    /* get the keyblock */
+    fingerprint_from_pk( pk, fingerprint, &fingerlen );
+    rc = get_keyblock_byfprint( &keyblock, fingerprint, fingerlen );
+    if( rc ) { /* that should never happen */
+       log_debug( "failed to get the keyblock\n");
+       return;
+    }
+
+    for( node=keyblock; node; node = node->next ) {
+        if( (mode && node->pkt->pkttype == PKT_PUBLIC_KEY) ||
+         ( ( node->pkt->pkttype == PKT_PUBLIC_KEY
+             || node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+           && !cmp_public_keys( node->pkt->pkt.public_key, pk ) ) )
+           break;
+    }
+    if( !node ) {
+       log_debug("Oops, PK not in keyblock\n");
+       release_kbnode( keyblock );
+       return;
+    }
+    /* now find the revocation certificate */
+    for( node = node->next; node ; node = node->next ) {
+       if( node->pkt->pkttype == PKT_PUBLIC_SUBKEY )
+           break;
+       if( node->pkt->pkttype == PKT_SIGNATURE
+           && (node->pkt->pkt.signature->sig_class == 0x20
+               || node->pkt->pkt.signature->sig_class == 0x28 ) ) {
+               /* FIXME: we should check the signature here */
+               do_show_revocation_reason ( node->pkt->pkt.signature );
+               break;
+       }
+    }
+
+    /* We didn't find it, so check if the whole key is revoked */
+    if(!node && !mode)
+      show_revocation_reason(pk,1);
+
+    release_kbnode( keyblock );
+}
+
+
+/****************
+ * mode: 0 = standard
+ *       1 = Without key info and additional menu option 'm'
+ *           this does also add an option to set the key to ultimately trusted.
+ * Returns: 
+ *      -2 = nothing changed - caller should show some additional info
+ *      -1 = quit operation
+ *       0 = nothing changed
+ *       1 = new ownertrust now in new_trust
+ */
+static int
+do_edit_ownertrust (PKT_public_key *pk, int mode,
+                    unsigned *new_trust, int defer_help )
+{
+  char *p;
+  u32 keyid[2];
+  int changed=0;
+  int quit=0;
+  int show=0;
+  int min_num;
+  int did_help=defer_help;
+  unsigned int minimum=get_min_ownertrust(pk);
+
+  switch(minimum)
+    {
+    default:
+    case TRUST_UNDEFINED: min_num=1; break;
+    case TRUST_NEVER:     min_num=2; break;
+    case TRUST_MARGINAL:  min_num=3; break;
+    case TRUST_FULLY:     min_num=4; break;
+    }
+
+  keyid_from_pk (pk, keyid);
+  for(;;) {
+    /* A string with valid answers.
+
+       Note to translators: These are the allowed answers in lower and
+       uppercase.  Below you will find the matching strings which
+       should be translated accordingly and the letter changed to
+       match the one in the answer string.
+    
+         i = please show me more information
+         m = back to the main menu
+         s = skip this key
+        q = quit
+    */
+    const char *ans = _("iImMqQsS");
+
+    if( !did_help ) 
+      {
+        if( !mode ) 
+          {
+            KBNODE keyblock, un;
+
+            tty_printf(_("No trust value assigned to:\n"));
+           tty_printf("%4u%c/%s %s\n",nbits_from_pk( pk ),
+                      pubkey_letter( pk->pubkey_algo ),
+                       keystr(keyid), datestr_from_pk( pk ) );
+           p=get_user_id_native(keyid);
+           tty_printf(_("      \"%s\"\n"),p);
+           xfree(p);
+
+            keyblock = get_pubkeyblock (keyid);
+            if (!keyblock)
+                BUG ();
+            for (un=keyblock; un; un = un->next)
+             {
+                if (un->pkt->pkttype != PKT_USER_ID )
+                 continue;
+                if (un->pkt->pkt.user_id->is_revoked )
+                 continue;
+                if (un->pkt->pkt.user_id->is_expired )
+                 continue;
+               /* Only skip textual primaries */
+                if (un->pkt->pkt.user_id->is_primary
+                   && !un->pkt->pkt.user_id->attrib_data )
+                 continue;
+                
+               if((opt.verify_options&VERIFY_SHOW_PHOTOS)
+                  && un->pkt->pkt.user_id->attrib_data)
+                 show_photos(un->pkt->pkt.user_id->attribs,
+                             un->pkt->pkt.user_id->numattribs,pk,NULL);
+
+               p=utf8_to_native(un->pkt->pkt.user_id->name,
+                                un->pkt->pkt.user_id->len,0);
+
+               tty_printf(_("  aka \"%s\"\n"),p);
+             }
+        
+            print_fingerprint (pk, NULL, 2);
+            tty_printf("\n");
+           release_kbnode (keyblock);
+          }
+
+       if(opt.trust_model==TM_DIRECT)
+         {
+           tty_printf(_("How much do you trust that this key actually "
+                        "belongs to the named user?\n"));
+           tty_printf("\n");
+         }
+       else
+         {
+           /* This string also used in keyedit.c:trustsig_prompt */
+           tty_printf(_("Please decide how far you trust this user to"
+                        " correctly verify other users' keys\n"
+                        "(by looking at passports, checking fingerprints from"
+                        " different sources, etc.)\n"));
+           tty_printf("\n");
+         }
+
+       if(min_num<=1)
+         tty_printf (_("  %d = I don't know or won't say\n"), 1);
+       if(min_num<=2)
+         tty_printf (_("  %d = I do NOT trust\n"), 2);
+       if(min_num<=3)
+         tty_printf (_("  %d = I trust marginally\n"), 3);
+       if(min_num<=4)
+         tty_printf (_("  %d = I trust fully\n"), 4);
+        if (mode)
+          tty_printf (_("  %d = I trust ultimately\n"), 5);
+#if 0
+       /* not yet implemented */
+        tty_printf ("  i = please show me more information\n");
+#endif
+        if( mode )
+          tty_printf(_("  m = back to the main menu\n"));
+        else
+         {
+           tty_printf(_("  s = skip this key\n"));
+           tty_printf(_("  q = quit\n"));
+         }
+        tty_printf("\n");
+       if(minimum)
+         tty_printf(_("The minimum trust level for this key is: %s\n\n"),
+                    trust_value_to_string(minimum));
+        did_help = 1;
+      }
+    if( strlen(ans) != 8 )
+      BUG();
+    p = cpr_get("edit_ownertrust.value",_("Your decision? "));
+    trim_spaces(p);
+    cpr_kill_prompt();
+    if( !*p )
+      did_help = 0;
+    else if( *p && p[1] )
+      ;
+    else if( !p[1] && ((*p >= '0'+min_num) && *p <= (mode?'5':'4')) ) 
+      {
+        unsigned int trust;
+        switch( *p )
+          {
+          case '1': trust = TRUST_UNDEFINED; break;
+          case '2': trust = TRUST_NEVER    ; break;
+          case '3': trust = TRUST_MARGINAL ; break;
+          case '4': trust = TRUST_FULLY    ; break;
+          case '5': trust = TRUST_ULTIMATE ; break;
+          default: BUG();
+          }
+        if (trust == TRUST_ULTIMATE
+            && !cpr_get_answer_is_yes ("edit_ownertrust.set_ultimate.okay",
+                                       _("Do you really want to set this key"
+                                         " to ultimate trust? (y/N) ")))
+          ; /* no */
+        else
+          {
+            *new_trust = trust;
+            changed = 1;
+            break;
+          }
+      }
+#if 0
+    /* not yet implemented */
+    else if( *p == ans[0] || *p == ans[1] ) 
+      {
+        tty_printf(_("Certificates leading to an ultimately trusted key:\n"));
+        show = 1;
+        break;
+      }
+#endif
+    else if( mode && (*p == ans[2] || *p == ans[3] || *p == CONTROL_D ) ) 
+      {
+        break ; /* back to the menu */
+      }
+    else if( !mode && (*p == ans[6] || *p == ans[7] ) )
+      {
+       break; /* skip */
+      }
+    else if( !mode && (*p == ans[4] || *p == ans[5] ) )
+      {
+        quit = 1;
+        break ; /* back to the menu */
+      }
+    xfree(p); p = NULL;
+  }
+  xfree(p);
+  return show? -2: quit? -1 : changed;
+}
+
+/* 
+ * Display a menu to change the ownertrust of the key PK (which should
+ * be a primary key).  
+ * For mode values see do_edit_ownertrust ()
+ */
+int
+edit_ownertrust (PKT_public_key *pk, int mode )
+{
+  unsigned int trust = 0;  /* Needs to be initialized to avoid gcc warning. */
+  int no_help = 0;
+
+  for(;;)
+    {
+      switch ( do_edit_ownertrust (pk, mode, &trust, no_help ) )
+        {
+        case -1: /* quit */
+          return -1;
+        case -2: /* show info */
+          no_help = 1;
+          break;
+        case 1: /* trust value set */
+          trust &= ~TRUST_FLAG_DISABLED;
+          trust |= get_ownertrust (pk) & TRUST_FLAG_DISABLED;
+          update_ownertrust (pk, trust );
+          return 1;
+        default:
+          return 0;
+        }
+    }
+}
+
+
+/****************
+ * Check whether we can trust this pk which has a trustlevel of TRUSTLEVEL
+ * Returns: true if we trust.
+ */
+static int
+do_we_trust( PKT_public_key *pk, unsigned int trustlevel )
+{
+  /* We should not be able to get here with a revoked or expired
+     key */
+  if(trustlevel & TRUST_FLAG_REVOKED
+     || trustlevel & TRUST_FLAG_SUB_REVOKED
+     || (trustlevel & TRUST_MASK) == TRUST_EXPIRED)
+    BUG();
+
+  if( opt.trust_model==TM_ALWAYS )
+    {
+      if( opt.verbose )
+       log_info("No trust check due to `--trust-model always' option\n");
+      return 1;
+    }
+
+  switch(trustlevel & TRUST_MASK)
+    {
+    default:
+      log_error ("invalid trustlevel %u returned from validation layer\n",
+                trustlevel);
+      /* fall thru */
+    case TRUST_UNKNOWN: 
+    case TRUST_UNDEFINED:
+      log_info(_("%s: There is no assurance this key belongs"
+                " to the named user\n"),keystr_from_pk(pk));
+      return 0; /* no */
+
+    case TRUST_MARGINAL:
+      log_info(_("%s: There is limited assurance this key belongs"
+                " to the named user\n"),keystr_from_pk(pk));
+      return 1; /* yes */
+
+    case TRUST_FULLY:
+      if( opt.verbose )
+       log_info(_("This key probably belongs to the named user\n"));
+      return 1; /* yes */
+
+    case TRUST_ULTIMATE:
+      if( opt.verbose )
+       log_info(_("This key belongs to us\n"));
+      return 1; /* yes */
+    }
+
+  return 1; /*NOTREACHED*/
+}
+
+
+/****************
+ * wrapper around do_we_trust, so we can ask whether to use the
+ * key anyway.
+ */
+static int
+do_we_trust_pre( PKT_public_key *pk, unsigned int trustlevel )
+{
+  int rc;
+
+  rc = do_we_trust( pk, trustlevel );
+
+  if( !opt.batch && !rc )
+    {
+      print_pubkey_info(NULL,pk);
+      print_fingerprint (pk, NULL, 2);
+      tty_printf("\n");
+
+      tty_printf(
+              _("It is NOT certain that the key belongs to the person named\n"
+                "in the user ID.  If you *really* know what you are doing,\n"
+                "you may answer the next question with yes.\n"));
+
+      tty_printf("\n");
+
+      if( cpr_get_answer_is_yes("untrusted_key.override",
+                               _("Use this key anyway? (y/N) "))  )
+       rc = 1;
+
+      /* Hmmm: Should we set a flag to tell the user about
+       *        his decision the next time he encrypts for this recipient?
+       */
+    }
+
+  return rc;
+}
+
+
+/****************
+ * Check whether we can trust this signature.
+ * Returns: Error if we shall not trust this signatures.
+ */
+int
+check_signatures_trust( PKT_signature *sig )
+{
+  PKT_public_key *pk = xmalloc_clear( sizeof *pk );
+  unsigned int trustlevel;
+  int rc=0;
+
+  rc = get_pubkey( pk, sig->keyid );
+  if (rc) 
+    { /* this should not happen */
+      log_error("Ooops; the key vanished  - can't check the trust\n");
+      rc = G10ERR_NO_PUBKEY;
+      goto leave;
+    }
+
+  if ( opt.trust_model==TM_ALWAYS )
+    {
+      if( !opt.quiet )
+        log_info(_("WARNING: Using untrusted key!\n"));
+      if (opt.with_fingerprint)
+        print_fingerprint (pk, NULL, 1);
+      goto leave;
+    }
+
+  if(pk->maybe_revoked && !pk->is_revoked)
+    log_info(_("WARNING: this key might be revoked (revocation key"
+              " not present)\n"));
+
+  trustlevel = get_validity (pk, NULL);
+
+  if ( (trustlevel & TRUST_FLAG_REVOKED) ) 
+    {
+      write_status( STATUS_KEYREVOKED );
+      if(pk->is_revoked==2)
+       log_info(_("WARNING: This key has been revoked by its"
+                  " designated revoker!\n"));
+      else
+       log_info(_("WARNING: This key has been revoked by its owner!\n"));
+      log_info(_("         This could mean that the signature is forged.\n"));
+      show_revocation_reason( pk, 0 );
+    }
+  else if ((trustlevel & TRUST_FLAG_SUB_REVOKED) ) 
+    {
+      write_status( STATUS_KEYREVOKED );
+      log_info(_("WARNING: This subkey has been revoked by its owner!\n"));
+      show_revocation_reason( pk, 0 );
+    }
+  
+  if ((trustlevel & TRUST_FLAG_DISABLED))
+    log_info (_("Note: This key has been disabled.\n"));
+
+  /* If we have PKA information adjust the trustlevel. */
+  if (sig->pka_info && sig->pka_info->valid)
+    {
+      unsigned char fpr[MAX_FINGERPRINT_LEN];
+      PKT_public_key *primary_pk;
+      size_t fprlen;
+      int okay;
+
+
+      primary_pk = xmalloc_clear (sizeof *primary_pk);
+      get_pubkey (primary_pk, pk->main_keyid);
+      fingerprint_from_pk (primary_pk, fpr, &fprlen);
+      free_public_key (primary_pk);
+
+      if ( fprlen == 20 && !memcmp (sig->pka_info->fpr, fpr, 20) )
+        {
+          okay = 1;
+          write_status_text (STATUS_PKA_TRUST_GOOD, sig->pka_info->email);
+          log_info (_("Note: Verified signer's address is `%s'\n"),
+                    sig->pka_info->email);
+        }
+      else
+        {
+          okay = 0;
+          write_status_text (STATUS_PKA_TRUST_BAD, sig->pka_info->email);
+          log_info (_("Note: Signer's address `%s' "
+                      "does not match DNS entry\n"), sig->pka_info->email);
+        }
+
+      switch ( (trustlevel & TRUST_MASK) ) 
+        {
+        case TRUST_UNKNOWN: 
+        case TRUST_UNDEFINED:
+        case TRUST_MARGINAL:
+          if (okay && opt.verify_options&VERIFY_PKA_TRUST_INCREASE)
+            {
+              trustlevel = ((trustlevel & ~TRUST_MASK) | TRUST_FULLY);
+              log_info (_("trustlevel adjusted to FULL"
+                          " due to valid PKA info\n"));
+            }
+          /* (fall through) */
+        case TRUST_FULLY:
+          if (!okay)
+            {
+              trustlevel = ((trustlevel & ~TRUST_MASK) | TRUST_NEVER);
+              log_info (_("trustlevel adjusted to NEVER"
+                          " due to bad PKA info\n"));
+            }
+          break;
+        }
+    }
+
+  /* Now let the user know what up with the trustlevel. */
+  switch ( (trustlevel & TRUST_MASK) ) 
+    {
+    case TRUST_EXPIRED:
+      log_info(_("Note: This key has expired!\n"));
+      print_fingerprint (pk, NULL, 1);
+      break;
+        
+    default:
+      log_error ("invalid trustlevel %u returned from validation layer\n",
+                 trustlevel);
+      /* fall thru */
+    case TRUST_UNKNOWN: 
+    case TRUST_UNDEFINED:
+      write_status( STATUS_TRUST_UNDEFINED );
+      log_info(_("WARNING: This key is not certified with"
+                 " a trusted signature!\n"));
+      log_info(_("         There is no indication that the "
+                 "signature belongs to the owner.\n" ));
+      print_fingerprint (pk, NULL, 1);
+      break;
+
+    case TRUST_NEVER:
+      /* currently we won't get that status */
+      write_status( STATUS_TRUST_NEVER );
+      log_info(_("WARNING: We do NOT trust this key!\n"));
+      log_info(_("         The signature is probably a FORGERY.\n"));
+      if (opt.with_fingerprint)
+        print_fingerprint (pk, NULL, 1);
+      rc = G10ERR_BAD_SIGN;
+      break;
+
+    case TRUST_MARGINAL:
+      write_status( STATUS_TRUST_MARGINAL );
+      log_info(_("WARNING: This key is not certified with"
+                 " sufficiently trusted signatures!\n"));
+      log_info(_("         It is not certain that the"
+                 " signature belongs to the owner.\n" ));
+      print_fingerprint (pk, NULL, 1);
+      break;
+
+    case TRUST_FULLY:
+      write_status( STATUS_TRUST_FULLY );
+      if (opt.with_fingerprint)
+        print_fingerprint (pk, NULL, 1);
+      break;
+
+    case TRUST_ULTIMATE:
+      write_status( STATUS_TRUST_ULTIMATE );
+      if (opt.with_fingerprint)
+        print_fingerprint (pk, NULL, 1);
+      break;
+    }
+
+ leave:
+  free_public_key( pk );
+  return rc;
+}
+
+
+void
+release_pk_list( PK_LIST pk_list )
+{
+    PK_LIST pk_rover;
+
+    for( ; pk_list; pk_list = pk_rover ) {
+       pk_rover = pk_list->next;
+       free_public_key( pk_list->pk );
+       xfree( pk_list );
+    }
+}
+
+
+static int
+key_present_in_pk_list(PK_LIST pk_list, PKT_public_key *pk)
+{
+    for( ; pk_list; pk_list = pk_list->next)
+       if (cmp_public_keys(pk_list->pk, pk) == 0)
+           return 0;
+
+    return -1;
+}
+
+
+/****************
+ * Return a malloced string with a default reciepient if there is any
+ */
+static char *
+default_recipient(void)
+{
+    PKT_secret_key *sk;
+    byte fpr[MAX_FINGERPRINT_LEN+1];
+    size_t n;
+    char *p;
+    int i;
+
+    if( opt.def_recipient )
+       return xstrdup( opt.def_recipient );
+    if( !opt.def_recipient_self )
+       return NULL;
+    sk = xmalloc_clear( sizeof *sk );
+    i = get_seckey_byname( sk, NULL, 0 );
+    if( i ) {
+       free_secret_key( sk );
+       return NULL;
+    }
+    n = MAX_FINGERPRINT_LEN;
+    fingerprint_from_sk( sk, fpr, &n );
+    free_secret_key( sk );
+    p = xmalloc( 2*n+3 );
+    *p++ = '0';
+    *p++ = 'x';
+    for(i=0; i < n; i++ )
+       sprintf( p+2*i, "%02X", fpr[i] );
+    p -= 2;
+    return p;
+}
+
+static int
+expand_id(const char *id,STRLIST *into,unsigned int flags)
+{
+  struct groupitem *groups;
+  int count=0;
+
+  for(groups=opt.grouplist;groups;groups=groups->next)
+    {
+      /* need strcasecmp() here, as this should be localized */
+      if(strcasecmp(groups->name,id)==0)
+       {
+         STRLIST each,sl;
+
+         /* this maintains the current utf8-ness */
+         for(each=groups->values;each;each=each->next)
+           {
+             sl=add_to_strlist(into,each->d);
+             sl->flags=flags;
+             count++;
+           }
+
+         break;
+       }
+    }
+
+  return count;
+}
+
+/* For simplicity, and to avoid potential loops, we only expand once -
+   you can't make an alias that points to an alias. */
+static STRLIST
+expand_group(STRLIST input)
+{
+  STRLIST sl,output=NULL,rover;
+
+  for(rover=input;rover;rover=rover->next)
+    if(expand_id(rover->d,&output,rover->flags)==0)
+      {
+       /* Didn't find any groups, so use the existing string */
+       sl=add_to_strlist(&output,rover->d);
+       sl->flags=rover->flags;
+      }
+
+  return output;
+}
+
+
+/* This is the central function to collect the keys for recipients.
+   It is thus used to prepare a public key encryption. encrypt-to
+   keys, default keys and the keys for the actual recipients are all
+   collected here.  When not in batch mode and no recipient has been
+   passed on the commandline, the function will also ask for
+   recipients.
+
+   RCPTS is a string list with the recipients; NULL is an allowed
+   value but not very useful.  Group expansion is done on these names;
+   they may be in any of the user Id formats we can handle.  The flags
+   bits for each string in the string list are used for:
+     Bit 0: This is an encrypt-to recipient.
+     Bit 1: This is a hidden recipient.
+
+   USE is the desired use for the key - usually PUBKEY_USAGE_ENC.
+   RET_PK_LIST.
+
+   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( STRLIST rcpts, PK_LIST *ret_pk_list, unsigned int use )
+{
+  PK_LIST pk_list = NULL;
+  PKT_public_key *pk=NULL;
+  int rc=0;
+  int any_recipients=0;
+  STRLIST rov,remusr;
+  char *def_rec = NULL;
+
+  /* Try to expand groups if any have been defined. */
+  if (opt.grouplist)
+    remusr = expand_group (rcpts);
+  else
+    remusr = rcpts;
+
+  /* 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 ) 
+    {
+      if ( !(rov->flags & 1) )
+        {
+          /* This is a regular recipient; i.e. not an encrypt-to
+             one. */
+          any_recipients = 1;
+
+          /* Hidden recipients are not allowed while in PGP mode,
+             issue a warning and switch into GnuPG mode. */
+          if ((rov->flags&2) && (PGP2 || PGP6 || PGP7 || PGP8))
+            {
+              log_info(_("you may not use %s while in %s mode\n"),
+                       "--hidden-recipient",
+                       compliance_option_string());
+
+              compliance_failure();
+            }
+        }
+      else if ( (use & PUBKEY_USAGE_ENC) && !opt.no_encrypt_to ) 
+        {
+          /* Encryption has been requested and --encrypt-to has not
+             been disabled.  Check this encrypt-to key. */
+          pk = xmalloc_clear( sizeof *pk );
+          pk->req_usage = use;
+
+          /* We explicitly allow encrypt-to to an disabled key; thus
+             we pass 1 as last argument. */
+          if ( (rc = get_pubkey_byname ( pk, rov->d, NULL, NULL, 1 )) ) 
+            {
+              free_public_key ( pk ); pk = NULL;
+              log_error (_("%s: skipped: %s\n"), rov->d, g10_errstr(rc) );
+              write_status_text_and_buffer (STATUS_INV_RECP, "0 ",
+                                            rov->d, strlen (rov->d), -1);
+              goto fail;
+            }
+          else if ( !(rc=check_pubkey_algo2 (pk->pubkey_algo, use )) ) 
+            {
+              /* Skip the actual key if the key is already present
+               * in the list.  Add it to our list if not. */
+              if (key_present_in_pk_list(pk_list, pk) == 0)
+                {
+                  free_public_key (pk); pk = NULL;
+                  log_info (_("%s: skipped: public key already present\n"),
+                            rov->d);
+                }
+              else
+                {
+                  PK_LIST r;
+                  r = xmalloc( sizeof *r );
+                  r->pk = pk; pk = NULL;
+                  r->next = pk_list;
+                  r->flags = (rov->flags&2)?1:0;
+                  pk_list = r;
+
+                  /* Hidden encrypt-to recipients are not allowed while
+                     in PGP mode, issue a warning and switch into
+                     GnuPG mode. */
+                  if ((r->flags&1) && (PGP2 || PGP6 || PGP7 || PGP8))
+                    {
+                      log_info(_("you may not use %s while in %s mode\n"),
+                               "--hidden-encrypt-to",
+                               compliance_option_string());
+
+                      compliance_failure();
+                    }
+                }
+            }
+          else 
+            {
+              /* The public key is not usable for encryption or not
+                 available. */
+              free_public_key( pk ); pk = NULL;
+              log_error(_("%s: skipped: %s\n"), rov->d, g10_errstr(rc) );
+              write_status_text_and_buffer (STATUS_INV_RECP, "0 ",
+                                            rov->d, strlen (rov->d), -1);
+              goto fail;
+            }
+        }
+    }
+
+  /* If we don't have any recipients yet and we are not in batch mode
+     drop into interactive selection mode. */
+  if ( !any_recipients && !opt.batch ) 
+    { 
+      int have_def_rec;
+      char *answer = NULL;
+      STRLIST backlog = NULL;
+
+      if (pk_list)
+        any_recipients = 1;
+      def_rec = default_recipient();
+      have_def_rec = !!def_rec;
+      if ( !have_def_rec )
+        tty_printf(_("You did not specify a user ID. (you may use \"-r\")\n"));
+
+      for (;;) 
+        {
+          rc = 0;
+          xfree(answer);
+          if ( have_def_rec )
+            {
+              /* A default recipient is taken as the first entry. */
+              answer = def_rec;
+              def_rec = NULL;
+            }
+          else if (backlog) 
+            {
+              /* This is part of our trick to expand and display groups. */
+              answer = pop_strlist (&backlog);
+            }
+          else
+            {
+              /* Show the list of already collected recipients and ask
+                 for more. */
+              PK_LIST iter;
+
+              tty_printf("\n");
+              tty_printf(_("Current recipients:\n"));
+              for (iter=pk_list;iter;iter=iter->next)
+                {
+                  u32 keyid[2];
+
+                  keyid_from_pk(iter->pk,keyid);
+                  tty_printf("%4u%c/%s %s \"",
+                             nbits_from_pk(iter->pk),
+                             pubkey_letter(iter->pk->pubkey_algo),
+                             keystr(keyid),
+                             datestr_from_pk(iter->pk));
+
+                  if (iter->pk->user_id)
+                    tty_print_utf8_string(iter->pk->user_id->name,
+                                          iter->pk->user_id->len);
+                  else
+                    {
+                      size_t n;
+                      char *p = get_user_id( keyid, &n );
+                      tty_print_utf8_string( p, n );
+                      xfree(p);
+                    }
+                  tty_printf("\"\n");
+                }
+
+              answer = cpr_get_utf8("pklist.user_id.enter",
+                                    _("\nEnter the user ID.  "
+                                      "End with an empty line: "));
+              trim_spaces(answer);
+              cpr_kill_prompt();
+            }
+          
+          if ( !answer || !*answer ) 
+            {
+              xfree(answer);
+              break;  /* No more recipients entered - get out of loop. */
+            }
+
+          /* Do group expand here too.  The trick here is to continue
+             the loop if any expansion occured.  The code above will
+             then list all expanded keys. */
+          if (expand_id(answer,&backlog,0))
+            continue;
+
+          /* Get and check key for the current name. */
+          if (pk)
+            free_public_key (pk);
+          pk = xmalloc_clear( sizeof *pk );
+          pk->req_usage = use;
+          rc = get_pubkey_byname( pk, answer, NULL, NULL, 0 );
+          if (rc)
+            tty_printf(_("No such user ID.\n"));
+          else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use)) ) 
+            {
+              if ( have_def_rec )
+                {
+                  /* No validation for a default recipient. */
+                  if (!key_present_in_pk_list(pk_list, pk)) 
+                    {
+                      free_public_key (pk); pk = NULL;
+                      log_info (_("skipped: public key "
+                                  "already set as default recipient\n") );
+                    }
+                  else
+                    {
+                      PK_LIST r = xmalloc (sizeof *r);
+                      r->pk = pk; pk = NULL;
+                      r->next = pk_list;
+                      r->flags = 0; /* No throwing default ids. */
+                      pk_list = r;
+                    }
+                  any_recipients = 1;
+                  continue;
+                }
+              else
+                { /* Check validity of this key. */
+                  int trustlevel;
+                   
+                  trustlevel = get_validity (pk, pk->user_id);
+                  if ( (trustlevel & TRUST_FLAG_DISABLED) ) 
+                    {
+                      tty_printf (_("Public key is disabled.\n") );
+                    }
+                  else if ( do_we_trust_pre (pk, trustlevel) ) 
+                    {
+                      /* Skip the actual key if the key is already
+                       * present in the list */
+                      if (!key_present_in_pk_list(pk_list, pk))
+                        {
+                          free_public_key(pk); pk = NULL;
+                          log_info(_("skipped: public key already set\n") );
+                        }
+                      else
+                        {
+                          PK_LIST r;
+                          r = xmalloc( sizeof *r );
+                          r->pk = pk; pk = NULL;
+                          r->next = pk_list;
+                          r->flags = 0; /* No throwing interactive ids. */
+                          pk_list = r;
+                        }
+                      any_recipients = 1;
+                      continue;
+                    }
+                }
+            }
+          xfree(def_rec); def_rec = NULL;
+          have_def_rec = 0;
+        }
+      if ( pk )
+        {
+          free_public_key( pk );
+          pk = NULL;
+        }
+    }
+  else if ( !any_recipients && (def_rec = default_recipient()) ) 
+    {
+      /* We are in batch mode and have only a default recipient. */
+      pk = xmalloc_clear( sizeof *pk );
+      pk->req_usage = use;
+
+      /* The default recipient is allowed to be disabled; thus pass 1
+         as last argument. */
+      rc = get_pubkey_byname (pk, def_rec, NULL, NULL, 1);
+      if (rc)
+        log_error(_("unknown default recipient \"%s\"\n"), def_rec );
+      else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use)) ) 
+        {
+          /* Mark any_recipients here since the default recipient
+             would have been used if it wasn't already there.  It
+             doesn't really matter if we got this key from the default
+             recipient or an encrypt-to. */
+          any_recipients = 1;
+          if (!key_present_in_pk_list(pk_list, pk))
+            log_info (_("skipped: public key already set "
+                        "as default recipient\n"));
+          else 
+            {
+              PK_LIST r = xmalloc( sizeof *r );
+              r->pk = pk; pk = NULL;
+              r->next = pk_list;
+              r->flags = 0; /* No throwing default ids. */
+              pk_list = r;
+            }
+        }
+      if ( pk )
+        {
+          free_public_key( pk );
+          pk = NULL;
+        }
+      xfree(def_rec); def_rec = NULL;
+    }
+  else 
+    {
+      /* General case: Check all keys. */
+      any_recipients = 0;
+      for (; remusr; remusr = remusr->next ) 
+        {
+          if ( (remusr->flags & 1) )
+            continue; /* encrypt-to keys are already handled. */
+
+          pk = xmalloc_clear( sizeof *pk );
+          pk->req_usage = use;
+          if ( (rc = get_pubkey_byname( pk, remusr->d, NULL, NULL, 0 )) ) 
+            {
+              /* Key not found or other error. */
+              free_public_key( pk ); pk = NULL;
+              log_error(_("%s: skipped: %s\n"), remusr->d, g10_errstr(rc) );
+              write_status_text_and_buffer (STATUS_INV_RECP, "0 ",
+                                            remusr->d, strlen (remusr->d),
+                                            -1);
+              goto fail;
+            }
+          else if ( !(rc=check_pubkey_algo2(pk->pubkey_algo, use )) ) 
+            {
+              /* Key found and usable.  Check validity. */
+              int trustlevel;
+              
+              trustlevel = get_validity (pk, pk->user_id);
+              if ( (trustlevel & TRUST_FLAG_DISABLED) ) 
+                {
+                  /*Key has been disabled. */
+                  free_public_key(pk); pk = NULL;
+                  log_info(_("%s: skipped: public key is disabled\n"),
+                           remusr->d);
+                  write_status_text_and_buffer (STATUS_INV_RECP, "0 ",
+                                                remusr->d,
+                                                strlen (remusr->d),
+                                                -1);
+                  rc=G10ERR_UNU_PUBKEY;
+                  goto fail;
+                }
+              else if ( do_we_trust_pre( pk, trustlevel ) ) 
+                {
+                  /* Note: do_we_trust may have changed the trustlevel */
+
+                  /* We have at least one valid recipient. It doesn't
+                   * matters if this recipient is already present. */
+                  any_recipients = 1;
+
+                  /* Skip the actual key if the key is already present
+                   * in the list */
+                  if (!key_present_in_pk_list(pk_list, pk)) 
+                    {
+                      free_public_key(pk); pk = NULL;
+                      log_info(_("%s: skipped: public key already present\n"),
+                               remusr->d);
+                    }
+                  else
+                    {
+                      PK_LIST r;
+                      r = xmalloc( sizeof *r );
+                      r->pk = pk; pk = NULL;
+                      r->next = pk_list;
+                      r->flags = (remusr->flags&2)?1:0;
+                      pk_list = r;
+                    }
+                }
+              else
+                { /* We don't trust this key. */
+                  free_public_key( pk ); pk = NULL;
+                  write_status_text_and_buffer (STATUS_INV_RECP, "10 ",
+                                                remusr->d,
+                                                strlen (remusr->d),
+                                                -1);
+                  rc=G10ERR_UNU_PUBKEY;
+                  goto fail;
+                }
+            }
+          else
+            {
+              /* Key found but not usable for us (e.g. sign-only key). */
+              free_public_key( pk ); pk = NULL;
+              write_status_text_and_buffer (STATUS_INV_RECP, "0 ",
+                                            remusr->d,
+                                            strlen (remusr->d),
+                                            -1);
+              log_error(_("%s: skipped: %s\n"), remusr->d, g10_errstr(rc) );
+              goto fail;
+            }
+        }
+    }
+  
+  if ( !rc && !any_recipients ) 
+    {
+      log_error(_("no valid addressees\n"));
+      write_status_text (STATUS_NO_RECP, "0");
+      rc = G10ERR_NO_USER_ID;
+    }
+  
+ fail:
+
+  if ( rc )
+    release_pk_list( pk_list );
+  else
+    *ret_pk_list = pk_list;
+  if (opt.grouplist)
+    free_strlist(remusr);
+  return rc;
+}
+
+
+/* In pgp6 mode, disallow all ciphers except IDEA (1), 3DES (2), and
+   CAST5 (3), all hashes except MD5 (1), SHA1 (2), and RIPEMD160 (3),
+   and all compressions except none (0) and ZIP (1).  pgp7 and pgp8
+   mode expands the cipher list to include AES128 (7), AES192 (8),
+   AES256 (9), and TWOFISH (10).  pgp8 adds the SHA-256 hash (8).  For
+   a true PGP key all of this is unneeded as they are the only items
+   present in the preferences subpacket, but checking here covers the
+   weird case of encrypting to a key that had preferences from a
+   different implementation which was then used with PGP.  I am not
+   completely comfortable with this as the right thing to do, as it
+   slightly alters the list of what the user is supposedly requesting.
+   It is not against the RFC however, as the preference chosen will
+   never be one that the user didn't specify somewhere ("The
+   implementation may use any mechanism to pick an algorithm in the
+   intersection"), and PGP has no mechanism to fix such a broken
+   preference list, so I'm including it. -dms */
+
+int
+algo_available( preftype_t preftype, int algo, const union pref_hint *hint )
+{
+  if( preftype == PREFTYPE_SYM )
+    {
+      if(PGP6 && (algo != CIPHER_ALGO_IDEA
+                 && algo != CIPHER_ALGO_3DES
+                 && algo != CIPHER_ALGO_CAST5))
+       return 0;
+      
+      if(PGP7 && (algo != CIPHER_ALGO_IDEA
+                 && algo != CIPHER_ALGO_3DES
+                 && algo != CIPHER_ALGO_CAST5
+                 && algo != CIPHER_ALGO_AES
+                 && algo != CIPHER_ALGO_AES192
+                 && algo != CIPHER_ALGO_AES256
+                 && algo != CIPHER_ALGO_TWOFISH))
+       return 0;
+
+      /* PGP8 supports all the ciphers we do.. */
+
+      return algo && !check_cipher_algo( algo );
+    }
+  else if( preftype == PREFTYPE_HASH )
+    {
+      if(hint && hint->digest_length)
+       {
+         if(hint->digest_length!=20 || opt.flags.dsa2)
+           {
+             /* If --enable-dsa2 is set or the hash isn't 160 bits
+                (which implies DSA2), then we'll accept a hash that
+                is larger than we need.  Otherwise we won't accept
+                any hash that isn't exactly the right size. */
+             if(hint->digest_length > md_digest_length(algo))
+               return 0;
+           }
+         else if(hint->digest_length != md_digest_length(algo))
+           return 0;
+       }
+
+      if((PGP6 || PGP7) && (algo != DIGEST_ALGO_MD5
+                           && algo != DIGEST_ALGO_SHA1
+                           && algo != DIGEST_ALGO_RMD160))
+       return 0;
+
+
+      if(PGP8 && (algo != DIGEST_ALGO_MD5
+                 && algo != DIGEST_ALGO_SHA1
+                 && algo != DIGEST_ALGO_RMD160
+                 && algo != DIGEST_ALGO_SHA256))
+       return 0;
+
+      return algo && !check_digest_algo( algo );
+    }
+  else if( preftype == PREFTYPE_ZIP )
+    {
+      if((PGP6 || PGP7) && (algo != COMPRESS_ALGO_NONE
+                           && algo != COMPRESS_ALGO_ZIP))
+       return 0;
+
+      /* PGP8 supports all the compression algos we do */
+
+      return !check_compress_algo( algo );
+    }
+  else
+    return 0;
+}
+
+
+
+/****************
+ * Return -1 if we could not find an algorithm.
+ */
+int
+select_algo_from_prefs(PK_LIST pk_list, int preftype,
+                      int request, const union pref_hint *hint)
+{
+    PK_LIST pkr;
+    u32 bits[8];
+    const prefitem_t *prefs;
+    int i, j;
+    int compr_hack=0;
+    int any;
+
+    if( !pk_list )
+       return -1;
+
+    memset( bits, ~0, 8 * sizeof *bits );
+    for( pkr = pk_list; pkr; pkr = pkr->next ) {
+       u32 mask[8];
+
+       memset( mask, 0, 8 * sizeof *mask );
+       if( preftype == PREFTYPE_SYM ) {
+         if( PGP2 &&
+             pkr->pk->version < 4 &&
+             pkr->pk->selfsigversion < 4 )
+           mask[0] |= (1<<1); /* IDEA is implicitly there for v3 keys
+                                 with v3 selfsigs (rfc2440:12.1) if
+                                 --pgp2 mode is on.  This doesn't
+                                 mean it's actually available, of
+                                 course. */
+         else
+           mask[0] |= (1<<2); /* 3DES is implicitly there for everyone else */
+       }
+       else if( preftype == PREFTYPE_HASH ) {
+         /* While I am including this code for completeness, note
+            that currently --pgp2 mode locks the hash at MD5, so this
+            function will never even be called.  Even if the hash
+            wasn't locked at MD5, we don't support sign+encrypt in
+            --pgp2 mode, and that's the only time PREFTYPE_HASH is
+            used anyway. -dms */
+         if( PGP2 &&
+             pkr->pk->version < 4 &&
+             pkr->pk->selfsigversion < 4 )
+           mask[0] |= (1<<1); /* MD5 is there for v3 keys with v3
+                                 selfsigs when --pgp2 is on. */
+         else
+           mask[0] |= (1<<2); /* SHA1 is there for everyone else */
+       }
+       else if( preftype == PREFTYPE_ZIP )
+         mask[0] |= (1<<0); /* Uncompressed is implicit */
+
+        if (pkr->pk->user_id) /* selected by user ID */
+            prefs = pkr->pk->user_id->prefs;
+        else
+            prefs = pkr->pk->prefs;
+
+       any = 0;
+       if( prefs ) {
+           for (i=0; prefs[i].type; i++ ) {
+               if( prefs[i].type == preftype ) {
+                   mask[prefs[i].value/32] |= 1 << (prefs[i].value%32);
+                   any = 1;
+               }
+           }
+       }
+
+       if( (!prefs || !any) && preftype == PREFTYPE_ZIP ) {
+           mask[0] |= 3; /* asume no_compression and old pgp */
+           compr_hack = 1;
+       }
+
+#if 0
+       log_debug("pref mask=%08lX%08lX%08lX%08lX%08lX%08lX%08lX%08lX\n",
+              (ulong)mask[7], (ulong)mask[6], (ulong)mask[5], (ulong)mask[4],
+            (ulong)mask[3], (ulong)mask[2], (ulong)mask[1], (ulong)mask[0]);
+#endif
+       for(i=0; i < 8; i++ )
+           bits[i] &= mask[i];
+#if 0
+       log_debug("pref bits=%08lX%08lX%08lX%08lX%08lX%08lX%08lX%08lX\n",
+              (ulong)bits[7], (ulong)bits[6], (ulong)bits[5], (ulong)bits[4],
+            (ulong)bits[3], (ulong)bits[2], (ulong)bits[1], (ulong)bits[0]);
+#endif
+    }
+    /* usable algorithms are now in bits
+     * We now use the last key from pk_list to select
+     * the algorithm we want to use. there are no
+     * preferences for the last key, we select the one
+     * corresponding to first set bit.
+     */
+    i = -1;
+    any = 0;
+
+    /* Can we use the requested algorithm? */
+    if(request>-1 && (bits[request/32] & (1<<(request%32))) &&
+       algo_available(preftype,request,hint))
+      return request;
+
+    /* If we have personal prefs set, use them instead of the last key */
+    if(preftype==PREFTYPE_SYM && opt.personal_cipher_prefs)
+      prefs=opt.personal_cipher_prefs;
+    else if(preftype==PREFTYPE_HASH && opt.personal_digest_prefs)
+      prefs=opt.personal_digest_prefs;
+    else if(preftype==PREFTYPE_ZIP && opt.personal_compress_prefs)
+      prefs=opt.personal_compress_prefs;
+
+    if( prefs ) {
+       for(j=0; prefs[j].type; j++ ) {
+           if( prefs[j].type == preftype ) {
+                if( (bits[prefs[j].value/32] & (1<<(prefs[j].value%32))) ) {
+                   if( algo_available( preftype, prefs[j].value, hint ) ) {
+                       any = 1;
+                       i = prefs[j].value;
+                       break;
+                   }
+               }
+           }
+       }
+    }
+    if( !prefs || !any ) {
+       for(j=0; j < 256; j++ )
+           if( (bits[j/32] & (1<<(j%32))) ) {
+               if( algo_available( preftype, j, hint ) ) {
+                   i = j;
+                   break;
+               }
+           }
+    }
+
+#if 0
+    log_debug("prefs of type %d: selected %d\n", preftype, i );
+#endif
+    if( compr_hack && !i ) {
+       /* selected no compression, but we should check whether
+        * algorithm 1 is also available (the ordering is not relevant
+        * in this case). */
+       if( bits[0] & (1<<1) )
+           i = 1; /* yep; we can use compression algo 1 */
+    }
+
+    /* "If you are building an authentication system, the recipient
+       may specify a preferred signing algorithm. However, the signer
+       would be foolish to use a weak algorithm simply because the
+       recipient requests it." RFC2440:13.  If we settle on MD5, and
+       SHA1 is also available, use SHA1 instead.  Of course, if the
+       user intentionally chose MD5 (by putting it in their personal
+       prefs), then we should do what they say. */
+
+    if(preftype==PREFTYPE_HASH &&
+       i==DIGEST_ALGO_MD5 && (bits[0] & (1<<DIGEST_ALGO_SHA1)))
+      {
+       i=DIGEST_ALGO_SHA1;
+
+       if(opt.personal_digest_prefs)
+         for(j=0; prefs[j].type; j++ )
+           if(opt.personal_digest_prefs[j].type==PREFTYPE_HASH &&
+              opt.personal_digest_prefs[j].value==DIGEST_ALGO_MD5)
+             {
+               i=DIGEST_ALGO_MD5;
+               break;
+             }
+      }
+
+    return i;
+}
+
+/*
+ * Select the MDC flag from the pk_list.  We can only use MDC if all recipients
+ * support this feature 
+ */
+int
+select_mdc_from_pklist (PK_LIST pk_list)
+{
+    PK_LIST pkr;
+
+    if( !pk_list )
+       return 0;
+
+    for (pkr = pk_list; pkr; pkr = pkr->next) {
+        int mdc;
+
+        if (pkr->pk->user_id) /* selected by user ID */
+            mdc = pkr->pk->user_id->flags.mdc;
+        else
+            mdc = pkr->pk->mdc_feature;
+        if (!mdc)
+            return 0; /* at least one recipient does not support it */
+    }
+    return 1; /* can be used */
+}
diff --git a/g10/plaintext.c b/g10/plaintext.c
new file mode 100644 (file)
index 0000000..243296b
--- /dev/null
@@ -0,0 +1,589 @@
+/* plaintext.c -  process plaintext packets
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/types.h>
+#ifdef HAVE_DOSISH_SYSTEM
+#include <fcntl.h> /* for setmode() */
+#endif
+
+#include "util.h"
+#include "memory.h"
+#include "options.h"
+#include "packet.h"
+#include "ttyio.h"
+#include "filter.h"
+#include "main.h"
+#include "status.h"
+#include "i18n.h"
+
+
+/****************
+ * Handle a plaintext packet.  If MFX is not NULL, update the MDs
+ * Note: we should use the filter stuff here, but we have to add some
+ *      easy mimic to set a read limit, so we calculate only the
+ *      bytes from the plaintext.
+ */
+int
+handle_plaintext( PKT_plaintext *pt, md_filter_context_t *mfx,
+                 int nooutput, int clearsig )
+{
+    char *fname = NULL;
+    FILE *fp = NULL;
+    static off_t count=0;
+    int rc = 0;
+    int c;
+    int convert = (pt->mode == 't' || pt->mode == 'u');
+#ifdef __riscos__
+    int filetype = 0xfff;
+#endif
+
+    /* Let people know what the plaintext info is. This allows the
+       receiving program to try and do something different based on
+       the format code (say, recode UTF-8 to local). */
+    if(!nooutput && is_status_enabled())
+      {
+       char status[50];
+
+       sprintf(status,"%X %lu ",(byte)pt->mode,(ulong)pt->timestamp);
+       write_status_text_and_buffer(STATUS_PLAINTEXT,
+                                    status,pt->name,pt->namelen,0);
+
+       if(!pt->is_partial)
+         {
+           sprintf(status,"%lu",(ulong)pt->len);
+           write_status_text(STATUS_PLAINTEXT_LENGTH,status);
+         }
+      }
+
+    /* create the filename as C string */
+    if( nooutput )
+       ;
+    else if( opt.outfile ) {
+       fname = xmalloc( strlen( opt.outfile ) + 1);
+       strcpy(fname, opt.outfile );
+    }
+    else if( pt->namelen == 8 && !memcmp( pt->name, "_CONSOLE", 8 ) ) {
+       log_info(_("data not saved; use option \"--output\" to save it\n"));
+       nooutput = 1;
+    }
+    else if( !opt.flags.use_embedded_filename ) {
+       fname = make_outfile_name( iobuf_get_real_fname(pt->buf) );
+       if( !fname )
+           fname = ask_outfile_name( pt->name, pt->namelen );
+       if( !fname ) {
+           rc = G10ERR_CREATE_FILE;
+           goto leave;
+       }
+    }
+    else
+      fname=utf8_to_native(pt->name,pt->namelen,0);
+
+    if( nooutput )
+       ;
+    else if ( iobuf_is_pipe_filename (fname) || !*fname)
+      {
+       /* No filename or "-" given; write to stdout. */
+       fp = stdout;
+#ifdef HAVE_DOSISH_SYSTEM
+       setmode ( fileno(fp) , O_BINARY );
+#endif
+      }
+    else {
+       while( !overwrite_filep (fname) ) {
+            char *tmp = ask_outfile_name (NULL, 0);
+            if ( !tmp || !*tmp ) {
+                xfree (tmp);
+                rc = G10ERR_CREATE_FILE;
+                goto leave;
+            }
+            xfree (fname);
+            fname = tmp;
+        }
+    }
+
+#ifndef __riscos__
+    if( fp || nooutput )
+       ;
+    else if (is_secured_filename (fname))
+      {
+        errno = EPERM;
+       log_error(_("error creating `%s': %s\n"), fname, strerror(errno) );
+       rc = G10ERR_CREATE_FILE;
+       goto leave;
+      }
+    else if( !(fp = fopen(fname,"wb")) ) {
+       log_error(_("error creating `%s': %s\n"), fname, strerror(errno) );
+       rc = G10ERR_CREATE_FILE;
+       goto leave;
+    }
+#else /* __riscos__ */
+    /* If no output filename was given, i.e. we constructed it,
+       convert all '.' in fname to '/' but not vice versa as
+       we don't create directories! */
+    if( !opt.outfile )
+        for( c=0; fname[c]; ++c )
+            if( fname[c] == '.' )
+                fname[c] = '/';
+
+    if( fp || nooutput )
+       ;
+    else {
+        fp = fopen(fname,"wb");
+        if( !fp ) {
+            log_error(_("error creating `%s': %s\n"), fname, strerror(errno) );
+            rc = G10ERR_CREATE_FILE;
+            if (errno == 106)
+                log_info("Do output file and input file have the same name?\n");
+            goto leave;
+       }
+
+        /* If there's a ,xxx extension in the embedded filename,
+           use that, else check whether the user input (in fname)
+           has a ,xxx appended, then use that in preference */
+        if( (c = riscos_get_filetype_from_string( pt->name,
+                                                  pt->namelen )) != -1 )
+            filetype = c;
+        if( (c = riscos_get_filetype_from_string( fname,
+                                                  strlen(fname) )) != -1 )
+            filetype = c;
+        riscos_set_filetype_by_number(fname, filetype);
+    }
+#endif /* __riscos__ */
+
+    if( !pt->is_partial ) {
+        /* We have an actual length (which might be zero). */
+
+        if (clearsig) {
+            log_error ("clearsig encountered while not expected\n");
+            rc = G10ERR_UNEXPECTED;
+            goto leave;
+        }
+
+       if( convert ) { /* text mode */
+           for( ; pt->len; pt->len-- ) {
+               if( (c = iobuf_get(pt->buf)) == -1 ) {
+                   log_error("Problem reading source (%u bytes remaining)\n",
+                             (unsigned)pt->len);
+                   rc = G10ERR_READ_FILE;
+                   goto leave;
+               }
+               if( mfx->md )
+                   md_putc(mfx->md, c );
+#ifndef HAVE_DOSISH_SYSTEM
+               if( c == '\r' )  /* convert to native line ending */
+                   continue;    /* fixme: this hack might be too simple */
+#endif
+               if( fp )
+                 {
+                   if(opt.max_output && (++count)>opt.max_output)
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname,"exceeded --max-output limit\n");
+                       rc = G10ERR_WRITE_FILE;
+                       goto leave;
+                     }
+                   else if( putc( c, fp ) == EOF )
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname, strerror(errno) );
+                       rc = G10ERR_WRITE_FILE;
+                       goto leave;
+                     }
+                 }
+           }
+       }
+       else { /* binary mode */
+           byte *buffer = xmalloc( 32768 );
+           while( pt->len ) {
+               int len = pt->len > 32768 ? 32768 : pt->len;
+               len = iobuf_read( pt->buf, buffer, len );
+               if( len == -1 ) {
+                   log_error("Problem reading source (%u bytes remaining)\n",
+                             (unsigned)pt->len);
+                   rc = G10ERR_READ_FILE;
+                   xfree( buffer );
+                   goto leave;
+               }
+               if( mfx->md )
+                   md_write( mfx->md, buffer, len );
+               if( fp )
+                 {
+                   if(opt.max_output && (count+=len)>opt.max_output)
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname,"exceeded --max-output limit\n");
+                       rc = G10ERR_WRITE_FILE;
+                       xfree( buffer );
+                       goto leave;
+                     }
+                   else if( fwrite( buffer, 1, len, fp ) != len )
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname, strerror(errno) );
+                       rc = G10ERR_WRITE_FILE;
+                       xfree( buffer );
+                       goto leave;
+                     }
+                 }
+               pt->len -= len;
+           }
+           xfree( buffer );
+       }
+    }
+    else if( !clearsig ) {
+       if( convert ) { /* text mode */
+           while( (c = iobuf_get(pt->buf)) != -1 ) {
+               if( mfx->md )
+                   md_putc(mfx->md, c );
+#ifndef HAVE_DOSISH_SYSTEM
+               if( convert && c == '\r' )
+                   continue; /* fixme: this hack might be too simple */
+#endif
+               if( fp )
+                 {
+                   if(opt.max_output && (++count)>opt.max_output)
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname,"exceeded --max-output limit\n");
+                       rc = G10ERR_WRITE_FILE;
+                       goto leave;
+                     }
+                   else if( putc( c, fp ) == EOF )
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname, strerror(errno) );
+                       rc = G10ERR_WRITE_FILE;
+                       goto leave;
+                     }
+                 }
+           }
+       }
+       else { /* binary mode */
+           byte *buffer = xmalloc( 32768 );
+           int eof;
+           for( eof=0; !eof; ) {
+               /* Why do we check for len < 32768:
+                * If we won't, we would practically read 2 EOFs but
+                * the first one has already popped the block_filter
+                * off and therefore we don't catch the boundary.
+                * So, always assume EOF if iobuf_read returns less bytes
+                * then requested */
+               int len = iobuf_read( pt->buf, buffer, 32768 );
+               if( len == -1 )
+                   break;
+               if( len < 32768 )
+                   eof = 1;
+               if( mfx->md )
+                   md_write( mfx->md, buffer, len );
+               if( fp )
+                 {
+                   if(opt.max_output && (count+=len)>opt.max_output)
+                     {
+                       log_error("Error writing to `%s': %s\n",
+                                 fname,"exceeded --max-output limit\n");
+                       rc = G10ERR_WRITE_FILE;
+                       xfree( buffer );
+                       goto leave;
+                     }
+                   else if( fwrite( buffer, 1, len, fp ) != len ) {
+                     log_error("Error writing to `%s': %s\n",
+                               fname, strerror(errno) );
+                     rc = G10ERR_WRITE_FILE;
+                     xfree( buffer );
+                     goto leave;
+                   }
+                 }
+           }
+           xfree( buffer );
+       }
+       pt->buf = NULL;
+    }
+    else {  /* clear text signature - don't hash the last cr,lf  */
+       int state = 0;
+
+       while( (c = iobuf_get(pt->buf)) != -1 ) {
+           if( fp )
+             {
+               if(opt.max_output && (++count)>opt.max_output)
+                 {
+                   log_error("Error writing to `%s': %s\n",
+                             fname,"exceeded --max-output limit\n");
+                   rc = G10ERR_WRITE_FILE;
+                   goto leave;
+                 }
+               else if( putc( c, fp ) == EOF )
+                 {
+                   log_error("Error writing to `%s': %s\n",
+                             fname, strerror(errno) );
+                   rc = G10ERR_WRITE_FILE;
+                   goto leave;
+                 }
+             }
+           if( !mfx->md )
+               continue;
+           if( state == 2 ) {
+               md_putc(mfx->md, '\r' );
+               md_putc(mfx->md, '\n' );
+               state = 0;
+           }
+           if( !state ) {
+               if( c == '\r'  )
+                   state = 1;
+               else if( c == '\n'  )
+                   state = 2;
+               else
+                   md_putc(mfx->md, c );
+           }
+           else if( state == 1 ) {
+               if( c == '\n'  )
+                   state = 2;
+               else {
+                   md_putc(mfx->md, '\r' );
+                   if( c == '\r'  )
+                       state = 1;
+                   else {
+                       state = 0;
+                       md_putc(mfx->md, c );
+                   }
+               }
+           }
+       }
+       pt->buf = NULL;
+    }
+
+    if( fp && fp != stdout && fclose(fp) ) {
+       log_error("Error closing `%s': %s\n", fname, strerror(errno) );
+       fp = NULL;
+       rc = G10ERR_WRITE_FILE;
+       goto leave;
+    }
+    fp = NULL;
+
+  leave:
+    if( fp && fp != stdout )
+       fclose(fp);
+    xfree(fname);
+    return rc;
+}
+
+static void
+do_hash( MD_HANDLE md, MD_HANDLE md2, IOBUF fp, int textmode )
+{
+    text_filter_context_t tfx;
+    int c;
+
+    if( textmode ) {
+       memset( &tfx, 0, sizeof tfx);
+       iobuf_push_filter( fp, text_filter, &tfx );
+    }
+    if( md2 ) { /* work around a strange behaviour in pgp2 */
+       /* It seems that at least PGP5 converts a single CR to a CR,LF too */
+       int lc = -1;
+       while( (c = iobuf_get(fp)) != -1 ) {
+           if( c == '\n' && lc == '\r' )
+               md_putc(md2, c);
+           else if( c == '\n' ) {
+               md_putc(md2, '\r');
+               md_putc(md2, c);
+           }
+           else if( c != '\n' && lc == '\r' ) {
+               md_putc(md2, '\n');
+               md_putc(md2, c);
+           }
+           else
+               md_putc(md2, c);
+
+           if( md )
+               md_putc(md, c );
+           lc = c;
+       }
+    }
+    else {
+       while( (c = iobuf_get(fp)) != -1 ) {
+           if( md )
+               md_putc(md, c );
+       }
+    }
+}
+
+
+/****************
+ * Ask for the detached datafile and calculate the digest from it.
+ * INFILE is the name of the input file.
+ */
+int
+ask_for_detached_datafile( MD_HANDLE md, MD_HANDLE md2,
+                          const char *inname, int textmode )
+{
+    progress_filter_context_t pfx;
+    char *answer = NULL;
+    IOBUF fp;
+    int rc = 0;
+
+    fp = open_sigfile( inname, &pfx ); /* open default file */
+
+    if( !fp && !opt.batch ) {
+       int any=0;
+       tty_printf(_("Detached signature.\n"));
+       do {
+           char *name;
+           xfree(answer);
+           tty_enable_completion(NULL);
+           name = cpr_get("detached_signature.filename",
+                          _("Please enter name of data file: "));
+           tty_disable_completion();
+           cpr_kill_prompt();
+           answer=make_filename(name,(void *)NULL);
+           xfree(name);
+
+           if( any && !*answer ) {
+               rc = G10ERR_READ_FILE;
+               goto leave;
+           }
+           fp = iobuf_open(answer);
+            if (fp && is_secured_file (iobuf_get_fd (fp)))
+              {
+                iobuf_close (fp);
+                fp = NULL;
+                errno = EPERM;
+              }
+           if( !fp && errno == ENOENT ) {
+               tty_printf("No such file, try again or hit enter to quit.\n");
+               any++;
+           }
+           else if( !fp )
+             {
+               log_error(_("can't open `%s': %s\n"), answer, strerror(errno));
+               rc = G10ERR_READ_FILE;
+               goto leave;
+             }
+       } while( !fp );
+    }
+
+    if( !fp ) {
+       if( opt.verbose )
+           log_info(_("reading stdin ...\n"));
+       fp = iobuf_open( NULL );
+       assert(fp);
+    }
+    do_hash( md, md2, fp, textmode );
+    iobuf_close(fp);
+
+  leave:
+    xfree(answer);
+    return rc;
+}
+
+
+
+/****************
+ * Hash the given files and append the hash to hash context md.
+ * If FILES is NULL, hash stdin.
+ */
+int
+hash_datafiles( MD_HANDLE md, MD_HANDLE md2, STRLIST files,
+               const char *sigfilename, int textmode )
+{
+    progress_filter_context_t pfx;
+    IOBUF fp;
+    STRLIST sl;
+
+    if( !files ) {
+       /* check whether we can open the signed material */
+       fp = open_sigfile( sigfilename, &pfx );
+       if( fp ) {
+           do_hash( md, md2, fp, textmode );
+           iobuf_close(fp);
+           return 0;
+       }
+        log_error (_("no signed data\n"));
+        return G10ERR_OPEN_FILE;
+    }
+
+
+    for (sl=files; sl; sl = sl->next ) {
+       fp = iobuf_open( sl->d );
+        if (fp && is_secured_file (iobuf_get_fd (fp)))
+          {
+            iobuf_close (fp);
+            fp = NULL;
+            errno = EPERM;
+          }
+       if( !fp ) {
+           log_error(_("can't open signed data `%s'\n"),
+                                               print_fname_stdin(sl->d));
+           return G10ERR_OPEN_FILE;
+       }
+        handle_progress (&pfx, fp, sl->d);
+       do_hash( md, md2, fp, textmode );
+       iobuf_close(fp);
+    }
+
+    return 0;
+}
+
+
+/* Set up a plaintext packet with the appropriate filename.  If there
+   is a --set-filename, use it (it's already UTF8).  If there is a
+   regular filename, UTF8-ize it if necessary.  If there is no
+   filenames at all, set the field empty. */
+
+PKT_plaintext *
+setup_plaintext_name(const char *filename,IOBUF iobuf)
+{
+  PKT_plaintext *pt;
+
+  if(filename || opt.set_filename)
+    {
+      char *s;
+
+      if(opt.set_filename)
+       s=make_basename(opt.set_filename,iobuf_get_real_fname(iobuf));
+      else if(filename && !opt.flags.utf8_filename)
+       {
+         char *tmp=native_to_utf8(filename);
+         s=make_basename(tmp,iobuf_get_real_fname(iobuf));
+         xfree(tmp);
+       }
+      else
+       s=make_basename(filename,iobuf_get_real_fname(iobuf));
+
+      pt = xmalloc (sizeof *pt + strlen(s) - 1);
+      pt->namelen = strlen (s);
+      memcpy (pt->name, s, pt->namelen);
+      xfree (s);
+    }
+  else
+    {
+      /* no filename */
+      pt = xmalloc (sizeof *pt - 1);
+      pt->namelen = 0;
+    }
+
+  return pt;
+}
diff --git a/g10/progress.c b/g10/progress.c
new file mode 100644 (file)
index 0000000..8c8265f
--- /dev/null
@@ -0,0 +1,118 @@
+/* progress.c
+ * Copyright (C) 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+
+#include "iobuf.h"
+#include "filter.h"
+#include "status.h"
+#include "util.h"
+#include "options.h"
+
+/****************
+ * The filter is used to report progress to the user.
+ */
+int
+progress_filter (void *opaque, int control,
+                IOBUF a, byte *buf, size_t *ret_len)
+{
+  int rc = 0;
+  progress_filter_context_t *pfx = opaque;
+
+  if (control == IOBUFCTRL_INIT)
+    {
+      char buffer[50];
+
+      pfx->last = 0;
+      pfx->offset = 0;
+      pfx->last_time = make_timestamp ();
+
+      sprintf (buffer, "%.20s ? %lu %lu",
+               pfx->what? pfx->what : "?",
+               pfx->offset,
+              pfx->total);
+      write_status_text (STATUS_PROGRESS, buffer);
+    }
+  else if (control == IOBUFCTRL_UNDERFLOW)
+    {
+      u32 timestamp = make_timestamp ();
+      int len = iobuf_read (a, buf, *ret_len);
+
+      if (len >= 0)
+       {
+         pfx->offset += len;
+         *ret_len = len;
+       }
+      else
+       {
+         *ret_len = 0;
+         rc = -1;
+       }
+      if ((len == -1 && pfx->offset != pfx->last)
+         || timestamp - pfx->last_time > 0)
+       {
+         char buffer[50];
+         
+         sprintf (buffer, "%.20s ? %lu %lu",
+                   pfx->what? pfx->what : "?", 
+                   pfx->offset,
+                  pfx->total);
+         write_status_text (STATUS_PROGRESS, buffer);
+
+         pfx->last = pfx->offset;
+         pfx->last_time = timestamp;
+       }
+    }
+  else if (control == IOBUFCTRL_FREE)
+    {
+      /* Note, that we must always dealloc resources of a filter
+         within the filter handler and not anywhere else.  (We set it
+         to NULL and check all uses just in case.) */
+      xfree (pfx->what);
+      pfx->what = NULL;
+    }
+  else if (control == IOBUFCTRL_DESC)
+    *(char**)buf = "progress_filter";
+  return rc;
+}
+
+void
+handle_progress (progress_filter_context_t *pfx, IOBUF inp, const char *name)
+{
+  off_t filesize = 0;
+
+  if (!opt.enable_progress_filter)
+    return;
+
+  if (!is_status_enabled ())
+    return;
+
+  if ( !iobuf_is_pipe_filename (name) && *name )
+    filesize = iobuf_get_filelength (inp, NULL);
+  else if (opt.set_filesize)
+    filesize = opt.set_filesize;
+
+  /* register the progress filter */
+  pfx->what = xstrdup (name ? name : "stdin");
+  pfx->total = filesize;
+  iobuf_push_filter (inp, progress_filter, pfx);
+}
diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c
new file mode 100644 (file)
index 0000000..cffa79c
--- /dev/null
@@ -0,0 +1,355 @@
+/* pubkey-enc.c -  public key encoded packet handling
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "packet.h"
+#include "mpi.h"
+#include "keydb.h"
+#include "trustdb.h"
+#include "cipher.h"
+#include "status.h"
+#include "options.h"
+#include "main.h"
+#include "i18n.h"
+#include "cardglue.h"
+
+static int get_it( PKT_pubkey_enc *k,
+                  DEK *dek, PKT_secret_key *sk, u32 *keyid );
+
+
+/* check that the given algo is mentioned in one of the valid user IDs */
+static int
+is_algo_in_prefs ( KBNODE keyblock, preftype_t type, int algo )
+{
+    KBNODE k;
+
+    for (k=keyblock; k; k=k->next) {
+        if (k->pkt->pkttype == PKT_USER_ID) {
+            PKT_user_id *uid = k->pkt->pkt.user_id;
+            prefitem_t *prefs = uid->prefs;
+            
+            if (uid->created && prefs &&
+               !uid->is_revoked && !uid->is_expired ) {
+                for (; prefs->type; prefs++ )
+                    if (prefs->type == type && prefs->value == algo)
+                        return 1;
+            }
+        }
+    }
+    return 0;
+}
+
+
+/****************
+ * Get the session key from a pubkey enc packet and return
+ * it in DEK, which should have been allocated in secure memory.
+ */
+int
+get_session_key( PKT_pubkey_enc *k, DEK *dek )
+{
+    PKT_secret_key *sk = NULL;
+    int rc;
+
+    rc = check_pubkey_algo2 (k->pubkey_algo, PUBKEY_USAGE_ENC);
+    if( rc )
+       goto leave;
+
+    if( (k->keyid[0] || k->keyid[1]) && !opt.try_all_secrets ) {
+       sk = xmalloc_clear( sizeof *sk );
+       sk->pubkey_algo = k->pubkey_algo; /* we want a pubkey with this algo*/
+       if( !(rc = get_seckey( sk, k->keyid )) )
+           rc = get_it( k, dek, sk, k->keyid );
+    }
+    else { /* anonymous receiver: Try all available secret keys */
+       void *enum_context = NULL;
+       u32 keyid[2];
+       char *p;
+
+       for(;;) {
+           if( sk )
+               free_secret_key( sk );
+           sk = xmalloc_clear( sizeof *sk );
+           rc=enum_secret_keys( &enum_context, sk, 1, 0);
+           if( rc ) {
+               rc = G10ERR_NO_SECKEY;
+               break;
+           }
+           if( sk->pubkey_algo != k->pubkey_algo )
+               continue;
+           keyid_from_sk( sk, keyid );
+           log_info(_("anonymous recipient; trying secret key %s ...\n"),
+                     keystr(keyid));
+
+           if(!opt.try_all_secrets && !is_status_enabled())
+             {
+               p=get_last_passphrase();
+               set_next_passphrase(p);
+               xfree(p);
+             }
+
+           rc = check_secret_key( sk, opt.try_all_secrets?1:-1 ); /* ask
+                                                                     only
+                                                                     once */
+           if( !rc )
+             {
+               rc = get_it( k, dek, sk, keyid );
+               /* Successfully checked the secret key (either it was
+                  a card, had no passphrase, or had the right
+                  passphrase) but couldn't decrypt the session key,
+                  so thus that key is not the anonymous recipient.
+                  Move the next passphrase into last for the next
+                  round.  We only do this if the secret key was
+                  successfully checked as in the normal case,
+                  check_secret_key handles this for us via
+                  passphrase_to_dek */
+               if(rc)
+                 next_to_last_passphrase();
+             }
+
+           if( !rc )
+             {
+               log_info(_("okay, we are the anonymous recipient.\n") );
+               break;
+             }
+       }
+       enum_secret_keys( &enum_context, NULL, 0, 0 ); /* free context */
+    }
+
+  leave:
+    if( sk )
+       free_secret_key( sk );
+    return rc;
+}
+
+
+static int
+get_it( PKT_pubkey_enc *enc, DEK *dek, PKT_secret_key *sk, u32 *keyid )
+{
+  int rc;
+  MPI plain_dek  = NULL;
+  byte *frame = NULL;
+  unsigned n, nframe;
+  u16 csum, csum2;
+  
+  int card = 0;
+
+  if (sk->is_protected && sk->protect.s2k.mode == 1002)
+    { /* Note, that we only support RSA for now. */
+#ifdef ENABLE_CARD_SUPPORT
+      unsigned char *rbuf;
+      size_t rbuflen;
+      char *snbuf;
+      unsigned char *indata = NULL;
+      unsigned int indatalen;
+
+      snbuf = serialno_and_fpr_from_sk (sk->protect.iv, sk->protect.ivlen, sk);
+
+      indata = mpi_get_buffer (enc->data[0], &indatalen, NULL);
+      if (!indata)
+        BUG ();
+
+      rc = agent_scd_pkdecrypt (snbuf, indata, indatalen, &rbuf, &rbuflen);
+      xfree (snbuf);
+      xfree (indata);
+      if (rc)
+        goto leave;
+
+      frame = rbuf;
+      nframe = rbuflen;
+      card = 1;
+#else
+      rc = G10ERR_UNSUPPORTED;
+      goto leave;
+#endif /*!ENABLE_CARD_SUPPORT*/
+    }
+  else
+    {
+      rc = pubkey_decrypt(sk->pubkey_algo, &plain_dek, enc->data, sk->skey );
+      if( rc )
+       goto leave;
+      frame = mpi_get_buffer( plain_dek, &nframe, NULL );
+      mpi_free( plain_dek ); plain_dek = NULL;
+    }
+
+    /* Now get the DEK (data encryption key) from the frame
+     *
+     * Old versions encode the DEK in in this format (msb is left):
+     *
+     *    0  1  DEK(16 bytes)  CSUM(2 bytes)  0  RND(n bytes) 2
+     *
+     * Later versions encode the DEK like this:
+     *
+     *    0  2  RND(n bytes)  0  A  DEK(k bytes)  CSUM(2 bytes)
+     *
+     * (mpi_get_buffer already removed the leading zero).
+     *
+     * RND are non-zero randow bytes.
+     * A   is the cipher algorithm
+     * DEK is the encryption key (session key) with length k
+     * CSUM
+     */
+    if( DBG_CIPHER )
+       log_hexdump("DEK frame:", frame, nframe );
+    n=0;
+    if (!card)
+      {
+        if( n + 7 > nframe )
+          { rc = G10ERR_WRONG_SECKEY; goto leave; }
+        if( frame[n] == 1 && frame[nframe-1] == 2 ) {
+          log_info(_("old encoding of the DEK is not supported\n"));
+          rc = G10ERR_CIPHER_ALGO;
+          goto leave;
+        }
+        if( frame[n] != 2 )  /* somethink is wrong */
+          { rc = G10ERR_WRONG_SECKEY; goto leave; }
+        for(n++; n < nframe && frame[n]; n++ ) /* skip the random bytes */
+          ;
+        n++; /* and the zero byte */
+      }
+
+    if( n + 4 > nframe )
+       { rc = G10ERR_WRONG_SECKEY; goto leave; }
+
+    dek->keylen = nframe - (n+1) - 2;
+    dek->algo = frame[n++];
+    if( dek->algo ==  CIPHER_ALGO_IDEA )
+       write_status(STATUS_RSA_OR_IDEA);
+    rc = check_cipher_algo( dek->algo );
+    if( rc ) {
+       if( !opt.quiet && rc == G10ERR_CIPHER_ALGO ) {
+           log_info(_("cipher algorithm %d%s is unknown or disabled\n"),
+                     dek->algo, dek->algo == CIPHER_ALGO_IDEA? " (IDEA)":"");
+           if(dek->algo==CIPHER_ALGO_IDEA)
+             idea_cipher_warn(0);
+       }
+       dek->algo = 0;
+       goto leave;
+    }
+    if( (dek->keylen*8) != cipher_get_keylen( dek->algo ) ) {
+       rc = G10ERR_WRONG_SECKEY;
+       goto leave;
+    }
+
+    /* copy the key to DEK and compare the checksum */
+    csum  = frame[nframe-2] << 8;
+    csum |= frame[nframe-1];
+    memcpy( dek->key, frame+n, dek->keylen );
+    for( csum2=0, n=0; n < dek->keylen; n++ )
+       csum2 += dek->key[n];
+    if( csum != csum2 ) {
+       rc = G10ERR_WRONG_SECKEY;
+       goto leave;
+    }
+    if( DBG_CIPHER )
+       log_hexdump("DEK is:", dek->key, dek->keylen );
+    /* check that the algo is in the preferences and whether it has expired */
+    {
+       PKT_public_key *pk = NULL;
+        KBNODE pkb = get_pubkeyblock (keyid);
+
+       if( !pkb ) {
+            rc = -1;
+           log_error("oops: public key not found for preference check\n");
+        }
+       else if(pkb->pkt->pkt.public_key->selfsigversion > 3
+               && dek->algo != CIPHER_ALGO_3DES
+               && !opt.quiet
+               && !is_algo_in_prefs( pkb, PREFTYPE_SYM, dek->algo ))
+         log_info(_("WARNING: cipher algorithm %s not found in recipient"
+                    " preferences\n"),cipher_algo_to_string(dek->algo));
+        if (!rc) {
+            KBNODE k;
+            
+            for (k=pkb; k; k = k->next) {
+                if (k->pkt->pkttype == PKT_PUBLIC_KEY 
+                    || k->pkt->pkttype == PKT_PUBLIC_SUBKEY){
+                    u32 aki[2];
+                   keyid_from_pk(k->pkt->pkt.public_key, aki);
+
+                    if (aki[0]==keyid[0] && aki[1]==keyid[1]) {
+                        pk = k->pkt->pkt.public_key;
+                        break;
+                    }
+                }
+            }
+            if (!pk)
+                BUG ();
+            if ( pk->expiredate && pk->expiredate <= make_timestamp() ) {
+                log_info(_("NOTE: secret key %s expired at %s\n"),
+                         keystr(keyid), asctimestamp( pk->expiredate) );
+            }
+        }
+
+        if ( pk &&  pk->is_revoked ) {
+            log_info( _("NOTE: key has been revoked") );
+            putc( '\n', log_stream() );
+            show_revocation_reason( pk, 1 );
+        }
+
+       release_kbnode (pkb);
+       rc = 0;
+    }
+
+
+  leave:
+    mpi_free(plain_dek);
+    xfree(frame);
+    return rc;
+}
+
+
+/****************
+ * Get the session key from the given string.
+ * String is supposed to be formatted as this:
+ *  <algo-id>:<even-number-of-hex-digits>
+ */
+int
+get_override_session_key( DEK *dek, const char *string )
+{
+    const char *s;
+    int i;
+
+    if ( !string )
+       return G10ERR_BAD_KEY;
+    dek->algo = atoi(string);
+    if ( dek->algo < 1 )
+       return G10ERR_BAD_KEY;
+    if ( !(s = strchr ( string, ':' )) )
+       return G10ERR_BAD_KEY;
+    s++;
+    for(i=0; i < DIM(dek->key) && *s; i++, s +=2 ) {
+       int c = hextobyte ( s );
+       if (c == -1)
+           return G10ERR_BAD_KEY;
+       dek->key[i] = c;
+    }
+    if ( *s )
+       return G10ERR_BAD_KEY;
+    dek->keylen = i;
+    return 0;
+}
+
diff --git a/g10/revoke.c b/g10/revoke.c
new file mode 100644 (file)
index 0000000..c2deefa
--- /dev/null
@@ -0,0 +1,738 @@
+/* revoke.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "ttyio.h"
+#include "status.h"
+#include "i18n.h"
+
+
+struct revocation_reason_info {
+    int code;
+    char *desc;
+};
+
+
+int
+revocation_reason_build_cb( PKT_signature *sig, void *opaque )
+{
+    struct revocation_reason_info *reason = opaque;
+    char *ud = NULL;
+    byte *buffer;
+    size_t buflen = 1;
+
+    if(!reason)
+      return 0;
+
+    if( reason->desc ) {
+       ud = native_to_utf8( reason->desc );
+       buflen += strlen(ud);
+    }
+    buffer = xmalloc( buflen );
+    *buffer = reason->code;
+    if( ud ) {
+       memcpy(buffer+1, ud, strlen(ud) );
+       xfree( ud );
+    }
+
+    build_sig_subpkt( sig, SIGSUBPKT_REVOC_REASON, buffer, buflen );
+    xfree( buffer );
+    return 0;
+}
+
+/* Outputs a minimal pk (as defined by 2440) from a keyblock.  A
+   minimal pk consists of the public key packet and a user ID.  We try
+   and pick a user ID that has a uid signature, and include it if
+   possible. */
+static int
+export_minimal_pk(IOBUF out,KBNODE keyblock,
+                 PKT_signature *revsig,PKT_signature *revkey)
+{
+  KBNODE node;
+  PACKET pkt;
+  PKT_user_id *uid=NULL;
+  PKT_signature *selfsig=NULL;
+  u32 keyid[2];
+  int rc;
+
+  node=find_kbnode(keyblock,PKT_PUBLIC_KEY);
+  if(!node)
+    {
+      log_error("key incomplete\n");
+      return G10ERR_GENERAL;
+    }
+
+  keyid_from_pk(node->pkt->pkt.public_key,keyid);
+
+  pkt=*node->pkt;
+  rc=build_packet(out,&pkt);
+  if(rc)
+    {
+      log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
+      return rc;
+    }
+
+  init_packet(&pkt);
+  pkt.pkttype=PKT_SIGNATURE;
+
+  /* the revocation itself, if any.  2440 likes this to come first. */
+  if(revsig)
+    {
+      pkt.pkt.signature=revsig;
+      rc=build_packet(out,&pkt);
+      if(rc)
+       {
+         log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
+         return rc;
+       }
+    }
+
+  /* If a revkey in a 1F sig is present, include it too */
+  if(revkey)
+    {
+      pkt.pkt.signature=revkey;
+      rc=build_packet(out,&pkt);
+      if(rc)
+       {
+         log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
+         return rc;
+       }
+    }
+
+  while(!selfsig)
+    {
+      KBNODE signode;
+
+      node=find_next_kbnode(node,PKT_USER_ID);
+      if(!node)
+       {
+         /* We're out of user IDs - none were self-signed. */
+         if(uid)
+           break;
+         else
+           {
+             log_error(_("key %s has no user IDs\n"),keystr(keyid));
+             return G10ERR_GENERAL;
+           }
+       }
+
+      if(node->pkt->pkt.user_id->attrib_data)
+       continue;
+
+      uid=node->pkt->pkt.user_id;
+      signode=node;
+
+      while((signode=find_next_kbnode(signode,PKT_SIGNATURE)))
+       {
+         if(keyid[0]==signode->pkt->pkt.signature->keyid[0] &&
+            keyid[1]==signode->pkt->pkt.signature->keyid[1] &&
+            IS_UID_SIG(signode->pkt->pkt.signature))
+           {
+             selfsig=signode->pkt->pkt.signature;
+             break;
+           }
+       }
+    }
+
+  pkt.pkttype=PKT_USER_ID;
+  pkt.pkt.user_id=uid;
+
+  rc=build_packet(out,&pkt);
+  if(rc)
+    {
+      log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
+      return rc;
+    }
+
+  if(selfsig)
+    {
+      pkt.pkttype=PKT_SIGNATURE;
+      pkt.pkt.signature=selfsig;
+
+      rc=build_packet(out,&pkt);
+      if(rc)
+       {
+         log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
+         return rc;
+       }
+    }
+
+  return 0;
+}
+
+/****************
+ * Generate a revocation certificate for UNAME via a designated revoker
+ */
+int
+gen_desig_revoke( const char *uname, STRLIST locusr )
+{
+    int rc = 0;
+    armor_filter_context_t afx;
+    PKT_public_key *pk = NULL;
+    PKT_secret_key *sk = NULL;
+    PKT_signature *sig = NULL;
+    IOBUF out = NULL;
+    struct revocation_reason_info *reason = NULL;
+    KEYDB_HANDLE kdbhd;
+    KEYDB_SEARCH_DESC desc;
+    KBNODE keyblock=NULL,node;
+    u32 keyid[2];
+    int i,any=0;
+    SK_LIST sk_list=NULL;
+
+    if( opt.batch )
+      {
+       log_error(_("can't do this in batch mode\n"));
+       return G10ERR_GENERAL;
+      }
+
+    memset( &afx, 0, sizeof afx);
+
+    kdbhd = keydb_new (0);
+    classify_user_id (uname, &desc);
+    rc = desc.mode? keydb_search (kdbhd, &desc, 1) : G10ERR_INV_USER_ID;
+    if (rc) {
+       log_error (_("key \"%s\" not found: %s\n"),uname, g10_errstr (rc));
+       goto leave;
+    }
+
+    rc = keydb_get_keyblock (kdbhd, &keyblock );
+    if( rc ) {
+       log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+       goto leave;
+    }
+
+    /* To parse the revkeys */
+    merge_keys_and_selfsig(keyblock);
+
+    /* get the key from the keyblock */
+    node = find_kbnode( keyblock, PKT_PUBLIC_KEY );
+    if( !node ) 
+      BUG ();
+
+    pk=node->pkt->pkt.public_key;
+
+    keyid_from_pk(pk,keyid);
+
+    if(locusr)
+      {
+       rc=build_sk_list(locusr,&sk_list,0,PUBKEY_USAGE_CERT);
+       if(rc)
+         goto leave;
+      }
+
+    /* Are we a designated revoker for this key? */
+
+    if(!pk->revkey && pk->numrevkeys)
+      BUG();
+
+    for(i=0;i<pk->numrevkeys;i++)
+      {
+       SK_LIST list;
+
+       if(sk)
+         free_secret_key(sk);
+
+       if(sk_list)
+         {
+           for(list=sk_list;list;list=list->next)
+             {
+               byte fpr[MAX_FINGERPRINT_LEN];
+               size_t fprlen;
+
+               fingerprint_from_sk(list->sk,fpr,&fprlen);
+
+               /* Don't get involved with keys that don't have 160
+                  bit fingerprints */
+               if(fprlen!=20)
+                 continue;
+
+               if(memcmp(fpr,pk->revkey[i].fpr,20)==0)
+                 break;
+             }
+
+           if(list)
+             sk=copy_secret_key(NULL,list->sk);
+           else
+             continue;
+         }
+       else
+         {
+           sk=xmalloc_secure_clear(sizeof(*sk));
+           rc=get_seckey_byfprint(sk,pk->revkey[i].fpr,MAX_FINGERPRINT_LEN);
+         }
+
+       /* We have the revocation key */
+       if(!rc)
+         {
+           PKT_signature *revkey = NULL;
+
+           any = 1;
+
+            print_pubkey_info (NULL, pk);
+           tty_printf ("\n");
+
+           tty_printf (_("To be revoked by:\n"));
+            print_seckey_info (sk);
+
+           if(pk->revkey[i].class&0x40)
+             tty_printf(_("(This is a sensitive revocation key)\n"));
+           tty_printf("\n");
+
+           if( !cpr_get_answer_is_yes("gen_desig_revoke.okay",
+         _("Create a designated revocation certificate for this key? (y/N) ")))
+             continue;
+
+           /* get the reason for the revocation (this is always v4) */
+           reason = ask_revocation_reason( 1, 0, 1 );
+           if( !reason )
+             continue;
+
+           rc = check_secret_key( sk, 0 );
+           if( rc )
+             continue;
+
+           if( !opt.armor )
+             tty_printf(_("ASCII armored output forced.\n"));
+
+           if( (rc = open_outfile( NULL, 0, &out )) )
+             goto leave;
+
+           afx.what = 1;
+           afx.hdrlines = "Comment: A designated revocation certificate"
+             " should follow\n";
+           iobuf_push_filter( out, armor_filter, &afx );
+
+           /* create it */
+           rc = make_keysig_packet( &sig, pk, NULL, NULL, sk, 0x20, 0,
+                                    0, 0, 0,
+                                    revocation_reason_build_cb, reason );
+           if( rc ) {
+             log_error(_("make_keysig_packet failed: %s\n"), g10_errstr(rc));
+             goto leave;
+           }
+
+           /* Spit out a minimal pk as well, since otherwise there is
+               no way to know which key to attach this revocation to.
+               Also include the direct key signature that contains
+               this revocation key.  We're allowed to include
+               sensitive revocation keys along with a revocation, as
+               this may be the only time the recipient has seen it.
+               Note that this means that if we have multiple different
+               sensitive revocation keys in a given direct key
+               signature, we're going to include them all here.  This
+               is annoying, but the good outweighs the bad, since
+               without including this a sensitive revoker can't really
+               do their job.  People should not include multiple
+               sensitive revocation keys in one signature: 2440 says
+               "Note that it may be appropriate to isolate this
+               subpacket within a separate signature so that it is not
+               combined with other subpackets that need to be
+               exported." -dms */
+
+           while(!revkey)
+             {
+               KBNODE signode;
+
+               signode=find_next_kbnode(node,PKT_SIGNATURE);
+               if(!signode)
+                 break;
+
+               node=signode;
+
+               if(keyid[0]==signode->pkt->pkt.signature->keyid[0] &&
+                  keyid[1]==signode->pkt->pkt.signature->keyid[1] &&
+                  IS_KEY_SIG(signode->pkt->pkt.signature))
+                 {
+                   int j;
+
+                   for(j=0;j<signode->pkt->pkt.signature->numrevkeys;j++)
+                     {
+                       if(pk->revkey[i].class==
+                          signode->pkt->pkt.signature->revkey[j]->class &&
+                          pk->revkey[i].algid==
+                          signode->pkt->pkt.signature->revkey[j]->algid &&
+                          memcmp(pk->revkey[i].fpr,
+                                 signode->pkt->pkt.signature->revkey[j]->fpr,
+                                 MAX_FINGERPRINT_LEN)==0)
+                         {
+                           revkey=signode->pkt->pkt.signature;
+                           break;
+                         }
+                     }
+                 }
+             }
+
+           if(!revkey)
+             BUG();
+
+           rc=export_minimal_pk(out,keyblock,sig,revkey);
+           if(rc)
+             goto leave;
+
+           /* and issue a usage notice */
+           tty_printf(_("Revocation certificate created.\n"));
+           break;
+         }
+      }
+
+    if(!any)
+      log_error(_("no revocation keys found for \"%s\"\n"),uname);
+
+  leave:
+    if( pk )
+       free_public_key( pk );
+    if( sk )
+       free_secret_key( sk );
+    if( sig )
+       free_seckey_enc( sig );
+
+    release_sk_list(sk_list);
+
+    if( rc )
+       iobuf_cancel(out);
+    else
+       iobuf_close(out);
+    release_revocation_reason_info( reason );
+    return rc;
+}
+
+
+/****************
+ * Generate a revocation certificate for UNAME
+ */
+int
+gen_revoke( const char *uname )
+{
+    int rc = 0;
+    armor_filter_context_t afx;
+    PACKET pkt;
+    PKT_secret_key *sk; /* used as pointer into a kbnode */
+    PKT_public_key *pk = NULL;
+    PKT_signature *sig = NULL;
+    u32 sk_keyid[2];
+    IOBUF out = NULL;
+    KBNODE keyblock = NULL, pub_keyblock = NULL;
+    KBNODE node;
+    KEYDB_HANDLE kdbhd;
+    struct revocation_reason_info *reason = NULL;
+    KEYDB_SEARCH_DESC desc;
+
+    if( opt.batch )
+      {
+       log_error(_("can't do this in batch mode\n"));
+       return G10ERR_GENERAL;
+      }
+
+    memset( &afx, 0, sizeof afx);
+    init_packet( &pkt );
+
+    /* search the userid: 
+     * We don't want the whole getkey stuff here but the entire keyblock
+     */
+    kdbhd = keydb_new (1);
+    classify_user_id (uname, &desc);
+    rc = desc.mode? keydb_search (kdbhd, &desc, 1) : G10ERR_INV_USER_ID;
+    if (rc)
+      {
+       log_error (_("secret key \"%s\" not found: %s\n"),
+                   uname, g10_errstr (rc));
+       goto leave;
+      }
+
+    rc = keydb_get_keyblock (kdbhd, &keyblock );
+    if( rc ) {
+       log_error (_("error reading keyblock: %s\n"), g10_errstr(rc) );
+       goto leave;
+    }
+
+    /* get the keyid from the keyblock */
+    node = find_kbnode( keyblock, PKT_SECRET_KEY );
+    if( !node ) 
+       BUG ();
+
+    /* fixme: should make a function out of this stuff,
+     * it's used all over the source */
+    sk = node->pkt->pkt.secret_key;
+    keyid_from_sk( sk, sk_keyid );
+    print_seckey_info (sk);
+
+    pk = xmalloc_clear( sizeof *pk );
+
+    /* FIXME: We should get the public key direct from the secret one */
+
+    pub_keyblock=get_pubkeyblock(sk_keyid);
+    if(!pub_keyblock)
+      {
+       log_error(_("no corresponding public key: %s\n"), g10_errstr(rc) );
+       goto leave;
+      }
+
+    node=find_kbnode(pub_keyblock,PKT_PUBLIC_KEY);
+    if(!node)
+      BUG();
+
+    pk=node->pkt->pkt.public_key;
+
+    if( cmp_public_secret_key( pk, sk ) ) {
+       log_error(_("public key does not match secret key!\n") );
+       rc = G10ERR_GENERAL;
+       goto leave;
+    }
+
+    tty_printf("\n");
+    if( !cpr_get_answer_is_yes("gen_revoke.okay",
+                 _("Create a revocation certificate for this key? (y/N) ")) )
+      {
+       rc = 0;
+       goto leave;
+      }
+
+    if(sk->version>=4 || opt.force_v4_certs) {
+      /* get the reason for the revocation */
+      reason = ask_revocation_reason( 1, 0, 1 );
+      if( !reason ) { /* user decided to cancel */
+       rc = 0;
+       goto leave;
+      }
+    }
+
+    switch( is_secret_key_protected( sk ) ) {
+      case -1:
+       log_error(_("unknown protection algorithm\n"));
+       rc = G10ERR_PUBKEY_ALGO;
+       break;
+      case -3:
+       tty_printf (_("Secret parts of primary key are not available.\n"));
+        rc = G10ERR_NO_SECKEY;
+        break;
+      case 0:
+       tty_printf(_("NOTE: This key is not protected!\n"));
+       break;
+      default:
+        rc = check_secret_key( sk, 0 );
+       break;
+    }
+    if( rc )
+       goto leave;
+
+
+    if( !opt.armor )
+       tty_printf(_("ASCII armored output forced.\n"));
+
+    if( (rc = open_outfile( NULL, 0, &out )) )
+       goto leave;
+
+    afx.what = 1;
+    afx.hdrlines = "Comment: A revocation certificate should follow\n";
+    iobuf_push_filter( out, armor_filter, &afx );
+
+    /* create it */
+    rc = make_keysig_packet( &sig, pk, NULL, NULL, sk, 0x20, 0,
+                            opt.force_v4_certs?4:0, 0, 0,
+                            revocation_reason_build_cb, reason );
+    if( rc ) {
+       log_error(_("make_keysig_packet failed: %s\n"), g10_errstr(rc));
+       goto leave;
+    }
+
+    if(PGP2 || PGP6 || PGP7 || PGP8)
+      {
+       /* Use a minimal pk for PGPx mode, since PGP can't import bare
+          revocation certificates. */
+       rc=export_minimal_pk(out,pub_keyblock,sig,NULL);
+       if(rc)
+         goto leave;
+      }
+    else
+      {
+       init_packet( &pkt );
+       pkt.pkttype = PKT_SIGNATURE;
+       pkt.pkt.signature = sig;
+
+       rc = build_packet( out, &pkt );
+       if( rc ) {
+         log_error(_("build_packet failed: %s\n"), g10_errstr(rc) );
+         goto leave;
+       }
+      }
+
+    /* and issue a usage notice */
+    tty_printf(_("Revocation certificate created.\n\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"));
+
+  leave:
+    if( sig )
+       free_seckey_enc( sig );
+    release_kbnode( keyblock );
+    release_kbnode( pub_keyblock );
+    keydb_release (kdbhd);
+    if( rc )
+       iobuf_cancel(out);
+    else
+       iobuf_close(out);
+    release_revocation_reason_info( reason );
+    return rc;
+}
+
+
+
+struct revocation_reason_info *
+ask_revocation_reason( int key_rev, int cert_rev, int hint )
+{
+    int code=-1;
+    char *description = NULL;
+    struct revocation_reason_info *reason;
+    const char *text_0 = _("No reason specified");
+    const char *text_1 = _("Key has been compromised");
+    const char *text_2 = _("Key is superseded");
+    const char *text_3 = _("Key is no longer used");
+    const char *text_4 = _("User ID is no longer valid");
+    const char *code_text = NULL;
+
+    do {
+        code=-1;
+       xfree(description);
+       description = NULL;
+
+       tty_printf(_("Please select the reason for the revocation:\n"));
+       tty_printf(    "  0 = %s\n", text_0 );
+       if( key_rev )
+           tty_printf("  1 = %s\n", text_1 );
+       if( key_rev )
+           tty_printf("  2 = %s\n", text_2 );
+       if( key_rev )
+           tty_printf("  3 = %s\n", text_3 );
+       if( cert_rev )
+           tty_printf("  4 = %s\n", text_4 );
+       tty_printf(    "  Q = %s\n", _("Cancel") );
+       if( hint )
+           tty_printf(_("(Probably you want to select %d here)\n"), hint );
+
+       while(code==-1) {
+           int n;
+           char *answer = cpr_get("ask_revocation_reason.code",
+                                               _("Your decision? "));
+           trim_spaces( answer );
+           cpr_kill_prompt();
+           if( *answer == 'q' || *answer == 'Q')
+             return NULL; /* cancel */
+           if( hint && !*answer )
+               n = hint;
+           else if(!digitp( answer ) )
+               n = -1;
+           else
+               n = atoi(answer);
+           xfree(answer);
+           if( n == 0 ) {
+               code = 0x00; /* no particular reason */
+               code_text = text_0;
+           }
+           else if( key_rev && n == 1 ) {
+               code = 0x02; /* key has been compromised */
+               code_text = text_1;
+           }
+           else if( key_rev && n == 2 ) {
+               code = 0x01; /* key is superseded */
+               code_text = text_2;
+           }
+           else if( key_rev && n == 3 ) {
+               code = 0x03; /* key is no longer used */
+               code_text = text_3;
+           }
+           else if( cert_rev && n == 4 ) {
+               code = 0x20; /* uid is no longer valid */
+               code_text = text_4;
+           }
+           else
+               tty_printf(_("Invalid selection.\n"));
+       }
+
+       tty_printf(_("Enter an optional description; "
+                    "end it with an empty line:\n") );
+       for(;;) {
+           char *answer = cpr_get("ask_revocation_reason.text", "> " );
+           trim_trailing_ws( answer, strlen(answer) );
+           cpr_kill_prompt();
+           if( !*answer ) {
+               xfree(answer);
+               break;
+           }
+
+           {
+               char *p = make_printable_string( answer, strlen(answer), 0 );
+               xfree(answer);
+               answer = p;
+           }
+
+           if( !description )
+               description = xstrdup(answer);
+           else {
+               char *p = xmalloc( strlen(description) + strlen(answer) + 2 );
+               strcpy(stpcpy(stpcpy( p, description),"\n"),answer);
+               xfree(description);
+               description = p;
+           }
+           xfree(answer);
+       }
+
+       tty_printf(_("Reason for revocation: %s\n"), code_text );
+       if( !description )
+           tty_printf(_("(No description given)\n") );
+       else
+           tty_printf("%s\n", description );
+
+    } while( !cpr_get_answer_is_yes("ask_revocation_reason.okay",
+                                           _("Is this okay? (y/N) "))  );
+
+    reason = xmalloc( sizeof *reason );
+    reason->code = code;
+    reason->desc = description;
+    return reason;
+}
+
+void
+release_revocation_reason_info( struct revocation_reason_info *reason )
+{
+    if( reason ) {
+       xfree( reason->desc );
+       xfree( reason );
+    }
+}
diff --git a/g10/seckey-cert.c b/g10/seckey-cert.c
new file mode 100644 (file)
index 0000000..79cf22a
--- /dev/null
@@ -0,0 +1,427 @@
+/* seckey-cert.c -  secret key certificate packet handling
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "memory.h"
+#include "packet.h"
+#include "mpi.h"
+#include "keydb.h"
+#include "cipher.h"
+#include "main.h"
+#include "options.h"
+#include "i18n.h"
+#include "status.h"
+
+
+static int
+do_check( PKT_secret_key *sk, const char *tryagain_text, int mode,
+          int *canceled )
+{
+    byte *buffer;
+    u16 csum=0;
+    int i, res;
+    unsigned nbytes;
+
+    if( sk->is_protected ) { /* remove the protection */
+       DEK *dek = NULL;
+       u32 keyid[4]; /* 4! because we need two of them */
+       CIPHER_HANDLE cipher_hd=NULL;
+       PKT_secret_key *save_sk;
+
+       if( sk->protect.s2k.mode == 1001 ) {
+           log_info(_("secret key parts are not available\n"));
+           return G10ERR_GENERAL;
+       }
+       if( sk->protect.algo == CIPHER_ALGO_NONE )
+           BUG();
+       if( check_cipher_algo( sk->protect.algo ) ) {
+           log_info(_("protection algorithm %d%s is not supported\n"),
+                       sk->protect.algo,sk->protect.algo==1?" (IDEA)":"" );
+           if (sk->protect.algo==CIPHER_ALGO_IDEA)
+              {
+                write_status (STATUS_RSA_OR_IDEA);
+                idea_cipher_warn (0);
+              }
+           return G10ERR_CIPHER_ALGO;
+       }
+       if(check_digest_algo(sk->protect.s2k.hash_algo))
+         {
+           log_info(_("protection digest %d is not supported\n"),
+                    sk->protect.s2k.hash_algo);
+           return G10ERR_DIGEST_ALGO;
+         }
+       keyid_from_sk( sk, keyid );
+       keyid[2] = keyid[3] = 0;
+       if( !sk->is_primary ) {
+            keyid[2] = sk->main_keyid[0];
+            keyid[3] = sk->main_keyid[1];
+       }
+       dek = passphrase_to_dek( keyid, sk->pubkey_algo, sk->protect.algo,
+                                &sk->protect.s2k, mode,
+                                 tryagain_text, canceled );
+        if (!dek && canceled && *canceled)
+           return G10ERR_GENERAL;
+
+       cipher_hd = cipher_open( sk->protect.algo,
+                                CIPHER_MODE_AUTO_CFB, 1);
+       cipher_setkey( cipher_hd, dek->key, dek->keylen );
+       xfree(dek);
+       save_sk = copy_secret_key( NULL, sk );
+       cipher_setiv( cipher_hd, sk->protect.iv, sk->protect.ivlen );
+       csum = 0;
+       if( sk->version >= 4 ) {
+           unsigned int ndata;
+           byte *p, *data;
+            u16 csumc = 0;
+
+           i = pubkey_get_npkey(sk->pubkey_algo);
+           assert( mpi_is_opaque( sk->skey[i] ) );
+           p = mpi_get_opaque( sk->skey[i], &ndata );
+            if ( ndata > 1 )
+                csumc = p[ndata-2] << 8 | p[ndata-1];
+           data = xmalloc_secure( ndata );
+           cipher_decrypt( cipher_hd, data, p, ndata );
+           mpi_free( sk->skey[i] ); sk->skey[i] = NULL ;
+           p = data;
+            if (sk->protect.sha1chk) {
+                /* This is the new SHA1 checksum method to detect
+                   tampering with the key as used by the Klima/Rosa
+                   attack */
+                sk->csum = 0;
+                csum = 1;
+                if( ndata < 20 ) 
+                    log_error("not enough bytes for SHA-1 checksum\n");
+                else {
+                    MD_HANDLE h = md_open (DIGEST_ALGO_SHA1, 1);
+                    if (!h)
+                        BUG(); /* algo not available */
+                    md_write (h, data, ndata - 20);
+                    md_final (h);
+                    if (!memcmp (md_read (h, DIGEST_ALGO_SHA1),
+                                 data + ndata - 20, 20) ) {
+                        /* digest does match.  We have to keep the old
+                           style checksum in sk->csum, so that the
+                           test used for unprotected keys does work.
+                           This test gets used when we are adding new
+                           keys. */
+                        sk->csum = csum = checksum (data, ndata-20);
+                    }
+                    md_close (h);
+                }
+            }
+            else {
+                if( ndata < 2 ) {
+                    log_error("not enough bytes for checksum\n");
+                    sk->csum = 0;
+                    csum = 1;
+                }
+                else {
+                    csum = checksum( data, ndata-2);
+                    sk->csum = data[ndata-2] << 8 | data[ndata-1];
+                    if ( sk->csum != csum ) {
+                        /* This is a PGP 7.0.0 workaround */
+                        sk->csum = csumc; /* take the encrypted one */
+                    }
+                }
+            }
+
+            /* Must check it here otherwise the mpi_read_xx would fail
+               because the length may have an arbitrary value */
+            if( sk->csum == csum ) {
+                for( ; i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {
+                    nbytes = ndata;
+                    sk->skey[i] = mpi_read_from_buffer(p, &nbytes, 1 );
+                    if (!sk->skey[i])
+                      {
+                        /* Checksum was okay, but not correctly
+                           decrypted.  */
+                        sk->csum = 0;
+                        csum = 1;
+                        break;
+                      }
+                    ndata -= nbytes;
+                    p += nbytes;
+                }
+                /* Note: at this point ndata should be 2 for a simple
+                   checksum or 20 for the sha1 digest */
+            }
+           xfree(data);
+       }
+       else {
+           for(i=pubkey_get_npkey(sk->pubkey_algo);
+                   i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {
+                byte *p;
+                unsigned int ndata;
+
+                assert (mpi_is_opaque (sk->skey[i]));
+                p = mpi_get_opaque (sk->skey[i], &ndata);
+                assert (ndata >= 2);
+                assert (ndata == ((p[0] << 8 | p[1]) + 7)/8 + 2);
+                buffer = xmalloc_secure (ndata);
+               cipher_sync (cipher_hd);
+                buffer[0] = p[0];
+                buffer[1] = p[1];
+                cipher_decrypt (cipher_hd, buffer+2, p+2, ndata-2);
+                csum += checksum (buffer, ndata);
+                mpi_free (sk->skey[i]);
+                sk->skey[i] = mpi_read_from_buffer (buffer, &ndata, 1);
+               xfree (buffer);
+                if (!sk->skey[i])
+                  {
+                    /* Checksum was okay, but not correctly
+                       decrypted.  */
+                    sk->csum = 0;
+                    csum = 1;
+                    break;
+                  }
+/*             csum += checksum_mpi (sk->skey[i]); */
+           }
+       }
+       cipher_close( cipher_hd );
+       /* now let's see whether we have used the right passphrase */
+       if( csum != sk->csum ) {
+           copy_secret_key( sk, save_sk );
+            passphrase_clear_cache ( keyid, NULL, sk->pubkey_algo );
+           free_secret_key( save_sk );
+           return G10ERR_BAD_PASS;
+       }
+       /* the checksum may fail, so we also check the key itself */
+       res = pubkey_check_secret_key( sk->pubkey_algo, sk->skey );
+       if( res ) {
+           copy_secret_key( sk, save_sk );
+            passphrase_clear_cache ( keyid, NULL, sk->pubkey_algo );
+           free_secret_key( save_sk );
+           return G10ERR_BAD_PASS;
+       }
+       free_secret_key( save_sk );
+       sk->is_protected = 0;
+    }
+    else { /* not protected, assume it is okay if the checksum is okay */
+       csum = 0;
+       for(i=pubkey_get_npkey(sk->pubkey_algo);
+               i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {
+           csum += checksum_mpi( sk->skey[i] );
+       }
+       if( csum != sk->csum )
+           return G10ERR_CHECKSUM;
+    }
+
+    return 0;
+}
+
+
+
+/****************
+ * Check the secret key
+ * Ask up to 3 (or n) times for a correct passphrase
+ * If n is negative, disable the key info prompt and make n=abs(n)
+ */
+int
+check_secret_key( PKT_secret_key *sk, int n )
+{
+    int rc = G10ERR_BAD_PASS;
+    int i,mode;
+
+    if (sk && sk->is_protected && sk->protect.s2k.mode == 1002)
+      return 0; /* Let the card support stuff handle this. */
+
+    if(n<0)
+      {
+       n=abs(n);
+       mode=1;
+      }
+    else
+      mode=0;
+
+    if( n < 1 )
+       n = (opt.batch && !opt.use_agent)? 1 : 3; /* use the default value */
+
+    for(i=0; i < n && rc == G10ERR_BAD_PASS; i++ ) {
+        int canceled = 0;
+        const char *tryagain = NULL;
+       if (i) {
+            tryagain = N_("Invalid passphrase; please try again");
+            log_info (_("%s ...\n"), _(tryagain));
+        }
+       rc = do_check( sk, tryagain, mode, &canceled );
+       if( rc == G10ERR_BAD_PASS && is_status_enabled() ) {
+           u32 kid[2];
+           char buf[50];
+
+           keyid_from_sk( sk, kid );
+           sprintf(buf, "%08lX%08lX", (ulong)kid[0], (ulong)kid[1]);
+           write_status_text( STATUS_BAD_PASSPHRASE, buf );
+       }
+       if( have_static_passphrase() || canceled)
+           break;
+    }
+
+    if( !rc )
+       write_status( STATUS_GOOD_PASSPHRASE );
+
+    return rc;
+}
+
+/****************
+ * check whether the secret key is protected.
+ * Returns: 0 not protected, -1 on error or the protection algorithm
+ *                           -2 indicates a card stub.
+ *                           -3 indicates a not-online stub.
+ */
+int
+is_secret_key_protected( PKT_secret_key *sk )
+{
+    return sk->is_protected?
+               sk->protect.s2k.mode == 1002? -2 :
+               sk->protect.s2k.mode == 1001? -3 : sk->protect.algo : 0;
+}
+
+
+
+/****************
+ * Protect the secret key with the passphrase from DEK
+ */
+int
+protect_secret_key( PKT_secret_key *sk, DEK *dek )
+{
+    int i,j, rc = 0;
+    byte *buffer;
+    unsigned nbytes;
+    u16 csum;
+
+    if( !dek )
+       return 0;
+
+    if( !sk->is_protected ) { /* okay, apply the protection */
+       CIPHER_HANDLE cipher_hd=NULL;
+
+       if( check_cipher_algo( sk->protect.algo ) )
+           rc = G10ERR_CIPHER_ALGO; /* unsupport protection algorithm */
+       else {
+           print_cipher_algo_note( sk->protect.algo );
+           cipher_hd = cipher_open( sk->protect.algo,
+                                    CIPHER_MODE_AUTO_CFB, 1 );
+           if( cipher_setkey( cipher_hd, dek->key, dek->keylen ) )
+               log_info(_("WARNING: Weak key detected"
+                          " - please change passphrase again.\n"));
+           sk->protect.ivlen = cipher_get_blocksize( sk->protect.algo );
+           assert( sk->protect.ivlen <= DIM(sk->protect.iv) );
+           if( sk->protect.ivlen != 8 && sk->protect.ivlen != 16 )
+               BUG(); /* yes, we are very careful */
+           randomize_buffer(sk->protect.iv, sk->protect.ivlen, 1);
+           cipher_setiv( cipher_hd, sk->protect.iv, sk->protect.ivlen );
+           if( sk->version >= 4 ) {
+                byte *bufarr[PUBKEY_MAX_NSKEY];
+               unsigned narr[PUBKEY_MAX_NSKEY];
+               unsigned nbits[PUBKEY_MAX_NSKEY];
+               int ndata=0;
+               byte *p, *data;
+
+               for(j=0, i = pubkey_get_npkey(sk->pubkey_algo);
+                       i < pubkey_get_nskey(sk->pubkey_algo); i++, j++ ) {
+                   assert( !mpi_is_opaque( sk->skey[i] ) );
+                   bufarr[j] = mpi_get_buffer( sk->skey[i], &narr[j], NULL );
+                   nbits[j]  = mpi_get_nbits( sk->skey[i] );
+                   ndata += narr[j] + 2;
+               }
+               for( ; j < PUBKEY_MAX_NSKEY; j++ )
+                   bufarr[j] = NULL;
+               ndata += opt.simple_sk_checksum? 2 : 20; /* for checksum */
+
+               data = xmalloc_secure( ndata );
+               p = data;
+               for(j=0; j < PUBKEY_MAX_NSKEY && bufarr[j]; j++ ) {
+                   p[0] = nbits[j] >> 8 ;
+                   p[1] = nbits[j];
+                   p += 2;
+                   memcpy(p, bufarr[j], narr[j] );
+                   p += narr[j];
+                   xfree(bufarr[j]);
+               }
+                
+                if (opt.simple_sk_checksum) {
+                    log_info (_("generating the deprecated 16-bit checksum"
+                              " for secret key protection\n")); 
+                    csum = checksum( data, ndata-2);
+                    sk->csum = csum;
+                    *p++ =     csum >> 8;
+                    *p++ =     csum;
+                    sk->protect.sha1chk = 0;
+                }
+                else {
+                    MD_HANDLE h = md_open (DIGEST_ALGO_SHA1, 1);
+                    if (!h)
+                        BUG(); /* algo not available */
+                    md_write (h, data, ndata - 20);
+                    md_final (h);
+                    memcpy (p, md_read (h, DIGEST_ALGO_SHA1), 20);
+                    p += 20;
+                    md_close (h);
+                    sk->csum = csum = 0;
+                    sk->protect.sha1chk = 1;
+                }
+                assert( p == data+ndata );
+
+               cipher_encrypt( cipher_hd, data, data, ndata );
+               for(i = pubkey_get_npkey(sk->pubkey_algo);
+                       i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {
+                   mpi_free( sk->skey[i] );
+                   sk->skey[i] = NULL;
+               }
+               i = pubkey_get_npkey(sk->pubkey_algo);
+               sk->skey[i] = mpi_set_opaque(NULL, data, ndata );
+           }
+           else {
+               csum = 0;
+               for(i=pubkey_get_npkey(sk->pubkey_algo);
+                       i < pubkey_get_nskey(sk->pubkey_algo); i++ ) {
+                    byte *data;
+                   unsigned int nbits;
+
+                   csum += checksum_mpi (sk->skey[i]);
+                   buffer = mpi_get_buffer( sk->skey[i], &nbytes, NULL );
+                   cipher_sync (cipher_hd);
+                   assert ( !mpi_is_opaque (sk->skey[i]) );
+                    data = xmalloc (nbytes+2);
+                    nbits  = mpi_get_nbits (sk->skey[i]);
+                    assert (nbytes == (nbits + 7)/8);
+                    data[0] = nbits >> 8;
+                    data[1] = nbits;
+                   cipher_encrypt (cipher_hd, data+2, buffer, nbytes);
+                   xfree( buffer );
+                    
+                    mpi_free (sk->skey[i]);
+                    sk->skey[i] = mpi_set_opaque (NULL, data, nbytes+2);
+               }
+               sk->csum = csum;
+           }
+           sk->is_protected = 1;
+           cipher_close( cipher_hd );
+       }
+    }
+    return rc;
+}
+
diff --git a/g10/seskey.c b/g10/seskey.c
new file mode 100644 (file)
index 0000000..dd4dc0b
--- /dev/null
@@ -0,0 +1,271 @@
+/* seskey.c -  make sesssion keys etc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "cipher.h"
+#include "mpi.h"
+#include "main.h"
+#include "i18n.h"
+
+
+/****************
+ * Make a session key and put it into DEK
+ */
+void
+make_session_key( DEK *dek )
+{
+    CIPHER_HANDLE chd;
+    int i, rc;
+
+    dek->keylen = cipher_get_keylen( dek->algo ) / 8;
+
+    chd = cipher_open( dek->algo, CIPHER_MODE_AUTO_CFB, 1 );
+    randomize_buffer( dek->key, dek->keylen, 1 );
+    for(i=0; i < 16; i++ ) {
+       rc = cipher_setkey( chd, dek->key, dek->keylen );
+       if( !rc ) {
+           cipher_close( chd );
+           return;
+       }
+       log_info(_("weak key created - retrying\n") );
+       /* Renew the session key until we get a non-weak key. */
+       randomize_buffer( dek->key, dek->keylen, 1 );
+    }
+    log_fatal(_(
+           "cannot avoid weak key for symmetric cipher; tried %d times!\n"),
+                 i);
+}
+
+
+/****************
+ * Encode the session key. NBITS is the number of bits which should be used
+ * for packing the session key.
+ * returns: A mpi with the session key (caller must free)
+ */
+MPI
+encode_session_key( DEK *dek, unsigned nbits )
+{
+    int nframe = (nbits+7) / 8;
+    byte *p;
+    byte *frame;
+    int i,n;
+    u16 csum;
+    MPI a;
+
+    /* the current limitation is that we can only use a session key
+     * whose length is a multiple of BITS_PER_MPI_LIMB
+     * I think we can live with that.
+     */
+    if( dek->keylen + 7 > nframe || !nframe )
+       log_bug("can't encode a %d bit key in a %d bits frame\n",
+                   dek->keylen*8, nbits );
+
+    /* We encode the session key in this way:
+     *
+     *    0  2  RND(n bytes)  0  A  DEK(k bytes)  CSUM(2 bytes)
+     *
+     * (But how can we store the leading 0 - the external representaion
+     * of MPIs doesn't allow leading zeroes =:-)
+     *
+     * RND are non-zero random bytes.
+     * A   is the cipher algorithm
+     * DEK is the encryption key (session key) length k depends on the
+     *    cipher algorithm (20 is used with blowfish160).
+     * CSUM is the 16 bit checksum over the DEK
+     */
+    csum = 0;
+    for( p = dek->key, i=0; i < dek->keylen; i++ )
+       csum += *p++;
+
+    frame = xmalloc_secure( nframe );
+    n = 0;
+    frame[n++] = 0;
+    frame[n++] = 2;
+    i = nframe - 6 - dek->keylen;
+    assert( i > 0 );
+    p = get_random_bits( i*8, 1, 1 );
+    /* replace zero bytes by new values */
+    for(;;) {
+       int j, k;
+       byte *pp;
+
+       /* count the zero bytes */
+       for(j=k=0; j < i; j++ )
+           if( !p[j] )
+               k++;
+       if( !k )
+           break; /* okay: no zero bytes */
+       k += k/128 + 3; /* better get some more */
+       pp = get_random_bits( k*8, 1, 1);
+       for(j=0; j < i && k ;) {
+           if( !p[j] )
+               p[j] = pp[--k];
+            if (p[j])
+              j++;
+        }
+       xfree(pp);
+    }
+    memcpy( frame+n, p, i );
+    xfree(p);
+    n += i;
+    frame[n++] = 0;
+    frame[n++] = dek->algo;
+    memcpy( frame+n, dek->key, dek->keylen ); n += dek->keylen;
+    frame[n++] = csum >>8;
+    frame[n++] = csum;
+    assert( n == nframe );
+    a = mpi_alloc_secure( (nframe+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB );
+    mpi_set_buffer( a, frame, nframe, 0 );
+    xfree(frame);
+    return a;
+}
+
+
+static MPI
+do_encode_md( MD_HANDLE md, int algo, size_t len, unsigned nbits,
+             const byte *asn, size_t asnlen )
+{
+    int nframe = (nbits+7) / 8;
+    byte *frame;
+    int i,n;
+    MPI a;
+
+    if( len + asnlen + 4  > nframe )
+       log_bug("can't encode a %d bit MD into a %d bits frame\n",
+                   (int)(len*8), (int)nbits);
+
+    /* We encode the MD in this way:
+     *
+     *    0  1 PAD(n bytes)   0  ASN(asnlen bytes)  MD(len bytes)
+     *
+     * PAD consists of FF bytes.
+     */
+    frame = md_is_secure(md)? xmalloc_secure( nframe ) : xmalloc( nframe );
+    n = 0;
+    frame[n++] = 0;
+    frame[n++] = 1; /* block type */
+    i = nframe - len - asnlen -3 ;
+    assert( i > 1 );
+    memset( frame+n, 0xff, i ); n += i;
+    frame[n++] = 0;
+    memcpy( frame+n, asn, asnlen ); n += asnlen;
+    memcpy( frame+n, md_read(md, algo), len ); n += len;
+    assert( n == nframe );
+    a = md_is_secure(md)?
+        mpi_alloc_secure( (nframe+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB )
+        : mpi_alloc( (nframe+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB );
+    mpi_set_buffer( a, frame, nframe, 0 );
+    xfree(frame);
+
+    /* Note that PGP before version 2.3 encoded the MD as:
+     *
+     *   0   1   MD(16 bytes)   0   PAD(n bytes)   1
+     *
+     * The MD is always 16 bytes here because it's always MD5.  We do
+     * not support pre-v2.3 signatures, but I'm including this comment
+     * so the information is easily found in the future.
+     */
+
+    return a;
+}
+
+
+/****************
+ * Encode a message digest into an MPI.
+ * If it's for a DSA signature, make sure that the hash is large
+ * enough to fill up q.  If the hash is too big, take the leftmost
+ * bits.
+ */
+MPI
+encode_md_value( PKT_public_key *pk, PKT_secret_key *sk,
+                MD_HANDLE md, int hash_algo )
+{
+  MPI frame;
+
+  assert(hash_algo);
+  assert(pk || sk);
+
+  if((pk?pk->pubkey_algo:sk->pubkey_algo) == PUBKEY_ALGO_DSA)
+    {
+      /* It's a DSA signature, so find out the size of q. */
+
+      unsigned int qbytes=mpi_get_nbits(pk?pk->pkey[1]:sk->skey[1]);
+
+      /* Make sure it is a multiple of 8 bits. */
+
+      if(qbytes%8)
+       {
+         log_error(_("DSA requires the hash length to be a"
+                     " multiple of 8 bits\n"));
+         return NULL;
+       }
+
+      /* Don't allow any q smaller than 160 bits.  This might need a
+        revisit as the DSA2 design firms up, but for now, we don't
+        want someone to issue signatures from a key with a 16-bit q
+        or something like that, which would look correct but allow
+        trivial forgeries.  Yes, I know this rules out using MD5 with
+        DSA. ;) */
+
+      if(qbytes<160)
+       {
+         log_error(_("DSA key %s uses an unsafe (%u bit) hash\n"),
+                   pk?keystr_from_pk(pk):keystr_from_sk(sk),qbytes);
+         return NULL;
+       }
+
+      qbytes/=8;
+
+      /* Check if we're too short.  Too long is safe as we'll
+        automatically left-truncate. */
+
+      if(md_digest_length(hash_algo) < qbytes)
+       {
+         log_error(_("DSA key %s requires a %u bit or larger hash\n"),
+                   pk?keystr_from_pk(pk):keystr_from_sk(sk),qbytes*8);
+         return NULL;
+       }
+
+      frame = md_is_secure(md)? mpi_alloc_secure((qbytes+BYTES_PER_MPI_LIMB-1)
+                                                / BYTES_PER_MPI_LIMB )
+       : mpi_alloc((qbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB );
+
+      mpi_set_buffer( frame, md_read(md, hash_algo), qbytes, 0 );
+    }
+  else
+    {
+      const byte *asn;
+      size_t asnlen,mdlen;
+
+      asn = md_asn_oid( hash_algo, &asnlen, &mdlen );
+      frame = do_encode_md( md, hash_algo, mdlen,
+                           mpi_get_nbits(pk?pk->pkey[0]:sk->skey[0]),
+                           asn, asnlen );
+    }
+
+  return frame;
+}
diff --git a/g10/sig-check.c b/g10/sig-check.c
new file mode 100644 (file)
index 0000000..1570334
--- /dev/null
@@ -0,0 +1,616 @@
+/* sig-check.c -  Check a signature
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "util.h"
+#include "packet.h"
+#include "memory.h"
+#include "mpi.h"
+#include "keydb.h"
+#include "cipher.h"
+#include "main.h"
+#include "status.h"
+#include "i18n.h"
+#include "options.h"
+
+struct cmp_help_context_s {
+    PKT_signature *sig;
+    MD_HANDLE md;
+};
+
+static int do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest,
+                    int *r_expired, int *r_revoked, PKT_public_key *ret_pk);
+
+/****************
+ * Check the signature which is contained in SIG.
+ * The MD_HANDLE should be currently open, so that this function
+ * is able to append some data, before finalizing the digest.
+ */
+int
+signature_check( PKT_signature *sig, MD_HANDLE digest )
+{
+    return signature_check2( sig, digest, NULL, NULL, NULL, NULL );
+}
+
+int
+signature_check2( PKT_signature *sig, MD_HANDLE digest, u32 *r_expiredate, 
+                 int *r_expired, int *r_revoked, PKT_public_key *ret_pk )
+{
+    PKT_public_key *pk = xmalloc_clear( sizeof *pk );
+    int rc=0;
+
+    if( (rc=check_digest_algo(sig->digest_algo)) )
+      ; /* we don't have this digest */
+    else if((rc=check_pubkey_algo(sig->pubkey_algo)))
+      ; /* we don't have this pubkey algo */
+    else if(!md_algo_present(digest,sig->digest_algo))
+      {
+       /* Sanity check that the md has a context for the hash that the
+          sig is expecting.  This can happen if a onepass sig header does
+          not match the actual sig, and also if the clearsign "Hash:"
+          header is missing or does not match the actual sig. */
+
+        log_info(_("WARNING: signature digest conflict in message\n"));
+       rc=G10ERR_GENERAL;
+      }
+    else if( get_pubkey( pk, sig->keyid ) )
+       rc = G10ERR_NO_PUBKEY;
+    else if(!pk->is_valid && !pk->is_primary)
+        rc=G10ERR_BAD_PUBKEY; /* you cannot have a good sig from an
+                                invalid subkey */
+    else
+      {
+        if(r_expiredate)
+         *r_expiredate = pk->expiredate;
+
+       rc = do_check( pk, sig, digest, r_expired, r_revoked, ret_pk );
+
+       /* Check the backsig.  This is a 0x19 signature from the
+          subkey on the primary key.  The idea here is that it should
+          not be possible for someone to "steal" subkeys and claim
+          them as their own.  The attacker couldn't actually use the
+          subkey, but they could try and claim ownership of any
+          signaures issued by it. */
+       if(rc==0 && !pk->is_primary && pk->backsig<2)
+         {
+           if(pk->backsig==0)
+             {
+               log_info(_("WARNING: signing subkey %s is not"
+                          " cross-certified\n"),keystr_from_pk(pk));
+               log_info(_("please see %s for more information\n"),
+                        "http://www.gnupg.org/faq/subkey-cross-certify.html");
+               /* --require-cross-certification makes this warning an
+                     error.  TODO: change the default to require this
+                     after more keys have backsigs. */
+               if(opt.flags.require_cross_cert)
+                 rc=G10ERR_GENERAL;
+             }
+           else if(pk->backsig==1)
+             {
+               log_info(_("WARNING: signing subkey %s has an invalid"
+                          " cross-certification\n"),keystr_from_pk(pk));
+               rc=G10ERR_GENERAL;
+             }
+         }
+      }
+
+    free_public_key( pk );
+
+    if( !rc && sig->sig_class < 2 && is_status_enabled() ) {
+       /* This signature id works best with DLP algorithms because
+        * they use a random parameter for every signature.  Instead of
+        * this sig-id we could have also used the hash of the document
+        * and the timestamp, but the drawback of this is, that it is
+        * not possible to sign more than one identical document within
+        * one second.  Some remote batch processing applications might
+        * like this feature here */
+       MD_HANDLE md;
+       u32 a = sig->timestamp;
+       int i, nsig = pubkey_get_nsig( sig->pubkey_algo );
+       byte *p, *buffer;
+
+       md = md_open( DIGEST_ALGO_RMD160, 0);
+       md_putc( digest, sig->pubkey_algo );
+       md_putc( digest, sig->digest_algo );
+       md_putc( digest, (a >> 24) & 0xff );
+       md_putc( digest, (a >> 16) & 0xff );
+       md_putc( digest, (a >>  8) & 0xff );
+       md_putc( digest,  a        & 0xff );
+       for(i=0; i < nsig; i++ ) {
+           unsigned n = mpi_get_nbits( sig->data[i]);
+
+           md_putc( md, n>>8);
+           md_putc( md, n );
+           p = mpi_get_buffer( sig->data[i], &n, NULL );
+           md_write( md, p, n );
+           xfree(p);
+       }
+       md_final( md );
+       p = make_radix64_string( md_read( md, 0 ), 20 );
+       buffer = xmalloc( strlen(p) + 60 );
+       sprintf( buffer, "%s %s %lu",
+                p, strtimestamp( sig->timestamp ), (ulong)sig->timestamp );
+       write_status_text( STATUS_SIG_ID, buffer );
+       xfree(buffer);
+       xfree(p);
+       md_close(md);
+    }
+
+    return rc;
+}
+
+
+static int
+do_check_messages( PKT_public_key *pk, PKT_signature *sig,
+                  int *r_expired, int *r_revoked )
+{
+    u32 cur_time;
+
+    if(r_expired)
+      *r_expired = 0;
+    if(r_revoked)
+      *r_revoked = 0;
+
+    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 )
+         return G10ERR_TIME_CONFLICT; /* pubkey newer than signature */
+      }
+
+    cur_time = make_timestamp();
+    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 )
+         return G10ERR_TIME_CONFLICT;
+      }
+
+    if( pk->expiredate && pk->expiredate < cur_time ) {
+        char buf[11];
+        if (opt.verbose)
+         log_info(_("NOTE: signature key %s expired %s\n"),
+                  keystr_from_pk(pk), asctimestamp( pk->expiredate ) );
+       /* SIGEXPIRED is deprecated.  Use KEYEXPIRED. */
+       sprintf(buf,"%lu",(ulong)pk->expiredate);
+       write_status_text(STATUS_KEYEXPIRED,buf);
+       write_status(STATUS_SIGEXPIRED);
+       if(r_expired)
+         *r_expired = 1;
+    }
+
+    if(pk->is_revoked && r_revoked)
+      *r_revoked=1;
+
+    return 0;
+}
+
+
+static int
+do_check( PKT_public_key *pk, PKT_signature *sig, MD_HANDLE digest,
+         int *r_expired, int *r_revoked, PKT_public_key *ret_pk )
+{
+    MPI result = NULL;
+    int rc=0;
+    struct cmp_help_context_s ctx;
+
+    if( (rc=do_check_messages(pk,sig,r_expired,r_revoked)) )
+        return rc;
+
+    /* make sure the digest algo is enabled (in case of a detached signature)*/
+    md_enable( digest, sig->digest_algo );
+
+    /* complete the digest */
+    if( sig->version >= 4 )
+       md_putc( digest, sig->version );
+    md_putc( digest, sig->sig_class );
+    if( sig->version < 4 ) {
+       u32 a = sig->timestamp;
+       md_putc( digest, (a >> 24) & 0xff );
+       md_putc( digest, (a >> 16) & 0xff );
+       md_putc( digest, (a >>  8) & 0xff );
+       md_putc( digest,  a        & 0xff );
+    }
+    else {
+       byte buf[6];
+       size_t n;
+       md_putc( digest, sig->pubkey_algo );
+       md_putc( digest, sig->digest_algo );
+       if( sig->hashed ) {
+           n = sig->hashed->len;
+            md_putc (digest, (n >> 8) );
+            md_putc (digest,  n       );
+           md_write (digest, sig->hashed->data, n);
+           n += 6;
+       }
+       else {
+         /* Two octets for the (empty) length of the hashed
+             section. */
+          md_putc (digest, 0);
+         md_putc (digest, 0);
+         n = 6;
+       }
+       /* add some magic */
+       buf[0] = sig->version;
+       buf[1] = 0xff;
+       buf[2] = n >> 24;
+       buf[3] = n >> 16;
+       buf[4] = n >>  8;
+       buf[5] = n;
+       md_write( digest, buf, 6 );
+    }
+    md_final( digest );
+
+    result = encode_md_value( pk, NULL, digest, sig->digest_algo );
+    if (!result)
+        return G10ERR_GENERAL;
+    ctx.sig = sig;
+    ctx.md = digest;
+    rc = pubkey_verify( pk->pubkey_algo, result, sig->data, pk->pkey );
+    mpi_free( result );
+
+    if( !rc && sig->flags.unknown_critical )
+      {
+       log_info(_("assuming bad signature from key %s"
+                  " due to an unknown critical bit\n"),keystr_from_pk(pk));
+       rc = G10ERR_BAD_SIGN;
+      }
+
+    if(!rc && ret_pk)
+      copy_public_key(ret_pk,pk);
+
+    return rc;
+}
+
+
+static void
+hash_uid_node( KBNODE unode, MD_HANDLE md, PKT_signature *sig )
+{
+    PKT_user_id *uid = unode->pkt->pkt.user_id;
+
+    assert( unode->pkt->pkttype == PKT_USER_ID );
+    if( uid->attrib_data ) {
+       if( sig->version >=4 ) {
+           byte buf[5];
+           buf[0] = 0xd1;                   /* packet of type 17 */
+           buf[1] = uid->attrib_len >> 24;  /* always use 4 length bytes */
+           buf[2] = uid->attrib_len >> 16;
+           buf[3] = uid->attrib_len >>  8;
+           buf[4] = uid->attrib_len;
+           md_write( md, buf, 5 );
+       }
+       md_write( md, uid->attrib_data, uid->attrib_len );
+    }
+    else {
+       if( sig->version >=4 ) {
+           byte buf[5];
+           buf[0] = 0xb4;            /* indicates a userid packet */
+           buf[1] = uid->len >> 24;  /* always use 4 length bytes */
+           buf[2] = uid->len >> 16;
+           buf[3] = uid->len >>  8;
+           buf[4] = uid->len;
+           md_write( md, buf, 5 );
+       }
+       md_write( md, uid->name, uid->len );
+    }
+}
+
+static void
+cache_sig_result ( PKT_signature *sig, int result )
+{
+    if ( !result ) {
+        sig->flags.checked = 1;
+        sig->flags.valid = 1;
+    }
+    else if ( result == G10ERR_BAD_SIGN ) {
+        sig->flags.checked = 1;
+        sig->flags.valid = 0;
+    }
+    else {
+        sig->flags.checked = 0;
+        sig->flags.valid = 0;
+    }
+}
+
+/* Check the revocation keys to see if any of them have revoked our
+   pk.  sig is the revocation sig.  pk is the key it is on.  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 */
+
+/* Returns 0 if sig is valid (i.e. pk is revoked), non-0 if not
+   revoked.  It is important that G10ERR_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. */
+int
+check_revocation_keys(PKT_public_key *pk,PKT_signature *sig)
+{
+  static int busy=0;
+  int i,rc=G10ERR_GENERAL;
+
+  assert(IS_KEY_REV(sig));
+  assert((sig->keyid[0]!=pk->keyid[0]) || (sig->keyid[0]!=pk->keyid[1]));
+
+  if(busy)
+    {
+      /* return an error (i.e. not revoked), but mark the pk as
+         uncacheable as we don't really know its revocation status
+         until it is checked directly. */
+
+      pk->dont_cache=1;
+      return rc;
+    }
+
+  busy=1;
+
+  /*  printf("looking at %08lX with a sig from %08lX\n",(ulong)pk->keyid[1],
+      (ulong)sig->keyid[1]); */
+
+  /* is the issuer of the sig one of our revokers? */
+  if( !pk->revkey && pk->numrevkeys )
+     BUG();
+  else
+      for(i=0;i<pk->numrevkeys;i++)
+       {
+          u32 keyid[2];
+    
+          keyid_from_fingerprint(pk->revkey[i].fpr,MAX_FINGERPRINT_LEN,keyid);
+    
+          if(keyid[0]==sig->keyid[0] && keyid[1]==sig->keyid[1])
+           {
+              MD_HANDLE md;
+    
+              md=md_open(sig->digest_algo,0);
+              hash_public_key(md,pk);
+              rc=signature_check(sig,md);
+             cache_sig_result(sig,rc);
+             break;
+           }
+       }
+
+  busy=0;
+
+  return rc;
+} 
+
+/* Backsigs (0x19) have the same format as binding sigs (0x18), but
+   this function is simpler than check_key_signature in a few ways.
+   For example, there is no support for expiring backsigs since it is
+   questionable what such a thing actually means.  Note also that the
+   sig cache check here, unlike other sig caches in GnuPG, is not
+   persistent. */
+int
+check_backsig(PKT_public_key *main_pk,PKT_public_key *sub_pk,
+             PKT_signature *backsig)
+{
+  MD_HANDLE md;
+  int rc;
+
+  if(!opt.no_sig_cache && backsig->flags.checked)
+    {
+      if((rc=check_digest_algo(backsig->digest_algo)))
+       return rc;
+
+      return backsig->flags.valid? 0 : G10ERR_BAD_SIGN;
+    }
+
+  md=md_open(backsig->digest_algo,0);
+  hash_public_key(md,main_pk);
+  hash_public_key(md,sub_pk);
+  rc=do_check(sub_pk,backsig,md,NULL,NULL,NULL);
+  cache_sig_result(backsig,rc);
+  md_close(md);
+
+  return rc;
+}
+
+
+/****************
+ * check the signature pointed to by NODE. This is a key signature.
+ * If the function detects a self-signature, it uses the PK from
+ * ROOT and does not read any public key.
+ */
+int
+check_key_signature( KBNODE root, KBNODE node, int *is_selfsig )
+{
+  return check_key_signature2(root, node, NULL, NULL, is_selfsig, NULL, NULL );
+}
+
+/* If check_pk is set, then use it to check the signature in node
+   rather than getting it from root or the keydb.  If ret_pk is set,
+   fill in the public key that was used to verify the signature.
+   ret_pk is only meaningful when the verification was successful. */
+/* 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 )
+{
+    MD_HANDLE 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];   
+
+               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=do_check_messages(pk,sig,r_expired,NULL)))
+             return rc;
+            return sig->flags.valid? 0 : G10ERR_BAD_SIGN;
+        }
+    }
+
+    if( (rc=check_pubkey_algo(sig->pubkey_algo)) )
+       return rc;
+    if( (rc=check_digest_algo(algo)) )
+       return rc;
+
+    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
+         {
+           md = md_open( algo, 0 );
+           hash_public_key( md, pk );
+           rc = do_check( pk, sig, md, r_expired, NULL, ret_pk );
+           cache_sig_result ( sig, rc );
+           md_close(md);
+         }
+    }
+    else if( sig->sig_class == 0x28 ) { /* subkey revocation */
+       KBNODE snode = find_prev_kbnode( root, node, PKT_PUBLIC_SUBKEY );
+
+       if( snode ) {
+           md = md_open( algo, 0 );
+           hash_public_key( md, pk );
+           hash_public_key( md, snode->pkt->pkt.public_key );
+           rc = do_check( pk, sig, md, r_expired, NULL, ret_pk );
+            cache_sig_result ( sig, rc );
+           md_close(md);
+       }
+       else
+         {
+            if (opt.verbose)
+             log_info (_("key %s: no subkey for subkey"
+                         " revocation signature\n"),keystr_from_pk(pk));
+           rc = G10ERR_SIG_CLASS;
+         }
+    }
+    else if( sig->sig_class == 0x18 ) { /* key binding */
+       KBNODE 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 */
+
+               keyid_from_pk( pk, keyid );
+               if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] )
+                   *is_selfsig = 1;
+           }
+           md = md_open( algo, 0 );
+           hash_public_key( md, pk );
+           hash_public_key( md, snode->pkt->pkt.public_key );
+           rc = do_check( pk, sig, md, r_expired, NULL, ret_pk );
+            cache_sig_result ( sig, rc );
+           md_close(md);
+       }
+       else
+         {
+            if (opt.verbose)
+             log_info(_("key %s: no subkey for subkey"
+                        " binding signature\n"),keystr_from_pk(pk));
+           rc = G10ERR_SIG_CLASS;
+         }
+    }
+    else if( sig->sig_class == 0x1f ) { /* direct key signature */
+       md = md_open( algo, 0 );
+       hash_public_key( md, pk );
+       rc = do_check( pk, sig, md, r_expired, NULL, ret_pk );
+        cache_sig_result ( sig, rc );
+       md_close(md);
+    }
+    else { /* all other classes */
+       KBNODE unode = find_prev_kbnode( root, node, PKT_USER_ID );
+
+       if( unode ) {
+           u32 keyid[2];
+
+           keyid_from_pk( pk, keyid );
+           md = md_open( algo, 0 );
+           hash_public_key( md, pk );
+           hash_uid_node( unode, md, sig );
+           if( keyid[0] == sig->keyid[0] && keyid[1] == sig->keyid[1] )
+             {
+               if( is_selfsig )
+                 *is_selfsig = 1;
+               rc = do_check( pk, sig, md, r_expired, NULL, ret_pk );
+             }
+           else if (check_pk)
+             rc=do_check(check_pk,sig,md,r_expired,NULL,ret_pk);
+           else
+             rc=signature_check2(sig,md,r_expiredate,r_expired,NULL,ret_pk);
+
+            cache_sig_result ( sig, rc );
+           md_close(md);
+       }
+       else
+         {
+            if (!opt.quiet)
+             log_info ("key %s: no user ID for key signature packet"
+                       " of class %02x\n",keystr_from_pk(pk),sig->sig_class);
+           rc = G10ERR_SIG_CLASS;
+         }
+    }
+
+    return rc;
+}
diff --git a/g10/sign.c b/g10/sign.c
new file mode 100644 (file)
index 0000000..82076d7
--- /dev/null
@@ -0,0 +1,1578 @@
+/* sign.c - sign data
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h> /* need sleep() */
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "filter.h"
+#include "ttyio.h"
+#include "trustdb.h"
+#include "status.h"
+#include "i18n.h"
+#include "cardglue.h"
+
+
+#ifdef HAVE_DOSISH_SYSTEM
+#define LF "\r\n"
+void __stdcall Sleep(ulong);
+#define sleep(a)  Sleep((a)*1000)
+#else
+#define LF "\n"
+#endif
+
+static int recipient_digest_algo=0;
+
+/****************
+ * Create notations and other stuff.  It is assumed that the stings in
+ * STRLIST are already checked to contain only printable data and have
+ * a valid NAME=VALUE format.
+ */
+static void
+mk_notation_policy_etc( PKT_signature *sig,
+                       PKT_public_key *pk, PKT_secret_key *sk )
+{
+    const char *string;
+    char *s=NULL;
+    STRLIST pu=NULL;
+    struct notation *nd=NULL;
+    struct expando_args args;
+
+    memset(&args,0,sizeof(args));
+    args.pk=pk;
+    args.sk=sk;
+
+    /* It is actually impossible to get here when making a v3 key
+       signature since keyedit.c:sign_uids will automatically bump a
+       signature with a notation or policy url up to v4, but it is
+       good to do these checks anyway. */
+
+    /* notation data */
+    if(IS_SIG(sig) && opt.sig_notations)
+      {
+       if(sig->version<4)
+         log_error(_("can't put notation data into v3 (PGP 2.x style) "
+                     "signatures\n"));
+       else
+         nd=opt.sig_notations;
+      }
+    else if( IS_CERT(sig) && opt.cert_notations )
+      {
+       if(sig->version<4)
+         log_error(_("can't put notation data into v3 (PGP 2.x style) "
+                     "key signatures\n"));
+       else
+         nd=opt.cert_notations;
+      }
+
+    if(nd)
+      {
+       struct notation *i;
+
+       for(i=nd;i;i=i->next)
+         {
+           i->altvalue=pct_expando(i->value,&args);
+           if(!i->altvalue)
+             log_error(_("WARNING: unable to %%-expand notation "
+                         "(too large).  Using unexpanded.\n"));
+         }
+
+       keygen_add_notations(sig,nd);
+
+       for(i=nd;i;i=i->next)
+         {
+           xfree(i->altvalue);
+           i->altvalue=NULL;
+         }
+      }
+
+    /* set policy URL */
+    if( IS_SIG(sig) && opt.sig_policy_url )
+      {
+       if(sig->version<4)
+         log_error(_("can't put a policy URL into v3 (PGP 2.x style) "
+                     "signatures\n"));
+       else
+         pu=opt.sig_policy_url;
+      }
+    else if( IS_CERT(sig) && opt.cert_policy_url )
+      {
+       if(sig->version<4)
+         log_error(_("can't put a policy URL into v3 key (PGP 2.x style) "
+                     "signatures\n"));
+       else
+         pu=opt.cert_policy_url;
+      }
+
+    for(;pu;pu=pu->next)
+      {
+        string = pu->d;
+
+       s=pct_expando(string,&args);
+       if(!s)
+         {
+           log_error(_("WARNING: unable to %%-expand policy URL "
+                       "(too large).  Using unexpanded.\n"));
+           s=xstrdup(string);
+         }
+
+       build_sig_subpkt(sig,SIGSUBPKT_POLICY|
+                        ((pu->flags & 1)?SIGSUBPKT_FLAG_CRITICAL:0),
+                        s,strlen(s));
+
+       xfree(s);
+      }
+
+    /* preferred keyserver URL */
+    if( IS_SIG(sig) && opt.sig_keyserver_url )
+      {
+       if(sig->version<4)
+         log_info("can't put a preferred keyserver URL into v3 signatures\n");
+       else
+         pu=opt.sig_keyserver_url;
+      }
+
+    for(;pu;pu=pu->next)
+      {
+        string = pu->d;
+
+       s=pct_expando(string,&args);
+       if(!s)
+         {
+           log_error(_("WARNING: unable to %%-expand preferred keyserver URL"
+                       " (too large).  Using unexpanded.\n"));
+           s=xstrdup(string);
+         }
+
+       build_sig_subpkt(sig,SIGSUBPKT_PREF_KS|
+                        ((pu->flags & 1)?SIGSUBPKT_FLAG_CRITICAL:0),
+                        s,strlen(s));
+
+       xfree(s);
+      }
+}
+
+
+/*
+ * Helper to hash a user ID packet.  
+ */
+static void
+hash_uid (MD_HANDLE md, int sigversion, const PKT_user_id *uid)
+{
+    if ( sigversion >= 4 ) {
+        byte buf[5];
+
+       if(uid->attrib_data) {
+         buf[0] = 0xd1;                   /* indicates an attribute packet */
+         buf[1] = uid->attrib_len >> 24;  /* always use 4 length bytes */
+         buf[2] = uid->attrib_len >> 16;
+         buf[3] = uid->attrib_len >>  8;
+         buf[4] = uid->attrib_len;
+       }
+       else {
+         buf[0] = 0xb4;            /* indicates a userid packet */
+         buf[1] = uid->len >> 24;  /* always use 4 length bytes */
+         buf[2] = uid->len >> 16;
+         buf[3] = uid->len >>  8;
+         buf[4] = uid->len;
+       }
+        md_write( md, buf, 5 );
+    }
+
+    if(uid->attrib_data)
+      md_write (md, uid->attrib_data, uid->attrib_len );
+    else
+      md_write (md, uid->name, uid->len );
+}
+
+
+/*
+ * Helper to hash some parts from the signature
+ */
+static void
+hash_sigversion_to_magic (MD_HANDLE md, const PKT_signature *sig)
+{
+    if (sig->version >= 4) 
+        md_putc (md, sig->version);
+    md_putc (md, sig->sig_class);
+    if (sig->version < 4) {
+        u32 a = sig->timestamp;
+        md_putc (md, (a >> 24) & 0xff );
+        md_putc (md, (a >> 16) & 0xff );
+        md_putc (md, (a >>  8) & 0xff );
+        md_putc (md,  a               & 0xff );
+    }
+    else {
+        byte buf[6];
+        size_t n;
+        
+        md_putc (md, sig->pubkey_algo);
+        md_putc (md, sig->digest_algo);
+        if (sig->hashed) {
+            n = sig->hashed->len;
+            md_putc (md, (n >> 8) );
+            md_putc (md,  n       );
+            md_write (md, sig->hashed->data, n );
+            n += 6;
+        }
+        else {
+            md_putc (md, 0);  /* always hash the length of the subpacket*/
+            md_putc (md, 0);
+            n = 6;
+        }
+        /* add some magic */
+        buf[0] = sig->version;
+        buf[1] = 0xff;
+        buf[2] = n >> 24; /* hmmm, n is only 16 bit, so this is always 0 */
+        buf[3] = n >> 16;
+        buf[4] = n >>  8;
+        buf[5] = n;
+        md_write (md, buf, 6);
+    }
+}
+
+
+static int
+do_sign( PKT_secret_key *sk, PKT_signature *sig,
+        MD_HANDLE md, int digest_algo )
+{
+    MPI frame;
+    byte *dp;
+    int rc;
+
+    if( sk->timestamp > sig->timestamp ) {
+       ulong d = sk->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 );
+       if( !opt.ignore_time_conflict )
+           return G10ERR_TIME_CONFLICT;
+    }
+
+
+    print_pubkey_algo_note(sk->pubkey_algo);
+
+    if( !digest_algo )
+       digest_algo = md_get_algo(md);
+
+    print_digest_algo_note( digest_algo );
+    dp = md_read( md, digest_algo );
+    sig->digest_algo = digest_algo;
+    sig->digest_start[0] = dp[0];
+    sig->digest_start[1] = dp[1];
+    if (sk->is_protected && sk->protect.s2k.mode == 1002) 
+      { 
+#ifdef ENABLE_CARD_SUPPORT
+        unsigned char *rbuf;
+        size_t rbuflen;
+        char *snbuf;
+        
+        snbuf = serialno_and_fpr_from_sk (sk->protect.iv,
+                                          sk->protect.ivlen, sk);
+        rc = agent_scd_pksign (snbuf, digest_algo,
+                               md_read (md, digest_algo),
+                               md_digest_length (digest_algo),
+                               &rbuf, &rbuflen);
+        xfree (snbuf);
+        if (!rc)
+          {
+            sig->data[0] = mpi_alloc ( (rbuflen+BYTES_PER_MPI_LIMB-1)
+                                       / BYTES_PER_MPI_LIMB );
+            mpi_set_buffer (sig->data[0], rbuf, rbuflen, 0);
+            xfree (rbuf);
+          }
+#else
+        return G10ERR_UNSUPPORTED;
+#endif /* ENABLE_CARD_SUPPORT */
+      }
+    else 
+      {
+        frame = encode_md_value( NULL, sk, md, digest_algo );
+        if (!frame)
+          return G10ERR_GENERAL;
+        rc = pubkey_sign( sk->pubkey_algo, sig->data, frame, sk->skey );
+        mpi_free(frame);
+      }
+
+    if (!rc && !opt.no_sig_create_check) {
+        /* check that the signature verification worked and nothing is
+         * fooling us e.g. by a bug in the signature create
+         * code or by deliberately introduced faults. */
+        PKT_public_key *pk = xmalloc_clear (sizeof *pk);
+
+        if( get_pubkey( pk, sig->keyid ) )
+            rc = G10ERR_NO_PUBKEY;
+        else {
+           frame = encode_md_value (pk, NULL, md, sig->digest_algo );
+            if (!frame)
+                rc = G10ERR_GENERAL;
+            else
+                rc = pubkey_verify (pk->pubkey_algo, frame,
+                                    sig->data, pk->pkey );
+            mpi_free (frame);
+        }
+        if (rc)
+            log_error (_("checking created signature failed: %s\n"),
+                         g10_errstr (rc));
+        free_public_key (pk);
+    }
+    if( rc )
+       log_error(_("signing failed: %s\n"), g10_errstr(rc) );
+    else {
+       if( opt.verbose ) {
+           char *ustr = get_user_id_string_native (sig->keyid);
+           log_info(_("%s/%s signature from: \"%s\"\n"),
+                    pubkey_algo_to_string(sk->pubkey_algo),
+                    digest_algo_to_string(sig->digest_algo),
+                    ustr );
+           xfree(ustr);
+       }
+    }
+    return rc;
+}
+
+
+int
+complete_sig( PKT_signature *sig, PKT_secret_key *sk, MD_HANDLE md )
+{
+    int rc=0;
+
+    if( !(rc=check_secret_key( sk, 0 )) )
+       rc = do_sign( sk, sig, md, 0 );
+    return rc;
+}
+
+static int
+match_dsa_hash(unsigned int qbytes)
+{
+  if(qbytes<=20)
+    return DIGEST_ALGO_SHA1;
+#ifdef USE_SHA256
+  if(qbytes<=28)
+    return DIGEST_ALGO_SHA224;
+  if(qbytes<=32)
+    return DIGEST_ALGO_SHA256;
+#endif
+#ifdef USE_SHA512
+  if(qbytes<=48)
+    return DIGEST_ALGO_SHA384;
+  if(qbytes<=64)
+    return DIGEST_ALGO_SHA512;
+#endif
+  return DEFAULT_DIGEST_ALGO;
+  /* DEFAULT_DIGEST_ALGO will certainly fail, but it's the best wrong
+     answer we have if the larger SHAs aren't there. */
+}
+
+
+/*
+  First try --digest-algo.  If that isn't set, see if the recipient
+  has a preferred algorithm (which is also filtered through
+  --preferred-digest-prefs).  If we're making a signature without a
+  particular recipient (i.e. signing, rather than signing+encrypting)
+  then take the first algorithm in --preferred-digest-prefs that is
+  usable for the pubkey algorithm.  If --preferred-digest-prefs isn't
+  set, then take the OpenPGP default (i.e. SHA-1).
+
+  Possible improvement: Use the highest-ranked usable algorithm from
+  the signing key prefs either before or after using the personal
+  list?
+*/
+
+static int
+hash_for(PKT_secret_key *sk)
+{
+  if( opt.def_digest_algo )
+    return opt.def_digest_algo;
+  else if( recipient_digest_algo )
+    return recipient_digest_algo;
+  else if(sk->pubkey_algo==PUBKEY_ALGO_DSA)
+    {
+      unsigned int qbytes=mpi_get_nbits(sk->skey[1])/8;
+
+      /* It's a DSA key, so find a hash that is the same size as q or
+        larger.  If q is 160, assume it is an old DSA key and use a
+        160-bit hash unless --enable-dsa2 is set, in which case act
+        like a new DSA key that just happens to have a 160-bit q
+        (i.e. allow truncation).  If q is not 160, by definition it
+        must be a new DSA key. */
+
+      if(opt.personal_digest_prefs)
+       {
+         prefitem_t *prefs;
+
+         if(qbytes!=20 || opt.flags.dsa2)
+           {
+             for(prefs=opt.personal_digest_prefs;prefs->type;prefs++)
+               if(md_digest_length(prefs->value)>=qbytes)
+                 return prefs->value;
+           }
+         else
+           {
+             for(prefs=opt.personal_digest_prefs;prefs->type;prefs++)
+               if(md_digest_length(prefs->value)==qbytes)
+                 return prefs->value;
+           }
+       }
+
+      return match_dsa_hash(qbytes);
+    }
+  else if(sk->is_protected && sk->protect.s2k.mode==1002)
+    {
+      /* The sk lives on a smartcard, and current smartcards only
+        handle SHA-1 and RIPEMD/160.  This is correct now, but may
+        need revision as the cards add algorithms. */
+
+      if(opt.personal_digest_prefs)
+       {
+         prefitem_t *prefs;
+
+         for(prefs=opt.personal_digest_prefs;prefs->type;prefs++)
+           if(prefs->value==DIGEST_ALGO_SHA1
+              || prefs->value==DIGEST_ALGO_RMD160)
+             return prefs->value;
+       }
+
+      return DIGEST_ALGO_SHA1;
+    }
+  else if(PGP2 && sk->pubkey_algo == PUBKEY_ALGO_RSA && sk->version < 4 )
+    {
+      /* Old-style PGP only understands MD5 */
+      return DIGEST_ALGO_MD5;
+    }
+  else if( opt.personal_digest_prefs )
+    {
+      /* It's not DSA, so we can use whatever the first hash algorithm
+        is in the pref list */
+      return opt.personal_digest_prefs[0].value;
+    }
+  else
+    return DEFAULT_DIGEST_ALGO;
+}
+
+static int
+only_old_style( SK_LIST sk_list )
+{
+    SK_LIST sk_rover = NULL;
+    int old_style = 0;
+
+    /* if there are only old style capable key we use the old sytle */
+    for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+       PKT_secret_key *sk = sk_rover->sk;
+       if( sk->pubkey_algo == PUBKEY_ALGO_RSA && sk->version < 4 )
+           old_style = 1;
+       else
+           return 0;
+    }
+    return old_style;
+}
+
+
+static void
+print_status_sig_created ( PKT_secret_key *sk, PKT_signature *sig, int what )
+{
+    byte array[MAX_FINGERPRINT_LEN], *p;
+    char buf[100+MAX_FINGERPRINT_LEN*2];
+    size_t i, n;
+
+    sprintf(buf, "%c %d %d %02x %lu ",
+           what, sig->pubkey_algo, sig->digest_algo, sig->sig_class,
+           (ulong)sig->timestamp );
+
+    fingerprint_from_sk( sk, array, &n );
+    p = buf + strlen(buf);
+    for(i=0; i < n ; i++ )
+       sprintf(p+2*i, "%02X", array[i] );
+
+    write_status_text( STATUS_SIG_CREATED, buf );
+}
+
+
+/*
+ * Loop over the secret certificates in SK_LIST and build the one pass
+ * signature packets.  OpenPGP says that the data should be bracket by
+ * the onepass-sig and signature-packet; so we build these onepass
+ * packet here in reverse order 
+ */
+static int
+write_onepass_sig_packets (SK_LIST sk_list, IOBUF out, int sigclass )
+{
+    int skcount;
+    SK_LIST sk_rover;
+
+    for (skcount=0, sk_rover=sk_list; sk_rover; sk_rover = sk_rover->next)
+        skcount++;
+
+    for (; skcount; skcount--) {
+        PKT_secret_key *sk;
+        PKT_onepass_sig *ops;
+        PACKET pkt;
+        int i, rc;
+        
+        for (i=0, sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+            if (++i == skcount)
+                break;
+        }
+
+        sk = sk_rover->sk;
+        ops = xmalloc_clear (sizeof *ops);
+        ops->sig_class = sigclass;
+        ops->digest_algo = hash_for (sk);
+        ops->pubkey_algo = sk->pubkey_algo;
+        keyid_from_sk (sk, ops->keyid);
+        ops->last = (skcount == 1);
+        
+        init_packet(&pkt);
+        pkt.pkttype = PKT_ONEPASS_SIG;
+        pkt.pkt.onepass_sig = ops;
+        rc = build_packet (out, &pkt);
+        free_packet (&pkt);
+        if (rc) {
+            log_error ("build onepass_sig packet failed: %s\n",
+                       g10_errstr(rc));
+            return rc;
+        }
+    }
+
+    return 0;
+}
+
+/*
+ * Helper to write the plaintext (literal data) packet
+ */
+static int
+write_plaintext_packet (IOBUF out, IOBUF inp, const char *fname, int ptmode)
+{
+    PKT_plaintext *pt = NULL;
+    u32 filesize;
+    int rc = 0;
+
+    if (!opt.no_literal)
+      pt=setup_plaintext_name(fname,inp);
+
+    /* try to calculate the length of the data */
+    if ( !iobuf_is_pipe_filename (fname) && *fname )
+      {
+        off_t tmpsize;
+        int overflow;
+
+        if( !(tmpsize = iobuf_get_filelength(inp, &overflow))
+            && !overflow )
+         log_info (_("WARNING: `%s' is an empty file\n"), fname);
+
+        /* We can't encode the length of very large files because
+           OpenPGP uses only 32 bit for file sizes.  So if the size of
+           a file is larger than 2^32 minus some bytes for packet
+           headers, we switch to partial length encoding. */
+        if ( tmpsize < (IOBUF_FILELENGTH_LIMIT - 65536) )
+          filesize = tmpsize;
+        else
+          filesize = 0;
+
+        /* Because the text_filter modifies the length of the
+         * data, it is not possible to know the used length
+         * without a double read of the file - to avoid that
+         * we simple use partial length packets. */
+        if ( ptmode == 't' )
+         filesize = 0;
+      }
+    else
+      filesize = opt.set_filesize? opt.set_filesize : 0; /* stdin */
+
+    if (!opt.no_literal) {
+        PACKET pkt;
+
+        pt->timestamp = make_timestamp ();
+        pt->mode = ptmode;
+        pt->len = filesize;
+        pt->new_ctb = !pt->len && !RFC1991;
+        pt->buf = inp;
+        init_packet(&pkt);
+        pkt.pkttype = PKT_PLAINTEXT;
+        pkt.pkt.plaintext = pt;
+        /*cfx.datalen = filesize? calc_packet_length( &pkt ) : 0;*/
+        if( (rc = build_packet (out, &pkt)) )
+            log_error ("build_packet(PLAINTEXT) failed: %s\n",
+                       g10_errstr(rc) );
+        pt->buf = NULL;
+    }
+    else {
+        byte copy_buffer[4096];
+        int  bytes_copied;
+
+        while ((bytes_copied = iobuf_read(inp, copy_buffer, 4096)) != -1)
+            if (iobuf_write(out, copy_buffer, bytes_copied) == -1) {
+                rc = G10ERR_WRITE_FILE;
+                log_error ("copying input to output failed: %s\n",
+                           g10_errstr(rc));
+                break;
+            }
+        wipememory(copy_buffer,4096); /* burn buffer */
+    }
+    /* fixme: it seems that we never freed pt/pkt */
+    
+    return rc;
+}
+
+/*
+ * Write the signatures from the SK_LIST to OUT. HASH must be a non-finalized
+ * hash which will not be changes here.
+ */
+static int
+write_signature_packets (SK_LIST sk_list, IOBUF out, MD_HANDLE hash,
+                         int sigclass, u32 timestamp, u32 duration,
+                        int status_letter)
+{
+    SK_LIST sk_rover;
+
+    /* loop over the secret certificates */
+    for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next) {
+       PKT_secret_key *sk;
+       PKT_signature *sig;
+       MD_HANDLE md;
+        int rc;
+
+       sk = sk_rover->sk;
+
+       /* build the signature packet */
+       sig = xmalloc_clear (sizeof *sig);
+       if(opt.force_v3_sigs || RFC1991)
+         sig->version=3;
+       else if(duration || opt.sig_policy_url
+               || opt.sig_notations || opt.sig_keyserver_url)
+         sig->version=4;
+       else
+         sig->version=sk->version;
+       keyid_from_sk (sk, sig->keyid);
+       sig->digest_algo = hash_for(sk);
+       sig->pubkey_algo = sk->pubkey_algo;
+       if(timestamp)
+         sig->timestamp = timestamp;
+       else
+         sig->timestamp = make_timestamp();
+       if(duration)
+         sig->expiredate = sig->timestamp+duration;
+       sig->sig_class = sigclass;
+
+       md = md_copy (hash);
+
+       if (sig->version >= 4)
+           build_sig_subpkt_from_sig (sig);
+       mk_notation_policy_etc (sig, NULL, sk);
+
+        hash_sigversion_to_magic (md, sig);
+       md_final (md);
+
+       rc = do_sign( sk, sig, md, hash_for (sk) );
+       md_close (md);
+
+       if( !rc ) { /* and write it */
+            PACKET pkt;
+
+           init_packet(&pkt);
+           pkt.pkttype = PKT_SIGNATURE;
+           pkt.pkt.signature = sig;
+           rc = build_packet (out, &pkt);
+           if (!rc && is_status_enabled()) {
+               print_status_sig_created ( sk, sig, status_letter);
+           }
+           free_packet (&pkt);
+           if (rc)
+               log_error ("build signature packet failed: %s\n",
+                           g10_errstr(rc) );
+       }
+       if( rc )
+           return rc;;
+    }
+
+    return 0;
+}
+
+/****************
+ * Sign the files whose names are in FILENAME.
+ * If DETACHED has the value true,
+ * make a detached signature.  If FILENAMES->d is NULL read from stdin
+ * and ignore the detached mode.  Sign the file with all secret keys
+ * which can be taken from LOCUSR, if this is NULL, use the default one
+ * If ENCRYPTFLAG is true, use REMUSER (or ask if it is NULL) to encrypt the
+ * signed data for these users.
+ * If OUTFILE is not NULL; this file is used for output and the function
+ * does not ask for overwrite permission; output is then always
+ * uncompressed, non-armored and in binary mode.
+ */
+int
+sign_file( STRLIST filenames, int detached, STRLIST locusr,
+          int encryptflag, STRLIST remusr, const char *outfile )
+{
+    const char *fname;
+    armor_filter_context_t afx;
+    compress_filter_context_t zfx;
+    md_filter_context_t mfx;
+    text_filter_context_t tfx;
+    progress_filter_context_t pfx;
+    encrypt_filter_context_t efx;
+    IOBUF inp = NULL, out = NULL;
+    PACKET pkt;
+    int rc = 0;
+    PK_LIST pk_list = NULL;
+    SK_LIST sk_list = NULL;
+    SK_LIST sk_rover = NULL;
+    int multifile = 0;
+    u32 duration=0;
+
+    memset( &afx, 0, sizeof afx);
+    memset( &zfx, 0, sizeof zfx);
+    memset( &mfx, 0, sizeof mfx);
+    memset( &efx, 0, sizeof efx);
+    init_packet( &pkt );
+
+    if( filenames ) {
+       fname = filenames->d;
+       multifile = !!filenames->next;
+    }
+    else
+       fname = NULL;
+
+    if( fname && filenames->next && (!detached || encryptflag) )
+       log_bug("multiple files can only be detached signed");
+
+    if(encryptflag==2
+       && (rc=setup_symkey(&efx.symkey_s2k,&efx.symkey_dek)))
+      goto leave;
+
+    if(!opt.force_v3_sigs && !RFC1991)
+      {
+       if(opt.ask_sig_expire && !opt.batch)
+         duration=ask_expire_interval(1,opt.def_sig_expire);
+       else
+         duration=parse_expire_string(opt.def_sig_expire);
+      }
+
+    if( (rc=build_sk_list( locusr, &sk_list, 1, PUBKEY_USAGE_SIG )) )
+       goto leave;
+
+    if(PGP2 && !only_old_style(sk_list))
+      {
+       log_info(_("you can only detach-sign with PGP 2.x style keys "
+                  "while in --pgp2 mode\n"));
+       compliance_failure();
+      }
+
+    if(encryptflag && (rc=build_pk_list( remusr, &pk_list, PUBKEY_USAGE_ENC )))
+      goto leave;
+
+    /* prepare iobufs */
+    if( multifile )  /* have list of filenames */
+       inp = NULL; /* we do it later */
+    else {
+      inp = iobuf_open(fname);
+      if (inp && is_secured_file (iobuf_get_fd (inp)))
+        {
+          iobuf_close (inp);
+          inp = NULL;
+          errno = EPERM;
+        }
+      if( !inp ) {
+           log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]",
+                     strerror(errno) );
+           rc = G10ERR_OPEN_FILE;
+           goto leave;
+       }
+
+        handle_progress (&pfx, inp, fname);
+    }
+
+    if( outfile ) {
+        if (is_secured_filename ( outfile )) {
+            out = NULL;
+            errno = EPERM;
+        }
+        else
+            out = iobuf_create( outfile );
+       if( !out )
+         {
+           log_error(_("can't create `%s': %s\n"), outfile, strerror(errno) );
+           rc = G10ERR_CREATE_FILE;
+           goto leave;
+         }
+       else if( opt.verbose )
+           log_info(_("writing to `%s'\n"), outfile );
+    }
+    else if( (rc = open_outfile( fname, opt.armor? 1: detached? 2:0, &out )))
+       goto leave;
+
+    /* prepare to calculate the MD over the input */
+    if( opt.textmode && !outfile && !multifile )
+      {
+       memset( &tfx, 0, sizeof tfx);
+       iobuf_push_filter( inp, text_filter, &tfx );
+      }
+
+    mfx.md = md_open(0, 0);
+    if (DBG_HASHING)
+       md_start_debug (mfx.md, "sign");
+
+    /* If we're encrypting and signing, it is reasonable to pick the
+       hash algorithm to use out of the recepient key prefs.  This is
+       best effort only, as in a DSA2 and smartcard world there are
+       cases where we cannot please everyone with a single hash (DSA2
+       wants >160 and smartcards want =160).  In the future this could
+       be more complex with different hashes for each sk, but the
+       current design requires a single hash for all SKs. */
+    if(pk_list)
+      {
+       if(opt.def_digest_algo)
+         {
+           if(!opt.expert &&
+              select_algo_from_prefs(pk_list,PREFTYPE_HASH,
+                                     opt.def_digest_algo,
+                                     NULL)!=opt.def_digest_algo)
+         log_info(_("WARNING: forcing digest algorithm %s (%d)"
+                    " violates recipient preferences\n"),
+                  digest_algo_to_string(opt.def_digest_algo),
+                  opt.def_digest_algo);
+         }
+       else
+         {
+           union pref_hint hint;
+           int algo,smartcard=0;
+
+           hint.digest_length=0;
+
+           /* Of course, if the recipient asks for something
+              unreasonable (like the wrong hash for a DSA key) then
+              don't do it.  Check all sk's - if any are DSA or live
+              on a smartcard, then the hash has restrictions and we
+              may not be able to give the recipient what they want.
+              For DSA, pass a hint for the largest q we have.  Note
+              that this means that a q>160 key will override a q=160
+              key and force the use of truncation for the q=160 key.
+              The alternative would be to ignore the recipient prefs
+              completely and get a different hash for each DSA key in
+              hash_for().  The override behavior here is more or less
+              reasonable as it is under the control of the user which
+              keys they sign with for a given message and the fact
+              that the message with multiple signatures won't be
+              usable on an implementation that doesn't understand
+              DSA2 anyway. */
+
+           for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next )
+             {
+               if(sk_rover->sk->pubkey_algo==PUBKEY_ALGO_DSA)
+                 {
+                   int temp_hashlen=mpi_get_nbits(sk_rover->sk->skey[1])/8;
+
+                   /* Pick a hash that is large enough for our
+                      largest q */
+
+                   if(hint.digest_length<temp_hashlen)
+                     hint.digest_length=temp_hashlen;
+                 }
+               else if(sk_rover->sk->is_protected
+                       && sk_rover->sk->protect.s2k.mode==1002)
+                 smartcard=1;
+             }
+
+           /* Current smartcards only do 160-bit hashes.  If we have
+              to have a >160-bit hash, then we can't use the
+              recipient prefs as we'd need both =160 and >160 at the
+              same time and recipient prefs currently require a
+              single hash for all signatures.  All this may well have
+              to change as the cards add algorithms. */
+
+           if(!smartcard || (smartcard && hint.digest_length==20))
+             if((algo=
+                 select_algo_from_prefs(pk_list,PREFTYPE_HASH,-1,&hint))>0)
+               recipient_digest_algo=algo;
+         }
+      }
+
+    for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+       PKT_secret_key *sk = sk_rover->sk;
+       md_enable(mfx.md, hash_for(sk));
+    }
+
+    if( !multifile )
+       iobuf_push_filter( inp, md_filter, &mfx );
+
+    if( detached && !encryptflag && !RFC1991 )
+       afx.what = 2;
+
+    if( opt.armor && !outfile  )
+       iobuf_push_filter( out, armor_filter, &afx );
+
+    if( encryptflag ) {
+       efx.pk_list = pk_list;
+       /* fixme: set efx.cfx.datalen if known */
+       iobuf_push_filter( out, encrypt_filter, &efx );
+    }
+
+    if( opt.compress_algo && !outfile && ( !detached || opt.compress_sigs) )
+      {
+        int compr_algo=opt.compress_algo;
+
+       /* If not forced by user */
+       if(compr_algo==-1)
+         {
+           /* If we're not encrypting, then select_algo_from_prefs
+              will fail and we'll end up with the default.  If we are
+              encrypting, select_algo_from_prefs cannot fail since
+              there is an assumed preference for uncompressed data.
+              Still, if it did fail, we'll also end up with the
+              default. */
+           if((compr_algo=
+               select_algo_from_prefs(pk_list,PREFTYPE_ZIP,-1,NULL))==-1)
+             compr_algo=default_compress_algo();
+         }
+       else if(!opt.expert && pk_list
+               && select_algo_from_prefs(pk_list,PREFTYPE_ZIP,
+                                         compr_algo,NULL)!=compr_algo)
+         log_info(_("WARNING: forcing compression algorithm %s (%d)"
+                    " violates recipient preferences\n"),
+                  compress_algo_to_string(compr_algo),compr_algo);
+
+       /* algo 0 means no compression */
+       if( compr_algo )
+         push_compress_filter(out,&zfx,compr_algo);
+      }
+
+    /* Write the one-pass signature packets if needed */
+    if (!detached && !RFC1991) {
+        rc = write_onepass_sig_packets (sk_list, out,
+                                        opt.textmode && !outfile ? 0x01:0x00);
+        if (rc)
+            goto leave;
+    }
+
+    write_status (STATUS_BEGIN_SIGNING);
+
+    /* Setup the inner packet. */
+    if( detached ) {
+       if( multifile ) {
+           STRLIST sl;
+
+           if( opt.verbose )
+               log_info(_("signing:") );
+           /* must walk reverse trough this list */
+           for( sl = strlist_last(filenames); sl;
+                       sl = strlist_prev( filenames, sl ) ) {
+                inp = iobuf_open(sl->d);
+                if (inp && is_secured_file (iobuf_get_fd (inp)))
+                  {
+                    iobuf_close (inp);
+                    inp = NULL;
+                    errno = EPERM;
+                  }
+               if( !inp )
+                 {
+                   log_error(_("can't open `%s': %s\n"),
+                             sl->d,strerror(errno));
+                   rc = G10ERR_OPEN_FILE;
+                   goto leave;
+                 }
+                handle_progress (&pfx, inp, sl->d);
+               if( opt.verbose )
+                   fprintf(stderr, " `%s'", sl->d );
+               if(opt.textmode)
+                 {
+                   memset( &tfx, 0, sizeof tfx);
+                   iobuf_push_filter( inp, text_filter, &tfx );
+                 }
+               iobuf_push_filter( inp, md_filter, &mfx );
+               while( iobuf_get(inp) != -1 )
+                   ;
+               iobuf_close(inp); inp = NULL;
+           }
+           if( opt.verbose )
+               putc( '\n', stderr );
+       }
+       else {
+           /* read, so that the filter can calculate the digest */
+           while( iobuf_get(inp) != -1 )
+               ;
+       }
+    }
+    else {
+        rc = write_plaintext_packet (out, inp, fname,
+                                     opt.textmode && !outfile ? 't':'b');
+    }
+
+    /* catch errors from above */
+    if (rc)
+       goto leave;
+
+    /* write the signatures */
+    rc = write_signature_packets (sk_list, out, mfx.md,
+                                  opt.textmode && !outfile? 0x01 : 0x00,
+                                 0, duration, detached ? 'D':'S');
+    if( rc )
+        goto leave;
+
+
+  leave:
+    if( rc )
+       iobuf_cancel(out);
+    else {
+       iobuf_close(out);
+        if (encryptflag)
+            write_status( STATUS_END_ENCRYPTION );
+    }
+    iobuf_close(inp);
+    md_close( mfx.md );
+    release_sk_list( sk_list );
+    release_pk_list( pk_list );
+    recipient_digest_algo=0;
+    return rc;
+}
+
+
+
+/****************
+ * make a clear signature. note that opt.armor is not needed
+ */
+int
+clearsign_file( const char *fname, STRLIST locusr, const char *outfile )
+{
+    armor_filter_context_t afx;
+    progress_filter_context_t pfx;
+    MD_HANDLE textmd = NULL;
+    IOBUF inp = NULL, out = NULL;
+    PACKET pkt;
+    int rc = 0;
+    SK_LIST sk_list = NULL;
+    SK_LIST sk_rover = NULL;
+    int old_style = RFC1991;
+    int only_md5 = 0;
+    u32 duration=0;
+
+    memset( &afx, 0, sizeof afx);
+    init_packet( &pkt );
+
+    if(!opt.force_v3_sigs && !RFC1991)
+      {
+       if(opt.ask_sig_expire && !opt.batch)
+         duration=ask_expire_interval(1,opt.def_sig_expire);
+       else
+         duration=parse_expire_string(opt.def_sig_expire);
+      }
+
+    if( (rc=build_sk_list( locusr, &sk_list, 1, PUBKEY_USAGE_SIG )) )
+       goto leave;
+
+    if( !old_style && !duration )
+       old_style = only_old_style( sk_list );
+
+    if(PGP2 && !only_old_style(sk_list))
+      {
+       log_info(_("you can only clearsign with PGP 2.x style keys "
+                  "while in --pgp2 mode\n"));
+       compliance_failure();
+      }
+
+    /* prepare iobufs */
+    inp = iobuf_open(fname);
+    if (inp && is_secured_file (iobuf_get_fd (inp)))
+      {
+        iobuf_close (inp);
+        inp = NULL;
+        errno = EPERM;
+      }
+    if( !inp ) {
+       log_error(_("can't open `%s': %s\n"), fname? fname: "[stdin]",
+                                       strerror(errno) );
+       rc = G10ERR_OPEN_FILE;
+       goto leave;
+    }
+    handle_progress (&pfx, inp, fname);
+
+    if( outfile ) {
+        if (is_secured_filename (outfile) ) {
+            outfile = NULL;
+            errno = EPERM;
+        }
+        else 
+            out = iobuf_create( outfile );
+       if( !out )
+         {
+           log_error(_("can't create `%s': %s\n"), outfile, strerror(errno) );
+           rc = G10ERR_CREATE_FILE;
+           goto leave;
+         }
+       else if( opt.verbose )
+           log_info(_("writing to `%s'\n"), outfile );
+    }
+    else if( (rc = open_outfile( fname, 1, &out )) )
+       goto leave;
+
+    iobuf_writestr(out, "-----BEGIN PGP SIGNED MESSAGE-----" LF );
+
+    for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+       PKT_secret_key *sk = sk_rover->sk;
+       if( hash_for(sk) == DIGEST_ALGO_MD5 )
+           only_md5 = 1;
+       else {
+           only_md5 = 0;
+           break;
+       }
+    }
+
+    if( !(old_style && only_md5) ) {
+       const char *s;
+       int any = 0;
+       byte hashs_seen[256];
+
+       memset( hashs_seen, 0, sizeof hashs_seen );
+       iobuf_writestr(out, "Hash: " );
+       for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+           PKT_secret_key *sk = sk_rover->sk;
+           int i = hash_for(sk);
+
+           if( !hashs_seen[ i & 0xff ] ) {
+               s = digest_algo_to_string( i );
+               if( s ) {
+                   hashs_seen[ i & 0xff ] = 1;
+                   if( any )
+                       iobuf_put(out, ',' );
+                   iobuf_writestr(out, s );
+                   any = 1;
+               }
+           }
+       }
+       assert(any);
+       iobuf_writestr(out, LF );
+    }
+
+    if( opt.not_dash_escaped )
+      iobuf_writestr( out,
+                 "NotDashEscaped: You need GnuPG to verify this message" LF );
+    iobuf_writestr(out, LF );
+
+    textmd = md_open(0, 0);
+    for( sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next ) {
+       PKT_secret_key *sk = sk_rover->sk;
+       md_enable(textmd, hash_for(sk));
+    }
+    if ( DBG_HASHING )
+       md_start_debug( textmd, "clearsign" );
+    copy_clearsig_text( out, inp, textmd, !opt.not_dash_escaped,
+                       opt.escape_from, (old_style && only_md5) );
+    /* fixme: check for read errors */
+
+    /* now write the armor */
+    afx.what = 2;
+    iobuf_push_filter( out, armor_filter, &afx );
+
+    /* write the signatures */
+    rc=write_signature_packets (sk_list, out, textmd, 0x01, 0, duration, 'C');
+    if( rc )
+        goto leave;
+
+  leave:
+    if( rc )
+       iobuf_cancel(out);
+    else
+       iobuf_close(out);
+    iobuf_close(inp);
+    md_close( textmd );
+    release_sk_list( sk_list );
+    return rc;
+}
+
+/*
+ * Sign and conventionally encrypt the given file.
+ * FIXME: Far too much code is duplicated - revamp the whole file.
+ */
+int
+sign_symencrypt_file (const char *fname, STRLIST locusr)
+{
+    armor_filter_context_t afx;
+    progress_filter_context_t pfx;
+    compress_filter_context_t zfx;
+    md_filter_context_t mfx;
+    text_filter_context_t tfx;
+    cipher_filter_context_t cfx;
+    IOBUF inp = NULL, out = NULL;
+    PACKET pkt;
+    STRING2KEY *s2k = NULL;
+    int rc = 0;
+    SK_LIST sk_list = NULL;
+    SK_LIST sk_rover = NULL;
+    int algo;
+    u32 duration=0;
+
+    memset( &afx, 0, sizeof afx);
+    memset( &zfx, 0, sizeof zfx);
+    memset( &mfx, 0, sizeof mfx);
+    memset( &tfx, 0, sizeof tfx);
+    memset( &cfx, 0, sizeof cfx);
+    init_packet( &pkt );
+
+    if(!opt.force_v3_sigs && !RFC1991)
+      {
+       if(opt.ask_sig_expire && !opt.batch)
+         duration=ask_expire_interval(1,opt.def_sig_expire);
+       else
+         duration=parse_expire_string(opt.def_sig_expire);
+      }
+
+    rc = build_sk_list (locusr, &sk_list, 1, PUBKEY_USAGE_SIG);
+    if (rc) 
+       goto leave;
+
+    /* prepare iobufs */
+    inp = iobuf_open(fname);
+    if (inp && is_secured_file (iobuf_get_fd (inp)))
+      {
+        iobuf_close (inp);
+        inp = NULL;
+        errno = EPERM;
+      }
+    if( !inp ) {
+       log_error(_("can't open `%s': %s\n"), 
+                  fname? fname: "[stdin]", strerror(errno) );
+       rc = G10ERR_OPEN_FILE;
+       goto leave;
+    }
+    handle_progress (&pfx, inp, fname);
+
+    /* prepare key */
+    s2k = xmalloc_clear( sizeof *s2k );
+    s2k->mode = RFC1991? 0:opt.s2k_mode;
+    s2k->hash_algo = S2K_DIGEST_ALGO;
+
+    algo = default_cipher_algo();
+    if (!opt.quiet || !opt.batch)
+        log_info (_("%s encryption will be used\n"),
+                   cipher_algo_to_string(algo) );
+    cfx.dek = passphrase_to_dek( NULL, 0, algo, s2k, 2, NULL, NULL);
+
+    if (!cfx.dek || !cfx.dek->keylen) {
+        rc = G10ERR_PASSPHRASE;
+        log_error(_("error creating passphrase: %s\n"), g10_errstr(rc) );
+        goto leave;
+    }
+
+    /* We have no way to tell if the recipient can handle messages
+       with an MDC, so this defaults to no.  Perhaps in a few years,
+       this can be defaulted to yes.  Note that like regular
+       encrypting, --force-mdc overrides --disable-mdc. */
+    if(opt.force_mdc)
+      cfx.dek->use_mdc=1;
+
+    /* now create the outfile */
+    rc = open_outfile (fname, opt.armor? 1:0, &out);
+    if (rc)
+       goto leave;
+
+    /* prepare to calculate the MD over the input */
+    if (opt.textmode)
+       iobuf_push_filter (inp, text_filter, &tfx);
+    mfx.md = md_open(0, 0);
+    if ( DBG_HASHING )
+       md_start_debug (mfx.md, "symc-sign");
+
+    for (sk_rover = sk_list; sk_rover; sk_rover = sk_rover->next) {
+       PKT_secret_key *sk = sk_rover->sk;
+       md_enable (mfx.md, hash_for (sk));
+    }
+
+    iobuf_push_filter (inp, md_filter, &mfx);
+
+    /* Push armor output filter */
+    if (opt.armor)
+       iobuf_push_filter (out, armor_filter, &afx);
+
+    /* Write the symmetric key packet */
+    /*(current filters: armor)*/
+    if (!RFC1991) {
+       PKT_symkey_enc *enc = xmalloc_clear( sizeof *enc );
+       enc->version = 4;
+       enc->cipher_algo = cfx.dek->algo;
+       enc->s2k = *s2k;
+       pkt.pkttype = PKT_SYMKEY_ENC;
+       pkt.pkt.symkey_enc = enc;
+       if( (rc = build_packet( out, &pkt )) )
+           log_error("build symkey packet failed: %s\n", g10_errstr(rc) );
+       xfree(enc);
+    }
+
+    /* Push the encryption filter */
+    iobuf_push_filter( out, cipher_filter, &cfx );
+
+    /* Push the compress filter */
+    if (default_compress_algo())
+      push_compress_filter(out,&zfx,default_compress_algo());
+
+    /* Write the one-pass signature packets */
+    /*(current filters: zip - encrypt - armor)*/
+    if (!RFC1991) {
+        rc = write_onepass_sig_packets (sk_list, out,
+                                        opt.textmode? 0x01:0x00);
+        if (rc)
+            goto leave;
+    }
+
+    write_status (STATUS_BEGIN_SIGNING);
+
+    /* Pipe data through all filters; i.e. write the signed stuff */
+    /*(current filters: zip - encrypt - armor)*/
+    rc = write_plaintext_packet (out, inp, fname, opt.textmode ? 't':'b');
+    if (rc)
+       goto leave;
+    
+    /* Write the signatures */
+    /*(current filters: zip - encrypt - armor)*/
+    rc = write_signature_packets (sk_list, out, mfx.md,
+                                 opt.textmode? 0x01 : 0x00,
+                                 0, duration, 'S');
+    if( rc )
+        goto leave;
+
+
+  leave:
+    if( rc )
+       iobuf_cancel(out);
+    else {
+       iobuf_close(out);
+        write_status( STATUS_END_ENCRYPTION );
+    }
+    iobuf_close(inp);
+    release_sk_list( sk_list );
+    md_close( mfx.md );
+    xfree(cfx.dek);
+    xfree(s2k);
+    return rc;
+}
+
+
+/****************
+ * Create a signature packet for the given public key certificate and
+ * the user id and return it in ret_sig. User signature class SIGCLASS
+ * user-id is not used (and may be NULL if sigclass is 0x20) If
+ * DIGEST_ALGO is 0 the function selects an appropriate one.
+ * SIGVERSION gives the minimal required signature packet version;
+ * this is needed so that special properties like local sign are not
+ * applied (actually: dropped) when a v3 key is used.  TIMESTAMP is
+ * the timestamp to use for the signature. 0 means "now" */
+int
+make_keysig_packet( PKT_signature **ret_sig, PKT_public_key *pk,
+                   PKT_user_id *uid, PKT_public_key *subpk,
+                   PKT_secret_key *sk,
+                   int sigclass, int digest_algo,
+                    int sigversion, u32 timestamp, u32 duration,
+                   int (*mksubpkt)(PKT_signature *, void *), void *opaque
+                  )
+{
+    PKT_signature *sig;
+    int rc=0;
+    MD_HANDLE md;
+
+    assert( (sigclass >= 0x10 && sigclass <= 0x13) || sigclass == 0x1F
+           || sigclass == 0x20 || sigclass == 0x18 || sigclass == 0x19
+           || sigclass == 0x30 || sigclass == 0x28 );
+
+    if (opt.force_v4_certs)
+        sigversion = 4;
+
+    if (sigversion < sk->version)
+        sigversion = sk->version;
+
+    /* If you are making a signature on a v4 key using your v3 key, it
+       doesn't make sense to generate a v3 sig.  After all, no v3-only
+       PGP implementation could understand the v4 key in the first
+       place.  Note that this implies that a signature on an attribute
+       uid is usually going to be v4 as well, since they are not
+       generally found on v3 keys. */
+    if (sigversion < pk->version)
+        sigversion = pk->version;
+
+    if( !digest_algo )
+      {
+       /* Basically, this means use SHA1 always unless it's a v3 RSA
+          key making a v3 cert (use MD5), or the user specified
+          something (use whatever they said), or it's DSA (use the
+          best match).  They still can't pick an inappropriate hash
+          for DSA or the signature will fail.  Note that this still
+          allows the caller of make_keysig_packet to override the
+          user setting if it must. */
+
+       if(opt.cert_digest_algo)
+         digest_algo=opt.cert_digest_algo;
+       else if(sk->pubkey_algo==PUBKEY_ALGO_RSA
+               && pk->version<4 && sigversion<4)
+         digest_algo = DIGEST_ALGO_MD5;
+       else if(sk->pubkey_algo==PUBKEY_ALGO_DSA)
+         digest_algo = match_dsa_hash(mpi_get_nbits(sk->skey[1])/8);
+       else
+         digest_algo = DIGEST_ALGO_SHA1;
+      }
+
+    md = md_open( digest_algo, 0 );
+
+    /* hash the public key certificate */
+    hash_public_key( md, pk );
+
+    if( sigclass == 0x18 || sigclass == 0x19 || sigclass == 0x28 )
+      {
+       /* hash the subkey binding/backsig/revocation */
+       hash_public_key( md, subpk );
+      }
+    else if( sigclass != 0x1F && sigclass != 0x20 )
+      {
+       /* hash the user id */
+        hash_uid (md, sigversion, uid);
+      }
+    /* and make the signature packet */
+    sig = xmalloc_clear( sizeof *sig );
+    sig->version = sigversion;
+    sig->flags.exportable=1;
+    sig->flags.revocable=1;
+    keyid_from_sk( sk, sig->keyid );
+    sig->pubkey_algo = sk->pubkey_algo;
+    sig->digest_algo = digest_algo;
+    if(timestamp)
+      sig->timestamp=timestamp;
+    else
+      sig->timestamp=make_timestamp();
+    if(duration)
+      sig->expiredate=sig->timestamp+duration;
+    sig->sig_class = sigclass;
+    if( sig->version >= 4 )
+       build_sig_subpkt_from_sig( sig );
+    mk_notation_policy_etc( sig, pk, sk );
+
+    /* Crucial that the call to mksubpkt comes LAST before the calls
+       to finalize the sig as that makes it possible for the mksubpkt
+       function to get a reliable pointer to the subpacket area. */
+    if( sig->version >= 4 && mksubpkt )
+       rc = (*mksubpkt)( sig, opaque );
+
+    if( !rc ) {
+        hash_sigversion_to_magic (md, sig);
+       md_final(md);
+
+       rc = complete_sig( sig, sk, md );
+    }
+
+    md_close( md );
+    if( rc )
+       free_seckey_enc( sig );
+    else
+       *ret_sig = sig;
+    return rc;
+}
+
+
+
+/****************
+ * Create a new signature packet based on an existing one.
+ * Only user ID signatures are supported for now.
+ * TODO: Merge this with make_keysig_packet.
+ */
+int
+update_keysig_packet( PKT_signature **ret_sig,
+                      PKT_signature *orig_sig,
+                      PKT_public_key *pk,
+                      PKT_user_id *uid, 
+                      PKT_public_key *subpk,
+                      PKT_secret_key *sk,
+                      int (*mksubpkt)(PKT_signature *, void *),
+                      void *opaque )
+{
+    PKT_signature *sig;
+    int rc=0;
+    MD_HANDLE md;
+
+    if ((!orig_sig || !pk || !sk)
+       || (orig_sig->sig_class >= 0x10 && orig_sig->sig_class <= 0x13 && !uid)
+       || (orig_sig->sig_class == 0x18 && !subpk))
+      return G10ERR_GENERAL;
+
+    md = md_open( orig_sig->digest_algo, 0 );
+
+    /* hash the public key certificate and the user id */
+    hash_public_key( md, pk );
+
+    if( orig_sig->sig_class == 0x18 )
+      hash_public_key( md, subpk );
+    else
+      hash_uid (md, orig_sig->version, uid);
+
+    /* create a new signature packet */
+    sig = copy_signature (NULL, orig_sig);
+    /* We need to create a new timestamp so that new sig expiration
+       calculations are done correctly... */
+    sig->timestamp=make_timestamp();
+
+    /* ... but we won't make a timestamp earlier than the existing
+       one. */
+    while(sig->timestamp<=orig_sig->timestamp)
+      {
+       sleep(1);
+       sig->timestamp=make_timestamp();
+      }
+
+    /* Note that already expired sigs will remain expired (with a
+       duration of 1) since build-packet.c:build_sig_subpkt_from_sig
+       detects this case. */
+
+    if( sig->version >= 4 )
+      {
+       /* Put the updated timestamp into the sig.  Note that this
+          will automagically lower any sig expiration dates to
+          correctly correspond to the differences in the timestamps
+          (i.e. the duration will shrink). */
+       build_sig_subpkt_from_sig( sig );
+
+       if (mksubpkt)
+         rc = (*mksubpkt)(sig, opaque);
+      }
+
+    if (!rc) {
+        hash_sigversion_to_magic (md, sig);
+       md_final(md);
+
+       rc = complete_sig( sig, sk, md );
+    }
+
+    md_close (md);
+    if( rc )
+       free_seckey_enc (sig);
+    else
+       *ret_sig = sig;
+    return rc;
+}
diff --git a/g10/signal.c b/g10/signal.c
new file mode 100644 (file)
index 0000000..2e40af1
--- /dev/null
@@ -0,0 +1,238 @@
+/* signal.c - signal handling
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#ifdef HAVE_LIBREADLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+#include "options.h"
+#include "errors.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "ttyio.h"
+
+#ifdef HAVE_DOSISH_SYSTEM
+void init_signals(void) {}
+void pause_on_sigusr(int which) {}
+#else
+static volatile int caught_fatal_sig = 0;
+static volatile int caught_sigusr1 = 0;
+
+static void
+init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign )
+{
+#if defined(HAVE_SIGACTION) && defined(HAVE_STRUCT_SIGACTION)
+    struct sigaction oact, nact;
+
+    if (check_ign) {
+        /* we don't want to change an IGN handler */
+        sigaction (sig, NULL, &oact );
+        if (oact.sa_handler == SIG_IGN )
+            return;
+    }
+
+    nact.sa_handler = handler;
+    sigemptyset (&nact.sa_mask);
+    nact.sa_flags = 0;
+    sigaction ( sig, &nact, NULL);
+#else 
+    RETSIGTYPE (*ohandler)(int);
+
+    ohandler = signal (sig, handler);
+    if (check_ign && ohandler == SIG_IGN) {
+        /* Change it back if it was already set to IGN */
+        signal (sig, SIG_IGN);
+    }
+#endif
+}
+
+static RETSIGTYPE
+got_fatal_signal( int sig )
+{
+    const char *s;
+
+    if( caught_fatal_sig )
+       raise( sig );
+    caught_fatal_sig = 1;
+
+    secmem_term();
+
+#ifdef HAVE_LIBREADLINE
+    rl_free_line_state ();
+    rl_cleanup_after_signal ();
+#endif
+
+    /* Better don't translate these messages. */
+    write(2, "\n", 1 );
+    s = log_get_name(); if( s ) write(2, s, strlen(s) );
+    write(2, ": ", 2 );
+
+#if HAVE_DECL_SYS_SIGLIST && defined(NSIG)
+    s = (sig >= 0 && sig < NSIG) ? sys_siglist[sig] : "?";
+    write (2, s, strlen(s) );
+#else
+    write (2, "signal ", 7 );
+    if (sig < 0 || sig >=100)
+        write (2, "?", 1);
+    else {
+        if (sig >= 10)
+            write (2, "0123456789"+(sig/10), 1 );
+        write (2, "0123456789"+(sig%10), 1 );
+    }
+#endif
+    write(2, " caught ... exiting\n", 20 );
+
+    /* Reset action to default action and raise signal again. */
+    init_one_signal (sig, SIG_DFL, 0);
+    remove_lockfiles ();
+#ifdef __riscos__
+    riscos_close_fds ();
+#endif /* __riscos__ */
+    raise( sig );
+}
+
+
+static RETSIGTYPE
+got_usr_signal( int sig )
+{
+    caught_sigusr1 = 1;
+}
+
+
+void
+init_signals()
+{
+    init_one_signal (SIGINT, got_fatal_signal, 1 );
+    init_one_signal (SIGHUP, got_fatal_signal, 1 );
+    init_one_signal (SIGTERM, got_fatal_signal, 1 );
+    init_one_signal (SIGQUIT, got_fatal_signal, 1 );
+    init_one_signal (SIGSEGV, got_fatal_signal, 1 );
+    init_one_signal (SIGUSR1, got_usr_signal, 0 );
+    init_one_signal (SIGPIPE, SIG_IGN, 0 );
+}
+
+
+void
+pause_on_sigusr( int which )
+{
+#if defined(HAVE_SIGPROCMASK) && defined(HAVE_SIGSET_T)
+    sigset_t mask, oldmask;
+
+    assert( which == 1 );
+    sigemptyset( &mask );
+    sigaddset( &mask, SIGUSR1 );
+
+    sigprocmask( SIG_BLOCK, &mask, &oldmask );
+    while( !caught_sigusr1 )
+       sigsuspend( &oldmask );
+    caught_sigusr1 = 0;
+    sigprocmask( SIG_UNBLOCK, &mask, NULL );
+#else 
+     assert (which == 1);
+     sighold (SIGUSR1);
+     while (!caught_sigusr1)
+         sigpause(SIGUSR1);
+     caught_sigusr1 = 0;
+     sigrelse(SIGUSR1);
+#endif /*! HAVE_SIGPROCMASK && HAVE_SIGSET_T */
+}
+
+/* Disabled - see comment in tdbio.c:tdbio_begin_transaction() */
+#if 0
+static void
+do_block( int block )
+{
+    static int is_blocked;
+#if defined(HAVE_SIGPROCMASK) && defined(HAVE_SIGSET_T)
+    static sigset_t oldmask;
+
+    if( block ) {
+        sigset_t newmask;
+
+       if( is_blocked )
+           log_bug("signals are already blocked\n");
+       sigfillset( &newmask );
+       sigprocmask( SIG_BLOCK, &newmask, &oldmask );
+       is_blocked = 1;
+    }
+    else {
+       if( !is_blocked )
+           log_bug("signals are not blocked\n");
+       sigprocmask( SIG_SETMASK, &oldmask, NULL );
+       is_blocked = 0;
+    }
+#else /*! HAVE_SIGPROCMASK && HAVE_SIGSET_T */
+
+#if defined(NSIG)
+#define SIGSMAX (NSIG)
+#elif defined(MAXSIG)
+#define SIGSMAX (MAXSIG+1)
+#else
+#error "define SIGSMAX to the number of signals on your platform plus one"
+#endif
+
+    static void (*disposition[SIGSMAX])(int);
+    int sig;
+
+    if( block ) {
+       if( is_blocked )
+           log_bug("signals are already blocked\n");
+        for (sig=1; sig < SIGSMAX; sig++) {
+            disposition[sig] = sigset (sig, SIG_HOLD);
+        }
+       is_blocked = 1;
+    }
+    else {
+       if( !is_blocked )
+           log_bug("signals are not blocked\n");
+        for (sig=1; sig < SIGSMAX; sig++) {
+            sigset (sig, disposition[sig]);
+        }
+       is_blocked = 0;
+    }
+#endif /*! HAVE_SIGPROCMASK && HAVE_SIGSET_T */
+}
+
+void
+block_all_signals()
+{
+    do_block(1);
+}
+
+void
+unblock_all_signals()
+{
+    do_block(0);
+}
+#endif
+
+#endif /* !HAVE_DOSISH_SYSTEM */
diff --git a/g10/skclist.c b/g10/skclist.c
new file mode 100644 (file)
index 0000000..5e55e24
--- /dev/null
@@ -0,0 +1,223 @@
+/* skclist.c
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "i18n.h"
+#include "cipher.h"
+
+
+void
+release_sk_list( SK_LIST sk_list )
+{
+    SK_LIST sk_rover;
+
+    for( ; sk_list; sk_list = sk_rover ) {
+       sk_rover = sk_list->next;
+       free_secret_key( sk_list->sk );
+       xfree( sk_list );
+    }
+}
+
+
+/* Check that we are only using keys which don't have
+ * the string "(insecure!)" or "not secure" or "do not use"
+ * in one of the user ids
+ */
+static int
+is_insecure( PKT_secret_key *sk )
+{
+    u32 keyid[2];
+    KBNODE node = NULL, u;
+    int insecure = 0;
+
+    keyid_from_sk( sk, keyid );
+    node = get_pubkeyblock( keyid );
+    for ( u = node; u; u = u->next ) {
+        if ( u->pkt->pkttype == PKT_USER_ID ) {
+            PKT_user_id *id = u->pkt->pkt.user_id;
+            if ( id->attrib_data )
+                continue; /* skip attribute packets */
+            if ( strstr( id->name, "(insecure!)" )
+                 || strstr( id->name, "not secure" )
+                 || strstr( id->name, "do not use" )
+                 || strstr( id->name, "(INSECURE!)" ) ) {
+                insecure = 1;
+                break;
+            }
+        }
+    }
+    release_kbnode( node );
+    
+    return insecure;
+}
+
+static int
+key_present_in_sk_list(SK_LIST sk_list, PKT_secret_key *sk)
+{
+    for (; sk_list; sk_list = sk_list->next) {
+       if ( !cmp_secret_keys(sk_list->sk, sk) )
+           return 0;
+    }
+    return -1;
+}
+
+static int
+is_duplicated_entry (STRLIST list, STRLIST item)
+{
+    for(; list && list != item; list = list->next) {
+        if ( !strcmp (list->d, item->d) )
+            return 1;
+    }
+    return 0;
+}
+
+
+int
+build_sk_list( STRLIST locusr, SK_LIST *ret_sk_list,
+               int unlock, unsigned int use )
+{
+    SK_LIST sk_list = NULL;
+    int rc;
+
+    if( !locusr )
+      { /* use the default one */
+       PKT_secret_key *sk;
+
+       sk = xmalloc_clear( sizeof *sk );
+       sk->req_usage = use;
+       if( (rc = get_seckey_byname( sk, NULL, unlock )) ) {
+         free_secret_key( sk ); sk = NULL;
+         log_error("no default secret key: %s\n", g10_errstr(rc) );
+       }
+       else if( !(rc=check_pubkey_algo2(sk->pubkey_algo, use)) )
+         {
+           SK_LIST r;
+
+           if( random_is_faked() && !is_insecure( sk ) )
+             {
+               log_info(_("key is not flagged as insecure - "
+                          "can't use it with the faked RNG!\n"));
+               free_secret_key( sk ); sk = NULL;
+             }
+           else
+             {
+               r = xmalloc( sizeof *r );
+               r->sk = sk; sk = NULL;
+               r->next = sk_list;
+               r->mark = 0;
+               sk_list = r;
+             }
+         }
+       else
+         {
+           free_secret_key( sk ); sk = NULL;
+           log_error("invalid default secret key: %s\n", g10_errstr(rc) );
+         }
+      }
+    else {
+        STRLIST locusr_orig = locusr;
+       for(; locusr; locusr = locusr->next ) {
+           PKT_secret_key *sk;
+            
+            rc = 0;
+            /* Do an early check agains duplicated entries.  However this
+             * won't catch all duplicates because the user IDs may be
+             * specified in different ways.
+             */
+            if ( is_duplicated_entry ( locusr_orig, locusr ) )
+             {
+               log_error(_("skipped \"%s\": duplicated\n"), locusr->d );
+                continue;
+             }
+           sk = xmalloc_clear( sizeof *sk );
+           sk->req_usage = use;
+           if( (rc = get_seckey_byname( sk, locusr->d, 0 )) )
+             {
+               free_secret_key( sk ); sk = NULL;
+               log_error(_("skipped \"%s\": %s\n"),
+                         locusr->d, g10_errstr(rc) );
+             }
+            else if ( key_present_in_sk_list(sk_list, sk) == 0) {
+                free_secret_key(sk); sk = NULL;
+                log_info(_("skipped: secret key already present\n"));
+            }
+            else if ( unlock && (rc = check_secret_key( sk, 0 )) )
+             {
+               free_secret_key( sk ); sk = NULL;
+               log_error(_("skipped \"%s\": %s\n"),
+                         locusr->d, g10_errstr(rc) );
+             }
+           else if( !(rc=check_pubkey_algo2(sk->pubkey_algo, use)) ) {
+               SK_LIST r;
+
+               if( sk->version == 4 && (use & PUBKEY_USAGE_SIG)
+                   && sk->pubkey_algo == PUBKEY_ALGO_ELGAMAL_E )
+                 {
+                   log_info(_("skipped \"%s\": %s\n"),locusr->d,
+                            _("this is a PGP generated Elgamal key which"
+                              " is not secure for signatures!"));
+                   free_secret_key( sk ); sk = NULL;
+                 }
+               else if( random_is_faked() && !is_insecure( sk ) ) {
+                   log_info(_("key is not flagged as insecure - "
+                              "can't use it with the faked RNG!\n"));
+                   free_secret_key( sk ); sk = NULL;
+               }
+               else {
+                   r = xmalloc( sizeof *r );
+                   r->sk = sk; sk = NULL;
+                   r->next = sk_list;
+                   r->mark = 0;
+                   sk_list = r;
+               }
+           }
+           else {
+               free_secret_key( sk ); sk = NULL;
+               log_error("skipped \"%s\": %s\n", locusr->d, g10_errstr(rc) );
+           }
+       }
+    }
+
+
+    if( !rc && !sk_list ) {
+       log_error("no valid signators\n");
+       rc = G10ERR_NO_USER_ID;
+    }
+
+    if( rc )
+       release_sk_list( sk_list );
+    else
+       *ret_sk_list = sk_list;
+    return rc;
+}
+
diff --git a/g10/status.c b/g10/status.c
new file mode 100644 (file)
index 0000000..2044820
--- /dev/null
@@ -0,0 +1,790 @@
+/* status.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <signal.h>
+#ifdef USE_SHM_COPROCESSING
+#ifdef USE_CAPABILITIES
+#include <sys/capability.h>
+#endif
+#ifdef HAVE_SYS_IPC_H
+#include <sys/types.h>
+#include <sys/ipc.h>
+#endif
+#ifdef HAVE_SYS_SHM_H
+#include <sys/shm.h>
+#endif
+#if defined(HAVE_MLOCK)
+#include <sys/mman.h>
+#endif
+#endif
+#include "util.h"
+#include "status.h"
+#include "ttyio.h"
+#include "options.h"
+#include "main.h"
+#include "i18n.h"
+#include "cipher.h" /* for progress functions */
+
+#define CONTROL_D ('D' - 'A' + 1)
+
+
+
+static FILE *statusfp;
+
+#ifdef USE_SHM_COPROCESSING
+  static int shm_id = -1;
+  static volatile char *shm_area;
+  static size_t shm_size;
+  static int shm_is_locked;
+#endif /*USE_SHM_COPROCESSING*/
+
+
+static void
+progress_cb ( void *ctx, int c )
+{
+    char buf[50];
+
+    if ( c == '\n' )
+       sprintf ( buf, "%.20s X 100 100", (char*)ctx );
+    else
+       sprintf ( buf, "%.20s %c 0 0", (char*)ctx, c );
+    write_status_text ( STATUS_PROGRESS, buf );
+}
+
+static const char *
+get_status_string ( int no ) 
+{
+  const char *s;
+
+  switch( no )
+    {
+    case STATUS_ENTER  : s = "ENTER"; break;
+    case STATUS_LEAVE  : s = "LEAVE"; break;
+    case STATUS_ABORT  : s = "ABORT"; break;
+    case STATUS_NEWSIG : s = "NEWSIG"; break;
+    case STATUS_GOODSIG: s = "GOODSIG"; break;
+    case STATUS_KEYEXPIRED: s = "KEYEXPIRED"; break;
+    case STATUS_KEYREVOKED: s = "KEYREVOKED"; break;
+    case STATUS_BADSIG : s = "BADSIG"; break;
+    case STATUS_ERRSIG : s = "ERRSIG"; break;
+    case STATUS_BADARMOR : s = "BADARMOR"; break;
+    case STATUS_RSA_OR_IDEA : s= "RSA_OR_IDEA"; break;
+    case STATUS_TRUST_UNDEFINED: s = "TRUST_UNDEFINED"; break;
+    case STATUS_TRUST_NEVER     : s = "TRUST_NEVER"; break;
+    case STATUS_TRUST_MARGINAL : s = "TRUST_MARGINAL"; break;
+    case STATUS_TRUST_FULLY     : s = "TRUST_FULLY"; break;
+    case STATUS_TRUST_ULTIMATE : s = "TRUST_ULTIMATE"; break;
+    case STATUS_GET_BOOL        : s = "GET_BOOL"; break;
+    case STATUS_GET_LINE        : s = "GET_LINE"; break;
+    case STATUS_GET_HIDDEN      : s = "GET_HIDDEN"; break;
+    case STATUS_GOT_IT  : s = "GOT_IT"; break;
+    case STATUS_SHM_INFO        : s = "SHM_INFO"; break;
+    case STATUS_SHM_GET         : s = "SHM_GET"; break;
+    case STATUS_SHM_GET_BOOL    : s = "SHM_GET_BOOL"; break;
+    case STATUS_SHM_GET_HIDDEN : s = "SHM_GET_HIDDEN"; break;
+    case STATUS_NEED_PASSPHRASE: s = "NEED_PASSPHRASE"; break;
+    case STATUS_VALIDSIG        : s = "VALIDSIG"; break;
+    case STATUS_SIG_ID  : s = "SIG_ID"; break;
+    case STATUS_ENC_TO  : s = "ENC_TO"; break;
+    case STATUS_NODATA  : s = "NODATA"; break;
+    case STATUS_BAD_PASSPHRASE : s = "BAD_PASSPHRASE"; break;
+    case STATUS_NO_PUBKEY       : s = "NO_PUBKEY"; break;
+    case STATUS_NO_SECKEY       : s = "NO_SECKEY"; break;
+    case STATUS_NEED_PASSPHRASE_SYM: s = "NEED_PASSPHRASE_SYM"; break;
+    case STATUS_NEED_PASSPHRASE_PIN: s = "NEED_PASSPHRASE_PIN"; break;
+    case STATUS_DECRYPTION_FAILED: s = "DECRYPTION_FAILED"; break;
+    case STATUS_DECRYPTION_OKAY: s = "DECRYPTION_OKAY"; break;
+    case STATUS_MISSING_PASSPHRASE: s = "MISSING_PASSPHRASE"; break;
+    case STATUS_GOOD_PASSPHRASE : s = "GOOD_PASSPHRASE"; break;
+    case STATUS_GOODMDC         : s = "GOODMDC"; break;
+    case STATUS_BADMDC  : s = "BADMDC"; break;
+    case STATUS_ERRMDC  : s = "ERRMDC"; break;
+    case STATUS_IMPORTED        : s = "IMPORTED"; break;
+    case STATUS_IMPORT_OK       : s = "IMPORT_OK"; break;
+    case STATUS_IMPORT_CHECK   : s = "IMPORT_CHECK"; break;
+    case STATUS_IMPORT_RES      : s = "IMPORT_RES"; break;
+    case STATUS_FILE_START      : s = "FILE_START"; break;
+    case STATUS_FILE_DONE       : s = "FILE_DONE"; break;
+    case STATUS_FILE_ERROR      : s = "FILE_ERROR"; break;
+    case STATUS_BEGIN_DECRYPTION:s = "BEGIN_DECRYPTION"; break;
+    case STATUS_END_DECRYPTION : s = "END_DECRYPTION"; break;
+    case STATUS_BEGIN_ENCRYPTION:s = "BEGIN_ENCRYPTION"; break;
+    case STATUS_END_ENCRYPTION : s = "END_ENCRYPTION"; break;
+    case STATUS_DELETE_PROBLEM : s = "DELETE_PROBLEM"; break;
+    case STATUS_PROGRESS       : s = "PROGRESS"; break;
+    case STATUS_SIG_CREATED    : s = "SIG_CREATED"; break;
+    case STATUS_SESSION_KEY    : s = "SESSION_KEY"; break;
+    case STATUS_NOTATION_NAME  : s = "NOTATION_NAME" ; break;
+    case STATUS_NOTATION_DATA  : s = "NOTATION_DATA" ; break;
+    case STATUS_POLICY_URL     : s = "POLICY_URL" ; break;
+    case STATUS_BEGIN_STREAM   : s = "BEGIN_STREAM"; break;
+    case STATUS_END_STREAM     : s = "END_STREAM"; break;
+    case STATUS_KEY_CREATED    : s = "KEY_CREATED"; break;
+    case STATUS_KEY_NOT_CREATED: s = "KEY_NOT_CREATED"; break;
+    case STATUS_USERID_HINT    : s = "USERID_HINT"; break;
+    case STATUS_UNEXPECTED     : s = "UNEXPECTED"; break;
+    case STATUS_INV_RECP       : s = "INV_RECP"; break;
+    case STATUS_NO_RECP        : s = "NO_RECP"; break;
+    case STATUS_ALREADY_SIGNED : s = "ALREADY_SIGNED"; break;
+    case STATUS_SIGEXPIRED     : s = "SIGEXPIRED deprecated-use-keyexpired-instead"; break;
+    case STATUS_EXPSIG         : s = "EXPSIG"; break;
+    case STATUS_EXPKEYSIG      : s = "EXPKEYSIG"; break;
+    case STATUS_REVKEYSIG      : s = "REVKEYSIG"; break;
+    case STATUS_ATTRIBUTE      : s = "ATTRIBUTE"; break;
+    case STATUS_CARDCTRL       : s = "CARDCTRL"; break;
+    case STATUS_PLAINTEXT      : s = "PLAINTEXT"; break;
+    case STATUS_PLAINTEXT_LENGTH:s = "PLAINTEXT_LENGTH"; break;
+    case STATUS_SIG_SUBPACKET  : s = "SIG_SUBPACKET"; break;
+    case STATUS_SC_OP_SUCCESS  : s = "SC_OP_SUCCESS"; break;
+    case STATUS_SC_OP_FAILURE  : s = "SC_OP_FAILURE"; break;
+    case STATUS_BACKUP_KEY_CREATED:s="BACKUP_KEY_CREATED"; break;
+    case STATUS_PKA_TRUST_BAD  : s = "PKA_TRUST_BAD"; break;
+    case STATUS_PKA_TRUST_GOOD : s = "PKA_TRUST_GOOD"; break;
+    case STATUS_BEGIN_SIGNING  : s = "BEGIN_SIGNING"; break;
+    default: s = "?"; break;
+    }
+  return s;
+}
+
+
+/* Return true if the status message NO may currently be issued.  We
+   need this to avoid syncronisation problem while auto retrieving a
+   key.  There it may happen that a status NODATA is issued for a non
+   available key and the user may falsely interpret this has a missing
+   signature. */
+static int
+status_currently_allowed (int no)
+{
+  if (!glo_ctrl.in_auto_key_retrieve)
+    return 1; /* Yes. */
+
+  /* We allow some statis anyway, so that import statistics are
+     correct and to avoid problems if the retriebval subsystem will
+     prompt the user. */
+  switch (no)
+    {
+    case STATUS_GET_BOOL:       
+    case STATUS_GET_LINE:       
+    case STATUS_GET_HIDDEN:     
+    case STATUS_GOT_IT:         
+    case STATUS_IMPORTED:
+    case STATUS_IMPORT_OK:     
+    case STATUS_IMPORT_CHECK:  
+    case STATUS_IMPORT_RES:
+      return 1; /* Yes. */
+    default:
+      break;
+    }
+  return 0; /* No. */
+}
+
+
+void
+set_status_fd ( int fd )
+{
+    static int last_fd = -1;
+
+    if ( fd != -1 && last_fd == fd )
+        return;
+
+    if ( statusfp && statusfp != stdout && statusfp != stderr )
+        fclose (statusfp);
+    statusfp = NULL;
+    if ( fd == -1 ) 
+        return;
+
+    if( fd == 1 )
+       statusfp = stdout;
+    else if( fd == 2 )
+       statusfp = stderr;
+    else
+       statusfp = fdopen( fd, "w" );
+    if( !statusfp ) {
+       log_fatal("can't open fd %d for status output: %s\n",
+                  fd, strerror(errno));
+    }
+    last_fd = fd;
+    register_primegen_progress ( progress_cb, "primegen" );
+    register_pk_dsa_progress ( progress_cb, "pk_dsa" );
+    register_pk_elg_progress ( progress_cb, "pk_elg" );
+}
+
+int
+is_status_enabled()
+{
+    return !!statusfp;
+}
+
+void
+write_status ( int no )
+{
+    write_status_text( no, NULL );
+}
+
+void
+write_status_text ( int no, const char *text)
+{
+    if( !statusfp || !status_currently_allowed (no) )
+       return;  /* Not enabled or allowed. */
+
+    fputs ( "[GNUPG:] ", statusfp );
+    fputs ( get_status_string (no), statusfp );
+    if( text ) {
+        putc ( ' ', statusfp );
+        for (; *text; text++) {
+            if (*text == '\n')
+                fputs ( "\\n", statusfp );
+            else if (*text == '\r')
+                fputs ( "\\r", statusfp );
+            else 
+                putc ( *(const byte *)text,  statusfp );
+        }
+    }
+    putc ('\n',statusfp);
+    if ( fflush (statusfp) && opt.exit_on_status_write_error )
+      g10_exit (0);
+}
+
+
+/*
+ * Write a status line with a buffer using %XX escapes.  If WRAP is >
+ * 0 wrap the line after this length.  If STRING is not NULL it will
+ * be prepended to the buffer, no escaping is done for string.
+ * A wrap of -1 forces spaces not to be encoded as %20.
+ */
+void
+write_status_text_and_buffer ( int no, const char *string,
+                               const char *buffer, size_t len, int wrap )
+{
+    const char *s, *text;
+    int esc, first;
+    int lower_limit = ' ';
+    size_t n, count, dowrap;
+
+    if( !statusfp || !status_currently_allowed (no) )
+       return;  /* Not enabled or allowed. */
+    
+    if (wrap == -1) {
+        lower_limit--;
+        wrap = 0;
+    }
+
+    text = get_status_string (no);
+    count = dowrap = first = 1;
+    do {
+        if (dowrap) {
+            fprintf (statusfp, "[GNUPG:] %s ", text );
+            count = dowrap = 0;
+            if (first && string) {
+                fputs (string, statusfp);
+                count += strlen (string);
+            }
+            first = 0;
+        }
+        for (esc=0, s=buffer, n=len; n && !esc; s++, n-- ) {
+            if ( *s == '%' || *(const byte*)s <= lower_limit 
+                           || *(const byte*)s == 127 ) 
+                esc = 1;
+            if ( wrap && ++count > wrap ) {
+                dowrap=1;
+                break;
+            }
+        }
+        if (esc) {
+            s--; n++;
+        }
+        if (s != buffer) 
+            fwrite (buffer, s-buffer, 1, statusfp );
+        if ( esc ) {
+            fprintf (statusfp, "%%%02X", *(const byte*)s );
+            s++; n--;
+        }
+        buffer = s;
+        len = n;
+        if ( dowrap && len )
+            putc ( '\n', statusfp );
+    } while ( len );
+
+    putc ('\n',statusfp);
+    if ( fflush (statusfp) && opt.exit_on_status_write_error )
+      g10_exit (0);
+}
+
+void
+write_status_buffer ( int no, const char *buffer, size_t len, int wrap )
+{
+    write_status_text_and_buffer (no, NULL, buffer, len, wrap);
+}
+
+
+#ifdef USE_SHM_COPROCESSING
+
+#ifndef IPC_RMID_DEFERRED_RELEASE
+static void
+remove_shmid( void )
+{
+    if( shm_id != -1 ) {
+       shmctl ( shm_id, IPC_RMID, 0);
+       shm_id = -1;
+    }
+}
+#endif
+
+void
+init_shm_coprocessing ( ulong requested_shm_size, int lock_mem )
+{
+    char buf[100];
+    struct shmid_ds shmds;
+
+#ifndef IPC_RMID_DEFERRED_RELEASE
+    atexit( remove_shmid );
+#endif
+    requested_shm_size = (requested_shm_size + 4095) & ~4095;
+    if ( requested_shm_size > 2 * 4096 )
+       log_fatal("too much shared memory requested; only 8k are allowed\n");
+    shm_size = 4096 /* one page for us */ + requested_shm_size;
+
+    shm_id = shmget( IPC_PRIVATE, shm_size, IPC_CREAT | 0700 );
+    if ( shm_id == -1 )
+       log_fatal("can't get %uk of shared memory: %s\n",
+                               (unsigned)shm_size/1024, strerror(errno));
+
+#if !defined(IPC_HAVE_SHM_LOCK) \
+      && defined(HAVE_MLOCK) && !defined(HAVE_BROKEN_MLOCK)
+    /* part of the old code which uses mlock */
+    shm_area = shmat( shm_id, 0, 0 );
+    if ( shm_area == (char*)-1 )
+       log_fatal("can't attach %uk shared memory: %s\n",
+                               (unsigned)shm_size/1024, strerror(errno));
+    log_debug("mapped %uk shared memory at %p, id=%d\n",
+                           (unsigned)shm_size/1024, shm_area, shm_id );
+    if( lock_mem ) {
+#ifdef USE_CAPABILITIES
+       cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
+#endif
+       /* (need the cast for Solaris with Sun's workshop compilers) */
+       if ( mlock ( (char*)shm_area, shm_size) )
+           log_info("locking shared memory %d failed: %s\n",
+                               shm_id, strerror(errno));
+       else
+           shm_is_locked = 1;
+#ifdef USE_CAPABILITIES
+       cap_set_proc( cap_from_text("cap_ipc_lock+p") );
+#endif
+    }
+
+#ifdef IPC_RMID_DEFERRED_RELEASE
+    if( shmctl( shm_id, IPC_RMID, 0) )
+       log_fatal("shmctl IPC_RMDID of %d failed: %s\n",
+                                           shm_id, strerror(errno));
+#endif
+
+    if( shmctl( shm_id, IPC_STAT, &shmds ) )
+       log_fatal("shmctl IPC_STAT of %d failed: %s\n",
+                                           shm_id, strerror(errno));
+    if( shmds.shm_perm.uid != getuid() ) {
+       shmds.shm_perm.uid = getuid();
+       if( shmctl( shm_id, IPC_SET, &shmds ) )
+           log_fatal("shmctl IPC_SET of %d failed: %s\n",
+                                               shm_id, strerror(errno));
+    }
+
+#else /* this is the new code which handles the changes in the SHM
+       * semantics introduced with Linux 2.4.  The changes is that we
+       * now change the permissions and then attach to the memory.
+       */
+
+    if( lock_mem ) {
+#ifdef USE_CAPABILITIES
+       cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
+#endif
+#ifdef IPC_HAVE_SHM_LOCK
+       if ( shmctl (shm_id, SHM_LOCK, 0) )
+           log_info("locking shared memory %d failed: %s\n",
+                               shm_id, strerror(errno));
+       else
+           shm_is_locked = 1;
+#else
+       log_info("Locking shared memory %d failed: No way to do it\n", shm_id );
+#endif
+#ifdef USE_CAPABILITIES
+       cap_set_proc( cap_from_text("cap_ipc_lock+p") );
+#endif
+    }
+
+    if( shmctl( shm_id, IPC_STAT, &shmds ) )
+       log_fatal("shmctl IPC_STAT of %d failed: %s\n",
+                                           shm_id, strerror(errno));
+    if( shmds.shm_perm.uid != getuid() ) {
+       shmds.shm_perm.uid = getuid();
+       if( shmctl( shm_id, IPC_SET, &shmds ) )
+           log_fatal("shmctl IPC_SET of %d failed: %s\n",
+                                               shm_id, strerror(errno));
+    }
+
+    shm_area = shmat( shm_id, 0, 0 );
+    if ( shm_area == (char*)-1 )
+       log_fatal("can't attach %uk shared memory: %s\n",
+                               (unsigned)shm_size/1024, strerror(errno));
+    log_debug("mapped %uk shared memory at %p, id=%d\n",
+                           (unsigned)shm_size/1024, shm_area, shm_id );
+
+#ifdef IPC_RMID_DEFERRED_RELEASE
+    if( shmctl( shm_id, IPC_RMID, 0) )
+       log_fatal("shmctl IPC_RMDID of %d failed: %s\n",
+                                           shm_id, strerror(errno));
+#endif
+
+#endif
+    /* write info; Protocol version, id, size, locked size */
+    sprintf( buf, "pv=1 pid=%d shmid=%d sz=%u lz=%u", (int)getpid(),
+           shm_id, (unsigned)shm_size, shm_is_locked? (unsigned)shm_size:0 );
+    write_status_text( STATUS_SHM_INFO, buf );
+}
+
+/****************
+ * Request a string from client
+ * If bool, returns static string on true (do not free) or NULL for false
+ */
+static char *
+do_shm_get( const char *keyword, int hidden, int bool )
+{
+    size_t n;
+    byte *p;
+    char *string;
+
+    if( !shm_area )
+       BUG();
+
+    shm_area[0] = 0;  /* msb of length of control block */
+    shm_area[1] = 32; /* and lsb */
+    shm_area[2] = 1;  /* indicate that we are waiting on a reply */
+    shm_area[3] = 0;  /* clear data available flag */
+
+    write_status_text( bool? STATUS_SHM_GET_BOOL :
+                      hidden? STATUS_SHM_GET_HIDDEN : STATUS_SHM_GET, keyword );
+
+    do {
+       pause_on_sigusr(1);
+       if( shm_area[0] || shm_area[1] != 32 || shm_area[2] != 1 )
+           log_fatal("client modified shm control block - abort\n");
+    } while( !shm_area[3] );
+    shm_area[2] = 0; /* reset request flag */
+    p = (byte*)shm_area+32;
+    n = p[0] << 8 | p[1];
+    p += 2;
+    if( n+32+2+1 > 4095 )
+       log_fatal("client returns too large data (%u bytes)\n", (unsigned)n );
+
+    if( bool )
+       return p[0]? "" : NULL;
+
+    string = hidden? xmalloc_secure( n+1 ) : xmalloc( n+1 );
+    memcpy(string, p, n );
+    string[n] = 0; /* make sure it is a string */
+    if( hidden ) /* invalidate the memory */
+       memset( p, 0, n );
+
+    return string;
+}
+
+#endif /* USE_SHM_COPROCESSING */
+
+static int
+myread(int fd, void *buf, size_t count)
+{
+    int rc;
+    do {
+        rc = read( fd, buf, count );
+    } while ( rc == -1 && errno == EINTR );
+    if ( !rc && count ) {
+        static int eof_emmited=0;
+        if ( eof_emmited < 3 ) {
+            *(char*)buf = CONTROL_D;
+            rc = 1;
+            eof_emmited++;
+        }
+        else { /* Ctrl-D not caught - do something reasonable */
+#ifdef HAVE_DOSISH_SYSTEM
+            raise (SIGINT);  /* nothing to hangup under DOS */
+#else
+            raise (SIGHUP); /* no more input data */
+#endif
+        }
+    }    
+    return rc;
+}
+
+
+
+/****************
+ * Request a string from the client over the command-fd
+ * If bool, returns static string on true (do not free) or NULL for false
+ */
+static char *
+do_get_from_fd( const char *keyword, int hidden, int bool )
+{
+    int i, len;
+    char *string;
+
+    if(statusfp!=stdout)
+      fflush(stdout);
+
+    write_status_text( bool? STATUS_GET_BOOL :
+                      hidden? STATUS_GET_HIDDEN : STATUS_GET_LINE, keyword );
+
+    for( string = NULL, i = len = 200; ; i++ ) {
+       if( i >= len-1 ) {
+           char *save = string;
+           len += 100;
+           string = hidden? xmalloc_secure ( len ) : xmalloc ( len );
+           if( save )
+               memcpy(string, save, i );
+           else
+               i=0;
+       }
+       /* Hmmm: why not use our read_line function here */
+       if( myread( opt.command_fd, string+i, 1) != 1 || string[i] == '\n'  )
+            break;
+        else if ( string[i] == CONTROL_D ) {
+            /* found ETX - cancel the line and return a sole ETX */
+            string[0] = CONTROL_D;
+            i=1;
+            break;
+        }
+    }
+    string[i] = 0;
+
+    write_status( STATUS_GOT_IT );
+
+    if( bool )  /* Fixme: is this correct??? */
+       return (string[0] == 'Y' || string[0] == 'y') ? "" : NULL;
+
+    return string;
+}
+
+
+
+int
+cpr_enabled()
+{
+    if( opt.command_fd != -1 )
+       return 1;
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return 1;
+#endif
+    return 0;
+}
+
+char *
+cpr_get_no_help( const char *keyword, const char *prompt )
+{
+    char *p;
+
+    if( opt.command_fd != -1 )
+       return do_get_from_fd ( keyword, 0, 0 );
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return do_shm_get( keyword, 0, 0 );
+#endif
+    for(;;) {
+       p = tty_get( prompt );
+        return p;
+    }
+}
+
+char *
+cpr_get( const char *keyword, const char *prompt )
+{
+    char *p;
+
+    if( opt.command_fd != -1 )
+       return do_get_from_fd ( keyword, 0, 0 );
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return do_shm_get( keyword, 0, 0 );
+#endif
+    for(;;) {
+       p = tty_get( prompt );
+       if( *p=='?' && !p[1] && !(keyword && !*keyword)) {
+           xfree(p);
+           display_online_help( keyword );
+       }
+       else
+           return p;
+    }
+}
+
+
+char *
+cpr_get_utf8( const char *keyword, const char *prompt )
+{
+    char *p;
+    p = cpr_get( keyword, prompt );
+    if( p ) {
+       char *utf8 = native_to_utf8( p );
+       xfree( p );
+       p = utf8;
+    }
+    return p;
+}
+
+char *
+cpr_get_hidden( const char *keyword, const char *prompt )
+{
+    char *p;
+
+    if( opt.command_fd != -1 )
+       return do_get_from_fd ( keyword, 1, 0 );
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return do_shm_get( keyword, 1, 0 );
+#endif
+    for(;;) {
+       p = tty_get_hidden( prompt );
+       if( *p == '?' && !p[1] ) {
+           xfree(p);
+           display_online_help( keyword );
+       }
+       else
+           return p;
+    }
+}
+
+void
+cpr_kill_prompt(void)
+{
+    if( opt.command_fd != -1 )
+       return;
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return;
+#endif
+    tty_kill_prompt();
+    return;
+}
+
+int
+cpr_get_answer_is_yes( const char *keyword, const char *prompt )
+{
+    int yes;
+    char *p;
+
+    if( opt.command_fd != -1 )
+       return !!do_get_from_fd ( keyword, 0, 1 );
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return !!do_shm_get( keyword, 0, 1 );
+#endif
+    for(;;) {
+       p = tty_get( prompt );
+       trim_spaces(p); /* it is okay to do this here */
+       if( *p == '?' && !p[1] ) {
+           xfree(p);
+           display_online_help( keyword );
+       }
+       else {
+           tty_kill_prompt();
+           yes = answer_is_yes(p);
+           xfree(p);
+           return yes;
+       }
+    }
+}
+
+int
+cpr_get_answer_yes_no_quit( const char *keyword, const char *prompt )
+{
+    int yes;
+    char *p;
+
+    if( opt.command_fd != -1 )
+       return !!do_get_from_fd ( keyword, 0, 1 );
+#ifdef USE_SHM_COPROCESSING
+    if( opt.shm_coprocess )
+       return !!do_shm_get( keyword, 0, 1 );
+#endif
+    for(;;) {
+       p = tty_get( prompt );
+       trim_spaces(p); /* it is okay to do this here */
+       if( *p == '?' && !p[1] ) {
+           xfree(p);
+           display_online_help( keyword );
+       }
+       else {
+           tty_kill_prompt();
+           yes = answer_is_yes_no_quit(p);
+           xfree(p);
+           return yes;
+       }
+    }
+}
+
+
+int
+cpr_get_answer_okay_cancel (const char *keyword,
+                            const char *prompt,
+                            int def_answer)
+{
+  int yes;
+  char *answer = NULL;
+  char *p;
+
+  if( opt.command_fd != -1 )
+    answer = do_get_from_fd ( keyword, 0, 0 );
+#ifdef USE_SHM_COPROCESSING
+  else if( opt.shm_coprocess )
+    answer = do_shm_get( keyword, 0, 0 );
+#endif
+
+  if (answer)
+    {
+      yes = answer_is_okay_cancel (answer, def_answer);
+      xfree (answer);
+      return yes;
+    }
+
+  for(;;)
+    {
+      p = tty_get( prompt );
+      trim_spaces(p); /* it is okay to do this here */
+      if (*p == '?' && !p[1])
+        {
+          xfree(p);
+          display_online_help (keyword);
+       }
+      else
+        {
+          tty_kill_prompt();
+          yes = answer_is_okay_cancel (p, def_answer);
+          xfree(p);
+          return yes;
+       }
+    }
+}
diff --git a/g10/status.h b/g10/status.h
new file mode 100644 (file)
index 0000000..bc7271d
--- /dev/null
@@ -0,0 +1,150 @@
+/* status.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_STATUS_H
+#define G10_STATUS_H
+
+#define STATUS_ENTER    1
+#define STATUS_LEAVE    2
+#define STATUS_ABORT    3
+
+#define STATUS_GOODSIG  4
+#define STATUS_BADSIG   5
+#define STATUS_ERRSIG   6
+
+#define STATUS_BADARMOR  7
+
+#define STATUS_RSA_OR_IDEA 8
+#define STATUS_KEYEXPIRED  9
+#define STATUS_KEYREVOKED  10
+
+#define STATUS_TRUST_UNDEFINED 11
+#define STATUS_TRUST_NEVER     12
+#define STATUS_TRUST_MARGINAL  13
+#define STATUS_TRUST_FULLY     14
+#define STATUS_TRUST_ULTIMATE  15
+
+#define STATUS_SHM_INFO        16
+#define STATUS_SHM_GET        17
+#define STATUS_SHM_GET_BOOL    18
+#define STATUS_SHM_GET_HIDDEN  19
+
+#define STATUS_NEED_PASSPHRASE 20
+#define STATUS_VALIDSIG        21
+#define STATUS_SIG_ID         22
+#define STATUS_ENC_TO         23
+#define STATUS_NODATA         24
+#define STATUS_BAD_PASSPHRASE  25
+#define STATUS_NO_PUBKEY       26
+#define STATUS_NO_SECKEY       27
+#define STATUS_NEED_PASSPHRASE_SYM 28
+#define STATUS_DECRYPTION_FAILED 29
+#define STATUS_DECRYPTION_OKAY  30
+#define STATUS_MISSING_PASSPHRASE 31
+#define STATUS_GOOD_PASSPHRASE 32
+#define STATUS_GOODMDC         33
+#define STATUS_BADMDC          34
+#define STATUS_ERRMDC          35
+#define STATUS_IMPORTED        36
+#define STATUS_IMPORT_RES      37
+#define STATUS_FILE_START      38
+#define STATUS_FILE_DONE       39
+#define STATUS_FILE_ERROR      40
+
+#define STATUS_BEGIN_DECRYPTION 41
+#define STATUS_END_DECRYPTION  42
+#define STATUS_BEGIN_ENCRYPTION 43
+#define STATUS_END_ENCRYPTION  44
+
+#define STATUS_DELETE_PROBLEM  45
+#define STATUS_GET_BOOL        46
+#define STATUS_GET_LINE        47
+#define STATUS_GET_HIDDEN      48
+#define STATUS_GOT_IT          49
+#define STATUS_PROGRESS        50
+#define STATUS_SIG_CREATED     51
+#define STATUS_SESSION_KEY     52
+#define STATUS_NOTATION_NAME    53
+#define STATUS_NOTATION_DATA    54
+#define STATUS_POLICY_URL       55
+#define STATUS_BEGIN_STREAM     56
+#define STATUS_END_STREAM       57
+#define STATUS_KEY_CREATED      58
+#define STATUS_USERID_HINT      59
+#define STATUS_UNEXPECTED       60
+#define STATUS_INV_RECP         61
+#define STATUS_NO_RECP          62
+#define STATUS_ALREADY_SIGNED   63
+#define STATUS_SIGEXPIRED       64
+#define STATUS_EXPSIG           65
+#define STATUS_EXPKEYSIG        66
+#define STATUS_ATTRIBUTE        67
+#define STATUS_IMPORT_OK       68
+#define STATUS_IMPORT_CHECK     69
+#define STATUS_REVKEYSIG        70
+#define STATUS_CARDCTRL         71
+#define STATUS_NEWSIG           72
+#define STATUS_PLAINTEXT        73
+#define STATUS_PLAINTEXT_LENGTH 74
+#define STATUS_KEY_NOT_CREATED  75
+#define STATUS_NEED_PASSPHRASE_PIN 76
+#define STATUS_SIG_SUBPACKET    77
+
+/* Extra status codes for certain smartcard operations.  Primary
+   useful to double check that change PIN worked as expected.  */
+#define STATUS_SC_OP_FAILURE    79
+#define STATUS_SC_OP_SUCCESS    80
+
+#define STATUS_BACKUP_KEY_CREATED 81
+
+#define STATUS_PKA_TRUST_BAD    82
+#define STATUS_PKA_TRUST_GOOD   83
+
+#define STATUS_BEGIN_SIGNING    84
+
+
+/*-- status.c --*/
+void set_status_fd ( int fd );
+int  is_status_enabled ( void );
+void write_status ( int no );
+void write_status_text ( int no, const char *text );
+void write_status_buffer ( int no,
+                           const char *buffer, size_t len, int wrap );
+void write_status_text_and_buffer ( int no, const char *text,
+                                    const char *buffer, size_t len, int wrap );
+
+#ifdef USE_SHM_COPROCESSING
+  void init_shm_coprocessing ( ulong requested_shm_size, int lock_mem );
+#endif /*USE_SHM_COPROCESSING*/
+
+int cpr_enabled(void);
+char *cpr_get( const char *keyword, const char *prompt );
+char *cpr_get_no_help( const char *keyword, const char *prompt );
+char *cpr_get_utf8( const char *keyword, const char *prompt );
+char *cpr_get_hidden( const char *keyword, const char *prompt );
+void cpr_kill_prompt(void);
+int  cpr_get_answer_is_yes( const char *keyword, const char *prompt );
+int  cpr_get_answer_yes_no_quit( const char *keyword, const char *prompt );
+int  cpr_get_answer_okay_cancel (const char *keyword,
+                                 const char *prompt,
+                                 int def_answer);
+
+#endif /*G10_STATUS_H*/
diff --git a/g10/tdbdump.c b/g10/tdbdump.c
new file mode 100644 (file)
index 0000000..09ce119
--- /dev/null
@@ -0,0 +1,233 @@
+/* tdbdump.c
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "trustdb.h"
+#include "options.h"
+#include "packet.h"
+#include "main.h"
+#include "i18n.h"
+#include "tdbio.h"
+
+
+#define HEXTOBIN(x) ( (x) >= '0' && (x) <= '9' ? ((x)-'0') : \
+                     (x) >= 'A' && (x) <= 'F' ? ((x)-'A'+10) : ((x)-'a'+10))
+
+
+/****************
+ * Wirte a record but die on error
+ */
+static void
+write_record( TRUSTREC *rec )
+{
+    int rc = tdbio_write_record( rec );
+    if( !rc )
+       return;
+    log_error(_("trust record %lu, type %d: write failed: %s\n"),
+                           rec->recnum, rec->rectype, g10_errstr(rc) );
+    tdbio_invalid();
+}
+
+
+/****************
+ * Dump the entire trustdb or only the entries of one key.
+ */
+void
+list_trustdb( const char *username )
+{
+    TRUSTREC rec;
+
+    init_trustdb();
+    /* for now we ignore the user ID */
+    if (1) {
+       ulong recnum;
+       int i;
+
+       printf("TrustDB: %s\n", tdbio_get_dbname() );
+       for(i=9+strlen(tdbio_get_dbname()); i > 0; i-- )
+           putchar('-');
+       putchar('\n');
+       for(recnum=0; !tdbio_read_record( recnum, &rec, 0); recnum++ )
+           tdbio_dump_record( &rec, stdout );
+    }
+}
+
+
+
+
+
+/****************
+ * Print a list of all defined owner trust value.
+ */
+void
+export_ownertrust()
+{
+    TRUSTREC rec;
+    ulong recnum;
+    int i;
+    byte *p;
+
+    init_trustdb();
+    printf(_("# List of assigned trustvalues, created %s\n"
+            "# (Use \"gpg --import-ownertrust\" to restore them)\n"),
+          asctimestamp( make_timestamp() ) );
+    for(recnum=0; !tdbio_read_record( recnum, &rec, 0); recnum++ ) {
+       if( rec.rectype == RECTYPE_TRUST ) {
+           if( !rec.r.trust.ownertrust )
+               continue;
+           p = rec.r.trust.fingerprint;
+           for(i=0; i < 20; i++, p++ )
+               printf("%02X", *p );
+           printf(":%u:\n", (unsigned int)rec.r.trust.ownertrust );
+       }
+    }
+}
+
+
+void
+import_ownertrust( const char *fname )
+{
+    FILE *fp;
+    int is_stdin=0;
+    char line[256];
+    char *p;
+    size_t n, fprlen;
+    unsigned int otrust;
+    byte fpr[20];
+    int any = 0;
+    int rc;
+
+    init_trustdb();
+    if( iobuf_is_pipe_filename (fname) ) {
+       fp = stdin;
+       fname = "[stdin]";
+       is_stdin = 1;
+    }
+    else if( !(fp = fopen( fname, "r" )) ) {
+       log_error ( _("can't open `%s': %s\n"), fname, strerror(errno) );
+       return;
+    }
+
+    if (is_secured_file (fileno (fp)))
+      {
+        fclose (fp);
+        errno = EPERM;
+       log_error (_("can't open `%s': %s\n"), fname, strerror(errno) );
+       return;
+      }
+
+    while( fgets( line, DIM(line)-1, fp ) ) {
+       TRUSTREC rec;
+
+       if( !*line || *line == '#' )
+           continue;
+       n = strlen(line);
+       if( line[n-1] != '\n' ) {
+           log_error (_("error in `%s': %s\n"), fname, _("line too long") );
+           /* ... or last line does not have a LF */
+           break; /* can't continue */
+       }
+       for(p = line; *p && *p != ':' ; p++ )
+           if( !hexdigitp(p) )
+               break;
+       if( *p != ':' ) {
+           log_error (_("error in `%s': %s\n"), fname, _("colon missing") );
+           continue;
+       }
+       fprlen = p - line;
+       if( fprlen != 32 && fprlen != 40 ) {
+           log_error (_("error in `%s': %s\n"),
+                       fname, _("invalid fingerprint") );
+           continue;
+       }
+       if( sscanf(p, ":%u:", &otrust ) != 1 ) {
+           log_error (_("error in `%s': %s\n"),
+                       fname, _("ownertrust value missing"));
+           continue;
+       }
+       if( !otrust )
+           continue; /* no otrust defined - no need to update or insert */
+       /* convert the ascii fingerprint to binary */
+       for(p=line, fprlen=0; fprlen < 20 && *p != ':'; p += 2 )
+           fpr[fprlen++] = HEXTOBIN(p[0]) * 16 + HEXTOBIN(p[1]);
+       while (fprlen < 20)
+           fpr[fprlen++] = 0;
+        
+       rc = tdbio_search_trust_byfpr (fpr, &rec);
+       if( !rc ) { /* found: update */
+           if (rec.r.trust.ownertrust != otrust)
+              {
+                if( rec.r.trust.ownertrust )
+                  log_info("changing ownertrust from %u to %u\n",
+                           rec.r.trust.ownertrust, otrust );
+                else
+                  log_info("setting ownertrust to %u\n", otrust );
+                rec.r.trust.ownertrust = otrust;
+                write_record (&rec );
+                any = 1;
+              }
+       }
+       else if( rc == -1 ) { /* not found: insert */
+            log_info("inserting ownertrust of %u\n", otrust );
+            memset (&rec, 0, sizeof rec);
+            rec.recnum = tdbio_new_recnum ();
+            rec.rectype = RECTYPE_TRUST;
+            memcpy (rec.r.trust.fingerprint, fpr, 20);
+            rec.r.trust.ownertrust = otrust;
+            write_record (&rec );
+            any = 1;
+       }
+       else /* error */
+           log_error (_("error finding trust record in `%s': %s\n"),
+                       fname, g10_errstr(rc));
+    }
+    if( ferror(fp) )
+       log_error ( _("read error in `%s': %s\n"), fname, strerror(errno) );
+    if( !is_stdin )
+       fclose(fp);
+    
+    if (any)
+      {
+        revalidation_mark ();
+        rc = tdbio_sync ();
+        if (rc)
+          log_error (_("trustdb: sync failed: %s\n"), g10_errstr(rc) );
+      }
+    
+}
+
+
diff --git a/g10/tdbio.c b/g10/tdbio.c
new file mode 100644 (file)
index 0000000..fbd569d
--- /dev/null
@@ -0,0 +1,1633 @@
+/* tdbio.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "options.h"
+#include "main.h"
+#include "i18n.h"
+#include "trustdb.h"
+#include "tdbio.h"
+
+#if defined(HAVE_DOSISH_SYSTEM)
+#define ftruncate chsize
+#endif
+
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__)
+#define MY_O_BINARY  O_BINARY
+#else
+#define MY_O_BINARY  0
+#endif
+
+
+/****************
+ * Yes, this is a very simple implementation. We should really
+ * use a page aligned buffer and read complete pages.
+ * To implement a simple trannsaction system, this is sufficient.
+ */
+typedef struct cache_ctrl_struct *CACHE_CTRL;
+struct cache_ctrl_struct {
+    CACHE_CTRL next;
+    struct {
+       unsigned used:1;
+       unsigned dirty:1;
+    } flags;
+    ulong recno;
+    char data[TRUST_RECORD_LEN];
+};
+
+#define MAX_CACHE_ENTRIES_SOFT 200    /* may be increased while in a */
+#define MAX_CACHE_ENTRIES_HARD 10000  /* transaction to this one */
+static CACHE_CTRL cache_list;
+static int cache_entries;
+static int cache_is_dirty;
+
+/* a type used to pass infomation to cmp_krec_fpr */
+struct cmp_krec_fpr_struct {
+    int pubkey_algo;
+    const char *fpr;
+    int fprlen;
+};
+
+/* a type used to pass infomation to cmp_[s]dir */
+struct cmp_xdir_struct {
+    int pubkey_algo;
+    u32 keyid[2];
+};
+
+
+static char *db_name;
+static DOTLOCK lockhandle;
+static int is_locked;
+static int  db_fd = -1;
+static int in_transaction;
+
+static void open_db(void);
+static void migrate_from_v2 (void);
+
+
+\f
+/*************************************
+ ************* record cache **********
+ *************************************/
+
+/****************
+ * Get the data from therecord cache and return a
+ * pointer into that cache.  Caller should copy
+ * the return data.  NULL is returned on a cache miss.
+ */
+static const char *
+get_record_from_cache( ulong recno )
+{
+    CACHE_CTRL r;
+
+    for( r = cache_list; r; r = r->next ) {
+       if( r->flags.used && r->recno == recno )
+           return r->data;
+    }
+    return NULL;
+}
+
+
+static int
+write_cache_item( CACHE_CTRL r )
+{
+    int n;
+
+    if( lseek( db_fd, r->recno * TRUST_RECORD_LEN, SEEK_SET ) == -1 ) {
+       log_error(_("trustdb rec %lu: lseek failed: %s\n"),
+                                           r->recno, strerror(errno) );
+       return G10ERR_WRITE_FILE;
+    }
+    n = write( db_fd, r->data, TRUST_RECORD_LEN);
+    if( n != TRUST_RECORD_LEN ) {
+       log_error(_("trustdb rec %lu: write failed (n=%d): %s\n"),
+                                           r->recno, n, strerror(errno) );
+       return G10ERR_WRITE_FILE;
+    }
+    r->flags.dirty = 0;
+    return 0;
+}
+
+/****************
+ * Put data into the cache.  This function may flush the
+ * some cache entries if there is not enough space available.
+ */
+int
+put_record_into_cache( ulong recno, const char *data )
+{
+    CACHE_CTRL r, unused;
+    int dirty_count = 0;
+    int clean_count = 0;
+
+    /* see whether we already cached this one */
+    for( unused = NULL, r = cache_list; r; r = r->next ) {
+       if( !r->flags.used ) {
+           if( !unused )
+               unused = r;
+       }
+       else if( r->recno == recno ) {
+           if( !r->flags.dirty ) {
+               /* Hmmm: should we use a a copy and compare? */
+               if( memcmp(r->data, data, TRUST_RECORD_LEN ) ) {
+                   r->flags.dirty = 1;
+                   cache_is_dirty = 1;
+               }
+           }
+           memcpy( r->data, data, TRUST_RECORD_LEN );
+           return 0;
+       }
+       if( r->flags.used ) {
+           if( r->flags.dirty )
+               dirty_count++;
+           else
+               clean_count++;
+       }
+    }
+    /* not in the cache: add a new entry */
+    if( unused ) { /* reuse this entry */
+       r = unused;
+       r->flags.used = 1;
+       r->recno = recno;
+       memcpy( r->data, data, TRUST_RECORD_LEN );
+       r->flags.dirty = 1;
+       cache_is_dirty = 1;
+       cache_entries++;
+       return 0;
+    }
+    /* see whether we reached the limit */
+    if( cache_entries < MAX_CACHE_ENTRIES_SOFT ) { /* no */
+       r = xmalloc( sizeof *r );
+       r->flags.used = 1;
+       r->recno = recno;
+       memcpy( r->data, data, TRUST_RECORD_LEN );
+       r->flags.dirty = 1;
+       r->next = cache_list;
+       cache_list = r;
+       cache_is_dirty = 1;
+       cache_entries++;
+       return 0;
+    }
+    /* cache is full: discard some clean entries */
+    if( clean_count ) {
+       int n = clean_count / 3; /* discard a third of the clean entries */
+       if( !n )
+           n = 1;
+       for( unused = NULL, r = cache_list; r; r = r->next ) {
+           if( r->flags.used && !r->flags.dirty ) {
+               if( !unused )
+                   unused = r;
+               r->flags.used = 0;
+               cache_entries--;
+               if( !--n )
+                   break;
+           }
+       }
+       assert( unused );
+       r = unused;
+       r->flags.used = 1;
+       r->recno = recno;
+       memcpy( r->data, data, TRUST_RECORD_LEN );
+       r->flags.dirty = 1;
+       cache_is_dirty = 1;
+       cache_entries++;
+       return 0;
+    }
+    /* no clean entries: have to flush some dirty entries */
+    if( in_transaction ) {
+       /* but we can't do this while in a transaction
+        * we increase the cache size instead */
+       if( cache_entries < MAX_CACHE_ENTRIES_HARD ) { /* no */
+           if( opt.debug && !(cache_entries % 100) )
+               log_debug("increasing tdbio cache size\n");
+           r = xmalloc( sizeof *r );
+           r->flags.used = 1;
+           r->recno = recno;
+           memcpy( r->data, data, TRUST_RECORD_LEN );
+           r->flags.dirty = 1;
+           r->next = cache_list;
+           cache_list = r;
+           cache_is_dirty = 1;
+           cache_entries++;
+           return 0;
+       }
+       log_info(_("trustdb transaction too large\n"));
+       return G10ERR_RESOURCE_LIMIT;
+    }
+    if( dirty_count ) {
+       int n = dirty_count / 5; /* discard some dirty entries */
+       if( !n )
+           n = 1;
+       if( !is_locked ) {
+           if( make_dotlock( lockhandle, -1 ) )
+               log_fatal("can't acquire lock - giving up\n");
+           else
+               is_locked = 1;
+       }
+       for( unused = NULL, r = cache_list; r; r = r->next ) {
+           if( r->flags.used && r->flags.dirty ) {
+               int rc = write_cache_item( r );
+               if( rc )
+                   return rc;
+               if( !unused )
+                   unused = r;
+               r->flags.used = 0;
+               cache_entries--;
+               if( !--n )
+                   break;
+           }
+       }
+       if( !opt.lock_once ) {
+           if( !release_dotlock( lockhandle ) )
+               is_locked = 0;
+       }
+       assert( unused );
+       r = unused;
+       r->flags.used = 1;
+       r->recno = recno;
+       memcpy( r->data, data, TRUST_RECORD_LEN );
+       r->flags.dirty = 1;
+       cache_is_dirty = 1;
+       cache_entries++;
+       return 0;
+    }
+    BUG();
+}
+
+
+int
+tdbio_is_dirty()
+{
+    return cache_is_dirty;
+}
+
+
+/****************
+ * Flush the cache.  This cannot be used while in a transaction.
+ */
+int
+tdbio_sync()
+{
+    CACHE_CTRL r;
+    int did_lock = 0;
+
+    if( db_fd == -1 )
+       open_db();
+    if( in_transaction )
+       log_bug("tdbio: syncing while in transaction\n");
+
+    if( !cache_is_dirty )
+       return 0;
+
+    if( !is_locked ) {
+       if( make_dotlock( lockhandle, -1 ) )
+           log_fatal("can't acquire lock - giving up\n");
+       else
+           is_locked = 1;
+       did_lock = 1;
+    }
+    for( r = cache_list; r; r = r->next ) {
+       if( r->flags.used && r->flags.dirty ) {
+           int rc = write_cache_item( r );
+           if( rc )
+               return rc;
+       }
+    }
+    cache_is_dirty = 0;
+    if( did_lock && !opt.lock_once ) {
+       if( !release_dotlock( lockhandle ) )
+           is_locked = 0;
+    }
+
+    return 0;
+}
+
+#if 0
+/* The transaction code is disabled in the 1.2.x branch, as it is not
+   yet used.  It will be enabled in 1.3.x. */
+
+/****************
+ * Simple transactions system:
+ * Everything between begin_transaction and end/cancel_transaction
+ * is not immediatly written but at the time of end_transaction.
+ *
+ */
+int
+tdbio_begin_transaction()
+{
+    int rc;
+
+    if( in_transaction )
+       log_bug("tdbio: nested transactions\n");
+    /* flush everything out */
+    rc = tdbio_sync();
+    if( rc )
+       return rc;
+    in_transaction = 1;
+    return 0;
+}
+
+int
+tdbio_end_transaction()
+{
+    int rc;
+
+    if( !in_transaction )
+       log_bug("tdbio: no active transaction\n");
+    if( !is_locked ) {
+       if( make_dotlock( lockhandle, -1 ) )
+           log_fatal("can't acquire lock - giving up\n");
+       else
+           is_locked = 1;
+    }
+    block_all_signals();
+    in_transaction = 0;
+    rc = tdbio_sync();
+    unblock_all_signals();
+    if( !opt.lock_once ) {
+       if( !release_dotlock( lockhandle ) )
+           is_locked = 0;
+    }
+    return rc;
+}
+
+int
+tdbio_cancel_transaction()
+{
+    CACHE_CTRL r;
+
+    if( !in_transaction )
+       log_bug("tdbio: no active transaction\n");
+
+    /* remove all dirty marked entries, so that the original ones
+     * are read back the next time */
+    if( cache_is_dirty ) {
+       for( r = cache_list; r; r = r->next ) {
+           if( r->flags.used && r->flags.dirty ) {
+               r->flags.used = 0;
+               cache_entries--;
+           }
+       }
+       cache_is_dirty = 0;
+    }
+
+    in_transaction = 0;
+    return 0;
+}
+#endif
+
+\f
+/********************************************************
+ **************** cached I/O functions ******************
+ ********************************************************/
+
+static void
+cleanup(void)
+{
+    if( is_locked ) {
+       if( !release_dotlock(lockhandle) )
+           is_locked = 0;
+    }
+}
+
+/* Caller must sync */
+int
+tdbio_update_version_record (void)
+{
+  TRUSTREC rec;
+  int rc;
+
+  memset( &rec, 0, sizeof rec );
+
+  rc=tdbio_read_record( 0, &rec, RECTYPE_VER);
+  if(rc==0)
+    {
+      rec.r.ver.created     = make_timestamp();
+      rec.r.ver.marginals   = opt.marginals_needed;
+      rec.r.ver.completes   = opt.completes_needed;
+      rec.r.ver.cert_depth  = opt.max_cert_depth;
+      rec.r.ver.trust_model = opt.trust_model;
+      rc=tdbio_write_record(&rec);
+    }
+
+  return rc;
+}
+
+static int
+create_version_record (void)
+{
+  TRUSTREC rec;
+  int rc;
+  
+  memset( &rec, 0, sizeof rec );
+  rec.r.ver.version     = 3;
+  rec.r.ver.created     = make_timestamp();
+  rec.r.ver.marginals   = opt.marginals_needed;
+  rec.r.ver.completes   = opt.completes_needed;
+  rec.r.ver.cert_depth  = opt.max_cert_depth;
+  if(opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC)
+    rec.r.ver.trust_model = opt.trust_model;
+  else
+    rec.r.ver.trust_model = TM_PGP;
+  rec.rectype = RECTYPE_VER;
+  rec.recnum = 0;
+  rc = tdbio_write_record( &rec );
+  if( !rc )
+    tdbio_sync();
+  return rc;
+}
+
+
+
+int
+tdbio_set_dbname( const char *new_dbname, int create )
+{
+    char *fname;
+    static int initialized = 0;
+
+    if( !initialized ) {
+       atexit( cleanup );
+       initialized = 1;
+    }
+
+    if(new_dbname==NULL)
+      fname=make_filename(opt.homedir,"trustdb" EXTSEP_S "gpg", NULL);
+    else if (*new_dbname != DIRSEP_C )
+      {
+       if (strchr(new_dbname, DIRSEP_C) )
+         fname = make_filename (new_dbname, NULL);
+       else
+         fname = make_filename (opt.homedir, new_dbname, NULL);
+      }
+    else
+      fname = xstrdup (new_dbname);
+
+    if( access( fname, R_OK ) ) {
+       if( errno != ENOENT ) {
+           log_error( _("can't access `%s': %s\n"), fname, strerror(errno) );
+           xfree(fname);
+           return G10ERR_TRUSTDB;
+       }
+       if( create ) {
+           FILE *fp;
+           TRUSTREC rec;
+           int rc;
+           char *p = strrchr( fname, DIRSEP_C );
+           mode_t oldmask;
+
+           assert(p);
+           *p = 0;
+           if( access( fname, F_OK ) ) {
+               try_make_homedir( fname );
+               log_fatal( _("%s: directory does not exist!\n"), fname );
+           }
+           *p = DIRSEP_C;
+
+           xfree(db_name);
+           db_name = fname;
+#ifdef __riscos__
+           if( !lockhandle )
+               lockhandle = create_dotlock( db_name );
+           if( !lockhandle )
+               log_fatal( _("can't create lock for `%s'\n"), db_name );
+            if( make_dotlock( lockhandle, -1 ) )
+                log_fatal( _("can't lock `%s'\n"), db_name );
+#endif /* __riscos__ */
+           oldmask=umask(077);
+            if (is_secured_filename (fname)) {
+                fp = NULL;
+                errno = EPERM;
+            }
+            else
+                fp =fopen( fname, "wb" );
+           umask(oldmask);
+           if( !fp )
+               log_fatal( _("can't create `%s': %s\n"), fname, strerror(errno) );
+           fclose(fp);
+           db_fd = open( db_name, O_RDWR | MY_O_BINARY );
+           if( db_fd == -1 )
+               log_fatal( _("can't open `%s': %s\n"), db_name, strerror(errno) );
+
+#ifndef __riscos__
+           if( !lockhandle )
+               lockhandle = create_dotlock( db_name );
+           if( !lockhandle )
+               log_fatal( _("can't create lock for `%s'\n"), db_name );
+#endif /* !__riscos__ */
+
+            rc = create_version_record ();
+           if( rc )
+               log_fatal( _("%s: failed to create version record: %s"),
+                                                  fname, g10_errstr(rc));
+           /* and read again to check that we are okay */
+           if( tdbio_read_record( 0, &rec, RECTYPE_VER ) )
+               log_fatal( _("%s: invalid trustdb created\n"), db_name );
+
+           if( !opt.quiet )
+               log_info(_("%s: trustdb created\n"), db_name);
+
+           return 0;
+       }
+    }
+    xfree(db_name);
+    db_name = fname;
+    return 0;
+}
+
+
+const char *
+tdbio_get_dbname()
+{
+    return db_name;
+}
+
+
+
+static void
+open_db()
+{
+  byte buf[10];
+  int n;
+  TRUSTREC rec;
+
+  assert( db_fd == -1 );
+
+  if (!lockhandle )
+    lockhandle = create_dotlock( db_name );
+  if (!lockhandle )
+    log_fatal( _("can't create lock for `%s'\n"), db_name );
+#ifdef __riscos__
+  if (make_dotlock( lockhandle, -1 ) )
+    log_fatal( _("can't lock `%s'\n"), db_name );
+#endif /* __riscos__ */
+  db_fd = open (db_name, O_RDWR | MY_O_BINARY );
+  if (db_fd == -1 && (errno == EACCES
+#ifdef EROFS
+                      || errno == EROFS)
+#endif
+      ) {
+      db_fd = open (db_name, O_RDONLY | MY_O_BINARY );
+      if (db_fd != -1)
+          log_info (_("NOTE: trustdb not writable\n"));
+  }
+  if ( db_fd == -1 )
+    log_fatal( _("can't open `%s': %s\n"), db_name, strerror(errno) );
+  register_secured_file (db_name);
+
+  /* check whether we need to do a version migration */
+  do
+    n = read (db_fd, buf, 5);
+  while (n==-1 && errno == EINTR);
+  if (n == 5 && !memcmp (buf, "\x01gpg\x02", 5))
+    {
+      migrate_from_v2 ();
+    }
+  
+  /* read the version record */
+  if (tdbio_read_record (0, &rec, RECTYPE_VER ) )
+    log_fatal( _("%s: invalid trustdb\n"), db_name );
+}
+
+
+/****************
+ * Make a hashtable: type 0 = trust hash
+ */
+static void
+create_hashtable( TRUSTREC *vr, int type )
+{
+    TRUSTREC rec;
+    off_t offset;
+    ulong recnum;
+    int i, n, rc;
+
+    offset = lseek( db_fd, 0, SEEK_END );
+    if( offset == -1 )
+       log_fatal("trustdb: lseek to end failed: %s\n", strerror(errno) );
+    recnum = offset / TRUST_RECORD_LEN;
+    assert(recnum); /* this is will never be the first record */
+
+    if( !type )
+       vr->r.ver.trusthashtbl = recnum;
+
+    /* Now write the records */
+    n = (256+ITEMS_PER_HTBL_RECORD-1) / ITEMS_PER_HTBL_RECORD;
+    for(i=0; i < n; i++, recnum++ ) {
+        memset( &rec, 0, sizeof rec );
+        rec.rectype = RECTYPE_HTBL;
+        rec.recnum = recnum;
+        rc = tdbio_write_record( &rec );
+        if( rc )
+            log_fatal( _("%s: failed to create hashtable: %s\n"),
+                                       db_name, g10_errstr(rc));
+    }
+    /* update the version record */
+    rc = tdbio_write_record( vr );
+    if( !rc )
+       rc = tdbio_sync();
+    if( rc )
+       log_fatal( _("%s: error updating version record: %s\n"),
+                                                 db_name, g10_errstr(rc));
+}
+
+
+int
+tdbio_db_matches_options()
+{
+  static int yes_no = -1;
+
+  if( yes_no == -1 )
+    {
+      TRUSTREC vr;
+      int rc;
+
+      rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+      if( rc )
+       log_fatal( _("%s: error reading version record: %s\n"),
+                  db_name, g10_errstr(rc) );
+
+      yes_no = vr.r.ver.marginals == opt.marginals_needed
+       && vr.r.ver.completes == opt.completes_needed
+       && vr.r.ver.cert_depth == opt.max_cert_depth
+       && vr.r.ver.trust_model == opt.trust_model;
+    }
+
+  return yes_no;
+}
+
+byte
+tdbio_read_model(void)
+{
+  TRUSTREC vr;
+  int rc;
+  rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+  if( rc )
+    log_fatal( _("%s: error reading version record: %s\n"),
+              db_name, g10_errstr(rc) );
+  return vr.r.ver.trust_model;
+}
+
+/****************
+ * Return the nextstamp value.
+ */
+ulong
+tdbio_read_nextcheck ()
+{
+    TRUSTREC vr;
+    int rc;
+
+    rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+    if( rc )
+       log_fatal( _("%s: error reading version record: %s\n"),
+                                                   db_name, g10_errstr(rc) );
+    return vr.r.ver.nextcheck;
+}
+
+/* Return true when the stamp was actually changed. */
+int
+tdbio_write_nextcheck (ulong stamp)
+{
+    TRUSTREC vr;
+    int rc;
+
+    rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+    if( rc )
+       log_fatal( _("%s: error reading version record: %s\n"),
+                                      db_name, g10_errstr(rc) );
+
+    if (vr.r.ver.nextcheck == stamp)
+      return 0;
+
+    vr.r.ver.nextcheck = stamp;
+    rc = tdbio_write_record( &vr );
+    if( rc )
+       log_fatal( _("%s: error writing version record: %s\n"),
+                                      db_name, g10_errstr(rc) );
+    return 1;
+}
+
+
+
+/****************
+ * Return the record number of the trusthash tbl or create a new one.
+ */
+static ulong
+get_trusthashrec(void)
+{
+    static ulong trusthashtbl; /* record number of the trust hashtable */
+
+    if( !trusthashtbl ) {
+       TRUSTREC vr;
+       int rc;
+
+       rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+       if( rc )
+           log_fatal( _("%s: error reading version record: %s\n"),
+                                           db_name, g10_errstr(rc) );
+       if( !vr.r.ver.trusthashtbl )
+           create_hashtable( &vr, 0 );
+
+       trusthashtbl = vr.r.ver.trusthashtbl;
+    }
+    return trusthashtbl;
+}
+
+
+
+/****************
+ * Update a hashtable.
+ * table gives the start of the table, key and keylen is the key,
+ * newrecnum is the record number to insert.
+ */
+static int
+upd_hashtable( ulong table, byte *key, int keylen, ulong newrecnum )
+{
+    TRUSTREC lastrec, rec;
+    ulong hashrec, item;
+    int msb;
+    int level=0;
+    int rc, i;
+
+    hashrec = table;
+  next_level:
+    msb = key[level];
+    hashrec += msb / ITEMS_PER_HTBL_RECORD;
+    rc = tdbio_read_record( hashrec, &rec, RECTYPE_HTBL );
+    if( rc ) {
+       log_error("upd_hashtable: read failed: %s\n",   g10_errstr(rc) );
+       return rc;
+    }
+
+    item = rec.r.htbl.item[msb % ITEMS_PER_HTBL_RECORD];
+    if( !item ) { /* insert a new item into the hash table */
+       rec.r.htbl.item[msb % ITEMS_PER_HTBL_RECORD] = newrecnum;
+       rc = tdbio_write_record( &rec );
+       if( rc ) {
+           log_error("upd_hashtable: write htbl failed: %s\n",
+                                                           g10_errstr(rc) );
+           return rc;
+       }
+    }
+    else if( item != newrecnum ) {  /* must do an update */
+       lastrec = rec;
+       rc = tdbio_read_record( item, &rec, 0 );
+       if( rc ) {
+           log_error( "upd_hashtable: read item failed: %s\n",
+                                                           g10_errstr(rc) );
+           return rc;
+       }
+
+       if( rec.rectype == RECTYPE_HTBL ) {
+           hashrec = item;
+           level++;
+           if( level >= keylen ) {
+               log_error( "hashtable has invalid indirections.\n");
+               return G10ERR_TRUSTDB;
+           }
+           goto next_level;
+       }
+       else if( rec.rectype == RECTYPE_HLST ) { /* extend list */
+           /* see whether the key is already in this list */
+           for(;;) {
+               for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
+                   if( rec.r.hlst.rnum[i] == newrecnum ) {
+                       return 0; /* okay, already in the list */
+                   }
+               }
+               if( rec.r.hlst.next ) {
+                   rc = tdbio_read_record( rec.r.hlst.next,
+                                                      &rec, RECTYPE_HLST);
+                   if( rc ) {
+                       log_error( "upd_hashtable: read hlst failed: %s\n",
+                                                            g10_errstr(rc) );
+                       return rc;
+                   }
+               }
+               else
+                   break; /* not there */
+           }
+           /* find the next free entry and put it in */
+           for(;;) {
+               for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
+                   if( !rec.r.hlst.rnum[i] ) {
+                       rec.r.hlst.rnum[i] = newrecnum;
+                       rc = tdbio_write_record( &rec );
+                       if( rc )
+                           log_error( "upd_hashtable: write hlst failed: %s\n",
+                                                             g10_errstr(rc) );
+                       return rc; /* done */
+                   }
+               }
+               if( rec.r.hlst.next ) {
+                   rc = tdbio_read_record( rec.r.hlst.next,
+                                                     &rec, RECTYPE_HLST );
+                   if( rc ) {
+                       log_error( "upd_hashtable: read hlst failed: %s\n",
+                                                            g10_errstr(rc) );
+                       return rc;
+                   }
+               }
+               else { /* add a new list record */
+                   rec.r.hlst.next = item = tdbio_new_recnum();
+                   rc = tdbio_write_record( &rec );
+                   if( rc ) {
+                       log_error( "upd_hashtable: write hlst failed: %s\n",
+                                                         g10_errstr(rc) );
+                       return rc;
+                   }
+                   memset( &rec, 0, sizeof rec );
+                   rec.rectype = RECTYPE_HLST;
+                   rec.recnum = item;
+                   rec.r.hlst.rnum[0] = newrecnum;
+                   rc = tdbio_write_record( &rec );
+                   if( rc )
+                       log_error( "upd_hashtable: write ext hlst failed: %s\n",
+                                                         g10_errstr(rc) );
+                   return rc; /* done */
+               }
+           } /* end loop over hlst slots */
+       }
+       else if( rec.rectype == RECTYPE_TRUST ) { /* insert a list record */
+           if( rec.recnum == newrecnum ) {
+               return 0;
+           }
+           item = rec.recnum; /* save number of key record */
+           memset( &rec, 0, sizeof rec );
+           rec.rectype = RECTYPE_HLST;
+           rec.recnum = tdbio_new_recnum();
+           rec.r.hlst.rnum[0] = item;       /* old keyrecord */
+           rec.r.hlst.rnum[1] = newrecnum; /* and new one */
+           rc = tdbio_write_record( &rec );
+           if( rc ) {
+               log_error( "upd_hashtable: write new hlst failed: %s\n",
+                                                 g10_errstr(rc) );
+               return rc;
+           }
+           /* update the hashtable record */
+           lastrec.r.htbl.item[msb % ITEMS_PER_HTBL_RECORD] = rec.recnum;
+           rc = tdbio_write_record( &lastrec );
+           if( rc )
+               log_error( "upd_hashtable: update htbl failed: %s\n",
+                                                            g10_errstr(rc) );
+           return rc; /* ready */
+       }
+       else {
+           log_error( "hashtbl %lu: %lu/%d points to an invalid record %lu\n",
+                      table, hashrec, (msb % ITEMS_PER_HTBL_RECORD), item);
+           list_trustdb(NULL);
+           return G10ERR_TRUSTDB;
+       }
+    }
+
+    return 0;
+}
+
+
+/****************
+ * Drop an entry from a hashtable
+ * table gives the start of the table, key and keylen is the key,
+ */
+static int
+drop_from_hashtable( ulong table, byte *key, int keylen, ulong recnum )
+{
+    TRUSTREC rec;
+    ulong hashrec, item;
+    int msb;
+    int level=0;
+    int rc, i;
+
+    hashrec = table;
+  next_level:
+    msb = key[level];
+    hashrec += msb / ITEMS_PER_HTBL_RECORD;
+    rc = tdbio_read_record( hashrec, &rec, RECTYPE_HTBL );
+    if( rc ) {
+       log_error("drop_from_hashtable: read failed: %s\n",
+                                                       g10_errstr(rc) );
+       return rc;
+    }
+
+    item = rec.r.htbl.item[msb % ITEMS_PER_HTBL_RECORD];
+    if( !item )  /* not found - forget about it  */
+       return 0;
+
+    if( item == recnum ) {  /* tables points direct to the record */
+       rec.r.htbl.item[msb % ITEMS_PER_HTBL_RECORD] = 0;
+       rc = tdbio_write_record( &rec );
+       if( rc )
+           log_error("drop_from_hashtable: write htbl failed: %s\n",
+                                                           g10_errstr(rc) );
+       return rc;
+    }
+
+    rc = tdbio_read_record( item, &rec, 0 );
+    if( rc ) {
+       log_error( "drop_from_hashtable: read item failed: %s\n",
+                                                       g10_errstr(rc) );
+       return rc;
+    }
+
+    if( rec.rectype == RECTYPE_HTBL ) {
+       hashrec = item;
+       level++;
+       if( level >= keylen ) {
+           log_error( "hashtable has invalid indirections.\n");
+           return G10ERR_TRUSTDB;
+       }
+       goto next_level;
+    }
+
+    if( rec.rectype == RECTYPE_HLST ) {
+       for(;;) {
+           for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
+               if( rec.r.hlst.rnum[i] == recnum ) {
+                   rec.r.hlst.rnum[i] = 0; /* drop */
+                   rc = tdbio_write_record( &rec );
+                   if( rc )
+                       log_error("drop_from_hashtable: write htbl failed: %s\n",
+                                                                       g10_errstr(rc) );
+                   return rc;
+               }
+           }
+           if( rec.r.hlst.next ) {
+               rc = tdbio_read_record( rec.r.hlst.next,
+                                                  &rec, RECTYPE_HLST);
+               if( rc ) {
+                   log_error( "drop_from_hashtable: read hlst failed: %s\n",
+                                                        g10_errstr(rc) );
+                   return rc;
+               }
+           }
+           else
+               return 0; /* key not in table */
+       }
+    }
+
+    log_error( "hashtbl %lu: %lu/%d points to wrong record %lu\n",
+                   table, hashrec, (msb % ITEMS_PER_HTBL_RECORD), item);
+    return G10ERR_TRUSTDB;
+}
+
+
+
+/****************
+ * Lookup a record via the hashtable tablewith key/keylen and return the
+ * result in rec.  cmp() should return if the record is the desired one.
+ * Returns -1 if not found, 0 if found or another errocode
+ */
+static int
+lookup_hashtable( ulong table, const byte *key, size_t keylen,
+                 int (*cmpfnc)(void*, const TRUSTREC *), void *cmpdata,
+                                               TRUSTREC *rec )
+{
+    int rc;
+    ulong hashrec, item;
+    int msb;
+    int level=0;
+
+    hashrec = table;
+  next_level:
+    msb = key[level];
+    hashrec += msb / ITEMS_PER_HTBL_RECORD;
+    rc = tdbio_read_record( hashrec, rec, RECTYPE_HTBL );
+    if( rc ) {
+       log_error("lookup_hashtable failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+
+    item = rec->r.htbl.item[msb % ITEMS_PER_HTBL_RECORD];
+    if( !item )
+       return -1; /* not found */
+
+    rc = tdbio_read_record( item, rec, 0 );
+    if( rc ) {
+       log_error( "hashtable read failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+    if( rec->rectype == RECTYPE_HTBL ) {
+       hashrec = item;
+       level++;
+       if( level >= keylen ) {
+           log_error("hashtable has invalid indirections\n");
+           return G10ERR_TRUSTDB;
+       }
+       goto next_level;
+    }
+    else if( rec->rectype == RECTYPE_HLST ) {
+       for(;;) {
+           int i;
+
+           for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
+               if( rec->r.hlst.rnum[i] ) {
+                   TRUSTREC tmp;
+
+                   rc = tdbio_read_record( rec->r.hlst.rnum[i], &tmp, 0 );
+                   if( rc ) {
+                       log_error( "lookup_hashtable: read item failed: %s\n",
+                                                             g10_errstr(rc) );
+                       return rc;
+                   }
+                   if( (*cmpfnc)( cmpdata, &tmp ) ) {
+                       *rec = tmp;
+                       return 0;
+                   }
+               }
+           }
+           if( rec->r.hlst.next ) {
+               rc = tdbio_read_record( rec->r.hlst.next, rec, RECTYPE_HLST );
+               if( rc ) {
+                   log_error( "lookup_hashtable: read hlst failed: %s\n",
+                                                        g10_errstr(rc) );
+                   return rc;
+               }
+           }
+           else
+               return -1; /* not found */
+       }
+    }
+
+
+    if( (*cmpfnc)( cmpdata, rec ) )
+       return 0; /* really found */
+
+    return -1; /* no: not found */
+}
+
+
+/****************
+ * Update the trust hashtbl or create the table if it does not exist
+ */
+static int
+update_trusthashtbl( TRUSTREC *tr )
+{
+    return upd_hashtable( get_trusthashrec(),
+                         tr->r.trust.fingerprint, 20, tr->recnum );
+}
+
+
+
+void
+tdbio_dump_record( TRUSTREC *rec, FILE *fp  )
+{
+    int i;
+    ulong rnum = rec->recnum;
+
+    fprintf(fp, "rec %5lu, ", rnum );
+
+    switch( rec->rectype ) {
+      case 0: fprintf(fp, "blank\n");
+       break;
+      case RECTYPE_VER: fprintf(fp,
+           "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d nc=%lu (%s)\n",
+                                   rec->r.ver.trusthashtbl,
+                                  rec->r.ver.firstfree,
+                                  rec->r.ver.marginals,
+                                  rec->r.ver.completes,
+                                  rec->r.ver.cert_depth,
+                                  rec->r.ver.trust_model,
+                                   rec->r.ver.nextcheck,
+                                  strtimestamp(rec->r.ver.nextcheck)
+                                 );
+       break;
+      case RECTYPE_FREE: fprintf(fp, "free, next=%lu\n", rec->r.free.next );
+       break;
+      case RECTYPE_HTBL:
+       fprintf(fp, "htbl,");
+       for(i=0; i < ITEMS_PER_HTBL_RECORD; i++ )
+           fprintf(fp, " %lu", rec->r.htbl.item[i] );
+       putc('\n', fp);
+       break;
+      case RECTYPE_HLST:
+       fprintf(fp, "hlst, next=%lu,", rec->r.hlst.next );
+       for(i=0; i < ITEMS_PER_HLST_RECORD; i++ )
+           fprintf(fp, " %lu", rec->r.hlst.rnum[i] );
+       putc('\n', fp);
+       break;
+      case RECTYPE_TRUST:
+       fprintf(fp, "trust ");
+       for(i=0; i < 20; i++ )
+           fprintf(fp, "%02X", rec->r.trust.fingerprint[i] );
+        fprintf (fp, ", ot=%d, d=%d, vl=%lu\n", rec->r.trust.ownertrust,
+                 rec->r.trust.depth, rec->r.trust.validlist);
+       break;
+      case RECTYPE_VALID:
+       fprintf(fp, "valid ");
+       for(i=0; i < 20; i++ )
+           fprintf(fp, "%02X", rec->r.valid.namehash[i] );
+        fprintf (fp, ", v=%d, next=%lu\n", rec->r.valid.validity,
+                 rec->r.valid.next);
+       break;
+      default:
+       fprintf(fp, "unknown type %d\n", rec->rectype );
+       break;
+    }
+}
+
+/****************
+ * read the record with number recnum
+ * returns: -1 on error, 0 on success
+ */
+int
+tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected )
+{
+    byte readbuf[TRUST_RECORD_LEN];
+    const byte *buf, *p;
+    int rc = 0;
+    int n, i;
+
+    if( db_fd == -1 )
+       open_db();
+    buf = get_record_from_cache( recnum );
+    if( !buf ) {
+       if( lseek( db_fd, recnum * TRUST_RECORD_LEN, SEEK_SET ) == -1 ) {
+           log_error(_("trustdb: lseek failed: %s\n"), strerror(errno) );
+           return G10ERR_READ_FILE;
+       }
+       n = read( db_fd, readbuf, TRUST_RECORD_LEN);
+       if( !n ) {
+           return -1; /* eof */
+       }
+       else if( n != TRUST_RECORD_LEN ) {
+           log_error(_("trustdb: read failed (n=%d): %s\n"), n,
+                                                       strerror(errno) );
+           return G10ERR_READ_FILE;
+       }
+       buf = readbuf;
+    }
+    rec->recnum = recnum;
+    rec->dirty = 0;
+    p = buf;
+    rec->rectype = *p++;
+    if( expected && rec->rectype != expected ) {
+       log_error("%lu: read expected rec type %d, got %d\n",
+                   recnum, expected, rec->rectype );
+       return G10ERR_TRUSTDB;
+    }
+    p++;    /* skip reserved byte */
+    switch( rec->rectype ) {
+      case 0:  /* unused (free) record */
+       break;
+      case RECTYPE_VER: /* version record */
+       if( memcmp(buf+1, "gpg", 3 ) ) {
+           log_error( _("%s: not a trustdb file\n"), db_name );
+           rc = G10ERR_TRUSTDB;
+       }
+       p += 2; /* skip "gpg" */
+       rec->r.ver.version  = *p++;
+       rec->r.ver.marginals = *p++;
+       rec->r.ver.completes = *p++;
+       rec->r.ver.cert_depth = *p++;
+       rec->r.ver.trust_model = *p++;
+       p += 3;
+       rec->r.ver.created  = buftoulong(p); p += 4;
+       rec->r.ver.nextcheck = buftoulong(p); p += 4;
+       p += 4;
+       p += 4;
+       rec->r.ver.firstfree =buftoulong(p); p += 4;
+       p += 4;
+       rec->r.ver.trusthashtbl =buftoulong(p); p += 4;
+       if( recnum ) {
+           log_error( _("%s: version record with recnum %lu\n"), db_name,
+                                                            (ulong)recnum );
+           rc = G10ERR_TRUSTDB;
+       }
+       else if( rec->r.ver.version != 3 ) {
+           log_error( _("%s: invalid file version %d\n"), db_name,
+                                                       rec->r.ver.version );
+           rc = G10ERR_TRUSTDB;
+       }
+       break;
+      case RECTYPE_FREE:
+       rec->r.free.next  = buftoulong(p); p += 4;
+       break;
+      case RECTYPE_HTBL:
+       for(i=0; i < ITEMS_PER_HTBL_RECORD; i++ ) {
+           rec->r.htbl.item[i] = buftoulong(p); p += 4;
+       }
+       break;
+      case RECTYPE_HLST:
+       rec->r.hlst.next = buftoulong(p); p += 4;
+       for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
+           rec->r.hlst.rnum[i] = buftoulong(p); p += 4;
+       }
+       break;
+      case RECTYPE_TRUST:
+       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 = buftoulong(p); p += 4;
+       break;
+      case RECTYPE_VALID:
+       memcpy( rec->r.valid.namehash, p, 20); p+=20;
+        rec->r.valid.validity = *p++;
+       rec->r.valid.next = buftoulong(p); p += 4;
+       rec->r.valid.full_count = *p++;
+       rec->r.valid.marginal_count = *p++;
+       break;
+      default:
+       log_error( "%s: invalid record type %d at recnum %lu\n",
+                                  db_name, rec->rectype, (ulong)recnum );
+       rc = G10ERR_TRUSTDB;
+       break;
+    }
+
+    return rc;
+}
+
+/****************
+ * Write the record at RECNUM
+ */
+int
+tdbio_write_record( TRUSTREC *rec )
+{
+    byte buf[TRUST_RECORD_LEN], *p;
+    int rc = 0;
+    int i;
+    ulong recnum = rec->recnum;
+
+    if( db_fd == -1 )
+       open_db();
+
+    memset(buf, 0, TRUST_RECORD_LEN);
+    p = buf;
+    *p++ = rec->rectype; p++;
+    switch( rec->rectype ) {
+      case 0:  /* unused record */
+       break;
+      case RECTYPE_VER: /* version record */
+       if( recnum )
+           BUG();
+       memcpy(p-1, "gpg", 3 ); p += 2;
+       *p++ = rec->r.ver.version;
+       *p++ = rec->r.ver.marginals;
+       *p++ = rec->r.ver.completes;
+       *p++ = rec->r.ver.cert_depth;
+       *p++ = rec->r.ver.trust_model;
+       p += 3;
+       ulongtobuf(p, rec->r.ver.created); p += 4;
+       ulongtobuf(p, rec->r.ver.nextcheck); p += 4;
+       p += 4;
+       p += 4;
+       ulongtobuf(p, rec->r.ver.firstfree ); p += 4;
+       p += 4;
+       ulongtobuf(p, rec->r.ver.trusthashtbl ); p += 4;
+       break;
+
+      case RECTYPE_FREE:
+       ulongtobuf(p, rec->r.free.next); p += 4;
+       break;
+
+
+      case RECTYPE_HTBL:
+       for(i=0; i < ITEMS_PER_HTBL_RECORD; i++ ) {
+           ulongtobuf( p, rec->r.htbl.item[i]); p += 4;
+       }
+       break;
+
+      case RECTYPE_HLST:
+       ulongtobuf( p, rec->r.hlst.next); p += 4;
+       for(i=0; i < ITEMS_PER_HLST_RECORD; i++ ) {
+           ulongtobuf( p, rec->r.hlst.rnum[i]); p += 4;
+       }
+       break;
+
+      case RECTYPE_TRUST:
+       memcpy( p, rec->r.trust.fingerprint, 20); p += 20;
+       *p++ = rec->r.trust.ownertrust;
+       *p++ = rec->r.trust.depth;
+       *p++ = rec->r.trust.min_ownertrust;
+        p++;
+       ulongtobuf( p, rec->r.trust.validlist); p += 4;
+       break;
+
+      case RECTYPE_VALID:
+       memcpy( p, rec->r.valid.namehash, 20); p += 20;
+       *p++ = rec->r.valid.validity;
+       ulongtobuf( p, rec->r.valid.next); p += 4;
+       *p++ = rec->r.valid.full_count;
+       *p++ = rec->r.valid.marginal_count;
+       break;
+
+      default:
+       BUG();
+    }
+
+    rc = put_record_into_cache( recnum, buf );
+    if( rc )
+       ;
+    else if( rec->rectype == RECTYPE_TRUST )
+       rc = update_trusthashtbl( rec );
+
+    return rc;
+}
+
+int
+tdbio_delete_record( ulong recnum )
+{
+    TRUSTREC vr, rec;
+    int rc;
+
+    /* Must read the record fist, so we can drop it from the hash tables */
+    rc = tdbio_read_record( recnum, &rec, 0 );
+    if( rc )
+       ;
+    else if( rec.rectype == RECTYPE_TRUST ) {
+         rc = drop_from_hashtable( get_trusthashrec(),
+                                  rec.r.trust.fingerprint, 20, rec.recnum );
+    }
+
+    if( rc )
+       return rc;
+
+    /* now we can chnage it to a free record */
+    rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+    if( rc )
+       log_fatal( _("%s: error reading version record: %s\n"),
+                                      db_name, g10_errstr(rc) );
+
+    rec.recnum = recnum;
+    rec.rectype = RECTYPE_FREE;
+    rec.r.free.next = vr.r.ver.firstfree;
+    vr.r.ver.firstfree = recnum;
+    rc = tdbio_write_record( &rec );
+    if( !rc )
+       rc = tdbio_write_record( &vr );
+    return rc;
+}
+
+/****************
+ * create a new record and return its record number
+ */
+ulong
+tdbio_new_recnum()
+{
+    off_t offset;
+    ulong recnum;
+    TRUSTREC vr, rec;
+    int rc;
+
+    /* look for unused records */
+    rc = tdbio_read_record( 0, &vr, RECTYPE_VER );
+    if( rc )
+       log_fatal( _("%s: error reading version record: %s\n"),
+                                            db_name, g10_errstr(rc) );
+    if( vr.r.ver.firstfree ) {
+       recnum = vr.r.ver.firstfree;
+       rc = tdbio_read_record( recnum, &rec, RECTYPE_FREE );
+       if( rc ) {
+           log_error( _("%s: error reading free record: %s\n"),
+                                                 db_name,  g10_errstr(rc) );
+           return rc;
+       }
+       /* update dir record */
+       vr.r.ver.firstfree = rec.r.free.next;
+       rc = tdbio_write_record( &vr );
+       if( rc ) {
+           log_error( _("%s: error writing dir record: %s\n"),
+                                                    db_name, g10_errstr(rc) );
+           return rc;
+       }
+       /*zero out the new record */
+       memset( &rec, 0, sizeof rec );
+       rec.rectype = 0; /* unused record */
+       rec.recnum = recnum;
+       rc = tdbio_write_record( &rec );
+       if( rc )
+           log_fatal(_("%s: failed to zero a record: %s\n"),
+                                      db_name, g10_errstr(rc));
+    }
+    else { /* not found, append a new record */
+       offset = lseek( db_fd, 0, SEEK_END );
+       if( offset == -1 )
+           log_fatal("trustdb: lseek to end failed: %s\n", strerror(errno) );
+       recnum = offset / TRUST_RECORD_LEN;
+       assert(recnum); /* this is will never be the first record */
+       /* we must write a record, so that the next call to this function
+        * returns another recnum */
+       memset( &rec, 0, sizeof rec );
+       rec.rectype = 0; /* unused record */
+       rec.recnum = recnum;
+       rc = 0;
+       if( lseek( db_fd, recnum * TRUST_RECORD_LEN, SEEK_SET ) == -1 ) {
+           log_error(_("trustdb rec %lu: lseek failed: %s\n"),
+                                               recnum, strerror(errno) );
+           rc = G10ERR_WRITE_FILE;
+       }
+       else {
+           int n = write( db_fd, &rec, TRUST_RECORD_LEN);
+           if( n != TRUST_RECORD_LEN ) {
+               log_error(_("trustdb rec %lu: write failed (n=%d): %s\n"),
+                                                recnum, n, strerror(errno) );
+               rc = G10ERR_WRITE_FILE;
+           }
+       }
+
+       if( rc )
+           log_fatal(_("%s: failed to append a record: %s\n"),
+                                   db_name,    g10_errstr(rc));
+    }
+    return recnum ;
+}
+
+
+
+static int
+cmp_trec_fpr ( void *fpr, const TRUSTREC *rec )
+{
+    return rec->rectype == RECTYPE_TRUST
+          && !memcmp( rec->r.trust.fingerprint, fpr, 20);
+}
+
+
+int
+tdbio_search_trust_byfpr( const byte *fingerprint, TRUSTREC *rec )
+{
+    int rc;
+
+    /* locate the trust record using the hash table */
+    rc = lookup_hashtable( get_trusthashrec(), fingerprint, 20,
+                          cmp_trec_fpr, (void*)fingerprint, rec );
+    return rc;
+}
+
+int
+tdbio_search_trust_bypk (PKT_public_key *pk, TRUSTREC *rec)
+{
+    byte fingerprint[MAX_FINGERPRINT_LEN];
+    size_t fingerlen;
+
+    fingerprint_from_pk( pk, fingerprint, &fingerlen );
+    for (; fingerlen < 20; fingerlen++ )
+      fingerprint[fingerlen] = 0;
+    return tdbio_search_trust_byfpr (fingerprint, rec);
+}
+
+
+
+void
+tdbio_invalid(void)
+{
+    log_error(_(
+       "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n") );
+    g10_exit(2);
+}
+
+/*
+ * Migrate the trustdb as just up to gpg 1.0.6 (trustdb version 2)
+ * to the 2.1 version as used with 1.0.6b - This is pretty trivial as needs
+ * only to scan the tdb and insert new the new trust records.  The old ones are
+ * obsolte from now on
+ */
+static void
+migrate_from_v2 ()
+{
+  TRUSTREC rec;
+  int i, n;
+  struct {
+    ulong keyrecno;
+    byte  ot;
+    byte okay;
+    byte  fpr[20];
+  } *ottable;
+  int ottable_size, ottable_used;
+  byte oldbuf[40];
+  ulong recno;
+  int rc, count;
+
+  ottable_size = 5;
+  ottable = xmalloc (ottable_size * sizeof *ottable);
+  ottable_used = 0;
+
+  /* We have some restrictions here.  We can't use the version record
+   * and we can't use any of the old hashtables because we dropped the
+   * code.  So we first collect all ownertrusts and then use a second
+   * pass fo find the associated keys.  We have to do this all without using 
+   * the regular record read functions.
+   */
+
+  /* get all the ownertrusts */
+  if (lseek (db_fd, 0, SEEK_SET ) == -1 ) 
+      log_fatal ("migrate_from_v2: lseek failed: %s\n", strerror (errno));
+  for (recno=0;;recno++)
+    {
+      do
+        n = read (db_fd, oldbuf, 40);
+      while (n==-1 && errno == EINTR);
+      if (!n)
+        break; /* eof */
+      if (n != 40)
+        log_fatal ("migrate_vfrom_v2: read error or short read\n");
+
+      if (*oldbuf != 2)
+        continue;
+      
+      /* v2 dir record */
+      if (ottable_used == ottable_size)
+        {
+          ottable_size += 1000;
+          ottable = xrealloc (ottable, ottable_size * sizeof *ottable);
+        }
+      ottable[ottable_used].keyrecno = buftoulong (oldbuf+6);
+      ottable[ottable_used].ot = oldbuf[18];
+      ottable[ottable_used].okay = 0;
+      memset (ottable[ottable_used].fpr,0, 20);
+      if (ottable[ottable_used].keyrecno && ottable[ottable_used].ot)
+        ottable_used++;
+    }
+  log_info ("found %d ownertrust records\n", ottable_used);
+
+  /* Read again and find the fingerprints */
+  if (lseek (db_fd, 0, SEEK_SET ) == -1 ) 
+      log_fatal ("migrate_from_v2: lseek failed: %s\n", strerror (errno));
+  for (recno=0;;recno++)
+    {
+      do
+        n = read (db_fd, oldbuf, 40);
+      while (n==-1 && errno == EINTR);
+      if (!n)
+        break; /* eof */
+      if (n != 40)
+        log_fatal ("migrate_from_v2: read error or short read\n");
+
+      if (*oldbuf != 3) 
+        continue;
+
+      /* v2 key record */
+      for (i=0; i < ottable_used; i++)
+        {
+          if (ottable[i].keyrecno == recno)
+            {
+              memcpy (ottable[i].fpr, oldbuf+20, 20);
+              ottable[i].okay = 1;
+              break;
+            }
+        }
+    }
+
+  /* got everything - create the v3 trustdb */
+  if (ftruncate (db_fd, 0))
+    log_fatal ("can't truncate `%s': %s\n", db_name, strerror (errno) );
+  if (create_version_record ())
+    log_fatal ("failed to recreate version record of `%s'\n", db_name);
+
+  /* access the hash table, so it is store just after the version record, 
+   * this is not needed put a dump is more pretty */
+  get_trusthashrec ();
+
+  /* And insert the old ownertrust values */
+  count = 0;
+  for (i=0; i < ottable_used; i++)
+    {
+      if (!ottable[i].okay)
+        continue;
+      
+      memset (&rec, 0, sizeof rec);
+      rec.recnum = tdbio_new_recnum ();
+      rec.rectype = RECTYPE_TRUST;
+      memcpy(rec.r.trust.fingerprint, ottable[i].fpr, 20);
+      rec.r.trust.ownertrust = ottable[i].ot;
+      if (tdbio_write_record (&rec))
+        log_fatal ("failed to write trust record of `%s'\n", db_name);
+      count++;
+    }
+
+  revalidation_mark ();
+  rc = tdbio_sync ();
+  if (rc)
+    log_fatal ("failed to sync `%s'\n", db_name);
+  log_info ("migrated %d version 2 ownertrusts\n", count);
+  xfree (ottable);
+}
diff --git a/g10/tdbio.h b/g10/tdbio.h
new file mode 100644 (file)
index 0000000..80a70d9
--- /dev/null
@@ -0,0 +1,118 @@
+/* tdbio.h - Trust database I/O functions
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_TDBIO_H
+#define G10_TDBIO_H
+
+#include "host2net.h"
+
+#define TRUST_RECORD_LEN 40
+#define SIGS_PER_RECORD        ((TRUST_RECORD_LEN-10)/5)
+#define ITEMS_PER_HTBL_RECORD  ((TRUST_RECORD_LEN-2)/4)
+#define ITEMS_PER_HLST_RECORD  ((TRUST_RECORD_LEN-6)/5)
+#define ITEMS_PER_PREF_RECORD  (TRUST_RECORD_LEN-10)
+#if ITEMS_PER_PREF_RECORD % 2
+#error ITEMS_PER_PREF_RECORD must be even
+#endif
+#define MAX_LIST_SIGS_DEPTH  20
+
+
+#define RECTYPE_VER  1
+#define RECTYPE_HTBL 10
+#define RECTYPE_HLST 11
+#define RECTYPE_TRUST 12
+#define RECTYPE_VALID 13
+#define RECTYPE_FREE 254
+
+
+struct trust_record {
+    int  rectype;
+    int  mark;
+    int  dirty;                /* for now only used internal by functions */
+    struct trust_record *next; /* help pointer to build lists in memory */
+    ulong recnum;
+    union {
+       struct {             /* version record: */
+           byte  version;   /* should be 3 */
+           byte  marginals;
+           byte  completes;
+           byte  cert_depth;
+           byte  trust_model;
+           ulong created;   /* timestamp of trustdb creation  */
+           ulong nextcheck; /* timestamp of next scheduled check */
+           ulong reserved;  
+           ulong reserved2;
+           ulong firstfree;
+           ulong reserved3;
+            ulong trusthashtbl;
+       } ver;
+       struct {            /* free record */
+           ulong next;
+       } free;
+       struct {
+           ulong item[ITEMS_PER_HTBL_RECORD];
+       } htbl;
+       struct {
+           ulong next;
+           ulong rnum[ITEMS_PER_HLST_RECORD]; /* of another record */
+       } hlst;
+      struct {
+        byte fingerprint[20];
+        byte ownertrust;
+        byte depth;
+        ulong validlist;
+       byte min_ownertrust;
+      } trust;
+      struct {
+        byte namehash[20];
+        ulong next;  
+        byte validity;
+       byte full_count;
+       byte marginal_count;
+      } valid;
+    } r;
+};
+typedef struct trust_record TRUSTREC;
+
+/*-- tdbio.c --*/
+int tdbio_update_version_record(void);
+int tdbio_set_dbname( const char *new_dbname, int create );
+const char *tdbio_get_dbname(void);
+void tdbio_dump_record( TRUSTREC *rec, FILE *fp );
+int tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected );
+int tdbio_write_record( TRUSTREC *rec );
+int tdbio_db_matches_options(void);
+byte tdbio_read_model(void);
+ulong tdbio_read_nextcheck (void);
+int tdbio_write_nextcheck (ulong stamp);
+int tdbio_is_dirty(void);
+int tdbio_sync(void);
+int tdbio_begin_transaction(void);
+int tdbio_end_transaction(void);
+int tdbio_cancel_transaction(void);
+int tdbio_delete_record( ulong recnum );
+ulong tdbio_new_recnum(void);
+int tdbio_search_trust_byfpr(const byte *fingerprint, TRUSTREC *rec );
+int tdbio_search_trust_bypk(PKT_public_key *pk, TRUSTREC *rec );
+
+void tdbio_invalid(void);
+
+#endif /*G10_TDBIO_H*/
diff --git a/g10/textfilter.c b/g10/textfilter.c
new file mode 100644 (file)
index 0000000..8665a72
--- /dev/null
@@ -0,0 +1,251 @@
+/* textfilter.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "errors.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+#include "filter.h"
+#include "i18n.h"
+#include "options.h"
+#include "status.h"
+
+#ifdef HAVE_DOSISH_SYSTEM
+#define LF "\r\n"
+#else
+#define LF "\n"
+#endif
+
+#define MAX_LINELEN 19995 /* a little bit smaller than in armor.c */
+                         /* to make sure that a warning is displayed while */
+                         /* creating a message */
+
+static unsigned
+len_without_trailing_chars( byte *line, unsigned len, const char *trimchars )
+{
+    byte *p, *mark;
+    unsigned n;
+
+    for(mark=NULL, p=line, n=0; n < len; n++, p++ ) {
+       if( strchr( trimchars, *p ) ) {
+           if( !mark )
+               mark = p;
+       }
+       else
+           mark = NULL;
+    }
+
+    return mark? (mark - line) : len;
+}
+
+
+static int
+standard( text_filter_context_t *tfx, IOBUF a,
+         byte *buf, size_t size, size_t *ret_len)
+{
+    int rc=0;
+    size_t len = 0;
+    unsigned maxlen;
+
+    assert( size > 10 );
+    size -= 2; /* reserve 2 bytes to append CR,LF */
+    while( !rc && len < size ) {
+       int lf_seen;
+
+       while( len < size && tfx->buffer_pos < tfx->buffer_len )
+           buf[len++] = tfx->buffer[tfx->buffer_pos++];
+       if( len >= size )
+           continue;
+
+       /* read the next line */
+       maxlen = MAX_LINELEN;
+       tfx->buffer_pos = 0;
+       tfx->buffer_len = iobuf_read_line( a, &tfx->buffer,
+                                          &tfx->buffer_size, &maxlen );
+       if( !maxlen )
+           tfx->truncated++;
+       if( !tfx->buffer_len ) {
+           if( !len )
+               rc = -1; /* eof */
+           break;
+       }
+       lf_seen = tfx->buffer[tfx->buffer_len-1] == '\n';
+
+       /* The story behind this is that 2440 says that textmode
+          hashes should canonicalize line endings to CRLF and remove
+          spaces and tabs.  2440bis-12 says to just canonicalize to
+          CRLF.  1.4.0 was released using the bis-12 behavior, but it
+          was discovered that many mail clients do not canonicalize
+          PGP/MIME signature text appropriately (and were relying on
+          GnuPG to handle trailing spaces).  So, we default to the
+          2440 behavior, but use the 2440bis-12 behavior if the user
+          specifies --no-rfc2440-text.  The default will be changed
+          at some point in the future when the mail clients have been
+          upgraded.  Aside from PGP/MIME and broken mail clients,
+          this makes no difference to any signatures in the real
+          world except for a textmode detached signature.  PGP always
+          used the 2440bis-12 behavior (ignoring 2440 itself), so
+          this actually makes us compatible with PGP textmode
+          detached signatures for the first time. */
+       if(opt.rfc2440_text)
+         tfx->buffer_len=trim_trailing_chars(tfx->buffer,tfx->buffer_len,
+                                             " \t\r\n");
+       else
+         tfx->buffer_len=trim_trailing_chars(tfx->buffer,tfx->buffer_len,
+                                             "\r\n");
+
+       if( lf_seen ) {
+           tfx->buffer[tfx->buffer_len++] = '\r';
+           tfx->buffer[tfx->buffer_len++] = '\n';
+       }
+    }
+    *ret_len = len;
+    return rc;
+}
+
+
+/****************
+ * The filter is used to make canonical text: Lines are terminated by
+ * CR, LF, trailing white spaces are removed.
+ */
+int
+text_filter( void *opaque, int control,
+            IOBUF a, byte *buf, size_t *ret_len)
+{
+    size_t size = *ret_len;
+    text_filter_context_t *tfx = opaque;
+    int rc=0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       rc = standard( tfx, a, buf, size, ret_len );
+    }
+    else if( control == IOBUFCTRL_FREE ) {
+       if( tfx->truncated )
+           log_error(_("can't handle text lines longer than %d characters\n"),
+                       MAX_LINELEN );
+       xfree( tfx->buffer );
+       tfx->buffer = NULL;
+    }
+    else if( control == IOBUFCTRL_DESC )
+       *(char**)buf = "text_filter";
+    return rc;
+}
+
+
+/****************
+ * Copy data from INP to OUT and do some escaping if requested.
+ * md is updated as required by rfc2440
+ */
+int
+copy_clearsig_text( IOBUF out, IOBUF inp, MD_HANDLE md,
+                   int escape_dash, int escape_from, int pgp2mode )
+{
+    unsigned maxlen;
+    byte *buffer = NULL;    /* malloced buffer */
+    unsigned bufsize;      /* and size of this buffer */
+    unsigned n;
+    int truncated = 0;
+    int pending_lf = 0;
+
+    if( !opt.pgp2_workarounds )
+       pgp2mode = 0;
+
+    if( !escape_dash )
+       escape_from = 0;
+
+    write_status (STATUS_BEGIN_SIGNING);
+
+    for(;;) {
+       maxlen = MAX_LINELEN;
+       n = iobuf_read_line( inp, &buffer, &bufsize, &maxlen );
+       if( !maxlen )
+           truncated++;
+
+       if( !n )
+           break; /* read_line has returned eof */
+
+       /* update the message digest */
+       if( escape_dash ) {
+           if( pending_lf ) {
+               md_putc( md, '\r' );
+               md_putc( md, '\n' );
+           }
+           md_write( md, buffer,
+                    len_without_trailing_chars( buffer, n,
+                                                pgp2mode? " \r\n":" \t\r\n"));
+       }
+       else
+           md_write( md, buffer, n );
+       pending_lf = buffer[n-1] == '\n';
+
+       /* write the output */
+       if(    ( escape_dash && *buffer == '-')
+           || ( escape_from && n > 4 && !memcmp(buffer, "From ", 5 ) ) ) {
+           iobuf_put( out, '-' );
+           iobuf_put( out, ' ' );
+       }
+
+#if  0 /*defined(HAVE_DOSISH_SYSTEM)*/
+       /* We don't use this anymore because my interpretation of rfc2440 7.1
+        * is that there is no conversion needed.  If one decides to
+        * clearsign a unix file on a DOS box he will get a mixed line endings.
+        * If at some point it turns out, that a conversion is a nice feature
+        * we can make an option out of it.
+        */
+       /* make sure the lines do end in CR,LF */
+       if( n > 1 && ( (buffer[n-2] == '\r' && buffer[n-1] == '\n' )
+                           || (buffer[n-2] == '\n' && buffer[n-1] == '\r'))) {
+           iobuf_write( out, buffer, n-2 );
+           iobuf_put( out, '\r');
+           iobuf_put( out, '\n');
+       }
+       else if( n && buffer[n-1] == '\n' ) {
+           iobuf_write( out, buffer, n-1 );
+           iobuf_put( out, '\r');
+           iobuf_put( out, '\n');
+       }
+       else
+           iobuf_write( out, buffer, n );
+
+#else
+       iobuf_write( out, buffer, n );
+#endif
+    }
+
+    /* at eof */
+    if( !pending_lf ) { /* make sure that the file ends with a LF */
+       iobuf_writestr( out, LF );
+       if( !escape_dash )
+           md_putc( md, '\n' );
+    }
+
+    if( truncated )
+       log_info(_("input line longer than %d characters\n"), MAX_LINELEN );
+
+    return 0; /* okay */
+}
diff --git a/g10/tlv.c b/g10/tlv.c
new file mode 100644 (file)
index 0000000..c7233e0
--- /dev/null
+++ b/g10/tlv.c
@@ -0,0 +1,306 @@
+/* tlv.c - Tag-Length-Value Utilities
+ *     Copyright (C) 2003, 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#if GNUPG_MAJOR_VERSION == 1
+#define GPG_ERR_EOF               (-1)
+#define GPG_ERR_BAD_BER           (1)  /*G10ERR_GENERAL*/
+#define GPG_ERR_INV_SEXP          (45) /*G10ERR_INV_ARG*/
+typedef int gpg_error_t;
+#define gpg_error(n) (n)
+#else
+#include <gpg-error.h>
+#endif
+
+
+#include "tlv.h"
+
+static const unsigned char *
+do_find_tlv (const unsigned char *buffer, size_t length,
+             int tag, size_t *nbytes, int nestlevel)
+{
+  const unsigned char *s = buffer;
+  size_t n = length;
+  size_t len;
+  int this_tag;
+  int composite;
+    
+  for (;;)
+    {
+      buffer = s;
+      if (n < 2)
+        return NULL; /* Buffer definitely too short for tag and length. */
+      if (!*s || *s == 0xff)
+        { /* Skip optional filler between TLV objects. */
+          s++;
+          n--;
+          continue;
+        }
+      composite = !!(*s & 0x20);
+      if ((*s & 0x1f) == 0x1f)
+        { /* more tag bytes to follow */
+          s++;
+          n--;
+          if (n < 2)
+            return NULL; /* buffer definitely too short for tag and length. */
+          if ((*s & 0x1f) == 0x1f)
+            return NULL; /* We support only up to 2 bytes. */
+          this_tag = (s[-1] << 8) | (s[0] & 0x7f);
+        }
+      else
+        this_tag = s[0];
+      len = s[1];
+      s += 2; n -= 2;
+      if (len < 0x80)
+        ;
+      else if (len == 0x81)
+        { /* One byte length follows. */
+          if (!n)
+            return NULL; /* we expected 1 more bytes with the length. */
+          len = s[0];
+          s++; n--;
+        }
+      else if (len == 0x82)
+        { /* Two byte length follows. */
+          if (n < 2)
+            return NULL; /* We expected 2 more bytes with the length. */
+          len = (s[0] << 8) | s[1];
+          s += 2; n -= 2;
+        }
+      else
+        return NULL; /* APDU limit is 65535, thus it does not make
+                        sense to assume longer length fields. */
+
+      if (composite && nestlevel < 100)
+        { /* Dive into this composite DO after checking for a too deep
+             nesting. */
+          const unsigned char *tmp_s;
+          size_t tmp_len;
+          
+          tmp_s = do_find_tlv (s, len, tag, &tmp_len, nestlevel+1);
+          if (tmp_s)
+            {
+              *nbytes = tmp_len;
+              return tmp_s;
+            }
+        }
+
+      if (this_tag == tag)
+        {
+          *nbytes = len;
+          return s;
+        }
+      if (len > n)
+        return NULL; /* Buffer too short to skip to the next tag. */
+      s += len; n -= len;
+    }
+}
+
+
+/* Locate a TLV encoded data object in BUFFER of LENGTH and
+   return a pointer to value as well as its length in NBYTES.  Return
+   NULL if it was not found or if the object does not fit into the buffer. */
+const unsigned char *
+find_tlv (const unsigned char *buffer, size_t length,
+          int tag, size_t *nbytes)
+{
+  const unsigned char *p;
+
+  p = do_find_tlv (buffer, length, tag, nbytes, 0);
+  if (p && *nbytes > (length - (p-buffer)))
+    p = NULL; /* Object longer than buffer. */
+  return p;
+}
+
+
+
+/* Locate a TLV encoded data object in BUFFER of LENGTH and
+   return a pointer to value as well as its length in NBYTES.  Return
+   NULL if it was not found.  Note, that the function does not check
+   whether the value fits into the provided buffer. */
+const unsigned char *
+find_tlv_unchecked (const unsigned char *buffer, size_t length,
+                    int tag, size_t *nbytes)
+{
+  return do_find_tlv (buffer, length, tag, nbytes, 0);
+}
+
+
+/* ASN.1 BER parser: Parse BUFFER of length SIZE and return the tag
+   and the length part from the TLV triplet.  Update BUFFER and SIZE
+   on success. */
+gpg_error_t
+parse_ber_header (unsigned char const **buffer, size_t *size,
+                  int *r_class, int *r_tag, 
+                  int *r_constructed, int *r_ndef,
+                  size_t *r_length, size_t *r_nhdr)
+{
+  int c;
+  unsigned long tag;
+  const unsigned char *buf = *buffer;
+  size_t length = *size;
+
+  *r_ndef = 0;
+  *r_length = 0;
+  *r_nhdr = 0;
+
+  /* Get the tag. */
+  if (!length)
+    return gpg_error (GPG_ERR_EOF);
+  c = *buf++; length--; ++*r_nhdr;
+
+  *r_class = (c & 0xc0) >> 6;
+  *r_constructed = !!(c & 0x20);
+  tag = c & 0x1f;
+
+  if (tag == 0x1f)
+    {
+      tag = 0;
+      do
+        {
+          tag <<= 7;
+          if (!length)
+            return gpg_error (GPG_ERR_EOF);
+          c = *buf++; length--; ++*r_nhdr;
+          tag |= c & 0x7f;
+
+        }
+      while (c & 0x80);
+    }
+  *r_tag = tag;
+
+  /* Get the length. */
+  if (!length)
+    return gpg_error (GPG_ERR_EOF);
+  c = *buf++; length--; ++*r_nhdr;
+
+  if ( !(c & 0x80) )
+    *r_length = c;
+  else if (c == 0x80)
+    *r_ndef = 1;
+  else if (c == 0xff)
+    return gpg_error (GPG_ERR_BAD_BER);
+  else
+    {
+      unsigned long len = 0;
+      int count = c & 0x7f;
+
+      if (count > sizeof (len) || count > sizeof (size_t))
+        return gpg_error (GPG_ERR_BAD_BER);
+
+      for (; count; count--)
+        {
+          len <<= 8;
+          if (!length)
+            return gpg_error (GPG_ERR_EOF);
+          c = *buf++; length--; ++*r_nhdr;
+          len |= c & 0xff;
+        }
+      *r_length = len;
+    }
+  
+  /* Without this kludge some example certs can't be parsed. */
+  if (*r_class == CLASS_UNIVERSAL && !*r_tag)
+    *r_length = 0;
+  
+  *buffer = buf;
+  *size = length;
+  return 0;
+}
+
+
+/* FIXME: The following function should not go into this file but for
+   now it is easier to keep it here. */
+
+/* Return the next token of an canconical encoded S-expression.  BUF
+   is the pointer to the S-expression and BUFLEN is a pointer to the
+   length of this S-expression (used to validate the syntax).  Both
+   are updated to reflect the new position.  The token itself is
+   returned as a pointer into the orginal buffer at TOK and TOKLEN.
+   If a parentheses is the next token, TOK will be set to NULL.
+   TOKLEN is checked to be within the bounds.  On error a error code
+   is returned and all pointers should are not guaranteed to point to
+   a meanigful value. DEPTH should be initialized to 0 and will
+   reflect on return the actual depth of the tree. To detect the end
+   of the S-expression it is advisable to check DEPTH after a
+   successful return:
+
+   depth = 0;
+   while (!(err = parse_sexp (&buf, &buflen, &depth, &tok, &toklen))
+          && depth)
+     process_token (tok, toklen);
+   if (err)  
+     handle_error ();
+ */
+gpg_error_t
+parse_sexp (unsigned char const **buf, size_t *buflen,
+            int *depth, unsigned char const **tok, size_t *toklen)
+{
+  const unsigned char *s;
+  size_t n, vlen;
+
+  s = *buf;
+  n = *buflen;
+  *tok = NULL;
+  *toklen = 0;
+  if (!n)
+    return *depth ? gpg_error (GPG_ERR_INV_SEXP) : 0;
+  if (*s == '(')
+    {
+      s++; n--;
+      (*depth)++;
+      *buf = s;
+      *buflen = n;
+      return 0;
+    }
+  if (*s == ')')
+    {
+      if (!*depth)
+        return gpg_error (GPG_ERR_INV_SEXP);
+      *toklen = 1;
+      s++; n--;
+      (*depth)--;
+      *buf = s;
+      *buflen = n;
+      return 0;
+    }
+  for (vlen=0; n && *s && *s != ':' && (*s >= '0' && *s <= '9'); s++, n--)
+    vlen = vlen*10 + (*s - '0');
+  if (!n || *s != ':')
+    return gpg_error (GPG_ERR_INV_SEXP);
+  s++; n--;
+  if (vlen > n)
+    return gpg_error (GPG_ERR_INV_SEXP);
+  *tok = s;
+  *toklen = vlen;
+  s += vlen;
+  n -= vlen;
+  *buf = s;
+  *buflen = n;
+  return 0;
+}
+
diff --git a/g10/tlv.h b/g10/tlv.h
new file mode 100644 (file)
index 0000000..877573d
--- /dev/null
+++ b/g10/tlv.h
@@ -0,0 +1,109 @@
+/* tlv.h - Tag-Length-Value Utilities
+ *     Copyright (C) 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef SCD_TLV_H
+#define SCD_TLV_H 1
+
+
+enum tlv_tag_class {
+  CLASS_UNIVERSAL = 0,
+  CLASS_APPLICATION = 1,
+  CLASS_CONTEXT = 2,
+  CLASS_PRIVATE =3
+};
+
+enum tlv_tag_type {
+  TAG_NONE = 0,
+  TAG_BOOLEAN = 1,
+  TAG_INTEGER = 2,
+  TAG_BIT_STRING = 3,
+  TAG_OCTET_STRING = 4,
+  TAG_NULL = 5,
+  TAG_OBJECT_ID = 6,
+  TAG_OBJECT_DESCRIPTOR = 7,
+  TAG_EXTERNAL = 8,
+  TAG_REAL = 9,
+  TAG_ENUMERATED = 10,
+  TAG_EMBEDDED_PDV = 11,
+  TAG_UTF8_STRING = 12,
+  TAG_REALTIVE_OID = 13,
+  TAG_SEQUENCE = 16,
+  TAG_SET = 17,
+  TAG_NUMERIC_STRING = 18,
+  TAG_PRINTABLE_STRING = 19,
+  TAG_TELETEX_STRING = 20,
+  TAG_VIDEOTEX_STRING = 21,
+  TAG_IA5_STRING = 22,
+  TAG_UTC_TIME = 23,
+  TAG_GENERALIZED_TIME = 24,
+  TAG_GRAPHIC_STRING = 25,
+  TAG_VISIBLE_STRING = 26,
+  TAG_GENERAL_STRING = 27,
+  TAG_UNIVERSAL_STRING = 28,
+  TAG_CHARACTER_STRING = 29,
+  TAG_BMP_STRING = 30
+};
+
+
+/* Locate a TLV encoded data object in BUFFER of LENGTH and return a
+   pointer to value as well as its length in NBYTES.  Return NULL if
+   it was not found or if the object does not fit into the buffer. */
+const unsigned char *find_tlv (const unsigned char *buffer, size_t length,
+                               int tag, size_t *nbytes);
+
+
+/* Locate a TLV encoded data object in BUFFER of LENGTH and return a
+   pointer to value as well as its length in NBYTES.  Return NULL if
+   it was not found.  Note, that the function does not check whether
+   the value fits into the provided buffer.*/
+const unsigned char *find_tlv_unchecked (const unsigned char *buffer,
+                                         size_t length,
+                                         int tag, size_t *nbytes);
+
+
+/* ASN.1 BER parser: Parse BUFFER of length SIZE and return the tag
+   and the length part from the TLV triplet.  Update BUFFER and SIZE
+   on success. */
+gpg_error_t parse_ber_header (unsigned char const **buffer, size_t *size,
+                              int *r_class, int *r_tag, 
+                              int *r_constructed,
+                              int *r_ndef, size_t *r_length, size_t *r_nhdr);
+
+
+
+/* Return the next token of an canconical encoded S-expression.  BUF
+   is the pointer to the S-expression and BUFLEN is a pointer to the
+   length of this S-expression (used to validate the syntax).  Both
+   are updated to reflect the new position.  The token itself is
+   returned as a pointer into the orginal buffer at TOK and TOKLEN.
+   If a parentheses is the next token, TOK will be set to NULL.
+   TOKLEN is checked to be within the bounds.  On error a error code
+   is returned and all pointers should are not guaranteed to point to
+   a meanigful value. DEPTH should be initialized to 0 and will
+   reflect on return the actual depth of the tree. To detect the end
+   of the S-expression it is advisable to check DEPTH after a
+   successful return. */
+gpg_error_t parse_sexp (unsigned char const **buf, size_t *buflen,
+                        int *depth, unsigned char const **tok, size_t *toklen);
+
+
+
+#endif /* SCD_TLV_H */
diff --git a/g10/trustdb.c b/g10/trustdb.c
new file mode 100644 (file)
index 0000000..e372bf8
--- /dev/null
@@ -0,0 +1,2368 @@
+/* trustdb.c
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#ifndef DISABLE_REGEX
+#include <sys/types.h>
+#ifdef USE_INTERNAL_REGEX
+#include "_regex.h"
+#else
+#include <regex.h>
+#endif
+#endif /* !DISABLE_REGEX */
+
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "options.h"
+#include "packet.h"
+#include "main.h"
+#include "i18n.h"
+#include "tdbio.h"
+#include "trustdb.h"
+
+
+/*
+ * A structure to store key identification as well as some stuff needed
+ * for validation 
+ */
+struct key_item {
+  struct key_item *next;
+  unsigned int ownertrust,min_ownertrust;
+  byte trust_depth;
+  byte trust_value;
+  char *trust_regexp;
+  u32 kid[2];
+};
+
+
+typedef struct key_item **KeyHashTable; /* see new_key_hash_table() */
+
+/*
+ * Structure to keep track of keys, this is used as an array wherre
+ * the item right after the last one has a keyblock set to NULL. 
+ * Maybe we can drop this thing and replace it by key_item
+ */
+struct key_array {
+  KBNODE keyblock;
+};
+
+
+/* control information for the trust DB */
+static struct {
+    int init;
+    int level;
+    char *dbname;
+} trustdb_args;
+
+/* some globals */
+static struct key_item *user_utk_list; /* temp. used to store --trusted-keys */
+static struct key_item *utk_list;      /* all ultimately trusted keys */
+
+static int pending_check_trustdb;
+
+static int validate_keys (int interactive);
+
+\f
+/**********************************************
+ ************* some helpers *******************
+ **********************************************/
+
+static struct key_item *
+new_key_item (void)
+{
+  struct key_item *k;
+  
+  k = xmalloc_clear (sizeof *k);
+  return k;
+}
+
+static void
+release_key_items (struct key_item *k)
+{
+  struct key_item *k2;
+
+  for (; k; k = k2)
+    {
+      k2 = k->next;
+      xfree (k->trust_regexp);
+      xfree (k);
+    }
+}
+
+/*
+ * For fast keylook up we need a hash table.  Each byte of a KeyIDs
+ * should be distributed equally over the 256 possible values (except
+ * for v3 keyIDs but we consider them as not important here). So we
+ * can just use 10 bits to index a table of 1024 key items. 
+ * Possible optimization: Don not use key_items but other hash_table when the
+ * duplicates lists gets too large. 
+ */
+static KeyHashTable 
+new_key_hash_table (void)
+{
+  struct key_item **tbl;
+
+  tbl = xmalloc_clear (1024 * sizeof *tbl);
+  return tbl;
+}
+
+static void
+release_key_hash_table (KeyHashTable tbl)
+{
+  int i;
+
+  if (!tbl)
+    return;
+  for (i=0; i < 1024; i++)
+    release_key_items (tbl[i]);
+  xfree (tbl);
+}
+
+/* 
+ * Returns: True if the keyID is in the given hash table
+ */
+static int
+test_key_hash_table (KeyHashTable tbl, u32 *kid)
+{
+  struct key_item *k;
+
+  for (k = tbl[(kid[1] & 0x03ff)]; k; k = k->next)
+    if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
+      return 1;
+  return 0;
+}
+
+/*
+ * Add a new key to the hash table.  The key is identified by its key ID.
+ */
+static void
+add_key_hash_table (KeyHashTable tbl, u32 *kid)
+{
+  struct key_item *k, *kk;
+
+  for (k = tbl[(kid[1] & 0x03ff)]; k; k = k->next)
+    if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
+      return; /* already in table */
+  
+  kk = new_key_item ();
+  kk->kid[0] = kid[0];
+  kk->kid[1] = kid[1];
+  kk->next = tbl[(kid[1] & 0x03ff)];
+  tbl[(kid[1] & 0x03ff)] = kk;
+}
+
+/*
+ * Release a key_array
+ */
+static void
+release_key_array ( struct key_array *keys )
+{
+    struct key_array *k;
+
+    if (keys) {
+        for (k=keys; k->keyblock; k++)
+            release_kbnode (k->keyblock);
+        xfree (keys);
+    }
+}
+
+\f
+/*********************************************
+ **********  Initialization  *****************
+ *********************************************/
+
+
+
+/*
+ * Used to register extra ultimately trusted keys - this has to be done
+ * before initializing the validation module.
+ * FIXME: Should be replaced by a function to add those keys to the trustdb.
+ */
+void
+register_trusted_keyid(u32 *keyid)
+{
+  struct key_item *k;
+
+  k = new_key_item ();
+  k->kid[0] = keyid[0];
+  k->kid[1] = keyid[1];
+  k->next = user_utk_list;
+  user_utk_list = k;
+}
+
+void
+register_trusted_key( const char *string )
+{
+  KEYDB_SEARCH_DESC desc;
+
+  if (classify_user_id (string, &desc) != KEYDB_SEARCH_MODE_LONG_KID )
+    {
+      log_error(_("`%s' is not a valid long keyID\n"), string );
+      return;
+    }
+
+  register_trusted_keyid(desc.u.kid);
+}
+
+/*
+ * Helper to add a key to the global list of ultimately trusted keys.
+ * Retruns: true = inserted, false = already in in list.
+ */
+static int
+add_utk (u32 *kid)
+{
+  struct key_item *k;
+
+  for (k = utk_list; k; k = k->next) 
+    {
+      if (k->kid[0] == kid[0] && k->kid[1] == kid[1])
+        {
+          return 0;
+        }
+    }
+
+  k = new_key_item ();
+  k->kid[0] = kid[0];
+  k->kid[1] = kid[1];
+  k->ownertrust = TRUST_ULTIMATE;
+  k->next = utk_list;
+  utk_list = k;
+  if( opt.verbose > 1 )
+    log_info(_("key %s: accepted as trusted key\n"), keystr(kid));
+  return 1;
+}
+
+
+/****************
+ * Verify that all our secret keys are usable and put them into the utk_list.
+ */
+static void
+verify_own_keys(void)
+{
+  TRUSTREC rec;
+  ulong recnum;
+  int rc;
+  struct key_item *k;
+
+  if (utk_list)
+    return;
+
+  /* scan the trustdb to find all ultimately trusted keys */
+  for (recnum=1; !tdbio_read_record (recnum, &rec, 0); recnum++ ) 
+    {
+      if ( rec.rectype == RECTYPE_TRUST 
+           && (rec.r.trust.ownertrust & TRUST_MASK) == TRUST_ULTIMATE)
+        {
+            byte *fpr = rec.r.trust.fingerprint;
+            int fprlen;
+            u32 kid[2];
+            
+            /* Problem: We do only use fingerprints in the trustdb but
+             * we need the keyID here to indetify the key; we can only
+             * use that ugly hack to distinguish between 16 and 20
+             * butes fpr - it does not work always so we better change
+             * the whole validation code to only work with
+             * fingerprints */
+            fprlen = (!fpr[16] && !fpr[17] && !fpr[18] && !fpr[19])? 16:20;
+            keyid_from_fingerprint (fpr, fprlen, kid);
+            if (!add_utk (kid))
+             log_info(_("key %s occurs more than once in the trustdb\n"),
+                      keystr(kid));
+        }
+    }
+
+  /* Put any --trusted-key keys into the trustdb */
+  for (k = user_utk_list; k; k = k->next) 
+    {
+      if ( add_utk (k->kid) ) 
+        { /* not yet in trustDB as ultimately trusted */
+          PKT_public_key pk;
+
+          memset (&pk, 0, sizeof pk);
+          rc = get_pubkey (&pk, k->kid);
+          if (rc)
+           log_info(_("key %s: no public key for trusted key - skipped\n"),
+                    keystr(k->kid));
+          else
+           {
+             update_ownertrust (&pk,
+                                ((get_ownertrust (&pk) & ~TRUST_MASK)
+                                 | TRUST_ULTIMATE ));
+             release_public_key_parts (&pk);
+           }
+
+          log_info (_("key %s marked as ultimately trusted\n"),keystr(k->kid));
+        }
+    }
+
+  /* release the helper table table */
+  release_key_items (user_utk_list);
+  user_utk_list = NULL;
+  return;
+}
+
+\f
+/*********************************************
+ *********** TrustDB stuff *******************
+ *********************************************/
+
+/*
+ * Read a record but die if it does not exist
+ */
+static void
+read_record (ulong recno, TRUSTREC *rec, int rectype )
+{
+  int rc = tdbio_read_record (recno, rec, rectype);
+  if (rc)
+    {
+      log_error(_("trust record %lu, req type %d: read failed: %s\n"),
+                recno, rec->rectype, g10_errstr(rc) );
+      tdbio_invalid();
+    }
+  if (rectype != rec->rectype)
+    {
+      log_error(_("trust record %lu is not of requested type %d\n"),
+                rec->recnum, rectype);
+      tdbio_invalid();
+    }
+}
+
+/*
+ * Write a record and die on error
+ */
+static void
+write_record (TRUSTREC *rec)
+{
+  int rc = tdbio_write_record (rec);
+  if (rc)
+    {
+      log_error(_("trust record %lu, type %d: write failed: %s\n"),
+                           rec->recnum, rec->rectype, g10_errstr(rc) );
+      tdbio_invalid();
+    }
+}
+
+/*
+ * sync the TrustDb and die on error
+ */
+static void
+do_sync(void)
+{
+    int rc = tdbio_sync ();
+    if(rc)
+      {
+        log_error (_("trustdb: sync failed: %s\n"), g10_errstr(rc) );
+        g10_exit(2);
+      }
+}
+
+static const char *
+trust_model_string(void)
+{
+  switch(opt.trust_model)
+    {
+    case TM_CLASSIC:  return "classic";
+    case TM_PGP:      return "PGP";
+    case TM_EXTERNAL: return "external";
+    case TM_ALWAYS:   return "always";
+    case TM_DIRECT:   return "direct";
+    default:          return "unknown";
+    }
+}
+
+/****************
+ * Perform some checks over the trustdb
+ *  level 0: only open the db
+ *       1: used for initial program startup
+ */
+int
+setup_trustdb( int level, const char *dbname )
+{
+    /* just store the args */
+    if( trustdb_args.init )
+       return 0;
+    trustdb_args.level = level;
+    trustdb_args.dbname = dbname? xstrdup(dbname): NULL;
+    return 0;
+}
+
+void
+init_trustdb()
+{
+  int level = trustdb_args.level;
+  const char* dbname = trustdb_args.dbname;
+
+  if( trustdb_args.init )
+    return;
+
+  trustdb_args.init = 1;
+
+  if(level==0 || level==1)
+    {
+      int rc = tdbio_set_dbname( dbname, !!level );
+      if( rc )
+       log_fatal("can't init trustdb: %s\n", g10_errstr(rc) );
+    }
+  else
+    BUG();
+
+  if(opt.trust_model==TM_AUTO)
+    {
+      /* Try and set the trust model off of whatever the trustdb says
+        it is. */
+      opt.trust_model=tdbio_read_model();
+
+      /* Sanity check this ;) */
+      if(opt.trust_model!=TM_CLASSIC
+        && opt.trust_model!=TM_PGP
+        && opt.trust_model!=TM_EXTERNAL)
+       {
+         log_info(_("unable to use unknown trust model (%d) - "
+                    "assuming %s trust model\n"),opt.trust_model,"PGP");
+         opt.trust_model=TM_PGP;
+       }
+
+      if(opt.verbose)
+       log_info(_("using %s trust model\n"),trust_model_string());
+    }
+
+  if(opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC)
+    {
+      /* Verify the list of ultimately trusted keys and move the
+        --trusted-keys list there as well. */
+      if(level==1)
+       verify_own_keys();
+
+      if(!tdbio_db_matches_options())
+       pending_check_trustdb=1;
+    }
+}
+
+
+/***********************************************
+ ************* Print helpers   ****************
+ ***********************************************/
+
+/****************
+ * This function returns a letter for a trustvalue  Trust flags
+ * are ignore.
+ */
+static int
+trust_letter (unsigned int value)
+{
+  switch( (value & TRUST_MASK) ) 
+    {
+    case TRUST_UNKNOWN:   return '-';
+    case TRUST_EXPIRED:   return 'e';
+    case TRUST_UNDEFINED: return 'q';
+    case TRUST_NEVER:     return 'n';
+    case TRUST_MARGINAL:  return 'm';
+    case TRUST_FULLY:     return 'f';
+    case TRUST_ULTIMATE:  return 'u';
+    default:              return '?';
+    }
+}
+
+/* NOTE TO TRANSLATOR: these strings are similar to those in
+   trust_value_to_string(), but are a fixed length.  This is needed to
+   make attractive information listings where columns line up
+   properly.  The value "10" should be the length of the strings you
+   choose to translate to.  This is the length in printable columns.
+   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. */
+const char *
+uid_trust_string_fixed(PKT_public_key *key,PKT_user_id *uid)
+{
+  if(!key && !uid)
+    return _("10 translator see trustdb.c:uid_trust_string_fixed");
+  else if(uid->is_revoked || (key && key->is_revoked))
+    return                         _("[ revoked]");
+  else if(uid->is_expired)
+    return                         _("[ expired]");
+  else if(key)
+    switch(get_validity(key,uid)&TRUST_MASK)
+      {
+      case TRUST_UNKNOWN:   return _("[ unknown]");
+      case TRUST_EXPIRED:   return _("[ expired]");
+      case TRUST_UNDEFINED: return _("[  undef ]");
+      case TRUST_MARGINAL:  return _("[marginal]");
+      case TRUST_FULLY:     return _("[  full  ]");
+      case TRUST_ULTIMATE:  return _("[ultimate]");
+      }
+
+  return "err";
+}
+
+/* The strings here are similar to those in
+   pkclist.c:do_edit_ownertrust() */
+const char *
+trust_value_to_string (unsigned int value)
+{
+  switch( (value & TRUST_MASK) ) 
+    {
+    case TRUST_UNKNOWN:   return _("unknown");
+    case TRUST_EXPIRED:   return _("expired");
+    case TRUST_UNDEFINED: return _("undefined");
+    case TRUST_NEVER:     return _("never");
+    case TRUST_MARGINAL:  return _("marginal");
+    case TRUST_FULLY:     return _("full");
+    case TRUST_ULTIMATE:  return _("ultimate");
+    default:              return "err";
+    }
+}
+
+int
+string_to_trust_value (const char *str)
+{
+  if(ascii_strcasecmp(str,"undefined")==0)
+    return TRUST_UNDEFINED;
+  else if(ascii_strcasecmp(str,"never")==0)
+    return TRUST_NEVER;
+  else if(ascii_strcasecmp(str,"marginal")==0)
+    return TRUST_MARGINAL;
+  else if(ascii_strcasecmp(str,"full")==0)
+    return TRUST_FULLY;
+  else if(ascii_strcasecmp(str,"ultimate")==0)
+    return TRUST_ULTIMATE;
+  else
+    return -1;
+}
+
+/****************
+ * Recreate the WoT but do not ask for new ownertrusts.  Special
+ * feature: In batch mode and without a forced yes, this is only done
+ * when a check is due.  This can be used to run the check from a crontab
+ */
+void
+check_trustdb ()
+{
+  init_trustdb();
+  if(opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC)
+    {
+      if (opt.batch && !opt.answer_yes)
+       {
+         ulong scheduled;
+
+         scheduled = tdbio_read_nextcheck ();
+         if (!scheduled)
+           {
+             log_info (_("no need for a trustdb check\n"));
+             return;
+           }
+
+         if (scheduled > make_timestamp ())
+           {
+             log_info (_("next trustdb check due at %s\n"),
+                       strtimestamp (scheduled));
+             return;
+           }
+       }
+
+      validate_keys (0);
+    }
+  else
+    log_info (_("no need for a trustdb check with `%s' trust model\n"),
+             trust_model_string());
+}
+
+
+/*
+ * Recreate the WoT. 
+ */
+void
+update_trustdb()
+{
+  init_trustdb();
+  if(opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC)
+    validate_keys (1);
+  else
+    log_info (_("no need for a trustdb update with `%s' trust model\n"),
+             trust_model_string());
+}
+
+void
+revalidation_mark (void)
+{
+  init_trustdb();
+  /* we simply set the time for the next check to 1 (far back in 1970)
+   * so that a --update-trustdb will be scheduled */
+  if (tdbio_write_nextcheck (1))
+      do_sync ();
+  pending_check_trustdb = 1;
+}
+
+int
+trustdb_pending_check(void)
+{
+  return pending_check_trustdb;
+}
+
+/* If the trustdb is dirty, and we're interactive, update it.
+   Otherwise, check it unless no-auto-check-trustdb is set. */
+void
+trustdb_check_or_update(void)
+{
+  if(trustdb_pending_check())
+    {
+      if(opt.interactive)
+       update_trustdb();
+      else if(!opt.no_auto_check_trustdb)
+       check_trustdb();
+    }
+}
+
+void
+read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck,
+                  byte *marginals,byte *completes,byte *cert_depth)
+{
+  TRUSTREC opts;
+
+  init_trustdb();
+
+  read_record(0,&opts,RECTYPE_VER);
+
+  if(trust_model)
+    *trust_model=opts.r.ver.trust_model;
+  if(created)
+    *created=opts.r.ver.created;
+  if(nextcheck)
+    *nextcheck=opts.r.ver.nextcheck;
+  if(marginals)
+    *marginals=opts.r.ver.marginals;
+  if(completes)
+    *completes=opts.r.ver.completes;
+  if(cert_depth)
+    *cert_depth=opts.r.ver.cert_depth;
+}
+
+/***********************************************
+ ***********  Ownertrust et al. ****************
+ ***********************************************/
+
+static int 
+read_trust_record (PKT_public_key *pk, TRUSTREC *rec)
+{
+  int rc;
+  
+  init_trustdb();
+  rc = tdbio_search_trust_bypk (pk, rec);
+  if (rc == -1)
+    return -1; /* no record yet */
+  if (rc) 
+    {
+      log_error ("trustdb: searching trust record failed: %s\n",
+                 g10_errstr (rc));
+      return rc; 
+    }
+      
+  if (rec->rectype != RECTYPE_TRUST)
+    {
+      log_error ("trustdb: record %lu is not a trust record\n",
+                 rec->recnum);
+      return G10ERR_TRUSTDB; 
+    }      
+  
+  return 0;
+}
+
+/****************
+ * Return the assigned ownertrust value for the given public key.
+ * The key should be the primary key.
+ */
+unsigned int 
+get_ownertrust ( PKT_public_key *pk)
+{
+  TRUSTREC rec;
+  int rc;
+  
+  rc = read_trust_record (pk, &rec);
+  if (rc == -1)
+    return TRUST_UNKNOWN; /* no record yet */
+  if (rc) 
+    {
+      tdbio_invalid ();
+      return rc; /* actually never reached */
+    }
+
+  return rec.r.trust.ownertrust;
+}
+
+unsigned int 
+get_min_ownertrust (PKT_public_key *pk)
+{
+  TRUSTREC rec;
+  int rc;
+  
+  rc = read_trust_record (pk, &rec);
+  if (rc == -1)
+    return TRUST_UNKNOWN; /* no record yet */
+  if (rc) 
+    {
+      tdbio_invalid ();
+      return rc; /* actually never reached */
+    }
+
+  return rec.r.trust.min_ownertrust;
+}
+
+/*
+ * Same as get_ownertrust but this takes the minimum ownertrust value
+ * into into account, and will bump up the value as needed.
+ */
+static int
+get_ownertrust_with_min (PKT_public_key *pk)
+{
+  unsigned int otrust,otrust_min;
+
+  otrust = (get_ownertrust (pk) & TRUST_MASK);
+  otrust_min = get_min_ownertrust (pk);
+  if(otrust<otrust_min)
+    {
+      /* If the trust that the user has set is less than the trust
+        that was calculated from a trust signature chain, use the
+        higher of the two.  We do this here and not in
+        get_ownertrust since the underlying ownertrust should not
+        really be set - just the appearance of the ownertrust. */
+
+      otrust=otrust_min;
+    }
+
+  return otrust;
+}
+
+/*
+ * Same as get_ownertrust but return a trust letter instead of an
+ * value.  This takes the minimum ownertrust value into account.
+ */
+int
+get_ownertrust_info (PKT_public_key *pk)
+{
+  return trust_letter(get_ownertrust_with_min(pk));
+}
+
+/*
+ * Same as get_ownertrust but return a trust string instead of an
+ * value.  This takes the minimum ownertrust value into account.
+ */
+const char *
+get_ownertrust_string (PKT_public_key *pk)
+{
+  return trust_value_to_string(get_ownertrust_with_min(pk));
+}
+
+/*
+ * Set the trust value of the given public key to the new value.
+ * The key should be a primary one.
+ */
+void
+update_ownertrust (PKT_public_key *pk, unsigned int new_trust )
+{
+  TRUSTREC rec;
+  int rc;
+  
+  rc = read_trust_record (pk, &rec);
+  if (!rc)
+    {
+      if (DBG_TRUST)
+        log_debug ("update ownertrust from %u to %u\n",
+                   (unsigned int)rec.r.trust.ownertrust, new_trust );
+      if (rec.r.trust.ownertrust != new_trust)
+        {
+          rec.r.trust.ownertrust = new_trust;
+          write_record( &rec );
+          revalidation_mark ();
+          do_sync ();
+        }
+    }
+  else if (rc == -1)
+    { /* no record yet - create a new one */
+      size_t dummy;
+
+      if (DBG_TRUST)
+        log_debug ("insert ownertrust %u\n", new_trust );
+
+      memset (&rec, 0, sizeof rec);
+      rec.recnum = tdbio_new_recnum ();
+      rec.rectype = RECTYPE_TRUST;
+      fingerprint_from_pk (pk, rec.r.trust.fingerprint, &dummy);
+      rec.r.trust.ownertrust = new_trust;
+      write_record (&rec);
+      revalidation_mark ();
+      do_sync ();
+      rc = 0;
+    }
+  else 
+    {
+      tdbio_invalid ();
+    }
+}
+
+static void
+update_min_ownertrust (u32 *kid, unsigned int new_trust )
+{
+  PKT_public_key *pk;
+  TRUSTREC rec;
+  int rc;
+
+  pk = xmalloc_clear (sizeof *pk);
+  rc = get_pubkey (pk, kid);
+  if (rc)
+    {
+      log_error(_("public key %s not found: %s\n"),keystr(kid),g10_errstr(rc));
+      return;
+    }
+
+  rc = read_trust_record (pk, &rec);
+  if (!rc)
+    {
+      if (DBG_TRUST)
+        log_debug ("key %08lX%08lX: update min_ownertrust from %u to %u\n",
+                   (ulong)kid[0],(ulong)kid[1],
+                  (unsigned int)rec.r.trust.min_ownertrust,
+                  new_trust );
+      if (rec.r.trust.min_ownertrust != new_trust)
+        {
+          rec.r.trust.min_ownertrust = new_trust;
+          write_record( &rec );
+          revalidation_mark ();
+          do_sync ();
+        }
+    }
+  else if (rc == -1)
+    { /* no record yet - create a new one */
+      size_t dummy;
+
+      if (DBG_TRUST)
+        log_debug ("insert min_ownertrust %u\n", new_trust );
+
+      memset (&rec, 0, sizeof rec);
+      rec.recnum = tdbio_new_recnum ();
+      rec.rectype = RECTYPE_TRUST;
+      fingerprint_from_pk (pk, rec.r.trust.fingerprint, &dummy);
+      rec.r.trust.min_ownertrust = new_trust;
+      write_record (&rec);
+      revalidation_mark ();
+      do_sync ();
+      rc = 0;
+    }
+  else 
+    {
+      tdbio_invalid ();
+    }
+}
+
+/* Clear the ownertrust and min_ownertrust values.  Return true if a
+   change actually happened. */
+int
+clear_ownertrusts (PKT_public_key *pk)
+{
+  TRUSTREC rec;
+  int rc;
+  
+  rc = read_trust_record (pk, &rec);
+  if (!rc)
+    {
+      if (DBG_TRUST)
+       {
+         log_debug ("clearing ownertrust (old value %u)\n",
+                    (unsigned int)rec.r.trust.ownertrust);
+         log_debug ("clearing min_ownertrust (old value %u)\n",
+                    (unsigned int)rec.r.trust.min_ownertrust);
+       }
+      if (rec.r.trust.ownertrust || rec.r.trust.min_ownertrust)
+        {
+          rec.r.trust.ownertrust = 0;
+          rec.r.trust.min_ownertrust = 0;
+          write_record( &rec );
+          revalidation_mark ();
+          do_sync ();
+          return 1;
+        }
+    }
+  else if (rc != -1)
+    {
+      tdbio_invalid ();
+    }
+  return 0;
+}
+
+/* 
+ * Note: Caller has to do a sync 
+ */
+static void
+update_validity (PKT_public_key *pk, PKT_user_id *uid,
+                 int depth, int validity)
+{
+  TRUSTREC trec, vrec;
+  int rc;
+  ulong recno;
+
+  namehash_from_uid(uid);
+
+  rc = read_trust_record (pk, &trec);
+  if (rc && rc != -1)
+    {
+      tdbio_invalid ();
+      return;
+    }
+  if (rc == -1) /* no record yet - create a new one */
+    { 
+      size_t dummy;
+
+      rc = 0;
+      memset (&trec, 0, sizeof trec);
+      trec.recnum = tdbio_new_recnum ();
+      trec.rectype = RECTYPE_TRUST;
+      fingerprint_from_pk (pk, trec.r.trust.fingerprint, &dummy);
+      trec.r.trust.ownertrust = 0;
+      }
+
+  /* locate an existing one */
+  recno = trec.r.trust.validlist;
+  while (recno)
+    {
+      read_record (recno, &vrec, RECTYPE_VALID);
+      if ( !memcmp (vrec.r.valid.namehash, uid->namehash, 20) )
+        break;
+      recno = vrec.r.valid.next;
+    }
+
+  if (!recno) /* insert a new validity record */
+    {
+      memset (&vrec, 0, sizeof vrec);
+      vrec.recnum = tdbio_new_recnum ();
+      vrec.rectype = RECTYPE_VALID;
+      memcpy (vrec.r.valid.namehash, uid->namehash, 20);
+      vrec.r.valid.next = trec.r.trust.validlist;
+      trec.r.trust.validlist = vrec.recnum;
+    }
+  vrec.r.valid.validity = validity;
+  vrec.r.valid.full_count = uid->help_full_count;
+  vrec.r.valid.marginal_count = uid->help_marginal_count;
+  write_record (&vrec);
+  trec.r.trust.depth = depth;
+  write_record (&trec);
+}
+
+
+/***********************************************
+ *********  Query trustdb values  **************
+ ***********************************************/
+
+/* Return true if key is disabled */
+int
+cache_disabled_value(PKT_public_key *pk)
+{
+  int rc;
+  TRUSTREC trec;
+  int disabled=0;
+
+  if(pk->is_disabled)
+    return (pk->is_disabled==2);
+
+  init_trustdb();
+
+  rc = read_trust_record (pk, &trec);
+  if (rc && rc != -1)
+    {
+      tdbio_invalid ();
+      goto leave;
+    }
+  if (rc == -1) /* no record found, so assume not disabled */
+    goto leave;
+  if(trec.r.trust.ownertrust & TRUST_FLAG_DISABLED)
+    disabled=1;
+  /* Cache it for later so we don't need to look at the trustdb every
+     time */
+  if(disabled)
+    pk->is_disabled=2;
+  else
+    pk->is_disabled=1;
+
+ leave:
+   return disabled;
+}
+
+void
+check_trustdb_stale(void)
+{
+  static int did_nextcheck=0;
+
+  init_trustdb ();
+  if (!did_nextcheck
+      && (opt.trust_model==TM_PGP || opt.trust_model==TM_CLASSIC))
+    {
+      ulong scheduled;
+
+      did_nextcheck = 1;
+      scheduled = tdbio_read_nextcheck ();
+      if (scheduled && scheduled <= make_timestamp ())
+        {
+          if (opt.no_auto_check_trustdb) 
+            {
+              pending_check_trustdb = 1;
+              log_info (_("please do a --check-trustdb\n"));
+            }
+          else
+            {
+              log_info (_("checking the trustdb\n"));
+              validate_keys (0);
+            }
+        }
+    }
+}
+
+/*
+ * Return the validity information for PK.  If the namehash is not
+ * NULL, the validity of the corresponsing user ID is returned,
+ * otherwise, a reasonable value for the entire key is returned. 
+ */
+unsigned int
+get_validity (PKT_public_key *pk, PKT_user_id *uid)
+{
+  TRUSTREC trec, vrec;
+  int rc;
+  ulong recno;
+  unsigned int validity;
+  u32 kid[2];
+  PKT_public_key *main_pk;
+
+  if(uid)
+    namehash_from_uid(uid);
+
+  init_trustdb ();
+  check_trustdb_stale();
+
+  keyid_from_pk (pk, kid);
+  if (pk->main_keyid[0] != kid[0] || pk->main_keyid[1] != kid[1])
+    { /* this is a subkey - get the mainkey */
+      main_pk = xmalloc_clear (sizeof *main_pk);
+      rc = get_pubkey (main_pk, pk->main_keyid);
+      if (rc)
+        {
+         char *tempkeystr=xstrdup(keystr(pk->main_keyid));
+          log_error ("error getting main key %s of subkey %s: %s\n",
+                     tempkeystr, keystr(kid), g10_errstr(rc));
+         xfree(tempkeystr);
+          validity = TRUST_UNKNOWN; 
+          goto leave;
+       }
+    }
+  else
+    main_pk = pk;
+
+  if(opt.trust_model==TM_DIRECT)
+    {
+      /* Note that this happens BEFORE any user ID stuff is checked.
+        The direct trust model applies to keys as a whole. */
+      validity=get_ownertrust(main_pk);
+      goto leave;
+    }
+
+  rc = read_trust_record (main_pk, &trec);
+  if (rc && rc != -1)
+    {
+      tdbio_invalid ();
+      return 0;
+    }
+  if (rc == -1) /* no record found */
+    {
+      validity = TRUST_UNKNOWN; 
+      goto leave;
+    }
+
+  /* loop over all user IDs */
+  recno = trec.r.trust.validlist;
+  validity = 0;
+  while (recno)
+    {
+      read_record (recno, &vrec, RECTYPE_VALID);
+
+      if(uid)
+       {
+         /* If a user ID is given we return the validity for that
+            user ID ONLY.  If the namehash is not found, then there
+            is no validity at all (i.e. the user ID wasn't
+            signed). */
+         if(memcmp(vrec.r.valid.namehash,uid->namehash,20)==0)
+           {
+             validity=(vrec.r.valid.validity & TRUST_MASK);
+             break;
+           }
+       }
+      else
+       {
+         /* If no namehash is given, we take the maximum validity
+            over all user IDs */
+         if ( validity < (vrec.r.valid.validity & TRUST_MASK) )
+           validity = (vrec.r.valid.validity & TRUST_MASK);
+       }
+
+      recno = vrec.r.valid.next;
+    }
+  
+  if ( (trec.r.trust.ownertrust & TRUST_FLAG_DISABLED) )
+    {
+      validity |= TRUST_FLAG_DISABLED;
+      pk->is_disabled=2;
+    }
+  else
+    pk->is_disabled=1;
+
+ leave:
+  /* set some flags direct from the key */
+  if (main_pk->is_revoked)
+    validity |= TRUST_FLAG_REVOKED;
+  if (main_pk != pk && pk->is_revoked)
+    validity |= TRUST_FLAG_SUB_REVOKED;
+  /* Note: expiration is a trust value and not a flag - don't know why
+   * I initially designed it that way */
+  if (main_pk->has_expired || pk->has_expired)
+    validity = (validity & ~TRUST_MASK) | TRUST_EXPIRED;
+  
+  if (pending_check_trustdb)
+    validity |= TRUST_FLAG_PENDING_CHECK;
+
+  if (main_pk != pk)
+    free_public_key (main_pk);
+  return validity;
+}
+
+int
+get_validity_info (PKT_public_key *pk, PKT_user_id *uid)
+{
+    int trustlevel;
+
+    trustlevel = get_validity (pk, uid);
+    if( trustlevel & TRUST_FLAG_REVOKED )
+       return 'r';
+    return trust_letter ( trustlevel );
+}
+
+const char *
+get_validity_string (PKT_public_key *pk, PKT_user_id *uid)
+{
+  int trustlevel;
+
+  trustlevel = get_validity (pk, uid);
+  if( trustlevel & TRUST_FLAG_REVOKED )
+    return _("revoked");
+  return trust_value_to_string(trustlevel);
+}
+
+static void
+get_validity_counts (PKT_public_key *pk, PKT_user_id *uid)
+{
+  TRUSTREC trec, vrec;
+  ulong recno;
+
+  if(pk==NULL || uid==NULL)
+    BUG();
+
+  namehash_from_uid(uid);
+
+  uid->help_marginal_count=uid->help_full_count=0;
+
+  init_trustdb ();
+
+  if(read_trust_record (pk, &trec)!=0)
+    return;
+
+  /* loop over all user IDs */
+  recno = trec.r.trust.validlist;
+  while (recno)
+    {
+      read_record (recno, &vrec, RECTYPE_VALID);
+
+      if(memcmp(vrec.r.valid.namehash,uid->namehash,20)==0)
+       {
+         uid->help_marginal_count=vrec.r.valid.marginal_count;
+         uid->help_full_count=vrec.r.valid.full_count;
+         /*  printf("Fetched marginal %d, full %d\n",uid->help_marginal_count,uid->help_full_count); */
+         break;
+       }
+
+      recno = vrec.r.valid.next;
+    }
+}
+
+void
+list_trust_path( const char *username )
+{
+}
+
+/****************
+ * Enumerate all keys, which are needed to build all trust paths for
+ * the given key.  This function does not return the key itself or
+ * the ultimate key (the last point in cerificate chain).  Only
+ * certificate chains which ends up at an ultimately trusted key
+ * are listed. If ownertrust or validity is not NULL, the corresponding
+ * value for the returned LID is also returned in these variable(s).
+ *
+ *  1) create a void pointer and initialize it to NULL
+ *  2) pass this void pointer by reference to this function.
+ *     Set lid to the key you want to enumerate and pass it by reference.
+ *  3) call this function as long as it does not return -1
+ *     to indicate EOF. LID does contain the next key used to build the web
+ *  4) Always call this function a last time with LID set to NULL,
+ *     so that it can free its context.
+ *
+ * Returns: -1 on EOF or the level of the returned LID
+ */
+int
+enum_cert_paths( void **context, ulong *lid,
+                unsigned *ownertrust, unsigned *validity )
+{
+    return -1;
+}
+
+
+/****************
+ * Print the current path
+ */
+void
+enum_cert_paths_print( void **context, FILE *fp,
+                                      int refresh, ulong selected_lid )
+{
+    return;
+}
+
+
+\f
+/****************************************
+ *********** NEW NEW NEW ****************
+ ****************************************/
+
+static int
+ask_ownertrust (u32 *kid,int minimum)
+{
+  PKT_public_key *pk;
+  int rc;
+  int ot;
+
+  pk = xmalloc_clear (sizeof *pk);
+  rc = get_pubkey (pk, kid);
+  if (rc)
+    {
+      log_error (_("public key %s not found: %s\n"),
+                 keystr(kid), g10_errstr(rc) );
+      return TRUST_UNKNOWN;
+    }
+  if(opt.force_ownertrust)
+    {
+      log_info("force trust for key %s to %s\n",
+              keystr(kid),trust_value_to_string(opt.force_ownertrust));
+      update_ownertrust(pk,opt.force_ownertrust);
+      ot=opt.force_ownertrust;
+    }
+  else
+    {
+      ot=edit_ownertrust(pk,0);
+      if(ot>0)
+       ot = get_ownertrust (pk);
+      else if(ot==0)
+       ot = minimum?minimum:TRUST_UNDEFINED;
+      else
+       ot = -1; /* quit */
+    }
+
+  free_public_key( pk );
+
+  return ot;
+}
+
+
+static void
+mark_keyblock_seen (KeyHashTable tbl, KBNODE node)
+{
+  for ( ;node; node = node->next )
+    if (node->pkt->pkttype == PKT_PUBLIC_KEY
+       || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+      {
+        u32 aki[2];
+
+        keyid_from_pk (node->pkt->pkt.public_key, aki);
+        add_key_hash_table (tbl, aki);
+      }
+}
+
+
+static void
+dump_key_array (int depth, struct key_array *keys)
+{
+  struct key_array *kar;
+
+  for (kar=keys; kar->keyblock; kar++)
+    {
+      KBNODE node = kar->keyblock;
+      u32 kid[2];
+
+      keyid_from_pk(node->pkt->pkt.public_key, kid);
+      printf ("%d:%08lX%08lX:K::%c::::\n",
+              depth, (ulong)kid[0], (ulong)kid[1], '?');
+
+      for (; node; node = node->next)
+        {
+          if (node->pkt->pkttype == PKT_USER_ID)
+            {
+              int len = node->pkt->pkt.user_id->len;
+
+              if (len > 30)
+                len = 30;
+              printf ("%d:%08lX%08lX:U:::%c:::",
+                      depth, (ulong)kid[0], (ulong)kid[1],
+                      (node->flag & 4)? 'f':
+                      (node->flag & 2)? 'm':
+                      (node->flag & 1)? 'q':'-');
+              print_string (stdout,  node->pkt->pkt.user_id->name, len, ':');
+              putchar (':');
+              putchar ('\n');
+            }
+        }
+    }
+}  
+
+
+static void
+store_validation_status (int depth, KBNODE keyblock, KeyHashTable stored)
+{
+  KBNODE node;
+  int status;
+  int any = 0;
+
+  for (node=keyblock; node; node = node->next)
+    {
+      if (node->pkt->pkttype == PKT_USER_ID)
+        {
+          PKT_user_id *uid = node->pkt->pkt.user_id;
+          if (node->flag & 4)
+            status = TRUST_FULLY;
+          else if (node->flag & 2)
+            status = TRUST_MARGINAL;
+          else if (node->flag & 1)
+            status = TRUST_UNDEFINED;
+          else
+            status = 0;
+          
+          if (status)
+            {
+              update_validity (keyblock->pkt->pkt.public_key,
+                              uid, depth, status);
+
+             mark_keyblock_seen(stored,keyblock);
+
+              any = 1;
+            }
+        }
+    }
+
+  if (any)
+    do_sync ();
+}  
+
+/*
+ * check whether the signature sig is in the klist k
+ */
+static struct key_item *
+is_in_klist (struct key_item *k, PKT_signature *sig)
+{
+  for (; k; k = k->next)
+    {
+      if (k->kid[0] == sig->keyid[0] && k->kid[1] == sig->keyid[1])
+        return k;
+    }
+  return NULL;
+}
+
+/*
+ * Mark the signature of the given UID which are used to certify it.
+ * To do this, we first revmove all signatures which are not valid and
+ * from the remain ones we look for the latest one.  If this is not a
+ * certification revocation signature we mark the signature by setting
+ * node flag bit 8.  Revocations are marked with flag 11, and sigs
+ * from unavailable keys are marked with flag 12.  Note that flag bits
+ * 9 and 10 are used for internal purposes.
+ */
+static void
+mark_usable_uid_certs (KBNODE keyblock, KBNODE uidnode,
+                       u32 *main_kid, struct key_item *klist,
+                       u32 curtime, u32 *next_expire)
+{
+  KBNODE node;
+  PKT_signature *sig;
+  
+  /* first check all signatures */
+  for (node=uidnode->next; node; node = node->next)
+    {
+      int rc;
+
+      node->flag &= ~(1<<8 | 1<<9 | 1<<10 | 1<<11 | 1<<12);
+      if (node->pkt->pkttype == PKT_USER_ID
+          || node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        break; /* ready */
+      if (node->pkt->pkttype != PKT_SIGNATURE)
+        continue;
+      sig = node->pkt->pkt.signature;
+      if (main_kid
+         && sig->keyid[0] == main_kid[0] && sig->keyid[1] == main_kid[1])
+        continue; /* ignore self-signatures if we pass in a main_kid */
+      if (!IS_UID_SIG(sig) && !IS_UID_REV(sig))
+        continue; /* we only look at these signature classes */
+      if(sig->sig_class>=0x11 && sig->sig_class<=0x13 &&
+        sig->sig_class-0x10<opt.min_cert_level)
+       continue; /* treat anything under our min_cert_level as an
+                    invalid signature */
+      if (klist && !is_in_klist (klist, sig))
+        continue;  /* no need to check it then */
+      if ((rc=check_key_signature (keyblock, node, NULL)))
+       {
+         /* we ignore anything that won't verify, but tag the
+            no_pubkey case */
+         if(rc==G10ERR_NO_PUBKEY)
+           node->flag |= 1<<12;
+         continue;
+       }
+      node->flag |= 1<<9;
+    }      
+  /* reset the remaining flags */
+  for (; node; node = node->next)
+      node->flag &= ~(1<<8 | 1<<9 | 1<<10 | 1<<11 | 1<<12);
+
+  /* kbnode flag usage: bit 9 is here set for signatures to consider,
+   * bit 10 will be set by the loop to keep track of keyIDs already
+   * processed, bit 8 will be set for the usable signatures, and bit
+   * 11 will be set for usable revocations. */
+
+  /* for each cert figure out the latest valid one */
+  for (node=uidnode->next; node; node = node->next)
+    {
+      KBNODE n, signode;
+      u32 kid[2];
+      u32 sigdate;
+
+      if (node->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+        break;
+      if ( !(node->flag & (1<<9)) )
+        continue; /* not a node to look at */
+      if ( (node->flag & (1<<10)) )
+        continue; /* signature with a keyID already processed */
+      node->flag |= (1<<10); /* mark this node as processed */
+      sig = node->pkt->pkt.signature;
+      signode = node;
+      sigdate = sig->timestamp;
+      kid[0] = sig->keyid[0]; kid[1] = sig->keyid[1];
+
+      /* Now find the latest and greatest signature */
+      for (n=uidnode->next; n; n = n->next)
+        {
+          if (n->pkt->pkttype == PKT_PUBLIC_SUBKEY)
+            break;
+          if ( !(n->flag & (1<<9)) )
+            continue;
+          if ( (n->flag & (1<<10)) )
+            continue; /* shortcut already processed signatures */
+          sig = n->pkt->pkt.signature;
+          if (kid[0] != sig->keyid[0] || kid[1] != sig->keyid[1])
+            continue;
+          n->flag |= (1<<10); /* mark this node as processed */
+
+         /* If signode is nonrevocable and unexpired and n isn't,
+             then take signode (skip).  It doesn't matter which is
+             older: if signode was older then we don't want to take n
+             as signode is nonrevocable.  If n was older then we're
+             automatically fine. */
+         
+         if(((IS_UID_SIG(signode->pkt->pkt.signature) &&
+              !signode->pkt->pkt.signature->flags.revocable &&
+              (signode->pkt->pkt.signature->expiredate==0 ||
+               signode->pkt->pkt.signature->expiredate>curtime))) &&
+            (!(IS_UID_SIG(n->pkt->pkt.signature) &&
+               !n->pkt->pkt.signature->flags.revocable &&
+               (n->pkt->pkt.signature->expiredate==0 ||
+                n->pkt->pkt.signature->expiredate>curtime))))
+           continue;
+
+         /* If n is nonrevocable and unexpired and signode isn't,
+             then take n.  Again, it doesn't matter which is older: if
+             n was older then we don't want to take signode as n is
+             nonrevocable.  If signode was older then we're
+             automatically fine. */
+         
+         if((!(IS_UID_SIG(signode->pkt->pkt.signature) &&
+               !signode->pkt->pkt.signature->flags.revocable &&
+               (signode->pkt->pkt.signature->expiredate==0 ||
+                signode->pkt->pkt.signature->expiredate>curtime))) &&
+            ((IS_UID_SIG(n->pkt->pkt.signature) &&
+              !n->pkt->pkt.signature->flags.revocable &&
+              (n->pkt->pkt.signature->expiredate==0 ||
+               n->pkt->pkt.signature->expiredate>curtime))))
+            {
+              signode = n;
+              sigdate = sig->timestamp;
+             continue;
+            }
+
+         /* At this point, if it's newer, it goes in as the only
+             remaining possibilities are signode and n are both either
+             revocable or expired or both nonrevocable and unexpired.
+             If the timestamps are equal take the later ordered
+             packet, presuming that the key packets are hopefully in
+             their original order. */
+
+          if (sig->timestamp >= sigdate)
+            {
+              signode = n;
+              sigdate = sig->timestamp;
+            }
+        }
+
+      sig = signode->pkt->pkt.signature;
+      if (IS_UID_SIG (sig))
+        { /* this seems to be a usable one which is not revoked. 
+           * Just need to check whether there is an expiration time,
+           * We do the expired certification after finding a suitable
+           * certification, the assumption is that a signator does not
+           * want that after the expiration of his certificate the
+           * system falls back to an older certification which has a
+           * different expiration time */
+          const byte *p;
+          u32 expire;
+                    
+          p = parse_sig_subpkt (sig->hashed, SIGSUBPKT_SIG_EXPIRE, NULL );
+          expire = p? sig->timestamp + buffer_to_u32(p) : 0;
+
+          if (expire==0 || expire > curtime )
+            {
+              signode->flag |= (1<<8); /* yeah, found a good cert */
+              if (next_expire && expire && expire < *next_expire)
+                *next_expire = expire;
+            }
+        }
+      else
+       signode->flag |= (1<<11);
+    }
+}
+
+static int
+clean_sigs_from_uid(KBNODE keyblock,KBNODE uidnode,int noisy,int self_only)
+{
+  int deleted=0;
+  KBNODE node;
+  u32 keyid[2];
+
+  assert(keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+
+  keyid_from_pk(keyblock->pkt->pkt.public_key,keyid);
+
+  /* Passing in a 0 for current time here means that we'll never weed
+     out an expired sig.  This is correct behavior since we want to
+     keep the most recent expired sig in a series. */
+  mark_usable_uid_certs(keyblock,uidnode,NULL,NULL,0,NULL);
+
+  /* What we want to do here is remove signatures that are not
+     considered as part of the trust calculations.  Thus, all invalid
+     signatures are out, as are any signatures that aren't the last of
+     a series of uid sigs or revocations It breaks down like this:
+     coming out of mark_usable_uid_certs, if a sig is unflagged, it is
+     not even a candidate.  If a sig has flag 9 or 10, that means it
+     was selected as a candidate and vetted.  If a sig has flag 8 it
+     is a usable signature.  If a sig has flag 11 it is a usable
+     revocation.  If a sig has flag 12 it was issued by an unavailable
+     key.  "Usable" here means the most recent valid
+     signature/revocation in a series from a particular signer.
+
+     Delete everything that isn't a usable uid sig (which might be
+     expired), a usable revocation, or a sig from an unavailable
+     key. */
+
+  for(node=uidnode->next;
+      node && node->pkt->pkttype==PKT_SIGNATURE;
+      node=node->next)
+    {
+      int keep=self_only?(node->pkt->pkt.signature->keyid[0]==keyid[0]
+                         && node->pkt->pkt.signature->keyid[1]==keyid[1]):1;
+
+      /* Keep usable uid sigs ... */
+      if((node->flag & (1<<8)) && keep)
+       continue;
+
+      /* ... and usable revocations... */
+      if((node->flag & (1<<11)) && keep)
+       continue;
+
+      /* ... and sigs from unavailable keys. */
+      /* disabled for now since more people seem to want sigs from
+        unavailable keys removed altogether.  */
+      /*
+       if(node->flag & (1<<12))
+       continue;
+      */
+
+      /* Everything else we delete */
+
+      /* At this point, if 12 is set, the signing key was unavailable.
+        If 9 or 10 is set, it's superceded.  Otherwise, it's
+        invalid. */
+
+      if(noisy)
+       log_info("removing signature from key %s on user ID \"%s\": %s\n",
+                keystr(node->pkt->pkt.signature->keyid),
+                uidnode->pkt->pkt.user_id->name,
+                node->flag&(1<<12)?"key unavailable":
+                node->flag&(1<<9)?"signature superceded":"invalid signature");
+
+      delete_kbnode(node);
+      deleted++;
+    }
+    
+  return deleted;
+}
+
+/* This is substantially easier than clean_sigs_from_uid since we just
+   have to establish if the uid has a valid self-sig, is not revoked,
+   and is not expired.  Note that this does not take into account
+   whether the uid has a trust path to it - just whether the keyholder
+   themselves has certified the uid.  Returns true if the uid was
+   compacted.  To "compact" a user ID, we simply remove ALL signatures
+   except the self-sig that caused the user ID to be remove-worthy.
+   We don't actually remove the user ID packet itself since it might
+   be ressurected in a later merge.  Note that this function requires
+   that the caller has already done a merge_keys_and_selfsig().
+
+   TODO: change the import code to allow importing a uid with only a
+   revocation if the uid already exists on the keyring. */
+
+static int
+clean_uid_from_key(KBNODE keyblock,KBNODE uidnode,int noisy)
+{
+  KBNODE node;
+  PKT_user_id *uid=uidnode->pkt->pkt.user_id;
+  int deleted=0;
+
+  assert(keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+  assert(uidnode->pkt->pkttype==PKT_USER_ID);
+
+  /* Skip valid user IDs, compacted user IDs, and non-self-signed user
+     IDs if --allow-non-selfsigned-uid is set. */
+  if(uid->created || uid->flags.compacted
+     || (!uid->is_expired && !uid->is_revoked
+        && opt.allow_non_selfsigned_uid))
+    return 0;
+
+  for(node=uidnode->next;
+      node && node->pkt->pkttype==PKT_SIGNATURE;
+      node=node->next)
+    if(!node->pkt->pkt.signature->flags.chosen_selfsig)
+      {
+       delete_kbnode(node);
+       deleted=1;
+       uidnode->pkt->pkt.user_id->flags.compacted=1;
+      }
+
+  if(noisy)
+    {
+      const char *reason;
+      char *user=utf8_to_native(uid->name,uid->len,0);
+
+      if(uid->is_revoked)
+       reason=_("revoked");
+      else if(uid->is_expired)
+       reason=_("expired");
+      else
+       reason=_("invalid");
+
+      log_info("compacting user ID \"%s\" on key %s: %s\n",
+              user,keystr_from_pk(keyblock->pkt->pkt.public_key),
+              reason);
+
+      xfree(user);
+    }
+
+  return deleted;
+}
+
+/* Needs to be called after a merge_keys_and_selfsig() */
+void
+clean_one_uid(KBNODE keyblock,KBNODE uidnode,int noisy,int self_only,
+             int *uids_cleaned,int *sigs_cleaned)
+{
+  int dummy;
+
+  assert(keyblock->pkt->pkttype==PKT_PUBLIC_KEY);
+  assert(uidnode->pkt->pkttype==PKT_USER_ID);
+
+  if(!uids_cleaned)
+    uids_cleaned=&dummy;
+
+  if(!sigs_cleaned)
+    sigs_cleaned=&dummy;
+
+  /* Do clean_uid_from_key first since if it fires off, we don't
+     have to bother with the other */
+  *uids_cleaned+=clean_uid_from_key(keyblock,uidnode,noisy);
+  if(!uidnode->pkt->pkt.user_id->flags.compacted)
+    *sigs_cleaned+=clean_sigs_from_uid(keyblock,uidnode,noisy,self_only);
+}
+
+void
+clean_key(KBNODE keyblock,int noisy,int self_only,
+         int *uids_cleaned,int *sigs_cleaned)
+{
+  KBNODE uidnode;
+
+  merge_keys_and_selfsig(keyblock);
+
+  for(uidnode=keyblock->next;
+      uidnode && uidnode->pkt->pkttype!=PKT_PUBLIC_SUBKEY;
+      uidnode=uidnode->next)
+    if(uidnode->pkt->pkttype==PKT_USER_ID)
+      clean_one_uid(keyblock,uidnode,noisy,self_only,
+                   uids_cleaned,sigs_cleaned);
+}
+
+/* Used by validate_one_keyblock to confirm a regexp within a trust
+   signature.  Returns 1 for match, and 0 for no match or regex
+   error. */
+static int
+check_regexp(const char *expr,const char *string)
+{
+#ifdef DISABLE_REGEX
+  /* When DISABLE_REGEX is defined, assume all regexps do not
+     match. */
+  return 0;
+#elif defined(__riscos__)
+  return riscos_check_regexp(expr, string, DBG_TRUST);
+#else
+  int ret;
+  regex_t pat;
+
+  if(regcomp(&pat,expr,REG_ICASE|REG_NOSUB|REG_EXTENDED)!=0)
+    return 0;
+
+  ret=regexec(&pat,string,0,NULL,0);
+
+  regfree(&pat);
+
+  if(DBG_TRUST)
+    log_debug("regexp `%s' on `%s': %s\n",expr,string,ret==0?"YES":"NO");
+
+  return (ret==0);
+#endif
+}
+
+/*
+ * Return true if the key is signed by one of the keys in the given
+ * key ID list.  User IDs with a valid signature are marked by node
+ * flags as follows:
+ *  flag bit 0: There is at least one signature
+ *           1: There is marginal confidence that this is a legitimate uid
+ *           2: There is full confidence that this is a legitimate uid.
+ *           8: Used for internal purposes.
+ *           9: Ditto (in mark_usable_uid_certs())
+ *          10: Ditto (ditto)
+ * This function assumes that all kbnode flags are cleared on entry.
+ */
+static int
+validate_one_keyblock (KBNODE kb, struct key_item *klist,
+                       u32 curtime, u32 *next_expire)
+{
+  struct key_item *kr;
+  KBNODE node, uidnode=NULL;
+  PKT_user_id *uid=NULL;
+  PKT_public_key *pk = kb->pkt->pkt.public_key;
+  u32 main_kid[2];
+  int issigned=0, any_signed = 0;
+
+  keyid_from_pk(pk, main_kid);
+  for (node=kb; node; node = node->next)
+    {
+      /* A bit of discussion here: is it better for the web of trust
+        to be built among only self-signed uids?  On the one hand, a
+        self-signed uid is a statement that the key owner definitely
+        intended that uid to be there, but on the other hand, a
+        signed (but not self-signed) uid does carry trust, of a sort,
+        even if it is a statement being made by people other than the
+        key owner "through" the uids on the key owner's key.  I'm
+        going with the latter.  However, if the user ID was
+        explicitly revoked, or passively allowed to expire, that
+        should stop validity through the user ID until it is
+        resigned.  -dshaw */
+
+      if (node->pkt->pkttype == PKT_USER_ID
+         && !node->pkt->pkt.user_id->is_revoked
+         && !node->pkt->pkt.user_id->is_expired)
+        {
+          if (uidnode && issigned)
+            {
+              if (uid->help_full_count >= opt.completes_needed
+                  || uid->help_marginal_count >= opt.marginals_needed )
+                uidnode->flag |= 4; 
+              else if (uid->help_full_count || uid->help_marginal_count)
+                uidnode->flag |= 2;
+              uidnode->flag |= 1;
+              any_signed = 1;
+            }
+          uidnode = node;
+         uid=uidnode->pkt->pkt.user_id;
+
+         /* If the selfsig is going to expire... */
+         if(uid->expiredate && uid->expiredate<*next_expire)
+           *next_expire = uid->expiredate;
+
+          issigned = 0;
+         get_validity_counts(pk,uid);
+          mark_usable_uid_certs (kb, uidnode, main_kid, klist, 
+                                 curtime, next_expire);
+        }
+      else if (node->pkt->pkttype == PKT_SIGNATURE
+              && (node->flag & (1<<8)) && uid)
+        {
+         /* Note that we are only seeing unrevoked sigs here */
+          PKT_signature *sig = node->pkt->pkt.signature;
+          
+          kr = is_in_klist (klist, sig);
+         /* If the trust_regexp does not match, it's as if the sig
+             did not exist.  This is safe for non-trust sigs as well
+             since we don't accept a regexp on the sig unless it's a
+             trust sig. */
+          if (kr && (kr->trust_regexp==NULL || opt.trust_model!=TM_PGP ||
+                    (uidnode && check_regexp(kr->trust_regexp,
+                                           uidnode->pkt->pkt.user_id->name))))
+            {
+             if(DBG_TRUST && opt.trust_model==TM_PGP && sig->trust_depth)
+               log_debug("trust sig on %s, sig depth is %d, kr depth is %d\n",
+                         uidnode->pkt->pkt.user_id->name,sig->trust_depth,
+                         kr->trust_depth);
+
+             /* Are we part of a trust sig chain?  We always favor
+                 the latest trust sig, rather than the greater or
+                 lesser trust sig or value.  I could make a decent
+                 argument for any of these cases, but this seems to be
+                 what PGP does, and I'd like to be compatible. -dms */
+             if(opt.trust_model==TM_PGP && sig->trust_depth
+                && pk->trust_timestamp<=sig->timestamp
+                && (sig->trust_depth<=kr->trust_depth
+                    || kr->ownertrust==TRUST_ULTIMATE))
+               {
+                 /* If we got here, we know that:
+
+                    this is a trust sig.
+
+                    it's a newer trust sig than any previous trust
+                    sig on this key (not uid).
+
+                    it is legal in that it was either generated by an
+                    ultimate key, or a key that was part of a trust
+                    chain, and the depth does not violate the
+                    original trust sig.
+
+                    if there is a regexp attached, it matched
+                    successfully.
+                 */
+
+                 if(DBG_TRUST)
+                   log_debug("replacing trust value %d with %d and "
+                             "depth %d with %d\n",
+                             pk->trust_value,sig->trust_value,
+                             pk->trust_depth,sig->trust_depth);
+
+                 pk->trust_value=sig->trust_value;
+                 pk->trust_depth=sig->trust_depth-1;
+
+                 /* If the trust sig contains a regexp, record it
+                    on the pk for the next round. */
+                 if(sig->trust_regexp)
+                   pk->trust_regexp=sig->trust_regexp;
+               }
+
+              if (kr->ownertrust == TRUST_ULTIMATE)
+                uid->help_full_count = opt.completes_needed;
+              else if (kr->ownertrust == TRUST_FULLY)
+                uid->help_full_count++;
+              else if (kr->ownertrust == TRUST_MARGINAL)
+                uid->help_marginal_count++;
+              issigned = 1;
+           }
+        }
+    }
+
+  if (uidnode && issigned)
+    {
+      if (uid->help_full_count >= opt.completes_needed
+         || uid->help_marginal_count >= opt.marginals_needed )
+        uidnode->flag |= 4; 
+      else if (uid->help_full_count || uid->help_marginal_count)
+        uidnode->flag |= 2;
+      uidnode->flag |= 1;
+      any_signed = 1;
+    }
+
+  return any_signed;
+}
+
+
+static int
+search_skipfnc (void *opaque, u32 *kid, PKT_user_id *dummy)
+{
+  return test_key_hash_table ((KeyHashTable)opaque, kid);
+}
+
+
+/*
+ * Scan all keys and return a key_array of all suitable keys from
+ * kllist.  The caller has to pass keydb handle so that we don't use
+ * to create our own.  Returns either a key_array or NULL in case of
+ * an error.  No results found are indicated by an empty array.
+ * Caller hast to release the returned array.  
+ */
+static struct key_array *
+validate_key_list (KEYDB_HANDLE hd, KeyHashTable full_trust,
+                   struct key_item *klist, u32 curtime, u32 *next_expire)
+{
+  KBNODE keyblock = NULL;
+  struct key_array *keys = NULL;
+  size_t nkeys, maxkeys;
+  int rc;
+  KEYDB_SEARCH_DESC desc;
+  
+  maxkeys = 1000;
+  keys = xmalloc ((maxkeys+1) * sizeof *keys);
+  nkeys = 0;
+  
+  rc = keydb_search_reset (hd);
+  if (rc)
+    {
+      log_error ("keydb_search_reset failed: %s\n", g10_errstr(rc));
+      xfree (keys);
+      return NULL;
+    }
+
+  memset (&desc, 0, sizeof desc);
+  desc.mode = KEYDB_SEARCH_MODE_FIRST;
+  desc.skipfnc = search_skipfnc;
+  desc.skipfncvalue = full_trust;
+  rc = keydb_search (hd, &desc, 1);
+  if (rc == -1)
+    {
+      keys[nkeys].keyblock = NULL;
+      return keys;
+    }
+  if (rc)
+    {
+      log_error ("keydb_search_first failed: %s\n", g10_errstr(rc));
+      xfree (keys);
+      return NULL;
+    }
+  
+  desc.mode = KEYDB_SEARCH_MODE_NEXT; /* change mode */
+  do
+    {
+      PKT_public_key *pk;
+        
+      rc = keydb_get_keyblock (hd, &keyblock);
+      if (rc) 
+        {
+          log_error ("keydb_get_keyblock failed: %s\n", g10_errstr(rc));
+          xfree (keys);
+          return NULL;
+        }
+      
+      if ( keyblock->pkt->pkttype != PKT_PUBLIC_KEY) 
+        {
+          log_debug ("ooops: invalid pkttype %d encountered\n",
+                     keyblock->pkt->pkttype);
+          dump_kbnode (keyblock);
+          release_kbnode(keyblock);
+          continue;
+        }
+
+      /* prepare the keyblock for further processing */
+      merge_keys_and_selfsig (keyblock); 
+      clear_kbnode_flags (keyblock);
+      pk = keyblock->pkt->pkt.public_key;
+      if (pk->has_expired || pk->is_revoked)
+        {
+          /* it does not make sense to look further at those keys */
+          mark_keyblock_seen (full_trust, keyblock);
+        }
+      else if (validate_one_keyblock (keyblock, klist, curtime, next_expire))
+        {
+         KBNODE node;
+
+          if (pk->expiredate && pk->expiredate >= curtime
+              && pk->expiredate < *next_expire)
+            *next_expire = pk->expiredate;
+
+          if (nkeys == maxkeys) {
+            maxkeys += 1000;
+            keys = xrealloc (keys, (maxkeys+1) * sizeof *keys);
+          }
+          keys[nkeys++].keyblock = keyblock;
+
+         /* Optimization - if all uids are fully trusted, then we
+            never need to consider this key as a candidate again. */
+
+         for (node=keyblock; node; node = node->next)
+           if (node->pkt->pkttype == PKT_USER_ID && !(node->flag & 4))
+             break;
+
+         if(node==NULL)
+           mark_keyblock_seen (full_trust, keyblock);
+
+          keyblock = NULL;
+        }
+
+      release_kbnode (keyblock);
+      keyblock = NULL;
+    } 
+  while ( !(rc = keydb_search (hd, &desc, 1)) );
+  if (rc && rc != -1) 
+    {
+      log_error ("keydb_search_next failed: %s\n", g10_errstr(rc));
+      xfree (keys);
+      return NULL;
+    }
+
+  keys[nkeys].keyblock = NULL;
+  return keys;
+} 
+
+/* Caller must sync */
+static void
+reset_trust_records(void)
+{
+  TRUSTREC rec;
+  ulong recnum;
+  int count = 0, nreset = 0;
+
+  for (recnum=1; !tdbio_read_record (recnum, &rec, 0); recnum++ ) 
+    {
+      if(rec.rectype==RECTYPE_TRUST)
+       {
+         count++;
+         if(rec.r.trust.min_ownertrust)
+           {
+             rec.r.trust.min_ownertrust=0;
+             write_record(&rec);
+           }
+
+       }
+      else if(rec.rectype==RECTYPE_VALID
+             && ((rec.r.valid.validity&TRUST_MASK)
+                 || rec.r.valid.marginal_count
+                 || rec.r.valid.full_count))
+       {
+         rec.r.valid.validity &= ~TRUST_MASK;
+         rec.r.valid.marginal_count=rec.r.valid.full_count=0;
+         nreset++;
+         write_record(&rec);
+       }
+
+    }
+
+  if (opt.verbose)
+    log_info (_("%d keys processed (%d validity counts cleared)\n"),
+             count, nreset);
+}
+
+/*
+ * Run the key validation procedure.
+ *
+ * This works this way:
+ * Step 1: Find all ultimately trusted keys (UTK).
+ *         mark them all as seen and put them into klist.
+ * Step 2: loop max_cert_times
+ * Step 3:   if OWNERTRUST of any key in klist is undefined
+ *             ask user to assign ownertrust
+ * Step 4:   Loop over all keys in the keyDB which are not marked seen 
+ * Step 5:     if key is revoked or expired
+ *                mark key as seen
+ *                continue loop at Step 4
+ * Step 6:     For each user ID of that key signed by a key in klist
+ *                Calculate validity by counting trusted signatures.
+ *                Set validity of user ID
+ * Step 7:     If any signed user ID was found
+ *                mark key as seen
+ *             End Loop
+ * Step 8:   Build a new klist from all fully trusted keys from step 6
+ *           End Loop
+ *         Ready  
+ *
+ */
+static int
+validate_keys (int interactive)
+{
+  int rc = 0;
+  int quit=0;
+  struct key_item *klist = NULL;
+  struct key_item *k;
+  struct key_array *keys = NULL;
+  struct key_array *kar;
+  KEYDB_HANDLE kdb = NULL;
+  KBNODE node;
+  int depth;
+  int ot_unknown, ot_undefined, ot_never, ot_marginal, ot_full, ot_ultimate;
+  KeyHashTable stored,used,full_trust;
+  u32 start_time, next_expire;
+
+  /* Make sure we have all sigs cached.  TODO: This is going to
+     require some architectual re-thinking, as it is agonizingly slow.
+     Perhaps combine this with reset_trust_records(), or only check
+     the caches on keys that are actually involved in the web of
+     trust. */
+  keydb_rebuild_caches(0);
+
+  start_time = make_timestamp ();
+  next_expire = 0xffffffff; /* set next expire to the year 2106 */
+  stored = new_key_hash_table ();
+  used = new_key_hash_table ();
+  full_trust = new_key_hash_table ();
+
+  kdb = keydb_new (0);
+  reset_trust_records();
+
+  /* Fixme: Instead of always building a UTK list, we could just build it
+   * here when needed */
+  if (!utk_list)
+    {
+      if (!opt.quiet)
+        log_info (_("no ultimately trusted keys found\n"));
+      goto leave;
+    }
+
+  /* mark all UTKs as used and fully_trusted and set validity to
+     ultimate */
+  for (k=utk_list; k; k = k->next)
+    {
+      KBNODE keyblock;
+      PKT_public_key *pk;
+
+      keyblock = get_pubkeyblock (k->kid);
+      if (!keyblock)
+        {
+          log_error (_("public key of ultimately"
+                       " trusted key %s not found\n"), keystr(k->kid));
+          continue;
+        }
+      mark_keyblock_seen (used, keyblock);
+      mark_keyblock_seen (stored, keyblock);
+      mark_keyblock_seen (full_trust, keyblock);
+      pk = keyblock->pkt->pkt.public_key;
+      for (node=keyblock; node; node = node->next)
+        {
+          if (node->pkt->pkttype == PKT_USER_ID)
+           update_validity (pk, node->pkt->pkt.user_id, 0, TRUST_ULTIMATE);
+        }
+      if ( pk->expiredate && pk->expiredate >= start_time
+           && pk->expiredate < next_expire)
+        next_expire = pk->expiredate;
+      
+      release_kbnode (keyblock);
+      do_sync ();
+    }
+
+  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());
+
+  for (depth=0; depth < opt.max_cert_depth; depth++)
+    {
+      int valids=0,key_count;
+      /* See whether we should assign ownertrust values to the keys in
+         klist.  */
+      ot_unknown = ot_undefined = ot_never = 0;
+      ot_marginal = ot_full = ot_ultimate = 0;
+      for (k=klist; k; k = k->next)
+        {
+         int min=0;
+
+         /* 120 and 60 are as per RFC2440 */
+         if(k->trust_value>=120)
+           min=TRUST_FULLY;
+         else if(k->trust_value>=60)
+           min=TRUST_MARGINAL;
+
+         if(min!=k->min_ownertrust)
+           update_min_ownertrust(k->kid,min);
+
+          if (interactive && k->ownertrust == TRUST_UNKNOWN)
+           {
+             k->ownertrust = ask_ownertrust (k->kid,min);
+
+             if (k->ownertrust == -1)
+               {
+                 quit=1;
+                 goto leave;
+               }
+           }
+
+         /* This can happen during transition from an old trustdb
+            before trust sigs.  It can also happen if a user uses two
+            different versions of GnuPG or changes the --trust-model
+            setting. */
+         if(k->ownertrust<min)
+           {
+             if(DBG_TRUST)
+               log_debug("key %08lX%08lX:"
+                         " overriding ownertrust `%s' with `%s'\n",
+                         (ulong)k->kid[0],(ulong)k->kid[1],
+                         trust_value_to_string(k->ownertrust),
+                         trust_value_to_string(min));
+
+             k->ownertrust=min;
+           }
+
+         if (k->ownertrust == TRUST_UNKNOWN)
+            ot_unknown++;
+          else if (k->ownertrust == TRUST_UNDEFINED)
+            ot_undefined++;
+          else if (k->ownertrust == TRUST_NEVER)
+            ot_never++;
+          else if (k->ownertrust == TRUST_MARGINAL)
+            ot_marginal++;
+          else if (k->ownertrust == TRUST_FULLY)
+            ot_full++;
+          else if (k->ownertrust == TRUST_ULTIMATE)
+            ot_ultimate++;
+
+         valids++;
+        }
+
+      /* Find all keys which are signed by a key in kdlist */
+      keys = validate_key_list (kdb, full_trust, klist,
+                               start_time, &next_expire);
+      if (!keys) 
+        {
+          log_error ("validate_key_list failed\n");
+          rc = G10ERR_GENERAL;
+          goto leave;
+        }
+
+      for (key_count=0, kar=keys; kar->keyblock; kar++, key_count++)
+        ;
+
+      /* Store the calculated valididation status somewhere */
+      if (opt.verbose > 1)
+        dump_key_array (depth, keys);
+
+      for (kar=keys; kar->keyblock; kar++)
+          store_validation_status (depth, kar->keyblock, stored);
+
+      log_info (_("depth: %d  valid: %3d  signed: %3d"
+                  "  trust: %d-, %dq, %dn, %dm, %df, %du\n"), 
+                depth, valids, key_count, ot_unknown, ot_undefined,
+                ot_never, ot_marginal, ot_full, ot_ultimate ); 
+
+      /* Build a new kdlist from all fully valid keys in KEYS */
+      if (klist != utk_list)
+        release_key_items (klist);
+      klist = NULL;
+      for (kar=keys; kar->keyblock; kar++)
+        {
+          for (node=kar->keyblock; node; node = node->next)
+            {
+              if (node->pkt->pkttype == PKT_USER_ID && (node->flag & 4))
+                {
+                 u32 kid[2];
+
+                 /* have we used this key already? */
+                  keyid_from_pk (kar->keyblock->pkt->pkt.public_key, kid);
+                 if(test_key_hash_table(used,kid)==0)
+                   {
+                     /* Normally we add both the primary and subkey
+                        ids to the hash via mark_keyblock_seen, but
+                        since we aren't using this hash as a skipfnc,
+                        that doesn't matter here. */
+                     add_key_hash_table (used,kid);
+                     k = new_key_item ();
+                     k->kid[0]=kid[0];
+                     k->kid[1]=kid[1];
+                     k->ownertrust =
+                       (get_ownertrust (kar->keyblock->pkt->pkt.public_key)
+                        & TRUST_MASK);
+                     k->min_ownertrust =
+                       get_min_ownertrust(kar->keyblock->pkt->pkt.public_key);
+                     k->trust_depth=
+                       kar->keyblock->pkt->pkt.public_key->trust_depth;
+                     k->trust_value=
+                       kar->keyblock->pkt->pkt.public_key->trust_value;
+                     if(kar->keyblock->pkt->pkt.public_key->trust_regexp)
+                       k->trust_regexp=
+                         xstrdup(kar->keyblock->pkt->
+                                  pkt.public_key->trust_regexp);
+                     k->next = klist;
+                     klist = k;
+                     break;
+                   }
+               }
+           }
+       }
+      release_key_array (keys);
+      keys = NULL;
+      if (!klist)
+        break; /* no need to dive in deeper */
+    }
+
+ leave:
+  keydb_release (kdb);
+  release_key_array (keys);
+  release_key_items (klist);
+  release_key_hash_table (full_trust);
+  release_key_hash_table (used);
+  release_key_hash_table (stored);
+  if (!rc && !quit) /* mark trustDB as checked */
+    {
+      if (next_expire == 0xffffffff || next_expire < start_time )
+        tdbio_write_nextcheck (0); 
+      else
+        {
+          tdbio_write_nextcheck (next_expire); 
+          log_info (_("next trustdb check due at %s\n"),
+                    strtimestamp (next_expire));
+        }
+
+      if(tdbio_update_version_record()!=0)
+       {
+         log_error(_("unable to update trustdb version record: "
+                     "write failed: %s\n"), g10_errstr(rc));
+         tdbio_invalid();
+       }
+
+      do_sync ();
+      pending_check_trustdb = 0;
+    }
+
+  return rc;
+}
diff --git a/g10/trustdb.h b/g10/trustdb.h
new file mode 100644 (file)
index 0000000..2d0581f
--- /dev/null
@@ -0,0 +1,98 @@
+/* trustdb.h - Trust database
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_TRUSTDB_H
+#define G10_TRUSTDB_H
+
+/* Trust values must be sorted in ascending order */
+#define TRUST_MASK      15
+#define TRUST_UNKNOWN    0  /* o: not yet calculated/assigned */
+#define TRUST_EXPIRED    1  /* e: calculation may be invalid */
+#define TRUST_UNDEFINED   2  /* q: not enough information for calculation */
+#define TRUST_NEVER      3  /* n: never trust this pubkey */
+#define TRUST_MARGINAL   4  /* m: marginally trusted */
+#define TRUST_FULLY      5  /* f: fully trusted      */
+#define TRUST_ULTIMATE   6  /* u: ultimately trusted */
+/* trust values not covered by the mask */
+#define TRUST_FLAG_REVOKED 32 /* r: revoked */
+#define TRUST_FLAG_SUB_REVOKED 64 /* r: revoked but for subkeys */
+#define TRUST_FLAG_DISABLED 128 /* d: key/uid disabled */
+#define TRUST_FLAG_PENDING_CHECK 256 /* a check-trustdb is pending */
+
+#define NAMEHASH_HASH DIGEST_ALGO_RMD160
+#define NAMEHASH_LEN  20
+
+/*-- trustdb.c --*/
+void register_trusted_keyid(u32 *keyid);
+void register_trusted_key( const char *string );
+void check_trustdb (void);
+void update_trustdb (void);
+int setup_trustdb( int level, const char *dbname );
+void init_trustdb( void );
+void check_trustdb_stale(void);
+void sync_trustdb( void );
+
+const char *uid_trust_string_fixed(PKT_public_key *key,PKT_user_id *uid);
+const char *trust_value_to_string (unsigned int value);
+int string_to_trust_value (const char *str);
+
+void revalidation_mark (void);
+int trustdb_pending_check(void);
+void trustdb_check_or_update(void);
+
+int cache_disabled_value(PKT_public_key *pk);
+
+unsigned int get_validity (PKT_public_key *pk, PKT_user_id *uid);
+int get_validity_info (PKT_public_key *pk, PKT_user_id *uid);
+const char *get_validity_string (PKT_public_key *pk, PKT_user_id *uid);
+
+void list_trust_path( const char *username );
+int enum_cert_paths( void **context, ulong *lid,
+                    unsigned *ownertrust, unsigned *validity );
+void enum_cert_paths_print( void **context, FILE *fp,
+                                          int refresh, ulong selected_lid );
+
+void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck,
+                       byte *marginals,byte *completes,byte *cert_depth);
+
+unsigned int get_ownertrust (PKT_public_key *pk);
+unsigned int get_min_ownertrust (PKT_public_key *pk);
+int get_ownertrust_info (PKT_public_key *pk);
+const char *get_ownertrust_string (PKT_public_key *pk);
+
+void update_ownertrust (PKT_public_key *pk, unsigned int new_trust );
+int clear_ownertrusts (PKT_public_key *pk);
+
+void clean_one_uid(KBNODE keyblock,KBNODE uidnode,int noisy,int self_only,
+                  int *uids_cleaned,int *sigs_cleaned);
+void clean_key(KBNODE keyblock,int noisy,int self_only,
+              int *uids_cleaned,int *sigs_cleaned);
+
+/*-- tdbdump.c --*/
+void list_trustdb(const char *username);
+void export_ownertrust(void);
+void import_ownertrust(const char *fname);
+
+/*-- pkclist.c --*/
+int edit_ownertrust (PKT_public_key *pk, int mode );
+
+#endif /*G10_TRUSTDB_H*/
diff --git a/g10/verify.c b/g10/verify.c
new file mode 100644 (file)
index 0000000..082db89
--- /dev/null
@@ -0,0 +1,211 @@
+/* verify.c - verify signed data
+ * Copyright (C) 1998, 1999, 2000, 2001, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h> /* for isatty() */
+
+#include "options.h"
+#include "packet.h"
+#include "errors.h"
+#include "iobuf.h"
+#include "keydb.h"
+#include "memory.h"
+#include "util.h"
+#include "main.h"
+#include "status.h"
+#include "filter.h"
+#include "ttyio.h"
+#include "i18n.h"
+
+
+
+/****************
+ * Assume that the input is a signature and verify it without
+ * generating any output.  With no arguments, the signature packet
+ * is read from stdin (it may be a detached signature when not
+ * used in batch mode). If only a sigfile is given, it may be a complete
+ * signature or a detached signature in which case the signed stuff
+ * is expected from stdin. With more than 1 argument, the first should
+ * be a detached signature and the remaining files are the signed stuff.
+ */
+
+int
+verify_signatures( int nfiles, char **files )
+{
+    IOBUF fp;
+    armor_filter_context_t afx;
+    progress_filter_context_t pfx;
+    const char *sigfile;
+    int i, rc;
+    STRLIST sl;
+
+    memset( &afx, 0, sizeof afx);
+    /* decide whether we should handle a detached or a normal signature,
+     * which is needed so that the code later can hash the correct data and
+     * not have a normal signature act as detached signature and ignoring the
+     * indended signed material from the 2nd file or stdin.
+     * 1. gpg <file        - normal
+     * 2. gpg file         - normal (or detached)
+     * 3. gpg file <file2  - detached
+     * 4. gpg file file2   - detached
+     * The question is how decide between case 2 and 3?  The only way
+     * we can do it is by reading one byte from stdin and the unget
+     * it; the problem here is that we may be reading from the
+     * terminal (which could be detected using isatty() but won't work
+     * when under contol of a pty using program (e.g. expect)) and
+     * might get us in trouble when stdin is used for another purpose
+     * (--passphrase-fd 0).  So we have to break with the behaviour
+     * prior to gpg 1.0.4 by assuming that case 3 is a normal
+     * signature (where file2 is ignored and require for a detached
+     * signature to indicate signed material comes from stdin by using
+     * case 4 with a file2 of "-".
+     *
+     * Actually we don't have to change anything here but can handle
+     * that all quite easily in mainproc.c 
+     */
+     
+
+    sigfile = nfiles? *files : NULL;
+
+    /* open the signature file */
+    fp = iobuf_open(sigfile);
+    if (fp && is_secured_file (iobuf_get_fd (fp)))
+      {
+        iobuf_close (fp);
+        fp = NULL;
+        errno = EPERM;
+      }
+    if( !fp ) {
+       log_error(_("can't open `%s'\n"), print_fname_stdin(sigfile));
+       return G10ERR_OPEN_FILE;
+    }
+    handle_progress (&pfx, fp, sigfile);
+
+    if( !opt.no_armor && use_armor_filter( fp ) )
+       iobuf_push_filter( fp, armor_filter, &afx );
+
+    sl = NULL;
+    for(i=nfiles-1 ; i > 0 ; i-- )
+       add_to_strlist( &sl, files[i] );
+    rc = proc_signature_packets( NULL, fp, sl, sigfile );
+    free_strlist(sl);
+    iobuf_close(fp);
+    if( (afx.no_openpgp_data && rc == -1) || rc == G10ERR_NO_DATA ) {
+       log_error(_("the signature could not be verified.\n"
+                  "Please remember that the signature file (.sig or .asc)\n"
+                  "should be the first file given on the command line.\n") );
+       rc = 0;
+    }
+
+    return rc;
+}
+
+
+void
+print_file_status( int status, const char *name, int what )
+{
+    char *p = xmalloc(strlen(name)+10);
+    sprintf(p, "%d %s", what, name );
+    write_status_text( status, p );
+    xfree(p);
+}
+
+
+static int
+verify_one_file( const char *name )
+{
+    IOBUF fp;
+    armor_filter_context_t afx;
+    progress_filter_context_t pfx;
+    int rc;
+
+    print_file_status( STATUS_FILE_START, name, 1 );
+    fp = iobuf_open(name);
+    if (fp)
+      iobuf_ioctl (fp,3,1,NULL); /* disable fd caching */
+    if (fp && is_secured_file (iobuf_get_fd (fp)))
+      {
+        iobuf_close (fp);
+        fp = NULL;
+        errno = EPERM;
+      }
+    if( !fp ) {
+       print_file_status( STATUS_FILE_ERROR, name, 1 );
+       log_error(_("can't open `%s'\n"), print_fname_stdin(name));
+       return G10ERR_OPEN_FILE;
+    }
+    handle_progress (&pfx, fp, name);
+
+    if( !opt.no_armor ) {
+       if( use_armor_filter( fp ) ) {
+           memset( &afx, 0, sizeof afx);
+           iobuf_push_filter( fp, armor_filter, &afx );
+       }
+    }
+
+    rc = proc_signature_packets( NULL, fp, NULL, name );
+    iobuf_close(fp);
+    write_status( STATUS_FILE_DONE );
+    return rc;
+}
+
+/****************
+ * Verify each file given in the files array or read the names of the
+ * files from stdin.
+ * Note:  This function can not handle detached signatures.
+ */
+int
+verify_files( int nfiles, char **files )
+{
+    int i;
+
+    if( !nfiles ) { /* read the filenames from stdin */
+       char line[2048];
+       unsigned int lno = 0;
+
+       while( fgets(line, DIM(line), stdin) ) {
+           lno++;
+           if( !*line || line[strlen(line)-1] != '\n' ) {
+               log_error(_("input line %u too long or missing LF\n"), lno );
+               return G10ERR_GENERAL;
+           }
+           /* This code does not work on MSDOS but how cares there are
+            * also no script languages available.  We don't strip any
+            * spaces, so that we can process nearly all filenames */
+           line[strlen(line)-1] = 0;
+           verify_one_file( line );
+            iobuf_ioctl( NULL, 2, 0, NULL); /* Invalidate entire cache. */
+       }
+
+    }
+    else {  /* take filenames from the array */
+        for(i=0; i < nfiles; i++ ) {
+           verify_one_file( files[i] );
+            iobuf_ioctl( NULL, 2, 0, NULL); /* Invalidate entire cache. */
+        }
+    }
+    return 0;
+}
diff --git a/gnupg.spec b/gnupg.spec
new file mode 100644 (file)
index 0000000..d90ef7a
--- /dev/null
@@ -0,0 +1,212 @@
+#
+# gnupg -- gnu privacy guard
+# This is a template.  The dist target uses it to create the real file.
+#
+%define version 1.4.6
+%define name gnupg
+Summary: GNU Utility for data encryption and digital signatures
+Summary(it): Utility GNU per la sicurezza nelle comunicazioni e nell'archiviazione dei dati.
+Summary(cs): GNU nástroj pro ¹ifrovanou komunikaci a bezpeèné ukládání dat
+Summary(fr): Utilitaire GNU de chiffrement et d'authentification des communications et des données
+Summary(pl): Narzedzie GNU do szyfrowania i podpisywania danych
+Vendor: GNU Privacy Guard Project
+Name: %{name}
+Version: %{version}
+Release: 1
+Copyright: GPL
+Group: Applications/Cryptography
+Group(cs): Aplikace/©ifrování
+Group(fr): Applications/Cryptographie
+Group(it): Applicazioni/Crittografia
+Source: ftp://ftp.gnupg.org/gcrypt/gnupg/%{name}-%{version}.tar.gz
+URL: http://www.gnupg.org/
+Provides: gpg openpgp
+Requires(post,preun): /sbin/install-info
+BuildRoot: %{_tmppath}/rpmbuild_%{name}-%{version}
+
+%changelog
+* Sun Aug 21 2005 David Shaw <dshaw@jabberwocky.com>
+- Distribute gpg-zip.
+
+* Fri Apr 22 2005 David Shaw <dshaw@jabberwocky.com>
+- No longer any need to override libexecdir.  The makefiles now
+  calculate this correctly internally.
+
+* Wed Feb 16 2005 David Shaw <dshaw@jabberwocky.com>
+- Fix problem with storing the gpgkeys helpers in libexec, but calling
+  them in libexec/gnupg.
+
+* Wed Jul 30 2003 David Shaw <dshaw@jabberwocky.com>
+- Rework much of the spec to use %-macros throughout.
+- Fix to work properly with RPM 4.1 (all files in buildroot must be packaged)
+- Package and install info files.
+- Tweak the English description.
+- There is no need to install gpgv and gpgsplit setuid root.
+
+* Sat Nov 30 2002 David Shaw <dshaw@jabberwocky.com>
+- Add convert-from-106 script
+
+* Sat Oct 26 2002 David Shaw <dshaw@jabberwocky.com>
+- Use new path for keyserver helpers.
+- /usr/lib is no longer used for cipher/hash plugins.
+- Include gpgv, gpgsplit, and the new gnupg.7 man page.
+
+* Fri Apr 19 2002 David Shaw <dshaw@jabberwocky.com>
+- Removed OPTIONS and pubring.asc - no longer used
+- Added doc/samplekeys.asc
+
+* Sun Mar 31 2002 David Shaw <dshaw@jabberwocky.com>
+- Added the gpgkeys_xxx keyserver helpers.
+- Added a * to catch variations on the basic gpg man page (gpg, gpgv).
+- Mark options.skel as a config file.
+- Do not include the FAQ/faq.html twice (in /doc/ and /share/).
+
+* Wed Sep 06 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Added Polish description and summary (Kindly provided by  
+  Lukasz Stelmach <stelmacl@ee.pw.edu.pl>)
+  
+* Thu Jul 13 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Added a * to catch all formats for man pages (plain, gz, bz2...)    
+
+* Mon May 01 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Some corrections in French description, thanks to Gaël Quéri
+  <gqueri@mail.dotcom.fr>; Some corrections to Italian descriptions.
+
+* Tue Apr 25 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Removed the no longer needed patch for man page by Keith Owens
+
+* Wed Mar 1 2000 Petr Kri¹tof <Petr@Kristof.CZ> 
+- Czech descriptions added; some fixes and updates.
+
+* Sat Jan 15 2000 Keith Owens <kaos@ocs.com.au>
+- Add missing man page as separate patch instead of updating the tar file.
+
+* Mon Dec 27 1999 Fabio Coatti <cova@ferrara.linux.it> 
+- Upgraded for 1.0.1 (added missing gpg.1 man page)
+
+* Sat May 29 1999 Fabio Coatti <cova@ferrara.linux.it>
+- Some corrections in French description, thanks to Gaël Quéri <gqueri@mail.dotcom.fr>  
+
+* Mon May 17 1999 Fabio Coatti <cova@felix.unife.it>
+- Added French description, provided by 
+  Christophe Labouisse <labouiss@cybercable.fr>
+
+* Thu May 06 1999 Fabio Coatti <cova@felix.unife.it> 
+- Upgraded for 0.9.6 (removed gpgm)
+
+* Tue Jan 12 1999 Fabio Coatti <cova@felix.unife.it>
+- LINGUAS variable is now unset in configure to ensure that all languages will be built. (Thanks to Luca Olivetti <luca@luca.ddns.org>)
+* Sat Jan 02 1999 Fabio Coatti <cova@felix.unife.it>
+- Added pl language file.
+- Included g10/pubring.asc in documentation files.
+
+* Sat Dec 19 1998 Fabio Coatti <cova@felix.unife.it>
+- Modified the spec file provided by Caskey L. Dickson <caskey-at-technocage.com>
+- Now it can be built also by non-root. Installation has to be done as
+  root, gpg is suid.
+- Added some changes by  Ross Golder <rossigee@bigfoot.com>
+- Updates for version 0.4.5 of GnuPG (.mo files)
+
+%description
+
+GnuPG (GNU Privacy Guard) is a GNU utility for encrypting data and
+creating digital signatures. GnuPG has advanced key management
+capabilities and is compliant with the proposed OpenPGP Internet
+standard described in RFC-2440.  Since GnuPG doesn't use any patented
+algorithms, it is not compatible with some versions of PGP 2 which use
+only the patented IDEA algorithm.  See
+http://www.gnupg.org/why-not-idea.html for information on using IDEA
+if the patent does not apply to you and you need to be compatible with
+these versions of PGP 2.
+
+%description -l it
+GnuPG (GNU Privacy Guard) è una utility GNU per la cifratura di dati e
+la creazione di firme digitali. Possiede una gestione avanzata delle
+chiavi ed è conforme allo standard Internet OpenPGP, descritto nella
+RFC 2440. Non utilizzando algoritmi brevettati, non è compatibile con
+PGP2 (PGP2.x usa solo IDEA, coperto da brevetto mondiale, ed RSA,
+brevettato negli USA con scadenza 20/09/2000). Questi algoritmi sono
+utilizzabili da GnuPG tramite moduli esterni.
+
+%description -l fr
+GnuPG est un utilitaire GNU destiné à chiffrer des données et à créer
+des signatures électroniques. Il a des capacités avancées de gestion de
+clés et il est conforme à la norme proposée OpenPGP décrite dans la
+RFC2440. Comme GnuPG n'utilise pas d'algorithme breveté, il n'est
+compatible avec aucune version de PGP2 (PGP2.x ne sait utiliser que
+l'IDEA breveté dans le monde entier et RSA, breveté aux États-Unis
+jusqu'au 20 septembre 2000). 
+
+%description -l cs
+GnuPG je GNU nástroj pro bezpeènou komunikaci a ukládání dat. Mù¾e být
+pou¾it na ¹ifrování dat a vytváøení digitálních podpisù. Obsahuje
+funkce pro pokroèilou správu klíèù a vyhovuje navrhovanému OpenPGP
+Internet standardu podle RFC2440. Byl vytvoøen jako kompletní
+náhrada za PGP. Proto¾e neobsahuje ¹ifrovací algoritmy IDEA nebo RSA,
+mù¾e být pou¾íván bez omezení.
+Proto¾e GnuPG nepou¾ívá ¾ádný patentovaný algoritmus, nemù¾e být úplnì
+kompatibilní s PGP verze 2. PGP 2.x pou¾ívá algoritmy IDEA (patentováno
+celosvìtovì) a RSA (patentováno ve Spojených státech do 20. záøí
+2000). Tyto algoritmy lze zavést do GnuPG pomocí externích modulù.
+
+%description -l pl
+GnuPG (GNU Privacy Guard) jest nazedziem do szfrowania danych i tworzenia
+cyfrowych podpisów. GnuPG posiada zaawansowane mozliwosci obslugi kluczy
+i jest zgodne z OpenPGP, proponowanym standardem internetowym opisanym
+w RFC2440. Poniewaz GnuPG nie uzywa zadnych opatentowanych algorytmów
+nie jest wiec zgodne z jaka kolwiek wersja PGP2 (PGP2.x kozysta jedynie
+z algorytmów: IDEA, opatentowanego na calym swiecie, oraz RSA, którego
+patent na terenie Stanów Zjednoczonych wygasa 20 wrzesnia 2000).         
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+
+%setup
+
+%build
+if test -n "$LINGUAS"; then
+ unset LINGUAS
+fi    
+%configure --program-prefix=%{?_program_prefix:%{_program_prefix}}
+make
+
+%install
+%makeinstall
+%find_lang %{name}
+rm %{buildroot}%{_datadir}/%{name}/FAQ
+rm %{buildroot}%{_datadir}/%{name}/faq.html
+rm -f %{buildroot}%{_infodir}/dir
+
+%files -f %{name}.lang
+%defattr (-,root,root)
+
+%doc INSTALL AUTHORS COPYING NEWS README THANKS TODO PROJECTS doc/DETAILS
+%doc doc/FAQ doc/faq.html doc/HACKING doc/OpenPGP doc/samplekeys.asc
+%doc %attr (0755,root,root) tools/convert-from-106
+%config %{_datadir}/%{name}/options.skel
+%{_mandir}/man1/*
+%{_mandir}/man7/*
+%{_infodir}/gpg.info*
+%{_infodir}/gpgv.info*
+%attr (4755,root,root) %{_bindir}/gpg
+%attr (0755,root,root) %{_bindir}/gpgv
+%attr (0755,root,root) %{_bindir}/gpgsplit
+%attr (0755,root,root) %{_bindir}/gpg-zip
+%attr (0755,root,root) %{_libexecdir}/gnupg/*
+
+%post
+/sbin/install-info %{_infodir}/gpg.info %{_infodir}/dir 2>/dev/null || :
+/sbin/install-info %{_infodir}/gpgv.info %{_infodir}/dir 2>/dev/null || :
+
+%preun
+if [ $1 = 0 ]; then
+   /sbin/install-info --delete %{_infodir}/gpg.info \
+       %{_infodir}/dir 2>/dev/null || :
+   /sbin/install-info --delete %{_infodir}/gpgv.info \
+       %{_infodir}/dir 2>/dev/null || :
+fi
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+rm -rf $RPM_BUILD_DIR/%{name}-%{version}
diff --git a/include/ChangeLog b/include/ChangeLog
new file mode 100644 (file)
index 0000000..b73f0cb
--- /dev/null
@@ -0,0 +1,588 @@
+2006-12-04  Werner Koch  <wk@g10code.com>
+
+       * iobuf.h (iobuf_t): New.  That is the name we use in 2.0.
+
+2006-09-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * compat.h: Move strsep prototype and ascii_isspace macro to from
+       util.h.
+
+       * compat.h: New, used for libcompat.a functions.
+
+       * util.h: Includes compat.h.
+
+2006-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add dsa2_generate();
+
+2006-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add SHA-224.
+
+2006-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Handle the fixed IPGP type with fingerprint.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * errors.h (G10ERR_NO_DATA): New.
+
+2005-12-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Prototype get_cert().
+
+2005-07-27  Werner Koch  <wk@g10code.com>
+
+       * memory.h (m_free, m_alloc, m_realloc, m_strdup): Removed and
+       replaced all over by xfoo functions.  This is to ease porting to
+       gnupg 1.9.
+       (xmalloc_secure) [M_DEBUG]: Correctly map to m_debug_alloc_secure.
+
+2005-06-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.h: Fix prototypes for http_open_document and http_open
+       again, to handle the new different auth for regular files and
+       proxies.
+
+2005-06-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.h: Fix prototypes for http_open_document and http_open to
+       pass in auth and proxyauth.
+
+2005-05-19  Werner Koch  <wk@g10code.com>
+
+       * util.h: Add definitions for membuf functions.
+
+2005-05-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Remove add_days_to_timestamp as unused.
+
+2005-04-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * distfiles: Add assuan.h.
+
+2005-04-04  Werner Koch  <wk@g10code.com>
+
+       * memory.h (xcalloc, xcalloc_secure): Replaced macros by functions.
+
+2005-03-31  Werner Koch  <wk@g10code.com>
+
+       * assuan.h: New.  Taken from libassuan 0.6.9.
+
+2005-03-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * ttyio.h: Prototype tty_enable_completion(), and
+       tty_disable_completion().
+
+2005-02-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add a flag for a symmetric DEK.
+
+2004-12-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * memory.h: Return a flag to indicate whether we got the lock.
+
+2004-11-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add PUBKEY_USAGE_UNKNOWN.
+
+2004-11-03  Timo Schulz  <twoaday@g10code.com>
+
+        * errors.h: Add w32_strerror prototype.
+       * dynload.h: Use w32_strerror.
+       
+2004-10-27  Werner Koch  <wk@g10code.com>
+
+       * dynload.h: Always use it for _WIN32.
+
+2004-10-21  Werner Koch  <wk@g10code.com>
+
+       * util.h [!HAVE_VASPRINTF]: Removed prototype.
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * util.h [!HAVE_VASPRINTF]: Add asprintf prototype.
+
+2004-10-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.h: Add KEYSERVER_TIMEOUT.
+
+2004-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Prototype destroy_dotlock().  From Werner on stable
+       branch.
+
+2004-09-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.h: Add auth field for a parsed_uri to allow for basic auth.
+
+2004-09-09  Werner Koch  <wk@g10code.com>
+
+       * errors.h (G10ERR_NO_CARD, G10ERR_CANCELED): New error codes.
+
+2004-04-27  Werner Koch  <wk@gnupg.org>
+
+       * mpi.h: Renamed prototype parameter name to avoid gcc warnings.
+
+2004-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * iobuf.h: Remove iobuf_set_block_mode() and
+       iobuf_in_block_mode().
+
+2004-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Prototype for hextobyte().
+
+2004-01-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Remove the old CIPHER_ALGO_RINJDAEL values.
+       is_ELGAMAL() now only matches type 16 and not type 20.
+
+2004-01-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Add prototype for print_string2().
+
+2003-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.h: Pass the http proxy from outside rather than pulling it
+       from the evironment.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Removal of unnecessary RISC OS stuff.
+
+2003-12-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * mpi.h (gcry_mpi, mpi_get_opaque, mpi_set_opaque): Make nbits and
+       the length of an opaque MPI unsigned.
+
+       * cipher.h (pubkey_verify): Remove old unused code.
+
+2003-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Make cipher list match 2440bis-09.
+
+2003-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Add prototype for match_multistr().
+
+2003-10-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add COMPRESS_ALGO_BZIP2.
+
+2003-10-04  Timo Schulz  <twoaday@freakmail.de>
+
+       * dynload [WIN32] (dlclose): Do not use CloseHandle but FreeLibrary.
+       
+2003-09-29  Werner Koch  <wk@gnupg.org>
+
+       * cipher.h (PUBKEY_USAGE_AUTH): New.
+
+2003-09-28  Timo Schulz  <twoaday@freakmail.de>
+
+       * util.h [WIN32]: Prototype for asprintf.
+       * dynload.h [WIN32]: Define RTLD_LAZY.
+       
+2003-09-28  Werner Koch  <wk@gnupg.org>
+
+       * util.h: Add the atoi_* and xtoi_* suite of macros from 1.9.
+       * dynload.h: New.  Taken from 1.9.
+
+2003-09-27  Werner Koch  <wk@gnupg.org>
+
+       * memory.h (xmalloc): Define xmalloc macros in terms of m_alloc.
+
+2003-09-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Drop TIGER/192 support.
+
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: s/__MINGW32__/_WIN32/ to help building on native Windows
+       compilers.  Requested by Brian Gladman.  From Werner on stable
+       branch.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * types.h: Prefer using uint64_t when creating a 64-bit unsigned
+       type. This avoids a warning on compilers that support but complain
+       about unsigned long long.
+
+       * util.h (ascii_isspace): New variation on isspace() that is
+       immune from locale changes.
+
+       * util.h: Make sure that only ascii is passed to isfoo
+       functions. (From Werner on stable branch).
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h, i18n.h, iobuf.h, memory.h, mpi.h, types.h, util.h:
+       Edit all preprocessor instructions to remove whitespace before the
+       '#'.  This is not required by C89, but there are some compilers
+       out there that don't like it.
+
+2003-05-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * types.h: Add initializer macros for 64-bit unsigned type.
+
+2003-05-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add constants for compression algorithms.
+
+2003-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.h: Add HTTP_FLAG_TRY_SRV.
+
+2003-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * types.h: Try and use uint64_t for a 64-bit type.
+
+2003-02-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add constants for new SHAs.
+
+2002-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h [__CYGWIN32__]: Don't need the registry prototypes.  From
+       Werner on stable branch.
+
+2002-11-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Add wipememory2() macro (same as wipememory, but can
+       specify the byte to wipe with).
+
+2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Prefixed all RISC OS prototypes with
+       riscos_*
+
+       * zlib-riscos.h: New. This is macro magic in order to make the
+       zlib library calls indeed call the RISC OS ZLib module.
+
+2002-10-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Add wipememory() macro.
+
+2002-10-29  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h: Added parameter argument to make_basename() needed for
+       filetype support.
+       [__riscos__]: Added prototype.
+
+2002-10-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Added prototypes for new filetype support.
+
+2002-10-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * distfiles, _regex.h: Add _regex.h from glibc 2.3.1.
+
+2002-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.h: Go to KEYSERVER_PROTO_VERSION 1.
+
+2002-10-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.h: Add new error code KEYSERVER_UNREACHABLE.
+
+2002-10-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Add new log_warning logger command which can be switched
+       between log_info and log_error via log_set_strict.
+
+2002-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.h: Add some new error codes for better GPA support.
+
+2002-09-10  Werner Koch  <wk@gnupg.org>
+
+       * mpi.h (mpi_is_protected, mpi_set_protect_flag)
+       (mpi_clear_protect_flag): Removed.
+       (mpi_get_nbit_info, mpi_set_nbit_info): Removed.
+
+2002-08-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add AES aliases for RIJNDAEL algo numbers.
+
+2002-08-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * cipher.h: Add md_algo_present().
+
+2002-08-06  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Added riscos_getchar().
+
+2002-06-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Further moving away of RISC OS specific
+       stuff from general code.
+
+2002-06-20  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Added riscos_set_filetype().
+
+2002-06-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: Add pop_strlist() from strgutil.c.
+
+2002-06-07  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: RISC OS needs strings.h for strcasecmp()
+       and strncasecmp().
+
+2002-05-22  Werner Koch  <wk@gnupg.org>
+
+       * util.h: Add strncasecmp.  Removed stricmp and memicmp.
+
+2002-05-10  Stefan Bellon  <sbellon@sbellon.de>
+
+       * mpi.h: New function mpi_debug_alloc_like for M_DEBUG.
+
+       * util.h [__riscos__]: Make use of __func__ that later
+       Norcroft compiler provides.
+
+       * memory.h: Fixed wrong definition of m_alloc_secure_clear.
+
+2002-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.h: New function answer_is_yes_no_default() to give a
+       default answer.
+
+2002-04-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Removed riscos_open, riscos_fopen and
+       riscos_fstat as those special versions aren't needed anymore.
+
+2002-02-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * keyserver.h: Add KEYSERVER_NOT_SUPPORTED for unsupported actions
+       (say, a keyserver that has no way to search, or a readonly
+       keyserver that has no way to add).
+
+2002-01-02  Stefan Bellon  <sbellon@sbellon.de>
+
+       * util.h [__riscos__]: Updated prototype list.
+
+       * types.h [__riscos__]: Changed comment wording.
+
+2001-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * KEYSERVER_SCHEME_NOT_FOUND should be 127 to match the POSIX
+       system() (via /bin/sh) way of signaling this.
+       
+       * Added G10ERR_KEYSERVER
+
+2001-12-27  Werner Koch  <wk@gnupg.org>
+
+       * util.h [MINGW32]: Fixed name of include file.
+
+2001-12-22  Timo Schulz <ts@winpt.org>
+
+        * util.h (is_file_compressed): New.
+
+2001-12-19  Werner Koch  <wk@gnupg.org>
+
+       * util.h [CYGWIN32]: Allow this as an alias for MINGW32. Include
+       stdarg.h becuase we use the va_list type.  By Disastry.
+
+2001-09-28  Werner Koch  <wk@gnupg.org>
+
+       * cipher.h (PUBKEY_USAGE_CERT): New.
+
+2001-09-07  Werner Koch  <wk@gnupg.org>
+
+       * util.h: Add strsep().
+
+2001-08-30  Werner Koch  <wk@gnupg.org>
+
+       * cipher.h (DEK): Added use_mdc.
+
+2001-08-24  Werner Koch  <wk@gnupg.org>
+
+       * cipher.h (md_write): Made buf arg const. 
+
+2001-08-20  Werner Koch  <wk@gnupg.org>
+
+       * cipher.h (DEK): Added algo_info_printed;
+
+       * util.h [__riscos__]: Added prototypes and made sure that we
+       never use __attribute__.
+       * cipher.h, iobuf.h, memory.h, mpi.h [__riscos__]: extern hack.
+       * i18n.h [__riscos__]: Use another include file
+       
+2001-05-30  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.h (tty_printf): Add missing parenthesis for non gcc.
+       * http.h: Removed trailing comma to make old ccs happy.  Both are
+       by Albert Chin.
+
+2001-05-25  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.h (tty_printf): Add printf attribute.
+
+2001-04-23  Werner Koch  <wk@gnupg.org>
+
+       * http.h: New flag HTTP_FLAG_NO_SHUTDOWN.
+
+2001-04-13  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.h: Removed iobuf_fopen.
+
+2001-03-01  Werner Koch  <wk@gnupg.org>
+
+       * errors.h (G10ERR_UNU_SECKEY,G10ERR_UNU_PUBKEY): New
+
+2000-11-30  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.h (iobuf_translate_file_handle): Add prototype.
+
+2000-11-11  Paul Eggert  <eggert@twinsun.com>
+
+        * iobuf.h (iobuf_get_filelength): Now returns off_t, not u32.
+        (struct iobuf_struct, iobuf_set_limit,
+        iobuf_tell, iobuf_seek): Use off_t, not ulong, for file offsets.
+
+2000-10-12  Werner Koch  <wk@gnupg.org>
+
+       * mpi.h: Changed the way mpi_limb_t is defined.
+
+Wed Sep  6 17:55:47 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * iobuf.c (IOBUF_FILELENGTH_LIMIT): New.
+
+2000-03-14 14:03:43  Werner Koch  (wk@habibti.openit.de)
+
+       * types.h (HAVE_U64_TYPEDEF): Defined depending on configure test.
+
+Thu Jan 13 19:31:58 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * types.h (HAVE_U64_TYPEDEF): Add a test for _LONGLONG which fixes
+       this long living SGI bug.  Reported by Alec Habig.
+
+Sat Dec  4 12:30:28 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * iobuf.h (IOBUFCTRL_CANCEL): Nww.
+
+Mon Oct  4 21:23:04 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * errors.h (G10ERR_NOT_PROCESSED): New.
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * i18n.h: Add support for simple-gettext.
+
+Tue Jun 29 21:44:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * util.h (stricmp): Use strcasecmp as replacement.
+
+Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * cipher.h (MD_HANDLE): Assigned a structure name.
+
+Fri Apr  9 12:26:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.h (BLOWFISH160): Removed.
+
+Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.h (DEK): increased max. key length to 32 bytes
+
+
+Sat Feb 20 21:40:49 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * g10lib.h: Removed file and changed all files that includes this.
+
+Tue Feb 16 14:10:02 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * types.h (STRLIST): Add field flags.
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.h (CIPHER_ALGO_TWOFISH): Chnaged ID to 10 and renamed
+       the old experimenatl algorithm to xx_OLD.
+
+Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * cipher.h (MD_BUFFER_SIZE): Removed.
+
+Mon Dec 14 21:18:49 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * types.h: fix for SUNPRO_C
+
+Tue Dec  8 13:15:16 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpi.h (MPI): Changed the structure name to gcry_mpi and
+       changed all users.
+
+Tue Oct 20 11:40:00 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.h (iobuf_get_temp_buffer): New.
+
+Tue Oct 13 12:40:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.h (iobuf_get): Now uses .nofast
+       (iobuf_get2): Removed.
+
+Mon Sep 14 09:17:22 1998  Werner Koch  (wk@(none))
+
+       * util.h (HAVE_ATEXIT): New.
+       (HAVE_RAISE): New.
+
+Mon Jul  6 10:41:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h (PUBKEY_USAGE_): New.
+
+Mon Jul  6 09:49:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.h (iobuf_set_error): New.
+       (iobuf_error): New.
+
+Sat Jun 13 17:31:32 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * g10lib.h: New as interface for the g10lib.
+
+Mon Jun  8 22:14:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h (CIPHER_ALGO_CAST5): Changed name from .. CAST
+
+Thu May 21 13:25:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h: removed ROT 5 and changed one id and add dummy
+
+Tue May 19 18:09:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h (DIGEST_ALGO_TIGER): Chnaged id from 101 to 6.
+
+Mon May  4 16:37:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h (PUBKEY_ALGO_ELGAMAL_E): New, with value of the
+       old one.
+       * (is_ELGAMAL, is_RSA): New macros
+
+Sun Apr 26 14:35:24 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * types.h: New type u64
+
+Mon Mar  9 12:59:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h: Included dsa.h.
+
+Tue Mar  3 15:11:21 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * cipher.h (random.h): Add new header and move all relevalt
+       functions to this header.
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003,
+          2004, 2005 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/include/_regex.h b/include/_regex.h
new file mode 100644 (file)
index 0000000..88acc35
--- /dev/null
@@ -0,0 +1,574 @@
+/* Definitions for data structures and routines for the regular
+   expression library.
+   Copyright (C) 1985,1989-93,1995-98,2000,2001,2002
+   Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02110-1301 USA.  */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+/* Allow the use in C++ code.  */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* POSIX says that <sys/types.h> must be included (by the caller) before
+   <regex.h>.  */
+
+#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
+/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+   should be there.  */
+# include <stddef.h>
+#endif
+
+/* The following two types have to be signed and unsigned integer type
+   wide enough to hold a value of a pointer.  For most ANSI compilers
+   ptrdiff_t and size_t should be likely OK.  Still size of these two
+   types is 2 for Microsoft C.  Ugh... */
+typedef long int s_reg_t;
+typedef unsigned long int active_reg_t;
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings are chosen so that Emacs syntax
+   remains the value 0.  The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+typedef unsigned long int reg_syntax_t;
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals.
+   If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+        ^  is an anchor if it is at the beginning of a regular
+           expression or after an open-group or an alternation operator;
+        $  is an anchor if it is at the end of a regular expression, or
+           before a close-group or an alternation operator.
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically,
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES.
+   If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+   If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+   without further backtracking.  */
+#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+   If not set, then the GNU regex operators are recognized. */
+#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+   If not set, and debugging was on, turn it off.
+   This only works if regex.c is compiled -DDEBUG.
+   We define this bit always, so that all that's needed to turn on
+   debugging is to recompile regex.c; the calling code can always have
+   this bit set, and it won't affect anything in the normal case. */
+#define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, a syntactically invalid interval is treated as
+   a string of ordinary characters.  For example, the ERE 'a{1' is
+   treated as 'a\{1'.  */
+#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+\f
+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS 0
+
+#define RE_SYNTAX_AWK                                                  \
+  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL                    \
+   | RE_NO_BK_PARENS              | RE_NO_BK_REFS                      \
+   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES                 \
+   | RE_DOT_NEWLINE              | RE_CONTEXT_INDEP_ANCHORS            \
+   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GNU_AWK                                              \
+  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)        \
+   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS           \
+       | RE_CONTEXT_INVALID_OPS ))
+
+#define RE_SYNTAX_POSIX_AWK                                            \
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS             \
+   | RE_INTERVALS          | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GREP                                                 \
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES                                \
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS                           \
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP                                                        \
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS                   \
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE                   \
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS                            \
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP                                          \
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES                    \
+   | RE_INVALID_INTERVAL_ORD)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON                                                \
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL             \
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC                                          \
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC                                  \
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED                                       \
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
+   | RE_CONTEXT_INDEP_OPS   | RE_NO_BK_BRACES                          \
+   | RE_NO_BK_PARENS        | RE_NO_BK_VBAR                            \
+   | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+   removed and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED                               \
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES                          \
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS                            \
+   | RE_NO_BK_VBAR         | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+\f
+/* Maximum number of duplicates an interval can allow.  Some systems
+   (erroneously) define this in other header files, but we want our
+   value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+#endif
+/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
+#define RE_DUP_MAX (0x7fff)
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+
+/* If any error codes are removed, changed, or added, update the
+   `re_error_msg' table in regex.c.  */
+typedef enum
+{
+#ifdef _XOPEN_SOURCE
+  REG_ENOSYS = -1,     /* This will never happen for this implementation.  */
+#endif
+
+  REG_NOERROR = 0,     /* Success.  */
+  REG_NOMATCH,         /* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+  REG_BADPAT,          /* Invalid pattern.  */
+  REG_ECOLLATE,                /* Not implemented.  */
+  REG_ECTYPE,          /* Invalid character class name.  */
+  REG_EESCAPE,         /* Trailing backslash.  */
+  REG_ESUBREG,         /* Invalid back reference.  */
+  REG_EBRACK,          /* Unmatched left bracket.  */
+  REG_EPAREN,          /* Parenthesis imbalance.  */
+  REG_EBRACE,          /* Unmatched \{.  */
+  REG_BADBR,           /* Invalid contents of \{\}.  */
+  REG_ERANGE,          /* Invalid range end.  */
+  REG_ESPACE,          /* Ran out of memory.  */
+  REG_BADRPT,          /* No preceding re for repetition op.  */
+
+  /* Error codes we've added.  */
+  REG_EEND,            /* Premature end.  */
+  REG_ESIZE,           /* Compiled pattern bigger than 2^16 bytes.  */
+  REG_ERPAREN          /* Unmatched ) or \); not returned from regcomp.  */
+} reg_errcode_t;
+\f
+/* This data structure represents a compiled pattern.  Before calling
+   the pattern compiler, the fields `buffer', `allocated', `fastmap',
+   `translate', and `no_sub' can be set.  After the pattern has been
+   compiled, the `re_nsub' field is available.  All other fields are
+   private to the regex routines.  */
+
+#ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE char *
+#endif
+
+struct re_pattern_buffer
+{
+/* [[[begin pattern_buffer]]] */
+       /* Space that holds the compiled pattern.  It is declared as
+          `unsigned char *' because its elements are
+           sometimes used as array indexes.  */
+  unsigned char *buffer;
+
+       /* Number of bytes to which `buffer' points.  */
+  unsigned long int allocated;
+
+       /* Number of bytes actually used in `buffer'.  */
+  unsigned long int used;
+
+        /* Syntax setting with which the pattern was compiled.  */
+  reg_syntax_t syntax;
+
+        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+           the fastmap, if there is one, to skip over impossible
+           starting points for matches.  */
+  char *fastmap;
+
+        /* Either a translate table to apply to all characters before
+           comparing them, or zero for no translation.  The translation
+           is applied to a pattern when it is compiled and to a string
+           when it is matched.  */
+  RE_TRANSLATE_TYPE translate;
+
+       /* Number of subexpressions found by the compiler.  */
+  size_t re_nsub;
+
+        /* Zero if this pattern cannot match the empty string, one else.
+           Well, in truth it's used only in `re_search_2', to see
+           whether or not we should use the fastmap, so we don't set
+           this absolutely perfectly; see `re_compile_fastmap' (the
+           `duplicate' case).  */
+  unsigned can_be_null : 1;
+
+        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+             for `max (RE_NREGS, re_nsub + 1)' groups.
+           If REGS_REALLOCATE, reallocate space if necessary.
+           If REGS_FIXED, use what's there.  */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+  unsigned regs_allocated : 2;
+
+        /* Set to zero when `regex_compile' compiles a pattern; set to one
+           by `re_compile_fastmap' if it updates the fastmap.  */
+  unsigned fastmap_accurate : 1;
+
+        /* If set, `re_match_2' does not return information about
+           subexpressions.  */
+  unsigned no_sub : 1;
+
+        /* If set, a beginning-of-line anchor doesn't match at the
+           beginning of the string.  */
+  unsigned not_bol : 1;
+
+        /* Similarly for an end-of-line anchor.  */
+  unsigned not_eol : 1;
+
+        /* If true, an anchor at a newline matches.  */
+  unsigned newline_anchor : 1;
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+\f
+/* Type for byte offsets within the string.  POSIX mandates this.  */
+typedef int regoff_t;
+
+
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers
+{
+  unsigned num_regs;
+  regoff_t *start;
+  regoff_t *end;
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+   `re_match_2' returns information about at least this many registers
+   the first time a `regs' structure is passed.  */
+#ifndef RE_NREGS
+# define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers.  Aside from the different names than
+   `re_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct
+{
+  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+\f
+/* Declarations for routines.  */
+
+/* To avoid duplicating every routine declaration -- once with a
+   prototype (if we are ANSI), and once without (if we aren't) -- we
+   use the following macro to declare argument types.  This
+   unfortunately clutters up the declarations a bit, but I think it's
+   worth it.  */
+
+#if __STDC__
+
+# define _RE_ARGS(args) args
+
+#else /* not __STDC__ */
+
+# define _RE_ARGS(args) ()
+
+#endif /* not __STDC__ */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+   You can also simply assign to the `re_syntax_options' variable.  */
+extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
+
+/* Compile the regular expression PATTERN, with length LENGTH
+   and syntax given by the global `re_syntax_options', into the buffer
+   BUFFER.  Return NULL if successful, and an error string if not.  */
+extern const char *re_compile_pattern
+  _RE_ARGS ((const char *pattern, size_t length,
+             struct re_pattern_buffer *buffer));
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+   accelerate searches.  Return 0 if successful and -2 if was an
+   internal error.  */
+extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+   compiled into BUFFER.  Start searching at position START, for RANGE
+   characters.  Return the starting position of the match, -1 for no
+   match, or -2 for an internal error.  Also return register
+   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+extern int re_search
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+            int length, int start, int range, struct re_registers *regs));
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+   STRING2.  Also, stop searching at index START + STOP.  */
+extern int re_search_2
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+             int length1, const char *string2, int length2,
+             int start, int range, struct re_registers *regs, int stop));
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+   in BUFFER matched, starting at position START.  */
+extern int re_match
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+             int length, int start, struct re_registers *regs));
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+extern int re_match_2
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+             int length1, const char *string2, int length2,
+             int start, struct re_registers *regs, int stop));
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+   for recording register information.  STARTS and ENDS must be
+   allocated with malloc, and must each be at least `NUM_REGS * sizeof
+   (regoff_t)' bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+extern void re_set_registers
+  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
+             unsigned num_regs, regoff_t *starts, regoff_t *ends));
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility.  */
+extern char *re_comp _RE_ARGS ((const char *));
+extern int re_exec _RE_ARGS ((const char *));
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+   "restrict", and "configure" may have defined "restrict".  */
+#ifndef __restrict
+# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
+#  if defined restrict || 199901L <= __STDC_VERSION__
+#   define __restrict restrict
+#  else
+#   define __restrict
+#  endif
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax.  */
+#ifndef __restrict_arr
+# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
+#  define __restrict_arr __restrict
+# else
+#  define __restrict_arr
+# endif
+#endif
+
+/* POSIX compatibility.  */
+extern int regcomp _RE_ARGS ((regex_t *__restrict __preg,
+                             const char *__restrict __pattern,
+                             int __cflags));
+
+extern int regexec _RE_ARGS ((const regex_t *__restrict __preg,
+                             const char *__restrict __string, size_t __nmatch,
+                             regmatch_t __pmatch[__restrict_arr],
+                             int __eflags));
+
+extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg,
+                                 char *__errbuf, size_t __errbuf_size));
+
+extern void regfree _RE_ARGS ((regex_t *__preg));
+
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
+
+#endif /* regex.h */
+\f
+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
diff --git a/include/assuan.h b/include/assuan.h
new file mode 100644 (file)
index 0000000..683f55b
--- /dev/null
@@ -0,0 +1,262 @@
+/* assuan.c - Definitions for the Assuan protocol
+ *     Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+ *     Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan.  For the standalone version
+   of gnupg we only need the ability to connect to a server, so we
+   dropped everything else and maintain this separate copy. */
+
+#ifndef ASSUAN_H
+#define ASSUAN_H
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+typedef enum
+{
+  ASSUAN_No_Error = 0,
+  ASSUAN_General_Error = 1,
+  ASSUAN_Out_Of_Core = 2,
+  ASSUAN_Invalid_Value = 3,
+  ASSUAN_Timeout = 4,
+  ASSUAN_Read_Error = 5,
+  ASSUAN_Write_Error = 6,
+  ASSUAN_Problem_Starting_Server = 7,
+  ASSUAN_Not_A_Server = 8,
+  ASSUAN_Not_A_Client = 9,
+  ASSUAN_Nested_Commands = 10,
+  ASSUAN_Invalid_Response = 11,
+  ASSUAN_No_Data_Callback = 12,
+  ASSUAN_No_Inquire_Callback = 13,
+  ASSUAN_Connect_Failed = 14,
+  ASSUAN_Accept_Failed = 15,
+
+  /* Error codes above 99 are meant as status codes */
+  ASSUAN_Not_Implemented = 100,
+  ASSUAN_Server_Fault    = 101,
+  ASSUAN_Invalid_Command = 102,
+  ASSUAN_Unknown_Command = 103,
+  ASSUAN_Syntax_Error    = 104,
+  ASSUAN_Parameter_Error = 105,
+  ASSUAN_Parameter_Conflict = 106,
+  ASSUAN_Line_Too_Long = 107,
+  ASSUAN_Line_Not_Terminated = 108,
+  ASSUAN_No_Input = 109,
+  ASSUAN_No_Output = 110,
+  ASSUAN_Canceled = 111,
+  ASSUAN_Unsupported_Algorithm = 112,
+  ASSUAN_Server_Resource_Problem = 113,
+  ASSUAN_Server_IO_Error = 114,
+  ASSUAN_Server_Bug = 115,
+  ASSUAN_No_Data_Available = 116,
+  ASSUAN_Invalid_Data = 117,
+  ASSUAN_Unexpected_Command = 118,
+  ASSUAN_Too_Much_Data = 119,
+  ASSUAN_Inquire_Unknown = 120,
+  ASSUAN_Inquire_Error = 121,
+  ASSUAN_Invalid_Option = 122,
+  ASSUAN_Invalid_Index = 123,
+  ASSUAN_Unexpected_Status = 124,
+  ASSUAN_Unexpected_Data = 125,
+  ASSUAN_Invalid_Status = 126,
+  ASSUAN_Locale_Problem = 127,
+  ASSUAN_Not_Confirmed = 128,
+
+  /* Error codes in the range 1000 to 9999 may be used by applications
+     at their own discretion. */
+  ASSUAN_USER_ERROR_FIRST = 1000,
+  ASSUAN_USER_ERROR_LAST = 9999
+
+} assuan_error_t;
+
+
+#define ASSUAN_LINELENGTH 1002 /* 1000 + [CR,]LF */
+
+struct assuan_context_s;
+typedef struct assuan_context_s *assuan_context_t;
+
+/*-- assuan-handler.c --*/
+int assuan_register_command (assuan_context_t ctx,
+                             const char *cmd_string,
+                             int (*handler)(assuan_context_t, char *));
+int assuan_register_bye_notify (assuan_context_t ctx,
+                                void (*fnc)(assuan_context_t));
+int assuan_register_reset_notify (assuan_context_t ctx,
+                                  void (*fnc)(assuan_context_t));
+int assuan_register_cancel_notify (assuan_context_t ctx,
+                                   void (*fnc)(assuan_context_t));
+int assuan_register_input_notify (assuan_context_t ctx,
+                                  void (*fnc)(assuan_context_t, const char *));
+int assuan_register_output_notify (assuan_context_t ctx,
+                                  void (*fnc)(assuan_context_t, const char *));
+
+int assuan_register_option_handler (assuan_context_t ctx,
+                                    int (*fnc)(assuan_context_t,
+                                               const char*, const char*));
+
+int assuan_process (assuan_context_t ctx);
+int assuan_process_next (assuan_context_t ctx);
+int assuan_get_active_fds (assuan_context_t ctx, int what,
+                           int *fdarray, int fdarraysize);
+
+
+FILE *assuan_get_data_fp (assuan_context_t ctx);
+assuan_error_t assuan_set_okay_line (assuan_context_t ctx, const char *line);
+assuan_error_t assuan_write_status (assuan_context_t ctx,
+                                    const char *keyword, const char *text);
+
+/* Negotiate a file descriptor.  If LINE contains "FD=N", returns N
+   assuming a local file descriptor.  If LINE contains "FD" reads a
+   file descriptor via CTX and stores it in *RDF (the CTX must be
+   capable of passing file descriptors).  */
+assuan_error_t assuan_command_parse_fd (assuan_context_t ctx, char *line,
+                                    int *rfd);
+
+/*-- assuan-listen.c --*/
+assuan_error_t assuan_set_hello_line (assuan_context_t ctx, const char *line);
+assuan_error_t assuan_accept (assuan_context_t ctx);
+int assuan_get_input_fd (assuan_context_t ctx);
+int assuan_get_output_fd (assuan_context_t ctx);
+assuan_error_t assuan_close_input_fd (assuan_context_t ctx);
+assuan_error_t assuan_close_output_fd (assuan_context_t ctx);
+
+
+/*-- assuan-pipe-server.c --*/
+int assuan_init_pipe_server (assuan_context_t *r_ctx, int filedes[2]);
+void assuan_deinit_server (assuan_context_t ctx);
+
+/*-- assuan-socket-server.c --*/
+int assuan_init_socket_server (assuan_context_t *r_ctx, int listen_fd);
+int assuan_init_connected_socket_server (assuan_context_t *r_ctx, int fd);
+
+
+/*-- assuan-pipe-connect.c --*/
+assuan_error_t assuan_pipe_connect (assuan_context_t *ctx, const char *name,
+                                 char *const argv[], int *fd_child_list);
+assuan_error_t assuan_pipe_connect2 (assuan_context_t *ctx, const char *name,
+                                     char *const argv[], int *fd_child_list,
+                                     void (*atfork) (void*, int),
+                                     void *atforkvalue);
+/*-- assuan-socket-connect.c --*/
+assuan_error_t assuan_socket_connect (assuan_context_t *ctx, const char *name,
+                                      pid_t server_pid);
+
+/*-- assuan-domain-connect.c --*/
+
+/* Connect to a Unix domain socket server.  RENDEZVOUSFD is
+   bidirectional file descriptor (normally returned via socketpair)
+   which the client can use to rendezvous with the server.  SERVER s
+   the server's pid.  */
+assuan_error_t assuan_domain_connect (assuan_context_t *r_ctx,
+                                  int rendezvousfd,
+                                  pid_t server);
+
+/*-- assuan-domain-server.c --*/
+
+/* RENDEZVOUSFD is a bidirectional file descriptor (normally returned
+   via socketpair) that the domain server can use to rendezvous with
+   the client.  CLIENT is the client's pid.  */
+assuan_error_t assuan_init_domain_server (assuan_context_t *r_ctx,
+                                      int rendezvousfd,
+                                      pid_t client);
+
+
+/*-- assuan-connect.c --*/
+void assuan_disconnect (assuan_context_t ctx);
+pid_t assuan_get_pid (assuan_context_t ctx);
+
+/*-- assuan-client.c --*/
+assuan_error_t 
+assuan_transact (assuan_context_t ctx,
+                 const char *command,
+                 assuan_error_t (*data_cb)(void *, const void *, size_t),
+                 void *data_cb_arg,
+                 assuan_error_t (*inquire_cb)(void*, const char *),
+                 void *inquire_cb_arg,
+                 assuan_error_t (*status_cb)(void*, const char *),
+                 void *status_cb_arg);
+assuan_error_t 
+assuan_transact2 (assuan_context_t ctx,
+                  const char *command,
+                  assuan_error_t (*data_cb)(void *, const void *, size_t),
+                  void *data_cb_arg,
+                  assuan_error_t (*inquire_cb)(void*, const char *),
+                  void *inquire_cb_arg,
+                  assuan_error_t (*status_cb)(void*, const char *),
+                  void *status_cb_arg,
+                  assuan_error_t (*okay_cb)(void*, const char *),
+                  void *okay_cb_arg);
+
+
+/*-- assuan-inquire.c --*/
+assuan_error_t assuan_inquire (assuan_context_t ctx, const char *keyword,
+                            unsigned char **r_buffer, size_t *r_length,
+                            size_t maxlen);
+
+/*-- assuan-buffer.c --*/
+assuan_error_t assuan_read_line (assuan_context_t ctx,
+                              char **line, size_t *linelen);
+int assuan_pending_line (assuan_context_t ctx);
+assuan_error_t assuan_write_line (assuan_context_t ctx, const char *line );
+assuan_error_t assuan_send_data (assuan_context_t ctx,
+                              const void *buffer, size_t length);
+
+/*-- assuan-util.c --*/
+void assuan_set_malloc_hooks ( void *(*new_alloc_func)(size_t n),
+                               void *(*new_realloc_func)(void *p, size_t n),
+                               void (*new_free_func)(void*) );
+void assuan_set_log_stream (assuan_context_t ctx, FILE *fp);
+int assuan_set_error (assuan_context_t ctx, int err, const char *text);
+void assuan_set_pointer (assuan_context_t ctx, void *pointer);
+void *assuan_get_pointer (assuan_context_t ctx);
+
+void assuan_begin_confidential (assuan_context_t ctx);
+void assuan_end_confidential (assuan_context_t ctx);
+
+/*-- assuan-errors.c (built) --*/
+const char *assuan_strerror (assuan_error_t err);
+
+/*-- assuan-logging.c --*/
+
+/* Set the stream to which assuan should log message not associated
+   with a context.  By default, this is stderr.  The default value
+   will be changed when the first log stream is associated with a
+   context.  Note, that this function is not thread-safe and should
+   in general be used right at startup. */
+extern void assuan_set_assuan_log_stream (FILE *fp);
+
+/* Return the stream which is currently being using for global logging.  */
+extern FILE *assuan_get_assuan_log_stream (void);
+
+/* Set the prefix to be used at the start of a line emitted by assuan
+   on the log stream.  The default is the empty string.  Note, that
+   this function is not thread-safe and should in general be used
+   right at startup. */
+void assuan_set_assuan_log_prefix (const char *text);
+
+/* Return a prefix to be used at the start of a line emitted by assuan
+   on the log stream.  The default implementation returns the empty
+   string, i.e. ""  */
+const char *assuan_get_assuan_log_prefix (void);
+
+#endif /* ASSUAN_H */
diff --git a/include/cipher.h b/include/cipher.h
new file mode 100644 (file)
index 0000000..5b531cc
--- /dev/null
@@ -0,0 +1,209 @@
+/* cipher.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_CIPHER_H
+#define G10_CIPHER_H
+
+#define DBG_CIPHER g10c_debug_mode
+
+#include "mpi.h"
+#include "../cipher/random.h"
+
+
+#define CIPHER_ALGO_NONE        0
+#define CIPHER_ALGO_IDEA        1
+#define CIPHER_ALGO_3DES        2
+#define CIPHER_ALGO_CAST5       3
+#define CIPHER_ALGO_BLOWFISH    4  /* blowfish 128 bit key */
+/* 5 & 6 are reserved */
+#define CIPHER_ALGO_AES          7
+#define CIPHER_ALGO_AES192       8
+#define CIPHER_ALGO_AES256       9
+#define CIPHER_ALGO_TWOFISH    10  /* twofish 256 bit */
+#define CIPHER_ALGO_DUMMY      110  /* no encryption at all */
+
+#define PUBKEY_ALGO_RSA        1
+#define PUBKEY_ALGO_RSA_E      2     /* RSA encrypt only */
+#define PUBKEY_ALGO_RSA_S      3     /* RSA sign only */
+#define PUBKEY_ALGO_ELGAMAL_E 16     /* encrypt only ElGamal (but not for v3)*/
+#define PUBKEY_ALGO_DSA       17
+#define PUBKEY_ALGO_ELGAMAL   20     /* sign and encrypt elgamal */
+
+#define PUBKEY_USAGE_SIG     1     /* key is good for signatures */
+#define PUBKEY_USAGE_ENC     2     /* key is good for encryption */
+#define PUBKEY_USAGE_CERT    4      /* key is also good to certify other keys*/
+#define PUBKEY_USAGE_AUTH    8      /* key is good for authentication */
+#define PUBKEY_USAGE_UNKNOWN 128    /* key has an unknown usage bit */
+
+#define DIGEST_ALGO_MD5       1
+#define DIGEST_ALGO_SHA1      2
+#define DIGEST_ALGO_RMD160    3
+/* 4, 5, 6, and 7 are reserved */
+#define DIGEST_ALGO_SHA256    8
+#define DIGEST_ALGO_SHA384    9
+#define DIGEST_ALGO_SHA512   10
+#define DIGEST_ALGO_SHA224   11
+
+#define COMPRESS_ALGO_NONE   0
+#define COMPRESS_ALGO_ZIP    1
+#define COMPRESS_ALGO_ZLIB   2
+#define COMPRESS_ALGO_BZIP2  3
+
+#define is_RSA(a)     ((a)==PUBKEY_ALGO_RSA || (a)==PUBKEY_ALGO_RSA_E \
+                      || (a)==PUBKEY_ALGO_RSA_S )
+#define is_ELGAMAL(a) ((a)==PUBKEY_ALGO_ELGAMAL_E)
+#define is_DSA(a)     ((a)==PUBKEY_ALGO_DSA)
+
+typedef struct
+{
+  int algo;
+  int keylen;
+  int algo_info_printed;
+  int use_mdc;
+  int symmetric;
+  byte key[32]; /* this is the largest used keylen (256 bit) */
+} DEK;
+
+struct cipher_handle_s;
+typedef struct cipher_handle_s *CIPHER_HANDLE;
+
+
+#define CIPHER_MODE_ECB       1
+#define CIPHER_MODE_CFB       2
+#define CIPHER_MODE_PHILS_CFB 3
+#define CIPHER_MODE_AUTO_CFB  4
+#define CIPHER_MODE_DUMMY     5  /* used with algo DUMMY for no encryption */
+#define CIPHER_MODE_CBC       6
+
+struct md_digest_list_s;
+
+struct gcry_md_context {
+    int  secure;
+    FILE  *debug;
+    int finalized;
+    struct md_digest_list_s *list;
+    int  bufcount;
+    int  bufsize;
+    byte buffer[1];
+};
+
+typedef struct gcry_md_context *MD_HANDLE;
+
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+#if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+#define EXTERN_UNLESS_MAIN_MODULE extern
+#else
+#define EXTERN_UNLESS_MAIN_MODULE 
+#endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE int g10c_debug_mode;
+EXTERN_UNLESS_MAIN_MODULE int g10_opt_verbose;
+EXTERN_UNLESS_MAIN_MODULE const char *g10_opt_homedir;
+
+
+/*-- dynload.c --*/
+void register_cipher_extension( const char *mainpgm, const char *fname );
+
+/*-- md.c --*/
+int string_to_digest_algo( const char *string );
+const char * digest_algo_to_string( int algo );
+int check_digest_algo( int algo );
+MD_HANDLE md_open( int algo, int secure );
+void md_enable( MD_HANDLE hd, int algo );
+MD_HANDLE md_copy( MD_HANDLE a );
+void md_reset( MD_HANDLE a );
+void md_close(MD_HANDLE a);
+void md_write( MD_HANDLE a, const byte *inbuf, size_t inlen);
+void md_final(MD_HANDLE a);
+byte *md_read( MD_HANDLE a, int algo );
+int md_digest( MD_HANDLE a, int algo, byte *buffer, int buflen );
+int md_get_algo( MD_HANDLE a );
+int md_algo_present( MD_HANDLE a, int algo );
+int md_digest_length( int algo );
+const byte *md_asn_oid( int algo, size_t *asnlen, size_t *mdlen );
+void md_start_debug( MD_HANDLE a, const char *suffix );
+void md_stop_debug( MD_HANDLE a );
+#define md_is_secure(a) ((a)->secure)
+#define md_putc(h,c)  \
+           do {                                            \
+               if( (h)->bufcount == (h)->bufsize )         \
+                   md_write( (h), NULL, 0 );               \
+               (h)->buffer[(h)->bufcount++] = (c) & 0xff;  \
+           } while(0)
+
+void rmd160_hash_buffer (char *outbuf, const char *buffer, size_t length);
+
+
+/*-- cipher.c --*/
+int string_to_cipher_algo( const char *string );
+const char * cipher_algo_to_string( int algo );
+void disable_cipher_algo( int algo );
+int check_cipher_algo( int algo );
+unsigned cipher_get_keylen( int algo );
+unsigned cipher_get_blocksize( int algo );
+CIPHER_HANDLE cipher_open( int algo, int mode, int secure );
+void cipher_close( CIPHER_HANDLE c );
+int  cipher_setkey( CIPHER_HANDLE c, byte *key, unsigned keylen );
+void cipher_setiv( CIPHER_HANDLE c, const byte *iv, unsigned ivlen );
+void cipher_encrypt( CIPHER_HANDLE c, byte *out, byte *in, unsigned nbytes );
+void cipher_decrypt( CIPHER_HANDLE c, byte *out, byte *in, unsigned nbytes );
+void cipher_sync( CIPHER_HANDLE c );
+
+/*-- pubkey.c --*/
+#define PUBKEY_MAX_NPKEY  4
+#define PUBKEY_MAX_NSKEY  6
+#define PUBKEY_MAX_NSIG   2
+#define PUBKEY_MAX_NENC   2
+
+int string_to_pubkey_algo( const char *string );
+const char * pubkey_algo_to_string( int algo );
+void disable_pubkey_algo( int algo );
+int check_pubkey_algo( int algo );
+int check_pubkey_algo2( int algo, unsigned use );
+int pubkey_get_npkey( int algo );
+int pubkey_get_nskey( int algo );
+int pubkey_get_nsig( int algo );
+int pubkey_get_nenc( int algo );
+unsigned pubkey_nbits( int algo, MPI *pkey );
+int pubkey_generate( int algo, unsigned nbits, MPI *skey, MPI **retfactors );
+int dsa2_generate( int algo, unsigned nbits, unsigned qbits,
+                  MPI *skey, MPI **retfactors );
+int pubkey_check_secret_key( int algo, MPI *skey );
+int pubkey_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey );
+int pubkey_decrypt( int algo, MPI *result, MPI *data, MPI *skey );
+int pubkey_sign( int algo, MPI *resarr, MPI hash, MPI *skey );
+int pubkey_verify( int algo, MPI hash, MPI *data, MPI *pkey );
+
+/*-- smallprime.c --*/
+extern ushort small_prime_numbers[];
+
+/*-- primegen.c --*/
+void register_primegen_progress ( void (*cb)( void *, int), void *cb_data );
+MPI generate_secret_prime( unsigned nbits );
+MPI generate_public_prime( unsigned nbits );
+MPI generate_elg_prime( int mode, unsigned pbits, unsigned qbits,
+                                          MPI g, MPI **factors );
+
+/*-- elsewhere --*/
+void register_pk_dsa_progress ( void (*cb)( void *, int), void *cb_data );
+void register_pk_elg_progress ( void (*cb)( void *, int), void *cb_data );
+
+#endif /*G10_CIPHER_H*/
diff --git a/include/compat.h b/include/compat.h
new file mode 100644 (file)
index 0000000..f971ffa
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _COMPAT_H_
+#define _COMPAT_H_
+
+/* Note this isn't identical to a C locale isspace() without \f and
+   \v, but works for the purposes used here. */
+#define ascii_isspace(a) ((a)==' ' || (a)=='\n' || (a)=='\r' || (a)=='\t')
+
+int hextobyte( const char *s );
+
+#ifndef HAVE_STRSEP
+char *strsep (char **stringp, const char *delim);
+#endif
+
+#endif /* !_COMPAT_H_ */
diff --git a/include/distfiles b/include/distfiles
new file mode 100644 (file)
index 0000000..1f85370
--- /dev/null
@@ -0,0 +1,18 @@
+cipher.h
+errors.h
+iobuf.h
+memory.h
+mpi.h
+ttyio.h
+types.h
+util.h
+i18n.h
+host2net.h
+http.h
+keyserver.h
+_regex.h
+dynload.h
+assuan.h
+compat.h
+
+ChangeLog
diff --git a/include/dynload.h b/include/dynload.h
new file mode 100644 (file)
index 0000000..acdf5c8
--- /dev/null
@@ -0,0 +1,72 @@
+/* dlfcn.h - W32 functions for run-time dynamic loading
+ *      Copyright (C) 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef GNUPG_DYNLOAD_H
+#define GNUPG_DYNLOAD_H
+#if defined (ENABLE_CARD_SUPPORT) || defined(_WIN32)
+#ifndef _WIN32
+#include <dlfcn.h>
+#else
+#include <windows.h>
+
+#define RTLD_LAZY 0
+
+static __inline__ void *
+dlopen (const char * name, int flag)
+{
+  void * hd = LoadLibrary (name);
+  return hd;
+}
+
+static __inline__ void *
+dlsym (void * hd, const char * sym)
+{
+  if (hd && sym)
+    {
+      void * fnc = GetProcAddress (hd, sym);
+      if (!fnc)
+        return NULL;
+      return fnc;
+    }
+  return NULL;
+}
+
+
+static __inline__ const char *
+dlerror (void)
+{
+  return w32_strerror (0);
+}
+
+
+static __inline__ int
+dlclose (void * hd)
+{
+  if (hd)
+    {
+      FreeLibrary (hd);
+      return 0;
+    }
+  return -1;
+}  
+#endif /*_WIN32*/
+#endif /*ENABLE_CARD_SUPPORT||_WIN32*/
+#endif /*GNUPG_DYNLOAD_H*/
diff --git a/include/errors.h b/include/errors.h
new file mode 100644 (file)
index 0000000..177353b
--- /dev/null
@@ -0,0 +1,91 @@
+/* errors.h - erro code
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_ERRORS_H
+#define G10_ERRORS_H
+
+#define G10ERR_GENERAL        1
+#define G10ERR_UNKNOWN_PACKET  2
+#define G10ERR_UNKNOWN_VERSION 3 /* Unknown version (in packet) */
+#define G10ERR_PUBKEY_ALGO     4 /* Unknown pubkey algorithm */
+#define G10ERR_DIGEST_ALGO     5 /* Unknown digest algorithm */
+#define G10ERR_BAD_PUBKEY      6 /* Bad public key */
+#define G10ERR_BAD_SECKEY      7 /* Bad secret key */
+#define G10ERR_BAD_SIGN        8 /* Bad signature */
+#define G10ERR_NO_PUBKEY       9 /* public key not found */
+#define G10ERR_CHECKSUM       10 /* checksum error */
+#define G10ERR_BAD_PASS       11 /* Bad passphrase */
+#define G10ERR_CIPHER_ALGO    12 /* Unknown cipher algorithm */
+#define G10ERR_KEYRING_OPEN   13
+#define G10ERR_INVALID_PACKET 14
+#define G10ERR_INVALID_ARMOR  15
+#define G10ERR_NO_USER_ID     16
+#define G10ERR_NO_SECKEY      17 /* secret key not available */
+#define G10ERR_WRONG_SECKEY   18 /* wrong seckey used */
+#define G10ERR_UNSUPPORTED    19
+#define G10ERR_BAD_KEY       20 /* bad (session) key */
+#define G10ERR_READ_FILE      21
+#define G10ERR_WRITE_FILE     22
+#define G10ERR_COMPR_ALGO     23 /* Unknown compress algorithm */
+#define G10ERR_OPEN_FILE      24
+#define G10ERR_CREATE_FILE    25
+#define G10ERR_PASSPHRASE     26 /* invalid passphrase */
+#define G10ERR_NI_PUBKEY      27
+#define G10ERR_NI_CIPHER      28
+#define G10ERR_SIG_CLASS      29
+#define G10ERR_BAD_MPI       30
+#define G10ERR_RESOURCE_LIMIT 31
+#define G10ERR_INV_KEYRING    32
+#define G10ERR_TRUSTDB       33 /* a problem with the trustdb */
+#define G10ERR_BAD_CERT       34 /* bad certicate */
+#define G10ERR_INV_USER_ID    35
+#define G10ERR_CLOSE_FILE     36
+#define G10ERR_RENAME_FILE    37
+#define G10ERR_DELETE_FILE    38
+#define G10ERR_UNEXPECTED     39
+#define G10ERR_TIME_CONFLICT  40
+#define G10ERR_WR_PUBKEY_ALGO 41 /* unusabe pubkey algo */
+#define G10ERR_FILE_EXISTS    42
+#define G10ERR_WEAK_KEY       43 /* NOTE: hardcoded into the cipher modules */
+#define G10ERR_WRONG_KEYLEN   44 /* NOTE: hardcoded into the cipher modules */
+#define G10ERR_INV_ARG       45
+#define G10ERR_BAD_URI       46  /* syntax error in URI */
+#define G10ERR_INVALID_URI    47  /* e.g. unsupported scheme */
+#define G10ERR_NETWORK       48  /* general network error */
+#define G10ERR_UNKNOWN_HOST   49
+#define G10ERR_SELFTEST_FAILED 50
+#define G10ERR_NOT_ENCRYPTED  51
+#define G10ERR_NOT_PROCESSED  52
+#define G10ERR_UNU_PUBKEY     53
+#define G10ERR_UNU_SECKEY     54
+#define G10ERR_KEYSERVER      55
+#define G10ERR_CANCELED       56
+#define G10ERR_NO_CARD        57
+#define G10ERR_NO_DATA        58
+
+#ifndef HAVE_STRERROR
+char *strerror (int n);
+#endif
+
+#ifdef _WIN32
+const char * w32_strerror (int w32_errno);
+#endif
+
+#endif /*G10_ERRORS_H*/
diff --git a/include/host2net.h b/include/host2net.h
new file mode 100644 (file)
index 0000000..d72b828
--- /dev/null
@@ -0,0 +1,44 @@
+/* host2net.h - Some macros
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_HOST2NET_H
+#define G10_HOST2NET_H
+
+#include "types.h"
+
+#define buftoulong( p )  ((*(byte*)(p) << 24) | (*((byte*)(p)+1)<< 16) | \
+                      (*((byte*)(p)+2) << 8) | (*((byte*)(p)+3)))
+#define buftoushort( p )  ((*((byte*)(p)) << 8) | (*((byte*)(p)+1)))
+#define ulongtobuf( p, a ) do {                          \
+                           ((byte*)p)[0] = a >> 24;    \
+                           ((byte*)p)[1] = a >> 16;    \
+                           ((byte*)p)[2] = a >>  8;    \
+                           ((byte*)p)[3] = a      ;    \
+                       } while(0)
+#define ushorttobuf( p, a ) do {                          \
+                           ((byte*)p)[0] = a >>  8;    \
+                           ((byte*)p)[1] = a      ;    \
+                       } while(0)
+#define buftou32( p)   buftoulong( (p) )
+#define u32tobuf( p, a) ulongtobuf( (p), (a) )
+
+
+#endif /*G10_HOST2NET_H*/
diff --git a/include/http.h b/include/http.h
new file mode 100644 (file)
index 0000000..060b5b8
--- /dev/null
@@ -0,0 +1,87 @@
+/* http.h  -  HTTP protocol handler
+ * Copyright (C) 1999, 2000, 2001, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_HTTP_H
+#define G10_HTTP_H 1
+
+#include "iobuf.h"
+
+struct uri_tuple {
+    struct uri_tuple *next;
+    const char *name;  /* a pointer into name */
+    char  *value;      /* a pointer to value (a Nul is always appended) */
+    size_t valuelen;   /* and the real length of the value */
+                       /* because the value may contain embedded Nuls */
+};
+typedef struct uri_tuple *URI_TUPLE;
+
+struct parsed_uri {
+    /* all these pointers point into buffer; most stuff is not escaped */
+    char *scheme;      /* pointer to the scheme string (lowercase) */
+    char *auth;         /* username/password for basic auth */
+    char *host;        /* host (converted to lowercase) */
+    ushort port;       /* port (always set if the host is set) */
+    char *path;        /* the path */
+    URI_TUPLE params;  /* ";xxxxx" */
+    URI_TUPLE query;   /* "?xxx=yyy" */
+    char buffer[1];    /* buffer which holds a (modified) copy of the URI */
+};
+typedef struct parsed_uri *PARSED_URI;
+
+typedef enum {
+    HTTP_REQ_GET  = 1,
+    HTTP_REQ_HEAD = 2,
+    HTTP_REQ_POST = 3
+} HTTP_REQ_TYPE;
+
+/* put flag values into an enum, so that gdb can display them */
+enum
+  { 
+    HTTP_FLAG_NO_SHUTDOWN = 1,
+    HTTP_FLAG_TRY_SRV = 2
+  };
+
+struct http_context {
+    int initialized;
+    unsigned int status_code;
+    int sock;
+    int in_data;
+    IOBUF fp_read;
+    IOBUF fp_write;
+    int is_http_0_9;
+    PARSED_URI uri;
+    HTTP_REQ_TYPE req_type;
+    byte *buffer;         /* line buffer */
+    unsigned buffer_size;
+    unsigned int flags;
+};
+typedef struct http_context *HTTP_HD;
+
+int http_open( HTTP_HD hd, HTTP_REQ_TYPE reqtype, const char *url,
+              char *auth, unsigned int flags, const char *proxy );
+void http_start_data( HTTP_HD hd );
+int  http_wait_response( HTTP_HD hd, unsigned int *ret_status );
+void http_close( HTTP_HD hd );
+int http_open_document( HTTP_HD hd, const char *document, char *auth,
+                       unsigned int flags, const char *proxy );
+
+#endif /*G10_HTTP_H*/
diff --git a/include/i18n.h b/include/i18n.h
new file mode 100644 (file)
index 0000000..6abd2dc
--- /dev/null
@@ -0,0 +1,55 @@
+/* i18n.h
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_I18N_H
+#define G10_I18N_H
+
+#ifdef USE_SIMPLE_GETTEXT
+int set_gettext_file( const char *filename, const char *regkey );
+const char *gettext( const char *msgid );
+
+#define _(a) gettext (a)
+#define N_(a) (a)
+
+#else
+#ifdef HAVE_LOCALE_H
+#include <locale.h>    /* suggested by Ernst Molitor */
+#endif
+
+#ifdef ENABLE_NLS
+#ifndef __riscos__
+#include <libintl.h>
+#else
+#include "libgettext.h"
+#endif /* __riscos__ */
+#define _(a) gettext (a)
+#ifdef gettext_noop
+#define N_(a) gettext_noop (a)
+#else
+#define N_(a) (a)
+#endif
+#else
+#define _(a) (a)
+#define N_(a) (a)
+#endif
+#endif /* !USE_SIMPLE_GETTEXT */
+
+#endif /*G10_I18N_H*/
diff --git a/include/iobuf.h b/include/iobuf.h
new file mode 100644 (file)
index 0000000..a1d58c9
--- /dev/null
@@ -0,0 +1,163 @@
+/* iobuf.h - I/O buffer
+ * Copyright (C) 1998, 1999, 2000, 2001, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_IOBUF_H
+#define G10_IOBUF_H
+
+#include "types.h"
+
+
+#define DBG_IOBUF   iobuf_debug_mode
+
+#define IOBUFCTRL_INIT     1
+#define IOBUFCTRL_FREE     2
+#define IOBUFCTRL_UNDERFLOW 3
+#define IOBUFCTRL_FLUSH     4
+#define IOBUFCTRL_DESC     5
+#define IOBUFCTRL_CANCEL    6
+#define IOBUFCTRL_USER     16
+
+typedef struct iobuf_struct *IOBUF;
+typedef struct iobuf_struct *iobuf_t;
+
+/* fixme: we should hide most of this stuff */
+struct iobuf_struct {
+    int use;          /* 1 input , 2 output, 3 temp */
+    off_t nlimit;
+    off_t nbytes;      /* used together with nlimit */
+    off_t ntotal;      /* total bytes read (position of stream) */
+    int nofast;        /* used by the iobuf_get() */
+    void *directfp;
+    struct {
+       size_t size;   /* allocated size */
+       size_t start;  /* number of invalid bytes at the begin of the buffer */
+       size_t len;    /* currently filled to this size */
+       byte *buf;
+    } d;
+    int filter_eof;
+    int error;
+    int (*filter)( void *opaque, int control,
+                  IOBUF chain, byte *buf, size_t *len);
+    void *filter_ov;   /* value for opaque */
+    int filter_ov_owner;
+    char *real_fname;
+    IOBUF chain;       /* next iobuf used for i/o if any (passed to filter) */
+    int no, subno;
+    const char *desc;
+    void *opaque;      /* can be used to hold any information   */
+                      /* this value is copied to all instances */
+    struct {
+       size_t size;   /* allocated size */
+       size_t start;  /* number of invalid bytes at the begin of the buffer */
+       size_t len;    /* currently filled to this size */
+       byte *buf;
+    } unget;
+};
+
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+#if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+#define EXTERN_UNLESS_MAIN_MODULE extern
+#else
+#define EXTERN_UNLESS_MAIN_MODULE 
+#endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE int iobuf_debug_mode;
+
+void  iobuf_enable_special_filenames ( int yes );
+int   iobuf_is_pipe_filename (const char *fname);
+IOBUF iobuf_alloc(int use, size_t bufsize);
+IOBUF iobuf_temp(void);
+IOBUF iobuf_temp_with_content( const char *buffer, size_t length );
+IOBUF iobuf_open( const char *fname );
+IOBUF iobuf_fdopen( int fd, const char *mode );
+IOBUF iobuf_sockopen( int fd, const char *mode );
+IOBUF iobuf_create( const char *fname );
+IOBUF iobuf_append( const char *fname );
+IOBUF iobuf_openrw( const char *fname );
+int   iobuf_ioctl ( IOBUF a, int cmd, int intval, void *ptrval );
+int   iobuf_close( IOBUF iobuf );
+int   iobuf_cancel( IOBUF iobuf );
+
+int iobuf_push_filter( IOBUF a, int (*f)(void *opaque, int control,
+                      IOBUF chain, byte *buf, size_t *len), void *ov );
+int iobuf_push_filter2( IOBUF a,
+                   int (*f)(void *opaque, int control,
+                   IOBUF chain, byte *buf, size_t *len),
+                   void *ov, int rel_ov );
+int iobuf_flush(IOBUF a);
+void iobuf_clear_eof(IOBUF a);
+#define iobuf_set_error(a)    do { (a)->error = 1; } while(0)
+#define iobuf_error(a)       ((a)->error)
+
+void iobuf_set_limit( IOBUF a, off_t nlimit );
+
+off_t iobuf_tell( IOBUF a );
+int   iobuf_seek( IOBUF a, off_t newpos );
+
+int  iobuf_readbyte(IOBUF a);
+int  iobuf_read(IOBUF a, byte *buf, unsigned buflen );
+unsigned iobuf_read_line( IOBUF a, byte **addr_of_buffer,
+                         unsigned *length_of_buffer, unsigned *max_length );
+int  iobuf_peek(IOBUF a, byte *buf, unsigned buflen );
+int  iobuf_writebyte(IOBUF a, unsigned c);
+int  iobuf_write(IOBUF a, byte *buf, unsigned buflen );
+int  iobuf_writestr(IOBUF a, const char *buf );
+
+void iobuf_flush_temp( IOBUF temp );
+int  iobuf_write_temp( IOBUF a, IOBUF temp );
+size_t iobuf_temp_to_buffer( IOBUF a, byte *buffer, size_t buflen );
+void iobuf_unget_and_close_temp( IOBUF a, IOBUF temp );
+
+int  iobuf_get_fd (IOBUF a);
+off_t iobuf_get_filelength (IOBUF a, int *overflow);
+#define IOBUF_FILELENGTH_LIMIT 0xffffffff
+const char *iobuf_get_real_fname( IOBUF a );
+const char *iobuf_get_fname( IOBUF a );
+
+void iobuf_set_partial_block_mode( IOBUF a, size_t len );
+
+int iobuf_translate_file_handle ( int fd, int for_write );
+
+/* Get a byte form the iobuf; must check for eof prior to this function.
+ * This function returns values in the range 0 .. 255 or -1 to indicate EOF
+ * iobuf_get_noeof() does not return -1 to indicate EOF, but masks the
+ * returned value to be in the range 0..255.
+ */
+#define iobuf_get(a)  \
+     ( ((a)->nofast || (a)->d.start >= (a)->d.len )?  \
+       iobuf_readbyte((a)) : ( (a)->nbytes++, (a)->d.buf[(a)->d.start++] ) )
+#define iobuf_get_noeof(a)    (iobuf_get((a))&0xff)
+
+/* write a byte to the iobuf and return true on write error
+ * This macro does only write the low order byte
+ */
+#define iobuf_put(a,c) iobuf_writebyte(a,c)
+
+#define iobuf_where(a) "[don't know]"
+#define iobuf_id(a)    ((a)->no)
+
+#define iobuf_get_temp_buffer(a) ( (a)->d.buf )
+#define iobuf_get_temp_length(a) ( (a)->d.len )
+#define iobuf_is_temp(a)        ( (a)->use == 3 )
+
+void iobuf_skip_rest (IOBUF a, unsigned long n, int partial);
+
+#endif /*G10_IOBUF_H*/
diff --git a/include/keyserver.h b/include/keyserver.h
new file mode 100644 (file)
index 0000000..8900dbe
--- /dev/null
@@ -0,0 +1,44 @@
+/* keyserver.h
+ * Copyright (C) 2001, 2002, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef _KEYSERVER_H_
+#define _KEYSERVER_H_
+
+#define KEYSERVER_PROTO_VERSION    1
+
+/* These are usable for return codes for the gpgkeys_ process, and
+   also KEY FAILED codes. */
+#define KEYSERVER_OK               0 /* not an error */
+#define KEYSERVER_INTERNAL_ERROR   1 /* gpgkeys_ internal error */
+#define KEYSERVER_NOT_SUPPORTED    2 /* operation not supported */
+#define KEYSERVER_VERSION_ERROR    3 /* VERSION mismatch */
+#define KEYSERVER_GENERAL_ERROR    4 /* keyserver internal error */
+#define KEYSERVER_NO_MEMORY        5 /* out of memory */
+#define KEYSERVER_KEY_NOT_FOUND    6 /* key not found */
+#define KEYSERVER_KEY_EXISTS       7 /* key already exists */
+#define KEYSERVER_KEY_INCOMPLETE   8 /* key incomplete (EOF) */
+#define KEYSERVER_UNREACHABLE      9 /* unable to contact keyserver */
+#define KEYSERVER_TIMEOUT         10 /* timeout while accessing keyserver */
+
+/* Must be 127 due to shell internal magic. */
+#define KEYSERVER_SCHEME_NOT_FOUND 127
+
+#endif /* !_KEYSERVER_H_ */
diff --git a/include/memory.h b/include/memory.h
new file mode 100644 (file)
index 0000000..895d8a7
--- /dev/null
@@ -0,0 +1,101 @@
+/* memory.h - memory allocation
+ * Copyright (C) 1998, 1999, 2000, 2001, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_MEMORY_H
+#define G10_MEMORY_H
+
+#ifdef M_DEBUG
+#ifndef STR
+#define STR(v) #v
+#endif
+#ifndef __riscos__
+#define M_DBGINFO(a)       __FUNCTION__ "["__FILE__ ":"  STR(a) "]"
+#else /* __riscos__ */
+#define M_DBGINFO(a)        "["__FILE__ ":"  STR(a) "]"
+#endif /* __riscos__ */
+#define xmalloc(n)             m_debug_alloc((n), M_DBGINFO( __LINE__ ) )
+#define xmalloc_clear(n)       m_debug_alloc_clear((n), M_DBGINFO(__LINE__) )
+#define xmalloc_secure(n)      m_debug_alloc_secure(n), M_DBGINFO(__LINE__) )
+#define xmalloc_secure_clear(n) m_debug_alloc_secure_clear((n), M_DBGINFO(__LINE__) )
+#define xrealloc(n,m)          m_debug_realloc((n),(m), M_DBGINFO(__LINE__) )
+#define xfree(n)               m_debug_free((n), M_DBGINFO(__LINE__) )
+#define m_check(n)             m_debug_check((n), M_DBGINFO(__LINE__) )
+/*#define m_copy(a)              m_debug_copy((a), M_DBGINFO(__LINE__) )*/
+#define xstrdup(a)             m_debug_strdup((a), M_DBGINFO(__LINE__) )
+
+void *m_debug_alloc( size_t n, const char *info );
+void *m_debug_alloc_clear( size_t n, const char *info  );
+void *m_debug_alloc_secure( size_t n, const char *info );
+void *m_debug_alloc_secure_clear( size_t n, const char *info  );
+void *m_debug_realloc( void *a, size_t n, const char *info  );
+void m_debug_free( void *p, const char *info  );
+void m_debug_check( const void *a, const char *info );
+/*void *m_debug_copy( const void *a, const char *info );*/
+char *m_debug_strdup( const char *a, const char *info );
+
+#else
+void *xmalloc( size_t n );
+void *xmalloc_clear( size_t n );
+void *xmalloc_secure( size_t n );
+void *xmalloc_secure_clear( size_t n );
+void *xrealloc( void *a, size_t n );
+void xfree( void *p );
+void m_check( const void *a );
+/*void *m_copy( const void *a );*/
+char *xstrdup( const char * a);
+#endif
+
+size_t m_size( const void *a );
+void m_print_stats(const char *prefix);
+
+/* The follwing functions should be preferred over xmalloc_clear. */
+void *xcalloc (size_t n, size_t m);
+void *xcalloc_secure (size_t n, size_t m);
+
+
+/*-- secmem.c --*/
+int secmem_init( size_t npool );
+void secmem_term( void );
+void *secmem_malloc( size_t size );
+void *secmexrealloc( void *a, size_t newsize );
+void secmem_free( void *a );
+int  m_is_secure( const void *p );
+void secmem_dump_stats(void);
+void secmem_set_flags( unsigned flags );
+unsigned secmem_get_flags(void);
+
+
+#define DBG_MEMORY    memory_debug_mode
+#define DBG_MEMSTAT   memory_stat_debug_mode
+
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+#if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+#define EXTERN_UNLESS_MAIN_MODULE extern
+#else
+#define EXTERN_UNLESS_MAIN_MODULE 
+#endif
+#endif
+EXTERN_UNLESS_MAIN_MODULE int memory_debug_mode;
+EXTERN_UNLESS_MAIN_MODULE int memory_stat_debug_mode;
+
+
+
+#endif /*G10_MEMORY_H*/
diff --git a/include/mpi.h b/include/mpi.h
new file mode 100644 (file)
index 0000000..bec37ce
--- /dev/null
@@ -0,0 +1,197 @@
+/* mpi.h  -  Multi Precision Integers
+ *     Copyright (C) 1994, 1996, 1998, 1999,
+ *                    2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#ifndef G10_MPI_H
+#define G10_MPI_H
+
+#include <config.h>
+#include <stdio.h>
+#include "iobuf.h"
+#include "types.h"
+#include "memory.h"
+
+#if BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_INT
+  typedef unsigned int mpi_limb_t;
+  typedef   signed int mpi_limb_signed_t;
+#elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG
+  typedef unsigned long int mpi_limb_t;
+  typedef   signed long int mpi_limb_signed_t;
+#elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_LONG_LONG
+  typedef unsigned long long int mpi_limb_t;
+  typedef   signed long long int mpi_limb_signed_t;
+#elif BYTES_PER_MPI_LIMB == SIZEOF_UNSIGNED_SHORT
+  typedef unsigned short int mpi_limb_t;
+  typedef   signed short int mpi_limb_signed_t;
+#else
+#error BYTES_PER_MPI_LIMB does not match any C type
+#endif
+#define BITS_PER_MPI_LIMB    (8*BYTES_PER_MPI_LIMB)
+
+#ifndef EXTERN_UNLESS_MAIN_MODULE
+#if defined (__riscos__) && !defined (INCLUDED_BY_MAIN_MODULE)
+#define EXTERN_UNLESS_MAIN_MODULE extern
+#else
+#define EXTERN_UNLESS_MAIN_MODULE 
+#endif
+#endif
+
+#define DBG_MPI     mpi_debug_mode
+EXTERN_UNLESS_MAIN_MODULE int mpi_debug_mode;
+
+
+struct gcry_mpi {
+    int alloced;    /* array size (# of allocated limbs) */
+    int nlimbs;     /* number of valid limbs */
+    unsigned int nbits; /* the real number of valid bits (info only) */
+    int sign;      /* indicates a negative number */
+    unsigned flags; /* bit 0: array must be allocated in secure memory space */
+                   /* bit 1: not used */
+                   /* bit 2: the limb is a pointer to some xmalloced data */
+    mpi_limb_t *d;  /* array with the limbs */
+};
+
+typedef struct gcry_mpi *MPI;
+
+#define MPI_NULL NULL
+
+#define mpi_get_nlimbs(a)     ((a)->nlimbs)
+#define mpi_is_neg(a)        ((a)->sign)
+
+/*-- mpiutil.c --*/
+
+#ifdef M_DEBUG
+#define mpi_alloc(n)         mpi_debug_alloc((n), M_DBGINFO( __LINE__ ) )
+#define mpi_alloc_secure(n) mpi_debug_alloc_secure((n), M_DBGINFO( __LINE__ ) )
+#define mpi_alloc_like(n)   mpi_debug_alloc_like((n), M_DBGINFO( __LINE__ ) )
+#define mpi_free(a)          mpi_debug_free((a), M_DBGINFO(__LINE__) )
+#define mpi_resize(a,b)     mpi_debug_resize((a),(b), M_DBGINFO(__LINE__) )
+#define mpi_copy(a)          mpi_debug_copy((a), M_DBGINFO(__LINE__) )
+MPI mpi_debug_alloc( unsigned nlimbs, const char *info );
+MPI mpi_debug_alloc_secure( unsigned nlimbs, const char *info );
+MPI mpi_debug_alloc_like( MPI a, const char *info );
+void mpi_debug_free( MPI a, const char *info );
+void mpi_debug_resize( MPI a, unsigned nlimbs, const char *info );
+MPI  mpi_debug_copy( MPI a, const char *info   );
+#else
+MPI mpi_alloc( unsigned nlimbs );
+MPI mpi_alloc_secure( unsigned nlimbs );
+MPI mpi_alloc_like( MPI a );
+void mpi_free( MPI a );
+void mpi_resize( MPI a, unsigned nlimbs );
+MPI  mpi_copy( MPI a );
+#endif
+#define mpi_is_opaque(a) ((a) && ((a)->flags&4))
+MPI mpi_set_opaque( MPI a, void *p, unsigned int len );
+void *mpi_get_opaque( MPI a, unsigned int *len );
+#define mpi_is_secure(a) ((a) && ((a)->flags&1))
+void mpi_set_secure( MPI a );
+void mpi_clear( MPI a );
+void mpi_set( MPI w, MPI u);
+void mpi_set_ui( MPI w, ulong u);
+MPI  mpi_alloc_set_ui( unsigned long u);
+void mpi_m_check( MPI a );
+void mpi_swap( MPI a, MPI b);
+
+/*-- mpicoder.c --*/
+int mpi_write( IOBUF out, MPI a );
+#ifdef M_DEBUG
+#define mpi_read(a,b,c)   mpi_debug_read((a),(b),(c),  M_DBGINFO( __LINE__ ) )
+MPI mpi_debug_read(IOBUF inp, unsigned *nread, int secure, const char *info);
+#else
+MPI mpi_read(IOBUF inp, unsigned *nread, int secure);
+#endif
+MPI mpi_read_from_buffer(byte *buffer, unsigned *ret_nread, int secure);
+int mpi_fromstr(MPI val, const char *str);
+int mpi_print( FILE *fp, MPI a, int mode );
+void g10_log_mpidump( const char *text, MPI a );
+u32 mpi_get_keyid( MPI a, u32 *keyid );
+byte *mpi_get_buffer( MPI a, unsigned *nbytes, int *sign );
+byte *mpi_get_secure_buffer( MPI a, unsigned *nbytes, int *sign );
+void  mpi_set_buffer( MPI a, const byte *buffer, unsigned nbytes, int sign );
+
+#define log_mpidump g10_log_mpidump
+
+/*-- mpi-add.c --*/
+void mpi_add_ui(MPI w, MPI u, ulong v );
+void mpi_add(MPI w, MPI u, MPI v);
+void mpi_addm(MPI w, MPI u, MPI v, MPI m);
+void mpi_sub_ui(MPI w, MPI u, ulong v );
+void mpi_sub( MPI w, MPI u, MPI v);
+void mpi_subm( MPI w, MPI u, MPI v, MPI m);
+
+/*-- mpi-mul.c --*/
+void mpi_mul_ui(MPI w, MPI u, ulong v );
+void mpi_mul_2exp( MPI w, MPI u, ulong cnt);
+void mpi_mul( MPI w, MPI u, MPI v);
+void mpi_mulm( MPI w, MPI u, MPI v, MPI m);
+
+/*-- mpi-div.c --*/
+ulong mpi_fdiv_r_ui( MPI rem, MPI dividend, ulong divisor );
+void  mpi_fdiv_r( MPI rem, MPI dividend, MPI divisor );
+void  mpi_fdiv_q( MPI quot, MPI dividend, MPI divisor );
+void  mpi_fdiv_qr( MPI quot, MPI rem, MPI dividend, MPI divisor );
+void  mpi_tdiv_r( MPI rem, MPI num, MPI den);
+void  mpi_tdiv_qr( MPI quot, MPI rem, MPI num, MPI den);
+void  mpi_tdiv_q_2exp( MPI w, MPI u, unsigned count );
+int   mpi_divisible_ui(MPI dividend, ulong divisor );
+
+/*-- mpi-gcd.c --*/
+int mpi_gcd( MPI g, MPI a, MPI b );
+
+/*-- mpi-pow.c --*/
+void mpi_pow( MPI w, MPI u, MPI v);
+void mpi_powm( MPI res, MPI base, MPI exponent, MPI mod);
+
+/*-- mpi-mpow.c --*/
+void mpi_mulpowm( MPI res, MPI *basearray, MPI *exparray, MPI mod);
+
+/*-- mpi-cmp.c --*/
+int mpi_cmp_ui( MPI u, ulong v );
+int mpi_cmp( MPI u, MPI v );
+
+/*-- mpi-scan.c --*/
+int mpi_getbyte( MPI a, unsigned idx );
+void mpi_putbyte( MPI a, unsigned idx, int value );
+unsigned mpi_trailing_zeros( MPI a );
+
+/*-- mpi-bit.c --*/
+void mpi_normalize( MPI a );
+unsigned mpi_get_nbits( MPI a );
+int  mpi_test_bit( MPI a, unsigned n );
+void mpi_set_bit( MPI a, unsigned n );
+void mpi_set_highbit( MPI a, unsigned n );
+void mpi_clear_highbit( MPI a, unsigned n );
+void mpi_clear_bit( MPI a, unsigned n );
+void mpi_rshift( MPI x, MPI a, unsigned n );
+
+/*-- mpi-inv.c --*/
+void mpi_invm( MPI x, MPI u, MPI v );
+
+#endif /*G10_MPI_H*/
diff --git a/include/ttyio.h b/include/ttyio.h
new file mode 100644 (file)
index 0000000..2c52fc3
--- /dev/null
@@ -0,0 +1,59 @@
+/* ttyio.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_TTYIO_H
+#define G10_TTYIO_H
+
+#ifdef HAVE_LIBREADLINE
+#include <stdio.h>
+#include <readline/readline.h>
+#endif
+
+const char *tty_get_ttyname (void);
+int tty_batchmode( int onoff );
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
+ void tty_printf (const char *fmt, ... ) __attribute__ ((format (printf,1,2)));
+ void tty_fprintf (FILE *fp, const char *fmt, ... )
+                                __attribute__ ((format (printf,2,3)));
+#else
+ void tty_printf (const char *fmt, ... );
+ void tty_fprintf (FILE *fp, const char *fmt, ... );
+#endif
+void tty_print_string( const byte *p, size_t n );
+void tty_print_utf8_string( const byte *p, size_t n );
+void tty_print_utf8_string2( const byte *p, size_t n, size_t max_n );
+char *tty_get( const char *prompt );
+char *tty_get_hidden( const char *prompt );
+void tty_kill_prompt(void);
+int tty_get_answer_is_yes( const char *prompt );
+int tty_no_terminal(int onoff);
+
+#ifdef HAVE_LIBREADLINE
+void tty_enable_completion(rl_completion_func_t *completer);
+void tty_disable_completion(void);
+#else
+/* Use a macro to stub out these functions since a macro has no need
+   to typedef a "rl_completion_func_t" which would be undefined
+   without readline. */
+#define tty_enable_completion(x)
+#define tty_disable_completion()
+#endif
+
+#endif /*G10_TTYIO_H*/
diff --git a/include/types.h b/include/types.h
new file mode 100644 (file)
index 0000000..3b85b10
--- /dev/null
@@ -0,0 +1,142 @@
+/* types.h - some common typedefs
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef G10_TYPES_H
+#define G10_TYPES_H
+
+#ifdef HAVE_INTTYPES_H
+/* For uint64_t */
+#include <inttypes.h>
+#endif
+
+/* The AC_CHECK_SIZEOF() in configure fails for some machines.
+ * we provide some fallback values here */
+#if !SIZEOF_UNSIGNED_SHORT
+#undef SIZEOF_UNSIGNED_SHORT
+#define SIZEOF_UNSIGNED_SHORT 2
+#endif
+#if !SIZEOF_UNSIGNED_INT
+#undef SIZEOF_UNSIGNED_INT
+#define SIZEOF_UNSIGNED_INT 4
+#endif
+#if !SIZEOF_UNSIGNED_LONG
+#undef SIZEOF_UNSIGNED_LONG
+#define SIZEOF_UNSIGNED_LONG 4
+#endif
+
+
+#include <sys/types.h>
+
+
+#ifndef HAVE_BYTE_TYPEDEF
+#undef byte        /* maybe there is a macro with this name */
+#ifndef __riscos__
+typedef unsigned char byte;
+#else 
+/* Norcroft treats char  = unsigned char  as legal assignment
+               but char* = unsigned char* as illegal assignment
+   and the same applies to the signed variants as well  */
+typedef char byte;
+#endif
+#define HAVE_BYTE_TYPEDEF
+#endif
+
+#ifndef HAVE_USHORT_TYPEDEF
+#undef ushort     /* maybe there is a macro with this name */
+typedef unsigned short ushort;
+#define HAVE_USHORT_TYPEDEF
+#endif
+
+#ifndef HAVE_ULONG_TYPEDEF
+#undef ulong       /* maybe there is a macro with this name */
+typedef unsigned long ulong;
+#define HAVE_ULONG_TYPEDEF
+#endif
+
+#ifndef HAVE_U16_TYPEDEF
+#undef u16         /* maybe there is a macro with this name */
+#if SIZEOF_UNSIGNED_INT == 2
+typedef unsigned int   u16;
+#elif SIZEOF_UNSIGNED_SHORT == 2
+typedef unsigned short u16;
+#else
+#error no typedef for u16
+#endif
+#define HAVE_U16_TYPEDEF
+#endif
+
+#ifndef HAVE_U32_TYPEDEF
+#undef u32         /* maybe there is a macro with this name */
+#if SIZEOF_UNSIGNED_INT == 4
+typedef unsigned int u32;
+#elif SIZEOF_UNSIGNED_LONG == 4
+typedef unsigned long u32;
+#else
+#error no typedef for u32
+#endif
+#define HAVE_U32_TYPEDEF
+#endif
+
+/****************
+ * Warning: Some systems segfault when this u64 typedef and
+ * the dummy code in cipher/md.c is not available.  Examples are
+ * Solaris and IRIX.
+ */
+#ifndef HAVE_U64_TYPEDEF
+#undef u64         /* maybe there is a macro with this name */
+#if SIZEOF_UINT64_T == 8
+typedef uint64_t u64;
+#define U64_C(c) (UINT64_C(c))
+#define HAVE_U64_TYPEDEF
+#elif SIZEOF_UNSIGNED_INT == 8
+typedef unsigned int u64;
+#define U64_C(c) (c ## U)
+#define HAVE_U64_TYPEDEF
+#elif SIZEOF_UNSIGNED_LONG == 8
+typedef unsigned long u64;
+#define U64_C(c) (c ## UL)
+#define HAVE_U64_TYPEDEF
+#elif SIZEOF_UNSIGNED_LONG_LONG == 8
+typedef unsigned long long u64;
+#define U64_C(c) (c ## ULL)
+#define HAVE_U64_TYPEDEF
+#endif
+#endif
+
+typedef union {
+    int a;
+    short b;
+    char c[1];
+    long d;
+#ifdef HAVE_U64_TYPEDEF
+    u64 e;
+#endif
+    float f;
+    double g;
+} PROPERLY_ALIGNED_TYPE;
+
+typedef struct string_list {
+    struct string_list *next;
+    unsigned int flags;
+    char d[1];
+} *STRLIST;
+
+#endif /*G10_TYPES_H*/
diff --git a/include/util.h b/include/util.h
new file mode 100644 (file)
index 0000000..265bb02
--- /dev/null
@@ -0,0 +1,326 @@
+/* util.h
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+#ifndef G10_UTIL_H
+#define G10_UTIL_H
+
+#if defined (_WIN32) || defined (__CYGWIN32__)
+#include <stdarg.h>
+#endif
+
+#include "types.h"
+#include "errors.h"
+#include "types.h"
+#include "mpi.h"
+#include "compat.h"
+
+typedef struct {
+     int  *argc;           /* pointer to argc (value subject to change) */
+     char ***argv;         /* pointer to argv (value subject to change) */
+     unsigned flags;       /* Global flags (DO NOT CHANGE) */
+     int err;              /* print error about last option */
+                           /* 1 = warning, 2 = abort */
+     int r_opt;            /* return option */
+     int r_type;           /* type of return value (0 = no argument found)*/
+     union {
+        int   ret_int;
+        long  ret_long;
+        ulong ret_ulong;
+        char *ret_str;
+     } r;                  /* Return values */
+     struct {
+        int idx;
+        int inarg;
+        int stopped;
+        const char *last;
+        void *aliases;
+        const void *cur_alias;
+     } internal;           /* DO NOT CHANGE */
+} ARGPARSE_ARGS;
+
+typedef struct {
+    int        short_opt;
+    const char *long_opt;
+    unsigned flags;
+    const char *description; /* optional option description */
+} ARGPARSE_OPTS;
+
+/*-- logger.c --*/
+void log_set_logfile( const char *name, int fd );
+FILE *log_stream(void);
+void g10_log_print_prefix(const char *text);
+void log_set_name( const char *name );
+const char *log_get_name(void);
+void log_set_pid( int pid );
+int  log_get_errorcount( int clear );
+void log_inc_errorcount(void);
+int log_set_strict(int val);
+void g10_log_hexdump( const char *text, const char *buf, size_t len );
+
+#if defined (__riscos__) \
+    || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ))
+  void g10_log_bug( const char *fmt, ... )
+                           __attribute__ ((noreturn, format (printf,1,2)));
+  void g10_log_bug0( const char *, int, const char * ) __attribute__ ((noreturn));
+  void g10_log_fatal( const char *fmt, ... )
+                           __attribute__ ((noreturn, format (printf,1,2)));
+  void g10_log_error( const char *fmt, ... ) __attribute__ ((format (printf,1,2)));
+  void g10_log_info( const char *fmt, ... )  __attribute__ ((format (printf,1,2)));
+  void g10_log_warning( const char *fmt, ... )  __attribute__ ((format (printf,1,2)));
+  void g10_log_debug( const char *fmt, ... ) __attribute__ ((format (printf,1,2)));
+#ifndef __riscos__
+#define BUG() g10_log_bug0(  __FILE__ , __LINE__, __FUNCTION__ )
+#else
+#define BUG() g10_log_bug0(  __FILE__ , __LINE__, __func__ )
+#endif
+#else
+  void g10_log_bug( const char *fmt, ... );
+  void g10_log_bug0( const char *, int );
+  void g10_log_fatal( const char *fmt, ... );
+  void g10_log_error( const char *fmt, ... );
+  void g10_log_info( const char *fmt, ... );
+  void g10_log_warning( const char *fmt, ... );
+  void g10_log_debug( const char *fmt, ... );
+#define BUG() g10_log_bug0( __FILE__ , __LINE__ )
+#endif
+
+#define log_hexdump g10_log_hexdump
+#define log_bug     g10_log_bug
+#define log_bug0    g10_log_bug0
+#define log_fatal   g10_log_fatal
+#define log_error   g10_log_error
+#define log_info    g10_log_info
+#define log_warning g10_log_warning
+#define log_debug   g10_log_debug
+
+
+/*-- errors.c --*/
+const char * g10_errstr( int no );
+
+/*-- argparse.c --*/
+int arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
+int optfile_parse( FILE *fp, const char *filename, unsigned *lineno,
+                  ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
+void usage( int level );
+const char *default_strusage( int level );
+
+
+/*-- (main program) --*/
+const char *strusage( int level );
+
+
+/*-- dotlock.c --*/
+struct dotlock_handle;
+typedef struct dotlock_handle *DOTLOCK;
+
+void disable_dotlock(void);
+DOTLOCK create_dotlock( const char *file_to_lock );
+void destroy_dotlock ( DOTLOCK h );
+int make_dotlock( DOTLOCK h, long timeout );
+int release_dotlock( DOTLOCK h );
+void remove_lockfiles (void);
+
+/*-- fileutil.c --*/
+char * make_basename(const char *filepath, const char *inputpath);
+char * make_dirname(const char *filepath);
+char *make_filename( const char *first_part, ... );
+int compare_filenames( const char *a, const char *b );
+const char *print_fname_stdin( const char *s );
+const char *print_fname_stdout( const char *s );
+int is_file_compressed(const char *s, int *r_status);
+
+/*-- miscutil.c --*/
+u32 make_timestamp(void);
+u32 scan_isodatestr( const char *string );
+const char *strtimevalue( u32 stamp );
+const char *strtimestamp( u32 stamp ); /* GMT */
+const char *isotimestamp( u32 stamp ); /* GMT with hh:mm:ss */
+const char *asctimestamp( u32 stamp ); /* localized */
+void print_string( FILE *fp, const byte *p, size_t n, int delim );
+void print_string2( FILE *fp, const byte *p, size_t n, int delim, int delim2 );
+void  print_utf8_string( FILE *fp, const byte *p, size_t n );
+void  print_utf8_string2( FILE *fp, const byte *p, size_t n, int delim);
+char *make_printable_string( const byte *p, size_t n, int delim );
+int answer_is_yes_no_default( const char *s, int def_answer );
+int answer_is_yes( const char *s );
+int answer_is_yes_no_quit( const char *s );
+int answer_is_okay_cancel (const char *s, int def_answer);
+int match_multistr(const char *multistr,const char *match);
+
+/*-- strgutil.c --*/
+void free_strlist( STRLIST sl );
+#define FREE_STRLIST(a) do { free_strlist((a)); (a) = NULL ; } while(0)
+STRLIST add_to_strlist( STRLIST *list, const char *string );
+STRLIST add_to_strlist2( STRLIST *list, const char *string, int is_utf8 );
+STRLIST append_to_strlist( STRLIST *list, const char *string );
+STRLIST append_to_strlist2( STRLIST *list, const char *string, int is_utf8 );
+STRLIST strlist_prev( STRLIST head, STRLIST node );
+STRLIST strlist_last( STRLIST node );
+char *pop_strlist( STRLIST *list );
+const char *memistr( const char *buf, size_t buflen, const char *sub );
+const char *ascii_memistr( const char *buf, size_t buflen, const char *sub );
+char *mem2str( char *, const void *, size_t);
+char *trim_spaces( char *string );
+unsigned int trim_trailing_chars( byte *line, unsigned int len,
+                                  const char *trimchars);
+unsigned int trim_trailing_ws( byte *line, unsigned len );
+unsigned int check_trailing_chars( const byte *line, unsigned int len,
+                                   const char *trimchars );
+unsigned int check_trailing_ws( const byte *line, unsigned int len );
+int string_count_chr( const char *string, int c );
+int set_native_charset( const char *newset );
+const char* get_native_charset(void);
+char *native_to_utf8( const char *string );
+char *utf8_to_native( const char *string, size_t length, int delim);
+int  check_utf8_string( const char *string );
+
+int ascii_isupper (int c);
+int ascii_islower (int c);
+int ascii_toupper (int c);
+int ascii_tolower (int c);
+int ascii_strcasecmp( const char *a, const char *b );
+int ascii_strncasecmp( const char *a, const char *b, size_t n);
+int ascii_memcasecmp( const char *a, const char *b, size_t n);
+
+#ifndef HAVE_STPCPY
+char *stpcpy(char *a,const char *b);
+#endif
+#ifndef HAVE_STRLWR
+char *strlwr(char *a);
+#endif
+#ifndef HAVE_STRCASECMP
+int strcasecmp( const char *, const char *b);
+#endif
+#ifndef HAVE_STRNCASECMP
+int strncasecmp (const char *, const char *b, size_t n);
+#endif
+#ifndef HAVE_STRTOUL
+#define strtoul(a,b,c)  ((unsigned long)strtol((a),(b),(c)))
+#endif
+#ifndef HAVE_MEMMOVE
+#define memmove(d, s, n) bcopy((s), (d), (n))
+#endif
+
+/*-- membuf.c --*/
+/* The definition of the structure is private, we only need it here,
+   so it can be allocated on the stack. */
+struct private_membuf_s {
+  size_t len;      
+  size_t size;     
+  char *buf;       
+  int out_of_core; 
+};
+
+typedef struct private_membuf_s membuf_t;
+
+void init_membuf (membuf_t *mb, int initiallen);
+void put_membuf  (membuf_t *mb, const void *buf, size_t len);
+void *get_membuf (membuf_t *mb, size_t *len);
+
+
+
+#if defined (_WIN32)
+/*-- w32reg.c --*/
+char *read_w32_registry_string( const char *root,
+                               const char *dir, const char *name );
+int write_w32_registry_string(const char *root, const char *dir,
+                              const char *name, const char *value);
+
+/*-- strgutil.c --*/
+int vasprintf (char **result, const char *format, va_list args);
+int asprintf (char **buf, const char *fmt, ...);
+#endif /*_WIN32*/
+
+/*-- pka.c --*/
+char *get_pka_info (const char *address, unsigned char *fpr);
+
+/*-- cert.c --*/
+int get_cert(const char *name,size_t max_size,IOBUF *iobuf,
+            unsigned char **fpr,size_t *fpr_len,char **url);
+
+/**** other missing stuff ****/
+#ifndef HAVE_ATEXIT  /* For SunOS */
+#define atexit(a)    (on_exit((a),0))
+#endif
+
+#ifndef HAVE_RAISE
+#define raise(a) kill(getpid(), (a))
+#endif
+
+/*-- Replacement functions from funcname.c --*/
+
+
+
+/******** some macros ************/
+#ifndef STR
+#define STR(v) #v
+#endif
+#define STR2(v) STR(v)
+#define DIM(v) (sizeof(v)/sizeof((v)[0]))
+#define DIMof(type,member)   DIM(((type *)0)->member)
+
+#define wipememory2(_ptr,_set,_len) do { volatile char *_vptr=(volatile char *)(_ptr); size_t _vlen=(_len); while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } } while(0)
+#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
+
+/*-- macros to replace ctype ones and avoid locale problems --*/
+#define spacep(p)   (*(p) == ' ' || *(p) == '\t')
+#define digitp(p)   (*(p) >= '0' && *(p) <= '9')
+#define hexdigitp(a) (digitp (a)                     \
+                      || (*(a) >= 'A' && *(a) <= 'F')  \
+                      || (*(a) >= 'a' && *(a) <= 'f'))
+/* the atoi macros assume that the buffer has only valid digits */
+#define atoi_1(p)   (*(p) - '0' )
+#define atoi_2(p)   ((atoi_1(p) * 10) + atoi_1((p)+1))
+#define atoi_4(p)   ((atoi_2(p) * 100) + atoi_2((p)+2))
+#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
+                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
+#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
+
+/******* RISC OS stuff ***********/
+#ifdef __riscos__
+int riscos_load_module(const char *name, const char * const path[], int fatal);
+int riscos_get_filetype_from_string(const char *string, int len);
+int riscos_get_filetype(const char *filename);
+void riscos_set_filetype_by_number(const char *filename, int type);
+void riscos_set_filetype_by_mimetype(const char *filename, const char *mimetype);
+pid_t riscos_getpid(void);
+int riscos_kill(pid_t pid, int sig);
+int riscos_access(const char *path, int amode);
+int riscos_getchar(void);
+char *riscos_make_basename(const char *filepath, const char *inputpath);
+int riscos_check_regexp(const char *exp, const char *string, int debug);
+int riscos_fdopenfile(const char *filename, const int allow_write);
+void riscos_close_fds(void);
+int riscos_renamefile(const char *old, const char *new);
+char *riscos_gstrans(const char *old);
+void riscos_not_implemented(const char *feature);
+#ifdef DEBUG
+void riscos_dump_fdlist(void);
+void riscos_list_openfiles(void);
+#endif
+#ifndef __RISCOS__C__
+#define getpid riscos_getpid
+#define kill(a,b) riscos_kill((a),(b))
+#define access(a,b) riscos_access((a),(b))
+#endif /* !__RISCOS__C__ */
+#endif /* __riscos__ */
+
+#endif /*G10_UTIL_H*/
diff --git a/intl/ChangeLog b/intl/ChangeLog
new file mode 100644 (file)
index 0000000..7512919
--- /dev/null
@@ -0,0 +1,4 @@
+2004-01-29  GNU  <bug-gnu-gettext@gnu.org>
+
+       * Version 0.14.1 released.
+
diff --git a/intl/Makefile.in b/intl/Makefile.in
new file mode 100644 (file)
index 0000000..1ad087a
--- /dev/null
@@ -0,0 +1,493 @@
+# Makefile for directory with message catalog handling library of GNU gettext
+# Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+VPATH = $(srcdir)
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = @libdir@
+includedir = @includedir@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/intl
+aliaspath = $(localedir)
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
+
+l = @INTL_LIBTOOL_SUFFIX_PREFIX@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+YACC = @INTLBISON@ -y -d
+YFLAGS = --name-prefix=__gettext
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DLOCALE_ALIAS_PATH=\"$(aliaspath)\" \
+-DLIBDIR=\"$(libdir)\" -DIN_LIBINTL \
+-DENABLE_RELOCATABLE=1 -DIN_LIBRARY -DINSTALLDIR=\"$(libdir)\" -DNO_XMALLOC \
+-Dset_relocation_prefix=libintl_set_relocation_prefix \
+-Drelocate=libintl_relocate \
+-DDEPENDS_ON_LIBICONV=1 @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = \
+  gmo.h \
+  gettextP.h \
+  hash-string.h \
+  loadinfo.h \
+  plural-exp.h \
+  eval-plural.h \
+  localcharset.h \
+  relocatable.h \
+  xsize.h \
+  printf-args.h printf-args.c \
+  printf-parse.h wprintf-parse.h printf-parse.c \
+  vasnprintf.h vasnwprintf.h vasnprintf.c \
+  os2compat.h \
+  libgnuintl.h.in
+SOURCES = \
+  bindtextdom.c \
+  dcgettext.c \
+  dgettext.c \
+  gettext.c \
+  finddomain.c \
+  loadmsgcat.c \
+  localealias.c \
+  textdomain.c \
+  l10nflist.c \
+  explodename.c \
+  dcigettext.c \
+  dcngettext.c \
+  dngettext.c \
+  ngettext.c \
+  plural.y \
+  plural-exp.c \
+  localcharset.c \
+  relocatable.c \
+  localename.c \
+  log.c \
+  printf.c \
+  osdep.c \
+  os2compat.c \
+  intl-compat.c
+OBJECTS = \
+  bindtextdom.$lo \
+  dcgettext.$lo \
+  dgettext.$lo \
+  gettext.$lo \
+  finddomain.$lo \
+  loadmsgcat.$lo \
+  localealias.$lo \
+  textdomain.$lo \
+  l10nflist.$lo \
+  explodename.$lo \
+  dcigettext.$lo \
+  dcngettext.$lo \
+  dngettext.$lo \
+  ngettext.$lo \
+  plural.$lo \
+  plural-exp.$lo \
+  localcharset.$lo \
+  relocatable.$lo \
+  localename.$lo \
+  log.$lo \
+  printf.$lo \
+  osdep.$lo \
+  intl-compat.$lo
+DISTFILES.common = Makefile.in \
+config.charset locale.alias ref-add.sin ref-del.sin $(HEADERS) $(SOURCES)
+DISTFILES.generated = plural.c
+DISTFILES.normal = VERSION
+DISTFILES.gettext = COPYING.LIB-2.0 COPYING.LIB-2.1 libintl.glibc \
+libgnuintl.h_vms Makefile.vms \
+libgnuintl.h.msvc-static libgnuintl.h.msvc-shared README.woe32 Makefile.msvc
+DISTFILES.obsolete = xopen-msg.sed linux-msg.sed po2tbl.sed.in cat-compat.c \
+COPYING.LIB-2 gettext.h libgettext.h plural-eval.c libgnuintl.h
+
+all: all-@USE_INCLUDED_LIBINTL@
+all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
+all-no: all-no-@BUILD_INCLUDED_LIBINTL@
+all-no-yes: libgnuintl.$la
+all-no-no:
+
+libintl.a libgnuintl.a: $(OBJECTS)
+       rm -f $@
+       $(AR) cru $@ $(OBJECTS)
+       $(RANLIB) $@
+
+libintl.la libgnuintl.la: $(OBJECTS)
+       $(LIBTOOL) --mode=link \
+         $(CC) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) $(LDFLAGS) -o $@ \
+         $(OBJECTS) @LTLIBICONV@ $(LIBS) -lc \
+         -version-info $(LTV_CURRENT):$(LTV_REVISION):$(LTV_AGE) \
+         -rpath $(libdir) \
+         -no-undefined
+
+# Libtool's library version information for libintl.
+# Before making a gettext release, the gettext maintainer must change this
+# according to the libtool documentation, section "Library interface versions".
+# Maintainers of other packages that include the intl directory must *not*
+# change these values.
+LTV_CURRENT=7
+LTV_REVISION=0
+LTV_AGE=4
+
+.SUFFIXES:
+.SUFFIXES: .c .y .o .lo .sin .sed
+
+.c.o:
+       $(COMPILE) $<
+
+.y.c:
+       $(YACC) $(YFLAGS) --output $@ $<
+       rm -f $*.h
+
+bindtextdom.lo: $(srcdir)/bindtextdom.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/bindtextdom.c
+dcgettext.lo: $(srcdir)/dcgettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcgettext.c
+dgettext.lo: $(srcdir)/dgettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dgettext.c
+gettext.lo: $(srcdir)/gettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/gettext.c
+finddomain.lo: $(srcdir)/finddomain.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/finddomain.c
+loadmsgcat.lo: $(srcdir)/loadmsgcat.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/loadmsgcat.c
+localealias.lo: $(srcdir)/localealias.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localealias.c
+textdomain.lo: $(srcdir)/textdomain.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/textdomain.c
+l10nflist.lo: $(srcdir)/l10nflist.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/l10nflist.c
+explodename.lo: $(srcdir)/explodename.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/explodename.c
+dcigettext.lo: $(srcdir)/dcigettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcigettext.c
+dcngettext.lo: $(srcdir)/dcngettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dcngettext.c
+dngettext.lo: $(srcdir)/dngettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/dngettext.c
+ngettext.lo: $(srcdir)/ngettext.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/ngettext.c
+plural.lo: $(srcdir)/plural.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural.c
+plural-exp.lo: $(srcdir)/plural-exp.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/plural-exp.c
+localcharset.lo: $(srcdir)/localcharset.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localcharset.c
+relocatable.lo: $(srcdir)/relocatable.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/relocatable.c
+localename.lo: $(srcdir)/localename.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/localename.c
+log.lo: $(srcdir)/log.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/log.c
+printf.lo: $(srcdir)/printf.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/printf.c
+osdep.lo: $(srcdir)/osdep.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/osdep.c
+intl-compat.lo: $(srcdir)/intl-compat.c
+       $(LIBTOOL) --mode=compile $(COMPILE) $(srcdir)/intl-compat.c
+
+ref-add.sed: $(srcdir)/ref-add.sin
+       sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-add.sin > t-ref-add.sed
+       mv t-ref-add.sed ref-add.sed
+ref-del.sed: $(srcdir)/ref-del.sin
+       sed -e '/^#/d' -e 's/@''PACKAGE''@/@PACKAGE@/g' $(srcdir)/ref-del.sin > t-ref-del.sed
+       mv t-ref-del.sed ref-del.sed
+
+INCLUDES = -I. -I$(srcdir) -I..
+
+libgnuintl.h: $(srcdir)/libgnuintl.h.in
+       sed -e 's,@''HAVE_POSIX_PRINTF''@,@HAVE_POSIX_PRINTF@,g' \
+           -e 's,@''HAVE_ASPRINTF''@,@HAVE_ASPRINTF@,g' \
+           -e 's,@''HAVE_SNPRINTF''@,@HAVE_SNPRINTF@,g' \
+           -e 's,@''HAVE_WPRINTF''@,@HAVE_WPRINTF@,g' \
+         < $(srcdir)/libgnuintl.h.in > libgnuintl.h
+
+libintl.h: libgnuintl.h
+       cp libgnuintl.h libintl.h
+
+charset.alias: $(srcdir)/config.charset
+       $(SHELL) $(srcdir)/config.charset '@host@' > t-$@
+       mv t-$@ $@
+
+check: all
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the GNU gettext() function in its C library or in a
+# separate library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+       if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+          && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+         $(INSTALL_DATA) libintl.h $(DESTDIR)$(includedir)/libintl.h; \
+         $(LIBTOOL) --mode=install \
+           $(INSTALL_DATA) libintl.$la $(DESTDIR)$(libdir)/libintl.$la; \
+         if test "@RELOCATABLE@" = yes; then \
+           dependencies=`sed -n -e 's,^dependency_libs=\(.*\),\1,p' < $(DESTDIR)$(libdir)/libintl.la | sed -e "s,^',," -e "s,'\$$,,"`; \
+           if test -n "$$dependencies"; then \
+             rm -f $(DESTDIR)$(libdir)/libintl.la; \
+           fi; \
+         fi; \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools" \
+          && test '@USE_INCLUDED_LIBINTL@' = no; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir); \
+         $(LIBTOOL) --mode=install \
+           $(INSTALL_DATA) libgnuintl.$la $(DESTDIR)$(libdir)/libgnuintl.$la; \
+         rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+         $(INSTALL_DATA) $(DESTDIR)$(libdir)/libgnuintl.so $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+         $(LIBTOOL) --mode=uninstall \
+           rm -f $(DESTDIR)$(libdir)/libgnuintl.$la; \
+       else \
+         : ; \
+       fi
+       if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \
+         temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+         dest=$(DESTDIR)$(libdir)/charset.alias; \
+         if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+           orig=$(DESTDIR)$(libdir)/charset.alias; \
+           sed -f ref-add.sed $$orig > $$temp; \
+           $(INSTALL_DATA) $$temp $$dest; \
+           rm -f $$temp; \
+         else \
+           if test @GLIBC21@ = no; then \
+             orig=charset.alias; \
+             sed -f ref-add.sed $$orig > $$temp; \
+             $(INSTALL_DATA) $$temp $$dest; \
+             rm -f $$temp; \
+           fi; \
+         fi; \
+         $(mkinstalldirs) $(DESTDIR)$(localedir); \
+         test -f $(DESTDIR)$(localedir)/locale.alias \
+           && orig=$(DESTDIR)$(localedir)/locale.alias \
+           || orig=$(srcdir)/locale.alias; \
+         temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+         dest=$(DESTDIR)$(localedir)/locale.alias; \
+         sed -f ref-add.sed $$orig > $$temp; \
+         $(INSTALL_DATA) $$temp $$dest; \
+         rm -f $$temp; \
+       else \
+         : ; \
+       fi
+install-data: all
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+         $(INSTALL_DATA) VERSION $(DESTDIR)$(gettextsrcdir)/VERSION; \
+         $(INSTALL_DATA) ChangeLog.inst $(DESTDIR)$(gettextsrcdir)/ChangeLog; \
+         dists="COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common)"; \
+         for file in $$dists; do \
+           $(INSTALL_DATA) $(srcdir)/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         chmod a+x $(DESTDIR)$(gettextsrcdir)/config.charset; \
+         dists="$(DISTFILES.generated)"; \
+         for file in $$dists; do \
+           if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+           $(INSTALL_DATA) $$dir/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         dists="$(DISTFILES.obsolete)"; \
+         for file in $$dists; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+
+install-strip: install
+
+installdirs:
+       if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+          && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir); \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools" \
+          && test '@USE_INCLUDED_LIBINTL@' = no; then \
+         $(mkinstalldirs) $(DESTDIR)$(libdir); \
+       else \
+         : ; \
+       fi
+       if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         test @GLIBC21@ != no || $(mkinstalldirs) $(DESTDIR)$(libdir); \
+         $(mkinstalldirs) $(DESTDIR)$(localedir); \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+       else \
+         : ; \
+       fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+       if { test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; } \
+          && test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         rm -f $(DESTDIR)$(includedir)/libintl.h; \
+         $(LIBTOOL) --mode=uninstall \
+           rm -f $(DESTDIR)$(libdir)/libintl.$la; \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools" \
+          && test '@USE_INCLUDED_LIBINTL@' = no; then \
+         rm -f $(DESTDIR)$(libdir)/preloadable_libintl.so; \
+       else \
+         : ; \
+       fi
+       if test '@USE_INCLUDED_LIBINTL@' = yes; then \
+         if test -f $(DESTDIR)$(libdir)/charset.alias; then \
+           temp=$(DESTDIR)$(libdir)/t-charset.alias; \
+           dest=$(DESTDIR)$(libdir)/charset.alias; \
+           sed -f ref-del.sed $$dest > $$temp; \
+           if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+             rm -f $$dest; \
+           else \
+             $(INSTALL_DATA) $$temp $$dest; \
+           fi; \
+           rm -f $$temp; \
+         fi; \
+         if test -f $(DESTDIR)$(localedir)/locale.alias; then \
+           temp=$(DESTDIR)$(localedir)/t-locale.alias; \
+           dest=$(DESTDIR)$(localedir)/locale.alias; \
+           sed -f ref-del.sed $$dest > $$temp; \
+           if grep '^# Packages using this file: $$' $$temp > /dev/null; then \
+             rm -f $$dest; \
+           else \
+             $(INSTALL_DATA) $$temp $$dest; \
+           fi; \
+           rm -f $$temp; \
+         fi; \
+       else \
+         : ; \
+       fi
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         for file in VERSION ChangeLog COPYING.LIB-2.0 COPYING.LIB-2.1 $(DISTFILES.common) $(DISTFILES.generated); do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+
+info dvi ps pdf html:
+
+$(OBJECTS): ../config.h libgnuintl.h
+bindtextdom.$lo dcgettext.$lo dcigettext.$lo dcngettext.$lo dgettext.$lo dngettext.$lo finddomain.$lo gettext.$lo intl-compat.$lo loadmsgcat.$lo localealias.$lo ngettext.$lo textdomain.$lo: $(srcdir)/gettextP.h $(srcdir)/gmo.h $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo: $(srcdir)/hash-string.h
+explodename.$lo l10nflist.$lo: $(srcdir)/loadinfo.h
+dcigettext.$lo loadmsgcat.$lo plural.$lo plural-exp.$lo: $(srcdir)/plural-exp.h
+dcigettext.$lo: $(srcdir)/eval-plural.h
+localcharset.$lo: $(srcdir)/localcharset.h
+localealias.$lo localcharset.$lo relocatable.$lo: $(srcdir)/relocatable.h
+printf.$lo: $(srcdir)/printf-args.h $(srcdir)/printf-args.c $(srcdir)/printf-parse.h $(srcdir)/wprintf-parse.h $(srcdir)/xsize.h $(srcdir)/printf-parse.c $(srcdir)/vasnprintf.h $(srcdir)/vasnwprintf.h $(srcdir)/vasnprintf.c
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+       here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+ctags: CTAGS
+
+CTAGS: $(HEADERS) $(SOURCES)
+       here=`pwd`; cd $(srcdir) && ctags -o $$here/CTAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+       here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+       rm -f *.a *.la *.o *.obj *.lo core core.*
+       rm -f libgnuintl.h libintl.h charset.alias ref-add.sed ref-del.sed
+       rm -f -r .libs _libs
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile ID TAGS
+       if test "$(PACKAGE)" = "gettext-runtime" || test "$(PACKAGE)" = "gettext-tools"; then \
+         rm -f ChangeLog.inst $(DISTFILES.normal); \
+       else \
+         : ; \
+       fi
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         : ; \
+       else \
+         if test "$(PACKAGE)" = "gettext-runtime"; then \
+           additional="$(DISTFILES.gettext)"; \
+         else \
+           additional="$(DISTFILES.normal)"; \
+         fi; \
+         $(MAKE) $(DISTFILES.common) $(DISTFILES.generated) $$additional; \
+         for file in ChangeLog $(DISTFILES.common) $(DISTFILES.generated) $$additional; do \
+           if test -f $$file; then dir=.; else dir=$(srcdir); fi; \
+           cp -p $$dir/$$file $(distdir); \
+         done; \
+       fi
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       cd $(top_builddir) && $(SHELL) ./config.status
+# This would be more efficient, but doesn't work any more with autoconf-2.57,
+# when AC_CONFIG_FILES([intl/Makefile:somedir/Makefile.in]) is used.
+#      cd $(top_builddir) && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/intl/VERSION b/intl/VERSION
new file mode 100644 (file)
index 0000000..b4b846c
--- /dev/null
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.14.1
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
new file mode 100644 (file)
index 0000000..7a26062
--- /dev/null
@@ -0,0 +1,363 @@
+/* Implementation of the bindtextdomain(3) function
+   Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications.  */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc.  */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>.  */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs.  */
+extern const char _nl_default_dirname[];
+#ifdef _LIBC
+extern const char _nl_default_dirname_internal[] attribute_hidden;
+#else
+# define INTUSE(name) name
+#endif
+
+/* List with bindings of specific domains.  */
+extern struct binding *_nl_domain_bindings;
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET __bind_textdomain_codeset
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN libintl_bindtextdomain
+# define BIND_TEXTDOMAIN_CODESET libintl_bind_textdomain_codeset
+#endif
+
+/* Specifies the directory name *DIRNAMEP and the output codeset *CODESETP
+   to be used for the DOMAINNAME message catalog.
+   If *DIRNAMEP or *CODESETP is NULL, the corresponding attribute is not
+   modified, only the current value is returned.
+   If DIRNAMEP or CODESETP is NULL, the corresponding attribute is neither
+   modified nor returned.  */
+static void
+set_binding_values (const char *domainname,
+                   const char **dirnamep, const char **codesetp)
+{
+  struct binding *binding;
+  int modified;
+
+  /* Some sanity checks.  */
+  if (domainname == NULL || domainname[0] == '\0')
+    {
+      if (dirnamep)
+       *dirnamep = NULL;
+      if (codesetp)
+       *codesetp = NULL;
+      return;
+    }
+
+  __libc_rwlock_wrlock (_nl_state_lock);
+
+  modified = 0;
+
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+       /* We found it!  */
+       break;
+      if (compare < 0)
+       {
+         /* It is not in the list.  */
+         binding = NULL;
+         break;
+       }
+    }
+
+  if (binding != NULL)
+    {
+      if (dirnamep)
+       {
+         const char *dirname = *dirnamep;
+
+         if (dirname == NULL)
+           /* The current binding has be to returned.  */
+           *dirnamep = binding->dirname;
+         else
+           {
+             /* The domain is already bound.  If the new value and the old
+                one are equal we simply do nothing.  Otherwise replace the
+                old binding.  */
+             char *result = binding->dirname;
+             if (strcmp (dirname, result) != 0)
+               {
+                 if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
+                   result = (char *) INTUSE(_nl_default_dirname);
+                 else
+                   {
+#if defined _LIBC || defined HAVE_STRDUP
+                     result = strdup (dirname);
+#else
+                     size_t len = strlen (dirname) + 1;
+                     result = (char *) malloc (len);
+                     if (__builtin_expect (result != NULL, 1))
+                       memcpy (result, dirname, len);
+#endif
+                   }
+
+                 if (__builtin_expect (result != NULL, 1))
+                   {
+                     if (binding->dirname != INTUSE(_nl_default_dirname))
+                       free (binding->dirname);
+
+                     binding->dirname = result;
+                     modified = 1;
+                   }
+               }
+             *dirnamep = result;
+           }
+       }
+
+      if (codesetp)
+       {
+         const char *codeset = *codesetp;
+
+         if (codeset == NULL)
+           /* The current binding has be to returned.  */
+           *codesetp = binding->codeset;
+         else
+           {
+             /* The domain is already bound.  If the new value and the old
+                one are equal we simply do nothing.  Otherwise replace the
+                old binding.  */
+             char *result = binding->codeset;
+             if (result == NULL || strcmp (codeset, result) != 0)
+               {
+#if defined _LIBC || defined HAVE_STRDUP
+                 result = strdup (codeset);
+#else
+                 size_t len = strlen (codeset) + 1;
+                 result = (char *) malloc (len);
+                 if (__builtin_expect (result != NULL, 1))
+                   memcpy (result, codeset, len);
+#endif
+
+                 if (__builtin_expect (result != NULL, 1))
+                   {
+                     if (binding->codeset != NULL)
+                       free (binding->codeset);
+
+                     binding->codeset = result;
+                     binding->codeset_cntr++;
+                     modified = 1;
+                   }
+               }
+             *codesetp = result;
+           }
+       }
+    }
+  else if ((dirnamep == NULL || *dirnamep == NULL)
+          && (codesetp == NULL || *codesetp == NULL))
+    {
+      /* Simply return the default values.  */
+      if (dirnamep)
+       *dirnamep = INTUSE(_nl_default_dirname);
+      if (codesetp)
+       *codesetp = NULL;
+    }
+  else
+    {
+      /* We have to create a new binding.  */
+      size_t len = strlen (domainname) + 1;
+      struct binding *new_binding =
+       (struct binding *) malloc (offsetof (struct binding, domainname) + len);
+
+      if (__builtin_expect (new_binding == NULL, 0))
+       goto failed;
+
+      memcpy (new_binding->domainname, domainname, len);
+
+      if (dirnamep)
+       {
+         const char *dirname = *dirnamep;
+
+         if (dirname == NULL)
+           /* The default value.  */
+           dirname = INTUSE(_nl_default_dirname);
+         else
+           {
+             if (strcmp (dirname, INTUSE(_nl_default_dirname)) == 0)
+               dirname = INTUSE(_nl_default_dirname);
+             else
+               {
+                 char *result;
+#if defined _LIBC || defined HAVE_STRDUP
+                 result = strdup (dirname);
+                 if (__builtin_expect (result == NULL, 0))
+                   goto failed_dirname;
+#else
+                 size_t len = strlen (dirname) + 1;
+                 result = (char *) malloc (len);
+                 if (__builtin_expect (result == NULL, 0))
+                   goto failed_dirname;
+                 memcpy (result, dirname, len);
+#endif
+                 dirname = result;
+               }
+           }
+         *dirnamep = dirname;
+         new_binding->dirname = (char *) dirname;
+       }
+      else
+       /* The default value.  */
+       new_binding->dirname = (char *) INTUSE(_nl_default_dirname);
+
+      new_binding->codeset_cntr = 0;
+
+      if (codesetp)
+       {
+         const char *codeset = *codesetp;
+
+         if (codeset != NULL)
+           {
+             char *result;
+
+#if defined _LIBC || defined HAVE_STRDUP
+             result = strdup (codeset);
+             if (__builtin_expect (result == NULL, 0))
+               goto failed_codeset;
+#else
+             size_t len = strlen (codeset) + 1;
+             result = (char *) malloc (len);
+             if (__builtin_expect (result == NULL, 0))
+               goto failed_codeset;
+             memcpy (result, codeset, len);
+#endif
+             codeset = result;
+             new_binding->codeset_cntr++;
+           }
+         *codesetp = codeset;
+         new_binding->codeset = (char *) codeset;
+       }
+      else
+       new_binding->codeset = NULL;
+
+      /* Now enqueue it.  */
+      if (_nl_domain_bindings == NULL
+         || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+       {
+         new_binding->next = _nl_domain_bindings;
+         _nl_domain_bindings = new_binding;
+       }
+      else
+       {
+         binding = _nl_domain_bindings;
+         while (binding->next != NULL
+                && strcmp (domainname, binding->next->domainname) > 0)
+           binding = binding->next;
+
+         new_binding->next = binding->next;
+         binding->next = new_binding;
+       }
+
+      modified = 1;
+
+      /* Here we deal with memory allocation failures.  */
+      if (0)
+       {
+       failed_codeset:
+         if (new_binding->dirname != INTUSE(_nl_default_dirname))
+           free (new_binding->dirname);
+       failed_dirname:
+         free (new_binding);
+       failed:
+         if (dirnamep)
+           *dirnamep = NULL;
+         if (codesetp)
+           *codesetp = NULL;
+       }
+    }
+
+  /* If we modified any binding, we flush the caches.  */
+  if (modified)
+    ++_nl_msg_cat_cntr;
+
+  __libc_rwlock_unlock (_nl_state_lock);
+}
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+char *
+BINDTEXTDOMAIN (const char *domainname, const char *dirname)
+{
+  set_binding_values (domainname, &dirname, NULL);
+  return (char *) dirname;
+}
+
+/* Specify the character encoding in which the messages from the
+   DOMAINNAME message catalog will be returned.  */
+char *
+BIND_TEXTDOMAIN_CODESET (const char *domainname, const char *codeset)
+{
+  set_binding_values (domainname, NULL, &codeset);
+  return (char *) codeset;
+}
+
+#ifdef _LIBC
+/* Aliases for function names in GNU C Library.  */
+weak_alias (__bindtextdomain, bindtextdomain);
+weak_alias (__bind_textdomain_codeset, bind_textdomain_codeset);
+#endif
diff --git a/intl/config.charset b/intl/config.charset
new file mode 100755 (executable)
index 0000000..d4964dc
--- /dev/null
@@ -0,0 +1,608 @@
+#! /bin/sh
+# Output a system dependent table of character encoding aliases.
+#
+#   Copyright (C) 2000-2004 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library General Public License as published
+#   by the Free Software Foundation; either version 2, or (at your option)
+#   any later version.
+#
+#   This program 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+#   USA.
+#
+# The table consists of lines of the form
+#    ALIAS  CANONICAL
+#
+# ALIAS is the (system dependent) result of "nl_langinfo (CODESET)".
+# ALIAS is compared in a case sensitive way.
+#
+# CANONICAL is the GNU canonical name for this character encoding.
+# It must be an encoding supported by libiconv. Support by GNU libc is
+# also desirable. CANONICAL is case insensitive. Usually an upper case
+# MIME charset name is preferred.
+# The current list of GNU canonical charset names is as follows.
+#
+#       name              MIME?             used by which systems
+#   ASCII, ANSI_X3.4-1968       glibc solaris freebsd darwin
+#   ISO-8859-1              Y   glibc aix hpux irix osf solaris freebsd darwin
+#   ISO-8859-2              Y   glibc aix hpux irix osf solaris freebsd darwin
+#   ISO-8859-3              Y   glibc solaris
+#   ISO-8859-4              Y   osf solaris freebsd darwin
+#   ISO-8859-5              Y   glibc aix hpux irix osf solaris freebsd darwin
+#   ISO-8859-6              Y   glibc aix hpux solaris
+#   ISO-8859-7              Y   glibc aix hpux irix osf solaris
+#   ISO-8859-8              Y   glibc aix hpux osf solaris
+#   ISO-8859-9              Y   glibc aix hpux irix osf solaris
+#   ISO-8859-13                 glibc
+#   ISO-8859-14                 glibc
+#   ISO-8859-15                 glibc aix osf solaris freebsd
+#   KOI8-R                  Y   glibc solaris freebsd darwin
+#   KOI8-U                  Y   glibc freebsd darwin
+#   KOI8-T                      glibc
+#   CP437                       dos
+#   CP775                       dos
+#   CP850                       aix osf dos
+#   CP852                       dos
+#   CP855                       dos
+#   CP856                       aix
+#   CP857                       dos
+#   CP861                       dos
+#   CP862                       dos
+#   CP864                       dos
+#   CP865                       dos
+#   CP866                       freebsd darwin dos
+#   CP869                       dos
+#   CP874                       woe32 dos
+#   CP922                       aix
+#   CP932                       aix woe32 dos
+#   CP943                       aix
+#   CP949                       osf woe32 dos
+#   CP950                       woe32 dos
+#   CP1046                      aix
+#   CP1124                      aix
+#   CP1125                      dos
+#   CP1129                      aix
+#   CP1250                      woe32
+#   CP1251                      glibc solaris darwin woe32
+#   CP1252                      aix woe32
+#   CP1253                      woe32
+#   CP1254                      woe32
+#   CP1255                      glibc woe32
+#   CP1256                      woe32
+#   CP1257                      woe32
+#   GB2312                  Y   glibc aix hpux irix solaris freebsd darwin
+#   EUC-JP                  Y   glibc aix hpux irix osf solaris freebsd darwin
+#   EUC-KR                  Y   glibc aix hpux irix osf solaris freebsd darwin
+#   EUC-TW                      glibc aix hpux irix osf solaris
+#   BIG5                    Y   glibc aix hpux osf solaris freebsd darwin
+#   BIG5-HKSCS                  glibc solaris
+#   GBK                         glibc aix osf solaris woe32 dos
+#   GB18030                     glibc solaris
+#   SHIFT_JIS               Y   hpux osf solaris freebsd darwin
+#   JOHAB                       glibc solaris woe32
+#   TIS-620                     glibc aix hpux osf solaris
+#   VISCII                  Y   glibc
+#   TCVN5712-1                  glibc
+#   GEORGIAN-PS                 glibc
+#   HP-ROMAN8                   hpux
+#   HP-ARABIC8                  hpux
+#   HP-GREEK8                   hpux
+#   HP-HEBREW8                  hpux
+#   HP-TURKISH8                 hpux
+#   HP-KANA8                    hpux
+#   DEC-KANJI                   osf
+#   DEC-HANYU                   osf
+#   UTF-8                   Y   glibc aix hpux osf solaris
+#
+# Note: Names which are not marked as being a MIME name should not be used in
+# Internet protocols for information interchange (mail, news, etc.).
+#
+# Note: ASCII and ANSI_X3.4-1968 are synonymous canonical names. Applications
+# must understand both names and treat them as equivalent.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+
+host="$1"
+os=`echo "$host" | sed -e 's/^[^-]*-[^-]*-\(.*\)$/\1/'`
+echo "# This file contains a table of character encoding aliases,"
+echo "# suitable for operating system '${os}'."
+echo "# It was automatically generated from config.charset."
+# List of references, updated during installation:
+echo "# Packages using this file: "
+case "$os" in
+    linux-gnulibc1*)
+       # Linux libc5 doesn't have nl_langinfo(CODESET); therefore
+       # localcharset.c falls back to using the full locale name
+       # from the environment variables.
+       echo "C ASCII"
+       echo "POSIX ASCII"
+       for l in af af_ZA ca ca_ES da da_DK de de_AT de_BE de_CH de_DE de_LU \
+                en en_AU en_BW en_CA en_DK en_GB en_IE en_NZ en_US en_ZA \
+                en_ZW es es_AR es_BO es_CL es_CO es_DO es_EC es_ES es_GT \
+                es_HN es_MX es_PA es_PE es_PY es_SV es_US es_UY es_VE et \
+                et_EE eu eu_ES fi fi_FI fo fo_FO fr fr_BE fr_CA fr_CH fr_FR \
+                fr_LU ga ga_IE gl gl_ES id id_ID in in_ID is is_IS it it_CH \
+                it_IT kl kl_GL nl nl_BE nl_NL no no_NO pt pt_BR pt_PT sv \
+                sv_FI sv_SE; do
+         echo "$l ISO-8859-1"
+         echo "$l.iso-8859-1 ISO-8859-1"
+         echo "$l.iso-8859-15 ISO-8859-15"
+         echo "$l.iso-8859-15@euro ISO-8859-15"
+         echo "$l@euro ISO-8859-15"
+         echo "$l.cp-437 CP437"
+         echo "$l.cp-850 CP850"
+         echo "$l.cp-1252 CP1252"
+         echo "$l.cp-1252@euro CP1252"
+         #echo "$l.atari-st ATARI-ST" # not a commonly used encoding
+         echo "$l.utf-8 UTF-8"
+         echo "$l.utf-8@euro UTF-8"
+       done
+       for l in cs cs_CZ hr hr_HR hu hu_HU pl pl_PL ro ro_RO sk sk_SK sl \
+                sl_SI sr sr_CS sr_YU; do
+         echo "$l ISO-8859-2"
+         echo "$l.iso-8859-2 ISO-8859-2"
+         echo "$l.cp-852 CP852"
+         echo "$l.cp-1250 CP1250"
+         echo "$l.utf-8 UTF-8"
+       done
+       for l in mk mk_MK ru ru_RU; do
+         echo "$l ISO-8859-5"
+         echo "$l.iso-8859-5 ISO-8859-5"
+         echo "$l.koi8-r KOI8-R"
+         echo "$l.cp-866 CP866"
+         echo "$l.cp-1251 CP1251"
+         echo "$l.utf-8 UTF-8"
+       done
+       for l in ar ar_SA; do
+         echo "$l ISO-8859-6"
+         echo "$l.iso-8859-6 ISO-8859-6"
+         echo "$l.cp-864 CP864"
+         #echo "$l.cp-868 CP868" # not a commonly used encoding
+         echo "$l.cp-1256 CP1256"
+         echo "$l.utf-8 UTF-8"
+       done
+       for l in el el_GR gr gr_GR; do
+         echo "$l ISO-8859-7"
+         echo "$l.iso-8859-7 ISO-8859-7"
+         echo "$l.cp-869 CP869"
+         echo "$l.cp-1253 CP1253"
+         echo "$l.cp-1253@euro CP1253"
+         echo "$l.utf-8 UTF-8"
+         echo "$l.utf-8@euro UTF-8"
+       done
+       for l in he he_IL iw iw_IL; do
+         echo "$l ISO-8859-8"
+         echo "$l.iso-8859-8 ISO-8859-8"
+         echo "$l.cp-862 CP862"
+         echo "$l.cp-1255 CP1255"
+         echo "$l.utf-8 UTF-8"
+       done
+       for l in tr tr_TR; do
+         echo "$l ISO-8859-9"
+         echo "$l.iso-8859-9 ISO-8859-9"
+         echo "$l.cp-857 CP857"
+         echo "$l.cp-1254 CP1254"
+         echo "$l.utf-8 UTF-8"
+       done
+       for l in lt lt_LT lv lv_LV; do
+         #echo "$l BALTIC" # not a commonly used encoding, wrong encoding name
+         echo "$l ISO-8859-13"
+       done
+       for l in ru_UA uk uk_UA; do
+         echo "$l KOI8-U"
+       done
+       for l in zh zh_CN; do
+         #echo "$l GB_2312-80" # not a commonly used encoding, wrong encoding name
+         echo "$l GB2312"
+       done
+       for l in ja ja_JP ja_JP.EUC; do
+         echo "$l EUC-JP"
+       done
+       for l in ko ko_KR; do
+         echo "$l EUC-KR"
+       done
+       for l in th th_TH; do
+         echo "$l TIS-620"
+       done
+       for l in fa fa_IR; do
+         #echo "$l ISIRI-3342" # a broken encoding
+         echo "$l.utf-8 UTF-8"
+       done
+       ;;
+    linux* | *-gnu*)
+       # With glibc-2.1 or newer, we don't need any canonicalization,
+       # because glibc has iconv and both glibc and libiconv support all
+       # GNU canonical names directly. Therefore, the Makefile does not
+       # need to install the alias file at all.
+       # The following applies only to glibc-2.0.x and older libcs.
+       echo "ISO_646.IRV:1983 ASCII"
+       ;;
+    aix*)
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-6 ISO-8859-6"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-8 ISO-8859-8"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "IBM-850 CP850"
+       echo "IBM-856 CP856"
+       echo "IBM-921 ISO-8859-13"
+       echo "IBM-922 CP922"
+       echo "IBM-932 CP932"
+       echo "IBM-943 CP943"
+       echo "IBM-1046 CP1046"
+       echo "IBM-1124 CP1124"
+       echo "IBM-1129 CP1129"
+       echo "IBM-1252 CP1252"
+       echo "IBM-eucCN GB2312"
+       echo "IBM-eucJP EUC-JP"
+       echo "IBM-eucKR EUC-KR"
+       echo "IBM-eucTW EUC-TW"
+       echo "big5 BIG5"
+       echo "GBK GBK"
+       echo "TIS-620 TIS-620"
+       echo "UTF-8 UTF-8"
+       ;;
+    hpux*)
+       echo "iso88591 ISO-8859-1"
+       echo "iso88592 ISO-8859-2"
+       echo "iso88595 ISO-8859-5"
+       echo "iso88596 ISO-8859-6"
+       echo "iso88597 ISO-8859-7"
+       echo "iso88598 ISO-8859-8"
+       echo "iso88599 ISO-8859-9"
+       echo "iso885915 ISO-8859-15"
+       echo "roman8 HP-ROMAN8"
+       echo "arabic8 HP-ARABIC8"
+       echo "greek8 HP-GREEK8"
+       echo "hebrew8 HP-HEBREW8"
+       echo "turkish8 HP-TURKISH8"
+       echo "kana8 HP-KANA8"
+       echo "tis620 TIS-620"
+       echo "big5 BIG5"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       echo "hp15CN GB2312"
+       #echo "ccdc ?" # what is this?
+       echo "SJIS SHIFT_JIS"
+       echo "utf8 UTF-8"
+       ;;
+    irix*)
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "eucCN GB2312"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       ;;
+    osf*)
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-4 ISO-8859-4"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-8 ISO-8859-8"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "cp850 CP850"
+       echo "big5 BIG5"
+       echo "dechanyu DEC-HANYU"
+       echo "dechanzi GB2312"
+       echo "deckanji DEC-KANJI"
+       echo "deckorean EUC-KR"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       echo "GBK GBK"
+       echo "KSC5601 CP949"
+       echo "sdeckanji EUC-JP"
+       echo "SJIS SHIFT_JIS"
+       echo "TACTIS TIS-620"
+       echo "UTF-8 UTF-8"
+       ;;
+    solaris*)
+       echo "646 ASCII"
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-3 ISO-8859-3"
+       echo "ISO8859-4 ISO-8859-4"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-6 ISO-8859-6"
+       echo "ISO8859-7 ISO-8859-7"
+       echo "ISO8859-8 ISO-8859-8"
+       echo "ISO8859-9 ISO-8859-9"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "koi8-r KOI8-R"
+       echo "ansi-1251 CP1251"
+       echo "BIG5 BIG5"
+       echo "Big5-HKSCS BIG5-HKSCS"
+       echo "gb2312 GB2312"
+       echo "GBK GBK"
+       echo "GB18030 GB18030"
+       echo "cns11643 EUC-TW"
+       echo "5601 EUC-KR"
+       echo "ko_KR.johap92 JOHAB"
+       echo "eucJP EUC-JP"
+       echo "PCK SHIFT_JIS"
+       echo "TIS620.2533 TIS-620"
+       #echo "sun_eu_greek ?" # what is this?
+       echo "UTF-8 UTF-8"
+       ;;
+    freebsd* | os2*)
+       # FreeBSD 4.2 doesn't have nl_langinfo(CODESET); therefore
+       # localcharset.c falls back to using the full locale name
+       # from the environment variables.
+       # Likewise for OS/2. OS/2 has XFree86 just like FreeBSD. Just
+       # reuse FreeBSD's locale data for OS/2.
+       echo "C ASCII"
+       echo "US-ASCII ASCII"
+       for l in la_LN lt_LN; do
+         echo "$l.ASCII ASCII"
+       done
+       for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+                fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT la_LN \
+                lt_LN nl_BE nl_NL no_NO pt_PT sv_SE; do
+         echo "$l.ISO_8859-1 ISO-8859-1"
+         echo "$l.DIS_8859-15 ISO-8859-15"
+       done
+       for l in cs_CZ hr_HR hu_HU la_LN lt_LN pl_PL sl_SI; do
+         echo "$l.ISO_8859-2 ISO-8859-2"
+       done
+       for l in la_LN lt_LT; do
+         echo "$l.ISO_8859-4 ISO-8859-4"
+       done
+       for l in ru_RU ru_SU; do
+         echo "$l.KOI8-R KOI8-R"
+         echo "$l.ISO_8859-5 ISO-8859-5"
+         echo "$l.CP866 CP866"
+       done
+       echo "uk_UA.KOI8-U KOI8-U"
+       echo "zh_TW.BIG5 BIG5"
+       echo "zh_TW.Big5 BIG5"
+       echo "zh_CN.EUC GB2312"
+       echo "ja_JP.EUC EUC-JP"
+       echo "ja_JP.SJIS SHIFT_JIS"
+       echo "ja_JP.Shift_JIS SHIFT_JIS"
+       echo "ko_KR.EUC EUC-KR"
+       ;;
+    netbsd*)
+       echo "646 ASCII"
+       echo "ISO8859-1 ISO-8859-1"
+       echo "ISO8859-2 ISO-8859-2"
+       echo "ISO8859-4 ISO-8859-4"
+       echo "ISO8859-5 ISO-8859-5"
+       echo "ISO8859-15 ISO-8859-15"
+       echo "eucCN GB2312"
+       echo "eucJP EUC-JP"
+       echo "eucKR EUC-KR"
+       echo "eucTW EUC-TW"
+       echo "BIG5 BIG5"
+       echo "SJIS SHIFT_JIS"
+       ;;
+    darwin*)
+       # Darwin 6.8 doesn't have nl_langinfo(CODESET); therefore
+       # localcharset.c falls back to using the full locale name
+       # from the environment variables.
+       echo "C ASCII"
+       for l in en_AU en_CA en_GB en_US la_LN; do
+         echo "$l.US-ASCII ASCII"
+       done
+       for l in da_DK de_AT de_CH de_DE en_AU en_CA en_GB en_US es_ES \
+                fi_FI fr_BE fr_CA fr_CH fr_FR is_IS it_CH it_IT nl_BE \
+                nl_NL no_NO pt_PT sv_SE; do
+         echo "$l ISO-8859-1"
+         echo "$l.ISO8859-1 ISO-8859-1"
+         echo "$l.ISO8859-15 ISO-8859-15"
+       done
+       for l in la_LN; do
+         echo "$l.ISO8859-1 ISO-8859-1"
+         echo "$l.ISO8859-15 ISO-8859-15"
+       done
+       for l in cs_CZ hr_HR hu_HU la_LN pl_PL sl_SI; do
+         echo "$l.ISO8859-2 ISO-8859-2"
+       done
+       for l in la_LN lt_LT; do
+         echo "$l.ISO8859-4 ISO-8859-4"
+       done
+       for l in ru_RU; do
+         echo "$l.KOI8-R KOI8-R"
+         echo "$l.ISO8859-5 ISO-8859-5"
+         echo "$l.CP866 CP866"
+       done
+       for l in bg_BG; do
+         echo "$l.CP1251 CP1251"
+       done
+       echo "uk_UA.KOI8-U KOI8-U"
+       echo "zh_TW.BIG5 BIG5"
+       echo "zh_TW.Big5 BIG5"
+       echo "zh_CN.EUC GB2312"
+       echo "ja_JP.EUC EUC-JP"
+       echo "ja_JP.SJIS SHIFT_JIS"
+       echo "ko_KR.EUC EUC-KR"
+       ;;
+    beos*)
+       # BeOS has a single locale, and it has UTF-8 encoding.
+       echo "* UTF-8"
+       ;;
+    msdosdjgpp*)
+       # DJGPP 2.03 doesn't have nl_langinfo(CODESET); therefore
+       # localcharset.c falls back to using the full locale name
+       # from the environment variables.
+       echo "#"
+       echo "# The encodings given here may not all be correct."
+       echo "# If you find that the encoding given for your language and"
+       echo "# country is not the one your DOS machine actually uses, just"
+       echo "# correct it in this file, and send a mail to"
+       echo "# Juan Manuel Guerrero <st001906@hrz1.hrz.tu-darmstadt.de>"
+       echo "# and Bruno Haible <bruno@clisp.org>."
+       echo "#"
+       echo "C ASCII"
+       # ISO-8859-1 languages
+       echo "ca CP850"
+       echo "ca_ES CP850"
+       echo "da CP865"    # not CP850 ??
+       echo "da_DK CP865" # not CP850 ??
+       echo "de CP850"
+       echo "de_AT CP850"
+       echo "de_CH CP850"
+       echo "de_DE CP850"
+       echo "en CP850"
+       echo "en_AU CP850" # not CP437 ??
+       echo "en_CA CP850"
+       echo "en_GB CP850"
+       echo "en_NZ CP437"
+       echo "en_US CP437"
+       echo "en_ZA CP850" # not CP437 ??
+       echo "es CP850"
+       echo "es_AR CP850"
+       echo "es_BO CP850"
+       echo "es_CL CP850"
+       echo "es_CO CP850"
+       echo "es_CR CP850"
+       echo "es_CU CP850"
+       echo "es_DO CP850"
+       echo "es_EC CP850"
+       echo "es_ES CP850"
+       echo "es_GT CP850"
+       echo "es_HN CP850"
+       echo "es_MX CP850"
+       echo "es_NI CP850"
+       echo "es_PA CP850"
+       echo "es_PY CP850"
+       echo "es_PE CP850"
+       echo "es_SV CP850"
+       echo "es_UY CP850"
+       echo "es_VE CP850"
+       echo "et CP850"
+       echo "et_EE CP850"
+       echo "eu CP850"
+       echo "eu_ES CP850"
+       echo "fi CP850"
+       echo "fi_FI CP850"
+       echo "fr CP850"
+       echo "fr_BE CP850"
+       echo "fr_CA CP850"
+       echo "fr_CH CP850"
+       echo "fr_FR CP850"
+       echo "ga CP850"
+       echo "ga_IE CP850"
+       echo "gd CP850"
+       echo "gd_GB CP850"
+       echo "gl CP850"
+       echo "gl_ES CP850"
+       echo "id CP850"    # not CP437 ??
+       echo "id_ID CP850" # not CP437 ??
+       echo "is CP861"    # not CP850 ??
+       echo "is_IS CP861" # not CP850 ??
+       echo "it CP850"
+       echo "it_CH CP850"
+       echo "it_IT CP850"
+       echo "lt CP775"
+       echo "lt_LT CP775"
+       echo "lv CP775"
+       echo "lv_LV CP775"
+       echo "nb CP865"    # not CP850 ??
+       echo "nb_NO CP865" # not CP850 ??
+       echo "nl CP850"
+       echo "nl_BE CP850"
+       echo "nl_NL CP850"
+       echo "nn CP865"    # not CP850 ??
+       echo "nn_NO CP865" # not CP850 ??
+       echo "no CP865"    # not CP850 ??
+       echo "no_NO CP865" # not CP850 ??
+       echo "pt CP850"
+       echo "pt_BR CP850"
+       echo "pt_PT CP850"
+       echo "sv CP850"
+       echo "sv_SE CP850"
+       # ISO-8859-2 languages
+       echo "cs CP852"
+       echo "cs_CZ CP852"
+       echo "hr CP852"
+       echo "hr_HR CP852"
+       echo "hu CP852"
+       echo "hu_HU CP852"
+       echo "pl CP852"
+       echo "pl_PL CP852"
+       echo "ro CP852"
+       echo "ro_RO CP852"
+       echo "sk CP852"
+       echo "sk_SK CP852"
+       echo "sl CP852"
+       echo "sl_SI CP852"
+       echo "sq CP852"
+       echo "sq_AL CP852"
+       echo "sr CP852"    # CP852 or CP866 or CP855 ??
+       echo "sr_CS CP852" # CP852 or CP866 or CP855 ??
+       echo "sr_YU CP852" # CP852 or CP866 or CP855 ??
+       # ISO-8859-3 languages
+       echo "mt CP850"
+       echo "mt_MT CP850"
+       # ISO-8859-5 languages
+       echo "be CP866"
+       echo "be_BE CP866"
+       echo "bg CP866"    # not CP855 ??
+       echo "bg_BG CP866" # not CP855 ??
+       echo "mk CP866"    # not CP855 ??
+       echo "mk_MK CP866" # not CP855 ??
+       echo "ru CP866"
+       echo "ru_RU CP866"
+       echo "uk CP1125"
+       echo "uk_UA CP1125"
+       # ISO-8859-6 languages
+       echo "ar CP864"
+       echo "ar_AE CP864"
+       echo "ar_DZ CP864"
+       echo "ar_EG CP864"
+       echo "ar_IQ CP864"
+       echo "ar_IR CP864"
+       echo "ar_JO CP864"
+       echo "ar_KW CP864"
+       echo "ar_MA CP864"
+       echo "ar_OM CP864"
+       echo "ar_QA CP864"
+       echo "ar_SA CP864"
+       echo "ar_SY CP864"
+       # ISO-8859-7 languages
+       echo "el CP869"
+       echo "el_GR CP869"
+       # ISO-8859-8 languages
+       echo "he CP862"
+       echo "he_IL CP862"
+       # ISO-8859-9 languages
+       echo "tr CP857"
+       echo "tr_TR CP857"
+       # Japanese
+       echo "ja CP932"
+       echo "ja_JP CP932"
+       # Chinese
+       echo "zh_CN GBK"
+       echo "zh_TW CP950" # not CP938 ??
+       # Korean
+       echo "kr CP949"    # not CP934 ??
+       echo "kr_KR CP949" # not CP934 ??
+       # Thai
+       echo "th CP874"
+       echo "th_TH CP874"
+       # Other
+       echo "eo CP850"
+       echo "eo_EO CP850"
+       ;;
+esac
diff --git a/intl/dcgettext.c b/intl/dcgettext.c
new file mode 100644 (file)
index 0000000..c2a63f0
--- /dev/null
@@ -0,0 +1,56 @@
+/* Implementation of the dcgettext(3) function.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCGETTEXT libintl_dcgettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCGETTEXT (const char *domainname, const char *msgid, int category)
+{
+  return DCIGETTEXT (domainname, msgid, NULL, 0, 0, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+INTDEF(__dcgettext)
+weak_alias (__dcgettext, dcgettext);
+#endif
diff --git a/intl/dcigettext.c b/intl/dcigettext.c
new file mode 100644 (file)
index 0000000..22b7cd2
--- /dev/null
@@ -0,0 +1,1219 @@
+/* Implementation of the internal dcigettext function.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <locale.h>
+
+#ifdef _LIBC
+  /* Guess whether integer division by zero raises signal SIGFPE.
+     Set to 1 only if you know for sure.  In case of doubt, set to 0.  */
+# if defined __alpha__ || defined __arm__ || defined __i386__ \
+     || defined __m68k__ || defined __s390__
+#  define INTDIV0_RAISES_SIGFPE 1
+# else
+#  define INTDIV0_RAISES_SIGFPE 0
+# endif
+#endif
+#if !INTDIV0_RAISES_SIGFPE
+# include <signal.h>
+#endif
+
+#if defined HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+
+#include "gettextP.h"
+#include "plural-exp.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "hash-string.h"
+
+/* Thread safetyness.  */
+#ifdef _LIBC
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc.  */
+# define __libc_lock_define_initialized(CLASS, NAME)
+# define __libc_lock_lock(NAME)
+# define __libc_lock_unlock(NAME)
+# define __libc_rwlock_define_initialized(CLASS, NAME)
+# define __libc_rwlock_rdlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* Alignment of types.  */
+#if defined __GNUC__ && __GNUC__ >= 2
+# define alignof(TYPE) __alignof__ (TYPE)
+#else
+# define alignof(TYPE) \
+    ((int) &((struct { char dummy1; TYPE dummy2; } *) 0)->dummy2)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+# define _nl_default_dirname libintl_nl_default_dirname
+# define _nl_domain_bindings libintl_nl_domain_bindings
+#endif
+
+/* Some compilers, like SunOS4 cc, don't have offsetof in <stddef.h>.  */
+#ifndef offsetof
+# define offsetof(type,ident) ((size_t)&(((type*)0)->ident))
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define getcwd __getcwd
+# ifndef stpcpy
+#  define stpcpy __stpcpy
+# endif
+# define tfind __tfind
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+#  define getcwd(buf, max) getwd (buf)
+# else
+#  if VMS
+#   define getcwd(buf, max) (getcwd) (buf, max, 0)
+#  else
+char *getcwd ();
+#  endif
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy (char *dest, const char *src);
+# endif
+# ifndef HAVE_MEMPCPY
+static void *mempcpy (void *dest, const void *src, size_t n);
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try.  */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h.  */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+   PATH_MAX but might cause redefinition warnings when sys/param.h is
+   later included (as on MORE/BSD 4.3).  */
+#if defined _POSIX_VERSION || (defined HAVE_LIMITS_H && !defined __GNUC__)
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined PATH_MAX && defined _PC_PATH_MAX
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been.  */
+#if defined HAVE_SYS_PARAM_H && !defined PATH_MAX && !defined MAXPATHLEN
+# include <sys/param.h>
+#endif
+
+#if !defined PATH_MAX && defined MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+#endif
+
+/* This is the type used for the search tree where known translations
+   are stored.  */
+struct known_translation_t
+{
+  /* Domain in which to search.  */
+  char *domainname;
+
+  /* The category.  */
+  int category;
+
+  /* State of the catalog counter at the point the string was found.  */
+  int counter;
+
+  /* Catalog where the string was found.  */
+  struct loaded_l10nfile *domain;
+
+  /* And finally the translation.  */
+  const char *translation;
+  size_t translation_length;
+
+  /* Pointer to the string in question.  */
+  char msgid[ZERO];
+};
+
+/* Root of the search tree with known translations.  We can use this
+   only if the system provides the `tsearch' function family.  */
+#if defined HAVE_TSEARCH || defined _LIBC
+# include <search.h>
+
+static void *root;
+
+# ifdef _LIBC
+#  define tsearch __tsearch
+# endif
+
+/* Function to compare two entries in the table of known translations.  */
+static int
+transcmp (const void *p1, const void *p2)
+{
+  const struct known_translation_t *s1;
+  const struct known_translation_t *s2;
+  int result;
+
+  s1 = (const struct known_translation_t *) p1;
+  s2 = (const struct known_translation_t *) p2;
+
+  result = strcmp (s1->msgid, s2->msgid);
+  if (result == 0)
+    {
+      result = strcmp (s1->domainname, s2->domainname);
+      if (result == 0)
+       /* We compare the category last (though this is the cheapest
+          operation) since it is hopefully always the same (namely
+          LC_MESSAGES).  */
+       result = s1->category - s2->category;
+    }
+
+  return result;
+}
+#endif
+
+#ifndef INTVARDEF
+# define INTVARDEF(name)
+#endif
+#ifndef INTUSE
+# define INTUSE(name) name
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+   textdomain(3).  The default value for this is "messages".  */
+const char _nl_default_default_domain[] attribute_hidden = "messages";
+
+/* Value used as the default domain for gettext(3).  */
+const char *_nl_current_default_domain attribute_hidden
+     = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs.  */
+#if defined __EMX__
+extern const char _nl_default_dirname[];
+#else
+const char _nl_default_dirname[] = LOCALEDIR;
+INTVARDEF (_nl_default_dirname)
+#endif
+
+/* List with bindings of specific domains created by bindtextdomain()
+   calls.  */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions.  */
+static char *plural_lookup (struct loaded_l10nfile *domain,
+                           unsigned long int n,
+                           const char *translation, size_t translation_len)
+     internal_function;
+static const char *guess_category_value (int category,
+                                        const char *categoryname)
+     internal_function;
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+# define category_to_name(category)    _nl_category_names[category]
+#else
+static const char *category_to_name (int category) internal_function;
+#endif
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done.  */
+# define freea(p) /* nothing */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+  void *address;
+  struct block_list *next;
+};
+# define ADD_BLOCK(list, addr)                                               \
+  do {                                                                       \
+    struct block_list *newp = (struct block_list *) malloc (sizeof (*newp));  \
+    /* If we cannot get a free block we cannot add the new element to        \
+       the list.  */                                                         \
+    if (newp != NULL) {                                                              \
+      newp->address = (addr);                                                \
+      newp->next = (list);                                                   \
+      (list) = newp;                                                         \
+    }                                                                        \
+  } while (0)
+# define FREE_BLOCKS(list)                                                   \
+  do {                                                                       \
+    while (list != NULL) {                                                   \
+      struct block_list *old = list;                                         \
+      list = list->next;                                                     \
+      free (old->address);                                                   \
+      free (old);                                                            \
+    }                                                                        \
+  } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+# define freea(p) free (p)
+#endif /* have alloca */
+
+
+#ifdef _LIBC
+/* List of blocks allocated for translations.  */
+typedef struct transmem_list
+{
+  struct transmem_list *next;
+  char data[ZERO];
+} transmem_block_t;
+static struct transmem_list *transmem_list;
+#else
+typedef unsigned char transmem_block_t;
+#endif
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCIGETTEXT __dcigettext
+#else
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+#ifdef _LIBC
+__libc_rwlock_define_initialized (, _nl_state_lock attribute_hidden)
+#endif
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+   easier methods therefore we make a difference here.  */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+# ifndef HAVE_GETUID
+#  define getuid() 0
+# endif
+# ifndef HAVE_GETGID
+#  define getgid() 0
+# endif
+# ifndef HAVE_GETEUID
+#  define geteuid() getuid()
+# endif
+# ifndef HAVE_GETEGID
+#  define getegid() getgid()
+# endif
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+  if (enable_secure == 0)                                                    \
+    {                                                                        \
+      if (getuid () != geteuid () || getgid () != getegid ())                \
+       enable_secure = 1;                                                    \
+      else                                                                   \
+       enable_secure = -1;                                                   \
+    }
+#endif
+
+/* Get the function to evaluate the plural expression.  */
+#include "eval-plural.h"
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   CATEGORY locale and, if PLURAL is nonzero, search over string
+   depending on the plural form determined by N.  */
+char *
+DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
+           int plural, unsigned long int n, int category)
+{
+#ifndef HAVE_ALLOCA
+  struct block_list *block_list = NULL;
+#endif
+  struct loaded_l10nfile *domain;
+  struct binding *binding;
+  const char *categoryname;
+  const char *categoryvalue;
+  char *dirname, *xdomainname;
+  char *single_locale;
+  char *retval;
+  size_t retlen;
+  int saved_errno;
+#if defined HAVE_TSEARCH || defined _LIBC
+  struct known_translation_t *search;
+  struct known_translation_t **foundp = NULL;
+  size_t msgid_len;
+#endif
+  size_t domainname_len;
+
+  /* If no real MSGID is given return NULL.  */
+  if (msgid1 == NULL)
+    return NULL;
+
+#ifdef _LIBC
+  if (category < 0 || category >= __LC_LAST || category == LC_ALL)
+    /* Bogus.  */
+    return (plural == 0
+           ? (char *) msgid1
+           /* Use the Germanic plural rule.  */
+           : n == 1 ? (char *) msgid1 : (char *) msgid2);
+#endif
+
+  __libc_rwlock_rdlock (_nl_state_lock);
+
+  /* If DOMAINNAME is NULL, we are interested in the default domain.  If
+     CATEGORY is not LC_MESSAGES this might not make much sense but the
+     definition left this undefined.  */
+  if (domainname == NULL)
+    domainname = _nl_current_default_domain;
+
+  /* OS/2 specific: backward compatibility with older libintl versions  */
+#ifdef LC_MESSAGES_COMPAT
+  if (category == LC_MESSAGES_COMPAT)
+    category = LC_MESSAGES;
+#endif
+
+#if defined HAVE_TSEARCH || defined _LIBC
+  msgid_len = strlen (msgid1) + 1;
+
+  /* Try to find the translation among those which we found at
+     some time.  */
+  search = (struct known_translation_t *)
+          alloca (offsetof (struct known_translation_t, msgid) + msgid_len);
+  memcpy (search->msgid, msgid1, msgid_len);
+  search->domainname = (char *) domainname;
+  search->category = category;
+
+  foundp = (struct known_translation_t **) tfind (search, &root, transcmp);
+  freea (search);
+  if (foundp != NULL && (*foundp)->counter == _nl_msg_cat_cntr)
+    {
+      /* Now deal with plural.  */
+      if (plural)
+       retval = plural_lookup ((*foundp)->domain, n, (*foundp)->translation,
+                               (*foundp)->translation_length);
+      else
+       retval = (char *) (*foundp)->translation;
+
+      __libc_rwlock_unlock (_nl_state_lock);
+      return retval;
+    }
+#endif
+
+  /* Preserve the `errno' value.  */
+  saved_errno = errno;
+
+  /* See whether this is a SUID binary or not.  */
+  DETERMINE_SECURE;
+
+  /* First find matching binding.  */
+  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+    {
+      int compare = strcmp (domainname, binding->domainname);
+      if (compare == 0)
+       /* We found it!  */
+       break;
+      if (compare < 0)
+       {
+         /* It is not in the list.  */
+         binding = NULL;
+         break;
+       }
+    }
+
+  if (binding == NULL)
+    dirname = (char *) INTUSE(_nl_default_dirname);
+  else if (IS_ABSOLUTE_PATH (binding->dirname))
+    dirname = binding->dirname;
+  else
+    {
+      /* We have a relative path.  Make it absolute now.  */
+      size_t dirname_len = strlen (binding->dirname) + 1;
+      size_t path_max;
+      char *ret;
+
+      path_max = (unsigned int) PATH_MAX;
+      path_max += 2;           /* The getcwd docs say to do this.  */
+
+      for (;;)
+       {
+         dirname = (char *) alloca (path_max + dirname_len);
+         ADD_BLOCK (block_list, dirname);
+
+         __set_errno (0);
+         ret = getcwd (dirname, path_max);
+         if (ret != NULL || errno != ERANGE)
+           break;
+
+         path_max += path_max / 2;
+         path_max += PATH_INCR;
+       }
+
+      if (ret == NULL)
+       /* We cannot get the current working directory.  Don't signal an
+          error but simply return the default string.  */
+       goto return_untranslated;
+
+      stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
+    }
+
+  /* Now determine the symbolic name of CATEGORY and its value.  */
+  categoryname = category_to_name (category);
+  categoryvalue = guess_category_value (category, categoryname);
+
+  domainname_len = strlen (domainname);
+  xdomainname = (char *) alloca (strlen (categoryname)
+                                + domainname_len + 5);
+  ADD_BLOCK (block_list, xdomainname);
+
+  stpcpy (mempcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+                 domainname, domainname_len),
+         ".mo");
+
+  /* Creating working area.  */
+  single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+  ADD_BLOCK (block_list, single_locale);
+
+
+  /* Search for the given string.  This is a loop because we perhaps
+     got an ordered list of languages to consider for the translation.  */
+  while (1)
+    {
+      /* Make CATEGORYVALUE point to the next element of the list.  */
+      while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+       ++categoryvalue;
+      if (categoryvalue[0] == '\0')
+       {
+         /* The whole contents of CATEGORYVALUE has been searched but
+            no valid entry has been found.  We solve this situation
+            by implicitly appending a "C" entry, i.e. no translation
+            will take place.  */
+         single_locale[0] = 'C';
+         single_locale[1] = '\0';
+       }
+      else
+       {
+         char *cp = single_locale;
+         while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+           *cp++ = *categoryvalue++;
+         *cp = '\0';
+
+         /* When this is a SUID binary we must not allow accessing files
+            outside the dedicated directories.  */
+         if (ENABLE_SECURE && IS_PATH_WITH_DIR (single_locale))
+           /* Ingore this entry.  */
+           continue;
+       }
+
+      /* If the current locale value is C (or POSIX) we don't load a
+        domain.  Return the MSGID.  */
+      if (strcmp (single_locale, "C") == 0
+         || strcmp (single_locale, "POSIX") == 0)
+       break;
+
+      /* Find structure describing the message catalog matching the
+        DOMAINNAME and CATEGORY.  */
+      domain = _nl_find_domain (dirname, single_locale, xdomainname, binding);
+
+      if (domain != NULL)
+       {
+         retval = _nl_find_msg (domain, binding, msgid1, &retlen);
+
+         if (retval == NULL)
+           {
+             int cnt;
+
+             for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+               {
+                 retval = _nl_find_msg (domain->successor[cnt], binding,
+                                        msgid1, &retlen);
+
+                 if (retval != NULL)
+                   {
+                     domain = domain->successor[cnt];
+                     break;
+                   }
+               }
+           }
+
+         if (retval != NULL)
+           {
+             /* Found the translation of MSGID1 in domain DOMAIN:
+                starting at RETVAL, RETLEN bytes.  */
+             FREE_BLOCKS (block_list);
+#if defined HAVE_TSEARCH || defined _LIBC
+             if (foundp == NULL)
+               {
+                 /* Create a new entry and add it to the search tree.  */
+                 struct known_translation_t *newp;
+
+                 newp = (struct known_translation_t *)
+                   malloc (offsetof (struct known_translation_t, msgid)
+                           + msgid_len + domainname_len + 1);
+                 if (newp != NULL)
+                   {
+                     newp->domainname =
+                       mempcpy (newp->msgid, msgid1, msgid_len);
+                     memcpy (newp->domainname, domainname, domainname_len + 1);
+                     newp->category = category;
+                     newp->counter = _nl_msg_cat_cntr;
+                     newp->domain = domain;
+                     newp->translation = retval;
+                     newp->translation_length = retlen;
+
+                     /* Insert the entry in the search tree.  */
+                     foundp = (struct known_translation_t **)
+                       tsearch (newp, &root, transcmp);
+                     if (foundp == NULL
+                         || __builtin_expect (*foundp != newp, 0))
+                       /* The insert failed.  */
+                       free (newp);
+                   }
+               }
+             else
+               {
+                 /* We can update the existing entry.  */
+                 (*foundp)->counter = _nl_msg_cat_cntr;
+                 (*foundp)->domain = domain;
+                 (*foundp)->translation = retval;
+                 (*foundp)->translation_length = retlen;
+               }
+#endif
+             __set_errno (saved_errno);
+
+             /* Now deal with plural.  */
+             if (plural)
+               retval = plural_lookup (domain, n, retval, retlen);
+
+             __libc_rwlock_unlock (_nl_state_lock);
+             return retval;
+           }
+       }
+    }
+
+ return_untranslated:
+  /* Return the untranslated MSGID.  */
+  FREE_BLOCKS (block_list);
+  __libc_rwlock_unlock (_nl_state_lock);
+#ifndef _LIBC
+  if (!ENABLE_SECURE)
+    {
+      extern void _nl_log_untranslated (const char *logfilename,
+                                       const char *domainname,
+                                       const char *msgid1, const char *msgid2,
+                                       int plural);
+      const char *logfilename = getenv ("GETTEXT_LOG_UNTRANSLATED");
+
+      if (logfilename != NULL && logfilename[0] != '\0')
+       _nl_log_untranslated (logfilename, domainname, msgid1, msgid2, plural);
+    }
+#endif
+  __set_errno (saved_errno);
+  return (plural == 0
+         ? (char *) msgid1
+         /* Use the Germanic plural rule.  */
+         : n == 1 ? (char *) msgid1 : (char *) msgid2);
+}
+
+
+char *
+internal_function
+_nl_find_msg (struct loaded_l10nfile *domain_file,
+             struct binding *domainbinding, const char *msgid,
+             size_t *lengthp)
+{
+  struct loaded_domain *domain;
+  nls_uint32 nstrings;
+  size_t act;
+  char *result;
+  size_t resultlen;
+
+  if (domain_file->decided == 0)
+    _nl_load_domain (domain_file, domainbinding);
+
+  if (domain_file->data == NULL)
+    return NULL;
+
+  domain = (struct loaded_domain *) domain_file->data;
+
+  nstrings = domain->nstrings;
+
+  /* Locate the MSGID and its translation.  */
+  if (domain->hash_tab != NULL)
+    {
+      /* Use the hashing table.  */
+      nls_uint32 len = strlen (msgid);
+      nls_uint32 hash_val = hash_string (msgid);
+      nls_uint32 idx = hash_val % domain->hash_size;
+      nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+
+      while (1)
+       {
+         nls_uint32 nstr =
+           W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
+
+         if (nstr == 0)
+           /* Hash table entry is empty.  */
+           return NULL;
+
+         nstr--;
+
+         /* Compare msgid with the original string at index nstr.
+            We compare the lengths with >=, not ==, because plural entries
+            are represented by strings with an embedded NUL.  */
+         if (nstr < nstrings
+             ? W (domain->must_swap, domain->orig_tab[nstr].length) >= len
+               && (strcmp (msgid,
+                           domain->data + W (domain->must_swap,
+                                             domain->orig_tab[nstr].offset))
+                   == 0)
+             : domain->orig_sysdep_tab[nstr - nstrings].length > len
+               && (strcmp (msgid,
+                           domain->orig_sysdep_tab[nstr - nstrings].pointer)
+                   == 0))
+           {
+             act = nstr;
+             goto found;
+           }
+
+         if (idx >= domain->hash_size - incr)
+           idx -= domain->hash_size - incr;
+         else
+           idx += incr;
+       }
+      /* NOTREACHED */
+    }
+  else
+    {
+      /* Try the default method:  binary search in the sorted array of
+        messages.  */
+      size_t top, bottom;
+
+      bottom = 0;
+      top = nstrings;
+      while (bottom < top)
+       {
+         int cmp_val;
+
+         act = (bottom + top) / 2;
+         cmp_val = strcmp (msgid, (domain->data
+                                   + W (domain->must_swap,
+                                        domain->orig_tab[act].offset)));
+         if (cmp_val < 0)
+           top = act;
+         else if (cmp_val > 0)
+           bottom = act + 1;
+         else
+           goto found;
+       }
+      /* No translation was found.  */
+      return NULL;
+    }
+
+ found:
+  /* The translation was found at index ACT.  If we have to convert the
+     string to use a different character set, this is the time.  */
+  if (act < nstrings)
+    {
+      result = (char *)
+       (domain->data + W (domain->must_swap, domain->trans_tab[act].offset));
+      resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
+    }
+  else
+    {
+      result = (char *) domain->trans_sysdep_tab[act - nstrings].pointer;
+      resultlen = domain->trans_sysdep_tab[act - nstrings].length;
+    }
+
+#if defined _LIBC || HAVE_ICONV
+  if (domain->codeset_cntr
+      != (domainbinding != NULL ? domainbinding->codeset_cntr : 0))
+    {
+      /* The domain's codeset has changed through bind_textdomain_codeset()
+        since the message catalog was initialized or last accessed.  We
+        have to reinitialize the converter.  */
+      _nl_free_domain_conv (domain);
+      _nl_init_domain_conv (domain_file, domain, domainbinding);
+    }
+
+  if (
+# ifdef _LIBC
+      domain->conv != (__gconv_t) -1
+# else
+#  if HAVE_ICONV
+      domain->conv != (iconv_t) -1
+#  endif
+# endif
+      )
+    {
+      /* We are supposed to do a conversion.  First allocate an
+        appropriate table with the same structure as the table
+        of translations in the file, where we can put the pointers
+        to the converted strings in.
+        There is a slight complication with plural entries.  They
+        are represented by consecutive NUL terminated strings.  We
+        handle this case by converting RESULTLEN bytes, including
+        NULs.  */
+
+      if (domain->conv_tab == NULL
+         && ((domain->conv_tab =
+                (char **) calloc (nstrings + domain->n_sysdep_strings,
+                                  sizeof (char *)))
+             == NULL))
+       /* Mark that we didn't succeed allocating a table.  */
+       domain->conv_tab = (char **) -1;
+
+      if (__builtin_expect (domain->conv_tab == (char **) -1, 0))
+       /* Nothing we can do, no more memory.  */
+       goto converted;
+
+      if (domain->conv_tab[act] == NULL)
+       {
+         /* We haven't used this string so far, so it is not
+            translated yet.  Do this now.  */
+         /* We use a bit more efficient memory handling.
+            We allocate always larger blocks which get used over
+            time.  This is faster than many small allocations.   */
+         __libc_lock_define_initialized (static, lock)
+# define INITIAL_BLOCK_SIZE    4080
+         static unsigned char *freemem;
+         static size_t freemem_size;
+
+         const unsigned char *inbuf;
+         unsigned char *outbuf;
+         int malloc_count;
+# ifndef _LIBC
+         transmem_block_t *transmem_list = NULL;
+# endif
+
+         __libc_lock_lock (lock);
+
+         inbuf = (const unsigned char *) result;
+         outbuf = freemem + sizeof (size_t);
+
+         malloc_count = 0;
+         while (1)
+           {
+             transmem_block_t *newmem;
+# ifdef _LIBC
+             size_t non_reversible;
+             int res;
+
+             if (freemem_size < sizeof (size_t))
+               goto resize_freemem;
+
+             res = __gconv (domain->conv,
+                            &inbuf, inbuf + resultlen,
+                            &outbuf,
+                            outbuf + freemem_size - sizeof (size_t),
+                            &non_reversible);
+
+             if (res == __GCONV_OK || res == __GCONV_EMPTY_INPUT)
+               break;
+
+             if (res != __GCONV_FULL_OUTPUT)
+               {
+                 __libc_lock_unlock (lock);
+                 goto converted;
+               }
+
+             inbuf = result;
+# else
+#  if HAVE_ICONV
+             const char *inptr = (const char *) inbuf;
+             size_t inleft = resultlen;
+             char *outptr = (char *) outbuf;
+             size_t outleft;
+
+             if (freemem_size < sizeof (size_t))
+               goto resize_freemem;
+
+             outleft = freemem_size - sizeof (size_t);
+             if (iconv (domain->conv,
+                        (ICONV_CONST char **) &inptr, &inleft,
+                        &outptr, &outleft)
+                 != (size_t) (-1))
+               {
+                 outbuf = (unsigned char *) outptr;
+                 break;
+               }
+             if (errno != E2BIG)
+               {
+                 __libc_lock_unlock (lock);
+                 goto converted;
+               }
+#  endif
+# endif
+
+           resize_freemem:
+             /* We must allocate a new buffer or resize the old one.  */
+             if (malloc_count > 0)
+               {
+                 ++malloc_count;
+                 freemem_size = malloc_count * INITIAL_BLOCK_SIZE;
+                 newmem = (transmem_block_t *) realloc (transmem_list,
+                                                        freemem_size);
+# ifdef _LIBC
+                 if (newmem != NULL)
+                   transmem_list = transmem_list->next;
+                 else
+                   {
+                     struct transmem_list *old = transmem_list;
+
+                     transmem_list = transmem_list->next;
+                     free (old);
+                   }
+# endif
+               }
+             else
+               {
+                 malloc_count = 1;
+                 freemem_size = INITIAL_BLOCK_SIZE;
+                 newmem = (transmem_block_t *) malloc (freemem_size);
+               }
+             if (__builtin_expect (newmem == NULL, 0))
+               {
+                 freemem = NULL;
+                 freemem_size = 0;
+                 __libc_lock_unlock (lock);
+                 goto converted;
+               }
+
+# ifdef _LIBC
+             /* Add the block to the list of blocks we have to free
+                 at some point.  */
+             newmem->next = transmem_list;
+             transmem_list = newmem;
+
+             freemem = newmem->data;
+             freemem_size -= offsetof (struct transmem_list, data);
+# else
+             transmem_list = newmem;
+             freemem = newmem;
+# endif
+
+             outbuf = freemem + sizeof (size_t);
+           }
+
+         /* We have now in our buffer a converted string.  Put this
+            into the table of conversions.  */
+         *(size_t *) freemem = outbuf - freemem - sizeof (size_t);
+         domain->conv_tab[act] = (char *) freemem;
+         /* Shrink freemem, but keep it aligned.  */
+         freemem_size -= outbuf - freemem;
+         freemem = outbuf;
+         freemem += freemem_size & (alignof (size_t) - 1);
+         freemem_size = freemem_size & ~ (alignof (size_t) - 1);
+
+         __libc_lock_unlock (lock);
+       }
+
+      /* Now domain->conv_tab[act] contains the translation of all
+        the plural variants.  */
+      result = domain->conv_tab[act] + sizeof (size_t);
+      resultlen = *(size_t *) domain->conv_tab[act];
+    }
+
+ converted:
+  /* The result string is converted.  */
+
+#endif /* _LIBC || HAVE_ICONV */
+
+  *lengthp = resultlen;
+  return result;
+}
+
+
+/* Look up a plural variant.  */
+static char *
+internal_function
+plural_lookup (struct loaded_l10nfile *domain, unsigned long int n,
+              const char *translation, size_t translation_len)
+{
+  struct loaded_domain *domaindata = (struct loaded_domain *) domain->data;
+  unsigned long int index;
+  const char *p;
+
+  index = plural_eval (domaindata->plural, n);
+  if (index >= domaindata->nplurals)
+    /* This should never happen.  It means the plural expression and the
+       given maximum value do not match.  */
+    index = 0;
+
+  /* Skip INDEX strings at TRANSLATION.  */
+  p = translation;
+  while (index-- > 0)
+    {
+#ifdef _LIBC
+      p = __rawmemchr (p, '\0');
+#else
+      p = strchr (p, '\0');
+#endif
+      /* And skip over the NUL byte.  */
+      p++;
+
+      if (p >= translation + translation_len)
+       /* This should never happen.  It means the plural expression
+          evaluated to a value larger than the number of variants
+          available for MSGID1.  */
+       return (char *) translation;
+    }
+  return (char *) p;
+}
+
+#ifndef _LIBC
+/* Return string representation of locale CATEGORY.  */
+static const char *
+internal_function
+category_to_name (int category)
+{
+  const char *retval;
+
+  switch (category)
+  {
+#ifdef LC_COLLATE
+  case LC_COLLATE:
+    retval = "LC_COLLATE";
+    break;
+#endif
+#ifdef LC_CTYPE
+  case LC_CTYPE:
+    retval = "LC_CTYPE";
+    break;
+#endif
+#ifdef LC_MONETARY
+  case LC_MONETARY:
+    retval = "LC_MONETARY";
+    break;
+#endif
+#ifdef LC_NUMERIC
+  case LC_NUMERIC:
+    retval = "LC_NUMERIC";
+    break;
+#endif
+#ifdef LC_TIME
+  case LC_TIME:
+    retval = "LC_TIME";
+    break;
+#endif
+#ifdef LC_MESSAGES
+  case LC_MESSAGES:
+    retval = "LC_MESSAGES";
+    break;
+#endif
+#ifdef LC_RESPONSE
+  case LC_RESPONSE:
+    retval = "LC_RESPONSE";
+    break;
+#endif
+#ifdef LC_ALL
+  case LC_ALL:
+    /* This might not make sense but is perhaps better than any other
+       value.  */
+    retval = "LC_ALL";
+    break;
+#endif
+  default:
+    /* If you have a better idea for a default value let me know.  */
+    retval = "LC_XXX";
+  }
+
+  return retval;
+}
+#endif
+
+/* Guess value of current locale from value of the environment variables.  */
+static const char *
+internal_function
+guess_category_value (int category, const char *categoryname)
+{
+  const char *language;
+  const char *retval;
+
+  /* The highest priority value is the `LANGUAGE' environment
+     variable.  But we don't use the value if the currently selected
+     locale is the C locale.  This is a GNU extension.  */
+  language = getenv ("LANGUAGE");
+  if (language != NULL && language[0] == '\0')
+    language = NULL;
+
+  /* We have to proceed with the POSIX methods of looking to `LC_ALL',
+     `LC_xxx', and `LANG'.  On some systems this can be done by the
+     `setlocale' function itself.  */
+#ifdef _LIBC
+  retval = __current_locale_name (category);
+#else
+  retval = _nl_locale_name (category, categoryname);
+#endif
+
+  /* Ignore LANGUAGE if the locale is set to "C" because
+     1. "C" locale usually uses the ASCII encoding, and most international
+       messages use non-ASCII characters. These characters get displayed
+       as question marks (if using glibc's iconv()) or as invalid 8-bit
+       characters (because other iconv()s refuse to convert most non-ASCII
+       characters to ASCII). In any case, the output is ugly.
+     2. The precise output of some programs in the "C" locale is specified
+       by POSIX and should not depend on environment variables like
+       "LANGUAGE".  We allow such programs to use gettext().  */
+  return language != NULL && strcmp (retval, "C") != 0 ? language : retval;
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (char *dest, const char *src)
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
+
+#if !_LIBC && !HAVE_MEMPCPY
+static void *
+mempcpy (void *dest, const void *src, size_t n)
+{
+  return (void *) ((char *) memcpy (dest, src, n) + n);
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+   program's end.  */
+libc_freeres_fn (free_mem)
+{
+  void *old;
+
+  while (_nl_domain_bindings != NULL)
+    {
+      struct binding *oldp = _nl_domain_bindings;
+      _nl_domain_bindings = _nl_domain_bindings->next;
+      if (oldp->dirname != INTUSE(_nl_default_dirname))
+       /* Yes, this is a pointer comparison.  */
+       free (oldp->dirname);
+      free (oldp->codeset);
+      free (oldp);
+    }
+
+  if (_nl_current_default_domain != _nl_default_default_domain)
+    /* Yes, again a pointer comparison.  */
+    free ((char *) _nl_current_default_domain);
+
+  /* Remove the search tree with the known translations.  */
+  __tdestroy (root, free);
+  root = NULL;
+
+  while (transmem_list != NULL)
+    {
+      old = transmem_list;
+      transmem_list = transmem_list->next;
+      free (old);
+    }
+}
+#endif
diff --git a/intl/dcngettext.c b/intl/dcngettext.c
new file mode 100644 (file)
index 0000000..eb36833
--- /dev/null
@@ -0,0 +1,57 @@
+/* Implementation of the dcngettext(3) function.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DCNGETTEXT __dcngettext
+# define DCIGETTEXT __dcigettext
+#else
+# define DCNGETTEXT libintl_dcngettext
+# define DCIGETTEXT libintl_dcigettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+char *
+DCNGETTEXT (const char *domainname,
+           const char *msgid1, const char *msgid2, unsigned long int n,
+           int category)
+{
+  return DCIGETTEXT (domainname, msgid1, msgid2, 1, n, category);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dcngettext, dcngettext);
+#endif
diff --git a/intl/dgettext.c b/intl/dgettext.c
new file mode 100644 (file)
index 0000000..9b0d0de
--- /dev/null
@@ -0,0 +1,58 @@
+/* Implementation of the dgettext(3) function.
+   Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+#include <locale.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define DGETTEXT libintl_dgettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale.  */
+char *
+DGETTEXT (const char *domainname, const char *msgid)
+{
+  return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/intl/dngettext.c b/intl/dngettext.c
new file mode 100644 (file)
index 0000000..3278438
--- /dev/null
@@ -0,0 +1,59 @@
+/* Implementation of the dngettext(3) function.
+   Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+#include <locale.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define DNGETTEXT __dngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define DNGETTEXT libintl_dngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+   LC_MESSAGES locale and skip message according to the plural form.  */
+char *
+DNGETTEXT (const char *domainname,
+          const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return DCNGETTEXT (domainname, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__dngettext, dngettext);
+#endif
diff --git a/intl/eval-plural.h b/intl/eval-plural.h
new file mode 100644 (file)
index 0000000..dacd003
--- /dev/null
@@ -0,0 +1,108 @@
+/* Plural expression evaluation.
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef STATIC
+#define STATIC static
+#endif
+
+/* Evaluate the plural expression and return an index value.  */
+STATIC
+unsigned long int
+internal_function
+plural_eval (struct expression *pexp, unsigned long int n)
+{
+  switch (pexp->nargs)
+    {
+    case 0:
+      switch (pexp->operation)
+       {
+       case var:
+         return n;
+       case num:
+         return pexp->val.num;
+       default:
+         break;
+       }
+      /* NOTREACHED */
+      break;
+    case 1:
+      {
+       /* pexp->operation must be lnot.  */
+       unsigned long int arg = plural_eval (pexp->val.args[0], n);
+       return ! arg;
+      }
+    case 2:
+      {
+       unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
+       if (pexp->operation == lor)
+         return leftarg || plural_eval (pexp->val.args[1], n);
+       else if (pexp->operation == land)
+         return leftarg && plural_eval (pexp->val.args[1], n);
+       else
+         {
+           unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
+
+           switch (pexp->operation)
+             {
+             case mult:
+               return leftarg * rightarg;
+             case divide:
+#if !INTDIV0_RAISES_SIGFPE
+               if (rightarg == 0)
+                 raise (SIGFPE);
+#endif
+               return leftarg / rightarg;
+             case module:
+#if !INTDIV0_RAISES_SIGFPE
+               if (rightarg == 0)
+                 raise (SIGFPE);
+#endif
+               return leftarg % rightarg;
+             case plus:
+               return leftarg + rightarg;
+             case minus:
+               return leftarg - rightarg;
+             case less_than:
+               return leftarg < rightarg;
+             case greater_than:
+               return leftarg > rightarg;
+             case less_or_equal:
+               return leftarg <= rightarg;
+             case greater_or_equal:
+               return leftarg >= rightarg;
+             case equal:
+               return leftarg == rightarg;
+             case not_equal:
+               return leftarg != rightarg;
+             default:
+               break;
+             }
+         }
+       /* NOTREACHED */
+       break;
+      }
+    case 3:
+      {
+       /* pexp->operation must be qmop.  */
+       unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
+       return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
+      }
+    }
+  /* NOTREACHED */
+  return 0;
+}
diff --git a/intl/explodename.c b/intl/explodename.c
new file mode 100644 (file)
index 0000000..1361418
--- /dev/null
@@ -0,0 +1,185 @@
+/* Copyright (C) 1995-1998, 2000-2001, 2003 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+char *
+_nl_find_language (const char *name)
+{
+  while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
+        && name[0] != '+' && name[0] != ',')
+    ++name;
+
+  return (char *) name;
+}
+
+
+int
+_nl_explode_name (char *name,
+                 const char **language, const char **modifier,
+                 const char **territory, const char **codeset,
+                 const char **normalized_codeset, const char **special,
+                 const char **sponsor, const char **revision)
+{
+  enum { undecided, xpg, cen } syntax;
+  char *cp;
+  int mask;
+
+  *modifier = NULL;
+  *territory = NULL;
+  *codeset = NULL;
+  *normalized_codeset = NULL;
+  *special = NULL;
+  *sponsor = NULL;
+  *revision = NULL;
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = 0;
+  syntax = undecided;
+  *language = cp = name;
+  cp = _nl_find_language (*language);
+
+  if (*language == cp)
+    /* This does not make sense: language has to be specified.  Use
+       this entry as it is without exploding.  Perhaps it is an alias.  */
+    cp = strchr (*language, '\0');
+  else if (cp[0] == '_')
+    {
+      /* Next is the territory.  */
+      cp[0] = '\0';
+      *territory = ++cp;
+
+      while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+            && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+       ++cp;
+
+      mask |= TERRITORY;
+
+      if (cp[0] == '.')
+       {
+         /* Next is the codeset.  */
+         syntax = xpg;
+         cp[0] = '\0';
+         *codeset = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != '@')
+           ++cp;
+
+         mask |= XPG_CODESET;
+
+         if (*codeset != cp && (*codeset)[0] != '\0')
+           {
+             *normalized_codeset = _nl_normalize_codeset (*codeset,
+                                                          cp - *codeset);
+             if (strcmp (*codeset, *normalized_codeset) == 0)
+               free ((char *) *normalized_codeset);
+             else
+               mask |= XPG_NORM_CODESET;
+           }
+       }
+    }
+
+  if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+    {
+      /* Next is the modifier.  */
+      syntax = cp[0] == '@' ? xpg : cen;
+      cp[0] = '\0';
+      *modifier = ++cp;
+
+      while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+            && cp[0] != ',' && cp[0] != '_')
+       ++cp;
+
+      mask |= XPG_MODIFIER | CEN_AUDIENCE;
+    }
+
+  if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+    {
+      syntax = cen;
+
+      if (cp[0] == '+')
+       {
+         /* Next is special application (CEN syntax).  */
+         cp[0] = '\0';
+         *special = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+           ++cp;
+
+         mask |= CEN_SPECIAL;
+       }
+
+      if (cp[0] == ',')
+       {
+         /* Next is sponsor (CEN syntax).  */
+         cp[0] = '\0';
+         *sponsor = ++cp;
+
+         while (cp[0] != '\0' && cp[0] != '_')
+           ++cp;
+
+         mask |= CEN_SPONSOR;
+       }
+
+      if (cp[0] == '_')
+       {
+         /* Next is revision (CEN syntax).  */
+         cp[0] = '\0';
+         *revision = ++cp;
+
+         mask |= CEN_REVISION;
+       }
+    }
+
+  /* For CEN syntax values it might be important to have the
+     separator character in the file name, not for XPG syntax.  */
+  if (syntax == xpg)
+    {
+      if (*territory != NULL && (*territory)[0] == '\0')
+       mask &= ~TERRITORY;
+
+      if (*codeset != NULL && (*codeset)[0] == '\0')
+       mask &= ~XPG_CODESET;
+
+      if (*modifier != NULL && (*modifier)[0] == '\0')
+       mask &= ~XPG_MODIFIER;
+    }
+
+  return mask;
+}
diff --git a/intl/finddomain.c b/intl/finddomain.c
new file mode 100644 (file)
index 0000000..498f858
--- /dev/null
@@ -0,0 +1,192 @@
+/* Handle list of needed message catalogs
+   Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@gnu.org>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains.  */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+   the DOMAINNAME and CATEGORY parameters with respect to the currently
+   established bindings.  */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (const char *dirname, char *locale,
+                const char *domainname, struct binding *domainbinding)
+{
+  struct loaded_l10nfile *retval;
+  const char *language;
+  const char *modifier;
+  const char *territory;
+  const char *codeset;
+  const char *normalized_codeset;
+  const char *special;
+  const char *sponsor;
+  const char *revision;
+  const char *alias_value;
+  int mask;
+
+  /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+               language[_territory[.codeset]][@modifier]
+
+     and six parts for the CEN syntax:
+
+       language[_territory][+audience][+special][,[sponsor][_revision]]
+
+     Beside the first part all of them are allowed to be missing.  If
+     the full specified locale is not found, the less specific one are
+     looked for.  The various parts will be stripped off according to
+     the following order:
+               (1) revision
+               (2) sponsor
+               (3) special
+               (4) codeset
+               (5) normalized codeset
+               (6) territory
+               (7) audience/modifier
+   */
+
+  /* If we have already tested for this locale entry there has to
+     be one data set in the list of loaded domains.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+                              strlen (dirname) + 1, 0, locale, NULL, NULL,
+                              NULL, NULL, NULL, NULL, NULL, domainname, 0);
+  if (retval != NULL)
+    {
+      /* We know something about this locale.  */
+      int cnt;
+
+      if (retval->decided == 0)
+       _nl_load_domain (retval, domainbinding);
+
+      if (retval->data != NULL)
+       return retval;
+
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+       {
+         if (retval->successor[cnt]->decided == 0)
+           _nl_load_domain (retval->successor[cnt], domainbinding);
+
+         if (retval->successor[cnt]->data != NULL)
+           break;
+       }
+      return cnt >= 0 ? retval : NULL;
+      /* NOTREACHED */
+    }
+
+  /* See whether the locale value is an alias.  If yes its value
+     *overwrites* the alias name.  No test for the original value is
+     done.  */
+  alias_value = _nl_expand_alias (locale);
+  if (alias_value != NULL)
+    {
+#if defined _LIBC || defined HAVE_STRDUP
+      locale = strdup (alias_value);
+      if (locale == NULL)
+       return NULL;
+#else
+      size_t len = strlen (alias_value) + 1;
+      locale = (char *) malloc (len);
+      if (locale == NULL)
+       return NULL;
+
+      memcpy (locale, alias_value, len);
+#endif
+    }
+
+  /* Now we determine the single parts of the locale name.  First
+     look for the language.  Termination symbols are `_' and `@' if
+     we use XPG4 style, and `_', `+', and `,' if we use CEN syntax.  */
+  mask = _nl_explode_name (locale, &language, &modifier, &territory,
+                          &codeset, &normalized_codeset, &special,
+                          &sponsor, &revision);
+
+  /* Create all possible locale entries which might be interested in
+     generalization.  */
+  retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+                              strlen (dirname) + 1, mask, language, territory,
+                              codeset, normalized_codeset, modifier, special,
+                              sponsor, revision, domainname, 1);
+  if (retval == NULL)
+    /* This means we are out of core.  */
+    return NULL;
+
+  if (retval->decided == 0)
+    _nl_load_domain (retval, domainbinding);
+  if (retval->data == NULL)
+    {
+      int cnt;
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+       {
+         if (retval->successor[cnt]->decided == 0)
+           _nl_load_domain (retval->successor[cnt], domainbinding);
+         if (retval->successor[cnt]->data != NULL)
+           break;
+       }
+    }
+
+  /* The room for an alias was dynamically allocated.  Free it now.  */
+  if (alias_value != NULL)
+    free (locale);
+
+  /* The space for normalized_codeset is dynamically allocated.  Free it.  */
+  if (mask & XPG_NORM_CODESET)
+    free ((void *) normalized_codeset);
+
+  return retval;
+}
+
+
+#ifdef _LIBC
+libc_freeres_fn (free_mem)
+{
+  struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+  while (runp != NULL)
+    {
+      struct loaded_l10nfile *here = runp;
+      if (runp->data != NULL)
+       _nl_unload_domain ((struct loaded_domain *) runp->data);
+      runp = runp->next;
+      free ((char *) here->filename);
+      free (here);
+    }
+}
+#endif
diff --git a/intl/gettext.c b/intl/gettext.c
new file mode 100644 (file)
index 0000000..d82d439
--- /dev/null
@@ -0,0 +1,63 @@
+/* Implementation of gettext(3) function.
+   Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h>           /* Just for NULL.  */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DCGETTEXT INTUSE(__dcgettext)
+#else
+# define GETTEXT libintl_gettext
+# define DCGETTEXT libintl_dcgettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+GETTEXT (const char *msgid)
+{
+  return DCGETTEXT (NULL, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/intl/gettextP.h b/intl/gettextP.h
new file mode 100644 (file)
index 0000000..ccd5e87
--- /dev/null
@@ -0,0 +1,215 @@
+/* Header describing internals of libintl library.
+   Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include <stddef.h>            /* Get size_t.  */
+
+#ifdef _LIBC
+# include "../iconv/gconv_int.h"
+#else
+# if HAVE_ICONV
+#  include <iconv.h>
+# endif
+#endif
+
+#include "loadinfo.h"
+
+#include "gmo.h"               /* Get nls_uint32.  */
+
+/* @@ end of prolog @@ */
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+   almost always true or almost always false.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static inline nls_uint32
+SWAP (i)
+     nls_uint32 i;
+{
+  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+/* In-memory representation of system dependent string.  */
+struct sysdep_string_desc
+{
+  /* Length of addressed string, including the trailing NUL.  */
+  size_t length;
+  /* Pointer to addressed string.  */
+  const char *pointer;
+};
+
+/* The representation of an opened message catalog.  */
+struct loaded_domain
+{
+  /* Pointer to memory containing the .mo file.  */
+  const char *data;
+  /* 1 if the memory is mmap()ed, 0 if the memory is malloc()ed.  */
+  int use_mmap;
+  /* Size of mmap()ed memory.  */
+  size_t mmap_size;
+  /* 1 if the .mo file uses a different endianness than this machine.  */
+  int must_swap;
+  /* Pointer to additional malloc()ed memory.  */
+  void *malloced;
+
+  /* Number of static strings pairs.  */
+  nls_uint32 nstrings;
+  /* Pointer to descriptors of original strings in the file.  */
+  const struct string_desc *orig_tab;
+  /* Pointer to descriptors of translated strings in the file.  */
+  const struct string_desc *trans_tab;
+
+  /* Number of system dependent strings pairs.  */
+  nls_uint32 n_sysdep_strings;
+  /* Pointer to descriptors of original sysdep strings.  */
+  const struct sysdep_string_desc *orig_sysdep_tab;
+  /* Pointer to descriptors of translated sysdep strings.  */
+  const struct sysdep_string_desc *trans_sysdep_tab;
+
+  /* Size of hash table.  */
+  nls_uint32 hash_size;
+  /* Pointer to hash table.  */
+  const nls_uint32 *hash_tab;
+  /* 1 if the hash table uses a different endianness than this machine.  */
+  int must_swap_hash_tab;
+
+  int codeset_cntr;
+#ifdef _LIBC
+  __gconv_t conv;
+#else
+# if HAVE_ICONV
+  iconv_t conv;
+# endif
+#endif
+  char **conv_tab;
+
+  struct expression *plural;
+  unsigned long int nplurals;
+};
+
+/* We want to allocate a string at the end of the struct.  But ISO C
+   doesn't allow zero sized arrays.  */
+#ifdef __GNUC__
+# define ZERO 0
+#else
+# define ZERO 1
+#endif
+
+/* A set of settings bound to a message domain.  Used to store settings
+   from bindtextdomain() and bind_textdomain_codeset().  */
+struct binding
+{
+  struct binding *next;
+  char *dirname;
+  int codeset_cntr;    /* Incremented each time codeset changes.  */
+  char *codeset;
+  char domainname[ZERO];
+};
+
+/* A counter which is incremented each time some previous translations
+   become invalid.
+   This variable is part of the external ABI of the GNU libintl.  */
+extern int _nl_msg_cat_cntr;
+
+#ifndef _LIBC
+const char *_nl_locale_name (int category, const char *categoryname);
+#endif
+
+struct loaded_l10nfile *_nl_find_domain (const char *__dirname, char *__locale,
+                                        const char *__domainname,
+                                        struct binding *__domainbinding)
+     internal_function;
+void _nl_load_domain (struct loaded_l10nfile *__domain,
+                     struct binding *__domainbinding)
+     internal_function;
+void _nl_unload_domain (struct loaded_domain *__domain)
+     internal_function;
+const char *_nl_init_domain_conv (struct loaded_l10nfile *__domain_file,
+                                 struct loaded_domain *__domain,
+                                 struct binding *__domainbinding)
+     internal_function;
+void _nl_free_domain_conv (struct loaded_domain *__domain)
+     internal_function;
+
+char *_nl_find_msg (struct loaded_l10nfile *domain_file,
+                   struct binding *domainbinding, const char *msgid,
+                   size_t *lengthp)
+     internal_function;
+
+#ifdef _LIBC
+extern char *__gettext (const char *__msgid);
+extern char *__dgettext (const char *__domainname, const char *__msgid);
+extern char *__dcgettext (const char *__domainname, const char *__msgid,
+                         int __category);
+extern char *__ngettext (const char *__msgid1, const char *__msgid2,
+                        unsigned long int __n);
+extern char *__dngettext (const char *__domainname,
+                         const char *__msgid1, const char *__msgid2,
+                         unsigned long int n);
+extern char *__dcngettext (const char *__domainname,
+                          const char *__msgid1, const char *__msgid2,
+                          unsigned long int __n, int __category);
+extern char *__dcigettext (const char *__domainname,
+                          const char *__msgid1, const char *__msgid2,
+                          int __plural, unsigned long int __n,
+                          int __category);
+extern char *__textdomain (const char *__domainname);
+extern char *__bindtextdomain (const char *__domainname,
+                              const char *__dirname);
+extern char *__bind_textdomain_codeset (const char *__domainname,
+                                       const char *__codeset);
+#else
+/* Declare the exported libintl_* functions, in a way that allows us to
+   call them under their real name.  */
+# undef _INTL_REDIRECT_INLINE
+# undef _INTL_REDIRECT_MACROS
+# define _INTL_REDIRECT_MACROS
+# include "libgnuintl.h"
+extern char *libintl_dcigettext (const char *__domainname,
+                                const char *__msgid1, const char *__msgid2,
+                                int __plural, unsigned long int __n,
+                                int __category);
+#endif
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h  */
diff --git a/intl/gmo.h b/intl/gmo.h
new file mode 100644 (file)
index 0000000..26515fe
--- /dev/null
@@ -0,0 +1,149 @@
+/* Description of GNU message catalog format: general file layout.
+   Copyright (C) 1995, 1997, 2000-2002, 2004 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <limits.h>
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format.  */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format.  */
+#define MO_REVISION_NUMBER 0
+#define MO_REVISION_NUMBER_WITH_SYSDEP_I 1
+
+/* The following contortions are an attempt to use the C preprocessor
+   to determine an unsigned integral type that is 32 bits wide.  An
+   alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+   as of version autoconf-2.13, the AC_CHECK_SIZEOF macro doesn't work
+   when cross-compiling.  */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+   This should be valid for all systems GNU cares about because
+   that doesn't include 16-bit systems, and only modern systems
+   (that certainly have <limits.h>) have 64+-bit integral types.  */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+#  if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+#  else
+  /* The following line is intended to throw an error.  Using #error is
+     not portable enough.  */
+  "Cannot determine unsigned 32-bit data type."
+#  endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format.  */
+struct mo_file_header
+{
+  /* The magic number.  */
+  nls_uint32 magic;
+  /* The revision number of the file format.  */
+  nls_uint32 revision;
+
+  /* The following are only used in .mo files with major revision 0 or 1.  */
+
+  /* The number of strings pairs.  */
+  nls_uint32 nstrings;
+  /* Offset of table with start offsets of original strings.  */
+  nls_uint32 orig_tab_offset;
+  /* Offset of table with start offsets of translated strings.  */
+  nls_uint32 trans_tab_offset;
+  /* Size of hash table.  */
+  nls_uint32 hash_tab_size;
+  /* Offset of first hash table entry.  */
+  nls_uint32 hash_tab_offset;
+
+  /* The following are only used in .mo files with minor revision >= 1.  */
+
+  /* The number of system dependent segments.  */
+  nls_uint32 n_sysdep_segments;
+  /* Offset of table describing system dependent segments.  */
+  nls_uint32 sysdep_segments_offset;
+  /* The number of system dependent strings pairs.  */
+  nls_uint32 n_sysdep_strings;
+  /* Offset of table with start offsets of original sysdep strings.  */
+  nls_uint32 orig_sysdep_tab_offset;
+  /* Offset of table with start offsets of translated sysdep strings.  */
+  nls_uint32 trans_sysdep_tab_offset;
+};
+
+/* Descriptor for static string contained in the binary .mo file.  */
+struct string_desc
+{
+  /* Length of addressed string, not including the trailing NUL.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* The following are only used in .mo files with minor revision >= 1.  */
+
+/* Descriptor for system dependent string segment.  */
+struct sysdep_segment
+{
+  /* Length of addressed string, including the trailing NUL.  */
+  nls_uint32 length;
+  /* Offset of string in file.  */
+  nls_uint32 offset;
+};
+
+/* Descriptor for system dependent string.  */
+struct sysdep_string
+{
+  /* Offset of static string segments in file.  */
+  nls_uint32 offset;
+  /* Alternating sequence of static and system dependent segments.
+     The last segment is a static segment, including the trailing NUL.  */
+  struct segment_pair
+  {
+    /* Size of static segment.  */
+    nls_uint32 segsize;
+    /* Reference to system dependent string segment, or ~0 at the end.  */
+    nls_uint32 sysdepref;
+  } segments[1];
+};
+
+/* Marker for the end of the segments[] array.  This has the value 0xFFFFFFFF,
+   regardless whether 'int' is 16 bit, 32 bit, or 64 bit.  */
+#define SEGMENTS_END ((nls_uint32) ~0)
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettext.h  */
diff --git a/intl/hash-string.h b/intl/hash-string.h
new file mode 100644 (file)
index 0000000..2c9a3a5
--- /dev/null
@@ -0,0 +1,48 @@
+/* Description of GNU message catalog format: string hashing function.
+   Copyright (C) 1995, 1997-1998, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* @@ end of prolog @@ */
+
+/* We assume to have `unsigned long int' value with at least 32 bits.  */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+static inline unsigned long int
+hash_string (const char *str_param)
+{
+  unsigned long int hval, g;
+  const char *str = str_param;
+
+  /* Compute the hash value for the given string.  */
+  hval = 0;
+  while (*str != '\0')
+    {
+      hval <<= 4;
+      hval += (unsigned char) *str++;
+      g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+      if (g != 0)
+       {
+         hval ^= g >> (HASHWORDBITS - 8);
+         hval ^= g;
+       }
+    }
+  return hval;
+}
diff --git a/intl/intl-compat.c b/intl/intl-compat.c
new file mode 100644 (file)
index 0000000..15be09c
--- /dev/null
@@ -0,0 +1,131 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+   Library.
+   Copyright (C) 1995, 2000-2003 Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* This file redirects the gettext functions (without prefix) to those
+   defined in the included GNU libintl library (with "libintl_" prefix).
+   It is compiled into libintl in order to make the AM_GNU_GETTEXT test
+   of gettext <= 0.11.2 work with the libintl library >= 0.11.3 which
+   has the redirections primarily in the <libintl.h> include file.
+   It is also compiled into libgnuintl so that libgnuintl.so can be used
+   as LD_PRELOADable library on glibc systems, to provide the extra
+   features that the functions in the libc don't have (namely, logging).  */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef ngettext
+#undef dngettext
+#undef dcngettext
+#undef textdomain
+#undef bindtextdomain
+#undef bind_textdomain_codeset
+
+
+/* When building a DLL, we must export some functions.  Note that because
+   the functions are only defined for binary backward compatibility, we
+   don't need to use __declspec(dllimport) in any case.  */
+#if defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+
+DLL_EXPORTED
+char *
+gettext (const char *msgid)
+{
+  return libintl_gettext (msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dgettext (const char *domainname, const char *msgid)
+{
+  return libintl_dgettext (domainname, msgid);
+}
+
+
+DLL_EXPORTED
+char *
+dcgettext (const char *domainname, const char *msgid, int category)
+{
+  return libintl_dcgettext (domainname, msgid, category);
+}
+
+
+DLL_EXPORTED
+char *
+ngettext (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return libintl_ngettext (msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dngettext (const char *domainname,
+          const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return libintl_dngettext (domainname, msgid1, msgid2, n);
+}
+
+
+DLL_EXPORTED
+char *
+dcngettext (const char *domainname,
+           const char *msgid1, const char *msgid2, unsigned long int n,
+           int category)
+{
+  return libintl_dcngettext (domainname, msgid1, msgid2, n, category);
+}
+
+
+DLL_EXPORTED
+char *
+textdomain (const char *domainname)
+{
+  return libintl_textdomain (domainname);
+}
+
+
+DLL_EXPORTED
+char *
+bindtextdomain (const char *domainname, const char *dirname)
+{
+  return libintl_bindtextdomain (domainname, dirname);
+}
+
+
+DLL_EXPORTED
+char *
+bind_textdomain_codeset (const char *domainname, const char *codeset)
+{
+  return libintl_bind_textdomain_codeset (domainname, codeset);
+}
diff --git a/intl/l10nflist.c b/intl/l10nflist.c
new file mode 100644 (file)
index 0000000..e62aa5c
--- /dev/null
@@ -0,0 +1,421 @@
+/* Copyright (C) 1995-1999, 2000-2003 Free Software Foundation, Inc.
+   Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for stpcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found.  Sigh!  */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+#  define NULL ((void *) 0)
+# else
+#  define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# ifndef stpcpy
+#  define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy (char *dest, const char *src);
+# endif
+#endif
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_ABSOLUTE_PATH(P)  tests whether P is an absolute path.  If it is not,
+                        it may be concatenated to a directory pathname.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
+#endif
+
+/* Define function which are usually not available.  */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ.  */
+static size_t
+argz_count__ (const char *argz, size_t len)
+{
+  size_t count = 0;
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len + 1;
+      len -= part_len + 1;
+      count++;
+    }
+  return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#else
+# ifdef _LIBC
+#  define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
+# endif
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+   except the last into the character SEP.  */
+static void
+argz_stringify__ (char *argz, size_t len, int sep)
+{
+  while (len > 0)
+    {
+      size_t part_len = strlen (argz);
+      argz += part_len;
+      len -= part_len + 1;
+      if (len > 0)
+       *argz++ = sep;
+    }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#else
+# ifdef _LIBC
+#  define __argz_stringify(argz, len, sep) \
+  INTUSE(__argz_stringify) (argz, len, sep)
+# endif
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *
+argz_next__ (char *argz, size_t argz_len, const char *entry)
+{
+  if (entry)
+    {
+      if (entry < argz + argz_len)
+        entry = strchr (entry, '\0') + 1;
+
+      return entry >= argz + argz_len ? NULL : (char *) entry;
+    }
+  else
+    if (argz_len > 0)
+      return argz;
+    else
+      return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X.  */
+static inline int
+pop (int x)
+{
+  /* We assume that no more than 16 bits are used.  */
+  x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+  x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+  x = ((x >> 4) + x) & 0x0f0f;
+  x = ((x >> 8) + x) & 0xff;
+
+  return x;
+}
+
+\f
+struct loaded_l10nfile *
+_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+                   const char *dirlist, size_t dirlist_len,
+                   int mask, const char *language, const char *territory,
+                   const char *codeset, const char *normalized_codeset,
+                   const char *modifier, const char *special,
+                   const char *sponsor, const char *revision,
+                   const char *filename, int do_allocate)
+{
+  char *abs_filename;
+  struct loaded_l10nfile **lastp;
+  struct loaded_l10nfile *retval;
+  char *cp;
+  size_t dirlist_count;
+  size_t entries;
+  int cnt;
+
+  /* If LANGUAGE contains an absolute directory specification, we ignore
+     DIRLIST.  */
+  if (IS_ABSOLUTE_PATH (language))
+    dirlist_len = 0;
+
+  /* Allocate room for the full file name.  */
+  abs_filename = (char *) malloc (dirlist_len
+                                 + strlen (language)
+                                 + ((mask & TERRITORY) != 0
+                                    ? strlen (territory) + 1 : 0)
+                                 + ((mask & XPG_CODESET) != 0
+                                    ? strlen (codeset) + 1 : 0)
+                                 + ((mask & XPG_NORM_CODESET) != 0
+                                    ? strlen (normalized_codeset) + 1 : 0)
+                                 + (((mask & XPG_MODIFIER) != 0
+                                     || (mask & CEN_AUDIENCE) != 0)
+                                    ? strlen (modifier) + 1 : 0)
+                                 + ((mask & CEN_SPECIAL) != 0
+                                    ? strlen (special) + 1 : 0)
+                                 + (((mask & CEN_SPONSOR) != 0
+                                     || (mask & CEN_REVISION) != 0)
+                                    ? (1 + ((mask & CEN_SPONSOR) != 0
+                                            ? strlen (sponsor) : 0)
+                                       + ((mask & CEN_REVISION) != 0
+                                          ? strlen (revision) + 1 : 0)) : 0)
+                                 + 1 + strlen (filename) + 1);
+
+  if (abs_filename == NULL)
+    return NULL;
+
+  /* Construct file name.  */
+  cp = abs_filename;
+  if (dirlist_len > 0)
+    {
+      memcpy (cp, dirlist, dirlist_len);
+      __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
+      cp += dirlist_len;
+      cp[-1] = '/';
+    }
+
+  cp = stpcpy (cp, language);
+
+  if ((mask & TERRITORY) != 0)
+    {
+      *cp++ = '_';
+      cp = stpcpy (cp, territory);
+    }
+  if ((mask & XPG_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, codeset);
+    }
+  if ((mask & XPG_NORM_CODESET) != 0)
+    {
+      *cp++ = '.';
+      cp = stpcpy (cp, normalized_codeset);
+    }
+  if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+    {
+      /* This component can be part of both syntaces but has different
+        leading characters.  For CEN we use `+', else `@'.  */
+      *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+      cp = stpcpy (cp, modifier);
+    }
+  if ((mask & CEN_SPECIAL) != 0)
+    {
+      *cp++ = '+';
+      cp = stpcpy (cp, special);
+    }
+  if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+    {
+      *cp++ = ',';
+      if ((mask & CEN_SPONSOR) != 0)
+       cp = stpcpy (cp, sponsor);
+      if ((mask & CEN_REVISION) != 0)
+       {
+         *cp++ = '_';
+         cp = stpcpy (cp, revision);
+       }
+    }
+
+  *cp++ = '/';
+  stpcpy (cp, filename);
+
+  /* Look in list of already loaded domains whether it is already
+     available.  */
+  lastp = l10nfile_list;
+  for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+    if (retval->filename != NULL)
+      {
+       int compare = strcmp (retval->filename, abs_filename);
+       if (compare == 0)
+         /* We found it!  */
+         break;
+       if (compare < 0)
+         {
+           /* It's not in the list.  */
+           retval = NULL;
+           break;
+         }
+
+       lastp = &retval->next;
+      }
+
+  if (retval != NULL || do_allocate == 0)
+    {
+      free (abs_filename);
+      return retval;
+    }
+
+  dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
+
+  /* Allocate a new loaded_l10nfile.  */
+  retval =
+    (struct loaded_l10nfile *)
+    malloc (sizeof (*retval)
+           + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
+              * sizeof (struct loaded_l10nfile *)));
+  if (retval == NULL)
+    return NULL;
+
+  retval->filename = abs_filename;
+
+  /* We set retval->data to NULL here; it is filled in later.
+     Setting retval->decided to 1 here means that retval does not
+     correspond to a real file (dirlist_count > 1) or is not worth
+     looking up (if an unnormalized codeset was specified).  */
+  retval->decided = (dirlist_count > 1
+                    || ((mask & XPG_CODESET) != 0
+                        && (mask & XPG_NORM_CODESET) != 0));
+  retval->data = NULL;
+
+  retval->next = *lastp;
+  *lastp = retval;
+
+  entries = 0;
+  /* Recurse to fill the inheritance list of RETVAL.
+     If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
+     entry does not correspond to a real file; retval->filename contains
+     colons.  In this case we loop across all elements of DIRLIST and
+     across all bit patterns dominated by MASK.
+     If the DIRLIST is a single directory or entirely redundant (i.e.
+     DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
+     MASK, excluding MASK itself.
+     In either case, we loop down from MASK to 0.  This has the effect
+     that the extra bits in the locale name are dropped in this order:
+     first the modifier, then the territory, then the codeset, then the
+     normalized_codeset.  */
+  for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
+    if ((cnt & ~mask) == 0
+       && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+       && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+      {
+       if (dirlist_count > 1)
+         {
+           /* Iterate over all elements of the DIRLIST.  */
+           char *dir = NULL;
+
+           while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+                  != NULL)
+             retval->successor[entries++]
+               = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
+                                     cnt, language, territory, codeset,
+                                     normalized_codeset, modifier, special,
+                                     sponsor, revision, filename, 1);
+         }
+       else
+         retval->successor[entries++]
+           = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
+                                 cnt, language, territory, codeset,
+                                 normalized_codeset, modifier, special,
+                                 sponsor, revision, filename, 1);
+      }
+  retval->successor[entries] = NULL;
+
+  return retval;
+}
+\f
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  The return value is dynamically allocated and has to be
+   freed by the caller.  */
+const char *
+_nl_normalize_codeset (const char *codeset, size_t name_len)
+{
+  int len = 0;
+  int only_digit = 1;
+  char *retval;
+  char *wp;
+  size_t cnt;
+
+  for (cnt = 0; cnt < name_len; ++cnt)
+    if (isalnum ((unsigned char) codeset[cnt]))
+      {
+       ++len;
+
+       if (isalpha ((unsigned char) codeset[cnt]))
+         only_digit = 0;
+      }
+
+  retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+  if (retval != NULL)
+    {
+      if (only_digit)
+       wp = stpcpy (retval, "iso");
+      else
+       wp = retval;
+
+      for (cnt = 0; cnt < name_len; ++cnt)
+       if (isalpha ((unsigned char) codeset[cnt]))
+         *wp++ = tolower ((unsigned char) codeset[cnt]);
+       else if (isdigit ((unsigned char) codeset[cnt]))
+         *wp++ = codeset[cnt];
+
+      *wp = '\0';
+    }
+
+  return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (char *dest, const char *src)
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
diff --git a/intl/libgnuintl.h.in b/intl/libgnuintl.h.in
new file mode 100644 (file)
index 0000000..c8c5620
--- /dev/null
@@ -0,0 +1,383 @@
+/* Message catalogs for internationalization.
+   Copyright (C) 1995-1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _LIBINTL_H
+#define _LIBINTL_H     1
+
+#include <locale.h>
+
+/* The LC_MESSAGES locale category is the category used by the functions
+   gettext() and dgettext().  It is specified in POSIX, but not in ANSI C.
+   On systems that don't define it, use an arbitrary value instead.
+   On Solaris, <locale.h> defines __LOCALE_H (or _LOCALE_H in Solaris 2.5)
+   then includes <libintl.h> (i.e. this file!) and then only defines
+   LC_MESSAGES.  To avoid a redefinition warning, don't define LC_MESSAGES
+   in this case.  */
+#if !defined LC_MESSAGES && !(defined __LOCALE_H || (defined _LOCALE_H && defined __sun))
+# define LC_MESSAGES 1729
+#endif
+
+/* We define an additional symbol to signal that we use the GNU
+   implementation of gettext.  */
+#define __USE_GNU_GETTEXT 1
+
+/* Provide information about the supported file formats.  Returns the
+   maximum minor revision number supported for a given major revision.  */
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) \
+  ((major) == 0 ? 1 : -1)
+
+/* Resolve a platform specific conflict on DJGPP.  GNU gettext takes
+   precedence over _conio_gettext.  */
+#ifdef __DJGPP__
+# undef gettext
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* We redirect the functions to those prefixed with "libintl_".  This is
+   necessary, because some systems define gettext/textdomain/... in the C
+   library (namely, Solaris 2.4 and newer, and GNU libc 2.0 and newer).
+   If we used the unprefixed names, there would be cases where the
+   definition in the C library would override the one in the libintl.so
+   shared library.  Recall that on ELF systems, the symbols are looked
+   up in the following order:
+     1. in the executable,
+     2. in the shared libraries specified on the link command line, in order,
+     3. in the dependencies of the shared libraries specified on the link
+        command line,
+     4. in the dlopen()ed shared libraries, in the order in which they were
+        dlopen()ed.
+   The definition in the C library would override the one in libintl.so if
+   either
+     * -lc is given on the link command line and -lintl isn't, or
+     * -lc is given on the link command line before -lintl, or
+     * libintl.so is a dependency of a dlopen()ed shared library but not
+       linked to the executable at link time.
+   Since Solaris gettext() behaves differently than GNU gettext(), this
+   would be unacceptable.
+
+   The redirection happens by default through macros in C, so that &gettext
+   is independent of the compilation unit, but through inline functions in
+   C++, in order not to interfere with the name mangling of class fields or
+   class methods called 'gettext'.  */
+
+/* The user can define _INTL_REDIRECT_INLINE or _INTL_REDIRECT_MACROS.
+   If he doesn't, we choose the method.  A third possible method is
+   _INTL_REDIRECT_ASM, supported only by GCC.  */
+#if !(defined _INTL_REDIRECT_INLINE || defined _INTL_REDIRECT_MACROS)
+# if __GNUC__ >= 2 && !defined __APPLE_CC__ && !defined __MINGW32__ && !(__GNUC__ == 2 && defined _AIX) && (defined __STDC__ || defined __cplusplus)
+#  define _INTL_REDIRECT_ASM
+# else
+#  ifdef __cplusplus
+#   define _INTL_REDIRECT_INLINE
+#  else
+#   define _INTL_REDIRECT_MACROS
+#  endif
+# endif
+#endif
+/* Auxiliary macros.  */
+#ifdef _INTL_REDIRECT_ASM
+# define _INTL_ASM(cname) __asm__ (_INTL_ASMNAME (__USER_LABEL_PREFIX__, #cname))
+# define _INTL_ASMNAME(prefix,cnamestring) _INTL_STRINGIFY (prefix) cnamestring
+# define _INTL_STRINGIFY(prefix) #prefix
+#else
+# define _INTL_ASM(cname)
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_gettext (const char *__msgid);
+static inline char *gettext (const char *__msgid)
+{
+  return libintl_gettext (__msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define gettext libintl_gettext
+#endif
+extern char *gettext (const char *__msgid)
+       _INTL_ASM (libintl_gettext);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+   LC_MESSAGES locale.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dgettext (const char *__domainname, const char *__msgid);
+static inline char *dgettext (const char *__domainname, const char *__msgid)
+{
+  return libintl_dgettext (__domainname, __msgid);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dgettext libintl_dgettext
+#endif
+extern char *dgettext (const char *__domainname, const char *__msgid)
+       _INTL_ASM (libintl_dgettext);
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+   locale.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcgettext (const char *__domainname, const char *__msgid,
+                               int __category);
+static inline char *dcgettext (const char *__domainname, const char *__msgid,
+                              int __category)
+{
+  return libintl_dcgettext (__domainname, __msgid, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcgettext libintl_dcgettext
+#endif
+extern char *dcgettext (const char *__domainname, const char *__msgid,
+                       int __category)
+       _INTL_ASM (libintl_dcgettext);
+#endif
+
+
+/* Similar to `gettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_ngettext (const char *__msgid1, const char *__msgid2,
+                              unsigned long int __n);
+static inline char *ngettext (const char *__msgid1, const char *__msgid2,
+                             unsigned long int __n)
+{
+  return libintl_ngettext (__msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define ngettext libintl_ngettext
+#endif
+extern char *ngettext (const char *__msgid1, const char *__msgid2,
+                      unsigned long int __n)
+       _INTL_ASM (libintl_ngettext);
+#endif
+
+/* Similar to `dgettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dngettext (const char *__domainname, const char *__msgid1,
+                               const char *__msgid2, unsigned long int __n);
+static inline char *dngettext (const char *__domainname, const char *__msgid1,
+                              const char *__msgid2, unsigned long int __n)
+{
+  return libintl_dngettext (__domainname, __msgid1, __msgid2, __n);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dngettext libintl_dngettext
+#endif
+extern char *dngettext (const char *__domainname,
+                       const char *__msgid1, const char *__msgid2,
+                       unsigned long int __n)
+       _INTL_ASM (libintl_dngettext);
+#endif
+
+/* Similar to `dcgettext' but select the plural form corresponding to the
+   number N.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_dcngettext (const char *__domainname,
+                                const char *__msgid1, const char *__msgid2,
+                                unsigned long int __n, int __category);
+static inline char *dcngettext (const char *__domainname,
+                               const char *__msgid1, const char *__msgid2,
+                               unsigned long int __n, int __category)
+{
+  return libintl_dcngettext (__domainname, __msgid1, __msgid2, __n, __category);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define dcngettext libintl_dcngettext
+#endif
+extern char *dcngettext (const char *__domainname,
+                        const char *__msgid1, const char *__msgid2,
+                        unsigned long int __n, int __category)
+       _INTL_ASM (libintl_dcngettext);
+#endif
+
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_textdomain (const char *__domainname);
+static inline char *textdomain (const char *__domainname)
+{
+  return libintl_textdomain (__domainname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define textdomain libintl_textdomain
+#endif
+extern char *textdomain (const char *__domainname)
+       _INTL_ASM (libintl_textdomain);
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+   in DIRNAME rather than in the system locale data base.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bindtextdomain (const char *__domainname,
+                                    const char *__dirname);
+static inline char *bindtextdomain (const char *__domainname,
+                                   const char *__dirname)
+{
+  return libintl_bindtextdomain (__domainname, __dirname);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bindtextdomain libintl_bindtextdomain
+#endif
+extern char *bindtextdomain (const char *__domainname, const char *__dirname)
+       _INTL_ASM (libintl_bindtextdomain);
+#endif
+
+/* Specify the character encoding in which the messages from the
+   DOMAINNAME message catalog will be returned.  */
+#ifdef _INTL_REDIRECT_INLINE
+extern char *libintl_bind_textdomain_codeset (const char *__domainname,
+                                             const char *__codeset);
+static inline char *bind_textdomain_codeset (const char *__domainname,
+                                            const char *__codeset)
+{
+  return libintl_bind_textdomain_codeset (__domainname, __codeset);
+}
+#else
+#ifdef _INTL_REDIRECT_MACROS
+# define bind_textdomain_codeset libintl_bind_textdomain_codeset
+#endif
+extern char *bind_textdomain_codeset (const char *__domainname,
+                                     const char *__codeset)
+       _INTL_ASM (libintl_bind_textdomain_codeset);
+#endif
+
+
+/* Support for format strings with positions in *printf(), following the
+   POSIX/XSI specification.
+   Note: These replacements for the *printf() functions are visible only
+   in source files that #include <libintl.h> or #include "gettext.h".
+   Packages that use *printf() in source files that don't refer to _()
+   or gettext() but for which the format string could be the return value
+   of _() or gettext() need to add this #include.  Oh well.  */
+
+#if !@HAVE_POSIX_PRINTF@
+
+#include <stdio.h>
+#include <stddef.h>
+
+/* Get va_list.  */
+#if __STDC__ || defined __cplusplus || defined _MSC_VER
+# include <stdarg.h>
+#else
+# include <varargs.h>
+#endif
+
+#undef fprintf
+#define fprintf libintl_fprintf
+extern int fprintf (FILE *, const char *, ...);
+#undef vfprintf
+#define vfprintf libintl_vfprintf
+extern int vfprintf (FILE *, const char *, va_list);
+
+#undef printf
+#define printf libintl_printf
+extern int printf (const char *, ...);
+#undef vprintf
+#define vprintf libintl_vprintf
+extern int vprintf (const char *, va_list);
+
+#undef sprintf
+#define sprintf libintl_sprintf
+extern int sprintf (char *, const char *, ...);
+#undef vsprintf
+#define vsprintf libintl_vsprintf
+extern int vsprintf (char *, const char *, va_list);
+
+#if @HAVE_SNPRINTF@
+
+#undef snprintf
+#define snprintf libintl_snprintf
+extern int snprintf (char *, size_t, const char *, ...);
+#undef vsnprintf
+#define vsnprintf libintl_vsnprintf
+extern int vsnprintf (char *, size_t, const char *, va_list);
+
+#endif
+
+#if @HAVE_ASPRINTF@
+
+#undef asprintf
+#define asprintf libintl_asprintf
+extern int asprintf (char **, const char *, ...);
+#undef vasprintf
+#define vasprintf libintl_vasprintf
+extern int vasprintf (char **, const char *, va_list);
+
+#endif
+
+#if @HAVE_WPRINTF@
+
+#undef fwprintf
+#define fwprintf libintl_fwprintf
+extern int fwprintf (FILE *, const wchar_t *, ...);
+#undef vfwprintf
+#define vfwprintf libintl_vfwprintf
+extern int vfwprintf (FILE *, const wchar_t *, va_list);
+
+#undef wprintf
+#define wprintf libintl_wprintf
+extern int wprintf (const wchar_t *, ...);
+#undef vwprintf
+#define vwprintf libintl_vwprintf
+extern int vwprintf (const wchar_t *, va_list);
+
+#undef swprintf
+#define swprintf libintl_swprintf
+extern int swprintf (wchar_t *, size_t, const wchar_t *, ...);
+#undef vswprintf
+#define vswprintf libintl_vswprintf
+extern int vswprintf (wchar_t *, size_t, const wchar_t *, va_list);
+
+#endif
+
+#endif
+
+
+/* Support for relocatable packages.  */
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+#define libintl_set_relocation_prefix libintl_set_relocation_prefix
+extern void
+       libintl_set_relocation_prefix (const char *orig_prefix,
+                                     const char *curr_prefix);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* libintl.h */
diff --git a/intl/loadinfo.h b/intl/loadinfo.h
new file mode 100644 (file)
index 0000000..d6408f2
--- /dev/null
@@ -0,0 +1,145 @@
+/* Copyright (C) 1996-1999, 2000-2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _LOADINFO_H
+#define _LOADINFO_H    1
+
+/* Declarations of locale dependent catalog lookup functions.
+   Implemented in
+
+     localealias.c    Possibly replace a locale name by another.
+     explodename.c    Split a locale name into its various fields.
+     l10nflist.c      Generate a list of filenames of possible message catalogs.
+     finddomain.c     Find and open the relevant message catalogs.
+
+   The main function _nl_find_domain() in finddomain.c is declared
+   in gettextP.h.
+ */
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Tell the compiler when a conditional or integer expression is
+   almost always true or almost always false.  */
+#ifndef HAVE_BUILTIN_EXPECT
+# define __builtin_expect(expr, val) (expr)
+#endif
+
+/* Separator in PATH like lists of pathnames.  */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define PATH_SEPARATOR ';'
+#else
+  /* Unix */
+# define PATH_SEPARATOR ':'
+#endif
+
+/* Encoding of locale name parts.  */
+#define CEN_REVISION           1
+#define CEN_SPONSOR            2
+#define CEN_SPECIAL            4
+#define XPG_NORM_CODESET       8
+#define XPG_CODESET            16
+#define TERRITORY              32
+#define CEN_AUDIENCE           64
+#define XPG_MODIFIER           128
+
+#define CEN_SPECIFIC   (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC   (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+  const char *filename;
+  int decided;
+
+  const void *data;
+
+  struct loaded_l10nfile *next;
+  struct loaded_l10nfile *successor[1];
+};
+
+
+/* Normalize codeset name.  There is no standard for the codeset
+   names.  Normalization allows the user to use any of the common
+   names.  The return value is dynamically allocated and has to be
+   freed by the caller.  */
+extern const char *_nl_normalize_codeset (const char *codeset,
+                                         size_t name_len);
+
+/* Lookup a locale dependent file.
+   *L10NFILE_LIST denotes a pool of lookup results of locale dependent
+   files of the same kind, sorted in decreasing order of ->filename.
+   DIRLIST and DIRLIST_LEN are an argz list of directories in which to
+   look, containing at least one directory (i.e. DIRLIST_LEN > 0).
+   MASK, LANGUAGE, TERRITORY, CODESET, NORMALIZED_CODESET, MODIFIER,
+   SPECIAL, SPONSOR, REVISION are the pieces of the locale name, as
+   produced by _nl_explode_name().  FILENAME is the filename suffix.
+   The return value is the lookup result, either found in *L10NFILE_LIST,
+   or - if DO_ALLOCATE is nonzero - freshly allocated, or possibly NULL.
+   If the return value is non-NULL, it is added to *L10NFILE_LIST, and
+   its ->next field denotes the chaining inside *L10NFILE_LIST, and
+   furthermore its ->successor[] field contains a list of other lookup
+   results from which this lookup result inherits.  */
+extern struct loaded_l10nfile *
+_nl_make_l10nflist (struct loaded_l10nfile **l10nfile_list,
+                   const char *dirlist, size_t dirlist_len, int mask,
+                   const char *language, const char *territory,
+                   const char *codeset, const char *normalized_codeset,
+                   const char *modifier, const char *special,
+                   const char *sponsor, const char *revision,
+                   const char *filename, int do_allocate);
+
+/* Lookup the real locale name for a locale alias NAME, or NULL if
+   NAME is not a locale alias (but possibly a real locale name).
+   The return value is statically allocated and must not be freed.  */
+extern const char *_nl_expand_alias (const char *name);
+
+/* Split a locale name NAME into its pieces: language, modifier,
+   territory, codeset, special, sponsor, revision.
+   NAME gets destructively modified: NUL bytes are inserted here and
+   there.  *LANGUAGE gets assigned NAME.  Each of *MODIFIER, *TERRITORY,
+   *CODESET, *SPECIAL, *SPONSOR, *REVISION gets assigned either a
+   pointer into the old NAME string, or NULL.  *NORMALIZED_CODESET
+   gets assigned the expanded *CODESET, if it is different from *CODESET;
+   this one is dynamically allocated and has to be freed by the caller.
+   The return value is a bitmask, where each bit corresponds to one
+   filled-in value:
+     XPG_MODIFIER, CEN_AUDIENCE  for *MODIFIER,
+     TERRITORY                   for *TERRITORY,
+     XPG_CODESET                 for *CODESET,
+     XPG_NORM_CODESET            for *NORMALIZED_CODESET,
+     CEN_SPECIAL                 for *SPECIAL,
+     CEN_SPONSOR                 for *SPONSOR,
+     CEN_REVISION                for *REVISION.
+ */
+extern int _nl_explode_name (char *name, const char **language,
+                            const char **modifier, const char **territory,
+                            const char **codeset,
+                            const char **normalized_codeset,
+                            const char **special, const char **sponsor,
+                            const char **revision);
+
+/* Split a locale name NAME into a leading language part and all the
+   rest.  Return a pointer to the first character after the language,
+   i.e. to the first byte of the rest.  */
+extern char *_nl_find_language (const char *name);
+
+#endif /* loadinfo.h */
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
new file mode 100644 (file)
index 0000000..0d59ad8
--- /dev/null
@@ -0,0 +1,1420 @@
+/* Load needed message catalogs.
+   Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef __GNUC__
+# undef  alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#ifdef _LIBC
+# include <langinfo.h>
+# include <locale.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+    || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP     1
+#else
+# undef HAVE_MMAP
+#endif
+
+#if defined HAVE_STDINT_H_WITH_UINTMAX || defined _LIBC
+# include <stdint.h>
+#endif
+#if defined HAVE_INTTYPES_H || defined _LIBC
+# include <inttypes.h>
+#endif
+
+#include "gmo.h"
+#include "gettextP.h"
+#include "hash-string.h"
+#include "plural-exp.h"
+
+#ifdef _LIBC
+# include "../locale/localeinfo.h"
+#endif
+
+/* Provide fallback values for macros that ought to be defined in <inttypes.h>.
+   Note that our fallback values need not be literal strings, because we don't
+   use them with preprocessor string concatenation.  */
+#if !defined PRId8 || PRI_MACROS_BROKEN
+# undef PRId8
+# define PRId8 "d"
+#endif
+#if !defined PRIi8 || PRI_MACROS_BROKEN
+# undef PRIi8
+# define PRIi8 "i"
+#endif
+#if !defined PRIo8 || PRI_MACROS_BROKEN
+# undef PRIo8
+# define PRIo8 "o"
+#endif
+#if !defined PRIu8 || PRI_MACROS_BROKEN
+# undef PRIu8
+# define PRIu8 "u"
+#endif
+#if !defined PRIx8 || PRI_MACROS_BROKEN
+# undef PRIx8
+# define PRIx8 "x"
+#endif
+#if !defined PRIX8 || PRI_MACROS_BROKEN
+# undef PRIX8
+# define PRIX8 "X"
+#endif
+#if !defined PRId16 || PRI_MACROS_BROKEN
+# undef PRId16
+# define PRId16 "d"
+#endif
+#if !defined PRIi16 || PRI_MACROS_BROKEN
+# undef PRIi16
+# define PRIi16 "i"
+#endif
+#if !defined PRIo16 || PRI_MACROS_BROKEN
+# undef PRIo16
+# define PRIo16 "o"
+#endif
+#if !defined PRIu16 || PRI_MACROS_BROKEN
+# undef PRIu16
+# define PRIu16 "u"
+#endif
+#if !defined PRIx16 || PRI_MACROS_BROKEN
+# undef PRIx16
+# define PRIx16 "x"
+#endif
+#if !defined PRIX16 || PRI_MACROS_BROKEN
+# undef PRIX16
+# define PRIX16 "X"
+#endif
+#if !defined PRId32 || PRI_MACROS_BROKEN
+# undef PRId32
+# define PRId32 "d"
+#endif
+#if !defined PRIi32 || PRI_MACROS_BROKEN
+# undef PRIi32
+# define PRIi32 "i"
+#endif
+#if !defined PRIo32 || PRI_MACROS_BROKEN
+# undef PRIo32
+# define PRIo32 "o"
+#endif
+#if !defined PRIu32 || PRI_MACROS_BROKEN
+# undef PRIu32
+# define PRIu32 "u"
+#endif
+#if !defined PRIx32 || PRI_MACROS_BROKEN
+# undef PRIx32
+# define PRIx32 "x"
+#endif
+#if !defined PRIX32 || PRI_MACROS_BROKEN
+# undef PRIX32
+# define PRIX32 "X"
+#endif
+#if !defined PRId64 || PRI_MACROS_BROKEN
+# undef PRId64
+# define PRId64 (sizeof (long) == 8 ? "ld" : "lld")
+#endif
+#if !defined PRIi64 || PRI_MACROS_BROKEN
+# undef PRIi64
+# define PRIi64 (sizeof (long) == 8 ? "li" : "lli")
+#endif
+#if !defined PRIo64 || PRI_MACROS_BROKEN
+# undef PRIo64
+# define PRIo64 (sizeof (long) == 8 ? "lo" : "llo")
+#endif
+#if !defined PRIu64 || PRI_MACROS_BROKEN
+# undef PRIu64
+# define PRIu64 (sizeof (long) == 8 ? "lu" : "llu")
+#endif
+#if !defined PRIx64 || PRI_MACROS_BROKEN
+# undef PRIx64
+# define PRIx64 (sizeof (long) == 8 ? "lx" : "llx")
+#endif
+#if !defined PRIX64 || PRI_MACROS_BROKEN
+# undef PRIX64
+# define PRIX64 (sizeof (long) == 8 ? "lX" : "llX")
+#endif
+#if !defined PRIdLEAST8 || PRI_MACROS_BROKEN
+# undef PRIdLEAST8
+# define PRIdLEAST8 "d"
+#endif
+#if !defined PRIiLEAST8 || PRI_MACROS_BROKEN
+# undef PRIiLEAST8
+# define PRIiLEAST8 "i"
+#endif
+#if !defined PRIoLEAST8 || PRI_MACROS_BROKEN
+# undef PRIoLEAST8
+# define PRIoLEAST8 "o"
+#endif
+#if !defined PRIuLEAST8 || PRI_MACROS_BROKEN
+# undef PRIuLEAST8
+# define PRIuLEAST8 "u"
+#endif
+#if !defined PRIxLEAST8 || PRI_MACROS_BROKEN
+# undef PRIxLEAST8
+# define PRIxLEAST8 "x"
+#endif
+#if !defined PRIXLEAST8 || PRI_MACROS_BROKEN
+# undef PRIXLEAST8
+# define PRIXLEAST8 "X"
+#endif
+#if !defined PRIdLEAST16 || PRI_MACROS_BROKEN
+# undef PRIdLEAST16
+# define PRIdLEAST16 "d"
+#endif
+#if !defined PRIiLEAST16 || PRI_MACROS_BROKEN
+# undef PRIiLEAST16
+# define PRIiLEAST16 "i"
+#endif
+#if !defined PRIoLEAST16 || PRI_MACROS_BROKEN
+# undef PRIoLEAST16
+# define PRIoLEAST16 "o"
+#endif
+#if !defined PRIuLEAST16 || PRI_MACROS_BROKEN
+# undef PRIuLEAST16
+# define PRIuLEAST16 "u"
+#endif
+#if !defined PRIxLEAST16 || PRI_MACROS_BROKEN
+# undef PRIxLEAST16
+# define PRIxLEAST16 "x"
+#endif
+#if !defined PRIXLEAST16 || PRI_MACROS_BROKEN
+# undef PRIXLEAST16
+# define PRIXLEAST16 "X"
+#endif
+#if !defined PRIdLEAST32 || PRI_MACROS_BROKEN
+# undef PRIdLEAST32
+# define PRIdLEAST32 "d"
+#endif
+#if !defined PRIiLEAST32 || PRI_MACROS_BROKEN
+# undef PRIiLEAST32
+# define PRIiLEAST32 "i"
+#endif
+#if !defined PRIoLEAST32 || PRI_MACROS_BROKEN
+# undef PRIoLEAST32
+# define PRIoLEAST32 "o"
+#endif
+#if !defined PRIuLEAST32 || PRI_MACROS_BROKEN
+# undef PRIuLEAST32
+# define PRIuLEAST32 "u"
+#endif
+#if !defined PRIxLEAST32 || PRI_MACROS_BROKEN
+# undef PRIxLEAST32
+# define PRIxLEAST32 "x"
+#endif
+#if !defined PRIXLEAST32 || PRI_MACROS_BROKEN
+# undef PRIXLEAST32
+# define PRIXLEAST32 "X"
+#endif
+#if !defined PRIdLEAST64 || PRI_MACROS_BROKEN
+# undef PRIdLEAST64
+# define PRIdLEAST64 PRId64
+#endif
+#if !defined PRIiLEAST64 || PRI_MACROS_BROKEN
+# undef PRIiLEAST64
+# define PRIiLEAST64 PRIi64
+#endif
+#if !defined PRIoLEAST64 || PRI_MACROS_BROKEN
+# undef PRIoLEAST64
+# define PRIoLEAST64 PRIo64
+#endif
+#if !defined PRIuLEAST64 || PRI_MACROS_BROKEN
+# undef PRIuLEAST64
+# define PRIuLEAST64 PRIu64
+#endif
+#if !defined PRIxLEAST64 || PRI_MACROS_BROKEN
+# undef PRIxLEAST64
+# define PRIxLEAST64 PRIx64
+#endif
+#if !defined PRIXLEAST64 || PRI_MACROS_BROKEN
+# undef PRIXLEAST64
+# define PRIXLEAST64 PRIX64
+#endif
+#if !defined PRIdFAST8 || PRI_MACROS_BROKEN
+# undef PRIdFAST8
+# define PRIdFAST8 "d"
+#endif
+#if !defined PRIiFAST8 || PRI_MACROS_BROKEN
+# undef PRIiFAST8
+# define PRIiFAST8 "i"
+#endif
+#if !defined PRIoFAST8 || PRI_MACROS_BROKEN
+# undef PRIoFAST8
+# define PRIoFAST8 "o"
+#endif
+#if !defined PRIuFAST8 || PRI_MACROS_BROKEN
+# undef PRIuFAST8
+# define PRIuFAST8 "u"
+#endif
+#if !defined PRIxFAST8 || PRI_MACROS_BROKEN
+# undef PRIxFAST8
+# define PRIxFAST8 "x"
+#endif
+#if !defined PRIXFAST8 || PRI_MACROS_BROKEN
+# undef PRIXFAST8
+# define PRIXFAST8 "X"
+#endif
+#if !defined PRIdFAST16 || PRI_MACROS_BROKEN
+# undef PRIdFAST16
+# define PRIdFAST16 "d"
+#endif
+#if !defined PRIiFAST16 || PRI_MACROS_BROKEN
+# undef PRIiFAST16
+# define PRIiFAST16 "i"
+#endif
+#if !defined PRIoFAST16 || PRI_MACROS_BROKEN
+# undef PRIoFAST16
+# define PRIoFAST16 "o"
+#endif
+#if !defined PRIuFAST16 || PRI_MACROS_BROKEN
+# undef PRIuFAST16
+# define PRIuFAST16 "u"
+#endif
+#if !defined PRIxFAST16 || PRI_MACROS_BROKEN
+# undef PRIxFAST16
+# define PRIxFAST16 "x"
+#endif
+#if !defined PRIXFAST16 || PRI_MACROS_BROKEN
+# undef PRIXFAST16
+# define PRIXFAST16 "X"
+#endif
+#if !defined PRIdFAST32 || PRI_MACROS_BROKEN
+# undef PRIdFAST32
+# define PRIdFAST32 "d"
+#endif
+#if !defined PRIiFAST32 || PRI_MACROS_BROKEN
+# undef PRIiFAST32
+# define PRIiFAST32 "i"
+#endif
+#if !defined PRIoFAST32 || PRI_MACROS_BROKEN
+# undef PRIoFAST32
+# define PRIoFAST32 "o"
+#endif
+#if !defined PRIuFAST32 || PRI_MACROS_BROKEN
+# undef PRIuFAST32
+# define PRIuFAST32 "u"
+#endif
+#if !defined PRIxFAST32 || PRI_MACROS_BROKEN
+# undef PRIxFAST32
+# define PRIxFAST32 "x"
+#endif
+#if !defined PRIXFAST32 || PRI_MACROS_BROKEN
+# undef PRIXFAST32
+# define PRIXFAST32 "X"
+#endif
+#if !defined PRIdFAST64 || PRI_MACROS_BROKEN
+# undef PRIdFAST64
+# define PRIdFAST64 PRId64
+#endif
+#if !defined PRIiFAST64 || PRI_MACROS_BROKEN
+# undef PRIiFAST64
+# define PRIiFAST64 PRIi64
+#endif
+#if !defined PRIoFAST64 || PRI_MACROS_BROKEN
+# undef PRIoFAST64
+# define PRIoFAST64 PRIo64
+#endif
+#if !defined PRIuFAST64 || PRI_MACROS_BROKEN
+# undef PRIuFAST64
+# define PRIuFAST64 PRIu64
+#endif
+#if !defined PRIxFAST64 || PRI_MACROS_BROKEN
+# undef PRIxFAST64
+# define PRIxFAST64 PRIx64
+#endif
+#if !defined PRIXFAST64 || PRI_MACROS_BROKEN
+# undef PRIXFAST64
+# define PRIXFAST64 PRIX64
+#endif
+#if !defined PRIdMAX || PRI_MACROS_BROKEN
+# undef PRIdMAX
+# define PRIdMAX (sizeof (uintmax_t) == sizeof (long) ? "ld" : "lld")
+#endif
+#if !defined PRIiMAX || PRI_MACROS_BROKEN
+# undef PRIiMAX
+# define PRIiMAX (sizeof (uintmax_t) == sizeof (long) ? "li" : "lli")
+#endif
+#if !defined PRIoMAX || PRI_MACROS_BROKEN
+# undef PRIoMAX
+# define PRIoMAX (sizeof (uintmax_t) == sizeof (long) ? "lo" : "llo")
+#endif
+#if !defined PRIuMAX || PRI_MACROS_BROKEN
+# undef PRIuMAX
+# define PRIuMAX (sizeof (uintmax_t) == sizeof (long) ? "lu" : "llu")
+#endif
+#if !defined PRIxMAX || PRI_MACROS_BROKEN
+# undef PRIxMAX
+# define PRIxMAX (sizeof (uintmax_t) == sizeof (long) ? "lx" : "llx")
+#endif
+#if !defined PRIXMAX || PRI_MACROS_BROKEN
+# undef PRIXMAX
+# define PRIXMAX (sizeof (uintmax_t) == sizeof (long) ? "lX" : "llX")
+#endif
+#if !defined PRIdPTR || PRI_MACROS_BROKEN
+# undef PRIdPTR
+# define PRIdPTR \
+  (sizeof (void *) == sizeof (long) ? "ld" : \
+   sizeof (void *) == sizeof (int) ? "d" : \
+   "lld")
+#endif
+#if !defined PRIiPTR || PRI_MACROS_BROKEN
+# undef PRIiPTR
+# define PRIiPTR \
+  (sizeof (void *) == sizeof (long) ? "li" : \
+   sizeof (void *) == sizeof (int) ? "i" : \
+   "lli")
+#endif
+#if !defined PRIoPTR || PRI_MACROS_BROKEN
+# undef PRIoPTR
+# define PRIoPTR \
+  (sizeof (void *) == sizeof (long) ? "lo" : \
+   sizeof (void *) == sizeof (int) ? "o" : \
+   "llo")
+#endif
+#if !defined PRIuPTR || PRI_MACROS_BROKEN
+# undef PRIuPTR
+# define PRIuPTR \
+  (sizeof (void *) == sizeof (long) ? "lu" : \
+   sizeof (void *) == sizeof (int) ? "u" : \
+   "llu")
+#endif
+#if !defined PRIxPTR || PRI_MACROS_BROKEN
+# undef PRIxPTR
+# define PRIxPTR \
+  (sizeof (void *) == sizeof (long) ? "lx" : \
+   sizeof (void *) == sizeof (int) ? "x" : \
+   "llx")
+#endif
+#if !defined PRIXPTR || PRI_MACROS_BROKEN
+# undef PRIXPTR
+# define PRIXPTR \
+  (sizeof (void *) == sizeof (long) ? "lX" : \
+   sizeof (void *) == sizeof (int) ? "X" : \
+   "llX")
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions.  This is required by the standard
+   because some ISO C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define open   __open
+# define close  __close
+# define read   __read
+# define mmap   __mmap
+# define munmap __munmap
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+/* For systems that distinguish between text and binary I/O.
+   O_BINARY is usually declared in <fcntl.h>. */
+#if !defined O_BINARY && defined _O_BINARY
+  /* For MSC-compatible compilers.  */
+# define O_BINARY _O_BINARY
+# define O_TEXT _O_TEXT
+#endif
+#ifdef __BEOS__
+  /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */
+# undef O_BINARY
+# undef O_TEXT
+#endif
+/* On reasonable systems, binary I/O is the default.  */
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+   with all translations.  This is important if the translations are
+   cached by one of GCC's features.  */
+int _nl_msg_cat_cntr;
+
+
+/* Expand a system dependent string segment.  Return NULL if unsupported.  */
+static const char *
+get_sysdep_segment_value (const char *name)
+{
+  /* Test for an ISO C 99 section 7.8.1 format string directive.
+     Syntax:
+     P R I { d | i | o | u | x | X }
+     { { | LEAST | FAST } { 8 | 16 | 32 | 64 } | MAX | PTR }  */
+  /* We don't use a table of 14 times 6 'const char *' strings here, because
+     data relocations cost startup time.  */
+  if (name[0] == 'P' && name[1] == 'R' && name[2] == 'I')
+    {
+      if (name[3] == 'd' || name[3] == 'i' || name[3] == 'o' || name[3] == 'u'
+         || name[3] == 'x' || name[3] == 'X')
+       {
+         if (name[4] == '8' && name[5] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId8;
+             if (name[3] == 'i')
+               return PRIi8;
+             if (name[3] == 'o')
+               return PRIo8;
+             if (name[3] == 'u')
+               return PRIu8;
+             if (name[3] == 'x')
+               return PRIx8;
+             if (name[3] == 'X')
+               return PRIX8;
+             abort ();
+           }
+         if (name[4] == '1' && name[5] == '6' && name[6] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId16;
+             if (name[3] == 'i')
+               return PRIi16;
+             if (name[3] == 'o')
+               return PRIo16;
+             if (name[3] == 'u')
+               return PRIu16;
+             if (name[3] == 'x')
+               return PRIx16;
+             if (name[3] == 'X')
+               return PRIX16;
+             abort ();
+           }
+         if (name[4] == '3' && name[5] == '2' && name[6] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId32;
+             if (name[3] == 'i')
+               return PRIi32;
+             if (name[3] == 'o')
+               return PRIo32;
+             if (name[3] == 'u')
+               return PRIu32;
+             if (name[3] == 'x')
+               return PRIx32;
+             if (name[3] == 'X')
+               return PRIX32;
+             abort ();
+           }
+         if (name[4] == '6' && name[5] == '4' && name[6] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRId64;
+             if (name[3] == 'i')
+               return PRIi64;
+             if (name[3] == 'o')
+               return PRIo64;
+             if (name[3] == 'u')
+               return PRIu64;
+             if (name[3] == 'x')
+               return PRIx64;
+             if (name[3] == 'X')
+               return PRIX64;
+             abort ();
+           }
+         if (name[4] == 'L' && name[5] == 'E' && name[6] == 'A'
+             && name[7] == 'S' && name[8] == 'T')
+           {
+             if (name[9] == '8' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST8;
+                 if (name[3] == 'i')
+                   return PRIiLEAST8;
+                 if (name[3] == 'o')
+                   return PRIoLEAST8;
+                 if (name[3] == 'u')
+                   return PRIuLEAST8;
+                 if (name[3] == 'x')
+                   return PRIxLEAST8;
+                 if (name[3] == 'X')
+                   return PRIXLEAST8;
+                 abort ();
+               }
+             if (name[9] == '1' && name[10] == '6' && name[11] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST16;
+                 if (name[3] == 'i')
+                   return PRIiLEAST16;
+                 if (name[3] == 'o')
+                   return PRIoLEAST16;
+                 if (name[3] == 'u')
+                   return PRIuLEAST16;
+                 if (name[3] == 'x')
+                   return PRIxLEAST16;
+                 if (name[3] == 'X')
+                   return PRIXLEAST16;
+                 abort ();
+               }
+             if (name[9] == '3' && name[10] == '2' && name[11] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST32;
+                 if (name[3] == 'i')
+                   return PRIiLEAST32;
+                 if (name[3] == 'o')
+                   return PRIoLEAST32;
+                 if (name[3] == 'u')
+                   return PRIuLEAST32;
+                 if (name[3] == 'x')
+                   return PRIxLEAST32;
+                 if (name[3] == 'X')
+                   return PRIXLEAST32;
+                 abort ();
+               }
+             if (name[9] == '6' && name[10] == '4' && name[11] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdLEAST64;
+                 if (name[3] == 'i')
+                   return PRIiLEAST64;
+                 if (name[3] == 'o')
+                   return PRIoLEAST64;
+                 if (name[3] == 'u')
+                   return PRIuLEAST64;
+                 if (name[3] == 'x')
+                   return PRIxLEAST64;
+                 if (name[3] == 'X')
+                   return PRIXLEAST64;
+                 abort ();
+               }
+           }
+         if (name[4] == 'F' && name[5] == 'A' && name[6] == 'S'
+             && name[7] == 'T')
+           {
+             if (name[8] == '8' && name[9] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST8;
+                 if (name[3] == 'i')
+                   return PRIiFAST8;
+                 if (name[3] == 'o')
+                   return PRIoFAST8;
+                 if (name[3] == 'u')
+                   return PRIuFAST8;
+                 if (name[3] == 'x')
+                   return PRIxFAST8;
+                 if (name[3] == 'X')
+                   return PRIXFAST8;
+                 abort ();
+               }
+             if (name[8] == '1' && name[9] == '6' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST16;
+                 if (name[3] == 'i')
+                   return PRIiFAST16;
+                 if (name[3] == 'o')
+                   return PRIoFAST16;
+                 if (name[3] == 'u')
+                   return PRIuFAST16;
+                 if (name[3] == 'x')
+                   return PRIxFAST16;
+                 if (name[3] == 'X')
+                   return PRIXFAST16;
+                 abort ();
+               }
+             if (name[8] == '3' && name[9] == '2' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST32;
+                 if (name[3] == 'i')
+                   return PRIiFAST32;
+                 if (name[3] == 'o')
+                   return PRIoFAST32;
+                 if (name[3] == 'u')
+                   return PRIuFAST32;
+                 if (name[3] == 'x')
+                   return PRIxFAST32;
+                 if (name[3] == 'X')
+                   return PRIXFAST32;
+                 abort ();
+               }
+             if (name[8] == '6' && name[9] == '4' && name[10] == '\0')
+               {
+                 if (name[3] == 'd')
+                   return PRIdFAST64;
+                 if (name[3] == 'i')
+                   return PRIiFAST64;
+                 if (name[3] == 'o')
+                   return PRIoFAST64;
+                 if (name[3] == 'u')
+                   return PRIuFAST64;
+                 if (name[3] == 'x')
+                   return PRIxFAST64;
+                 if (name[3] == 'X')
+                   return PRIXFAST64;
+                 abort ();
+               }
+           }
+         if (name[4] == 'M' && name[5] == 'A' && name[6] == 'X'
+             && name[7] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRIdMAX;
+             if (name[3] == 'i')
+               return PRIiMAX;
+             if (name[3] == 'o')
+               return PRIoMAX;
+             if (name[3] == 'u')
+               return PRIuMAX;
+             if (name[3] == 'x')
+               return PRIxMAX;
+             if (name[3] == 'X')
+               return PRIXMAX;
+             abort ();
+           }
+         if (name[4] == 'P' && name[5] == 'T' && name[6] == 'R'
+             && name[7] == '\0')
+           {
+             if (name[3] == 'd')
+               return PRIdPTR;
+             if (name[3] == 'i')
+               return PRIiPTR;
+             if (name[3] == 'o')
+               return PRIoPTR;
+             if (name[3] == 'u')
+               return PRIuPTR;
+             if (name[3] == 'x')
+               return PRIxPTR;
+             if (name[3] == 'X')
+               return PRIXPTR;
+             abort ();
+           }
+       }
+    }
+  /* Test for a glibc specific printf() format directive flag.  */
+  if (name[0] == 'I' && name[1] == '\0')
+    {
+#if defined _LIBC || __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+      /* The 'I' flag, in numeric format directives, replaces ASCII digits
+        with the 'outdigits' defined in the LC_CTYPE locale facet.  This is
+        used for Farsi (Persian) and maybe Arabic.  */
+      return "I";
+#else
+      return "";
+#endif
+    }
+  /* Other system dependent strings are not valid.  */
+  return NULL;
+}
+
+/* Initialize the codeset dependent parts of an opened message catalog.
+   Return the header entry.  */
+const char *
+internal_function
+_nl_init_domain_conv (struct loaded_l10nfile *domain_file,
+                     struct loaded_domain *domain,
+                     struct binding *domainbinding)
+{
+  /* Find out about the character set the file is encoded with.
+     This can be found (in textual form) in the entry "".  If this
+     entry does not exist or if this does not contain the `charset='
+     information, we will assume the charset matches the one the
+     current locale and we don't have to perform any conversion.  */
+  char *nullentry;
+  size_t nullentrylen;
+
+  /* Preinitialize fields, to avoid recursion during _nl_find_msg.  */
+  domain->codeset_cntr =
+    (domainbinding != NULL ? domainbinding->codeset_cntr : 0);
+#ifdef _LIBC
+  domain->conv = (__gconv_t) -1;
+#else
+# if HAVE_ICONV
+  domain->conv = (iconv_t) -1;
+# endif
+#endif
+  domain->conv_tab = NULL;
+
+  /* Get the header entry.  */
+  nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);
+
+  if (nullentry != NULL)
+    {
+#if defined _LIBC || HAVE_ICONV
+      const char *charsetstr;
+
+      charsetstr = strstr (nullentry, "charset=");
+      if (charsetstr != NULL)
+       {
+         size_t len;
+         char *charset;
+         const char *outcharset;
+
+         charsetstr += strlen ("charset=");
+         len = strcspn (charsetstr, " \t\n");
+
+         charset = (char *) alloca (len + 1);
+# if defined _LIBC || HAVE_MEMPCPY
+         *((char *) mempcpy (charset, charsetstr, len)) = '\0';
+# else
+         memcpy (charset, charsetstr, len);
+         charset[len] = '\0';
+# endif
+
+         /* The output charset should normally be determined by the
+            locale.  But sometimes the locale is not used or not correctly
+            set up, so we provide a possibility for the user to override
+            this.  Moreover, the value specified through
+            bind_textdomain_codeset overrides both.  */
+         if (domainbinding != NULL && domainbinding->codeset != NULL)
+           outcharset = domainbinding->codeset;
+         else
+           {
+             outcharset = getenv ("OUTPUT_CHARSET");
+             if (outcharset == NULL || outcharset[0] == '\0')
+               {
+# ifdef _LIBC
+                 outcharset = _NL_CURRENT (LC_CTYPE, CODESET);
+# else
+#  if HAVE_ICONV
+                 extern const char *locale_charset (void);
+                 outcharset = locale_charset ();
+#  endif
+# endif
+               }
+           }
+
+# ifdef _LIBC
+         /* We always want to use transliteration.  */
+         outcharset = norm_add_slashes (outcharset, "TRANSLIT");
+         charset = norm_add_slashes (charset, NULL);
+         if (__gconv_open (outcharset, charset, &domain->conv,
+                           GCONV_AVOID_NOCONV)
+             != __GCONV_OK)
+           domain->conv = (__gconv_t) -1;
+# else
+#  if HAVE_ICONV
+         /* When using GNU libc >= 2.2 or GNU libiconv >= 1.5,
+            we want to use transliteration.  */
+#   if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2 \
+       || _LIBICONV_VERSION >= 0x0105
+         if (strchr (outcharset, '/') == NULL)
+           {
+             char *tmp;
+
+             len = strlen (outcharset);
+             tmp = (char *) alloca (len + 10 + 1);
+             memcpy (tmp, outcharset, len);
+             memcpy (tmp + len, "//TRANSLIT", 10 + 1);
+             outcharset = tmp;
+
+             domain->conv = iconv_open (outcharset, charset);
+
+             freea (outcharset);
+           }
+         else
+#   endif
+           domain->conv = iconv_open (outcharset, charset);
+#  endif
+# endif
+
+         freea (charset);
+       }
+#endif /* _LIBC || HAVE_ICONV */
+    }
+
+  return nullentry;
+}
+
+/* Frees the codeset dependent parts of an opened message catalog.  */
+void
+internal_function
+_nl_free_domain_conv (struct loaded_domain *domain)
+{
+  if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
+    free (domain->conv_tab);
+
+#ifdef _LIBC
+  if (domain->conv != (__gconv_t) -1)
+    __gconv_close (domain->conv);
+#else
+# if HAVE_ICONV
+  if (domain->conv != (iconv_t) -1)
+    iconv_close (domain->conv);
+# endif
+#endif
+}
+
+/* Load the message catalogs specified by FILENAME.  If it is no valid
+   message catalog do nothing.  */
+void
+internal_function
+_nl_load_domain (struct loaded_l10nfile *domain_file,
+                struct binding *domainbinding)
+{
+  int fd;
+  size_t size;
+#ifdef _LIBC
+  struct stat64 st;
+#else
+  struct stat st;
+#endif
+  struct mo_file_header *data = (struct mo_file_header *) -1;
+  int use_mmap = 0;
+  struct loaded_domain *domain;
+  int revision;
+  const char *nullentry;
+
+  domain_file->decided = 1;
+  domain_file->data = NULL;
+
+  /* Note that it would be useless to store domainbinding in domain_file
+     because domainbinding might be == NULL now but != NULL later (after
+     a call to bind_textdomain_codeset).  */
+
+  /* If the record does not represent a valid locale the FILENAME
+     might be NULL.  This can happen when according to the given
+     specification the locale file name is different for XPG and CEN
+     syntax.  */
+  if (domain_file->filename == NULL)
+    return;
+
+  /* Try to open the addressed file.  */
+  fd = open (domain_file->filename, O_RDONLY | O_BINARY);
+  if (fd == -1)
+    return;
+
+  /* We must know about the size of the file.  */
+  if (
+#ifdef _LIBC
+      __builtin_expect (fstat64 (fd, &st) != 0, 0)
+#else
+      __builtin_expect (fstat (fd, &st) != 0, 0)
+#endif
+      || __builtin_expect ((size = (size_t) st.st_size) != st.st_size, 0)
+      || __builtin_expect (size < sizeof (struct mo_file_header), 0))
+    {
+      /* Something went wrong.  */
+      close (fd);
+      return;
+    }
+
+#ifdef HAVE_MMAP
+  /* Now we are ready to load the file.  If mmap() is available we try
+     this first.  If not available or it failed we try to load it.  */
+  data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+                                        MAP_PRIVATE, fd, 0);
+
+  if (__builtin_expect (data != (struct mo_file_header *) -1, 1))
+    {
+      /* mmap() call was successful.  */
+      close (fd);
+      use_mmap = 1;
+    }
+#endif
+
+  /* If the data is not yet available (i.e. mmap'ed) we try to load
+     it manually.  */
+  if (data == (struct mo_file_header *) -1)
+    {
+      size_t to_read;
+      char *read_ptr;
+
+      data = (struct mo_file_header *) malloc (size);
+      if (data == NULL)
+       return;
+
+      to_read = size;
+      read_ptr = (char *) data;
+      do
+       {
+         long int nb = (long int) read (fd, read_ptr, to_read);
+         if (nb <= 0)
+           {
+#ifdef EINTR
+             if (nb == -1 && errno == EINTR)
+               continue;
+#endif
+             close (fd);
+             return;
+           }
+         read_ptr += nb;
+         to_read -= nb;
+       }
+      while (to_read > 0);
+
+      close (fd);
+    }
+
+  /* Using the magic number we can test whether it really is a message
+     catalog file.  */
+  if (__builtin_expect (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED,
+                       0))
+    {
+      /* The magic number is wrong: not a message catalog file.  */
+#ifdef HAVE_MMAP
+      if (use_mmap)
+       munmap ((caddr_t) data, size);
+      else
+#endif
+       free (data);
+      return;
+    }
+
+  domain = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+  if (domain == NULL)
+    return;
+  domain_file->data = domain;
+
+  domain->data = (char *) data;
+  domain->use_mmap = use_mmap;
+  domain->mmap_size = size;
+  domain->must_swap = data->magic != _MAGIC;
+  domain->malloced = NULL;
+
+  /* Fill in the information about the available tables.  */
+  revision = W (domain->must_swap, data->revision);
+  /* We support only the major revisions 0 and 1.  */
+  switch (revision >> 16)
+    {
+    case 0:
+    case 1:
+      domain->nstrings = W (domain->must_swap, data->nstrings);
+      domain->orig_tab = (const struct string_desc *)
+       ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+      domain->trans_tab = (const struct string_desc *)
+       ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+      domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+      domain->hash_tab =
+       (domain->hash_size > 2
+        ? (const nls_uint32 *)
+          ((char *) data + W (domain->must_swap, data->hash_tab_offset))
+        : NULL);
+      domain->must_swap_hash_tab = domain->must_swap;
+
+      /* Now dispatch on the minor revision.  */
+      switch (revision & 0xffff)
+       {
+       case 0:
+         domain->n_sysdep_strings = 0;
+         domain->orig_sysdep_tab = NULL;
+         domain->trans_sysdep_tab = NULL;
+         break;
+       case 1:
+       default:
+         {
+           nls_uint32 n_sysdep_strings;
+
+           if (domain->hash_tab == NULL)
+             /* This is invalid.  These minor revisions need a hash table.  */
+             goto invalid;
+
+           n_sysdep_strings =
+             W (domain->must_swap, data->n_sysdep_strings);
+           if (n_sysdep_strings > 0)
+             {
+               nls_uint32 n_sysdep_segments;
+               const struct sysdep_segment *sysdep_segments;
+               const char **sysdep_segment_values;
+               const nls_uint32 *orig_sysdep_tab;
+               const nls_uint32 *trans_sysdep_tab;
+               nls_uint32 n_inmem_sysdep_strings;
+               size_t memneed;
+               char *mem;
+               struct sysdep_string_desc *inmem_orig_sysdep_tab;
+               struct sysdep_string_desc *inmem_trans_sysdep_tab;
+               nls_uint32 *inmem_hash_tab;
+               unsigned int i, j;
+
+               /* Get the values of the system dependent segments.  */
+               n_sysdep_segments =
+                 W (domain->must_swap, data->n_sysdep_segments);
+               sysdep_segments = (const struct sysdep_segment *)
+                 ((char *) data
+                  + W (domain->must_swap, data->sysdep_segments_offset));
+               sysdep_segment_values =
+                 alloca (n_sysdep_segments * sizeof (const char *));
+               for (i = 0; i < n_sysdep_segments; i++)
+                 {
+                   const char *name =
+                     (char *) data
+                     + W (domain->must_swap, sysdep_segments[i].offset);
+                   nls_uint32 namelen =
+                     W (domain->must_swap, sysdep_segments[i].length);
+
+                   if (!(namelen > 0 && name[namelen - 1] == '\0'))
+                     {
+                       freea (sysdep_segment_values);
+                       goto invalid;
+                     }
+
+                   sysdep_segment_values[i] = get_sysdep_segment_value (name);
+                 }
+
+               orig_sysdep_tab = (const nls_uint32 *)
+                 ((char *) data
+                  + W (domain->must_swap, data->orig_sysdep_tab_offset));
+               trans_sysdep_tab = (const nls_uint32 *)
+                 ((char *) data
+                  + W (domain->must_swap, data->trans_sysdep_tab_offset));
+
+               /* Compute the amount of additional memory needed for the
+                  system dependent strings and the augmented hash table.
+                  At the same time, also drop string pairs which refer to
+                  an undefined system dependent segment.  */
+               n_inmem_sysdep_strings = 0;
+               memneed = domain->hash_size * sizeof (nls_uint32);
+               for (i = 0; i < n_sysdep_strings; i++)
+                 {
+                   int valid = 1;
+                   size_t needs[2];
+
+                   for (j = 0; j < 2; j++)
+                     {
+                       const struct sysdep_string *sysdep_string =
+                         (const struct sysdep_string *)
+                         ((char *) data
+                          + W (domain->must_swap,
+                               j == 0
+                               ? orig_sysdep_tab[i]
+                               : trans_sysdep_tab[i]));
+                       size_t need = 0;
+                       const struct segment_pair *p = sysdep_string->segments;
+
+                       if (W (domain->must_swap, p->sysdepref) != SEGMENTS_END)
+                         for (p = sysdep_string->segments;; p++)
+                           {
+                             nls_uint32 sysdepref;
+
+                             need += W (domain->must_swap, p->segsize);
+
+                             sysdepref = W (domain->must_swap, p->sysdepref);
+                             if (sysdepref == SEGMENTS_END)
+                               break;
+
+                             if (sysdepref >= n_sysdep_segments)
+                               {
+                                 /* Invalid.  */
+                                 freea (sysdep_segment_values);
+                                 goto invalid;
+                               }
+
+                             if (sysdep_segment_values[sysdepref] == NULL)
+                               {
+                                 /* This particular string pair is invalid.  */
+                                 valid = 0;
+                                 break;
+                               }
+
+                             need += strlen (sysdep_segment_values[sysdepref]);
+                           }
+
+                       needs[j] = need;
+                       if (!valid)
+                         break;
+                     }
+
+                   if (valid)
+                     {
+                       n_inmem_sysdep_strings++;
+                       memneed += needs[0] + needs[1];
+                     }
+                 }
+               memneed += 2 * n_inmem_sysdep_strings
+                          * sizeof (struct sysdep_string_desc);
+
+               if (n_inmem_sysdep_strings > 0)
+                 {
+                   unsigned int k;
+
+                   /* Allocate additional memory.  */
+                   mem = (char *) malloc (memneed);
+                   if (mem == NULL)
+                     goto invalid;
+
+                   domain->malloced = mem;
+                   inmem_orig_sysdep_tab = (struct sysdep_string_desc *) mem;
+                   mem += n_inmem_sysdep_strings
+                          * sizeof (struct sysdep_string_desc);
+                   inmem_trans_sysdep_tab = (struct sysdep_string_desc *) mem;
+                   mem += n_inmem_sysdep_strings
+                          * sizeof (struct sysdep_string_desc);
+                   inmem_hash_tab = (nls_uint32 *) mem;
+                   mem += domain->hash_size * sizeof (nls_uint32);
+
+                   /* Compute the system dependent strings.  */
+                   k = 0;
+                   for (i = 0; i < n_sysdep_strings; i++)
+                     {
+                       int valid = 1;
+
+                       for (j = 0; j < 2; j++)
+                         {
+                           const struct sysdep_string *sysdep_string =
+                             (const struct sysdep_string *)
+                             ((char *) data
+                              + W (domain->must_swap,
+                                   j == 0
+                                   ? orig_sysdep_tab[i]
+                                   : trans_sysdep_tab[i]));
+                           const struct segment_pair *p =
+                             sysdep_string->segments;
+
+                           if (W (domain->must_swap, p->sysdepref)
+                               != SEGMENTS_END)
+                             for (p = sysdep_string->segments;; p++)
+                               {
+                                 nls_uint32 sysdepref;
+
+                                 sysdepref =
+                                   W (domain->must_swap, p->sysdepref);
+                                 if (sysdepref == SEGMENTS_END)
+                                   break;
+
+                                 if (sysdep_segment_values[sysdepref] == NULL)
+                                   {
+                                     /* This particular string pair is
+                                        invalid.  */
+                                     valid = 0;
+                                     break;
+                                   }
+                               }
+
+                           if (!valid)
+                             break;
+                         }
+
+                       if (valid)
+                         {
+                           for (j = 0; j < 2; j++)
+                             {
+                               const struct sysdep_string *sysdep_string =
+                                 (const struct sysdep_string *)
+                                 ((char *) data
+                                  + W (domain->must_swap,
+                                       j == 0
+                                       ? orig_sysdep_tab[i]
+                                       : trans_sysdep_tab[i]));
+                               const char *static_segments =
+                                 (char *) data
+                                 + W (domain->must_swap, sysdep_string->offset);
+                               const struct segment_pair *p =
+                                 sysdep_string->segments;
+
+                               /* Concatenate the segments, and fill
+                                  inmem_orig_sysdep_tab[k] (for j == 0) and
+                                  inmem_trans_sysdep_tab[k] (for j == 1).  */
+
+                               struct sysdep_string_desc *inmem_tab_entry =
+                                 (j == 0
+                                  ? inmem_orig_sysdep_tab
+                                  : inmem_trans_sysdep_tab)
+                                 + k;
+
+                               if (W (domain->must_swap, p->sysdepref)
+                                   == SEGMENTS_END)
+                                 {
+                                   /* Only one static segment.  */
+                                   inmem_tab_entry->length =
+                                     W (domain->must_swap, p->segsize);
+                                   inmem_tab_entry->pointer = static_segments;
+                                 }
+                               else
+                                 {
+                                   inmem_tab_entry->pointer = mem;
+
+                                   for (p = sysdep_string->segments;; p++)
+                                     {
+                                       nls_uint32 segsize =
+                                         W (domain->must_swap, p->segsize);
+                                       nls_uint32 sysdepref =
+                                         W (domain->must_swap, p->sysdepref);
+                                       size_t n;
+
+                                       if (segsize > 0)
+                                         {
+                                           memcpy (mem, static_segments, segsize);
+                                           mem += segsize;
+                                           static_segments += segsize;
+                                         }
+
+                                       if (sysdepref == SEGMENTS_END)
+                                         break;
+
+                                       n = strlen (sysdep_segment_values[sysdepref]);
+                                       memcpy (mem, sysdep_segment_values[sysdepref], n);
+                                       mem += n;
+                                     }
+
+                                   inmem_tab_entry->length =
+                                     mem - inmem_tab_entry->pointer;
+                                 }
+                             }
+
+                           k++;
+                         }
+                     }
+                   if (k != n_inmem_sysdep_strings)
+                     abort ();
+
+                   /* Compute the augmented hash table.  */
+                   for (i = 0; i < domain->hash_size; i++)
+                     inmem_hash_tab[i] =
+                       W (domain->must_swap_hash_tab, domain->hash_tab[i]);
+                   for (i = 0; i < n_inmem_sysdep_strings; i++)
+                     {
+                       const char *msgid = inmem_orig_sysdep_tab[i].pointer;
+                       nls_uint32 hash_val = hash_string (msgid);
+                       nls_uint32 idx = hash_val % domain->hash_size;
+                       nls_uint32 incr =
+                         1 + (hash_val % (domain->hash_size - 2));
+
+                       for (;;)
+                         {
+                           if (inmem_hash_tab[idx] == 0)
+                             {
+                               /* Hash table entry is empty.  Use it.  */
+                               inmem_hash_tab[idx] = 1 + domain->nstrings + i;
+                               break;
+                             }
+
+                           if (idx >= domain->hash_size - incr)
+                             idx -= domain->hash_size - incr;
+                           else
+                             idx += incr;
+                         }
+                     }
+
+                   domain->n_sysdep_strings = n_inmem_sysdep_strings;
+                   domain->orig_sysdep_tab = inmem_orig_sysdep_tab;
+                   domain->trans_sysdep_tab = inmem_trans_sysdep_tab;
+
+                   domain->hash_tab = inmem_hash_tab;
+                   domain->must_swap_hash_tab = 0;
+                 }
+               else
+                 {
+                   domain->n_sysdep_strings = 0;
+                   domain->orig_sysdep_tab = NULL;
+                   domain->trans_sysdep_tab = NULL;
+                 }
+
+               freea (sysdep_segment_values);
+             }
+           else
+             {
+               domain->n_sysdep_strings = 0;
+               domain->orig_sysdep_tab = NULL;
+               domain->trans_sysdep_tab = NULL;
+             }
+         }
+         break;
+       }
+      break;
+    default:
+      /* This is an invalid revision.  */
+    invalid:
+      /* This is an invalid .mo file.  */
+      if (domain->malloced)
+       free (domain->malloced);
+#ifdef HAVE_MMAP
+      if (use_mmap)
+       munmap ((caddr_t) data, size);
+      else
+#endif
+       free (data);
+      free (domain);
+      domain_file->data = NULL;
+      return;
+    }
+
+  /* Now initialize the character set converter from the character set
+     the file is encoded with (found in the header entry) to the domain's
+     specified character set or the locale's character set.  */
+  nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding);
+
+  /* Also look for a plural specification.  */
+  EXTRACT_PLURAL_EXPRESSION (nullentry, &domain->plural, &domain->nplurals);
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (struct loaded_domain *domain)
+{
+  if (domain->plural != &__gettext_germanic_plural)
+    __gettext_free_exp (domain->plural);
+
+  _nl_free_domain_conv (domain);
+
+  if (domain->malloced)
+    free (domain->malloced);
+
+# ifdef _POSIX_MAPPED_FILES
+  if (domain->use_mmap)
+    munmap ((caddr_t) domain->data, domain->mmap_size);
+  else
+# endif        /* _POSIX_MAPPED_FILES */
+    free ((void *) domain->data);
+
+  free (domain);
+}
+#endif
diff --git a/intl/localcharset.c b/intl/localcharset.c
new file mode 100644 (file)
index 0000000..449ffc7
--- /dev/null
@@ -0,0 +1,398 @@
+/* Determine a canonical name for the current locale's character encoding.
+
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  */
+#include "localcharset.h"
+
+#if HAVE_STDDEF_H
+# include <stddef.h>
+#endif
+
+#include <stdio.h>
+#if HAVE_STRING_H
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32   /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#if defined __EMX__
+/* Assume EMX program runs on OS/2, even if compiled under DOS.  */
+# define OS2
+#endif
+
+#if !defined WIN32
+# if HAVE_LANGINFO_CODESET
+#  include <langinfo.h>
+# else
+#  if HAVE_SETLOCALE
+#   include <locale.h>
+#  endif
+# endif
+#elif defined WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+#if defined OS2
+# define INCL_DOS
+# include <os2.h>
+#endif
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+#endif
+
+#ifndef DIRECTORY_SEPARATOR
+# define DIRECTORY_SEPARATOR '/'
+#endif
+
+#ifndef ISSLASH
+# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
+#endif
+
+#if HAVE_DECL_GETC_UNLOCKED
+# undef getc
+# define getc getc_unlocked
+#endif
+
+/* The following static variable is declared 'volatile' to avoid a
+   possible multithread problem in the function get_charset_aliases. If we
+   are running in a threaded environment, and if two threads initialize
+   'charset_aliases' simultaneously, both will produce the same value,
+   and everything will be ok if the two assignments to 'charset_aliases'
+   are atomic. But I don't know what will happen if the two assignments mix.  */
+#if __STDC__ != 1
+# define volatile /* empty */
+#endif
+/* Pointer to the contents of the charset.alias file, if it has already been
+   read, else NULL.  Its format is:
+   ALIAS_1 '\0' CANONICAL_1 '\0' ... ALIAS_n '\0' CANONICAL_n '\0' '\0'  */
+static const char * volatile charset_aliases;
+
+/* Return a pointer to the contents of the charset.alias file.  */
+static const char *
+get_charset_aliases ()
+{
+  const char *cp;
+
+  cp = charset_aliases;
+  if (cp == NULL)
+    {
+#if !(defined VMS || defined WIN32)
+      FILE *fp;
+      const char *dir = relocate (LIBDIR);
+      const char *base = "charset.alias";
+      char *file_name;
+
+      /* Concatenate dir and base into freshly allocated file_name.  */
+      {
+       size_t dir_len = strlen (dir);
+       size_t base_len = strlen (base);
+       int add_slash = (dir_len > 0 && !ISSLASH (dir[dir_len - 1]));
+       file_name = (char *) malloc (dir_len + add_slash + base_len + 1);
+       if (file_name != NULL)
+         {
+           memcpy (file_name, dir, dir_len);
+           if (add_slash)
+             file_name[dir_len] = DIRECTORY_SEPARATOR;
+           memcpy (file_name + dir_len + add_slash, base, base_len + 1);
+         }
+      }
+
+      if (file_name == NULL || (fp = fopen (file_name, "r")) == NULL)
+       /* Out of memory or file not found, treat it as empty.  */
+       cp = "";
+      else
+       {
+         /* Parse the file's contents.  */
+         int c;
+         char buf1[50+1];
+         char buf2[50+1];
+         char *res_ptr = NULL;
+         size_t res_size = 0;
+         size_t l1, l2;
+
+         for (;;)
+           {
+             c = getc (fp);
+             if (c == EOF)
+               break;
+             if (c == '\n' || c == ' ' || c == '\t')
+               continue;
+             if (c == '#')
+               {
+                 /* Skip comment, to end of line.  */
+                 do
+                   c = getc (fp);
+                 while (!(c == EOF || c == '\n'));
+                 if (c == EOF)
+                   break;
+                 continue;
+               }
+             ungetc (c, fp);
+             if (fscanf (fp, "%50s %50s", buf1, buf2) < 2)
+               break;
+             l1 = strlen (buf1);
+             l2 = strlen (buf2);
+             if (res_size == 0)
+               {
+                 res_size = l1 + 1 + l2 + 1;
+                 res_ptr = (char *) malloc (res_size + 1);
+               }
+             else
+               {
+                 res_size += l1 + 1 + l2 + 1;
+                 res_ptr = (char *) realloc (res_ptr, res_size + 1);
+               }
+             if (res_ptr == NULL)
+               {
+                 /* Out of memory. */
+                 res_size = 0;
+                 break;
+               }
+             strcpy (res_ptr + res_size - (l2 + 1) - (l1 + 1), buf1);
+             strcpy (res_ptr + res_size - (l2 + 1), buf2);
+           }
+         fclose (fp);
+         if (res_size == 0)
+           cp = "";
+         else
+           {
+             *(res_ptr + res_size) = '\0';
+             cp = res_ptr;
+           }
+       }
+
+      if (file_name != NULL)
+       free (file_name);
+
+#else
+
+# if defined VMS
+      /* To avoid the troubles of an extra file charset.alias_vms in the
+        sources of many GNU packages, simply inline the aliases here.  */
+      /* The list of encodings is taken from the OpenVMS 7.3-1 documentation
+        "Compaq C Run-Time Library Reference Manual for OpenVMS systems"
+        section 10.7 "Handling Different Character Sets".  */
+      cp = "ISO8859-1" "\0" "ISO-8859-1" "\0"
+          "ISO8859-2" "\0" "ISO-8859-2" "\0"
+          "ISO8859-5" "\0" "ISO-8859-5" "\0"
+          "ISO8859-7" "\0" "ISO-8859-7" "\0"
+          "ISO8859-8" "\0" "ISO-8859-8" "\0"
+          "ISO8859-9" "\0" "ISO-8859-9" "\0"
+          /* Japanese */
+          "eucJP" "\0" "EUC-JP" "\0"
+          "SJIS" "\0" "SHIFT_JIS" "\0"
+          "DECKANJI" "\0" "DEC-KANJI" "\0"
+          "SDECKANJI" "\0" "EUC-JP" "\0"
+          /* Chinese */
+          "eucTW" "\0" "EUC-TW" "\0"
+          "DECHANYU" "\0" "DEC-HANYU" "\0"
+          "DECHANZI" "\0" "GB2312" "\0"
+          /* Korean */
+          "DECKOREAN" "\0" "EUC-KR" "\0";
+# endif
+
+# if defined WIN32
+      /* To avoid the troubles of installing a separate file in the same
+        directory as the DLL and of retrieving the DLL's directory at
+        runtime, simply inline the aliases here.  */
+
+      cp = "CP936" "\0" "GBK" "\0"
+          "CP1361" "\0" "JOHAB" "\0"
+          "CP20127" "\0" "ASCII" "\0"
+          "CP20866" "\0" "KOI8-R" "\0"
+          "CP21866" "\0" "KOI8-RU" "\0"
+          "CP28591" "\0" "ISO-8859-1" "\0"
+          "CP28592" "\0" "ISO-8859-2" "\0"
+          "CP28593" "\0" "ISO-8859-3" "\0"
+          "CP28594" "\0" "ISO-8859-4" "\0"
+          "CP28595" "\0" "ISO-8859-5" "\0"
+          "CP28596" "\0" "ISO-8859-6" "\0"
+          "CP28597" "\0" "ISO-8859-7" "\0"
+          "CP28598" "\0" "ISO-8859-8" "\0"
+          "CP28599" "\0" "ISO-8859-9" "\0"
+          "CP28605" "\0" "ISO-8859-15" "\0";
+# endif
+#endif
+
+      charset_aliases = cp;
+    }
+
+  return cp;
+}
+
+/* Determine the current locale's character encoding, and canonicalize it
+   into one of the canonical names listed in config.charset.
+   The result must not be freed; it is statically allocated.
+   If the canonical name cannot be determined, the result is a non-canonical
+   name.  */
+
+#ifdef STATIC
+STATIC
+#endif
+const char *
+locale_charset ()
+{
+  const char *codeset;
+  const char *aliases;
+
+#if !(defined WIN32 || defined OS2)
+
+# if HAVE_LANGINFO_CODESET
+
+  /* Most systems support nl_langinfo (CODESET) nowadays.  */
+  codeset = nl_langinfo (CODESET);
+
+# else
+
+  /* On old systems which lack it, use setlocale or getenv.  */
+  const char *locale = NULL;
+
+  /* But most old systems don't have a complete set of locales.  Some
+     (like SunOS 4 or DJGPP) have only the C locale.  Therefore we don't
+     use setlocale here; it would return "C" when it doesn't support the
+     locale name the user has set.  */
+#  if HAVE_SETLOCALE && 0
+  locale = setlocale (LC_CTYPE, NULL);
+#  endif
+  if (locale == NULL || locale[0] == '\0')
+    {
+      locale = getenv ("LC_ALL");
+      if (locale == NULL || locale[0] == '\0')
+       {
+         locale = getenv ("LC_CTYPE");
+         if (locale == NULL || locale[0] == '\0')
+           locale = getenv ("LANG");
+       }
+    }
+
+  /* On some old systems, one used to set locale = "iso8859_1". On others,
+     you set it to "language_COUNTRY.charset". In any case, we resolve it
+     through the charset.alias file.  */
+  codeset = locale;
+
+# endif
+
+#elif defined WIN32
+
+  static char buf[2 + 10 + 1];
+
+  /* Woe32 has a function returning the locale's codepage as a number.  */
+  sprintf (buf, "CP%u", GetACP ());
+  codeset = buf;
+
+#elif defined OS2
+
+  const char *locale;
+  static char buf[2 + 10 + 1];
+  ULONG cp[3];
+  ULONG cplen;
+
+  /* Allow user to override the codeset, as set in the operating system,
+     with standard language environment variables.  */
+  locale = getenv ("LC_ALL");
+  if (locale == NULL || locale[0] == '\0')
+    {
+      locale = getenv ("LC_CTYPE");
+      if (locale == NULL || locale[0] == '\0')
+       locale = getenv ("LANG");
+    }
+  if (locale != NULL && locale[0] != '\0')
+    {
+      /* If the locale name contains an encoding after the dot, return it.  */
+      const char *dot = strchr (locale, '.');
+
+      if (dot != NULL)
+       {
+         const char *modifier;
+
+         dot++;
+         /* Look for the possible @... trailer and remove it, if any.  */
+         modifier = strchr (dot, '@');
+         if (modifier == NULL)
+           return dot;
+         if (modifier - dot < sizeof (buf))
+           {
+             memcpy (buf, dot, modifier - dot);
+             buf [modifier - dot] = '\0';
+             return buf;
+           }
+       }
+
+      /* Resolve through the charset.alias file.  */
+      codeset = locale;
+    }
+  else
+    {
+      /* OS/2 has a function returning the locale's codepage as a number.  */
+      if (DosQueryCp (sizeof (cp), cp, &cplen))
+       codeset = "";
+      else
+       {
+         sprintf (buf, "CP%u", cp[0]);
+         codeset = buf;
+       }
+    }
+
+#endif
+
+  if (codeset == NULL)
+    /* The canonical name cannot be determined.  */
+    codeset = "";
+
+  /* Resolve alias. */
+  for (aliases = get_charset_aliases ();
+       *aliases != '\0';
+       aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+    if (strcmp (codeset, aliases) == 0
+       || (aliases[0] == '*' && aliases[1] == '\0'))
+      {
+       codeset = aliases + strlen (aliases) + 1;
+       break;
+      }
+
+  /* Don't return an empty string.  GNU libc and GNU libiconv interpret
+     the empty string as denoting "the locale's character encoding",
+     thus GNU libiconv would call this function a second time.  */
+  if (codeset[0] == '\0')
+    codeset = "ASCII";
+
+  return codeset;
+}
diff --git a/intl/localcharset.h b/intl/localcharset.h
new file mode 100644 (file)
index 0000000..129e4a4
--- /dev/null
@@ -0,0 +1,42 @@
+/* Determine a canonical name for the current locale's character encoding.
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+   This file is part of the GNU CHARSET Library.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _LOCALCHARSET_H
+#define _LOCALCHARSET_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Determine the current locale's character encoding, and canonicalize it
+   into one of the canonical names listed in config.charset.
+   The result must not be freed; it is statically allocated.
+   If the canonical name cannot be determined, the result is a non-canonical
+   name.  */
+extern const char * locale_charset (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _LOCALCHARSET_H */
diff --git a/intl/locale.alias b/intl/locale.alias
new file mode 100644 (file)
index 0000000..faa6969
--- /dev/null
@@ -0,0 +1,78 @@
+# Locale name alias data base.
+# Copyright (C) 1996-2001,2003 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Library General Public License as published
+# by the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program 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
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+
+# The format of this file is the same as for the corresponding file of
+# the X Window System, which normally can be found in
+#      /usr/lib/X11/locale/locale.alias
+# A single line contains two fields: an alias and a substitution value.
+# All entries are case independent.
+
+# Note: This file is far from being complete.  If you have a value for
+# your own site which you think might be useful for others too, share
+# it with the rest of us.  Send it using the `glibcbug' script to
+# bugs@gnu.org.
+
+# Packages using this file: 
+
+bokmal         nb_NO.ISO-8859-1
+bokmål         nb_NO.ISO-8859-1
+catalan                ca_ES.ISO-8859-1
+croatian       hr_HR.ISO-8859-2
+czech          cs_CZ.ISO-8859-2
+danish          da_DK.ISO-8859-1
+dansk          da_DK.ISO-8859-1
+deutsch                de_DE.ISO-8859-1
+dutch          nl_NL.ISO-8859-1
+eesti          et_EE.ISO-8859-1
+estonian       et_EE.ISO-8859-1
+finnish         fi_FI.ISO-8859-1
+français       fr_FR.ISO-8859-1
+french         fr_FR.ISO-8859-1
+galego         gl_ES.ISO-8859-1
+galician       gl_ES.ISO-8859-1
+german         de_DE.ISO-8859-1
+greek           el_GR.ISO-8859-7
+hebrew          he_IL.ISO-8859-8
+hrvatski       hr_HR.ISO-8859-2
+hungarian       hu_HU.ISO-8859-2
+icelandic       is_IS.ISO-8859-1
+italian         it_IT.ISO-8859-1
+japanese       ja_JP.eucJP
+japanese.euc   ja_JP.eucJP
+ja_JP          ja_JP.eucJP
+ja_JP.ujis     ja_JP.eucJP
+japanese.sjis  ja_JP.SJIS
+korean         ko_KR.eucKR
+korean.euc     ko_KR.eucKR
+ko_KR          ko_KR.eucKR
+lithuanian      lt_LT.ISO-8859-13
+no_NO          nb_NO.ISO-8859-1
+no_NO.ISO-8859-1 nb_NO.ISO-8859-1
+norwegian       nb_NO.ISO-8859-1
+nynorsk                nn_NO.ISO-8859-1
+polish          pl_PL.ISO-8859-2
+portuguese      pt_PT.ISO-8859-1
+romanian        ro_RO.ISO-8859-2
+russian         ru_RU.ISO-8859-5
+slovak          sk_SK.ISO-8859-2
+slovene         sl_SI.ISO-8859-2
+slovenian       sl_SI.ISO-8859-2
+spanish         es_ES.ISO-8859-1
+swedish         sv_SE.ISO-8859-1
+thai           th_TH.TIS-620
+turkish         tr_TR.ISO-8859-9
diff --git a/intl/localealias.c b/intl/localealias.c
new file mode 100644 (file)
index 0000000..7a092a0
--- /dev/null
@@ -0,0 +1,414 @@
+/* Handle aliases for locale names.
+   Copyright (C) 1995-1999, 2000-2001, 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <string.h> to provide a prototype for mempcpy().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#if defined _LIBC || defined HAVE___FSETLOCKING
+# include <stdio_ext.h>
+#endif
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# undef alloca
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gettextP.h"
+
+#if ENABLE_RELOCATABLE
+# include "relocatable.h"
+#else
+# define relocate(pathname) (pathname)
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions.  This is required by the standard
+   because some ANSI C functions will require linking with this object
+   file and the name space must not be polluted.  */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+#  define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY  1
+# define HAVE___FSETLOCKING    1
+
+/* We need locking here since we can be called from different places.  */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* Some optimizations for glibc.  */
+#ifdef _LIBC
+# define FEOF(fp)              feof_unlocked (fp)
+# define FGETS(buf, n, fp)     fgets_unlocked (buf, n, fp)
+#else
+# define FEOF(fp)              feof (fp)
+# define FGETS(buf, n, fp)     fgets (buf, n, fp)
+#endif
+
+/* For those losing systems which don't have `alloca' we have to add
+   some additional code emulating it.  */
+#ifdef HAVE_ALLOCA
+# define freea(p) /* nothing */
+#else
+# define alloca(n) malloc (n)
+# define freea(p) free (p)
+#endif
+
+#if defined _LIBC_REENTRANT || HAVE_DECL_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || HAVE_DECL_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+struct alias_map
+{
+  const char *alias;
+  const char *value;
+};
+
+
+#ifndef _LIBC
+# define libc_freeres_ptr(decl) decl
+#endif
+
+libc_freeres_ptr (static char *string_space);
+static size_t string_space_act;
+static size_t string_space_max;
+libc_freeres_ptr (static struct alias_map *map);
+static size_t nmap;
+static size_t maxmap;
+
+
+/* Prototypes for local functions.  */
+static size_t read_alias_file (const char *fname, int fname_len)
+     internal_function;
+static int extend_alias_table (void);
+static int alias_compare (const struct alias_map *map1,
+                         const struct alias_map *map2);
+
+
+const char *
+_nl_expand_alias (const char *name)
+{
+  static const char *locale_alias_path;
+  struct alias_map *retval;
+  const char *result = NULL;
+  size_t added;
+
+#ifdef _LIBC
+  __libc_lock_lock (lock);
+#endif
+
+  if (locale_alias_path == NULL)
+    locale_alias_path = LOCALE_ALIAS_PATH;
+
+  do
+    {
+      struct alias_map item;
+
+      item.alias = name;
+
+      if (nmap > 0)
+       retval = (struct alias_map *) bsearch (&item, map, nmap,
+                                              sizeof (struct alias_map),
+                                              (int (*) (const void *,
+                                                        const void *)
+                                               ) alias_compare);
+      else
+       retval = NULL;
+
+      /* We really found an alias.  Return the value.  */
+      if (retval != NULL)
+       {
+         result = retval->value;
+         break;
+       }
+
+      /* Perhaps we can find another alias file.  */
+      added = 0;
+      while (added == 0 && locale_alias_path[0] != '\0')
+       {
+         const char *start;
+
+         while (locale_alias_path[0] == PATH_SEPARATOR)
+           ++locale_alias_path;
+         start = locale_alias_path;
+
+         while (locale_alias_path[0] != '\0'
+                && locale_alias_path[0] != PATH_SEPARATOR)
+           ++locale_alias_path;
+
+         if (start < locale_alias_path)
+           added = read_alias_file (start, locale_alias_path - start);
+       }
+    }
+  while (added != 0);
+
+#ifdef _LIBC
+  __libc_lock_unlock (lock);
+#endif
+
+  return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (const char *fname, int fname_len)
+{
+  FILE *fp;
+  char *full_fname;
+  size_t added;
+  static const char aliasfile[] = "/locale.alias";
+
+  full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+#ifdef HAVE_MEMPCPY
+  mempcpy (mempcpy (full_fname, fname, fname_len),
+          aliasfile, sizeof aliasfile);
+#else
+  memcpy (full_fname, fname, fname_len);
+  memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+  fp = fopen (relocate (full_fname), "r");
+  freea (full_fname);
+  if (fp == NULL)
+    return 0;
+
+#ifdef HAVE___FSETLOCKING
+  /* No threads present.  */
+  __fsetlocking (fp, FSETLOCKING_BYCALLER);
+#endif
+
+  added = 0;
+  while (!FEOF (fp))
+    {
+      /* It is a reasonable approach to use a fix buffer here because
+        a) we are only interested in the first two fields
+        b) these fields must be usable as file names and so must not
+           be that long
+        We avoid a multi-kilobyte buffer here since this would use up
+        stack space which we might not have if the program ran out of
+        memory.  */
+      char buf[400];
+      char *alias;
+      char *value;
+      char *cp;
+
+      if (FGETS (buf, sizeof buf, fp) == NULL)
+       /* EOF reached.  */
+       break;
+
+      cp = buf;
+      /* Ignore leading white space.  */
+      while (isspace ((unsigned char) cp[0]))
+       ++cp;
+
+      /* A leading '#' signals a comment line.  */
+      if (cp[0] != '\0' && cp[0] != '#')
+       {
+         alias = cp++;
+         while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+           ++cp;
+         /* Terminate alias name.  */
+         if (cp[0] != '\0')
+           *cp++ = '\0';
+
+         /* Now look for the beginning of the value.  */
+         while (isspace ((unsigned char) cp[0]))
+           ++cp;
+
+         if (cp[0] != '\0')
+           {
+             size_t alias_len;
+             size_t value_len;
+
+             value = cp++;
+             while (cp[0] != '\0' && !isspace ((unsigned char) cp[0]))
+               ++cp;
+             /* Terminate value.  */
+             if (cp[0] == '\n')
+               {
+                 /* This has to be done to make the following test
+                    for the end of line possible.  We are looking for
+                    the terminating '\n' which do not overwrite here.  */
+                 *cp++ = '\0';
+                 *cp = '\n';
+               }
+             else if (cp[0] != '\0')
+               *cp++ = '\0';
+
+             if (nmap >= maxmap)
+               if (__builtin_expect (extend_alias_table (), 0))
+                 return added;
+
+             alias_len = strlen (alias) + 1;
+             value_len = strlen (value) + 1;
+
+             if (string_space_act + alias_len + value_len > string_space_max)
+               {
+                 /* Increase size of memory pool.  */
+                 size_t new_size = (string_space_max
+                                    + (alias_len + value_len > 1024
+                                       ? alias_len + value_len : 1024));
+                 char *new_pool = (char *) realloc (string_space, new_size);
+                 if (new_pool == NULL)
+                   return added;
+
+                 if (__builtin_expect (string_space != new_pool, 0))
+                   {
+                     size_t i;
+
+                     for (i = 0; i < nmap; i++)
+                       {
+                         map[i].alias += new_pool - string_space;
+                         map[i].value += new_pool - string_space;
+                       }
+                   }
+
+                 string_space = new_pool;
+                 string_space_max = new_size;
+               }
+
+             map[nmap].alias = memcpy (&string_space[string_space_act],
+                                       alias, alias_len);
+             string_space_act += alias_len;
+
+             map[nmap].value = memcpy (&string_space[string_space_act],
+                                       value, value_len);
+             string_space_act += value_len;
+
+             ++nmap;
+             ++added;
+           }
+       }
+
+      /* Possibly not the whole line fits into the buffer.  Ignore
+        the rest of the line.  */
+      while (strchr (buf, '\n') == NULL)
+       if (FGETS (buf, sizeof buf, fp) == NULL)
+         /* Make sure the inner loop will be left.  The outer loop
+            will exit at the `feof' test.  */
+         break;
+    }
+
+  /* Should we test for ferror()?  I think we have to silently ignore
+     errors.  --drepper  */
+  fclose (fp);
+
+  if (added > 0)
+    qsort (map, nmap, sizeof (struct alias_map),
+          (int (*) (const void *, const void *)) alias_compare);
+
+  return added;
+}
+
+
+static int
+extend_alias_table ()
+{
+  size_t new_size;
+  struct alias_map *new_map;
+
+  new_size = maxmap == 0 ? 100 : 2 * maxmap;
+  new_map = (struct alias_map *) realloc (map, (new_size
+                                               * sizeof (struct alias_map)));
+  if (new_map == NULL)
+    /* Simply don't extend: we don't have any more core.  */
+    return -1;
+
+  map = new_map;
+  maxmap = new_size;
+  return 0;
+}
+
+
+static int
+alias_compare (const struct alias_map *map1, const struct alias_map *map2)
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+  return strcasecmp (map1->alias, map2->alias);
+#else
+  const unsigned char *p1 = (const unsigned char *) map1->alias;
+  const unsigned char *p2 = (const unsigned char *) map2->alias;
+  unsigned char c1, c2;
+
+  if (p1 == p2)
+    return 0;
+
+  do
+    {
+      /* I know this seems to be odd but the tolower() function in
+        some systems libc cannot handle nonalpha characters.  */
+      c1 = isupper (*p1) ? tolower (*p1) : *p1;
+      c2 = isupper (*p2) ? tolower (*p2) : *p2;
+      if (c1 == '\0')
+       break;
+      ++p1;
+      ++p2;
+    }
+  while (c1 == c2);
+
+  return c1 - c2;
+#endif
+}
diff --git a/intl/localename.c b/intl/localename.c
new file mode 100644 (file)
index 0000000..9d65146
--- /dev/null
@@ -0,0 +1,1142 @@
+/* Determine the current selected locale.
+   Copyright (C) 1995-1999, 2000-2004 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Ulrich Drepper <drepper@gnu.org>, 1995.  */
+/* Win32 code written by Tor Lillqvist <tml@iki.fi>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <locale.h>
+
+#if defined _WIN32 || defined __WIN32__
+# undef WIN32   /* avoid warning on mingw32 */
+# define WIN32
+#endif
+
+#ifdef WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+/* List of language codes, sorted by value:
+   0x01 LANG_ARABIC
+   0x02 LANG_BULGARIAN
+   0x03 LANG_CATALAN
+   0x04 LANG_CHINESE
+   0x05 LANG_CZECH
+   0x06 LANG_DANISH
+   0x07 LANG_GERMAN
+   0x08 LANG_GREEK
+   0x09 LANG_ENGLISH
+   0x0a LANG_SPANISH
+   0x0b LANG_FINNISH
+   0x0c LANG_FRENCH
+   0x0d LANG_HEBREW
+   0x0e LANG_HUNGARIAN
+   0x0f LANG_ICELANDIC
+   0x10 LANG_ITALIAN
+   0x11 LANG_JAPANESE
+   0x12 LANG_KOREAN
+   0x13 LANG_DUTCH
+   0x14 LANG_NORWEGIAN
+   0x15 LANG_POLISH
+   0x16 LANG_PORTUGUESE
+   0x17 LANG_RHAETO_ROMANCE
+   0x18 LANG_ROMANIAN
+   0x19 LANG_RUSSIAN
+   0x1a LANG_CROATIAN == LANG_SERBIAN
+   0x1b LANG_SLOVAK
+   0x1c LANG_ALBANIAN
+   0x1d LANG_SWEDISH
+   0x1e LANG_THAI
+   0x1f LANG_TURKISH
+   0x20 LANG_URDU
+   0x21 LANG_INDONESIAN
+   0x22 LANG_UKRAINIAN
+   0x23 LANG_BELARUSIAN
+   0x24 LANG_SLOVENIAN
+   0x25 LANG_ESTONIAN
+   0x26 LANG_LATVIAN
+   0x27 LANG_LITHUANIAN
+   0x28 LANG_TAJIK
+   0x29 LANG_FARSI
+   0x2a LANG_VIETNAMESE
+   0x2b LANG_ARMENIAN
+   0x2c LANG_AZERI
+   0x2d LANG_BASQUE
+   0x2e LANG_SORBIAN
+   0x2f LANG_MACEDONIAN
+   0x30 LANG_SUTU
+   0x31 LANG_TSONGA
+   0x32 LANG_TSWANA
+   0x33 LANG_VENDA
+   0x34 LANG_XHOSA
+   0x35 LANG_ZULU
+   0x36 LANG_AFRIKAANS
+   0x37 LANG_GEORGIAN
+   0x38 LANG_FAEROESE
+   0x39 LANG_HINDI
+   0x3a LANG_MALTESE
+   0x3b LANG_SAAMI
+   0x3c LANG_GAELIC
+   0x3d LANG_YIDDISH
+   0x3e LANG_MALAY
+   0x3f LANG_KAZAK
+   0x40 LANG_KYRGYZ
+   0x41 LANG_SWAHILI
+   0x42 LANG_TURKMEN
+   0x43 LANG_UZBEK
+   0x44 LANG_TATAR
+   0x45 LANG_BENGALI
+   0x46 LANG_PUNJABI
+   0x47 LANG_GUJARATI
+   0x48 LANG_ORIYA
+   0x49 LANG_TAMIL
+   0x4a LANG_TELUGU
+   0x4b LANG_KANNADA
+   0x4c LANG_MALAYALAM
+   0x4d LANG_ASSAMESE
+   0x4e LANG_MARATHI
+   0x4f LANG_SANSKRIT
+   0x50 LANG_MONGOLIAN
+   0x51 LANG_TIBETAN
+   0x52 LANG_WELSH
+   0x53 LANG_CAMBODIAN
+   0x54 LANG_LAO
+   0x55 LANG_BURMESE
+   0x56 LANG_GALICIAN
+   0x57 LANG_KONKANI
+   0x58 LANG_MANIPURI
+   0x59 LANG_SINDHI
+   0x5a LANG_SYRIAC
+   0x5b LANG_SINHALESE
+   0x5c LANG_CHEROKEE
+   0x5d LANG_INUKTITUT
+   0x5e LANG_AMHARIC
+   0x5f LANG_TAMAZIGHT
+   0x60 LANG_KASHMIRI
+   0x61 LANG_NEPALI
+   0x62 LANG_FRISIAN
+   0x63 LANG_PASHTO
+   0x64 LANG_TAGALOG
+   0x65 LANG_DIVEHI
+   0x66 LANG_EDO
+   0x67 LANG_FULFULDE
+   0x68 LANG_HAUSA
+   0x69 LANG_IBIBIO
+   0x6a LANG_YORUBA
+   0x70 LANG_IGBO
+   0x71 LANG_KANURI
+   0x72 LANG_OROMO
+   0x73 LANG_TIGRINYA
+   0x74 LANG_GUARANI
+   0x75 LANG_HAWAIIAN
+   0x76 LANG_LATIN
+   0x77 LANG_SOMALI
+   0x78 LANG_YI
+   0x79 LANG_PAPIAMENTU
+*/
+/* Mingw headers don't have latest language and sublanguage codes.  */
+# ifndef LANG_AFRIKAANS
+# define LANG_AFRIKAANS 0x36
+# endif
+# ifndef LANG_ALBANIAN
+# define LANG_ALBANIAN 0x1c
+# endif
+# ifndef LANG_AMHARIC
+# define LANG_AMHARIC 0x5e
+# endif
+# ifndef LANG_ARABIC
+# define LANG_ARABIC 0x01
+# endif
+# ifndef LANG_ARMENIAN
+# define LANG_ARMENIAN 0x2b
+# endif
+# ifndef LANG_ASSAMESE
+# define LANG_ASSAMESE 0x4d
+# endif
+# ifndef LANG_AZERI
+# define LANG_AZERI 0x2c
+# endif
+# ifndef LANG_BASQUE
+# define LANG_BASQUE 0x2d
+# endif
+# ifndef LANG_BELARUSIAN
+# define LANG_BELARUSIAN 0x23
+# endif
+# ifndef LANG_BENGALI
+# define LANG_BENGALI 0x45
+# endif
+# ifndef LANG_BURMESE
+# define LANG_BURMESE 0x55
+# endif
+# ifndef LANG_CAMBODIAN
+# define LANG_CAMBODIAN 0x53
+# endif
+# ifndef LANG_CATALAN
+# define LANG_CATALAN 0x03
+# endif
+# ifndef LANG_CHEROKEE
+# define LANG_CHEROKEE 0x5c
+# endif
+# ifndef LANG_DIVEHI
+# define LANG_DIVEHI 0x65
+# endif
+# ifndef LANG_EDO
+# define LANG_EDO 0x66
+# endif
+# ifndef LANG_ESTONIAN
+# define LANG_ESTONIAN 0x25
+# endif
+# ifndef LANG_FAEROESE
+# define LANG_FAEROESE 0x38
+# endif
+# ifndef LANG_FARSI
+# define LANG_FARSI 0x29
+# endif
+# ifndef LANG_FRISIAN
+# define LANG_FRISIAN 0x62
+# endif
+# ifndef LANG_FULFULDE
+# define LANG_FULFULDE 0x67
+# endif
+# ifndef LANG_GAELIC
+# define LANG_GAELIC 0x3c
+# endif
+# ifndef LANG_GALICIAN
+# define LANG_GALICIAN 0x56
+# endif
+# ifndef LANG_GEORGIAN
+# define LANG_GEORGIAN 0x37
+# endif
+# ifndef LANG_GUARANI
+# define LANG_GUARANI 0x74
+# endif
+# ifndef LANG_GUJARATI
+# define LANG_GUJARATI 0x47
+# endif
+# ifndef LANG_HAUSA
+# define LANG_HAUSA 0x68
+# endif
+# ifndef LANG_HAWAIIAN
+# define LANG_HAWAIIAN 0x75
+# endif
+# ifndef LANG_HEBREW
+# define LANG_HEBREW 0x0d
+# endif
+# ifndef LANG_HINDI
+# define LANG_HINDI 0x39
+# endif
+# ifndef LANG_IBIBIO
+# define LANG_IBIBIO 0x69
+# endif
+# ifndef LANG_IGBO
+# define LANG_IGBO 0x70
+# endif
+# ifndef LANG_INDONESIAN
+# define LANG_INDONESIAN 0x21
+# endif
+# ifndef LANG_INUKTITUT
+# define LANG_INUKTITUT 0x5d
+# endif
+# ifndef LANG_KANNADA
+# define LANG_KANNADA 0x4b
+# endif
+# ifndef LANG_KANURI
+# define LANG_KANURI 0x71
+# endif
+# ifndef LANG_KASHMIRI
+# define LANG_KASHMIRI 0x60
+# endif
+# ifndef LANG_KAZAK
+# define LANG_KAZAK 0x3f
+# endif
+# ifndef LANG_KONKANI
+# define LANG_KONKANI 0x57
+# endif
+# ifndef LANG_KYRGYZ
+# define LANG_KYRGYZ 0x40
+# endif
+# ifndef LANG_LAO
+# define LANG_LAO 0x54
+# endif
+# ifndef LANG_LATIN
+# define LANG_LATIN 0x76
+# endif
+# ifndef LANG_LATVIAN
+# define LANG_LATVIAN 0x26
+# endif
+# ifndef LANG_LITHUANIAN
+# define LANG_LITHUANIAN 0x27
+# endif
+# ifndef LANG_MACEDONIAN
+# define LANG_MACEDONIAN 0x2f
+# endif
+# ifndef LANG_MALAY
+# define LANG_MALAY 0x3e
+# endif
+# ifndef LANG_MALAYALAM
+# define LANG_MALAYALAM 0x4c
+# endif
+# ifndef LANG_MALTESE
+# define LANG_MALTESE 0x3a
+# endif
+# ifndef LANG_MANIPURI
+# define LANG_MANIPURI 0x58
+# endif
+# ifndef LANG_MARATHI
+# define LANG_MARATHI 0x4e
+# endif
+# ifndef LANG_MONGOLIAN
+# define LANG_MONGOLIAN 0x50
+# endif
+# ifndef LANG_NEPALI
+# define LANG_NEPALI 0x61
+# endif
+# ifndef LANG_ORIYA
+# define LANG_ORIYA 0x48
+# endif
+# ifndef LANG_OROMO
+# define LANG_OROMO 0x72
+# endif
+# ifndef LANG_PAPIAMENTU
+# define LANG_PAPIAMENTU 0x79
+# endif
+# ifndef LANG_PASHTO
+# define LANG_PASHTO 0x63
+# endif
+# ifndef LANG_PUNJABI
+# define LANG_PUNJABI 0x46
+# endif
+# ifndef LANG_RHAETO_ROMANCE
+# define LANG_RHAETO_ROMANCE 0x17
+# endif
+# ifndef LANG_SAAMI
+# define LANG_SAAMI 0x3b
+# endif
+# ifndef LANG_SANSKRIT
+# define LANG_SANSKRIT 0x4f
+# endif
+# ifndef LANG_SERBIAN
+# define LANG_SERBIAN 0x1a
+# endif
+# ifndef LANG_SINDHI
+# define LANG_SINDHI 0x59
+# endif
+# ifndef LANG_SINHALESE
+# define LANG_SINHALESE 0x5b
+# endif
+# ifndef LANG_SLOVAK
+# define LANG_SLOVAK 0x1b
+# endif
+# ifndef LANG_SOMALI
+# define LANG_SOMALI 0x77
+# endif
+# ifndef LANG_SORBIAN
+# define LANG_SORBIAN 0x2e
+# endif
+# ifndef LANG_SUTU
+# define LANG_SUTU 0x30
+# endif
+# ifndef LANG_SWAHILI
+# define LANG_SWAHILI 0x41
+# endif
+# ifndef LANG_SYRIAC
+# define LANG_SYRIAC 0x5a
+# endif
+# ifndef LANG_TAGALOG
+# define LANG_TAGALOG 0x64
+# endif
+# ifndef LANG_TAJIK
+# define LANG_TAJIK 0x28
+# endif
+# ifndef LANG_TAMAZIGHT
+# define LANG_TAMAZIGHT 0x5f
+# endif
+# ifndef LANG_TAMIL
+# define LANG_TAMIL 0x49
+# endif
+# ifndef LANG_TATAR
+# define LANG_TATAR 0x44
+# endif
+# ifndef LANG_TELUGU
+# define LANG_TELUGU 0x4a
+# endif
+# ifndef LANG_THAI
+# define LANG_THAI 0x1e
+# endif
+# ifndef LANG_TIBETAN
+# define LANG_TIBETAN 0x51
+# endif
+# ifndef LANG_TIGRINYA
+# define LANG_TIGRINYA 0x73
+# endif
+# ifndef LANG_TSONGA
+# define LANG_TSONGA 0x31
+# endif
+# ifndef LANG_TSWANA
+# define LANG_TSWANA 0x32
+# endif
+# ifndef LANG_TURKMEN
+# define LANG_TURKMEN 0x42
+# endif
+# ifndef LANG_UKRAINIAN
+# define LANG_UKRAINIAN 0x22
+# endif
+# ifndef LANG_URDU
+# define LANG_URDU 0x20
+# endif
+# ifndef LANG_UZBEK
+# define LANG_UZBEK 0x43
+# endif
+# ifndef LANG_VENDA
+# define LANG_VENDA 0x33
+# endif
+# ifndef LANG_VIETNAMESE
+# define LANG_VIETNAMESE 0x2a
+# endif
+# ifndef LANG_WELSH
+# define LANG_WELSH 0x52
+# endif
+# ifndef LANG_XHOSA
+# define LANG_XHOSA 0x34
+# endif
+# ifndef LANG_YI
+# define LANG_YI 0x78
+# endif
+# ifndef LANG_YIDDISH
+# define LANG_YIDDISH 0x3d
+# endif
+# ifndef LANG_YORUBA
+# define LANG_YORUBA 0x6a
+# endif
+# ifndef LANG_ZULU
+# define LANG_ZULU 0x35
+# endif
+# ifndef SUBLANG_ARABIC_SAUDI_ARABIA
+# define SUBLANG_ARABIC_SAUDI_ARABIA 0x01
+# endif
+# ifndef SUBLANG_ARABIC_IRAQ
+# define SUBLANG_ARABIC_IRAQ 0x02
+# endif
+# ifndef SUBLANG_ARABIC_EGYPT
+# define SUBLANG_ARABIC_EGYPT 0x03
+# endif
+# ifndef SUBLANG_ARABIC_LIBYA
+# define SUBLANG_ARABIC_LIBYA 0x04
+# endif
+# ifndef SUBLANG_ARABIC_ALGERIA
+# define SUBLANG_ARABIC_ALGERIA 0x05
+# endif
+# ifndef SUBLANG_ARABIC_MOROCCO
+# define SUBLANG_ARABIC_MOROCCO 0x06
+# endif
+# ifndef SUBLANG_ARABIC_TUNISIA
+# define SUBLANG_ARABIC_TUNISIA 0x07
+# endif
+# ifndef SUBLANG_ARABIC_OMAN
+# define SUBLANG_ARABIC_OMAN 0x08
+# endif
+# ifndef SUBLANG_ARABIC_YEMEN
+# define SUBLANG_ARABIC_YEMEN 0x09
+# endif
+# ifndef SUBLANG_ARABIC_SYRIA
+# define SUBLANG_ARABIC_SYRIA 0x0a
+# endif
+# ifndef SUBLANG_ARABIC_JORDAN
+# define SUBLANG_ARABIC_JORDAN 0x0b
+# endif
+# ifndef SUBLANG_ARABIC_LEBANON
+# define SUBLANG_ARABIC_LEBANON 0x0c
+# endif
+# ifndef SUBLANG_ARABIC_KUWAIT
+# define SUBLANG_ARABIC_KUWAIT 0x0d
+# endif
+# ifndef SUBLANG_ARABIC_UAE
+# define SUBLANG_ARABIC_UAE 0x0e
+# endif
+# ifndef SUBLANG_ARABIC_BAHRAIN
+# define SUBLANG_ARABIC_BAHRAIN 0x0f
+# endif
+# ifndef SUBLANG_ARABIC_QATAR
+# define SUBLANG_ARABIC_QATAR 0x10
+# endif
+# ifndef SUBLANG_AZERI_LATIN
+# define SUBLANG_AZERI_LATIN 0x01
+# endif
+# ifndef SUBLANG_AZERI_CYRILLIC
+# define SUBLANG_AZERI_CYRILLIC 0x02
+# endif
+# ifndef SUBLANG_BENGALI_INDIA
+# define SUBLANG_BENGALI_INDIA 0x00
+# endif
+# ifndef SUBLANG_BENGALI_BANGLADESH
+# define SUBLANG_BENGALI_BANGLADESH 0x01
+# endif
+# ifndef SUBLANG_CHINESE_MACAU
+# define SUBLANG_CHINESE_MACAU 0x05
+# endif
+# ifndef SUBLANG_ENGLISH_SOUTH_AFRICA
+# define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07
+# endif
+# ifndef SUBLANG_ENGLISH_JAMAICA
+# define SUBLANG_ENGLISH_JAMAICA 0x08
+# endif
+# ifndef SUBLANG_ENGLISH_CARIBBEAN
+# define SUBLANG_ENGLISH_CARIBBEAN 0x09
+# endif
+# ifndef SUBLANG_ENGLISH_BELIZE
+# define SUBLANG_ENGLISH_BELIZE 0x0a
+# endif
+# ifndef SUBLANG_ENGLISH_TRINIDAD
+# define SUBLANG_ENGLISH_TRINIDAD 0x0b
+# endif
+# ifndef SUBLANG_ENGLISH_ZIMBABWE
+# define SUBLANG_ENGLISH_ZIMBABWE 0x0c
+# endif
+# ifndef SUBLANG_ENGLISH_PHILIPPINES
+# define SUBLANG_ENGLISH_PHILIPPINES 0x0d
+# endif
+# ifndef SUBLANG_ENGLISH_INDONESIA
+# define SUBLANG_ENGLISH_INDONESIA 0x0e
+# endif
+# ifndef SUBLANG_ENGLISH_HONGKONG
+# define SUBLANG_ENGLISH_HONGKONG 0x0f
+# endif
+# ifndef SUBLANG_ENGLISH_INDIA
+# define SUBLANG_ENGLISH_INDIA 0x10
+# endif
+# ifndef SUBLANG_ENGLISH_MALAYSIA
+# define SUBLANG_ENGLISH_MALAYSIA 0x11
+# endif
+# ifndef SUBLANG_ENGLISH_SINGAPORE
+# define SUBLANG_ENGLISH_SINGAPORE 0x12
+# endif
+# ifndef SUBLANG_FRENCH_LUXEMBOURG
+# define SUBLANG_FRENCH_LUXEMBOURG 0x05
+# endif
+# ifndef SUBLANG_FRENCH_MONACO
+# define SUBLANG_FRENCH_MONACO 0x06
+# endif
+# ifndef SUBLANG_FRENCH_WESTINDIES
+# define SUBLANG_FRENCH_WESTINDIES 0x07
+# endif
+# ifndef SUBLANG_FRENCH_REUNION
+# define SUBLANG_FRENCH_REUNION 0x08
+# endif
+# ifndef SUBLANG_FRENCH_CONGO
+# define SUBLANG_FRENCH_CONGO 0x09
+# endif
+# ifndef SUBLANG_FRENCH_SENEGAL
+# define SUBLANG_FRENCH_SENEGAL 0x0a
+# endif
+# ifndef SUBLANG_FRENCH_CAMEROON
+# define SUBLANG_FRENCH_CAMEROON 0x0b
+# endif
+# ifndef SUBLANG_FRENCH_COTEDIVOIRE
+# define SUBLANG_FRENCH_COTEDIVOIRE 0x0c
+# endif
+# ifndef SUBLANG_FRENCH_MALI
+# define SUBLANG_FRENCH_MALI 0x0d
+# endif
+# ifndef SUBLANG_FRENCH_MOROCCO
+# define SUBLANG_FRENCH_MOROCCO 0x0e
+# endif
+# ifndef SUBLANG_FRENCH_HAITI
+# define SUBLANG_FRENCH_HAITI 0x0f
+# endif
+# ifndef SUBLANG_GERMAN_LUXEMBOURG
+# define SUBLANG_GERMAN_LUXEMBOURG 0x04
+# endif
+# ifndef SUBLANG_GERMAN_LIECHTENSTEIN
+# define SUBLANG_GERMAN_LIECHTENSTEIN 0x05
+# endif
+# ifndef SUBLANG_KASHMIRI_INDIA
+# define SUBLANG_KASHMIRI_INDIA 0x02
+# endif
+# ifndef SUBLANG_MALAY_MALAYSIA
+# define SUBLANG_MALAY_MALAYSIA 0x01
+# endif
+# ifndef SUBLANG_MALAY_BRUNEI_DARUSSALAM
+# define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02
+# endif
+# ifndef SUBLANG_NEPALI_INDIA
+# define SUBLANG_NEPALI_INDIA 0x02
+# endif
+# ifndef SUBLANG_PUNJABI_INDIA
+# define SUBLANG_PUNJABI_INDIA 0x00
+# endif
+# ifndef SUBLANG_PUNJABI_PAKISTAN
+# define SUBLANG_PUNJABI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_ROMANIAN_ROMANIA
+# define SUBLANG_ROMANIAN_ROMANIA 0x00
+# endif
+# ifndef SUBLANG_ROMANIAN_MOLDOVA
+# define SUBLANG_ROMANIAN_MOLDOVA 0x01
+# endif
+# ifndef SUBLANG_SERBIAN_LATIN
+# define SUBLANG_SERBIAN_LATIN 0x02
+# endif
+# ifndef SUBLANG_SERBIAN_CYRILLIC
+# define SUBLANG_SERBIAN_CYRILLIC 0x03
+# endif
+# ifndef SUBLANG_SINDHI_INDIA
+# define SUBLANG_SINDHI_INDIA 0x00
+# endif
+# ifndef SUBLANG_SINDHI_PAKISTAN
+# define SUBLANG_SINDHI_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_SPANISH_GUATEMALA
+# define SUBLANG_SPANISH_GUATEMALA 0x04
+# endif
+# ifndef SUBLANG_SPANISH_COSTA_RICA
+# define SUBLANG_SPANISH_COSTA_RICA 0x05
+# endif
+# ifndef SUBLANG_SPANISH_PANAMA
+# define SUBLANG_SPANISH_PANAMA 0x06
+# endif
+# ifndef SUBLANG_SPANISH_DOMINICAN_REPUBLIC
+# define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07
+# endif
+# ifndef SUBLANG_SPANISH_VENEZUELA
+# define SUBLANG_SPANISH_VENEZUELA 0x08
+# endif
+# ifndef SUBLANG_SPANISH_COLOMBIA
+# define SUBLANG_SPANISH_COLOMBIA 0x09
+# endif
+# ifndef SUBLANG_SPANISH_PERU
+# define SUBLANG_SPANISH_PERU 0x0a
+# endif
+# ifndef SUBLANG_SPANISH_ARGENTINA
+# define SUBLANG_SPANISH_ARGENTINA 0x0b
+# endif
+# ifndef SUBLANG_SPANISH_ECUADOR
+# define SUBLANG_SPANISH_ECUADOR 0x0c
+# endif
+# ifndef SUBLANG_SPANISH_CHILE
+# define SUBLANG_SPANISH_CHILE 0x0d
+# endif
+# ifndef SUBLANG_SPANISH_URUGUAY
+# define SUBLANG_SPANISH_URUGUAY 0x0e
+# endif
+# ifndef SUBLANG_SPANISH_PARAGUAY
+# define SUBLANG_SPANISH_PARAGUAY 0x0f
+# endif
+# ifndef SUBLANG_SPANISH_BOLIVIA
+# define SUBLANG_SPANISH_BOLIVIA 0x10
+# endif
+# ifndef SUBLANG_SPANISH_EL_SALVADOR
+# define SUBLANG_SPANISH_EL_SALVADOR 0x11
+# endif
+# ifndef SUBLANG_SPANISH_HONDURAS
+# define SUBLANG_SPANISH_HONDURAS 0x12
+# endif
+# ifndef SUBLANG_SPANISH_NICARAGUA
+# define SUBLANG_SPANISH_NICARAGUA 0x13
+# endif
+# ifndef SUBLANG_SPANISH_PUERTO_RICO
+# define SUBLANG_SPANISH_PUERTO_RICO 0x14
+# endif
+# ifndef SUBLANG_SWEDISH_FINLAND
+# define SUBLANG_SWEDISH_FINLAND 0x02
+# endif
+# ifndef SUBLANG_TAMAZIGHT_ARABIC
+# define SUBLANG_TAMAZIGHT_ARABIC 0x01
+# endif
+# ifndef SUBLANG_TAMAZIGHT_LATIN
+# define SUBLANG_TAMAZIGHT_LATIN 0x02
+# endif
+# ifndef SUBLANG_TIGRINYA_ETHIOPIA
+# define SUBLANG_TIGRINYA_ETHIOPIA 0x00
+# endif
+# ifndef SUBLANG_TIGRINYA_ERITREA
+# define SUBLANG_TIGRINYA_ERITREA 0x01
+# endif
+# ifndef SUBLANG_URDU_PAKISTAN
+# define SUBLANG_URDU_PAKISTAN 0x01
+# endif
+# ifndef SUBLANG_URDU_INDIA
+# define SUBLANG_URDU_INDIA 0x02
+# endif
+# ifndef SUBLANG_UZBEK_LATIN
+# define SUBLANG_UZBEK_LATIN 0x01
+# endif
+# ifndef SUBLANG_UZBEK_CYRILLIC
+# define SUBLANG_UZBEK_CYRILLIC 0x02
+# endif
+#endif
+
+/* XPG3 defines the result of 'setlocale (category, NULL)' as:
+   "Directs 'setlocale()' to query 'category' and return the current
+    setting of 'local'."
+   However it does not specify the exact format.  Neither do SUSV2 and
+   ISO C 99.  So we can use this feature only on selected systems (e.g.
+   those using GNU C Library).  */
+#if defined _LIBC || (defined __GNU_LIBRARY__ && __GNU_LIBRARY__ >= 2)
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Determine the current locale's name, and canonicalize it into XPG syntax
+     language[_territory[.codeset]][@modifier]
+   The codeset part in the result is not reliable; the locale_charset()
+   should be used for codeset information instead.
+   The result must not be freed; it is statically allocated.  */
+
+const char *
+_nl_locale_name (int category, const char *categoryname)
+{
+  const char *retval;
+
+#ifndef WIN32
+
+  /* Use the POSIX methods of looking to 'LC_ALL', 'LC_xxx', and 'LANG'.
+     On some systems this can be done by the 'setlocale' function itself.  */
+# if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+  retval = setlocale (category, NULL);
+# else
+  /* Setting of LC_ALL overwrites all other.  */
+  retval = getenv ("LC_ALL");
+  if (retval == NULL || retval[0] == '\0')
+    {
+      /* Next comes the name of the desired category.  */
+      retval = getenv (categoryname);
+      if (retval == NULL || retval[0] == '\0')
+       {
+         /* Last possibility is the LANG environment variable.  */
+         retval = getenv ("LANG");
+         if (retval == NULL || retval[0] == '\0')
+           /* We use C as the default domain.  POSIX says this is
+              implementation defined.  */
+           retval = "C";
+       }
+    }
+# endif
+
+  return retval;
+
+#else /* WIN32 */
+
+  /* Return an XPG style locale name language[_territory][@modifier].
+     Don't even bother determining the codeset; it's not useful in this
+     context, because message catalogs are not specific to a single
+     codeset.  */
+
+  LCID lcid;
+  LANGID langid;
+  int primary, sub;
+
+  /* Let the user override the system settings through environment
+     variables, as on POSIX systems.  */
+  retval = getenv ("LC_ALL");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  retval = getenv (categoryname);
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+  retval = getenv ("LANG");
+  if (retval != NULL && retval[0] != '\0')
+    return retval;
+
+  /* Use native Win32 API locale ID.  */
+  lcid = GetThreadLocale ();
+
+  /* Strip off the sorting rules, keep only the language part.  */
+  langid = LANGIDFROMLCID (lcid);
+
+  /* Split into language and territory part.  */
+  primary = PRIMARYLANGID (langid);
+  sub = SUBLANGID (langid);
+
+  /* Dispatch on language.
+     See also http://www.unicode.org/unicode/onlinedat/languages.html .
+     For details about languages, see http://www.ethnologue.com/ .  */
+  switch (primary)
+    {
+    case LANG_AFRIKAANS: return "af_ZA";
+    case LANG_ALBANIAN: return "sq_AL";
+    case LANG_AMHARIC: return "am_ET";
+    case LANG_ARABIC:
+      switch (sub)
+       {
+       case SUBLANG_ARABIC_SAUDI_ARABIA: return "ar_SA";
+       case SUBLANG_ARABIC_IRAQ: return "ar_IQ";
+       case SUBLANG_ARABIC_EGYPT: return "ar_EG";
+       case SUBLANG_ARABIC_LIBYA: return "ar_LY";
+       case SUBLANG_ARABIC_ALGERIA: return "ar_DZ";
+       case SUBLANG_ARABIC_MOROCCO: return "ar_MA";
+       case SUBLANG_ARABIC_TUNISIA: return "ar_TN";
+       case SUBLANG_ARABIC_OMAN: return "ar_OM";
+       case SUBLANG_ARABIC_YEMEN: return "ar_YE";
+       case SUBLANG_ARABIC_SYRIA: return "ar_SY";
+       case SUBLANG_ARABIC_JORDAN: return "ar_JO";
+       case SUBLANG_ARABIC_LEBANON: return "ar_LB";
+       case SUBLANG_ARABIC_KUWAIT: return "ar_KW";
+       case SUBLANG_ARABIC_UAE: return "ar_AE";
+       case SUBLANG_ARABIC_BAHRAIN: return "ar_BH";
+       case SUBLANG_ARABIC_QATAR: return "ar_QA";
+       }
+      return "ar";
+    case LANG_ARMENIAN: return "hy_AM";
+    case LANG_ASSAMESE: return "as_IN";
+    case LANG_AZERI:
+      switch (sub)
+       {
+       /* FIXME: Adjust this when Azerbaijani locales appear on Unix.  */
+       case SUBLANG_AZERI_LATIN: return "az_AZ@latin";
+       case SUBLANG_AZERI_CYRILLIC: return "az_AZ@cyrillic";
+       }
+      return "az";
+    case LANG_BASQUE:
+      return "eu"; /* Ambiguous: could be "eu_ES" or "eu_FR".  */
+    case LANG_BELARUSIAN: return "be_BY";
+    case LANG_BENGALI:
+      switch (sub)
+       {
+       case SUBLANG_BENGALI_INDIA: return "bn_IN";
+       case SUBLANG_BENGALI_BANGLADESH: return "bn_BD";
+       }
+      return "bn";
+    case LANG_BULGARIAN: return "bg_BG";
+    case LANG_BURMESE: return "my_MM";
+    case LANG_CAMBODIAN: return "km_KH";
+    case LANG_CATALAN: return "ca_ES";
+    case LANG_CHEROKEE: return "chr_US";
+    case LANG_CHINESE:
+      switch (sub)
+       {
+       case SUBLANG_CHINESE_TRADITIONAL: return "zh_TW";
+       case SUBLANG_CHINESE_SIMPLIFIED: return "zh_CN";
+       case SUBLANG_CHINESE_HONGKONG: return "zh_HK";
+       case SUBLANG_CHINESE_SINGAPORE: return "zh_SG";
+       case SUBLANG_CHINESE_MACAU: return "zh_MO";
+       }
+      return "zh";
+    case LANG_CROATIAN:                /* LANG_CROATIAN == LANG_SERBIAN
+                                * What used to be called Serbo-Croatian
+                                * should really now be two separate
+                                * languages because of political reasons.
+                                * (Says tml, who knows nothing about Serbian
+                                * or Croatian.)
+                                * (I can feel those flames coming already.)
+                                */
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "hr_HR";
+       case SUBLANG_SERBIAN_LATIN: return "sr_CS";
+       case SUBLANG_SERBIAN_CYRILLIC: return "sr_CS@cyrillic";
+       }
+      return "hr";
+    case LANG_CZECH: return "cs_CZ";
+    case LANG_DANISH: return "da_DK";
+    case LANG_DIVEHI: return "dv_MV";
+    case LANG_DUTCH:
+      switch (sub)
+       {
+       case SUBLANG_DUTCH: return "nl_NL";
+       case SUBLANG_DUTCH_BELGIAN: /* FLEMISH, VLAAMS */ return "nl_BE";
+       }
+      return "nl";
+    case LANG_EDO: return "bin_NG";
+    case LANG_ENGLISH:
+      switch (sub)
+       {
+       /* SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. Heh. I thought
+        * English was the language spoken in England.
+        * Oh well.
+        */
+       case SUBLANG_ENGLISH_US: return "en_US";
+       case SUBLANG_ENGLISH_UK: return "en_GB";
+       case SUBLANG_ENGLISH_AUS: return "en_AU";
+       case SUBLANG_ENGLISH_CAN: return "en_CA";
+       case SUBLANG_ENGLISH_NZ: return "en_NZ";
+       case SUBLANG_ENGLISH_EIRE: return "en_IE";
+       case SUBLANG_ENGLISH_SOUTH_AFRICA: return "en_ZA";
+       case SUBLANG_ENGLISH_JAMAICA: return "en_JM";
+       case SUBLANG_ENGLISH_CARIBBEAN: return "en_GD"; /* Grenada? */
+       case SUBLANG_ENGLISH_BELIZE: return "en_BZ";
+       case SUBLANG_ENGLISH_TRINIDAD: return "en_TT";
+       case SUBLANG_ENGLISH_ZIMBABWE: return "en_ZW";
+       case SUBLANG_ENGLISH_PHILIPPINES: return "en_PH";
+       case SUBLANG_ENGLISH_INDONESIA: return "en_ID";
+       case SUBLANG_ENGLISH_HONGKONG: return "en_HK";
+       case SUBLANG_ENGLISH_INDIA: return "en_IN";
+       case SUBLANG_ENGLISH_MALAYSIA: return "en_MY";
+       case SUBLANG_ENGLISH_SINGAPORE: return "en_SG";
+       }
+      return "en";
+    case LANG_ESTONIAN: return "et_EE";
+    case LANG_FAEROESE: return "fo_FO";
+    case LANG_FARSI: return "fa_IR";
+    case LANG_FINNISH: return "fi_FI";
+    case LANG_FRENCH:
+      switch (sub)
+       {
+       case SUBLANG_FRENCH: return "fr_FR";
+       case SUBLANG_FRENCH_BELGIAN: /* WALLOON */ return "fr_BE";
+       case SUBLANG_FRENCH_CANADIAN: return "fr_CA";
+       case SUBLANG_FRENCH_SWISS: return "fr_CH";
+       case SUBLANG_FRENCH_LUXEMBOURG: return "fr_LU";
+       case SUBLANG_FRENCH_MONACO: return "fr_MC";
+       case SUBLANG_FRENCH_WESTINDIES: return "fr"; /* Caribbean? */
+       case SUBLANG_FRENCH_REUNION: return "fr_RE";
+       case SUBLANG_FRENCH_CONGO: return "fr_CG";
+       case SUBLANG_FRENCH_SENEGAL: return "fr_SN";
+       case SUBLANG_FRENCH_CAMEROON: return "fr_CM";
+       case SUBLANG_FRENCH_COTEDIVOIRE: return "fr_CI";
+       case SUBLANG_FRENCH_MALI: return "fr_ML";
+       case SUBLANG_FRENCH_MOROCCO: return "fr_MA";
+       case SUBLANG_FRENCH_HAITI: return "fr_HT";
+       }
+      return "fr";
+    case LANG_FRISIAN: return "fy_NL";
+    case LANG_FULFULDE:
+      /* Spoken in Nigeria, Guinea, Senegal, Mali, Niger, Cameroon, Benin. */
+      return "ff_NG";
+    case LANG_GAELIC:
+      switch (sub)
+       {
+       case 0x01: /* SCOTTISH */ return "gd_GB";
+       case 0x02: /* IRISH */ return "ga_IE";
+       }
+      return "C";
+    case LANG_GALICIAN: return "gl_ES";
+    case LANG_GEORGIAN: return "ka_GE";
+    case LANG_GERMAN:
+      switch (sub)
+       {
+       case SUBLANG_GERMAN: return "de_DE";
+       case SUBLANG_GERMAN_SWISS: return "de_CH";
+       case SUBLANG_GERMAN_AUSTRIAN: return "de_AT";
+       case SUBLANG_GERMAN_LUXEMBOURG: return "de_LU";
+       case SUBLANG_GERMAN_LIECHTENSTEIN: return "de_LI";
+       }
+      return "de";
+    case LANG_GREEK: return "el_GR";
+    case LANG_GUARANI: return "gn_PY";
+    case LANG_GUJARATI: return "gu_IN";
+    case LANG_HAUSA: return "ha_NG";
+    case LANG_HAWAIIAN:
+      /* FIXME: Do they mean Hawaiian ("haw_US", 1000 speakers)
+        or Hawaii Creole English ("cpe_US", 600000 speakers)?  */
+      return "cpe_US";
+    case LANG_HEBREW: return "he_IL";
+    case LANG_HINDI: return "hi_IN";
+    case LANG_HUNGARIAN: return "hu_HU";
+    case LANG_IBIBIO: return "nic_NG";
+    case LANG_ICELANDIC: return "is_IS";
+    case LANG_IGBO: return "ig_NG";
+    case LANG_INDONESIAN: return "id_ID";
+    case LANG_INUKTITUT: return "iu_CA";
+    case LANG_ITALIAN:
+      switch (sub)
+       {
+       case SUBLANG_ITALIAN: return "it_IT";
+       case SUBLANG_ITALIAN_SWISS: return "it_CH";
+       }
+      return "it";
+    case LANG_JAPANESE: return "ja_JP";
+    case LANG_KANNADA: return "kn_IN";
+    case LANG_KANURI: return "kr_NG";
+    case LANG_KASHMIRI:
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "ks_PK";
+       case SUBLANG_KASHMIRI_INDIA: return "ks_IN";
+       }
+      return "ks";
+    case LANG_KAZAK: return "kk_KZ";
+    case LANG_KONKANI:
+      /* FIXME: Adjust this when such locales appear on Unix.  */
+      return "kok_IN";
+    case LANG_KOREAN: return "ko_KR";
+    case LANG_KYRGYZ: return "ky_KG";
+    case LANG_LAO: return "lo_LA";
+    case LANG_LATIN: return "la_VA";
+    case LANG_LATVIAN: return "lv_LV";
+    case LANG_LITHUANIAN: return "lt_LT";
+    case LANG_MACEDONIAN: return "mk_MK";
+    case LANG_MALAY:
+      switch (sub)
+       {
+       case SUBLANG_MALAY_MALAYSIA: return "ms_MY";
+       case SUBLANG_MALAY_BRUNEI_DARUSSALAM: return "ms_BN";
+       }
+      return "ms";
+    case LANG_MALAYALAM: return "ml_IN";
+    case LANG_MALTESE: return "mt_MT";
+    case LANG_MANIPURI:
+      /* FIXME: Adjust this when such locales appear on Unix.  */
+      return "mni_IN";
+    case LANG_MARATHI: return "mr_IN";
+    case LANG_MONGOLIAN:
+      return "mn"; /* Ambiguous: could be "mn_CN" or "mn_MN".  */
+    case LANG_NEPALI:
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "ne_NP";
+       case SUBLANG_NEPALI_INDIA: return "ne_IN";
+       }
+      return "ne";
+    case LANG_NORWEGIAN:
+      switch (sub)
+       {
+       case SUBLANG_NORWEGIAN_BOKMAL: return "no_NO";
+       case SUBLANG_NORWEGIAN_NYNORSK: return "nn_NO";
+       }
+      return "no";
+    case LANG_ORIYA: return "or_IN";
+    case LANG_OROMO: return "om_ET";
+    case LANG_PAPIAMENTU: return "pap_AN";
+    case LANG_PASHTO:
+      return "ps"; /* Ambiguous: could be "ps_PK" or "ps_AF".  */
+    case LANG_POLISH: return "pl_PL";
+    case LANG_PORTUGUESE:
+      switch (sub)
+       {
+       case SUBLANG_PORTUGUESE: return "pt_PT";
+       /* Hmm. SUBLANG_PORTUGUESE_BRAZILIAN == SUBLANG_DEFAULT.
+          Same phenomenon as SUBLANG_ENGLISH_US == SUBLANG_DEFAULT. */
+       case SUBLANG_PORTUGUESE_BRAZILIAN: return "pt_BR";
+       }
+      return "pt";
+    case LANG_PUNJABI:
+      switch (sub)
+       {
+       case SUBLANG_PUNJABI_INDIA: return "pa_IN"; /* Gurmukhi script */
+       case SUBLANG_PUNJABI_PAKISTAN: return "pa_PK"; /* Arabic script */
+       }
+      return "pa";
+    case LANG_RHAETO_ROMANCE: return "rm_CH";
+    case LANG_ROMANIAN:
+      switch (sub)
+       {
+       case SUBLANG_ROMANIAN_ROMANIA: return "ro_RO";
+       case SUBLANG_ROMANIAN_MOLDOVA: return "ro_MD";
+       }
+      return "ro";
+    case LANG_RUSSIAN:
+      return "ru"; /* Ambiguous: could be "ru_RU" or "ru_UA" or "ru_MD".  */
+    case LANG_SAAMI: /* actually Northern Sami */ return "se_NO";
+    case LANG_SANSKRIT: return "sa_IN";
+    case LANG_SINDHI:
+      switch (sub)
+       {
+       case SUBLANG_SINDHI_INDIA: return "sd_IN";
+       case SUBLANG_SINDHI_PAKISTAN: return "sd_PK";
+       }
+      return "sd";
+    case LANG_SINHALESE: return "si_LK";
+    case LANG_SLOVAK: return "sk_SK";
+    case LANG_SLOVENIAN: return "sl_SI";
+    case LANG_SOMALI: return "so_SO";
+    case LANG_SORBIAN:
+      /* FIXME: Adjust this when such locales appear on Unix.  */
+      return "wen_DE";
+    case LANG_SPANISH:
+      switch (sub)
+       {
+       case SUBLANG_SPANISH: return "es_ES";
+       case SUBLANG_SPANISH_MEXICAN: return "es_MX";
+       case SUBLANG_SPANISH_MODERN:
+         return "es_ES@modern";        /* not seen on Unix */
+       case SUBLANG_SPANISH_GUATEMALA: return "es_GT";
+       case SUBLANG_SPANISH_COSTA_RICA: return "es_CR";
+       case SUBLANG_SPANISH_PANAMA: return "es_PA";
+       case SUBLANG_SPANISH_DOMINICAN_REPUBLIC: return "es_DO";
+       case SUBLANG_SPANISH_VENEZUELA: return "es_VE";
+       case SUBLANG_SPANISH_COLOMBIA: return "es_CO";
+       case SUBLANG_SPANISH_PERU: return "es_PE";
+       case SUBLANG_SPANISH_ARGENTINA: return "es_AR";
+       case SUBLANG_SPANISH_ECUADOR: return "es_EC";
+       case SUBLANG_SPANISH_CHILE: return "es_CL";
+       case SUBLANG_SPANISH_URUGUAY: return "es_UY";
+       case SUBLANG_SPANISH_PARAGUAY: return "es_PY";
+       case SUBLANG_SPANISH_BOLIVIA: return "es_BO";
+       case SUBLANG_SPANISH_EL_SALVADOR: return "es_SV";
+       case SUBLANG_SPANISH_HONDURAS: return "es_HN";
+       case SUBLANG_SPANISH_NICARAGUA: return "es_NI";
+       case SUBLANG_SPANISH_PUERTO_RICO: return "es_PR";
+       }
+      return "es";
+    case LANG_SUTU: return "bnt_TZ"; /* or "st_LS" or "nso_ZA"? */
+    case LANG_SWAHILI: return "sw_KE";
+    case LANG_SWEDISH:
+      switch (sub)
+       {
+       case SUBLANG_DEFAULT: return "sv_SE";
+       case SUBLANG_SWEDISH_FINLAND: return "sv_FI";
+       }
+      return "sv";
+    case LANG_SYRIAC: return "syr_TR"; /* An extinct language.  */
+    case LANG_TAGALOG: return "tl_PH";
+    case LANG_TAJIK: return "tg_TJ";
+    case LANG_TAMAZIGHT:
+      switch (sub)
+       {
+       /* FIXME: Adjust this when Tamazight locales appear on Unix.  */
+       case SUBLANG_TAMAZIGHT_ARABIC: return "ber_MA@arabic";
+       case SUBLANG_TAMAZIGHT_LATIN: return "ber_MA@latin";
+       }
+      return "ber_MA";
+    case LANG_TAMIL:
+      return "ta"; /* Ambiguous: could be "ta_IN" or "ta_LK" or "ta_SG".  */
+    case LANG_TATAR: return "tt_RU";
+    case LANG_TELUGU: return "te_IN";
+    case LANG_THAI: return "th_TH";
+    case LANG_TIBETAN: return "bo_CN";
+    case LANG_TIGRINYA:
+      switch (sub)
+       {
+       case SUBLANG_TIGRINYA_ETHIOPIA: return "ti_ET";
+       case SUBLANG_TIGRINYA_ERITREA: return "ti_ER";
+       }
+      return "ti";
+    case LANG_TSONGA: return "ts_ZA";
+    case LANG_TSWANA: return "tn_BW";
+    case LANG_TURKISH: return "tr_TR";
+    case LANG_TURKMEN: return "tk_TM";
+    case LANG_UKRAINIAN: return "uk_UA";
+    case LANG_URDU:
+      switch (sub)
+       {
+       case SUBLANG_URDU_PAKISTAN: return "ur_PK";
+       case SUBLANG_URDU_INDIA: return "ur_IN";
+       }
+      return "ur";
+    case LANG_UZBEK:
+      switch (sub)
+       {
+       case SUBLANG_UZBEK_LATIN: return "uz_UZ";
+       case SUBLANG_UZBEK_CYRILLIC: return "uz_UZ@cyrillic";
+       }
+      return "uz";
+    case LANG_VENDA: return "ve_ZA";
+    case LANG_VIETNAMESE: return "vi_VN";
+    case LANG_WELSH: return "cy_GB";
+    case LANG_XHOSA: return "xh_ZA";
+    case LANG_YI: return "sit_CN";
+    case LANG_YIDDISH: return "yi_IL";
+    case LANG_YORUBA: return "yo_NG";
+    case LANG_ZULU: return "zu_ZA";
+    default: return "C";
+    }
+
+#endif
+}
diff --git a/intl/log.c b/intl/log.c
new file mode 100644 (file)
index 0000000..89f82df
--- /dev/null
@@ -0,0 +1,98 @@
+/* Log file output.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* Print an ASCII string with quotes and escape sequences where needed.  */
+static void
+print_escaped (FILE *stream, const char *str)
+{
+  putc ('"', stream);
+  for (; *str != '\0'; str++)
+    if (*str == '\n')
+      {
+       fputs ("\\n\"", stream);
+       if (str[1] == '\0')
+         return;
+       fputs ("\n\"", stream);
+      }
+    else
+      {
+       if (*str == '"' || *str == '\\')
+         putc ('\\', stream);
+       putc (*str, stream);
+      }
+  putc ('"', stream);
+}
+
+/* Add to the log file an entry denoting a failed translation.  */
+void
+_nl_log_untranslated (const char *logfilename, const char *domainname,
+                     const char *msgid1, const char *msgid2, int plural)
+{
+  static char *last_logfilename = NULL;
+  static FILE *last_logfile = NULL;
+  FILE *logfile;
+
+  /* Can we reuse the last opened logfile?  */
+  if (last_logfilename == NULL || strcmp (logfilename, last_logfilename) != 0)
+    {
+      /* Close the last used logfile.  */
+      if (last_logfilename != NULL)
+       {
+         if (last_logfile != NULL)
+           {
+             fclose (last_logfile);
+             last_logfile = NULL;
+           }
+         free (last_logfilename);
+         last_logfilename = NULL;
+       }
+      /* Open the logfile.  */
+      last_logfilename = (char *) malloc (strlen (logfilename) + 1);
+      if (last_logfilename == NULL)
+       return;
+      strcpy (last_logfilename, logfilename);
+      last_logfile = fopen (logfilename, "a");
+      if (last_logfile == NULL)
+       return;
+    }
+  logfile = last_logfile;
+
+  fprintf (logfile, "domain ");
+  print_escaped (logfile, domainname);
+  fprintf (logfile, "\nmsgid ");
+  print_escaped (logfile, msgid1);
+  if (plural)
+    {
+      fprintf (logfile, "\nmsgid_plural ");
+      print_escaped (logfile, msgid2);
+      fprintf (logfile, "\nmsgstr[0] \"\"\n");
+    }
+  else
+    fprintf (logfile, "\nmsgstr \"\"\n");
+  putc ('\n', logfile);
+}
diff --git a/intl/ngettext.c b/intl/ngettext.c
new file mode 100644 (file)
index 0000000..a33529c
--- /dev/null
@@ -0,0 +1,65 @@
+/* Implementation of ngettext(3) function.
+   Copyright (C) 1995, 1997, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# include <stdlib.h>           /* Just for NULL.  */
+#endif
+
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+
+#include <locale.h>
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define NGETTEXT __ngettext
+# define DCNGETTEXT __dcngettext
+#else
+# define NGETTEXT libintl_ngettext
+# define DCNGETTEXT libintl_dcngettext
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+   LC_MESSAGES locale.  If not found, returns MSGID itself (the default
+   text).  */
+char *
+NGETTEXT (const char *msgid1, const char *msgid2, unsigned long int n)
+{
+  return DCNGETTEXT (NULL, msgid1, msgid2, n, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__ngettext, ngettext);
+#endif
diff --git a/intl/os2compat.c b/intl/os2compat.c
new file mode 100644 (file)
index 0000000..d041de2
--- /dev/null
@@ -0,0 +1,98 @@
+/* OS/2 compatibility functions.
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#define OS2_AWARE
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+
+/* A version of getenv() that works from DLLs */
+extern unsigned long DosScanEnv (const unsigned char *pszName, unsigned char **ppszValue);
+
+char *
+_nl_getenv (const char *name)
+{
+  unsigned char *value;
+  if (DosScanEnv (name, &value))
+    return NULL;
+  else
+    return value;
+}
+
+/* A fixed size buffer.  */
+char libintl_nl_default_dirname[MAXPATHLEN+1];
+
+char *_nlos2_libdir = NULL;
+char *_nlos2_localealiaspath = NULL;
+char *_nlos2_localedir = NULL;
+
+static __attribute__((constructor)) void
+nlos2_initialize ()
+{
+  char *root = getenv ("UNIXROOT");
+  char *gnulocaledir = getenv ("GNULOCALEDIR");
+
+  _nlos2_libdir = gnulocaledir;
+  if (!_nlos2_libdir)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_libdir = (char *) malloc (sl + strlen (LIBDIR) + 1);
+          memcpy (_nlos2_libdir, root, sl);
+          memcpy (_nlos2_libdir + sl, LIBDIR, strlen (LIBDIR) + 1);
+        }
+      else
+        _nlos2_libdir = LIBDIR;
+    }
+
+  _nlos2_localealiaspath = gnulocaledir;
+  if (!_nlos2_localealiaspath)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_localealiaspath = (char *) malloc (sl + strlen (LOCALE_ALIAS_PATH) + 1);
+          memcpy (_nlos2_localealiaspath, root, sl);
+          memcpy (_nlos2_localealiaspath + sl, LOCALE_ALIAS_PATH, strlen (LOCALE_ALIAS_PATH) + 1);
+        }
+     else
+        _nlos2_localealiaspath = LOCALE_ALIAS_PATH;
+    }
+
+  _nlos2_localedir = gnulocaledir;
+  if (!_nlos2_localedir)
+    {
+      if (root)
+        {
+          size_t sl = strlen (root);
+          _nlos2_localedir = (char *) malloc (sl + strlen (LOCALEDIR) + 1);
+          memcpy (_nlos2_localedir, root, sl);
+          memcpy (_nlos2_localedir + sl, LOCALEDIR, strlen (LOCALEDIR) + 1);
+        }
+      else
+        _nlos2_localedir = LOCALEDIR;
+    }
+
+  if (strlen (_nlos2_localedir) <= MAXPATHLEN)
+    strcpy (libintl_nl_default_dirname, _nlos2_localedir);
+}
diff --git a/intl/os2compat.h b/intl/os2compat.h
new file mode 100644 (file)
index 0000000..a18d582
--- /dev/null
@@ -0,0 +1,46 @@
+/* OS/2 compatibility defines.
+   This file is intended to be included from config.h
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* When included from os2compat.h we need all the original definitions */
+#ifndef OS2_AWARE
+
+#undef LIBDIR
+#define LIBDIR                 _nlos2_libdir
+extern char *_nlos2_libdir;
+
+#undef LOCALEDIR
+#define LOCALEDIR              _nlos2_localedir
+extern char *_nlos2_localedir;
+
+#undef LOCALE_ALIAS_PATH
+#define LOCALE_ALIAS_PATH      _nlos2_localealiaspath
+extern char *_nlos2_localealiaspath;
+
+#endif
+
+#undef HAVE_STRCASECMP
+#define HAVE_STRCASECMP 1
+#define strcasecmp stricmp
+#define strncasecmp strnicmp
+
+/* We have our own getenv() which works even if library is compiled as DLL */
+#define getenv _nl_getenv
+
+/* Older versions of gettext used -1 as the value of LC_MESSAGES */
+#define LC_MESSAGES_COMPAT (-1)
diff --git a/intl/osdep.c b/intl/osdep.c
new file mode 100644 (file)
index 0000000..d2d8575
--- /dev/null
@@ -0,0 +1,24 @@
+/* OS dependent parts of libintl.
+   Copyright (C) 2001-2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#if defined __EMX__
+# include "os2compat.c"
+#else
+/* Avoid AIX compiler warning.  */
+typedef int dummy;
+#endif
diff --git a/intl/plural-exp.c b/intl/plural-exp.c
new file mode 100644 (file)
index 0000000..1873be9
--- /dev/null
@@ -0,0 +1,154 @@
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "plural-exp.h"
+
+#if (defined __GNUC__ && !defined __APPLE_CC__) \
+    || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
+
+/* These structs are the constant expression for the germanic plural
+   form determination.  It represents the expression  "n != 1".  */
+static const struct expression plvar =
+{
+  .nargs = 0,
+  .operation = var,
+};
+static const struct expression plone =
+{
+  .nargs = 0,
+  .operation = num,
+  .val =
+  {
+    .num = 1
+  }
+};
+struct expression GERMANIC_PLURAL =
+{
+  .nargs = 2,
+  .operation = not_equal,
+  .val =
+  {
+    .args =
+    {
+      [0] = (struct expression *) &plvar,
+      [1] = (struct expression *) &plone
+    }
+  }
+};
+
+# define INIT_GERMANIC_PLURAL()
+
+#else
+
+/* For compilers without support for ISO C 99 struct/union initializers:
+   Initialization at run-time.  */
+
+static struct expression plvar;
+static struct expression plone;
+struct expression GERMANIC_PLURAL;
+
+static void
+init_germanic_plural ()
+{
+  if (plone.val.num == 0)
+    {
+      plvar.nargs = 0;
+      plvar.operation = var;
+
+      plone.nargs = 0;
+      plone.operation = num;
+      plone.val.num = 1;
+
+      GERMANIC_PLURAL.nargs = 2;
+      GERMANIC_PLURAL.operation = not_equal;
+      GERMANIC_PLURAL.val.args[0] = &plvar;
+      GERMANIC_PLURAL.val.args[1] = &plone;
+    }
+}
+
+# define INIT_GERMANIC_PLURAL() init_germanic_plural ()
+
+#endif
+
+void
+internal_function
+EXTRACT_PLURAL_EXPRESSION (const char *nullentry, struct expression **pluralp,
+                          unsigned long int *npluralsp)
+{
+  if (nullentry != NULL)
+    {
+      const char *plural;
+      const char *nplurals;
+
+      plural = strstr (nullentry, "plural=");
+      nplurals = strstr (nullentry, "nplurals=");
+      if (plural == NULL || nplurals == NULL)
+       goto no_plural;
+      else
+       {
+         char *endp;
+         unsigned long int n;
+         struct parse_args args;
+
+         /* First get the number.  */
+         nplurals += 9;
+         while (*nplurals != '\0' && isspace ((unsigned char) *nplurals))
+           ++nplurals;
+         if (!(*nplurals >= '0' && *nplurals <= '9'))
+           goto no_plural;
+#if defined HAVE_STRTOUL || defined _LIBC
+         n = strtoul (nplurals, &endp, 10);
+#else
+         for (endp = nplurals, n = 0; *endp >= '0' && *endp <= '9'; endp++)
+           n = n * 10 + (*endp - '0');
+#endif
+         if (nplurals == endp)
+           goto no_plural;
+         *npluralsp = n;
+
+         /* Due to the restrictions bison imposes onto the interface of the
+            scanner function we have to put the input string and the result
+            passed up from the parser into the same structure which address
+            is passed down to the parser.  */
+         plural += 7;
+         args.cp = plural;
+         if (PLURAL_PARSE (&args) != 0)
+           goto no_plural;
+         *pluralp = args.res;
+       }
+    }
+  else
+    {
+      /* By default we are using the Germanic form: singular form only
+         for `one', the plural form otherwise.  Yes, this is also what
+         English is using since English is a Germanic language.  */
+    no_plural:
+      INIT_GERMANIC_PLURAL ();
+      *pluralp = &GERMANIC_PLURAL;
+      *npluralsp = 2;
+    }
+}
diff --git a/intl/plural-exp.h b/intl/plural-exp.h
new file mode 100644 (file)
index 0000000..f540184
--- /dev/null
@@ -0,0 +1,118 @@
+/* Expression parsing and evaluation for plural form selection.
+   Copyright (C) 2000-2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _PLURAL_EXP_H
+#define _PLURAL_EXP_H
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef attribute_hidden
+# define attribute_hidden
+#endif
+
+
+/* This is the representation of the expressions to determine the
+   plural form.  */
+struct expression
+{
+  int nargs;                   /* Number of arguments.  */
+  enum operator
+  {
+    /* Without arguments:  */
+    var,                       /* The variable "n".  */
+    num,                       /* Decimal number.  */
+    /* Unary operators:  */
+    lnot,                      /* Logical NOT.  */
+    /* Binary operators:  */
+    mult,                      /* Multiplication.  */
+    divide,                    /* Division.  */
+    module,                    /* Modulo operation.  */
+    plus,                      /* Addition.  */
+    minus,                     /* Subtraction.  */
+    less_than,                 /* Comparison.  */
+    greater_than,              /* Comparison.  */
+    less_or_equal,             /* Comparison.  */
+    greater_or_equal,          /* Comparison.  */
+    equal,                     /* Comparison for equality.  */
+    not_equal,                 /* Comparison for inequality.  */
+    land,                      /* Logical AND.  */
+    lor,                       /* Logical OR.  */
+    /* Ternary operators:  */
+    qmop                       /* Question mark operator.  */
+  } operation;
+  union
+  {
+    unsigned long int num;     /* Number value for `num'.  */
+    struct expression *args[3];        /* Up to three arguments.  */
+  } val;
+};
+
+/* This is the data structure to pass information to the parser and get
+   the result in a thread-safe way.  */
+struct parse_args
+{
+  const char *cp;
+  struct expression *res;
+};
+
+
+/* Names for the libintl functions are a problem.  This source code is used
+   1. in the GNU C Library library,
+   2. in the GNU libintl library,
+   3. in the GNU gettext tools.
+   The function names in each situation must be different, to allow for
+   binary incompatible changes in 'struct expression'.  Furthermore,
+   1. in the GNU C Library library, the names have a __ prefix,
+   2.+3. in the GNU libintl library and in the GNU gettext tools, the names
+         must follow ANSI C and not start with __.
+   So we have to distinguish the three cases.  */
+#ifdef _LIBC
+# define FREE_EXPRESSION __gettext_free_exp
+# define PLURAL_PARSE __gettextparse
+# define GERMANIC_PLURAL __gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
+#elif defined (IN_LIBINTL)
+# define FREE_EXPRESSION libintl_gettext_free_exp
+# define PLURAL_PARSE libintl_gettextparse
+# define GERMANIC_PLURAL libintl_gettext_germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
+#else
+# define FREE_EXPRESSION free_plural_expression
+# define PLURAL_PARSE parse_plural_expression
+# define GERMANIC_PLURAL germanic_plural
+# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
+#endif
+
+extern void FREE_EXPRESSION (struct expression *exp)
+     internal_function;
+extern int PLURAL_PARSE (void *arg);
+extern struct expression GERMANIC_PLURAL attribute_hidden;
+extern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
+                                      struct expression **pluralp,
+                                      unsigned long int *npluralsp)
+     internal_function;
+
+#if !defined (_LIBC) && !defined (IN_LIBINTL)
+extern unsigned long int plural_eval (struct expression *pexp,
+                                     unsigned long int n);
+#endif
+
+#endif /* _PLURAL_EXP_H */
diff --git a/intl/plural.c b/intl/plural.c
new file mode 100644 (file)
index 0000000..c73008b
--- /dev/null
@@ -0,0 +1,1490 @@
+/* A Bison parser, made from plural.y
+   by GNU bison 1.35.  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse __gettextparse
+#define yylex __gettextlex
+#define yyerror __gettexterror
+#define yylval __gettextlval
+#define yychar __gettextchar
+#define yydebug __gettextdebug
+#define yynerrs __gettextnerrs
+# define       EQUOP2  257
+# define       CMPOP2  258
+# define       ADDOP2  259
+# define       MULOP2  260
+# define       NUMBER  261
+
+#line 1 "plural.y"
+
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* The bison generated parser uses alloca.  AIX 3 forces us to put this
+   declaration at the beginning of the file.  The declaration in bison's
+   skeleton file comes too late.  This must come before <config.h>
+   because <config.h> may include arbitrary system headers.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+   but we want it to be called PLURAL_PARSE.  */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM    &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM  arg
+
+#line 49 "plural.y"
+#ifndef YYSTYPE
+typedef union {
+  unsigned long int num;
+  enum operator op;
+  struct expression *exp;
+} yystype;
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+#line 55 "plural.y"
+
+/* Prototypes for local functions.  */
+static int yylex (YYSTYPE *lval, const char **pexp);
+static void yyerror (const char *str);
+
+/* Allocation of expressions.  */
+
+static struct expression *
+new_exp (int nargs, enum operator op, struct expression * const *args)
+{
+  int i;
+  struct expression *newp;
+
+  /* If any of the argument could not be malloc'ed, just return NULL.  */
+  for (i = nargs - 1; i >= 0; i--)
+    if (args[i] == NULL)
+      goto fail;
+
+  /* Allocate a new expression.  */
+  newp = (struct expression *) malloc (sizeof (*newp));
+  if (newp != NULL)
+    {
+      newp->nargs = nargs;
+      newp->operation = op;
+      for (i = nargs - 1; i >= 0; i--)
+       newp->val.args[i] = args[i];
+      return newp;
+    }
+
+ fail:
+  for (i = nargs - 1; i >= 0; i--)
+    FREE_EXPRESSION (args[i]);
+
+  return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (enum operator op)
+{
+  return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (enum operator op, struct expression *right)
+{
+  struct expression *args[1];
+
+  args[0] = right;
+  return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (enum operator op, struct expression *left, struct expression *right)
+{
+  struct expression *args[2];
+
+  args[0] = left;
+  args[1] = right;
+  return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (enum operator op, struct expression *bexp,
+          struct expression *tbranch, struct expression *fbranch)
+{
+  struct expression *args[3];
+
+  args[0] = bexp;
+  args[1] = tbranch;
+  args[2] = fbranch;
+  return new_exp (3, op, args);
+}
+
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define        YYFINAL         27
+#define        YYFLAG          -32768
+#define        YYNTBASE        16
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    10,     2,     2,     2,     2,     5,     2,
+      14,    15,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    12,     2,
+       2,     2,     2,     3,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      13,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     4,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     6,     7,     8,
+       9,    11
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+       0,     0,     2,     8,    12,    16,    20,    24,    28,    32,
+      35,    37,    39
+};
+static const short yyrhs[] =
+{
+      17,     0,    17,     3,    17,    12,    17,     0,    17,     4,
+      17,     0,    17,     5,    17,     0,    17,     6,    17,     0,
+      17,     7,    17,     0,    17,     8,    17,     0,    17,     9,
+      17,     0,    10,    17,     0,    13,     0,    11,     0,    14,
+      17,    15,     0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+       0,   150,   158,   162,   166,   170,   174,   178,   182,   186,
+     190,   194,   199
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+  "$", "error", "$undefined.", "'?'", "'|'", "'&'", "EQUOP2", "CMPOP2", 
+  "ADDOP2", "MULOP2", "'!'", "NUMBER", "':'", "'n'", "'('", "')'", 
+  "start", "exp", 0
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+       0,    16,    17,    17,    17,    17,    17,    17,    17,    17,
+      17,    17,    17
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+       0,     1,     5,     3,     3,     3,     3,     3,     3,     2,
+       1,     1,     3
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+   doesn't specify something else to do.  Zero means the default is an
+   error. */
+static const short yydefact[] =
+{
+       0,     0,    11,    10,     0,     1,     9,     0,     0,     0,
+       0,     0,     0,     0,     0,    12,     0,     3,     4,     5,
+       6,     7,     8,     0,     2,     0,     0,     0
+};
+
+static const short yydefgoto[] =
+{
+      25,     5
+};
+
+static const short yypact[] =
+{
+      -9,    -9,-32768,-32768,    -9,    34,-32768,    11,    -9,    -9,
+      -9,    -9,    -9,    -9,    -9,-32768,    24,    39,    43,    16,
+      26,    -3,-32768,    -9,    34,    21,    53,-32768
+};
+
+static const short yypgoto[] =
+{
+  -32768,    -1
+};
+
+
+#define        YYLAST          53
+
+
+static const short yytable[] =
+{
+       6,     1,     2,     7,     3,     4,    14,    16,    17,    18,
+      19,    20,    21,    22,     8,     9,    10,    11,    12,    13,
+      14,    26,    24,    12,    13,    14,    15,     8,     9,    10,
+      11,    12,    13,    14,    13,    14,    23,     8,     9,    10,
+      11,    12,    13,    14,    10,    11,    12,    13,    14,    11,
+      12,    13,    14,    27
+};
+
+static const short yycheck[] =
+{
+       1,    10,    11,     4,    13,    14,     9,     8,     9,    10,
+      11,    12,    13,    14,     3,     4,     5,     6,     7,     8,
+       9,     0,    23,     7,     8,     9,    15,     3,     4,     5,
+       6,     7,     8,     9,     8,     9,    12,     3,     4,     5,
+       6,     7,     8,     9,     5,     6,     7,     8,     9,     6,
+       7,     8,     9,     0
+};
+#define YYPURE 1
+
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/local/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software
+   Foundation, Inc.
+
+   This program 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 2, or (at your option)
+   any later version.
+
+   This program 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, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser when
+   the %semantic_parser declaration is not specified in the grammar.
+   It was written by Richard Stallman by simplifying the hairy parser
+   used when %semantic_parser is specified.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+# if YYLSP_NEEDED
+  YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# if YYLSP_NEEDED
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
+      + 2 * YYSTACK_GAP_MAX)
+# else
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+# endif
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT        goto yyabortlab
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).
+
+   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+   first token.  By default, to implement support for ranges, extend
+   its range to the last symbol.  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \
+   Current.last_line   = Rhs[N].last_line;     \
+   Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#if YYPURE
+# if YYLSP_NEEDED
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval, &yylloc)
+#  endif
+# else /* !YYLSP_NEEDED */
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval)
+#  endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX                 yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+\f
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+#endif
+\f
+#line 315 "/usr/local/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+   variables are global, or local to YYPARSE.  */
+
+#define YY_DECL_NON_LSP_VARIABLES                      \
+/* The lookahead symbol.  */                           \
+int yychar;                                            \
+                                                       \
+/* The semantic value of the lookahead symbol. */      \
+YYSTYPE yylval;                                                \
+                                                       \
+/* Number of parse errors so far.  */                  \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES                      \
+                                               \
+/* Location data for the lookahead symbol.  */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  /* If reentrant, generate the variables here. */
+#if YYPURE
+  YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack. */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+  /* The location stack.  */
+  YYLTYPE yylsa[YYINITDEPTH];
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+#if YYLSP_NEEDED
+  YYLTYPE yyloc;
+#endif
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule. */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+#if YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  */
+# if YYLSP_NEEDED
+       YYLTYPE *yyls1 = yyls;
+       /* This used to be a conditional around just the two extra args,
+          but that might be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yyls1, yysize * sizeof (*yylsp),
+                   &yystacksize);
+       yyls = yyls1;
+# else
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yystacksize);
+# endif
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+# if YYLSP_NEEDED
+       YYSTACK_RELOCATE (yyls);
+# endif
+# undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+      yylsp = yyls + yysize - 1;
+#endif
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+     /* We have to keep this `#if YYDEBUG', since we use variables
+       which are defined only if `YYDEBUG' is set.  */
+      if (yydebug)
+       {
+         YYFPRINTF (stderr, "Next token is %d (%s",
+                    yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise
+            meaning of a token, for further debugging info.  */
+# ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+# endif
+         YYFPRINTF (stderr, ")\n");
+       }
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to the semantic value of
+     the lookahead token.  This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+  /* Similarly for the default location.  Let the user run additional
+     commands if for instance locations are ranges.  */
+  yyloc = yylsp[1-yylen];
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+  switch (yyn) {
+
+case 1:
+#line 151 "plural.y"
+{
+           if (yyvsp[0].exp == NULL)
+             YYABORT;
+           ((struct parse_args *) arg)->res = yyvsp[0].exp;
+         }
+    break;
+case 2:
+#line 159 "plural.y"
+{
+           yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 3:
+#line 163 "plural.y"
+{
+           yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 4:
+#line 167 "plural.y"
+{
+           yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 5:
+#line 171 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 6:
+#line 175 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 7:
+#line 179 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 8:
+#line 183 "plural.y"
+{
+           yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
+         }
+    break;
+case 9:
+#line 187 "plural.y"
+{
+           yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
+         }
+    break;
+case 10:
+#line 191 "plural.y"
+{
+           yyval.exp = new_exp_0 (var);
+         }
+    break;
+case 11:
+#line 195 "plural.y"
+{
+           if ((yyval.exp = new_exp_0 (num)) != NULL)
+             yyval.exp->val.num = yyvsp[0].num;
+         }
+    break;
+case 12:
+#line 200 "plural.y"
+{
+           yyval.exp = yyvsp[-1].exp;
+         }
+    break;
+}
+
+#line 705 "/usr/local/share/bison/bison.simple"
+
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#if YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+#if YYLSP_NEEDED
+  *++yylsp = yyloc;
+#endif
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* defined (YYERROR_VERBOSE) */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token.                                                       |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+
+  /* If its default is to accept any token, ok.  Otherwise pop it.  */
+  yyn = yydefact[yystate];
+  if (yyn)
+    goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token                                                    |
+`---------------------------------------------------------------*/
+yyerrpop:
+  if (yyssp == yyss)
+    YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#if YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "Error: state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+/*--------------.
+| yyerrhandle.  |
+`--------------*/
+yyerrhandle:
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here.  |
+`---------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+#line 205 "plural.y"
+
+
+void
+internal_function
+FREE_EXPRESSION (struct expression *exp)
+{
+  if (exp == NULL)
+    return;
+
+  /* Handle the recursive case.  */
+  switch (exp->nargs)
+    {
+    case 3:
+      FREE_EXPRESSION (exp->val.args[2]);
+      /* FALLTHROUGH */
+    case 2:
+      FREE_EXPRESSION (exp->val.args[1]);
+      /* FALLTHROUGH */
+    case 1:
+      FREE_EXPRESSION (exp->val.args[0]);
+      /* FALLTHROUGH */
+    default:
+      break;
+    }
+
+  free (exp);
+}
+
+
+static int
+yylex (YYSTYPE *lval, const char **pexp)
+{
+  const char *exp = *pexp;
+  int result;
+
+  while (1)
+    {
+      if (exp[0] == '\0')
+       {
+         *pexp = exp;
+         return YYEOF;
+       }
+
+      if (exp[0] != ' ' && exp[0] != '\t')
+       break;
+
+      ++exp;
+    }
+
+  result = *exp++;
+  switch (result)
+    {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+       unsigned long int n = result - '0';
+       while (exp[0] >= '0' && exp[0] <= '9')
+         {
+           n *= 10;
+           n += exp[0] - '0';
+           ++exp;
+         }
+       lval->num = n;
+       result = NUMBER;
+      }
+      break;
+
+    case '=':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = equal;
+         result = EQUOP2;
+       }
+      else
+       result = YYERRCODE;
+      break;
+
+    case '!':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = not_equal;
+         result = EQUOP2;
+       }
+      break;
+
+    case '&':
+    case '|':
+      if (exp[0] == result)
+       ++exp;
+      else
+       result = YYERRCODE;
+      break;
+
+    case '<':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = less_or_equal;
+       }
+      else
+       lval->op = less_than;
+      result = CMPOP2;
+      break;
+
+    case '>':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = greater_or_equal;
+       }
+      else
+       lval->op = greater_than;
+      result = CMPOP2;
+      break;
+
+    case '*':
+      lval->op = mult;
+      result = MULOP2;
+      break;
+
+    case '/':
+      lval->op = divide;
+      result = MULOP2;
+      break;
+
+    case '%':
+      lval->op = module;
+      result = MULOP2;
+      break;
+
+    case '+':
+      lval->op = plus;
+      result = ADDOP2;
+      break;
+
+    case '-':
+      lval->op = minus;
+      result = ADDOP2;
+      break;
+
+    case 'n':
+    case '?':
+    case ':':
+    case '(':
+    case ')':
+      /* Nothing, just return the character.  */
+      break;
+
+    case ';':
+    case '\n':
+    case '\0':
+      /* Be safe and let the user call this function again.  */
+      --exp;
+      result = YYEOF;
+      break;
+
+    default:
+      result = YYERRCODE;
+#if YYDEBUG != 0
+      --exp;
+#endif
+      break;
+    }
+
+  *pexp = exp;
+
+  return result;
+}
+
+
+static void
+yyerror (const char *str)
+{
+  /* Do nothing.  We don't print error messages here.  */
+}
diff --git a/intl/plural.y b/intl/plural.y
new file mode 100644 (file)
index 0000000..fe79112
--- /dev/null
@@ -0,0 +1,381 @@
+%{
+/* Expression parsing for plural form selection.
+   Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
+   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* The bison generated parser uses alloca.  AIX 3 forces us to put this
+   declaration at the beginning of the file.  The declaration in bison's
+   skeleton file comes too late.  This must come before <config.h>
+   because <config.h> may include arbitrary system headers.  */
+#if defined _AIX && !defined __GNUC__
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "plural-exp.h"
+
+/* The main function generated by the parser is called __gettextparse,
+   but we want it to be called PLURAL_PARSE.  */
+#ifndef _LIBC
+# define __gettextparse PLURAL_PARSE
+#endif
+
+#define YYLEX_PARAM    &((struct parse_args *) arg)->cp
+#define YYPARSE_PARAM  arg
+%}
+%pure_parser
+%expect 7
+
+%union {
+  unsigned long int num;
+  enum operator op;
+  struct expression *exp;
+}
+
+%{
+/* Prototypes for local functions.  */
+static int yylex (YYSTYPE *lval, const char **pexp);
+static void yyerror (const char *str);
+
+/* Allocation of expressions.  */
+
+static struct expression *
+new_exp (int nargs, enum operator op, struct expression * const *args)
+{
+  int i;
+  struct expression *newp;
+
+  /* If any of the argument could not be malloc'ed, just return NULL.  */
+  for (i = nargs - 1; i >= 0; i--)
+    if (args[i] == NULL)
+      goto fail;
+
+  /* Allocate a new expression.  */
+  newp = (struct expression *) malloc (sizeof (*newp));
+  if (newp != NULL)
+    {
+      newp->nargs = nargs;
+      newp->operation = op;
+      for (i = nargs - 1; i >= 0; i--)
+       newp->val.args[i] = args[i];
+      return newp;
+    }
+
+ fail:
+  for (i = nargs - 1; i >= 0; i--)
+    FREE_EXPRESSION (args[i]);
+
+  return NULL;
+}
+
+static inline struct expression *
+new_exp_0 (enum operator op)
+{
+  return new_exp (0, op, NULL);
+}
+
+static inline struct expression *
+new_exp_1 (enum operator op, struct expression *right)
+{
+  struct expression *args[1];
+
+  args[0] = right;
+  return new_exp (1, op, args);
+}
+
+static struct expression *
+new_exp_2 (enum operator op, struct expression *left, struct expression *right)
+{
+  struct expression *args[2];
+
+  args[0] = left;
+  args[1] = right;
+  return new_exp (2, op, args);
+}
+
+static inline struct expression *
+new_exp_3 (enum operator op, struct expression *bexp,
+          struct expression *tbranch, struct expression *fbranch)
+{
+  struct expression *args[3];
+
+  args[0] = bexp;
+  args[1] = tbranch;
+  args[2] = fbranch;
+  return new_exp (3, op, args);
+}
+
+%}
+
+/* This declares that all operators have the same associativity and the
+   precedence order as in C.  See [Harbison, Steele: C, A Reference Manual].
+   There is no unary minus and no bitwise operators.
+   Operators with the same syntactic behaviour have been merged into a single
+   token, to save space in the array generated by bison.  */
+%right '?'             /*   ?          */
+%left '|'              /*   ||         */
+%left '&'              /*   &&         */
+%left EQUOP2           /*   == !=      */
+%left CMPOP2           /*   < > <= >=  */
+%left ADDOP2           /*   + -        */
+%left MULOP2           /*   * / %      */
+%right '!'             /*   !          */
+
+%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
+%token <num> NUMBER
+%type <exp> exp
+
+%%
+
+start:   exp
+         {
+           if ($1 == NULL)
+             YYABORT;
+           ((struct parse_args *) arg)->res = $1;
+         }
+       ;
+
+exp:     exp '?' exp ':' exp
+         {
+           $$ = new_exp_3 (qmop, $1, $3, $5);
+         }
+       | exp '|' exp
+         {
+           $$ = new_exp_2 (lor, $1, $3);
+         }
+       | exp '&' exp
+         {
+           $$ = new_exp_2 (land, $1, $3);
+         }
+       | exp EQUOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | exp CMPOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | exp ADDOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | exp MULOP2 exp
+         {
+           $$ = new_exp_2 ($2, $1, $3);
+         }
+       | '!' exp
+         {
+           $$ = new_exp_1 (lnot, $2);
+         }
+       | 'n'
+         {
+           $$ = new_exp_0 (var);
+         }
+       | NUMBER
+         {
+           if (($$ = new_exp_0 (num)) != NULL)
+             $$->val.num = $1;
+         }
+       | '(' exp ')'
+         {
+           $$ = $2;
+         }
+       ;
+
+%%
+
+void
+internal_function
+FREE_EXPRESSION (struct expression *exp)
+{
+  if (exp == NULL)
+    return;
+
+  /* Handle the recursive case.  */
+  switch (exp->nargs)
+    {
+    case 3:
+      FREE_EXPRESSION (exp->val.args[2]);
+      /* FALLTHROUGH */
+    case 2:
+      FREE_EXPRESSION (exp->val.args[1]);
+      /* FALLTHROUGH */
+    case 1:
+      FREE_EXPRESSION (exp->val.args[0]);
+      /* FALLTHROUGH */
+    default:
+      break;
+    }
+
+  free (exp);
+}
+
+
+static int
+yylex (YYSTYPE *lval, const char **pexp)
+{
+  const char *exp = *pexp;
+  int result;
+
+  while (1)
+    {
+      if (exp[0] == '\0')
+       {
+         *pexp = exp;
+         return YYEOF;
+       }
+
+      if (exp[0] != ' ' && exp[0] != '\t')
+       break;
+
+      ++exp;
+    }
+
+  result = *exp++;
+  switch (result)
+    {
+    case '0': case '1': case '2': case '3': case '4':
+    case '5': case '6': case '7': case '8': case '9':
+      {
+       unsigned long int n = result - '0';
+       while (exp[0] >= '0' && exp[0] <= '9')
+         {
+           n *= 10;
+           n += exp[0] - '0';
+           ++exp;
+         }
+       lval->num = n;
+       result = NUMBER;
+      }
+      break;
+
+    case '=':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = equal;
+         result = EQUOP2;
+       }
+      else
+       result = YYERRCODE;
+      break;
+
+    case '!':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = not_equal;
+         result = EQUOP2;
+       }
+      break;
+
+    case '&':
+    case '|':
+      if (exp[0] == result)
+       ++exp;
+      else
+       result = YYERRCODE;
+      break;
+
+    case '<':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = less_or_equal;
+       }
+      else
+       lval->op = less_than;
+      result = CMPOP2;
+      break;
+
+    case '>':
+      if (exp[0] == '=')
+       {
+         ++exp;
+         lval->op = greater_or_equal;
+       }
+      else
+       lval->op = greater_than;
+      result = CMPOP2;
+      break;
+
+    case '*':
+      lval->op = mult;
+      result = MULOP2;
+      break;
+
+    case '/':
+      lval->op = divide;
+      result = MULOP2;
+      break;
+
+    case '%':
+      lval->op = module;
+      result = MULOP2;
+      break;
+
+    case '+':
+      lval->op = plus;
+      result = ADDOP2;
+      break;
+
+    case '-':
+      lval->op = minus;
+      result = ADDOP2;
+      break;
+
+    case 'n':
+    case '?':
+    case ':':
+    case '(':
+    case ')':
+      /* Nothing, just return the character.  */
+      break;
+
+    case ';':
+    case '\n':
+    case '\0':
+      /* Be safe and let the user call this function again.  */
+      --exp;
+      result = YYEOF;
+      break;
+
+    default:
+      result = YYERRCODE;
+#if YYDEBUG != 0
+      --exp;
+#endif
+      break;
+    }
+
+  *pexp = exp;
+
+  return result;
+}
+
+
+static void
+yyerror (const char *str)
+{
+  /* Do nothing.  We don't print error messages here.  */
+}
diff --git a/intl/printf-args.c b/intl/printf-args.c
new file mode 100644 (file)
index 0000000..f975901
--- /dev/null
@@ -0,0 +1,119 @@
+/* Decomposed printf argument list.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  */
+#include "printf-args.h"
+
+#ifdef STATIC
+STATIC
+#endif
+int
+printf_fetchargs (va_list args, arguments *a)
+{
+  size_t i;
+  argument *ap;
+
+  for (i = 0, ap = &a->arg[0]; i < a->count; i++, ap++)
+    switch (ap->type)
+      {
+      case TYPE_SCHAR:
+       ap->a.a_schar = va_arg (args, /*signed char*/ int);
+       break;
+      case TYPE_UCHAR:
+       ap->a.a_uchar = va_arg (args, /*unsigned char*/ int);
+       break;
+      case TYPE_SHORT:
+       ap->a.a_short = va_arg (args, /*short*/ int);
+       break;
+      case TYPE_USHORT:
+       ap->a.a_ushort = va_arg (args, /*unsigned short*/ int);
+       break;
+      case TYPE_INT:
+       ap->a.a_int = va_arg (args, int);
+       break;
+      case TYPE_UINT:
+       ap->a.a_uint = va_arg (args, unsigned int);
+       break;
+      case TYPE_LONGINT:
+       ap->a.a_longint = va_arg (args, long int);
+       break;
+      case TYPE_ULONGINT:
+       ap->a.a_ulongint = va_arg (args, unsigned long int);
+       break;
+#ifdef HAVE_LONG_LONG
+      case TYPE_LONGLONGINT:
+       ap->a.a_longlongint = va_arg (args, long long int);
+       break;
+      case TYPE_ULONGLONGINT:
+       ap->a.a_ulonglongint = va_arg (args, unsigned long long int);
+       break;
+#endif
+      case TYPE_DOUBLE:
+       ap->a.a_double = va_arg (args, double);
+       break;
+#ifdef HAVE_LONG_DOUBLE
+      case TYPE_LONGDOUBLE:
+       ap->a.a_longdouble = va_arg (args, long double);
+       break;
+#endif
+      case TYPE_CHAR:
+       ap->a.a_char = va_arg (args, int);
+       break;
+#ifdef HAVE_WINT_T
+      case TYPE_WIDE_CHAR:
+       ap->a.a_wide_char = va_arg (args, wint_t);
+       break;
+#endif
+      case TYPE_STRING:
+       ap->a.a_string = va_arg (args, const char *);
+       break;
+#ifdef HAVE_WCHAR_T
+      case TYPE_WIDE_STRING:
+       ap->a.a_wide_string = va_arg (args, const wchar_t *);
+       break;
+#endif
+      case TYPE_POINTER:
+       ap->a.a_pointer = va_arg (args, void *);
+       break;
+      case TYPE_COUNT_SCHAR_POINTER:
+       ap->a.a_count_schar_pointer = va_arg (args, signed char *);
+       break;
+      case TYPE_COUNT_SHORT_POINTER:
+       ap->a.a_count_short_pointer = va_arg (args, short *);
+       break;
+      case TYPE_COUNT_INT_POINTER:
+       ap->a.a_count_int_pointer = va_arg (args, int *);
+       break;
+      case TYPE_COUNT_LONGINT_POINTER:
+       ap->a.a_count_longint_pointer = va_arg (args, long int *);
+       break;
+#ifdef HAVE_LONG_LONG
+      case TYPE_COUNT_LONGLONGINT_POINTER:
+       ap->a.a_count_longlongint_pointer = va_arg (args, long long int *);
+       break;
+#endif
+      default:
+       /* Unknown type.  */
+       return -1;
+      }
+  return 0;
+}
diff --git a/intl/printf-args.h b/intl/printf-args.h
new file mode 100644 (file)
index 0000000..625b803
--- /dev/null
@@ -0,0 +1,137 @@
+/* Decomposed printf argument list.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _PRINTF_ARGS_H
+#define _PRINTF_ARGS_H
+
+/* Get size_t.  */
+#include <stddef.h>
+
+/* Get wchar_t.  */
+#ifdef HAVE_WCHAR_T
+# include <stddef.h>
+#endif
+
+/* Get wint_t.  */
+#ifdef HAVE_WINT_T
+# include <wchar.h>
+#endif
+
+/* Get va_list.  */
+#include <stdarg.h>
+
+
+/* Argument types */
+typedef enum
+{
+  TYPE_NONE,
+  TYPE_SCHAR,
+  TYPE_UCHAR,
+  TYPE_SHORT,
+  TYPE_USHORT,
+  TYPE_INT,
+  TYPE_UINT,
+  TYPE_LONGINT,
+  TYPE_ULONGINT,
+#ifdef HAVE_LONG_LONG
+  TYPE_LONGLONGINT,
+  TYPE_ULONGLONGINT,
+#endif
+  TYPE_DOUBLE,
+#ifdef HAVE_LONG_DOUBLE
+  TYPE_LONGDOUBLE,
+#endif
+  TYPE_CHAR,
+#ifdef HAVE_WINT_T
+  TYPE_WIDE_CHAR,
+#endif
+  TYPE_STRING,
+#ifdef HAVE_WCHAR_T
+  TYPE_WIDE_STRING,
+#endif
+  TYPE_POINTER,
+  TYPE_COUNT_SCHAR_POINTER,
+  TYPE_COUNT_SHORT_POINTER,
+  TYPE_COUNT_INT_POINTER,
+  TYPE_COUNT_LONGINT_POINTER
+#ifdef HAVE_LONG_LONG
+, TYPE_COUNT_LONGLONGINT_POINTER
+#endif
+} arg_type;
+
+/* Polymorphic argument */
+typedef struct
+{
+  arg_type type;
+  union
+  {
+    signed char                        a_schar;
+    unsigned char              a_uchar;
+    short                      a_short;
+    unsigned short             a_ushort;
+    int                                a_int;
+    unsigned int               a_uint;
+    long int                   a_longint;
+    unsigned long int          a_ulongint;
+#ifdef HAVE_LONG_LONG
+    long long int              a_longlongint;
+    unsigned long long int     a_ulonglongint;
+#endif
+    float                      a_float;
+    double                     a_double;
+#ifdef HAVE_LONG_DOUBLE
+    long double                        a_longdouble;
+#endif
+    int                                a_char;
+#ifdef HAVE_WINT_T
+    wint_t                     a_wide_char;
+#endif
+    const char*                        a_string;
+#ifdef HAVE_WCHAR_T
+    const wchar_t*             a_wide_string;
+#endif
+    void*                      a_pointer;
+    signed char *              a_count_schar_pointer;
+    short *                    a_count_short_pointer;
+    int *                      a_count_int_pointer;
+    long int *                 a_count_longint_pointer;
+#ifdef HAVE_LONG_LONG
+    long long int *            a_count_longlongint_pointer;
+#endif
+  }
+  a;
+}
+argument;
+
+typedef struct
+{
+  size_t count;
+  argument *arg;
+}
+arguments;
+
+
+/* Fetch the arguments, putting them into a. */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_fetchargs (va_list args, arguments *a);
+
+#endif /* _PRINTF_ARGS_H */
diff --git a/intl/printf-parse.c b/intl/printf-parse.c
new file mode 100644 (file)
index 0000000..20240e3
--- /dev/null
@@ -0,0 +1,537 @@
+/* Formatted output to strings.
+   Copyright (C) 1999-2000, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification.  */
+#if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+#else
+# include "printf-parse.h"
+#endif
+
+/* Get size_t, NULL.  */
+#include <stddef.h>
+
+/* Get intmax_t.  */
+#if HAVE_STDINT_H_WITH_UINTMAX
+# include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+# include <inttypes.h>
+#endif
+
+/* malloc(), realloc(), free().  */
+#include <stdlib.h>
+
+/* Checked size_t computations.  */
+#include "xsize.h"
+
+#if WIDE_CHAR_VERSION
+# define PRINTF_PARSE wprintf_parse
+# define CHAR_T wchar_t
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+#else
+# define PRINTF_PARSE printf_parse
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+#endif
+
+#ifdef STATIC
+STATIC
+#endif
+int
+PRINTF_PARSE (const CHAR_T *format, DIRECTIVES *d, arguments *a)
+{
+  const CHAR_T *cp = format;           /* pointer into format */
+  size_t arg_posn = 0;         /* number of regular arguments consumed */
+  size_t d_allocated;                  /* allocated elements of d->dir */
+  size_t a_allocated;                  /* allocated elements of a->arg */
+  size_t max_width_length = 0;
+  size_t max_precision_length = 0;
+
+  d->count = 0;
+  d_allocated = 1;
+  d->dir = malloc (d_allocated * sizeof (DIRECTIVE));
+  if (d->dir == NULL)
+    /* Out of memory.  */
+    return -1;
+
+  a->count = 0;
+  a_allocated = 0;
+  a->arg = NULL;
+
+#define REGISTER_ARG(_index_,_type_) \
+  {                                                                    \
+    size_t n = (_index_);                                              \
+    if (n >= a_allocated)                                              \
+      {                                                                        \
+       size_t memory_size;                                             \
+       argument *memory;                                               \
+                                                                       \
+       a_allocated = xtimes (a_allocated, 2);                          \
+       if (a_allocated <= n)                                           \
+         a_allocated = xsum (n, 1);                                    \
+       memory_size = xtimes (a_allocated, sizeof (argument));          \
+       if (size_overflow_p (memory_size))                              \
+         /* Overflow, would lead to out of memory.  */                 \
+         goto error;                                                   \
+       memory = (a->arg                                                \
+                 ? realloc (a->arg, memory_size)                       \
+                 : malloc (memory_size));                              \
+       if (memory == NULL)                                             \
+         /* Out of memory.  */                                         \
+         goto error;                                                   \
+       a->arg = memory;                                                \
+      }                                                                        \
+    while (a->count <= n)                                              \
+      a->arg[a->count++].type = TYPE_NONE;                             \
+    if (a->arg[n].type == TYPE_NONE)                                   \
+      a->arg[n].type = (_type_);                                       \
+    else if (a->arg[n].type != (_type_))                               \
+      /* Ambiguous type for positional argument.  */                   \
+      goto error;                                                      \
+  }
+
+  while (*cp != '\0')
+    {
+      CHAR_T c = *cp++;
+      if (c == '%')
+       {
+         size_t arg_index = ARG_NONE;
+         DIRECTIVE *dp = &d->dir[d->count];/* pointer to next directive */
+
+         /* Initialize the next directive.  */
+         dp->dir_start = cp - 1;
+         dp->flags = 0;
+         dp->width_start = NULL;
+         dp->width_end = NULL;
+         dp->width_arg_index = ARG_NONE;
+         dp->precision_start = NULL;
+         dp->precision_end = NULL;
+         dp->precision_arg_index = ARG_NONE;
+         dp->arg_index = ARG_NONE;
+
+         /* Test for positional argument.  */
+         if (*cp >= '0' && *cp <= '9')
+           {
+             const CHAR_T *np;
+
+             for (np = cp; *np >= '0' && *np <= '9'; np++)
+               ;
+             if (*np == '$')
+               {
+                 size_t n = 0;
+
+                 for (np = cp; *np >= '0' && *np <= '9'; np++)
+                   n = xsum (xtimes (n, 10), *np - '0');
+                 if (n == 0)
+                   /* Positional argument 0.  */
+                   goto error;
+                 if (size_overflow_p (n))
+                   /* n too large, would lead to out of memory later.  */
+                   goto error;
+                 arg_index = n - 1;
+                 cp = np + 1;
+               }
+           }
+
+         /* Read the flags.  */
+         for (;;)
+           {
+             if (*cp == '\'')
+               {
+                 dp->flags |= FLAG_GROUP;
+                 cp++;
+               }
+             else if (*cp == '-')
+               {
+                 dp->flags |= FLAG_LEFT;
+                 cp++;
+               }
+             else if (*cp == '+')
+               {
+                 dp->flags |= FLAG_SHOWSIGN;
+                 cp++;
+               }
+             else if (*cp == ' ')
+               {
+                 dp->flags |= FLAG_SPACE;
+                 cp++;
+               }
+             else if (*cp == '#')
+               {
+                 dp->flags |= FLAG_ALT;
+                 cp++;
+               }
+             else if (*cp == '0')
+               {
+                 dp->flags |= FLAG_ZERO;
+                 cp++;
+               }
+             else
+               break;
+           }
+
+         /* Parse the field width.  */
+         if (*cp == '*')
+           {
+             dp->width_start = cp;
+             cp++;
+             dp->width_end = cp;
+             if (max_width_length < 1)
+               max_width_length = 1;
+
+             /* Test for positional argument.  */
+             if (*cp >= '0' && *cp <= '9')
+               {
+                 const CHAR_T *np;
+
+                 for (np = cp; *np >= '0' && *np <= '9'; np++)
+                   ;
+                 if (*np == '$')
+                   {
+                     size_t n = 0;
+
+                     for (np = cp; *np >= '0' && *np <= '9'; np++)
+                       n = xsum (xtimes (n, 10), *np - '0');
+                     if (n == 0)
+                       /* Positional argument 0.  */
+                       goto error;
+                     if (size_overflow_p (n))
+                       /* n too large, would lead to out of memory later.  */
+                       goto error;
+                     dp->width_arg_index = n - 1;
+                     cp = np + 1;
+                   }
+               }
+             if (dp->width_arg_index == ARG_NONE)
+               {
+                 dp->width_arg_index = arg_posn++;
+                 if (dp->width_arg_index == ARG_NONE)
+                   /* arg_posn wrapped around.  */
+                   goto error;
+               }
+             REGISTER_ARG (dp->width_arg_index, TYPE_INT);
+           }
+         else if (*cp >= '0' && *cp <= '9')
+           {
+             size_t width_length;
+
+             dp->width_start = cp;
+             for (; *cp >= '0' && *cp <= '9'; cp++)
+               ;
+             dp->width_end = cp;
+             width_length = dp->width_end - dp->width_start;
+             if (max_width_length < width_length)
+               max_width_length = width_length;
+           }
+
+         /* Parse the precision.  */
+         if (*cp == '.')
+           {
+             cp++;
+             if (*cp == '*')
+               {
+                 dp->precision_start = cp - 1;
+                 cp++;
+                 dp->precision_end = cp;
+                 if (max_precision_length < 2)
+                   max_precision_length = 2;
+
+                 /* Test for positional argument.  */
+                 if (*cp >= '0' && *cp <= '9')
+                   {
+                     const CHAR_T *np;
+
+                     for (np = cp; *np >= '0' && *np <= '9'; np++)
+                       ;
+                     if (*np == '$')
+                       {
+                         size_t n = 0;
+
+                         for (np = cp; *np >= '0' && *np <= '9'; np++)
+                           n = xsum (xtimes (n, 10), *np - '0');
+                         if (n == 0)
+                           /* Positional argument 0.  */
+                           goto error;
+                         if (size_overflow_p (n))
+                           /* n too large, would lead to out of memory
+                              later.  */
+                           goto error;
+                         dp->precision_arg_index = n - 1;
+                         cp = np + 1;
+                       }
+                   }
+                 if (dp->precision_arg_index == ARG_NONE)
+                   {
+                     dp->precision_arg_index = arg_posn++;
+                     if (dp->precision_arg_index == ARG_NONE)
+                       /* arg_posn wrapped around.  */
+                       goto error;
+                   }
+                 REGISTER_ARG (dp->precision_arg_index, TYPE_INT);
+               }
+             else
+               {
+                 size_t precision_length;
+
+                 dp->precision_start = cp - 1;
+                 for (; *cp >= '0' && *cp <= '9'; cp++)
+                   ;
+                 dp->precision_end = cp;
+                 precision_length = dp->precision_end - dp->precision_start;
+                 if (max_precision_length < precision_length)
+                   max_precision_length = precision_length;
+               }
+           }
+
+         {
+           arg_type type;
+
+           /* Parse argument type/size specifiers.  */
+           {
+             int flags = 0;
+
+             for (;;)
+               {
+                 if (*cp == 'h')
+                   {
+                     flags |= (1 << (flags & 1));
+                     cp++;
+                   }
+                 else if (*cp == 'L')
+                   {
+                     flags |= 4;
+                     cp++;
+                   }
+                 else if (*cp == 'l')
+                   {
+                     flags += 8;
+                     cp++;
+                   }
+#ifdef HAVE_INTMAX_T
+                 else if (*cp == 'j')
+                   {
+                     if (sizeof (intmax_t) > sizeof (long))
+                       {
+                         /* intmax_t = long long */
+                         flags += 16;
+                       }
+                     else if (sizeof (intmax_t) > sizeof (int))
+                       {
+                         /* intmax_t = long */
+                         flags += 8;
+                       }
+                     cp++;
+                   }
+#endif
+                 else if (*cp == 'z' || *cp == 'Z')
+                   {
+                     /* 'z' is standardized in ISO C 99, but glibc uses 'Z'
+                        because the warning facility in gcc-2.95.2 understands
+                        only 'Z' (see gcc-2.95.2/gcc/c-common.c:1784).  */
+                     if (sizeof (size_t) > sizeof (long))
+                       {
+                         /* size_t = long long */
+                         flags += 16;
+                       }
+                     else if (sizeof (size_t) > sizeof (int))
+                       {
+                         /* size_t = long */
+                         flags += 8;
+                       }
+                     cp++;
+                   }
+                 else if (*cp == 't')
+                   {
+                     if (sizeof (ptrdiff_t) > sizeof (long))
+                       {
+                         /* ptrdiff_t = long long */
+                         flags += 16;
+                       }
+                     else if (sizeof (ptrdiff_t) > sizeof (int))
+                       {
+                         /* ptrdiff_t = long */
+                         flags += 8;
+                       }
+                     cp++;
+                   }
+                 else
+                   break;
+               }
+
+             /* Read the conversion character.  */
+             c = *cp++;
+             switch (c)
+               {
+               case 'd': case 'i':
+#ifdef HAVE_LONG_LONG
+                 if (flags >= 16 || (flags & 4))
+                   type = TYPE_LONGLONGINT;
+                 else
+#endif
+                 if (flags >= 8)
+                   type = TYPE_LONGINT;
+                 else if (flags & 2)
+                   type = TYPE_SCHAR;
+                 else if (flags & 1)
+                   type = TYPE_SHORT;
+                 else
+                   type = TYPE_INT;
+                 break;
+               case 'o': case 'u': case 'x': case 'X':
+#ifdef HAVE_LONG_LONG
+                 if (flags >= 16 || (flags & 4))
+                   type = TYPE_ULONGLONGINT;
+                 else
+#endif
+                 if (flags >= 8)
+                   type = TYPE_ULONGINT;
+                 else if (flags & 2)
+                   type = TYPE_UCHAR;
+                 else if (flags & 1)
+                   type = TYPE_USHORT;
+                 else
+                   type = TYPE_UINT;
+                 break;
+               case 'f': case 'F': case 'e': case 'E': case 'g': case 'G':
+               case 'a': case 'A':
+#ifdef HAVE_LONG_DOUBLE
+                 if (flags >= 16 || (flags & 4))
+                   type = TYPE_LONGDOUBLE;
+                 else
+#endif
+                 type = TYPE_DOUBLE;
+                 break;
+               case 'c':
+                 if (flags >= 8)
+#ifdef HAVE_WINT_T
+                   type = TYPE_WIDE_CHAR;
+#else
+                   goto error;
+#endif
+                 else
+                   type = TYPE_CHAR;
+                 break;
+#ifdef HAVE_WINT_T
+               case 'C':
+                 type = TYPE_WIDE_CHAR;
+                 c = 'c';
+                 break;
+#endif
+               case 's':
+                 if (flags >= 8)
+#ifdef HAVE_WCHAR_T
+                   type = TYPE_WIDE_STRING;
+#else
+                   goto error;
+#endif
+                 else
+                   type = TYPE_STRING;
+                 break;
+#ifdef HAVE_WCHAR_T
+               case 'S':
+                 type = TYPE_WIDE_STRING;
+                 c = 's';
+                 break;
+#endif
+               case 'p':
+                 type = TYPE_POINTER;
+                 break;
+               case 'n':
+#ifdef HAVE_LONG_LONG
+                 if (flags >= 16 || (flags & 4))
+                   type = TYPE_COUNT_LONGLONGINT_POINTER;
+                 else
+#endif
+                 if (flags >= 8)
+                   type = TYPE_COUNT_LONGINT_POINTER;
+                 else if (flags & 2)
+                   type = TYPE_COUNT_SCHAR_POINTER;
+                 else if (flags & 1)
+                   type = TYPE_COUNT_SHORT_POINTER;
+                 else
+                   type = TYPE_COUNT_INT_POINTER;
+                 break;
+               case '%':
+                 type = TYPE_NONE;
+                 break;
+               default:
+                 /* Unknown conversion character.  */
+                 goto error;
+               }
+           }
+
+           if (type != TYPE_NONE)
+             {
+               dp->arg_index = arg_index;
+               if (dp->arg_index == ARG_NONE)
+                 {
+                   dp->arg_index = arg_posn++;
+                   if (dp->arg_index == ARG_NONE)
+                     /* arg_posn wrapped around.  */
+                     goto error;
+                 }
+               REGISTER_ARG (dp->arg_index, type);
+             }
+           dp->conversion = c;
+           dp->dir_end = cp;
+         }
+
+         d->count++;
+         if (d->count >= d_allocated)
+           {
+             size_t memory_size;
+             DIRECTIVE *memory;
+
+             d_allocated = xtimes (d_allocated, 2);
+             memory_size = xtimes (d_allocated, sizeof (DIRECTIVE));
+             if (size_overflow_p (memory_size))
+               /* Overflow, would lead to out of memory.  */
+               goto error;
+             memory = realloc (d->dir, memory_size);
+             if (memory == NULL)
+               /* Out of memory.  */
+               goto error;
+             d->dir = memory;
+           }
+       }
+    }
+  d->dir[d->count].dir_start = cp;
+
+  d->max_width_length = max_width_length;
+  d->max_precision_length = max_precision_length;
+  return 0;
+
+error:
+  if (a->arg)
+    free (a->arg);
+  if (d->dir)
+    free (d->dir);
+  return -1;
+}
+
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T
+#undef PRINTF_PARSE
diff --git a/intl/printf-parse.h b/intl/printf-parse.h
new file mode 100644 (file)
index 0000000..e785338
--- /dev/null
@@ -0,0 +1,75 @@
+/* Parse printf format string.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _PRINTF_PARSE_H
+#define _PRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP      1      /* ' flag */
+#define FLAG_LEFT       2      /* - flag */
+#define FLAG_SHOWSIGN   4      /* + flag */
+#define FLAG_SPACE      8      /* space flag */
+#define FLAG_ALT       16      /* # flag */
+#define FLAG_ZERO      32
+
+/* arg_index value indicating that no argument is consumed.  */
+#define ARG_NONE       (~(size_t)0)
+
+/* A parsed directive.  */
+typedef struct
+{
+  const char* dir_start;
+  const char* dir_end;
+  int flags;
+  const char* width_start;
+  const char* width_end;
+  size_t width_arg_index;
+  const char* precision_start;
+  const char* precision_end;
+  size_t precision_arg_index;
+  char conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+  size_t arg_index;
+}
+char_directive;
+
+/* A parsed format string.  */
+typedef struct
+{
+  size_t count;
+  char_directive *dir;
+  size_t max_width_length;
+  size_t max_precision_length;
+}
+char_directives;
+
+
+/* Parses the format string.  Fills in the number N of directives, and fills
+   in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+   to the end of the format string.  Also fills in the arg_type fields of the
+   arguments and the needed count of arguments.  */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int printf_parse (const char *format, char_directives *d, arguments *a);
+
+#endif /* _PRINTF_PARSE_H */
diff --git a/intl/printf.c b/intl/printf.c
new file mode 100644 (file)
index 0000000..5e112b6
--- /dev/null
@@ -0,0 +1,371 @@
+/* Formatted output to strings, using POSIX/XSI format strings with positions.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# ifdef _MSC_VER
+#  include <malloc.h>
+#  define alloca _alloca
+# else
+#  if defined HAVE_ALLOCA_H || defined _LIBC
+#   include <alloca.h>
+#  else
+#   ifdef _AIX
+ #pragma alloca
+#   else
+#    ifndef alloca
+char *alloca ();
+#    endif
+#   endif
+#  endif
+# endif
+#endif
+
+#include <stdio.h>
+
+#if !HAVE_POSIX_PRINTF
+
+#include <stdlib.h>
+#include <string.h>
+
+/* When building a DLL, we must export some functions.  Note that because
+   the functions are only defined for binary backward compatibility, we
+   don't need to use __declspec(dllimport) in any case.  */
+#if defined _MSC_VER && BUILDING_DLL
+# define DLL_EXPORTED __declspec(dllexport)
+#else
+# define DLL_EXPORTED
+#endif
+
+#define STATIC static
+
+/* Define auxiliary functions declared in "printf-args.h".  */
+#include "printf-args.c"
+
+/* Define auxiliary functions declared in "printf-parse.h".  */
+#include "printf-parse.c"
+
+/* Define functions declared in "vasnprintf.h".  */
+#define vasnprintf libintl_vasnprintf
+#include "vasnprintf.c"
+#if 0 /* not needed */
+#define asnprintf libintl_asnprintf
+#include "asnprintf.c"
+#endif
+
+DLL_EXPORTED
+int
+libintl_vfprintf (FILE *stream, const char *format, va_list args)
+{
+  if (strchr (format, '$') == NULL)
+    return vfprintf (stream, format, args);
+  else
+    {
+      size_t length;
+      char *result = libintl_vasnprintf (NULL, &length, format, args);
+      int retval = -1;
+      if (result != NULL)
+       {
+         if (fwrite (result, 1, length, stream) == length)
+           retval = length;
+         free (result);
+       }
+      return retval;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_fprintf (FILE *stream, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vfprintf (stream, format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vprintf (const char *format, va_list args)
+{
+  return libintl_vfprintf (stdout, format, args);
+}
+
+DLL_EXPORTED
+int
+libintl_printf (const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vprintf (format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vsprintf (char *resultbuf, const char *format, va_list args)
+{
+  if (strchr (format, '$') == NULL)
+    return vsprintf (resultbuf, format, args);
+  else
+    {
+      size_t length = (size_t) ~0 / (4 * sizeof (char));
+      char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+      if (result != resultbuf)
+       {
+         free (result);
+         return -1;
+       }
+      else
+       return length;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_sprintf (char *resultbuf, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vsprintf (resultbuf, format, args);
+  va_end (args);
+  return retval;
+}
+
+#if HAVE_SNPRINTF
+
+# if HAVE_DECL__SNPRINTF
+   /* Windows.  */
+#  define system_vsnprintf _vsnprintf
+# else
+   /* Unix.  */
+#  define system_vsnprintf vsnprintf
+# endif
+
+DLL_EXPORTED
+int
+libintl_vsnprintf (char *resultbuf, size_t length, const char *format, va_list args)
+{
+  if (strchr (format, '$') == NULL)
+    return system_vsnprintf (resultbuf, length, format, args);
+  else
+    {
+      size_t maxlength = length;
+      char *result = libintl_vasnprintf (resultbuf, &length, format, args);
+      if (result != resultbuf)
+       {
+         if (maxlength > 0)
+           {
+             if (length < maxlength)
+               abort ();
+             memcpy (resultbuf, result, maxlength - 1);
+             resultbuf[maxlength - 1] = '\0';
+           }
+         free (result);
+         return -1;
+       }
+      else
+       return length;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_snprintf (char *resultbuf, size_t length, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vsnprintf (resultbuf, length, format, args);
+  va_end (args);
+  return retval;
+}
+
+#endif
+
+#if HAVE_ASPRINTF
+
+DLL_EXPORTED
+int
+libintl_vasprintf (char **resultp, const char *format, va_list args)
+{
+  size_t length;
+  char *result = libintl_vasnprintf (NULL, &length, format, args);
+  if (result == NULL)
+    return -1;
+  *resultp = result;
+  return length;
+}
+
+DLL_EXPORTED
+int
+libintl_asprintf (char **resultp, const char *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vasprintf (resultp, format, args);
+  va_end (args);
+  return retval;
+}
+
+#endif
+
+#if HAVE_FWPRINTF
+
+#include <wchar.h>
+
+#define WIDE_CHAR_VERSION 1
+
+/* Define auxiliary functions declared in "wprintf-parse.h".  */
+#include "printf-parse.c"
+
+/* Define functions declared in "vasnprintf.h".  */
+#define vasnwprintf libintl_vasnwprintf
+#include "vasnprintf.c"
+#if 0 /* not needed */
+#define asnwprintf libintl_asnwprintf
+#include "asnprintf.c"
+#endif
+
+# if HAVE_DECL__SNWPRINTF
+   /* Windows.  */
+#  define system_vswprintf _vsnwprintf
+# else
+   /* Unix.  */
+#  define system_vswprintf vswprintf
+# endif
+
+DLL_EXPORTED
+int
+libintl_vfwprintf (FILE *stream, const wchar_t *format, va_list args)
+{
+  if (wcschr (format, '$') == NULL)
+    return vfwprintf (stream, format, args);
+  else
+    {
+      size_t length;
+      wchar_t *result = libintl_vasnwprintf (NULL, &length, format, args);
+      int retval = -1;
+      if (result != NULL)
+       {
+         size_t i;
+         for (i = 0; i < length; i++)
+           if (fputwc (result[i], stream) == WEOF)
+             break;
+         if (i == length)
+           retval = length;
+         free (result);
+       }
+      return retval;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_fwprintf (FILE *stream, const wchar_t *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vfwprintf (stream, format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vwprintf (const wchar_t *format, va_list args)
+{
+  return libintl_vfwprintf (stdout, format, args);
+}
+
+DLL_EXPORTED
+int
+libintl_wprintf (const wchar_t *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vwprintf (format, args);
+  va_end (args);
+  return retval;
+}
+
+DLL_EXPORTED
+int
+libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
+{
+  if (wcschr (format, '$') == NULL)
+    return system_vswprintf (resultbuf, length, format, args);
+  else
+    {
+      size_t maxlength = length;
+      wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
+      if (result != resultbuf)
+       {
+         if (maxlength > 0)
+           {
+             if (length < maxlength)
+               abort ();
+             memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t));
+             resultbuf[maxlength - 1] = 0;
+           }
+         free (result);
+         return -1;
+       }
+      else
+       return length;
+    }
+}
+
+DLL_EXPORTED
+int
+libintl_swprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, ...)
+{
+  va_list args;
+  int retval;
+
+  va_start (args, format);
+  retval = libintl_vswprintf (resultbuf, length, format, args);
+  va_end (args);
+  return retval;
+}
+
+#endif
+
+#endif
diff --git a/intl/ref-add.sin b/intl/ref-add.sin
new file mode 100644 (file)
index 0000000..3678c28
--- /dev/null
@@ -0,0 +1,31 @@
+# Add this package to a list of references stored in a text file.
+#
+#   Copyright (C) 2000 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library General Public License as published
+#   by the Free Software Foundation; either version 2, or (at your option)
+#   any later version.
+#
+#   This program 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+#   USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+  s/# Packages using this file://
+  ta
+  :a
+  s/ @PACKAGE@ / @PACKAGE@ /
+  tb
+  s/ $/ @PACKAGE@ /
+  :b
+  s/^/# Packages using this file:/
+}
diff --git a/intl/ref-del.sin b/intl/ref-del.sin
new file mode 100644 (file)
index 0000000..0c12d8e
--- /dev/null
@@ -0,0 +1,26 @@
+# Remove this package from a list of references stored in a text file.
+#
+#   Copyright (C) 2000 Free Software Foundation, Inc.
+#
+#   This program is free software; you can redistribute it and/or modify it
+#   under the terms of the GNU Library General Public License as published
+#   by the Free Software Foundation; either version 2, or (at your option)
+#   any later version.
+#
+#   This program 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
+#   Library General Public License for more details.
+#
+#   You should have received a copy of the GNU Library General Public
+#   License along with this program; if not, write to the Free Software
+#   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+#   USA.
+#
+# Written by Bruno Haible <haible@clisp.cons.org>.
+#
+/^# Packages using this file: / {
+  s/# Packages using this file://
+  s/ @PACKAGE@ / /
+  s/^/# Packages using this file:/
+}
diff --git a/intl/relocatable.c b/intl/relocatable.c
new file mode 100644 (file)
index 0000000..a2e5aa7
--- /dev/null
@@ -0,0 +1,449 @@
+/* Provide relocatable packages.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+
+/* Tell glibc's <stdio.h> to provide a prototype for getline().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE   1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* Specification.  */
+#include "relocatable.h"
+
+#if ENABLE_RELOCATABLE
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef NO_XMALLOC
+# define xmalloc malloc
+#else
+# include "xalloc.h"
+#endif
+
+#if defined _WIN32 || defined __WIN32__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
+#if DEPENDS_ON_LIBCHARSET
+# include <libcharset.h>
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV
+# include <iconv.h>
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS
+# include <libintl.h>
+#endif
+
+/* Faked cheap 'bool'.  */
+#undef bool
+#undef false
+#undef true
+#define bool int
+#define false 0
+#define true 1
+
+/* Pathname support.
+   ISSLASH(C)           tests whether C is a directory separator character.
+   IS_PATH_WITH_DIR(P)  tests whether P contains a directory specification.
+ */
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+  /* Win32, OS/2, DOS */
+# define ISSLASH(C) ((C) == '/' || (C) == '\\')
+# define HAS_DEVICE(P) \
+    ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
+     && (P)[1] == ':')
+# define IS_PATH_WITH_DIR(P) \
+    (strchr (P, '/') != NULL || strchr (P, '\\') != NULL || HAS_DEVICE (P))
+# define FILESYSTEM_PREFIX_LEN(P) (HAS_DEVICE (P) ? 2 : 0)
+#else
+  /* Unix */
+# define ISSLASH(C) ((C) == '/')
+# define IS_PATH_WITH_DIR(P) (strchr (P, '/') != NULL)
+# define FILESYSTEM_PREFIX_LEN(P) 0
+#endif
+
+/* Original installation prefix.  */
+static char *orig_prefix;
+static size_t orig_prefix_len;
+/* Current installation prefix.  */
+static char *curr_prefix;
+static size_t curr_prefix_len;
+/* These prefixes do not end in a slash.  Anything that will be concatenated
+   to them must start with a slash.  */
+
+/* Sets the original and the current installation prefix of this module.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+static void
+set_this_relocation_prefix (const char *orig_prefix_arg,
+                           const char *curr_prefix_arg)
+{
+  if (orig_prefix_arg != NULL && curr_prefix_arg != NULL
+      /* Optimization: if orig_prefix and curr_prefix are equal, the
+        relocation is a nop.  */
+      && strcmp (orig_prefix_arg, curr_prefix_arg) != 0)
+    {
+      /* Duplicate the argument strings.  */
+      char *memory;
+
+      orig_prefix_len = strlen (orig_prefix_arg);
+      curr_prefix_len = strlen (curr_prefix_arg);
+      memory = (char *) xmalloc (orig_prefix_len + 1 + curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+      if (memory != NULL)
+#endif
+       {
+         memcpy (memory, orig_prefix_arg, orig_prefix_len + 1);
+         orig_prefix = memory;
+         memory += orig_prefix_len + 1;
+         memcpy (memory, curr_prefix_arg, curr_prefix_len + 1);
+         curr_prefix = memory;
+         return;
+       }
+    }
+  orig_prefix = NULL;
+  curr_prefix = NULL;
+  /* Don't worry about wasted memory here - this function is usually only
+     called once.  */
+}
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+void
+set_relocation_prefix (const char *orig_prefix_arg, const char *curr_prefix_arg)
+{
+  set_this_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+
+  /* Now notify all dependent libraries.  */
+#if DEPENDS_ON_LIBCHARSET
+  libcharset_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBICONV && HAVE_ICONV && _LIBICONV_VERSION >= 0x0109
+  libiconv_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+#if DEPENDS_ON_LIBINTL && ENABLE_NLS && defined libintl_set_relocation_prefix
+  libintl_set_relocation_prefix (orig_prefix_arg, curr_prefix_arg);
+#endif
+}
+
+#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
+
+/* Convenience function:
+   Computes the current installation prefix, based on the original
+   installation prefix, the original installation directory of a particular
+   file, and the current pathname of this file.  Returns NULL upon failure.  */
+#ifdef IN_LIBRARY
+#define compute_curr_prefix local_compute_curr_prefix
+static
+#endif
+const char *
+compute_curr_prefix (const char *orig_installprefix,
+                    const char *orig_installdir,
+                    const char *curr_pathname)
+{
+  const char *curr_installdir;
+  const char *rel_installdir;
+
+  if (curr_pathname == NULL)
+    return NULL;
+
+  /* Determine the relative installation directory, relative to the prefix.
+     This is simply the difference between orig_installprefix and
+     orig_installdir.  */
+  if (strncmp (orig_installprefix, orig_installdir, strlen (orig_installprefix))
+      != 0)
+    /* Shouldn't happen - nothing should be installed outside $(prefix).  */
+    return NULL;
+  rel_installdir = orig_installdir + strlen (orig_installprefix);
+
+  /* Determine the current installation directory.  */
+  {
+    const char *p_base = curr_pathname + FILESYSTEM_PREFIX_LEN (curr_pathname);
+    const char *p = curr_pathname + strlen (curr_pathname);
+    char *q;
+
+    while (p > p_base)
+      {
+       p--;
+       if (ISSLASH (*p))
+         break;
+      }
+
+    q = (char *) xmalloc (p - curr_pathname + 1);
+#ifdef NO_XMALLOC
+    if (q == NULL)
+      return NULL;
+#endif
+    memcpy (q, curr_pathname, p - curr_pathname);
+    q[p - curr_pathname] = '\0';
+    curr_installdir = q;
+  }
+
+  /* Compute the current installation prefix by removing the trailing
+     rel_installdir from it.  */
+  {
+    const char *rp = rel_installdir + strlen (rel_installdir);
+    const char *cp = curr_installdir + strlen (curr_installdir);
+    const char *cp_base =
+      curr_installdir + FILESYSTEM_PREFIX_LEN (curr_installdir);
+
+    while (rp > rel_installdir && cp > cp_base)
+      {
+       bool same = false;
+       const char *rpi = rp;
+       const char *cpi = cp;
+
+       while (rpi > rel_installdir && cpi > cp_base)
+         {
+           rpi--;
+           cpi--;
+           if (ISSLASH (*rpi) || ISSLASH (*cpi))
+             {
+               if (ISSLASH (*rpi) && ISSLASH (*cpi))
+                 same = true;
+               break;
+             }
+#if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
+           /* Win32, OS/2, DOS - case insignificant filesystem */
+           if ((*rpi >= 'a' && *rpi <= 'z' ? *rpi - 'a' + 'A' : *rpi)
+               != (*cpi >= 'a' && *cpi <= 'z' ? *cpi - 'a' + 'A' : *cpi))
+             break;
+#else
+           if (*rpi != *cpi)
+             break;
+#endif
+         }
+       if (!same)
+         break;
+       /* The last pathname component was the same.  opi and cpi now point
+          to the slash before it.  */
+       rp = rpi;
+       cp = cpi;
+      }
+
+    if (rp > rel_installdir)
+      /* Unexpected: The curr_installdir does not end with rel_installdir.  */
+      return NULL;
+
+    {
+      size_t curr_prefix_len = cp - curr_installdir;
+      char *curr_prefix;
+
+      curr_prefix = (char *) xmalloc (curr_prefix_len + 1);
+#ifdef NO_XMALLOC
+      if (curr_prefix == NULL)
+       return NULL;
+#endif
+      memcpy (curr_prefix, curr_installdir, curr_prefix_len);
+      curr_prefix[curr_prefix_len] = '\0';
+
+      return curr_prefix;
+    }
+  }
+}
+
+#endif /* !IN_LIBRARY || PIC */
+
+#if defined PIC && defined INSTALLDIR
+
+/* Full pathname of shared library, or NULL.  */
+static char *shared_library_fullname;
+
+#if defined _WIN32 || defined __WIN32__
+
+/* Determine the full pathname of the shared library when it is loaded.  */
+
+BOOL WINAPI
+DllMain (HINSTANCE module_handle, DWORD event, LPVOID reserved)
+{
+  (void) reserved;
+
+  if (event == DLL_PROCESS_ATTACH)
+    {
+      /* The DLL is being loaded into an application's address range.  */
+      static char location[MAX_PATH];
+
+      if (!GetModuleFileName (module_handle, location, sizeof (location)))
+       /* Shouldn't happen.  */
+       return FALSE;
+
+      if (!IS_PATH_WITH_DIR (location))
+       /* Shouldn't happen.  */
+       return FALSE;
+
+      shared_library_fullname = strdup (location);
+    }
+
+  return TRUE;
+}
+
+#else /* Unix */
+
+static void
+find_shared_library_fullname ()
+{
+#if defined __linux__ && __GLIBC__ >= 2
+  /* Linux has /proc/self/maps. glibc 2 has the getline() function.  */
+  FILE *fp;
+
+  /* Open the current process' maps file.  It describes one VMA per line.  */
+  fp = fopen ("/proc/self/maps", "r");
+  if (fp)
+    {
+      unsigned long address = (unsigned long) &find_shared_library_fullname;
+      for (;;)
+       {
+         unsigned long start, end;
+         int c;
+
+         if (fscanf (fp, "%lx-%lx", &start, &end) != 2)
+           break;
+         if (address >= start && address <= end - 1)
+           {
+             /* Found it.  Now see if this line contains a filename.  */
+             while (c = getc (fp), c != EOF && c != '\n' && c != '/')
+               continue;
+             if (c == '/')
+               {
+                 size_t size;
+                 int len;
+
+                 ungetc (c, fp);
+                 shared_library_fullname = NULL; size = 0;
+                 len = getline (&shared_library_fullname, &size, fp);
+                 if (len >= 0)
+                   {
+                     /* Success: filled shared_library_fullname.  */
+                     if (len > 0 && shared_library_fullname[len - 1] == '\n')
+                       shared_library_fullname[len - 1] = '\0';
+                   }
+               }
+             break;
+           }
+         while (c = getc (fp), c != EOF && c != '\n')
+           continue;
+       }
+      fclose (fp);
+    }
+#endif
+}
+
+#endif /* WIN32 / Unix */
+
+/* Return the full pathname of the current shared library.
+   Return NULL if unknown.
+   Guaranteed to work only on Linux and Woe32.  */
+static char *
+get_shared_library_fullname ()
+{
+#if !(defined _WIN32 || defined __WIN32__)
+  static bool tried_find_shared_library_fullname;
+  if (!tried_find_shared_library_fullname)
+    {
+      find_shared_library_fullname ();
+      tried_find_shared_library_fullname = true;
+    }
+#endif
+  return shared_library_fullname;
+}
+
+#endif /* PIC */
+
+/* Returns the pathname, relocated according to the current installation
+   directory.  */
+const char *
+relocate (const char *pathname)
+{
+#if defined PIC && defined INSTALLDIR
+  static int initialized;
+
+  /* Initialization code for a shared library.  */
+  if (!initialized)
+    {
+      /* At this point, orig_prefix and curr_prefix likely have already been
+        set through the main program's set_program_name_and_installdir
+        function.  This is sufficient in the case that the library has
+        initially been installed in the same orig_prefix.  But we can do
+        better, to also cover the cases that 1. it has been installed
+        in a different prefix before being moved to orig_prefix and (later)
+        to curr_prefix, 2. unlike the program, it has not moved away from
+        orig_prefix.  */
+      const char *orig_installprefix = INSTALLPREFIX;
+      const char *orig_installdir = INSTALLDIR;
+      const char *curr_prefix_better;
+
+      curr_prefix_better =
+       compute_curr_prefix (orig_installprefix, orig_installdir,
+                            get_shared_library_fullname ());
+      if (curr_prefix_better == NULL)
+       curr_prefix_better = curr_prefix;
+
+      set_relocation_prefix (orig_installprefix, curr_prefix_better);
+
+      initialized = 1;
+    }
+#endif
+
+  /* Note: It is not necessary to perform case insensitive comparison here,
+     even for DOS-like filesystems, because the pathname argument was
+     typically created from the same Makefile variable as orig_prefix came
+     from.  */
+  if (orig_prefix != NULL && curr_prefix != NULL
+      && strncmp (pathname, orig_prefix, orig_prefix_len) == 0)
+    {
+      if (pathname[orig_prefix_len] == '\0')
+       /* pathname equals orig_prefix.  */
+       return curr_prefix;
+      if (ISSLASH (pathname[orig_prefix_len]))
+       {
+         /* pathname starts with orig_prefix.  */
+         const char *pathname_tail = &pathname[orig_prefix_len];
+         char *result =
+           (char *) xmalloc (curr_prefix_len + strlen (pathname_tail) + 1);
+
+#ifdef NO_XMALLOC
+         if (result != NULL)
+#endif
+           {
+             memcpy (result, curr_prefix, curr_prefix_len);
+             strcpy (result + curr_prefix_len, pathname_tail);
+             return result;
+           }
+       }
+    }
+  /* Nothing to relocate.  */
+  return pathname;
+}
+
+#endif
diff --git a/intl/relocatable.h b/intl/relocatable.h
new file mode 100644 (file)
index 0000000..614e64e
--- /dev/null
@@ -0,0 +1,77 @@
+/* Provide relocatable packages.
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _RELOCATABLE_H
+#define _RELOCATABLE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This can be enabled through the configure --enable-relocatable option.  */
+#if ENABLE_RELOCATABLE
+
+/* When building a DLL, we must export some functions.  Note that because
+   this is a private .h file, we don't need to use __declspec(dllimport)
+   in any case.  */
+#if defined _MSC_VER && BUILDING_DLL
+# define RELOCATABLE_DLL_EXPORTED __declspec(dllexport)
+#else
+# define RELOCATABLE_DLL_EXPORTED
+#endif
+
+/* Sets the original and the current installation prefix of the package.
+   Relocation simply replaces a pathname starting with the original prefix
+   by the corresponding pathname with the current prefix instead.  Both
+   prefixes should be directory names without trailing slash (i.e. use ""
+   instead of "/").  */
+extern RELOCATABLE_DLL_EXPORTED void
+       set_relocation_prefix (const char *orig_prefix,
+                             const char *curr_prefix);
+
+/* Returns the pathname, relocated according to the current installation
+   directory.  */
+extern const char * relocate (const char *pathname);
+
+/* Memory management: relocate() leaks memory, because it has to construct
+   a fresh pathname.  If this is a problem because your program calls
+   relocate() frequently, think about caching the result.  */
+
+/* Convenience function:
+   Computes the current installation prefix, based on the original
+   installation prefix, the original installation directory of a particular
+   file, and the current pathname of this file.  Returns NULL upon failure.  */
+extern const char * compute_curr_prefix (const char *orig_installprefix,
+                                        const char *orig_installdir,
+                                        const char *curr_pathname);
+
+#else
+
+/* By default, we use the hardwired pathnames.  */
+#define relocate(pathname) (pathname)
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RELOCATABLE_H */
diff --git a/intl/textdomain.c b/intl/textdomain.c
new file mode 100644 (file)
index 0000000..2bf6240
--- /dev/null
@@ -0,0 +1,141 @@
+/* Implementation of the textdomain(3) function.
+   Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgnuintl.h"
+#endif
+#include "gettextP.h"
+
+#ifdef _LIBC
+/* We have to handle multi-threaded applications.  */
+# include <bits/libc-lock.h>
+#else
+/* Provide dummy implementation if this is outside glibc.  */
+# define __libc_rwlock_define(CLASS, NAME)
+# define __libc_rwlock_wrlock(NAME)
+# define __libc_rwlock_unlock(NAME)
+#endif
+
+/* The internal variables in the standalone libintl.a must have different
+   names than the internal variables in GNU libc, otherwise programs
+   using libintl.a cannot be linked statically.  */
+#if !defined _LIBC
+# define _nl_default_default_domain libintl_nl_default_default_domain
+# define _nl_current_default_domain libintl_nl_current_default_domain
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain.  */
+extern const char _nl_default_default_domain[] attribute_hidden;
+
+/* Default text domain in which entries for gettext(3) are to be found.  */
+extern const char *_nl_current_default_domain attribute_hidden;
+
+
+/* Names for the libintl functions are a problem.  They must not clash
+   with existing names and they should follow ANSI C.  But this source
+   code is also used in GNU C Library where the names have a __
+   prefix.  So we have to make a difference here.  */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN libintl_textdomain
+#endif
+
+/* Lock variable to protect the global data in the gettext implementation.  */
+__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
+
+/* Set the current default message catalog to DOMAINNAME.
+   If DOMAINNAME is null, return the current default.
+   If DOMAINNAME is "", reset to the default of "messages".  */
+char *
+TEXTDOMAIN (const char *domainname)
+{
+  char *new_domain;
+  char *old_domain;
+
+  /* A NULL pointer requests the current setting.  */
+  if (domainname == NULL)
+    return (char *) _nl_current_default_domain;
+
+  __libc_rwlock_wrlock (_nl_state_lock);
+
+  old_domain = (char *) _nl_current_default_domain;
+
+  /* If domain name is the null string set to default domain "messages".  */
+  if (domainname[0] == '\0'
+      || strcmp (domainname, _nl_default_default_domain) == 0)
+    {
+      _nl_current_default_domain = _nl_default_default_domain;
+      new_domain = (char *) _nl_current_default_domain;
+    }
+  else if (strcmp (domainname, old_domain) == 0)
+    /* This can happen and people will use it to signal that some
+       environment variable changed.  */
+    new_domain = old_domain;
+  else
+    {
+      /* If the following malloc fails `_nl_current_default_domain'
+        will be NULL.  This value will be returned and so signals we
+        are out of core.  */
+#if defined _LIBC || defined HAVE_STRDUP
+      new_domain = strdup (domainname);
+#else
+      size_t len = strlen (domainname) + 1;
+      new_domain = (char *) malloc (len);
+      if (new_domain != NULL)
+       memcpy (new_domain, domainname, len);
+#endif
+
+      if (new_domain != NULL)
+       _nl_current_default_domain = new_domain;
+    }
+
+  /* We use this possibility to signal a change of the loaded catalogs
+     since this is most likely the case and there is no other easy we
+     to do it.  Do it only when the call was successful.  */
+  if (new_domain != NULL)
+    {
+      ++_nl_msg_cat_cntr;
+
+      if (old_domain != new_domain && old_domain != _nl_default_default_domain)
+       free (old_domain);
+    }
+
+  __libc_rwlock_unlock (_nl_state_lock);
+
+  return new_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library.  */
+weak_alias (__textdomain, textdomain);
+#endif
diff --git a/intl/vasnprintf.c b/intl/vasnprintf.c
new file mode 100644 (file)
index 0000000..f192f20
--- /dev/null
@@ -0,0 +1,887 @@
+/* vsprintf with automatic memory allocation.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+/* Tell glibc's <stdio.h> to provide a prototype for snprintf().
+   This must come before <config.h> because <config.h> may include
+   <features.h>, and once <features.h> has been included, it's too late.  */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE    1
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#ifndef IN_LIBINTL
+# include <alloca.h>
+#endif
+
+/* Specification.  */
+#if WIDE_CHAR_VERSION
+# include "vasnwprintf.h"
+#else
+# include "vasnprintf.h"
+#endif
+
+#include <stdio.h>     /* snprintf(), sprintf() */
+#include <stdlib.h>    /* abort(), malloc(), realloc(), free() */
+#include <string.h>    /* memcpy(), strlen() */
+#include <errno.h>     /* errno */
+#include <limits.h>    /* CHAR_BIT */
+#include <float.h>     /* DBL_MAX_EXP, LDBL_MAX_EXP */
+#if WIDE_CHAR_VERSION
+# include "wprintf-parse.h"
+#else
+# include "printf-parse.h"
+#endif
+
+/* Checked size_t computations.  */
+#include "xsize.h"
+
+#ifdef HAVE_WCHAR_T
+# ifdef HAVE_WCSLEN
+#  define local_wcslen wcslen
+# else
+   /* Solaris 2.5.1 has wcslen() in a separate library libw.so. To avoid
+      a dependency towards this library, here is a local substitute.
+      Define this substitute only once, even if this file is included
+      twice in the same compilation unit.  */
+#  ifndef local_wcslen_defined
+#   define local_wcslen_defined 1
+static size_t
+local_wcslen (const wchar_t *s)
+{
+  const wchar_t *ptr;
+
+  for (ptr = s; *ptr != (wchar_t) 0; ptr++)
+    ;
+  return ptr - s;
+}
+#  endif
+# endif
+#endif
+
+#if WIDE_CHAR_VERSION
+# define VASNPRINTF vasnwprintf
+# define CHAR_T wchar_t
+# define DIRECTIVE wchar_t_directive
+# define DIRECTIVES wchar_t_directives
+# define PRINTF_PARSE wprintf_parse
+# define USE_SNPRINTF 1
+# if HAVE_DECL__SNWPRINTF
+   /* On Windows, the function swprintf() has a different signature than
+      on Unix; we use the _snwprintf() function instead.  */
+#  define SNPRINTF _snwprintf
+# else
+   /* Unix.  */
+#  define SNPRINTF swprintf
+# endif
+#else
+# define VASNPRINTF vasnprintf
+# define CHAR_T char
+# define DIRECTIVE char_directive
+# define DIRECTIVES char_directives
+# define PRINTF_PARSE printf_parse
+# define USE_SNPRINTF (HAVE_DECL__SNPRINTF || HAVE_SNPRINTF)
+# if HAVE_DECL__SNPRINTF
+   /* Windows.  */
+#  define SNPRINTF _snprintf
+# else
+   /* Unix.  */
+#  define SNPRINTF snprintf
+# endif
+#endif
+
+CHAR_T *
+VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list args)
+{
+  DIRECTIVES d;
+  arguments a;
+
+  if (PRINTF_PARSE (format, &d, &a) < 0)
+    {
+      errno = EINVAL;
+      return NULL;
+    }
+
+#define CLEANUP() \
+  free (d.dir);                                                                \
+  if (a.arg)                                                           \
+    free (a.arg);
+
+  if (printf_fetchargs (args, &a) < 0)
+    {
+      CLEANUP ();
+      errno = EINVAL;
+      return NULL;
+    }
+
+  {
+    size_t buf_neededlength;
+    CHAR_T *buf;
+    CHAR_T *buf_malloced;
+    const CHAR_T *cp;
+    size_t i;
+    DIRECTIVE *dp;
+    /* Output string accumulator.  */
+    CHAR_T *result;
+    size_t allocated;
+    size_t length;
+
+    /* Allocate a small buffer that will hold a directive passed to
+       sprintf or snprintf.  */
+    buf_neededlength =
+      xsum4 (7, d.max_width_length, d.max_precision_length, 6);
+#if HAVE_ALLOCA
+    if (buf_neededlength < 4000 / sizeof (CHAR_T))
+      {
+       buf = (CHAR_T *) alloca (buf_neededlength * sizeof (CHAR_T));
+       buf_malloced = NULL;
+      }
+    else
+#endif
+      {
+       size_t buf_memsize = xtimes (buf_neededlength, sizeof (CHAR_T));
+       if (size_overflow_p (buf_memsize))
+         goto out_of_memory_1;
+       buf = (CHAR_T *) malloc (buf_memsize);
+       if (buf == NULL)
+         goto out_of_memory_1;
+       buf_malloced = buf;
+      }
+
+    if (resultbuf != NULL)
+      {
+       result = resultbuf;
+       allocated = *lengthp;
+      }
+    else
+      {
+       result = NULL;
+       allocated = 0;
+      }
+    length = 0;
+    /* Invariants:
+       result is either == resultbuf or == NULL or malloc-allocated.
+       If length > 0, then result != NULL.  */
+
+    /* Ensures that allocated >= needed.  Aborts through a jump to
+       out_of_memory if needed is SIZE_MAX or otherwise too big.  */
+#define ENSURE_ALLOCATION(needed) \
+    if ((needed) > allocated)                                               \
+      {                                                                             \
+       size_t memory_size;                                                  \
+       CHAR_T *memory;                                                      \
+                                                                            \
+       allocated = (allocated > 0 ? xtimes (allocated, 2) : 12);            \
+       if ((needed) > allocated)                                            \
+         allocated = (needed);                                              \
+       memory_size = xtimes (allocated, sizeof (CHAR_T));                   \
+       if (size_overflow_p (memory_size))                                   \
+         goto out_of_memory;                                                \
+       if (result == resultbuf || result == NULL)                           \
+         memory = (CHAR_T *) malloc (memory_size);                          \
+       else                                                                 \
+         memory = (CHAR_T *) realloc (result, memory_size);                 \
+       if (memory == NULL)                                                  \
+         goto out_of_memory;                                                \
+       if (result == resultbuf && length > 0)                               \
+         memcpy (memory, result, length * sizeof (CHAR_T));                 \
+       result = memory;                                                     \
+      }
+
+    for (cp = format, i = 0, dp = &d.dir[0]; ; cp = dp->dir_end, i++, dp++)
+      {
+       if (cp != dp->dir_start)
+         {
+           size_t n = dp->dir_start - cp;
+           size_t augmented_length = xsum (length, n);
+
+           ENSURE_ALLOCATION (augmented_length);
+           memcpy (result + length, cp, n * sizeof (CHAR_T));
+           length = augmented_length;
+         }
+       if (i == d.count)
+         break;
+
+       /* Execute a single directive.  */
+       if (dp->conversion == '%')
+         {
+           size_t augmented_length;
+
+           if (!(dp->arg_index == ARG_NONE))
+             abort ();
+           augmented_length = xsum (length, 1);
+           ENSURE_ALLOCATION (augmented_length);
+           result[length] = '%';
+           length = augmented_length;
+         }
+       else
+         {
+           if (!(dp->arg_index != ARG_NONE))
+             abort ();
+
+           if (dp->conversion == 'n')
+             {
+               switch (a.arg[dp->arg_index].type)
+                 {
+                 case TYPE_COUNT_SCHAR_POINTER:
+                   *a.arg[dp->arg_index].a.a_count_schar_pointer = length;
+                   break;
+                 case TYPE_COUNT_SHORT_POINTER:
+                   *a.arg[dp->arg_index].a.a_count_short_pointer = length;
+                   break;
+                 case TYPE_COUNT_INT_POINTER:
+                   *a.arg[dp->arg_index].a.a_count_int_pointer = length;
+                   break;
+                 case TYPE_COUNT_LONGINT_POINTER:
+                   *a.arg[dp->arg_index].a.a_count_longint_pointer = length;
+                   break;
+#ifdef HAVE_LONG_LONG
+                 case TYPE_COUNT_LONGLONGINT_POINTER:
+                   *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;
+                   break;
+#endif
+                 default:
+                   abort ();
+                 }
+             }
+           else
+             {
+               arg_type type = a.arg[dp->arg_index].type;
+               CHAR_T *p;
+               unsigned int prefix_count;
+               int prefixes[2];
+#if !USE_SNPRINTF
+               size_t tmp_length;
+               CHAR_T tmpbuf[700];
+               CHAR_T *tmp;
+
+               /* Allocate a temporary buffer of sufficient size for calling
+                  sprintf.  */
+               {
+                 size_t width;
+                 size_t precision;
+
+                 width = 0;
+                 if (dp->width_start != dp->width_end)
+                   {
+                     if (dp->width_arg_index != ARG_NONE)
+                       {
+                         int arg;
+
+                         if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+                           abort ();
+                         arg = a.arg[dp->width_arg_index].a.a_int;
+                         width = (arg < 0 ? (unsigned int) (-arg) : arg);
+                       }
+                     else
+                       {
+                         const CHAR_T *digitp = dp->width_start;
+
+                         do
+                           width = xsum (xtimes (width, 10), *digitp++ - '0');
+                         while (digitp != dp->width_end);
+                       }
+                   }
+
+                 precision = 6;
+                 if (dp->precision_start != dp->precision_end)
+                   {
+                     if (dp->precision_arg_index != ARG_NONE)
+                       {
+                         int arg;
+
+                         if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+                           abort ();
+                         arg = a.arg[dp->precision_arg_index].a.a_int;
+                         precision = (arg < 0 ? 0 : arg);
+                       }
+                     else
+                       {
+                         const CHAR_T *digitp = dp->precision_start + 1;
+
+                         precision = 0;
+                         do
+                           precision = xsum (xtimes (precision, 10), *digitp++ - '0');
+                         while (digitp != dp->precision_end);
+                       }
+                   }
+
+                 switch (dp->conversion)
+                   {
+
+                   case 'd': case 'i': case 'u':
+# ifdef HAVE_LONG_LONG
+                     if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+                                         * 0.30103 /* binary -> decimal */
+                                         * 2 /* estimate for FLAG_GROUP */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 1; /* account for leading sign */
+                     else
+# endif
+                     if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+                                         * 0.30103 /* binary -> decimal */
+                                         * 2 /* estimate for FLAG_GROUP */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 1; /* account for leading sign */
+                     else
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+                                         * 0.30103 /* binary -> decimal */
+                                         * 2 /* estimate for FLAG_GROUP */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 1; /* account for leading sign */
+                     break;
+
+                   case 'o':
+# ifdef HAVE_LONG_LONG
+                     if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+                                         * 0.333334 /* binary -> octal */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 1; /* account for leading sign */
+                     else
+# endif
+                     if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+                                         * 0.333334 /* binary -> octal */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 1; /* account for leading sign */
+                     else
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+                                         * 0.333334 /* binary -> octal */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 1; /* account for leading sign */
+                     break;
+
+                   case 'x': case 'X':
+# ifdef HAVE_LONG_LONG
+                     if (type == TYPE_LONGLONGINT || type == TYPE_ULONGLONGINT)
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned long long) * CHAR_BIT
+                                         * 0.25 /* binary -> hexadecimal */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 2; /* account for leading sign or alternate form */
+                     else
+# endif
+                     if (type == TYPE_LONGINT || type == TYPE_ULONGINT)
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned long) * CHAR_BIT
+                                         * 0.25 /* binary -> hexadecimal */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 2; /* account for leading sign or alternate form */
+                     else
+                       tmp_length =
+                         (unsigned int) (sizeof (unsigned int) * CHAR_BIT
+                                         * 0.25 /* binary -> hexadecimal */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 2; /* account for leading sign or alternate form */
+                     break;
+
+                   case 'f': case 'F':
+# ifdef HAVE_LONG_DOUBLE
+                     if (type == TYPE_LONGDOUBLE)
+                       tmp_length =
+                         (unsigned int) (LDBL_MAX_EXP
+                                         * 0.30103 /* binary -> decimal */
+                                         * 2 /* estimate for FLAG_GROUP */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 10; /* sign, decimal point etc. */
+                     else
+# endif
+                       tmp_length =
+                         (unsigned int) (DBL_MAX_EXP
+                                         * 0.30103 /* binary -> decimal */
+                                         * 2 /* estimate for FLAG_GROUP */
+                                        )
+                         + 1 /* turn floor into ceil */
+                         + 10; /* sign, decimal point etc. */
+                     tmp_length = xsum (tmp_length, precision);
+                     break;
+
+                   case 'e': case 'E': case 'g': case 'G':
+                   case 'a': case 'A':
+                     tmp_length =
+                       12; /* sign, decimal point, exponent etc. */
+                     tmp_length = xsum (tmp_length, precision);
+                     break;
+
+                   case 'c':
+# if defined HAVE_WINT_T && !WIDE_CHAR_VERSION
+                     if (type == TYPE_WIDE_CHAR)
+                       tmp_length = MB_CUR_MAX;
+                     else
+# endif
+                       tmp_length = 1;
+                     break;
+
+                   case 's':
+# ifdef HAVE_WCHAR_T
+                     if (type == TYPE_WIDE_STRING)
+                       {
+                         tmp_length =
+                           local_wcslen (a.arg[dp->arg_index].a.a_wide_string);
+
+#  if !WIDE_CHAR_VERSION
+                         tmp_length = xtimes (tmp_length, MB_CUR_MAX);
+#  endif
+                       }
+                     else
+# endif
+                       tmp_length = strlen (a.arg[dp->arg_index].a.a_string);
+                     break;
+
+                   case 'p':
+                     tmp_length =
+                       (unsigned int) (sizeof (void *) * CHAR_BIT
+                                       * 0.25 /* binary -> hexadecimal */
+                                      )
+                         + 1 /* turn floor into ceil */
+                         + 2; /* account for leading 0x */
+                     break;
+
+                   default:
+                     abort ();
+                   }
+
+                 if (tmp_length < width)
+                   tmp_length = width;
+
+                 tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */
+               }
+
+               if (tmp_length <= sizeof (tmpbuf) / sizeof (CHAR_T))
+                 tmp = tmpbuf;
+               else
+                 {
+                   size_t tmp_memsize = xtimes (tmp_length, sizeof (CHAR_T));
+
+                   if (size_overflow_p (tmp_memsize))
+                     /* Overflow, would lead to out of memory.  */
+                     goto out_of_memory;
+                   tmp = (CHAR_T *) malloc (tmp_memsize);
+                   if (tmp == NULL)
+                     /* Out of memory.  */
+                     goto out_of_memory;
+                 }
+#endif
+
+               /* Construct the format string for calling snprintf or
+                  sprintf.  */
+               p = buf;
+               *p++ = '%';
+               if (dp->flags & FLAG_GROUP)
+                 *p++ = '\'';
+               if (dp->flags & FLAG_LEFT)
+                 *p++ = '-';
+               if (dp->flags & FLAG_SHOWSIGN)
+                 *p++ = '+';
+               if (dp->flags & FLAG_SPACE)
+                 *p++ = ' ';
+               if (dp->flags & FLAG_ALT)
+                 *p++ = '#';
+               if (dp->flags & FLAG_ZERO)
+                 *p++ = '0';
+               if (dp->width_start != dp->width_end)
+                 {
+                   size_t n = dp->width_end - dp->width_start;
+                   memcpy (p, dp->width_start, n * sizeof (CHAR_T));
+                   p += n;
+                 }
+               if (dp->precision_start != dp->precision_end)
+                 {
+                   size_t n = dp->precision_end - dp->precision_start;
+                   memcpy (p, dp->precision_start, n * sizeof (CHAR_T));
+                   p += n;
+                 }
+
+               switch (type)
+                 {
+#ifdef HAVE_LONG_LONG
+                 case TYPE_LONGLONGINT:
+                 case TYPE_ULONGLONGINT:
+                   *p++ = 'l';
+                   /*FALLTHROUGH*/
+#endif
+                 case TYPE_LONGINT:
+                 case TYPE_ULONGINT:
+#ifdef HAVE_WINT_T
+                 case TYPE_WIDE_CHAR:
+#endif
+#ifdef HAVE_WCHAR_T
+                 case TYPE_WIDE_STRING:
+#endif
+                   *p++ = 'l';
+                   break;
+#ifdef HAVE_LONG_DOUBLE
+                 case TYPE_LONGDOUBLE:
+                   *p++ = 'L';
+                   break;
+#endif
+                 default:
+                   break;
+                 }
+               *p = dp->conversion;
+#if USE_SNPRINTF
+               p[1] = '%';
+               p[2] = 'n';
+               p[3] = '\0';
+#else
+               p[1] = '\0';
+#endif
+
+               /* Construct the arguments for calling snprintf or sprintf.  */
+               prefix_count = 0;
+               if (dp->width_arg_index != ARG_NONE)
+                 {
+                   if (!(a.arg[dp->width_arg_index].type == TYPE_INT))
+                     abort ();
+                   prefixes[prefix_count++] = a.arg[dp->width_arg_index].a.a_int;
+                 }
+               if (dp->precision_arg_index != ARG_NONE)
+                 {
+                   if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))
+                     abort ();
+                   prefixes[prefix_count++] = a.arg[dp->precision_arg_index].a.a_int;
+                 }
+
+#if USE_SNPRINTF
+               /* Prepare checking whether snprintf returns the count
+                  via %n.  */
+               ENSURE_ALLOCATION (xsum (length, 1));
+               result[length] = '\0';
+#endif
+
+               for (;;)
+                 {
+                   size_t maxlen;
+                   int count;
+                   int retcount;
+
+                   maxlen = allocated - length;
+                   count = -1;
+                   retcount = 0;
+
+#if USE_SNPRINTF
+# define SNPRINTF_BUF(arg) \
+                   switch (prefix_count)                                   \
+                     {                                                     \
+                     case 0:                                               \
+                       retcount = SNPRINTF (result + length, maxlen, buf,  \
+                                            arg, &count);                  \
+                       break;                                              \
+                     case 1:                                               \
+                       retcount = SNPRINTF (result + length, maxlen, buf,  \
+                                            prefixes[0], arg, &count);     \
+                       break;                                              \
+                     case 2:                                               \
+                       retcount = SNPRINTF (result + length, maxlen, buf,  \
+                                            prefixes[0], prefixes[1], arg, \
+                                            &count);                       \
+                       break;                                              \
+                     default:                                              \
+                       abort ();                                           \
+                     }
+#else
+# define SNPRINTF_BUF(arg) \
+                   switch (prefix_count)                                   \
+                     {                                                     \
+                     case 0:                                               \
+                       count = sprintf (tmp, buf, arg);                    \
+                       break;                                              \
+                     case 1:                                               \
+                       count = sprintf (tmp, buf, prefixes[0], arg);       \
+                       break;                                              \
+                     case 2:                                               \
+                       count = sprintf (tmp, buf, prefixes[0], prefixes[1],\
+                                        arg);                              \
+                       break;                                              \
+                     default:                                              \
+                       abort ();                                           \
+                     }
+#endif
+
+                   switch (type)
+                     {
+                     case TYPE_SCHAR:
+                       {
+                         int arg = a.arg[dp->arg_index].a.a_schar;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_UCHAR:
+                       {
+                         unsigned int arg = a.arg[dp->arg_index].a.a_uchar;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_SHORT:
+                       {
+                         int arg = a.arg[dp->arg_index].a.a_short;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_USHORT:
+                       {
+                         unsigned int arg = a.arg[dp->arg_index].a.a_ushort;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_INT:
+                       {
+                         int arg = a.arg[dp->arg_index].a.a_int;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_UINT:
+                       {
+                         unsigned int arg = a.arg[dp->arg_index].a.a_uint;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_LONGINT:
+                       {
+                         long int arg = a.arg[dp->arg_index].a.a_longint;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_ULONGINT:
+                       {
+                         unsigned long int arg = a.arg[dp->arg_index].a.a_ulongint;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#ifdef HAVE_LONG_LONG
+                     case TYPE_LONGLONGINT:
+                       {
+                         long long int arg = a.arg[dp->arg_index].a.a_longlongint;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     case TYPE_ULONGLONGINT:
+                       {
+                         unsigned long long int arg = a.arg[dp->arg_index].a.a_ulonglongint;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#endif
+                     case TYPE_DOUBLE:
+                       {
+                         double arg = a.arg[dp->arg_index].a.a_double;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#ifdef HAVE_LONG_DOUBLE
+                     case TYPE_LONGDOUBLE:
+                       {
+                         long double arg = a.arg[dp->arg_index].a.a_longdouble;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#endif
+                     case TYPE_CHAR:
+                       {
+                         int arg = a.arg[dp->arg_index].a.a_char;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#ifdef HAVE_WINT_T
+                     case TYPE_WIDE_CHAR:
+                       {
+                         wint_t arg = a.arg[dp->arg_index].a.a_wide_char;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#endif
+                     case TYPE_STRING:
+                       {
+                         const char *arg = a.arg[dp->arg_index].a.a_string;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#ifdef HAVE_WCHAR_T
+                     case TYPE_WIDE_STRING:
+                       {
+                         const wchar_t *arg = a.arg[dp->arg_index].a.a_wide_string;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+#endif
+                     case TYPE_POINTER:
+                       {
+                         void *arg = a.arg[dp->arg_index].a.a_pointer;
+                         SNPRINTF_BUF (arg);
+                       }
+                       break;
+                     default:
+                       abort ();
+                     }
+
+#if USE_SNPRINTF
+                   /* Portability: Not all implementations of snprintf()
+                      are ISO C 99 compliant.  Determine the number of
+                      bytes that snprintf() has produced or would have
+                      produced.  */
+                   if (count >= 0)
+                     {
+                       /* Verify that snprintf() has NUL-terminated its
+                          result.  */
+                       if (count < maxlen && result[length + count] != '\0')
+                         abort ();
+                       /* Portability hack.  */
+                       if (retcount > count)
+                         count = retcount;
+                     }
+                   else
+                     {
+                       /* snprintf() doesn't understand the '%n'
+                          directive.  */
+                       if (p[1] != '\0')
+                         {
+                           /* Don't use the '%n' directive; instead, look
+                              at the snprintf() return value.  */
+                           p[1] = '\0';
+                           continue;
+                         }
+                       else
+                         {
+                           /* Look at the snprintf() return value.  */
+                           if (retcount < 0)
+                             {
+                               /* HP-UX 10.20 snprintf() is doubly deficient:
+                                  It doesn't understand the '%n' directive,
+                                  *and* it returns -1 (rather than the length
+                                  that would have been required) when the
+                                  buffer is too small.  */
+                               size_t bigger_need =
+                                 xsum (xtimes (allocated, 2), 12);
+                               ENSURE_ALLOCATION (bigger_need);
+                               continue;
+                             }
+                           else
+                             count = retcount;
+                         }
+                     }
+#endif
+
+                   /* Attempt to handle failure.  */
+                   if (count < 0)
+                     {
+                       if (!(result == resultbuf || result == NULL))
+                         free (result);
+                       if (buf_malloced != NULL)
+                         free (buf_malloced);
+                       CLEANUP ();
+                       errno = EINVAL;
+                       return NULL;
+                     }
+
+#if !USE_SNPRINTF
+                   if (count >= tmp_length)
+                     /* tmp_length was incorrectly calculated - fix the
+                        code above!  */
+                     abort ();
+#endif
+
+                   /* Make room for the result.  */
+                   if (count >= maxlen)
+                     {
+                       /* Need at least count bytes.  But allocate
+                          proportionally, to avoid looping eternally if
+                          snprintf() reports a too small count.  */
+                       size_t n =
+                         xmax (xsum (length, count), xtimes (allocated, 2));
+
+                       ENSURE_ALLOCATION (n);
+#if USE_SNPRINTF
+                       continue;
+#endif
+                     }
+
+#if USE_SNPRINTF
+                   /* The snprintf() result did fit.  */
+#else
+                   /* Append the sprintf() result.  */
+                   memcpy (result + length, tmp, count * sizeof (CHAR_T));
+                   if (tmp != tmpbuf)
+                     free (tmp);
+#endif
+
+                   length += count;
+                   break;
+                 }
+             }
+         }
+      }
+
+    /* Add the final NUL.  */
+    ENSURE_ALLOCATION (xsum (length, 1));
+    result[length] = '\0';
+
+    if (result != resultbuf && length + 1 < allocated)
+      {
+       /* Shrink the allocated memory if possible.  */
+       CHAR_T *memory;
+
+       memory = (CHAR_T *) realloc (result, (length + 1) * sizeof (CHAR_T));
+       if (memory != NULL)
+         result = memory;
+      }
+
+    if (buf_malloced != NULL)
+      free (buf_malloced);
+    CLEANUP ();
+    *lengthp = length;
+    return result;
+
+  out_of_memory:
+    if (!(result == resultbuf || result == NULL))
+      free (result);
+    if (buf_malloced != NULL)
+      free (buf_malloced);
+  out_of_memory_1:
+    CLEANUP ();
+    errno = ENOMEM;
+    return NULL;
+  }
+}
+
+#undef SNPRINTF
+#undef USE_SNPRINTF
+#undef PRINTF_PARSE
+#undef DIRECTIVES
+#undef DIRECTIVE
+#undef CHAR_T
+#undef VASNPRINTF
diff --git a/intl/vasnprintf.h b/intl/vasnprintf.h
new file mode 100644 (file)
index 0000000..5c62fb2
--- /dev/null
@@ -0,0 +1,61 @@
+/* vsprintf with automatic memory allocation.
+   Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _VASNPRINTF_H
+#define _VASNPRINTF_H
+
+/* Get va_list.  */
+#include <stdarg.h>
+
+/* Get size_t.  */
+#include <stddef.h>
+
+#ifndef __attribute__
+/* This feature is available in gcc versions 2.5 and later.  */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__
+#  define __attribute__(Spec) /* empty */
+# endif
+/* The __-protected variants of `format' and `printf' attributes
+   are accepted by gcc versions 2.6.4 (effectively 2.7) and later.  */
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+#  define __format__ format
+#  define __printf__ printf
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+   You can pass a preallocated buffer for the result in RESULTBUF and its
+   size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+   If successful, return the address of the string (this may be = RESULTBUF
+   if no dynamic memory allocation was necessary) and set *LENGTHP to the
+   number of resulting bytes, excluding the trailing NUL.  Upon error, set
+   errno and return NULL.  */
+extern char * asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...)
+       __attribute__ ((__format__ (__printf__, 3, 4)));
+extern char * vasnprintf (char *resultbuf, size_t *lengthp, const char *format, va_list args)
+       __attribute__ ((__format__ (__printf__, 3, 0)));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNPRINTF_H */
diff --git a/intl/vasnwprintf.h b/intl/vasnwprintf.h
new file mode 100644 (file)
index 0000000..6ff03ce
--- /dev/null
@@ -0,0 +1,46 @@
+/* vswprintf with automatic memory allocation.
+   Copyright (C) 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _VASNWPRINTF_H
+#define _VASNWPRINTF_H
+
+/* Get va_list.  */
+#include <stdarg.h>
+
+/* Get wchar_t, size_t.  */
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Write formatted output to a string dynamically allocated with malloc().
+   You can pass a preallocated buffer for the result in RESULTBUF and its
+   size in *LENGTHP; otherwise you pass RESULTBUF = NULL.
+   If successful, return the address of the string (this may be = RESULTBUF
+   if no dynamic memory allocation was necessary) and set *LENGTHP to the
+   number of resulting bytes, excluding the trailing NUL.  Upon error, set
+   errno and return NULL.  */
+extern wchar_t * asnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, ...);
+extern wchar_t * vasnwprintf (wchar_t *resultbuf, size_t *lengthp, const wchar_t *format, va_list args);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VASNWPRINTF_H */
diff --git a/intl/wprintf-parse.h b/intl/wprintf-parse.h
new file mode 100644 (file)
index 0000000..600b89a
--- /dev/null
@@ -0,0 +1,75 @@
+/* Parse printf format string.
+   Copyright (C) 1999, 2002-2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _WPRINTF_PARSE_H
+#define _WPRINTF_PARSE_H
+
+#include "printf-args.h"
+
+
+/* Flags */
+#define FLAG_GROUP      1      /* ' flag */
+#define FLAG_LEFT       2      /* - flag */
+#define FLAG_SHOWSIGN   4      /* + flag */
+#define FLAG_SPACE      8      /* space flag */
+#define FLAG_ALT       16      /* # flag */
+#define FLAG_ZERO      32
+
+/* arg_index value indicating that no argument is consumed.  */
+#define ARG_NONE       (~(size_t)0)
+
+/* A parsed directive.  */
+typedef struct
+{
+  const wchar_t* dir_start;
+  const wchar_t* dir_end;
+  int flags;
+  const wchar_t* width_start;
+  const wchar_t* width_end;
+  size_t width_arg_index;
+  const wchar_t* precision_start;
+  const wchar_t* precision_end;
+  size_t precision_arg_index;
+  wchar_t conversion; /* d i o u x X f e E g G c s p n U % but not C S */
+  size_t arg_index;
+}
+wchar_t_directive;
+
+/* A parsed format string.  */
+typedef struct
+{
+  size_t count;
+  wchar_t_directive *dir;
+  size_t max_width_length;
+  size_t max_precision_length;
+}
+wchar_t_directives;
+
+
+/* Parses the format string.  Fills in the number N of directives, and fills
+   in directives[0], ..., directives[N-1], and sets directives[N].dir_start
+   to the end of the format string.  Also fills in the arg_type fields of the
+   arguments and the needed count of arguments.  */
+#ifdef STATIC
+STATIC
+#else
+extern
+#endif
+int wprintf_parse (const wchar_t *format, wchar_t_directives *d, arguments *a);
+
+#endif /* _WPRINTF_PARSE_H */
diff --git a/intl/xsize.h b/intl/xsize.h
new file mode 100644 (file)
index 0000000..b3023a7
--- /dev/null
@@ -0,0 +1,109 @@
+/* xsize.h -- Checked size_t computations.
+
+   Copyright (C) 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU Library General Public License as published
+   by the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+   USA.  */
+
+#ifndef _XSIZE_H
+#define _XSIZE_H
+
+/* Get size_t.  */
+#include <stddef.h>
+
+/* Get SIZE_MAX.  */
+#include <limits.h>
+#if HAVE_STDINT_H
+# include <stdint.h>
+#endif
+
+/* The size of memory objects is often computed through expressions of
+   type size_t. Example:
+      void* p = malloc (header_size + n * element_size).
+   These computations can lead to overflow.  When this happens, malloc()
+   returns a piece of memory that is way too small, and the program then
+   crashes while attempting to fill the memory.
+   To avoid this, the functions and macros in this file check for overflow.
+   The convention is that SIZE_MAX represents overflow.
+   malloc (SIZE_MAX) is not guaranteed to fail -- think of a malloc
+   implementation that uses mmap --, it's recommended to use size_overflow_p()
+   or size_in_bounds_p() before invoking malloc().
+   The example thus becomes:
+      size_t size = xsum (header_size, xtimes (n, element_size));
+      void *p = (size_in_bounds_p (size) ? malloc (size) : NULL);
+*/
+
+/* Convert an arbitrary value >= 0 to type size_t.  */
+#define xcast_size_t(N) \
+  ((N) <= SIZE_MAX ? (size_t) (N) : SIZE_MAX)
+
+/* Sum of two sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum (size_t size1, size_t size2)
+{
+  size_t sum = size1 + size2;
+  return (sum >= size1 ? sum : SIZE_MAX);
+}
+
+/* Sum of three sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum3 (size_t size1, size_t size2, size_t size3)
+{
+  return xsum (xsum (size1, size2), size3);
+}
+
+/* Sum of four sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xsum4 (size_t size1, size_t size2, size_t size3, size_t size4)
+{
+  return xsum (xsum (xsum (size1, size2), size3), size4);
+}
+
+/* Maximum of two sizes, with overflow check.  */
+static inline size_t
+#if __GNUC__ >= 3
+__attribute__ ((__pure__))
+#endif
+xmax (size_t size1, size_t size2)
+{
+  /* No explicit check is needed here, because for any n:
+     max (SIZE_MAX, n) == SIZE_MAX and max (n, SIZE_MAX) == SIZE_MAX.  */
+  return (size1 >= size2 ? size1 : size2);
+}
+
+/* Multiplication of a count with an element size, with overflow check.
+   The count must be >= 0 and the element size must be > 0.
+   This is a macro, not an inline function, so that it works correctly even
+   when N is of a wider tupe and N > SIZE_MAX.  */
+#define xtimes(N, ELSIZE) \
+  ((N) <= SIZE_MAX / (ELSIZE) ? (size_t) (N) * (ELSIZE) : SIZE_MAX)
+
+/* Check for overflow.  */
+#define size_overflow_p(SIZE) \
+  ((SIZE) == SIZE_MAX)
+/* Check against overflow.  */
+#define size_in_bounds_p(SIZE) \
+  ((SIZE) != SIZE_MAX)
+
+#endif /* _XSIZE_H */
diff --git a/keyserver/ChangeLog b/keyserver/ChangeLog
new file mode 100644 (file)
index 0000000..b720aee
--- /dev/null
@@ -0,0 +1,1142 @@
+2006-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.c (classify_ks_search): Try and recognize a key ID even
+       without the 0x prefix.  This isn't exact (it's possible that a
+       user ID string happens to be 8 or 16 digits of hex), but it's
+       extremely unlikely.  Plus GPG itself makes the same assumption.
+
+       * gpgkeys_hkp.c (search_key): HKP keyservers like the 0x to be
+       present when searching by keyID.
+
+2006-11-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (curl_mrindex_writer): Revert previous change.
+       Key-not-found still has a HTML response.
+
+2006-10-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (curl_mrindex_writer): Print a warning if we see
+       HTML coming back from a MR hkp query.
+
+2006-09-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Link gpgkeys_ldap to libcompat.a.
+
+       * gpgkeys_ldap.c, ksutil.h, ksutil.c: Remove hextobyte instead of
+       ks_hextobyte as it is provided by libcompat now.
+
+       * gpgkeys_ldap.c (build_attrs), ksutil.c (ks_toupper,
+       ks_strcasecmp), ksutil.h: Remove the need for strcasecmp as the
+       field tags are always lowercase.
+
+2006-09-26  Werner Koch  <wk@g10code.com>
+
+       * gpgkeys_finger.c (get_key): Cast away signed/unsigned char ptr
+       mismatches.
+
+       * ksutil.c (ks_hextobyte, ks_toupper, ks_strcasecmp): New.  Use
+       them instead of there ascii_foo counterparts.
+       * gpgkeys_ldap.c (main): Replaced BUG by assert.
+
+       * gpgkeys_curl.c, gpgkeys_hkp.c, gpgkeys_ldap.c, ksutil.c:
+       * ksutil.h: Add special license exception for OpenSSL.  This helps
+       to avoid license conflicts if OpenLDAP or cURL is linked against
+       OpenSSL and we would thus indirectly link to OpenSSL.  This is
+       considered a bug fix and forgives all possible violations,
+       pertaining to this issue, possibly occured in the past.
+
+2006-07-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Fix missing include path for gpgkeys_finger (needs
+       the libcurl path, even though it doesn't use libcurl because of
+       ksutil.c:curl_err_to_gpg_err().  Noted by Gilbert Fernandes.
+
+2006-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * curl-shim.c (curl_easy_perform): Minor cleanup of proxy code.
+
+2006-07-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key), gpgkeys_ldap.c (send_key,
+       send_key_keyserver): Improved version of previous fix.  Force
+       match on spaces in string.
+
+2006-07-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key), gpgkeys_ldap.c (send_key,
+       send_key_keyserver): Fix string matching problem when the ascii
+       armored form of the key happens to match "KEY" at the beginning of
+       the line.
+
+2006-07-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (printquoted), curl-shim.c (curl_escape): Fix bad
+       encoding of characters > 127.  Noted by Nalin Dahyabhai.
+
+2006-04-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_http.c, gpgkeys_oldhkp.c: Removed.
+
+       * Makefile.am: Don't build gpgkeys_http or gpgkeys_(old)hkp any
+       longer as this is done via curl or fake-curl.
+
+       * ksutil.h, ksutil.c, gpgkeys_hkp.c, gpgkeys_curl.c: Minor
+       #include tweaks as FAKE_CURL is no longer meaningful.
+
+2006-04-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (ldap_quote, get_name, search_key): LDAP-quote
+       directly into place rather than mallocing temporary buffers.
+
+       * gpgkeys_ldap.c (get_name): Build strings with strcat rather than
+       using sprintf which is harder to read and modify.
+
+       * ksutil.h, ksutil.c (classify_ks_search): Add
+       KS_SEARCH_KEYID_SHORT and KS_SEARCH_KEYID_LONG to search for a key
+       ID.
+
+       * gpgkeys_ldap.c (search_key): Use it here to flip from pgpUserID
+       searches to pgpKeyID or pgpCertID.
+
+2006-03-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c: #define LDAP_DEPRECATED for newer OpenLDAPs so
+       they use the regular old API that is compatible with other LDAP
+       libraries.
+
+2006-03-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main): Fix build problem with non-OpenLDAP LDAP
+       libraries that have TLS.
+
+2006-02-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.c (init_ks_options): Default include-revoked and
+       include-subkeys to on, as gpg isn't doing this any longer.
+
+2006-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (get_name): A GETNAME query turns exact=on to cut
+       down on odd matches.
+
+2006-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (make_one_attr, build_attrs, send_key): Don't
+       allow duplicate attributes as OpenLDAP is now enforcing this.
+
+       * gpgkeys_ldap.c (main): Add binddn and bindpw so users can pass
+       credentials to a remote LDAP server.
+
+       * curl-shim.h, curl-shim.c (curl_easy_init, curl_easy_setopt,
+       curl_easy_perform): Mingw has 'stderr' as a macro?
+
+       * curl-shim.h, curl-shim.c (curl_easy_init, curl_easy_setopt,
+       curl_easy_perform): Add CURLOPT_VERBOSE and CURLOPT_STDERR for
+       easier debugging.
+
+2006-01-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key): Do not escape the '=' in the HTTP POST
+       when uploading a key.
+
+2005-12-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, ksutil.c (parse_ks_options): New keyserver command
+       "getname".
+
+       * gpgkeys_hkp.c (main, get_name), gpgkeys_ldap.c (main, get_name):
+       Use it here to do direct name (rather than key ID) fetches.
+
+2005-12-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, ksutil.c (curl_armor_writer, curl_writer,
+       curl_writer_finalize): New functionality to handle binary format
+       keys by armoring them for input to GPG.
+
+       * gpgkeys_curl.c (get_key), gpgkeys_hkp.c (get_key): Call it here.
+
+2005-12-07  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_finger.c (get_key), gpgkeys_curl.c (get_key): Better
+       language for the key-not-found error.
+
+       * ksutil.c (curl_err_to_gpg_err): Add CURLE_OK and
+       CURLE_COULDNT_CONNECT.
+
+       * gpgkeys_curl.c (get_key): Give key-not-found error if no data is
+       found (or file itself is not found) during a fetch.
+
+2005-12-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * curl-shim.c (curl_easy_perform): Fix build warning (code before
+       declaration).
+
+2005-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (search_key): Fix warning with typecast (though
+       curl should really have defined that char * as const).
+
+2005-08-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, ksutil.c (parse_ks_options): Remove exact-name and
+       exact-email.
+       (classify_ks_search): Mimic the gpg search modes instead with *,
+       =, <, and @.
+
+       * gpgkeys_ldap.c (search_key), gpgkeys_hkp.c (search_key): Call
+       them here.  Suggested by Jason Harris.
+
+2005-08-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, ksutil.c (parse_ks_options): New keyserver-option
+       exact-name.  The last of exact-name and exact-email overrides the
+       earlier.
+
+       * gpgkeys_ldap.c (search_key), gpgkeys_hkp.c (search_key): Use it
+       here to do a name-only search.
+
+       * gpgkeys_ldap.c (ldap_quote): \-quote a string for LDAP.
+
+       * gpgkeys_ldap.c (search_key): Use it here to escape reserved
+       characters in searches.
+
+2005-08-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, ksutil.c (parse_ks_options): New keyserver-option
+       exact-email.
+
+       * gpgkeys_ldap.c (search_key), gpgkeys_hkp.c (search_key): Use it
+       here to do an email-only search.
+
+2005-08-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Include LDAP_CPPFLAGS when building LDAP.
+
+2005-08-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (main), gpgkeys_curl.c (main), curl-shim.h: Show
+       version of curl (or curl-shim) when debug is set.
+
+2005-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_curl.c (get_key, main): Don't try and be smart about
+       what protocols we handle.  Directly pass them to curl or fake-curl
+       and see if an error comes back.
+
+       * curl-shim.h, curl-shim.c (handle_error), ksutil.c
+       (curl_err_to_gpg_err): Add support for CURLE_UNSUPPORTED_PROTOCOL
+       in fake curl.
+
+       * Makefile.am: Don't need -DFAKE_CURL any longer since it's in
+       config.h.
+
+2005-06-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_mailto.in, gpgkeys_test.in: Use @VERSION@ so version
+       string stays up to date.
+
+       * gpgkeys_http.c: Don't need to define HTTP_PROXY_ENV here since
+       it's in ksutil.h.
+
+       * gpgkeys_curl.c (get_key, main), gpgkeys_hkp.c (main): Pass AUTH
+       values to curl or curl-shim.
+
+       * curl-shim.c (curl_easy_perform), gpgkeys_curl.c (main),
+       gpgkeys_hkp.c (main): Use curl-style proxy semantics.
+
+       * curl-shim.h, curl-shim.c (curl_easy_setopt, curl_easy_perform):
+       Add CURLOPT_USERPWD option for HTTP auth.
+
+       * gpgkeys_http.c (get_key), gpgkeys_oldhkp (send_key, get_key,
+       search_key): No longer need to pass a proxyauth.
+
+       * gpgkeys_http.c (get_key): Pass auth outside of the URL.
+
+2005-06-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_http.c (get_key), gpgkeys_oldhkp.c (send_key, get_key,
+       search_key): Fix http_open/http_open_document calls to pass NULL
+       for auth and proxyauth since these programs pass them in the URL.
+
+2005-06-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (append_path, send_key, get_key, search_key,
+       main), gpgkeys_oldhkp.c (main): Properly handle double slashes in
+       paths.
+
+2005-06-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.c (init_ks_options, parse_ks_options): Provide a default
+       "/" path unless overridden by the config.  Allow config to specify
+       items multiple times and take the last specified item.
+
+2005-06-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c, gpgkeys_oldhkp.c: Add support for HKP servers
+       that aren't at the root path.  Suggested by Jack Bates.
+
+2005-06-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.c [HAVE_DOSISH_SYSTEM]: Fix warnings on mingw32.  Noted
+       by Joe Vender.
+
+2005-05-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, ksutil.c: #ifdef so we can build without libcurl or
+       fake-curl.
+
+2005-05-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_http.c: Need GET defined.
+
+2005-05-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c, gpgkeys_oldhkp.c, ksutil.h: Some minor cleanup
+       and comments as to the size of MAX_LINE and MAX_URL.
+
+2005-04-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c: New hkp handler that uses curl or curl-shim.
+
+       * Makefile.am: Build new gpgkeys_hkp.
+
+       * curl-shim.c (curl_easy_perform): Cleanup.
+
+       * ksutil.h, ksutil.c (curl_writer), gpgkeys_curl.c (get_key): Pass
+       a context to curl_writer so we can support multiple fetches in a
+       single session.
+
+       * curl-shim.h, curl-shim.c (handle_error, curl_easy_setopt,
+       curl_easy_perform): Add POST functionality to the curl shim.
+
+       * curl-shim.h, curl-shim.c (curl_escape, curl_free): Emulate
+       curl_escape and curl_free.
+
+       * gpgkeys_curl.c (main): If the http-proxy option is given without
+       any arguments, try to get the proxy from the environment.
+
+       * ksutil.h, ksutil.c (curl_err_to_gpg_err, curl_writer): Copy from
+       gpgkeys_curl.c.
+
+       * gpgkeys_oldhkp.c: Copy from gpgkeys_hkp.c.
+
+2005-03-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c, ksutil.h, ksutil.c (print_nocr): Moved from
+       gpgkeys_ldap.c.  Print a string, but strip out any CRs.
+
+       * gpgkeys_finger.c (get_key), gpgkeys_hkp.c (get_key),
+       gpgkeys_http.c (get_key): Use it here when outputting key material
+       to canonicalize line endings.
+
+2005-03-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main): Fix three wrong calls to fail_all().
+       Noted by Stefan Bellon.
+
+2005-03-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.c (parse_ks_options): Handle verbose=nnn.
+
+       * Makefile.am: Calculate GNUPG_LIBEXECDIR directly.  Do not
+       redefine $libexecdir.
+
+       * gpgkeys_curl.c, gpgkeys_finger.c, gpgkeys_ldap.c: Start using
+       parse_ks_options and remove a lot of common code.
+
+       * ksutil.h, ksutil.c (parse_ks_options): Parse OPAQUE, and default
+       debug with no arguments to 1.
+
+2005-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c: Include lber.h if configure determines we need
+       it.
+
+       * ksutil.h, ksutil.c (ks_action_to_string): New.
+       (free_ks_options): Only free if options exist.
+
+       * ksutil.h, ksutil.c (init_ks_options, free_ks_options,
+       parse_ks_options): Pull a lot of duplicated code into a single
+       options parser for all keyserver helpers.
+
+2005-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * curl-shim.c (curl_easy_perform): Fix compile warning.
+
+       * curl-shim.h, gpgkeys_curl.c (main), gpgkeys_ldap.c (main): Add
+       ca-cert-file option, to pass in the SSL cert.
+
+       * curl-shim.h, curl-shim.c: New.  This is code to fake the curl
+       API in terms of the current HTTP iobuf API.
+
+       * gpgkeys_curl.c [FAKE_CURL], Makefile.am: If FAKE_CURL is set,
+       link with the iobuf code rather than libcurl.
+
+2005-02-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_finger.c (main), gpgkeys_hkp.c (main): Fix --version
+       output.
+
+       * gpgkeys_curl.c (main): Make sure the curl handle is cleaned up
+       on failure.
+
+2005-02-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (get_key), gpgkeys_http.c (get_key): Fix missing
+       http_close() calls.  Noted by Phil Pennock.
+
+       * ksutil.h: Up the default timeout to two minutes.
+
+2005-01-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (print_nocr): New.
+       (get_key): Call it here to canonicalize line endings.
+
+       * gpgkeys_curl.c (writer): Discard everything outside the BEGIN
+       and END lines when retrieving keys.  Canonicalize line endings.
+       (main): Accept FTPS.
+
+2005-01-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main): Add "check-cert" option to disable SSL
+       certificate checking (which is on by default).
+
+       * gpgkeys_curl.c (main): Add "debug" option to match the LDAP
+       helper.  Add "check-cert" option to disable SSL certificate
+       checking (which is on by default).
+
+2005-01-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_curl.c: Fix typo.
+
+2005-01-18  Werner Koch  <wk@g10code.com>
+
+       * gpgkeys_curl.c: s/MAX_PATH/URLMAX_PATH/g to avoid a clash with
+       the W32 defined macro.  Removed unneeded initialization of static
+       variables.
+       * gpgkeys_http.c: Ditto.
+       * ksutil.h: s/MAX_PATH/URLMAX_PATH/.
+
+2005-01-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_curl.c (main): Only allow specified protocols to use the
+       curl handler.
+
+       * Makefile.am: Use LIBCURL_CPPFLAGS instead of LIBCURL_INCLUDES.
+
+2005-01-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * ksutil.h, gpgkeys_curl.c, gpgkeys_hkp.c, gpgkeys_ldap.c,
+       gpgkeys_finger.c, gpgkeys_http.c: Part 2 of the cleanup.  Move all
+       the various defines to ksutil.h.
+
+       * gpgkeys_finger.c, gpgkeys_hkp.c, gpgkeys_http.c, gpgkeys_ldap.c:
+       Part 1 of a minor cleanup to use #defines instead of hard-coded
+       sizes.
+
+       * gpgkeys_finger.c (connect_server): Use INADDR_NONE instead of
+       SOCKET_ERROR.  Noted by Timo.
+
+2005-01-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_curl.c (get_key): Newer versions of libcurl don't define
+       TRUE.
+
+2004-12-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_curl.c (main): Use new defines for opting out of certain
+       transfer protocols.  Allow setting HTTP proxy via "http-proxy=foo"
+       option (there is natural support in libcurl for the http_proxy
+       environment variable).
+
+       * Makefile.am: Remove the conditional since this is all handled in
+       autoconf now.
+
+2004-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_curl.c (main): New "follow-redirects" option.  Takes an
+       optional numeric value for the maximum number of redirects to
+       allow.  Defaults to 5.
+
+       * gpgkeys_curl.c (main), gpgkeys_finger.c (main), gpgkeys_hkp.c
+       (main), gpgkeys_http.c (main), gpgkeys_ldap.c (main): Make sure
+       that a "timeout" option passed with no arguments is properly
+       handled.
+
+       * gpgkeys_curl.c (get_key, writer): New function to wrap around
+       fwrite to avoid DLL access problem on win32.
+
+       * gpgkeys_http.c (main, get_key): Properly pass authentication
+       info through to the http library.
+
+       * Makefile.am: Build gpgkeys_http or gpgkeys_curl as needed.
+
+       * gpgkeys_curl.c (main, get_key): Minor tweaks to work with either
+       FTP or HTTP.
+
+       * gpgkeys_ftp.c: renamed to gpgkeys_curl.c.
+
+       * gpgkeys_ftp.c (main, get_key): Use auth data as passed by gpg.
+       Use CURLOPT_FILE instead of CURLOPT_WRITEDATA (same option, but
+       backwards compatible).
+
+2004-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ftp.c: New.
+
+       * Makefile.am: Build it if requested.
+
+2004-12-14  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (install-exec-hook, uninstall-hook): Removed.  For
+       Windows reasons we can't use the symlink trick.
+
+2004-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: The harmless "ignored error" on gpgkeys_ldap
+       install on top of an existing install is bound to confuse people.
+       Use ln -s -f to force the overwrite.
+
+2004-10-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_finger.c [_WIN32] (connect_server): Fix typo.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (other_libs): New.  Also include LIBICONV.  Noted by
+       Tim Mooney.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (other_libs): 
+
+2004-10-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key, get_key, search_key): Use "hkp" instead
+       of "x-hkp" so it can be used as a SRV tag.
+
+2004-10-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_finger.c [_WIN32] (connect_server): Fix typo.
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * gpgkeys_ldap.c (main, show_help): Kludge to implement standard
+       GNU options. Factored help printing out.
+       * gpgkeys_finger.c (main, show_help): Ditto.
+       * gpgkeys_hkp.c (main, show_help): Ditto.
+       * gpgkeys_http.c (main, show_help): Ditto.
+       * gpgkeys_test.in, gpgkeys_mailto.in: Implement --version and --help.
+
+       * Makefile.am: Add ksutil.h.
+
+2004-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_finger.c (main): We do not support relay fingering
+       (i.e. "finger://relayhost/user@example.com"), but finger URLs are
+       occasionally miswritten that way.  Give an error in this case.
+
+2004-10-14  Werner Koch  <wk@g10code.com>
+
+       * gpgkeys_finger.c (get_key): s/unsigned char/byte/ due
+       to a strange typedef for RISC OS.  Noted by Stefan.
+
+2004-10-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main), gpgkeys_hkp.c (main), gpgkeys_http.c
+       (main), gpgkeys_finger.c (main): Call timeout functions before
+       performing an action that could block for a long time.
+
+       * ksutil.h, ksutil.c: New.  Right now just contains timeout
+       functions.
+
+2004-10-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_finger.c, gpgkeys_hkp.c, gpgkeys_http.c, gpgkeys_ldap.c:
+       Fix a few occurances of "filename" to `filename'.
+
+2004-10-11  Werner Koch  <wk@g10code.com>
+
+       * gpgkeys_finger.c: New.
+
+2004-08-27  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgkeys_hkp.c (search_key): Fix the prior faulty fix by
+       introducing a cast but leaving skey unsigned.
+
+       * gpgkeys_hkp.c (search_key): Change type of variable skey from
+       unsigned char* to char* to fix type incompatibility.
+
+2004-08-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (get_key, search_key), gpgkeys_hkp.c (get_key,
+       search_key), gpgkeys_http.c (get_key): Do not give informational
+       logs since this is now done inside gpg.
+
+       * gpgkeys_hkp.c (dehtmlize): Understand the quote character
+       (i.e. "&quot;") in HTML responses.
+       (search_key): Search key must be unsigned for url encoder to work
+       properly for 8-bit values.
+
+       * gpgkeys_ldap.c (get_key): Factor out informational display into
+       new function build_info().
+
+       * gpgkeys_ldap.c (build_attrs): Properly terminate user ID strings
+       that got shrunk due to encoding.
+
+2004-08-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (find_basekeyspacedn): Use LDAP_SCOPE_BASE along
+       with a full DN rather than LDAP_SCOPE_ONELEVEL plus a filter to
+       find the pgpServerInfo object.  Some LDAP setups don't like the
+       search.
+       (main): Stop binding to the server since it seems no server really
+       requires it, and some require it not be there.
+
+2004-07-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main): Add "debug" option.  This is only really
+       useful with OpenLDAP, but it's practically vital to debug SSL and
+       TLS setups.  Add "basedn" option.  This allows users to override
+       the autodetection for base DN.  SSL overrides TLS, so TLS will not
+       be started on SSL connections (starting an already started car).
+
+2004-07-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (build_attrs): Add "pgpKeySize" and "pgpSubKeyID"
+       attributes so we can do subkey searches.
+
+       * gpgkeys_ldap.c (main): Under certain error conditions, we might
+       try and unbind twice.  Don't.
+
+       * gpgkeys_ldap.c (join_two_modlists): New.
+       (send_key): Use new function so we can try a modify operation
+       first, and fail over to an add if that fails.  Add cannot cope
+       with the NULLs at the head of the modify request, so we jump into
+       the list in the middle.
+
+2004-07-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main): Don't try and error out before making a
+       ldaps connection to the NAI keyserver since we cannot tell if it
+       is a NAI keyserver until we connect.  Fail if we cannot find a
+       base keyspace DN.  Fix a false success message for TLS being
+       enabled.
+
+2004-07-20  Werner Koch  <wk@gnupg.org>
+
+       * gpgkeys_ldap.c [_WIN32]: Include Windows specific header files.
+       Suggested by Brian Gladman.
+
+2004-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_http.c: General polish and removal of leftover stuff
+       from gpgkeys_hkp.c.
+
+2004-05-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_http.c (get_key): Cosmetic fix - make sure that URLs
+       with no path use a path of "/".
+
+       * gpgkeys_ldap.c (ldap2epochtime): We can always rely on timegm()
+       being available now, since it's a replacement function.
+
+2004-05-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_http.c: New program to do a simple HTTP file fetch using
+       the keyserver interface.
+
+       * Makefile.am: Build it.
+
+2004-02-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Don't split LDADD across two lines since some make
+       programs can't handle blank lines after a \ continuation.  Noted
+       by Christoph Moench-Tegeder.
+
+2004-02-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (send_key): List pgpCertID as one of the deleted
+       attributes.  This guarantees that if something goes wrong, we
+       won't be able to complete the transaction, thus leaving any key
+       already existing on the server intact.
+
+2004-02-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (delete_one_attr): Removed.
+       (make_one_attr): Delete functionality added.  Optional deduping
+       functionality added (currently only used for pgpSignerID).
+       (build_attrs): Translate sig entries into pgpSignerID.  Properly
+       build the timestamp for pgpKeyCreateTime and pgpKeyExpireTime.
+
+2004-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (delete_one_attr): New function to replace
+       attributes with NULL (a "delete" that works even for nonexistant
+       attributes).
+       (send_key): Use it here to remove attributes so a modify operation
+       starts with a clean playing field.  Bias sends to modify before
+       add, since (I suspect) people update their existing keys more
+       often than they make and send new keys to the server.
+
+2004-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (epoch2ldaptime): New.  Converse of
+       ldap2epochtime.
+       (make_one_attr): New. Build a modification list in memory to send
+       to the LDAP server.
+       (build_attrs): New. Parse INFO lines sent over by gpg.
+       (free_mod_values): New.  Unwinds a modification list.
+       (send_key_keyserver): Renamed from old send_key().
+       (send_key): New function to send a key to a LDAP server.
+       (main): Use send_key() for real LDAP servers, send_key_keyserver()
+       otherwise.
+
+2004-02-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c: Replacement prototypes for setenv and unsetenv.
+       (search_key): Catch a SIZELIMIT_EXCEEDED error and show the user
+       whatever the server did give us.
+       (find_basekeyspacedn): There is no guarantee that namingContexts
+       will be readable.
+
+       * Makefile.am: Link gpgkeys_ldap with libutil.a to get the
+       replacement functions (and eventually translations, etc).
+
+2004-02-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (ldap2epochtime): LDAP timestamps are UTC, so do
+       not correct for timezones.
+       (main): Find the basekeyspacedn before we try to start TLS, so we
+       can give a better error message when a user tries to use TLS with
+       a LDAP keyserver.
+
+       * Makefile.am: Add automake conditionals to symlink gpgkeys_ldaps
+       to gpgkeys_ldap when needed.
+
+       * gpgkeys_ldap.c (main): Add support for LDAPS and TLS
+       connections.  These are only useful and usable when talking to
+       real LDAP keyservers.  Add new "tls" option to tune TLS use from
+       off, to try quietly, to try loudly, or to require TLS.
+
+       * gpgkeys_ldap.c (find_basekeyspacedn): New function to figure out
+       what kind of LDAP server we're talking to (either real LDAP or the
+       LDAP keyserver), and return the baseKeySpaceDN to find keys under.
+       (main): Call it from here, and remove the old code that only
+       handled the LDAP keyserver.
+
+2004-02-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (ldap_to_gpg_err): Make sure that
+       LDAP_OPT_ERROR_NUMBER is defined before we use it.
+
+       * gpgkeys_mailto.in: Fix VERSION number.
+
+2004-01-13  Werner Koch  <wk@gnupg.org>
+
+       * gpgkeys_hkp.c (send_key): Add a content type.
+
+2004-01-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (search_key): Catch a mangled input file (useful
+       if something other than GnuPG is calling the program).
+       (main): Avoid possible pre-string write.  Noted by Christian
+       Biere.
+
+       * gpgkeys_ldap.c (main): Avoid possible pre-string write.
+
+2003-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key, get_key, main): Work with new HTTP code
+       that passes the proxy in from the outside.  If the command file
+       sends a proxy, use it.  If it sends "http-proxy" with no
+       arguments, use $http_proxy from the environment.  Suggested by
+       Christian Biere.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgkeys_hkp.c, gpgkeys_ldap.c [__riscos__]: Removal of
+       unnecessary #ifdef __riscos__ sections.
+
+2003-11-27  Werner Koch  <wk@gnupg.org>
+
+       * gpgkeys_hkp.c (get_key): Fixed invalid use of fprintf without
+       format string.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (gpgkeys_hkp_LDADD): Replaced INTLLIBS by LIBINTL.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use W32LIBS where appropriate.
+
+2003-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c, gpgkeys_ldap.c: #include <getopt.h> if it is
+       available.  Also include extern references for optarg and optind
+       since there is no guarantee that any header file will include
+       them.  Standards?  We don't need no stinkin' standards.
+
+       * Makefile.am: Use @GETOPT@ to pull in libiberty on those
+       platforms that need it.
+
+2003-04-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (dehtmlize, parse_hkp_index): Fix memory
+       corruption bug on some platforms.
+
+2003-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (get_key): Properly handle CRLF line endings in
+       the armored key.
+       (main): Accept "try-dns-srv" option.
+
+       * Makefile.am: Use @CAPLIBS@ to link in -lcap if we are using
+       capabilities.  Use @SRVLIBS@ to link in the resolver if we are
+       using DNS SRV.
+
+2003-02-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use a local copy of libexecdir along with @PACKAGE@
+       so it can be easily overridden at make time.
+
+2003-01-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_mailto.in: Fix regexp to work properly if the "keyid" is
+       not a keyid, but rather a text string from the user ID.
+
+2003-01-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (get_key): Use options=mr when getting a key so
+       keyserver doesn't attach the HTML header which we will just have
+       to discard.
+
+2002-11-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (main), gpgkeys_hkp.c (main): Use new keyserver
+       protocol version.
+
+2002-11-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (get_key): The deduping code requires
+       "pgpcertid", but that was not available when running without
+       verbose on.  Noted by Stefan.
+
+2002-11-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (get_key): Fix typo in deduping code.
+
+2002-11-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (key_in_keylist, add_key_to_keylist,
+       free_keylist, get_key, search_key): The LDAP keyserver doesn't
+       remove duplicates, so remove them locally.  Do not include the key
+       modification time in the search response.
+
+2002-11-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (send_key), gpgkeys_ldap.c (send_key): Properly
+       handle an input file that does not include any key data at all.
+
+2002-10-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (main), gpgkeys_ldap.c (main): Add -V flag to
+       output protocol and program version.
+
+2002-10-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Anything linking with libutil.a needs INTLLIBS as
+       well on platforms where INTLLIBS is set.
+
+2002-10-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (write_quoted): Use %-encoding instead of
+       \-encoding.
+       (parse_hkp_index): Use new keyserver key listing format, and add
+       support for disabled keys via include-disabled.
+
+       * gpgkeys_ldap.c (get_key): Don't print keysize unless it's >0.
+       (printquoted): Use %-encoding instead of \-encoding.
+       (search_key): Use new keyserver key listing format.
+
+2002-10-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (search_key, main): Make sure LDAP values are
+       freed in case of error.
+
+       * gpgkeys_ldap.c (fail_all): New function to unwind a keylist and
+       error each item.
+       (main): Call fail_all from here, as needed.  Also add a NO_MEMORY
+       error in an appropriate place and fix error return code.
+       (ldap_err_to_gpg_err): Add KEYSERVER_UNREACHABLE.
+
+       * gpgkeys_hkp.c (fail_all): New function to unwind a keylist and
+       error each item.
+       (main): Call fail_all from here.  Also add a NO_MEMORY error in an
+       appropriate place.
+       (get_key): Use new UNREACHABLE error for network errors.
+
+2002-09-26  Werner Koch  <wk@gnupg.org>
+
+       * gpgkeys_ldap.c (send_key): Removed non-constant initializers.
+
+2002-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (ldap_err_to_gpg_err, ldap_to_gpg_err, send_key,
+       get_key, search_key, main): Some minor error reporting
+       enhancements for use with GPA (show reasons for KEY FAILED).
+
+       * gpgkeys_hkp.c (send_key, get_key, search_key, main): Some minor
+       error reporting enhancements for use with GPA (show reasons for
+       KEY FAILED).
+
+2002-09-20  Werner Koch  <wk@gnupg.org>
+
+       * gpgkeys_hkp.c (handle_old_hkp_index): s/input/inp/ to avoid
+       shadowing warning.
+
+2002-09-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (get_key, handle_old_hkp_index, search_key):
+       Properly handle line truncation.
+
+2002-09-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_mailto.in: Add quasi-RFC-2368 mailto:email@addr?from=
+       syntax so people can set their own email address to respond to.
+
+       * gpgkeys_hkp.c (get_key): Properly respond with KEY FAILED (to
+       gpg) and "key not found" (to user) on failure.
+
+2002-09-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c: (search_key, handle_old_hkp_index): Try and
+       request a machine-readable key index.  If the server supports
+       this, pass it through.  If the server does not support it, parse
+       the "index" page.
+
+2002-09-12  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgkeys_hkp.c: Tidied up RISC OS initializations.
+
+2002-09-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (main): Remove warning - this is no longer
+       experimental code.
+
+2002-09-09  Werner Koch  <wk@gnupg.org>
+
+       * gpgkeys_hkp.c (send_key, get_key, search_key): Check return
+       value of malloc.
+       (dehtmlize): Use ascii_tolower to protect against weird locales.
+       Cast the argument for isspace for the sake of broken HP/UXes.
+       (search_key): Check return value of realloc.
+
+2002-09-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (get_key): Some compilers (RISC OS, HPUX c89)
+       don't like using variables as array initializers.
+
+       * gpgkeys_hkp.c (send_key): Use CRLF in headers.
+
+2002-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (parse_hkp_index): Use same types on all
+       platforms.  This was probably leftover from earlier code where the
+       typing mattered.
+
+       * gpgkeys_hkp.c: Overall cleanup from iobuf conversion.  Be
+       consistent in m_alloc and malloc usage.  Remove include-disabled
+       (meaningless on HKP).  RISC OS tweak.
+
+2002-08-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c, Makefile.am: Convert over to using iobufs.
+
+       * gpgkeys_hkp.c (http_get, http_post): Use CRLF for line endings.
+
+       * gpgkeys_hkp.c: Include util.h on RISC OS as per Stefan.  Include
+       a replacement for hstrerror() for those platforms (such as RISC
+       OS) that don't have it.
+
+2002-08-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: May as well include gpgkeys_hkp.c in the
+       distribution now.  It works well enough without proxies, and isn't
+       built by default.  It would be good to get some test experience
+       with it.
+
+       * gpgkeys_hkp.c (main): Don't warn about include-subkeys - it
+       isn't unsupported, it's actually non-meaningful in the context of
+       HKP (yet).
+
+       * gpgkeys_hkp.c (parse_hkp_index, dehtmlize): Move HTML
+       functionality into new "dehtmlize" function.  Remove HTML before
+       trying to parse each line from the keyserver.  If the keyserver
+       provides key type information in the listing, use it.  (Copy over
+       from g10/hkp.c).
+
+2002-08-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (get_key, parse_hkp_index): Bring over latest code
+       from g10/hkp.c.
+
+       * gpgkeys_ldap.c (get_key): Fix cosmetic URL display problem
+       (extra ":" at the end).
+
+2002-08-03  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgkeys_ldap.c: Tidied up RISC OS initializations.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c: "Warning" -> "WARNING"
+
+2002-07-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Install keyserver helpers in @GNUPG_LIBEXECDIR@
+
+2002-07-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (send_key, get_key, main): Consult the server
+       version string to determine whether to use pgpKey or pgpKeyV2.
+
+2002-07-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_mailto.in: Use new OPAQUE tag for non net-path URIs.
+       Fail more elegantly if there is no email address to send to.  Show
+       the GnuPG version in the message body.
+
+2002-07-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (get_key), gpgkeys_hkp.c (get_key): Display
+       keyserver URI as a URI, but only if verbose.
+
+2002-07-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (parse_hkp_index): Error if the keyserver returns
+       an unparseable HKP response.
+
+       * gpgkeys_hkp.c (main): Warn on honor-http-proxy,
+       broken-http-proxy, and include-subkeys (not supported yet).
+
+       * gpgkeys_ldap.c (main), gpgkeys_hkp.c (http_connect, main): Fix
+       some shadowing warnings.
+
+2002-06-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Don't hard-code the LDAP libraries - get them from
+       LDAPLIBS via configure.  Also, gpgkeys_hkp is a program, not a
+       script.
+
+2002-06-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (include_subkeys): Default "include-subkeys" to
+       off, since GnuPG now defaults it to on.
+
+2002-06-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_hkp.c (parse_hkp_index): Type tweaks.
+
+       * gpgkeys_hkp.c (main): Add experimental code warning.
+
+2002-06-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, gpgkeys_hkp.c (new): Experimental HKP keyserver
+       interface.
+
+2002-05-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c: Include <lber.h> if we absolutely must.  This
+       helps when compiling against a very old OpenLDAP.
+
+2002-04-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_mailto.in: Properly handle key requests in full
+       fingerprint form.
+
+2002-03-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (printquoted): Quote backslashes within keyserver
+       search responses.
+
+2002-02-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap (get_key): LDAP keyservers do not support v3
+       fingerprints, so error out if someone tries.  Actually, they don't
+       support any fingerprints, but at least we can calculate a keyid
+       from a v4 fingerprint.
+
+2002-02-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap: Clarify the notion of a partial failure.  This is
+       possible if more than one key is being handled in a batch, and one
+       fails while the other succeeds.  Note that a search that comes up
+       with no results is not a failure - that is a valid response of "no
+       answer".
+
+       * gpgkeys_ldap.c (get_key): Allow GnuPG to send us full v4
+       fingerprints, long key ids, or short key ids while fetching.
+       Since the LDAP server doesn't actually handle fingerprints, chop
+       them down to long key ids for actual use.
+
+       * gpgkeys_ldap.c (main, get_key): When searching for a keyid,
+       search for subkeys as well as primary keys.  This is mostly
+       significant when automatically fetching the key based on the id in
+       a header (i.e. "signature made by....").  "no-include-subkeys"
+       disables.
+
+2002-02-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c: Fix compiler warning.
+
+       * gpgkeys_ldap.c: Be much more robust with mangled input files.
+
+2001-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_mailto.in: Use the new OUTOFBAND indicator so gpg knows
+       not to try and import anything.  Also turn on perl -w for
+       warnings.
+
+       * gpgkeys_ldap.c (main): If we're using temp files (rather than
+       stdin/stdout), make sure the file is closed when we're done.
+
+2001-12-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * Properly free the LDAP response when we're done with it.
+
+       * Now that we handle multiple keys, we must remove duplicates as
+       the LDAP keyserver returns keys with multiple user IDs multiple
+       times.
+
+       * Properly handle multiple keys with the same key ID (it's really
+       rare, so fetch "0xDEADBEEF" to test this).
+
+2001-12-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c, gpgkeys_mailto.in: Fix GNU capitalization
+       issues.  Prefix log messages with "gpgkeys" to clarify which
+       program is generating them.
+
+2001-12-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgkeys_ldap.c (search_key): Use unsigned int rather than uint
+       for portability.
+
+2001-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * Initial version of gpgkeys_ldap (LDAP keyserver helper) and
+       gpgkeys_mailto (email keyserver helper)
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003,
+          2004 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/keyserver/Makefile.am b/keyserver/Makefile.am
new file mode 100644 (file)
index 0000000..3379910
--- /dev/null
@@ -0,0 +1,54 @@
+# Copyright (C) 2001, 2002, 2004, 2005, 2006 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl
+EXTRA_PROGRAMS = gpgkeys_ldap gpgkeys_hkp gpgkeys_finger gpgkeys_curl
+EXTRA_SCRIPTS = gpgkeys_mailto
+
+gpglibexecdir = $(libexecdir)/@PACKAGE@
+
+gpglibexec_PROGRAMS = @GPGKEYS_LDAP@ @GPGKEYS_HKP@ @GPGKEYS_FINGER@ @GPGKEYS_CURL@
+gpglibexec_SCRIPTS = @GPGKEYS_MAILTO@
+noinst_SCRIPTS = gpgkeys_test
+
+gpgkeys_ldap_SOURCES = gpgkeys_ldap.c ksutil.c ksutil.h
+gpgkeys_hkp_SOURCES = gpgkeys_hkp.c ksutil.c ksutil.h
+gpgkeys_finger_SOURCES = gpgkeys_finger.c ksutil.c ksutil.h
+gpgkeys_curl_SOURCES = gpgkeys_curl.c ksutil.c ksutil.h
+
+other_libs = $(LIBICONV) $(LIBINTL) $(CAPLIBS)
+
+gpgkeys_ldap_CPPFLAGS = @LDAP_CPPFLAGS@
+gpgkeys_ldap_LDADD = ../util/libcompat.a @LDAPLIBS@ @NETLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+
+gpgkeys_finger_LDADD = ../util/libutil.a @NETLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+
+if FAKE_CURL
+gpgkeys_curl_SOURCES += curl-shim.c curl-shim.h
+gpgkeys_curl_LDADD = ../util/libutil.a @NETLIBS@ @DNSLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+gpgkeys_hkp_SOURCES += curl-shim.c curl-shim.h
+gpgkeys_hkp_LDADD = ../util/libutil.a @NETLIBS@ @DNSLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+else
+gpgkeys_curl_CPPFLAGS = @LIBCURL_CPPFLAGS@
+gpgkeys_curl_LDADD = @LIBCURL@ @GETOPT@
+gpgkeys_hkp_CPPFLAGS = @LIBCURL_CPPFLAGS@
+gpgkeys_hkp_LDADD = @LIBCURL@ @GETOPT@
+gpgkeys_finger_CPPFLAGS = @LIBCURL_CPPFLAGS@
+endif
diff --git a/keyserver/Makefile.in b/keyserver/Makefile.in
new file mode 100644 (file)
index 0000000..c262238
--- /dev/null
@@ -0,0 +1,824 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 2001, 2002, 2004, 2005, 2006 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+EXTRA_PROGRAMS = gpgkeys_ldap$(EXEEXT) gpgkeys_hkp$(EXEEXT) \
+       gpgkeys_finger$(EXEEXT) gpgkeys_curl$(EXEEXT)
+gpglibexec_PROGRAMS = @GPGKEYS_LDAP@ @GPGKEYS_HKP@ @GPGKEYS_FINGER@ \
+       @GPGKEYS_CURL@ $(am__empty)
+@FAKE_CURL_TRUE@am__append_1 = curl-shim.c curl-shim.h
+@FAKE_CURL_TRUE@am__append_2 = curl-shim.c curl-shim.h
+subdir = keyserver
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/gpgkeys_mailto.in $(srcdir)/gpgkeys_test.in \
+       ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gpgkeys_mailto gpgkeys_test
+am__installdirs = "$(DESTDIR)$(gpglibexecdir)" \
+       "$(DESTDIR)$(gpglibexecdir)"
+gpglibexecPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(gpglibexec_PROGRAMS)
+am__gpgkeys_curl_SOURCES_DIST = gpgkeys_curl.c ksutil.c ksutil.h \
+       curl-shim.c curl-shim.h
+@FAKE_CURL_TRUE@am__objects_1 = gpgkeys_curl-curl-shim.$(OBJEXT)
+am_gpgkeys_curl_OBJECTS = gpgkeys_curl-gpgkeys_curl.$(OBJEXT) \
+       gpgkeys_curl-ksutil.$(OBJEXT) $(am__objects_1)
+gpgkeys_curl_OBJECTS = $(am_gpgkeys_curl_OBJECTS)
+am__DEPENDENCIES_1 =
+am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+       $(am__DEPENDENCIES_1)
+@FAKE_CURL_TRUE@gpgkeys_curl_DEPENDENCIES = ../util/libutil.a \
+@FAKE_CURL_TRUE@       $(am__DEPENDENCIES_2)
+am_gpgkeys_finger_OBJECTS = gpgkeys_finger-gpgkeys_finger.$(OBJEXT) \
+       gpgkeys_finger-ksutil.$(OBJEXT)
+gpgkeys_finger_OBJECTS = $(am_gpgkeys_finger_OBJECTS)
+gpgkeys_finger_DEPENDENCIES = ../util/libutil.a $(am__DEPENDENCIES_2)
+am__gpgkeys_hkp_SOURCES_DIST = gpgkeys_hkp.c ksutil.c ksutil.h \
+       curl-shim.c curl-shim.h
+@FAKE_CURL_TRUE@am__objects_2 = gpgkeys_hkp-curl-shim.$(OBJEXT)
+am_gpgkeys_hkp_OBJECTS = gpgkeys_hkp-gpgkeys_hkp.$(OBJEXT) \
+       gpgkeys_hkp-ksutil.$(OBJEXT) $(am__objects_2)
+gpgkeys_hkp_OBJECTS = $(am_gpgkeys_hkp_OBJECTS)
+@FAKE_CURL_TRUE@gpgkeys_hkp_DEPENDENCIES = ../util/libutil.a \
+@FAKE_CURL_TRUE@       $(am__DEPENDENCIES_2)
+am_gpgkeys_ldap_OBJECTS = gpgkeys_ldap-gpgkeys_ldap.$(OBJEXT) \
+       gpgkeys_ldap-ksutil.$(OBJEXT)
+gpgkeys_ldap_OBJECTS = $(am_gpgkeys_ldap_OBJECTS)
+gpgkeys_ldap_DEPENDENCIES = ../util/libcompat.a $(am__DEPENDENCIES_2)
+gpglibexecSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(gpglibexec_SCRIPTS) $(noinst_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(gpgkeys_curl_SOURCES) $(gpgkeys_finger_SOURCES) \
+       $(gpgkeys_hkp_SOURCES) $(gpgkeys_ldap_SOURCES)
+DIST_SOURCES = $(am__gpgkeys_curl_SOURCES_DIST) \
+       $(gpgkeys_finger_SOURCES) $(am__gpgkeys_hkp_SOURCES_DIST) \
+       $(gpgkeys_ldap_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl
+EXTRA_SCRIPTS = gpgkeys_mailto
+gpglibexecdir = $(libexecdir)/@PACKAGE@
+gpglibexec_SCRIPTS = @GPGKEYS_MAILTO@
+noinst_SCRIPTS = gpgkeys_test
+gpgkeys_ldap_SOURCES = gpgkeys_ldap.c ksutil.c ksutil.h
+gpgkeys_hkp_SOURCES = gpgkeys_hkp.c ksutil.c ksutil.h $(am__append_2)
+gpgkeys_finger_SOURCES = gpgkeys_finger.c ksutil.c ksutil.h
+gpgkeys_curl_SOURCES = gpgkeys_curl.c ksutil.c ksutil.h \
+       $(am__append_1)
+other_libs = $(LIBICONV) $(LIBINTL) $(CAPLIBS)
+gpgkeys_ldap_CPPFLAGS = @LDAP_CPPFLAGS@
+gpgkeys_ldap_LDADD = ../util/libcompat.a @LDAPLIBS@ @NETLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+gpgkeys_finger_LDADD = ../util/libutil.a @NETLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+@FAKE_CURL_FALSE@gpgkeys_curl_LDADD = @LIBCURL@ @GETOPT@
+@FAKE_CURL_TRUE@gpgkeys_curl_LDADD = ../util/libutil.a @NETLIBS@ @DNSLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+@FAKE_CURL_FALSE@gpgkeys_hkp_LDADD = @LIBCURL@ @GETOPT@
+@FAKE_CURL_TRUE@gpgkeys_hkp_LDADD = ../util/libutil.a @NETLIBS@ @DNSLIBS@ $(other_libs) @GETOPT@ @W32LIBS@
+@FAKE_CURL_FALSE@gpgkeys_curl_CPPFLAGS = @LIBCURL_CPPFLAGS@
+@FAKE_CURL_FALSE@gpgkeys_hkp_CPPFLAGS = @LIBCURL_CPPFLAGS@
+@FAKE_CURL_FALSE@gpgkeys_finger_CPPFLAGS = @LIBCURL_CPPFLAGS@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  keyserver/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  keyserver/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+gpgkeys_mailto: $(top_builddir)/config.status $(srcdir)/gpgkeys_mailto.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gpgkeys_test: $(top_builddir)/config.status $(srcdir)/gpgkeys_test.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-gpglibexecPROGRAMS: $(gpglibexec_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       test -z "$(gpglibexecdir)" || $(mkdir_p) "$(DESTDIR)$(gpglibexecdir)"
+       @list='$(gpglibexec_PROGRAMS)'; for p in $$list; do \
+         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+         if test -f $$p \
+         ; then \
+           f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+          echo " $(INSTALL_PROGRAM_ENV) $(gpglibexecPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(gpglibexecdir)/$$f'"; \
+          $(INSTALL_PROGRAM_ENV) $(gpglibexecPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(gpglibexecdir)/$$f" || exit 1; \
+         else :; fi; \
+       done
+
+uninstall-gpglibexecPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(gpglibexec_PROGRAMS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         echo " rm -f '$(DESTDIR)$(gpglibexecdir)/$$f'"; \
+         rm -f "$(DESTDIR)$(gpglibexecdir)/$$f"; \
+       done
+
+clean-gpglibexecPROGRAMS:
+       -test -z "$(gpglibexec_PROGRAMS)" || rm -f $(gpglibexec_PROGRAMS)
+
+installcheck-gpglibexecPROGRAMS: $(gpglibexec_PROGRAMS)
+       bad=0; pid=$$$$; list="$(gpglibexec_PROGRAMS)"; for p in $$list; do \
+         case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+          *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+         esac; \
+         f=`echo "$$p" | \
+            sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         for opt in --help --version; do \
+           if "$(DESTDIR)$(gpglibexecdir)/$$f" $$opt >c$${pid}_.out \
+                2>c$${pid}_.err </dev/null \
+                && test -n "`cat c$${pid}_.out`" \
+                && test -z "`cat c$${pid}_.err`"; then :; \
+           else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+         done; \
+       done; rm -f c$${pid}_.???; exit $$bad
+gpgkeys_curl$(EXEEXT): $(gpgkeys_curl_OBJECTS) $(gpgkeys_curl_DEPENDENCIES) 
+       @rm -f gpgkeys_curl$(EXEEXT)
+       $(LINK) $(gpgkeys_curl_LDFLAGS) $(gpgkeys_curl_OBJECTS) $(gpgkeys_curl_LDADD) $(LIBS)
+gpgkeys_finger$(EXEEXT): $(gpgkeys_finger_OBJECTS) $(gpgkeys_finger_DEPENDENCIES) 
+       @rm -f gpgkeys_finger$(EXEEXT)
+       $(LINK) $(gpgkeys_finger_LDFLAGS) $(gpgkeys_finger_OBJECTS) $(gpgkeys_finger_LDADD) $(LIBS)
+gpgkeys_hkp$(EXEEXT): $(gpgkeys_hkp_OBJECTS) $(gpgkeys_hkp_DEPENDENCIES) 
+       @rm -f gpgkeys_hkp$(EXEEXT)
+       $(LINK) $(gpgkeys_hkp_LDFLAGS) $(gpgkeys_hkp_OBJECTS) $(gpgkeys_hkp_LDADD) $(LIBS)
+gpgkeys_ldap$(EXEEXT): $(gpgkeys_ldap_OBJECTS) $(gpgkeys_ldap_DEPENDENCIES) 
+       @rm -f gpgkeys_ldap$(EXEEXT)
+       $(LINK) $(gpgkeys_ldap_LDFLAGS) $(gpgkeys_ldap_OBJECTS) $(gpgkeys_ldap_LDADD) $(LIBS)
+install-gpglibexecSCRIPTS: $(gpglibexec_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       test -z "$(gpglibexecdir)" || $(mkdir_p) "$(DESTDIR)$(gpglibexecdir)"
+       @list='$(gpglibexec_SCRIPTS)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         if test -f $$d$$p; then \
+           f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+           echo " $(gpglibexecSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(gpglibexecdir)/$$f'"; \
+           $(gpglibexecSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(gpglibexecdir)/$$f"; \
+         else :; fi; \
+       done
+
+uninstall-gpglibexecSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(gpglibexec_SCRIPTS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+         echo " rm -f '$(DESTDIR)$(gpglibexecdir)/$$f'"; \
+         rm -f "$(DESTDIR)$(gpglibexecdir)/$$f"; \
+       done
+
+installcheck-gpglibexecSCRIPTS: $(gpglibexec_SCRIPTS)
+       bad=0; pid=$$$$; list="$(gpglibexec_SCRIPTS)"; for p in $$list; do \
+         case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+          *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+         esac; \
+         f=`echo "$$p" | sed 's,^.*/,,;$(transform)'`; \
+         for opt in --help --version; do \
+           if "$(DESTDIR)$(gpglibexecdir)/$$f" $$opt >c$${pid}_.out \
+                2>c$${pid}_.err </dev/null \
+                && test -n "`cat c$${pid}_.out`" \
+                && test -z "`cat c$${pid}_.err`"; then :; \
+           else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+         done; \
+       done; rm -f c$${pid}_.???; exit $$bad
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_curl-curl-shim.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_curl-ksutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_finger-ksutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_hkp-curl-shim.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_hkp-ksutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgkeys_ldap-ksutil.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+gpgkeys_curl-gpgkeys_curl.o: gpgkeys_curl.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_curl-gpgkeys_curl.o -MD -MP -MF "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Tpo" -c -o gpgkeys_curl-gpgkeys_curl.o `test -f 'gpgkeys_curl.c' || echo '$(srcdir)/'`gpgkeys_curl.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Tpo" "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Po"; else rm -f "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_curl.c' object='gpgkeys_curl-gpgkeys_curl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_curl-gpgkeys_curl.o `test -f 'gpgkeys_curl.c' || echo '$(srcdir)/'`gpgkeys_curl.c
+
+gpgkeys_curl-gpgkeys_curl.obj: gpgkeys_curl.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_curl-gpgkeys_curl.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Tpo" -c -o gpgkeys_curl-gpgkeys_curl.obj `if test -f 'gpgkeys_curl.c'; then $(CYGPATH_W) 'gpgkeys_curl.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_curl.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Tpo" "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Po"; else rm -f "$(DEPDIR)/gpgkeys_curl-gpgkeys_curl.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_curl.c' object='gpgkeys_curl-gpgkeys_curl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_curl-gpgkeys_curl.obj `if test -f 'gpgkeys_curl.c'; then $(CYGPATH_W) 'gpgkeys_curl.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_curl.c'; fi`
+
+gpgkeys_curl-ksutil.o: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_curl-ksutil.o -MD -MP -MF "$(DEPDIR)/gpgkeys_curl-ksutil.Tpo" -c -o gpgkeys_curl-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_curl-ksutil.Tpo" "$(DEPDIR)/gpgkeys_curl-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_curl-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_curl-ksutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_curl-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c
+
+gpgkeys_curl-ksutil.obj: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_curl-ksutil.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_curl-ksutil.Tpo" -c -o gpgkeys_curl-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_curl-ksutil.Tpo" "$(DEPDIR)/gpgkeys_curl-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_curl-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_curl-ksutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_curl-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`
+
+gpgkeys_curl-curl-shim.o: curl-shim.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_curl-curl-shim.o -MD -MP -MF "$(DEPDIR)/gpgkeys_curl-curl-shim.Tpo" -c -o gpgkeys_curl-curl-shim.o `test -f 'curl-shim.c' || echo '$(srcdir)/'`curl-shim.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_curl-curl-shim.Tpo" "$(DEPDIR)/gpgkeys_curl-curl-shim.Po"; else rm -f "$(DEPDIR)/gpgkeys_curl-curl-shim.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='curl-shim.c' object='gpgkeys_curl-curl-shim.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_curl-curl-shim.o `test -f 'curl-shim.c' || echo '$(srcdir)/'`curl-shim.c
+
+gpgkeys_curl-curl-shim.obj: curl-shim.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_curl-curl-shim.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_curl-curl-shim.Tpo" -c -o gpgkeys_curl-curl-shim.obj `if test -f 'curl-shim.c'; then $(CYGPATH_W) 'curl-shim.c'; else $(CYGPATH_W) '$(srcdir)/curl-shim.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_curl-curl-shim.Tpo" "$(DEPDIR)/gpgkeys_curl-curl-shim.Po"; else rm -f "$(DEPDIR)/gpgkeys_curl-curl-shim.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='curl-shim.c' object='gpgkeys_curl-curl-shim.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_curl_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_curl-curl-shim.obj `if test -f 'curl-shim.c'; then $(CYGPATH_W) 'curl-shim.c'; else $(CYGPATH_W) '$(srcdir)/curl-shim.c'; fi`
+
+gpgkeys_finger-gpgkeys_finger.o: gpgkeys_finger.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_finger-gpgkeys_finger.o -MD -MP -MF "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Tpo" -c -o gpgkeys_finger-gpgkeys_finger.o `test -f 'gpgkeys_finger.c' || echo '$(srcdir)/'`gpgkeys_finger.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Tpo" "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Po"; else rm -f "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_finger.c' object='gpgkeys_finger-gpgkeys_finger.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_finger-gpgkeys_finger.o `test -f 'gpgkeys_finger.c' || echo '$(srcdir)/'`gpgkeys_finger.c
+
+gpgkeys_finger-gpgkeys_finger.obj: gpgkeys_finger.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_finger-gpgkeys_finger.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Tpo" -c -o gpgkeys_finger-gpgkeys_finger.obj `if test -f 'gpgkeys_finger.c'; then $(CYGPATH_W) 'gpgkeys_finger.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_finger.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Tpo" "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Po"; else rm -f "$(DEPDIR)/gpgkeys_finger-gpgkeys_finger.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_finger.c' object='gpgkeys_finger-gpgkeys_finger.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_finger-gpgkeys_finger.obj `if test -f 'gpgkeys_finger.c'; then $(CYGPATH_W) 'gpgkeys_finger.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_finger.c'; fi`
+
+gpgkeys_finger-ksutil.o: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_finger-ksutil.o -MD -MP -MF "$(DEPDIR)/gpgkeys_finger-ksutil.Tpo" -c -o gpgkeys_finger-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_finger-ksutil.Tpo" "$(DEPDIR)/gpgkeys_finger-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_finger-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_finger-ksutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_finger-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c
+
+gpgkeys_finger-ksutil.obj: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_finger-ksutil.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_finger-ksutil.Tpo" -c -o gpgkeys_finger-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_finger-ksutil.Tpo" "$(DEPDIR)/gpgkeys_finger-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_finger-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_finger-ksutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_finger_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_finger-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`
+
+gpgkeys_hkp-gpgkeys_hkp.o: gpgkeys_hkp.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_hkp-gpgkeys_hkp.o -MD -MP -MF "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Tpo" -c -o gpgkeys_hkp-gpgkeys_hkp.o `test -f 'gpgkeys_hkp.c' || echo '$(srcdir)/'`gpgkeys_hkp.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Tpo" "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Po"; else rm -f "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_hkp.c' object='gpgkeys_hkp-gpgkeys_hkp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_hkp-gpgkeys_hkp.o `test -f 'gpgkeys_hkp.c' || echo '$(srcdir)/'`gpgkeys_hkp.c
+
+gpgkeys_hkp-gpgkeys_hkp.obj: gpgkeys_hkp.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_hkp-gpgkeys_hkp.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Tpo" -c -o gpgkeys_hkp-gpgkeys_hkp.obj `if test -f 'gpgkeys_hkp.c'; then $(CYGPATH_W) 'gpgkeys_hkp.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_hkp.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Tpo" "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Po"; else rm -f "$(DEPDIR)/gpgkeys_hkp-gpgkeys_hkp.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_hkp.c' object='gpgkeys_hkp-gpgkeys_hkp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_hkp-gpgkeys_hkp.obj `if test -f 'gpgkeys_hkp.c'; then $(CYGPATH_W) 'gpgkeys_hkp.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_hkp.c'; fi`
+
+gpgkeys_hkp-ksutil.o: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_hkp-ksutil.o -MD -MP -MF "$(DEPDIR)/gpgkeys_hkp-ksutil.Tpo" -c -o gpgkeys_hkp-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_hkp-ksutil.Tpo" "$(DEPDIR)/gpgkeys_hkp-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_hkp-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_hkp-ksutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_hkp-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c
+
+gpgkeys_hkp-ksutil.obj: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_hkp-ksutil.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_hkp-ksutil.Tpo" -c -o gpgkeys_hkp-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_hkp-ksutil.Tpo" "$(DEPDIR)/gpgkeys_hkp-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_hkp-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_hkp-ksutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_hkp-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`
+
+gpgkeys_hkp-curl-shim.o: curl-shim.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_hkp-curl-shim.o -MD -MP -MF "$(DEPDIR)/gpgkeys_hkp-curl-shim.Tpo" -c -o gpgkeys_hkp-curl-shim.o `test -f 'curl-shim.c' || echo '$(srcdir)/'`curl-shim.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_hkp-curl-shim.Tpo" "$(DEPDIR)/gpgkeys_hkp-curl-shim.Po"; else rm -f "$(DEPDIR)/gpgkeys_hkp-curl-shim.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='curl-shim.c' object='gpgkeys_hkp-curl-shim.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_hkp-curl-shim.o `test -f 'curl-shim.c' || echo '$(srcdir)/'`curl-shim.c
+
+gpgkeys_hkp-curl-shim.obj: curl-shim.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_hkp-curl-shim.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_hkp-curl-shim.Tpo" -c -o gpgkeys_hkp-curl-shim.obj `if test -f 'curl-shim.c'; then $(CYGPATH_W) 'curl-shim.c'; else $(CYGPATH_W) '$(srcdir)/curl-shim.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_hkp-curl-shim.Tpo" "$(DEPDIR)/gpgkeys_hkp-curl-shim.Po"; else rm -f "$(DEPDIR)/gpgkeys_hkp-curl-shim.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='curl-shim.c' object='gpgkeys_hkp-curl-shim.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_hkp_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_hkp-curl-shim.obj `if test -f 'curl-shim.c'; then $(CYGPATH_W) 'curl-shim.c'; else $(CYGPATH_W) '$(srcdir)/curl-shim.c'; fi`
+
+gpgkeys_ldap-gpgkeys_ldap.o: gpgkeys_ldap.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_ldap-gpgkeys_ldap.o -MD -MP -MF "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Tpo" -c -o gpgkeys_ldap-gpgkeys_ldap.o `test -f 'gpgkeys_ldap.c' || echo '$(srcdir)/'`gpgkeys_ldap.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Tpo" "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Po"; else rm -f "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_ldap.c' object='gpgkeys_ldap-gpgkeys_ldap.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_ldap-gpgkeys_ldap.o `test -f 'gpgkeys_ldap.c' || echo '$(srcdir)/'`gpgkeys_ldap.c
+
+gpgkeys_ldap-gpgkeys_ldap.obj: gpgkeys_ldap.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_ldap-gpgkeys_ldap.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Tpo" -c -o gpgkeys_ldap-gpgkeys_ldap.obj `if test -f 'gpgkeys_ldap.c'; then $(CYGPATH_W) 'gpgkeys_ldap.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_ldap.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Tpo" "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Po"; else rm -f "$(DEPDIR)/gpgkeys_ldap-gpgkeys_ldap.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='gpgkeys_ldap.c' object='gpgkeys_ldap-gpgkeys_ldap.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_ldap-gpgkeys_ldap.obj `if test -f 'gpgkeys_ldap.c'; then $(CYGPATH_W) 'gpgkeys_ldap.c'; else $(CYGPATH_W) '$(srcdir)/gpgkeys_ldap.c'; fi`
+
+gpgkeys_ldap-ksutil.o: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_ldap-ksutil.o -MD -MP -MF "$(DEPDIR)/gpgkeys_ldap-ksutil.Tpo" -c -o gpgkeys_ldap-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_ldap-ksutil.Tpo" "$(DEPDIR)/gpgkeys_ldap-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_ldap-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_ldap-ksutil.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_ldap-ksutil.o `test -f 'ksutil.c' || echo '$(srcdir)/'`ksutil.c
+
+gpgkeys_ldap-ksutil.obj: ksutil.c
+@am__fastdepCC_TRUE@   if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gpgkeys_ldap-ksutil.obj -MD -MP -MF "$(DEPDIR)/gpgkeys_ldap-ksutil.Tpo" -c -o gpgkeys_ldap-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/gpgkeys_ldap-ksutil.Tpo" "$(DEPDIR)/gpgkeys_ldap-ksutil.Po"; else rm -f "$(DEPDIR)/gpgkeys_ldap-ksutil.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='ksutil.c' object='gpgkeys_ldap-ksutil.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(gpgkeys_ldap_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gpgkeys_ldap-ksutil.obj `if test -f 'ksutil.c'; then $(CYGPATH_W) 'ksutil.c'; else $(CYGPATH_W) '$(srcdir)/ksutil.c'; fi`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS)
+installdirs:
+       for dir in "$(DESTDIR)$(gpglibexecdir)" "$(DESTDIR)$(gpglibexecdir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-gpglibexecPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-gpglibexecPROGRAMS install-gpglibexecSCRIPTS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am: installcheck-gpglibexecPROGRAMS \
+       installcheck-gpglibexecSCRIPTS
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-gpglibexecPROGRAMS uninstall-gpglibexecSCRIPTS \
+       uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-gpglibexecPROGRAMS ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am \
+       install-gpglibexecPROGRAMS install-gpglibexecSCRIPTS \
+       install-info install-info-am install-man install-strip \
+       installcheck installcheck-am installcheck-gpglibexecPROGRAMS \
+       installcheck-gpglibexecSCRIPTS installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-gpglibexecPROGRAMS \
+       uninstall-gpglibexecSCRIPTS uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/keyserver/curl-shim.c b/keyserver/curl-shim.c
new file mode 100644 (file)
index 0000000..f4fdc0c
--- /dev/null
@@ -0,0 +1,322 @@
+/* curl-shim.c - Implement a small subset of the curl API in terms of
+ * the iobuf HTTP API
+ *
+ * Copyright (C) 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include "http.h"
+#include "util.h"
+#include "ksutil.h"
+#include "curl-shim.h"
+
+static CURLcode
+handle_error(CURL *curl,CURLcode err,const char *str)
+{
+  if(curl->errorbuffer)
+    {
+      /* Make sure you never exceed CURL_ERROR_SIZE, currently set to
+        256 in curl-shim.h */
+      switch(err)
+       {
+       case CURLE_OK:
+         strcpy(curl->errorbuffer,"okay");
+         break;
+
+       case CURLE_UNSUPPORTED_PROTOCOL:
+         strcpy(curl->errorbuffer,"unsupported protocol");
+         break;
+
+       case CURLE_COULDNT_CONNECT:
+         strcpy(curl->errorbuffer,"couldn't connect");
+         break;
+
+       case CURLE_WRITE_ERROR:
+         strcpy(curl->errorbuffer,"write error");
+         break;
+
+       case CURLE_HTTP_RETURNED_ERROR:
+         sprintf(curl->errorbuffer,"url returned error %u",curl->status);
+         break;
+
+       default:
+         strcpy(curl->errorbuffer,"generic error");
+         break;
+       }
+
+      if(str && (strlen(curl->errorbuffer)+2+strlen(str)+1)<=CURL_ERROR_SIZE)
+       {
+         strcat(curl->errorbuffer,": ");
+         strcat(curl->errorbuffer,str);
+       }
+    }
+
+  return err;
+}
+
+CURLcode
+curl_global_init(long flags)
+{
+  return CURLE_OK;
+}
+
+void
+curl_global_cleanup(void) {}
+
+CURL *
+curl_easy_init(void)
+{
+  CURL *handle;
+
+  handle=calloc(1,sizeof(CURL));
+  if(handle)
+    handle->errors=stderr;
+
+  return handle;
+}
+
+void
+curl_easy_cleanup(CURL *curl)
+{
+  free(curl);
+}
+
+CURLcode
+curl_easy_setopt(CURL *curl,CURLoption option,...)
+{
+  va_list ap;
+
+  va_start(ap,option);
+
+  switch(option)
+    {
+    case CURLOPT_URL:
+      curl->url=va_arg(ap,char *);
+      break;
+    case CURLOPT_USERPWD:
+      curl->auth=va_arg(ap,char *);
+      break;
+    case CURLOPT_WRITEFUNCTION:
+      curl->writer=va_arg(ap,write_func);
+      break;
+    case CURLOPT_FILE:
+      curl->file=va_arg(ap,void *);
+      break;
+    case CURLOPT_ERRORBUFFER:
+      curl->errorbuffer=va_arg(ap,char *);
+      break;
+    case CURLOPT_PROXY:
+      curl->proxy=va_arg(ap,char *);
+      break;
+    case CURLOPT_POST:
+      curl->flags.post=va_arg(ap,unsigned int);
+      break;
+    case CURLOPT_POSTFIELDS:
+      curl->postfields=va_arg(ap,char *);
+      break;
+    case CURLOPT_FAILONERROR:
+      curl->flags.failonerror=va_arg(ap,unsigned int);
+      break;
+    case CURLOPT_VERBOSE:
+      curl->flags.verbose=va_arg(ap,unsigned int);
+      break;
+    case CURLOPT_STDERR:
+      curl->errors=va_arg(ap,FILE *);
+      break;
+    default:
+      /* We ignore the huge majority of curl options */
+      break;
+    }
+
+  return handle_error(curl,CURLE_OK,NULL);
+}
+
+CURLcode
+curl_easy_perform(CURL *curl)
+{
+  int rc;
+  CURLcode err=CURLE_OK;
+  const char *errstr=NULL;
+  char *proxy=NULL;
+
+  /* Emulate the libcurl proxy behavior.  If the calling program set a
+     proxy, use it.  If it didn't set a proxy or set it to NULL, check
+     for one in the environment.  If the calling program explicitly
+     set a null-string proxy the http code doesn't use a proxy at
+     all. */
+
+  if(curl->proxy)
+    proxy=curl->proxy;
+  else
+    proxy=getenv(HTTP_PROXY_ENV);
+
+  if(curl->flags.verbose)
+    fprintf(curl->errors,"* HTTP proxy is \"%s\"\n",proxy?proxy:"null");
+
+  if(curl->flags.post)
+    {
+      rc=http_open(&curl->hd,HTTP_REQ_POST,curl->url,curl->auth,0,proxy);
+      if(rc==0)
+       {
+         char content_len[50];
+         unsigned int post_len=strlen(curl->postfields);
+
+         iobuf_writestr(curl->hd.fp_write,
+                        "Content-Type: application/x-www-form-urlencoded\r\n");
+         sprintf(content_len,"Content-Length: %u\r\n",post_len);
+
+         iobuf_writestr(curl->hd.fp_write,content_len);
+
+         http_start_data(&curl->hd);
+         iobuf_write(curl->hd.fp_write,curl->postfields,post_len);
+         rc=http_wait_response(&curl->hd,&curl->status);
+         if(rc==0 && curl->flags.failonerror && curl->status>=300)
+           err=CURLE_HTTP_RETURNED_ERROR;
+       }
+    }
+  else
+    {
+      rc=http_open(&curl->hd,HTTP_REQ_GET,curl->url,curl->auth,0,proxy);
+      if(rc==0)
+       {
+         rc=http_wait_response(&curl->hd,&curl->status);
+         if(rc==0)
+           {
+             if(curl->flags.failonerror && curl->status>=300)
+               err=CURLE_HTTP_RETURNED_ERROR;
+             else
+               {
+                 unsigned int maxlen=1024,buflen,len;
+                 byte *line=NULL;
+
+                 while((len=iobuf_read_line(curl->hd.fp_read,
+                                            &line,&buflen,&maxlen)))
+                   {
+                     size_t ret;
+
+                     maxlen=1024;
+
+                     ret=(curl->writer)(line,len,1,curl->file);
+                     if(ret!=len)
+                       {
+                         err=CURLE_WRITE_ERROR;
+                         break;
+                       }
+                   }
+
+                 xfree(line);
+                 http_close(&curl->hd);
+               }
+           }
+         else
+           http_close(&curl->hd);
+       }
+    }
+
+  switch(rc)
+    {
+    case 0:
+      break;
+
+    case G10ERR_INVALID_URI:
+      err=CURLE_UNSUPPORTED_PROTOCOL;
+      break;
+
+    case G10ERR_NETWORK:
+      errstr=strerror(errno);
+      err=CURLE_COULDNT_CONNECT;
+      break;
+
+    default:
+      errstr=g10_errstr(rc);
+      err=CURLE_COULDNT_CONNECT;
+      break;
+    }
+      
+  return handle_error(curl,err,errstr);
+}
+
+/* This is not the same exact set that is allowed according to
+   RFC-2396, but it is what the real curl uses. */
+#define VALID_URI_CHARS "abcdefghijklmnopqrstuvwxyz" \
+                        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+                        "0123456789"
+
+char *
+curl_escape(char *str,int length)
+{
+  int len,max,idx,enc_idx=0;
+  char *enc;
+
+  if(length)
+    len=length;
+  else
+    len=strlen(str);
+
+  enc=malloc(len+1);
+  if(!enc)
+    return enc;
+
+  max=len;
+
+  for(idx=0;idx<len;idx++)
+    {
+      if(enc_idx+3>max)
+       {
+         char *tmp;
+
+         max+=100;
+
+         tmp=realloc(enc,max+1);
+         if(!tmp)
+           {
+             free(enc);
+             return NULL;
+           }
+
+         enc=tmp;
+       }
+
+      if(strchr(VALID_URI_CHARS,str[idx]))
+       enc[enc_idx++]=str[idx];
+      else
+       {
+         char numbuf[5];
+         sprintf(numbuf,"%%%02X",(unsigned char)str[idx]);
+         strcpy(&enc[enc_idx],numbuf);
+         enc_idx+=3;
+       }
+    }
+
+  enc[enc_idx]='\0';
+
+  return enc;
+}
+
+void
+curl_free(char *ptr)
+{
+  free(ptr);
+}
diff --git a/keyserver/curl-shim.h b/keyserver/curl-shim.h
new file mode 100644 (file)
index 0000000..91eac9d
--- /dev/null
@@ -0,0 +1,92 @@
+/* curl-shim.h
+ * Copyright (C) 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef _CURL_SHIM_H_
+#define _CURL_SHIM_H_
+
+#include "http.h"
+
+typedef enum
+  {
+    CURLE_OK=0,
+    CURLE_UNSUPPORTED_PROTOCOL=1,
+    CURLE_COULDNT_CONNECT=7,
+    CURLE_FTP_COULDNT_RETR_FILE=19,
+    CURLE_HTTP_RETURNED_ERROR=22,
+    CURLE_WRITE_ERROR=23
+  } CURLcode;
+
+typedef enum
+  {
+    CURLOPT_URL,
+    CURLOPT_USERPWD,
+    CURLOPT_WRITEFUNCTION,
+    CURLOPT_FILE,
+    CURLOPT_ERRORBUFFER,
+    CURLOPT_FOLLOWLOCATION,
+    CURLOPT_MAXREDIRS,
+    CURLOPT_STDERR,
+    CURLOPT_VERBOSE,
+    CURLOPT_SSL_VERIFYPEER,
+    CURLOPT_PROXY,
+    CURLOPT_CAINFO,
+    CURLOPT_POST,
+    CURLOPT_POSTFIELDS,
+    CURLOPT_FAILONERROR
+  } CURLoption;
+
+typedef size_t (*write_func)(char *buffer,size_t size,
+                            size_t nitems,void *outstream);
+
+typedef struct
+{
+  char *url;
+  char *auth;
+  char *errorbuffer;
+  char *proxy;
+  write_func writer;
+  void *file;
+  char *postfields;
+  unsigned int status;
+  FILE *errors;
+  struct
+  {
+    unsigned int post:1;
+    unsigned int failonerror:1;
+    unsigned int verbose:1;
+  } flags;
+  struct http_context hd;
+} CURL;
+
+#define CURL_ERROR_SIZE 256
+#define CURL_GLOBAL_DEFAULT 0
+
+CURLcode curl_global_init(long flags);
+void curl_global_cleanup(void);
+CURL *curl_easy_init(void);
+CURLcode curl_easy_setopt(CURL *curl,CURLoption option,...);
+CURLcode curl_easy_perform(CURL *curl);
+void curl_easy_cleanup(CURL *curl);
+char *curl_escape(char *str,int len);
+void curl_free(char *ptr);
+#define curl_version() "GnuPG curl-shim "VERSION
+
+#endif /* !_CURL_SHIM_H_ */
diff --git a/keyserver/gpgkeys_curl.c b/keyserver/gpgkeys_curl.c
new file mode 100644 (file)
index 0000000..192f9ba
--- /dev/null
@@ -0,0 +1,380 @@
+/* gpgkeys_curl.c - fetch a key via libcurl
+ * Copyright (C) 2004, 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * In addition, as a special exception, the Free Software Foundation
+ * gives permission to link the code of the keyserver helper tools:
+ * gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
+ * project's "OpenSSL" library (or with modified versions of it that
+ * use the same license as the "OpenSSL" library), and distribute the
+ * linked executables.  You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL".  If
+ * you modify this file, you may extend this exception to your version
+ * of the file, but you are not obligated to do so.  If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+#ifdef HAVE_LIBCURL
+#include <curl/curl.h>
+#else
+#include "curl-shim.h"
+#endif
+#include "keyserver.h"
+#include "ksutil.h"
+
+extern char *optarg;
+extern int optind;
+
+static FILE *input,*output,*console;
+static CURL *curl;
+static struct ks_options *opt;
+
+static int
+get_key(char *getkey)
+{
+  CURLcode res;
+  char errorbuffer[CURL_ERROR_SIZE];
+  char request[MAX_URL];
+  struct curl_writer_ctx ctx;
+
+  memset(&ctx,0,sizeof(ctx));
+
+  if(strncmp(getkey,"0x",2)==0)
+    getkey+=2;
+
+  fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+
+  sprintf(request,"%s://%s%s%s%s",opt->scheme,opt->host,
+         opt->port?":":"",opt->port?opt->port:"",opt->path?opt->path:"/");
+
+  curl_easy_setopt(curl,CURLOPT_URL,request);
+  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
+  ctx.stream=output;
+  curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
+  curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,errorbuffer);
+
+  res=curl_easy_perform(curl);
+  if(res!=CURLE_OK)
+    {
+      fprintf(console,"gpgkeys: %s fetch error %d: %s\n",opt->scheme,
+             res,errorbuffer);
+      fprintf(output,"\nKEY 0x%s FAILED %d\n",getkey,curl_err_to_gpg_err(res));
+    }
+  else
+    {
+      curl_writer_finalize(&ctx);
+      if(!ctx.flags.done)
+       {
+         fprintf(console,"gpgkeys: no key data found for %s\n",request);
+         fprintf(output,"\nKEY 0x%s FAILED %d\n",
+                 getkey,KEYSERVER_KEY_NOT_FOUND);
+       }
+      else
+       fprintf(output,"\nKEY 0x%s END\n",getkey);
+    }
+
+  return curl_err_to_gpg_err(res);
+}
+
+static void 
+show_help (FILE *fp)
+{
+  fprintf (fp,"-h\thelp\n");
+  fprintf (fp,"-V\tversion\n");
+  fprintf (fp,"-o\toutput to this file\n");
+}
+
+int
+main(int argc,char *argv[])
+{
+  int arg,ret=KEYSERVER_INTERNAL_ERROR;
+  char line[MAX_LINE];
+  char *thekey=NULL;
+  long follow_redirects=5;
+  char *proxy=NULL;
+
+  console=stderr;
+
+  /* Kludge to implement standard GNU options.  */
+  if (argc > 1 && !strcmp (argv[1], "--version"))
+    {
+      fputs ("gpgkeys_curl (GnuPG) " VERSION"\n", stdout);
+      return 0;
+    }
+  else if (argc > 1 && !strcmp (argv[1], "--help"))
+    {
+      show_help (stdout);
+      return 0;
+    }
+
+  while((arg=getopt(argc,argv,"hVo:"))!=-1)
+    switch(arg)
+      {
+      default:
+      case 'h':
+        show_help (console);
+       return KEYSERVER_OK;
+
+      case 'V':
+       fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
+       return KEYSERVER_OK;
+
+      case 'o':
+       output=fopen(optarg,"wb");
+       if(output==NULL)
+         {
+           fprintf(console,"gpgkeys: Cannot open output file `%s': %s\n",
+                   optarg,strerror(errno));
+           return KEYSERVER_INTERNAL_ERROR;
+         }
+
+       break;
+      }
+
+  if(argc>optind)
+    {
+      input=fopen(argv[optind],"r");
+      if(input==NULL)
+       {
+         fprintf(console,"gpgkeys: Cannot open input file `%s': %s\n",
+                 argv[optind],strerror(errno));
+         return KEYSERVER_INTERNAL_ERROR;
+       }
+    }
+
+  if(input==NULL)
+    input=stdin;
+
+  if(output==NULL)
+    output=stdout;
+
+  opt=init_ks_options();
+  if(!opt)
+    return KEYSERVER_NO_MEMORY;
+
+  /* Get the command and info block */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    {
+      int err;
+      char option[MAX_OPTION+1];
+
+      if(line[0]=='\n')
+       break;
+
+      err=parse_ks_options(line,opt);
+      if(err>0)
+       {
+         ret=err;
+         goto fail;
+       }
+      else if(err==0)
+       continue;
+
+      if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "s\n",option)==1)
+       {
+         int no=0;
+         char *start=&option[0];
+
+         option[MAX_OPTION]='\0';
+
+         if(strncasecmp(option,"no-",3)==0)
+           {
+             no=1;
+             start=&option[3];
+           }
+
+         if(strncasecmp(start,"http-proxy",10)==0)
+           {
+             /* Safe to not check the return code of strdup() here.
+                If it fails, we simply won't use a proxy. */
+             if(no)
+               {
+                 free(proxy);
+                 proxy=strdup("");
+               }
+             else if(start[10]=='=')
+               {
+                 if(strlen(&start[11])<MAX_PROXY)
+                   {
+                     free(proxy);
+                     proxy=strdup(&start[11]);
+                   }
+               }
+           }
+         else if(strncasecmp(start,"follow-redirects",16)==0)
+           {
+             if(no)
+               follow_redirects=0;
+             else if(start[16]=='=')
+               follow_redirects=atoi(&start[17]);
+             else if(start[16]=='\0')
+               follow_redirects=-1;
+           }
+
+         continue;
+       }
+    }
+
+  if(!opt->scheme)
+    {
+      fprintf(console,"gpgkeys: no scheme supplied!\n");
+      ret=KEYSERVER_SCHEME_NOT_FOUND;
+      goto fail;
+    }
+
+  if(!opt->host)
+    {
+      fprintf(console,"gpgkeys: no keyserver host provided\n");
+      goto fail;
+    }
+
+  if(opt->timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+  curl=curl_easy_init();
+  if(!curl)
+    {
+      fprintf(console,"gpgkeys: unable to initialize curl\n");
+      ret=KEYSERVER_INTERNAL_ERROR;
+      goto fail;
+    }
+
+  if(follow_redirects)
+    {
+      curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);
+      if(follow_redirects>0)
+       curl_easy_setopt(curl,CURLOPT_MAXREDIRS,follow_redirects);
+    }
+
+  if(opt->auth)
+    curl_easy_setopt(curl,CURLOPT_USERPWD,opt->auth);
+
+  if(opt->debug)
+    {
+      fprintf(console,"gpgkeys: curl version = %s\n",curl_version());
+      curl_easy_setopt(curl,CURLOPT_STDERR,console);
+      curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
+    }
+
+  curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,opt->flags.check_cert);
+  curl_easy_setopt(curl,CURLOPT_CAINFO,opt->ca_cert_file);
+
+  if(proxy)
+    curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
+
+  /* If it's a GET or a SEARCH, the next thing to come in is the
+     keyids.  If it's a SEND, then there are no keyids. */
+
+  if(opt->action==KS_GET)
+    {
+      /* Eat the rest of the file */
+      for(;;)
+       {
+         if(fgets(line,MAX_LINE,input)==NULL)
+           break;
+         else
+           {
+             if(line[0]=='\n' || line[0]=='\0')
+               break;
+
+             if(!thekey)
+               {
+                 thekey=strdup(line);
+                 if(!thekey)
+                   {
+                     fprintf(console,"gpgkeys: out of memory while "
+                             "building key list\n");
+                     ret=KEYSERVER_NO_MEMORY;
+                     goto fail;
+                   }
+
+                 /* Trim the trailing \n */
+                 thekey[strlen(line)-1]='\0';
+               }
+           }
+       }
+    }
+  else
+    {
+      fprintf(console,
+             "gpgkeys: this keyserver type only supports key retrieval\n");
+      goto fail;
+    }
+
+  if(!thekey)
+    {
+      fprintf(console,"gpgkeys: invalid keyserver instructions\n");
+      goto fail;
+    }
+
+  /* Send the response */
+
+  fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
+  fprintf(output,"PROGRAM %s\n\n",VERSION);
+
+  if(opt->verbose)
+    {
+      fprintf(console,"Scheme:\t\t%s\n",opt->scheme);
+      fprintf(console,"Host:\t\t%s\n",opt->host);
+      if(opt->port)
+       fprintf(console,"Port:\t\t%s\n",opt->port);
+      if(opt->path)
+       fprintf(console,"Path:\t\t%s\n",opt->path);
+      fprintf(console,"Command:\tGET\n");
+    }
+
+  set_timeout(opt->timeout);
+
+  ret=get_key(thekey);
+
+ fail:
+
+  free(thekey);
+
+  if(input!=stdin)
+    fclose(input);
+
+  if(output!=stdout)
+    fclose(output);
+
+  free_ks_options(opt);
+
+  if(curl)
+    curl_easy_cleanup(curl);
+
+  free(proxy);
+
+  curl_global_cleanup();
+
+  return ret;
+}
diff --git a/keyserver/gpgkeys_finger.c b/keyserver/gpgkeys_finger.c
new file mode 100644 (file)
index 0000000..c91022c
--- /dev/null
@@ -0,0 +1,534 @@
+/* gpgkeys_finger.c - fetch a key via finger
+ * Copyright (C) 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <time.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#endif
+
+#define INCLUDED_BY_MAIN_MODULE 1
+#include "util.h"
+#include "keyserver.h"
+#include "ksutil.h"
+
+#ifdef _WIN32
+#define sock_close(a)  closesocket(a)
+#else
+#define sock_close(a)  close(a)
+#endif
+
+extern char *optarg;
+extern int optind;
+
+static FILE *input,*output,*console;
+static struct ks_options *opt;
+
+#ifdef _WIN32
+static void
+deinit_sockets (void)
+{
+  WSACleanup();
+}
+
+static void
+init_sockets (void)
+{
+  static int initialized;
+  static WSADATA wsdata;
+
+  if (initialized)
+    return;
+
+  if (WSAStartup (0x0101, &wsdata) )
+    {
+      fprintf (console, "error initializing socket library: ec=%d\n", 
+               (int)WSAGetLastError () );
+      return;
+    }
+  if (wsdata.wVersion < 0x0001)
+    {
+      fprintf (console, "socket library version is %x.%x - but 1.1 needed\n",
+               LOBYTE(wsdata.wVersion), HIBYTE(wsdata.wVersion));
+      WSACleanup();
+      return;
+    }
+  atexit  (deinit_sockets);
+  initialized = 1;
+}
+#endif /*_WIN32*/
+
+
+/* Connect to SERVER at PORT and return a file descriptor or -1 on
+   error. */
+static int
+connect_server (const char *server, unsigned short port)
+{
+  int sock = -1;
+
+#ifdef _WIN32
+  struct hostent *hp;
+  struct sockaddr_in addr;
+  unsigned long l;
+
+  init_sockets ();
+
+  memset (&addr, 0, sizeof addr);
+  addr.sin_family = AF_INET;
+  addr.sin_port = htons (port);
+
+  /* Win32 gethostbyname doesn't handle IP addresses internally, so we
+     try inet_addr first on that platform only. */
+  if ((l = inet_addr (server)) != INADDR_NONE) 
+    memcpy (&addr.sin_addr, &l, sizeof l);
+  else if ((hp = gethostbyname (server))) 
+    {
+      if (hp->h_addrtype != AF_INET)
+        {
+          fprintf (console, "gpgkeys: unknown address family for `%s'\n",
+                   server);
+          return -1;
+        }
+      if (hp->h_length != 4)
+        {
+          fprintf (console, "gpgkeys: illegal address length for `%s'\n",
+                   server);
+          return -1;
+        }
+      memcpy (&addr.sin_addr, hp->h_addr, hp->h_length);
+    }
+  else
+    {
+      fprintf (console, "gpgkeys: host `%s' not found: ec=%d\n",
+               server, (int)WSAGetLastError ());
+      return -1;
+    }
+
+  sock = socket (AF_INET, SOCK_STREAM, 0);
+  if (sock == INVALID_SOCKET)
+    {
+      fprintf (console, "gpgkeys: error creating socket: ec=%d\n", 
+               (int)WSAGetLastError ());
+      return -1;
+    }
+
+  if (connect (sock, (struct sockaddr *)&addr, sizeof addr))
+    {
+      fprintf (console, "gpgkeys: error connecting `%s': ec=%d\n", 
+               server, (int)WSAGetLastError ());
+      sock_close (sock);
+      return -1;
+    }
+
+#else
+
+  struct sockaddr_in addr;
+  struct hostent *host;
+
+  addr.sin_family = AF_INET;
+  addr.sin_port = htons (port);
+  host = gethostbyname ((char*)server);
+  if (!host)
+    {
+      fprintf (console, "gpgkeys: host `%s' not found: %s\n",
+               server, strerror (errno));
+      return -1;
+    }
+  
+  addr.sin_addr = *(struct in_addr*)host->h_addr;
+
+  sock = socket (AF_INET, SOCK_STREAM, 0);
+  if (sock == -1)
+    {
+      fprintf (console, "gpgkeys: error creating socket: %s\n", 
+               strerror (errno));
+      return -1;
+    }
+  
+  if (connect (sock, (struct sockaddr *)&addr, sizeof addr) == -1)
+    {
+      fprintf (console, "gpgkeys: error connecting `%s': %s\n", 
+               server, strerror (errno));
+      close (sock);
+      return -1;
+    }
+#endif
+    
+  return sock;
+}
+
+static int
+write_server (int sock, const char *data, size_t length)
+{
+  int nleft;
+
+  nleft = length;
+  while (nleft > 0) 
+    {
+      int nwritten;
+      
+#ifdef _WIN32  
+      nwritten = send (sock, data, nleft, 0);
+      if ( nwritten == SOCKET_ERROR )
+        {
+          fprintf (console, "gpgkeys: write failed: ec=%d\n",
+                   (int)WSAGetLastError ());
+          return -1;
+        }
+#else
+      nwritten = write (sock, data, nleft);
+      if (nwritten == -1)
+        {
+          if (errno == EINTR)
+            continue;
+          if (errno == EAGAIN)
+            {
+              struct timeval tv;
+              
+              tv.tv_sec =  0;
+              tv.tv_usec = 50000;
+              select(0, NULL, NULL, NULL, &tv);
+              continue;
+           }
+          fprintf (console, "gpgkeys: write failed: %s\n", strerror(errno));
+          return -1;
+       }
+#endif
+      nleft -=nwritten;
+      data += nwritten;
+    }
+  
+  return 0;
+}
+
+
+/* Send the finger REQUEST to the server.  Returns 0 and a file descriptor
+   in R_SOCK if the request was sucessful. */
+static int
+send_request (const char *request, int *r_sock)
+{
+  char *server;
+  char *name;
+  int sock;
+
+  *r_sock = -1;
+  name = strdup (request);
+  if (!name)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      return KEYSERVER_NO_MEMORY;
+    }
+
+  server = strchr (name, '@');
+  if (!server)
+    {
+      fprintf (console, "gpgkeys: no name included in request\n");
+      free (name);
+      return KEYSERVER_GENERAL_ERROR;
+    }
+  *server++ = 0;
+  
+  sock = connect_server (server, 79);
+  if (sock == -1)
+    {
+      free (name);
+      return KEYSERVER_UNREACHABLE;
+    }
+
+  if (write_server (sock, name, strlen (name))
+      || write_server (sock, "\r\n", 2))
+    {
+      free (name);
+      sock_close (sock);
+      return KEYSERVER_GENERAL_ERROR;
+    }
+  free (name);
+  *r_sock = sock;
+  return 0;
+}
+
+
+
+static int
+get_key (char *getkey)
+{
+  int rc;
+  int sock;
+  IOBUF fp_read;
+  unsigned int maxlen, buflen, gotit=0;
+  byte *line = NULL;
+
+  if (strncmp (getkey,"0x",2)==0)
+    getkey+=2;
+
+  /* Frankly we don't know what keys the server will return; we
+     indicated the requested key anyway. */
+  fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+
+  rc=send_request(opt->opaque,&sock);
+  if(rc)
+    {
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey, rc);
+      sock_close (sock);
+      return KEYSERVER_OK;
+    }
+  
+  /* Hmmm, we use iobuf here only to cope with Windows socket
+     peculiarities (we can't used fdopen).  */
+  fp_read = iobuf_sockopen (sock , "r");
+  if (!fp_read)
+    {
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey, KEYSERVER_INTERNAL_ERROR);
+      sock_close (sock);
+      return KEYSERVER_OK;
+    }
+
+  while ( iobuf_read_line ( fp_read, &line, &buflen, &maxlen))
+    {
+      maxlen=1024;
+      
+      if(gotit)
+        {
+         print_nocr (output, (const char*)line);
+          if (!strncmp((char*)line,END,strlen(END)))
+            break;
+        }
+      else if(!strncmp((char*)line,BEGIN,strlen(BEGIN)))
+        {
+         print_nocr(output, (const char*)line);
+          gotit=1;
+        }
+    }
+  
+  if(gotit)
+    fprintf (output,"KEY 0x%s END\n", getkey);
+  else
+    {
+      fprintf(console,"gpgkeys: no key data found for finger:%s\n",
+             opt->opaque);
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_KEY_NOT_FOUND);
+    }
+
+  xfree(line);
+  iobuf_close (fp_read);
+
+  return KEYSERVER_OK;
+}
+
+
+static void 
+show_help (FILE *fp)
+{
+  fprintf (fp,"-h\thelp\n");
+  fprintf (fp,"-V\tversion\n");
+  fprintf (fp,"-o\toutput to this file\n");
+}
+
+int
+main(int argc,char *argv[])
+{
+  int arg,ret=KEYSERVER_INTERNAL_ERROR;
+  char line[MAX_LINE];
+  char *thekey=NULL;
+
+  console=stderr;
+
+  /* Kludge to implement standard GNU options.  */
+  if (argc > 1 && !strcmp (argv[1], "--version"))
+    {
+      fputs ("gpgkeys_finger (GnuPG) " VERSION"\n", stdout);
+      return 0;
+    }
+  else if (argc > 1 && !strcmp (argv[1], "--help"))
+    {
+      show_help (stdout);
+      return 0;
+    }
+
+  while((arg=getopt(argc,argv,"hVo:"))!=-1)
+    switch(arg)
+      {
+      default:
+      case 'h':
+        show_help (console);
+       return KEYSERVER_OK;
+
+      case 'V':
+       fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
+       return KEYSERVER_OK;
+
+      case 'o':
+       output=fopen(optarg,"w");
+       if(output==NULL)
+         {
+           fprintf(console,"gpgkeys: Cannot open output file `%s': %s\n",
+                   optarg,strerror(errno));
+           return KEYSERVER_INTERNAL_ERROR;
+         }
+
+       break;
+      }
+
+  if(argc>optind)
+    {
+      input=fopen(argv[optind],"r");
+      if(input==NULL)
+       {
+         fprintf(console,"gpgkeys: Cannot open input file `%s': %s\n",
+                 argv[optind],strerror(errno));
+         return KEYSERVER_INTERNAL_ERROR;
+       }
+    }
+
+  if(input==NULL)
+    input=stdin;
+
+  if(output==NULL)
+    output=stdout;
+
+  opt=init_ks_options();
+  if(!opt)
+    return KEYSERVER_NO_MEMORY;
+
+  /* Get the command and info block */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    {
+      int err;
+
+      if(line[0]=='\n')
+       break;
+
+      err=parse_ks_options(line,opt);
+      if(err>0)
+       {
+         ret=err;
+         goto fail;
+       }
+      else if(err==0)
+       continue;
+    }
+
+  if(opt->host)
+    {
+      fprintf(console,"gpgkeys: finger://relay/user syntax is not"
+             " supported.  Use finger:user instead.\n");
+      ret=KEYSERVER_NOT_SUPPORTED;
+      goto fail;
+    }
+
+  if(opt->timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
+  /* If it's a GET or a SEARCH, the next thing to come in is the
+     keyids.  If it's a SEND, then there are no keyids. */
+
+  if(opt->action==KS_GET)
+    {
+      /* Eat the rest of the file */
+      for(;;)
+       {
+         if(fgets(line,MAX_LINE,input)==NULL)
+           break;
+         else
+           {
+             if(line[0]=='\n' || line[0]=='\0')
+               break;
+
+             if(!thekey)
+               {
+                 thekey=strdup(line);
+                 if(!thekey)
+                   {
+                     fprintf(console,"gpgkeys: out of memory while "
+                             "building key list\n");
+                     ret=KEYSERVER_NO_MEMORY;
+                     goto fail;
+                   }
+
+                 /* Trim the trailing \n */
+                 thekey[strlen(line)-1]='\0';
+               }
+           }
+       }
+    }
+  else
+    {
+      fprintf(console,
+             "gpgkeys: this keyserver type only supports key retrieval\n");
+      goto fail;
+    }
+
+  if(!thekey || !opt->opaque)
+    {
+      fprintf(console,"gpgkeys: invalid keyserver instructions\n");
+      goto fail;
+    }
+
+  /* Send the response */
+
+  fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
+  fprintf(output,"PROGRAM %s\n\n",VERSION);
+
+  if(opt->verbose>1)
+    {
+      fprintf(console,"User:\t\t%s\n",opt->opaque);
+      fprintf(console,"Command:\tGET\n");
+    }
+
+  set_timeout(opt->timeout);
+
+  ret=get_key(thekey);
+
+ fail:
+
+  free(thekey);
+
+  if(input!=stdin)
+    fclose(input);
+
+  if(output!=stdout)
+    fclose(output);
+
+  free_ks_options(opt);
+
+  return ret;
+}
diff --git a/keyserver/gpgkeys_hkp.c b/keyserver/gpgkeys_hkp.c
new file mode 100644 (file)
index 0000000..e393b85
--- /dev/null
@@ -0,0 +1,854 @@
+/* gpgkeys_hkp.c - talk to an HKP keyserver
+ * Copyright (C) 2001, 2002, 2003, 2004, 2005
+ *               2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * In addition, as a special exception, the Free Software Foundation
+ * gives permission to link the code of the keyserver helper tools:
+ * gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
+ * project's "OpenSSL" library (or with modified versions of it that
+ * use the same license as the "OpenSSL" library), and distribute the
+ * linked executables.  You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL".  If
+ * you modify this file, you may extend this exception to your version
+ * of the file, but you are not obligated to do so.  If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+#ifdef HAVE_LIBCURL
+#include <curl/curl.h>
+#else
+#include "curl-shim.h"
+#endif
+#include "keyserver.h"
+#include "ksutil.h"
+
+extern char *optarg;
+extern int optind;
+
+static FILE *input,*output,*console;
+static CURL *curl;
+static struct ks_options *opt;
+static char errorbuffer[CURL_ERROR_SIZE];
+
+static size_t
+curl_mrindex_writer(const void *ptr,size_t size,size_t nmemb,void *stream)
+{
+  static int checked=0,swallow=0;
+
+  if(!checked)
+    {
+      /* If the document begins with a '<', assume it's a HTML
+        response, which we don't support.  Discard the whole message
+        body.  GPG can handle it, but this is an optimization to deal
+        with it on this side of the pipe.  */
+      const char *buf=ptr;
+      if(buf[0]=='<')
+       swallow=1;
+
+      checked=1;
+    }
+
+  if(swallow || fwrite(ptr,size,nmemb,stream)==nmemb)
+    return size*nmemb;
+  else
+    return 0;
+}
+
+/* Append but avoid creating a double slash // in the path. */
+static char *
+append_path(char *dest,const char *src)
+{
+  size_t n=strlen(dest);
+
+  if(src[0]=='/' && n>0 && dest[n-1]=='/')
+    dest[n-1]='\0';
+
+  return strcat(dest,src);
+}
+
+int
+send_key(int *eof)
+{
+  CURLcode res;
+  char request[MAX_URL+15];
+  int begin=0,end=0,ret=KEYSERVER_INTERNAL_ERROR;
+  char keyid[17],state[6];
+  char line[MAX_LINE];
+  char *key=NULL,*encoded_key=NULL;
+  size_t keylen=0,keymax=0;
+
+  /* Read and throw away input until we see the BEGIN */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"KEY%*[ ]%16s%*[ ]%5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
+      {
+       begin=1;
+       break;
+      }
+
+  if(!begin)
+    {
+      /* i.e. eof before the KEY BEGIN was found.  This isn't an
+        error. */
+      *eof=1;
+      ret=KEYSERVER_OK;
+      goto fail;
+    }
+
+  /* Now slurp up everything until we see the END */
+
+  while(fgets(line,MAX_LINE,input))
+    if(sscanf(line,"KEY%*[ ]%16s%*[ ]%3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
+      {
+       end=1;
+       break;
+      }
+    else
+      {
+       if(strlen(line)+keylen>keymax)
+         {
+           char *tmp;
+
+           keymax+=200;
+           tmp=realloc(key,keymax+1);
+           if(!tmp)
+             {
+               free(key);
+               fprintf(console,"gpgkeys: out of memory\n");
+               ret=KEYSERVER_NO_MEMORY;
+               goto fail;
+             }
+
+           key=tmp;
+         }
+
+       strcpy(&key[keylen],line);
+       keylen+=strlen(line);
+      }
+
+  if(!end)
+    {
+      fprintf(console,"gpgkeys: no KEY %s END found\n",keyid);
+      *eof=1;
+      ret=KEYSERVER_KEY_INCOMPLETE;
+      goto fail;
+    }
+
+  encoded_key=curl_escape(key,keylen);
+  if(!encoded_key)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  free(key);
+
+  key=malloc(8+strlen(encoded_key)+1);
+  if(!key)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  strcpy(key,"keytext=");
+  strcat(key,encoded_key);
+
+  strcpy(request,"http://");
+  strcat(request,opt->host);
+  strcat(request,":");
+  if(opt->port)
+    strcat(request,opt->port);
+  else
+    strcat(request,"11371");
+  strcat(request,opt->path);
+  /* request is MAX_URL+15 bytes long - MAX_URL covers the whole URL,
+     including any supplied path.  The 15 covers /pks/add. */
+  append_path(request,"/pks/add");
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: HTTP URL is `%s'\n",request);
+
+  curl_easy_setopt(curl,CURLOPT_URL,request);
+  curl_easy_setopt(curl,CURLOPT_POST,1);
+  curl_easy_setopt(curl,CURLOPT_POSTFIELDS,key);
+  curl_easy_setopt(curl,CURLOPT_FAILONERROR,1);
+
+  res=curl_easy_perform(curl);
+  if(res!=0)
+    {
+      fprintf(console,"gpgkeys: HTTP post error %d: %s\n",res,errorbuffer);
+      ret=curl_err_to_gpg_err(res);
+      goto fail;
+    }
+  else
+    fprintf(output,"\nKEY %s SENT\n",keyid);
+
+  ret=KEYSERVER_OK;
+
+ fail:
+  free(key);
+  curl_free(encoded_key);
+
+  if(ret!=0 && begin)
+    fprintf(output,"KEY %s FAILED %d\n",keyid,ret);
+
+  return ret;
+}
+
+static int
+get_key(char *getkey)
+{
+  CURLcode res;
+  char request[MAX_URL+60];
+  char *offset;
+  struct curl_writer_ctx ctx;
+
+  memset(&ctx,0,sizeof(ctx));
+
+  /* Build the search string.  HKP only uses the short key IDs. */
+
+  if(strncmp(getkey,"0x",2)==0)
+    getkey+=2;
+
+  fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+
+  if(strlen(getkey)==32)
+    {
+      fprintf(console,
+             "gpgkeys: HKP keyservers do not support v3 fingerprints\n");
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_NOT_SUPPORTED);
+      return KEYSERVER_NOT_SUPPORTED;
+    }
+
+  strcpy(request,"http://");
+  strcat(request,opt->host);
+  strcat(request,":");
+  if(opt->port)
+    strcat(request,opt->port);
+  else
+    strcat(request,"11371");
+  strcat(request,opt->path);
+  /* request is MAX_URL+55 bytes long - MAX_URL covers the whole URL,
+     including any supplied path.  The 60 overcovers this /pks/... etc
+     string plus the 8 bytes of key id */
+  append_path(request,"/pks/lookup?op=get&options=mr&search=0x");
+
+  /* fingerprint or long key id.  Take the last 8 characters and treat
+     it like a short key id */
+  if(strlen(getkey)>8)
+    offset=&getkey[strlen(getkey)-8];
+  else
+    offset=getkey;
+
+  strcat(request,offset);
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: HTTP URL is `%s'\n",request);
+
+  curl_easy_setopt(curl,CURLOPT_URL,request);
+  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
+  ctx.stream=output;
+  curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
+
+  res=curl_easy_perform(curl);
+  if(res!=CURLE_OK)
+    {
+      fprintf(console,"gpgkeys: HTTP fetch error %d: %s\n",res,errorbuffer);
+      fprintf(output,"\nKEY 0x%s FAILED %d\n",getkey,curl_err_to_gpg_err(res));
+    }
+  else
+    {
+      curl_writer_finalize(&ctx);
+      if(!ctx.flags.done)
+       {
+         fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
+         fprintf(output,"\nKEY 0x%s FAILED %d\n",
+                 getkey,KEYSERVER_KEY_NOT_FOUND);
+       }
+      else
+       fprintf(output,"\nKEY 0x%s END\n",getkey);
+    }
+
+  return KEYSERVER_OK;
+}
+
+static int
+get_name(const char *getkey)
+{
+  CURLcode res;
+  char *request=NULL;
+  char *searchkey_encoded;
+  int ret=KEYSERVER_INTERNAL_ERROR;
+  struct curl_writer_ctx ctx;
+
+  memset(&ctx,0,sizeof(ctx));
+
+  searchkey_encoded=curl_escape((char *)getkey,0);
+  if(!searchkey_encoded)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  request=malloc(MAX_URL+60+strlen(searchkey_encoded));
+  if(!request)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  fprintf(output,"NAME %s BEGIN\n",getkey);
+
+  strcpy(request,"http://");
+  strcat(request,opt->host);
+  strcat(request,":");
+  if(opt->port)
+    strcat(request,opt->port);
+  else
+    strcat(request,"11371");
+  strcat(request,opt->path);
+  append_path(request,"/pks/lookup?op=get&options=mr&search=");
+  strcat(request,searchkey_encoded);
+
+  if(opt->action==KS_GETNAME)
+    strcat(request,"&exact=on");
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: HTTP URL is `%s'\n",request);
+
+  curl_easy_setopt(curl,CURLOPT_URL,request);
+  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
+  ctx.stream=output;
+  curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
+
+  res=curl_easy_perform(curl);
+  if(res!=CURLE_OK)
+    {
+      fprintf(console,"gpgkeys: HTTP fetch error %d: %s\n",res,errorbuffer);
+      ret=curl_err_to_gpg_err(res);
+    }
+  else
+    {
+      curl_writer_finalize(&ctx);
+      if(!ctx.flags.done)
+       {
+         fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
+         ret=KEYSERVER_KEY_NOT_FOUND;
+       }
+      else
+       {
+         fprintf(output,"\nNAME %s END\n",getkey);
+         ret=KEYSERVER_OK;
+       }
+    }
+
+ fail:
+  curl_free(searchkey_encoded);
+  free(request);
+
+  if(ret!=KEYSERVER_OK)
+    fprintf(output,"\nNAME %s FAILED %d\n",getkey,ret);
+
+  return ret;
+}
+
+static int
+search_key(const char *searchkey)
+{
+  CURLcode res;
+  char *request=NULL;
+  char *searchkey_encoded;
+  int ret=KEYSERVER_INTERNAL_ERROR;
+  enum ks_search_type search_type;
+
+  search_type=classify_ks_search(&searchkey);
+
+  if(opt->debug)
+    fprintf(console,"gpgkeys: search type is %d, and key is \"%s\"\n",
+           search_type,searchkey);
+
+  searchkey_encoded=curl_escape((char *)searchkey,0);
+  if(!searchkey_encoded)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  request=malloc(MAX_URL+60+strlen(searchkey_encoded));
+  if(!request)
+    {
+      fprintf(console,"gpgkeys: out of memory\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  fprintf(output,"SEARCH %s BEGIN\n",searchkey);
+
+  strcpy(request,"http://");
+  strcat(request,opt->host);
+  strcat(request,":");
+  if(opt->port)
+    strcat(request,opt->port);
+  else
+    strcat(request,"11371");
+  strcat(request,opt->path);
+  append_path(request,"/pks/lookup?op=index&options=mr&search=");
+
+  /* HKP keyservers like the 0x to be present when searching by
+     keyid */
+  if(search_type==KS_SEARCH_KEYID_SHORT || search_type==KS_SEARCH_KEYID_LONG)
+    strcat(request,"0x");
+
+  strcat(request,searchkey_encoded);
+
+  if(search_type!=KS_SEARCH_SUBSTR)
+    strcat(request,"&exact=on");
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: HTTP URL is `%s'\n",request);
+
+  curl_easy_setopt(curl,CURLOPT_URL,request);
+  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_mrindex_writer);
+  curl_easy_setopt(curl,CURLOPT_FILE,output);
+
+  res=curl_easy_perform(curl);
+  if(res!=0)
+    {
+      fprintf(console,"gpgkeys: HTTP search error %d: %s\n",res,errorbuffer);
+      ret=curl_err_to_gpg_err(res);
+    }
+  else
+    {
+      fprintf(output,"\nSEARCH %s END\n",searchkey);
+      ret=KEYSERVER_OK;
+    }
+
+ fail:
+
+  curl_free(searchkey_encoded);
+  free(request);
+
+  if(ret!=KEYSERVER_OK)
+    fprintf(output,"\nSEARCH %s FAILED %d\n",searchkey,ret);
+
+  return ret;
+}
+
+void
+fail_all(struct keylist *keylist,int err)
+{
+  if(!keylist)
+    return;
+
+  if(opt->action==KS_SEARCH)
+    {
+      fprintf(output,"SEARCH ");
+      while(keylist)
+       {
+         fprintf(output,"%s ",keylist->str);
+         keylist=keylist->next;
+       }
+      fprintf(output,"FAILED %d\n",err);
+    }
+  else
+    while(keylist)
+      {
+       fprintf(output,"KEY %s FAILED %d\n",keylist->str,err);
+       keylist=keylist->next;
+      }
+}
+
+static void 
+show_help (FILE *fp)
+{
+  fprintf (fp,"-h\thelp\n");
+  fprintf (fp,"-V\tversion\n");
+  fprintf (fp,"-o\toutput to this file\n");
+}
+
+int
+main(int argc,char *argv[])
+{
+  int arg,ret=KEYSERVER_INTERNAL_ERROR;
+  char line[MAX_LINE];
+  int failed=0;
+  struct keylist *keylist=NULL,*keyptr=NULL;
+  char *proxy=NULL;
+
+  console=stderr;
+
+  /* Kludge to implement standard GNU options.  */
+  if (argc > 1 && !strcmp (argv[1], "--version"))
+    {
+      fputs ("gpgkeys_hkp (GnuPG) " VERSION"\n", stdout);
+      return 0;
+    }
+  else if (argc > 1 && !strcmp (argv[1], "--help"))
+    {
+      show_help (stdout);
+      return 0;
+    }
+
+  while((arg=getopt(argc,argv,"hVo:"))!=-1)
+    switch(arg)
+      {
+      default:
+      case 'h':
+        show_help (console);
+       return KEYSERVER_OK;
+
+      case 'V':
+       fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
+       return KEYSERVER_OK;
+
+      case 'o':
+       output=fopen(optarg,"w");
+       if(output==NULL)
+         {
+           fprintf(console,"gpgkeys: Cannot open output file `%s': %s\n",
+                   optarg,strerror(errno));
+           return KEYSERVER_INTERNAL_ERROR;
+         }
+
+       break;
+      }
+
+  if(argc>optind)
+    {
+      input=fopen(argv[optind],"r");
+      if(input==NULL)
+       {
+         fprintf(console,"gpgkeys: Cannot open input file `%s': %s\n",
+                 argv[optind],strerror(errno));
+         return KEYSERVER_INTERNAL_ERROR;
+       }
+    }
+
+  if(input==NULL)
+    input=stdin;
+
+  if(output==NULL)
+    output=stdout;
+
+  opt=init_ks_options();
+  if(!opt)
+    return KEYSERVER_NO_MEMORY;
+
+  /* Get the command and info block */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    {
+      int err;
+      char option[MAX_OPTION+1];
+
+      if(line[0]=='\n')
+       break;
+
+      err=parse_ks_options(line,opt);
+      if(err>0)
+       {
+         ret=err;
+         goto fail;
+       }
+      else if(err==0)
+       continue;
+
+      if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "s\n",option)==1)
+       {
+         int no=0;
+         char *start=&option[0];
+
+         option[MAX_OPTION]='\0';
+
+         if(strncasecmp(option,"no-",3)==0)
+           {
+             no=1;
+             start=&option[3];
+           }
+
+         if(strncasecmp(start,"http-proxy",10)==0)
+           {
+             if(no)
+               {
+                 free(proxy);
+                 proxy=strdup("");
+               }
+             else if(start[10]=='=')
+               {
+                 if(strlen(&start[11])<MAX_PROXY)
+                   {
+                     free(proxy);
+                     proxy=strdup(&start[11]);
+                   }
+               }
+           }
+#if 0
+         else if(strcasecmp(start,"try-dns-srv")==0)
+           {
+             if(no)
+               http_flags&=~HTTP_FLAG_TRY_SRV;
+             else
+               http_flags|=HTTP_FLAG_TRY_SRV;
+           }
+#endif
+         continue;
+       }
+    }
+
+  if(!opt->host)
+    {
+      fprintf(console,"gpgkeys: no keyserver host provided\n");
+      goto fail;
+    }
+
+  if(opt->timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
+  curl_global_init(CURL_GLOBAL_DEFAULT);
+  curl=curl_easy_init();
+  if(!curl)
+    {
+      fprintf(console,"gpgkeys: unable to initialize curl\n");
+      ret=KEYSERVER_INTERNAL_ERROR;
+      goto fail;
+    }
+
+  curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,errorbuffer);
+
+  if(opt->auth)
+    curl_easy_setopt(curl,CURLOPT_USERPWD,opt->auth);
+
+  if(opt->debug)
+    {
+      fprintf(console,"gpgkeys: curl version = %s\n",curl_version());
+      curl_easy_setopt(curl,CURLOPT_STDERR,console);
+      curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
+    }
+
+  if(proxy)
+    curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
+
+#if 0
+  /* By suggested convention, if the user gives a :port, then disable
+     SRV. */
+  if(opt->port)
+    http_flags&=~HTTP_FLAG_TRY_SRV;
+#endif
+
+  /* If it's a GET or a SEARCH, the next thing to come in is the
+     keyids.  If it's a SEND, then there are no keyids. */
+
+  if(opt->action==KS_SEND)
+    while(fgets(line,MAX_LINE,input)!=NULL && line[0]!='\n');
+  else if(opt->action==KS_GET
+         || opt->action==KS_GETNAME || opt->action==KS_SEARCH)
+    {
+      for(;;)
+       {
+         struct keylist *work;
+
+         if(fgets(line,MAX_LINE,input)==NULL)
+           break;
+         else
+           {
+             if(line[0]=='\n' || line[0]=='\0')
+               break;
+
+             work=malloc(sizeof(struct keylist));
+             if(work==NULL)
+               {
+                 fprintf(console,"gpgkeys: out of memory while "
+                         "building key list\n");
+                 ret=KEYSERVER_NO_MEMORY;
+                 goto fail;
+               }
+
+             strcpy(work->str,line);
+
+             /* Trim the trailing \n */
+             work->str[strlen(line)-1]='\0';
+
+             work->next=NULL;
+
+             /* Always attach at the end to keep the list in proper
+                 order for searching */
+             if(keylist==NULL)
+               keylist=work;
+             else
+               keyptr->next=work;
+
+             keyptr=work;
+           }
+       }
+    }
+  else
+    {
+      fprintf(console,"gpgkeys: no keyserver command specified\n");
+      goto fail;
+    }
+
+  /* Send the response */
+
+  fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
+  fprintf(output,"PROGRAM %s\n\n",VERSION);
+
+  if(opt->verbose>1)
+    {
+      fprintf(console,"Host:\t\t%s\n",opt->host);
+      if(opt->port)
+       fprintf(console,"Port:\t\t%s\n",opt->port);
+      if(strcmp(opt->path,"/")!=0)
+       fprintf(console,"Path:\t\t%s\n",opt->path);
+      fprintf(console,"Command:\t%s\n",ks_action_to_string(opt->action));
+    }
+
+  if(opt->action==KS_GET)
+    {
+      keyptr=keylist;
+
+      while(keyptr!=NULL)
+       {
+         set_timeout(opt->timeout);
+
+         if(get_key(keyptr->str)!=KEYSERVER_OK)
+           failed++;
+
+         keyptr=keyptr->next;
+       }
+    }
+  else if(opt->action==KS_GETNAME)
+    {
+      keyptr=keylist;
+
+      while(keyptr!=NULL)
+       {
+         set_timeout(opt->timeout);
+
+         if(get_name(keyptr->str)!=KEYSERVER_OK)
+           failed++;
+
+         keyptr=keyptr->next;
+       }
+    }
+  else if(opt->action==KS_SEND)
+    {
+      int eof=0;
+
+      do
+       {
+         set_timeout(opt->timeout);
+
+         if(send_key(&eof)!=KEYSERVER_OK)
+           failed++;
+       }
+      while(!eof);
+    }
+  else if(opt->action==KS_SEARCH)
+    {
+      char *searchkey=NULL;
+      int len=0;
+
+      set_timeout(opt->timeout);
+
+      /* To search, we stick a space in between each key to search
+        for. */
+
+      keyptr=keylist;
+      while(keyptr!=NULL)
+       {
+         len+=strlen(keyptr->str)+1;
+         keyptr=keyptr->next;
+       }
+
+      searchkey=malloc(len+1);
+      if(searchkey==NULL)
+       {
+         ret=KEYSERVER_NO_MEMORY;
+         fail_all(keylist,KEYSERVER_NO_MEMORY);
+         goto fail;
+       }
+
+      searchkey[0]='\0';
+
+      keyptr=keylist;
+      while(keyptr!=NULL)
+       {
+         strcat(searchkey,keyptr->str);
+         strcat(searchkey," ");
+         keyptr=keyptr->next;
+       }
+
+      /* Nail that last space */
+      if(*searchkey)
+       searchkey[strlen(searchkey)-1]='\0';
+
+      if(search_key(searchkey)!=KEYSERVER_OK)
+       failed++;
+
+      free(searchkey);
+    }
+  else
+    abort();
+
+  if(!failed)
+    ret=KEYSERVER_OK;
+
+ fail:
+  while(keylist!=NULL)
+    {
+      struct keylist *current=keylist;
+      keylist=keylist->next;
+      free(current);
+    }
+
+  if(input!=stdin)
+    fclose(input);
+
+  if(output!=stdout)
+    fclose(output);
+
+  free_ks_options(opt);
+
+  if(curl)
+    curl_easy_cleanup(curl);
+
+  free(proxy);
+
+  return ret;
+}
diff --git a/keyserver/gpgkeys_ldap.c b/keyserver/gpgkeys_ldap.c
new file mode 100644 (file)
index 0000000..1cc27f4
--- /dev/null
@@ -0,0 +1,2368 @@
+/* gpgkeys_ldap.c - talk to a LDAP keyserver
+ * Copyright (C) 2001, 2002, 2004, 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * In addition, as a special exception, the Free Software Foundation
+ * gives permission to link the code of the keyserver helper tools:
+ * gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
+ * project's "OpenSSL" library (or with modified versions of it that
+ * use the same license as the "OpenSSL" library), and distribute the
+ * linked executables.  You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL".  If
+ * you modify this file, you may extend this exception to your version
+ * of the file, but you are not obligated to do so.  If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+#include <stdlib.h>
+#include <errno.h>
+#include <assert.h>
+
+#ifdef _WIN32
+#include <winsock2.h>
+#include <winldap.h>
+#else
+#ifdef NEED_LBER_H
+#include <lber.h>
+#endif
+/* For OpenLDAP, to enable the API that we're using. */
+#define LDAP_DEPRECATED 1
+#include <ldap.h>
+#endif
+
+#include "compat.h"
+#include "keyserver.h"
+#include "ksutil.h"
+
+#ifdef __riscos__
+#include "util.h"
+#endif
+
+extern char *optarg;
+extern int optind;
+
+static int real_ldap=0;
+static char *basekeyspacedn=NULL;
+static char *pgpkeystr="pgpKey";
+static FILE *input=NULL,*output=NULL,*console=NULL;
+static LDAP *ldap=NULL;
+static struct ks_options *opt;
+
+#ifndef HAVE_TIMEGM
+time_t timegm(struct tm *tm);
+#endif
+
+static int
+ldap_err_to_gpg_err(int err)
+{
+  int ret;
+
+  switch(err)
+    {
+    case LDAP_ALREADY_EXISTS:
+      ret=KEYSERVER_KEY_EXISTS;
+      break;
+
+    case LDAP_SERVER_DOWN:
+      ret=KEYSERVER_UNREACHABLE;
+      break;
+
+    default:
+      ret=KEYSERVER_GENERAL_ERROR;
+      break;
+    }
+
+  return ret;
+}
+
+static int
+ldap_to_gpg_err(LDAP *ld)
+{
+#if defined(HAVE_LDAP_GET_OPTION) && defined(LDAP_OPT_ERROR_NUMBER)
+
+  int err;
+
+  if(ldap_get_option(ld,LDAP_OPT_ERROR_NUMBER,&err)==0)
+    return ldap_err_to_gpg_err(err);
+  else
+    return KEYSERVER_GENERAL_ERROR;
+
+#elif defined(HAVE_LDAP_LD_ERRNO)
+
+  return ldap_err_to_gpg_err(ld->ld_errno);
+
+#else
+
+  /* We should never get here since the LDAP library should always
+     have either ldap_get_option or ld_errno, but just in case... */
+  return KEYSERVER_GENERAL_ERROR;
+
+#endif
+}
+
+static int
+key_in_keylist(const char *key,struct keylist *list)
+{
+  struct keylist *keyptr=list;
+
+  while(keyptr!=NULL)
+    {
+      if(strcasecmp(key,keyptr->str)==0)
+       return 1;
+
+      keyptr=keyptr->next;
+    }
+
+  return 0;
+}
+
+static int
+add_key_to_keylist(const char *key,struct keylist **list)
+{
+  struct keylist *keyptr=malloc(sizeof(struct keylist));
+
+  if(keyptr==NULL)
+    {
+      fprintf(console,"gpgkeys: out of memory when deduping "
+             "key list\n");
+      return KEYSERVER_NO_MEMORY;
+    }
+
+  strncpy(keyptr->str,key,MAX_LINE);
+  keyptr->str[MAX_LINE-1]='\0';
+  keyptr->next=*list;
+  *list=keyptr;
+
+  return 0;
+}
+
+static void
+free_keylist(struct keylist *list)
+{
+  while(list!=NULL)
+    {
+      struct keylist *keyptr=list;
+
+      list=keyptr->next;
+      free(keyptr);
+    }
+}
+
+static time_t
+ldap2epochtime(const char *timestr)
+{
+  struct tm pgptime;
+  time_t answer;
+
+  memset(&pgptime,0,sizeof(pgptime));
+
+  /* YYYYMMDDHHmmssZ */
+
+  sscanf(timestr,"%4d%2d%2d%2d%2d%2d",
+        &pgptime.tm_year,
+        &pgptime.tm_mon,
+        &pgptime.tm_mday,
+        &pgptime.tm_hour,
+        &pgptime.tm_min,
+        &pgptime.tm_sec);
+
+  pgptime.tm_year-=1900;
+  pgptime.tm_isdst=-1;
+  pgptime.tm_mon--;
+
+  /* mktime() takes the timezone into account, so we use timegm() */
+
+  answer=timegm(&pgptime);
+
+  return answer;
+}
+
+/* Caller must free */
+static char *
+epoch2ldaptime(time_t stamp)
+{
+  struct tm *ldaptime;
+  char buf[16];
+
+  ldaptime=gmtime(&stamp);
+
+  ldaptime->tm_year+=1900;
+  ldaptime->tm_mon++;
+
+  /* YYYYMMDDHHmmssZ */
+
+  sprintf(buf,"%04d%02d%02d%02d%02d%02dZ",
+         ldaptime->tm_year,
+         ldaptime->tm_mon,
+         ldaptime->tm_mday,
+         ldaptime->tm_hour,
+         ldaptime->tm_min,
+         ldaptime->tm_sec);
+
+  return strdup(buf);
+}
+
+/* Append two onto the end of one.  Two is not freed, but its pointers
+   are now part of one.  Make sure you don't free them both! */
+static int
+join_two_modlists(LDAPMod ***one,LDAPMod **two)
+{
+  int i,one_count=0,two_count=0;
+  LDAPMod **grow;
+
+  for(grow=*one;*grow;grow++)
+    one_count++;
+
+  for(grow=two;*grow;grow++)
+    two_count++;
+
+  grow=realloc(*one,sizeof(LDAPMod *)*(one_count+two_count+1));
+  if(!grow)
+    return 0;
+
+  for(i=0;i<two_count;i++)
+    grow[one_count+i]=two[i];
+
+  grow[one_count+i]=NULL;
+
+  *one=grow;
+
+  return 1;
+}
+
+/* Passing a NULL for value effectively deletes that attribute.  This
+   doesn't mean "delete" in the sense of removing something from the
+   modlist, but "delete" in the LDAP sense of adding a modlist item
+   that specifies LDAP_MOD_REPLACE and a null attribute for the given
+   attribute.  LDAP_MOD_DELETE doesn't work here as we don't know if
+   the attribute in question exists or not. */
+
+static int
+make_one_attr(LDAPMod ***modlist,char *attr,const char *value)
+{
+  LDAPMod **m;
+  int nummods=0;
+
+  /* Search modlist for the attribute we're playing with. */
+  for(m=*modlist;*m;m++)
+    {
+      if(strcasecmp((*m)->mod_type,attr)==0)
+       {
+         char **ptr=(*m)->mod_values;
+         int numvalues=0;
+
+         /* We have this attribute already, so when the REPLACE
+            happens, the server attributes will be replaced
+            anyway. */
+         if(!value)
+           return 1;
+
+         if(ptr)
+           for(ptr=(*m)->mod_values;*ptr;ptr++)
+             {
+               /* Duplicate value */
+               if(strcmp(*ptr,value)==0)
+                 return 1;
+               numvalues++;
+             }
+
+         ptr=realloc((*m)->mod_values,sizeof(char *)*(numvalues+2));
+         if(!ptr)
+           return 0;
+
+         (*m)->mod_values=ptr;
+         ptr[numvalues]=strdup(value);
+         if(!ptr[numvalues])
+           return 0;
+
+         ptr[numvalues+1]=NULL;
+         break;
+       }
+
+      nummods++;
+    }
+
+  /* We didn't find the attr, so make one and add it to the end */
+  if(!*m)
+    {
+      LDAPMod **grow;
+
+      grow=realloc(*modlist,sizeof(LDAPMod *)*(nummods+2));
+      if(!grow)
+       return 0;
+
+      *modlist=grow;
+      grow[nummods]=malloc(sizeof(LDAPMod));
+      if(!grow[nummods])
+       return 0;
+      grow[nummods]->mod_op=LDAP_MOD_REPLACE;
+      grow[nummods]->mod_type=attr;
+      if(value)
+       {
+         grow[nummods]->mod_values=malloc(sizeof(char *)*2);
+         if(!grow[nummods]->mod_values)
+           {
+             grow[nummods]=NULL;
+             return 0;
+           }
+
+         /* Is this the right thing?  Can a UTF8-encoded user ID have
+            embedded nulls? */
+         grow[nummods]->mod_values[0]=strdup(value);
+         if(!grow[nummods]->mod_values[0])
+           {
+             free(grow[nummods]->mod_values);
+             grow[nummods]=NULL;
+             return 0;
+           }
+
+         grow[nummods]->mod_values[1]=NULL;
+       }
+      else
+       grow[nummods]->mod_values=NULL;
+
+      grow[nummods+1]=NULL;
+    }
+
+  return 1;
+}
+
+static void
+build_attrs(LDAPMod ***modlist,char *line)
+{
+  char *record;
+  int i;
+
+  /* Remove trailing whitespace */
+  for(i=strlen(line);i>0;i--)
+    if(ascii_isspace(line[i-1]))
+      line[i-1]='\0';
+    else
+      break;
+
+  if((record=strsep(&line,":"))==NULL)
+    return;
+
+  if (strcmp("pub",record)==0)
+    {
+      char *tok;
+      int disabled=0,revoked=0;
+
+      /* The long keyid */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(strlen(tok)==16)
+       {
+         make_one_attr(modlist,"pgpCertID",tok);
+         make_one_attr(modlist,"pgpKeyID",&tok[8]);
+       }
+      else
+       return;
+
+      /* The primary pubkey algo */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      switch(atoi(tok))
+       {
+       case 1:
+         make_one_attr(modlist,"pgpKeyType","RSA");
+         break;
+
+       case 17:
+         make_one_attr(modlist,"pgpKeyType","DSS/DH");
+         break;
+       }
+
+      /* Size of primary key */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(atoi(tok)>0)
+       {
+         char padded[6];
+         int val=atoi(tok);
+
+         /* We zero pad this on the left to make PGP happy. */
+
+         if(val<99999 && val>0)
+           {
+             sprintf(padded,"%05u",atoi(tok));
+             make_one_attr(modlist,"pgpKeySize",padded);
+           }
+       }
+
+      /* pk timestamp */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(atoi(tok)>0)
+       {
+         char *stamp=epoch2ldaptime(atoi(tok));
+         if(stamp)
+           {
+             make_one_attr(modlist,"pgpKeyCreateTime",stamp);
+             free(stamp);
+           }
+       }
+
+      /* pk expire */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(atoi(tok)>0)
+       {
+         char *stamp=epoch2ldaptime(atoi(tok));
+         if(stamp)
+           {
+             make_one_attr(modlist,"pgpKeyExpireTime",stamp);
+             free(stamp);
+           }
+       }
+
+      /* flags */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      while(*tok)
+       switch(*tok++)
+         {
+         case 'r':
+         case 'R':
+           revoked=1;
+           break;
+           
+         case 'd':
+         case 'D':
+           disabled=1;
+           break;
+         }
+
+      /*
+       Note that we always create the pgpDisabled and pgpRevoked
+       attributes, regardless of whether the key is disabled/revoked
+       or not.  This is because a very common search is like
+       "(&(pgpUserID=*isabella*)(pgpDisabled=0))"
+      */
+
+      make_one_attr(modlist,"pgpDisabled",disabled?"1":"0");
+      make_one_attr(modlist,"pgpRevoked",revoked?"1":"0");
+    }
+  else if (strcmp("sub",record)==0)
+    {
+      char *tok;
+
+      /* The long keyid */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(strlen(tok)==16)
+       make_one_attr(modlist,"pgpSubKeyID",tok);
+      else
+       return;
+
+      /* The subkey algo */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      /* Size of subkey */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(atoi(tok)>0)
+       {
+         char padded[6];
+         int val=atoi(tok);
+
+         /* We zero pad this on the left to make PGP happy. */
+
+         if(val<99999 && val>0)
+           {
+             sprintf(padded,"%05u",atoi(tok));
+             make_one_attr(modlist,"pgpKeySize",padded);
+           }
+       }
+
+      /* Ignore the rest of the items for subkeys since the LDAP
+        schema doesn't store them. */
+    }
+  else if (strcmp("uid",record)==0)
+    {
+      char *userid,*tok;
+
+      /* The user ID string */
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(strlen(tok)==0)
+       return;
+
+      userid=tok;
+
+      /* By definition, de-%-encoding is always smaller than the
+         original string so we can decode in place. */
+
+      i=0;
+
+      while(*tok)
+       if(tok[0]=='%' && tok[1] && tok[2])
+         {
+           if((userid[i]=hextobyte(&tok[1]))==-1)
+             userid[i]='?';
+
+           i++;
+           tok+=3;
+         }
+       else
+         userid[i++]=*tok++;
+
+      userid[i]='\0';
+
+      /* We don't care about the other info provided in the uid: line
+        since the LDAP schema doesn't need it. */
+
+      make_one_attr(modlist,"pgpUserID",userid);
+    }
+  else if(strcmp("sig",record)==0)
+    {
+      char *tok;
+
+      if((tok=strsep(&line,":"))==NULL)
+       return;
+
+      if(strlen(tok)==16)
+       make_one_attr(modlist,"pgpSignerID",tok);
+    }
+}
+
+static void
+free_mod_values(LDAPMod *mod)
+{
+  char **ptr;
+
+  if(!mod->mod_values)
+    return;
+
+  for(ptr=mod->mod_values;*ptr;ptr++)
+    free(*ptr);
+
+  free(mod->mod_values);
+}
+
+static int
+send_key(int *eof)
+{
+  int err,begin=0,end=0,keysize=1,ret=KEYSERVER_INTERNAL_ERROR;
+  char *dn=NULL,line[MAX_LINE],*key=NULL;
+  char keyid[17],state[6];
+  LDAPMod **modlist,**addlist,**ml;
+
+  modlist=malloc(sizeof(LDAPMod *));
+  if(!modlist)
+    {
+      fprintf(console,"gpgkeys: can't allocate memory for keyserver record\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  *modlist=NULL;
+
+  addlist=malloc(sizeof(LDAPMod *));
+  if(!addlist)
+    {
+      fprintf(console,"gpgkeys: can't allocate memory for keyserver record\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  *addlist=NULL;
+
+  /* Start by nulling out all attributes.  We try and do a modify
+     operation first, so this ensures that we don't leave old
+     attributes lying around. */
+  make_one_attr(&modlist,"pgpDisabled",NULL);
+  make_one_attr(&modlist,"pgpKeyID",NULL);
+  make_one_attr(&modlist,"pgpKeyType",NULL);
+  make_one_attr(&modlist,"pgpUserID",NULL);
+  make_one_attr(&modlist,"pgpKeyCreateTime",NULL);
+  make_one_attr(&modlist,"pgpSignerID",NULL);
+  make_one_attr(&modlist,"pgpRevoked",NULL);
+  make_one_attr(&modlist,"pgpSubKeyID",NULL);
+  make_one_attr(&modlist,"pgpKeySize",NULL);
+  make_one_attr(&modlist,"pgpKeyExpireTime",NULL);
+  make_one_attr(&modlist,"pgpCertID",NULL);
+
+  /* Assemble the INFO stuff into LDAP attributes */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"INFO%*[ ]%16s%*[ ]%5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
+      {
+       begin=1;
+       break;
+      }
+
+  if(!begin)
+    {
+      /* i.e. eof before the INFO BEGIN was found.  This isn't an
+        error. */
+      *eof=1;
+      ret=KEYSERVER_OK;
+      goto fail;
+    }
+
+  if(strlen(keyid)!=16)
+    {
+      *eof=1;
+      ret=KEYSERVER_KEY_INCOMPLETE;
+      goto fail;
+    }
+
+  dn=malloc(strlen("pgpCertID=")+16+1+strlen(basekeyspacedn)+1);
+  if(dn==NULL)
+    {
+      fprintf(console,"gpgkeys: can't allocate memory for keyserver record\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  sprintf(dn,"pgpCertID=%s,%s",keyid,basekeyspacedn);
+
+  key=malloc(1);
+  if(!key)
+    {
+      fprintf(console,"gpgkeys: unable to allocate memory for key\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  key[0]='\0';
+
+  /* Now parse each line until we see the END */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"INFO%*[ ]%16s%*[ ]%3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
+      {
+       end=1;
+       break;
+      }
+    else
+      build_attrs(&addlist,line);
+
+  if(!end)
+    {
+      fprintf(console,"gpgkeys: no INFO %s END found\n",keyid);
+      *eof=1;
+      ret=KEYSERVER_KEY_INCOMPLETE;
+      goto fail;
+    }
+
+  begin=end=0;
+
+  /* Read and throw away stdin until we see the BEGIN */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"KEY%*[ ]%16s%*[ ]%5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
+      {
+       begin=1;
+       break;
+      }
+
+  if(!begin)
+    {
+      /* i.e. eof before the KEY BEGIN was found.  This isn't an
+        error. */
+      *eof=1;
+      ret=KEYSERVER_OK;
+      goto fail;
+    }
+
+  /* Now slurp up everything until we see the END */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"KEY%*[ ]%16s%*[ ]%3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
+      {
+       end=1;
+       break;
+      }
+    else
+      {
+       char *tempkey;
+       keysize+=strlen(line);
+       tempkey=realloc(key,keysize);
+       if(tempkey==NULL)
+         {
+           fprintf(console,"gpgkeys: unable to reallocate for key\n");
+           ret=KEYSERVER_NO_MEMORY;
+           goto fail;
+         }
+       else
+         key=tempkey;
+
+       strcat(key,line);
+      }
+
+  if(!end)
+    {
+      fprintf(console,"gpgkeys: no KEY %s END found\n",keyid);
+      *eof=1;
+      ret=KEYSERVER_KEY_INCOMPLETE;
+      goto fail;
+    }
+
+  make_one_attr(&addlist,"objectClass","pgpKeyInfo");
+  make_one_attr(&addlist,"pgpKey",key);
+
+  /* Now append addlist onto modlist */
+  if(!join_two_modlists(&modlist,addlist))
+    {
+      fprintf(console,"gpgkeys: unable to merge LDAP modification lists\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  /* Going on the assumption that modify operations are more frequent
+     than adds, we try a modify first.  If it's not there, we just
+     turn around and send an add command for the same key.  Otherwise,
+     the modify brings the server copy into compliance with our copy.
+     Note that unlike the LDAP keyserver (and really, any other
+     keyserver) this does NOT merge signatures, but replaces the whole
+     key.  This should make some people very happy. */
+
+  err=ldap_modify_s(ldap,dn,modlist);
+  if(err==LDAP_NO_SUCH_OBJECT)
+    err=ldap_add_s(ldap,dn,addlist);
+
+  if(err!=LDAP_SUCCESS)
+    {
+      fprintf(console,"gpgkeys: error adding key %s to keyserver: %s\n",
+             keyid,ldap_err2string(err));
+      ret=ldap_err_to_gpg_err(err);
+      goto fail;
+    }
+
+  ret=KEYSERVER_OK;
+
+ fail:
+  /* Unwind and free the whole modlist structure */
+  for(ml=modlist;*ml;ml++)
+    {
+      free_mod_values(*ml);
+      free(*ml);
+    }
+
+  free(modlist);
+  free(addlist);
+  free(dn);
+
+  if(ret!=0 && begin)
+    fprintf(output,"KEY %s FAILED %d\n",keyid,ret);
+
+  return ret;
+}
+
+static int
+send_key_keyserver(int *eof)
+{
+  int err,begin=0,end=0,keysize=1,ret=KEYSERVER_INTERNAL_ERROR;
+  char *dn=NULL,line[MAX_LINE],*key[2]={NULL,NULL};
+  char keyid[17],state[6];
+  LDAPMod mod, *attrs[2];
+
+  memset(&mod,0,sizeof(mod));
+  mod.mod_op=LDAP_MOD_ADD;
+  mod.mod_type=pgpkeystr;
+  mod.mod_values=key;
+  attrs[0]=&mod;
+  attrs[1]=NULL;
+
+  dn=malloc(strlen("pgpCertid=virtual,")+strlen(basekeyspacedn)+1);
+  if(dn==NULL)
+    {
+      fprintf(console,"gpgkeys: can't allocate memory for keyserver record\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  strcpy(dn,"pgpCertid=virtual,");
+  strcat(dn,basekeyspacedn);
+
+  key[0]=malloc(1);
+  if(key[0]==NULL)
+    {
+      fprintf(console,"gpgkeys: unable to allocate memory for key\n");
+      ret=KEYSERVER_NO_MEMORY;
+      goto fail;
+    }
+
+  key[0][0]='\0';
+
+  /* Read and throw away stdin until we see the BEGIN */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"KEY%*[ ]%16s%*[ ]%5s\n",keyid,state)==2
+       && strcmp(state,"BEGIN")==0)
+      {
+       begin=1;
+       break;
+      }
+
+  if(!begin)
+    {
+      /* i.e. eof before the KEY BEGIN was found.  This isn't an
+        error. */
+      *eof=1;
+      ret=KEYSERVER_OK;
+      goto fail;
+    }
+
+  /* Now slurp up everything until we see the END */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    if(sscanf(line,"KEY%*[ ]%16s%*[ ]%3s\n",keyid,state)==2
+       && strcmp(state,"END")==0)
+      {
+       end=1;
+       break;
+      }
+    else
+      {
+       keysize+=strlen(line);
+       key[0]=realloc(key[0],keysize);
+       if(key[0]==NULL)
+         {
+           fprintf(console,"gpgkeys: unable to reallocate for key\n");
+           ret=KEYSERVER_NO_MEMORY;
+           goto fail;
+         }
+
+       strcat(key[0],line);
+      }
+
+  if(!end)
+    {
+      fprintf(console,"gpgkeys: no KEY %s END found\n",keyid);
+      *eof=1;
+      ret=KEYSERVER_KEY_INCOMPLETE;
+      goto fail;
+    }
+
+  err=ldap_add_s(ldap,dn,attrs);
+  if(err!=LDAP_SUCCESS)
+    {
+      fprintf(console,"gpgkeys: error adding key %s to keyserver: %s\n",
+             keyid,ldap_err2string(err));
+      ret=ldap_err_to_gpg_err(err);
+      goto fail;
+    }
+
+  ret=KEYSERVER_OK;
+
+ fail:
+
+  free(key[0]);
+  free(dn);
+
+  if(ret!=0 && begin)
+    fprintf(output,"KEY %s FAILED %d\n",keyid,ret);
+
+  /* Not a fatal error */
+  if(ret==KEYSERVER_KEY_EXISTS)
+    ret=KEYSERVER_OK;
+
+  return ret;
+}
+
+static void
+build_info(const char *certid,LDAPMessage *each)
+{
+  char **vals;
+
+  fprintf(output,"INFO %s BEGIN\n",certid);
+
+  fprintf(output,"pub:%s:",certid);
+
+  vals=ldap_get_values(ldap,each,"pgpkeytype");
+  if(vals!=NULL)
+    {
+      if(strcmp(vals[0],"RSA")==0)
+       fprintf(output,"1");
+      else if(strcmp(vals[0],"DSS/DH")==0)
+       fprintf(output,"17");
+      ldap_value_free(vals);
+    }
+
+  fprintf(output,":");
+
+  vals=ldap_get_values(ldap,each,"pgpkeysize");
+  if(vals!=NULL)
+    {
+      if(atoi(vals[0])>0)
+       fprintf(output,"%d",atoi(vals[0]));
+      ldap_value_free(vals);
+    }
+
+  fprintf(output,":");
+
+  vals=ldap_get_values(ldap,each,"pgpkeycreatetime");
+  if(vals!=NULL)
+    {
+      if(strlen(vals[0])==15)
+       fprintf(output,"%u",(unsigned int)ldap2epochtime(vals[0]));
+      ldap_value_free(vals);
+    }
+
+  fprintf(output,":");
+
+  vals=ldap_get_values(ldap,each,"pgpkeyexpiretime");
+  if(vals!=NULL)
+    {
+      if(strlen(vals[0])==15)
+       fprintf(output,"%u",(unsigned int)ldap2epochtime(vals[0]));
+      ldap_value_free(vals);
+    }
+
+  fprintf(output,":");
+
+  vals=ldap_get_values(ldap,each,"pgprevoked");
+  if(vals!=NULL)
+    {
+      if(atoi(vals[0])==1)
+       fprintf(output,"r");
+      ldap_value_free(vals);
+    }
+
+  fprintf(output,"\n");
+
+  vals=ldap_get_values(ldap,each,"pgpuserid");
+  if(vals!=NULL)
+    {
+      int i;
+
+      for(i=0;vals[i];i++)
+       fprintf(output,"uid:%s\n",vals[i]);
+      ldap_value_free(vals);
+    }
+
+  fprintf(output,"INFO %s END\n",certid);
+}
+
+/* Note that key-not-found is not a fatal error */
+static int
+get_key(char *getkey)
+{
+  LDAPMessage *res,*each;
+  int ret=KEYSERVER_INTERNAL_ERROR,err,count;
+  struct keylist *dupelist=NULL;
+  char search[62];
+  /* This ordering is significant - specifically, "pgpcertid" needs to
+     be the second item in the list, since everything after it may be
+     discarded if the user isn't in verbose mode. */
+  char *attrs[]={"replaceme","pgpcertid","pgpuserid","pgpkeyid","pgprevoked",
+                "pgpdisabled","pgpkeycreatetime","modifytimestamp",
+                "pgpkeysize","pgpkeytype",NULL};
+  attrs[0]=pgpkeystr; /* Some compilers don't like using variables as
+                         array initializers. */
+
+  /* Build the search string */
+
+  /* GPG can send us a v4 fingerprint, a v3 or v4 long key id, or a v3
+     or v4 short key id */
+
+  if(strncmp(getkey,"0x",2)==0)
+    getkey+=2;
+
+  if(strlen(getkey)==32)
+    {
+      fprintf(console,
+             "gpgkeys: LDAP keyservers do not support v3 fingerprints\n");
+      fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_NOT_SUPPORTED);
+      return KEYSERVER_NOT_SUPPORTED;
+    }
+
+  if(strlen(getkey)>16)
+    {
+      char *offset=&getkey[strlen(getkey)-16];
+
+      /* fingerprint.  Take the last 16 characters and treat it like a
+         long key id */
+
+      if(opt->flags.include_subkeys)
+       sprintf(search,"(|(pgpcertid=%.16s)(pgpsubkeyid=%.16s))",
+               offset,offset);
+      else
+       sprintf(search,"(pgpcertid=%.16s)",offset);
+    }
+  else if(strlen(getkey)>8)
+    {
+      /* long key id */
+
+      if(opt->flags.include_subkeys)
+       sprintf(search,"(|(pgpcertid=%.16s)(pgpsubkeyid=%.16s))",
+               getkey,getkey);
+      else
+       sprintf(search,"(pgpcertid=%.16s)",getkey);
+    }
+  else
+    {
+      /* short key id */
+    
+      sprintf(search,"(pgpkeyid=%.8s)",getkey);
+    }
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: LDAP fetch for: %s\n",search);
+
+  if(!opt->verbose)
+    attrs[2]=NULL; /* keep only pgpkey(v2) and pgpcertid */
+
+  err=ldap_search_s(ldap,basekeyspacedn,
+                   LDAP_SCOPE_SUBTREE,search,attrs,0,&res);
+  if(err!=0)
+    {
+      int errtag=ldap_err_to_gpg_err(err);
+
+      fprintf(console,"gpgkeys: LDAP search error: %s\n",ldap_err2string(err));
+      fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey,errtag);
+      return errtag;
+    }
+
+  count=ldap_count_entries(ldap,res);
+  if(count<1)
+    {
+      fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
+      fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+      fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_KEY_NOT_FOUND);
+    }
+  else
+    {
+      /* There may be more than one unique result for a given keyID,
+        so we should fetch them all (test this by fetching short key
+        id 0xDEADBEEF). */
+
+      each=ldap_first_entry(ldap,res);
+      while(each!=NULL)
+       {
+         char **vals,**certid;
+
+         /* Use the long keyid to remove duplicates.  The LDAP server
+            returns the same keyid more than once if there are
+            multiple user IDs on the key.  Note that this does NOT
+            mean that a keyid that exists multiple times on the
+            keyserver will not be fetched.  It means that each KEY,
+            no matter how many user IDs share its keyid, will be
+            fetched only once.  If a keyid that belongs to more than
+            one key is fetched, the server quite properly responds
+            with all matching keys. -ds */
+
+         certid=ldap_get_values(ldap,each,"pgpcertid");
+         if(certid!=NULL)
+           {
+             if(!key_in_keylist(certid[0],dupelist))
+               {
+                 /* it's not a duplicate, so add it */
+
+                 int rc=add_key_to_keylist(certid[0],&dupelist);
+                 if(rc)
+                   {
+                     ret=rc;
+                     goto fail;
+                   }
+
+                 build_info(certid[0],each);
+
+                 fprintf(output,"KEY 0x%s BEGIN\n",getkey);
+
+                 vals=ldap_get_values(ldap,each,pgpkeystr);
+                 if(vals==NULL)
+                   {
+                     int errtag=ldap_to_gpg_err(ldap);
+
+                     fprintf(console,"gpgkeys: unable to retrieve key %s "
+                             "from keyserver\n",getkey);
+                     fprintf(output,"KEY 0x%s FAILED %d\n",getkey,errtag);
+                   }
+                 else
+                   {
+                     print_nocr(output,vals[0]);
+                     fprintf(output,"\nKEY 0x%s END\n",getkey);
+
+                     ldap_value_free(vals);
+                   }
+               }
+
+             ldap_value_free(certid);
+           }
+
+         each=ldap_next_entry(ldap,each);
+       }
+    }
+
+  ret=KEYSERVER_OK;
+
+ fail:
+  ldap_msgfree(res);
+  free_keylist(dupelist);
+
+  return ret;
+}
+
+#define LDAP_ESCAPE_CHARS "*()\\"
+
+/* Append string to buffer in a LDAP-quoted way */
+static void
+ldap_quote(char *buffer,const char *string)
+{
+  /* Find the end of buffer */
+  buffer+=strlen(buffer);
+
+  for(;*string;string++)
+    {
+      if(strchr(LDAP_ESCAPE_CHARS,*string))
+       {
+         sprintf(buffer,"\\%02X",*string);
+         buffer+=3;
+       }
+      else
+       *buffer++=*string;
+    }
+
+  *buffer='\0';
+}
+
+/* Note that key-not-found is not a fatal error */
+static int
+get_name(char *getkey)
+{
+  LDAPMessage *res,*each;
+  int ret=KEYSERVER_INTERNAL_ERROR,err,count;
+  /* The maximum size of the search, including the optional stuff and
+     the trailing \0 */
+  char search[2+12+(MAX_LINE*3)+2+15+14+1+1+20];
+  /* This ordering is significant - specifically, "pgpcertid" needs to
+     be the second item in the list, since everything after it may be
+     discarded if the user isn't in verbose mode. */
+  char *attrs[]={"replaceme","pgpcertid","pgpuserid","pgpkeyid","pgprevoked",
+                "pgpdisabled","pgpkeycreatetime","modifytimestamp",
+                "pgpkeysize","pgpkeytype",NULL};
+  attrs[0]=pgpkeystr; /* Some compilers don't like using variables as
+                         array initializers. */
+
+  /* Build the search string */
+
+  search[0]='\0';
+
+  if(!opt->flags.include_disabled || !opt->flags.include_revoked)
+    strcat(search,"(&");
+
+  strcat(search,"(pgpUserID=*");
+  ldap_quote(search,getkey);
+  strcat(search,"*)");
+
+  if(!opt->flags.include_disabled)
+    strcat(search,"(pgpDisabled=0)");
+
+  if(!opt->flags.include_revoked)
+    strcat(search,"(pgpRevoked=0)");
+
+  if(!opt->flags.include_disabled || !opt->flags.include_revoked)
+    strcat(search,")");
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: LDAP fetch for: %s\n",search);
+
+  if(!opt->verbose)
+    attrs[2]=NULL; /* keep only pgpkey(v2) and pgpcertid */
+
+  err=ldap_search_s(ldap,basekeyspacedn,
+                   LDAP_SCOPE_SUBTREE,search,attrs,0,&res);
+  if(err!=0)
+    {
+      int errtag=ldap_err_to_gpg_err(err);
+
+      fprintf(console,"gpgkeys: LDAP search error: %s\n",ldap_err2string(err));
+      fprintf(output,"NAME %s BEGIN\n",getkey);
+      fprintf(output,"NAME %s FAILED %d\n",getkey,errtag);
+      return errtag;
+    }
+
+  count=ldap_count_entries(ldap,res);
+  if(count<1)
+    {
+      fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
+      fprintf(output,"NAME %s BEGIN\n",getkey);
+      fprintf(output,"NAME %s FAILED %d\n",getkey,KEYSERVER_KEY_NOT_FOUND);
+    }
+  else
+    {
+      /* There may be more than one result, but we return them all. */
+
+      each=ldap_first_entry(ldap,res);
+      while(each!=NULL)
+       {
+         char **vals,**certid;
+
+         certid=ldap_get_values(ldap,each,"pgpcertid");
+         if(certid!=NULL)
+           {
+             build_info(certid[0],each);
+
+             fprintf(output,"NAME %s BEGIN\n",getkey);
+
+             vals=ldap_get_values(ldap,each,pgpkeystr);
+             if(vals==NULL)
+               {
+                 int errtag=ldap_to_gpg_err(ldap);
+
+                 fprintf(console,"gpgkeys: unable to retrieve key %s "
+                         "from keyserver\n",getkey);
+                 fprintf(output,"NAME %s FAILED %d\n",getkey,errtag);
+               }
+             else
+               {
+                 print_nocr(output,vals[0]);
+                 fprintf(output,"\nNAME %s END\n",getkey);
+
+                 ldap_value_free(vals);
+               }
+
+             ldap_value_free(certid);
+           }
+
+         each=ldap_next_entry(ldap,each);
+       }
+    }
+
+  ret=KEYSERVER_OK;
+
+  ldap_msgfree(res);
+
+  return ret;
+}
+
+static void
+printquoted(FILE *stream,char *string,char delim)
+{
+  while(*string)
+    {
+      if(*string==delim || *string=='%')
+       fprintf(stream,"%%%02x",(unsigned char)*string);
+      else
+       fputc(*string,stream);
+
+      string++;
+    }
+}
+
+/* Returns 0 on success and -1 on error.  Note that key-not-found is
+   not an error! */
+static int
+search_key(const char *searchkey)
+{
+  char **vals;
+  LDAPMessage *res,*each;
+  int err,count=0;
+  struct keylist *dupelist=NULL;
+  /* The maximum size of the search, including the optional stuff and
+     the trailing \0 */
+  char search[2+1+9+1+3+(MAX_LINE*3)+3+1+15+14+1+1+20];
+  char *attrs[]={"pgpcertid","pgpuserid","pgprevoked","pgpdisabled",
+                "pgpkeycreatetime","pgpkeyexpiretime","modifytimestamp",
+                "pgpkeysize","pgpkeytype",NULL};
+  enum ks_search_type search_type;
+
+  fprintf(output,"SEARCH %s BEGIN\n",searchkey);
+
+  search_type=classify_ks_search(&searchkey);
+
+  if(opt->debug)
+    fprintf(console,"search type is %d, and key is \"%s\"\n",
+           search_type,searchkey);
+
+  /* Build the search string */
+
+  search[0]='\0';
+
+  if(!opt->flags.include_disabled || !opt->flags.include_revoked)
+    strcat(search,"(&");
+
+  strcat(search,"(");
+
+  switch(search_type)
+    {
+    case KS_SEARCH_KEYID_SHORT:
+      strcat(search,"pgpKeyID");
+      break;
+
+    case KS_SEARCH_KEYID_LONG:
+      strcat(search,"pgpCertID");
+      break;
+
+    default:
+      strcat(search,"pgpUserID");
+      break;
+    }
+
+  strcat(search,"=");
+
+  switch(search_type)
+    {
+    case KS_SEARCH_SUBSTR:
+      strcat(search,"*");
+      break;
+
+    case KS_SEARCH_MAIL:
+      strcat(search,"*<");
+      break;
+
+    case KS_SEARCH_MAILSUB:
+      strcat(search,"*<*");
+      break;
+
+    case KS_SEARCH_EXACT:
+    case KS_SEARCH_KEYID_LONG:
+    case KS_SEARCH_KEYID_SHORT:
+      break;
+    }
+
+  ldap_quote(search,searchkey);
+
+  switch(search_type)
+    {
+    case KS_SEARCH_SUBSTR:
+      strcat(search,"*");
+      break;
+
+    case KS_SEARCH_MAIL:
+      strcat(search,">*");
+      break;
+
+    case KS_SEARCH_MAILSUB:
+      strcat(search,"*>*");
+      break;
+
+    case KS_SEARCH_EXACT:
+    case KS_SEARCH_KEYID_LONG:
+    case KS_SEARCH_KEYID_SHORT:
+      break;
+    }
+
+  strcat(search,")");
+
+  if(!opt->flags.include_disabled)
+    strcat(search,"(pgpDisabled=0)");
+
+  if(!opt->flags.include_revoked)
+    strcat(search,"(pgpRevoked=0)");
+
+  if(!opt->flags.include_disabled || !opt->flags.include_revoked)
+    strcat(search,")");
+
+  if(opt->verbose>2)
+    fprintf(console,"gpgkeys: LDAP search for: %s\n",search);
+
+  err=ldap_search_s(ldap,basekeyspacedn,
+                   LDAP_SCOPE_SUBTREE,search,attrs,0,&res);
+  if(err!=LDAP_SUCCESS && err!=LDAP_SIZELIMIT_EXCEEDED)
+    {
+      int errtag=ldap_err_to_gpg_err(err);
+
+      fprintf(output,"SEARCH %s FAILED %d\n",searchkey,errtag);
+      fprintf(console,"gpgkeys: LDAP search error: %s\n",ldap_err2string(err));
+      return errtag;
+    }
+
+  /* The LDAP server doesn't return a real count of unique keys, so we
+     can't use ldap_count_entries here. */
+  each=ldap_first_entry(ldap,res);
+  while(each!=NULL)
+    {
+      char **certid=ldap_get_values(ldap,each,"pgpcertid");
+
+      if(certid!=NULL)
+       {
+         if(!key_in_keylist(certid[0],dupelist))
+           {
+             int rc=add_key_to_keylist(certid[0],&dupelist);
+             if(rc!=0)
+               {
+                 fprintf(output,"SEARCH %s FAILED %d\n",searchkey,rc);
+                 free_keylist(dupelist);
+                 return rc;
+               }
+
+             count++;
+           }
+       }
+
+      each=ldap_next_entry(ldap,each);
+    }
+
+  if(err==LDAP_SIZELIMIT_EXCEEDED)
+    {
+      if(count==1)
+       fprintf(console,"gpgkeys: search results exceeded server limit."
+               "  First %d result shown.\n",count);
+      else
+       fprintf(console,"gpgkeys: search results exceeded server limit."
+               "  First %d results shown.\n",count);
+    }
+
+  free_keylist(dupelist);
+  dupelist=NULL;
+
+  if(count<1)
+    fprintf(output,"info:1:0\n");
+  else
+    {
+      fprintf(output,"info:1:%d\n",count);
+
+      each=ldap_first_entry(ldap,res);
+      while(each!=NULL)
+       {
+         char **certid;
+
+         certid=ldap_get_values(ldap,each,"pgpcertid");
+         if(certid!=NULL)
+           {
+             LDAPMessage *uids;
+
+             /* Have we seen this certid before? */
+             if(!key_in_keylist(certid[0],dupelist))
+               {
+                 int rc=add_key_to_keylist(certid[0],&dupelist);
+                 if(rc)
+                   {
+                     fprintf(output,"SEARCH %s FAILED %d\n",searchkey,rc);
+                     free_keylist(dupelist);
+                     ldap_value_free(certid);
+                     ldap_msgfree(res);
+                     return rc;
+                   }
+
+                 fprintf(output,"pub:%s:",certid[0]);
+
+                 vals=ldap_get_values(ldap,each,"pgpkeytype");
+                 if(vals!=NULL)
+                   {
+                     /* The LDAP server doesn't exactly handle this
+                        well. */
+                     if(strcasecmp(vals[0],"RSA")==0)
+                       fprintf(output,"1");
+                     else if(strcasecmp(vals[0],"DSS/DH")==0)
+                       fprintf(output,"17");
+                     ldap_value_free(vals);
+                   }
+
+                 fputc(':',output);
+
+                 vals=ldap_get_values(ldap,each,"pgpkeysize");
+                 if(vals!=NULL)
+                   {
+                     /* Not sure why, but some keys are listed with a
+                        key size of 0.  Treat that like an
+                        unknown. */
+                     if(atoi(vals[0])>0)
+                       fprintf(output,"%d",atoi(vals[0]));
+                     ldap_value_free(vals);
+                   }
+
+                 fputc(':',output);
+
+                 /* YYYYMMDDHHmmssZ */
+
+                 vals=ldap_get_values(ldap,each,"pgpkeycreatetime");
+                 if(vals!=NULL && strlen(vals[0])==15)
+                   {
+                     fprintf(output,"%u",
+                             (unsigned int)ldap2epochtime(vals[0]));
+                     ldap_value_free(vals);
+                   }
+
+                 fputc(':',output);
+
+                 vals=ldap_get_values(ldap,each,"pgpkeyexpiretime");
+                 if(vals!=NULL && strlen(vals[0])==15)
+                   {
+                     fprintf(output,"%u",
+                             (unsigned int)ldap2epochtime(vals[0]));
+                     ldap_value_free(vals);
+                   }
+
+                 fputc(':',output);
+
+                 vals=ldap_get_values(ldap,each,"pgprevoked");
+                 if(vals!=NULL)
+                   {
+                     if(atoi(vals[0])==1)
+                       fprintf(output,"r");
+                     ldap_value_free(vals);
+                   }
+
+                 vals=ldap_get_values(ldap,each,"pgpdisabled");
+                 if(vals!=NULL)
+                   {
+                     if(atoi(vals[0])==1)
+                       fprintf(output,"d");
+                     ldap_value_free(vals);
+                   }
+
+#if 0
+                 /* This is not yet specified in the keyserver
+                    protocol, but may be someday. */
+                 fputc(':',output);
+
+                 vals=ldap_get_values(ldap,each,"modifytimestamp");
+                 if(vals!=NULL && strlen(vals[0])==15)
+                   {
+                     fprintf(output,"%u",
+                             (unsigned int)ldap2epochtime(vals[0]));
+                     ldap_value_free(vals);
+                   }
+#endif
+
+                 fprintf(output,"\n");
+
+                 /* Now print all the uids that have this certid */
+                 uids=ldap_first_entry(ldap,res);
+                 while(uids!=NULL)
+                   {
+                     vals=ldap_get_values(ldap,uids,"pgpcertid");
+                     if(vals!=NULL)
+                       {
+                         if(strcasecmp(certid[0],vals[0])==0)
+                           {
+                             char **uidvals;
+
+                             fprintf(output,"uid:");
+
+                             uidvals=ldap_get_values(ldap,uids,"pgpuserid");
+                             if(uidvals!=NULL)
+                               {
+                                 /* Need to escape any colons */
+                                 printquoted(output,uidvals[0],':');
+                                 ldap_value_free(uidvals);
+                               }
+
+                             fprintf(output,"\n");
+                           }
+
+                         ldap_value_free(vals);
+                       }
+
+                     uids=ldap_next_entry(ldap,uids);
+                   }
+               }
+
+             ldap_value_free(certid);
+           }
+
+         each=ldap_next_entry(ldap,each);
+       }
+    }
+
+  ldap_msgfree(res);
+  free_keylist(dupelist);
+
+  fprintf(output,"SEARCH %s END\n",searchkey);
+
+  return KEYSERVER_OK;
+}
+
+static void
+fail_all(struct keylist *keylist,int err)
+{
+  if(!keylist)
+    return;
+
+  if(opt->action==KS_SEARCH)
+    {
+      fprintf(output,"SEARCH ");
+      while(keylist)
+       {
+         fprintf(output,"%s ",keylist->str);
+         keylist=keylist->next;
+       }
+      fprintf(output,"FAILED %d\n",err);
+    }
+  else
+    while(keylist)
+      {
+       fprintf(output,"KEY %s FAILED %d\n",keylist->str,err);
+       keylist=keylist->next;
+      }
+}
+
+static int
+find_basekeyspacedn(void)
+{
+  int err,i;
+  char *attr[]={"namingContexts",NULL,NULL,NULL};
+  LDAPMessage *res;
+  char **context;
+
+  /* Look for namingContexts */
+  err=ldap_search_s(ldap,"",LDAP_SCOPE_BASE,"(objectClass=*)",attr,0,&res);
+  if(err==LDAP_SUCCESS)
+    {
+      context=ldap_get_values(ldap,res,"namingContexts");
+      if(context)
+       {
+         attr[0]="pgpBaseKeySpaceDN";
+         attr[1]="pgpVersion";
+         attr[2]="pgpSoftware";
+
+         real_ldap=1;
+
+         /* We found some, so try each namingContext as the search base
+            and look for pgpBaseKeySpaceDN.  Because we found this, we
+            know we're talking to a regular-ish LDAP server and not a
+            LDAP keyserver. */
+
+         for(i=0;context[i] && !basekeyspacedn;i++)
+           {
+             char **vals;
+             LDAPMessage *si_res;
+             char *object;
+
+             object=malloc(17+strlen(context[i])+1);
+             if(!object)
+               return -1;
+
+             strcpy(object,"cn=pgpServerInfo,");
+             strcat(object,context[i]);
+
+             err=ldap_search_s(ldap,object,LDAP_SCOPE_BASE,
+                               "(objectClass=*)",attr,0,&si_res);
+             free(object);
+
+             if(err==LDAP_NO_SUCH_OBJECT)
+               continue;
+             else if(err!=LDAP_SUCCESS)
+               return err;
+
+             vals=ldap_get_values(ldap,si_res,"pgpBaseKeySpaceDN");
+             if(vals)
+               {
+                 basekeyspacedn=strdup(vals[0]);
+                 ldap_value_free(vals);
+               }
+
+             if(opt->verbose>1)
+               {
+                 vals=ldap_get_values(ldap,si_res,"pgpSoftware");
+                 if(vals)
+                   {
+                     fprintf(console,"Server: \t%s\n",vals[0]);
+                     ldap_value_free(vals);
+                   }
+
+                 vals=ldap_get_values(ldap,si_res,"pgpVersion");
+                 if(vals)
+                   {
+                     fprintf(console,"Version:\t%s\n",vals[0]);
+                     ldap_value_free(vals);
+                   }
+               }
+
+             ldap_msgfree(si_res);
+           }
+
+         ldap_value_free(context);
+       }
+
+      ldap_msgfree(res);
+    }
+  else
+    {
+      /* We don't have an answer yet, which means the server might be
+        a LDAP keyserver. */
+      char **vals;
+      LDAPMessage *si_res;
+
+      attr[0]="pgpBaseKeySpaceDN";
+      attr[1]="version";
+      attr[2]="software";
+
+      err=ldap_search_s(ldap,"cn=pgpServerInfo",LDAP_SCOPE_BASE,
+                       "(objectClass=*)",attr,0,&si_res);
+      if(err!=LDAP_SUCCESS)
+       return err;
+
+      /* For the LDAP keyserver, this is always "OU=ACTIVE,O=PGP
+        KEYSPACE,C=US", but it might not be in the future. */
+
+      vals=ldap_get_values(ldap,si_res,"baseKeySpaceDN");
+      if(vals)
+       {
+         basekeyspacedn=strdup(vals[0]);
+         ldap_value_free(vals);
+       }
+
+      if(opt->verbose>1)
+       {
+         vals=ldap_get_values(ldap,si_res,"software");
+         if(vals)
+           {
+             fprintf(console,"Server: \t%s\n",vals[0]);
+             ldap_value_free(vals);
+           }
+       }
+
+      vals=ldap_get_values(ldap,si_res,"version");
+      if(vals)
+       {
+         if(opt->verbose>1)
+           fprintf(console,"Version:\t%s\n",vals[0]);
+
+         /* If the version is high enough, use the new pgpKeyV2
+            attribute.  This design if iffy at best, but it matches how
+            PGP does it.  I figure the NAI folks assumed that there would
+            never be a LDAP keyserver vendor with a different numbering
+            scheme. */
+         if(atoi(vals[0])>1)
+           pgpkeystr="pgpKeyV2";
+
+         ldap_value_free(vals);
+       }
+
+      ldap_msgfree(si_res);
+    }   
+
+  return LDAP_SUCCESS;
+}
+
+static void 
+show_help (FILE *fp)
+{
+  fprintf (fp,"-h\thelp\n");
+  fprintf (fp,"-V\tversion\n");
+  fprintf (fp,"-o\toutput to this file\n");
+}
+
+int
+main(int argc,char *argv[])
+{
+  int port=0,arg,err,ret=KEYSERVER_INTERNAL_ERROR;
+  char line[MAX_LINE],*binddn=NULL,*bindpw=NULL;
+  int failed=0,use_ssl=0,use_tls=0,bound=0;
+  struct keylist *keylist=NULL,*keyptr=NULL;
+
+  console=stderr;
+
+  /* Kludge to implement standard GNU options.  */
+  if (argc > 1 && !strcmp (argv[1], "--version"))
+    {
+      fputs ("gpgkeys_ldap (GnuPG) " VERSION"\n", stdout);
+      return 0;
+    }
+  else if (argc > 1 && !strcmp (argv[1], "--help"))
+    {
+      show_help (stdout);
+      return 0;
+    }
+
+  while((arg=getopt(argc,argv,"hVo:"))!=-1)
+    switch(arg)
+      {
+      default:
+      case 'h':
+        show_help (console);
+       return KEYSERVER_OK;
+
+      case 'V':
+       fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
+       return KEYSERVER_OK;
+
+      case 'o':
+       output=fopen(optarg,"w");
+       if(output==NULL)
+         {
+           fprintf(console,"gpgkeys: Cannot open output file `%s': %s\n",
+                   optarg,strerror(errno));
+           return KEYSERVER_INTERNAL_ERROR;
+         }
+
+       break;
+      }
+
+  if(argc>optind)
+    {
+      input=fopen(argv[optind],"r");
+      if(input==NULL)
+       {
+         fprintf(console,"gpgkeys: Cannot open input file `%s': %s\n",
+                 argv[optind],strerror(errno));
+         return KEYSERVER_INTERNAL_ERROR;
+       }
+    }
+
+  if(input==NULL)
+    input=stdin;
+
+  if(output==NULL)
+    output=stdout;
+
+  opt=init_ks_options();
+  if(!opt)
+    return KEYSERVER_NO_MEMORY;
+
+  /* Get the command and info block */
+
+  while(fgets(line,MAX_LINE,input)!=NULL)
+    {
+      char optionstr[MAX_OPTION+1];
+
+      if(line[0]=='\n')
+       break;
+
+      err=parse_ks_options(line,opt);
+      if(err>0)
+       {
+         ret=err;
+         goto fail;
+       }
+      else if(err==0)
+       continue;
+
+      if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "[^\n]\n",optionstr)==1)
+       {
+         int no=0;
+         char *start=&optionstr[0];
+
+         optionstr[MAX_OPTION]='\0';
+
+         if(strncasecmp(optionstr,"no-",3)==0)
+           {
+             no=1;
+             start=&optionstr[3];
+           }
+
+         if(strncasecmp(start,"tls",3)==0)
+           {
+             if(no)
+               use_tls=0;
+             else if(start[3]=='=')
+               {
+                 if(strcasecmp(&start[4],"no")==0)
+                   use_tls=0;
+                 else if(strcasecmp(&start[4],"try")==0)
+                   use_tls=1;
+                 else if(strcasecmp(&start[4],"warn")==0)
+                   use_tls=2;
+                 else if(strcasecmp(&start[4],"require")==0)
+                   use_tls=3;
+                 else
+                   use_tls=1;
+               }
+             else if(start[3]=='\0')
+               use_tls=1;
+           }
+         else if(strncasecmp(start,"basedn",6)==0)
+           {
+             if(no)
+               {
+                 free(basekeyspacedn);
+                 basekeyspacedn=NULL;
+               }
+             else if(start[6]=='=')
+               {
+                 free(basekeyspacedn);
+                 basekeyspacedn=strdup(&start[7]);
+                 if(!basekeyspacedn)
+                   {
+                     fprintf(console,"gpgkeys: out of memory while creating "
+                             "base DN\n");
+                     ret=KEYSERVER_NO_MEMORY;
+                     goto fail;
+                   }
+
+                 real_ldap=1;
+               }
+           }
+         else if(strncasecmp(start,"binddn",6)==0)
+           {
+             if(no)
+               {
+                 free(binddn);
+                 binddn=NULL;
+               }
+             else if(start[6]=='=')
+               {
+                 free(binddn);
+                 binddn=strdup(&start[7]);
+                 if(!binddn)
+                   {
+                     fprintf(console,"gpgkeys: out of memory while creating "
+                             "bind DN\n");
+                     ret=KEYSERVER_NO_MEMORY;
+                     goto fail;
+                   }
+
+                 real_ldap=1;
+               }
+           }
+         else if(strncasecmp(start,"bindpw",6)==0)
+           {
+             if(no)
+               {
+                 free(bindpw);
+                 bindpw=NULL;
+               }
+             else if(start[6]=='=')
+               {
+                 free(bindpw);
+                 bindpw=strdup(&start[7]);
+                 if(!bindpw)
+                   {
+                     fprintf(console,"gpgkeys: out of memory while creating "
+                             "bind password\n");
+                     ret=KEYSERVER_NO_MEMORY;
+                     goto fail;
+                   }
+
+                 real_ldap=1;
+               }
+           }
+
+         continue;
+       }
+    }
+
+  if(!opt->scheme)
+    {
+      fprintf(console,"gpgkeys: no scheme supplied!\n");
+      ret=KEYSERVER_SCHEME_NOT_FOUND;
+      goto fail;
+    }
+
+  if(strcasecmp(opt->scheme,"ldaps")==0)
+    {
+      port=636;
+      use_ssl=1;
+    }
+
+  if(opt->port)
+    port=atoi(opt->port);
+
+  if(!opt->host)
+    {
+      fprintf(console,"gpgkeys: no keyserver host provided\n");
+      goto fail;
+    }
+
+  if(opt->timeout && register_timeout()==-1)
+    {
+      fprintf(console,"gpgkeys: unable to register timeout handler\n");
+      return KEYSERVER_INTERNAL_ERROR;
+    }
+
+#if defined(LDAP_OPT_X_TLS_CACERTFILE) && defined(HAVE_LDAP_SET_OPTION)
+
+  if(opt->ca_cert_file)
+    {
+      err=ldap_set_option(NULL,LDAP_OPT_X_TLS_CACERTFILE,opt->ca_cert_file);
+      if(err!=LDAP_SUCCESS)
+       {
+         fprintf(console,"gpgkeys: unable to set ca-cert-file: %s\n",
+                 ldap_err2string(err));
+         ret=KEYSERVER_INTERNAL_ERROR;
+         goto fail;
+       }
+    }
+#endif /* LDAP_OPT_X_TLS_CACERTFILE && HAVE_LDAP_SET_OPTION */
+
+  /* SSL trumps TLS */
+  if(use_ssl)
+    use_tls=0;
+
+  /* If it's a GET or a SEARCH, the next thing to come in is the
+     keyids.  If it's a SEND, then there are no keyids. */
+
+  if(opt->action==KS_SEND)
+    while(fgets(line,MAX_LINE,input)!=NULL && line[0]!='\n');
+  else if(opt->action==KS_GET
+         || opt->action==KS_GETNAME || opt->action==KS_SEARCH)
+    {
+      for(;;)
+       {
+         struct keylist *work;
+
+         if(fgets(line,MAX_LINE,input)==NULL)
+           break;
+         else
+           {
+             if(line[0]=='\n' || line[0]=='\0')
+               break;
+
+             work=malloc(sizeof(struct keylist));
+             if(work==NULL)
+               {
+                 fprintf(console,"gpgkeys: out of memory while "
+                         "building key list\n");
+                 ret=KEYSERVER_NO_MEMORY;
+                 goto fail;
+               }
+
+             strcpy(work->str,line);
+
+             /* Trim the trailing \n */
+             work->str[strlen(line)-1]='\0';
+
+             work->next=NULL;
+
+             /* Always attach at the end to keep the list in proper
+                 order for searching */
+             if(keylist==NULL)
+               keylist=work;
+             else
+               keyptr->next=work;
+
+             keyptr=work;
+           }
+       }
+    }
+  else
+    {
+      fprintf(console,"gpgkeys: no keyserver command specified\n");
+      goto fail;
+    }
+
+  /* Send the response */
+
+  fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
+  fprintf(output,"PROGRAM %s\n\n",VERSION);
+
+  if(opt->verbose>1)
+    {
+      fprintf(console,"Host:\t\t%s\n",opt->host);
+      if(port)
+       fprintf(console,"Port:\t\t%d\n",port);
+      fprintf(console,"Command:\t%s\n",ks_action_to_string(opt->action));
+    }
+
+  if(opt->debug)
+    {
+#if defined(LDAP_OPT_DEBUG_LEVEL) && defined(HAVE_LDAP_SET_OPTION)
+      err=ldap_set_option(NULL,LDAP_OPT_DEBUG_LEVEL,&opt->debug);
+      if(err!=LDAP_SUCCESS)
+       fprintf(console,"gpgkeys: unable to set debug mode: %s\n",
+               ldap_err2string(err));
+      else
+       fprintf(console,"gpgkeys: debug level %d\n",opt->debug);
+#else
+      fprintf(console,"gpgkeys: not built with debugging support\n");
+#endif
+    }
+
+  /* We have a timeout set for the setup stuff since it could time out
+     as well. */
+  set_timeout(opt->timeout);
+
+  /* Note that this tries all A records on a given host (or at least,
+     OpenLDAP does). */
+  ldap=ldap_init(opt->host,port);
+  if(ldap==NULL)
+    {
+      fprintf(console,"gpgkeys: internal LDAP init error: %s\n",
+             strerror(errno));
+      fail_all(keylist,KEYSERVER_INTERNAL_ERROR);
+      goto fail;
+    }
+
+  if(use_ssl)
+    {
+#if defined(LDAP_OPT_X_TLS) && defined(HAVE_LDAP_SET_OPTION)
+      int ssl=LDAP_OPT_X_TLS_HARD;
+
+      err=ldap_set_option(ldap,LDAP_OPT_X_TLS,&ssl);
+      if(err!=LDAP_SUCCESS)
+       {
+         fprintf(console,"gpgkeys: unable to make SSL connection: %s\n",
+                 ldap_err2string(err));
+         fail_all(keylist,ldap_err_to_gpg_err(err));
+         goto fail;
+       }
+
+      if(!opt->flags.check_cert)
+       ssl=LDAP_OPT_X_TLS_NEVER;
+
+      err=ldap_set_option(NULL,LDAP_OPT_X_TLS_REQUIRE_CERT,&ssl);
+      if(err!=LDAP_SUCCESS)
+       {
+         fprintf(console,
+                 "gpgkeys: unable to set certificate validation: %s\n",
+                 ldap_err2string(err));
+         fail_all(keylist,ldap_err_to_gpg_err(err));
+         goto fail;
+       }
+#else
+      fprintf(console,"gpgkeys: unable to make SSL connection: %s\n",
+             "not built with LDAPS support");
+      fail_all(keylist,KEYSERVER_INTERNAL_ERROR);
+      goto fail;
+#endif
+    }
+
+  if(!basekeyspacedn)
+    if((err=find_basekeyspacedn()) || !basekeyspacedn)
+      {
+       fprintf(console,"gpgkeys: unable to retrieve LDAP base: %s\n",
+               err?ldap_err2string(err):"not found");
+       fail_all(keylist,ldap_err_to_gpg_err(err));
+       goto fail;
+      }
+
+  /* use_tls: 0=don't use, 1=try silently to use, 2=try loudly to use,
+     3=force use. */
+  if(use_tls)
+    {
+      if(!real_ldap)
+       {
+         if(use_tls>=2)
+           fprintf(console,"gpgkeys: unable to start TLS: %s\n",
+                   "not supported by the NAI LDAP keyserver");
+         if(use_tls==3)
+           {
+             fail_all(keylist,KEYSERVER_INTERNAL_ERROR);
+             goto fail;
+           }
+       }
+      else
+       {
+#if defined(HAVE_LDAP_START_TLS_S) && defined(HAVE_LDAP_SET_OPTION)
+         int ver=LDAP_VERSION3;
+
+         err=ldap_set_option(ldap,LDAP_OPT_PROTOCOL_VERSION,&ver);
+
+#ifdef LDAP_OPT_X_TLS
+         if(err==LDAP_SUCCESS)
+           {
+             if(opt->flags.check_cert)
+               ver=LDAP_OPT_X_TLS_HARD;
+             else
+               ver=LDAP_OPT_X_TLS_NEVER;
+
+             err=ldap_set_option(ldap,LDAP_OPT_X_TLS_REQUIRE_CERT,&ver);
+           }
+#endif
+
+         if(err==LDAP_SUCCESS)
+           err=ldap_start_tls_s(ldap,NULL,NULL);
+
+         if(err!=LDAP_SUCCESS)
+           {
+             if(use_tls>=2 || opt->verbose>2)
+               fprintf(console,"gpgkeys: unable to start TLS: %s\n",
+                       ldap_err2string(err));
+             /* Are we forcing it? */
+             if(use_tls==3)
+               {
+                 fail_all(keylist,ldap_err_to_gpg_err(err));
+                 goto fail;
+               }
+           }
+         else if(opt->verbose>1)
+           fprintf(console,"gpgkeys: TLS started successfully.\n");
+#else
+         if(use_tls>=2)
+           fprintf(console,"gpgkeys: unable to start TLS: %s\n",
+                   "not built with TLS support");
+         if(use_tls==3)
+           {
+             fail_all(keylist,KEYSERVER_INTERNAL_ERROR);
+             goto fail;
+           }
+#endif
+       }
+    }
+
+  /* By default we don't bind as there is usually no need to.  For
+     cases where the server needs some authentication, the user can
+     use binddn and bindpw for auth. */
+
+  if(binddn)
+    {
+#ifdef HAVE_LDAP_SET_OPTION
+      int ver=LDAP_VERSION3;
+
+      err=ldap_set_option(ldap,LDAP_OPT_PROTOCOL_VERSION,&ver);
+      if(err!=LDAP_SUCCESS)
+       {
+         fprintf(console,"gpgkeys: unable to go to LDAP 3: %s\n",
+                 ldap_err2string(err));
+         fail_all(keylist,ldap_err_to_gpg_err(err));
+         goto fail;
+       }
+#endif
+
+      if(opt->verbose>2)
+       fprintf(console,"gpgkeys: LDAP bind to %s, pw %s\n",binddn,
+               bindpw?">not shown<":">none<");
+      err=ldap_simple_bind_s(ldap,binddn,bindpw);
+      if(err!=LDAP_SUCCESS)
+       {
+         fprintf(console,"gpgkeys: internal LDAP bind error: %s\n",
+                 ldap_err2string(err));
+         fail_all(keylist,ldap_err_to_gpg_err(err));
+         goto fail;
+       }
+      else
+       bound=1;
+    }
+
+  if(opt->action==KS_GET)
+    {
+      keyptr=keylist;
+
+      while(keyptr!=NULL)
+       {
+         set_timeout(opt->timeout);
+
+         if(get_key(keyptr->str)!=KEYSERVER_OK)
+           failed++;
+
+         keyptr=keyptr->next;
+       }
+    }
+  else if(opt->action==KS_GETNAME)
+    {
+      keyptr=keylist;
+
+      while(keyptr!=NULL)
+       {
+         set_timeout(opt->timeout);
+
+         if(get_name(keyptr->str)!=KEYSERVER_OK)
+           failed++;
+
+         keyptr=keyptr->next;
+       }
+    }
+  else if(opt->action==KS_SEND)
+    {
+      int eof=0;
+
+      do
+       {
+         set_timeout(opt->timeout);
+
+         if(real_ldap)
+           {
+             if(send_key(&eof)!=KEYSERVER_OK)
+               failed++;
+           }
+         else
+           {
+             if(send_key_keyserver(&eof)!=KEYSERVER_OK)
+               failed++;
+           }
+       }
+      while(!eof);
+    }
+  else if(opt->action==KS_SEARCH)
+    {
+      char *searchkey=NULL;
+      int len=0;
+
+      set_timeout(opt->timeout);
+
+      /* To search, we stick a * in between each key to search for.
+        This means that if the user enters words, they'll get
+        "enters*words".  If the user "enters words", they'll get
+        "enters words" */
+
+      keyptr=keylist;
+      while(keyptr!=NULL)
+       {
+         len+=strlen(keyptr->str)+1;
+         keyptr=keyptr->next;
+       }
+
+      searchkey=malloc(len+1);
+      if(searchkey==NULL)
+       {
+         ret=KEYSERVER_NO_MEMORY;
+         fail_all(keylist,KEYSERVER_NO_MEMORY);
+         goto fail;
+       }
+
+      searchkey[0]='\0';
+
+      keyptr=keylist;
+      while(keyptr!=NULL)
+       {
+         strcat(searchkey,keyptr->str);
+         strcat(searchkey,"*");
+         keyptr=keyptr->next;
+       }
+
+      /* Nail that last "*" */
+      if(*searchkey)
+       searchkey[strlen(searchkey)-1]='\0';
+
+      if(search_key(searchkey)!=KEYSERVER_OK)
+       failed++;
+
+      free(searchkey);
+    }
+  else
+    assert (!"invalid action");
+
+  if(!failed)
+    ret=KEYSERVER_OK;
+
+ fail:
+
+  while(keylist!=NULL)
+    {
+      struct keylist *current=keylist;
+      keylist=keylist->next;
+      free(current);
+    }
+
+  if(input!=stdin)
+    fclose(input);
+
+  if(output!=stdout)
+    fclose(output);
+
+  free_ks_options(opt);
+
+  if(ldap!=NULL && bound)
+    ldap_unbind_s(ldap);
+
+  free(basekeyspacedn);
+
+  return ret;
+}
diff --git a/keyserver/gpgkeys_mailto.in b/keyserver/gpgkeys_mailto.in
new file mode 100755 (executable)
index 0000000..e37f5c0
--- /dev/null
@@ -0,0 +1,225 @@
+#!@PERL@ -w
+
+# gpgkeys_mailto - talk to a email keyserver 
+# Copyright (C) 2001, 2002 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+use Getopt::Std;
+$Getopt::Std::STANDARD_HELP_VERSION=1;
+$sendmail="@SENDMAIL@ -t";
+
+###
+
+sub VERSION_MESSAGE ()
+{
+    print STDOUT "gpgkeys_mailto (GnuPG) @VERSION@\n";
+}
+
+sub HELP_MESSAGE ()
+{
+    print STDOUT <<EOT
+
+--help     Print this help
+--version  Print the version
+-o FILE    Write output to FILE
+EOT
+}
+
+
+
+getopts('o:');
+
+if(defined($opt_o))
+{
+    open(STDOUT,">$opt_o") || die "Can't open output file $opt_o\n";
+}
+
+if(@ARGV)
+{
+    open(STDIN,$ARGV[0]) || die "Can't open input file $ARGV[0]\n";
+}
+
+($login,$name)=(getpwuid($<))[0,6];
+
+$from="$name <$login>";
+
+while(<STDIN>)
+{
+    last if($_ eq "\n");
+
+    if(/^COMMAND (\S+)/)
+    {
+       $command=$1;
+    }
+
+    if(/^OPAQUE (\S+)/)
+    {
+       $address=$1;
+    }
+
+    if(/^PROGRAM (\S+)/)
+    {
+       $program=$1;
+    }
+
+    if(/^OPTION (\S+)/)
+    {
+       if($1=~/^verbose$/i)
+       {
+           $verbose++;
+       }
+       elsif($1=~/^no-verbose$/i)
+       {
+           $verbose--;
+       }
+    }
+}
+
+$program="(unknown)" if(!defined($program));
+
+if(!defined($address))
+{
+    print STDERR "gpgkeys: no address provided\n";
+    exit(1);
+}
+
+# decode $address
+
+($address,$args)=split(/\?/,$address);
+
+if(defined($args))
+{
+    @pairs = split(/&/, $args);
+    foreach $pair (@pairs)
+    {
+       ($hdr, $val) = split(/=/, $pair);
+       $hdr =~ tr/+/ /;
+       $hdr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+       $val =~ tr/+/ /;
+       $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+# we only handle "from" right now
+       if($hdr=~/^from$/i)
+       {
+           $from=$val;
+           last;
+       }
+    }
+}
+
+while(<STDIN>)
+{
+    last if($_ eq "\n");
+
+    chomp;
+
+    push(@keys,$_);
+}
+
+# Send response
+
+print "VERSION 1\n";
+print "OPTION OUTOFBAND\n\n";
+
+# Email keyservers get and search the same way
+
+if($command=~/get/i || $command=~/search/i)
+{
+    if($command=~/search/i)
+    {
+       print "COUNT 0\n";
+    }
+
+    foreach $key (@keys)
+    {
+       open(MAIL,"|$sendmail") || die "ERROR: Can't open $sendmail\n";
+       print MAIL "From: $from\n";
+       print MAIL "To: $address\n";
+       if($command=~/get/i)
+       {
+           # mail keyservers don't like long-form keyids
+
+           if(substr($key,0,2) eq "0x")
+           {
+               $key=substr($key,2);
+           }
+
+           if(length($key)>8)
+           {
+               $key=substr($key,-8);
+           }
+
+           print MAIL "Subject: GET 0x$key\n\n";
+       }
+       else
+       {
+           print MAIL "Subject: GET $key\n\n";
+       }
+       print MAIL "GnuPG $program email keyserver request\n";
+       close(MAIL);
+
+       # Tell GnuPG not to expect a key
+       print "KEY $key OUTOFBAND\n";
+
+       if($verbose)
+       {
+           print STDERR "gpgkeys: key $key requested from $address\n";
+       }
+    }
+}
+
+if($command=~/send/i)
+{
+    while(!eof(STDIN))
+    {
+       open(MAIL,"|$sendmail") || die "ERROR: Can't open $sendmail\n";
+       print MAIL "From: $name <$login>\n";
+       print MAIL "To: $address\n";
+       print MAIL "Subject: ADD\n\n";
+
+       while(<STDIN>)
+       {
+           if(/^KEY (\S+) BEGIN$/)
+           {
+               $key=$1;
+               last;
+           }
+       }
+
+       while(<STDIN>)
+       {
+           if(/^KEY \S+ END$/)
+           {
+               last;
+           }
+
+           print MAIL;
+       }
+
+       close(MAIL);
+
+       if($verbose)
+       {
+           print STDERR "gpgkeys: key $key sent to $address\n";
+       }
+    }
+}
+
+
+# Local Variables: 
+# mode:perl
+# End:
diff --git a/keyserver/gpgkeys_test.in b/keyserver/gpgkeys_test.in
new file mode 100755 (executable)
index 0000000..97748cd
--- /dev/null
@@ -0,0 +1,99 @@
+#!@PERL@
+
+# gpgkeys_test - keyserver code tester
+# Copyright (C) 2001 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+use Getopt::Std;
+$Getopt::Std::STANDARD_HELP_VERSION=1;
+
+$|=1;
+
+sub VERSION_MESSAGE ()
+{
+    print STDOUT "gpgkeys_test (GnuPG) @VERSION@\n";
+}
+
+sub HELP_MESSAGE ()
+{
+    print STDOUT <<EOT
+
+--help     Print this help
+--version  Print the version
+EOT
+}
+
+
+getopts('o:');
+
+print STDERR "gpgkeys_test starting\n";
+
+if(defined($opt_o))
+{
+    print STDERR "Using output file $opt_o\n";
+    open(STDOUT,">$opt_o") || die "Can't open output file $opt_o\n";
+}
+
+if(@ARGV)
+{
+    print STDERR "Using input file $ARGV[0]\n";
+    open(STDIN,$ARGV[0]) || die "Can't open input file $ARGV[0]\n";
+}
+
+# Get the command block
+
+print STDERR "Command block:\n";
+
+while(<STDIN>)
+{
+    last if($_ eq "\n");
+    print STDERR "--command-> $_";
+
+    if(/^COMMAND (\w+)/)
+    {
+       $command=$1;
+    }
+}
+
+# Get the keylist block
+
+print STDERR "Keylist block:\n";
+
+while(<STDIN>)
+{
+    last if($_ eq "\n");
+    print STDERR "--keylist-> $_";
+}
+
+# If it's a SEND, then get the key material
+
+if($command eq "SEND")
+{
+    print STDERR "Key material to send:\n";
+
+    while(<STDIN>)
+    {
+       print STDERR "$_";
+    }
+}
+
+printf STDERR "gpgkeys_test finished\n";
+
+# Local Variables: 
+# mode:perl
+# End:
diff --git a/keyserver/ksutil.c b/keyserver/ksutil.c
new file mode 100644 (file)
index 0000000..23dbc8f
--- /dev/null
@@ -0,0 +1,564 @@
+/* ksutil.c - general keyserver utility functions
+ * Copyright (C) 2004, 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * In addition, as a special exception, the Free Software Foundation
+ * gives permission to link the code of the keyserver helper tools:
+ * gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
+ * project's "OpenSSL" library (or with modified versions of it that
+ * use the same license as the "OpenSSL" library), and distribute the
+ * linked executables.  You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL".  If
+ * you modify this file, you may extend this exception to your version
+ * of the file, but you are not obligated to do so.  If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#include <config.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef HAVE_LIBCURL
+#include <curl/curl.h>
+#else
+#include "curl-shim.h"
+#endif
+#include "keyserver.h"
+#include "ksutil.h"
+
+#ifdef HAVE_DOSISH_SYSTEM
+
+unsigned int set_timeout(unsigned int seconds) {return 0;}
+int register_timeout(void) {return 0;}
+
+#else
+
+static void
+catch_alarm(int foo)
+{
+  (void)foo;
+  _exit(KEYSERVER_TIMEOUT);
+}
+
+unsigned int
+set_timeout(unsigned int seconds)
+{
+  return alarm(seconds);
+}
+
+int
+register_timeout(void)
+{
+#if defined(HAVE_SIGACTION) && defined(HAVE_STRUCT_SIGACTION)
+  struct sigaction act;
+
+  act.sa_handler=catch_alarm;
+  sigemptyset(&act.sa_mask);
+  act.sa_flags=0;
+  return sigaction(SIGALRM,&act,NULL);
+#else 
+  if(signal(SIGALRM,catch_alarm)==SIG_ERR)
+    return -1;
+  else
+    return 0;
+#endif
+}
+
+#endif /* !HAVE_DOSISH_SYSTEM */
+
+struct ks_options *
+init_ks_options(void)
+{
+  struct ks_options *opt;
+
+  opt=calloc(1,sizeof(struct ks_options));
+
+  if(opt)
+    {
+      opt->action=KS_UNKNOWN;
+      opt->flags.include_revoked=1;
+      opt->flags.include_subkeys=1;
+      opt->flags.check_cert=1;
+      opt->timeout=DEFAULT_KEYSERVER_TIMEOUT;
+      opt->path=strdup("/");
+      if(!opt->path)
+       {
+         free(opt);
+         opt=NULL;
+       }
+    }
+
+  return opt;
+}
+
+void
+free_ks_options(struct ks_options *opt)
+{
+  if(opt)
+    {
+      free(opt->host);
+      free(opt->port);
+      free(opt->scheme);
+      free(opt->auth);
+      free(opt->path);
+      free(opt->opaque);
+      free(opt->ca_cert_file);
+      free(opt);
+    }
+}
+
+/* Returns 0 if we "ate" the line.  Returns >0, a KEYSERVER_ error
+   code if that error applies.  Returns -1 if we did not match the
+   line at all. */
+int
+parse_ks_options(char *line,struct ks_options *opt)
+{
+  int version;
+  char command[MAX_COMMAND+1];
+  char host[MAX_HOST+1];
+  char port[MAX_PORT+1];
+  char scheme[MAX_SCHEME+1];
+  char auth[MAX_AUTH+1];
+  char path[URLMAX_PATH+1];
+  char opaque[MAX_OPAQUE+1];
+  char option[MAX_OPTION+1];
+
+  if(line[0]=='#')
+    return 0;
+
+  if(sscanf(line,"COMMAND %" MKSTRING(MAX_COMMAND) "s\n",command)==1)
+    {
+      command[MAX_COMMAND]='\0';
+
+      if(strcasecmp(command,"get")==0)
+       opt->action=KS_GET;
+      else if(strcasecmp(command,"getname")==0)
+       opt->action=KS_GETNAME;
+      else if(strcasecmp(command,"send")==0)
+       opt->action=KS_SEND;
+      else if(strcasecmp(command,"search")==0)
+       opt->action=KS_SEARCH;
+
+      return 0;
+    }
+
+  if(sscanf(line,"HOST %" MKSTRING(MAX_HOST) "s\n",host)==1)
+    {
+      host[MAX_HOST]='\0';
+      free(opt->host);
+      opt->host=strdup(host);
+      if(!opt->host)
+       return KEYSERVER_NO_MEMORY;
+      return 0;
+    }
+
+  if(sscanf(line,"PORT %" MKSTRING(MAX_PORT) "s\n",port)==1)
+    {
+      port[MAX_PORT]='\0';
+      free(opt->port);
+      opt->port=strdup(port);
+      if(!opt->port)
+       return KEYSERVER_NO_MEMORY;
+      return 0;
+    }
+
+  if(sscanf(line,"SCHEME %" MKSTRING(MAX_SCHEME) "s\n",scheme)==1)
+    {
+      scheme[MAX_SCHEME]='\0';
+      free(opt->scheme);
+      opt->scheme=strdup(scheme);
+      if(!opt->scheme)
+       return KEYSERVER_NO_MEMORY;
+      return 0;
+    }
+
+  if(sscanf(line,"AUTH %" MKSTRING(MAX_AUTH) "s\n",auth)==1)
+    {
+      auth[MAX_AUTH]='\0';
+      free(opt->auth);
+      opt->auth=strdup(auth);
+      if(!opt->auth)
+       return KEYSERVER_NO_MEMORY;
+      return 0;
+    }
+
+  if(sscanf(line,"PATH %" MKSTRING(URLMAX_PATH) "s\n",path)==1)
+    {
+      path[URLMAX_PATH]='\0';
+      free(opt->path);
+      opt->path=strdup(path);
+      if(!opt->path)
+       return KEYSERVER_NO_MEMORY;
+      return 0;
+    }
+
+  if(sscanf(line,"OPAQUE %" MKSTRING(MAX_OPAQUE) "s\n",opaque)==1)
+    {
+      opaque[MAX_OPAQUE]='\0';
+      free(opt->opaque);
+      opt->opaque=strdup(opaque);
+      if(!opt->opaque)
+       return KEYSERVER_NO_MEMORY;
+      return 0;
+    }
+
+  if(sscanf(line,"VERSION %d\n",&version)==1)
+    {
+      if(version!=KEYSERVER_PROTO_VERSION)
+       return KEYSERVER_VERSION_ERROR;
+
+      return 0;
+    }
+
+  if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "[^\n]\n",option)==1)
+    {
+      int no=0;
+      char *start=&option[0];
+
+      option[MAX_OPTION]='\0';
+
+      if(strncasecmp(option,"no-",3)==0)
+       {
+         no=1;
+         start=&option[3];
+       }
+
+      if(strncasecmp(start,"verbose",7)==0)
+       {
+         if(no)
+           opt->verbose=0;
+         else if(start[7]=='=')
+           opt->verbose=atoi(&start[8]);
+         else
+           opt->verbose++;
+       }
+      else if(strcasecmp(start,"include-disabled")==0)
+       {
+         if(no)
+           opt->flags.include_disabled=0;
+         else
+           opt->flags.include_disabled=1;
+       }
+      else if(strcasecmp(start,"include-revoked")==0)
+       {
+         if(no)
+           opt->flags.include_revoked=0;
+         else
+           opt->flags.include_revoked=1;
+       }
+      else if(strcasecmp(start,"include-subkeys")==0)
+       {
+         if(no)
+           opt->flags.include_subkeys=0;
+         else
+           opt->flags.include_subkeys=1;
+       }
+      else if(strcasecmp(start,"check-cert")==0)
+       {
+         if(no)
+           opt->flags.check_cert=0;
+         else
+           opt->flags.check_cert=1;
+       }
+      else if(strncasecmp(start,"debug",5)==0)
+       {
+         if(no)
+           opt->debug=0;
+         else if(start[5]=='=')
+           opt->debug=atoi(&start[6]);
+         else if(start[5]=='\0')
+           opt->debug=1;
+       }
+      else if(strncasecmp(start,"timeout",7)==0)
+       {
+         if(no)
+           opt->timeout=0;
+         else if(start[7]=='=')
+           opt->timeout=atoi(&start[8]);
+         else if(start[7]=='\0')
+           opt->timeout=DEFAULT_KEYSERVER_TIMEOUT;
+       }
+      else if(strncasecmp(start,"ca-cert-file",12)==0)
+       {
+         if(no)
+           {
+             free(opt->ca_cert_file);
+             opt->ca_cert_file=NULL;
+           }
+         else if(start[12]=='=')
+           {
+             free(opt->ca_cert_file);
+             opt->ca_cert_file=strdup(&start[13]);
+             if(!opt->ca_cert_file)
+               return KEYSERVER_NO_MEMORY;
+           }
+       }
+    }
+
+  return -1;
+}
+
+const char *
+ks_action_to_string(enum ks_action action)
+{
+  switch(action)
+    {
+    case KS_UNKNOWN: return "UNKNOWN";
+    case KS_GET:     return "GET";
+    case KS_GETNAME: return "GETNAME";
+    case KS_SEND:    return "SEND";
+    case KS_SEARCH:  return "SEARCH";
+    }
+
+  return "?";
+}
+
+/* Canonicalize CRLF to just LF by stripping CRs.  This actually makes
+   sense, since on Unix-like machines LF is correct, and on win32-like
+   machines, our output buffer is opened in textmode and will
+   re-canonicalize line endings back to CRLF.  Since we only need to
+   handle armored keys, we don't have to worry about odd cases like
+   CRCRCR and the like. */
+
+void
+print_nocr(FILE *stream,const char *str)
+{
+  while(*str)
+    {
+      if(*str!='\r')
+       fputc(*str,stream);
+      str++;
+    }
+}
+
+#define HEX "abcdefABCDEF1234567890"
+
+/* Return what sort of item is being searched for.  *search is
+   permuted to remove any special indicators of a search type. */
+enum ks_search_type
+classify_ks_search(const char **search)
+{
+  switch(**search)
+    {
+    case '*':
+      (*search)++;
+      return KS_SEARCH_SUBSTR;
+    case '=':
+      (*search)++;
+      return KS_SEARCH_EXACT;
+    case '<':
+      (*search)++;
+      return KS_SEARCH_MAIL;
+    case '@':
+      (*search)++;
+      return KS_SEARCH_MAILSUB;
+    case '0':
+      if((*search)[1]=='x')
+       {
+         if(strlen(*search)==10 && strspn(*search,HEX"x")==10)
+           {
+             (*search)+=2;
+             return KS_SEARCH_KEYID_SHORT;
+           }
+         else if(strlen(*search)==18 && strspn(*search,HEX"x")==18)
+           {
+             (*search)+=2;
+             return KS_SEARCH_KEYID_LONG;
+           }
+       }
+      /* fall through */
+    default:
+      /* Try and recognize a key ID.  This isn't exact (it's possible
+        that a user ID string happens to be 8 or 16 digits of hex),
+        but it's extremely unlikely.  Plus the main GPG program does
+        this also, and consistency is good. */
+
+      if(strlen(*search)==8 && strspn(*search,HEX)==8)
+       return KS_SEARCH_KEYID_SHORT;
+      else if(strlen(*search)==16 && strspn(*search,HEX)==16)
+       return KS_SEARCH_KEYID_LONG;
+
+      /* Last resort */
+      return KS_SEARCH_SUBSTR;
+    }
+}
+
+int
+curl_err_to_gpg_err(CURLcode error)
+{
+  switch(error)
+    {
+    case CURLE_OK:                    return KEYSERVER_OK;
+    case CURLE_UNSUPPORTED_PROTOCOL:  return KEYSERVER_SCHEME_NOT_FOUND;
+    case CURLE_COULDNT_CONNECT:       return KEYSERVER_UNREACHABLE;
+    case CURLE_FTP_COULDNT_RETR_FILE: return KEYSERVER_KEY_NOT_FOUND;
+    default: return KEYSERVER_INTERNAL_ERROR;
+    }
+}
+
+#define B64 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
+
+static void
+curl_armor_writer(const unsigned char *buf,size_t size,void *cw_ctx)
+{
+  struct curl_writer_ctx *ctx=cw_ctx;
+  size_t idx=0;
+
+  while(idx<size)
+    {
+      for(;ctx->armor_remaining<3 && idx<size;ctx->armor_remaining++,idx++)
+       ctx->armor_ctx[ctx->armor_remaining]=buf[idx];
+
+      if(ctx->armor_remaining==3)
+       {
+         /* Top 6 bytes of ctx->armor_ctx[0] */
+         fputc(B64[(ctx->armor_ctx[0]>>2)&0x3F],ctx->stream);
+         /* Bottom 2 bytes of ctx->armor_ctx[0] and top 4 bytes of
+            ctx->armor_ctx[1] */
+         fputc(B64[(((ctx->armor_ctx[0]<<4)&0x30)
+                    |((ctx->armor_ctx[1]>>4)&0x0F))&0x3F],ctx->stream);
+         /* Bottom 4 bytes of ctx->armor_ctx[1] and top 2 bytes of
+            ctx->armor_ctx[2] */
+         fputc(B64[(((ctx->armor_ctx[1]<<2)&0x3C)
+                    |((ctx->armor_ctx[2]>>6)&0x03))&0x3F],ctx->stream);
+         /* Bottom 6 bytes of ctx->armor_ctx[2] */
+         fputc(B64[(ctx->armor_ctx[2]&0x3F)],ctx->stream);
+
+         ctx->linelen+=4;
+         if(ctx->linelen>=70)
+           {
+             fputc('\n',ctx->stream);
+             ctx->linelen=0;
+           }
+
+         ctx->armor_remaining=0;
+       }
+    }
+
+}
+
+size_t
+curl_writer(const void *ptr,size_t size,size_t nmemb,void *cw_ctx)
+{
+  struct curl_writer_ctx *ctx=cw_ctx;
+  const char *buf=ptr;
+  size_t i;
+
+  if(!ctx->flags.initialized)
+    {
+      if(size*nmemb==0)
+       return 0;
+
+      /* The object we're fetching is in binary form */
+      if(*buf&0x80)
+       {
+         ctx->flags.armor=1;
+         fprintf(ctx->stream,BEGIN"\n\n");
+       }
+      else
+       ctx->marker=BEGIN;
+
+      ctx->flags.initialized=1;
+    }
+
+  if(ctx->flags.armor)
+    curl_armor_writer(ptr,size*nmemb,cw_ctx);
+  else
+    {
+      /* scan the incoming data for our marker */
+      for(i=0;!ctx->flags.done && i<(size*nmemb);i++)
+       {
+         if(buf[i]==ctx->marker[ctx->markeridx])
+           {
+             ctx->markeridx++;
+             if(ctx->marker[ctx->markeridx]=='\0')
+               {
+                 if(ctx->flags.begun)
+                   ctx->flags.done=1;
+                 else
+                   {
+                     /* We've found the BEGIN marker, so now we're
+                        looking for the END marker. */
+                     ctx->flags.begun=1;
+                     ctx->marker=END;
+                     ctx->markeridx=0;
+                     fprintf(ctx->stream,BEGIN);
+                     continue;
+                   }
+               }
+           }
+         else
+           ctx->markeridx=0;
+
+         if(ctx->flags.begun)
+           {
+             /* Canonicalize CRLF to just LF by stripping CRs.  This
+                actually makes sense, since on Unix-like machines LF
+                is correct, and on win32-like machines, our output
+                buffer is opened in textmode and will re-canonicalize
+                line endings back to CRLF.  Since this code is just
+                for handling armored keys, we don't have to worry
+                about odd cases like CRCRCR and the like. */
+
+             if(buf[i]!='\r')
+               fputc(buf[i],ctx->stream);
+           }
+       }
+    }
+
+  return size*nmemb;
+}
+
+void
+curl_writer_finalize(struct curl_writer_ctx *ctx)
+{
+  if(ctx->flags.armor)
+    {
+      if(ctx->armor_remaining==2)
+       {
+         /* Top 6 bytes of ctx->armorctx[0] */
+         fputc(B64[(ctx->armor_ctx[0]>>2)&0x3F],ctx->stream);
+         /* Bottom 2 bytes of ctx->armor_ctx[0] and top 4 bytes of
+            ctx->armor_ctx[1] */
+         fputc(B64[(((ctx->armor_ctx[0]<<4)&0x30)
+                    |((ctx->armor_ctx[1]>>4)&0x0F))&0x3F],ctx->stream);
+         /* Bottom 4 bytes of ctx->armor_ctx[1] */
+         fputc(B64[((ctx->armor_ctx[1]<<2)&0x3C)],ctx->stream);
+         /* Pad */
+         fputc('=',ctx->stream);
+       }
+      else if(ctx->armor_remaining==1)
+       {
+         /* Top 6 bytes of ctx->armor_ctx[0] */
+         fputc(B64[(ctx->armor_ctx[0]>>2)&0x3F],ctx->stream);
+         /* Bottom 2 bytes of ctx->armor_ctx[0] */
+         fputc(B64[((ctx->armor_ctx[0]<<4)&0x30)],ctx->stream);
+         /* Pad */
+         fputc('=',ctx->stream);
+         /* Pad */
+         fputc('=',ctx->stream);
+       }
+
+      fprintf(ctx->stream,"\n"END);
+      ctx->flags.done=1;
+    }
+}
diff --git a/keyserver/ksutil.h b/keyserver/ksutil.h
new file mode 100644 (file)
index 0000000..3affc06
--- /dev/null
@@ -0,0 +1,141 @@
+/* ksutil.h
+ * Copyright (C) 2004, 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * In addition, as a special exception, the Free Software Foundation
+ * gives permission to link the code of the keyserver helper tools:
+ * gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
+ * project's "OpenSSL" library (or with modified versions of it that
+ * use the same license as the "OpenSSL" library), and distribute the
+ * linked executables.  You must obey the GNU General Public License
+ * in all respects for all of the code used other than "OpenSSL".  If
+ * you modify this file, you may extend this exception to your version
+ * of the file, but you are not obligated to do so.  If you do not
+ * wish to do so, delete this exception statement from your version.
+ */
+
+#ifndef _KSUTIL_H_
+#define _KSUTIL_H_
+
+#ifdef HAVE_LIBCURL
+#include <curl/curl.h>
+#else
+#include "curl-shim.h"
+#endif
+
+/* MAX_LINE must be at least 1 larger than the largest item we expect
+   to receive, including the name tag ("COMMAND", "PORT", etc) and
+   space between.  In practice, that means it should be
+   strlen("OPAQUE")+1+sizeof_opaque+1 */
+#define MAX_LINE       (6+1+1024+1)
+
+#define MAX_COMMAND    7
+#define MAX_OPTION   256
+#define MAX_SCHEME    20
+#define MAX_OPAQUE  1024
+#define MAX_AUTH     128
+#define MAX_HOST      80
+#define MAX_PORT      10
+#define URLMAX_PATH 1024
+#define MAX_PROXY    128
+#define MAX_URL     (MAX_SCHEME+1+3+MAX_AUTH+1+1+MAX_HOST+1+1 \
+                     +MAX_PORT+1+1+URLMAX_PATH+1+50)
+
+#define STRINGIFY(x) #x
+#define MKSTRING(x) STRINGIFY(x)
+
+#define BEGIN "-----BEGIN PGP PUBLIC KEY BLOCK-----"
+#define END   "-----END PGP PUBLIC KEY BLOCK-----"
+
+#ifdef __riscos__
+#define HTTP_PROXY_ENV           "GnuPG$HttpProxy"
+#else
+#define HTTP_PROXY_ENV           "http_proxy"
+#endif
+
+struct keylist
+{
+  char str[MAX_LINE];
+  struct keylist *next;
+};
+
+/* 2 minutes seems reasonable */
+#define DEFAULT_KEYSERVER_TIMEOUT 120
+
+unsigned int set_timeout(unsigned int seconds);
+int register_timeout(void);
+
+enum ks_action {KS_UNKNOWN=0,KS_GET,KS_GETNAME,KS_SEND,KS_SEARCH};
+
+enum ks_search_type {KS_SEARCH_SUBSTR,KS_SEARCH_EXACT,
+                    KS_SEARCH_MAIL,KS_SEARCH_MAILSUB,
+                    KS_SEARCH_KEYID_LONG,KS_SEARCH_KEYID_SHORT};
+
+struct ks_options
+{
+  enum ks_action action;
+  char *host;
+  char *port;
+  char *scheme;
+  char *auth;
+  char *path;
+  char *opaque;
+  struct
+  {
+    unsigned int include_disabled:1;
+    unsigned int include_revoked:1;
+    unsigned int include_subkeys:1;
+    unsigned int check_cert:1;
+  } flags;
+  unsigned int verbose;
+  unsigned int debug;
+  unsigned int timeout;
+  char *ca_cert_file;
+};
+
+struct ks_options *init_ks_options(void);
+void free_ks_options(struct ks_options *opt);
+int parse_ks_options(char *line,struct ks_options *opt);
+const char *ks_action_to_string(enum ks_action action);
+void print_nocr(FILE *stream,const char *str);
+enum ks_search_type classify_ks_search(const char **search);
+
+int curl_err_to_gpg_err(CURLcode error);
+
+struct curl_writer_ctx
+{
+  struct
+  {
+    unsigned int initialized:1;
+    unsigned int begun:1;
+    unsigned int done:1;
+    unsigned int armor:1;
+  } flags;
+
+  int armor_remaining;
+  unsigned char armor_ctx[3];
+  int markeridx,linelen;
+  const char *marker;
+  FILE *stream;
+};
+
+size_t curl_writer(const void *ptr,size_t size,size_t nmemb,void *cw_ctx);
+void curl_writer_finalize(struct curl_writer_ctx *ctx);
+
+#endif /* !_KSUTIL_H_ */
diff --git a/m4/ChangeLog b/m4/ChangeLog
new file mode 100644 (file)
index 0000000..7dbe08f
--- /dev/null
@@ -0,0 +1,192 @@
+2006-10-02  Werner Koch  <wk@g10code.com>
+
+       * autobuild.m4: New.
+
+2006-07-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * tar-ustar.m4: Use dd instead of strings as it's more likely to
+       be around.  Suggested by Nelson H. F. Beebe.
+
+2006-07-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * tar-ustar.m4: Not all greps know the -q (quiet) flag, so
+       redirect to /dev/null instead.
+
+       * tar-ustar.m4: Pass tar data through strings so that greps that
+       don't grep in binary files (Solaris) can detect the string.  Noted
+       by Mark Davies.
+
+2006-06-25  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am: Added noexecstack.m4 and ldap.m4
+
+2006-05-22  Marcus Brinkmann  <marcus@g10code.de>
+
+       * noexecstack.m4: New file.
+
+2006-05-09  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Fix mistaken AC_SUBST when curl is not found.
+
+2006-01-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Add IDN, SSPI, NTLM, and TFTP defines.
+
+2006-01-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Remove GOPHER, as that is not supported in libcurl
+       any longer.
+
+2005-11-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * libusb.m4: Check for libusb-config and if we find it, use --libs
+       and --cflags.  This is needed for OS X since libusb brings in
+       dependencies to various Apple libraries.
+
+2005-10-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * readline.m4: Check for rl_completion_func_t and
+       rl_completion_matches.
+
+2005-08-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * ldap.m4: If a PATH is given to --with-ldap, bias directory
+       search towards the given path for includes and libraries.  Noted
+       by Jason Harris.
+
+       * Makefile.am: Distribute tar-ustar.m4.
+
+       * libcurl.m4: If a PATH is given to --with-libcurl, look for
+       curl-config in that path.  Bias directory search towards the given
+       path for includes and libraries.
+
+2005-08-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * tar-ustar.m4: New.  Check for a tar that creates USTAR format
+       tar files.
+
+2005-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Check that our libcurl has
+       curl_version_info(CURLINFO_NOW).
+
+2005-06-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Only do the OS X linker fix on Panther.  Tiger has a
+       clean curl-config.
+
+2005-04-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Add a check for curl_free() since older versions of
+       libcurl don't have it.  Substitute free() as an alternative.
+
+2005-03-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * readline.m4: Check for completion functionality.
+
+       * ldap.m4: Comments.
+
+2005-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * ldap.m4: New.  Moved from configure.ac.
+
+2005-02-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Use $LIBS instead of $LDFLAGS.  This should help
+       build problems on Mingw32.
+
+2005-02-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: More comments.
+
+2005-01-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: All versions of curl-config support --feature.
+
+2005-01-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Note that FTPS existed, but wasn't fully
+       standards-compliant until version 7.11.0.
+
+2005-01-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Use LIBCURL_CPPFLAGS and not LIBCURL_INCLUDES to
+       match automake syntax.
+
+2005-01-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, libusb.m4: New libusb check macro.
+
+2004-12-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Rewrite this to use the new --protocols flag I gave
+       to the libcurl people.
+
+       * Makefile.am: Add readline.m4 and libcurl.m4.
+
+2004-12-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: OSX has a problem with their curl-config script.
+
+       * readline.m4: Make sure that readline is modern enough to
+       understand rl_catch_signals.
+
+       * libcurl.m4: Don't require curl-config to be present since it
+       seems some binary packages don't include it.  Allow users to
+       specify LIBCURL and LIBCURL_INCLUDES for us.
+
+2004-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: Be much more strict with libcurl by trying to
+       compile and link a test program that uses the features that we
+       need.
+
+2004-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * libcurl.m4: New.
+
+2004-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * readline.m4: New.
+
+2004-07-27  gettextize  <bug-gnu-gettext@gnu.org>
+
+       * gettext.m4: Upgrade to gettext-0.14.1.
+       * intmax.m4: New file, from gettext-0.14.1.
+       * lib-ld.m4: Upgrade to gettext-0.14.1.
+       * lib-prefix.m4: Upgrade to gettext-0.14.1.
+       * longdouble.m4: New file, from gettext-0.14.1.
+       * longlong.m4: New file, from gettext-0.14.1.
+       * po.m4: Upgrade to gettext-0.14.1.
+       * printf-posix.m4: New file, from gettext-0.14.1.
+       * signed.m4: New file, from gettext-0.14.1.
+       * size_max.m4: New file, from gettext-0.14.1.
+       * ulonglong.m4: Upgrade to gettext-0.14.1.
+       * wchar_t.m4: New file, from gettext-0.14.1.
+       * wint_t.m4: New file, from gettext-0.14.1.
+       * xsize.m4: New file, from gettext-0.14.1.
+       * Makefile.am (EXTRA_DIST): Add the new files.
+
+2003-10-25  gettextize  <bug-gnu-gettext@gnu.org>
+
+       * codeset.m4: New file, from gettext-0.12.1.
+       * gettext.m4: New file, from gettext-0.12.1.
+       * glibc21.m4: New file, from gettext-0.12.1.
+       * iconv.m4: New file, from gettext-0.12.1.
+       * intdiv0.m4: New file, from gettext-0.12.1.
+       * inttypes.m4: New file, from gettext-0.12.1.
+       * inttypes_h.m4: New file, from gettext-0.12.1.
+       * inttypes-pri.m4: New file, from gettext-0.12.1.
+       * isc-posix.m4: New file, from gettext-0.12.1.
+       * lcmessage.m4: New file, from gettext-0.12.1.
+       * lib-ld.m4: New file, from gettext-0.12.1.
+       * lib-link.m4: New file, from gettext-0.12.1.
+       * lib-prefix.m4: New file, from gettext-0.12.1.
+       * nls.m4: New file, from gettext-0.12.1.
+       * po.m4: New file, from gettext-0.12.1.
+       * progtest.m4: New file, from gettext-0.12.1.
+       * stdint_h.m4: New file, from gettext-0.12.1.
+       * uintmax_t.m4: New file, from gettext-0.12.1.
+       * ulonglong.m4: New file, from gettext-0.12.1.
+       * Makefile.am: New file.
+
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644 (file)
index 0000000..93bed4a
--- /dev/null
@@ -0,0 +1,11 @@
+EXTRA_DIST = intmax.m4 longdouble.m4 longlong.m4 printf-posix.m4 \
+             signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 \
+             codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 \
+             inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 \
+             lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 \
+             po.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 \
+             readline.m4 libcurl.m4 libusb.m4 tar-ustar.m4 \
+            ldap.m4 \
+            noexecstack.m4 autobuild.m4
+
+
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644 (file)
index 0000000..429d109
--- /dev/null
@@ -0,0 +1,424 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = m4
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = intmax.m4 longdouble.m4 longlong.m4 printf-posix.m4 \
+             signed.m4 size_max.m4 wchar_t.m4 wint_t.m4 xsize.m4 \
+             codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 \
+             inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 \
+             lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 \
+             po.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 \
+             readline.m4 libcurl.m4 libusb.m4 tar-ustar.m4 \
+            ldap.m4 \
+            noexecstack.m4 autobuild.m4
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  m4/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  m4/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+       -rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: all all-am check check-am clean clean-generic distclean \
+       distclean-generic distdir dvi dvi-am html html-am info info-am \
+       install install-am install-data install-data-am install-exec \
+       install-exec-am install-info install-info-am install-man \
+       install-strip installcheck installcheck-am installdirs \
+       maintainer-clean maintainer-clean-generic mostlyclean \
+       mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
+       uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/m4/autobuild.m4 b/m4/autobuild.m4
new file mode 100644 (file)
index 0000000..bd1f4dc
--- /dev/null
@@ -0,0 +1,34 @@
+# autobuild.m4 serial 2 (autobuild-3.3)
+# Copyright (C) 2004 Simon Josefsson
+#
+# This file is free software, distributed under the terms of the GNU
+# General Public License.  As a special exception to the GNU General
+# Public License, this file may be distributed as part of a program
+# that contains a configuration script generated by Autoconf, under
+# the same distribution terms as the rest of that program.
+#
+# This file can can be used in projects which are not available under
+# the GNU General Public License or the GNU Library General Public
+# License but which still want to provide support for Autobuild.
+
+# Usage: AB_INIT([MODE]).
+AC_DEFUN([AB_INIT],
+[
+       AC_REQUIRE([AC_CANONICAL_BUILD])
+       AC_REQUIRE([AC_CANONICAL_HOST])
+
+       AC_MSG_NOTICE([autobuild project... ${PACKAGE_NAME:-$PACKAGE}])
+       AC_MSG_NOTICE([autobuild revision... ${PACKAGE_VERSION:-$VERSION}])
+       hostname=`hostname`
+       if test "$hostname"; then
+          AC_MSG_NOTICE([autobuild hostname... $hostname])
+       fi
+       ifelse([$1],[],,[AC_MSG_NOTICE([autobuild mode... $1])])
+       date=`date +%Y%m%d-%H%M%S`
+       if test "$?" != 0; then
+          date=`date`
+       fi
+       if test "$date"; then
+          AC_MSG_NOTICE([autobuild timestamp... $date])
+       fi
+])
diff --git a/m4/codeset.m4 b/m4/codeset.m4
new file mode 100644 (file)
index 0000000..59535eb
--- /dev/null
@@ -0,0 +1,23 @@
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+  AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+    [AC_TRY_LINK([#include <langinfo.h>],
+      [char* cs = nl_langinfo(CODESET);],
+      am_cv_langinfo_codeset=yes,
+      am_cv_langinfo_codeset=no)
+    ])
+  if test $am_cv_langinfo_codeset = yes; then
+    AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+      [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+  fi
+])
diff --git a/m4/gettext.m4 b/m4/gettext.m4
new file mode 100644 (file)
index 0000000..a374f03
--- /dev/null
@@ -0,0 +1,487 @@
+# gettext.m4 serial 28 (gettext-0.13)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl    default (if it is not specified or empty) is 'no-libtool'.
+dnl    INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl    and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl    If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl    $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl    depending on --{enable,disable}-{shared,static} and on the presence of
+dnl    AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl    $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl    implementations (in libc or libintl) without the ngettext() function
+dnl    will be ignored.  If NEEDSYMBOL is specified and is
+dnl    'need-formatstring-macros', then GNU gettext implementations that don't
+dnl    support the ISO C 99 <inttypes.h> formatstring macros will be ignored.
+dnl INTLDIR is used to find the intl libraries.  If empty,
+dnl    the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl    and used.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl    Catalog format: GNU --> install in $(datadir)
+dnl    Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl    Catalog format: none
+dnl    Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+  dnl Argument checking.
+  ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+    [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+  ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], ,
+    [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])])
+  define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+  define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+  AC_REQUIRE([AM_PO_SUBDIRS])dnl
+  ifelse(gt_included_intl, yes, [
+    AC_REQUIRE([AM_INTL_SUBDIR])dnl
+  ])
+
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Sometimes libintl requires libiconv, so first search for libiconv.
+  dnl Ideally we would do this search only after the
+  dnl      if test "$USE_NLS" = "yes"; then
+  dnl        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+  dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT
+  dnl the configure script would need to contain the same shell code
+  dnl again, outside any 'if'. There are two solutions:
+  dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'.
+  dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE.
+  dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not
+  dnl documented, we avoid it.
+  ifelse(gt_included_intl, yes, , [
+    AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+  ])
+
+  dnl Set USE_NLS.
+  AM_NLS
+
+  ifelse(gt_included_intl, yes, [
+    BUILD_INCLUDED_LIBINTL=no
+    USE_INCLUDED_LIBINTL=no
+  ])
+  LIBINTL=
+  LTLIBINTL=
+  POSUB=
+
+  dnl If we use NLS figure out what method
+  if test "$USE_NLS" = "yes"; then
+    gt_use_preinstalled_gnugettext=no
+    ifelse(gt_included_intl, yes, [
+      AC_MSG_CHECKING([whether included gettext is requested])
+      AC_ARG_WITH(included-gettext,
+        [  --with-included-gettext use the GNU gettext library included here],
+        nls_cv_force_use_gnu_gettext=$withval,
+        nls_cv_force_use_gnu_gettext=no)
+      AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+      nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+      if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+    ])
+        dnl User does not insist on using GNU NLS library.  Figure out what
+        dnl to use.  If GNU gettext is available we use this.  Else we have
+        dnl to fall back to GNU NLS library.
+
+        dnl Add a version number to the cache macros.
+        define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1)))
+        define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+        define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+        AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+         [AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+            [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+            gt_cv_func_gnugettext_libc=yes,
+            gt_cv_func_gnugettext_libc=no)])
+
+        if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+          dnl Sometimes libintl requires libiconv, so first search for libiconv.
+          ifelse(gt_included_intl, yes, , [
+            AM_ICONV_LINK
+          ])
+          dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+          dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+          dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+          dnl even if libiconv doesn't exist.
+          AC_LIB_LINKFLAGS_BODY([intl])
+          AC_CACHE_CHECK([for GNU gettext in libintl],
+            gt_cv_func_gnugettext_libintl,
+           [gt_save_CPPFLAGS="$CPPFLAGS"
+            CPPFLAGS="$CPPFLAGS $INCINTL"
+            gt_save_LIBS="$LIBS"
+            LIBS="$LIBS $LIBINTL"
+            dnl Now see whether libintl exists and does not depend on libiconv.
+            AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+              [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+              gt_cv_func_gnugettext_libintl=yes,
+              gt_cv_func_gnugettext_libintl=no)
+            dnl Now see whether libintl exists and depends on libiconv.
+            if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+              LIBS="$LIBS $LIBICONV"
+              AC_TRY_LINK([#include <libintl.h>
+]ifelse([$2], [need-formatstring-macros],
+[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
+#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
+#endif
+changequote(,)dnl
+typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
+changequote([,])dnl
+], [])[extern int _nl_msg_cat_cntr;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+                [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)],
+               [LIBINTL="$LIBINTL $LIBICONV"
+                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+                gt_cv_func_gnugettext_libintl=yes
+               ])
+            fi
+            CPPFLAGS="$gt_save_CPPFLAGS"
+            LIBS="$gt_save_LIBS"])
+        fi
+
+        dnl If an already present or preinstalled GNU gettext() is found,
+        dnl use it.  But if this macro is used in GNU gettext, and GNU
+        dnl gettext is already preinstalled in libintl, we update this
+        dnl libintl.  (Cf. the install rule in intl/Makefile.in.)
+        if test "$gt_cv_func_gnugettext_libc" = "yes" \
+           || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+                && test "$PACKAGE" != gettext-runtime \
+                && test "$PACKAGE" != gettext-tools; }; then
+          gt_use_preinstalled_gnugettext=yes
+        else
+          dnl Reset the values set by searching for libintl.
+          LIBINTL=
+          LTLIBINTL=
+          INCINTL=
+        fi
+
+    ifelse(gt_included_intl, yes, [
+        if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+          dnl GNU gettext is not found in the C library.
+          dnl Fall back on included GNU gettext library.
+          nls_cv_use_gnu_gettext=yes
+        fi
+      fi
+
+      if test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions used to generate GNU NLS library.
+        BUILD_INCLUDED_LIBINTL=yes
+        USE_INCLUDED_LIBINTL=yes
+        LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+        LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+        LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+      fi
+
+      if test "$gt_use_preinstalled_gnugettext" = "yes" \
+         || test "$nls_cv_use_gnu_gettext" = "yes"; then
+        dnl Mark actions to use GNU gettext tools.
+        CATOBJEXT=.gmo
+      fi
+    ])
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes" \
+       || test "$nls_cv_use_gnu_gettext" = "yes"; then
+      AC_DEFINE(ENABLE_NLS, 1,
+        [Define to 1 if translation of program messages to the user's native language
+   is requested.])
+    else
+      USE_NLS=no
+    fi
+  fi
+
+  AC_MSG_CHECKING([whether to use NLS])
+  AC_MSG_RESULT([$USE_NLS])
+  if test "$USE_NLS" = "yes"; then
+    AC_MSG_CHECKING([where the gettext function comes from])
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        gt_source="external libintl"
+      else
+        gt_source="libc"
+      fi
+    else
+      gt_source="included intl directory"
+    fi
+    AC_MSG_RESULT([$gt_source])
+  fi
+
+  if test "$USE_NLS" = "yes"; then
+
+    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+      if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+        AC_MSG_CHECKING([how to link with libintl])
+        AC_MSG_RESULT([$LIBINTL])
+        AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+      fi
+
+      dnl For backward compatibility. Some packages may be using this.
+      AC_DEFINE(HAVE_GETTEXT, 1,
+       [Define if the GNU gettext() function is already present or preinstalled.])
+      AC_DEFINE(HAVE_DCGETTEXT, 1,
+       [Define if the GNU dcgettext() function is already present or preinstalled.])
+    fi
+
+    dnl We need to process the po/ directory.
+    POSUB=po
+  fi
+
+  ifelse(gt_included_intl, yes, [
+    dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+    dnl to 'yes' because some of the testsuite requires it.
+    if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then
+      BUILD_INCLUDED_LIBINTL=yes
+    fi
+
+    dnl Make all variables we use known to autoconf.
+    AC_SUBST(BUILD_INCLUDED_LIBINTL)
+    AC_SUBST(USE_INCLUDED_LIBINTL)
+    AC_SUBST(CATOBJEXT)
+
+    dnl For backward compatibility. Some configure.ins may be using this.
+    nls_cv_header_intl=
+    nls_cv_header_libgt=
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    DATADIRNAME=share
+    AC_SUBST(DATADIRNAME)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    INSTOBJEXT=.mo
+    AC_SUBST(INSTOBJEXT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    GENCAT=gencat
+    AC_SUBST(GENCAT)
+
+    dnl For backward compatibility. Some Makefiles may be using this.
+    if test "$USE_INCLUDED_LIBINTL" = yes; then
+      INTLOBJS="\$(GETTOBJS)"
+    fi
+    AC_SUBST(INTLOBJS)
+
+    dnl Enable libtool support if the surrounding package wishes it.
+    INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+    AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+  ])
+
+  dnl For backward compatibility. Some Makefiles may be using this.
+  INTLLIBS="$LIBINTL"
+  AC_SUBST(INTLLIBS)
+
+  dnl Make all documented variables known to autoconf.
+  AC_SUBST(LIBINTL)
+  AC_SUBST(LTLIBINTL)
+  AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl            USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+  AC_REQUIRE([AC_PROG_RANLIB])dnl
+  AC_REQUIRE([AC_ISC_POSIX])dnl
+  AC_REQUIRE([AC_HEADER_STDC])dnl
+  AC_REQUIRE([AC_C_CONST])dnl
+  AC_REQUIRE([bh_C_SIGNED])dnl
+  AC_REQUIRE([AC_C_INLINE])dnl
+  AC_REQUIRE([AC_TYPE_OFF_T])dnl
+  AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+  AC_REQUIRE([jm_AC_TYPE_LONG_LONG])dnl
+  AC_REQUIRE([gt_TYPE_LONGDOUBLE])dnl
+  AC_REQUIRE([gt_TYPE_WCHAR_T])dnl
+  AC_REQUIRE([gt_TYPE_WINT_T])dnl
+  AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+  AC_REQUIRE([gt_TYPE_INTMAX_T])
+  AC_REQUIRE([gt_PRINTF_POSIX])
+  AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+  AC_REQUIRE([AC_FUNC_MMAP])dnl
+  AC_REQUIRE([jm_GLIBC21])dnl
+  AC_REQUIRE([gt_INTDIV0])dnl
+  AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl
+  AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl
+  AC_REQUIRE([gt_INTTYPES_PRI])dnl
+  AC_REQUIRE([gl_XSIZE])dnl
+
+  AC_CHECK_TYPE([ptrdiff_t], ,
+    [AC_DEFINE([ptrdiff_t], [long],
+       [Define as the type of the result of subtracting two pointers, if the system doesn't define it.])
+    ])
+  AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+  AC_CHECK_FUNCS([asprintf fwprintf getcwd getegid geteuid getgid getuid \
+mempcpy munmap putenv setenv setlocale snprintf stpcpy strcasecmp strdup \
+strtoul tsearch wcslen __argz_count __argz_stringify __argz_next \
+__fsetlocking])
+
+  dnl Use the _snprintf function only if it is declared (because on NetBSD it
+  dnl is defined as a weak alias of snprintf; we prefer to use the latter).
+  gt_CHECK_DECL(_snprintf, [#include <stdio.h>])
+  gt_CHECK_DECL(_snwprintf, [#include <stdio.h>])
+
+  dnl Use the *_unlocked functions only if they are declared.
+  dnl (because some of them were defined without being declared in Solaris
+  dnl 2.5.1 but were removed in Solaris 2.6, whereas we want binaries built
+  dnl on Solaris 2.5.1 to run on Solaris 2.6).
+  dnl Don't use AC_CHECK_DECLS because it isn't supported in autoconf-2.13.
+  gt_CHECK_DECL(feof_unlocked, [#include <stdio.h>])
+  gt_CHECK_DECL(fgets_unlocked, [#include <stdio.h>])
+  gt_CHECK_DECL(getc_unlocked, [#include <stdio.h>])
+
+  case $gt_cv_func_printf_posix in
+    *yes) HAVE_POSIX_PRINTF=1 ;;
+    *) HAVE_POSIX_PRINTF=0 ;;
+  esac
+  AC_SUBST([HAVE_POSIX_PRINTF])
+  if test "$ac_cv_func_asprintf" = yes; then
+    HAVE_ASPRINTF=1
+  else
+    HAVE_ASPRINTF=0
+  fi
+  AC_SUBST([HAVE_ASPRINTF])
+  if test "$ac_cv_func_snprintf" = yes; then
+    HAVE_SNPRINTF=1
+  else
+    HAVE_SNPRINTF=0
+  fi
+  AC_SUBST([HAVE_SNPRINTF])
+  if test "$ac_cv_func_wprintf" = yes; then
+    HAVE_WPRINTF=1
+  else
+    HAVE_WPRINTF=0
+  fi
+  AC_SUBST([HAVE_WPRINTF])
+
+  AM_ICONV
+  AM_LANGINFO_CODESET
+  if test $ac_cv_header_locale_h = yes; then
+    AM_LC_MESSAGES
+  fi
+
+  dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+  dnl because plural.y uses bison specific features. It requires at least
+  dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+  dnl compile.
+  dnl bison is only needed for the maintainer (who touches plural.y). But in
+  dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+  dnl the rule in general Makefile. Now, some people carelessly touch the
+  dnl files or have a broken "make" program, hence the plural.c rule will
+  dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+  dnl present or too old.
+  AC_CHECK_PROGS([INTLBISON], [bison])
+  if test -z "$INTLBISON"; then
+    ac_verc_fail=yes
+  else
+    dnl Found it, now check the version.
+    AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+    ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+    case $ac_prog_version in
+      '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+      1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+         ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+      *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+    esac
+    AC_MSG_RESULT([$ac_prog_version])
+  fi
+  if test $ac_verc_fail = yes; then
+    INTLBISON=:
+  fi
+])
+
+
+dnl gt_CHECK_DECL(FUNC, INCLUDES)
+dnl Check whether a function is declared.
+AC_DEFUN([gt_CHECK_DECL],
+[
+  AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1,
+    [AC_TRY_COMPILE([$2], [
+#ifndef $1
+  char *p = (char *) $1;
+#endif
+], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)])
+  if test $ac_cv_have_decl_$1 = yes; then
+    gt_value=1
+  else
+    gt_value=0
+  fi
+  AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value],
+    [Define to 1 if you have the declaration of `$1', and to 0 if you don't.])
+])
+
+
+dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version])
+AC_DEFUN([AM_GNU_GETTEXT_VERSION], [])
diff --git a/m4/glibc21.m4 b/m4/glibc21.m4
new file mode 100644 (file)
index 0000000..9c9f3db
--- /dev/null
@@ -0,0 +1,32 @@
+# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+  [
+    AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+      ac_cv_gnu_library_2_1,
+      [AC_EGREP_CPP([Lucky GNU user],
+       [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+  Lucky GNU user
+ #endif
+#endif
+       ],
+       ac_cv_gnu_library_2_1=yes,
+       ac_cv_gnu_library_2_1=no)
+      ]
+    )
+    AC_SUBST(GLIBC21)
+    GLIBC21="$ac_cv_gnu_library_2_1"
+  ]
+)
diff --git a/m4/iconv.m4 b/m4/iconv.m4
new file mode 100644 (file)
index 0000000..c5f3579
--- /dev/null
@@ -0,0 +1,103 @@
+# iconv.m4 serial AM4 (gettext-0.11.3)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
+[
+  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([iconv])
+])
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+  dnl those with the standalone portable GNU libiconv installed).
+
+  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+  dnl accordingly.
+  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
+
+  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed libiconv and not disabled its use
+  dnl via --without-libiconv-prefix, he wants to use it. The first
+  dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+  am_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+  AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+    am_cv_func_iconv="no, consider installing GNU libiconv"
+    am_cv_lib_iconv=no
+    AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+      [iconv_t cd = iconv_open("","");
+       iconv(cd,NULL,NULL,NULL,NULL);
+       iconv_close(cd);],
+      am_cv_func_iconv=yes)
+    if test "$am_cv_func_iconv" != yes; then
+      am_save_LIBS="$LIBS"
+      LIBS="$LIBS $LIBICONV"
+      AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+        [iconv_t cd = iconv_open("","");
+         iconv(cd,NULL,NULL,NULL,NULL);
+         iconv_close(cd);],
+        am_cv_lib_iconv=yes
+        am_cv_func_iconv=yes)
+      LIBS="$am_save_LIBS"
+    fi
+  ])
+  if test "$am_cv_func_iconv" = yes; then
+    AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+  fi
+  if test "$am_cv_lib_iconv" = yes; then
+    AC_MSG_CHECKING([how to link with libiconv])
+    AC_MSG_RESULT([$LIBICONV])
+  else
+    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+    dnl either.
+    CPPFLAGS="$am_save_CPPFLAGS"
+    LIBICONV=
+    LTLIBICONV=
+  fi
+  AC_SUBST(LIBICONV)
+  AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+  AM_ICONV_LINK
+  if test "$am_cv_func_iconv" = yes; then
+    AC_MSG_CHECKING([for iconv declaration])
+    AC_CACHE_VAL(am_cv_proto_iconv, [
+      AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+    AC_MSG_RESULT([$]{ac_t:-
+         }[$]am_cv_proto_iconv)
+    AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+      [Define as const if the declaration of iconv() needs const.])
+  fi
+])
diff --git a/m4/intdiv0.m4 b/m4/intdiv0.m4
new file mode 100644 (file)
index 0000000..55dddcf
--- /dev/null
@@ -0,0 +1,72 @@
+# intdiv0.m4 serial 1 (gettext-0.11.3)
+dnl Copyright (C) 2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gt_INTDIV0],
+[
+  AC_REQUIRE([AC_PROG_CC])dnl
+  AC_REQUIRE([AC_CANONICAL_HOST])dnl
+
+  AC_CACHE_CHECK([whether integer division by zero raises SIGFPE],
+    gt_cv_int_divbyzero_sigfpe,
+    [
+      AC_TRY_RUN([
+#include <stdlib.h>
+#include <signal.h>
+
+static void
+#ifdef __cplusplus
+sigfpe_handler (int sig)
+#else
+sigfpe_handler (sig) int sig;
+#endif
+{
+  /* Exit with code 0 if SIGFPE, with code 1 if any other signal.  */
+  exit (sig != SIGFPE);
+}
+
+int x = 1;
+int y = 0;
+int z;
+int nan;
+
+int main ()
+{
+  signal (SIGFPE, sigfpe_handler);
+/* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP.  */
+#if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP)
+  signal (SIGTRAP, sigfpe_handler);
+#endif
+/* Linux/SPARC yields signal SIGILL.  */
+#if defined (__sparc__) && defined (__linux__)
+  signal (SIGILL, sigfpe_handler);
+#endif
+
+  z = x / y;
+  nan = y / y;
+  exit (1);
+}
+], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no,
+        [
+          # Guess based on the CPU.
+          case "$host_cpu" in
+            alpha* | i[34567]86 | m68k | s390*)
+              gt_cv_int_divbyzero_sigfpe="guessing yes";;
+            *)
+              gt_cv_int_divbyzero_sigfpe="guessing no";;
+          esac
+        ])
+    ])
+  case "$gt_cv_int_divbyzero_sigfpe" in
+    *yes) value=1;;
+    *) value=0;;
+  esac
+  AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value,
+    [Define if integer division by zero raises signal SIGFPE.])
+])
diff --git a/m4/intmax.m4 b/m4/intmax.m4
new file mode 100644 (file)
index 0000000..dfb08cc
--- /dev/null
@@ -0,0 +1,32 @@
+# intmax.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the system has the 'intmax_t' type, but don't attempt to
+dnl find a replacement if it is lacking.
+
+AC_DEFUN([gt_TYPE_INTMAX_T],
+[
+  AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+  AC_CACHE_CHECK(for intmax_t, gt_cv_c_intmax_t,
+    [AC_TRY_COMPILE([
+#include <stddef.h> 
+#include <stdlib.h>
+#if HAVE_STDINT_H_WITH_UINTMAX
+#include <stdint.h>
+#endif
+#if HAVE_INTTYPES_H_WITH_UINTMAX
+#include <inttypes.h>
+#endif
+], [intmax_t x = -1;], gt_cv_c_intmax_t=yes, gt_cv_c_intmax_t=no)])
+  if test $gt_cv_c_intmax_t = yes; then
+    AC_DEFINE(HAVE_INTMAX_T, 1,
+      [Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
diff --git a/m4/inttypes-pri.m4 b/m4/inttypes-pri.m4
new file mode 100644 (file)
index 0000000..fd007c3
--- /dev/null
@@ -0,0 +1,32 @@
+# inttypes-pri.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+# Define PRI_MACROS_BROKEN if <inttypes.h> exists and defines the PRI*
+# macros to non-string values.  This is the case on AIX 4.3.3.
+
+AC_DEFUN([gt_INTTYPES_PRI],
+[
+  AC_REQUIRE([gt_HEADER_INTTYPES_H])
+  if test $gt_cv_header_inttypes_h = yes; then
+    AC_CACHE_CHECK([whether the inttypes.h PRIxNN macros are broken],
+      gt_cv_inttypes_pri_broken,
+      [
+        AC_TRY_COMPILE([#include <inttypes.h>
+#ifdef PRId32
+char *p = PRId32;
+#endif
+], [], gt_cv_inttypes_pri_broken=no, gt_cv_inttypes_pri_broken=yes)
+      ])
+  fi
+  if test "$gt_cv_inttypes_pri_broken" = yes; then
+    AC_DEFINE_UNQUOTED(PRI_MACROS_BROKEN, 1,
+      [Define if <inttypes.h> exists and defines unusable PRI* macros.])
+  fi
+])
diff --git a/m4/inttypes.m4 b/m4/inttypes.m4
new file mode 100644 (file)
index 0000000..ab370ff
--- /dev/null
@@ -0,0 +1,27 @@
+# inttypes.m4 serial 1 (gettext-0.11.4)
+dnl Copyright (C) 1997-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H if <inttypes.h> exists and doesn't clash with
+# <sys/types.h>.
+
+AC_DEFUN([gt_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], gt_cv_header_inttypes_h,
+  [
+    AC_TRY_COMPILE(
+      [#include <sys/types.h>
+#include <inttypes.h>],
+      [], gt_cv_header_inttypes_h=yes, gt_cv_header_inttypes_h=no)
+  ])
+  if test $gt_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H, 1,
+      [Define if <inttypes.h> exists and doesn't clash with <sys/types.h>.])
+  fi
+])
diff --git a/m4/inttypes_h.m4 b/m4/inttypes_h.m4
new file mode 100644 (file)
index 0000000..f342eba
--- /dev/null
@@ -0,0 +1,28 @@
+# inttypes_h.m4 serial 5 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_INTTYPES_H_WITH_UINTMAX if <inttypes.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_INTTYPES_H],
+[
+  AC_CACHE_CHECK([for inttypes.h], jm_ac_cv_header_inttypes_h,
+  [AC_TRY_COMPILE(
+    [#include <sys/types.h>
+#include <inttypes.h>],
+    [uintmax_t i = (uintmax_t) -1;],
+    jm_ac_cv_header_inttypes_h=yes,
+    jm_ac_cv_header_inttypes_h=no)])
+  if test $jm_ac_cv_header_inttypes_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_INTTYPES_H_WITH_UINTMAX, 1,
+      [Define if <inttypes.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
diff --git a/m4/isc-posix.m4 b/m4/isc-posix.m4
new file mode 100644 (file)
index 0000000..1319dd1
--- /dev/null
@@ -0,0 +1,26 @@
+# isc-posix.m4 serial 2 (gettext-0.11.2)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This file is not needed with autoconf-2.53 and newer.  Remove it in 2005.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it.  Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+#   configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+#   configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+  [
+    dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+    AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+  ]
+)
diff --git a/m4/lcmessage.m4 b/m4/lcmessage.m4
new file mode 100644 (file)
index 0000000..ffd4008
--- /dev/null
@@ -0,0 +1,32 @@
+# lcmessage.m4 serial 3 (gettext-0.11.3)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+[
+  AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+    [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+       am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+  if test $am_cv_val_LC_MESSAGES = yes; then
+    AC_DEFINE(HAVE_LC_MESSAGES, 1,
+      [Define if your <locale.h> file defines LC_MESSAGES.])
+  fi
+])
diff --git a/m4/ldap.m4 b/m4/ldap.m4
new file mode 100644 (file)
index 0000000..95249ac
--- /dev/null
@@ -0,0 +1,97 @@
+dnl Check for LDAP
+dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl Defines @GPGKEYS_LDAP@ to a executable name if a working ldap
+dnl setup is found, and sets @LDAPLIBS@ to the necessary libraries.
+
+AC_DEFUN([GNUPG_CHECK_LDAP],
+[
+# Try and link a LDAP test program to weed out unusable LDAP
+# libraries.  -lldap [-llber [-lresolv]] is for older OpenLDAPs.
+# OpenLDAP, circa 1999, was terrible with creating weird dependencies.
+# If all else fails, the user can play guess-the-dependency by using
+# something like ./configure LDAPLIBS="-Lfoo -lbar"
+
+AC_ARG_WITH(ldap,
+  AC_HELP_STRING([--with-ldap=DIR],[look for the LDAP library in DIR]),
+  [_ldap_with=$withval])
+
+if test x$_ldap_with != xno ; then
+
+  if test -d "$withval" ; then
+     LDAP_CPPFLAGS="-I$withval/include"
+     LDAP_LDFLAGS="-L$withval/lib"
+  fi
+
+  _ldap_save_cppflags=$CPPFLAGS
+  CPPFLAGS="${LDAP_CPPFLAGS} ${CPPFLAGS}"
+  _ldap_save_ldflags=$LDFLAGS
+  LDFLAGS="${LDAP_LDFLAGS} ${LDFLAGS}"
+
+  for MY_LDAPLIBS in ${LDAPLIBS+"$LDAPLIBS"} "-lldap" "-lldap -llber" "-lldap -llber -lresolv" "-lwldap32"; do
+    _ldap_save_libs=$LIBS
+    LIBS="$MY_LDAPLIBS $1 $LIBS"
+
+    AC_MSG_CHECKING([whether LDAP via \"$MY_LDAPLIBS\" is present and sane])
+    AC_TRY_LINK([
+#ifdef _WIN32
+#include <winsock2.h>
+#include <winldap.h>
+#else
+#include <ldap.h>
+#endif
+],[ldap_open("foobar",1234);],
+                [gnupg_cv_func_ldap_init=yes],[gnupg_cv_func_ldap_init=no])
+    AC_MSG_RESULT([$gnupg_cv_func_ldap_init])
+
+    if test $gnupg_cv_func_ldap_init = no; then
+      AC_MSG_CHECKING([whether I can make LDAP be sane with lber.h])
+      AC_TRY_LINK([#include <lber.h>
+#include <ldap.h>],[ldap_open("foobar",1234);],
+         [gnupg_cv_func_ldaplber_init=yes],[gnupg_cv_func_ldaplber_init=no])
+      AC_MSG_RESULT([$gnupg_cv_func_ldaplber_init])
+    fi
+
+    if test "$gnupg_cv_func_ldaplber_init" = yes ; then
+       AC_DEFINE(NEED_LBER_H,1,[Define if the LDAP library requires including lber.h before ldap.h])
+    fi
+
+    if test "$gnupg_cv_func_ldap_init" = yes || \
+        test "$gnupg_cv_func_ldaplber_init" = yes ; then
+       LDAPLIBS="$LDAP_LDFLAGS $MY_LDAPLIBS"
+       GPGKEYS_LDAP="gpgkeys_ldap$EXEEXT"
+
+       AC_CHECK_FUNCS(ldap_get_option ldap_set_option ldap_start_tls_s)
+
+       if test "$ac_cv_func_ldap_get_option" != yes ; then
+          AC_MSG_CHECKING([whether LDAP supports ld_errno])
+         AC_TRY_LINK([#include <ldap.h>],[LDAP *ldap; ldap->ld_errno;],
+            [gnupg_cv_func_ldap_ld_errno=yes],
+            [gnupg_cv_func_ldap_ld_errno=no])
+          AC_MSG_RESULT([$gnupg_cv_func_ldap_ld_errno])
+
+         if test "$gnupg_cv_func_ldap_ld_errno" = yes ; then
+            AC_DEFINE(HAVE_LDAP_LD_ERRNO,1,[Define if the LDAP library supports ld_errno])
+          fi
+       fi
+    fi
+
+    LIBS=$_ldap_save_libs
+
+    if test "$GPGKEYS_LDAP" != "" ; then break; fi
+  done
+
+  AC_SUBST(GPGKEYS_LDAP)
+  AC_SUBST(LDAPLIBS)
+  AC_SUBST(LDAP_CPPFLAGS)
+
+  CPPFLAGS=$_ldap_save_cppflags
+  LDFLAGS=$_ldap_save_ldflags
+fi
+])dnl
diff --git a/m4/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644 (file)
index 0000000..38aeaec
--- /dev/null
@@ -0,0 +1,112 @@
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  acl_cv_prog_gnu_ld=yes ;;
+*)
+  acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by GCC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]* | [A-Za-z]:[\\/]*)]
+      [re_direlt='/[^/][^/]*/\.\./']
+      # Canonicalize the path of ld
+      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+       ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      acl_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some GNU ld's only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
+      *GNU* | *'with BFD'*)
+       test "$with_gnu_ld" != no && break ;;
+      *)
+       test "$with_gnu_ld" != yes && break ;;
+      esac
+    fi
+  done
+  IFS="$ac_save_ifs"
+else
+  acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644 (file)
index 0000000..eeb200d
--- /dev/null
@@ -0,0 +1,551 @@
+# lib-link.m4 serial 4 (gettext-0.12)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+    AC_LIB_LINKFLAGS_BODY([$1], [$2])
+    ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+    ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+    ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+  ])
+  LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+  LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+  INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+  dnl results of this search when this library appears as a dependency.
+  HAVE_LIB[]NAME=yes
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  AC_REQUIRE([AC_LIB_RPATH])
+  define([Name],[translit([$1],[./-], [___])])
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+  dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+  dnl accordingly.
+  AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+  dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+  dnl because if the user has installed lib[]Name and not disabled its use
+  dnl via --without-lib[]Name-prefix, he wants to use it.
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+  AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+    ac_save_LIBS="$LIBS"
+    LIBS="$LIBS $LIB[]NAME"
+    AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+    LIBS="$ac_save_LIBS"
+  ])
+  if test "$ac_cv_lib[]Name" = yes; then
+    HAVE_LIB[]NAME=yes
+    AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+    AC_MSG_CHECKING([how to link with lib[]$1])
+    AC_MSG_RESULT([$LIB[]NAME])
+  else
+    HAVE_LIB[]NAME=no
+    dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+    dnl $INC[]NAME either.
+    CPPFLAGS="$ac_save_CPPFLAGS"
+    LIB[]NAME=
+    LTLIB[]NAME=
+  fi
+  AC_SUBST([HAVE_LIB]NAME)
+  AC_SUBST([LIB]NAME)
+  AC_SUBST([LTLIB]NAME)
+  undefine([Name])
+  undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+  AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
+  AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
+  AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
+  AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+  AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+    . ./conftest.sh
+    rm -f ./conftest.sh
+    acl_cv_rpath=done
+  ])
+  wl="$acl_cv_wl"
+  libext="$acl_cv_libext"
+  shlibext="$acl_cv_shlibext"
+  hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+  hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+  hardcode_direct="$acl_cv_hardcode_direct"
+  hardcode_minus_L="$acl_cv_hardcode_minus_L"
+  dnl Determine whether the user wants rpath handling at all.
+  AC_ARG_ENABLE(rpath,
+    [  --disable-rpath         do not hardcode runtime library paths],
+    :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+  define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+                               [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib$1-prefix],
+[  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
+  --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  dnl Search the library and its dependencies in $additional_libdir and
+  dnl $LDFLAGS. Using breadth-first-seach.
+  LIB[]NAME=
+  LTLIB[]NAME=
+  INC[]NAME=
+  rpathdirs=
+  ltrpathdirs=
+  names_already_handled=
+  names_next_round='$1 $2'
+  while test -n "$names_next_round"; do
+    names_this_round="$names_next_round"
+    names_next_round=
+    for name in $names_this_round; do
+      already_handled=
+      for n in $names_already_handled; do
+        if test "$n" = "$name"; then
+          already_handled=yes
+          break
+        fi
+      done
+      if test -z "$already_handled"; then
+        names_already_handled="$names_already_handled $name"
+        dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+        dnl or AC_LIB_HAVE_LINKFLAGS call.
+        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+        eval value=\"\$HAVE_LIB$uppername\"
+        if test -n "$value"; then
+          if test "$value" = yes; then
+            eval value=\"\$LIB$uppername\"
+            test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+            eval value=\"\$LTLIB$uppername\"
+            test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+          else
+            dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+            dnl that this library doesn't exist. So just drop it.
+            :
+          fi
+        else
+          dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+          dnl and the already constructed $LIBNAME/$LTLIBNAME.
+          found_dir=
+          found_la=
+          found_so=
+          found_a=
+          if test $use_additional = yes; then
+            if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+              found_dir="$additional_libdir"
+              found_so="$additional_libdir/lib$name.$shlibext"
+              if test -f "$additional_libdir/lib$name.la"; then
+                found_la="$additional_libdir/lib$name.la"
+              fi
+            else
+              if test -f "$additional_libdir/lib$name.$libext"; then
+                found_dir="$additional_libdir"
+                found_a="$additional_libdir/lib$name.$libext"
+                if test -f "$additional_libdir/lib$name.la"; then
+                  found_la="$additional_libdir/lib$name.la"
+                fi
+              fi
+            fi
+          fi
+          if test "X$found_dir" = "X"; then
+            for x in $LDFLAGS $LTLIB[]NAME; do
+              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+              case "$x" in
+                -L*)
+                  dir=`echo "X$x" | sed -e 's/^X-L//'`
+                  if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+                    found_dir="$dir"
+                    found_so="$dir/lib$name.$shlibext"
+                    if test -f "$dir/lib$name.la"; then
+                      found_la="$dir/lib$name.la"
+                    fi
+                  else
+                    if test -f "$dir/lib$name.$libext"; then
+                      found_dir="$dir"
+                      found_a="$dir/lib$name.$libext"
+                      if test -f "$dir/lib$name.la"; then
+                        found_la="$dir/lib$name.la"
+                      fi
+                    fi
+                  fi
+                  ;;
+              esac
+              if test "X$found_dir" != "X"; then
+                break
+              fi
+            done
+          fi
+          if test "X$found_dir" != "X"; then
+            dnl Found the library.
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+            if test "X$found_so" != "X"; then
+              dnl Linking with a shared library. We attempt to hardcode its
+              dnl directory into the executable's runpath, unless it's the
+              dnl standard /usr/lib.
+              if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+                dnl No hardcoding is needed.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+              else
+                dnl Use an explicit option to hardcode DIR into the resulting
+                dnl binary.
+                dnl Potentially add DIR to ltrpathdirs.
+                dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                haveit=
+                for x in $ltrpathdirs; do
+                  if test "X$x" = "X$found_dir"; then
+                    haveit=yes
+                    break
+                  fi
+                done
+                if test -z "$haveit"; then
+                  ltrpathdirs="$ltrpathdirs $found_dir"
+                fi
+                dnl The hardcoding into $LIBNAME is system dependent.
+                if test "$hardcode_direct" = yes; then
+                  dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+                  dnl resulting binary.
+                  LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                else
+                  if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+                    dnl Use an explicit option to hardcode DIR into the resulting
+                    dnl binary.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    dnl Potentially add DIR to rpathdirs.
+                    dnl The rpathdirs will be appended to $LIBNAME at the end.
+                    haveit=
+                    for x in $rpathdirs; do
+                      if test "X$x" = "X$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      rpathdirs="$rpathdirs $found_dir"
+                    fi
+                  else
+                    dnl Rely on "-L$found_dir".
+                    dnl But don't add it if it's already contained in the LDFLAGS
+                    dnl or the already constructed $LIBNAME
+                    haveit=
+                    for x in $LDFLAGS $LIB[]NAME; do
+                      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                      if test "X$x" = "X-L$found_dir"; then
+                        haveit=yes
+                        break
+                      fi
+                    done
+                    if test -z "$haveit"; then
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+                    fi
+                    if test "$hardcode_minus_L" != no; then
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+                    else
+                      dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+                      dnl here, because this doesn't fit in flags passed to the
+                      dnl compiler. So give up. No hardcoding. This affects only
+                      dnl very old systems.
+                      dnl FIXME: Not sure whether we should use
+                      dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+                      dnl here.
+                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+                    fi
+                  fi
+                fi
+              fi
+            else
+              if test "X$found_a" != "X"; then
+                dnl Linking with a static library.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+              else
+                dnl We shouldn't come here, but anyway it's good to have a
+                dnl fallback.
+                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+              fi
+            fi
+            dnl Assume the include files are nearby.
+            additional_includedir=
+            case "$found_dir" in
+              */lib | */lib/)
+                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+                additional_includedir="$basedir/include"
+                ;;
+            esac
+            if test "X$additional_includedir" != "X"; then
+              dnl Potentially add $additional_includedir to $INCNAME.
+              dnl But don't add it
+              dnl   1. if it's the standard /usr/include,
+              dnl   2. if it's /usr/local/include and we are using GCC on Linux,
+              dnl   3. if it's already present in $CPPFLAGS or the already
+              dnl      constructed $INCNAME,
+              dnl   4. if it doesn't exist as a directory.
+              if test "X$additional_includedir" != "X/usr/include"; then
+                haveit=
+                if test "X$additional_includedir" = "X/usr/local/include"; then
+                  if test -n "$GCC"; then
+                    case $host_os in
+                      linux*) haveit=yes;;
+                    esac
+                  fi
+                fi
+                if test -z "$haveit"; then
+                  for x in $CPPFLAGS $INC[]NAME; do
+                    AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                    if test "X$x" = "X-I$additional_includedir"; then
+                      haveit=yes
+                      break
+                    fi
+                  done
+                  if test -z "$haveit"; then
+                    if test -d "$additional_includedir"; then
+                      dnl Really add $additional_includedir to $INCNAME.
+                      INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+                    fi
+                  fi
+                fi
+              fi
+            fi
+            dnl Look for dependencies.
+            if test -n "$found_la"; then
+              dnl Read the .la file. It defines the variables
+              dnl dlname, library_names, old_library, dependency_libs, current,
+              dnl age, revision, installed, dlopen, dlpreopen, libdir.
+              save_libdir="$libdir"
+              case "$found_la" in
+                */* | *\\*) . "$found_la" ;;
+                *) . "./$found_la" ;;
+              esac
+              libdir="$save_libdir"
+              dnl We use only dependency_libs.
+              for dep in $dependency_libs; do
+                case "$dep" in
+                  -L*)
+                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+                    dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+                    dnl But don't add it
+                    dnl   1. if it's the standard /usr/lib,
+                    dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
+                    dnl   3. if it's already present in $LDFLAGS or the already
+                    dnl      constructed $LIBNAME,
+                    dnl   4. if it doesn't exist as a directory.
+                    if test "X$additional_libdir" != "X/usr/lib"; then
+                      haveit=
+                      if test "X$additional_libdir" = "X/usr/local/lib"; then
+                        if test -n "$GCC"; then
+                          case $host_os in
+                            linux*) haveit=yes;;
+                          esac
+                        fi
+                      fi
+                      if test -z "$haveit"; then
+                        haveit=
+                        for x in $LDFLAGS $LIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LIBNAME.
+                            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                        haveit=
+                        for x in $LDFLAGS $LTLIB[]NAME; do
+                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+                          if test "X$x" = "X-L$additional_libdir"; then
+                            haveit=yes
+                            break
+                          fi
+                        done
+                        if test -z "$haveit"; then
+                          if test -d "$additional_libdir"; then
+                            dnl Really add $additional_libdir to $LTLIBNAME.
+                            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+                          fi
+                        fi
+                      fi
+                    fi
+                    ;;
+                  -R*)
+                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
+                    if test "$enable_rpath" != no; then
+                      dnl Potentially add DIR to rpathdirs.
+                      dnl The rpathdirs will be appended to $LIBNAME at the end.
+                      haveit=
+                      for x in $rpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        rpathdirs="$rpathdirs $dir"
+                      fi
+                      dnl Potentially add DIR to ltrpathdirs.
+                      dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+                      haveit=
+                      for x in $ltrpathdirs; do
+                        if test "X$x" = "X$dir"; then
+                          haveit=yes
+                          break
+                        fi
+                      done
+                      if test -z "$haveit"; then
+                        ltrpathdirs="$ltrpathdirs $dir"
+                      fi
+                    fi
+                    ;;
+                  -l*)
+                    dnl Handle this in the next round.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+                    ;;
+                  *.la)
+                    dnl Handle this in the next round. Throw away the .la's
+                    dnl directory; it is already contained in a preceding -L
+                    dnl option.
+                    names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+                    ;;
+                  *)
+                    dnl Most likely an immediate library name.
+                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+                    LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+                    ;;
+                esac
+              done
+            fi
+          else
+            dnl Didn't find the library; assume it is in the system directories
+            dnl known to the linker and runtime loader. (All the system
+            dnl directories known to the linker should also be known to the
+            dnl runtime loader, otherwise the system is severely misconfigured.)
+            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+            LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+          fi
+        fi
+      fi
+    done
+  done
+  if test "X$rpathdirs" != "X"; then
+    if test -n "$hardcode_libdir_separator"; then
+      dnl Weird platform: only the last -rpath option counts, the user must
+      dnl pass all path elements in one option. We can arrange that for a
+      dnl single library, but not when more than one $LIBNAMEs are used.
+      alldirs=
+      for found_dir in $rpathdirs; do
+        alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+      done
+      dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+      acl_save_libdir="$libdir"
+      libdir="$alldirs"
+      eval flag=\"$hardcode_libdir_flag_spec\"
+      libdir="$acl_save_libdir"
+      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+    else
+      dnl The -rpath options are cumulative.
+      for found_dir in $rpathdirs; do
+        acl_save_libdir="$libdir"
+        libdir="$found_dir"
+        eval flag=\"$hardcode_libdir_flag_spec\"
+        libdir="$acl_save_libdir"
+        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+      done
+    fi
+  fi
+  if test "X$ltrpathdirs" != "X"; then
+    dnl When using libtool, the option that works for both libraries and
+    dnl executables is -R. The -R options are cumulative.
+    for found_dir in $ltrpathdirs; do
+      LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+    done
+  fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+  for element in [$2]; do
+    haveit=
+    for x in $[$1]; do
+      AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+      if test "X$x" = "X$element"; then
+        haveit=yes
+        break
+      fi
+    done
+    if test -z "$haveit"; then
+      [$1]="${[$1]}${[$1]:+ }$element"
+    fi
+  done
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644 (file)
index 0000000..8aff5a9
--- /dev/null
@@ -0,0 +1,155 @@
+# lib-prefix.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+  AC_REQUIRE([AC_PROG_CC])
+  AC_REQUIRE([AC_CANONICAL_HOST])
+  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+  dnl By default, look in $includedir and $libdir.
+  use_additional=yes
+  AC_LIB_WITH_FINAL_PREFIX([
+    eval additional_includedir=\"$includedir\"
+    eval additional_libdir=\"$libdir\"
+  ])
+  AC_LIB_ARG_WITH([lib-prefix],
+[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+  --without-lib-prefix    don't search for libraries in includedir and libdir],
+[
+    if test "X$withval" = "Xno"; then
+      use_additional=no
+    else
+      if test "X$withval" = "X"; then
+        AC_LIB_WITH_FINAL_PREFIX([
+          eval additional_includedir=\"$includedir\"
+          eval additional_libdir=\"$libdir\"
+        ])
+      else
+        additional_includedir="$withval/include"
+        additional_libdir="$withval/lib"
+      fi
+    fi
+])
+  if test $use_additional = yes; then
+    dnl Potentially add $additional_includedir to $CPPFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/include,
+    dnl   2. if it's already present in $CPPFLAGS,
+    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_includedir" != "X/usr/include"; then
+      haveit=
+      for x in $CPPFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-I$additional_includedir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_includedir" = "X/usr/local/include"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_includedir"; then
+            dnl Really add $additional_includedir to $CPPFLAGS.
+            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+          fi
+        fi
+      fi
+    fi
+    dnl Potentially add $additional_libdir to $LDFLAGS.
+    dnl But don't add it
+    dnl   1. if it's the standard /usr/lib,
+    dnl   2. if it's already present in $LDFLAGS,
+    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
+    dnl   4. if it doesn't exist as a directory.
+    if test "X$additional_libdir" != "X/usr/lib"; then
+      haveit=
+      for x in $LDFLAGS; do
+        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+        if test "X$x" = "X-L$additional_libdir"; then
+          haveit=yes
+          break
+        fi
+      done
+      if test -z "$haveit"; then
+        if test "X$additional_libdir" = "X/usr/local/lib"; then
+          if test -n "$GCC"; then
+            case $host_os in
+              linux*) haveit=yes;;
+            esac
+          fi
+        fi
+        if test -z "$haveit"; then
+          if test -d "$additional_libdir"; then
+            dnl Really add $additional_libdir to $LDFLAGS.
+            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+          fi
+        fi
+      fi
+    fi
+  fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+  dnl Unfortunately, prefix and exec_prefix get only finally determined
+  dnl at the end of configure.
+  if test "X$prefix" = "XNONE"; then
+    acl_final_prefix="$ac_default_prefix"
+  else
+    acl_final_prefix="$prefix"
+  fi
+  if test "X$exec_prefix" = "XNONE"; then
+    acl_final_exec_prefix='${prefix}'
+  else
+    acl_final_exec_prefix="$exec_prefix"
+  fi
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+  prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+  acl_save_prefix="$prefix"
+  prefix="$acl_final_prefix"
+  acl_save_exec_prefix="$exec_prefix"
+  exec_prefix="$acl_final_exec_prefix"
+  $1
+  exec_prefix="$acl_save_exec_prefix"
+  prefix="$acl_save_prefix"
+])
diff --git a/m4/libcurl.m4 b/m4/libcurl.m4
new file mode 100644 (file)
index 0000000..a9bfa2e
--- /dev/null
@@ -0,0 +1,239 @@
+# LIBCURL_CHECK_CONFIG ([DEFAULT-ACTION], [MINIMUM-VERSION],
+#                       [ACTION-IF-YES], [ACTION-IF-NO])
+# ----------------------------------------------------------
+#      David Shaw <dshaw@jabberwocky.com>   May-09-2006
+#
+# Checks for libcurl.  DEFAULT-ACTION is the string yes or no to
+# specify whether to default to --with-libcurl or --without-libcurl.
+# If not supplied, DEFAULT-ACTION is yes.  MINIMUM-VERSION is the
+# minimum version of libcurl to accept.  Pass the version as a regular
+# version number like 7.10.1. If not supplied, any version is
+# accepted.  ACTION-IF-YES is a list of shell commands to run if
+# libcurl was successfully found and passed the various tests.
+# ACTION-IF-NO is a list of shell commands that are run otherwise.
+# Note that using --without-libcurl does run ACTION-IF-NO.
+#
+# This macro #defines HAVE_LIBCURL if a working libcurl setup is
+# found, and sets @LIBCURL@ and @LIBCURL_CPPFLAGS@ to the necessary
+# values.  Other useful defines are LIBCURL_FEATURE_xxx where xxx are
+# the various features supported by libcurl, and LIBCURL_PROTOCOL_yyy
+# where yyy are the various protocols supported by libcurl.  Both xxx
+# and yyy are capitalized.  See the list of AH_TEMPLATEs at the top of
+# the macro for the complete list of possible defines.  Shell
+# variables $libcurl_feature_xxx and $libcurl_protocol_yyy are also
+# defined to 'yes' for those features and protocols that were found.
+# Note that xxx and yyy keep the same capitalization as in the
+# curl-config list (e.g. it's "HTTP" and not "http").
+#
+# Users may override the detected values by doing something like:
+# LIBCURL="-lcurl" LIBCURL_CPPFLAGS="-I/usr/myinclude" ./configure
+#
+# For the sake of sanity, this macro assumes that any libcurl that is
+# found is after version 7.7.2, the first version that included the
+# curl-config script.  Note that it is very important for people
+# packaging binary versions of libcurl to include this script!
+# Without curl-config, we can only guess what protocols are available,
+# or use curl_version_info to figure it out at runtime.
+
+AC_DEFUN([LIBCURL_CHECK_CONFIG],
+[
+  AH_TEMPLATE([LIBCURL_FEATURE_SSL],[Defined if libcurl supports SSL])
+  AH_TEMPLATE([LIBCURL_FEATURE_KRB4],[Defined if libcurl supports KRB4])
+  AH_TEMPLATE([LIBCURL_FEATURE_IPV6],[Defined if libcurl supports IPv6])
+  AH_TEMPLATE([LIBCURL_FEATURE_LIBZ],[Defined if libcurl supports libz])
+  AH_TEMPLATE([LIBCURL_FEATURE_ASYNCHDNS],[Defined if libcurl supports AsynchDNS])
+  AH_TEMPLATE([LIBCURL_FEATURE_IDN],[Defined if libcurl supports IDN])
+  AH_TEMPLATE([LIBCURL_FEATURE_SSPI],[Defined if libcurl supports SSPI])
+  AH_TEMPLATE([LIBCURL_FEATURE_NTLM],[Defined if libcurl supports NTLM])
+
+  AH_TEMPLATE([LIBCURL_PROTOCOL_HTTP],[Defined if libcurl supports HTTP])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_HTTPS],[Defined if libcurl supports HTTPS])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_FTP],[Defined if libcurl supports FTP])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_FTPS],[Defined if libcurl supports FTPS])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_FILE],[Defined if libcurl supports FILE])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_TELNET],[Defined if libcurl supports TELNET])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_LDAP],[Defined if libcurl supports LDAP])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_DICT],[Defined if libcurl supports DICT])
+  AH_TEMPLATE([LIBCURL_PROTOCOL_TFTP],[Defined if libcurl supports TFTP])
+
+  AC_ARG_WITH(libcurl,
+     AC_HELP_STRING([--with-libcurl=DIR],[look for the curl library in DIR]),
+     [_libcurl_with=$withval],[_libcurl_with=ifelse([$1],,[yes],[$1])])
+
+  if test "$_libcurl_with" != "no" ; then
+
+     AC_PROG_AWK
+
+     _libcurl_version_parse="eval $AWK '{split(\$NF,A,\".\"); X=256*256*A[[1]]+256*A[[2]]+A[[3]]; print X;}'"
+
+     _libcurl_try_link=yes
+
+     if test -d "$_libcurl_with" ; then
+        LIBCURL_CPPFLAGS="-I$withval/include"
+        _libcurl_ldflags="-L$withval/lib"
+        AC_PATH_PROG([_libcurl_config],["$withval/bin/curl-config"])
+     else
+       AC_PATH_PROG([_libcurl_config],[curl-config])
+     fi
+
+     if test x$_libcurl_config != "x" ; then
+        AC_CACHE_CHECK([for the version of libcurl],
+          [libcurl_cv_lib_curl_version],
+           [libcurl_cv_lib_curl_version=`$_libcurl_config --version | $AWK '{print $[]2}'`])
+
+       _libcurl_version=`echo $libcurl_cv_lib_curl_version | $_libcurl_version_parse`
+       _libcurl_wanted=`echo ifelse([$2],,[0],[$2]) | $_libcurl_version_parse`
+
+        if test $_libcurl_wanted -gt 0 ; then
+          AC_CACHE_CHECK([for libcurl >= version $2],
+             [libcurl_cv_lib_version_ok],
+              [
+             if test $_libcurl_version -ge $_libcurl_wanted ; then
+                libcurl_cv_lib_version_ok=yes
+             else
+                libcurl_cv_lib_version_ok=no
+             fi
+              ])
+        fi
+
+       if test $_libcurl_wanted -eq 0 || test x$libcurl_cv_lib_version_ok = xyes ; then
+           if test x"$LIBCURL_CPPFLAGS" = "x" ; then
+              LIBCURL_CPPFLAGS=`$_libcurl_config --cflags`
+           fi
+           if test x"$LIBCURL" = "x" ; then
+              LIBCURL=`$_libcurl_config --libs`
+
+              # This is so silly, but Apple actually has a bug in their
+             # curl-config script.  Fixed in Tiger, but there are still
+             # lots of Panther installs around.
+              case "${host}" in
+                 powerpc-apple-darwin7*)
+                    LIBCURL=`echo $LIBCURL | sed -e 's|-arch i386||g'`
+                 ;;
+              esac
+           fi
+
+          # All curl-config scripts support --feature
+          _libcurl_features=`$_libcurl_config --feature`
+
+           # Is it modern enough to have --protocols? (7.12.4)
+          if test $_libcurl_version -ge 461828 ; then
+              _libcurl_protocols=`$_libcurl_config --protocols`
+           fi
+       else
+           _libcurl_try_link=no
+       fi
+
+       unset _libcurl_wanted
+     fi
+
+     if test $_libcurl_try_link = yes ; then
+
+        # we didn't find curl-config, so let's see if the user-supplied
+        # link line (or failing that, "-lcurl") is enough.
+        LIBCURL=${LIBCURL-"$_libcurl_ldflags -lcurl"}
+
+        AC_CACHE_CHECK([whether libcurl is usable],
+           [libcurl_cv_lib_curl_usable],
+           [
+           _libcurl_save_cppflags=$CPPFLAGS
+           CPPFLAGS="$LIBCURL_CPPFLAGS $CPPFLAGS"
+           _libcurl_save_libs=$LIBS
+           LIBS="$LIBCURL $LIBS"
+
+           AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <curl/curl.h>],[
+/* Try and use a few common options to force a failure if we are
+   missing symbols or can't link. */
+int x;
+curl_easy_setopt(NULL,CURLOPT_URL,NULL);
+x=CURL_ERROR_SIZE;
+x=CURLOPT_WRITEFUNCTION;
+x=CURLOPT_FILE;
+x=CURLOPT_ERRORBUFFER;
+x=CURLOPT_STDERR;
+x=CURLOPT_VERBOSE;
+]),libcurl_cv_lib_curl_usable=yes,libcurl_cv_lib_curl_usable=no)
+
+           CPPFLAGS=$_libcurl_save_cppflags
+           LIBS=$_libcurl_save_libs
+           unset _libcurl_save_cppflags
+           unset _libcurl_save_libs
+           ])
+
+        if test $libcurl_cv_lib_curl_usable = yes ; then
+
+          # Does curl_free() exist in this version of libcurl?
+          # If not, fake it with free()
+
+           _libcurl_save_cppflags=$CPPFLAGS
+           CPPFLAGS="$CPPFLAGS $LIBCURL_CPPFLAGS"
+           _libcurl_save_libs=$LIBS
+           LIBS="$LIBS $LIBCURL"
+
+           AC_CHECK_FUNC(curl_free,,
+             AC_DEFINE(curl_free,free,
+               [Define curl_free() as free() if our version of curl lacks curl_free.]))
+
+           CPPFLAGS=$_libcurl_save_cppflags
+           LIBS=$_libcurl_save_libs
+           unset _libcurl_save_cppflags
+           unset _libcurl_save_libs
+
+           AC_DEFINE(HAVE_LIBCURL,1,
+             [Define to 1 if you have a functional curl library.])
+           AC_SUBST(LIBCURL_CPPFLAGS)
+           AC_SUBST(LIBCURL)
+
+           for _libcurl_feature in $_libcurl_features ; do
+             AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_feature_$_libcurl_feature),[1])
+             eval AS_TR_SH(libcurl_feature_$_libcurl_feature)=yes
+           done
+
+          if test "x$_libcurl_protocols" = "x" ; then
+
+             # We don't have --protocols, so just assume that all
+             # protocols are available
+             _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT"
+
+             if test x$libcurl_feature_SSL = xyes ; then
+                _libcurl_protocols="$_libcurl_protocols HTTPS"
+
+                # FTPS wasn't standards-compliant until version
+                # 7.11.0
+                if test $_libcurl_version -ge 461568; then
+                   _libcurl_protocols="$_libcurl_protocols FTPS"
+                fi
+             fi
+          fi
+
+          for _libcurl_protocol in $_libcurl_protocols ; do
+             AC_DEFINE_UNQUOTED(AS_TR_CPP(libcurl_protocol_$_libcurl_protocol),[1])
+             eval AS_TR_SH(libcurl_protocol_$_libcurl_protocol)=yes
+           done
+       else
+          unset LIBCURL
+          unset LIBCURL_CPPFLAGS
+        fi
+     fi
+
+     unset _libcurl_try_link
+     unset _libcurl_version_parse
+     unset _libcurl_config
+     unset _libcurl_feature
+     unset _libcurl_features
+     unset _libcurl_protocol
+     unset _libcurl_protocols
+     unset _libcurl_version
+     unset _libcurl_ldflags
+  fi
+
+  if test x$_libcurl_with = xno || test x$libcurl_cv_lib_curl_usable != xyes ; then
+     # This is the IF-NO path
+     ifelse([$4],,:,[$4])
+  else
+     # This is the IF-YES path
+     ifelse([$3],,:,[$3])
+  fi
+
+  unset _libcurl_with
+])dnl
diff --git a/m4/libusb.m4 b/m4/libusb.m4
new file mode 100644 (file)
index 0000000..809dc1d
--- /dev/null
@@ -0,0 +1,69 @@
+dnl Check for libusb
+dnl Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+dnl
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl Defines HAVE_LIBUSB to 1 if a working libusb setup is found, and sets
+dnl @LIBUSB@ to the necessary libraries.  HAVE_USB_GET_BUSSES is set if
+dnl usb_get_busses() exists.
+
+AC_DEFUN([GNUPG_CHECK_LIBUSB],
+[
+  AC_ARG_WITH(libusb,
+     AC_HELP_STRING([--with-libusb=DIR],
+       [look for the libusb library in DIR]),
+     [_do_libusb=$withval],[_do_libusb=yes])
+
+  if test "$_do_libusb" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+        AC_PATH_PROG([_usb_config],["$_do_libusb/bin/libusb-config"])
+     else
+        AC_PATH_PROG([_usb_config],[libusb-config])
+     fi
+
+     _libusb_save_libs=$LIBS
+     _libusb_save_cflags=$CFLAGS
+
+     if test x$_usb_config != "x" ; then
+        _libusb_try_libs=`$LIBS $_usb_config --libs`
+        _libusb_try_cflags=`$LIBS $_usb_config --cflags`
+     else
+        _libusb_try_libs="-lusb"
+        _libusb_try_cflags=""
+     fi
+
+     LIBS="$LIBS $_libusb_try_libs"
+     CFLAGS="$CFLAGS $_libusb_try_cflags"
+
+     AC_MSG_CHECKING([whether libusb is present and sane])
+
+     AC_LINK_IFELSE(AC_LANG_PROGRAM([#include <usb.h>],[
+usb_bulk_write(NULL,0,NULL,0,0);
+]),_found_libusb=yes,_found_libusb=no)
+
+     AC_MSG_RESULT([$_found_libusb])
+
+     if test $_found_libusb = yes ; then
+        AC_DEFINE(HAVE_LIBUSB,1,
+          [Define to 1 if you have a fully functional libusb library.])
+        AC_SUBST(LIBUSB_CPPFLAGS,$_libusb_try_cflags)
+        AC_SUBST(LIBUSB,$_libusb_try_libs)
+        AC_CHECK_FUNCS(usb_get_busses)
+     fi
+
+     LIBS=$_libusb_save_libs
+     CFLAGS=$_libusb_save_cflags
+
+     unset _libusb_save_libs
+     unset _libusb_save_cflags
+     unset _libusb_try_libs
+     unset _libusb_try_cflags
+     unset _found_libusb
+  fi
+])dnl
diff --git a/m4/longdouble.m4 b/m4/longdouble.m4
new file mode 100644 (file)
index 0000000..1333d2f
--- /dev/null
@@ -0,0 +1,30 @@
+# longdouble.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the compiler supports the 'long double' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_LONGDOUBLE],
+[
+  AC_CACHE_CHECK([for long double], gt_cv_c_long_double,
+    [if test "$GCC" = yes; then
+       gt_cv_c_long_double=yes
+     else
+       AC_TRY_COMPILE([
+         /* The Stardent Vistra knows sizeof(long double), but does not support it.  */
+         long double foo = 0.0;
+         /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
+         int array [2*(sizeof(long double) >= sizeof(double)) - 1];
+         ], ,
+         gt_cv_c_long_double=yes, gt_cv_c_long_double=no)
+     fi])
+  if test $gt_cv_c_long_double = yes; then
+    AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the 'long double' type.])
+  fi
+])
diff --git a/m4/longlong.m4 b/m4/longlong.m4
new file mode 100644 (file)
index 0000000..d7d7350
--- /dev/null
@@ -0,0 +1,25 @@
+# longlong.m4 serial 4
+dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_LONG_LONG if 'long long' works.
+
+AC_DEFUN([jm_AC_TYPE_LONG_LONG],
+[
+  AC_CACHE_CHECK([for long long], ac_cv_type_long_long,
+  [AC_TRY_LINK([long long ll = 1LL; int i = 63;],
+    [long long llmax = (long long) -1;
+     return ll << i | ll >> i | llmax / ll | llmax % ll;],
+    ac_cv_type_long_long=yes,
+    ac_cv_type_long_long=no)])
+  if test $ac_cv_type_long_long = yes; then
+    AC_DEFINE(HAVE_LONG_LONG, 1,
+      [Define if you have the 'long long' type.])
+  fi
+])
diff --git a/m4/nls.m4 b/m4/nls.m4
new file mode 100644 (file)
index 0000000..36bc493
--- /dev/null
+++ b/m4/nls.m4
@@ -0,0 +1,49 @@
+# nls.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+AC_DEFUN([AM_NLS],
+[
+  AC_MSG_CHECKING([whether NLS is requested])
+  dnl Default is enabled NLS
+  AC_ARG_ENABLE(nls,
+    [  --disable-nls           do not use Native Language Support],
+    USE_NLS=$enableval, USE_NLS=yes)
+  AC_MSG_RESULT($USE_NLS)
+  AC_SUBST(USE_NLS)
+])
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+  dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+  dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+  dnl Try to locate it.
+  MKINSTALLDIRS=
+  if test -n "$ac_aux_dir"; then
+    case "$ac_aux_dir" in
+      /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;;
+      *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;;
+    esac
+  fi
+  if test -z "$MKINSTALLDIRS"; then
+    MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+  fi
+  AC_SUBST(MKINSTALLDIRS)
+])
diff --git a/m4/noexecstack.m4 b/m4/noexecstack.m4
new file mode 100644 (file)
index 0000000..629e351
--- /dev/null
@@ -0,0 +1,55 @@
+# noexecstack.m4
+dnl Copyright (C) 1995-2006 Free Software Foundation, Inc.
+dnl
+dnl This library is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Lesser General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2.1 of the License, or (at your option) any later version.
+dnl
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+dnl Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with this library; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+
+dnl Checks whether the stack can be marked nonexecutable by passing an
+dnl option to the C-compiler when acting on .s files.  Returns that
+dnl option in NOEXECSTACK_FLAGS.
+dnl This macro is adapted from one found in GLIBC-2.3.5.
+AC_DEFUN([CL_AS_NOEXECSTACK],[
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AM_PROG_AS])
+
+AC_MSG_CHECKING([whether non excutable stack support is requested])
+AC_ARG_ENABLE(noexecstack,
+              AC_HELP_STRING([--enable-noexecstack],
+                             [enable non executable stack support (gcc only)]),
+              noexecstack_support=$enableval, noexecstack_support=no)
+AC_MSG_RESULT($noexecstack_support)
+
+AC_CACHE_CHECK([whether assembler supports --noexecstack option],
+cl_cv_as_noexecstack, [dnl
+  cat > conftest.c <<EOF
+void foo() {}
+EOF
+  if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS
+                     -S -o conftest.s conftest.c >/dev/null]) \
+     && grep -q .note.GNU-stack conftest.s \
+     && AC_TRY_COMMAND([${CCAS} $CCASFLAGS $CPPFLAGS -Wa,--noexecstack
+                       -c -o conftest.o conftest.s >/dev/null])
+  then
+    cl_cv_as_noexecstack=yes
+  else
+    cl_cv_as_noexecstack=no
+  fi
+  rm -f conftest*])
+  if test "$noexecstack_support" = yes -a "$cl_cv_as_noexecstack" = yes; then
+       NOEXECSTACK_FLAGS="-Wa,--noexecstack"
+  else
+        NOEXECSTACK_FLAGS=
+  fi
+  AC_SUBST(NOEXECSTACK_FLAGS)
+])
diff --git a/m4/po.m4 b/m4/po.m4
new file mode 100644 (file)
index 0000000..e161998
--- /dev/null
+++ b/m4/po.m4
@@ -0,0 +1,426 @@
+# po.m4 serial 3 (gettext-0.14)
+dnl Copyright (C) 1995-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1995-2000.
+dnl   Bruno Haible <haible@clisp.cons.org>, 2000-2003.
+
+dnl Checks for all prerequisites of the po subdirectory.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+  AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+  AC_REQUIRE([AC_PROG_INSTALL])dnl
+  AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+  AC_REQUIRE([AM_NLS])dnl
+
+  dnl Perform the following tests also if --disable-nls has been given,
+  dnl because they are needed for "make dist" to work.
+
+  dnl Search for GNU msgfmt in the PATH.
+  dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+  dnl The second test excludes FreeBSD msgfmt.
+  AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+    [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+  dnl Search for GNU xgettext 0.12 or newer in the PATH.
+  dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+  dnl The second test excludes FreeBSD xgettext.
+  AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+    [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+    :)
+  dnl Remove leftover from FreeBSD xgettext call.
+  rm -f messages.po
+
+  dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+  AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+    [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU msgfmt.
+  if test "$GMSGFMT" != ":"; then
+    dnl If it is no GNU msgfmt we define it as : so that the
+    dnl Makefiles still can work.
+    if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+       (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+      AC_MSG_RESULT(
+        [found $GMSGFMT program is not GNU msgfmt; ignore it])
+      GMSGFMT=":"
+    fi
+  fi
+
+  dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+  dnl Test whether we really found GNU xgettext.
+  if test "$XGETTEXT" != ":"; then
+    dnl If it is no GNU xgettext we define it as : so that the
+    dnl Makefiles still can work.
+    if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 &&
+       (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+      : ;
+    else
+      AC_MSG_RESULT(
+        [found xgettext program is not GNU xgettext; ignore it])
+      XGETTEXT=":"
+    fi
+    dnl Remove leftover from FreeBSD xgettext call.
+    rm -f messages.po
+  fi
+
+  AC_OUTPUT_COMMANDS([
+    for ac_file in $CONFIG_FILES; do
+      # Support "outfile[:infile[:infile...]]"
+      case "$ac_file" in
+        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+      esac
+      # PO directories have a Makefile.in generated from Makefile.in.in.
+      case "$ac_file" in */Makefile.in)
+        # Adjust a relative srcdir.
+        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+        # In autoconf-2.13 it is called $ac_given_srcdir.
+        # In autoconf-2.50 it is called $srcdir.
+        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+        case "$ac_given_srcdir" in
+          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+          /*) top_srcdir="$ac_given_srcdir" ;;
+          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+        esac
+        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+          rm -f "$ac_dir/POTFILES"
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[  ]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+          POMAKEFILEDEPS="POTFILES.in"
+          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
+          # on $ac_dir but don't depend on user-specified configuration
+          # parameters.
+          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+            # The LINGUAS file contains the set of available languages.
+            if test -n "$OBSOLETE_ALL_LINGUAS"; then
+              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+            fi
+            ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+            # Hide the ALL_LINGUAS assigment from automake.
+            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+          else
+            # The set of available languages was given in configure.in.
+            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
+          fi
+          # Compute POFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+          # Compute UPDATEPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+          # Compute DUMMYPOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+          # Compute GMOFILES
+          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+          case "$ac_given_srcdir" in
+            .) srcdirpre= ;;
+            *) srcdirpre='$(srcdir)/' ;;
+          esac
+          POFILES=
+          UPDATEPOFILES=
+          DUMMYPOFILES=
+          GMOFILES=
+          for lang in $ALL_LINGUAS; do
+            POFILES="$POFILES $srcdirpre$lang.po"
+            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+          done
+          # CATALOGS depends on both $ac_dir and the user's LINGUAS
+          # environment variable.
+          INST_LINGUAS=
+          if test -n "$ALL_LINGUAS"; then
+            for presentlang in $ALL_LINGUAS; do
+              useit=no
+              if test "%UNSET%" != "$LINGUAS"; then
+                desiredlanguages="$LINGUAS"
+              else
+                desiredlanguages="$ALL_LINGUAS"
+              fi
+              for desiredlang in $desiredlanguages; do
+                # Use the presentlang catalog if desiredlang is
+                #   a. equal to presentlang, or
+                #   b. a variant of presentlang (because in this case,
+                #      presentlang can be used as a fallback for messages
+                #      which are not translated in the desiredlang catalog).
+                case "$desiredlang" in
+                  "$presentlang"*) useit=yes;;
+                esac
+              done
+              if test $useit = yes; then
+                INST_LINGUAS="$INST_LINGUAS $presentlang"
+              fi
+            done
+          fi
+          CATALOGS=
+          if test -n "$INST_LINGUAS"; then
+            for lang in $INST_LINGUAS; do
+              CATALOGS="$CATALOGS $lang.gmo"
+            done
+          fi
+          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+            if test -f "$f"; then
+              case "$f" in
+                *.orig | *.bak | *~) ;;
+                *) cat "$f" >> "$ac_dir/Makefile" ;;
+              esac
+            fi
+          done
+        fi
+        ;;
+      esac
+    done],
+   [# Capture the value of obsolete ALL_LINGUAS because we need it to compute
+    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
+    # from automake.
+    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
+    # Capture the value of LINGUAS because we need it to compute CATALOGS.
+    LINGUAS="${LINGUAS-%UNSET%}"
+   ])
+])
+
+dnl Postprocesses a Makefile in a directory containing PO files.
+AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE],
+[
+  # When this code is run, in config.status, two variables have already been
+  # set:
+  # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in,
+  # - LINGUAS is the value of the environment variable LINGUAS at configure
+  #   time.
+
+changequote(,)dnl
+  # Adjust a relative srcdir.
+  ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+  ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+  ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+  # In autoconf-2.13 it is called $ac_given_srcdir.
+  # In autoconf-2.50 it is called $srcdir.
+  test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+  case "$ac_given_srcdir" in
+    .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+    /*) top_srcdir="$ac_given_srcdir" ;;
+    *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  # Find a way to echo strings without interpreting backslash.
+  if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then
+    gt_echo='echo'
+  else
+    if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then
+      gt_echo='printf %s\n'
+    else
+      echo_func () {
+        cat <<EOT
+$*
+EOT
+      }
+      gt_echo='echo_func'
+    fi
+  fi
+
+  # A sed script that extracts the value of VARIABLE from a Makefile.
+  sed_x_variable='
+# Test if the hold space is empty.
+x
+s/P/P/
+x
+ta
+# Yes it was empty. Look if we have the expected variable definition.
+/^[     ]*VARIABLE[     ]*=/{
+  # Seen the first line of the variable definition.
+  s/^[  ]*VARIABLE[     ]*=//
+  ba
+}
+bd
+:a
+# Here we are processing a line from the variable definition.
+# Remove comment, more precisely replace it with a space.
+s/#.*$/ /
+# See if the line ends in a backslash.
+tb
+:b
+s/\\$//
+# Print the line, without the trailing backslash.
+p
+tc
+# There was no trailing backslash. The end of the variable definition is
+# reached. Clear the hold space.
+s/^.*$//
+x
+bd
+:c
+# A trailing backslash means that the variable definition continues in the
+# next line. Put a nonempty string into the hold space to indicate this.
+s/^.*$/P/
+x
+:d
+'
+changequote([,])dnl
+
+  # Set POTFILES to the value of the Makefile variable POTFILES.
+  sed_x_POTFILES="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/POTFILES/g'`"
+  POTFILES=`sed -n -e "$sed_x_POTFILES" < "$ac_file"`
+  # Compute POTFILES_DEPS as
+  #   $(foreach file, $(POTFILES), $(top_srcdir)/$(file))
+  POTFILES_DEPS=
+  for file in $POTFILES; do
+    POTFILES_DEPS="$POTFILES_DEPS "'$(top_srcdir)/'"$file"
+  done
+  POMAKEFILEDEPS=""
+
+  if test -n "$OBSOLETE_ALL_LINGUAS"; then
+    test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+  fi
+  if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+    # The LINGUAS file contains the set of available languages.
+    ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+    POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
+  else
+    # Set ALL_LINGUAS to the value of the Makefile variable LINGUAS.
+    sed_x_LINGUAS="`$gt_echo \"$sed_x_variable\" | sed -e '/^ *#/d' -e 's/VARIABLE/LINGUAS/g'`"
+    ALL_LINGUAS_=`sed -n -e "$sed_x_LINGUAS" < "$ac_file"`
+  fi
+  # Hide the ALL_LINGUAS assigment from automake.
+  eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+  # Compute POFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
+  # Compute UPDATEPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
+  # Compute DUMMYPOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
+  # Compute GMOFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
+  # Compute PROPERTIESFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).properties)
+  # Compute CLASSFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(top_srcdir)/$(DOMAIN)_$(lang).class)
+  # Compute QMFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).qm)
+  # Compute MSGFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang)).msg)
+  # Compute RESOURCESDLLFILES
+  # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(frob $(lang))/$(DOMAIN).resources.dll)
+  case "$ac_given_srcdir" in
+    .) srcdirpre= ;;
+    *) srcdirpre='$(srcdir)/' ;;
+  esac
+  POFILES=
+  UPDATEPOFILES=
+  DUMMYPOFILES=
+  GMOFILES=
+  PROPERTIESFILES=
+  CLASSFILES=
+  QMFILES=
+  MSGFILES=
+  RESOURCESDLLFILES=
+  for lang in $ALL_LINGUAS; do
+    POFILES="$POFILES $srcdirpre$lang.po"
+    UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+    DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+    PROPERTIESFILES="$PROPERTIESFILES \$(top_srcdir)/\$(DOMAIN)_$lang.properties"
+    CLASSFILES="$CLASSFILES \$(top_srcdir)/\$(DOMAIN)_$lang.class"
+    QMFILES="$QMFILES $srcdirpre$lang.qm"
+    frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+    MSGFILES="$MSGFILES $srcdirpre$frobbedlang.msg"
+    frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+    RESOURCESDLLFILES="$RESOURCESDLLFILES $srcdirpre$frobbedlang/\$(DOMAIN).resources.dll"
+  done
+  # CATALOGS depends on both $ac_dir and the user's LINGUAS
+  # environment variable.
+  INST_LINGUAS=
+  if test -n "$ALL_LINGUAS"; then
+    for presentlang in $ALL_LINGUAS; do
+      useit=no
+      if test "%UNSET%" != "$LINGUAS"; then
+        desiredlanguages="$LINGUAS"
+      else
+        desiredlanguages="$ALL_LINGUAS"
+      fi
+      for desiredlang in $desiredlanguages; do
+        # Use the presentlang catalog if desiredlang is
+        #   a. equal to presentlang, or
+        #   b. a variant of presentlang (because in this case,
+        #      presentlang can be used as a fallback for messages
+        #      which are not translated in the desiredlang catalog).
+        case "$desiredlang" in
+          "$presentlang"*) useit=yes;;
+        esac
+      done
+      if test $useit = yes; then
+        INST_LINGUAS="$INST_LINGUAS $presentlang"
+      fi
+    done
+  fi
+  CATALOGS=
+  JAVACATALOGS=
+  QTCATALOGS=
+  TCLCATALOGS=
+  CSHARPCATALOGS=
+  if test -n "$INST_LINGUAS"; then
+    for lang in $INST_LINGUAS; do
+      CATALOGS="$CATALOGS $lang.gmo"
+      JAVACATALOGS="$JAVACATALOGS \$(DOMAIN)_$lang.properties"
+      QTCATALOGS="$QTCATALOGS $lang.qm"
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      TCLCATALOGS="$TCLCATALOGS $frobbedlang.msg"
+      frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+      CSHARPCATALOGS="$CSHARPCATALOGS $frobbedlang/\$(DOMAIN).resources.dll"
+    done
+  fi
+
+  sed -e "s|@POTFILES_DEPS@|$POTFILES_DEPS|g" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@PROPERTIESFILES@|$PROPERTIESFILES|g" -e "s|@CLASSFILES@|$CLASSFILES|g" -e "s|@QMFILES@|$QMFILES|g" -e "s|@MSGFILES@|$MSGFILES|g" -e "s|@RESOURCESDLLFILES@|$RESOURCESDLLFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@JAVACATALOGS@|$JAVACATALOGS|g" -e "s|@QTCATALOGS@|$QTCATALOGS|g" -e "s|@TCLCATALOGS@|$TCLCATALOGS|g" -e "s|@CSHARPCATALOGS@|$CSHARPCATALOGS|g" -e 's,^#distdir:,distdir:,' < "$ac_file" > "$ac_file.tmp"
+  if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang.msg: $lang.po
+       @echo "\$(MSGFMT) -c --tcl -d \$(srcdir) -l $lang $srcdirpre$lang.po"; \
+       \$(MSGFMT) -c --tcl -d "\$(srcdir)" -l $lang $srcdirpre$lang.po || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if grep -l '@CSHARPCATALOGS@' "$ac_file" > /dev/null; then
+    # Add dependencies that cannot be formulated as a simple suffix rule.
+    for lang in $ALL_LINGUAS; do
+      frobbedlang=`echo $lang | sed -e 's/_/-/g'`
+      cat >> "$ac_file.tmp" <<EOF
+$frobbedlang/\$(DOMAIN).resources.dll: $lang.po
+       @echo "\$(MSGFMT) -c --csharp -d \$(srcdir) -l $lang $srcdirpre$lang.po -r \$(DOMAIN)"; \
+       \$(MSGFMT) -c --csharp -d "\$(srcdir)" -l $lang $srcdirpre$lang.po -r "\$(DOMAIN)" || { rm -f "\$(srcdir)/$frobbedlang.msg"; exit 1; }
+EOF
+    done
+  fi
+  if test -n "$POMAKEFILEDEPS"; then
+    cat >> "$ac_file.tmp" <<EOF
+Makefile: $POMAKEFILEDEPS
+EOF
+  fi
+  mv "$ac_file.tmp" "$ac_file"
+])
diff --git a/m4/printf-posix.m4 b/m4/printf-posix.m4
new file mode 100644 (file)
index 0000000..186ba6a
--- /dev/null
@@ -0,0 +1,46 @@
+# printf-posix.m4 serial 2 (gettext-0.13.1)
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether the printf() function supports POSIX/XSI format strings with
+dnl positions.
+
+AC_DEFUN([gt_PRINTF_POSIX],
+[
+  AC_REQUIRE([AC_PROG_CC])
+  AC_CACHE_CHECK([whether printf() supports POSIX/XSI format strings],
+    gt_cv_func_printf_posix,
+    [
+      AC_TRY_RUN([
+#include <stdio.h>
+#include <string.h>
+/* The string "%2$d %1$d", with dollar characters protected from the shell's
+   dollar expansion (possibly an autoconf bug).  */
+static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
+static char buf[100];
+int main ()
+{
+  sprintf (buf, format, 33, 55);
+  return (strcmp (buf, "55 33") != 0);
+}], gt_cv_func_printf_posix=yes, gt_cv_func_printf_posix=no,
+      [
+        AC_EGREP_CPP(notposix, [
+#if defined __NetBSD__ || defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__
+  notposix
+#endif
+        ], gt_cv_func_printf_posix="guessing no",
+           gt_cv_func_printf_posix="guessing yes")
+      ])
+    ])
+  case $gt_cv_func_printf_posix in
+    *yes)
+      AC_DEFINE(HAVE_POSIX_PRINTF, 1,
+        [Define if your printf() function supports format strings with positions.])
+      ;;
+  esac
+])
diff --git a/m4/progtest.m4 b/m4/progtest.m4
new file mode 100644 (file)
index 0000000..8fe527c
--- /dev/null
@@ -0,0 +1,91 @@
+# progtest.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1996-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl   Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl   TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+# Find out how to test for executable files. Don't use a zero-byte file,
+# as systems may use methods other than mode bits to determine executability.
+cat >conf$$.file <<_ASEOF
+#! /bin/sh
+exit 0
+_ASEOF
+chmod +x conf$$.file
+if test -x conf$$.file >/dev/null 2>&1; then
+  ac_executable_p="test -x"
+else
+  ac_executable_p="test -f"
+fi
+rm -f conf$$.file
+
+# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+  [[\\/]]* | ?:[[\\/]]*)
+    ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+    ;;
+  *)
+    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in ifelse([$5], , $PATH, [$5]); do
+      IFS="$ac_save_IFS"
+      test -z "$ac_dir" && ac_dir=.
+      for ac_exec_ext in '' $ac_executable_extensions; do
+        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
+          if [$3]; then
+            ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext"
+            break 2
+          fi
+        fi
+      done
+    done
+    IFS="$ac_save_IFS"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [  test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+    ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+  AC_MSG_RESULT([$]$1)
+else
+  AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
diff --git a/m4/readline.m4 b/m4/readline.m4
new file mode 100644 (file)
index 0000000..d252346
--- /dev/null
@@ -0,0 +1,63 @@
+dnl Check for readline and dependencies
+dnl Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+dnl
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl Defines HAVE_LIBREADLINE to 1 if a working readline setup is
+dnl found, and sets @LIBREADLINE@ to the necessary libraries.
+
+AC_DEFUN([GNUPG_CHECK_READLINE],
+[
+  AC_ARG_WITH(readline,
+     AC_HELP_STRING([--with-readline=DIR],
+       [look for the readline library in DIR]),
+     [_do_readline=$withval],[_do_readline=yes])
+
+  if test "$_do_readline" != "no" ; then
+     if test -d "$withval" ; then
+        CPPFLAGS="${CPPFLAGS} -I$withval/include"
+        LDFLAGS="${LDFLAGS} -L$withval/lib"
+     fi
+
+     for _termcap in "" "-ltermcap" "-lcurses" "-lncurses" ; do
+        _readline_save_libs=$LIBS
+        _combo="-lreadline${_termcap:+ $_termcap}"
+        LIBS="$LIBS $_combo"
+
+        AC_MSG_CHECKING([whether readline via \"$_combo\" is present and sane])
+
+        AC_LINK_IFELSE(AC_LANG_PROGRAM([
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+],[
+rl_completion_func_t *completer;
+add_history("foobar");
+rl_catch_signals=0;
+rl_inhibit_completion=0;
+rl_attempted_completion_function=NULL;
+rl_completion_matches(NULL,NULL);
+]),_found_readline=yes,_found_readline=no)
+
+        AC_MSG_RESULT([$_found_readline])
+
+        LIBS=$_readline_save_libs
+
+        if test $_found_readline = yes ; then
+           AC_DEFINE(HAVE_LIBREADLINE,1,
+             [Define to 1 if you have a fully functional readline library.])
+           AC_SUBST(LIBREADLINE,$_combo)
+           break
+        fi
+     done
+
+     unset _termcap
+     unset _readline_save_libs
+     unset _combo
+     unset _found_readline
+  fi
+])dnl
diff --git a/m4/signed.m4 b/m4/signed.m4
new file mode 100644 (file)
index 0000000..dc1f54f
--- /dev/null
@@ -0,0 +1,19 @@
+# signed.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([bh_C_SIGNED],
+[
+  AC_CACHE_CHECK([for signed], bh_cv_c_signed,
+   [AC_TRY_COMPILE(, [signed char x;], bh_cv_c_signed=yes, bh_cv_c_signed=no)])
+  if test $bh_cv_c_signed = no; then
+    AC_DEFINE(signed, ,
+              [Define to empty if the C compiler doesn't support this keyword.])
+  fi
+])
diff --git a/m4/size_max.m4 b/m4/size_max.m4
new file mode 100644 (file)
index 0000000..5762fc3
--- /dev/null
@@ -0,0 +1,61 @@
+# size_max.m4 serial 2
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([gl_SIZE_MAX],
+[
+  AC_CHECK_HEADERS(stdint.h)
+  dnl First test whether the system already has SIZE_MAX.
+  AC_MSG_CHECKING([for SIZE_MAX])
+  result=
+  AC_EGREP_CPP([Found it], [
+#include <limits.h>
+#if HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef SIZE_MAX
+Found it
+#endif
+], result=yes)
+  if test -z "$result"; then
+    dnl Define it ourselves. Here we assume that the type 'size_t' is not wider
+    dnl than the type 'unsigned long'.
+    dnl The _AC_COMPUTE_INT macro works up to LONG_MAX, since it uses 'expr',
+    dnl which is guaranteed to work from LONG_MIN to LONG_MAX.
+    _AC_COMPUTE_INT([~(size_t)0 / 10], res_hi,
+      [#include <stddef.h>], result=?)
+    _AC_COMPUTE_INT([~(size_t)0 % 10], res_lo,
+      [#include <stddef.h>], result=?)
+    _AC_COMPUTE_INT([sizeof (size_t) <= sizeof (unsigned int)], fits_in_uint,
+      [#include <stddef.h>], result=?)
+    if test "$fits_in_uint" = 1; then
+      dnl Even though SIZE_MAX fits in an unsigned int, it must be of type
+      dnl 'unsigned long' if the type 'size_t' is the same as 'unsigned long'.
+      AC_TRY_COMPILE([#include <stddef.h>
+        extern size_t foo;
+        extern unsigned long foo;
+        ], [], fits_in_uint=0)
+    fi
+    if test -z "$result"; then
+      if test "$fits_in_uint" = 1; then
+        result="$res_hi$res_lo"U
+      else
+        result="$res_hi$res_lo"UL
+      fi
+    else
+      dnl Shouldn't happen, but who knows...
+      result='~(size_t)0'
+    fi
+  fi
+  AC_MSG_RESULT([$result])
+  if test "$result" != yes; then
+    AC_DEFINE_UNQUOTED([SIZE_MAX], [$result],
+      [Define as the maximum value of type 'size_t', if the system doesn't define it.])
+  fi
+])
diff --git a/m4/stdint_h.m4 b/m4/stdint_h.m4
new file mode 100644 (file)
index 0000000..32ba7ae
--- /dev/null
@@ -0,0 +1,28 @@
+# stdint_h.m4 serial 3 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_STDINT_H_WITH_UINTMAX if <stdint.h> exists,
+# doesn't clash with <sys/types.h>, and declares uintmax_t.
+
+AC_DEFUN([jm_AC_HEADER_STDINT_H],
+[
+  AC_CACHE_CHECK([for stdint.h], jm_ac_cv_header_stdint_h,
+  [AC_TRY_COMPILE(
+    [#include <sys/types.h>
+#include <stdint.h>],
+    [uintmax_t i = (uintmax_t) -1;],
+    jm_ac_cv_header_stdint_h=yes,
+    jm_ac_cv_header_stdint_h=no)])
+  if test $jm_ac_cv_header_stdint_h = yes; then
+    AC_DEFINE_UNQUOTED(HAVE_STDINT_H_WITH_UINTMAX, 1,
+      [Define if <stdint.h> exists, doesn't clash with <sys/types.h>,
+       and declares uintmax_t. ])
+  fi
+])
diff --git a/m4/tar-ustar.m4 b/m4/tar-ustar.m4
new file mode 100644 (file)
index 0000000..4ae9e63
--- /dev/null
@@ -0,0 +1,43 @@
+dnl Check for a tar program that speaks ustar format
+dnl Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+dnl
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([GNUPG_CHECK_USTAR],
+[
+  AC_ARG_WITH(tar,
+     AC_HELP_STRING([--with-tar=PATH],[look for a tar program in PATH]),
+     [_do_tar=$withval])
+
+  if test x$_do_tar != xno ; then
+
+     if test x$_do_tar = x ; then
+        AC_PATH_PROG(TAR,"tar")
+        _mytar=$ac_cv_path_TAR
+     fi
+
+     # Check if our tar is ustar format.  If so, it's good.  TODO: Add some
+     # code to check various options, etc, to try and create ustar
+     # format.
+
+     if test x$_mytar != x ; then
+        AC_MSG_CHECKING([whether $_mytar speaks USTAR])
+        echo hithere > conftest.txt
+        $_mytar -cf - conftest.txt | (dd skip=257 bs=1 count=5 2>/dev/null || cat) | grep ustar > /dev/null
+        _tar_bad=$?
+        rm conftest.txt
+
+       if test x$_tar_bad = x0 ; then
+          AC_MSG_RESULT([yes])
+       else
+          AC_MSG_RESULT([no])
+       fi
+     fi
+  fi
+
+  AM_CONDITIONAL(HAVE_USTAR, test x$_tar_bad = x0)
+])dnl
diff --git a/m4/uintmax_t.m4 b/m4/uintmax_t.m4
new file mode 100644 (file)
index 0000000..b5f28d4
--- /dev/null
@@ -0,0 +1,32 @@
+# uintmax_t.m4 serial 7 (gettext-0.12)
+dnl Copyright (C) 1997-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+AC_PREREQ(2.13)
+
+# Define uintmax_t to 'unsigned long' or 'unsigned long long'
+# if it is not already defined in <stdint.h> or <inttypes.h>.
+
+AC_DEFUN([jm_AC_TYPE_UINTMAX_T],
+[
+  AC_REQUIRE([jm_AC_HEADER_INTTYPES_H])
+  AC_REQUIRE([jm_AC_HEADER_STDINT_H])
+  if test $jm_ac_cv_header_inttypes_h = no && test $jm_ac_cv_header_stdint_h = no; then
+    AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
+    test $ac_cv_type_unsigned_long_long = yes \
+      && ac_type='unsigned long long' \
+      || ac_type='unsigned long'
+    AC_DEFINE_UNQUOTED(uintmax_t, $ac_type,
+      [Define to unsigned long or unsigned long long
+       if <stdint.h> and <inttypes.h> don't define.])
+  else
+    AC_DEFINE(HAVE_UINTMAX_T, 1,
+      [Define if you have the 'uintmax_t' type in <stdint.h> or <inttypes.h>.])
+  fi
+])
diff --git a/m4/ulonglong.m4 b/m4/ulonglong.m4
new file mode 100644 (file)
index 0000000..1da8b80
--- /dev/null
@@ -0,0 +1,25 @@
+# ulonglong.m4 serial 3
+dnl Copyright (C) 1999-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Paul Eggert.
+
+# Define HAVE_UNSIGNED_LONG_LONG if 'unsigned long long' works.
+
+AC_DEFUN([jm_AC_TYPE_UNSIGNED_LONG_LONG],
+[
+  AC_CACHE_CHECK([for unsigned long long], ac_cv_type_unsigned_long_long,
+  [AC_TRY_LINK([unsigned long long ull = 1ULL; int i = 63;],
+    [unsigned long long ullmax = (unsigned long long) -1;
+     return ull << i | ull >> i | ullmax / ull | ullmax % ull;],
+    ac_cv_type_unsigned_long_long=yes,
+    ac_cv_type_unsigned_long_long=no)])
+  if test $ac_cv_type_unsigned_long_long = yes; then
+    AC_DEFINE(HAVE_UNSIGNED_LONG_LONG, 1,
+      [Define if you have the 'unsigned long long' type.])
+  fi
+])
diff --git a/m4/wchar_t.m4 b/m4/wchar_t.m4
new file mode 100644 (file)
index 0000000..d8fd1ec
--- /dev/null
@@ -0,0 +1,22 @@
+# wchar_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2002-2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <stddef.h> has the 'wchar_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WCHAR_T],
+[
+  AC_CACHE_CHECK([for wchar_t], gt_cv_c_wchar_t,
+    [AC_TRY_COMPILE([#include <stddef.h>
+       wchar_t foo = (wchar_t)'\0';], ,
+       gt_cv_c_wchar_t=yes, gt_cv_c_wchar_t=no)])
+  if test $gt_cv_c_wchar_t = yes; then
+    AC_DEFINE(HAVE_WCHAR_T, 1, [Define if you have the 'wchar_t' type.])
+  fi
+])
diff --git a/m4/wint_t.m4 b/m4/wint_t.m4
new file mode 100644 (file)
index 0000000..3d8d215
--- /dev/null
@@ -0,0 +1,22 @@
+# wint_t.m4 serial 1 (gettext-0.12)
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+dnl Test whether <wchar.h> has the 'wint_t' type.
+dnl Prerequisite: AC_PROG_CC
+
+AC_DEFUN([gt_TYPE_WINT_T],
+[
+  AC_CACHE_CHECK([for wint_t], gt_cv_c_wint_t,
+    [AC_TRY_COMPILE([#include <wchar.h>
+       wint_t foo = (wchar_t)'\0';], ,
+       gt_cv_c_wint_t=yes, gt_cv_c_wint_t=no)])
+  if test $gt_cv_c_wint_t = yes; then
+    AC_DEFINE(HAVE_WINT_T, 1, [Define if you have the 'wint_t' type.])
+  fi
+])
diff --git a/m4/xsize.m4 b/m4/xsize.m4
new file mode 100644 (file)
index 0000000..9b7cf9b
--- /dev/null
@@ -0,0 +1,14 @@
+# xsize.m4 serial 2
+dnl Copyright (C) 2003 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([gl_XSIZE],
+[
+  dnl Prerequisites of lib/xsize.h.
+  AC_REQUIRE([gl_SIZE_MAX])
+  AC_CHECK_HEADERS(stdint.h)
+])
diff --git a/mpi/ChangeLog b/mpi/ChangeLog
new file mode 100644 (file)
index 0000000..a2af9f3
--- /dev/null
@@ -0,0 +1,505 @@
+2005-09-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * mpicoder.c (mpi_read): Fix minor bug in reading a zero-length
+       MPI (was failing unnecessarily).
+
+2005-05-06  Werner Koch  <wk@g10code.com>
+
+       * mpi-scan.c (mpi_putbyte, mpi_getbyte): Removed.  Not used.
+
+2005-04-21  Werner Koch  <wk@g10code.com>
+
+       * mpicoder.c (mpi_read): Changed error detection to always return
+       an error while maintaining the actual number of bytes read.
+
+2005-03-11  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (ASFLAGS): Renamed to AM_CCASFLAGS and added the
+       variable for non exectubale stack options.  Adapted users.
+
+2004-12-20  Werner Koch  <wk@g10code.com>
+
+       * mpicoder.c (mpi_read_from_buffer): Don't abort in case of an
+       invalid MPI but print a message and return NULL.  Use log_info and
+       not log_error.
+
+2004-10-26  Werner Koch  <wk@g10code.com>
+
+       * config.links: Use HOST instead of TARGET.
+
+2004-10-12  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (.S.o): Include MPI_SFLAGS. This is our bug 145.
+
+2004-09-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * mpicoder.c (mpi_read): If we must fail due to a oversize
+       (generally corrupt) MPI, make sure the number of bytes we read is
+       valid so we can skip the rest of the bad packet (in hopes the
+       whole stream isn't invalid).
+
+2004-05-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * longlong.h: Typo.
+
+       * mpi-pow.c (mpi_powm): s/exp/exponent/ to shutup a compiler
+       warning.  From Werner on stable branch.
+
+2004-01-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * hppa1.1/udiv-qrnnd.S: Alignment fix from Lamont Jones for
+       Debian.
+
+2004-01-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * config.links: OpenBSD 3.4 is now ELF, so use the proper
+       assembler code for that.  Use the portable C MPI code for OpenBSD
+       before 3.4, and remove the special i386-openbsd assembly
+       directory.
+
+       * Makefile.am: Add the portable C links to DISTCLEANFILES.  Noted
+       by Nelson H. F. Beebe.
+
+       * mpi-mpow.c (build_index): s/index/idx/ to avoid gcc warning.
+       From Werner on stable branch.
+
+       * longlong.h: Added PowerPC 64 bit code from GPM-4.1.2 but didn't
+       enable it yet.  From Werner on stable branch.
+
+2003-12-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10m.c: Dead code.  Remove.
+
+       * Makefile.am: Don't compile g10m.c.
+
+2003-12-17  David Shaw  <dshaw@localhost.localdomain>
+
+       * mpiutil.c (mpi_set_opaque, mpi_get_opaque): Make the length of
+       an opaque MPI unsigned.
+
+2003-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * config.links: Show target in asm-syntax.h file and include
+       targets for K*BSD (GNU userland with BSD kernel).
+
+2003-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * config.links: sparc64 assembler doesn't work on FreeBSD or
+       OpenBSD either.
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Make use of AM_CFLAGS. (From wk on stable branch)
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * mpicoder.c, mpi-inline.h, mpi-inv.c, mpiutil.c, mpih-div.c,
+       mpi-internal.h, mpi-scan.c: Edit all preprocessor instructions to
+       remove whitespace before the '#'.  This is not required by C89,
+       but there are some compilers out there that don't like it.
+
+2003-04-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * config.links: Re-disable assembler on Darwin.  Darwin 6.5 broke
+       it again.
+
+2003-04-15  Werner Koch  <wk@gnupg.org>
+
+       * longlong.h (umul_ppmm): Support SH3 and SH4.  Thanks to
+       kazuya.s@jp.yokogawa.com.
+
+2002-11-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * config.links: Use OpenBSD/NetBSD powerpc assembler code for
+       Darwin.  Successfully tested by Gordon Worley.
+
+2002-10-17  Werner Koch  <wk@gnupg.org>
+
+       * config.links (powerpc-apple-darwin6.1): Disable assembler
+       due to non-working modules/as.  Suggested by Gordon Worley.
+
+2002-10-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * longlong.h: Some whitespace changes in HPPA to fix assembler
+       problems on HP-UX.  From David Ellement.
+
+2002-09-20  Werner Koch  <wk@gnupg.org>
+
+       * mpicoder.c (do_get_buffer): Avoid zero length allocation.
+       Checked that all callers behave properly when NBYTES returns 0 as
+       the length of the allocated buffer.
+
+2002-09-10  Werner Koch  <wk@gnupg.org>
+
+       * mpi-bit.c (mpi_normalize): Replaced the check for protected by
+       is_opaque.
+       (mpi_get_nbits): Removed the special case for protected MPIs.
+       * mpicoder.c (do_get_buffer): Likewise.
+       (mpi_print): Removed the nbit_info printing.
+
+2002-09-03  Werner Koch  <wk@gnupg.org>
+
+       * mpicoder.c (mpi_set_buffer): Cast all left operands of a shift
+       to a larger type so that 16 bit CPUs don't suffer from an
+       overflow.  Suggested by TOGAWA Satoshi.
+
+2002-08-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * longlong.h: Remove space between \ and newline. gcc is
+       complaining.
+
+2002-08-13  Werner Koch  <wk@gnupg.org>
+
+       * mpicoder.c (do_get_buffer): Don't remove leading zeros if the
+       MPI is marked as protected.
+
+2002-08-02  Timo Schulz  <ts@winpt.org>
+
+       * mpicoder.c: Add a '\n' to all log_bug functions.
+       
+2002-08-01  Werner Koch  <wk@gnupg.org>
+
+       * config.links: Added case for sparc64-netbsd. Suggested by
+       ww@styx.org.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * config.links: Add special rule for OpenBSD on x86 to use special
+       i386-openbsd files.  OpenBSD (at least until version 3.1) has an
+       older assembler that won't work with the files in i386.
+
+2002-07-24  Stefan Bellon  <sbellon@sbellon.de>
+
+       * longlong.h [__riscos__]: Removed #pragma which is not needed
+       anymore since the K&R multiline strings are gone.
+
+2002-07-24  Werner Koch  <wk@gnupg.org>
+
+       * longlong.h: Replaced all K&R multiline strings by ISO ones for
+       the sake of modern compilers.  Suggested by Marco Parrone.
+
+2002-05-10  Stefan Bellon  <sbellon@sbellon.de>
+
+       * mpiutil.c (mpi_alloc_like/mpi_debug_alloc_like): Added code
+       for M_DEBUG.
+
+2002-04-18  Werner Koch  <wk@gnupg.org>
+
+       * i386/syntax.h (ALIGN): Removed parens from definition
+       * i386/mpih-add1.S, i386/mpih-sub1.S, i386/mpih-rshift.S,
+       i386/mpih-lshift.S: Minor syntax changes suggested by Mark Pettit
+       after comparing the files with those for GMP 4.
+       
+2001-11-08  Werner Koch  <wk@gnupg.org>
+
+       * config.links (mpi_sflags): Add extra rule for sparc64-sun-solaris2.
+
+2001-08-20  Werner Koch  <wk@gnupg.org>
+
+       * longlong.h [__riscos__]: Need a special pragma here.
+
+2001-08-09  Werner Koch  <wk@gnupg.org>
+
+       * config.links: Added configuraton for powerpc-openbsd.  By Peter
+       Valchev
+
+2001-07-09  Werner Koch  <wk@gnupg.org>
+
+       * config.links: Changed the way the list of files to be
+       symlinked is returned.
+
+2001-05-27  Werner Koch  <wk@gnupg.org>
+
+       * hppa/, hppa1.1/, pa7100/ : Use .label command instead of labels
+       because there syntax changed.  By Matthew Wilcox.
+
+2001-05-06  Werner Koch  <wk@gnupg.org>
+
+       * longlong.h: Fixes for ARM by Phil Blundell.
+
+2001-04-17  Werner Koch  <wk@gnupg.org>
+
+       Updated copyright notices.
+
+2001-03-24  Werner Koch  <wk@gnupg.org>
+
+       * mpi-mul.c (mpi_mul): Make sure that secret temporary results are
+       not stored in w.  Suggested by Florian Weimer.
+
+2001-03-18  Werner Koch  <wk@gnupg.org>
+
+       * config.links: Use i386 code for i386.  According to tests by
+       Kevin Ryde the i586 code runs slow on i386 CPUs.  Ditto for i786.
+
+2000-10-24  Werner Koch  <wk@gnupg.org>
+
+       * mips3/: Changed a few comments to C-style. By Jeff Long.
+
+2000-10-13  Werner Koch  <wk@gnupg.org>
+
+       * mpi.h: Removed the inclusion of mpi-asm-defs.h because this
+       makes some trouble when doing a VPATH build.  configure now
+       takes care of it.
+       
+2000-10-12  Werner Koch  <wk@gnupg.org>
+
+       * generic/mpi-asm-defs.h: New.
+       * mips3/mpi-asm-defs.h: New.
+       * config.links: Create a link to one of the above files.
+
+Wed Jul 19 11:26:43 CEST 2000  Werner Koch  <wk@>
+
+        * config.links: Support for powerpc--netbsd by Gabriel Rosenkoetter.
+
+Wed Mar 22 13:50:24 CET 2000  Werner Koch  <wk@openit.de>
+
+       * config.links: Add support for FreeBSD 5 and made the case stmt
+       looking nicer.  From Jun Kuriyama.
+
+Fri Mar 17 17:50:25 CET 2000  Werner Koch  <wk@openit.de>
+
+       * config.links (sparc64-unknown-linux-gnu): use udic module.
+       From Adam Mitchell.
+
+2000-03-14 12:03:56  Werner Koch  (wk@habibti.openit.de)
+
+       * Makefile.am: Do not use .s and .S files but a temp names, so that
+       OSes with caseinsensitive filenames do work.  From Frank Donahoe.
+
+Tue Mar  7 18:45:31 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * mpih-mul.c (mpihelp_mul_karatsuba_case): It seems that the
+       untested part works fine.  Removed the debugging message.
+
+       * longlong.h (umul_ppmm): Fixes for ARM-4. By Sean MacLennan.
+
+       * config.links: Add support for NetBSD.
+
+Thu Jan 13 19:31:58 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * mpi-internal.h (karatsuba_ctx): New.
+       * mpih-mul.c (mpihelp_release_karatsuba_ctx): New.
+       (mpihelp_mul_karatsuba_case): New.
+       (mpihelp_mul): Splitted to make use of the new functions.
+       * mpi-pow.c (mpi_powm): Make use of the new splitted function
+       to avoid multiple allocation of temporary memory during the
+       karatsuba operations.
+
+       * mpi_mpow.c: Removed the unused Barrett code.
+
+Sun Dec 19 15:22:26 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * power/ : Converted more comments to C comments because some AS
+       complain about ' in comments.
+
+Thu Dec 16 10:07:58 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * Makefile.am: c/SFLAGS/ASFLAGS/. This has only been used by the
+       powerpc and actually never passed the -Wa,foo to the cc.
+
+Thu Dec  9 10:31:05 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * power/: Add all files from GMP for this CPU.
+
+       * config.links:  Support for BSDI 4.x. By Wayne Chapeskie.
+       (sparc8): Made the search path the same as sparc9
+
+       * mpih-div.c (mpihelp_divrem): The MPN_COPY_DECR copied one
+       elemnat too many.  This is gmp2.0.2p9.txt patch.
+
+Sat Oct  9 20:34:41 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * Makefile.am:  Removed libtool.
+
+Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.links: Add case label for DJGPP
+
+Wed Jul 14 19:42:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * Makefile.am: Use .s files as temporaries, disabled other .S rules.
+
+Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * mpicoder.c (g10_log_mpidump): New.
+
+       * Makefile.am: Support for libtool.
+
+Fri Jul  2 11:45:54 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * mpi-bit.c (mpi_lshift_limbs,mpi_rshift_limbs): New.
+       * mpi-mpow.c (barrett_mulm): New but diabled.
+
+Tue Jun  1 16:01:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.links (i[56]86*-*-freebsdelf*): New.
+
+Sun May 23 14:20:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.links (sysdep.h): Not any more conditionally created.
+
+Tue May  4 15:47:53 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpiutil.c (mpi_alloc_like): New.
+
+Mon Apr 26 17:48:15 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpih-add.c, mpih-sub.c: Removed
+       * mpi-inline.c: New.
+       * mpi-inline.h: Make it usable by mpi-inline.c.
+
+Sun Apr 18 10:11:28 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpih-mul.c (mpihelp_mul_n): Fixed use of memory region.
+       (mpihelp_mul): Ditto.
+
+Wed Apr  7 20:51:39 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Explicit rules to invoke cpp on *.S
+
+Mon Mar  8 20:47:17 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.links: Take advantage of the with_symbol_underscore macro.
+       Add support for freebsd 4.
+
+Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mips3/mpih-sub1.S: Removed left over junk in last line. (Should I
+       blame me or my editor?).
+
+Sat Feb 13 12:04:43 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Removed the +=. Add MPI_OPT_FLAGS.
+
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpi-cmp.c (mpi_cmp_ui): Normalized the arg.
+
+Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpi-bit.c (mpi_normalize): New.
+       (mpi_get_nbits): Normalize the MPI.
+       * mpi-bit.c (mpi_cmp): Normalize the MPI before the compare.
+
+
+Tue Dec  8 13:15:16 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.links: Moved the case for powerpc*linux
+       * powerpcp32/*.S: Removed some underscores.
+
+Thu Nov 26 07:27:52 1998  Werner Koch  <werner.koch@guug.de>
+
+       * config.links: Support for ppc with ELF
+       * powerpc32/syntax.h: New.
+       * powerpc32/*.S: Applied ELF patches (glibc patches)
+
+Tue Nov 10 19:31:37 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * power*/ : Started with stuff for PPC
+       * config.links: Some stuff for PPC.
+       * generic/udiv-w-sdiv.c: New but disabled.
+
+Tue Oct 27 12:37:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links (freebsd): Fixes for FreeBSD 3.0
+
+Wed Oct 14 09:59:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links (freebsd): ELF patches from Jun Kuriyama.
+
+Thu Oct  8 13:28:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpi-mpow.c (mpi_mulpowm): Fixed mem leak (m_free/mpi_free).
+
+Thu Sep 17 18:08:50 1998  Werner Koch  (wk@(none))
+
+       * hppa1.1/udiv-qrnnd.S: Fix from Steffen Zahn for HPUX 10.20
+
+Thu Aug  6 16:39:28 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * mpi-bit.c (mpi_set_bytes): Removed.
+
+Wed Aug  5 15:11:12 1998  Werner Koch  (wk@(none))
+
+       * mpicoder.c (mpi_read_from_buffer): New.
+
+       * mpiutil.c (mpi_set_opaque): New.
+       (mpi_get_opaque): New.
+       (mpi_copy): Changed to support opauqe flag
+       (mpi_free): Ditto.
+
+Sat Jul  4 10:11:11 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpiutil.c (mpi_clear): Reset flags.
+       (mpi_set): Ditto.
+       (mpi_alloc_secure): Set flag to 1 and not ored the 1 in, tsss..
+
+Fri Jun 26 11:19:06 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpiutil.c (mpi_alloc): set nbits to 0.
+       (mpi_alloc_secure): Ditto.
+       (mpi_clear): Ditto.
+
+Thu Jun 25 11:50:01 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mips3/*.S: New
+
+Mon May 18 13:47:06 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links: split mpih-shift into mpih-[lr]shift and
+       changed all implementations.
+       * mpi/alpha: add some new assembler stuff.
+
+Wed May 13 11:04:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links: Add support for MIPS
+
+Thu Apr  9 11:31:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpicoder.c (mpi_get_secure_buffer): New.
+
+Wed Apr  8 09:44:33 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links: Applied small fix from Ulf Möller.
+
+Mon Apr  6 12:38:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpicoder.c (mpi_get_buffer): Removed returned leading zeroes
+       and changed all callers.
+
+Tue Mar 10 13:40:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpi-bit.c (mpi_clear_highbit): New.
+
+Mon Mar  2 19:29:00 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.am (DISTCLEANFILES): New
+
+Thu Feb 26 06:48:54 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links (X86_BROKEN_ALIGN): Added for some systems.
+
+Mon Feb 23 12:21:40 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mpi/m68k/mpih-shift.S (Lspecial): Changed duplicate symbol.
+
+Mon Feb 16 13:00:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.links : Add detection of m68k cpus
+
+
+
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
+
diff --git a/mpi/Makefile.am b/mpi/Makefile.am
new file mode 100644 (file)
index 0000000..84d7757
--- /dev/null
@@ -0,0 +1,79 @@
+# Copyright (C) 1998, 1999, 2000, 2001, 2003 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+
+INCLUDES = -I.. -I$(top_srcdir)/include
+AM_CFLAGS = $(MPI_OPT_FLAGS)
+AM_CCASFLAGS = $(NOEXECSTACK_FLAGS) $(MPI_SFLAGS)
+
+EXTRA_DIST = config.links
+DISTCLEANFILES = mpi-asm-defs.h \
+                 mpih-add1.S mpih-add1.c mpih-mul1.S mpih-mul1.c \
+                mpih-mul2.S mpih-mul2.c mpih-mul3.S mpih-mul3.c \
+                mpih-lshift.S mpih-lshift.c mpih-rshift.S mpih-rshift.c \
+                mpih-sub1.S mpih-sub1.c asm-syntax.h sysdep.h
+
+# Note: we only use .S files so we should delete all left over .s
+CLEANFILES = _*.s
+
+noinst_LIBRARIES = libmpi.a
+
+# libmpi_a_LDFLAGS =
+libmpi_a_SOURCES = longlong.h    \
+             mpi-add.c      \
+             mpi-bit.c      \
+             mpi-cmp.c      \
+             mpi-div.c      \
+             mpi-gcd.c      \
+             mpi-internal.h \
+             mpi-inline.h   \
+             mpi-inline.c   \
+             mpi-inv.c      \
+             mpi-mul.c      \
+             mpi-pow.c      \
+             mpi-mpow.c     \
+             mpi-scan.c     \
+             mpicoder.c     \
+             mpih-cmp.c     \
+             mpih-div.c     \
+             mpih-mul.c     \
+             mpiutil.c
+
+# Note this objects are actually links, the sourcefiles are
+# distributed by special code in dist-hook
+common_asm_objects = mpih-mul1.o    \
+                    mpih-mul2.o    \
+                    mpih-mul3.o    \
+                    mpih-add1.o    \
+                    mpih-sub1.o    \
+                    mpih-lshift.o  \
+                    mpih-rshift.o
+
+libmpi_a_DEPENDENCIES = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
+libmpi_a_LIBADD = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
+
+# cancel the default rules used by libtool which do not really
+# work and add one to cpp .S files
+.S.o:
+        $(CPP) $(INCLUDES) $(DEFS) $< | grep -v '^#' > _$*.s
+        $(COMPILE) $(AM_CCASFLAGS) -c _$*.s
+        mv -f _$*.o $*.o
+
+.S.lo:
diff --git a/mpi/Makefile.in b/mpi/Makefile.in
new file mode 100644 (file)
index 0000000..fa4dc64
--- /dev/null
@@ -0,0 +1,606 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2003 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = mpi
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libmpi_a_AR = $(AR) $(ARFLAGS)
+am__DEPENDENCIES_1 = mpih-mul1.o mpih-mul2.o mpih-mul3.o mpih-add1.o \
+       mpih-sub1.o mpih-lshift.o mpih-rshift.o
+am_libmpi_a_OBJECTS = mpi-add.$(OBJEXT) mpi-bit.$(OBJEXT) \
+       mpi-cmp.$(OBJEXT) mpi-div.$(OBJEXT) mpi-gcd.$(OBJEXT) \
+       mpi-inline.$(OBJEXT) mpi-inv.$(OBJEXT) mpi-mul.$(OBJEXT) \
+       mpi-pow.$(OBJEXT) mpi-mpow.$(OBJEXT) mpi-scan.$(OBJEXT) \
+       mpicoder.$(OBJEXT) mpih-cmp.$(OBJEXT) mpih-div.$(OBJEXT) \
+       mpih-mul.$(OBJEXT) mpiutil.$(OBJEXT)
+libmpi_a_OBJECTS = $(am_libmpi_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libmpi_a_SOURCES)
+DIST_SOURCES = $(libmpi_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+INCLUDES = -I.. -I$(top_srcdir)/include
+AM_CFLAGS = $(MPI_OPT_FLAGS)
+AM_CCASFLAGS = $(NOEXECSTACK_FLAGS) $(MPI_SFLAGS)
+EXTRA_DIST = config.links
+DISTCLEANFILES = mpi-asm-defs.h \
+                 mpih-add1.S mpih-add1.c mpih-mul1.S mpih-mul1.c \
+                mpih-mul2.S mpih-mul2.c mpih-mul3.S mpih-mul3.c \
+                mpih-lshift.S mpih-lshift.c mpih-rshift.S mpih-rshift.c \
+                mpih-sub1.S mpih-sub1.c asm-syntax.h sysdep.h
+
+
+# Note: we only use .S files so we should delete all left over .s
+CLEANFILES = _*.s
+noinst_LIBRARIES = libmpi.a
+
+# libmpi_a_LDFLAGS =
+libmpi_a_SOURCES = longlong.h    \
+             mpi-add.c      \
+             mpi-bit.c      \
+             mpi-cmp.c      \
+             mpi-div.c      \
+             mpi-gcd.c      \
+             mpi-internal.h \
+             mpi-inline.h   \
+             mpi-inline.c   \
+             mpi-inv.c      \
+             mpi-mul.c      \
+             mpi-pow.c      \
+             mpi-mpow.c     \
+             mpi-scan.c     \
+             mpicoder.c     \
+             mpih-cmp.c     \
+             mpih-div.c     \
+             mpih-mul.c     \
+             mpiutil.c
+
+
+# Note this objects are actually links, the sourcefiles are
+# distributed by special code in dist-hook
+common_asm_objects = mpih-mul1.o    \
+                    mpih-mul2.o    \
+                    mpih-mul3.o    \
+                    mpih-add1.o    \
+                    mpih-sub1.o    \
+                    mpih-lshift.o  \
+                    mpih-rshift.o
+
+libmpi_a_DEPENDENCIES = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
+libmpi_a_LIBADD = $(common_asm_objects) @MPI_EXTRA_ASM_OBJS@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  mpi/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  mpi/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libmpi.a: $(libmpi_a_OBJECTS) $(libmpi_a_DEPENDENCIES) 
+       -rm -f libmpi.a
+       $(libmpi_a_AR) libmpi.a $(libmpi_a_OBJECTS) $(libmpi_a_LIBADD)
+       $(RANLIB) libmpi.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-add.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-bit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-cmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-div.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-gcd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-inline.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-inv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-mpow.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-mul.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-pow.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpi-scan.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpicoder.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpih-cmp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpih-div.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpih-mul.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpiutil.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+       -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+
+# cancel the default rules used by libtool which do not really
+# work and add one to cpp .S files
+.S.o:
+        $(CPP) $(INCLUDES) $(DEFS) $< | grep -v '^#' > _$*.s
+        $(COMPILE) $(AM_CCASFLAGS) -c _$*.s
+        mv -f _$*.o $*.o
+
+.S.lo:
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/mpi/alpha/README b/mpi/alpha/README
new file mode 100644 (file)
index 0000000..55c0a29
--- /dev/null
@@ -0,0 +1,53 @@
+This directory contains mpn functions optimized for DEC Alpha processors.
+
+RELEVANT OPTIMIZATION ISSUES
+
+EV4
+
+1. This chip has very limited store bandwidth.  The on-chip L1 cache is
+write-through, and a cache line is transfered from the store buffer to the
+off-chip L2 in as much 15 cycles on most systems.  This delay hurts
+mpn_add_n, mpn_sub_n, mpn_lshift, and mpn_rshift.
+
+2. Pairing is possible between memory instructions and integer arithmetic
+instructions.
+
+3. mulq and umulh is documented to have a latency of 23 cycles, but 2 of
+these cycles are pipelined.  Thus, multiply instructions can be issued at a
+rate of one each 21nd cycle.
+
+EV5
+
+1. The memory bandwidth of this chip seems excellent, both for loads and
+stores.  Even when the working set is larger than the on-chip L1 and L2
+caches, the perfromance remain almost unaffected.
+
+2. mulq has a measured latency of 13 cycles and an issue rate of 1 each 8th
+cycle.  umulh has a measured latency of 15 cycles and an issue rate of 1
+each 10th cycle.  But the exact timing is somewhat confusing.
+
+3. mpn_add_n.  With 4-fold unrolling, we need 37 instructions, whereof 12
+   are memory operations.  This will take at least
+       ceil(37/2) [dual issue] + 1 [taken branch] = 20 cycles
+   We have 12 memory cycles, plus 4 after-store conflict cycles, or 16 data
+   cache cycles, which should be completely hidden in the 20 issue cycles.
+   The computation is inherently serial, with these dependencies:
+     addq
+     /   \
+   addq  cmpult
+     |     |
+   cmpult  |
+       \  /
+        or
+   I.e., there is a 4 cycle path for each limb, making 16 cycles the absolute
+   minimum.  We could replace the `or' with a cmoveq/cmovne, which would save
+   a cycle on EV5, but that might waste a cycle on EV4.  Also, cmov takes 2
+   cycles.
+     addq
+     /   \
+   addq  cmpult
+     |      \
+   cmpult -> cmovne
+
+STATUS
+
diff --git a/mpi/alpha/distfiles b/mpi/alpha/distfiles
new file mode 100644 (file)
index 0000000..f2ab9fc
--- /dev/null
@@ -0,0 +1,11 @@
+README
+mpih-add1.S
+mpih-sub1.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-lshift.S
+mpih-rshift.S
+
+udiv-qrnnd.S
+
diff --git a/mpi/alpha/mpih-add1.S b/mpi/alpha/mpih-add1.S
new file mode 100644 (file)
index 0000000..6ea8e38
--- /dev/null
@@ -0,0 +1,125 @@
+/* alpha  add_n -- Add two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ * Copyright (C) 1995, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  ($16)
+ *                mpi_ptr_t s1_ptr,    ($17)
+ *                mpi_ptr_t s2_ptr,    ($18)
+ *                mpi_size_t size)     ($19)
+ */
+
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_add_n
+       .ent    mpihelp_add_n
+mpihelp_add_n:
+       .frame  $30,0,$26,0
+
+       ldq     $3,0($17)
+       ldq     $4,0($18)
+
+       subq    $19,1,$19
+       and     $19,4-1,$2      # number of limbs in first loop
+       bis     $31,$31,$0
+       beq     $2,.L0          # if multiple of 4 limbs, skip first loop
+
+       subq    $19,$2,$19
+
+.Loop0: subq   $2,1,$2
+       ldq     $5,8($17)
+       addq    $4,$0,$4
+       ldq     $6,8($18)
+       cmpult  $4,$0,$1
+       addq    $3,$4,$4
+       cmpult  $4,$3,$0
+       stq     $4,0($16)
+       or      $0,$1,$0
+
+       addq    $17,8,$17
+       addq    $18,8,$18
+       bis     $5,$5,$3
+       bis     $6,$6,$4
+       addq    $16,8,$16
+       bne     $2,.Loop0
+
+.L0:   beq     $19,.Lend
+
+       .align  3
+.Loop: subq    $19,4,$19
+
+       ldq     $5,8($17)
+       addq    $4,$0,$4
+       ldq     $6,8($18)
+       cmpult  $4,$0,$1
+       addq    $3,$4,$4
+       cmpult  $4,$3,$0
+       stq     $4,0($16)
+       or      $0,$1,$0
+
+       ldq     $3,16($17)
+       addq    $6,$0,$6
+       ldq     $4,16($18)
+       cmpult  $6,$0,$1
+       addq    $5,$6,$6
+       cmpult  $6,$5,$0
+       stq     $6,8($16)
+       or      $0,$1,$0
+
+       ldq     $5,24($17)
+       addq    $4,$0,$4
+       ldq     $6,24($18)
+       cmpult  $4,$0,$1
+       addq    $3,$4,$4
+       cmpult  $4,$3,$0
+       stq     $4,16($16)
+       or      $0,$1,$0
+
+       ldq     $3,32($17)
+       addq    $6,$0,$6
+       ldq     $4,32($18)
+       cmpult  $6,$0,$1
+       addq    $5,$6,$6
+       cmpult  $6,$5,$0
+       stq     $6,24($16)
+       or      $0,$1,$0
+
+       addq    $17,32,$17
+       addq    $18,32,$18
+       addq    $16,32,$16
+       bne     $19,.Loop
+
+.Lend: addq    $4,$0,$4
+       cmpult  $4,$0,$1
+       addq    $3,$4,$4
+       cmpult  $4,$3,$0
+       stq     $4,0($16)
+       or      $0,$1,$0
+       ret     $31,($26),1
+
+       .end    mpihelp_add_n
+
diff --git a/mpi/alpha/mpih-lshift.S b/mpi/alpha/mpih-lshift.S
new file mode 100644 (file)
index 0000000..45919f5
--- /dev/null
@@ -0,0 +1,124 @@
+/* alpha - left shift
+ *
+ *      Copyright (C) 1994, 1995, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (r16)
+ *                mpi_ptr_t up,        (r17)
+ *                mpi_size_t usize,    (r18)
+ *                unsigned cnt)        (r19)
+ *
+ * This code runs at 4.8 cycles/limb on the 21064.  With infinite unrolling,
+ * it would take 4 cycles/limb.  It should be possible to get down to 3
+ * cycles/limb since both ldq and stq can be paired with the other used
+ * instructions.  But there are many restrictions in the 21064 pipeline that
+ * makes it hard, if not impossible, to get down to 3 cycles/limb:
+ *
+ * 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
+ * 2. Only aligned instruction pairs can be paired.
+ * 3. The store buffer or silo might not be able to deal with the bandwidth.
+ */
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_lshift
+       .ent    mpihelp_lshift
+mpihelp_lshift:
+       .frame  $30,0,$26,0
+
+       s8addq  $18,$17,$17     # make r17 point at end of s1
+       ldq     $4,-8($17)      # load first limb
+       subq    $17,8,$17
+       subq    $31,$19,$7
+       s8addq  $18,$16,$16     # make r16 point at end of RES
+       subq    $18,1,$18
+       and     $18,4-1,$20     # number of limbs in first loop
+       srl     $4,$7,$0        # compute function result
+
+       beq     $20,.L0
+       subq    $18,$20,$18
+
+       .align  3
+.Loop0:
+       ldq     $3,-8($17)
+       subq    $16,8,$16
+       subq    $17,8,$17
+       subq    $20,1,$20
+       sll     $4,$19,$5
+       srl     $3,$7,$6
+       bis     $3,$3,$4
+       bis     $5,$6,$8
+       stq     $8,0($16)
+       bne     $20,.Loop0
+
+.L0:   beq     $18,.Lend
+
+       .align  3
+.Loop: ldq     $3,-8($17)
+       subq    $16,32,$16
+       subq    $18,4,$18
+       sll     $4,$19,$5
+       srl     $3,$7,$6
+
+       ldq     $4,-16($17)
+       sll     $3,$19,$1
+       bis     $5,$6,$8
+       stq     $8,24($16)
+       srl     $4,$7,$2
+
+       ldq     $3,-24($17)
+       sll     $4,$19,$5
+       bis     $1,$2,$8
+       stq     $8,16($16)
+       srl     $3,$7,$6
+
+       ldq     $4,-32($17)
+       sll     $3,$19,$1
+       bis     $5,$6,$8
+       stq     $8,8($16)
+       srl     $4,$7,$2
+
+       subq    $17,32,$17
+       bis     $1,$2,$8
+       stq     $8,0($16)
+
+       bgt     $18,.Loop
+
+.Lend: sll     $4,$19,$8
+       stq     $8,-8($16)
+       ret     $31,($26),1
+       .end    mpihelp_lshift
+
+
diff --git a/mpi/alpha/mpih-mul1.S b/mpi/alpha/mpih-mul1.S
new file mode 100644 (file)
index 0000000..65b2d5c
--- /dev/null
@@ -0,0 +1,91 @@
+/* Alpha 21064 mpih-mul1.S -- Multiply a limb vector with a limb and store
+ *                           the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+                      2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (r16)
+ *               mpi_ptr_t s1_ptr,     (r17)
+ *               mpi_size_t s1_size,   (r18)
+ *               mpi_limb_t s2_limb)   (r19)
+ *
+ * This code runs at 42 cycles/limb on the EV4 and 18 cycles/limb on the EV5.
+ *
+ * To improve performance for long multiplications, we would use
+ * 'fetch' for S1 and 'fetch_m' for RES.  It's not obvious how to use
+ * these instructions without slowing down the general code: 1. We can
+ * only have two prefetches in operation at any time in the Alpha
+ * architecture.  2. There will seldom be any special alignment
+ * between RES_PTR and S1_PTR. Maybe we can simply divide the current
+ * loop into an inner and outer loop, having the inner loop handle
+ * exactly one prefetch block?
+ */
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_mul_1
+       .ent    mpihelp_mul_1 2
+mpihelp_mul_1:
+       .frame  $30,0,$26
+
+       ldq     $2,0($17)       # $2 = s1_limb
+       subq    $18,1,$18       # size--
+       mulq    $2,$19,$3       # $3 = prod_low
+       bic     $31,$31,$4      # clear cy_limb
+       umulh   $2,$19,$0       # $0 = prod_high
+       beq     $18,Lend1       # jump if size was == 1
+       ldq     $2,8($17)       # $2 = s1_limb
+       subq    $18,1,$18       # size--
+       stq     $3,0($16)
+       beq     $18,Lend2       # jump if size was == 2
+
+       .align  3
+Loop:  mulq    $2,$19,$3       # $3 = prod_low
+       addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
+       subq    $18,1,$18       # size--
+       umulh   $2,$19,$4       # $4 = cy_limb
+       ldq     $2,16($17)      # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       addq    $3,$0,$3        # $3 = cy_limb + prod_low
+       stq     $3,8($16)
+       cmpult  $3,$0,$0        # $0 = carry from (cy_limb + prod_low)
+       addq    $16,8,$16       # res_ptr++
+       bne     $18,Loop
+
+Lend2: mulq    $2,$19,$3       # $3 = prod_low
+       addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
+       umulh   $2,$19,$4       # $4 = cy_limb
+       addq    $3,$0,$3        # $3 = cy_limb + prod_low
+       cmpult  $3,$0,$0        # $0 = carry from (cy_limb + prod_low)
+       stq     $3,8($16)
+       addq    $4,$0,$0        # cy_limb = prod_high + cy
+       ret     $31,($26),1
+Lend1: stq     $3,0($16)
+       ret     $31,($26),1
+
+       .end    mpihelp_mul_1
+
+
diff --git a/mpi/alpha/mpih-mul2.S b/mpi/alpha/mpih-mul2.S
new file mode 100644 (file)
index 0000000..e62ceb9
--- /dev/null
@@ -0,0 +1,98 @@
+/* Alpha 21064 addmul_1 -- Multiply a limb vector with a limb and add
+ *                        the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r16)
+ *                  mpi_ptr_t s1_ptr,       (r17)
+ *                  mpi_size_t s1_size,     (r18)
+ *                  mpi_limb_t s2_limb)     (r19)
+ *
+ * This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
+ */
+
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_addmul_1
+       .ent    mpihelp_addmul_1 2
+mpihelp_addmul_1:
+       .frame  $30,0,$26
+
+       ldq     $2,0($17)       # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       subq    $18,1,$18       # size--
+       mulq    $2,$19,$3       # $3 = prod_low
+       ldq     $5,0($16)       # $5 = *res_ptr
+       umulh   $2,$19,$0       # $0 = prod_high
+       beq     $18,.Lend1      # jump if size was == 1
+       ldq     $2,0($17)       # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       subq    $18,1,$18       # size--
+       addq    $5,$3,$3
+       cmpult  $3,$5,$4
+       stq     $3,0($16)
+       addq    $16,8,$16       # res_ptr++
+       beq     $18,.Lend2      # jump if size was == 2
+
+       .align  3
+.Loop: mulq    $2,$19,$3       # $3 = prod_low
+       ldq     $5,0($16)       # $5 = *res_ptr
+       addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
+       subq    $18,1,$18       # size--
+       umulh   $2,$19,$4       # $4 = cy_limb
+       ldq     $2,0($17)       # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       addq    $3,$0,$3        # $3 = cy_limb + prod_low
+       cmpult  $3,$0,$0        # $0 = carry from (cy_limb + prod_low)
+       addq    $5,$3,$3
+       cmpult  $3,$5,$5
+       stq     $3,0($16)
+       addq    $16,8,$16       # res_ptr++
+       addq    $5,$0,$0        # combine carries
+       bne     $18,.Loop
+
+.Lend2: mulq   $2,$19,$3       # $3 = prod_low
+       ldq     $5,0($16)       # $5 = *res_ptr
+       addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
+       umulh   $2,$19,$4       # $4 = cy_limb
+       addq    $3,$0,$3        # $3 = cy_limb + prod_low
+       cmpult  $3,$0,$0        # $0 = carry from (cy_limb + prod_low)
+       addq    $5,$3,$3
+       cmpult  $3,$5,$5
+       stq     $3,0($16)
+       addq    $5,$0,$0        # combine carries
+       addq    $4,$0,$0        # cy_limb = prod_high + cy
+       ret     $31,($26),1
+.Lend1: addq   $5,$3,$3
+       cmpult  $3,$5,$5
+       stq     $3,0($16)
+       addq    $0,$5,$0
+       ret     $31,($26),1
+
+       .end    mpihelp_addmul_1
+
diff --git a/mpi/alpha/mpih-mul3.S b/mpi/alpha/mpih-mul3.S
new file mode 100644 (file)
index 0000000..de8b083
--- /dev/null
@@ -0,0 +1,96 @@
+/* Alpha 21064 submul_1 -- Multiply a limb vector with a limb and
+ *                         subtract the result from a second limb vector.
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (r16   )
+ *                  mpi_ptr_t s1_ptr,       (r17   )
+ *                  mpi_size_t s1_size,     (r18   )
+ *                  mpi_limb_t s2_limb)     (r19   )
+ *
+ * This code runs at 42 cycles/limb on EV4 and 18 cycles/limb on EV5.
+ */
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_submul_1
+       .ent    mpihelp_submul_1 2
+mpihelp_submul_1:
+       .frame  $30,0,$26
+
+       ldq     $2,0($17)       # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       subq    $18,1,$18       # size--
+       mulq    $2,$19,$3       # $3 = prod_low
+       ldq     $5,0($16)       # $5 = *res_ptr
+       umulh   $2,$19,$0       # $0 = prod_high
+       beq     $18,.Lend1      # jump if size was == 1
+       ldq     $2,0($17)       # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       subq    $18,1,$18       # size--
+       subq    $5,$3,$3
+       cmpult  $5,$3,$4
+       stq     $3,0($16)
+       addq    $16,8,$16       # res_ptr++
+       beq     $18,.Lend2      # jump if size was == 2
+
+       .align  3
+.Loop: mulq    $2,$19,$3       # $3 = prod_low
+       ldq     $5,0($16)       # $5 = *res_ptr
+       addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
+       subq    $18,1,$18       # size--
+       umulh   $2,$19,$4       # $4 = cy_limb
+       ldq     $2,0($17)       # $2 = s1_limb
+       addq    $17,8,$17       # s1_ptr++
+       addq    $3,$0,$3        # $3 = cy_limb + prod_low
+       cmpult  $3,$0,$0        # $0 = carry from (cy_limb + prod_low)
+       subq    $5,$3,$3
+       cmpult  $5,$3,$5
+       stq     $3,0($16)
+       addq    $16,8,$16       # res_ptr++
+       addq    $5,$0,$0        # combine carries
+       bne     $18,.Loop
+
+.Lend2: mulq   $2,$19,$3       # $3 = prod_low
+       ldq     $5,0($16)       # $5 = *res_ptr
+       addq    $4,$0,$0        # cy_limb = cy_limb + 'cy'
+       umulh   $2,$19,$4       # $4 = cy_limb
+       addq    $3,$0,$3        # $3 = cy_limb + prod_low
+       cmpult  $3,$0,$0        # $0 = carry from (cy_limb + prod_low)
+       subq    $5,$3,$3
+       cmpult  $5,$3,$5
+       stq     $3,0($16)
+       addq    $5,$0,$0        # combine carries
+       addq    $4,$0,$0        # cy_limb = prod_high + cy
+       ret     $31,($26),1
+.Lend1: subq   $5,$3,$3
+       cmpult  $5,$3,$5
+       stq     $3,0($16)
+       addq    $0,$5,$0
+       ret     $31,($26),1
+
+       .end    mpihelp_submul_1
+
diff --git a/mpi/alpha/mpih-rshift.S b/mpi/alpha/mpih-rshift.S
new file mode 100644 (file)
index 0000000..242d2b6
--- /dev/null
@@ -0,0 +1,121 @@
+/* alpha    rshift
+ *      Copyright (C) 1994, 1995, 1998, 1999,
+ *                    2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (r16)
+ *                mpi_ptr_t up,        (r17)
+ *                mpi_size_t usize,    (r18)
+ *                unsigned cnt)        (r19)
+ *
+ * This code runs at 4.8 cycles/limb on the 21064.  With infinite unrolling,
+ * it would take 4 cycles/limb.  It should be possible to get down to 3
+ * cycles/limb since both ldq and stq can be paired with the other used
+ * instructions.  But there are many restrictions in the 21064 pipeline that
+ * makes it hard, if not impossible, to get down to 3 cycles/limb:
+ *
+ * 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay.
+ * 2. Only aligned instruction pairs can be paired.
+ * 3. The store buffer or silo might not be able to deal with the bandwidth.
+ */
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_rshift
+       .ent    mpihelp_rshift
+mpihelp_rshift:
+       .frame  $30,0,$26,0
+
+       ldq     $4,0($17)       # load first limb
+       addq    $17,8,$17
+       subq    $31,$19,$7
+       subq    $18,1,$18
+       and     $18,4-1,$20     # number of limbs in first loop
+       sll     $4,$7,$0        # compute function result
+
+       beq     $20,.R0
+       subq    $18,$20,$18
+
+       .align  3
+.Roop0:
+       ldq     $3,0($17)
+       addq    $16,8,$16
+       addq    $17,8,$17
+       subq    $20,1,$20
+       srl     $4,$19,$5
+       sll     $3,$7,$6
+       bis     $3,$3,$4
+       bis     $5,$6,$8
+       stq     $8,-8($16)
+       bne     $20,.Roop0
+
+.R0:   beq     $18,.Rend
+
+       .align  3
+.Roop: ldq     $3,0($17)
+       addq    $16,32,$16
+       subq    $18,4,$18
+       srl     $4,$19,$5
+       sll     $3,$7,$6
+
+       ldq     $4,8($17)
+       srl     $3,$19,$1
+       bis     $5,$6,$8
+       stq     $8,-32($16)
+       sll     $4,$7,$2
+
+       ldq     $3,16($17)
+       srl     $4,$19,$5
+       bis     $1,$2,$8
+       stq     $8,-24($16)
+       sll     $3,$7,$6
+
+       ldq     $4,24($17)
+       srl     $3,$19,$1
+       bis     $5,$6,$8
+       stq     $8,-16($16)
+       sll     $4,$7,$2
+
+       addq    $17,32,$17
+       bis     $1,$2,$8
+       stq     $8,-8($16)
+
+       bgt     $18,.Roop
+
+.Rend: srl     $4,$19,$8
+       stq     $8,0($16)
+       ret     $31,($26),1
+       .end    mpihelp_rshift
+
diff --git a/mpi/alpha/mpih-sub1.S b/mpi/alpha/mpih-sub1.S
new file mode 100644 (file)
index 0000000..2dea14f
--- /dev/null
@@ -0,0 +1,125 @@
+/* Alpha  sub_n -- Subtract two limb vectors of the same length > 0 and
+ *               store difference in a third limb vector.
+ *      Copyright (C) 1995, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (r16)
+ *                mpi_ptr_t s1_ptr,    (r17)
+ *                mpi_ptr_t s2_ptr,    (r18)
+ *                mpi_size_t size)     (r19)
+ */
+
+       .set    noreorder
+       .set    noat
+.text
+       .align  3
+       .globl  mpihelp_sub_n
+       .ent    mpihelp_sub_n
+mpihelp_sub_n:
+       .frame  $30,0,$26,0
+
+       ldq     $3,0($17)
+       ldq     $4,0($18)
+
+       subq    $19,1,$19
+       and     $19,4-1,$2      # number of limbs in first loop
+       bis     $31,$31,$0
+       beq     $2,.L0          # if multiple of 4 limbs, skip first loop
+
+       subq    $19,$2,$19
+
+.Loop0: subq   $2,1,$2
+       ldq     $5,8($17)
+       addq    $4,$0,$4
+       ldq     $6,8($18)
+       cmpult  $4,$0,$1
+       subq    $3,$4,$4
+       cmpult  $3,$4,$0
+       stq     $4,0($16)
+       or      $0,$1,$0
+
+       addq    $17,8,$17
+       addq    $18,8,$18
+       bis     $5,$5,$3
+       bis     $6,$6,$4
+       addq    $16,8,$16
+       bne     $2,.Loop0
+
+.L0:   beq     $19,.Lend
+
+       .align  3
+.Loop: subq    $19,4,$19
+
+       ldq     $5,8($17)
+       addq    $4,$0,$4
+       ldq     $6,8($18)
+       cmpult  $4,$0,$1
+       subq    $3,$4,$4
+       cmpult  $3,$4,$0
+       stq     $4,0($16)
+       or      $0,$1,$0
+
+       ldq     $3,16($17)
+       addq    $6,$0,$6
+       ldq     $4,16($18)
+       cmpult  $6,$0,$1
+       subq    $5,$6,$6
+       cmpult  $5,$6,$0
+       stq     $6,8($16)
+       or      $0,$1,$0
+
+       ldq     $5,24($17)
+       addq    $4,$0,$4
+       ldq     $6,24($18)
+       cmpult  $4,$0,$1
+       subq    $3,$4,$4
+       cmpult  $3,$4,$0
+       stq     $4,16($16)
+       or      $0,$1,$0
+
+       ldq     $3,32($17)
+       addq    $6,$0,$6
+       ldq     $4,32($18)
+       cmpult  $6,$0,$1
+       subq    $5,$6,$6
+       cmpult  $5,$6,$0
+       stq     $6,24($16)
+       or      $0,$1,$0
+
+       addq    $17,32,$17
+       addq    $18,32,$18
+       addq    $16,32,$16
+       bne     $19,.Loop
+
+.Lend: addq    $4,$0,$4
+       cmpult  $4,$0,$1
+       subq    $3,$4,$4
+       cmpult  $3,$4,$0
+       stq     $4,0($16)
+       or      $0,$1,$0
+       ret     $31,($26),1
+
+       .end    mpihelp_sub_n
+
+
diff --git a/mpi/alpha/udiv-qrnnd.S b/mpi/alpha/udiv-qrnnd.S
new file mode 100644 (file)
index 0000000..d715908
--- /dev/null
@@ -0,0 +1,162 @@
+/* Alpha 21064 __udiv_qrnnd
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+       .set noreorder
+       .set noat
+.text
+       .align  3
+       .globl  __udiv_qrnnd
+       .ent    __udiv_qrnnd
+__udiv_qrnnd:
+       .frame $30,0,$26,0
+       .prologue 0
+#define cnt    $2
+#define tmp    $3
+#define rem_ptr $16
+#define n1     $17
+#define n0     $18
+#define d      $19
+#define qb     $20
+
+       ldiq    cnt,16
+       blt     d,.Largedivisor
+
+.Loop1: cmplt  n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  d,n1,qb
+       subq    n1,d,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       subq    cnt,1,cnt
+       bgt     cnt,.Loop1
+       stq     n1,0(rem_ptr)
+       bis     $31,n0,$0
+       ret     $31,($26),1
+
+.Largedivisor:
+       and     n0,1,$4
+
+       srl     n0,1,n0
+       sll     n1,63,tmp
+       or      tmp,n0,n0
+       srl     n1,1,n1
+
+       and     d,1,$6
+       srl     d,1,$5
+       addq    $5,$6,$5
+
+.Loop2: cmplt  n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       cmplt   n0,0,tmp
+       addq    n1,n1,n1
+       bis     n1,tmp,n1
+       addq    n0,n0,n0
+       cmpule  $5,n1,qb
+       subq    n1,$5,tmp
+       cmovne  qb,tmp,n1
+       bis     n0,qb,n0
+       subq    cnt,1,cnt
+       bgt     cnt,.Loop2
+
+       addq    n1,n1,n1
+       addq    $4,n1,n1
+       bne     $6,.LOdd
+       stq     n1,0(rem_ptr)
+       bis     $31,n0,$0
+       ret     $31,($26),1
+
+.LOdd:
+       /* q' in n0. r' in n1 */
+       addq    n1,n0,n1
+       cmpult  n1,n0,tmp       # tmp := carry from addq
+       beq     tmp,.LLp6
+       addq    n0,1,n0
+       subq    n1,d,n1
+.LLp6: cmpult  n1,d,tmp
+       bne     tmp,.LLp7
+       addq    n0,1,n0
+       subq    n1,d,n1
+.LLp7:
+       stq     n1,0(rem_ptr)
+       bis     $31,n0,$0
+       ret     $31,($26),1
+
+       .end    __udiv_qrnnd
diff --git a/mpi/config.links b/mpi/config.links
new file mode 100644 (file)
index 0000000..451a5bf
--- /dev/null
@@ -0,0 +1,328 @@
+# config.links - helper for ../configure
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
+#               2004 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# sourced by ../configure to get the list of files to link
+# this should set $mpi_ln_list.
+# Note: this is called from the above directory.
+
+
+mpi_extra_modules=
+mpi_sflags=
+
+test -d ./mpi || mkdir ./mpi
+
+echo '/* created by config.links - do not edit */' >./mpi/asm-syntax.h
+echo "/* Host: ${host} */" >>./mpi/asm-syntax.h
+
+if test "$try_asm_modules" = "yes" ; then
+case "${host}" in
+    powerpc-apple-darwin*          | \
+    i[34567]86*-*-openbsd[12]*     | \
+    i[34567]86*-*-openbsd3.[0123]*)
+       echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
+       path=""
+       ;;
+    i[3467]86*-*-openbsd*      | \
+    i[3467]86*-*-freebsd*-elf  | \
+    i[3467]86*-*-freebsd[3-9]* | \
+    i[3467]86*-*-freebsdelf*   | \
+    i[3467]86*-*-netbsd*       | \
+    i[3467]86*-*-k*bsd*)
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h     >>./mpi/asm-syntax.h
+       path="i386"
+       ;;
+    i586*-*-openbsd*       | \
+    i586*-*-freebsd*-elf   | \
+    i586*-*-freebsd[3-9]*  | \
+    i586*-*-freebsdelf*    | \
+    i586*-*-netbsd*       | \
+    i586*-*-k*bsd*        | \
+    pentium-*-netbsd*     | \
+    pentiumpro-*-netbsd*)
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h     >>./mpi/asm-syntax.h
+       path="i586 i386"
+       ;;
+    i[34]86*-*-bsdi4*)
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h   >>./mpi/asm-syntax.h
+       path="i386"
+       ;;
+    i[3467]86*-*-linuxaout*  | \
+    i[3467]86*-*-linuxoldld* | \
+    i[3467]86*-*-*bsd*)
+       echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
+       echo '#define X86_BROKEN_ALIGN' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       path="i386"
+       ;;
+    i586*-*-linuxaout*  | \
+    i586*-*-linuxoldld* | \
+    i586*-*-*bsd*)
+       echo '#define BSD_SYNTAX' >>./mpi/asm-syntax.h
+       echo '#define X86_BROKEN_ALIGN' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       path="i586 i386"
+       ;;
+    i[3467]86*-msdosdjgpp*)
+       echo '#define BSD_SYNTAX'        >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h   >>./mpi/asm-syntax.h
+       path="i386"
+       ;;
+    i586*-msdosdjgpp*)
+       echo '#define BSD_SYNTAX'        >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h   >>./mpi/asm-syntax.h
+       path="i586 i386"
+       ;;
+    i[3467]86*-*-*)
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       path="i386"
+       ;;
+    i586*-*-*  | \
+    pentium-*-*   | \
+    pentiumpro-*-*)
+       echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/i386/syntax.h      >>./mpi/asm-syntax.h
+       path="i586 i386"
+       ;;
+    alpha*-*-*)
+       echo '/* configured for alpha */' >>./mpi/asm-syntax.h
+       path="alpha"
+       mpi_extra_modules="udiv-qrnnd"
+       ;;
+    hppa7000*-*-*)
+       echo '/* configured for HPPA (pa7000) */' >>./mpi/asm-syntax.h
+       path="hppa1.1 hppa"
+       mpi_extra_modules="udiv-qrnnd"
+       ;;
+    hppa1.0*-*-*)
+       echo '/* configured for HPPA 1.0 */' >>./mpi/asm-syntax.h
+       path="hppa"
+       mpi_extra_modules="udiv-qrnnd"
+       ;;
+    hppa*-*-*) # assume pa7100
+       echo '/* configured for HPPA (pa7100) */' >>./mpi/asm-syntax.h
+       path="pa7100 hppa1.1 hppa"
+       mpi_extra_modules="udiv-qrnnd"
+       ;;
+    sparc64-*-linux-gnu)
+       # An extra rule because we have an report for this one only.
+       # Should be compared against the next GMP version
+       echo '/* configured for sparc64-*-linux-gnu */' >>./mpi/asm-syntax.h
+       path="sparc32v8 sparc32"
+       mpi_extra_modules="udiv"
+       ;;
+    sparc64-sun-solaris2*)
+       # Got a report that udiv is missing, so we try this one
+       echo '/* configured for sparc64-sun-solaris2 */' >>./mpi/asm-syntax.h
+       path="sparc32v8 sparc32"
+       mpi_extra_modules="udiv"
+        ;;
+    sparc64-*-netbsd* | sparc64-*-freebsd* | sparc64-*-openbsd*)
+       # There are no sparc64 assembler modules that work on the
+       # *BSDs, so use the generic C functions.
+       echo '/* No working assembler modules available */' >>./mpi/asm-syntax.h
+       path=""
+       ;;
+    sparc9*-*-*     | \
+    sparc64*-*-*    | \
+    ultrasparc*-*-* )
+       echo '/* configured for sparc9 or higher */' >>./mpi/asm-syntax.h
+       path="sparc32v8 sparc32"
+       ;;
+    sparc8*-*-*     | \
+    microsparc*-*-*)
+       echo '/* configured for sparc8 */' >>./mpi/asm-syntax.h
+       path="sparc32v8 sparc32"
+       ;;
+    supersparc*-*-*)
+       echo '/* configured for supersparc */' >>./mpi/asm-syntax.h
+       path="supersparc sparc32v8 sparc32"
+       mpi_extra_modules="udiv"
+       ;;
+    sparc*-*-*)
+       echo '/* configured for sparc */' >>./mpi/asm-syntax.h
+       path="sparc32"
+       mpi_extra_modules="udiv"
+       ;;
+    mips[34]*-*-* | \
+    mips*-*-irix6*)
+       echo '/* configured for MIPS3 */' >>./mpi/asm-syntax.h
+       path="mips3"
+       ;;
+    mips*-*-*)
+       echo '/* configured for MIPS2 */' >>./mpi/asm-syntax.h
+       path="mips2"
+       ;;
+
+    # Motorola 68k configurations.  Let m68k mean 68020-68040.
+    # mc68000 or mc68060 configurations need to be specified explicitly
+    m680[234]0*-*-linuxaout* | \
+    m68k*-*-linuxaout*)
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       path="m68k/mc68020 m68k"
+       ;;
+    m68060*-*-linuxaout*)
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       path="m68k"
+       ;;
+    m680[234]0*-*-linux* | \
+    m68k*-*-linux*)
+       echo '#define ELF_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       ;;
+    m68060*-*-linux*)
+       echo '#define ELF_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       path="m68k"
+       ;;
+    m68k-atari-mint)
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       path="m68k/mc68020 m68k"
+       ;;
+    m68000*-*-* | \
+    m68060*-*-*)
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       path="m68k/mc68000"
+       ;;
+    m680[234]0*-*-* | \
+    m68k*-*-*)
+       echo '#define MIT_SYNTAX'           >>./mpi/asm-syntax.h
+       cat  $srcdir/mpi/m68k/syntax.h      >>./mpi/asm-syntax.h
+       path="m68k/mc68020 m68k"
+       ;;
+
+    powerpc*-*-linux*)
+       echo '/* configured for powerpc/ELF */' >>./mpi/asm-syntax.h
+       echo '#define ELF_SYNTAX'               >>./mpi/asm-syntax.h
+       cat   $srcdir/mpi/powerpc32/syntax.h    >>./mpi/asm-syntax.h
+       path="powerpc32"
+       ;;
+
+    powerpc*-*-netbsd* | powerpc*-*-openbsd*)
+       echo '/* configured for {Open,Net}BSD on powerpc */' >>./mpi/asm-syntax.h
+       echo '#define ELF_SYNTAX'                 >>./mpi/asm-syntax.h
+       cat   $srcdir/mpi/powerpc32/syntax.h     >>./mpi/asm-syntax.h
+       mpi_sflags="-Wa,-mppc"
+       path="powerpc32"
+       ;;
+
+    rs6000-*-aix[456789]*    | \
+    rs6000-*-aix3.2.[456789])
+       mpi_sflags="-Wa,-mpwr"
+       path="power"
+       mpi_extra_modules="udiv-w-sdiv"
+       ;;
+    rs6000-*-* | \
+    power-*-*  | \
+    power2-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="power"
+       mpi_extra_modules="udiv-w-sdiv"
+       ;;
+    powerpc-ibm-aix4.2.* )
+       # I am not sure about this one but a machine identified by
+       # powerpc-ibm-aix4.2.1.0 cannot use the powerpc32 code.
+       mpi_sflags="-Wa,-mpwr"
+       path="power"
+       mpi_extra_modules="udiv-w-sdiv"
+       ;;
+    ppc601-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="power powerpc32"
+       ;;
+    ppc60[234]*-*-* | \
+    powerpc*-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="powerpc32"
+       ;;
+    ppc620-*-*     | \
+    powerpc64*-*-*)
+       mpi_sflags="-Wa,-mppc"
+       path="powerpc64"
+       ;;
+
+    *)
+       echo '/* No assembler modules configured */' >>./mpi/asm-syntax.h
+       path=""
+       ;;
+esac
+else
+    echo '/* Assembler modules disabled on request */' >>./mpi/asm-syntax.h
+    path=""
+fi
+
+
+# Make sysdep.h
+echo '/* created by config.links - do not edit */' >./mpi/sysdep.h
+if test x$ac_cv_sys_symbol_underscore = xyes; then
+    cat <<EOF >>./mpi/sysdep.h
+#if __STDC__
+#define C_SYMBOL_NAME(name) _##name
+#else
+#define C_SYMBOL_NAME(name) _/**/name
+#endif
+EOF
+else
+    cat <<EOF >>./mpi/sysdep.h
+#define C_SYMBOL_NAME(name) name
+EOF
+fi
+
+
+# fixme: grep these modules from Makefile.in
+mpi_ln_modules="${mpi_extra_modules} mpih-add1 mpih-mul1 mpih-mul2 mpih-mul3 \
+                mpih-lshift mpih-rshift mpih-sub1"
+
+mpi_ln_objects=
+mpi_ln_list=
+
+# try to get file to link from the assembler subdirectory and
+# if this fails get it from the generic subdirectory.
+path="$path generic"
+for fn in $mpi_ln_modules ; do
+    mpi_ln_objects="$mpi_ln_objects $fn.o"
+    for dir in $path ; do
+       rm -f $srcdir/mpi/$fn.[Sc]
+       if test -f $srcdir/mpi/$dir/$fn.S ; then
+            mpi_ln_list="$mpi_ln_list mpi/$fn.S:mpi/$dir/$fn.S"
+           break;
+       elif test -f $srcdir/mpi/$dir/$fn.c ; then
+            mpi_ln_list="$mpi_ln_list mpi/$fn.c:mpi/$dir/$fn.c"
+           break;
+       fi
+    done
+done
+
+# Same thing for the file which defines the limb size
+path="$path generic"
+for dir in $path ; do
+    rm -f $srcdir/mpi/mpi-asm-defs.h
+    if test -f $srcdir/mpi/$dir/mpi-asm-defs.h ; then
+        mpi_ln_list="$mpi_ln_list mpi/mpi-asm-defs.h:mpi/$dir/mpi-asm-defs.h"
+        break;
+    fi
+done
diff --git a/mpi/generic/distfiles b/mpi/generic/distfiles
new file mode 100644 (file)
index 0000000..649e829
--- /dev/null
@@ -0,0 +1,10 @@
+mpih-add1.c
+mpih-mul1.c
+mpih-mul2.c
+mpih-mul3.c
+mpih-lshift.c
+mpih-rshift.c
+mpih-sub1.c
+udiv-w-sdiv.c
+mpi-asm-defs.h
+
diff --git a/mpi/generic/mpi-asm-defs.h b/mpi/generic/mpi-asm-defs.h
new file mode 100644 (file)
index 0000000..13424e2
--- /dev/null
@@ -0,0 +1,10 @@
+/* This file defines some basic constants for the MPI machinery.  We
+ * need to define the types on a per-CPU basis, so it is done with
+ * this file here.  */
+#define BYTES_PER_MPI_LIMB  (SIZEOF_UNSIGNED_LONG)
+
+
+
+
+
+
diff --git a/mpi/generic/mpih-add1.c b/mpi/generic/mpih-add1.c
new file mode 100644 (file)
index 0000000..ebcd132
--- /dev/null
@@ -0,0 +1,66 @@
+/* mpihelp-add_1.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1997, 1998, 
+ *               2000 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+mpi_limb_t
+mpihelp_add_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+              mpi_ptr_t s2_ptr, mpi_size_t size)
+{
+    mpi_limb_t x, y, cy;
+    mpi_size_t j;
+
+    /* The loop counter and index J goes from -SIZE to -1.  This way
+       the loop becomes faster.  */
+    j = -size;
+
+    /* Offset the base pointers to compensate for the negative indices. */
+    s1_ptr -= j;
+    s2_ptr -= j;
+    res_ptr -= j;
+
+    cy = 0;
+    do {
+       y = s2_ptr[j];
+       x = s1_ptr[j];
+       y += cy;                  /* add previous carry to one addend */
+       cy = y < cy;              /* get out carry from that addition */
+       y += x;                   /* add other addend */
+       cy += y < x;              /* get out carry from that add, combine */
+       res_ptr[j] = y;
+    } while( ++j );
+
+    return cy;
+}
+
diff --git a/mpi/generic/mpih-lshift.c b/mpi/generic/mpih-lshift.c
new file mode 100644 (file)
index 0000000..e55cb49
--- /dev/null
@@ -0,0 +1,70 @@
+/* mpihelp-lshift.c  - MPI helper functions
+ * Copyright (C) 1994, 1996, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+
+/* Shift U (pointed to by UP and USIZE digits long) CNT bits to the left
+ * and store the USIZE least significant digits of the result at WP.
+ * Return the bits shifted out from the most significant digit.
+ *
+ * Argument constraints:
+ * 1. 0 < CNT < BITS_PER_MP_LIMB
+ * 2. If the result is to be written over the input, WP must be >= UP.
+ */
+
+mpi_limb_t
+mpihelp_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
+                                           unsigned int cnt)
+{
+    mpi_limb_t high_limb, low_limb;
+    unsigned sh_1, sh_2;
+    mpi_size_t i;
+    mpi_limb_t retval;
+
+    sh_1 = cnt;
+    wp += 1;
+    sh_2 = BITS_PER_MPI_LIMB - sh_1;
+    i = usize - 1;
+    low_limb = up[i];
+    retval = low_limb >> sh_2;
+    high_limb = low_limb;
+    while( --i >= 0 ) {
+       low_limb = up[i];
+       wp[i] = (high_limb << sh_1) | (low_limb >> sh_2);
+       high_limb = low_limb;
+    }
+    wp[i] = high_limb << sh_1;
+
+    return retval;
+}
+
+
diff --git a/mpi/generic/mpih-mul1.c b/mpi/generic/mpih-mul1.c
new file mode 100644 (file)
index 0000000..2c5c4ae
--- /dev/null
@@ -0,0 +1,62 @@
+/* mpihelp-mul_1.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1997, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+mpi_limb_t
+mpihelp_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+                                                   mpi_limb_t s2_limb)
+{
+    mpi_limb_t cy_limb;
+    mpi_size_t j;
+    mpi_limb_t prod_high, prod_low;
+
+    /* The loop counter and index J goes from -S1_SIZE to -1.  This way
+     * the loop becomes faster.  */
+    j = -s1_size;
+
+    /* Offset the base pointers to compensate for the negative indices.  */
+    s1_ptr -= j;
+    res_ptr -= j;
+
+    cy_limb = 0;
+    do {
+       umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb );
+       prod_low += cy_limb;
+       cy_limb = (prod_low < cy_limb?1:0) + prod_high;
+       res_ptr[j] = prod_low;
+    } while( ++j );
+
+    return cy_limb;
+}
+
diff --git a/mpi/generic/mpih-mul2.c b/mpi/generic/mpih-mul2.c
new file mode 100644 (file)
index 0000000..89ef6b9
--- /dev/null
@@ -0,0 +1,67 @@
+/* mpihelp-mul_2.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1997, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+mpi_limb_t
+mpihelp_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                 mpi_size_t s1_size, mpi_limb_t s2_limb)
+{
+    mpi_limb_t cy_limb;
+    mpi_size_t j;
+    mpi_limb_t prod_high, prod_low;
+    mpi_limb_t x;
+
+    /* The loop counter and index J goes from -SIZE to -1.  This way
+     * the loop becomes faster.  */
+    j = -s1_size;
+    res_ptr -= j;
+    s1_ptr -= j;
+
+    cy_limb = 0;
+    do {
+       umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb );
+
+       prod_low += cy_limb;
+       cy_limb = (prod_low < cy_limb?1:0) + prod_high;
+
+       x = res_ptr[j];
+       prod_low = x + prod_low;
+       cy_limb += prod_low < x?1:0;
+       res_ptr[j] = prod_low;
+    } while ( ++j );
+    return cy_limb;
+}
+
+
diff --git a/mpi/generic/mpih-mul3.c b/mpi/generic/mpih-mul3.c
new file mode 100644 (file)
index 0000000..ac473a0
--- /dev/null
@@ -0,0 +1,68 @@
+/* mpihelp-mul_3.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1997, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+mpi_limb_t
+mpihelp_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                 mpi_size_t s1_size, mpi_limb_t s2_limb)
+{
+    mpi_limb_t cy_limb;
+    mpi_size_t j;
+    mpi_limb_t prod_high, prod_low;
+    mpi_limb_t x;
+
+    /* The loop counter and index J goes from -SIZE to -1.  This way
+     * the loop becomes faster.  */
+    j = -s1_size;
+    res_ptr -= j;
+    s1_ptr -= j;
+
+    cy_limb = 0;
+    do {
+       umul_ppmm( prod_high, prod_low, s1_ptr[j], s2_limb);
+
+       prod_low += cy_limb;
+       cy_limb = (prod_low < cy_limb?1:0) + prod_high;
+
+       x = res_ptr[j];
+       prod_low = x - prod_low;
+       cy_limb += prod_low > x?1:0;
+       res_ptr[j] = prod_low;
+    } while( ++j );
+
+    return cy_limb;
+}
+
+
diff --git a/mpi/generic/mpih-rshift.c b/mpi/generic/mpih-rshift.c
new file mode 100644 (file)
index 0000000..7aefc59
--- /dev/null
@@ -0,0 +1,69 @@
+/* mpih-rshift.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1998, 1999,
+ *               2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+
+
+/* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right
+ * and store the USIZE least significant limbs of the result at WP.
+ * The bits shifted out to the right are returned.
+ *
+ * Argument constraints:
+ * 1. 0 < CNT < BITS_PER_MP_LIMB
+ * 2. If the result is to be written over the input, WP must be <= UP.
+ */
+
+mpi_limb_t
+mpihelp_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt)
+{
+    mpi_limb_t high_limb, low_limb;
+    unsigned sh_1, sh_2;
+    mpi_size_t i;
+    mpi_limb_t retval;
+
+    sh_1 = cnt;
+    wp -= 1;
+    sh_2 = BITS_PER_MPI_LIMB - sh_1;
+    high_limb = up[0];
+    retval = high_limb << sh_2;
+    low_limb = high_limb;
+    for( i=1; i < usize; i++) {
+       high_limb = up[i];
+       wp[i] = (low_limb >> sh_1) | (high_limb << sh_2);
+       low_limb = high_limb;
+    }
+    wp[i] = low_limb >> sh_1;
+
+    return retval;
+}
+
diff --git a/mpi/generic/mpih-sub1.c b/mpi/generic/mpih-sub1.c
new file mode 100644 (file)
index 0000000..2230457
--- /dev/null
@@ -0,0 +1,66 @@
+/* mpihelp-add_2.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1997, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+mpi_limb_t
+mpihelp_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                                 mpi_ptr_t s2_ptr, mpi_size_t size)
+{
+    mpi_limb_t x, y, cy;
+    mpi_size_t j;
+
+    /* The loop counter and index J goes from -SIZE to -1.  This way
+       the loop becomes faster.  */
+    j = -size;
+
+    /* Offset the base pointers to compensate for the negative indices.  */
+    s1_ptr -= j;
+    s2_ptr -= j;
+    res_ptr -= j;
+
+    cy = 0;
+    do {
+       y = s2_ptr[j];
+       x = s1_ptr[j];
+       y += cy;                  /* add previous carry to subtrahend */
+       cy = y < cy;              /* get out carry from that addition */
+       y = x - y;                /* main subtract */
+       cy += y > x;              /* get out carry from the subtract, combine */
+       res_ptr[j] = y;
+    } while( ++j );
+
+    return cy;
+}
+
+
diff --git a/mpi/generic/udiv-w-sdiv.c b/mpi/generic/udiv-w-sdiv.c
new file mode 100644 (file)
index 0000000..de71011
--- /dev/null
@@ -0,0 +1,134 @@
+/* mpihelp_udiv_w_sdiv -- implement udiv_qrnnd on machines with only signed
+ *                       division.
+ * Copyright (C) 1992, 1994, 1996, 1998 Free Software Foundation, Inc.
+ * Contributed by Peter L. Montgomery.
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+#if 0  /* not yet ported to MPI */
+
+mpi_limb_t
+mpihelp_udiv_w_sdiv( mpi_limp_t *rp,
+                    mpi_limp_t *a1,
+                    mpi_limp_t *a0,
+                    mpi_limp_t *d   )
+{
+  mp_limb_t q, r;
+  mp_limb_t c0, c1, b1;
+
+  if ((mpi_limb_signed_t) d >= 0)
+    {
+      if (a1 < d - a1 - (a0 >> (BITS_PER_MP_LIMB - 1)))
+       {
+         /* dividend, divisor, and quotient are nonnegative */
+         sdiv_qrnnd (q, r, a1, a0, d);
+       }
+      else
+       {
+         /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
+         sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (BITS_PER_MP_LIMB - 1));
+         /* Divide (c1*2^32 + c0) by d */
+         sdiv_qrnnd (q, r, c1, c0, d);
+         /* Add 2^31 to quotient */
+         q += (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1);
+       }
+    }
+  else
+    {
+      b1 = d >> 1;                     /* d/2, between 2^30 and 2^31 - 1 */
+      c1 = a1 >> 1;                    /* A/2 */
+      c0 = (a1 << (BITS_PER_MP_LIMB - 1)) + (a0 >> 1);
+
+      if (a1 < b1)                     /* A < 2^32*b1, so A/2 < 2^31*b1 */
+       {
+         sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
+
+         r = 2*r + (a0 & 1);           /* Remainder from A/(2*b1) */
+         if ((d & 1) != 0)
+           {
+             if (r >= q)
+               r = r - q;
+             else if (q - r <= d)
+               {
+                 r = r - q + d;
+                 q--;
+               }
+             else
+               {
+                 r = r - q + 2*d;
+                 q -= 2;
+               }
+           }
+       }
+      else if (c1 < b1)                /* So 2^31 <= (A/2)/b1 < 2^32 */
+       {
+         c1 = (b1 - 1) - c1;
+         c0 = ~c0;                     /* logical NOT */
+
+         sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
+
+         q = ~q;                       /* (A/2)/b1 */
+         r = (b1 - 1) - r;
+
+         r = 2*r + (a0 & 1);           /* A/(2*b1) */
+
+         if ((d & 1) != 0)
+           {
+             if (r >= q)
+               r = r - q;
+             else if (q - r <= d)
+               {
+                 r = r - q + d;
+                 q--;
+               }
+             else
+               {
+                 r = r - q + 2*d;
+                 q -= 2;
+               }
+           }
+       }
+      else                             /* Implies c1 = b1 */
+       {                               /* Hence a1 = d - 1 = 2*b1 - 1 */
+         if (a0 >= -d)
+           {
+             q = -1;
+             r = a0 + d;
+           }
+         else
+           {
+             q = -2;
+             r = a0 + 2*d;
+           }
+       }
+    }
+
+  *rp = r;
+  return q;
+}
+
+#endif
+
diff --git a/mpi/hppa/README b/mpi/hppa/README
new file mode 100644 (file)
index 0000000..5a2d5fd
--- /dev/null
@@ -0,0 +1,84 @@
+This directory contains mpn functions for various HP PA-RISC chips.  Code
+that runs faster on the PA7100 and later implementations, is in the pa7100
+directory.
+
+RELEVANT OPTIMIZATION ISSUES
+
+  Load and Store timing
+
+On the PA7000 no memory instructions can issue the two cycles after a store.
+For the PA7100, this is reduced to one cycle.
+
+The PA7100 has a lookup-free cache, so it helps to schedule loads and the
+dependent instruction really far from each other.
+
+STATUS
+
+1. mpn_mul_1 could be improved to 6.5 cycles/limb on the PA7100, using the
+   instructions bwlow (but some sw pipelining is needed to avoid the
+   xmpyu-fstds delay):
+
+       fldds   s1_ptr
+
+       xmpyu
+       fstds   N(%r30)
+       xmpyu
+       fstds   N(%r30)
+
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+
+       addc
+       stws    res_ptr
+       addc
+       stws    res_ptr
+
+       addib   Loop
+
+2. mpn_addmul_1 could be improved from the current 10 to 7.5 cycles/limb
+   (asymptotically) on the PA7100, using the instructions below.  With proper
+   sw pipelining and the unrolling level below, the speed becomes 8
+   cycles/limb.
+
+       fldds   s1_ptr
+       fldds   s1_ptr
+
+       xmpyu
+       fstds   N(%r30)
+       xmpyu
+       fstds   N(%r30)
+       xmpyu
+       fstds   N(%r30)
+       xmpyu
+       fstds   N(%r30)
+
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       ldws    N(%r30)
+       addc
+       addc
+       addc
+       addc
+       addc    %r0,%r0,cy-limb
+
+       ldws    res_ptr
+       ldws    res_ptr
+       ldws    res_ptr
+       ldws    res_ptr
+       add
+       stws    res_ptr
+       addc
+       stws    res_ptr
+       addc
+       stws    res_ptr
+       addc
+       stws    res_ptr
+
+       addib
diff --git a/mpi/hppa/distfiles b/mpi/hppa/distfiles
new file mode 100644 (file)
index 0000000..7f24205
--- /dev/null
@@ -0,0 +1,7 @@
+README
+udiv-qrnnd.S
+mpih-add1.S
+mpih-sub1.S
+mpih-lshift.S
+mpih-rshift.S
+
diff --git a/mpi/hppa/mpih-add1.S b/mpi/hppa/mpih-add1.S
new file mode 100644 (file)
index 0000000..fbe93ed
--- /dev/null
@@ -0,0 +1,73 @@
+/* hppa add_n -- Add two limb vectors of the same length > 0 and store
+ *              sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 Fee 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  (gr26)
+ *                mpi_ptr_t s1_ptr,    (gr25)
+ *                mpi_ptr_t s2_ptr,    (gr24)
+ *                mpi_size_t size)     (gr23)
+ *
+ * One might want to unroll this as for other processors, but it turns
+ * out that the data cache contention after a store makes such
+ * unrolling useless.  We can't come under 5 cycles/limb anyway.
+ */
+
+       .code
+       .export         mpihelp_add_n
+       .label          mpihelp_add_n
+       .proc
+       .callinfo       frame=0,no_calls
+       .entry
+
+       ldws,ma         4(0,%r25),%r20
+       ldws,ma         4(0,%r24),%r19
+
+       addib,=         -1,%r23,L$end   ; check for (SIZE == 1)
+        add            %r20,%r19,%r28  ; add first limbs ignoring cy
+
+       .label L$loop
+       ldws,ma         4(0,%r25),%r20
+       ldws,ma         4(0,%r24),%r19
+       stws,ma         %r28,4(0,%r26)
+       addib,<>        -1,%r23,L$loop
+        addc           %r20,%r19,%r28
+
+       .label L$end
+       stws            %r28,0(0,%r26)
+       bv              0(%r2)
+        addc           %r0,%r0,%r28
+
+       .exit
+       .procend
diff --git a/mpi/hppa/mpih-lshift.S b/mpi/hppa/mpih-lshift.S
new file mode 100644 (file)
index 0000000..0c4de14
--- /dev/null
@@ -0,0 +1,78 @@
+/* hppa   lshift
+ *
+ *      Copyright (C) 1992, 1994, 1998
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (gr26)
+ *                mpi_ptr_t up,        (gr25)
+ *                mpi_size_t usize,    (gr24)
+ *                unsigned cnt)        (gr23)
+ */
+
+       .code
+       .export         mpihelp_lshift
+       .label          mpihelp_lshift
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       sh2add          %r24,%r25,%r25
+       sh2add          %r24,%r26,%r26
+       ldws,mb         -4(0,%r25),%r22
+       subi            32,%r23,%r1
+       mtsar           %r1
+       addib,=         -1,%r24,L$0004
+       vshd            %r0,%r22,%r28           ; compute carry out limb
+       ldws,mb         -4(0,%r25),%r29
+       addib,=         -1,%r24,L$0002
+       vshd            %r22,%r29,%r20
+
+       .label  L$loop
+       ldws,mb         -4(0,%r25),%r22
+       stws,mb         %r20,-4(0,%r26)
+       addib,=         -1,%r24,L$0003
+       vshd            %r29,%r22,%r20
+       ldws,mb         -4(0,%r25),%r29
+       stws,mb         %r20,-4(0,%r26)
+       addib,<>        -1,%r24,L$loop
+       vshd            %r22,%r29,%r20
+
+       .label  L$0002
+       stws,mb         %r20,-4(0,%r26)
+       vshd            %r29,%r0,%r20
+       bv              0(%r2)
+       stw             %r20,-4(0,%r26)
+       .label  L$0003
+       stws,mb         %r20,-4(0,%r26)
+       .label  L$0004
+       vshd            %r22,%r0,%r20
+       bv              0(%r2)
+       stw             %r20,-4(0,%r26)
+
+       .exit
+       .procend
+
+
+
diff --git a/mpi/hppa/mpih-rshift.S b/mpi/hppa/mpih-rshift.S
new file mode 100644 (file)
index 0000000..d7e691b
--- /dev/null
@@ -0,0 +1,74 @@
+/* hppa   rshift
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (gr26)
+ *                mpi_ptr_t up,       (gr25)
+ *                mpi_size_t usize,   (gr24)
+ *                unsigned cnt)       (gr23)
+ */
+
+       .code
+       .export         mpihelp_rshift
+       .label          mpihelp_rshift
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       ldws,ma         4(0,%r25),%r22
+       mtsar           %r23
+       addib,=         -1,%r24,L$r004
+       vshd            %r22,%r0,%r28           ; compute carry out limb
+       ldws,ma         4(0,%r25),%r29
+       addib,=         -1,%r24,L$r002
+       vshd            %r29,%r22,%r20
+
+       .label  L$roop
+       ldws,ma         4(0,%r25),%r22
+       stws,ma         %r20,4(0,%r26)
+       addib,=         -1,%r24,L$r003
+       vshd            %r22,%r29,%r20
+       ldws,ma         4(0,%r25),%r29
+       stws,ma         %r20,4(0,%r26)
+       addib,<>        -1,%r24,L$roop
+       vshd            %r29,%r22,%r20
+
+       .label  L$r002
+       stws,ma         %r20,4(0,%r26)
+       vshd            %r0,%r29,%r20
+       bv              0(%r2)
+       stw             %r20,0(0,%r26)
+       .label  L$r003
+       stws,ma         %r20,4(0,%r26)
+       .label  L$r004
+       vshd            %r0,%r22,%r20
+       bv              0(%r2)
+       stw             %r20,0(0,%r26)
+
+       .exit
+       .procend
+
diff --git a/mpi/hppa/mpih-sub1.S b/mpi/hppa/mpih-sub1.S
new file mode 100644 (file)
index 0000000..c1e20d5
--- /dev/null
@@ -0,0 +1,81 @@
+/* hppa   sub_n -- Sub two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (gr26)
+ *                mpi_ptr_t s1_ptr,    (gr25)
+ *                mpi_ptr_t s2_ptr,    (gr24)
+ *                mpi_size_t size)     (gr23)
+ *
+ * One might want to unroll this as for other processors, but it turns
+ * out that the data cache contention after a store makes such
+ * unrolling useless.  We can't come under 5 cycles/limb anyway.
+ */
+
+
+       .code
+       .export         mpihelp_sub_n
+       .label          mpihelp_sub_n
+       .proc
+       .callinfo       frame=0,no_calls
+       .entry
+
+       ldws,ma         4(0,%r25),%r20
+       ldws,ma         4(0,%r24),%r19
+
+       addib,=         -1,%r23,L$end   ; check for (SIZE == 1)
+        sub            %r20,%r19,%r28  ; subtract first limbs ignoring cy
+
+       .label  L$loop
+       ldws,ma         4(0,%r25),%r20
+       ldws,ma         4(0,%r24),%r19
+       stws,ma         %r28,4(0,%r26)
+       addib,<>        -1,%r23,L$loop
+        subb           %r20,%r19,%r28
+
+       .label  L$end
+       stws            %r28,0(0,%r26)
+       addc            %r0,%r0,%r28
+       bv              0(%r2)
+        subi           1,%r28,%r28
+
+       .exit
+       .procend
+
+
+
diff --git a/mpi/hppa/udiv-qrnnd.S b/mpi/hppa/udiv-qrnnd.S
new file mode 100644 (file)
index 0000000..a2024ba
--- /dev/null
@@ -0,0 +1,299 @@
+/* HP-PA  __udiv_qrnnd division support, used from longlong.h.
+ *       This version runs fast on pre-PA7000 CPUs.
+ *
+ *      Copyright (C) 1993, 1994, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+/* INPUT PARAMETERS
+ *   rem_ptr      gr26
+ *   n1           gr25
+ *   n0           gr24
+ *   d            gr23
+ *
+ *   The code size is a bit excessive. We could merge the last two ds;addc
+ *   sequences by simply moving the "bb,< Odd" instruction down.  The only
+ *   trouble is the FFFFFFFF code that would need some hacking.
+ */
+
+       .code
+       .export         __udiv_qrnnd
+       .label          __udiv_qrnnd
+       .proc
+       .callinfo       frame=0,no_calls
+       .entry
+
+       comb,<          %r23,0,L$largedivisor
+        sub            %r0,%r23,%r1            ; clear cy as side-effect
+       ds              %r0,%r1,%r0
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r23,%r25
+       addc            %r24,%r24,%r28
+       ds              %r25,%r23,%r25
+       comclr,>=       %r25,%r0,%r0
+       addl            %r25,%r23,%r25
+       stws            %r25,0(0,%r26)
+       bv              0(%r2)
+        addc           %r28,%r28,%r28
+
+       .label  L$largedivisor
+       extru           %r24,31,1,%r19          ; r19 = n0 & 1
+       bb,<            %r23,31,L$odd
+        extru          %r23,30,31,%r22         ; r22 = d >> 1
+       shd             %r25,%r24,1,%r24        ; r24 = new n0
+       extru           %r25,30,31,%r25         ; r25 = new n1
+       sub             %r0,%r22,%r21
+       ds              %r0,%r21,%r0
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       comclr,>=       %r25,%r0,%r0
+       addl            %r25,%r22,%r25
+       sh1addl         %r25,%r19,%r25
+       stws            %r25,0(0,%r26)
+       bv              0(%r2)
+        addc           %r24,%r24,%r28
+
+       .label  L$odd
+       addib,sv,n      1,%r22,L$FF..           ; r22 = (d / 2 + 1)
+       shd             %r25,%r24,1,%r24        ; r24 = new n0
+       extru           %r25,30,31,%r25         ; r25 = new n1
+       sub             %r0,%r22,%r21
+       ds              %r0,%r21,%r0
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r24
+       ds              %r25,%r22,%r25
+       addc            %r24,%r24,%r28
+       comclr,>=       %r25,%r0,%r0
+       addl            %r25,%r22,%r25
+       sh1addl         %r25,%r19,%r25
+; We have computed (n1,,n0) / (d + 1), q' = r28, r' = r25
+       add,nuv         %r28,%r25,%r25
+       addl            %r25,%r1,%r25
+       addc            %r0,%r28,%r28
+       sub,<<          %r25,%r23,%r0
+       addl            %r25,%r1,%r25
+       stws            %r25,0(0,%r26)
+       bv              0(%r2)
+        addc           %r0,%r28,%r28
+
+; This is just a special case of the code above.
+; We come here when d == 0xFFFFFFFF
+       .label  L$FF..
+       add,uv          %r25,%r24,%r24
+       sub,<<          %r24,%r23,%r0
+       ldo             1(%r24),%r24
+       stws            %r24,0(0,%r26)
+       bv              0(%r2)
+        addc           %r0,%r25,%r28
+
+       .exit
+       .procend
diff --git a/mpi/hppa1.1/distfiles b/mpi/hppa1.1/distfiles
new file mode 100644 (file)
index 0000000..d68227a
--- /dev/null
@@ -0,0 +1,5 @@
+udiv-qrnnd.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+
diff --git a/mpi/hppa1.1/mpih-mul1.S b/mpi/hppa1.1/mpih-mul1.S
new file mode 100644 (file)
index 0000000..d1272a7
--- /dev/null
@@ -0,0 +1,116 @@
+/* hppa1.1  mul_1 -- Multiply a limb vector with a limb and store
+ *                  the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1993, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (r26)
+ *               mpi_ptr_t s1_ptr,     (r25)
+ *               mpi_size_t s1_size,   (r24)
+ *               mpi_limb_t s2_limb)   (r23)
+ *
+ *
+ *
+ * This runs at 9 cycles/limb on a PA7000.  With the used instructions, it can
+ * not become faster due to data cache contention after a store.  On the
+ * PA7100 it runs at 7 cycles/limb, and that can not be improved either, since
+ * only the xmpyu does not need the integer pipeline, so the only dual-issue
+ * we will get are addc+xmpyu. Unrolling would not help either CPU.
+ *
+ * We could use fldds to read two limbs at a time from the S1 array, and that
+ * could bring down the times to 8.5 and 6.5 cycles/limb for the PA7000 and
+ * PA7100, respectively.  We don't do that since it does not seem worth the
+ * (alignment) troubles...
+ *
+ * At least the PA7100 is rumored to be able to deal with cache-misses
+ * without stalling instruction issue. If this is true, and the cache is
+ * actually also lockup-free, we should use a deeper software pipeline, and
+ * load from S1 very early!  (The loads and stores to -12(sp) will surely be
+ * in the cache.)
+ */
+
+       .code
+       .export         mpihelp_mul_1
+       .label          mpihelp_mul_1
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       ldo             64(%r30),%r30
+       fldws,ma        4(%r25),%fr5
+       stw             %r23,-16(%r30)          ; move s2_limb ...
+       addib,=         -1,%r24,L$just_one_limb
+        fldws          -16(%r30),%fr4          ; ... into fr4
+       add             %r0,%r0,%r0             ; clear carry
+       xmpyu           %fr4,%fr5,%fr6
+       fldws,ma        4(%r25),%fr7
+       fstds           %fr6,-16(%r30)
+       xmpyu           %fr4,%fr7,%fr8
+       ldw             -12(%r30),%r19          ; least significant limb in product
+       ldw             -16(%r30),%r28
+
+       fstds           %fr8,-16(%r30)
+       addib,=         -1,%r24,L$end
+        ldw            -12(%r30),%r1
+
+; Main loop
+       .label  L$loop
+       fldws,ma        4(%r25),%fr5
+       stws,ma         %r19,4(%r26)
+       addc            %r28,%r1,%r19
+       xmpyu           %fr4,%fr5,%fr6
+       ldw             -16(%r30),%r28
+       fstds           %fr6,-16(%r30)
+       addib,<>        -1,%r24,L$loop
+        ldw            -12(%r30),%r1
+
+       .label  L$end
+       stws,ma         %r19,4(%r26)
+       addc            %r28,%r1,%r19
+       ldw             -16(%r30),%r28
+       stws,ma         %r19,4(%r26)
+       addc            %r0,%r28,%r28
+       bv              0(%r2)
+        ldo            -64(%r30),%r30
+
+       .label  L$just_one_limb
+       xmpyu           %fr4,%fr5,%fr6
+       fstds           %fr6,-16(%r30)
+       ldw             -16(%r30),%r28
+       ldo             -64(%r30),%r30
+       bv              0(%r2)
+        fstws          %fr6R,0(%r26)
+
+       .exit
+       .procend
+
+
diff --git a/mpi/hppa1.1/mpih-mul2.S b/mpi/hppa1.1/mpih-mul2.S
new file mode 100644 (file)
index 0000000..18c4dfe
--- /dev/null
@@ -0,0 +1,118 @@
+/* hppa1.1   addmul_1 -- Multiply a limb vector with a limb and add
+ *                      the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1993, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r26)
+ *                  mpi_ptr_t s1_ptr,       (r25)
+ *                  mpi_size_t s1_size,     (r24)
+ *                  mpi_limb_t s2_limb)     (r23)
+ *
+ * This runs at 11 cycles/limb on a PA7000.  With the used instructions, it
+ * can not become faster due to data cache contention after a store.  On the
+ * PA7100 it runs at 10 cycles/limb, and that can not be improved either,
+ * since only the xmpyu does not need the integer pipeline, so the only
+ * dual-issue we will get are addc+xmpyu.  Unrolling could gain a cycle/limb
+ * on the PA7100.
+ *
+ * There are some ideas described in mul1.S that applies to this code too.
+ */
+
+       .code
+       .export         mpihelp_addmul_1
+       .label          mpihelp_addmul_1
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       ldo             64(%r30),%r30
+       fldws,ma        4(%r25),%fr5
+       stw             %r23,-16(%r30)          ; move s2_limb ...
+       addib,=         -1,%r24,L$just_one_limb
+        fldws          -16(%r30),%fr4          ; ... into fr4
+       add             %r0,%r0,%r0             ; clear carry
+       xmpyu           %fr4,%fr5,%fr6
+       fldws,ma        4(%r25),%fr7
+       fstds           %fr6,-16(%r30)
+       xmpyu           %fr4,%fr7,%fr8
+       ldw             -12(%r30),%r19          ; least significant limb in product
+       ldw             -16(%r30),%r28
+
+       fstds           %fr8,-16(%r30)
+       addib,=         -1,%r24,L$end
+        ldw            -12(%r30),%r1
+
+; Main loop
+       .label  L$loop
+       ldws            0(%r26),%r29
+       fldws,ma        4(%r25),%fr5
+       add             %r29,%r19,%r19
+       stws,ma         %r19,4(%r26)
+       addc            %r28,%r1,%r19
+       xmpyu           %fr4,%fr5,%fr6
+       ldw             -16(%r30),%r28
+       fstds           %fr6,-16(%r30)
+       addc            %r0,%r28,%r28
+       addib,<>        -1,%r24,L$loop
+        ldw            -12(%r30),%r1
+
+       .label  L$end
+       ldw             0(%r26),%r29
+       add             %r29,%r19,%r19
+       stws,ma         %r19,4(%r26)
+       addc            %r28,%r1,%r19
+       ldw             -16(%r30),%r28
+       ldws            0(%r26),%r29
+       addc            %r0,%r28,%r28
+       add             %r29,%r19,%r19
+       stws,ma         %r19,4(%r26)
+       addc            %r0,%r28,%r28
+       bv              0(%r2)
+        ldo            -64(%r30),%r30
+
+       .label L$just_one_limb
+       xmpyu           %fr4,%fr5,%fr6
+       ldw             0(%r26),%r29
+       fstds           %fr6,-16(%r30)
+       ldw             -12(%r30),%r1
+       ldw             -16(%r30),%r28
+       add             %r29,%r1,%r19
+       stw             %r19,0(%r26)
+       addc            %r0,%r28,%r28
+       bv              0(%r2)
+        ldo            -64(%r30),%r30
+
+       .exit
+       .procend
+
+
diff --git a/mpi/hppa1.1/mpih-mul3.S b/mpi/hppa1.1/mpih-mul3.S
new file mode 100644 (file)
index 0000000..c5b3925
--- /dev/null
@@ -0,0 +1,128 @@
+/* hppa1.1   submul_1 -- Multiply a limb vector with a limb and add
+ *                      the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1993, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (r26)
+ *                  mpi_ptr_t s1_ptr,       (r25)
+ *                  mpi_size_t s1_size,     (r24)
+ *                  mpi_limb_t s2_limb)     (r23)
+ *
+ *
+ * This runs at 12 cycles/limb on a PA7000.  With the used instructions, it
+ * can not become faster due to data cache contention after a store.  On the
+ * PA7100 it runs at 11 cycles/limb, and that can not be improved either,
+ * since only the xmpyu does not need the integer pipeline, so the only
+ * dual-issue we will get are addc+xmpyu.  Unrolling could gain a cycle/limb
+ * on the PA7100.
+ *
+ * There are some ideas described in mul1.S that applies to this code too.
+ *
+ * It seems possible to make this run as fast as addmul_1, if we use
+ *      sub,>>= %r29,%r19,%r22
+ *      addi    1,%r28,%r28
+ * but that requires reworking the hairy software pipeline...
+ */
+
+
+       .code
+       .export         mpihelp_submul_1
+       .label          mpihelp_submul_1
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       ldo             64(%r30),%r30
+       fldws,ma        4(%r25),%fr5
+       stw             %r23,-16(%r30)          ; move s2_limb ...
+       addib,=         -1,%r24,L$just_one_limb
+        fldws          -16(%r30),%fr4          ; ... into fr4
+       add             %r0,%r0,%r0             ; clear carry
+       xmpyu           %fr4,%fr5,%fr6
+       fldws,ma        4(%r25),%fr7
+       fstds           %fr6,-16(%r30)
+       xmpyu           %fr4,%fr7,%fr8
+       ldw             -12(%r30),%r19          ; least significant limb in product
+       ldw             -16(%r30),%r28
+
+       fstds           %fr8,-16(%r30)
+       addib,=         -1,%r24,L$end
+        ldw            -12(%r30),%r1
+
+; Main loop
+       .label  L$loop
+       ldws            0(%r26),%r29
+       fldws,ma        4(%r25),%fr5
+       sub             %r29,%r19,%r22
+       add             %r22,%r19,%r0
+       stws,ma         %r22,4(%r26)
+       addc            %r28,%r1,%r19
+       xmpyu           %fr4,%fr5,%fr6
+       ldw             -16(%r30),%r28
+       fstds           %fr6,-16(%r30)
+       addc            %r0,%r28,%r28
+       addib,<>        -1,%r24,L$loop
+        ldw            -12(%r30),%r1
+
+       .label  L$end
+       ldw             0(%r26),%r29
+       sub             %r29,%r19,%r22
+       add             %r22,%r19,%r0
+       stws,ma         %r22,4(%r26)
+       addc            %r28,%r1,%r19
+       ldw             -16(%r30),%r28
+       ldws            0(%r26),%r29
+       addc            %r0,%r28,%r28
+       sub             %r29,%r19,%r22
+       add             %r22,%r19,%r0
+       stws,ma         %r22,4(%r26)
+       addc            %r0,%r28,%r28
+       bv              0(%r2)
+        ldo            -64(%r30),%r30
+
+       .label  L$just_one_limb
+       xmpyu           %fr4,%fr5,%fr6
+       ldw             0(%r26),%r29
+       fstds           %fr6,-16(%r30)
+       ldw             -12(%r30),%r1
+       ldw             -16(%r30),%r28
+       sub             %r29,%r1,%r22
+       add             %r22,%r1,%r0
+       stw             %r22,0(%r26)
+       addc            %r0,%r28,%r28
+       bv              0(%r2)
+        ldo            -64(%r30),%r30
+
+       .exit
+       .procend
+
diff --git a/mpi/hppa1.1/udiv-qrnnd.S b/mpi/hppa1.1/udiv-qrnnd.S
new file mode 100644 (file)
index 0000000..a086822
--- /dev/null
@@ -0,0 +1,92 @@
+/* HP-PA  __udiv_qrnnd division support, used from longlong.h.
+ *       This version runs fast on PA 7000 and later.
+ *
+ *      Copyright (C) 1993, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+/* INPUT PARAMETERS
+ *   rem_ptr      gr26
+ *   n1           gr25
+ *   n0           gr24
+ *   d            gr23
+ */
+
+       .code
+       .align          8
+       .label L$0000
+       .word           0x43f00000
+       .word           0x0
+       .export         __udiv_qrnnd
+       .label          __udiv_qrnnd
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+       ldo             64(%r30),%r30
+
+       stws            %r25,-16(0,%r30)        ; n_hi
+       stws            %r24,-12(0,%r30)        ; n_lo
+       ldil            L'L$0000,%r19           ; '
+       ldo             R'L$0000(%r19),%r19     ; '
+       fldds           -16(0,%r30),%fr5
+       stws            %r23,-12(0,%r30)
+       comib,<=        0,%r25,L$1
+       fcnvxf,dbl,dbl  %fr5,%fr5
+       fldds           0(0,%r19),%fr4
+       fadd,dbl        %fr4,%fr5,%fr5
+       .label  L$1
+       fcpy,sgl        %fr0,%fr6L
+       fldws           -12(0,%r30),%fr6R
+       fcnvxf,dbl,dbl  %fr6,%fr4
+
+       fdiv,dbl        %fr5,%fr4,%fr5
+
+       fcnvfx,dbl,dbl  %fr5,%fr4
+       fstws           %fr4R,-16(%r30)
+       xmpyu           %fr4R,%fr6R,%fr6
+       ldws            -16(%r30),%r28
+       fstds           %fr6,-16(0,%r30)
+       ldws            -12(0,%r30),%r21
+       ldws            -16(0,%r30),%r20
+       sub             %r24,%r21,%r22
+       subb            %r25,%r20,%r19
+       comib,=         0,%r19,L$2
+       ldo             -64(%r30),%r30
+
+       add             %r22,%r23,%r22
+       ldo             -1(%r28),%r28
+       .label  L$2
+       bv              0(%r2)
+       stws            %r22,0(0,%r26)
+
+       .exit
+       .procend
+
+
diff --git a/mpi/i386/distfiles b/mpi/i386/distfiles
new file mode 100644 (file)
index 0000000..88d2a30
--- /dev/null
@@ -0,0 +1,9 @@
+mpih-add1.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-lshift.S
+mpih-rshift.S
+mpih-sub1.S
+syntax.h
+
diff --git a/mpi/i386/mpih-add1.S b/mpi/i386/mpih-add1.S
new file mode 100644 (file)
index 0000000..cc96014
--- /dev/null
@@ -0,0 +1,119 @@
+/* i80386 add_n -- Add two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  (sp + 4)
+ *                mpi_ptr_t s1_ptr,    (sp + 8)
+ *                mpi_ptr_t s2_ptr,    (sp + 12)
+ *                mpi_size_t size)     (sp + 16)
+ */
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_add_n)
+C_SYMBOL_NAME(mpihelp_add_n:)
+       pushl %edi
+       pushl %esi
+
+       movl 12(%esp),%edi              /* res_ptr */
+       movl 16(%esp),%esi              /* s1_ptr */
+       movl 20(%esp),%edx              /* s2_ptr */
+       movl 24(%esp),%ecx              /* size */
+
+       movl    %ecx,%eax
+       shrl    $3,%ecx                 /* compute count for unrolled loop */
+       negl    %eax
+       andl    $7,%eax                 /* get index where to start loop */
+       jz      Loop                    /* necessary special case for 0 */
+       incl    %ecx                    /* adjust loop count */
+       shll    $2,%eax                 /* adjustment for pointers... */
+       subl    %eax,%edi               /* ... since they are offset ... */
+       subl    %eax,%esi               /* ... by a constant when we ... */
+       subl    %eax,%edx               /* ... enter the loop */
+       shrl    $2,%eax                 /* restore previous value */
+#ifdef PIC
+/* Calculate start address in loop for PIC.  Due to limitations in some
+   assemblers, Loop-L0-3 cannot be put into the leal */
+       call    L0
+L0:    leal    (%eax,%eax,8),%eax
+       addl    (%esp),%eax
+       addl    $(Loop-L0-3),%eax
+       addl    $4,%esp
+#else
+/* Calculate start address in loop for non-PIC.  */
+       leal    Loop-3(%eax,%eax,8),%eax
+#endif
+       jmp     *%eax                   /* jump into loop */
+       ALIGN (3)
+Loop:  movl    (%esi),%eax
+       adcl    (%edx),%eax
+       movl    %eax,(%edi)
+       movl    4(%esi),%eax
+       adcl    4(%edx),%eax
+       movl    %eax,4(%edi)
+       movl    8(%esi),%eax
+       adcl    8(%edx),%eax
+       movl    %eax,8(%edi)
+       movl    12(%esi),%eax
+       adcl    12(%edx),%eax
+       movl    %eax,12(%edi)
+       movl    16(%esi),%eax
+       adcl    16(%edx),%eax
+       movl    %eax,16(%edi)
+       movl    20(%esi),%eax
+       adcl    20(%edx),%eax
+       movl    %eax,20(%edi)
+       movl    24(%esi),%eax
+       adcl    24(%edx),%eax
+       movl    %eax,24(%edi)
+       movl    28(%esi),%eax
+       adcl    28(%edx),%eax
+       movl    %eax,28(%edi)
+       leal    32(%edi),%edi
+       leal    32(%esi),%esi
+       leal    32(%edx),%edx
+       decl    %ecx
+       jnz     Loop
+
+       sbbl    %eax,%eax
+       negl    %eax
+
+       popl %esi
+       popl %edi
+       ret
+
diff --git a/mpi/i386/mpih-lshift.S b/mpi/i386/mpih-lshift.S
new file mode 100644 (file)
index 0000000..9233824
--- /dev/null
@@ -0,0 +1,97 @@
+/* i80386   lshift
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (sp + 4)
+ *                mpi_ptr_t up,        (sp + 8)
+ *                mpi_size_t usize,    (sp + 12)
+ *                unsigned cnt)        (sp + 16)
+ */
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_lshift)
+C_SYMBOL_NAME(mpihelp_lshift:)
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+
+       movl    16(%esp),%edi           /* res_ptr */
+       movl    20(%esp),%esi           /* s_ptr */
+       movl    24(%esp),%edx           /* size */
+       movl    28(%esp),%ecx           /* cnt */
+
+       subl    $4,%esi                 /* adjust s_ptr */
+
+       movl    (%esi,%edx,4),%ebx      /* read most significant limb */
+       xorl    %eax,%eax
+       shldl   %ebx,%eax               /* compute carry limb */
+       decl    %edx
+       jz      Lend
+       pushl   %eax                    /* push carry limb onto stack */
+       testb   $1,%dl
+       jnz     L1                      /* enter loop in the middle */
+       movl    %ebx,%eax
+
+       ALIGN (3)
+Loop:  movl    (%esi,%edx,4),%ebx      /* load next lower limb */
+       shldl   %ebx,%eax               /* compute result limb */
+       movl    %eax,(%edi,%edx,4)      /* store it */
+       decl    %edx
+L1:    movl    (%esi,%edx,4),%eax
+       shldl   %eax,%ebx
+       movl    %ebx,(%edi,%edx,4)
+       decl    %edx
+       jnz     Loop
+
+       shll    %cl,%eax                /* compute least significant limb */
+       movl    %eax,(%edi)             /* store it */
+
+       popl    %eax                    /* pop carry limb */
+
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
+Lend:  shll    %cl,%ebx                /* compute least significant limb */
+       movl    %ebx,(%edi)             /* store it */
+
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
diff --git a/mpi/i386/mpih-mul1.S b/mpi/i386/mpih-mul1.S
new file mode 100644 (file)
index 0000000..a5f83a5
--- /dev/null
@@ -0,0 +1,87 @@
+/* i80386 mul_1 -- Multiply a limb vector with a limb and store
+ *                      the result in a second limb vector.
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (sp + 4)
+ *               mpi_ptr_t s1_ptr,     (sp + 8)
+ *               mpi_size_t s1_size,   (sp + 12)
+ *               mpi_limb_t s2_limb)   (sp + 16)
+ */
+
+#define res_ptr edi
+#define s1_ptr esi
+#define size   ecx
+#define s2_limb ebp
+
+       TEXT
+       ALIGN (3)
+       GLOBL   C_SYMBOL_NAME(mpihelp_mul_1)
+C_SYMBOL_NAME(mpihelp_mul_1:)
+
+       INSN1(push,l    ,R(edi))
+       INSN1(push,l    ,R(esi))
+       INSN1(push,l    ,R(ebx))
+       INSN1(push,l    ,R(ebp))
+
+       INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
+       INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
+
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
+       ALIGN (3)
+Loop:
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
+       INSN1(mul,l     ,R(s2_limb))
+       INSN2(add,l     ,R(eax),R(ebx))
+       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(eax))
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(mov,l     ,R(ebx),R(edx))
+
+       INSN1(inc,l     ,R(size))
+       INSN1(jnz,      ,Loop)
+       INSN2(mov,l     ,R(eax),R(ebx))
+
+       INSN1(pop,l     ,R(ebp))
+       INSN1(pop,l     ,R(ebx))
+       INSN1(pop,l     ,R(esi))
+       INSN1(pop,l     ,R(edi))
+       ret
+
diff --git a/mpi/i386/mpih-mul2.S b/mpi/i386/mpih-mul2.S
new file mode 100644 (file)
index 0000000..6b6c806
--- /dev/null
@@ -0,0 +1,89 @@
+/* i80386 addmul_1 -- Multiply a limb vector with a limb and add
+ *                   the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (sp + 4)
+ *                  mpi_ptr_t s1_ptr,       (sp + 8)
+ *                  mpi_size_t s1_size,     (sp + 12)
+ *                  mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+#define res_ptr edi
+#define s1_ptr esi
+#define size   ecx
+#define s2_limb ebp
+
+       TEXT
+       ALIGN (3)
+       GLOBL   C_SYMBOL_NAME(mpihelp_addmul_1)
+C_SYMBOL_NAME(mpihelp_addmul_1:)
+
+       INSN1(push,l    ,R(edi))
+       INSN1(push,l    ,R(esi))
+       INSN1(push,l    ,R(ebx))
+       INSN1(push,l    ,R(ebp))
+
+       INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
+       INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
+
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
+       ALIGN (3)
+Loop:
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
+       INSN1(mul,l     ,R(s2_limb))
+       INSN2(add,l     ,R(eax),R(ebx))
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(add,l     ,MEM_INDEX(res_ptr,size,4),R(eax))
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(mov,l     ,R(ebx),R(edx))
+
+       INSN1(inc,l     ,R(size))
+       INSN1(jnz,      ,Loop)
+       INSN2(mov,l     ,R(eax),R(ebx))
+
+       INSN1(pop,l     ,R(ebp))
+       INSN1(pop,l     ,R(ebx))
+       INSN1(pop,l     ,R(esi))
+       INSN1(pop,l     ,R(edi))
+       ret
+
diff --git a/mpi/i386/mpih-mul3.S b/mpi/i386/mpih-mul3.S
new file mode 100644 (file)
index 0000000..81e1e43
--- /dev/null
@@ -0,0 +1,89 @@
+/* i80386 submul_1 -- Multiply a limb vector with a limb and add
+ *                   the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (sp + 4)
+ *                  mpi_ptr_t s1_ptr,       (sp + 8)
+ *                  mpi_size_t s1_size,     (sp + 12)
+ *                  mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+#define res_ptr edi
+#define s1_ptr esi
+#define size   ecx
+#define s2_limb ebp
+
+       TEXT
+       ALIGN (3)
+       GLOBL   C_SYMBOL_NAME(mpihelp_submul_1)
+C_SYMBOL_NAME(mpihelp_submul_1:)
+
+       INSN1(push,l    ,R(edi))
+       INSN1(push,l    ,R(esi))
+       INSN1(push,l    ,R(ebx))
+       INSN1(push,l    ,R(ebp))
+
+       INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
+       INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
+
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
+       ALIGN (3)
+Loop:
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
+       INSN1(mul,l     ,R(s2_limb))
+       INSN2(add,l     ,R(eax),R(ebx))
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(sub,l     ,MEM_INDEX(res_ptr,size,4),R(eax))
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(mov,l     ,R(ebx),R(edx))
+
+       INSN1(inc,l     ,R(size))
+       INSN1(jnz,      ,Loop)
+       INSN2(mov,l     ,R(eax),R(ebx))
+
+       INSN1(pop,l     ,R(ebp))
+       INSN1(pop,l     ,R(ebx))
+       INSN1(pop,l     ,R(esi))
+       INSN1(pop,l     ,R(edi))
+       ret
+
diff --git a/mpi/i386/mpih-rshift.S b/mpi/i386/mpih-rshift.S
new file mode 100644 (file)
index 0000000..43afece
--- /dev/null
@@ -0,0 +1,100 @@
+/* i80386   rshift
+ *
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (sp + 4)
+ *                mpi_ptr_t up,        (sp + 8)
+ *                mpi_size_t usize,    (sp + 12)
+ *                unsigned cnt)        (sp + 16)
+ */
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_rshift)
+C_SYMBOL_NAME(mpihelp_rshift:)
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+
+       movl    16(%esp),%edi           /* wp */
+       movl    20(%esp),%esi           /* up */
+       movl    24(%esp),%edx           /* usize */
+       movl    28(%esp),%ecx           /* cnt */
+
+       leal    -4(%edi,%edx,4),%edi
+       leal    (%esi,%edx,4),%esi
+       negl    %edx
+
+       movl    (%esi,%edx,4),%ebx      /* read least significant limb */
+       xorl    %eax,%eax
+       shrdl   %ebx,%eax               /* compute carry limb */
+       incl    %edx
+       jz      Lend2
+       pushl   %eax                    /* push carry limb onto stack */
+       testb   $1,%dl
+       jnz     L2                      /* enter loop in the middle */
+       movl    %ebx,%eax
+
+       ALIGN (3)
+Loop2: movl     (%esi,%edx,4),%ebx      /* load next higher limb */
+       shrdl   %ebx,%eax               /* compute result limb */
+       movl    %eax,(%edi,%edx,4)      /* store it */
+       incl    %edx
+L2:    movl    (%esi,%edx,4),%eax
+       shrdl   %eax,%ebx
+       movl    %ebx,(%edi,%edx,4)
+       incl    %edx
+       jnz     Loop2
+
+       shrl    %cl,%eax                /* compute most significant limb */
+       movl    %eax,(%edi)             /* store it */
+
+       popl    %eax                    /* pop carry limb */
+
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
+Lend2: shrl    %cl,%ebx                /* compute most significant limb */
+       movl    %ebx,(%edi)             /* store it */
+
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
diff --git a/mpi/i386/mpih-sub1.S b/mpi/i386/mpih-sub1.S
new file mode 100644 (file)
index 0000000..9f0dbd8
--- /dev/null
@@ -0,0 +1,120 @@
+/* i80386 sub_n -- Sub two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001, 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (sp + 4)
+ *                mpi_ptr_t s1_ptr,    (sp + 8)
+ *                mpi_ptr_t s2_ptr,    (sp + 12)
+ *                mpi_size_t size)     (sp + 16)
+ */
+
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_sub_n)
+C_SYMBOL_NAME(mpihelp_sub_n:)
+       pushl %edi
+       pushl %esi
+
+       movl 12(%esp),%edi              /* res_ptr */
+       movl 16(%esp),%esi              /* s1_ptr */
+       movl 20(%esp),%edx              /* s2_ptr */
+       movl 24(%esp),%ecx              /* size */
+
+       movl    %ecx,%eax
+       shrl    $3,%ecx                 /* compute count for unrolled loop */
+       negl    %eax
+       andl    $7,%eax                 /* get index where to start loop */
+       jz      Loop                    /* necessary special case for 0 */
+       incl    %ecx                    /* adjust loop count */
+       shll    $2,%eax                 /* adjustment for pointers... */
+       subl    %eax,%edi               /* ... since they are offset ... */
+       subl    %eax,%esi               /* ... by a constant when we ... */
+       subl    %eax,%edx               /* ... enter the loop */
+       shrl    $2,%eax                 /* restore previous value */
+#ifdef PIC
+/* Calculate start address in loop for PIC.  Due to limitations in some
+   assemblers, Loop-L0-3 cannot be put into the leal */
+       call    L0
+L0:    leal    (%eax,%eax,8),%eax
+       addl    (%esp),%eax
+       addl    $(Loop-L0-3),%eax
+       addl    $4,%esp
+#else
+/* Calculate start address in loop for non-PIC.  */
+       leal    Loop-3(%eax,%eax,8),%eax
+#endif
+       jmp     *%eax                   /* jump into loop */
+       ALIGN (3)
+Loop:  movl    (%esi),%eax
+       sbbl    (%edx),%eax
+       movl    %eax,(%edi)
+       movl    4(%esi),%eax
+       sbbl    4(%edx),%eax
+       movl    %eax,4(%edi)
+       movl    8(%esi),%eax
+       sbbl    8(%edx),%eax
+       movl    %eax,8(%edi)
+       movl    12(%esi),%eax
+       sbbl    12(%edx),%eax
+       movl    %eax,12(%edi)
+       movl    16(%esi),%eax
+       sbbl    16(%edx),%eax
+       movl    %eax,16(%edi)
+       movl    20(%esi),%eax
+       sbbl    20(%edx),%eax
+       movl    %eax,20(%edi)
+       movl    24(%esi),%eax
+       sbbl    24(%edx),%eax
+       movl    %eax,24(%edi)
+       movl    28(%esi),%eax
+       sbbl    28(%edx),%eax
+       movl    %eax,28(%edi)
+       leal    32(%edi),%edi
+       leal    32(%esi),%esi
+       leal    32(%edx),%edx
+       decl    %ecx
+       jnz     Loop
+
+       sbbl    %eax,%eax
+       negl    %eax
+
+       popl %esi
+       popl %edi
+       ret
+
diff --git a/mpi/i386/syntax.h b/mpi/i386/syntax.h
new file mode 100644 (file)
index 0000000..b656166
--- /dev/null
@@ -0,0 +1,69 @@
+/* syntax.h -- Definitions for x86 syntax variations.
+ *
+ *       Copyright (C) 1992, 1994, 1995, 1998, 
+ *                     2001 Free Software Foundation, Inc.
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#undef ALIGN
+
+#if defined (BSD_SYNTAX) || defined (ELF_SYNTAX)
+#define R(r) %r
+#define MEM(base)(base)
+#define MEM_DISP(base,displacement)displacement(R(base))
+#define MEM_INDEX(base,index,size)(R(base),R(index),size)
+#ifdef __STDC__
+#define INSN1(mnemonic,size_suffix,dst)mnemonic##size_suffix dst
+#define INSN2(mnemonic,size_suffix,dst,src)mnemonic##size_suffix src,dst
+#else
+#define INSN1(mnemonic,size_suffix,dst)mnemonic/**/size_suffix dst
+#define INSN2(mnemonic,size_suffix,dst,src)mnemonic/**/size_suffix src,dst
+#endif
+#define TEXT .text
+#if defined (BSD_SYNTAX)
+#define ALIGN(log) .align log
+#endif
+#if defined (ELF_SYNTAX)
+#define ALIGN(log) .align 1<<log
+#endif
+#define GLOBL .globl
+#endif
+
+#ifdef INTEL_SYNTAX
+#define R(r) r
+#define MEM(base)[base]
+#define MEM_DISP(base,displacement)[base+(displacement)]
+#define MEM_INDEX(base,index,size)[base+index*size]
+#define INSN1(mnemonic,size_suffix,dst)mnemonic dst
+#define INSN2(mnemonic,size_suffix,dst,src)mnemonic dst,src
+#define TEXT .text
+#define ALIGN(log) .align log
+#define GLOBL .globl
+#endif
+
+#ifdef X86_BROKEN_ALIGN
+#undef ALIGN
+#define ALIGN(log) .align log,0x90
+#endif
diff --git a/mpi/i586/README b/mpi/i586/README
new file mode 100644 (file)
index 0000000..d73b082
--- /dev/null
@@ -0,0 +1,26 @@
+This directory contains mpn functions optimized for Intel Pentium
+processors.
+
+RELEVANT OPTIMIZATION ISSUES
+
+1. Pentium doesn't allocate cache lines on writes, unlike most other modern
+processors.  Since the functions in the mpn class do array writes, we have to
+handle allocating the destination cache lines by reading a word from it in the
+loops, to achieve the best performance.
+
+2. Pairing of memory operations requires that the two issued operations refer
+to different cache banks.  The simplest way to insure this is to read/write
+two words from the same object.  If we make operations on different objects,
+they might or might not be to the same cache bank.
+
+STATUS
+
+1. mpn_lshift and mpn_rshift run at about 6 cycles/limb, but the Pentium
+documentation indicates that they should take only 43/8 = 5.375 cycles/limb,
+or 5 cycles/limb asymptotically.
+
+2. mpn_add_n and mpn_sub_n run at asymptotically 2 cycles/limb.  Due to loop
+overhead and other delays (cache refill?), they run at or near 2.5 cycles/limb.
+
+3. mpn_mul_1, mpn_addmul_1, mpn_submul_1 all run 1 cycle faster than they
+should...
diff --git a/mpi/i586/distfiles b/mpi/i586/distfiles
new file mode 100644 (file)
index 0000000..8f821fb
--- /dev/null
@@ -0,0 +1,9 @@
+mpih-add1.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-lshift.S
+mpih-rshift.S
+mpih-sub1.S
+README
+
diff --git a/mpi/i586/mpih-add1.S b/mpi/i586/mpih-add1.S
new file mode 100644 (file)
index 0000000..bf9ba27
--- /dev/null
@@ -0,0 +1,136 @@
+/* i80586 add_n -- Add two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  (sp + 4)
+ *                mpi_ptr_t s1_ptr,    (sp + 8)
+ *                mpi_ptr_t s2_ptr,    (sp + 12)
+ *                mpi_size_t size)     (sp + 16)
+ */
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_add_n)
+C_SYMBOL_NAME(mpihelp_add_n:)
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+       pushl   %ebp
+
+       movl    20(%esp),%edi           /* res_ptr */
+       movl    24(%esp),%esi           /* s1_ptr */
+       movl    28(%esp),%ebp           /* s2_ptr */
+       movl    32(%esp),%ecx           /* size */
+
+       movl    (%ebp),%ebx
+
+       decl    %ecx
+       movl    %ecx,%edx
+       shrl    $3,%ecx
+       andl    $7,%edx
+       testl   %ecx,%ecx               /* zero carry flag */
+       jz      Lend
+       pushl   %edx
+
+       ALIGN (3)
+Loop:  movl    28(%edi),%eax           /* fetch destination cache line */
+       leal    32(%edi),%edi
+
+L1:    movl    (%esi),%eax
+       movl    4(%esi),%edx
+       adcl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    8(%ebp),%ebx
+       movl    %eax,-32(%edi)
+       movl    %edx,-28(%edi)
+
+L2:    movl    8(%esi),%eax
+       movl    12(%esi),%edx
+       adcl    %ebx,%eax
+       movl    12(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    16(%ebp),%ebx
+       movl    %eax,-24(%edi)
+       movl    %edx,-20(%edi)
+
+L3:    movl    16(%esi),%eax
+       movl    20(%esi),%edx
+       adcl    %ebx,%eax
+       movl    20(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    24(%ebp),%ebx
+       movl    %eax,-16(%edi)
+       movl    %edx,-12(%edi)
+
+L4:    movl    24(%esi),%eax
+       movl    28(%esi),%edx
+       adcl    %ebx,%eax
+       movl    28(%ebp),%ebx
+       adcl    %ebx,%edx
+       movl    32(%ebp),%ebx
+       movl    %eax,-8(%edi)
+       movl    %edx,-4(%edi)
+
+       leal    32(%esi),%esi
+       leal    32(%ebp),%ebp
+       decl    %ecx
+       jnz     Loop
+
+       popl    %edx
+Lend:
+       decl    %edx                    /* test %edx w/o clobbering carry */
+       js      Lend2
+       incl    %edx
+Loop2:
+       leal    4(%edi),%edi
+       movl    (%esi),%eax
+       adcl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       movl    %eax,-4(%edi)
+       leal    4(%esi),%esi
+       leal    4(%ebp),%ebp
+       decl    %edx
+       jnz     Loop2
+Lend2:
+       movl    (%esi),%eax
+       adcl    %ebx,%eax
+       movl    %eax,(%edi)
+
+       sbbl    %eax,%eax
+       negl    %eax
+
+       popl    %ebp
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
+
diff --git a/mpi/i586/mpih-lshift.S b/mpi/i586/mpih-lshift.S
new file mode 100644 (file)
index 0000000..366f929
--- /dev/null
@@ -0,0 +1,232 @@
+/* i80586   lshift
+ *
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (sp + 4)
+ *                mpi_ptr_t up,        (sp + 8)
+ *                mpi_size_t usize,    (sp + 12)
+ *                unsigned cnt)        (sp + 16)
+ */
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_lshift)
+C_SYMBOL_NAME(mpihelp_lshift:)
+
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+       pushl   %ebp
+
+       movl    20(%esp),%edi           /* res_ptr */
+       movl    24(%esp),%esi           /* s_ptr */
+       movl    28(%esp),%ebp           /* size */
+       movl    32(%esp),%ecx           /* cnt */
+
+/* We can use faster code for shift-by-1 under certain conditions.  */
+       cmp     $1,%ecx
+       jne     Lnormal
+       leal    4(%esi),%eax
+       cmpl    %edi,%eax
+       jnc     Lspecial                /* jump if s_ptr + 1 >= res_ptr */
+       leal    (%esi,%ebp,4),%eax
+       cmpl    %eax,%edi
+       jnc     Lspecial                /* jump if res_ptr >= s_ptr + size */
+
+Lnormal:
+       leal    -4(%edi,%ebp,4),%edi
+       leal    -4(%esi,%ebp,4),%esi
+
+       movl    (%esi),%edx
+       subl    $4,%esi
+       xorl    %eax,%eax
+       shldl   %cl,%edx,%eax           /* compute carry limb */
+       pushl   %eax                    /* push carry limb onto stack */
+
+       decl    %ebp
+       pushl   %ebp
+       shrl    $3,%ebp
+       jz      Lend
+
+       movl    (%edi),%eax             /* fetch destination cache line */
+
+       ALIGN   (2)
+Loop:  movl    -28(%edi),%eax          /* fetch destination cache line */
+       movl    %edx,%ebx
+
+       movl    (%esi),%eax
+       movl    -4(%esi),%edx
+       shldl   %cl,%eax,%ebx
+       shldl   %cl,%edx,%eax
+       movl    %ebx,(%edi)
+       movl    %eax,-4(%edi)
+
+       movl    -8(%esi),%ebx
+       movl    -12(%esi),%eax
+       shldl   %cl,%ebx,%edx
+       shldl   %cl,%eax,%ebx
+       movl    %edx,-8(%edi)
+       movl    %ebx,-12(%edi)
+
+       movl    -16(%esi),%edx
+       movl    -20(%esi),%ebx
+       shldl   %cl,%edx,%eax
+       shldl   %cl,%ebx,%edx
+       movl    %eax,-16(%edi)
+       movl    %edx,-20(%edi)
+
+       movl    -24(%esi),%eax
+       movl    -28(%esi),%edx
+       shldl   %cl,%eax,%ebx
+       shldl   %cl,%edx,%eax
+       movl    %ebx,-24(%edi)
+       movl    %eax,-28(%edi)
+
+       subl    $32,%esi
+       subl    $32,%edi
+       decl    %ebp
+       jnz     Loop
+
+Lend:  popl    %ebp
+       andl    $7,%ebp
+       jz      Lend2
+Loop2: movl    (%esi),%eax
+       shldl   %cl,%eax,%edx
+       movl    %edx,(%edi)
+       movl    %eax,%edx
+       subl    $4,%esi
+       subl    $4,%edi
+       decl    %ebp
+       jnz     Loop2
+
+Lend2: shll    %cl,%edx                /* compute least significant limb */
+       movl    %edx,(%edi)             /* store it */
+
+       popl    %eax                    /* pop carry limb */
+
+       popl    %ebp
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
+/* We loop from least significant end of the arrays, which is only
+   permissable if the source and destination don't overlap, since the
+   function is documented to work for overlapping source and destination.
+*/
+
+Lspecial:
+       movl    (%esi),%edx
+       addl    $4,%esi
+
+       decl    %ebp
+       pushl   %ebp
+       shrl    $3,%ebp
+
+       addl    %edx,%edx
+       incl    %ebp
+       decl    %ebp
+       jz      LLend
+
+       movl    (%edi),%eax             /* fetch destination cache line */
+
+       ALIGN   (2)
+LLoop: movl    28(%edi),%eax           /* fetch destination cache line */
+       movl    %edx,%ebx
+
+       movl    (%esi),%eax
+       movl    4(%esi),%edx
+       adcl    %eax,%eax
+       movl    %ebx,(%edi)
+       adcl    %edx,%edx
+       movl    %eax,4(%edi)
+
+       movl    8(%esi),%ebx
+       movl    12(%esi),%eax
+       adcl    %ebx,%ebx
+       movl    %edx,8(%edi)
+       adcl    %eax,%eax
+       movl    %ebx,12(%edi)
+
+       movl    16(%esi),%edx
+       movl    20(%esi),%ebx
+       adcl    %edx,%edx
+       movl    %eax,16(%edi)
+       adcl    %ebx,%ebx
+       movl    %edx,20(%edi)
+
+       movl    24(%esi),%eax
+       movl    28(%esi),%edx
+       adcl    %eax,%eax
+       movl    %ebx,24(%edi)
+       adcl    %edx,%edx
+       movl    %eax,28(%edi)
+
+       leal    32(%esi),%esi           /* use leal not to clobber carry */
+       leal    32(%edi),%edi
+       decl    %ebp
+       jnz     LLoop
+
+LLend: popl    %ebp
+       sbbl    %eax,%eax               /* save carry in %eax */
+       andl    $7,%ebp
+       jz      LLend2
+       addl    %eax,%eax               /* restore carry from eax */
+LLoop2: movl   %edx,%ebx
+       movl    (%esi),%edx
+       adcl    %edx,%edx
+       movl    %ebx,(%edi)
+
+       leal    4(%esi),%esi            /* use leal not to clobber carry */
+       leal    4(%edi),%edi
+       decl    %ebp
+       jnz     LLoop2
+
+       jmp     LL1
+LLend2: addl   %eax,%eax               /* restore carry from eax */
+LL1:   movl    %edx,(%edi)             /* store last limb */
+
+       sbbl    %eax,%eax
+       negl    %eax
+
+       popl    %ebp
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
+
diff --git a/mpi/i586/mpih-mul1.S b/mpi/i586/mpih-mul1.S
new file mode 100644 (file)
index 0000000..1987825
--- /dev/null
@@ -0,0 +1,92 @@
+/* i80586 mul_1 -- Multiply a limb vector with a limb and store
+ *                      the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (sp + 4)
+ *               mpi_ptr_t s1_ptr,     (sp + 8)
+ *               mpi_size_t s1_size,   (sp + 12)
+ *               mpi_limb_t s2_limb)   (sp + 16)
+ */
+
+#define res_ptr edi
+#define s1_ptr esi
+#define size   ecx
+#define s2_limb ebp
+
+       TEXT
+       ALIGN (3)
+       GLOBL   C_SYMBOL_NAME(mpihelp_mul_1)
+C_SYMBOL_NAME(mpihelp_mul_1:)
+
+       INSN1(push,l    ,R(edi))
+       INSN1(push,l    ,R(esi))
+       INSN1(push,l    ,R(ebx))
+       INSN1(push,l    ,R(ebp))
+
+       INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
+       INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
+
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
+       ALIGN (3)
+
+Loop:  INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
+
+       INSN1(mul,l     ,R(s2_limb))
+
+       INSN2(add,l     ,R(ebx),R(eax))
+
+       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(ebx))
+       INSN1(inc,l     ,R(size))
+
+       INSN2(mov,l     ,R(ebx),R(edx))
+       INSN1(jnz,      ,Loop)
+
+       INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),R(ebx))
+       INSN1(pop,l     ,R(ebp))
+       INSN1(pop,l     ,R(ebx))
+       INSN1(pop,l     ,R(esi))
+       INSN1(pop,l     ,R(edi))
+       ret
+
diff --git a/mpi/i586/mpih-mul2.S b/mpi/i586/mpih-mul2.S
new file mode 100644 (file)
index 0000000..39c0bbd
--- /dev/null
@@ -0,0 +1,96 @@
+/* i80586 addmul_1 -- Multiply a limb vector with a limb and add
+ *                   the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (sp + 4)
+ *                  mpi_ptr_t s1_ptr,       (sp + 8)
+ *                  mpi_size_t s1_size,     (sp + 12)
+ *                  mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+#define res_ptr edi
+#define s1_ptr esi
+#define size   ecx
+#define s2_limb ebp
+
+       TEXT
+       ALIGN (3)
+       GLOBL   C_SYMBOL_NAME(mpihelp_addmul_1)
+C_SYMBOL_NAME(mpihelp_addmul_1:)
+
+       INSN1(push,l    ,R(edi))
+       INSN1(push,l    ,R(esi))
+       INSN1(push,l    ,R(ebx))
+       INSN1(push,l    ,R(ebp))
+
+       INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
+       INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
+
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
+       ALIGN (3)
+
+Loop:  INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
+
+       INSN1(mul,l     ,R(s2_limb))
+
+       INSN2(add,l     ,R(eax),R(ebx))
+       INSN2(mov,l     ,R(ebx),MEM_INDEX(res_ptr,size,4))
+
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(add,l     ,R(ebx),R(eax))
+
+       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(ebx))
+       INSN1(inc,l     ,R(size))
+
+       INSN2(mov,l     ,R(ebx),R(edx))
+       INSN1(jnz,      ,Loop)
+
+       INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),R(ebx))
+       INSN1(pop,l     ,R(ebp))
+       INSN1(pop,l     ,R(ebx))
+       INSN1(pop,l     ,R(esi))
+       INSN1(pop,l     ,R(edi))
+       ret
+
diff --git a/mpi/i586/mpih-mul3.S b/mpi/i586/mpih-mul3.S
new file mode 100644 (file)
index 0000000..6c1414f
--- /dev/null
@@ -0,0 +1,96 @@
+/* i80586 submul_1 -- Multiply a limb vector with a limb and add
+ *                   the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (sp + 4)
+ *                  mpi_ptr_t s1_ptr,       (sp + 8)
+ *                  mpi_size_t s1_size,     (sp + 12)
+ *                  mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+#define res_ptr edi
+#define s1_ptr esi
+#define size   ecx
+#define s2_limb ebp
+
+       TEXT
+       ALIGN (3)
+       GLOBL   C_SYMBOL_NAME(mpihelp_submul_1)
+C_SYMBOL_NAME(mpihelp_submul_1:)
+
+       INSN1(push,l    ,R(edi))
+       INSN1(push,l    ,R(esi))
+       INSN1(push,l    ,R(ebx))
+       INSN1(push,l    ,R(ebp))
+
+       INSN2(mov,l     ,R(res_ptr),MEM_DISP(esp,20))
+       INSN2(mov,l     ,R(s1_ptr),MEM_DISP(esp,24))
+       INSN2(mov,l     ,R(size),MEM_DISP(esp,28))
+       INSN2(mov,l     ,R(s2_limb),MEM_DISP(esp,32))
+
+       INSN2(lea,l     ,R(res_ptr),MEM_INDEX(res_ptr,size,4))
+       INSN2(lea,l     ,R(s1_ptr),MEM_INDEX(s1_ptr,size,4))
+       INSN1(neg,l     ,R(size))
+       INSN2(xor,l     ,R(ebx),R(ebx))
+       ALIGN (3)
+
+Loop:  INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),MEM_INDEX(s1_ptr,size,4))
+
+       INSN1(mul,l     ,R(s2_limb))
+
+       INSN2(add,l     ,R(eax),R(ebx))
+       INSN2(mov,l     ,R(ebx),MEM_INDEX(res_ptr,size,4))
+
+       INSN2(adc,l     ,R(edx),$0)
+       INSN2(sub,l     ,R(ebx),R(eax))
+
+       INSN2(mov,l     ,MEM_INDEX(res_ptr,size,4),R(ebx))
+       INSN1(inc,l     ,R(size))
+
+       INSN2(mov,l     ,R(ebx),R(edx))
+       INSN1(jnz,      ,Loop)
+
+       INSN2(adc,l     ,R(ebx),$0)
+       INSN2(mov,l     ,R(eax),R(ebx))
+       INSN1(pop,l     ,R(ebp))
+       INSN1(pop,l     ,R(ebx))
+       INSN1(pop,l     ,R(esi))
+       INSN1(pop,l     ,R(edi))
+       ret
+
diff --git a/mpi/i586/mpih-rshift.S b/mpi/i586/mpih-rshift.S
new file mode 100644 (file)
index 0000000..aeacb68
--- /dev/null
@@ -0,0 +1,231 @@
+/* i80586   rshift
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (sp + 4)
+ *                mpi_ptr_t up,        (sp + 8)
+ *                mpi_size_t usize,    (sp + 12)
+ *                unsigned cnt)        (sp + 16)
+ */
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_rshift)
+C_SYMBOL_NAME(mpihelp_rshift:)
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+       pushl   %ebp
+
+       movl    20(%esp),%edi           /* res_ptr */
+       movl    24(%esp),%esi           /* s_ptr */
+       movl    28(%esp),%ebp           /* size */
+       movl    32(%esp),%ecx           /* cnt */
+
+/* We can use faster code for shift-by-1 under certain conditions.  */
+       cmp     $1,%ecx
+       jne     Rnormal
+       leal    4(%edi),%eax
+       cmpl    %esi,%eax
+       jnc     Rspecial                /* jump if res_ptr + 1 >= s_ptr */
+       leal    (%edi,%ebp,4),%eax
+       cmpl    %eax,%esi
+       jnc     Rspecial                /* jump if s_ptr >= res_ptr + size */
+
+Rnormal:
+       movl    (%esi),%edx
+       addl    $4,%esi
+       xorl    %eax,%eax
+       shrdl   %cl,%edx,%eax           /* compute carry limb */
+       pushl   %eax                    /* push carry limb onto stack */
+
+       decl    %ebp
+       pushl   %ebp
+       shrl    $3,%ebp
+       jz      Rend
+
+       movl    (%edi),%eax             /* fetch destination cache line */
+
+       ALIGN   (2)
+Roop:  movl    28(%edi),%eax           /* fetch destination cache line */
+       movl    %edx,%ebx
+
+       movl    (%esi),%eax
+       movl    4(%esi),%edx
+       shrdl   %cl,%eax,%ebx
+       shrdl   %cl,%edx,%eax
+       movl    %ebx,(%edi)
+       movl    %eax,4(%edi)
+
+       movl    8(%esi),%ebx
+       movl    12(%esi),%eax
+       shrdl   %cl,%ebx,%edx
+       shrdl   %cl,%eax,%ebx
+       movl    %edx,8(%edi)
+       movl    %ebx,12(%edi)
+
+       movl    16(%esi),%edx
+       movl    20(%esi),%ebx
+       shrdl   %cl,%edx,%eax
+       shrdl   %cl,%ebx,%edx
+       movl    %eax,16(%edi)
+       movl    %edx,20(%edi)
+
+       movl    24(%esi),%eax
+       movl    28(%esi),%edx
+       shrdl   %cl,%eax,%ebx
+       shrdl   %cl,%edx,%eax
+       movl    %ebx,24(%edi)
+       movl    %eax,28(%edi)
+
+       addl    $32,%esi
+       addl    $32,%edi
+       decl    %ebp
+       jnz     Roop
+
+Rend:  popl    %ebp
+       andl    $7,%ebp
+       jz      Rend2
+Roop2: movl    (%esi),%eax
+       shrdl   %cl,%eax,%edx           /* compute result limb */
+       movl    %edx,(%edi)
+       movl    %eax,%edx
+       addl    $4,%esi
+       addl    $4,%edi
+       decl    %ebp
+       jnz     Roop2
+
+Rend2: shrl    %cl,%edx                /* compute most significant limb */
+       movl    %edx,(%edi)             /* store it */
+
+       popl    %eax                    /* pop carry limb */
+
+       popl    %ebp
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
+/* We loop from least significant end of the arrays, which is only
+   permissable if the source and destination don't overlap, since the
+   function is documented to work for overlapping source and destination.
+*/
+
+Rspecial:
+       leal    -4(%edi,%ebp,4),%edi
+       leal    -4(%esi,%ebp,4),%esi
+
+       movl    (%esi),%edx
+       subl    $4,%esi
+
+       decl    %ebp
+       pushl   %ebp
+       shrl    $3,%ebp
+
+       shrl    $1,%edx
+       incl    %ebp
+       decl    %ebp
+       jz      RLend
+
+       movl    (%edi),%eax             /* fetch destination cache line */
+
+       ALIGN   (2)
+RLoop: movl    -28(%edi),%eax          /* fetch destination cache line */
+       movl    %edx,%ebx
+
+       movl    (%esi),%eax
+       movl    -4(%esi),%edx
+       rcrl    $1,%eax
+       movl    %ebx,(%edi)
+       rcrl    $1,%edx
+       movl    %eax,-4(%edi)
+
+       movl    -8(%esi),%ebx
+       movl    -12(%esi),%eax
+       rcrl    $1,%ebx
+       movl    %edx,-8(%edi)
+       rcrl    $1,%eax
+       movl    %ebx,-12(%edi)
+
+       movl    -16(%esi),%edx
+       movl    -20(%esi),%ebx
+       rcrl    $1,%edx
+       movl    %eax,-16(%edi)
+       rcrl    $1,%ebx
+       movl    %edx,-20(%edi)
+
+       movl    -24(%esi),%eax
+       movl    -28(%esi),%edx
+       rcrl    $1,%eax
+       movl    %ebx,-24(%edi)
+       rcrl    $1,%edx
+       movl    %eax,-28(%edi)
+
+       leal    -32(%esi),%esi          /* use leal not to clobber carry */
+       leal    -32(%edi),%edi
+       decl    %ebp
+       jnz     RLoop
+
+RLend: popl    %ebp
+       sbbl    %eax,%eax               /* save carry in %eax */
+       andl    $7,%ebp
+       jz      RLend2
+       addl    %eax,%eax               /* restore carry from eax */
+RLoop2: movl   %edx,%ebx
+       movl    (%esi),%edx
+       rcrl    $1,%edx
+       movl    %ebx,(%edi)
+
+       leal    -4(%esi),%esi           /* use leal not to clobber carry */
+       leal    -4(%edi),%edi
+       decl    %ebp
+       jnz     RLoop2
+
+       jmp     RL1
+RLend2: addl   %eax,%eax               /* restore carry from eax */
+RL1:   movl    %edx,(%edi)             /* store last limb */
+
+       movl    $0,%eax
+       rcrl    $1,%eax
+
+       popl    %ebp
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
diff --git a/mpi/i586/mpih-sub1.S b/mpi/i586/mpih-sub1.S
new file mode 100644 (file)
index 0000000..7d3045d
--- /dev/null
@@ -0,0 +1,145 @@
+/* i80586 sub_n -- Sub two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (sp + 4)
+ *                mpi_ptr_t s1_ptr,    (sp + 8)
+ *                mpi_ptr_t s2_ptr,    (sp + 12)
+ *                mpi_size_t size)     (sp + 16)
+ */
+
+
+.text
+       ALIGN (3)
+       .globl C_SYMBOL_NAME(mpihelp_sub_n)
+C_SYMBOL_NAME(mpihelp_sub_n:)
+
+       pushl   %edi
+       pushl   %esi
+       pushl   %ebx
+       pushl   %ebp
+
+       movl    20(%esp),%edi           /* res_ptr */
+       movl    24(%esp),%esi           /* s1_ptr */
+       movl    28(%esp),%ebp           /* s2_ptr */
+       movl    32(%esp),%ecx           /* size */
+
+       movl    (%ebp),%ebx
+
+       decl    %ecx
+       movl    %ecx,%edx
+       shrl    $3,%ecx
+       andl    $7,%edx
+       testl   %ecx,%ecx               /* zero carry flag */
+       jz      Lend
+       pushl   %edx
+
+       ALIGN (3)
+Loop:  movl    28(%edi),%eax           /* fetch destination cache line */
+       leal    32(%edi),%edi
+
+L1:    movl    (%esi),%eax
+       movl    4(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    8(%ebp),%ebx
+       movl    %eax,-32(%edi)
+       movl    %edx,-28(%edi)
+
+L2:    movl    8(%esi),%eax
+       movl    12(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    12(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    16(%ebp),%ebx
+       movl    %eax,-24(%edi)
+       movl    %edx,-20(%edi)
+
+L3:    movl    16(%esi),%eax
+       movl    20(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    20(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    24(%ebp),%ebx
+       movl    %eax,-16(%edi)
+       movl    %edx,-12(%edi)
+
+L4:    movl    24(%esi),%eax
+       movl    28(%esi),%edx
+       sbbl    %ebx,%eax
+       movl    28(%ebp),%ebx
+       sbbl    %ebx,%edx
+       movl    32(%ebp),%ebx
+       movl    %eax,-8(%edi)
+       movl    %edx,-4(%edi)
+
+       leal    32(%esi),%esi
+       leal    32(%ebp),%ebp
+       decl    %ecx
+       jnz     Loop
+
+       popl    %edx
+Lend:
+       decl    %edx                    /* test %edx w/o clobbering carry */
+       js      Lend2
+       incl    %edx
+Loop2:
+       leal    4(%edi),%edi
+       movl    (%esi),%eax
+       sbbl    %ebx,%eax
+       movl    4(%ebp),%ebx
+       movl    %eax,-4(%edi)
+       leal    4(%esi),%esi
+       leal    4(%ebp),%ebp
+       decl    %edx
+       jnz     Loop2
+Lend2:
+       movl    (%esi),%eax
+       sbbl    %ebx,%eax
+       movl    %eax,(%edi)
+
+       sbbl    %eax,%eax
+       negl    %eax
+
+       popl    %ebp
+       popl    %ebx
+       popl    %esi
+       popl    %edi
+       ret
+
diff --git a/mpi/longlong.h b/mpi/longlong.h
new file mode 100644 (file)
index 0000000..c0f845c
--- /dev/null
@@ -0,0 +1,1557 @@
+/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
+   Note: I added some stuff for use with gnupg
+
+Copyright (C) 1991, 1992, 1993, 1994, 1996, 1998,
+              2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+This file is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this file; see the file COPYING.LIB.  If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+/* You have to define the following before including this file:
+
+   UWtype -- An unsigned type, default type for operations (typically a "word")
+   UHWtype -- An unsigned type, at least half the size of UWtype.
+   UDWtype -- An unsigned type, at least twice as large a UWtype
+   W_TYPE_SIZE -- size in bits of UWtype
+
+   SItype, USItype -- Signed and unsigned 32 bit types.
+   DItype, UDItype -- Signed and unsigned 64 bit types.
+
+   On a 32 bit machine UWtype should typically be USItype;
+   on a 64 bit machine, UWtype should typically be UDItype.
+*/
+
+#define __BITS4 (W_TYPE_SIZE / 4)
+#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
+#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
+#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
+
+/* This is used to make sure no undesirable sharing between different libraries
+   that use this file takes place.  */
+#ifndef __MPN
+#define __MPN(x) __##x
+#endif
+
+/* Define auxiliary asm macros.
+
+   1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two
+   UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
+   word product in HIGH_PROD and LOW_PROD.
+
+   2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
+   UDWtype product.  This is just a variant of umul_ppmm.
+
+   3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
+   denominator) divides a UDWtype, composed by the UWtype integers
+   HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
+   in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less
+   than DENOMINATOR for correct operation.  If, in addition, the most
+   significant bit of DENOMINATOR must be 1, then the pre-processor symbol
+   UDIV_NEEDS_NORMALIZATION is defined to 1.
+
+   4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
+   denominator).  Like udiv_qrnnd but the numbers are signed.  The quotient
+   is rounded towards 0.
+
+   5) count_leading_zeros(count, x) counts the number of zero-bits from the
+   msb to the first non-zero bit in the UWtype X.  This is the number of
+   steps X needs to be shifted left to set the msb.  Undefined for X == 0,
+   unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
+
+   6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
+   from the least significant end.
+
+   7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
+   high_addend_2, low_addend_2) adds two UWtype integers, composed by
+   HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
+   respectively.  The result is placed in HIGH_SUM and LOW_SUM.  Overflow
+   (i.e. carry out) is not stored anywhere, and is lost.
+
+   8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
+   high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
+   composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
+   LOW_SUBTRAHEND_2 respectively.  The result is placed in HIGH_DIFFERENCE
+   and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
+   and is lost.
+
+   If any of these macros are left undefined for a particular CPU,
+   C macros are used.  */
+
+/* The CPUs come in alphabetical order below.
+
+   Please add support for more CPUs here, or improve the current support
+   for the CPUs below! */
+
+#if defined (__GNUC__) && !defined (NO_ASM)
+
+/* We sometimes need to clobber "cc" with gcc2, but that would not be
+   understood by gcc1. Use cpp to avoid major code duplication.  */
+#if __GNUC__ < 2
+#define __CLOBBER_CC
+#define __AND_CLOBBER_CC
+#else /* __GNUC__ >= 2 */
+#define __CLOBBER_CC : "cc"
+#define __AND_CLOBBER_CC , "cc"
+#endif /* __GNUC__ < 2 */
+
+
+/***************************************
+ **************  A29K  *****************
+ ***************************************/
+#if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("add %1,%4,%5\n"   \
+           "addc %0,%2,%3"                                              \
+          : "=r" ((USItype)(sh)),                                      \
+           "=&r" ((USItype)(sl))                                       \
+          : "%r" ((USItype)(ah)),                                      \
+            "rI" ((USItype)(bh)),                                      \
+            "%r" ((USItype)(al)),                                      \
+            "rI" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("sub %1,%4,%5\n"                                             \
+          "subc %0,%2,%3"                                              \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "r" ((USItype)(ah)),                                       \
+            "rI" ((USItype)(bh)),                                      \
+            "r" ((USItype)(al)),                                       \
+            "rI" ((USItype)(bl)))
+#define umul_ppmm(xh, xl, m0, m1) \
+  do {                                                                 \
+    USItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("multiplu %0,%1,%2"                                        \
+            : "=r" ((USItype)(xl))                                     \
+            : "r" (__m0),                                              \
+              "r" (__m1));                                             \
+    __asm__ ("multmu %0,%1,%2"                                          \
+            : "=r" ((USItype)(xh))                                     \
+            : "r" (__m0),                                              \
+              "r" (__m1));                                             \
+  } while (0)
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  __asm__ ("dividu %0,%3,%4"                                            \
+          : "=r" ((USItype)(q)),                                       \
+            "=q" ((USItype)(r))                                        \
+          : "1" ((USItype)(n1)),                                       \
+            "r" ((USItype)(n0)),                                       \
+            "r" ((USItype)(d)))
+#define count_leading_zeros(count, x) \
+    __asm__ ("clz %0,%1"                                                \
+            : "=r" ((USItype)(count))                                  \
+            : "r" ((USItype)(x)))
+#define COUNT_LEADING_ZEROS_0 32
+#endif /* __a29k__ */
+
+
+#if defined (__alpha) && W_TYPE_SIZE == 64
+#define umul_ppmm(ph, pl, m0, m1) \
+  do {                                                                 \
+    UDItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("umulh %r1,%2,%0"                                          \
+            : "=r" ((UDItype) ph)                                      \
+            : "%rJ" (__m0),                                            \
+              "rI" (__m1));                                            \
+    (pl) = __m0 * __m1;                                                \
+  } while (0)
+#define UMUL_TIME 46
+#ifndef LONGLONG_STANDALONE
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  do { UDItype __r;                                                    \
+    (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                        \
+    (r) = __r;                                                         \
+  } while (0)
+extern UDItype __udiv_qrnnd ();
+#define UDIV_TIME 220
+#endif /* LONGLONG_STANDALONE */
+#endif /* __alpha */
+
+/***************************************
+ **************  ARM  ******************
+ ***************************************/
+#if defined (__arm__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("adds %1, %4, %5\n"                                          \
+          "adc  %0, %2, %3"                                            \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%r" ((USItype)(ah)),                                      \
+            "rI" ((USItype)(bh)),                                      \
+            "%r" ((USItype)(al)),                                      \
+            "rI" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subs %1, %4, %5\n"                                          \
+          "sbc  %0, %2, %3"                                            \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "r" ((USItype)(ah)),                                       \
+            "rI" ((USItype)(bh)),                                      \
+            "r" ((USItype)(al)),                                       \
+            "rI" ((USItype)(bl)))
+#if defined __ARM_ARCH_2__ || defined __ARM_ARCH_3__
+#define umul_ppmm(xh, xl, a, b) \
+  __asm__ ("%@ Inlined umul_ppmm\n"                                     \
+       "mov    %|r0, %2, lsr #16               @ AAAA\n"               \
+       "mov    %|r2, %3, lsr #16               @ BBBB\n"               \
+       "bic    %|r1, %2, %|r0, lsl #16         @ aaaa\n"               \
+       "bic    %0, %3, %|r2, lsl #16           @ bbbb\n"               \
+       "mul    %1, %|r1, %|r2                  @ aaaa * BBBB\n"        \
+       "mul    %|r2, %|r0, %|r2                @ AAAA * BBBB\n"        \
+       "mul    %|r1, %0, %|r1                  @ aaaa * bbbb\n"        \
+       "mul    %0, %|r0, %0                    @ AAAA * bbbb\n"        \
+       "adds   %|r0, %1, %0                    @ central sum\n"        \
+       "addcs  %|r2, %|r2, #65536\n"                                   \
+       "adds   %1, %|r1, %|r0, lsl #16\n"                              \
+       "adc    %0, %|r2, %|r0, lsr #16"                                \
+          : "=&r" ((USItype)(xh)),                                     \
+            "=r" ((USItype)(xl))                                       \
+          : "r" ((USItype)(a)),                                        \
+            "r" ((USItype)(b))                                         \
+          : "r0", "r1", "r2")
+#else
+#define umul_ppmm(xh, xl, a, b)                                         \
+  __asm__ ("%@ Inlined umul_ppmm\n"                                     \
+          "umull %r1, %r0, %r2, %r3"                                   \
+                  : "=&r" ((USItype)(xh)),                             \
+                    "=r" ((USItype)(xl))                               \
+                  : "r" ((USItype)(a)),                                \
+                    "r" ((USItype)(b))                                 \
+                  : "r0", "r1")
+#endif
+#define UMUL_TIME 20
+#define UDIV_TIME 100
+#endif /* __arm__ */
+
+/***************************************
+ **************  CLIPPER  **************
+ ***************************************/
+#if defined (__clipper__) && W_TYPE_SIZE == 32
+#define umul_ppmm(w1, w0, u, v) \
+  ({union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __xx;                                                       \
+  __asm__ ("mulwux %2,%0"                                               \
+          : "=r" (__xx.__ll)                                           \
+          : "%0" ((USItype)(u)),                                       \
+            "r" ((USItype)(v)));                                       \
+  (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
+#define smul_ppmm(w1, w0, u, v) \
+  ({union {DItype __ll;                                                \
+          struct {SItype __l, __h;} __i;                               \
+         } __xx;                                                       \
+  __asm__ ("mulwx %2,%0"                                                \
+          : "=r" (__xx.__ll)                                           \
+          : "%0" ((SItype)(u)),                                        \
+            "r" ((SItype)(v)));                                        \
+  (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
+#define __umulsidi3(u, v) \
+  ({UDItype __w;                                                       \
+    __asm__ ("mulwux %2,%0"                                             \
+            : "=r" (__w)                                               \
+            : "%0" ((USItype)(u)),                                     \
+              "r" ((USItype)(v)));                                     \
+    __w; })
+#endif /* __clipper__ */
+
+
+/***************************************
+ **************  GMICRO  ***************
+ ***************************************/
+#if defined (__gmicro__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("add.w %5,%1\n"                                              \
+          "addx %3,%0"                                                 \
+          : "=g" ((USItype)(sh)),                                      \
+            "=&g" ((USItype)(sl))                                      \
+          : "%0" ((USItype)(ah)),                                      \
+            "g" ((USItype)(bh)),                                       \
+            "%1" ((USItype)(al)),                                      \
+            "g" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("sub.w %5,%1\n"                                              \
+          "subx %3,%0"                                                 \
+          : "=g" ((USItype)(sh)),                                      \
+            "=&g" ((USItype)(sl))                                      \
+          : "0" ((USItype)(ah)),                                       \
+            "g" ((USItype)(bh)),                                       \
+            "1" ((USItype)(al)),                                       \
+            "g" ((USItype)(bl)))
+#define umul_ppmm(ph, pl, m0, m1) \
+  __asm__ ("mulx %3,%0,%1"                                              \
+          : "=g" ((USItype)(ph)),                                      \
+            "=r" ((USItype)(pl))                                       \
+          : "%0" ((USItype)(m0)),                                      \
+            "g" ((USItype)(m1)))
+#define udiv_qrnnd(q, r, nh, nl, d) \
+  __asm__ ("divx %4,%0,%1"                                              \
+          : "=g" ((USItype)(q)),                                       \
+            "=r" ((USItype)(r))                                        \
+          : "1" ((USItype)(nh)),                                       \
+            "0" ((USItype)(nl)),                                       \
+            "g" ((USItype)(d)))
+#define count_leading_zeros(count, x) \
+  __asm__ ("bsch/1 %1,%0"                                               \
+          : "=g" (count)                                               \
+          : "g" ((USItype)(x)),                                        \
+            "0" ((USItype)0))
+#endif
+
+
+/***************************************
+ **************  HPPA  *****************
+ ***************************************/
+#if defined (__hppa) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("   add %4,%5,%1\n"                                             \
+          "    addc %2,%3,%0"                                              \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%rM" ((USItype)(ah)),                                     \
+            "rM" ((USItype)(bh)),                                      \
+            "%rM" ((USItype)(al)),                                     \
+            "rM" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("   sub %4,%5,%1\n"                                             \
+          "    subb %2,%3,%0"                                              \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "rM" ((USItype)(ah)),                                      \
+            "rM" ((USItype)(bh)),                                      \
+            "rM" ((USItype)(al)),                                      \
+            "rM" ((USItype)(bl)))
+#if defined (_PA_RISC1_1)
+#define umul_ppmm(wh, wl, u, v) \
+  do {                                                                 \
+    union {UDItype __ll;                                               \
+          struct {USItype __h, __l;} __i;                              \
+         } __xx;                                                       \
+    __asm__ (" xmpyu %1,%2,%0"                                           \
+            : "=*f" (__xx.__ll)                                        \
+            : "*f" ((USItype)(u)),                                     \
+              "*f" ((USItype)(v)));                                    \
+    (wh) = __xx.__i.__h;                                               \
+    (wl) = __xx.__i.__l;                                               \
+  } while (0)
+#define UMUL_TIME 8
+#define UDIV_TIME 60
+#else
+#define UMUL_TIME 40
+#define UDIV_TIME 80
+#endif
+#ifndef LONGLONG_STANDALONE
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  do { USItype __r;                                                    \
+    (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                        \
+    (r) = __r;                                                         \
+  } while (0)
+extern USItype __udiv_qrnnd ();
+#endif /* LONGLONG_STANDALONE */
+#define count_leading_zeros(count, x) \
+  do {                                                                \
+    USItype __tmp;                                                    \
+    __asm__ (                                                         \
+       "       ldi             1,%0                                       \n" \
+       "       extru,=         %1,15,16,%%r0  ; Bits 31..16 zero?         \n" \
+       "       extru,tr        %1,15,16,%1    ; No.  Shift down, skip add.\n" \
+       "       ldo             16(%0),%0      ; Yes.   Perform add.       \n" \
+       "       extru,=         %1,23,8,%%r0   ; Bits 15..8 zero?          \n" \
+       "       extru,tr        %1,23,8,%1     ; No.  Shift down, skip add.\n" \
+       "       ldo             8(%0),%0       ; Yes.   Perform add.       \n" \
+       "       extru,=         %1,27,4,%%r0   ; Bits 7..4 zero?           \n" \
+       "       extru,tr        %1,27,4,%1     ; No.  Shift down, skip add.\n" \
+       "       ldo             4(%0),%0       ; Yes.   Perform add.       \n" \
+       "       extru,=         %1,29,2,%%r0   ; Bits 3..2 zero?           \n" \
+       "       extru,tr        %1,29,2,%1     ; No.  Shift down, skip add.\n" \
+       "       ldo             2(%0),%0       ; Yes.   Perform add.       \n" \
+       "       extru           %1,30,1,%1     ; Extract bit 1.            \n" \
+       "       sub             %0,%1,%0       ; Subtract it.              "   \
+       : "=r" (count), "=r" (__tmp) : "1" (x));                        \
+  } while (0)
+#endif /* hppa */
+
+
+/***************************************
+ **************  I370  *****************
+ ***************************************/
+#if (defined (__i370__) || defined (__mvs__)) && W_TYPE_SIZE == 32
+#define umul_ppmm(xh, xl, m0, m1) \
+  do {                                                                 \
+    union {UDItype __ll;                                               \
+          struct {USItype __h, __l;} __i;                              \
+         } __xx;                                                       \
+    USItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("mr %0,%3"                                                 \
+            : "=r" (__xx.__i.__h),                                     \
+              "=r" (__xx.__i.__l)                                      \
+            : "%1" (__m0),                                             \
+              "r" (__m1));                                             \
+    (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
+    (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
+            + (((SItype) __m1 >> 31) & __m0));                         \
+  } while (0)
+#define smul_ppmm(xh, xl, m0, m1) \
+  do {                                                                 \
+    union {DItype __ll;                                                \
+          struct {USItype __h, __l;} __i;                              \
+         } __xx;                                                       \
+    __asm__ ("mr %0,%3"                                                 \
+            : "=r" (__xx.__i.__h),                                     \
+              "=r" (__xx.__i.__l)                                      \
+            : "%1" (m0),                                               \
+              "r" (m1));                                               \
+    (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
+  } while (0)
+#define sdiv_qrnnd(q, r, n1, n0, d) \
+  do {                                                                 \
+    union {DItype __ll;                                                \
+          struct {USItype __h, __l;} __i;                              \
+         } __xx;                                                       \
+    __xx.__i.__h = n1; __xx.__i.__l = n0;                              \
+    __asm__ ("dr %0,%2"                                                 \
+            : "=r" (__xx.__ll)                                         \
+            : "0" (__xx.__ll), "r" (d));                               \
+    (q) = __xx.__i.__l; (r) = __xx.__i.__h;                            \
+  } while (0)
+#endif
+
+
+/***************************************
+ **************  I386  *****************
+ ***************************************/
+#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("addl %5,%1\n"                                               \
+          "adcl %3,%0"                                                 \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%0" ((USItype)(ah)),                                      \
+            "g" ((USItype)(bh)),                                       \
+            "%1" ((USItype)(al)),                                      \
+            "g" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subl %5,%1\n"                                               \
+          "sbbl %3,%0"                                                 \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "0" ((USItype)(ah)),                                       \
+            "g" ((USItype)(bh)),                                       \
+            "1" ((USItype)(al)),                                       \
+            "g" ((USItype)(bl)))
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("mull %3"                                                    \
+          : "=a" ((USItype)(w0)),                                      \
+            "=d" ((USItype)(w1))                                       \
+          : "%0" ((USItype)(u)),                                       \
+            "rm" ((USItype)(v)))
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  __asm__ ("divl %4"                                                    \
+          : "=a" ((USItype)(q)),                                       \
+            "=d" ((USItype)(r))                                        \
+          : "0" ((USItype)(n0)),                                       \
+            "1" ((USItype)(n1)),                                       \
+            "rm" ((USItype)(d)))
+#define count_leading_zeros(count, x) \
+  do {                                                                 \
+    USItype __cbtmp;                                                   \
+    __asm__ ("bsrl %1,%0"                                               \
+            : "=r" (__cbtmp) : "rm" ((USItype)(x)));                   \
+    (count) = __cbtmp ^ 31;                                            \
+  } while (0)
+#define count_trailing_zeros(count, x) \
+  __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x)))
+#ifndef UMUL_TIME
+#define UMUL_TIME 40
+#endif
+#ifndef UDIV_TIME
+#define UDIV_TIME 40
+#endif
+#endif /* 80x86 */
+
+
+/***************************************
+ **************  I860  *****************
+ ***************************************/
+#if defined (__i860__) && W_TYPE_SIZE == 32
+#define rshift_rhlc(r,h,l,c) \
+  __asm__ ("shr %3,r0,r0\n"  \
+           "shrd %1,%2,%0"   \
+          "=r" (r) : "r" (h), "r" (l), "rn" (c))
+#endif /* i860 */
+
+/***************************************
+ **************  I960  *****************
+ ***************************************/
+#if defined (__i960__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("cmpo 1,0\n"      \
+           "addc %5,%4,%1\n" \
+           "addc %3,%2,%0"   \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%dI" ((USItype)(ah)),                                     \
+            "dI" ((USItype)(bh)),                                      \
+            "%dI" ((USItype)(al)),                                     \
+            "dI" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("cmpo 0,0\n"      \
+           "subc %5,%4,%1\n" \
+           "subc %3,%2,%0"   \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "dI" ((USItype)(ah)),                                      \
+            "dI" ((USItype)(bh)),                                      \
+            "dI" ((USItype)(al)),                                      \
+            "dI" ((USItype)(bl)))
+#define umul_ppmm(w1, w0, u, v) \
+  ({union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __xx;                                                       \
+  __asm__ ("emul        %2,%1,%0"                                       \
+          : "=d" (__xx.__ll)                                           \
+          : "%dI" ((USItype)(u)),                                      \
+            "dI" ((USItype)(v)));                                      \
+  (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
+#define __umulsidi3(u, v) \
+  ({UDItype __w;                                                       \
+    __asm__ ("emul      %2,%1,%0"                                       \
+            : "=d" (__w)                                               \
+            : "%dI" ((USItype)(u)),                                    \
+              "dI" ((USItype)(v)));                                    \
+    __w; })
+#define udiv_qrnnd(q, r, nh, nl, d) \
+  do {                                                                 \
+    union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __nn;                                                       \
+    __nn.__i.__h = (nh); __nn.__i.__l = (nl);                          \
+    __asm__ ("ediv %d,%n,%0"                                            \
+          : "=d" (__rq.__ll)                                           \
+          : "dI" (__nn.__ll),                                          \
+            "dI" ((USItype)(d)));                                      \
+    (r) = __rq.__i.__l; (q) = __rq.__i.__h;                            \
+  } while (0)
+#define count_leading_zeros(count, x) \
+  do {                                                                 \
+    USItype __cbtmp;                                                   \
+    __asm__ ("scanbit %1,%0"                                            \
+            : "=r" (__cbtmp)                                           \
+            : "r" ((USItype)(x)));                                     \
+    (count) = __cbtmp ^ 31;                                            \
+  } while (0)
+#define COUNT_LEADING_ZEROS_0 (-32) /* sic */
+#if defined (__i960mx)         /* what is the proper symbol to test??? */
+#define rshift_rhlc(r,h,l,c) \
+  do {                                                                 \
+    union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __nn;                                                       \
+    __nn.__i.__h = (h); __nn.__i.__l = (l);                            \
+    __asm__ ("shre %2,%1,%0"                                            \
+            : "=d" (r) : "dI" (__nn.__ll), "dI" (c));                  \
+  }
+#endif /* i960mx */
+#endif /* i960 */
+
+
+/***************************************
+ **************  68000 ****************
+ ***************************************/
+#if (defined (__mc68000__) || defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("add%.l %5,%1\n"                                             \
+          "addx%.l %3,%0"                                              \
+          : "=d" ((USItype)(sh)),                                      \
+            "=&d" ((USItype)(sl))                                      \
+          : "%0" ((USItype)(ah)),                                      \
+            "d" ((USItype)(bh)),                                       \
+            "%1" ((USItype)(al)),                                      \
+            "g" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("sub%.l %5,%1\n"                                             \
+          "subx%.l %3,%0"                                              \
+          : "=d" ((USItype)(sh)),                                      \
+            "=&d" ((USItype)(sl))                                      \
+          : "0" ((USItype)(ah)),                                       \
+            "d" ((USItype)(bh)),                                       \
+            "1" ((USItype)(al)),                                       \
+            "g" ((USItype)(bl)))
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("mulu%.l %3,%1:%0"                                           \
+          : "=d" ((USItype)(w0)),                                      \
+            "=d" ((USItype)(w1))                                       \
+          : "%0" ((USItype)(u)),                                       \
+            "dmi" ((USItype)(v)))
+#define UMUL_TIME 45
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  __asm__ ("divu%.l %4,%1:%0"                                           \
+          : "=d" ((USItype)(q)),                                       \
+            "=d" ((USItype)(r))                                        \
+          : "0" ((USItype)(n0)),                                       \
+            "1" ((USItype)(n1)),                                       \
+            "dmi" ((USItype)(d)))
+#define UDIV_TIME 90
+#define sdiv_qrnnd(q, r, n1, n0, d) \
+  __asm__ ("divs%.l %4,%1:%0"                                           \
+          : "=d" ((USItype)(q)),                                       \
+            "=d" ((USItype)(r))                                        \
+          : "0" ((USItype)(n0)),                                       \
+            "1" ((USItype)(n1)),                                       \
+            "dmi" ((USItype)(d)))
+#define count_leading_zeros(count, x) \
+  __asm__ ("bfffo %1{%b2:%b2},%0"                                       \
+          : "=d" ((USItype)(count))                                    \
+          : "od" ((USItype)(x)), "n" (0))
+#define COUNT_LEADING_ZEROS_0 32
+#else /* not mc68020 */
+#define umul_ppmm(xh, xl, a, b) \
+  do { USItype __umul_tmp1, __umul_tmp2;                         \
+       __asm__ ("| Inlined umul_ppmm                         \n" \
+ "        move%.l %5,%3                                       \n" \
+ "        move%.l %2,%0                                       \n" \
+ "        move%.w %3,%1                                       \n" \
+ "        swap %3                                            \n" \
+ "        swap %0                                            \n" \
+ "        mulu %2,%1                                         \n" \
+ "        mulu %3,%0                                         \n" \
+ "        mulu %2,%3                                         \n" \
+ "        swap %2                                            \n" \
+ "        mulu %5,%2                                         \n" \
+ "        add%.l       %3,%2                                 \n" \
+ "        jcc  1f                                            \n" \
+ "        add%.l       %#0x10000,%0                          \n" \
+ "1:   move%.l %2,%3                                         \n" \
+ "        clr%.w       %2                                    \n" \
+ "        swap %2                                            \n" \
+ "        swap %3                                            \n" \
+ "        clr%.w       %3                                    \n" \
+ "        add%.l       %3,%1                                 \n" \
+ "        addx%.l %2,%0                                       \n" \
+ "        | End inlined umul_ppmm"                                \
+             : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)),     \
+               "=d" (__umul_tmp1), "=&d" (__umul_tmp2)           \
+             : "%2" ((USItype)(a)), "d" ((USItype)(b)));         \
+  } while (0)
+#define UMUL_TIME 100
+#define UDIV_TIME 400
+#endif /* not mc68020 */
+#endif /* mc68000 */
+
+
+/***************************************
+ **************  88000 ****************
+ ***************************************/
+#if defined (__m88000__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("addu.co %1,%r4,%r5\n"                                       \
+          "addu.ci %0,%r2,%r3"                                         \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%rJ" ((USItype)(ah)),                                     \
+            "rJ" ((USItype)(bh)),                                      \
+            "%rJ" ((USItype)(al)),                                     \
+            "rJ" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subu.co %1,%r4,%r5\n"                                       \
+          "subu.ci %0,%r2,%r3"                                         \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "rJ" ((USItype)(ah)),                                      \
+            "rJ" ((USItype)(bh)),                                      \
+            "rJ" ((USItype)(al)),                                      \
+            "rJ" ((USItype)(bl)))
+#define count_leading_zeros(count, x) \
+  do {                                                                 \
+    USItype __cbtmp;                                                   \
+    __asm__ ("ff1 %0,%1"                                                \
+            : "=r" (__cbtmp)                                           \
+            : "r" ((USItype)(x)));                                     \
+    (count) = __cbtmp ^ 31;                                            \
+  } while (0)
+#define COUNT_LEADING_ZEROS_0 63 /* sic */
+#if defined (__m88110__)
+#define umul_ppmm(wh, wl, u, v) \
+  do {                                                                 \
+    union {UDItype __ll;                                               \
+          struct {USItype __h, __l;} __i;                              \
+         } __x;                                                        \
+    __asm__ ("mulu.d %0,%1,%2" : "=r" (__x.__ll) : "r" (u), "r" (v));   \
+    (wh) = __x.__i.__h;                                                \
+    (wl) = __x.__i.__l;                                                \
+  } while (0)
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  ({union {UDItype __ll;                                               \
+          struct {USItype __h, __l;} __i;                              \
+         } __x, __q;                                                   \
+  __x.__i.__h = (n1); __x.__i.__l = (n0);                              \
+  __asm__ ("divu.d %0,%1,%2"                                            \
+          : "=r" (__q.__ll) : "r" (__x.__ll), "r" (d));                \
+  (r) = (n0) - __q.__l * (d); (q) = __q.__l; })
+#define UMUL_TIME 5
+#define UDIV_TIME 25
+#else
+#define UMUL_TIME 17
+#define UDIV_TIME 150
+#endif /* __m88110__ */
+#endif /* __m88000__ */
+
+/***************************************
+ **************  MIPS  *****************
+ ***************************************/
+#if defined (__mips__) && W_TYPE_SIZE == 32
+#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("multu %2,%3"                                                \
+          : "=l" ((USItype)(w0)),                                      \
+            "=h" ((USItype)(w1))                                       \
+          : "d" ((USItype)(u)),                                        \
+            "d" ((USItype)(v)))
+#else
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("multu %2,%3 \n" \
+          "mflo %0 \n"     \
+          "mfhi %1"                                                        \
+          : "=d" ((USItype)(w0)),                                      \
+            "=d" ((USItype)(w1))                                       \
+          : "d" ((USItype)(u)),                                        \
+            "d" ((USItype)(v)))
+#endif
+#define UMUL_TIME 10
+#define UDIV_TIME 100
+#endif /* __mips__ */
+
+/***************************************
+ **************  MIPS/64  **************
+ ***************************************/
+#if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64
+#if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("dmultu %2,%3"                                               \
+          : "=l" ((UDItype)(w0)),                                      \
+            "=h" ((UDItype)(w1))                                       \
+          : "d" ((UDItype)(u)),                                        \
+            "d" ((UDItype)(v)))
+#else
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("dmultu %2,%3 \n"    \
+          "mflo %0 \n"         \
+          "mfhi %1"                                                        \
+          : "=d" ((UDItype)(w0)),                                      \
+            "=d" ((UDItype)(w1))                                       \
+          : "d" ((UDItype)(u)),                                        \
+            "d" ((UDItype)(v)))
+#endif
+#define UMUL_TIME 20
+#define UDIV_TIME 140
+#endif /* __mips__ */
+
+
+/***************************************
+ **************  32000 ****************
+ ***************************************/
+#if defined (__ns32000__) && W_TYPE_SIZE == 32
+#define umul_ppmm(w1, w0, u, v) \
+  ({union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __xx;                                                       \
+  __asm__ ("meid %2,%0"                                                 \
+          : "=g" (__xx.__ll)                                           \
+          : "%0" ((USItype)(u)),                                       \
+            "g" ((USItype)(v)));                                       \
+  (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
+#define __umulsidi3(u, v) \
+  ({UDItype __w;                                                       \
+    __asm__ ("meid %2,%0"                                               \
+            : "=g" (__w)                                               \
+            : "%0" ((USItype)(u)),                                     \
+              "g" ((USItype)(v)));                                     \
+    __w; })
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  ({union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __xx;                                                       \
+  __xx.__i.__h = (n1); __xx.__i.__l = (n0);                            \
+  __asm__ ("deid %2,%0"                                                 \
+          : "=g" (__xx.__ll)                                           \
+          : "0" (__xx.__ll),                                           \
+            "g" ((USItype)(d)));                                       \
+  (r) = __xx.__i.__l; (q) = __xx.__i.__h; })
+#define count_trailing_zeros(count,x) \
+  do {
+    __asm__ ("ffsd      %2,%0"                                          \
+            : "=r" ((USItype) (count))                                 \
+            : "0" ((USItype) 0),                                       \
+              "r" ((USItype) (x)));                                    \
+  } while (0)
+#endif /* __ns32000__ */
+
+
+/***************************************
+ **************  PPC  ******************
+ ***************************************/
+#if (defined (_ARCH_PPC) || defined (_IBMR2)) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  do {                                                                 \
+    if (__builtin_constant_p (bh) && (bh) == 0)                        \
+      __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"           \
+            : "=r" ((USItype)(sh)),                                    \
+              "=&r" ((USItype)(sl))                                    \
+            : "%r" ((USItype)(ah)),                                    \
+              "%r" ((USItype)(al)),                                    \
+              "rI" ((USItype)(bl)));                                   \
+    else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)         \
+      __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"           \
+            : "=r" ((USItype)(sh)),                                    \
+              "=&r" ((USItype)(sl))                                    \
+            : "%r" ((USItype)(ah)),                                    \
+              "%r" ((USItype)(al)),                                    \
+              "rI" ((USItype)(bl)));                                   \
+    else                                                               \
+      __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"          \
+            : "=r" ((USItype)(sh)),                                    \
+              "=&r" ((USItype)(sl))                                    \
+            : "%r" ((USItype)(ah)),                                    \
+              "r" ((USItype)(bh)),                                     \
+              "%r" ((USItype)(al)),                                    \
+              "rI" ((USItype)(bl)));                                   \
+  } while (0)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  do {                                                                 \
+    if (__builtin_constant_p (ah) && (ah) == 0)                        \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"       \
+              : "=r" ((USItype)(sh)),                                  \
+                "=&r" ((USItype)(sl))                                  \
+              : "r" ((USItype)(bh)),                                   \
+                "rI" ((USItype)(al)),                                  \
+                "r" ((USItype)(bl)));                                  \
+    else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0)         \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"       \
+              : "=r" ((USItype)(sh)),                                  \
+                "=&r" ((USItype)(sl))                                  \
+              : "r" ((USItype)(bh)),                                   \
+                "rI" ((USItype)(al)),                                  \
+                "r" ((USItype)(bl)));                                  \
+    else if (__builtin_constant_p (bh) && (bh) == 0)                   \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"         \
+              : "=r" ((USItype)(sh)),                                  \
+                "=&r" ((USItype)(sl))                                  \
+              : "r" ((USItype)(ah)),                                   \
+                "rI" ((USItype)(al)),                                  \
+                "r" ((USItype)(bl)));                                  \
+    else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)         \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"         \
+              : "=r" ((USItype)(sh)),                                  \
+                "=&r" ((USItype)(sl))                                  \
+              : "r" ((USItype)(ah)),                                   \
+                "rI" ((USItype)(al)),                                  \
+                "r" ((USItype)(bl)));                                  \
+    else                                                               \
+      __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"      \
+              : "=r" ((USItype)(sh)),                                  \
+                "=&r" ((USItype)(sl))                                  \
+              : "r" ((USItype)(ah)),                                   \
+                "r" ((USItype)(bh)),                                   \
+                "rI" ((USItype)(al)),                                  \
+                "r" ((USItype)(bl)));                                  \
+  } while (0)
+#define count_leading_zeros(count, x) \
+  __asm__ ("{cntlz|cntlzw} %0,%1"                                       \
+          : "=r" ((USItype)(count))                                    \
+          : "r" ((USItype)(x)))
+#define COUNT_LEADING_ZEROS_0 32
+#if defined (_ARCH_PPC)
+#define umul_ppmm(ph, pl, m0, m1) \
+  do {                                                                 \
+    USItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("mulhwu %0,%1,%2"                                          \
+            : "=r" ((USItype) ph)                                      \
+            : "%r" (__m0),                                             \
+              "r" (__m1));                                             \
+    (pl) = __m0 * __m1;                                                \
+  } while (0)
+#define UMUL_TIME 15
+#define smul_ppmm(ph, pl, m0, m1) \
+  do {                                                                 \
+    SItype __m0 = (m0), __m1 = (m1);                                   \
+    __asm__ ("mulhw %0,%1,%2"                                           \
+            : "=r" ((SItype) ph)                                       \
+            : "%r" (__m0),                                             \
+              "r" (__m1));                                             \
+    (pl) = __m0 * __m1;                                                \
+  } while (0)
+#define SMUL_TIME 14
+#define UDIV_TIME 120
+#else
+#define umul_ppmm(xh, xl, m0, m1) \
+  do {                                                                 \
+    USItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("mul %0,%2,%3"                                             \
+            : "=r" ((USItype)(xh)),                                    \
+              "=q" ((USItype)(xl))                                     \
+            : "r" (__m0),                                              \
+              "r" (__m1));                                             \
+    (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
+            + (((SItype) __m1 >> 31) & __m0));                         \
+  } while (0)
+#define UMUL_TIME 8
+#define smul_ppmm(xh, xl, m0, m1) \
+  __asm__ ("mul %0,%2,%3"                                               \
+          : "=r" ((SItype)(xh)),                                       \
+            "=q" ((SItype)(xl))                                        \
+          : "r" (m0),                                                  \
+            "r" (m1))
+#define SMUL_TIME 4
+#define sdiv_qrnnd(q, r, nh, nl, d) \
+  __asm__ ("div %0,%2,%4"                                               \
+          : "=r" ((SItype)(q)), "=q" ((SItype)(r))                     \
+          : "r" ((SItype)(nh)), "1" ((SItype)(nl)), "r" ((SItype)(d)))
+#define UDIV_TIME 100
+#endif
+#endif /* Power architecture variants. */
+
+/* Powerpc 64 bit support taken from gmp-4.1.2. */
+/* We should test _IBMR2 here when we add assembly support for the system
+   vendor compilers.  */
+#if 0 /* Not yet enabled because we don't have hardware for a test. */
+#if (defined (_ARCH_PPC) || defined (__powerpc__)) && W_TYPE_SIZE == 64
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  do {                                                                 \
+    if (__builtin_constant_p (bh) && (bh) == 0)                                \
+      __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"          \
+            : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
+    else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0)                \
+      __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"          \
+            : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\
+    else                                                               \
+      __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"         \
+            : "=r" (sh), "=&r" (sl)                                    \
+            : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl));              \
+  } while (0)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  do {                                                                 \
+    if (__builtin_constant_p (ah) && (ah) == 0)                                \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"      \
+              : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
+    else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0)                \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"      \
+              : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\
+    else if (__builtin_constant_p (bh) && (bh) == 0)                   \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"                \
+              : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
+    else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0)                \
+      __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"                \
+              : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\
+    else                                                               \
+      __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"     \
+              : "=r" (sh), "=&r" (sl)                                  \
+              : "r" (ah), "r" (bh), "rI" (al), "r" (bl));              \
+  } while (0)
+#define count_leading_zeros(count, x) \
+  __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x))
+#define COUNT_LEADING_ZEROS_0 64
+#define umul_ppmm(ph, pl, m0, m1) \
+  do {                                                                 \
+    UDItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));     \
+    (pl) = __m0 * __m1;                                                        \
+  } while (0)
+#define UMUL_TIME 15
+#define smul_ppmm(ph, pl, m0, m1) \
+  do {                                                                 \
+    DItype __m0 = (m0), __m1 = (m1);                                   \
+    __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1));      \
+    (pl) = __m0 * __m1;                                                        \
+  } while (0)
+#define SMUL_TIME 14  /* ??? */
+#define UDIV_TIME 120 /* ??? */
+#endif /* 64-bit PowerPC.  */
+#endif /* if 0 */
+
+/***************************************
+ **************  PYR  ******************
+ ***************************************/
+#if defined (__pyr__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("addw        %5,%1 \n" \
+          "addwc       %3,%0"                                          \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%0" ((USItype)(ah)),                                      \
+            "g" ((USItype)(bh)),                                       \
+            "%1" ((USItype)(al)),                                      \
+            "g" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subw        %5,%1 \n" \
+          "subwb       %3,%0"                                          \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "0" ((USItype)(ah)),                                       \
+            "g" ((USItype)(bh)),                                       \
+            "1" ((USItype)(al)),                                       \
+            "g" ((USItype)(bl)))
+/* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP.  */
+#define umul_ppmm(w1, w0, u, v) \
+  ({union {UDItype __ll;                                               \
+          struct {USItype __h, __l;} __i;                              \
+         } __xx;                                                       \
+  __asm__ ("movw %1,%R0 \n" \
+          "uemul %2,%0"                                                \
+          : "=&r" (__xx.__ll)                                          \
+          : "g" ((USItype) (u)),                                       \
+            "g" ((USItype)(v)));                                       \
+  (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
+#endif /* __pyr__ */
+
+
+/***************************************
+ **************  RT/ROMP  **************
+ ***************************************/
+#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("a %1,%5 \n" \
+          "ae %0,%3"                                                   \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%0" ((USItype)(ah)),                                      \
+            "r" ((USItype)(bh)),                                       \
+            "%1" ((USItype)(al)),                                      \
+            "r" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("s %1,%5\n" \
+          "se %0,%3"                                                   \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "0" ((USItype)(ah)),                                       \
+            "r" ((USItype)(bh)),                                       \
+            "1" ((USItype)(al)),                                       \
+            "r" ((USItype)(bl)))
+#define umul_ppmm(ph, pl, m0, m1) \
+  do {                                                                 \
+    USItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ (                                                          \
+       "s       r2,r2    \n" \
+       "mts    r10,%2   \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "m      r2,%3    \n" \
+       "cas    %0,r2,r0 \n" \
+       "mfs    r10,%1"                                                 \
+            : "=r" ((USItype)(ph)),                                    \
+              "=r" ((USItype)(pl))                                     \
+            : "%r" (__m0),                                             \
+               "r" (__m1)                                              \
+            : "r2");                                                   \
+    (ph) += ((((SItype) __m0 >> 31) & __m1)                            \
+            + (((SItype) __m1 >> 31) & __m0));                         \
+  } while (0)
+#define UMUL_TIME 20
+#define UDIV_TIME 200
+#define count_leading_zeros(count, x) \
+  do {                                                                 \
+    if ((x) >= 0x10000)                                                \
+      __asm__ ("clz     %0,%1"                                          \
+              : "=r" ((USItype)(count))                                \
+              : "r" ((USItype)(x) >> 16));                             \
+    else                                                               \
+      {                                                                \
+       __asm__ ("clz   %0,%1"                                          \
+                : "=r" ((USItype)(count))                              \
+                : "r" ((USItype)(x)));                                 \
+       (count) += 16;                                                  \
+      }                                                                \
+  } while (0)
+#endif /* RT/ROMP */
+
+
+/***************************************
+ **************  SH2  ******************
+ ***************************************/
+#if (defined (__sh2__) || defined(__sh3__) || defined(__SH4__) ) \
+    && W_TYPE_SIZE == 32
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ (                                                            \
+        "dmulu.l %2,%3\n"  \
+       "sts    macl,%1\n" \
+       "sts    mach,%0"                                                \
+          : "=r" ((USItype)(w1)),                                      \
+            "=r" ((USItype)(w0))                                       \
+          : "r" ((USItype)(u)),                                        \
+            "r" ((USItype)(v))                                         \
+          : "macl", "mach")
+#define UMUL_TIME 5
+#endif
+
+/***************************************
+ **************  SPARC ****************
+ ***************************************/
+#if defined (__sparc__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("addcc %r4,%5,%1\n" \
+          "addx %r2,%3,%0"                                             \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "%rJ" ((USItype)(ah)),                                     \
+            "rI" ((USItype)(bh)),                                      \
+            "%rJ" ((USItype)(al)),                                     \
+            "rI" ((USItype)(bl))                                       \
+          __CLOBBER_CC)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subcc %r4,%5,%1\n" \
+          "subx %r2,%3,%0"                                             \
+          : "=r" ((USItype)(sh)),                                      \
+            "=&r" ((USItype)(sl))                                      \
+          : "rJ" ((USItype)(ah)),                                      \
+            "rI" ((USItype)(bh)),                                      \
+            "rJ" ((USItype)(al)),                                      \
+            "rI" ((USItype)(bl))                                       \
+          __CLOBBER_CC)
+#if defined (__sparc_v8__)
+/* Don't match immediate range because, 1) it is not often useful,
+   2) the 'I' flag thinks of the range as a 13 bit signed interval,
+   while we want to match a 13 bit interval, sign extended to 32 bits,
+   but INTERPRETED AS UNSIGNED.  */
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("umul %2,%3,%1;rd %%y,%0"                                    \
+          : "=r" ((USItype)(w1)),                                      \
+            "=r" ((USItype)(w0))                                       \
+          : "r" ((USItype)(u)),                                        \
+            "r" ((USItype)(v)))
+#define UMUL_TIME 5
+#ifndef SUPERSPARC     /* SuperSPARC's udiv only handles 53 bit dividends */
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  do {                                                                 \
+    USItype __q;                                                       \
+    __asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0"                     \
+            : "=r" ((USItype)(__q))                                    \
+            : "r" ((USItype)(n1)),                                     \
+              "r" ((USItype)(n0)),                                     \
+              "r" ((USItype)(d)));                                     \
+    (r) = (n0) - __q * (d);                                            \
+    (q) = __q;                                                         \
+  } while (0)
+#define UDIV_TIME 25
+#endif /* SUPERSPARC */
+#else /* ! __sparc_v8__ */
+#if defined (__sparclite__)
+/* This has hardware multiply but not divide.  It also has two additional
+   instructions scan (ffs from high bit) and divscc.  */
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("umul %2,%3,%1;rd %%y,%0"                                    \
+          : "=r" ((USItype)(w1)),                                      \
+            "=r" ((USItype)(w0))                                       \
+          : "r" ((USItype)(u)),                                        \
+            "r" ((USItype)(v)))
+#define UMUL_TIME 5
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  __asm__ ("! Inlined udiv_qrnnd                                     \n" \
+ "        wr   %%g0,%2,%%y     ! Not a delayed write for sparclite  \n" \
+ "        tst  %%g0                                                 \n" \
+ "        divscc       %3,%4,%%g1                                   \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%%g1                                 \n" \
+ "        divscc       %%g1,%4,%0                                   \n" \
+ "        rd   %%y,%1                                               \n" \
+ "        bl,a 1f                                                    \n" \
+ "        add  %1,%4,%1                                             \n" \
+ "1:   ! End of inline udiv_qrnnd"                                     \
+          : "=r" ((USItype)(q)),                                       \
+            "=r" ((USItype)(r))                                        \
+          : "r" ((USItype)(n1)),                                       \
+            "r" ((USItype)(n0)),                                       \
+            "rI" ((USItype)(d))                                        \
+          : "%g1" __AND_CLOBBER_CC)
+#define UDIV_TIME 37
+#define count_leading_zeros(count, x) \
+  __asm__ ("scan %1,0,%0"                                               \
+          : "=r" ((USItype)(x))                                        \
+          : "r" ((USItype)(count)))
+/* Early sparclites return 63 for an argument of 0, but they warn that future
+   implementations might change this.  Therefore, leave COUNT_LEADING_ZEROS_0
+   undefined.  */
+#endif /* __sparclite__ */
+#endif /* __sparc_v8__ */
+/* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd.  */
+#ifndef umul_ppmm
+#define umul_ppmm(w1, w0, u, v) \
+  __asm__ ("! Inlined umul_ppmm                                        \n" \
+ "        wr   %%g0,%2,%%y     ! SPARC has 0-3 delay insn after a wr  \n" \
+ "        sra  %3,31,%%g2      ! Don't move this insn                 \n" \
+ "        and  %2,%%g2,%%g2    ! Don't move this insn                 \n" \
+ "        andcc        %%g0,0,%%g1     ! Don't move this insn                 \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,%3,%%g1                                   \n" \
+ "        mulscc       %%g1,0,%%g1                                    \n" \
+ "        add  %%g1,%%g2,%0                                           \n" \
+ "        rd   %%y,%1"                                                 \
+          : "=r" ((USItype)(w1)),                                      \
+            "=r" ((USItype)(w0))                                       \
+          : "%rI" ((USItype)(u)),                                      \
+            "r" ((USItype)(v))                                         \
+          : "%g1", "%g2" __AND_CLOBBER_CC)
+#define UMUL_TIME 39           /* 39 instructions */
+#endif
+#ifndef udiv_qrnnd
+#ifndef LONGLONG_STANDALONE
+#define udiv_qrnnd(q, r, n1, n0, d) \
+  do { USItype __r;                                                    \
+    (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                        \
+    (r) = __r;                                                         \
+  } while (0)
+extern USItype __udiv_qrnnd ();
+#define UDIV_TIME 140
+#endif /* LONGLONG_STANDALONE */
+#endif /* udiv_qrnnd */
+#endif /* __sparc__ */
+
+
+/***************************************
+ **************  VAX  ******************
+ ***************************************/
+#if defined (__vax__) && W_TYPE_SIZE == 32
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("addl2 %5,%1\n" \
+          "adwc %3,%0"                                                 \
+          : "=g" ((USItype)(sh)),                                      \
+            "=&g" ((USItype)(sl))                                      \
+          : "%0" ((USItype)(ah)),                                      \
+            "g" ((USItype)(bh)),                                       \
+            "%1" ((USItype)(al)),                                      \
+            "g" ((USItype)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("subl2 %5,%1\n" \
+          "sbwc %3,%0"                                                 \
+          : "=g" ((USItype)(sh)),                                      \
+            "=&g" ((USItype)(sl))                                      \
+          : "0" ((USItype)(ah)),                                       \
+            "g" ((USItype)(bh)),                                       \
+            "1" ((USItype)(al)),                                       \
+            "g" ((USItype)(bl)))
+#define umul_ppmm(xh, xl, m0, m1) \
+  do {                                                                 \
+    union {UDItype __ll;                                               \
+          struct {USItype __l, __h;} __i;                              \
+         } __xx;                                                       \
+    USItype __m0 = (m0), __m1 = (m1);                                  \
+    __asm__ ("emul %1,%2,$0,%0"                                         \
+            : "=g" (__xx.__ll)                                         \
+            : "g" (__m0),                                              \
+              "g" (__m1));                                             \
+    (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
+    (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
+            + (((SItype) __m1 >> 31) & __m0));                         \
+  } while (0)
+#define sdiv_qrnnd(q, r, n1, n0, d) \
+  do {                                                                 \
+    union {DItype __ll;                                                \
+          struct {SItype __l, __h;} __i;                               \
+         } __xx;                                                       \
+    __xx.__i.__h = n1; __xx.__i.__l = n0;                              \
+    __asm__ ("ediv %3,%2,%0,%1"                                         \
+            : "=g" (q), "=g" (r)                                       \
+            : "g" (__xx.__ll), "g" (d));                               \
+  } while (0)
+#endif /* __vax__ */
+
+
+/***************************************
+ **************  Z8000 ****************
+ ***************************************/
+#if defined (__z8000__) && W_TYPE_SIZE == 16
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  __asm__ ("add %H1,%H5\n\tadc  %H0,%H3"                                \
+          : "=r" ((unsigned int)(sh)),                                 \
+            "=&r" ((unsigned int)(sl))                                 \
+          : "%0" ((unsigned int)(ah)),                                 \
+            "r" ((unsigned int)(bh)),                                  \
+            "%1" ((unsigned int)(al)),                                 \
+            "rQR" ((unsigned int)(bl)))
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  __asm__ ("sub %H1,%H5\n\tsbc  %H0,%H3"                                \
+          : "=r" ((unsigned int)(sh)),                                 \
+            "=&r" ((unsigned int)(sl))                                 \
+          : "0" ((unsigned int)(ah)),                                  \
+            "r" ((unsigned int)(bh)),                                  \
+            "1" ((unsigned int)(al)),                                  \
+            "rQR" ((unsigned int)(bl)))
+#define umul_ppmm(xh, xl, m0, m1) \
+  do {                                                                 \
+    union {long int __ll;                                              \
+          struct {unsigned int __h, __l;} __i;                         \
+         } __xx;                                                       \
+    unsigned int __m0 = (m0), __m1 = (m1);                             \
+    __asm__ ("mult      %S0,%H3"                                        \
+            : "=r" (__xx.__i.__h),                                     \
+              "=r" (__xx.__i.__l)                                      \
+            : "%1" (__m0),                                             \
+              "rQR" (__m1));                                           \
+    (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
+    (xh) += ((((signed int) __m0 >> 15) & __m1)                        \
+            + (((signed int) __m1 >> 15) & __m0));                     \
+  } while (0)
+#endif /* __z8000__ */
+
+#endif /* __GNUC__ */
+
+
+/***************************************
+ ***********  Generic Versions ********
+ ***************************************/
+#if !defined (umul_ppmm) && defined (__umulsidi3)
+#define umul_ppmm(ph, pl, m0, m1) \
+  {                                                                    \
+    UDWtype __ll = __umulsidi3 (m0, m1);                               \
+    ph = (UWtype) (__ll >> W_TYPE_SIZE);                               \
+    pl = (UWtype) __ll;                                                \
+  }
+#endif
+
+#if !defined (__umulsidi3)
+#define __umulsidi3(u, v) \
+  ({UWtype __hi, __lo;                                                 \
+    umul_ppmm (__hi, __lo, u, v);                                      \
+    ((UDWtype) __hi << W_TYPE_SIZE) | __lo; })
+#endif
+
+/* If this machine has no inline assembler, use C macros.  */
+
+#if !defined (add_ssaaaa)
+#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
+  do {                                                                 \
+    UWtype __x;                                                        \
+    __x = (al) + (bl);                                                 \
+    (sh) = (ah) + (bh) + (__x < (al));                                 \
+    (sl) = __x;                                                        \
+  } while (0)
+#endif
+
+#if !defined (sub_ddmmss)
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+  do {                                                                 \
+    UWtype __x;                                                        \
+    __x = (al) - (bl);                                                 \
+    (sh) = (ah) - (bh) - (__x > (al));                                 \
+    (sl) = __x;                                                        \
+  } while (0)
+#endif
+
+#if !defined (umul_ppmm)
+#define umul_ppmm(w1, w0, u, v)                                        \
+  do {                                                                 \
+    UWtype __x0, __x1, __x2, __x3;                                     \
+    UHWtype __ul, __vl, __uh, __vh;                                    \
+    UWtype __u = (u), __v = (v);                                       \
+                                                                       \
+    __ul = __ll_lowpart (__u);                                         \
+    __uh = __ll_highpart (__u);                                        \
+    __vl = __ll_lowpart (__v);                                         \
+    __vh = __ll_highpart (__v);                                        \
+                                                                       \
+    __x0 = (UWtype) __ul * __vl;                                       \
+    __x1 = (UWtype) __ul * __vh;                                       \
+    __x2 = (UWtype) __uh * __vl;                                       \
+    __x3 = (UWtype) __uh * __vh;                                       \
+                                                                       \
+    __x1 += __ll_highpart (__x0);/* this can't give carry */            \
+    __x1 += __x2;              /* but this indeed can */               \
+    if (__x1 < __x2)           /* did we get it? */                    \
+      __x3 += __ll_B;          /* yes, add it in the proper pos. */    \
+                                                                       \
+    (w1) = __x3 + __ll_highpart (__x1);                                \
+    (w0) = (__ll_lowpart (__x1) << W_TYPE_SIZE/2) + __ll_lowpart (__x0);\
+  } while (0)
+#endif
+
+#if !defined (umul_ppmm)
+#define smul_ppmm(w1, w0, u, v)                                        \
+  do {                                                                 \
+    UWtype __w1;                                                       \
+    UWtype __m0 = (u), __m1 = (v);                                     \
+    umul_ppmm (__w1, w0, __m0, __m1);                                  \
+    (w1) = __w1 - (-(__m0 >> (W_TYPE_SIZE - 1)) & __m1)                \
+               - (-(__m1 >> (W_TYPE_SIZE - 1)) & __m0);                \
+  } while (0)
+#endif
+
+/* Define this unconditionally, so it can be used for debugging.  */
+#define __udiv_qrnnd_c(q, r, n1, n0, d) \
+  do {                                                                 \
+    UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m;                    \
+    __d1 = __ll_highpart (d);                                          \
+    __d0 = __ll_lowpart (d);                                           \
+                                                                       \
+    __r1 = (n1) % __d1;                                                \
+    __q1 = (n1) / __d1;                                                \
+    __m = (UWtype) __q1 * __d0;                                        \
+    __r1 = __r1 * __ll_B | __ll_highpart (n0);                         \
+    if (__r1 < __m)                                                    \
+      {                                                                \
+       __q1--, __r1 += (d);                                            \
+       if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
+         if (__r1 < __m)                                               \
+           __q1--, __r1 += (d);                                        \
+      }                                                                \
+    __r1 -= __m;                                                       \
+                                                                       \
+    __r0 = __r1 % __d1;                                                \
+    __q0 = __r1 / __d1;                                                \
+    __m = (UWtype) __q0 * __d0;                                        \
+    __r0 = __r0 * __ll_B | __ll_lowpart (n0);                          \
+    if (__r0 < __m)                                                    \
+      {                                                                \
+       __q0--, __r0 += (d);                                            \
+       if (__r0 >= (d))                                                \
+         if (__r0 < __m)                                               \
+           __q0--, __r0 += (d);                                        \
+      }                                                                \
+    __r0 -= __m;                                                       \
+                                                                       \
+    (q) = (UWtype) __q1 * __ll_B | __q0;                               \
+    (r) = __r0;                                                        \
+  } while (0)
+
+/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
+   __udiv_w_sdiv (defined in libgcc or elsewhere).  */
+#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd)
+#define udiv_qrnnd(q, r, nh, nl, d) \
+  do {                                                                 \
+    UWtype __r;                                                        \
+    (q) = __MPN(udiv_w_sdiv) (&__r, nh, nl, d);                        \
+    (r) = __r;                                                         \
+  } while (0)
+#endif
+
+/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c.  */
+#if !defined (udiv_qrnnd)
+#define UDIV_NEEDS_NORMALIZATION 1
+#define udiv_qrnnd __udiv_qrnnd_c
+#endif
+
+#if !defined (count_leading_zeros)
+extern
+#ifdef __STDC__
+const
+#endif
+unsigned char __clz_tab[];
+#define MPI_INTERNAL_NEED_CLZ_TAB 1
+#define count_leading_zeros(count, x) \
+  do {                                                                 \
+    UWtype __xr = (x);                                                 \
+    UWtype __a;                                                        \
+                                                                       \
+    if (W_TYPE_SIZE <= 32)                                             \
+      {                                                                \
+       __a = __xr < ((UWtype) 1 << 2*__BITS4)                          \
+         ? (__xr < ((UWtype) 1 << __BITS4) ? 0 : __BITS4)              \
+         : (__xr < ((UWtype) 1 << 3*__BITS4) ?  2*__BITS4 : 3*__BITS4);\
+      }                                                                \
+    else                                                               \
+      {                                                                \
+       for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8)                  \
+         if (((__xr >> __a) & 0xff) != 0)                              \
+           break;                                                      \
+      }                                                                \
+                                                                       \
+    (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a);            \
+  } while (0)
+/* This version gives a well-defined value for zero. */
+#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE
+#endif
+
+#if !defined (count_trailing_zeros)
+/* Define count_trailing_zeros using count_leading_zeros.  The latter might be
+   defined in asm, but if it is not, the C version above is good enough.  */
+#define count_trailing_zeros(count, x) \
+  do {                                                                 \
+    UWtype __ctz_x = (x);                                              \
+    UWtype __ctz_c;                                                    \
+    count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x);                 \
+    (count) = W_TYPE_SIZE - 1 - __ctz_c;                               \
+  } while (0)
+#endif
+
+#ifndef UDIV_NEEDS_NORMALIZATION
+#define UDIV_NEEDS_NORMALIZATION 0
+#endif
diff --git a/mpi/m68k/distfiles b/mpi/m68k/distfiles
new file mode 100644 (file)
index 0000000..4c0967b
--- /dev/null
@@ -0,0 +1,8 @@
+syntax.h
+mpih-lshift.S
+mpih-rshift.S
+mpih-add1.S
+mpih-sub1.S
+
+
+
diff --git a/mpi/m68k/mc68020/distfiles b/mpi/m68k/mc68020/distfiles
new file mode 100644 (file)
index 0000000..fc7df9f
--- /dev/null
@@ -0,0 +1,3 @@
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
diff --git a/mpi/m68k/mc68020/mpih-mul1.S b/mpi/m68k/mc68020/mpih-mul1.S
new file mode 100644 (file)
index 0000000..c24305d
--- /dev/null
@@ -0,0 +1,107 @@
+/* mc68020 __mpn_mul_1 -- Multiply a limb vector with a limb and store
+ *                        the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (sp + 4)
+ *               mpi_ptr_t s1_ptr,     (sp + 8)
+ *               mpi_size_t s1_size,   (sp + 12)
+ *               mpi_limb_t s2_limb)   (sp + 16)
+ */
+
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_mul_1)
+
+C_SYMBOL_NAME(mpihelp_mul_1:)
+PROLOG(mpihelp_mul_1)
+
+#define res_ptr a0
+#define s1_ptr a1
+#define s1_size d2
+#define s2_limb d4
+
+/* Save used registers on the stack.  */
+       moveml  R(d2)-R(d4),MEM_PREDEC(sp)
+#if 0
+       movel   R(d2),MEM_PREDEC(sp)
+       movel   R(d3),MEM_PREDEC(sp)
+       movel   R(d4),MEM_PREDEC(sp)
+#endif
+
+/* Copy the arguments to registers.  Better use movem? */
+       movel   MEM_DISP(sp,16),R(res_ptr)
+       movel   MEM_DISP(sp,20),R(s1_ptr)
+       movel   MEM_DISP(sp,24),R(s1_size)
+       movel   MEM_DISP(sp,28),R(s2_limb)
+
+       eorw    #1,R(s1_size)
+       clrl    R(d1)
+       lsrl    #1,R(s1_size)
+       bcc     L(L1)
+       subql   #1,R(s1_size)
+       subl    R(d0),R(d0)     /* (d0,cy) <= (0,0) */
+
+L(Loop:)
+       movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d1):R(d3)
+       addxl   R(d0),R(d3)
+       movel   R(d3),MEM_POSTINC(res_ptr)
+L(L1:) movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d0):R(d3)
+       addxl   R(d1),R(d3)
+       movel   R(d3),MEM_POSTINC(res_ptr)
+
+       dbf     R(s1_size),L(Loop)
+       clrl    R(d3)
+       addxl   R(d3),R(d0)
+       subl    #0x10000,R(s1_size)
+       bcc     L(Loop)
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d4)
+#if 0
+       movel   MEM_POSTINC(sp),R(d4)
+       movel   MEM_POSTINC(sp),R(d3)
+       movel   MEM_POSTINC(sp),R(d2)
+#endif
+       rts
+EPILOG(mpihelp_mul_1)
+
+
diff --git a/mpi/m68k/mc68020/mpih-mul2.S b/mpi/m68k/mc68020/mpih-mul2.S
new file mode 100644 (file)
index 0000000..2684d7d
--- /dev/null
@@ -0,0 +1,97 @@
+/* mc68020 __mpn_addmul_1 -- Multiply a limb vector with a limb and add
+ *                           the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (sp + 4)
+ *                  mpi_ptr_t s1_ptr,       (sp + 8)
+ *                  mpi_size_t s1_size,     (sp + 12)
+ *                  mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_addmul_1)
+
+C_SYMBOL_NAME(mpihelp_addmul_1:)
+PROLOG(mpihelp_addmul_1)
+
+#define res_ptr a0
+#define s1_ptr a1
+#define s1_size d2
+#define s2_limb d4
+
+/* Save used registers on the stack.  */
+       moveml  R(d2)-R(d5),MEM_PREDEC(sp)
+
+/* Copy the arguments to registers.  Better use movem? */
+       movel   MEM_DISP(sp,20),R(res_ptr)
+       movel   MEM_DISP(sp,24),R(s1_ptr)
+       movel   MEM_DISP(sp,28),R(s1_size)
+       movel   MEM_DISP(sp,32),R(s2_limb)
+
+       eorw    #1,R(s1_size)
+       clrl    R(d1)
+       clrl    R(d5)
+       lsrl    #1,R(s1_size)
+       bcc     L(L1)
+       subql   #1,R(s1_size)
+       subl    R(d0),R(d0)             /* (d0,cy) <= (0,0) */
+
+L(Loop:)
+       movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d1):R(d3)
+       addxl   R(d0),R(d3)
+       addxl   R(d5),R(d1)
+       addl    R(d3),MEM_POSTINC(res_ptr)
+L(L1:) movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d0):R(d3)
+       addxl   R(d1),R(d3)
+       addxl   R(d5),R(d0)
+       addl    R(d3),MEM_POSTINC(res_ptr)
+
+       dbf     R(s1_size),L(Loop)
+       addxl   R(d5),R(d0)
+       subl    #0x10000,R(s1_size)
+       bcc     L(Loop)
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d5)
+
+       rts
+EPILOG(mpihelp_addmul_1)
+
diff --git a/mpi/m68k/mc68020/mpih-mul3.S b/mpi/m68k/mc68020/mpih-mul3.S
new file mode 100644 (file)
index 0000000..c031152
--- /dev/null
@@ -0,0 +1,100 @@
+/* mc68020 __mpn_submul_1 -- Multiply a limb vector with a limb and subtract
+ *                           the result from a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (sp + 4)
+ *                  mpi_ptr_t s1_ptr,       (sp + 8)
+ *                  mpi_size_t s1_size,     (sp + 12)
+ *                  mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_submul_1)
+
+C_SYMBOL_NAME(mpihelp_submul_1:)
+PROLOG(mpihelp_submul_1)
+
+#define res_ptr a0
+#define s1_ptr a1
+#define s1_size d2
+#define s2_limb d4
+
+/* Save used registers on the stack.  */
+       moveml  R(d2)-R(d5),MEM_PREDEC(sp)
+
+/* Copy the arguments to registers.  Better use movem? */
+       movel   MEM_DISP(sp,20),R(res_ptr)
+       movel   MEM_DISP(sp,24),R(s1_ptr)
+       movel   MEM_DISP(sp,28),R(s1_size)
+       movel   MEM_DISP(sp,32),R(s2_limb)
+
+       eorw    #1,R(s1_size)
+       clrl    R(d1)
+       clrl    R(d5)
+       lsrl    #1,R(s1_size)
+       bcc     L(L1)
+       subql   #1,R(s1_size)
+       subl    R(d0),R(d0)     /* (d0,cy) <= (0,0) */
+
+L(Loop:)
+       movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d1):R(d3)
+       addxl   R(d0),R(d3)
+       addxl   R(d5),R(d1)
+       subl    R(d3),MEM_POSTINC(res_ptr)
+L(L1:) movel   MEM_POSTINC(s1_ptr),R(d3)
+       mulul   R(s2_limb),R(d0):R(d3)
+       addxl   R(d1),R(d3)
+       addxl   R(d5),R(d0)
+       subl    R(d3),MEM_POSTINC(res_ptr)
+
+       dbf     R(s1_size),L(Loop)
+       addxl   R(d5),R(d0)
+       subl    #0x10000,R(s1_size)
+       bcc     L(Loop)
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d5)
+
+       rts
+EPILOG(mpihelp_submul_1)
+
+
diff --git a/mpi/m68k/mpih-add1.S b/mpi/m68k/mpih-add1.S
new file mode 100644 (file)
index 0000000..c294f9d
--- /dev/null
@@ -0,0 +1,95 @@
+/* mc68020 __mpn_add_n -- Add two limb vectors of the same length > 0 and store
+ *                        sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994,1996, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  (sp + 4)
+ *                mpi_ptr_t s1_ptr,    (sp + 8)
+ *                mpi_ptr_t s2_ptr,    (sp + 16)
+ *                mpi_size_t size)     (sp + 12)
+ */
+
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_add_n)
+
+C_SYMBOL_NAME(mpihelp_add_n:)
+PROLOG(mpihelp_add_n)
+       /* Save used registers on the stack.  */
+       movel   R(d2),MEM_PREDEC(sp)
+       movel   R(a2),MEM_PREDEC(sp)
+
+       /* Copy the arguments to registers.  Better use movem?  */
+       movel   MEM_DISP(sp,12),R(a2)
+       movel   MEM_DISP(sp,16),R(a0)
+       movel   MEM_DISP(sp,20),R(a1)
+       movel   MEM_DISP(sp,24),R(d2)
+
+       eorw    #1,R(d2)
+       lsrl    #1,R(d2)
+       bcc     L(L1)
+       subql   #1,R(d2)        /* clears cy as side effect */
+
+L(Loop:)
+       movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       addxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+L(L1:) movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       addxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+
+       dbf     R(d2),L(Loop)           /* loop until 16 lsb of %4 == -1 */
+       subxl   R(d0),R(d0)     /* d0 <= -cy; save cy as 0 or -1 in d0 */
+       subl    #0x10000,R(d2)
+       bcs     L(L2)
+       addl    R(d0),R(d0)     /* restore cy */
+       bra     L(Loop)
+
+L(L2:)
+       negl    R(d0)
+
+       /* Restore used registers from stack frame.  */
+       movel   MEM_POSTINC(sp),R(a2)
+       movel   MEM_POSTINC(sp),R(d2)
+
+       rts
+EPILOG(mpihelp_add_n)
+
+
diff --git a/mpi/m68k/mpih-lshift.S b/mpi/m68k/mpih-lshift.S
new file mode 100644 (file)
index 0000000..2256828
--- /dev/null
@@ -0,0 +1,167 @@
+/* mc68020 lshift -- Shift left a low-level natural-number integer.
+ *
+ *      Copyright (C) 1996, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (sp + 4)
+ *                mpi_ptr_t up,        (sp + 8)
+ *                mpi_size_t usize,    (sp + 12)
+ *                unsigned cnt)        (sp + 16)
+ */
+
+#define res_ptr a1
+#define s_ptr a0
+#define s_size d6
+#define cnt d4
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_lshift)
+
+C_SYMBOL_NAME(mpihelp_lshift:)
+PROLOG(mpihelp_lshift)
+
+       /* Save used registers on the stack.  */
+       moveml  R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
+
+       /* Copy the arguments to registers.  */
+       movel   MEM_DISP(sp,28),R(res_ptr)
+       movel   MEM_DISP(sp,32),R(s_ptr)
+       movel   MEM_DISP(sp,36),R(s_size)
+       movel   MEM_DISP(sp,40),R(cnt)
+
+       moveql  #1,R(d5)
+       cmpl    R(d5),R(cnt)
+       bne     L(Lnormal)
+       cmpl    R(s_ptr),R(res_ptr)
+       bls     L(Lspecial)             /* jump if s_ptr >= res_ptr */
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(s_ptr,s_size,l,4),R(a2)
+#else /* not mc68020 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       lea     MEM_INDX(s_ptr,d0,l),R(a2)
+#endif
+       cmpl    R(res_ptr),R(a2)
+       bls     L(Lspecial)             /* jump if res_ptr >= s_ptr + s_size */
+
+L(Lnormal:)
+       moveql  #32,R(d5)
+       subl    R(cnt),R(d5)
+
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
+       lea     MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
+#else /* not mc68000 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       addl    R(s_size),R(s_ptr)
+       addl    R(s_size),R(res_ptr)
+#endif
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       movel   R(d2),R(d0)
+       lsrl    R(d5),R(d0)             /* compute carry limb */
+
+       lsll    R(cnt),R(d2)
+       movel   R(d2),R(d1)
+       subql   #1,R(s_size)
+       beq     L(Lend)
+       lsrl    #1,R(s_size)
+       bcs     L(L1)
+       subql   #1,R(s_size)
+
+L(Loop:)
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       movel   R(d2),R(d3)
+       lsrl    R(d5),R(d3)
+       orl     R(d3),R(d1)
+       movel   R(d1),MEM_PREDEC(res_ptr)
+       lsll    R(cnt),R(d2)
+L(L1:)
+       movel   MEM_PREDEC(s_ptr),R(d1)
+       movel   R(d1),R(d3)
+       lsrl    R(d5),R(d3)
+       orl     R(d3),R(d2)
+       movel   R(d2),MEM_PREDEC(res_ptr)
+       lsll    R(cnt),R(d1)
+
+       dbf     R(s_size),L(Loop)
+       subl    #0x10000,R(s_size)
+       bcc     L(Loop)
+
+L(Lend:)
+       movel   R(d1),MEM_PREDEC(res_ptr) /* store least significant limb */
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+
+/* We loop from least significant end of the arrays, which is only
+   permissable if the source and destination don't overlap, since the
+   function is documented to work for overlapping source and destination.  */
+
+L(Lspecial:)
+       clrl    R(d0)                   /* initialize carry */
+       eorw    #1,R(s_size)
+       lsrl    #1,R(s_size)
+       bcc     L(LL1)
+       subql   #1,R(s_size)
+
+L(LLoop:)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       addxl   R(d2),R(d2)
+       movel   R(d2),MEM_POSTINC(res_ptr)
+L(LL1:)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       addxl   R(d2),R(d2)
+       movel   R(d2),MEM_POSTINC(res_ptr)
+
+       dbf     R(s_size),L(LLoop)
+       addxl   R(d0),R(d0)             /* save cy in lsb */
+       subl    #0x10000,R(s_size)
+       bcs     L(LLend)
+       lsrl    #1,R(d0)                /* restore cy */
+       bra     L(LLoop)
+
+L(LLend:)
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+EPILOG(mpihelp_lshift)
+
+
+
+
+
diff --git a/mpi/m68k/mpih-rshift.S b/mpi/m68k/mpih-rshift.S
new file mode 100644 (file)
index 0000000..e9c20d2
--- /dev/null
@@ -0,0 +1,165 @@
+/* mc68020 rshift -- Shift right a low-level natural-number integer.
+ *
+ *      Copyright (C) 1996, 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (sp + 4)
+ *                mpi_ptr_t up,        (sp + 8)
+ *                mpi_size_t usize,    (sp + 12)
+ *                unsigned cnt)        (sp + 16)
+ */
+
+#define res_ptr a1
+#define s_ptr a0
+#define s_size d6
+#define cnt d4
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_rshift)
+
+C_SYMBOL_NAME(mpihelp_rshift:)
+PROLOG(mpihelp_rshift)
+       /* Save used registers on the stack.  */
+       moveml  R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
+
+       /* Copy the arguments to registers.  */
+       movel   MEM_DISP(sp,28),R(res_ptr)
+       movel   MEM_DISP(sp,32),R(s_ptr)
+       movel   MEM_DISP(sp,36),R(s_size)
+       movel   MEM_DISP(sp,40),R(cnt)
+
+       moveql  #1,R(d5)
+       cmpl    R(d5),R(cnt)
+       bne     L(Rnormal)
+       cmpl    R(res_ptr),R(s_ptr)
+       bls     L(Rspecial)             /* jump if res_ptr >= s_ptr */
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(res_ptr,s_size,l,4),R(a2)
+#else /* not mc68020 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       lea     MEM_INDX(res_ptr,d0,l),R(a2)
+#endif
+       cmpl    R(s_ptr),R(a2)
+       bls     L(Rspecial)             /* jump if s_ptr >= res_ptr + s_size */
+
+L(Rnormal:)
+       moveql  #32,R(d5)
+       subl    R(cnt),R(d5)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       movel   R(d2),R(d0)
+       lsll    R(d5),R(d0)             /* compute carry limb */
+
+       lsrl    R(cnt),R(d2)
+       movel   R(d2),R(d1)
+       subql   #1,R(s_size)
+       beq     L(Rend)
+       lsrl    #1,R(s_size)
+       bcs     L(R1)
+       subql   #1,R(s_size)
+
+L(Roop:)
+       movel   MEM_POSTINC(s_ptr),R(d2)
+       movel   R(d2),R(d3)
+       lsll    R(d5),R(d3)
+       orl     R(d3),R(d1)
+       movel   R(d1),MEM_POSTINC(res_ptr)
+       lsrl    R(cnt),R(d2)
+L(R1:)
+       movel   MEM_POSTINC(s_ptr),R(d1)
+       movel   R(d1),R(d3)
+       lsll    R(d5),R(d3)
+       orl     R(d3),R(d2)
+       movel   R(d2),MEM_POSTINC(res_ptr)
+       lsrl    R(cnt),R(d1)
+
+       dbf     R(s_size),L(Roop)
+       subl    #0x10000,R(s_size)
+       bcc     L(Roop)
+
+L(Rend:)
+       movel   R(d1),MEM(res_ptr) /* store most significant limb */
+
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+
+/* We loop from most significant end of the arrays, which is only
+   permissable if the source and destination don't overlap, since the
+   function is documented to work for overlapping source and destination.  */
+
+L(Rspecial:)
+#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+       lea     MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
+       lea     MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
+#else /* not mc68000 */
+       movel   R(s_size),R(d0)
+       asll    #2,R(d0)
+       addl    R(s_size),R(s_ptr)
+       addl    R(s_size),R(res_ptr)
+#endif
+
+       clrl    R(d0)                   /* initialize carry */
+       eorw    #1,R(s_size)
+       lsrl    #1,R(s_size)
+       bcc     L(LR1)
+       subql   #1,R(s_size)
+
+L(LRoop:)
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       roxrl   #1,R(d2)
+       movel   R(d2),MEM_PREDEC(res_ptr)
+L(LR1:)
+       movel   MEM_PREDEC(s_ptr),R(d2)
+       roxrl   #1,R(d2)
+       movel   R(d2),MEM_PREDEC(res_ptr)
+
+       dbf     R(s_size),L(LRoop)
+       roxrl   #1,R(d0)                /* save cy in msb */
+       subl    #0x10000,R(s_size)
+       bcs     L(LRend)
+       addl    R(d0),R(d0)             /* restore cy */
+       bra     L(LRoop)
+
+L(LRend:)
+/* Restore used registers from stack frame.  */
+       moveml  MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+       rts
+EPILOG(mpihelp_rshift)
+
+
+
+
diff --git a/mpi/m68k/mpih-sub1.S b/mpi/m68k/mpih-sub1.S
new file mode 100644 (file)
index 0000000..b5de0b9
--- /dev/null
@@ -0,0 +1,94 @@
+/* mc68020 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and
+ *                        store difference in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (sp + 4)
+ *                mpi_ptr_t s1_ptr,    (sp + 8)
+ *                mpi_ptr_t s2_ptr,    (sp + 16)
+ *                mpi_size_t size)     (sp + 12)
+ */
+
+
+       TEXT
+       ALIGN
+       GLOBL   C_SYMBOL_NAME(mpihelp_sub_n)
+
+C_SYMBOL_NAME(mpihelp_sub_n:)
+PROLOG(mpihelp_sub_n)
+/* Save used registers on the stack.  */
+       movel   R(d2),MEM_PREDEC(sp)
+       movel   R(a2),MEM_PREDEC(sp)
+
+/* Copy the arguments to registers.  Better use movem? */
+       movel   MEM_DISP(sp,12),R(a2)
+       movel   MEM_DISP(sp,16),R(a0)
+       movel   MEM_DISP(sp,20),R(a1)
+       movel   MEM_DISP(sp,24),R(d2)
+
+       eorw    #1,R(d2)
+       lsrl    #1,R(d2)
+       bcc     L(L1)
+       subql   #1,R(d2)        /* clears cy as side effect */
+
+L(Loop:)
+       movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       subxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+L(L1:) movel   MEM_POSTINC(a0),R(d0)
+       movel   MEM_POSTINC(a1),R(d1)
+       subxl   R(d1),R(d0)
+       movel   R(d0),MEM_POSTINC(a2)
+
+       dbf     R(d2),L(Loop)           /* loop until 16 lsb of %4 == -1 */
+       subxl   R(d0),R(d0)     /* d0 <= -cy; save cy as 0 or -1 in d0 */
+       subl    #0x10000,R(d2)
+       bcs     L(L2)
+       addl    R(d0),R(d0)     /* restore cy */
+       bra     L(Loop)
+
+L(L2:)
+       negl    R(d0)
+
+/* Restore used registers from stack frame.  */
+       movel   MEM_POSTINC(sp),R(a2)
+       movel   MEM_POSTINC(sp),R(d2)
+
+       rts
+EPILOG(mpihelp_sub_n)
+
+
diff --git a/mpi/m68k/syntax.h b/mpi/m68k/syntax.h
new file mode 100644 (file)
index 0000000..ad27a32
--- /dev/null
@@ -0,0 +1,188 @@
+/* asm.h -- Definitions for 68k syntax variations.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+#undef ALIGN
+
+#ifdef MIT_SYNTAX
+#define PROLOG(name)
+#define EPILOG(name)
+#define R(r)r
+#define MEM(base)base@
+#define MEM_DISP(base,displacement)base@(displacement)
+#define MEM_INDX(base,idx,size_suffix)base@(idx:size_suffix)
+#define MEM_INDX1(base,idx,size_suffix,scale)base@(idx:size_suffix:scale)
+#define MEM_PREDEC(memory_base)memory_base@-
+#define MEM_POSTINC(memory_base)memory_base@+
+#define L(label) label
+#define TEXT .text
+#define ALIGN .even
+#define GLOBL .globl
+#define moveql moveq
+/* Use variable sized opcodes.  */
+#define bcc jcc
+#define bcs jcs
+#define bls jls
+#define beq jeq
+#define bne jne
+#define bra jra
+#endif
+
+#ifdef SONY_SYNTAX
+#define PROLOG(name)
+#define EPILOG(name)
+#define R(r)r
+#define MEM(base)(base)
+#define MEM_DISP(base,displacement)(displacement,base)
+#define MEM_INDX(base,idx,size_suffix)(base,idx.size_suffix)
+#define MEM_INDX1(base,idx,size_suffix,scale)(base,idx.size_suffix*scale)
+#define MEM_PREDEC(memory_base)-(memory_base)
+#define MEM_POSTINC(memory_base)(memory_base)+
+#define L(label) label
+#define TEXT .text
+#define ALIGN .even
+#define GLOBL .globl
+#endif
+
+#ifdef MOTOROLA_SYNTAX
+#define PROLOG(name)
+#define EPILOG(name)
+#define R(r)r
+#define MEM(base)(base)
+#define MEM_DISP(base,displacement)(displacement,base)
+#define MEM_INDX(base,idx,size_suffix)(base,idx.size_suffix)
+#define MEM_INDX1(base,idx,size_suffix,scale)(base,idx.size_suffix*scale)
+#define MEM_PREDEC(memory_base)-(memory_base)
+#define MEM_POSTINC(memory_base)(memory_base)+
+#define L(label) label
+#define TEXT
+#define ALIGN
+#define GLOBL XDEF
+#define lea LEA
+#define movel MOVE.L
+#define moveml MOVEM.L
+#define moveql MOVEQ.L
+#define cmpl CMP.L
+#define orl OR.L
+#define clrl CLR.L
+#define eorw EOR.W
+#define lsrl LSR.L
+#define lsll LSL.L
+#define roxrl ROXR.L
+#define roxll ROXL.L
+#define addl ADD.L
+#define addxl ADDX.L
+#define addql ADDQ.L
+#define subl SUB.L
+#define subxl SUBX.L
+#define subql SUBQ.L
+#define negl NEG.L
+#define mulul MULU.L
+#define bcc BCC
+#define bcs BCS
+#define bls BLS
+#define beq BEQ
+#define bne BNE
+#define bra BRA
+#define dbf DBF
+#define rts RTS
+#define d0 D0
+#define d1 D1
+#define d2 D2
+#define d3 D3
+#define d4 D4
+#define d5 D5
+#define d6 D6
+#define d7 D7
+#define a0 A0
+#define a1 A1
+#define a2 A2
+#define a3 A3
+#define a4 A4
+#define a5 A5
+#define a6 A6
+#define a7 A7
+#define sp SP
+#endif
+
+#ifdef ELF_SYNTAX
+#define PROLOG(name) .type name,@function
+#define EPILOG(name) .size name,.-name
+#define MEM(base)(R(base))
+#define MEM_DISP(base,displacement)(displacement,R(base))
+#define MEM_PREDEC(memory_base)-(R(memory_base))
+#define MEM_POSTINC(memory_base)(R(memory_base))+
+#ifdef __STDC__
+#define R_(r)%##r
+#define R(r)R_(r)
+#define MEM_INDX_(base,idx,size_suffix)(R(base),R(idx##.##size_suffix))
+#define MEM_INDX(base,idx,size_suffix)MEM_INDX_(base,idx,size_suffix)
+#define MEM_INDX1_(base,idx,size_suffix,scale)(R(base),R(idx##.##size_suffix*scale))
+#define MEM_INDX1(base,idx,size_suffix,scale)MEM_INDX1_(base,idx,size_suffix,scale)
+#define L(label) .##label
+#else
+#define R(r)%/**/r
+#define MEM_INDX(base,idx,size_suffix)(R(base),R(idx).size_suffix)
+#define MEM_INDX1(base,idx,size_suffix,scale)(R(base),R(idx).size_suffix*scale)
+#define L(label) ./**/label
+#endif
+#define TEXT .text
+#define ALIGN .align 2
+#define GLOBL .globl
+#define bcc jbcc
+#define bcs jbcs
+#define bls jbls
+#define beq jbeq
+#define bne jbne
+#define bra jbra
+#endif
+
+#if defined (SONY_SYNTAX) || defined (ELF_SYNTAX)
+#define movel move.l
+#define moveml movem.l
+#define moveql moveq.l
+#define cmpl cmp.l
+#define orl or.l
+#define clrl clr.l
+#define eorw eor.w
+#define lsrl lsr.l
+#define lsll lsl.l
+#define roxrl roxr.l
+#define roxll roxl.l
+#define addl add.l
+#define addxl addx.l
+#define addql addq.l
+#define subl sub.l
+#define subxl subx.l
+#define subql subq.l
+#define negl neg.l
+#define mulul mulu.l
+#endif
diff --git a/mpi/mips3/README b/mpi/mips3/README
new file mode 100644 (file)
index 0000000..e94b2c7
--- /dev/null
@@ -0,0 +1,23 @@
+This directory contains mpn functions optimized for MIPS3.  Example of
+processors that implement MIPS3 are R4000, R4400, R4600, R4700, and R8000.
+
+RELEVANT OPTIMIZATION ISSUES
+
+1. On the R4000 and R4400, branches, both the plain and the "likely" ones,
+   take 3 cycles to execute.  (The fastest possible loop will take 4 cycles,
+   because of the delay insn.)
+
+   On the R4600, branches takes a single cycle
+
+   On the R8000, branches often take no noticable cycles, as they are
+   executed in a separate function unit..
+
+2. The R4000 and R4400 have a load latency of 4 cycles.
+
+3. On the R4000 and R4400, multiplies take a data-dependent number of
+   cycles, contrary to the SGI documentation.  There seem to be 3 or 4
+   possible latencies.
+
+STATUS
+
+Good...
diff --git a/mpi/mips3/distfiles b/mpi/mips3/distfiles
new file mode 100644 (file)
index 0000000..85260fc
--- /dev/null
@@ -0,0 +1,10 @@
+README
+mpih-add1.S
+mpih-sub1.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-lshift.S
+mpih-rshift.S
+mpi-asm-defs.h
+
diff --git a/mpi/mips3/mpi-asm-defs.h b/mpi/mips3/mpi-asm-defs.h
new file mode 100644 (file)
index 0000000..2d9a9c1
--- /dev/null
@@ -0,0 +1,10 @@
+/* This file defines some basic constants for the MPI machinery.  We
+ * need to define the types on a per-CPU basis, so it is done with
+ * this file here.  */
+#define BYTES_PER_MPI_LIMB  8
+
+
+
+
+
+
diff --git a/mpi/mips3/mpih-add1.S b/mpi/mips3/mpih-add1.S
new file mode 100644 (file)
index 0000000..d3ea91d
--- /dev/null
@@ -0,0 +1,125 @@
+/* mips3  add_n -- Add two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1995, 1998, 2000
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  ($4)
+ *                mpi_ptr_t s1_ptr,    ($5)
+ *                mpi_ptr_t s2_ptr,    ($6)
+ *                mpi_size_t size)     ($7)
+ */
+
+       .text
+       .align  2
+       .globl  mpihelp_add_n
+       .ent    mpihelp_add_n
+mpihelp_add_n:
+       .set    noreorder
+       .set    nomacro
+
+       ld      $10,0($5)
+       ld      $11,0($6)
+
+       daddiu  $7,$7,-1
+       and     $9,$7,4-1       # number of limbs in first loop
+       beq     $9,$0,.L0       # if multiple of 4 limbs, skip first loop
+        move   $2,$0
+
+       dsubu   $7,$7,$9
+
+.Loop0: daddiu $9,$9,-1
+       ld      $12,8($5)
+       daddu   $11,$11,$2
+       ld      $13,8($6)
+       sltu    $8,$11,$2
+       daddu   $11,$10,$11
+       sltu    $2,$11,$10
+       sd      $11,0($4)
+       or      $2,$2,$8
+
+       daddiu  $5,$5,8
+       daddiu  $6,$6,8
+       move    $10,$12
+       move    $11,$13
+       bne     $9,$0,.Loop0
+        daddiu $4,$4,8
+
+.L0:   beq     $7,$0,.Lend
+        nop
+
+.Loop: daddiu  $7,$7,-4
+
+       ld      $12,8($5)
+       daddu   $11,$11,$2
+       ld      $13,8($6)
+       sltu    $8,$11,$2
+       daddu   $11,$10,$11
+       sltu    $2,$11,$10
+       sd      $11,0($4)
+       or      $2,$2,$8
+
+       ld      $10,16($5)
+       daddu   $13,$13,$2
+       ld      $11,16($6)
+       sltu    $8,$13,$2
+       daddu   $13,$12,$13
+       sltu    $2,$13,$12
+       sd      $13,8($4)
+       or      $2,$2,$8
+
+       ld      $12,24($5)
+       daddu   $11,$11,$2
+       ld      $13,24($6)
+       sltu    $8,$11,$2
+       daddu   $11,$10,$11
+       sltu    $2,$11,$10
+       sd      $11,16($4)
+       or      $2,$2,$8
+
+       ld      $10,32($5)
+       daddu   $13,$13,$2
+       ld      $11,32($6)
+       sltu    $8,$13,$2
+       daddu   $13,$12,$13
+       sltu    $2,$13,$12
+       sd      $13,24($4)
+       or      $2,$2,$8
+
+       daddiu  $5,$5,32
+       daddiu  $6,$6,32
+
+       bne     $7,$0,.Loop
+        daddiu $4,$4,32
+
+.Lend: daddu   $11,$11,$2
+       sltu    $8,$11,$2
+       daddu   $11,$10,$11
+       sltu    $2,$11,$10
+       sd      $11,0($4)
+       j       $31
+       or      $2,$2,$8
+
+       .end    mpihelp_add_n
+
diff --git a/mpi/mips3/mpih-lshift.S b/mpi/mips3/mpih-lshift.S
new file mode 100644 (file)
index 0000000..7eca648
--- /dev/null
@@ -0,0 +1,98 @@
+/* mips3    lshift
+ *
+ *      Copyright (C) 1995, 1998, 2000,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       ($4)
+ *                mpi_ptr_t up,        ($5)
+ *                mpi_size_t usize,    ($6)
+ *                unsigned cnt)        ($7)
+ */
+
+       .text
+       .align  2
+       .globl  mpihelp_lshift
+       .ent    mpihelp_lshift
+mpihelp_lshift:
+       .set    noreorder
+       .set    nomacro
+
+       dsll    $2,$6,3
+       daddu   $5,$5,$2        # make r5 point at end of src
+       ld      $10,-8($5)      # load first limb
+       dsubu   $13,$0,$7
+       daddu   $4,$4,$2        # make r4 point at end of res
+       daddiu  $6,$6,-1
+       and     $9,$6,4-1       # number of limbs in first loop
+       beq     $9,$0,.L0       # if multiple of 4 limbs, skip first loop
+        dsrl   $2,$10,$13      # compute function result
+
+       dsubu   $6,$6,$9
+
+.Loop0: ld     $3,-16($5)
+       daddiu  $4,$4,-8
+       daddiu  $5,$5,-8
+       daddiu  $9,$9,-1
+       dsll    $11,$10,$7
+       dsrl    $12,$3,$13
+       move    $10,$3
+       or      $8,$11,$12
+       bne     $9,$0,.Loop0
+        sd     $8,0($4)
+
+.L0:   beq     $6,$0,.Lend
+        nop
+
+.Loop: ld      $3,-16($5)
+       daddiu  $4,$4,-32
+       daddiu  $6,$6,-4
+       dsll    $11,$10,$7
+       dsrl    $12,$3,$13
+
+       ld      $10,-24($5)
+       dsll    $14,$3,$7
+       or      $8,$11,$12
+       sd      $8,24($4)
+       dsrl    $9,$10,$13
+
+       ld      $3,-32($5)
+       dsll    $11,$10,$7
+       or      $8,$14,$9
+       sd      $8,16($4)
+       dsrl    $12,$3,$13
+
+       ld      $10,-40($5)
+       dsll    $14,$3,$7
+       or      $8,$11,$12
+       sd      $8,8($4)
+       dsrl    $9,$10,$13
+
+       daddiu  $5,$5,-32
+       or      $8,$14,$9
+       bgtz    $6,.Loop
+        sd     $8,0($4)
+
+.Lend: dsll    $8,$10,$7
+       j       $31
+       sd      $8,-8($4)
+       .end    mpihelp_lshift
diff --git a/mpi/mips3/mpih-mul1.S b/mpi/mips3/mpih-mul1.S
new file mode 100644 (file)
index 0000000..0562f4f
--- /dev/null
@@ -0,0 +1,90 @@
+/* mips3 mpih-mul1.S -- Multiply a limb vector with a limb and store
+ *                     the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 2000
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (r4)
+ *               mpi_ptr_t s1_ptr,     (r5)
+ *               mpi_size_t s1_size,   (r6)
+ *               mpi_limb_t s2_limb)   (r7)
+ */
+
+       .text
+       .align  4
+       .globl  mpihelp_mul_1
+       .ent    mpihelp_mul_1
+mpihelp_mul_1:
+       .set    noreorder
+       .set    nomacro
+
+/* # warm up phase 0 */
+       ld      $8,0($5)
+
+/* # warm up phase 1 */
+       daddiu  $5,$5,8
+       dmultu  $8,$7
+
+       daddiu  $6,$6,-1
+       beq     $6,$0,$LC0
+        move   $2,$0           # zero cy2
+
+       daddiu  $6,$6,-1
+       beq     $6,$0,$LC1
+       ld      $8,0($5)        # load new s1 limb as early as possible
+
+Loop:  mflo    $10
+       mfhi    $9
+       daddiu  $5,$5,8
+       daddu   $10,$10,$2      # add old carry limb to low product limb
+       dmultu  $8,$7
+       ld      $8,0($5)        # load new s1 limb as early as possible
+       daddiu  $6,$6,-1        # decrement loop counter
+       sltu    $2,$10,$2       # carry from previous addition -> $2
+       sd      $10,0($4)
+       daddiu  $4,$4,8
+       bne     $6,$0,Loop
+        daddu  $2,$9,$2        # add high product limb and carry from addition
+
+/* # cool down phase 1 */
+$LC1:  mflo    $10
+       mfhi    $9
+       daddu   $10,$10,$2
+       sltu    $2,$10,$2
+       dmultu  $8,$7
+       sd      $10,0($4)
+       daddiu  $4,$4,8
+       daddu   $2,$9,$2        # add high product limb and carry from addition
+
+/* # cool down phase 0 */
+$LC0:  mflo    $10
+       mfhi    $9
+       daddu   $10,$10,$2
+       sltu    $2,$10,$2
+       sd      $10,0($4)
+       j       $31
+       daddu   $2,$9,$2        # add high product limb and carry from addition
+
+       .end    mpihelp_mul_1
+
diff --git a/mpi/mips3/mpih-mul2.S b/mpi/mips3/mpih-mul2.S
new file mode 100644 (file)
index 0000000..de56355
--- /dev/null
@@ -0,0 +1,102 @@
+/* MIPS3   addmul_1 -- Multiply a limb vector with a single limb and
+ *                    add the product to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 2000
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r4)
+ *                  mpi_ptr_t s1_ptr,       (r5)
+ *                  mpi_size_t s1_size,     (r6)
+ *                  mpi_limb_t s2_limb)     (r7)
+ */
+
+       .text
+       .align  4
+       .globl  mpihelp_addmul_1
+       .ent    mpihelp_addmul_1
+mpihelp_addmul_1:
+       .set    noreorder
+       .set    nomacro
+
+/* # warm up phase 0 */
+       ld      $8,0($5)
+
+/* # warm up phase 1 */
+       daddiu  $5,$5,8
+       dmultu  $8,$7
+
+       daddiu  $6,$6,-1
+       beq     $6,$0,$LC0
+        move   $2,$0           # zero cy2
+
+       daddiu  $6,$6,-1
+       beq     $6,$0,$LC1
+       ld      $8,0($5)        # load new s1 limb as early as possible
+
+Loop:  ld      $10,0($4)
+       mflo    $3
+       mfhi    $9
+       daddiu  $5,$5,8
+       daddu   $3,$3,$2        # add old carry limb to low product limb
+       dmultu  $8,$7
+       ld      $8,0($5)        # load new s1 limb as early as possible
+       daddiu  $6,$6,-1        # decrement loop counter
+       sltu    $2,$3,$2        # carry from previous addition -> $2
+       daddu   $3,$10,$3
+       sltu    $10,$3,$10
+       daddu   $2,$2,$10
+       sd      $3,0($4)
+       daddiu  $4,$4,8
+       bne     $6,$0,Loop
+        daddu  $2,$9,$2        # add high product limb and carry from addition
+
+/* # cool down phase 1 */
+$LC1:  ld      $10,0($4)
+       mflo    $3
+       mfhi    $9
+       daddu   $3,$3,$2
+       sltu    $2,$3,$2
+       dmultu  $8,$7
+       daddu   $3,$10,$3
+       sltu    $10,$3,$10
+       daddu   $2,$2,$10
+       sd      $3,0($4)
+       daddiu  $4,$4,8
+       daddu   $2,$9,$2        # add high product limb and carry from addition
+
+/* # cool down phase 0 */
+$LC0:  ld      $10,0($4)
+       mflo    $3
+       mfhi    $9
+       daddu   $3,$3,$2
+       sltu    $2,$3,$2
+       daddu   $3,$10,$3
+       sltu    $10,$3,$10
+       daddu   $2,$2,$10
+       sd      $3,0($4)
+       j       $31
+       daddu   $2,$9,$2        # add high product limb and carry from addition
+
+       .end    mpihelp_addmul_1
+
diff --git a/mpi/mips3/mpih-mul3.S b/mpi/mips3/mpih-mul3.S
new file mode 100644 (file)
index 0000000..960c5c2
--- /dev/null
@@ -0,0 +1,102 @@
+/* MIPS3 submul_1 -- Multiply a limb vector with a single limb and
+ *                  subtract the product from a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 2000
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (r4)
+ *                  mpi_ptr_t s1_ptr,       (r5)
+ *                  mpi_size_t s1_size,     (r6)
+ *                  mpi_limb_t s2_limb)     (r7)
+ */
+
+       .text
+       .align  4
+       .globl  mpihelp_submul_1
+       .ent    mpihelp_submul_1
+mpihelp_submul_1:
+       .set    noreorder
+       .set    nomacro
+
+/* # warm up phase 0 */
+       ld      $8,0($5)
+
+/* # warm up phase 1 */
+       daddiu  $5,$5,8
+       dmultu  $8,$7
+
+       daddiu  $6,$6,-1
+       beq     $6,$0,$LC0
+        move   $2,$0           # zero cy2
+
+       daddiu  $6,$6,-1
+       beq     $6,$0,$LC1
+       ld      $8,0($5)        # load new s1 limb as early as possible
+
+Loop:  ld      $10,0($4)
+       mflo    $3
+       mfhi    $9
+       daddiu  $5,$5,8
+       daddu   $3,$3,$2        # add old carry limb to low product limb
+       dmultu  $8,$7
+       ld      $8,0($5)        # load new s1 limb as early as possible
+       daddiu  $6,$6,-1        # decrement loop counter
+       sltu    $2,$3,$2        # carry from previous addition -> $2
+       dsubu   $3,$10,$3
+       sgtu    $10,$3,$10
+       daddu   $2,$2,$10
+       sd      $3,0($4)
+       daddiu  $4,$4,8
+       bne     $6,$0,Loop
+        daddu  $2,$9,$2        # add high product limb and carry from addition
+
+/* # cool down phase 1 */
+$LC1:  ld      $10,0($4)
+       mflo    $3
+       mfhi    $9
+       daddu   $3,$3,$2
+       sltu    $2,$3,$2
+       dmultu  $8,$7
+       dsubu   $3,$10,$3
+       sgtu    $10,$3,$10
+       daddu   $2,$2,$10
+       sd      $3,0($4)
+       daddiu  $4,$4,8
+       daddu   $2,$9,$2        # add high product limb and carry from addition
+
+/* # cool down phase 0 */
+$LC0:  ld      $10,0($4)
+       mflo    $3
+       mfhi    $9
+       daddu   $3,$3,$2
+       sltu    $2,$3,$2
+       dsubu   $3,$10,$3
+       sgtu    $10,$3,$10
+       daddu   $2,$2,$10
+       sd      $3,0($4)
+       j       $31
+       daddu   $2,$9,$2        # add high product limb and carry from addition
+
+       .end    mpihelp_submul_1
+
diff --git a/mpi/mips3/mpih-rshift.S b/mpi/mips3/mpih-rshift.S
new file mode 100644 (file)
index 0000000..2229c50
--- /dev/null
@@ -0,0 +1,96 @@
+/* mips3    rshift
+ *
+ *      Copyright (C) 1995, 1998, 2000
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       ($4)
+ *                mpi_ptr_t up,        ($5)
+ *                mpi_size_t usize,    ($6)
+ *                unsigned cnt)        ($7)
+ */
+
+       .text
+       .align  2
+       .globl  mpihelp_rshift
+       .ent    mpihelp_rshift
+mpihelp_rshift:
+       .set    noreorder
+       .set    nomacro
+
+       ld      $10,0($5)       # load first limb
+       dsubu   $13,$0,$7
+       daddiu  $6,$6,-1
+       and     $9,$6,4-1       # number of limbs in first loop
+       beq     $9,$0,.L0       # if multiple of 4 limbs, skip first loop
+        dsll   $2,$10,$13      # compute function result
+
+       dsubu   $6,$6,$9
+
+.Loop0: ld     $3,8($5)
+       daddiu  $4,$4,8
+       daddiu  $5,$5,8
+       daddiu  $9,$9,-1
+       dsrl    $11,$10,$7
+       dsll    $12,$3,$13
+       move    $10,$3
+       or      $8,$11,$12
+       bne     $9,$0,.Loop0
+        sd     $8,-8($4)
+
+.L0:   beq     $6,$0,.Lend
+        nop
+
+.Loop: ld      $3,8($5)
+       daddiu  $4,$4,32
+       daddiu  $6,$6,-4
+       dsrl    $11,$10,$7
+       dsll    $12,$3,$13
+
+       ld      $10,16($5)
+       dsrl    $14,$3,$7
+       or      $8,$11,$12
+       sd      $8,-32($4)
+       dsll    $9,$10,$13
+
+       ld      $3,24($5)
+       dsrl    $11,$10,$7
+       or      $8,$14,$9
+       sd      $8,-24($4)
+       dsll    $12,$3,$13
+
+       ld      $10,32($5)
+       dsrl    $14,$3,$7
+       or      $8,$11,$12
+       sd      $8,-16($4)
+       dsll    $9,$10,$13
+
+       daddiu  $5,$5,32
+       or      $8,$14,$9
+       bgtz    $6,.Loop
+        sd     $8,-8($4)
+
+.Lend: dsrl    $8,$10,$7
+       j       $31
+       sd      $8,0($4)
+       .end    mpihelp_rshift
+
diff --git a/mpi/mips3/mpih-sub1.S b/mpi/mips3/mpih-sub1.S
new file mode 100644 (file)
index 0000000..d23ff9b
--- /dev/null
@@ -0,0 +1,126 @@
+/* mips3  sub_n -- Subtract two limb vectors of the same length > 0 and
+ *               store difference in a third limb vector.
+ * 
+ *      Copyright (C) 1995, 1998, 1999, 2000,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (r4)
+ *                mpi_ptr_t s1_ptr,    (r5)
+ *                mpi_ptr_t s2_ptr,    (r6)
+ *                mpi_size_t size)     (r7)
+ */
+
+
+       .text
+       .align  2
+       .globl  mpihelp_sub_n
+       .ent    mpihelp_sub_n
+mpihelp_sub_n:
+       .set    noreorder
+       .set    nomacro
+
+       ld      $10,0($5)
+       ld      $11,0($6)
+
+       daddiu  $7,$7,-1
+       and     $9,$7,4-1       # number of limbs in first loop
+       beq     $9,$0,.L0       # if multiple of 4 limbs, skip first loop
+       move   $2,$0
+
+       dsubu   $7,$7,$9
+
+.Loop0: daddiu $9,$9,-1
+       ld      $12,8($5)
+       daddu   $11,$11,$2
+       ld      $13,8($6)
+       sltu    $8,$11,$2
+       dsubu   $11,$10,$11
+       sltu    $2,$10,$11
+       sd      $11,0($4)
+       or      $2,$2,$8
+
+       daddiu  $5,$5,8
+       daddiu  $6,$6,8
+       move    $10,$12
+       move    $11,$13
+       bne     $9,$0,.Loop0
+        daddiu $4,$4,8
+
+.L0:   beq     $7,$0,.Lend
+        nop
+
+.Loop: daddiu  $7,$7,-4
+
+       ld      $12,8($5)
+       daddu   $11,$11,$2
+       ld      $13,8($6)
+       sltu    $8,$11,$2
+       dsubu   $11,$10,$11
+       sltu    $2,$10,$11
+       sd      $11,0($4)
+       or      $2,$2,$8
+
+       ld      $10,16($5)
+       daddu   $13,$13,$2
+       ld      $11,16($6)
+       sltu    $8,$13,$2
+       dsubu   $13,$12,$13
+       sltu    $2,$12,$13
+       sd      $13,8($4)
+       or      $2,$2,$8
+
+       ld      $12,24($5)
+       daddu   $11,$11,$2
+       ld      $13,24($6)
+       sltu    $8,$11,$2
+       dsubu   $11,$10,$11
+       sltu    $2,$10,$11
+       sd      $11,16($4)
+       or      $2,$2,$8
+
+       ld      $10,32($5)
+       daddu   $13,$13,$2
+       ld      $11,32($6)
+       sltu    $8,$13,$2
+       dsubu   $13,$12,$13
+       sltu    $2,$12,$13
+       sd      $13,24($4)
+       or      $2,$2,$8
+
+       daddiu  $5,$5,32
+       daddiu  $6,$6,32
+
+       bne     $7,$0,.Loop
+        daddiu $4,$4,32
+
+.Lend: daddu   $11,$11,$2
+       sltu    $8,$11,$2
+       dsubu   $11,$10,$11
+       sltu    $2,$10,$11
+       sd      $11,0($4)
+       j       $31
+       or      $2,$2,$8
+
+       .end    mpihelp_sub_n
+
diff --git a/mpi/mpi-add.c b/mpi/mpi-add.c
new file mode 100644 (file)
index 0000000..d8bd46b
--- /dev/null
@@ -0,0 +1,248 @@
+/* mpi-add.c  -  MPI functions
+ *     Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ *     Copyright (C) 1994, 1996 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mpi-internal.h"
+
+
+/****************
+ * Add the unsigned integer V to the mpi-integer U and store the
+ * result in W. U and V may be the same.
+ */
+void
+mpi_add_ui(MPI w, MPI u, unsigned long v )
+{
+    mpi_ptr_t wp, up;
+    mpi_size_t usize, wsize;
+    int usign, wsign;
+
+    usize = u->nlimbs;
+    usign = u->sign;
+    wsign = 0;
+
+    /* If not space for W (and possible carry), increase space.  */
+    wsize = usize + 1;
+    if( w->alloced < wsize )
+       mpi_resize(w, wsize);
+
+    /* These must be after realloc (U may be the same as W).  */
+    up = u->d;
+    wp = w->d;
+
+    if( !usize ) {  /* simple */
+       wp[0] = v;
+       wsize = v? 1:0;
+    }
+    else if( !usign ) {  /* mpi is not negative */
+       mpi_limb_t cy;
+       cy = mpihelp_add_1(wp, up, usize, v);
+       wp[usize] = cy;
+       wsize = usize + cy;
+    }
+    else {  /* The signs are different.  Need exact comparison to determine
+            * which operand to subtract from which.  */
+       if( usize == 1 && up[0] < v ) {
+           wp[0] = v - up[0];
+           wsize = 1;
+       }
+       else {
+           mpihelp_sub_1(wp, up, usize, v);
+           /* Size can decrease with at most one limb. */
+           wsize = usize - (wp[usize-1]==0);
+           wsign = 1;
+       }
+    }
+
+    w->nlimbs = wsize;
+    w->sign   = wsign;
+}
+
+
+void
+mpi_add(MPI w, MPI u, MPI v)
+{
+    mpi_ptr_t wp, up, vp;
+    mpi_size_t usize, vsize, wsize;
+    int usign, vsign, wsign;
+
+    if( u->nlimbs < v->nlimbs ) { /* Swap U and V. */
+       usize = v->nlimbs;
+       usign = v->sign;
+       vsize = u->nlimbs;
+       vsign = u->sign;
+       wsize = usize + 1;
+       RESIZE_IF_NEEDED(w, wsize);
+       /* These must be after realloc (u or v may be the same as w).  */
+       up    = v->d;
+       vp    = u->d;
+    }
+    else {
+       usize = u->nlimbs;
+       usign = u->sign;
+       vsize = v->nlimbs;
+       vsign = v->sign;
+       wsize = usize + 1;
+       RESIZE_IF_NEEDED(w, wsize);
+       /* These must be after realloc (u or v may be the same as w).  */
+       up    = u->d;
+       vp    = v->d;
+    }
+    wp = w->d;
+    wsign = 0;
+
+    if( !vsize ) {  /* simple */
+       MPN_COPY(wp, up, usize );
+       wsize = usize;
+       wsign = usign;
+    }
+    else if( usign != vsign ) { /* different sign */
+       /* This test is right since USIZE >= VSIZE */
+       if( usize != vsize ) {
+           mpihelp_sub(wp, up, usize, vp, vsize);
+           wsize = usize;
+           MPN_NORMALIZE(wp, wsize);
+           wsign = usign;
+       }
+       else if( mpihelp_cmp(up, vp, usize) < 0 ) {
+           mpihelp_sub_n(wp, vp, up, usize);
+           wsize = usize;
+           MPN_NORMALIZE(wp, wsize);
+           if( !usign )
+               wsign = 1;
+       }
+       else {
+           mpihelp_sub_n(wp, up, vp, usize);
+           wsize = usize;
+           MPN_NORMALIZE(wp, wsize);
+           if( usign )
+               wsign = 1;
+       }
+    }
+    else { /* U and V have same sign. Add them. */
+       mpi_limb_t cy = mpihelp_add(wp, up, usize, vp, vsize);
+       wp[usize] = cy;
+       wsize = usize + cy;
+       if( usign )
+           wsign = 1;
+    }
+
+    w->nlimbs = wsize;
+    w->sign = wsign;
+}
+
+
+/****************
+ * Subtract the unsigned integer V from the mpi-integer U and store the
+ * result in W.
+ */
+void
+mpi_sub_ui(MPI w, MPI u, unsigned long v )
+{
+    mpi_ptr_t wp, up;
+    mpi_size_t usize, wsize;
+    int usign, wsign;
+
+    usize = u->nlimbs;
+    usign = u->sign;
+    wsign = 0;
+
+    /* If not space for W (and possible carry), increase space.  */
+    wsize = usize + 1;
+    if( w->alloced < wsize )
+       mpi_resize(w, wsize);
+
+    /* These must be after realloc (U may be the same as W).  */
+    up = u->d;
+    wp = w->d;
+
+    if( !usize ) {  /* simple */
+       wp[0] = v;
+       wsize = v? 1:0;
+       wsign = 1;
+    }
+    else if( usign ) { /* mpi and v are negative */
+       mpi_limb_t cy;
+       cy = mpihelp_add_1(wp, up, usize, v);
+       wp[usize] = cy;
+       wsize = usize + cy;
+    }
+    else {  /* The signs are different.  Need exact comparison to determine
+            * which operand to subtract from which.  */
+       if( usize == 1 && up[0] < v ) {
+           wp[0] = v - up[0];
+           wsize = 1;
+           wsign = 1;
+       }
+       else {
+           mpihelp_sub_1(wp, up, usize, v);
+           /* Size can decrease with at most one limb. */
+           wsize = usize - (wp[usize-1]==0);
+       }
+    }
+
+    w->nlimbs = wsize;
+    w->sign   = wsign;
+}
+
+void
+mpi_sub(MPI w, MPI u, MPI v)
+{
+    if( w == v ) {
+       MPI vv = mpi_copy(v);
+       vv->sign = !vv->sign;
+       mpi_add( w, u, vv );
+       mpi_free(vv);
+    }
+    else {
+       /* fixme: this is not thread-save (we temp. modify v) */
+       v->sign = !v->sign;
+       mpi_add( w, u, v );
+       v->sign = !v->sign;
+    }
+}
+
+
+void
+mpi_addm( MPI w, MPI u, MPI v, MPI m)
+{
+    mpi_add(w, u, v);
+    mpi_fdiv_r( w, w, m );
+}
+
+void
+mpi_subm( MPI w, MPI u, MPI v, MPI m)
+{
+    mpi_sub(w, u, v);
+    mpi_fdiv_r( w, w, m );
+}
+
diff --git a/mpi/mpi-bit.c b/mpi/mpi-bit.c
new file mode 100644 (file)
index 0000000..da9d009
--- /dev/null
@@ -0,0 +1,256 @@
+/* mpi-bit.c  -  MPI bit level fucntions
+ * Copyright (C) 1998, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+#ifdef MPI_INTERNAL_NEED_CLZ_TAB
+#ifdef __STDC__
+const
+#endif
+unsigned char
+__clz_tab[] =
+{
+  0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+  6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+};
+#endif
+
+
+#define A_LIMB_1 ((mpi_limb_t)1)
+
+
+/****************
+ * Sometimes we have MSL (most significant limbs) which are 0;
+ * this is for some reasons not good, so this function removes them.
+ */
+void
+mpi_normalize( MPI a )
+{
+    if( mpi_is_opaque (a) )
+       return;
+
+    for( ; a->nlimbs && !a->d[a->nlimbs-1]; a->nlimbs-- )
+       ;
+}
+
+
+
+/****************
+ * Return the number of bits in A.
+ */
+unsigned
+mpi_get_nbits( MPI a )
+{
+    unsigned n;
+
+    mpi_normalize( a );
+    if( a->nlimbs ) {
+       mpi_limb_t alimb = a->d[a->nlimbs-1];
+       if( alimb )
+           count_leading_zeros( n, alimb );
+       else
+           n = BITS_PER_MPI_LIMB;
+       n = BITS_PER_MPI_LIMB - n + (a->nlimbs-1) * BITS_PER_MPI_LIMB;
+    }
+    else
+       n = 0;
+    return n;
+}
+
+
+/****************
+ * Test whether bit N is set.
+ */
+int
+mpi_test_bit( MPI a, unsigned n )
+{
+    unsigned limbno, bitno;
+    mpi_limb_t limb;
+
+    limbno = n / BITS_PER_MPI_LIMB;
+    bitno  = n % BITS_PER_MPI_LIMB;
+
+    if( limbno >= a->nlimbs )
+       return 0; /* too far left: this is a 0 */
+    limb = a->d[limbno];
+    return (limb & (A_LIMB_1 << bitno))? 1: 0;
+}
+
+
+/****************
+ * Set bit N of A.
+ */
+void
+mpi_set_bit( MPI a, unsigned n )
+{
+    unsigned limbno, bitno;
+
+    limbno = n / BITS_PER_MPI_LIMB;
+    bitno  = n % BITS_PER_MPI_LIMB;
+
+    if( limbno >= a->nlimbs ) { /* resize */
+       if( a->alloced >= limbno )
+           mpi_resize(a, limbno+1 );
+       a->nlimbs = limbno+1;
+    }
+    a->d[limbno] |= (A_LIMB_1<<bitno);
+}
+
+/****************
+ * Set bit N of A. and clear all bits above
+ */
+void
+mpi_set_highbit( MPI a, unsigned n )
+{
+    unsigned limbno, bitno;
+
+    limbno = n / BITS_PER_MPI_LIMB;
+    bitno  = n % BITS_PER_MPI_LIMB;
+
+    if( limbno >= a->nlimbs ) { /* resize */
+       if( a->alloced >= limbno )
+           mpi_resize(a, limbno+1 );
+       a->nlimbs = limbno+1;
+    }
+    a->d[limbno] |= (A_LIMB_1<<bitno);
+    for( bitno++; bitno < BITS_PER_MPI_LIMB; bitno++ )
+       a->d[limbno] &= ~(A_LIMB_1 << bitno);
+    a->nlimbs = limbno+1;
+}
+
+/****************
+ * clear bit N of A and all bits above
+ */
+void
+mpi_clear_highbit( MPI a, unsigned n )
+{
+    unsigned limbno, bitno;
+
+    limbno = n / BITS_PER_MPI_LIMB;
+    bitno  = n % BITS_PER_MPI_LIMB;
+
+    if( limbno >= a->nlimbs )
+       return; /* not allocated, so need to clear bits :-) */
+
+    for( ; bitno < BITS_PER_MPI_LIMB; bitno++ )
+       a->d[limbno] &= ~(A_LIMB_1 << bitno);
+    a->nlimbs = limbno+1;
+}
+
+/****************
+ * Clear bit N of A.
+ */
+void
+mpi_clear_bit( MPI a, unsigned n )
+{
+    unsigned limbno, bitno;
+
+    limbno = n / BITS_PER_MPI_LIMB;
+    bitno  = n % BITS_PER_MPI_LIMB;
+
+    if( limbno >= a->nlimbs )
+       return; /* don't need to clear this bit, it's to far to left */
+    a->d[limbno] &= ~(A_LIMB_1 << bitno);
+}
+
+
+/****************
+ * Shift A by N bits to the right
+ * FIXME: should use alloc_limb if X and A are same.
+ */
+void
+mpi_rshift( MPI x, MPI a, unsigned n )
+{
+    mpi_ptr_t xp;
+    mpi_size_t xsize;
+
+    xsize = a->nlimbs;
+    x->sign = a->sign;
+    RESIZE_IF_NEEDED(x, xsize);
+    xp = x->d;
+
+    if( xsize ) {
+       mpihelp_rshift( xp, a->d, xsize, n);
+       MPN_NORMALIZE( xp, xsize);
+    }
+    x->nlimbs = xsize;
+}
+
+
+/****************
+ * Shift A by COUNT limbs to the left
+ * This is used only within the MPI library
+ */
+void
+mpi_lshift_limbs( MPI a, unsigned int count )
+{
+    mpi_ptr_t ap = a->d;
+    int n = a->nlimbs;
+    int i;
+
+    if( !count || !n )
+       return;
+
+    RESIZE_IF_NEEDED( a, n+count );
+
+    for( i = n-1; i >= 0; i-- )
+       ap[i+count] = ap[i];
+    for(i=0; i < count; i++ )
+       ap[i] = 0;
+    a->nlimbs += count;
+}
+
+
+/****************
+ * Shift A by COUNT limbs to the right
+ * This is used only within the MPI library
+ */
+void
+mpi_rshift_limbs( MPI a, unsigned int count )
+{
+    mpi_ptr_t ap = a->d;
+    mpi_size_t n = a->nlimbs;
+    unsigned int i;
+
+    if( count >= n ) {
+       a->nlimbs = 0;
+       return;
+    }
+
+    for( i = 0; i < n - count; i++ )
+       ap[i] = ap[i+count];
+    ap[i] = 0;
+    a->nlimbs -= count;
+}
+
+
diff --git a/mpi/mpi-cmp.c b/mpi/mpi-cmp.c
new file mode 100644 (file)
index 0000000..083edbf
--- /dev/null
@@ -0,0 +1,75 @@
+/* mpi-cmp.c  -  MPI functions
+ * Copyright (C) 1998, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+
+int
+mpi_cmp_ui( MPI u, unsigned long v )
+{
+    mpi_limb_t limb = v;
+
+    mpi_normalize( u );
+    if( !u->nlimbs && !limb )
+       return 0;
+    if( u->sign )
+       return -1;
+    if( u->nlimbs > 1 )
+       return 1;
+
+    if( u->d[0] == limb )
+       return 0;
+    else if( u->d[0] > limb )
+       return 1;
+    else
+       return -1;
+}
+
+int
+mpi_cmp( MPI u, MPI v )
+{
+    mpi_size_t usize, vsize;
+    int cmp;
+
+    mpi_normalize( u );
+    mpi_normalize( v );
+    usize = u->nlimbs;
+    vsize = v->nlimbs;
+    if( !u->sign && v->sign )
+       return 1;
+    if( u->sign && !v->sign )
+       return -1;
+    if( usize != vsize && !u->sign && !v->sign )
+       return usize - vsize;
+    if( usize != vsize && u->sign && v->sign )
+       return vsize + usize;
+    if( !usize )
+       return 0;
+    if( !(cmp=mpihelp_cmp( u->d, v->d, usize )) )
+       return 0;
+    if( (cmp < 0?1:0) == (u->sign?1:0))
+       return 1;
+    return -1;
+}
+
+
diff --git a/mpi/mpi-div.c b/mpi/mpi-div.c
new file mode 100644 (file)
index 0000000..f29493e
--- /dev/null
@@ -0,0 +1,323 @@
+/* mpi-div.c  -  MPI functions
+ *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+
+void
+mpi_fdiv_r( MPI rem, MPI dividend, MPI divisor )
+{
+    int divisor_sign = divisor->sign;
+    MPI temp_divisor = NULL;
+
+    /* We need the original value of the divisor after the remainder has been
+     * preliminary calculated. We have to copy it to temporary space if it's
+     * the same variable as REM.  */
+    if( rem == divisor ) {
+       temp_divisor = mpi_copy( divisor );
+       divisor = temp_divisor;
+    }
+
+    mpi_tdiv_r( rem, dividend, divisor );
+
+    if( ((divisor_sign?1:0) ^ (dividend->sign?1:0)) && rem->nlimbs )
+       mpi_add( rem, rem, divisor);
+
+    if( temp_divisor )
+       mpi_free(temp_divisor);
+}
+
+
+
+/****************
+ * Division rounding the quotient towards -infinity.
+ * The remainder gets the same sign as the denominator.
+ * rem is optional
+ */
+
+ulong
+mpi_fdiv_r_ui( MPI rem, MPI dividend, ulong divisor )
+{
+    mpi_limb_t rlimb;
+
+    rlimb = mpihelp_mod_1( dividend->d, dividend->nlimbs, divisor );
+    if( rlimb && dividend->sign )
+       rlimb = divisor - rlimb;
+
+    if( rem ) {
+       rem->d[0] = rlimb;
+       rem->nlimbs = rlimb? 1:0;
+    }
+    return rlimb;
+}
+
+
+void
+mpi_fdiv_q( MPI quot, MPI dividend, MPI divisor )
+{
+    MPI tmp = mpi_alloc( mpi_get_nlimbs(quot) );
+    mpi_fdiv_qr( quot, tmp, dividend, divisor);
+    mpi_free(tmp);
+}
+
+void
+mpi_fdiv_qr( MPI quot, MPI rem, MPI dividend, MPI divisor )
+{
+    int divisor_sign = divisor->sign;
+    MPI temp_divisor = NULL;
+
+    if( quot == divisor || rem == divisor ) {
+       temp_divisor = mpi_copy( divisor );
+       divisor = temp_divisor;
+    }
+
+    mpi_tdiv_qr( quot, rem, dividend, divisor );
+
+    if( (divisor_sign ^ dividend->sign) && rem->nlimbs ) {
+       mpi_sub_ui( quot, quot, 1 );
+       mpi_add( rem, rem, divisor);
+    }
+
+    if( temp_divisor )
+       mpi_free(temp_divisor);
+}
+
+
+/* If den == quot, den needs temporary storage.
+ * If den == rem, den needs temporary storage.
+ * If num == quot, num needs temporary storage.
+ * If den has temporary storage, it can be normalized while being copied,
+ *   i.e no extra storage should be allocated.
+ */
+
+void
+mpi_tdiv_r( MPI rem, MPI num, MPI den)
+{
+    mpi_tdiv_qr(NULL, rem, num, den );
+}
+
+void
+mpi_tdiv_qr( MPI quot, MPI rem, MPI num, MPI den)
+{
+    mpi_ptr_t np, dp;
+    mpi_ptr_t qp, rp;
+    mpi_size_t nsize = num->nlimbs;
+    mpi_size_t dsize = den->nlimbs;
+    mpi_size_t qsize, rsize;
+    mpi_size_t sign_remainder = num->sign;
+    mpi_size_t sign_quotient = num->sign ^ den->sign;
+    unsigned normalization_steps;
+    mpi_limb_t q_limb;
+    mpi_ptr_t marker[5];
+    int markidx=0;
+
+    /* Ensure space is enough for quotient and remainder.
+     * We need space for an extra limb in the remainder, because it's
+     * up-shifted (normalized) below.  */
+    rsize = nsize + 1;
+    mpi_resize( rem, rsize);
+
+    qsize = rsize - dsize;       /* qsize cannot be bigger than this.  */
+    if( qsize <= 0 ) {
+       if( num != rem ) {
+           rem->nlimbs = num->nlimbs;
+           rem->sign = num->sign;
+           MPN_COPY(rem->d, num->d, nsize);
+       }
+       if( quot ) {
+           /* This needs to follow the assignment to rem, in case the
+            * numerator and quotient are the same.  */
+           quot->nlimbs = 0;
+           quot->sign = 0;
+       }
+       return;
+    }
+
+    if( quot )
+       mpi_resize( quot, qsize);
+
+    /* Read pointers here, when reallocation is finished.  */
+    np = num->d;
+    dp = den->d;
+    rp = rem->d;
+
+    /* Optimize division by a single-limb divisor.  */
+    if( dsize == 1 ) {
+       mpi_limb_t rlimb;
+       if( quot ) {
+           qp = quot->d;
+           rlimb = mpihelp_divmod_1( qp, np, nsize, dp[0] );
+           qsize -= qp[qsize - 1] == 0;
+           quot->nlimbs = qsize;
+           quot->sign = sign_quotient;
+       }
+       else
+           rlimb = mpihelp_mod_1( np, nsize, dp[0] );
+       rp[0] = rlimb;
+       rsize = rlimb != 0?1:0;
+       rem->nlimbs = rsize;
+       rem->sign = sign_remainder;
+       return;
+    }
+
+
+    if( quot ) {
+       qp = quot->d;
+       /* Make sure QP and NP point to different objects.  Otherwise the
+        * numerator would be gradually overwritten by the quotient limbs.  */
+       if(qp == np) { /* Copy NP object to temporary space.  */
+           np = marker[markidx++] = mpi_alloc_limb_space(nsize,
+                                                         mpi_is_secure(quot));
+           MPN_COPY(np, qp, nsize);
+       }
+    }
+    else /* Put quotient at top of remainder. */
+       qp = rp + dsize;
+
+    count_leading_zeros( normalization_steps, dp[dsize - 1] );
+
+    /* Normalize the denominator, i.e. make its most significant bit set by
+     * shifting it NORMALIZATION_STEPS bits to the left.  Also shift the
+     * numerator the same number of steps (to keep the quotient the same!).
+     */
+    if( normalization_steps ) {
+       mpi_ptr_t tp;
+       mpi_limb_t nlimb;
+
+       /* Shift up the denominator setting the most significant bit of
+        * the most significant word.  Use temporary storage not to clobber
+        * the original contents of the denominator.  */
+       tp = marker[markidx++] = mpi_alloc_limb_space(dsize,mpi_is_secure(den));
+       mpihelp_lshift( tp, dp, dsize, normalization_steps );
+       dp = tp;
+
+       /* Shift up the numerator, possibly introducing a new most
+        * significant word.  Move the shifted numerator in the remainder
+        * meanwhile.  */
+       nlimb = mpihelp_lshift(rp, np, nsize, normalization_steps);
+       if( nlimb ) {
+           rp[nsize] = nlimb;
+           rsize = nsize + 1;
+       }
+       else
+           rsize = nsize;
+    }
+    else {
+       /* The denominator is already normalized, as required.  Copy it to
+        * temporary space if it overlaps with the quotient or remainder.  */
+       if( dp == rp || (quot && (dp == qp))) {
+           mpi_ptr_t tp;
+
+           tp = marker[markidx++] = mpi_alloc_limb_space(dsize, mpi_is_secure(den));
+           MPN_COPY( tp, dp, dsize );
+           dp = tp;
+       }
+
+       /* Move the numerator to the remainder.  */
+       if( rp != np )
+           MPN_COPY(rp, np, nsize);
+
+       rsize = nsize;
+    }
+
+    q_limb = mpihelp_divrem( qp, 0, rp, rsize, dp, dsize );
+
+    if( quot ) {
+       qsize = rsize - dsize;
+       if(q_limb) {
+           qp[qsize] = q_limb;
+           qsize += 1;
+       }
+
+       quot->nlimbs = qsize;
+       quot->sign = sign_quotient;
+    }
+
+    rsize = dsize;
+    MPN_NORMALIZE (rp, rsize);
+
+    if( normalization_steps && rsize ) {
+       mpihelp_rshift(rp, rp, rsize, normalization_steps);
+       rsize -= rp[rsize - 1] == 0?1:0;
+    }
+
+    rem->nlimbs = rsize;
+    rem->sign  = sign_remainder;
+    while( markidx )
+       mpi_free_limb_space(marker[--markidx]);
+}
+
+void
+mpi_tdiv_q_2exp( MPI w, MPI u, unsigned count )
+{
+    mpi_size_t usize, wsize;
+    mpi_size_t limb_cnt;
+
+    usize = u->nlimbs;
+    limb_cnt = count / BITS_PER_MPI_LIMB;
+    wsize = usize - limb_cnt;
+    if( limb_cnt >= usize )
+       w->nlimbs = 0;
+    else {
+       mpi_ptr_t wp;
+       mpi_ptr_t up;
+
+       RESIZE_IF_NEEDED( w, wsize );
+       wp = w->d;
+       up = u->d;
+
+       count %= BITS_PER_MPI_LIMB;
+       if( count ) {
+           mpihelp_rshift( wp, up + limb_cnt, wsize, count );
+           wsize -= !wp[wsize - 1];
+       }
+       else {
+           MPN_COPY_INCR( wp, up + limb_cnt, wsize);
+       }
+
+       w->nlimbs = wsize;
+    }
+}
+
+/****************
+ * Check whether dividend is divisible by divisor
+ * (note: divisor must fit into a limb)
+ */
+int
+mpi_divisible_ui(MPI dividend, ulong divisor )
+{
+    return !mpihelp_mod_1( dividend->d, dividend->nlimbs, divisor );
+}
+
diff --git a/mpi/mpi-gcd.c b/mpi/mpi-gcd.c
new file mode 100644 (file)
index 0000000..6f384ce
--- /dev/null
@@ -0,0 +1,55 @@
+/* mpi-gcd.c  -  MPI functions
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+
+/****************
+ * Find the greatest common divisor G of A and B.
+ * Return: true if this 1, false in all other cases
+ */
+int
+mpi_gcd( MPI g, MPI xa, MPI xb )
+{
+    MPI a, b;
+
+    a = mpi_copy(xa);
+    b = mpi_copy(xb);
+
+    /* TAOCP Vol II, 4.5.2, Algorithm A */
+    a->sign = 0;
+    b->sign = 0;
+    while( mpi_cmp_ui( b, 0 ) ) {
+       mpi_fdiv_r( g, a, b ); /* g used as temorary variable */
+       mpi_set(a,b);
+       mpi_set(b,g);
+    }
+    mpi_set(g, a);
+
+    mpi_free(a);
+    mpi_free(b);
+    return !mpi_cmp_ui( g, 1);
+}
+
+
+
diff --git a/mpi/mpi-inline.c b/mpi/mpi-inline.c
new file mode 100644 (file)
index 0000000..8e29b06
--- /dev/null
@@ -0,0 +1,37 @@
+/* mpi-inline.c
+ * Copyright (C) 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* put the inline functions as real functions into the lib */
+#define G10_MPI_INLINE_DECL
+
+#include "mpi-internal.h"
+
+/* always include the header becuase it is only
+ * included by mpi-internal if __GCC__ is defined but we
+ * need it here in all cases and the above definition of
+ * of the macro allows us to do so
+ */
+#include "mpi-inline.h"
+
diff --git a/mpi/mpi-inline.h b/mpi/mpi-inline.h
new file mode 100644 (file)
index 0000000..db2c6a9
--- /dev/null
@@ -0,0 +1,128 @@
+/* mpi-inline.h  -  Internal to the Multi Precision Integers
+ *     Copyright (C) 1994, 1996, 1998, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#ifndef G10_MPI_INLINE_H
+#define G10_MPI_INLINE_H
+
+#ifndef G10_MPI_INLINE_DECL
+#define G10_MPI_INLINE_DECL  extern __inline__
+#endif
+
+G10_MPI_INLINE_DECL  mpi_limb_t
+mpihelp_add_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+              mpi_size_t s1_size, mpi_limb_t s2_limb)
+{
+    mpi_limb_t x;
+
+    x = *s1_ptr++;
+    s2_limb += x;
+    *res_ptr++ = s2_limb;
+    if( s2_limb < x ) { /* sum is less than the left operand: handle carry */
+       while( --s1_size ) {
+           x = *s1_ptr++ + 1;  /* add carry */
+           *res_ptr++ = x;     /* and store */
+           if( x )             /* not 0 (no overflow): we can stop */
+               goto leave;
+       }
+       return 1; /* return carry (size of s1 to small) */
+    }
+
+  leave:
+    if( res_ptr != s1_ptr ) { /* not the same variable */
+       mpi_size_t i;          /* copy the rest */
+       for( i=0; i < s1_size-1; i++ )
+           res_ptr[i] = s1_ptr[i];
+    }
+    return 0; /* no carry */
+}
+
+
+
+G10_MPI_INLINE_DECL mpi_limb_t
+mpihelp_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+                              mpi_ptr_t s2_ptr, mpi_size_t s2_size)
+{
+    mpi_limb_t cy = 0;
+
+    if( s2_size )
+       cy = mpihelp_add_n( res_ptr, s1_ptr, s2_ptr, s2_size );
+
+    if( s1_size - s2_size )
+       cy = mpihelp_add_1( res_ptr + s2_size, s1_ptr + s2_size,
+                           s1_size - s2_size, cy);
+    return cy;
+}
+
+
+G10_MPI_INLINE_DECL mpi_limb_t
+mpihelp_sub_1(mpi_ptr_t res_ptr,  mpi_ptr_t s1_ptr,
+             mpi_size_t s1_size, mpi_limb_t s2_limb )
+{
+    mpi_limb_t x;
+
+    x = *s1_ptr++;
+    s2_limb = x - s2_limb;
+    *res_ptr++ = s2_limb;
+    if( s2_limb > x ) {
+       while( --s1_size ) {
+           x = *s1_ptr++;
+           *res_ptr++ = x - 1;
+           if( x )
+               goto leave;
+       }
+       return 1;
+    }
+
+  leave:
+    if( res_ptr != s1_ptr ) {
+       mpi_size_t i;
+       for( i=0; i < s1_size-1; i++ )
+           res_ptr[i] = s1_ptr[i];
+    }
+    return 0;
+}
+
+
+
+G10_MPI_INLINE_DECL   mpi_limb_t
+mpihelp_sub( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+                               mpi_ptr_t s2_ptr, mpi_size_t s2_size)
+{
+    mpi_limb_t cy = 0;
+
+    if( s2_size )
+       cy = mpihelp_sub_n(res_ptr, s1_ptr, s2_ptr, s2_size);
+
+    if( s1_size - s2_size )
+       cy = mpihelp_sub_1(res_ptr + s2_size, s1_ptr + s2_size,
+                                     s1_size - s2_size, cy);
+    return cy;
+}
+
+#endif /*G10_MPI_INLINE_H*/
diff --git a/mpi/mpi-internal.h b/mpi/mpi-internal.h
new file mode 100644 (file)
index 0000000..4676fcd
--- /dev/null
@@ -0,0 +1,260 @@
+/* mpi-internal.h  -  Internal to the Multi Precision Integers
+ *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 2000 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#ifndef G10_MPI_INTERNAL_H
+#define G10_MPI_INTERNAL_H
+
+#include "mpi.h"
+
+/* If KARATSUBA_THRESHOLD is not already defined, define it to a
+ * value which is good on most machines.  */
+
+/* tested 4, 16, 32 and 64, where 16 gave the best performance when
+ * checking a 768 and a 1024 bit ElGamal signature.
+ * (wk 22.12.97) */
+#ifndef KARATSUBA_THRESHOLD
+#define KARATSUBA_THRESHOLD 16
+#endif
+
+/* The code can't handle KARATSUBA_THRESHOLD smaller than 2.  */
+#if KARATSUBA_THRESHOLD < 2
+#undef KARATSUBA_THRESHOLD
+#define KARATSUBA_THRESHOLD 2
+#endif
+
+
+typedef mpi_limb_t *mpi_ptr_t; /* pointer to a limb */
+typedef int mpi_size_t;        /* (must be a signed type) */
+
+#define ABS(x) (x >= 0 ? x : -x)
+#define MIN(l,o) ((l) < (o) ? (l) : (o))
+#define MAX(h,i) ((h) > (i) ? (h) : (i))
+#define RESIZE_IF_NEEDED(a,b) \
+    do {                          \
+       if( (a)->alloced < (b) )   \
+           mpi_resize((a), (b));  \
+    } while(0)
+
+/* Copy N limbs from S to D.  */
+#define MPN_COPY( d, s, n) \
+    do {                               \
+       mpi_size_t _i;                  \
+       for( _i = 0; _i < (n); _i++ )   \
+           (d)[_i] = (s)[_i];          \
+    } while(0)
+
+#define MPN_COPY_INCR( d, s, n)        \
+    do {                               \
+       mpi_size_t _i;                  \
+       for( _i = 0; _i < (n); _i++ )   \
+           (d)[_i] = (d)[_i];          \
+    } while (0)
+
+#define MPN_COPY_DECR( d, s, n ) \
+    do {                               \
+       mpi_size_t _i;                  \
+       for( _i = (n)-1; _i >= 0; _i--) \
+          (d)[_i] = (s)[_i];           \
+    } while(0)
+
+/* Zero N limbs at D */
+#define MPN_ZERO(d, n) \
+    do {                                 \
+       int  _i;                          \
+       for( _i = 0; _i < (n); _i++ )  \
+           (d)[_i] = 0;                    \
+    } while (0)
+
+#define MPN_NORMALIZE(d, n)  \
+    do {                      \
+       while( (n) > 0 ) {     \
+           if( (d)[(n)-1] ) \
+               break;         \
+           (n)--;             \
+       }                      \
+    } while(0)
+
+#define MPN_NORMALIZE_NOT_ZERO(d, n) \
+    do {                                   \
+       for(;;) {                           \
+           if( (d)[(n)-1] )                \
+               break;                      \
+           (n)--;                          \
+       }                                   \
+    } while(0)
+
+#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
+    do {                                               \
+       if( (size) < KARATSUBA_THRESHOLD )              \
+           mul_n_basecase (prodp, up, vp, size);       \
+       else                                            \
+           mul_n (prodp, up, vp, size, tspace);        \
+    } while (0);
+
+
+/* Divide the two-limb number in (NH,,NL) by D, with DI being the largest
+ * limb not larger than (2**(2*BITS_PER_MP_LIMB))/D - (2**BITS_PER_MP_LIMB).
+ * If this would yield overflow, DI should be the largest possible number
+ * (i.e., only ones).  For correct operation, the most significant bit of D
+ * has to be set.  Put the quotient in Q and the remainder in R.
+ */
+#define UDIV_QRNND_PREINV(q, r, nh, nl, d, di) \
+    do {                                                           \
+       mpi_limb_t _q, _ql, _r;                                     \
+       mpi_limb_t _xh, _xl;                                        \
+       umul_ppmm (_q, _ql, (nh), (di));                            \
+       _q += (nh);     /* DI is 2**BITS_PER_MPI_LIMB too small */  \
+       umul_ppmm (_xh, _xl, _q, (d));                              \
+       sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl);                 \
+       if( _xh ) {                                                 \
+           sub_ddmmss (_xh, _r, _xh, _r, 0, (d));                  \
+           _q++;                                                   \
+           if( _xh) {                                              \
+               sub_ddmmss (_xh, _r, _xh, _r, 0, (d));              \
+               _q++;                                               \
+           }                                                       \
+       }                                                           \
+       if( _r >= (d) ) {                                           \
+           _r -= (d);                                              \
+           _q++;                                                   \
+       }                                                           \
+       (r) = _r;                                                   \
+       (q) = _q;                                                   \
+    } while (0)
+
+
+/*-- mpiutil.c --*/
+#ifdef M_DEBUG
+#define mpi_alloc_limb_space(n,f)  mpi_debug_alloc_limb_space((n),(f), M_DBGINFO( __LINE__ ) )
+#define mpi_free_limb_space(n)  mpi_debug_free_limb_space((n),  M_DBGINFO( __LINE__ ) )
+  mpi_ptr_t mpi_debug_alloc_limb_space( unsigned nlimbs, int sec, const char *info  );
+  void mpi_debug_free_limb_space( mpi_ptr_t a, const char *info );
+#else
+  mpi_ptr_t mpi_alloc_limb_space( unsigned nlimbs, int sec );
+  void mpi_free_limb_space( mpi_ptr_t a );
+#endif
+void mpi_assign_limb_space( MPI a, mpi_ptr_t ap, unsigned nlimbs );
+
+/*-- mpi-bit.c --*/
+void mpi_rshift_limbs( MPI a, unsigned int count );
+void mpi_lshift_limbs( MPI a, unsigned int count );
+
+
+/*-- mpihelp-add.c --*/
+mpi_limb_t mpihelp_add_1(mpi_ptr_t res_ptr,  mpi_ptr_t s1_ptr,
+                        mpi_size_t s1_size, mpi_limb_t s2_limb );
+mpi_limb_t mpihelp_add_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                         mpi_ptr_t s2_ptr,  mpi_size_t size);
+mpi_limb_t mpihelp_add(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+                      mpi_ptr_t s2_ptr, mpi_size_t s2_size);
+
+/*-- mpihelp-sub.c --*/
+mpi_limb_t mpihelp_sub_1( mpi_ptr_t res_ptr,  mpi_ptr_t s1_ptr,
+                         mpi_size_t s1_size, mpi_limb_t s2_limb );
+mpi_limb_t mpihelp_sub_n( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                         mpi_ptr_t s2_ptr, mpi_size_t size);
+mpi_limb_t mpihelp_sub(mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr, mpi_size_t s1_size,
+                      mpi_ptr_t s2_ptr, mpi_size_t s2_size);
+
+/*-- mpihelp-cmp.c --*/
+int mpihelp_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size );
+
+/*-- mpihelp-mul.c --*/
+
+struct karatsuba_ctx {
+    struct karatsuba_ctx *next;
+    mpi_ptr_t tspace;
+    mpi_size_t tspace_size;
+    mpi_ptr_t tp;
+    mpi_size_t tp_size;
+};
+
+void mpihelp_release_karatsuba_ctx( struct karatsuba_ctx *ctx );
+
+mpi_limb_t mpihelp_addmul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                            mpi_size_t s1_size, mpi_limb_t s2_limb);
+mpi_limb_t mpihelp_submul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                            mpi_size_t s1_size, mpi_limb_t s2_limb);
+void mpihelp_mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp,
+                                                  mpi_size_t size);
+mpi_limb_t mpihelp_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize,
+                                        mpi_ptr_t vp, mpi_size_t vsize);
+void mpih_sqr_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size );
+void mpih_sqr_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size,
+                                               mpi_ptr_t tspace);
+
+void mpihelp_mul_karatsuba_case( mpi_ptr_t prodp,
+                                mpi_ptr_t up, mpi_size_t usize,
+                                mpi_ptr_t vp, mpi_size_t vsize,
+                                struct karatsuba_ctx *ctx );
+
+
+/*-- mpihelp-mul_1.c (or xxx/cpu/ *.S) --*/
+mpi_limb_t mpihelp_mul_1( mpi_ptr_t res_ptr, mpi_ptr_t s1_ptr,
+                         mpi_size_t s1_size, mpi_limb_t s2_limb);
+
+/*-- mpihelp-div.c --*/
+mpi_limb_t mpihelp_mod_1(mpi_ptr_t dividend_ptr, mpi_size_t dividend_size,
+                                                mpi_limb_t divisor_limb);
+mpi_limb_t mpihelp_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs,
+                          mpi_ptr_t np, mpi_size_t nsize,
+                          mpi_ptr_t dp, mpi_size_t dsize);
+mpi_limb_t mpihelp_divmod_1( mpi_ptr_t quot_ptr,
+                            mpi_ptr_t dividend_ptr, mpi_size_t dividend_size,
+                            mpi_limb_t divisor_limb);
+
+/*-- mpihelp-shift.c --*/
+mpi_limb_t mpihelp_lshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
+                                                          unsigned cnt);
+mpi_limb_t mpihelp_rshift( mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize,
+                                                          unsigned cnt);
+
+
+/* Define stuff for longlong.h.  */
+#define W_TYPE_SIZE BITS_PER_MPI_LIMB
+  typedef mpi_limb_t   UWtype;
+  typedef unsigned int UHWtype;
+#if defined (__GNUC__)
+  typedef unsigned int UQItype   __attribute__ ((mode (QI)));
+  typedef         int SItype     __attribute__ ((mode (SI)));
+  typedef unsigned int USItype   __attribute__ ((mode (SI)));
+  typedef         int DItype     __attribute__ ((mode (DI)));
+  typedef unsigned int UDItype   __attribute__ ((mode (DI)));
+#else
+  typedef unsigned char UQItype;
+  typedef         long SItype;
+  typedef unsigned long USItype;
+#endif
+
+#ifdef __GNUC__
+#include "mpi-inline.h"
+#endif
+
+#endif /*G10_MPI_INTERNAL_H*/
diff --git a/mpi/mpi-inv.c b/mpi/mpi-inv.c
new file mode 100644 (file)
index 0000000..bc4d589
--- /dev/null
@@ -0,0 +1,268 @@
+/* mpi-inv.c  -  MPI functions
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+
+
+/****************
+ * Calculate the multiplicative inverse X of A mod N
+ * That is: Find the solution x for
+ *             1 = (a*x) mod n
+ */
+void
+mpi_invm( MPI x, MPI a, MPI n )
+{
+#if 0
+    MPI u, v, u1, u2, u3, v1, v2, v3, q, t1, t2, t3;
+    MPI ta, tb, tc;
+
+    u = mpi_copy(a);
+    v = mpi_copy(n);
+    u1 = mpi_alloc_set_ui(1);
+    u2 = mpi_alloc_set_ui(0);
+    u3 = mpi_copy(u);
+    v1 = mpi_alloc_set_ui(0);
+    v2 = mpi_alloc_set_ui(1);
+    v3 = mpi_copy(v);
+    q  = mpi_alloc( mpi_get_nlimbs(u)+1 );
+    t1 = mpi_alloc( mpi_get_nlimbs(u)+1 );
+    t2 = mpi_alloc( mpi_get_nlimbs(u)+1 );
+    t3 = mpi_alloc( mpi_get_nlimbs(u)+1 );
+    while( mpi_cmp_ui( v3, 0 ) ) {
+       mpi_fdiv_q( q, u3, v3 );
+       mpi_mul(t1, v1, q); mpi_mul(t2, v2, q); mpi_mul(t3, v3, q);
+       mpi_sub(t1, u1, t1); mpi_sub(t2, u2, t2); mpi_sub(t3, u3, t3);
+       mpi_set(u1, v1); mpi_set(u2, v2); mpi_set(u3, v3);
+       mpi_set(v1, t1); mpi_set(v2, t2); mpi_set(v3, t3);
+    }
+    /* log_debug("result:\n");
+       log_mpidump("q =", q );
+       log_mpidump("u1=", u1);
+       log_mpidump("u2=", u2);
+       log_mpidump("u3=", u3);
+       log_mpidump("v1=", v1);
+       log_mpidump("v2=", v2); */
+    mpi_set(x, u1);
+
+    mpi_free(u1);
+    mpi_free(u2);
+    mpi_free(u3);
+    mpi_free(v1);
+    mpi_free(v2);
+    mpi_free(v3);
+    mpi_free(q);
+    mpi_free(t1);
+    mpi_free(t2);
+    mpi_free(t3);
+    mpi_free(u);
+    mpi_free(v);
+#elif 0
+    /* Extended Euclid's algorithm (See TAOPC Vol II, 4.5.2, Alg X)
+     * modified according to Michael Penk's solution for Exercice 35 */
+
+    /* FIXME: we can simplify this in most cases (see Knuth) */
+    MPI u, v, u1, u2, u3, v1, v2, v3, t1, t2, t3;
+    unsigned k;
+    int sign;
+
+    u = mpi_copy(a);
+    v = mpi_copy(n);
+    for(k=0; !mpi_test_bit(u,0) && !mpi_test_bit(v,0); k++ ) {
+       mpi_rshift(u, u, 1);
+       mpi_rshift(v, v, 1);
+    }
+
+
+    u1 = mpi_alloc_set_ui(1);
+    u2 = mpi_alloc_set_ui(0);
+    u3 = mpi_copy(u);
+    v1 = mpi_copy(v);                             /* !-- used as const 1 */
+    v2 = mpi_alloc( mpi_get_nlimbs(u) ); mpi_sub( v2, u1, u );
+    v3 = mpi_copy(v);
+    if( mpi_test_bit(u, 0) ) { /* u is odd */
+       t1 = mpi_alloc_set_ui(0);
+       t2 = mpi_alloc_set_ui(1); t2->sign = 1;
+       t3 = mpi_copy(v); t3->sign = !t3->sign;
+       goto Y4;
+    }
+    else {
+       t1 = mpi_alloc_set_ui(1);
+       t2 = mpi_alloc_set_ui(0);
+       t3 = mpi_copy(u);
+    }
+    do {
+       do {
+           if( mpi_test_bit(t1, 0) || mpi_test_bit(t2, 0) ) { /* one is odd */
+               mpi_add(t1, t1, v);
+               mpi_sub(t2, t2, u);
+           }
+           mpi_rshift(t1, t1, 1);
+           mpi_rshift(t2, t2, 1);
+           mpi_rshift(t3, t3, 1);
+         Y4:
+           ;
+       } while( !mpi_test_bit( t3, 0 ) ); /* while t3 is even */
+
+       if( !t3->sign ) {
+           mpi_set(u1, t1);
+           mpi_set(u2, t2);
+           mpi_set(u3, t3);
+       }
+       else {
+           mpi_sub(v1, v, t1);
+           sign = u->sign; u->sign = !u->sign;
+           mpi_sub(v2, u, t2);
+           u->sign = sign;
+           sign = t3->sign; t3->sign = !t3->sign;
+           mpi_set(v3, t3);
+           t3->sign = sign;
+       }
+       mpi_sub(t1, u1, v1);
+       mpi_sub(t2, u2, v2);
+       mpi_sub(t3, u3, v3);
+       if( t1->sign ) {
+           mpi_add(t1, t1, v);
+           mpi_sub(t2, t2, u);
+       }
+    } while( mpi_cmp_ui( t3, 0 ) ); /* while t3 != 0 */
+    /* mpi_lshift( u3, k ); */
+    mpi_set(x, u1);
+
+    mpi_free(u1);
+    mpi_free(u2);
+    mpi_free(u3);
+    mpi_free(v1);
+    mpi_free(v2);
+    mpi_free(v3);
+    mpi_free(t1);
+    mpi_free(t2);
+    mpi_free(t3);
+#else
+    /* Extended Euclid's algorithm (See TAOPC Vol II, 4.5.2, Alg X)
+     * modified according to Michael Penk's solution for Exercice 35
+     * with further enhancement */
+    MPI u, v, u1, u2=NULL, u3, v1, v2=NULL, v3, t1, t2=NULL, t3;
+    unsigned k;
+    int sign;
+    int odd ;
+
+    u = mpi_copy(a);
+    v = mpi_copy(n);
+
+    for(k=0; !mpi_test_bit(u,0) && !mpi_test_bit(v,0); k++ ) {
+       mpi_rshift(u, u, 1);
+       mpi_rshift(v, v, 1);
+    }
+    odd = mpi_test_bit(v,0);
+
+    u1 = mpi_alloc_set_ui(1);
+    if( !odd )
+       u2 = mpi_alloc_set_ui(0);
+    u3 = mpi_copy(u);
+    v1 = mpi_copy(v);
+    if( !odd ) {
+       v2 = mpi_alloc( mpi_get_nlimbs(u) );
+       mpi_sub( v2, u1, u ); /* U is used as const 1 */
+    }
+    v3 = mpi_copy(v);
+    if( mpi_test_bit(u, 0) ) { /* u is odd */
+       t1 = mpi_alloc_set_ui(0);
+       if( !odd ) {
+           t2 = mpi_alloc_set_ui(1); t2->sign = 1;
+       }
+       t3 = mpi_copy(v); t3->sign = !t3->sign;
+       goto Y4;
+    }
+    else {
+       t1 = mpi_alloc_set_ui(1);
+       if( !odd )
+           t2 = mpi_alloc_set_ui(0);
+       t3 = mpi_copy(u);
+    }
+    do {
+       do {
+           if( !odd ) {
+               if( mpi_test_bit(t1, 0) || mpi_test_bit(t2, 0) ) { /* one is odd */
+                   mpi_add(t1, t1, v);
+                   mpi_sub(t2, t2, u);
+               }
+               mpi_rshift(t1, t1, 1);
+               mpi_rshift(t2, t2, 1);
+               mpi_rshift(t3, t3, 1);
+           }
+           else {
+               if( mpi_test_bit(t1, 0) )
+                   mpi_add(t1, t1, v);
+               mpi_rshift(t1, t1, 1);
+               mpi_rshift(t3, t3, 1);
+           }
+         Y4:
+           ;
+       } while( !mpi_test_bit( t3, 0 ) ); /* while t3 is even */
+
+       if( !t3->sign ) {
+           mpi_set(u1, t1);
+           if( !odd )
+               mpi_set(u2, t2);
+           mpi_set(u3, t3);
+       }
+       else {
+           mpi_sub(v1, v, t1);
+           sign = u->sign; u->sign = !u->sign;
+           if( !odd )
+               mpi_sub(v2, u, t2);
+           u->sign = sign;
+           sign = t3->sign; t3->sign = !t3->sign;
+           mpi_set(v3, t3);
+           t3->sign = sign;
+       }
+       mpi_sub(t1, u1, v1);
+       if( !odd )
+           mpi_sub(t2, u2, v2);
+       mpi_sub(t3, u3, v3);
+       if( t1->sign ) {
+           mpi_add(t1, t1, v);
+           if( !odd )
+               mpi_sub(t2, t2, u);
+       }
+    } while( mpi_cmp_ui( t3, 0 ) ); /* while t3 != 0 */
+    /* mpi_lshift( u3, k ); */
+    mpi_set(x, u1);
+
+    mpi_free(u1);
+    mpi_free(v1);
+    mpi_free(t1);
+    if( !odd ) {
+       mpi_free(u2);
+       mpi_free(v2);
+       mpi_free(t2);
+    }
+    mpi_free(u3);
+    mpi_free(v3);
+    mpi_free(t3);
+
+    mpi_free(u);
+    mpi_free(v);
+#endif
+}
diff --git a/mpi/mpi-mpow.c b/mpi/mpi-mpow.c
new file mode 100644 (file)
index 0000000..9a18610
--- /dev/null
@@ -0,0 +1,100 @@
+/* mpi-mpow.c  -  MPI functions
+ * Copyright (C) 1998, 1999, 2000 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+#include <assert.h>
+
+static int
+build_index( MPI *exparray, int k, int i, int t )
+{
+    int j, bitno;
+    int idx = 0;
+
+    bitno = t-i;
+    for(j=k-1; j >= 0; j-- ) {
+       idx <<= 1;
+       if( mpi_test_bit( exparray[j], bitno ) )
+           idx |= 1;
+    }
+    return idx;
+}
+
+/****************
+ * RES = (BASE[0] ^ EXP[0]) *  (BASE[1] ^ EXP[1]) * ... * mod M
+ */
+void
+mpi_mulpowm( MPI res, MPI *basearray, MPI *exparray, MPI m)
+{
+    int k;     /* number of elements */
+    int t;     /* bit size of largest exponent */
+    int i, j, idx;
+    MPI *G;    /* table with precomputed values of size 2^k */
+    MPI tmp;
+
+    for(k=0; basearray[k]; k++ )
+       ;
+    assert(k);
+    for(t=0, i=0; (tmp=exparray[i]); i++ ) {
+       j = mpi_get_nbits(tmp);
+       if( j > t )
+           t = j;
+    }
+    assert(i==k);
+    assert(t);
+    assert( k < 10 );
+
+    G = xmalloc_clear( (1<<k) * sizeof *G );
+    /* and calculate */
+    tmp =  mpi_alloc( mpi_get_nlimbs(m)+1 );
+    mpi_set_ui( res, 1 );
+    for(i = 1; i <= t; i++ ) {
+       mpi_mulm(tmp, res, res, m );
+       idx = build_index( exparray, k, i, t );
+       assert( idx >= 0 && idx < (1<<k) );
+       if( !G[idx] ) {
+           if( !idx )
+                G[0] = mpi_alloc_set_ui( 1 );
+           else {
+               for(j=0; j < k; j++ ) {
+                   if( (idx & (1<<j) ) ) {
+                       if( !G[idx] )
+                           G[idx] = mpi_copy( basearray[j] );
+                       else
+                           mpi_mulm( G[idx], G[idx], basearray[j], m );
+                   }
+               }
+               if( !G[idx] )
+                   G[idx] = mpi_alloc(0);
+           }
+       }
+       mpi_mulm(res, tmp, G[idx], m );
+    }
+
+    /* cleanup */
+    mpi_free(tmp);
+    for(i=0; i < (1<<k); i++ )
+       mpi_free(G[i]);
+    xfree(G);
+}
diff --git a/mpi/mpi-mul.c b/mpi/mpi-mul.c
new file mode 100644 (file)
index 0000000..97e08ec
--- /dev/null
@@ -0,0 +1,216 @@
+/* mpi-mul.c  -  MPI functions
+ *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+
+
+void
+mpi_mul_ui( MPI prod, MPI mult, unsigned long small_mult )
+{
+    mpi_size_t size, prod_size;
+    mpi_ptr_t  prod_ptr;
+    mpi_limb_t cy;
+    int sign;
+
+    size = mult->nlimbs;
+    sign = mult->sign;
+
+    if( !size || !small_mult ) {
+       prod->nlimbs = 0;
+       prod->sign = 0;
+       return;
+    }
+
+    prod_size = size + 1;
+    if( prod->alloced < prod_size )
+       mpi_resize( prod, prod_size );
+    prod_ptr = prod->d;
+
+    cy = mpihelp_mul_1( prod_ptr, mult->d, size, (mpi_limb_t)small_mult );
+    if( cy )
+       prod_ptr[size++] = cy;
+    prod->nlimbs = size;
+    prod->sign = sign;
+}
+
+
+void
+mpi_mul_2exp( MPI w, MPI u, unsigned long cnt)
+{
+    mpi_size_t usize, wsize, limb_cnt;
+    mpi_ptr_t wp;
+    mpi_limb_t wlimb;
+    int usign, wsign;
+
+    usize = u->nlimbs;
+    usign = u->sign;
+
+    if( !usize ) {
+       w->nlimbs = 0;
+       w->sign = 0;
+       return;
+    }
+
+    limb_cnt = cnt / BITS_PER_MPI_LIMB;
+    wsize = usize + limb_cnt + 1;
+    if( w->alloced < wsize )
+       mpi_resize(w, wsize );
+    wp = w->d;
+    wsize = usize + limb_cnt;
+    wsign = usign;
+
+    cnt %= BITS_PER_MPI_LIMB;
+    if( cnt ) {
+       wlimb = mpihelp_lshift( wp + limb_cnt, u->d, usize, cnt );
+       if( wlimb ) {
+           wp[wsize] = wlimb;
+           wsize++;
+       }
+    }
+    else {
+       MPN_COPY_DECR( wp + limb_cnt, u->d, usize );
+    }
+
+    /* Zero all whole limbs at low end.  Do it here and not before calling
+     * mpn_lshift, not to lose for U == W.  */
+    MPN_ZERO( wp, limb_cnt );
+
+    w->nlimbs = wsize;
+    w->sign = wsign;
+}
+
+
+
+void
+mpi_mul( MPI w, MPI u, MPI v)
+{
+    mpi_size_t usize, vsize, wsize;
+    mpi_ptr_t up, vp, wp;
+    mpi_limb_t cy;
+    int usign, vsign, usecure, vsecure, sign_product;
+    int assign_wp=0;
+    mpi_ptr_t tmp_limb=NULL;
+
+
+    if( u->nlimbs < v->nlimbs ) { /* Swap U and V. */
+       usize = v->nlimbs;
+       usign = v->sign;
+       usecure = mpi_is_secure(v);
+       up    = v->d;
+       vsize = u->nlimbs;
+       vsign = u->sign;
+       vsecure = mpi_is_secure(u);
+       vp    = u->d;
+    }
+    else {
+       usize = u->nlimbs;
+       usign = u->sign;
+       usecure = mpi_is_secure(u);
+       up    = u->d;
+       vsize = v->nlimbs;
+       vsign = v->sign;
+       vsecure = mpi_is_secure(v);
+       vp    = v->d;
+    }
+    sign_product = usign ^ vsign;
+    wp = w->d;
+
+    /* Ensure W has space enough to store the result.  */
+    wsize = usize + vsize;
+    if ( !mpi_is_secure (w) && (mpi_is_secure (u) || mpi_is_secure (v)) ) {
+        /* w is not allocated in secure space but u or v is.  To make sure
+         * that no temporray results are stored in w, we temporary use 
+         * a newly allocated limb space for w */
+        wp = mpi_alloc_limb_space( wsize, 1 );
+        assign_wp = 2; /* mark it as 2 so that we can later copy it back to
+                        * mormal memory */
+    }
+    else if( w->alloced < wsize ) {
+       if( wp == up || wp == vp ) {
+           wp = mpi_alloc_limb_space( wsize, mpi_is_secure(w) );
+           assign_wp = 1;
+       }
+       else {
+           mpi_resize(w, wsize );
+           wp = w->d;
+       }
+    }
+    else { /* Make U and V not overlap with W. */
+       if( wp == up ) {
+           /* W and U are identical.  Allocate temporary space for U.  */
+           up = tmp_limb = mpi_alloc_limb_space( usize, usecure  );
+           /* Is V identical too?  Keep it identical with U.  */
+           if( wp == vp )
+               vp = up;
+           /* Copy to the temporary space.  */
+           MPN_COPY( up, wp, usize );
+       }
+       else if( wp == vp ) {
+           /* W and V are identical.  Allocate temporary space for V.  */
+           vp = tmp_limb = mpi_alloc_limb_space( vsize, vsecure );
+           /* Copy to the temporary space.  */
+           MPN_COPY( vp, wp, vsize );
+       }
+    }
+
+    if( !vsize )
+       wsize = 0;
+    else {
+       cy = mpihelp_mul( wp, up, usize, vp, vsize );
+       wsize -= cy? 0:1;
+    }
+
+    if( assign_wp ) {
+        if (assign_wp == 2) {
+            /* copy the temp wp from secure memory back to normal memory */
+           mpi_ptr_t tmp_wp = mpi_alloc_limb_space (wsize, 0);
+           MPN_COPY (tmp_wp, wp, wsize);
+            mpi_free_limb_space (wp);
+            wp = tmp_wp;
+        }
+       mpi_assign_limb_space( w, wp, wsize );
+    }
+    w->nlimbs = wsize;
+    w->sign = sign_product;
+    if( tmp_limb )
+       mpi_free_limb_space( tmp_limb );
+}
+
+
+void
+mpi_mulm( MPI w, MPI u, MPI v, MPI m)
+{
+    mpi_mul(w, u, v);
+    mpi_fdiv_r( w, w, m );
+}
+
diff --git a/mpi/mpi-pow.c b/mpi/mpi-pow.c
new file mode 100644 (file)
index 0000000..8fcce5c
--- /dev/null
@@ -0,0 +1,296 @@
+/* mpi-pow.c  -  MPI functions
+ *     Copyright (C) 1994, 1996, 1998, 2000 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+#include <assert.h>
+
+
+/****************
+ * RES = BASE ^ EXP mod MOD
+ */
+void
+mpi_powm( MPI res, MPI base, MPI exponent, MPI mod)
+{
+    mpi_ptr_t  rp, ep, mp, bp;
+    mpi_size_t esize, msize, bsize, rsize;
+    int        esign, msign, bsign, rsign;
+    int        esec,  msec,  bsec,  rsec;
+    mpi_size_t size;
+    int mod_shift_cnt;
+    int negative_result;
+    mpi_ptr_t mp_marker=NULL, bp_marker=NULL, ep_marker=NULL;
+    mpi_ptr_t xp_marker=NULL;
+    int assign_rp=0;
+    mpi_ptr_t tspace = NULL;
+    mpi_size_t tsize=0;   /* to avoid compiler warning */
+                         /* fixme: we should check that the warning is void*/
+
+    esize = exponent->nlimbs;
+    msize = mod->nlimbs;
+    size = 2 * msize;
+    esign = exponent->sign;
+    msign = mod->sign;
+
+    esec = mpi_is_secure(exponent);
+    msec = mpi_is_secure(mod);
+    bsec = mpi_is_secure(base);
+    rsec = mpi_is_secure(res);
+
+    rp = res->d;
+    ep = exponent->d;
+
+    if( !msize )
+       msize = 1 / msize;          /* provoke a signal */
+
+    if( !esize ) {
+       /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0
+        * depending on if MOD equals 1.  */
+       rp[0] = 1;
+       res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1;
+       res->sign = 0;
+       goto leave;
+    }
+
+    /* Normalize MOD (i.e. make its most significant bit set) as required by
+     * mpn_divrem.  This will make the intermediate values in the calculation
+     * slightly larger, but the correct result is obtained after a final
+     * reduction using the original MOD value. */
+    mp = mp_marker = mpi_alloc_limb_space(msize, msec);
+    count_leading_zeros( mod_shift_cnt, mod->d[msize-1] );
+    if( mod_shift_cnt )
+       mpihelp_lshift( mp, mod->d, msize, mod_shift_cnt );
+    else
+       MPN_COPY( mp, mod->d, msize );
+
+    bsize = base->nlimbs;
+    bsign = base->sign;
+    if( bsize > msize ) { /* The base is larger than the module. Reduce it. */
+       /* Allocate (BSIZE + 1) with space for remainder and quotient.
+        * (The quotient is (bsize - msize + 1) limbs.)  */
+       bp = bp_marker = mpi_alloc_limb_space( bsize + 1, bsec );
+       MPN_COPY( bp, base->d, bsize );
+       /* We don't care about the quotient, store it above the remainder,
+        * at BP + MSIZE.  */
+       mpihelp_divrem( bp + msize, 0, bp, bsize, mp, msize );
+       bsize = msize;
+       /* Canonicalize the base, since we are going to multiply with it
+        * quite a few times.  */
+       MPN_NORMALIZE( bp, bsize );
+    }
+    else
+       bp = base->d;
+
+    if( !bsize ) {
+       res->nlimbs = 0;
+       res->sign = 0;
+       goto leave;
+    }
+
+    if( res->alloced < size ) {
+       /* We have to allocate more space for RES.  If any of the input
+        * parameters are identical to RES, defer deallocation of the old
+        * space.  */
+       if( rp == ep || rp == mp || rp == bp ) {
+           rp = mpi_alloc_limb_space( size, rsec );
+           assign_rp = 1;
+       }
+       else {
+           mpi_resize( res, size );
+           rp = res->d;
+       }
+    }
+    else { /* Make BASE, EXPONENT and MOD not overlap with RES.  */
+       if( rp == bp ) {
+           /* RES and BASE are identical.  Allocate temp. space for BASE.  */
+           assert( !bp_marker );
+           bp = bp_marker = mpi_alloc_limb_space( bsize, bsec );
+           MPN_COPY(bp, rp, bsize);
+       }
+       if( rp == ep ) {
+           /* RES and EXPONENT are identical.  
+               Allocate temp. space for EXPONENT.  */
+           ep = ep_marker = mpi_alloc_limb_space( esize, esec );
+           MPN_COPY(ep, rp, esize);
+       }
+       if( rp == mp ) {
+           /* RES and MOD are identical.  Allocate temporary space for MOD.*/
+           assert( !mp_marker );
+           mp = mp_marker = mpi_alloc_limb_space( msize, msec );
+           MPN_COPY(mp, rp, msize);
+       }
+    }
+
+    MPN_COPY( rp, bp, bsize );
+    rsize = bsize;
+    rsign = bsign;
+
+    {
+       mpi_size_t i;
+       mpi_ptr_t xp = xp_marker = mpi_alloc_limb_space( 2 * (msize + 1), msec );
+       int c;
+       mpi_limb_t e;
+       mpi_limb_t carry_limb;
+       struct karatsuba_ctx karactx;
+
+       memset( &karactx, 0, sizeof karactx );
+       negative_result = (ep[0] & 1) && base->sign;
+
+       i = esize - 1;
+       e = ep[i];
+       count_leading_zeros (c, e);
+       e = (e << c) << 1;     /* shift the exp bits to the left, lose msb */
+       c = BITS_PER_MPI_LIMB - 1 - c;
+
+       /* Main loop.
+        *
+        * Make the result be pointed to alternately by XP and RP.  This
+        * helps us avoid block copying, which would otherwise be necessary
+        * with the overlap restrictions of mpihelp_divmod. With 50% probability
+        * the result after this loop will be in the area originally pointed
+        * by RP (==RES->d), and with 50% probability in the area originally
+        * pointed to by XP.
+        */
+
+       for(;;) {
+           while( c ) {
+               mpi_ptr_t tp;
+               mpi_size_t xsize;
+
+               /*mpihelp_mul_n(xp, rp, rp, rsize);*/
+               if( rsize < KARATSUBA_THRESHOLD )
+                   mpih_sqr_n_basecase( xp, rp, rsize );
+               else {
+                   if( !tspace ) {
+                       tsize = 2 * rsize;
+                       tspace = mpi_alloc_limb_space( tsize, 0 );
+                   }
+                   else if( tsize < (2*rsize) ) {
+                       mpi_free_limb_space( tspace );
+                       tsize = 2 * rsize;
+                       tspace = mpi_alloc_limb_space( tsize, 0 );
+                   }
+                   mpih_sqr_n( xp, rp, rsize, tspace );
+               }
+
+               xsize = 2 * rsize;
+               if( xsize > msize ) {
+                   mpihelp_divrem(xp + msize, 0, xp, xsize, mp, msize);
+                   xsize = msize;
+               }
+
+               tp = rp; rp = xp; xp = tp;
+               rsize = xsize;
+
+               if( (mpi_limb_signed_t)e < 0 ) {
+                   /*mpihelp_mul( xp, rp, rsize, bp, bsize );*/
+                   if( bsize < KARATSUBA_THRESHOLD ) {
+                       mpihelp_mul( xp, rp, rsize, bp, bsize );
+                   }
+                   else {
+                       mpihelp_mul_karatsuba_case(
+                                    xp, rp, rsize, bp, bsize, &karactx );
+                   }
+
+                   xsize = rsize + bsize;
+                   if( xsize > msize ) {
+                       mpihelp_divrem(xp + msize, 0, xp, xsize, mp, msize);
+                       xsize = msize;
+                   }
+
+                   tp = rp; rp = xp; xp = tp;
+                   rsize = xsize;
+               }
+               e <<= 1;
+               c--;
+           }
+
+           i--;
+           if( i < 0 )
+               break;
+           e = ep[i];
+           c = BITS_PER_MPI_LIMB;
+       }
+
+       /* We shifted MOD, the modulo reduction argument, left MOD_SHIFT_CNT
+        * steps.  Adjust the result by reducing it with the original MOD.
+        *
+        * Also make sure the result is put in RES->d (where it already
+        * might be, see above).
+        */
+       if( mod_shift_cnt ) {
+           carry_limb = mpihelp_lshift( res->d, rp, rsize, mod_shift_cnt);
+           rp = res->d;
+           if( carry_limb ) {
+               rp[rsize] = carry_limb;
+               rsize++;
+           }
+       }
+       else {
+           MPN_COPY( res->d, rp, rsize);
+           rp = res->d;
+       }
+
+       if( rsize >= msize ) {
+           mpihelp_divrem(rp + msize, 0, rp, rsize, mp, msize);
+           rsize = msize;
+       }
+
+       /* Remove any leading zero words from the result.  */
+       if( mod_shift_cnt )
+           mpihelp_rshift( rp, rp, rsize, mod_shift_cnt);
+       MPN_NORMALIZE (rp, rsize);
+
+       mpihelp_release_karatsuba_ctx( &karactx );
+    }
+
+    if( negative_result && rsize ) {
+       if( mod_shift_cnt )
+           mpihelp_rshift( mp, mp, msize, mod_shift_cnt);
+       mpihelp_sub( rp, mp, msize, rp, rsize);
+       rsize = msize;
+       rsign = msign;
+       MPN_NORMALIZE(rp, rsize);
+    }
+    res->nlimbs = rsize;
+    res->sign = rsign;
+
+  leave:
+    if( assign_rp ) mpi_assign_limb_space( res, rp, size );
+    if( mp_marker ) mpi_free_limb_space( mp_marker );
+    if( bp_marker ) mpi_free_limb_space( bp_marker );
+    if( ep_marker ) mpi_free_limb_space( ep_marker );
+    if( xp_marker ) mpi_free_limb_space( xp_marker );
+    if( tspace )    mpi_free_limb_space( tspace );
+}
+
diff --git a/mpi/mpi-scan.c b/mpi/mpi-scan.c
new file mode 100644 (file)
index 0000000..c76f4bb
--- /dev/null
@@ -0,0 +1,140 @@
+/* mpi-scan.c  -  MPI functions
+ * Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h> 
+#include <stdio.h> 
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+/****************
+ * Scan through an mpi and return byte for byte. a -1 is returned to indicate
+ * the end of the mpi. Scanning is done from the lsb to the msb, returned
+ * values are in the range of 0 .. 255.
+ *
+ * FIXME: This code is VERY ugly!
+ */
+#if 0 /* Code is not used */
+int
+mpi_getbyte( MPI a, unsigned idx )
+{
+    int i, j;
+    unsigned n;
+    mpi_ptr_t ap;
+    mpi_limb_t limb;
+
+    ap = a->d;
+    for(n=0,i=0; i < a->nlimbs; i++ ) {
+       limb = ap[i];
+       for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ )
+           if( n == idx )
+               return (limb >> j*8) & 0xff;
+    }
+    return -1;
+}
+#endif /* Code is not used */
+
+
+/****************
+ * Put a value at position IDX into A. idx counts from lsb to msb
+ */
+/* FIXME: There is a problem with the long constants which should have
+a LL prefix or better the macros we use at other places. */
+#if 0 /* Code is not used */
+void
+mpi_putbyte( MPI a, unsigned idx, int xc )
+{
+
+    int i, j;
+    unsigned n;
+    mpi_ptr_t ap;
+    mpi_limb_t limb, c;
+
+    c = xc & 0xff;
+    ap = a->d;
+    for(n=0,i=0; i < a->alloced; i++ ) {
+       limb = ap[i];
+       for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ )
+           if( n == idx ) {
+#if BYTES_PER_MPI_LIMB == 4
+               if( j == 0 )
+                   limb = (limb & 0xffffff00) | c;
+               else if( j == 1 )
+                   limb = (limb & 0xffff00ff) | (c<<8);
+               else if( j == 2 )
+                   limb = (limb & 0xff00ffff) | (c<<16);
+               else
+                   limb = (limb & 0x00ffffff) | (c<<24);
+#elif BYTES_PER_MPI_LIMB == 8
+               if( j == 0 )
+                   limb = (limb & 0xffffffffffffff00) | c;
+               else if( j == 1 )
+                   limb = (limb & 0xffffffffffff00ff) | (c<<8);
+               else if( j == 2 )
+                   limb = (limb & 0xffffffffff00ffff) | (c<<16);
+               else if( j == 3 )
+                   limb = (limb & 0xffffffff00ffffff) | (c<<24);
+               else if( j == 4 )
+                   limb = (limb & 0xffffff00ffffffff) | (c<<32);
+               else if( j == 5 )
+                   limb = (limb & 0xffff00ffffffffff) | (c<<40);
+               else if( j == 6 )
+                   limb = (limb & 0xff00ffffffffffff) | (c<<48);
+               else
+                   limb = (limb & 0x00ffffffffffffff) | (c<<56);
+#else
+#error please enhance this function, its ugly - i know.
+#endif
+               if( a->nlimbs <= i )
+                   a->nlimbs = i+1;
+               ap[i] = limb;
+               return;
+           }
+    }
+    abort(); /* index out of range */
+}
+#endif /* Code is not used */
+
+
+/****************
+ * Count the number of zerobits at the low end of A
+ */
+unsigned int
+mpi_trailing_zeros( MPI a )
+{
+    unsigned n, count = 0;
+
+    for(n=0; n < a->nlimbs; n++ ) {
+       if( a->d[n] ) {
+           unsigned nn;
+           mpi_limb_t alimb = a->d[n];
+
+           count_trailing_zeros( nn, alimb );
+           count += nn;
+           break;
+       }
+       count += BITS_PER_MPI_LIMB;
+    }
+    return count;
+
+}
+
+
diff --git a/mpi/mpicoder.c b/mpi/mpicoder.c
new file mode 100644 (file)
index 0000000..d5ce999
--- /dev/null
@@ -0,0 +1,474 @@
+/* mpicoder.c  -  Coder for the external representation of MPIs
+ * Copyright (C) 1998, 1999, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#include "mpi.h"
+#include "mpi-internal.h"
+#include "iobuf.h"
+#include "memory.h"
+#include "util.h"
+
+#ifdef M_DEBUG
+#undef mpi_read
+#endif
+
+#define MAX_EXTERN_MPI_BITS 16384
+
+/****************
+ * write an mpi to out.
+ */
+int
+mpi_write( IOBUF out, MPI a )
+{
+    int rc;
+    unsigned nbits = mpi_get_nbits(a);
+    byte *p, *buf;
+    unsigned n;
+
+    if( nbits > MAX_EXTERN_MPI_BITS )
+       log_bug("mpi_encode: mpi too large (%u bits)\n", nbits);
+
+    iobuf_put(out, (nbits >>8) );
+    iobuf_put(out, (nbits) );
+
+    p = buf = mpi_get_buffer( a, &n, NULL );
+    rc = iobuf_write( out, p, n );
+    xfree(buf);
+    return rc;
+}
+
+
+/****************
+ * Read an external representation of an mpi and return the MPI
+ * The external format is a 16 bit unsigned value stored in network byte order,
+ * giving the number of bits for the following integer. The integer is stored
+ * with MSB first (left padded with zeroes to align on a byte boundary).
+ */
+MPI
+#ifdef M_DEBUG
+mpi_debug_read(IOBUF inp, unsigned *ret_nread, int secure, const char *info)
+#else
+mpi_read(IOBUF inp, unsigned *ret_nread, int secure)
+#endif
+{
+    int c, i, j;
+    unsigned int nmax = *ret_nread;
+    unsigned nbits, nbytes, nlimbs, nread=0;
+    mpi_limb_t a;
+    MPI val = MPI_NULL;
+
+    if (nread == nmax)
+        goto overflow;
+    if( (c = iobuf_get(inp)) == -1 )
+       goto leave;
+    nread++;
+    nbits = c << 8;
+
+    if (nread == nmax)
+        goto overflow;
+    if( (c = iobuf_get(inp)) == -1 )
+       goto leave;
+    nread++;
+    nbits |= c;
+
+    if( nbits > MAX_EXTERN_MPI_BITS ) {
+       log_error("mpi too large for this implementation (%u bits)\n", nbits);
+       goto leave;
+    }
+
+    nbytes = (nbits+7) / 8;
+    nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB;
+#ifdef M_DEBUG
+    val = secure? mpi_debug_alloc_secure( nlimbs, info )
+               : mpi_debug_alloc( nlimbs, info );
+#else
+    val = secure? mpi_alloc_secure( nlimbs )
+               : mpi_alloc( nlimbs );
+#endif
+    i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
+    i %= BYTES_PER_MPI_LIMB;
+    val->nbits = nbits;
+    j= val->nlimbs = nlimbs;
+    val->sign = 0;
+    for( ; j > 0; j-- ) {
+       a = 0;
+       for(; i < BYTES_PER_MPI_LIMB; i++ ) {
+            if (nread == nmax) {
+#ifdef M_DEBUG
+                mpi_debug_free (val);
+#else
+                mpi_free (val);
+#endif
+                val = NULL;
+                goto overflow;
+            }
+           a <<= 8;
+           a |= iobuf_get(inp) & 0xff; nread++;
+       }
+       i = 0;
+       val->d[j-1] = a;
+    }
+
+  leave:
+    *ret_nread = nread;
+    return val;
+  overflow:
+    log_error ("mpi larger than indicated length (%u bytes)\n", nmax);
+    *ret_nread = nread;
+    return val;
+}
+
+
+MPI
+mpi_read_from_buffer(byte *buffer, unsigned int *ret_nread, int secure)
+{
+    int i, j;
+    unsigned nbits, nbytes, nlimbs, nread=0;
+    mpi_limb_t a;
+    MPI val = MPI_NULL;
+
+    if( *ret_nread < 2 )
+       goto leave;
+    nbits = buffer[0] << 8 | buffer[1];
+    if( nbits > MAX_EXTERN_MPI_BITS ) {
+       log_info ("mpi too large (%u bits)\n", nbits);
+       goto leave;
+    }
+    buffer += 2;
+    nread = 2;
+
+    nbytes = (nbits+7) / 8;
+    nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB;
+    val = secure? mpi_alloc_secure( nlimbs )
+               : mpi_alloc( nlimbs );
+    i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
+    i %= BYTES_PER_MPI_LIMB;
+    val->nbits = nbits;
+    j= val->nlimbs = nlimbs;
+    val->sign = 0;
+    for( ; j > 0; j-- ) {
+       a = 0;
+       for(; i < BYTES_PER_MPI_LIMB; i++ ) {
+          if( ++nread > *ret_nread ) {
+              /* This (as well as the above error condition) may
+                 happen if we use this function to parse a decrypted
+                 MPI which didn't turn out to be a real MPI - possible
+                 because the supplied key was wrong but the OpenPGP
+                 checksum didn't caught it. */
+               log_info ("mpi larger than buffer\n");
+                mpi_free (val);
+                val = MPI_NULL;
+                goto leave;
+          }
+          a <<= 8;
+          a |= *buffer++;
+       }
+       i = 0;
+       val->d[j-1] = a;
+    }
+
+  leave:
+    *ret_nread = nread;
+    return val;
+}
+
+
+/****************
+ * Make an mpi from a character string.
+ */
+int
+mpi_fromstr(MPI val, const char *str)
+{
+    int hexmode=0, sign=0, prepend_zero=0, i, j, c, c1, c2;
+    unsigned nbits, nbytes, nlimbs;
+    mpi_limb_t a;
+
+    if( *str == '-' ) {
+       sign = 1;
+       str++;
+    }
+    if( *str == '0' && str[1] == 'x' )
+       hexmode = 1;
+    else
+       return 1; /* other bases are not yet supported */
+    str += 2;
+
+    nbits = strlen(str)*4;
+    if( nbits % 8 )
+       prepend_zero = 1;
+    nbytes = (nbits+7) / 8;
+    nlimbs = (nbytes+BYTES_PER_MPI_LIMB-1) / BYTES_PER_MPI_LIMB;
+    if( val->alloced < nlimbs )
+       mpi_resize(val, nlimbs );
+    i = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
+    i %= BYTES_PER_MPI_LIMB;
+    j= val->nlimbs = nlimbs;
+    val->sign = sign;
+    for( ; j > 0; j-- ) {
+       a = 0;
+       for(; i < BYTES_PER_MPI_LIMB; i++ ) {
+           if( prepend_zero ) {
+               c1 = '0';
+               prepend_zero = 0;
+           }
+           else
+               c1 = *str++;
+           assert(c1);
+           c2 = *str++;
+           assert(c2);
+           if( c1 >= '0' && c1 <= '9' )
+               c = c1 - '0';
+           else if( c1 >= 'a' && c1 <= 'f' )
+               c = c1 - 'a' + 10;
+           else if( c1 >= 'A' && c1 <= 'F' )
+               c = c1 - 'A' + 10;
+           else {
+               mpi_clear(val);
+               return 1;
+           }
+           c <<= 4;
+           if( c2 >= '0' && c2 <= '9' )
+               c |= c2 - '0';
+           else if( c2 >= 'a' && c2 <= 'f' )
+               c |= c2 - 'a' + 10;
+           else if( c2 >= 'A' && c2 <= 'F' )
+               c |= c2 - 'A' + 10;
+           else {
+               mpi_clear(val);
+               return 1;
+           }
+           a <<= 8;
+           a |= c;
+       }
+       i = 0;
+       val->d[j-1] = a;
+    }
+
+    return 0;
+}
+
+
+/****************
+ * print an MPI to the given stream and return the number of characters
+ * printed.
+ */
+int
+mpi_print( FILE *fp, MPI a, int mode )
+{
+    int i, n=0;
+
+    if( a == MPI_NULL )
+       return fprintf(fp, "[MPI_NULL]");
+    if( !mode ) {
+       unsigned int n1;
+
+       n1 = mpi_get_nbits(a);
+        n += fprintf(fp, "[%u bits]", n1);
+    }
+    else {
+       if( a->sign )
+           putc('-', fp);
+#if BYTES_PER_MPI_LIMB == 2
+#define X "4"
+#elif BYTES_PER_MPI_LIMB == 4
+#define X "8"
+#elif BYTES_PER_MPI_LIMB == 8
+#define X "16"
+#else
+#error please define the format here
+#endif
+       for(i=a->nlimbs; i > 0 ; i-- ) {
+           n += fprintf(fp, i!=a->nlimbs? "%0" X "lX":"%lX", (ulong)a->d[i-1]);
+#undef X
+       }
+       if( !a->nlimbs )
+           putc('0', fp );
+    }
+    return n;
+}
+
+
+void
+g10_log_mpidump( const char *text, MPI a )
+{
+    FILE *fp = log_stream();
+
+    g10_log_print_prefix(text);
+    mpi_print(fp, a, 1 );
+    fputc('\n', fp);
+}
+
+/****************
+ * Special function to get the low 8 bytes from an mpi.
+ * This can be used as a keyid; KEYID is an 2 element array.
+ * Return the low 4 bytes.
+ */
+u32
+mpi_get_keyid( MPI a, u32 *keyid )
+{
+#if BYTES_PER_MPI_LIMB == 4
+    if( keyid ) {
+       keyid[0] = a->nlimbs >= 2? a->d[1] : 0;
+       keyid[1] = a->nlimbs >= 1? a->d[0] : 0;
+    }
+    return a->nlimbs >= 1? a->d[0] : 0;
+#elif BYTES_PER_MPI_LIMB == 8
+    if( keyid ) {
+       keyid[0] = a->nlimbs? (u32)(a->d[0] >> 32) : 0;
+       keyid[1] = a->nlimbs? (u32)(a->d[0] & 0xffffffff) : 0;
+    }
+    return a->nlimbs? (u32)(a->d[0] & 0xffffffff) : 0;
+#else
+#error Make this function work with other LIMB sizes
+#endif
+}
+
+
+/****************
+ * Return an xmalloced buffer with the MPI (msb first).
+ * NBYTES receives the length of this buffer. Caller must free the
+ * return string (This function does return a 0 byte buffer with NBYTES
+ * set to zero if the value of A is zero. If sign is not NULL, it will
+ * be set to the sign of the A.
+ */
+static byte *
+do_get_buffer( MPI a, unsigned *nbytes, int *sign, int force_secure )
+{
+    byte *p, *buffer;
+    mpi_limb_t alimb;
+    int i;
+    unsigned int n;
+
+    if( sign )
+       *sign = a->sign;
+    *nbytes = n = a->nlimbs * BYTES_PER_MPI_LIMB;
+    if (!n)
+      n++; /* avoid zero length allocation */
+    p = buffer = force_secure || mpi_is_secure(a) ? xmalloc_secure(n)
+                                                 : xmalloc(n);
+
+    for(i=a->nlimbs-1; i >= 0; i-- ) {
+       alimb = a->d[i];
+#if BYTES_PER_MPI_LIMB == 4
+       *p++ = alimb >> 24;
+       *p++ = alimb >> 16;
+       *p++ = alimb >>  8;
+       *p++ = alimb      ;
+#elif BYTES_PER_MPI_LIMB == 8
+       *p++ = alimb >> 56;
+       *p++ = alimb >> 48;
+       *p++ = alimb >> 40;
+       *p++ = alimb >> 32;
+       *p++ = alimb >> 24;
+       *p++ = alimb >> 16;
+       *p++ = alimb >>  8;
+       *p++ = alimb      ;
+#else
+#error please implement for this limb size.
+#endif
+    }
+
+    /* this is sub-optimal but we need to do the shift operation
+     * because the caller has to free the returned buffer */
+    for(p=buffer; !*p && *nbytes; p++, --*nbytes )
+      ;
+    if( p != buffer )
+      memmove(buffer,p, *nbytes);
+
+    return buffer;
+}
+
+
+byte *
+mpi_get_buffer( MPI a, unsigned *nbytes, int *sign )
+{
+    return do_get_buffer( a, nbytes, sign, 0 );
+}
+
+byte *
+mpi_get_secure_buffer( MPI a, unsigned *nbytes, int *sign )
+{
+    return do_get_buffer( a, nbytes, sign, 1 );
+}
+
+/****************
+ * Use BUFFER to update MPI.
+ */
+void
+mpi_set_buffer( MPI a, const byte *buffer, unsigned nbytes, int sign )
+{
+    const byte *p;
+    mpi_limb_t alimb;
+    int nlimbs;
+    int i;
+
+    nlimbs = (nbytes + BYTES_PER_MPI_LIMB - 1) / BYTES_PER_MPI_LIMB;
+    RESIZE_IF_NEEDED(a, nlimbs);
+    a->sign = sign;
+
+    for(i=0, p = buffer+nbytes-1; p >= buffer+BYTES_PER_MPI_LIMB; ) {
+#if BYTES_PER_MPI_LIMB == 4
+       alimb  = (mpi_limb_t)*p-- ;
+       alimb |= (mpi_limb_t)*p-- <<  8 ;
+       alimb |= (mpi_limb_t)*p-- << 16 ;
+       alimb |= (mpi_limb_t)*p-- << 24 ;
+#elif BYTES_PER_MPI_LIMB == 8
+       alimb  = (mpi_limb_t)*p--       ;
+       alimb |= (mpi_limb_t)*p-- <<  8 ;
+       alimb |= (mpi_limb_t)*p-- << 16 ;
+       alimb |= (mpi_limb_t)*p-- << 24 ;
+       alimb |= (mpi_limb_t)*p-- << 32 ;
+       alimb |= (mpi_limb_t)*p-- << 40 ;
+       alimb |= (mpi_limb_t)*p-- << 48 ;
+       alimb |= (mpi_limb_t)*p-- << 56 ;
+#else
+#error please implement for this limb size.
+#endif
+       a->d[i++] = alimb;
+    }
+    if( p >= buffer ) {
+#if BYTES_PER_MPI_LIMB == 4
+       alimb  = *p--       ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- <<  8 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 16 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 24 ;
+#elif BYTES_PER_MPI_LIMB == 8
+       alimb  = (mpi_limb_t)*p-- ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- <<  8 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 16 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 24 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 32 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 40 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 48 ;
+       if( p >= buffer ) alimb |= (mpi_limb_t)*p-- << 56 ;
+#else
+#error please implement for this limb size.
+#endif
+       a->d[i++] = alimb;
+    }
+    a->nlimbs = i;
+    assert( i == nlimbs );
+}
diff --git a/mpi/mpih-cmp.c b/mpi/mpih-cmp.c
new file mode 100644 (file)
index 0000000..4c12c71
--- /dev/null
@@ -0,0 +1,63 @@
+/* mpihelp-sub.c  -  MPI helper functions
+ *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mpi-internal.h"
+
+/****************
+ * Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE.
+ * There are no restrictions on the relative sizes of
+ * the two arguments.
+ * Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2.
+ */
+int
+mpihelp_cmp( mpi_ptr_t op1_ptr, mpi_ptr_t op2_ptr, mpi_size_t size )
+{
+    mpi_size_t i;
+    mpi_limb_t op1_word, op2_word;
+
+    for( i = size - 1; i >= 0 ; i--) {
+       op1_word = op1_ptr[i];
+       op2_word = op2_ptr[i];
+       if( op1_word != op2_word )
+           goto diff;
+    }
+    return 0;
+
+  diff:
+    /* This can *not* be simplified to
+     *  op2_word - op2_word
+     * since that expression might give signed overflow.  */
+    return (op1_word > op2_word) ? 1 : -1;
+}
+
diff --git a/mpi/mpih-div.c b/mpi/mpih-div.c
new file mode 100644 (file)
index 0000000..1e962a1
--- /dev/null
@@ -0,0 +1,536 @@
+/* mpihelp-div.c  -  MPI helper functions
+ *     Copyright (C) 1994, 1996 Free Software Foundation, Inc.
+ *     Copyright (C) 1998, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+#ifndef UMUL_TIME
+#define UMUL_TIME 1
+#endif
+#ifndef UDIV_TIME
+#define UDIV_TIME UMUL_TIME
+#endif
+
+/* FIXME: We should be using invert_limb (or invert_normalized_limb)
+ * here (not udiv_qrnnd).
+ */
+
+mpi_limb_t
+mpihelp_mod_1(mpi_ptr_t dividend_ptr, mpi_size_t dividend_size,
+                                     mpi_limb_t divisor_limb)
+{
+    mpi_size_t i;
+    mpi_limb_t n1, n0, r;
+    int dummy;
+
+    /* Botch: Should this be handled at all?  Rely on callers? */
+    if( !dividend_size )
+       return 0;
+
+    /* If multiplication is much faster than division, and the
+     * dividend is large, pre-invert the divisor, and use
+     * only multiplications in the inner loop.
+     *
+     * This test should be read:
+     *  Does it ever help to use udiv_qrnnd_preinv?
+     *    && Does what we save compensate for the inversion overhead?
+     */
+    if( UDIV_TIME > (2 * UMUL_TIME + 6)
+       && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME ) {
+       int normalization_steps;
+
+       count_leading_zeros( normalization_steps, divisor_limb );
+       if( normalization_steps ) {
+           mpi_limb_t divisor_limb_inverted;
+
+           divisor_limb <<= normalization_steps;
+
+           /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB.  The
+            * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the
+            * most significant bit (with weight 2**N) implicit.
+            *
+            * Special case for DIVISOR_LIMB == 100...000.
+            */
+           if( !(divisor_limb << 1) )
+               divisor_limb_inverted = ~(mpi_limb_t)0;
+           else
+               udiv_qrnnd(divisor_limb_inverted, dummy,
+                          -divisor_limb, 0, divisor_limb);
+
+           n1 = dividend_ptr[dividend_size - 1];
+           r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps);
+
+           /* Possible optimization:
+            * if (r == 0
+            * && divisor_limb > ((n1 << normalization_steps)
+            *                 | (dividend_ptr[dividend_size - 2] >> ...)))
+            * ...one division less...
+            */
+           for( i = dividend_size - 2; i >= 0; i--) {
+               n0 = dividend_ptr[i];
+               UDIV_QRNND_PREINV(dummy, r, r,
+                                  ((n1 << normalization_steps)
+                         | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))),
+                         divisor_limb, divisor_limb_inverted);
+               n1 = n0;
+           }
+           UDIV_QRNND_PREINV(dummy, r, r,
+                             n1 << normalization_steps,
+                             divisor_limb, divisor_limb_inverted);
+           return r >> normalization_steps;
+       }
+       else {
+           mpi_limb_t divisor_limb_inverted;
+
+           /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB.  The
+            * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the
+            * most significant bit (with weight 2**N) implicit.
+            *
+            * Special case for DIVISOR_LIMB == 100...000.
+            */
+           if( !(divisor_limb << 1) )
+               divisor_limb_inverted = ~(mpi_limb_t)0;
+           else
+               udiv_qrnnd(divisor_limb_inverted, dummy,
+                           -divisor_limb, 0, divisor_limb);
+
+           i = dividend_size - 1;
+           r = dividend_ptr[i];
+
+           if( r >= divisor_limb )
+               r = 0;
+           else
+               i--;
+
+           for( ; i >= 0; i--) {
+               n0 = dividend_ptr[i];
+               UDIV_QRNND_PREINV(dummy, r, r,
+                                 n0, divisor_limb, divisor_limb_inverted);
+           }
+           return r;
+       }
+    }
+    else {
+       if( UDIV_NEEDS_NORMALIZATION ) {
+           int normalization_steps;
+
+           count_leading_zeros(normalization_steps, divisor_limb);
+           if( normalization_steps ) {
+               divisor_limb <<= normalization_steps;
+
+               n1 = dividend_ptr[dividend_size - 1];
+               r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps);
+
+               /* Possible optimization:
+                * if (r == 0
+                * && divisor_limb > ((n1 << normalization_steps)
+                *                 | (dividend_ptr[dividend_size - 2] >> ...)))
+                * ...one division less...
+                */
+               for(i = dividend_size - 2; i >= 0; i--) {
+                   n0 = dividend_ptr[i];
+                   udiv_qrnnd (dummy, r, r,
+                               ((n1 << normalization_steps)
+                        | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))),
+                        divisor_limb);
+                   n1 = n0;
+               }
+               udiv_qrnnd (dummy, r, r,
+                           n1 << normalization_steps,
+                           divisor_limb);
+               return r >> normalization_steps;
+           }
+       }
+       /* No normalization needed, either because udiv_qrnnd doesn't require
+        * it, or because DIVISOR_LIMB is already normalized.  */
+       i = dividend_size - 1;
+       r = dividend_ptr[i];
+
+       if(r >= divisor_limb)
+           r = 0;
+       else
+           i--;
+
+       for(; i >= 0; i--) {
+           n0 = dividend_ptr[i];
+           udiv_qrnnd (dummy, r, r, n0, divisor_limb);
+       }
+       return r;
+    }
+}
+
+/* Divide num (NP/NSIZE) by den (DP/DSIZE) and write
+ * the NSIZE-DSIZE least significant quotient limbs at QP
+ * and the DSIZE long remainder at NP. If QEXTRA_LIMBS is
+ * non-zero, generate that many fraction bits and append them after the
+ * other quotient limbs.
+ * Return the most significant limb of the quotient, this is always 0 or 1.
+ *
+ * Preconditions:
+ * 0. NSIZE >= DSIZE.
+ * 1. The most significant bit of the divisor must be set.
+ * 2. QP must either not overlap with the input operands at all, or
+ *    QP + DSIZE >= NP must hold true. (This means that it's
+ *    possible to put the quotient in the high part of NUM, right after the
+ *    remainder in NUM.
+ * 3. NSIZE >= DSIZE, even if QEXTRA_LIMBS is non-zero.
+ */
+
+mpi_limb_t
+mpihelp_divrem( mpi_ptr_t qp, mpi_size_t qextra_limbs,
+               mpi_ptr_t np, mpi_size_t nsize,
+               mpi_ptr_t dp, mpi_size_t dsize)
+{
+    mpi_limb_t most_significant_q_limb = 0;
+
+    switch(dsize) {
+      case 0:
+       /* We are asked to divide by zero, so go ahead and do it!  (To make
+          the compiler not remove this statement, return the value.)  */
+       return 1 / dsize;
+
+      case 1:
+       {
+           mpi_size_t i;
+           mpi_limb_t n1;
+           mpi_limb_t d;
+
+           d = dp[0];
+           n1 = np[nsize - 1];
+
+           if( n1 >= d ) {
+               n1 -= d;
+               most_significant_q_limb = 1;
+           }
+
+           qp += qextra_limbs;
+           for( i = nsize - 2; i >= 0; i--)
+               udiv_qrnnd( qp[i], n1, n1, np[i], d );
+           qp -= qextra_limbs;
+
+           for( i = qextra_limbs - 1; i >= 0; i-- )
+               udiv_qrnnd (qp[i], n1, n1, 0, d);
+
+           np[0] = n1;
+       }
+       break;
+
+      case 2:
+       {
+           mpi_size_t i;
+           mpi_limb_t n1, n0, n2;
+           mpi_limb_t d1, d0;
+
+           np += nsize - 2;
+           d1 = dp[1];
+           d0 = dp[0];
+           n1 = np[1];
+           n0 = np[0];
+
+           if( n1 >= d1 && (n1 > d1 || n0 >= d0) ) {
+               sub_ddmmss (n1, n0, n1, n0, d1, d0);
+               most_significant_q_limb = 1;
+           }
+
+           for( i = qextra_limbs + nsize - 2 - 1; i >= 0; i-- ) {
+               mpi_limb_t q;
+               mpi_limb_t r;
+
+               if( i >= qextra_limbs )
+                   np--;
+               else
+                   np[0] = 0;
+
+               if( n1 == d1 ) {
+                   /* Q should be either 111..111 or 111..110.  Need special
+                    * treatment of this rare case as normal division would
+                    * give overflow.  */
+                   q = ~(mpi_limb_t)0;
+
+                   r = n0 + d1;
+                   if( r < d1 ) {   /* Carry in the addition? */
+                       add_ssaaaa( n1, n0, r - d0, np[0], 0, d0 );
+                       qp[i] = q;
+                       continue;
+                   }
+                   n1 = d0 - (d0 != 0?1:0);
+                   n0 = -d0;
+               }
+               else {
+                   udiv_qrnnd (q, r, n1, n0, d1);
+                   umul_ppmm (n1, n0, d0, q);
+               }
+
+               n2 = np[0];
+             q_test:
+               if( n1 > r || (n1 == r && n0 > n2) ) {
+                   /* The estimated Q was too large.  */
+                   q--;
+                   sub_ddmmss (n1, n0, n1, n0, 0, d0);
+                   r += d1;
+                   if( r >= d1 )    /* If not carry, test Q again.  */
+                       goto q_test;
+               }
+
+               qp[i] = q;
+               sub_ddmmss (n1, n0, r, n2, n1, n0);
+           }
+           np[1] = n1;
+           np[0] = n0;
+       }
+       break;
+
+      default:
+       {
+           mpi_size_t i;
+           mpi_limb_t dX, d1, n0;
+
+           np += nsize - dsize;
+           dX = dp[dsize - 1];
+           d1 = dp[dsize - 2];
+           n0 = np[dsize - 1];
+
+           if( n0 >= dX ) {
+               if(n0 > dX || mpihelp_cmp(np, dp, dsize - 1) >= 0 ) {
+                   mpihelp_sub_n(np, np, dp, dsize);
+                   n0 = np[dsize - 1];
+                   most_significant_q_limb = 1;
+               }
+           }
+
+           for( i = qextra_limbs + nsize - dsize - 1; i >= 0; i--) {
+               mpi_limb_t q;
+               mpi_limb_t n1, n2;
+               mpi_limb_t cy_limb;
+
+               if( i >= qextra_limbs ) {
+                   np--;
+                   n2 = np[dsize];
+               }
+               else {
+                   n2 = np[dsize - 1];
+                   MPN_COPY_DECR (np + 1, np, dsize - 1);
+                   np[0] = 0;
+               }
+
+               if( n0 == dX ) {
+                   /* This might over-estimate q, but it's probably not worth
+                    * the extra code here to find out.  */
+                   q = ~(mpi_limb_t)0;
+               }
+               else {
+                   mpi_limb_t r;
+
+                   udiv_qrnnd(q, r, n0, np[dsize - 1], dX);
+                   umul_ppmm(n1, n0, d1, q);
+
+                   while( n1 > r || (n1 == r && n0 > np[dsize - 2])) {
+                       q--;
+                       r += dX;
+                       if( r < dX ) /* I.e. "carry in previous addition?" */
+                           break;
+                       n1 -= n0 < d1;
+                       n0 -= d1;
+                   }
+               }
+
+               /* Possible optimization: We already have (q * n0) and (1 * n1)
+                * after the calculation of q.  Taking advantage of that, we
+                * could make this loop make two iterations less.  */
+               cy_limb = mpihelp_submul_1(np, dp, dsize, q);
+
+               if( n2 != cy_limb ) {
+                   mpihelp_add_n(np, np, dp, dsize);
+                   q--;
+               }
+
+               qp[i] = q;
+               n0 = np[dsize - 1];
+           }
+       }
+    }
+
+    return most_significant_q_limb;
+}
+
+
+/****************
+ * Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB.
+ * Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR.
+ * Return the single-limb remainder.
+ * There are no constraints on the value of the divisor.
+ *
+ * QUOT_PTR and DIVIDEND_PTR might point to the same limb.
+ */
+
+mpi_limb_t
+mpihelp_divmod_1( mpi_ptr_t quot_ptr,
+                 mpi_ptr_t dividend_ptr, mpi_size_t dividend_size,
+                 mpi_limb_t divisor_limb)
+{
+    mpi_size_t i;
+    mpi_limb_t n1, n0, r;
+    int dummy;
+
+    if( !dividend_size )
+       return 0;
+
+    /* If multiplication is much faster than division, and the
+     * dividend is large, pre-invert the divisor, and use
+     * only multiplications in the inner loop.
+     *
+     * This test should be read:
+     * Does it ever help to use udiv_qrnnd_preinv?
+     * && Does what we save compensate for the inversion overhead?
+     */
+    if( UDIV_TIME > (2 * UMUL_TIME + 6)
+       && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME ) {
+       int normalization_steps;
+
+       count_leading_zeros( normalization_steps, divisor_limb );
+       if( normalization_steps ) {
+           mpi_limb_t divisor_limb_inverted;
+
+           divisor_limb <<= normalization_steps;
+
+           /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB.  The
+            * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the
+            * most significant bit (with weight 2**N) implicit.
+            */
+           /* Special case for DIVISOR_LIMB == 100...000.  */
+           if( !(divisor_limb << 1) )
+               divisor_limb_inverted = ~(mpi_limb_t)0;
+           else
+               udiv_qrnnd(divisor_limb_inverted, dummy,
+                          -divisor_limb, 0, divisor_limb);
+
+           n1 = dividend_ptr[dividend_size - 1];
+           r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps);
+
+           /* Possible optimization:
+            * if (r == 0
+            * && divisor_limb > ((n1 << normalization_steps)
+            *                 | (dividend_ptr[dividend_size - 2] >> ...)))
+            * ...one division less...
+            */
+           for( i = dividend_size - 2; i >= 0; i--) {
+               n0 = dividend_ptr[i];
+               UDIV_QRNND_PREINV( quot_ptr[i + 1], r, r,
+                                  ((n1 << normalization_steps)
+                        | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))),
+                             divisor_limb, divisor_limb_inverted);
+               n1 = n0;
+           }
+           UDIV_QRNND_PREINV( quot_ptr[0], r, r,
+                              n1 << normalization_steps,
+                              divisor_limb, divisor_limb_inverted);
+           return r >> normalization_steps;
+       }
+       else {
+           mpi_limb_t divisor_limb_inverted;
+
+           /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB.  The
+            * result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the
+            * most significant bit (with weight 2**N) implicit.
+            */
+           /* Special case for DIVISOR_LIMB == 100...000.  */
+           if( !(divisor_limb << 1) )
+               divisor_limb_inverted = ~(mpi_limb_t) 0;
+           else
+               udiv_qrnnd(divisor_limb_inverted, dummy,
+                          -divisor_limb, 0, divisor_limb);
+
+           i = dividend_size - 1;
+           r = dividend_ptr[i];
+
+           if( r >= divisor_limb )
+               r = 0;
+           else
+               quot_ptr[i--] = 0;
+
+           for( ; i >= 0; i-- ) {
+               n0 = dividend_ptr[i];
+               UDIV_QRNND_PREINV( quot_ptr[i], r, r,
+                                  n0, divisor_limb, divisor_limb_inverted);
+           }
+           return r;
+       }
+    }
+    else {
+       if(UDIV_NEEDS_NORMALIZATION) {
+           int normalization_steps;
+
+           count_leading_zeros (normalization_steps, divisor_limb);
+           if( normalization_steps ) {
+               divisor_limb <<= normalization_steps;
+
+               n1 = dividend_ptr[dividend_size - 1];
+               r = n1 >> (BITS_PER_MPI_LIMB - normalization_steps);
+
+               /* Possible optimization:
+                * if (r == 0
+                * && divisor_limb > ((n1 << normalization_steps)
+                *                 | (dividend_ptr[dividend_size - 2] >> ...)))
+                * ...one division less...
+                */
+               for( i = dividend_size - 2; i >= 0; i--) {
+                   n0 = dividend_ptr[i];
+                   udiv_qrnnd (quot_ptr[i + 1], r, r,
+                            ((n1 << normalization_steps)
+                        | (n0 >> (BITS_PER_MPI_LIMB - normalization_steps))),
+                               divisor_limb);
+                   n1 = n0;
+               }
+               udiv_qrnnd (quot_ptr[0], r, r,
+                           n1 << normalization_steps,
+                           divisor_limb);
+               return r >> normalization_steps;
+           }
+       }
+       /* No normalization needed, either because udiv_qrnnd doesn't require
+        * it, or because DIVISOR_LIMB is already normalized.  */
+       i = dividend_size - 1;
+       r = dividend_ptr[i];
+
+       if(r >= divisor_limb)
+           r = 0;
+       else
+           quot_ptr[i--] = 0;
+
+       for(; i >= 0; i--) {
+           n0 = dividend_ptr[i];
+           udiv_qrnnd( quot_ptr[i], r, r, n0, divisor_limb );
+       }
+       return r;
+    }
+}
diff --git a/mpi/mpih-mul.c b/mpi/mpih-mul.c
new file mode 100644 (file)
index 0000000..397ec60
--- /dev/null
@@ -0,0 +1,529 @@
+/* mpihelp-mul.c  -  MPI helper functions
+ * Copyright (C) 1994, 1996, 1998, 1999,
+ *               2000 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpi-internal.h"
+#include "longlong.h"
+
+
+
+#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \
+    do {                                               \
+       if( (size) < KARATSUBA_THRESHOLD )              \
+           mul_n_basecase (prodp, up, vp, size);       \
+       else                                            \
+           mul_n (prodp, up, vp, size, tspace);        \
+    } while (0);
+
+#define MPN_SQR_N_RECURSE(prodp, up, size, tspace) \
+    do {                                           \
+       if ((size) < KARATSUBA_THRESHOLD)           \
+           mpih_sqr_n_basecase (prodp, up, size);       \
+       else                                        \
+           mpih_sqr_n (prodp, up, size, tspace);        \
+    } while (0);
+
+
+
+
+/* Multiply the natural numbers u (pointed to by UP) and v (pointed to by VP),
+ * both with SIZE limbs, and store the result at PRODP.  2 * SIZE limbs are
+ * always stored.  Return the most significant limb.
+ *
+ * Argument constraints:
+ * 1. PRODP != UP and PRODP != VP, i.e. the destination
+ *    must be distinct from the multiplier and the multiplicand.
+ *
+ *
+ * Handle simple cases with traditional multiplication.
+ *
+ * This is the most critical code of multiplication.  All multiplies rely
+ * on this, both small and huge.  Small ones arrive here immediately.  Huge
+ * ones arrive here as this is the base case for Karatsuba's recursive
+ * algorithm below.
+ */
+
+static mpi_limb_t
+mul_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up,
+                                mpi_ptr_t vp, mpi_size_t size)
+{
+    mpi_size_t i;
+    mpi_limb_t cy;
+    mpi_limb_t v_limb;
+
+    /* Multiply by the first limb in V separately, as the result can be
+     * stored (not added) to PROD.  We also avoid a loop for zeroing.  */
+    v_limb = vp[0];
+    if( v_limb <= 1 ) {
+       if( v_limb == 1 )
+           MPN_COPY( prodp, up, size );
+       else
+           MPN_ZERO( prodp, size );
+       cy = 0;
+    }
+    else
+       cy = mpihelp_mul_1( prodp, up, size, v_limb );
+
+    prodp[size] = cy;
+    prodp++;
+
+    /* For each iteration in the outer loop, multiply one limb from
+     * U with one limb from V, and add it to PROD.  */
+    for( i = 1; i < size; i++ ) {
+       v_limb = vp[i];
+       if( v_limb <= 1 ) {
+           cy = 0;
+           if( v_limb == 1 )
+              cy = mpihelp_add_n(prodp, prodp, up, size);
+       }
+       else
+           cy = mpihelp_addmul_1(prodp, up, size, v_limb);
+
+       prodp[size] = cy;
+       prodp++;
+    }
+
+    return cy;
+}
+
+
+static void
+mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp,
+                       mpi_size_t size, mpi_ptr_t tspace )
+{
+    if( size & 1 ) {
+      /* The size is odd, and the code below doesn't handle that.
+       * Multiply the least significant (size - 1) limbs with a recursive
+       * call, and handle the most significant limb of S1 and S2
+       * separately.
+       * A slightly faster way to do this would be to make the Karatsuba
+       * code below behave as if the size were even, and let it check for
+       * odd size in the end.  I.e., in essence move this code to the end.
+       * Doing so would save us a recursive call, and potentially make the
+       * stack grow a lot less.
+       */
+      mpi_size_t esize = size - 1;      /* even size */
+      mpi_limb_t cy_limb;
+
+      MPN_MUL_N_RECURSE( prodp, up, vp, esize, tspace );
+      cy_limb = mpihelp_addmul_1( prodp + esize, up, esize, vp[esize] );
+      prodp[esize + esize] = cy_limb;
+      cy_limb = mpihelp_addmul_1( prodp + esize, vp, size, up[esize] );
+      prodp[esize + size] = cy_limb;
+    }
+    else {
+       /* Anatolij Alekseevich Karatsuba's divide-and-conquer algorithm.
+        *
+        * Split U in two pieces, U1 and U0, such that
+        * U = U0 + U1*(B**n),
+        * and V in V1 and V0, such that
+        * V = V0 + V1*(B**n).
+        *
+        * UV is then computed recursively using the identity
+        *
+        *        2n   n          n                     n
+        * UV = (B  + B )U V  +  B (U -U )(V -V )  +  (B + 1)U V
+        *                1 1        1  0   0  1              0 0
+        *
+        * Where B = 2**BITS_PER_MP_LIMB.
+        */
+       mpi_size_t hsize = size >> 1;
+       mpi_limb_t cy;
+       int negflg;
+
+       /* Product H.      ________________  ________________
+        *                |_____U1 x V1____||____U0 x V0_____|
+        * Put result in upper part of PROD and pass low part of TSPACE
+        * as new TSPACE.
+        */
+       MPN_MUL_N_RECURSE(prodp + size, up + hsize, vp + hsize, hsize, tspace);
+
+       /* Product M.      ________________
+        *                |_(U1-U0)(V0-V1)_|
+        */
+       if( mpihelp_cmp(up + hsize, up, hsize) >= 0 ) {
+           mpihelp_sub_n(prodp, up + hsize, up, hsize);
+           negflg = 0;
+       }
+       else {
+           mpihelp_sub_n(prodp, up, up + hsize, hsize);
+           negflg = 1;
+       }
+       if( mpihelp_cmp(vp + hsize, vp, hsize) >= 0 ) {
+           mpihelp_sub_n(prodp + hsize, vp + hsize, vp, hsize);
+           negflg ^= 1;
+       }
+       else {
+           mpihelp_sub_n(prodp + hsize, vp, vp + hsize, hsize);
+           /* No change of NEGFLG.  */
+       }
+       /* Read temporary operands from low part of PROD.
+        * Put result in low part of TSPACE using upper part of TSPACE
+        * as new TSPACE.
+        */
+       MPN_MUL_N_RECURSE(tspace, prodp, prodp + hsize, hsize, tspace + size);
+
+       /* Add/copy product H. */
+       MPN_COPY (prodp + hsize, prodp + size, hsize);
+       cy = mpihelp_add_n( prodp + size, prodp + size,
+                           prodp + size + hsize, hsize);
+
+       /* Add product M (if NEGFLG M is a negative number) */
+       if(negflg)
+           cy -= mpihelp_sub_n(prodp + hsize, prodp + hsize, tspace, size);
+       else
+           cy += mpihelp_add_n(prodp + hsize, prodp + hsize, tspace, size);
+
+       /* Product L.      ________________  ________________
+        *                |________________||____U0 x V0_____|
+        * Read temporary operands from low part of PROD.
+        * Put result in low part of TSPACE using upper part of TSPACE
+        * as new TSPACE.
+        */
+       MPN_MUL_N_RECURSE(tspace, up, vp, hsize, tspace + size);
+
+       /* Add/copy Product L (twice) */
+
+       cy += mpihelp_add_n(prodp + hsize, prodp + hsize, tspace, size);
+       if( cy )
+         mpihelp_add_1(prodp + hsize + size, prodp + hsize + size, hsize, cy);
+
+       MPN_COPY(prodp, tspace, hsize);
+       cy = mpihelp_add_n(prodp + hsize, prodp + hsize, tspace + hsize, hsize);
+       if( cy )
+           mpihelp_add_1(prodp + size, prodp + size, size, 1);
+    }
+}
+
+
+void
+mpih_sqr_n_basecase( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size )
+{
+    mpi_size_t i;
+    mpi_limb_t cy_limb;
+    mpi_limb_t v_limb;
+
+    /* Multiply by the first limb in V separately, as the result can be
+     * stored (not added) to PROD.  We also avoid a loop for zeroing.  */
+    v_limb = up[0];
+    if( v_limb <= 1 ) {
+       if( v_limb == 1 )
+           MPN_COPY( prodp, up, size );
+       else
+           MPN_ZERO(prodp, size);
+       cy_limb = 0;
+    }
+    else
+       cy_limb = mpihelp_mul_1( prodp, up, size, v_limb );
+
+    prodp[size] = cy_limb;
+    prodp++;
+
+    /* For each iteration in the outer loop, multiply one limb from
+     * U with one limb from V, and add it to PROD.  */
+    for( i=1; i < size; i++) {
+       v_limb = up[i];
+       if( v_limb <= 1 ) {
+           cy_limb = 0;
+           if( v_limb == 1 )
+               cy_limb = mpihelp_add_n(prodp, prodp, up, size);
+       }
+       else
+           cy_limb = mpihelp_addmul_1(prodp, up, size, v_limb);
+
+       prodp[size] = cy_limb;
+       prodp++;
+    }
+}
+
+
+void
+mpih_sqr_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t size, mpi_ptr_t tspace)
+{
+    if( size & 1 ) {
+       /* The size is odd, and the code below doesn't handle that.
+        * Multiply the least significant (size - 1) limbs with a recursive
+        * call, and handle the most significant limb of S1 and S2
+        * separately.
+        * A slightly faster way to do this would be to make the Karatsuba
+        * code below behave as if the size were even, and let it check for
+        * odd size in the end.  I.e., in essence move this code to the end.
+        * Doing so would save us a recursive call, and potentially make the
+        * stack grow a lot less.
+        */
+       mpi_size_t esize = size - 1;       /* even size */
+       mpi_limb_t cy_limb;
+
+       MPN_SQR_N_RECURSE( prodp, up, esize, tspace );
+       cy_limb = mpihelp_addmul_1( prodp + esize, up, esize, up[esize] );
+       prodp[esize + esize] = cy_limb;
+       cy_limb = mpihelp_addmul_1( prodp + esize, up, size, up[esize] );
+
+       prodp[esize + size] = cy_limb;
+    }
+    else {
+       mpi_size_t hsize = size >> 1;
+       mpi_limb_t cy;
+
+       /* Product H.      ________________  ________________
+        *                |_____U1 x U1____||____U0 x U0_____|
+        * Put result in upper part of PROD and pass low part of TSPACE
+        * as new TSPACE.
+        */
+       MPN_SQR_N_RECURSE(prodp + size, up + hsize, hsize, tspace);
+
+       /* Product M.      ________________
+        *                |_(U1-U0)(U0-U1)_|
+        */
+       if( mpihelp_cmp( up + hsize, up, hsize) >= 0 )
+           mpihelp_sub_n( prodp, up + hsize, up, hsize);
+       else
+           mpihelp_sub_n (prodp, up, up + hsize, hsize);
+
+       /* Read temporary operands from low part of PROD.
+        * Put result in low part of TSPACE using upper part of TSPACE
+        * as new TSPACE.  */
+       MPN_SQR_N_RECURSE(tspace, prodp, hsize, tspace + size);
+
+       /* Add/copy product H  */
+       MPN_COPY(prodp + hsize, prodp + size, hsize);
+       cy = mpihelp_add_n(prodp + size, prodp + size,
+                          prodp + size + hsize, hsize);
+
+       /* Add product M (if NEGFLG M is a negative number).  */
+       cy -= mpihelp_sub_n (prodp + hsize, prodp + hsize, tspace, size);
+
+       /* Product L.      ________________  ________________
+        *                |________________||____U0 x U0_____|
+        * Read temporary operands from low part of PROD.
+        * Put result in low part of TSPACE using upper part of TSPACE
+        * as new TSPACE.  */
+       MPN_SQR_N_RECURSE (tspace, up, hsize, tspace + size);
+
+       /* Add/copy Product L (twice).  */
+       cy += mpihelp_add_n (prodp + hsize, prodp + hsize, tspace, size);
+       if( cy )
+           mpihelp_add_1(prodp + hsize + size, prodp + hsize + size,
+                                                           hsize, cy);
+
+       MPN_COPY(prodp, tspace, hsize);
+       cy = mpihelp_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize);
+       if( cy )
+           mpihelp_add_1 (prodp + size, prodp + size, size, 1);
+    }
+}
+
+
+/* This should be made into an inline function in gmp.h.  */
+void
+mpihelp_mul_n( mpi_ptr_t prodp, mpi_ptr_t up, mpi_ptr_t vp, mpi_size_t size)
+{
+    int secure;
+
+    if( up == vp ) {
+       if( size < KARATSUBA_THRESHOLD )
+           mpih_sqr_n_basecase( prodp, up, size );
+       else {
+           mpi_ptr_t tspace;
+           secure = m_is_secure( up );
+           tspace = mpi_alloc_limb_space( 2 * size, secure );
+           mpih_sqr_n( prodp, up, size, tspace );
+           mpi_free_limb_space( tspace );
+       }
+    }
+    else {
+       if( size < KARATSUBA_THRESHOLD )
+           mul_n_basecase( prodp, up, vp, size );
+       else {
+           mpi_ptr_t tspace;
+           secure = m_is_secure( up ) || m_is_secure( vp );
+           tspace = mpi_alloc_limb_space( 2 * size, secure );
+           mul_n (prodp, up, vp, size, tspace);
+           mpi_free_limb_space( tspace );
+       }
+    }
+}
+
+
+
+void
+mpihelp_mul_karatsuba_case( mpi_ptr_t prodp,
+                           mpi_ptr_t up, mpi_size_t usize,
+                           mpi_ptr_t vp, mpi_size_t vsize,
+                           struct karatsuba_ctx *ctx )
+{
+    mpi_limb_t cy;
+
+    if( !ctx->tspace || ctx->tspace_size < vsize ) {
+       if( ctx->tspace )
+           mpi_free_limb_space( ctx->tspace );
+       ctx->tspace = mpi_alloc_limb_space( 2 * vsize,
+                                      m_is_secure( up ) || m_is_secure( vp ) );
+       ctx->tspace_size = vsize;
+    }
+
+    MPN_MUL_N_RECURSE( prodp, up, vp, vsize, ctx->tspace );
+
+    prodp += vsize;
+    up += vsize;
+    usize -= vsize;
+    if( usize >= vsize ) {
+       if( !ctx->tp || ctx->tp_size < vsize ) {
+           if( ctx->tp )
+               mpi_free_limb_space( ctx->tp );
+           ctx->tp = mpi_alloc_limb_space( 2 * vsize, m_is_secure( up )
+                                                     || m_is_secure( vp ) );
+           ctx->tp_size = vsize;
+       }
+
+       do {
+           MPN_MUL_N_RECURSE( ctx->tp, up, vp, vsize, ctx->tspace );
+           cy = mpihelp_add_n( prodp, prodp, ctx->tp, vsize );
+           mpihelp_add_1( prodp + vsize, ctx->tp + vsize, vsize, cy );
+           prodp += vsize;
+           up += vsize;
+           usize -= vsize;
+       } while( usize >= vsize );
+    }
+
+    if( usize ) {
+       if( usize < KARATSUBA_THRESHOLD ) {
+           mpihelp_mul( ctx->tspace, vp, vsize, up, usize );
+       }
+       else {
+           if( !ctx->next ) {
+               ctx->next = xmalloc_clear( sizeof *ctx );
+           }
+           mpihelp_mul_karatsuba_case( ctx->tspace,
+                                       vp, vsize,
+                                       up, usize,
+                                       ctx->next );
+       }
+
+       cy = mpihelp_add_n( prodp, prodp, ctx->tspace, vsize);
+       mpihelp_add_1( prodp + vsize, ctx->tspace + vsize, usize, cy );
+    }
+}
+
+
+void
+mpihelp_release_karatsuba_ctx( struct karatsuba_ctx *ctx )
+{
+    struct karatsuba_ctx *ctx2;
+
+    if( ctx->tp )
+       mpi_free_limb_space( ctx->tp );
+    if( ctx->tspace )
+       mpi_free_limb_space( ctx->tspace );
+    for( ctx=ctx->next; ctx; ctx = ctx2 ) {
+       ctx2 = ctx->next;
+       if( ctx->tp )
+           mpi_free_limb_space( ctx->tp );
+       if( ctx->tspace )
+           mpi_free_limb_space( ctx->tspace );
+       xfree( ctx );
+    }
+}
+
+/* Multiply the natural numbers u (pointed to by UP, with USIZE limbs)
+ * and v (pointed to by VP, with VSIZE limbs), and store the result at
+ * PRODP.  USIZE + VSIZE limbs are always stored, but if the input
+ * operands are normalized.  Return the most significant limb of the
+ * result.
+ *
+ * NOTE: The space pointed to by PRODP is overwritten before finished
+ * with U and V, so overlap is an error.
+ *
+ * Argument constraints:
+ * 1. USIZE >= VSIZE.
+ * 2. PRODP != UP and PRODP != VP, i.e. the destination
+ *    must be distinct from the multiplier and the multiplicand.
+ */
+
+mpi_limb_t
+mpihelp_mul( mpi_ptr_t prodp, mpi_ptr_t up, mpi_size_t usize,
+                             mpi_ptr_t vp, mpi_size_t vsize)
+{
+    mpi_ptr_t prod_endp = prodp + usize + vsize - 1;
+    mpi_limb_t cy;
+    struct karatsuba_ctx ctx;
+
+    if( vsize < KARATSUBA_THRESHOLD ) {
+       mpi_size_t i;
+       mpi_limb_t v_limb;
+
+       if( !vsize )
+           return 0;
+
+       /* Multiply by the first limb in V separately, as the result can be
+        * stored (not added) to PROD.  We also avoid a loop for zeroing.  */
+       v_limb = vp[0];
+       if( v_limb <= 1 ) {
+           if( v_limb == 1 )
+               MPN_COPY( prodp, up, usize );
+           else
+               MPN_ZERO( prodp, usize );
+           cy = 0;
+       }
+       else
+           cy = mpihelp_mul_1( prodp, up, usize, v_limb );
+
+       prodp[usize] = cy;
+       prodp++;
+
+       /* For each iteration in the outer loop, multiply one limb from
+        * U with one limb from V, and add it to PROD.  */
+       for( i = 1; i < vsize; i++ ) {
+           v_limb = vp[i];
+           if( v_limb <= 1 ) {
+               cy = 0;
+               if( v_limb == 1 )
+                  cy = mpihelp_add_n(prodp, prodp, up, usize);
+           }
+           else
+               cy = mpihelp_addmul_1(prodp, up, usize, v_limb);
+
+           prodp[usize] = cy;
+           prodp++;
+       }
+
+       return cy;
+    }
+
+    memset( &ctx, 0, sizeof ctx );
+    mpihelp_mul_karatsuba_case( prodp, up, usize, vp, vsize, &ctx );
+    mpihelp_release_karatsuba_ctx( &ctx );
+    return *prod_endp;
+}
+
+
diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c
new file mode 100644 (file)
index 0000000..fdbd354
--- /dev/null
@@ -0,0 +1,470 @@
+/* mpiutil.ac  -  Utility functions for MPI
+ * Copyright (C) 1998, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "mpi.h"
+#include "mpi-internal.h"
+#include "memory.h"
+#include "util.h"
+
+
+#ifdef M_DEBUG
+#undef mpi_alloc
+#undef mpi_alloc_secure
+#undef mpi_free
+#endif
+
+/****************
+ * Note:  It was a bad idea to use the number of limbs to allocate
+ *       because on a alpha the limbs are large but we normally need
+ *       integers of n bits - So we should chnage this to bits (or bytes).
+ *
+ *       But mpi_alloc is used in a lot of places :-)
+ */
+MPI
+#ifdef M_DEBUG
+mpi_debug_alloc( unsigned nlimbs, const char *info )
+#else
+mpi_alloc( unsigned nlimbs )
+#endif
+{
+    MPI a;
+
+    if( DBG_MEMORY )
+       log_debug("mpi_alloc(%u)\n", nlimbs*BITS_PER_MPI_LIMB );
+#ifdef M_DEBUG
+    a = m_debug_alloc( sizeof *a, info );
+    a->d = nlimbs? mpi_debug_alloc_limb_space( nlimbs, 0, info ) : NULL;
+#else
+    a = xmalloc( sizeof *a );
+    a->d = nlimbs? mpi_alloc_limb_space( nlimbs, 0 ) : NULL;
+#endif
+    a->alloced = nlimbs;
+    a->nlimbs = 0;
+    a->sign = 0;
+    a->flags = 0;
+    a->nbits = 0;
+    return a;
+}
+
+void
+mpi_m_check( MPI a )
+{
+    m_check(a);
+    m_check(a->d);
+}
+
+MPI
+#ifdef M_DEBUG
+mpi_debug_alloc_secure( unsigned nlimbs, const char *info )
+#else
+mpi_alloc_secure( unsigned nlimbs )
+#endif
+{
+    MPI a;
+
+    if( DBG_MEMORY )
+       log_debug("mpi_alloc_secure(%u)\n", nlimbs*BITS_PER_MPI_LIMB );
+#ifdef M_DEBUG
+    a = m_debug_alloc( sizeof *a, info );
+    a->d = nlimbs? mpi_debug_alloc_limb_space( nlimbs, 1, info ) : NULL;
+#else
+    a = xmalloc( sizeof *a );
+    a->d = nlimbs? mpi_alloc_limb_space( nlimbs, 1 ) : NULL;
+#endif
+    a->alloced = nlimbs;
+    a->flags = 1;
+    a->nlimbs = 0;
+    a->sign = 0;
+    a->nbits = 0;
+    return a;
+}
+
+
+#if 0
+static void *unused_limbs_5;
+static void *unused_limbs_32;
+static void *unused_limbs_64;
+#endif
+
+mpi_ptr_t
+#ifdef M_DEBUG
+mpi_debug_alloc_limb_space( unsigned nlimbs, int secure, const char *info )
+#else
+mpi_alloc_limb_space( unsigned nlimbs, int secure )
+#endif
+{
+    size_t len = nlimbs * sizeof(mpi_limb_t);
+    mpi_ptr_t p;
+
+    if( DBG_MEMORY )
+       log_debug("mpi_alloc_limb_space(%u)\n", (unsigned)len*8 );
+#if 0
+    if( !secure ) {
+       if( nlimbs == 5 && unused_limbs_5 ) {  /* DSA 160 bits */
+           p = unused_limbs_5;
+           unused_limbs_5 = *p;
+           return p;
+       }
+       else if( nlimbs == 32 && unused_limbs_32 ) {  /* DSA 1024 bits */
+           p = unused_limbs_32;
+           unused_limbs_32 = *p;
+           return p;
+       }
+       else if( nlimbs == 64 && unused_limbs_64 ) {  /* DSA 2*1024 bits */
+           p = unused_limbs_64;
+           unused_limbs_64 = *p;
+           return p;
+       }
+    }
+#endif
+
+#ifdef M_DEBUG
+    p = secure? m_debug_alloc_secure(len, info):m_debug_alloc( len, info );
+#else
+    p = secure? xmalloc_secure( len ):xmalloc( len );
+#endif
+
+    return p;
+}
+
+void
+#ifdef M_DEBUG
+mpi_debug_free_limb_space( mpi_ptr_t a, const char *info )
+#else
+mpi_free_limb_space( mpi_ptr_t a )
+#endif
+{
+    if( !a )
+       return;
+    if( DBG_MEMORY )
+       log_debug("mpi_free_limb_space of size %lu\n", (ulong)m_size(a)*8 );
+
+#if 0
+    if( !m_is_secure(a) ) {
+       size_t nlimbs = m_size(a) / 4 ;
+       void *p = a;
+
+       if( nlimbs == 5 ) {  /* DSA 160 bits */
+           *a = unused_limbs_5;
+           unused_limbs_5 = a;
+           return;
+       }
+       else if( nlimbs == 32 ) {  /* DSA 1024 bits */
+           *a = unused_limbs_32;
+           unused_limbs_32 = a;
+           return;
+       }
+       else if( nlimbs == 64 ) {  /* DSA 2*1024 bits */
+           *a = unused_limbs_64;
+           unused_limbs_64 = a;
+           return;
+       }
+    }
+#endif
+
+    xfree(a);
+}
+
+
+void
+mpi_assign_limb_space( MPI a, mpi_ptr_t ap, unsigned nlimbs )
+{
+    mpi_free_limb_space(a->d);
+    a->d = ap;
+    a->alloced = nlimbs;
+}
+
+
+
+/****************
+ * Resize the array of A to NLIMBS. the additional space is cleared
+ * (set to 0) [done by xrealloc()]
+ */
+void
+#ifdef M_DEBUG
+mpi_debug_resize( MPI a, unsigned nlimbs, const char *info )
+#else
+mpi_resize( MPI a, unsigned nlimbs )
+#endif
+{
+    if( nlimbs <= a->alloced )
+       return; /* no need to do it */
+    /* Note: a->secure is not used - instead the realloc functions
+     * take care of it. Maybe we should drop a->secure completely
+     * and rely on a mpi_is_secure function, which would be
+     * a wrapper around m_is_secure
+     */
+#ifdef M_DEBUG
+    if( a->d )
+       a->d = m_debug_realloc(a->d, nlimbs * sizeof(mpi_limb_t), info );
+    else
+       a->d = m_debug_alloc_clear( nlimbs * sizeof(mpi_limb_t), info );
+#else
+    if( a->d )
+       a->d = xrealloc(a->d, nlimbs * sizeof(mpi_limb_t) );
+    else
+       a->d = xmalloc_clear( nlimbs * sizeof(mpi_limb_t) );
+#endif
+    a->alloced = nlimbs;
+}
+
+void
+mpi_clear( MPI a )
+{
+    a->nlimbs = 0;
+    a->nbits = 0;
+    a->flags = 0;
+}
+
+
+void
+#ifdef M_DEBUG
+mpi_debug_free( MPI a, const char *info )
+#else
+mpi_free( MPI a )
+#endif
+{
+    if( !a )
+       return;
+    if( DBG_MEMORY )
+       log_debug("mpi_free\n" );
+    if( a->flags & 4 )
+       xfree( a->d );
+    else {
+#ifdef M_DEBUG
+       mpi_debug_free_limb_space(a->d, info);
+#else
+       mpi_free_limb_space(a->d);
+#endif
+    }
+    if( a->flags & ~7 )
+       log_bug("invalid flag value in mpi\n");
+    xfree(a);
+}
+
+
+void
+mpi_set_secure( MPI a )
+{
+    mpi_ptr_t ap, bp;
+
+    if( (a->flags & 1) )
+       return;
+    a->flags |= 1;
+    ap = a->d;
+    if( !a->nlimbs ) {
+       assert(!ap);
+       return;
+    }
+#ifdef M_DEBUG
+    bp = mpi_debug_alloc_limb_space( a->nlimbs, 1, "set_secure" );
+#else
+    bp = mpi_alloc_limb_space( a->nlimbs, 1 );
+#endif
+    MPN_COPY( bp, ap, a->nlimbs );
+    a->d = bp;
+#ifdef M_DEBUG
+    mpi_debug_free_limb_space(ap, "set_secure");
+#else
+    mpi_free_limb_space(ap);
+#endif
+}
+
+
+MPI
+mpi_set_opaque( MPI a, void *p, unsigned int len )
+{
+    if( !a ) {
+#ifdef M_DEBUG
+       a = mpi_debug_alloc(0,"alloc_opaque");
+#else
+       a = mpi_alloc(0);
+#endif
+    }
+
+    if( a->flags & 4 )
+       xfree( a->d );
+    else {
+#ifdef M_DEBUG
+       mpi_debug_free_limb_space(a->d, "alloc_opaque");
+#else
+       mpi_free_limb_space(a->d);
+#endif
+    }
+
+    a->d = p;
+    a->alloced = 0;
+    a->nlimbs = 0;
+    a->nbits = len;
+    a->flags = 4;
+    return a;
+}
+
+
+void *
+mpi_get_opaque( MPI a, unsigned int *len )
+{
+    if( !(a->flags & 4) )
+       log_bug("mpi_get_opaque on normal mpi\n");
+    if( len )
+       *len = a->nbits;
+    return a->d;
+}
+
+
+/****************
+ * Note: This copy function should not interpret the MPI
+ *      but copy it transparently.
+ */
+MPI
+#ifdef M_DEBUG
+mpi_debug_copy( MPI a, const char *info )
+#else
+mpi_copy( MPI a )
+#endif
+{
+    int i;
+    MPI b;
+
+    if( a && (a->flags & 4) ) {
+       void *p = m_is_secure(a->d)? xmalloc_secure( a->nbits )
+                                  : xmalloc( a->nbits );
+       memcpy( p, a->d, a->nbits );
+       b = mpi_set_opaque( NULL, p, a->nbits );
+    }
+    else if( a ) {
+#ifdef M_DEBUG
+       b = mpi_is_secure(a)? mpi_debug_alloc_secure( a->nlimbs, info )
+                           : mpi_debug_alloc( a->nlimbs, info );
+#else
+       b = mpi_is_secure(a)? mpi_alloc_secure( a->nlimbs )
+                           : mpi_alloc( a->nlimbs );
+#endif
+       b->nlimbs = a->nlimbs;
+       b->sign = a->sign;
+       b->flags  = a->flags;
+       b->nbits = a->nbits;
+       for(i=0; i < b->nlimbs; i++ )
+           b->d[i] = a->d[i];
+    }
+    else
+       b = NULL;
+    return b;
+}
+
+
+/****************
+ * This function allocates an MPI which is optimized to hold
+ * a value as large as the one given in the arhgument and allocates it
+ * with the same flags as A.
+ */
+MPI
+#ifdef M_DEBUG
+mpi_debug_alloc_like( MPI a, const char *info )
+#else
+mpi_alloc_like( MPI a )
+#endif
+{
+    MPI b;
+
+    if( a && (a->flags & 4) ) {
+       void *p = m_is_secure(a->d)? xmalloc_secure( a->nbits )
+                                  : xmalloc( a->nbits );
+       memcpy( p, a->d, a->nbits );
+       b = mpi_set_opaque( NULL, p, a->nbits );
+    }
+    else if( a ) {
+#ifdef M_DEBUG
+       b = mpi_is_secure(a)? mpi_debug_alloc_secure( a->nlimbs, info )
+                           : mpi_debug_alloc( a->nlimbs, info );
+#else
+       b = mpi_is_secure(a)? mpi_alloc_secure( a->nlimbs )
+                           : mpi_alloc( a->nlimbs );
+#endif
+       b->nlimbs = 0;
+       b->sign = 0;
+       b->flags = a->flags;
+       b->nbits = 0;
+    }
+    else
+       b = NULL;
+    return b;
+}
+
+
+void
+mpi_set( MPI w, MPI u)
+{
+    mpi_ptr_t wp, up;
+    mpi_size_t usize = u->nlimbs;
+    int usign = u->sign;
+
+    RESIZE_IF_NEEDED(w, usize);
+    wp = w->d;
+    up = u->d;
+    MPN_COPY( wp, up, usize );
+    w->nlimbs = usize;
+    w->nbits = u->nbits;
+    w->flags = u->flags;
+    w->sign = usign;
+}
+
+
+void
+mpi_set_ui( MPI w, unsigned long u)
+{
+    RESIZE_IF_NEEDED(w, 1);
+    w->d[0] = u;
+    w->nlimbs = u? 1:0;
+    w->sign = 0;
+    w->nbits = 0;
+    w->flags = 0;
+}
+
+
+MPI
+mpi_alloc_set_ui( unsigned long u)
+{
+#ifdef M_DEBUG
+    MPI w = mpi_debug_alloc(1,"alloc_set_ui");
+#else
+    MPI w = mpi_alloc(1);
+#endif
+    w->d[0] = u;
+    w->nlimbs = u? 1:0;
+    w->sign = 0;
+    return w;
+}
+
+
+void
+mpi_swap( MPI a, MPI b)
+{
+    struct gcry_mpi tmp;
+
+    tmp = *a; *a = *b; *b = tmp;
+}
diff --git a/mpi/pa7100/distfiles b/mpi/pa7100/distfiles
new file mode 100644 (file)
index 0000000..fece943
--- /dev/null
@@ -0,0 +1,3 @@
+mpih-lshift.S
+mpih-rshift.S
+
diff --git a/mpi/pa7100/mpih-lshift.S b/mpi/pa7100/mpih-lshift.S
new file mode 100644 (file)
index 0000000..55b48fa
--- /dev/null
@@ -0,0 +1,97 @@
+/* hppa   lshift
+ *       optimized for the PA7100, where it runs at 3.25 cycles/limb
+ * 
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (gr26)
+ *                mpi_ptr_t up,        (gr25)
+ *                mpi_size_t usize,    (gr24)
+ *                unsigned cnt)        (gr23)
+ */
+
+       .code
+       .export         mpihelp_lshift
+       .label          mpihelp_lshift
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       sh2add          %r24,%r25,%r25
+       sh2add          %r24,%r26,%r26
+       ldws,mb         -4(0,%r25),%r22
+       subi            32,%r23,%r1
+       mtsar           %r1
+       addib,=         -1,%r24,L$0004
+       vshd            %r0,%r22,%r28           ; compute carry out limb
+       ldws,mb         -4(0,%r25),%r29
+       addib,<=        -5,%r24,L$rest
+       vshd            %r22,%r29,%r20
+
+       .label  L$loop
+       ldws,mb         -4(0,%r25),%r22
+       stws,mb         %r20,-4(0,%r26)
+       vshd            %r29,%r22,%r20
+       ldws,mb         -4(0,%r25),%r29
+       stws,mb         %r20,-4(0,%r26)
+       vshd            %r22,%r29,%r20
+       ldws,mb         -4(0,%r25),%r22
+       stws,mb         %r20,-4(0,%r26)
+       vshd            %r29,%r22,%r20
+       ldws,mb         -4(0,%r25),%r29
+       stws,mb         %r20,-4(0,%r26)
+       addib,>         -4,%r24,L$loop
+       vshd            %r22,%r29,%r20
+
+       .label  L$rest
+       addib,=         4,%r24,L$end1
+       nop
+       .label  L$eloop
+       ldws,mb         -4(0,%r25),%r22
+       stws,mb         %r20,-4(0,%r26)
+       addib,<=        -1,%r24,L$end2
+       vshd            %r29,%r22,%r20
+       ldws,mb         -4(0,%r25),%r29
+       stws,mb         %r20,-4(0,%r26)
+       addib,>         -1,%r24,L$eloop
+       vshd            %r22,%r29,%r20
+
+       .label  L$end1
+       stws,mb         %r20,-4(0,%r26)
+       vshd            %r29,%r0,%r20
+       bv              0(%r2)
+       stw             %r20,-4(0,%r26)
+       .label  L$end2
+       stws,mb         %r20,-4(0,%r26)
+       .label  L$0004
+       vshd            %r22,%r0,%r20
+       bv              0(%r2)
+       stw             %r20,-4(0,%r26)
+
+       .exit
+       .procend
+
+
+
diff --git a/mpi/pa7100/mpih-rshift.S b/mpi/pa7100/mpih-rshift.S
new file mode 100644 (file)
index 0000000..81906f9
--- /dev/null
@@ -0,0 +1,93 @@
+/* hppa   rshift
+ *       optimized for the PA7100, where it runs at 3.25 cycles/limb
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (gr26)
+ *                mpi_ptr_t up,       (gr25)
+ *                mpi_size_t usize,   (gr24)
+ *                unsigned cnt)       (gr23)
+ */
+
+       .code
+       .export         mpihelp_rshift
+       .label          mpihelp_rshift
+       .proc
+       .callinfo       frame=64,no_calls
+       .entry
+
+       ldws,ma         4(0,%r25),%r22
+       mtsar           %r23
+       addib,=         -1,%r24,L$r004
+       vshd            %r22,%r0,%r28           ; compute carry out limb
+       ldws,ma         4(0,%r25),%r29
+       addib,<=        -5,%r24,L$rrest
+       vshd            %r29,%r22,%r20
+
+       .label  L$roop
+       ldws,ma         4(0,%r25),%r22
+       stws,ma         %r20,4(0,%r26)
+       vshd            %r22,%r29,%r20
+       ldws,ma         4(0,%r25),%r29
+       stws,ma         %r20,4(0,%r26)
+       vshd            %r29,%r22,%r20
+       ldws,ma         4(0,%r25),%r22
+       stws,ma         %r20,4(0,%r26)
+       vshd            %r22,%r29,%r20
+       ldws,ma         4(0,%r25),%r29
+       stws,ma         %r20,4(0,%r26)
+       addib,>         -4,%r24,L$roop
+       vshd            %r29,%r22,%r20
+
+       .label  L$rrest
+       addib,=         4,%r24,L$rend1
+       nop
+       .label  L$eroop
+       ldws,ma         4(0,%r25),%r22
+       stws,ma         %r20,4(0,%r26)
+       addib,<=        -1,%r24,L$rend2
+       vshd            %r22,%r29,%r20
+       ldws,ma         4(0,%r25),%r29
+       stws,ma         %r20,4(0,%r26)
+       addib,>         -1,%r24,L$eroop
+       vshd            %r29,%r22,%r20
+
+       .label  L$rend1
+       stws,ma         %r20,4(0,%r26)
+       vshd            %r0,%r29,%r20
+       bv              0(%r2)
+       stw             %r20,0(0,%r26)
+       .label  L$rend2
+       stws,ma         %r20,4(0,%r26)
+       .label  L$r004
+       vshd            %r0,%r22,%r20
+       bv              0(%r2)
+       stw             %r20,0(0,%r26)
+
+       .exit
+       .procend
+
+
diff --git a/mpi/power/distfiles b/mpi/power/distfiles
new file mode 100644 (file)
index 0000000..e664c8d
--- /dev/null
@@ -0,0 +1,7 @@
+mpih-add1.S
+mpih-lshift.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-rshift.S
+mpih-sub1.S
diff --git a/mpi/power/mpih-add1.S b/mpi/power/mpih-add1.S
new file mode 100644 (file)
index 0000000..ae8b1a6
--- /dev/null
@@ -0,0 +1,87 @@
+/* IBM POWER add_n -- Add two limb vectors of equal, non-zero length.
+ *
+ *      Copyright (C) 1992, 1994, 1996, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# s2_ptr       r5
+# size         r6
+ */
+
+       .toc
+       .extern mpihelp_add_n[DS]
+       .extern .mpihelp_add_n
+.csect [PR]
+       .align 2
+       .globl mpihelp_add_n
+       .globl .mpihelp_add_n
+       .csect mpihelp_add_n[DS]
+mpihelp_add_n:
+       .long .mpihelp_add_n, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_add_n:
+       andil.  10,6,1          # odd or even number of limbs?
+       l       8,0(4)          # load least significant s1 limb
+       l       0,0(5)          # load least significant s2 limb
+       cal     3,-4(3)         # offset res_ptr, it's updated before it's used
+       sri     10,6,1          # count for unrolled loop
+       a       7,0,8           # add least significant limbs, set cy
+       mtctr   10              # copy count into CTR
+       beq     0,Leven         # branch if even # of limbs (# of limbs >= 2)
+
+# We have an odd # of limbs.  Add the first limbs separately.
+       cmpi    1,10,0          # is count for unrolled loop zero?
+       bne     1,L1            # branch if not
+       st      7,4(3)
+       aze     3,10            # use the fact that r10 is zero...
+       br                      # return
+
+# We added least significant limbs.  Now reload the next limbs to enter loop.
+L1:    lu      8,4(4)          # load s1 limb and update s1_ptr
+       lu      0,4(5)          # load s2 limb and update s2_ptr
+       stu     7,4(3)
+       ae      7,0,8           # add limbs, set cy
+Leven: lu      9,4(4)          # load s1 limb and update s1_ptr
+       lu      10,4(5)         # load s2 limb and update s2_ptr
+       bdz     Lend            # If done, skip loop
+
+Loop:  lu      8,4(4)          # load s1 limb and update s1_ptr
+       lu      0,4(5)          # load s2 limb and update s2_ptr
+       ae      11,9,10         # add previous limbs with cy, set cy
+       stu     7,4(3)          #
+       lu      9,4(4)          # load s1 limb and update s1_ptr
+       lu      10,4(5)         # load s2 limb and update s2_ptr
+       ae      7,0,8           # add previous limbs with cy, set cy
+       stu     11,4(3)         #
+       bdn     Loop            # decrement CTR and loop back
+
+Lend:  ae      11,9,10         # add limbs with cy, set cy
+       st      7,4(3)          #
+       st      11,8(3)         #
+       lil     3,0             # load cy into ...
+       aze     3,3             # ... return value register
+       br
+
diff --git a/mpi/power/mpih-lshift.S b/mpi/power/mpih-lshift.S
new file mode 100644 (file)
index 0000000..07eb929
--- /dev/null
@@ -0,0 +1,65 @@
+/* IBM POWER lshift
+ *
+ *      Copyright (C) 1992, 1994, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s_ptr        r4
+# size         r5
+# cnt          r6
+ */
+
+       .toc
+       .extern mpihelp_lshift[DS]
+       .extern .mpihelp_lshift
+.csect [PR]
+       .align 2
+       .globl mpihelp_lshift
+       .globl .mpihelp_lshift
+       .csect mpihelp_lshift[DS]
+mpihelp_lshift:
+       .long .mpihelp_lshift, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_lshift:
+       sli     0,5,2
+       cax     9,3,0
+       cax     4,4,0
+       sfi     8,6,32
+       mtctr   5               # put limb count in CTR loop register
+       lu      0,-4(4)         # read most significant limb
+       sre     3,0,8           # compute carry out limb, and init MQ register
+       bdz     Lend2           # if just one limb, skip loop
+       lu      0,-4(4)         # read 2:nd most significant limb
+       sreq    7,0,8           # compute most significant limb of result
+       bdz     Lend            # if just two limb, skip loop
+Loop:  lu      0,-4(4)         # load next lower limb
+       stu     7,-4(9)         # store previous result during read latency
+       sreq    7,0,8           # compute result limb
+       bdn     Loop            # loop back until CTR is zero
+Lend:  stu     7,-4(9)         # store 2:nd least significant limb
+Lend2: sle     7,0,6           # compute least significant limb
+       st      7,-4(9)         # store it
+       br
+
diff --git a/mpi/power/mpih-mul1.S b/mpi/power/mpih-mul1.S
new file mode 100644 (file)
index 0000000..214dbce
--- /dev/null
@@ -0,0 +1,116 @@
+/* IBM POWER  mul_1 -- Multiply a limb vector with a limb and store
+ *                     the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# size         r5
+# s2_limb      r6
+
+# The RS/6000 has no unsigned 32x32->64 bit multiplication instruction.  To
+# obtain that operation, we have to use the 32x32->64 signed multiplication
+# instruction, and add the appropriate compensation to the high limb of the
+# result.  We add the multiplicand if the multiplier has its most significant
+# bit set, and we add the multiplier if the multiplicand has its most
+# significant bit set. We need to preserve the carry flag between each
+# iteration, so we have to compute the compensation carefully (the natural,
+# srai+and doesn't work).  Since the POWER architecture has a branch unit
+# we can branch in zero cycles, so that's how we perform the additions.
+ */
+
+       .toc
+       .csect .mpihelp_mul_1[PR]
+       .align 2
+       .globl mpihelp_mul_1
+       .globl .mpihelp_mul_1
+       .csect mpihelp_mul_1[DS]
+mpihelp_mul_1:
+       .long .mpihelp_mul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_mul_1[PR]
+.mpihelp_mul_1:
+
+       cal     3,-4(3)
+       l       0,0(4)
+       cmpi    0,6,0
+       mtctr   5
+       mul     9,0,6
+       srai    7,0,31
+       and     7,7,6
+       mfmq    8
+       ai      0,0,0           # reset carry
+       cax     9,9,7
+       blt     Lneg
+Lpos:  bdz     Lend
+Lploop: lu     0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     10,0,6
+       mfmq    0
+       ae      8,0,9
+       bge     Lp0
+       cax     10,10,6         # adjust high limb for negative limb from s1
+Lp0:   bdz     Lend0
+       lu      0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     9,0,6
+       mfmq    0
+       ae      8,0,10
+       bge     Lp1
+       cax     9,9,6           # adjust high limb for negative limb from s1
+Lp1:   bdn     Lploop
+       b       Lend
+
+Lneg:  cax     9,9,0
+       bdz     Lend
+Lnloop: lu     0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     10,0,6
+       cax     10,10,0         # adjust high limb for negative s2_limb
+       mfmq    0
+       ae      8,0,9
+       bge     Ln0
+       cax     10,10,6         # adjust high limb for negative limb from s1
+Ln0:   bdz     Lend0
+       lu      0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     9,0,6
+       cax     9,9,0           # adjust high limb for negative s2_limb
+       mfmq    0
+       ae      8,0,10
+       bge     Ln1
+       cax     9,9,6           # adjust high limb for negative limb from s1
+Ln1:   bdn     Lnloop
+       b       Lend
+
+Lend0: cal     9,0(10)
+Lend:  st      8,4(3)
+       aze     3,9
+       br
+
diff --git a/mpi/power/mpih-mul2.S b/mpi/power/mpih-mul2.S
new file mode 100644 (file)
index 0000000..571d54e
--- /dev/null
@@ -0,0 +1,131 @@
+/* IBM POWER addmul_1 -- Multiply a limb vector with a limb and add
+ *                      the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# size         r5
+# s2_limb      r6
+
+# The RS/6000 has no unsigned 32x32->64 bit multiplication instruction.  To
+# obtain that operation, we have to use the 32x32->64 signed multiplication
+# instruction, and add the appropriate compensation to the high limb of the
+# result.  We add the multiplicand if the multiplier has its most significant
+# bit set, and we add the multiplier if the multiplicand has its most
+# significant bit set. We need to preserve the carry flag between each
+# iteration, so we have to compute the compensation carefully (the natural,
+# srai+and doesn't work).  Since the POWER architecture has a branch unit
+# we can branch in zero cycles, so that's how we perform the additions.
+ */
+
+       .toc
+       .csect .mpihelp_addmul_1[PR]
+       .align 2
+       .globl mpihelp_addmul_1
+       .globl .mpihelp_addmul_1
+       .csect mpihelp_addmul_1[DS]
+mpihelp_addmul_1:
+       .long .mpihelp_addmul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_addmul_1[PR]
+.mpihelp_addmul_1:
+
+       cal     3,-4(3)
+       l       0,0(4)
+       cmpi    0,6,0
+       mtctr   5
+       mul     9,0,6
+       srai    7,0,31
+       and     7,7,6
+       mfmq    8
+       cax     9,9,7
+       l       7,4(3)
+       a       8,8,7           # add res_limb
+       blt     Lneg
+Lpos:  bdz     Lend
+
+Lploop: lu     0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     10,0,6
+       mfmq    0
+       ae      8,0,9           # low limb + old_cy_limb + old cy
+       l       7,4(3)
+       aze     10,10           # propagate cy to new cy_limb
+       a       8,8,7           # add res_limb
+       bge     Lp0
+       cax     10,10,6         # adjust high limb for negative limb from s1
+Lp0:   bdz     Lend0
+       lu      0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     9,0,6
+       mfmq    0
+       ae      8,0,10
+       l       7,4(3)
+       aze     9,9
+       a       8,8,7
+       bge     Lp1
+       cax     9,9,6           # adjust high limb for negative limb from s1
+Lp1:   bdn     Lploop
+
+       b       Lend
+
+Lneg:  cax     9,9,0
+       bdz     Lend
+Lnloop: lu     0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     10,0,6
+       mfmq    7
+       ae      8,7,9
+       l       7,4(3)
+       ae      10,10,0         # propagate cy to new cy_limb
+       a       8,8,7           # add res_limb
+       bge     Ln0
+       cax     10,10,6         # adjust high limb for negative limb from s1
+Ln0:   bdz     Lend0
+       lu      0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     9,0,6
+       mfmq    7
+       ae      8,7,10
+       l       7,4(3)
+       ae      9,9,0           # propagate cy to new cy_limb
+       a       8,8,7           # add res_limb
+       bge     Ln1
+       cax     9,9,6           # adjust high limb for negative limb from s1
+Ln1:   bdn     Lnloop
+       b       Lend
+
+Lend0: cal     9,0(10)
+Lend:  st      8,4(3)
+       aze     3,9
+       br
+
diff --git a/mpi/power/mpih-mul3.S b/mpi/power/mpih-mul3.S
new file mode 100644 (file)
index 0000000..192c6f4
--- /dev/null
@@ -0,0 +1,136 @@
+/* IBM POWER submul_1 -- Multiply a limb vector with a limb and subtract
+ *                      the result from a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*
+
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# size         r5
+# s2_limb      r6
+
+# The RS/6000 has no unsigned 32x32->64 bit multiplication instruction.  To
+# obtain that operation, we have to use the 32x32->64 signed multiplication
+# instruction, and add the appropriate compensation to the high limb of the
+# result.  We add the multiplicand if the multiplier has its most significant
+# bit set, and we add the multiplier if the multiplicand has its most
+# significant bit set. We need to preserve the carry flag between each
+# iteration, so we have to compute the compensation carefully (the natural,
+# srai+and doesn't work).  Since the POWER architecture has a branch unit
+# we can branch in zero cycles, so that's how we perform the additions.
+ */
+
+       .toc
+       .csect .mpihelp_submul_1[PR]
+       .align 2
+       .globl mpihelp_submul_1
+       .globl .mpihelp_submul_1
+       .csect mpihelp_submul_1[DS]
+mpihelp_submul_1:
+       .long .mpihelp_submul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_submul_1[PR]
+.mpihelp_submul_1:
+
+       cal     3,-4(3)
+       l       0,0(4)
+       cmpi    0,6,0
+       mtctr   5
+       mul     9,0,6
+       srai    7,0,31
+       and     7,7,6
+       mfmq    11
+       cax     9,9,7
+       l       7,4(3)
+       sf      8,11,7          # add res_limb
+       a       11,8,11         # invert cy (r11 is junk)
+       blt     Lneg
+Lpos:  bdz     Lend
+
+Lploop: lu     0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     10,0,6
+       mfmq    0
+       ae      11,0,9          # low limb + old_cy_limb + old cy
+       l       7,4(3)
+       aze     10,10           # propagate cy to new cy_limb
+       sf      8,11,7          # add res_limb
+       a       11,8,11         # invert cy (r11 is junk)
+       bge     Lp0
+       cax     10,10,6         # adjust high limb for negative limb from s1
+Lp0:   bdz     Lend0
+       lu      0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     9,0,6
+       mfmq    0
+       ae      11,0,10
+       l       7,4(3)
+       aze     9,9
+       sf      8,11,7
+       a       11,8,11         # invert cy (r11 is junk)
+       bge     Lp1
+       cax     9,9,6           # adjust high limb for negative limb from s1
+Lp1:   bdn     Lploop
+
+       b       Lend
+
+Lneg:  cax     9,9,0
+       bdz     Lend
+Lnloop: lu     0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     10,0,6
+       mfmq    7
+       ae      11,7,9
+       l       7,4(3)
+       ae      10,10,0         # propagate cy to new cy_limb
+       sf      8,11,7          # add res_limb
+       a       11,8,11         # invert cy (r11 is junk)
+       bge     Ln0
+       cax     10,10,6         # adjust high limb for negative limb from s1
+Ln0:   bdz     Lend0
+       lu      0,4(4)
+       stu     8,4(3)
+       cmpi    0,0,0
+       mul     9,0,6
+       mfmq    7
+       ae      11,7,10
+       l       7,4(3)
+       ae      9,9,0           # propagate cy to new cy_limb
+       sf      8,11,7          # add res_limb
+       a       11,8,11         # invert cy (r11 is junk)
+       bge     Ln1
+       cax     9,9,6           # adjust high limb for negative limb from s1
+Ln1:   bdn     Lnloop
+       b       Lend
+
+Lend0: cal     9,0(10)
+Lend:  st      8,4(3)
+       aze     3,9
+       br
+
diff --git a/mpi/power/mpih-rshift.S b/mpi/power/mpih-rshift.S
new file mode 100644 (file)
index 0000000..3214f86
--- /dev/null
@@ -0,0 +1,65 @@
+/* IBM POWER rshift
+ *
+ *      Copyright (C) 1992, 1994, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s_ptr        r4
+# size         r5
+# cnt          r6
+*/
+
+       .toc
+       .extern mpihelp_rshift[DS]
+       .extern .mpihelp_rshift
+.csect [PR]
+       .align 2
+       .globl mpihelp_rshift
+       .globl .mpihelp_rshift
+       .csect mpihelp_rshift[DS]
+mpihelp_rshift:
+       .long .mpihelp_rshift, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_rshift:
+       sfi     8,6,32
+       mtctr   5               # put limb count in CTR loop register
+       l       0,0(4)          # read least significant limb
+       ai      9,3,-4          # adjust res_ptr since it's offset in the stu:s
+       sle     3,0,8           # compute carry limb, and init MQ register
+       bdz     Lend2           # if just one limb, skip loop
+       lu      0,4(4)          # read 2:nd least significant limb
+       sleq    7,0,8           # compute least significant limb of result
+       bdz     Lend            # if just two limb, skip loop
+Loop:  lu      0,4(4)          # load next higher limb
+       stu     7,4(9)          # store previous result during read latency
+       sleq    7,0,8           # compute result limb
+       bdn     Loop            # loop back until CTR is zero
+Lend:  stu     7,4(9)          # store 2:nd most significant limb
+Lend2: sre     7,0,6           # compute most significant limb
+       st      7,4(9)          # store it
+       br
+
+
diff --git a/mpi/power/mpih-sub1.S b/mpi/power/mpih-sub1.S
new file mode 100644 (file)
index 0000000..d7703ee
--- /dev/null
@@ -0,0 +1,89 @@
+/* IBM POWER sub_n -- Subtract two limb vectors of equal, non-zero length.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1996, 1999
+ *                    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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*
+# INPUT PARAMETERS
+# res_ptr      r3
+# s1_ptr       r4
+# s2_ptr       r5
+# size         r6
+ */
+
+       .toc
+       .extern mpihelp_sub_n[DS]
+       .extern .mpihelp_sub_n
+.csect [PR]
+       .align 2
+       .globl mpihelp_sub_n
+       .globl .mpihelp_sub_n
+       .csect mpihelp_sub_n[DS]
+mpihelp_sub_n:
+       .long .mpihelp_sub_n, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_sub_n:
+       andil.  10,6,1          # odd or even number of limbs?
+       l       8,0(4)          # load least significant s1 limb
+       l       0,0(5)          # load least significant s2 limb
+       cal     3,-4(3)         # offset res_ptr, it's updated before it's used
+       sri     10,6,1          # count for unrolled loop
+       sf      7,0,8           # subtract least significant limbs, set cy
+       mtctr   10              # copy count into CTR
+       beq     0,Leven         # branch if even # of limbs (# of limbs >= 2)
+
+# We have an odd # of limbs.  Add the first limbs separately.
+       cmpi    1,10,0          # is count for unrolled loop zero?
+       bne     1,L1            # branch if not
+       st      7,4(3)
+       sfe     3,0,0           # load !cy into ...
+       sfi     3,3,0           # ... return value register
+       br                      # return
+
+# We added least significant limbs.  Now reload the next limbs to enter loop.
+L1:    lu      8,4(4)          # load s1 limb and update s1_ptr
+       lu      0,4(5)          # load s2 limb and update s2_ptr
+       stu     7,4(3)
+       sfe     7,0,8           # subtract limbs, set cy
+Leven: lu      9,4(4)          # load s1 limb and update s1_ptr
+       lu      10,4(5)         # load s2 limb and update s2_ptr
+       bdz     Lend            # If done, skip loop
+
+Loop:  lu      8,4(4)          # load s1 limb and update s1_ptr
+       lu      0,4(5)          # load s2 limb and update s2_ptr
+       sfe     11,10,9         # subtract previous limbs with cy, set cy
+       stu     7,4(3)          #
+       lu      9,4(4)          # load s1 limb and update s1_ptr
+       lu      10,4(5)         # load s2 limb and update s2_ptr
+       sfe     7,0,8           # subtract previous limbs with cy, set cy
+       stu     11,4(3)         #
+       bdn     Loop            # decrement CTR and loop back
+
+Lend:  sfe     11,10,9         # subtract limbs with cy, set cy
+       st      7,4(3)          #
+       st      11,8(3)         #
+       sfe     3,0,0           # load !cy into ...
+       sfi     3,3,0           # ... return value register
+       br
+
diff --git a/mpi/powerpc32/distfiles b/mpi/powerpc32/distfiles
new file mode 100644 (file)
index 0000000..af10d79
--- /dev/null
@@ -0,0 +1,9 @@
+mpih-add1.S
+mpih-sub1.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-lshift.S
+mpih-rshift.S
+syntax.h
+
diff --git a/mpi/powerpc32/mpih-add1.S b/mpi/powerpc32/mpih-add1.S
new file mode 100644 (file)
index 0000000..d8f78da
--- /dev/null
@@ -0,0 +1,137 @@
+/* PowerPC-32 add_n -- Add two limb vectors of equal, non-zero length.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,  (r3)
+ *                mpi_ptr_t s1_ptr,    (r4)
+ *                mpi_ptr_t s2_ptr,    (r5)
+ *                mpi_size_t size)     (r6)
+ */
+
+       .toc
+       .extern mpihelp_add_n[DS]
+       .extern .mpihelp_add_n
+.csect [PR]
+       .align 2
+       .globl mpihelp_add_n
+       .globl .mpihelp_add_n
+       .csect mpihelp_add_n[DS]
+mpihelp_add_n:
+       .long .mpihelp_add_n, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_add_n:
+       mtctr   6               # copy size into CTR
+       lwz     8,0(4)          # load least significant s1 limb
+       lwz     0,0(5)          # load least significant s2 limb
+       addi    3,3,-4          # offset res_ptr, it is updated before used
+       addc    7,0,8           # add least significant limbs, set cy
+       bdz     Lend            # If done, skip loop
+Loop:  lwzu    8,4(4)          # load s1 limb and update s1_ptr
+       lwzu    0,4(5)          # load s2 limb and update s2_ptr
+       stwu    7,4(3)          # store previous limb in load latency slot
+       adde    7,0,8           # add new limbs with cy, set cy
+       bdnz    Loop            # decrement CTR and loop back
+Lend:  stw     7,4(3)          # store ultimate result limb
+       li      3,0             # load cy into ...
+       addze   3,3             # ... return value register
+       blr
+
+#else
+/* Add two limb vectors of equal, non-zero length for PowerPC.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/* mp_limb_t mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
+                       mp_size_t size)
+   Calculate s1+s2 and put result in res_ptr; return carry, 0 or 1.  */
+
+/* Note on optimisation: This code is optimal for the 601.  Almost every other
+   possible 2-unrolled inner loop will not be. Also, watch out for the
+   alignment...  */
+
+EALIGN(mpihelp_add_n,3,0)
+/* Set up for loop below.  */
+       mtcrf 0x01,%r6
+       srwi. %r7,%r6,1
+       li    %r10,0
+       mtctr %r7
+       bt    31,2f
+
+/* Clear the carry.  */
+       addic %r0,%r0,0
+/* Adjust pointers for loop.  */
+       addi  %r3,%r3,-4
+       addi  %r4,%r4,-4
+       addi  %r5,%r5,-4
+       b     0f
+
+2:     lwz  %r7,0(%r5)
+       lwz  %r6,0(%r4)
+       addc %r6,%r6,%r7
+       stw  %r6,0(%r3)
+       beq  1f
+
+/* The loop.  */
+
+/* Align start of loop to an odd word boundary to guarantee that the
+   last two words can be fetched in one access (for 601).  */
+0:     lwz  %r9,4(%r4)
+       lwz  %r8,4(%r5)
+       lwzu %r6,8(%r4)
+       lwzu %r7,8(%r5)
+       adde %r8,%r9,%r8
+       stw  %r8,4(%r3)
+       adde %r6,%r6,%r7
+       stwu %r6,8(%r3)
+       bdnz 0b
+/* Return the carry.  */
+1:     addze %r3,%r10
+       blr
+END(mpihelp_add_n)
+#endif
+
diff --git a/mpi/powerpc32/mpih-lshift.S b/mpi/powerpc32/mpih-lshift.S
new file mode 100644 (file)
index 0000000..4e5da5b
--- /dev/null
@@ -0,0 +1,199 @@
+/* PowerPC-32 lshift
+ *
+ *      Copyright (C) 1995, 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_lshift( mpi_ptr_t wp,       (r3)
+ *                mpi_ptr_t up,        (r4)
+ *                mpi_size_t usize,    (r5)
+ *                unsigned cnt)        (r6)
+ */
+
+       .toc
+.csect .text[PR]
+       .align  2
+       .globl  mpihelp_lshift
+       .globl  .mpihelp_lshift
+       .csect  mpihelp_lshift[DS]
+mpihelp_lshift:
+       .long   .mpihelp_lshift,  TOC[tc0],       0
+       .csect  .text[PR]
+.mpihelp_lshift:
+       mtctr   5               # copy size into CTR
+       slwi    0,5,2
+       add     7,3,0           # make r7 point at end of res
+       add     4,4,0           # make r4 point at end of s1
+       subfic  8,6,32
+       lwzu    11,-4(4)        # load first s1 limb
+       srw     3,11,8          # compute function return value
+       bdz     Lend1
+
+Loop:  lwzu    10,-4(4)
+       slw     9,11,6
+       srw     12,10,8
+       or      9,9,12
+       stwu    9,-4(7)
+       bdz     Lend2
+       lwzu    11,-4(4)
+       slw     9,10,6
+       srw     12,11,8
+       or      9,9,12
+       stwu    9,-4(7)
+       bdnz    Loop
+
+Lend1: slw     0,11,6
+       stw     0,-4(7)
+       blr
+
+Lend2: slw     0,10,6
+       stw     0,-4(7)
+       blr
+
+#else
+/* Shift a limb left, low level routine.
+   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+/* mp_limb_t mpn_lshift (mp_ptr wp, mp_srcptr up, mp_size_t usize,
+                       unsigned int cnt)  */
+
+EALIGN(mpihelp_lshift,3,0)
+       mtctr   %r5            # copy size into CTR
+       cmplwi  %cr0,%r5,16     # is size < 16
+       slwi    %r0,%r5,2
+       add     %r7,%r3,%r0     # make r7 point at end of res
+       add     %r4,%r4,%r0     # make r4 point at end of s1
+       lwzu    %r11,-4(%r4)    # load first s1 limb
+       subfic  %r8,%r6,32
+       srw     %r3,%r11,%r8    # compute function return value
+       bge     %cr0,L(big)     # branch if size >= 16
+
+       bdz     L(end1)
+
+0:     lwzu    %r10,-4(%r4)
+       slw     %r9,%r11,%r6
+       srw     %r12,%r10,%r8
+       or      %r9,%r9,%r12
+       stwu    %r9,-4(%r7)
+       bdz     L(end2)
+       lwzu    %r11,-4(%r4)
+       slw     %r9,%r10,%r6
+       srw     %r12,%r11,%r8
+       or      %r9,%r9,%r12
+       stwu    %r9,-4(%r7)
+       bdnz    0b
+
+L(end1):slw    %r0,%r11,%r6
+       stw     %r0,-4(%r7)
+       blr
+
+
+/* Guaranteed not to succeed.  */
+L(boom): tweq   %r0,%r0
+
+/* We imitate a case statement, by using (yuk!) fixed-length code chunks,
+   of size 4*12 bytes. We have to do this (or something) to make this PIC.  */
+L(big):        mflr    %r9
+       bltl-   %cr0,L(boom)    # Never taken, only used to set LR.
+       slwi    %r10,%r6,4
+       mflr    %r12
+       add     %r10,%r12,%r10
+       slwi    %r8,%r6,5
+       add     %r10,%r8,%r10
+       mtctr   %r10
+       addi    %r5,%r5,-1
+       mtlr    %r9
+       bctr
+
+L(end2):slw    %r0,%r10,%r6
+       stw     %r0,-4(%r7)
+       blr
+
+#define DO_LSHIFT(n) \
+       mtctr   %r5;                                                   \
+0:     lwzu    %r10,-4(%r4);                                          \
+       slwi    %r9,%r11,n;                                            \
+       inslwi  %r9,%r10,n,32-n;                                       \
+       stwu    %r9,-4(%r7);                                           \
+       bdz-    L(end2);                                               \
+       lwzu    %r11,-4(%r4);                                          \
+       slwi    %r9,%r10,n;                                            \
+       inslwi  %r9,%r11,n,32-n;                                       \
+       stwu    %r9,-4(%r7);                                           \
+       bdnz    0b;                                                    \
+       b       L(end1)
+
+       DO_LSHIFT(1)
+       DO_LSHIFT(2)
+       DO_LSHIFT(3)
+       DO_LSHIFT(4)
+       DO_LSHIFT(5)
+       DO_LSHIFT(6)
+       DO_LSHIFT(7)
+       DO_LSHIFT(8)
+       DO_LSHIFT(9)
+       DO_LSHIFT(10)
+       DO_LSHIFT(11)
+       DO_LSHIFT(12)
+       DO_LSHIFT(13)
+       DO_LSHIFT(14)
+       DO_LSHIFT(15)
+       DO_LSHIFT(16)
+       DO_LSHIFT(17)
+       DO_LSHIFT(18)
+       DO_LSHIFT(19)
+       DO_LSHIFT(20)
+       DO_LSHIFT(21)
+       DO_LSHIFT(22)
+       DO_LSHIFT(23)
+       DO_LSHIFT(24)
+       DO_LSHIFT(25)
+       DO_LSHIFT(26)
+       DO_LSHIFT(27)
+       DO_LSHIFT(28)
+       DO_LSHIFT(29)
+       DO_LSHIFT(30)
+       DO_LSHIFT(31)
+
+END(mpihelp_lshift)
+#endif
diff --git a/mpi/powerpc32/mpih-mul1.S b/mpi/powerpc32/mpih-mul1.S
new file mode 100644 (file)
index 0000000..9f251f1
--- /dev/null
@@ -0,0 +1,121 @@
+/* PowerPC-32 mul_1 -- Multiply a limb vector with a limb and store
+ *                    the result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1993, 1994, 1995,
+ *                    1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_mul_1( mpi_ptr_t res_ptr,   (r3)
+ *               mpi_ptr_t s1_ptr,     (r4)
+ *               mpi_size_t s1_size,   (r5)
+ *               mpi_limb_t s2_limb)   (r6)
+ *
+ * This is a fairly straightforward implementation.  The timing of the PC601
+ * is hard to understand, so I will wait to optimize this until I have some
+ * hardware to play with.
+ *
+ * The code trivially generalizes to 64 bit limbs for the PC620.
+ */
+
+       .toc
+       .csect .mpihelp_mul_1[PR]
+       .align 2
+       .globl mpihelp_mul_1
+       .globl .mpihelp_mul_1
+       .csect mpihelp_mul_1[DS]
+mpihelp_mul_1:
+       .long .mpihelp_mul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_mul_1[PR]
+.mpihelp_mul_1:
+       mtctr   5
+
+       lwz     0,0(4)
+       mullw   7,0,6
+       mulhwu  10,0,6
+       addi    3,3,-4          # adjust res_ptr
+       addic   5,5,0           # clear cy with dummy insn
+       bdz     Lend
+
+Loop:  lwzu    0,4(4)
+       stwu    7,4(3)
+       mullw   8,0,6
+       adde    7,8,10
+       mulhwu  10,0,6
+       bdnz    Loop
+
+Lend:  stw     7,4(3)
+       addze   3,10
+       blr
+
+#else
+/* Multiply a limb vector by a limb, for PowerPC.
+   Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+
+/* mp_limb_t mpn_mul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
+                       mp_size_t s1_size, mp_limb_t s2_limb)
+   Calculate s1*s2 and put result in res_ptr; return carry.  */
+
+ENTRY(mpihelp_mul_1)
+       mtctr   %r5
+
+       lwz     %r0,0(%r4)
+       mullw   %r7,%r0,%r6
+       mulhwu  %r10,%r0,%r6
+       addi    %r3,%r3,-4             # adjust res_ptr
+       addic   %r5,%r5,0              # clear cy with dummy insn
+       bdz     1f
+
+0:     lwzu    %r0,4(%r4)
+       stwu    %r7,4(%r3)
+       mullw   %r8,%r0,%r6
+       adde    %r7,%r8,%r10
+       mulhwu  %r10,%r0,%r6
+       bdnz    0b
+
+1:     stw     %r7,4(%r3)
+       addze   %r3,%r10
+       blr
+END(mpihelp_mul_1)
+#endif
diff --git a/mpi/powerpc32/mpih-mul2.S b/mpi/powerpc32/mpih-mul2.S
new file mode 100644 (file)
index 0000000..b562ea6
--- /dev/null
@@ -0,0 +1,128 @@
+/* PowerPC-32 addmul_1 -- Multiply a limb vector with a limb and add
+ *                       the result to a second limb vector.
+ *
+ *      Copyright (C) 1995, 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r3)
+ *                  mpi_ptr_t s1_ptr,       (r4)
+ *                  mpi_size_t s1_size,     (r5)
+ *                  mpi_limb_t s2_limb)     (r6)
+ *
+ * This is a fairly straightforward implementation.  The timing of the PC601
+ * is hard to understand, so I will wait to optimize this until I have some
+ * hardware to play with.
+ *
+ * The code trivially generalizes to 64 bit limbs for the PC620.
+ */
+
+
+       .toc
+       .csect .mpihelp_addmul_1[PR]
+       .align 2
+       .globl mpihelp_addmul_1
+       .globl .mpihelp_addmul_1
+       .csect mpihelp_addmul_1[DS]
+mpihelp_addmul_1:
+       .long .mpihelp_addmul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_addmul_1[PR]
+.mpihelp_addmul_1:
+       mtctr   5
+
+       lwz     0,0(4)
+       mullw   7,0,6
+       mulhwu  10,0,6
+       lwz     9,0(3)
+       addc    8,7,9
+       addi    3,3,-4
+       bdz     Lend
+
+Loop:  lwzu    0,4(4)
+       stwu    8,4(3)
+       mullw   8,0,6
+       adde    7,8,10
+       mulhwu  10,0,6
+       lwz     9,4(3)
+       addze   10,10
+       addc    8,7,9
+       bdnz    Loop
+
+Lend:  stw     8,4(3)
+       addze   3,10
+       blr
+
+#else
+/* Multiply a limb vector by a single limb, for PowerPC.
+   Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+
+/* mp_limb_t mpn_addmul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
+                          mp_size_t s1_size, mp_limb_t s2_limb)
+   Calculate res+s1*s2 and put result back in res; return carry.  */
+ENTRY(mpihelp_addmul_1)
+       mtctr   %r5
+
+       lwz     %r0,0(%r4)
+       mullw   %r7,%r0,%r6
+       mulhwu  %r10,%r0,%r6
+       lwz     %r9,0(%r3)
+       addc    %r8,%r7,%r9
+       addi    %r3,%r3,-4             /* adjust res_ptr */
+       bdz     1f
+
+0:     lwzu    %r0,4(%r4)
+       stwu    %r8,4(%r3)
+       mullw   %r8,%r0,%r6
+       adde    %r7,%r8,%r10
+       mulhwu  %r10,%r0,%r6
+       lwz     %r9,4(%r3)
+       addze   %r10,%r10
+       addc    %r8,%r7,%r9
+       bdnz    0b
+
+1:     stw     %r8,4(%r3)
+       addze   %r3,%r10
+       blr
+END(mpihelp_addmul_1)
+#endif
diff --git a/mpi/powerpc32/mpih-mul3.S b/mpi/powerpc32/mpih-mul3.S
new file mode 100644 (file)
index 0000000..3b813f9
--- /dev/null
@@ -0,0 +1,131 @@
+/* PowerPC-32 submul_1 -- Multiply a limb vector with a limb and subtract
+ *                       the result from a second limb vector.
+ *
+ *      Copyright (C) 1995, 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_submul_1( mpi_ptr_t res_ptr,      (r3)
+ *                  mpi_ptr_t s1_ptr,       (r4)
+ *                  mpi_size_t s1_size,     (r5)
+ *                  mpi_limb_t s2_limb)     (r6)
+ *
+ * This is a fairly straightforward implementation.  The timing of the PC601
+ * is hard to understand, so I will wait to optimize this until I have some
+ * hardware to play with.
+ *
+ * The code trivially generalizes to 64 bit limbs for the PC620.
+ */
+
+       .toc
+       .csect .mpihelp_submul_1[PR]
+       .align 2
+       .globl mpihelp_submul_1
+       .globl .mpihelp_submul_1
+       .csect mpihelp_submul_1[DS]
+mpihelp_submul_1:
+       .long .mpihelp_submul_1[PR], TOC[tc0], 0
+       .csect .mpihelp_submul_1[PR]
+.mpihelp_submul_1:
+       mtctr   5
+
+       lwz     0,0(4)
+       mullw   7,0,6
+       mulhwu  10,0,6
+       lwz     9,0(3)
+       subfc   8,7,9
+       addc    7,7,8           # invert cy (r7 is junk)
+       addi    3,3,-4
+       bdz     Lend
+
+Loop:  lwzu    0,4(4)
+       stwu    8,4(3)
+       mullw   8,0,6
+       adde    7,8,10
+       mulhwu  10,0,6
+       lwz     9,4(3)
+       addze   10,10
+       subfc   8,7,9
+       addc    7,7,8           # invert cy (r7 is junk)
+       bdnz    Loop
+
+Lend:  stw     8,4(3)
+       addze   3,10
+       blr
+
+#else
+/* Multiply a limb vector by a single limb, for PowerPC.
+   Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+/* mp_limb_t mpn_submul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
+                          mp_size_t s1_size, mp_limb_t s2_limb)
+   Calculate res-s1*s2 and put result back in res; return carry.  */
+
+ENTRY(mpihelp_submul_1)
+       mtctr   %r5
+
+       lwz     %r0,0(%r4)
+       mullw   %r7,%r0,%r6
+       mulhwu  %r10,%r0,%r6
+       lwz     %r9,0(%r3)
+       subf    %r8,%r7,%r9
+       addc    %r7,%r7,%r8            # invert cy (r7 is junk)
+       addi    %r3,%r3,-4             # adjust res_ptr
+       bdz     1f
+
+0:     lwzu    %r0,4(%r4)
+       stwu    %r8,4(%r3)
+       mullw   %r8,%r0,%r6
+       adde    %r7,%r8,%r10
+       mulhwu  %r10,%r0,%r6
+       lwz     %r9,4(%r3)
+       addze   %r10,%r10
+       subf    %r8,%r7,%r9
+       addc    %r7,%r7,%r8            # invert cy (r7 is junk)
+       bdnz    0b
+
+1:     stw     %r8,4(%r3)
+       addze   %r3,%r10
+       blr
+END(mpihelp_submul_1)
+#endif
diff --git a/mpi/powerpc32/mpih-rshift.S b/mpi/powerpc32/mpih-rshift.S
new file mode 100644 (file)
index 0000000..4a826b4
--- /dev/null
@@ -0,0 +1,132 @@
+/* PowerPC-32 rshift
+ *
+ *      Copyright (C) 1995, 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ * mpi_limb_t
+ * mpihelp_rshift( mpi_ptr_t wp,       (r3)
+ *                mpi_ptr_t up,        (r4)
+ *                mpi_size_t usize,    (r5)
+ *                unsigned cnt)        (r6)
+ */
+
+       .toc
+.csect .text[PR]
+       .align  2
+       .globl  mpihelp_rshift
+       .globl  .mpihelp_rshift
+       .csect  mpihelp_rshift[DS]
+mpihelp_rshift:
+       .long   .mpihelp_rshift,  TOC[tc0],       0
+       .csect  .text[PR]
+.mpihelp_rshift:
+       mtctr   5               # copy size into CTR
+       addi    7,3,-4          # move adjusted res_ptr to free return reg
+       subfic  8,6,32
+       lwz     11,0(4)         # load first s1 limb
+       slw     3,11,8          # compute function return value
+       bdz     Lend1
+
+Loop:  lwzu    10,4(4)
+       srw     9,11,6
+       slw     12,10,8
+       or      9,9,12
+       stwu    9,4(7)
+       bdz     Lend2
+       lwzu    11,4(4)
+       srw     9,10,6
+       slw     12,11,8
+       or      9,9,12
+       stwu    9,4(7)
+       bdnz    Loop
+
+Lend1: srw     0,11,6
+       stw     0,4(7)
+       blr
+
+Lend2: srw     0,10,6
+       stw     0,4(7)
+       blr
+
+#else
+/* Shift a limb right, low level routine.
+   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+
+/* INPUT PARAMETERS
+   res_ptr     r3
+   s1_ptr      r4
+   size               r5
+   cnt        r6  */
+
+ENTRY(mpihelp_rshift)
+       mtctr   5              # copy size into CTR
+       addi    7,3,-4         # move adjusted res_ptr to free return reg
+       subfic  8,6,32
+       lwz     11,0(4)        # load first s1 limb
+       slw     3,11,8         # compute function return value
+       bdz     1f
+
+0:     lwzu    10,4(4)
+       srw     9,11,6
+       slw     12,10,8
+       or      9,9,12
+       stwu    9,4(7)
+       bdz     2f
+       lwzu    11,4(4)
+       srw     9,10,6
+       slw     12,11,8
+       or      9,9,12
+       stwu    9,4(7)
+       bdnz    0b
+
+1:     srw     0,11,6
+       stw     0,4(7)
+       blr
+
+2:     srw     0,10,6
+       stw     0,4(7)
+       blr
+END(mpihelp_rshift)
+#endif
diff --git a/mpi/powerpc32/mpih-sub1.S b/mpi/powerpc32/mpih-sub1.S
new file mode 100644 (file)
index 0000000..8902864
--- /dev/null
@@ -0,0 +1,133 @@
+/* PowerPC-32  sub_n -- Subtract two limb vectors of the same length > 0
+ *                     and store difference in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+#ifndef USE_PPC_PATCHES
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_sub_n( mpi_ptr_t res_ptr,  (r3)
+ *                mpi_ptr_t s1_ptr,    (r4)
+ *                mpi_ptr_t s2_ptr,    (r5)
+ *                mpi_size_t size)     (r6)
+ */
+
+       .toc
+       .extern mpihelp_sub_n[DS]
+       .extern .mpihelp_sub_n
+.csect [PR]
+       .align 2
+       .globl mpihelp_sub_n
+       .globl .mpihelp_sub_n
+       .csect mpihelp_sub_n[DS]
+mpihelp_sub_n:
+       .long .mpihelp_sub_n, TOC[tc0], 0
+       .csect [PR]
+.mpihelp_sub_n:
+       mtctr   6               # copy size into CTR
+       lwz     8,0(4)          # load least significant s1 limb
+       lwz     0,0(5)          # load least significant s2 limb
+       addi    3,3,-4          # offset res_ptr, it is updated before used
+       subfc   7,0,8           # add least significant limbs, set cy
+       bdz     Lend            # If done, skip loop
+Loop:  lwzu    8,4(4)          # load s1 limb and update s1_ptr
+       lwzu    0,4(5)          # load s2 limb and update s2_ptr
+       stwu    7,4(3)          # store previous limb in load latency slot
+       subfe   7,0,8           # add new limbs with cy, set cy
+       bdnz    Loop            # decrement CTR and loop back
+Lend:  stw     7,4(3)          # store ultimate result limb
+       subfe   3,0,0           # load !cy into ...
+       subfic  3,3,0           # ... return value register
+       blr
+
+#else
+/* Subtract two limb vectors of equal, non-zero length for PowerPC.
+   Copyright (C) 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+/* mp_limb_t mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr,
+                       mp_size_t size)
+   Calculate s1-s2 and put result in res_ptr; return borrow, 0 or 1.  */
+
+/* Note on optimisation: This code is optimal for the 601.  Almost every other
+   possible 2-unrolled inner loop will not be. Also, watch out for the
+   alignment...  */
+
+EALIGN(mpihelp_sub_n,3,1)
+/* Set up for loop below.  */
+       mtcrf 0x01,%r6
+       srwi. %r7,%r6,1
+       mtctr %r7
+       bt    31,2f
+
+/* Set the carry (clear the borrow).  */
+       subfc %r0,%r0,%r0
+/* Adjust pointers for loop.  */
+       addi  %r3,%r3,-4
+       addi  %r4,%r4,-4
+       addi  %r5,%r5,-4
+       b     0f
+
+2:     lwz   %r7,0(%r5)
+       lwz   %r6,0(%r4)
+       subfc %r6,%r7,%r6
+       stw   %r6,0(%r3)
+       beq   1f
+
+/* Align start of loop to an odd word boundary to guarantee that the
+   last two words can be fetched in one access (for 601).  This turns
+   out to be important.  */
+0:
+       lwz   %r9,4(%r4)
+       lwz   %r8,4(%r5)
+       lwzu  %r6,8(%r4)
+       lwzu  %r7,8(%r5)
+       subfe %r8,%r8,%r9
+       stw   %r8,4(%r3)
+       subfe %r6,%r7,%r6
+       stwu  %r6,8(%r3)
+       bdnz  0b
+/* Return the borrow. */
+1:     subfe %r3,%r3,%r3
+       neg   %r3,%r3
+       blr
+END(mpihelp_sub_n)
+#endif
diff --git a/mpi/powerpc32/syntax.h b/mpi/powerpc32/syntax.h
new file mode 100644 (file)
index 0000000..64d9c86
--- /dev/null
@@ -0,0 +1,75 @@
+/* gmp2-2.0.2-ppc/mpn/powerpc-linux/syntax.h   Tue Oct 6 19:27:01 1998 */
+/* From glibc's sysdeps/unix/sysv/linux/powerpc/sysdep.h */
+
+/* Copyright (C) 1992, 1997, 1998 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA. */
+
+
+#define USE_PPC_PATCHES 1
+
+/* This seems to always be the case on PPC.  */
+#define ALIGNARG(log2) log2
+/* For ELF we need the `.type' directive to make shared libs work right.  */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg;
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+#define ASM_GLOBAL_DIRECTIVE   .globl
+
+#ifdef __STDC__
+# define C_LABEL(name) C_SYMBOL_NAME(name)##:
+#else
+# define C_LABEL(name) C_SYMBOL_NAME(name)/**/:
+#endif
+
+#ifdef __STDC__
+# define L(body) .L##body
+#else
+# define L(body) .L/**/body
+#endif
+
+/* No profiling of gmp's assembly for now... */
+#define CALL_MCOUNT /* no profiling */
+
+#define        ENTRY(name)                                 \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);                \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)       \
+  .align ALIGNARG(2);                                      \
+  C_LABEL(name)                                            \
+  CALL_MCOUNT
+
+#define EALIGN_W_0  /* No words to insert.  */
+#define EALIGN_W_1  nop
+#define EALIGN_W_2  nop;nop
+#define EALIGN_W_3  nop;nop;nop
+#define EALIGN_W_4  EALIGN_W_3;nop
+#define EALIGN_W_5  EALIGN_W_4;nop
+#define EALIGN_W_6  EALIGN_W_5;nop
+#define EALIGN_W_7  EALIGN_W_6;nop
+
+/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes
+   past a 2^align boundary.  */
+#define EALIGN(name, alignt, words)                    \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);            \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)   \
+  .align ALIGNARG(alignt);                             \
+  EALIGN_W_##words;                                    \
+  C_LABEL(name)
+
+#undef END
+#define END(name)                   \
+  ASM_SIZE_DIRECTIVE(name)
+
diff --git a/mpi/powerpc64/distfiles b/mpi/powerpc64/distfiles
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/mpi/sparc32/distfiles b/mpi/sparc32/distfiles
new file mode 100644 (file)
index 0000000..95ff428
--- /dev/null
@@ -0,0 +1,6 @@
+
+mpih-lshift.S
+mpih-rshift.S
+mpih-add1.S
+udiv.S
+
diff --git a/mpi/sparc32/mpih-add1.S b/mpi/sparc32/mpih-add1.S
new file mode 100644 (file)
index 0000000..8cd6db6
--- /dev/null
@@ -0,0 +1,240 @@
+/* SPARC _add_n -- Add two limb vectors of the same length > 0 and store
+ *                sum in a third limb vector.
+ *
+ *      Copyright (C) 1995, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+
+/*******************
+ *  mpi_limb_t
+ *  mpihelp_add_n( mpi_ptr_t res_ptr,
+ *                mpi_ptr_t s1_ptr,
+ *                mpi_ptr_t s2_ptr,
+ *                mpi_size_t size)
+ */
+
+! INPUT PARAMETERS
+#define res_ptr %o0
+#define s1_ptr %o1
+#define s2_ptr %o2
+#define size   %o3
+
+#include "sysdep.h"
+
+       .text
+       .align  4
+       .global C_SYMBOL_NAME(mpihelp_add_n)
+C_SYMBOL_NAME(mpihelp_add_n):
+       xor     s2_ptr,res_ptr,%g1
+       andcc   %g1,4,%g0
+       bne     L1                      ! branch if alignment differs
+       nop
+! **  V1a  **
+L0:    andcc   res_ptr,4,%g0           ! res_ptr unaligned? Side effect: cy=0
+       be      L_v1                    ! if no, branch
+       nop
+/* Add least significant limb separately to align res_ptr and s2_ptr */
+       ld      [s1_ptr],%g4
+       add     s1_ptr,4,s1_ptr
+       ld      [s2_ptr],%g2
+       add     s2_ptr,4,s2_ptr
+       add     size,-1,size
+       addcc   %g4,%g2,%o4
+       st      %o4,[res_ptr]
+       add     res_ptr,4,res_ptr
+L_v1:  addx    %g0,%g0,%o4             ! save cy in register
+       cmp     size,2                  ! if size < 2 ...
+       bl      Lend2                   ! ... branch to tail code
+       subcc   %g0,%o4,%g0             ! restore cy
+
+       ld      [s1_ptr+0],%g4
+       addcc   size,-10,size
+       ld      [s1_ptr+4],%g1
+       ldd     [s2_ptr+0],%g2
+       blt     Lfin1
+       subcc   %g0,%o4,%g0             ! restore cy
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+Loop1: addxcc  %g4,%g2,%o4
+       ld      [s1_ptr+8],%g4
+       addxcc  %g1,%g3,%o5
+       ld      [s1_ptr+12],%g1
+       ldd     [s2_ptr+8],%g2
+       std     %o4,[res_ptr+0]
+       addxcc  %g4,%g2,%o4
+       ld      [s1_ptr+16],%g4
+       addxcc  %g1,%g3,%o5
+       ld      [s1_ptr+20],%g1
+       ldd     [s2_ptr+16],%g2
+       std     %o4,[res_ptr+8]
+       addxcc  %g4,%g2,%o4
+       ld      [s1_ptr+24],%g4
+       addxcc  %g1,%g3,%o5
+       ld      [s1_ptr+28],%g1
+       ldd     [s2_ptr+24],%g2
+       std     %o4,[res_ptr+16]
+       addxcc  %g4,%g2,%o4
+       ld      [s1_ptr+32],%g4
+       addxcc  %g1,%g3,%o5
+       ld      [s1_ptr+36],%g1
+       ldd     [s2_ptr+32],%g2
+       std     %o4,[res_ptr+24]
+       addx    %g0,%g0,%o4             ! save cy in register
+       addcc   size,-8,size
+       add     s1_ptr,32,s1_ptr
+       add     s2_ptr,32,s2_ptr
+       add     res_ptr,32,res_ptr
+       bge     Loop1
+       subcc   %g0,%o4,%g0             ! restore cy
+
+Lfin1: addcc   size,8-2,size
+       blt     Lend1
+       subcc   %g0,%o4,%g0             ! restore cy
+/* Add blocks of 2 limbs until less than 2 limbs remain */
+Loope1: addxcc %g4,%g2,%o4
+       ld      [s1_ptr+8],%g4
+       addxcc  %g1,%g3,%o5
+       ld      [s1_ptr+12],%g1
+       ldd     [s2_ptr+8],%g2
+       std     %o4,[res_ptr+0]
+       addx    %g0,%g0,%o4             ! save cy in register
+       addcc   size,-2,size
+       add     s1_ptr,8,s1_ptr
+       add     s2_ptr,8,s2_ptr
+       add     res_ptr,8,res_ptr
+       bge     Loope1
+       subcc   %g0,%o4,%g0             ! restore cy
+Lend1: addxcc  %g4,%g2,%o4
+       addxcc  %g1,%g3,%o5
+       std     %o4,[res_ptr+0]
+       addx    %g0,%g0,%o4             ! save cy in register
+
+       andcc   size,1,%g0
+       be      Lret1
+       subcc   %g0,%o4,%g0             ! restore cy
+/* Add last limb */
+       ld      [s1_ptr+8],%g4
+       ld      [s2_ptr+8],%g2
+       addxcc  %g4,%g2,%o4
+       st      %o4,[res_ptr+8]
+
+Lret1: retl
+       addx    %g0,%g0,%o0     ! return carry-out from most sign. limb
+
+L1:    xor     s1_ptr,res_ptr,%g1
+       andcc   %g1,4,%g0
+       bne     L2
+       nop
+! **  V1b  **
+       mov     s2_ptr,%g1
+       mov     s1_ptr,s2_ptr
+       b       L0
+       mov     %g1,s1_ptr
+
+! **  V2  **
+/* If we come here, the alignment of s1_ptr and res_ptr as well as the
+   alignment of s2_ptr and res_ptr differ.  Since there are only two ways
+   things can be aligned (that we care about) we now know that the alignment
+   of s1_ptr and s2_ptr are the same.  */
+
+L2:    cmp     size,1
+       be      Ljone
+       nop
+       andcc   s1_ptr,4,%g0            ! s1_ptr unaligned? Side effect: cy=0
+       be      L_v2                    ! if no, branch
+       nop
+/* Add least significant limb separately to align s1_ptr and s2_ptr */
+       ld      [s1_ptr],%g4
+       add     s1_ptr,4,s1_ptr
+       ld      [s2_ptr],%g2
+       add     s2_ptr,4,s2_ptr
+       add     size,-1,size
+       addcc   %g4,%g2,%o4
+       st      %o4,[res_ptr]
+       add     res_ptr,4,res_ptr
+
+L_v2:  addx    %g0,%g0,%o4             ! save cy in register
+       addcc   size,-8,size
+       blt     Lfin2
+       subcc   %g0,%o4,%g0             ! restore cy
+/* Add blocks of 8 limbs until less than 8 limbs remain */
+Loop2: ldd     [s1_ptr+0],%g2
+       ldd     [s2_ptr+0],%o4
+       addxcc  %g2,%o4,%g2
+       st      %g2,[res_ptr+0]
+       addxcc  %g3,%o5,%g3
+       st      %g3,[res_ptr+4]
+       ldd     [s1_ptr+8],%g2
+       ldd     [s2_ptr+8],%o4
+       addxcc  %g2,%o4,%g2
+       st      %g2,[res_ptr+8]
+       addxcc  %g3,%o5,%g3
+       st      %g3,[res_ptr+12]
+       ldd     [s1_ptr+16],%g2
+       ldd     [s2_ptr+16],%o4
+       addxcc  %g2,%o4,%g2
+       st      %g2,[res_ptr+16]
+       addxcc  %g3,%o5,%g3
+       st      %g3,[res_ptr+20]
+       ldd     [s1_ptr+24],%g2
+       ldd     [s2_ptr+24],%o4
+       addxcc  %g2,%o4,%g2
+       st      %g2,[res_ptr+24]
+       addxcc  %g3,%o5,%g3
+       st      %g3,[res_ptr+28]
+       addx    %g0,%g0,%o4             ! save cy in register
+       addcc   size,-8,size
+       add     s1_ptr,32,s1_ptr
+       add     s2_ptr,32,s2_ptr
+       add     res_ptr,32,res_ptr
+       bge     Loop2
+       subcc   %g0,%o4,%g0             ! restore cy
+
+Lfin2: addcc   size,8-2,size
+       blt     Lend2
+       subcc   %g0,%o4,%g0             ! restore cy
+Loope2: ldd    [s1_ptr+0],%g2
+       ldd     [s2_ptr+0],%o4
+       addxcc  %g2,%o4,%g2
+       st      %g2,[res_ptr+0]
+       addxcc  %g3,%o5,%g3
+       st      %g3,[res_ptr+4]
+       addx    %g0,%g0,%o4             ! save cy in register
+       addcc   size,-2,size
+       add     s1_ptr,8,s1_ptr
+       add     s2_ptr,8,s2_ptr
+       add     res_ptr,8,res_ptr
+       bge     Loope2
+       subcc   %g0,%o4,%g0             ! restore cy
+Lend2: andcc   size,1,%g0
+       be      Lret2
+       subcc   %g0,%o4,%g0             ! restore cy
+/* Add last limb */
+Ljone: ld      [s1_ptr],%g4
+       ld      [s2_ptr],%g2
+       addxcc  %g4,%g2,%o4
+       st      %o4,[res_ptr]
+
+Lret2: retl
+       addx    %g0,%g0,%o0     ! return carry-out from most sign. limb
+
+
+
diff --git a/mpi/sparc32/mpih-lshift.S b/mpi/sparc32/mpih-lshift.S
new file mode 100644 (file)
index 0000000..2099574
--- /dev/null
@@ -0,0 +1,98 @@
+/* sparc lshift
+ *
+ *      Copyright (C) 1995, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+
+! INPUT PARAMETERS
+! res_ptr      %o0
+! src_ptr      %o1
+! size         %o2
+! cnt          %o3
+
+#include "sysdep.h"
+
+       .text
+       .align  4
+       .global C_SYMBOL_NAME(mpihelp_lshift)
+C_SYMBOL_NAME(mpihelp_lshift):
+       sll     %o2,2,%g1
+       add     %o1,%g1,%o1     ! make %o1 point at end of src
+       ld      [%o1-4],%g2     ! load first limb
+       sub     %g0,%o3,%o5     ! negate shift count
+       add     %o0,%g1,%o0     ! make %o0 point at end of res
+       add     %o2,-1,%o2
+       andcc   %o2,4-1,%g4     ! number of limbs in first loop
+       srl     %g2,%o5,%g1     ! compute function result
+       be      L0              ! if multiple of 4 limbs, skip first loop
+       st      %g1,[%sp+80]
+
+       sub     %o2,%g4,%o2     ! adjust count for main loop
+
+Loop0: ld      [%o1-8],%g3
+       add     %o0,-4,%o0
+       add     %o1,-4,%o1
+       addcc   %g4,-1,%g4
+       sll     %g2,%o3,%o4
+       srl     %g3,%o5,%g1
+       mov     %g3,%g2
+       or      %o4,%g1,%o4
+       bne     Loop0
+        st     %o4,[%o0+0]
+
+L0:    tst     %o2
+       be      Lend
+        nop
+
+Loop:  ld      [%o1-8],%g3
+       add     %o0,-16,%o0
+       addcc   %o2,-4,%o2
+       sll     %g2,%o3,%o4
+       srl     %g3,%o5,%g1
+
+       ld      [%o1-12],%g2
+       sll     %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       st      %o4,[%o0+12]
+       srl     %g2,%o5,%g1
+
+       ld      [%o1-16],%g3
+       sll     %g2,%o3,%o4
+       or      %g4,%g1,%g4
+       st      %g4,[%o0+8]
+       srl     %g3,%o5,%g1
+
+       ld      [%o1-20],%g2
+       sll     %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       st      %o4,[%o0+4]
+       srl     %g2,%o5,%g1
+
+       add     %o1,-16,%o1
+       or      %g4,%g1,%g4
+       bne     Loop
+        st     %g4,[%o0+0]
+
+Lend:  sll     %g2,%o3,%g2
+       st      %g2,[%o0-4]
+       retl
+       ld      [%sp+80],%o0
+
diff --git a/mpi/sparc32/mpih-rshift.S b/mpi/sparc32/mpih-rshift.S
new file mode 100644 (file)
index 0000000..b20dba9
--- /dev/null
@@ -0,0 +1,94 @@
+/* sparc rshift
+ *
+ *      Copyright (C) 1995, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+! INPUT PARAMETERS
+! res_ptr      %o0
+! src_ptr      %o1
+! size         %o2
+! cnt          %o3
+
+#include "sysdep.h"
+
+       .text
+       .align  4
+       .global C_SYMBOL_NAME(mpihelp_rshift)
+C_SYMBOL_NAME(mpihelp_rshift):
+       ld      [%o1],%g2       ! load first limb
+       sub     %g0,%o3,%o5     ! negate shift count
+       add     %o2,-1,%o2
+       andcc   %o2,4-1,%g4     ! number of limbs in first loop
+       sll     %g2,%o5,%g1     ! compute function result
+       be      L0              ! if multiple of 4 limbs, skip first loop
+       st      %g1,[%sp+80]
+
+       sub     %o2,%g4,%o2     ! adjust count for main loop
+
+Loop0: ld      [%o1+4],%g3
+       add     %o0,4,%o0
+       add     %o1,4,%o1
+       addcc   %g4,-1,%g4
+       srl     %g2,%o3,%o4
+       sll     %g3,%o5,%g1
+       mov     %g3,%g2
+       or      %o4,%g1,%o4
+       bne     Loop0
+        st     %o4,[%o0-4]
+
+L0:    tst     %o2
+       be      Lend
+        nop
+
+Loop:  ld      [%o1+4],%g3
+       add     %o0,16,%o0
+       addcc   %o2,-4,%o2
+       srl     %g2,%o3,%o4
+       sll     %g3,%o5,%g1
+
+       ld      [%o1+8],%g2
+       srl     %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       st      %o4,[%o0-16]
+       sll     %g2,%o5,%g1
+
+       ld      [%o1+12],%g3
+       srl     %g2,%o3,%o4
+       or      %g4,%g1,%g4
+       st      %g4,[%o0-12]
+       sll     %g3,%o5,%g1
+
+       ld      [%o1+16],%g2
+       srl     %g3,%o3,%g4
+       or      %o4,%g1,%o4
+       st      %o4,[%o0-8]
+       sll     %g2,%o5,%g1
+
+       add     %o1,16,%o1
+       or      %g4,%g1,%g4
+       bne     Loop
+        st     %g4,[%o0-4]
+
+Lend:  srl     %g2,%o3,%g2
+       st      %g2,[%o0-0]
+       retl
+       ld      [%sp+80],%o0
+
diff --git a/mpi/sparc32/udiv.S b/mpi/sparc32/udiv.S
new file mode 100644 (file)
index 0000000..e4028a6
--- /dev/null
@@ -0,0 +1,198 @@
+/* SPARC v7 __udiv_qrnnd division support, used from longlong.h.
+ *           This is for v7 CPUs without a floating-point unit.
+ *
+ *      Copyright (C) 1993, 1994, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+! INPUT PARAMETERS
+! rem_ptr      o0
+! n1           o1
+! n0           o2
+! d            o3
+
+#include "sysdep.h"
+
+       .text
+       .align 4
+       .global C_SYMBOL_NAME(__udiv_qrnnd)
+C_SYMBOL_NAME(__udiv_qrnnd):
+       tst     %o3
+       bneg    Largedivisor
+       mov     8,%g1
+
+       b       Lp1
+       addxcc  %o2,%o2,%o2
+
+Lplop: bcc     Ln1
+       addxcc  %o2,%o2,%o2
+Lp1:   addx    %o1,%o1,%o1
+       subcc   %o1,%o3,%o4
+       bcc     Ln2
+       addxcc  %o2,%o2,%o2
+Lp2:   addx    %o1,%o1,%o1
+       subcc   %o1,%o3,%o4
+       bcc     Ln3
+       addxcc  %o2,%o2,%o2
+Lp3:   addx    %o1,%o1,%o1
+       subcc   %o1,%o3,%o4
+       bcc     Ln4
+       addxcc  %o2,%o2,%o2
+Lp4:   addx    %o1,%o1,%o1
+       addcc   %g1,-1,%g1
+       bne     Lplop
+       subcc   %o1,%o3,%o4
+       bcc     Ln5
+       addxcc  %o2,%o2,%o2
+Lp5:   st      %o1,[%o0]
+       retl
+       xnor    %g0,%o2,%o0
+
+Lnlop: bcc     Lp1
+       addxcc  %o2,%o2,%o2
+Ln1:   addx    %o4,%o4,%o4
+       subcc   %o4,%o3,%o1
+       bcc     Lp2
+       addxcc  %o2,%o2,%o2
+Ln2:   addx    %o4,%o4,%o4
+       subcc   %o4,%o3,%o1
+       bcc     Lp3
+       addxcc  %o2,%o2,%o2
+Ln3:   addx    %o4,%o4,%o4
+       subcc   %o4,%o3,%o1
+       bcc     Lp4
+       addxcc  %o2,%o2,%o2
+Ln4:   addx    %o4,%o4,%o4
+       addcc   %g1,-1,%g1
+       bne     Lnlop
+       subcc   %o4,%o3,%o1
+       bcc     Lp5
+       addxcc  %o2,%o2,%o2
+Ln5:   st      %o4,[%o0]
+       retl
+       xnor    %g0,%o2,%o0
+
+Largedivisor:
+       and     %o2,1,%o5       ! %o5 = n0 & 1
+
+       srl     %o2,1,%o2
+       sll     %o1,31,%g2
+       or      %g2,%o2,%o2     ! %o2 = lo(n1n0 >> 1)
+       srl     %o1,1,%o1       ! %o1 = hi(n1n0 >> 1)
+
+       and     %o3,1,%g2
+       srl     %o3,1,%g3       ! %g3 = floor(d / 2)
+       add     %g3,%g2,%g3     ! %g3 = ceil(d / 2)
+
+       b       LLp1
+       addxcc  %o2,%o2,%o2
+
+LLplop: bcc    LLn1
+       addxcc  %o2,%o2,%o2
+LLp1:  addx    %o1,%o1,%o1
+       subcc   %o1,%g3,%o4
+       bcc     LLn2
+       addxcc  %o2,%o2,%o2
+LLp2:  addx    %o1,%o1,%o1
+       subcc   %o1,%g3,%o4
+       bcc     LLn3
+       addxcc  %o2,%o2,%o2
+LLp3:  addx    %o1,%o1,%o1
+       subcc   %o1,%g3,%o4
+       bcc     LLn4
+       addxcc  %o2,%o2,%o2
+LLp4:  addx    %o1,%o1,%o1
+       addcc   %g1,-1,%g1
+       bne     LLplop
+       subcc   %o1,%g3,%o4
+       bcc     LLn5
+       addxcc  %o2,%o2,%o2
+LLp5:  add     %o1,%o1,%o1     ! << 1
+       tst     %g2
+       bne     Oddp
+       add     %o5,%o1,%o1
+       st      %o1,[%o0]
+       retl
+       xnor    %g0,%o2,%o0
+
+LLnlop: bcc    LLp1
+       addxcc  %o2,%o2,%o2
+LLn1:  addx    %o4,%o4,%o4
+       subcc   %o4,%g3,%o1
+       bcc     LLp2
+       addxcc  %o2,%o2,%o2
+LLn2:  addx    %o4,%o4,%o4
+       subcc   %o4,%g3,%o1
+       bcc     LLp3
+       addxcc  %o2,%o2,%o2
+LLn3:  addx    %o4,%o4,%o4
+       subcc   %o4,%g3,%o1
+       bcc     LLp4
+       addxcc  %o2,%o2,%o2
+LLn4:  addx    %o4,%o4,%o4
+       addcc   %g1,-1,%g1
+       bne     LLnlop
+       subcc   %o4,%g3,%o1
+       bcc     LLp5
+       addxcc  %o2,%o2,%o2
+LLn5:  add     %o4,%o4,%o4     ! << 1
+       tst     %g2
+       bne     Oddn
+       add     %o5,%o4,%o4
+       st      %o4,[%o0]
+       retl
+       xnor    %g0,%o2,%o0
+
+Oddp:  xnor    %g0,%o2,%o2
+       ! q' in %o2. r' in %o1
+       addcc   %o1,%o2,%o1
+       bcc     LLp6
+       addx    %o2,0,%o2
+       sub     %o1,%o3,%o1
+LLp6:  subcc   %o1,%o3,%g0
+       bcs     LLp7
+       subx    %o2,-1,%o2
+       sub     %o1,%o3,%o1
+LLp7:  st      %o1,[%o0]
+       retl
+       mov     %o2,%o0
+
+Oddn:  xnor    %g0,%o2,%o2
+       ! q' in %o2. r' in %o4
+       addcc   %o4,%o2,%o4
+       bcc     LLn6
+       addx    %o2,0,%o2
+       sub     %o4,%o3,%o4
+LLn6:  subcc   %o4,%o3,%g0
+       bcs     LLn7
+       subx    %o2,-1,%o2
+       sub     %o4,%o3,%o4
+LLn7:  st      %o4,[%o0]
+       retl
+       mov     %o2,%o0
diff --git a/mpi/sparc32v8/distfiles b/mpi/sparc32v8/distfiles
new file mode 100644 (file)
index 0000000..5789f35
--- /dev/null
@@ -0,0 +1,5 @@
+
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+
diff --git a/mpi/sparc32v8/mpih-mul1.S b/mpi/sparc32v8/mpih-mul1.S
new file mode 100644 (file)
index 0000000..52c911a
--- /dev/null
@@ -0,0 +1,112 @@
+/* SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and
+ *                         store the product in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+! INPUT PARAMETERS
+! res_ptr      o0
+! s1_ptr       o1
+! size         o2
+! s2_limb      o3
+
+#include "sysdep.h"
+
+.text
+       .align  8
+       .global C_SYMBOL_NAME(mpihelp_mul_1)
+C_SYMBOL_NAME(mpihelp_mul_1):
+       sll     %o2,4,%g1
+       and     %g1,(4-1)<<4,%g1
+#if PIC
+       mov     %o7,%g4                 ! Save return address register
+       call    1f
+       add     %o7,LL-1f,%g3
+1:     mov     %g4,%o7                 ! Restore return address register
+#else
+       sethi   %hi(LL),%g3
+       or      %g3,%lo(LL),%g3
+#endif
+       jmp     %g3+%g1
+       ld      [%o1+0],%o4     ! 1
+LL:
+LL00:  add     %o0,-4,%o0
+       add     %o1,-4,%o1
+       b       Loop00          /* 4, 8, 12, ... */
+       orcc    %g0,%g0,%g2
+LL01:  b       Loop01          /* 1, 5, 9, ... */
+       orcc    %g0,%g0,%g2
+       nop
+       nop
+LL10:  add     %o0,-12,%o0     /* 2, 6, 10, ... */
+       add     %o1,4,%o1
+       b       Loop10
+       orcc    %g0,%g0,%g2
+       nop
+LL11:  add     %o0,-8,%o0      /* 3, 7, 11, ... */
+       add     %o1,-8,%o1
+       b       Loop11
+       orcc    %g0,%g0,%g2
+
+Loop:  addcc   %g3,%g2,%g3     ! 1
+       ld      [%o1+4],%o4     ! 2
+       st      %g3,[%o0+0]     ! 1
+       rd      %y,%g2          ! 1
+Loop00: umul   %o4,%o3,%g3     ! 2
+       addxcc  %g3,%g2,%g3     ! 2
+       ld      [%o1+8],%o4     ! 3
+       st      %g3,[%o0+4]     ! 2
+       rd      %y,%g2          ! 2
+Loop11: umul   %o4,%o3,%g3     ! 3
+       addxcc  %g3,%g2,%g3     ! 3
+       ld      [%o1+12],%o4    ! 4
+       add     %o1,16,%o1
+       st      %g3,[%o0+8]     ! 3
+       rd      %y,%g2          ! 3
+Loop10: umul   %o4,%o3,%g3     ! 4
+       addxcc  %g3,%g2,%g3     ! 4
+       ld      [%o1+0],%o4     ! 1
+       st      %g3,[%o0+12]    ! 4
+       add     %o0,16,%o0
+       rd      %y,%g2          ! 4
+       addx    %g0,%g2,%g2
+Loop01: addcc  %o2,-4,%o2
+       bg      Loop
+       umul    %o4,%o3,%g3     ! 1
+
+       addcc   %g3,%g2,%g3     ! 4
+       st      %g3,[%o0+0]     ! 4
+       rd      %y,%g2          ! 4
+
+       retl
+       addx    %g0,%g2,%o0
+
+
diff --git a/mpi/sparc32v8/mpih-mul2.S b/mpi/sparc32v8/mpih-mul2.S
new file mode 100644 (file)
index 0000000..641b76a
--- /dev/null
@@ -0,0 +1,135 @@
+/* SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and
+ *                            add the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1993, 1994, 1995, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+! INPUT PARAMETERS
+! res_ptr      o0
+! s1_ptr       o1
+! size         o2
+! s2_limb      o3
+
+#include "sysdep.h"
+
+.text
+       .align 4
+       .global C_SYMBOL_NAME(mpihelp_addmul_1)
+C_SYMBOL_NAME(mpihelp_addmul_1):
+       orcc    %g0,%g0,%g2
+       ld      [%o1+0],%o4     ! 1
+
+       sll     %o2,4,%g1
+       and     %g1,(4-1)<<4,%g1
+#if PIC
+       mov     %o7,%g4                 ! Save return address register
+       call    1f
+       add     %o7,LL-1f,%g3
+1:     mov     %g4,%o7                 ! Restore return address register
+#else
+       sethi   %hi(LL),%g3
+       or      %g3,%lo(LL),%g3
+#endif
+       jmp     %g3+%g1
+       nop
+LL:
+LL00:  add     %o0,-4,%o0
+       b       Loop00          /* 4, 8, 12, ... */
+       add     %o1,-4,%o1
+       nop
+LL01:  b       Loop01          /* 1, 5, 9, ... */
+       nop
+       nop
+       nop
+LL10:  add     %o0,-12,%o0     /* 2, 6, 10, ... */
+       b       Loop10
+       add     %o1,4,%o1
+       nop
+LL11:  add     %o0,-8,%o0      /* 3, 7, 11, ... */
+       b       Loop11
+       add     %o1,-8,%o1
+       nop
+
+1:     addcc   %g3,%g2,%g3     ! 1
+       ld      [%o1+4],%o4     ! 2
+       rd      %y,%g2          ! 1
+       addx    %g0,%g2,%g2
+       ld      [%o0+0],%g1     ! 2
+       addcc   %g1,%g3,%g3
+       st      %g3,[%o0+0]     ! 1
+Loop00: umul   %o4,%o3,%g3     ! 2
+       ld      [%o0+4],%g1     ! 2
+       addxcc  %g3,%g2,%g3     ! 2
+       ld      [%o1+8],%o4     ! 3
+       rd      %y,%g2          ! 2
+       addx    %g0,%g2,%g2
+       nop
+       addcc   %g1,%g3,%g3
+       st      %g3,[%o0+4]     ! 2
+Loop11: umul   %o4,%o3,%g3     ! 3
+       addxcc  %g3,%g2,%g3     ! 3
+       ld      [%o1+12],%o4    ! 4
+       rd      %y,%g2          ! 3
+       add     %o1,16,%o1
+       addx    %g0,%g2,%g2
+       ld      [%o0+8],%g1     ! 2
+       addcc   %g1,%g3,%g3
+       st      %g3,[%o0+8]     ! 3
+Loop10: umul   %o4,%o3,%g3     ! 4
+       addxcc  %g3,%g2,%g3     ! 4
+       ld      [%o1+0],%o4     ! 1
+       rd      %y,%g2          ! 4
+       addx    %g0,%g2,%g2
+       ld      [%o0+12],%g1    ! 2
+       addcc   %g1,%g3,%g3
+       st      %g3,[%o0+12]    ! 4
+       add     %o0,16,%o0
+       addx    %g0,%g2,%g2
+Loop01: addcc  %o2,-4,%o2
+       bg      1b
+       umul    %o4,%o3,%g3     ! 1
+
+       addcc   %g3,%g2,%g3     ! 4
+       rd      %y,%g2          ! 4
+       addx    %g0,%g2,%g2
+       ld      [%o0+0],%g1     ! 2
+       addcc   %g1,%g3,%g3
+       st      %g3,[%o0+0]     ! 4
+       addx    %g0,%g2,%o0
+
+       retl
+        nop
+
+
+!      umul, ld, addxcc, rd, st
+
+!      umul, ld, addxcc, rd, ld, addcc, st, addx
+
diff --git a/mpi/sparc32v8/mpih-mul3.S b/mpi/sparc32v8/mpih-mul3.S
new file mode 100644 (file)
index 0000000..b11e05a
--- /dev/null
@@ -0,0 +1,70 @@
+/* SPARC v8 __mpn_submul_1 -- Multiply a limb vector with a limb and
+ *                            subtract the result from a second limb vector.
+ *
+ *      Copyright (C) 1992, 1993, 1994, 1998, 
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+        
+! INPUT PARAMETERS
+! res_ptr      o0
+! s1_ptr       o1
+! size         o2
+! s2_limb      o3
+
+#include "sysdep.h"
+
+.text
+       .align 4
+       .global C_SYMBOL_NAME(mpihelp_submul_1)
+C_SYMBOL_NAME(mpihelp_submul_1):
+       sub     %g0,%o2,%o2             ! negate ...
+       sll     %o2,2,%o2               ! ... and scale size
+       sub     %o1,%o2,%o1             ! o1 is offset s1_ptr
+       sub     %o0,%o2,%g1             ! g1 is offset res_ptr
+
+       mov     0,%o0                   ! clear cy_limb
+
+Loop:  ld      [%o1+%o2],%o4
+       ld      [%g1+%o2],%g2
+       umul    %o4,%o3,%o5
+       rd      %y,%g3
+       addcc   %o5,%o0,%o5
+       addx    %g3,0,%o0
+       subcc   %g2,%o5,%g2
+       addx    %o0,0,%o0
+       st      %g2,[%g1+%o2]
+
+       addcc   %o2,4,%o2
+       bne     Loop
+        nop
+
+       retl
+        nop
+
+
diff --git a/mpi/supersparc/distfiles b/mpi/supersparc/distfiles
new file mode 100644 (file)
index 0000000..5506c41
--- /dev/null
@@ -0,0 +1,3 @@
+
+udiv.S
+
diff --git a/mpi/supersparc/udiv.S b/mpi/supersparc/udiv.S
new file mode 100644 (file)
index 0000000..9a12348
--- /dev/null
@@ -0,0 +1,121 @@
+/* SuperSPARC __udiv_qrnnd division support, used from longlong.h.
+ *            This is for SuperSPARC only, to compensate for its
+ *            semi-functional udiv instruction.
+ *
+ *      Copyright (C) 1993, 1994, 1996, 1998,
+ *                    2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *      Actually it's the same code with only minor changes in the
+ *      way the data is stored; this is to support the abstraction
+ *      of an optional secure memory allocation which may be used
+ *      to avoid revealing of sensitive data due to paging etc.
+ *      The GNU MP Library itself is published under the LGPL;
+ *      however I decided to publish this code under the plain GPL.
+ */
+
+
+
+! INPUT PARAMETERS
+! rem_ptr      i0
+! n1           i1
+! n0           i2
+! d            i3
+
+#include "sysdep.h"
+#undef ret     /* Kludge for glibc */
+
+       .text
+       .align  8
+LC0:   .double 0r4294967296
+LC1:   .double 0r2147483648
+
+       .align  4
+       .global C_SYMBOL_NAME(__udiv_qrnnd)
+C_SYMBOL_NAME(__udiv_qrnnd):
+       !#PROLOGUE# 0
+       save    %sp,-104,%sp
+       !#PROLOGUE# 1
+       st      %i1,[%fp-8]
+       ld      [%fp-8],%f10
+       sethi   %hi(LC0),%o7
+       fitod   %f10,%f4
+       ldd     [%o7+%lo(LC0)],%f8
+       cmp     %i1,0
+       bge     L248
+       mov     %i0,%i5
+       faddd   %f4,%f8,%f4
+L248:
+       st      %i2,[%fp-8]
+       ld      [%fp-8],%f10
+       fmuld   %f4,%f8,%f6
+       cmp     %i2,0
+       bge     L249
+       fitod   %f10,%f2
+       faddd   %f2,%f8,%f2
+L249:
+       st      %i3,[%fp-8]
+       faddd   %f6,%f2,%f2
+       ld      [%fp-8],%f10
+       cmp     %i3,0
+       bge     L250
+       fitod   %f10,%f4
+       faddd   %f4,%f8,%f4
+L250:
+       fdivd   %f2,%f4,%f2
+       sethi   %hi(LC1),%o7
+       ldd     [%o7+%lo(LC1)],%f4
+       fcmped  %f2,%f4
+       nop
+       fbge,a  L251
+       fsubd   %f2,%f4,%f2
+       fdtoi   %f2,%f2
+       st      %f2,[%fp-8]
+       b       L252
+       ld      [%fp-8],%i4
+L251:
+       fdtoi   %f2,%f2
+       st      %f2,[%fp-8]
+       ld      [%fp-8],%i4
+       sethi   %hi(-2147483648),%g2
+       xor     %i4,%g2,%i4
+L252:
+       umul    %i3,%i4,%g3
+       rd      %y,%i0
+       subcc   %i2,%g3,%o7
+       subxcc  %i1,%i0,%g0
+       be      L253
+       cmp     %o7,%i3
+
+       add     %i4,-1,%i0
+       add     %o7,%i3,%o7
+       st      %o7,[%i5]
+       ret
+       restore
+L253:
+       blu     L246
+       mov     %i4,%i0
+       add     %i4,1,%i0
+       sub     %o7,%i3,%o7
+L246:
+       st      %o7,[%i5]
+       ret
+       restore
+
diff --git a/po/ChangeLog b/po/ChangeLog
new file mode 100644 (file)
index 0000000..f5c44f1
--- /dev/null
@@ -0,0 +1,627 @@
+2006-07-27  Werner Koch  <wk@g10code.com>
+
+       * nb.po: New.
+
+2006-07-03  Werner Koch  <wk@g10code.com>
+
+       * zh_TW.po: Updated, albeit a copy from last year.
+
+       * zh_CN.po: Updated.
+
+2006-06-27  Werner Koch  <wk@g10code.com>
+
+       * de.po: Fixed misleading translation.  Thanks to Olav Seyfarth.
+
+2005-10-06  Werner Koch  <wk@g10code.com>
+
+       * POTFILES.in: s/g10.c/gpg.c/.
+
+2005-07-26  Werner Koch  <wk@g10code.com>
+
+       * zh_TW.po, fr.po, cs.po: Updated.
+
+2005-07-19  Werner Koch  <wk@g10code.com>
+
+       * ru.po: Updated.
+
+2005-06-21  Werner Koch  <wk@g10code.com>
+
+       * zh_TW.po: Updated.
+
+       * ro.po: Updated.
+
+2005-06-15  Werner Koch  <wk@g10code.com>
+
+       * de.po: Some Typo fixes.
+
+2005-05-31  Werner Koch  <wk@g10code.com>
+
+       * zh_TW.po, zh_CN.po, es.po, ro.po: Updated.
+
+       * tr.po: Updated from TP.  Note: this is an exception in general
+       translations from the Robot are not anymore accepted.
+
+2005-03-30  Werner Koch  <wk@g10code.com>
+
+       * de.po: Fixed typo in "|AN|New Admin PIN"; the leading bar was
+       missing.
+
+2005-03-07  Werner Koch  <wk@g10code.com>
+
+       * de.po: Updated. Translation is still in the works, though.
+
+2005-02-15  Werner Koch  <wk@g10code.com>
+
+       * ca.po: Updated using a patch provided by Jordi Mallach.
+
+2005-02-03  Werner Koch  <wk@g10code.com>
+
+       * zh_TW.po, ro.po: Updated.
+
+2004-12-10  Werner Koch  <wk@g10code.com>
+
+       * sv.po: Take the update done for 1.2.6.
+
+       * zh_CN.po, fr.po, cs.po, ja.po: Updated.
+
+2004-10-27  Werner Koch  <wk@g10code.com>
+
+       * LINGUAS: Better don't have comments in this file.
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * POTFILES.in: Updated.
+
+       * sv.po: Updated.
+
+2004-10-12  Werner Koch  <wk@g10code.com>
+
+       * es.po: s/intgridad/integridad/. This is bug 275.
+
+2004-07-27  Werner Koch  <wk@g10code.de>
+
+       * LINGUAS: Added all languages we supported in 1.2.5.
+       Copied all po files from 1.2.5.
+
+2004-07-27  gettextize  <bug-gnu-gettext@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.14.1.
+       * Rules-quot: Upgrade to gettext-0.14.1.
+
+2003-11-27  Werner Koch  <wk@gnupg.org>
+
+       * de.po: Updated some fuzzys.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * Makevars: New.
+
+2003-10-25  gettextize  <bug-gnu-gettext@gnu.org>
+
+       * Makefile.in.in: New file, from gettext-0.12.1.
+       * Rules-quot: New file, from gettext-0.12.1.
+       * boldquot.sed: New file, from gettext-0.12.1.
+       * en@boldquot.header: New file, from gettext-0.12.1.
+       * en@quot.header: New file, from gettext-0.12.1.
+       * insert-header.sin: New file, from gettext-0.12.1.
+       * quot.sed: New file, from gettext-0.12.1.
+       * remove-potcdate.sin: New file, from gettext-0.12.1.
+
+2003-10-10  Werner Koch  <wk@gnupg.org>
+
+       * POTFILES.in (cipher/primegen.c): Added.
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * POTFILES.in: Added a couple of missing source files.  Noted by
+       Pascal Hartig and Walter Koch. (From wk on stable branch)
+
+2002-10-18  Werner Koch  <wk@gnupg.org>
+
+       * POTFILES.in (hkp.c): Removed.
+
+2002-09-12  Werner Koch  <wk@gnupg.org>
+
+       * tr.po, el.po: Updated.
+
+2002-08-23  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.40.
+
+2002-08-04  Werner Koch  <wk@gnupg.org>
+
+       * de.po: Fixed fuzzys and translated new strings.
+       * es.po, et.po, fr.po, gl.po, id.po, it.po, ja.po, tr.po: Updated
+       from TP site.
+       * ca.po: New from TP site.
+
+2002-04-30  Werner Koch  <wk@gnupg.org>
+
+       * ja.po: Updated, also a bit too late for the release.
+
+2002-04-29  Werner Koch  <wk@gnupg.org>
+
+       * pl.po: Update.
+       * el.po: Updated, removed one entry due to non-matching printf and
+       one removed one printf specifier.
+
+       Fixed fuzzy entries due to the change of (y/N) to (Y/n) in most files.
+       
+2002-04-25  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.40.
+
+2002-04-22  Werner Koch  <wk@gnupg.org>
+
+       * et.po, tr.po, cs.po, it.po, id.po: Updated.
+
+2002-04-19  Werner Koch  <wk@gnupg.org>
+
+       * de.po: Fixed fuzzies and added a few translations.
+
+2002-04-18  Werner Koch  <wk@gnupg.org>
+
+       * eo.po: Updated.
+
+2002-04-10  Werner Koch  <wk@gnupg.org>
+
+       * pl.po: Updated.
+
+2002-04-09  Werner Koch  <wk@gnupg.org>
+
+       * pt_BR.po: Updated the info entry 
+
+       * es.po: Fixed a c-format problem; for unknown reasons msgfmt -c
+       can't cope with swapped arguments.
+
+       * de.po: Fuzzy fixes and a few new translations.
+
+       * id.po: Fixed a format string mismatch.
+
+       * eo.po, it.po, ja.po, sv.po: Updated with a somewhat newer
+       version from the TP.
+
+       * es_ES.po: Removed
+       * es.po: and replaced with this updated version from the TP.
+
+       * cs.po: New.  Fixed for format string mismatches.
+
+       * el.po, gl.po: New from TP.
+       
+2002-04-06  Werner Koch  <wk@gnupg.org>
+
+       * fr.po: Updated.
+
+2002-04-02  Werner Koch  <wk@gnupg.org>
+
+       * de.po, de.glo: Updated.
+
+2002-03-08  Werner Koch  <wk@gnupg.org>
+
+       * et.po: Updated.
+
+2002-03-06  Werner Koch  <wk@gnupg.org>
+
+       * pt_PT.po: Removed.
+       * pt.po: and replaced by this updated one.  My machine voted 30 to
+       2 for just pt.  So we go with the crowd.  Thanks for Pedro Morais
+       for suggesting this.
+
+2002-03-05  Werner Koch  <wk@gnupg.org>
+
+       * tr.po, id.po: Updated.
+
+2002-03-03  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.40.
+
+2002-03-03  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.40.
+
+2001-10-23  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.40.
+
+2001-09-07  Werner Koch  <wk@gnupg.org>
+
+       * POTFILES.in: Added new files.
+
+2001-07-26  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.38.
+
+2001-07-05  Werner Koch  <wk@gnupg.org>
+
+       * id.po: Updated
+
+2001-05-28  Werner Koch  <wk@gnupg.org>
+
+       * ru.po: Removed - too many format string bugs. 
+
+2001-05-27  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.38.
+       * cat-id-tbl.c: Remove file.
+       * stamp-cat-id: Remove file.
+
+2001-05-27  Werner Koch  <wk@gnupg.org>
+
+       * tr.po: New copy from the TP Robot. 
+       * da.po, de.po, eo.po, es_ES.po, et.po, id.po, ja.po, nl.po,
+        pt_BR.po, sv.po: Fixes to format string errors by Kurt Garloff.
+       It is not cleare whether they are all correct but at least they
+       won't give segv and minimize the risk of format string exploits.
+       * ru.po: Fixed the header entry.
+
+       Fixed some fuzzy entries in all files.
+       
+2001-05-06  Werner Koch  <wk@gnupg.org>
+
+       * id.po: Updated
+
+2001-04-27  Werner Koch  <wk@gnupg.org>
+
+       * de.po: Removed an extra "%s".
+
+2001-04-25  Werner Koch  <wk@gnupg.org>
+
+       * fr.po: Updated.
+
+2001-04-23  Werner Koch  <wk@gnupg.org>
+
+       * eo.po: Updated.
+
+       * it.po: Updated.
+
+2001-04-22  Werner Koch  <wk@gnupg.org>
+
+       * pl.po: Updated.
+
+2001-04-17  Werner Koch  <wk@gnupg.org>
+
+       * et.po: New.
+
+       * de.po: Updated.
+
+2001-04-16  Werner Koch  <wk@gnupg.org>
+
+       * pt_PT.po: Updated.
+
+2001-04-06  Werner Koch  <wk@gnupg.org>
+
+       * tr.po: New. 
+
+2001-03-18  Werner Koch  <wk@gnupg.org>
+
+       * de.po, de.glo: Updated. 
+
+2001-02-22  Werner Koch  <wk@gnupg.org>
+
+       * de.po, de.glo: Updated.
+
+2001-01-23  Werner Koch  <wk@gnupg.org>
+
+       * de.po: Removed superfluous \r.
+
+2001-01-14  Werner Koch  <wk@gnupg.org>
+
+       * de.po, de.glo: Updated.
+
+2000-12-19  Werner Koch  <wk@gnupg.org>
+
+       * pl.po: Updated.
+
+       * ja.po: Justified one message.
+
+2000-10-23  Werner Koch  <wk@gnupg.org>
+
+       * ja.po: Updated.
+
+2000-10-19  Werner Koch  <wk@gnupg.org>
+
+       Fixed a typo in all files.
+
+2000-10-16  Werner Koch  <wk@gnupg.org>
+
+       * de.po, de.glo: Updated.
+
+Thu Sep 14 17:45:11 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * eo.po: Updated.
+
+Wed Jul 12 13:32:06 CEST 2000  Werner Koch  <wk@>
+
+  * da.po: New from the TP server
+  * eo.po: Updated from the TP server
+  * pl.po: Ditto.
+  * sv.po: Ditto.
+
+  Small English spelling correction in all files.
+
+Wed Jul  5 13:28:45 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * fr.po: Minor changes by Gael
+
+Wed Jun 14 12:27:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * de.po, de.glo: Updated.
+
+2000-06-07 18:26:58  Werner Koch  (wk@habibti.openit.de)
+
+  * fr.po: New version from Gaël
+
+2000-05-02 10:44:42  Werner Koch  (wk@habibti.openit.de)
+
+       * fr.po: New version from the TP Robot.
+
+2000-05-01 14:19:52  Werner Koch  (wk@habibti.openit.de)
+
+       * de.po: Updated.
+       * de.glo: Ditto.
+
+2000-03-15 15:37:08  Werner Koch  (wk@habibti.openit.de)
+
+       * de.po: Updated.
+
+Wed Feb 23 10:07:57 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * nl.po: New. By Ivo Timmermans.
+
+Wed Feb 16 16:25:09 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * eo.po : New. By Edmund.
+
+Wed Feb 16 14:09:00 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * ja.po: New. By Yosiaki
+
+       * sv.po: New. By Daniel.
+
+Fri Feb 11 17:44:40 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * id.po: Updated.
+
+Thu Jan  6 16:56:18 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * Makefile.in.in: Is not longer maintained as a symlink because we
+       have a patch to work around a bug in non-gnu Make.
+       Fixed by Dave Dykstra.
+
+Thu Dec 16 10:07:58 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * pt_PT.po: Updated.
+       * de.po: Updated.
+       * it.po: Updated.
+
+Thu Dec  9 10:31:05 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * de.po: Updated.
+       * pt_BR.po: Updated.
+
+Fri Nov 12 20:33:19 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * es_ES.po: Fixed 3 \n mismatches.
+
+       * de.po: Updated.
+
+Thu Oct 28 16:08:20 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * es_ES.po: Updated.
+
+       * pt_BR.po: Updated.
+
+Fri Oct  8 20:32:01 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * fr.po: Updated for 1.0.0d.
+
+Mon Oct  4 21:23:04 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * pl.po: New version by Alex.
+
+Thu Sep 23 06:26:28 1999  Werner Koch  (wk@gnupg.org)
+
+       * fr.po: Updated by Gaël.
+
+Sat Sep 18 11:49:51 1999  Werner Koch  (wk@gnupg.org)
+
+       * id.po: New. Done by Tedi Heriyanto.
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pt_PT.po: New. Done by Pedro Morais.
+
+       * it.po: Updated by Marco.
+
+Tue Sep  7 16:23:36 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pl.po: Updated.
+
+Mon Sep  6 19:59:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * fr.po: Imported and fixed a msgid.
+       * de.po: Ditto.
+       * pt_BR.po: Ditto.
+
+       * POTFILES.in (delkey.c): New.
+
+       * fr.po: Gaël was the first to update it again.
+
+Wed Sep  1 15:30:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po: Updated.
+
+Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * it.po: Updated (Marco).
+       * de.po: Updated (Walter).
+       * pt_BR-po: Update (Thiago).
+       * fr.po: Updated (Gaël).
+
+Wed Aug  4 10:34:18 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po: Updated (Walter).
+
+Mon Jul 26 09:34:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * it.po: Updated (Marco).
+
+Tue Jul 13 17:39:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po: Updated (Walter)
+
+Tue Jun 29 21:44:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * it.po: Updated (Marco).
+
+Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pt_BR.po: Updated (Thiago).
+
+Thu Jun 10 14:18:23 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * it.po: Updated (Marco).
+
+       * es_ES.po: Updated (Urko).
+
+Wed Jun  2 14:17:19 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * es_ES.po: Some patches (Urko Lusa).
+
+Mon May 31 19:41:10 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po: New version (Walter).
+
+       * pl.po: New version (Alex).
+
+Tue May 25 19:50:32 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * fr.po: Imported new version.
+
+Mon May 17 21:54:43 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po, de.glo:  New version from Walter.
+
+Wed Apr  7 20:51:39 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * fr.po: Imported new version.
+
+Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po: Imported update for 0.9.3
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pl.po: New version.
+
+Wed Jan 20 21:40:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * es_ES.po: Import of new version.
+
+Wed Jan 13 12:49:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po de.glo: New version imported.
+
+Tue Jan 12 11:17:18 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * fr.po: Imported new version
+
+Tue Dec 29 14:41:47 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pl.po: Janusz A. Urbanowicz contributed this one
+
+Thu Dec 17 18:31:15 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * fr.po: Imported new version
+
+Mon Dec 14 21:18:49 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * de.po: Imported new version.
+
+Thu Dec 10 20:15:36 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * *.po: Changed some english strings.
+
+Tue Dec  8 15:09:29 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * pt_BR.po: Add translation by Thiago Jung Bauermann.
+Fri Nov 27 12:39:29 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * en.po: Removed
+
+Fri Nov 20 11:46:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * de.po: Imported new version
+       * de.glo: Glossary used for de.po.
+
+Sat Nov 14 10:16:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * es_ES.po: New translation by Urko Lusa.
+
+Tue Nov 10 10:48:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * it.po: Imported new version.
+
+Fri Oct 30 20:03:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * fr.po: Imported new version
+
+Mon Oct 12 09:08:09 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * it.po: Imported new version.
+       * de.po: Imported new version.
+
+Sun Oct 11 16:24:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * fr.po: Imported new version
+
+Wed Oct  7 13:12:00 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * Makefile.in.in: Fixed mkinstalldirs problems
+
+Mon Sep 21 15:03:44 1998  Werner Koch  (wk@(none))
+
+       * it.po: New version from Marco d'Itri
+
+Mon Sep 21 09:28:54 1998  Werner Koch  (wk@(none))
+
+       * fr.po: New version from Gaël Quéri
+
+Tue Aug 11 12:28:11 1998  Werner Koch  (wk@(none))
+
+       * it.po: New file from Marco.
+
+Thu Jul  9 21:14:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * de.po: Fixed typos and added new translations.
+
+Fri Jun 26 11:44:24 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * it.po: New file from Marco.
+
+Thu May 28 10:44:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * it.po: Add small corrections from Marco
+
+Thu Apr  9 10:03:14 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * it.po: New version from Marco
+
+Fri Mar 13 09:43:19 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * it.po: New
+
+
+
+ Copyright 1998, 1999, 2000, 2001, 2004,
+          2005 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
+
diff --git a/po/LINGUAS b/po/LINGUAS
new file mode 100644 (file)
index 0000000..bd8b5b7
--- /dev/null
@@ -0,0 +1,16 @@
+en@quot en@boldquot
+be
+ca cs
+da de
+eo el es et
+fi fr
+gl
+hu 
+id it
+ja
+nb
+pl pt_BR pt
+ro ru 
+sk sv
+tr
+zh_TW zh_CN
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644 (file)
index 0000000..53efc5e
--- /dev/null
@@ -0,0 +1,366 @@
+# Makefile for PO directory in any package using GNU gettext.
+# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
+#
+# This file can be copied and used freely without restrictions.  It can
+# be used in projects which are not available under the GNU General Public
+# License but which still want to provide support for the GNU gettext
+# functionality.
+# Please note that the actual code of GNU gettext is covered by the GNU
+# General Public License and is *not* in the public domain.
+#
+# Origin: gettext-0.14
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = @datadir@
+localedir = $(datadir)/locale
+gettextsrcdir = $(datadir)/gettext/po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+mkinstalldirs = $(SHELL) $(MKINSTALLDIRS)
+
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = msgmerge
+MSGMERGE_UPDATE = @MSGMERGE@ --update
+MSGINIT = msginit
+MSGCONV = msgconv
+MSGFILTER = msgfilter
+
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+UPDATEPOFILES = @UPDATEPOFILES@
+DUMMYPOFILES = @DUMMYPOFILES@
+DISTFILES.common = Makefile.in.in remove-potcdate.sin \
+$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3)
+DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \
+$(POFILES) $(GMOFILES) \
+$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+
+# Makevars gets inserted here. (Don't remove this line!)
+
+.SUFFIXES:
+.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update
+
+.po.mo:
+       @echo "$(MSGFMT) -c -o $@ $<"; \
+       $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
+
+.po.gmo:
+       @lang=`echo $* | sed -e 's,.*/,,'`; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \
+       cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo
+
+.sin.sed:
+       sed -e '/^#/d' $< > t-$@
+       mv t-$@ $@
+
+
+all: all-@USE_NLS@
+
+all-yes: stamp-po
+all-no:
+
+# stamp-po is a timestamp denoting the last time at which the CATALOGS have
+# been loosely updated. Its purpose is that when a developer or translator
+# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS,
+# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent
+# invocations of "make" will do nothing. This timestamp would not be necessary
+# if updating the $(CATALOGS) would always touch them; however, the rule for
+# $(POFILES) has been designed to not touch files that don't need to be
+# changed.
+stamp-po: $(srcdir)/$(DOMAIN).pot
+       test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES)
+       @echo "touch stamp-po"
+       @echo timestamp > stamp-poT
+       @mv stamp-poT stamp-po
+
+# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update',
+# otherwise packages like GCC can not be built if only parts of the source
+# have been downloaded.
+
+# This target rebuilds $(DOMAIN).pot; it is an expensive operation.
+# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
+$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
+       $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
+         --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
+         --files-from=$(srcdir)/POTFILES.in \
+         --copyright-holder='$(COPYRIGHT_HOLDER)' \
+         --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)'
+       test ! -f $(DOMAIN).po || { \
+         if test -f $(srcdir)/$(DOMAIN).pot; then \
+           sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \
+           sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \
+           if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \
+             rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \
+           else \
+             rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \
+             mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+           fi; \
+         else \
+           mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \
+         fi; \
+       }
+
+# This rule has no dependencies: we don't need to update $(DOMAIN).pot at
+# every "make" invocation, only create it when it is missing.
+# Only "make $(DOMAIN).pot-update" or "make dist" will force an update.
+$(srcdir)/$(DOMAIN).pot:
+       $(MAKE) $(DOMAIN).pot-update
+
+# This target rebuilds a PO file if $(DOMAIN).pot has changed.
+# Note that a PO file is not touched if it doesn't need to be changed.
+$(POFILES): $(srcdir)/$(DOMAIN).pot
+       @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \
+       if test -f "$(srcdir)/$${lang}.po"; then \
+         test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+         echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \
+         cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \
+       else \
+         $(MAKE) $${lang}.po-create; \
+       fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+         for file in $(DISTFILES.common) Makevars.template; do \
+           $(INSTALL_DATA) $(srcdir)/$$file \
+                           $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+         for file in Makevars; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+install-data-no: all
+install-data-yes: all
+       $(mkinstalldirs) $(DESTDIR)$(datadir)
+       @catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         dir=$(localedir)/$$lang/LC_MESSAGES; \
+         $(mkinstalldirs) $(DESTDIR)$$dir; \
+         if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \
+         $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \
+         echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \
+         for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+           if test -n "$$lc"; then \
+             if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+             else \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
+             fi; \
+             rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+             ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+             ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \
+             cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+             echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \
+           fi; \
+         done; \
+       done
+
+install-strip: install
+
+installdirs: installdirs-exec installdirs-data
+installdirs-exec:
+installdirs-data: installdirs-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \
+       else \
+         : ; \
+       fi
+installdirs-data-no:
+installdirs-data-yes:
+       $(mkinstalldirs) $(DESTDIR)$(datadir)
+       @catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         dir=$(localedir)/$$lang/LC_MESSAGES; \
+         $(mkinstalldirs) $(DESTDIR)$$dir; \
+         for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \
+           if test -n "$$lc"; then \
+             if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \
+               link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \
+               mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+               mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \
+                for file in *; do \
+                  if test -f $$file; then \
+                    ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \
+                  fi; \
+                done); \
+               rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \
+             else \
+               if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \
+                 :; \
+               else \
+                 rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \
+                 mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \
+               fi; \
+             fi; \
+           fi; \
+         done; \
+       done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall: uninstall-exec uninstall-data
+uninstall-exec:
+uninstall-data: uninstall-data-@USE_NLS@
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         for file in $(DISTFILES.common) Makevars.template; do \
+           rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \
+         done; \
+       else \
+         : ; \
+       fi
+uninstall-data-no:
+uninstall-data-yes:
+       catalogs='$(CATALOGS)'; \
+       for cat in $$catalogs; do \
+         cat=`basename $$cat`; \
+         lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \
+         for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \
+           rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \
+         done; \
+       done
+
+check: all
+
+info dvi ps pdf html tags TAGS ctags CTAGS ID:
+
+mostlyclean:
+       rm -f remove-potcdate.sed
+       rm -f stamp-poT
+       rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po
+       rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+       rm -f Makefile Makefile.in POTFILES *.mo
+
+maintainer-clean: distclean
+       @echo "This command is intended for maintainers to use;"
+       @echo "it deletes files that may require special tools to rebuild."
+       rm -f stamp-po $(GMOFILES)
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir:
+       $(MAKE) update-po
+       @$(MAKE) dist2
+# This is a separate target because 'update-po' must be executed before.
+dist2: $(DISTFILES)
+       dists="$(DISTFILES)"; \
+       if test "$(PACKAGE)" = "gettext-tools"; then \
+         dists="$$dists Makevars.template"; \
+       fi; \
+       if test -f $(srcdir)/ChangeLog; then \
+         dists="$$dists ChangeLog"; \
+       fi; \
+       for i in 0 1 2 3 4 5 6 7 8 9; do \
+         if test -f $(srcdir)/ChangeLog.$$i; then \
+           dists="$$dists ChangeLog.$$i"; \
+         fi; \
+       done; \
+       if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \
+       for file in $$dists; do \
+         if test -f $$file; then \
+           cp -p $$file $(distdir); \
+         else \
+           cp -p $(srcdir)/$$file $(distdir); \
+         fi; \
+       done
+
+update-po: Makefile
+       $(MAKE) $(DOMAIN).pot-update
+       test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES)
+       $(MAKE) update-gmo
+
+# General rule for creating PO files.
+
+.nop.po-create:
+       @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \
+       echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \
+       exit 1
+
+# General rule for updating PO files.
+
+.nop.po-update:
+       @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \
+       if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \
+       echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \
+       cd $(srcdir); \
+       if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "msgmerge for $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+$(DUMMYPOFILES):
+
+update-gmo: Makefile $(GMOFILES)
+       @:
+
+Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+              $(SHELL) ./config.status
+
+force:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/Makevars b/po/Makevars
new file mode 100644 (file)
index 0000000..814803f
--- /dev/null
@@ -0,0 +1,42 @@
+# Makefile variables for PO directory in any package using GNU gettext.
+
+# Usually the message domain is the same as the package name.
+DOMAIN = $(PACKAGE)
+
+# These two variables depend on the location of this directory.
+subdir = po
+top_builddir = ..
+
+# These options get passed to xgettext.
+XGETTEXT_OPTIONS = --keyword=_ --keyword=N_
+
+# This is the copyright holder that gets inserted into the header of the
+# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
+# package.  (Note that the msgstr strings, extracted from the package's
+# sources, belong to the copyright holder of the package.)  Translators are
+# expected to transfer the copyright for their translations to this person
+# or entity, or to disclaim their copyright.  The empty string stands for
+# the public domain; in this case the translators are expected to disclaim
+# their copyright.
+COPYRIGHT_HOLDER = Free Software Foundation, Inc.
+
+# This is the email address or URL to which the translators shall report
+# bugs in the untranslated strings:
+# - Strings which are not entire sentences, see the maintainer guidelines
+#   in the GNU gettext documentation, section 'Preparing Strings'.
+# - Strings which use unclear terms or require additional context to be
+#   understood.
+# - Strings which make invalid assumptions about notation of date, time or
+#   money.
+# - Pluralisation problems.
+# - Incorrect English spelling.
+# - Incorrect formatting.
+# It can be your email address, or a mailing list address where translators
+# can write to without being subscribed, or the URL of a web page through
+# which the translators can contact you.
+MSGID_BUGS_ADDRESS = gnupg-i18n@gnupg.org
+
+# This is the list of locale categories, beyond LC_MESSAGES, for which the
+# message catalogs shall be used.  It is usually empty.
+EXTRA_LOCALE_CATEGORIES =
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644 (file)
index 0000000..a190ab7
--- /dev/null
@@ -0,0 +1,60 @@
+# List of source files containing translatable strings for GnuPG
+# Copyright (c) 1998, 2003, 2004 Free Software Foundation, Inc.
+
+cipher/cast5.c
+cipher/md.c
+cipher/primegen.c
+cipher/random.c
+cipher/rndegd.c
+cipher/rndlinux.c
+
+g10/app-openpgp.c
+g10/armor.c
+g10/card-util.c
+g10/cardglue.c
+g10/dearmor.c
+g10/decrypt.c
+g10/delkey.c
+g10/encode.c
+g10/encr-data.c
+g10/exec.c
+g10/export.c
+g10/gpg.c
+g10/getkey.c
+g10/gpgv.c
+g10/helptext.c
+g10/import.c
+g10/keydb.c
+g10/keyedit.c
+g10/keygen.c
+g10/keyid.c
+g10/keylist.c
+g10/keyring.c
+g10/keyserver.c
+g10/mainproc.c
+g10/misc.c
+g10/openfile.c
+g10/parse-packet.c
+g10/passphrase.c
+g10/photoid.c
+g10/pkclist.c
+g10/plaintext.c
+g10/pubkey-enc.c
+g10/revoke.c
+g10/seckey-cert.c
+g10/seskey.c
+g10/sig-check.c
+g10/sign.c
+g10/skclist.c
+g10/tdbdump.c
+g10/tdbio.c
+g10/textfilter.c
+g10/trustdb.c
+g10/verify.c
+
+util/argparse.c
+util/errors.c
+util/logger.c
+util/miscutil.c
+util/secmem.c
+
diff --git a/po/Rules-quot b/po/Rules-quot
new file mode 100644 (file)
index 0000000..9c2a995
--- /dev/null
@@ -0,0 +1,47 @@
+# Special Makefile rules for English message catalogs with quotation marks.
+
+DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot
+
+.SUFFIXES: .insert-header .po-update-en
+
+en@quot.po-create:
+       $(MAKE) en@quot.po-update
+en@boldquot.po-create:
+       $(MAKE) en@boldquot.po-update
+
+en@quot.po-update: en@quot.po-update-en
+en@boldquot.po-update: en@boldquot.po-update-en
+
+.insert-header.po-update-en:
+       @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \
+       if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \
+       tmpdir=`pwd`; \
+       echo "$$lang:"; \
+       ll=`echo $$lang | sed -e 's/@.*//'`; \
+       LC_ALL=C; export LC_ALL; \
+       cd $(srcdir); \
+       if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \
+         if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
+           rm -f $$tmpdir/$$lang.new.po; \
+         else \
+           if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
+             :; \
+           else \
+             echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
+             exit 1; \
+           fi; \
+         fi; \
+       else \
+         echo "creation of $$lang.po failed!" 1>&2; \
+         rm -f $$tmpdir/$$lang.new.po; \
+       fi
+
+en@quot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header
+
+en@boldquot.insert-header: insert-header.sin
+       sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header
+
+mostlyclean: mostlyclean-quot
+mostlyclean-quot:
+       rm -f *.insert-header
diff --git a/po/be.gmo b/po/be.gmo
new file mode 100644 (file)
index 0000000..5338879
Binary files /dev/null and b/po/be.gmo differ
diff --git a/po/be.po b/po/be.po
new file mode 100644 (file)
index 0000000..6fd96c0
--- /dev/null
+++ b/po/be.po
@@ -0,0 +1,6117 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Ales Nyakhaychyk <nab@mail.by>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2003-10-30 16:35+0200\n"
+"Last-Translator: Ales Nyakhaychyk <nab@mail.by>\n"
+"Language-Team: Belarusian <i18n@mova.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr ""
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr ""
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr ""
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "немагчыма адкрыць \"%s\"\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "запіс у stdout\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr ""
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr ""
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr ""
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr ""
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "%s: немагчыма стварыць хэш-табліцу: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "выдаліць ключы са зьвязку сакрэтных ключоў"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "стварыць новую пару ключоў"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "%s: немагчыма стварыць хэш-табліцу: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "стварыць новую пару ключоў"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr ""
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr ""
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr ""
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr ""
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr ""
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr ""
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "нечаканыя даньні"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr ""
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr ""
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr ""
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr ""
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr ""
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "памылка CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr ""
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr ""
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr ""
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr ""
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr ""
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr ""
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr ""
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr ""
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr ""
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "непадтрымліваецца"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr ""
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr ""
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "за шмат пераваг для \"%c\"\n"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "недапушчальныя дапомныя перавагі\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "недапушчальныя дапомныя перавагі\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr ""
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr ""
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Калі ласка, абярыце від ключа, які Вам патрэбны:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr ""
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr ""
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Калі ласка, абярыце від ключа, які Вам патрэбны:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "невядомы альгарытм сьцісканьня"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr ""
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr ""
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "несумяшчальныя загады\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "паказаць гэтую даведку"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Даведка адсутнічае"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr ""
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "за шмат пераваг для \"%c\"\n"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "стварыць новую пару ключоў"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Загад> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "несумяшчальныя загады\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "несумяшчальныя загады\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Нерэчаісны загад (паспрабуйце \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Паўтарыце пароль: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr ""
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "немагчыма адкрыць \"%s\"\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr ""
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr ""
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr ""
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr ""
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "выдаліць ключы са зьвязку грамадскіх ключоў"
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr ""
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr ""
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr ""
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr ""
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr ""
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr ""
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr ""
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr ""
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr ""
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr ""
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr ""
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr ""
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr ""
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr ""
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, fuzzy, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr ""
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr ""
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr ""
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr ""
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr ""
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr ""
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr ""
+"Увядзіце новы пароль для гэтага сакрэтнага ключа.\n"
+"\n"
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr ""
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "Ключ абаронены.\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr ""
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "Ключ абаронены.\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "%s: немагчыма стварыць хэш-табліцу: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr ""
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Загады:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[файл]|зрабіць подпіс"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[файл]|зрабіць чысты тэкставы подпіс"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "зрабіць адчэплены подпіс"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "зашыфраваць даньні"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "шыфраваньне толькі сымэтрычнымі шыфрамі"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "разшыфраваць даньні (дапомна)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "праверыць подпіс"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "паказаць сьпіс ключоў"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "праверыць подпісы ключа"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "паказаць сакрэтныя ключы"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "стварыць новую пару ключоў"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "выдаліць ключы са зьвязку грамадскіх ключоў"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "выдаліць ключы са зьвязку сакрэтных ключоў"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "падпісаць ключ"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "падпісаць ключ толькі мясцова"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "падпісаць ці рэдагаваць ключ"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr ""
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "экспарт ключоў"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "экспартаваць ключы на паслужнік ключоў"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "імпартаваць ключы з паслужніка ключоў"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr ""
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "абнавіць усе ключы з паслужніка ключоў"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "імпартаваць/аб'яднаць ключы"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr ""
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr ""
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Выбары:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr ""
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|ІМЯ|   зашыфраваць для вылучанай асобы"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr ""
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "выкарыстоўваць у якасьці файла вываду"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "шматслоўнасьць"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "не рабіць ніякіх зьменаў"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "пытацца перад перазапісам"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Глядзіце man старонку, для больш поўнага апісаньня ўсіх загадаў і выбараў)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Прыклады:\n"
+"\n"
+" -se -r Bob [файл]          падпісаць і зашыфраваць для карыстальніка Bob\n"
+" --clearsign [файл]         стварыць чысты тэкставы подпіс\n"
+" --detach-sign [файл]       стварыць адчэплены подпіс\n"
+" --list-keys [назвы]        паказаць ключы\n"
+" --fingerprint [назвы]      паказаць адбіткі пальцаў\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Калі ласка, паведамляйце пра памылкі на <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Выкарыстаньне: gpg [выбары] [файлы] (-h для даведкі)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Сынтаксіс: gpg [выбары] [файлы]\n"
+"sign, check, encrypt ці decrypt\n"
+"Дапомнае дзеяньне залежыць ад уваходных даньняў\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Альгарытмы, якія падтрымліваюцца:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr ""
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr ""
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr ""
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr ""
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "Выкарыстаньне: gpg [выбары] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "несумяшчальныя загады\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "невядомая вэрсыя"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr ""
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr ""
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr ""
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr ""
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s - гэта недапушчальнае мноства знакаў\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s - гэта недапушчальнае мноства знакаў\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr ""
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: недапушчальныя выбары імпартаваньня\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "недапушчальныя выбары імпартаваньня\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: недапушчальныя выбары імпартаваньня\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "недапушчальныя выбары імпартаваньня\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s - гэта недапушчальнае мноства знакаў\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s - гэта недапушчальнае мноства знакаў\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr ""
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr ""
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s не дазваляецца разам з %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s ня мае сэнсу разам з %s!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr ""
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "запіс у stdout\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr ""
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr ""
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr ""
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr ""
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr ""
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr ""
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr ""
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "недапушчальныя дапомныя перавагі\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3091
+#, fuzzy, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s ня мае сэнсу разам з %s!\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [назва_файла]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [назва_файла]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [назва_файла]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [назва_файла]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [назва_файла]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [назва_файла]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [назва_файла]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [назва_файла]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [назва_файла]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [назва_файла]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [загады]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr ""
+
+#: g10/gpg.c:3560
+#, fuzzy, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/gpg.c:3562
+#, fuzzy, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/gpg.c:3564
+#, fuzzy, c-format
+msgid "key export failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/gpg.c:3575
+#, fuzzy, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[назва_файла]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr ""
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr ""
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr ""
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr ""
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr ""
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "працаваць менш шматслоўна"
+
+#: g10/gpgv.c:75
+#, fuzzy
+msgid "take the keys from this keyring"
+msgstr "выдаліць ключы са зьвязку грамадскіх ключоў"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr ""
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr ""
+
+#: g10/gpgv.c:102
+#, fuzzy
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Выкарыстаньне: gpg [выбары] [файлы] (-h для даведкі)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr ""
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr ""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr ""
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr ""
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr ""
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr ""
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr ""
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Адкажыце \"так\", калі Вы згодны з перазапісам файла"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Даведка адсутнічае"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Для \"%s\" даведка адсутнічае"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+msgid "do not update the trustdb after import"
+msgstr ""
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr ""
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+msgid "remove unusable parts from key after import"
+msgstr ""
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr ""
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr ""
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr ""
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr ""
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr ""
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr ""
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr ""
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr ""
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr ""
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr ""
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr ""
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr ""
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr ""
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr ""
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr ""
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr ""
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+msgid "         algorithms on these user IDs:\n"
+msgstr ""
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr ""
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr ""
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr ""
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr ""
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr ""
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr ""
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr ""
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr ""
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr ""
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr ""
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr ""
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr ""
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr ""
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr ""
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr ""
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr ""
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "выдаліць ключы са зьвязку сакрэтных ключоў"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr ""
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr ""
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr ""
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr ""
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr ""
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr ""
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr ""
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr ""
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "%s:%d: недапушчальныя выбары экспартаваньня\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr ""
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr ""
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "Ключ абаронены.\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr ""
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr ""
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr ""
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr ""
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr ""
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr ""
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "%s: тэчка створана\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr ""
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr ""
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr ""
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr ""
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr ""
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr ""
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr ""
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr ""
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr ""
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr ""
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr ""
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr ""
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr ""
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr ""
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr ""
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr ""
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr ""
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr ""
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr ""
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr ""
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr ""
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr ""
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Перазапісаць (y/N)?"
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Гэты ключ згубіў састарэў!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr ""
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr ""
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr ""
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr ""
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr ""
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr ""
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr ""
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "сакрэтны ключ недаступны"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Ключ абаронены.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Увядзіце новы пароль для гэтага сакрэтнага ключа.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr ""
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr ""
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr ""
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr ""
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr ""
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "праверыць подпісы ключа"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "падпісаць ключ толькі мясцова"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr ""
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr ""
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr ""
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "дрэнны ключ"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "паказаць сакрэтныя ключы"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr ""
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr ""
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr ""
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr ""
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr ""
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1428
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr ""
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr ""
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "падпісаць ключ"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "паказаць сьпіс ключоў"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr ""
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Даступны сакрэтны ключ.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr ""
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr ""
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr ""
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1762
+#, fuzzy
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "падпісаць ключ толькі мясцова"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "невядомая вэрсыя"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr ""
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr ""
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr ""
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr ""
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Захаваць зьмены? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Выйсьці не захаваўшы зьмены? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr ""
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr ""
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr ""
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"Выбары:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr ""
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr ""
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "памылка чытаньня файла"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "памылка чытаньня файла"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr "памылка чытаньня файла"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr ""
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr ""
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr ""
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr ""
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr ""
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr ""
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr ""
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr ""
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr ""
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr ""
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Калі ласка, абярыце від ключа, які Вам патрэбны:\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr ""
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr ""
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr ""
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "выдаліць ключы са зьвязку сакрэтных ключоў"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr ""
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr ""
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Перазапісаць (y/N)?"
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr ""
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr ""
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr ""
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "памылка чытаньня файла"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr ""
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr ""
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr ""
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr ""
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr ""
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr ""
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr ""
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr ""
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr ""
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "выдаліць ключы са зьвязку сакрэтных ключоў"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "выдаліць ключы са зьвязку сакрэтных ключоў"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr ""
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "за шмат пераваг для \"%c\"\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "за шмат пераваг для \"%c\"\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "за шмат пераваг для \"%c\"\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "недапушчальныя дапомныя перавагі\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr ""
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr ""
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr ""
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr ""
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "зашыфраваць даньні"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr ""
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Калі ласка, абярыце від ключа, які Вам патрэбны:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr ""
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr ""
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr ""
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr ""
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr ""
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr ""
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr ""
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr ""
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr ""
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr ""
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n"
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr ""
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr ""
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr ""
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr ""
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr ""
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr ""
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr ""
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr ""
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr ""
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr ""
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr ""
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr ""
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr ""
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr ""
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr ""
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr ""
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr ""
+
+#: g10/keygen.c:1904
+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 ""
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr ""
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr ""
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "запіс у stdout\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr ""
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr ""
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr ""
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr ""
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr ""
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr ""
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr ""
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr ""
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr ""
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr ""
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr ""
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr ""
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr ""
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr ""
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr ""
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr ""
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr ""
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr ""
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr ""
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "немагчыма адкрыць \"%s\"\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "паказаць сьпіс ключоў і подпісаў"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: створаны зьвязак ключоў\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+msgid "honor the preferred keyserver URL set on the key"
+msgstr ""
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr ""
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "недапушчальныя выбары экспартаваньня\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "экспартаваць ключы на паслужнік ключоў"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "імпартаваць ключы з паслужніка ключоў"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "імпартаваць ключы з паслужніка ключоў"
+
+#: g10/keyserver.c:1176
+#, c-format
+msgid "searching for names from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "недапушчальныя выбары экспартаваньня\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "агульная памылка"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr ""
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr ""
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr ""
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr ""
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "%u-бітавы %s ключ, ID %08lX, створаны %s"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr ""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "Паўтарыце пароль\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:508
+#, fuzzy, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "Паўтарыце пароль\n"
+
+#: g10/mainproc.c:510
+#, fuzzy
+msgid "encrypted with 1 passphrase\n"
+msgstr "Паўтарыце пароль\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr ""
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr ""
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr ""
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr ""
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr ""
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr ""
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr ""
+
+#: g10/mainproc.c:1508
+msgid "can't handle this ambiguous signature data\n"
+msgstr ""
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Подпіс створаны ў %.*s з выкарыстаньнем %s ID ключа %08lX\n"
+
+#: g10/mainproc.c:1544
+#, fuzzy
+msgid "Key available at: "
+msgstr "Даведка адсутнічае"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr ""
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr ""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1871
+#, fuzzy, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr ""
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr ""
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+#, fuzzy
+msgid "unknown"
+msgstr "невядомая вэрсыя"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr ""
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr ""
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr ""
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr ""
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr ""
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr ""
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr ""
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr ""
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr ""
+"па больш падрабязныя зьвесткі шукайце на http://www.gnupg.org/faq.html\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr ""
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr ""
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr ""
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr ""
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr ""
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr ""
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr ""
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr ""
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "невядомая вэрсыя"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Файл \"%s\" ужо йснуе. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Перазапісаць (y/N)?"
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr ""
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Увядзіце новае ймя файла"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "запіс у stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr ""
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr ""
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: тэчка створана\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr ""
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr ""
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr ""
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr ""
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr ""
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr ""
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr ""
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Вам неабходна ўвесьці пароль, каб адчыніць сакрэтны ключ для карыстальніка:\n"
+"\"%.*s\"\n"
+"%u-бітавы %s ключ, ID %08lX, створаны %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Паўтарыце пароль\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Увядзіце пароль\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "скасавана карыстальнікам\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr ""
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Увядзіце пароль: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Вам неабходна ўвесьці пароль, каб адчыніць сакрэтны ключ для\n"
+"карыстальніка: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-бітавы %s ключ, ID %08lX, створаны %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Паўтарыце пароль: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr ""
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr ""
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr ""
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr ""
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr ""
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr ""
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr ""
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr ""
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr ""
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr ""
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr ""
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr ""
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr ""
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr ""
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr ""
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr ""
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr ""
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr ""
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr ""
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = quit [выйсьці]\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr ""
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr ""
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr ""
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr ""
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr ""
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr ""
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr ""
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr ""
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr ""
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr ""
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr ""
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr ""
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr ""
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr ""
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr ""
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr ""
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr ""
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr ""
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr ""
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr ""
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr ""
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr ""
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr ""
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr ""
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr ""
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr ""
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Калі ласка, задайце назву файла даньняў: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "чытаецца stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr ""
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr ""
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, fuzzy, c-format
+msgid "build_packet failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "паказаць сьпіс ключоў і ID карыстальнікаў"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr ""
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, fuzzy, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr ""
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr ""
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr ""
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr ""
+
+#: g10/revoke.c:535
+#, fuzzy
+msgid "unknown protection algorithm\n"
+msgstr "невядомы альгарытм сьцісканьня"
+
+#: g10/revoke.c:543
+#, fuzzy
+msgid "NOTE: This key is not protected!\n"
+msgstr "Ключ абаронены.\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+#, fuzzy
+msgid "Please select the reason for the revocation:\n"
+msgstr "Калі ласка, абярыце від ключа, які Вам патрэбны:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr ""
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr ""
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr ""
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr ""
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr ""
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Недапушчальны пароль. Калі ласка, паспрабуйце шчэ раз"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr ""
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr ""
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr ""
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr ""
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr ""
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr ""
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr ""
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "нерэчаісны хэш-альгарытм \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr ""
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr ""
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr ""
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr ""
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "пароль занадта доўгі\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "паказаць ключы й адбіткі пальцаў"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr ""
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "памылка стварэньня \"%s\": %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "памылка чытаньня файла"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr ""
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "немагчыма адкрыць %s: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr ""
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "немагчыма адкрыць \"%s\"\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr ""
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr ""
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr ""
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: немагчыма стварыць хэш-табліцу: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr ""
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr ""
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr ""
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr ""
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr ""
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr ""
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr ""
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr ""
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr ""
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr ""
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "памылка чытаньня файла"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "збой падпісаньня: %s\n"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "невядомая вэрсыя"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr ""
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr ""
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr ""
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr ""
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "агульная памылка"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr ""
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "невядомая вэрсыя"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr ""
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr ""
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "дрэнны грамадскі ключ"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "дрэнны сакрэтны ключ"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr ""
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "памылка праверчае сумы"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "дрэнны пароль"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "грамадскі ключ ня знойдзены"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr ""
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "немагчыма адчыніць зьвязак ключоў"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr ""
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr ""
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "карыстальнік з такім ID адсутнічае"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "сакрэтны ключ недаступны"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr ""
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "непадтрымліваецца"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "дрэнны ключ"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "памылка чытаньня файла"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "памылка запісу файла"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "невядомы альгарытм сьцісканьня"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "памылка адчыненьня файла"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "памылка стварэньня файла"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "нерэчаісны пароль"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr ""
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr ""
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr ""
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr ""
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "дрэнны MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr ""
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr ""
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "дрэнны сэртыфікат"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr ""
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "памылка зачыненьня файла"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "памылка перайменаваньня файла"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "памылка выдаленьня файла"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "нечаканыя даньні"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr ""
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr ""
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr ""
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr ""
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr ""
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr ""
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr ""
+
+#: util/errors.c:101
+msgid "network error"
+msgstr ""
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr ""
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr ""
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr ""
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr ""
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr ""
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "скасавана карыстальнікам\n"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr ""
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "зашыфраваць даньні"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr ""
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+#, fuzzy
+msgid "yes"
+msgstr "yes [так]"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no [не]"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit [выйсьці]"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr ""
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "УВАГА! Выкарыстоўваецца небясьпечная памяць!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+"па больш падрабязныя зьвесткі шукайце на http://www.gnupg.org/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "дзеяньне немагчымае без распачатае бясьпечнае памяці\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr ""
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA патрабуе выкарыстаньня 160-і бітавага хэш-альгарытму\n"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr "збой падпісаньня: %s\n"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "Ключ абаронены.\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "немагчыма адкрыць %s: %s\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "памылка стварэньня \"%s\": %s\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "пароль занадта доўгі\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key user-id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key user-id"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "зрабіць адчэплены подпіс"
+
+#~ msgid "help"
+#~ msgstr "даведка (help)"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "агульная памылка"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: немагчыма стварыць тэчку: %s\n"
+
+#, fuzzy
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "немагчыма адкрыць %s: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file: %s\n"
+#~ msgstr "немагчыма адкрыць %s: %s\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[файлы]|зашыфраваць файлы"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[файлы]|разшыфраваць файлы"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "заўсёдвы выкарыстоўваць MDC для шыфраваньня"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "ніколі не выкарыстоўваць MDC для шыфраваньня"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|НАЗВА|     задаць назву дапомнага сакрэтнага ключа"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|ВУЗЕЛ|     выкарыстоўваць гэты паслужнік для пошуку ключоў"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|НАЗВА|     усталяваць мноства знакаў тэрмінала"
+
+#~ msgid " (default)"
+#~ msgstr " (дапомна)"
+
+#~ msgid "Policy: "
+#~ msgstr "Палітыка:"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "quit [выйсьці]"
diff --git a/po/boldquot.sed b/po/boldquot.sed
new file mode 100644 (file)
index 0000000..4b937aa
--- /dev/null
@@ -0,0 +1,10 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
+s/“/“\e[1m/g
+s/”/\e[0m”/g
+s/‘/‘\e[1m/g
+s/’/\e[0m’/g
diff --git a/po/ca.gmo b/po/ca.gmo
new file mode 100644 (file)
index 0000000..80c4f30
Binary files /dev/null and b/po/ca.gmo differ
diff --git a/po/ca.po b/po/ca.po
new file mode 100644 (file)
index 0000000..7c9adb4
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,7578 @@
+# Missatges de gnupg en català.
+# Copyright © 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+# Carles Sadurní Anguita <sadurni@jazzfree.com>, 2001.
+# Jordi Mallach <jordi@gnu.org>, 2001, 2002, 2003, 2005.
+#
+# Coses (jm):
+# ID d'usuari és masculí? Hi ha una mescla...
+# (ivb:  ID == identificador -> masculí)
+# Canviar ID -> ID d'usuari
+# Xifratge vs. Xifrat
+# (ivb:  xifratge -> acció, xifrat -> adjectiu)
+# + coses (ivb):
+#   - Algunes frases incompletes «x desconegut» -> «x és desconegut».
+#   - «algoritme» o «algorisme»?  (ambdós són correctes)
+#   - digest -> resum
+#   - «anell» o «clauer»?  (key ring -> clauer)
+#   - bug -> error?  (del recull)
+#   - Crec q uses més «signatura» q «firma»; unifique.
+#   - Usar majúscules x ressaltar (com original)?
+#   - Hi ha cert desordre en les cometes ;)
+#   - Frases índies completades.
+#   - Algunes incoherències: error {en la lectura,en llegir,mentre es llegia}
+#   - Probablement he clavat la pota en tots els Photo ID :P
+#   - Només es maneja amb les mans.
+#   - sapigueu -> sapieu? (x coherència)
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.0\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-02-04 02:04+0100\n"
+"Last-Translator: Jordi Mallach <jordi@gnu.org>\n"
+"Language-Team: Catalan <ca@dodds.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "no s'ha pogut generar un prim amb pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "no s'ha pogut generar un prim amb menys de %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "no s'ha trobat cap mòdul d'acumulació d'entropia\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "no s'ha pogut obrir «%s»\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "s'està escrivint la clau secreta a «%s»\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "no s'ha pogut obrir «%s»: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "no es pot fer stat de «%s»: %s\n"
+
+# Descartar, deixar passar...  ignorar és un anglicisme.  ivb
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "«%s» no és un fitxer regular: es descarta\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "nota: el fitxer random_seed és buit\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "AVÍS: el tamany del fitxer random_seed no és vàlid - no s'usarà\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "no s'ha pogut llegir «%s»: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "nota: el fitxer random_seed no s'ha actualitzat\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "no s'ha pogut crear «%s»: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "no s'ha pogut escriure «%s»: %s\n"
+
+# No em passe! ;)  ivb
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "no s'ha pogut tancar «%s»: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "AVÍS: esteu usant un generador de nombres aleatoris insegur!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"El generador de nombres aleatoris és només un pedaç\n"
+"per a que funcioni - de cap manera és un GNA fort!\n"
+"\n"
+"NO UTILITZEU CAP DADA GENERADA PER AQUEST PROGRAMA!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Si us plau, espereu mentre es genera entropia. Feu alguna tasca si\n"
+"vos ajuda no avorrir-vos, ja que ajudarà a la qualitat de la entropia.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"No hi ha prou bytes aleatoris. Per favor, feu alguna altra cosa per que el\n"
+"sistema tinga oportunitat de recollir més entropia. (Calen %d bytes més)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "no s'ha pogut emmagatzemar l'empremta digital: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "no s'ha pogut reconstruir la memòria cau de l'anell: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "l'enviament al servidor de claus ha fallat: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "error en crear «%s»: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "s'ha produït un error en llegir el bloc de claus: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "error: l'empremta digital és invàlida\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "«%s» ja està comprimida\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "genera un nou parell de claus"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "no s'ha pogut inicialitzar la base de dades de confiança: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "La generació de claus ha fallat: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "La generació de claus ha fallat: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "signatura %s, algorisme de resum %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr ""
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armadura: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "la capçalera d'armadura és invàlida: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "capçalera d'armadura: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "la capçalera de signatura clara és invàlida\n"
+
+# És un missatge d'error?  ivb
+# «Anidada» és un castellanisme.  Niuades?  Imbricades (SC)??  ivb
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "signatures en text pla imbricades\n"
+
+# FIXME: un-indiar. jm
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "armadura inesperada:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "la línia escapada amb guió és invàlida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "el caràcter radix64 %02x invàlid s'ha omés\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "fi de fitxer prematur (no CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "fi de fitxer prematur (en CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC malformat\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "error de CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "fí de fitxer prematur (al final)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "error en l'última línia\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "no s'han trobat dades OpenPGP vàlides.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "l'armadura és invàlida: la línia és més llarga que %d caràcters\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"hi ha un caràcter «quoted printable» en l'armadura - probablement s'ha "
+"utilitzat un MTA amb errors\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "la clau secreta no està disponible"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+# Destès? ivb
+# Desatès, sí. jm
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "no es pot fet això en mode desatès\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "La vostra selecció? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[no establert]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "home"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "dóna"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "no especificat"
+
+# Gènere?  Nombre?  Passat, futur?  ivb
+# Probablement és una clau, femení. jm
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "no forçat"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "forçat"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "no hi ha cap clau pública corresponent: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "error en la lectura de «%s»: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "preferències actualitzades"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "hi ha un caràcter invàlid en la cadena de preferència\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "hi ha un caràcter invàlid en la cadena de preferència\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "error: l'empremta digital és invàlida\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "Empremta digital:"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "error: l'empremta digital és invàlida\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "La generació de claus ha fallat: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "no s'han trobat dades OpenPGP vàlides.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "s'ha produït un error mentre s'escrivia l'anell secret «%s»: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Seleccioneu quin tipus de clau voleu:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr ""
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (només xifrar)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "La selecció és invàlida.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Seleccioneu la raó de la revocació:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "l'algorisme de protecció és desconegut\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Les parts secretes de la clau primària no estan disponibles.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "es descarta: la clau secreta ja és present\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "ix del menú"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "les ordres entren en conflicte\n"
+
+# «pantalla» o «ajuda»?  ivb
+# «ajuda», evidentment. jm
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "mostra aquesta ajuda"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "La clau és disponible en: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "canvia la data de caducitat"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "canvia la confiança"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "mostra empremta"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "genera un nou parell de claus"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Ordre> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "les ordres entren en conflicte\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr ""
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr ""
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "L'ordre no és vàlida (proveu «help»)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "la clau secreta no està disponible"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Introduïu el nom d'usuari: "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "Introduïu el nom d'usuari: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+#, fuzzy
+msgid "Enter PIN: "
+msgstr "Introduïu el nom d'usuari: "
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Repetiu la contrasenya: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "la contrasenya no s'ha repetit correctament; torneu a intentar-ho"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "no s'ha pogut obrir «%s»\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output no funciona per a aquesta ordre\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "no s'ha trobat la clau «%s»: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "s'ha produït un error en llegir el bloc de claus: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(a no ser que especifiqueu la clau per la empremta digital)\n"
+
+# Ahà!  Abans «batch» està tal qual.  Cal unificar.  ivb
+# Fet. jm
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "no es pot fer això en el mode desatès sense «--yes»\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Voleu esborrar aquesta clau de l'anell? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "És una clau secreta! Voleu esborrar-la? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "s'ha netejat la informació de la confiança\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "hi ha una clau secreta per a la clau pública «%s»!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "utilitzeu l'opció «--delete-secret-keys» per a eliminar-la primer.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "error en la creació de la contrasenya: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "no es pot usar un paquet asimètric ESK al estar en mode S2K\n"
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "Ha fallat el procés de signatura: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "«%s» ja està comprimida\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVÍS: «%s» és un fitxer buit\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"només podeu xifrar a claus RSA de 2048 bits o menys en el mode --pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "s'està llegint des de «%s»\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"no s'ha pogut utilitzar el xifratge IDEA per a totes les claus per a les que "
+"esteu xifrant.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forçar el xifrat asimètric %s (%d) viola les preferències del destinatari\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"forçar l'algoritme de compressió %s (%d) viola les preferències del "
+"destinatari\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forçar el xifrat asimètric %s (%d) viola les preferències del destinatari\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "no podeu usar %s mentre esteu en mode %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s xifrat per a: «%s»\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "dades xifrades amb %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "xifrat amb l'algoritme %d (desconegut)\n"
+
+# És no-wrap?  ivb
+# Com? jm
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ATENCIÓ: el missatge s'ha xifrat amb una clau feble durant el xifratge\n"
+"simètric.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problema en tractar amb un paquet xifrat\n"
+
+# Execució de programes remots, o execució remota de programes? jm
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "no hi ha suport per a l'execució remota de programes\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "no es pot crear el directori «%s»: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"les crides a programes externs estan inhabilitades per tindre el fitxer "
+"d'opcions permissos insegurs\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"aquesta plataforma necessita fitxers temporals quan es crida a programes "
+"externs\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "no s'ha pogut executar %s «%s»: %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "no s'ha pogut executar %s «%s»: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "s'ha produït un error del sistema en cridar el programa extern: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "s'ha produït una eixida no natural del programa extern\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "no s'ha pogut executar el programa extern\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "no s'ha pogut llegir la resposta del programa extern: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "AVÍS: no s'ha pogut eliminar el fitxer temporal (%s) «%s»: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "AVÍS: no s'ha pogut eliminar el directori temporal «%s»: %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"La signatura es marcarà com a irrevocable.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "no s'han ttrobat claus de revocació per a «%s»\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revoca una clau secundària"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "la clau secreta és inusable"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "s'està escrivint la clau secreta a «%s»\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "clau %08lX: no està protegida - es descarta\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "clau %08lX: clau d'estil PGP 2.x - es descarta\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr ""
+"clau %08lX: la signatura de la subclau és en el lloc equivocat - es "
+"descarta\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "no s'ha pogut inicialitzar la base de dades de confiança: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "AVÍS: la clau secreta %08lX no te una simple suma de comprovació SK\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "AVÍS: no s'ha exportat res\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Ordres:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fitxer]|crea una signatura"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fitxer]|crea una signatura en text clar"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "crea una signatura separada"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "xifra dades"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "xifra només amb xifratge simètric"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "desxifra dades (predeterminat)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifica una signatura"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "llista claus"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "llista claus i signatures"
+
+# «de les claus» o «de la clau»?  ivb
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "comprova les signatures de la claus"
+
+# «dactilars» o «digitals»?  ivb
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "llista claus i empremtes digitals"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "llista claus secretes"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "genera un nou parell de claus"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "elimina claus de l'anell públic"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "elimina claus de l'anell secret"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "signa una clau"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "signa una clau localment"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "signa o edita una clau"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "genera un certificat de revocació"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exporta claus"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exporta claus a un servidor de claus"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importa claus d'un servidor de claus"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "cerca claus en un servidor de claus"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "actualitza totes les claus des d'un servidor de claus"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importa/fon claus"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "actualitza la base de dades de confiança"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [fitxers]|imprimeix resums de missatges"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opcions:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "crea eixida amb armadura ascii"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOM|xifra per a NOM"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "usa aquest id per a signar o desxifrar"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|nivell de compressió N (0 no comprimeix)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "usa el mode de text canònic"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "fitxer d'eixida"
+
+# Un dels dos és en la llista d'opcions amb --help. Urgh. jm
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "detall"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "no fa cap canvi"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "pregunta abans de sobreescriure"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(En la pàgina del man hi ha una llista completa d'ordres i d'opcions)\n"
+
+# Crec q (A)lice (orig.), (B)ob (dest.), etc. són noms usats pel Zimmerman
+# en el manual original de PGP.  A, B, C...  ivb
+# En efecte. Idem per a Mallory més endavant. Els deixe com a l'original. jm
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exemples:\n"
+"\n"
+" -se -r Bob [fitxer]        signa i xifra per a l'usuari Bob\n"
+" --clearsign [fitxer]       crea una signatura en text clar\n"
+" --detach-sign [fitxer]     crea una signatura separada\n"
+" --list-keys [noms]         mostra claus\n"
+" --fingerprint [noms]       mostra empremtes digitals\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Si us plau, informeu sobre els errors a <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Forma d'ús: gpg [opcions] [fitxers] (-h per a veure l'ajuda)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaxi: gpg [opcions] [fitxers]\n"
+"signa, comprova, xifra o desxifra\n"
+"l'operació predeterminada depén de les dades introduïdes\n"
+
+# 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
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmes suportats:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Clau pública: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Xifratge: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Dispersió: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compressió: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "forma d'ús: gpg [opcions] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "les ordres entren en conflicte\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no s'ha trobat cap signe = a la definició de grup «%s»\n"
+
+# Indi. ivb
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "AVÍS: el propietari és insegur en %s «%s»\n"
+
+# Indi. ivb
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "AVÍS: el propietari és insegur en %s «%s»\n"
+
+# Indi. ivb
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "AVÍS: el propietari és insegur en %s «%s»\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "AVÍS: els permissos són insegurs en %s «%s»\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "AVÍS: els permissos són insegurs en %s «%s»\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "AVÍS: els permissos són insegurs en %s «%s»\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "AVÍS: el propietari del directori envoltant és insegur en %s «%s»\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "AVÍS: el propietari del directori envoltant és insegur en %s «%s»\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "AVÍS: el propietari del directori envoltant és insegur en %s «%s»\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "AVÍS: els permissos del directori envoltant són insegurs en %s «%s»\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "AVÍS: els permissos del directori envoltant són insegurs en %s «%s»\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "AVÍS: els permissos del directori envoltant són insegurs en %s «%s»\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "s'ha creat el nou fitxer d'opcions «%s»\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "No hi ha cap signatura corresponent en l'anell secret\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "la URL de política de signatura donada no és vàlida\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "mostra en quin anell de claus està una clau llistada"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "No hi ha cap signatura corresponent en l'anell secret\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTA: es descarta el fitxer d'opcions predeterminades antic «%s»\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTA: no existeix el fitxer d'opcions predeterminades «%s»\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "fitxer d'opcions «%s»: %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "s'estan llegint opcions de «%s»\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTA: %s no és per a ús normal!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"la extensió de xifrat «%s» no s'ha carregat per tindre permissos insegurs\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s no és un joc de caràcters vàlid\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s no és un joc de caràcters vàlid\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "no s'ha pogut analitzar sintàcticament la URI del servidor de claus\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opcions d'importanció no vàlides\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opcions d'importació no vàlides\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: opcions d'importanció no vàlides\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "opcions d'importació no vàlides\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s no és un joc de caràcters vàlid\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "la URL de política de signatura donada no és vàlida\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s no és un joc de caràcters vàlid\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "no s'ha pogut fixar l'exec-path a %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d opcions d'exportació no vàlides\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "AVÍS: el programa podria crear un fitxer core!\n"
+
+# FIXME: preferència? jm
+# Ho discutírem en la llista, segur.  Deu ser als arxius.  ivb
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "AVÍS: %s té preferència sobre %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s no és permés amb %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s no té sentit amb %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent no està disponible en aquesta sessió\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "s'està escrivint la clau secreta a «%s»\n"
+
+# clares -> en clar?  ivb
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "només podeu fer signatures separades o en clar en el mode --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "no podeu signar i xifrar al mateix temps en el mode --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"heu d'utilitzar fitxers (i no un conducte) mentre treballeu amb --pgp2 "
+"habilitat.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "xifrar un missatge en mode --pgp2 requereix el xifratge IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "l'algorisme de xifratge triat no és vàlid\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "l'algorisme de resum seleccionat no és vàlid\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "l'algorisme de xifratge triat no és vàlid\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "l'algorisme de resum de certificació seleccionat no és vàlid\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed ha de ser major que 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed ha de ser major que 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth ha d'estar en el rang 1 a 255\n"
+
+#: g10/gpg.c:3025
+#, fuzzy
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "default-check-level és invàlid; ha de ser 0, 1, 2 o 3\n"
+
+#: g10/gpg.c:3027
+#, fuzzy
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "default-check-level és invàlid; ha de ser 0, 1, 2 o 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTA: el mode S2K simple (0) no és gens recomanable\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "el mode S2K és invàlid; ha de ser 0, 1 o 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "les preferències per defecte són invàlides\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "les preferències personals de xifrat són invàlides\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "les preferències personals de digest són invàlides\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "les preferències personals de compressió són invàlides\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s encara no funciona amb %s\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "no podeu usar l'algorisme de xifratge «%s» mentre esteu en mode %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "no podeu usar l'algorisme de resum %s mentre esteu en mode %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "no podeu usar l'algorisme de compressió %s mentre esteu en mode %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "no s'ha pogut inicialitzar la base de dades de confiança: %s\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nom_del_fitxer]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nom_del_fitxer]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "ha fallat el desxifratge: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nom_del_fitxer]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [nom_del_fitxer]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "no podeu usar %s mentre esteu en mode %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nom_del_fitxer]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nom_del_fitxer]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [nom_del_fitxer]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "no podeu usar %s mentre esteu en mode %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [nom_del_fitxer]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nom_del_fitxer]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nom_del_fitxer]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [ordres]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [user-id] [anell]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "l'enviament al servidor de claus ha fallat: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "la recepció des del servidor de claus ha fallat: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "l'exportació de la clau ha fallat: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "ha fallat la cerca al servidor de claus: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "ha fallat el refresc des del servidor de claus: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "no s'ha pogut llevar l'armadura: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "no s'ha pogut crear l'armadura: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "l'algoritme de dispersió és invàlid «%s»\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nom_del_fitxer]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Endavant, escriviu el missatge...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "la URL de política de certificació donada no és vàlida\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "la URL de política de signatura donada no és vàlida\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "la URL de política de signatura donada no és vàlida\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr ""
+"hi ha massa entrades en la memòria cau de claus públiques - desactivada\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[No s'ha trobat l'id d'usuari]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"La clau invàlida %08lX s'ha fet vàlida amb --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"no hi ha una clau secreta per a la subclau pública %08lX - es descarta\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "s'usarà la clau secundària %08lX en lloc de la primària %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "clau %08lX: clau secreta sense clau pública - es descarta\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "una mica més silenciós"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "pren les claus d'aquest anell"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "fes els conflictes de marques de temps només un avís"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|escriu informació d'estat en aquest FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Forma d'ús: gpgv [opcions] [fitxers] (-h per a veure l'ajuda)"
+
+# Werner FIXME: should it use «Usage»?
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintaxi: gpg [opcions] [fitxers]\n"
+"Comprova signatures amb claus conegudes amb confiança\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"L'assignació d'un valor ací és cosa vostra; aquest valor mai s'exportarà\n"
+"a cap tercer. Ho necessitem per a implementar la xarxa de confiança; no té\n"
+"res a veure amb la xarxa de certificats (creada implícitament)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Per a construir la xarxa de confiança, GnuPG necessita saber quines claus\n"
+"tenen confiança absoluta - aquestes són normalment les claus per a les que\n"
+"teniu accés a la clau secreta.  Contesteu «sí» per a donar a aquesta clau\n"
+"confiança absoluta\n"
+
+# "clau no confiable"? jm
+# No fiable, no de confiança, no de fiar...  ivb
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Si voleu utilitzar aquesta clau no de confiança de totes maneres, dieu «sí»."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Introduïu l'ID d'usuari de la persona a qui voleu enviar el missatge."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"En general no és bona idea utilitzar la mateixa clau per a signar i\n"
+"xifrar. Aquest algoritme només s'hauria d'usar en tasques concretes.\n"
+"Si us plau, consulteu al vostre expert en seguretat primer."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Introduïu la grandària de la clau"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Contesteu «sí» o «no»"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Introduïu el valor requerit tal i com es mostra en l'indicatiu.\n"
+"És possible introduir una data ISO (AAAA-MM-DD) però no rebreu\n"
+"una bona resposta d'error - en canvi, el sistema tractarà d'interpretar\n"
+"el valor donat com un interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Introduïu el nom del propietari de la clau"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "introduïu una adreça de correu (opcional però molt recomanable)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Introduïu un comentari opcional"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  canvia el nom.\n"
+"C  canvia el comentari.\n"
+"E  canvia l'adreça de correu electrònic.\n"
+"O  continua la generació de les claus.\n"
+"Q  ix."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Contesteu «sí» (o només «s») si és correcte generar la subclau."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Quan signeu un ID d'usuari d'una clau, primer hauríeu de verificar que la "
+"clau\n"
+"pertany a la persona esmentada en l'ID d'usuari.  És útil per a altres "
+"saber\n"
+"amb quanta cura heu verificat açò.\n"
+"\n"
+"«0» significa que no feu cap declaració de amb quanta cura heu verificat\n"
+"    la clau.\n"
+"\n"
+"«1» significa que creieu que la clau és de la persona que diu que és la\n"
+"    propietària, però no heu pogut, o no heu verificat la clau de cap "
+"manera.\n"
+"    Açò és útil per a la verificació d'un «rol», quan signeu la clau d'un\n"
+"    usuari amb pseudònim.\n"
+"\n"
+"«2» significa que heu fet algunes comprovacions de la clau. Per exemple, "
+"açò\n"
+"    pot significar que heu verificat la emprenta digital de la clau i "
+"verificat\n"
+"    l'ID d'usuari en la clau amb el photo ID.\n"
+"\n"
+"«3» significa que heu fet una verificació exhaustiva de la clau. Per "
+"exemple,\n"
+"    açò pot significar que heu verificat la emprenta digital amb el "
+"propietari\n"
+"    de la clau en persona, i que heu comprovat, mitjançant un document "
+"difícil\n"
+"    de falsificar amb photo ID (com un passaport) que el nom del propietari\n"
+"    coincideix amb el nom de l'ID d'usuari en la clau, i finalment que heu\n"
+"    verificat (per intercanvi de correu) que l'adreça de correu en la clau\n"
+"    pertany al propietari de la clau.\n"
+"\n"
+"Teniu en compte que els exemples donats anteriorment per als nivels 2 i 3 "
+"són\n"
+"*només* exemples. Al final, és cosa vostra decidir què significa «alguna» i\n"
+"«exhaustiva» per a vosaltres quan voleu signar altres claus.\n"
+"\n"
+"Si no sabeu quina és la resposta correcta, contesteu «0»."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Contesteu «sí» si voleu signar TOTS els ID d'usuari"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Contesteu «sí» si realment voleu eliminar aquest ID d'usuari.\n"
+"Tots els certificats també es perdran!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Contesteu «sí» si és correcte eliminar la subclau"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Aquesta és una signatura vàlida en la clau; normalment no voldreu\n"
+"eliminar aquesta signatura perquè pot ser important per a establir\n"
+"una connexió de confiança a la clau o a un altra clau certificada\n"
+"per aquesta clau."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Aquesta signatura no es pot comprovar perquè no teniu la clau\n"
+"corresponent. Hauríeu de posposar la seua eliminació fins que\n"
+"sapieu quina clau es va utilitzar ja que aquesta clau de signatura\n"
+"podria establir una connexió de confiança a través d'una altra clau ja\n"
+"certificada."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"La signatura no és vàlida. Té sentit que l'elimineu de l'anell\n"
+"de claus."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Aquesta és una signatura que enllaça l'ID de l'usuari amb la clau.\n"
+"Normalment no és una bona idea eliminar una signatura com aquesta.\n"
+"Actualment, GnuPG podria no poder utilitzar aquesta clau de nou, així\n"
+"que feu açò només si l'autosignatura no és vàlida per alguna raó i\n"
+"hi ha una segona disponible."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Canvia les preferències de tots els ID d'usuari (o només els dels "
+"seleccionats)\n"
+"a la llista actual de preferències. Les marques de temps de totes les\n"
+"autosignatures afectades s'avançaran un segon.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Introduïu la contrasenya; aquesta ha de ser una frase secreta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Per favor, repetiu l'última contrasenya per confirmar-la."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Doneu el nom del fitxer al qual s'aplica la signatura"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Contesteu «sí» si és correcte sobreescriure el fitxer"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Introduïu un nom de fitxer. Si premeu RETORN s'hi usarà el fitxer\n"
+"predeterminat (apareix entre claudàtors)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Hauríeu d'especificar una raó per a la certificació. Depenent del\n"
+"context teniu l'habilitat de triar d'aquesta llista:\n"
+"  «La clau ha estat compromesa»\n"
+"      Utilitzeu açò si teniu alguna raó per creure que persones no\n"
+"      autoritzades han tingut accés a la vostra clau secreta.\n"
+"  «La clau ha estat reemplaçada»\n"
+"      Utilitzeu açò si heu reemplaçat aquesta clau amb una més nova.\n"
+"  «La clau ja no està en ús»\n"
+"      Utilitzeu açò si heu retirat aquesta clau.\n"
+"  «L'ID de l'usuari ja no és vàlid»\n"
+"      Utilitzeu açò per a constatar que l'ID de l'usuari no s'hauria\n"
+"      d'utilitzar més; açò s'utilitza normalment per a marcar una adreça\n"
+"      de correu com a invàlida.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Si voleu podeu introduir un text que descriga per què expediu aquest\n"
+"certificat de revocació. Per favor, sigueu concisos.\n"
+"Una línia buida indica el final del text.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "No hi ha ajuda disponible"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "No hi ha ajuda disponible per a `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "actualitza la base de dades de confiança"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "la clau pública no coincideix amb la clau secreta!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "la clau secreta és inusable"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "es descarta un bloc de tipus %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "fins ara s'han processat %lu claus\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Nombre total processat: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr " claus noves descartades: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "                sense ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              importades: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "          no modificades: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "       ID d'usuaris nous: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "          subclaus noves: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        signatures noves: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "       noves revocacions: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr " claus privades llegides: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "claus privades importades: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "claus privades no canviades: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "              importades: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "        signatures noves: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr " claus privades llegides: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Heu signat els següents ID d'usuari:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "signatura %s, algorisme de resum %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "clau %08lX: sense ID\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "clau %08lX: corrupció de la subclau HKP reparada\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "clau %08lX: s'ha acceptat la ID d'usuari no autosignada «%s»\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "clau %08lX: l'ID no és vàlid\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "açò pot ser causat per l'absència d'autosignatura\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "clau %08lX: no s'ha trobat la clau pública: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "clau %08lX: clau nova - es descarta \n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "no s'ha trobat cap anell escrivible: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "s'està escrivint en «%s»\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "error mentre s'escrivia l'anell «%s»: %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "clau %08lX: s'ha importat la clau pública «%s»\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "clau %08lX: no correspon a la nostra còpia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "clau %08lX: no s'ha trobat el bloc de claus original: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "clau %08lX: no s'ha pogut llegir el bloc de claus original: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "clau %08lX: «%s» 1 ID d'usuari nou\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "clau %08lX: «%s» %d ID d'usuari nous\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "clau %08lX: «%s» 1 signatura nova\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "clau %08lX: «%s» %d signatures noves\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "clau %08lX: «%s» 1 subclau nova\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "clau %08lX: «%s» %d subclaus noves\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "clau %08lX: «%s» %d signatures noves\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "clau %08lX: «%s» %d signatures noves\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "clau %08lX: «%s» %d ID d'usuari nous\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "clau %08lX: «%s» %d ID d'usuari nous\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "clau %08lX: «%s» no ha estat modificada\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "clau %08lX: clau secreta amb xifrat %d no vàlid - es descarta\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "s'està escrivint la clau secreta a «%s»\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "no hi ha anell secret predeterminat: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "clau %08lX: s'ha importat la clau secreta\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "clau %08lX: ja es troba en l'anell privat\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "clau %08lX: no s'ha trobat la clau secreta: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"clau %08lX: falta la clau pública: no es pot aplicar el certificat\n"
+"de revocació\n"
+
+# O «rebutjara»? ivb
+# Per tots els canvis d'anglicisme «ignorat» -> «es descarta»,
+# «es rebutja» està bé. jm
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "clau %08lX: el certificat de revocació és invàlid: %s: es rebutja\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "clau %08lX: s'ha importat el certificat de revocació «%s»\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "clau %08lX: no hi ha ID per a la signatura\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"clau %08lX: l'algoritme de clau pública no es suporta sobre l'id d'usuari «%"
+"s»\n"
+"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "clau %08lX: l'autosignatura no és vàlida en l'id d'usuari «%s»\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "clau %08lX: no hi ha una subclau per a l'enllaç de la clau\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "clau %08lX: l'algoritme de clau pública no és suportat\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "clau %08lX: l'enllaç de subclau és invàlid\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "clau %08lX: s'ha eliminat un enllaç de subclau múltiple\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "clau %08lX: no hi ha una subclau per a la clau de revocació\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "clau %08lX: Subclau de revocació no vàlida\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "clau %08lX: s'han eliminat subclaus de revocació múltiples\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "clau %08lX: es descarta l'ID d'usuari '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "clau %08lX: es descarta la subclau\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "clau %08lX: la signatura és inexportable (classe %02x) - es descarta\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr ""
+"clau %08lX: el certificat de revocació és en el lloc equivocat - es "
+"descarta\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "clau %08lX: el certificat de revocació és invàlid: %s - es descarta\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr ""
+"clau %08lX: la signatura de la subclau és en el lloc equivocat - es "
+"descarta\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr ""
+"clau %08lX: la classe de signatura és inesperada (0x%02x) - es descarta\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "clau %08lX: s'ha detectat un ID d'usuari duplicat - es fusiona\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"AVÍS: la clau %08lX pot estar revocada: s'adquireix la clau de revocació %"
+"08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"AVÍS: la clau %08lX pot estar revocada: la clau de revocació %08lX no està "
+"present.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "clau %08lX: s'hi ha afegit el certificat de revocació «%s»\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "clau %08lX: s'ha afegit la signatura de clau directa\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "la clau pública no coincideix amb la clau secreta!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "es descarta: la clau secreta ja és present\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "es descarta: la clau secreta ja és present\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "error en crear l'anell «%s»: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "s'ha creat l'anell «%s»\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "error en crear «%s»: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "no s'ha pogut reconstruir la memòria cau de l'anell: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revocació]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[autosignatura]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 signatura errònia\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d signatures errònies\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 signatura no comprovada per falta de clau\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d signatures no comprovades per falta de clau\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 signatura no comprovada a causa d'un error\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signatures no comprovades a causa d'errors\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "Ha estat detectat 1 ID sense autosignatura vàlida\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "Han estat detectats %d IDs sense autosignatura vàlida\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Decidiu fins a quin punt confieu en aquest usuari per a\n"
+"verificar les claus d'altres usuaris (mirant passaports,\n"
+"comprovant empremtes de diferents fonts...)?\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Hi confie marginalment\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Hi confie plenament\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "L'ID d'usuari «%s» està revocat."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Segur que encara voleu signarla? (s/N) "
+
+# O no s'ha pogut? ivb
+# FIXME: comprovar context. jm
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  No es pot signar.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "L'ID d'usuari «%s» ha caducat."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "L'ID d'usuari «%s» no està autosignat."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "L'ID d'usuari «%s» no està autosignat."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Signar realment? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"La vostra signatura en «%s»\n"
+"és una signatura d'estil PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Voleu ascendir-la a una autosignatura OpenPGP? (s/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"La vostra signatura actual en «%s»\n"
+"ha caducat.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Voleu crear una nova signatura per a reemplaçar la caducada? (s/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"La vostra signatura en «%s»\n"
+"és una signatura local.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Voleu ascendir-la a una signatura completament exportable? (s/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "«%s» ja estava signada localment amb la clau %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "«%s» ja estava signada amb la clau %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Voleu signarla un altre cop, de tota manera? (s/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "No hi ha res que signar amb la clau %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "La clau ha caducat!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Aquesta clau caducarà el %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Voleu que la vostra signatura caduque alhora? (S/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"No podeu fer una signatura OpenPGP en una clau PGP 2.x en el mode --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Açò inutilitzaria la clau en PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Amb quanta cura heu verificat que la clau que esteu a punt de signar \n"
+"pertany realment a la persona esmentada anteriorment? Si no sabeu què \n"
+"contestar, entreu «0».\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) No vaig a contestar.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) No ho he comprovat en absolut.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) He fet algunes comprovacions.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) He fet comprovacions molt acurades.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Seleccioneu una opció (introduïu «?» per obtindre més informació):"
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Esteu segur que voleu signar aquesta clau\n"
+"amb la vostra clau: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Açò serà una autosignatura.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"AVÍS: la signatura no es marcarà com a inexportable.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"AVÍS: la signatura no es marcarà com a irrevocable.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"La signatura es marcarà com a inexportable.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"La signatura es marcarà com a irrevocable.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"No he comprovat aquesta clau en absolut.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"He fet algunes comprovacions a aquesta clau.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"He comprovat aquesta clau amb molta cura.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Signar realment? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "Ha fallat el procés de signatura: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Aquesta clau no està protegida.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Les parts secretes de la clau primària no estan disponibles.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Les parts secretes de la clau primària no estan disponibles.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "La clau està protegida.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "No es pot editar aquesta clau: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Introduïu la nova contrasenya per a la clau secreta.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "la contrasenya no s'ha repetit correctament; torneu a intentar-ho"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"No voleu contrasenya: açò és probablement una *mala* idea!\n"
+"\n"
+
+# No abusis dels pronoms!  (Rowan Atkinson @ Llei i Desordre)  ivb
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Esteu segur de voler fer açò? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "s'està posant la signatura al lloc correcte\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "desa i ix"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "mostra empremta"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "llista claus i ID"
+
+# Per aquesta zona (keyedit) hi ha un cacau d'infinitius i presents...  ivb
+# Yeah, els vaig corregir abans de que enviares la teua correcció. jm
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "tria l'ID d'usuari N"
+
+# Per aquesta zona (keyedit) hi ha un cacau d'infinitius i presents...  ivb
+# Yeah, els vaig corregir abans de que enviares la teua correcció. jm
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "tria l'ID d'usuari N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revoca signatures"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "signa la clau localment"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Pista: Trieu els ID d'usuari que voleu signar\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "afegeix un ID d'usuari"
+
+# Com estava escrit abans.  ivb
+# Si et refereixes a Photo vs. photo, ho deixe en minúscules, que en tot
+# el menú està tot en minúscules. Tb hi ha molts ID vs. id en els msgids
+# i no hem unificat en català. Potser li ho diré a Werner. jm.
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "afegeix un photo ID"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "esborra un ID d'usuari"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "esborra una clau secundària"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "afegeix una clau de revocació"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"Voleu actualitzar les preferències per a les ID d'usuaris seleccionades?"
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "No podeu canviar la data de caducitat de les claus v3\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "marca l'ID d'usuari com a primari"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "canvia entre el llistat de claus secretes i públiques"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "llista les preferències (expert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "llista les preferències (detallat)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"Voleu actualitzar les preferències per a les ID d'usuaris seleccionades?"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "no s'ha pogut analitzar sintàcticament la URI del servidor de claus\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"Voleu actualitzar les preferències per a les ID d'usuaris seleccionades?"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "canvia la contrasenya"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "canvia la confiança"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Realment voleu revocar tots els ID d'usuari seleccionats? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "revoca un ID d'usuari"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revoca una clau secundària"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "activa una clau"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "desactiva una clau"
+
+# Igual que dalt.  ivb
+# Idem :) jm
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "mostra el photo ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "error en llegir el bloc de claus secretes «%s»: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "La clau secreta està disponible.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Cal la clau secreta per a fer açò.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Useu l'ordre «toggle» abans.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "La clau està revocada."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Realment voleu signar tots els ID d'usuari? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Pista: Trieu els ID d'usuari que voleu signar\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "la classe de signatura és desconeguda"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Aquesta ordre no està permesa mentre s'està en mode %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Heu de seleccionar al menys un ID d'usuari.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "No podeu esborrar l'últim ID d'usuari!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Realment voleu eliminar tots els ID d'usuari seleccionats? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Realment voleu eliminar aquest ID d'usuari? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Realment voleu esborrar aquesta autosignatura? (s/N)"
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Heu de seleccionar, si més no, una clau.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "no s'ha pogut obrir «%s»: %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "error en crear l'anell «%s»: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Heu de seleccionar, si més no, una clau.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Realment voleu eliminar les claus seleccionades? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Realment voleu eliminar aquesta clau? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Realment voleu revocar tots els ID d'usuari seleccionats? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Realment voleu eliminar aquest ID d'usuari? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Realment voleu revocar aquesta clau? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Realment voleu revocar les claus seleccionades? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Realment voleu revocar aquesta clau? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "estableix la llista de preferències"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Voleu actualitzar les preferències per a les ID d'usuaris seleccionades?"
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Realment voleu actualitzar les preferències? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Voleu desar els canvis? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Voleu eixir sense desar? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "ha fallat l'actualització: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "ha fallat l'actualització de la clau secreta: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "La clau no ha canviat, per tant no cal actualització.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Resum: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Funcionalitats: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notació: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "No hi ha preferències en un ID d'usuari d'estil PGP 2.x.\n"
+
+# Potser %s haja d'anar darrere de «clau».  ivb
+# És cert. Nova funcionalitat de 1.2.0, IIRC. jm
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Aquesta clau pot ser revocada per la clau %s "
+
+# Potser %s haja d'anar darrere de «clau».  ivb
+# És cert. Nova funcionalitat de 1.2.0, IIRC. jm
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Aquesta clau pot ser revocada per la clau %s "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (sensible)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "no s'ha pogut creat %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[revocada]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [caduca: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [caduca: %s]"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr ""
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " confiança: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Aquesta clau ha estat desactivada"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Teniu en compte que la validesa de la clau mostrada no és necessàriament\n"
+"correcta a no ser que torneu a executar el programa.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[revocada]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"AVÍS: no s'ha marcat cap ID d'usuari com primària. Aquesta ordre pot\n"
+"      causar que una ID d'usuari diferent esdevinga en la primària "
+"assumida.\n"
+
+# Photo ID com abans.  ivb
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"AVÍS: Aquesta és una clau d'estil PGP2. Afegir un photo ID pot fer que "
+"algunes versions de PGP rebutgen aquesta clau.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Esteu segur que encara voleu afegir-lo? (s/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "No podeu afegir un photo ID a una clau d'estil PGP2.\n"
+
+# Aquesta i les següents no haurien de portar (s/N/q) i no (y/N/q)?  ivb
+# Hmm. Sí... (s/N/x) jm
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Voleu esborrar aquesta signatura correcta? (s/N/x)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Voleu esborrar aquesta signatura invàlida? (s/N/x)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Voleu esborrar aquesta signatura desconeguda? (s/N/x)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Realment voleu esborrar aquesta autosignatura? (s/N)"
+
+# Werner FIXME: use ngettext. jm
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "S'ha esborrat %d signatura.\n"
+
+# Werner FIXME: use ngettext. jm
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "S'han esborrat %d signatures.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "No s'hi ha eliminat res.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "invàlida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "L'ID d'usuari «%s» està revocat."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "L'ID d'usuari «%s» està revocat."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "L'ID d'usuari «%s» està revocat."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "l'ID d'usuari «%s» ja està revocat\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "l'ID d'usuari «%s» ja està revocat\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVÍS: Aquesta és una clau d'estil PGP 2.x. Afegir un revocador designat pot\n"
+"fer que algunes versions de PGP rebutjen aquesta clau.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "No podeu afegir un revocador designat a una clau d'estil PGP 2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Introduïu l'ID d'usuari del revocador designat: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"no es pot nominar a una clau d'estil PGP 2.x com a revocador designat\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "no podeu nominar una clau com el seu propi revocador designat\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "no podeu nominar una clau com el seu propi revocador designat\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"AVÍS: no es pot desfer la nominació d'una clau com a revocador designat!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Esteu segur que voleu nominar aquesta clau com a revocador designat? (s/N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Per favor, elimineu les seleccions de les claus secretes.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Per favor, seleccioneu com a molt una clau secundària.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "S'està canviant la data de caducitat per a una clau secundària.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "S'està canviant la data de caducitat per a una clau primària.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "No podeu canviar la data de caducitat de les claus v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "No hi ha cap signatura corresponent en l'anell secret\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"AVÍS: no es pot desfer la nominació d'una clau com a revocador designat!\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Heu de seleccionar exactament un ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "es descarta l'autosignatura v3 en l'id d'usuari «%s»\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Esteu segur que encara voleu utilitzarla (s/N)? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Esteu segur que encara voleu utilitzarla (s/N)? "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notació de signatura: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Voleu sobreescriure? (s/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "No hi ha cap ID amb l'índex %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "No hi ha cap ID amb l'índex %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "No hi ha cap ID amb l'índex %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID d'usuari: «"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr ""
+"»\n"
+"signat amb la vostra clau %08lX el %s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (no-exportable)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Aquesta signatura va caducar el %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Esteu segur de que encara voleu revocarla? (s/N) "
+
+# (s/N) ivb
+# S! jm
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Voleu crear un certificat de revocació per a aquesta signatura? (s/N) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Heu signat els següents ID d'usuari:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (no-exportable)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revocat per %08lX el %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Esteu a punt de revocar aquestes signatures:\n"
+
+# (s/N)?  ivb
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Realment voleu crear els certificats de revocació? (s/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "ho hi ha clau secreta\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "l'ID d'usuari «%s» ja està revocat\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "AVÍS: una signatura d'ID d'usuari està datada %d segons en el futur\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "l'ID d'usuari «%s» ja està revocat\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "l'ID d'usuari «%s» ja està revocat\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"S'està mostrant el photo ID %s de mida %ld per a la clau 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "la preferència %c%lu és duplicada\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "hi ha massa preferències «%c»\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "hi ha massa preferències «%c»\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "hi ha massa preferències «%c»\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "hi ha un caràcter invàlid en la cadena de preferència\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "s'està escrivint una signatura directa\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "s'està escrivint l'autosignatura\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "s'està escrivint la signatura de comprovació de la clau\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "la mida de la clau és invàlida; s'hi usaran %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "la mida de la clau ha estat arrodonida fins a %u bits\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "xifra dades"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr ""
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Seleccioneu quin tipus de clau voleu:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA i ElGamal (predeterminat)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (només signar)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (només signar)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (només xifrar)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (només signar)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (només xifrar)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (només xifrar)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "La parella de claus DSA ha de tenir 1024 bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Quina grandària voleu? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "La grandària sol·licitada és %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "arrodonida fins a %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Especifiqueu el temps de validesa de la clau.\n"
+"         0 = la clau no caduca\n"
+"      <n>  = la clau caduca als n dies\n"
+"      <n>w = la clau caduca a les n setmanes\n"
+"      <n>m = la clau caduca als n mesos\n"
+"      <n>y = la clau caduca als n anys\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Especifiqueu el temps de validesa de la signatura.\n"
+"         0 = la signatura no caduca\n"
+"      <n>  = la signatura caduca als n dies\n"
+"      <n>w = la signatura caduca a les n setmanes\n"
+"      <n>m = la signatura caduca als n mesos\n"
+"      <n>y = la signatura caduca als n anys\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Indiqueu la validesa de la clau (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Indiqueu la validesa de la signatura (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "el valor no és vàlid\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s no caduca en absolut\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s no caduca en absolut\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s caduca el %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Aquesta signatura caduca el %s\n"
+
+# Amb «it» es refereix a les dates?  ivb
+# Això vaig entendre jo. jm
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"El vostre sistema no pot representar dates posteriors a l'any 2038.\n"
+"Tanmateix, les tractarà bé fins l'any 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "És correcte? (s/n)"
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Necessiteu un ID d'usuari per a identificar la vostra clau; el programa\n"
+"construeix l'id de l'usuari amb el Nom, Comentari i Adreça electrònica\n"
+"d'aquesta forma:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nom i cognoms: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Hi ha un caràcter invàlid en el camp *nom*\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "El nom no pot començar amb un dígit\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "El nom ha de tenir, si més no, 5 caràcters\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Adreça electrònica: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "No és una adreça vàlida\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comentari: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Hi ha un caràcter invàlid en el camp *comentari*\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Esteu usant el joc de caràcters `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Heu triat l'identificador d'usuari:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "No inclogueu l'adreça ni en el camp *nom* ni en el camp *comentari*\n"
+
+# xX? ivb
+# Hmm... sí. jm
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoXx"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Canvia (N)om, (C)omentari, (E)mail o (X) ix "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Canvia (N)om, (C)omentari, (E)mail o (O) d'acord / (X) ix"
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Corregiu l'error primer\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Cal una contrasenya per a protegir la clau secreta.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Cal generar molts bits aleatòriament. És bona idea fer alguna altra cosa\n"
+"(teclejar, moure el ratolí, usar els discos) durant la generació de\n"
+"nombres primers; açò dóna oportunitat al generador de nombres aleatoris\n"
+"d'aconseguir prou entropia.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "La generació de claus ha estat cancel·lada.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "s'està escrivint la clau pública a «%s»\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "s'està escrivint la clau secreta a «%s»\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "s'està escrivint la clau secreta a «%s»\n"
+
+# Potser no hi haja cap anell! ivb
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "no s'ha trobat cap anell públic escrivible: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr ""
+"no s'ha trobat cap anell secret de escrivible: %s\n"
+"\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "s'ha produït un error mentre s'escrivia l'anell públic «%s»: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "s'ha produït un error mentre s'escrivia l'anell secret «%s»: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "s'han creat i signat les claus pública i secreta.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Noteu que aquesta clau no serveix per a xifrar. Potser vulgueu usar l'ordre\n"
+"\"--edit-key\" per a generar una clau secundària per a tal propòsit.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "La generació de claus ha fallat: %s\n"
+
+# Werner FIXME: Use ngettext. jm
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"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
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in 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"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTA: crear subclaus per a claus v3 no és conforme amb OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Crear realment? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "no s'ha pogut eliminar el bloc de claus: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "no s'ha pogut crear «%s»: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr ""
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "mai       "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Política de signatura crítica: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Política de signatura: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notació de signatura crítica: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notació de signatura: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Anell"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Empremtes digital de la clau primària:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Empremta digital de la subclau:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Empremta digital de la clau primària:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Empremta digital de la subclau:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Empremta digital ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "no s'ha pogut crear l'armadura: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "AVÍS: hi ha 2 fitxers amb informació confidencial.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s és el que no ha canviat\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s és el nou\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Per favor, solucioneu aquest possible problema de seguretat\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "s'està comprovant l'anell «%s»\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "s'han comprovat %lu claus (%lu signatures)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "s'han comprovat %lu claus (%lu signatures)\n"
+
+# Fitxer indi fins final.  Hau!  ivb
+# Grrr. Com em tracten els esclaus ja... jm
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: s'ha creat l'anell\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "la URL de política de signatura donada no és vàlida\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"AVÍS: les opcions en «%s» encara no estan actives durant aquesta execució\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr ""
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "no s'ha trobat la clau «%s»: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "no s'ha trobat la clau «%s»: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "s'està sol·licitant la clau %08lX de %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "s'està sol·licitant la clau %08lX de %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "s'està cercant «%s» al servidor HKP %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "s'està cercant «%s» al servidor HKP %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "s'està cercant «%s» al servidor HKP %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr "s'està sol·licitant la clau %08lX de %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "s'està cercant «%s» al servidor HKP %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "s'està cercant «%s» al servidor HKP %s\n"
+
+# «del servidor», «en el servidor»?  ivb
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "error de servidor de claus"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "no es coneix cap servidor de claus (useu l'opció \"--keyserver\")\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+# «del servidor», «en el servidor»?  ivb
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "error de servidor de claus"
+
+# «del servidor», «en el servidor»?  ivb
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "error de servidor de claus"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "la recepció des del servidor de claus ha fallat: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s: no és un ID vàlid\n"
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "s'està sol·licitant la clau %08lX de %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "s'està sol·licitant la clau %08lX de %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "AVÍS: no s'ha pogut eliminar el fitxer temporal (%s) «%s»: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "AVÍS: no s'ha pogut eliminar el fitxer temporal (%s) «%s»: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "mida extranya per a una clau de sessió xifrada (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "clau de sessió xifrada amb %s\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "xifrat amb l'algoritme %d (desconegut)\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "la clau pública és %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "dades xifrades amb clau pública: bona clau de xifratge (DEK)\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "xifrat amb una clau %2$s de %1$u bits, ID %3$08lX, creada en %4$s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr ""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "xifrat amb una clau %s, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "ha fallat el desxifratge amb la clau pública: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "xifrat amb %lu contrasenyes\n"
+
+# FIXME WK: Use ngettext
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "xifrat amb 1 contrasenya\n"
+
+# I no serà «dades xifrades amb %s»?  ivb
+# Sembla que sí, ho marque per a mirar-ho més endavant. jm
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "s'assumeixen dades xifrades amb %s\n"
+
+# L'optimístic és aquell que té una Fe Cega en que Tot Anirà Bé!  ivb
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"El xifratge IDEA no està disponible, s'intentarà utilitzar optimistament %s "
+"en el seu lloc\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "desxifratge correcte\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVÍS: el missatge no tenia protecció d'integritat\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "AVÍS: el missatge xifrat ha estat manipulat!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "ha fallat el desxifratge: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTA: el remitent ha sol·licitat \"alt secret\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nom del fitxer original='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revocació autònoma: useu \"gpg --import\" per a aplicar-la\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Signatura correcta de \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "s'ha eliminat la verificació de signatura\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "no es poden tractar aquestes signatures múltiples\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Aquesta signatura va caducar el %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "              alias \""
+
+# «%.*s» no serà una data?  Caldrà «el» al davant.  ivb
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signatura creada el %.*s usant una clau %s ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "La clau és disponible en: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Signatura INCORRECTA de \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Signatura caducada de \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Signatura correcta de \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[incert]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "              alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Aquesta signatura va caducar el %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Aquesta signatura caduca el %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "signatura %s, algorisme de resum %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binari"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "mode text"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "desconeguda"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "No s'ha pogut comprovar la signatura: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "no és una signatura separada\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"AVÍS: s'han detectat múltiples signatures. Només es comprovarà la primera.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "signatura autònoma de classe 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "signatura de l'estil antic (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "s'ha detectat un paquet arrel invàlid en proc_tree()\n"
+
+# bolcats de memòria?  ivb
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "no s'han pogut desactivar els bolcats de memòria: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "ha fallat l'actualització de la base de dades de confiança: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "base de dades de confiança: ha fallat la lectura (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "no es pot treballar amb l'algoritme de clau pública %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "l'algoritme de xifratge no és implementat"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "signatura %s, algorisme de resum %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "AVÍS: %s és una opció desaconsellada.\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "el mòdul de xifratge IDEA no està present\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = mostra més informació\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: l'opció «%s» està desaconsellada.\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVÍS: %s és una opció desaconsellada.\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "si us plau, utilitzeu «%s%s» en el seu lloc\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "AVÍS: %s és una opció desaconsellada.\n"
+
+# Gènere?  Nombre?  Passat, futur?  ivb
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "No comprimit"
+
+# Gènere?  Nombre?  Passat, futur?  ivb
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "No comprimit"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "aquest missatge pot no ser usable per %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "s'estan llegint opcions de «%s»\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "el destinatari predeterminat és desconegut «%s»\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "El fitxer «%s» existeix. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Voleu sobreescriure? (s/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: el sufix és desconegut\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Introduïu el nou nom del fitxer"
+
+# Indi?  ivb
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "s'està escrivint en stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "s'asumeix que hi ha dades signades en «%s»\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "s'ha creat el nou fitxer d'opcions «%s»\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"AVÍS: les opcions en «%s» encara no estan actives durant aquesta execució\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: s'ha creat el directori\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "no es pot treballar amb l'algoritme de clau pública %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"AVÍS: la clau de sessió pot estar xifrada simètricament de forma insegura\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "el subpaquet de tipus %d té el bit crític activat\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent no està disponible en aquesta sessió\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "la variable d'entorn GPG_AGENT_INFO és malformada\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "la versió %d del protocol de gpg-agent no està suportada\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "no s'ha pogut connectar amb «%s»: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "hi ha un problema amb l'agent: es deshabilitarà el seu ús\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (ID de la clau principal %08lX)"
+
+# Com es canvia l'ordre dels arguments? jm
+# Ah, bingo! jm
+# Uh, ara torna a donar error. FIXME
+# La idea és ficar:
+# "Necessiteu la contrasenya per desblocar la clau secreta de l'usuari:\n"
+# "«%1$.*s»\n"
+# "clau %3$s de %2$u bits, ID %4$08lX, creada en %5$s%6$s\n"
+# jm
+# Se't passava l'argument «*».  printf(3), hieroglyph(7).  ivb
+# Ah!  Prova-ho, no casque alguna cosa :P  ivb
+# Ah, ja veig! Moltes gràcies! Aquest msgstr ha quedat curiós :) jm
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Necessiteu la contrasenya per desblocar la clau secreta de l'usuari:\n"
+"«%2$.*1$s»\n"
+"clau %4$s de %3$u bits, ID %5$08lX, creada en %6$s%7$s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repetiu la contrasenya\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Introduïu la contrasenya\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "s'ha cancel·lat per l'usuari\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "no es pot demanar la contrasenya en mode desatès\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Introduïu la contrasenya: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Necessiteu la contrasenya per desblocar la clau secreta de\n"
+"l'usuari: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "clau %2$s de %1$u bits, ID %3$08lX, creada en %4$s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repetiu la contrasenya: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Seleccioneu una imatge per a utilitzarla en el vostre photo ID. La imatge\n"
+"ha de ser un fitxer JPEG. Recordeu que la imatge es desa dins de la vostra\n"
+"clau pública. Si utilitzeu una foto molt gran, la vostra clau també es farà\n"
+"molt gran!\n"
+"Es recomana una imatge amb una mida aproximada de 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Introduïu el nom del fitxer JPEG per al photo ID: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "No s'ha pogut obrir la foto «%s»: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Esteu segur que encara voleu utilitzarla (s/N)? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "«%s» no és un fitxer JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "És aquesta foto correcta (s/N/x)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "no s'ha pogut mostrar el photo ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "No s'ha especificat cap raó"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "La clau ha estat substituïda"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "La clau ha estat compromesa"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "La clau ja no s'usa"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "L'ID d'usuari ja no és vàlid"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "raó de la revocació: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "comentari de la revocació: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMxXoO"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"No hi ha cap valor de confiança assignat a:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr ""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"%08lX: No hi ha res que indique que la signatura pertany al seu propietari.\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = No ho sé\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = NO confie\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Hi confie absolutament\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = torna al menú principal\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " o = omet aquesta clau\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " x = ix\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "La vostra decisió? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Realment voleu assignar confiança absoluta a aquesta clau? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificats que duen a una clau de confiança absoluta:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: No hi ha res que indique que la signatura pertany al seu propietari.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: No hi ha res que indique que la signatura pertany al seu propietari.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Aquesta clau pertany probablement al seu propietari\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Aquesta clau és nostra\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NO és segur que la clau pertanya a la persona esmentada en\n"
+"l'ID d'usuari. Si *realment* sabeu què feu, podeu respondre\n"
+"«sí» a la següent pregunta\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Voleu usar de tota manera aquesta clau?"
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "AVÍS: S'està usant una clau no fiable!\n"
+
+#: g10/pkclist.c:509
+#, fuzzy
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"AVÍS: la clau %08lX pot estar revocada: la clau de revocació %08lX no està "
+"present.\n"
+
+#: g10/pkclist.c:518
+#, fuzzy
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVÍS: Aquesta clau ha estat revocada pel propietari!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "AVÍS: Aquesta clau ha estat revocada pel propietari!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "      Açò podria significar que la signatura és falsificada.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "AVÍS: Aquesta subclau ha estat revocada pel propietari!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Nota: Aquesta clau ha estat desactivada.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Nota: La clau ha caducat!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "AVÍS: Aquesta clau no ve certificada per una signatura de confiança!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"    No hi ha res que indique que la signatura pertany al seu propietari.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "AVÍS: La clau NO és de confiança!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "          Probablement la signatura és FALSA.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr "AVÍS: Aquesta clau no ve certificada per signatures prou fiables!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "No és segur que la signatura pertanya al seu propietari.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: es descarta: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: es descarta: la clau pública ja està present\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Introduïu l'ID d'usuari. Finalitzeu amb una línia en blanc: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Usuari inexistent.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "es descarta: la clau pública ja s'ha especificat com a destinatari\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "La clau pública està desactivada.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "es descarta: la clau pública ja està establida\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "el destinatari predeterminat és desconegut «%s»\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: es descarta: la clau pública està desactivada\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "no hi ha adreces vàlides\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "error en crear «%s»: %s\n"
+
+# Indi? ivb
+# Em pense que no. jm
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Signatura separada.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Introduïu el nom del fitxer de dades: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "s'està llegint d'stdin...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "no hi ha dades signades\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "no s'han pogut obrir les dades signades `%s'\n"
+
+# Indi? ivb
+# Yeh... jm
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "el destinatari és anònim; es provarà la clau secreta %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "d'acord, som el destinatari anònim.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "la codificació antiga del DEK no està suportada\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "l'algoritme de xifratge %d%s és desconegut o està desactivat\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "NOTA: no s'ha trobat l'algoritme de xifratge %d en les preferències\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTA: la clau secreta %08lX caduca el %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTA: aquesta clau ha estat revocada!"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "ha fallat build_packet: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "clau %08lX: sense ID\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "A ser revocada per:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Aquesta és una clau de revocació sensible)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Voleu crear un certificat de revocació per a aquesta clau? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "s'ha forçat l'eixida d'armadura ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "ha fallat make_keysig_packet: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "S'ha creat el certificat de revocació.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "no s'han ttrobat claus de revocació per a «%s»\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "no s'ha trobat la clau secreta «%s»: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "no hi ha cap clau pública corresponent: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "la clau pública no coincideix amb la clau secreta!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Voleu crear un certificat de revocació per a aquesta clau? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "l'algorisme de protecció és desconegut\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTA: Aquesta clau no està protegida!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"S'ha creat un certificat de revocació.\n"
+"\n"
+"Si us plau, mogueu-lo a un medi que pugueu amagar; si Mallory aconsegueix\n"
+"accés a aquest certificat pot utilitzar-lo per a fer la vostra clau\n"
+"inservible. És intel·ligent imprimir aquest certificat i amagar-lo, per\n"
+"si el vostre medi es torna illegible. Però aneu amb compte: el sistema\n"
+"d'impressió de la vostra màquina podria emmagatzemar les dades i fer-les\n"
+"disponibles a altres!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Seleccioneu la raó de la revocació:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Cancel·la"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Segurament voleu seleccionar %d ací)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+"Introduïu una descripció opcional; finalitzeu amb una línia en blanc:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Raó de la revocació: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(No es va donar una descripció)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "És açò correcte? "
+
+# Parts?  Peces?  ivb
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "parts de la clau secreta no estan disponbles\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "l'algoritme de protecció %d%s no està suportat\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "l'algoritme de protecció %d%s no està suportat\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "La contrasenya no és vàlida; torneu a intentar-ho"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "AVÍS: la clau és feble; per favor, canvieu la contrasenya.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"s'està generant la suma de comprovació desaconsellada de 16-bits per a la "
+"protecció de la clau secreta\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "s'hi ha creat una clau feble - reintent\n"
+
+# És no-wrap?  ivb
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"no s'ha pogut evitar una clau feble per a xifratge simètric;\n"
+"hi ha hagut %d intents!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "AVÍS: conflicte de signatures digest en el missatge\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"AVÍS: no es pot desfer la nominació d'una clau com a revocador designat!\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+# Werner FIXME: Use ngettext. jm
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"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
+#: g10/sig-check.c:195
+#, 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"
+"amb el rellotge)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTA: la clau de signatura %08lX va caducar el %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"es supossa una signatura incorrecta de la clau %08lX a causa d'un bit crític "
+"desconegut\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+"clau %08lX: no hi ha una subclau per al paquet de la subclau de revocació\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+"clau %08lX: no hi ha una subclau per a la signatura de l'enllaç de la "
+"subclau\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"no es poden ficar dades de notació dins de signatures v3 (estil PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"no es poden ficar dades de notació dins de signatures de clau v3 (estil PGP "
+"2.x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVÍS: no s'ha pogut %%-expandir la notació (massa gran). S'utilitza no "
+"expandida.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"no es pot ficar una URL de política dins de signatures v3 (estil PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"no es pot ficar una URL de política dins de signatures de clau v3 (estil PGP "
+"2.x)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"AVÍS: no s'ha pogut %%-expandir l'url de política (massa gran). S'utilitza "
+"no expandida.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"AVÍS: no s'ha pogut %%-expandir l'url de política (massa gran). S'utilitza "
+"no expandida.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "no s'ha pogut comprovar la signatura creada: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s signatura de: «%s»\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"només podeu fer signatures separades amb claus d'estil PGP 2.x mentre esteu "
+"en mode --pgp2\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"forçar l'algoritme de digest %s (%d) viola les preferències del destinatari\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "signatura:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"només podeu signar en clar amb claus d'estil PGP 2.x en el mode --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "s'utilitzarà xifratge %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"la clau no està marcada com a insegura - no es pot utilitzar amb el GNA "
+"fals!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "es descarta «%s»: duplicat\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "es descarta «%s»: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "es descarta: la clau secreta ja és present\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"es descarta «%s»: és una clau ElGamal generada per PGP que no és segura per "
+"a signatures!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "registre de confiança %lu, tipus %d: no s'ha pogut escriure: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Llista de valors de confiança assignats, creat el %s\n"
+"# (Utilitzeu «gpg --import-ownertrust» per a restaurar-les)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "error en la lectura de «%s»: %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "la línia és massa llarga\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "error: l'empremta digital és invàlida\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importa els valors de confiança"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "error en trobar el registre de confiança: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "error de lectura: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "base de dades de confiança: no s'ha pogut sincronitzar: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "reg de la base de dades de confiança %lu: ha fallat lseek: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+"reg de la base de dades de confiança %lu: ha fallat la escriptura (n=%d): %"
+"s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "la transacció de la base de dades de confiança és massa gran\n"
+
+# No em passe! ;)  ivb
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "no s'ha pogut tancar «%s»: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: el directori no existeix!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "no es pot crear el directori «%s»: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "no s'ha pogut obrir «%s»\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: no s'ha pogut crear un registre de versió: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: s'ha creat una base de dades de confiança invàlida\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: s'ha creat la base de dades de confiança\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTA: no es pot escriure en la base de dades de confiança\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: la base de dades de confiança és invàlida\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: no s'ha pogut crear la taula de dispersió: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: error en actualitzar el registre de la versió: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: error en llegir el registre de la versió: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: error en escriure el registre de la versió: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "base de dades de confiança: ha fallat lseek: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "base de dades de confiança: ha fallat la lectura (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s no és un fitxer de base de dades de confiança\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: registre de versió amb número de registre %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: la versió de fitxer %d és invàlida\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: error en llegir el registre lliure: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: error en escriure el registre de directoris: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: no s'ha pogut posar a zero un registre: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: no s'ha pogut afegir un registre: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"la base de dades de confiança està corrompuda; per favor, executeu «gpg --"
+"fix-trustdb».\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "no es poden tractar línies més llargues de %d caràcters\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "la línia d'entrada és superior a %d caràcters\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "«%s» no és un ID de clau llarg vàlid\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "clau %08lX: s'accepta com a clau fiable\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr ""
+"la clau %08lX apareix més d'una vegada en la base de dades de confiança\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"clau %08lX: no hi ha una clau pública per a la clau fiable - es descarta\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "s'ha marcat la clau com a de confiança absoluta.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "registre de confiança %lu, tipus %d: no s'ha pogut llegir: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "el registre de confiança %lu no és del tipus demanat %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[revocada]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[caducada]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "desconeguda"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "mai       "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr ""
+"no és necessària una comprovació de la base de dades de confiança\n"
+"\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "la pròxima comprovació de la base de dades de confiança serà el %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+"no és necessària una comprovació de la base de dades de confiança\n"
+"\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+"no és necessària una comprovació de la base de dades de confiança\n"
+"\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "no s'ha trobat la clau pública %08lX: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "si us plau, feu un --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "s'està comprovant la base de dades de confiança\n"
+
+#: g10/trustdb.c:2095
+#, 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"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "no s'han trobat claus amb confiança absoluta\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+"no s'ha trobat la clau pública de la clau amb confiança absoluta %08lX\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "registre de confiança %lu, tipus %d: no s'ha pogut escriure: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"no s'ha pogut verificar la signatura.\n"
+"Recordeu que el fitxer de signatura (.sig o .asc)\n"
+"ha de ser el primer que figure en la línia d'ordres.\n"
+
+# LF -> fi de línia?  ivb
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "la línia d'entrada %u és massa llarga o hi falta un fí de línia\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "error general"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "el tipus de paquet és desconegut"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "la versió és desconeguda"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "l'algoritme de clau pública és desconegut"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "l'algoritme de resum és desconegut"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "la clau pública és errònia"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "la clau secreta és errònia"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "la signatura és errònia"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "la suma de control és errònia"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "la contrasenya és errònia"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "no s'ha trobat la clau pública"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "l'algoritme de xifratge és desconegut"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "no s'ha pogut obrir l'anell"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "el paquet és invàlid"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "l'armadura és invàlida"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "no s'ha trobat l'id de l'usuari"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "la clau secreta no està disponible"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "s'ha utilitzat una clau secreta incorrecta"
+
+# Gènere?  Nombre?  ivb
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: util/errors.c:73
+msgid "not supported"
+msgstr "no és suportat"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "la clau és incorrecta"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "error de lectura"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "error d'escriptura"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "l'algoritme de compressió és desconegut"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "error en l'obertura del fitxer"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "error en la creació del fitxer"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "la contrasenya és invàlida"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "l'algoritme de clau pública no és implementat"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "l'algoritme de xifratge no és implementat"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "la classe de signatura és desconeguda"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "error de la base de dades de confiança"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "l'MPI és erroni"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "límit de recursos"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "l'anell no és vàlid"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "el certificat és incorrecte"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "l'id d'usuari és malformat"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "error en el tancament del fitxer"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "error en el reanomenament del fitxer"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "error en l'eliminació del fitxer"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "dades inesperades"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflicte de data"
+
+# Ací veus pq jo pose «no és vàlid» en comptes de «és invàlid».  ivb
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "l'algoritme de clau pública és inusable"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "el fitxer existeix"
+
+# Segons context: la clau és feble?  ivb
+#: util/errors.c:97
+msgid "weak key"
+msgstr "clau feble"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "l'argument és invàlid"
+
+# La «U» és masculina o femenina?  ivb
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "l'URI és errònia"
+
+# Ídem.  ivb
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "l'URI no és suportada"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "error de la xarxa"
+
+# Gènere?  Nombre?  ivb
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "no és xifrat"
+
+# Gènere?  Nombre?  Passat, futur?  ivb
+# Probablement és una clau, femení. jm
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: util/errors.c:104
+msgid "not processed"
+msgstr "no processat"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "ls clau pública és inusable"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "la clau secreta és inusable"
+
+# «del servidor», «en el servidor»?  ivb
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "error de servidor de claus"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Cancel·la"
+
+# Gènere?  Nombre?  ivb
+# Werner FIXME: please add translator comment saying *what* is
+# uncompressed so we know the gender. jm
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "no és xifrat"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "no hi ha dades signades\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... açò és un bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "heu trobat un bug... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "sí|si"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "sS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "ix"
+
+# «xX»?  ivb
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "xX"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "AVÍS: esteu usant memòria insegura!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+"si us plau, visiteu http://www.gnupg.org/faq.html per a més informació\n"
+
+# Últimament pense si «iniciar» no serà millor que «inicialitzar»?  ivb
+# Segons SC, hi ha diferència. jm
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "l'operació no és possible sense memòria segura inicialitzada\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(potser heu utilitzat el programa erroni per a aquesta tasca)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA requereix l'ús d'un algoritme de dispersió de 160 bits\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "vegeu http://www.gnupg.org/why-not-idea.html per a més informació\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "un nom de notació només pot tenir caràcters imprimibles o espais i acabar "
+#~ "amb el signe «=»\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "un nom de notació d'usuari no pot contenir el caràcter «@»\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "un nom de notació d'usuari no pot contenir el caràcter «@»\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "un valor de notació no pot utilitzar cap caràcter de control\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "AVÍS: s'hi han trobat dades de notació invàlides\n"
+
+#~ msgid "not human readable"
+#~ msgstr "no llegible per humans"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "llig opcions del fitxer"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "llig opcions del fitxer"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [caduca: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr ""
+#~ "clau %08lX: la classe de signatura és inesperada (0x%02x) - es descarta\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "no s'ha pogut executar %s «%s»: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "No hi ha usuari per a la clau\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "error en la creació de la contrasenya: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr ""
+#~ "la contrasenya és incorrecta o l'algoritme de xifratge (%d) és "
+#~ "desconegut\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "no es pot establir el pid del client per l'agent\n"
+
+# llija/llegisca/llegesca.  ivb
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "no es pot fer que el servidor llegesca el DF per a l'agent\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "no es pot fer que el servidor escriga el DF per a l'agent\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "hi ha un problema de comunicació amb el gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "la contrasenya és massa llarga\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "la resposta de l'agent és invàlida\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "hi ha un problema amb l'agent: l'agent ha tornat 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "tria la clau secundària N"
+
+#~ msgid "list signatures"
+#~ msgstr "llista les signatures"
+
+#~ msgid "sign the key"
+#~ msgstr "signa la clau"
+
+#~ msgid "add a secondary key"
+#~ msgstr "afegeix una clau secundària"
+
+#~ msgid "delete signatures"
+#~ msgstr "esborra signatures"
+
+#~ msgid "change the expire date"
+#~ msgstr "canvia la data de caducitat"
+
+#~ msgid "set preference list"
+#~ msgstr "estableix la llista de preferències"
+
+#~ msgid "updated preferences"
+#~ msgstr "preferències actualitzades"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "No hi ha cap clau secundària amb l'índex %d\n"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "l'algorisme de resum «%s» es de només lectura en aquesta versió\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "AVÍS: el resum «%s» no és part d'OpenPGP. Utilitzeu-lo assumint el risc!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[fitxers]|xifra fitxers"
+
+#~ msgid "store only"
+#~ msgstr "només emmagatzema"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[fitxers]|desxifra fitxers"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "signa una clau irrevocablement"
+
+# D'altres formes o no queda clar o és massa literari :P  ivb
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "signa una clau de forma local i irrevocable"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "llista només la seqüència de paquets"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "exporta els valors de confiança"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "actualització no atesa de la base de dades de confiança"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "arregla una base de dades de confiança corrompuda"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "lleva l'armadura a un fitxer o a stdin"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "crea l'armadura d'un fitxer o d'stdin"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOM|usa NOM com a destinatari predeterminat"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "usa la clau predeterminada com a destinatari predeterminat"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "no usa el terminal en absolut"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "força signatures v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "no força signatures v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "força signatures de clau v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "no força signatures de clau v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "sempre utilitza un MDC per a xifrar"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "mai utilitza un MDC per a xifrar"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "utilitza el gpg-agent"
+
+# Mode desatès (SC)  ivb
+#~ msgid "batch mode: never ask"
+#~ msgstr "mode desatès: no pregunta mai"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "suposa «sí» en la majoria de les preguntes"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "suposa «no» en la majoria de les preguntes"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "afegeix aquest anell a la llista"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "afegeix aquest anell secret a la llista"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOM|usa NOM com a clau secreta predeterminada"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|usa aquest servidor per a cercar claus"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NOM|el joc de caràcters serà NOM"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|fitxer|escriu informació d'estat en un fitxer"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|IDCLAU|confia absolutament en aquesta clau"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FITXER|carrega el mòdul d'extensió especificat"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emula el mode descrit en RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "estableix totes les opcions de paquets, xifratge i resum al comportament "
+#~ "d'OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "estableix totes les opcions de paquets, xifratge i resum al comportament "
+#~ "de PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|usa el mode de contrasenya especificat"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|NOM|usa l'algoritme de resum de missatges NOM per a les contrasenyes"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NOM|usa l'algoritme de xifratge NOM per a les contrasenyes"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOM|usa l'algoritme de xifratge NOM"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOM|usa l'algoritme de resum de missatges NOM"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|usa l'algoritme de compressió N"
+
+# elimina o descarta? jm
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "descarta el camp keyid dels paquets xifrats"
+
+# Werner FIXME: uncapitalize
+#~ msgid "Show Photo IDs"
+#~ msgstr "mostra els Photo ID"
+
+# Werner FIXME: uncapitalize
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "no mostra els Photo ID"
+
+# Werner FIXME: uncapitalize
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "fixa l'ordre per a veure Photo ID"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "l'algorisme de compressió «%s» es de només lectura en aquesta versió\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "l'algoritme de compressió ha d'estar en l'interval %d..%d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key user-id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key user-id"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "no s'ha pogut obrir %s: %s\n"
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "clau %08lX: aquesta clau ha estat revocada!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "clau %08lX: aquesta subclau ha estat revocada!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: la clau ha caducat\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: La clau NO és de confiança\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: No hi ha garanties que aquesta clau pertanya realment al seu\n"
+#~ "propietari però s'accepta de tota manera\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "la preferència %c%lu no és vàlida\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (signar i xifrar)\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Preparat per a generar un nou parell de claus %s.\n"
+#~ "              grandària mínima:  768 bits\n"
+#~ "      grandària predeterminada: 1024 bits\n"
+#~ "  grandària màxima aconsellada: 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA només permet claus entre 512 i 1024 bits\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "la clau és massa petita; 1024 bits és el mínim permés per a claus RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "la clau és massa petita; 768 bits és el mínim permés.\n"
+
+# Jo tinc Deep Thought MMX a casa i m'ho fa en 42 segons.  ivb
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "la clau és massa llarga; %d és el màxim permés.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "No es recomanen claus més llargues de 2048 bits perquè\n"
+#~ "els càlculs són VERITABLEMENT llargs!\n"
+
+#~ msgid "Are you sure that you want this keysize? "
+#~ msgstr "Segur que voleu aquesta grandària? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "D'acord, però sapieu que la radiació del monitor i del teclat també son "
+#~ "molt vulnerables als atacs!\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: no s'ha pogut obrir: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: AVÍS: el fitxer és buit\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "clau %08lX: no és una clau rfc2440 - es descarta\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "NOTA: s'ha detectat una clau primària Elgamal - açò pot trigar un temps "
+#~ "en importar-se\n"
+
+#~ msgid " (default)"
+#~ msgstr " (predeterminat)"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "save"
+#~ msgstr "desa"
+
+#~ msgid "help"
+#~ msgstr "ajuda"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "list"
+#~ msgstr "llista"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "clau"
+
+#~ msgid "check"
+#~ msgstr "comprova"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "signa la clau irrevocablement"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "signa la clau localment i irrevocablement"
+
+#~ msgid "debug"
+#~ msgstr "depura"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "primary"
+#~ msgstr "primari"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  creada: %s caduca: %s"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! la subclau ha estat revocada: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- s'ha trobat una revocació falsa\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? hi ha problemes en la comprovació de la revocació: %s\n"
+
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %08lX at %s\n"
+#~ msgstr ""
+#~ "»\n"
+#~ "signat localment amb la vostra clau %08lX el %s\n"
+
+#~ msgid "   signed by %08lX at %s%s%s\n"
+#~ msgstr "   signat per %08lX el %s%s%s\n"
+
+#~ 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"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "aquest algoritme de xifratge està desaconsellat; useu-ne un de més "
+#~ "estàndard!\n"
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "no s'ha pogut obtenir del servidor la clau: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "error mentre s'enviava a «%s»: %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "l'enviament a «%s» ha tingut èxit (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "l'enviament a «%s» ha fallat: status=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "aquest servidor de claus no suporta --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "no es pot cercar el servidor de claus: %s\n"
+
+# Werner FIXME: Settle on Elgamal or ElGamal. jm
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "clau %08lX: aquesta és una clau ElGamal que NO és segura per a "
+#~ "signatures!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la clau %08lX s'ha creat %lu segon en el futur (salt en el temps o "
+#~ "problemes\n"
+#~ "amb el rellotge)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la clau %08lX s'ha creat %lu segons en el futur (salt en el temps o "
+#~ "problemes\n"
+#~ "amb el rellotge)\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: no s'ha pogut accedir: %s\n"
+
+# blocatge? ivb
+# yep. jm
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: no s'ha pogut crear el blocatge\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: no s'ha pogut crear el blocatge\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: no s'ha pogut crear: %s\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "s'ha marcat la clau %08lX com confiada absolutament\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "s'omet la signatura de la clau de signatura Elgamal %08lX a %08lX\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "s'omet la signatura de %08lX a la clau de signatura Elgamal %08lX\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "s'està comprovant en profunditat %d signat=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/"
+#~ "%d/%d\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: no s'ha pogut crear el directori: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Si voleu utilitzar aquesta clau revocada de totes maneres, dieu «sí»."
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Seleccioneu l'algoritme a utilitzar.\n"
+#~ "\n"
+#~ "DSA (també conegut com a DSS) és el algorisme de signatura digital que "
+#~ "només\n"
+#~ "pot ser utilitzat per a signatures. Aquest és el algoritme suggerit "
+#~ "perquè\n"
+#~ "la comprovació de signatures DSA és molt més ràpida que les d'ElGamal.\n"
+#~ "\n"
+#~ "ElGamal és un algorisme que es pot utilitzar per a signatures i "
+#~ "xifratge.\n"
+#~ "OpenPGP distingueix entre 2 variants d'aquest algorisme: una de només "
+#~ "xifratge\n"
+#~ "i una de signatura+xifratge; en veritat és el mateix, però alguns "
+#~ "paràmetres\n"
+#~ "han de seleccionar-se d'una manera especial per a crear claus més "
+#~ "segures\n"
+#~ "per a signatures: aquest programa fa açò, però altres implementacions\n"
+#~ "d'OpenPGP no estan obligades a entendre la variant signatura+xifratge.\n"
+#~ "\n"
+#~ "La primera clau (primària) ha de ser sempre una clau que siga capaç de "
+#~ "signar;\n"
+#~ "aquesta és la raó per la qual la clau de només xifratge ElGamal no està\n"
+#~ "disponible en aquest menú."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Encara que aquestes claus estan definides en RFC2440, no es recomanen\n"
+#~ "perquè no tots els programes hi poden treballar i perquè les\n"
+#~ "signatures que generen són molt llargues i lentes de verificar."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "fins ara s'han comprovat %lu claus (%lu signature)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "clau incompleta\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "la clau %08lX és incompleta\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "no es pot fet això en mode desatès\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "no es pot obrir el fitxer: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "error: falten dos punts\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "error: no hi ha cap valor de confiança\n"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (signar i xifrar)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "L'ús d'aquest algorisme només està suportat per GnuPG. No podreu "
+#~ "utilitzar aquesta clau per a comunicar-vos amb usuaris de PGP. Aquest "
+#~ "algorisme també és molt lent, i potser no és tan segur com les altres "
+#~ "alternatives.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Voleu crear la clau de tota manera? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "algoritme de clau simètric invàlid detectat (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "aquest servidor de clau no és completament compatible amb HKP\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr ""
+#~ "L'ús d'aquest algoritme està desaconsellat - el voleu crear igualment? "
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NOM=VALOR|usa aquesta notació de dades"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr ""
+#~ "el primer caràcter de la notació ha de ser una lletra o un subratllat\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr "els punts han d'estar envoltats per altres caràcters\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "AVÍS: Aquesta clau ja te un photo ID.\n"
+#~ "        Afegir un altre photo ID pot confondre algunes versions de PGP.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Només podeu tenir un photo ID en una clau.\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "        Empremta digital:"
+
+#~ msgid "you have to start GnuPG again, so it can read the new options file\n"
+#~ msgstr ""
+#~ "heu d'executar GnuPG de nou per que puga llegir el nou fitxer d'opcions\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "no s'han pogut canviar els permissos de «%s»: %s\n"
+
+#~ msgid "too many random bits requested; the limit is %d\n"
+#~ msgstr "massa bits aleatoris sol·licitats; el límit és %d\n"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NOMS]|comprova la base de dades de confiança"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key user-id"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key user-id"
+
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-and-public-key user-id"
+
+#~ msgid "For info see http://www.gnupg.org"
+#~ msgstr "Si voleu més informació vegeu http://www.gnupg.org"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "sSmMqQ"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No s'ha trobat un camí de confiança vàlid a la clau. Vegem si podem\n"
+#~ "assignar valors de confiança no assignats.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No s'ha trobat un camí que condueixe a una de les nostres claus.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No s'han trobat certificats amb confiança no definida.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No s'ha canviat cap valor de confiança.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr ""
+#~ "%08lX: no hi ha informació per a calcular una probabilitat de confiança\n"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "es descarta: la clau pública ja s'ha especificat amb --encrypt-to\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: error en la comprovació de la clau: %s\n"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr "Segur que voleu crear una clau de signatura i xifratge? "
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "Realment necessiteu una clau tan llarga? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: no s'ha trobat l'usuari: %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "problema en la lectura del certificat: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr ""
+#~ "massa entrades en la memòria cau de claus desconegudes - desactivada\n"
+
+#~ msgid "secret key %08lX not imported (use %s to allow for it)\n"
+#~ msgstr "clau secreta %08lX no importada (utilitzeu %s per a permitir-ho)\n"
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "clau %08lX: la nostra còpia no té autosignatura\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: no s'ha trobat l'usuari\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr "es suposa MDC erroni a causa d'un bit crític desconegut\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "error al llegir el registre de directori per al LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr "lid %lu: s'esperava registre de directori, s'ha obtingut %d\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "no hi ha una clau primària per al LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "error al llegir clau primària per al LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "clau %08lX: la consulta del registre ha fallat\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "clau %08lX: ja es troba en la taula de claus de confiança\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "NOTE: la clau secreta %08lX no està protegida.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr "clau %08lX: les claus pública i secreta no coincideixen\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "clau %08lX.%lu: Enllaç de subclau correcta\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "clau %08lX.%lu: Enllaç de subclau invàlid: %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "clau %08lX.%lu: Revocació de clau vàlida\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "clau %08lX.%lu: Revocació de clau invàlida: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Auto-signatura correcta"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Auto-signatura invàlida"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr ""
+#~ "Es descarta una revocació d'ID d'usuari vàlida degut a una autosignatura "
+#~ "més recent"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Revocació d'ID d'usuari vàlida"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Revocació d'ID d'usuari invàlida"
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Certificat de revocació vàlid"
+
+#~ msgid "Good certificate"
+#~ msgstr "Certificat correcte"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Certificat de revocació invàlid"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Certificat invàlid"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "el registre de signatura %lu[%d] apunta a un registre incorrecte.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "certificat duplicat: esborrat"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "tdbio_search_dir ha fallat: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: la inserció ha fallat: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: la inserció ha fallat: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: inserit\n"
+
+#~ msgid "\t%lu keys with errors\n"
+#~ msgstr "\t%lu claus amb errors\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu claus inserides\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: registre de directori sense clau - es descarta\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "\\t%lu degut a noves claus públiques\n"
+
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu claus es descarta\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"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Ooops, no hi ha IDs\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr "check_trust: ha fallat la cerca en el registre de directori: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr ""
+#~ "clau %08lX: ha fallat la inserció en la base de dades de confiança: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "clau %08lX.%lu: inserida en la base de dades de confiança\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "clau %08lX.%lu: creada en el futur (salt en el temps o problema de\n"
+#~ "rellotge)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "clau %08lX.%lu: caducada el %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "clau %08lX.%lu: ha fallat la verificació de confiança: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr "problema al cercar «%s» en la base de dades de confiança: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr ""
+#~ "l'usuari «%s» no està en la base de dades de confiança - inserint-lo\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "no s'ha pogut posar «%s» en la base de dades de confiança - %s\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr "AVÍS: encara no es poden manejar registres de prefències llargs\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: no s'ha creat l'anell: %s\n"
+
+#~ msgid "RSA key cannot be used in this version\n"
+#~ msgstr "No es poden usar claus RSA en aquesta versió\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "No hi ha clau per a l'usuari\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "no hi ha clau secreta disponible per al desxifratge\n"
diff --git a/po/cs.gmo b/po/cs.gmo
new file mode 100644 (file)
index 0000000..d189725
Binary files /dev/null and b/po/cs.gmo differ
diff --git a/po/cs.po b/po/cs.po
new file mode 100644 (file)
index 0000000..8947f80
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,6324 @@
+# GnuPG Czech translation
+# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+#               2005 Free Software Foundation, Inc.
+# Magda Procházková <magda@math.muni.cz> 2001,
+# Roman Pavlik <rp@tns.cz> 2001, 2002, 2003, 2004, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg-1.3.92\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-11-26 09:12+0200\n"
+"Last-Translator: Roman Pavlik <rp@tns.cz>\n"
+"Language-Team: Czech <translations.cs@gnupg.cz>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "nemohu vygenerovat prvoèíslo s  pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "nemohu vygenerovat prvoèíslo s ménì ne¾ %d bity\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "nebyl detekován ¾ádný modul pro získání entropie\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "nelze zamèít `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "zapisuji tajný klíè do `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "nemohu otevøít `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "nemohu pou¾ít pøíkaz stat na `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' není normální soubor - ignoruji\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "poznámka: soubor random_seed je prázdný\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "VAROVÁNÍ: neplatná velikost random_seed - soubor nepou¾it\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "nemohu èíst `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "poznámka: soubor random_seed není aktualizován\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "nemohu vytvoøit `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "nemohu zapisovat do `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "nemohu zavøít `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "VAROVÁNÍ: pou¾itý generátor náhodných èísel není bezpeèný!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Generátor náhodných èísel je pouze atrapa, aby program mohl bì¾et,\n"
+"v ¾ádném pøípadì není kryptograficky bezpeèný!\n"
+"\n"
+"NEPOU®ÍVEJTE JAKÁKOLIV DATA VYTVOØENÁ TÍMTO PROGRAMEM!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Prosím èekejte, je nutné získat dostatek entropie. Aby jste se nenudili,\n"
+"mù¾ete na poèítaèi dìlat nìco jiného, zvý¹íte tak kvalitu entropie.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Nedostatek náhodných bajtù. Prosím, pracujte s operaèním systémem, abyste\n"
+"mu umo¾nili získat více entropie (je potøeba %d bajtù).\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "ulo¾ení fingerprintu se nezdaøilo: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "ulo¾ení datumu vytvoøení se nezdaøilo: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "ètení veøejného klíèe se nezdaøilo: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "odpovìï neobsahuje veøejný klíè\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "odpovìï neobsahuje RSA modulus\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "odpovìï neobsahuje veøejný RSA exponent\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "funkce PIN callback zkonèila chybou: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN pro CHV%d je pøíli¹ krátký; minimální délka je %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "verifikace CHV%d se nezdaøila: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "pøístup k administrátorským pøíkazùm není nakonfigurován\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "chyba pøi získání CHV z karty\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "karta je trvale uzamèena!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+"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 the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|PIN administrátora"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Nový PIN administrátora"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Nový PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "chyba pøi získání nového PINu: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "chyba pøi ètení aplikaèních dat\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "chyba pøi ètení fingerpritnu DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "klíè ji¾ existuje\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "existující klíè bude pøepsán\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "generování nového klíèe\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "chybí èasové razítko vytvoøení\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "schází RSA modulus nebo nemá velikost %d bitù\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "schází veøejný RSA exponent nebo je del¹í ne¾ %d bitù\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "schází RSA prime %s nebo nemá velikost %d bitù\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "nelze ulo¾it klíè: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "prosím poèkejte ne¾ bude klíè vygenerován ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "henerování klíèe se nezdaøilo\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "generování klíèe dokonèeno (%d sekund)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "neplatná struktura OpenPGP kraty (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "podpis %s, hashovací algoritmus %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "dosud vytvoøené podpisy: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Prosím vlo¾te PIN%%0A[podpis hotov: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+"ovìøení administrátorského PIN je nyní prostøednictvím tohoto pøíkazu "
+"zakázáno\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "pøístup na %s se nezdaøil - vadná OpenPGP karta?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ASCII kódování: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "neplatná hlavièka ASCII kódování: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "ASCII hlavièka: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "neplatná hlavièka podpisu v èitelném formátu\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "vnoøené podpisy v èitelném formátu\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "neoèekávaný ASCII armor: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "nesprávné oznaèení øádku mínusy: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "neplatný radix64 znak %02X byl pøeskoèen\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "pøedèasný konec souboru (¾ádné CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "pøedèasný konec souboru (¾ádné CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "¹patný formát CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "Chyba CRC; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "pøedèasný konec souboru (v patièce)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "chyba v patièce\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "nenalezena ¾ádná platná data ve formátu OpenPGP.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "neplatné kódování ASCII: øádek je del¹í ne¾ %d znakù\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"neplatný znak (quoted-printable) v ASCII kódování - pravdìpodobnì byl pou¾it "
+"¹patný MTA\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGp karta není dostupná: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "Nalezena OpenPGP karta èíslo %s\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "nelze provést v dávkovém módu\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Vá¹ výbìr? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[není nastaven]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "mu¾"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "¾ena"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "neuvedeno"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "není vy¾adováno"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "vy¾adováno"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Chyba: V souèasné verzi je povolenou pouze plain ASCII.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Chyba: Znak \"<\" nelze pou¾ít.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Chyba: Více mezer není povoleno.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Pøíjmení dr¾itele karty: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Jméno (køestní) dr¾itele karty: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Chyba: jméno a pøíjmení je pøíli¹ dlouhé (limit je %d znakù).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL pro získání veøejného klíèe: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Chyba: URL je pøíli¹ dlouhé (limit je %d znakù).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "chyba pøi ètení `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Login (jménu úètu): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Chyba: Login je pøíli¹ dlouhý (limit je %d znakù).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Privátní DO data: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Chyba: Privátní DO je pøíli¹ dlouhé (limit je %d znakù).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Jazykové pøedvolby: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Chyba: neplatná délka øetezce s pøedvolbami.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Chyba: neplatný znak v øetìzci s pøedvolbami\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Zadejte pohlaví: M - mu¾ské, F - ¾enské nebo stisnìte mezerník: "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Chyba: neplatná odpovìï.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA fingerprint: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Chyba: nesprávnì naformátovaný fingerprint.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "operace s klíèem není mo¾ná: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "toto není OpenPGP karta"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "chyba pøi získání informací o aktuálním klíèi: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Pøepsat existující klíè? (a/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Vytvoøit zálohu ¹ifrovacího klíèe mimo kartu? (A/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Pøepsat existující klíèe? (a/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Prosím nezapomeòte, ¾e tovární nastavení PINu je\n"
+"   PIN = `%s'     PIN administrátora = `%s'\n"
+"Toto nastavení mù¾ete zmìnit pøíkazem --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Prosím, vyberte druh klíèe, který chcete generovat:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Podepisovací klíè\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) ©ifrovací klíè\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Autentizaèní klíè\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Neplatný výbìr.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Prosím vyberte místo pro uchování klíèe:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "neznámý algoritmus pro ochranu klíèe\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "tajné èásti klèe nejsou dostupné\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "tajný klíè je na kartì ulo¾en\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "ukonèit toto menu"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "zobraz administrátorské pøíkazy"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "ukázat tuto pomoc"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "vypi¹ v¹echna dostupná data"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "zmìní jméno majitele karty"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "zmìní URL pro záskání klíèe"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "získá klíè specifikovaný v URL karty"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "zmìnit login name"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "zmìnit jazykové pøedvolby"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "zmìní pohlaví dr¾itele karty"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "vypsat fingerprint certifikaèní autority"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "zapnout/vypnout po¾adování PINu pøi ka¾dé self-sign operaci"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "vytvoøit nový pár klíèù"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "nabídka pro zmìnu anebo odblokování PINu"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "ovìø PIN a vypi¹ v¹echna data"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Pøíkaz> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "pouze administrátorské pøíkazy\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "administrátorské pøíkazy jsou povoleny\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "administrátorské pøíkazy nejsou povoleny\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Neplatný pøíkaz (zkuste \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "tajný klíè není dostupný"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "Prosím vo¾te kartu a stisknìte enter. Operaci zru¹íte stisknutím 'z': "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "smazání bloku klíèe se nezdaøilo:  %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Prosím vyjmìte kartu a vlo¾te jinou se seriovým èíslem:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+"Je-li nová karta pøipravena, stisknìte enter.  Operaci zru¹íte stisknutím "
+"'z': "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Vlo¾te nový PIN administrátora: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Vlo¾te nový PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Vlo¾te PIN administrátora: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Vlo¾te PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Opakujte tento PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN není zopakován správnì; zkuste to znovu"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "nelze otevøít `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output pro tento pøíkaz není platný\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "klíè \"%s\" nenalezen: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "chyba pøi ètení bloku klíèe: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(dokud neurèíte klíè jeho fingerprintem)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "bez parametru \"--yes\" to nemohu v dávkovém módu provést\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Smazat tento klíè ze souboru klíèù? (a/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Toto je tajný klíè! - opravdu smazat? (a/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "smazání bloku klíèe se nezdaøilo:  %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informace o dùvìryhodnosti vlastníka klíèe vymazány\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "existuje tajný klíè pro tento veøejný klíè \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+"abyste ho smazal(a), pou¾ijte nejprve parametr \"--delete-secret-key\".\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "chyba pøi vytváøení hesla: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "v módu S2K nelze pou¾ít symetrický ESK paket\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "pou¾ití ¹ifry: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' je ji¾ zkomprimován\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "VAROVÁNÍ: soubor `%s' je prázdný\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"v módu --pgp2 mù¾ete ¹ifrovat pouze RSA klíèem o délce 2048 bitù a ménì\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "ètu z `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "algoritmus IDEA nelze pou¾ít pro v¹echny klíèe, pro které ¹ifrujete.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"VAROVÁNÍ: vy¾ádaná symetrická ¹ifra %s (%d) nevyhovuje pøedvolbám pøíjemce\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"VAROVÁNÍ: vy¾ádaný komprimaèní algoritmus %s (%d) nevyhovuje pøedvolbám "
+"pøíjemce\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "vy¾ádaná symetrická ¹ifra %s (%d) nevyhovuje pøedvolbám pøíjemce\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "pou¾ití %s není v módu %s dovoleno\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s za¹ifrovaný pro: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s za¹ifrovaná data\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "za¹ifrováno neznámým algoritmem %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "VAROVÁNÍ: zpráva byla za¹ifrována slabým klíèem v symetrické ¹iføe.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problém se za¹ifrovaným paketem\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "spu¹tìní externího programu není podporováno\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "nemohu vytvoøit adresáø `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"volání externích programù je zakázáno, proto¾e file permissions nejsou\n"
+"nastaveny nebezpeènì\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"na této platformì jsou pøi volání externích programù vy¾adovány\n"
+"doèasné soubory (temp files)\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "nelze spustit program `%s': %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "nelze spustit shell `%s': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "systémová chyba pøi volání externího programu: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "neoèekávaný konec externího programu\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "nelze spustit externí program\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "nelze pøeèíst odpovìï externího programu: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "VAROVÁNÍ: nelze smazat doèasný soubor (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "VAROVÁNÍ: nelze smazat doèasný adresáø `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "Podpis bude oznaèen jako neodvolatelný (non-revocable).\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "pro \"%s\" nebyl nalezen ¾ádný revokaèní klíè\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revokovat klíè nebo vybrané podklíèe"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "odstranit nepou¾itelné èásti z klíèe"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "exportování tajného klíèe není povoleno\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "klíè %s: není chránìný - pøeskoèeno\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "klíè %s: PGP 2.x klíè - pøeskoèeno\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "klíè %s: podpis podklíèe na ¹patném místì - pøeskoèeno \n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "nelze ulo¾it klíè: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "VAROVÁNÍ: tajný klíè %s není chránìn pomocí simple SK checksum\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "VAROVÁNÍ: nebylo nic vyexportováno\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Pøíkazy:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[soubor]|vytvoøit podpis"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[soubor]|vytvoøit podpis v èitelném dokumentu"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "vytvoøit podpis oddìlený od dokumentu"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "¹ifrovat data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "¹ifrování pouze se symetrickou ¹ifrou"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "de¹ifrovat data (implicitnì)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifikovat podpis"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "vypsat seznam klíèù"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "vypsat seznam klíèù a podpisù"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "vypsat a zkontrolovat podpisy klíèù"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "vypsat seznam klíèù a fingerprintù"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "vypsat seznam tajných klíèù"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "vytvoøit nový pár klíèù"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "odstranit klíè ze souboru veøejných klíèù"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "odstranit klíè ze souboru tajných klíèù"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "podepsat klíè"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "podepsat klíè lokálnì"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "podepsat nebo modifikovat klíè"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "vytvoøit revokaèní certifikát"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportovat klíèe"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportovat klíèe na server klíèù"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importovat klíèe ze serveru klíèù"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "vyhledat klíèe na serveru klíèù"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "aktualizovat v¹echny klíèe ze serveru klíèù"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importovat/slouèit klíèe"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "vytisknout stav karty"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "zmìnit data na kartì"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "zmìnit PIN karty"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "aktualizovat databázi dùvìry"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [soubory]  vypi¹ hash"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Mo¾nosti:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "vytvoø výstup zakódovaný pomocí ASCII"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|JMÉNO|¹ifrovat pro JMÉNO"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+"pou¾ít tento id u¾ivatele pro podepsání\n"
+" nebo de¹ifrování"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+"|N|nastavit úrovìò komprimace N (0 - ¾ádná\n"
+" komprimace)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "pou¾ít kanonický textový mód"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "pou¾ít jako výstupní soubor"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "s dodateènými informacemi"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "neprovádìt ¾ádné zmìny"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "vy¾ádat potvrzení pøed pøepsáním"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "pou¾ít chování striktnì podle OpenPGP"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "generovat zprávu komplatibilní s PGP 2.x"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Pou¾ijte manuálové stránky pro kompletní seznam v¹ech pøíkazù a mo¾ností)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+" -se -r Bob [soubor]        podepsat a za¹ifrovat pro u¾ivatele Bob\n"
+" --clearsign [soubor]       vytvoøit podpis èitelného dokumentu\n"
+" --detach-sign [soubor]     vytvoøit podpis oddìlený od dokumentu\n"
+" --list-keys [jména]        vypsat klíèe\n"
+" --fingerprint [jména]      vypsat fingerprinty \n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Chyby oznamte, prosím, na adresu <gnupg-bugs@gnu.org>.\n"
+"Pøipomínky k pøekladu <rp@tns.cz>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Pou¾ití: gpg [mo¾nosti] [soubory] (-h pro pomoc)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntaxe: gpg [mo¾nosti] [soubory]\n"
+"podepsat, ovìøit, ¹ifrovat nebo de¹ifrovat\n"
+"implicitní operace závisí na vstupních datech\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Podporované algoritmy:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Veøejný klíè: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "©ifra: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Komprese: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "u¾ití: gpg [mo¾nosti]"
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "konfliktní pøíkazy\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no = podpis nalezen v definici skupiny `%s'\n"
+
+# g10/g10.c:1179#, c-format
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr ""
+"VAROVÁNÍ: vlastnictví domovského adresáøe není nastaveno bezpeènì `%s'\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr ""
+"VAROVÁNÍ: vlastnictví konfiguraèního souboru není nastaveno bezpeènì `%s'\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr ""
+"VAROVÁNÍ: vlastnictví roz¹iøujícího modulu není nastaveno bezpeènì `%s'\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr ""
+"VAROVÁNÍ: pøístupová práva pro domovský adresáøe nejsou bezpeèná `%s'\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr ""
+"VAROVÁNÍ: pøístupová práva pro konfiguraèní soubor nejsou bezpeèná `%s'\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "VAROVÁNÍ: pøístupová práva roz¹iøujícímu modulu nejsou bezpeèná `%s'\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"VAROVÁNÍ: vlastnictví adresáøe s domovkým adresáøem není nastaveno "
+"nebezpeènì `%s'\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"VAROVÁNÍ: vlastnictví adresáøe s konfiguraèním souborem není nastaveno "
+"nebezpeènì `%s'\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"VAROVÁNÍ: vlastnictví adresáøe s roz¹iøujícím modulem není nastaveno "
+"nebezpeènì `%s'\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"VAROVÁNÍ: pøístupová práva k adresáøi s domovským adresáøem nejsou nastavena "
+"bezpeènì `%s'\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"VAROVÁNÍ: pøístupová práva k adersáøi s konfiguraèním souborem nejsou "
+"nastavena bezpeènì `%s'\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"VAROVÁNÍ: pøístupová práva k adresáøi s roz¹iøujícím modulem nejsou "
+"nastavena bezpeènì `%s'\n"
+
+# c-format
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "neznámá konfiguraèní polo¾ka \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "V souboru tajných klíèù chybí odpovídající podpis\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "zadané URL preferovaného serveru klíèù je neplaté\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "pøepnout mezi vypisem seznamu tajných a veøejných klíèù"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "V souboru tajných klíèù chybí odpovídající podpis\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "POZNÁMKA: starý implicitní soubor s mo¾nostmi `%s ignorován'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "POZNÁMKA: neexistuje implicitní soubor s mo¾nostmi `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "soubor s mo¾nostmi `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "ètu mo¾nosti z `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "POZNÁMKA: %s není pro normální pou¾ití!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"¹ifra `%s' nebyla nahrána, proto¾e pøístupová práva nejsou nastavena "
+"bezpeènì\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' není platná doba expirace podpisu\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' není platná znaková sada\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "nelze zpracovat URL serveru klíèù\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: neplatný parametr pro server klíèù\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "neplatný parametr pro server klíèù\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: neplatný parametr pro import\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "neplatný parametr pro import\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: neplatný parametr pro export\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "neplatný parametr pro export\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: neplatný parametr pro výpis\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "neplatný parametr pro výpis\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "`%s' není platná doba expirace podpisu\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "zadané URL preferovaného serveru klíèù je neplaté\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "`%s' není platná doba expirace podpisu\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: neplatný parametr pro ovìøení\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "neplatný parametr pro ovìøení\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "nelze nastavit exec-path na %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: neplatný parametr pro ovìøení\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "VAROVÁNÍ: program mù¾e vytvoøit soubor core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "VAROVÁNÍ: %s pøepí¹e %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "Není dovoleno pou¾ívat %s s %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s nedává s %s smysl!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "POZNÁMKA: %s není v této verzi dostupné\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "nelze spustit s nebezpeènou pamìtí vzhledem k %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"v módu --pgp2 mù¾ete vytváøet pouze oddìlené podpisy nebo podpisy èitelné "
+"jako text\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "v módu --pgp2 nelze souèasnì ¹ifrovat a podepisovat\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "v módu --pgp2 musíte pou¾ít soubor (ne rouru).\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "¹ifrování zpráv v módu --pgp2 vy¾aduje algoritmus IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "vybraný ¹ifrovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "vybraný hashovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "vybraný komprimovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "vybraný hashovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "polo¾ka completes-needed musí být vìt¹í ne¾ 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "polo¾ka marginals-needed musí být vìt¹í ne¾ 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "polo¾ka max-cert-depth musí být v rozmezí od 1 do 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr ""
+"neplatná implicitní úroveò certifikace (default-cert-level); musí být 0, 1, "
+"2 nebo 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr ""
+"neplatná minimální úroveò certifikace (min-cert-level); musí být 0, 1, 2 "
+"nebo 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "POZNÁMKA: jednoduchý mód S2K (0) je dùraznì nedoporuèován\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "neplatný mód S2K; musí být 0, 1 nebo 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "neplatné defaultní pøedvolby\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "neplatné u¾ivatelské pøedvolby pro ¹ifrování\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "neplatné u¾ivatelské pøedvolby pro hashování\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "neplatné u¾ivatelské pøedvolby pro komprimaci\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s dosud není funkèní s %s\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "pou¾ití ¹ifrovacího algoritmu `%s' v módu %s dovoleno\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "pou¾ití hashovacího algoritmu `%s' v módu %s dovoleno\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "pou¾ití komprimaèního algoritmu `%s' v módu %s dovoleno\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "nemohu inicializovat databázi dùvìry: %s\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [jméno souboru]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [jméno souboru]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "symetrické ¹ifrování `%s' se nepovedlo: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [jméno souboru]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [jméno souboru]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "nelze pou¾ít --symmetric --encrypt s pøíkazem --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "nelze pou¾ít --symmetric --encrypt v módu %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [jméno souboru]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [jméno souboru]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [jméno souboru]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "nelze pou¾ít --symmetric --sign --encrypt s pøíkazem --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "nelze pou¾ít --symmetric --sign --encrypt v módu %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [jméno souboru]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [jméno souboru]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [jméno souboru]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id u¾ivatele"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id u¾ivatele"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id u¾ivatele [pøíkazy]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id u¾ivatele] [soubor s klíèi (keyring)]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "odeslání na keyserver se nezdaøilo: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "získání dat z keyserveru se nezdaøilo: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "export klíèe se nepodaøil: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "hledání na keyserveru se nezdaøilo: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "refresh dat na keyserveru se nezdaøil: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "dekódování z ASCII formátu selhalo: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "kódování do ASCII formátu selhalo: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "neplatný hashovací algoritmus `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[jméno souboru]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Zaènìte psát svou zprávu ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "zadané URL pro certifikaèní politiku je neplatné\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "zadané URL pro podepisovací politiku je neplatné\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "zadané URL preferovaného serveru klíèù je neplaté\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "pøíli¹ mnoho polo¾ek v bufferu veøejných klíèù - vypnuto\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[ID u¾ivatele nenalezeno]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+# c-format
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "Neplatný klíè %s zmìnìn na platný pomocí --always-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "neexistuje tajný podklíè pro veøejný klíè %s - ignorováno\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "pou¾ívám podklíè %s místo primárního klíèe %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "klíè %s: tajný klíè bez klíèe veøejného - pøeskoèeno\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "být o trochu víc tichý"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "ber klíèe z této klíèenky (keyringu)"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "pouze varování pøi konfliktu èasového razítka"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|zapsat informace o stavu do tohoto FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Pou¾ití: gpg [mo¾nosti] [soubory] (-h pro pomoc)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Syntaxe: gpg [volby] [souboru]\n"
+"Ovìøí podpisy proti známým, dùvìryhodným klíèùm\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Je na Vás, abyste zde pøiøadil(a) hodnotu; tato hodnota nebude nikdy\n"
+"exportována tøetí stranì. Potøebujeme ji k implementaci \"pavuèiny\n"
+"dùvìry\"; nemá to nic spoleèného s (implicitnì vytvoøenou) \"pavuèinou\n"
+"certifikátù\"."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Aby bylo mo¾né vybudovat pavuèinu dùvìry, musí GnuPG vìdìt, kterým klíèùm\n"
+"dùvìøujete absolutnì - obvykle to jsou ty klíèe, pro nì¾ máte pøístup\n"
+"k tajným klíèùm. Odpovìzte \"ano\", abyste nastavili tyto klíèe\n"
+"jako absolutnì dùvìryhodné\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Pokud pøesto chcete pou¾ít tento nedùvìryhodný klíè, odpovìzte \"ano\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Vlo¾te identifikátor adresáta, kterému chcete poslat zprávu."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Vyberte algoritmus, který chcete pou¾ít.\n"
+"\n"
+"DSA (alias DSS) je Digital Signature Algorithm a mù¾e být pou¾it pouze pro\n"
+"podepisování.\n"
+"\n"
+"Elgamal je pouze ¹ifrovací algoritmus.\n"
+"\n"
+"RSA mù¾e být pou¾it pro ¹ifrování anebo podepisování.\n"
+"\n"
+"První (primární) klíè musí být v¾dy klíè, pomocí kterého lze podepisovat."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Obecnì nelze doporuèit pou¾ívat stejný klíè pro ¹ifrování a podepisování\n"
+"Tento algoritmus je vhodné pou¾ít jen za jistých podmínek.\n"
+"Kontaktujte prosím nejprve bezpeènostního specialistu."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Vlo¾te délku klíèe"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Odpovìzte \"ano\" nebo \"ne\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Vlo¾te po¾adovanou hodnotu tak, jak je uvedeno v pøíkazovém øádku.\n"
+"Je mo¾né vlo¾it datum ve formátu ISO (RRRR-MM-DD), ale nedostanete\n"
+"správnou chybovou hlá¹ku - místo toho systém zkusí interpretovat\n"
+"zadanou hodnotu jako interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Vlo¾te jméno dr¾itele klíèe"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "prosím, vlo¾te e-mailovou adresu (nepovinné, ale velmi doporuèované)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Prosím, vlo¾te nepovinný komentáø"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  pro zmìnu názvu.\n"
+"C  pro zmìnu komentáøe.\n"
+"E  pro zmìnu e-mailové adresy.\n"
+"O  pro pokraèování generování klíèe.\n"
+"Q  pro ukonèení generování klíèe."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Jestli¾e chcete generovat podklíè, odpovìzte \"ano\" (nebo jen \"a\")."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Ne¾ podepí¹ete id u¾ivatele, mìli byste nejprve ovìøit, zda klíè\n"
+"patøí osobì, její¾ jméno je uvedeno v identifikátoru u¾ivatele.\n"
+"Je velmi u¾iteèné, kdy¾ ostatní vìdí, jak dùslednì jste provedl(a)\n"
+"takové ovìøení.\n"
+"\n"
+"\"0\" znamená, ¾e neuvádíte, jak dùslednì jste pravost klíèe ovìøil(a) \n"
+"\n"
+"\"1\" znamená, ¾e vìøíte tomu, ¾e klíè patøí osobì, která je uvedena,\n"
+"    v u¾ivatelském ID, ale nemohl jste nebo jste neprovìøil tuto "
+"skuteènost.\n"
+"    To je u¾iteèné pro \"osobní\" verifikaci, kdy¾ podepisujete klíèe, "
+"které\n"
+"    pou¾ívají pseudonym u¾ivatele.\n"
+"\n"
+"\"2\" znamená, ¾e jste èásteènì ovìøil pravost klíèe. Napø. jste ovìøil\n"
+"    fingerprint klíèe a zkontroloval identifikátor u¾ivatele\n"
+"    uvedený na klíèi s fotografickým id.\n"
+"\n"
+"\"3\" Znamená, ¾e jste provedl velmi peèlivì ovìøení pravosti klíèe.\n"
+"    To mù¾e napøíklad znamenat, ¾e jste ovìøil fingerprint klíèe \n"
+"    jeho vlastníka osobnì a dále jste pomocí obtí¾nì padìlatelného \n"
+"    dokumentu s fotografií (napøíklad pasu) ovìøil, ¾e jméno majitele\n"
+"    klíèe se shoduje se jménem uvedeným v u¾ivatelském ID a dále jste \n"
+"    ovìøil (výmìnou elektronických dopisù), ¾e elektronické adresa uvedená \n"
+"    v ID u¾ivatele patøí majiteli klíèe.\n"
+"\n"
+"Prosím nezapomeòte, ¾e pøíklady uvedené pro úroveò 2 a 3 jsou *pouze*\n"
+"pøíklady.\n"
+"Je jen na Va¹em rozhodnutí co \"èásteèné\" a \"peèlivé\" ovìøení znamená\n"
+"kdy¾ budete podepisovat klíèe jiným u¾ivatelùm.\n"
+"\n"
+"Pokud nevíte, jaká je správná odpovìï, odpovìzte \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+"Pokud chcete podepsat V©ECHNY identifikátory u¾ivatelù, odpovìzte \"ano\""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Pokud opravdu chcete smazat tento identifikátor u¾ivatele, odpovìzte \"ano"
+"\".\n"
+"V¹echny certifikáty budou také ztraceny!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Odpovìzte \"ano\", pokud chcete smazat podklíè"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Toto je platný podpis klíèe; normálnì nechcete tento podpis smazat,\n"
+"proto¾e mù¾e být dùle¾itý pøi vytváøení dùvìry klíèe nebo jiného klíèe\n"
+"ceritifikovaného tímto klíèem."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Tento podpis nemù¾e být ovìøen, proto¾e nemáte odpovídající veøejný klíè.\n"
+"Jeho smazání byste mìl(a) odlo¾it do doby, ne¾ budete znát, který klíè\n"
+"byl pou¾it, proto¾e tento podpisovací klíè mù¾e vytvoøit dùvìru\n"
+"prostøednictvím jiného ji¾ certifikovaného klíèe."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "Podpis je neplatný. Je rozumné ho odstranit z Va¹eho souboru klíèù."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Toto je podpis, který vá¾e identifikátor u¾ivatele ke klíèi. Obvykle\n"
+"není dobré takový podpis odstranit. GnuPG nemù¾e tento klíè nadále\n"
+"pou¾ívat. Udìlejte to jenom v pøípadì, kdy je tento podpis klíèe\n"
+"jím samým z nìjakého dùvodu neplatný a kdy je k dipozici klíè jiný."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Zmìnit pøedvolby pro v¹echny u¾ivatelské ID (nebo pouze pro oznaèené)\n"
+"na aktuální seznam pøedvoleb. Èasová razítka v¹ech dotèených podpisù\n"
+"klíèù jimi samotnými budou posunuty o jednu vteøinu dopøedu.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Prosím, vlo¾te heslo; toto je tajná vìta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Prosím, zopakujte poslední heslo, abyste si byl(a) jistý(á), co jste \n"
+" napsal(a)."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Zadejte název souboru, ke kterému se podpis vztahuje"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Pokud si pøejete pøepsání souboru, odpovìzte \"ano\""
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Prosím, vlo¾te nový název souboru. Pokud pouze stisknete RETURN, bude\n"
+"pou¾it implicitní soubor (který je ukázán v závorkách)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Mìl(a) byste specifikovat dùvod certifikace. V závislosti na kontextu\n"
+"máte mo¾nost si vybrat ze seznamu:\n"
+"  \"Klíè byl kompromitován\"\n"
+"      Toto pou¾ijte, pokud si myslíte, ¾e k Va¹emu tajnému klíèi získaly\n"
+"       pøístup neoprávnìné osoby.\n"
+"  \"Klíè je nahrazen\"\n"
+"      Toto pou¾ijte, pokud jste tento klíè nahradil(a) novìj¹ím klíèem.\n"
+"  \"Klíè se ji¾ nepou¾ívá\"\n"
+"      Toto pou¾ijte, pokud tento klíè ji¾ nepou¾íváte.\n"
+"  \"Identifikátor u¾ivatele u¾ není platný\"\n"
+"      Toto pou¾ijte, pokud by se identifikátor u¾ivatele u¾ nemìl pou¾ívat;\n"
+"      normálnì se pou¾ívá k oznaèení neplatné e-mailové adresy.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Pokud chcete, mù¾ete vlo¾it text popisující pùvod vzniku tohoto revokaèního\n"
+"ceritifikátu. Prosím, struènì. \n"
+"Text konèí prázdným øádkem.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Pomoc není k dispozici"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Pomoc není dostupná pro '%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "aktualizovat databázi dùvìry"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "veøejný klíè neodpovídá tajnému klíèi!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "odstranit nepou¾itelné èásti z klíèe"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "blok typu %d byl pøeskoèen\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu klíèe byly doposud zpracovány\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Celkový poèet zpracovaných klíèù: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "     pøeskoèeny nové klíèe: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          bez ID u¾ivatele: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                 importováno: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                 beze zmìn: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "         nové ID u¾ivatelù: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "             nové podklíèe: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "              nové podpisy: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "       nové revokace klíèù: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      pøeètené tajné klíèe: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "   importované tajné klíèe: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "     tajné klíèe nezmìnìny: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "             neimportováno: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "         odstranìné podpisy: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr " odstranìné u¾ivatelské ID: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "VAROVÁNÍ: klíè %s obsahuje preference pro algoritmy,\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "které nesjou k dispozici. Táká se to tìchto user ID:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": preference pro ¹ifrovací algortimus %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": preference pro podepisovací algoritmus %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         \"%s\": preference pro komprimaèní algoritmus %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "velmi doporuèujeme aktualiaci nastavení va¹ich preferencí a\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"distribuci tohoto klíèe aby jste pøede¹el problémùm s neshodou algoritmù\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "nelze aktualizovat preference s: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "klíè %s: chybí identifikátor u¾ivatele\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "klíè %s: PKS po¹kození podklíèe opraveno\n"
+
+# c-format
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "klíè %s: pøijat id u¾ivatele \"%s\",který není podepsán jím samým\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "klíè %s: chybí platný identifikátor u¾ivatele\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "mù¾e to být zpùsobeno chybìjícím podpisem klíèe jím samým\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "klíè %s: veøejný klíè nenalezen: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "klíè %s: nový klíè - pøeskoèen\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "nenalezen zapisovatelný soubor klíèù (keyring): %s\n"
+
+# g10/import.c:766 g10/openfile.c:261#, c-format
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "zapisuji do '%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "chyba pøi zápisu souboru klíèù (keyring)  `%s': %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "klíè %s: veøejný klíè \"%s\" importován\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "klíè %s: neodpovídá na¹í kopii\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "klíè %s: nemohu najít originální blok klíèe: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "klíè %s: nemohu èíst originální blok klíèe: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "klíè %s: \"%s\" 1 nový identifikátor u¾ivatele\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "klíè %s: \"%s\" %d nových identifikátorù u¾ivatele\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "klíè %s: \"%s\" 1 nový podpis\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "klíè %s: \"%s\" %d nových podpisù\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "klíè %s: \"%s\" 1 nový podklíè\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "klíè %s: \"%s\" %d nových podklíèù\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "klíè %s: \"%s\" %d podpisù odstranìno\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "klíè %s: \"%s\" %d podpisù odstranìno\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "klíè %s: \"%s\" %d ID u¾ivatele odstranìno\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "klíè %s: \"%s\" %d ID u¾ivatele odstranìno\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "klíè %s: \"%s\" beze zmìn\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "klíè %s: tajný klíè s neplatnou ¹ifrou %d - pøeskoèeno\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "import tajných klíèù není povolen\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "není nastaven implicitní soubor tajných klíèù %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "klíè %s: tajný klíè importován\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "klíè %s: je ji¾ v souboru tajných klíèù\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "klíè %s: nenalezen tajný klíè: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "klíè %s: chybí veøejný klíè - nemohu aplikovat revokaèní certifikát\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "klíè %s: neplatný revokaèní certifikát: %s - zamítnuto\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "klíè %s: \"%s\" revokaèní certifikát importován\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "klíè %s: neexistuje id u¾ivatele pro podpis\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"klíè %s: nepodporovaný algoritmus veøejného klíèe u u¾ivatelského id  \"%s"
+"\"\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "klíè %s neplatný podpis klíèe jím samým u u¾ivatelského id \"%s\"\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "klíè %s: neexistuje podklíè pro vázání klíèù\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "klíè %s: nepodporovaný algoritmus veøejného klíèe\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "klíè %s: neplatná vazba podklíèe\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "klíè %s: smazána vícenásobná vazba podklíèe\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "klíè %s: neexistuje podklíè pro revokaci klíèe\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "klíè %s: neplatný revokaèní podklíè\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "klíè %s: smazána vícenásobná revokace podklíèe\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "klíè %s: pøeskoèen identifikátor u¾ivatele \"%s\"\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "klíè %s: podklíè pøeskoèen\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "klíè %s: podpis není exportovatelný (tøída %02X) - pøeskoèeno\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "klíè %s: revokaèní certifikát na ¹patném místì - pøeskoèeno \n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "klíè %s: neplatný revokaèní certifikát: %s - pøeskoèen\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "klíè %s: podpis podklíèe na ¹patném místì - pøeskoèeno \n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "klíè %s: neoèekávaná podpisová tøída (0x%02X) - pøeskoèeno\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "klíè %s: objeven duplikovaný identifikátor u¾ivatele - slouèen\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"VAROVÁNÍ: klíè %s mù¾e být revokován: zkou¹ím získat revokaèní klíè %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "VAROVÁNÍ: klíè %s mù¾e být revokován: revokaèní klíè %s nenalezen.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "klíè %s: \"%s\" pøidán revokaèní certifikát\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "klíè %s: podpis klíèe jím samým (direct key signature) pøidán\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "POZNÁMKA: S/N klíèe neodpovídá S/N karty\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "POZNÁMKA: primární klíè je online a je ulo¾en na kartì\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "POZNÁMKA: sekundární klíè je online a je ulo¾en na kartì\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "chyba pøi vytváøení souboru klíèù (keyring)`%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "soubor klíèù (keyring) `%s' vytvoøen\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "zdroj bloku klíèe `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "selhalo obnovení vyrovnávací pamìti klíèù: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revokace]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[podpis klíèe jím samým]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 ¹patný podpis\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d ¹patných podpisù\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 podpis neovìøen, proto¾e chybí klíè\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d podpisù neovìøených, proto¾e chybí klíè\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 podpis neovìøen, proto¾e vznikla chyba\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d podpisù neovìøených, proto¾e vznikly chyby\n"
+
+#: g10/keyedit.c:357
+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"
+
+#: g10/keyedit.c:359
+#, 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"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Prosím rozhodnìte, nakolik dùvìøete tomuto u¾ivateli, ¾e správnì\n"
+"verifikuje klíèe jiných u¾ivatelù (prohlédnutím cestovních pasù,\n"
+"kontrolou fingerprintù z rùzných zdrojù...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Dùvìøuji èásteènì\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Dùvìøuji úplnì\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Prosím vlo¾te hloubku dùvìry (depth trust) k tomuto podpisu.\n"
+"Hloubka vìt¹í ne¾ 1 umo¾òuje klíèùm, které jste podepsal\n"
+"podepsat jiný klíè, který bude pro Vás dùvìryhodný.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+"Prosím vlo¾te doménu, pro kterou je podpis omezen nebo stisknìte enter pro "
+"podpis bez omezení na doménu.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "U¾ivatelské ID \"%s\" je revokováno."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Jste si jistý(á), ¾e stále chcete podepsat tento klíè? (a/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Nelze podepsat.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Vypr¹ela platnost u¾ivatelského ID \"%s\"."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "ID u¾ivatele \"%s\" není podepsáno jím samým."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "ID u¾ivatele \"%s\" je pøipraveno k podpisu."
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Podepsat? (a/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Podpis klíèe \"%s\" jím samým je\n"
+"podpis formátu PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Pøejete si jej zmìnit na formát OpenPGP? (a/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Platnost Va¹eho podpisu na \"%s\"\n"
+"vypr¹ela.\n"
+"\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Chcete vytvoøit nový podpis a nahradit jím ten, jeho¾ platnost vypr¹ela? (a/"
+"N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Va¹ souèasný podpis na \"%s\"\n"
+"je pouze lokální.\n"
+"\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Pøejete si jej zmìnit na plnì exportovatelný podpise? (a/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" je ji¾ lokálnì podepsán klíèem %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" je ji¾ podepsán klíèem %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Chcete klíè pøesto znova podepsat? (a/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nic k podepsání klíèem %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Platnost klíèe vypr¹ela!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Platnost klíèe vypr¹í %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Chcete, aby platnost Va¹eho podpisu vypr¹ela ve stejnou dobu? (A/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Nemù¾ete udìlat OpenPGP podpis klíèe typu PGP 2.x, kdy¾ jste v --pgp2 módu.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "To by zpùsobilo nepou¾itelnost klíèe v PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"S jakou jistotou jste provìøili, ¾e klíè, který chcete podepsat\n"
+"patøí vý¹e uvedené osobì.\n"
+"Pokud neznáte odpovìï, zadejte \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Neodpovím.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Nijak jsem to nekontroloval(a).%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Èásteènì jsem to ovìøil(a).%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Velmi peèlivì jsem to ovìøil(a).%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Va¹ výbìr? (pro více informací vlo¾te '?'): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Jste si jistý(á), ¾e chcete podepsat tento klíè\n"
+"svým klíèem \"%s\" (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Jedná se o podpis klíèe jím samým.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "VAROVÁNÍ: podpis nebude oznaèen jako neexportovatelný.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "VAROVÁNÍ: podpis nebude oznaèen jako neodvolatelný (non-revocable).\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "Podpis bude oznaèen jako neexportovatelný.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "Podpis bude oznaèen jako neodvolatelný (non-revocable).\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "Nijak jsem tento klíè neovìøil.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "Èásteènì jsem ovìøil tento klíè.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "Velmi peèlivì jsem ovìøil tento klíè.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Skuteènì podepsat? (a/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "podepsání selhalo: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+"K dispozici je jen kontrolní souèet klíèe nebo je klíè na kartì - passphrase "
+"nelze zmìnit.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Tento klíè není chránìný.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Tajné èásti primárního klíèe nejsou dostupné.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Tajná èást primárního klíèe jsou ulo¾eny na kartì.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Klíè je chránìný.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Není mo¾né editovat tento klíè: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Vlo¾te nové heslo (passphrase) pro tento tajný klíè.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "heslo není zopakováno správnì; zkuste to znovu"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Nechcete heslo - to *není* dobrý nápad!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Opravdu to chcete udìlat? (a/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "pøesunuji podpis klíèe na správné místo\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "ulo¾it a ukonèit"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "vypsat fingerprint klíèe"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "vypsat seznam klíèù a id u¾ivatelù"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "vyberte identifikátor u¾ivatele N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "vyberte podklíè N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "kontrolovat podpisy"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "podepsat vybrané ID u¾ivatele [* ní¾e jsou uvedeny relevantní pøíkazy]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "podepsat vybrané u¾ivatelské ID lokálnì"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "podepsat vybrané u¾ivatelské ID dùvìryhodným podpisem"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "podepsat vybrané u¾ivatelské ID nerevokovatelným podpisem"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "pøidat identifikátor u¾ivatele"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "pøidat fotografický ID"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "smazat vybrané ID u¾ivatele"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "pøidat podklíèy"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "pøidat klíè na kartu"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "pøesunout klíè na kartu"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "pøesunout zálo¾ní klíè na kartu"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "smazat vybrané podklíèe"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "pøidat revokaèní klíè"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "smazat podpisy z vybraných u¾ivatelských ID"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "zmìnit datum expirace pro klíè nebo vybrané podklíèe"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "oznaèit vybrané u¾ivatelské ID jako primární"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "pøepnout mezi vypisem seznamu tajných a veøejných klíèù"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "vypsat seznam pøedvoleb (pro experty)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "vypsat seznam pøedvoleb (podrobnì)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "nastavit sadu preferencí pro vybrané u¾ivatelské ID"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "nastavit URL preferovaného server klíèù pro vybrané u¾ivatelské ID"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "nastavit sadu preferencí pro vybrané u¾ivatelské ID"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "zmìnit heslo"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "zmìnit dùvìryhodnost vlastníka klíèe"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "revokovat podpisu na vybraných u¾ivatelských ID"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "revokovat vybrané u¾ivatelské ID"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "revokovat klíè nebo vybrané podklíèe"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "nastavit klíè jako platný (enable)"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "nastavit klíè jako neplatný (disable)"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "ukázat vybrané fotografické ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "chyba pøi ètení bloku tajného klíèe \"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Tajný klíè je dostupný.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Pro provedení této operace je potøeba tajný klíè.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Prosím, nejdøíve pou¾ijte pøíkaz \"toggle\" (pøepnout).\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* Pøíkaz `sign' mù¾e být pou¾it s prefixem `l' pro lokální podpis (lsign),\n"
+"  s prefixem `t' pro dùvìryhodný podpis (tsign) nebo `nr' pro neodvolatený "
+"podpis\n"
+"  (nrsign) nebo libovolnou jejich kombinací  (ltsign, tnrsign, atd.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Klíè revokován."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Opravdu podepsat v¹echny id u¾ivatele? (a/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Nápovìda: Vyberte id u¾ivatele k podepsání\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Neznámý typ podpisu `%s'\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Tento pøíkaz není v módù %s dovolený.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Musíte vybrat alespoò jeden id u¾ivatele.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Nemù¾ete smazat poslední id u¾ivatele!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Opravdu odstranit v¹echny vybrané id u¾ivatele? (a/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Opravdu odstranit tento id u¾ivatele? (a/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Opravdu pøesunout primární klíè? (a/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Musíte vybrat právì jeden klíè.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "Pøíkaz oèekává jméno souboru jako argument\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Nemohu otevøít `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Chyba pøi ètení zálo¾ního klíèe z `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Musíte vybrat alespoò jeden klíè.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Opravdu chcete smazat vybrané klíèe? (a/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Opravdu chcete smazat tento klíè? (a/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Opravdu revokovat v¹echny vybrané id u¾ivatele? (a/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Opravdu revokovat tento id u¾ivatele? (a/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Opravdu chcete revokovat celý klíè? (a/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Opravdu chcete revokovat vybrané podklíèe? (a/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Opravdu chcete revokovat tento podklíè? (a/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"Dùvìryhodnost vlastníka nelze mìnit je-li pou¾ívána databáze dùvìry "
+"poskytnutá u¾ivatelem\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Nastavit seznam pøedvoleb:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Opravdu aktualizovat pøedvolby pro vybraný id u¾ivatele? (a/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Opravdu aktualizovat pøedvolby? (a/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Ulo¾it zmìny? (a/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Ukonèit bez ulo¾ení? (a/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "aktualizace selhala: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "aktualizace tajného klíèe selhala: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Klíè nebyl zmìnìn, tak¾e není potøeba jej aktualizovat.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Hash: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Vlastnosti: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Keyserver bez modifikace"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Preferovaný keyserver: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"Mo¾nosti:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "U¾ivatelský ID formátu PGP 2.x nemá ¾ádné pøedvolby\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "V %s tento klíè revokoval %s klíèem %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Tento klíè mù¾e být revokován %s klíèem %s "
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(citlivá informace)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "vytvoøen: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "revokován: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "platnost skonèila: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "platnost skonèí: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "pou¾ití: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "dùvìra: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "platnost: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Tento klíè byl oznaèen za neplatný (disabled)"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "èíslo karty: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Prosím nezapomeòte, ¾e zobrazované údaje o platnosti klíèù nemusí\n"
+"být nutnì správné, dokud znova nespustíte program.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "revokován"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "platnost skonèila"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"VAROVÁNÍ: ¾ádné u¾ivatelské ID nebylo oznaèeno jako primární.  Tento pøíkaz\n"
+"              mù¾e zpùsobit, ¾e za primární bude pova¾ováno jiné user ID.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"VAROVÁNÍ: Toto je PGP2 klíè. Pøidání fotografického ID mù¾e v nìkterých\n"
+"         verzích PGP vést k odmítnutí tohoto klíèe.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Jste si jistý, ¾e jej chcete stále pøidat? (a/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Nemìli by jste pøidávat fotografický ID k PGP2 klíèi.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Smazat tento dobrý podpis? (a/N/u)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Smazat tento neplatný podpis? (a/N/u)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Smazat tento neznámý podpis? (a/N/u)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Opravdu smazat tento podpis podepsaný sebou samým? (a/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Smazán %d podpis.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Smazáno %d podpisù.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nic nebylo smazáno.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "neplatný"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "U¾ivatelské ID \"%s\": je ji¾ odstranìno.\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "klíè %s: \"%s\" %d podpisù odstranìno\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "klíè %s: \"%s\" %d podpisù odstranìno\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "U¾ivatelské ID \"%s\": je ji¾ odstranìno.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "U¾ivatelské ID \"%s\": je ji¾ odstranìno.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"VAROVÁNÍ: Toto je PGP2 klíè. Pøidání 'povìøení revokace' mù¾e v nìkterých\n"
+"          verzích PGP vést k odmítnutí tohoto klíèe.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Nemìli by jste pøidávat 'povìøení revokace' k PGP2 klíèi.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Vlo¾te identifikátor u¾ivatele povìøeného revokací: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "klíè formátu PGP 2.x nelze povìøit revokací\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "klíè nelze povìøit revokací jím samým\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "tento klíè ji¾ bykl povìøen revokací\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"VAROVÁNÍ: ustanovení klíèe 'povøeným revokátorem' je nevratná operace!\n"
+
+#: g10/keyedit.c:3464
+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) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Prosím, odstraòte výbìr z tajných klíèù.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Prosím, vyberte nejvý¹e jeden podklíè.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Mìním dobu expirace podklíèe.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Mìním dobu expirace primárního klíèe.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Nemù¾ete zmìnit dobu platnosti klíèe verze 3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "V souboru tajných klíèù chybí odpovídající podpis\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "VAROVÁNÍ: podepisovací podklíè %s není køí¾ovì certifikován\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Prosím, vyberte právì jeden id u¾ivatele .\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "pøeskoèen v3 podpis klíèe jím samým u u¾ivatelského id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Vlo¾te URL preferovaného keyserveru: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Jste si jistý(á), ¾e jej chcete pøepsat? (a/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Jste si jistý(á), ¾e jej chcete smazat? (a/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Podepisovací notace: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Pøepsat (a/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Neexistuje identifikátor u¾ivatele s indexem %d\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Neexistuje u¾ivatelské ID s hashem %s\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "Neexistuje podklíè s indexem %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "id u¾ivatele:\"%s\"\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "podepsáno va¹ím klíèem %s v %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (neexportovatelné)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Platnost podpisu vypr¹í %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Jste si jistý, ¾e jej chcete stále revokovat? (a/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Vytvoøit pro tento podpis revokaèní certifikát? (a/N)"
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Podepsal(a) jste následující identifikátory u¾ivatele: %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (nerevokovatelné)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "revokováno va¹ím klíèem %s v %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Chystáte se revokovat tyto podpisy:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Opravdu vytvoøit revokaèní certifikáty? (a/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "neexistuje tajný klíè\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "U¾ivatelské ID \"%s\" je ji¾ revokováno.\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "VAROVÁNÍ: podpis ID u¾ivatele je datován %d sekund v budoucnosti\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Klíè %s je ji¾ revokován.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Podklíè %s je ji¾ revokován.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Zobrazuji %s fotografický ID o velikosti %ld pro klíè %s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "duplicita pøedvolby `%s'\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "pøíli¹ mnoho pøedvoleb pro ¹ifrování\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "pøíli¹ mnoho pøedvoleb pro vzorkování\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "pøíli¹ mnoho pøedvoleb pro komprimaci\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "neplatná polo¾ka `%s' v øetìzci s pøedvolbami\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "zapisuji podpis klíèe jím samým (direct signature)\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "zapisuji podpis klíèe sebou samým\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "zapisuji \"key-binding\" podpis\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "neplatná délka klíèe; pou¾iji %u bitù\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "délka klíèe zaokrouhlena na %u bitù\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Podepisování"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "©ifrování"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Autentizace"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsEeAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Pro klíè %s lze provést: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Aktuálnì povolené akce: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Zapnout/vypnout schopnost podepisovat\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Zapnout/vypnout schopnost ¹ifrovat\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Zapnout/vypnout schopnost autentizovat\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Konec\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Prosím, vyberte druh klíèe, který chcete:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA a ElGamal (implicitní)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (pouze pro podpis)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (nastavit si vlastní pou¾ití)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (pouze pro ¹ifrování)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (pouze pro podpis)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (pouze pro ¹ifrování)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (nastavit si vlastní pou¾ití)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Pár DSA klíèù DSA dlouhý %u bitù.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "klíè %s mù¾e mít délku v intervalu %u a¾ %u bitù.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Jakou délku klíèe si pøejete? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "velikost klíèe %s musí být v intervalu %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Po¾adovaná délka klíèe je %u bitù.\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "zaokrouhleno na %u bitù\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Prosím urèete, jak dlouho by klíè mìl platit.\n"
+"         0 = doba platnosti klíèe není omezena\n"
+"      <n>  = doba platnosti klíèe skonèí za n dní\n"
+"      <n>w = doba platnosti klíèe skonèí za n týdnù\n"
+"      <n>m = doba platnosti klíèe skonèí za n mìsícù\n"
+"      <n>y = doba platnosti klíèe skonèí za n let\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Prosím urèete, jak dlouho by mìl podpis platit.\n"
+"         0 = doba platnosti podpisu není omezena\n"
+"      <n>  = doba platnosti podpisu skonèí za n dní\n"
+"      <n>w = doba platnosti podpisu skonèí za n týdnù\n"
+"      <n>m = doba platnosti podpisu skonèí za n mìsícù\n"
+"      <n>y = doba platnosti podpisu skonèí za n let\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Klíè je platný pro? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Podpis je platný pro? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "neplatná hodnota\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Platnost klíèe nikdy neskonèí\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Platnost podpisu nikdy neskonèí\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Platnost klíèe skonèí v %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Platnost podpisu skonèí v %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Vá¹ systém neumí zobrazit data po roce 2038.\n"
+"V ka¾dém pøípadì budou data korektnì zpracovávána do roku 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Je to správnì (a/N)? "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Aby bylo mo¾né rozpoznat Vá¹ klíè, musíte znát identifikátor u¾ivatele;\n"
+"program jej slo¾í z Va¹eho jména a pøíjmení, komentáøe a e-mailu\n"
+"v tomto tvaru:\n"
+"    \"Magda Prochazkova (student) <magda@domena.cz>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Jméno a pøíjmení: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Neplatný znak ve jménì\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Jméno nemù¾e zaèínat èíslicí\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Jméno musí být dlouhé alespoò 5 znakù\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "E-mailová adresa: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Neplatná e-mailová adresa\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Komentáø: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Neplatný znak v komentáøi\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Pou¾íváte znakovou sadu `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Zvolil(a) jste tento identifikátor u¾ivatele:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Do pole jméno nebo komentáø nepi¹te, prosím, e-mailovou adresu.\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "jJkKeEPpUu"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Zmìnit (J)méno, (K)omentáø, (E)-mail nebo (U)konèit? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+"Zmìnit (J)méno, (K)omentáø, (E)-mail, (P)okraèovat dál nebo (U)konèit "
+"program? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Nejdøív, prosím, opravte chybu\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Musíme vytvoøit mnoho náhodných bajtù. Bìhem vytváøení mù¾ete\n"
+"provádìt nìjakou jinou práci na poèítaèi (psát na klávesnici, pohybovat "
+"my¹í,\n"
+"pou¾ívat disky); díky tomu má generátor lep¹í ¹anci získat dostatek "
+"entropie.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Vytváøení klíèe bylo zru¹eno.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "zapisuji veøejný klíè do `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "zapisuji tajný klíè do `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "zapisuji tajný klíè do `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "nenalezen zapisovatelný soubor veøejných klíèù (pubring): %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "nenalezen zapisovatelný soubor tajných klíèù (secring): %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "chyba pøi zápisu do souboru veøejných klíèù `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "chyba pøi zápisu do souboru tajných klíèù `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "veøejný a tajný klíè byly vytvoøeny a podepsány.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Tento klíè nemù¾e být pou¾itý pro ¹ifrování. K vytvoøení\n"
+"sekundárního klíèe pro tento úèel mù¾ete pou¾ít pøíkaz \"--edit-key\".\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Vytvoøení klíèe se nepodaøilo: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"klíè byl vytvoøen %lu sekund v budoucnosti (do¹lo ke zmìnì èasu nebo\n"
+"je problém se systémovým èasem)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"klíè byl vytvoøen %lu sekund v budoucnosti (do¹lo ke zmìnì èasu nebo\n"
+"je problém se systémovým èasem)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "POZNÁMKA: vytvoøení podklíèe pro klíèe v3 není v souladu s OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Opravdu vytvoøit? (a/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "ulo¾ení klíèe na kartu se nezdaøilo: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "nemohu vytvoøit zálohu souboru `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, 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"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "nikdy     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kritická podepisovací politika: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Podepisovací politika: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Kriticky preferovaný keyserver: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Kritická podepisovací notace: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Podepisovací notace: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "soubor klíèù (keyring)"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Primární fingerprint klíèe:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Fingerprint podklíèe:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Primární fingerprint klíèe:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Fingerprint podklíèe:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "      Fingerprint klíèe ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Seriové èíslo karty ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "pøejmenování `%s' na `%s' se nezdaøilo: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "VAROVÁNÍ: Existují dva soubory s tajnými informacemi.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s je beze zmìny\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s je nový\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Prosím, opravte tento mo¾ný bezpeènostní problém\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "cache souboru klíèù `%s'\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu klíèù ji¾ ulo¾eno v cache (%lu podpisù)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu klíèù ulo¾eno v cache (%lu podpisù)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: soubor klíèù (keyring) vytvoøen\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Vlo¾te URL preferovaného keyserveru: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "VAROVÁNÍ: volba `%s' pro server klíèù není na této platformì úèinná\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "disabled"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Vlo¾te èíslo (èísla), 'N' pro dal¹í nebo 'Q' pro konec> "
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "neplatný protokol serveru klíèù (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "klíè \"%s\" nebyl na serveru klíèù nalezen\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "klíè nebyl na serveru klíèù nalezen\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "po¾aduji klíè %s ze %s server %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "po¾aduji klíè %s z %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "vyhledávám \"%s\" na %s serveru %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "vyhledávám \"%s\" na serveru %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "posílám klíè %s na %s server %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "posílám klíè %s na %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "vyhledávám \"%s\" na %s serveru %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "vyhledávám \"%s\" na serveru %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "¾ádná operace se serverem klíèù!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "VAROVÁNÍ: keyserver handler z jiné verze GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "server klíèù neposlal VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "¾adný server klíèù není znám (pou¾íjte volbu --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "volání externího keyserver není v této verzi podporováno\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "protokol serveru klíèù `%s' není podporován\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "akce `%s' není podporována v protokolu `%s' serveru klíèù\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s nepodporuje protokol verze  %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "èasový limit pro server klíèù vypr¹el\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "interní chyba serveru klíèù\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "chyba komunikace se serverem klíèù: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "\"%s\" není ID klíèe: pøeskoèeno\n"
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "aktualizuji 1 klíè z %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "aktualizuji %d klíèù z %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "VAROVÁNÍ: nelze aktualizovat klíè %s prostøednictvím %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "VAROVÁNÍ: nelze aktualizovat klíè %s prostøednictvím %s: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "podivná velikost ¹ifrovacího klíèe pro sezení (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s za¹ifrovaný klíè sezení\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "heslo (passphraze) generováno s pou¾itím neznámého algoritmu %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "veøejný klíè je %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "data za¹ifrována veøejným klíèem: správný DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "za¹ifrována %u-bitovým %s klíèem, ID %s, vytvoøeným %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      \"%s\"\n"
+
+# Scripte scannen lt. dl1bke auf "ID (0-9A-F)+" deswegen muß "ID" rein :-(
+# [kw]
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "za¹ifrováno %s klíèem, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "de¹ifrování veøejným klíèem selhalo: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "za¹ifrováno s heslem %lu\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "za¹ifrováno jedním heslem\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "pøedpokládám %s ¹ifrovaných dat\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"algoritmus IDEA není dostupný; optimisticky se jej pokusíme nahradit "
+"algoritmem %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "de¹ifrování o.k.\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "VAROVÁNÍ: zpráva nebyla chránìna proti poru¹ení její integrity\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "VAROVÁNÍ: se za¹ifrovanou zprávou bylo manipulováno!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "de¹ifrování selhalo: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "POZNÁMKA: odesílatel po¾adoval (\"for-your-eyes-only\")\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "pùvodní jméno souboru='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"samostatný revokaèní certifikát -  pou¾ijte \"gpg --import\", chcete-li jej "
+"u¾ít\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Dobrý podpis od \"%s\""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verifikace podpisu potlaèena\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "neumím pracovat s tìmito násobnými podpisy\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Podpis vytvoøen %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               pou¾ití %s klíèe %s\n"
+
+# Scripte scannen lt. dl1bke auf "ID (0-9A-F)+" deswegen muß "ID" rein :-(
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Podpis vytvoøen %s pomocí klíèe %s s ID u¾ivatele %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Klíè k dispozici na: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "©PATNÝ podpis od \"%s\""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Podpis s vypr¹enou platností od \"%s\""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Dobrý podpis od \"%s\""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[nejistý]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                alias \"%s\""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Platnost podpisu skonèila %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Platnost podpisu skonèí %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "podpis %s, hashovací algoritmus %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binární formát"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "textový formát"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "neznámý formát"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Nemohu ovìøit podpis: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "toto není podpis oddìlený od dokumentu\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "VAROVÁNÍ: detekováno více podpisù. Kontrolován bude pouze první.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "samostatný podpis tøídy 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "podpis starého typu (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "nalezen neplatný koøenový paket v proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "nemohu vypnout vytváøení core souborù: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "fstat `%s' selhal na %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) selhal v %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "VAROVÁNÍ: pou¾ívám experimentální algoritmus veøejného klíèe %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "VAROVÁNÍ: pou¾ívám experimentální ¹ifrovací algoritmus %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "VAROVÁNÍ: pou¾ívám experimentální hashovací algoritmus %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "VAROVÁNÍ: vy¾ádaný algoritmus %s není doporuèen\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA modul pro GnuPG nenalezen\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "Více informací naleznete na adrese http://www.gnupg.cz/faq.html\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: pou¾ití parametru \"%s\" se nedoporuèuje\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "VAROVÁNÍ: pou¾ívání parametru \"%s\" se nedoporuèuje\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "pou¾ijte místo nìj \"%s%s\" \n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "VAROVÁNÍ: pou¾ívání pøíkaz \"%s\" se nedoporuèuje - nepou¾ívejte jej\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Nezakomprimováno"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "nezakomprimováno|nic"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "tato zpráva nemusí být s %s pou¾itelná\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "nejednoznaèné volby `%s'\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "neznámá volba `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Soubor `%s' existuje. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Pøepsat (a/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: neznámá pøípona\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Vlo¾te nový název souboru"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "zapisuji do standardního výstupu\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "pøedpokládám podepsaná data v `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "vytvoøen nový konfiguraèní soubor `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "VAROVÁNÍ: nastavení z `%s' nejsou pøi tomto spu¹tìní zatím aktivní\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "adresáø `%s' vytvoøen\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "nemohu pracovat s algoritmem veøejného klíèe %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "VAROVÁNÍ: potencionálnì nebezpeènì symetricky za¹ifrován klíè sezení\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "podpaket typu %d má nastavený kritický bit\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent není v tomto sezení dostupný\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "¹patný formát promìnné prostøedí GPG_AGENT_INFO\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent protokol verze %d není podporován\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "nemohu se pøipojit k `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problém s agentem - pou¾ívání agenta vypnuto\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr "(hlavní ID klíèe %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Potøebujete heslo, abyste odemknul(a) tajný klíè pro u¾ivatele:\n"
+"\"%.*s\"\n"
+"Klíè o délce %u bitù, typ %s, ID %s, vytvoøený %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Opakovat heslo\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Vlo¾it heslo\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "zru¹eno u¾ivatelem\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "v dávkovém re¾imu se nelze ptát na heslo\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Vlo¾te heslo: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Musíte znát heslo, abyste odemknul(a) tajný klíè pro\n"
+"u¾ivatele: \"%s\"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "délka %u bitù, typ %s, klíè %s, vytvoøený %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (podklíè na hlavním klíèi ID %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Opakujte heslo: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Vyberte obrázek, který bude pou¾it jako Va¹e fotografické ID.  Obrázek musí\n"
+"být ve formátu JPEG. Nezapomeòtì, ¾e obrázek bude ulo¾en ve Va¹em veøejném\n"
+"klíèi - velký obrázek bude mít za následek velmi velký veøejný klíè !\n"
+"Vhodná velikost obrázku je asi 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Vlo¾te jméno JPEG souboru s fotografickým ID: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "nelze otevøít JPEG soubor `%s': %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "Tento JPEG je opravdu velký (%d bajtù)!\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Jste si jistý(á), ¾e jej chcete pou¾ít? (a/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' není soubor ve formátu JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Je tato fotografie správná (a/N/u)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "nelze zobrazit photo ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Dùvod nebyl specifikován"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Klíè je nahrazen"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Klíè byl zkompromitován"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Klíè se ji¾ nepou¾ívá"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Identifikátor u¾ivatele ji¾ neplatí"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "dùvod pro revokaci: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "revokaèní poznámka: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMuUsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "Není pøiøazena ¾ádná hodnota dùvìry:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  alias \"%s\"\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Nakolik dùvìøujete tvrzení, ¾e tento klíè patøí uvedenému u¾ivateli?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Nevím nebo neøeknu\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Nedùvìøuji\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Dùvìøuji absolutnì\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr " m = zpìt do hlavního menu\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr " s = pøeskoèit tento klíè\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr " u = ukonèit\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"Minimální úroveò dùvìry tohoto klíèe je: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Va¹e rozhodnutí? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Opravdu chcete nastavit pro tento klíè absolutní dùvìru? (a/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certifikáty vedoucí k finálnímu dùvìryhodnému klíèi:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%s: Nic nenaznaèuje tomu, ¾e tento klíè patøí uvedenému u¾ivateli\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%s: Je zde èásteèná dùvìra, ¾e tento klíè patøí uvedenému uv¾ivateli\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Tento klíè pravdìpodobnì nále¾í uvedenému u¾ivateli\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Tento klíè nále¾í nám (máme odpovídající tajný klíè)\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NENÍ jisté, zda tento klíè patøí osobì, její¾ jméno je uvedeno\n"
+"v u¾ivatelském ID. Pokud *skuteènì* víte, co dìláte, mù¾ete na\n"
+"následující otázku odpovìdìt ano\n"
+"\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Pou¾ít pøesto tento klíè? (a/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "VAROVÁNÍ: Je pou¾it nedùvìryhodný klíè!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "VAROVÁNÍ: tento klíè mù¾e být revokován (revokaèní klíè nenalezen)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "VAROVÁNÍ: Tento klíè byl revokován klíèem s povìøením k revokaci!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "VAROVÁNÍ: Tento klíè byl revokován svým vlastníkem!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         To mù¾e znamenat, ¾e podpis je padìlaný.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "VAROVÁNÍ: Tento podklíè byl revokován svým vlastníkem!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Poznámka: Tento klíè byl oznaèen jako neplatný (disabled).\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Poznámka: Skonèila platnost tohoto klíèe!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "VAROVÁNÍ: Tento klíè není certifikován dùvìryhodným podpisem!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Nic nenaznaèuje tomu, ¾e tento podpis patøí vlastníkovi klíèe.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "VAROVÁNÍ: NEdùvìøujeme tomuto klíèi!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Tento podpis je pravdìpodobnì PADÌLANÝ.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"VAROVÁNÍ: Tento klíè není certifikován dostateènì dùvìryhodnými podpisy!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Není jisté, zda tento podpis patøí vlastníkovi.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: pøeskoèeno: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: pøeskoèeno: veøejný klíè je ji¾ obsa¾en v databázi\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Aktuální pøíjemci:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Napi¹te identifikátor u¾ivatele (user ID). Ukonèete prázdným øádkem: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Takový identifikátor u¾ivatele neexistuje.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "pøeskoèeno: veøejný klíè je u¾ nastaven podle implicitního adresáta\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Veøejný klíè je neplatný (disabled).\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "pøeskoèeno: veøejný klíè je ji¾ nastaven\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "neznámý implicitní adresát \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: pøeskoèeno: veøejný klíè je neplatný (disabled)\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "¾ádné platné adresy\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "chyba pøi vytváøení `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Podpis oddìlený od dokumentu.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Prosím, vlo¾te název datového souboru: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "ètu standardní vstup ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "chybí podepsaná data\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "nemohu otevøít podepsaná data '%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonymní adresát; zkou¹ím tajný klíè %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "o.k., my jsme anonymní adresát.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "staré kódování DEK není podporováno\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "¹ifrovací algoritmus %d%s je neznámý nebo je zneplatnìn\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "VAROVÁNÍ: v pøedvolbách pøíjemce nenalezen ¹ifrovací algoritmus %s\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "POZNÁMKA: platnost tajného klíèe %s skonèila %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "POZNÁMKA: klíè byl revokován"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "selhalo vytvoøení paketu (build_packet): %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "klíè %s: chybí identifikátor u¾ivatele\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Revokován:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Toto je citlivý revokaèní klíè)\n"
+
+#: g10/revoke.c:316
+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)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "naøízen výstup do formátu ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "vytvoøení podepisovacího paketu (make_keysig_packet) selhalo: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Revokaèní certifikát vytvoøen.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "pro \"%s\" nebyl nalezen ¾ádný revokaèní klíè\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "tajný klíè \"%s\" nenalezen: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "neexistuje odpovídající veøejný klíè: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "veøejný klíè neodpovídá tajnému klíèi!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Vytvoøit pro tento klíè revokaèní certifikát? (a/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "neznámý kompresní algoritmus\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "POZNÁMKA: Tento klíè není chránìný!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Revokaèní certifikát byl vytvoøen.\n"
+"\n"
+"Prosím pøeneste jej na médium, které mù¾ete dobøe schovat. Pokud se\n"
+"k tomuto certifikátu dostane nepovolaná osoba, mù¾e zneplatnit Vá¹ klíè.\n"
+"Je rozumné tento certifikát vytisknout a schovat jej pro pøípad, ¾e\n"
+"medium s certifikátem pøestane být èitelné. Ale pozor: Tiskový subsystém\n"
+"na Va¹em poèítaèi mù¾e ukládat data urèená k tisku a zpøístupnist je\n"
+"jiným u¾ivatelùm!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Prosím vyberte dùvod revokace:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Zru¹it"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Pravdìpodobnì zda chcete vybrat %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Mù¾ete vlo¾it dal¹í popis. Ukonèete prázdným øádkem:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Dùvod revokace: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Nebyl zadán ®ádný popis)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Je dùvod revokace vybrán správnì? (a/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "tajné èásti klíèe nejsou dostupné\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "ochranný algoritmus %d%s není podporován\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "ochranný algoritmus %d není podporován\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Neplatné heslo; prosím, zkuste to znovu"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "VAROVÁNÍ: Objeven slabý klíè - zmìòte, prosím, znovu heslo.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"generuji _nevhodný_ 16-ti bitový kontrolní souèet pro ochranu soukromého "
+"klíèe\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "vytvoøen slabý klíè - zkou¹ím znovu\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"nemohu se vyvarovat slabého klíèe pro symetrickou ¹ifru; operaci jsem zkusil "
+"%d krát!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "VAROVÁNÍ: konflikt hashe podpisu ve zprávì\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "VAROVÁNÍ: podepisovací podklíè %s není køí¾ovì certifikován\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "VAROVÁNÍ: podepisovací podklíè %s má neplatnou køí¾ovou certifikaci\n"
+
+#: g10/sig-check.c:181
+#, c-format
+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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second 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"
+
+#: g10/sig-check.c:195
+#, c-format
+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"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "POZNÁMKA: podpisovému klíèi %s skonèila platnost %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"pøedpokládám ¹patný podpis klíèem %s, proto¾e je nastaven neznámý kritický "
+"bit\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "klíè %s: neexistuje podklíè pro revokaci podklíèe\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "klíè %s: podklíè který je svázán s podpisem neexistuje\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"notaci (notation) nelze ulo¾it ve formátu v3 podpisu (formát PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "notaci (notation) nelze ulo¾it jako v3 podpis klíèe (formát PGP 2.x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"VAROVÁNÍ: nelze %%-expandovat notaci (pøíli¹ dlouhé). Pou¾ity "
+"neexpandované.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "URL politiky nelze ulo¾it ve formátu v3 podpisu (formát PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "nelze ulo¾it URL politiky do podpisu v3 klíèem (formát PGP 2.x)\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"VAROVÁNÍ: nemohu %%-expandovat URL politiky (pøíli¹ dlouhé). Pou¾ity "
+"neexpandované.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"VAROVÁNÍ: nemohu %%-expandovat URL preferovaného keyservery (pøíli¹ dlouhé). "
+"Pou¾ity neexpandované.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "kontrola vytvoøeného podpisu se nepodaøila: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s podpis od: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"v módu --pgp2 mù¾ete vytvoøit pouze oddìlený podpis (detach-sign)s klíèi "
+"formátu PGP-2.x\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"VAROVÁNÍ: vy¾ádaný hashovací algoritmus %s (%d) nevyhovuje pøedvolbám "
+"pøíjemce\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "podepisuji:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"v módu --pgp2 mù¾ete vytváøet jen èitelné podpisy s klíèi formátu PGP-2.x\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "bude pou¾ito ¹ifrování %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"klíè není oznaèen jako nedostateènì bezpeèný - nemohu jej pou¾ít s padìlaným "
+"RNG!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "pøeskoèen \"%s\": duplikován\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "pøeskoèen \"%s\": %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "pøeskoèeno: tajný klíè je u¾ v databázi\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"toto je PGP klíè vygenerovaný podle algoritmu ElGamal,\n"
+"podpisy vytvoøené tímto klíèem nejsou bezpeèné!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "záznam dùvìry %lu, typ %d: zápis selhal: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Seznam pøidìlených hodnot dùvìry, vytvoøen %s\n"
+"# (Pou¾ijte \"gpg --import-ownertrust\" k jeho obnovì)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "chyba v `%s': %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "øádek je pøíli¹ dlouhý"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "sloupec schází"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "neplatný fingerprint"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "schází hodnota dùvìryhosdnosti vlastníka"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "chyba pøi hledání záznamu dùvìryhodnosti v `%s': %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "chyba pøi ètení v `%s': %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "databáze dùvìry: synchronizace selhala %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "záznam v databázi dùvìry %lu: lseek() se nepodaøil: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "záznam v databázi dùvìry %lu: zápis se nepodaøil (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transakce s databází dùvìry je pøíli¹ dlouhá\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "nemohu otevøít `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: adresáø neexistuje!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "nemohu vytvoøit zámek pro  `%s'\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "nelze zamèít `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: nepodaøilo se vytvoøit záznam verze: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: vytvoøena neplatná databáze dùvìry\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: databáze dùvìry vytvoøena\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "POZNÁMKA: do trustedb nezle zapisovat\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: neplatná databáze dùvìry\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: nepodaøilo se vytvoøit hashovací tabulku: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: chyba pøi aktualizaci záznamu verze: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: chyba pøi ètení záznamu verze: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: chyba pøi zápisu záznamu verze: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "databáze dùvìry: procedura lseek() selhala: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "databáze dùvìry: procedura read() (n=%d) selhala: %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: není soubor databáze dùvìry\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: záznam verze s èíslem %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: neplatná verze souboru %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: chyba pøi ètení volného záznamu: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: chyba pøi zápisu adresáøového záznamu: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: vynulování záznamu selhalo: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: pøidání záznamu selhalo: %s\n"
+
+#: g10/tdbio.c:1504
+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"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "nemohu pracovat s øádky del¹ími ne¾ %d znakù\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "vstupní øádek je del¹í ne¾ %d znakù\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' není platný dlouhý keyID\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "klíè %s: akceptován jako dùvìryhodný klíè\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "klíè %s se v databázi dùvìry vyskytuje více ne¾ jednou\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "klíè %s: nenalezen veøejný klíè k dùvìryhodnému klíèi - pøeskoèeno\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "klíè %s oznaèen jako absolutnì dùvìryhodný.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "záznam dùvìry %lu, typ po¾. %d: ètení selhalo: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "záznam dùvìry %lu není po¾adovaného typu %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+"nelze pou¾ít neznámý model dùvìry (%d) - pøedpokládáme pou¾ití modelu %s\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "poui¾ití modelu dùvìry %s\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+"14 fixní délka na kterou se pøekládá see trustdb.c:uid_trust_string_fixed"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ revokován  ]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[ expirován  ]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[  neznámá   ]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[nedefinovaná]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[  èásteèná  ]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[    plná    ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[  absolutní ]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "nedefinována"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "¾ádná"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "èásteèná"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "plná"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "absolutní"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "není nutné kontrolovat databázi dùvìry\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "dal¹í kontrola databáze dùvìry v %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "není nutné kontrolovat databázi dùvìry s modelem `%s'\n"
+
+#: g10/trustdb.c:607
+#, c-format
+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"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "veøejný klíè %s nebyl nalezen: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "prosím proveïte --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "kontroluji databázi dùvìry\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "zpracováno %d klíèù (%d validit vymazáno)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "¾ádný absolutnì dùvìryhodný klíè nebyl nalezen\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+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"
+
+#: g10/trustdb.c:2197
+#, 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"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"hloubka: %d  platných: %3d  podepsaných: %3d  dùvìra: %d-, %dq, %dn, %dm, %"
+"df, %du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "nelze aktualizovat záznam v databázi dùvìry: chyba pøi zápisu: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"podpis nebylo mo¾né ovìøit.\n"
+"Prosím, nezapomeòte, ¾e soubor s podpisem (.sig nebo .asc)\n"
+"by mìl být prvním souborem zadaným na pøíkazové øádce.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "vstupní øádek %u je pøíli¹ dlouhý nebo na konci chybí znak LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "obecná chyba"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "neznámý typ paketu"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "neznámá verze"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "neznámý algoritmus veøejného klíèe"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "neznámý hashovací algoritmus"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "¹patný veøejný klíè"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "¹patný tajný klíè"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "¹patný podpis"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "chyba kontrolního souètu"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "¹patné heslo"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "veøejný klíè nenalezen"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "neznámý ¹ifrovací algoritmus"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "nemohu otevøít soubor klíèù"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "neplatný paket"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "neplatný zpùsob reprezentace v ASCII"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "neexistuje u¾ivatel s tímto id"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "tajný klíè není dostupný"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "je pou¾it ¹patný tajný klíè"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "nepodporováno"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "¹patný klíè"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "chyba pøi ètení souboru"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "chyba pøi zápisu souboru"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "neznámý komprimaèní algoritmus"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "chyba pøi otvírání souboru"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "chyba pøi vytváøení souboru"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "nesprávné heslo"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmus veøejného klíèe není implementován"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "¹ifrovací algoritmus není implementován"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "neznámá tøída podpisu"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "chyba v databázi dùvìry"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "¹patné MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "omezení zdrojù"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "neplatný soubor klíèù"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "¹patný certifikát"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "¹patný formát id u¾ivatele"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "chyba pøi zavírání souboru"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "chyba pøi pøejmenování souboru"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "chyba pøi mazání souboru"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "neoèekávaná data"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "konflikt èasového razítka"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "nepou¾itelný algoritmus s veøejným klíèem"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "soubor existuje"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "slabý klíè"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "neplatný argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "¹patné URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "toto URI není podporováno"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "chyba sítì"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "neza¹ifrováno"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "nezpracováno"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "nepou¾itelný veøejný klíè"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "nepou¾itelný tajný klíè"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "chyba serveru klíèù"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "zru¹eno"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "¾ádná karta"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "chybí podepsaná data\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "CHYBA: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "VAROVÁNÍ: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... toto je chyba v programu (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "nalezena chyba v programu ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "ano"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "aAyY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "ne"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "ukonèit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "uUqQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okey|okey"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "zru¹it|zru¹it"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "zZ"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "VAROVÁNÍ: Pou¾ívaná pamì» není bezpeèná!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "Více informací naleznete na adrese http://www.gnupg.cz/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "provést operaci není mo¾né bez inicializované bezpeèné pamìti\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(pravdìpodobnì jste pro tento úkol pou¾ili nesprávný program)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA po¾aduje pou¾ití 160-ti bitového hashovacího algoritmu\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "více informací naleznete v dokumentu http://www.gnupg.cz/why-not-idea."
+#~ "html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "symbolické jméno smí obsahovat pouze písmena, èíslice, teèky nebo "
+#~ "podtr¾ítka a musí konèit znakem '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "jméno u¾ivatele musí obsahovat znakt '@' \n"
+
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "jméno u¾ivatele nesmí obsahovat více ne¾ jeden znak '@' \n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "hodnota nemù¾e obsahovat ¾ádné kontrolní znaky\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "VAROVÁNÍ: nalezen neplatný formát zápisu data\n"
+
+#~ msgid "not human readable"
+#~ msgstr "není v pøímo èitelném formátu"
+
+#~ msgid "expired: %s)"
+#~ msgstr "platnost skonèila: %s)"
diff --git a/po/da.gmo b/po/da.gmo
new file mode 100644 (file)
index 0000000..112331d
Binary files /dev/null and b/po/da.gmo differ
diff --git a/po/da.po b/po/da.po
new file mode 100644 (file)
index 0000000..a47b210
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,6778 @@
+# Dansk oversættelse af: / Danish translation of: GnuPG
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# Birger Langkjer <birger.langkjer@image.dk>, 2000.
+# Kenneth Christiansen -- kenneth@ripen.dk, 2000.
+# -- puh'ha denne er lang...nå men det går da fremad ;-)
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.0.0h\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2003-12-03 16:11+0100\n"
+"Last-Translator: Birger Langkjer <birger.langkjer@image.dk>\n"
+"Language-Team: Danish <dansk@klid.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr ""
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr ""
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr ""
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "kan ikke åbne `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: cipher/random.c:458
+#, fuzzy, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr ""
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr ""
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+
+#: cipher/random.c:482
+#, fuzzy, c-format
+msgid "can't read `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr ""
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, fuzzy, c-format
+msgid "can't create `%s': %s\n"
+msgstr "kan ikke oprette %s: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, fuzzy, c-format
+msgid "can't write `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: cipher/random.c:569
+#, fuzzy, c-format
+msgid "can't close `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "ADVARSEL: bruger usikker tilfældig-nummer-generator!!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Den tilfældige nummer generator er kun en \"kludge\" for at\n"
+"lade den køre - det er ikke en stærk RNG!\n"
+"\n"
+"BENYT IKKE DATA GENERERET AF DETTE PROGRAM!!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Ikke nok tilfældige byte tilgængelig.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Kræver %d byte mere)\n"
+
+# er det klogt at oversætte TrustDB?
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "kunne ikke initialisere TillidsDB: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "ingen standard offentlig nøglering\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "fejl ved oprettelse af kodesætning: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "fejl i trailerlinie\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "fjern nøgle fra den hemmelige nøglering"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "generér et nyt nøglepar"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+# er det klogt at oversætte TrustDB?
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "kunne ikke initialisere TillidsDB: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Nøgleoprettelse annulleret.\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s signatur fra: %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "ingen gyldig OpenPGP data fundet.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "panser: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "ugyldigt panserhoved: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "panserhoved: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr ""
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr ""
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "uforventet beskyttelse:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr ""
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "ugyldigt radix64 tegn %02x udeladt\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "for tidlig eof (ingen CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "for tidlig eof (i CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "dårlig CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC fejl; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "for tidlig eof (i trailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "fejl i trailerlinie\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "ingen gyldig OpenPGP data fundet.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "ugyldigt panser: linie længere end %d tegn\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr "quoted printable-tegn i panser - måske pga. en fejlbehæftet MTA\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr ""
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Dit valg? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "slåtil"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "slåtil"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr ""
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "ikke bearbejdet"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "skriver offentligt certifikat til '%s'\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "vis præferencer"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "Ugyldige bogstaver i navn\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Ugyldige bogstaver i navn\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "fejl i trailerlinie\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "Fingeraftryk:"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "fejl i trailerlinie\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "ingen gyldig OpenPGP data fundet.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/card-util.c:1033
+#, fuzzy
+msgid "Replace existing key? (y/N) "
+msgstr "Vil du gerne signere? "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+#, fuzzy
+msgid "Replace existing keys? (y/N) "
+msgstr "Vil du gerne signere? "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Vælg venligst hvilken slags nøgle du vil have:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Ugyldigt valg.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "rev- forkert nøgletilbagekald\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "ukendt kompressionsalgoritme"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "udelod: hemmelig nøgle er allerede tilstede\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "afslut denne menu"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "konfliktende kommandoer\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "vis denne hjælp"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Ingen hjælp tilgængelig"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "ændr udløbsdatoen"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "vis præferencer"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "vis fingeraftryk"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "generér et nyt nøglepar"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr ""
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "konfliktende kommandoer\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "konfliktende kommandoer\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr ""
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Indtast bruger-id: "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "Indtast bruger-id: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+#, fuzzy
+msgid "Enter PIN: "
+msgstr "Indtast bruger-id: "
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Gentag kodesætning: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "kodesætningen blev ikke ordentlig gentaget; prøv igen.\n"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "kan ikke åbne `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr ""
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "%s: bruger ikke fundet: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, fuzzy, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr ""
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr ""
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Slet denne nøgle fra nøgleringen? "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr ""
+
+#: g10/delkey.c:165
+#, fuzzy, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr ""
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr ""
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "fejl ved oprettelse af kodesætning: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "signering fejlede: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr ""
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "læser fra '%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr ""
+
+#: g10/encode.c:812
+#, fuzzy, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s krypteret for: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr ""
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr ""
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr ""
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr ""
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, fuzzy, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "%s: kan ikke oprette mappe: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "kan ikke åbne %s: %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "kan ikke åbne %s: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr ""
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr ""
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr ""
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr ""
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr ""
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "signér nøglen lokalt"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr ""
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "dårlig hemmelig nøgle"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+# er det klogt at oversætte TrustDB?
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "kunne ikke initialisere TillidsDB: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ADVARSEL: intet blev eksporteret\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Kommandoer:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[filer]|opret en signatur"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[filer]|opret rentekst signatur"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "opret en separat signatur"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "kryptér data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "kryptér kun med symmetriske cifre"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "afkryptér data (standard)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "godkend en signatur"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "vis nøgler"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "vis nøgler og signaturer"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "tjek nøglesignaturer"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "vis nøgle og fingeraftryk"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "vis hemmelige nøgler"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "generér et nyt nøglepar"
+
+#: g10/gpg.c:398
+#, fuzzy
+msgid "remove keys from the public keyring"
+msgstr "fjern nøgle fra den offentlige nøglering"
+
+#: g10/gpg.c:400
+#, fuzzy
+msgid "remove keys from the secret keyring"
+msgstr "fjern nøgle fra den hemmelige nøglering"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "signér en nøgle"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "signér en nøgle lokalt"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "signér eller redigér en nøgle"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "eksportér nøgler"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "eksportér nøgler til en nøgletjener"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importér nøgler fra en nøgleserver"
+
+#: g10/gpg.c:410
+#, fuzzy
+msgid "search for keys on a key server"
+msgstr "eksportér nøgler til en nøgletjener"
+
+#: g10/gpg.c:412
+#, fuzzy
+msgid "update all keys from a keyserver"
+msgstr "importér nøgler fra en nøgleserver"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importér/fusionér nøgler"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "opdatér tillidsdatabasen"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [filer]|print meddelelsesresumé"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Indstillinger:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "opret ascii beskyttet uddata"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAME|kryptér for NAME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "brug denne bruger-id til at signere eller dekryptere"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|sæt kompresningsniveau N (0 = slået fra)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "brug kanonisk tekstmodus"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "brug som uddatafil"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "meddelsom"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "lav ingen ændringer"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr ""
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Eksempler:\n"
+"\n"
+" -se -r Mikael [fil]        signér og kryptér for bruger Mikael\n"
+" --clearsign [fil]          lav en ren tekstsignatur\n"
+" --detach-sign [fil]        lav en separat signatur\n"
+" --list-keys [navne]        vis nøgler\n"
+" --fingerprint [navne]      vis fingeraftryk\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Rapportér venligst fejl til <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Brug: gpg [flag] [filer] (-h for hjælp)"
+
+# Skal alt dette oversættes eller er det flagene?
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntaks: gpg [flag] [filer]\n"
+"sign, check, encrypt eller decrypt\n"
+"standard operation afhænger af inddata\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Understøttede algoritmer:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr ""
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr ""
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr ""
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+#, fuzzy
+msgid "Compression: "
+msgstr "Kommentar: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "brug: gpg [flag] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "konfliktende kommandoer\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "ukendt standard modtager '%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "den givne politik-URL er ugyldig\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "skift imellem hemmelig og offentlig nøgle visning"
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1954
+#, fuzzy, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTITS: ingen standard alternativfil '%s'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTITS: ingen standard alternativfil '%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "alternativfil`%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "læser indstillinger fra `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTITS: %s er ikke til normal brug!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "ugyldig nøglering"
+
+#: g10/gpg.c:2537
+#, fuzzy, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/gpg.c:2540
+#, fuzzy
+msgid "invalid import options\n"
+msgstr "ugyldig rustning"
+
+#: g10/gpg.c:2547
+#, fuzzy, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/gpg.c:2550
+#, fuzzy
+msgid "invalid export options\n"
+msgstr "ugyldig nøglering"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "ugyldig rustning"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "den givne politik-URL er ugyldig\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "ugyldig nøglering"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr ""
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr ""
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s ikke tilladt med %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s er meningsløs sammen med %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "RSA nøgle kan ikke bruges i denne version\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "valgte cifferalgoritme er ugyldig\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "valgte resuméalgoritme er ugyldig\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "valgte cifferalgoritme er ugyldig\n"
+
+#: g10/gpg.c:3004
+#, fuzzy
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "valgte resuméalgoritme er ugyldig\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr ""
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr ""
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr ""
+
+#: g10/gpg.c:3025
+#, fuzzy
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "ugyldig S2K modus; skal være 0, 1 el. 3\n"
+
+#: g10/gpg.c:3027
+#, fuzzy
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "ugyldig S2K modus; skal være 0, 1 el. 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTE: simpel S2K modus (0) frarådes på det skarpeste\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "ugyldig S2K modus; skal være 0, 1 el. 3\n"
+
+#: g10/gpg.c:3041
+#, fuzzy
+msgid "invalid default preferences\n"
+msgstr "vis præferencer"
+
+#: g10/gpg.c:3050
+#, fuzzy
+msgid "invalid personal cipher preferences\n"
+msgstr "vis præferencer"
+
+#: g10/gpg.c:3054
+#, fuzzy
+msgid "invalid personal digest preferences\n"
+msgstr "vis præferencer"
+
+#: g10/gpg.c:3058
+#, fuzzy
+msgid "invalid personal compress preferences\n"
+msgstr "vis præferencer"
+
+#: g10/gpg.c:3091
+#, fuzzy, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s er meningsløs sammen med %s!\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "valgte cifferalgoritme er ugyldig\n"
+
+# er det klogt at oversætte TrustDB?
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "kunne ikke initialisere TillidsDB: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [filnavn (som gemmes)]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [filnavn]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [filnavn (som krypteres)]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [filnavn]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [filnavn (som signeres)]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [filnavn]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [filnavn]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3380
+#, fuzzy
+msgid "--sign --symmetric [filename]"
+msgstr "--symmetric [filnavn]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [filnavn]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [filnavn (som dekrypteres)]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key bruger-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key bruger-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key bruger-id [kommandoer]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [bruger-id] [nøglering]"
+
+#: g10/gpg.c:3560
+#, fuzzy, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/gpg.c:3562
+#, fuzzy, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/gpg.c:3564
+#, fuzzy, c-format
+msgid "key export failed: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/gpg.c:3575
+#, fuzzy, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "signering fejlede: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "ugyldig hash-algoritme `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[filnavn]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Gå til sagen og skriv meddelelsen ...\n"
+
+#: g10/gpg.c:4162
+#, fuzzy
+msgid "the given certification policy URL is invalid\n"
+msgstr "den givne politik-URL er ugyldig\n"
+
+#: g10/gpg.c:4164
+#, fuzzy
+msgid "the given signature policy URL is invalid\n"
+msgstr "den givne politik-URL er ugyldig\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "den givne politik-URL er ugyldig\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr ""
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[bruger ikke fundet]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "bruger sekundær nøgle %08lX istedetfor primær nøgle %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "vær mere stille"
+
+#: g10/gpgv.c:75
+#, fuzzy
+msgid "take the keys from this keyring"
+msgstr "Slet denne nøgle fra nøgleringen? "
+
+#: g10/gpgv.c:77
+#, fuzzy
+msgid "make timestamp conflicts only a warning"
+msgstr "tidsstempelkonflikt"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|skriv statusinfo til denne FD"
+
+#: g10/gpgv.c:102
+#, fuzzy
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Brug: gpg [flag] [filer] (-h for hjælp)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Indtast nøglens størrelse"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Svar \"ja\" eller \"nej\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr ""
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr ""
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr ""
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr ""
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr ""
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Svar \"ja\" hvis det er ok at overskrive filen"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Indtast et nyt filnavn. Hvis du bare trykker RETUR vil det\n"
+"forvalgte navn (som er vist i klammer) blive brugt."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Ingen hjælp tilgængelig"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Ingen hjælp tilgængelig for `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "opdatér tillidsdatabasen"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr ""
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "dårlig hemmelig nøgle"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "sprang over blok af typen %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu nøgler behandlet indtil nu\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Totalt antal behandlede: %lu\n"
+
+#: g10/import.c:295
+#, fuzzy, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "       nye undernøgler: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr ""
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "           importerede: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "              uændrede: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "      nye bruger-id'er: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "       nye undernøgler: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        nye signaturer: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "  nye nøgletilbagekald: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr " hemmelige nøgler læst: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "hemmelige nøgler import: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "hemmelige nøgler uændre: %lu\n"
+
+#: g10/import.c:322
+#, fuzzy, c-format
+msgid "          not imported: %lu\n"
+msgstr "           importerede: %lu"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "        nye signaturer: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr " hemmelige nøgler læst: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "      nye bruger-id'er: %lu\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s signatur fra: %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr ""
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "nøgle %08lX: offentlig nøgle ikke fundet: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:798
+#, fuzzy, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "skriver til `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "nøgle %08lX: stemmer ikke med vores kopi\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "nøgle %08lX: kan ikke lokalisere original nøgleblok: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "nøgle %08lX: kan ikke læse original nøgleblok: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, fuzzy, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "ingen standard offentlig nøglering\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "hemmelige nøgler import: %lu\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "fjern nøgle fra den hemmelige nøglering"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "%s: bruger ikke fundet: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "nøgle %08lX: offentlig nøgle ikke fundet: %s\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "nøgle %08lX: offentlig nøgle ikke fundet: %s\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "%s: udelod: %s\n"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "%s: udelod: %s\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr ""
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr ""
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "udelod: hemmelig nøgle er allerede tilstede\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "udelod: hemmelig nøgle er allerede tilstede\n"
+
+#: g10/keydb.c:168
+#, fuzzy, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr ""
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/keydb.c:698
+#, fuzzy, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "ingen standard offentlig nøglering\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr ""
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[selv-signatur]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 dårlig signature\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d dårlige signaturer\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr ""
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr ""
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr ""
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr ""
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr ""
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr ""
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, fuzzy, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+#, fuzzy
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr ""
+
+#: g10/keyedit.c:627
+#, fuzzy, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:655
+#, fuzzy, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Vil du gerne signere? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:788
+#, fuzzy
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:825
+#, fuzzy
+msgid "This key has expired!"
+msgstr "Bemærk: Denne nøgle er forældet!\n"
+
+#: g10/keyedit.c:843
+#, fuzzy, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr ""
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr ""
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr "skriver selvsignatur\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "signér nøglen lokalt"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr ""
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr ""
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Vil du gerne signere? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "signering fejlede: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+#, fuzzy
+msgid "Secret parts of primary key are not available.\n"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Kan ikke redigere denne nøgle: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+#, fuzzy
+msgid "passphrase not correctly repeated; try again"
+msgstr "kodesætningen blev ikke ordentlig gentaget; prøv igen.\n"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Vil du virkelig gerne gøre dette?"
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr ""
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "gem og afslut"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "vis fingeraftryk"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "vis nøgler og bruger-id'er"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr ""
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "vælg sekundær nøgle N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "Kan ikke tjekke signatur: %s\n"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "signér nøglen lokalt"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr ""
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "tilføj bruger-id"
+
+#: g10/keyedit.c:1387
+#, fuzzy
+msgid "add a photo ID"
+msgstr "tilføj bruger-id"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "slet bruger id"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "tilføj nøgle"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "slet sekundær nøgle"
+
+#: g10/keyedit.c:1408
+#, fuzzy
+msgid "add a revocation key"
+msgstr "tilføj sekundær nøgle"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr ""
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "skift imellem hemmelig og offentlig nøgle visning"
+
+#: g10/keyedit.c:1419
+#, fuzzy
+msgid "list preferences (expert)"
+msgstr "vis præferencer"
+
+#: g10/keyedit.c:1421
+#, fuzzy
+msgid "list preferences (verbose)"
+msgstr "vis præferencer"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "ændr kodesætningen"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr ""
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Vil du virkelig oprette?"
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "tilføj bruger-id"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "slå nøgle til"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "slå nøgle fra"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr ""
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr ""
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr ""
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr ""
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+#, fuzzy
+msgid "Key is revoked."
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Vil du gerne signere? "
+
+#: g10/keyedit.c:1762
+#, fuzzy
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "signér nøglen lokalt"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "ukendt signaturklasse"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr ""
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Vil du virkelig oprette?"
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Vil du virkelig oprette?"
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Vælg venligst hvilken slags nøgle du vil have:\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr ""
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Vil du gerne oprette en underskrivnings- og krypteringsnøgle? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Vil du virkelig gerne gøre dette?"
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Vil du virkelig oprette?"
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Vil du virkelig oprette?"
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Vil du virkelig gerne gøre dette?"
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Vil du gerne oprette en underskrivnings- og krypteringsnøgle? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Vil du virkelig gerne gøre dette?"
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "vis præferencer"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Gem ændringer? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Afslut uden at gemme? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr ""
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr ""
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr ""
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"Indstillinger:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr ""
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "kan ikke oprette %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "tilføj nøgle"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr "Nøgle udløber d. %s\n"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr "Nøgle udløber d. %s\n"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr "betro"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr "betro"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr ""
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "tilføj nøgle"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "udløb"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+#, fuzzy
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr ""
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Slettede %d signatur.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr ""
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr ""
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "ugyldig rustning"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3377
+#, fuzzy
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Indtast nøglens størrelse"
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr ""
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Vælg venligst hvilken slags nøgle du vil have:\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr ""
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr ""
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr ""
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+#, fuzzy
+msgid "Please select exactly one user ID.\n"
+msgstr "Vælg venligst hvilken slags nøgle du vil have:\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "nøgle %08lX: ingen gyldige bruger-id'er\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr ""
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Overskriv (j/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Ingen bruger-id med indeks %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Ingen bruger-id med indeks %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Ingen bruger-id med indeks %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "bruger-id: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr ""
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr ""
+
+#: g10/keyedit.c:4636
+#, fuzzy, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/keyedit.c:4640
+#, fuzzy
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/keyedit.c:4644
+#, fuzzy
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr ""
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr "signér en nøgle lokalt"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr ""
+
+#: g10/keyedit.c:4746
+#, fuzzy
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr ""
+
+#: g10/keyedit.c:4846
+#, fuzzy, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "vis præferencer"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "vis præferencer"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "vis præferencer"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "vis præferencer"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Ugyldige bogstaver i navn\n"
+
+#: g10/keygen.c:872
+#, fuzzy
+msgid "writing direct signature\n"
+msgstr "skriver selvsignatur\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "skriver selvsignatur\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr ""
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, fuzzy, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "Ønsket nøglestørrelse er %u bit\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, fuzzy, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "rundet op til %u bit\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "signér"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "kryptér data"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Vælg venligst hvilken slags nøgle du vil have:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA og ElGamal (standard)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (signér kun)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keygen.c:1441
+#, fuzzy, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) DSA (signér kun)\n"
+
+#: g10/keygen.c:1443
+#, fuzzy, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA nøglepar vil have 1024 bit.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Hvilken nøglestørrelse ønsker du? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Ønsket nøglestørrelse er %u bit\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "rundet op til %u bit\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Nøgle er gyldig for? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Nøgle er gyldig for? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "ugyldig værdi\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "Nøglen udløber aldrig\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "Nøglen udløber aldrig\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "Nøgle udløber d. %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+
+# virker j automatisk istedetfor y?
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Er dette korrekt (j/n)? "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Rigtige navn: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Ugyldige bogstaver i navn\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Navn må ikke starte med et tal\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Navn skal være mindst 5 bogstaver langt\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Epostadresse: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Ikke en gyldig epostadresse\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Kommentar: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Ugyldigt tegn i kommentar\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Du bruger '%s' tegnsættet.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Du valgte denne BRUGER-ID:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+#, fuzzy
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Ændr (N)avn, (K)ommentar, (E)post eller (O)kay/(Q)vit? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Ændr (N)avn, (K)ommentar, (E)post eller (O)kay/(Q)vit? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr ""
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Du skal bruge en kodesætning til at beskytte din hemmelige nøgle.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr ""
+
+#: g10/keygen.c:1904
+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 ""
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Nøgleoprettelse annulleret.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, fuzzy, c-format
+msgid "writing public key to `%s'\n"
+msgstr "skriver offentligt certifikat til '%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, fuzzy, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/keygen.c:3041
+#, fuzzy, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "nøgle %08lX: offentlig nøgle ikke fundet: %s\n"
+
+#: g10/keygen.c:3047
+#, fuzzy, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "skriver hemmeligt certifikat til '%s'\n"
+
+#: g10/keygen.c:3065
+#, fuzzy, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, fuzzy, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "offentlig og hemmelig nøgle oprettet og signeret.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Vil du virkelig oprette?"
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "kan ikke oprette %s: %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "hemmelige nøgler import: %lu\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+#, fuzzy
+msgid "Critical signature policy: "
+msgstr "%s signatur fra: %s\n"
+
+#: g10/keylist.c:267
+#, fuzzy
+msgid "Signature policy: "
+msgstr "%s signatur fra: %s\n"
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr ""
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr ""
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr ""
+
+#: g10/keylist.c:1505
+#, fuzzy
+msgid "Primary key fingerprint:"
+msgstr "vis nøgle og fingeraftryk"
+
+#: g10/keylist.c:1507
+#, fuzzy
+msgid "     Subkey fingerprint:"
+msgstr "             Fingeraftryk:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+#, fuzzy
+msgid " Primary key fingerprint:"
+msgstr "             Fingeraftryk:"
+
+#: g10/keylist.c:1516
+#, fuzzy
+msgid "      Subkey fingerprint:"
+msgstr "             Fingeraftryk:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "             Fingeraftryk:"
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr ""
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr ""
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr ""
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr ""
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "fejl ved skrivning af nøglering `%s': %s\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "vis nøgler og signaturer"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "vis nøgler og signaturer"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr ""
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "den givne politik-URL er ugyldig\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "slåfra"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "ugyldig nøglering"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "%s: bruger ikke fundet: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "%s: bruger ikke fundet: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "eksportér nøgler til en nøgletjener"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "læser indstillinger fra `%s'\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "eksportér nøgler til en nøgletjener"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "læser indstillinger fra `%s'\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "ugyldig nøglering"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "generel fejl"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "generel fejl"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "påklædning af beskyttelse fejlede: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "kan ikke åbne %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr ""
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr ""
+
+#: g10/mainproc.c:291
+#, fuzzy, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s/%s krypteret for: %s\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "ukendt cifferalgoritme "
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "Offentlig nøgle er slået fra.\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr ""
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "Gentag kodesætning: "
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "              alias \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "Gentag kodesætning: "
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:508
+#, fuzzy, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "Gentag kodesætning: "
+
+#: g10/mainproc.c:510
+#, fuzzy
+msgid "encrypted with 1 passphrase\n"
+msgstr "Gentag kodesætning: "
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, fuzzy, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "kryptér data"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr ""
+
+#: g10/mainproc.c:585
+#, fuzzy
+msgid "WARNING: message was not integrity protected\n"
+msgstr "ADVARSEL: intet blev eksporteret\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr ""
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr ""
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr ""
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "God signatur fra \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr ""
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "opret en separat signatur"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "              alias \""
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1544
+#, fuzzy
+msgid "Key available at: "
+msgstr "Ingen hjælp tilgængelig"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "DÅRLIG signatur fra \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "God signatur fra \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "God signatur fra \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr ""
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "              alias \""
+
+#: g10/mainproc.c:1863
+#, fuzzy, c-format
+msgid "Signature expired %s\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/mainproc.c:1868
+#, fuzzy, c-format
+msgid "Signature expires %s\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/mainproc.c:1871
+#, fuzzy, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s signatur fra: %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr ""
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr ""
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+#, fuzzy
+msgid "unknown"
+msgstr "ukendt version"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Kan ikke tjekke signatur: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+#, fuzzy
+msgid "not a detached signature\n"
+msgstr "opret en separat signatur"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr ""
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "gammeldags (PGP 2.x) signatur\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr ""
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "kan ikke slå core-dump fra: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "kan ikke åbne %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "nøgle %08lX: offentlig nøgle ikke fundet: %s\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "uimplementeret cifferalgoritme"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s signatur fra: %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr ""
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "rev- forkert nøgletilbagekald\n"
+
+#: g10/misc.c:681
+#, fuzzy, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/misc.c:685
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr ""
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#: g10/misc.c:707
+#, fuzzy
+msgid "Uncompressed"
+msgstr "ikke bearbejdet"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "ikke bearbejdet"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr ""
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "læser indstillinger fra `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "ukendt standard modtager '%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Fil `%s' eksisterer. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Overskriv (j/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: ukendt suffiks\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Indtast nyt filnavn"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "skriver til stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr ""
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr ""
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: mappe oprettet\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr ""
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr ""
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr ""
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr ""
+
+#: g10/passphrase.c:345
+#, fuzzy, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "valgte cifferalgoritme %d er ugyldig\n"
+
+#: g10/passphrase.c:362
+#, fuzzy, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr ""
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (hovednøgle-ID %08lX)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+
+#: g10/passphrase.c:571
+#, fuzzy
+msgid "Repeat passphrase\n"
+msgstr "Gentag kodesætning: "
+
+#: g10/passphrase.c:573
+#, fuzzy
+msgid "Enter passphrase\n"
+msgstr "Indtast kodesætning: "
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr ""
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr ""
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Indtast kodesætning: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Du skal bruge en kodesætning til at beskytte din hemmelige nøgle.\n"
+"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr ""
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Gentag kodesætning: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "kan ikke åbne %s: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+# virker j automatisk istedetfor y?
+#: g10/photoid.c:165
+#, fuzzy
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Er dette korrekt (j/n)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+#, fuzzy
+msgid "unable to display photo ID!\n"
+msgstr "kan ikke åbne %s: %s\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr ""
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+#, fuzzy
+msgid "Key is superseded"
+msgstr "Nøglen er beskyttet.\n"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr ""
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr ""
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr ""
+
+#: g10/pkclist.c:74
+#, fuzzy
+msgid "reason for revocation: "
+msgstr "rev- forkert nøgletilbagekald\n"
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr ""
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr ""
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Ingen tillidsværdi tildelt til %lu:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "              alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Denne nøgle tilhører sikkert ejeren\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr ""
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "%08lX: Vi stoler IKKE på denne nøgle\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = tilbage til hovedmenu\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr "%s: udelod: %s\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = afslut\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Dit valg? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Vil du virkelig gerne gøre dette?"
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr ""
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "         Intet tyder på at denne signatur tilhører ejeren.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "         Intet tyder på at denne signatur tilhører ejeren.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Denne nøgle tilhører sikkert ejeren\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Denne nøgle tilhører os\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Brug denne nøgle alligevel? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ADVARSEL: Bruger nøgle uden tillid!\n"
+
+#: g10/pkclist.c:509
+#, fuzzy
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/pkclist.c:518
+#, fuzzy
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ADVARSEL: Denne nøgle er blevet annulleret af dets ejer!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Dette kan betyde at signaturen er forfalsket.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "ADVARSEL: Denne undernøgle er blevet tilbagekaldt af dens ejer!\n"
+
+#: g10/pkclist.c:533
+#, fuzzy
+msgid "Note: This key has been disabled.\n"
+msgstr "Bemærk: Denne nøgle er forældet!\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Bemærk: Denne nøgle er forældet!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Intet tyder på at denne signatur tilhører ejeren.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ADVARSEL: Vi tror IKKE på denne nøgle!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Signaturen er formentlig FORFALSKET.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Det er ikke sikkert at signaturen tilhører ejeren.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: udelod: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: udelod: offentlig nøgle er allerede tilstede\n"
+
+#: g10/pkclist.c:885
+#, fuzzy
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr ""
+"Du angav ikke en bruger-id. (du kan bruge \"-r\")\n"
+"\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Ingen sådan bruger-id.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "udeladt: offentlig nøgle er allerede valgt som standard modtager\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Offentlig nøgle er slået fra.\n"
+
+#: g10/pkclist.c:999
+#, fuzzy
+msgid "skipped: public key already set\n"
+msgstr "%s: udelod: offentlig nøgle er allerede tilstede\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "ukendt standard modtager '%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: udelod: offentlignøgle er slået fra\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "ingen gyldige adresser\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, fuzzy, c-format
+msgid "error creating `%s': %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr ""
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr ""
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "læser stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr ""
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:244
+#, fuzzy, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "valgte cifferalgoritme %d er ugyldig\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "hemmelige nøgler import: %lu\n"
+
+#: g10/pubkey-enc.c:308
+#, fuzzy
+msgid "NOTE: key has been revoked"
+msgstr "nøgle %08lX: nøgle er blevet annulleret!\n"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, fuzzy, c-format
+msgid "build_packet failed: %s\n"
+msgstr "fjernelse af beskyttelse fejlede: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, fuzzy, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "signering fejlede: %s\n"
+
+#: g10/revoke.c:407
+#, fuzzy
+msgid "Revocation certificate created.\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "%s: bruger ikke fundet: %s\n"
+
+#: g10/revoke.c:500
+#, fuzzy, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "skriver offentligt certifikat til '%s'\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr ""
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Generér en annullérbar certifikat"
+
+#: g10/revoke.c:535
+#, fuzzy
+msgid "unknown protection algorithm\n"
+msgstr "ukendt kompressionsalgoritme"
+
+#: g10/revoke.c:543
+#, fuzzy
+msgid "NOTE: This key is not protected!\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+#, fuzzy
+msgid "Please select the reason for the revocation:\n"
+msgstr "rev- forkert nøgletilbagekald\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+
+#: g10/revoke.c:716
+#, fuzzy, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "rev- forkert nøgletilbagekald\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Brug denne nøgle alligevel? "
+
+#: g10/seckey-cert.c:55
+#, fuzzy
+msgid "secret key parts are not available\n"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: g10/seckey-cert.c:61
+#, fuzzy, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "valgte cifferalgoritme %d er ugyldig\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "valgte cifferalgoritme %d er ugyldig\n"
+
+#: g10/seckey-cert.c:266
+#, fuzzy
+msgid "Invalid passphrase; please try again"
+msgstr "ugyldig kodesætning"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr ""
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr ""
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr ""
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+
+#: g10/sig-check.c:181
+#, fuzzy, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/sig-check.c:182
+#, fuzzy, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "nøgle %08lX: offentlig nøgle importeret\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "Denne nøgle er ikke beskyttet.\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:347
+#, fuzzy, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "Kan ikke tjekke signatur: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s signatur fra: %s\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "signerer:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr ""
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "vis præferencer"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "%s: udelod: %s\n"
+
+#: g10/skclist.c:172
+#, fuzzy
+msgid "skipped: secret key already present\n"
+msgstr "udelod: hemmelig nøgle er allerede tilstede\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr ""
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "fejl i trailerlinie\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importér ejertillidsværdierne"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "fejl ved læsning af '%s': %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "panser: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr ""
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "kan ikke åbne '%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr ""
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "kan ikke oprette %s: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "kan ikke åbne `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr ""
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr ""
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr ""
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr ""
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr ""
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr ""
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr ""
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr ""
+
+#: g10/trustdb.c:227
+#, fuzzy, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "%s er ikke et gyldigt tegnsæt\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr ""
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr ""
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "tilføj nøgle"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "udløb"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "ukendt version"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr ""
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr ""
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "offentlig nøgle ikke fundet"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+#, fuzzy
+msgid "checking the trustdb\n"
+msgstr "|[NAMES]|tjek tillidsdatabasen"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr ""
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr ""
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "generel fejl"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "ukendt pakketype"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "ukendt version"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "ukendt offentlig nøglealgoritme"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "ukendt sammenfatningsalgoritme"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "dårlig offentlig nøgle"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "dårlig hemmelig nøgle"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "dårlig signatur"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "tjeksumsfejl"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "dårlig kodesætning"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "offentlig nøgle ikke fundet"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "ukendt cifferalgoritme "
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "kan ikke åbne nøgleringen"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "ugyldig pakke"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "ugyldig rustning"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "ikke-eksisterende bruger id"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "hemmelig nøgle ikke tilgængelig"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "forkert hemmelig nøgle brugt"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "ikke understøttet"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "dårlig nøgle"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "fillæsningsfejl"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "filskrivningsfejl"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "ukendt kompressionsalgoritme"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "filåbningsfejl"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "filoprettelsesfejl"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "ugyldig kodesætning"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "uimplementeret offentlig nøglealgoritme"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "uimplementeret cifferalgoritme"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "ukendt signaturklasse"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "tillidsdatabasefejl"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "dårlig mpi"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "resursegrænse"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "ugyldig nøglering"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "ugyldigt certifikat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "dårlig bruger-id"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "fillukningsfejl"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "filomdøbningsfejl"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "filsletningsfejl"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "uforventet data"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "tidsstempelkonflikt"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "uanvendelig offentlig nøglealgoritme"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "fil eksisterer"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "svag nøgle"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "ugyldigt argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "ugyldig URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "ikke-understøttet URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "netværksfejl"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "ikke krypteret"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "ikke bearbejdet"
+
+#: util/errors.c:106
+#, fuzzy
+msgid "unusable public key"
+msgstr "dårlig offentlig nøgle"
+
+#: util/errors.c:107
+#, fuzzy
+msgid "unusable secret key"
+msgstr "dårlig hemmelig nøgle"
+
+#: util/errors.c:108
+#, fuzzy
+msgid "keyserver error"
+msgstr "generel fejl"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr ""
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "ikke krypteret"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "kryptér data"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... dette er en fejl (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "du fandt en fejl ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "ja"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "jJ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "n"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "afslut"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "aA"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+#, fuzzy
+msgid "WARNING: using insecure memory!\n"
+msgstr "Advarsel: benytter ubeskyttet hukommelse!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operation er ikke mulig uden beskyttet hukommelse indlæst\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(du kan have brugt et forkert program til denne opgave)\n"
+
+#, fuzzy
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "en notationsværdi må ikke bruge nogen kontroltegn\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "en notationsværdi må ikke bruge nogen kontroltegn\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "en notationsværdi må ikke bruge nogen kontroltegn\n"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "læs indstillinger fra fil"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "læs indstillinger fra fil"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr "Nøgle udløber d. %s\n"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "kan ikke åbne %s: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Ingen bruger-ID for nøgle\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "fejl ved oprettelse af kodesætning: %s\n"
+
+#, fuzzy
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "ukendt cifferalgoritme "
+
+#~ msgid "list signatures"
+#~ msgstr "vis signaturer"
+
+#~ msgid "sign the key"
+#~ msgstr "signér nøglen"
+
+#~ msgid "add a secondary key"
+#~ msgstr "tilføj sekundær nøgle"
+
+#~ msgid "delete signatures"
+#~ msgstr "slet signaturer"
+
+#~ msgid "change the expire date"
+#~ msgstr "ændr udløbsdatoen"
+
+#, fuzzy
+#~ msgid "set preference list"
+#~ msgstr "vis præferencer"
+
+#, fuzzy
+#~ msgid "updated preferences"
+#~ msgstr "vis præferencer"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Ingen sekundær nøgle med indeks %d\n"
+
+#, fuzzy
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--sign-key bruger-id"
+
+#, fuzzy
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--sign-key bruger-id"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "opret en separat signatur"
+
+#, fuzzy
+#~ msgid "sign the key non-revocably"
+#~ msgstr "signér nøglen lokalt"
+
+#, fuzzy
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "signér nøglen lokalt"
+
+#~ msgid "q"
+#~ msgstr "a"
+
+#~ msgid "help"
+#~ msgstr "hjælp"
+
+#~ msgid "list"
+#~ msgstr "vis"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "aflus"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "slåtil"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsignér"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "generel fejl"
+
+#~ msgid "passwd"
+#~ msgstr "kodeord"
+
+#~ msgid "save"
+#~ msgstr "gem"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "nøgle"
+
+#~ msgid "check"
+#~ msgstr "tjek"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "signér"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "signér"
+
+#~ msgid "lsign"
+#~ msgstr "lsignér"
+
+#, fuzzy
+#~ msgid "nrsign"
+#~ msgstr "signér"
+
+#, fuzzy
+#~ msgid "nrlsign"
+#~ msgstr "signér"
+
+#~ msgid "adduid"
+#~ msgstr "tilføj-bid"
+
+#~ msgid "deluid"
+#~ msgstr "sletbid"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "tilføj nøgle"
+
+#~ msgid "delkey"
+#~ msgstr "sletnøgle"
+
+#, fuzzy
+#~ msgid "addrevoker"
+#~ msgstr "tilføj nøgle"
+
+#~ msgid "delsig"
+#~ msgstr "sletsig"
+
+#~ msgid "expire"
+#~ msgstr "udløb"
+
+#~ msgid "toggle"
+#~ msgstr "skift"
+
+#~ msgid "t"
+#~ msgstr "s"
+
+#~ msgid "pref"
+#~ msgstr "præf"
+
+#, fuzzy
+#~ msgid "showpref"
+#~ msgstr "vispræf"
+
+#, fuzzy
+#~ msgid "setpref"
+#~ msgstr "præf"
+
+#, fuzzy
+#~ msgid "updpref"
+#~ msgstr "præf"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "generel fejl"
+
+#~ msgid "trust"
+#~ msgstr "betro"
+
+#, fuzzy
+#~ msgid "revuid"
+#~ msgstr "sletbid"
+
+#~ msgid "disable"
+#~ msgstr "slåfra"
+
+#~ msgid "enable"
+#~ msgstr "slåtil"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA tillader kun nøglestørrelser fra 512 til 1024\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "skriver til `%s'\n"
+
+#, fuzzy
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "%s: bruger ikke fundet: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "kan ikke oprette %s: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "kan ikke åbne %s: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "              alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "nøgle %08lX: nøgle er blevet annulleret!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "nøgle %08lX: undernøgle er blevet annulleret!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: nøgle er udløbet\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Vi stoler IKKE på denne nøgle\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (signér og kryptér)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) DSA (signér kun)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) ElGamal (signér og kryptér)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) ElGamal (kryptér kun)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) ElGamal (signér og kryptér)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: kan ikke åbne: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: ADVARSEL: tom fil\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "kan ikke åbne %s: %s\n"
+
+#~ msgid "Really sign? "
+#~ msgstr "Vil du gerne signere? "
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "udløb"
+
+#, fuzzy
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: kan ikke åbne: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: kan ikke oprette mappe: %s\n"
+
+#, fuzzy
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "kan ikke åbne %s: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file: %s\n"
+#~ msgstr "kan ikke åbne %s: %s\n"
+
+#, fuzzy
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "eksportér ejertillidsværdierne"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (hovednøgle-ID %08lX)"
+
+#, fuzzy
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! undernøgle er blevet annulleret! %s\n"
+
+#, fuzzy
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- forkert nøgletilbagekald\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr "Nøgle udløber d. %s\n"
+
+#, fuzzy
+#~ msgid " [expires: %s]"
+#~ msgstr "Nøgle udløber d. %s\n"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "tilføj nøgle"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "kan ikke oprette %s: %s\n"
+
+#~ msgid "store only"
+#~ msgstr "gem kun"
+
+#, fuzzy
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "signér en nøgle lokalt"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "vis kun pakkesekvensen"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "eksportér ejertillidsværdierne"
+
+#, fuzzy
+#~ msgid "unattended trust database update"
+#~ msgstr "opdatér tillidsdatabasen"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "reparér en ødelagt tillidsdatabase"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "De-beskydt en fil el. stdin"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Beskydt en fil el. stdin"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NAME|brug NAME som standard modtager"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "brug standard nøglen som standard modtager"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "brug overhovedet ikke terminalen"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "tving v3 signaturer"
+
+#, fuzzy
+#~ msgid "do not force v3 signatures"
+#~ msgstr "tving v3 signaturer"
+
+#, fuzzy
+#~ msgid "force v4 key signatures"
+#~ msgstr "tving v3 signaturer"
+
+#, fuzzy
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "tving v3 signaturer"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "brug altid en MDC for kryptering"
+
+#, fuzzy
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "brug altid en MDC for kryptering"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "kørselsmodus: spørg aldrig"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "forvent ja til de fleste sprøgsmål"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "forvent nej til de fleste sprøgsmål"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "tilføj denne nøglering til nøgleringslisten"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "tilføj denne hemmeligenøglering til listen"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NAME|brug NAME som standard hemmelignøgle"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|brug denne nøgletjener til at slå nøgler op"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NAME|sæt terminal karaktersæt til NAME"
+
+#, fuzzy
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|FD|skriv statusinfo til denne FD"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FILE|indlæs udvidelsesmodul FILE"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emulér modusen beskrevet i RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "sæt alle pakker, cifre og resumé flag til OpenPGP standard"
+
+#, fuzzy
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "sæt alle pakker, cifre og resumé flag til OpenPGP standard"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|brug pasfrasemodus N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NAME|brug meddelelses resuméalgoritme NAME for pasfrase"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NAME|brug cifrealgoritme NAME for pasfrase"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NAME|brug cifferalgoritme NAME"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NAME|brug meddelelsesresumé algoritme NAME"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|brug kompresalgoritme N"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "nøgle %08lX: ikke en rfc2440 nøgle - udeladt\n"
+
+#, fuzzy
+#~ msgid " (default)"
+#~ msgstr "(standard er 1)"
+
+#~ msgid "Policy: "
+#~ msgstr "Politik: "
+
+#, fuzzy
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "importér nøgler fra en nøgleserver: %s\n"
+
+#, fuzzy
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "fejl ved læsning af '%s': %s\n"
+
+#, fuzzy
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu nøgler behandlet indtil nu\n"
+
+#, fuzzy
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "nøgle %08lX: ingen bruger-id\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "afslut"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (signér og kryptér)\n"
+
+#, fuzzy
+#~ msgid "Create anyway? "
+#~ msgstr "Brug denne nøgle alligevel? "
+
+#, fuzzy
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "ugyldig hash-algoritme `%s'\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "             Fingeraftryk:"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NAME=VALUE|brug denne notationsdata"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr ""
+#~ "første bogstav af en notationsnavn skal være et bogstave eller en "
+#~ "understregning\n"
+
+#, fuzzy
+#~ msgid "Are you sure you still want to sign it?\n"
+#~ msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#, fuzzy
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "Er du sikker på at de vil benytte denne nøglestørrelse? "
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key bruger-id"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key bruger-id"
+
+#, fuzzy
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-and-public-key bruger-id"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "udeladt: offentlig nøgle er allerede valgt med --encrypt-to\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "WARNING: This is a PGP2-style key\n"
+#~ msgstr "ADVARSEL: '%s' er en tom fil\n"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "sSmMqQ"
+
+#, fuzzy
+#~ msgid "%lu key(s) to refresh\n"
+#~ msgstr "%lu nøgler behandlet indtil nu\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr "Ingen tillidsværdier er ændret.\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr "%08lX: ignen info til at udregne en tillidssandsynlighed\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: fejl ved undersøgelse af nøgle: %s\n"
+
+#~ msgid "Good certificate"
+#~ msgstr "Godt certifikat"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "certifikatlæseproblem: %s\n"
+
+#~ msgid "can't lock keyring `%s': %s\n"
+#~ msgstr "kan ikke låse nøglering `%s': %s\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: bruger ikke fundet\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "Ingen nøgle for bruger-ID\n"
+
+#~ msgid "set debugging flags"
+#~ msgstr "sæt aflusningsflag"
+
+#~ msgid "enable full debugging"
+#~ msgstr "slå fuld fejltjekning til"
+
+#~ msgid "do not write comment packets"
+#~ msgstr "skriv ikke kommentarpakker"
+
+#~ msgid "(default is 3)"
+#~ msgstr "(standard er 3)"
+
+#~ msgid "   (%d) ElGamal in a v3 packet\n"
+#~ msgstr "   (%d) ElGamal i en v3 pakke\n"
diff --git a/po/de.gmo b/po/de.gmo
new file mode 100644 (file)
index 0000000..a2cd37f
Binary files /dev/null and b/po/de.gmo differ
diff --git a/po/de.po b/po/de.po
new file mode 100644 (file)
index 0000000..d8a7091
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,7649 @@
+# GnuPG german translation
+# Copyright (C) 1998, 1999, 2000, 2001, 2002,
+#               2003, 2004, 2005 Free Software Foundation, Inc.
+# Walter Koch <koch@u32.de>, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg-1.4.1\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2006-06-28 20:54+0200\n"
+"Last-Translator: Walter Koch <koch@u32.de>\n"
+"Language-Team: German <de@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "Eine Primzahl mit pbits=%u und qbits=%u kann nicht erzeugt werden\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "Eine Primzahl mit weniger als %d Bits kann nicht erzeugt werden\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "Kein Modul zum sammeln von Entropie vorhanden\n"
+
+#: cipher/random.c:403
+#, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "'%s' kann nicht gesperrt werden: %s\n"
+
+#: cipher/random.c:408
+#, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "es wird auf die Sperre `%s' gewartet...\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "'%s' kann nicht geöffnet werden: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "Status von '%s' ist nicht feststellbar: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "'%s' ist keine normale Datei - sie bleibt unbeachtet\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "Hinweis: 'random_seed'-Datei ist leer\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"WARNUNG: Falsche Größe der 'random_seed'-Datei - sie wird nicht verwendet\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "'%s' ist unlesbar: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "Hinweis: 'random_seed'-Datei bleibt unverändert\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "'%s' kann nicht erzeugt werden: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "kann '%s' nicht schreiben: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "kann '%s' nicht schließen: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "WARNUNG: Der Zufallsgenerator erzeugt keine echten Zufallszahlen!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Der Zufallsgenerator (RNG) ist lediglich ein \"kludge\", damit das\n"
+"Programms überhaupt läuft - es ist KEINESFALLS ein starker RNG!\n"
+"\n"
+"BENUTZEN SIE DIE DURCH DIESES PROGRAMM ERZEUGTEN DATEN NICHT!\n"
+"\n"
+
+# translated by wk
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Zufall wird gesammelt.  Bitte arbeiten Sie an etwas anderem, da\n"
+"so die Qualität der Zufallszahlen erhöht werden kann.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Es sind nicht genügend Zufallswerte vorhanden.  Bitte führen Sie andere\n"
+"Arbeiten durch, damit das Betriebssystem weitere Entropie sammeln kann!\n"
+"(Es werden noch %d Byte benötigt.)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "Der Fingerabdruck kann nicht gespeichert werden: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "Das Erzeugungsdatum konnte nicht gespeichert werden: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "Lesen des öffentlichen Schlüssels fehlgeschlagen: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "Die Antwort enthält keine öffentliche Schlüssel-Daten\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "Die Antwort enthält das RSA-Modulus nicht\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "Antwort enthält den öffentlichen RSA-Exponenten nicht\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN-Callback meldete Fehler: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN für CHV%d ist zu kurz; die Mindestlänge beträgt %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "Prüfung des CHV%d fehlgeschlagen: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "Zugriff auf Admin-Befehle ist nicht eingerichtet\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "Fehler beim Holen des CHV-Status' von der Karte\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "Karte ist dauerhaft gesperrt!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr "Noch %d Admin-PIN-Versuche, bis die Karte dauerhaft geperrt ist\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Admin-PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Neue Admin-PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Neue PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "Fehler beim Abfragen einer neuen PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "Fehler beim Lesen der Anwendungsdaten\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "Fehler beim Lesen des Fingerabdrucks DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "Schlüssel existiert bereits\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "Existierender Schlüssel wird ersetzt werden\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "neue Schlüssel werden erzeugt\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "der öffentliche Exponent fehlt oder ist zu groß (mehr als %d Bit)\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "Speichern des Schlüssels fehlgeschlagen: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "Bitte warten, der Schlüssel wird erzeugt ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "Schlüsselerzeugung fehlgeschlagen\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Schlüsselerzeugung abgeschlossen (%d Sekunden)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "Ungültige Struktur der OpenPGP-Karte (DO 0x93)}\n"
+
+#: g10/app-openpgp.c:2087
+#, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "Die Hashmethode %s wird von der Karte nicht unterstützt\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "Anzahl bereits erzeugter Signaturen: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Bitte die PIN eingeben%%0A[Sigs erzeugt: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "Kann auf %s nicht zugreifen - ungültige OpenPGP-Karte?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ASCII-Hülle: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "Ungültige ASCII-Hülle"
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "ASCII-Hülle: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "Ungültige Klartextsignatur-Einleitung\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "verschachtelte Klartextunterschriften\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "Unerwartete ASCII-Hülle: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "Ungültige mit Bindestrich \"escapte\" Zeile: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "Ungültiges \"radix64\" Zeichen %02x ignoriert\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "vorzeitiges Dateiende (keine Prüfsumme)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "vorzeitiges Dateiende (innerhalb der Prüfsumme)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "Falsch aufgebaute Prüfsumme\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "Prüfsummenfehler; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "vorzeitiges Dateiende (im Nachsatz)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "Fehler in der Nachsatzzeile\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "Keine gültigen OpenPGP-Daten gefunden.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "ungültige ASCII-Hülle: Zeile ist länger als %d Zeichen\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"\"quoted printable\" Zeichen in der ASCII-Hülle gefunden - möglicherweise\n"
+" war ein fehlerhafter Email-Transporter(\"MTA\") die Ursache\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP Karte ist nicht vorhanden: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "OpenPGP Karte Nr. %s erkannt\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "Dies kann im Batchmodus nicht durchgeführt werden.\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Ihre Auswahl? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[nicht gesetzt]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "männlich"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "weiblich"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "unbestimmt"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "nicht zwingend"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "zwingend"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Fehler: Nur reines ASCII ist derzeit erlaubt.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Fehler: Das Zeichen \"<\" kann nicht benutzt werden.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Fehler: Doppelte Leerzeichen sind nicht erlaubt.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Familienname des Kartenbesitzers:"
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Vorname des Kartenbesitzers:"
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+"Fehler: Der zusammengesetzte Name ist zu lang (Grenze beträgt %d Zeichen).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL um den öffentlichen Schlüssel zu holen: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Fehler: URL ist zu lang (Grenze beträgt %d Zeichen).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "Fehler beim Lesen von `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Logindaten (Kontenname): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Fehler: Logindaten sind zu lang (Grenze beträgt %d Zeichen).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Geheime DO-Daten: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Fehler: Geheime DO-Daten sind zu lang (Grenze beträgt %d Zeichen).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Spracheinstellungen"
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Fehler: Ungültige Länge der Einstellungs-Zeichenfolge.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Fehler: Ungültige Zeichen in der Einstellungs-Zeichenfolge\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Geschlecht: (Männlich (M), Weiblich (F) oder Leerzeichen): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Fehler: ungültige Antwort.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA-Fingerabdruck: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Fehler: ungültig geformter Fingerabdruck.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Schlüsseloperation nicht möglich: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "Keine gültige OpenPGP-Karte"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "Fehler beim Holen der aktuellen Schlüsselinfo: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Vorhandenen Schlüssel ersetzen? (j/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+"Sicherung des Verschlüsselungsschlüssel außerhalb der Karte erstellen? (J/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Vorhandene Schlüssel ersetzen? (j/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Bitte beachten: Die Werkseinstellung der PINs sind\n"
+"   PIN = `%s'     Admin-PIN = `%s'\n"
+"Sie sollten sie mittels des Kommandos --change-pin ändern\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Bitte wählen Sie die Art des Schlüssel, der erzeugt werden soll:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Unterschriften-Schlüssel\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Verschlüsselungs-Schlüssel\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Authentisierungs-Schlüssel\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Ungültige Auswahl.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Wählen Sie den Speicherort für den Schlüssel:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "Unbekanntes Schlüssel-Schutzverfahren\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "Geheime Teile des Schlüssels sind nicht vorhanden\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "geheimer Schlüssel ist bereits auf einer Karte gespeichert\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "Menü verlassen"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "Zeige Admin-Kommandos"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "Diese Hilfe zeigen"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "Alle vorhandenen Daten auflisten"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "Kartenbesitzernamen ändern"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "Schlüssel-holen-URL ändern"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "Holen des Schlüssels mittels der URL auf der Karte"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "Ändern der Logindaten"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "Ändern der Spracheinstellungen"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "Ändern des Geschlechts des Kartenbesitzers"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "Ändern des CA-Fingerabdrucks"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "Umschalte des \"Signature-force-PIN\"-Schalters"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "neue Schlüssel erzeugen"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "Menü für Ändern oder Entsperren der PIN"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Befehl> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "nur-Admin Befehl\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Admin-Befehle sind erlaubt\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Admin-Befehle sind nicht erlaubt\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Ungültiger Befehl (versuchen Sie's mal mit \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "Geheimer Schlüssel ist nicht vorhanden"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+"Legen Sie die Karte ein und drücken Sie 'Eingabe'; drücken Sie 'c' um "
+"abzubrechen: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "löschen des Schlüsselblocks fehlgeschlagen: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Bitte entfernen Sie die Karte und legen stattdessen die Karte mit folgender "
+"Seriennummer ein:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+"Drücken Sie 'Eingabe' wenn fertig; oder drücken Sie 'c' um abzubrechen: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Geben Sie die neue Admin-PIN ein: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Geben Sie die neue PIN ein: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Geben Sie die Admin-PIN ein: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Geben Sie die PIN ein: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Geben Sie die PIN nochmal ein: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN wurde nicht richtig wiederholt; noch einmal versuchen"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "'%s' kann nicht geöffnet werden\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output funktioniert nicht bei diesem Kommando\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "Schlüssel \"%s\" nicht gefunden: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "Fehler beim Lesen des Schlüsselblocks: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(es sei denn, Sie geben den Schlüssel mittels Fingerprint an)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "dies kann im Batchmodus ohne \"--yes\" nicht durchgeführt werden\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Diesen Schlüssel aus dem Schlüsselbund löschen? (j/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Dies ist ein privater Schlüssel! - Wirklich löschen? (j/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "löschen des Schlüsselblocks fehlgeschlagen: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "Der \"Ownertrust\" wurde gelöscht\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr ""
+"Es gibt einen privaten Schlüssel zu diesem öffentlichen Schlüssel \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+"Verwenden Sie zunächst das Kommando \"--delete-secret-key\", um ihn zu "
+"entfernen.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "Fehler beim Erzeugen der Passphrase: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+"Aufgrund des S2K-Modus kann ein symmetrisches ESK Paket nicht benutzt "
+"werden\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "benutze Cipher %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' ist bereits komprimiert\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "WARNUNG: '%s' ist eine leere Datei.\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"Im --pgp2-Modus kann nur für RSA-Schlüssel mit maximal 2048 Bit "
+"verschlüsselt werden\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "Lesen von '%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"Die IDEA-Verschlüsselung kann nicht mit allen Zielschlüsseln verwendet "
+"werden.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"WARNUNG: Erzwungene Verwendung des symmetrischen Verschlüsselungsverfahren %"
+"s (%d) verletzt die Empfängervoreinstellungen\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"WARNUNG: Erzwungenes Kompressionsverfahren %s (%d) verletzt die "
+"Empfängervoreinstellungen.\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"Erzwungene Verwendung des symmetrischen Verschlüsselungsverfahren %s (%d) "
+"verletzt die Empfängervoreinstellungen\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "Die Benutzung von %s ist im %s-Modus nicht erlaubt.\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s verschlüsselt für: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s verschlüsselte Daten\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "Mit unbekanntem Verfahren verschlüsselt %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"Warnung: Botschaft wurde mit einem unsicheren Schlüssel verschlüsselt.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "Problem beim Bearbeiten des verschlüsselten Packets\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "Ausführen von externen Programmen wird nicht unterstützt\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "Verzeichnis `%s' kann nicht erzeugt werden: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"Ausführen von externen Programmen ist ausgeschaltet, da die Dateirechte "
+"nicht sicher sind\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"Diese Plattform benötigt temporäre Dateien zur Ausführung von externen\n"
+"Programmen\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "Ausführen des Programms `%s' nicht möglich: %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "Ausführen der Shell `%s' nicht möglich: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "Fehler beim Aufruf eines externen Programms: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "ungewöhnliches Ende eines externen Programms\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "Externes Programm konnte nicht aufgerufen werden\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "Die Ausgabe des externen Programms konnte nicht gelesen werden: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+"WARNUNG: die temporäre Datei (%s) `%s' konnte nicht entfernt werden: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "WARNUNG: Temporäres Verzeichnis `%s' kann nicht entfernt werden: %s\n"
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr "Exportiere auch Unterschriften die als nicht exportfähig markiert sind"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "Exportiere Widerrufsschlüssel die als \"sensitiv\" markiert sind"
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr "Die Passphrase von exportierten Unterschlüssel entfernen"
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr "Unbrauchbare Teile des Schlüssel während des Exports entfernen"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr "Während des Exports soviel wie möglich vom Schlüssel entfernen"
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "Exportieren geheimer Schlüssel ist nicht erlaubt\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "Schlüssel %s: ungeschützt - übersprungen\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "Schlüssel %s: PGP 2.x-artiger Schlüssel - übersprungen\n"
+
+#: g10/export.c:373
+#, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "Schlüssel %s: Schlüsselmaterial ist auf einer Karte - übergangen\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "Entfernen des Schutzes für des Unterschlüssel fehlgeschlagen: %s\n"
+
+# translated by wk
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "WARNUNG: Der geheime Schlüssel %s hat keine einfache SK-Prüfsumme\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "WARNUNG: Nichts exportiert\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Befehle:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[Datei]|Eine Unterschrift erzeugen"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[Datei]|Eine Klartextunterschrift erzeugen"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "Eine abgetrennte Unterschrift erzeugen"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "Daten verschlüsseln"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "Daten symmetrisch verschlüsseln"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "Daten entschlüsseln (Voreinstellung)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "Signatur prüfen"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "Liste der Schlüssel"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "Liste der Schlüssel und ihrer Signaturen"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "Signaturen der Schlüssel auflisten und prüfen"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "Liste der Schlüssel und ihrer \"Fingerabdrücke\""
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "Liste der geheimen Schlüssel"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "Ein neues Schlüsselpaar erzeugen"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "Schlüssel aus dem öff. Schlüsselbund entfernen"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "Schlüssel aus dem geh. Schlüsselbund entfernen"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "Schlüssel signieren"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "Schlüssel nur für diesen Rechner signieren"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "Unterschreiben oder bearbeiten eines Schl."
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "Ein Schlüsselwiderruf-Zertifikat erzeugen"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "Schlüssel exportieren"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "Schlüssel zu einem Schlü.server exportieren"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "Schlüssel von einem Schlü.server importieren"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "Schlüssel auf einem Schlü.server suchen"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "alle Schlüssel per Schlü.server aktualisieren"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "Schlüssel importieren/kombinieren"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "den Karten-Status ausgeben"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "Daten auf einer Karte ändern"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "PIN einer Karte ändern"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "Ändern der \"Trust\"-Datenbank"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [Dateien]|Message-Digests für die Dateien ausgeben"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Optionen:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "Ausgabe mit ASCII-Hülle versehen"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAME|Verschlüsseln für NAME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "Mit dieser User-ID signieren"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "Kompressionsstufe auf N setzen (0=keine)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "Textmodus benutzen"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "Als Ausgabedatei benutzen"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "Detaillierte Informationen"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "Keine wirklichen Änderungen durchführen"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "vor Überschreiben nachfragen"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "OpenPGP-Verhalten strikt beachten"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "PGP 2.x-kompatibele Botschaften erzeugen"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Auf der \"man\"-Seite ist eine vollständige Liste aller Kommandos und "
+"Optionen)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Beispiele:\n"
+"\n"
+" -se -r Bob [Datei]         Signieren und verschlüsseln für Benutzer Bob\n"
+" --clearsign [Datei]        Eine Klartextsignatur erzeugen\n"
+" --detach-sign [Datei]      Eine abgetrennte Signatur erzeugen\n"
+" --list-keys [Namen]        Schlüssel anzeigen\n"
+" --fingerprint [Namen]      \"Fingerabdrücke\" anzeigen\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Berichte über Programmfehler bitte in englisch an <gnupg-bugs@gnu.org>.\n"
+"Sinn- oder Schreibfehler in den deutschen Texten bitte an <de@li.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Aufruf: gpg [Optionen] [Dateien] (-h für Hilfe)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Aufruf: gpg [Optionen] [Dateien]\n"
+"Signieren, prüfen, verschlüsseln, entschlüsseln.\n"
+"Die voreingestellte Operation ist abhängig von den Eingabedaten\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Unterstützte Verfahren:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Öff.Schlüssel: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Verschlü.: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Komprimierung: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "Aufruf: gpg [Optionen] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "Widersprüchliche Befehle\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "Kein '='-Zeichen in der Gruppendefinition gefunden `%s'\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "WARNUNG: Unsicheres Besitzverhältnis des Home-Verzeichnis `%s'\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "WARNUNG: Unsicheres Besitzverhältnis der Konfigurationsdatei `%s'\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "WARNUNG: Unsicheres Besitzverhältnis auf die Erweiterung `%s'\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "WARNUNG: Unsichere Zugriffsrechte des Home-Verzeichnis `%s'\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "WARNUNG: Unsichere Zugriffsrechte der Konfigurationsdatei `%s'\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "WARNUNG: Unsichere Zugriffsrechte auf die Erweiterung `%s'\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"WARNUNG: Unsicheres Besitzverhältnis des umgebenden Verzeichnisses für Home-"
+"Verzeichnis `%s'\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"WARNUNG: Unsicheres Besitzverhältnis des umgebenden Verzeichnisses der "
+"Konfigurationsdatei `%s'\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"WARNUNG: Unsicheres Besitzverhältnis des umgebenden Verzeichnisses `%s'\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"WARNUNG: Unsichere Zugriffsrechte des umgebenden Verzeichnisses des Home-"
+"Verzeichnisses `%s'\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"WARNUNG: Unsichere Zugriffsrechte des umgebenden Verzeichnisses der "
+"Konfigurationsdatei `%s'\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"WARNUNG: Unsichere Zugriffsrechte des umgebenden Verzeichnisses auf "
+"Erweiterung `%s'\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "Unbekanntes Konfigurationselement `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr "Alle Notationen mit den Signaturen anlisten"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "Der bevorzugten Schlüsselserver mit den Signaturen anlisten"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr "Anzeigen des Schlüsselbundes, in dem ein Schlüssel drin ist"
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr "Das Ablaufdatum mit den Signaturen anlisten"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "Hinweis: Alte voreingestellte Optionendatei '%s' wurde ignoriert\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "Hinweis: Keine voreingestellte Optionendatei '%s' vorhanden\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "Optionendatei '%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "Optionen werden aus '%s' gelesen\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "Hinweis: %s ist nicht für den üblichen Gebrauch gedacht!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"Verschlüsselungserweiterung `%s' wurde wegen unsicherer Zugriffsrechte nicht "
+"geladen\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' ist kein gültiges Unterschriftablaufdatum\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' ist kein gültiger Zeichensatz\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "Schlüsselserver-URL konnte nicht analysiert werden\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: ungültige Schlüsselserver-Option\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "Ungültige Schlüsselserver-Option\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: ungültige Import-Option\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "Ungültige Import-Option\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: ungültige Export-Option.\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "Ungültige Export-Option\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: ungültige Listen-Option.\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "Ungültige Listen-Option\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+msgid "show all notations during signature verification"
+msgstr "Alle Notationen wahrend der Signaturprüfung anzeigen"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr ""
+"Die URL für den bevorzugten Schlüsselserver während der Signaturprüfung "
+"anzeigen"
+
+#: g10/gpg.c:2582
+msgid "show user ID validity during signature verification"
+msgstr "Die Gültigkeit der User-ID während der Signaturprüfung anzeigen"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: ungültige Überprüfuns-Option.\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "Ungültige Überprüfungs-Option\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "Der Ausführungspfad konnte nicht auf %s gesetzt werden.\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: ungültige Überprüfuns-Option.\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "WARNUNG: Programm könnte eine core-dump-Datei schreiben!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "WARNUNG: %s ersetzt %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s kann nicht zusammen mit %s verwendet werden!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s zusammen mit %s ist nicht sinnvoll!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "HINWEIS: %s ist in dieser Version nicht vorhanden\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "schreiben des geheimen Schlüssels nach '%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"Im --pgp2-Modus können Sie nur abgetrennte oder Klartextunterschriften "
+"machen\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+"Im --pgp2-Modus können Sie nicht gleichzeitig unterschreiben und "
+"verschlüsseln\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"Im --pgp2-Modus müssen Sie Dateien benutzen und können keine Pipes "
+"verwenden.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+"Verschlüssen einer Botschaft benötigt im --pgp2-Modus die IDEA-"
+"Verschlüsselung\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "Das ausgewählte Verschlüsselungsverfahren ist ungültig\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "Das ausgewählte Hashverfahren ist ungültig\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "Das ausgewählte Komprimierungsverfahren ist ungültig\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "Das ausgewählte Hashverfahren ist ungültig\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed müssen größer als 0 sein\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed müssen größer als 1 sein\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth muß im Bereich 1 bis 255 liegen\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "ungültiger \"default-cert-level\"; Wert muß 0, 1, 2 oder 3 sein\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "ungültiger \"min-cert-level\"; Wert muß 0, 1, 2 oder 3 sein\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "Hinweis: Vom \"simple S2K\"-Modus (0) ist strikt abzuraten\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "ungültiger \"simple S2K\"-Modus; Wert muß 0, 1 oder 3 sein\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "ungültige Standard Voreinstellungen\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "ungültige private Verschlüsselungsvoreinstellungen\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "ungültige private Hashvoreinstellungen\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "ungültige private Komprimierungsvoreinstellungen\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s arbeitet noch nicht mit %s zusammen\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+"Die Benutzung des Verschlüsselungsverfahren %s ist im %s-Modus nicht "
+"erlaubt.\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "Die Benutzung der Hashmethode %s ist im %s-Modus nicht erlaubt.\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+"Die Benutzung des Komprimierverfahren %s ist im %s-Modus nicht erlaubt.\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "Die Trust-DB kann nicht initialisiert werden: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"WARNUNG: Empfänger (-r) angegeben ohne Verwendung von Public-Key-Verfahren\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [Dateiname]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [Dateiname]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "Symmetrische Entschlüsselung von `%s' fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [Dateiname]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [Dateiname]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+"--symmetric --encrypt kann nicht zusammen mit --s2k-mode 0 verwendet werden\n"
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "Die Benutzung von %s ist im %s-Modus nicht erlaubt.\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [Dateiname]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [Dateiname]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [Dateiname]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+"--symmetric --sign --encrypt kann nicht zusammen mit --s2k-mode 0 verwendet "
+"werden\n"
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "Die Benutzung von %s ist im %s-Modus nicht erlaubt.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [Dateiname]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [Dateiname]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [Dateiname]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key User-ID"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key User-ID"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key User-ID [Befehle]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [User-ID] [Schlüsselbund]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "Senden an Schlüsselserver fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "Empfangen vom Schlüsselserver fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "Schlüsselexport fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "Suche auf dem Schlüsselserver fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "Refresh vom Schlüsselserver fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "Entfernen der ASCII-Hülle ist fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "Anbringen der ASCII-Hülle ist fehlgeschlagen: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "Ungültiges Hashverfahren '%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[Dateiname]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Auf geht's - Botschaft eintippen ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "Die angegebene Zertifikat-Richtlinien-URL ist ungültig\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "Die angegebene Unterschriften-Richtlinien-URL ist ungültig\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "Die angegebene Unterschriften-Richtlinien-URL ist ungültig\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "zu viele Einträge im pk-Cache - abgeschaltet\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[User-ID nicht gefunden]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Ungültiger Schlüssel %s, gültig gemacht per --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"Kein privater Unterschlüssel zum öffentlichen Unterschlüssel %s - "
+"übergangen\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "der Zweitschlüssel %s wird anstelle des Hauptschlüssels %s verwendet\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr ""
+"Schlüssel %08lX: geheimer Schlüssel, aber ohne öffentlichen Schlüssel - "
+"übersprungen\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "Etwas weniger Infos"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "Schlüssel aus diesem Schlüsselbund nehmen"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "differierende Zeitangaben sind kein Fehler"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|Statusinfo auf FD (Dateihandle) ausgeben"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Aufruf: gpg [Optionen] [Dateien] (-h für Hilfe)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr "Aufruf: gpgv [Optionen] [Dateien] (-h Hilfe)\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Sie müssen selbst entscheiden, welchen Wert Sie hier eintragen; dieser Wert\n"
+"wird niemals an eine dritte Seite weitergegeben.  Wir brauchen diesen Wert,\n"
+"um das \"Netz des Vertrauens\" aufzubauen.  Dieses hat nichts mit dem\n"
+"(implizit erzeugten) \"Netz der Zertifikate\" zu tun."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Um das Web-of-Trust aufzubauen muß GnuPG wissen, welchen Schlüsseln\n"
+"uneingeschränkt vertraut wird. Das sind üblicherweise die Schlüssel\n"
+"auf deren geheimen Schlüssel Sie Zugruff haben.\n"
+"Antworten Sie mit \"yes\" um diesen Schlüssel uneingeschränkt zu vertrauen\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Wenn Sie diesen nicht vertrauenswürdigen Schlüssel trotzdem benutzen "
+"wollen,\n"
+"so antworten Sie mit \"ja\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Geben Sie die User-ID dessen ein, dem Sie die Botschaft senden wollen."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Normalerweise ist es nicht gut, denselben Schlüssel zum unterschreiben\n"
+"und verschlüsseln zu nutzen.  Dieses Verfahren sollte in speziellen\n"
+"Anwendungsgebiten benutzt werden.  Bitte lassen Sie sich zuerst von \n"
+"einem Sicherheistexperten beraten."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Wählen Sie die gewünschte Schlüssellänge"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Geben Sie \"ja\" oder \"nein\" ein"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Geben Sie den benötigten Wert so an, wie er im Prompt erscheint.\n"
+"Es ist zwar möglich ein \"ISO\"-Datum (JJJJ-MM-DD) einzugeben, aber man\n"
+"erhält dann ggfs. keine brauchbaren Fehlermeldungen - stattdessen versucht\n"
+"der Rechner den Wert als Intervall (von-bis) zu deuten."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Geben Sie den Namen des Schlüsselinhabers ein"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+"Geben Sie eine Email-Adresse ein. Dies ist zwar nicht unbedingt notwendig,\n"
+"aber sehr empfehlenswert."
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Geben Sie - bei Bedarf - einen Kommentar ein"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  um den Namen zu ändern.\n"
+"K  um den Kommentar zu ändern.\n"
+"E  um die Email-Adresse zu ändern.\n"
+"F  um mit der Schlüsselerzeugung fortzusetzen.\n"
+"B  um die Schlüsselerzeugung abbrechen."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+"Geben Sie \"ja\" (oder nur \"j\") ein, um den Unterschlüssel zu erzeugen."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Wenn Sie die User-ID eines Schlüssels beglaubigen wollen, sollten Sie "
+"zunächst\n"
+"sicherstellen, daß der Schlüssel demjenigen gehört, der in der User-ID "
+"genannt\n"
+"ist. Für Dritte ist es hilfreich zu wissen, wie gut diese Zuordnung "
+"überprüft\n"
+"wurde.\n"
+"\n"
+"\"0\" zeigt, daß Sie keine bestimmte Aussage über die Sorgfalt der \n"
+"    Schlüsselzuordnung machen.\n"
+"\n"
+"\"1\" Sie glauben, daß der Schlüssel der benannten Person gehört,\n"
+"    aber Sie konnten oder nahmen die Überpüfung überhaupt nicht vor.\n"
+"    Dies ist hilfreich für eine \"persona\"-Überprüfung, wobei man den\n"
+"    Schlüssel eines Pseudonym-Trägers beglaubigt\n"
+"\n"
+"\"2\" Sie nahmen eine flüchtige Überprüfung vor. Das heißt Sie haben z.B.\n"
+"    den Schlüsselfingerabdruck kontrolliert und die User-ID des Schlüssels\n"
+"    anhand des Fotos geprüft.\n"
+"\n"
+"\"3\" Sie haben eine ausführlich Kontrolle des Schlüssels vorgenommen.\n"
+"    Das kann z.B. die Kontrolle des Schlüsselfingerabdrucks mit dem\n"
+"    Schlüsselinhaber persönlich vorgenommen haben; daß Sie die User-ID des\n"
+"    Schlüssel anhand einer schwer zu fälschenden Urkunde mit Foto (wie z.B.\n"
+"    einem Paß) abgeglichen haben und schließlich per Email-Verkehr die\n"
+"    Email-Adresse als zum Schlüsselbesitzer gehörig erkannt haben.\n"
+"\n"
+"Beachten Sie, daß diese Beispiele für die Antworten 2 und 3 *nur* Beispiele\n"
+"sind.  Schlußendlich ist es Ihre Sache, was Sie unter \"flüchtig\" oder\n"
+" \"ausführlich\" verstehen, wenn Sie Schlüssel Dritter beglaubigen.\n"
+"\n"
+"Wenn Sie nicht wissen, wie Sie antworten sollen, wählen Sie \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Geben Sie \"ja\" (oder nur \"j\") ein, um alle User-IDs zu beglaubigen"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Geben Sie \"ja\" (oder nur \"j\") ein, um diese User-ID zu LÖSCHEN.\n"
+"Alle Zertifikate werden dann auch weg sein!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr ""
+"Geben Sie \"ja\" (oder nur \"j\") ein, um diesen Unterschlüssel zu löschen"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Dies ist eine gültige Beglaubigung für den Schlüssel. Es ist normalerweise\n"
+"unnötig sie zu löschen. Sie ist möglicherweise sogar notwendig, um einen\n"
+"Trust-Weg zu diesem oder einem durch diesen Schlüssel beglaubigten "
+"Schlüssel\n"
+"herzustellen."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Diese Beglaubigung kann nicht geprüft werden, da Sie den passenden "
+"Schlüssel\n"
+"nicht besitzen. Sie sollten die Löschung der Beglaubigung verschieben, bis\n"
+"sie wissen, welcher Schlüssel verwendet wurde. Denn vielleicht würde genau\n"
+"diese Beglaubigung den \"Trust\"-Weg komplettieren."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Diese Beglaubigung ist ungültig. Es ist sinnvoll sie aus Ihrem\n"
+"Schlüsselbund zu entfernen."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Diese Beglaubigung bindet die User-ID an den Schlüssel. Normalerweise ist\n"
+"es nicht gut, solche Beglaubigungen zu entfernen. Um ehrlich zu sein:\n"
+"Es könnte dann sein, daß GnuPG diesen Schlüssel gar nicht mehr benutzen "
+"kann.\n"
+"Sie sollten diese Eigenbeglaubigung also nur dann entfernen, wenn sie aus\n"
+"irgendeinem Grund nicht gültig ist und eine zweite Beglaubigung verfügbar "
+"ist."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Ändern der Voreinstellung aller User-IDs (oder nur der ausgewählten)\n"
+"auf die aktuelle Liste der Voreinstellung. Die Zeitangaben aller "
+"betroffenen\n"
+"Eigenbeglaubigungen werden um eine Sekunde vorgestellt.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Bitte geben Sie die Passphrase ein. Dies ist ein geheimer Satz \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Um sicher zu gehen, daß Sie sich bei der Eingabe der Passphrase nicht\n"
+"vertippt haben, geben Sie diese bitte nochmal ein.  Nur wenn beide Eingaben\n"
+"übereinstimmen, wird die Passphrase akzeptiert."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr ""
+"Geben Sie den Namen der Datei an, zu dem die abgetrennte Unterschrift gehört"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Geben Sie \"ja\" ein, wenn Sie die Datei überschreiben möchten"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Geben Sie bitte einen neuen Dateinamen ein. Falls Sie nur die\n"
+"Eingabetaste betätigen, wird der (in Klammern angezeigte) Standarddateiname\n"
+"verwendet."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Sie sollten einen Grund für die Zertifizierung angeben. Je nach\n"
+"Zusammenhang können Sie aus dieser Liste auswählen:\n"
+"  \"Schlüssel wurde kompromitiert\"\n"
+"      Falls Sie Grund zu der Annahme haben, daß nicht berechtigte Personen\n"
+"      Zugriff zu Ihrem geheimen Schlüssel hatten\n"
+"  \"Schlüssel ist überholt\"\n"
+"      Falls Sie diesen Schlüssel durch einem neuen ersetzt haben.\n"
+"  \"Schlüssel wird nicht mehr benutzt\"\n"
+"      Falls Sie diesen Schlüssel zurückgezogen haben.\n"
+"  \"User-ID ist nicht mehr gültig\"\n"
+"      Um bekanntzugeben, daß die User-ID nicht mehr benutzt werden soll.\n"
+"      So weist man normalerweise auf eine ungültige Emailadresse hin.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Wenn Sie möchten, können Sie hier einen Text eingeben, der darlegt, warum\n"
+"Sie diesen Widerruf herausgeben.  Der Text sollte möglichst knapp sein.\n"
+"Eine Leerzeile beendet die Eingabe.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Keine Hilfe vorhanden."
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Keine Hilfe für '%s' vorhanden."
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "Ändern der \"Trust\"-Datenbank"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "Öffentliche Schlüssel paßt nicht zum geheimen Schlüssel!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "unbrauchbarer geheimer Schlüssel"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "überspringe den Block vom Typ %d\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu Schlüssel bislang bearbeitet\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Anzahl insgesamt bearbeiteter Schlüssel: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "              ignorierte neue Schlüssel: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "                           ohne User-ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                             importiert: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                            unverändert: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "                          neue User-IDs: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "                    neue Unterschlüssel: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "                        neue Signaturen: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "                neue Schlüsselwiderrufe: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "             gelesene geheime Schlüssel: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "           geheime Schlüssel importiert: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "                 unveränderte geh.Schl.: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "                       nicht importiert: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "                        neue Signaturen: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "             gelesene geheime Schlüssel: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "WARNING: Schlüssel %s hat Einstellungen zu nicht verfügbaren\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "         Algorithmen für diese User IDs:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s Unterschrift, Hashmethode \"%s\"\n"
+
+#: g10/import.c:632
+#, fuzzy, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "Das ausgewählte Komprimierungsverfahren ist ungültig\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "Schlüssel %s: Keine User-ID\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "Schlüssel %s: PKS Unterschlüsseldefekt repariert\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "Schlüssel %s: Nicht eigenbeglaubigte User-ID `%s' übernommen\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "Schlüssel %08lX: Keine gültigen User-IDs\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "dies könnte durch fehlende Eigenbeglaubigung verursacht worden sein\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "Schlüssel %08lX: Öffentlicher Schlüssel nicht gefunden: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "Schlüssel %08lX: neuer Schlüssel - übersprungen\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "kein schreibbarer Schlüsselbund gefunden: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "Schreiben nach '%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "Fehler beim Schreiben des Schlüsselbundes `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "Schlüssel %08lX: Öffentlicher Schlüssel \"%s\" importiert\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "Schlüssel %08lX: Stimmt nicht mit unserer Kopie überein\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr ""
+"Schlüssel %08lX: der lokale originale Schlüsselblocks wurde nicht gefunden: %"
+"s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr ""
+"Schlüssel %08lX: Lesefehler im lokalen originalen Schlüsselblocks: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "Schlüssel %08lX: \"%s\" 1 neue User-ID\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue User-IDs\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "Schlüssel %08lX: \"%s\" 1 neue Signatur\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue Signaturen\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "Schlüssel %08lX: \"%s\" 1 neuer Unterschlüssel\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue Unterschlüssel\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue Signaturen\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue Signaturen\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue User-IDs\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "Schlüssel %08lX: \"%s\" %d neue User-IDs\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "Schlüssel %08lX: \"%s\" Nicht geändert\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr ""
+"Schlüssel %08lX: geheimer Schlüssel mit ungültiger Verschlüsselung %d - "
+"übersprungen\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "schreiben des geheimen Schlüssels nach '%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "Kein voreingestellter geheimer Schlüsselbund: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "Schlüssel %08lX: Geheimer Schlüssel importiert\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "Schlüssel %08lX: Ist bereits im geheimen Schlüsselbund\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "Schlüssel %08lX: geheimer Schlüssel nicht gefunden: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"Schlüssel %08lX: Kein öffentlicher Schlüssel - der Schlüsselwiderruf kann "
+"nicht angebracht werden\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "Schlüssel %08lX: Ungültiges Widerrufzertifikat: %s - zurückgewiesen\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "Schlüssel %08lX: \"%s\" Widerrufzertifikat importiert\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "Schlüssel %08lX: Keine User-ID für Signatur\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"Schlüssel %08lX: Nicht unterstütztes Public-Key-Verfahren für User-ID \"%s"
+"\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "Schlüssel %08lX: Ungültige Eigenbeglaubigung für User-ID \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr ""
+"Schlüssel %08lX: Kein Unterschlüssel für die Unterschlüsselanbindungs-"
+"Beglaubigung\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "Schlüssel %08lX: Nicht unterstütztes Public-Key-Verfahren\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "Schlüssel %08lX: Ungültige Unterschlüssel-Anbindung\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "Schlüssel %08lX: Ungültige Unterschlüssel-Anbindung entfernt\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr ""
+"Schlüssel %08lX: Kein Unterschlüssel für die Unterschlüsselwiderruf-"
+"Beglaubigung\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "Schlüssel %08lX: Ungültiger Unterschlüsselwiderruf\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr ""
+"Schlüssel %08lX: Mehrfacher Unterschlüssel-Widerruf-Beglaubigung entfernt\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "Schlüssel %08lX: User-ID übergangen '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "Schlüssel %08lX: Unterschlüssel ignoriert\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr ""
+"Schlüssel %08lX: Nicht exportfähige Unterschrift (Klasse %02x) - übergangen\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "Schlüssel %08lX: Widerrufzertifikat an falschem Platz - übergangen\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "Schlüssel %08lX: Ungültiges Widerrufzertifikat: %s - übergangen\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "Schlüssel %08lX: Widerrufzertifikat an falschem Platz - übergangen\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr ""
+"Schlüssel %08lX: unerwartete Unterschriftenklasse (0x%02x) - übergangen\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "Schlüssel %08lX: Doppelte User-ID entdeckt - zusammengeführt\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"WARNUNG: Schlüssel %08lX ist u.U. widerrufen: hole Widerrufschlüssel %08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"WARNUNG: Schlüssel %08lX ist u.U. widerrufen: Widerrufschlüssel %08lX ist "
+"nicht vorhanden\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "Schlüssel %08lX: \"%s\" Widerrufzertifikat hinzugefügt\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "Schlüssel %08lX: \"direct-key\"-Signaturen hinzugefügt\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "Öffentliche Schlüssel paßt nicht zum geheimen Schlüssel!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "übersprungen: geheimer Schlüssel bereits vorhanden\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "übersprungen: geheimer Schlüssel bereits vorhanden\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "Fehler beim Erzeugen des Schlüsselbundes `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "Schlüsselbund `%s' erstellt\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "Fehler beim Erstellen von `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "Schlüsselbund-Cache konnte nicht neu erzeugt werden: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[Widerruf]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[Eigenbeglaubigung]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 falsche Beglaubigung\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d falsche Beglaubigungen\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 Beglaubigung wegen fehlendem Schlüssel nicht geprüft\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d Beglaubigungen wegen fehlenden Schlüsseln nicht geprüft\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 Beglaubigung aufgrund von Fehler nicht geprüft\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d Beglaubigungen aufgrund von Fehlern nicht geprüft\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "Eine User-ID ohne gültige Eigenbeglaubigung entdeckt\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d User-IDs ohne gültige Eigenbeglaubigung entdeckt\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Bitte entscheiden Sie, in wieweit Sie diesem User zutrauen,\n"
+"Schlüssel anderer User korrekt zu prüfen (durch Vergleich\n"
+"mit Lichtbildausweisen, Vergleich der Fingerabdrücke aus\n"
+"unterschiedlichen Quellen ...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Ich vertraue ihm marginal\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Ich vertraue ihm vollständig\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Geben Sie bitte die Tiefe dieser \"Trust\"-Unterschrift ein.\n"
+"Eine Tiefe größer 1 erlaubt dem zu unterschreibenden Schlüssel\n"
+"Trust-Signatures für Sie zu machen.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+"Geben Sie bitte eine Domain ein, um die Unterschrift einzuschränken,\n"
+"oder nur die Eingabetaste für keine Domain\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "User-ID \"%s\" ist widerrufen."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Wollen Sie ihn immer noch beglaubigen? (j/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Beglaubigen ist nicht möglich.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "User-ID \"%s\" ist abgelaufen."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "User-ID \"%s\" ist nicht eigenbeglaubigt."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "User-ID \"%s\" ist nicht eigenbeglaubigt."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Wirklich unterschreiben? (j/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Die Eigenbeglaubigung von \"%s\"\n"
+"ist eine PGP 2.x artige Signatur.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Soll sie zu einer OpenPGP Eigenbeglaubigung geändert werden? (j/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Ihre derzeitige Beglaubigung von \"%s\"\n"
+"ist abgelaufen.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Soll eine neue Beglaubigung als Ersatz für die abgelaufene erstellt werden? "
+"(J/n) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Die derzeitige Beglaubigung von \"%s\"\n"
+"ist nur für diesen Rechner gültig.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+"Soll sie zu einer voll exportierbaren Beglaubigung erhoben werden? (j/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" wurde bereits durch Schlüssel %08lX lokal beglaubigt\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" wurde bereits durch Schlüssel %08lX beglaubigt\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Wollen Sie ihn immer noch wieder beglaubigen? (j/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nichts zu beglaubigen für Schlüssel %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Dieser Schlüssel ist verfallen!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Dieser Schlüssel wird %s verfallen.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Soll Ihre Beglaubigung zur selben Zeit verfallen? (J/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Im --pgp2-Modus kann nur mit PGP-2.x-artigen Schlüsseln unterschrieben "
+"werden\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Dies würde den Schlüssel für PGP 2.x unbrauchbar machen\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Wie genau haben Sie überprüft, ob der Schlüssel, den Sie jetzt beglaubigen\n"
+"wollen, wirklich der o.g. Person gehört?\n"
+"Wenn Sie darauf keine Antwort wissen, geben Sie \"0\" ein.\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Ich antworte nicht.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Ich habe es überhaupt nicht überprüft.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Ich habe es flüchtig überprüft.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Ich habe es sehr sorgfältig überprüft.%s\n"
+
+# translated by wk
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Ihre Auswahl? ('?' für weitere Informationen): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Sind Sie wirklich sicher, daß Sie vorstehenden Schlüssel mit Ihrem\n"
+"Schlüssel beglaubigen wollen: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Dies wird eine Eigenbeglaubigung sein.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"WARNUNG: Die Unterschrift wird nicht als nicht-exportierbar markiert "
+"werden.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Die Unterschrift wird nicht als nicht-widerrufbar markiert werden.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Die Unterschrift wird als nicht exportfähig markiert werden.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Die Unterschrift wird als nicht exportfähig markiert werden.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Ich habe diesen Schlüssel überhaupt nicht überprüft.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Ich habe diesen Schlüssel flüchtig überprüft.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Ich habe diesen Schlüssel sehr sorgfältig überprüft.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Wirklich unterschreiben? (j/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "Beglaubigung fehlgeschlagen: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Dieser Schlüssel ist nicht geschützt.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Geheime Teile des Haupschlüssels sind nicht vorhanden\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Geheime Teile des Haupschlüssels sind nicht vorhanden\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Schlüssel ist geschützt.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Dieser Schlüssel kann nicht editiert werden: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Geben Sie die neue Passphrase für diesen geheimen Schlüssel ein.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "Passphrase wurde nicht richtig wiederholt; noch einmal versuchen"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Sie wollen keine Passphrase - dies ist *nicht* zu empfehlen!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Möchten Sie dies wirklich tun? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "schiebe eine Beglaubigung an die richtige Stelle\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "speichern und Menü verlassen"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "\"Fingerabdruck\" anzeigen"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "Schlüssel und User-IDs auflisten"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "User-ID N auswählen"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "User-ID N auswählen"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "Signaturen widerrufen"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "Den Schlüssel nur für diesen Rechner beglaubigen"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Tip: Wählen Sie die User-IDs, die beglaubigt werden sollen\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "Eine User-ID hinzufügen"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "Eine Foto-ID hinzufügen"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "User-ID entfernen"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "Einen Zweitschlüssel entfernen"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "Einen Widerrufschlüssel hinzufügen"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"Möchten Sie die Voreinstellungen der ausgewählten User-IDs wirklich ändern? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Sie können das Verfallsdatum eines v3-Schlüssels nicht ändern\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "User-ID als Haupt-User-ID kennzeichnen"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "Umschalten zwischen Anzeige geheimer und öffentlicher Schlüssel"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "Liste der Voreinstellungen (für Experten)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "Liste der Voreinstellungen (ausführlich)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"Möchten Sie die Voreinstellungen der ausgewählten User-IDs wirklich ändern? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "Schlüsselserver-URI konnte nicht zerlegt werden\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"Möchten Sie die Voreinstellungen der ausgewählten User-IDs wirklich ändern? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "Die Passphrase ändern"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "Den \"Owner trust\" ändern"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Möchten Sie wirklich alle ausgewählten User-IDs widerrufen? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "Eine User-ID widerrufen"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "Einen Zweitschlüssel widerrufen"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "Schlüssel anschalten"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "Schlüssel abschalten"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "Foto-ID anzeigen"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "Fehler beim Lesen des geheimen Schlüsselblocks `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Geheimer Schlüssel ist vorhanden.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Hierzu wird der geheime Schlüssel benötigt.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Bitte verwenden sie zunächst den Befehl \"toggle\"\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Schlüssel wurde widerrufen."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Wirklich alle User-IDs beglaubigen? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Tip: Wählen Sie die User-IDs, die beglaubigt werden sollen\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Unbekannter Unterschriftentyp `%s'\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Dieses Kommando ist im %s-Modus nicht erlaubt.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Zumindestens eine User-ID muß ausgewählt werden.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Die letzte User-ID kann nicht gelöscht werden!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Möchten Sie alle ausgewählten User-IDs wirklich entfernen? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Diese User-ID wirklich entfernen? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Diese User-ID wirklich entfernen? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Zumindestens ein Schlüssel muß ausgewählt werden.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "'%s' kann nicht geöffnet werden: %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Fehler beim Erzeugen des Schlüsselbundes `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Zumindestens ein Schlüssel muß ausgewählt werden.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Möchten Sie die ausgewählten Schlüssel wirklich entfernen? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Möchten Sie diesen Schlüssel wirklich entfernen? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Möchten Sie wirklich alle ausgewählten User-IDs widerrufen? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Diese User-ID wirklich widerrufen? "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Möchten Sie diesen Schlüssel wirklich vollständig widerrufen? "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Möchten Sie die ausgewählten Unterschlüssel wirklich widerrufen? "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Möchten Sie diesen Schlüssel wirklich widerrufen? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "Liste der Voreinstellungen einstellen"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Möchten Sie die Voreinstellungen der ausgewählten User-IDs wirklich ändern? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Die Voreinstellungen wirklich ändern? "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Änderungen speichern? "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Beenden ohne zu speichern? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "Änderung fehlgeschlagen: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "Änderung des Geheimnisses fehlgeschlagen: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Schlüssel ist nicht geändert worden, also ist kein Speichern nötig.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Eigenschaften: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Keyserver no-modify"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "\"Notation\": "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "PGP 2.x-artige Schlüssel haben keine Voreinstellungen.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Dieser Schlüssel könnte widerrufen worden sein von %s Schlüssel "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Dieser Schlüssel könnte widerrufen worden sein von %s Schlüssel "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr "(empfindlich)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "%s kann nicht erzeugt werden: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[widerrufen]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [verfällt: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [verfällt: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " Vertrauen: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " Vertrauen: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "Gültigkeit: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Hinweis: Dieser Schlüssel ist abgeschaltet"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Bitte beachten Sie, daß ohne einen Programmneustart die angezeigte\n"
+"Schlüsselgültigkeit nicht notwendigerweise korrekt ist.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[widerrufen]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+# translated by wk
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"WARNUNG: Keine User-ID ist als primär markiert.  Dieses Kommando kann\n"
+"dazu führen, daß eine andere User-ID as primär angesehen wird.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"WARNUNG: Dies ist ein PGP2-artiger Schlüssel. Hinzufügen einer Foto-ID "
+"könnte\n"
+"         bei einigen PGP-Versionen zur Zurückweisung des Schlüssels führen.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Wollen Sie ihn immer noch hinzufügen? (j/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Sie können einem PGP2-artigen SchlüÂüsel keine Foto-ID hinzufügen.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Diese korrekte Beglaubigung entfernen? (j/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Diese ungültige Beglaubigung entfernen= (j/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Diese unbekannte Beglaubigung entfernen? (j/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Eigenbeglaubigung wirklich entfernen? (j/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d Beglaubigungen entfernt.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d Beglaubigungen entfernt.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nichts entfernt.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "ungültig"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "User-ID \"%s\" ist widerrufen."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "User-ID \"%s\" ist widerrufen."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "User-ID \"%s\" ist widerrufen."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "User-ID \"%s\" ist bereits widerrufen\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "User-ID \"%s\" ist bereits widerrufen\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"WARNUNG: Dies ist ein PGP2-artiger Schlüssel. Hinzufügen eines vorgesehenen\n"
+"         Widerrufers könnte bei einigen PGP-Versionen zur Zurückweisung\n"
+"         des Schlüssels führen.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"Sie können einem PGP2-artigen SchlüÂüsel keine vorgesehenen Widerrufer "
+"hinzufügen.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Geben sie die User-ID des designierten Widerrufers ein: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"Ein PGP 2.x-artiger Schlüssel kann nicht als vorgesehener Widerrufer "
+"eingetragen werden\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "Ein Schlüssel kann nicht sein eigener vorgesehener Widerrufer werden\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "Dieser Schlüssel wurde bereits als ein Widerrufer vorgesehen\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"WARNUNG: Einen Schlüssel als vorgesehenen Widerrufer zu deklarieren, kann "
+"nicht rückgangig gemacht werden!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Möchten Sie diesen Schlüssel wirklich als vorgesehenen Widerrufer "
+"deklarieren? (j/N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Bitte entfernen Sie die Auswahl von den geheimen Schlüsseln.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Bitte wählen Sie höchstens einen Zweitschlüssel aus.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Ändern des Verfallsdatums des Zweitschlüssels.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Ändern des Verfallsdatums des Hauptschlüssels.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Sie können das Verfallsdatum eines v3-Schlüssels nicht ändern\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Keine entsprechende Signatur im geheimen Schlüsselbund\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "WARNUNG: Signaturunterschlüssel %08lX hat keine Rücksignatur\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Bitte genau eine User-ID auswählen.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "Überspringen der v3 Eigenbeglaubigung von User-ID \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Wollen Sie es wirklich benutzen? (j/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Wollen Sie es wirklich benutzen? (j/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Beglaubigungs-\"Notation\": "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Überschreiben (j/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Keine User-ID mit Index %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Keine User-ID mit Index %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Keine User-ID mit Index %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "User-ID: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   beglaubigt durch %08lX um %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (nicht-exportierbar)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Diese Unterschrift ist seit %s verfallen.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Wollen Sie ihn immer noch widerrufen? (j/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Ein Widerrufszertifikat für diese Unterschrift erzeugen (j/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Sie haben folgende User-IDs beglaubigt:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (nicht-exportierbar)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   widerrufen durch %08lX um %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Es werden nun folgende Beglaubigungen entfernt:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Wirklich ein Unterschrift-Widerrufszertifikat erzeugen? (j/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "Kein geheimer Schlüssel\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "User-ID \"%s\" ist bereits widerrufen\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"WARNUNG: Eine User-ID-Unterschrift datiert mit %d Sekunden aus der Zukunft\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "User-ID \"%s\" ist bereits widerrufen\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "User-ID \"%s\" ist bereits widerrufen\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Anzeigen einer %s Photo ID (%ld Byte) für Schlüssel %08lX (User-ID %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "Voreinstellung %c%lu ist doppelt\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "zu viele Hashvoreinstellungen\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "zu viele Hashvoreinstellungen\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "zu viele Komprimierungsvoreinstellungen\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Ungültiges Feld in der Voreinstellungszeichenkette\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "Die \"Direct Key Signature\" wird geschrieben\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "Die Eigenbeglaubigung wird geschrieben\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "Schreiben der \"key-binding\" Signatur\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "Ungültig Schlüssellänge; %u Bit werden verwendet\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "Schlüssellänge auf %u Bit aufgerundet\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "Daten verschlüsseln"
+
+#: g10/keygen.c:1332
+#, fuzzy
+msgid "Authenticate"
+msgstr "uneingeschränkt"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+#, fuzzy
+msgid "Current allowed actions: "
+msgstr "Derzeitige Voreinstellungenliste:\n"
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (nur verschlüsseln)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Bitte wählen Sie, welche Art von Schlüssel Sie möchten:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA und ElGamal (voreingestellt)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (nur signieren/beglaubigen)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (nur verschlüsseln)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (nur verschlüsseln)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (nur signieren/beglaubigen)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (nur verschlüsseln)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (nur verschlüsseln)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Das DSA-Schlüsselpaar wird 1024 Bit haben.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Welche Schlüssellänge wünschen Sie? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Die verlangte Schlüssellänge beträgt %u Bit\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "aufgerundet auf %u Bit\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.\n"
+"         0 = Schlüssel verfällt nie\n"
+"      <n>  = Schlüssel verfällt nach n Tagen\n"
+"      <n>w = Schlüssel verfällt nach n Wochen\n"
+"      <n>m = Schlüssel verfällt nach n Monaten\n"
+"      <n>y = Schlüssel verfällt nach n Jahren\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Bitte wählen Sie, wie lange die Beglaubigung gültig bleiben soll.\n"
+"         0 = Schlüssel verfällt nie\n"
+"      <n>  = Schlüssel verfällt nach n Tagen\n"
+"      <n>w = Schlüssel verfällt nach n Wochen\n"
+"      <n>m = Schlüssel verfällt nach n Monaten\n"
+"      <n>y = Schlüssel verfällt nach n Jahren\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Wie lange bleibt der Schlüssel gültig? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Wie lange bleibt die Beglaubigung gültig? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "Ungültiger Wert.\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Schlüssel verfällt nie\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Signature verfällt nie\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Key verfällt am %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Unterschrift verfällt am %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Ihr Rechner kann Daten jenseits des Jahres 2038 nicht anzeigen.\n"
+"Trotzdem werden Daten bis 2106 korrekt verarbeitet.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Ist dies richtig? (j/N) "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Sie benötigen eine User-ID, um Ihren Schlüssel eindeutig zu machen; das\n"
+"Programm baut diese User-ID aus Ihrem echten Namen, einem Kommentar und\n"
+"Ihrer Email-Adresse in dieser Form auf:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Ihr Name (\"Vorname Nachname\"): "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Ungültiges Zeichen im Namen\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Der Name darf nicht mit einer Ziffer beginnen.\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Der Name muß min. 5 Zeichen lang sein.\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Email-Adresse: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Diese Email-Adresse ist ungültig\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Kommentar: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Ungültiges Zeichen im Kommentar.\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Sie benutzen den Zeichensatz `%s'\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Sie haben diese User-ID gewählt:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Bitte keine Emailadressen als Namen oder Kommentar verwenden\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnKkEeFfBb"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Ändern: (N)ame, (K)ommentar, (E)-Mail oder (B)eenden? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(B)eenden? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Bitte beseitigen Sie zuerst den Fehler\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Sie benötigen eine Passphrase, um den geheimen Schlüssel zu schützen.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies\n"
+"unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas\n"
+"tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Schlüsselerzeugung abgebrochen.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "schreiben des öffentlichen Schlüssels nach '%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "schreiben des geheimen Schlüssels nach '%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "schreiben des geheimen Schlüssels nach '%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "kein schreibbarer öffentlicher Schlüsselbund gefunden: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "kein schreibbarer geheimer Schlüsselbund gefunden: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "Fehler beim Schreiben des öff. Schlüsselbundes `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "Fehler beim Schreiben des geheimen Schlüsselbundes `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "Öffentlichen und geheimen Schlüssel erzeugt und signiert.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Bitte beachten Sie, daß dieser Schlüssel nicht zum Verschlüsseln benutzt\n"
+"werden kann.  Sie können aber mit dem Befehl \"--edit-key\" einen\n"
+"Zweitschlüssel für diesem Zweck erzeugen.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Schlüsselerzeugung fehlgeschlagen: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"Der Schlüssel wurde %lu Sekunde in der Zukunft erzeugt (Zeitreise oder Uhren "
+"stimmen nicht überein)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"Der Schlüssel wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise oder "
+"Uhren stimmen nicht überein)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "HINWEIS: Unterschlüssel für v3-Schlüssen sind nicht OpenPGP-konform\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Wirklich erzeugen? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "löschen des Schlüsselblocks fehlgeschlagen: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "'%s' kann nicht erzeugt werden: %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "Hinweis: geheimer Schlüssel %08lX verfällt am %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "niemals   "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Krititische Beglaubigungsrichtlinie: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Beglaubigungsrichtlinie: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Krititische Beglaubigungs-\"Notation\": "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Beglaubigungs-\"Notation\": "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Schlüsselbund"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Haupt-Fingerabdruck  ="
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "Unter-Fingerabdruck  ="
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Haupt-Fingerabdruck  ="
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr " Unter-Fingerabdruck  ="
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "  Schl.-Fingerabdruck ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Kartenseriennr. ="
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "Anbringen der ASCII-Hülle ist fehlgeschlagen: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "Warnung: Zwei Dateien mit vertraulichem Inhalt vorhanden.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s ist der Unveränderte\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s ist der Neue\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Bitte diesen potentiellen Sicherheitsmangel beseitigen\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "Prüfen des Schlüsselbundes `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu Schlüssel bislang geprüft (%lu Beglaubigungen)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu Schlüssel geprüft (%lu Beglaubigungen)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: Schlüsselbund erstellt\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Die angegebene Unterschriften-Richtlinien-URL ist ungültig\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"WARNUNG: Optionen in `%s' sind während dieses Laufes noch nicht wirksam\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "Ungültige export Option\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "Schlüssel `%s' nicht gefunden: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "Schlüssel `%s' nicht gefunden: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "Schlüssel %08lX wird von %s angefordert\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "Schlüssel %08lX wird von %s angefordert\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "suche nach \"%s\" auf HKP-Server %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "suche nach \"%s\" auf HKP-Server %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "suche nach \"%s\" auf HKP-Server %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"unterschrieben mit Ihrem Schlüssel %08lX um %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "suche nach \"%s\" auf HKP-Server %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "suche nach \"%s\" auf HKP-Server %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "Ungültige export Option\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "Kein Schlüsselserver bekannt (Option --keyserver verwenden)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "Schlüsselserverfehler"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "Schlüsselserverfehler"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "Empfangen vom Schlüsselserver fehlgeschlagen: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s: Dies ist keine gültige Schlüssel-ID\n"
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr ""
+"WARNUNG: die temporäre Datei (%s) `%s' konnte nicht entfernt werden: %s\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "Schlüssel %08lX wird von %s angefordert\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "Schlüssel %08lX wird von %s angefordert\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr ""
+"WARNUNG: die temporäre Datei (%s) `%s' konnte nicht entfernt werden: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr ""
+"WARNUNG: die temporäre Datei (%s) `%s' konnte nicht entfernt werden: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "Seltsame Länge für einen verschlüsselten Sitzungsschlüssel (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s verschlüsselter Sitzungsschlüssel\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "Passphrase wurde mit unbekanntem Hashverfahren %d erstellt\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "Öffentlicher Schlüssel ist %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "Mit öffentlichem Schlüssel verschlüsselte Daten: Korrekte DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "verschlüsselt mit %u-Bit %s Schlüssel, ID %s, erzeugt %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                    alias \""
+
+# Scripte scannen lt. dl1bke auf "ID (0-9A-F)+" deswegen muß "ID" rein :-(
+# [kw]
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "verschlüsselt mit %s Schlüssel, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "Entschlüsselung mit Public-Key-Verfahren fehlgeschlagen: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "Verschlüsselt mit %lu Passphrases\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "Verschlüsselt mit einer Passphrase\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "vermutlich %s-verschlüsselte Daten\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA-Verschlüsselung nicht verfügbar; versucht wird stattdessen %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "Entschlüsselung erfolgreich\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr ""
+"WARNUNG: Botschaft wurde nicht integritätsgeschützt (integrity protected)\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "Warnung: Verschlüsselte Botschaft ist manipuliert worden!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "Entschlüsselung fehlgeschlagen: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr ""
+"Hinweis: Der Absender verlangte Vertraulichkeit(\"for-your-eyes-only\")\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "Ursprünglicher Dateiname='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"Einzelner Widerruf - verwenden Sie \"gpg --import\" um ihn anzuwenden\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Korrekte Unterschrift von \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "Unterschriften-Überprüfung unterdrückt\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "diese Mehrfachunterschriften können nicht behandelt werden\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Diese Unterschrift ist seit %s verfallen.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                    alias \""
+
+# Scripte scannen lt. dl1bke auf "ID (0-9A-F)+" deswegen muß "ID" rein :-(
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Unterschrift vom %.*s, %s Schlüssel ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Schlüssel erhältlich bei: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "FALSCHE Unterschrift von \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Verfallene Unterschrift von \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Korrekte Unterschrift von \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[ungewiß]  "
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                    alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Diese Unterschrift ist seit %s verfallen.\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Diese Unterschrift verfällt am %s.\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s Unterschrift, Hashmethode \"%s\"\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "Binäre"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "Textmodus"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "unbekannt"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Unterschrift kann nicht geprüft werden: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "keine abgetrennte Unterschrift\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"WARNUNG: Mehrfache Signaturen erkannt.  Es wird nur die erste geprüft.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "Einzelne Unterschrift der Klasse 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "Unterschrift nach alter (PGP 2.x) Art\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "ungültiges root-Paket in proc_tree() entdeckt\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "core-dump-Dateierzeugung kann nicht abgeschaltet werden: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "Änderung der \"Trust-DB\" fehlgeschlagen: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "trustdb: read failed (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "dieses Public-Key Verfahren %d kann nicht benutzt werden\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "Verschlüsselungsverfahren ist nicht implementiert"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s Unterschrift, Hashmethode \"%s\"\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"Erzwingen des Hashverfahrens %s (%d) verletzt die Empfängervoreinstellungen\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "das IDEA-Verschlüsselungs-Plugin ist nicht vorhanden\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = Bitte weitere Information anzeigen\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: mißbilligte Option \"%s\".\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "WARNUNG: \"%s\" ist eine mißbilligte Option.\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "Bitte benutzen Sie stattdessen \"%s%s\".\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "WARNUNG: \"%s\" ist eine mißbilligte Option.\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "nicht komprimiert"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "unkomprimiert|kein|keine"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "Diese Botschaft könnte für %s unbrauchbar sein\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "Optionen werden aus '%s' gelesen\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "Unbekannter voreingestellter Empfänger '%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Datei '%s' existiert bereits. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Überschreiben (j/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: unbekannte Dateinamenerweiterung\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Neuen Dateinamen eingeben"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "Schreiben auf die Standardausgabe\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "die unterzeichneten Daten sind wohl in '%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "Neue Konfigurationsdatei `%s' erstellt\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"WARNUNG: Optionen in `%s' sind während dieses Laufes noch nicht wirksam\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "Verzeichnis `%s' erzeugt\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "dieses Public-Key Verfahren %d kann nicht benutzt werden\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"WARNUNG: Möglicherweise unsicherer symmetrisch verschlüsselter "
+"Sitzungsschlüssel\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "Im Unterpaket des Typs %d ist das \"critical bit\" gesetzt\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "GPG-Agent ist in dieser Sitzung nicht vorhanden\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "fehlerhaft aufgebaute GPG_AGENT_INFO - Umgebungsvariable\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "GPG-Agent-Protokoll-Version %d wird nicht unterstützt\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "Verbindung zu '%s' kann nicht aufgebaut werden: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr ""
+"Schwierigkeiten mit dem Agenten - Agent-Ansteuerung wird abgeschaltet\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (Hauptschlüssel-ID %08lX)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.\n"
+"Benutzer: \"%.*s\"\n"
+"%u-bit %s Schlüssel, ID %s, erzeugt %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Geben Sie die Passphrase nochmal ein\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Geben Sie die Passphrase ein\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "Abbruch durch Benutzer\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "Passphrase kann im Batchmodus nicht abgefragt werden\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Geben Sie die Passphrase ein: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.\n"
+"Benutzer: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-Bit %s Schlüssel, ID %08lX, erzeugt %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Geben Sie die Passphrase nochmal ein: "
+
+# translated by wk
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Wählen Sie ein Bild für Ihre Photo ID aus. Das Bild muß eine JPEG Datei\n"
+"sein.  Bitte beachten Sie, daß das Bild in Ihrem öffentlichen\n"
+"Schlüssel gespeichert wird.  Wenn Sie ein sehr großes Bild benutzen,\n"
+"wir Ihr Schlüssel leider auch sehr groß werden.  Ein Bild der GröÂße\n"
+"240x288 Pixel ist eine gute Wahl.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Dateiname mit JPEG für die Photo ID eingeben: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "Datei kann nicht geöffnet werden: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Wollen Sie es wirklich benutzen? (j/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' ist keine JPEG Datei\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Ist dieses Bild richtig? (j/N) "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "Die Photo ID kann nicht angezeigt werden!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Kein Grund angegeben"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Schlüssel ist überholt"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Hinweis: Dieser Schlüssel ist nicht mehr sicher"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Schlüssel wird nicht mehr benutzt"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "User-ID ist nicht mehr gültig"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "Grund für Widerruf: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "Widerruf-Bemerkung: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Es ist kein \"trust value\" zugewiesen für:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                    alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Dieser Schlüssel gehört wahrscheinlich dem angegebenen Besitzer\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Weiß nicht so recht\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Nein, ihm traue ich NICHT\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Ich vertraue ihm absolut\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = Zurück zum Menü\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = diesen Schlüssel überSpringen\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = verlassen\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr "Die minimale Trust-Ebene für diesen Schlüssel beträgt: %s\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Ihre Auswahl? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Möchten Sie diesem Schlüssel wirklich uneingeschränkt vertrauen? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Zertifikate führen zu einem letztlich vertrauenswürdigen Schlüssel:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Es gibt keine Garantie, daß dieser Schlüssel wirklich dem angegebenen "
+"Besitzer gehört.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Es gibt nur eine beschränkte Garantie, daß dieser Schlüssel wirklich "
+"dem angegebenen Besitzer gehört.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Dieser Schlüssel gehört wahrscheinlich dem angegebenen Besitzer\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr ""
+"Dieser Schlüssel gehört uns (da wir nämlich den geheimen Schlüssel dazu "
+"haben)\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Es ist NICHT sicher, daß der Schlüssel dem vorgeblichen Besitzer gehört.\n"
+"Wenn Sie *wirklich* wissen, was Sie tun, können Sie die nächste\n"
+"Frage mit ja beantworten\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Diesen Schlüssel trotzdem benutzen? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "WARNUNG: Ein Schlüssel ohne gesichertes Vertrauen wird benutzt!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"WARNUNG: Dieser schlüssel ist u.U. widerrufen: Widerrufschlüssel ist nicht "
+"vorhanden\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+"WARNUNG: Dieser Schlüssel wurde vom vorgesehen Widerrufer widerrufen!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "WARNUNG: Dieser Schlüssel wurde von seinem Besitzer widerrufen!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Das könnte bedeuten, daß die Signatur gefälscht ist.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "WARNUNG: Dieser Unterschlüssel wurde von seinem Besitzer widerrufen!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Hinweis: Dieser Schlüssel wurde abgeschaltet.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Hinweis: Dieser Schlüssel ist verfallen!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "WARNUNG: Dieser Schlüssel trägt keine vertrauenswürdige Signatur!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen "
+"Besitzer gehört.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "WARNUNG: Wir haben KEIN Vertrauen zu diesem Schlüssel!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Die Signatur ist wahrscheinlich eine FÄLSCHUNG.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"WARNUNG: Dieser Schlüssel ist nicht durch hinreichend vertrauenswürdige "
+"Signaturen zertifiziert!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr ""
+"         Es ist nicht sicher, daß die Signatur wirklich dem vorgeblichen "
+"Besitzer gehört.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: übersprungen: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: übersprungen: öffentlicher Schlüssel bereits vorhanden\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+#, fuzzy
+msgid "Current recipients:\n"
+msgstr "Derzeitige Voreinstellungenliste:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Geben Sie die User-ID ein. Beenden mit einer leeren Zeile: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Keine solche User-ID vorhanden.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr ""
+"übersprungen: öffentlicher Schlüssel bereits als Standardempfänger gesetzt\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Öffentlicher Schlüssel ist abgeschaltet.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "übersprungen: öffentlicher Schlüssel bereits gesetzt\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "Unbekannter voreingestellter Empfänger '%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: übersprungen: öffentlicher Schlüssel ist abgeschaltet\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "Keine gültigen Adressaten\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+"Daten wurden nicht gespeichert; verwenden Sie dafür die Option \"--output\"\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "Fehler beim Erstellen von `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Abgetrennte Beglaubigungen.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Bitte geben Sie den Namen der Datendatei ein: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "lese stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "keine unterschriebene Daten\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "kann signierte Datei '%s' nicht öffnen.\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "Ungenannter Empfänger; Versuch mit geheimen Schlüssel %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "Alles klar, wir sind der ungenannte Empfänger.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "alte Kodierung des DEK wird nicht unterstützt\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "Verschüsselungsverfahren %d%s ist unbekannt oder abgeschaltet\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "Hinweis: Verfahren %d ist kein bevorzugtes Verschlüsselungsverfahren\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "Hinweis: geheimer Schlüssel %08lX verfällt am %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "Hinweis: Schlüssel wurde widerrufen"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "\"build_packet\" fehlgeschlagen: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "Schlüssel %08lX: Keine User-ID\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Schlüssel soll widerrufen werden von:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Dies ist ein \"sensitiver\" Widerrufsschlüssel)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Ein Widerrufszertifikat für diesen Schlüssel erzeugen? (j/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Ausgabe mit ASCII Hülle erzwungen\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "\"make_keysig_packet\" fehlgeschlagen: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Widerrufzertifikat erzeugt.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "Widerrufsschlüssel für `%s' nicht gefunden\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "Geheimer Schlüssel `%s' nicht gefunden: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "kein zugehöriger öffentlicher Schlüssel: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "Öffentliche Schlüssel paßt nicht zum geheimen Schlüssel!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Ein Widerrufszertifikat für diesen Schlüssel erzeugen? (j/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "Unbekanntes Schutzverfahren\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "Dieser Schlüssel ist nicht geschützt.\n"
+
+# translated by wk
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Widerrufszertifikat wurde erzeugt.\n"
+"\n"
+"Bitte speichern Sie es auf einem Medium welches sie wegschliessen\n"
+"können; falls Mallory (ein Angreifer) Zugang zu diesem Zertifikat\n"
+"erhält, kann erIhren Schlüssel unbrauchbar machen.  Es wäre klug,\n"
+"dieses Widerrufszertifikat auch auszudrucken und sicher aufzubewahren,\n"
+"falls das ursprüngliche Mediumnicht mehr lesbar ist. Aber Obacht: Das\n"
+"Drucksystem kann unter Umständen eine Kopie anderen Nutzern zugänglich\n"
+"machen.\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Grund für den Widerruf:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Wahrscheinlich möchten Sie hier %d auswählen)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+"Geben Sie eine optionale Beschreibung ein. Beenden mit einer leeren Zeile:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Grund für Widerruf: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Keine Beschreibung angegeben)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Ist das richtig? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "Teile des geheimen Schlüssels sind nicht vorhanden\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "Schutzverfahren %d%s wird nicht unterstützt\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "Hashschutzverfahren %d wird nicht unterstützt\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Ungültige Passphrase; versuchen Sie es bitte noch einmal"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"WARNUNG: Unsicherer Schlüssel entdeckt -\n"
+"         bitte Passphrase nochmals wechseln.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"Die mißbilligte 16-bit Prüfsumme wird zum Schutz des geheimen Schlüssels "
+"benutzt\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "Unsicherer Schlüssel erzeugt - neuer Versuch\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"Trotz %d-fachen Versuch konnte die Erzeugung eines unsicheren Schlüssels für "
+"sym.Verschlüsselung nicht vermieden werden!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "WARNUNG: Widersprechende Hashverfahren in der signierten Nachricht\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "WARNUNG: Signaturunterschlüssel %08lX hat keine Rücksignatur\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"WARNUNG: Signaturunterschlüssel %08lX hat eine ungültige Rücksignatur\n"
+
+#: g10/sig-check.c:181
+#, fuzzy, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr ""
+"Öffentlicher Schlüssel %08lX ist um %lu Sekunde jünger als die Unterschrift\n"
+
+#: g10/sig-check.c:182
+#, fuzzy, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr ""
+"Öffentlicher Schlüssel %08lX ist um %lu Sekunden jünger als die "
+"Unterschrift\n"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"Der Schlüssel wurde %lu Sekunde in der Zukunft erzeugt (Zeitreise oder Uhren "
+"stimmen nicht überein)\n"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"Der Schlüssel wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise oder "
+"Uhren stimmen nicht überein)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "Hinweis: Signaturschlüssel %08lX ist am %s verfallen.\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"Vermutlich eine FALSCHE Unterschrift von Schlüssel %08lX, wegen unbekanntem "
+"\"critical bit\"\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+"Schlüssel %08lX: Kein Unterschlüssel für die Unterschlüsselwiderruf-"
+"Beglaubigung\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+"Schlüssel %08lX: Kein Unterschlüssel für die Unterschlüsselanbindungs-"
+"Beglaubigung\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"Notationen können in einen v3 (PGP 2.x-artigen) Schlüssel nicht eingetragen "
+"werden\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"Notationen können in eine v3 (PGP 2.x-artige) Schlüsselunterschrift nicht "
+"eingetragen werden\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"WARNUNG: \"Notation\" kann nicht %%-erweitert werden (zu groß). Verwende "
+"\"unerweiterte\".\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"Eine Policy URL kann in einen v3 (PGP 2.x-artigen) Schlüssel nicht "
+"eingetragen werden\n"
+
+# translated by wk
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"Eine Policy URL kann in einem v3 Schlüssel(PGP 2.x artig) nicht gespeichert "
+"werden\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"WARNUNG: Richtlinien-URL kann nicht %%-erweitert werden (zu gro0). Verwende "
+"\"unerweiterte\".\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"WARNUNG: Richtlinien-URL kann nicht %%-erweitert werden (zu gro0). Verwende "
+"\"unerweiterte\".\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "Prüfung der erstellten Unterschrift ist fehlgeschlagen: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s Unterschrift von: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"Im --pgp2-Modus kann nur mit PGP-2.x-artigen Schlüsseln eine abgetrennte "
+"Unterschrift erzeugt werden\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"Erzwingen des Hashverfahrens %s (%d) verletzt die Empfängervoreinstellungen\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "unterschreibe:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"Im --pgp2-Modus können Sie Klartextunterschriften nur mit PGP-2.x-artigen "
+"Schlüssel machen\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s Verschlüsselung wird verwendet\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"Schlüssel ist nicht als unsicher gekennzeichnet - er ist nur mit einem\n"
+"echten Zufallsgenerator verwendbar\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "übersprungen '%s': doppelt\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "übersprungen '%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "übersprungen: geheimer Schlüssel bereits vorhanden\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"'%s übersprungen: Dies ist ein durch PGP erzeugter ElGamal-Schlüssel. Das "
+"ist für Signaturen NICHT sicher genug!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "Vertrauenssatz %lu, Typ %d: Schreiben fehlgeschlagen: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Liste de zugewiesenden Trustwerte, erzeugt am %s\n"
+"# (\"gpg --import-ownertrust\" um sie zu restaurieren)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "Fehler beim Lesen von `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "Zeile ist zu lang\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "Fehler: ungültiger Fingerabdruck\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "Importieren der \"Owner trust\"-Werte"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "Fehler beim Suchen des \"Trust records\": %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "Lesefehler: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "\"Trust-DB\": sync fehlgeschlagen: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb Satz %lu: lseek fehlgeschlagen: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb Satz %lu: write fehlgeschlagen (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "trustdb Transaktion zu groß\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "kann '%s' nicht schließen: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: Verzeichnis existiert nicht!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "'%s' kann nicht erzeugt werden: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "'%s' kann nicht geöffnet werden\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: Fehler beim Erzeugen des Versionsatzes: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: ungültige trust-db erzeugt\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: trust-db erzeugt\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "Notiz: Die \"trustdb\" ist nicht schreibbar\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: ungültige 'Trust'-Datenbank\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: hashtable kann nicht erzeugt werden: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: Fehler beim Ändern des Versionsatzes: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: Fehler beim Lesen des Versionsatzes: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: Fehler beim Schreiben des Versionsatzes: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek fehlgeschlagen: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: read failed (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: keine trustdb Datei\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: version record with recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: invalid file version %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: Fehler beim Lesen eines freien Satzes: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: Fehler beim Schreiben eines Verzeichnis-Satzes: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: konnte einen Satz nicht Nullen: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: konnte Satz nicht anhängen: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"Die \"Trust\"-Datenbank ist beschädigt; verwenden Sie \"gpg --fix-trustdb"
+"\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "Textzeilen länger als %d Zeichen können nicht benutzt werden\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "Eingabezeile ist länger als %d Zeichen\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "'%s' ist keine gültige lange Schlüssel-ID\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "Schlüssel %08lX: Akzeptiert als vertrauenswürdiger Schlüssel\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "Schlüssel %08lX tritt mehr als einmal in der \"trustdb\" auf\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"Schlüssel %08lX: kein öffentlicher Schlüssel für den vertrauenswürdigen "
+"Schlüssel - übersprungen\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "Schlüssel ist als uneingeschränkt vertrauenswürdig gekennzeichnet.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "trust record %lu, req type %d: read failed: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "Vertrauenssatz %lu ist nicht von der angeforderten Art %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[widerrufen]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[verfallen]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "unbekannt"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+#, fuzzy
+msgid "[marginal]"
+msgstr "marginal"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+#, fuzzy
+msgid "[ultimate]"
+msgstr "uneingeschränkt"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "unbestimmt"
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "niemals   "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "marginal"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "vollständig"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "uneingeschränkt"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "\"Trust-DB\"-Überprüfung nicht nötig\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "nächste \"Trust-DB\"-Pflichtüberprüfung am %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+"\"Trust-DB\"-Überprüfung ist beim \"%s\"-Vertrauensmodell nicht nötig\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "\"Trust-DB\"-Änderung ist beim \"%s\"-Vertrauensmodell nicht nötig\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "Öffentlicher Schlüssel %08lX nicht gefunden: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "Bitte ein --check-trustdb durchführen\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "\"Trust-DB\" wird überprüft\n"
+
+# translated by wk
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d Schlüssel verarbeitet (%d Validity Zähler gelöscht)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "keine uneingeschränkt vertrauenswürdige Schlüssel gefunden\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+"öff.Schlüssel des uneingeschränkt vertrautem Schlüssel %08lX nicht gefunden\n"
+
+#: g10/trustdb.c:2197
+#, 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"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"\"Trust-DB\"-Versions-Satz kann nicht geändert werden: Schreiben "
+"fehlgeschlagen: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"Die Unterschrift konnte nicht überprüft werden.\n"
+"Denken Sie daran, daß die Datei mit der Unterschrift (.sig oder .asc)\n"
+"als erster in der Kommandozeile stehen sollte.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "Eingabezeile %u ist zu lang oder es fehlt ein LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "Allgemeiner Fehler"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "Unbekannter Pakettyp"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "Unbekannte Version"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "Unbekanntes Public-Key-Verfahren"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "Unbekanntes Hashverfahren"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "Falscher öffentlicher Schüssel"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "Falscher geheimer Schlüssel"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "Falsche Unterschrift"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "Prüfsummen-Fehler"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "Falsche Passphrase"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "Öffentlicher Schlüssel nicht gefunden"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "Unbekanntes Verschlüsselungsverfahren"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "Der Schlüsselbund kann nicht geöffnet werden"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "Ungültiges Paket"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "Ungültige ASCII-Hülle"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "Keine solche User-ID"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "Geheimer Schlüssel ist nicht vorhanden"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "Falscher geheimer Schlüssel benutzt"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "Wird nicht unterstützt"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "Falscher Schlüssel"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "Dateilesefehler"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "Dateischreibfehler"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "Unbekanntes Komprimierverfahren"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "Fehler beim Öffnen der Datei"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "Fehler beim Erzeugen der Datei"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "Ungültige Passphrase"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "nicht implementiertes öffentliches Schlüsselverfahren"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "Verschlüsselungsverfahren ist nicht implementiert"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "Unbekannte Unterschriftenklasse"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "Fehler in der Trust-DB"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "Falsche MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "festdefinierte Ressourcenobergrenze erreicht"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "Ungültiger Schlüsselbund"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "Falsches Zertifikat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "Ungünstig aufgebaute User-ID"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "Fehler beim Schließen der Datei"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "Fehler beim Umbenennen einer Datei"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "Fehler beim Löschen einer Datei"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "Unerwartete Daten"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "Zeitangaben differieren"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "Unbenutzbares öffentliches Schlüsselverfahren"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "Datei existiert bereits"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "Unsicherer Schlüssel"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "Ungültiges Argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "fehlerhafter URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "Nicht unterstützter URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "Netzwerkfehler"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "nicht verschlüsselt"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "nicht bearbeitet"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "unbrauchbarer öffentlicher Schüssel"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "unbrauchbarer geheimer Schlüssel"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "Schlüsselserverfehler"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Abbruch"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "keine Karte"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "keine unterschriebene Daten\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "FEHLER: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "WARNUNG: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... dies ist ein Bug (Programmfehler) (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "Sie haben eine Bug (Programmfehler) gefunden ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "ja"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "jJyY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nein"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "WARNUNG: Sensible Daten könnten auf Platte ausgelagert werden.\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "siehe http://www.gnupg.org/faq.html für weitere Informationen\n"
+
+# "  Um dies zu vermeiden, kann das Programm suid(root) installiert werden.\n"
+# "  Bitte wenden Sie sich hierzu an den Systemadministrator.\n"
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "Vorgang ist ohne sicheren Hauptspeicher nicht möglich\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr ""
+"(möglicherweise haben Sie das falsche Programm für diese Aufgabe benutzt)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA benötigt einen 160-bit Hash Algorithmus\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "Für weitere Info siehe http://www.gnupg.org/why-not-idea.html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "Ein \"notation\"-Name darf nur Buchstaben, Zahlen, Punkte oder "
+#~ "Unterstriche enthalten und muß mit einem '=' enden\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "Ein \"notation\"-Wert darf das '@'-Zeichen nicht verwenden\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "Ein \"notation\"-Wert darf das '@'-Zeichen nicht verwenden\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "Ein \"notation\"-Wert darf keine Kontrollzeichen verwenden\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "WARNUNG: Ungültige \"Notation\"-Daten gefunden\n"
+
+#~ msgid "not human readable"
+#~ msgstr "nicht als Klartext darstellbar"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "Optionen aus der Datei lesen"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "Optionen aus der Datei lesen"
+
+#~ msgid "expired: %s)"
+#~ msgstr "verfällt: %s)"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr ""
+#~ "Schlüssel %08lX: unerwartete Unterschriftenklasse (0x%02x) - übergangen\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "Ausführen des Programms `%s' nicht möglich: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Keine User-ID für Schlüssel\n"
+
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "Fehler beim Holen der Seriennummer: %s\n"
+
+#~ msgid "length of RSA modulus is not %d\n"
+#~ msgstr "die Länge des RSA-Modulus beträgt nicht %d\n"
+
+#~ msgid "length of an RSA prime is not %d\n"
+#~ msgstr "die Länge einer RSA-Primzahl ist nicht %d\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr ""
+#~ "Falsche Passphrase oder unbekanntes Verschlüsselungsverfahren (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "Client-PID für den Agent kann nicht gesetzt werden\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "Server-Lese-Handle für den Agent nicht verfügbar\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "Server-Schreib-Handle für den Agent nicht verfügbar\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "Kommunikationsproblem mit GPG-Agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "Passphrase ist zu lang\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "Falsche Antwort des Agenten\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "Schwierigkeiten mit dem Agenten: Agent antwortet 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "Zweitschlüssel N auswählen"
+
+#~ msgid "list signatures"
+#~ msgstr "Liste der Signaturen"
+
+#~ msgid "sign the key"
+#~ msgstr "Den Schlüssel signieren"
+
+#~ msgid "add a secondary key"
+#~ msgstr "Einen Zweitschlüssel hinzufügen"
+
+#~ msgid "delete signatures"
+#~ msgstr "Signatur entfernen"
+
+#~ msgid "change the expire date"
+#~ msgstr "Ändern des Verfallsdatums"
+
+#~ msgid "set preference list"
+#~ msgstr "Liste der Voreinstellungen einstellen"
+
+#~ msgid "updated preferences"
+#~ msgstr "geänderte Voreinstellungen"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Kein Zweitschlüssel mit Index %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key User-ID"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key User-ID"
+
+#~ msgid "make a trust signature"
+#~ msgstr "Eine Trust-Unterschrift erzeugen"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "Den Schlüssel nicht-widerrufbar beglaubigen"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr ""
+#~ "Den Schlüssel nicht-widerrufbar und nur für diesen Rechner signieren"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "Liste der Schlüssel"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "Allgemeiner Fehler"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "tsign"
+#~ msgstr "tsign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "Schlüsselserverfehler"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "Hashmethode `%s' ist in diesem Release read-only\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Es wird ein neues %s Schlüsselpaar erzeugt.\n"
+#~ "              kleinste Schlüssellänge ist  768 Bit\n"
+#~ "              standard Schlüssellänge ist 1024 Bit\n"
+#~ "      gröÂßte sinnvolle Schlüssellänge ist 2048 Bit\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA erlaubt nur Schlüssellängen von 512 bis 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "zu kurz; 1024 ist die kleinste für RSA mögliche Schlüssellänge.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "zu kurz; 768 ist die kleinste mögliche Schlüssellänge.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "SchüsselgröÂße zu hoch; %d ist der Maximalwert.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Schlüssellängen gröÂßer als 2048 werden nicht empfohlen, da die\n"
+#~ "Berechnungen dann WIRKLICH lange brauchen!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Sind Sie sicher, daß Sie diese Schlüssellänge wünschen? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Gut, aber bitte denken Sie auch daran, daß Monitor und Tastatur Daten "
+#~ "abstrahlen und diese leicht mitgelesen werden können.\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Experimentiermethoden sollten nicht benutzt werden!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "Es ist davon abzuraten, diese Verschlüsselungsmethode zu benutzen!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "Schreiben nach '%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "Dies kann im Batchmodus nicht durchgeführt werden.\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "Schlüssel `%s' nicht gefunden: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "'%s' kann nicht erzeugt werden: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "Datei kann nicht geöffnet werden: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                    alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "Schlüssel %08lX: Schlüssel wurde widerrufen\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "Schlüssel %08lX: Unterschlüssel wurde widerrufen\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: Schlüssel ist verfallen!\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Wir haben KEIN Vertrauen zu diesem Schlüssel!\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (signieren/beglaubigen und verschlüsseln)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (nur signieren/beglaubigen)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (signieren/beglaubigen und verschlüsseln)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (nur verschlüsseln)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (signieren/beglaubigen und verschlüsseln)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: kann nicht geöffnet werden: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: WARNUNG: Leere Datei\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "'%s' kann nicht geöffnet werden: %s\n"
+
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr "   (%d) Ich vertraue ihm marginal\n"
+
+# c-format
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr "   (%d) Ich vertraue ihm vollständig\n"
+
+#~ msgid "Really sign? "
+#~ msgstr "Wirklich unterschreiben? "
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "lokal unterschrieben mit Ihrem Schlüssel %08lX um %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   beglaubigt durch %08lX am %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: kann nicht zugegriffen werden: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: Sperre kann nicht erzeugt werden\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: Sperre kann nicht erzeugt werden\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: kann nicht erzeugt werden: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: Verzeichnis kann nicht erzeugt werden: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Wenn Sie diesen widerrufenen Schlüssel trotzdem benutzen wollen,\n"
+#~ "so antworten Sie mit \"ja\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Das Bild \"%s\" konnte nicht geöffnet werden: %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "Datei kann nicht geöffnet werden: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "Fehler: Doppelpunkt fehlt\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "Fehler: Kein \"Owner trust\"-Wert\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (Hauptschlüssel-ID %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! Unterschlüssel wurde widerrufen: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- gefälschter Schlüsselwiderruf entdeckt\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? Schwierigkeiten bei der Widerruf-Überprüfung: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [verfällt: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [verfällt: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[widerrufen]"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "%s kann nicht erzeugt werden: %s\n"
+
+# translated by wk
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "WARNUNG: Hashmethode `%s' ist nicht Teil von OpenPGP.  Benutzung auf "
+#~ "eigenes Risiko!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[Dateien]|Dateien verschlüsseln"
+
+#~ msgid "store only"
+#~ msgstr "Nur speichern"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[Dateien]|Dateien entschlüsseln"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "Schlüssel nicht widerrufbar signieren"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "Schlüssel nur für diesen Rechner und nicht-widerrufbar signieren"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "Lediglich Struktur der Datenpakete anzeigen"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "Exportieren der \"Owner trust\"-Werte"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "unbeaufsichtigtes Ändern der \"Trust\"-Datenbank"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "Reparieren einer beschädigten \"Trust\"-Datenb."
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Datei oder stdin von der ASCII-Hülle befreien"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Datei oder stdin in eine ASCII-Hülle einpacken"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NAME|NAME als voreingestellten Empfänger benutzen"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr ""
+#~ "Den Standardschlüssel als voreingestellten\n"
+#~ "Empfänger benutzen"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "das Terminal gar nicht benutzen"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "v3 Signaturen erzwingen"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "v3 Signaturen nicht erzwingen"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "v4 Signaturen erzwingen"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "v4 Signaturen nicht erzwingen"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "Beim Verschlüsseln ein Siegel (MDC) verwenden"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "Beim Verschlüsseln niemals ein Siegel (MDC) verwenden"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "den GPG-Agent verwenden"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "Stapelmodus: Keine Abfragen"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "\"Ja\" als Standardantwort annehmen"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "\"Nein\" als Standardantwort annehmen"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "Als öffentlichen Schlüsselbund mitbenutzen"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "Als geheimen Schlüsselbund mitbenutzen"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NAME|NAME als voreingestellten Schlüssel benutzen"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|Schlüssel bei diesem Server nachschlagen"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NAME|Terminalzeichensatz NAME benutzen"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[Datei]|Statusinfo in Datei schreiben"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KEYID|diesem Schlüssel uneingeschränkt vertrauen"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|DATEI|Erweiterungsmodul DATEI laden"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "Den in RFC1991 beschriebenen Modus nachahmen"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "alle Paket-, Verschlüsselungs- und\n"
+#~ "Hashoptionen auf OpenPGP-Verhalten einstellen"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "alle Paket-, Verschlüsselungs- und\n"
+#~ "Hashoptionen auf PGP 2.X-Verhalten einstellen"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|Verwenden des Passphrasen-Modus N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NAME|Hashverfahren NAME für Passphrasen benutzen"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NAME|Verschl.verfahren NAME für Passphrasen benutzen"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NAME|Verschl.verfahren NAME benutzen"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NAME|Hashverfahren NAME benutzen"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|Komprimierverfahren N benutzen"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "Empfänger-ID verschlüsselter Pakete entfernen"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Foto-IDs anzeigen"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Foto-IDs nicht anzeigen"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Kommandozeilentext für den Foto-Betrachter setzen"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "Kompressionsverfahren `%s' ist in diesem Release read-only\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "Das Komprimierverfahren muß im Bereich %d bis %d liegen\n"
+
+#~ msgid ""
+#~ "%08lX: There is no indication that this key really belongs to the owner\n"
+#~ msgstr ""
+#~ "%08lX: Es gibt keinen Hinweis, daß die Signatur wirklich dem vorgeblichen "
+#~ "Besitzer gehört.\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Es ist nicht sicher, daß dieser Schlüssel wirklich dem "
+#~ "vorgeblichen\n"
+#~ "Besitzer gehört, aber er wird trotzdem akzeptiert\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "Voreinstellung %c%lu ist nicht gültig\n"
+
+#~ msgid "too many `%c' preferences\n"
+#~ msgstr "zu viele `%c' Voreinstellungen\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "Schlüssel %08lX: dies ist kein RFC2440-Schüssel - übersprungen\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "HINWEIS: Elgamal-Hauptschlüssel gefunden - der Import könnte einige Zeit "
+#~ "dauern\n"
+
+#~ msgid " (default)"
+#~ msgstr "Daten entschlüsseln (Voreinstellung)"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  erstellt: %s verfällt: %s"
+
+#~ msgid "Policy: "
+#~ msgstr "Richtlinie: "
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "Schlüssel ist beim Schlüsselserver nicht erhältlich: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "Fehler beim Senden an `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "Senden an `%s' erfolgreich (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "Senden an `%s' erfolglos (status=%u)\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "Dieser Schlüsselserver unterstützt --search-keys nicht\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "kann Schlüsselserver nicht durchsuchen: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "Schlüssel %08lX: Dieser durch PGP erzeugte ElGamal-Schlüssel ist für "
+#~ "Signaturen NICHT sicher genug!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "Der Schlüssel %08lX wurde %lu Sekunde in der Zukunft erzeugt (Zeitreise "
+#~ "oder Uhren stimmen nicht überein)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "Der Schlüssel %08lX wurde %lu Sekunden in der Zukunft erzeugt (Zeitreise "
+#~ "oder Uhren stimmen nicht überein)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr ""
+#~ "Schlüssel %08lX ist als uneingeschränkt vertrauenswürdig gekennzeichnet\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "Signatur von Elgamal Signaturschlüssel %08lX für %08lX ignoriert\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "Signatur von %08lX für Elgamal Signaturschlüssel %08lX ignoriert\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr "überprüfen, Tiefe %d, gültig=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Wählen Sie die zu verwendende Methode aus.\n"
+#~ "\n"
+#~ "DSA (alias DSS) bedeutet \"digital signature algorithm\" (Digitales\n"
+#~ "  Unterschrift-Verfahren). Es kann nur zum Unterschreiben und "
+#~ "Beglaubigen\n"
+#~ "  benutzt werden. Dies ist das empfohlene Verfahren, da dessen "
+#~ "Überprüfung\n"
+#~ "  wesentlich schneller abläuft, als die von \"ElGamal\".\n"
+#~ "\n"
+#~ "ElGamal ist ein Verfahren für Unterschrift, Beglaubigung und "
+#~ "Verschlüsselung\n"
+#~ "  OpenPGP unterscheidet zwischen zwei Arten von ElGamal: eines nur zum\n"
+#~ "  Unterschreiben/Beglaubigen und eines zusätzlich zum Verschlüsseln.\n"
+#~ "  Eigentlich sind diese Arten identisch; allerdings müssen einige "
+#~ "Parameter\n"
+#~ "  auf eine besondere Art gewählt werden, um einen sicheren Schlüssel für\n"
+#~ "  Unterschriften zu erzeugen. Dieses Programm macht dies zwar so, aber "
+#~ "andere\n"
+#~ "  Programme sind laut der OpenPGP-Spezifikation nicht verpflichtet, die\n"
+#~ "  zweite Art (die mit zusätzlichem Verschlüsseln) zu verstehen.\n"
+#~ "\n"
+#~ "Der Hauptschlüssel (\"primary Key\") muß auf jeden Fall zum "
+#~ "Unterschreiben fähig\n"
+#~ "sein. Deshalb kann ein nur-Verschlüssel-ElGamal-Schlüssel dafür nicht\n"
+#~ "verwendet werden."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Obwohl diese Schlüssel in RFC 2440 definiert sind, ist ihre Verwendung "
+#~ "nicht\n"
+#~ "empfohlen. Sie werden nämlich nicht von allen Programmen unterstützt.\n"
+#~ "Außerdem sind damit ezeugte Unterschriften recht groß und ihre "
+#~ "Überprüfung\n"
+#~ "ist langsam."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu Schlüssel bislang geprüft (%lu Beglaubigungen)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "Schlüssel nicht vollständig\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "Schlüssel %08lX unvollständig\n"
+
+#~ msgid "no|no"
+#~ msgstr "nein"
+
+#~ msgid "quit|quit"
+#~ msgstr "quit"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (signieren/beglaubigen und verschlüsseln)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "Dieses Verfahren wird nur von GnuPG unterstützt.  Sie können diesen "
+#~ "Schlüssel\n"
+#~ "nicht zur Verständigung mit PGP-Anwendern benutzen.  Ausserdem ist "
+#~ "dieses\n"
+#~ "Verfahren sehr langsam, und es könnte nicht so sicher wie die anderen "
+#~ "sein.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Trotzdem erstellen? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "Ungültiger Veschlüsselungsalgorithmus entdeckt (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "Dieser Schlüsselserver ist nicht vollständig HKP kompatibel\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr ""
+#~ "Von der Benutzung dieses Verfahrens ist abzuraten - Trotzdem erzeugen? "
+
+#~ msgid "do NOT trust"
+#~ msgstr " %d = Nein, ihm traue ich NICHT\n"
+
+#~ msgid "full trust"
+#~ msgstr "trust"
+
+#~ msgid "no values for group \"%s\"\n"
+#~ msgstr "Keine Werte für Gruppe \"%s\"\n"
+
+#~ msgid ""
+#~ "you have to start GnuPG again, so it can read the new configuration file\n"
+#~ msgstr ""
+#~ "Sie müssen GnuPG noch einmal starten, damit es die neue "
+#~ "Konfigurationsdatei liest\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "Ändern der Zugriffsrechte für `%s' ist fehlgeschlagen: %s\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "           Fingerabdruck:"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NAME=WERT|diese \"notation\"-Daten verwenden"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr ""
+#~ "Das erste Zeichen eines \"notation\"-Namens muß ein Buchstabe oder\n"
+#~ "ein Unterstrich sein\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr ""
+#~ "Punkte in einem \"notation\"-Namen müssen von anderen Zeichen umgeben "
+#~ "sein\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "WARNUNG: Dieser Schlüssel besitzt bereits eine Foto-ID.\n"
+#~ "         Ein hinzugefügte Foto-ID könnte einige Versionen von PGP "
+#~ "verwirren.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Sie können nur eine Foto-ID für diesen Schlüssel haben.\n"
+
+#~ msgid "Are you sure you still want to sign it?\n"
+#~ msgstr "Sind Sie sicher, daß Sie dies wiklich unterschreiben möchten?\n"
+
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "  Sind Sie sicher, daß Sie dies immer noch unterschreiben wollen?\n"
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "Schlüssel %08lX: Unsere Kopie hat keine Eigenbeglaubigung\n"
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "Brauchen Sie wirklich einen derartig langen Schlüssel? "
+
+#~ msgid "   signed by %08lX at %s\n"
+#~ msgstr "   beglaubigt durch %08lX um %s\n"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key User-ID"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key User-ID"
+
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-and-public-key User-ID"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr ""
+#~ "übersprungen: öffentlicher Schlüssel bereits mittels --encrypt-to "
+#~ "gesetzt\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "WARNING: This is a PGP2-style key\n"
+#~ msgstr "WARNUNG: '%s' ist eine leere Datei.\n"
+
+# valid user replies (not including 1..4)
+#~ msgid "sSmMqQ"
+#~ msgstr "sSmMqQ"
+
+#~ msgid "duplicate (short) key ID %08lX\n"
+#~ msgstr "Öffentlicher Schlüssel ist %08lX\n"
+
+#~ msgid "%lu key(s) to refresh\n"
+#~ msgstr "\t%lu Schlüssel mit Fehlern\n"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NAMEN]|Überprüfen der \"Trust\"-Datenbank"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Für diesen Schlüssel konnte kein gültiger \"Trust Path\" gefunden "
+#~ "werden.\n"
+#~ "Mal sehen, ob wir sonst irgendwie ein paar fehlende \"Owner trust\" "
+#~ "Werte \n"
+#~ "ermitteln können.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Kein Pfad führt zu einem unserer Schlüsseln.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Keine Zertifikate mit undefiniertem Vertrauen gefunden.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Keine \"trust\" Werte geändert.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr ""
+#~ "%08lX: Keine Infos zur Berechnung der Vertrauenswahrscheinlichkeit "
+#~ "vorgefunden\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: Fehler beim Prüfen des Schlüssels: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr "zu viele Einträge im unk-Lager - abgeschaltet\n"
+
+#~ msgid "secret key %08lX not imported (use %s to allow for it)\n"
+#~ msgstr ""
+#~ "Geheimer Schlüssel %08lX nicht importiert (%s verwenden, um das zu "
+#~ "ermöglichen)\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr ""
+#~ "Vermutlich ist das Siegel (MDC) BESCHÄDIGT (wegen unbekanntem \"critical "
+#~ "bit\")\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "Fehler beim Lesen des Dir-Satzes für LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr "lid %lu: Dir-Satz erwartet, aber es kam Typ %d\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "Kein Hauptschlüssel für LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "Fehler beim Lesen den Hauptschlüssels der LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "Schlüssel %08lX: Satzabfrage fehlgeschlagen\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "Schlüssel %08lX: Ist bereits in geheimer Schlüsseltabelle\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "HINWEIS: Geheimer Schlüssel %08lX ist NICHT geschützt.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr ""
+#~ "Schlüssel %08lX: geheimer und öffentlicher Schlüssel passen nicht "
+#~ "zusammen.\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "Schlüssel %08lX.%lu: Korrekte Unterschlüssel-Anbindung\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "Schlüssel %08lX.%lu: Ungültige Unterschlüssel-Anbindung: %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "Schlüssel %08lX.%lu: Gültiger Schlüsselwiderruf\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "Schlüssel %08lX.%lu: Ungültiger Schlüsselwiderruf: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Korrekte Eigenbeglaubigung"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Ungültige Eigenbeglaubigung"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr ""
+#~ "Gültiger User-ID-Widerruf ignoriert, da eine neuere Eigenbeglaubigung "
+#~ "vorliegt"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Gültiger User-ID-Widerruf"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Ungültiger User-ID-Widerruf"
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Gültiger Zerifikat-Widerruf"
+
+#~ msgid "Good certificate"
+#~ msgstr "Korrektes Zertifikat"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Ungültiger Zertifikatswiderruf"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Ungültiges Zertifikat"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "Signatursatz %lu[%d] zeigt auf falschen Satz.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "Doppelte Zertifikate - entfernt"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "tdbio_search_dir fehlgeschlagen: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: Einfügen fehlgeschlagen: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: Einfügen fehlgeschlagen: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: eingefügt\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu Schlüssel eingefügt\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: Dir-Satz ohne Schlüssel - übergangen\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "\t%lu wegen neuer Schlüssel\n"
+
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu Schlüssel übersprungen\n"
+
+#~ msgid "\t%lu keys updated\n"
+#~ msgstr "\t%lu Schlüssel geändert\n"
+
+#~ msgid "Ooops, no keys\n"
+#~ msgstr "Huch, keine Schlüssel\n"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Huch, keine User-IDs\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr "check_trust: Suche nach Dir-Satz fehlgeschlagen: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr "Schlüssel %08lX: 'trust record' einfügen fehlgeschlagen: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "Schlüssel %08lX.%lu: in \"trustdb\" eingefügt\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "Schlüssel %08lX.%lu: wurde in der Zukunft erzeugt (Zeitreise oder Uhren "
+#~ "stimmen nicht überein)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "Schlüssel %08lX.%lu: verfallen am %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "Schlüssel %08lX.%lu: Vertrauensprüfung fehlgeschlagen: %s\n"
+
+#~ msgid "user '%s' not found: %s\n"
+#~ msgstr "Benutzer '%s' nicht gefunden: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr "Problem, '%s' in der Trust-DB zu finden: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr "User '%s' ist nicht in der 'Trust'-Datenbank - wird eingefügt\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "konnte '%s' nicht in die 'Trust'-Datenbank hineintun: %s\n"
+
+#~ msgid "too many random bits requested; the limit is %d\n"
+#~ msgstr "Zu viele Zufallswerte angefordert: Die Grenze liegt bei %d\n"
+
+#~ msgid "For info see http://www.gnupg.org"
+#~ msgstr "Weitere Infos: siehe http://www.gnupg.org"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr ""
+#~ "Möchten Sie wirklich einen Unterschriften-/Verschlüsselungschlüssel "
+#~ "erzeugen? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: Benutzer nicht gefunden: %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "Zertifikat Leseproblem: %s\n"
+
+#~ msgid "can't lock keyring `%s': %s\n"
+#~ msgstr "kann Schlüsselbund `%s' nicht sperren: %s\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: Benutzer nicht gefunden\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr "WARNUNG: Lange 'Pref'-Records können noch nicht benutzt werden\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: Schlüsselbund kann nicht erzeugt werden: %s\n"
+
+#~ msgid "RSA key cannot be used in this version\n"
+#~ msgstr "RSA-Schlüssel können in dieser Version nicht verwendet werden\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "Kein Schlüssel für User-ID\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "kein geheimer Schlüssel zur Entschlüsselung vorhanden\n"
+
+#~ msgid "   (%d) ElGamal in a v3 packet\n"
+#~ msgstr "   (%d) ElGamal in einem v3-Paket\n"
+
+#~ msgid "Key generation can only be used in interactive mode\n"
+#~ msgstr ""
+#~ "Die Schlüsselerzeugung kann nur im interaktiven Modus benutzt werden.\n"
diff --git a/po/el.gmo b/po/el.gmo
new file mode 100644 (file)
index 0000000..505d6b6
Binary files /dev/null and b/po/el.gmo differ
diff --git a/po/el.po b/po/el.po
new file mode 100644 (file)
index 0000000..5b07169
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,7245 @@
+# Greek Translation of GnuPG.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# Dokianakis Theofanis <madf@hellug.gr>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg-1.1.92\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2003-06-27 12:00+0200\n"
+"Last-Translator: Dokianakis Theofanis <madf@hellug.gr>\n"
+"Language-Team: Greek <nls@tux.hellug.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-7\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "áäõíáìßá ðáñáãùãÞò ðñþôïõ áñéèìïý ìå ëéãüôåñá áðü %d bits\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "áäõíáìßá ðáñáãùãÞò ðñþôïõ áñéèìïý ìå ëéãüôåñá áðü %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "äåí åíôïðßóôçêå Üñèñùìá óõëëïãÞò åíôñïðßáò\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "áäõíáìßá ðñüóâáóçò ôïõ `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "áäõíáìßá ðñüóâáóçò óôï `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "áäõíáìßá ëÞøçò ðëçñïöïñéþí ãéá ôï `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' äåí åßíáé êáíïíéêü áñ÷åßï - áãíïÞèçêå\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "óçìåßùóç: ôï áñ÷åßï random_seed åßíáé Üäåéï\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç Ýãêõñï ìÝãåèïò áñ÷åßïõ random_seed - äåí\n"
+"÷ñçóéìïðïéåßôå\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "áäõíáìßá áíÜãíùóçò ôïõ `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "óçìåßùóç: äåí Ý÷åé áíáíåùèåß ôï áñ÷åßï random_seed\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôïõ `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "áäõíáìßá åããñáöÞò ôïõ `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "áäõíáìßá êëåéóßìáôïò ôïõ `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ÷ñÞóç ìç áóöáëïýò ãåííÞôñéáò ôõ÷áßùí áñéèìþí!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Ç ãåííÞôñéá ôõ÷áßùí áñéèìþí åßíáé ðïëý áäýíáìç ãéá áõôÞ ôç ÷ñÞóç\n"
+"\n"
+"ÌÇ ×ÑÇÓÉÌÏÐÏÉÇÓÅÔÅ ÄÅÄÏÌÅÍÁ ÐÏÕ Å×ÏÕÍ ÐÁÑÁ×ÈÅÉ ÁÐÏ ÁÕÔÏ ÔÏ ÐÑÏÃÑÁÌÌÁ!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Ðñáêáë ðåñéìÝíåôå, ç åíôñïðßá óõãêåíôñþíåôáé. ÊÜíôå ìéá Üëëç åñãáóßá\n"
+"ãéá íá ìçí âáñåèåßôå, ãéáôß áõôü èá âåëôéþóåé ôçí ðïéüôçôá ôçò åíôñïðßá.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Äåí õðÜñ÷ïõí áñêåôÜ äéáèÝóéìá ôõ÷áßá bytes.  Ðñïôåßíåôáé íá áíáìåßíåôå Þ\n"
+"íá áðáó÷ïëåßôå ôï ëåéôïõñãéêü óýóôçìá ìÝ÷ñé áõôü íá óõãêåíôñþóåé\n"
+"ðåñéóóüôåñç åíôñïðßá! (×ñåéÜæïíôáé %d ðåñéóóüôåñá bytes)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "áðïôõ÷ßá áñ÷éêïðïßçóçò ôçò TrustDB: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "áðïôõ÷ßá åðáíáäüìçóçò ôçò cache êëåéäïèÞêçò: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "keyserver áðïóôïëÞ áðÝôõ÷å: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ ìðëïê êëåéäéþí: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: óöÜëìá óôçí áíÜãíùóç ôçò åããñáöÞò free : %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' Þäç óõìðéÝóôçêå\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "äçìéïõñãßá åíüò íÝïõ æåýãïõò êëåéäéþí"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "áðïôõ÷ßá áñ÷éêïðïßçóçò ôçò TrustDB: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Ç äçìéïõñãßá êëåéäéïý áðÝôõ÷å: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s õðïãñáöÞ, áëãüñéèìïò ðåñßëçøçò %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "äå âñÝèçêáí Ýãêõñá OpenPGP äåäïìÝíá.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "èùñÜêéóç: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "ìç Ýãêõñç åðéêåöáëßäá èùñÜêéóçò: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "åðéêåöáëßäá èùñÜêéóçò: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "ìç Ýãêõñç åðéêåöáëßäá clearsig\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "öùëéáóìÝíåò ìç êñõðôïãñáöçìÝíåò õðïãñáöÝò\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "ìç áíáìåíüìåíç èùñÜêéóç:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "ìç Ýãêõñç dash escaped ãñáììÞ: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "ìç Ýãêõñïò radix64 ÷áñáêôÞñáò %02x ðáñÜâëåøç\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "ðñüùñï ôÝëïò áñ÷åßïõ (áðïõóßá CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "ðñüùñï ôÝëïò áñ÷åßïõ (åíôüò CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "ëÜèïò ìïñöÞ CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "óöÜëìá CRC: %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "ðñüùñï ôÝëïò áñ÷åßïõ (óôï Ôrailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "óöÜëìá óôç ãñáììÞ trailer\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "äå âñÝèçêáí Ýãêõñá OpenPGP äåäïìÝíá.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "ìç Ýãêõñç èùñÜêéóç: ç ãñáììÞ åßíáé ðÜíù áðü %d ÷áñáêôÞñåò\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"åêôõðþóéìïò, óå åéóáãùãéêÜ, ÷áñáêôÞñáò óôç èùñÜêéóç - ßóùò Ýãéíå ÷ñÞóç "
+"ðñïâëçìáôéêïý MTA\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "ôï ìõóôéêü êëåéäß äåí åßíáé äéáèÝóéìï"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "äåí ìðïñåß íá ãßíåé áõôü óå êáôÜóôáóç äÝóìçò (batchmode)\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Ç åðéëïãÞ óáò; "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Äåí Ý÷åé ïñéóôåß áéôßá"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "ìç åðåîåñãáóìÝíï"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "êáíÝíá áíôßóôé÷ï äçìüóéï êëåéäß: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "áíáùåùìÝíåò åðéëïãÝò"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò óôï \"êïñäüíé\" ôçò åðéëïãÞò\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò óôï \"êïñäüíé\" ôçò åðéëïãÞò\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "óöÜëìá: ìç Ýãêõñï áðïôýðùìá\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "áðåéêüíéóç ôïõ fingerprint"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "óöÜëìá: ìç Ýãêõñï áðïôýðùìá\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Ç äçìéïõñãßá êëåéäéïý áðÝôõ÷å: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "äå âñÝèçêáí Ýãêõñá OpenPGP äåäïìÝíá.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "áäõíáìßá åããñáöÞò ìõóôéêÞò êëåéäïèÞêçò `%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Ðáñáêáëþ åðéëÝîôå ôïí ôýðï ôïõ êëåéäéïý ðïõ èÝëåôå:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "ÕðïãñáöÞ Ýëçîå óôéò %s.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Ìç Ýãêõñç åðéëïãÞ.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Ðáñáêáëþ åðéëÝîôå ôçí áéôßá ãéá ôçí áíÜêëçóç:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "Üãíùóôïò áëãüñéèìïò ðñïóôáóßáò\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "ÌõóôéêÜ ôìÞìáôá ôïõ êýñéïõ êëåéäéïý äåí åßíáé äéáèÝóéìá.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "ðáñáëåßöèçêå: ìõóôéêü êëåéäß Þäç ðáñþí\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "ôåñìáôéóìüò áõôïý ôïõ ìåíïý"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "óõãêñïõüìåíåò åíôïëÝò\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "áðåéêüíéóç áõôÞò ôçò âïÞèåéáò"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Êëåéäß äéáèÝóéìï óôï: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "áëëáãÞ ôçò çìåñïìçíßáò ëÞîçò"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "áëëáãÞ ôçò åìðéóôïóýíçò éäéïêôÞôç"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "áðåéêüíéóç ôïõ fingerprint"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "äçìéïõñãßá åíüò íÝïõ æåýãïõò êëåéäéþí"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "ÅíôïëÞ> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "óõãêñïõüìåíåò åíôïëÝò\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "óõãêñïõüìåíåò åíôïëÝò\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Ìç Ýãêõñç åíôïëÞ  (äïêéìÜóôå \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "ôï ìõóôéêü êëåéäß äåí åßíáé äéáèÝóéìï"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "ÅðáíáëÜâåôå ôç öñÜóç êëåéäß: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "ç öñÜóç êëåéäß äåí åðáíáëÞöèçêå óùóôÜ. ÄïêéìÜóôå îáíÜ"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "áäõíáìßá ðñüóâáóçò ôïõ `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output äåí ëåéôïõñãåß ãéá áõôÞ ôçí åíôïëÞ\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "ôï êëåéäß '%s' äå âñÝèçêå: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ ìðëïê êëåéäéþí: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(åêôüò åÜí ðñïóäéïñßóåôå Ýíá êëåéäß áðü áðïôýðùìá)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "äåí ìðïñåß íá ãßíåé áõôü óå êáôÜóôáóç äÝóìçò ÷ùñßò ôï \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "ÄéáãñáöÞ áõôïý ôïõ êëåéäéïý áðü ôç êëåéäïèÞêç; "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Áõôü åßíáé Ýíá ìõóôéêü êëåéäß! - Óßãïõñá íá äéáãñáöåß; "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "êáèáñéóìüò ðëçñïöïñéþí åìðéóôïóýíçò-éäéïêôÞôç\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "õðÜñ÷åé Ýíá ìõóôéêü êëåéäß ãéá ôï äçìüóéï êëåéäß \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+"÷ñçóéìïðïéåßóôå ðñþôá ôçí åðéëïãÞ \"--delete-secret-key\" ãéá äéáãñáöÞ ôïõ.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "áäõíáìßá ÷ñÞóçò åíüò óõììåôñéêïý ðáêÝôïõ ESK ëüãù ôçò êáôÜóôáóçò S2K\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "÷ñÞóç ôïõ êñõðôáëãüñéèìïõ: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' Þäç óõìðéÝóôçêå\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: `%s' åßíáé Ýíá Üäåéï áñ÷åßï\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"êñõðôïãñÜöçóç ìå êëåéäßá RSA áðü 2048 bit Þ ðéï ëßãï ìüíï óå êáôÜóôáóç --"
+"pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "áíÜãíùóç áðü `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"áäõíáìßá ÷ñÞóçò ôïõ êñõðôáëãüñéèìïõ IDEA ãéá üëá ôá êëåéäßá ìå ôá "
+"ïðïßáêñõðôïãñáöåßôå.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"ï åîáíáãêáóìüò óõììåôñéêïý áëãüñéèìïõ %s (%d) ðáñáâéÜæåé ôéò\n"
+"åðéëïãÝò ôïõ ðáñáëÞðôç\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"ï åîáíáãêáóìüò ÷ñÞóçò ôïõ áëãïñßèìïõ óõìðßåóçò %s (%d) ðáñáâéÜæåé ôéò\n"
+"åðéëïãÝò ôïõ ðáñáëÞðôç\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"ï åîáíáãêáóìüò óõììåôñéêïý áëãüñéèìïõ %s (%d) ðáñáâéÜæåé ôéò\n"
+"åðéëïãÝò ôïõ ðáñáëÞðôç\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "áðáãïñåýåôå ç ÷ñÞóç ôïõ %s óôçí êáôÜóôáóç %s.\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s êñõðôïãñáöÞèçêå ãéá: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s êñõðôïãñáöçìÝíá äåäïìÝíá\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "êñõðôïãñáöçìÝíï ìå Üãíùóôï áëãüñéèìï %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï ìÞíõìá êñõðôïãñáöÞèçêå ìå áäýíáìï êëåéäß óôï\n"
+"óõììåôñéêü êñõðôáëãüñéèìï.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "ðñüâëçìá óôï ÷åéñéóìü êñõðôïãñáöçìÝíïõ ðáêÝôïõ\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "äåí õðïóôçñßæåôå ç áðïìáêñõóìÝíç åêôÝëåóç ðñïãñÜììáôïò\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò êáôáëüãïõ `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"ïé êëÞóåéò åîùôåñéêþí ðñïãñáììÜôùí áðåíåñãïðïéÞèçêáí ëüãù áíáóöáëþí áäåéþí\n"
+"áñ÷åßïõ\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"áõôÞ ç ðëáôöüñìá áðáéôåß ðñïóùñ. áñ÷åßá óôçí êëÞóç åîùôåñéêþí ðñïãñáììÜôùí\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "áäõíáìßá åêôÝëåóçò ôïõ %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "áäõíáìßá åêôÝëåóçò ôïõ %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "óöÜëìá óõóôÞìáôïò êáôÜ ôçí êëÞóç åîùôåñéêïý ðñïãñÜììáôïò: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "áöýóéêç Ýîïäïò ôïõ åîùôåñéêïý ðñïãñÜììáôïò\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "áäõíáìßá åêôÝëåóçò ôïõ åîùôåñéêïý ðñïãñÜììáôïò\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "áäõíáìßá áíÜãíùóçò ôçò áðÜíôçóçò ôïõ åîùôåñéêïý ðñïãñÜììáôïò: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá äéáãñáöÞò tempfile (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá äéáãñáöÞò ðñïóùñéíïý öáêÝëïõ `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Ç õðïãñáöÞ èá óçìåéùèåß óáí ìç-áíáêáëÝóéìç.\n"
+"\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "äå âñÝèçêáí êëåéäéÜ áíÜêëçóçò ãéá ôï `%s'\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "áíÜêëçóç åíüò äåõôåñåýïíôïò êëåéäéïý"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "ìç ÷ñçóéìïðïéÞóéìï ìõóôéêü êëåéäß"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "êëåéäß %08lX: äåí åßíáé ðñïóôáôåõìÝíï - ðáñáëåßöèçêå\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "êëåéäß %08lX:  êëåéäß ôýðïõ PGP 2.x - ðáñáëåßöèçêå\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr ""
+"êëåéäß %08lX: ç õðïãñáöÞ ôïõ õðïêëåéäéïý óå ëÜèïò óçìåßï - ðáñáëåßöèçêå\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "áðïôõ÷ßá áñ÷éêïðïßçóçò ôçò TrustDB: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï ìõóôéêü êëåéäß %08lX äåí Ý÷åé áðëü SK checksum\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: äåí Ýãéíå êáììßá åîáãùãÞ\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@ÅíôïëÝò:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[áñ÷åßï]|äçìéïõñãßá ìéáò õðïãñáöÞò"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[áñ÷åßï]|äçìéïõñãßá ìéáò ìç êñõðôïãñáöçìÝíçò õðïãñáöÞò"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "äçìéïõñãßá ìéáò ìç ðñïóáñôçìÝíçò õðïãñáöÞò"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "êñõðôïãñÜöçóç äåäïìÝíùí"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "êñõðôïãñÜöçóç ìå ÷ñÞóç ìüíï óõììåôñéêþí áëãïñßèìùí"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "áðïêñõðôïãñÜöçóç äåäïìÝíùí (ðñïêáèïñéóìÝíï)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "åðáëÞèåõóç ìéáò õðïãñáöÞò"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "áðåéêüíéóç ôçò ëßóôáò êëåéäéþí"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "áðåéêüíéóç ôçò ëßóôáò êëåéäéþí êáé õðïãñáöþí"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "Ýëåã÷ïò õðïãñáöÞò êëåéäéïý"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "áðåéêüíéóç ôçò ëßóôáò êëåéäéþí êáé áðïôõðùìÜôùí (fingerprints)"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "áðåéêüíéóç ôçò ëßóôáò ìõóôéêþí êëåéäéþí"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "äçìéïõñãßá åíüò íÝïõ æåýãïõò êëåéäéþí"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "áöáßñåóç ôùí êëåéäéþí áðü ôç äçìüóéá êëåéäïèÞêç"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "áöáßñåóç ôùí êëåéäéþí áðü ôç ìõóôéêÞ êëåéäïèÞêç"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "õðïãñáöÞ åíüò êëåéäéïý"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "õðïãñáöÞ åíüò êëåéäéïý ôïðéêÜ"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "õðïãñáöÞ Þ åðåîåñãáóßá åíüò êëåéäéïý"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "äçìéïõñãßá åíüò ðéóôïðïéçôéêïý áíÜêëçóçò"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "åîáãùãÞ êëåéäéþí"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "åîáãùãÞ êëåéäéþí óå Ýíá äéáêïìéóôÞ êëåéäéþí"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "åéóáãùãÞ êëåéäéþí áðü Ýíá äéáêïìéóôÞ êëåéäéþí"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "áíáæÞôçóç êëåéäéþí óå Ýíá äéáêïìéóôÞ êëåéäéþí"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "áíáíÝùóç üëùí ôùí êëåéäéþí áðü Ýíá äéáêïìéóôÞ êëåéäéþí"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "åéóáãùãÞ/óõã÷þíåõóç êëåéäéþí"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "áíáíÝùóç ôçò âÜóçò äåäïìÝíùí åìðéóôïóýíçò"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|áëãüñ [áñ÷åßá]| áðåéêüíéóç ðåñéëÞøåùí ôùí ìçíõìÜôùí"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"ÅðéëïãÝò:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "äçìéïõñãßá ascii èùñáêéóìÝíçò åîüäïõ"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|ÏÍÏÌÁ|êñõðôïãñÜöçóç ãéá ÏÍÏÌÁ"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "÷ñÞóç áõôÞò ôçò ôáõôüôçôáò (user id) ãéá õðïãñáöÞ Þ áðïêñõðôïãñÜöçóç"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|êáèïñéóìüò åðéðÝäïõ óõìðßåóçò N (0 áðåíåñãïðïéåß)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "÷ñÞóç êáíïíéêÞò êáôÜóôáóçò êåéìÝíïõ"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "÷ñÞóç ùò áñ÷åßïõ åîüäïõ"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "áíáëõôéêÜ"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "íá ìç ãßíåé êáììßá áëëáãÞ"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "åñþôçóç ðñéí ôçí åðéêÜëõøç"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(äåßôå ôç óåëßäá man ãéá ìéá ðëÞñç ëßóôá åíôïëþí êáé åðéëïãþí)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Ðáñáäåßãìáôá:\n"
+"\n"
+" -se -r Bob [áñ÷åßï]          õðïãñáöÞ êáé êñõðôïãñÜöçóç ãéá ôï Bob\n"
+" --clearsign [áñ÷åßï]         äçìéïõñãßá ìç êñõðôïãñáöçìÝíçò õðïãñáöÞò\n"
+" --detach-sign [áñ÷åßï]       äçìéïõñãßá áðïêïììÝíçò õðïãñáöÞò\n"
+" --list-keys [ïíüìáôá]        áðåéêüíéóç êëåéäéþí\n"
+" --fingerprint [ïíüìáôá]      áðåéêüíéóç áðïôõðùìÜôùí (fingerprints)\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "ÁíáöÝñåôå ôá ðñïâëÞìáôá óôï <gnupg-bugs@gnu.org>\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "×ñÞóç: gpg [åðéëïãÝò] [áñ÷åßá] (-h ãéá âïÞèåéá)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Óýíôáîç: gpg [åðéëïãÝò] [áñ÷åßá]\n"
+"õðïãñáöÞ, Ýëåã÷ïò, êñõðôïãñÜöçóç Þ áðïêñõðôïãñÜöçóç\n"
+"ç ðñïêáèïñéóìÝíç ëåéôïõñãßá åîáñôÜôáé áðü ôá äåäïìÝíá åéóüäïõ\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Õðïóôçñéæüìåíïé áëãüñéèìïé:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "ÄçìïóÊëåéäß:"
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Êñõðôáëãüñéèìïò: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Óõìðßåóç: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "÷ñÞóç: gpg [åðéëïãÝò] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "óõãêñïõüìåíåò åíôïëÝò\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "äåí âñÝèçêå ôï óýìâïëï = óôïí ïñéóìü ôçò ïìÜäáò \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëÞò éäéïêôçóßá óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëÞò éäéïêôçóßá óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëÞò éäéïêôçóßá óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëåßò Üäåéåò óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëåßò Üäåéåò óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëåßò Üäåéåò óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëÞò éäéïêôçóßáåóþêëåéóôïõ öáêÝëïõ óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëÞò éäéïêôçóßáåóþêëåéóôïõ öáêÝëïõ óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëÞò éäéïêôçóßáåóþêëåéóôïõ öáêÝëïõ óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëåßò Üäåéåò åóþêëåéóôïõ öáêÝëïõ óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëåßò Üäåéåò åóþêëåéóôïõ öáêÝëïõ óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìç áóöáëåßò Üäåéåò åóþêëåéóôïõ öáêÝëïõ óôï %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "Üãíùóôï áíôéêåßìåíï ñõèìßóåùò \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Äåí âñÝèçêå áíôßóôïé÷ç õðïãñáöÞ óôç ìõóôéêÞ êëåéäïèÞêç\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "ôï URL ðïëéôéêÞò õðïãñáöÞò ðïõ äüèçêå äåí åßíáé Ýãêõñï\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "áðåéêüíéóç ôçò êëåéäïèÞêçò óôçí ïðïßá áíáöÝñåôå ôï êëåéäß"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Äåí âñÝèçêå áíôßóôïé÷ç õðïãñáöÞ óôç ìõóôéêÞ êëåéäïèÞêç\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "ÓÇÌÅÉÙÓÇ: áãíïÞèçêå ôï ðáëéü áñ÷åßï ðñïêáèïñéóìÝíùí åðéëïãþí `%s'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ìç ðñïêáèïñéóìÝíï áñ÷åßï åðéëïãþí `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "áñ÷åßï åðéëïãþí `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "áíÜãíùóç åðéëïãþí áðü `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ôï %s äåí åßíáé ãéá êáíïíéêÞ ÷ñÞóç!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"ç åðÝêôáóç ôïõ êñõðôáëãüñéèìïõ \"%s\" äåí öïñôþèçêå åðåéäÞ õðÜñ÷ïõí\n"
+"áíáóöáëåßò Üäåéåò\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "ôï %s äåí åßíáé Ýãêõñï óåô ÷áñáêôÞñùí\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "ôï %s äåí åßíáé Ýãêõñï óåô ÷áñáêôÞñùí\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "áäõíáìßá åðåîåñãáóßáò ôïõ URI ôïõ äéáêïìéóç êëåéäéþí\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: ìç Ýãêõñåò åðéëïãÝò åéãáãùãÞò\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åéãáãùãÞò\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: ìç Ýãêõñåò åðéëïãÝò åéãáãùãÞò\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åéãáãùãÞò\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "ôï %s äåí åßíáé Ýãêõñï óåô ÷áñáêôÞñùí\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "ôï URL ðïëéôéêÞò õðïãñáöÞò ðïõ äüèçêå äåí åßíáé Ýãêõñï\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "ôï %s äåí åßíáé Ýãêõñï óåô ÷áñáêôÞñùí\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "áäõíáìßá ïñéóìïý ôïõ exec-path óå %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï ðñüãñáììá ßóùò äçìéïõñãÞóåé áñ÷åßï core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï %s ðáñáêÜìðôåé ôï %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "ôï %s äåí åðéôñÝðåôáé ìå ôï %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "ôï %s äåí Ý÷åé êáììßá Ýííïéá ìáæß ìå ôï %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "ï gpg-agent äåí åßíáé äéáèÝóéìïò óå áõôÞ ôç óõíåäñßá\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"ìðïñåßôå íá êÜíåôå áðïêïììÝíåò Þ êáèáñÝò õðïãñáöÝò ìüíï óå --pgp2 êáôÜóôáóç\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+"äåí ìðïñåßôå íá õðïãñÜöåôå êáé íá êñõðôïãñáöåßôå ôáõôü÷ñïíá óå --pgp2 "
+"êáôÜóôáóç\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "ìüíï áñ÷åßá åðéôñÝðïíôáé (êáé ü÷é pipes) êáôá ôçí êáôáóôáóç --pgp2.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+"ç êñõðôïãñÜöçóç åíüò ìçíýìáôïò óå --pgp2 êáôÜóôáóç áðáéôåß ôïí áëãïñ. IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "ï åðéëåãìÝíïò áëãüñéèìïò êñõðôïãñÜöçóçò äåí åßíáé Ýãêõñïò\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "ï åðéëåãìÝíïò áëãüñéèìïò ðåñßëçøçò äåí åßíáé Ýãêõñïò\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "ï åðéëåãìÝíïò áëãüñéèìïò êñõðôïãñÜöçóçò äåí åßíáé Ýãêõñïò\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr ""
+"ï åðéëåãìÝíïò áëãüñéèìïò ðåñßëçøçò ãéá ðéóôïðïßçóç\n"
+"äåí åßíáé Ýãêõñïò\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed ðñÝðåé íá åßíáé ìåãáëýôåñá áðü 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed ðñÝðåé íá åßíáé ìåãáëýôåñá áðü 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth ðñÝðåé íá åßíáé ìåôáîý 1 êáé 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "ìç Ýãêõñï default-cert-level· ðñÝðåé íá åßíáé 0, 1, 2, Þ 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "ìç Ýãêõñï min-cert-level· ðñÝðåé íá åßíáé 0, 1, 2, Þ 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ç áðëÞ S2K êáôÜóôáóç (0) ðñÝðåé íá áðïöåýãåôáé\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "ìç Ýãêõñç êáôÜóôáóç S2K; ðñÝðåé íá åßíáé 0, 1 Þ 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "ìç Ýãêõñåò ðñïåðéëïãÝò\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "ìç Ýãêõñåò ðñïåðéëïãÝò ðñïóùðéêïý êñõðôáëãüñéèìïõ\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "ìç Ýãêõñåò ðñïåðéëïãÝò ðñïóùðéêïý áëãüñéèìïõ ðåñßëçøçò\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "ìç Ýãêõñåò ðñïåðéëïãÝò ðñïóùðéêïý áëãüñéèìïõ óõìðßåóçò\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "ôï %s áêüìá äå ëåéôïõñãåß ìáæß ìå ôï %s\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "áðáãïñåýåôå ç ÷ñÞóç ôïõ êñõðôáëãüñéèìïõ \"%s\" óôçí êáôÜóôáóç %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+"áðáãïñåýåôå ç ÷ñÞóç ôïõ áëãüñéèìïõ ðåñßëçøçò \"%s\" óôçí êáôÜóôáóç %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+"áðáãïñåýåôå ç ÷ñÞóç ôïõ áëãüñéèìïõ óõìðßåóçò \"%s\" óôçí êáôÜóôáóç %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "áðïôõ÷ßá áñ÷éêïðïßçóçò ôçò TrustDB: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: äþèçêáí ðáñáëÞðôåò (-r) ÷þñéò ÷ñÞóç êñõðôïãñÜöçóçò\n"
+"äçìïóßïõ êëåéäéïý\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "áðïêñõðôïãñÜöçóç áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "áðáãïñåýåôå ç ÷ñÞóç ôïõ %s óôçí êáôÜóôáóç %s.\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "áðáãïñåýåôå ç ÷ñÞóç ôïõ %s óôçí êáôÜóôáóç %s.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [åíôïëÝò]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [user-id] [êëåéäïèÞêç]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "keyserver áðïóôïëÞ áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "keyserver ëÞøç áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "åîáãùãÞ êëåéäéïý áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "keyserver áíáæÞôçóç áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "keyserver áíáíÝùóç áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "áðïèùñÜêéóç áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "èùñÜêéóç áðÝôõ÷å: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "ìç Ýãêõñïò áëãüñéèìïò  hash `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[üíïìá áñ÷åßïõ]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Ìðïñåßôå ôþñá íá åéóáãÜãåôå ôï ìÞíõìá óáò ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "ôï URL ðïëéôéêÞò ðéóôïðïéçôéêïý ðïõ äüèçêå äåí åßíáé Ýãêõñï\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "ôï URL ðïëéôéêÞò õðïãñáöÞò ðïõ äüèçêå äåí åßíáé Ýãêõñï\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "ôï URL ðïëéôéêÞò õðïãñáöÞò ðïõ äüèçêå äåí åßíáé Ýãêõñï\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "ðÜñá ðïëëÝò êáôá÷ùñÞóåéò óôç pk cache - áðåíåñãïðïéÞèçêå\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[User id äåí âñÝèçêå]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Ìç Ýãêõñï êëåéäß %08lX Ýãéíå Ýãêõñï áðü ôï --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "êáíÝíá ìõóôéêü õðïêëåéäß ãéá ôï äçìüóéï õðïêëåéäß %08lX - áãíüçóç\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "÷ñÞóç ôïõ äåõôåñåýïíôïò êëåéäéïý %08lX áíôß ôïõ ðñùôåýïíôïò %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "êëåéäß %08lX: ìõóôéêü êëåéäß ÷ùñßò äçìüóéï - ðáñáëåßöèçêå\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "Þóõ÷ç Ýîïäïò"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "åîáãùãÞ ôùí êëåéäéþí áðü áõôÞ ôç êëåéäïèÞêç"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "ïñéóìüò ôùí óõãêñïýóåùí þñáò (timestamp) ìüíï óáí ðñïåéäïðïßçóç"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|åããñáöÞ ôùí ðëçñïöïñéþí êáôÜóôáóçò óôï FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "×ñÞóç: gpgv [åðéëïãÝò] [áñ÷åßá] (-h ãéá âïÞèåéá)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Óýíôáîç: gpg [åðéëïãÝò] [áñ÷åßá]\n"
+"¸ëåã÷ïò õðïãñáöþí óå óýãêñéóç ìå ãíùóôÜ åìðéóôåõìÝíá êëåéäéÜ\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Åßíáé áðüöáóç óáò íá ïñßóåôå ôéìÞ åäþ. ÁõôÞ ç ôéìÞ äåí èá åîá÷èåß\n"
+"ðïôÝ óå ôñßôï ðñüóùðï.  Ôç ÷ñåéáæüìáóôå ãéá åöáñìïãÞ ôïõ éóôïý-"
+"åìðéóôïóýíçò,\n"
+"äåí Ý÷åé ôßðïôá íá êÜíåé ìå ôïí (óéùðçëÜ äçìéïõñãçìÝíï) éóôü-ðéóôïðïéçôéêþí."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Ãéá ôç äüìçóç åíüò Éóôïý-Åìðéóôïóýíçò, ôï GnuPG ðñÝðåé íá îÝñåé ðïéÜ "
+"êëåéäéÜ\n"
+"åßíáé ðëÞñçò åìðéóôïóýíçò - áõôÜ åßíáé óõíÞèùò êëåéäéÜ óôá ïðïßá Ý÷åôå\n"
+"ðñüóâáóç óôï ìõóôéêü êëåéäß. ÁðáíôÞóôå \"yes\" (íáé) ãéá íá äïèåß óôï "
+"êëåéäß\n"
+"áõôü ðëÞñç åìðéóôïóýíç\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"ÅÜí èÝëåôå íá ÷ñçóéìïðïéÞóåôå áõôü ôï ìç åìðéóôåõìÝíï êëåéäß, áðáíôÞóôå \"yes"
+"\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"ÐëçêôñïëïãÞóôå ôï user ID ôïõ áðïäÝêôç áõôïý ðïõ èÝëåôå íá óôåßëåôå ìÞíõìá."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"ÃåíéêÜ, äåí åßíáé êáëÞ éäÝá íá ÷ñçóéìïðïéåßôáé ôï ßäéï êëåéäß ãéá õðïãñáöÞ\n"
+"êáé êñõðôïãñÜöçóç. Áõôüò ï áëãüñéèìïò ðñÝðåé íá ÷ñçóéìïðïéåßôáé ìüíï óå\n"
+"ïñéóìÝíïõò ôüðïõò. Ç óõìâïõëÞ åíüò åéäéêïý óå èÝìáôá áóöÜëåéáò óõíåßóôáôå."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "ÐëçêôñïëïãÞóôå ôï ìÝãåèïò ôïõ êëåéäéïý"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "ÁðáíôÞóôå \"yes\"(íáé) Þ \"no\"(ü÷é)"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"ÐëçêôñïëïãÞóôå ôçí áðáéôïýìåíç ôéìÞ üðùò áðåéêïíßæåôå.\n"
+"Ìðïñåßôå íá åéóÜãåôå ìéá çìåñïìçíßá ISO (YYYY-MM-DD) áëëÜ\n"
+"äåí èá ëÜâåôå ìéá êáëÞ áðÜíôçóç óöÜëìáôïò - áíôßèåôá ôï óýóôçìá\n"
+"ðñïóðáèåß íá åñìçíåýóåé ôçí ôéìÞ óáí äéÜóôçìá."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "ÐëçêôñïëïãÞóôå ôï üíïìá ôïõ êëåéäïêñÜôïñá"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "ðëçêôñïëïãÞóôå ðñïáéñåôéêÜ ìéá äéåýèõíóç email (óõíéóôÜôáé)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Ðáñáêáëþ ðñïáéñåôéêÜ ðëçêôñïëïãÞóôå Ýíá ó÷üëéï"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  ãéá áëëáãÞ ôïõ ïíüìáôïò.\n"
+"C  ãéá áëëáãÞ ôïõ ó÷ïëßïõ.\n"
+"E  ãéá áëëáãÞ ôçò äéåýèõíóçò email.\n"
+"O  ãéá óõíÝ÷åéá ôçò äçìéïõñãßáò êëåéäéïý.\n"
+"Q  ãéá íá ôåñìáôßóåôå ôç äçìéïõñãßá êëåéäéïý."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+"ÁðáíôÞóôå \"yes\" (Þ áðëÜ \"y\") åÜí åßíáé åíôÜîåé íá äçìéïõñãçèåß ôï "
+"õðïêëåéäß."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"¼ôáí õðïãñÜöåôå Ýíá user ID óå Ýíá êëåéäß, ðñÝðåé ðñþôá íá âåâáéùèåßôå üôé\n"
+"ôï êëåéäß áíÞêåé óôï ðñüóùðï ðïõ áíáöÝñåôå óôï user ID. Åßíáé ÷ñÞóéìï "
+"ãéáôïõò Üëëïõò, íá îÝñïõí ðüóï ðñïóåêôéêÜ êÜíáôå áõôÞ ôç ðéóôïðïßçóç.\n"
+"\n"
+"\"0\" óçìáßíåé ïôé äåí áðáíôÜôå êáôá ðüóï ðñïóåêôéêÜ ðéóôïðïéÞóáôå ôï "
+"êëåéäß.\n"
+"\"1\" óçìáßíåé üôé ðéóôåýåôå ïôé ôï êëåéäß áíÞêåé óôï Üôïìï ðïõ ëÝåé üôé "
+"ôïõ\n"
+"    áíÞêåé, áëëÜ äåí ìðïñåßôå Þ äåí åðéâåâáéþóáôå êáèüëïõ ôï êëåéäß. Áõôü\n"
+"    åßíáé ÷ñÞóéìï üôáí õðïãñÜöåôå ôï êëåéäß åíüò \"øåõäþíõìïõ\" ÷ñÞóôç.\n"
+"\n"
+"\"2\" óçìáßíåé üôé êÜíáôå ôçí óõíÞèç ðéóôïðïßçóç ôïõ êëåéäéïý. Ãéá "
+"ðáñÜäåéãìá\n"
+"    áõôü ìðïñåß íá óçìáßíåé üôé ðéóôïðïéÞóáôå ôï êëåéäß êáé åëÝãîáôå ôï\n"
+"    user ID óôï êëåéäß ìå ìéá photo ID.\n"
+"\n"
+"\"3\" óçìáßíåé üôé êÜíáôå åêôåôáìÝíï Ýëåã÷ï óôï êëåéäß. Ãéá ðáñÜäåéãìá, "
+"áõôü\n"
+"    áõôü ìðïñåß íá óçìáßíåé üôé åëÝãîáôå ôï áðïôýðùìá ôïõ êëåéäéïý ìå ôïí\n"
+"    éäéïêôÞôç ôïõ êëåéäéïý \"öõóéêÜ\" ðáñþí êáé åëÝãîáôå üôé ôï photo ID "
+"ôïõ\n"
+"    êëåéäéïý åßíáé üìïéï ìå áõôü óå Ýíá äýóêïëá íá ðáñá÷áñá÷èåß Ýããñáöï ð."
+"÷.\n"
+"    ôáõôüôçôá, äéáâáôÞñéï, äßðëùìá ïäÞãçóçò.\n"
+"\n"
+"¸÷åôå õðüøç üôé ôá ðáñáäåßãìáôá ðïõ äþèçêáí óôá \"åðßðåäá\" 2 êáé 3 åßíáé\n"
+"*ìüíï* ðáñáäåßãìáôá. Óôï ôÝëïò åîáñôÜôå ìüíï áðü åóÜò íá áðïöáóßóåôå ôé\n"
+"óçìáßíåé \"óõíÞèåò\" êáé ôé \"åêôåôôáìÝíï\" óå åóÜò üôáí õðïãñÜöåôå "
+"êëåéäéÜ.\n"
+"\n"
+"ÅÜí äåí îÝñåôå ðïéÜ åßíáé ç óùóôÞ áðÜíôçóç, äþóôå \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "ÁðáíôÞóôå \"yes\" åÜí èÝëåôå íá õðïãñÜøåôå ÏËÁ ôá user ID"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"ÁðáíôÞóôå \"yes\" åÜí ðñáãìáôéêÜ èÝëåôå íá äéáãñáöåß áõôü\n"
+"ôï user ID.  ¼ëá ôá ðéóôïðïéçôéêÜ èá ÷áèïýí ôüôå!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "ÁðáíôÞóôå \"yes\" åÜí åßíáé åíôÜîåé íá äéáãñáöåß ôï õðïêëåéäß"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"ÁõôÞ åßíáé ìéá Ýãêõñç õðïãñáöÞ óôï êëåéäß. ÊáíïíéêÜ äåí èá èÝëáôå\n"
+"íá äéáãñáöåß áõôÞ ç õðïãñáöÞ åðåéäÞ ìðïñåß íá åßíáé áðáñáßôçôç ãéá\n"
+"êáèéÝñùóç ìéá óýíäåóçò åìðéóôïóýíçò óôï êëåéäß Þ óå Ýíá Üëëï êëåéäß\n"
+"ðéóôïðïéçìÝíï áðü áõôü."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"ÁõôÞ ç õðïãñáöÞ äåí ìðïñåß íá åëåã÷èåß åðåéäÞ äåí Ý÷åôå ôï áíôßóôïé÷ï\n"
+"êëåéäß.  ÐñÝðåé íá áíáâÜëëåôå ôç äéáãñáöÞ ôïõ, ìÝ÷ñé íá ìÜèåôå ðéï êëåéäß\n"
+"÷ñçóéìïðïéÞèçêå ãéáôß áõôü ôï êëåéäß õðïãñáöÞò ìðïñåß íá êáèéåñþóåé\n"
+"ìéá óýíäåóç åìðéóôïóýíçò ìÝóù åíüò Üëëïõ Þäç ðéóôïðïéçìÝíïõ êëåéäéïý."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Ç õðïãñáöÞ äåí åßíáé Ýãêõñç.  Åßíáé óõíåôü íá äéáãñáöåß áðü ôç\n"
+"êëåéäïèÞêç óáò."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"ÁõôÞ åßíáé ìéá õðïãñáöÞ ðïõ óõíäÝåé ôï user ID óôï êëåéäß. Äåí\n"
+"åßíáé óõíÞèùò êáëÞ éäÝá íá äéáãñáöåß ìéá ôÝôïéá õðïãñáöÞ.  Óôçí\n"
+"ðñáãìáôéêüôçôá ôï GnuPG ßóùò íá ìç ìðïñåß íá ÷ñçóéìïðïéÞóåé áõôü\n"
+"ôï êëåéäß ðéá.  Ïðüôå íá óõíå÷ßóåôå ìüíï åÜí áõôÞ ç éäéï-õðïãñáöÞ ãéá\n"
+"êÜðïéï ëüãï äåí åßíáé Ýãêõñç Þ õðÜñ÷åé ìéá äåýôåñç."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"ÁëëÜîôå ôéò ðñïåðéëïãÝò üëùí ôùí user ID (Þ ìüíï ôùí åðéëåãìÝíùí)\n"
+"óôçí ðñïõðÜñ÷ïõóá ëßóôá ðñïåðéëïãþí.  Ç çìåñïìçíßá üëùí ôùí åðçñåáóìÝíùí\n"
+"éäéï-õðïãñáöþí èá áõîçèåß êáôÜ 1 äåõôåñüëåðôï.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "ÐëçêôñïëïãÞóôå ôç öñÜóç êëåéäß· áõôÞ åßíáé ìéá ìõóôéêÞ ðñüôáóç \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Ðáñáêáëþ åðáíáëÜâåôå ôç ôåëåõôáßá öñÜóç êëåéäß, ãéá óéãïõñéÜ."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Äþóôå ôï üíïìá ôïõ áñ÷åßïõ óôï ïðïßï åöáñìüæåôáé ç õðïãñáöÞ"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "ÁðáíôÞóôå \"yes\" åÜí åßíáé åíôÜîåé íá åðéêáëõöèåß ôï áñ÷åßï"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Ðáñáêáëþ åéóÜãåôå Ýíá íÝï üíïìá áñ÷åßïõ. ÅÜí áðëÜ ðáôÞóåôå RETURN\n"
+"ôï åî'ïñéóìïý áñ÷åßï (áðåéêïíßæåôáé óôéò áãêýëåò) èá ÷ñçóéìïðïéçèåß."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"ÐñÝðåé íá ïñßóåôå Ýíá ëüãï ãéá ôçí ðéóôïðïßçóç.  ÁíÜëïãá ìå ôá\n"
+"óõìöñáæüìåíá, Ý÷åôå ôç äõíáôüôçôá íá åðéëÝîåôå áðü ôç ëßóôá:\n"
+"  \"Ôï êëåéäß Ý÷åé åêôåèåß\"\n"
+"      ×ñçóéìïðïéåßóôå åÜí ðéóôåýåôå üôé ìç åîïõóéïäïôçìÝíá ðñüóùðá\n"
+"      Ý÷ïõí ðñüóâáóç óôï ìõóôéêü êëåéäß óáò.\n"
+"  \"Ôï êëåéäß Ý÷åé ðáñáêáìèåß\"\n"
+"      ×ñçóéìïðïéåßóôå åÜí Ý÷åôå áíôéêáôáóôÞóåé ôï êëåéäß ìå Ýíá Üëëï.\n"
+"  \"Ôï êëåéäß äåí ÷ñçóéìïðïéåßôå ðëÝïí\"\n"
+"      ×ñçóéìïðïéåßóôå åÜí Ý÷åôå áðïóýñåé áõôü ôï êëåéäß.\n"
+"  \"Ôï user ID äåí åßíáé ðëÝïí Ýãêõñï\"\n"
+"      ×ñçóéìïðïéåßóôå áõôü ãéá íá äçëþóåôå üôé ôï user ID äåí ðñÝðåé\n"
+"      íá ÷ñçóéìïðïéåßôáé ðéá. Ãéá íá ïñßóåôå Üêõñç ìéá äéåýèõíóç email.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"ÅÜí åðéèõìåßôå, ìðïñåßôå íá ðëçêôñïëïãÞóåôå Ýíá êåßìåíï ðïõ\n"
+"ðåñéãñÜöåé ôïí ëüãï ðïõ åêäßäåôáé áõôü ôï ðéóôïðïéçôéêü áíÜêëçóçò.\n"
+"Ðáñáêáëþ êñáôÞóôå áõôü ôï êåßìåíï óõíïðôéêü. Ìéá Üäåéá ãñáììÞ\n"
+"ëÞãåé ôï êåßìåíï.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Äåí õðÜñ÷åé äéáèÝóéìç âïÞèåéá"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Äåí õðÜñ÷åé äéáèÝóéìç âïÞèåéá ãéá `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "áíáíÝùóç ôçò âÜóçò äåäïìÝíùí åìðéóôïóýíçò"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "ôï äçìïóßï êëåéäß äåí ôáéñéÜæåé ìå ôï ìõóôéêü!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "ìç ÷ñçóéìïðïéÞóéìï ìõóôéêü êëåéäß"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "ðáñÜëåéøç ôìÞìáôïò ôïõ ôýðïõ %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu êëåéäéÜ Ý÷ïõí ìÝ÷ñé ôþñá åðåîåñãáóôåß\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Óõíïëéêüò áñéèìüò ðïõ åðåîåñãÜóôçêáí: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      íÝá êëåéäéÜ ðïõ ðáñáëåßöèçêáí: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          ÷ùñßò user ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              åéóá÷èÝíôá: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             áìåôÜâëçôá: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          íÝá user ID: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           íÝá õðïêëåéäéÜ: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        íÝåò õðïãñáöÝò: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   íÝåò áíáêëÞóåéò êëåéäéþí: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      áíáãíùóìÝíá ìõóôéêÜ êëåéäéÜ: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  åéóá÷èÝíôá ìõóôéêÜ êëåéäéÜ: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " áìåôÜâëçôá ìõóôéêÜ êëåéäéÜ: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "          ìç  åéóá÷èÝíôá: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "        íÝåò õðïãñáöÝò: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      áíáãíùóìÝíá ìõóôéêÜ êëåéäéÜ: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "¸÷åôå õðïãñÜøåé áõôÜ ôá user ID:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s õðïãñáöÞ, áëãüñéèìïò ðåñßëçøçò %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "êëåéäß %08lX: äåí õðÜñ÷åé áõôü ôï user ID\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "êëåéäß %08lX: åðéäéüñèùóç öèáñìÝíïõ õðïêëåéäéïý HKP\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "êëåéäß %08lX: äåêôü ìç éäéï-õðïãåãñáììÝíï user ID '%s'\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "êëåéäß %08lX: äåí Ý÷åé Ýãêõñá user ID\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "áõôü ìðïñåß íá óõíÝâåé áðü ìéá áðïýóá éäéïûðïãñáöÞ\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "êëåéäß %08lX: ìõóôéêü êëåéäß ðïõ äå âñÝèçêå: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "êëåéäß %08lX:  íÝï êëåéäß - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "äåí âñåèçêå åããñÜøéìç êëåéäïèÞêç: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "åããñáöÞ óôï  `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "áäõíáìßá åããñáöÞò ôçò êëåéäïèÞêçò `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "êëåéäß %08lX: ôï äçìüóéï êëåéäß \"%s\" Ý÷åé åéóá÷èåß\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "êëåéäß %08lX: äåí ôáéñéÜæåé ìå ôï áíôßãñáöï ìáò\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "êëåéäß %08lX: áäõíáìßá åíôïðéóìïý ôïõ áñ÷éêïý ôìÞìáôïò êëåéäéïý: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "êëåéäß %08lX: áäõíáìßá áíÜãíùóçò ôïõ áñ÷éêïý ôìÞìáôïò êëåéäéïý: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "êëåéäß %08lX: \"%s\" 1 íÝï user ID\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝá user ID\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "êëåéäß %08lX: \"%s\" 1 íÝá õðïãñáöÞ\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝåò õðïãñáöÝò\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "êëåéäß %08lX: \"%s\" 1 íÝï õðïêëåéäß\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝá õðïêëåéäéÜ\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝåò õðïãñáöÝò\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝåò õðïãñáöÝò\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝá user ID\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "êëåéäß %08lX: \"%s\" %d íÝá user ID\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "êëåéäß %08lX: \"%s\" áìåôÜâëçôï\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "êëåéäß %08lX: ìõóôéêü êëåéäß ìå Üêõñï êñõðôáëã. %d - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "äåí õðÜñ÷åé ðñïêáèïñéóìÝíç êëåéäïèÞêç: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "êëåéäß %08lX: ìõóôéêü êëåéäß åéóÞ÷èçêå\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "êëåéäß %08lX: Þäç óôç ìõóôéêÞ êëåéäïèÞêç\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "êëåéäß %08lX: äå âñÝèçêå ôï ìõóôéêü êëåéäß: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"êëåéäß %08lX: ü÷é äçìüóéï êëåéäß - áäõíáìßá åöáñìïãÞò ðéóôïðïéçôéêïý "
+"áíÜêëçóçò\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "êëåéäß %08lX: ìç Ýãêõñï ðéóôïðïéçôéêü áíÜêëçóçò: %s - áðüññéøç\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "êëåéäß %08lX: \"%s\" ðéóôïðïéçôéêü áíÜêëçóçò åéóÞ÷èçêå\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "êëåéäß %08lX: äåí õðÜñ÷åé user ID ãéá ôçí õðïãñáöÞ\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"êëåéäß %08lX: ìç õðïóôçñéæüìåíïò áëãüñéèìïò äçìïóßïõ êëåéäéïý óôï user id \"%"
+"s\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "êëåéäß %08lX: ìç Ýãêõñç éäéï-õðïãñáöÞ óôï user id \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "êëåéäß %08lX: äåí õðÜñ÷åé õðïêëåéäß ãéá ôç äÝóìåõóç êëåéäéïý\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "êëåéäß %08lX: ìç õðïóôçñéæüìåíïò áëãüñéèìïò äçìïóßïõ êëåéäéïý\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "êëåéäß %08lX: ìç Ýãêõñç äÝóìåõóç õðïêëåéäéïý\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "êëåéäß %08lX: áöáéñÝèçêå ç äÝóìåõóç ðïëëáðëïý õðïêëåéäéïý\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "êëåéäß %08lX: äåí õðÜñ÷åé õðïêëåéäß ãéá ôçí áíÜêëçóç êëåéäéïý\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "êëåéäß %08lX: ìç Ýãêõñç áíÜêëçóç õðïêëåéäéïý\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "êëåéäß %08lX: áöáéñÝèçêå ç áíÜêëçóç ðïëëáðëïý õðïêëåéäéïý\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "êëåéäß %08lX: ðáñáëåßöèçêå user ID '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "êëåéäß %08lX: ðáñáëåßöèçêå õðïêëåéäß\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "êëåéäß %08lX: ìç åîáãüìåíç õðïãñáöÞ (êëÜóç %02x) - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr ""
+"êëåéäß %08lX: ôï ðéóôïðïéçôéêü áíÜêëçóçò óå ëÜèïò óçìåßï - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "êëåéäß %08lX: ìç Ýãêõñï ðéóôïðïéçôéêü áíÜêëçóçò: %s - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr ""
+"êëåéäß %08lX: ç õðïãñáöÞ ôïõ õðïêëåéäéïý óå ëÜèïò óçìåßï - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "êëåéäß %08lX: ìç áíáìåíþìåíç êëÜóç õðïãñáöÞò (0x%02x) - ðáñáëåßöèçêå\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "êëåéäß %08lX: åíôïðßóôçêå äéðëü user ID - åíþèçêáí\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: êëåéäß %08lX ìðïñåß íá áíáêëçèåß: ëÞøç êëåéäéïý áíÜêëçóçò %"
+"08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: êëåéäß %08lX ìðïñåß íá áíáêëçèåß: ôï êëåéäß áíÜêëçóçò %08lX\n"
+"äåí åßíáé ðáñþí.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "êëåéäß %08lX: \"%s\" ðéóôïðïéçôéêü áíÜêëçóçò ðñïóôÝèçêå\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "êëåéäß %08lX: Üìåóç õðïãñáöÞ êëåéäéïý ðñïóôÝèçêå\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "ôï äçìïóßï êëåéäß äåí ôáéñéÜæåé ìå ôï ìõóôéêü!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ðáñáëåßöèçêå: ìõóôéêü êëåéäß Þäç ðáñþí\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ðáñáëåßöèçêå: ìõóôéêü êëåéäß Þäç ðáñþí\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôçò êëåéäïèÞêçò `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "êëåéäïèÞêç `%s' äçìéïõñãÞèçêå\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "óöÜëìá êáôÜ ôç äçìéïõñãßá ôïõ `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "áðïôõ÷ßá åðáíáäüìçóçò ôçò cache êëåéäïèÞêçò: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[áíÜêëçóç]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[éäéï-õðïãñáöÞ]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 êáêÞ õðïãñáöÞ\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d êáêÝò õðïãñáöÝò\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãù ÷áìÝíïõ êëåéäéïý\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d õðïãñáöÝò äåí åëÝã÷èçêáí ëüãù ÷áìÝíùí êëåéäéþí\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 õðïãñáöÞ äåí åëÝã÷èçêå ëüãï åíüò óöÜëìáôïò\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d õðïãñáöÝò äåí åëÝã÷èçêáí ëüãù óöáëìÜôùí\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 user ID áíé÷íåýôçêå ÷ùñßò Ýãêõñç éäéï-õðïãñáöÞ\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d user ID áíé÷íåýèçêáí ÷ùñßò Ýãêõñåò éäéï-õðïãñáöÝò\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Ðáñáêáëþ áðïöáóßóôå ðüóï êáëÜ åìðéóôåýåóôå áõôü ôï\n"
+"÷ñÞóôç, þóôå íá ìðïñåß íá åðáëçèåýåé êëåéäéÜ Üëëùí (ìå ôï\n"
+"íá êïéôÜæåé passports êáé fingerprints áðü äéÜöïñåò ðçãÝò...);\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = ¸÷ù ìåñéêÞ åìðéóôïóýíç\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = ¸÷ù ðëÞñç åìðéóôïóýíç\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Óßãïõñá èÝëåôå áêüìá íá ôï õðïãñÜøåôå; (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Áäõíáìßá õðïãñáöÞò.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Ôï user ID \"%s\" Ý÷åé Ýëçîå."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï user ID \"%s\" äåí Ý÷åé éäéï-õðïãñáöåß."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï user ID \"%s\" äåí Ý÷åé éäéï-õðïãñáöåß."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Óßãïõñá íá õðïãñáöåß; "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Ç éäéï-õðïãñáöÞ óôï \"%s\"\n"
+"åßíáé ìéá õðïãñáöÞ ôýðïõ PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "ÈÝëåôå íá ôç ðñïÜãåôå óå ìéá OpenPGP éäéï-õðïãñáöÞ; (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Ç ðñïõðÜñ÷ïõóá õðïãñáöÞ óáò óôï \"%s\"\n"
+"Ý÷åé ëÞîåé.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"ÈÝëåôå íá ïñßóåôå ìéá íÝá õðïãñáöÞ ðñïò áíôéêáôÜóôáóç ôçò ëçãìÝíçò; (y/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Ç ðñïõðÜñ÷ïõóá õðïãñáöÞ óáò óôï \"%s\"\n"
+"åßíáé ìéá ôïðéêÞ õðïãñáöÞ.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "ÈÝëåôå íá ôç ðñïÜãåôå óå ìéá ðëÞñç åîáãþãéìç õðïãñáöÞ; (y/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" Þäç õðïãñÜöèçêå áðü ôï êëåéäß %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" Þäç õðïãñÜöèçêå áðü ôï êëåéäß %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Óßãïõñá èÝëåôå áêüìá íá ôï îáíáõðïãñÜøåôå; (y/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Ôßðïôá ãéá íá õðïãñáöåß ìå ôï êëåéäß  %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Áõôü ôï êëåéäß Ý÷åé ëÞîåé!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Áõôü ôï êëåéäß ðñüêåéôå íá ëÞîåé óôéò %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "ÈÝëåôå ç õðïãáöÞóáò íá ëÞîåé ôáõôü÷ñïíá;  (Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Ìðïñåßôå íá ÷ñçóéìüðïéÞóåôå ìéá OpenPGP õðïãñáöÞ óå Ýíá PGP 2.x ìüíï óå "
+"êáôÜóôáóç --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Áõôü èá êÜíåé ôï êëåéäß Ü÷ñçóôï ìå ôï PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Åßóôå óßãïõñïé üôé åëÝãîáôå ðñïóåêôéêÜ üôé ôï êëåéäß ðïõ åßóôå Ýôïéìïé íá\n"
+"áíÞêåé ðñÜãìáôé óôï ðñïáíöåñèÝí Üôïìï; ÅÜí äåí îÝñåôå ôé íá áðáíôÞóåôå "
+"ðáôÞóôå\"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Äåí áðáíôþ.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Äåí Ý÷ù åëÝãîåé êáèüëïõ.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) ¸÷ù êÜíåé ôïí óõíÞèç Ýëåã÷ï.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) ¸÷ù êÜíåé åêôåôáìÝíï Ýëåã÷ï.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Ç åðéëïãÞ óáò; (ðëçêôñïëïãÞóôå ? ãéá ðëçñïöïñßåò): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Óßãïõñá èÝëåôå íá õðïãñÜøåôå áõôü ôï êëåéäß\n"
+"ìå ôï êëåéäß óáò: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"ÁõôÞ èá åßíáé ìéá éäéï-õðïãñáöÞ.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ç õðïãñáöÞ äå èá óçìåéùèåß óáí ìç-åîáãþãéìç.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Ç õðïãñáöÞ äå èá óçìåéùèåß óáí ìç-áíáêáëÝóéìç.\n"
+"\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Ç õðïãñáöÞ èá óçìåéùèåß óáí ìç-åîáãþãéìç.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Ç õðïãñáöÞ èá óçìåéùèåß óáí ìç-áíáêáëÝóéìç.\n"
+"\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Äåí Ý÷ù åëÝãîåé êáèüëïõ áõôü ôï êëåéäß.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"¸÷ù êÜíåé óõíçèéóìÝíï Ýëåã÷ï óå áõôü ôï êëåéäß.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"¸÷ù åëÝãîåé ðïëý ðñïóåêôéêÜ áõôü ôï êëåéäß.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Óßãïõñá íá õðïãñáöåß; "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "ç õðïãñáöÞ áðÝôõ÷å: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Áõôü ôï êëåéäß äåí ðñïóôáôåýåôáé.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "ÌõóôéêÜ ôìÞìáôá ôïõ êýñéïõ êëåéäéïý äåí åßíáé äéáèÝóéìá.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "ÌõóôéêÜ ôìÞìáôá ôïõ êýñéïõ êëåéäéïý äåí åßíáé äéáèÝóéìá.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Ôï êëåéäß ðñïóôáôåýåôáé.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Áäýíáôç ç åðåîåñãáóßá áõôïý ôïõ êëåéäéïý:%s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"ÐëçêôñïëïãÞóôå ôçí íÝá öñÜóç êëåéäß ãéá áõôü ôï ìõóôéêü êëåéäß.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "ç öñÜóç êëåéäß äåí åðáíáëÞöèçêå óùóôÜ. ÄïêéìÜóôå îáíÜ"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr "Äåí èÝëåôå öñÜóç êëåéäß - áõôü åßíáé ìÜëëïí *êáêÞ* éäÝá!\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá êÜíåôå áõôü; "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "ìåôáêßíçóç õðïãñáöÞò êëåéäéïý óôç óùóôÞ èÝóç\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "áðïèÞêåõóç êáé Ýîïäïò"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "áðåéêüíéóç ôïõ fingerprint"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "áðåéêüíéóç ôùí êëåéäéþí êáé ôùí user ID"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "åðéëïãÞ user ID N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "åðéëïãÞ user ID N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "áíÜêëçóç õðïãñáöþí"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "õðïãñáöÞ ôïõ êëåéäéïý ôïðéêÜ"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "ÓõìâïõëÞ: ÅðéëÝîôå ôï user ID ãéá õðïãñáöÞ\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "ðñïóèÞêç åíüò user ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "ðñïóèÞêç åíüò photo ID"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "äéáãñáöÞ åíüò user ID"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "äéáãñáöÞ åíüò äåõôåñåýïíôïò êëåéäéïý"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "ðñïóèÞêç åíüò êëåéäéïý áíÜêëçóçò"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"Óßãïõñá èÝëåôå íá áíáíåùèïýí ïé ðñïåðéëïãÝò ãéá ôï åðéëåãìÝíï user ID; "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Äåí ìðïñåßôå íá áëëÜîåôå ôçí çìåñïìçíßá ëÞîçò óå Ýíá v3 êëåéäß\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "óçìåßùóç ôïõ user ID óáí ðñùôåýùí"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "áëëáãÞ ìåôáîý ôçò áðåéêüíéóçò ìõóôéêïý êáé äçìüóéïõ êëåéäéïý"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "áðåéêüíéóç ðñïåðéëïãþí (åéäéêÝò)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "áðåéêüíéóç åðéëïãþí (áíáëõôéêÜ)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"Óßãïõñá èÝëåôå íá áíáíåùèïýí ïé ðñïåðéëïãÝò ãéá ôï åðéëåãìÝíï user ID; "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "áäõíáìßá åðåîåñãáóßáò ôïõ URI ôïõ äéáêïìéóç êëåéäéþí\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"Óßãïõñá èÝëåôå íá áíáíåùèïýí ïé ðñïåðéëïãÝò ãéá ôï åðéëåãìÝíï user ID; "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "áëëáãÞ ôçò öñÜóçò êëåéäß"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "áëëáãÞ ôçò åìðéóôïóýíçò éäéïêôÞôç"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèïýí üëá ôá åðéëåãìÝíá user ID; "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "áíÜêëçóç åíüò user ID"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "áíÜêëçóç åíüò äåõôåñåýïíôïò êëåéäéïý"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "åíåñãïðïéåß Ýíá êëåéäß"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "áðåíåñãïðïéåß Ýíá êëåéäß"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "áðåéêüíéóç photo ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ìõóôéêïý ìðëïê êëåéäéïý `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Ôï ìõóôéêü êëåéäß åßíáé äéáèÝóéìï.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Áðáéôåßôáé ôï ìõóôéêü êëåéäß ãéá íá ãßíåé áõôü.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Ðáñáêáëþ ÷ñçóéìïðïéåßóôå ôçí åíôïëÞ \"toggle\" ðñþôá.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Ôï êëåéäß áíáêëÞèçêå."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Óßãïõñá íá õðïãñáöïýí üëá ôá user ID; "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "ÓõìâïõëÞ: ÅðéëÝîôå ôï user ID ãéá õðïãñáöÞ\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Üãíùóôç êëÜóç õðïãñáöÞò"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "ÁõôÞ ç åíôïëÞ áðáãïñåýåôå óå áõôÞ ôçí êáôÜóôáóç %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "ÐñÝðåé íá åðéëÝîåôå ôï ëéãüôåñï Ýíá user ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Äåí ìðïñåßôå íá äéáãñÜøåôå ôï ôåëåõôáßï user ID!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá äéáãñáöïýí üëá ôá åðéëåãìÝíá user ID; "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá äéáãñáöåß áõôü ôï user ID; "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá äéáãñáöåß áõôü ôï user ID; "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "ÐñÝðåé íá åðéëÝîåôå ôïõëÜ÷éóôïí Ýíá êëåéäß.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "áäõíáìßá ðñüóâáóçò óôï `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôçò êëåéäïèÞêçò `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "ÐñÝðåé íá åðéëÝîåôå ôïõëÜ÷éóôïí Ýíá êëåéäß.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá äéáãñáöïýí ôá åðéëåãìÝíá êëåéäéÜ; "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá äéáãñáöåß áõôü ôï êëåéäß; "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèïýí üëá ôá åðéëåãìÝíá user ID; "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèåß áõôü ôï user ID; "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèåß áõôü ôï êëåéäß; "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèïýí ôá åðéëåãìÝíá êëåéäéÜ; "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèåß áõôü ôï êëåéäß; "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "ïñéóìüò áðåéêüíéóçò åðéëïãþí"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Óßãïõñá èÝëåôå íá áíáíåùèïýí ïé ðñïåðéëïãÝò ãéá ôï åðéëåãìÝíï user ID; "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Óßãïõñá íá áíáíåùèïýí ïé ðñïåðéëïãÝò;"
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "ÁðïèÞêåõóç ôùí áëëáãþí; "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Ôåñìáôéóìüò ÷ùñßò áðïèÞêåõóç; "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "ç åíçìÝñùóç áðÝôõ÷å: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "ç åíçìÝñùóç ìõóôéêïý áðÝôõ÷å: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Ôï êëåéäß äåí Üëëáîå ïðüôå äåí ÷ñåéÜæåôáé åíçìÝñùóç.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Ðåñßëçøç: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Äõíáôüôçôå: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Óçìåßùóç: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Äåí õðÜñ÷ïõí ðñïåðéëïãÝò óå Ýíá user ID ôýðïõ PGP 2.x.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Áõôü ôï êëåéäß ìðïñåß íá áíáêëçèåß áðü %s êëåéäß "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Áõôü ôï êëåéäß ìðïñåß íá áíáêëçèåß áðü %s êëåéäß "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (åõáßóèçôï)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "áäõíáìßá äçìéïõñãßáò ôïõ %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[áíáêëçìÝíï]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [ëÞãåé: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [ëÞãåé: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " åìðéóôïóýíç: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " åìðéóôïóýíç: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Áõôü ôï êëåéäß Ý÷åé áðåíåñãïðïéçèåß"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Ç åããõñüôçôá ôïõ áðåéêïíéæüìåíïõ êëåéäéïý äåí åßíáé áðáñáßôçôá óùóôÞ\n"
+"åêôüò êáé åÜí åðáíáêêéíÞóåôå ôï ðñüãñáììá.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[áíáêëçìÝíï]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: äåí Ý÷åé óçìåéùèåß ID ÷ñÞóôç óáí ðñùôåýùí.  ÁõôÞ ç åíôïëÞ\n"
+"              ìðïñåß íá êÜíåé Ýíá Üëëï ID ÷ñÞóôç íá ãßíåé ôï ðñùôåýùí.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü Ýéíáé Ýíá êëåéäß ôýðïõ PGP2. Ç ðñïóèÞêç åíüò photo ID\n"
+"               ìðïñåß íá êÜíåé ìåñéêÝò åêäüóåéò PGP íá ôï áðïññßøïõí.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Óßãïõñá áêüìá èÝëåôå íá ôï ðñïóèÝóåôå; (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Äåí ìðïñåßôå íá ðñïóèÝóåôå ìéá photo ID óå Ýíá êëåéäß ôýðïõ PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "ÄéáãñáöÞ áõôÞò ôçò êáëÞò õðïãñáöÞò; (y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "ÄéáãñáöÞ áõôÞò ôçò ìç Ýãêõñçò õðïãñáöÞò; (y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "ÄéáãñáöÞ áõôÞò ôçò Üãíùóôçò õðïãñáöÞò; (y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Óßãïõñá íá äéáãñáöåß áõôÞ ç éäéï-õðïãñáöÞ; (y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "ÄéáãñÜöôçêå %d õðïãñáöÞ.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "ÄéáãñÜöçêáí %d õðïãñáöÝò.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Ôßðïôá äåí äéáãñÜöôçêå.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "ìç Ýãêõñç èùñÜêéóç"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Ôï user ID \"%s\" áíáêáëåßôå."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "ôï user ID \"%s\" Ý÷åé Þäç áíáêëçèåß\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "ôï user ID \"%s\" Ý÷åé Þäç áíáêëçèåß\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü Ýéíáé Ýíá êëåéäß ôýðïõ PGP 2.x. Ç ðñïóèÞêç åíüò\n"
+"               êáèïñéóìÝíïõ áíáêëçôÞ ìðïñåß íá êÜíåé ìåñéêÝò åêäüóåéò PGP\n"
+"               íá ôï áðïññßøïõí.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"Äåí ìðïñåßôå íá ðñïóèÝóåôå Ýíá êáèïñéóìÝíï áíáêëçôÞ óå êëåéäß ôýðïõ PGP2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "ÐëçêôñïëïãÞóôå ôï user ID ôïõ äéïñéóìÝíïõ áíáêëçôÞ: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"áäõíáìßá ïñéóìïý åíüò êëåéäéïý ôýðïõ PGP 2.x, óáí äéïñéóìÝíïõ áíáêëçôÞ\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+"äå ìðïñåßôå íá ïñßóåôå Ýíá êëåéäß óáí ôï äéïñéóìÝíï áíáêëçôÞ ôïõ åáõôïý ôïõ\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü ôï êëåéäß Ý÷åé áíáêëçèåß áðü ôïí ïñéóìÝíï áíáêëçôÞ!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: åÜí ïñßóåôå Ýíá êëåéäß óáí äéïñéóìÝíï áíáêëçôÞ äåí ìðïñåß íá "
+"åðáíÝëèåé!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Åßóôå óßãïõñïé üôé èÝëåôå íá ïñßóåôå Ýíá êëåéäß óáí äéïñéóìÝíï áíáêëçôÞ; (y/"
+"N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Ðáñáêáëþ áöáéñÝóôå ôéò åðéëïãÝò áðü ôá ìõóôéêÜ êëåéäéÜ.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Ðáñáêáëþ åðéëÝîôå ôï ðïëý Ýíá äåõôåñåýïí êëåéäß.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "ÁëëáãÞ çìåñïìçíßáò ëÞîçò ãéá Ýíá äåõôåñåýïí êëåéäß.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "ÁëëáãÞ çìåñïìçíßáò ëÞîçò ãéá Ýíá ðñùôåýïí êëåéäß.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Äåí ìðïñåßôå íá áëëÜîåôå ôçí çìåñïìçíßá ëÞîçò óå Ýíá v3 êëåéäß\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Äåí âñÝèçêå áíôßóôïé÷ç õðïãñáöÞ óôç ìõóôéêÞ êëåéäïèÞêç\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï õðïãñÜöùí õðïêëåéäß %08lX äåí Ý÷åé êáô' áíôéðáñÜóôáóç "
+"ðéóôïðïéçèåß\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "ÐñÝðåé íá åðéëÝîåôå áêñéâþò Ýíá user ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "ðáñáëåßöèçêå ç v3 éäéï-õðïãñáöÞ óôï user id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Óßãïõñá èÝëåôå áêüìá íá ôï ÷ñçóéìïðïéÞóåôå; (y/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Óßãïõñá èÝëåôå áêüìá íá ôï ÷ñçóéìïðïéÞóåôå; (y/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Óçìåßùóç õðïãñáöÞò: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "ÅðéêÜëõøç (y/N); "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Äåí õðÜñ÷åé user ID ìå äåßêôç %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Äåí õðÜñ÷åé user ID ìå äåßêôç %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Äåí õðÜñ÷åé user ID ìå äåßêôç %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "user ID: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   õðïãñÜöèçêå áðü %08lX óôéò %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (ìç-åîáãþãéìï)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "ÁõôÞ ç õðïãñáöÞ Ýëçîå óôéò %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Óßãïõñá èÝëåôå íá áíáêëçèåß áõôü ôï êëåéäß; "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Äçìéïõñãßá åíüò ðéóôïðïéçôéêïý áíÜêëçóçò ãéá áõôÞ ôçí õðïãñáöÞ; (y/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "¸÷åôå õðïãñÜøåé áõôÜ ôá user ID:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (ìç-åîáãþãéìï)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   áíáêëÞèçêå áðü %08lX óôéò %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Óêïðåýåôå íá áíáêáëÝóåôå áõôÝò ôéò õðïãñáöÝò:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Óßãïõñá íá äçìéïõñãçèïýí ôá ðéóôïðïéçôéêÜ áíÜêëçóçò; (y/N)"
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "êáíÝíá ìõóôéêü êëåéäß\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "ôï user ID \"%s\" Ý÷åé Þäç áíáêëçèåß\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ìéá õðïãñáöÞ user ID Ý÷åé çìåñïìçíßá %d äåýôåñá óôï ìÝëëïí\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "ôï user ID \"%s\" Ý÷åé Þäç áíáêëçèåß\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "ôï user ID \"%s\" Ý÷åé Þäç áíáêëçèåß\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Áðåéêüíéóç %s photo ID ìåãÝèïõò %ld ãéá ôï êëåéäß 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "ç ðñïåðéëïãÞ %c%lu áíôéãñÜöôçêå\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "ðÜñá ðïëëÝò `%c' ðñïåðéëïãÝò\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "ðÜñá ðïëëÝò `%c' ðñïåðéëïãÝò\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "ðÜñá ðïëëÝò `%c' ðñïåðéëïãÝò\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "ìç Ýãêõñïò ÷áñáêôÞñáò óôï \"êïñäüíé\" ôçò åðéëïãÞò\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "åããñáöÞ Üìåóçò õðïãñáöÞò\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "åããñáöÞ éäéï-õðïãñáöÞò\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "åããñáöÞ õðïãñáöÞò \"äÝóéìïõ\" êëåéäéïý\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "ìç Ýãêõñï ìÝãåèïò êëåéäéïý, ÷ñÞóç %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "óôñïããõëïðïßçóç ôïõ ìÝãåèïò êëåéäéïý Ýùò %u bits\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "êñõðôïãñÜöçóç äåäïìÝíùí"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Ðáñáêáëþ åðéëÝîôå ôïí ôýðï ôïõ êëåéäéïý ðïõ èÝëåôå:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA êáé ElGamal (ðñïêáèïñéóìÝíï)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (ãéá õðïãñáöÞ ìüíï)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (ãéá õðïãñáöÞ ìüíï)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Ôï æåýãïò êëåéäéþí DSA èá åßíáé 1024 bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Ôé ìÝãåèïò êëåéäéïý èá èÝëáôå; (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Ôï ìÝãåèïò êëåéäéïý ðïõ æçôÞèçêå åßíáé %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "óôñïããõëïðïéÞèçêå Ýùò ôá %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Ðáñáêáëþ ïñßóôå ãéá ðüóï êáéñü ôï êëåéäß èá åßíáé Ýãêõñï.\n"
+"         0 = ôï êëåéäß äåí ëÞãåé ðïôÝ\n"
+"      <n>  = ôï êëåéäß ëÞãåé óå n ìÝñåò\n"
+"      <n>w = ôï êëåéäß ëÞãåé óå n åâäïìÜäåò\n"
+"      <n>m = ôï êëåéäß ëÞãåé óå n ìÞíåò\n"
+"      <n>y = ôï êëåéäß ëÞãåé óå n Ýôç\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Ðáñáêáëþ ïñßóôå ãéá ðüóï êáéñü ôï êëåéäß èá åßíáé Ýãêõñï.\n"
+"         0 = ôï êëåéäß äåí ëÞãåé ðïôÝ\n"
+"      <n>  = ôï êëåéäß ëÞãåé óå n ìÝñåò\n"
+"      <n>w = ôï êëåéäß ëÞãåé óå n åâäïìÜäåò\n"
+"      <n>m = ôï êëåéäß ëÞãåé óå n ìÞíåò\n"
+"      <n>y = ôï êëåéäß ëÞãåé óå n Ýôç\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Ôï êëåéäß åßíáé Ýãêõñï ãéá; (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Ç õðïãñáöÞ Ýéíáé Ýãêõñç ãéá; (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "ìç Ýãêõñç ôéìÞ\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "ôï %s äåí ëÞãåé ðïôÝ\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "ôï %s äåí ëÞãåé ðïôÝ\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "ôï %s ëÞãåé óôéò %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "ÕðïãñáöÞ ëÞãåé óôéò %s.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Ôï óýóôçìá óáò äåí ìðïñåß íá áðåéêïíßóåé çìåñïìçíßåò ðÝñá ôïõ 2038.\n"
+"¼ìùò, èá ÷åéñßæïíôáé óùóôÜ Ýùò ôï 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Åßíáé áõôü óùóôü (y/n); "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"×ñåéÜæåóôå Ýíá User-ID ãéá íá áíáãíùñßóåôå Ýíá êëåéäß. Ôï ëïãéóìéêü "
+"êáôáóêåõÜæåé\n"
+"ôï user-id áðü ôï Áëçèéíü ¼íïìá, Ó÷üëéï êáé Äéåýèõíóç Email êÜðùò Ýôóé:\n"
+"    \"Nikolaoy Nikos (toy Ioanni) <nikoln@athens.gr>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Áëçèéíü ¼íïìá: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò óôï üíïìá\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Ôï üíïìá äåí åðéôñÝðåôáé íá îåêéíÜ ìå áñéèìçôéêü øçößï\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Ôï üíïìá ðñÝðåé íá Ý÷åé ôïõëÜ÷éóôïí 5 ÷áñáêôÞñåò\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Äéåýèõíóç Email: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Ìç Ýãêõñç äéåýèõíóç Email\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Ó÷üëéï: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Ìç Ýãêõñïò ÷áñáêôÞñáò óôï ó÷üëéï\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "×ñçóéìïðïéåßôå ôï `%s' óåô ÷áñáêôÞñùí.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"ÅðéëÝîáôå ôï USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Ðáñáêáëþ ìçí ôïðïèåôåßôå ôçí äéåýèõíóç email óôï üíïìá Þ óôï ó÷üëéï\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "ÁëëáãÞ (N)üíïìá, (C)ó÷üëéï, (E)mail Þ (Q)ôåñìáôéóìüò; "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "ÁëëáãÞ (N)üíïìá, (C)ó÷üëéï, (E)mail Þ (O)åíôÜîåé/(Q)ôåñìáôéóìüò; "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Ðáñáêáëþ, äéïñèþóôå ðñþôá ôï óöÜëìá\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"×ñåéÜæåóôå ìéá ÖñÜóç êëåéäß ãéá íá ðñïóôáôåýóåôå ôï ìõóôéêü êëåéäß.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"ÐñÝðåé íá äçìéïõñãçèïýí ðïëëÜ ôõ÷áßá bytes. Åßíáé êáëÞ éäÝá íá êÜíåôå\n"
+"êÜðïéá åñãáóßá (ðëçêôñïëïãÞóôå, ìåôáêéíÞóôå ôï ðïíôßêé, ÷ñçóéìïðïéÞóôå\n"
+"ôïõò äßóêïõò) êáôá ôç äéÜñêåéá õðïëïãéóìïý ðñþôùí áñéèìþí. Áõôü äßíåé\n"
+"óôç ãåííÞôñéá ôõ÷áßùí áñéèìþí ìéá åõêáéñßá íá ìáæÝøåé áñêåôÞ åíôñïðßá.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Ç äçìéïõñãßá êëåéäéïý áíáâëÞèçêå.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "åããñáöÞ ôïõ äçìïóßïõ êëåéäéïý óôï `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "åããñáöÞ ôïõ ìõóôéêïý êëåéäéïý óôï `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "äå âñÝèçêå åããñÜøéìç äçìüóéá êëåéäïèÞêç: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "äå âñÝèçêå åããñÜøéìç ìõóôéêÞ êëåéäïèÞêç: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "áäõíáìßá åããñáöÞò äçìüóéáò êëåéäïèÞêçò `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "áäõíáìßá åããñáöÞò ìõóôéêÞò êëåéäïèÞêçò `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "ôï äçìüóéï êáé ôï ìõóôéêü êëåéäß äçìéïõñãÞèçêáí êáé õðïãñÜöçêáí.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Óçìåéþóôå üôé áõôü ôï êëåéäß äåí ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá "
+"êñõðôïãñÜöçóç.\n"
+"Ìðïñåßôå íá ÷ñçóéìïðïéÞóåôå ôçí åíôïëÞ \"--edit-key\" ãéá íá äçìéïõñãçèåß\n"
+"Ýíá äåõôåñåýïí êëåéäß ãéá áõôü ôï ëüãï.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Ç äçìéïõñãßá êëåéäéïý áðÝôõ÷å: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+"áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôá óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+"áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"ÓÇÌÅÉÙÓÇ: ç äçìéïõñãßá õðïêëåéäéþí ãéá êëåéäéÜ v3 äåí åßíáé óýìöùíï\n"
+"ìå ôï OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Óßãïõñá íá äçìéïõñãçèåß; "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "äéáãñáöÞ block êëåéäéþí áðÝôõ÷å: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôïõ `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ôï ìõóôéêü êëåéäß %08lX Ýëçîå óôéò %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "ðïôÝ     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "ÐïëéôéêÞ êñßóéìçò õðïãñáöÞò: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "ÐïëéôéêÞ õðïãñáöÞò: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Óçìåßùóç êñßóéìçò õðïãñáöÞò: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Óçìåßùóç õðïãñáöÞò: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "ÊëåéäïèÞêç"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Áðïôýðùìá ðñùôåýùí êëåéäéïý:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Áðïôýðùìá õðïêëåéäéïý:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Áðïôýðùìá ðñùôåýùí êëåéäéïý:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Áðïôýðùìá õðïêëåéäéïý:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Áðïôýðùìá êëåéäéïý ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "èùñÜêéóç áðÝôõ÷å: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: 2 áñ÷åßá ìå åìðéóôåõôéêÝò ðëçñïöïñßåò õðÜñ÷ïõí.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s åßíáé ôï áìåôÜâëçôï\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s åßíáé ôï íÝï\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Ðáñáêáëþ äéïñèþóôå áõôÞ ôçí ðéèáíÞ \"ôñýðá\" áóöáëåßáò\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "Ýëåã÷ïò êëåéäïèÞêçò `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu êëåéäéÜ Ý÷ïõí åëåã÷èåß (%lu õðïãñáöÝò)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: êëåéäïèÞêç äçìéïõñãÞèçêå\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "ôï URL ðïëéôéêÞò õðïãñáöÞò ðïõ äüèçêå äåí åßíáé Ýãêõñï\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ïé åðéëïãåò óôï `%s' äåí åßíáé åíåñãÝò óå áõôÞ ôçí åêôÝëåóç\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "ôï êëåéäß '%s' äå âñÝèçêå: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "ôï êëåéäß '%s' äå âñÝèçêå: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"õðïãñÜöèçêå ìå ôï êëåéäß óáò %08lX óôéò %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "áíáæÞôçóç ôïõ \"%s\" áðü ôï HKP äéáêïìéóôÞ %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "ìç Ýãêõñåò åðéëïãÝò åîáãùãÞò\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "óöÜëìá äéáêïìéóôÞ êëåéäéþí"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "óöÜëìá äéáêïìéóôÞ êëåéäéþí"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "keyserver ëÞøç áðÝôõ÷å: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá äéáãñáöÞò tempfile (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "áßôçóç êëåéäéïý %08lX áðü ôï %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá äéáãñáöÞò tempfile (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá äéáãñáöÞò tempfile (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "ðáñÜîåíï ìÝãåèïò ãéá Ýíá êëåéäß êñõðôïãñáöçìÝíçò óõíåäñßáò (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s êëåéäß êñõðôïãñáöçìÝíçò óõíåäñßá\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "êñõðôïãñáöçìÝíï ìå Üãíùóôï áëãüñéèìï %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "äçìüóéï êëåéäß åßíáé %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "êñõðôïãñáöçìÝíá äåäïìÝíá ìå äçìüóéï êëåéäß: êáëü DEK\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "êñõðôïãñáöçìÝíï ìå %u-bit %s êëåéäß, ID %08lX, äçìéïõñãÞèçêå %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                ãíùóôü óáí \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "êñõðôïãñáöçìÝíï ìå %s key, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "êñõðôïãñÜöçóç ìå äçìüóéï êëåéäß áðÝôõ÷å: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "êñõðôïãñáöçìÝíï ìå %lu öñÜóåéò êëåéäéÜ\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "êñõðôïãñáöçìÝíï ìå 1 öñÜóç êëåéäß\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "õðüèåóç %s êñõðôïãñáöçìÝíùí äåäïìÝíùí\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"Êñõðôáëãüñéèìïò IDEA ìç äéáèÝóéìïò, áéóéüäïîç ðñïóðÜèåéá ÷ñÞóçò ôïõ\n"
+"%s áíôßèåôá\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "áðïêñõðôïãñÜöçóç OK\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: äåí ðñïóôáôåýôçêå ç áêåñáéüôçôá ôïõ ìçýìáôïò\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï êñõðôïãñáöçìÝíï ìÞíõìá Ý÷åé ðåéñá÷èåß!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "áðïêñõðôïãñÜöçóç áðÝôõ÷å: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ï áðïóôïëÝáò æÞôçóå \"ãéá-ôá-ìÜôéá-óáò-ìüíï\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "áñ÷éêü üíïìá áñ÷åßïõ='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "áíåîÜñôçôç áíÜêëçóç - ÷ñçóéìïðïéåßóôå \"gpg --import\" ãéá åöáñìïãÞ\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "ÊáëÞ õðïãñáöÞ áðü \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "êáôáóôïëÞ áíÜêëçóçò õðïãñáöÞò\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "áäõíáìßá ÷åéñéóìïý áõôþí ôùí ðïëëáðëþí õðïãñáöþí\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "ÕðïãñáöÞ Ýëçîå óôéò %s.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                ãíùóôü óáí \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "ÕðïãñáöÞ Ýãéíå óôï %.*s ìå ÷ñÞóç ôïõ êëåéäéïý%s ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Êëåéäß äéáèÝóéìï óôï: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "ÊÁÊÇ õðïãñáöÞ áðü \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "ËçãìÝíç õðïãñáöÞ áðü \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "ÊáëÞ õðïãñáöÞ áðü \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[áâÝâáéï]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                ãíùóôü óáí \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "ÕðïãñáöÞ Ýëçîå óôéò %s.\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "ÕðïãñáöÞ ëÞãåé óôéò %s.\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s õðïãñáöÞ, áëãüñéèìïò ðåñßëçøçò %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "äõáäéêü"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "êáôÜóôáóç-êåéìÝíïõ"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "Üãíùóôï"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Áäõíáìßá åëÝã÷ïõ ôçò õðïãñáöÞò: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "äåí åßíáé áðïêïììÝíç õðïãñáöÞ\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: åíôïðéóìüò ðïëëáðëþí õðïãñáöþí. Ìüíï ç ðñþôç èá åëåã÷èåß.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "áíåîÜñôçôç õðïãñáöÞ êëÜóçò 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "õðïãñáöÞ ðáëéïý óôõë (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "ìç Ýãêõñï ñéæéêü(root) ðáêÝôï áíé÷íåýôçêå óôï proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "áäõíáìßá áðåíåñãïðïßçóçò ôùí core dump: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "áäõíáìßá ðñüóâáóçò ôïõ áñ÷åßïõ: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "trustdb: read áðÝôõ÷å (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "áäõíáìßá ÷åéñéóìïý ôïõ áëãüñéèìïõ äçìïóßïõ êëåéäéïý %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "ìç õëïðïéçìÝíïò áëãüñéèìïò êñõðôïãñÜöçóçò"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s õðïãñáöÞ, áëãüñéèìïò ðåñßëçøçò %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"ï åîáíáãêáóìüò ôïõ áëãüñéèìïõ ðåñßëçøçò %s (%d) ðáñáâéÜæåé ôéò\n"
+"ðñïåðéëïãÝò ôïõ ðáñáëÞðôç\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "ôï âýóìá ôïõ êñõðôáëãüñéèìïõ IDEA äåí õðÜñ÷åé\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = áðåéêüíéóç ðåñéóóüôåñùí ðëçñïöïñéþí\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: ìç óõíåéóôþìåíç åðéëïãÞ \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: \"%s\" åßíáé ìéá ìç óõíåéóôþìåíç åðéëïãÞ\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "ðáñáêáëþ ÷ñçóéìïðïéÞóôå ôï \"%s%s\" êáëýôåñá\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: \"%s\" åßíáé ìéá ìç óõíåéóôþìåíç åðéëïãÞ\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Áóõìðßåóôï"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Áóõìðßåóôï"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "áõôü ôï ìÞíõìá ßóùò äåí ìðïñåß íá ÷ñçóéìïðïéçèåß áðü %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "áíÜãíùóç åðéëïãþí áðü `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "Üãíùóôïò ðñïêáèïñéóìÝíïò ðáñáëÞðôçò `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Ôï áñ÷åßï `%s' õðÜñ÷åé Þäç. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "ÅðéêÜëõøç (y/N); "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: Üãíùóôç êáôÜëçîç\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "ÐëçêôñïëïãÞóôå Ýíá íÝï üíïìá áñ÷åßïõ"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "åããñáöÞ óôçí stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "õðüèåóç õðïãåãñáììÝíùí äåäïìÝíùí óôï `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "äçìéïõñãÞèçêå íÝï áñ÷åßï åðéëïãþí `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ïé åðéëïãåò óôï `%s' äåí åßíáé åíåñãÝò óå áõôÞ ôçí åêôÝëåóç\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: êáôÜëïãïò äçìéïõñãÞèçêå\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "áäõíáìßá ÷åéñéóìïý ôïõ áëãüñéèìïõ äçìïóßïõ êëåéäéïý %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ðéèáíüí ìç áóöáëÝò êñõðôïãñáöçìÝíï óõììåôñéêÜ êëåéäß\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "õðïðáêÝôï ôýðïõ %d Ý÷åé ïñéóìÝíï ôï êñéôéêü bit\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "ï gpg-agent äåí åßíáé äéáèÝóéìïò óå áõôÞ ôç óõíåäñßá\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "êáêïäéáôõðïìÝíç ìåôáâëçôÞ ðåñéâÜëëïíôïò GPG_AGENT_INFO\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "äåí õðïóôçñßæåôáé ç Ýêäïóç ðñùôïêüëëïõ %d ôïõ gpg-agent\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "áäõíáìßá óýíäåóçò óôï `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "ðñüâëçìá ìå ôïí agent - áðåíåñãïðïéÞóç ôçò ÷ñÞóçò ôïõ agent\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (êýñéï êëåéäß, ID %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"×ñåéÜæåóôå ìéá öñÜóç êëåéäß ãéá íá îåêëåéäþóåôå ôï ìõóôéêü êëåéäß ãéá ôï "
+"÷ñÞóôç:\n"
+"\"%.*s\"\n"
+"%u-bit %s êëåéäß, ID %08lX, äçìéïõñãßá %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "ÅðáíáëÜâåôå ôç öñÜóç\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "ÐëçêôñïëïãÞóôå ôç öñÜóç êëåéäß\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "áêõñþèçêå áðü ôï ÷ñÞóôç\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "áäõíáìßá åñþôçóçò ôçò ëÝîçò êëåéäß óå êáôÜóôáóç äÝóìçò\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "ÐëçêôñïëïãÞóôå ôç öñÜóç êëåéäß: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"×ñåéÜæåóôå ìéá öñÜóç êëåéäß ãéá íá îåêëåéäþóåôå ôï ìõóôéêü êëåéäß\n"
+"ãéá ôï ÷ñÞóôç: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bit %s êëåéäß, ID %08lX, äçìéïõñãßá %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "ÅðáíáëÜâåôå ôç öñÜóç êëåéäß: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"ÄéáëÝîôå ìéá åéêüíá óáí ôï photo ID.  Ç åéêüíá áõôÞ ðñÝðåé íá åßíáé áñ÷åßï\n"
+"JPEG. Èõìçèåßôå üôé ç åéêüíá áðïèçêåýåôáé ìÝóá óôï äçìüóéï êëåéäß óáò.  ÅÜí\n"
+"÷ñçóéìïðïéåßôå ìéá ìåãÜëç åéêüíá ôï êëåéäß óáò áíôßóôïé÷á èá ãßíåé ìåãÜëï!\n"
+"Éäáíßêü ìÝãåèïò ãéá ìéá åéêüíá åßíáé áõôü êïíôÜ óôï 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "ÐëçêôñïëïãÞóôå Ýíá üíïìá áñ÷åßïõ ãéá ôï photo ID: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "áäõíáìßá ðñüóâáóçò ôïõ áñ÷åßïõ: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Óßãïõñá èÝëåôå áêüìá íá ôï ÷ñçóéìïðïéÞóåôå; (y/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" äåí åßíáé JPEG áñ÷åßï\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Åßíáé áõôÞ ç öùôïãñáößá óùóôÞ (y/N/q); "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "áäõíáìßá áðåéêüíéóçò ôïõ photo ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Äåí Ý÷åé ïñéóôåß áéôßá"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Ôï êëåéäß Ý÷åé ðáñáêáìèåß"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Ôï êëåéäß Ý÷åé åêôåèåß"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Ôï êëåéäß äå ÷ñçóéìïðïéåßôáé ðëÝïí"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Ôï User ID äåí åßíáé ðëÝïí Ýãêõñï"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "áéôßá ãéá áíÜêëçóç:"
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "ó÷üëéï áíÜêëçóçò:"
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Äåí äüèçêå áîßá åìðéóôïóýíçò óôï:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                ãíùóôü óáí \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Áõôü ôï êëåéäß ðéèáíþò áíÞêåé óôïí éäéïêôÞôç\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Äåí îÝñù\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d =  ÄÅÍ Ý÷ù åìðéóôïóýíç\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Åìðéóôåýïìáé áðüëõôá\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = ðßóù óôï êõñßùò ìåíïý\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = ðáñÜëåéøç áõôïý ôïõ êëåéäéïý\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = ôåñìáôéóìüò\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Ç áðüöáóç óáò; "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Óßãïõñá èÝëåôå áõôü ôï êëåéäß íá ïñéóôåß óáí áðüëõôçò åìðéóôïóýíçò; "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "ÐéóôïðïéçôéêÜ ðïõ ïäçãïýí óå Ýíá êëåéäß áðüëõôçò åìðéóôïóýíçò:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Äåí õðÜñ÷åé Ýíäåéîç üôé ç õðïãñáöÞ áõôÞ áíÞêåé óôïí éäéïêôÞôç.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Äåí õðÜñ÷åé Ýíäåéîç üôé ç õðïãñáöÞ áõôÞ áíÞêåé óôïí éäéïêôÞôç.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Áõôü ôï êëåéäß ðéèáíþò áíÞêåé óôïí éäéïêôÞôç\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Áõôü ôï êëåéäß áíÞêåé óå åìÜò\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"ÄÅÍ åßíáé âÝâáéï üôé áõôü ôï êëåéäß áíÞêåé óôï Üôïìï ôï ïðïßï\n"
+"áíáöÝñåôå ôï user ID. ÅÜí *ðñáãìáôéêÜ* îÝñåôå ôé êÜíåôå, ìðïñåßôå\n"
+"íá áðáíôÞóåôå óôçí åðüìåíç åñþôçóç êáôáöáôéêÜ\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "×ñÞóç ïðùóäÞðïôå áõôïý ôïõ êëåéäéïý; "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ×ñÞóç êëåéäéïý ÷ùñßò åìðéóôïóýíç!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áõôü ôï êëåéäß ìðïñåß íá áíáêëçèåß (ëåßðåé ôï êëåéäß "
+"áíÜêëçóçò)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü ôï êëåéäß Ý÷åé áíáêëçèåß áðü ôïí ïñéóìÝíï áíáêëçôÞ!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü ôï êëåéäß Ý÷åé áíáêëçèåß áðü ôïí éäéïêôÞôç ôïõ!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Áõôü ìðïñåß íá óçìáßíåé üôé ç õðïãñáöÞ åßíáé ðëáóôïãñáößá.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü ôï õðïêëåéäß Ý÷åé áíáêëçèåß áðü ôïí éäéïêôÞôç ôïõ!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Óçìåßùóç: Áõôü ôï êëåéäß Ý÷åé áðåíåñãïðïéçèåß.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Óçìåßùóç: Áõôü ôï êëåéäß Ý÷åé ëÞîåé!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü ôï êëåéäß äåí Ý÷åé ðéóôïðïéçèåß ìå åìðéóôåýóéìç "
+"õðïãñáöÞ!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Äåí õðÜñ÷åé Ýíäåéîç üôé ç õðïãñáöÞ áíÞêåé óôïí éäéïêôÞôç.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ÄÅÍ åìðéóôåõüìáóôå áõôü ôï êëåéäß!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Ç õðïãñáöÞ ìÜëëïí åßíáé ðëáóôïãñáößá.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áõôü ôï êëåéäß äåí Ý÷åé ðéóôïðïéçèåß ìå õðïãñáöÝò\n"
+"áñêåôÞò åìðéóôïóýíçò!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Äåí åßíáé âÝâáéï üôé ç õðïãñáöÞ áíÞêåé óôïí éäéïêôÞôç.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ðáñáëåßöèçêå: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ðáñáëåßöèçêå: äçìüóéï êëåéäß åßíáé Þäç ðáñüí\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Äåí ïñßóôçêå Ýíá user ID. (÷ñçóéìïðïéåßóôå ôï \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"ÐëçêôñïëïãÞóôå ôï user ID. ÔÝëïò ìå ìéá Üäåéá ãñáììÞ: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Äåí õðÜñ÷åé áõôü ôï user ID.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr ""
+"ðáñáëåßöèçêå: äçìüóéï êëåéäß Ý÷åé Þäç ïñéóôåß óáí åî ïñéóìïý ðáñáëÞðôçò\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Ôï äçìüóéï êëåéäß Ý÷åé áðåíåñãïðïéçèåß.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "ðáñáëåßöèçêå: äçìüóéï êëåéäß Ý÷åé Þäç ïñéóôåß\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "Üãíùóôïò ðñïêáèïñéóìÝíïò ðáñáëÞðôçò `%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: ðáñáëåßöèçêå: ôï äçìüóéï êëåéäß Ý÷åé áðåíåñãïðïéçèåß.\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "êáììßá Ýãêõñç äéåýèõíóç\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "äåäïìÝíá äåí áðïèçêåýôçêáí. ÁðïèÞêåõóç ìå ôçí åðéëïãÞ \"--output\"\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "óöÜëìá êáôÜ ôç äçìéïõñãßá ôïõ `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "ÁðïêïììÝíç õðïãñáöÞ.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "ÅéóÜãåôå ôï üíïìá áñ÷åßïõ äåäïìÝíùí: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "áíÜãíùóç ôçò stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "äåí õðÜñ÷ïõí õðïãåãñáììÝíá äåäïìÝíá\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "áäõíáìßá ðñüóâáóçò õðïãåãñáììÝíùí äåäïìÝíùí `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "áíþíõìïò ðáñáëÞðôçò· äïêéìÞ ìõóôéêïý êëåéäéïý %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "åíôÜîåé, åßìáóôå ï áíþíõìïò ðáñáëÞðôçò.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "ðáëáéÜ êùäéêïðïßçóç ôïõ DEK äåí õðïóôçñßæåôáé\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "ï áëãüñéèìïò êñõðôïãñÜöçóçò %d%s åßíáé Üãíùóôïò Þ áðåíåñãïðïéçìÝíïò\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ï áëãüñéèìïò êñõðôïãñÜöçóçò %d äåí åßíáé óôéò åðéëïãÝò\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ôï ìõóôéêü êëåéäß %08lX Ýëçîå óôéò %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "ÓÇÌÅÉÙÓÇ: ôï êëåéäß Ý÷åé áíáêëçèåß"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet áðÝôõ÷å: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "êëåéäß %08lX: äåí õðÜñ÷åé áõôü ôï user ID\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Ðñïò áíÜêëçóç áðü:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Áõôü åßíáé Ýíá åõáßóèçôï êëåéäß áíÜêëçóçò)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Äçìéïõñãßá åíüò ðéóôïðïéçôéêïý áíÜêëçóçò ãéá áõôü ôï êëåéäß; "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Åîáíáãêáóìüò åîüäïõ óå èùñáêéóìÝíï ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet áðÝôõ÷å: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Ðéóôïðïéçôéêü áíÜêëçóçò äçìéïõñãÞèçêå.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "äå âñÝèçêáí êëåéäéÜ áíÜêëçóçò ãéá ôï `%s'\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "ôï ìõóôéêü êëåéäß `%s' äå âñÝèçêå: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "êáíÝíá áíôßóôé÷ï äçìüóéï êëåéäß: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "ôï äçìïóßï êëåéäß äåí ôáéñéÜæåé ìå ôï ìõóôéêü!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Äçìéïõñãßá åíüò ðéóôïðïéçôéêïý áíÜêëçóçò ãéá áõôü ôï êëåéäß; "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "Üãíùóôïò áëãüñéèìïò ðñïóôáóßáò\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "ÓÇÌÅÉÙÓÇ: Áõôü ôï êëåéäß äåí ðñïóôáôåýåôáé!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Ôï ðéóôïðïéçôéêü áíÜêëçóçò äçìéïõñãÞèçêå.\n"
+"\n"
+"Ðáñáêáëþ ìåôáêéíåßóôå ôï óå Ýíá ìÝóï ðïõ ìðïñåß íá êñõöôåß åýêïëá· åÜí ç\n"
+"Mallory áðïêôÞóåé ðñüóâáóç óå áõôü ôï ðéóôïðïéçôéêü ìðïñåß íá á÷ñçóôåýóåé\n"
+"ôï êëåéäß óáò. Åßíáé Ýîõðíï íá ôõðþóåôå áõôü ôï ðéóôïðïéçôéêü êáé íá ôï\n"
+"öõëÜîåôå ìáêñéÜ, ãéá ôçí ðåñßðôùóç ðïõ ôï ìÝóï äåí äéáâÜæåôå ðéá.  ÁëëÜ\n"
+"ðñïóï÷Þ ôï óýóôçìá åêôýðùóçò óôï ìç÷áíçìÜ óáò ìðïñåß íá áðïèçêåýóåé ôçí\n"
+"åêôýðùóç êáé íá ôçí êÜíåé äéáèÝóéìç óå Üëëïõò!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Ðáñáêáëþ åðéëÝîôå ôçí áéôßá ãéá ôçí áíÜêëçóç:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Áêýñùóç"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Ðéèáíþí íá èÝëåôå íá åðéëÝîåôå ôï %d åäþ)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "ÐëçêôñïëïãÞóôå ìéá ðñïáéñåôéêÞ ðåñéãñáöÞ· ôÝëïò ìå ìéá Üäåéá ãñáììÞ:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Áéôßá ãéá áíÜêëçóç: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Äåí äþèçêå ðåñéãñáöÞ)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Åßíáé áõôü åíôÜîåé; "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "ôìÞìáôá ôïõ ìõóôéêïý êëåéäéïý äåí åßíáé äéáèÝóéìá\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "äåí õðïóôçñßæåôáé ï áëãüñéèìïò ðñïóôáóßáò %d%s\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "äåí õðïóôçñßæåôáé ï áëãüñéèìïò ðñïóôáóßáò %d%s\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Ìç Ýãêõñç öñÜóç êëåéäß, äïêéìÜóôå îáíÜ"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Áíé÷íåýôçêå áäýíáìï êëåéäß - áëëÜîôå ôç öñÜóç êëåéäß\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"äçìéïõñãßá ôïõ ìç óõíåéóôüìåíïõ 16-bit checksum ãéá ôç ðñïóôáóßá ôïõ\n"
+"ìõóôéêïý êëåéäéïý\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "äçìéïõñãÞèçêå áäýíáìï êëåéäß - åðáíÜëçøç ðñïóðÜèåéáò\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"áäõíáìßá áðïöõãÞò áäýíáìïõ êëåéäéïý ãéá óõììåôñéêü êñõðôáëãüñéèìï, äïêéìÞ "
+"ãéá %d öïñÝò!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: óýãêñïõóç õðïãñáöÞò ðåñßëçøçò óôï ìÞíõìá\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï õðïãñÜöùí õðïêëåéäß %08lX äåí Ý÷åé êáô' áíôéðáñÜóôáóç "
+"ðéóôïðïéçèåß\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ôï õðïãñÜöùí õðïêëåéäß %08lX Ý÷åé Üêõñç êáô' áíôéðáñÜóôáóç "
+"ðéóôïðïßçóç\n"
+
+#: g10/sig-check.c:181
+#, fuzzy, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr ""
+"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôï íåüôåñï áðü ôçí õðïãñáöÞ\n"
+
+#: g10/sig-check.c:182
+#, fuzzy, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr ""
+"ôï äçìüóéï êëåéäß %08lX åßíáé %lu äåõôåñüëåðôá íåüôåñï áðü ôçí õðïãñáöÞ\n"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+"áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"ôï êëåéäß äçìéïõñãÞèçêå %lu äåõôåñüëåðôá óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+"áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ôï êëåéäß õðïãñáöÞò %08lX Ýëçîå óôéò %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "õðüèåóç êáêÞò õðïãñáöÞò áðü êëåéäß %08lX ëüãù Üãíùóôïõ êñßóéìïõ bit\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "êëåéäß %08lX: êáíÝíá õðïêëåéäß ãéá ôï ðáêÝôï áíÜêëçóçò õðïêëåéäéïý\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "êëåéäß %08lX: äåí õðÜñ÷åé õðïêëåéäß ãéá ôç äÝóìåõóç õðïêëåéäéïý\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"áäõíáìßá ôïðïèÝôçóçò äåäïìÝíùí óÞìáíóçò óå õðïãñáöÝò v3 (PGP 2.x óôõë)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"áäõíáìßá ôïðïèÝôçóçò äåäïìÝíùí óÞìáíóçò óå õðïãñáöÝò êëåéäéþí v3 (PGP 2.x "
+"óôõë)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá óôçí %%-áíÜðôõîç óçìåßùóçò (ðïëõ ìåãÜëç).\n"
+"               ×ñÞóç ìç áíåðôõãìÝíïõ.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "áäõíáìßá ôïðïèÝôçóçò URL ðïëéôéêÞò óå õðïãñáöÝò v3 (PGP 2.x óôõë)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"áäõíáìßá ôïðïèÝôçóçò URL ðïëéôéêÞò óå õðïãñáöÝò êëåéäéïý v3 (PGP 2.x óôõë)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá óôç %%-áíÜðôõîç ôïõ url ðïëéôéêÞò (ðïëõ ìåãÜëï).\n"
+"               ×ñÞóç ìç áíåðôõãìÝíïõ.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"ÐÑÏÅÉÄÏÐÏÉÇÓÇ: áäõíáìßá óôç %%-áíÜðôõîç ôïõ url ðïëéôéêÞò (ðïëõ ìåãÜëï).\n"
+"               ×ñÞóç ìç áíåðôõãìÝíïõ.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "áðÝôõ÷å ï Ýëåã÷ïò ôçò õðïãñáöÞò ðïõ äçìéïõñãÞèçêå: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s õðïãñáöÞ áðü: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"ìðïñåßôå íá õðïãñÜøåôå-áðïêïììÝíá ìå êëåéäéÜ ôýðïõ PGP 2.x ìüíï óå\n"
+"--pgp2 êáôÜóôáóç\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"ï åîáíáãêáóìüò ôïõ áëãüñéèìïõ ðåñßëçøçò %s (%d) ðáñáâéÜæåé ôéò\n"
+"ðñïåðéëïãÝò ôïõ ðáñáëÞðôç\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "õðïãñáöÞ:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"ìðïñåßôå íá õðïãñÜøåôå êáèáñÜ ìå êëåéäéÜ ôýðïõ PGP 2.x óå êáôÜóôáóç --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s êñõðôïãñÜöçóç èá ÷ñçóéìïðïéçèåß\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"ôï êëåéäß äåí Ý÷åé óçìåéùèåß óáí áíáóöáëÝò - äåí ìðïñåß íá ÷ñçóéìïðïéçèåß ìå "
+"øåýôéêç RNG!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "ðáñáëåßöèçêå `%s': áíôéãñÜöôçêå\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "ðáñáëåßöèçêå `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "ðáñáëåßöèçêå: ìõóôéêü êëåéäß Þäç ðáñþí\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"ðáñáëåßöèçêå `%s': áõôü åßíáé äçìéïõñãçìÝíï áðü PGP êëåéäß ElGamal êáé äåí "
+"åßíáé áóöáëÝò ãéá õðïãñáöÝò!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "åããñáöÞ trust %lu, ôýðïò %d: write áðÝôõ÷å: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Ëßóôá ôùí êáèïñéóìÝíùí ôéìþí åìðéóôïóýíçò, äçìéïõñãÞèçêå %s\n"
+"# (×ñÞóç ôïõ \"gpg --import-ownertrust\" ãéá åðáíáöïñÜ ôïõò)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "óöÜëìá êáôÜ ôçí áíÜãíùóç ôïõ `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "ç ãñáììÞ åßíáé ðïëý ìåãÜëç\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "óöÜëìá: ìç Ýãêõñï áðïôýðùìá\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "åéóáãùãÞ ôùí ôéìþí åìðéóôïóýíçò"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "óöÜëìá óôçí åýñåóç ôçò åããñáöÞò åìðéóôïóýíçò: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "óöÜëìá áíÜãíùóçò: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: sync áðÝôõ÷å: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: áðïôõ÷ßá lseek: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: áðïôõ÷ßá write (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "ðïëý ìåãÜëç óõíáëëáãÞ trustdb\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "áäõíáìßá êëåéóßìáôïò ôïõ `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: ï öÜêåëïò äåí õðÜñ÷åé!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "áäõíáìßá äçìéïõñãßáò ôïõ `%s': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "áäõíáìßá ðñüóâáóçò ôïõ `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: áðïôõ÷ßá äçìéïõñãßáò ìéáò åããñáöÞò Ýêäïóçò: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: äçìéïõñãÞèçêå ìç Ýãêõñç trustdb\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: äçìéïõñãÞèçêå ç trustdb\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "ÓÇÌÅÉÙÓÇ: ç trustdb äåí åßíáé åããñÜøéìç\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: ìç Ýãêõñç trustdb\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: áäõíáìßá äçìéïõñãßáò hashtable: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: óöÜëìá óôçí åíçìÝñùóç ôçò åããñáöÞò Ýêäïóçò: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: óöÜëìá óôçí áíÜãíùóç ôçò åããñáöÞò Ýêäïóçò: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: óöÜëìá óôçí åããñáöÞ ôçò åããñáöÞò Ýêäïóçò: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: áðÝôõ÷å lseek: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: read áðÝôõ÷å (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: äåí åßíáé trustdb áñ÷åßï\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: åããñáöÞ Ýêäïóçò ìå recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: ìç Ýãêõñç Ýêäïóç áñ÷åßïõ %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: óöÜëìá óôçí áíÜãíùóç ôçò åããñáöÞò free : %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: óöÜëìá óôçí åããñáöÞ ôçò åããñáöÞò dir : %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: áðïôõ÷ßá óôïí ìçäåíéóìü ìéáò åããñáöÞò: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: áðïôõ÷ßá óôçí ðñïóèÞêç ìéáò åããñáöÞò: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "ç trustdb åßíáé öèáñìÝíç - ÷ñçóéìïðïéåßóôå ôï \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "áäõíáìßá ÷åéñéóìïý ãñáììþí êåéìÝíïõ ìåãáëýôåñåò áðü %d ÷áñáêôÞñåò\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "ãñáììÞ åéóüäïõ ìåãáëýôåñç áðü %d ÷áñáêôÞñåò\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' äåí åßíáé Ýãêõñï ìáêñý keyID\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "êëåéäß %08lX: áðïäï÷Þ óáí êëåéäß ìå åìðéóôïóýíç\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "ôï êëåéäß %08lX õðÜñ÷åé ðÜíù áðü ìéá öïñÜ óôçí trustdb\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"êëåéäß %08lX: êáíÝíá äçìüóéï êëåéäß ãéá ôï êëåéäß ìå åìðéóôïóýíç - "
+"ðáñÜëåéøç\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "óçìåßùóç êëåéäéïý óáí áðüëõôçò åìðéóôïóýíçò.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "åããñáöÞ trust %lu, req ôýðïò %d: read áðÝôõ÷å: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "ç åããñáöÞ trust %lu äåí åßíáé ôïõ æçôïýìåíïõ ôýðïõ %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[áíáêëçìÝíï]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[ëçãìÝíï]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "Üãíùóôï"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "ðïôÝ     "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "äåí õðÜñ÷åé áíÜãêç ãéá Ýëåã÷ï ôçò trustdb\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "åðüìåíïò Ýëåã÷ïò ôçò trustdb èá ãßíåé óôéò %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "äåí õðÜñ÷åé áíÜãêç ãéá Ýëåã÷ï ôçò trustdb\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "äåí õðÜñ÷åé áíÜãêç ãéá Ýëåã÷ï ôçò trustdb\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "ôï äçìüóéï êëåéäß %08lX äåí âñÝèçêå: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "ðáñáêáëþ êÜíôå Ýíá --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "Ýëåã÷ïò ôçò trustdb\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d êëåéäéÜ åðåîåñãÜóôçêáí (%d ìåôñÞóåéò åããõñüôçôáò ðÝñáóáí)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "äå âñÝèçêáí áðüëõôá åìðéóôåýóéìá êëåéäéÜ\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+"äå âñÝèçêå ôï äçìüóéï êëåéäß ôïõ áðüëõôá åìðéóôåýóéìïõ êëåéäéïý %08lX\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "åããñáöÞ trust %lu, ôýðïò %d: write áðÝôõ÷å: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"áäõíáìßá åðáëÞèåõóçò ôçò õðïãñáöÞò.\n"
+"Ðáñáêáëþ ìçí îå÷íÜôå üôé ôï áñ÷åßï õðïãñáöÞò (.sig or .asc)\n"
+"ðñÝðåé íá åßíáé ôï ðñþôï áñ÷åßï óôç ãñáììÞ åíôïëþí.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "ãñáììÞ åéóüäïõ %u åßíáé ðïëý ìåãÜëç Þ ôçò ëåßðåé ôï LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "ãåíéêü óöÜëìá"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "Üãíùóôïò ôýðïò ðáêÝôïõ"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "Üãíùóôç Ýêäïóç"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "Üãíùóôïò áëãüñéèìïò äçìïóßïõ êëåéäéïý"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "Üãíùóôïò áëãïñéèìïò ðåñßëçøçò"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "êáêü äçìüóéï êëåéäß"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "êáêü ìõóôéêü êëåéäß"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "êáêÞ õðïãñáöÞ"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "óöÜëìá checksum"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "êáêÞ öñÜóç êëåéäß"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "äåí âñÝèçêå ôï äçìüóéï êëåéäß"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "Üãíùóôïò áëãüñéèìïò êñõðôïãñÜöçóçò"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "áäõíáìßá ðñüóâáóçò óôç êëåéäïèÞêç"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "ìç Ýãêõñï ðáêÝôï"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "ìç Ýãêõñç èùñÜêéóç"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "Üãíùóôç ôáõôüôçôá ÷ñÞóôç (user id)"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "ôï ìõóôéêü êëåéäß äåí åßíáé äéáèÝóéìï"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "÷ñÞóç ëÜèïò ìõóôéêïý êëåéäéïý"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "äåí õðïóôçñßæåôáé"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "êáêü êëåéäß"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "óöÜëìá áíÜãíùóçò áñ÷åßïõ"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "óöÜëìá åããñáöÞò áñ÷åßïõ"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "Üãíùóôïò áëãüñéèìïò óõìðßåóçò"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "óöÜëìá ðñüóâáóçò áñ÷åßïõ"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "óöÜëìá äçìéïõñãßáò áñ÷åßïõ"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "ìç Ýãêõñç öñÜóç êëåéäß"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "ìç õëïðïéçìÝíïò áëãüñéèìïò äçìïóßïõ êëåéäéïý"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "ìç õëïðïéçìÝíïò áëãüñéèìïò êñõðôïãñÜöçóçò"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "Üãíùóôç êëÜóç õðïãñáöÞò"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "óöÜëìá ôçò âÜóçò äåäïìÝíùí åìðéóôïóýíçò"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "êáêü MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "üñéï ðüñïõ"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "ìç Ýãêõñç êëåéäïèÞêç"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "êáêü ðéóôïðïéçôéêü"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "êáêïäéáôõðùìÝíç ôáõôüôçôá ÷ñÞóôç (user id)"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "óöÜëìá êëåéóßìáôïò áñ÷åßïõ"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "óöÜëìá ìåôïíïìáóßáò áñ÷åßïõ"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "óöÜëìá äéáãñáöÞò áñ÷åßïõ"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "ìç áíáìåíüìåíá äåäïìÝíá"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "óýãêñïõóç þñáò (timestamp)"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "ìç ÷ñçóéìïðïéÞóéìïò áëãüñéèìïò äçìïóßïõ êëåéäéïý"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "ôï áñ÷åßï õðÜñ÷åé"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "áäýíáìï êëåéäß"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "ìç Ýãêõñï üñéóìá"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "êáêü URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "ìç õðïóôçñéæüìåíï URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "óöÜëìá äéêôýïõ"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "ìç êñõðôïãñáöçìÝíï"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "ìç åðåîåñãáóìÝíï"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "ìç ÷ñçóéìïðïéÞóéìï äçìüóéï êëåéäß"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "ìç ÷ñçóéìïðïéÞóéìï ìõóôéêü êëåéäß"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "óöÜëìá äéáêïìéóôÞ êëåéäéþí"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Áêýñùóç"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "ìç êñõðôïãñáöçìÝíï"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "äåí õðÜñ÷ïõí õðïãåãñáììÝíá äåäïìÝíá\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... áõôü åßíáé bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "âñÞêáôå Ýíá bug ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "íáé|íáß"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "ü÷é|ï÷é"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "ôåñìáôéóìüò"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ÷ñÞóç ìç áóöáëïýò ìíÞìçò!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "äåßôå ôï http://www.gnupg.org/faq.html ãéá ðåñéóóüôåñåò ðëçñïöïñßåò\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "ç ëåéôïõñãßá äåí åßíáé äõíáôÞ ÷ùñßò áñ÷éêïðïéçìÝíç áóöáëÞ ìíÞìç\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(ßóùò ÷ñçóéìïðïéÞóáôå ëÜèïò ðñüãñáììá ãéá áõôÞ ôçí åñãáóßá)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "ï DSA áðáéôåß ôç ÷ñÞóç åíüò 160 bit áëãüñéèìïõ hash\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "äåßôå ôï http://www.gnupg.org/why-not-idea.html ãéá ðåñéóóüôåñåò "
+#~ "ðëçñïöïñßåò\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "Ýíá üíïìá óçìåßùóçò ìðïñåß íá ðåñéÝ÷åé ìüíï åêôõðþóéìïõò ÷áñáêôÞñåò êáé "
+#~ "êåíÜ êáé íá ëÞãåé ìå Ýíá '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "ôï üíïìá óçìåßùóçò ÷ñÞóôç ðñÝðåé íá ðåñéÝ÷åé ôï '@' ÷áñáêôÞñá\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "ôï üíïìá óçìåßùóçò ÷ñÞóôç ðñÝðåé íá ðåñéÝ÷åé ôï '@' ÷áñáêôÞñá\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "ç ôéìÞ óçìåßùóçò ðñÝðåé íá ìç ÷ñçóéìïðïéåß ÷áñáêôÞñåò control\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: âñÝèçêáí ìç Ýãêõñá äåäïìÝíá óçìåßùóçò\n"
+
+#~ msgid "not human readable"
+#~ msgstr "ìç áíáãíþóéìï"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "áíÜãíùóç åðéëïãþí áðü áñ÷åßï"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "áíÜãíùóç åðéëïãþí áðü áñ÷åßï"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [ëÞãåé: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr ""
+#~ "êëåéäß %08lX: ìç áíáìåíþìåíç êëÜóç õðïãñáöÞò (0x%02x) - ðáñáëåßöèçêå\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "áäõíáìßá åêôÝëåóçò ôïõ %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "ôï user ID \"%s\" Ý÷åé Þäç áíáêëçèåß\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "óöÜëìá óôç äçìéïõñãßá ôçò öñÜóçò êëåéäß: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "êáêÞ öñÜóç êëåéäß Üãíùóôïò áëãüñéèìïò êñõðôïãñÜöçóçò (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "áäõíáìßá ïñéóìïý ôïõ pid ôïõ ðåëÜôç óéá ôï agent\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "áäõíáìßá áíÜãíùóçò ôïõ FD áðü ôï äéáêïìéóôÞ ãéá ôïí agent\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "áäõíáìßá åããñáöÞò ôïõ FD áðü ôï äéáêïìéóôÞ ãéá ôïí agent\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "ðñüâëçìá åðéêïéíùíßáò ìå ôï gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "ç öñÜóç êëåéäß åßíáé ðïëý ìåãÜëç\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "ìç Ýãêõñç áðÜíôçóç áðü ôïí agent\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "ðñüâëçìá ìå ôïí agent: agent åðéóôñÝöåé 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "åðéëïãÞ äåõôåñåýïíôïò êëåéäéïý N"
+
+#~ msgid "list signatures"
+#~ msgstr "áðåéêüíéóç õðïãñáöþí"
+
+#~ msgid "sign the key"
+#~ msgstr "õðïãñáöÞ ôïõ êëåéäéïý"
+
+#~ msgid "add a secondary key"
+#~ msgstr "ðñïóèÞêç åíüò äåõôåñåýïíôïò êëåéäéïý"
+
+#~ msgid "delete signatures"
+#~ msgstr "äéáãñáöÞ õðïãñáöþí"
+
+#~ msgid "change the expire date"
+#~ msgstr "áëëáãÞ ôçò çìåñïìçíßáò ëÞîçò"
+
+#~ msgid "set preference list"
+#~ msgstr "ïñéóìüò áðåéêüíéóçò åðéëïãþí"
+
+#~ msgid "updated preferences"
+#~ msgstr "áíáùåùìÝíåò åðéëïãÝò"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Äåí õðÜñ÷åé äåõôåñåýïí êëåéäß ìå äåßêôç %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key user-id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key user-id"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "äçìéïõñãßá ìéáò ìç ðñïóáñôçìÝíçò õðïãñáöÞò"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "õðïãñáöÞ ôïõ êëåéäéïý ìç-áíáêáëÝóéìá"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "õðïãñáöÞ ôïõ êëåéäéïý ôïðéêÜ êáé ìç-áíáêáëÝóéìá"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "ãåíéêü óöÜëìá"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "ðñùôåýùí"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "óöÜëìá äéáêïìéóôÞ êëåéäéþí"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "ï áëãüñéèìïò ðåñßëçøçò `%s' åßíáé óå áõôÞ ôçí Ýêäïóç ãéá áíÜãíùóç ìüíï\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Óå äéáäéêáóßá äçìéïõñãßáò åíüò íÝïõ %s keypair.\n"
+#~ "              åëÜ÷éóôï ìÝãåèïò êëåéäéïý åßíáé  768 bits\n"
+#~ "              ðñïêáèïñéóìÝíï ìÝãåèïò êëåéäéïý åßíáé 1024 bits\n"
+#~ "    ìÝãéóôï ðñïôåéíüìåíï ìÝãåèïò êëåéäéïý åßíáé 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "Ï DSA åðéôñÝðåé ìüíï ìÝãåèïò êëåéäéïý áðü 512 Ýùò 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "ôï ìÝãåèïò êëåéäéïý åßíáé ðïëý ìéêñü, 1024 åßíáé ç åëÜ÷éóôç ôéìÞ ãéá "
+#~ "RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr ""
+#~ "ôï ìÝãåèïò êëåéäéïý åßíáé ðïëý ìéêñü, 768 åßíáé ç åëÜ÷éóôç åðéôñåðüìåíç "
+#~ "ôéìÞ.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr ""
+#~ "ôï ìÝãåèïò êëåéäéïý åßíáé ðïëý ìåãÜëï, %d åßíáé ç ìÝãéóôç ôéìÞ ðïõ "
+#~ "åðéôñÝðåôáé.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "ÌåãÝèç êëåéäéþí ìåãáëýôåñá ôïõ 2048 äåí óõíéóôþíôáé ãéáôß\n"
+#~ "ïé õðïëïãéóìïß åßíáé ÷ñïíïâüñïé!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Óßãïõñá èÝëåôå áõôü ôï ìÝãåèïò êëåéäéïý; "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "ÅíôÜîåé, áëëÜ íá Ý÷åôå õð'üøç üôé ç ïèüíç êáé ôï ðëçêôñïëüãéï åßíáé\n"
+#~ "åðßóçò ðïëý ôñùôÜ óå åðéèÝóåéò!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Ðåéñáìáôéêïß áëãüñéèìïé äåí ðñÝðåé íá ÷ñçóéìïðïéïýíôáé!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "ç ÷ñÞóç áõôïý ôïõ áëãüñéèìïõ êñõðôïãñÜöçóçò äåí óõíéóôÜôáé. "
+#~ "×ñçóéìïðïéÞóôå Ýíá ðéï óõíçèéóìÝíï!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "åããñáöÞ óôï  `%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "óõãíþìç, äåí ìðïñåß íá ãßíåé áõôü óå êáôÜóôáóç äÝóìçò (batchmode)\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "ôï êëåéäß '%s' äå âñÝèçêå: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "áäõíáìßá äçìéïõñãßáò ôïõ `%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "áäõíáìßá ðñüóâáóçò ôïõ áñ÷åßïõ: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                ãíùóôü óáí \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "êëåéäß %08lX: ôï êëåéäß Ý÷åé áíáêëçèåß!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "êëåéäß %08lX: ôï õðïêëåéäß Ý÷åé áíáêëçèåß!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: ôï êëåéäß Ý÷åé ëÞîåé\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: ÄÅÍ åìðéóôåõüìáóôå áõôü ôï êëåéäß\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (õðïãñáöÞ êáé êñõðôïãñÜöçóç)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (ãéá õðïãñáöÞ ìüíï)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (õðïãñáöÞ êáé êñõðôïãñÜöçóç)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (ãéá êñõðôïãñÜöçóç ìüíï)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (õðïãñáöÞ êáé êñõðôïãñÜöçóç)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: áäõíáìßá ðñüóâáóçò ôïõ: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: ÐÑÏÅÉÄÏÐÏÉÇÓÇ: Üäåéï áñ÷åßï\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "áäõíáìßá ðñüóâáóçò ôïõ %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = ¸÷ù ìåñéêÞ åìðéóôïóýíç\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = ¸÷ù ðëÞñç åìðéóôïóýíç\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "õðïãñÜöèçêå ôïðéêÜ ìå ôï êëåéäß óáò %08lX óôéò %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   õðïãñÜöèçêå áðü %08lX óôéò %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: áäõíáìßá ðñüóâáóçò: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: áäõíáìßá äçìéïõñãßáò êëåéäþìáôïò (lock)\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: áäõíáìßá äçìéïõñãßáò êëåéäþìáôïò (lock)\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: áäõíáìßá äçìéïõñãßáò: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: áäõíáìßá äçìéïõñãßáò êáôáëüãïõ: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "ÅÜí èÝëåôå íá ÷ñçóéìïðïéÞóåôå áõôü ôï áíáêëÞèåí êëåéäß, áðáíôÞóôå \"yes\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Áäõíáìßá ðñüóâáóçò ôçò öùôïãñáößáò \"%s\": %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "áäõíáìßá ðñüóâáóçò ôïõ áñ÷åßïõ: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "óöÜëìá: ëåßðåé ç áíù êáé êÜôù ôåëåßá\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "óöÜëìá: êáììéÜ ôéìÞ åìðéóôïóýíçò éäéïêôÞôç\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (êýñéï êëåéäß, ID %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! ôï êëåéäß áíáêëÞèçêå: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- âñÝèçêå ðáñáðïéçìÝíç áíÜêëçóç\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? ðñüâëçìá óôïí Ýëåã÷ï áíÜêëçóçò: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [ëÞãåé: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [ëÞãåé: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[áíáêëçìÝíï]"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "áäõíáìßá äçìéïõñãßáò ôïõ %s: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "ÐÑÏÅÉÄÏÐÏÉÇÓÇ: ðåñßëçøç `%s' äåí åßíáé ìÝñïò ôïõ OpenPGP. Åóåßò èá "
+#~ "êñßíåôå ãéá ôçí ÷ñÞóç ôçò!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[áñ÷åßá]|êñõðôïãñÜöçóç áñ÷åßùí"
+
+#~ msgid "store only"
+#~ msgstr "áðïèÞêåõóç ìüíï"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[áñ÷åßá]|áðïêñõðôïãñÜöçóç áñ÷åßùí"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "õðïãñáöÞ åíüò êëåéäéïý ìç-áíáêáëÝóéìá"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "õðïãñáöÞ åíüò êëåéäéïý ôïðéêÜ êáé ìç-áíáêáëÝóéìá"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "áðåéêüíéóç ìüíï ôçò áêïëïõèßáò ðáêÝôùí"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "åîáãùãÞ ôùí ôéìþí åìðéóôïóýíçò"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "áíáíÝùóç ôçò ðáñáìåëåéìÝíçò âÜóçò äåäïìÝíùí åìðéóôïóýíçò"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "äéüñèùóç ìéáò öèáñìÝíçò âÜóçò äåäïìÝíùí åìðéóôïóýíçò"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Áöáßñåóç-ÈùñÜêéóçò åíüò áñ÷åßïõ Þ stdin"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "ÐñïóèÞêç-ÈùñÜêéóçò åíüò áñ÷åßïõ Þ stdin"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|ÏÍÏÌÁ|÷ñÞóç ôïõ ÏÍÏÌÁôïò ùò ðñïêáèïñéóìÝíïõ ðáñáëÞðôç"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "÷ñÞóç ôïõ ðñïêáèïñéóìÝíïõ êëåéäéïý ùò ðñïêáèïñéóìÝíïõ ðáñáëÞðôç"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "ìç ÷ñÞóç ôåñìáôéêïý"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "åîáíáãêáóìüò ÷ñÞóçò v3 õðïãñáöþí"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "ü÷é åîáíáãêáóìüò ÷ñÞóçò v3 õðïãñáöþí"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "åîáíáãêáóìüò ÷ñÞóçò v4 õðïãñáöþí"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "ü÷é åîáíáãêáóìüò ÷ñÞóçò v4 õðïãñáöþí"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "÷ñÞóç ðÜíôïôå MDC ãéá êñõðôïãñÜöçóç"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "ðïôÝ ÷ñÞóç MDC ãéá êñõðôïãñÜöçóç"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "÷ñÞóç ôïõ gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "êáôÜóôáóç batch: íá ìç ãßíïíôáé åñùôÞóåéò"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "áðÜíôçóç íáé óôéò ðåñéóóüôåñåò åñùôÞóåéò"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "áðÜíôçóç ü÷é óôéò ðåñéóóüôåñåò åñùôÞóåéò"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "ðñïóèÞêç áõôïý ôïõ êëåéäéïý óôç ëßóôá ôùí êëåéäïèçêþí"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "ðñïóèÞêç áõôÞò ôçò ìõóôéêÞò êëåéäïèÞêçò óôç ëßóôá"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|ÏÍÏÌÁ|÷ñÞóç ÏÍÏÌÁôïò óáí ðñïêáèïñéóìÝíï ìõóôéêü êëåéäß"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|ÄÉÁÊÏÌÉÓÔÇÓ|÷ñÞóç áõôïý ôïõ äéáêïìéóôÞ êëåéäéþí ãéá áíáæÞôçóç"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|ÏÍÏÌÁ|êáèïñéóìüò ôïõ óåô ÷áñáêôÞñùí ôåñìáôéêïý óå ÏÍÏÌÁ"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[áñ÷åßï]|åããñáöÞ ôùí ðëçñïöïñéþí êáôÜóôáóçò óôï áñ÷åßï"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KEYID|áðüëõôç åìðéóôïóýíç óå áõôü ôï êëåéäß"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|ÁÑ×ÅÉÏ|öüñôùìá ôïõ áñèñþìáôïò åðÝêôáóçò ÁÑ×ÅÉÏ"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "åîïìïßùóç ôçò êáôÜóôáóçò ðïõ ðåñéãñÜöåôáé óôï RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "óõìðåñéöïñÜ üëùí ôùí åðéëïãþí ðáêÝôá,áëãüñéèìïé êáé ðåñßëçøç óå OPENPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "ïñéóìüò üëùí ôùí åðéëïãþí ðáêÝôá,áëãüñéèìïé,ðåñßëçøç óå PGP 2.x "
+#~ "óõìðåñéöïñÜ"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|÷ñÞóç ôçò êáôÜóôáóçò öñÜóçò êëåéäß N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|ONOMA|÷ñÞóç ôïõ áëãüñéèìïõ ðåñßëçøçò ìçíýìáôïò ÏÍÏÌÁ ãéá öñÜóåéò êëåéäéÜ"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|ÏÍÏÌÁ|÷ñÞóç áëãüñéèìïõ êñõðôïãñÜöçóçò ÏÍÏÌÁ ãéá öñÜóåéò êëåéäéÜ"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|ÏÍÏÌÁ|÷ñÞóç áëãüñéèìïõ êñõðôïãñÜöçóçò ÏÍÏÌÁ"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|ÏÍÏÌÁ|÷ñÞóç áëãüñéèìïõ ðåñßëçøçò ìçíýìáôïò ÏÍÏÌÁ "
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|÷ñÞóç áëãïñßèìïõ óõìðßåóçò N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "äéáãñáöÞ ôïõ ðåäßïõ keyid ôùí êñõðôïãñáöçìÝíùí ðáêÝôùí"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Áðåéêüíéóç ôùí Photo ID"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Ìç áðåéêüíéóç ôùí Photo ID"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Ïñéóìüò ôçò ãñáììÞò åíôïëþí ãéá áðåéêüíéóç ôùí Photo ID"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "ï áëãüñéèìïò óõìðßåóçò `%s' åßíáé óå áõôÞ ôçí Ýêäïóç ãéá áíÜãíùóç ìüíï\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "ï áëãüñéèìïò óõìðßåóçò ðñÝðåé íá åßíáé ìåôáîý %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Äåí åßíáé âÝâáéï üôé áõôü ôï êëåéäß áíÞêåé óôïí éäéïêôÞôç\n"
+#~ "áëëÜ åí ðÜóç ðåñéðôþóåé ãßíåôáé äåêôü\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "ç ðñïåðéëïãÞ %c%lu äåí åßíáé Ýãêõñç\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "êëåéäß %08lX: äåí åßíáé Ýíá rfc2440 êëåéäß - ðáñáëåßöèçêå\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "ÓÇÌÅÉÙÓÇ: åíôïðéóìüò ðñùôåýïíôïò êëåéäéïý Elgamal - ßóùò ðÜñåé ëßãï "
+#~ "÷ñüíï\n"
+#~ "          ãéá ôçí åéóáãùãÞ ôïõ\n"
+
+#~ msgid " (default)"
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "óöÜëìá óôç áðïóôïëÞ ðñïò ôï `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "åðéôõ÷ßá ôçò áðïóôïëÞò óôï `%s' (êáôÜóôáóç=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "áðïôõ÷ßá óôçí áðïóôïëÞ ðñïò ôï `%s': êáôÜóôáóç=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "áõôüò ï keyserver äåí õðïóôçñßæåé --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "áäõíáìßá áíáæÞôçóçò äéáêïìéóôÞ: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "êëåéäß %08lX: áõôü åßíáé Ýíá ðáñáãþìåíï áðü PGP ElGamal êëåéäß ôï ïðïßï\n"
+#~ "              ÄÅÍ åßíáé áóöáëåò ãéá õðïãñáöÝò!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "ôï êëåéäß %08lX äçìéïõñãÞèçêå %lu äåõôåñüëåðôï óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+#~ "áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "ôï êëåéäß %08lX äçìéïõñãÞèçêå %lu äåõôåñüëåðôá óôï ìÝëëïí (÷ñïíïäßíç Þ\n"
+#~ "áðëþò ðñüâëçìá óôï ñïëüé)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "ôï êëåéäß %08lX óçìåéþèçêå óáí áðüëõôçò åìðéóôïóýíçò.\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "õðïãñáöÞ áðü Elgamal õðïãñÜöùí êëåéäß %08lX óå %08lX ðáñáëÞöèåé\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "õðïãñáöÞ áðü %08lX óå Elgamal õðïãñÜöùí êëåéäß %08lX ðáñáëÞöèåé\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "Ýëåã÷ïò óå âÜèïò %d õðïãñáöèçêå=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "ÅðéëÝîôå ôïí áëãüñéèìï ðïõ èÝëåôå íá ÷ñçóéìïðïéÞóåôå.\n"
+#~ "\n"
+#~ "DSA (åðßóçò ãíùóôüò óáí DSS) åßíáé ï áëãüñéèìïò øçöéáêÞò õðïãñáöÞò\n"
+#~ "êáé ìðïñåß íá ÷ñçóéìïðïéçèåß ìüíï ãéá õðïãñáöÝò.  Åßíáé ï ðñïôåéíüìåíïò\n"
+#~ "áëãüñéèìïò åðåéäÞ ç åðáëÞèåõóç ôùí DSA õðïãñáöþí åßíáé ôá÷ýôåñç áðü\n"
+#~ "ôùí õðïãñáöþí ôýðïõ ElGamal.\n"
+#~ "\n"
+#~ "ElGamal åßíáé Ýíáò áëãüñéèìïò ãéá ÷ñÞóç êáé óå õðïãñáöÝò êáé ãéá êñõðôï-\n"
+#~ "ãñÜöçóç. Ôï OpenPGP îå÷ùñßæåé ôéò äýï \"ãåýóåéò\" áõôïý ôïõ áëãüñéèìïõ:\n"
+#~ "Ýíá êñõðôïãñÜöçóçò-ìüíï êáé Ýíá õðïãñáöÞò-êáé-êñõðôïãñÜöçóçò, óôçí\n"
+#~ "ðñáãìáôéêüôçôá åßíáé ï ßäéïò, áëëÜ êÜðïéïé ðáñÜìåôñïé ðñÝðåé íá "
+#~ "åðéëåãïýí\n"
+#~ "ìå Ýíá åéäéêü ôñüðï ãéá íá äçìéïõñãçèåß Ýíá áóöáëÝò êëåéäß ãéá "
+#~ "õðïãñáöÝò.\n"
+#~ "Áõôü ôï ðñüãñáììá ôï êÜíåé, áëëÜ óå Üëëåò OpenPGP õëïðïéÞóåéò äåí\n"
+#~ "åßíáé áðáñáßôçôï íá êáôáëáâáßíïõí áõôü ôï óõíäõáóìü (ãåýóç).\n"
+#~ "\n"
+#~ "Ôï ðñþôï (ðñùôåýïí) êëåéäß ðñÝðåé íá åßíáé ðÜíôïôå Ýíá êëåéäß éêáíü ãéá\n"
+#~ "õðïãñáöÞ. Áõôüò åßíáé ï ëüãïò ãéá ôïí ïðïßï ï êñõðôïãñÜöçóçò-ìüíï\n"
+#~ "êëåéäß ElGamal äåí åßíáé äéáèÝóéìï óå áõôü ôï ìåíïý."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Áí êáé áõôÜ ôá êëåéäéÜ ðåñéãñÜöïíôáé óôï RFC2440 äåí ðñïôåßíïíôáé\n"
+#~ "åðåéäÞ äåí õðïóôçñßæïíôáé áðü üëá ôá ðñïãñÜììáôá êáé ïé õðïãñáöÝò ðïõ\n"
+#~ "Ý÷ïõí äçìéïõñãçèåß áðü áõôÜ åßíáé ìåãÜëåò êáé ðïëý áñãÝò óôçí åðáëÞèåõóç."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu êëåéäéÜ Ý÷ïõí ìÝ÷ñé ôþñá åëåã÷èåß (%lu õðïãñáöÝò)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "êëåéäß çìéôåëÝò\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "êëåéäß %08lX çìéôåëÝò\n"
diff --git a/po/en@boldquot.gmo b/po/en@boldquot.gmo
new file mode 100644 (file)
index 0000000..c41fe5e
Binary files /dev/null and b/po/en@boldquot.gmo differ
diff --git a/po/en@boldquot.header b/po/en@boldquot.header
new file mode 100644 (file)
index 0000000..fedb6a0
--- /dev/null
@@ -0,0 +1,25 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
diff --git a/po/en@boldquot.po b/po/en@boldquot.po
new file mode 100644 (file)
index 0000000..4cbd0c8
--- /dev/null
@@ -0,0 +1,6219 @@
+# English translations for gnupg package.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnupg package.
+# Automatically generated, 2006.
+#
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+# This catalog furthermore displays the text between the quotation marks in
+# bold face, assuming the VT100/XTerm escape sequences.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.6\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2006-12-04 15:05+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "can't gen prime with pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "can't generate a prime with less than %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "no entropy gathering module detected\n"
+
+#: cipher/random.c:403
+#, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "can't lock ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:408
+#, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "waiting for lock on ‘\e[1m%s\e[0m’...\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "can't open ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "can't stat ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "‘\e[1m%s\e[0m’ is not a regular file - ignored\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "note: random_seed file is empty\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "WARNING: invalid size of random_seed file - not used\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "can't read ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "note: random_seed file not updated\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "can't create ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "can't write ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "can't close ‘\e[1m%s\e[0m’: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "WARNING: using insecure random number generator!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "failed to store the fingerprint: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "failed to store the creation date: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "reading public key failed: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "response does not contain the public key data\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "response does not contain the RSA modulus\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "response does not contain the RSA public exponent\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN callback returned error: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN for CHV%d is too short; minimum length is %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "verify CHV%d failed: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "access to admin commands is not configured\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "error retrieving CHV status from card\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "card is permanently locked!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr "%d Admin PIN attempts remaining before card is permanently locked\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Admin PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|New Admin PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|New PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "error getting new PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "error reading application data\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "error reading fingerprint DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "key already exists\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "existing key will be replaced\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "generating new key\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "creation timestamp missing\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "RSA modulus missing or not of size %d bits\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "RSA public exponent missing or larger than %d bits\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "RSA prime %s missing or not of size %d bits\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "failed to store the key: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "please wait while key is being generated ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "generating key failed\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "key generation completed (%d seconds)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "invalid structure of OpenPGP card (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "card does not support digest algorithm %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "signatures created so far: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Please enter the PIN%%0A[sigs done: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+"verification of Admin PIN is currently prohibited through this command\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "can't access %s - invalid OpenPGP card?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armor: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "invalid armor header: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "armor header: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "invalid clearsig header\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "nested clear text signatures\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "unexpected armor: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "invalid dash escaped line: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "invalid radix64 character %02X skipped\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "premature eof (no CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "premature eof (in CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "malformed CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC error; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "premature eof (in trailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "error in trailer line\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "no valid OpenPGP data found.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "invalid armor: line longer than %d characters\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP card not available: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "OpenPGP card no. %s detected\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "can't do this in batch mode\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Your selection? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[not set]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "male"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "female"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "unspecified"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "not forced"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "forced"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Error: Only plain ASCII is currently allowed.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Error: The “\e[1m<\e[0m” character may not be used.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Error: Double spaces are not allowed.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Cardholder's surname: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Cardholder's given name: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Error: Combined name too long (limit is %d characters).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL to retrieve public key: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Error: URL too long (limit is %d characters).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "error reading ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Login data (account name): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Error: Login data too long (limit is %d characters).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Private DO data: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Error: Private DO too long (limit is %d characters).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Language preferences: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Error: invalid length of preference string.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Error: invalid characters in preference string.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Sex ((M)ale, (F)emale or space): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Error: invalid response.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA fingerprint: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Error: invalid formatted fingerprint.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "key operation not possible: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "not an OpenPGP card"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "error getting current key info: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Replace existing key? (y/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Make off-card backup of encryption key? (Y/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Replace existing keys? (y/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = ‘\e[1m%s\e[0m’     Admin PIN = ‘\e[1m%s\e[0m’\n"
+"You should change them using the command --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Please select the type of key to generate:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Signature key\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Encryption key\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Authentication key\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Invalid selection.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Please select where to store the key:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "unknown key protection algorithm\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "secret parts of key are not available\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "secret key already stored on a card\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "quit this menu"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "show admin commands"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "show this help"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "list all available data"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "change card holder's name"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "change URL to retrieve key"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "fetch the key specified in the card URL"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "change the login name"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "change the language preferences"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "change card holder's sex"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "change a CA fingerprint"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "toggle the signature force PIN flag"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "generate new keys"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "menu to change or unblock the PIN"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "verify the PIN and list all data"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Command> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Admin-only command\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Admin commands are allowed\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Admin commands are not allowed\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Invalid command  (try “\e[1mhelp\e[0m”)\n"
+
+#: g10/cardglue.c:416
+msgid "card reader not available\n"
+msgstr "card reader not available\n"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "Please insert the card and hit return or enter ‘\e[1mc\e[0m’ to cancel: "
+
+#: g10/cardglue.c:446
+#, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "selecting openpgp failed: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Hit return when ready or enter ‘\e[1mc\e[0m’ to cancel: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Enter New Admin PIN: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Enter New PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Enter Admin PIN: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Enter PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Repeat this PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN not correctly repeated; try again"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "can't open ‘\e[1m%s\e[0m’\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output doesn't work for this command\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "key “\e[1m%s\e[0m” not found: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "error reading keyblock: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(unless you specify the key by fingerprint)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "can't do this in batch mode without “\e[1m--yes\e[0m”\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Delete this key from the keyring? (y/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "This is a secret key! - really delete? (y/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "deleting keyblock failed: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "ownertrust information cleared\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "there is a secret key for public key “\e[1m%s\e[0m”!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "use option “\e[1m--delete-secret-keys\e[0m” to delete it first.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "error creating passphrase: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "can't use a symmetric ESK packet due to the S2K mode\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "using cipher %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "‘\e[1m%s\e[0m’ already compressed\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "WARNING: ‘\e[1m%s\e[0m’ is an empty file\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "reading from ‘\e[1m%s\e[0m’\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "you may not use %s while in %s mode\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s encrypted for: “\e[1m%s\e[0m”\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s encrypted data\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "encrypted with unknown algorithm %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problem handling encrypted packet\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "no remote program execution supported\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "can't create directory ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"external program calls are disabled due to unsafe options file permissions\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"this platform requires temporary files when calling external programs\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "unable to execute program ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "unable to execute shell ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "system error while calling external program: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "unnatural exit of external program\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "unable to execute external program\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "unable to read external program response: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "WARNING: unable to remove tempfile (%s) ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "WARNING: unable to remove temp directory ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr "export signatures that are marked as local-only"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr "export attribute user IDs (generally photo IDs)"
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "export revocation keys marked as “\e[1msensitive\e[0m”"
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr "remove the passphrase from exported subkeys"
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr "remove unusable parts from key during export"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr "remove as much as possible from key during export"
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "exporting secret keys not allowed\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "key %s: not protected - skipped\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "key %s: PGP 2.x style key - skipped\n"
+
+#: g10/export.c:373
+#, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "key %s: key material on-card - skipped\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr "about to export an unprotected subkey\n"
+
+#: g10/export.c:544
+#, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "failed to unprotect the subkey: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "WARNING: secret key %s does not have a simple SK checksum\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "WARNING: nothing exported\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Commands:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[file]|make a signature"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[file]|make a clear text signature"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "make a detached signature"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "encrypt data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "encryption only with symmetric cipher"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "decrypt data (default)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verify a signature"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "list keys"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "list keys and signatures"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "list and check key signatures"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "list keys and fingerprints"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "list secret keys"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "generate a new key pair"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "remove keys from the public keyring"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "remove keys from the secret keyring"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "sign a key"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "sign a key locally"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "sign or edit a key"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "generate a revocation certificate"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "export keys"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "export keys to a key server"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "import keys from a key server"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "search for keys on a key server"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "update all keys from a keyserver"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "import/merge keys"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "print the card status"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "change data on a card"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "change a card's PIN"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "update the trust database"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [files]|print message digests"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Options:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "create ascii armored output"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAME|encrypt for NAME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "use this user-id to sign or decrypt"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|set compress level N (0 disables)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "use canonical text mode"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "use as output file"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "verbose"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "do not make any changes"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "prompt before overwriting"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "use strict OpenPGP behavior"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "generate PGP 2.x compatible messages"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Usage: gpg [options] [files] (-h for help)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Supported algorithms:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Pubkey: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cipher: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compression: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "usage: gpg [options] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "conflicting commands\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no = sign found in group definition ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "WARNING: unsafe ownership on homedir ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "WARNING: unsafe ownership on configuration file ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "WARNING: unsafe ownership on extension ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "WARNING: unsafe permissions on homedir ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "WARNING: unsafe permissions on configuration file ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "WARNING: unsafe permissions on extension ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "WARNING: unsafe enclosing directory ownership on homedir ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory ownership on configuration file ‘\e[1m%s\e"
+"[0m’\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory ownership on extension ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory permissions on homedir ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory permissions on configuration file ‘\e[1m%s\e"
+"[0m’\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory permissions on extension ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "unknown configuration item ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr "display photo IDs during key listings"
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr "show policy URLs during signature listings"
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr "show all notations during signature listings"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr "show IETF standard notations during signature listings"
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr "show user-supplied notations during signature listings"
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "show preferred keyserver URLs during signature listings"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr "show user ID validity during key listings"
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr "show revoked and expired user IDs in key listings"
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr "show revoked and expired subkeys in key listings"
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr "show the keyring name in key listings"
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr "show expiration dates during signature listings"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTE: old default options file ‘\e[1m%s\e[0m’ ignored\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTE: no default option file ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "option file ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "reading options from ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTE: %s is not for normal use!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "cipher extension ‘\e[1m%s\e[0m’ not loaded due to unsafe permissions\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "‘\e[1m%s\e[0m’ is not a valid signature expiration\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "‘\e[1m%s\e[0m’ is not a valid character set\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "could not parse keyserver URL\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: invalid keyserver options\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "invalid keyserver options\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: invalid import options\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "invalid import options\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: invalid export options\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "invalid export options\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: invalid list options\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "invalid list options\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr "display photo IDs during signature verification"
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr "show policy URLs during signature verification"
+
+#: g10/gpg.c:2572
+msgid "show all notations during signature verification"
+msgstr "show all notations during signature verification"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr "show IETF standard notations during signature verification"
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr "show user-supplied notations during signature verification"
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "show preferred keyserver URLs during signature verification"
+
+#: g10/gpg.c:2582
+msgid "show user ID validity during signature verification"
+msgstr "show user ID validity during signature verification"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr "show revoked and expired user IDs in signature verification"
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr "validate signatures with PKA data"
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr "elevate the trust of signatures with valid PKA data"
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: invalid verify options\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "invalid verify options\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "unable to set exec-path to %s\n"
+
+#: g10/gpg.c:2768
+#, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: invalid auto-key-locate list\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr "invalid auto-key-locate list\n"
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "WARNING: program may create a core file!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "WARNING: %s overrides %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s not allowed with %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s makes no sense with %s!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "NOTE: %s is not available in this version\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "will not run with insecure memory due to %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "you can only make detached or clear signatures while in --pgp2 mode\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "selected cipher algorithm is invalid\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "selected digest algorithm is invalid\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "selected compression algorithm is invalid\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "selected certification digest algorithm is invalid\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed must be greater than 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed must be greater than 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth must be in the range from 1 to 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "invalid min-cert-level; must be 1, 2, or 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTE: simple S2K mode (0) is strongly discouraged\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "invalid S2K mode; must be 0, 1 or 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "invalid default preferences\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "invalid personal cipher preferences\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "invalid personal digest preferences\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "invalid personal compress preferences\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s does not yet work with %s\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "you may not use cipher algorithm ‘\e[1m%s\e[0m’ while in %s mode\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "you may not use digest algorithm ‘\e[1m%s\e[0m’ while in %s mode\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "you may not use compression algorithm ‘\e[1m%s\e[0m’ while in %s mode\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "failed to initialize the TrustDB: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr "WARNING: recipients (-r) given without using public key encryption\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [filename]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [filename]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "symmetric encryption of ‘\e[1m%s\e[0m’ failed: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [filename]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [filename]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "you cannot use --symmetric --encrypt while in %s mode\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [filename]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [filename]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [filename]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [filename]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [filename]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [filename]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [commands]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [user-id] [keyring]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "keyserver send failed: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "keyserver receive failed: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "key export failed: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "keyserver search failed: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "keyserver refresh failed: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "dearmoring failed: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "enarmoring failed: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "invalid hash algorithm ‘\e[1m%s\e[0m’\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[filename]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Go ahead and type your message ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "the given certification policy URL is invalid\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "the given signature policy URL is invalid\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "the given preferred keyserver URL is invalid\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "too many entries in pk cache - disabled\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[User ID not found]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr "automatically retrieved ‘\e[1m%s\e[0m’ via %s\n"
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "no secret subkey for public subkey %s - ignoring\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "using subkey %s instead of primary key %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "key %s: secret key without public key - skipped\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "be somewhat more quiet"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "take the keys from this keyring"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "make timestamp conflicts only a warning"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|write status info to this FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Usage: gpgv [options] [files] (-h for help)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer “\e[1myes\e[0m” to set this key to\n"
+"ultimately trusted\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "If you want to use this untrusted key anyway, answer “\e[1myes\e[0m”."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"Enter the user ID of the addressee to whom you want to send the message."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Enter the size of the key"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Answer “\e[1myes\e[0m” or “\e[1mno\e[0m”"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Enter the name of the key holder"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "please enter an optional but highly suggested email address"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Please enter an optional comment"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+"Answer “\e[1myes\e[0m” (or just “\e[1my\e[0m”) if it is okay to generate the sub key."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"“\e[1m0\e[0m” means you make no particular claim as to how carefully you "
+"verified the\n"
+"    key.\n"
+"\n"
+"“\e[1m1\e[0m” means you believe the key is owned by the person who claims to own "
+"it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a “\e[1mpersona\e[0m” verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"“\e[1m2\e[0m” means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"“\e[1m3\e[0m” means you did extensive verification of the key.  For example, "
+"this could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what “\e[1mcasual\e[0m” and "
+"“\e[1mextensive\e[0m”\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer “\e[1m0\e[0m”."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Answer “\e[1myes\e[0m” if you want to sign ALL the user IDs"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Answer “\e[1myes\e[0m” if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Answer “\e[1myes\e[0m” if it is okay to delete the subkey"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Please enter the passhrase; this is a secret sentence \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Please repeat the last passphrase, so you are sure what you typed in."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Give the name of the file to which the signature applies"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Answer “\e[1myes\e[0m” if it is okay to overwrite the file"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  “\e[1mKey has been compromised\e[0m”\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  “\e[1mKey is superseded\e[0m”\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  “\e[1mKey is no longer used\e[0m”\n"
+"      Use this if you have retired this key.\n"
+"  “\e[1mUser ID is no longer valid\e[0m”\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "No help available"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "No help available for ‘\e[1m%s\e[0m’"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr "import signatures that are marked as local-only"
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr "repair damage from the pks keyserver during import"
+
+#: g10/import.c:100
+msgid "do not update the trustdb after import"
+msgstr "do not update the trustdb after import"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr "create a public key when importing a secret key"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr "only accept updates to existing keys"
+
+#: g10/import.c:106
+msgid "remove unusable parts from key after import"
+msgstr "remove unusable parts from key after import"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr "remove as much as possible from key after import"
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "skipping block of type %d\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu keys processed so far\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Total number processed: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      skipped new keys: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          w/o user IDs: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              imported: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             unchanged: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          new user IDs: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           new subkeys: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        new signatures: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   new key revocations: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      secret keys read: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  secret keys imported: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " secret keys unchanged: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "          not imported: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "    signatures cleaned: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      user IDs cleaned: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "WARNING: key %s contains preferences for unavailable\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+msgid "         algorithms on these user IDs:\n"
+msgstr "         algorithms on these user IDs:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         “\e[1m%s\e[0m”: preference for cipher algorithm %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         “\e[1m%s\e[0m”: preference for digest algorithm %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         “\e[1m%s\e[0m”: preference for compression algorithm %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "it is strongly suggested that you update your preferences and\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"re-distribute this key to avoid potential algorithm mismatch problems\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "you can update your preferences with: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "key %s: no user ID\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "key %s: PKS subkey corruption repaired\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "key %s: accepted non self-signed user ID “\e[1m%s\e[0m”\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "key %s: no valid user IDs\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "this may be caused by a missing self-signature\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "key %s: public key not found: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "key %s: new key - skipped\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "no writable keyring found: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "writing to ‘\e[1m%s\e[0m’\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "error writing keyring ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "key %s: public key “\e[1m%s\e[0m” imported\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "key %s: doesn't match our copy\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "key %s: can't locate original keyblock: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "key %s: can't read original keyblock: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "key %s: “\e[1m%s\e[0m” 1 new user ID\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d new user IDs\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "key %s: “\e[1m%s\e[0m” 1 new signature\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d new signatures\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "key %s: “\e[1m%s\e[0m” 1 new subkey\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d new subkeys\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d signature cleaned\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d signatures cleaned\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d user ID cleaned\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "key %s: “\e[1m%s\e[0m” %d user IDs cleaned\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "key %s: “\e[1m%s\e[0m” not changed\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "key %s: secret key with invalid cipher %d - skipped\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "importing secret keys not allowed\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "no default secret keyring: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "key %s: secret key imported\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "key %s: already in secret keyring\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "key %s: secret key not found: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "key %s: no public key - can't apply revocation certificate\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "key %s: invalid revocation certificate: %s - rejected\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "key %s: “\e[1m%s\e[0m” revocation certificate imported\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "key %s: no user ID for signature\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "key %s: unsupported public key algorithm on user ID “\e[1m%s\e[0m”\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "key %s: invalid self-signature on user ID “\e[1m%s\e[0m”\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "key %s: no subkey for key binding\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "key %s: unsupported public key algorithm\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "key %s: invalid subkey binding\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "key %s: removed multiple subkey binding\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "key %s: no subkey for key revocation\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "key %s: invalid subkey revocation\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "key %s: removed multiple subkey revocation\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "key %s: skipped user ID “\e[1m%s\e[0m”\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "key %s: skipped subkey\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "key %s: non exportable signature (class 0x%02X) - skipped\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "key %s: revocation certificate at wrong place - skipped\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "key %s: invalid revocation certificate: %s - skipped\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "key %s: subkey signature in wrong place - skipped\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "key %s: unexpected signature class (0x%02X) - skipped\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "key %s: duplicated user ID detected - merged\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "WARNING: key %s may be revoked: fetching revocation key %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "WARNING: key %s may be revoked: revocation key %s not present.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "key %s: “\e[1m%s\e[0m” revocation certificate added\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "key %s: direct key signature added\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "NOTE: a key's S/N does not match the card's one\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "NOTE: primary key is online and stored on card\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "NOTE: secondary key is online and stored on card\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "error creating keyring ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "keyring ‘\e[1m%s\e[0m’ created\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "keyblock resource ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "failed to rebuild keyring cache: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revocation]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[self-signature]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 bad signature\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d bad signatures\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 signature not checked due to a missing key\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d signatures not checked due to missing keys\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 signature not checked due to an error\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signatures not checked due to errors\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 user ID without valid self-signature detected\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d user IDs without valid self-signatures detected\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = I trust marginally\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = I trust fully\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "Please enter a domain to restrict this signature, or enter for none.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "User ID “\e[1m%s\e[0m” is revoked."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Are you sure you still want to sign it? (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Unable to sign.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "User ID “\e[1m%s\e[0m” is expired."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "User ID “\e[1m%s\e[0m” is not self-signed."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "User ID “\e[1m%s\e[0m” is signable.  "
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Sign it? (y/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"The self-signature on “\e[1m%s\e[0m”\n"
+"is a PGP 2.x-style signature.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Your current signature on “\e[1m%s\e[0m”\n"
+"has expired.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Do you want to issue a new signature to replace the expired one? (y/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Your current signature on “\e[1m%s\e[0m”\n"
+"is a local signature.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Do you want to promote it to a full exportable signature? (y/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "“\e[1m%s\e[0m” was already locally signed by key %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "“\e[1m%s\e[0m” was already signed by key %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Do you want to sign it again anyway? (y/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nothing to sign with key %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "This key has expired!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "This key is due to expire on %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Do you want your signature to expire at the same time? (Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "This would make the key unusable in PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter “\e[1m0\e"
+"[0m”.\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) I will not answer.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) I have not checked at all.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) I have done casual checking.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) I have done very careful checking.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Your selection? (enter ‘\e[1m?\e[0m’ for more information): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Are you sure that you want to sign this key with your\n"
+"key “\e[1m%s\e[0m” (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "This will be a self-signature.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "WARNING: the signature will not be marked as non-exportable.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "WARNING: the signature will not be marked as non-revocable.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "The signature will be marked as non-exportable.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "The signature will be marked as non-revocable.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "I have not checked this key at all.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "I have checked this key casually.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "I have checked this key very carefully.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Really sign? (y/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "signing failed: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr "Key has only stub or on-card key items - no passphrase to change.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "This key is not protected.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Secret parts of primary key are not available.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Secret parts of primary key are stored on-card.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Key is protected.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Can't edit this key: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "passphrase not correctly repeated; try again"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Do you really want to do this? (y/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "moving a key signature to the correct place\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "save and quit"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "show key fingerprint"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "list key and user IDs"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "select user ID N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "select subkey N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "check signatures"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "sign selected user IDs [* see below for related commands]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "sign selected user IDs locally"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "sign selected user IDs with a trust signature"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "sign selected user IDs with a non-revocable signature"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "add a user ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "add a photo ID"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "delete selected user IDs"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "add a subkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "add a key to a smartcard"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "move a key to a smartcard"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "move a backup key to a smartcard"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "delete selected subkeys"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "add a revocation key"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "delete signatures from the selected user IDs"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "change the expiration date for the key or selected subkeys"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "flag the selected user ID as primary"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "toggle between the secret and public key listings"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "list preferences (expert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "list preferences (verbose)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "set preference list for the selected user IDs"
+
+#: g10/keyedit.c:1428
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "set the preferred keyserver URL for the selected user IDs"
+
+#: g10/keyedit.c:1430
+msgid "set a notation for the selected user IDs"
+msgstr "set a notation for the selected user IDs"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "change the passphrase"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "change the ownertrust"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "revoke signatures on the selected user IDs"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "revoke selected user IDs"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "revoke key or selected subkeys"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "enable key"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "disable key"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "show selected photo IDs"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr "compact unusable user IDs and remove unusable signatures from key"
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr "compact unusable user IDs and remove all signatures from key"
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "error reading secret keyblock “\e[1m%s\e[0m”: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Secret key is available.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Need the secret key to do this.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Please use the command “\e[1mtoggle\e[0m” first.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* The ‘\e[1msign\e[0m’ command may be prefixed with an ‘\e[1ml\e[0m’ for local "
+"signatures (lsign),\n"
+"  a ‘\e[1mt\e[0m’ for trust signatures (tsign), an ‘\e[1mnr\e[0m’ for non-revocable "
+"signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Key is revoked."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Really sign all user IDs? (y/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Hint: Select the user IDs to sign\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Unknown signature type ‘\e[1m%s\e[0m’\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "This command is not allowed while in %s mode.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "You must select at least one user ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "You can't delete the last user ID!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Really remove all selected user IDs? (y/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Really remove this user ID? (y/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Really move the primary key? (y/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "You must select exactly one key.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "Command expects a filename argument\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Can't open ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Error reading backup key from ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "You must select at least one key.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Do you really want to delete the selected keys? (y/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Do you really want to delete this key? (y/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Really revoke all selected user IDs? (y/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Really revoke this user ID? (y/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Do you really want to revoke the entire key? (y/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Do you really want to revoke the selected subkeys? (y/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Do you really want to revoke this subkey? (y/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"Owner trust may not be set while using an user provided trust database\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Set preference list to:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Really update the preferences for the selected user IDs? (y/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Really update the preferences? (y/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Save changes? (y/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Quit without saving? (y/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "update failed: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "update secret failed: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Key not changed so no update needed.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Features: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Keyserver no-modify"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Preferred keyserver: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+msgid "Notations: "
+msgstr "Notations: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "There are no preferences on a PGP 2.x-style user ID.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "This key was revoked on %s by %s key %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "This key may be revoked by %s key %s"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(sensitive)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "created: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "revoked: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "expired: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "expires: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "usage: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "trust: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "validity: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "This key has been disabled"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "card-no: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "revoked"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "expired"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Are you sure you still want to add it? (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "You may not add a photo ID to a PGP2-style key.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Delete this good signature? (y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Delete this invalid signature? (y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Delete this unknown signature? (y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Really delete this self-signature? (y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Deleted %d signature.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Deleted %d signatures.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nothing deleted.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "invalid"
+
+#: g10/keyedit.c:3235
+#, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "User ID “\e[1m%s\e[0m” compacted: %s\n"
+
+#: g10/keyedit.c:3242
+#, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "User ID “\e[1m%s\e[0m”: %d signature removed\n"
+
+#: g10/keyedit.c:3243
+#, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "User ID “\e[1m%s\e[0m”: %d signatures removed\n"
+
+#: g10/keyedit.c:3251
+#, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "User ID “\e[1m%s\e[0m”: already minimized\n"
+
+#: g10/keyedit.c:3252
+#, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "User ID “\e[1m%s\e[0m”: already clean\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "You may not add a designated revoker to a PGP 2.x-style key.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Enter the user ID of the designated revoker: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "cannot appoint a PGP 2.x style key as a designated revoker\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "you cannot appoint a key as its own designated revoker\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "this key has already been designated as a revoker\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Please remove selections from the secret keys.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Please select at most one subkey.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Changing expiration time for a subkey.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Changing expiration time for the primary key.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "You can't change the expiration date of a v3 key\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "No corresponding signature in secret ring\n"
+
+#: g10/keyedit.c:3673
+#, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "signing subkey %s is already cross-certified\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr "subkey %s does not sign and so does not need to be cross-certified\n"
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Please select exactly one user ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "skipping v3 self-signature on user ID “\e[1m%s\e[0m”\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Enter your preferred keyserver URL: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Are you sure you want to replace it? (y/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Are you sure you want to delete it? (y/N) "
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr "Enter the notation: "
+
+#: g10/keyedit.c:4343
+msgid "Proceed? (y/N) "
+msgstr "Proceed? (y/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "No user ID with index %d\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "No user ID with hash %s\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "No subkey with index %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "user ID: “\e[1m%s\e[0m”\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "signed by your key %s on %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (non-exportable)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "This signature expired on %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Are you sure you still want to revoke it? (y/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Create a revocation certificate for this signature? (y/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "You have signed these user IDs on key %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (non-revocable)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "revoked by your key %s on %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "You are about to revoke these signatures:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Really create the revocation certificates? (y/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "no secret key\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "user ID “\e[1m%s\e[0m” is already revoked\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "WARNING: a user ID signature is dated %d seconds in the future\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Key %s is already revoked.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Subkey %s is already revoked.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preference ‘\e[1m%s\e[0m’ duplicated\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "too many cipher preferences\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "too many digest preferences\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "too many compression preferences\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "invalid item ‘\e[1m%s\e[0m’ in preference string\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "writing direct signature\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "writing self signature\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "writing key binding signature\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "keysize invalid; using %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "keysize rounded up to %u bits\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr "Certify"
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Encrypt"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Authenticate"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsEeAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Possible actions for a %s key: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Current allowed actions: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Toggle the sign capability\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Toggle the encrypt capability\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Toggle the authenticate capability\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Finished\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Please select what kind of key you want:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA and Elgamal (default)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (sign only)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (set your own capabilities)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Elgamal (encrypt only)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (sign only)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (encrypt only)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (set your own capabilities)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA keypair will have %u bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "%s keys may be between %u and %u bits long.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "What keysize do you want? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "%s keysizes must be in the range %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Requested keysize is %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "rounded up to %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Key is valid for? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Signature is valid for? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "invalid value\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Key does not expire at all\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Signature does not expire at all\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Key expires at %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Signature expires at %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Is this correct? (y/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    “\e[1mHeinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\e[0m”\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Real name: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Invalid character in name\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Name may not start with a digit\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Name must be at least 5 characters long\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Email address: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Not a valid email address\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comment: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Invalid character in comment\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "You are using the ‘\e[1m%s\e[0m’ character set.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"You selected this USER-ID:\n"
+"    “\e[1m%s\e[0m”\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Please don't put the email address into the real name or the comment\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Please correct the error first\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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 ""
+"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 “\e[1m--edit-key\e[0m”.\n"
+"\n"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"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"
+"generator a better chance to gain enough entropy.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Key generation canceled.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "writing public key to ‘\e[1m%s\e[0m’\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "writing secret key stub to ‘\e[1m%s\e[0m’\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "writing secret key to ‘\e[1m%s\e[0m’\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "no writable public keyring found: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "no writable secret keyring found: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "error writing public keyring ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "error writing secret keyring ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "public and secret key created and signed.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command “\e[1m--edit-key\e[0m” to generate a subkey for this purpose.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Key generation failed: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Really create? (y/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "storing key onto card failed: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "can't create backup file ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTE: backup of card key saved to ‘\e[1m%s\e[0m’\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "never     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Critical signature policy: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Signature policy: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Critical preferred keyserver: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Critical signature notation: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Signature notation: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Keyring"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Primary key fingerprint:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Subkey fingerprint:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Primary key fingerprint:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Subkey fingerprint:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "      Key fingerprint ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Card serial no. ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "renaming ‘\e[1m%s\e[0m’ to ‘\e[1m%s\e[0m’ failed: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "WARNING: 2 files with confidential information exists.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s is the unchanged one\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s is the new one\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Please fix this possible security flaw\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "caching keyring ‘\e[1m%s\e[0m’\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu keys cached so far (%lu signatures)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu keys cached (%lu signatures)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: keyring created\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr "include revoked keys in search results"
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr "include subkeys when searching by key ID"
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr "use temporary files to pass data to keyserver helpers"
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr "do not delete temporary files after using them"
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr "automatically retrieve keys when verifying signatures"
+
+#: g10/keyserver.c:72
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "honor the preferred keyserver URL set on the key"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr "honor the PKA record set on a key when retrieving keys"
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "WARNING: keyserver option ‘\e[1m%s\e[0m’ is not used on this platform\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "disabled"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Enter number(s), N)ext, or Q)uit > "
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "invalid keyserver protocol (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "key “\e[1m%s\e[0m” not found on keyserver\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "key not found on keyserver\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "requesting key %s from %s server %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "requesting key %s from %s\n"
+
+#: g10/keyserver.c:1173
+#, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "searching for names from %s server %s\n"
+
+#: g10/keyserver.c:1176
+#, c-format
+msgid "searching for names from %s\n"
+msgstr "searching for names from %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "sending key %s to %s server %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "sending key %s to %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "searching for “\e[1m%s\e[0m” from %s server %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "searching for “\e[1m%s\e[0m” from %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "no keyserver action!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "keyserver did not send VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "no keyserver known (use option --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "external keyserver calls are not supported in this build\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "no handler for keyserver scheme ‘\e[1m%s\e[0m’\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "action ‘\e[1m%s\e[0m’ not supported with keyserver scheme ‘\e[1m%s\e[0m’\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s does not support handler version %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "keyserver timed out\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "keyserver internal error\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "keyserver communications error: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "“\e[1m%s\e[0m” not a key ID: skipping\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "WARNING: unable to refresh key %s via %s: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "refreshing 1 key from %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "refreshing %d keys from %s\n"
+
+#: g10/keyserver.c:1955
+#, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "WARNING: unable to fetch URI %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "WARNING: unable to parse URI %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "weird size for an encrypted session key (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s encrypted session key\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "passphrase generated with unknown digest algorithm %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "public key is %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "public key encrypted data: good DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "encrypted with %u-bit %s key, ID %s, created %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      “\e[1m%s\e[0m”\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "encrypted with %s key, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "public key decryption failed: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "encrypted with %lu passphrases\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "encrypted with 1 passphrase\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "assuming %s encrypted data\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "decryption okay\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "WARNING: message was not integrity protected\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "WARNING: encrypted message has been manipulated!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "decryption failed: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTE: sender requested “\e[1mfor-your-eyes-only\e[0m”\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "original file name='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "standalone revocation - use “\e[1mgpg --import\e[0m” to apply\n"
+
+#: g10/mainproc.c:1165
+msgid "no signature found\n"
+msgstr "no signature found\n"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "signature verification suppressed\n"
+
+#: g10/mainproc.c:1508
+msgid "can't handle this ambiguous signature data\n"
+msgstr "can't handle this ambiguous signature data\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Signature made %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               using %s key %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signature made %s using %s key ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Key available at: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "BAD signature from “\e[1m%s\e[0m”"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Expired signature from “\e[1m%s\e[0m”"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Good signature from “\e[1m%s\e[0m”"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[uncertain]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                aka “\e[1m%s\e[0m”"
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Signature expired %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Signature expires %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s signature, digest algorithm %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binary"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "textmode"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "unknown"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Can't check signature: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "not a detached signature\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "standalone signature of class 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "old style (PGP 2.x) signature\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "invalid root packet detected in proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "can't disable core dumps: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "fstat of ‘\e[1m%s\e[0m’ failed in %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) failed in %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "WARNING: using experimental public key algorithm %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "WARNING: using experimental cipher algorithm %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "WARNING: using experimental digest algorithm %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "WARNING: digest algorithm %s is deprecated\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "the IDEA cipher plugin is not present\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, c-format
+msgid "please see %s for more information\n"
+msgstr "please see %s for more information\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: deprecated option “\e[1m%s\e[0m”\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "WARNING: “\e[1m%s\e[0m” is a deprecated option\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "please use “\e[1m%s%s\e[0m” instead\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "WARNING: “\e[1m%s\e[0m” is a deprecated command - do not use it\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Uncompressed"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "uncompressed|none"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "this message may not be usable by %s\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "ambiguous option ‘\e[1m%s\e[0m’\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "unknown option ‘\e[1m%s\e[0m’\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "File ‘\e[1m%s\e[0m’ exists. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Overwrite? (y/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: unknown suffix\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Enter new filename"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "writing to stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "assuming signed data in ‘\e[1m%s\e[0m’\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "new configuration file ‘\e[1m%s\e[0m’ created\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "WARNING: options in ‘\e[1m%s\e[0m’ are not yet active during this run\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "directory ‘\e[1m%s\e[0m’ created\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "can't handle public key algorithm %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "WARNING: potentially insecure symmetrically encrypted session key\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpacket of type %d has critical bit set\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent is not available in this session\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "malformed GPG_AGENT_INFO environment variable\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent protocol version %d is not supported\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "can't connect to ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problem with the agent - disabling agent use\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (main key ID %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"You need a passphrase to unlock the secret key for user:\n"
+"“\e[1m%.*s\e[0m”\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repeat passphrase\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Enter passphrase\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "cancelled by user\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "can't query passphrase in batch mode\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Enter passphrase: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"You need a passphrase to unlock the secret key for\n"
+"user: “\e[1m%s\e[0m”\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bit %s key, ID %s, created %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (subkey on main key ID %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repeat passphrase: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Enter JPEG filename for photo ID: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "unable to open JPEG file ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "This JPEG is really large (%d bytes) !\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Are you sure you want to use it? (y/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "‘\e[1m%s\e[0m’ is not a JPEG file\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Is this photo correct (y/N/q)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr "no photo viewer set\n"
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "unable to display photo ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "No reason specified"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Key is superseded"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Key has been compromised"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Key is no longer used"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "User ID is no longer valid"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "reason for revocation: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "revocation comment: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "No trust value assigned to:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  aka “\e[1m%s\e[0m”\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"How much do you trust that this key actually belongs to the named user?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = I don't know or won't say\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = I do NOT trust\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = I trust ultimately\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = back to the main menu\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = skip this key\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = quit\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Your decision? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Do you really want to set this key to ultimate trust? (y/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificates leading to an ultimately trusted key:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%s: There is no assurance this key belongs to the named user\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%s: There is limited assurance this key belongs to the named user\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "This key probably belongs to the named user\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "This key belongs to us\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Use this key anyway? (y/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "WARNING: Using untrusted key!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "WARNING: this key might be revoked (revocation key not present)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "WARNING: This key has been revoked by its designated revoker!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "WARNING: This key has been revoked by its owner!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         This could mean that the signature is forged.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "WARNING: This subkey has been revoked by its owner!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Note: This key has been disabled.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr "Note: Verified signer's address is ‘\e[1m%s\e[0m’\n"
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr "Note: Signer's address ‘\e[1m%s\e[0m’ does not match DNS entry\n"
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr "trustlevel adjusted to FULL due to valid PKA info\n"
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr "trustlevel adjusted to NEVER due to bad PKA info\n"
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Note: This key has expired!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "WARNING: This key is not certified with a trusted signature!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         There is no indication that the signature belongs to the owner.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "WARNING: We do NOT trust this key!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         The signature is probably a FORGERY.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         It is not certain that the signature belongs to the owner.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: skipped: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: skipped: public key already present\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "You did not specify a user ID. (you may use “\e[1m-r\e[0m”)\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Current recipients:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "No such user ID.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "skipped: public key already set as default recipient\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Public key is disabled.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "skipped: public key already set\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "unknown default recipient “\e[1m%s\e[0m”\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: skipped: public key is disabled\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "no valid addressees\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "data not saved; use option “\e[1m--output\e[0m” to save it\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "error creating ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Detached signature.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Please enter name of data file: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "reading stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "no signed data\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "can't open signed data ‘\e[1m%s\e[0m’\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonymous recipient; trying secret key %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "okay, we are the anonymous recipient.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "old encoding of the DEK is not supported\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "cipher algorithm %d%s is unknown or disabled\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "WARNING: cipher algorithm %s not found in recipient preferences\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTE: secret key %s expired at %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTE: key has been revoked"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet failed: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "key %s has no user IDs\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "To be revoked by:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(This is a sensitive revocation key)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Create a designated revocation certificate for this key? (y/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "ASCII armored output forced.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet failed: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Revocation certificate created.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "no revocation keys found for “\e[1m%s\e[0m”\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "secret key “\e[1m%s\e[0m” not found: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "no corresponding public key: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "public key does not match secret key!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Create a revocation certificate for this key? (y/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "unknown protection algorithm\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTE: This key is not protected!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Please select the reason for the revocation:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Cancel"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Probably you want to select %d here)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Enter an optional description; end it with an empty line:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Reason for revocation: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(No description given)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Is this okay? (y/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "secret key parts are not available\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "protection algorithm %d%s is not supported\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "protection digest %d is not supported\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Invalid passphrase; please try again"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "WARNING: Weak key detected - please change passphrase again.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "generating the deprecated 16-bit checksum for secret key protection\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "weak key created - retrying\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr "DSA requires the hash length to be a multiple of 8 bits\n"
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr "DSA key %s uses an unsafe (%u bit) hash\n"
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr "DSA key %s requires a %u bit or larger hash\n"
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "WARNING: signature digest conflict in message\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "WARNING: signing subkey %s is not cross-certified\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "WARNING: signing subkey %s has an invalid cross-certification\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "public key %s is %lu second newer than the signature\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "public key %s is %lu seconds newer than the signature\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTE: signature key %s expired %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "assuming bad signature from key %s due to an unknown critical bit\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "key %s: no subkey for subkey revocation signature\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "key %s: no subkey for subkey binding signature\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "can't put notation data into v3 (PGP 2.x style) signatures\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "checking created signature failed: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s signature from: “\e[1m%s\e[0m”\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "signing:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s encryption will be used\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "key is not flagged as insecure - can't use it with the faked RNG!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "skipped “\e[1m%s\e[0m”: duplicated\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "skipped “\e[1m%s\e[0m”: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "skipped: secret key already present\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"this is a PGP generated Elgamal key which is not secure for signatures!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "trust record %lu, type %d: write failed: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use “\e[1mgpg --import-ownertrust\e[0m” to restore them)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "error in ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "line too long"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "colon missing"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "invalid fingerprint"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "ownertrust value missing"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "error finding trust record in ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "read error in ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: sync failed: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: lseek failed: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: write failed (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "trustdb transaction too large\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "can't access ‘\e[1m%s\e[0m’: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: directory does not exist!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "can't create lock for ‘\e[1m%s\e[0m’\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "can't lock ‘\e[1m%s\e[0m’\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: failed to create version record: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: invalid trustdb created\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: trustdb created\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTE: trustdb not writable\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: invalid trustdb\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: failed to create hashtable: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: error updating version record: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: error reading version record: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: error writing version record: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek failed: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: read failed (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: not a trustdb file\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: version record with recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: invalid file version %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: error reading free record: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: error writing dir record: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: failed to zero a record: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: failed to append a record: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "the trustdb is corrupted; please run “\e[1mgpg --fix-trustdb\e[0m”.\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "can't handle text lines longer than %d characters\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "input line longer than %d characters\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "‘\e[1m%s\e[0m’ is not a valid long keyID\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "key %s: accepted as trusted key\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "key %s occurs more than once in the trustdb\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "key %s: no public key for trusted key - skipped\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "key %s marked as ultimately trusted\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "trust record %lu, req type %d: read failed: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "trust record %lu is not of requested type %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr "unable to use unknown trust model (%d) - assuming %s trust model\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "using %s trust model\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "10 translator see trustdb.c:uid_trust_string_fixed"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ revoked]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[ expired]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[ unknown]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[  undef ]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[marginal]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[  full  ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[ultimate]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "undefined"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "never"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "marginal"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "full"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "ultimate"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "no need for a trustdb check\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "next trustdb check due at %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "no need for a trustdb check with ‘\e[1m%s\e[0m’ trust model\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "no need for a trustdb update with ‘\e[1m%s\e[0m’ trust model\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "public key %s not found: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "please do a --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "checking the trustdb\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d keys processed (%d validity counts cleared)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "no ultimately trusted keys found\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "public key of ultimately trusted key %s not found\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "unable to update trustdb version record: write failed: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "input line %u too long or missing LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "general error"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "unknown packet type"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "unknown version"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "unknown pubkey algorithm"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "unknown digest algorithm"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "bad public key"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "bad secret key"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "bad signature"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "checksum error"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "bad passphrase"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "public key not found"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "unknown cipher algorithm"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "can't open the keyring"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "invalid packet"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "invalid armor"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "no such user id"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "secret key not available"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "wrong secret key used"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "not supported"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "bad key"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "file read error"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "file write error"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "unknown compress algorithm"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "file open error"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "file create error"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "invalid passphrase"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "unimplemented pubkey algorithm"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "unimplemented cipher algorithm"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "unknown signature class"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "trust database error"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "bad MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "resource limit"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "invalid keyring"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "bad certificate"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "malformed user id"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "file close error"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "file rename error"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "file delete error"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "unexpected data"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "timestamp conflict"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "unusable pubkey algorithm"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "file exists"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "weak key"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "invalid argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "bad URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "unsupported URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "network error"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "not encrypted"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "not processed"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "unusable public key"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "unusable secret key"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "keyserver error"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "canceled"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "no card"
+
+#: util/errors.c:111
+msgid "no data"
+msgstr "no data"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "ERROR: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "WARNING: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... this is a bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "you found a bug ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "yes"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okay|okay"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancel|cancel"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "WARNING: using insecure memory!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "please see http://www.gnupg.org/faq.html for more information\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operation is not possible without initialized secure memory\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(you may have used the wrong program for this task)\n"
diff --git a/po/en@quot.gmo b/po/en@quot.gmo
new file mode 100644 (file)
index 0000000..30384cb
Binary files /dev/null and b/po/en@quot.gmo differ
diff --git a/po/en@quot.header b/po/en@quot.header
new file mode 100644 (file)
index 0000000..a9647fc
--- /dev/null
@@ -0,0 +1,22 @@
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
diff --git a/po/en@quot.po b/po/en@quot.po
new file mode 100644 (file)
index 0000000..18870cb
--- /dev/null
@@ -0,0 +1,6204 @@
+# English translations for gnupg package.
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the gnupg package.
+# Automatically generated, 2006.
+#
+# All this catalog "translates" are quotation characters.
+# The msgids must be ASCII and therefore cannot contain real quotation
+# characters, only substitutes like grave accent (0x60), apostrophe (0x27)
+# and double quote (0x22). These substitutes look strange; see
+# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html
+#
+# This catalog translates grave accent (0x60) and apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019).
+# It also translates pairs of apostrophe (0x27) to
+# left single quotation mark (U+2018) and right single quotation mark (U+2019)
+# and pairs of quotation mark (0x22) to
+# left double quotation mark (U+201C) and right double quotation mark (U+201D).
+#
+# When output to an UTF-8 terminal, the quotation characters appear perfectly.
+# When output to an ISO-8859-1 terminal, the single quotation marks are
+# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to
+# grave/acute accent (by libiconv), and the double quotation marks are
+# transliterated to 0x22.
+# When output to an ASCII terminal, the single quotation marks are
+# transliterated to apostrophes, and the double quotation marks are
+# transliterated to 0x22.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.6\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2006-12-04 15:05+0100\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "can't gen prime with pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "can't generate a prime with less than %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "no entropy gathering module detected\n"
+
+#: cipher/random.c:403
+#, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "can't lock ‘%s’: %s\n"
+
+#: cipher/random.c:408
+#, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "waiting for lock on ‘%s’...\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "can't open ‘%s’: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "can't stat ‘%s’: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "‘%s’ is not a regular file - ignored\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "note: random_seed file is empty\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "WARNING: invalid size of random_seed file - not used\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "can't read ‘%s’: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "note: random_seed file not updated\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "can't create ‘%s’: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "can't write ‘%s’: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "can't close ‘%s’: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "WARNING: using insecure random number generator!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "failed to store the fingerprint: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "failed to store the creation date: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "reading public key failed: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "response does not contain the public key data\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "response does not contain the RSA modulus\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "response does not contain the RSA public exponent\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN callback returned error: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN for CHV%d is too short; minimum length is %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "verify CHV%d failed: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "access to admin commands is not configured\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "error retrieving CHV status from card\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "card is permanently locked!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr "%d Admin PIN attempts remaining before card is permanently locked\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Admin PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|New Admin PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|New PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "error getting new PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "error reading application data\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "error reading fingerprint DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "key already exists\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "existing key will be replaced\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "generating new key\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "creation timestamp missing\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "RSA modulus missing or not of size %d bits\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "RSA public exponent missing or larger than %d bits\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "RSA prime %s missing or not of size %d bits\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "failed to store the key: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "please wait while key is being generated ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "generating key failed\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "key generation completed (%d seconds)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "invalid structure of OpenPGP card (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "card does not support digest algorithm %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "signatures created so far: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Please enter the PIN%%0A[sigs done: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+"verification of Admin PIN is currently prohibited through this command\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "can't access %s - invalid OpenPGP card?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armor: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "invalid armor header: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "armor header: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "invalid clearsig header\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "nested clear text signatures\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "unexpected armor: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "invalid dash escaped line: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "invalid radix64 character %02X skipped\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "premature eof (no CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "premature eof (in CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "malformed CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC error; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "premature eof (in trailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "error in trailer line\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "no valid OpenPGP data found.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "invalid armor: line longer than %d characters\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP card not available: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "OpenPGP card no. %s detected\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "can't do this in batch mode\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Your selection? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[not set]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "male"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "female"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "unspecified"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "not forced"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "forced"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Error: Only plain ASCII is currently allowed.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Error: The “<” character may not be used.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Error: Double spaces are not allowed.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Cardholder's surname: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Cardholder's given name: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Error: Combined name too long (limit is %d characters).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL to retrieve public key: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Error: URL too long (limit is %d characters).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "error reading ‘%s’: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Login data (account name): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Error: Login data too long (limit is %d characters).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Private DO data: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Error: Private DO too long (limit is %d characters).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Language preferences: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Error: invalid length of preference string.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Error: invalid characters in preference string.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Sex ((M)ale, (F)emale or space): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Error: invalid response.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA fingerprint: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Error: invalid formatted fingerprint.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "key operation not possible: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "not an OpenPGP card"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "error getting current key info: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Replace existing key? (y/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Make off-card backup of encryption key? (Y/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Replace existing keys? (y/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = ‘%s’     Admin PIN = ‘%s’\n"
+"You should change them using the command --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Please select the type of key to generate:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Signature key\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Encryption key\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Authentication key\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Invalid selection.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Please select where to store the key:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "unknown key protection algorithm\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "secret parts of key are not available\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "secret key already stored on a card\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "quit this menu"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "show admin commands"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "show this help"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "list all available data"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "change card holder's name"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "change URL to retrieve key"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "fetch the key specified in the card URL"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "change the login name"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "change the language preferences"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "change card holder's sex"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "change a CA fingerprint"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "toggle the signature force PIN flag"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "generate new keys"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "menu to change or unblock the PIN"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "verify the PIN and list all data"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Command> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Admin-only command\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Admin commands are allowed\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Admin commands are not allowed\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Invalid command  (try “help”)\n"
+
+#: g10/cardglue.c:416
+msgid "card reader not available\n"
+msgstr "card reader not available\n"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "Please insert the card and hit return or enter ‘c’ to cancel: "
+
+#: g10/cardglue.c:446
+#, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "selecting openpgp failed: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Hit return when ready or enter ‘c’ to cancel: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Enter New Admin PIN: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Enter New PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Enter Admin PIN: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Enter PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Repeat this PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN not correctly repeated; try again"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "can't open ‘%s’\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output doesn't work for this command\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "key “%s” not found: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "error reading keyblock: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(unless you specify the key by fingerprint)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "can't do this in batch mode without “--yes”\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Delete this key from the keyring? (y/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "This is a secret key! - really delete? (y/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "deleting keyblock failed: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "ownertrust information cleared\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "there is a secret key for public key “%s”!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "use option “--delete-secret-keys” to delete it first.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "error creating passphrase: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "can't use a symmetric ESK packet due to the S2K mode\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "using cipher %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "‘%s’ already compressed\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "WARNING: ‘%s’ is an empty file\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "reading from ‘%s’\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "you may not use %s while in %s mode\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s encrypted for: “%s”\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s encrypted data\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "encrypted with unknown algorithm %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problem handling encrypted packet\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "no remote program execution supported\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "can't create directory ‘%s’: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"external program calls are disabled due to unsafe options file permissions\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"this platform requires temporary files when calling external programs\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "unable to execute program ‘%s’: %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "unable to execute shell ‘%s’: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "system error while calling external program: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "unnatural exit of external program\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "unable to execute external program\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "unable to read external program response: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "WARNING: unable to remove tempfile (%s) ‘%s’: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "WARNING: unable to remove temp directory ‘%s’: %s\n"
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr "export signatures that are marked as local-only"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr "export attribute user IDs (generally photo IDs)"
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "export revocation keys marked as “sensitive”"
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr "remove the passphrase from exported subkeys"
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr "remove unusable parts from key during export"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr "remove as much as possible from key during export"
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "exporting secret keys not allowed\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "key %s: not protected - skipped\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "key %s: PGP 2.x style key - skipped\n"
+
+#: g10/export.c:373
+#, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "key %s: key material on-card - skipped\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr "about to export an unprotected subkey\n"
+
+#: g10/export.c:544
+#, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "failed to unprotect the subkey: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "WARNING: secret key %s does not have a simple SK checksum\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "WARNING: nothing exported\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Commands:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[file]|make a signature"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[file]|make a clear text signature"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "make a detached signature"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "encrypt data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "encryption only with symmetric cipher"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "decrypt data (default)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verify a signature"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "list keys"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "list keys and signatures"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "list and check key signatures"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "list keys and fingerprints"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "list secret keys"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "generate a new key pair"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "remove keys from the public keyring"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "remove keys from the secret keyring"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "sign a key"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "sign a key locally"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "sign or edit a key"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "generate a revocation certificate"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "export keys"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "export keys to a key server"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "import keys from a key server"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "search for keys on a key server"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "update all keys from a keyserver"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "import/merge keys"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "print the card status"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "change data on a card"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "change a card's PIN"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "update the trust database"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [files]|print message digests"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Options:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "create ascii armored output"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAME|encrypt for NAME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "use this user-id to sign or decrypt"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|set compress level N (0 disables)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "use canonical text mode"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "use as output file"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "verbose"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "do not make any changes"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "prompt before overwriting"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "use strict OpenPGP behavior"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "generate PGP 2.x compatible messages"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Usage: gpg [options] [files] (-h for help)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Supported algorithms:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Pubkey: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cipher: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compression: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "usage: gpg [options] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "conflicting commands\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no = sign found in group definition ‘%s’\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "WARNING: unsafe ownership on homedir ‘%s’\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "WARNING: unsafe ownership on configuration file ‘%s’\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "WARNING: unsafe ownership on extension ‘%s’\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "WARNING: unsafe permissions on homedir ‘%s’\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "WARNING: unsafe permissions on configuration file ‘%s’\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "WARNING: unsafe permissions on extension ‘%s’\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "WARNING: unsafe enclosing directory ownership on homedir ‘%s’\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory ownership on configuration file ‘%s’\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "WARNING: unsafe enclosing directory ownership on extension ‘%s’\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "WARNING: unsafe enclosing directory permissions on homedir ‘%s’\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"WARNING: unsafe enclosing directory permissions on configuration file ‘%s’\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "WARNING: unsafe enclosing directory permissions on extension ‘%s’\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "unknown configuration item ‘%s’\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr "display photo IDs during key listings"
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr "show policy URLs during signature listings"
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr "show all notations during signature listings"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr "show IETF standard notations during signature listings"
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr "show user-supplied notations during signature listings"
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "show preferred keyserver URLs during signature listings"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr "show user ID validity during key listings"
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr "show revoked and expired user IDs in key listings"
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr "show revoked and expired subkeys in key listings"
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr "show the keyring name in key listings"
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr "show expiration dates during signature listings"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTE: old default options file ‘%s’ ignored\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTE: no default option file ‘%s’\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "option file ‘%s’: %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "reading options from ‘%s’\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTE: %s is not for normal use!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "cipher extension ‘%s’ not loaded due to unsafe permissions\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "‘%s’ is not a valid signature expiration\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "‘%s’ is not a valid character set\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "could not parse keyserver URL\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: invalid keyserver options\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "invalid keyserver options\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: invalid import options\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "invalid import options\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: invalid export options\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "invalid export options\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: invalid list options\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "invalid list options\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr "display photo IDs during signature verification"
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr "show policy URLs during signature verification"
+
+#: g10/gpg.c:2572
+msgid "show all notations during signature verification"
+msgstr "show all notations during signature verification"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr "show IETF standard notations during signature verification"
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr "show user-supplied notations during signature verification"
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "show preferred keyserver URLs during signature verification"
+
+#: g10/gpg.c:2582
+msgid "show user ID validity during signature verification"
+msgstr "show user ID validity during signature verification"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr "show revoked and expired user IDs in signature verification"
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr "validate signatures with PKA data"
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr "elevate the trust of signatures with valid PKA data"
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: invalid verify options\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "invalid verify options\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "unable to set exec-path to %s\n"
+
+#: g10/gpg.c:2768
+#, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: invalid auto-key-locate list\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr "invalid auto-key-locate list\n"
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "WARNING: program may create a core file!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "WARNING: %s overrides %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s not allowed with %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s makes no sense with %s!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "NOTE: %s is not available in this version\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "will not run with insecure memory due to %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "you can only make detached or clear signatures while in --pgp2 mode\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "selected cipher algorithm is invalid\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "selected digest algorithm is invalid\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "selected compression algorithm is invalid\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "selected certification digest algorithm is invalid\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed must be greater than 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed must be greater than 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth must be in the range from 1 to 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "invalid min-cert-level; must be 1, 2, or 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTE: simple S2K mode (0) is strongly discouraged\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "invalid S2K mode; must be 0, 1 or 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "invalid default preferences\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "invalid personal cipher preferences\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "invalid personal digest preferences\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "invalid personal compress preferences\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s does not yet work with %s\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "you may not use cipher algorithm ‘%s’ while in %s mode\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "you may not use digest algorithm ‘%s’ while in %s mode\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "you may not use compression algorithm ‘%s’ while in %s mode\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "failed to initialize the TrustDB: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr "WARNING: recipients (-r) given without using public key encryption\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [filename]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [filename]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "symmetric encryption of ‘%s’ failed: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [filename]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [filename]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "you cannot use --symmetric --encrypt while in %s mode\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [filename]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [filename]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [filename]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [filename]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [filename]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [filename]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [commands]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [user-id] [keyring]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "keyserver send failed: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "keyserver receive failed: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "key export failed: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "keyserver search failed: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "keyserver refresh failed: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "dearmoring failed: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "enarmoring failed: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "invalid hash algorithm ‘%s’\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[filename]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Go ahead and type your message ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "the given certification policy URL is invalid\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "the given signature policy URL is invalid\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "the given preferred keyserver URL is invalid\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "too many entries in pk cache - disabled\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[User ID not found]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr "automatically retrieved ‘%s’ via %s\n"
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "no secret subkey for public subkey %s - ignoring\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "using subkey %s instead of primary key %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "key %s: secret key without public key - skipped\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "be somewhat more quiet"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "take the keys from this keyring"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "make timestamp conflicts only a warning"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|write status info to this FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Usage: gpgv [options] [files] (-h for help)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer “yes” to set this key to\n"
+"ultimately trusted\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "If you want to use this untrusted key anyway, answer “yes”."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"Enter the user ID of the addressee to whom you want to send the message."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Enter the size of the key"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Answer “yes” or “no”"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Enter the name of the key holder"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "please enter an optional but highly suggested email address"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Please enter an optional comment"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Answer “yes” (or just “y”) if it is okay to generate the sub key."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"“0” means you make no particular claim as to how carefully you verified the\n"
+"    key.\n"
+"\n"
+"“1” means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a “persona” verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"“2” means you did casual verification of the key.  For example, this could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"“3” means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what “casual” and “extensive”\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer “0”."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Answer “yes” if you want to sign ALL the user IDs"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Answer “yes” if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Answer “yes” if it is okay to delete the subkey"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Please enter the passhrase; this is a secret sentence \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Please repeat the last passphrase, so you are sure what you typed in."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Give the name of the file to which the signature applies"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Answer “yes” if it is okay to overwrite the file"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  “Key has been compromised”\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  “Key is superseded”\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  “Key is no longer used”\n"
+"      Use this if you have retired this key.\n"
+"  “User ID is no longer valid”\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "No help available"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "No help available for ‘%s’"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr "import signatures that are marked as local-only"
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr "repair damage from the pks keyserver during import"
+
+#: g10/import.c:100
+msgid "do not update the trustdb after import"
+msgstr "do not update the trustdb after import"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr "create a public key when importing a secret key"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr "only accept updates to existing keys"
+
+#: g10/import.c:106
+msgid "remove unusable parts from key after import"
+msgstr "remove unusable parts from key after import"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr "remove as much as possible from key after import"
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "skipping block of type %d\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu keys processed so far\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Total number processed: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      skipped new keys: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          w/o user IDs: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              imported: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             unchanged: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          new user IDs: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           new subkeys: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        new signatures: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   new key revocations: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      secret keys read: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  secret keys imported: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " secret keys unchanged: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "          not imported: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "    signatures cleaned: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      user IDs cleaned: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "WARNING: key %s contains preferences for unavailable\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+msgid "         algorithms on these user IDs:\n"
+msgstr "         algorithms on these user IDs:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         “%s”: preference for cipher algorithm %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         “%s”: preference for digest algorithm %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         “%s”: preference for compression algorithm %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "it is strongly suggested that you update your preferences and\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"re-distribute this key to avoid potential algorithm mismatch problems\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "you can update your preferences with: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "key %s: no user ID\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "key %s: PKS subkey corruption repaired\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "key %s: accepted non self-signed user ID “%s”\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "key %s: no valid user IDs\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "this may be caused by a missing self-signature\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "key %s: public key not found: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "key %s: new key - skipped\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "no writable keyring found: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "writing to ‘%s’\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "error writing keyring ‘%s’: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "key %s: public key “%s” imported\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "key %s: doesn't match our copy\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "key %s: can't locate original keyblock: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "key %s: can't read original keyblock: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "key %s: “%s” 1 new user ID\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "key %s: “%s” %d new user IDs\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "key %s: “%s” 1 new signature\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "key %s: “%s” %d new signatures\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "key %s: “%s” 1 new subkey\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "key %s: “%s” %d new subkeys\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "key %s: “%s” %d signature cleaned\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "key %s: “%s” %d signatures cleaned\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "key %s: “%s” %d user ID cleaned\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "key %s: “%s” %d user IDs cleaned\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "key %s: “%s” not changed\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "key %s: secret key with invalid cipher %d - skipped\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "importing secret keys not allowed\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "no default secret keyring: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "key %s: secret key imported\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "key %s: already in secret keyring\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "key %s: secret key not found: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "key %s: no public key - can't apply revocation certificate\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "key %s: invalid revocation certificate: %s - rejected\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "key %s: “%s” revocation certificate imported\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "key %s: no user ID for signature\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "key %s: unsupported public key algorithm on user ID “%s”\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "key %s: invalid self-signature on user ID “%s”\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "key %s: no subkey for key binding\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "key %s: unsupported public key algorithm\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "key %s: invalid subkey binding\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "key %s: removed multiple subkey binding\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "key %s: no subkey for key revocation\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "key %s: invalid subkey revocation\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "key %s: removed multiple subkey revocation\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "key %s: skipped user ID “%s”\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "key %s: skipped subkey\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "key %s: non exportable signature (class 0x%02X) - skipped\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "key %s: revocation certificate at wrong place - skipped\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "key %s: invalid revocation certificate: %s - skipped\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "key %s: subkey signature in wrong place - skipped\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "key %s: unexpected signature class (0x%02X) - skipped\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "key %s: duplicated user ID detected - merged\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "WARNING: key %s may be revoked: fetching revocation key %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "WARNING: key %s may be revoked: revocation key %s not present.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "key %s: “%s” revocation certificate added\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "key %s: direct key signature added\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "NOTE: a key's S/N does not match the card's one\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "NOTE: primary key is online and stored on card\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "NOTE: secondary key is online and stored on card\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "error creating keyring ‘%s’: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "keyring ‘%s’ created\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "keyblock resource ‘%s’: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "failed to rebuild keyring cache: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revocation]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[self-signature]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 bad signature\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d bad signatures\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 signature not checked due to a missing key\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d signatures not checked due to missing keys\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 signature not checked due to an error\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signatures not checked due to errors\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 user ID without valid self-signature detected\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d user IDs without valid self-signatures detected\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = I trust marginally\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = I trust fully\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "Please enter a domain to restrict this signature, or enter for none.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "User ID “%s” is revoked."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Are you sure you still want to sign it? (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Unable to sign.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "User ID “%s” is expired."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "User ID “%s” is not self-signed."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "User ID “%s” is signable.  "
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Sign it? (y/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"The self-signature on “%s”\n"
+"is a PGP 2.x-style signature.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Your current signature on “%s”\n"
+"has expired.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Do you want to issue a new signature to replace the expired one? (y/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Your current signature on “%s”\n"
+"is a local signature.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Do you want to promote it to a full exportable signature? (y/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "“%s” was already locally signed by key %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "“%s” was already signed by key %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Do you want to sign it again anyway? (y/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nothing to sign with key %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "This key has expired!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "This key is due to expire on %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Do you want your signature to expire at the same time? (Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "This would make the key unusable in PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter “0”.\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) I will not answer.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) I have not checked at all.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) I have done casual checking.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) I have done very careful checking.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Your selection? (enter ‘?’ for more information): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Are you sure that you want to sign this key with your\n"
+"key “%s” (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "This will be a self-signature.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "WARNING: the signature will not be marked as non-exportable.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "WARNING: the signature will not be marked as non-revocable.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "The signature will be marked as non-exportable.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "The signature will be marked as non-revocable.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "I have not checked this key at all.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "I have checked this key casually.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "I have checked this key very carefully.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Really sign? (y/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "signing failed: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr "Key has only stub or on-card key items - no passphrase to change.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "This key is not protected.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Secret parts of primary key are not available.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Secret parts of primary key are stored on-card.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Key is protected.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Can't edit this key: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "passphrase not correctly repeated; try again"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Do you really want to do this? (y/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "moving a key signature to the correct place\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "save and quit"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "show key fingerprint"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "list key and user IDs"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "select user ID N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "select subkey N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "check signatures"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "sign selected user IDs [* see below for related commands]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "sign selected user IDs locally"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "sign selected user IDs with a trust signature"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "sign selected user IDs with a non-revocable signature"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "add a user ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "add a photo ID"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "delete selected user IDs"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "add a subkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "add a key to a smartcard"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "move a key to a smartcard"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "move a backup key to a smartcard"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "delete selected subkeys"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "add a revocation key"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "delete signatures from the selected user IDs"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "change the expiration date for the key or selected subkeys"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "flag the selected user ID as primary"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "toggle between the secret and public key listings"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "list preferences (expert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "list preferences (verbose)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "set preference list for the selected user IDs"
+
+#: g10/keyedit.c:1428
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "set the preferred keyserver URL for the selected user IDs"
+
+#: g10/keyedit.c:1430
+msgid "set a notation for the selected user IDs"
+msgstr "set a notation for the selected user IDs"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "change the passphrase"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "change the ownertrust"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "revoke signatures on the selected user IDs"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "revoke selected user IDs"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "revoke key or selected subkeys"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "enable key"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "disable key"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "show selected photo IDs"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr "compact unusable user IDs and remove unusable signatures from key"
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr "compact unusable user IDs and remove all signatures from key"
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "error reading secret keyblock “%s”: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Secret key is available.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Need the secret key to do this.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Please use the command “toggle” first.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* The ‘sign’ command may be prefixed with an ‘l’ for local signatures "
+"(lsign),\n"
+"  a ‘t’ for trust signatures (tsign), an ‘nr’ for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Key is revoked."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Really sign all user IDs? (y/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Hint: Select the user IDs to sign\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Unknown signature type ‘%s’\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "This command is not allowed while in %s mode.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "You must select at least one user ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "You can't delete the last user ID!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Really remove all selected user IDs? (y/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Really remove this user ID? (y/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Really move the primary key? (y/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "You must select exactly one key.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "Command expects a filename argument\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Can't open ‘%s’: %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Error reading backup key from ‘%s’: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "You must select at least one key.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Do you really want to delete the selected keys? (y/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Do you really want to delete this key? (y/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Really revoke all selected user IDs? (y/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Really revoke this user ID? (y/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Do you really want to revoke the entire key? (y/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Do you really want to revoke the selected subkeys? (y/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Do you really want to revoke this subkey? (y/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"Owner trust may not be set while using an user provided trust database\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Set preference list to:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Really update the preferences for the selected user IDs? (y/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Really update the preferences? (y/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Save changes? (y/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Quit without saving? (y/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "update failed: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "update secret failed: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Key not changed so no update needed.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Features: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Keyserver no-modify"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Preferred keyserver: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+msgid "Notations: "
+msgstr "Notations: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "There are no preferences on a PGP 2.x-style user ID.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "This key was revoked on %s by %s key %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "This key may be revoked by %s key %s"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(sensitive)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "created: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "revoked: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "expired: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "expires: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "usage: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "trust: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "validity: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "This key has been disabled"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "card-no: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "revoked"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "expired"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Are you sure you still want to add it? (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "You may not add a photo ID to a PGP2-style key.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Delete this good signature? (y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Delete this invalid signature? (y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Delete this unknown signature? (y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Really delete this self-signature? (y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Deleted %d signature.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Deleted %d signatures.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nothing deleted.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "invalid"
+
+#: g10/keyedit.c:3235
+#, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "User ID “%s” compacted: %s\n"
+
+#: g10/keyedit.c:3242
+#, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "User ID “%s”: %d signature removed\n"
+
+#: g10/keyedit.c:3243
+#, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "User ID “%s”: %d signatures removed\n"
+
+#: g10/keyedit.c:3251
+#, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "User ID “%s”: already minimized\n"
+
+#: g10/keyedit.c:3252
+#, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "User ID “%s”: already clean\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "You may not add a designated revoker to a PGP 2.x-style key.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Enter the user ID of the designated revoker: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "cannot appoint a PGP 2.x style key as a designated revoker\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "you cannot appoint a key as its own designated revoker\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "this key has already been designated as a revoker\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Please remove selections from the secret keys.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Please select at most one subkey.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Changing expiration time for a subkey.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Changing expiration time for the primary key.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "You can't change the expiration date of a v3 key\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "No corresponding signature in secret ring\n"
+
+#: g10/keyedit.c:3673
+#, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "signing subkey %s is already cross-certified\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr "subkey %s does not sign and so does not need to be cross-certified\n"
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Please select exactly one user ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "skipping v3 self-signature on user ID “%s”\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Enter your preferred keyserver URL: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Are you sure you want to replace it? (y/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Are you sure you want to delete it? (y/N) "
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr "Enter the notation: "
+
+#: g10/keyedit.c:4343
+msgid "Proceed? (y/N) "
+msgstr "Proceed? (y/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "No user ID with index %d\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "No user ID with hash %s\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "No subkey with index %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "user ID: “%s”\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "signed by your key %s on %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (non-exportable)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "This signature expired on %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Are you sure you still want to revoke it? (y/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Create a revocation certificate for this signature? (y/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "You have signed these user IDs on key %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (non-revocable)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "revoked by your key %s on %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "You are about to revoke these signatures:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Really create the revocation certificates? (y/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "no secret key\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "user ID “%s” is already revoked\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "WARNING: a user ID signature is dated %d seconds in the future\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Key %s is already revoked.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Subkey %s is already revoked.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preference ‘%s’ duplicated\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "too many cipher preferences\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "too many digest preferences\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "too many compression preferences\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "invalid item ‘%s’ in preference string\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "writing direct signature\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "writing self signature\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "writing key binding signature\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "keysize invalid; using %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "keysize rounded up to %u bits\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr "Certify"
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Encrypt"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Authenticate"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsEeAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Possible actions for a %s key: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Current allowed actions: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Toggle the sign capability\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Toggle the encrypt capability\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Toggle the authenticate capability\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Finished\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Please select what kind of key you want:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA and Elgamal (default)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (sign only)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (set your own capabilities)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Elgamal (encrypt only)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (sign only)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (encrypt only)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (set your own capabilities)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA keypair will have %u bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "%s keys may be between %u and %u bits long.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "What keysize do you want? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "%s keysizes must be in the range %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Requested keysize is %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "rounded up to %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Key is valid for? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Signature is valid for? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "invalid value\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Key does not expire at all\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Signature does not expire at all\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Key expires at %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Signature expires at %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Is this correct? (y/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    “Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Real name: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Invalid character in name\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Name may not start with a digit\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Name must be at least 5 characters long\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Email address: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Not a valid email address\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comment: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Invalid character in comment\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "You are using the ‘%s’ character set.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"You selected this USER-ID:\n"
+"    “%s”\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Please don't put the email address into the real name or the comment\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Please correct the error first\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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 ""
+"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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"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"
+"generator a better chance to gain enough entropy.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Key generation canceled.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "writing public key to ‘%s’\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "writing secret key stub to ‘%s’\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "writing secret key to ‘%s’\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "no writable public keyring found: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "no writable secret keyring found: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "error writing public keyring ‘%s’: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "error writing secret keyring ‘%s’: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "public and secret key created and signed.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command “--edit-key” to generate a subkey for this purpose.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Key generation failed: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Really create? (y/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "storing key onto card failed: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "can't create backup file ‘%s’: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTE: backup of card key saved to ‘%s’\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "never     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Critical signature policy: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Signature policy: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Critical preferred keyserver: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Critical signature notation: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Signature notation: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Keyring"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Primary key fingerprint:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Subkey fingerprint:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Primary key fingerprint:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Subkey fingerprint:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "      Key fingerprint ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Card serial no. ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "renaming ‘%s’ to ‘%s’ failed: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "WARNING: 2 files with confidential information exists.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s is the unchanged one\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s is the new one\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Please fix this possible security flaw\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "caching keyring ‘%s’\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu keys cached so far (%lu signatures)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu keys cached (%lu signatures)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: keyring created\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr "include revoked keys in search results"
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr "include subkeys when searching by key ID"
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr "use temporary files to pass data to keyserver helpers"
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr "do not delete temporary files after using them"
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr "automatically retrieve keys when verifying signatures"
+
+#: g10/keyserver.c:72
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "honor the preferred keyserver URL set on the key"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr "honor the PKA record set on a key when retrieving keys"
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "WARNING: keyserver option ‘%s’ is not used on this platform\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "disabled"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Enter number(s), N)ext, or Q)uit > "
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "invalid keyserver protocol (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "key “%s” not found on keyserver\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "key not found on keyserver\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "requesting key %s from %s server %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "requesting key %s from %s\n"
+
+#: g10/keyserver.c:1173
+#, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "searching for names from %s server %s\n"
+
+#: g10/keyserver.c:1176
+#, c-format
+msgid "searching for names from %s\n"
+msgstr "searching for names from %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "sending key %s to %s server %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "sending key %s to %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "searching for “%s” from %s server %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "searching for “%s” from %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "no keyserver action!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "keyserver did not send VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "no keyserver known (use option --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "external keyserver calls are not supported in this build\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "no handler for keyserver scheme ‘%s’\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "action ‘%s’ not supported with keyserver scheme ‘%s’\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s does not support handler version %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "keyserver timed out\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "keyserver internal error\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "keyserver communications error: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "“%s” not a key ID: skipping\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "WARNING: unable to refresh key %s via %s: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "refreshing 1 key from %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "refreshing %d keys from %s\n"
+
+#: g10/keyserver.c:1955
+#, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "WARNING: unable to fetch URI %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "WARNING: unable to parse URI %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "weird size for an encrypted session key (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s encrypted session key\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "passphrase generated with unknown digest algorithm %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "public key is %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "public key encrypted data: good DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "encrypted with %u-bit %s key, ID %s, created %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      “%s”\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "encrypted with %s key, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "public key decryption failed: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "encrypted with %lu passphrases\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "encrypted with 1 passphrase\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "assuming %s encrypted data\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "decryption okay\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "WARNING: message was not integrity protected\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "WARNING: encrypted message has been manipulated!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "decryption failed: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTE: sender requested “for-your-eyes-only”\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "original file name='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "standalone revocation - use “gpg --import” to apply\n"
+
+#: g10/mainproc.c:1165
+msgid "no signature found\n"
+msgstr "no signature found\n"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "signature verification suppressed\n"
+
+#: g10/mainproc.c:1508
+msgid "can't handle this ambiguous signature data\n"
+msgstr "can't handle this ambiguous signature data\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Signature made %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               using %s key %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signature made %s using %s key ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Key available at: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "BAD signature from “%s”"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Expired signature from “%s”"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Good signature from “%s”"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[uncertain]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                aka “%s”"
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Signature expired %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Signature expires %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s signature, digest algorithm %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binary"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "textmode"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "unknown"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Can't check signature: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "not a detached signature\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "standalone signature of class 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "old style (PGP 2.x) signature\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "invalid root packet detected in proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "can't disable core dumps: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "fstat of ‘%s’ failed in %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) failed in %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "WARNING: using experimental public key algorithm %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "WARNING: using experimental cipher algorithm %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "WARNING: using experimental digest algorithm %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "WARNING: digest algorithm %s is deprecated\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "the IDEA cipher plugin is not present\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, c-format
+msgid "please see %s for more information\n"
+msgstr "please see %s for more information\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: deprecated option “%s”\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "WARNING: “%s” is a deprecated option\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "please use “%s%s” instead\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "WARNING: “%s” is a deprecated command - do not use it\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Uncompressed"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "uncompressed|none"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "this message may not be usable by %s\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "ambiguous option ‘%s’\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "unknown option ‘%s’\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "File ‘%s’ exists. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Overwrite? (y/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: unknown suffix\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Enter new filename"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "writing to stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "assuming signed data in ‘%s’\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "new configuration file ‘%s’ created\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "WARNING: options in ‘%s’ are not yet active during this run\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "directory ‘%s’ created\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "can't handle public key algorithm %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "WARNING: potentially insecure symmetrically encrypted session key\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpacket of type %d has critical bit set\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent is not available in this session\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "malformed GPG_AGENT_INFO environment variable\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent protocol version %d is not supported\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "can't connect to ‘%s’: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problem with the agent - disabling agent use\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (main key ID %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"You need a passphrase to unlock the secret key for user:\n"
+"“%.*s”\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repeat passphrase\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Enter passphrase\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "cancelled by user\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "can't query passphrase in batch mode\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Enter passphrase: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"You need a passphrase to unlock the secret key for\n"
+"user: “%s”\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bit %s key, ID %s, created %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (subkey on main key ID %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repeat passphrase: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Enter JPEG filename for photo ID: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "unable to open JPEG file ‘%s’: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "This JPEG is really large (%d bytes) !\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Are you sure you want to use it? (y/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "‘%s’ is not a JPEG file\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Is this photo correct (y/N/q)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr "no photo viewer set\n"
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "unable to display photo ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "No reason specified"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Key is superseded"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Key has been compromised"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Key is no longer used"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "User ID is no longer valid"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "reason for revocation: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "revocation comment: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "No trust value assigned to:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  aka “%s”\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"How much do you trust that this key actually belongs to the named user?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = I don't know or won't say\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = I do NOT trust\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = I trust ultimately\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = back to the main menu\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = skip this key\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = quit\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Your decision? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Do you really want to set this key to ultimate trust? (y/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificates leading to an ultimately trusted key:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%s: There is no assurance this key belongs to the named user\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%s: There is limited assurance this key belongs to the named user\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "This key probably belongs to the named user\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "This key belongs to us\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Use this key anyway? (y/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "WARNING: Using untrusted key!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "WARNING: this key might be revoked (revocation key not present)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "WARNING: This key has been revoked by its designated revoker!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "WARNING: This key has been revoked by its owner!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         This could mean that the signature is forged.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "WARNING: This subkey has been revoked by its owner!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Note: This key has been disabled.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr "Note: Verified signer's address is ‘%s’\n"
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr "Note: Signer's address ‘%s’ does not match DNS entry\n"
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr "trustlevel adjusted to FULL due to valid PKA info\n"
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr "trustlevel adjusted to NEVER due to bad PKA info\n"
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Note: This key has expired!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "WARNING: This key is not certified with a trusted signature!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         There is no indication that the signature belongs to the owner.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "WARNING: We do NOT trust this key!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         The signature is probably a FORGERY.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         It is not certain that the signature belongs to the owner.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: skipped: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: skipped: public key already present\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "You did not specify a user ID. (you may use “-r”)\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Current recipients:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "No such user ID.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "skipped: public key already set as default recipient\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Public key is disabled.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "skipped: public key already set\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "unknown default recipient “%s”\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: skipped: public key is disabled\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "no valid addressees\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "data not saved; use option “--output” to save it\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "error creating ‘%s’: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Detached signature.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Please enter name of data file: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "reading stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "no signed data\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "can't open signed data ‘%s’\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonymous recipient; trying secret key %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "okay, we are the anonymous recipient.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "old encoding of the DEK is not supported\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "cipher algorithm %d%s is unknown or disabled\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "WARNING: cipher algorithm %s not found in recipient preferences\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTE: secret key %s expired at %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTE: key has been revoked"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet failed: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "key %s has no user IDs\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "To be revoked by:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(This is a sensitive revocation key)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Create a designated revocation certificate for this key? (y/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "ASCII armored output forced.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet failed: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Revocation certificate created.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "no revocation keys found for “%s”\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "secret key “%s” not found: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "no corresponding public key: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "public key does not match secret key!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Create a revocation certificate for this key? (y/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "unknown protection algorithm\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTE: This key is not protected!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Please select the reason for the revocation:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Cancel"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Probably you want to select %d here)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Enter an optional description; end it with an empty line:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Reason for revocation: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(No description given)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Is this okay? (y/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "secret key parts are not available\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "protection algorithm %d%s is not supported\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "protection digest %d is not supported\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Invalid passphrase; please try again"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "WARNING: Weak key detected - please change passphrase again.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "generating the deprecated 16-bit checksum for secret key protection\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "weak key created - retrying\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr "DSA requires the hash length to be a multiple of 8 bits\n"
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr "DSA key %s uses an unsafe (%u bit) hash\n"
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr "DSA key %s requires a %u bit or larger hash\n"
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "WARNING: signature digest conflict in message\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "WARNING: signing subkey %s is not cross-certified\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "WARNING: signing subkey %s has an invalid cross-certification\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "public key %s is %lu second newer than the signature\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "public key %s is %lu seconds newer than the signature\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTE: signature key %s expired %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "assuming bad signature from key %s due to an unknown critical bit\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "key %s: no subkey for subkey revocation signature\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "key %s: no subkey for subkey binding signature\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "can't put notation data into v3 (PGP 2.x style) signatures\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "checking created signature failed: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s signature from: “%s”\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "signing:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s encryption will be used\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "key is not flagged as insecure - can't use it with the faked RNG!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "skipped “%s”: duplicated\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "skipped “%s”: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "skipped: secret key already present\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"this is a PGP generated Elgamal key which is not secure for signatures!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "trust record %lu, type %d: write failed: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use “gpg --import-ownertrust” to restore them)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "error in ‘%s’: %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "line too long"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "colon missing"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "invalid fingerprint"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "ownertrust value missing"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "error finding trust record in ‘%s’: %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "read error in ‘%s’: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: sync failed: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: lseek failed: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: write failed (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "trustdb transaction too large\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "can't access ‘%s’: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: directory does not exist!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "can't create lock for ‘%s’\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "can't lock ‘%s’\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: failed to create version record: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: invalid trustdb created\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: trustdb created\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTE: trustdb not writable\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: invalid trustdb\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: failed to create hashtable: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: error updating version record: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: error reading version record: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: error writing version record: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek failed: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: read failed (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: not a trustdb file\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: version record with recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: invalid file version %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: error reading free record: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: error writing dir record: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: failed to zero a record: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: failed to append a record: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "the trustdb is corrupted; please run “gpg --fix-trustdb”.\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "can't handle text lines longer than %d characters\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "input line longer than %d characters\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "‘%s’ is not a valid long keyID\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "key %s: accepted as trusted key\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "key %s occurs more than once in the trustdb\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "key %s: no public key for trusted key - skipped\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "key %s marked as ultimately trusted\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "trust record %lu, req type %d: read failed: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "trust record %lu is not of requested type %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr "unable to use unknown trust model (%d) - assuming %s trust model\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "using %s trust model\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "10 translator see trustdb.c:uid_trust_string_fixed"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ revoked]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[ expired]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[ unknown]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[  undef ]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[marginal]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[  full  ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[ultimate]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "undefined"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "never"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "marginal"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "full"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "ultimate"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "no need for a trustdb check\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "next trustdb check due at %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "no need for a trustdb check with ‘%s’ trust model\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "no need for a trustdb update with ‘%s’ trust model\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "public key %s not found: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "please do a --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "checking the trustdb\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d keys processed (%d validity counts cleared)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "no ultimately trusted keys found\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "public key of ultimately trusted key %s not found\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "unable to update trustdb version record: write failed: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "input line %u too long or missing LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "general error"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "unknown packet type"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "unknown version"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "unknown pubkey algorithm"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "unknown digest algorithm"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "bad public key"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "bad secret key"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "bad signature"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "checksum error"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "bad passphrase"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "public key not found"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "unknown cipher algorithm"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "can't open the keyring"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "invalid packet"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "invalid armor"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "no such user id"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "secret key not available"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "wrong secret key used"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "not supported"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "bad key"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "file read error"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "file write error"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "unknown compress algorithm"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "file open error"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "file create error"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "invalid passphrase"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "unimplemented pubkey algorithm"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "unimplemented cipher algorithm"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "unknown signature class"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "trust database error"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "bad MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "resource limit"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "invalid keyring"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "bad certificate"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "malformed user id"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "file close error"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "file rename error"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "file delete error"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "unexpected data"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "timestamp conflict"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "unusable pubkey algorithm"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "file exists"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "weak key"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "invalid argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "bad URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "unsupported URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "network error"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "not encrypted"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "not processed"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "unusable public key"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "unusable secret key"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "keyserver error"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "canceled"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "no card"
+
+#: util/errors.c:111
+msgid "no data"
+msgstr "no data"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "ERROR: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "WARNING: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... this is a bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "you found a bug ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "yes"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okay|okay"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancel|cancel"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "WARNING: using insecure memory!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "please see http://www.gnupg.org/faq.html for more information\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operation is not possible without initialized secure memory\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(you may have used the wrong program for this task)\n"
diff --git a/po/eo.gmo b/po/eo.gmo
new file mode 100644 (file)
index 0000000..816a5e3
Binary files /dev/null and b/po/eo.gmo differ
diff --git a/po/eo.po b/po/eo.po
new file mode 100644 (file)
index 0000000..8da9598
--- /dev/null
+++ b/po/eo.po
@@ -0,0 +1,7428 @@
+# Mesaøoj por la programo GnuPG
+# Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+# Edmund GRIMLEY EVANS <edmundo@rano.org>, 2000-2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.0.6d\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2002-04-14 14:33+0100\n"
+"Last-Translator: Edmund GRIMLEY EVANS <edmundo@rano.org>\n"
+"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-3\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr ""
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr ""
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr ""
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "ne povas malfermi '%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "ne povas malfermi '%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "ne povas stat-i '%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "'%s' ne estas normala dosiero - ignorita\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "noto: dosiero random_seed estas malplena\n"
+
+#: cipher/random.c:474
+#, fuzzy
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "averto: nevalida grando de la dosiero random_seen - ne uzita\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "ne povas legi '%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "noto: dosiero random_seed ne aktualigita\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "ne povas krei '%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "ne povas skribi '%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "ne povas fermi '%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "AVERTO: uzas malsekuran stokastilon!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"La kvazaýstokastilo estas nur simpla protezo, por ke la\n"
+"programo entute ruliøu; øi neniel estas forta stokastilo!\n"
+"\n"
+"NE UZU DATENOJN KREITAJN DE ÆI TIU PROGRAMO!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Nesufiæe da stokastaj datenoj. Bonvolu fari ion por ebligi al la\n"
+"mastruma sistemo kolekti pli da entropio! (Mankas %d bitokoj)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "malsukcesis doni komencajn valorojn al fido-datenaro: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "malsukcesis rekonstrui þlosilaran staplon: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "eraro dum kreado de pasfrazo: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "eraro dum legado de þlosilbloko: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: eraro dum legado de libera registro: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "'%s' jam densigita\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "krei novan þlosilparon"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "malsukcesis doni komencajn valorojn al fido-datenaro: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s-subskribo de: %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "validaj OpenPGP-datenoj ne trovitaj.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "kiraso: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "nevalida kirasoæapo: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "kirasoæapo: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "nevalida æapo de klarteksta subskribo\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "ingitaj klartekstaj subskriboj\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "neatendita kiraso:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "nevalida strek-eskapita linio: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "nevalida signo %02x en bazo 64 ignorita\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "tro frua dosierfino (nenia CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "tro frua dosierfino (en CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "misformita CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC-eraro; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "tro frua dosierfino (en vosto)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "eraro en vostolinio\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "validaj OpenPGP-datenoj ne trovitaj.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "nevalida kiraso: linio pli longa ol %d signojn\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"quoted-printable-signo en kiraso - verþajne cima poþtotransendilo estis "
+"uzata\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "sekreta þlosilo ne havebla"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "ne povas fari tion en neinteraga reøimo\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Via elekto? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "en"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "en"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Nenia kialo specifita"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "ne traktita"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "skribas publikan þlosilon al '%s'\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "eraro dum legado de '%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "aktualigitaj preferoj"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "nevalida signo en signoæeno\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "nevalida signo en signoæeno\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "%s: nevalida dosiero-versio %d\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "Fingrospuro:"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "%s: nevalida dosiero-versio %d\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "validaj OpenPGP-datenoj ne trovitaj.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "eraro dum skribado de sekreta þlosilaro '%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Bonvolu elekti, kian þlosilon vi deziras:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (nur æifri)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Nevalida elekto.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Kialo por revoko: "
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "nekonata densig-metodo"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Sekretaj partoj de æefa þlosilo ne estas disponataj.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "ignorita: sekreta þlosilo jam æeestas\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "forlasi æi tiun menuon"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "malkongruaj komandoj\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "montri æi tiun helpon"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Nenia helpo disponata"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "þanøi la daton de eksvalidiøo"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "þanøi la posedantofidon"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "montri fingrospuron"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "krei novan þlosilparon"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Komando> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "malkongruaj komandoj\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "malkongruaj komandoj\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Nevalida komando (provu per \"helpo\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "sekreta þlosilo ne havebla"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Donu la uzantidentigilon: "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "Donu la uzantidentigilon: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+#, fuzzy
+msgid "Enter PIN: "
+msgstr "Donu la uzantidentigilon: "
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Ripetu pasfrazon: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "la pasfrazo ne estis øuste ripetita; provu denove"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "ne povas malfermi '%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output ne funkcias por æi tiu komando\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "þlosilo '%s' ne trovita: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "eraro dum legado de þlosilbloko: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr ""
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "ne povas fari tion en neinteraga reøimo sen \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Æu forviþi æi tiun þlosilon de la þlosilaro? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Tio estas sekreta þlosilo! Æu vere forviþi øin? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr ""
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "estas sekreta þlosilo por la publika þlosilo \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "uzu la opcion \"--delete-secret-key\" por forviþi øin unue.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "eraro dum kreado de pasfrazo: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "subskribado malsukcesis: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "'%s' jam densigita\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "eblas æifri nur per RSA-þlosiloj de maksimume 2048 bitoj kun --pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "legas el '%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "ne povas uzi la æifron IDEA por æiuj þlosiloj, al kiuj vi æifras.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "NOTO: æifrad-metodo %d ne trovita en preferoj\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "NOTO: æifrad-metodo %d ne trovita en preferoj\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, fuzzy, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/encode.c:812
+#, fuzzy, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s-æifrita por: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s-æifritaj datenoj\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "æifrita per nekonata metodo %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"AVERTO: mesaøo estis æifrita per malforta þlosilo en la simetria æifro.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problemo æe traktado de æifrita paketo\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr ""
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, fuzzy, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "%s: ne povas krei dosierujon: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr "%s: eraro dum legado de versiregistro: %s\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "ne povas malfermi %s: %s\n"
+
+#: g10/exec.c:513
+#, fuzzy, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "%s: eraro dum legado de versiregistro: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr ""
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr ""
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr ""
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:613
+#, fuzzy, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"La subskribo estos markita kiel nerevokebla.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revoki flankan þlosilon"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "neuzebla sekreta þlosilo"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "þlosilo %08lX: ne protektita - ignorita\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "þlosilo %08lX: PGP-2.x-stila þlosilo - ignorita\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "þlosilo %08lX: revokatestilo en maløusta loko - ignorita\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "malsukcesis doni komencajn valorojn al fido-datenaro: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "AVERTO: nenio estis eksportita\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Komandoj:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[dosiero]|fari subskribon"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[dosiero]|fari klartekstan subskribon"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "fari apartan subskribon"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "æifri datenojn"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "æifri nur kun simetria æifro"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "malæifri datenojn (implicita elekto)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "kontroli subskribon"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "listigi þlosilojn"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "listigi þlosilojn kaj subskribojn"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "kontroli þlosilsubskribojn"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "listigi þlosilojn kaj fingroþpurojn"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "listigi sekretajn þlosilojn"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "krei novan þlosilparon"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "forigi þlosilojn de la publika þlosilaro"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "forigi þlosilojn de la sekreta þlosilaro"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "subskribi þlosilon"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "subskribi þlosilon loke"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "subskribi aý redakti þlosilon"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "krei revokatestilon"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "eksporti þlosilojn"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "eksporti þlosilojn al þlosilservilo"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importi þlosilojn de þlosilservilo"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "seræi þlosilojn æe þlosilservilo"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "aktualigi æiujn þlosilojn de þlosilservilo"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importi/kunfandi þlosilojn"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "aktualigi la fido-datenaron"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|metodo [dosieroj]|presi mesaøo-kompendiojn"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opcioj:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "krei eligon en askia kiraso"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOMO|æifri por NOMO"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "uzi æi tiun uzantidentigilon por subskribi aý malæifri"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|difini densig-nivelon N (0=nenia)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "uzi tekstan reøimon"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "uzi dosieron por eligo"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "detala eligo"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "fari neniajn þanøojn"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr ""
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Vidu la manpaøon por kompleta listo de æiuj komandoj kaj opcioj)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Ekzemploj:\n"
+"\n"
+" -se -r Bob [dosiero]       subskribi kaj æifri por uzanto Bob\n"
+" --clearsign [dosiero]      fari klartekstan subskribon\n"
+" --detach-sign [dosiero]    fari apartan subskribon\n"
+" --list-keys [nomoj]        montri þlosilojn\n"
+" --fingerprint [nomoj]      montri fingroþpurojn\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Bonvolu raporti cimojn al <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Uzado: gpg [opcioj] [dosieroj] (-h por helpo)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintakso: gpg [opcioj] [dosieroj]\n"
+"subskribi, kontroli, æifri aý malæifri\n"
+"implicita operacio dependas de la enigataj datenoj\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Realigitaj metodoj:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr ""
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr ""
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr ""
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+#, fuzzy
+msgid "Compression: "
+msgstr "Komento: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "uzado: gpg [opcioj] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "malkongruaj komandoj\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "Averto: malsekuraj permesoj sur %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "%s: nova opcio-dosiero kreita\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Mankas responda subskribo en sekreta þlosilaro\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "la donita gvidlinia URL por subskriboj ne validas\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "montri, en kiu þlosilaro estas listigita þlosilo"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Mankas responda subskribo en sekreta þlosilaro\n"
+
+#: g10/gpg.c:1954
+#, fuzzy, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTO: mankas implicita opcio-dosiero '%s'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTO: mankas implicita opcio-dosiero '%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "opcio-dosiero '%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "legas opciojn el '%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTO: %s ne estas por normala uzado!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s ne estas valida signaro\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s ne estas valida signaro\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "ne povis analizi URI de þlosilservilo\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "nevalida þlosilaro"
+
+#: g10/gpg.c:2537
+#, fuzzy, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/gpg.c:2540
+#, fuzzy
+msgid "invalid import options\n"
+msgstr "nevalida kiraso"
+
+#: g10/gpg.c:2547
+#, fuzzy, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/gpg.c:2550
+#, fuzzy
+msgid "invalid export options\n"
+msgstr "nevalida þlosilaro"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "nevalida kiraso"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s ne estas valida signaro\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "la donita gvidlinia URL por subskriboj ne validas\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s ne estas valida signaro\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "nevalida þlosilaro"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "AVERTO: programo povas krei core-dosieron!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "AVERTO: %s nuligas %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s ne eblas kun %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s ne havas sencon kun %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent ne estas disponata en æi tiu sesio\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "eblas fari nur apartajn kaj klartekstajn subskribojn kun --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "ne eblas samtempe subskribi kaj æifri kun --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "necesas uzi dosierojn (kaj ne tubon) kun --pgp2\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "æifri mesaøon kun --pgp2 postulas la æifron IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "elektita æifrad-metodo ne validas\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "elektita kompendi-metodo ne validas\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "elektita æifrad-metodo ne validas\n"
+
+#: g10/gpg.c:3004
+#, fuzzy
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "elektita kompendi-metodo ne validas\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed devas esti pli granda ol 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed devas esti pli granda ol 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth devas esti inter 1 kaj 255\n"
+
+#: g10/gpg.c:3025
+#, fuzzy
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "nevalida default-check-level; devas esti 0, 1, 2 aý 3\n"
+
+#: g10/gpg.c:3027
+#, fuzzy
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "nevalida default-check-level; devas esti 0, 1, 2 aý 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTO: simpla S2K-reøimo (0) estas forte malrekomendata\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "nevalida S2K-reøimo; devas esti 0, 1 aý 3\n"
+
+#: g10/gpg.c:3041
+#, fuzzy
+msgid "invalid default preferences\n"
+msgstr "nevalidaj preferoj\n"
+
+#: g10/gpg.c:3050
+#, fuzzy
+msgid "invalid personal cipher preferences\n"
+msgstr "nevalidaj preferoj\n"
+
+#: g10/gpg.c:3054
+#, fuzzy
+msgid "invalid personal digest preferences\n"
+msgstr "nevalidaj preferoj\n"
+
+#: g10/gpg.c:3058
+#, fuzzy
+msgid "invalid personal compress preferences\n"
+msgstr "nevalidaj preferoj\n"
+
+#: g10/gpg.c:3091
+#, fuzzy, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s ne havas sencon kun %s!\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "malsukcesis doni komencajn valorojn al fido-datenaro: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [dosiero]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [dosiero]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "malæifrado malsukcesis: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [dosiero]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [dosiero]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [dosiero]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [dosiero]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [dosiero]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [dosiero]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [dosiero]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [dosiero]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key uzantidentigilo"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key uzantidentigilo"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key uzantidentigilo [komandoj]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [uzantidentigilo] [þlosilaro]"
+
+#: g10/gpg.c:3560
+#, fuzzy, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#: g10/gpg.c:3562
+#, fuzzy, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "listigo de sekretaj þlosiloj malsukcesis: %s\n"
+
+#: g10/gpg.c:3564
+#, fuzzy, c-format
+msgid "key export failed: %s\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#: g10/gpg.c:3575
+#, fuzzy, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "get_dir_record: search_record malsukcesis: %s\n"
+
+#: g10/gpg.c:3585
+#, fuzzy, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "listigo de sekretaj þlosiloj malsukcesis: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "elkirasigo malsukcesis: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "enkirasigo malsukcesis: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "nevalida kompendi-metodo '%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[dosiero]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Ektajpu vian mesaøon ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "la donita gvidlinia URL por atestado ne validas\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "la donita gvidlinia URL por subskriboj ne validas\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "la donita gvidlinia URL por subskriboj ne validas\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "tro da registroj en pk-staplo - malþaltas\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[Uzantidentigilo ne trovita]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "Nevalida þlosilo %08lX validigita per --always-trust\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "estas sekreta þlosilo por la publika þlosilo \"%s\"!\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "uzas flankan þlosilon %08lX anstataý la æefa þlosilo %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "þlosilo %08lX: sekreta þlosilo sen publika þlosilo - ignorita\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "iom malpli da informoj"
+
+#: g10/gpgv.c:75
+#, fuzzy
+msgid "take the keys from this keyring"
+msgstr "Æu forviþi æi tiun þlosilon de la þlosilaro? "
+
+#: g10/gpgv.c:77
+#, fuzzy
+msgid "make timestamp conflicts only a warning"
+msgstr "malkongruo de tempostampoj"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|skribi statusinformojn al FD (dosierpriskribilo)"
+
+#: g10/gpgv.c:102
+#, fuzzy
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Uzado: gpg [opcioj] [dosieroj] (-h por helpo)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Vi devas mem doni valoron æi tie; la valoro neniam estos eksportita\n"
+"al alia persono. Ni bezonas øin por realigi la fido-reton; øi neniel\n"
+"rilatas al la (implicite kreita) atestilo-reto."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Por konstrui la fido-reton, GnuPG devas scii, kiuj þlosiloj estas\n"
+"absolute fidataj; normale tiuj estas la þlosiloj, por kiuj vi havas\n"
+"aliron al la sekreta þlosilo. Respondu \"jes\" por igi æi tiun þlosilon\n"
+"absolute fidata\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Se vi tamen volas uzi æi tiun nefidatan þlosilon, respondu per \"jes\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"Donu la uzantidentigilon de la adresito, al kiu vi volas sendi la mesaøon."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Donu la þlosilgrandon"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Respondu per \"jes\" aý \"ne\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Donu la bezonatan valoron, kiel montrite en la invito.\n"
+"Eblas doni ISO-forman daton (JJJJ-MM-TT), sed vi ne ricevos\n"
+"bonan eraromesaøon; anstataýe la sistemo provas interpreti\n"
+"la donitan valoron kiel gamon."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Donu la nomon de la þlosilposedanto"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "bonvolu doni retadreson (ne devige, sed tre rekomendate)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Bonvolu doni nedevigan komenton"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  por þanøi la nomon.\n"
+"K  por þanøi la komenton.\n"
+"A  por þanøi la retadreson.\n"
+"B  por daýrigi kun la þlosilkreado.\n"
+"F  por interrompi la þlosilkreadon kaj fini."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Respondu per \"jes\" (aý nur \"j\"), se la subþlosilo estu kreita."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Kiam vi subskribas uzantidentigilon sur þlosilo, vi devas unue kontroli,\n"
+"ke la þlosilo apartenas al la persono nomita en la identigilo. Estas\n"
+"utile por aliaj homoj scii, kiom zorge vi kontrolis tion.\n"
+"\n"
+"\"0\" signifas, ke vi faras nenian specifan aserton pri tio, kiel zorge vi\n"
+"    kontrolis la þlosilon.\n"
+"\n"
+"\"1\" signifas, ke vi kredas, ke la þlosilo apartenas al la homo, kiu\n"
+"    pretendas posedi øin, sed vi ne povis kontroli, aý simple ne\n"
+"    kontrolis la þlosilon. Tio estas utila, kiam oni subskribas la\n"
+"    þlosilon de pseýdonoma uzanto.\n"
+"\n"
+"\"2\" signifas, ke vi malzorge kontrolis la þlosilon. Ekzemple, povas esti,\n"
+"    ke vi kontrolis la fingroþpuron de la þlosilo kaj komparis la\n"
+"    uzantidentigilon sur la þlosilo kun foto-identigilo.\n"
+"\n"
+"\"3\" signifas, ke vi zorge kontrolis la þlosilon. Ekzemple, povas esti,\n"
+"    ke vi kontrolis la fingroþpuron persone æe la posedanto de la\n"
+"    þlosilo, kaj vi kontrolis, per malfacile falsebla dokumento kun\n"
+"    foto-identigilo (ekzemple pasporto), ke la nomo de þlosilposedanto\n"
+"    kongruas kun la nomo en la uzantidentigilo sur la þlosilo, kaj fine\n"
+"    vi kontrolis (per interþanøo de retmesaøoj), ke la retadreso sur\n"
+"    la þlosilo apartenas al la posedanto de la þlosilo.\n"
+"\n"
+"Notu, ke la ekzemploj donitaj supre por la niveloj 2 kaj 3 estas nur\n"
+"ekzemploj. Vi devas fine mem decidi, kion precize signifas \"malzorga\"\n"
+"kaj \"zorga\", kiam vi subskribas aliajn þlosilojn.\n"
+"\n"
+"Se vi ne scias la øustan respondon, respondu per \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Respondu per \"jes\", se vi volas subskribi æiujn uzantidentigilojn"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Respondu per \"jes\", se vi vere volas forviþi la uzantidentigilon.\n"
+"Tiam ankaý æiuj atestiloj perdiøos!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Respondu per \"jes\", se la subþlosilo estu forviþita"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Æi tio estas valida þlosilsubskribo; normale vi ne volas forviþi\n"
+"æi tiun subskribon, æar eble øi estos grava por establi fido-ligon\n"
+"al la þlosilo aý al alia þlosilo atestita per æi tiu þlosilo."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"La subskribo ne estas kontrolebla, æar vi ne havas la respondan\n"
+"þlosilon. Vi devus prokrasti øian forviþon, øis vi scios, kiu\n"
+"þlosilo estis uzita, æar la subskribanta þlosilo eble establos\n"
+"fido-ligon tra alia jam atestita þlosilo."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"La subskribo ne estas valida. Estas prudente forigi øin de\n"
+"via þlosilaro."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Æi tio estas subskribo, kiu ligas la uzantidentigilon al la þlosilo.\n"
+"Normale ne estas konsilinde forigi tian subskribon. Efektive, GnuPG\n"
+"eble ne povus uzi la þlosilon poste. Do, faru æi tion, nur se la\n"
+"mem-subskribo estas ial nevalida, kaj dua mem-subskribo estas\n"
+"havebla."
+
+#: g10/helptext.c:223
+#, fuzzy
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Þanøi la preferojn de æiuj uzantidentigiloj (aý nur la elektitaj)\n"
+"al la aktuala listo de preferoj. La dato de æiuj trafitaj\n"
+"mem-subskriboj estos antaýenigitaj je unu sekundo.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Bonvolu doni la pasfrazon; tio estas sekreta frazo \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Bonvolu ripeti la pasfrazon, por kontroli, ke vi bone scias, kion vi tajpis."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Donu la nomon de la dosiero, al kiu la subskribo aplikiøas"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Respondu per \"jes\", se la dosiero estu surskribita"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Bonvolu doni novan dosiernomon. Se vi premas nur ENEN, la implicita\n"
+"dosiero (montrita en parentezo) estos uzata."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Vi devus doni kialon por æi tiu atestilo. Depende de la kunteksto, vi\n"
+"povas elekti el æi tiu listo:\n"
+"  \"Þlosilo estas kompromitita\"\n"
+"      Uzu æi tion, se vi pensas, ke nerajtigita homo havis aliron al\n"
+"      via sekreta þlosilo.\n"
+"  \"Þlosilo estas anstataýigita\"\n"
+"      Uzu æi tion, se vi anstataýigis la þlosilon per pli nova.\n"
+"  \"Þlosilo estas ne plu uzata\"\n"
+"      Uzu æi tion, se vi retiris æi tiun þlosilon.\n"
+"  \"Uzantidentigilo ne plu validas\"\n"
+"      Uzu æi tion por aserti, ke la uzantidentigilo ne plu estu uzata;\n"
+"      normale oni uzas æi tion por marki retadreson kiel nevalidan.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Se vi volas, vi povas doni tekston por priskribi, kial vi faras\n"
+"æi tiun revokatestilon. Bonvolu fari æi tiun tekston konciza.\n"
+"Malplena linio finas la tekston.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Nenia helpo disponata"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Nenia helpo disponata por '%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "aktualigi la fido-datenaron"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr ""
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "neuzebla sekreta þlosilo"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "ignoras blokon de speco %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu þlosiloj jam traktitaj\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "      Nombro traktita entute: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "    ignoritaj novaj þlosiloj: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "         sen uzantidentigilo: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                  importitaj: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                  neþanøitaj: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "      novaj uzantidentigiloj: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           novaj subþlosiloj: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "            novaj subskriboj: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "         novaj þlosilrevokoj: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "   sekretaj þlosiloj legitaj: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "sekretaj þlosiloj importitaj: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "sekretaj þlosiloj neþanøitaj: %lu\n"
+
+#: g10/import.c:322
+#, fuzzy, c-format
+msgid "          not imported: %lu\n"
+msgstr "                  importitaj: %lu"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "            novaj subskriboj: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "   sekretaj þlosiloj legitaj: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Vi subskribis la sekvajn uzantidentigilojn:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s-subskribo de: %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "þlosilo %08lX: mankas uzantidentigilo\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "þlosilo %08lX: mankas subþlosilo por þlosilbindado\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "þlosilo %08lX: akceptis ne-mem-subskribitan uzantidentigilon '"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "þlosilo %08lX: mankas valida uzantidentigilo\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "tio povas esti kaýzata de mankanta mem-subskribo\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "þlosilo %08lX: publika þlosilo ne trovita: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "þlosilo %08lX: nova þlosilo - ignorita\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "neniu skribebla þlosilaro trovita: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "skribas al '%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "eraro dum skribado de þlosilaro '%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "þlosilo %08lX: publika þlosilo importita\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "þlosilo %08lX: diferencas de nia kopio\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "þlosilo %08lX: ne povas trovi originalan þlosilblokon: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "þlosilo %08lX: ne povas legi originalan þlosilblokon: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "þlosilo %08lX: 1 nova uzantidentigilo\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "þlosilo %08lX: %d novaj uzantidentigiloj\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "þlosilo %08lX: 1 nova subskribo\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "þlosilo %08lX: %d novaj subskriboj\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "þlosilo %08lX: 1 nova subþlosilo\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "þlosilo %08lX: %d novaj subþlosiloj\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "þlosilo %08lX: %d novaj subskriboj\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "þlosilo %08lX: %d novaj subskriboj\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "þlosilo %08lX: %d novaj uzantidentigiloj\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "þlosilo %08lX: %d novaj uzantidentigiloj\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "þlosilo %08lX: ne þanøita\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "þlosilo %08lX: sekreta þlosilo sen publika þlosilo - ignorita\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "mankas implicita sekreta þlosilaro: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "þlosilo %08lX: sekreta þlosilo importita\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "þlosilo %08lX: jam en sekreta þlosilaro\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "þlosilo %08lX: sekreta þlosilo ne trovita: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"þlosilo %08lX: publika þlosilo mankas - ne povas apliki revokatestilon\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "þlosilo %08lX: nevalida revokatestilo: %s - malakceptita\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "þlosilo %08lX: revokatestilo importita\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "þlosilo %08lX: mankas uzantidentigilo por subskribo\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "þlosilo %08lX: nerealigita publikþlosila metodo\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "þlosilo %08lX: nevalida mem-subskribo\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "þlosilo %08lX: mankas subþlosilo por þlosilbindado\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "þlosilo %08lX: nerealigita publikþlosila metodo\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "þlosilo %08lX: nevalida subþlosila bindado\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "þlosilo %08lX: nevalida subþlosila bindado\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "þlosilo %08lX: mankas subþlosilo por þlosilbindado\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "þlosilo %08lX.%lu: Valida subþlosilrevoko\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "þlosilo %08lX: nevalida subþlosila bindado\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "þlosilo %08lX: ignoris uzantidentigilon '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "þlosilo %08lX: ignoris subþlosilon\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "þlosilo %08lX: neeksportebla subskribo (klaso %02x) - ignorita\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "þlosilo %08lX: revokatestilo en maløusta loko - ignorita\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "þlosilo %08lX: nevalida revokatestilo: %s - ignorita\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "þlosilo %08lX: revokatestilo en maløusta loko - ignorita\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "þlosilo %08lX: neeksportebla subskribo (klaso %02x) - ignorita\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "þlosilo %08lX: trovis ripetitan uzantidentigilon - kunfandita\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "AVERTO: Æi tiu þlosilo estas revokita de sia posedanto!\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "AVERTO: Æi tiu þlosilo estas revokita de sia posedanto!\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "þlosilo %08lX: revokatestilo aldonita\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "þlosilo %08lX: rekta þlosilsubskribo aldonita\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr ""
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ignorita: sekreta þlosilo jam æeestas\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ignorita: sekreta þlosilo jam æeestas\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "eraro dum kreado de þlosilaro '%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "þlosilaro '%s' kreita\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "eraro dum kreado de '%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "malsukcesis rekonstrui þlosilaran staplon: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revoko]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[mem-subskribo]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 malbona subskribo\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d malbonaj subskriboj\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 subskribo ne kontrolita pro manko de þlosilo\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d subskriboj ne kontrolitaj pro manko de þlosiloj\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 subskribo ne kontrolita pro eraro\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d subskriboj ne kontrolitaj pro eraroj\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 uzantidentigilo sen valida mem-subskribo estis trovita\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d uzantidentigiloj sen valida mem-subskribo estis trovitaj\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Bonvolu decidi, kiagrade vi fidas al æi tiu uzanto øuste\n"
+"kontroli la þlosilojn de aliaj uzantoj (rigardante pasportojn,\n"
+"kontrolante fingrospurojn el diversaj fontoj ...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Mi fidas iomete\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Mi plene fidas\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, fuzzy, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+#, fuzzy
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr ""
+
+#: g10/keyedit.c:627
+#, fuzzy, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:655
+#, fuzzy, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Æu vere subskribi? "
+
+#: g10/keyedit.c:707
+#, fuzzy, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Via aktuala subskribo sur \"%s\"\n"
+"estas loka subskribo.\n"
+"\n"
+"Æu vi volas igi øin plena eksportebla subskribo?\n"
+
+#: g10/keyedit.c:716
+#, fuzzy
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr ""
+"Via aktuala subskribo sur \"%s\"\n"
+"estas loka subskribo.\n"
+"\n"
+"Æu vi volas igi øin plena eksportebla subskribo?\n"
+
+#: g10/keyedit.c:730
+#, fuzzy, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Via aktuala subskribo sur \"%s\"\n"
+"estas loka subskribo.\n"
+"\n"
+"Æu vi volas igi øin plena eksportebla subskribo?\n"
+
+#: g10/keyedit.c:734
+#, fuzzy
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Æu vi volas, ke via subskribo eksvalidiøu je la sama tempo? (j/n) "
+
+#: g10/keyedit.c:755
+#, fuzzy, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Via aktuala subskribo sur \"%s\"\n"
+"estas loka subskribo.\n"
+"\n"
+"Æu vi volas igi øin plena eksportebla subskribo?\n"
+
+#: g10/keyedit.c:759
+#, fuzzy
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+"Via aktuala subskribo sur \"%s\"\n"
+"estas loka subskribo.\n"
+"\n"
+"Æu vi volas igi øin plena eksportebla subskribo?\n"
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" jam estis %ssubskribita per þlosilo %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" jam estis %ssubskribita per þlosilo %08lX\n"
+
+#: g10/keyedit.c:788
+#, fuzzy
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nenio por subskribi per þlosilo %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Æi tiu þlosilo eksvalidiøis!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/keyedit.c:849
+#, fuzzy
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Æu vi volas, ke via subskribo eksvalidiøu je la sama tempo? (j/n) "
+
+#: g10/keyedit.c:889
+#, fuzzy
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr "eblas subskribi nur per PGP-2.x-stilaj þlosiloj kun --pgp2\n"
+
+#: g10/keyedit.c:891
+#, fuzzy
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "æi tiu mesaøo povas ne esti uzebla de PGP 2.x\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Kiom zorge vi kontrolis, ke la þlosilo, kiun vi subskribos, vere apartenas\n"
+"al la supre nomita persono? Se vi ne scias la respondon, donu \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Mi ne respondas.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Mi tute ne kontrolis.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Mi malzorge kontrolis.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Mi tre zorge kontrolis.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr ""
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Æu vi estas tute certa, ke vi volas subskribi æi tiun þlosilon\n"
+"per via þlosilo: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr "tio povas esti kaýzata de mankanta mem-subskribo\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"La subskribo estos markita kiel neeksportebla.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"La subskribo estos markita kiel nerevokebla.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"La subskribo estos markita kiel neeksportebla.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"La subskribo estos markita kiel nerevokebla.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Mi tute ne kontrolis æi tiun þlosilon.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Mi malzorge kontrolis æi tiun þlosilon.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Mi tre zorge kontrolis æi tiun þlosilon.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Æu vere subskribi? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "subskribado malsukcesis: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Æi tiu þlosilo ne estas protektita.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Sekretaj partoj de æefa þlosilo ne estas disponataj.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Sekretaj partoj de æefa þlosilo ne estas disponataj.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Þlosilo estas protektita.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Ne povas redakti æi tiun þlosilon: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Donu la novan pasfrazon por æi tiu sekreta þlosilo.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "la pasfrazo ne estis øuste ripetita; provu denove"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Vi ne deziras pasfrazon - tio verþajne estas *malbona* ideo!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Æu vi vere volas fari tion? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "movas þlosilsubskribon al la øusta loko\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "skribi kaj fini"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "montri fingrospuron"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "listigi þlosilojn kaj uzantidentigilojn"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "elekti uzantidentigilon N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "elekti uzantidentigilon N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revoki subskribojn"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "subskribi la þlosilon loke"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Sugesto: Elekti la uzantidentigilojn por subskribi\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "aldoni uzantidentigilon"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "aldoni foto-identigilon"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "forviþi uzantidentigilon"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "al"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "forviþi flankan þlosilon"
+
+#: g10/keyedit.c:1408
+#, fuzzy
+msgid "add a revocation key"
+msgstr "aldoni flankan þlosilon"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Æu vere aktualigi la preferojn por la elektitaj uzantidentigiloj? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Vi ne povas þanøi la daton de eksvalidiøo de v3-þlosilo\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "marku uzantidentigilon kiel æefan"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "de sekreta aý publika listo iri al la alia"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "listigi preferojn (spertula)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "listigi preferojn (detale)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Æu vere aktualigi la preferojn por la elektitaj uzantidentigiloj? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "ne povis analizi URI de þlosilservilo\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Æu vere aktualigi la preferojn por la elektitaj uzantidentigiloj? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "þanøi la pasfrazon"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "þanøi la posedantofidon"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Æu vere forigi æiujn elektitajn uzantidentigilojn? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "aldoni uzantidentigilon"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revoki flankan þlosilon"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "þalti þlosilon"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "malþalti þlosilon"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "montri foto-identigilon"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "eraro dum legado de sekreta þlosilbloko '%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Sekreta þlosilo estas havebla.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Bezonas la sekretan þlosilon por fari tion.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Bonvolu uzi la komandon \"toggle\" unue.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+#, fuzzy
+msgid "Key is revoked."
+msgstr "Þlosilo estas revokita.\n"
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Æu vere subskribi æiujn uzantidentigilojn? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Sugesto: Elekti la uzantidentigilojn por subskribi\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "nekonata klaso de subskribo"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Tiu komando ne eblas en la reøimo %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Vi devas elekti almenaý unu uzantidentigilon.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Vi ne povas forviþi la lastan uzantidentigilon!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Æu vere forigi æiujn elektitajn uzantidentigilojn? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Æu vere forigi æi tiun uzantidentigilon? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Æu vere forigi æi tiun uzantidentigilon? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Vi devas elekti almenaý unu þlosilon.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "ne povas malfermi '%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "eraro dum kreado de þlosilaro '%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Vi devas elekti almenaý unu þlosilon.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Æu vi vere volas forviþi la elektitajn þlosilojn? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Æu vi vere volas forviþi æi tiun þlosilon? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Æu vere forigi æiujn elektitajn uzantidentigilojn? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Æu vere forigi æi tiun uzantidentigilon? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Æu vi vere volas revoki æi tiun þlosilon? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Æu vi vere volas revoki la elektitajn þlosilojn? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Æu vi vere volas revoki æi tiun þlosilon? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "agordi liston de preferoj"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Æu vere aktualigi la preferojn por la elektitaj uzantidentigiloj? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Æu vere aktualigi la preferojn? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Æu skribi þanøojn? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Æu fini sen skribi þanøojn? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "aktualigo malsukcesis: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "aktualigo de sekreto malsukcesis: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Þlosilo ne þanøita, do aktualigo ne necesas.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr ""
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr ""
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notacio: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Æi tiu þlosilo estas revokebla per %s þlosilo %s%s\n"
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Æi tiu þlosilo estas revokebla per %s þlosilo %s%s\n"
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (sentema)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "ne povas krei %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "rev"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [eksvalidiøos: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [eksvalidiøos: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " fido: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " fido: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Æi tiu þlosilo estas malþaltita"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "rev"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "eksval"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"AVERTO: Æi tiu estas PGP2-stila þlosilo. Aldono de foto-identigilo eble\n"
+"        kaýzos, ke iuj versioj de PGP malakceptos la þlosilon.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+#, fuzzy
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas aldoni øin? (j/n) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Ne eblas aldoni foto-identigilon al PGP2-stila þlosilo.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Æu forviþi æi tiun bonan subskribon? (j/N/f)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Æu forviþi æi tiun nevalidan subskribon? (j/N/f)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Æu forviþi æi tiun nekonatan subskribon? (j/N/f)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Æu vere forviþi æi tiun mem-subskribon? (j/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Forviþis %d subskribon.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Forviþis %d subskribojn.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nenio estis forviþita.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "nevalida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:3346
+#, fuzzy
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVERTO: Æi tiu estas PGP2-stila þlosilo. Aldono de foto-identigilo eble\n"
+"        kaýzos, ke iuj versioj de PGP malakceptos la þlosilon.\n"
+
+#: g10/keyedit.c:3357
+#, fuzzy
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Ne eblas aldoni foto-identigilon al PGP2-stila þlosilo.\n"
+
+#: g10/keyedit.c:3377
+#, fuzzy
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Donu la þlosilgrandon"
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "AVERTO: Æi tiu þlosilo estas revokita de sia posedanto!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Bonvolu malelekti la sekretajn þlosilojn.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Bonvolu elekti maksimume unu flankan þlosilon.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Þanøas la daton de eksvalidiøo de flanka þlosilo.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Þanøas la daton de eksvalidiøo de la æefa þlosilo.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Vi ne povas þanøi la daton de eksvalidiøo de v3-þlosilo\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Mankas responda subskribo en sekreta þlosilaro\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Bonvolu elekti precize unu uzantidentigilon.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "þlosilo %08lX: nevalida mem-subskribo\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Subskribo-notacio: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Æu surskribi (j/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Mankas uzantidentigilo kun indekso %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Mankas uzantidentigilo kun indekso %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Mankas uzantidentigilo kun indekso %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "uzantidentigilo: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   subskribita per %08lX je %s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr ""
+
+#: g10/keyedit.c:4636
+#, fuzzy, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/keyedit.c:4640
+#, fuzzy
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas aldoni øin? (j/n) "
+
+#: g10/keyedit.c:4644
+#, fuzzy
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Æu krei revokatestilon por æi tiu subskribo? (j/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Vi subskribis la sekvajn uzantidentigilojn:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr "subskribi þlosilon nerevokeble"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revokita de %08lX je %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Vi revokos la sekvajn subskribojn:\n"
+
+#: g10/keyedit.c:4746
+#, fuzzy
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Æu vere krei la revokatestilojn? (j/N)"
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "mankas sekreta þlosilo\n"
+
+#: g10/keyedit.c:4846
+#, fuzzy, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Uzantidentigilo \"%s\" estas revokita.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "prefero %c%lu ripetita\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "tro da '%c'-preferoj\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "tro da '%c'-preferoj\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "tro da '%c'-preferoj\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "nevalida signo en signoæeno\n"
+
+#: g10/keygen.c:872
+#, fuzzy
+msgid "writing direct signature\n"
+msgstr "skribas mem-subskribon\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "skribas mem-subskribon\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "skribas þlosilbindan subskribon\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "þlosilgrando nevalida; uzas %u bitojn\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "þlosilgrando rondigita øis %u bitoj\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "subskribi"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "æifri datenojn"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (nur æifri)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Bonvolu elekti, kian þlosilon vi deziras:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA kaj ElGamal (implicita elekto)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (nur subskribi)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (nur æifri)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (nur æifri)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (nur subskribi)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (nur æifri)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (nur æifri)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA-þlosilparo havos 1024 bitojn.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Kiun þlosilgrandon vi deziras? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Petita þlosilgrando estas %u bitoj\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "rondigita øis %u bitoj\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Bonvolu specifi, kiom longe la þlosilo validu.\n"
+"         0 = þlosilo neniam eksvalidiøos\n"
+"      <n>  = þlosilo eksvalidiøos post n tagoj\n"
+"      <n>w = þlosilo eksvalidiøos post n semajnoj\n"
+"      <n>m = þlosilo eksvalidiøos post n monatoj\n"
+"      <n>y = þlosilo eksvalidiøos post n jaroj\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Bonvolu specifi, kiom longe la þlosilo validu.\n"
+"         0 = þlosilo neniam eksvalidiøos\n"
+"      <n>  = þlosilo eksvalidiøos post n tagoj\n"
+"      <n>w = þlosilo eksvalidiøos post n semajnoj\n"
+"      <n>m = þlosilo eksvalidiøos post n monatoj\n"
+"      <n>y = þlosilo eksvalidiøos post n jaroj\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Þlosilo validu ...? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Þlosilo validu por ...? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "nevalida valoro\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s neniam eksvalidiøos\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s neniam eksvalidiøos\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s eksvalidiøos je %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Via sistemo ne povas montri datojn post 2038.\n"
+"Tamen, øi estos øuste traktata øis 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Æu tio estas øusta (j/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Vi bezonas uzantidentigilon por identigi vian þlosilon; la programo\n"
+"konstruas la uzantidentigilon el Vera Nomo, Komento kaj Retadreso, jene:\n"
+"    \"Heinrich Heine (la poeto) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Vera nomo: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Nevalida signo en nomo\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Nomo ne povas komenciøi per cifero\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Nomo devas havi almenaý 5 signojn\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Retadreso: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Nevalida retadreso\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Komento: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Nevalida signo en komento\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Vi uzas la signaron '%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Vi elektis æi tiun uzantidentigilon:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Bonvolu ne meti la retadreson en la veran nomon aý la komenton\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnKkAaBbFf"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Þanøu (N)omon, (K)omenton, (A)adreson, aý (F)ini? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Þanøu (N)omon, (K)omenton, (A)adreson, aý (B)one/(F)ini? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Bonvolu korekti la eraron unue\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Vi bezonas pasfrazon por protekti vian sekretan þlosilon.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Ne devas krei multe da stokastaj datenoj. Estas konsilinde fari ion\n"
+"alian (tajpi æe la klavaro, movi la muson, uzi la diskojn) dum la\n"
+"kreado de la primoj; tio donas al la stokastilo pli bonan þancon\n"
+"akiri sufiæe da entropio.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Kreado de þlosiloj nuligita.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "skribas publikan þlosilon al '%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "skribas sekretan þlosilon al '%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "neniu skribebla publika þlosilaro trovita: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "neniu skribebla sekreta þlosilaro trovita: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "eraro dum skribado de publika þlosilaro '%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "eraro dum skribado de sekreta þlosilaro '%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "publika kaj sekreta þlosiloj kreitaj kaj subskribitaj.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Notu, ke æi tiu þlosilo ne estas uzebla por æifrado. Vi eble volos\n"
+"uzi la komandon \"--edit-key\" por krei flankan þlosilon por tiu celo.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Kreado de þlosiloj malsukcesis: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
+"horloøeraro)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"þlosilo estis kreita %lu sekundojn en la estonteco (tempotordo aý "
+"horloøeraro)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTO: krei subþlosilojn por v3-þlosiloj ne estas OpenPGP-kongrue\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Æu vere krei? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "forviþo de þlosilbloko malsukcesis: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "ne povas krei '%s': %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTO: sekreta þlosilo %08lX eksvalidiøis je %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+#, fuzzy
+msgid "Critical signature policy: "
+msgstr "Subskribo-gvidlinioj: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Subskribo-gvidlinioj: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+#, fuzzy
+msgid "Critical signature notation: "
+msgstr "Subskribo-notacio: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Subskribo-notacio: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Þlosilaro"
+
+#: g10/keylist.c:1505
+#, fuzzy
+msgid "Primary key fingerprint:"
+msgstr "listigi þlosilojn kaj fingroþpurojn"
+
+#: g10/keylist.c:1507
+#, fuzzy
+msgid "     Subkey fingerprint:"
+msgstr "     Þlosilo-fingrospuro ="
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+#, fuzzy
+msgid " Primary key fingerprint:"
+msgstr "     Þlosilo-fingrospuro ="
+
+#: g10/keylist.c:1516
+#, fuzzy
+msgid "      Subkey fingerprint:"
+msgstr "     Þlosilo-fingrospuro ="
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Þlosilo-fingrospuro ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "enkirasigo malsukcesis: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "AVERTO: ekzistas 2 dosieroj kun sekretaj informoj.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s estas la neþanøita\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s estas la nova\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Bonvolu ripari æi tiun eblan sekurecproblemon\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "kontrolas þlosilaron '%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu þlosiloj kontrolitaj (%lu subskriboj)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: þlosilaro kreita\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "la donita gvidlinia URL por subskriboj ne validas\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "el"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "nevalida þlosilaro"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "þlosilo '%s' ne trovita: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "þlosilo '%s' ne trovita: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"subskribita per via þlosilo %08lX je %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "seræas pri \"%s\" æe HKP-servilo %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "nevalida þlosilaro"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "neniu þlosilservilo konata (uzu la opcion --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "þlosilservila eraro"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "þlosilservila eraro"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "listigo de sekretaj þlosiloj malsukcesis: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s: ne valida þlosilidentigilo\n"
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "petas la þlosilon %08lX de HKP-þlosilservilo %s ...\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr ""
+
+#: g10/mainproc.c:291
+#, fuzzy, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s-æifritaj datenoj\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "æifrita per nekonata metodo %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "publika þlosilo estas %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "publikþlosile æifritaj datenoj: bona DEK\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "æifrita per %u-bita %s-þlosilo, %08lX, kreita je %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "            alinome \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "æifrita per %s-þlosilo, %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "publikþlosila malæifrado malsukcesis: %s\n"
+
+#: g10/mainproc.c:508
+#, fuzzy, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "Ripetu pasfrazon\n"
+
+#: g10/mainproc.c:510
+#, fuzzy
+msgid "encrypted with 1 passphrase\n"
+msgstr "Ripetu pasfrazon\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "supozas %s æifritajn datenojn\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "Æifro IDEA ne disponata, optimisme provas uzi %s anstataýe\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "malæifrado sukcesis\n"
+
+#: g10/mainproc.c:585
+#, fuzzy
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVERTO: nenio estis eksportita\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "AVERTO: æifrita mesaøo estis manipulita!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "malæifrado malsukcesis: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTO: sendinto petis konfidencon (\"for-your-eyes-only\")\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "originala dosiernomo='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "memstara revoko - uzu \"gpg --import\" por apliki øin\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Bona subskribo de \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "kontrolo de subskribo estas malþaltita\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "ne povas trakti æi tiujn pluroblajn subskribojn\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "            alinome \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Subskribo farita je %.*s per %s, þlosilo %08lX\n"
+
+#: g10/mainproc.c:1544
+#, fuzzy
+msgid "Key available at: "
+msgstr "Nenia helpo disponata"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "MALBONA subskribo de \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Eksvalidiøinta subskribo de \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Bona subskribo de \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[malcerta]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "            alinome \""
+
+#: g10/mainproc.c:1863
+#, fuzzy, c-format
+msgid "Signature expired %s\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/mainproc.c:1868
+#, fuzzy, c-format
+msgid "Signature expires %s\n"
+msgstr "Æi tiu þlosilo eksvalidiøos je %s.\n"
+
+#: g10/mainproc.c:1871
+#, fuzzy, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s-subskribo de: %s\n"
+
+#: g10/mainproc.c:1872
+#, fuzzy
+msgid "binary"
+msgstr "æefa"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr ""
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+#, fuzzy
+msgid "unknown"
+msgstr "nekonata versio"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Ne povas kontroli subskribon: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "ne aparta subskribo\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "memstara subskribo de klaso 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "malnovstila subskribo (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "nevalida radikpaketo trovita en proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "ne povas malþalti kreadon de core-dosieroj: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "aktualigo de fido-datenaro malsukcesis: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fido-datenaro: lego malsukcesis (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "ne povas trakti publikþlosilan metodon %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "nerealigita æifrad-metodo"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s-subskribo de: %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "NOTO: æifrad-metodo %d ne trovita en preferoj\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "la aldona¼o por la æifro IDEA en æeestas\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = bonvolu montri pli da informoj\n"
+
+#: g10/misc.c:681
+#, fuzzy, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/misc.c:685
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr ""
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "AVERTO: '%s' estas malplena dosiero\n"
+
+#: g10/misc.c:707
+#, fuzzy
+msgid "Uncompressed"
+msgstr "ne traktita"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "ne traktita"
+
+#: g10/misc.c:842
+#, fuzzy, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "æi tiu mesaøo povas ne esti uzebla de PGP 2.x\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "legas opciojn el '%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "nekonata implicita ricevonto '%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Dosiero '%s' ekzistas. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Æu surskribi (j/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: nekonata sufikso\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Donu novan dosiernomon"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "skribas al la normala eligo\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "supozas subskribitajn datenojn en '%s'\n"
+
+#: g10/openfile.c:390
+#, fuzzy, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "%s: nova opcio-dosiero kreita\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: dosierujo kreita\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "ne povas trakti publikþlosilan metodon %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpaketo de speco %d havas þaltitan \"critical bit\"\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent ne estas disponata en æi tiu sesio\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "malbona valoro de la media variablo GPG_AGENT_INFO\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "protokolversio %d de gpg-agent ne estas uzebla\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "ne povas konektiøi al '%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problemo kun agento - malþaltas uzadon de agento\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (æefþlosilo %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Vi bezonas pasfrazon por malþlosi la sekretan þlosilon por la uzanto:\n"
+"\"%.*s\"\n"
+"%u-bita %s þlosilo, ID %08lX, kreita je %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Ripetu pasfrazon\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Donu pasfrazon\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "nuligita de uzanto\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "ne povas kontroli pasvorton en neinteraga reøimo\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Donu pasfrazon: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Vi bezonas pasfrazon por malþlosi la sekretan þlosilon\n"
+"por la uzanto: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bita %s-þlosilo, %08lX, kreita je %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Ripetu pasfrazon: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "ne povas malfermi %s: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "%s: ne estas fido-datenaro\n"
+
+#: g10/photoid.c:165
+#, fuzzy
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Æu tio estas øusta (j/n)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+#, fuzzy
+msgid "unable to display photo ID!\n"
+msgstr "ne povas malfermi %s: %s\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Nenia kialo specifita"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Þlosilo estas anstataýigita."
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Þlosilo estas kompromitita"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Þlosilo estas ne plu uzata"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Uzantidentigilo ne plu validas"
+
+#: g10/pkclist.c:74
+#, fuzzy
+msgid "reason for revocation: "
+msgstr "Kialo por revoko: "
+
+#: g10/pkclist.c:91
+#, fuzzy
+msgid "revocation comment: "
+msgstr "Komento pri revoko: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMfFsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Nenia fidovaloro atribuita al:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "            alinome \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Æi tiu þlosilo verþajne apartenas al la posedanto\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Ne scias\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Ni NE fidas æi tiun þlosilon\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Mi fidas absolute\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = reen al la æefmenuo\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = supersalti æi tiun þlosilon\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " f = fini\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Via decido? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Æu vi vere volas þanøi æi tiun þlosilon al absoluta fido? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Atestiloj, kiuj kondukas al absolute fidata þlosilo:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Estas nenia indiko, ke æi tiu þlosilo vere apartenas al la posedanto\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Estas nenia indiko, ke æi tiu þlosilo vere apartenas al la posedanto\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Æi tiu þlosilo verþajne apartenas al la posedanto\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Æi tiu þlosilo apartenas al ni\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NE estas certe, ke la þlosilo apartenas al sia posedanto.\n"
+"Se vi *vere* scias, kion vi faras, vi povas respondi al\n"
+"la sekva demando per \"jes\"\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Æu tamen uzi æi tiun þlosilon? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "AVERTO: Uzas nefidatan þlosilon!\n"
+
+#: g10/pkclist.c:509
+#, fuzzy
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "AVERTO: Æi tiu þlosilo estas revokita de sia posedanto!\n"
+
+#: g10/pkclist.c:518
+#, fuzzy
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVERTO: Æi tiu þlosilo estas revokita de sia posedanto!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "AVERTO: Æi tiu þlosilo estas revokita de sia posedanto!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Tio povas signifi, ke la subskribo estas falsa.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "AVERTO: Æi tiu subþlosilo estas revokita de sia posedanto!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Noto: Æi tiu þlosilo estas malþaltita.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Noto: Æi tiu þlosilo eksvalidiøis!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "AVERTO: Æi tiu þlosilo ne estas atestita kun fidata subskribo!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Estas nenia indiko, ke la subskribo apartenas al la posedanto.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "AVERTO: Ni NE fidas æi tiun þlosilon!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         La subskribo verþajne estas FALSA.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"AVERTO: Æi tiu þlosilo ne estas atestita kun sufiæe fidataj subskriboj!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Ne estas certe, ke la subskribo apartenas al la posedanto.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ignorita: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ignorita: publika þlosilo jam æeestas\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Vi ne specifis uzantidentigilon. (Vi povas uzi \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Donu la uzantidentigilon. Finu per malplena linio: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Uzantidentigilo ne ekzistas.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "ignorita: publika þlosilo jam difinita kiel implicita ricevonto\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Publika þlosilo estas malþaltita.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "ignorita: publika þlosilo jam agordita\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "nekonata implicita ricevonto '%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: ignorita: publika þlosilo estas malþaltita\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "mankas validaj adresitoj\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "datenoj ne savitaj; uzu la opcion \"--output\" por savi ilin\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "eraro dum kreado de '%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Aparta subskribo.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Bonvolu doni la nomon de la dosiero: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "legas la normalan enigon ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "mankas subskribitaj datenoj\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "ne povas malfermi subskribitan dosieron '%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "nenomita ricevonto; provas per sekreta þlosilo %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "bone; ni estas la nenomita ricevonto.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "malnova kodado de DEK ne estas realigita\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "æifrad-metodo %d%s estas nekonata aý malþaltita\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "NOTO: æifrad-metodo %d ne trovita en preferoj\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTO: sekreta þlosilo %08lX eksvalidiøis je %s\n"
+
+#: g10/pubkey-enc.c:308
+#, fuzzy
+msgid "NOTE: key has been revoked"
+msgstr "þlosilo %08lX: þlosilo estas revokita!\n"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, fuzzy, c-format
+msgid "build_packet failed: %s\n"
+msgstr "aktualigo malsukcesis: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "þlosilo %08lX: mankas uzantidentigilo\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Æu krei revokatestilon por æi tiu subskribo? (j/N)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, fuzzy, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "listigo de þlosilblokoj malsukcesis: %s\n"
+
+#: g10/revoke.c:407
+#, fuzzy
+msgid "Revocation certificate created.\n"
+msgstr "þlosilo %08lX: revokatestilo aldonita\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "þlosilo '%s' ne trovita: %s\n"
+
+#: g10/revoke.c:500
+#, fuzzy, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "skribas publikan þlosilon al '%s'\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr ""
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Æu krei revokatestilon por æi tiu subskribo? (j/N)"
+
+#: g10/revoke.c:535
+#, fuzzy
+msgid "unknown protection algorithm\n"
+msgstr "nekonata densig-metodo"
+
+#: g10/revoke.c:543
+#, fuzzy
+msgid "NOTE: This key is not protected!\n"
+msgstr "Æi tiu þlosilo ne estas protektita.\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+#, fuzzy
+msgid "Please select the reason for the revocation:\n"
+msgstr "Kialo por revoko: "
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+#, fuzzy
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+"\n"
+"Donu la uzantidentigilon. Finu per malplena linio: "
+
+#: g10/revoke.c:716
+#, fuzzy, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Kialo por revoko: "
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Æu tamen uzi æi tiun þlosilon? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "sekretaj þlosilpartoj ne estas disponataj\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "protekto-metodo %d%s ne estas realigita\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "protekto-metodo %d%s ne estas realigita\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Nevalida pasfrazo; bonvolu provi denove"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"AVERTO: Malforta þlosilo trovita - bonvolu þanøi la pasfrazon denove.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "malforta þlosilo kreita - provas denove\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"ne povas eviti malfortajn þlosilojn por simetria æifro; provis %d fojojn!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr ""
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
+"horloøeraro)\n"
+
+#: g10/sig-check.c:195
+#, 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ý "
+"horloøeraro)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTO: subskribo-þlosilo %08lX eksvalidiøis je %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "supozas malbonan subskribon pro nekonata \"critical bit\"\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "þlosilo %08lX: mankas subþlosilo por þlosilbindado\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "þlosilo %08lX: mankas subþlosilo por þlosilbindado\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+
+#: g10/sign.c:107
+#, fuzzy, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVERTO: ne povas %%-kompletigi gvidlinian URL (tro granda); uzas sen "
+"kompletigo.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"AVERTO: ne povas %%-kompletigi gvidlinian URL (tro granda); uzas sen "
+"kompletigo.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"AVERTO: ne povas %%-kompletigi gvidlinian URL (tro granda); uzas sen "
+"kompletigo.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "kontrolo de kreita subskribo malsukcesis: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s-subskribo de: %s\n"
+
+#: g10/sign.c:788
+#, fuzzy
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "eblas subskribi nur per PGP-2.x-stilaj þlosiloj kun --pgp2\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "NOTO: æifrad-metodo %d ne trovita en preferoj\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "subskribas:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"eblas klartekste subskribi nur per PGP-2.x-stilaj þlosiloj kun --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s æifrado estos aplikata\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"þlosilo ne estas markita kiel malsekura - ne povas uzi øin kun falsa "
+"stokastilo!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "ignoris '%s': ripetita\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "ignoris '%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "ignorita: sekreta þlosilo jam æeestas\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"ignoris '%s': æi tio estas PGP-kreita ElGamal-þlosilo, kiu ne estas sekura "
+"por subskribado!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "fido-datenaro %lu, speco %d: skribo malsukcesis: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "eraro dum legado de '%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "pasfrazo estas tro longa\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "%s: nevalida dosiero-versio %d\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importi posedantofido-valorojn"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "eraro dum legado de dosieruja registro: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "kiraso: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "fido-datenaro: sync malsukcesis: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "fido-datenaro loko %lu: lseek malsukcesis: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "fido-datenaro loko %lu: skribo malsukcesis (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "fido-datenaro-transakcio tro granda\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "ne povas fermi '%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: dosierujo ne ekzistas!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "ne povas krei '%s': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "ne povas malfermi '%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: malsukcesis krei versiregistron: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: nevalida fido-datenaro kreita\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: fido-datenaro kreita\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr ""
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: nevalida fido-datenaro\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: malsukcesis krei haktabelon: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: eraro dum aktualigo de versiregistro: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: eraro dum legado de versiregistro: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: eraro dum skribado de versiregistro: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "fido-datenaro: lseek malsukcesis: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "fido-datenaro: lego malsukcesis (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: ne estas fido-datenaro\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: versiregistro kun registronumero %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: nevalida dosiero-versio %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: eraro dum legado de libera registro: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: eraro dum skribo de dosieruja registro: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: malsukcesis nuligi registron: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: malsukcesis aldoni registron: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "la fido-datenaro estas fuþita; bonvolu ruli \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "ne povas trakti tekstliniojn pli longajn ol %d signojn\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "enigata linio pli longa ol %d signojn\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "'%s' ne estas valida longa þlosilidentigilo\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "þlosilo %08lX: akceptita kiel fidata þlosilo\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "þlosilo %08lX aperas pli ol unufoje en la fido-datenaro\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "þlosilo %08lX: mankas publika þlosilo por fidata þlosilo - ignorita\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "þlosilo markita kiel absolute fidata.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "fido-datenaro loko %lu, petospeco %d: lego malsukcesis: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "fido-registro %lu ne havas petitan specon %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "rev"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "eksval"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "nekonata versio"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "kontrolo de fido-datenaro ne estas bezonata\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "sekva kontrolo de fido-datenaro je %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "kontrolo de fido-datenaro ne estas bezonata\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "kontrolo de fido-datenaro ne estas bezonata\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "publika þlosilo %08lX ne trovita: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "kontrolas la fido-datenaron\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+#, fuzzy
+msgid "no ultimately trusted keys found\n"
+msgstr "publika þlosilo de absolute fidata þlosilo %08lX ne trovita\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "publika þlosilo de absolute fidata þlosilo %08lX ne trovita\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "fido-datenaro %lu, speco %d: skribo malsukcesis: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"ne eblis kontroli la subskribon.\n"
+"Bonvolu memori, ke la subskribodosiero (.sig aý .asc)\n"
+"devas esti la unua dosiero donita en la komandlinio.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "enigata linio %u tro longa, aý mankas linifino\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "øenerala eraro"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "nekonata paketo-speco"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "nekonata versio"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "nekonata publikþlosila metodo"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "nekonata kompendi-metodo"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "malbona publika þlosilo"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "malbona sekreta þlosilo"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "malbona subskribo"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "eraro en kontrolsumo"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "malbona pasfrazo"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "publika þlosilo ne trovita"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "nekonata æifrad-metodo"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "ne povas malfermi la þlosilaron"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "nevalida paketo"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "nevalida kiraso"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "uzantidentigilo ne ekzistas"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "sekreta þlosilo ne havebla"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "maløusta sekreta þlosilo uzata"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "ne realigita"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "malbona þlosilo"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "legeraro æe dosiero"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "skriberaro æe dosiero"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "nekonata densig-metodo"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "eraro æe malfermo de dosiero"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "eraro æe kreo de dosiero"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "nevalida pasfrazo"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "nerealigita publikþlosila metodo"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "nerealigita æifrad-metodo"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "nekonata klaso de subskribo"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "eraro en fido-datenaro"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "malbona MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "trafis rimedolimon"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "nevalida þlosilaro"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "malbona atestilo"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "misformita uzantidentigilo"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "eraro æe fermo de dosiero"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "eraro æe renomado de dosiero"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "eraro æe forviþo de dosiero"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "neatendita dateno"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "malkongruo de tempostampoj"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "neuzebla publikþlosila metodo"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "dosiero ekzistas"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "malforta þlosilo"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "nevalida argumento"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "malbona URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "nerealigita URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "reteraro"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "ne æifrita"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "ne traktita"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "neuzebla publika þlosilo"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "neuzebla sekreta þlosilo"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "þlosilservila eraro"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "nuligita de uzanto\n"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "ne æifrita"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "mankas subskribitaj datenoj\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... æi tio estas cimo (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "vi trovis cimon ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+#, fuzzy
+msgid "yes"
+msgstr "jes"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "jJ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "ne"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "fini"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "fF"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "k"
+
+#: util/secmem.c:97
+#, fuzzy
+msgid "WARNING: using insecure memory!\n"
+msgstr "Averto: uzas malsekuran memoron!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "bonvolu vidi http://www.gnupg.org/faq.html por pliaj informoj\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operacio ne eblas sen sekura memoro kun komenca valoro\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(eble vi uzis la maløustan programon por æi tiu tasko)\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "bonvolu vidi http://www.gnupg.org/why-not-idea.html por pliaj informoj\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "notacia nomo devas enhavi nur literojn, ciferojn, punktojn aý substrekojn "
+#~ "kaj fini per '='\n"
+
+#, fuzzy
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "notacia valoro ne povas enhavi stirsignojn\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "notacia valoro ne povas enhavi stirsignojn\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "notacia valoro ne povas enhavi stirsignojn\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "AVERTO: nevalida notacia dateno trovita\n"
+
+#~ msgid "not human readable"
+#~ msgstr "ne homlegebla"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "legi la opciojn el dosiero"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "legi la opciojn el dosiero"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [eksvalidiøos: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "þlosilo %08lX: neeksportebla subskribo (klaso %02x) - ignorita\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "Averto: malsekura posedeco sur %s \"%s\"\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Mankas uzantidentigilo por þlosilo\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "eraro dum kreado de pasfrazo: %s\n"
+
+#, fuzzy
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "nekonata æifrad-metodo"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "ne povas agordi kliento-PID por la agento\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "ne povas akiri lego-FD de servilo por la agento\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "ne povas akiri skribo-FD de servilo por la agento\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "komunikproblemo kun gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "pasfrazo estas tro longa\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "nevalida respondo de agento\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problemo kun agento: agento redonas 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "elekti flankan þlosilon N"
+
+#~ msgid "list signatures"
+#~ msgstr "listigi subskribojn"
+
+#~ msgid "sign the key"
+#~ msgstr "subskribi la þlosilon"
+
+#~ msgid "add a secondary key"
+#~ msgstr "aldoni flankan þlosilon"
+
+#~ msgid "delete signatures"
+#~ msgstr "forviþi subskribojn"
+
+#~ msgid "change the expire date"
+#~ msgstr "þanøi la daton de eksvalidiøo"
+
+#~ msgid "set preference list"
+#~ msgstr "agordi liston de preferoj"
+
+#~ msgid "updated preferences"
+#~ msgstr "aktualigitaj preferoj"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Mankas flanka þlosilo kun indekso %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key uzantidentigilo"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key uzantidentigilo"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "fari apartan subskribon"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "subskribi la þlosilon nerevokeble"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "subskribi la þlosilon loke kaj nerevokeble"
+
+#~ msgid "q"
+#~ msgstr "f"
+
+#~ msgid "help"
+#~ msgstr "helpo"
+
+#~ msgid "list"
+#~ msgstr "listo"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "spuri"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "en"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsub"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fsp"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "øenerala eraro"
+
+#~ msgid "passwd"
+#~ msgstr "pasf"
+
+#~ msgid "save"
+#~ msgstr "skribi"
+
+#~ msgid "fpr"
+#~ msgstr "fsp"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "þlosilo"
+
+#~ msgid "check"
+#~ msgstr "kontroli"
+
+#~ msgid "c"
+#~ msgstr "k"
+
+#~ msgid "sign"
+#~ msgstr "subskribi"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "subskribi"
+
+#~ msgid "lsign"
+#~ msgstr "lsub"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsub"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsub"
+
+#~ msgid "adduid"
+#~ msgstr "aluid"
+
+#~ msgid "addphoto"
+#~ msgstr "alfoto"
+
+#~ msgid "deluid"
+#~ msgstr "foruid"
+
+#~ msgid "delphoto"
+#~ msgstr "forfoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "al"
+
+#~ msgid "delkey"
+#~ msgstr "for"
+
+#, fuzzy
+#~ msgid "addrevoker"
+#~ msgstr "revokita"
+
+#~ msgid "delsig"
+#~ msgstr "forsig"
+
+#~ msgid "expire"
+#~ msgstr "eksval"
+
+#~ msgid "primary"
+#~ msgstr "æefa"
+
+#~ msgid "toggle"
+#~ msgstr "alia"
+
+#~ msgid "t"
+#~ msgstr "a"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "monpref"
+
+#~ msgid "setpref"
+#~ msgstr "agpref"
+
+#~ msgid "updpref"
+#~ msgstr "aktpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "þlosilservila eraro"
+
+#~ msgid "trust"
+#~ msgstr "fido"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "revuid"
+#~ msgstr "revsig"
+
+#~ msgid "revkey"
+#~ msgstr "rev"
+
+#~ msgid "disable"
+#~ msgstr "el"
+
+#~ msgid "enable"
+#~ msgstr "en"
+
+#~ msgid "showphoto"
+#~ msgstr "monfoto"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Kreos novan %s-þlosilparon.\n"
+#~ "                minimuma þlosilgrando estas  768 bitoj\n"
+#~ "               implicita þlosilgrando estas 1024 bitoj\n"
+#~ " plej granda rekomendata þlosilgrando estas 2048 bitoj\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA permesas þlosilgrandon nur inter 512 kaj 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "þlosilgrando tro malgranda; 1024 estas plej eta valoro por RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "þlosilgrando tro malgranda; 768 estas plej eta permesata valoro.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "þlosilgrando tro granda; %d estas plej granda permesata valoro.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Þlosilgrandoj pli grandaj ol 2048 ne estas rekomendataj,\n"
+#~ "æar la komputado daýras TRE longe!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Æu vi estas certa, ke vi deziras æi tiun þlosilgrandon? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Bone, sed pripensu, ke la elradiado de viaj ekrano kaj klavaro estas tre "
+#~ "facile kaptebla!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Eksperimentaj metodoj ne estu uzataj!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "æi tiu æifrad-metodo estas malrekomendata; bonvolu uzi pli normalan!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "skribas al '%s'\n"
+
+#, fuzzy
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "ne povas fari tion en neinteraga reøimo\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "þlosilo '%s' ne trovita: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "ne povas krei '%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "ne povas malfermi %s: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "            alinome \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "þlosilo %08lX: þlosilo estas revokita!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "þlosilo %08lX: subþlosilo estas revokita!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: þlosilo eksvalidiøis\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Ni NE fidas æi tiun þlosilon\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (subskribi kaj æifri)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (nur subskribi)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (subskribi kaj æifri)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (nur æifri)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (subskribi kaj æifri)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: ne povas malfermi: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: AVERTO: malplena dosiero\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "ne povas malfermi %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Mi fidas iomete\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Mi plene fidas\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "eksval"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "subskribita per via þlosilo %08lX je %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   subskribita per %08lX je %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: ne povas aliri: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: ne povas krei þloson\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: ne povas krei þloson\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: ne povas krei: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: ne povas krei dosierujon: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Se vi tamen volas uzi æi tiun revokitan þlosilon, respondu per \"jes\"."
+
+#, fuzzy
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "ne povas malfermi %s: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file: %s\n"
+#~ msgstr "ne povas malfermi %s: %s\n"
+
+#, fuzzy
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "eksporti la posedantofido-valorojn"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (æefþlosilo %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! subþlosilo estas revokita: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- falsita revoko trovita\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problemo en kontrolo de revoko: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [eksvalidiøos: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [eksvalidiøos: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "rev"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "ne povas krei %s: %s\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[dosieroj]|æifri dosierojn"
+
+#~ msgid "store only"
+#~ msgstr "nur skribi"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[dosieroj]|malæifri dosierojn"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "subskribi þlosilon loke kaj nerevokeble"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "listigi nur la sinsekvon de paketoj"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "eksporti la posedantofido-valorojn"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "senintervena aktualigo de fido-datenaro"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "ripari fuþitan fido-datenaron"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "elkirasigi dosieron aý la normalan enigon"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "enkirasigi dosieron aý la normalan enigon"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOMO|uzi NOMOn kiel implicitan ricevonton"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "uzi la implicitan þlosilon kiel implicitan ricevonton"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "tute ne uzi la terminalon"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "devigi v3-subskribojn"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "ne devigi v3-subskribojn"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "devigi v4-subskribojn"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "ne devigi v4-þlosilsubskribojn"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "æiam uzi sigelon (MDC) por æifrado"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "neniam uzi MDC por æifrado"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "uzi gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "neinteraga reøimo: neniam demandi"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "supozi \"jes\" æe la plej multaj demandoj"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "supozi \"ne\" æe la plej multaj demandoj"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "aldoni æi tiun þlosilaron al la listo de þlosilaroj"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "aldoni æi tiun sekretan þlosilaron al la listo"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOMO|uzi NOMOn kiel la implicitan sekretan þlosilon"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|SERVILO|uzi æi tiun þlosilservilon por seræi þlosilojn"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NOMO|difini NOMOn kiel la signaron de la terminalo"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[dosiero]|skribi statusinformojn al dosiero"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KEYID|fidi æi tiun þlosilon absolute"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|DOSIERO|legi aldonan bibliotekon DOSIERO"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "imiti la reøimon priskribitan en RFC 1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "þalti æiujn paket-, æifrad- kaj kompendi-opciojn al OpenPGP-konduto"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "þalti æiujn paket-, æifrad- kaj kompendi-opciojn al PGP-2.x-konduto"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|uzi pasfraz-reøimon N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NOMO|uzi kompendi-metodon NOMO por pasfrazoj"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NOMO|uzi æifrad-metodon NOMO por pasfrazoj"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOMO|uzi æifrad-metodon NOMO"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOMO|uzi kompendi-metodon NOMO"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|uzi densig-metodon N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "forigi la þlosilidentigilon de æifritaj paketoj"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Montri Foto-Identigilojn"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Ne montri Foto-Identigilojn"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Agordi komandlinion por montri Foto-Identigilojn"
+
+#, fuzzy
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "la densig-metodo devas esti inter %d kaj %d\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "la densig-metodo devas esti inter %d kaj %d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Ne estas certe, ke æi tiu þlosilo vere apartenas al la posedanto,\n"
+#~ "sed øi tamen estas akceptita\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "prefero %c%lu ne estas valida\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "þlosilo %08lX: ne estas RFC-2440-þlosilo - ignorita\n"
+
+#, fuzzy
+#~ msgid " (default)"
+#~ msgstr "malæifri datenojn (implicita elekto)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "eraro dum sendo al '%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "sukceso dum sendo al '%s' (statuso=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "malsukceso dum sendo al '%s': statuso=%u\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "ne povas seræi æe þlosilservilo: %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "æi tio estas PGP-kreita ElGamal-þlosilo, kiu NE estas sekura por "
+#~ "subskribado!\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "þlosilo estis kreita %lu sekundon en la estonteco (tempotordo aý "
+#~ "horloøeraro)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "þlosilo estis kreita %lu sekundojn en la estonteco (tempotordo aý "
+#~ "horloøeraro)\n"
+
+#, fuzzy
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "þlosilo markita kiel absolute fidata.\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "kontrolas æe profundo %d subskribita=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%"
+#~ "d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Elektu la uzotan metodon.\n"
+#~ "\n"
+#~ "DSA (alinome DSS) estas la subskrib-metodo uzebla nur por subskribado.\n"
+#~ "Æi tio estas la rekomendata metodo, æar kontrolado æe DSA-subskriboj\n"
+#~ "estas multe pli rapida ol æe ElGamal.\n"
+#~ "\n"
+#~ "ElGamal estas metodo uzebla kaj por subskribado kaj por æifrado.\n"
+#~ "OpenPGP distingas inter du specoj de æi tiu metodo: nuræifra, kaj\n"
+#~ "subskriba-kaj-æifra; efektive temas pri la sama, sed iuj parametroj\n"
+#~ "devas esti elektitaj en speciala maniero por krei sekuran þlosilon\n"
+#~ "por subskribado: æi tiu programo faras tion, sed aliaj OpenPGP-\n"
+#~ "programoj ne devas kompreni la subskriban-kaj-æifran specon.\n"
+#~ "\n"
+#~ "La unua (æefa) þlosilo devas esti þlosilo uzebla por subskribado;\n"
+#~ "tial la nuræifra ElGamal-þlosilo ne estas proponata en æi tiu menuo."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Kvankam æi tiuj þlosiloj estas difinitaj en RFC 2440, ili ne estas\n"
+#~ "rekomendataj, æar ili ne estas komprenataj de æiuj programoj, kaj\n"
+#~ "subskriboj kreitaj per ili etas iom grandaj kaj malrapide kontroleblaj."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu þlosiloj jam kontrolitaj (%lu subskriboj)\n"
+
+#, fuzzy
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "þlosilo %08lX: mankas uzantidentigilo\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "fini"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (subskribi kaj æifri)\n"
+
+#, fuzzy
+#~ msgid "Create anyway? "
+#~ msgstr "Æu tamen uzi æi tiun þlosilon? "
+
+#, fuzzy
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "nevalida kompendi-metodo '%s'\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr "Uzado de æi tiu algoritmo estas malrekomendata - æu tamen krei? "
+
+#, fuzzy
+#~ msgid ""
+#~ "you have to start GnuPG again, so it can read the new configuration file\n"
+#~ msgstr ""
+#~ "vi devas restartigi GnuPG, por ke øi povu legi la novan opcio-dosieron\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "þanøo de permesoj de '%s' malsukcesis: %s\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "             Fingrospuro:"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NOMO=VALORO|uzi æi tiun notacian datenon"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr "la unua signo de notacia nomo devas esti litero aý substreko\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr "punktoj en notacia nomo devas esti inter aliaj signoj\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "AVERTO: Æi tiu þlosilo jam havas foto-identigilon.\n"
+#~ "        Aldono de alia foto-identigilo eble konfuzos iujn versiojn de "
+#~ "PGP.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Eblas havi nur unu foto-identigilon sur þlosilo.\n"
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "Æu vi vere bezonas tiom grandan þlosilgrandon? "
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "þlosilo %08lX: nia kopio ne havas mem-subskribon\n"
+
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "  Æu vi estas certa, ke vi ankoraý volas subskribi øin?\n"
+
+#~ msgid "   signed by %08lX at %s\n"
+#~ msgstr "   subskribita per %08lX je %s\n"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key uzantidentigilo"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key uzantidentigilo"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "ignorita: publika þlosilo jam difinita per --encrypt-to\n"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "iImMfF"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NOMOJ]|kontroli la fido-datenaron"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Ne povis trovi validan fidovojon al la þlosilo. Ni vidu, æu eblas\n"
+#~ "atribui iujn mankantajn posedantofido-valorojn.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nenia vojo trovita, kiu kondukas al unu el niaj þlosiloj.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Neniom da atestiloj trovitaj kun nedifinita fidovaloro.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Neniuj fidovaloroj þanøitaj.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr "%08lX: mankas informoj por kalkuli fidovaloron\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: eraro dum kontrolo de þlosilo: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr "tro da registroj en unk-staplo - malþaltas\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr "supozas malbonan sigelon (MDC) pro nekonata \"critical bit\"\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "eraro dum legado de dosieruja registro por LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr "lid %lu: atendis dosierujan registron, trovis specon %d\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "mankas æefa þlosilo por LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "eraro dum legado de æefa þlosilo por LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "þlosilo %08lX: peto-registro malsukcesis\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "þlosilo %08lX: jam en tabelo de fidataj þlosiloj\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "NOTO: sekreta þlosilo %08lX NE estas protektita.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr "þlosilo %08lX: sekreta kaj publika þlosiloj ne kongruas\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "þlosilo %08lX.%lu: Bona subþlosila bindado\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "þlosilo %08lX.%lu: Nevalida subþlosila bindado: %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "þlosilo %08lX.%lu: Valida þlosilrevoko\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "þlosilo %08lX.%lu: Nevalida þlosilrevoko: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Bona mem-subskribo"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Nevalida mem-subskribo"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr "Valida uzantidentigil-revoko ignorita pro pli nova mem-subskribo"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Valida uzantidentigil-revoko"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Nevalida uzantidentigil-revoko"
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Valida atestilrevoko"
+
+#~ msgid "Good certificate"
+#~ msgstr "Bona atestilo"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Nevalida atestilrevoko"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Nevalida atestilo"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "subskribo-registro %lu[%d] montras al maløusta registro.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "ripetita atestilo - forviþita"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "tdbio_search_dir malsukcesis: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: enþovo malsukcesis: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: enþovo malsukcesis: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: enþovita\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu þlosiloj enþovitaj\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: dosieruja registro sen þlosilo - ignorita\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "\t%lu pro novaj publikaj þlosiloj\n"
+
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu þlosiloj ignoritaj\n"
+
+#~ msgid "\t%lu keys updated\n"
+#~ msgstr "\t%lu þlosiloj aktualigitaj\n"
+
+#~ msgid "Ooops, no keys\n"
+#~ msgstr "Hu, mankas þlosiloj\n"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Hu, mankas uzantidentigiloj\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr "check_trust: seræo pri dosieruja registro malsukcesis: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr "þlosilo %08lX: enþovo de fidoregistro malsukcesis: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "þlosilo %08lX.%lu: enþovis en fido-datenaron\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "þlosilo %08lX.%lu: kreita en la estonteco (tempotordo aý horloøeraro)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "þlosilo %08lX.%lu: eksvalidiøis je %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "þlosilo %08lX.%lu: fido-kontrolo malsukcesis: %s\n"
+
+#~ msgid "user '%s' not found: %s\n"
+#~ msgstr "uzanto '%s' ne trovita: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr "problemo dum trovo de '%s' en fido-datenaro: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr "uzanto '%s' ne estas en fido-datenaro - enþovas\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "malsukcesis meti '%s' en fido-datenaron: %s\n"
+
+#~ msgid "too many random bits requested; the limit is %d\n"
+#~ msgstr "tro da stokastaj bitoj petitaj; la limo estas %d\n"
+
+#~ msgid "For info see http://www.gnupg.org"
+#~ msgstr "Por informoj vidu http://www.gnupg.org"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr "Æu vi vere volas krei subskriban kaj æifran þlosilon? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: uzanto ne trovita: %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "problemo æe legado de atestilo: %s\n"
+
+#~ msgid "can't lock keyring `%s': %s\n"
+#~ msgstr "ne povas þlosi la þlosilaron '%s': %s\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: uzanto ne trovita\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr "AVERTO: ne povas trakti longajn preferoregistrojn\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: ne povas krei þlosilaron: %s\n"
+
+#~ msgid "RSA key cannot be used in this version\n"
+#~ msgstr "RSA-þlosilo ne estas uzebla kun æi tiu versio\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "Mankas þlosilo por uzantidentigilo\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "mankas sekreta þlosilo por malæifrado\n"
diff --git a/po/es.gmo b/po/es.gmo
new file mode 100644 (file)
index 0000000..86a514e
Binary files /dev/null and b/po/es.gmo differ
diff --git a/po/es.po b/po/es.po
new file mode 100644 (file)
index 0000000..68c5d0e
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,7467 @@
+# Mensajes en español para GnuPG.
+# Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
+# Urko Lusa <ulusa@euskalnet.net>, 1998, 1999.
+#  I've tried to mantain the terminology used by Armando Ramos
+#  <armando@clerval.org> in his PGP 2.3.6i translation.
+#  I also got inspiration from it.po by Marco d'Itri <md@linux.it>
+# Jaime Suárez <jsuarez@ono.com>, 2001-2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU gnupg 1.4.1\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-03-25 16:50+0100\n"
+"Last-Translator: Jaime Suárez <jsuarez@ono.com>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "no se puede generar un primo con pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "no se puede generar un primo con menos de %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "no se ha detectado módulo acumulador de entropía\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "no se puede bloquear `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "escribiendo clave privada en `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "no se puede abrir `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "no se puede obtener información de `%s': %s\n"
+
+# ignore no es ignorar, es no tener en cuenta, ignorar es not to know.
+# Sugerencia: descartar.
+# Sugerencia a la sugerencia: ¿qué tal omitido? (pasar en silencio una
+# cosa; excluirla de lo que se habla o escribe) dice el diccionario.
+# Bien. También se puede poner "descartado".
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s` no es un fichero regular - descartado\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "nota: el fichero de semillas aleatorias está vacío\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"ATENCIÓN: tamaño incorrecto del fichero de semillas aleatorias - no se usa\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "no se puede leer `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "nota: el fichero de semillas aleatorias no se ha actualizado\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "no se puede crear %s: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "no se puede escribir `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "no se puede cerrar `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "ATENCIÓN: ¡usando un generador de números aleatorios inseguro!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"El generador de números aleatorios es sólo un apaño\n"
+"para poder compilar. ¡No es en absoluto un generador seguro!\n"
+"\n"
+"¡NO USE DATOS GENERADOS POR ESTE PROGRAMA!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Por favor espere, se está reuniendo entropía. Haga alguna otra cosa con\n"
+"el ordenador mientras tanto si eso hace que no se aburra, porque eso\n"
+"mejorará la calidad de la entropía.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"No hay suficientes bytes aleatorios disponibles. Por favor, haga algún\n"
+"otro trabajo para que el sistema pueda recolectar más entropía\n"
+"(se necesitan %d bytes más).\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "fallo al almacenar la huella digital: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "fallo guardando la fecha de creación: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "fallo leyendo la clave\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "la respuesta no incluye la clave pública\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "la respuesta no incluye el módulo RSA\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "la respuesta no incluye el exponente público RSA\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "la función de manejo del PIN devolvió un error: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "El PIN para CHV%d es demasiado corto; longitud mínima %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "la verificación CHV%d falló: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "el acceso a órdenes de administrador no está configurado\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "error recuperando el estatus CHV de la tarjeta\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "¡la tarjeta está bloqueada permanentemente!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+"%d intentos quedan para PIN de administrador antes de "
+"bloquearpermanentemente la clave\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|PIN Administrador"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Nuevo PIN Administrador"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Nuevo PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "error obteniendo nuevo PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "error leyendo datos de la aplicación\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "error leyendo huella digital DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "la clave ya existe\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "la clave existente será reemplazada\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "generando nueva clave\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, fuzzy, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "exponente público demasiado grande (más de 32 bits)\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "fallo al almacenar la clave: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "por favor, espere mientras se genera la clave ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "la generación de la clave falló\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "generación de clave completada (%d segundos)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "estructura de la tarjeta OpenPGP inválida (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "firma %s, algoritmo de resumen %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "firmas creadas hasta ahora: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, fuzzy, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "PIN [firmas hechas: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "no se puede acceder a %s - ¿tarjeta OpenPGP inválida?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armadura: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "cabecera de armadura inválida: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "cabecera de armadura: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "cabecera de firma clara inválida\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "firmas en texto claro anidadas\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "armadura inesperada: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "Línea con guiones inválida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "caracter inválido radix64 %02X omitido\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "Fin de fichero prematuro (falta suma de comprobación)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "Fin de suma de comprobación prematuro\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "Suma de comprobación mal creada\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "Error en suma de comprobación: %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "fin de fichero prematuro (en el cierre)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "error en la línea de cierre\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "no se han encontrados datos OpenPGP válidos\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armadura incorrecta: línea más larga de %d caracteres\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"caracter \"quoted printable\" en la armadura - probablemente se usó\n"
+"un MTA defectuoso\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "tarjeta OpenPGP no disponible: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "tarjeta OpenPGP num. %s detectada\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "imposible hacer esto en modo de proceso por lotes\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Su elección: "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[no establecido]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "hombre"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "mujer"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "no especificado"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "no forzado"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "forzado"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Error: sólo se permite ASCII sin formato actualmente.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Error: El caracter \"<\" no puede usarse.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Error: no se permiten dobles espacios.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Apellido del titular de la tarjeta: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Nombre del titular de la tarjeta: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Error: nombre combinado demasiado largo (máximo %d caracteres).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL de donde recuperar la clave pública: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Error: URL demasiado larga (el máximo son %d caracteres).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "error leyendo `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Datos de login (nombre de la cuenta): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Error: el login es demasiado largo (límite de %d caracteres).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Datos privados: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+"Error: los datos privados son demasiado largos (límite de %d caracteres).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Preferencias de idioma: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Error: longitud de la cadena de preferencias inválida.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Error: caracteres inválidos en cadena de preferencias.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Sexo ((H)ombre, (M)mujer o espacio): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Error: respuesta no válida.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "Huella dactilar CA:"
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Error: formato inválido de huella dactilar.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "la operación con la clave no es posible: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "no es una tarjeta OpenPGP"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "error obteniendo la información actual de la clave: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "¿Reemplazar la clave existente? (s/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+"¿Hacer copia de seguridad externa a la tarjeta de clave de cifrado? (S/n)"
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "¿Reemplazar las claves existentes? (s/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Por favor observe que los valores de fábrica del PIN son\n"
+"   PIN = `%s'     PIN Administrador = `%s'\n"
+"Debería cambiarlos usando la orden --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Por favor seleccione tipo de clave que generar:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "    (1) Clave de firmado\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Clave de cifrado\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Clave de autentificación\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Elección inválida.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Por favor elija donde guardar la clave:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "algoritmo de protección de clave desconocido\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "las partes secretas de la clave no están disponibles\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "clave secreta ya almacenada en una tarjeta\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "sale de este menú"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "ver órdenes de administrador"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "muestra esta ayuda"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "listar todos los datos disponibles"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "cambiar el nombre del titular de la tarjeta"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "cambiar URL de donde obtener la clave"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "recuperar la clave especificada en la URL de la tarjeta"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "cambiar nombre de usuario"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "cambiar preferencias de idioma"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "cambiar sexo del titular de la tarjeta"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "cambiar huella dactilar de una CA"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "cambiar estado de la opción forzar firma del PIN"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "generar nuevas claves"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "menú para cambiar o desbloquear el PIN"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Orden> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Órdenes sólo de administrador\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Se permiten órdenes de administrador\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "No se permiten órdenes de administrador\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Orden inválida (pruebe \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "clave secreta no disponible"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "Inserte la tarjeta y pulse Intro o escriba 'c' para cancelar: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "borrado de bloque de anillo de claves fallido: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Por favor retire la tarjeta actual e inserte la de número de serie:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Pulse Intro cuando esté listo"
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Introduzca nuevo PIN de administrador: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Introduzca el nuevo PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Introduzca PIN de administrador: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Introduzca PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Repita este PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN repetido incorrectamente; inténtelo de nuevo"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "no se puede abrir `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output no funciona con esta orden\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "clave \"%s\" no encontrada: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "error leyendo bloque de claves: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(excepto si especifica la clave dando su huella digital)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "imposible hacer esto en modo de proceso por lotes sin \"--yes\"\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "¿Eliminar esta clave del anillo? (s/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "¡Es una clave secreta! ¿Eliminar realmente? (s/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "borrado de bloque de anillo de claves fallido: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "borrada información de propietarios\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "¡hay una clave secreta para esta clave pública! \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "use antes la opción \"--delete-secret-key\" para borrarla.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "error creando frase contraseña: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "no puede usar un paquete simétrico ESK debido al modo S2K\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "usando cifrado %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' ya está comprimido\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "ATENCIÓN `%s' es un fichero vacío\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "solo puede cifrar a claves RSA de 2048 bits o menos en modo --pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "leyendo desde `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"no se puede usar el algoritmo IDEA para todas las claves a las que cifra.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"AVISO: forzar el cifrado simétrico %s (%d) viola las preferencias\n"
+"del destinatario\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"AVISO: forzar el algoritmo de compresión %s (%d) va en contra\n"
+"de las preferencias del receptor\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forzar el cifrado simétrico %s (%d) viola las preferencias\n"
+"del destinatario\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "no puede usar %s en modo %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s cifrado para: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "datos cifrados %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "cifrado con algoritmo desconocido %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ATENCIÓN: mensaje cifrado con una clave débil en el cifrado simétrico.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problema trabajando con un paquete cifrado\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "no es posible ejecutar programas remotos\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "no se puede crear el directorio `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"llamadas a programas externos inhabilitadas por permisos inseguros de "
+"ficheros.\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"esta plataforma necesita ficheros temporales para llamar a programas "
+"externos\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "no se puede ejecutar el programa `%s': %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "no se puede ejecutar el intérprete de órdenes `%s': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "error del sistema llamando al programa externo: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "el programa externo finalizó anormalmente\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "no se puede ejecutar el programa externo\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "no se puede leer la respuesta del programa externo: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "AVISO: no se puede borrar fichero temporal (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "AVISO: no se puede borrar el fichero temporal `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "La firma se marcará como no revocable.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "no se encuetran claves de revocación para \"%s\"\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revoca clave o subclaves seleccionadas"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "clave secreta inutilizable"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "no se permite exportar claves secretas\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "clave %s: no protegida - omitida\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "clave %s: clave estilo PGP 2.x - omitida\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "clave %s: firma de subclave en lugar equivocado - omitida\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "fallo al almacenar la clave: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "AVISO: la clave secreta %s no tiene suma de comprobación simple SK\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ATENCIÓN: no se ha exportado nada\n"
+
+# Órdenes, please...
+# Sí, este no he podido ser yo :-) Por cierto, ¿por qué la O no se
+# puede acentuar? ¿demasiado alta?
+# ¿Quién dice que no se puede? :-)
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Órdenes:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[file]|crea una firma"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[file]|crea una firma en texto claro"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "crea una firma separada"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "cifra datos"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "cifra sólo con un cifrado simétrico"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "descifra datos (predefinido)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifica una firma"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "lista claves"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "lista claves y firmas"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "lista y comprueba firmas de las claves"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "lista claves y huellas dactilares"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "lista claves secretas"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "genera un nuevo par de claves"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "elimina claves del anillo público"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "elimina claves del anillo privado"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "firma la clave"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "firma la clave localmente"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "firma o modifica una clave"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "genera un certificado de revocación"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exporta claves"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exporta claves a un servidor de claves"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importa claves desde un servidor de claves"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "busca claves en un servidor de claves"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "actualiza todas las claves desde un servidor de claves"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importa/fusiona claves"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "escribir estado de la tarjeta"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "cambiar datos en la tarjeta"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "cambiar el PIN de la tarjeta"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "actualiza la base de datos de confianza"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [ficheros]|imprime resúmenes de mensaje"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opciones:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "crea una salida ascii con armadura"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOMBRE|cifra para NOMBRE"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "usa este usuario para firmar o descifrar"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|nivel de compresión N (0 no comprime)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "usa modo de texto canónico"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "usa como fichero de salida"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "prolijo"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "no hace ningún cambio"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "preguntar antes de sobreescribir"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "usar estilo OpenPGP estricto"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "generar mensajes compatibles con PGP 2.x"
+
+# ordenes -> órdenes
+# página man -> página de manual
+# Vale. ¿del manual mejor?
+# Hmm, no sé, en man-db se usa "de". La verdad es que no lo he pensado.
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Véase en la página del manual la lista completo de órdenes y opciones)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Ejemplos:\n"
+"\n"
+" -se -r Bob [fichero]       firma y cifra para el usuario Bob\n"
+" --clearsign [fichero]      hace una firma manteniendo el texto sin cifrar\n"
+" --detach-sign [fichero]    hace una firma separada\n"
+" --list-keys [nombres]      muestra las claves\n"
+" --fingerprint [nombres]    muestra las huellas dactilares\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Por favor, informe de posibles \"bugs\" a <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Uso: gpg [opciones] [ficheros] (-h para ayuda)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaxis: gpg [opciones] [ficheros]\n"
+"firma, comprueba, cifra o descifra\n"
+"la operación por defecto depende de los datos de entrada\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmos disponibles:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Clave pública: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cifrado: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Resumen: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compresión: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "uso: gpg [opciones] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "órdenes incompatibles\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no se encontró el signo = en la definición de grupo `%s'\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "AVISO: propiedad insegura del directorio personal `%s'\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "AVISO: propiedad insegura del fichero de configuración `%s'\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "AVISO: propiedad insegura de la extensión `%s'\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "AVISO: permisos inseguros del directorio personal `%s'\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "AVISO: permisos inseguros del fichero de configuración `%s'\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "AVISO: permisos inseguros de la extensión `%s'\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "AVISO: propiedad insegura del directorio contenedor de `%s'\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"AVISO: propiedad insegura del directorio contenedor del fichero de\n"
+"configuración `%s'\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"AVISO: propiedad insegura del directorio contenedor de la extensión `%s'\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "AVISO: permisos inseguros del directorio contenedor de `%s'\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"AVISO: permisos inseguros del directorio contenedor del fichero de\n"
+"configuración `%s'\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"AVISO: permisos inseguros del directorio contenedor de la extensión `%s'\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "artículo de configuración desconocido `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "No existe la firma correspondiente en el anillo secreto\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "la URL del servidor de claves preferido no es válida\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "muestra en qué anillos está una clave"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "No existe la firma correspondiente en el anillo secreto\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTA: se ignora el antiguo fichero de opciones predefinidas `%s'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTA: no existe el fichero de opciones predefinido `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "fichero de opciones `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "leyendo opciones desde `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTA: ¡%s no es para uso normal!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "no se carga el cifrado de ampliación `%s' por permisos inseguros\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' no es un juego de caracteres válido\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' no es un juego de caracteres válido\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "no se puede interpretar la URL del servidor de claves\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: opciones del servidor de claves inválidas\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "opciones del servidor de claves inválidas\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opciones de importación inválidas\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opciones de importación inválidas\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: opciones de exportación inválidas\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opciones de exportación inválidas\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: lista de opciones inválida\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "lista de opciones inválida\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "`%s' no es un juego de caracteres válido\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "la URL del servidor de claves preferido no es válida\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "`%s' no es un juego de caracteres válido\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: opciones de verificación inválidas\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "opciones de verificación inválidas\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "imposible establecer camino de ejecutables %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: opciones de verificación inválidas\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "ATENCIÓN: ¡el programa podría volcar un fichero core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "AVISO: %s sustituye a %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "¡%s no permitido con %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "¡%s no tiene sentido con %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "el agente gpg no esta disponible en esta sesión\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "no se ejecutará en memoria insegura por %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "sólo puede hacer firmas separadas o en claro en modo --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "no puede firmar y cifrar a la vez en modo --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "debe usar ficheros (no tuberías) si trabaja con --pgp2 activo.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "cifrar un mensaje en modo --pgp2 requiere el algoritmo IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "el algoritmo de cifrado seleccionado es inválido\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "el algoritmo de resumen seleccionado no inválido\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "el algoritmo de compresión seleccionado es inválido\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "el algoritmo de certificación por resumen elegido es inválido\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed debe ser mayor que 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed debe ser mayor que 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth debe estar en el rango de 1 a 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "default-cert-level inválido; debe ser 0, 1, 2, ó 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "min-cert-level inválido; debe ser 0, 1, 2, ó 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTA: el modo S2K simple (0) no es nada recomendable\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "modo S2K incorrecto; debe ser 0, 1 o 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "preferencias por defecto inválidas\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "preferencias personales de cifrado inválidas\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "preferencias personales de algoritmo de resumen inválidas\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "preferencias personales de compresión inválidas\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s aún no funciona con %s\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "no puede usar el cifrado `%s' en modo %s\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "no puede usar el resumen `%s' en modo %s\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "no puede usar la compresión `%s' en modo %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "inicialización de la base de datos de confianza fallida: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr "AVISO: se indicaron receptores (-r) sin clave pública de cifrado\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nombre_fichero]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nombre_fichero]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "el cifrado simétrico de `%s' falló: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nombre_fichero]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [nombre_fichero]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "no puede usar --symetric --encrypt con --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "no puede usar --symetric --encrypt en modo %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nombre_fichero]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nombre_fichero]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [nombre_fichero]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "no puede usar --symetric --sign --encrypt con --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "no puede usar --symmetric --sign --encrypt en modo %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [nombre_fichero]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nombre_fichero]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nombre_fichero]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id-usuario"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id-usuario"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id-usuario [órdenes]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id-usuario] [anillo]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "envío al servidor de claves fallido: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "recepción del servidor de claves fallida: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "exportación de clave fallida: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "búsqueda del servidor de claves fallida: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "renovación al servidor de claves fallida: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "eliminación de armadura fallida: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "creación de armadura fallida: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritmo de distribución inválido `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nombre_fichero]"
+
+# Falta un espacio.
+# En español no se deja espacio antes de los puntos suspensivos
+# (Real Academia dixit) :)
+# Tomo nota :-). Este comentario déjalo siempre.
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Adelante, teclee su mensaje...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "URL de política de certificado inválida\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "URL de política inválida\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "la URL del servidor de claves preferido no es válida\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "demasiados registros en la cache pk - anulada\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[ID de usuario no encontrado]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "no hay subclave secreta para la subclave pública %s - ignorada\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "usando subclave %s en vez de clave primaria %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "clave %s: clave secreta sin clave pública - omitida\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "algo más discreto"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "tomar las claves de este anillo"
+
+# o tal vez "en el sello..."
+# Creo que es mejor "con el sello de fecha", no es un conflicto
+# del sello en si mismo sino en relación con el mensaje.
+# Ok.
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "hacer que los conflictos de fecha-hora sean sólo un aviso"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|DF|escribe información de estado en este descriptor de fichero"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Uso: gpgv [opciones] [ficheros] (-h para ayuda)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintaxis: gpg [opciones] [ficheros]\n"
+"Confrontar las firmas contra claves conocidas\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Está en su mano asignar un valor aquí. Dicho valor nunca será exportado a\n"
+"terceros. Es necesario para implementar la red de confianza, no tiene nada\n"
+"que ver con la red de certificados (implícitamente creada)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Para construir la Red-de-Confianza, GnuPG necesita saber qué claves\n"
+"tienen confianza absoluta - normalmente son las claves para las que usted\n"
+"puede acceder a la clave secreta. Conteste \"sí\" para hacer que esta\n"
+"clave se considere como de total confianza\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "Si quiere usar esta clave no fiable de todos modos, conteste \"sí\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Introduzca el ID de usuario al que quiere enviar el mensaje."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Seleccione el algoritmo que usar.\n"
+"\n"
+"DSA (alias DSS) es el Algoritmo de Firma Digital y sólo se usa para firmas.\n"
+"\n"
+"Elgamal es un algoritmo sólo para cifrar.\n"
+"\n"
+"RSA sirve tanto para firmar como para cifrar.\n"
+"\n"
+"La primera clave (clave primaria) debe ser siempre de tipo capaz de firmar."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"En general no es una buena idea usar la misma clave para firmar y\n"
+"cifrar. Este algoritmo debéria usarse solo en ciertos contextos.\n"
+"Por favor consulte primero a un experto en seguridad."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Introduzca la longitud de la clave"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Responda \"sí\" o \"no\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Introduzca el valor requerido conforme se muestra.\n"
+"Es posible introducir una fecha ISO (AAAA-MM-DD), pero no se obtendrá una\n"
+"buena respuesta a los errores; el sistema intentará interpretar el valor\n"
+"introducido como un intervalo."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Introduzca el nombre del dueño de la clave"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+"Introduzca una dirección de correo electrónico (opcional pero muy\n"
+"recomendable)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Introduzca un comentario opcional"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  para cambiar el nombre.\n"
+"C  para cambiar el comentario.\n"
+"E  para cambiar la dirección.\n"
+"O  para continuar con la generación de clave.\n"
+"S  para interrumpir la generación de clave."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Responda \"sí\" (o sólo \"s\") para generar la subclave."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Cuando firme un ID de usuario en una clave, debería verificar que la clave\n"
+"pertenece a la persona que se nombra en el ID de usuario. Es útil para\n"
+"otros saber cómo de cuidadosamente lo ha verificado.\n"
+"\n"
+"\"0\" significa que no hace ninguna declaración concreta sobre como ha\n"
+"      comprobado la validez de la clave.\n"
+"\n"
+"\"1\" significa que cree que la clave pertenece a la persona que declara\n"
+"      poseerla pero no pudo o no verificó la clave en absoluto. Esto es "
+"útil\n"
+"      para una verificación en persona cuando firmas la clave de un usuario\n"
+"      pseudoanónimo.\n"
+"\n"
+"\"2\" significa que hizo una comprobación informal de la clave. Por ejemplo\n"
+"      podría querer decir que comprobó la huella dactilar de la clave y\n"
+"      comprobó el ID de usuario en la clave con un ID fotográfico.\n"
+"\n"
+"\"3\" significa que hizo una comprobación exhaustiva de la clave. Por\n"
+"      ejemplo verificando la huella dactilar de la clave con el propietario\n"
+"      de la clave, y que comprobó, mediante un documento difícil de "
+"falsificar\n"
+"      con ID fotográfico (como un pasaporte) que el nombre del poseedor de "
+"la\n"
+"      clave coincide con el ID de usuario en la clave y finalmente que "
+"verificó\n"
+"      (intercambiando email) que la dirección de email de la clave "
+"pertenece\n"
+"      al poseedor de la clave.\n"
+"\n"
+"Observe que los ejemplos dados en los niveles 2 y 3 son *solo* ejemplos.\n"
+"En definitiva, usted decide lo que significa \"informal\" y \"exhaustivo\"\n"
+"para usted cuando firma las claves de otros.\n"
+"\n"
+"Si no sabe qué contestar, conteste \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Responda \"sí\" si quiere firmar TODOS los IDs de usuario"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Responda \"sí\" si realmente quiere borrar este ID de usuario.\n"
+"¡También se perderán todos los certificados!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Responda \"sí\" si quiere borrar esta subclave"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Esta es una firma válida de esta clave. Normalmente no será deseable\n"
+"borrar esta firma ya que puede ser importante para establecer una conexión\n"
+"de confianza con la clave o con otra clave certificada por ésta."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Esta firma no puede ser comprobada porque no tiene Vd. la clave\n"
+"correspondiente. Debería posponer su borrado hasta conocer qué clave\n"
+"se usó, ya que dicha clave podría establecer una conexión de confianza\n"
+"a través de otra clave certificada."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "Esta firma no es válida. Tiene sentido borrarla de su anillo."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Esta es una firma que une el ID de usuario a la clave. No suele ser una\n"
+"buena idea borrar dichas firmas. De hecho, GnuPG podría no ser capaz de\n"
+"volver a usar esta clave. Así que bórrela tan sólo si esta autofirma no\n"
+"es válida por alguna razón y hay otra disponible."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Cambiar las preferencias de todos los IDs de usuario (o sólo los \n"
+"seleccionados) a la lista actual de preferencias. El sello de tiempo\n"
+"de todas las autofirmas afectadas se avanzará en un segundo.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Por favor introduzca la contraseña: una frase secreta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Repita la última frase contraseña para asegurarse de lo que tecleó."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Introduzca el nombre del fichero al que corresponde la firma"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Responda \"sí\" para sobreescribir el fichero"
+
+# Sugerencia: ENTER -> INTRO.
+# Aceptada.
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Introduzca un nuevo nombre de fichero. Si pulsa INTRO se usará el fichero\n"
+"por omisión (mostrado entre corchetes)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Debería especificar un motivo para la certificación. Dependiendo del\n"
+"contexto puede elegir una opción de esta lista:\n"
+"  \"La clave ha sido comprometida\"\n"
+"      Use esto si tiene razones para pensar que personas no autorizadas\n"
+"      tuvieron acceso a su clave secreta.\n"
+"  \"La clave ha sido sustituida\"\n"
+"      Use esto si ha reemplazado la clave por otra más nueva.\n"
+"  \"La clave ya no está en uso\"\n"
+"      Use esto si ha dejado de usar esta clave.\n"
+"  \"La identificación de usuario ya no es válida\"\n"
+"      Use esto para señalar que la identificación de usuario no debería\n"
+"      seguir siendo usada; esto se utiliza normalmente para marcar una\n"
+"      dirección de correo-e como inválida.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Si lo desea puede introducir un texto explicando por qué emite\n"
+"este certificado de revocación. Por favor, que el texto sea breve.\n"
+"Una línea vacía pone fin al texto.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Ayuda no disponible"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "No hay ayuda disponible para `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "actualiza la base de datos de confianza"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "¡la clave pública y la privada no se corresponden!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "clave secreta inutilizable"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "omitiendo bloque de tipo %d\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu claves procesadas hasta ahora\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Cantidad total procesada: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      omitidas nuevas claves: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          sin identificador: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              importadas: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             sin cambios: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "     nuevos identificativos: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           nuevas subclaves: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "              nuevas firmas: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "        nuevas revocaciones de claves: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "     claves secretas leídas: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr " claves secretas importadas: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "claves secretas sin cambios: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "          no importadas: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "firmas creadas hasta ahora: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "     claves secretas leídas: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "AVISO: la clave %s contiene preferencias para no disponible\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "algoritmos en estos IDs de usuarios:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": algoritmo de cifrado preferido %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": algoritmo de resumen preferido %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         \"%s\": algoritmo de compresión preferido %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "se recomienda encarecidamente que actualice sus preferencias y\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"re-dustribuya esta clave para evitar potenciales problemas de\n"
+"diferencias en los algoritmos.\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+"puede actualizar sus preferencias con: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "clave %s: sin identificador de usuario\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "clave %s: reparada la subclave PKS corrompida\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "clave %s: aceptado ID de usuario sin autofirma \"%s\"\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "clave %s: sin identificadores de usuario válidos\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "esto puede ser debido a la ausencia de autofirma\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "clave %s: clave pública no encontrada: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "clave %s: clave nueva - omitida\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "anillo de claves no escribible encontrado: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "escribiendo en `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "error escribiendo anillo `%s': %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "clave %s: clave pública \"%s\" importada\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "clave %s: no coincide con nuestra copia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "clave %s: no puede localizarse el bloque de claves original: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "clave %s: no puede leerse el bloque de claves original: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "clave %s: \"%s\" 1 ID de usuario nuevo\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "clave %s: \"%s\" %d nuevos identificadores de usuario\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "clave %s: \"%s\" 1 firma nueva\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "clave %s: \"%s\" %d firmas nuevas\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "clave %s: \"%s\" 1 subclave nueva\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "clave %s: \"%s\" %d subclaves nuevas\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "clave %s: \"%s\" %d firmas nuevas\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "clave %s: \"%s\" %d firmas nuevas\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "clave %s: \"%s\" %d nuevos identificadores de usuario\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "clave %s: \"%s\" %d nuevos identificadores de usuario\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "clave %s: \"%s\" sin cambios\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "clave %s: clave secreta con cifrado inválido %d - omitida\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "no se permite importar claves secretas\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "no hay anillo secreto de claves por defecto: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "clave %s: clave secreta importada\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "clave %s: ya estaba en el anillo secreto\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "clave %s: clave secreta no encontrada: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"clave %s: falta la clave pública - imposible emplear el\n"
+"certificado de revocación\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "clave %s: certificado de revocación inválido: %s - rechazado\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "clave %s: \"%s\" certificado de revocación importado\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "clave %s: no hay identificador de usuario para la firma\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "clave %s: algoritmo de clave pública no disponible para ID \"%s\"\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "clave %s: autofirma inválida para el id \"%s\"\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "clave %s: no hay subclave que unir a la clave\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "clave %s: algoritmo de clave pública no disponible\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "clave %s: unión de subclave inválida\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "clave %s: borrado enlace de subclaves múltiples\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "clave %s: no hay subclave para la revocación de clave\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "clave %s: revocación de subclave inválida\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "clave %s: borrada revocación de subclave múltiple\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "clave %s: omitido ID de usuario \"%s\"\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "clave %s: subclave omitida\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "clave %s: firma no exportable (clase 0x%02x) - omitida\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "clave %s: certificado de revocación en lugar equivocado - omitido\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "clave %s: certificado de revocación no valido: %s - omitido\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "clave %s: firma de subclave en lugar equivocado - omitida\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "clave %s: firma de clase (0x%02x) inesperada - omitida\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "clave %s: detectado usuario duplicado - fusionada\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"AVISO: la clave %s puede estar revocada: recuperando clave de revocación %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"AVISO: la clave %s puede estar revocada: falta clave de revocación %s.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "clave %s: \"%s\" certificado de revocación añadido\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "clave %s: firma directa de clave añadida\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "NOTA: un S/N de la clave no coincide con la de la tarjeta\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "NOTA: clave primaria en línea y almacenada en la tarjeta\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "NOTA: clave secundaria en línea y almacenada en la tarjeta\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "error escribiendo anillo `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "anillo `%s' creado\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "%s: problema lectura del bloque de clave: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "fallo reconstruyendo caché del anillo de claves: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revocación]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[autofirma]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 firma incorrecta\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d firmas incorrectas\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 firma no comprobada por falta de clave\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d firmas no comprobadas por falta de clave\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 firma no comprobada por causa de un error\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d firmas no comprobadas por errores\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "Detectado 1 identificador de usuario sin autofirma válida\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "Detectados %d identificadores de usuario sin autofirma válida\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Por favor, decida su nivel de confianza en que este usuario\n"
+"verifique correctamente las claves de otros usuarios (mirando\n"
+"pasaportes, comprobando huellas dactilares en diferentes fuentes...)\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Confío un poco\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Confío totalmente\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Por favor, introduzca el nivel de esta firma de confianza.\n"
+"Un nivel mayor que 1 permite que la clave que está firmando pueda\n"
+"hacer firmas de confianza en su nombre.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "Introduzca un dominio para restringir esta firma, o intro para nada.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "ID de usuario \"%s\" revocado."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "¿Seguro que todavía quiere firmarlo? (s/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Imposible firmar.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "ID de usuario \"%s\" expirado."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "ID de usuario \"%s\" no tiene autofirma."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "ID de usuario \"%s\" no tiene autofirma."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "¿Firmar de verdad? (s/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"La autofirma en \"%s\"\n"
+"es una firma de tipo PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Quiere convertirla en una autofirma OpenPGP? (s/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Su firma actual en \"%s\"\n"
+"ha expirado.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "¿Quiere producir una nueva firma que reemplace a la expirada? (s/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Su firma actual en \"%s\"\n"
+"es una firma local.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Quiere convertirla en una clave totalmente exportable? (s/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" ya estaba firmada localmente por la clave %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" ya estaba firmada por la clave %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "¿Quiere firmarlo aún así? (s/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nada que firmar con la clave %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "¡Esta clave ha caducado!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Esta clave expirará el %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "¿Quiere que su firma caduque al mismo tiempo? (S/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"No puede hacer una firma OpenPGP de una clave PGP 2.x estando en modo --"
+"pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Esto inutilizaría la clave en PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"¿Cómo de cuidadosamente ha verificado que la clave que está a punto de\n"
+"firmar pertenece realmente a la persona arriba nombrada? Si no sabe que\n"
+"contestar, introduzca \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) No contesto.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) No lo he comprobado en absoluto.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) He hecho una comprobación informal.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Lo he comprobado meticulosamente.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "¿Su elección? (escriba '?' si desea más información): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"¿Está realmente seguro de querer firmar esta clave\n"
+"con su clave: \"%s\" (%s)?\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Esto será una autofirma.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "ATENCION: la firma no se marcará como no exportable.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "AVISO: la firma no se marcará como no revocable.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "La firma se marcará como no exportable.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "La firma se marcará como no revocable.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "No he comprobado esta clave en absoluto.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "He comprobado esta clave informalmente.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "He comprobado esta clave meticulosamente.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "¿Firmar de verdad? (s/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "firma fallida: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+"La clave tiene sólo un apuntador u objetos de clave en la propia tarjeta\n"
+"- no hay frase contraseña que cambiar.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Esta clave no está protegida.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Las partes secretas de la clave primaria no están disponibles.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Las partes secretas de la clave primaria se guardan en la tarjeta.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "La clave está protegida.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "No puede editarse esta clave: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Introduzca la nueva frase contraseña para esta clave secreta.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "frase contraseña repetida incorrectamente; inténtelo de nuevo"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"No ha especificado frase contraseña. Esto es probablemente una *mala* idea.\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "¿Realmente quiere hacer esto? (s/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "moviendo la firma de la clave al lugar correcto\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "graba y sale"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "muestra huella dactilar de la clave"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "lista clave e identificadores de usuario"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "selecciona identificador de usuario N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "selecciona subclave N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "comprueba firmas"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "firmar IDs seleccionadas [* ver debajo órdenes relacionadas]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "firma localmente los IDs de usuarios elegidos"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "firmar IDs seleccionados con firma de confianza"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "firmar IDs seleccionados con firma no revocable"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "añadir un identificador de usuario"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "añadir un ID fotográfico"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "borrar identificadores de usuario seleccionados"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "añadir una subclave"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "añadir clave a tarjeta"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "mover una clave a la tarjeta"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "mover una clave de respaldo a la tarjeta"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "borrar clave secundaria"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "añadir una clave de revocación"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "borrar firmas de los ID seleccionados"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "cambiar la fecha de caducidad para la clave o subclaves seleccionadas"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "marcar ID de usuario seleccionado como primario"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "cambiar entre lista de claves secretas y públicas"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "mostrar preferencias (experto)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "mostrar preferencias (prolijo)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "establecer preferencias para todos los ID seleccionados"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr ""
+"establecer URL del servidor de claves preferido por los IDs seleccionados"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "establecer preferencias para todos los ID seleccionados"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "cambia la frase contraseña"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "cambia valores de confianza"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "revocar firmas de los identificadores seleccionados"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "revocar los identificadores seleccionados"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "revoca clave o subclaves seleccionadas"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "habilita clave"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "deshabilita clave"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "mostrar fotos de los ID seleccionados"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "error leyendo bloque de clave secreta \"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Clave secreta disponible.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Se necesita la clave secreta para hacer esto.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Por favor use la orden \"cambia\" primero.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* La orden `sign' (firmar) puede estar precedida por una 'l' para firmas\n"
+"locales (lsign), una 't' para firmas fiables (tsign), `nr' para firmas no\n"
+"revocables (nrsign) o cualquier combinación de ellas (ltsign, tnrsign, etc)\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "La clave está revocada."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "¿Firmar realmente todos los IDs de usuario? (s/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Sugerencia: seleccione los identificadores de usuario que firmar\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Clase de firma desconocida `%s'\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Esta orden no se permite en modo %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Debe seleccionar por lo menos un identificador de usuario.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "¡No puede borrar el último identificador de usuario!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "¿Borrar realmente todos los identificadores seleccionados? (s/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "¿Borrar realmente este identificador de usuario? (s/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "¿Borrar realmente la clave primaria? (s/N)"
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Debe seleccionar exactamente una clave.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "La orden espera un nombre de fichero como argumento\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "No se puede abrir `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Error leyendo clave de respaldo desde `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Debe seleccionar por lo menos una clave.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "¿De verdad quiere borrar las claves seleccionadas? (s/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "¿De verdad quiere borrar esta clave? (s/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "¿Revocar realmente todos los identificadores seleccionados? (s/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "¿Revocar realmente este identificador de usuario? (s/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "¿De verdad quiere revocar la clave completa? (s/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "¿De verdad quiere revocar las subclaves seleccionadas? (s/N)"
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "¿De verdad quiere revocar esta subclave? (s/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"La confianza del propietario no puede establecerse si se está usando\n"
+"una base de datos de confianza propocionada por el usuario\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Establecer lista de preferencias a:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"¿Actualizar realmente las preferencias para los ID seleccionados? (s/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "¿Actualizar realmente las preferencias? (s/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "¿Grabar cambios? (s/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "¿Salir sin grabar? (s/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "actualización fallida: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "actualización de la clave secreta fallida: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Clave sin cambios, no se necesita actualización.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Resumen: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Características: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Sevidor de claves no-modificar"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Servidor de claves preferido: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notación: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "No hay preferencias en un identificador de usuario estilo PGP 2.x\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Esta clave fue revocada en %s por %s clave %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Esta clave puede ser revocada por %s clave %s"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(confidencial)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "creado: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "revocada: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "caducó: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "caduca: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "uso: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "confianza: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "validez: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Esta clave está deshabilitada"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "num. tarjeta: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Por favor, advierta que la validez de clave mostrada no es necesariamente\n"
+"correcta a menos de que reinicie el programa.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "revocada"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "caducada"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"AVISO: ningún ID de usuario está marcado como principal. Esta orden puede\n"
+"       causar que se tome como principal por defecto otro ID de usuario.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"AVISO: esta es una clave de tipo PGP2. Añadir un ID fotográfico puede\n"
+"hacer que algunas versiones de PGP rechacen esta clave.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "¿Está seguro de querer añadirla? (s/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "No puede añadir un ID fotográfico a una clave tipo PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "¿Borrar esta firma correcta? (s/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "¿Borrar esta firma inválida? (s/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "¿Borrar esta firma desconocida? (s/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "¿Borrar realmente esta autofirma? (s/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d firmas borradas.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d firmas borradas\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "No se borró nada\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "Armadura no válida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "ID de usuario \"%s\" revocado."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "ID de usuario \"%s\" revocado."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "ID de usuario \"%s\" revocado."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "ID de usuario \"%s\" ya ha sido revocado\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "ID de usuario \"%s\" ya ha sido revocado\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVISO: esta es una clave tipo PGP2. Añadir un revocador designado puede\n"
+"       hacer que algunas versiones de PGP rechacen esta clave.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "No puede añadir un revocador designado a una clave tipo PGP2.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Introduzca el ID de usuario del revocador designado: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "no se puede elegir una clave tipo PGP 2.x como revocador designado\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "no puede elegir una clave como su propio revocador designado\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "esta clave ya ha sido designada como revocadora\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"¡AVISO: no podrá deshacer la elección de clave como revocador designado!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"¿Está seguro de querer elegir esta clave como revocador designado? (s/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Por favor, quite las selecciones de las claves secretas.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Por favor, seleccione como máximo una clave secundaria.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Cambiando fecha de caducidad de subclave.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Cambiando caducidad de clave primaria.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "No puede cambiar la fecha de caducidad de una clave v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "No existe la firma correspondiente en el anillo secreto\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "AVISO: la subclave de firmado %s no tiene certificado cruzado\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Por favor seleccione exactamente un identificador de usuario.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "omitiendo autofirma V3 para el id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Introduzca la URL de su servidor de claves preferido: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "¿Seguro que quiere reemplazarlo? (s/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "¿Seguro que quiere borrarlo? (s/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notación de firma: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "¿Sobreescribir? (s/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "No hay ningún identificador de usuario con el índice %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "No hay ningún identificador de usuario con el índice %d\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "No existe una subclave con índice %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID de usuario: \"%s\"\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "firmada con su clave %s el %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (no exportable)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Esta firma caducó el %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "¿De verdad quiere revocarla? (s/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "¿Crear un certificado de revocación para esta clave? (s/N)"
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Ha firmado estos IDs de usuario con la clave %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (no revocable)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "revocada por la clave %s el %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Va a revocar las siguientes firmas:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "¿Crear los certificados de revocación realmente? (s/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "no hay clave secreta\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "ID de usuario \"%s\" ya ha sido revocado\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "AVISO: un ID de usuario tiene fecha %d segundos en el futuro\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "La clave %s ya ha sido revocada.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "La subclave %s ya ha sido revocada.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Mostrando ID fotográfico %s de tamaño %ld para la clave %s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preferencia `%s' duplicada\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "demasiadas preferencias de cifrado\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "demasiadas preferencias de resumen\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "demasiadas preferencias de compresión\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "caracter inválido `%s' en cadena de preferencias\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "escribiendo firma directa\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "escribiendo autofirma\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "escribiendo la firma de comprobación de clave\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "tamaño de clave incorrecto; se usarán %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "tamaño de clave redondeado a %u bits\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Firma"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Cifrado"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Autentificación"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "FfCcAaSs"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Posibles accriones para una %s clave: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Acciones permitidas actualmente: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Conmutar la capacidad de firmar\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Conmutar la capacidad de cifrado\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Conmutar la capacidad de autentificación\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Acabado\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Por favor seleccione tipo de clave deseado:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA y ElGamal (por defecto)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (sólo firmar)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (permite elegir capacidades)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (sólo cifrar)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (sólo firmar)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (sólo cifrar)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (permite elegir capacidades)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "El par de claves DSA tendrá %u bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "las claves %s pueden tener entre %u y %u bits de longitud.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "¿De qué tamaño quiere la clave? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "los tamaños de claves %s deben estar en el rango %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "El tamaño requerido es de %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "redondeados a %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Por favor, especifique el período de validez de la clave.\n"
+"         0 = la clave nunca caduca\n"
+"      <n>  = la clave caduca en n días\n"
+"      <n>w = la clave caduca en n semanas\n"
+"      <n>m = la clave caduca en n meses\n"
+"      <n>y = la clave caduca en n años\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Por favor, especifique el período de validez de la clave.\n"
+"         0 = la clave nunca caduca\n"
+"      <n>  = la clave caduca en n días\n"
+"      <n>w = la clave caduca en n semanas\n"
+"      <n>m = la clave caduca en n meses\n"
+"      <n>y = la clave caduca en n años\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "¿Validez de la clave (0)? "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Clave válida ¿durante (0)? "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valor inválido\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "La clave nunca caduca\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "La firma nunca caduca\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "La clave caduca %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "La firma caduca el %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Su sistema no puede mostrar fechas más allá del 2038.\n"
+"Sin embargo funcionará correctamente hasta el 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "¿Es correcto? (s/n) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Necesita un identificador de usuario para identificar su clave. El programa\n"
+"construye el identificador a partir del Nombre Real, Comentario y Dirección\n"
+"de Correo Electrónico de esta forma:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nombre y apellidos: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Caracter inválido en el nombre\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "El nombre no puede empezar con un número\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "El nombre debe tener al menos 5 caracteres\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Dirección de correo electrónico: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Dirección inválida\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comentario: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Caracter inválido en el comentario\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Está usando el juego de caracteres `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Ha seleccionado este ID de usuario:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Por favor no ponga la dirección de correo-e en el nombre real o en el "
+"comentario\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcDdVvSs"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "¿Cambia (N)ombre, (C)omentario, (D)irección o (S)alir? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Por favor corrija primero el error.\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Es necesario generar muchos bytes aleatorios. Es una buena idea realizar\n"
+"alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar\n"
+"la red y los discos) durante la generación de números primos. Esto da al\n"
+"generador de números aleatorios mayor oportunidad de recoger suficiente\n"
+"entropía.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Creación de claves cancelada.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "escribiendo clave pública en `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "escribiendo apuntador de la clave privada en `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "escribiendo clave privada en `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "anillo público de claves no escribible encontrado: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "anillo privado de claves no escribible encontrado: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "error escribiendo anillo público `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "error escribiendo anillo privado `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "claves pública y secreta creadas y firmadas.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Tenga en cuenta que esta clave no puede ser usada para cifrar. Puede usar\n"
+"la orden \"--edit-key\" para crear una subclave con este propósito.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Creación de la clave fallida: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"clave pública creada %lu segundos en el futuro (salto en el tiempo o\n"
+"problemas con el reloj)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"clave pública creada %lu segundos en el futuro (salto en el tiempo o\n"
+"problemas con el reloj)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTA: crear subclaves para claves V3 no sigue el estándar OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "¿Crear de verdad? (s/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "almacenado de clave en la tarjeta fallido: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "no se puede crear fichero de respaldo `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTA: copia de seguridad de la clave guardada en `%s'\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "nunca     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Política de firmas críticas: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Política de firmas: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Servidor de claves crítico preferido: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notación de firmas críticas: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notación de firma: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Anillo de claves"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Huellas dactilares de la clave primaria:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Huella de subclave:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Huella de clave primaria:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Huella de subclave:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "      Huella de clave ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Número de serie de la tarjeta ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "renombrando `%s' en `%s' fallo: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "ATENCIÓN: existen 2 ficheros con información confidencial.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s es el que no se ha modificado\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s es el nuevo\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Por favor arregle este posible fallo de seguridad\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "memorizando anillo `%s'\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu claves memorizadas hasta ahora (%lu firmas)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu claves memorizadas (%lu firmas)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: anillo creado\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Introduzca la URL de su servidor de claves preferido: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"AVISO: las opciones de servidor de claves `%s' no se usan en esta "
+"plataforma\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "deshabilitado"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Introduzca número(s), O)tro, o F)in >"
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "protocolo del servidor de claves inválido (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "clave \"%s\" no encontrada en el servidor\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "clave no encontrada en el servidor\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "solicitando clave %s de %s servidor %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "solicitando clave %s de %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "buscando \"%s\" de %s servidor %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "buscando \"%s\" de %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "enviando clave %s a %s servidor %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "enviando clave %s a %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "buscando \"%s\" de %s servidor %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "buscando \"%s\" de %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "¡no se solicita ninguna acción al servidor de claves!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+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 (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "el servidor de claves no envió VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "no hay servidores de claves conocidos (use opción --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+"no se pueden realizar llamadas a un servidor externo de claves tal y\n"
+"como está compilado el programa\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "no hay un manejador para ese esquema de servidor de claves `%s'\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+"la acción `%s' no es posible con este esquema de servidor de claves `%s'\n"
+
+#: g10/keyserver.c:1536
+#, fuzzy, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "gpgkeys_%s no permite usar la versión %d del manejador\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "agotado el tiempo de espera para el servidor de claves\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "error interno del servidor de claves\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "error de comunicación con el servidor de claves: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "\"%s\" no es un identificador de clave válido: omitido\n"
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "renovando 1 clave de %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "renovando %d claves desde %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "AVISO: no se puede renovar la clave %s a traves de %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "AVISO: no se puede renovar la clave %s a traves de %s: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "tamaño anormal para una clave de sesión cifrada (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s clave de sesión cifrada\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "frase contraseña generada con algoritmo de resumen desconocido %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "la clave pública es %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "datos cifrados con la clave pública: DEK correcta\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "cifrado con clave %2$s de %1$u bits, ID %3$s, creada el %4$s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      \"%s\"\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "cifrado con clave %s, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "descifrado de la clave pública fallido: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "cifrado con %lu frases contraseña\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "cifrado con 1 frase contraseña\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "suponiendo %s datos cifrados\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"cifrado IDEA no disponible, confiadamente intentamos usar %s en su lugar\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "descifrado correcto\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "ATENCIÓN: la intgridad del mensaje no está protegida\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "ATENCIÓN: ¡el mensaje cifrado ha sido manipulado!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "descifrado fallido: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTA: el remitente solicitó \"sólo-para-tus-ojos\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nombre fichero original='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revocación independiente - use \"gpg --import\" para aplicarla\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Firma correcta de \"%s\""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "suprimida la verificación de la firma\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "no se puede trabajar con firmas múltiples\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Firmado el %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               usando %s clave %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Firmado el %s usando clave %s ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Clave disponible en: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Firma INCORRECTA de \"%s\""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Firma caducada de \"%s\""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Firma correcta de \"%s\""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[incierto]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                alias \"%s\""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Firma caducada en %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "La firma caduca el %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "firma %s, algoritmo de resumen %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binaria"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "modotexto"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "desconocido"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Imposible comprobar la firma: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "no es una firma separada\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "AVISO: detectadas múltiples firmas. Sólo la primera se comprueba.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "firma independiente de clase 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "firma al viejo estilo (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "paquete raíz inválido detectado en proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "no se pueden desactivar los volcados de core: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "fstat de `%s' falló en %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) falló en %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "AVISO: usando un algoritmo de clave pública experimental %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "AVISO: usando algoritmo de cifrado experimental %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "AVISO: usando algoritmo de resumen experimental %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "AVISO: el algoritmo de resumen %s es una opción desaconsejada\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "el plugin para el cifrado IDEA no está presente\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = por favor muéstreme más información\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: opción desaconsejada \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "ATENCIÓN: \"%s\" es una opción desaconsejada\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "por favor use \"%s%s\" en su lugar\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "ATENCIÓN: \"%s\" es una opción desaconsejada\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Sin comprimir"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "sin_comprimir|ninguno"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "este mensaje podría no ser utilizable por %s\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "opción ambigua `%s'\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "opción desconocida `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "El fichero `%s' ya existe. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "¿Sobreescribir? (s/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: sufijo desconocido\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Introduzca nuevo nombre de fichero"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "escribiendo en stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "asumiendo que hay datos firmados en `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "creado un nuevo fichero de configuración `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "AVISO: las opciones en `%s' no están aún activas en esta ejecución\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "directorio `%s' creado\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "no puedo manejar el algoritmo de clave pública %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"AVISO: clave de sesión cifrada simétricamente potencialmente insegura\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "el subpaquete de tipo %d tiene el bit crítico activado\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "el agente gpg no esta disponible en esta sesión\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "variable de entorno GPG_AGENT_INFO malformada\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "el programa no permite usar el protocolo agente gpg versión %d\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "no se puede conectar con `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problema con el agente - inhabilitando el uso del agente\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr "(ID de clave primaria %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Necesita una frase contraseña para desbloquear la clave secreta\n"
+"del usuario: \"%.*s\"\n"
+"%u bits, clave %s, ID %s, creada el %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repita frase contraseña\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Introduzca frase contraseña\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "cancelado por el usuario\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "imposible pedir frase contraseña en modo de proceso por lotes\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Introduzca frase contraseña: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Necesita una frase contraseña para desbloquear la clave secreta\n"
+"del usuario: \"%s\"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "clave %2$s de %1$u bits, ID %3$s, creada el %4$s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (subclave en clave principal ID %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repita frase contraseña: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Escoja una imagen para usar en su ID fotográfico. La imagen debe ser un\n"
+"fichero JPEG. Recuerde que la imágen se almacena en su clave pública.\n"
+"Si usa una foto muy grande, ¡su clave será también muy grande!\n"
+"Una imagen cercana a 240x288 tiene un tamaño adecuado.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Introduzca nombre del fichero JPEG para ID fotográfico: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "Imposible abrir fichero JPEG `%s': %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "¡Este JPEG es realmente grande (%d bytes)!\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "¿Seguro que quiere usarlo? (s/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' no es un fichero JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "¿Es correcta la foto? (s/n) "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "¡no puedo mostrar ID fotográfico!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "No se dio ninguna razón"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "La clave ha sido reemplazada."
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "La clave ha sido comprometida"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "La clave ya no está en uso"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "El identificador de usuario ya no es válido"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "razón para la revocación: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "comentario a la revocación: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "No hay confianza definida para:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  alias \"%s\"\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"¿Qué seguridad tiene de que esta clave pertenece realmente al usuario\n"
+"que se nombra?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = No lo sé o prefiero no decirlo\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = NO tengo confianza\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = confío absolutamente\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = volver al menú principal\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = saltar esta clave\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = salir\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"El mínimo nivel de confianza para esta clave es: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "¿Su decisión? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "¿De verdad quiere asignar absoluta confianza a esta clave? (s/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificados que llevan a una clave de confianza absoluta:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%s: No hay seguridad de que esta clave pertenezca realmente\n"
+"al usuario que se nombra\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Hay poca seguridad de que esta clave pertenezca realmente\n"
+"al usuario que se nombra\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Esta clave probablemente pertenece al usuario que se nombra\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Esta clave nos pertenece\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"No es seguro que la clave pertenezca a la persona que se nombra en el\n"
+"identificador de usuario. Si *realmente* sabe lo que está haciendo,\n"
+"puede contestar sí a la siguiente pregunta.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "¿Usar esta clave de todas formas? (s/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ATENCIÓN: ¡Usando una clave no fiable!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "AVISO: la clave puede estar revocada (falta clave de revocación)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+"ATENCIÓN: ¡Esta clave ha sido revocada por la persona designada\n"
+"como revocador!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ATENCIÓN: ¡Esta clave ha sido revocada por su propietario!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Esto puede significar que la firma está falsificada.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "ATENCIÓN: ¡Esta clave ha sido revocada por su propietario!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Nota: Esta clave está deshabilitada.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Nota: ¡Esta clave ha caducado!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"ATENCIÓN: ¡Esta clave no está certificada por una firma de confianza!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "          No hay indicios de que la firma pertenezca al propietario.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ATENCIÓN: ¡Esta clave NO es de confianza!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "          La firma es probablemente una FALSIFICACIÓN.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"ATENCIÓN: ¡Esta clave no está certificada con firmas de suficiente "
+"confianza!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "          No es seguro que la firma pertenezca al propietario.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: omitido: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: omitida: clave pública ya presente\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Destinatarios actuales:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Introduzca ID de usuario. Acabe con una línea vacía: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "ID de usuario inexistente.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "omitida: clave pública ya designada como destinataria por defecto\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Clave pública deshabilitada.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "omitida: clave pública ya establecida\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "desconocido el destinatario predefinido \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: omitida: clave pública deshabilitada\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "no hay direcciones válidas\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "datos no grabados; use la opción \"--output\" para grabarlos\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "error creando `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Firma separada.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Introduzca el nombre del fichero de datos: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "leyendo stdin...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "no hay datos firmados\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "imposible abrir datos firmados `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinatario anónimo; probando clave secreta %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "de acuerdo, somos el destinatario anónimo.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "la antigua codificación de la DEK no puede usarse\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "algoritmo de cifrado %d%s desconocido o desactivado\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "NOTA: el cifrado %s no aparece en las preferencias del receptor\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTA: clave secreta %s caducó el %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTA: la clave ha sido revocada"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "construcción del paquete fallida: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "clave %s: sin identificador de usuario\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Será revocado por:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Este es una clave de revocación confidencial)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "¿Crear un certificado de revocación para esta clave? (s/N)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "se fuerza salida con armadura ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet falló: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Certificado de revocación creado.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "no se encuetran claves de revocación para \"%s\"\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "clave secreta \"%s\" no encontrada: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "no existe la clave pública correspondiente: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "¡la clave pública y la privada no se corresponden!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "¿Crear un certificado de revocación para esta clave? (s/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "algoritmo de protección desconocido\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTA: ¡Esta clave no está protegida!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Certificado de revocación creado.\n"
+"\n"
+"Por favor consérvelo en un medio que pueda esconder; si alguien consigue\n"
+"acceso a este certificado puede usarlo para inutilizar su clave.\n"
+"Es inteligente imprimir este certificado y guardarlo en otro lugar, por\n"
+"si acaso su medio resulta imposible de leer. Pero precaución: ¡el sistema\n"
+"de impresión de su máquina podría almacenar los datos y hacerlos accesibles\n"
+"a otras personas!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Por favor elija una razón para la revocación:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Probablemente quería seleccionar %d aquí)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Introduzca una descripción opcional; acábela con una línea vacía:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Razón para la revocación: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(No se dió descripción)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "¿Es correcto? (s/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "las partes de la clave privada no están disponibles\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "el algoritmo de protección %d%s no puede ser utilizado\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "el resumen protector %d no puede ser utilizado\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Frase contraseña incorrecta; inténtelo de nuevo."
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ... \n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"ATENCIÓN: detectada clave débil - por favor cambie la frase contraseña.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"generando la suma de comprobación de 16 bits (desaconsejada) para \n"
+"proteger la clave secreta.\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "creada clave débil - reintentando\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"¡imposible evitar clave débil para cifrado simétrico después de %d "
+"intentos!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "AVISO: conflicto con el resumen de la firma del mensaje\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "AVISO: la subclave de firmado %s no tiene certificado cruzado\n"
+
+#: g10/sig-check.c:113
+#, c-format
+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"
+
+#: g10/sig-check.c:181
+#, c-format
+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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"la clave %s fue creada %lu segundo en el futuro (viaje en el tiempo\n"
+"o problemas con el reloj)\n"
+
+#: g10/sig-check.c:195
+#, 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"
+"o problemas con el reloj)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTA: clave de la firma %s caducada el %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"asumiendo firma incorrecta de la clave %s por un bit crítico desconocido\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "clave %s: no hay subclave para la firma de revocación de subclave\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "clave %s: no hay subclave para firma de subclave de enlace\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "no uede poner datos de notación en claves v3 (estilo PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "no se puede elegir una clave tipo PGP 2.x como revocador designado\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVISO: no puedo expandir el %% de la url de política . Se usa sin expandir.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "no puede poner URL de política en firmas v3 (estilo PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"no puede poner URL de política en firmas de claves v3 (estilo PGP 2.x)\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"AVISO: no puedo expandir el %% de la url de política (demasiado larga).\n"
+"Se usa sin expandir.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"AVISO: no puedo expandir el %% de la URL del servidor de claves\n"
+"preferido. Se usa sin expandir.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "la comprobación de la firma creada falló: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s firma de: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"sólo puede hacer firmas separadas con claves tipo PGP 2.x estando enmodo --"
+"pgp2\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"AVISO: forzar el algoritmo de resumen %s (%d) va en contra de las\n"
+"preferencias del destinatario\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "firmando:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "sólo puede firmar en claro con claves PGP 2.x estando en modo --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "se usará un cifrado %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "clave no marcada como insegura - no puede usarse con el pseudo RNG\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "\"%s\" omitido: duplicado\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "omitido \"%s\": %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "omitido: clave secreta ya presente\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"¡esta es una clave ElGamal generada por PGP que NO es segura para firmar!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "registro de confianza %lu, tipo %d: fallo escritura: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Lista de valores de confianza asignados, creada %s\n"
+"# (Use \"gpg --import-ownertrust\" para restablecerlos)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "error en `%s': %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "línea demasiado larga"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "falta una coma"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "huella dactilar no válida"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "falta el valor de confianza"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "error econtrando registro de confianza en `%s': %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "error de lectura `%s': %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "base de datos de confianza: fallo sincronización: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "registro base de datos de confianza %lu: lseek fallido: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+"registro base de datos de confianza %lu: escritura fallida (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transacción en la base de datos de confianza demasiado grande\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "no se puede acceder a `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: ¡el directorio no existe!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "no se puede crear el bloqueo para `%s'\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "no se puede bloquear `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: fallo en la creación del registro de versión: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: se ha creado base de datos de confianza inválida\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: se ha creado base de datos de confianza\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTA: no se puede escribir base de datos de confianza\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: base de datos de confianza inválida\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: fallo en la creación de la tabla hash: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: error actualizando el registro de versión: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: error leyendo registro de versión: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: error escribiendo registro de versión: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "base de datos de confianza: fallo lseek: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "base de datos de confianza: error lectura (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: no es una base de datos de confianza\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: registro de versión con número de registro %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versión del fichero %d inválida\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: error leyendo registro libre: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: error escribiendo registro de directorio: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: fallo en poner a cero un registro: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: fallo al añadir un registro: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"La base de datos de confianza está dañada. Por favor, ejecute\n"
+"\"gpg --fix-trust-db\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "no se pueden manejar líneas de texto de más de %d caracteres\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "línea de longitud superior a %d caracteres\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "'%s' no es un identificador largo de clave válido\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "clave %s: aceptada como clave fiable\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "la clave %s aparece más de una vez en la base de datos de confianza\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "clave %s: clave fiable sin clave pública - omitida\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "clave %s marcada como de confianza absoluta\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "registro de confianza %lu, petición tipo %d: fallo lectura: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "registro de confianza %lu no es del tipo requerido %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr "imposible usar modelo de confianza (%d) - asumiendo el modelo %s\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "usando %s como modelo de confianza\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "13 no apto para supersticiosos"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[  revocada ]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[  caducada ]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[desconocida]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[no definida]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[   dudosa  ]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[   total   ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[  absoluta ]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "no definido"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "nunca"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "dudosa"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "total"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "absoluta"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "no es necesaria una comprobación de la base de datos de confianza\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "siguiente comprobación de base de datos de confianza el: %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+"no es necesaria una comprobación de la base de datos de confianza\n"
+"con el modelo de confianza `%s'\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+"no es necesario comprobar la base de datos de confianza\n"
+"con el modelo `%s'\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "clave pública %s no encontrada: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "por favor haga un --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "comprobando base de datos de confianza\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d claves procesadas (%d validaciones superadas)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "no se encuentran claves absolutamente fiables\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "clave pública de la clave absolutamente fiable %s no encontrada\n"
+
+#: g10/trustdb.c:2197
+#, 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"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"nivel: %d  validez: %3d  firmada: %3d  confianza: %d-, %dq, %dn, %dm, %df, %"
+"du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"no se puede actualizar el registro de la versión de la base de datos\n"
+"de confianza: fallo de escritura: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"la firma no se pudo verificar.\n"
+"Por favor recuerde que el fichero de firma (.sig o .asc)\n"
+"debería ser el primero que se da en la línea de órdenes.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "la línea %u es demasiado larga o no tiene avance de línea (LF)\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "Error general"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "Formato desconocido"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "Versión desconocida"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "Algoritmo de clave pública desconocido"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "Algoritmo desconocido de resumen de mensaje"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "Clave pública incorrecta"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "Clave secreta incorrecta"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "Firma incorrecta"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "Error en la suma de comprobación"
+
+# ¿Por qué no frase de paso?
+# Porque todo el mundo sabe lo que es una contraseña
+# y una "frase de paso" no. Soy consciente de que se
+# traduce igual password y passphrase pero el contexto
+# permite saber de lo que se está hablando.
+# No sé, no sé.
+# ¿Por qué los ingleses entonces sí que saben lo que es un "passphrase"?
+# ¿Es que son más listos? :-)
+#
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "Frase contraseña incorrecta"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "Clave pública no encontrada"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "Algoritmo de cifrado desconocido"
+
+# ¿y llavero?
+# Hombre... las claves son parecidas a las llaves pero no lo mismo
+# toda la literatura en castellano usa "anillos de claves" si un
+# programa nos habla del llavero ¿no puedo abrir el llavero? nos
+# miraremos en el bolsillo bastante desconcertados. No creo que se
+# trate de establecer una nomenclatura propia.
+# A lo mejor toda esa literatura está producida por gente que no sabía
+# cómo se dice llavero en inglés...
+# Si los ingleses dicen llavero en su idioma ¿por qué no vamos a poder
+# nosotros decir lo mismo en el nuestro?
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "No se puede abrir el anillo de claves"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "paquete inválido"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armadura inválida"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "no existe el ID de usuario"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "clave secreta no disponible"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "clave secreta incorrecta"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "no disponible"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "clave incorrecta"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "error de lectura"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "error de escritura"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritmo de compresión desconocido"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "error al abrir fichero"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "error al crear fichero"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "frase contraseña incorrecta"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmo de clave pública no implementado"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritmo de cifrado no implementado"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "clase de firma desconocida"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "error en la base de datos de confianza"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI incorrecto"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "límite de recurso"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "anillo inválido"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "certificado incorrecto"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "ID de usuario mal formado"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "error al cerrar fichero"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "error al renombrar fichero"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "error al borrar fichero"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "datos inesperados"
+
+# o tal vez "en el sello..."
+# Creo que es mejor "con el sello de fecha", no es un conflicto
+# del sello en si mismo sino en relación con el mensaje.
+# Ok.
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflicto con el sello de fecha"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritmo de clave pública no utilizable"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "el fichero existe"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "clave débil"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argumento inválido"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI incorrecto"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI no disponible"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "error de red"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "no cifrado"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "no procesado"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "clave pública inutilizable"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "clave secreta inutilizable"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "error del servidor de claves"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "cancelado"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "no hay tarjeta"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "no hay datos firmados\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "ERROR: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "ATENCION: "
+
+# bicho :-)
+# ¿Error simplemente?
+# Uf, preferiría bug, si leo "error" voy a pensar en otra cosa distinta...
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... esto es un bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "ha encontrado un error... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "sí"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "sS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "fin"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "fF"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "vale|Vale"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancelar|Cancelar"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "vV"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "ATENCIÓN: ¡se está usando memoria insegura!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "por favor, vea http://www.gnupg.org/faq.html para más información\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operación imposible sin memoria segura inicializada\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(es posible que haya usado el programa incorrecto para esta tarea)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA necesita un algoritmo de hash de 160 bits.\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "por favor vea http://www.gnupg.org/why-not-idea.html para más "
+#~ "información\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "un nombre de notación debe tener sólo caracteres imprimibles o espacios, "
+#~ "y acabar con un '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "un nombre de notación de usuario debe contener el caracter '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "un nombre de notación de usuario debe contener el caracter '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "un valor de notación no debe usar ningún caracter de control\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "ATENCIÓN: encontrados datos de notación inválidos\n"
+
+#~ msgid "not human readable"
+#~ msgstr "ilegible"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "lee opciones del fichero"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "lee opciones del fichero"
+
+#~ msgid "expired: %s)"
+#~ msgstr "caducó: %s)"
+
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "clave %s: firma caducada con la clave %s - omitida\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "no se puede ejecutar el programa `%s': %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "No hay clave secreta para tal usuario\n"
+
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "error obteniendo el número de serie: %s\n"
+
+#~ msgid "length of RSA modulus is not %d\n"
+#~ msgstr "la longitud del módulo RSA no es %d\n"
+
+#~ msgid "length of an RSA prime is not %d\n"
+#~ msgstr "la longitud del primo RSA no es %d\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "frase de paso mala o algoritmo de cifrado desconocido (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "no puedo establecer pid para el agente\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "no puedo conseguir el FD de lectura para el agente\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "no puedo conseguir el FD de escritura para el agente\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problema de comunicación con el agente gpg\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "frase contraseña demasiado larga\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "respuesta del agente inválida\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problema con el agente: el agente devuelve 0x%lx\n"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "el algoritmo de resumen `%s' es de sólo lectura en esta versión\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "AVISO: el resumen `%s' no es parte de OpenPGP. ¡Úselo bajo su "
+#~ "responsabilidad!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[ficheros]|cifra ficheros"
+
+#~ msgid "store only"
+#~ msgstr "sólo almacenar"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[ficheros]|descifra ficheros"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "firma la clave no revocablemente"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "firma la clave localmente y no revocablemente"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "lista sólo la secuencia de paquetes"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "exporta los valores de confianza"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "actualiza la base de datos de confianza"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "arregla una base de datos de confianza dañada"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "quita la armadura de un fichero o de la entrada estándar"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "crea la armadura a un fichero o a la entrada estándar"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOMBRE|usa NOMBRE como destinatario por defecto"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "usa la clave por defecto como destinatario"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "no usa la terminal en absoluto"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "fuerza firmas v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "no fuerza firmas v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "fuerza firmas v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "no fuerza firmas v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "siempre usa un MDC para cifrar"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "nunca usa un MDC para cifrar"
+
+# usa
+# Vale.
+#~ msgid "use the gpg-agent"
+#~ msgstr "usa el agente gpg"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "proceso por lotes: nunca preguntar"
+
+# assume -> suponer, no asumir
+# No estoy seguro. El diccionario Collins en la acepción b) de asumir
+# dice "b) (suponer) to assume, suppose..."
+# Además una de las acepciones de asumir es "aceptar algo" y suponer
+# viene a ser asumir una idea como propia. Suponer "sí" en casi todas las
+# preguntas no me acaba de gustar.
+#~ msgid "assume yes on most questions"
+#~ msgstr "asume \"sí\" en casi todas las preguntas"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "asume \"no\" en casi todas las preguntas"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "añade este anillo a la lista de anillos"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "añade este anillo secreto a la lista"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOMBRE|usa NOMBRE como clave secreta por defecto"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|SERVIDOR|usa este servidor de claves"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NOMBRE|usa el juego de caracteres NOMBRE"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[fichero]|escribe información de estado en el fichero"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|ID-CLAVE|confía plenamente en esta clave"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FICHERO|carga módulo de extensiones FICHERO"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emula el modo descrito en la RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "todas las opciones de paquete, cifrado y resumen tipo OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "todas las opciones de paquete, cifrado y resumen tipo PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|usa modo de contraseña N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|NOMBRE|usa algoritmo de resumen de mensaje NOMBRE para las contraseñas"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NOMBRE|usa el algoritmo de cifrado NOMBRE para las contraseñas"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOMBRE|usa el algoritmo de cifrado NOMBRE"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOMBRE|usa algoritmo de resumen de mensaje NOMBRE"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|usa el algoritmo de compresión N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "elimina campo keyid de los paquetes cifrados"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Muestra IDs fotográficos"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "No muestra IDs fotográficos"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Ajusta linea de comandos para ver IDs fotográficos"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "el algoritmo de compresión `%s' es de sólo lectura en esta versión\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "el algoritmo de compresión debe estar en el rango %d-%d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key id-usuario"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key id-usuario"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "no se puede abrir `%s': %s\n"
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "clave %08lX: ¡esta clave ha sido revocada!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "clave %08lX: ¡esta subclave ha sido revocada!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: clave caducada\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: ¡Esta clave NO es de confianza!\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: No hay seguridad que esta clave pertenezca realmente a su \n"
+#~ "proprietario pero se acepta igualmente\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "la preferencia %c%lu no es válida\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (firmar y cifrar)\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Listo para generar un nuevo par de claves %s.\n"
+#~ "              el tamaño mínimo es 768 bits\n"
+#~ "        el tamaño por defecto es 1024 bits\n"
+#~ " el tamaño máximo recomendado es 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA sólo permite tamaños desde 512 a 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "tamaño de clave insuficiente; 1024 es el mínimo permitido para RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "tamaño insuficiente; 768 es el valor mínimo permitido\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "tamaño excesivo; %d es el máximo valor permitido.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "No se recomiendan claves de más de 2048 bits porque\n"
+#~ "¡el tiempo de cálculo es REALMENTE largo!\n"
+
+#~ msgid "Are you sure that you want this keysize? "
+#~ msgstr "¿Seguro que quiere una clave de este tamaño? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "De acuerdo, ¡pero tenga en cuenta que las radiaciones de su monitor y\n"
+#~ "teclado también son vulnerables a un ataque!\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: no se puede abrir: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: ATENCIÓN: fichero vacío\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "clave %08lX: no es conforme a rfc2440 - omitida\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "NOTA: detectada clave primaria Elgamal - puede llevar algo de tiempo "
+#~ "importarla\n"
+
+#~ msgid " (default)"
+#~ msgstr "(por defecto)"
+
+#~ msgid "Really sign? "
+#~ msgstr "¿Firmar de verdad? "
+
+#~ msgid "q"
+#~ msgstr "s"
+
+#~ msgid "save"
+#~ msgstr "graba"
+
+#~ msgid "help"
+#~ msgstr "ayuda"
+
+#~ msgid "fpr"
+#~ msgstr "hdac"
+
+#~ msgid "list"
+#~ msgstr "lista"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "uid"
+#~ msgstr "idu"
+
+#~ msgid "key"
+#~ msgstr "clave"
+
+#~ msgid "select secondary key N"
+#~ msgstr "selecciona clave secundaria N"
+
+#~ msgid "check"
+#~ msgstr "comprueba"
+
+#~ msgid "list signatures"
+#~ msgstr "lista firmas"
+
+#~ msgid "sign the key"
+#~ msgstr "firma la clave"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "lsign"
+#~ msgstr "firmal"
+
+#~ msgid "nrsign"
+#~ msgstr "firmanr"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "firma la clave irrevocablemente"
+
+#~ msgid "nrlsign"
+#~ msgstr "firmanrl"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "firma la clave local e irrevocablemente"
+
+#~ msgid "debug"
+#~ msgstr "depura"
+
+#~ msgid "adduid"
+#~ msgstr "añaidu"
+
+#~ msgid "addphoto"
+#~ msgstr "añadirfoto"
+
+#~ msgid "deluid"
+#~ msgstr "borridu"
+
+#~ msgid "delphoto"
+#~ msgstr "borfoto"
+
+#~ msgid "add a secondary key"
+#~ msgstr "añade una clave secundaria"
+
+#~ msgid "delkey"
+#~ msgstr "borrcla"
+
+#~ msgid "addrevoker"
+#~ msgstr "añarevoc"
+
+#~ msgid "delsig"
+#~ msgstr "borrfir"
+
+#~ msgid "delete signatures"
+#~ msgstr "borra firmas"
+
+#~ msgid "primary"
+#~ msgstr "primaria"
+
+#~ msgid "toggle"
+#~ msgstr "cambia"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "verpref"
+
+#~ msgid "setpref"
+#~ msgstr "estpref"
+
+#~ msgid "updpref"
+#~ msgstr "actpref"
+
+#~ msgid "passwd"
+#~ msgstr "contr"
+
+#~ msgid "trust"
+#~ msgstr "conf"
+
+#~ msgid "revsig"
+#~ msgstr "revfir"
+
+#~ msgid "revoke signatures"
+#~ msgstr "revoca firmas"
+
+#~ msgid "revuid"
+#~ msgstr "revidu"
+
+#~ msgid "revoke a user ID"
+#~ msgstr "revocar un identificador de usuario"
+
+#~ msgid "revkey"
+#~ msgstr "revcla"
+
+#~ msgid "showphoto"
+#~ msgstr "verfoto"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  creada: %s expira: %s"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! ¡esta subclave ha sido revocada! %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev-  se encontró una revocación falsificada\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problema comprobando la revocación: %s\n"
+
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %08lX at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "firmada localmente con su clave %08lX el %s\n"
+
+#~ msgid "   signed by %08lX at %s%s%s\n"
+#~ msgstr "   firmada por %08lX el %s%s%s\n"
+
+#~ 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"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "ese algoritmo de cifrado está desacreditado;¡por favor use uno más "
+#~ "estándar!\n"
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "no puede obtenerse la clave en el servidor: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "error enviando a `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "envió correcto a `%s` (estado=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "falló el envio a `%s': status=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "este servidor de clave no proporciona --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "no puede buscarse en el servidor: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "clave %08lX: clave ElGamal generada por PGP que NO es segura para "
+#~ "firmar!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "clave %08lX creada %lu segundos en el futuro (salto en el tiempo o\n"
+#~ "problemas con el reloj)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "clave %08lX creada %lu segundos en el futuro (salto en el tiempo o\n"
+#~ "problemas con el reloj)\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: no se puede abrir: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: no se puede crear bloqueo\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: no se puede crear bloqueo\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: no se puede crear: %s\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "clave %08lX marcada como de confianza absoluta\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "firma de clave Elgamal %08lX a %08lX descartada\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "firma de %08lX a la clave de firmado Elgamal %08lX descartada\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "comprobando en profundidad %d firmado=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%"
+#~ "d\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: no se puede crear el directorio: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr "Si quiere usar esta clave revocada de todos modos, conteste \"sí\"."
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Seleccione el algoritmo que usará.\n"
+#~ "\n"
+#~ "DSA (también conocido como DSS) es un algoritmo de firma digital que "
+#~ "sólo\n"
+#~ "puede usarse para firmas. Es el algoritmo sugerido porque la "
+#~ "verificación\n"
+#~ "de firmas DSA es mucho más rápida que la de firmas ElGamal.\n"
+#~ "\n"
+#~ "ElGamal es un algoritmo que puede ser usado para firma y cifrado. "
+#~ "OpenPGP\n"
+#~ "distingue entre dos tipos de estos algoritmos: sólo para cifrado y para\n"
+#~ "firma y cifrado. En realidad es lo mismo, pero se deben seleccionar "
+#~ "ciertos\n"
+#~ "parámetros de una forma particular para crear una clave segura para "
+#~ "firmas:\n"
+#~ "este programa lo hace así, pero otras implementaciones de OpenPGP no "
+#~ "tienen\n"
+#~ "por qué entender el tipo de firma y cifrado.\n"
+#~ "\n"
+#~ "La clave primaria debe ser una clave capaz de firmar, es por ello que la\n"
+#~ "opción de clave ElGamal sólo para cifrado no está disponible en este menú."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Aunque estas claves están definidas en RFC2440, no se aconseja su uso,\n"
+#~ "ya que no todos los programas pueden utilizarlas y las firmas creadas\n"
+#~ "con ellas son bastante grandes y lentas de verificar."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "hasta ahora procesadas %lu claves (%lu firmas)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "clave incompleta\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "clave %08lX incompleta\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "lo siento, no puede hacerse en modo de proceso por lotes\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "no puede abrirse el fichero: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "error: falta ':'\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "error: no hay valor de confianza del propietario\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "salir"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (firmar y cifrar)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "El uso de este algoritmo sólo es posible con GnuPG. No será posible\n"
+#~ "comunicarse mediante esta clave con usuarios de PGP. Este algoritmo\n"
+#~ "es además muy lento, y podría no ser tan seguro como otros.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "¿Crear de todas formas?"
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "detectado algoritmo simétrico inválido (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "este servidor de claves no es totalmente compatible con HKP\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr ""
+#~ "El uso de este algoritmo está desaconsejado - ¿crear de todas formas?"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NOMBRE=VALOR|usa estos datos de notación"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr ""
+#~ "El primer carácter de una notación debe ser una letra o un subrayado\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr ""
+#~ "los puntos en una notación deben estar rodeados por otros caracteres\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "AVISO: Esta clave ya tiene identificador fotográfico.\n"
+#~ "       Añadir otro ID puede confundir a algunas versiones de PGP.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Solo puede tener un ID fotográfico en una clave.\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "         Huella dactilar:"
+
+#~ msgid "you have to start GnuPG again, so it can read the new options file\n"
+#~ msgstr "reinicie GnuPG otra vez para que lea el nuevo fichero de opciones\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "al cambiar permisos de `%s' ocurrió el fallo: %s\n"
+
+#, fuzzy
+#~ msgid "Are you sure you still want to sign it?\n"
+#~ msgstr "¿Seguro que quiere una clave de este tamaño? "
+
+#, fuzzy
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "¿Seguro que quiere una clave de este tamaño? "
+
+#~ msgid "too many random bits requested; the limit is %d\n"
+#~ msgstr "se solicitan demasiados bits aleatorios; el límite es %d\n"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NOMBRES]|comprueba la base de datos de confianza"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key id-usuario"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key id-usuario"
+
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-and-public-key id-usuario"
+
+#~ msgid "For info see http://www.gnupg.org"
+#~ msgstr "Información en http://www.gnupg.org"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "iImMqQ"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No puede encontrarse una ruta de confianza válida para esta clave. "
+#~ "Veamos\n"
+#~ "si es posible asignar algunos valores de confianza perdidos.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No se ha encontrado ninguna ruta con una de nuestras claves.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No se ha encontrado ningún certificado sin valor de confianza.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "No se cambió ningún valor de confianza.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr ""
+#~ "%08lX: no hay información para calcular la probabilidad de confianza\n"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "omitida: clave pública ya designada con --encrypt-to\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: error comprobando la clave: %s\n"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr "¿De verdad quiere crear una clave de firma y cifrado? "
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "¿De verdad necesita una clave tan grande? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: usuario no encontrado: %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "problema en la lectura del certificado: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr "demasiados registros en la cache unk - anulada\n"
+
+#~ msgid "no default public keyring\n"
+#~ msgstr "no hay anillo público por defecto\n"
+
+#~ msgid "secret key %08lX not imported (use %s to allow for it)\n"
+#~ msgstr "clave secreta %08lX no importada (use %s para permitirlo)\n"
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "clave %08lX: nuestra copia no tiene autofirma\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: usuario no encontrado\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr "asumiendo MDC incorrecto debido a un bit crítico desconocido\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "error leyendo registro de directorio del LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr "lid %lu: esperaba registro directorio, encontrado tipo %d\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "no hay clave primaria para el LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "error leyendo clave primaria para el LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "clave %08lX: petición de registro fallida\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "clave %08lX: ya está en la tabla de confianza\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "NOTA: la clave secreta %08lX NO está protegida.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr "clave %08lX: las claves pública y secreta no se corresponden\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "clave %08lX.%lu: unión de subclave válida\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "clave %08lX.%lu: unión de subclave inválida: %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "clave %08lX.%lu: revocación de clave válida\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "clave %08lX.%lu: revocación de clave inválida: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Autofirma válida"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Autofirma inválida"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr ""
+#~ "Revocación válida de ID de usuario omitida, existe autofirma más reciente"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Revocación de ID de usuario válida"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Revocación de ID de usuario inválida."
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Revocación de certificado válida"
+
+#~ msgid "Good certificate"
+#~ msgstr "Certificado correcto"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Certificado de revocación incorrecto"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Certificado incorrecto"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "registro de firma %lu[%d] apunta al registro equivocado.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "certificado duplicado - eliminado"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "tdbio_search_dir fallida: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: inserción fallida: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: inserción fallida: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: insertada\n"
+
+#~ msgid "\t%lu keys with errors\n"
+#~ msgstr "\t%lu claves con errores\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu claves insertadas\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: registro de directiorio sin clave - omitido\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "\t%lu debido a las nuevas claves públicas\n"
+
+# msgstr "clave %08lX: %d nuevas subclaves\n"
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu claves omitidas\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"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Oh oh, no hay ningún ID de usuario\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr "check_trust: búsqueda registro directorio fallida: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr "clave %08lX: inserción del registro de confianza fallida: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "clave %08lX.%lu: incluida en la base de datos de confianza\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "clave %08lX.%lu: creada en el futuro (salto en el tiempo o\n"
+#~ "problemas con el reloj)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "clave %08lX.%lu: caducada el %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "clave %08lX.%lu: comprobación de confianza fallida: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr "problema buscando '%s' en la tabla de confianza: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr "usuario '%s' no está en la tabla de confianza - insertando\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "fallo al poner '%s' en la tabla de confianza: %s\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr ""
+#~ "ATENCÍON: todavía no puedo tratar registros de preferencias largos\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: no se puede crear el anillo: %s\n"
+
+#~ msgid "RSA key cannot be used in this version\n"
+#~ msgstr "No puede usarse clave RSA en esta versión\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "No hay clave para tal usuario\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "clave secreta para descifrado no disponible\n"
+
+#~ msgid ""
+#~ "RSA keys are deprecated; please consider creating a new key and use this "
+#~ "key in the future\n"
+#~ msgstr ""
+#~ "Las claves RSA están en desuso, considere la creación de una nueva clave "
+#~ "para futuros usos\n"
+
+#~ msgid "set debugging flags"
+#~ msgstr "establece los parámetros de depuración"
+
+#~ msgid "enable full debugging"
+#~ msgstr "habilita depuración completa"
+
+#~ msgid "do not write comment packets"
+#~ msgstr "no escribe paquetes de comentario"
+
+#~ msgid "(default is 3)"
+#~ msgstr "(por defecto es 3)"
+
+#~ msgid "   (%d) ElGamal in a v3 packet\n"
+#~ msgstr "   (%d) ElGamal en un paquete v3\n"
+
+#~ msgid "Key generation can only be used in interactive mode\n"
+#~ msgstr "La creación de claves sólo es posible en modo interactivo\n"
+
+#, fuzzy
+#~ msgid "tdbio_search_sdir failed: %s\n"
+#~ msgstr "tdbio_search_dir fallida: %s\n"
+
+#~ msgid "print all message digests"
+#~ msgstr "imprime todos los resúmenes de mensaje"
+
+#~ msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but marked as checked\n"
+#~ msgstr ""
+#~ "NOTA: el registro de firma %lu[%d] está en la lista\n"
+#~ "de búsqueda de %lu pero está marcado como comprobado\n"
+
+#~ msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but not marked\n"
+#~ msgstr ""
+#~ "NOTA: el registro de firma %lu[%d] está en la lista\n"
+#~ "de búsqueda de %lu pero no está marcado\n"
+
+#~ msgid "sig rec %lu[%d] in hintlist of %lu does not point to a dir record\n"
+#~ msgstr ""
+#~ "El registro de firma %lu[%d] en la lista de búsqueda de %lu\n"
+#~ "no apunta a un registro de directorio\n"
+
+#~ msgid "lid %lu: no primary key\n"
+#~ msgstr "lid %lu: ninguna clave primaria\n"
+
+#~ msgid "lid %lu: user id not found in keyblock\n"
+#~ msgstr ""
+#~ "lid %lu: no se ha encontrado identificativo de usuario\n"
+#~ "en el bloque de clave\n"
+
+#~ msgid "lid %lu: self-signature in hintlist\n"
+#~ msgstr "lid %lu: autofirma en lista de búsqueda\n"
+
+#~ msgid "very strange: no public key\n"
+#~ msgstr "muy raro: no hay clave pública\n"
+
+#~ msgid "hintlist %lu[%d] of %lu does not point to a dir record\n"
+#~ msgstr ""
+#~ "la lista de búsqueda %lu[%d] de %lu no apunta a\n"
+#~ "un registro de directorio\n"
+
+#~ msgid "lid %lu: can't get keyblock: %s\n"
+#~ msgstr "lid %lu: no puedo obtener el bloque de clave: %s\n"
+
+#~ msgid "Too many preference items"
+#~ msgstr "Demasiados ítems de preferencias"
+
+#~ msgid "public key not anymore available"
+#~ msgstr "clave pública no disponible"
+
+#~ msgid "insert_trust_record: keyblock not found: %s\n"
+#~ msgstr "insert_trust_record: bloque de clave no encontrado: %s\n"
+
+#~ msgid "lid %lu: update failed: %s\n"
+#~ msgstr "lid %lu: actualización fallida: %s\n"
+
+#~ msgid "lid %lu: updated\n"
+#~ msgstr "lid %lu: actualizado\n"
+
+#~ msgid "lid %lu: okay\n"
+#~ msgstr "lid %lu: bien\n"
+
+#~ msgid "%s: update failed: %s\n"
+#~ msgstr "%s: actualización fallida: %s\n"
+
+#~ msgid "%s: updated\n"
+#~ msgstr "%s: actualizada\n"
+
+#~ msgid "%s: okay\n"
+#~ msgstr "%s: bien\n"
+
+#~ msgid "lid %lu: keyblock not found: %s\n"
+#~ msgstr "lid %lu: bloque de clave no encontrado: %s\n"
+
+#~ msgid "can't lock keyring `%': %s\n"
+#~ msgstr "no puede bloquearse el anillo público `%s': %s\n"
+
+#~ msgid "error writing keyring `%': %s\n"
+#~ msgstr "error escribiendo anillo `%s': %s\n"
+
+#~ msgid "writing keyblock\n"
+#~ msgstr "escribiendo bloque de claves\n"
+
+#~ msgid "can't write keyblock: %s\n"
+#~ msgstr "no puede escribirse el bloque de claves: %s\n"
+
+#, fuzzy
+#~ msgid "encrypted message is valid\n"
+#~ msgstr "el algoritmo de resumen seleccionado no es válido\n"
+
+#, fuzzy
+#~ msgid "Can't check MDC: %s\n"
+#~ msgstr "Imposible comprobar la firma: %s\n"
+
+#~ msgid "Usage: gpgm [options] [files] (-h for help)"
+#~ msgstr "Uso: gpgm [opciones] [ficheros] (-h para ayuda)"
+
+#~ msgid "usage: gpgm [options] "
+#~ msgstr "uso: gpgm [opciones] "
+
+#~ msgid "chained sigrec %lu has a wrong owner\n"
+#~ msgstr "registro de firma encadenado %lu tiene el propietario equivocado\n"
+
+#~ msgid "lid %lu: read dir record failed: %s\n"
+#~ msgstr "lid %lu: lectura registro de directorio fallida: %s\n"
+
+#~ msgid "lid %lu: read key record failed: %s\n"
+#~ msgstr "lid %lu: lectura registro de clave fallida: %s\n"
+
+#~ msgid "lid %lu: read uid record failed: %s\n"
+#~ msgstr "lid %lu: lectura registro identificativo fallida: %s\n"
+
+#~ msgid "lid %lu: read pref record failed: %s\n"
+#~ msgstr "lid %lu: lectura registro preferencias fallida: %s\n"
+
+#~ msgid "user '%s' read problem: %s\n"
+#~ msgstr "problema de lectura usuario '%s': %s\n"
+
+#~ msgid "user '%s' list problem: %s\n"
+#~ msgstr "problema lista usuario '%s': %s\n"
+
+#~ msgid "user '%s' not in trustdb\n"
+#~ msgstr "usuario '%s' no está en la tabla de confianza\n"
+
+#~ msgid "directory record w/o primary key\n"
+#~ msgstr "registro de directorio sin clave primaria\n"
+
+#~ msgid "key not in trustdb, searching ring.\n"
+#~ msgstr "la clave no está en tabla de confianza, buscando en el anillo.\n"
+
+#~ msgid "key not in ring: %s\n"
+#~ msgstr "la clave no está en el anillo: %s\n"
+
+#~ msgid "Oops: key is now in trustdb???\n"
+#~ msgstr "Oh oh: la clave ahora está en la tabla de confianza???\n"
+
+#~ msgid "Hmmm, public key lost?"
+#~ msgstr "Oh oh, ¿se ha perdido la clave pública?"
+
+#~ 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.gmo b/po/et.gmo
new file mode 100644 (file)
index 0000000..6ea04a7
Binary files /dev/null and b/po/et.gmo differ
diff --git a/po/et.po b/po/et.po
new file mode 100644 (file)
index 0000000..7203dd9
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,7129 @@
+# Estonian translations for gnupg.
+# Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+# Toomas Soome <Toomas.Soome@microlink.ee>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-06-17 11:04+0300\n"
+"Last-Translator: Toomas Soome <Toomas.Soome@microlink.ee>\n"
+"Language-Team: Estonian <et@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "vähem kui %d bitiga ei saa algarvu genereerida\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "vähem kui %d bitiga ei saa algarvu genereerida\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "entroopia kogumise moodul puudub\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "`%s' ei õnnestu avada\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "`%s' ei õnnestu avada: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "ei õnnestu lugeda `%s' atribuute: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' ei ole tavaline fail - ignoreerin\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "märkus: random_seed fail on tühi\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "HOIATUS: vigane random_seed faili suurus - ei kasuta\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "`%s' ei õnnestu lugeda: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "märkus: random_seed faili ei uuendatud\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "`%s' ei õnnestu luua: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "`%s' ei õnnestu kirjutada: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "`%s' ei õnnestu sulgeda: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "HOIATUS: kasutan ebaturvalist juhuarvude generaatorit!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Juhuarvude generaator on ainult tühi kest, et programmid\n"
+"käiks - see EI OLE tugev juhuarvude generaator!\n"
+"\n"
+"ÄRGE KASUTAGE SELLE PROGRAMMI POOLT GENEREERITUD ANDMEID!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Palun oodake, kogutakse entroopiat. Igavuse vältimiseks võite teha arvutiga\n"
+"mingit tööd, see tõstab ka entroopia kvaliteeti.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Juhuslikke baite ei ole piisavalt. Palun tehke arvutiga muid töid,\n"
+"et anda masinal võimalust koguda enam entroopiat! (Vajatakse %d baiti)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "TrustDB initsialiseerimine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "võtmehoidla vahemälu uuesti loomine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "võtmeserverile saatmine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "viga parooli loomisel: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "viga võtmebloki lugemisel: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: viga vaba kirje lugemisel: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' on juba pakitud\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "genereeri uus võtmepaar"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "TrustDB initsialiseerimine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Võtme genereerimine ebaõnnestus: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s allkiri, sõnumilühendi algoritm %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "ei leia OpenPGP andmeid.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "pakend: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "vigane pakendi päis: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "pakendi päis: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "vigane avateksti allkirja päis\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "avateksti allkirjad üksteise sees\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "ootamatu pakend:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "vigane kriipsudega märgitud rida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "vigane radix64 sümbol %02x vahele jäetud\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "enneaegne faililõpp (puudub CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "enneaegne faililõpp (poolik CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "vigane CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC viga; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "enneaegne faililõpp (lõpetaval real)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "viga lõpetaval real\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "ei leia OpenPGP andmeid.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "vigane pakend: rida on pikem, kui %d sümbolit\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"kvooditud sümbol pakendis - tõenäoliselt on kasutatud vigast MTA programmi\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "salajane võti ei ole kättesaadav"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "seda ei saa teha pakettmoodis\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Teie valik? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Põhjus puudub"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "ei töödeldud"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "vastavat avalikku võtit pole: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "viga `%s' lugemisel: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "uuendatud eelistused"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "lubamatu sümbol eelistuste sõnes\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "lubamatu sümbol eelistuste sõnes\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "viga: vigane sõrmejälg\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "näita sõrmejälge"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "viga: vigane sõrmejälg\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Võtme genereerimine ebaõnnestus: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "ei leia OpenPGP andmeid.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "viga salajase võtme võtmehoidlasse `%s' kirjutamisel: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Palun valige, millist võtmetüüpi te soovite:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Allkiri aegus %s\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (ainult krüpteerimiseks)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Vigane valik.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Palun valige tühistamise põhjus:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "tundmatu kaitsealgoritm\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Primaarse võtme salajased komponendid ei ole kättesaadavad.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "jätsin vahele: avalik võti on juba olemas\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "välju sellest menüüst"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "vastuolulised käsud\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "näita seda abiinfot"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Võtme leiate: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "muuda aegumise kuupäeva"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "muuda omaniku usaldust"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "näita sõrmejälge"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "genereeri uus võtmepaar"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Käsklus> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "vastuolulised käsud\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "vastuolulised käsud\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Vigane käsklus (proovige \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "salajane võti ei ole kättesaadav"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Korrake parooli: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "parooli ei korratud õieti; proovige uuesti"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "`%s' ei õnnestu avada\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "võti --output ei tööta selle käsuga\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "võtit '%s' ei leitud: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "viga võtmebloki lugemisel: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(kui te just ei määra võtit sõrmejäljega)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "pakettmoodis ei õnnestu seda teha võtmeta \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Kustutan selle võtme võtmehoidlast? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "See on salajane võti! - kas kustutan tõesti? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "omaniku usalduse info puhastatud\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "avaliku võtme \"%s\" jaoks on salajane võti!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "selle kustutamiseks kasutage võtit \"--delete-secret-keys\".\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "viga parooli loomisel: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "S2K moodi tõttu ei saa sümmeetrilist ESK paketti kasutada\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "kasutan ¨iffrit %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' on juba pakitud\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "HOIATUS: `%s' on tühi fail\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"RSA võtmeid pikkusega kuni 2048 bitti saab krüpteerida ainult --pgp2 moodis\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "loen failist `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "kõikide krüpteeritavate võtmetega ei saa IDEA ¨iffrit kasutada.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"sümmetrilise ¨ifri %s (%d) kasutamine on vastuolus saaja eelistustega\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"pakkimise algoritmi %s (%d) kasutamine on vastuolus saaja eelistustega\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"sümmetrilise ¨ifri %s (%d) kasutamine on vastuolus saaja eelistustega\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "%s ei ole moodis %s lubatud.\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s krüptitud kasutajale: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s krüpteeritud andmed\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "krüpteeritud tundmatu algoritmiga %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "HOIATUS: teade on krüptitud sümmeetrilise ¨ifri nõrga võtmega.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "probleem krüptitud paketi käsitlemisel\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "mittelokaalse programmi käivitamist ei toetata\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "kataloogi `%s' ei õnnestu luua: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"väliste programmide käivitamine on blokeeritud, kuna seadete failil on\n"
+"ebaturvalised õigused\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"see platvorm nõuab väliste programmide käivitamiseks ajutiste failide "
+"kasutamist\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "ei Õnnestu käivitada %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "ei Õnnestu käivitada %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "süsteemi viga välise programmi kasutamisel: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "väline programm lõpetas erandlikult\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "välist programmi ei õnnestu käivitada\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "ei õnnestu lugeda välise programmi vastust: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "HOIATUS: ei saa kustutada ajutist faili (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "HOIATUS: ei õnnestu eemaldada ajutist kataloogi `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Allkiri märgitakse kehtetuks mitte-tunnistatavaks.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+"`%s' jaoks pole tühistamise võtmeid\n"
+"\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "tühista sekundaarne võti"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "mittekasutatav salajane võti"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "võti %08lX: ei ole kaitstud - jätsin vahele\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "võti %08lX: PGP 2.x stiilis võti - jätsin vahele\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "võti %08lX: alamvõtme allkiri on vales kohas - jätan vahele\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "TrustDB initsialiseerimine ebaõnnestus: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "HOIATUS: salajases võtmes %08lX puudub lihtne SK kontrollsumma\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "HOIATUS: midagi ei eksporditud\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Käsud:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fail]|loo allkiri"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fail]|loo avateksti allkiri"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "loo eraldiseisev allkiri"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "krüpteeri andmed"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "krüpteerimine kasutades ainult sümmeetrilist ¨ifrit"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "dekrüpteeri andmed (vaikimisi)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "kontrolli allkirja"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "näita võtmeid"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "näita võtmeid ja allkirju"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "kontrolli võtmete allkirju"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "näita võtmeid ja sõrmejälgi"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "näita salajasi võtmeid"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "genereeri uus võtmepaar"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "eemalda võtmed avalike võtmete hoidlast"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "eemalda võtmed salajaste võtmete hoidlast"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "allkirjasta võti"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "allkirjasta võti lokaalselt"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "allkirjasta või toimeta võtit"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "genereeri tühistamise sertifikaat"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "ekspordi võtmed"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "ekspordi võtmed võtmeserverisse"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "impordi võtmed võtmeserverist"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "otsi võtmeid võtmeserverist"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "uuenda võtmeid võtmeserverist"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "impordi/mesti võtmed"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "uuenda usalduse andmebaasi"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [failid]|trüki teatelühendid"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Võtmed:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "loo ascii pakendis väljund"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NIMI|krüpti NIMEle"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "kasuta seda kasutaja IDd"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|määra pakkimise tase N (0 blokeerib)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "kasuta kanoonilist tekstimoodi"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "kasuta väljundfailina"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "ole jutukas"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "ära tee mingeid muutusi"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "küsi enne ülekirjutamist"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Kõikide käskude ja võtmete täieliku kirjelduse leiate manualist)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Näited:\n"
+"\n"
+" -se -r Bob [fail]          allkirjasta ja krüpti kasutajale Bob\n"
+" --clearsign [fail]         loo avateksti allkiri\n"
+" --detach-sign [fail]       loo eraldiseisev allkiri\n"
+" --list-keys [nimed]        näita võtmeid\n"
+" --fingerprint [nimed]      näita sõrmejälgi\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Palun saatke veateated aadressil <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Kasuta: gpg [võtmed] [failid] (-h näitab abiinfot)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Süntaks: gpg [võtmed] [failid]\n"
+"allkirjasta, kontrolli, krüpti ja dekrüpti\n"
+"vaikimisi operatsioon sõltub sisendandmetest\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Toetatud algoritmid:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Avalik võti: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "¦iffer: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Räsi: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Pakkimine: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "kasuta: gpg [võtmed] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "vastuolulised käsud\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "grupi definitsioonis \"%s\" puudub sümbol =\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "HOIATUS: ebaturvaline omanik %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "HOIATUS: ebaturvaline omanik %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "HOIATUS: ebaturvaline omanik %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "HOIATUS: ebaturvalised õigused %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "HOIATUS: ebaturvalised õigused %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "HOIATUS: ebaturvalised õigused %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "HOIATUS: ebaturvaline kataloogi omanik %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "HOIATUS: ebaturvaline kataloogi omanik %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "HOIATUS: ebaturvaline kataloogi omanik %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "Hoiatus: ebaturvalised kataloogi õigused %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "Hoiatus: ebaturvalised kataloogi õigused %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "Hoiatus: ebaturvalised kataloogi õigused %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "tundmatu seade \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Vastavat allkirja salajaste võtmete hoidlas pole\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "antud allkirja poliisi URL on vigane\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "näita millisesse võtmehoidlasse näidatud võti kuulub"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Vastavat allkirja salajaste võtmete hoidlas pole\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "MÄRKUS: ignoreerin vana vaikimisi võtmete faili `%s'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "MÄRKUS: vaikimisi võtmete fail `%s' puudub\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "võtmete fail `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "loen võtmeid failist `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "MÄRKUS: %s ei ole tavapäraseks kasutamiseks!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "ebaturvaliste õiguste tõttu ei laetud ¨ifri laiendust \"%s\"\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s ei ole lubatud kooditabel\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s ei ole lubatud kooditabel\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "ei saa parsida võtmeserveri URI\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: vigased impordi võtmed\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "vigased impordi võtmed\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: vigased impordi võtmed\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "vigased impordi võtmed\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s ei ole lubatud kooditabel\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "antud allkirja poliisi URL on vigane\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s ei ole lubatud kooditabel\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "exec-path väärtuseks ei õnnestu seada %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: vigased ekspordi võtmed\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "HOIATUS: programm võib salvestada oma mälupildi!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "HOIATUS: %s määrab üle %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s ja %s ei ole koos lubatud!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s ja %s ei oma koos mõtet!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent ei ole sesses sessioonis kasutatav\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"--pgp2 moodis saate luua ainult eraldiseisvaid või avateksti allkirju\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "--pgp2 moodis ei saa korraga allkirjastada ja krüpteerida\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "--pgp2 moodis peate kasutama faile (ja mitte toru).\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "teate krüpteerimine --pgp2 moodis nõuab IDEA ¨iffrit\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "valitud ¨ifri algoritm ei ole lubatud\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "valitud lühendi algoritm ei ole lubatud\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "valitud ¨ifri algoritm ei ole lubatud\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "valitud sertifikaadi lühendi algoritm ei ole lubatud\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed peab olema suurem, kui 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed peab olema suurem, kui 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth peab olema vahemikus 1 kuni 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "vigane vaikimisi-sert-tase; peab olema 0, 1, 2 või 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "vigane min-sert-tase; peab olema 1, 2 või 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "MÄRKUS: lihtne S2K mood (0) ei soovitata kasutada\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "vigane S2K mood; peab olema 0, 1 või 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "vigased vaikimisi eelistused\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "vigased isikliku ¨ifri eelistused\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "vigased isikliku lühendi eelistused\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "vigased isikliku pakkimise eelistused\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s ei tööta veel koos %s-ga\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "¨ifri algoritm \"%s\" ei ole moodis %s lubatud\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "sõnumilühendi algoritm \"%s\" ei ole moodis %s lubatud\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "pakkimise algoritm \"%s\" ei ole moodis %s lubatud\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "TrustDB initsialiseerimine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [failinimi]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [failinimi]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "lahtikrüpteerimine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [failinimi]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [failinimi]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "%s ei ole moodis %s lubatud.\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [failinimi]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [failinimi]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [failinimi]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "%s ei ole moodis %s lubatud.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [failinimi]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [failinimi]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [failinimi]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key kasutaja-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key kasutaja-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key kasutaja-id [käsud]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [kasutaja-id] [võtmehoidla]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "võtmeserverile saatmine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "võtmeserverilt lugemine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "võtme eksport ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "võtmeserveri otsing ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "võtmeserveri uuendamine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "lahtipakendamine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "pakendamine ebaõnnestus: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "vigane räsialgoritm `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[failinimi]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Kirjutage nüüd oma teade ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "antud sertifikaadi poliisi URL on vigane\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "antud allkirja poliisi URL on vigane\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "antud allkirja poliisi URL on vigane\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "avalike võtmete puhvris on liiga palju võtmeid - blokeerin\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[Kasutaja id puudub]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Vigane võti %08lX muudeti kehtivaks võtme --allow-non-selfsigned-uid "
+"kasutamisega\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "avalikul alamvõtmel %08lX puudub salajane alamvõti - ignoreerin\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "kasutan sekundaarset võtit %08lX primaarse võtme %08lX asemel\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "võti %08lX: salajane võti avaliku võtmeta - jätsin vahele\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "ole mõnevõrra vaiksem"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "võta võtmed sellest võtmehoidlast"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "teata ajatemplite konfliktist ainult hoiatusega"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FP|kirjuta olekuinfo sellesse failipidemesse"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Kasuta: gpgv [võtmed] [failid] (-h näitab abiinfot)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Süntaks: gpg [võtmed] [failid]\n"
+"kontrolli allkirju tuntud usaldusväärsete võtmetega\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Teie ülesanne on sisestada nüüd väärtus; seda väärtust ei avalikustata\n"
+"kolmandatele pooltele. Seda väärtust on vaja et realiseerida usaldusvõrk."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Usalduse võrgu loomiseks peab GnuPG teadma, millised võtmed on\n"
+"absoluutselt usaldatavad. Need on tavaliselt võtmed, mille puhul\n"
+"on teil juurdepääs ka nende salajastele võtmetele. Kui soovite\n"
+"määrata seda võtit absoluutselt usaldatavaks, vastake \"jah\"\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Kui te ikkagi soovite kasutada seda mitteusaldatavat võtit, vastake \"jah\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Sisestage kasutaja ID aadressile, kellele te soovite teadet saata."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Üldiselt ei ole hea mõte kasutada sama võtit allkirjastamiseks ja\n"
+"krüpteerimiseks. Seda algoritmi tuleks kasutada ainult teatud piirides.\n"
+"Enne kasutamist konsulteerige palun oma turva eksperdiga."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Sisestage võtmepikkus"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Vastake \"jah\" või \"ei\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Sisestage nõutav väärtus, nagu viibal näidati.\n"
+"Võimalik on ka sisestada ISO kuupäev (AAAA-KK-PP), aga te ei\n"
+"saa korrektset veateadet, kuna süsteem üritab antud väärtust\n"
+"tõlgendada vahemikuna."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Sisestage võtmehoidja nimi"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "palun e-posti aadress, aadress ei ole kohustuslik, aga väga soovitav"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Te võite nüüd sisestada kommentaari"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  et muuta nime.\n"
+"K  et muuta kommentaari.\n"
+"E  et muuta e-posti aadressi.\n"
+"O  et jätkata võtme loomist.\n"
+"V  et lõpetada võtme loomine."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Vastake \"jah\" (või \"j\"), kui võib alustada alamvõtme loomisega."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Kui te allkirjastate võtme kasutaja ID, kontrollige kõigepealt, kas võti\n"
+"ikka kuulub antud ID-ga näidatud isikule. Teistel inimestel on hea teada,\n"
+"kui hoolikalt te seda kontrolli olete teostanud.\n"
+"\n"
+"\"0\" tähendab, et te ei väida oma kontrollimise kohta midagi.\n"
+"\n"
+"\"1\" tähendab, et te usute, et võtit omab isik, kes seda väidab omavat, "
+"kuid\n"
+"    te ei saanud või ei soovinud seda väidet täiendavalt kontrollida. See\n"
+"    on kasulik \"persooni\" kontrolliks, kui te allkirjastate isiku pseudo-\n"
+"    nüümi võtit.\n"
+"\n"
+"\"2\" tähendab, et te teostasite võtme pealiskaudset kontrolli. See võib\n"
+"    näiteks tähendada, et te kontrollisite võtme sõrmejälge ja "
+"kontrollisite\n"
+"    võtme kasutaja ID foto ID vastu.\n"
+"\n"
+"\"3\" tähendab, et te teostasite võtme põhjalikku kontrolli. See võib "
+"näiteks\n"
+"    tähendada, et võrdlesite võtme sõrmejälge võrme omanikuga otse suheldes\n"
+"    ja et te kontrollisite raskesti võltsitavast allikast (nt. pass) et\n"
+"    võtme omaniku nimi vastab võtmel näidatud kasutaja IDle ja te kontrol-\n"
+"    lisite, et võtmel näidatud e-posti aadress kuulub võtme omanikule.\n"
+"\n"
+"pange tähele, et näited tasemete 2 ja 3 juures on *ainult* näited. Sõltub\n"
+"ainult teist, milline on \"pealiskaudse\" ja \"põhjaliku\" kontrolli "
+"tähendus,\n"
+"kui te allkirjastate teisi võtmeid.\n"
+"\n"
+"Kui te ei tea õiget vastust, vastake \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Kui te soovite allkirjastada KÕIK kasutaja IDd, vastake \"jah\""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Kui te tõesti soovite seda kasutaja IDd kustutada, vastake \"jah\".\n"
+"Sertifikaadid kustutatakse samuti!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Kui selle alamvõtme võib kustutada, vastake \"jah\""
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"See on võtme kehtiv allkiri; tavaliselt seda ei soovita kustutada,\n"
+"kuna see allkiri võib olla vajalik, et kirjeldada antud võtme või\n"
+"antud võtmega sertifitseeritud teise võtme usaldatavust."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Seda allkirja ei saa kontrollida, kuna puudub allkirjale vastav võti.\n"
+"Te peaksite peatama kustutamise, kuni on teada, millist võtit see\n"
+"kasutab, sest see võti võib moodustada usaldussuhte läbi mõne juba\n"
+"sertifitseeritud võtme."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "Allkiri ei ole kehtiv. Oleks mõistlik see võtmehoidlast kustutada."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"See allkiri seob kasutaja ID võtmega. Sellist allkirja ei ole\n"
+"üldiselt soovitatav eemaldada. Peale selle kustutamist ei pruugi\n"
+"GnuPG enam olla võimeline seda võtit leidma. Kustutada võiks\n"
+"vaid siis, kui see allkiri ei ole miskipärast kehtiv ja on\n"
+"olemas ka teine allkiri, mis kasutajat võtmega seob."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Muuda kõikide kasutaja ID-de seaded (või ainult valitud)\n"
+"vastavaks hetkel määratud seadetele. Kõikide asjasse puutuvate\n"
+"ise loodud allkirjade ajatempleid suurendatakse ühe sekundi võrra.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Palun sisestage parool; see on salajane tekst \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Palun korrake parooli, siis saate oma kirjutatus kindel olla."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Sisestage palun failinimi, mida allkirjastada"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Vastake \"jah\", kui faili võib üle kirjutada"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Palun sisestage uus failinimi. Kui te vajutate lihtsalt reavahetust,\n"
+"kasutatakse vaikimisi faili (nimi on nurksulgudes)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Te peate määrama sertifitseerimise põhjuse. Sõltuvalt kontekstist on\n"
+"teil võimalus valida üks järgnevaist:\n"
+"  \"Võti on kompromiteeritud\"\n"
+"      Kasutage seda, kui teil on põhjust uskuda, et autoriseerimata\n"
+"      isikud on saanud juurdepääsu teie salajasele võtmele.\n"
+"  \"Võti on asendatud\"\n"
+"      Kasutage seda, kui te olete selle võtme asendanud uuemaga.\n"
+"  \"Võti ei ole enam kasutusel\"\n"
+"      Kasutage seda, kui te ei kasuta enam seda võtit.\n"
+"  \"Kasutaja ID ei ole enam kehtiv\"\n"
+"      Kasutage seda märkimaks, et konkreetset kasutaja ID ei peaks enam\n"
+"      kasutama; seda kasutatakse tavaliselt märkimaks vigast e-posti "
+"aadressi.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Kui te soovite, võite nüüd sisestada põhjenduse, miks te\n"
+"soovite seda tühistamise sertifikaati esitada. Palun kirjutage\n"
+"lühidalt. Tühi rida lõpetab teksti.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Abiinfo puudub"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "`%s' kohta abiinfo puudub"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "uuenda usalduse andmebaasi"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "avalik võti ei sobi salajase võtmega!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "mittekasutatav salajane võti"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "jätan bloki tüübiga %d vahele\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu võtit on seni töödeldud\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Töödeldud kokku: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr " vahele jäetud uusi võtmeid: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "    puudub kasutaja ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "            imporditud: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "              muutmata: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "       uusi kasutajaid: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "      uusi alamvõtmeid: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "         uusi allkirju: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "      uusi tühistamisi: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr " loetud salajasi võtmeid: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr " salajasi võtmeid imporditud: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " muutmata salajasi võtmeid: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "       pole imporditud: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "         uusi allkirju: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr " loetud salajasi võtmeid: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Te olete allkirjastanud järgnevad kasutaja IDd:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s allkiri, sõnumilühendi algoritm %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "võti %08lX: kasutaja ID puudub\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "võti %08lX: HKP alamvõtme rike parandatud\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr ""
+"võti %08lX: aktsepteerisin iseenda poolt allakirjutamata kasutaja ID '%s'\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "võti %08lX: puudub kehtiv kasutaja ID\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "see võib olla põhjustatud puuduvast iseenda allkirjast\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "võti %08lX: avalikku võtit ei leitud: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "võti %08lX: uus võti - jätsin vahele\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "ei leia kirjutatavat võtmehoidlat: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "kirjutan faili `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "viga võtmehoidlasse `%s' kirjutamisel: %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "võti %08lX: avalik võti \"%s\" on imporditud\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "võti %08lX: ei sobi meie koopiaga\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "võti %08lX: ei leia algset võtmeblokki: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "võti %08lX: ei õnnestu lugeda algset võtmeblokki: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "võti %08lX: \"%s\" 1 uus kasutaja ID\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "võti %08lX: \"%s\" %d uut kasutaja IDd\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "võti %08lX: \"%s\" 1 uus allkiri\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "võti %08lX: \"%s\" %d uut allkirja\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "võti %08lX: \"%s\" 1 uus alamvõti\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "võti %08lX: \"%s\" %d uut alamvõtit\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "võti %08lX: \"%s\" %d uut allkirja\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "võti %08lX: \"%s\" %d uut allkirja\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "võti %08lX: \"%s\" %d uut kasutaja IDd\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "võti %08lX: \"%s\" %d uut kasutaja IDd\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "võti %08lX: \"%s\" ei muudetud\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "võti %08lX: salajane võti vigase ¨ifriga %d - jätsin vahele\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "puudub salajaste võtmete vaikimisi võtmehoidla: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "võti %08lX: salajane võti on imporditud\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "võti %08lX: on juba salajaste võtmete hoidlas\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "võti %08lX: salajast võtit ei leitud: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"võti %08lX: avalik võti puudub - tühistamise sertifikaati ei saa rakendada\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "võti %08lX: vigane tühistamise sertifikaat: %s - lükkasin tagasi\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "võti %08lX: \"%s\" tühistamise sertifikaat imporditud\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "võti %08lX: allkirjal puudub kasutaja ID\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "võti %08lX: mittetoetatud avaliku võtme algoritm kasutajaga \"%s\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "võti %08lX: kasutajal \"%s\" on vigane iseenda allkiri\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "võti %08lX: võtmeseosel puudub alamvõti\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "võti %08lX: mittetoetatud avaliku võtme algoritm\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "võti %08lX: vigane alamvõtme seos\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "võti %08lX: vigane mitme alamvõtme seos\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "võti %08lX: võtme tühistamiseks puudub alamvõti\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "võti %08lX: vigane alamvõtme tühistamine\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "võti %08lX: eemaldasin mitme alamvõtme tühistamise\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "võti %08lX: jätsin vahele kasutaja ID '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "võti %08lX: jätsin alamvõtme vahele\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "võti %08lX: mitte eksporditav allkiri (klass %02x) - jätan vahele\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "võti %08lX: tühistamise sertifikaat on vales kohas - jätan vahele\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "võti %08lX: vigane tühistamise sertifikaat: %s - jätan vahele\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "võti %08lX: alamvõtme allkiri on vales kohas - jätan vahele\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "võti %08lX: ootamatu allkirja klass (0x%02x) - jätan vahele\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "võti %08lX: tuvastasin dubleeritud kasutaja ID - mestisin\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"HOIATUS: võti %08lX võib olla tühistatud: laen tühistamise võtit %08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"HOIATUS: võti %08lX võib olla tühistatud: tühistamise võtit %08lX pole.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "võti %08lX: \"%s\" tühistamise sertifikaat lisatud\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "võti %08lX: lisatud vahetu võtme allkiri\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "avalik võti ei sobi salajase võtmega!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "jätsin vahele: avalik võti on juba olemas\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "jätsin vahele: avalik võti on juba olemas\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "viga võtmehoidla `%s' loomisel: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "võtmehoidla `%s' on loodud\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "viga `%s' loomisel: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "võtmehoidla vahemälu uuesti loomine ebaõnnestus: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[tühistamine]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[iseenda allkiri]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 halb allkiri\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d halba allkirja\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 allkiri jäi testimata, kuna võti puudub\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d allkirja jäi testimata, kuna võtmed puuduvad\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 allkiri jäi vea tõttu kontrollimata\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d allkirja jäi vigade tõttu kontrollimata\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "tuvastasin ühe kehtiva iseenda allkirjata kasutaja ID\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "tuvastasin %d kehtiva iseenda allkirjata kasutaja IDd\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Palun otsustage, kuivõrd te usaldate seda kasutajat\n"
+"teiste kasutajate võtmete kontrollimisel (kontrollige\n"
+"passe, kontrollige erinevatest allikatest näpujälgi...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Usaldan vähesel määral\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Usaldan täiesti\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Kasutaja ID \"%s\" on tühistatud."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Olete kindel, et soovite seda ikka allkirjastada? (j/e) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Ei saa allkirjastada.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Kasutaja ID \"%s\" on aegunud."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Kasutaja ID \"%s\" ei ole ise allkirjastatud."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Kasutaja ID \"%s\" ei ole ise allkirjastatud."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Allkirjastan tõesti? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Iseenda allkiri \"%s\"\n"
+"on PGP 2.x stiilis allkiri.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Kas te soovite seda edutada OpenPGP iseenda allkirjaks? (j/E) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Teie praegune allkiri \"%s\"\n"
+"on aegunud.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Kas soovite luua uut allkirja et asendada vana aegunud? (j/E) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Teie praegune allkiri \"%s\"\n"
+"on lokaalne allkiri.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+"Kas te soovite seda edutada täielikuks eksporditavaks allkirjaks? (j/E) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" on juba lokaalselt allkirjastatud võtmega %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" on juba allkirjastatud võtmega %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Olete kindel, et soovite seda ikka allkirjastada? (j/E) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Võtmega %08lX pole midagi allkirjastada\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "See võti on aegunud!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "See võti aegub %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Soovite, et teie allkiri aeguks samal ajal? (J/e) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr "--pgp2 moodis ei saa PGP 2.x võtmele OpenPGP allkirja anda.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "See muudab võtme PGP 2.x programmidega mitte-kasutatavaks.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Kui hoolikalt te olete kontrollinud et võti, mida te asute allkirjastama,\n"
+"kuulub ka tegelikult ülal mainitud isikule? Kui te ei tea, mida vastata,\n"
+"sisestage \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Ma ei vasta.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Ma ei ole üldse kontrollinud.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Ma olen teinud pealiskaudset kontrolli.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Ma olen kontrollinud väga hoolikalt.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Teie valik? (lisainfo saamiseks vajutage '?'): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Olete tõesti kindel, et soovite seda võtit oma\n"
+"võtmega allkirjastada: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"See saab olema iseenda allkiri.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"HOIATUS: allkirja ei märgita mitte-eksporditavaks.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"HOIATUS: allkirja ei märgita kehtetuks mitte-tunnistatavaks.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Allkiri märgitakse mitte-eksporditavaks.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Allkiri märgitakse kehtetuks mitte-tunnistatavaks.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Ma ei ole seda võtit üldse kontrollinud.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Ma olen seda võtit kontrollinud ainult pealiskaudselt.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Ma olen kontrollinud seda võtit väga hoolikalt.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Allkirjastan tõesti? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "allkirjastamine ebaõnnestus: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "See võti ei ole kaitstud.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Primaarse võtme salajased komponendid ei ole kättesaadavad.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Primaarse võtme salajased komponendid ei ole kättesaadavad.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Võti on kaitstud.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Seda võtit ei õnnestu toimetada: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Sisestage sellele salajasele võtmele uus parool.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "parooli ei korratud õieti; proovige uuesti"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Te ei soovi parooli - see on tõenäoliselt *halb* idee!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Kas te tõesti soovite seda teha? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "tõstan võtme allkirja õigesse kohta\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "salvesta ja välju"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "näita sõrmejälge"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "näita võtit ja kasutaja IDd"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "vali kasutaja ID N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "vali kasutaja ID N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "tühista allkirjad"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "allkirjasta võti lokaalselt"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Vihje: Valige allkirjastamiseks kasutaja\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "lisa kasutaja ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "lisa foto ID"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "kustuta kasutaja ID"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "kustuta sekundaarne võti"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "lisa tühistamise võti"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Kas uuendan tõesti kõik kasutaja ID-de seaded? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "v3 võtme aegumise aega ei saa muuta.\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "märgi kasutaja ID primaarseks"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "lülita salajaste või avalike võtmete loendi vahel"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "näita eelistusi (ekspert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "näita eelistusi (detailsena)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Kas uuendan tõesti kõik kasutaja ID-de seaded? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "ei saa parsida võtmeserveri URI\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Kas uuendan tõesti kõik kasutaja ID-de seaded? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "muuda parooli"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "muuda omaniku usaldust"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Kas tühistan tõesti kõik valitud kasutaja IDd? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "tühista kasutaja ID"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "tühista sekundaarne võti"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "luba võti"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "blokeeri võti"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "näita foto ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "viga salajase võtmebloki `%s' lugemisel: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Salajane võti on kasutatav.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Selle tegamiseks on vaja salajast võtit.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Palun kasutage kõigepealt käsku \"toggle\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Võti on tühistatud."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Kas allkirjastan tõesti kõik kasutaja IDd? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Vihje: Valige allkirjastamiseks kasutaja\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "tundmatu allkirja klass"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "See käsklus ei ole %s moodis lubatud.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Te peate valima vähemalt ühe kasutaja ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Viimast kasutaja ID ei saa kustutada!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Kas kustutan tõesti kõik kasutaja IDd? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Kas eemaldan tõesti selle kasutaja ID? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Kas eemaldan tõesti selle kasutaja ID? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Te peata valima vähemalt ühe võtme.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "`%s' ei õnnestu avada: %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "viga võtmehoidla `%s' loomisel: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Te peata valima vähemalt ühe võtme.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Kas te tõesti soovite valitud võtmeid kustutada? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Kas te tõesti soovite seda võtit kustutada? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Kas tühistan tõesti kõik valitud kasutaja IDd? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Kas tühistan tõesti selle kasutaja ID? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Kas te tõesti soovite seda võtit tühistada? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Kas te tõesti soovite valitud võtmeid tühistada? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Kas te tõesti soovite seda võtit tühistada? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "sea eelistuste nimekiri"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Kas uuendan tõesti kõik kasutaja ID-de seaded? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Kas tõesti uuendan seaded? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Salvestan muutused? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Väljun salvestamata? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "uuendamine ebaõnnestus: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "salajase võtme uuendamine ebaõnnestus: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Võtit ei muudetud, seega pole uuendamist vaja.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Teatelühend: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Omadused: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Noteering: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "PGP 2.x stiilis kasutaja ID ei oma seadeid.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Selle võtme võib olla tühistanud %s võti "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Selle võtme võib olla tühistanud %s võti "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (tundlik)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "%s ei õnnestu luua: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[tühistatud] "
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [aegub: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [aegub: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " usaldus: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " usaldus: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "See võti on blokeeritud"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Tuleb tähele panna et kuni te pole programmi uuesti käivitanud, ei pruugi\n"
+"näidatud võtme kehtivus olla tingimata korrektne.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[tühistatud] "
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"HOIATUS: ühtegi kasutaja ID pole märgitud primaarseks.  See käsklus võib\n"
+"              põhjustada muu kasutaja ID primaarseks määramist.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"HOIATUS: See on PGP2-stiilis võti. Foto ID lisamine võib sundida mõningaid\n"
+"         PGP versioone seda võtit tagasi lükkama.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Olete kindel, et soovite seda ikka lisada? (j/E) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Foto IDd ei saa PGP2 võtmele lisada.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Kustutan selle korrektse allkirja? (j/E/v)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Kustutan selle vigase allkirja? (j/E/v)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Kustutan selle tundmatu allkirja? (j/E/v)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Kas tõesti kustutan selle iseenda allkirja? (j/E)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Kustutatud %d allkiri.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Kustutatud %d allkirja.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Midagi ei kustutatud.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "vigane pakend"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Kasutaja ID \"%s\" on tühistatud."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Kasutaja ID \"%s\" on tühistatud."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Kasutaja ID \"%s\" on tühistatud."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "kasutaja ID \"%s\" on juba tühistatud\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "kasutaja ID \"%s\" on juba tühistatud\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"HOIATUS: See on PGP2-stiilis võti. Määratud tühistaja lisamine võib\n"
+"         põhjustada mõningaid PGP versioone seda võtit tagasi lükkama.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "PGP 2.x-stiili võtmele ei saa määratud tühistajat lisada.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Sisestage määratud tühistaja kasutaja ID: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "PGP 2.x stiilis võtit ei saa nimetada määratud tühistajaks\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "te ei saa nimetada võtit iseenda määratud tühistajaks\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "HOIATUS: See võti on määratud tühistaja poolt tühistatud!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "HOIATUS: võtme seadmist määratud tühistajaks ei saa tagasi võtta!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Olete kindel, et soovite seda võtit seada määratud tühistajaks? (j/E): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Palun eemaldage salajastelt võtmetelt valikud.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "palun valige ülimalt üks sekundaarne võti.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Muudan sekundaarse võtme aegumise aega.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Muudan primaarse võtme aegumise aega.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "v3 võtme aegumise aega ei saa muuta.\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Vastavat allkirja salajaste võtmete hoidlas pole\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "HOIATUS: allkirjastamise alamvõti %08lX ei ole rist-sertifitseeritud\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Palun valige täpselt üks kasutaja ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "jätan kasutaja \"%s\" v3 iseenda allkirja vahele\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Olete kindel, et soovite seda kasutada (j/E)? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Olete kindel, et soovite seda kasutada (j/E)? "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Allkirja noteerimine: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Kirjutan üle (j/E)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Kasutaja ID numbriga %d puudub\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Kasutaja ID numbriga %d puudub\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Kasutaja ID numbriga %d puudub\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "kasutaja ID: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   allkirjastanud %08lX %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (mitte-eksporditav)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "See allkiri aegub %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Olete kindel, et soovite seda ikka tühistada? (j/E) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Loon sellele allkirjale tühistamise sertifikaadi? (j/E) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Te olete allkirjastanud järgnevad kasutaja IDd:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (mitte-eksporditav)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   tühistanud %08lX %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Te asute tühistama järgmisi allkirju:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Kas tõesti loon tühistamise sertifikaadid? (j/E) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "salajast võtit pole\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "kasutaja ID \"%s\" on juba tühistatud\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "HOIATUS: kasutaja ID allkirja ajatempel on %d sekundit tulevikus\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "kasutaja ID \"%s\" on juba tühistatud\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "kasutaja ID \"%s\" on juba tühistatud\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Näitan %s foto IDd suurusega %ld, võti 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "eelistus %c%lu on duplikaat\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "liiga palju `%c' eelistusi\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "liiga palju `%c' eelistusi\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "liiga palju `%c' eelistusi\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "lubamatu sümbol eelistuste sõnes\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "kirjutan otsese allkirja\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "kirjutan iseenda allkirja\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "kirjutan võtit siduva allkirja\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "vigane võtme suurus; kasutan %u bitti\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "võtme suurus ümardatud üles %u bitini\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "krüpteeri andmed"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (ainult krüptimiseks)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Palun valige, millist võtmetüüpi te soovite:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA ja ElGamal (vaikimisi)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (ainult allkirjastamiseks)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (ainult krüpteerimiseks)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (ainult krüptimiseks)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (ainult allkirjastamiseks)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (ainult krüpteerimiseks)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (ainult krüpteerimiseks)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA võtmepaari pikkuseks saab 1024 bitti.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Millist võtmepikkust te soovite? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Soovitud võtmepikkus on %u bitti\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "ümardatud üles %u bitini\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Palun määrake, kui kaua on võti kehtiv.\n"
+"         0 = võti ei aegu\n"
+"      <n>  = võti aegub n päevaga\n"
+"      <n>w = võti aegub n nädalaga\n"
+"      <n>m = võti aegub n kuuga\n"
+"      <n>y = võti aegub n aastaga\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Palun määrake, kui kaua allkiri kehtib.\n"
+"         0 = allkiri ei aegu\n"
+"      <n>  = allkiri aegub n päevaga\n"
+"      <n>w = allkiri aegub n nädalaga\n"
+"      <n>m = allkiri aegub n kuuga\n"
+"      <n>y = allkiri aegub n aastaga\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Võti on kehtiv kuni? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Allkiri on kehtiv kuni? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "vigane väärtus\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s ei aegu kunagi\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s ei aegu kunagi\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s aegub %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Allkiri aegub %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Teie süsteem ei saa esitada kuupäevi peale aastat 2038.\n"
+"Siiski käsitletakse neid korrektselt aastani 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "On see õige (j/e)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Võtme identifitseerimiseks on vaja määrata kasutaja; tarkvara konstrueerib\n"
+"kasutaja id kasutades pärisnime, kommentaari ja e-posti aadressi kujul:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Pärisnimi: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Lubamatu sümbol nimes\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Nimi ei või alata numbriga\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Nimes peab olema vähemalt 5 sümbolit\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "E-posti aadress: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Selline e-posti aadress ei ole lubatud\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Kommentaar: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Lubamatu sümbol kommentaaris\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Te kasutate kooditabelit `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Te valisite selle KASUTAJA-ID:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Ärge palun kirjutage e-posti aadressi pärisnimesse ega kommentaari\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnKkEeOoVv"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Muuda (N)ime, (K)ommentaari, (E)posti või (V)älju? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Muuda (N)ime, (K)ommentaari, (E)posti või (O)k/(V)älju? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Palun parandage kõigepealt viga\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Te vajate oma salajase võtme kaitsmiseks parooli.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Me peame genereerima palju juhuslikke baite. Praegu oleks hea teostada\n"
+"arvutil mingeid teisi tegevusi (kirjutada klaviatuuril, liigutada hiirt,\n"
+"kasutada kettaid jne), see annaks juhuarvude generaatorile võimaluse\n"
+"koguda paremat entroopiat.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Võtme genereerimine katkestati.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "kirjutan avaliku võtme faili `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "kirjutan salajase võtme faili `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "kirjutatavat avalike võtmete hoidlat pole: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "kirjutatavat salajaste võtmete hoidlat pole: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "viga avaliku võtme võtmehoidlasse `%s' kirjutamisel: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "viga salajase võtme võtmehoidlasse `%s' kirjutamisel: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "avalik ja salajane võti on loodud ja allkirjastatud.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Pidage silmas, et seda võtit ei saa kasutada krüptimiseks. \n"
+"Krüptimiseks tuleb genereerida teine võti, seda saate teha\n"
+"kasutades võtit \"--edit-key\".\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Võtme genereerimine ebaõnnestus: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr "võti loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr "võti loodi %lu sekundit tulevikus (ajahüpe või kella probleem)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "MÄRKUS: v3 võtmetele alamvõtmete loomine ei ole OpenPGP ühilduv\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Loon tõesti? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "võtmebloki kustutamine ebaõnnestus: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "`%s' ei õnnestu luua: %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "MÄRKUS: salajane võti %08lX aegus %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "mitte kunagi"
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kriitiline allkirja poliitika: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Allkirja poliitika: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Kriitiline allkirja noteerimine: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Allkirja noteerimine: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Võtmehoidla"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Primaarse võtme sõrmejälg:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "    Alamvõtme sõrmejälg:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Primaarse võtme sõrmejälg:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "     Alamvõtme sõrmejälg:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Võtme sõrmejälg ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "pakendamine ebaõnnestus: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "HOIATUS: on olemas 2 faili konfidentsiaalse infoga.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s ei ole muudetud\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s on uus\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Palun parandage see võimalik turvaprobleem\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "kontrollin võtmehoidlat `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "kontrollitud %lu võtit (%lu allkirja)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "kontrollitud %lu võtit (%lu allkirja)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: võtmehoidla on loodud\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "antud allkirja poliisi URL on vigane\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "HOIATUS: seaded failis `%s' pole seekord veel aktiivsed\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "vigased ekspordi võtmed\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "võtit '%s' ei leitud: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "võtit '%s' ei leitud: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "küsin võtit %08lX võtmeserverist %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "küsin võtit %08lX võtmeserverist %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "otsin \"%s\" HKP serverist %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "otsin \"%s\" HKP serverist %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "otsin \"%s\" HKP serverist %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"allkirjastatud teie võtmega %08lX %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "otsin \"%s\" HKP serverist %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "otsin \"%s\" HKP serverist %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "vigased ekspordi võtmed\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "võtmeserveri viga"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "võtmeserveri viga"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "võtmeserverilt lugemine ebaõnnestus: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "küsin võtit %08lX võtmeserverist %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "küsin võtit %08lX võtmeserverist %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "HOIATUS: ei saa kustutada ajutist faili (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "HOIATUS: ei saa kustutada ajutist faili (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "veider suurus krüptitud sessiooni võtme jaoks (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s krüpteeritud sessiooni võti\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "krüpteeritud tundmatu algoritmiga %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "avalik võti on %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "avaliku võtmega krüpteeritud andmed: hea DEK\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "krüpteeritud %u-bitise %s võtmega, ID %08lX, loodud %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                 ka \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "krüpteeritud %s võtmega, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "avaliku võtmega lahtikrüpteerimine ebaõnnestus: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "krüpteeritud kasutades %lu parooli\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "krüpteeritud ühe parooliga\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "eeldan %s krüpteeritud andmeid\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA ¨iffer pole saadaval, loodan kasutada selle asemel %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "lahtikrüpteerimine õnnestus\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "HOIATUS: teate kooskõlalisus ei ole tagatud\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "HOIATUS: krüpteeritud teadet on muudetud!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "lahtikrüpteerimine ebaõnnestus: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "MÄRKUS: saatja nõudis \"ainult-teie-silmadele\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "algne failinimi on='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "eraldiseisev tühistus - realiseerimiseks kasutage \"gpg --import\"\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Korrektne allkiri kasutajalt \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "allkirja kontroll jäeti ära\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "neid allkirju ei õnnestu töödelda\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Allkiri aegus %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                 ka \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Allkirja lõi %.*s kasutades %s võtit ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Võtme leiate: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "HALB allkiri kasutajalt \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Aegunud allkiri kasutajalt \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Korrektne allkiri kasutajalt \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[ebakindel]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                 ka \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Allkiri aegus %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Allkiri aegub %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s allkiri, sõnumilühendi algoritm %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binaarne"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "tekstimood"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "tundmatu"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Allkirja ei saa kontrollida: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "ei ole eraldiseisev allkiri\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "HOIATUS: leidsin mitu allkirja. Kontrollitakse ainult esimest.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "eraldiseisev allkiri klassiga 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "vana stiili (PGP 2.x) allkiri\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "proc_tree() tuvastas vigase juurmise paketi\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "ei õnnestu blokeerida mälupildi salvestamist: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "faili ei õnnestu avada: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "trustdb: lugemine ebaõnnestus (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "ei oska käsitleda avaliku võtme algoritmi %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "realiseerimata ¨ifri algoritm"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s allkiri, sõnumilühendi algoritm %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"sõnumilühendi algoritmi %s (%d) kasutamine on vastuolus saaja eelistustega\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA ¨ifri lisandprogrammi pole\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = esita palun täiendavat infot\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: ebasoovitav võti \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "HOIATUS: võtit \"%s\" ei soovitata kasutada.\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "palun kasutage selle asemel \"%s%s\"\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "HOIATUS: võtit \"%s\" ei soovitata kasutada.\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Pakkimata"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Pakkimata"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "see teade ei pruugi olla programmiga %s kasutatav\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "loen võtmeid failist `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "tundmatu vaikimisi saaja `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Fail `%s' on olemas. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Kirjutan üle (j/E)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: tundmatu suffiks\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Sisestage uus failinimi"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "kirjutan standardväljundisse\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "eeldan allkirjastatud andmeid failis `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "uus omaduste fail `%s' on loodud\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "HOIATUS: seaded failis `%s' pole seekord veel aktiivsed\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: kataloog on loodud\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "ei oska käsitleda avaliku võtme algoritmi %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"HOIATUS: tõenäoliselt ebaturvaline sümmeetriliselt krüpteeritud sessiooni "
+"võti\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "alampaketil tüübiga %d on kriitiline bitt seatud\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent ei ole sesses sessioonis kasutatav\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "vigane GPG_AGENT_INFO keskkonnamuutuja\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agendi protokolli versioon %d ei ole toetatud\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "ei õnnestu luua ühendust serveriga `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "probleem agendiga - blokeerin agendi kasutamise\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (peamise võtme ID %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Te vajate kasutaja salajase võtme lahtilukustamiseks parooli:\n"
+"\"%.*s\"\n"
+"%u-bitti %s võti, ID %08lX, loodud %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Korrake parooli\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Sisestage parool\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "katkestatud kasutaja poolt\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "pakettmoodis ei saa parooli küsida\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Sisestage parool: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Te vajate kasutaja salajase võtme lahtilukustamiseks\n"
+"parooli: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bitine %s võti, ID %08lX, loodud %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Korrake parooli: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Valige foto ID'na kasutatav pilt. Pilt peab olema JPEG fail.\n"
+"Pidage meeles, et pilt salvestatakse teie avalikus võtmes. Kui kasutate\n"
+"väga suurt pilti, on ka kõti väha suur!\n"
+"Mõistlik pildi suurus võiks olla umbes 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Sisestage foto ID jaoks JPEG faili nimi: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "faili ei õnnestu avada: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Olete kindel, et soovite seda kasutada (j/E)? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\": ei ole JPEG fail\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "On see foto õige (j/E/v)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "foto ID ei saa näidata!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Põhjus puudub"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Võti on asendatud"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Võti on kompromiteeritud"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Võti ei ole enam kasutusel"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Kasutaja ID ei ole enam kehtiv"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "tühistamise põhjus: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "tühistamise kommentaar: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iItTvVjJ"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Usalduse väärtus puudub:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                 ka \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "See võti kuulub tõenäoliselt omanikule\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Ei tea\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = EI usalda\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Usaldan absoluutselt\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " t = tagasi põhimenüüsse\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " j = jäta see võti vahele\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " v = välju\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Teie otsus? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Kas te tõesti soovite seda võtit absoluutselt usaldada? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Sertifikaadid täiesti usaldatava võtmeni:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%08lX: Ei ole midagi, mis näitaks, et see võti kuulub omanikule\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%08lX: Ei ole midagi, mis näitaks, et see võti kuulub omanikule\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "See võti kuulub tõenäoliselt omanikule\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "See võti kuulub meile\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"EI ole kindel, et see võti kuulub isikule, keda mainitakse\n"
+"kasutaja ID väljal. Kui te *tõesti* teate, mida te teete,\n"
+"võite järgnevale küsimusele vastata jaatavalt\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Kasutan seda võtit ikka? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "HOIATUS: Kasutan mitteusaldatavat võtit!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "HOIATUS: see võti võib olla tühistatud (tühistamise võtit pole)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "HOIATUS: See võti on määratud tühistaja poolt tühistatud!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "HOIATUS: See võti on omaniku poolt tühistatud!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         See võib tähendada, et allkiri on võltsing.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "HOIATUS: See alamvõti on omaniku poolt tühistatud!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Märkus: See võti on blokeeritud.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Märkus: See võti on aegunud!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "HOIATUS: Seda võtit ei ole sertifitseeritud usaldatava allkirjaga!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Ei ole midagi, mis näitaks, et allkiri kuulub omanikule.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "HOIATUS: Me EI usalda seda võtit!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Allkiri on tõenäoliselt VÕLTSING.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"HOIATUS: Seda võtit ei ole sertifitseeritud piisavalt usaldatava "
+"allkirjaga!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Ei ole kindel, et allkiri kuulub omanikule.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: jätsin vahele: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: jätsin vahele: avalik võti on juba olemas\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Sisestage kasutaja ID.  Lõpetage tühja reaga: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Tundmatu kasutaja ID.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "jätsin vahele: avalik võti on juba vaikimisi saaja\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Avalik võti on blokeeritud.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "jätsin vahele: avalik võti on juba olemas\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "tundmatu vaikimisi saaja `%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: jätsin vahele: avalik võti on blokeeritud\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "kehtivaid aadresse pole\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "andmeid ei salvestatud; salvestamiseks kasutage võtit \"--output\"\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "viga `%s' loomisel: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Eraldiseisev allkiri.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Palun sisestage andmefaili nimi: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "loen standardsisendit ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "allkirjastatud andmeid pole\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "allkirjastatud andmete avamine ebaõnnestus `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonüümne saaja; proovin salajast võtit %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "ok, me oleme anonüümne teate saaja.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "vana DEK kodeerimine ei ole toetatud\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "¨ifri algoritm %d%s on tundmatu või blokeeritud\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "MÄRKUS: ¨ifri algoritm %d puudub eelistustes\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "MÄRKUS: salajane võti %08lX aegus %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "MÄRKUS: võti on tühistatud"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet ebaõnnestus: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "võti %08lX: kasutaja ID puudub\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Tühistaja:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(See on tundlik tühistamise võti)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Loon sellele võtmele tühistamise sertifikaadi? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Väljundis sunnitakse kasutama ASCII vormingut.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet ebaõnnestus: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Tühistamise sertifikaat on loodud.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+"`%s' jaoks pole tühistamise võtmeid\n"
+"\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "salajast võtit `%s' ei leitud: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "vastavat avalikku võtit pole: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "avalik võti ei sobi salajase võtmega!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Loon sellele võtmele tühistamise sertifikaadi? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "tundmatu kaitsealgoritm\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "MÄRKUS: See võti ei ole kaitstud!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Tühistamise sertifikaat on loodud.\n"
+"\n"
+"Palun salvestage see andmekandjale, mida saate kindlasse kohta ära panna.\n"
+"Kui mallory saab sellele sertifikaadile juurdepääsu, võib ta seda kasutades\n"
+"muuta kõik teie võtmed kasutamiskõlbmatuks.\n"
+"Samuti on mõistlik trükkida see sertifikaat paberile ja panna hoiule "
+"juhuks,\n"
+"kui meedia muutub loetamatuks. Aga olge ettevaatlik: teie arvuti "
+"trükisüsteem\n"
+"võib salvestada need andmed ja teha teistele kättesaadavaks! \n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Palun valige tühistamise põhjus:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Katkesta"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Tõenäoliselt soovite siin valida %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Sisestage mittekohustuslik kirjeldus. Lõpetage tühja reaga:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Tühistamise põhjus: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Kirjeldust ei antud)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "On see hästi? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "salajase võtme komponendid ei ole kättesaadavad\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "kaitse algoritm %d%s ei ole toetatud\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "kaitse algoritm %d%s ei ole toetatud\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Vigane parool; palun proovige uuesti"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "HOIATUS: Tuvastasin nõrga võtme - palun muutke uuesti parooli.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"loon salajase võtme kaitseks mittesoovitavat 16 bitist kontrollsummat\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "loodi nõrk võti - proovin uuesti\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"sümmeetrilises ¨ifris ei õnnestu vältida nõrga võtme kasutamist; proovisin %"
+"d korda!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "HOIATUS: allkirja lühend on teatega konfliktne\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "HOIATUS: allkirjastamise alamvõti %08lX ei ole rist-sertifitseeritud\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "HOIATUS: allkirjastamise alamvõtmel %08lX on vigane rist-sertifikaat\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, 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"
+
+#: g10/sig-check.c:195
+#, 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"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "MÄRKUS: allkirja võti %08lX aegus %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "eeldan tundmatu kriitilise biti tõttu võtmel %08lX vigast allkirja\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "võti %08lX: alamvõtme tühistamise paketile puudub alamvõti\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "võti %08lX: alamvõtme allkirjaga sidumiseks puudub alamvõti\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "noteerimise infot ei saa v3 (PGP 2.x stiilis) allkirja lisada\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "noteerimise infot ei saa v3 (PGP 2.x stiilis) võtme allkirja lisada\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"HOIATUS: noteerimise %%-asendus ebaõnnestus (liiga suur). Kasutan "
+"kompaktset.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "poliisi URLi ei saa v3 (PGP 2.x) allkirjadesse panna\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "poliisi URLi ei saa v3 võtme (PGP 2.x) allkirjadesse panna\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"HOIATUS: poliisi urli %%-asendus ebaõnnestus (liiga suur). Kasutan "
+"kompaktset.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"HOIATUS: poliisi urli %%-asendus ebaõnnestus (liiga suur). Kasutan "
+"kompaktset.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "Loodud allkirja ei õnnestu kontrollida: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s allkiri kasutajalt: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"PGP 2.x stiilis võtmetega saab eraldi-allkirjastada ainult --pgp2 moodis\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"sõnumilühendi algoritmi %s (%d) kasutamine on vastuolus saaja eelistustega\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "allkirjastan:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"PGP 2.x stiilis võtmetega saab avateksti allkirjastada ainult --pgp2 moodis\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "kasutatakse %s krüpteerimist\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"võti ei ole märgitud ebaturvaliseks - sellega ei saa võlts RNGd kasutada!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "`%s' jätsin vahele: duplikaat\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "`%s' jätsin vahele: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "jätsin vahele: avalik võti on juba olemas\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"jätsin `%s' vahele: see on PGP genereeritud ElGamal võti,\n"
+"mis ei ole allkirjades kasutamiseks turvaline!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "usalduse kirje %lu, tüüp %d: kirjutamine ebaõnnestus: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Omistatud usalduse väärtuste loend, loodud: %s\n"
+"# (Taastamiseks kasutage \"gpg --import-ownertrust\")\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "viga `%s' lugemisel: %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "rida on liiga pikk\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "viga: vigane sõrmejälg\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "impordi usalduse väärtused"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "viga usalduse kirje otsimisel: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "viga lugemisel: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: sync ebaõnnestus: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb kirje %lu: lseek ebaõnnestus: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: write failed (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "trustdb transaktsioon on liiga suur\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "`%s' ei õnnestu sulgeda: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: kataloogi ei ole!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "`%s' ei õnnestu luua: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "`%s' ei õnnestu avada\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: versioonikirje loomine ei õnnestu: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: loodi vigane usalduse andmebaas\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: trustdb on loodud\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "MÄRKUS: trustdb pole kirjutatav\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: vigane trustdb\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: paisktabeli loomine ebaõnnestus: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: viga versioonikirje uuendamisel: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: viga versioonikirje lugemisel: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: viga versioonikirje kirjutamisel: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek ebaõnnestus: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: lugemine ebaõnnestus (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: ei ole trustdb fail\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: versioonikirje kirje numbriga %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: vigane faili versioon %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: viga vaba kirje lugemisel: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: viga kataloogikirje kirjutamisel: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: kirje nullimine ebaõnnestus: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: kirje lisamine ebaõnnestus: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "trustdb on vigane; palun käivitage \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "ei suuda käsitleda tekstiridu mis on pikemad, kui %d sümbolit\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "sisendrida on pikem, kui %d sümbolit\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' ei ole kehtiv pikk võtmeID\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "võti %08lX: aktsepteerin usaldusväärse võtmena\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "võti %08lX esineb trustdb failis enam kui korra\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "võti %08lX: usaldataval võtmel pole avalikku võtit - jätsin vahele\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "võti on märgitud abslouutselt usaldatuks.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "usalduse kirje %lu, päringu tüüp %d: lugemine ebaõnnestus: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "usalduse kirje %lu ei oma soovitud tüüpi %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[tühistatud] "
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[aegunud] "
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "tundmatu"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "mitte kunagi"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "trustdb kontrolliks puudub vajadus\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "trustdb järgmine kontroll %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "trustdb kontrolliks puudub vajadus\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "trustdb kontrolliks puudub vajadus\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "ei leia avalikku võtit %08lX: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "palun tehke --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "kontrollin trustdb faili\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d võtit töödeldud (%d kehtivust puhastatud)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "absoluutselt usaldatavaid võtmeid pole\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "puudub absoluutselt usaldatava võtme %08lX avalik võti\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "usalduse kirje %lu, tüüp %d: kirjutamine ebaõnnestus: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"allkirja ei õnnestu kontrollida.\n"
+"Palun pidage meeles, et allkirja fail (.sig või .asc)\n"
+"peab olema käsureal esimene fail.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "sisendrida %u on liiga pikk või seavahetus puudub\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "üldine viga"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "tundmatu paketi tüüp"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "tundmatu versioon"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "tundmatu avaliku võtme algoritm"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "tundmatu lühendi algoritm"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "halb avalik võti"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "halb salajane võti"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "halb allkiri"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "kontrollsumma viga"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "halb parool"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "ei leia avalikku võtit"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "tundmatu ¨ifri algoritm"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "võtmehoidlat ei õnnestu avada"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "vigane pakett"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "vigane pakend"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "sellist kasutaja id pole"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "salajane võti ei ole kättesaadav"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "kasutati valet salajast võtit"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "ei ole toetatud"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "halb võti"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "viga faili lugemisel"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "viga faili kirjutamisel"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "tundmatu pakkimisalgoritm"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "viga faili avamisel"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "viga faili loomisel"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "vigane parool"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "realiseerimata avaliku võtme algoritm"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "realiseerimata ¨ifri algoritm"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "tundmatu allkirja klass"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "usalduse andmebaasi viga"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "halb MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "ressursi limiit"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "vigane võtmehoidla"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "halb sertifikaat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "vigane kasutaja id"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "viga faili sulgemisel"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "viga faili ümber nimetamisel"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "viga faili kustutamisel"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "ootamatud andmed"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "ajatemplite konflikt"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "mittekasutatav avaliku võtme algoritm"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "fail on olemas"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "nõrk võti"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "vigane argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "halb URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "mittetoetatud URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "võrgu viga"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "krüptimata"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "ei töödeldud"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "mittekasutatav avalik võti"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "mittekasutatav salajane võti"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "võtmeserveri viga"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Katkesta"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "krüptimata"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "allkirjastatud andmeid pole\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... see on viga (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "te leidsite vea ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "jah"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "jJ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "ei"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "eE"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "välju"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "vV"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "HOIATUS: kasutan ebaturvalist mälu!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "Lisainfot leiate lehelt http://www.gnupg.org/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "initsialiseerimata turvalise mäluta ei ole operatsioon võimalik\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(te kasutasite vahest selle töö jaoks valet programmi)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA nõuab 160 bitist räsialgoritmi kasutamist\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "lisainfot leiate lehelt http://www.gnupg.org/why-not-idea.html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "noteerimise nimes võivad olla ainult trükitavad sümbolid või tühikud\n"
+#~ "ning lõpus peab olema '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "kasutaja noteerimise nimi peab sisaldama '@' märki\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "kasutaja noteerimise nimi peab sisaldama '@' märki\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "noteerimise väärtus ei või sisaldada kontroll sümboleid\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "HOIATUS: leidsin vigased noteerimise andmed\n"
+
+#~ msgid "not human readable"
+#~ msgstr "pole inimese poolt loetav"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "loe võtmed failist"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "loe võtmed failist"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [aegub: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "võti %08lX: ootamatu allkirja klass (0x%02x) - jätan vahele\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "ei Õnnestu käivitada %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "kasutaja ID \"%s\" on juba tühistatud\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "viga parooli loomisel: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "halb parool või tundmatu ¨ifri algoritm (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "agendile ei õnnestu seada kliendi pid\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "agendiga suhtlemiseks ei õnnestu saada lugemise FD\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "agendiga suhtlemiseks ei õnnestu saada kirjutamise FD\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "probleem gpg-agent programmiga suhtlemisel\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "liiga pikk parool\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "vigane vastus agendilt\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "probleem agendiga: agent tagastas 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "vali sekundaarne võti N"
+
+#~ msgid "list signatures"
+#~ msgstr "näita allkirju"
+
+#~ msgid "sign the key"
+#~ msgstr "allkirjasta võti"
+
+#~ msgid "add a secondary key"
+#~ msgstr "lisa sekundaarne võti"
+
+#~ msgid "delete signatures"
+#~ msgstr "kustuta allkirjad"
+
+#~ msgid "change the expire date"
+#~ msgstr "muuda aegumise kuupäeva"
+
+#~ msgid "set preference list"
+#~ msgstr "sea eelistuste nimekiri"
+
+#~ msgid "updated preferences"
+#~ msgstr "uuendatud eelistused"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Sekundaarne võti numbriga %d puudub\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key kasutaja-id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key kasutaja-id"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "loo eraldiseisev allkiri"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "allkirjasta võti kehtetuks mitte-tunnistatavana"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "allkirjasta võti lokaalselt ja kehtetuks mitte-tunnistatavana"
+
+#~ msgid "q"
+#~ msgstr "v"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "üldine viga"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "lisa foto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primaarne"
+
+#~ msgid "toggle"
+#~ msgstr "lülita"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "võtmeserveri viga"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "sõnumilühendi algoritm `%s' ei ole selles versioonis muudetav\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Enne uue %s võtmepaari genereerimist.\n"
+#~ "           minimaalne võtmepikkus on  768 bitti\n"
+#~ "            vaikimisi võtmepikkus on 1024 bitti\n"
+#~ "    suurim soovitatav võtmepikkus on 2048 bitti\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA lubab võtmepikkuseid ainult vahemikus 512 kuni 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "võtmepikkus on liiga väike; RSA korral on väikseim väärtus 1024.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "võtmepikkus on liiga väike; väikseim lubatud väärtus on 768.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "võtmepikkus on liiga suur; suurim lubatud väärtus on %d.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Suuremad võtmepikkused kui 2048 ei ole soovitatavad, kuna\n"
+#~ "arvutused võtavad VÄGA palju aega!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Olete kindel, et soovite sellist võtmepikkust? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Olgu, kuid pidage meeles, et ka teie monitor ja klaviatuur on samuti\n"
+#~ "võimalikud ründeobjektid!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Eksperimentaalseid algoritme ei peaks kasutama!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "see ¨ifri algoritm ei ole soovitatav; kasutage palun mõnd standardsemat!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "kirjutan faili `%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "vabandust, seda ei saa pakettmoodis teha\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "võtit '%s' ei leitud: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "`%s' ei õnnestu luua: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "faili ei õnnestu avada: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                 ka \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "võti %08lX: võti on tühistatud!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "võti %08lX: alamvõti on tühistatud!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: võti on aegunud\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Me EI usalda seda võtit\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (allkirjastamiseks ja krüptimiseks)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (ainult allkirjastamiseks)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (allkirjastamiseks ja krüptimiseks)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (ainult krüpteerimiseks)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (allkirjastamiseks ja krüptimiseks)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: ei õnnestu avada: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: HOIATUS: tühi fail\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "%s ei õnnestu avada: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Usaldan vähesel määral\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Usaldan täiesti\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "lokaalselt allkirjastatud teie võtmega %08lX %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   allkirjastanud %08lX %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: ei õnnestu kasutada: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: ei õnnestu luua lukku\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: ei õnnestu seada lukku\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: ei õnnestu luua: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: kataloogi ei õnnestu luua: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Kui te ikkagi soovite kasutada seda kehtetut võtit, vastake \"jah\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Fotot \"%s\" ei õnnestu avada: %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "faili ei õnnestu avada: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "viga: puudub koolon\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "viga: usalduse väärtus puudub\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (peamise võtme ID %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! alamvõti on tühistatud: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- leitud võltsitud tühistamine\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? probleem tühistamise kontrollimisel: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [aegub: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [aegub: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[tühistatud] "
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "%s ei õnnestu luua: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "HOIATUS: sõnumilühend `%s' ei ole OpenPGP osa.  Kasutamine omal "
+#~ "vastutusel!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[failid]|krüpteeri failid"
+
+#~ msgid "store only"
+#~ msgstr "ainult salvesta"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[failid]|dekrüpteeri failid"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "allkirjasta võti mitte-tühistatavana"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "allkirjasta võti lokaalselt ja mitte-tühistatavana"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "näita ainult pakettide järjendeid"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "ekspordi usalduse väärtused"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "hooldusvaba usalduse andmebaasi uuendamine"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "paranda vigane usalduse andmebaas"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Pakenda fail või standardsisend lahti"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Pakenda fail või standardsisend"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NIMI|kasuta NIME vaikimisi saajana"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "kasuta vaikimisi saajana vaikimisi võtit"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "ära kasuta terminali"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "kasuta v3 allkirju"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "ära kasuta v3 allkirju"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "kasuta v4 võtme allkirju"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "ära kasuta v3 võtme allkirju"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "krüptimisel kasuta alati MDC"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "krüptimisel ära kasuta kunagi MDC"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "kasuta gpg-agenti"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "pakettmood: ära küsi kunagi"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "eelda enamus küsimustele jah vastust"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "eelda enamus küsimustele ei vastust"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "lisa see võtmehoidla võtmehoidlate nimekirja"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "lisa see salajaste võtmete hoidla nimekirja"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NIMI|kasuta NIME vaikimisi salajase võtmena"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|kasuta seda võtmeserverit"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NIMI|terminali kooditabel on NIMI"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[fail]|kirjuta olekuinfo faili"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|VÕTMEID|usalda seda võtit täielikult"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FAIL|lae laiendusmoodul FAIL"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emuleeri dokumendis RFC1991 kirjeldatud moodi"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "kasuta kõikides tegevustes OpenPGP võtmeid"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "kasuta kõikide pakettide, ¨iffrite ja lühendi seadeid PGP 2.x moodis"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|kasuta parooli moodi N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NIMI|kasuta paroolidega lühendialgoritmi NIMI"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NIMI|kasuta paroolidega ¨ifri algoritmi NIMI"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NIMI|kasuta ¨ifri algoritmi NIMI"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NIMI|kasuta teatelühendi algoritmi NIMI"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|kasuta pakkimisalgoritmi N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "ära lisa krüptimisel võtme id"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Esita foto IDd"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Ei esita foto IDd"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Sea käsurida foto ID vaatamiseks"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "pakkimise algoritm `%s' on selles versioonis ainult lugemiseks\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "pakkimise algoritm peab olema vahemikust %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Ei ole kindel, et see võti tõesti kuulub omanikule,\n"
+#~ "aktsepteerime seda siiski\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "eelistus %c%lu ei ole lubatud\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "võti %08lX: ei ole rfc2440 võti - jätsin vahele\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "MÄRKUS: Tuvastasin Elgamal primaarvõtme - importimine võib võtta mõne "
+#~ "aja\n"
+
+#~ msgid " (default)"
+#~ msgstr " (vaikimisi)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "viga teate saatmisel serverile `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "teate saatmine serverile `%s' õnnestus (olek=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "teate saatmine serverile `%s' ebaõnnestus: olek=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "see võtmeserver ei toeta --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "võtmeserverist ei saa otsida: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "võti %08lX: see on PGP genereeritud ElGamal võti ja EI OLE "
+#~ "allkirjastamiseks turvaline!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "võti %08lX loodi %lu sekund tulevikus (ajahüpe või kella probleem)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "võti %08lX loodi %lu sekundit tulevikus (ajahüpe või kella probleem)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "võti %08lX on märgitud abslouutselt usaldatavaks\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "jätsin Elgamal allkirjastamise võtme %08lX allkirja %08lX-le vahele\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "jätsin %08lX allkirja Elgamal allkirjastamise võtmele %08lX vahele\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "kontrollin sügavusel %d allkirjastatud=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%"
+#~ "d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Valige kasutatav algoritm.\n"
+#~ "\n"
+#~ "DSA (ka DSS) on digitaalallkirja algoritm, mida saab kasutada ainult\n"
+#~ "allkirjades. See on soovitatav algoritm, kuna DSA allkirjade kontroll\n"
+#~ "on oluliselt kiirem ElGamal allkirjade kontrollimisest.\n"
+#~ "\n"
+#~ "ElGamal on algoritm, mida saab kasutada nii allkirjastamisel, kui ka\n"
+#~ "krüptimisel. OpenPGP eristab selle algoritmi kahte varianti: ainult\n"
+#~ "krüptivat ja krüptivat ning allkirjastavat. Algoritm on sama, aga\n"
+#~ "turvaliseks allkirjastamiseks on vaja valida sobivad parameetrid. See\n"
+#~ "programm toetab mõlemat varianti, aga teised OpenPGP realisatsioonid\n"
+#~ "ei pruugi krüptivat ning allkirjastavat võimalust tunda.\n"
+#~ "\n"
+#~ "Esimene (primaarne) võti peab alati olema selline, mida saab kasutada\n"
+#~ "allkirjastamisel; see on ka põhjus, miks selles menüüs ei lubata valida\n"
+#~ "ainult krüptivat ElGamal võtit."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Kuigi need võtmed on kirjeldatud dokumendis RFC2440, ei ole nende\n"
+#~ "kasutamine soovitatav, kuna mitte kõik programmid ei toeta neid\n"
+#~ "ja nendega loodud allkirjad on suured ning kontrollimine aeglane."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "seni on kontrollitud %lu võtit (%lu allkirja)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "mittetäielik võti\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "võti %08lX ei ole täielik\n"
diff --git a/po/fi.gmo b/po/fi.gmo
new file mode 100644 (file)
index 0000000..3f90b53
Binary files /dev/null and b/po/fi.gmo differ
diff --git a/po/fi.po b/po/fi.po
new file mode 100644 (file)
index 0000000..561e4a6
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,7227 @@
+# GnuPG finnish translation
+# Copyright © 1998, 1999, 2000, 2001, 2003-2004 Free Software Foundation, Inc.
+# Jouni Hiltunen <jouni.hiltunen@kolumbus.fi>, 2003.
+# Tommi Vainikainen <Tommi.Vainikainen@iki.fi>, 2003-2004.
+#
+# Suomennoksia:
+# compress algorithm = pakkausalgoritmi
+# digest, hash = tiiviste
+# digest, hash algorithm = tiivistealgoritmi
+# cipher (algorithm) = salain, salausalgoritmi
+# pub key algorithm = julkisen avaimen algoritmi
+#
+# revocation = mitätöinti-
+# certificate = varmeen
+# revocation list = sulkulista
+#
+# - policy = -käytäntö (esim. tietoturvakäytäntö, allekirjoituskäytäntö)
+# key ring = avainrengas
+#
+# armor = ascii-koodaus (saa ehdottaa jos keksii näppärämmän käännöksen)
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-06-16 22:40+0300\n"
+"Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n"
+"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "alkulukua, jossa on alle %d bittiä, ei voi luoda\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "alkulukua, jossa on alle %d bittiä, ei voi luoda\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "entropian keräysmoduulia ei havaittu\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi avata\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi avata: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "tiedoston \"%s\" tilaa ei voi lukea: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "\"%s\" on erikoistiedosto - ohitettiin\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "huom: random_seed-tiedosto on tyhjä\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"VAROITUS: random_seed-tiedosto on väärän kokoinen - tiedostoa ei käytetä\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi lukea: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "huom: random_seed-tiedostoa ei päivitetty\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi luoda: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "tiedostoon \"%s\" ei voi kirjoittaa: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi sulkea: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "VAROITUS: käytetty satunnaislukugeneraattori ei ole turvallinen.\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Satunnaislukugeneraattori on pelkkä kulissi, joka mahdollistaa\n"
+"ohjelman ajamisen - se ei ole vahvasti satunnainen!\n"
+"\n"
+"ÄLÄ KÄYTÄ OHJELMAN TUOTTAMAA DATAA!!\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Ole hyvä ja odota, entropiaa kerätään. Tee jotain työtä, jos se vaikka \n"
+"estäisi sinua pitkästymästä.  Se nimittäin samalla parantaa entropian "
+"laatua.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Satunnaislukuja ei ole vielä tarpeeksi.  Ole hyvä ja jatka työskentelyä \n"
+"antaaksesi käyttöjärjestelmälle mahdollisuuden kerätä lisää entropiaa! \n"
+"(Vielä tarvitaan %d tavua)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "TrustDB:n alustaminen ei onnistu: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "avainrenkaan välimuistin uudelleenluominen epäonnistui: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "avainlohkojen poisto epäonnistui: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "avainpalvelimelle lähettäminen epäonnistui: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "virhe luotaessa salasanaa: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "virhe luettaessa avainlohkoa: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: virhe luettaessa vapaata tietuetta: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "\"%s\" on jo pakattu\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "luo uusi avainpari"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "TrustDB:n alustaminen ei onnistu: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "avainlohkojen poisto epäonnistui: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Avaimen luonti epäonnistui: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+# Ensimmäinen %s on binary, textmode tai unknown, ks. alla
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%sallekirjoitus, tiivistealgoritmi %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "kelvollista OpenPGP-dataa ei löytynyt.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ascii-koodaus: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "epäkelpo ascii-koodausotsake: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "ascii-koodausotsake: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "epäkelpo selkotekstisen allekirjoituksen otsikko\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "sisäkkäisiä tekstimuotoisia allekirjoituksia\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "odottamaton ascii-koodaus:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "epäkelpo viiva rivin lopussa: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "epäkelpo radix64-merkki %02x ohitettu\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "ennenaikainen tiedoston loppu (ei CRC:tä)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "ennenaikainen tiedoston loppu (CRC:ssä)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "väärinmuotoiltu CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC-virhe; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "Ennenaikainen tiedoston loppu (Trailerissa)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "virhe trailer-rivissä\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "kelvollista OpenPGP-dataa ei löytynyt.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "epäkelpo ascii-koodaus: yli %d merkkiä pitkä rivi\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"quoted printable -koodattu merkki ascii-koodauksessa - luultavasti "
+"viallista\n"
+"MTA:ta on käytetty\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "salaista avainta ei löydy"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "tätä ei voi tehdä eräajossa\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Valintasi? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Ei eriteltyä syytä"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "ei käsitelty"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "ei vastaavaa julkista avainta: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "virhe luettaessa tiedostoa \"%s\": %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "päivitä valinnat"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "Valinnassa on luvaton merkki\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Valinnassa on luvaton merkki\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "virhe: sormenjälki on väärä\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "näytä sormenjälki"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "virhe: sormenjälki on väärä\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Avaimen luonti epäonnistui: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "kelvollista OpenPGP-dataa ei löytynyt.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "virhe kirjoitettaessa salaiseen avainrenkaaseen \"%s\": %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Valitse millaisen avaimen haluat:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Allekirjoitus vanheni %s\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (vain salaus)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Valinta ei kelpaa.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Valitse mitätöinnin syy:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "tuntematon suojausalgoritmi\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Ensisijaisen avaimen salaiset osat eivät ole saatavilla.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "ohitetaan: salainen avain on jo paikalla\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "ulos tästä valikosta"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "ristiriitainen komento\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "näytä tämä ohje"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Avain saatavilla kohteessa: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "muuta voimassoloaikaa"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "muuta luottamusastetta"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "näytä sormenjälki"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "luo uusi avainpari"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Komento> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "ristiriitainen komento\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "ristiriitainen komento\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Komento ei kelpaa (kirjoita \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "salaista avainta ei löydy"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "avainlohkojen poisto epäonnistui: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Toista salasana: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "salasanaa ei toistettu oikein, yritä uudestaan."
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "tiedostoa \"%s\" ei voi avata\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output ei toimi yhdessä tämän komennon kanssa\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "avainta \"%s\" ei löydy: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "virhe luettaessa avainlohkoa: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(ellet määritä avainta sormenjäljen perusteella)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "ei onnistu eräajossa ilman \"--yes\"-valitsinta\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Poista tämä avain avainrenkaasta? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Tämä on salainen avain! - poista varmasti? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "avainlohkojen poisto epäonnistui: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "luottamustiedot pyyhitty\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "julkiselle avaimelle \"%s\" löytyy vastaava salainen avain!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "käytä valitsinta \"--delete-secret-keys\" poistaaksesi se ensin.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "virhe luotaessa salasanaa: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "symmetristä ESK-pakettia ei voi käyttää S2K-tilan vuoksi\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "käytetään salakirjoitusalgoritmia %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "\"%s\" on jo pakattu\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "VAROITUS: \"%s\" on tyhjä tiedosto\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"--pgp2-tilassa voidaan salata korkeintaan 2048-bittisillä RSA-avaimilla\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "luetaan kohteesta \"%s\"\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "kaikille salattaville avaimille ei voi käyttää IDEA-salainta.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "valittu symmetrinen salain %s (%d) ei ole vastaanottajan suosima\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "valittu pakkausalgoritmi %s (%d) ei ole vastaanottajan suosima\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "valittu symmetrinen salain %s (%d) ei ole vastaanottajan suosima\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "valitsinta %s ei voi käyttää %s-tilassa\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s salattu vastaanottajalle: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s salattua dataa\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "salattu tuntemattomalla algoritmilla %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"VAROITUS: viesti salattiin symmetrisessä salaimessa \n"
+"esiintyvällä heikolla avaimella.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "ongelma käsiteltäessä salattua pakettia\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "etäohjelman suorittamista ei tueta\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "hakemiston \"%s\" luominen ei onnistu: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"ulkoisen ohjelman kutsuminen poistettu käytöstä johtuen turvattomista \n"
+"asetustiedoston oikeuksista\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"tämä ympäristö vaatii väliaikaistiedoston kutsuttaessa ulkoisia ohjelmia\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "komentoa %s \"%s\" ei voi suorittaa: %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "komentoa %s \"%s\" ei voi suorittaa: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "järjestelmävirhe kutsuttaessa ulkoista ohjelmaa: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "ulkoisen ohjelman luonnoton päättyminen\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "ulkoista ohjelmaa ei voi suorittaa\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "ulkoisen ohjelman vastausta ei voi lukea: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "VAROITUS: tilapäistiedostoa (%s) \"%s\" ei voi poistaa: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "VAROITUS: väliaikaishakemistoa \"%s\" ei voi poistaa: %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Tämä allekirjoitus määritellään mitätöimättömäksi.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "mitätöintiavainta ei löydy avaimelle \"%s\"\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "mitätöi toissijainen avain"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "salaista avainta ei voi käyttää"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "avain %08lX: ei suojattu - ohitetaan\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "avain %08lX: PGP 2.x -muodon avain - ohitetaan\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "avain %08lX: aliavaimen allekirjoitus väärässä paikassa - ohitetaan\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "TrustDB:n alustaminen ei onnistu: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+"VAROITUS: salaisella avaimella %08lX ei ole yksinkertaista SK-"
+"tarkistussummaa\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "VAROITUS: mitään ei viety\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Komennot:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[tiedosto]|tee allekirjoitus"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[tiedosto]|tee selkokielinen allekirjoitus"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "tee erillinen allekirjoitus"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "salaa tiedot"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "salaa vain symmetrisellä salaimella"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "avaa tiedot (oletus)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "tarkista allekirjoitus"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "näytä avaimet"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "näytä avaimet allekirjoituksineen"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "tarkista avainten allekirjoitukset"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "näytä avaimet sormenjälkineen"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "näytä salaiset avaimet"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "luo uusi avainpari"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "poista avaimet julkisten avainten renkaasta"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "poista avaimet salaisten avainten renkaasta"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "allekirjoita avain"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "allekirjoita avain paikallisesti"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "allekirjoita tai muokkaa avainta"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "luo mitätöintivarmenne"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "vie avaimia"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "vie avaimia palvelimelle"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "nouda avaimia avainpalvelimelta"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "etsi avaimia avainpalvelimelta"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "päivitä kaikki avaimet avainpalvelimelta"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "nouda/liitä avaimia"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "päivitä luottamustietokanta"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [tiedostot]|tulosta viestien tiivisteet"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Valitsimet:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "tuota ascii-koodattu tuloste"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NIMI|salaa vastaanottajalle NIMI"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "käytä tätä käyttäjätunnusta allekirjoittamiseen ja avaamiseen"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|aseta pakkausaste N (0 poistaa käytöstä)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "käytä tekstimuotoa"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "käytä tulostustiedostona"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "monisanainen"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "älä tee muutoksia"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "kysy ennen ylikirjoittamista"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Katso täydellinen luettelo kaikista komennoista ja valitsimista man-"
+"sivuilta)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Esim:\n"
+" -se -r Pekka [tiedosto]    allekirjoita ja salaa Pekalle\n"
+" --clearsign [tiedosto]     tee tekstimuotoinen allekirjoitus\n"
+" --detach-sign [tiedosto]   tee erillinen allekirjoitus\n"
+" --list-keys [nimet]        näytä avaimet\n"
+" --fingerprint [nimet]      näytä sormenjäljet\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Ilmoita ohjelmistovioista (englanniksi) osoitteeseen <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Käyttö: gpg [valitsimet] [tiedostot] (-h näyttää ohjeen)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntaksi: gpg [valitsimet] [tiedostot]\n"
+"allekirjoita, tarkista, salaa tai avaa\n"
+"oletustoiminto riippuu syötteestä\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Tuetut algoritmit:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "JulkAvain: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Salaus: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Tiiviste: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Pakkaus: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "käyttö: gpg [valitsimet] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "ristiriitainen komento\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "=-merkkiä ei löytynyt ryhmämäärityksessä \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "VAROITUS: omistussuhde kohteessa %s \"%s\" ei ole turvallinen\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "VAROITUS: omistussuhde kohteessa %s \"%s\" ei ole turvallinen\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "VAROITUS: omistussuhde kohteessa %s \"%s\" ei ole turvallinen\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "VAROITUS: oikeudet kohteessa %s \"%s\" eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "VAROITUS: oikeudet kohteessa %s \"%s\" eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "VAROITUS: oikeudet kohteessa %s \"%s\" eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "VAROITUS: %s \"%s\" hakemiston oikeudet eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "VAROITUS: %s \"%s\" hakemiston oikeudet eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "VAROITUS: %s \"%s\" hakemiston oikeudet eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "VAROITUS: Hakemiston %s \"%s\" oikeudet eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "VAROITUS: Hakemiston %s \"%s\" oikeudet eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "VAROITUS: Hakemiston %s \"%s\" oikeudet eivät ole turvallisia\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "tuntematon asetus \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Salaisesta avainrenkaasta ei löydy vastaavaa allekirjoitusta\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "annettu allekirjoituskäytännön URL on virheellinen\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "näytä mihin avainrenkaaseen tulostettu avain kuuluu"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Salaisesta avainrenkaasta ei löydy vastaavaa allekirjoitusta\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "HUOM: Vanhat oletusarvoiset asetukset löytyvät tiedostosta \"%s\"\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "HUOM: Ei oletusasetustiedostoa \"%s\"\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "asetustiedosto \"%s\": %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "luetaan asetukset tiedostosta \"%s\"\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "HUOM: %s ei ole normaaliin käyttöön!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "Oikeudet eivät ole turvallisia, salainlaajennuksia \"%s\" ei ladattu\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s ei kelpaa merkistöksi\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s ei kelpaa merkistöksi\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "avainpalvelimen URI:iä ei voi jäsentää\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: virheelliset tuontivalitsimet\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "virheelliset tuontivalitsimet\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: virheelliset tuontivalitsimet\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "virheelliset tuontivalitsimet\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s ei kelpaa merkistöksi\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "annettu allekirjoituskäytännön URL on virheellinen\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s ei kelpaa merkistöksi\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "exec-polkua kohteeseen %s ei voi asettaa\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: virheelliset vientivalitsimet\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "VAROITUS: ohjelma voi luoda core-tiedoston!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "VAROITUS: %s korvaa %s:n\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s ja %s eivät ole sallittuja yhdessä!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s ja %s yhdessä on järjetöntä!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent ei ole käytettävissä tässä istunnossa\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "erillisen allekirjoituksen voi luoda vain --pgp2-tilassa\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "--pgp2-tilassa ei voi allekirjoittaa ja salata samanaikaisesti\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"sinun tulee käyttää tiedostoja (eikä putkitusta) kun --pgp2 on käytössä.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "viestin salaaaminen --pgp2-tilassa vaatii IDEA-salaimen\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "valittu salausalgoritmi ei kelpaa\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "valittu tiivistealgoritmi ei kelpaa\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "valittu salausalgoritmi ei kelpaa\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "valittu varmenteen tiivistealgoritmi ei kelpaa\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed täytyy olla suurempi kuin 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed täytyy olla suurempi kuin 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth tulee olla välillä 1-255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "default-cert-level ei kelpaa; täytyy olla 0, 1, 2 tai 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "min-cert-level ei kelpaa; täytyy olla 1, 2 tai 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr ""
+"HUOM: yksinkertaista S2K-tilaa (0) ei todellakaan suositella käytettäväksi\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "virheellinen S2K-tila; täytyy olla 0, 1 tai 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "virheelliset oletusarvoiset valinnat\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "virheelliset henkilökohtaisen salaimen valinnat\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "virheelliset henkilökohtaiset tiivisteen valinnat\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "virheelliset henkilökohtaiset pakkausvalinnat\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s ja %s eivät vielä toimi yhdessä\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "salausalgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "tiivistealgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "pakkausalgoritmia \"%s\" ei voi käyttää %s-tilassa\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "TrustDB:n alustaminen ei onnistu: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"VAROITUS: vastaanottajia (-r) annettu käyttämättä julkisen avaimen salausta\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [tiedostonimi]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [tiedostonimi]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "avaus epäonnistui: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [tiedostonimi]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [tiedostonimi]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "valitsinta %s ei voi käyttää %s-tilassa\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--allekirjoita [tiedostonimi]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [tiedostonimi]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [tiedostonimi]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "valitsinta %s ei voi käyttää %s-tilassa\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [tiedostonimi]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [tiedostonimi]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [tiedostonimi]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key käyttäjätunnus"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key käyttäjätunnus"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key käyttäjätunnus [komennot]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [käyttäjätunnus] [avainrengas]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "avainpalvelimelle lähettäminen epäonnistui: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "avainpalvelimelta vastaanotto epäonnistui: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "avaimen vienti epäonnistui: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "avainpalvelimelta etsiminen epäonnistui: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "avainpalvelimen päivitys epäonnistui: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "ascii-koodauksen purku epäonnistui: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "ascii-koodaaminen epäonnistui: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "virheellinen tiivistealgoritmi \"%s\"\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[tiedostonimi]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Kirjoita viestisi...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "annettu varmennekäytännön URL on virheellinen\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "annettu allekirjoituskäytännön URL on virheellinen\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "annettu allekirjoituskäytännön URL on virheellinen\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "pk-välimuistissa on liian monta kohdetta - poistettu käytöstä\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[Käyttäjätunnusta ei löytynyt]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Epäkelpo avain %08lX hyväksytty valitsimella --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "ei salaista aliavainta julkiselle aliavaimelle %08lX - ohitetaan\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr ""
+"käytetään toissijaista avainta %08lX ensisijaisen avaimen %08lX sijasta\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr ""
+"avain %08lX: salaisella avaimella ei ole vastaavaa \n"
+"julkista avainta - ohitetaan\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "ole jonkinverran hiljaisempi"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "ota avaimet tästä avainrenkaasta"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "käsittele aikaleimakonfliktit pelkkinä varoituksina"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|tilatiedot kirjoitetaan FD:iin"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Käyttö: gpgv [valitsimet] [tiedostot] (-h näyttää ohjeen)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Käyttö: gpg [valitsimet] [tiedostot]\n"
+"Tarkista allekirjoituksia tunnetuille luotetuille avaimille\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Tämän arvon määrittäminen on sinun tehtäväsi, tätä arvoa ei koskaan \n"
+"kerrota kolmansille osapuolille. Tarvitsemme sitä toteuttamaan \n"
+"luottamusverkko eikä sillä ei ole mitään tekemistä (epäsuorasti luotujen) \n"
+"varmenneverkkojen kanssa."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Rakentaakseen luottamusverkon, GnuPG:n täytyy tietää mihin avaimiin \n"
+"luotetaan ehdottomasti - nämä ovat tavallisesti ne avaimet, joiden "
+"salainen \n"
+"pari on sinulla.  Vastaa \"kyllä\" luottaaksesi tähän avaimeen ehdoitta\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Vastaa \"kyllä\" jos haluat kaikesta huolimatta käyttää tätä epäluotettavaa\n"
+"avainta."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Syötä vastaanottajan, jolle haluat lähettää viestin, käyttäjätunnus."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Yleensä ei ole järkevää käyttää samaa avainta allekirjoitukseen\n"
+"ja salaamiseen. Tätä algorimiä tulisi käyttää vain määrätyissä "
+"ympäristöissä.\n"
+"Ole hyvä ja kysy tietoturva-asiantuntijaltasi ensin"
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Syötä avaimen koko"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Vastaa \"kyllä\" tai \" ei\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Syötä pyydetty arvo kuten näkyy kehotteessa.\n"
+"On mahdollista syöttää ISO-muotoinen päivä (VVVV-KK-PP),\n"
+"mutta sen seurauksena et saa kunnollista virheilmoitusta \n"
+"vaan järjestelmä yrittää tulkita arvon aikajaksona."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Anna avaimen haltijan nimi"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "anna vapaaehtoinen, mutta erittäin suositeltava sähköpostiosoite"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Kirjoita vapaaehtoinen huomautus"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N   muuta nimeä\n"
+"C   muuta kommenttia\n"
+"E   muuta sähköpostiosoitetta\n"
+"O   jatka avaimen luomista\n"
+"L   lopeta"
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Vastaa \"kyllä\" (tai vain \"k\") jos haluat luoda aliavaimen."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Allekirjoittaessasi avaimen käyttäjätunnuksen sinun tulisi varmista, että \n"
+"avain todella kuuluu henkilölle, joka mainitaan käyttäjätunnuksessa.  "
+"Muiden \n"
+"on hyvä tietää kuinka huolellisesti olet varmistanut tämän. \n"
+"\n"
+"\"0\" tarkoittaa, että et väitä mitään siitä, kuinka huolellisesti olet\n"
+"    varmistanut avaimen.\n"
+"\n"
+"\"1\" tarkoittaa, että uskot avaimen kuuluvan henkilölle, joka väittää \n"
+"    hallitsevan sitä, mutta et voinut varmistaa tai et varmistanut avainta \n"
+"    lainkaan.  Tämä on hyödyllinen \"persoonan\" varmistamiseen, jossa \n"
+"    allekirjoitat pseudonyymin käyttäjän avaimen.\n"
+"\n"
+"\"2\" tarkoittaa arkista varmistusta.  Esimerkiksi olet varmistanut \n"
+"    avaimen sormenjäljen ja tarkistanut käyttäjätunnuksen ja \n"
+"    valokuvatunnisteen täsmäävän.\n"
+"\n"
+"\"3\" tarkoittaa syvällistä henkilöllisyyden varmistamista.  Esimerkiksi \n"
+"    tämä voi tarkoittaa avaimen sormenjäljen tarkistamista avaimen "
+"haltijan \n"
+"    kanssa henkilökohtaisesti, ja että tarkistit nimen avaimessa täsmäävän \n"
+"    vaikeasti väärennettävän kuvallisen henkilöllisyystodistuksen (kuten \n"
+"    passi) kanssa, ja lopuksi varmistit (sähköpostin vaihtamisella), että \n"
+"    sähköpostiosoite kuuluu avaimen haltijalle.\n"
+"\n"
+"Huomaa, että yllä annetut esimerkit tasoille 2 ja 3 ovat todellakin *vain* \n"
+"esimerkkejä.  Lopullisesti se on sinun päätöksesi mitä \"arkinen\" ja \n"
+"\"syvällinen\" tarkoittaa allekirjoittaessasi muita avaimia.\n"
+"\n"
+"Jos et tiedä mikä olisi sopiva vastaus, vastaa \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Vastaa \"kyllä\" jos haluat allekirjoittaa KAIKKI käyttäjätunnukset"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Vastaa \"kyllä\", jos haluat poistaa tämän käyttäjätunnuksen.\n"
+"Menetät samalla kaikki siihen liittyvät varmenteet!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Vastaa \"kyllä\", jos aliavaimen voi poistaa"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Tämä on voimassa oleva allekirjoitus tälle avaimelle, tavallisesti ei \n"
+"kannata poistaa tätä allekirjoitusta koska se saattaa olla tarpeen\n"
+"luottamussuhteen luomiseksi avaimeen tai johonkin toiseen tämän avaimen\n"
+"varmentamaan avaimeen."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Allekirjoitusta ei voida tarkistaa koska sinulla ei ole \n"
+"siihen liittyvää avainta. Lykkää sen poistamista kunnes\n"
+" tiedät mitä avainta on käytetty, koska allekirjoitus \n"
+"avain saattaa luoda luottamusketjun toisen, jo ennalta \n"
+"varmennetun avaimen kautta."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Allekirjoitus ei ole pätevä.  Järkevintä olisi poistaa se \n"
+"avainrenkaastasi."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Tämä allekirjoitus takaa avaimen haltijan henkilöllisyyden. \n"
+"Tällaisen allekirjoituksen poistaminen on tavallisesti huono \n"
+"ajatus.  GnuPG ei kenties voi käyttää avainta enää.  Poista \n"
+"allekirjoitus vain, jos se ei ole jostain syystä pätevä, ja \n"
+"avaimella on jo toinen allekirjoitus."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Muuta valinnat kaikille käyttäjätunnuksille (tai vain valituille)\n"
+"nykyiseen luetteloon valinnoista.  Kaikkien muutettujen\n"
+"oma-allekirjoitusten aikaleima siirretään yhdellä sekunnilla eteenpäin.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Ole hyvä ja syötä salasana, tämän on salainen lause \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Toista edellinen salasanasi varmistuaksesi siitä, mitä kirjoitit."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Anna allekirjoitetun tiedoston nimi"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Vastaa \"kyllä\", jos tiedoston voi ylikirjoittaa"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Syötä uusi tiedostonimi. Jos painat vain RETURN, käytetään\n"
+"oletustiedostoa (joka näkyy sulkeissa)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Sinun tulisi määrittää syy varmenteelle. Riippuen asiayhteydestä\n"
+"voit valita tästä listasta:\n"
+"  \"Avain on paljastunut\"\n"
+"      Käytä tätä, jos sinulla on syytä uskoa, että luvattomat henkilöt \n"
+"      ovat saaneet salaisen avaimesi käsiinsä.\n"
+"  \"Avain on korvattu\"\n"
+"      Käytä tätä, jos olet korvannut tämän uudemmalla avaimella.\n"
+"  \"Avain ei ole enää käytössä\"\n"
+"      Käytä tätä, jost ole lopettanut tämän avaimen käytön.\n"
+"  \"Käyttäjätunnus ei ole enää voimassa\"\n"
+"      Käytä tätä ilmoittamaan, että käyttäjätunnusta ei pitäisi käyttää;\n"
+"      tätä normaalisti käytetään merkitsemään sähköpostiosoite "
+"vanhenneeksi.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Halutessasi voit kirjoittaa tähän kuvauksen miksi julkaiset tämän\n"
+"mitätöintivarmenteen.  Kirjoita lyhyesti.\n"
+"Tyhjä rivi päättää tekstin.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Ei ohjeita saatavilla"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Ei ohjetta aiheesta \"%s\""
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "päivitä luottamustietokanta"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "julkinen avain ei täsmää salaiseen avaimeen!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "salaista avainta ei voi käyttää"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "ohitetaan tyypin %d lohko\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "tähän mennessä käsitelty %lu avainta\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Kaikkiaan käsitelty: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      ohitetaan uudet avaimet: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          ilman käyttäjätunnuksia: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              tuotu: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             muuttamatonta: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          uusia käyttäjätunnuksia: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           uusia aliavaimia: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        uusia allekirjoituksia: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   uusia avainten mitätöintejä: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      luettuja salaisia avaimia: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  tuotuja salaisia avaimia: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " muuttamattomia salaisia avaimia: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "          ei tuotu: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "        uusia allekirjoituksia: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      luettuja salaisia avaimia: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Olet allekirjoittanut seuraavat käyttäjätunnukset:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+# Ensimmäinen %s on binary, textmode tai unknown, ks. alla
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%sallekirjoitus, tiivistealgoritmi %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "avain %08lX: ei käyttäjätunnusta\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "avain %08lX: HKP-aliavainvirhe korjattu\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr ""
+"avain %08lX: käyttäjätunnus \"%s\" hyväksytty ilman omaa allekirjoitusta\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "avain %08lX: ei voimassaolevia käyttäjätunnuksia\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "tämän voi aiheuttaa puuttuva oma-allekirjoitus\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "avain %08lX: julkista avainta ei löydetty: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "avain %08lX: uusi avain - ohitetaan\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "kirjoitettavissa olevaa avainrengasta ei löydy: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "kirjoitetaan kohteeseen \"%s\"\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "virhe kirjoitettaessa avainrenkaaseen \"%s\": %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "avain %08lX: julkinen avain \"%s\" tuotu\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "avain %08lX: ei vastaa omaa kopiotamme\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "avain %08lX: alkuperäistä avainlohkoa ei löydy: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "avain %08lX. alkuperäisen avainlohko lukeminen ei onnistu: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "avain %08lX: \"%s\" 1 uusi käyttäjätunnus\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "avain %08lX: \"%s\" %d uutta käyttäjätunnusta\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "avain %08lX: \"%s\" 1 uusi allekirjoitus\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "avain %08lX: \"%s\" %d uutta allekirjoitusta\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "avain %08lX: \"%s\" 1 uusi aliavain\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "avain %08lX: \"%s\" %d uutta aliavainta\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "avain %08lX: \"%s\" %d uutta allekirjoitusta\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "avain %08lX: \"%s\" %d uutta allekirjoitusta\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "avain %08lX: \"%s\" %d uutta käyttäjätunnusta\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "avain %08lX: \"%s\" %d uutta käyttäjätunnusta\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "avain %08lX: \"%s\" ei muutoksia\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "avain %08lX: avaimella on epäkelpo salain %d - ohitetaan\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "salaiselle avainrenkaalle ei ole asetettu oletusarvoa: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "avain %08lX: salainen avain tuotu\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "avain %08lX: avain on jo avainrenkaassa\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "avain %08lX: salaista avainta ei löydy: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"avain %08lX: ei julkista avainta - mitätöintivarmennetta ei voida käyttää\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "avain %08lX: pätemätön mitätöintivarmenne: %s - hylätty\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "avain %08lX: mitätöintivarmenne \"%s\" tuotu\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "avain %08lX: allekirjoitukselle ei ole käyttäjätunnusta\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "avain %08lX: julkisen avaimen algoritmia \"%s\" ei tueta\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "avain %08lX: epäkelpo oma-allekirjoitus käyttäjätunnuksella \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "avain %08lX: ei aliavainta avainten riippuvuuksiin\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "avain %08lX: julkisen avaimen algoritmia ei tueta\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "avain %08lX: pätemätön aliavainriippuvuus\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "avain %08lX: moninkertainen aliavainriippuvuus poistettu\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "avain %08lX: ei aliavainta avainten mitätöintiä varten\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "avain %08lX: epäkelpo aliavaimen mitätöinti\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "avain %08lX: useiden aliavainten mitätöinti poistettu\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "avain %08lX: käyttäjätunnus ohitettu '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "avain %08lX: aliavain ohitettu\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr ""
+"avain %08lX: allekirjoitusta ei voida viedä (luokka %02x) - ohitetaan\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "avain %08lX: mitätöintivarmenne väärässä paikassa - ohitetaan\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "avain %08lX: epäkelpo mitätöintivarmenne: %s - ohitetaan\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "avain %08lX: aliavaimen allekirjoitus väärässä paikassa - ohitetaan\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "avain %08lX: odottamaton allekirjoitusluokka (0x%02X) - ohitetaan\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "avain %08lX: käyttäjätunnuksen kaksoiskappale havaittu - liitetty\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"VAROITUS: avain %08lX saattaa olla mitätöity: haetaan mitätöintiavain %08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"VAROITUS: avain %08lX saattaa olla mitätöity: mitätöintiavainta %08lX \n"
+"ei saatavilla.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "avain %08lX: \"%s\"-mitätöintivarmenne lisätty\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "avain %08lX: lisättiin suora avainallekirjoitus\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "julkinen avain ei täsmää salaiseen avaimeen!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ohitetaan: salainen avain on jo paikalla\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ohitetaan: salainen avain on jo paikalla\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "virhe luotaessa avainrengasta \"%s\": %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "avainrengas \"%s\" luotu\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "virhe luotaessa \"%s\": %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "avainrenkaan välimuistin uudelleenluominen epäonnistui: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[mitätöinti]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[oma-allekirjoitus]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 väärä allekirjoitus\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d väärää allekirjoitusta\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 allekirjoitus jätetty tarkistamatta puuttuvan avaimen vuoksi\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d allekirjoitusta jätetty tarkistamatta puuttuvien avainten vuoksi\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 allekirjoitus jätetty tarkistamatta virheen vuoksi\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d allekirjoitusta jätetty tarkistamatta virheiden vuoksi\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "havaittiin 1 käyttäjätunnus ilman voimassaolevaa oma-allekirjoitusta\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr ""
+"havaittiin %d käyttäjätunnusta ilman voimassaolevaa oma-allekirjoitusta\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Miten paljon luotat tämän käyttäjän varmistamiin muiden käyttäjien \n"
+"avaimiin (tarkistaako hän henkilöllisyydet, vertaako sormenjälkiä eri \n"
+"lähteistä...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Luotan osittain\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Luotan täysin\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Käyttäjätunnus \"%s\" on mitätöity."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Haluatko varmasti edelleen allekirjoittaa? (k/E) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Allekirjoittaminen ei onnistu.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Käyttäjätunnus \"%s\" on vanhentunut."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Käyttäjätunnuksella \"%s\" ei ole oma-allekirjoitusta."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Käyttäjätunnuksella \"%s\" ei ole oma-allekirjoitusta."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Varmastiko allekirjoita? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Oma-allekirjoitus kohteessa \"%s\"\n"
+"on PGP 2.x -muodon allekirjoitus.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr ""
+"Haluatko vahventaa sen täysin vientikelpoiseksi OpenPGP-allekirjoitukseksi? "
+"(k/E) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Nykyinen allekirjoituksesi kohteessa \"%s\"\n"
+"on vanhentunut.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Haluatko tehdä uuden allekirjoituksen korvaamaan vanhentuneen? (k/E) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Nykyinen allekirjoituksesi kohteessa \"%s\"\n"
+"on paikallinen allekirjoitus.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+"Haluatko vahventaa sen täysin vientikelpoiseksi allekirjoitukseksi? (k/E) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" on jo allekirjoitettu paikallisesti avaimella %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" on jo allekirjoitettu avaimella %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Haluatko allekirjoittaa uudelleen joka tapauksessa? (k/E) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Avaimelle %08lX ei löydy mitään mitä allekirjoittaa\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Tämä avain on vanhentunut!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Avain vanhenee %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Haluatko allekirjoituksesi vanhenevan samaan aikaan? (K/e) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Et voi luoda OpenPGP-allekirjoitusta PGP 2.x -avaimella --pgp2-tilassa.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Tämä tekisi avaimesta käyttökelvottoman PGP 2.x:lle.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Kuinka huolellisesti olet vahvistanut avaimen haltijan henkilöllisyyden?\n"
+"Jos et tiedä vastausta, syötä \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) En vastaa.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) En ole tarkistanut lainkaan.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Olen suorittanut arkisen tarkistuksen.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Olen suorittanut huolellisen tarkistuksen.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Valintasi? (syöttämällä \"?\" saat lisätietoja): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Haluatko varmasti allekirjoittaa tämän avaimen\n"
+"omalla avaimellasi: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Tämä tulee olemaan oma-allekirjoitus.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"VAROITUS: Tätä allekirjoitusta ei määritellä vientikelvottomaksi.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"VAROITUS: Tätä allekirjoitusta ei määritellä mitätöimättömäksi.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Tämä allekirjoitus määritellään vientikelvottomaksi.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Tämä allekirjoitus määritellään mitätöimättömäksi.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"En ole tarkistanut tätä avainta lainkaan.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Olen tarkistanut avaimen arkisesti.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Olen tarkistanut avaimen erittäin huolellisesti.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Varmastiko allekirjoita? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "allekirjoitus epäonnistui: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Avainta ei ole suojattu.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Ensisijaisen avaimen salaiset osat eivät ole saatavilla.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Ensisijaisen avaimen salaiset osat eivät ole saatavilla.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Avain on suojattu.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Ei voi muokata avainta: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Syötä uusi salasana salaiselle avaimelle.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "salasanaa ei toistettu oikein, yritä uudestaan."
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Et halua salasanaa - tämä on todennäköisesti *huono* ajatus!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Haluatko varmasti tehdä tämän? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "siirretään avaimen allekirjoitus oikealle paikalle\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "tallenna ja lopeta"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "näytä sormenjälki"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "näytä avaimet ja käyttäjätunnukset"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "valitse käyttäjätunnus N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "valitse käyttäjätunnus N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "mitätöi allekirjoitus"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "allekirjoita avain paikallisesti"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Vihje: Valitse allekirjoitettavat käyttäjätunnukset\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "lisää käyttäjätunnus"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "lisää valokuva"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "poista käyttäjätunnus"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "poista toissijainen avain"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "lisää mitätöintiavain"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Varmastiko päivitä valinnat näille käyttäjätunnuksille? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Et voi muuttaa v3-avainten vanhentumispäivää\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "merkitse käyttäjätunnus ensisijaiseksi"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "vaihda salaisten ja julkisten avainten luettelon välillä"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "näytä valinnat (asiantuntija)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "näytä valinnat (monisanaisesti)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Varmastiko päivitä valinnat näille käyttäjätunnuksille? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "avainpalvelimen URI:iä ei voi jäsentää\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Varmastiko päivitä valinnat näille käyttäjätunnuksille? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "muuta salasanaa"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "muuta luottamusastetta"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Varmastiko mitätöi kaikki valitut käyttäjätunnukset? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "mitätöi käyttäjätunnus"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "mitätöi toissijainen avain"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "ota avain käyttöön"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "poista avain käytöstä"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "näytä valokuvatunniste"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "virhe luettaessa salaista avainlohkoa \"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Salainen avain on saatavilla.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Tähän tarvitaan salainen avain.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Käytä ensin komentoa \"toggle\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Avain on mitätöity."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Varmastiko allekirjoita kaikki käyttäjätunnukset?"
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Vihje: Valitse allekirjoitettavat käyttäjätunnukset\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "tuntematon allekirjoitusluokka"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Tätä komentoa ei sallita %s-tilassa.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Sinun täytyy valita ainakin yksi käyttäjätunnus.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Et voi poistaa viimeistä käyttäjätunnusta!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Varmastiko poista kaikki valitut käyttäjätunnukset? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Varmastiko poista tämä käyttäjätunnus? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Varmastiko poista tämä käyttäjätunnus? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Sinun täytyy valita ainakin yksi avain.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi avata: %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "virhe luotaessa avainrengasta \"%s\": %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Sinun täytyy valita ainakin yksi avain.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Haluatko varmasti poistaa valitut avaimet? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Haluatko varmasti poistaa tämän avaimen? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Varmastiko mitätöi kaikki valitut käyttäjätunnukset? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Varmastiko mitätöi tämä käyttäjätunnus? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Haluatko varmasti mitätöidä tämän avaimen? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Haluatko varmasti mitätöidä valitut avaimet? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Haluatko varmasti mitätöidä tämän avaimen? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "näytä valinnat"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Varmastiko päivitä valinnat näille käyttäjätunnuksille? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Varmastiko päivitä valinnat? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Tallenna muutokset? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Lopeta tallentamatta muutoksia?"
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "päivitys epäonnistui: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "salaisen päivitys epäonnistui: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Päivitystä ei tarvita, koska avain ei ole muuttunut.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Tiiviste: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Ominaisuudet: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notaatio: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "PGP 2.x -muodon käyttäjätunnukselle ei ole valintoja.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Tämä avain voidaan mitätöidä %s-avaimella "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Tämä avain voidaan mitätöidä %s-avaimella "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (luottamuksellinen)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "ei voida luoda kohdetta %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[mitätöity] "
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [vanhenee: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [vanhenee: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " luottamus: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " luottamus: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Tämä avain on poistettu käytöstä"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Huomioi, että tässä näytetty voimassaolo ei ole välttämättä\n"
+"ajan tasalla jollet käynnistä ohjelmaa uudelleen\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[mitätöity] "
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"VAROITUS: mitään käyttäjätunnusta ei ole merkitty ensisijaiseksi.  Tämän \n"
+"komennon johdosta eri käyttäjätunnus voi tulla oletetuksi ensisijaiseksi.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"VAROITUS: Tämä on PGP2-muodon avain.  Valokuvan lisääminen voi\n"
+"          saada jotkin PGP:n versiot hylkäämään avaimen.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Haluatko edelleen varmasti lisätä sen? (k/E) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Et voi lisätä valokuvaa PGP2-muodon avaimeen.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Poistetaanko tämä kelvollinen allekirjoitus? (k/E/l)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Poistetaanko tämä epäkelpo allekirjoitus? (k/E/l)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Poistetaanko tämä tuntematon allekirjoitus? (k/E/l)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Varmastiko poista oma-allekirjoitus? (k/E)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d allekirjoitus poistettu.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d allekirjoitusta poistettu.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Mitään ei poistettu.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "virheellinen ascii-koodaus"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Käyttäjätunnus \"%s\" on mitätöity."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Käyttäjätunnus \"%s\" on mitätöity."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Käyttäjätunnus \"%s\" on mitätöity."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "käyttäjätunnus \"%s\" on jo mitätöity\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "käyttäjätunnus \"%s\" on jo mitätöity\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"VAROITUS: Tämä on PGP 2.x -muodon avain.  Määrätyn mitätöijän lisääminen "
+"voi\n"
+"          saada jotkin PGP:n versiot hylkäämään avaimen.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Et voi lisätä määrättyä mitätöijää PGP 2.x -muodon avaimeen.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Syötä määrätyn mitätöijän käyttäjätunnus: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "PGP 2.x -avainta ei voi nimetä määrätyksi mitätöijäksi\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "et voi nimittää avainta sen omaksi määrätyksi mitätöijäksi\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "VAROITUS: Tämän avaimen nimetty mitätöijä on mitätöinyt avaimen!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "VAROITUS: avaimen nimittämistä määrätyksi mitätöijäksi ei voi perua!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Haluatko varmasti nimittää tämän avaimen määrätyksi mitätöijäksi? (k/E): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Poista salaisten avainten valinnat, kiitos.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Valitse korkeintaan yksi toissijainen avain, kiitos.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Muutetaan toissijaisen avaimen vanhentumisaikaa.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Muutetaan ensisijaisen avaimen vanhentumisaikaa.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Et voi muuttaa v3-avainten vanhentumispäivää\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Salaisesta avainrenkaasta ei löydy vastaavaa allekirjoitusta\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "VAROITUS: allekirjoitusaliavain %08lX ei ole ristiinvarmennettu\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Valitse tasan yksi käyttäjätunnus!\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "ohitetaan v3-muodon oma-allekirjoitus käyttäjätunnukselle \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Haluatko varmasti käyttää sitä (k/E)? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Haluatko varmasti käyttää sitä (k/E)? "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Allekirjoitusnotaatio: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Ylikirjoita (k/E)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Indeksillä %d ei löydy käyttäjätunnusta\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Indeksillä %d ei löydy käyttäjätunnusta\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Indeksillä %d ei löydy käyttäjätunnusta\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "käyttäjätunnus: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   %08lX allekirjoitti tämän %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (vientiin kelpaamaton)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Tämä allekirjoitus vanheni %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Haluatko varmasti mitätöidä sen? (k/E) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Luodaanko tälle alekirjoitukselle mitätöintivarmenne? (k/E) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Olet allekirjoittanut seuraavat käyttäjätunnukset:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (vientiin kelpaamaton)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   %08lX mitätöi tämän %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Olet mitätöimässä seuraavat allekirjoitukset:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Varmastiko luo mitätöintivarmenteet? (k/E) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "salainen avain ei ole saatavilla\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "käyttäjätunnus \"%s\" on jo mitätöity\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"VAROITUS: käyttäjätunnuksen allekirjoitus on päivätty %d sekuntin päähän "
+"tulevaisuuteen\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "käyttäjätunnus \"%s\" on jo mitätöity\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "käyttäjätunnus \"%s\" on jo mitätöity\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Näytetään valokuva %s, kokoa %ld avaimelle 0x%08lX\n"
+"(käyttäjätunnus %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "valinta %c%lu on kopio\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "liian monta \"%c\" valintaa\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "liian monta \"%c\" valintaa\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "liian monta \"%c\" valintaa\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Valinnassa on luvaton merkki\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "kirjoitetaan suora allekirjoitus\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "kirjoitetaan oma-allekirjoitus\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "kirjoitetaan avaimen varmentava allekirjoitus\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "avaimen koko on virheellinen, käytetään %u bittiä\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "avaimen koko on pyöristetty %u bittiin\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "salaa tiedot"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (vain salaus)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Valitse millaisen avaimen haluat:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA ja ElGamal (oletus)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (vain allekirjoitus)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (vain salaus)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (vain salaus)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (vain allekirjoitus)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (vain salaus)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (vain salaus)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA-avainparissa on 1024 bittiä.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Minkä kokoisen avaimen haluat? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Halutun avaimen koko on %u bittiä\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "pyöristetty %u bittiin\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Kuinka kauan avaimen tulee olla voimassa.\n"
+"        0 = Avain ei vanhene koskaan\n"
+"     <n>  = Avain vanhenee n päivän kuluttua\n"
+"     <n>w = Avain vanhenee n viikon kuluttua\n"
+"     <n>m = Avain vanhenee n kuukauden kuluttua\n"
+"     <n>y = Avain vanhenee n vuoden kuluttua\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Kuinka kauan allekirjoituksen tulee olla voimassa.\n"
+"        0 = Allekirjoitus ei vanhene koskaan\n"
+"     <n>  = Allekirjoitus vanhenee n päivän kuluttua\n"
+"     <n>w = Allekirjoitus vanhenee n viikon kuluttua\n"
+"     <n>m = Allekirjoitus vanhenee n kuukauden kuluttua\n"
+"     <n>y = Allekirjoitus vanhenee n vuoden kuluttua\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Avain on voimassa? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Allekirjoitus on voimassa? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "arvo ei kelpaa\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s ei vanhene koskaan\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s ei vanhene koskaan\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s vanhenee %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Allekirjoitus vanhenee %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Järjestelmäsi ei osaa näyttää päiväyksiä kuin vuoteen 2038.\n"
+"Se kuitenkin käsittelee päiväykset oikein vuoteen 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Onko tämä oikein (k/e) "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Tarviset käyttäjätunnuksen avaimesi tunnistamiseen; ohjelma muodostaa \n"
+"käyttäjätunnuksen oikeasta nimestä, huomautuksesta ja "
+"sähköpostiosoitteesta \n"
+"muodossa:\n"
+"     \"Matti Meikäläinen (nuorempi) <matti.meikalainen@osoite.fi>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Oikea nimi: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Nimessä on epäkelpo merkki\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Nimi ei voi alkaa numerolla\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Nimen täytyy olla vähintään 5 merkkiä pitkä\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Sähköpostiosoite: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Sähköpostiosoite ei kelpaa\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Huomautus: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Huomautuksessa on epäkelpo merkki\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Käytät merkistöä \"%s\".\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Valitsit seuraavan käyttäjätunnuksen:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Älä syötä sähköpostiosoitetta nimen tai huomautuksen paikalle\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnHhSsOoLl"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Muuta (N)imi, (H)uomautus, (S)ähköposti vai (L)opeta?"
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Muuta (N)imi, (H)uomautus, (S)ähköposti vai (O)k/(L)opeta?"
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Ole hyvä ja korjaa ensin virhe\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Tarvitset salasanan suojaamaan salaista avaintasi.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Tarvitaan paljon satunnaislukuja.  Voit suorittaa muita toimintoja\n"
+"(kirjoittaa näppäimistöllä, liikuttaa hiirtä, käyttää levyjä)\n"
+"alkulukujen luomisen aikana, tämä antaa satunnaislukugeneraattorille\n"
+"paremmat mahdollisuudet kerätä riittävästi entropiaa.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Avaimen luonti keskeytetty.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "kirjoitan julkisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "kirjoitan salaisen avaimen kohteeseen \"%s\"\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "kirjoitettavissa olevaa julkista avainrengasta ei löydy: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "kirjoitettavissa olevaa salaista avainrengasta ei löydy: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "virhe kirjoitettaessa julkiseen avainrenkaaseen \"%s\": %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "virhe kirjoitettaessa salaiseen avainrenkaaseen \"%s\": %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "julkinen ja salainen avain on luotu ja allekirjoitettu.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Huomaa, että tätä avainta ei voida käyttää salaamiseen.  Käytä komentoa\n"
+"\"--edit-key\" luodaksesi toissijaisen avaimen salaustarkoitukseen.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Avaimen luonti epäonnistui: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"avain on luotu %lu sekunti tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+"kellon kanssa on ongelmia)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"avain on luotu %lu sekuntia tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+"kellon kanssa on ongelmia)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "HUOM: v3-aliavainten luonti ei ole OpenPGP:n mukaista\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Haluatko varmasti luoda? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "avainlohkojen poisto epäonnistui: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi luoda: %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "HUOM: salainen avain %08lX vanheni %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "ei koskaan"
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kriittinen allekirjoituskäytäntö: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Allekirjoituskäytäntö: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Kriittinen allekirjoitusnotaatio: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Allekirjoitusnotaatio: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Avainrengas"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Ensisijaisen avaimen sormenjälki:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Aliavaimen sormenjälki:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Ensisijaisen avaimen sormenjälki:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Aliavaimen sormenjälki:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Avaimen sormenjälki ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "ascii-koodaaminen epäonnistui: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "VAROITUS: löytyi 2 tiedostoa, joissa on luottamuksellisia tietoja.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s säilyi muuttumattomana\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s on uusi\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Ole hyvä ja korjaa tämä mahdollinen tietoturvareikä\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "tarkistetaan avainrengasta \"%s\"\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "käsiteltiin %lu avainta (%lu allekirjoitusta)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: avainrengas luotu\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "annettu allekirjoituskäytännön URL on virheellinen\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"VAROITUS: asetukset tiedostossa \"%s\" eivät ole käytössä vielä tässä "
+"ajossa\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "virheelliset vientivalitsimet\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "avainta \"%s\" ei löydy: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "avainta \"%s\" ei löydy: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "pyydetään avainta %08lX kohteesta %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "pyydetään avainta %08lX kohteesta %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"allekirjoitettu avaimellasi %08lX %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "etsitään \"%s\" HKP-palvelimelta %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "virheelliset vientivalitsimet\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "avainpalvelinvirhe"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "avainpalvelinvirhe"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "avainpalvelimelta vastaanotto epäonnistui: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "pyydetään avainta %08lX kohteesta %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "pyydetään avainta %08lX kohteesta %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "VAROITUS: tilapäistiedostoa (%s) \"%s\" ei voi poistaa: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "VAROITUS: tilapäistiedostoa (%s) \"%s\" ei voi poistaa: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "outo koko salatulle istuntoavaimelle (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s-salattu istuntoavain\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "salattu tuntemattomalla algoritmilla %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "julkinen avain on %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "julkisella avaimella salattu data: DEK kelpaa\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "salattu %u-bittisella %s-avaimella, tunnus %08lX, luotu %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                aka \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "salattu %s-avaimella, tunnus %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "julkisen avaimen avaus epäonnistui: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "salattu %lu salasanalla\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "salattu yhdellä salasanalla\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "oletettavasti %s-salattua dataa\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"IDEA-salain ei käytettävissä, yritetään optimistisesti \n"
+"käyttää sen sijaan salainta %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "avaus onnistui\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "VAROITUS: viestin eheyttä ei oltu suojattu\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "VAROITUS: salattua viestiä on muokattu!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "avaus epäonnistui: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "HUOM: lähettäjä määrittää \"vain-sinun-silmillesi\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "alkuperäisen tiedoston nimi=\"%.*s\"\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "itsenäinen mitätöinti - käytä \"gpg --import\" ottaaksesi käyttöön\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Allekirjoitus täsmää lähettäjään \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "allekirjoituksen varmistus vaiennetaan\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "näitä allekirjoituksia ei voi käsitellä\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Allekirjoitus vanheni %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                aka \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr ""
+"Allekirjoitus tehty %.*s käyttämällä %s-algoritmia avaintunnuksella %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Avain saatavilla kohteessa: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "VÄÄRÄ allekirjoitus lähettäjältä \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Vanhentunut allekirjoitus lähettäjältä \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Allekirjoitus täsmää lähettäjään \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[ei tiedossa]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                aka \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Allekirjoitus vanheni %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Allekirjoitus vanhenee %s\n"
+
+# Ensimmäinen %s on binary, textmode tai unknown, ks. alla
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%sallekirjoitus, tiivistealgoritmi %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binääri"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "teksti"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "tuntematon "
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Allekirjoitusta ei voi tarkistaa: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "allekirjoitus ei ole erillinen\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"VAROITUS: useita allekirjoituksia havaittu.  Vain ensimmäisen voi "
+"tarkistaa.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "itsenäinen allekirjoitus luokkaa 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "vanhan tyylin (PGP 2.x) allekirjoitus\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "epäkelpo juuripaketti havaittu proc_tree():ssä\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "core-tiedostojen luontia ei voi estää: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "ei voi avata tiedostoa: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "trustdb: luku epäonnistui (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "julkisen avaimen algorimin %d käsittely ei onnistu\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "salausalgoritmi ei ole käytössä"
+
+# Ensimmäinen %s on binary, textmode tai unknown, ks. alla
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%sallekirjoitus, tiivistealgoritmi %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"valittua tiivistesalgoritmia %s (%d) ei löydy vastaanottajan valinnoista\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA-salaimen liitännäinen ei käytettävissä\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = näytä lisätietoja\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: paheksuttava valitsin \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "VAROITUS: \"%s\" on paheksuttu valitsin\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "käytä valitsinta \"%s%s\" sen sijaan\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "VAROITUS: \"%s\" on paheksuttu valitsin\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "pakkaamaton"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "pakkaamaton"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "%s ei kenties voi käsitellä tätä viestiä\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "luetaan asetukset tiedostosta \"%s\"\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "tuntematon oletusvastaanottaja \"%s\"\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Tiedosto \"%s\" on olemassa."
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Ylikirjoita (k/E)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: tuntematon pääte\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Syötä uusi tiedostonimi"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "kirjoitetaan vakiotulosteeseen\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "data kohteessa \"%s\" oletetaan allekirjoitetuksi\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "uusi asetustiedosto \"%s\" luotu\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"VAROITUS: asetukset tiedostossa \"%s\" eivät ole käytössä vielä tässä "
+"ajossa\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: hakemisto luotu\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "julkisen avaimen algorimin %d käsittely ei onnistu\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "VAROITUS: mahdollisesti turvaton symmetrisesti salattu istuntoavain\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "tyypin %d alipaketilla on kriittinen bitti asetettuna\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent ei ole käytettävissä tässä istunnossa\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "GPG_AGENT_INFO-ympäristömuuttuja on väärin muotoiltu\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent-protokollaversio %d ei ole tuettu\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "yhteys kohteeseen \"%s\" ei onnistu: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "agentin käytössä on ongelmia - agenttia ei käytetä\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (pääavaimen tunnus %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Tarvitset salasanan avataksesi salaisen avaimen käyttäjälle:\n"
+"\"%.*s\"\n"
+"%u-bittinen %s-avain, tunnus %08lX, luotu %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Toista salasana\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Syötä salasana\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "käyttäjän peruma\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "salasanan kysyminen ei onnistu eräajossa\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Syötä salasana: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Tarvitset salasanan avataksesi salaisen avaimen käyttäjälle: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bittinen %s-avain, tunnus %08lX, luotu %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Toista salasana: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Valitse kuva, jota haluat käyttää valokuvatunnisteenasi.  Kuvan täytyy "
+"olla \n"
+"JPEG-tiedosto.  Muista, että kuva tallennetaan julkiseen avaimeesi.  Jos \n"
+"käytät erittäin suurta kuvaa, myös avaimesta tulee erittäin suuri!\n"
+"Kuvan koon ollessa suunnilleen 240x288, on koko sopiva käyttöön.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Syötä JPEG-tiedostonimi valokuvatunnisteelle: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "ei voi avata tiedostoa: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Haluatko varmasti käyttää sitä (k/E)? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" ei ole JPEG-tiedosto\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Onko tämä oikein (k/E/l)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "valokuvatunnistetta ei voi näyttää!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Ei eriteltyä syytä"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Avain on uusittu"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Avain on murrettu"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Avain ei ole enää käytössä"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Käyttäjätunnus ei ole enää käytössä"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "mitätöinnin syy: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "mitätöintikommentti: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMlLoO"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Luottamusarvoa ei ole asetettu seuraavalle:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                aka \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Tämä avain todennäköisesti kuuluu haltijalle\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = En tiedä\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = EN luota\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Luotan ehdottomasti\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = takaisin päävalikkoon\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " o = ohita tämä avain\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " l = lopeta\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Valintasi? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Haluatko varmasti luottaa tähän avaimeen ehdottomasti? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Varmennepolku ehdottomasti luotettuun julkiseen avaimeen:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Mikään ei takaa sitä, että allekirjoitus todella kuuluu "
+"haltijalleen.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Mikään ei takaa sitä, että allekirjoitus todella kuuluu "
+"haltijalleen.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Tämä avain todennäköisesti kuuluu haltijalle\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Tämä on oma avain\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Avaimen kuulumista nimetylle käyttäjätunnukselle EI voida varmistaa.\n"
+"Jos *todella*  tiedät mitä olet tekemässä, vastaa seuraavaan\n"
+"kysymykseen kyllä\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Haluatko käyttää tätä avainta kaikesta huolimatta? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "VAROITUS: Käytettyyn avaimeen ei luoteta!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"VAROITUS: tämä avain saattaa olla mitätöity (mitätöintiavainta ei "
+"saatavilla)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "VAROITUS: Tämän avaimen nimetty mitätöijä on mitätöinyt avaimen!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "VAROITUS: Tämän avaimen haltija on mitätöinyt avaimen!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Tämä voi merkitä sitä, että allekirjoitus on väärennös.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "VAROITUS: Haltija on mitätöinyt tämän aliavaimen!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Huom: Tämä avain on poistettu käytöstä\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Huom: Tämä avain on vanhentunut!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"VAROITUS: Tätä avainta ei ole varmennettu luotettavalla allekirjoituksella!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Mikään ei takaa sitä, että allekirjoitus todella kuuluu "
+"haltijalleen.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "VAROITUS: Tähän avaimeen EI luoteta!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Allekirjoitus on luultavasti VÄÄRENNÖS.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"VAROITUS: Tätä avainta ei ole varmennettu tarpeeksi luotettavalla \n"
+"allekirjoituksella!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Ei ole varmaa, että allekirjoitus kuuluu haltijalle.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ohitettu: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ohitettu: julkinen avain on jo olemassa\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Syötä käyttäjätunnus.  Lopeta tyhjällä rivillä: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Käyttäjätunnusta ei löydy.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "ohitettu: julkinen avain on jo asetettu oletusvastaanottajaksi\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Julkinen avain on poistettu käytöstä\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "ohitettu: julkinen avain on jo asetettu\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "tuntematon oletusvastaanottaja \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s ohitettu: julkinen avain on poistettu käytöstä\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "ei kelvollisia vastaanottajia\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+"dataa ei ole tallennettu, käytä valitsinta \"--output\" tallentaaksesi\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "virhe luotaessa \"%s\": %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Erillinen allekirjoitus.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Anna datatiedoston nimi: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "luetaan vakiosyötettä ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "ei allekirjoitettua dataa\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "allekirjoitetun datan \"%s\" avaaminen ei onnistu\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "nimetön vastaanottaja; yritän käyttää salaista avainta %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "ok, nimetön vastaanottaja olet sinä.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "vanhaa DEK-koodaus ei tueta\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "salausalgoritmi %d%s on tuntematon tai poistettu käytöstä\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "HUOM: salausalgoritmia %d ei löydy valinnoista\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "HUOM: salainen avain %08lX vanheni %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "HUOM: avain on mitätöity!"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet epäonnistui: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "avain %08lX: ei käyttäjätunnusta\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Mitätöinnin tekee:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Tämä on arkaluonteinen mitätöintiavain)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Luo tälle avaimelle mitätöintivarmenne? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "ASCII-koodattu tuloste määritetty.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet epäonnistui: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Mitätöintivarmenne luotu.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "mitätöintiavainta ei löydy avaimelle \"%s\"\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "salaista avainta \"%s\" ei löydy: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "ei vastaavaa julkista avainta: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "julkinen avain ei täsmää salaiseen avaimeen!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Luo tälle avaimelle mitätöintivarmenne? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "tuntematon suojausalgoritmi\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "HUOM: Tätä avainta ei ole suojattu!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Mitätöintivarmenne luotu.\n"
+"\n"
+"Ole hyvä ja siirrä se medialle, jonka voit piilottaa; jos Mallory saa \n"
+"käsiinsä tämän varmenteen, hän voi tehdä sillä avaimesta "
+"käyttökelvottoman. \n"
+"On järkevää tulostaa tämä varmenne ja tallentaa se siltä varalta, että \n"
+"mediastasi tulee lukukelvoton.  Mutta varoituksen sanana: Tietokoneesi \n"
+"tulostusjärjestelmä saattaa tallentaa datan ja saattaa sen muiden "
+"saataville!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Valitse mitätöinnin syy:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Peru"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Todennäköisesti haluat valita %d tässä)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Syötä vapaaehtoinen kuvaus; lopeta tyhjään riviin:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Mitätöinnin syy: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Kuvausta ei annettu)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Kelpaako tämä? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "salaisen avaimen osat eivät ole käytettävissä\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "suojausalgoritmi %d%s ei ole käytettävissä\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "suojausalgoritmi %d%s ei ole käytettävissä\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Salasana ei kelpaa; yritä uudestaan"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "VAROITUS: Havaittiin heikko avain -  vaihda salasanaa uudestaan.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"luodaan paheksuttava 16-bittinen tarkistussumma salaisen avaimen suojaksi\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "luotu avain on heikko - yritän uudestaan\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"heikon avaimen luomista symmetriselle salaimelle ei voitu välttää; \n"
+"yritettiin %d kertaa!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "VAROITUS: allekirjoitustiiviste ei täsmää viestin kanssa\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "VAROITUS: allekirjoitusaliavain %08lX ei ole ristiinvarmennettu\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"VAROITUS: allekirjoitusaliavaimella %08lX on epäkelpo ristiinvarmennus\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"avain on luotu %lu sekunti tulevaisuudessa (on tapahtunut aikahyppy tai\n"
+"kellon kanssa on ongelmia)\n"
+
+#: g10/sig-check.c:195
+#, 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"
+"kellon kanssa on ongelmia)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "HUOM: allekirjoitusavain %08lX vanheni %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"Epäkelpo allekirjoitus avaimelta %08lX oletettavasti johtuen tuntemattomasta "
+"\"critical bit\":istä\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "avain %08lX: ei vastaavaa aliavainta aliavaimen mitätöintipaketille\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "avain %08lX: ei aliavainta aliavaimen liitosallekirjoitukselle\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"notaatiodataa ei voi laittaa v3-allekirjoituksiin (PGP 2.x -tyyliset)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"notaatiodataa ei voi laittaa v3-avainallekirjoituksiin (PGP 2.x -tyyliset)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"VAROITUS: %%-laajennus ei onnistu (liian suuri).  Käytetään "
+"laajentamatonta.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"käytäntö-URL:ia ei voi laittaa v3-allekirjoituksiin (PGP 2.x -tyyliset)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"käytäntö-URL:ia ei voi laittaa v3-avainallekirjoituksiin (PGP 2.x -"
+"tyyliset)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"VAROITUS: käytäntö-url:n %%-laajennus ei onnistu (liian suuri). \n"
+"Käytetään laajentamatonta.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"VAROITUS: käytäntö-url:n %%-laajennus ei onnistu (liian suuri). \n"
+"Käytetään laajentamatonta.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "luodun allekirjoituksen tarkistus epäonnistui: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s-allekirjoitus lähettäjältä: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"voit tehdä erillisiä allekirjoituksia PGP 2.x -muodon avaimilla \n"
+"vain --pgp2-tilassa\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"valittua tiivistesalgoritmia %s (%d) ei löydy vastaanottajan valinnoista\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "allekirjoitetaan:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"PGP 2.x -muodon avaimilla voi allekirjoittaa tekstimuotoon \n"
+"vain --pgp2-tilassa\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "käytetään %s-salausta\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"avainta ei ole merkitty turvattomaksi - sitä ei voida käyttää jäljitellyn\n"
+"satunnaislukugeneraattorin kanssa!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "ohitetaan \"%s\": kopio\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "ohitetaan \"%s\": %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "ohitetaan: salainen avain on jo paikalla\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"ohitetaan \"%s\": tämä on PGP:n luoma ElGamal-avain, jolla ei voi "
+"allekirjoittaa turvallisesti!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "luottamustietue %lu, tyyppi %d: kirjoittaminen epäonnistui: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Luettelo annettuista luottamusarvoista, luotu %s\n"
+"# (Käytä \"gpg --import-ownertrust\" palauttaaksesi ne)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "virhe luettaessa tiedostoa \"%s\": %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "rivi on liian pitkä\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "virhe: sormenjälki on väärä\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "tuo luottamusasteet"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "virhe etsittäessä luottamustietuetta: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "lukuvirhe: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: synkronointi epäonnistui: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: lseek epäonnistui: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: kirjoittaminen epäonnistuin (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "trustdb-tapahtuma on liian suuri\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "tiedostoa \"%s\" ei voi sulkea: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: hakemistoa ei ole olemassa!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "tiedostoa \"%s\" ei voi luoda: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "tiedostoa \"%s\" ei voi avata\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: versiotietueen luonti epäonnistui: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: luotu trustdb ei kelpaa\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: trustdb luotu\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "HUOM: trustdb:n ei voida kirjoittaa\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: trustdb ei kelpaa\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: hajautustaulukon luonti ei onnistu: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: virhe päivitettäessä versiotietuetta: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: virhe luettaessa versiotietuetta: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: virhe kirjoitettaessa versiotietuetta: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek epäonnistui: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: luku epäonnistui (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: ei ole trustdb-tiedosto\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: versiotietue tietuenumerolla %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: tiedostoversio %d ei kelpaa\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: virhe luettaessa vapaata tietuetta: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: virhe kirjoitettaessa hakemistotietuetta: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: tietueen nollaaminen epäonnistui: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: tietueeseen lisääminen epäonnistui: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "trustdb on turmeltunut; suorita \"gpg --fix-trustdb\"\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "yli %d merkkiä pitkiä tekstirivejä ei voi käsitellä\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "syöterivi on yli %d merkkiä pitkä\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "\"%s\" ei kelpaa pitkänä avaintunnuksena\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "avain %08lX: hyväksytty luotettuna avaimena\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "avain %08lX esiintyy trustdb:ssä useammin kuin kerran\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"avain %08lX: luotetulle avaimelle ei löydy julkista avainta - ohitetaan\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "Avain on määritelty ehdottoman luotettavaksi.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "luottamustietue %lu, pyyntötyyppi %d: luku epäonnistui: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "luottamustietue %lu ei ole pyydettyä tyyppiä %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[mitätöity] "
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[vanhentunut] "
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "tuntematon "
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "ei koskaan"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "trustdb:n tarkistusta ei tarvita\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "seuraava trustdb tarkistus %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "trustdb:n tarkistusta ei tarvita\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "trustdb:n tarkistusta ei tarvita\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "julkista avainta %08lX ei löydy: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "tee --check-trustdb, kiitos\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "tarkistetaan trustdb:tä\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d avainta käsitelty (%d kelpoisuuslaskuria tyhjätty)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "ehdottomasti luotettavia avaimia ei löytynyt\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "ehdottomasti luotettu julkinen avain %08lX ei löytynyt\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "luottamustietue %lu, tyyppi %d: kirjoittaminen epäonnistui: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"allekirjoitusta ei voi varmistaa.\n"
+"Muista, että allekirjoitustiedosto (.sig tai .asc)\n"
+"tulee antaa komentorivillä ensimmäisenä.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "syöterivi %u on liian pitkä tai rivinvaihto puutuu\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "yleinen virhe"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "tuntematon pakettityyppi"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "tuntematon versio"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "tuntematon julkisen avaimen algoritmi"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "tuntematon tiivistealgoritmi"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "julkinen avain ei kelpaa"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "salainen avain ei kelpaa"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "allekirjoitus ei täsmää"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "tarkistussumma ei täsmää"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "väärä salasana"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "julkista avainta ei löydy"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "tuntematon salausalgoritmi"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "avainrenkaan avaaminen ei onnistu"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "virheellinen paketti"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "virheellinen ascii-koodaus"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "käyttäjätunnusta ei löydy"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "salaista avainta ei löydy"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "käytetty salainen avain on väärä"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "ei tuettu"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "avain ei kelpaa"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "virhe tiedostoa luettaessa"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "virhe tiedostoon kirjoitettaessa"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "tuntematon pakkausalgoritmi"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "virhe tiedostoa avattaessa"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "virhe tiedostoa luotaessa"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "väärä salasana"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "julkisen avaimen algoritmi ei ole käytössä"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "salausalgoritmi ei ole käytössä"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "tuntematon allekirjoitusluokka"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "luottamustietokantavirhe"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI ei kelpaa"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "resurssiraja"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "virheellinen avainrengas"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "virheellinen varmenne"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "väärin muotoiltu käyttäjätunnus"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "virhe tiedostoa suljettaessa"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "virhe nimettäessä tiedostoa uudelleen"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "virhe tiedostoa poistettaessa"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "odottamatonta dataa"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "aikaleima ei täsmää"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "käyttökelvoton julkisen avaimen algoritmi"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "tiedosto on olemassa"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "heikko avain"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "virheellinen argumentti"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI ei kelpaa"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI-muotoa ei tueta"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "verkkovirhe"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "salaamaton"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "ei käsitelty"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "julkista avainta ei voi käyttää"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "salaista avainta ei voi käyttää"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "avainpalvelinvirhe"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Peru"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "salaamaton"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "ei allekirjoitettua dataa\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "...tämä on ohjelmistovika (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "olet löytänyt ohjelmistovian ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "kyllä|kylla|joo"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "kK"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "ei"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "eE"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "lopeta|sulje"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "lLsS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "VAROITUS: käytetään suojaamatonta muistia!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "lisätietoja osoitteesta http://www.gnupg.org/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "toiminto on mahdollinen vain, jos suojattu muisti alustetaan\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(olet ehkä käyttänyt tehtävään väärää ohjelmaa)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA vaatii 160-bittisen tiivistealgoritmin käyttöä\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "lue lisätietoja osoitteesta http://www.gnupg.org/why-not-idea.html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "notaation nimen täytyy sisältää vain tulostettavia merkkejä tai "
+#~ "välilyöntejä, ja sen täytyy loppua merkkiin \"=\"\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "käyttäjänotaatin täytyy sisältää \"@\"-merkki\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "käyttäjänotaatin täytyy sisältää \"@\"-merkki\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "notaatiosssa ei saa olla erikoismerkkejä\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "VAROITUS: löydettiin väärin muotoiltua notaatiodataa\n"
+
+#~ msgid "not human readable"
+#~ msgstr "ei ihmisten luettavissa"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "lue asetukset tiedostosta"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "lue asetukset tiedostosta"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [vanhenee: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "avain %08lX: odottamaton allekirjoitusluokka (0x%02X) - ohitetaan\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "komentoa %s \"%s\" ei voi suorittaa: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "käyttäjätunnus \"%s\" on jo mitätöity\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "virhe luotaessa salasanaa: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "väärä salasana tai tuntematon salausalgoritmi (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "agentille ei voida asettaa pid:tä\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "palvelin ei lue agentin FD:tä\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "palvelin ei kirjoita agentille FD:tä\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "gpg-agentin kanssa yhteysongelma\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "salasana on liian pitkä\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "agentin lähettämä vastaus ei kelpaa\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "agentin käytössä on ongelmia: agentti vastaa 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "valitse toissijainen avain N"
+
+#~ msgid "list signatures"
+#~ msgstr "näytä allekirjoitukset"
+
+#~ msgid "sign the key"
+#~ msgstr "allekirjoita avain"
+
+#~ msgid "add a secondary key"
+#~ msgstr "lisää toissijainen avain"
+
+#~ msgid "delete signatures"
+#~ msgstr "poista allekirjoitus"
+
+#~ msgid "change the expire date"
+#~ msgstr "muuta voimassoloaikaa"
+
+#~ msgid "set preference list"
+#~ msgstr "näytä valinnat"
+
+#~ msgid "updated preferences"
+#~ msgstr "päivitä valinnat"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Indeksillä %d ei löydy toissijaista avainta\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrlsign-key käyttäjätunnus"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key käyttäjätunnus"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "tee erillinen allekirjoitus"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "allekirjoita avain mitätöimättömästi"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "allekirjoita avain paikallisesti ja mitätöimättömästi"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "apua"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "yleinen virhe"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "tallenna"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "avainpalvelinvirhe"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "tiivistealgoritmia \"%s\" voidaan ainoastaan lukea tässä julkaisussa\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Luomassa uutta %s-avainparia.\n"
+#~ "      pienin sallittu avainkoko on  768 bittiä\n"
+#~ "                oletusavainkoko on 1024 bittiä\n"
+#~ "  suurin suositeltava avainkoko on 2048 bittiä\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA sallii avaimen koot vain väliltä 512-1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "avainkoko on liian pieni; RSA vaatii vähintään 1024.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "avainkoko on liian pieni; pienin sallittu arvo on 768.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "avainkoko on liian suuri; suurin sallittu arvo on %d.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "2048 bittiä suurempia avaimia ei suositella, koska\n"
+#~ "laskenta kestää TODELLA pitkään!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Haluatko varmasti tämän kokoisen avaimen? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Hyvä on, mutta muista että näyttösi ja näppäimistösi säteily on myös "
+#~ "alttiina salakuuntelulle!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Kokeellisia algoritmeja ei pitäisi käyttää!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "tämän salausalgoritmin käyttöä paheksutaan; ole hyvä ja käytä "
+#~ "standardimpaa!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "kirjoitetaan kohteeseen \"%s\"\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "valitan, tätä ei voi tehdä eräajossa\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "avainta \"%s\" ei löydy: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "tiedostoa \"%s\" ei voi luoda: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "ei voi avata tiedostoa: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                aka \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "Avain %08lX: avain on mitätöity!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "avain %08lX: aliavain on mitätöity!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: avain on vanhentunut\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Avaimeen EI luoteta\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (salaus ja allekirjoitus)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (vain allekirjoitus)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (salaus ja allekirjoitus)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (vain salaus)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (salaus ja allekirjoitus)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: ei voida avata kohdetta: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: VAROITUS: tiedosto on tyhjä\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "tiedostoa %s ei voi avata: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Luotan osittain\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Luotan täysin\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "allekirjoitettu paikallisesti avaimellasi %08lX %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   %08lX allekirjoitti tämän %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: kohteeseen ei päästä: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: ei voi luoda lukitusta\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: ei voi tehdä lukkoa\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: ei voi luoda: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: hakemistoa ei voi luoda: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Vastaa \"kyllä\" jos haluat kaikesta huolimatta käyttää tätä mitätöityä "
+#~ "avainta."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Valokuvaa \"%s\" ei voi avata: %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "ei voi avata tiedostoa: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "virhe: kaksoispiste puuttuu\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "virhe: ei luottamusarvoa\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (pääavaimen tunnus %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! aliavain on mitätöity: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- väärennetty mitätöinti löydetty\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? mitätöinnin tarkistuksessa ongelmia: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [vanhenee: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [vanhenee: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[mitätöity] "
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "ei voida luoda kohdetta %s: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "VAROITUS: tiiviste \"%s\" ei ole osa OpenPGP:tä.  Käytä omalla "
+#~ "vastuullasi!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[tiedostot]|salaa tiedostot"
+
+#~ msgid "store only"
+#~ msgstr "vain tallennus"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[tiedostot]|avaa tiedostot"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "allekirjoita avain mitätöimättömästi"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "allekirjoita avain paikallisesti ja mitätöimättömästi"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "luettele vain sarja paketteja"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "vie luottamusasteet"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "automaattinen luottamustietokannan päivitys"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "korjaa turmeltunut luottamustietokanta"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Pura ascii-koodaus tiedostosta tai vakiosyötteestä"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Ascii-koodaa tekstitiedosto tai vakiosyöte"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NIMI|käytä NIMI oletusvastaanottajana"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "käytä oletusavainta oletusvastaanottajana"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "älä käytä lainkaan päätettä"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "käytä aina v3-allekirjoituksia"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "älä käytä aina v3-allekirjoituksia"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "käytä aina v4-allekirjoituksia"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "älä käytä aina v3-allekirjoituksia"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "käytä aina MDC:tä salaamiseen"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "älä koskaan käytä MDC:tä salaamiseen"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "käytä gpg-agentia"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "eräajo: älä kysy mitään"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "oleta myönteinen vastaust useimpiin kysymyksiin"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "oleta kielteinen vastaust useimpiin kysymyksiin"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "lisää tämä avainrengas avainrenkaiden luetteloon"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "lisää tämä salainen avainrengas luetteloon"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NIMI|käytä oletusarvoisesti salaista avainta NIMI"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|PALVELIN|käytä tätä palvelinta avainten etsimiseen"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NIMI|aseta päätteen merkistöksi NIMI"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[tiedosto]|kirjoita tilatiedot tiedostoon"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|AVAIN_ID|luota ehdottomasti tähän avaimeen"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|TIEDOSTO|lataa laajennusmoduuli TIEDOSTO"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "jäljittele RFC1991:ssä kuvattua toimintamuotoa"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "aseta kaikki paketti-, salain- ja tiivistevaihtoehdot OpenPGP-muotoon"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "aseta kaikki paketti-, salain- ja tiivistevaihtoehdot PGP 2.x -muotoon"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|käytä salasanoissa toimintatapaa N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NIMI|käytä salasanoihin viestintiivistealgoritmia NIMI"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NIMI|käytä salasanoihin salausalgoritmia NIMI"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NIMI|käytä salausalgoritmia NIMI"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NIMI|käytä viestintiivistealgoritmia NIMI"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|käytä pakkausalgoritmia N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "jätä avaintunnistekenttä pois salatuista paketeista"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Näytä valokuvatunnisteet"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Älä näytä valokuvatunnisteita"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Aseta valokuvatunnisteiden katsomiskomento"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "tiivistealgoritmia \"%s\" voidaan ainoastaan lukea tässä julkaisussa\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "pakkausalgoritmin täytyy olla väliltä %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Ei ole varmaa, että tämä avain todella kuuluu haltijalleen, "
+#~ "mutta \n"
+#~ "avain hyväksytään siitä huolimatta\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "valinta %c%lu ei ole pätevä\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "avain %08lX: ei ole rfc2440-avain - ohitetaan\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "HUOM: Elgamal-ensisijainen avain havaittu - tämän tuominen voi kestää "
+#~ "hetken\n"
+
+#~ msgid " (default)"
+#~ msgstr " (oletusarvo)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "virhe lähettäessä kohteeseen \"%s\": %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "kohteeseen \"%s\" lähettäminen onnistui (tila=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "virhe lähettäessä kohteeseen \"%s\": tila=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "tämä avainpalvelin ei tue valitsinta --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr " avainpalvelimelta ei pysty etsimään: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "avain %08lX: tämä on PGP:n luoma ElGamal-avain, jota EI ole turvallista \n"
+#~ "käyttää allekirjoituksiin!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "avain %08lX on luotu %lu sekuntia tulevaisuudessa (on tapahtunu aikahyppy "
+#~ "tai\n"
+#~ "kellon kanssa on ongelmia\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "avain %08lX on luotu %lu sekuntia tulevaisuudessa (on tapahtunut "
+#~ "aikahyppy tai\n"
+#~ "kellon kanssa on ongelmia)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "avain %08lX on määritelty ehdottoman luotettavaksi:\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "allekirjoitus Elgamal-allekirjoitusavaimella %08lX avaimelle %08lX "
+#~ "ohitettu\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "allekirjoitus avaimelta %08lX Elgamal-allekirjoitusavaimelle %08lX "
+#~ "ohitettu\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "tarkistetaan syvyyteen %d allekirjoitettu=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%"
+#~ "d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Valitse käytettävä algoritmi.\n"
+#~ "\n"
+#~ "DSA (eli DSS) on digitaalinen allekirjoitusalgoritmi, jota voidaan \n"
+#~ "käyttää vain allekirjoituksiin.  DSA:ta suositellaan, koska sillä "
+#~ "tuotetut \n"
+#~ "allekirjoitukset voidaan varmistaa paljon nopeammin verrattuna ElGamal:"
+#~ "iin.\n"
+#~ "\n"
+#~ "ElGamal-algoritmia voidaan käyttää sekä allekirjoituksiin että \n"
+#~ "salaamiseen.  OpenPGP erottaa seuraavat kaksi toimintatapaa toisistaan:\n"
+#~ "pelkkä allekirjoitus ja allekirjoitus+salaus.  Toimintatavat ovat\n"
+#~ "itseasiassa samanlaiset, mutta joitakin parametrejä täytyy valita "
+#~ "erityisellä\n"
+#~ "tavalla luotaessa turvallista allekirjoitusavainta.  Tämä ohjelma "
+#~ "pystyy \n"
+#~ "siihen, mutta toiset OpenPGP-sovellukset eivät välttämättä pysty \n"
+#~ "tulkitsemaan allekirjoitus+salaus-muotoa.\n"
+#~ "\n"
+#~ "Ensisijainen avain täytyy aina olla allekirjoittamiseen sopiva avain; \n"
+#~ "tämä on syy, miksi vain salaus-ElGamal-avain ei ole tässä valittavissa \n"
+#~ "tässä valikossa."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Vaikka nämä avaintyypit on määritelty RFC2440:ssa, niitä ei \n"
+#~ "suositella, koska kaikki ohjelmat eivät tue niitä, ja niillä \n"
+#~ "tuotetut allekirjoitukset ovat melko suuria ja näin ollen hitaita \n"
+#~ "tarkistaa."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "tähän mennessä käsitelty %lu avainta (%lu allekirjoitusta)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "avain vaillinainen\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "avain %08lX on vaillinainen\n"
diff --git a/po/fr.gmo b/po/fr.gmo
new file mode 100644 (file)
index 0000000..5a1d5a0
Binary files /dev/null and b/po/fr.gmo differ
diff --git a/po/fr.po b/po/fr.po
new file mode 100644 (file)
index 0000000..d6652df
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,6509 @@
+# GnuPG French translation
+# Copyright (C) 1998-2005 Free Software Foundation, Inc.
+# Gaël Quéri <gael@lautre.net>, 1998.
+#
+# Thanks to Rémi Guyomarch <rguyom@mail.dotcom.fr> and <nmorant@amadeus.net>
+# for pointing me out some errors.
+#
+# $Id: fr.po 4365 2006-12-06 09:52:40Z wk $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.2rc2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-06-28 00:24+0200\n"
+"Last-Translator: Gaël Quéri <gael@lautre.net>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8-bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "impossible de générer un nombre premier avec pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "impossible de générer un nombre premier avec moins de %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "aucun module de récupération d'entropie n'a été trouvé.\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "impossible de verrouiller `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "écriture de la clé secrète dans `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "impossible d'ouvrir `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "impossible d'accéder à `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' n'est pas un fichier régulier - ignoré\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "note: le fichier `random_seed' est vide\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"AVERTISSEMENT: la taille du fichier `random_seed' est invalide.\n"
+"Celui-ci ne sera pas utilisé.\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "impossible de lire `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "note: le fichier `random_seed' n'a pas été mis à jour\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "impossible de créer `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "impossible d'écrire `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "impossible de fermer `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr ""
+"ATTENTION: utilisation d'un générateur de nombres aléatoires peu sûr !!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Le générateur de nombres aléatoires n'est qu'un artifice visant à exécuter\n"
+"GnuPG - ce n'est en aucune manière un générateur (RNG) fort!\n"
+"\n"
+"N'UTILISEZ PAS LES DONNÉES GÉNÉRÉES PAR CE PROGRAMME !!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Attendez s'il vous plaît que l'entropie soit récupérée. Vous pouvez\n"
+"faire autre chose pour ne pas vous ennuyer, car cela donnera une\n"
+"meilleure qualité à l'entropie.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Il n'y a pas assez d'octets aléatoires disponibles. Faites autre chose\n"
+"pour que l'OS puisse amasser plus d'entropie ! (il faut %d octets de plus)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "impossible de stocker l'empreinte: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "impossible de stocker la date de création: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "la lecture de la clé publique a échoué: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "la réponse ne contient pas les données de clé publique\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "la réponse ne contient pas le modulo RSA\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "la réponse ne contient pas l'exposant public RSA\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "l'appel du PIN a retourné une erreur: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+"Le code PIN pour CHV%d est trop court ; la longueur minimale\n"
+"est %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "la vérification CHV%d a échoué: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "l'accès aux commandes d'administration n'est pas configuré\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "erreur pendant la récupération de l'état CHV de la carte\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "la carte est irrémédiablement bloquée !\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+"%d tentatives de PIN admin restent jusqu'à ce que la carte\n"
+"soit irrémédiablement bloquée\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|code PIN d'administration"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Nouveau code PIN d'administration"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Nouveau code PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "erreur pendant l'obtention du nouveau code PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "erreur pendant la lecture de données d'application\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "erreur pendant la lecture de l'empreinte DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "la clé existe déjà\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "la clé existante sera remplacée\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "générer une nouvelle clé\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "l'horodatage de création est manquant\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "le module RSA est manquant ou bien sa taille n'est pas %d bits\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "l'exposant public RSA est manquant ou trop élevé (plus de %d bits)\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+"le nombre premier RSA %s est manquant ou bien sa taille n'est pas\n"
+"%d bits\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "le stockage de la clé a échoué: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "attendez que la clé se génère...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "la génération de la clé a échoué\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "la génération de clé a été effectuée (%d secondes)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "structure de carte OpenPGP invalide (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "signature %s, algorithme de hachage %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "signatures créées jusqu'ici: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Entrez le PIN%%0A[sigs faites: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+"la vérification du code PIN d'administration est actuellement interdite\n"
+"au travers de cette commande\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "impossible d'accéder à %s - carte OpenPGP invalide ?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armure: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "en-tête d'armure invalide: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "en-tête d'armure: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "en-tête de signature claire invalide\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "signatures en texte clair imbriquées\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "armure inattendue: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "ligne échappée par `-' invalide: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "caractère %02X invalide en radix64 ignoré\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "fin de fichier prématurée (pas de CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "fin de fichier prématurée (dans le CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC déformé\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "Erreur de CRC; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "fin de fichier prématurée (dans la remorque)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "erreur dans la ligne de remorque\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "aucune donnée OpenPGP valide n'a été trouvée.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armure invalide: ligne plus longue que %d caractères\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"caractère cité-imprimable (quoted-printable) dans l'armure provenant\n"
+"certainement d'un agent de transfert de messages bogué\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "la carte OpenPGP n'est pas disponible: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "carte OpenPGP n° %s détectée\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "impossible de faire cela en mode automatique\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Votre choix ? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[non positionné]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "masculin"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "féminin"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "non spécifié"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "non forcé"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "forcé"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Erreur: Seul l'ASCII standard est permis pour l'instant.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Erreur: Le caractère « < » ne peut pas être utilisé.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Erreur: Les espaces doubles ne sont pas permis.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Nom du déteneur de la carte: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Prénom du déteneur de la carte: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Erreur: Nom combiné trop long (la limite est %d caractères).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL pour récupérer la clé publique: %s"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Erreur: URL trop long (la limite est %d caractères).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "erreur pendant la lecture de `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Données d'identification (nom du compte): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+"Erreur: Données d'indentification trop longues (la limite est\n"
+"%d caractères).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Données DO privées: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Erreur: DO privé trop long (la limite est %d caractères).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Préférences de langue: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Erreur: longueur invalide de la chaîne de préférences.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Erreur: caractères invalide dans la chaîne de préférences.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Sexe ((M)asculin, (F)éminin ou espace): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Erreur: réponse invalide.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "empreinte de l'autorité de certification: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Erreur: empreinte mal formatée.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "l'opération sur la clé n'est pas possible: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "ce n'est pas une carte OpenPGP"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr ""
+"erreur durant la lecture des informations contenues actuellement\n"
+"dans la clé: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Remplacer la clé existante ? (o/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Faire une sauvegarde hors carte de la clé de chiffrement ? (O/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Remplacer les clés existantes ? (o/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Notez que les réglages d'usine des codes PIN sont\n"
+"   PIN = `%s'     PIN admin = `%s'\n"
+"Vous devriez les changer avec la commande --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Sélectionnez le type de clé à générer:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Clé de signature\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Clé de chiffrement\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Clé d'authentification\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Choix invalide.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Sélectionnez l'endroit où stocker la clé:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "algorithme de protection de clé inconnu\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "Les parties secrètes de la clé ne sont pas disponibles.\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "la clé secrète est déjà stockée sur une carte\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "quitter ce menu"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "indiquer les commandes d'administration"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "afficher cette aide"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "lister toutes les données disponibles"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "changer le nom du propriétaire de la carte"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "changer l'URL pour récupérer la clé"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "aller chercher la clé spécifiée dans l'URL de la carte"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "changer le nom d'identification"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "changer les préférences de langue"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "changer le sexe du propriétaire de la carte"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "changer l'empreinte d'une autorité de certification"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+"inverser le paramètre obligeant à rentrer le code PIN pour les\n"
+"signatures"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "générer de nouvelles clés"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "menu pour changer ou déverrouiller le PIN"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "vérifier le code PIN et lister toutes les données"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Commande> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "La commande n'est utilisable qu'en mode administration\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Les commandes d'administration sont permises\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Les commandes d'administration ne sont pas permises\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Commande invalide  (essayez «help»)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "la clé secrète n'est pas disponible"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "Insérez la carte et tapez entrée ou entrez 'c' pour annuler: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "la suppression du bloc de clés a échoué : %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Supprimez la carte présente et insérez celle portant le numéro de\n"
+"série:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Tapez entrée quand vous êtes prêt ou entrez 'c' pour annuler: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Entrez le nouveau code PIN admin: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Entrez le nouveau code PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Entrez le code PIN admin: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Entrez le code PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Répétez ce code PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "le code PIN n'a pas été correctement répété ; recommencez"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "impossible d'ouvrir `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output n'est pas compatible avec cette commande\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "clé « %s » introuvable: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "erreur pendant la lecture du bloc de clé : %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(à moins de spécifier la clé par son empreinte)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "impossible de faire cela en mode automatique sans « --yes »\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Enlever cette clé du porte-clés ? (o/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "C'est une clé secrète ! - faut-il vraiment l'effacer ? (o/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "la suppression du bloc de clés a échoué : %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "les informations de confiance au propriétaires ont été effacées\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "il y a une clé secrète pour la clé publique \"%s\" !\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "utiliser l'option «--delete-secret-keys» pour l'effacer d'abord.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "erreur pendant la création de la phrase de passe: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+"il n'est pas possible d'utiliser un paquet ESK symétrique en mode S2K\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "utilisation de l'algorithme de chiffrement %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' déjà compressé\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVERTISSEMENT: `%s' est un fichier vide\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"le chiffrement RSA ne se fait qu'avec des clés de moins de 2048 bits\n"
+"en mode --pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "lecture de `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"impossible d'utiliser le chiffre IDEA pour toutes les clés vers\n"
+"lesquelles vous chiffrez.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"AVERTISSEMENT: forcer le chiffrement symétrique %s (%d) entre\n"
+"en désaccord avec les préférences du destinataire\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"AVERTISSEMENT: forcer l'algorithme de compression %s (%d) entre\n"
+"en désaccord avec les préférences du destinataire\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forcer le chiffrement symétrique %s (%d) entre en désaccord\n"
+"avec les préferences du destinataire\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "vous ne pouvez pas utiliser %s en mode %s.\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s chiffré pour: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "données chiffrées avec %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "chiffré avec l'algorithme inconnu %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ATTENTION: Le message a été chiffré avec une clé faible pendant le\n"
+"chiffrement symétrique.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problème de gestion des paquets chiffrés\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "aucun programme d'exécution distante n'est supporté\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "impossible de créer le répertoire `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"les appels aux programmes externes sont désactivés car les permissions\n"
+"du fichier d'options sont trop peu sûres\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"cette plateforme a besoin de fichiers temporaires pour appeler des\n"
+"programmes externes\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "impossible d'exécuter le programme `%s': %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "impossible d'exécuter l'intérpréteur de commandes `%s': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "erreur système pendant l'appel du programme externe: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "sortie non naturelle du programme externe\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "impossible d'exécuter le programme externe\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "impossible de lire la réponse du programme externe: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+"AVERTISSEMENT: impossible d'enlever le fichier temporaire\n"
+"(%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr ""
+"AVERTISSEMENT: impossible d'effacer le répertoire temporaire `%s':\n"
+"%s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "La signature sera marquée comme non-révocable.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "aucune clé de révocation trouvée pour « %s »\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "révoquer la clé ou les sous-clés sélectionnées"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "nettoyer les parties inutilisables de la clé"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "il est interdit d'exporter les clé secrètes\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "clé %s: non protégée - ignorée\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "clé %s: clé de style PGP 2.x - ignorée\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "clé %s: signature de sous-clé au mauvais endroit - ignorée\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "le stockage de la clé a échoué: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+"AVERTISSEMENT: la clé secrète %s n'a pas de somme de contrôle SK\n"
+"simple\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ATTENTION: rien n'a été exporté\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Commandes:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fichier]|faire une signature"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fichier]|faire une signature en texte clair"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "faire une signature détachée"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "chiffrer les données"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "chiffrement symétrique seulement"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "déchiffrer les données (défaut)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "vérifier une signature"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "lister les clés"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "lister les clés et les signatures"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "lister et vérifier les signatures des clés"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "lister les clés et les empreintes"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "lister les clés secrètes"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "générer une nouvelle paire de clés"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "enlever les clés du porte-clés public"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "enlever les clés du porte-clés secret"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "signer une clé"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "signer une clé localement"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "signer ou éditer une clé"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "générer un certificat de révocation"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exporter les clés"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exporter les clés vers un serveur de clés"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importer les clés d'un serveur de clés"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "chercher les clés avec un serveur de clés"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "mettre à jour les clés depuis un serveur"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importer/fusionner les clés"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "afficher l'état de la carte"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "changer les données d'une carte"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "changer le code PIN d'une carte"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "mettre la base de confiance à jour"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|alg. [fich.]|indiquer les fonctions de hachage"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Options:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "créer une sortie ascii avec armure"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOM|chiffrer pour NOM"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "utiliser ce nom pour signer ou déchiffrer"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|niveau de compression N (0 désactive)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "utiliser le mode texte canonique"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "utiliser comme fichier de sortie"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "bavard"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "ne rien changer"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "demander avant d'écraser un fichier"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "utiliser strictement le comportement OpenPGP"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "générer des messages compatibles avec PGP 2.x"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Voir la page de manuel pour une liste complète des commandes et options)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exemples:\n"
+"\n"
+" -se -r Alice [fichier]       signer et chiffrer pour l'utilisateur Alice\n"
+" --clearsign [fichier]        faire une signature en texte clair\n"
+" --detach-sign [fichier]      faire une signature détachée\n"
+" --list-keys [utilisateur]    montrer les clés\n"
+" --fingerprint [utilisateur]  montrer les empreintes\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Signaler toutes anomalies à <gnupg-bugs@gnu.org> (en anglais)\n"
+"et tout problème de traduction à <traduc@traduc.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Utilisation: gpg [options] [fichiers] (-h pour l'aide)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntaxe: gpg [options] [fichiers]\n"
+"signer, vérifier, chiffrer ou déchiffrer\n"
+"l'opération par défaut dépend des données entrées\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algorithmes supportés:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Clé publique: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Chiffrement: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hachage: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compression: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "utilisation: gpg [options] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "commandes en conflit\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "aucun signe = trouvé dans la définition du groupe `%s'\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr ""
+"AVERTISSEMENT: le propriétaire du répertoire personnel `%s' est\n"
+"peu sûr\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr ""
+"AVERTISSEMENT: le propriétaire du fichier de configuration `%s'\n"
+"est peu sûr\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr ""
+"AVERTISSEMENT: le propriétaire de l'extension `%s' est peu\n"
+"sûr\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr ""
+"AVERTISSEMENT: les permissions du répertoire personnel `%s'\n"
+"sont peu sûres\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr ""
+"AVERTISSEMENT: les permissions du fichier de configuration\n"
+"`%s' sont peu sûres\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr ""
+"AVERTISSEMENT: les permissions de l'extension `%s' sont\n"
+"peu sûres\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"AVERTISSEMENT: le propriétaire du répertoire contenant est peu\n"
+"sûr pour le répertoire personnel `%s'\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"AVERTISSEMENT: le propriétaire du répertoire contenant est peu\n"
+"sûr pour le fichier de configuration `%s'\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"AVERTISSEMENT: le propriétaire du répertoire contenant est peu\n"
+"sûr pour l'extension `%s'\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"AVERTISSEMENT: les permissions du répertoire contenant le\n"
+"répertoire personnel `%s' sont peu sûres\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"AVERTISSEMENT: les permissions du répertoire contenant le\n"
+"fichier de configuration `%s' sont peu sûres\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"AVERTISSEMENT: les permissions du répertoire contenant\n"
+"l'extension `%s' sont peu sûres\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "élément de configuration `%s' inconnu\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Pas de signature correspondante dans le porte-clés secret\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "l'URL du serveur de clés favori qui a été donnée est invalide\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr ""
+"passer de la liste des clés secrètes à celle des clés privées\n"
+"et inversement"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Pas de signature correspondante dans le porte-clés secret\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTE: l'ancien fichier d'options par défaut `%s' a été ignoré\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTE: pas de fichier d'options par défaut `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "fichier d'options `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "lire les options de `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTE: %s n'est pas pour une utilisation normale !\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"l'extension de chiffrement `%s' n'a pas été chargée car ses\n"
+"permissions sont peu sûres\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' n'est pas une date d'expiration de signature valide\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' n'est pas un jeu de caractères valide\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "impossible d'interpréter l'URL du serveur de clés\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: les options du serveur de clés sont invalides\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "les options du serveur de clés sont invalides\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: options d'import invalides\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "options d'import invalides\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: options d'export invalides\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "options d'export invalides\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: options de liste invalides\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "options de liste invalides\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "`%s' n'est pas une date d'expiration de signature valide\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "l'URL du serveur de clés favori qui a été donnée est invalide\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "`%s' n'est pas une date d'expiration de signature valide\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: options de vérification invalides\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "options de vérification invalides\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "impossible de mettre le chemin d'exécution à %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: options de vérification invalides\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "ATTENTION: Le programme peut créer un fichier «core» !\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "ATTENTION: %s remplace %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s n'est pas permis avec %s !\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s n'a aucun sens avec %s !\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "NOTE: %s n'est pas disponible dans cette version\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "pas d'exécution ave une mémoire non sécurisée à cause de %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"il n'est possible de faire une signature détachée ou en texte clair\n"
+"qu'en mode --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "vous ne pouvez pas signer et chiffrer en même temps en mode --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"vous devez utiliser des fichiers (et pas un tube) lorsque --pgp2\n"
+"est activé.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+"chiffrer un message en mode --pgp2 nécessite l'algorithme de chiffrage IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "l'algorithme de chiffrement sélectionné est invalide\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "la fonction de hachage sélectionnée est invalide\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "l'algorithme de compression sélectionné est invalide\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "la fonction de hachage de certification sélectionnée est invalide\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "«completes-needed» doit être supérieur à 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "«marginals-needed» doit être supérieur à 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth doit être compris entre 1 et 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "default-cert-level invalide; doit être 0, 1, 2 ou 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "min-cert-level invalide; doit être 0, 1, 2 ou 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTE: le mode S2K simple (0) est fortement déconseillé\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "mode S2K invalide; ce doit être 0, 1 ou 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "préférences par défaut invalides\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "préférences de chiffrement personnelles invalides\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "préférences de hachage personnelles invalides\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "préférences de compression personnelles invalides\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s ne marche pas encore avec %s\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+"vous ne pouvez pas utiliser l'algorithme de chiffrement `%s'\n"
+"en mode %s.\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+"vous ne pouvez pas utiliser l'algorithme de hachage `%s'\n"
+"en mode %s.\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+"vous ne pouvez pas utiliser l'algorithme de compression `%s'\n"
+"en mode %s.\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "impossible d'initialiser la base de confiance: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"AVERTISSEMENT: des destinataires (-r) ont été donnés alors que le\n"
+"chiffrement ne se fait pas par clé publique\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nom du fichier]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nom du fichier]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "le chiffrement symétrique de `%s' a échoué: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nom du fichier]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [nom du fichier]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "vous ne pouvez pas utiliser --symmetric --encrypt avec --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "vous ne pouvez pas utiliser --symmetric --encrypt en mode %s.\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nom du fichier]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nom du fichier]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [nom du fichier]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+"Vous ne pouvez pas utiliser --symmetric --sign --encrypt avec\n"
+"--s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr ""
+"vous ne pouvez pas utiliser --symmetric --sign --encrypt\n"
+"en mode %s.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [nom du fichier]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nom du fichier]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nom du fichier]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key utilisateur"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key utilisateur"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key utilisateur [commandes]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [utilisateur] [porte-clés]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "l'envoi vers le serveur de clés a échoué: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "la réception depuis le serveur de clés a échoué: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "l'export de la clé a échoué: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "la recherche au sein du serveur de clés a échoué: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "le rafraîchissement par le serveur de clés a échoué: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "la suppression d'une armure a échoué: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "la construction d'une armure a échoué: %s \n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algorithme de hachage `%s' invalide\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nom du fichier]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Vous pouvez taper votre message...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "l'URL de politique de certification donnée est invalide\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "l'URL de politique de signature donnée est invalide\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "l'URL du serveur de clés favori qui a été donnée est invalide\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "trop d'entrées dans le cache pk - désactivé\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[Nom utilisateur introuvable]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"La clé invalide %s a été rendue valide par\n"
+"--allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "pas de sous-clé secrète pour la clé publique %s - ignorée\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr ""
+"utilisation de la sous-clé %s à la place de la clé\n"
+"principale %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "clé %s: clé secrète sans clé publique - non prise en compte\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "devenir beaucoup plus silencieux"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "enlever les clés de ce porte-clés"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr ""
+"faire en sorte que les conflits d'horodatage ne soient qu'un\n"
+"avertissement non fatal"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|écrire l'état sur ce descripteur"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Utilisation: gpgv [options] [fichiers] (-h pour l'aide)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Syntaxe: gpg [options] [fichiers]\n"
+"Verifier des signatures avec des clés de confiance connues\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"C'est à vous d'assigner une valeur ici; cette valeur ne sera jamais\n"
+"envoyée à une tierce personne. Nous en avons besoin pour créer le réseau\n"
+"de confiance (web-of-trust); cela n'a rien à voir avec le réseau des\n"
+"certificats (créé implicitement)"
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Pour mettre en place le Réseau de confiance (Web of Trust), GnuPG a\n"
+"besoin de savoir en quelles clés votre confiance est ultime - ce sont\n"
+"en général les clés dont vous avez accès à la clé secrète. Répondez\n"
+"\"oui\" pour indiquer que votre confiance en cette clé est ultime\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "Si vous voulez utiliser cette clé peu sûre quand-même, répondez «oui»."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"Entrez le nom d'utilisateur de la personne à qui vous voulez envoyer\n"
+"le message."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Sélectionnez l'algorithme à utiliser.\n"
+"\n"
+"DSA (connu également sous le nom de DSS) est un algorithme de signature\n"
+"digitale et ne peut être utilisé que pour des signatures.\n"
+"\n"
+"Elgamal est un algorithme pour le chiffrement seul.\n"
+"\n"
+"RSA peut être utilisé pour les signatures et le chiffrement.\n"
+"\n"
+"La première clé (clé principale) doit toujours être une clé capable\n"
+"de signer."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"En général ce n'est pas une bonne idée d'utiliser la même clé pour\n"
+"signer et pour chiffrer. Cet algorithme ne doit être utilisé que\n"
+"pour certains domaines.\n"
+"Consultez votre expert en sécurité d'abord."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Entrez la taille de la clé"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Répondez «oui» ou «non»"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Entrez la valeur demandée comme indiqué dans la ligne de commande.\n"
+"On peut entrer une date ISO (AAAA-MM-JJ) mais le résultat d'erreur sera\n"
+"mauvais - le système essaierait d'interpréter la valeur donnée comme un\n"
+"intervalle."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Entrez le nom du propriétaire de la clé"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "entrez une adresse e-mail optionnelle mais hautement recommandée"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Entrez un commentaire optionnel"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N pour changer le nom.\n"
+"C pour changer le commentaire.\n"
+"E pour changer l'adresse e-mail.\n"
+"O pour continuer à générer la clé.\n"
+"Q pour arrêter de générer de clé."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Répondez «oui» (ou simplement «o») pour générer la sous-clé"
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Quand vous signez un nom d'utilisateur d'une clé, vous devriez d'abord\n"
+"vérifier que la clé appartient à la personne nommée. Il est utile que\n"
+"les autres personnes sachent avec quel soin vous l'avez vérifié.\n"
+"\n"
+"\"0\" signifie que vous n'avez pas d'opinon.\n"
+"\n"
+"\"1\" signifie que vous croyez que la clé appartient à la personne qui\n"
+"dit la posséder mais vous n'avez pas pu vérifier du tout la clé.\n"
+"C'est utile lorsque vous signez la clé d'un pseudonyme.\n"
+"\n"
+"\"2\" signifie que vous avez un peu vérifié la clé. Par exemple, cela\n"
+"pourrait être un vérification de l'empreinte et du nom de\n"
+"l'utilisateur avec la photo.\n"
+"\n"
+"\"3\" signifie que vous avez complètement vérifié la clé. Par exemple,\n"
+"cela pourrait être une vérification de l'empreinte, du nom de\n"
+"l'utilisateur avec un document difficile à contrefaire (comme un\n"
+"passeport) et de son adresse e-mail (vérifié par un échange de\n"
+"courrier électronique).\n"
+"\n"
+"Notez bien que les exemples donnés ci-dessus pour les niveaux 2 et\n"
+"3 ne sont *que* des exemples.\n"
+"C'est à vous de décider quelle valeur mettre quand vous signez\n"
+"les clés des autres personnes.\n"
+"\n"
+"Si vous ne savez pas quelle réponse est la bonne, répondez \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Répondez «oui» si vous voulez signer TOUS les noms d'utilisateurs"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Répondez «oui» si vous voulez vraiment supprimer ce nom\n"
+"d'utilisateur. Tous les certificats seront alors perdus en même temps !"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Répondez «oui» s'il faut vraiment supprimer la sous-clé"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"C'est une signature valide dans la clé; vous n'avez pas normalement\n"
+"intérêt à supprimer cette signature car elle peut être importante pour\n"
+"établir une connection de confiance vers la clé ou une autre clé certifiée\n"
+"par celle-là."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Cette signature ne peut pas être vérifiée parce que vous n'avez pas la\n"
+"clé correspondante. Vous devriez remettre sa supression jusqu'à ce que\n"
+"vous soyez sûr de quelle clé a été utilisée car cette clé de signature\n"
+"peut établir une connection de confiance vers une autre clé déjà certifiée."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Cette signature n'est pas valide. Vous devriez la supprimer de votre\n"
+"porte-clés."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Cette signature relie le nom d'utilisateur à la clé. Habituellement\n"
+"enlever une telle signature n'est pas une bonne idée. En fait GnuPG peut\n"
+"ne plus être capable d'utiliser cette clé. Donc faites ceci uniquement si\n"
+"cette auto-signature est invalide pour une certaine raison et si une autre\n"
+"est disponible."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Changer les préférences de tous les noms d'utilisateurs (ou juste\n"
+"ceux qui sont sélectionnés) vers la liste actuelle. La date de toutes\n"
+"les auto-signatures affectées seront avancées d'une seconde.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Entrez le mot de passe ; c'est une phrase secrète \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Répétez la dernière phrase de passe pour être sûr de ce que vous\n"
+"avez tapé."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Donnez le nom du fichier auquel la signature se rapporte"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Répondez «oui» s'il faut vraiment réécrire le fichier"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Entrez le nouveau nom de fichier. Si vous tapez simplement ENTRÉE le\n"
+"fichier par défaut (indiqué entre crochets) sera utilisé."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Vous devriez donner une raison pour la certification. Selon le contexte\n"
+"vous pouvez choisir dans cette liste:\n"
+"  «La clé a été compromise»\n"
+"      Utilisez cette option si vous avez une raison de croire que des\n"
+"      personnes ont pu accéder à votre clé secrète sans autorisation.\n"
+"  «La clé a été remplacée»\n"
+"      Utilisez cette option si vous avez remplacé la clé par une nouvelle.\n"
+"  «La clé n'est plus utilisée»\n"
+"      Utilisez cette option si cette clé n'a plus d'utilité.\n"
+"  «Le nom d'utilisateur n'est plus valide»\n"
+"      Utilisez cette option si le nom d'utilisateur ne doit plus être\n"
+"      utilisé. Cela sert généralement à indiquer qu'une adresse e-mail\n"
+"      est invalide.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Si vous le désirez, vous pouvez entrer un texte qui explique pourquoi vous\n"
+"avez émis ce certificat de révocation. Essayez de garder ce texte concis.\n"
+"Une ligne vide délimite la fin du texte.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Pas d'aide disponible"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Pas d'aide disponible pour `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "mettre la base de confiance à jour"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "la clé publique ne correspond pas à la clé secrète !\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "nettoyer les parties inutilisables de la clé"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "un bloc de type %d a été ignoré\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu clés traitées jusqu'ici\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "       Quantité totale traitée: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "       nouvelles clés ignorées: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "        sans nom d'utilisateur: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                      importée: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                     inchangée: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "  nouveaux noms d'utilisateurs: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           nouvelles sous-clés: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "          nouvelles signatures: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr " nouvelles révocations de clés: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "            clés secrètes lues: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "       clés secrètes importées: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "      clés secrètes inchangées: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "                  non importée: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "          signatures nettoyées: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "   noms d'utilisateur nettoyés: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "AVERTISSEMENT: la clé %s contient des préferences pour des\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "algorithmes indisponibles sur ces noms d'utilisateurs:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         « %s »: préférence pour l'algorithme de chiffrement %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         « %s »: préférence pour l'algorithme de hachage %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         « %s »: préférence pour l'algorithme de compression %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "il est fortement suggéré de mettre à jour vos préférences et\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"redistribuer cette clé pour éviter les problèmes potentiels qui seraient\n"
+"causés par des algorithmes non appropriés\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+"vous pouvez mettre à jour vos préférences avec: \n"
+"gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "clé %s: pas de nom d'utilisateur\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "clé %s: corruption de sous-clé PKS réparée\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "clé %s: nom d'utilisateur non auto-signé accepté « %s »\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "clé %s: pas de nom d'utilisateur valide\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "cela peut provenir d'une auto-signature manquante\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "clé %s: clé publique non trouvée: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "clé %s: nouvelle clé - ignorée\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "aucun porte-clé n'a été trouvé avec des droits d'écriture : %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "écriture de `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "erreur durant l'écriture du porte-clés `%s': %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "clé %s: clé publique « %s » importée\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "clé %s: ne ressemble pas à notre copie\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "clé %s: impossible de trouver le bloc de clés original: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "clé %s: impossible de lire le bloc de clés original: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "clé %s: « %s » un nouvel utilisateur\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "clé %s: « %s » %d nouveaux utilisateurs\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "clé %s: « %s » une nouvelle signature\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "clé %s: « %s » %d nouvelles signatures\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "clé %s: « %s » une nouvelle sous-clé\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "clé %s: « %s » %d nouvelles sous-clés\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "clé %s: « %s » %d signature nettoyée\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "clé %s: « %s » %d signatures nettoyées\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "clé %s: « %s » %d nom d'utilisateur nettoyé\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "clé %s: « %s » %d noms d'utilisateur nettoyés\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "clé %s: « %s » n'a pas changé\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr ""
+"clé %s: clé secrète avec le chiffrement invalide %d - non prise\n"
+"en compte\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "il est interdit d'importer les clé secrètes\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "pas de porte-clés par défaut: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "clé %s: clé secrète importée\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "clé %s: déjà dans le porte-clés secret\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "clé %s: clé secrète non trouvée: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"clé %s: pas de clé publique - le certificat de révocation ne peut\n"
+"être appliqué\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "clé %s: certificat de révocation invalide: %s - rejeté\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "clé %s: « %s » certificat de révocation importé\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "clé %s: pas de nom d'utilisateur pour la signature\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"clé %s: algorithme de clé publique non supporté avec le nom\n"
+"d'utilisateur « %s »\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "clé %s: auto-signature du nom d'utilisateur « %s » invalide\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "clé %s: pas de sous-clé pour relier la clé\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "clé %s: algorithme de clé publique non supporté\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "clé %s: liaison avec la sous-clé invalide\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "clé %s: supression de liaisons multiples avec des sous-clés\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "clé %s: pas de sous-clé pour révoquer la clé\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "clé %s: révocation de sous-clé invalide\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "clé %s: suppression de la révocation de sous-clés multiples\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "clé %s: nom d'utilisateur « %s » non pris en compte\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "clé %s: sous-clé non prise en compte\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "clé %s: signature non exportable (classe 0x%02X) - ignorée\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "clé %s: certificat de révocation au mauvais endroit - ignorée\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "clé %s: certificat de révocation invalide: %s - ignorée\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "clé %s: signature de sous-clé au mauvais endroit - ignorée\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "clé %s: classe de signature non attendue (0x%02X) - ignorée\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "clé %s: nom d'utilisateur en double détecté - fusion accomplie\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"AVERTISSEMENT: la clé %s est peut-être révoquée: recherche de\n"
+"la clé de révocation %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"AVERTISSEMENT: la clé %s est peut-être révoquée: la clé de\n"
+"révocation %s est absente.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "clé %s: certificat de révocation « %s » ajouté\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "clé %s: ajout de la signature de clé directe\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "NOTE: le numéro de série d'une clé n'est pas celui de la carte\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "NOTE: la clé primaire est en ligne et stockée sur la carte\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "NOTE: la clé secondaire est en ligne et stockée sur la carte\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "erreur durant la création du porte-clés `%s' : %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "le porte-clés `%s` a été créé\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "ressource bloc de clés `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "la reconstruction du cache de porte-clés a échoué : %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[révocation]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[auto-signature]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "une mauvaise signature\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d mauvaises signatures\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "une signature non vérifiée à cause d'une clé manquante\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d signatures non vérifiées à cause de clés manquantes\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "une signature non vérifiée à cause d'une erreur\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signatures non vérifiées à cause d'erreurs\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "un nom d'utilisateur sans auto-signature valide détecté\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d nom d'utilisateurs sans auto-signature valide détecté\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Décidez maintenant à quel point vous avez confiance en cet utilisateur\n"
+"pour qu'il vérifie les clés des autres utilisateurs (vous pouvez\n"
+"vérifier son passeport, vérifier les empreintes de plusieurs sources\n"
+"différentes, etc.)\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = je crois marginalement\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = je fais entièrement confiance\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Entrez la profondeur de cette signature de confiance.\n"
+"Une profondeur supérieure à 1 permet à la clé que vous signez de faire\n"
+"des signatures de confiance de votre part.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+"Entrez un domaine pour restreindre cette signature, ou bien appuyez\n"
+"sur la touche entrée pour aucun domaine.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Le nom d'utilisateur \"%s\" est révoqué."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Etes-vous sûr de toujours vouloir le signer ? (o/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Impossible de signer.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Le nom d'utilisateur \"%s\" est expiré."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Le nom d'utilisateur \"%s\" ne comporte pas d'auto-signature."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Le nom d'utilisateur \"%s\" est susceptible d'être signé.  "
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Signer réellement ? (o/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"L'auto-signature de \"%s\"\n"
+"est de style PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Voulez vous la changer en une auto-signature OpenPGP ? (o/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Votre signature actuelle de \"%s\"\n"
+"a expiré.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Voulez-vous créer une nouvelle signature pour remplacer celle qui a\n"
+"expiré ? (o/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Votre signature actuelle de \"%s\"\n"
+"est locale.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Voulez vous la rendre complètement exportable ? (o/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "« %s » a déjà été signé localement par la clé %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "« %s » a déjà été signé par la clé %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Voulez-vous vraiment le signer encore une fois ? (o/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Rien à signer avec la clé %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Cette clé a expiré !"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Cette clé va expirer le %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Voulez-vous que votre signature expire en même temps ? (O/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"il n'est pas possible de générer une signature OpenPGP d'une clé de style\n"
+"PGP 2.x en mode --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Cela rendra la clé inutilisable par PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Avec quel soin avez-vous vérifié que la clé que vous allez signer\n"
+"appartient réellement à la personne sus-nommée ? Si vous ne savez\n"
+"quoi répondre, entrez \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Je ne répondrai pas.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Je n'ai pas vérifié du tout.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) J'ai un peu vérifié.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) J'ai vérifié très soigneusement.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Votre sélection ? (entrer '?' pour plus d'informations): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Etes-vous vraiment sûr(e) que vous voulez signer cette clé\n"
+"avec votre clé « %s » (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Ceci sera une auto-signature.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"AVERTISSEMENT: la signature ne sera pas marquée comme\n"
+"non-exportable.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"AVERTISSEMENT: La signature ne sera pas marquée comme\n"
+"non-révocable.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "La signature sera marquée comme non-exportable.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "La signature sera marquée comme non-révocable.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "Je n'ai pas du tout vérifié cette clé.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "J'ai un peu vérifié cette clé.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "J'ai vérifié cette clé avec grand soin.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Signer réellement ? (o/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "la signature a échoué: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+"La clé possède seulement des items partiels ou stockés sur carte -\n"
+"pas de phrase de passe à changer.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Cette clé n'est pas protégée.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Les parties secrètes de la clé principale ne sont pas disponibles.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr ""
+"Les parties secrètes de la clé principale sont stockées sur la\n"
+"carte.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "La clé est protégée.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Impossible d'éditer cette clé: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr "Entrez la nouvelle phrase de passe pour cette clé secrète.\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "la phrase de passe n'a pas été correctement répétée ; recommencez."
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Vous ne voulez pas de phrase de passe - cela est certainement une\n"
+"*mauvaise* idée\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Voulez-vous vraiment faire cela ? (o/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "replacer la signature d'une clé à l'endroit correct\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "enregistrer et quitter"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "afficher l'empreinte de la clé"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "lister la clé et les noms d'utilisateurs"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "sélectionner le nom d'utilisateur N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "sélectionner la sous-clé N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "vérifier les signatures"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+"signer les noms d'utilisateurs sélectionnés [* voir ci-dessous pour\n"
+"les commandes similaires]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "signer le nom d'utilisateur sélectionné localement"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "signer les noms d'utilisateurs sélectionnés localement"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+"signer les noms d'utilisateurs sélectionnés avec une signature\n"
+"non-révocable"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "ajouter un utilisateur"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "ajouter une photo d'identité"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "enlever les noms d'utilisateur sélectionnés"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "ajouter une sous-clé"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "ajouter une clé à une carte à puce"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "déplacer une clé vers une carte à puce"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "déplacer une clé de sauvegarde vers une carte à puce"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "enlever les sous-clés sélectionnées"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "ajouter une clé de révocation"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "enlever les signatures des noms d'utilisateur sélectionnés "
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "changer la date d'expiration de la clé ou des sous-clés sélectionnées"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "marquer le nom d'utilisateur sélectionné comme principal"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr ""
+"passer de la liste des clés secrètes à celle des clés privées\n"
+"et inversement"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "lister les préférences (expert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "lister les préférences (bavard)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"indiquer la liste des préférences pour le nom d'utilisateur\n"
+"sélectionné"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr ""
+"indiquer l'URL du serveur de clés préféré pour les noms d'utilisateur\n"
+"sélectionnés"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"indiquer la liste des préférences pour le nom d'utilisateur\n"
+"sélectionné"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "changer la phrase de passe"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "changer la confiance"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "révoquer les signatures des noms d'utilisateur sélectionnés"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "révoquer les noms d'utilisateur sélectionnés"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "révoquer la clé ou les sous-clés sélectionnées"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "activer la clé"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "désactiver la clé"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "montrer les photos d'identité sélectionnées"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "erreur pendant la lecture du bloc de clé secrète « %s »: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "La clé secrète est disponible.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Il faut la clé secrète pour faire cela.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Utilisez la commande «toggle» d'abord.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* La commande `sign' peut être précédée du caractère `l' pour les\n"
+"signatures locales (lsign), par `t' pour les signatures de confiance\n"
+"(tsign), par `nr' pour les signatures non-révocables (nrsign), ou\n"
+"bien toute combinaison possible (ltsign, tnrsign, etc.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "La clé est révoquée."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Signer vraiment tous les nom d'utilisateurs ? (o/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Aide: Sélectionner les utilisateurs à signer\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Type de signature `%s' inconnu\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Cette commande n'est pas admise en mode %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Vous devez sélectionner au moins un utilisateur.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Vous ne pouvez pas supprimer le dernier utilisateur !\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Enlever réellement tous les noms d'utilisateurs sélectionnés ? (o/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Enlever réellement ce nom d'utilisateur ? (o/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Enlever réellement la clé principale ? (o/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Vous devez sélectionner exactement une clé.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "La commande attend un nom de fichier comme argument\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Impossible d'ouvrir `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Erreur durant la lecture de la clé de sauvegarde de `%s' : %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Vous devez sélectionner au moins une clé.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Voulez-vous vraiment supprimer les clés sélectionnées ? (o/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Voulez-vous vraiment supprimer cette clé ? (o/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Révoquer réellement tous les noms d'utilisateurs sélectionnés ? (o/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Révoquer réellement ce nom d'utilisateur ? (o/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Voulez-vous vraiment révoquer la clé entière ? (o/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Voulez-vous vraiment révoquer les sous-clés sélectionnées ? (o/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Voulez-vous vraiment révoquer cette sous-clé ? (o/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"La confiance du propriétaire peut ne pas être positionnée en utilisant\n"
+"la base de confiance d'un tiers\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Changer la liste de préférences en :\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Mettre à jour réellement les préférences des noms d'utilisateurs\n"
+"sélectionnés ? (o/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Faut-il vraiment mettre à jour les préférences ? (o/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Enregistrer les changements? (o/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Quitter sans enregistrer ? (o/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "la mise à jour a échoué: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "la mise à jour de la clé secrète a échoué: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "La clé n'a pas changé donc la mise à jour est inutile.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Hachage: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Fonctions: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Serveur de clés: pas-de-modification"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Serveur de clés préféré: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"Options:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+"Il n'y a pas de préférences dans un nom d'utilisateur du style de\n"
+"PGP 2.x.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Cette clé a été révoquée le %s par la clé %s %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Cette clé peut être révoquée par la clé %s %s"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(sensible)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "créé: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "revoqué: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "expiré: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "expire: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "utilisation: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr " confiance: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "validité: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Cette clé a été désactivée"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "n° de carte: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Notez que la validité affichée pour la clé n'est pas nécessairement\n"
+"correcte tant que vous n'avez pas relancé le programme.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "revoquée"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "expirée"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"AVERTISSEMENT: aucun nom d'utilisateur n'a été défini comme principal.\n"
+"Cette commande risque de rendre un autre nom d'utilisateur principal\n"
+"par défaut.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"ATTENTION: C'est une clé du style PGP2.  Ajouter une photo\n"
+"d'identité peut empêcher certaines versions de PGP d'accepter\n"
+"cette clé\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Etes-vous sûr de vouloir l'ajouter ? (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+"Vous ne pouvez pas ajouter de photo d'identité à une clé du style PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Supprimer cette bonne signature ? (o/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Supprimer cette signature invalide ? (o/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Supprimer cette signature inconnue ? (o/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Faut-il vraiment supprimer cette auto-signature ? (o/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d signature supprimée.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d signatures supprimées\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Rien n'a été supprimé.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "invalide"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Nom d'utilisateur \"%s\": déjà nettoyé.\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "clé %s: « %s » %d signature nettoyée\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "clé %s: « %s » %d signatures nettoyées\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "Nom d'utilisateur \"%s\": déjà nettoyé.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "Nom d'utilisateur \"%s\": déjà nettoyé.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVERTISSEMENT: C'est une clé du style PGP2.  Ajouter un révocateur\n"
+"désigné peut empêcher certaines versions de PGP d'accepter\n"
+"cette clé.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"Vous ne pouvez pas ajouter de révocateur désigné à une clé de style PGP2.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Entrez le nom d'utilisateur du révocateur désigné: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"impossible d'utiliser une clé de style PGP 2.x comme révocateur\n"
+"désigné.\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+"vous ne pouvez pas utiliser une clé comme son propre révocateur\n"
+"désigné\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "cette clé à déjà été désignée comme un révocateur\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"AVERTISSEMENT: l'établissement d'une clé comme révocateur désigné\n"
+"est irréversible !\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Etes-vous sûr de vouloir établir cette clé comme révocateur\n"
+"désigné ? (o/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Enlevez les sélections des clés secrètes.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Vous devez sélectionner au plus une sous-clé.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Changer la date d'expiration d'une sous-clé.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Changer la date d'expiration de la clé principale.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Vous ne pouvez pas changer la date d'expiration d'une clé v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Pas de signature correspondante dans le porte-clés secret\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"AVERTISSEMENT: la sous-clé de signature %s n'a pas de certificat\n"
+"croisé\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Vous devez sélectionner exactement un utilisateur.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "l'auto-signature v3 du nom d'utilisateur « %s » a été ignorée\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Entrez l'URL de votre serveur de clés favori: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Etes-vous sûr de vouloir le remplacer ? (o/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Etes-vous sûr de vouloir le supprimer ? (o/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notation de signature: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Réécrire par-dessus ? (o/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Pas d'utilisateur avec l'index %d\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Pas de nom d'utilisateur avec le hachage %s\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "Pas de sous-clé avec l'index %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "nom d'utilisateur: « %s »\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "signé par votre clé %s à %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (non-exportable)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Cette signature a expiré le %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Etes-vous sûr de vouloir toujours le révoquer ? (y/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Générer un certificat de révocation pour cette signature ? (o/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Vous avez signé ces noms d'utilisateurs sur la clé %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (non-révocable)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "révoqué par votre clé %s à %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Vous êtes sur le point de révoquer ces signatures:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Créer réellement les certificats de révocation ? (o/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "pas de clé secrète\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "Le nom d'utilisateur \"%s\" est déjà révoqué.\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"AVERTISSEMENT: une signature de nom d'utilisateur date de %d secondes\n"
+"dans le futur\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "La clé %s est déjà révoqué.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "La sous-clé %s est déjà révoquée.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Affichage %s photo d'identité de taille %ld pour la clé\n"
+"0x%s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "préférence `%s' dupliquée\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "trop de préférences de chiffrement\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "trop de préférences de hachage\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "trop de préférences de compression\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "élément `%s' invalide dans la chaîne de préférences\n"
+
+# g10/keygen.c:123 ???
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "écriture de la signature directe\n"
+
+# g10/keygen.c:123 ???
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "écriture de l'auto-signature\n"
+
+# g10/keygen.c:161 ???
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "écriture de la signature de liaison\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "Taille invalide; utilisation de %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "taille arrondie à %u bits\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Signer"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Chiffrer"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Authentifier"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsCcAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Actions possibles pour une clé %s: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Actions actuellement permises: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Inverser la capacité de signer\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Inverser la capacité de chiffrement\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Inverser la capacité d'authentifier\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Terminé\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Sélectionnez le type de clé désiré:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA et Elgamal (par défaut)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (signature seule)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (indiquez vous-même les capacités)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Elgamal (chiffrement seul)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (signature seule)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (chiffrement seul)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (indiquez vous-même les capacités)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "La paire de clés DSA fera %u bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "les clés %s peuvent faire entre %u et %u bits de longueur.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Quelle taille de clé désirez-vous ? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "les tailles de clés %s doivent être dans l'intervalle %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "La taille demandée est %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "arrondie à %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Spécifiez combien de temps cette clé devrait être valide.\n"
+"         0 = la clé n'expire pas\n"
+"      <n>  = la clé expire dans n jours\n"
+"      <n>w = la clé expire dans n semaines\n"
+"      <n>m = la clé expire dans n mois\n"
+"      <n>y = la clé expire dans n années\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Spécifiez combien de temps la signature devrait être valide.\n"
+"         0 = la signature n'expire pas\n"
+"      <n>  = la signature expire dans n jours\n"
+"      <n>w = la signature expire dans n semaines\n"
+"      <n>m = la signature expire dans n mois\n"
+"      <n>y = la signature expire dans n années\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "La clé est valide pour ? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "La signature est valide pour ? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valeur invalide\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "La clé n'expire pas du tout\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "La signature n'expire pas du tout\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "La clé expire le %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "La signature expire le %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Votre système ne sait pas afficher les dates au-delà de 2038.\n"
+"Cependant la gestion des dates sera correcte jusqu'à 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Est-ce correct ? (o/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Vous avez besoin d'un nom d'utilisateur pour identifier votre clé; le\n"
+"programme le construit à partir du nom réel, d'un commentaire et d'une\n"
+"adresse e-mail de cette manière:\n"
+"   « Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de> »\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nom réel: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Caractère invalide dans le nom\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Le nom ne doit pas commencer par un chiffre\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Le nom doit faire au moins 5 caractères de long\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Adresse e-mail: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Ce n'est pas une adresse e-mail valide\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Commentaire: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Caractère invalide dans le commentaire\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Vous utilisez le jeu de caractères '%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Vous avez sélectionné ce nom d'utilisateur:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Ne mettez pas d'adresse e-mail dans le nom réel ou dans le commentaire\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Changer le (N)om, le (C)ommentaire, l'(E)-mail ou (Q)uitter ? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Changer le (N)om, le (C)ommentaire, l'(E)-mail ou (O)K/(Q)uitter ? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Corrigez l'erreur d'abord\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Vous avez besoin d'une phrase de passe pour protéger votre clé\n"
+"secrète.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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 de passe - c'est sûrement une *mauvaise*\n"
+"idée !\n"
+"Je l'accepte quand-même. Vous pouvez changer votre phrase de passe\n"
+"quand vous le désirez, en utilisant ce programme avec l'option\n"
+"« --edit-key ».\n"
+"\n"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Un grand nombre d'octets aléatoires doit être généré. Vous devriez faire\n"
+"autre-chose (taper au clavier, déplacer la souris, utiliser les disques)\n"
+"pendant la génération de nombres premiers; cela donne au générateur de\n"
+"nombres aléatoires une meilleure chance d'avoir assez d'entropie.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "La génération de clé a été annulée.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "écriture de la clé publique dans `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "écriture d'une clé secrète partielle dans `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "écriture de la clé secrète dans `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr ""
+"aucun portes-clés public n'a été trouvé avec des droits d'écriture : %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr ""
+"aucun portes-clés secret n'a été trouvé avec des droits d'écriture : %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "erreur durant l'écriture du porte-clés public `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "erreur durant l'écriture du porte-clés secret `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "les clés publique et secrète ont été créées et signées.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Notez que cette clé ne peut être utilisée pour chiffrer. Vous pouvez\n"
+"utiliser la commande «--edit-key» pour générer une sous-clé à\n"
+"cette fin.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "La génération de clé a échoué: %s\n"
+
+# on s'amuse comme on peut...
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"la clé a été créée %lu seconde dans le futur (rupture spatio-temporelle ou\n"
+"problème d'horloge)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"la clé a été créée %lu secondes dans le futur (rupture spatio-temporelle ou\n"
+"problème d'horloge\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"NOTE: créer des sous-clés pour des clés v3 n'est pas conforme à OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Créer vraiment ? (o/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "le stockage de la clé dans la carte a échoué: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "impossible de créer le fichier de sauvegarde `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTE: sauvegarde de la clé de la carte dans `%s'\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "jamais    "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Politique de signature critique: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Politique de signature: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Serveur de clés critique favori: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notation de signature critique: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notation de signature: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Porte-clés"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Empreinte de clé principale:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "   Empreinte de la sous-clé:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Empreinte de la clé principale:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "       Empreinte de la sous-clé:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "    Empreinte de la clé ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "N° de série de la carte ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "renommer `%s' en `%s' a échoué: %s \n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr ""
+"ATTENTION: 2 fichiers avec des informations confidentielles existent.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s est le fichier original\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s est le nouveau\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Réparez ce problème de sécurité possible\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "mise en antémémoire du porte-clés `%s'\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu clés en antémémoire vérifiées pour l'instant (%lu signatures)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu clés en antémémoire (%lu signatures)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: porte-clés créé\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Entrez l'URL de votre serveur de clés favori: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"AVERTISSEMENT: les options de serveur de clés `%s' ne sont pas\n"
+"utilisées dans cette plateforme\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "désactivé"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Entrez le(s) nombre(s), S)uivant, ou Q)uitter > "
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "protocole serveur de clés invalide (nous %d!=gestionnaire %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "clé « %s » introuvable dans le serveur de clés\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "clé non trouvée dans le serveur de clés\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "requête de la clé %s du serveur %s %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "requête de la clé %s de %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "recherche de « %s » du serveur %s %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "recherche de « %s » de %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "envoi de la clé %s au serveur %s %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "envoi de la clé %s à %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "recherche de « %s » du serveur %s %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "recherche de « %s » de %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "pas d'action pour le serveur de clés !\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+"AVERTISSEMENT: le gestionnaire de serveurs de clés provient d'une\n"
+"version différente de GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "le serveurs de clés n'a pas envoyé son numéro de VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "pas de serveur de clés connu (utilisez l'option --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+"les appels externes à un serveur de clé ne sont pas supportés dans\n"
+"cette compilation\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "pas de gestionnaire pour le type de serveurs de clés `%s'\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+"l'action `%s' n'est pas supportée avec le type de serveurs\n"
+"de clés `%s'\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s ne supporte pas le gestionnaire de version %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "le délai d'attente du serveur de clés a expiré\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "erreur interne du serveur de clés\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "erreur de communication avec le serveur de clés: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "« %s » n'est pas une ID de clé: ignoré\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr ""
+"AVERTISSEMENT: impossible de rafraîchir la clé %s\n"
+"via %s: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "rafraîchissement d'une clé depuis %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "rafraîchissement de %d clés depuis %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr ""
+"AVERTISSEMENT: impossible de rafraîchir la clé %s\n"
+"via %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr ""
+"AVERTISSEMENT: impossible de rafraîchir la clé %s\n"
+"via %s: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "taille étonnante pour une clé de session chiffrée (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "clé de session chiffrée %s\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "phrase de passe générée avec l'algorithme de hachage %d inconnu\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "la clé publique est %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "données chiffrées par clé publique: bonne clé de chiffrement (DEK)\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "chiffré avec une clé de %u bits %s, ID %s, créée le %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      « %s »\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "chiffré avec une clé %s, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "le déchiffrement par clé publique a échoué: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "chiffré avec %lu phrases de passe\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "chiffré avec 1 phrase de passe\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "on suppose des données chiffrées avec %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"L'algorithme IDEA n'est pas disponible, avec un peu de chance %s marchera\n"
+"peut-être\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "le déchiffrement a réussi\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVERTISSEMENT: l'intégrité du message n'était pas protégée\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "AVERTISSEMENT: le message chiffré a été manipulé !\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "le déchiffrement a échoué: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTE: l'expéditeur a demandé «pour vos yeux seulement»\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nom de fichier original: '%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "révocation autonome - utilisez «gpg --import» pour l'appliquer\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Bonne signature de « %s »"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "vérification de signature supprimée\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "le traitement de ces signatures multiples est impossible\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Signature faite le %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               en utilisant la clé %s %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signature faite le %s avec la clé %s ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Clé disponible sur: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "MAUVAISE signature de « %s »"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Signature expirée de « %s »"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Bonne signature de « %s »"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[incertain]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                alias « %s »"
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "La signature a expiré le %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "La signature expire le %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "signature %s, algorithme de hachage %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binaire"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "modetexte"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "inconnu"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Impossible de vérifier la signature: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "la signature n'est pas détachée\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"AVERTISSEMENT: plusieurs signatures ont été détéctées. Seulement la "
+"première\n"
+"sera vérifiée.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "signature autonome de classe 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "signature d'un ancien style (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "paquet racine invalide détecté dans proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "impossible d'empêcher la génération de fichiers «core»: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "fstat de `%s' échoué dans %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) échoué dans %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr ""
+"AVERTISSEMENT: utilisation de l'algorithme expérimental à clé\n"
+"publique %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr ""
+"AVERTISSEMENT: utilisation de l'algorithme expérimental de chiffrement\n"
+"%s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr ""
+"AVERTISSEMENT: utilisation de l'algorithme de hachage\n"
+"expérimental %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "AVERTISSEMENT: l'algorithme de hachage %s est déconseillé\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "le module de chiffrement IDEA n'est pas présent\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "voir http://www.gnupg.org/fr/faq.html pour plus d'informations\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: option déconseillée \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVERTISSEMENT: \"%s\" est une option déconseillée.\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "utilisez \"%s%s\" à la place\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr ""
+"AVERTISSEMENT: \"%s\" est une commande déconseillée - ne\n"
+"l'utilisez pas\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Non-compressé"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "noncompressé|non"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "ce message ne sera pas utilisable par %s\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "option ambiguë `%s'\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "option `%s' inconnue\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Le fichier `%s' existe. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Réécrire par-dessus ? (o/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: suffixe inconnu\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Entrez le nouveau nom de fichier"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "écriture vers la sortie standard\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "les données signées sont supposées être dans `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr " nouveau fichier de configuration `%s' créé\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"AVERTISSEMENT: les options de `%s' ne sont pas encore actives cette fois\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "répertoire `%s' créé\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "impossible de gérer l'algorithme à clé publique %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"AVERISSEMENT: la clé de session chiffrée de manière symétrique est\n"
+"potentiellement non sûre\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "un sous-paquet de type %d possède un bit critique\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent n'est pas disponible dans cette session\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "la variable d'environnement GPG_AGENT_INFO est mal définie\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "le protocole gpg-agent version %d n'est pas supporté\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "impossible de se connecter à `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problème avec l'agent - arrêt d'utilisation de l'agent\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (ID clé principale %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Vous avez besoin d'une phrase de passe pour déverrouiller la clé\n"
+"secrète pour l'utilisateur:\n"
+"\"%.*s\"\n"
+"clé %u bits %s, ID %s, créée %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Répétez la phrase de passe\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Entrez la phrase de passe\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "annulé par l'utilisateur\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "impossible de demander la phrase de passe en mode automatique\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Entrez la phrase de passe: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Vous avez besoin d'une phrase de passe pour déverrouiller la\n"
+"clé secrète pour l'utilisateur: « %s »\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "clé de %u bits %s, ID %s, créée le %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "        (sous-clé de la clé principale ID %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Répétez la phrase de passe: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Choisissez une image à utiliser pour votre photo d'identité. L'image\n"
+"doit être un fichier JPEG. Rappelez-vous que cette image est stockée\n"
+"dans votre clé publique. Si vous utilisez une image très grosse, il\n"
+"en sera de même pour votre clé !\n"
+"La meilleure taille à utiliser est 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Entrez le nom du fichier JPEG pour la photo d'identité: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "impossible d'ouvrir le fichier JPEG `%s': %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "Ce JPEG est vraiment trés grand (%d octets) !\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Êtes-vous sûr de vouloir l'utiliser ? (o/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' n'est pas un fichier JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Cette photo est-elle correcte (o/N/q) ? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "impossible d'afficher la photo d'identité !\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Aucune raison spécifiée"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "La clé a été remplacée"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "La clé a été compromise"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "La clé n'est plus utilisée"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Le nom d'utilisateur n'est plus valide"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "cause de révocation: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "commentaire de révocation: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "Pas de valeur de confiance définie pour :\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  alias « %s »\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"Jusqu'à quel point avez-vous confiance au fait que cette clé\n"
+"appartient rééllement à l'utilisateur nommé ?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = ne sais pas ou ne dirai pas\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = je ne fais PAS confiance\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = je donne une confiance ultime\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = retour au menu principal\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = sauter cette clé\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = quitter\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"Le niveau de confiance minimal pour cette clé est: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Votre décision ? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Voulez-vous vraiment donner une confiance ultime à cette clé ? (o/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificats conduisant vers une clé à confiance ultime:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Rien ne dit que la clé appartient vraiment à l'utilisateur\n"
+"nommé.\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Il n'est pas vraiment sûr que la clé appartient vraiment\n"
+"à l'utilisateur nommé.\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Cette clé appartient probablement à l'utilisateur nommé\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Cette clé nous appartient\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Il n'est PAS certain que la clé appartient à la personne nomée dans\n"
+"le nom d'utilisateur. Si vous savez *vraiment* ce que vous faites,\n"
+"vous pouvez répondre oui à la prochaine question.\n"
+"\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Utiliser cette clé quand même ? (o/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ATTENTION: Utilisation d'une clé sans confiance !\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"AVERTISSEMENT: cette clé est peut-être révoquée (clé de révocation\n"
+"absente)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVERTISSEMENT: Cette clé à été révoquée par son révocateur désigné !\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ATTENTION: Cette clé à été révoquée par son propriétaire !\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "           Cela pourrait signifier que la signature est fausse.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "ATTENTION: Cette sous-clé à été révoquée par son propriétaire !\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Note: cette clé a été désactivée.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Note: Cette clé a expiré !\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"ATTENTION: Cette clé n'est pas certifiée avec une signature de confiance !\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"           Rien ne dit que la signature appartient à son propriétaire.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ATTENTION: Nous ne faisons PAS confiance à cette clé !\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "           La signature est certainement FAUSSE.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"ATTENTION: Les signatures de cette clé n'ont pas une confiance suffisante !\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr ""
+"            Il n'est pas sûr que la signature appartient à son "
+"propriétaire.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ignoré: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ignoré: clé publique déjà présente\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr ""
+"Vous n'avez pas spécifié de nom d'utilisateur. (vous pouvez\n"
+"utiliser «-r»)\n"
+"\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Récipients actuels:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Entrez le nom d'utilisateur, en terminant par une ligne vide: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Pas d'utilisateur de ce nom.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "ignoré: la clé publique est déjà le destinataire par défaut\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "La clé publique est désactivée.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "ignoré: clé publique déjà activée\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "destinataire par défaut « %s » inconnu\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: ignoré: la clé publique est désactivée\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "pas de destinataire valide\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+"les données ne sont pas enregistrées; utilisez l'option «--output» pour\n"
+"les enregistrer\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "erreur pendant la création de `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Signature détachée.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Entrez le nom du fichier de données: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "lecture de l'entrée standard...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "pas de données signées\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "impossible d'ouvir les données signées `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinataire anonyme; essai de la clé secrète %s...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "d'accord, nous sommes le destinataire anonyme.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "l'ancien codage de la clé de chiffrement (DEK) n'est pas supporté\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "l'algorithme de chiffrement %d%s est inconnu ou désactivé\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+"AVERTISSEMENT: l'algorithme de chiffrement %s n'a pas été trouvé\n"
+"dans les préférences du destinataire\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTE: la clé secrète %s a expiré le %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTE: la clé a été révoquée"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet a échoué: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "clé %s: pas de nom d'utilisateur\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Doit être révoqué par:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(c'est une clé de révocation sensible)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Générer un certificat de révocation désignée pour cette clé ? (o/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "sortie avec armure ASCII forcée.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet a échoué: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Certificat de révocation créé.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "aucune clé de révocation trouvée pour « %s »\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "la clé secrète « %s » n'a pas été trouvée: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "pas de clé publique correspondante: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "la clé publique ne correspond pas à la clé secrète !\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Générer un certificat de révocation pour cette clé ? (o/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "algorithme de protection inconnu\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTE: Cette clé n'est pas protégée !\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Certificat de révocation créé.\n"
+"\n"
+"Déplacez-le dans un support que vous pouvez cacher ; si Mallory a\n"
+"accès à ce certificat il peut l'utiliser pour rendre votre clé\n"
+"inutilisable.\n"
+"Une bonne idée consiste à imprimer ce certificat puis à le stocker\n"
+"ailleurs, au cas où le support devient illisible. Mais attention :\n"
+"le système d'impression de votre machine pourrait stocker ces\n"
+"données et les rendre accessibles à d'autres personnes !\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "choisissez la cause de la révocation:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Annuler"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Vous devriez sûrement sélectionner %d ici)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Entrez une description optionnelle ; terminez-là par une ligne vide:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Cause de révocation: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Aucune description donnée)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Est-ce d'accord ? (o/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "les parties secrètes ne sont pas disponibles\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "l'algorithme de protection %d%s n'est pas supporté\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "le hachage de protection %d n'est pas supporté\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Phrase de passe invalide ; réessayez"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "ATTENTION: Clé faible détectée - changez encore la phrase de passe.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"génération de la somme de contrôle de 16 bits (dépréciée) pour protéger\n"
+"la clé secrète\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "clé faible générée - nouvel essai\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"impossible d'éviter une clé faible pour le chiffrement symétrique:\n"
+"%d essais ont eu lieu !\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "AVERTISSEMENT: conflit de hachage de signature dans le message\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+"AVERTISSEMENT: la sous-clé de signature %s n'a pas de certificat\n"
+"croisé\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"AVERTISSEMENT: la sous-clé de signature %s a un certificat croisé\n"
+"invalide\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "la clé publique %s est plus récente de %lu seconde que la signature\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "la clé publique %s est plus récente de %lu secondes que la signature\n"
+
+# on s'amuse comme on peut...
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"la clé %s a été créée %lu seconde dans le futur (rupture\n"
+"spatio-temporelle ou problème d'horloge)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"la clé %s a été créée %lu secondes dans le futur (rupture\n"
+"spatio-temporelle ou problème d'horloge)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTE: la clé de signature %s a expiré le %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"la signature de la clé %s est supposée être fausse car un bit\n"
+"critique est inconnu\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "clé %s: pas de sous-clé pour la signature de révocation de sous-clé\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+"clé %s: pas de sous-clé pour la signature de liaison à la\n"
+"sous-clé\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"impossible de mettre des données de notation dans des signatures v3\n"
+"(de style PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"impossible de mettres des données de notation dans des signatures de\n"
+"clés v3 (de style PGP 2.x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVERTISSEMENT: impossible de faire une expansion à base de %%\n"
+"(chaîne trop grande). Utilisation de la version non expansée.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"impossible de mettre une URL de politique dans des signatures v3\n"
+"(de style PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"impossible de mettre une URL de politique dans des signatures de clé v3\n"
+"(de style PGP 2.x)\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"AVERTISSEMENT: impossible de faire une expansion à base de %% de l'URL\n"
+"de politique (trop grande). Utilisation de la version non expansée.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"AVERTISSEMENT: impossible de faire une expansion à base de %% de l'URL\n"
+"de politique (trop grande). Utilisation de la version non expansée.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "Impossible de vérifier la signature créée: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s signature de: « %s »\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"il n'est possible générer une signature détachée avec des clés de\n"
+"style PGP 2.x qu'en mode --pgp2\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"AVERTISSEMENT: forcer l'algorithme de hachage %s (%d) entre en\n"
+"désaccord avec les préférences du destinataire\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "signature:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"il n'est possible de faire une signature en texte clair avec des clés\n"
+"de style PGP 2.x qu'en mode --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "le chiffrement %s sera utilisé\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"la clé n'est pas marquée comme non-sûre; on ne peut pas l'utiliser avec le\n"
+"pseudo-générateur de nombres aléatiores !\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "« %s » a été ignoré: dupliqué\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "« %s » a été ignoré: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "ignoré: clé secrète déjà présente\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"c'est une clé ElGamal générée par PGP qui n'est pas sûre pour\n"
+"les signatures !"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "enregistrement de confiance %lu, type %d: l'écriture a échoué: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Liste des valeurs de confiance assignées, créée le %s\n"
+"# (Utilisez « gpg --import-ownertrust » pour les restaurer)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "erreur dans `%s': %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "ligne trop longue"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "symbole deux-points manquant"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "empreinte invalide"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "valeur de confiance au propriétaire manquante"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr ""
+"erreur pendant la recherche de l'enregistrement de confiance\n"
+"dans `%s': %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "erreur de lecture dans `%s': %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "base de confiance: la synchronisation a échoué: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "enregistrement de base de confiance %lu: lseek a échoué: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+"enregistrement de la base de confiance %lu: l'écriture a échoué (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transaction de base de confiance trop volumineuse\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "impossible d'accéder à `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: le répertoire n'existe pas !\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "impossible de créer un verrou pour `%s'\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "impossible de verrouiller `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: impossible de créer un enregistrement de version: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: base de confiance invalide créée\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: base de confiance créée\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTE: la base de confiance n'a pas les permissions d'écriture\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: base de confiance invalide\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: la création de la table de hachage a échoué: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: erreur pendant la mise à jour de l'enregistrement de version: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: erreur pendant la lecture de l'enregistrement de version: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: erreur pendant l'écriture de l'enregistrement de version: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "base de confiance: «lseek()» a échoué: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "base de confiance: la lecture a échoué (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: ce n'est pas un fichier de base de confiance\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: enregistrement de version avec un numéro %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: version %d du fichier invalide\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: erreur pendant la lecture de l'enregistrement libre: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr ""
+"%s: erreur pendant l'écriture de l'enregistrement de\n"
+"répertoire: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: n'a pu mettre un enregistrement à zéro: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: impossible d'ajouter un enregistrement: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "la base de confiance est corrompue; exécutez «gpg --fix-trustdb».\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "impossible de traiter les lignes plus longues que %d caractères\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "la ligne d'entrée est plus longue que %d caractères\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' n'est pas une identification de clé longue valide\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "clé %s: acceptée comme clé de confiance.\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "la clé %s apparaît plusieurs fois dans la base de confiance\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "clé %s: pas de clé publique pour la clé de confiance - ignorée\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "clé %s marquée comme ayant une confiance ultime.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr ""
+"enregistrement de confiance %lu, type de requête %d: la lecture a échoué: %"
+"s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "l'enregistrement de confiance %lu: n'est pas du type demandé %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+"impossible d'utiliser ce modèle de confiance inconnu (%d) -\n"
+"on utilise à la place le modèle de confiance %s\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "utilisation du modèle de confiance %s\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "11 le traducteur a bien lu ce qu'il fallait :)"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ revoquée]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[ expirée ]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[ inconnue]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[indéfinie]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[marginale]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[ entière ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[  ultime ]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "indéfinie"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "jamais"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "marginale"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "entière"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "ultime"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "vérification de la base de confiance inutile\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "la prochaine vérification de la base de confiance aura lieu le %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+"vérification de la base de confiance inutile avec le modèle de\n"
+"confiance `%s'\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+"mise à jour de la base de confiance inutile avec le modèle de\n"
+"confiance `%s'\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "clé publique %s non trouvée : %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "faites un --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "vérifier la base de confiance\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d clés traitées (%d comptes de validité réinitialisés)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "aucune clé de confiance ultime n'a été trouvée\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "la clé publique de la clé de confiance ultime %s est introuvable\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+"%d marginale(s) nécessaires, %d complète(s) nécessaires, modèle\n"
+"de confiance %s\n"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"profondeur: %d  valide: %3d  signé: %3d\n"
+"confiance: %d-. %dg. %dn. %dm. %df. %du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"impossible de mettre à jour l'enregistrement de version de la\n"
+"base de confiance: l'écriture a échoué: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"impossible de vérifier la signature.\n"
+"Rappelez-vous bien que le fichier de signature (.sig ou .asc)\n"
+"doit être le premier fichier indiqué sur la ligne de commande.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr ""
+"la ligne d'entrée %u est trop longue ou il manque un caractère de saut\n"
+"de ligne\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "erreur générale"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "type de paquet inconnu"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "version inconnue"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algorithme à clé publique inconnu"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algorithme de hachage inconnu"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "mauvaise clé publique"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "mauvaise clé secrète"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "mauvaise signature"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "somme de contrôle erronée"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "mauvaise phrase de passe"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "clé publique non trouvée"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algorithme de chiffrement inconnu"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "impossible d'ouvrir le porte-clés"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "paquet invalide"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armure invalide"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "pas d'utilisateur de ce nom"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "la clé secrète n'est pas disponible"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "mauvaise clé secrète utilisée"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "non supporté"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "mauvaise clé"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "erreur de lecture"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "erreur d'écriture"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algorithme de compression inconnu"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "erreur d'ouverture de fichier"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "erreur de création de fichier"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "phrase de passe invalide"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algorithme à clé publique non implanté"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algorithme de chiffrement non implanté"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "classe de signature inconnue"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "erreur dans la base de confiance"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "mauvais entier en précision multiple (MPI)"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "limite de ressources atteinte"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "porte-clés invalide"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "mauvais certificat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "nom d'utilisateur malformé"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "erreur de fermeture de fichier"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "erreur pendant le changement de nom du fichier"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "erreur pendant la suppression du fichier"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "données inattendues"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflit de dates"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algorithme de clés publiques inutilisable"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "le fichier existe"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "clé faible"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argument invalide"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "mauvaise adresse (URI)"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI non supportée"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "erreur de réseau"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "non chiffré"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "non traité"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "clé publique inutilisable"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "clé secrète inutilisable"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "erreur du serveur de clés"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "annulé"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "pas de carte"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "pas de données signées\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "ERREUR: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "AVERTISSEMENT: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... c'est un bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "vous avez trouvé un bug... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "oui"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "oO"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "non"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quitter"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "ok|ok"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "annuler|annuler"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "aA"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "AVERTISSEMENT: l'utilisation de la mémoire n'est pas sûre !\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "voir http://www.gnupg.org/fr/faq.html pour plus d'informations\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr ""
+"l'opération n'est pas possible tant que la mémoire sûre n'est pas\n"
+"initialisée\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(vous avez peut-être utilisé un programme non adapté à cette fin)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr ""
+#~ "DSA nécessite l'utilisation d'un algorithme de hachage de 160 bits\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "voir http://www.gnupg.org/fr/why-not-idea.html pour plus d'informations\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "le nom d'une notation ne doit comporter que des caractères imprimables\n"
+#~ "ou des espaces, et se terminer par un signe '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "un nom de notation utilisateur doit contenir le caractère '@'\n"
+
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr ""
+#~ "un nom de notation utilisateur ne doit pas plus d'un caractère '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr ""
+#~ "une valeur de notation ne doit utiliser aucun caractère de contrôle\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "ATTENTION: des données de notation invalides ont été détectées\n"
+
+#~ msgid "not human readable"
+#~ msgstr "illisible par un humain"
+
+#~ msgid "expired: %s)"
+#~ msgstr "expirée: %s)"
diff --git a/po/gl.gmo b/po/gl.gmo
new file mode 100644 (file)
index 0000000..b7b1b03
Binary files /dev/null and b/po/gl.gmo differ
diff --git a/po/gl.po b/po/gl.po
new file mode 100644 (file)
index 0000000..5e19f1b
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,7559 @@
+# Galician translation of GNUpg
+# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+# Jacobo Tarrio <jtarrio@trasno.net>, 2001, 2002, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.4\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2003-12-04 11:39+0100\n"
+"Last-Translator: Jacobo Tarrio <jtarrio@trasno.net>\n"
+"Language-Team: Galician <gpul-traduccion@ceu.fi.udc.es>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "non se pode xerar un número primo de menos de %d bits\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "non se pode xerar un número primo de menos de %d bits\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "non se detectou un módulo de acumulación de entropía\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "non se puido abrir `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "non se puido abrir `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "non se puido facer stat sobre `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' non é un ficheiro normal - ignórase\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "nota: o ficheiro random_seed está baleiro\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "AVISO: tamaño do ficheiro random_seed non válido - non se emprega\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "non se pode ler de `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "nota: o ficheiro random_seed non se actualiza\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "non se pode crear `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "non se pode escribir en `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "non se pode pechar `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "AVISO: ¡¡emprégase un xerador de números aleatorios inseguro!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"O xerador de números aleatorios só é un truco para poder\n"
+"executalo - ¡non é de ningún xeito un xerador de números\n"
+"aleatorios seguro!\n"
+"\n"
+"¡NON USE NINGUN DATO XERADO POR ESTE PROGRAMA!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Agarde, por favor; estase a colleitar entropía. Traballe un\n"
+"pouco se iso evita que se aburra, que iso ha aumenta-la\n"
+"calidade da entropía.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Non hai suficientes bytes aleatorios dispoñibles. Por favor, faga outro\n"
+"traballo para lle dar ao sistema operativo unha oportunidade de acumular\n"
+"máis entropía (Precísanse %d bytes máis)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "non se puido inicializa-la base de datos de confianzas: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "fallo ao reconstruí-la caché de chaveiros: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "fallou o borrado do bloque de chaves: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "o envío ao servidor de chaves fallou: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "erro ao crea-lo contrasinal: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "erro ao le-lo bloque de chaves: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: erro ao ler un rexistro libre: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' xa está comprimido\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "xerar un novo par de chaves"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "non se puido inicializa-la base de datos de confianzas: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "fallou o borrado do bloque de chaves: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "A xeración da chave fallou: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "Sinatura %s, algoritmo de resumo %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "non se atoparon datos OpenPGP válidos.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armadura: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "cabeceira de armadura non válida: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "cabeceira de armadura: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "cabeceira de sinatura en claro non válida\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "sinaturas en texto claro aniñadas\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "armadura inesperada:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "liña escapada cunha barra non válida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "carácter radix64 non válido %02x omitido\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "fin de ficheiro prematura (non hai CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "fin de ficheiro prematura (no CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC mal formado\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "Erro de CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "fin de ficheiro prematura (nas liñas adicionais)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "error nunha liña adicional\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "non se atoparon datos OpenPGP válidos.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armadura incorrecta: liña máis longa ca %d caracteres\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"carácter quoted-printable na armadura - seguramente empregouse un MTA con "
+"erros\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "a chave secreta non está dispoñible"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "non se pode facer iso no modo por lotes\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "¿A súa selección? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Non se especificou un motivo"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "non procesado"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "non hai unha chave pública correspondente: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "erro lendo `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "preferencias actualizadas"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "caracter non válido na cadea de preferencias\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "caracter non válido na cadea de preferencias\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "erro: pegada dactilar non válida\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "Pegada dactilar:"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "erro: pegada dactilar non válida\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "A xeración da chave fallou: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "non se atoparon datos OpenPGP válidos.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "erro escribindo no chaveiro secreto `%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Por favor, seleccione o tipo de chave que quere:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "A sinatura caducou o %s\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (só cifrar)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Selección non válida.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Por favor, escolla o motivo da revocación:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "algoritmo de protección descoñecido\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "as partes secretas da chave primaria non están dispoñibles.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "omítese: a chave secreta xa está presente\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "saír deste menú"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "comandos conflictivos\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "amosar esta axuda"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Chave dispoñible en: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "cambia-la fecha de expiración"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "cambia-la confianza sobre o dono"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "amosar fingerprint"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "xerar un novo par de chaves"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Comando> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "comandos conflictivos\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "comandos conflictivos\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Comando incorrecto (tente \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "a chave secreta non está dispoñible"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "fallou o borrado do bloque de chaves: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Introduza o ID de usuario: "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "Introduza o ID de usuario: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+#, fuzzy
+msgid "Enter PIN: "
+msgstr "Introduza o ID de usuario: "
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Repita o contrasinal: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "o contrasinal non se repetiu correctamente; ténteo de novo"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "non se puido abrir `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output non traballa con este comando\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "non se atopou a chave `%s': %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "erro ao le-lo bloque de chaves: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(a menos que especifique a chave por pegada dactilar)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr ""
+"iso non se pode facer no modo de procesamento por lotes sen \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "¿Borrar esta chave do chaveiro? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "¡Esta é unha chave secreta! - ¿está seguro de que quere borrala? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "fallou o borrado do bloque de chaves: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "borrouse a información de confianza\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "¡hai unha chave secreta para a chave pública \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "empregue a opción \"--delete-secret-keys\" para borrala primeiro.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "erro ao crea-lo contrasinal: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "non se pode empregar un paquete simétrico ESK debido ao modo S2K\n"
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "fallou a sinatura: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' xa está comprimido\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVISO: `%s' é un ficheiro baleiro\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "só pode cifrar a chaves RSA de 2048 bits ou menos en modo --pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "lendo de `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"non se puido emprega-la cifra IDEA para tódalas chaves ás que está a "
+"cifrar.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forza-la cifra simétrica %s (%d) viola as preferencias do destinatario\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"forza-lo algoritmo de compresión %s (%d) viola as preferencias do "
+"destinatario\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forza-la cifra simétrica %s (%d) viola as preferencias do destinatario\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "non se pode empregar %s no modo %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s cifrado para: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "datos cifrados con %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "cifrado cun algoritmo descoñecido %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "AVISO: cifrouse a mensaxe cunha chave feble no cifrado simétrico.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problema ao manexa-lo paquete cifrado\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "non se soporta a execución remota de programas\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "non se pode crea-lo directorio `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"as chamadas a programas externos están desactivadas debido a opcións de "
+"permisos de ficheiros non seguras\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"esta plataforma precisa de ficheiros temporais ao chamar a programas "
+"externos\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "non se puido executar %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "non se puido executar %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "erro do sistema ao chamar a un programa externo: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "saída non natural do programa externo\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "non se puido executar un programa externo\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "non se puido le-la resposta do programa externo: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "AVISO: non se puido borra-lo ficheiro temporal (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "AVISO: non se puido elimina-lo directorio temporal `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"A sinatura hase marcar coma non revocable.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "non se atoparon chaves de revocación para `%s'\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revocar unha chave secundaria"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "chave secreta non utilizable"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "chave %08lX: non está protexida - omitida\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "chave %08lX: chave estilo PGP 2.x - omitida\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "chave %08lX: sinatura da sub-chave nun lugar incorrecto - omitida\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "non se puido inicializa-la base de datos de confianzas: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+"AVISO: a chave secreta %08lX non ten unha suma de comprobación SK simple\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "AVISO: non se exportou nada\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Comandos:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[ficheiro]|facer unha sinatura"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[ficheiro]|facer unha sinatura en texto claro"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "facer unha sinatura separada"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "cifrar datos"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "cifrar só con cifrado simétrico"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "descifrar datos (por defecto)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verificar unha sinatura"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "ve-la lista de chaves"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "ve-la lista de chaves e sinaturas"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "verifica-las sinaturas das chaves"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "ve-la lista de chaves e pegadas dactilares"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "ve-la lista de chaves secretas"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "xerar un novo par de chaves"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "borrar chaves do chaveiro público"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "borrar chaves do chaveiro secreto"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "asinar unha chave"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "asinar unha chave localmente"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "asinar ou editar unha chave"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "xerar un certificado de revocación"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportar chaves"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportar chaves a un servidor de chaves"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importar chaves dun servidor de chaves"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "buscar chaves nun servidor de chaves"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "actualizar tódalas chaves dun servidor de chaves"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importar/mesturar chaves"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "actualiza-la base de datos de confianza"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [ficheiros]|visualizar resumos de mensaxes"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opcións:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "crear saída con armadura en ascii"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOME|cifrar para NOME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "empregar este id de usuario para asinar ou descifrar"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|axusta-lo nivel de compresión a N (0 desactiva)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "usar modo de texto canónico"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "usar coma ficheiro de saída"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "lareto"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "non facer ningún cambio"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "avisar antes de sobrescribir"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Vexa a páxina man para un listado completo de comandos e opcións)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exemplos:\n"
+"\n"
+" -se -r Bob [ficheiro]      asinar e cifrar para o usuario Bob\n"
+" --clearsgn [ficheiro]      facer unha sinatura en texto claro\n"
+" --detach-sign [ficheiro]   facer unha sinatura separada\n"
+" --list-keys [nomes]        amosa-las chaves\n"
+" --fingerprint [nomes]      amosa-las pegadas dactilares\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Por favor, informe dos erros no programa a <gnupg-bugs@gnu.org>,\n"
+"e dos erros na traducción a <proxecto@trasno.net>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Uso: gpg [opcións] [ficheiros] (-h para ve-la axuda)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaxe: gpg [opcións] [ficheiros]\n"
+"asinar, verificar, cifrar ou descifrar\n"
+"a operación por defecto depende dos datos de entrada\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmos soportados:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Pública: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cifra: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compresión: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "uso: gpg [opcións] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "comandos conflictivos\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "non se atopou un signo = na definición do grupo \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "AVISO: propiedade insegura en %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "AVISO: propiedade insegura en %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "AVISO: propiedade insegura en %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "AVISO: permisos inseguros en %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "AVISO: permisos inseguros en %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "AVISO: permisos inseguros en %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "AVISO: propiedade do directorio contedor insegura en %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "AVISO: propiedade do directorio contedor insegura en %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "AVISO: propiedade do directorio contedor insegura en %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "AVISO: permisos do directorio contedor inseguros en %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "AVISO: permisos do directorio contedor inseguros en %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "AVISO: permisos do directorio contedor inseguros en %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr " creouse un novo ficheiro de configuración `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Non hai unha sinatura correspondiente no chaveiro secreto\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "o URL de normativa de sinaturas dado non é válido\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "amosar en que chaveiro está unha chave listada"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Non hai unha sinatura correspondiente no chaveiro secreto\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTA: ignórase o antigo ficheiro de opcións por defecto `%s'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTA: non existe o ficheiro de opcións por defecto `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "ficheiro de opcións `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "lendo as opcións de `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTA: ¡%s non é para uso normal!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"non se cargou a extensión de cifrado \"%s\" debido a permisos inseguros\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s non é un xogo de caracteres válido\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s non é un xogo de caracteres válido\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "non se puido analisa-lo URI do servidor de chaves\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opcións de importación non válidas\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opcións de importación non válidas\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: opcións de importación non válidas\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "opcións de importación non válidas\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s non é un xogo de caracteres válido\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "o URL de normativa de sinaturas dado non é válido\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s non é un xogo de caracteres válido\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "non se puido estabrecer exec-path a %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: opcións de exportación non válidas\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "AVISO: ¡o programa pode crear un ficheiro 'core'!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "AVISO: %s fai que se ignore %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "¡%s non se admite con %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "¡%s non ten sentido empregándoo con %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent non está dispoñible nesta sesión\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "só pode crear sinaturas separadas ou en claro no modo --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "non pode asinar e cifrar ao mesmo tempo no modo --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"debe empregar ficheiros (e non canalizacións) ao traballar con --pgp2 "
+"activado.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "para cifrar unha mensaxe en modo --pgp2 precísase da cifra IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "o algoritmo de cifrado seleccionado non é válido\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "o algoritmo de resumo seleccionado non é válido\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "o algoritmo de cifrado seleccionado non é válido\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "o algoritmo de resumo de certificación seleccionado non é válido\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed debe ser superior a 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed debe ser superior a 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth debe valer entre 1 e 255\n"
+
+#: g10/gpg.c:3025
+#, fuzzy
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "nivel de comprobación por defecto non válido; debe ser 0, 1, 2 ou 3\n"
+
+#: g10/gpg.c:3027
+#, fuzzy
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "nivel de comprobación por defecto non válido; debe ser 0, 1, 2 ou 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTA: desaconséllase encarecidamente o modo S2K simple (0)\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "modo S2K non válido; debe ser 0, 1 ou 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "preferencias por defecto non válidas\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "preferencias de cifrado personais non válidas\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "preferencias de resumo personais non válidas\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "preferencias de compresión personais non válidas\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "¡%s aínda non traballa con %s!\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "non se pode empregar o algoritmo de cifrado \"%s\" no modo %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "non se pode empregar o algoritmo de resumo \"%s\" no modo %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "non se pode empregar o algoritmo de compresión \"%s\" no modo %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "non se puido inicializa-la base de datos de confianzas: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"AVISO: deronse destinatarios (-r) sen empregar cifrado de chave pública\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [ficheiro]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [ficheiro]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "o descifrado fallou: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [ficheiro]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [ficheiro]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "non se pode empregar %s no modo %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [ficheiro]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [ficheiro]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [ficheiro]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "non se pode empregar %s no modo %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [ficheiro]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [ficheiro]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [ficheiro]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id-de-usuario"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id-de-usuario"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id-de-usuario [comandos]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id-de-usuario] [chaveiro]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "o envío ao servidor de chaves fallou: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "a recepción do servidor de chaves fallou: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "a exportación da chave fallou: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "a busca no servidor de chaves fallou fallou: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "a actualización no servidor de chaves fallou: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "non se puido quita-la armadura: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "non se puido poñe-la armadura: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritmo de hash non válido `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[ficheiro]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Escriba a súa mensaxe ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "o URL de normativa de certificación dado non é válido\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "o URL de normativa de sinaturas dado non é válido\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "o URL de normativa de sinaturas dado non é válido\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "demasiadas entradas na caché de chaves públicas - desactivada\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[Non se atopou o id de usuario]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Chave %08lX non válida convertida en válida por --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"non hai unha sub-chave secreta para a sub-chave pública %08lX - ignórase\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "emprégase a chave secundaria %08lX no canto da primaria %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "chave %08lX: chave secreta sen chave pública - omitida\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "ser un pouquiño máis calado"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "toma-las chaves deste chaveiro"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "converte-los conflictos de selo de data nun aviso"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|DF|escribi-la información de estado a este DF"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Uso: gpgv [opcións] [ficheiros] (-h para ve-la axuda)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintaxe: gpg [opcións] [ficheiros]\n"
+"Comproba as sinaturas contra chaves de confianza coñecidas\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"A asignación dun valor aquí é cousa súa; este valor nunca se ha exportar\n"
+"a ningún terceiro. Precísase para implementa-la rede de confianza; non ten\n"
+"nada que ver coa rede de certificados."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Para construí-la Rede-de-Confianza, GnuPG precisa saber que chaves teñen\n"
+"confianza absoluta - esas adoitan se-las chaves das que ten acceso á chave\n"
+"secreta. Responda \"si\" para lle dar confianza total a esta chave\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "Se desexa empregar esta clave na que non se confía, conteste \"si\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Introduza o ID de usuario da persoa á que lle quere manda-la mensaxe."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"En xeral non é unha boa idea emprega-la mesma chave para asinar e cifrar.\n"
+"Este algoritmo debería empregarse só en determinados dominios.\n"
+"Consulte antes co seu experto en seguridade."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Introduza o tamaño da chave"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Conteste \"si\" ou \"non\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Introduza o valor requerido tal como se amosa no indicativo.\n"
+"É posible introducir unha data ISO (AAA-MM-DD) pero non ha obter unha\n"
+"boa resposta de erro - no canto diso, o sistema ha tratar de interpreta-lo\n"
+"valor proporcionado coma se fora un intervalo."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Introduza o nome do propietario da chave"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "por favor, introduza un enderezo de e-mail (opcional pero recomendado)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Por favor, introduza un comentario (opcional)"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  para cambia-lo nome.\n"
+"C  para cambia-lo comentario.\n"
+"E  para cambia-lo enderezo de e-mail.\n"
+"O  para continuar coa xeración da chave.\n"
+"S  para saír da xeración da chave."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Conteste \"si\" (ou só \"s\") se é correcto xerar esta subchave."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Cando asina un ID de usuario dunha chave, debería comprobar antes\n"
+"que a chave pertence á persoa que aparece no identificador. É útil para os\n"
+"demais saber con canto tino comprobou isto.\n"
+"\n"
+"\"0\" significa que non di nada do coidado co que comprobou a chave.\n"
+"\n"
+"\"1\" significa que cre que a chave pertence á persoa que o afirma, pero "
+"non\n"
+"    puido ou non quixo verifica-la chave. É útil para verificacións de\n"
+"    \"personaxes\", nas que asina a chave dun usuario pseudónimo.\n"
+"\n"
+"\"2\" significa que fixo unha comprobación informal da chave. Por exemplo,\n"
+"    pode significar que comprobou a pegada dixital da chave e comprobou\n"
+"    a identidade do usuario na chave contra unha identificación "
+"fotográfica.\n"
+"\n"
+"\"3\" significa que fixo unha comprobación extensiva da chave. Por exemplo,\n"
+"    pode significar que comprobou a pegada dixital da chave co propietario\n"
+"    da chave en persoa, e que comprobou, cun documento difícil de "
+"falsificar\n"
+"    cunha identificación fotográfica (coma o carnet de identidade ou\n"
+"    pasaporte) que o nome do propietario da chave coincide co do "
+"identificador\n"
+"    de usuario da chave, e que comprobou (por intercambio de correo\n"
+"    electrónico) que o enderezo de e-mail da chave pertence ao propietario\n"
+"    da chave.\n"
+"\n"
+"Teña en conta que os exemplos de enriba para os niveis 2 e 3 son *só*\n"
+"exemplos. Á final, depende de vostede decidir que significan \"informal\" e\n"
+"\"extensivo\" ao asinar outras chaves.\n"
+"\n"
+"Se non sabe cal é a resposta correcta, resposte \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Conteste \"si\" se quere asinar TÓDOLOS IDs de usuario"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Conteste \"si\" se realmente desexa borrar este ID de usuario.\n"
+"¡Tamén se han perder tódolos certificados!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Conteste \"si\" se é correcto borrar esta subchave"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Esta é unha sinatura válida na chave; normalmente non ha borrar esta\n"
+"sinatura porque pode ser importante para estabrecer unha conexión de\n"
+"confianza na chave ou noutra chave certificada por esta chave."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Non se pode verificar esta sinatura porque non posúe a chave\n"
+"correspondente. Debería retrasa-lo borrado ata que saiba que chave\n"
+"se empregou porque esta chave de sinatura podería estabrecer unha\n"
+"conexión de confianza mediante outra chave xa certificada."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "A sinatura non é correcta. Ten sentido borrala do chaveiro."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Esta é unha sinatura que liga o ID de usuario á chave. Normalmente\n"
+"non é unha boa idea borrar unha sinatura como esta. De feito,\n"
+"GnuPG pode non ser capaz de usar máis esta chave. Así que faga isto\n"
+"só se esta auto-sinatura non é correcta por algun motivo e hai\n"
+"unha segunda á súa disposición."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Cambia-las preferencias de tódolos IDs de usuario (ou só dos seleccionados)\n"
+"á lista actual de preferencias. A marca de tempo de tódalas auto-sinaturas\n"
+"afectadas ha avanzar un segundo.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Por favor, introduza o contrasinal; esta é unha frase secreta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Por favor, repita o último contrasinal, para estar seguro do que tecleou."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Introduza o nome do ficheiro ao que corresponde a sinatura"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Conteste \"si\" se é correcto sobrescribi-lo ficheiro"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Por favor, introduza un novo nome de ficheiro. Se só preme ENTER, hase\n"
+"emprega-lo ficheiro por defecto (que se amosa entre corchetes)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Debería especificar un motivo para o certificado. Dependendo do contexto\n"
+"pode escoller desta lista:\n"
+"  \"Descobreuse a chave\"\n"
+"     Emprégueo se ten motivos para crer que algunha persoa non autorizada\n"
+"     obtivo acceso á súa chave secreta.\n"
+"  \"A chave é obsoleta\"\n"
+"     Emprégueo se cambiou esta chave cunha máis recente.\n"
+"  \"Xa non se emprega a chave\"\n"
+"     Emprégueo se retirou esta chave.\n"
+"  \"O ID de usuario xa non é válido\"\n"
+"     Emprégueo para indicar que o ID de usuario xa non se debería empregar;\n"
+"     adoita empregarse para marcar un enderezo de correo non válido.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Se quere, pode introducir un texto que describa por que emite este\n"
+"certificado de revocación. Por favor, manteña este texto breve.\n"
+"Unha liña en branco remata o texto.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Non hai axuda dispoñible"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Non hai axuda dispoñible para `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "actualiza-la base de datos de confianza"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "¡a chave pública con coincide coa chave secreta!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "chave secreta non utilizable"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "pasando por alto un bloque de tipo %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu chaves procesadas hasta polo momento\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Número total procesado: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "novas chaves omitidas: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "   sin IDs de usuario: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "           importadas: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "          sin cambios: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr " novos IDs de usuario: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "     novas sub-chaves: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "         novas sinaturas: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr " novas revocacións de chaves: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "chaves secretas lidas: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "chaves secretas importadas: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "chaves secretas sin cambios: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "       non importadas: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "         novas sinaturas: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "chaves secretas lidas: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Asinou estes IDs de usuario: \n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "Sinatura %s, algoritmo de resumo %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "chave %08lX: non hai ID de usuario\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "chave %08lX: arranxouse a corrupción da sub-chave HKP\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "chave %08lX: aceptouse o ID de usuario '%s' sen auto-sinatura\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "chave %08lX: non hai IDs de usuario válidos\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "isto pode ser causado por unha auto-sinatura que falta\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "chave %08lX: chave pública non atopada: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "chave %08lX: nova chave - omitida\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "non se atopou un chaveiro no que se poida escribir: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "escribindo a `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "erro escribindo no chaveiro `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "chave %08lX: chave pública \"%s\" importada\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "chave %08lX: non coincide coa nosa copia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr ""
+"chave %08lX: non foi posible localiza-lo bloque de chaves original:\n"
+"%s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr ""
+"chave %08lX: non foi posible le-lo bloque de chaves original:\n"
+"%s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "chave %08lX: \"%s\" 1 novo ID de usuario\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "chave %08lX: \"%s\" %d novos IDs de usuario\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "chave %08lX: \"%s\" 1 nova sinatura\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "chave %08lX: \"%s\" %d novas sinaturas\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "chave %08lX: \"%s\" 1 nova sub-chave\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "chave %08lX: \"%s\" %d novas sub-chaves\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novas sinaturas\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novas sinaturas\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novos IDs de usuario\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novos IDs de usuario\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "chave %08lX: \"%s\" sen cambios\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "chave %08lX: chave secreta cunha cifra %d non válida - omitida\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "non hai un chaveiro privado por defecto: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "chave %08lX: chave secreta importada\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "chave %08lX: xa estaba no chaveiro secreto\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "chave %08lX: chave secreta non atopada: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"chave %08lX: non hai chave pública - non se pode aplica-lo\n"
+"certificado de revocación\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr ""
+"chave %08lX: certificado de revocación incorrecto:\n"
+"%s - rechazado\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "chave %08lX: \"%s\" certificado de revocación importado\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "chave %08lX: non hai ID de usuario para a sinatura\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"chave %08lX: algoritmo de chave pública non soportado no ID de usuario \"%s"
+"\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr ""
+"chave %08lX: auto-sinatura non válida no identificadr de usuario \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "chave %08lX: non hai sub-chave para a ligazón da chave\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "chave %08lX: algoritmo de chave pública non soportado\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "chave %08lX: ligazón de sub-chave incorrecta\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "chave %08lX: eliminouse unha ligazón de sub-chave múltiple\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "chave %08lX: non hai unha sub-chave para a revocación da chave\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "chave %08lX: revocación de sub-chave non válida\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "chave %08lX: eliminouse a revocación de sub-chaves múltiples\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "chave %08lX: omitido o ID de usuario '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "chave %08lX: omitida a sub-chave\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "chave %08lX: sinatura non exportable (clase %02x) - omitida\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "chave %08lX: certificado de revocación no lugar erróneo - omitido\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "chave %08lX: certificado de revocación incorrecto: %s - omitido\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "chave %08lX: sinatura da sub-chave nun lugar incorrecto - omitida\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "chave %08lX: clase de sinatura non esperada (0x%02X) - omitida\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "chave %08lX: ID de usuario duplicado detectado - mesturado\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"AVISO: a chave %08lX pode estar revocada: obtendo a chave de revocación %"
+"08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"AVISO: a chave %08lX pode estar revocada: chave de revocación %08lX "
+"ausente.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "chave %08lX: \"%s\" certificado de revocación engadido\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "chave %08lX: engadiuse unha sinatura de chave directa\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "¡a chave pública con coincide coa chave secreta!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "omítese: a chave secreta xa está presente\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "omítese: a chave secreta xa está presente\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "erro ao crea-lo chaveiro `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "chaveiro `%s' creado\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "erro ao crear `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "fallo ao reconstruí-la caché de chaveiros: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revocación]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[auto-sinatura]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 sinatura errónea\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d sinaturas erróneas\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 sinatura non verificada debido a unha chave que falta\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d sinaturas non verificadas debido a chaves que faltan\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 sinatura non verificada debido a un erro\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d sinaturas non verificadas debido a erros\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "detectado 1 ID de usuario sin auto-sinatura válida\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "detectados %d IDs de usuario sin auto-sinatura válida\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Por favor, decida canto confía en que este usuario verifique\n"
+"correctamente as chaves de outros usuarios (mirando nos pasaportes,\n"
+"comprobando pegadas dactilares de varias fontes...).\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Confío marxinalmente\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Confío totalmente\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "O ID de usuario \"%s\" está revocado."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "¿Está seguro de que quere asinalo? (s/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr " Non se puido asinar.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "O ID de usuario \"%s\" está caducado."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "O ID de usuario \"%s\" non está asinado por el mesmo."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "O ID de usuario \"%s\" non está asinado por el mesmo."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "¿Asinar de verdade? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"A auto-sinatura de \"%s\"\n"
+"é unha sinatura tipo PGP 2.x\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "¿Quere promovela a unha auto-sinatura OpenPGP? (s/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"A súa sinatura actual en \"%s\"\n"
+"caducou.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "¿Quere emitir unha nova sinatura que substitúa á caducada? (s/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"A súa sinatura actual en \"%s\"\n"
+"é unha sinatura local.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "¿Quere promovela a sinatura totalmente exportable? (s/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" xa estaba asinado localmente coa chave %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" xa estaba asinado coa chave %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "¿Quere asinalo outra vez de tódolos xeitos? (s/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nada que asinar coa chave %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "¡Esta chave caducou!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Esta chave ha caducar o %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "¿Quere que a súa sinatura caduque ao mesmo tempo? (S/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Non pode facer unha sinatura OpenPGP nunha chave PGP 2.x no modo --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Isto podería face-la chave non utilizable en PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"¿Con canto tino comprobou que a chave que vai asinar realmente pertence á\n"
+"persoa de enriba? Se non sabe que respostar, introduza \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Non hei respostar.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Non o comprobei en absoluto.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Fixen algunhas comprobacións.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Fixen comprobacións moi exhaustivas.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "¿A súa elección? (introduza '?' para ter máis información): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"¿Esta seguro de que quere asinar esta chave\n"
+"coa súa chave: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Esta ha ser unha auto-sinatura.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"AVISO: a sinatura non se ha marcar coma non exportable.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"AVISO: A sinatura non se ha marcar coma non revocable.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"A sinatura hase marcar coma non exportable.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"A sinatura hase marcar coma non revocable.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Non se comprobou esta chave en absoluto.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Comprobouse esta chave de xeito informal.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Comprobouse esta chave con moito tino.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "¿Asinar de verdade? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "fallou a sinatura: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Esta chave non está protexida.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "as partes secretas da chave primaria non están dispoñibles.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "as partes secretas da chave primaria non están dispoñibles.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "A chave está protexida.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Non se pode editar esta chave: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Introduza o novo contrasinal para esta chave secreta.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "o contrasinal non se repetiu correctamente; ténteo de novo"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Non desexa un contrainal - ¡o que é unha *mala* idea!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "¿Seguro que quere facer esto? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "movendo a sinatura dunha chave ó seu sitio\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "gardar e saír"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "amosar fingerprint"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "listar chave e IDs de usuario"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "selecciona-lo ID de usuario N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "selecciona-lo ID de usuario N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revocar sinaturas"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "asina-la chave localmente"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Pista: seleccione os IDs de usuario que desexa asinar\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "engadir un ID de usuario"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "engadir unha identificación fotográfica"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "borrar un ID de usuario"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "borrar unha chave secundaria"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "engadir unha chave de revocación"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"¿Seguro que quere actualiza-las preferencias dos IDs de usuario "
+"seleccionados? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Non pode cambia-la data de expiración dunha chave v3\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "marcar un ID de usuario coma primario"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "cambiar entre o listado de chaves públicas e secretas"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "lista-las preferencias (expertos)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "lista-las preferencias (moitos datos)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"¿Seguro que quere actualiza-las preferencias dos IDs de usuario "
+"seleccionados? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "non se puido analisa-lo URI do servidor de chaves\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"¿Seguro que quere actualiza-las preferencias dos IDs de usuario "
+"seleccionados? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "cambia-lo contrasinal"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "cambia-la confianza sobre o dono"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "¿Seguro de que quere revocar tódolos IDs de usuario seleccionados? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "revocar un ID de usuario"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revocar unha chave secundaria"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "habilitar unha chave"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "deshabilitar unha chave"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "amosa-la identificación fotográfica"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "erro ao le-lo bloque de chave secreta `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "A chave secreta está disponible.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Cómpre a chave secreta para facer isto.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Por favor, empregue o comando \"toggle\" antes.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "A chave está revocada."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "¿Seguro de que quere asinar tódolos IDs de usuario? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Pista: seleccione os IDs de usuario que desexa asinar\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "clase de sinatura descoñecida"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Non se admite este comando no modo %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Debe seleccionar alomenos un ID de usuario.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "¡Non pode borra-lo último ID de usuario!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "¿Seguro de que quere borrar tódolos IDs de usuario seleccionados? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "¿Seguro de que quere borrar este ID de usuario? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "¿Seguro de que quere borrar este ID de usuario? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Debe seleccionar alomenos unha chave.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "non se puido abrir `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "erro ao crea-lo chaveiro `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Debe seleccionar alomenos unha chave.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "¿Seguro de que quere borra-las chaves seleccionadas? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "¿Seguro de que quere borrar esta chave? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "¿Seguro de que quere revocar tódolos IDs de usuario seleccionados? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "¿Seguro de que quere revocar este ID de usuario? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "¿Realmente quere revocar esta chave? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "¿Realmente quere revoca-las chaves seleccionadas? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "¿Realmente quere revocar esta chave? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "estabrece-la lista de preferencias"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"¿Seguro que quere actualiza-las preferencias dos IDs de usuario "
+"seleccionados? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "¿Realmente desexa actualiza-las preferencias? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "¿Garda-los cambios? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "¿Saír sin gardar? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "a actualización fallou: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "o segredo da actualización fallou: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "A chave non cambiou, polo que non fai falla actualizar.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Resumo: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Características: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notación: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Non hai preferencias nun ID de usuario estilo PGP 2.x.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Esta chave pode estar revocada por %s chave "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Esta chave pode estar revocada por %s chave "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (sensible)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "non foi posible crear %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[revocada] "
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [caduca: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [caduca: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " confianza: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " confianza: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Esta chave está desactivada"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Teña en conta que a validez da chave amosada non é necesariamente\n"
+"correcta a menos que reinicie o programa.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[revocada] "
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"AVISO: non se marcou ningún ID de usuario coma primario. Esta orde pode\n"
+"              facer que un ID de usuario diferente se converta no primario.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"AVISO: Esta é unha chave de estilo PGP2. Se engade unha identificación\n"
+"       fotográfica algunhas versións de PGP han rexeitar esta chave.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "¿Está seguro de que quere engadila? (s/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+"Non pode engadir unha identificación fotográfica a unha chave de estilo "
+"PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "¿Borrar esta sinatura correcta? (s/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "¿Borrar esta sinatura incorrecta? (s/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "¿Borrar esta sinatura descoñecida? (s/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "¿Realmente quere borrar esta auto-sinatura? (s/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Borrada %d sinatura.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Borradas %d sinaturas.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Non se borrou nada.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "armadura non válida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "O ID de usuario \"%s\" está revocado."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "O ID de usuario \"%s\" está revocado."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "O ID de usuario \"%s\" está revocado."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "o ID de usuario \"%s\" xa está revocado\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "o ID de usuario \"%s\" xa está revocado\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVISO: Esta é unha chave de estilo PGP 2.x. Se engade un revocador "
+"designado\n"
+"       pode facer que algunhas versións de PGP rexeiten esta chave.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"Non pode engadir un revocador designado a unha chave de estilo PGP 2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Introduza o ID de usuario do revocador designado: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"non se pode nomear unha chave estilo PGP 2.x coma revocador designado\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "non se pode nomear unha chave coma o seu propio revocador designado\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "AVISO: ¡Esta chave está revocada polo propietario!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"AVISO: ¡o nomeamento dunha chave coma o seu propio revocador designado non "
+"se pode desfacer!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"¿Está seguro de que quere nomear esta chave coma revocador designado? (s/N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Por favor, quite as seleccións das chaves secretas.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Por favor, seleccione como máximo unha chave secundaria.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Cambiando a data de expiración para a chave secundaria.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Cambiando a data de expiración da chave primaria.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Non pode cambia-la data de expiración dunha chave v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Non hai unha sinatura correspondiente no chaveiro secreto\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"AVISO: ¡o nomeamento dunha chave coma o seu propio revocador designado non "
+"se pode desfacer!\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Escolla exactamente un ID de usuario.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "omitindo a auto-sinatura v3 do id de usuario \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "¿Está seguro de que quere empregala (s/N)? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "¿Está seguro de que quere empregala (s/N)? "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notación de sinaturas: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "¿Sobrescribir? (s/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Non hai ID de usuario con índice %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Non hai ID de usuario con índice %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Non hai ID de usuario con índice %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID de usuario: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   asinada por %08lX no %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (non exportable)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Esta sinatura caducou o %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "¿Está seguro de que quere revocala? (s/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "¿Crear un certificado de revocación para esta sinatura? (s/N) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Asinou estes IDs de usuario: \n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (non exportable)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revocada por %08lX no %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Está a punto de revocar estas sinaturas:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "¿Realmente desexa crea-los certificados de revocación? (s/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "non hai chave secreta\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "o ID de usuario \"%s\" xa está revocado\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"AVISO: unha sinatura de ID de usuario ten unha data %d segundos no futuro\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "o ID de usuario \"%s\" xa está revocado\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "o ID de usuario \"%s\" xa está revocado\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Amosando a id. fotográfica %s de tamaño %ld da chave 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preferencia %c%lu duplicada\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "demasiadas preferencias `%c'\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "demasiadas preferencias `%c'\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "demasiadas preferencias `%c'\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "caracter non válido na cadea de preferencias\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "escribindo unha sinatura directa\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "escribindo a propia sinatura\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "escribindo unha sinatura que liga a chave\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "tamaño de chave non válido; empregando %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "tamaño de chave redondeado a %u bits\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "cifrar datos"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (só cifrar)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Por favor, seleccione o tipo de chave que quere:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA e ElGamal (por defecto)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (só asinar)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (só cifrar)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (só cifrar)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (só asinar)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (só cifrar)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (só cifrar)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "O par de chaves DSA ha ter 1024 bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "¿Qué tamaño de chave quere? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "O tamaño de chave requerido son %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "redondeado a %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Por favor, indique canto tempo debería ser válida a chave.\n"
+"         0 = a chave non caduca\n"
+"      <n>  = a chave caduca en n días\n"
+"      <n>w = a chave caduca en n semanas\n"
+"      <n>m = a chave caduca en n meses\n"
+"      <n>y = a chave caduca en n anos\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Por favor, indique canto tempo debería ser válida a sinatura.\n"
+"         0 = a sinatura non caduca\n"
+"      <n>  = a sinatura caduca en n días\n"
+"      <n>w = a sinatura caduca en n semanas\n"
+"      <n>m = a sinatura caduca en n meses\n"
+"      <n>y = a sinatura caduca en n anos\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "¿Por canto tempo é válida a chave? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "¿Por canto tempo é válida a sinatura? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valor non válido\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s non caduca nunca\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s non caduca nunca\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s caduca o %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "A sinatura caduca o %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"O seu sistema non pode amosar datas máis aló do 2038.\n"
+"Aínda así, hase tratar correctamente ata o 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "¿Isto é correcto? (s/n) "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Precisa un ID de usuario para identifica-la súa chave; o software constrúe "
+"o\n"
+"id de usuario co Nome, un Comentario e un Enderezo de E-mail deste xeito:\n"
+"     \"Heinrich Heime (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nome: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Caracter non válido no nome\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "O nome non pode comezar cun díxito\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "O nome debe ter alomenos 5 caracteres\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Enderezo de E-mail: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Non é un enderezo de e-mail válido\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comentario: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Carácter non válido no comentario\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Está a usa-lo xogo de caracteres `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Escolleu este ID de usuario:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Por favor, non poña o enderezo de correo no nome real ou no comentario\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeAaSs"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "¿Cambia-lo (N)ome, (C)omentario, (E)-mail ou (S)aír? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "¿Cambiar (N)ome, (C)omentario, (E)-mail ou (A)ceptar/(S)aír? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Por favor, corrixa antes o erro\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Cómpre xerar unha morea de bytes aleatorios. E unha boa idea facer outras\n"
+"cousas (premer teclas no teclado, move-lo rato, usa-los discos duros)\n"
+"mentres se xeran os números primos; isto proporciónalle ao xerador de\n"
+"números aleatorios unha opoertunidade de acumular entropía de abondo.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Cancelouse a xeración de chaves.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "gravando a chave pública en `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "gravando a chave secreta en `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "non se atopou un chaveiro público no que se poida escribir: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "non se atopou un chaveiro privado no que se poida escribir: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "erro escribindo no chaveiro público `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "erro escribindo no chaveiro secreto `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "creáronse e asináronse as chaves pública e secreta.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Teña en conta que non se pode empregar esta chave para cifrar. Pode que\n"
+"queira emprega-lo comando \"--edit-key\" para xerar unha chave secundaria\n"
+"con esa finalidade.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "A xeración da chave fallou: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"creouse a chave %lu segundo no futuro (salto no tempo ou problemas co "
+"reloxo)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"creouse a chave %lu segundos no futuro (salto no tempo ou problemas co "
+"reloxo)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTA: a creación de subchaves para chaves v3 non cumpre OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "¿Crear realmente? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "fallou o borrado do bloque de chaves: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "non se pode crear `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTA: a chave secreta %08lX caducou o %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "nunca     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Normativa de sinaturas críticas: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Normativa de sinaturas: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notación de sinaturas críticas: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notación de sinaturas: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Chaveiro"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Pegada dactilar da chave primaria:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Pegada dactilar da sub-chave:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "Pegada dactilar da chave primaria:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "     Pegada dactilar da sub-chave:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Pegada dactilar ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "non se puido poñe-la armadura: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "AVISO: existen dous ficheiros con información confidencial.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s é o que non cambiou\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s é o novo\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Por favor, amañe este posible fallo de seguridade\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "comprobando o chaveiro `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu chaves comprobadas (%lu sinaturas)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu chaves comprobadas (%lu sinaturas)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: chaveiro creado\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "o URL de normativa de sinaturas dado non é válido\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "AVISO: as opcións de `%s' aínda non están activas nesta execución\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "opcións de exportación non válidas\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "non se atopou a chave `%s': %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "non se atopou a chave `%s': %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "solicitando a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "solicitando a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "buscando \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "buscando \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "buscando \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"asinado coa súa chave %08lX no %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "buscando \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "buscando \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "opcións de exportación non válidas\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+"non hai un servidor de chaves coñecido (empregue a opción --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "erro do servidor de chaves"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "erro do servidor de chaves"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "a recepción do servidor de chaves fallou: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s: non é un ID de chave válido\n"
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "solicitando a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "solicitando a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "AVISO: non se puido borra-lo ficheiro temporal (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "AVISO: non se puido borra-lo ficheiro temporal (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "tamaño moi estraño para unha chave de sesión cifrada (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "chave de sesión cifrada con %s\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "cifrado cun algoritmo descoñecido %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "a chave pública é %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "datos cifrados coa chave pública: DEK correcto\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "cifrado cunha chave de %u bits, %s, ID %08lX, creado o %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "               alias \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "cifrado cunha chave %s, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "fallou o descifrado de chave pública: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "cifrado con %lu contrasinais\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "cifrado con 1 contrasinal\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "supoñendo datos cifrados con %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "A cifra IDEA non está dispoñible, téntase empregar %s no seu canto\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "descifrado correcto\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVISO: a mensaxe non tiña protección de integridade\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "AVISO: ¡a mensaxe cifrada foi manipulada!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "o descifrado fallou: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTA: o remitente pediu \"confidencial\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nome do ficheiro orixinal='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revocación independente - empregue \"gpg --import\" para aplicar\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Sinatura correcta de \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verificación de sinatura suprimida\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "non se poden manexar estas sinaturas múltiples\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "A sinatura caducou o %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "               alias \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Sinatura feita o %.*s usando %s coa chave de ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Chave dispoñible en: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Sinatura INCORRECTA de\""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Sinatura caducada de \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Sinatura correcta de \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[incerto]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "               alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "A sinatura caducou o %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "A sinatura caduca o %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "Sinatura %s, algoritmo de resumo %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binario"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "modo texto"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "descoñecido"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Non foi posible verifica-la sinatura: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "non é unha sinatura separada\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"AVISO: detectáronse sinaturas múltiples. Só se ha comproba-la primeira.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "sinatura independiente de clase 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "Sinatura ó vello estilo (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "paquete raíz incorrecto detectado en proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "non é posible deshabilita-los volcados de 'core': %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr ""
+"a actualización da base de datos de confianza fallou:\n"
+"%s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "base de datos de confianza: fallou a lectura (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "non é posible manexa-lo algoritmo de chave pública %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "algoritmo de cifrado non implementado"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "Sinatura %s, algoritmo de resumo %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"forza-lo algoritmo de resumo %s (%d) viola as preferencias do destinatario\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "o plugin de cifra IDEA non está presente\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = amosar máis información\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: opción a extinguir \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVISO: \"%s\" é unha opción a extinguir\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "empregue \"%s%s\" no seu canto\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "AVISO: \"%s\" é unha opción a extinguir\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Sen comprimir"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Sen comprimir"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "esta mensaxe pode non ser utilizable por %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "lendo as opcións de `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "destinatario por defecto `%s' descoñecido\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "O ficheiro `%s' xa existe. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "¿Sobrescribir? (s/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: sufixo descoñecido\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Introduza o novo nome de ficheiro"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "escribindo na saída estándar\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "suponse que hai datos asinados en `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr " creouse un novo ficheiro de configuración `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "AVISO: as opcións de `%s' aínda non están activas nesta execución\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: directorio creado\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "non é posible manexa-lo algoritmo de chave pública %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"AVISO: chave de sesión cifrada simetricamente potencialmente insegura\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "un subpaquete de tipo %d ten o bit crítico posto\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent non está dispoñible nesta sesión\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "variable de ambiente GPG_AGENT_INFO mal formada\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "a versión %d do protocolo de gpg-agent non está soportada\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "non se puido conectar a `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problema co axente - desactivando o emprego do axente\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (ID principal da chave %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Precisa un contrasinal para desbloquea-la chave secreta do usuario:\n"
+"\"%.*s\"\n"
+"Chave de %u bits, %s, ID %08lX, creada o %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repita o contrasinal\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Introduza o contrasinal\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "cancelado polo usuario\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "non se pode consulta-lo contrasinal en modo de proceso por lotes\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Introduza o contrasinal: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Necesita un contrasinal para desbloquea-la chave secreta para\n"
+"o usuario \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bits, chave %s, ID %08lX, creada %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repita o contrasinal: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Escolla unha imaxe a empregar coma identificación fotográfica. A imaxe ten\n"
+"que ser un ficheiro JPEG. Lembre que a imaxe armacénase coa súa chave\n"
+"pública. Se emprega unha imaxe moi grande, a súa chave tamén se ha volver\n"
+"moi grande. Un bo tamaño para empregar é un semellante a 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Introduza o nome do ficheiro JPEG: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "non se puido abrir un ficheiro: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "¿Está seguro de que quere empregala (s/N)? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" non é un ficheiro JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "¿É esta foto correcta (s/N/q)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "¡non se pode amosa-la identificación fotográfica!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Non se especificou un motivo"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "A chave é obsoleta"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Esta chave quedou descoberta"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Xa non se emprega esta chave"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "O ID de usuario xa non é válido"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "motivo para a revocación: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "comentario de revocación: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMsSoO"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Non se asignou un valor de confianza a:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "               alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Esta chave probablemente pertenza ao propietario\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Non sei\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = NON confío\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Confío absolutamente\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = voltar ao menú principal\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " o = omitir esta chave\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " s = saír\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "¿A súa decisión? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "¿Está seguro de querer dar confianza absoluta a esta chave? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificados que conducen a unha chave de confianza absoluta:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Non hai indicacións de que a sinatura pertenza ao seu propietario.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Non hai indicacións de que a sinatura pertenza ao seu propietario.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Esta chave probablemente pertenza ao propietario\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Esta chave perténcenos a nós\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NON é seguro que a chave pertenza á persoa indicada no ID de\n"
+"usuario. Se *de verdade* sabe o que está a facer, pode\n"
+"respostar á seguinte pregunta cun \"si\"\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "¿Empregar esta chave de tódolos xeitos?"
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "AVISO: ¡Emprégase unha chave que non é de confianza!\n"
+
+#: g10/pkclist.c:509
+#, fuzzy
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"AVISO: a chave %08lX pode estar revocada: chave de revocación %08lX "
+"ausente.\n"
+
+#: g10/pkclist.c:518
+#, fuzzy
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVISO: ¡Esta chave está revocada polo propietario!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "AVISO: ¡Esta chave está revocada polo propietario!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "       Isto pode significar que a sinatura está falsificada.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "AVISO: ¡Esta subchave está revocada polo propietario!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Nota: Esta chave está desactivada.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Nota: ¡Esta chave xa caducou!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "AVISO: ¡Esta chave non está certificada cunha sinatura de confianza!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"       Non hai indicacións de que a sinatura pertenza ao seu propietario.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "AVISO: ¡Esta chave NON é de confianza!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "       Probablemente, a sinatura estea FALSIFICADA.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"AVISO: ¡Esta chave non está certificada con sinaturas de suficiente "
+"confianza!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "       Non é seguro que a sinatura pertenza ao seu propietario.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: omitido: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: omitido: a chave pública xa está presente\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Non especificou un ID de usuario. (pode empregar \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Introduza o ID de usuario. Remate cunha liña en branco: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Non hai tal ID de usuario.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr ""
+"omitido: a chave pública xa está estabrecida coma destinatario por defecto\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "A chave pública está desactivada.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "omitido: chave pública xa estabrecida\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "destinatario por defecto `%s' descoñecido\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: omitido: a chave pública está desactivada\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "non hai enderezos válidos\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "erro ao crear `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Sinatura non adxunta.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Por favor, introduza o nome do ficheiro de datos: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "lendo de stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "non hai datos asinados\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "non foi posible abri-los datos asinados `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinatario anónimo; tentando a chave secreta %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "vale, nós somo-lo destinatario anónimo.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "a codificación vella do DEK non está soportada\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "o algoritmo de cifrado %d%s é descoñecido ou está desactivado\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "NOTA: o algoritmo de cifrado %d non foi atopado nas preferencias\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTA: a chave secreta %08lX caducou o %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTA: a chave está revocada"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "a chamada a build_packet fallou: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "chave %08lX: non hai ID de usuario\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Ha ser revocada por:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Esta é unha chave de revocación sensible)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "¿Crear un certificado de revocación para esta sinatura? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Forzouse unha saída con armadura ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "a chamada a make_keysig_packet fallou: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Creouse o certificado de revocación.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "non se atoparon chaves de revocación para `%s'\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "non se atopou a chave secreta `%s': %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "non hai unha chave pública correspondente: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "¡a chave pública con coincide coa chave secreta!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "¿Crear un certificado de revocación para esta sinatura? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "algoritmo de protección descoñecido\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTA: ¡Esta chave non está protexida!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Creouse o certificado de revocación.\n"
+"\n"
+"Por favor, trasládeo a un soporte que poida agochar; se Mallory consegue\n"
+"acceso a este certificado pode empregalo para inutiliza-la súa chave.\n"
+"É unha boa idea imprimir este certificado e armacenalo, por se o soporte\n"
+"se volve ilexible. Pero teña coidado: o sistema de impresión da súa\n"
+"máquina podería armacena-los datos e deixárllelos dispoñibles a outros.\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Por favor, escolla o motivo da revocación:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(probablemente queira seleccionar %d aquí)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Introduza unha descrición opcional; remátea cunha liña en branco:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Motivo para a revocación: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Non se deu unha descrición)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "¿É correcto? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "hai partes da chave secreta non dispoñibles\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "o algoritmo de protección %d%s non está soportado\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "o algoritmo de protección %d%s non está soportado\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Contrasinal non válido; por favor, ténteo de novo"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"AVISO: Detectouse unha chave feble - por favor, cambie o contrasinal outra "
+"vez.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"xerando o checksum de 16-bits a extinguir para a protección da chave "
+"secreta\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "creouse unha chave feble - volvendo a tentalo\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"non se pode evitar unha chave feble para o cifrado simétrico; tentouse %d "
+"veces\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "AVISO: conflicto de resumo de sinatura na mensaxe\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"AVISO: ¡o nomeamento dunha chave coma o seu propio revocador designado non "
+"se pode desfacer!\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"creouse a chave %lu segundo no futuro (salto no tempo ou problemas co "
+"reloxo)\n"
+
+#: g10/sig-check.c:195
+#, 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 "
+"reloxo)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTA: a chave de sinatura %08lX caducou o %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"asumindo unha sinatura incorrecta da chave %08lX debido a un bit crítico "
+"descoñecido\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+"chave %08lX: non hai unha sub-chave para o paquete de a revocación de "
+"subchave\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "chave %08lX: non hai sub-chave para a sinatura da ligazón da chave\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"non se pode poñer datos de notación nas sinaturas v3 (estilo PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"non se pode poñer datos de notación nas sinaturas de chave v3 (estilo PGP 2."
+"x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVISO: non se pode expandir-%% a notación (grande de máis). Úsase sen "
+"expandir.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"non se pode poñer un URL de política nas sinaturas v3 (estilo PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"non se pode poñer un URL de política nas sinaturas de chave v3 (estilo PGP 2."
+"x)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr "AVISO: non se pode expandir-%% o url de normativa (grande de máis).\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr "AVISO: non se pode expandir-%% o url de normativa (grande de máis).\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "fallou a comprobación da sinatura creada: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "Sinatura %s de: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"só pode asinar nun ficheiro separado con chaves estilo PGP 2.x no modo --"
+"pgp2\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"forza-lo algoritmo de resumo %s (%d) viola as preferencias do destinatario\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "asinando:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "só pode asinar en claro con chaves estilo PGP 2.x no modo --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "hase empregar cifrado %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"a chave non está marcada coma insegura - non se pode empregar co xerador de "
+"números aleatorios falso\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "omítese `%s': duplicada\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "omítese `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "omítese: a chave secreta xa está presente\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"omítese `%s': ¡esta é unha chave ElGamal xerada por PGP que non é segura "
+"para sinaturas!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "rexistro de confianza %lu, tipo %d: fallou a escritura: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Lista de valores de confianza asignados, creada o %s\n"
+"# (Empregue \"gpg --import-ownertrust\" para restauralos)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "erro lendo `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "liña longa de máis\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "erro: pegada dactilar non válida\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importa-los valores de confianza no propietario"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "erro ao buscar un rexistro de confianza: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "erro de lectura: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "base de datos de confianza: fallou a sincronización: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "rexistro da base de datos de confianza %lu: lseek fallou: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+"rexistro da base de datos de confianza %lu: fallou a escritura (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transacción da base de datos de confianza demasiado grande\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "non se pode pechar `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: ¡o directorio non existe!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "non se pode crear `%s': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "non se puido abrir `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: non se puido crea-lo rexistro de versión: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: creouse unha base de datos de confianza incorrecta\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: creouse a base de datos de confianza\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTA: non se pode escribir na base de datos de confianza\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: base de datos de confianza non válida\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: fallo ao crear unha táboa hash: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: erro ao actualiza-lo rexistro de versión: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: erro ao le-lo rexistro de versión: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: erro ao escribi-lo rexistro de versión: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "base de datos de confianza: lseek fallou: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "base de datos de confianza: fallou a lectura (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: non é un ficheiro de base de datos de confianza\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: rexistro de versión con número de rexistro %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versión do ficheiro incorrecta %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: erro ao ler un rexistro libre: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: erro ao escribi-lo rexistro de directorios: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: non se puido pór a cero un rexistro: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: non se puido engadir un rexistro: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"a base de datos de confianza está corrompida; execute \"gpg --fix-trustdb"
+"\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "non é posible manexar liñas de texto maiores que %d caracteres\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "a liña de entrada contén máis de %d caracteres\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' non é un ID longo de chave válido\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "chave %08lX: aceptada como chave de confianza\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "a chave %08lX aparece máis dunha vez na base de datos de confianza\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"chave %08lX: non hai unha chave pública para a chave de confianza - omitida\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "chave marcada coma de confianza absoluta.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "rexistro de confianza %lu, tipo da petición %d: fallou a lectura: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "o rexistro de confianza %lu non é do tipo %d solicitado\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[revocada] "
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[caducada ]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "descoñecido"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "nunca     "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "non se precisa comproba-la base de datos de confianza\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "hase comproba-la base de datos de confianza o %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "non se precisa comproba-la base de datos de confianza\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "non se precisa comproba-la base de datos de confianza\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "non se atopou a chave pública %08lX: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "por favor, execute con --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "comprobando a base de datos de confianza\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "procesáronse %d chaves (marcáronse %d contas de validez)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "non se atoparon chaves de confianza absoluta\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+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"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "rexistro de confianza %lu, tipo %d: fallou a escritura: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"non se puido verifica-la sinatura.\n"
+"Por favor, lembre que o ficheiro de sinatura (.sig ou .asc) debería\n"
+"se-lo primeiro ficheiro que se indique na liña de comandos.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr ""
+"a liña de entrada %u é longa de máis ou fáltalle a marca de fin de liña\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "erro xeral"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "tipo de paquete descoñecido"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "versión descoñecida"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algoritmo de chave pública descoñecido"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algoritmo de resumo descoñecido"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "chave pública errónea"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "chave secreta errónea"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "sinatura errónea"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "error de checksum"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "contrasinal erróneo"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "non se atopou a chave pública"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algoritmo de cifrado descoñecido"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "non foi posible abri-lo chaveiro"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "paquete non válido"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armadura non válida"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "non hai tal id de usuario"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "a chave secreta non está dispoñible"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "empregouse unha chave secreta errónea"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "non está soportado"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "chave incorrecta"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "erro de lectura de ficheiro"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "erro de escritura de ficheiro"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritmo de compresión descoñecido"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "erro de apertura de ficheiro"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "erro de creación de ficheiro"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "contrasinal incorrecto"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmo de chave pública non implementado"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritmo de cifrado non implementado"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "clase de sinatura descoñecida"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "erro da base de datos de confianza"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI erróneo"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "límite de recursos"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "chaveiro incorrecto"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "certificado erróneo"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "id de usuario mal formado"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "erro de peche de ficheiro"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "erro de cambio de nome de ficheiro"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "erro de borrado de ficheiro"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "datos inesperados"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflicto de selo de data"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritmo de chave pública imposible de usar"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "o ficheiro xa existe"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "chave feble"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argumento non válido"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI incorrecto"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI non soportado"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "erro de rede"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "non cifrado"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "non procesado"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "chave pública non utilizable"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "chave secreta non utilizable"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "erro do servidor de chaves"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Cancelar"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "non cifrado"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "non hai datos asinados\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... isto é un erro (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "atopou un erro ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "si|sim"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "sS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "non|nom"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "abandonar"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "aA"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "v"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "AVISO: ¡úsase memoria insegura!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "mire en http://www.gnupg.org/faq.html para obter máis información\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "a operación non é posible sen memoria inicializada como segura\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(pode que usara o programa equivocado para esta tarefa)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA require o emprego dun algoritmo hash de 160 bits\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "mire en http://www.gnupg.org/why-not-idea.html para obter máis "
+#~ "información\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "un nome de notación só debe ter caracteres imprimibles ou espacios, e "
+#~ "debe rematar en '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "un nome de notación de usuario debe conte-lo carácter '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "un nome de notación de usuario debe conte-lo carácter '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "un valor de notación non pode empregar ningún carácter de control\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "AVISO: atopáronse datos de notación non válidos\n"
+
+#~ msgid "not human readable"
+#~ msgstr "non lexible por humanos"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "le-las opcións dun ficheiro"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "le-las opcións dun ficheiro"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [caduca: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "chave %08lX: clase de sinatura non esperada (0x%02X) - omitida\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "non se puido executar %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Non hai un ID de usuario para a chave\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "erro ao crea-lo contrasinal: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "contrasinal incorrecto ou algoritmo de cifrado descoñecido (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "non se pode estabrece-lo pid do cliente para o axente\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "non se pode obte-lo FD de lectura do servidor para o axente\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "non se pode obte-lo FD de escritura do servidor para o axente\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problema de comunicación con gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "contrasinal demasiado longo\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "resposta do axente non válida\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problema co axente: o axente voltou coa resposta 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "selecciona-la chave secundaria N"
+
+#~ msgid "list signatures"
+#~ msgstr "listar sinaturas"
+
+#~ msgid "sign the key"
+#~ msgstr "asina-la chave"
+
+#~ msgid "add a secondary key"
+#~ msgstr "engadir unha chave secundaria"
+
+#~ msgid "delete signatures"
+#~ msgstr "borrar sinaturas"
+
+#~ msgid "change the expire date"
+#~ msgstr "cambia-la fecha de expiración"
+
+#~ msgid "set preference list"
+#~ msgstr "estabrece-la lista de preferencias"
+
+#~ msgid "updated preferences"
+#~ msgstr "preferencias actualizadas"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Non hai chave secundaria con índice %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key id-de-usuario"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key id-de-usuario"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "facer unha sinatura separada"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "asina-la chave de xeito non revocable"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "asina-la chave localmente e de xeito non revocable"
+
+#~ msgid "q"
+#~ msgstr "s"
+
+#~ msgid "help"
+#~ msgstr "axuda"
+
+#~ msgid "list"
+#~ msgstr "listar"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "depurar"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "erro xeral"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "gardar"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "chave"
+
+#~ msgid "check"
+#~ msgstr "verificar"
+
+#~ msgid "c"
+#~ msgstr "v"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "f"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "c"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "erro do servidor de chaves"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "o algoritmo de resumo `%s' é de só lectura nesta versión\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Hase crear unh novo par de chaves %s.\n"
+#~ "             tamaño de chave mínimo:  768 bits\n"
+#~ "        tamaño de chave por defecto: 1024 bits\n"
+#~ " tamaño de chave máximo recomendado: 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA só admite tamaños entre 512 e 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "chave pequena de máis; 1024 é o menor valor admitido para RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "chave pequena de máis; 768 é o menor valor admitido\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "chave grande de máis; %d é o maior tamaño admitido.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "¡As chaves maiores de 2048 bits non se aconsellan porque\n"
+#~ "os cálculos levan MOITO tempo!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "¿Está seguro de que quere este tamaño de chave? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "De acordo, ¡pero teña en conta que a radiación do monitor e o teclado "
+#~ "tamén son vulnerables a ataques!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "¡Os algoritmos experimentais non deberían ser usados!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "este algoritmo de cifrado está obsoleto; por favor, empregue un máis "
+#~ "estándar!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "escribindo a `%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "sentímolo, non se pode facer isto no modo por lotes\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "non se atopou a chave `%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "non se pode crear `%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "non se puido abrir un ficheiro: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "               alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "chave %08lX: ¡esta chave está revocada!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "chave %08lX: ¡unha subchave está revocada!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: a chave caducou\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Esta chave NON é de confianza\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (asinar e cifrar)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (só asinar)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (asinar e cifrar)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (só cifrar)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (asinar e cifrar)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: non se pode abrir: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: AVISO: ficheiro baleiro\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "non se puido abrir %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Confío marxinalmente\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Confío totalmente\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "asinado localmente coa súa chave %08lX no %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   asinada por %08lX no %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: non é posible acceder: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: non se pode crea-lo bloqueo\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: non se pode bloquear\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: non se pode crear: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: non foi posible crear un directorio: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr "Se desexa empregar esta chave revocada, conteste \"si\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Non se puido abri-la foto \"%s\": %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "non se puido abrir un ficheiro: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "erro: falla un signo de dous puntos\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "erro: non hai un valor de confianza no propietario\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (ID principal da chave %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! revocouse a subchave: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- atopouse unha revocación falsa\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problema ao comproba-la revocación: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [caduca: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [caduca: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[revocada] "
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "non foi posible crear %s: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "AVISO: o resumo `%s' non forma parte de OpenPGP.\n"
+#~ "       Emprégueo baixo a súa propia responsabilidade.\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[ficheiros]|cifrar ficheiros"
+
+#~ msgid "store only"
+#~ msgstr "só armacenar"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[ficheiros]|descifrar ficheiros"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "asinar unha chave de xeito non revocable"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "asinar unha chave localmente e de xeito non revocable"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "listar só a secuencia de paquetes"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "exporta-los valores de confianza no propietario"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "actualización inatendida da base de datos de confianza"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "amañar unha base de datos de confianza corrompida"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Quita-la armadura a un ficheiro ou á entrada estándar"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Pór armadura a un ficheiro ou á entrada estándar"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOME|empregar NOME como valor por defecto do destinatario"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "usa-la chave por defecto coma o destinatario por defecto"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "non usa-la terminal en absoluto"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "forzar sinaturas v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "non forzar sinaturas v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "forzar sinaturas de chave v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "non forzar sinaturas de chave v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "sempre usar un MDC para cifrar"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "nunca usar un MDC para cifrar"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "emprega-lo gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "modo por lotes: non preguntar nunca"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "asumir `si' na maioría das preguntas"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "asumir `non' na maioría das preguntas"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "engadir este chaveiro á lista de chaveiros"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "engadir este chaveiro secreto á lista"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOME|empregar NOME coma chave secreta por defecto"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|empregar este servidor de chaves para buscar chaves"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NAME|axusta-lo xogo de caracteres do terminal a NOME"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[ficheiro]|escribi-la información de estado no ficheiro"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|IDCHAVE|confiar absolutamente nesta chave"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FICHEIRO|carga-lo módulo de extensión FICHEIRO"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emula-lo modo descrito no RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "axustar tódalas opcións de paquetes, cifrado e resumo ao comportamento "
+#~ "OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "axustar tódalas opcións de paquetes, cifrado e resumo ao comportamento "
+#~ "PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|emprega-lo modo de contrasinal N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NOME|emprega-lo algoritmo para resumos NOME para os contrasinais"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NOME|emprega-lo algoritmo de cifrado NOME para os contrasinais"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOME|emprega-lo algoritmo de cifrado NOME"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOME|emprega-lo algoritmo de resumos de mensaxes NOME"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|emprega-lo algoritmo de compresión N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "descarta-lo campo de id de chave dos paquetes cifrados"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Amosar Identificacións Fotográficas"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Non amosar Identificacións Fotográficas"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr ""
+#~ "Estabrece-la liña de comando para ve-las Identificacións Fotográficas"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "o algoritmo de compresión `%s' é de só lectura nesta versión\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "o algoritmo de compresión debe estar entre %d e %d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Non é seguro que esta chave pertenza de verdade ao seu "
+#~ "propietario\n"
+#~ "pero acéptase de tódolos xeitos\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "a preferencia %c%lu non é válida\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "chave %08lX: non é unha chave rfc2440 - omitida\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "NOTA: Detectouse unha clave primaria Elgamal - ha tomar algún tempo "
+#~ "importala\n"
+
+#~ msgid " (default)"
+#~ msgstr " (por defecto)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "erro ao enviar a `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "éxito ao enviar a `%s' (estado=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "fallo ao enviar a `%s': estado=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "este servidor de chaves non soporta --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "non se pode buscar no servidor de chaves: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "chave %08lX: ¡esta é unha chave ElGamal xerada por PGP que NON é xegura "
+#~ "para sinaturas!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "creouse a chave %08lX %lu segundo no futuro (salto no tempo ou problemas "
+#~ "co reloxo)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "creouse a chave %08lX %lu segundos no futuro (salto no tempo ou problemas "
+#~ "co reloxo)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "chave %08lX marcada coma de confianza absoluta\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "omitiuse dende a sinatura da chave de sinatura Elgamal %08lX ata %08lX\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "omitiuse dende %08lX ata a sinatura da chave de sinatura Elgamal %08lX\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "comprobando con profundidade %d asinadas=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%"
+#~ "d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Seleccione o algoritmo a usar.\n"
+#~ "\n"
+#~ "DSA (tamén chamado DSS) é un algoritmo de sinatura dixital, que só se "
+#~ "pode\n"
+#~ "empregar para asinar. É o algoritmo aconsellado porque é moito máis "
+#~ "rápido\n"
+#~ "verificar unha sinatura DSA que unha sinatura ElGamal.\n"
+#~ "\n"
+#~ "ElGamal é un algoritmo que se pode empregar para asinar e cifrar. "
+#~ "OpenPGP\n"
+#~ "distingue entre dúas variantes do algoritmo: un que só cifra e outro que\n"
+#~ "asina e cifra; realmente é o mesmo, pero hai que escoller algúns "
+#~ "parámetros\n"
+#~ "dun xeito especial para crear unha clave que sexa segura para asinar: "
+#~ "este\n"
+#~ "programa faino, pero outras implementacións de OpenPGP non teñen por que\n"
+#~ "entende-la variante de asinado+cifrado.\n"
+#~ "\n"
+#~ "A primeira clave (a primaria) debe ser sempre unha clave capaz de "
+#~ "asinar;\n"
+#~ "este é o motivo polo que a clave ElGamal que só cifra non está "
+#~ "dispoñible\n"
+#~ "neste menú."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Aínda que estas chaves están definidas no RFC2440, non se aconsellan\n"
+#~ "porque non están soportadas por tódolos programas, e as sinaturas\n"
+#~ "creadas con elas son moi grandes e lentas de comprobar."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu chaves comprobadas ata o momento (%lu sinaturas)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "chave incompleta\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "chave %08lX incompleta\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "quit|saír"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (asinar e cifrar)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "O emprego deste algoritmo só está soportado en GnuPG. Non ha poder "
+#~ "empregar\n"
+#~ "esta clave para se comunicar con usuarios de PGP. Este algoritmo tamén é\n"
+#~ "moi lento, e pode non ser tan seguro coma as outras opcións.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "¿Crear de tódolos xeitos? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "detectouse un algoritmo de chave simétrica non válido (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "este servidor de chaves non é totalmente compatible con HKP\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr "Este algoritmo está obsoleto - ¿crear de tódolos xeitos? "
+
+#~ msgid ""
+#~ "you have to start GnuPG again, so it can read the new configuration file\n"
+#~ msgstr ""
+#~ "ten que iniciar GnuPG outra vez para que lea o novo ficheiro de "
+#~ "configuración\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "o cambio de permisos de `%s' fallou: %s\n"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NOME=VALOR|usar estes datos de notación"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr ""
+#~ "o primeiro carácter dun nome de notación debe ser unha letra ou guión "
+#~ "baixo\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr ""
+#~ "os puntos dun nome de notación deben estar rodeados por outros "
+#~ "caracteres\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "AVISO: Esta chave xa ten unha identificación fotográfica.\n"
+#~ "       Se engade outra pode confundir a algunhas versións de PGP.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Só pode ter unha identificación fotográfica nunha chave.\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "         Pegada dactilar:"
+
+#~ msgid "too many random bits requested; the limit is %d\n"
+#~ msgstr "pedíronse demasiados bits aleatorios; o límite é %d\n"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NOMES]|verifica-la base de datos de confianza"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key id-de-usuario"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key id de usuario"
+
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-key-and-public-key id-de-usuario"
+
+#~ msgid "For info see http://www.gnupg.org"
+#~ msgstr "Para obter máis información vexa http://www.gnupg.org"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "iImMsS"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Non se puido atopar unha ruta de confianza válida ata a chave. Hase ver "
+#~ "se\n"
+#~ "se pode asignar algún valor de confianza non asignado.\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Non se atopou unha ruta que conduza a unha das nosas chaves.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Non se atoparon certificados con confianza non definida.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Non se cambiou ningún valor de confianza.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr ""
+#~ "%08lX: non hai información para calcular unha probabilidade de confianza\n"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "omitida: a chave pública xa está estabrecida con --encrypt-to\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: erro ao verifica-la chave: %s\n"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr "¿Seguro que quere crear unha chave para asinar e cifrar? "
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "¿Está seguro de precisar un tamaño de chave tan grande? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: non se atopou o usuario: %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "problema de lectura do certificado: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr "demasiadas entradas na caché de chaves descoñecidas - desactivada\n"
+
+#~ msgid "secret key %08lX not imported (use %s to allow for it)\n"
+#~ msgstr ""
+#~ "non se importou a chave secreta %08lX (empregue %s para permitilo)\n"
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "chave %08lX: a nosa copia non ten auto-sinatura\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: usuario non atopado\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr "asumindo un MDC incorrecto debido a un bit crítico\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "erro ao le-lo rexistro de directorio para o LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr ""
+#~ "lid %lu: esperábase un rexistro de directorio, obtívose un tipo %d\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "non hai unha chave primaria para o LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "erro ao le-la chave primaria para o LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "chave %08lX: a consulta do rexistro fallou\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "chave %08lX: xa está na tabla de chaves de confianza\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "NOTA: a chave secreta %08lX NON está protexida.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr "chave %08lX: as chaves secreta e pública non coinciden\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "chave %08lX.%lu: Ligadura de subchave correcta\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "chave %08lX.%lu: Ligadura de subchave non válida: %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "chave %08lX.%lu: Revocación de chave válida\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "chave %08lX.%lu: Revocación de chave non válida: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Auto-sinatura correcta"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Auto-sinatura non válida"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr ""
+#~ "Omítese unha revocación de ID de usuario válida debido a unha auto-"
+#~ "sinatura máis recente"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Revocación de ID de usuario válida"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Revocación de ID de usuario non válida"
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Revocación de certificado válida"
+
+#~ msgid "Good certificate"
+#~ msgstr "Certificado correcto"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Revocación de certificado non válida"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Certificado non válido"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "o rexistro de sinatura %lu[%d] apunta a un rexistro incorrecto.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "certificado duplicado - borrado"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "tdbio_search_dir fallou: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: a inserción fallou: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: a inserción fallou: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: inserido\n"
+
+#~ msgid "\t%lu keys with errors\n"
+#~ msgstr "\t%lu chaves con erros\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu chaves inseridas\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: rexistro de directorio sen chave - ignorado\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "\t%lu debidos a novas chaves públicas\n"
+
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu chaves omitidas\n"
+
+#~ msgid "\t%lu keys updated\n"
+#~ msgstr "\t%lu chaves actualizadas\n"
+
+#~ msgid "Ooops, no keys\n"
+#~ msgstr "Ooops, non hai chaves\n"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Ooops, non hai IDs de usuario\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr ""
+#~ "check_trust:\n"
+#~ "a búsqueda de rexistro de directorio fallou: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr ""
+#~ "chave %08lX:\n"
+#~ "a inserción na base de datos de confianza fallou: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "chave %08lX.%lu: inserida na base de datos de confianza\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "chave %08lX.%lu: creada no futuro (salto no tempo ou problema de reloxo)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "chave %08lX.%lu: caducou o %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "chave %08lX.%lu: a verificación de confianza fallou: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr "problema ao buscar '%s' na base de datos de confianza: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr "o usuario '%s' non está na base de datos de confianza - inserindo\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "erro ao pór '%s' na base de datos de confianza: %s\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr ""
+#~ "AVISO: aínda non se poden manexar rexistros de preferencias longos\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: non se pode crea-lo chaveiro: %s\n"
+
+#~ msgid "set debugging flags"
+#~ msgstr "axusta-los valores de depuración"
+
+#~ msgid "enable full debugging"
+#~ msgstr "habilitar depuración total"
+
+#~ msgid "do not write comment packets"
+#~ msgstr "non escribir paquetes de comentario"
+
+#~ msgid "(default is 3)"
+#~ msgstr "(por defecto é 3)"
+
+#~ msgid "   (%d) ElGamal in a v3 packet\n"
+#~ msgstr "   (%d) ElGamal nun paquete v3\n"
+
+#~ msgid "Key generation can only be used in interactive mode\n"
+#~ msgstr "A xeración de chaves somentes pode ser usada no modo interactivo\n"
+
+#~ msgid "RSA key cannot be used in this version\n"
+#~ msgstr "A chave RSA non pode user usada nesta version\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "Non hay unha chave para o ID de usuario\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "non hai chave secreta disponible para desencriptar\n"
+
+#~ msgid ""
+#~ "RSA keys are deprecated; please consider creating a new key and use this "
+#~ "key in the future\n"
+#~ msgstr ""
+#~ "As chaves RSA están obsoletas; por favor, considere a opción de crear "
+#~ "unha\n"
+#~ "chave nova e usa-la no futuro.\n"
diff --git a/po/gnupg.pot b/po/gnupg.pot
new file mode 100644 (file)
index 0000000..9d93b50
--- /dev/null
@@ -0,0 +1,5910 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr ""
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr ""
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr ""
+
+#: cipher/random.c:403
+#, c-format
+msgid "can't lock `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:408
+#, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr ""
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr ""
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr ""
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr ""
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr ""
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr ""
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr ""
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr ""
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr ""
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr ""
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr ""
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr ""
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr ""
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr ""
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr ""
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr ""
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr ""
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr ""
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr ""
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr ""
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr ""
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr ""
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr ""
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr ""
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr ""
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr ""
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr ""
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr ""
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr ""
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr ""
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr ""
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr ""
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr ""
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr ""
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr ""
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr ""
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr ""
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr ""
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr ""
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr ""
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr ""
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr ""
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr ""
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr ""
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr ""
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr ""
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr ""
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr ""
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr ""
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr ""
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr ""
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr ""
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr ""
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr ""
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr ""
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr ""
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr ""
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr ""
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr ""
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr ""
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr ""
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr ""
+
+#: g10/cardglue.c:416
+msgid "card reader not available\n"
+msgstr ""
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr ""
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr ""
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr ""
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr ""
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr ""
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr ""
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr ""
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr ""
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr ""
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr ""
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr ""
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr ""
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr ""
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr ""
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr ""
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr ""
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr ""
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr ""
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr ""
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr ""
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr ""
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr ""
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr ""
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr ""
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr ""
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr ""
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr ""
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr ""
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr ""
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr ""
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr ""
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr ""
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr ""
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr ""
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr ""
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr ""
+
+#: g10/export.c:373
+#, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr ""
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr ""
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr ""
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr ""
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr ""
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr ""
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr ""
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr ""
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr ""
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr ""
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr ""
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr ""
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr ""
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr ""
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr ""
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr ""
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr ""
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr ""
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr ""
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr ""
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr ""
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr ""
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr ""
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr ""
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr ""
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr ""
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr ""
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr ""
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr ""
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr ""
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr ""
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr ""
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr ""
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr ""
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr ""
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr ""
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr ""
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr ""
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr ""
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr ""
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr ""
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr ""
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr ""
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr ""
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr ""
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr ""
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr ""
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr ""
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr ""
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr ""
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr ""
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr ""
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr ""
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr ""
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr ""
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr ""
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr ""
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr ""
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr ""
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+msgid "show all notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2582
+msgid "show user ID validity during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr ""
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr ""
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2768
+#, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr ""
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr ""
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr ""
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr ""
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr ""
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr ""
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr ""
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr ""
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr ""
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr ""
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr ""
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr ""
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr ""
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr ""
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr ""
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr ""
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr ""
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr ""
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr ""
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr ""
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr ""
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr ""
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr ""
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr ""
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr ""
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr ""
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr ""
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr ""
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr ""
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr ""
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr ""
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr ""
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr ""
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr ""
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr ""
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr ""
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr ""
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr ""
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr ""
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr ""
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr ""
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr ""
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr ""
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr ""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr ""
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr ""
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr ""
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr ""
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr ""
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr ""
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr ""
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr ""
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+msgid "do not update the trustdb after import"
+msgstr ""
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr ""
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+msgid "remove unusable parts from key after import"
+msgstr ""
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr ""
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr ""
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr ""
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr ""
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr ""
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr ""
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr ""
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr ""
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr ""
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr ""
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr ""
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr ""
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr ""
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr ""
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr ""
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr ""
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr ""
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+msgid "         algorithms on these user IDs:\n"
+msgstr ""
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr ""
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr ""
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr ""
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr ""
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr ""
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr ""
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr ""
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr ""
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr ""
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr ""
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr ""
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr ""
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr ""
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr ""
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr ""
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr ""
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr ""
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr ""
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr ""
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr ""
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr ""
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr ""
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr ""
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr ""
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr ""
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr ""
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr ""
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr ""
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr ""
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr ""
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr ""
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr ""
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr ""
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr ""
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr ""
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr ""
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr ""
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr ""
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr ""
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr ""
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr ""
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr ""
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr ""
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr ""
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr ""
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr ""
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr ""
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr ""
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr ""
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr ""
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr ""
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr ""
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr ""
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr ""
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr ""
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr ""
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr ""
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr ""
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr ""
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr ""
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr ""
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr ""
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr ""
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr ""
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr ""
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr ""
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr ""
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr ""
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr ""
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr ""
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr ""
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr ""
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr ""
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr ""
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr ""
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr ""
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr ""
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr ""
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr ""
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr ""
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr ""
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr ""
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr ""
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr ""
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr ""
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr ""
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr ""
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr ""
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr ""
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr ""
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr ""
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr ""
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr ""
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr ""
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr ""
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr ""
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr ""
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr ""
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr ""
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr ""
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr ""
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr ""
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1428
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1430
+msgid "set a notation for the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr ""
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr ""
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr ""
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr ""
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr ""
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr ""
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr ""
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr ""
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr ""
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr ""
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr ""
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr ""
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr ""
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr ""
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr ""
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr ""
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr ""
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr ""
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr ""
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+msgid "Notations: "
+msgstr ""
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr ""
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr ""
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr ""
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr ""
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr ""
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr ""
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr ""
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr ""
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr ""
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr ""
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr ""
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr ""
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr ""
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr ""
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr ""
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr ""
+
+#: g10/keyedit.c:3235
+#, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:3242
+#, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr ""
+
+#: g10/keyedit.c:3243
+#, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr ""
+
+#: g10/keyedit.c:3251
+#, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr ""
+
+#: g10/keyedit.c:3252
+#, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr ""
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr ""
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr ""
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr ""
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr ""
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr ""
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr ""
+
+#: g10/keyedit.c:3673
+#, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr ""
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr ""
+
+#: g10/keyedit.c:4343
+msgid "Proceed? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr ""
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr ""
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr ""
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr ""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr ""
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr ""
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr ""
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr ""
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr ""
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr ""
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr ""
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr ""
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr ""
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr ""
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr ""
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr ""
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr ""
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr ""
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr ""
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr ""
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr ""
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr ""
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr ""
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr ""
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr ""
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr ""
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr ""
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr ""
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr ""
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr ""
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr ""
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr ""
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr ""
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr ""
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr ""
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr ""
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr ""
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr ""
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr ""
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr ""
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr ""
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr ""
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr ""
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr ""
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr ""
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr ""
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr ""
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr ""
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr ""
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr ""
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr ""
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr ""
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr ""
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr ""
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr ""
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr ""
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr ""
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr ""
+
+#: g10/keygen.c:1904
+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 ""
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr ""
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr ""
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr ""
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr ""
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr ""
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr ""
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr ""
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr ""
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr ""
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr ""
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr ""
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr ""
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr ""
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr ""
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr ""
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr ""
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr ""
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr ""
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr ""
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr ""
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr ""
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr ""
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr ""
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr ""
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr ""
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr ""
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr ""
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr ""
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr ""
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr ""
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+msgid "honor the preferred keyserver URL set on the key"
+msgstr ""
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr ""
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr ""
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr ""
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr ""
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1173
+#, c-format
+msgid "searching for names from %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1176
+#, c-format
+msgid "searching for names from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr ""
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr ""
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr ""
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1955
+#, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr ""
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr ""
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr ""
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr ""
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr ""
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr ""
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr ""
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr ""
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr ""
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr ""
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr ""
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr ""
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr ""
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr ""
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr ""
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr ""
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr ""
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+
+#: g10/mainproc.c:1165
+msgid "no signature found\n"
+msgstr ""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr ""
+
+#: g10/mainproc.c:1508
+msgid "can't handle this ambiguous signature data\n"
+msgstr ""
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr ""
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr ""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr ""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr ""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr ""
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr ""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr ""
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr ""
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr ""
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr ""
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr ""
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr ""
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr ""
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr ""
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr ""
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr ""
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr ""
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr ""
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, c-format
+msgid "please see %s for more information\n"
+msgstr ""
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr ""
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr ""
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr ""
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr ""
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr ""
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr ""
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr ""
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr ""
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr ""
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr ""
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr ""
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr ""
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr ""
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr ""
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr ""
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr ""
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr ""
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr ""
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr ""
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr ""
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr ""
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr ""
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr ""
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr ""
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr ""
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr ""
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr ""
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr ""
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr ""
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr ""
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr ""
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr ""
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr ""
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr ""
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr ""
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr ""
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr ""
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr ""
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr ""
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr ""
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr ""
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr ""
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr ""
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr ""
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr ""
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr ""
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr ""
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr ""
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr ""
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr ""
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr ""
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr ""
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr ""
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr ""
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr ""
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr ""
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr ""
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr ""
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr ""
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr ""
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr ""
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr ""
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr ""
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr ""
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr ""
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr ""
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr ""
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr ""
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr ""
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr ""
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr ""
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr ""
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr ""
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr ""
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr ""
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr ""
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr ""
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr ""
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr ""
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr ""
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr ""
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr ""
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr ""
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr ""
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr ""
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr ""
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr ""
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr ""
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr ""
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr ""
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr ""
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr ""
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr ""
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr ""
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr ""
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr ""
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr ""
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr ""
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr ""
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr ""
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr ""
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr ""
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr ""
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr ""
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr ""
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr ""
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr ""
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr ""
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr ""
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr ""
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr ""
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr ""
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr ""
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr ""
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr ""
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr ""
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr ""
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr ""
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr ""
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr ""
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr ""
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr ""
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr ""
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr ""
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr ""
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr ""
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr ""
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr ""
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr ""
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr ""
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr ""
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr ""
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr ""
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr ""
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr ""
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr ""
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr ""
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr ""
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr ""
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr ""
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr ""
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr ""
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr ""
+
+#: util/errors.c:55
+msgid "general error"
+msgstr ""
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr ""
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr ""
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr ""
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr ""
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr ""
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr ""
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr ""
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr ""
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr ""
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr ""
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr ""
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr ""
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr ""
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr ""
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr ""
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr ""
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr ""
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr ""
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr ""
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr ""
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr ""
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr ""
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr ""
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr ""
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr ""
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr ""
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr ""
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr ""
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr ""
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr ""
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr ""
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr ""
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr ""
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr ""
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr ""
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr ""
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr ""
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr ""
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr ""
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr ""
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr ""
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr ""
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr ""
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr ""
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr ""
+
+#: util/errors.c:101
+msgid "network error"
+msgstr ""
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr ""
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr ""
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr ""
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr ""
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr ""
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr ""
+
+#: util/errors.c:110
+msgid "no card"
+msgstr ""
+
+#: util/errors.c:111
+msgid "no data"
+msgstr ""
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr ""
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr ""
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr ""
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr ""
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr ""
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr ""
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr ""
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr ""
diff --git a/po/hu.gmo b/po/hu.gmo
new file mode 100644 (file)
index 0000000..48971bd
Binary files /dev/null and b/po/hu.gmo differ
diff --git a/po/hu.po b/po/hu.po
new file mode 100644 (file)
index 0000000..8eb2128
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,7206 @@
+# GnuPG Hungarian translation.
+# Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+# Nagy Ferenc László <nfl@nfllab.com>, 2003, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.5\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-06-19 21:53+0200\n"
+"Last-Translator: Nagy Ferenc László <nfl@nfllab.com>\n"
+"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "Nem tudok létrehozni %d bitesnél kisebb prímszámot.\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "Nem tudok létrehozni %d bitesnél kisebb prímszámot.\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "Nem észleltem entrópiagyûjtõ modult.\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "Nem tudom megnyitni %s-t!\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "Nem tudom megnyitni a(z) \"%s\" állományt: %s.\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "Nem tudom a stat mûveletet elvégezni a(z) \"%s\" állományon: %s.\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "\"%s\" nem szabályos állomány. Figyelmen kívül hagyom.\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr ""
+"Megjegyzés: random_seed állomány (véletlenszám-generátor állapota) üres.\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "FIGYELEM: Érvénytelen méretû random_seed állomány. Nem használom.\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "Nem tudom olvasni a(z) \"%s\" állományt: %s.\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "Megjegyzés: random_seed állományt nem frissítettem.\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "Nem tudom létrehozni a(z) \"%s\" állományt: %s.\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "Nem tudom írni a(z) \"%s\" állományt: %s.\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "Nem tudom bezárni a(z) \"%s\" állományt: %s.\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "FIGYELEM: Nem biztonságos véletlenszám-generátort használok!!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"A véletlenszám-generátor csak egy szükségmegoldás, hogy a program\n"
+"elinduljon, semmiképpen nem egy erõs véletlenszám-generátor!\n"
+"\n"
+"NE HASZNÁLJON SEMMILYEN ADATOT, AMIT EZ A PROGRAM ELÕÁLLÍT!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Kérem, várjon, entrópiát gyûjtök! Vagy inkább csináljon közben valamit\n"
+"a gépen, az az entrópiám minõségét is javítani fogja!\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Nem áll rendelkezésre elég véletlen bájt. Kérem, csináljon most valami\n"
+"mást, hogy az operációs rendszer entrópiát gyûjthessen!\n"
+"(Még %d bájt szükséges.)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "Bizalmi adatbázis (%s) inicializálása sikertelen!\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "Nem tudtam újraépíteni a kulcskarika cache-ét: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "A kulcsblokk törlése sikertelen: %s.\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "Küldés a kulcsszerverre sikertelen: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "Hiba a jelszó létrehozásakor: %s.\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "Hiba a kulcsblokk olvasásakor: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: Hiba szabad rekord olvasásakor: %s.\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "\"%s\" már tömörített.\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "új kulcspár létrehozása"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "Bizalmi adatbázis (%s) inicializálása sikertelen!\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "A kulcsblokk törlése sikertelen: %s.\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Kulcsgenerálás sikertelen: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s aláírás, %s kivonatoló algoritmus.\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "Nem találtam érvényes OpenPGP adatot.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "Páncél: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "Érvénytelen páncélfejléc: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "Páncélfejléc: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "Érvénytelen aláírásfejléc!\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "Egymásba ágyazott olvashatószöveg-aláírások!\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "Váratlan páncél:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "Érvénytelen kötõjeles sor: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "Kihagytam a %02x kódú érvénytelen radix64 karaktert.\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "Korai állományvég (nincs CRC).\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "Korai állományvég (a CRC-ben).\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "Hibás formájú CRC.\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC hiba; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "Korai állományvég (a lezárásban).\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "Hiba a záró sorban!\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "Nem találtam érvényes OpenPGP adatot.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "Érvénytelen páncél: %d karakternél hosszabb sor.\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"quoted printable karakter a páncélban - valószínûleg egy bugos MTA bûne.\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "titkos kulcs nem áll rendelkezésre"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "Nem tudom ezt megcsinálni kötegelt módban!\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Mit választ? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Nincs megadva ok."
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "nem feldolgozott"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "Nincs hozzá tartozó nyilvános kulcs: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "Hiba \"%s\" olvasásakor: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "preferenciák frissítése"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "Érvénytelen karakter a preferenciák között!\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Érvénytelen karakter a preferenciák között!\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "Hiba: Érvénytelen ujjlenyomat.\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "megmutatja az ujjlenyomatot"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Hiba: Érvénytelen ujjlenyomat.\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Kulcsgenerálás sikertelen: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "Nem találtam érvényes OpenPGP adatot.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "Hiba a(z) \"%s\" titkoskulcs-karika írásakor: %s.\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Kérem, adja meg, milyen kulcsot kíván:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Az aláírás lejárt: %s.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (csak titkosítás)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Érvénytelen választás.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Kérem, válassza ki a visszavonás okát:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "Ismeretlen védelmi algoritmus!\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Az elsõdleges kulcs titkos részei nem elérhetõk.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "Kihagytam: titkos kulcs már jelen van.\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "kilépés ebbõl a menübõl"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "Egymásnak ellentmondó parancsok!\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "megmutatja ezt a súgót"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Kulcs található: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "lejárat megváltoztatása"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "kulcstulajdonos megbízhatóságának beállítása"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "megmutatja az ujjlenyomatot"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "új kulcspár létrehozása"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Parancs> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "Egymásnak ellentmondó parancsok!\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "Egymásnak ellentmondó parancsok!\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Érvénytelen parancs! (Próbálja a súgót: \"help\".)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "titkos kulcs nem áll rendelkezésre"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "A kulcsblokk törlése sikertelen: %s.\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Ismételje meg a jelszót: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "Nem ismételte meg helyesen a jelszót! Próbálja újra!"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "Nem tudom megnyitni %s-t!\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "Az --output opció nem mûködik ehhez a parancshoz.\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "\"%s\" kulcs nem található: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "Hiba a kulcsblokk olvasásakor: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(Kivéve, ha megad egy kulcsot az ujjlenyomatával.)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "Nem tudom ezt megcsinálni kötegelt módban \"--yes\" nélkül.\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Töröljem ezt a kulcsot a kulcskarikáról? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Ez egy titkos kulcs! Valóban töröljem? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "A kulcsblokk törlése sikertelen: %s.\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "Kulcstulajdonos megbízhatósági adatait töröltem.\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "Van egy titkos kulcs a \"%s\" nyilvános kulcshoz!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "Elõször azt törölje a \"--delete-secret-keys\" opcióval!\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "Hiba a jelszó létrehozásakor: %s.\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "Nem tudok szimmetrikus ESK csomagot használni a S2K mód miatt!\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "%s rejtjelezést használok.\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "\"%s\" már tömörített.\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "FIGYELEM: A(z) \"%s\" állomány üres.\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"Csak 2048 bites, vagy rövidebb RSA kulcsokkal titkosíthat --pgp2 módban!\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "Olvasok a \"%s\" állományból.\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "Nem tudom az IDEA rejtjelezõt használni az összes címzett kulcshoz.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "A %s (%d) rejtjelezõ használata sérti a címzett preferenciáit!\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "A %s (%d) tömörítés használata sérti a címzett preferenciáit!\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "A %s (%d) rejtjelezõ használata sérti a címzett preferenciáit!\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "Lehet, hogy nem használhatja %s-t %s módban!\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s titkosítva \"%s\" számára\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s titkosított adat.\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "Ismeretlen algoritmussal (%d) titkosítva.\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"FIGYELEM: Az üzenet szimmetrikus titkosítását gyenge kulccsal végezték.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "Probléma a titkosított csomag kezelésekor!\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "Külsõ program meghívása nem támogatott.\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "Nem tudom a \"%s\" könyvtárat létrehozni: %s.\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"A külsõ programok hívása tiltott, mert az \"options\" állomány engedélyei\n"
+"nem biztonságosak.\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"Ez a platform átmeneti állományokat igényel külsõ programok hívásához.\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "Nem tudom végrehajtani a következõ \"%s\"-t: \"%s\": %s.\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "Nem tudom végrehajtani a következõ \"%s\"-t: \"%s\": %s.\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "Rendszerhiba külsõ program hívásakor: %s.\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "A külsõ program nem természetes módon ért véget.\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "Nem tudom a végrehajtani a külsõ programot.\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "Nem tudom beolvasni a külsõ program válaszát: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+"FIGYELEM: Nem tudom törölni az (\"%s\") átmeneti állományt: \"%s\": %s.\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "FIGYELEM: nem tudom törölni a \"%s\" átmeneti könyvtárat: %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Az aláírást \"nem visszavonhatónak\" jelöljük.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "Nem találtam visszavonó kulcsot a következõhöz: \"%s\".\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "másodlagos kulcs visszavonása"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "használhatatlan titkos kulcs"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "%08lX kulcs: nem védett - kihagytam.\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "%08lX kulcs: PGP 2.x stílusú kulcs - kihagytam.\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "%08lX kulcs: Alkulcsaláírás rossz helyen - kihagytam.\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "Bizalmi adatbázis (%s) inicializálása sikertelen!\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "FIGYELEM: %08lX titkos kulcsnak nincs egyszerû SK ellenõrzõösszege.\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "FIGYELEM: Semmit sem exportáltam.\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Parancsok:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fájl]|aláírás készítése"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fájl]|olvasható szöveg aláírása"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "különálló aláírás készítése"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "adat titkosítása"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "titkosítás csak szimmetrikus rejtjelezõvel"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "adat visszafejtése (alapértelmezés)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "aláírás ellenõrzése"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "kulcsok listázása"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "kulcsok és aláírások listázása"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "kulcsaláírások ellenõrzése"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "kulcsok és ujjlenyomatok listázása"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "titkos kulcsok listázása"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "új kulcspár létrehozása"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "kulcsok eltávolítása a nyilvánoskulcs-karikáról"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "kulcsok eltávolítása a titkoskulcs-karikáról"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "kulcs aláírása"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "kulcs aláírása helyileg"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "kulcs aláírása vagy szerkesztése"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "visszavonási igazolás készítése"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "kulcsok exportálása"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "kulcsok exportálása kulcsszerverre"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "kulcsok importálása kulcsszerverrõl"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "kulcsok keresése kulcsszerveren"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "minden kulcs frissítése kulcsszerverrõl"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "kulcsok importálása/összefûzése"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "bizalmi adatbázis frissítése"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [fájlok]|üzenet kivonatának kiírása"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opciók:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "ascii páncélozott kimenet létrehozása"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NÉV|titkosítás NÉV részére"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "felh. azonosító aláíráshoz és visszafejtéshez"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|tömörítési szint beállítása N-re (0: tiltás)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "kanonikus szöveges mód használata"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "kimeneti állomány megadása"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "bõbeszédû mód"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "ne csináljon semmi változtatást"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "felülírás elõtt rákérdezés"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(A parancsok és opciók teljes listáját a man oldalon tekintheti meg.)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Példák:\n"
+"\n"
+" -se -r Bob [fájl]          titkosítás és aláírás Bob részére\n"
+" --clearsign [fájl]         olvasható szöveg aláírása\n"
+" --detach-sign [fájl]       különálló aláírás készítése\n"
+" --list-keys [nevek]        kulcsok kiíratása\n"
+" --fingerprint [nevek]      ujjlenyomatok kiíratása\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "A hibákat (angolul) a <gnupg-bugs@gnu.org> címre írja meg!\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Használat: gpg [opciók] [fájlok] (-h a súgóhoz)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Szintaxis: gpg [opciók] [fájlok]\n"
+"Aláírás, ellenõrzés, titkosítás vagy visszafejtés.\n"
+"Az alapértelmezett mûvelet a bemeneti adattól függ.\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Támogatott algoritmusok:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Nyilvános kulcsú (pubkey): "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Rejtjelezõ (cipher): "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Kivonatoló (hash): "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Tömörítõ (compression): "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "Használat: gpg [opciók] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "Egymásnak ellentmondó parancsok!\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "Nem találtam = jelet a \"%s\" csoportdefinícióban!\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "FIGYELEM: Nem biztonságos tulajdonos: %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "FIGYELEM: Nem biztonságos tulajdonos: %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "FIGYELEM: Nem biztonságos tulajdonos: %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "FIGYELEM: nem biztonságos engedélyek: %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "FIGYELEM: nem biztonságos engedélyek: %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "FIGYELEM: nem biztonságos engedélyek: %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "FIGYELEM: nem biztonságos könyvtártulajdonos: %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "FIGYELEM: nem biztonságos könyvtártulajdonos: %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "FIGYELEM: nem biztonságos könyvtártulajdonos: %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "FIGYELEM: nem biztonságos könyvtárengedélyek: %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "FIGYELEM: nem biztonságos könyvtárengedélyek: %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "FIGYELEM: nem biztonságos könyvtárengedélyek: %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "\"%s\": ismeretlen konfigurációs elem.\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Nincs megfelelõ aláírás a titkoskulcs-karikán.\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "A megadott aláírási eljárásmód URL-je érvénytelen!\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "mutatja a kilistázott kulcs kulcskarikáját is"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Nincs megfelelõ aláírás a titkoskulcs-karikán.\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "MEGJEGYZÉS: Figyelmen kívül hagytam a régi opciókat (%s).\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "MEGJEGYZÉS: Nincs alapértelmezett opciós fájl (%s).\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "\"%s\" opciós fájl: %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "Az opciókat a \"%s\" állományból olvasom.\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "MEGJEGYZÉS: %s nem normál használatra van!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "A \"%s\" rejtjelezõ bõvítést rossz engedélyek miatt töltöm be.\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s nem érvényes karakterkiosztás!\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s nem érvényes karakterkiosztás!\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "Értelmezhetetlen a kulcsszerver URI-ja!\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: Érvénytelen import opciók!\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "Érvénytelen import opciók!\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: Érvénytelen import opciók!\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "Érvénytelen import opciók!\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s nem érvényes karakterkiosztás!\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "A megadott aláírási eljárásmód URL-je érvénytelen!\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s nem érvényes karakterkiosztás!\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "Nem tudom a végrehajtási elérési utat %s értékre állítani!\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: Érvénytelen export opciók!\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "FIGYELEM: A program core állományt hozhat létre!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "FIGYELEM: %s hatástalanítja %s-t!\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s és %s nem használható együtt!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s értelmetlen %s mellett!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "GPG ügynök nem elérhetõ ebben a munkafolyamatban.\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "Csak különálló és olvashatószöveg-aláírást készíthet --pgp2 módban!\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "Nem írhat alá és titkosíthat egyszerre --pgp2 módban!\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "Csak állományokat (pipe-ot nem) használhat --pgp2 módban!\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "Üzenet titkosítása --pgp2 módban IDEA rejtjelezõt igényel!\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "A kiválasztott rejtjelezõ algoritmus érvénytelen!\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "A kiválasztott kivonatoló algoritmus érvénytelen!\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "A kiválasztott rejtjelezõ algoritmus érvénytelen!\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "Az igazoláshoz kiválasztott kivonatoló algoritmus érvénytelen!\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed nagyobb kell legyen 0-nál!\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed nagyobb kell legyen 1-nél!\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth 1 és 255 közé kell essen!\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "Érvénytelen default-cert-level; 0, 1, 2 vagy 3 lehet.\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "Érvénytelen min-cert-level; 0, 1, 2 vagy 3 lehet.\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "MEGJEGYZÉS: Egyszerû S2K mód (0) erõsen ellenjavallt!\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "Érvénytelen S2K mód; 0, 1 vagy 3 lehet.\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "Érvénytelen alapértelmezett preferenciák!\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "Érvénytelen személyes rejtjelezõ-preferenciák!\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "Érvénytelen személyes kivonatolópreferenciák!\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "Érvénytelen személyes tömörítõpreferenciák!\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s és %s egyelõre nem használható együtt!\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+"Lehet, hogy nem használhatja \"%s\" rejtjelezõ algoritmust %s módban!\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+"Lehet, hogy nem használhatja \"%s\" kivonatoló algoritmust %s módban!\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "Lehet, hogy nem használhatja \"%s\" tömörítõ algoritmust %s módban!\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "Bizalmi adatbázis (%s) inicializálása sikertelen!\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [fájlnév]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [fájlnév]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "Visszafejtés sikertelen: %s.\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [fájlnév]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [fájlnév]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "Lehet, hogy nem használhatja %s-t %s módban!\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [fájlnév]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [fájlnév]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [fájlnév]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "Lehet, hogy nem használhatja %s-t %s módban!\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [fájlnév]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [fájlnév]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [fájlnév]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key felh-azonosító"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key felh-azonosító"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key felh-azonosító [parancsok]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [felh-azonosító] [kulcskarika]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "Küldés a kulcsszerverre sikertelen: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "Vétel a kulcsszerverrõl sikertelen: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "Kulcsexportálás sikertelen: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "Keresés a kulcsszerveren sikertelen: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "Frissítés a kulcsszerverrõl sikertelen: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "Páncél eltávolítása nem sikerült: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "Páncélozás nem sikerült: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "Érvénytelen kivonatoló algoritmus: %s\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[fájlnév]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Kezdheti gépelni az üzenetet...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "A megadott igazolási eljárásmód URL-je érvénytelen!\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "A megadott aláírási eljárásmód URL-je érvénytelen!\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "A megadott aláírási eljárásmód URL-je érvénytelen!\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "Túl sok bejegyzés van a nyilvánoskulcs-gyorsítótárban - letiltom.\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[ismeretlen kulcs]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"%08lX érvénytelen kulcsot érvényesítettük az\n"
+"--allow-non-selfsigned-uid opcióval.\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"Nincs titkos alkulcs a %08lX nyilvános alkulcshoz - figyelmen kívül hagyom.\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "A %08lX másodlagos kulcsot használjuk a %08lX elsõdleges helyett.\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "%08lX kulcs: titkos kulcs nyilvános kulcs nélkül - kihagytam.\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "még szûkszavúbb mód"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "a megadott kulcskarikáról vegye a kulcsokat"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "idõbélyeg-konfliktus esetén csak figyelmeztessen"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|ÁL|állapotinformációk írása ÁL állományleíróra"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Használat: gpgv [opciók] [fájlok] (-h a súgóhoz)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Szintaxis: gpg [opciók] [fájlok]\n"
+"Ellenõrzi az aláírásokat az ismert, megbízható kulcsok segítségével.\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Az Ön döntésén múlik, hogy milyen értéket ad meg itt. Ezt az értéket soha\n"
+"nem exportáljuk mások részére. Ez a bizalmak hálózatához (web-of-trust)\n"
+"szükséges, semmi köze az igazolások hálózatához (web-of-certificates)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Hogy a bizalmak hálózatát felépítsük, a GnuPG-nek tudnia kell, hogy\n"
+"mely kulcsok alapvetõen megbízhatóak - általában ezek azok a kulcsok,\n"
+"melyek titkos kulcsához hozzáfér. Válaszoljon \"igen\"-nel, ha kulcsot\n"
+"alapvetõen megbízhatónak jelöli!\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Ha mégis használni akarja ezt a kulcsot, melyben nem bízunk,\n"
+"válaszoljon \"igen\"-nel!"
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Adja meg a címzett felhasználói azonosítóját!"
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Általában nem jó ötlet ugyanazt a kulcsot használni aláíráshoz és\n"
+"titkosításhoz. Ezt az algoritmust csak bizonyos területeken ajánlatos\n"
+"használni. Kérem, elõször konzultáljon a biztonsági szakértõjével!"
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Adja meg a kulcs méretét!"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Kérem, adjon \"igen\" vagy \"nem\" választ!"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Adja meg a szükséges értéket, ahogy a prompt mutatja!\n"
+"Lehetséges ISO dátumot is beírni (ÉÉÉÉ-HH-NN), de nem fog rendes\n"
+"hibaüzenetet kapni, hanem a rendszer megpróbálja az értéket\n"
+"intervallumként értelmezni."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Adja meg a kulcs tulajdonosának a nevét!"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "Kérem, adjon meg egy opcionális, de nagyon ajánlott e-mail címet!"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Kérem, adjon meg egy opcionális megjegyzést!"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  név változtatása\n"
+"M  megjegyzés változtatása\n"
+"E  e-mail változtatása\n"
+"R  kulcsgenerálás folytatása\n"
+"Q  kilépés a kulcsgenerálásból"
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+"Válaszoljon \"igen\"-nel (vagy csak \"i\"-vel), ha kezdhetjük az alkulcs\n"
+"létrehozását!"
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Mielõtt aláír egy felhasználói azonosítót egy kulcson, ellenõriznie kell,\n"
+"hogy a kulcs a felhasználói azonosítóban megnevezett személyhez tartozik.\n"
+"Mások számára hasznos lehet, ha tudják, hogy milyen gondosan ellenõrizte\n"
+"Ön ezt.\n"
+"\n"
+"\"0\" azt jelenti, hogy nem tesz az ellenõrzés gondosságára vonatkozó\n"
+"    kijelentést.\n"
+"\n"
+"\"1\" azt jelenti, hogy Ön hiszi, hogy a kulcs annak a személynek a\n"
+"    tulajdona, aki azt állítja, hogy az övé, de Ön nem tudta ezt\n"
+"    ellenõrizni, vagy egyszerûen nem ellenõrizte ezt. Ez hasznos egy\n"
+"    \"persona\" típusú ellenõrzéshez, mikor Ön egy pszeudonim felhasználó\n"
+"    kulcsát írja alá.\n"
+"\n"
+"\"2\" azt jelenti, hogy Ön a kulcsot hétköznapi alapossággal ellenõrizte.\n"
+"    Például ez azt jelentheti, hogy ellenõrizte a kulcs ujjlenyomatát, és\n"
+"    összevetette a kulcson szereplõ felhasználóazonosítót egy fényképes\n"
+"    igazolvánnyal.\n"
+"\n"
+"\"3\" azt jelenti, hogy alaposan ellenõrizte a kulcsot. Például ez azt\n"
+"    jelentheti, hogy a kulcs ujjlenyomatát a tulajdonossal személyesen\n"
+"    találkozva ellenõrizte, egy nehezen hamisítható, fényképes "
+"igazolvánnyal\n"
+"    (mint az útlevél) meggyõzõdött arról, hogy a személy neve egyezik a\n"
+"    kulcson levõvel, és végül (e-mail váltással) ellenõrizte, hogy a "
+"kulcson\n"
+"    szereplõ e-mail cím a kulcs tulajdonosához tartozik.\n"
+"\n"
+"A 2-es és 3-as szintekhez adott példák *csak* példák. Végsõ soron Ön dönti\n"
+"el, hogy mit jelentenek Önnek a \"hétköznapi\" és \"alapos\" kifejezések,\n"
+"amikor mások kulcsát aláírja.\n"
+"\n"
+"Ha nem tudja, hogy mit válaszoljon, írjon \"0\"-t!"
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+"Válaszoljon \"igen\"-nel, ha az ÖSSZES felhasználóazonosítót alá akarja írni!"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Válaszoljon \"igen\"-nel, ha valóban törölni akarja ezt a "
+"felhasználóazonosítót!\n"
+"Minden igazolás törlõdik vele együtt!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Válaszoljon \"igen\"-nel, ha az alkulcs törölhetõ."
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Ez egy érvényes aláírás a kulcson. Normál esetben nincs értelme\n"
+"törölni, mert fontos lehet ahhoz, hogy érvényesítse ezt a kulcsot,\n"
+"vagy egy másikat, melyet ezzel a kulccsal igazolnak."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Ezt az aláírást nem tudom ellenõrizni, mert nincs meg a hozzá tartozó\n"
+"kulcs. Ajánlatos lenne elhalasztani a törlést addig, amíg meg nem tudja,\n"
+"hogy melyik kulcsot használták, mert ez az aláíró kulcs bizalmi\n"
+"kapcsolatot hozhat létre egy már hitelesített kulcson keresztül."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "Ez az aláírás nem érvényes. Értelmetlen eltávolítani a kulcskarikáról."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Ez egy olyan aláírás, amely összeköti a felhasználóazonosítót\n"
+"a kulccsal. Általában nem jó ötlet egy ilyen aláírást eltávolítani.\n"
+"Az is lehetséges, hogy a GnuPG többé nem tudja használni ezt\n"
+"a kulcsot. Csak akkor tegye ezt, ha valami okból ez az önaláírás nem\n"
+"érvényes, és rendelkezésre áll egy másik!"
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Lecseréli az összes felhasználóazonosítóhoz (vagy csak a kijelöltekhez)\n"
+"tartozó preferenciákat az aktuális preferenciákra. Minden érintett\n"
+"önaláírás idõpontját egy másodperccel növeli.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Kérem, adja meg a jelszót! Ezt egy titkos mondat. \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Kérem, ismételje meg az elõzõ jelszót ellenõrzésképpen!"
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Adja meg az állomány nevét, melyhez az aláírás tartozik!"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Válaszoljon \"igen\"-nel, ha felülírható az állomány!"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Kérem, adjon meg egy új fájlnevet! Ha RETURN-t/ENTER-t nyom, akkor\n"
+"a szögletes zárójelben levõ alapértelmezett nevet használom."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Ajánlatos megadni a visszavonás okát. A helyzettõl függõen válasszon\n"
+"a következõ listából:\n"
+"  \"A kulcs kompromittálódott.\"\n"
+"      Használja ezt akkor, ha oka van azt hinni, hogy titkos kulcsa\n"
+"      illetéktelen kezekbe került!\n"
+"  \"A kulcsot lecserélték.\"\n"
+"      Használja ezt akkor, ha a kulcsot lecserélte egy újabbra!\n"
+"  \"A kulcs már nem használatos.\"\n"
+"      Használja ezt akkor, ha már nem használja a kulcsot!\n"
+"  \"A felhasználóazonosító már nem érvényes.\"\n"
+"      Használja ezt akkor, ha azt állítja, hogy a felhasználóazonosító\n"
+"      már nem használatos! Általában érvénytelen e-mail címet jelent.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Ha akarja, megadhat egy szöveget, melyben megindokolja, hogy miért\n"
+"adta ki ezt a visszavonó igazolást. Kérem, fogalmazzon tömören!\n"
+"Egy üres sor jelzi a szöveg végét.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Nem áll rendelkezésre segítség."
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Nem áll rendelkezésre segítség \"%s\" témához."
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "bizalmi adatbázis frissítése"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "A nyilvános kulcs nem passzol a titkos kulcshoz!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "használhatatlan titkos kulcs"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "%d típusú blokkot kihagyom.\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "Eddig %lu kulcsot dolgoztam fel.\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "     Összesen feldolgoztam: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "       új kulcsok kihagyva: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "    felh. azonosító nélkül: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                importálva: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "               változatlan: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "       új felh. azonosítók: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "              új alkulcsok: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "              új aláírások: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "     új kulcsvisszavonások: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "   olvasott titkos kulcsok: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  importált titkos kulcsok: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "változatlan titkos kulcsok: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "             nem importált: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "              új aláírások: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "   olvasott titkos kulcsok: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Ön aláírta a következõ felhasználóazonosítókat:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s aláírás, %s kivonatoló algoritmus.\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "%08lX kulcs: Nincs felhasználói azonosító.\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "%08lX kulcs: HKP alkulcssérülés kijavítva.\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "%08lX kulcs: Nem önaláírt felh. azonosító (\"%s\") elfogadva.\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "%08lX kulcs: Nincs érvényes felhasználói azonosító.\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "Ezt okozhatja egy hiányzó önaláírás.\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "%08lX kulcs: Nyilvános kulcs nem található: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "%08lX kulcs: új kulcs - kihagytam.\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "Nem írható kulcskarikát találtam: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "Írok a \"%s\" állományba.\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "Hiba a \"%s\" kulcskarika írásakor: %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "%08lX kulcs: \"%s\" nyilvános kulcs importálva.\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "%08lX kulcs: Nem egyezik a mi másolatunkkal!\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "%08lX kulcs: Nem találom az eredeti kulcsblokkot: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "%08lX kulcs: Nem tudom beolvasni az eredeti kulcsblokkot: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "%08lX kulcs: \"%s\" 1 új felhasználói azonosító.\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "%08lX kulcs: \"%s\" %d új felhasználói azonosító.\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "%08lX kulcs: \"%s\" 1 új aláírás.\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "%08lX kulcs: \"%s\" %d új aláírás.\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "%08lX kulcs: \"%s\" 1 új alkulcs.\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "%08lX kulcs: \"%s\" %d új alkulcs.\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "%08lX kulcs: \"%s\" %d új aláírás.\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "%08lX kulcs: \"%s\" %d új aláírás.\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "%08lX kulcs: \"%s\" %d új felhasználói azonosító.\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "%08lX kulcs: \"%s\" %d új felhasználói azonosító.\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "%08lX kulcs: \"%s\" nem változott.\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr ""
+"%08lX kulcs: Titkos kulcs érvénytelen (%d) rejtjelezõvel - kihagytam.\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "Nincs alapértelmezett titkoskulcs-karika: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "%08lX kulcs: Titkos kulcs importálva.\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "%08lX kulcs: Már szerepel a titkoskulcs-karikán.\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "%08lX kulcs: Titkos kulcs nem található: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "%08lX kulcs: Nincs nyilvános kulcs - nem tudok visszavonni.\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "%08lX kulcs: Érvénytelen visszavonó igazolás: %s - visszautasítva.\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "%08lX kulcs: \"%s\" visszavonó igazolást importáltam.\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "%08lX kulcs: Nincs felhasználói azonosító ehhez az aláíráshoz!\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"%08lX kulcs: Nem támogatott nyilvános kulcsú alg. a \"%s\" felh. "
+"azonosítón!\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "%08lX kulcs: Érvénytelen önaláírás a \"%s\" felh. azonosítón!\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "%08lX kulcs: Nincs alkulcs a kulcskötéshez!\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "%08lX kulcs: Nem támogatott nyilvános kulcsú algoritmus!\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "%08lX kulcs: Érvénytelen alkulcskötés!\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "%08lX kulcs: Eltávolítottam a többszörös alkulcskötést.\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "%08lX kulcs: Nincs alkulcs a kulcsvisszavonáshoz.\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "%08lX kulcs: Érvénytelen alkulcsvisszavonás.\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "%08lX kulcs: Eltávolítottam a többszörös alkulcsvisszavonást.\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "%08lX kulcs: Kihagytam a felh. azonosítót: '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "%08lX kulcs: Alkulcsot kihagytam.\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "%08lX kulcs: Nem exportálható aláírás (%02x. osztály) - kihagytam.\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "%08lX kulcs: Visszavonó igazolás rossz helyen - kihagytam.\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "%08lX kulcs: Érvénytelen visszavonó igazolás: %s - kihagytam.\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "%08lX kulcs: Alkulcsaláírás rossz helyen - kihagytam.\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "%08lX kulcs: Váratlan aláírásosztály (0x%02X) - kihagytam.\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "%08lX kulcs: Duplázott felh. azonosítót találtam - összefûztem.\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"FIGYELEM: %08lX kulcsot visszavonhatták:\n"
+"lehívom a %08lX visszavonó kulcsot.\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"FIGYELEM: %08lX kulcsot visszavonhatták:\n"
+"visszavonó kulcs (%08lX) nincs jelen.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "%08lX kulcs: \"%s\" visszavonó igazolást hozzáadtam.\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "%08lX kulcs: Kulcsaláírást hozzáadtam.\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "A nyilvános kulcs nem passzol a titkos kulcshoz!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "Kihagytam: titkos kulcs már jelen van.\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "Kihagytam: titkos kulcs már jelen van.\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "Hiba a(z) \"%s\" kulcskarika létrehozásakor: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "\"%s\" kulcskarikát létrehoztam.\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "Hiba \"%s\" létrehozásakor: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "Nem tudtam újraépíteni a kulcskarika cache-ét: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[visszavonás]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[önaláírás]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 rossz aláírás.\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d rossz aláírás.\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 aláírást nem ellenõriztem hiányzó kulcs miatt.\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, 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"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 aláírást nem ellenõriztem hiba miatt.\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d aláírást nem ellenõriztem hiba miatt.\n"
+
+#: g10/keyedit.c:357
+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"
+
+#: g10/keyedit.c:359
+#, 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"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Kérem, döntse el, hogy mennyire bízik meg ebben a felhasználóban,\n"
+"hogy megfelelõen ellenõrzi mások kulcsait (útlevelek ellenõrzésével,\n"
+"különbözõ forrásból származó digitális ujjlenyomatokkal...)!\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = részlegesen megbízom benne\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = teljesen megbízom benne\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "\"%s\" felhasználói azonosítót visszavonták."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Biztos abban, hogy továbbra is alá akarja írni? (i/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Nem tudom aláírni.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "\"%s\" felhasználói azonosító lejárt."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "\"%s\" felhasználóazonosítón nincs önaláírás."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "\"%s\" felhasználóazonosítón nincs önaláírás."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Valóban aláírja? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"\"%s\" önaláírása\n"
+"PGP 2.x stílusú.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Szeretné átalakítani OpenPGP önaláírássá? (i/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Az Ön jelenlegi aláírása a(z) \"%s\"\n"
+"kulcson lejárt.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Szeretne kiadni egy új aláírást, amellyel lecseréli a lejártat? (i/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Az Ön jelenlegi aláírása a(z) \"%s\"\n"
+"kulcson helyi aláírás.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Szeretné átalakítani teljes, exportálható aláírássá? (i/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" már alá lett írva helyileg a %08lX kulccsal!\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" már alá lett írva a %08lX kulccsal!\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Még egyszer alá akarja írni? (i/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nincs mit aláírni a %08lX kulccsal!\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Ez a kulcs lejárt!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Ez a kulcs lejár: %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Szeretné, ha az aláírása ugyanekkor járna le? (I/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Lehet, hogy nem rakhat OpenPGP aláírást egy PGP 2.x kulcsra --pgp2 módban.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Ez használhatatlanná tenné a kulcsot PGP 2.x-ben.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Mennyire gondosan ellenõrizte, hogy a kulcs, melyet aláírni készül, valóban\n"
+"a fent nevezett személyhez tartozik? Ha nem tudja a választ, írjon \"0\"-t!\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Nem válaszolok.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Egyáltalán nem ellenõriztem.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) A szokásos ellenõrzéseket végeztem.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Nagyon alaposan ellenõriztem.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Mi a válasza? (Adjon meg \"?\"-et magyarázathoz!): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Teljesen biztos abban, hogy alá akarja írni ezt a kulcsot\n"
+"az Ön kulcsával: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Ez egy önaláírás lesz.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"FIGYELEM: Az aláírás nem lesz \"nem exportálhatóként\" megjelölve.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"FIGYELEM: Az aláírás nem lesz \"nem visszavonhatóként\" megjelölve.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Az aláírást \"nem exportálhatónak\" jelöljük.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Az aláírást \"nem visszavonhatónak\" jelöljük.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Egyáltalán nem ellenõriztem ezt a kulcsot.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"A szokásos módon ellenõriztem ezt a kulcsot.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Nagyon gondosan ellenõriztem ezt a kulcsot.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Valóban aláírja? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "Aláírás sikertelen: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Ez a kulcs nem védett.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Az elsõdleges kulcs titkos részei nem elérhetõk.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Az elsõdleges kulcs titkos részei nem elérhetõk.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "A kulcs védett.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Nem tudom szerkeszteni ezt a kulcsot: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Írja be az új jelszót ehhez a titkos kulcshoz!\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "Nem ismételte meg helyesen a jelszót! Próbálja újra!"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Ön nem akar jelszót. Ez valószínûleg *rossz* ötlet!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Valóban ezt akarja? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "Átrakom a kulcsaláírást a megfelelõ helyre.\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "mentés és kilépés"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "megmutatja az ujjlenyomatot"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "kilistázza a kulcs- és felhasználóazonosítókat"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "N. felhasználói azonosító kiválasztása"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "N. felhasználói azonosító kiválasztása"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "aláírások visszavonása"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "kulcs helyi aláírása"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Javaslat: Válassza ki az aláírni kívánt felhasználóazonosítókat!\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "felhasználói azonosító hozzáadása"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "fotóazonosító hozzáadása"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "felhasználói azonosító törlése"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "másodlagos kulcs törlése"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "visszavonó kulcs hozzáadása"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Valóban frissíti a kijelölt felhasználóazonosítók preferenciáit? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Nem változtathatja meg egy v3 kulcs lejárati dátumát!\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "felhasználóazonosító megjelölése elsõdlegesként"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "váltás a titkos és a nyilvános kulcs listázása között"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "preferenciák listázása (szakértõ)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "preferenciák listázása (részletes)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Valóban frissíti a kijelölt felhasználóazonosítók preferenciáit? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "Értelmezhetetlen a kulcsszerver URI-ja!\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Valóban frissíti a kijelölt felhasználóazonosítók preferenciáit? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "jelszóváltoztatás"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "kulcstulajdonos megbízhatóságának beállítása"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Valóban visszavonja az összes kijelölt felhasználóazonosítót? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "felhasználói azonosító visszavonása"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "másodlagos kulcs visszavonása"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "kulcs engedélyezése"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "kulcs tiltása"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "fotóazonosító megmutatása"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "Hiba \"%s\" titkoskulcs-blokk olvasásakor: %s.\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Titkos kulcs rendelkezésre áll.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Ehhez szükség van a titkos kulcsra.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Kérem, használja elõbb a \"toggle\" parancsot!\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "A kulcsot visszavonták."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Valóban aláírja az összes felhasználóazonosítót? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Javaslat: Válassza ki az aláírni kívánt felhasználóazonosítókat!\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "ismeretlen aláírásosztály"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Ez a parancs %s módban nem engedélyezett.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Legalább egy felhasználóazonosítót ki kell választania!\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Nem törölheti az utolsó felhasználóazonosítót!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Valóban eltávolítja az összes kijelölt felhasználóazonosítót? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Valóban eltávolítja ezt a felhasználóazonosítót? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Valóban eltávolítja ezt a felhasználóazonosítót? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Legalább egy kulcsot ki kell választania!\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Nem tudom megnyitni a(z) \"%s\" állományt: %s.\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Hiba a(z) \"%s\" kulcskarika létrehozásakor: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Legalább egy kulcsot ki kell választania!\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Valóban törli a kiválasztott kulcsokat? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Valóban törli ezt a kulcsot? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Valóban visszavonja az összes kijelölt felhasználóazonosítót? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Valóban visszavonja ezt a felhasználóazonosítót? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Valóban visszavonja ezt a kulcsot? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Valóban visszavonja a kijelölt kulcsokat? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Valóban visszavonja ezt a kulcsot? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "preferencialista beállítása"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Valóban frissíti a kijelölt felhasználóazonosítók preferenciáit? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Valóban frissítsem a preferenciákat? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Mentsem a változtatásokat? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Kilépjek mentés nélkül? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "Frissítés sikertelen: %s.\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "Titkoskulcs-blokk frissítése sikertelen: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "A kulcs nem változott, nincs szükség frissítésre.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Kivonat: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Jellemzõk: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Jelölés: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Nincsenek preferenciák egy PGP 2.x felhasználóazonosítón!\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Ezt a kulcsot a következõ %s kulcs visszavonhatja: "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Ezt a kulcsot a következõ %s kulcs visszavonhatja: "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (érzékeny)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "%s nem hozható létre: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[visszavont] "
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [lejár: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [lejár: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " bizalom: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " bizalom: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Ez a kulcs tiltott."
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Kérem, vegye figyelembe, hogy az itt látható kulcs érvényessége nem\n"
+"feltétlenül helyes, amíg újra nem indítja a programot!\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[visszavont] "
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"FIGYELEM: Nincs kijelölt elsõdleges felhasználóazonosító. Ez a parancs\n"
+" azt okozhatja, hogy egy másik azonosító lesz elsõdlegesként használva.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"FIGYELEM: Ez egy PGP2 stílusú kulcs. Fotóazonosító hozzáadása azt "
+"okozhatja,\n"
+"          hogy a PGP egyes verziói visszautasítják ezt a kulcsot.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Továbbra is hozzá akarja adni? (i/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Lehet, hogy nem adhat fotóazonosítót egy PGP2 stílusú kulcshoz!\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Törli ezt a jó aláírást? (i/N/k)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Törli ezt az érvénytelen aláírást? (i/N/k)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Törli ezt az ismeretlen aláírást? (i/N/k)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Valóban törli ezt az önaláírást? (i/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Töröltem %d aláírást.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Töröltem %d aláírást.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nem töröltem semmit.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "érvénytelen páncél"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "\"%s\" felhasználói azonosítót visszavonták."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "\"%s\" felhasználói azonosítót visszavonták."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "\"%s\" felhasználói azonosítót visszavonták."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "\"%s\" felhasználói azonosítót már visszavonták.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "\"%s\" felhasználói azonosítót már visszavonták.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"FIGYELEM: Ez egy PGP 2.x stílusú kulcs. Kijelölt visszavonó hozzáadása\n"
+"          azt okozhatja, hogy egyes PGP verziók visszautasítják ezt a "
+"kulcsot!\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"Lehet, hogy nem adhat kijelölt visszavonót egy PGP 2.x-stílusú kulcshoz.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Írja be a kijelölt visszavonó felhasználóazonosítóját: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "Nem adhat meg PGP 2.x stílusú kulcsot kijelölt visszavonónak!\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "Nem adhat meg egy kulcsot saját kijelölt visszavonójának!\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "FIGYELEM: Ezt a kulcsot a kijelölt visszavonó visszavonta!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"FIGYELEM: A kijelölt visszavonó kulcs megadása nem csinálható vissza!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Biztosan ez a kulcs legyen a kijelölt visszavonó? (i/N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Kérem, távolítsa el a kijelöléseket a titkos kulcsokról!\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Maximum egy másodlagos kulcsot jelöljön ki, kérem!\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Másodlagos kulcs lejárati idejének változtatása.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Elsõdleges kulcs lejárati idejének változtatása.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Nem változtathatja meg egy v3 kulcs lejárati dátumát!\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Nincs megfelelõ aláírás a titkoskulcs-karikán.\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "FIGYELEM: %08lX aláíró alkulcs nem kereszthitelesített.\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Kérem, válasszon ki pontosan egy felhasználóazonosítót!\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "Kihagyom a v3 önaláírást a \"%s\" felhasználóazonosítón.\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Biztos abban, hogy használni akarja (i/N)? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Biztos abban, hogy használni akarja (i/N)? "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Aláírás-jelölés: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Felülírjam (i/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Nincs %d indexû felhasználóazonosító!\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Nincs %d indexû felhasználóazonosító!\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Nincs %d indexû felhasználóazonosító!\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "Felhasználóazonosító: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   aláírva %08lX által %s%s%s idõpontban.\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (nem exportálható)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Ez az aláírás lejárt %s idõpontban.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Biztos benne, hogy mégis visszavonja? (i/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Csináljunk egy visszavonó igazolást ehhez az aláíráshoz? (i/N) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Ön aláírta a következõ felhasználóazonosítókat:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (nem exportálható)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   visszavonva %08lX által %s idõpontban.\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "A következõ aláírásokat fogja visszavonni:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Valóban létrehozzam a visszavonó igazolást? (i/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "Nincs titkos kulcs.\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "\"%s\" felhasználói azonosítót már visszavonták.\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"FIGYELEM: A felhasználóazonosítót %d másodperccel a jövõben írták alá.\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "\"%s\" felhasználói azonosítót már visszavonták.\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "\"%s\" felhasználói azonosítót már visszavonták.\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "%s fotóazonosító (méret: %ld, kulcs: 0x%08lX, felh: %d) mutatása.\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "%c%lu preferencia kétszer szerepel!\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "Túl sok \"%c\" preferencia.\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "Túl sok \"%c\" preferencia.\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "Túl sok \"%c\" preferencia.\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Érvénytelen karakter a preferenciák között!\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "Sima aláírást írok.\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "Önaláírást írok.\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "Összefûzõ aláírást írok.\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "Kulcsméret érvénytelen; %u bitet használok.\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "Kulcsméretet felkerekítettem %u bitre.\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "adat titkosítása"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (csak titkosítás)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Kérem, adja meg, milyen kulcsot kíván:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA és ElGamal (alapértelmezés)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (csak aláírás)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (csak titkosítás)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (csak titkosítás)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (csak aláírás)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (csak titkosítás)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (csak titkosítás)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "A DSA kulcspár 1024 bites lesz.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Milyen kulcsméretet szeretne? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "A kívánt kulcsméret %u bit.\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "Felkerekítve %u bitre.\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Kérem, adja meg, meddig legyen érvényes a kulcs!\n"
+"         0 = a kulcs soha nem jár le\n"
+"      <n>  = a kulcs n napig érvényes\n"
+"      <n>w = a kulcs n hétig érvényes\n"
+"      <n>m = a kulcs n hónapig érvényes\n"
+"      <n>y = a kulcs n évig érvényes\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Kérem, adja meg, meddig legyen érvényes az aláírás!\n"
+"         0 = az aláírás soha nem jár le\n"
+"      <n>  = az aláírás n napig érvényes\n"
+"      <n>w = az aláírás n hétig érvényes\n"
+"      <n>m = az aláírás n hónapig érvényes\n"
+"      <n>y = az aláírás n évig érvényes\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Meddig érvényes a kulcs? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Meddig érvényes az aláírás? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "Érvénytelen érték!\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s soha nem jár le.\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s soha nem jár le.\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s lejár: %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Az aláírás lejár: %s.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Az Ön rendszere nem tud megjeleníteni 2038 utáni dátumokat.\n"
+"Azonban kezelni helyesen tudja õket egészen 2106-ig.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Ez így helyes (i/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Szüksége lesz egy felhasználói azonosítóra a kulcsa azonosításához;\n"
+"a szoftver ezt a teljes névbõl, megjegyzésbõl és e-mail címbõl állítja\n"
+"elõ a következõ formában:\n"
+"    \"Heinrich Heine (a költõ) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Teljes név: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Érvénytelen karakter a névben!\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "A név lehet, hogy nem kezdõdhet számmal!\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "A név legalább 5 karakter kell legyen!\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "E-mail cím: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Ez nem érvényes e-mail cím.\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Megjegyzés: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Érvénytelen karakter a megjegyzésben!\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Ön a(z) %s karakterkódolást használja.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Ön a következõ felhasználói azonosítót választotta:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Kérem, ne rakja az e-mail címet a teljes névbe vagy a megjegyzésbe!\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnMmEeRrKk"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "(N)év, (M)egjegyzés, (E)-mail megváltoztatása vagy (K)ilépés? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+"(N)év, (M)egjegyzés, (E)-mail megváltoztatása vagy (R)endben/(K)ilépés? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Kérem, elõbb javítsa ki a hibát!\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Nagyon sok véletlen bájtra van szükségünk. Jó ötlet, ha csinál valami\n"
+"egyéb mûveletet (gépel a billentyûzeten, mozgatja az egeret, használja\n"
+"a lemezeket) a prímszám generálása alatt. Ez segíti a véletlenszám-\n"
+"generátort, hogy entrópiát tudjon gyûjteni.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Kulcs létrehozása megszakítva.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "Írom a kulcsot a %s állományba.\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "Írom a titkos kulcsot a %s állományba.\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "Nem írható nyilvánoskulcs-karikát találtam: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "Nem írható titkoskulcs-karikát találtam: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "Hiba a(z) \"%s\" nyilvánoskulcs-karika írásakor: %s.\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "Hiba a(z) \"%s\" titkoskulcs-karika írásakor: %s.\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "A nyilvános és titkos kulcsokat létrehoztam és aláírtam.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Ez a kulcs nem használható titkosításra. Ha egy másodlagos kulcsot\n"
+"kíván ilyen célra létrehozni, azt az \"--edit-key\" parancs segítségével\n"
+"teheti meg.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Kulcsgenerálás sikertelen: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in 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"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in 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"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"MEGJEGYZÉS: Alkulcsok létrehozása v3 kulcsokhoz nem OpenPGP-megfelelõ.\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Valóban létrehozzam? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "A kulcsblokk törlése sikertelen: %s.\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "Nem tudom létrehozni a(z) \"%s\" állományt: %s.\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "MEGJEGYZÉS: %08lX titkos kulcs %s-kor lejárt.\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "soha      "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kritikus aláírási eljárásmód: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Aláírási eljárásmód: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Kritikus aláírás-jelölés: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Aláírás-jelölés: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Kulcskarika"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Elsõdlegeskulcs-ujjlenyomat:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "         Alkulcsujjlenyomat:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "Elsõdlegeskulcs-ujjlenyomat:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "         Alkulcsujjlenyomat:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr " Kulcs ujjlenyomata ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "Páncélozás nem sikerült: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "FIGYELEM: 2 bizalmas információkat tartalmazó állomány van!\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s az eredeti példány.\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s az új példány.\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Kérem, oldja meg ezt a lehetséges biztonsági problémát!\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "Ellenõrzöm a(z) \"%s\" kulcskarikát.\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu kulcsot ellenõriztem (%lu aláírással).\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: Kulcskarikát létrehoztam.\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "A megadott aláírási eljárásmód URL-je érvénytelen!\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"FIGYELEM: \"%s\" opciói csak a következõ futáskor lesznek érvényesek!\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "Érvénytelen export opciók!\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "\"%s\" kulcs nem található: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "\"%s\" kulcs nem található: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"Aláírva az Ön %08lX kulcsával %s idõpontban.\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "Keresem \"%s\"-t a %s HKP szerveren.\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "Érvénytelen export opciók!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "kulcsszerverhiba"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "kulcsszerverhiba"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "Vétel a kulcsszerverrõl sikertelen: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr ""
+"FIGYELEM: Nem tudom törölni az (\"%s\") átmeneti állományt: \"%s\": %s.\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "Lekérem a %08lX kulcsot a %s kulcsszerverrõl.\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr ""
+"FIGYELEM: Nem tudom törölni az (\"%s\") átmeneti állományt: \"%s\": %s.\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr ""
+"FIGYELEM: Nem tudom törölni az (\"%s\") átmeneti állományt: \"%s\": %s.\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "Furcsa méretû (%d) titkosított munkafolyamatkulcs.\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s titkosított munkafolyamatkulcs\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "Ismeretlen algoritmussal (%d) titkosítva.\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "Nyilvános kulcs: %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "Nyilvános kulccsal titkosított adat: jó DEK.\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "Titkosítva %u bites %s kulccsal, azonosító: %08lX, létrehozva: %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "               azaz \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "Titkosítva %s kulccsal, azonosító: %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "Nyilvános kulcsú visszafejtés sikertelen: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "%lu jelszóval rejtjelezve\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "1 jelszóval rejtjelezve\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "%s titkosított adatot feltételezek.\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"IDEA rejtjelezõ nem áll rendelkezésre, optimista módon megpróbálok\n"
+"%s-t használni helyette.\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "Visszafejtés rendben.\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "FIGYELEM: Az üzenetet nem látták el integritásvédelemmel.\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "FIGYELEM: A titkosított üzenetet manipulálták!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "Visszafejtés sikertelen: %s.\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "MEGJEGYZÉS: A feladó kérése: \"csak az Ön szemeinek\".\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "Eredeti fájlnév: '%.*s'.\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"Különálló visszavonás. Használja a \"gpg --import\"-ot az alkalmazásához!\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Jó aláírás a következõtõl: \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "Aláírás-ellenõrzés elnyomva.\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "Nem tudom kezelni ezeket a többszörös aláírásokat!\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Az aláírás lejárt: %s.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "               azaz \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Aláírva: %.*s; kulcs: %s, %08lX.\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Kulcs található: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "ROSSZ aláírás a következõtõl: \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Lejárt aláírás a következõtõl: \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Jó aláírás a következõtõl: \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[bizonytalan]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "               azaz \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Az aláírás lejárt: %s.\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Az aláírás lejár: %s.\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s aláírás, %s kivonatoló algoritmus.\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "Bináris"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "Szövegmódú"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "Ismeretlen módú"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Nem tudom ellenõrizni az aláírást: %s.\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "Nem különálló aláírás.\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "FIGYELEM: Többszörös aláírást érzékeltem. Csak az elsõt ellenõrzöm.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "0x%02x osztályú különálló aláírás.\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "Régi stílusú (PGP 2.x) aláírás.\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "Érvénytelen gyökércsomagot találtam a proc_tree() függvényben!\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "Nem tudom letiltani a core fájlokat: %s.\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "Nem tudom megnyitni az állományt: %s.\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "Bizalmi adatbázis: olvasás sikertelen (n=%d): %s.\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "Nem tudom kezelni a(z) %d. számú nyilvános kulcsú algoritmust!\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "nem megvalósított rejtjelezõ algoritmus"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s aláírás, %s kivonatoló algoritmus.\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"%s (%d) kivonatoló algoritmus használatának erõltetése ellentétes\n"
+"a címzett preferenciáival.\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "Az IDEA rejtjelezõ bõvítés nincs jelen!\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = további információkat kérek\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: Elavult opció: \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "FIGYELEM: \"%s\" elavult opció!\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "Kérem, ezt használja helyette: \"%s%s\"\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "FIGYELEM: \"%s\" elavult opció!\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "tömörítetlen"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "tömörítetlen"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "Lehet, hogy ez az üzenet használhatatlan a %s számára!\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "Az opciókat a \"%s\" állományból olvasom.\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "Ismeretlen alapértelmezett címzett: \"%s\"\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "\"%s\" állomány létezik. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Felülírjam (i/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: ismeretlen végzõdés.\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Írja be az új állománynevet"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "Írok a szabványos kimenetre.\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "Azt feltételezem, hogy az aláírt adat a %s állományban van.\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "\"%s\" új konfigurációs állományt létrehoztam.\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"FIGYELEM: \"%s\" opciói csak a következõ futáskor lesznek érvényesek!\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: Könyvtárat létrehoztam.\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "Nem tudom kezelni a(z) %d. számú nyilvános kulcsú algoritmust!\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"FIGYELEM: A rejtjelezett munkafolyamat-kulcs lehet, hogy nem biztonságos!\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "A %d típusú alcsomag kritikus bitje beállított.\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "GPG ügynök nem elérhetõ ebben a munkafolyamatban.\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "Nem megfelelõ formájú GPG_AGENT_INFO környezeti változó!\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "%d gpg-agent protokollverzió nem támogatott!\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "Nem tudok kapcsolódni \"%s\" objektumhoz: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "Probléma van az ügynökkel. Letiltom a használatát.\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr ""
+" \n"
+"  (fõ kulcsazonosító: %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Most meg kell adnia a jelszót, mellyel a következõ felhasználó\n"
+"titkos kulcsa használatba vehetõ:\n"
+"\"%.*s\"\n"
+"%u bites %s key, azonosító: %08lX, létrehozva: %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Ismételje meg a jelszót!\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Írja be a jelszót!\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "A felhasználó megszakította a mûveletet.\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "Nem tudok jelszót bekérni kötegelt módban!\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Írja be a jelszót: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Jelszóra van szüksége a következõ felhasználó titkos kulcsának "
+"használatához:\n"
+"\""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u bites %s kulcs, azonosító: %08lX, létrehozva: %s."
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Ismételje meg a jelszót: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Válasszon egy képet a fotóazonosítójához! A kép JPEG formátumú legyen!\n"
+"Emlékeztetjük, hogy a kép a nyilvános kulcsában tárolódik. Ha nagyon nagy\n"
+"képet használ, a kulcsa is nagyon nagy lesz!\n"
+"A 240x288 körüli képméret jól használható.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Adja meg egy JPEG fájl nevét a fotóazonosítóhoz: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "Nem tudom megnyitni az állományt: %s.\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Biztos abban, hogy használni akarja (i/N)? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" nem JPEG állomány.\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Ez a fotó megfelelõ (i/N/k)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "Nem tudom megjeleníteni a fotóazonosítót!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Nincs megadva ok."
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "A kulcsot lecserélték."
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "A kulcs kompromittálódott."
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "A kulcs már nem használatos."
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "A felhasználói azonosító már nem érvényes."
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "Visszavonás oka: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "Megjegyzés a visszavonáshoz: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iIfFkKhH"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Nincs megbízhatósági érték rendelve:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "               azaz \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Ez a kulcs valószínûleg a jelzett tulajdonoshoz tartozik.\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Nem tudom\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = NEM bízom benne\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = alapvetõen megbízom benne\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " f = visszatérés a fõmenübe\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " h = kulcs kihagyása\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " k = kilépés\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Mit választ? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Tényleg be akarja állítani ezt a kulcsot alapvetõen megbízhatóra? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Alapvetõen megbízható kulcshoz vezetõ igazolások:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Semmi jele, hogy ez a kulcs a megadott tulajdonoshoz tartozik.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Semmi jele, hogy ez a kulcs a megadott tulajdonoshoz tartozik.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Ez a kulcs valószínûleg a jelzett tulajdonoshoz tartozik.\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Ez a kulcs hozzánk tartozik.\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NEM biztos, hogy a kulcs a felhasználói azonosítóban szereplõ\n"
+"személyhez tartozik. Ha Ön *valóban* tudja, hogy mit csinál,\n"
+"a következõ kérdésre válaszolhat igennel.\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Mégis használjuk ezt a kulcsot? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "FIGYELEM: Nem bízunk a kulcsban, amit használunk!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "FIGYELEM: a kulcsot visszavonhatták (visszavonó kulcs nincs jelen).\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "FIGYELEM: Ezt a kulcsot a kijelölt visszavonó visszavonta!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "FIGYELEM: Ezt a kulcsot a tulajdonosa visszavonta!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Ez jelentheti azt, hogy az aláírás hamis.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "FIGYELEM: Ezt az alkulcsot a tulajdonosa visszavonta!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Megjegyzés: Ez a kulcs le lett tiltva.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Megjegyzés: Ez a kulcs lejárt!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "FIGYELEM: Ez a kulcs nincs hitelesítve megbízható aláírással!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"          Semmi jele, hogy ez a kulcs a megadott tulajdonoshoz tartozik.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "FIGYELEM: NEM bízunk ebben a kulcsban!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Az aláírás valószínûleg HAMIS.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"FIGYELEM: Ez a kulcs nincs igazolva kellõképpen megbízható aláírással!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Nem biztos, hogy az aláírás a tulajdonoshoz tartozik.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: kihagyva: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: kihagyva: nyilvános kulcs már szerepel\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Adja meg a felhasználói azonosítót! Üres sorral fejezze be: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Nincs ilyen felhasználói azonosító.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr ""
+"Kihagyva: Nyilvános kulcs már be lett állítva alapértelmezett címzettnek.\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Nyilvános kulcs nincs engedélyezve.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "Kihagyva: Nyilvános kulcs már be lett állítva.\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "Ismeretlen alapértelmezett címzett: \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: Kihagyva: Nyilvános kulcs nincs engedélyezve.\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "Nincsenek érvényes címzettek!\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "Hiba \"%s\" létrehozásakor: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Különálló aláírás.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Kérem, adja meg az adatállomány nevét: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "Olvasom a szabványos bemenetet...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "Nincs aláírt adat.\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "Nem tudom megnyitni a(z) \"%s\" aláírt adatot!\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "Anonim címzett. A %08lX titkos kulcsot próbálom...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "Rendben, mi vagyunk az anonim címzett.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "A DEK régi kódolása nem támogatott.\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "A %d%s rejtjelezõ algoritmus ismeretlen vagy tiltott.\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "MEGJEGYZÉS: %d rejtjelezõ algoritmus nincs a preferenciák között.\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "MEGJEGYZÉS: %08lX titkos kulcs %s-kor lejárt.\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "MEGJEGYZÉS: A kulcsot visszavonták."
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet sikertelen: %s.\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "%08lX kulcs: Nincs felhasználói azonosító.\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Visszavonja:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Ez egy érzékeny visszavonó kulcs.)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Csináljunk egy visszavonó igazolást ehhez a kulcshoz? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "ASCII-páncélozott kimenet kiválasztva.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet sikertelen: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Visszavonó igazolás létrehozva.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "Nem találtam visszavonó kulcsot a következõhöz: \"%s\".\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "\"%s\" titkos kulcs nem található: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "Nincs hozzá tartozó nyilvános kulcs: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "A nyilvános kulcs nem passzol a titkos kulcshoz!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Csináljunk egy visszavonó igazolást ehhez a kulcshoz? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "Ismeretlen védelmi algoritmus!\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "MEGJEGYZÉS: Ez a kulcs nem védett.\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"A visszavonó igazolást létrehoztam.\n"
+"\n"
+"Kérem, tegye olyan helyre, ahol más nem fér hozzá! Ha valaki megszerzi\n"
+"ezt az igazolást, használhatatlanná teheti vele az Ön kulcsát. Okos dolog\n"
+"kinyomtatni és megõrizni ezt az igazolást, arra az esetre, ha az\n"
+"adathordozó olvashatatlanná válik. De vigyázat: az Ön gépének nyomtatási\n"
+"rendszere is tárolhatja az adatot, és mások esetleg hozzáférhetnek ehhez!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Kérem, válassza ki a visszavonás okát:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Mégsem"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Valószínûleg a(z) %d. lehetõséget akarja választani.)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Adjon meg egy nem kötelezõ leírást! Üres sorral fejezze be:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Visszavonás oka: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Nincs leírás.)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Ez így rendben van? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "Titkos kulcsrészek nem állnak rendelkezésre.\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "%d%s védõ algoritmus nem támogatott.\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "%d%s védõ algoritmus nem támogatott.\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Érvénytelen jelszó. Próbálja újra"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"FIGYELEM: Gyenge kulcsot találtam. Kérem, változtassa meg ismét a jelszót!\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"Elavult, 16 bites ellenõrzõösszeget hozok létre titkos kulcs védelméhez.\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "Gyenge kulcs jött létre. Újrapróbálom.\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"Nem tudom elkerülni a gyenge kulcsot a szimmetrikus titkosítóhoz.\n"
+"%d alkalommal próbáltam!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "FIGYELEM: Aláíráskivonat-konfliktus az üzenetben.\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "FIGYELEM: %08lX aláíró alkulcs nem kereszthitelesített.\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "FIGYELEM: %08lX aláíró alkulcson érvénytelen kereszthitelesítés van.\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second 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"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+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"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "MEGJEGYZÉS: Aláíró kulcs (%08lX) lejárt: %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"Rossz aláírást feltételezek a %08lX kulcstól egy ismeretlen\n"
+"kritikus bit miatt.\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "%08lX kulcs: Nincs alkulcs az alkulcsvisszavonó csomaghoz.\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "%08lX kulcs: Nincs alkulcs az alkulcskötõ aláíráshoz!\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "Nem tehet jelölõadatot a v3-as (PGP 2.x stílusú) aláírásokba!\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "Nem tehet jelölõadatot a v3-as (PGP 2.x stílusú) kulcsaláírásokba!\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"FIGYELEM: Nem tudom kifejteni a %% jeleket a jelölésben (túl hosszú).\n"
+"Kifejtés nélkül használom.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "Nem tehet eljárásmód-URL-t a v3-as (PGP 2.x stílusú) aláírásokba!\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"Nem tehet eljárásmód-URL-t a v3-as (PGP 2.x stílusú) kulcsaláírásokba!\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"FIGYELEM: Nem tudom kifejteni a %% jeleket az eljárásmód URL-ben (túl "
+"hosszú).\n"
+"Kifejtés nélkül használom.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"FIGYELEM: Nem tudom kifejteni a %% jeleket az eljárásmód URL-ben (túl "
+"hosszú).\n"
+"Kifejtés nélkül használom.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "A létrehozott aláírás ellenõrzése sikertelen: %s.\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s aláírás a következõtõl: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"Különálló aláírást PGP 2.x stílusú kulcsokkal csak --pgp2 módban készíthet!\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"%s (%d) kivonatoló algoritmus használatának erõltetése ellentétes\n"
+"a címzett preferenciáival.\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "Aláírom:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"Olvasható szöveget PGP 2.x stílusú kulccsal csak --pgp2 módban írhat alá!\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s titkosítást fogok használni.\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"A kulcs nincs \"nem biztonságosnak\" jelölve,\n"
+"nem tudom a pótló véletlenszám-generátorral használni!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "\"%s\"-t kihagytam: másodpéldány.\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "Kihagytam \"%s\"-t: %s.\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "Kihagytam: titkos kulcs már jelen van.\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"Kihagytam \"%s\"-t: ez egy PGP által létrehozott ElGamal kulcs, amely nem\n"
+"biztonságos aláírásokhoz!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "%lu bizalmi rekord, %d típus: írás sikertelen: %s.\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Meghatározott bizalmi értékek listája, %s.\n"
+"# (Használja a \"gpg --import-ownertrust\" parancsot a visszaállításhoz!)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "Hiba \"%s\" olvasásakor: %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "A sor túl hosszú!\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "Hiba: Érvénytelen ujjlenyomat.\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "bizalmi értékek importja"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "Hiba bizalmi rekord keresésekor: %s.\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "Olvasási hiba: %s.\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "Bizalmi adatbázis: szinkronizáció sikertelen: %s.\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "Bizalmi adatbázis %lu. rekord: lseek sikertelen: %s.\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "Bizalmi adatbázis %lu. rekord: írás sikertelen (n=%d): %s.\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "Bizalmi adatbázis tranzakciója túl nagy.\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "Nem tudom bezárni a(z) \"%s\" állományt: %s.\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: Könyvtár nem létezik!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "Nem tudom létrehozni a(z) \"%s\" állományt: %s.\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "Nem tudom megnyitni %s-t!\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: Nem sikerült verziórekordot létrehoznom: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: Érvénytelen bizalmi adatbázis jött létre.\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: Bizalmi adatbázis létrejött.\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "MEGJEGYZÉS: Bizalmi adatbázis nem írható.\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: Érvénytelen bizalmi adatbázis.\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: Hashtábla létrehozása sikertelen: %s.\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: Hiba a verziórekord frissítésekor: %s.\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: Hiba a verziórekord olvasásakor: %s.\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: Hiba a verziórekord írásakor: %s.\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "Bizalmi adatbázis: lseek sikertelen: %s.\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "Bizalmi adatbázis: olvasás sikertelen (n=%d): %s.\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: Nem bizalmi adatbázis.\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: Verziórekord, rekordszám: %lu.\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: Érvénytelen állományverzió (%d).\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: Hiba szabad rekord olvasásakor: %s.\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: Hiba könyvtárrekord írásakor: %s.\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: Nem sikerült egy rekord nullázása: %s.\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: Nem sikerült egy rekord hozzáadása: %s.\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "Bizalmi adatbázis sérült. Kérem, futtassa: \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "Nem tudok %d karakternél hosszabb szövegsorokat kezelni!\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "A bemeneti sor hosszabb, mint %d karakter.\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "\"%s\" nem egy érvényes hosszú kulcsazonosító.\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "%08lX kulcs: Elfogadva megbízható kulcsként.\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "A(z) %08lX kulcs egynél többször szerepel a bizalmi adatbázisban.\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"%08lX kulcs: Nincs nyilvános kulcs a megbízható kulcshoz - kihagytam.\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "A kulcsot alapvetõen megbízhatónak jelöltem.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "%lu bizalmi rekord, %d kéréstípus: olvasás sikertelen: %s.\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "%lu bizalmi rekord nem a kért típusú (%d).\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[visszavont] "
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[lejárt]     "
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "Ismeretlen módú"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "soha      "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "Nincs szükség a bizalmi adatbázis ellenõrzésére.\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "A bizalmi adatbázis következõ ellenõrzése: %s.\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "Nincs szükség a bizalmi adatbázis ellenõrzésére.\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+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"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "A(z) %08lX nyilvános kulcsot nem találom: %s.\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "Kérem, hajtson végre egy --check-trustdb parancsot!\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "Ellenõrzöm a bizalmi adatbázist.\n"
+
+#: g10/trustdb.c:2095
+#, 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"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "Nem találtam alapvetõen megbízható kulcsot.\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+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"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "%lu bizalmi rekord, %d típus: írás sikertelen: %s.\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"Nem tudom ellenõrizni az aláírást.\n"
+"Ne felejtse el, hogy az aláírást tartalmazó állományt (.sig vagy .asc)\n"
+"kell az elsõ helyre írni a parancssorban!\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "A bemeneti sor (%u) túl hosszú, vagy hiányzik a soremelés.\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "általános hiba"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "ismeretlen csomagtípus"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "ismeretlen verzió"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "ismeretlen nyilvános kulcsú algoritmus"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "ismeretlen kivonatoló algoritmus"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "rossz nyilvános kulcs"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "rossz titkos kulcs"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "rossz aláírás"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "hibás ellenõrzõösszeg"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "rossz jelszó"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "nyilvános kulcs nem található"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "ismeretlen rejtjelezõ algoritmus"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "nem lehet megnyitni a kulcskarikát"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "érvénytelen csomag"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "érvénytelen páncél"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "nincs ilyen felhasználói azonosító"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "titkos kulcs nem áll rendelkezésre"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "rossz titkos kulcs használata"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "nem támogatott"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "rossz kulcs"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "állományolvasási hiba"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "állományírási hiba"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "ismeretlen tömörítõ algoritmus"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "állománymegnyitási hiba"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "állománylétrehozási hiba"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "érvénytelen jelszó"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "nem megvalósított nyilvános kulcsú algoritmus"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "nem megvalósított rejtjelezõ algoritmus"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "ismeretlen aláírásosztály"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "hibás bizalmi adatbázis"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "hibás MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "erõforráshatár"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "érvénytelen kulcskarika"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "rossz igazolás"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "rossz formájú felhasználói azonosító"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "állományzárási hiba"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "állományátnevezési hiba"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "állománytörlési hiba"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "nem várt adat"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "idõbélyeg-konfliktus"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "használhatatlan nyilvános kulcsú algoritmus"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "állomány létezik"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "gyenge kulcs"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "érvénytelen argumentum"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "rossz URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "nem támogatott URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "hálózati hiba"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "nem titkosított"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "nem feldolgozott"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "használhatatlan nyilvános kulcs"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "használhatatlan titkos kulcs"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "kulcsszerverhiba"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Mégsem"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "nem titkosított"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "Nincs aláírt adat.\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "Ez egy programhiba... (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "Talált egy programhibát... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "igen"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "iI"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nem"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "kilépés|kilepes"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "kK"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "FIGYELEM: Nem biztonságos memóriát használunk!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "További információ a http://www.gnupg.org/faq.html címen található.\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "A mûvelet nem lehetséges biztonságos memória nélkül.\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(Lehet, hogy nem a megfelelõ programot használja a feladatra.)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "A DSA 160 bites hash (kivonatoló) algoritmust igényel.\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "További információt a http://www.gnupg.org/why-not-idea.html oldalon "
+#~ "talál.\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "Egy jelölés neve csak nyomtatható karaktereket és szóközt tartalmazhat, "
+#~ "és = jellel kell befejezõdjön.\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "Egy felhasználójelölésnek tartalmaznia kell a \"@\" karaktert!\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "Egy felhasználójelölésnek tartalmaznia kell a \"@\" karaktert!\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "Egy jelölés értékében nem szerepelhet vezérlõkarakter!\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "FIGYELEM: Érvénytelen jelölõ adatot találtam.\n"
+
+#~ msgid "not human readable"
+#~ msgstr "nem olvasható forma"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "opciók beolvasása állományból"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "opciók beolvasása állományból"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [lejár: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "%08lX kulcs: Váratlan aláírásosztály (0x%02X) - kihagytam.\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "Nem tudom végrehajtani a következõ \"%s\"-t: \"%s\": %s.\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "\"%s\" felhasználói azonosítót már visszavonták.\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "Hiba a jelszó létrehozásakor: %s.\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "Rossz jelszó vagy ismeretlen rejtjelezõ algoritmus (%d).\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "Nem tudom beállítani a kliens pid-et az ügynöknek.\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr ""
+#~ "Nem tudom lekérni a szerver olvasási állományleíróját az ügynöknek.\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "Nem tudom lekérni a szerver írási állományleíróját az ügynöknek.\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "Kommunikációs probléma a gpg ügynökkel!\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "A jelszó túl hosszú!\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "Érvénytelen válasz az ügynöktõl!\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "Probléma az ügynökkel: ügynök válasza: 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "N. másodlagos kulcs kiválasztása"
+
+#~ msgid "list signatures"
+#~ msgstr "aláírások kilistázása"
+
+#~ msgid "sign the key"
+#~ msgstr "kulcs aláírása"
+
+#~ msgid "add a secondary key"
+#~ msgstr "másodlagos kulcs (alkulcs) hozzáadása"
+
+#~ msgid "delete signatures"
+#~ msgstr "aláírások törlése"
+
+#~ msgid "change the expire date"
+#~ msgstr "lejárat megváltoztatása"
+
+#~ msgid "set preference list"
+#~ msgstr "preferencialista beállítása"
+
+#~ msgid "updated preferences"
+#~ msgstr "preferenciák frissítése"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Nincs %d indexû másodlagos kulcs!\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key felh-azonosító"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key felh-azonosító"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "különálló aláírás készítése"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "kulcs nem visszavonható aláírása"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "kulcs nem visszavonható helyi aláírása"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "általános hiba"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "kulcsszerverhiba"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "\"%s\" kivonatoló algoritmus csak olvasható ebben a kiadásban\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Most egy új %s kulcspárt hozunk létre.\n"
+#~ "           minimális kulcsméret:  768 bit\n"
+#~ "     alapértelmezett kulcsméret: 1024 bit\n"
+#~ " legnagyobb ajánlott kulcsméret: 2048 bit\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "A DSA csak 512 és 1024 közötti kulcsméretet támogat.\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "Kulcsméret túl kicsi; 1024 a legkisebb megengedett érték RSA-hoz.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "Kulcsméret túl kicsi; 768 a legkisebb megengedett érték.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "Kulcsméret túl nagy; %d a legnagyobb megengedett érték.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "2048-nál nagyobb kulcsméret nem ajánlott, mert a számítások\n"
+#~ "NAGYON sokáig fognak tartani!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Biztos benne, hogy akarja ezt a kulcsméretet? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Rendben, de vegye figyelembe, hogy a támadók a monitorának vagy\n"
+#~ "a billentyûzetének a sugárzását is felhasználhatják!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Nem szabadna kísérleti algoritmusokat használni!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "Ez a rejtjelezõ algoritmus nem ajánlott. Kérem, használjon "
+#~ "szabványosabbat!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "Írok a \"%s\" állományba.\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "Sajnálom, ezt nem tudom megcsinálni kötegelt módban!\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "\"%s\" kulcs nem található: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "Nem tudom létrehozni a(z) \"%s\" állományt: %s.\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "Nem tudom megnyitni az állományt: %s.\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "               azaz \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "%08lX kulcs vissza lett vonva!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "%08lX alkulcs vissza lett vonva!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX kulcs lejárt!\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Ebben a kulcsban NEM bízunk.\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (aláírás és titkosítás)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (csak aláírás)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (aláírás és titkosítás)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (csak titkosítás)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (aláírás és titkosítás)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s-t nem tudom megnyitni: %s.\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "FIGYELEM: \"%s\" üres állomány.\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "Nem tudom megnyitni %s-t: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = részlegesen megbízom benne\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = teljesen megbízom benne\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "Helyileg aláírva az Ön %08lX kulcsával %s idõpontban.\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   aláírva %08lX által %s%s idõpontban.\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: Nem tudom elérni: %s.\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: Nem tudok lock-ot létrehozni.\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: Nem tudok lock-ot csinálni.\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: Nem tudom létrehozni: %s.\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: Nem tudom a könyvtárat létrehozni: %s.\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Ha mégis használni akarja ezt a visszavont kulcsot,\n"
+#~ "válaszoljon \"igen\"-nel!"
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Nem tudom megnyitni a \"%s\" fotót: %s.\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "Nem tudom megnyitni az állományt: %s.\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "Hiba: Hiányzó kettõspont.\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "Hiba: Nincs tulajdonosmegbízhatósági érték.\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr ""
+#~ " \n"
+#~ "  (fõ kulcsazonosító: %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! Alkulcsot visszavonták: %s.\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- Hamis visszavonást találtam!\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? Nem tudom ellenõrizni a visszavonást: %s.\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [lejár: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [lejár: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[visszavont] "
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "%s nem hozható létre: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "FIGYELEM: \"%s\" kivonatoló algoritmus nem része az OpenPGP-nek. Csak "
+#~ "saját felelõsségére használja!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[fájlok]|állományok titkosítása"
+
+#~ msgid "store only"
+#~ msgstr "csak tárolás"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[fájlok]|állományok visszafejtése"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "kulcs aláírása visszavonhatatlanul"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "kulcs aláírása helyileg és visszavonhatatlanul"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "csak a csomagok listázása"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "bizalmi értékek exportja"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "bizalmi adatbázis frissítése felügyelet nélkül"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "sérült bizalmi adatbázis kijavítása"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "páncél eltávolítása állományról vagy bemenetrõl"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "állomány vagy bemenet páncélozása"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NÉV|NÉV használata alapértelmezett címzettként"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "alapért. kulcs haszn. alapért. címzettként"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "ne használja a terminált egyáltalán"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "3-as verziójú aláírások erõltetése"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "ne erõltesse a 3-as verziójú aláírásokat"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "4-es verziójú aláírások erõltetése"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "ne erõltesse a 4-es verziójú aláírásokat"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "mindig használjon MDC-t titkosításkor"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "soha ne használjon MDC-t titkosításkor"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "gpg ügynök használata"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "kötegelt mód: soha nem kérdez"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "igen válasz feltételezése a legtöbb kérdésre"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "nem válasz feltételezése a legtöbb kérdésre"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "kulcskarika hozzáadása a kulcskarikalistához"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "titkoskulcs-karika hozzáadása a listához"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NÉV|NÉV használata alapértelmezett titkos kulcsként"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|GÉPNÉV|kulcsszerver beállítása kulcsok kereséséhez"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NÉV|terminál karakterkódolásának megadása"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[fájl]|állapotinformációk állományba írása"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KULCS|alapvetõen megbízunk ebben a kulcsban"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|fájl|bõvítõ modul betöltése"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "RFC1991-ben leírt mód emulációja"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "opciók OpenPGP módra állítása"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "opciók PGP 2.x módra állítása"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|N. sorszámú jelszómód használata"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NÉV|NÉV kivonatoló algoritmus haszn. jelszavakhoz"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NÉV|NÉV rejtjelezõ algoritmus haszn. jelszavakhoz"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NÉV|NÉV rejtjelezõ algoritmus használata"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NÉV|NÉV kivonatoló algoritmus használata"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|N. sorszámú tömörítõ algoritmus használata"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "titkosított csomagok keyid mezõjének eldobása"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "fotóazonosítók mutatása"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "ne mutassa a fotóazonosítókat"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "parancssor állítása fotóazonosítók megnézéséhez"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "\"%s\" tömörítõalgoritmus csak olvasható ebben a kiadásban.\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "A tömörítõalgoritmus száma %d és %d közé kell essen!\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Nem biztos, hogy ez a kulcs valóban a jelzett tulajdonoshoz\n"
+#~ "tartozik, ennek ellenére elfogadtuk.\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "%c%lu preferencia érvénytelen!\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "%08lX kulcs: nem rfc2440 kulcs - kihagytam.\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "MEGJEGYZÉS: Elgamal elsõdleges kulcsot érzékeltem.\n"
+#~ "Eltarthat egy ideig az importálása.\n"
+
+#~ msgid " (default)"
+#~ msgstr " (alapértelmezés)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "Hiba %s-ra/-re küldéskor: %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "Sikeresen felküldtem %s kulcsszerverre. (Státusz: %u.)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "Nem tudtam felküldeni %s kulcsszerverre. Státusz: %u.\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "Ez a kulcsszerver nem támogatja a --search-keys kapcsolót.\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "Nem tudok keresni a %s kulcsszerveren.\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "%08lX kulcs: Ez egy PGP által létrehozott ElGamal kulcs, mely\n"
+#~ "NEM biztonságos aláírásokhoz!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "%08lX kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy "
+#~ "óraprobléma.)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "%08lX kulcs %lu másodperccel a jövõben készült. (Idõugrás vagy "
+#~ "óraprobléma.)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "A(z) %08lX kulcs alapvetõen megbízhatónak lett jelölve.\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "%08lX Elgamal aláírókulccsal %08lX kulcshoz készült aláírást kihagytam.\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "%08lX kulccsal %08lX Elgamal aláírókulcshoz készült aláírást kihagytam.\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "Vizsgálok a(z) %d. szinten, aláírt=%d tb(-/k/n/r/t/a)=%d/%d/%d/%d/%d/%d.\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Válassza ki a használni kívánt algoritmust!\n"
+#~ "\n"
+#~ "A DSA (más néven DSS) egy digitális aláírási algoritmus, mely kizárólag\n"
+#~ "aláírásokhoz használható. Ez az ajánlott algoritmus, mivel a DSA "
+#~ "aláírások\n"
+#~ "ellenõrzése jóval gyorsabb az ElGamal aláírásokénál.\n"
+#~ "\n"
+#~ "Az ElGamal egy algoritmus, mely aláírásokhoz és titkosításhoz is\n"
+#~ "használható. Az OpenPGP az algoritmus két fajtáját különbözteti meg:\n"
+#~ "egy csak titkosítót, és egy aláírót és titkosítót. Tulajdonképpen ez\n"
+#~ "a kettõ ugyanaz, de néhány paramétert speciálisan kell megválasztani\n"
+#~ "ahhoz, hogy a kulcs biztonságos legyen aláírás-készítéshez. Ez a program\n"
+#~ "megteszi ezt, de más OpenPGP megvalósításoknak nem kötelezõ érteni a\n"
+#~ "az aláíró+titkosító fajtát.\n"
+#~ "\n"
+#~ "Az elsõdleges kulcsnak mindig olyannak kell lenni, amely képes aláírni.\n"
+#~ "Ez az oka annak, hogy a csak titkosító ElGamal kulcs nem szerepel ebben\n"
+#~ "a menüben."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Habár ezek a kulcsok definiáltak az RFC2440-ben, mégsem ajánljuk õket,\n"
+#~ "mert nem támogatottak minden programban, és az ezekkel készült aláírások\n"
+#~ "nagyon hosszúak, és nagyon lassú az ellenõrzésük."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu kulcsot ellenõriztem eddig (%lu aláírással).\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "hiányos kulcs\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "A(z) %08lX kulcs hiányos.\n"
+
+#~ msgid "quit|quit"
+#~ msgstr "kilépés"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (aláírás és titkosítás)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "Ennek az algoritmusnak a használatát csak a GnuPG támogatja. Ezzel\n"
+#~ "a kulccsal Ön nem fog tudni kommunikálni a PGP-t használókkal. Továbbá\n"
+#~ "ez az algoritmus nagyon lassú, és talán nem is olyan biztonságos, mint\n"
+#~ "a többi választható.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Mégis létrehozzam? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "Érvénytelen szimmetrikus kulcsú algoritmust találtam (%d).\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "Ez a kulcsszerver nem teljesen HKP kompatíbilis.\n"
diff --git a/po/id.gmo b/po/id.gmo
new file mode 100644 (file)
index 0000000..ef0c2ed
Binary files /dev/null and b/po/id.gmo differ
diff --git a/po/id.po b/po/id.po
new file mode 100644 (file)
index 0000000..c6af09d
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,7209 @@
+# translation of gnupg-id.po to Indonesian
+# gnupg 1.2.4 (Indonesian)
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+# Tedi Heriyanto <tedi_h@gmx.net>, 1999, 2000, 2001, 2002, 2003, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg-id\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-06-17 16:32+0700\n"
+"Last-Translator: Tedi Heriyanto <tedi_h@gmx.net>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "tidak dapat membuat bilangan prima dengan bit kurang dari %d\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "tidak dapat membuat bilangan prima dengan bit kurang dari %d\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "modul entropi gathering tidak terdeteksi\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "tidak dapat membuka `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "tidak dapat membuka `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "tidak dapat melakukan statistik `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "'%s' bukan file reguler - diabaikan\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "catatan: file random_seed kosong\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "peringatan: ukuran file random_seed tidak valid - tidak dipakai\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "tidak dapat membaca `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "catatan: file random_seed tidak diupdate\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "tidak dapat membuat %s: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "tidak dapat menulis `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "tidak dapat menutup `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "PERINGATAN: menggunakan random number generator yang tidak aman!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Random number generator yang digunakan tidak aman,\n"
+"ia bukanlah RNG yang kuat!\n"
+"\n"
+"JANGAN MENGGUNAKAN DATA YANG DIHASILKAN PROGRAM INI!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Silakan tunggu, entropi sedang dikumpulkan. Lakukan beberapa pekerjaan\n"
+"bila itu tidak akan membosankan anda, karena hal tersebut akan memperbaiki\n"
+"kualitas entropi.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Tidak tersedia cukup byte random. Silakan melakukan aktivitas lain agar\n"
+"memungkinkan SO mengumpulkan lebih banyak entropi! (Perlu %d byte lagi)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "gagal inisialisasi TrustDB: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "gagal membuat kembali cache keyring: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "gagal menghapus keyblok: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "Pengiriman keyserver gagal: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "kesalahan penciptaan passphrase: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "gagal membaca keyblock: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: kesalahan membaca record bebas: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' sudah dikompresi\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "buat sepasang kunci baru"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "gagal inisialisasi TrustDB: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "gagal menghapus keyblok: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Pembuatan kunci gagal: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s signature, algoritma digest %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "tidak ditemukan data OpenPGP yang valid.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armor: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "header armor tidak valid: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "header armor: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "header clearsig tidak valid\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "signature teks bersarang\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "armor tidak terduga:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "dash escaped line tidak valid: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "karakter radix64 tidak valid %02x dilewati\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "eof prematur (tanpa CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "eof prematur (dalam CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC tidak tepat\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "kesalahan CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "eof prematur (dalam Trailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "kesalahan dalam garis trailer\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "tidak ditemukan data OpenPGP yang valid.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armor tidak valid: baris melebihi %d karakter\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"karakter yang dapat dicetak dalam armor - mungkin telah digunakan MTA yang "
+"mengandung bug\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "kunci rahasia tidak tersedia"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "tidak dapat melakukan hal itu dalam mode batch\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Pilihan anda? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Tidak ada alasan diberikan"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "tidak diproses"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "tidak ada kunci publik yang sesuai: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "kesalahan membaca `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "perbarui preferensi"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "Karakter tidak valid dalam string preferensi\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Karakter tidak valid dalam string preferensi\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "kesalahan: fingerprint tidak valid\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "tampilkan fingerprint"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "kesalahan: fingerprint tidak valid\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Pembuatan kunci gagal: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "tidak ditemukan data OpenPGP yang valid.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "kesalahan menulis keyring rahasia `%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Silakan pilih kunci yang anda inginkan:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Signature kadaluwarsa %s\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "  (%d) RSA (hanya enkripsi)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Pilihan tidak valid.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Silakan pilih alasan untuk pembatalan:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "algoritma proteksi tidak dikenal\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Bagian rahasia kunci primer tidak tersedia.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "dilewati: kunci pribadi telah ada\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "berhenti dari menu ini"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "perintah saling konflik\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "tampilkan bantuan"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Kunci tersedia di:"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "ubah tanggal kadaluarsa"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "ubah ownertrust"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "tampilkan fingerprint"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "buat sepasang kunci baru"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Perintah> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "perintah saling konflik\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "perintah saling konflik\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Perintah tidak valid (coba \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "kunci rahasia tidak tersedia"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "gagal menghapus keyblok: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Ulangi passphrase: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "passphrase tidak diulang dengan benar; coba lagi"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "tidak dapat membuka `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output tidak berfungsi untuk perintah ini\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "kunci '%s' tidak ditemukan: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "gagal membaca keyblock: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(kecuali anda menspesifikasikan kunci dengan fingerprint)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "tidak dapat dilakukan dalam mode batch tanpa \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Menghapus kunci ini dari keyring? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Ini adalah kunci rahasia! - Yakin dihapus? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "gagal menghapus keyblok: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informasi ownertrust dihapus\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "terdapat kunci rahasia untuk kunci publik \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "gunakan pilihan \"--delete-secret-key\" untuk menghapusnya.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "kesalahan penciptaan passphrase: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "tidak dapat menggunakan paket simetri ESK karena mode S2K\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "menggunakan cipher %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' sudah dikompresi\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "PERINGATAN: `%s' adalah file kosong\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"anda hanya dapat mengenkripsi ke kunci RSA 2048 bit atau kurang dalam mode --"
+"pgp2\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "Membaca dari `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"tidak dapat menggunakan cipher IDEA untuk semua kunci yang anda enkripsi.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "memaksa cipher simetrik %s (%d) melanggar preferensi penerima\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "memaksa algoritma kompresi %s (%d) melanggar preferensi penerima\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "memaksa cipher simetrik %s (%d) melanggar preferensi penerima\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "anda tidak boleh menggunakan %s saat dalam mode %s.\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s dienkripsi untuk: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s data terenkripsi\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "dienkripsi dengan algoritma tidak dikenal %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"PERINGATAN: pesan dienkripsi dengan kunci lemah dalam cipher simetrik.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "masalah menangani paket terenkripsi\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "tidak ada eksekusi program remote yang didukung\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "tidak dapat membuat direktori `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"pemanggilan program eksternal ditiadakan karena permisi opsi file tidak "
+"aman\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"platform ini membutuhkan file temp ketika memanggil program eksternal\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "tidak dapat mengeksekusi %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "tidak dapat mengeksekusi %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "kesalahan sistem ketika memanggil program eksternal: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "program eksternal berhenti secara tidak natual\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "tidak dapat mengeksekusi program eksternal\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "tidak dapat membaca tanggapan program eksternal: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "PERINGATAN: tidak dapat menghapus file temp (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "PERINGATAN: tidak dapat menghapus direktori temp `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Signature akan ditandai sebagai tidak dapat dibatalkan.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "tidak ditemukan kunci pembatalan untuk `%s'\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "batalkan kunci sekunder"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "kunci rahasia tidak dapat dipakai"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "kunci %08lX: tidak diproteksi - dilewati\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "kunci %08lX: kunci gaya PGP 2.x - dilewati\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "kunci %08lX: signature subkey di tempat yang salah - dilewati\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "gagal inisialisasi TrustDB: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+"PERINGATAN: kunci rahasia %08lX tidak memiliki sebuah checksum SK sederhana\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "PERINGATAN: tidak ada yang diekspor\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Perintah:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[file]|buat signature"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[file]|buat signature teks"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "buat detached signature"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "enkripsi data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "enkripsi hanya dengan symmetric cipher"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "dekripsi data (default)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifikasi signature"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "tampilkan kunci"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "tampilkan kunci dan signature"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "periksa signature kunci"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "tampilkan kunci dan fingerprint"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "tampilkan kunci rahasia"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "buat sepasang kunci baru"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "hapus kunci dari keyring publik"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "hapus kunci dari keyring pribadi"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "tandai kunci"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "tandai kunci secara lokal"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "tandai atau edit kunci"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "buat sertifikat revokasi"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "ekspor kunci"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "ekspor kunci ke key server"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "impor kunci dari key server"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "cari kunci di key server"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "update semua kunci dari keyserver"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "impor/gabung kunci"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "perbarui database trust"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [file]|cetak digest pesan"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Pilihan:\n"
+"  "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "ciptakan output ascii"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAMA|enkripsi untuk NAMA"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "gunakan id-user ini untuk menandai/dekripsi"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|set tingkat kompresi N (0 tidak ada)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "gunakan mode teks kanonikal"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "gunakan sebagai file output"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "detil"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "jangan buat perubahan"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "tanya sebelum menimpa"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Lihat man page untuk daftar lengkap semua perintah dan option)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Contoh:\n"
+"\n"
+" -se -r Bob [file]       tandai dan enkripsi untuk user Bob\n"
+" --clearsign [file]      buat signature berbentuk teks\n"
+" --detach-sign [file]    buat signature detached\n"
+" --list-keys [nama]      tampilkan kunci\n"
+" --fingerprint [nama]    tampilkan fingerprint\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Laporkan bug ke <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Pemakaian: gpg [pilihan] [file] (-h untuk bantuan)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaks: gpg [pilihan] [file]\n"
+"tandai, cek, enkripsi atau dekripsi\n"
+"operasi baku tergantung pada data input\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritma yang didukung:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Pubkey: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cipher: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Kompresi: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "pemakaian: gpg [pilihan] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "perintah saling konflik\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "tanda = tidak ditemukan dalam definisi grup \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "Peringatan: kepemilikan tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "Peringatan: kepemilikan tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "Peringatan: kepemilikan tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "Peringatan: permisi tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "Peringatan: permisi tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "Peringatan: permisi tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "Peringatan: kepemilikan direktori tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "Peringatan: kepemilikan direktori tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "Peringatan: kepemilikan direktori tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "Peringatan: permisi direktori tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "Peringatan: permisi direktori tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "Peringatan: permisi direktori tidak aman pada %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "Item Konfigurasi tidak dikenal \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Tidak ada signature koresponden di ring rahasia\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "URL signature kebijakan yang diberikan tidak valid\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "tampilkan keyring tempat kunci yang dipilih berada"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Tidak ada signature koresponden di ring rahasia\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "CATATAN: file pilihan baku lama `%s' diabaikan\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "CATATAN: tidak ada file pilihan baku `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "file pilihan `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "membaca pilihan dari `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "CATATAN: %s tidak untuk pemakaian normal!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "ekstensi cipher \"%s\" tidak dimuat karena permisi tidak aman\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s bukanlah set karakter yang valid\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s bukanlah set karakter yang valid\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "tidak dapat memparsing URI keyserver\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opsi impor tidak valid\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opsi impor tidak valid\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: opsi impor tidak valid\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "opsi impor tidak valid\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s bukanlah set karakter yang valid\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "URL signature kebijakan yang diberikan tidak valid\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s bukanlah set karakter yang valid\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "tidak dapat menset path exec ke %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: opsi ekspor tidak valid\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "PERINGATAN: program mungkin membuat file core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "PERINGATAN: %s menimpa %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s tidak dibolehkan dengan %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s tidak masuk akal dengan %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent tidak tersedia untuk sesi ini\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"anda hanya dapat membuat signature detached atau clear saat dalam mode --"
+"pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+"anda tidak dapat menandai dan mengenkripsi pada saat bersamaan dalam mode --"
+"pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"anda harus menggunakan file (dan bukan pipe) saat bekerja dengan opsi --"
+"pgpg2\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "mengenkripsi pesan dalam mode --pgp2 membutuhkan cipher IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "algoritma cipher yang dipilih tidak valid\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "algoritma digest yang dipilih tidak valid\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "algoritma cipher yang dipilih tidak valid\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "algoritma sertifikasi digest yang dipilih tidak valid\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed harus lebih dari 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed harus lebih dari 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth harus di antara 1 hingga 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "level cert default tidak valid; harus 0, 1, 2, atau 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "level cert min tidak valid; harus 0, 1, 2, atau 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "CATATAN: mode S2K sederhana (0) tidak dianjurkan\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "mode S2K yang tidak valid; harus 0, 1 atau 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "preferensi baku tidak valid\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "preferensi cipher personal tidak valid\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "preferensi digest personal tidak valid\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "preferensi kompresi personal tidak valid\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s belum dapat dipakai dengan %s\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+"anda tidak boleh menggunakan algoritma cipher \"%s\" saat dalam mode %s.\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+"anda tidak boleh menggunakan algoritma digest \"%s\" saat dalam mode %s.\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+"anda tidak boleh menggunakan algoritma kompresi \"%s\" saat dalam mode %s.\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "gagal inisialisasi TrustDB: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"Peringatan: penerima yang disebutkan (-r) tanpa menggunakan enkripsi public "
+"key \n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [namafile]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [namafile]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "dekripsi gagal: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [namafile]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [namafile]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "anda tidak boleh menggunakan %s saat dalam mode %s.\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [namafile]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [namafile]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [namafile]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "anda tidak boleh menggunakan %s saat dalam mode %s.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [namafile]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [namafile]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [namafile]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id-user"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id-user"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id-user [perintah]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id-user] [keyring]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "Pengiriman keyserver gagal: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "Penerimaan keyserver gagal: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "Ekspor kunci gagal: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "Pencarian keyserver gagal: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "Refresh keyserver gagal: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "gagal dearmoring: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "gagal enarmoring: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritma hash tidak valid `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[namafile]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Teruskan dan ketikkan pesan anda ....\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "URL sertifikasi kebijakan yang diberikan tidak valid\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "URL signature kebijakan yang diberikan tidak valid\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "URL signature kebijakan yang diberikan tidak valid\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "terlalu banyak masukan dalam pk cache - ditiadakan\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[User id tidak ditemukan]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "tidak ada subkey rahasia untuk subkey publik %08lX. diabaikan\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "menggunakan kunci sekunder %08lX bukannya kunci primer %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "kunci %08lX: kunci rahasia tanpa kunci publik - dilewati\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "lebih diam"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "mengambil kunci ini dari keyring"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "buat timestamp konflik hanya sebagai peringatan"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|tulis info status ke FD ini"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Pemakaian: gpgv [opsi] [file] (-h untuk bantuan)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintaks: gpg [options] [files]\n"
+"Periksa signature terhadap kunci terpercaya\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Terserah anda untuk memberi nilai baru di sini; nilai ini tidak akan "
+"diekspor\n"
+"ke pihak ketiga. Kami perlu untuk mengimplementasikan web-of-trust; tidak "
+"ada\n"
+"kaitan dengan (membuat secara implisit) web-of-certificates."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Untuk membuat Web-of-Trust, GnuPG perlu tahu kunci mana yang\n"
+"sangat dipercaya - mereka biasanya adalah kunci yang anda punya\n"
+"akses ke kunci rahasia.  Jawab \"yes\" untuk menset kunci ini ke\n"
+"sangat dipercaya\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "Jika anda ingin menggunakan kunci tidak terpercaya ini, jawab \"ya\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Masukkan ID user penerima pesan."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Secara umum bukan ide baik untuk menggunakan kunci yang sama untuk menandai "
+"dan\n"
+"mengenkripsi.  Algoritma ini seharusnya digunakan dalam domain tertentu.\n"
+"Silakan berkonsultasi dulu dengan ahli keamanan anda."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Masukkan ukuran kunci"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Jawab \"ya\" atau \"tidak\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Masukkan nilai yang diperlukan seperti pada prompt.\n"
+"Dapat digunakan format (YYYY-MM-DD) untuk mengisi tanggal ISO tetapi anda\n"
+"tidak akan mendapat respon kesalahan yang baik - sebaiknya sistem akan\n"
+"berusaha menginterprestasi nilai yang diberikan sebagai sebuah interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Masukkan nama pemegang kunci"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "silakan masukkan alamat email (pilihan namun sangat dianjurkan)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Silakan masukkan komentar tambahan"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  untuk merubah nama.\n"
+"K  untuk merubah komentar.\n"
+"E  untuk merubah alamat email.\n"
+"O  untuk melanjutkan dengan pembuatan kunci.\n"
+"K  untuk menghentikan pembuatan kunci."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Jawab \"ya\" (atau \"y\") jika telah siap membuat subkey."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Ketika anda menandai user ID pada kunci, anda perlu memverifikasi bahwa "
+"kunci\n"
+"milik orang yang disebut dalam user ID.  Ini penting bagi orang lain untuk "
+"tahu\n"
+"seberapa cermat anda memverifikasi ini.\n"
+"\n"
+"\"0\" berarti anda tidak melakukan klaim tentang betapa cermat anda "
+"memverifikasi    kunci.\n"
+"\n"
+"\"1\" berarti anda percaya bahwa kunci dimiliki oleh orang yang mengklaim "
+"memilikinya\n"
+"    namun anda tidak dapat, atau tidak memverifikasi kunci sama sekali.  Hal "
+"ini bergunabagi\n"
+"    verifikasi \"persona\", yaitu anda menandai kunci user pseudonymous\n"
+"\n"
+"\"2\" berarti anda melakukan verifikasi kasual atas kunci.  Sebagai contoh, "
+"halini dapat\n"
+"    berarti bahwa anda memverifikasi fingerprint kunci dan memeriksa user ID "
+"pada kunci\n"
+"    dengan photo ID.\n"
+"\n"
+"\"3\" berarti anda melakukan verifikasi ekstensif atas kunci.  Sebagai "
+"contoh, hal ini\n"
+"    dapat berarti anda memverifikasi fingerprint kunci dengan pemilik kunci\n"
+"    secara personal, dan anda memeriksa, dengan menggunakan dokumen yang "
+"sulit dipalsukan yang memiliki\n"
+"    photo ID (seperti paspor) bahwa nama pemilik kunci cocok dengan\n"
+"    nama user ID kunci, dan bahwa anda telah memverifikasi (dengan "
+"pertukaran\n"
+"    email) bahwa alamat email pada kunci milik pemilik kunci.\n"
+"\n"
+"Contoh-contoh pada level 2 dan 3 hanyalah contoh.\n"
+"Pada akhirnya, terserah anda untuk memutuskan apa arti  \"kasual\" dan "
+"\"ekstensif\"\n"
+"bagi anda ketika menandai kunci lain.\n"
+"\n"
+"Jika anda tidak tahu jawaban yang tepat, jawab \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Jawab \"ya\" jika anda ingin menandai seluruh ID user"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Jawab \"ya\" jika anda benar-benar ingin menghapus ID user ini.\n"
+"Seluruh sertifikat juga akan hilang!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Jawab \"ya\" jika ingin menghapus subkey"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Ini adalah signature valid untuk kunci; anda normalnya tdk ingin menghapus\n"
+"signature ini karena mungkin penting membangun koneksi trust ke kunci atau\n"
+"ke kunci tersertifikasi lain dengan kunci ini."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Signature ini tidak dapat diperiksa karena anda tidak memiliki kunci\n"
+"korespondennya. Anda perlu menunda penghapusannya hingga anda tahu\n"
+"kunci yang digunakan karena kunci penanda ini mungkin membangun suatu\n"
+"koneksi trust melalui kunci yang telah tersertifikasi lain."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Signature tidak valid.  Adalah hal yang masuk akal untuk menghapusnya dari\n"
+"keyring anda"
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Ini adalah signature yang menghubungkan ID pemakai ke kunci. Biasanya\n"
+"bukan ide yang baik untuk menghapus signature semacam itu. Umumnya\n"
+"GnuPG tidak akan dapat menggunakan kunci ini lagi. Sehingga lakukan hal\n"
+"ini bila self-signature untuk beberapa alasan tidak valid dan\n"
+"tersedia yang kedua."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Rubah preferensi seluruh user ID (atau hanya yang terpilih)\n"
+"ke daftar preferensi saat ini.  Timestamp seluruh self-signature\n"
+"yang terpengaruh akan bertambah satu detik.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Silakan masukkan passphrase; ini kalimat rahasia\n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Silakan ulangi passphrase terakhir, sehingga anda yakin yang anda ketikkan."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Beri nama file tempat berlakunya signature"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Jawab \"ya\" jika tidak apa-apa menimpa file"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Silakan masukan nama file baru. Jika anda hanya menekan RETURN nama\n"
+"file baku (yang diapit tanda kurung) akan dipakai."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Anda harus menspesifikasikan alasan pembatalan. Semua ini tergantung\n"
+"konteks, anda dapat memilih dari daftar berikut:\n"
+" \"Key has been compromised\"\n"
+"      Gunakan ini jika anda punya alasan untuk percaya bahwa orang yang "
+"tidak berhak\n"
+"      memiliki akses ke kunci pribadi anda.\n"
+"  \"Key is superseded\"\n"
+"      Gunakan ini bila anda mengganti kunci anda dengan yang baru.\n"
+"  \"Key is no longer used\"\n"
+"      Gunakan ini bila anda telah mempensiunkan kunci ini.\n"
+"  \"User ID is no longer valid\"\n"
+"      Gunakan ini untuk menyatakan user ID tidak boleh digunakan lagi;\n"
+"      normalnya digunakan untuk menandai bahwa alamat email tidak valid "
+"lagi.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Jika anda suka, anda dapat memasukkan teks menjelaskan mengapa anda\n"
+"mengeluarkan sertifikat pembatalan ini. Buatlah ringkas.\n"
+"Baris kosong mengakhiri teks.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Tidak tersedia bantuan"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Tidak tersedia bantuan untuk `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "perbarui database trust"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "kunci publik tidak cocok dengan kunci rahasia!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "kunci rahasia tidak dapat dipakai"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "melewati blok tipe %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu kunci telah diproses\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Jumlah yang telah diproses: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "        lewati kunci baru: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "         tanpa ID user: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "             diimpor: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "            tidak berubah: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "         ID user baru: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "          subkey baru: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "       signature baru: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "  pembatalan kunci baru: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "     kunci rahasia dibaca: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  kunci rahasia diimpor: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " kunci rahasia tidak berubah: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "            tidak diimpor: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "       signature baru: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "     kunci rahasia dibaca: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Anda telah menandai ID user ini:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s signature, algoritma digest %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "kunci %08lX: tidak ada ID user\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "kunci %08lX: subkey HKP yang rusak diperbaiki\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "kunci %08lX: menerima ID user '%s' yang tidak self-signed\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "kunci %08lX: tidak ada ID user yang valid\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "mungkin disebabkan oleh self-signature yang tidak ada\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "kunci %08lX: kunci publik tidak ditemukan: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "kunci %08lX: kunci baru - dilewati\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "tidak ditemukan keyring yang dapat ditulisi: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "menulis ke `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "kesalahan menulis keyring `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "kunci %08lX: kunci publik \"%s\" diimpor\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "kunci %08lX: tidak cocok dengan duplikat kami\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "kunci %08lX: tidak dapat menemukan keyblock orisinal: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "kunci %08lX: tidak dapat membaca keyblok orisinal: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "kunci %08lX: 1 user ID baru \"%s\"\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "kunci %08lX: \"%s\" %d user ID baru\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "kunci %08lX: \"%s\" 1 signature baru\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "kunci %08lX: \"%s\" %d signature baru\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "kunci %08lX: \"%s\" 1 subkey baru\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "kunci %08lX: \"%s\" %d subkey baru\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "kunci %08lX: \"%s\" %d signature baru\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "kunci %08lX: \"%s\" %d signature baru\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "kunci %08lX: \"%s\" %d user ID baru\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "kunci %08lX: \"%s\" %d user ID baru\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "kunci %08lX: \"%s\" tidak berubah\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "kunci %08lX: kunci rahasia dengan cipher tidak valid %d - dilewati\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "tidak ada keyring rahasia baku: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "kunci %08lX: kunci rahasia diimpor\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "kunci %08lX: sudah ada di keyring rahasia\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "kunci %08lX: kunci rahasia tidak ditemukan: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"kunci %08lX: tdk ada kunci publik-tdk dpt mengaplikasikan sertifikat "
+"pembatalan\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "kunci %08lX: sertifikat pembatalan tidak valid: %s - ditolak\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "kunci %08lX: \"%s\" sertifikat pembatalan diimpor\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "kunci %08lX: tidak ada ID user untuk signature\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "kunci %08lX: algoritma publik key tidak didukung pada user id \"%s\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "kunci %08lX: self-signature tidak valid pada user id \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "kunci %08lX: tidak ada subkey untuk key binding\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "kunci %08lX: algoritma publik key tidak didukung\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "kunci %08lX: subkey binding tidak valid\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "kunci %08lX: hapus subkey binding ganda\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "kunci %08lX: tidak ada subkey untuk pembatalan kunci\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "kunci %08lX: pembatalan subkey tidak valid\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "kunci %08lX: hapus pembatalan subkey ganda\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "kunci %08lX: melewati ID user "
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "kunci %08lX: melewati subkey\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "kunci %08lX: signature tidak dapat diekpor (kelas %02x) - dilewati\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "kunci %08lX: sertifikat pembatalan di tempat yang salah - dilewati\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "kunci %08lX: sertifikat pembatalan tidak valid: %s - dilewati\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "kunci %08lX: signature subkey di tempat yang salah - dilewati\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "kunci %08lX: klas signature tidak diharapkan (0x%02x) - dilewati\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "kunci %08lX: terdeteksi ID user duplikat - digabungkan\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"Peringatan: kunci %08lX dapat dibatalkan: mengambil kunci pembatalan %08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"Peringatan: kunci %08lX dapat dibatalkan: kunci pembatalan %08lX tidak ada\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "kunci %08lX: \"%s\" penambahan sertifikat pembatalan\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "kunci %08lX: signature kunci langsung ditambahkan\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "kunci publik tidak cocok dengan kunci rahasia!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "dilewati: kunci pribadi telah ada\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "dilewati: kunci pribadi telah ada\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "kesalahan menulis keyring `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "%s: keyring tercipta\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "kesalahan penciptaan : `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "gagal membuat kembali cache keyring: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[pembatalan]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[self-signature]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 signature yang buruk\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d signature yang buruk\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 signature tidak diperiksa karena tidak ada kunci\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d signature tidak diperiksa karena tidak ada kunci\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 signature tidak diperiksa karena kesalahan\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signature tidak diperiksa karena ada kesalahan\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "terdeteksi 1 ID user tanpa self-signature yang valid\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "terdeteksi ID %d user tanpa self-signature yang valid\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Silakan putuskan seberapa jauh anda percaya user ini untuk\n"
+"secara tepat memverifikasi kunci user lain (dengan melihat pada passpor,\n"
+"memeriksa fingerprint dari berbagai sumber...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Saya cukup percaya\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Saya sangat percaya\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "User ID \"%s\" dibatalkan."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Apakah anda yakin masih ingin menandainya? (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "..Tidak dapat menandai.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "User ID \"%s\" kadaluwarsa."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "User ID \"%s\" bukan self-signed."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "User ID \"%s\" bukan self-signed."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Ditandai? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Self-signature pada \"%s\"\n"
+"adalah signature bergaya PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Anda ingin mempromosikannya ke self-signature OpenPGP ? (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Signature anda saat ini pada \"%s\"\n"
+"telah habis berlaku.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Anda ingin mengeluarkan signature baru untuk menggantikan yang telah habis "
+"berlaku? (y/N)"
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Signature anda saat ini pada \"%s\"\n"
+"adalah signature.lokal \n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Apakah anda ingin menjadikannya signature yang full exportable? (y/N)"
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" Sudah ditandai secara lokal dengan kunci %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" Sudah ditandai dengan kunci %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Apakah anda ingin menandainya lagi? (y/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Tidak ada yang ditandai dengan kunci %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Kunci ini telah berakhir!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Kunci ini akan kadaluarsa pada %s \n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Anda ingin signature anda kadaluarsa pada waktu yang sama? (y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Anda tidak boleh membuat signature OpenPGP pada sebuah kunci PGP 2.x saat "
+"dalam mode --pgp2\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Hal ini akan membuat kunci tidak dapat digunakan dalam PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Sudah seberapa teliti anda memverifikasi kunci yang akan anda gunakan untuk "
+"menandai benar benar milik\n"
+"orang tersebut?  Jika anda tidak tahu jawabannya. masukkan \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Saya tidak akan menjawab.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Saya belum memeriksanya.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Saya telah melakukan pemeriksaan biasa.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Saya telah melakukan pemeriksaan hati-hati.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Pilihan Anda? (berikan '?' untuk informasi lebih lanjut):"
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Apakah anda yakin untuk menandai kunci ini \n"
+"dengan kunci anda: "
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Ini akan jadi self-signature.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Peringatan: Signature akan ditandai sebagai tidak dapat diekspor.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Peringatan: Signature akan ditandai sebagai tidak dapat dibatalkan.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Signature akan ditandai sebagai tidak dapat diekspor.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Signature akan ditandai sebagai tidak dapat dibatalkan.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Saya belum memeriksa kunci ini sama sekali.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Saya telah memeriksa kunci ini.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Saya telah memeriksa kunci ini dengan sangat hati-hati.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Ditandai? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "gagal menandai: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Kunci ini tidak diproteksi.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Bagian rahasia kunci primer tidak tersedia.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Bagian rahasia kunci primer tidak tersedia.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Kunci diproteksi.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Tidak dapat mengedit kunci ini: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Masukkan passphrase baru untuk kunci rahasia ini.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "passphrase tidak diulang dengan benar; coba lagi"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Anda tidak ingin passphrase - bukan ide yang baik!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Apakah anda ingin melakukan hal ini? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "memindahkan signature kunci ke tempat yang tepat\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "simpan dan berhenti"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "tampilkan fingerprint"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "tampilkan kunci dan ID user"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "pilih ID user N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "pilih ID user N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "batalkan signature"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "tandai kunci secara lokal"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Petunjuk: Pilih ID user untuk ditandai\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "tambah sebuah ID user"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "tambah sebuah photo ID"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "hapus ID user"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "hapus kunci sekunder"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "tambah kunci pembatalan"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Perbarui preferensi untuk user ID terpilih?"
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Anda tidak dapat merubah batas waktu kunci v3\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "tandai ID user sebagai primer"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "ubah tampilan kunci rahasia dan publik"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "tampilkan preferensi (ahli)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "tampilkan preferensi (verbose)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Perbarui preferensi untuk user ID terpilih?"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "tidak dapat memparsing URI keyserver\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Perbarui preferensi untuk user ID terpilih?"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "ubah passphrase"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "ubah ownertrust"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Benar-benar hapus seluruh ID user terpilih? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "batalkan sebuah ID user"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "batalkan kunci sekunder"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "aktifkan kunci"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "tiadakan kunci"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "tampilkan photo ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "kesalahan membaca keyblock rahasia `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Kunci rahasia tersedia.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Perlu kunci rahasia untuk melakukan hal ini.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Silakan gunakan dulu perintah \"toogle\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Kunci dibatalkan"
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Tandai ID seluruh user? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Petunjuk: Pilih ID user untuk ditandai\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "kelas signature tidak dikenal"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Perintah ini tidak dibolehkan saat dalam mode %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Anda harus memilih minimum satu ID user.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Anda tidak dapat menghapus ID user terakhir!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Hapus seluruh ID user terpilih? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Hapus ID user ini? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Hapus ID user ini? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Anda harus memilih minimum satu kunci.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "tidak dapat membuka `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "kesalahan menulis keyring `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Anda harus memilih minimum satu kunci.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Anda ingin menghapus kunci terpilih ini? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Anda ingin menghapus kunci ini? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Benar-benar hapus seluruh ID user terpilih? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Benar-benar hapus ID user ini? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Anda ingin membatalkan kunci ini? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Anda ingin membatalkan kunci terpilih ini? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Anda ingin membatalkan kunci ini? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "set daftar preferensi"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Perbarui preferensi untuk user ID terpilih?"
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Update preferensi?"
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Simpan perubahan? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Berhenti tanpa menyimpan? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "gagal memperbarui: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "gagal perbarui rahasia: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Kunci tidak berubah sehingga tidak perlu pembaharuan.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Fitur: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notasi: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Tidak ada preferensi pada user ID bergaya PGP 2.x.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Kunci ini dapat dibatalkan oleh kunci %s"
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Kunci ini dapat dibatalkan oleh kunci %s"
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (sensitive)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "tidak dapat membuat %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[revoked] "
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [berakhir: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [berakhir: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " trust: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " trust: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Kunci ini telah ditiadakan"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Perhatikan bahwa validitas kunci yang ditampilkan belum tentu benar\n"
+"kecuali anda memulai kembali program.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[revoked] "
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"PERINGATAN: Ini adalah kunci bergaya PGP2.  Menambahkan sebuah photo ID "
+"dapat menyebabkan beberapa versi\n"
+"          PGP menolak kunci ini.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Anda tetap ingin menambahkannya? (y/n) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Anda tidak boleh menambahkan sebuah photo ID ke kunci bergaya PGP2 \n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Hapus signature baik ini? (y/T/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Hapus signature tidak valid ini? (y/T/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Hapus signature tidak dikenal ini? (y/T/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Yakin ingin menghapus self-signature ini? (y/T)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Menghapus %d signature.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Menghapus %d signature.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Tidak ada yang dihapus.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "armor tidak valid"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "User ID \"%s\" dibatalkan."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "User ID \"%s\" dibatalkan."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "User ID \"%s\" dibatalkan."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "User ID \"%s\" telah dibatalkan\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "User ID \"%s\" telah dibatalkan\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"PERINGATAN: Ini adalah kunci bergaya PGP2.x.  Menambahkan sebuah revoker "
+"designated dapat\n"
+"............menyebabkan beberapa versi PGP menolak kunci ini.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Anda tidak boleh revoker designated ke kunci bergaya PGP2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Masukkan user ID pihak yang ingin dibatalkan: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"tidak dapat menunjuk kunci bergaya PGP 2.x sebagai pihak yang dibatalkan\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+"anda tidak dapat menunjuk sebuah kunci sebagai pihak yang dibatalkan "
+"sendiri\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "PERINGATAN: Kunci ini telah dibatalkan oleh pihak yang berwenang\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"PERINGATAN: menunjuk sebuah kunci sebagai pihak yang dibatalkan tidak dapat "
+"dilakukan\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Anda yakin ingin menunjuk kunci inin sebagai pihak yang dibatalkan? (y/N):"
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Silakan hapus pilihan dari kunci rahasia.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Silakan pilih maksimum satu kunci sekunder.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Merubah batas waktu untuk kunci sekunder.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Merubah batas waktu untuk kunci primer.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Anda tidak dapat merubah batas waktu kunci v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Tidak ada signature koresponden di ring rahasia\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "PERINGATAN: subkey penandatangan %08lX tidak tersertifikasi silang\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Anda harus memilih minimum satu ID user.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "melewati self-signature v3 pada user id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Apakah anda yakin ingin menggunakannya? (y/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Apakah anda yakin ingin menggunakannya? (y/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notasi signature: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Ditimpa (y/T)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Tidak ada ID user dengan index %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Tidak ada ID user dengan index %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Tidak ada ID user dengan index %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID user: "
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   ditandai oleh %08lX pada %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (tidak dapat diekspor)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Kunci ini akan kadaluarsa pada %s \n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Anda tetap ingin membatalkannya? (y/n) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Membuat sertifikat pembatalan untuk signature ini? (y/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Anda telah menandai ID user ini:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (tidak dapat diekspor)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   dibatalkan oleh %08lX pada %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Anda akan membatalkan signature ini:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Ingin membuat sertifikat pembatalan? (y/T)"
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "tidak ada kunci rahasia\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "User ID \"%s\" telah dibatalkan\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "PERINGATAN: signature user ID bertanggal %d detik di masa depan\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "User ID \"%s\" telah dibatalkan\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "User ID \"%s\" telah dibatalkan\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Menampilkan photo ID %s berukuran %ld untuk kunci 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preferensi %c%lu ganda \n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "terlalu banyak preferensi `%c'\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "terlalu banyak preferensi `%c'\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "terlalu banyak preferensi `%c'\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Karakter tidak valid dalam string preferensi\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "menulis signature direct\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "menulis self signature\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "menulis key binding signature\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "keysize tidak valid; menggunakan %u bit\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "keysize dibulatkan hingga %u bit\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "tandai"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "enkripsi data"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "  (%d) ElGamal (hanya enkripsi)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Silakan pilih kunci yang anda inginkan:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "  (%d) DSA dan ElGamal (baku)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "  (%d) DSA (hanya menandai)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "  (%d) RSA (hanya enkripsi)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "  (%d) ElGamal (hanya enkripsi)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "  (%d) RSA (hanya menandai)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "  (%d) RSA (hanya enkripsi)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "  (%d) RSA (hanya enkripsi)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Keypair DSA akan memiliki 1024 bit.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Keysize yang anda inginkan? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Keysize yang diminta adalah %u bit\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "dibulatkan hingga %u bit\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Silakan spesifikasikan lama kunci tetap valid.\n"
+"       0  = kunci tidak pernah berakhir\n"
+"     <n>  = kunci berakhir dalam n hari\n"
+"     <n>w = kunci berakhir dalam n minggu\n"
+"     <n>m = kunci berakhir dalam n bulan\n"
+"     <n>y = kunci berakhir dalam n tahun\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Silakan spesifikasikan lama signature tetap valid.\n"
+"       0  = signature tidak pernah berakhir\n"
+"     <n>  = signature berakhir dalam n hari\n"
+"     <n>w = signature berakhir dalam n minggu\n"
+"     <n>m = signature berakhir dalam n bulan\n"
+"     <n>y = signature berakhir dalam n tahun\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Kunci valid untuk? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Signature valid untuk? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "nilai yang tidak valid\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s tidak pernah berakhir\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s tidak pernah berakhir\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s berakhir pada %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Signature kadaluarsa pada %s \n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Sistem anda tidak dapat menampilkan tanggal melebihi 2038.\n"
+"Namun, ia dapat menanganinya secara benar hingga 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Benar (y/t)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Anda perlu sebuah User-ID untuk mengidentifikasi kunci anda; software "
+"membuat \n"
+"user-id dari Nama sebenarnya, Komentar dan Alamat email dalam bentuk:\n"
+"  \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nama sebenarnya: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Karakter tidak valid dalam nama\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Nama tidak boleh dimulai dengan digit\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Nama harus berukuran minimum 5 karakter\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Alamat email: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Bukan alamat email yang valid\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Komentar: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Karakter tidak valid dalam komentar\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Anda menggunakan set karakter `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Anda memilih USER-ID ini:\n"
+"   \"%s\"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Jangan menaruh alamat email ke dalam nama sebenarnya atau komentar\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnKkEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Ganti (N)ama, (K)omentar, (E)mail atau (Q)uit? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Ganti (N)ama, (K)omentar, (E)mail atau (O)ke/(Q)uit? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Silakan perbaiki kesalahan ini dulu\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Anda perlu sebuah passphrase untuk melindungi kunci rahasia anda.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Kita perlu membuat banyak byte random. Adalah ide yang baik untuk melakukan\n"
+"aksi lain (mengetik pada keyboard, menggerakkan mouse, memakai disk)\n"
+"selama pembuatan prima; ini akan memberi random number generator kesempatan\n"
+"yang baik untuk memperoleh entropi.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Pembuatan kunci dibatalkan.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "menulis kunci publik ke `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "menulis kunci rahasia ke `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "tidak ditemukan keyring publik yang dapat ditulisi: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "tidak ditemukan keyring rahasia yang dapat ditulisi: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "kesalahan menulis keyring publik `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "kesalahan menulis keyring rahasia `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "kunci publik dan rahasia dibuat dan ditandai.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Perhatikan bahwa kunci ini tidak dapat digunakan untuk enkripsi. Anda \n"
+"mungkin ingin menggunakan perintah \"--edit-key\" untuk membuat kunci kedua "
+"untuk tujuan ini.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Pembuatan kunci gagal: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "CATATAN: membuat subkey bagi kunci-kunci v3 tidak OpenPGP compliant\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Ingin diciptakan? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "gagal menghapus keyblok: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "tidak dapat membuat %s: %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "CATATAN: kunci pribadi %08lX berakhir pada %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "tidak pernah..."
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kebijakan signature kritis: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Kebijakan signature: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notasi signature kritis: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notasi signature: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Keyring"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Fingerprint kunci primer:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Fingerprint subkunci ="
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "     Fingerprint kunci primer ="
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "     Fingerprint subkunci ="
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Fingerprint kunci ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "gagal enarmoring: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "PERINGATAN: terdapat 2 file dengan informasi penting.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s adalah yang tidak berubah\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s adalah yang baru\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Silakan perbaiki kemungkinan lubang keamanan ini\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "memeriksa keyring `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu kunci telah diperiksa (%lu signature)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu kunci telah diperiksa (%lu signature)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: keyring tercipta\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "URL signature kebijakan yang diberikan tidak valid\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "PERINGATAN: opsi dalam `%s' belum aktif selama pelaksanaan ini\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "opsi ekspor tidak valid\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "kunci '%s' tidak ditemukan: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "kunci '%s' tidak ditemukan: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "meminta kunci %08lX dari %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "meminta kunci %08lX dari %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "mencari \"%s\" dari server HKP %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "mencari \"%s\" dari server HKP %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "mencari \"%s\" dari server HKP %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"ditandai dengan kunci anda %08lX pada %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "mencari \"%s\" dari server HKP %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "mencari \"%s\" dari server HKP %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "opsi ekspor tidak valid\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "kesalahan keyserver"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "kesalahan keyserver"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "Penerimaan keyserver gagal: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "meminta kunci %08lX dari %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "meminta kunci %08lX dari %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "PERINGATAN: tidak dapat menghapus file temp (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "PERINGATAN: tidak dapat menghapus file temp (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "ukuran aneh untuk kunci sesi terenkripsi (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s kunci sesi enkripsi\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "dienkripsi dengan algoritma tidak dikenal %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "kunci publik adalah %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "data terenkripsi dengan kunci publik: DEK baik\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "dienkripsi dengan %u-bit kunci %s, ID %08lX, tercipta %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "              alias \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "dienkripsi dengan kunci %s, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "gagal dekripsi kunci publik: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "dienkripsi dengan passphrase %lu\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "dienkripsi dengan 1 passphrase\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "asumsikan %s data terenkripsi\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "Cipher IDEA tidak tersedia, secara optimis berusaha menggunakan %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "dekripsi lancar\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "PERINGATAN: integritas pesan tidak terlindungi\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "PERINGATAN: pesan terenkripsi telah dimanipulasi!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "dekripsi gagal: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "CATATAN: pengirim meminta \"for-your-eyes-only\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "original file name='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "pembatalan mandiri - gunakan \"gpg --import\" untuk mengaplikasikan\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Signature baik dari \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verifikasi signature tidak diabaikan\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "tidak dapat menangani banyak signature ini\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Signature kadaluwarsa %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "              alias \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signature membuat %.*s menggunakan kunci %s ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Kunci tersedia di:"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "signature BURUK dari \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Signature kadaluarsa dari \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Signature baik dari \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[uncertain]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "              alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Signature kadaluwarsa %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Signature kadaluarsa pada %s \n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s signature, algoritma digest %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "biner"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "modeteks"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "tidak dikenal"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Tidak dapat memeriksa signature: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "bukan detached signature\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"PERINGATAN: multi signature terdeteksi. Hanya yang pertama akan diperiksa.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "kelas signature mandiri 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "signature model lama (PGP 2.X)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "terdeteksi root paket tidak valid dalam proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "tidak dapat meniadakan core dump: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "tidak dapat membuka file: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "trustdb: read failed (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "tidak dapat menangani algoritma kunci publik %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "algoritma cipher belum diimplementasikan"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s signature, algoritma digest %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "memaksa algoritma digest %s (%d) melanggar preferensi penerima\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "plugin cipher IDEA tidak tersedia\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = beri saya informasi lebih banyak lagi\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: opsi tidak digunakan lagi \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "WARNING: \"%s\" adalah opsi terdepresiasi\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "silakan gunakan \"%s%s\"\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "WARNING: \"%s\" adalah opsi terdepresiasi\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Tidak dikompresi"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Tidak dikompresi"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "pesan ini mungkin tidak dapat digunakan oleh %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "membaca pilihan dari `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "penerima baku tidak dikenal `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "File `%s' ada. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Ditimpa (y/T)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: suffix tidak dikenal\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Masukkan nama file baru"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "menulis ke stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "mengasumsikan data bertanda dalam `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "file konfigurasi baru `%s' tercipta\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "PERINGATAN: opsi dalam `%s' belum aktif selama pelaksanaan ini\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: direktori tercipta\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "tidak dapat menangani algoritma kunci publik %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "PERINGATAN: kunci sesi mungkin dienkripsi simetris secara tidak aman\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpaket tipe %d memiliki bit kritis terset\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent tidak tersedia untuk sesi ini\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "variabel lingkungan GPG_AGENT_INFO salah bentuk\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "protokol gpg-agent versi %d tidak didukung\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "tidak dapat terkoneksi ke `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "masalah dengan agen - tiadakan penggunaan agen\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (ID kunci utama %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Anda perlu passphrase untuk membuka kunci rahasia untuk user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %08lX, tercipta %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Ulangi passphrase\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Masukkan passphrase\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "dibatalkan oleh user\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "tidak dapat meminta password dalam mode batch\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Masukkan passphrase: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Anda perlu passphrase untuk membuka kunci rahasia untuk\n"
+"pemakai: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bit kunci %s, ID %08lX, tercipta %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Ulangi passphrase: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Silakan pilih sebuah gambar sebagai ID foto anda.  Gambar haruslah file "
+"JPEG.\n"
+"Ingat bahwa gambar disimpan dalam kunci publik anda..  Jika anda menggunakan "
+"sebuah\n"
+"gambar yang sangat besar, kunci anda akan menjadi semakin besar pula!\n"
+"Jagalah agar gambar mendekati ukuran 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Masukkan nama file JPEG sebagai ID foto: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "tidak dapat membuka file: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Apakah anda yakin ingin menggunakannya? (y/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" bukan sebuah file JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Apakah foto ini benar (y/N/q)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "tidak dapat menampilkan photo ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Tidak ada alasan diberikan"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Kunci dilampaui"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Kunci ini telah dikompromikan"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Kunci tidak lagi digunakan"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "ID User tidak lagi valid"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "Alasan pembatalan:"
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "Komentar pembatalan:"
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Tidak ada nilai trust untuk:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "              alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Kunci ini mungkin milik pemiliknya\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Tidak tahu\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d: Saya TIDAK percaya\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Saya sangat percaya sekali\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = kembali ke menu utama\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = lewati kunci ini\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = berhenti\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Keputusan anda? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Anda ingin menset kunci ini menjadi sangat percaya sekali?"
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Sertifikat mengarahkan ke kunci terpercaya:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Tidak ada indikasi bahwa kunci ini benar-benar milik pemiliknya\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Tidak ada indikasi bahwa kunci ini benar-benar milik pemiliknya\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Kunci ini mungkin milik pemiliknya\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Kunci ini milik kita\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Tidak pasti bahwa kunci milik orang yang disebutkan\n"
+"Jika anda sangat tahu apa yang sedang anda lakukan, anda boleh menjawab\n"
+"pertanyaan berikut dengan ya\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Tetap gunakan kunci ini? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "PERINGATAN: Menggunakan kunci tidak dipercaya!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"Peringatan: kunci ini mungkin dibatalkan:(kunci pembatalan tidak ada)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "PERINGATAN: Kunci ini telah dibatalkan oleh pihak yang berwenang\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "PERINGATAN: Kunci ini telah dibatalkan oleh pemiliknya!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "        Hal ini dapat berarti bahwa signature adalah palsu.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "PERINGATAN: Subkey ini telah dibatalkan oleh pemiliknya!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Catatan: Kunci ini telah ditiadakan\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Catatan: Kunci ini telah berakhir!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"PERINGATAN: Kunci ini tidak disertifikasi dengan sig yang terpercaya!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "  Tidak ada indikasi signature milik pemilik.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "PERINGATAN: Kita tidak percaya kunci ini!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "        Signature mungkin palsu.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"PERINGATAN: Kunci tdk disertifikasi dg signature terpercaya yg cukup!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "        Tidak pasti signature milik pemilik.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: dilewati: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: dilewati: kunci publik telah ada\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Anda tidak menspesifikasikan ID user. (anda dapat gunakan \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Masukkan user ID.  Akhiri dengan baris kosong: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Tidak ada ID user tersebut.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "dilewati: kunci publik telah diset sebagai penerima baku\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Kunci publik dimatikan.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "dilewati: kunci publik telah diset\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "penerima baku tidak dikenal `%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: dilewati: kunci publik dimatikan\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "tidak ada alamat yang valid\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "data tidak disimpan; gunakan pilihan \"--output\" untuk menyimpannya\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "kesalahan penciptaan : `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Menghapus signature.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Silakan masukkan nama file data: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "membaca stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "tidak ada data tertandai\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "tidak dapat membuka data tertandai `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "penerima anonim; mencoba kunci rahasia %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "baik, kita adalah penerima anonim.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "encoding lama DEK tidak didukung\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "algoritma cipher %d%s tidak dikenal atau ditiadakan\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "CATATAN: algoritma cipher %d tidak ditemukan dalam preferensi\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "CATATAN: kunci pribadi %08lX berakhir pada %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "CATATAN: kunci telah dibatalkan"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet gagal: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "kunci %08lX: tidak ada ID user\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Akan dibatalkan oleh:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Ini adalah kunci pembatalan sensitif)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Buat sertifikat pembatalan untuk kunci ini?"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Pemaksaan output mode ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "gagal make_keysig_packet: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Sertifikat pembatalan tercipta.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "tidak ditemukan kunci pembatalan untuk `%s'\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "kunci rahasia `%s' tidak ditemukan: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "tidak ada kunci publik yang sesuai: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "kunci publik tidak cocok dengan kunci rahasia!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Buat sertifikat pembatalan untuk kunci ini?"
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "algoritma proteksi tidak dikenal\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "CATATAN: Kunci ini tidak diproteksi!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Sertifikat pembatalan tercipta.\n"
+"\n"
+"Pindahkanlah ke media yang dapat anda sembunyikan; jika Mallory memperoleh\n"
+"akses ke sertifikat ini ia dapat menggunakannya untuk membuat kunci anda\n"
+"tidak dapat digunakan.\n"
+"Adalah hal cerdas untuk mencetak sertifikat ini dan menyimpannya, bila\n"
+"sewaktu-waktu media anda tidak dapat dibaca.  Namun berhati-hatilah:  Sistem "
+"pencetakan\n"
+"mesin anda mungkin menyimpan data dan menyediakannya untuk yang lain!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Silakan pilih alasan untuk pembatalan:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Batal"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Mungkin anda ingin memilih %d di sini)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+"Masukkan sebuah deskripsi opsional; akhiri dengan sebuah baris kosong:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Alasan pembatalan: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Tidak diberikan deskripsi)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Ini oke? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "bagian kunci rahasia tidak tersedia\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "algoritma proteksi %d%s tidak didukung\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "algoritma proteksi %d%s tidak didukung\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Passphrase tidak valid; silakan coba lagi"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "PERINGATAN: terdeteksi kunci lemah - silakan ubah passphrase lagi.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "membuat checksum 16-bit terdepresiasi untuk proteksi kunci rahasia\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "kunci lemah tercipta - mengulang\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"tidak dapat menghindari kunci lemah untuk cipher simetrik; mencoba %d kali!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "Peringatan: konflik digest signature dalam pesan\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "PERINGATAN: subkey penandatangan %08lX tidak tersertifikasi silang\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"PERINGATAN: subkey penanda tangan %08lX memiliki sertifikasi silang yang "
+"tidak valid\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"kunci telah diciptakan dalam %lu detik mendatang (masalah waktu atau jam)\n"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+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"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "CATATAN: kunci signature %08lX berakhir %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"mengasumsikan signature buruk dari kunci %08lX karena ada bit kritik tidak "
+"dikenal\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "kunci %08lX: tidak ada subkey untuk pembatalan paket\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "kunci %08lX: tidak ada subkey untuk key binding signature\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "tidak dapat menaruh notasi data ke signature v3(gaya PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "tidak dapat menaruh notasi data ke kunci signature v3 (gaya PGP 2.x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"PERINGATAN: tidak dapat melakukan %%-expand notasi (terlalu besar).  "
+"Menggunakan yang tidak di-expand.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"tidak dapat menaruh sebuah kebijakan URL ke signature v3 (gaya PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"tidak dapat menaruh sebuah kebijakan URL ke signature v3 (gaya PGP 2.x)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"PERINGATAN: tidak dapat melakukan %%-expand policy url (terlalu besar).  "
+"Menggunakan yang tidak expand.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"PERINGATAN: tidak dapat melakukan %%-expand policy url (terlalu besar).  "
+"Menggunakan yang tidak expand.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "Gagal memeriksa signature yang dibuat: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s signature dari: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"anda hanya dapat detach-sign dengan kunci bergaya PGP 2.x saat dalam mode --"
+"pgp2\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "memaksa algoritma digest %s (%d) melanggar preferensi penerima\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "menandai:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"anda hanya dapat clearsign dengan kunci bergaya PGP 2.x saat dalam mode --"
+"pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s enkripsi akan digunakan\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"kunci tidak dianggap sebagai tidak aman - tidak dapat digunakan dengan RNG "
+"palsu!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "lewati `%s': terduplikasi\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "melewati `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "dilewati: kunci pribadi telah ada\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"melewati `%s': ini adalah kunci ElGamal yang dihasilkan PGP yang tidak aman "
+"untuk signature!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "trust record %lu, tipe %d: gagal menulis: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "kesalahan membaca `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "baris terlalu panjang\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "kesalahan: fingerprint tidak valid\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "impor nilai ownertrust"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "kesalahan: gagal menemukan catatan trust: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "kesalahan pembacaan: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: gagal sync: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: lseek gagal: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: write failed (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transaksi trustdb terlalu besar\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "tidak dapat menutup `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: direktori tidak ada!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "tidak dapat membuat %s: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "tidak dapat membuka `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: gagal membuat catatan versi: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: tercipta trustdb tidak valid\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: tercipta trustdb\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "CATATAN: trustdb tidak dapat ditulisi\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: trustdb tidak valid\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: gagal membuat hashtable: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: kesalahan memperbaharui catatan versi: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: kesalahan membaca catatan versi: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: kesalahan menulis catatan versi: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek gagal: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: read failed (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: bukan file trustdb\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: catatan versi dengan recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versi file %d tidak valid\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: kesalahan membaca record bebas: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: kesalahan menulis dir record: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: gagal mengosongkan record: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: gagal menambahkan record: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "trustdb terkorupsi; silakan jalankan \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "tidak dapat menangani baris teks lebih dari %d karakter\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "baris input lebih dari %d karakter\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "'%s' bukanlah keyID panjang yang valid\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "kunci %08lX: diterima sebagai kunci terpercaya.\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "kunci %08lX muncul lebih dari satu kali dalam trustdb\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "kunci %08lX: tidak ada kunci publik untuk trusted key- dilewati\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "kunci ditandai sebagai sangat dipercaya.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "trust record %lu, req tipe %d: gagal baca: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "trust record %lu tidak dalam jenis yang diminta %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[revoked] "
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[expired] "
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "tidak dikenal"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "tidak pernah..."
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "tidak perlu memeriksa trustdb\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "pemeriksaan trustdb berikutnya pada %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "tidak perlu memeriksa trustdb\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "tidak perlu memeriksa trustdb\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "kunci publik %08lX tidak ditemukan: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "lakukanlah --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "memeriksa trustdb\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d kunci diproses (%d hitungan validitas dihapus)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "tidak ditemukan kunci yang benar-benar terpercaya\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "kunci publik yang sangat terpercaya %08lX tidak ditemukan\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "trust record %lu, tipe %d: gagal menulis: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"signature tidak dapat diverifikasi.\n"
+"Tolong ingat bahwa file signature (.sig atau .asc)\n"
+"haruslah file pertama yang diberikan pada perintah baris.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "baris input %u terlalu panjang atau hilang LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "Kesalahan umum"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "tipe paket tidak dikenal"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "versi tidak dikenal"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algoritma pubkey tidak dikenal"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algoritma digest tidak dikenal"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "kunci publik yang buruk"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "kunci rahasia yang buruk"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "signature yang buruk"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "kesalahan checksum"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "passphrase yang buruk"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "kunci publik tidak ditemukan"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algoritma cipher tidak dikenal"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "tidak dapat membuka keyring"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "paket tidak valid"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armor tidak valid"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "tidak ada user id tsb"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "kunci rahasia tidak tersedia"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "digunakan kunci rahasia yang salah"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "tidak didukung"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "kunci yang buruk"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "kesalahan baca file"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "kesalahan tulis file"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritma kompresi tidak dikenal"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "kesalahan buka file"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "kesalahan buat file"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "passphrase tidak valid"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritma pubkey belum diimplementasikan"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritma cipher belum diimplementasikan"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "kelas signature tidak dikenal"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "kesalahan database trust"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI yang buruk"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "batasan sumber daya"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "keyring tidak valid"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "sertifikat yang buruk"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "user id yang tidak benar"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "kesalahan tutup file"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "kesalahan ganti nama file"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "kesalahan hapus file"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "data tidak terduga"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "konflik timestamp"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritma pubkey tidak dapat digunakan"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "file ada"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "kunci lemah"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argumen tidak valid"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI yang buruk"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI tidak didukung"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "kesalahan jaringan"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "tidak dienkripsi"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "tidak diproses"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "kunci publik tidak dapat dipakai"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "kunci rahasia tidak dapat dipakai"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "kesalahan keyserver"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Batal"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "tidak dienkripsi"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "tidak ada data tertandai\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... kesalahan (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "anda menemukan kesalahan ...(%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "y|ya"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "n|t|tidak"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "tT"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "q|k|keluar"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "kK"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "Peringatan: menggunakan memori yang tidak aman!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+"silakan lihat http://www.gnupg.org/faq.html untuk informasi lebih lanjut\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operasi tidak mungkin tanpa menginisialisasi memori yang aman\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(anda mungkin menggunakan program yang salah untuk tugas ini)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA butuh penggunaan algoritma hash 160 bit\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "silakan lihat http://www.gnupg.org/why-not-idea.html untuk informasi "
+#~ "lebih lanjut\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "nama notasi harus hanya terdiri dari karakter yang dapat dicetak atau "
+#~ "spasi, dan diakhiri dengan sebuah '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "nama notasi pengguna tidak boleh mengandung karakter '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "nama notasi pengguna tidak boleh mengandung karakter '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "nilai notasi tidak boleh menggunakan karakter kendali\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "PERINGATAN: ditemukan notasi data tidak valid\n"
+
+#~ msgid "not human readable"
+#~ msgstr "tidak dapat dibaca manusia"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "baca pilihan dari file"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "baca pilihan dari file"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [berakhir: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "kunci %08lX: klas signature tidak diharapkan (0x%02x) - dilewati\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "tidak dapat mengeksekusi %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "User ID \"%s\" telah dibatalkan\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "kesalahan penciptaan passphrase: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "passphrase jelek atau algoritma cipher (%d) tidak dikenal\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "tidak dapat menset pid client untuk agen\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "tidak dapat membuat server membaca FD untuk agen\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "tidak dapat membuat server menulis FD untuk agen\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "masalah komunikasi dengan gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "passphrase terlalu panjang\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "respon tidak valid dari agen\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "masalah dengan agen: agen mengembalikan 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "pilih kunci sekunder N"
+
+#~ msgid "list signatures"
+#~ msgstr "tampilkan signature"
+
+#~ msgid "sign the key"
+#~ msgstr "tandai kunci"
+
+#~ msgid "add a secondary key"
+#~ msgstr "tambah kunci sekunder"
+
+#~ msgid "delete signatures"
+#~ msgstr "hapus signature"
+
+#~ msgid "change the expire date"
+#~ msgstr "ubah tanggal kadaluarsa"
+
+#~ msgid "set preference list"
+#~ msgstr "set daftar preferensi"
+
+#~ msgid "updated preferences"
+#~ msgstr "perbarui preferensi"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Tidak ada kunci sekunder dengan index %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key user-id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key user-id"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "buat detached signature"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "tandai kunci sebagai tidak dapat dibatalkan"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "tandai kunci secara lokal dan tidak dapat dibatalkan"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "bantuan"
+
+#~ msgid "list"
+#~ msgstr "tampilkan"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "Kesalahan umum"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "simpan"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "kunci"
+
+#~ msgid "check"
+#~ msgstr "periksa"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "tandai"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "tandai"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primer"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "kesalahan keyserver"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "algoritma digest `%s' adalah hanya-baca dalam rilis ini\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Akan dibuat satu pasang kunci baru %s.\n"
+#~ "       keysize minimum adalah  768 bit\n"
+#~ "       keysize default adalah 1024 bit\n"
+#~ " keysize tertinggi dianjurkan 2048 bit\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA hanya membolehkan keysize dari 512 hingga 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "keysize terlalu kecil; 1024 adalah nilai terendah yang diijinkan untuk "
+#~ "RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "keysize terlalu kecil; 768 adalah nilai terendah yang diijinkan.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "keysize terlalu besar; %d adalah nilai tertinggi yang diijinkan.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Keysize lebih besar dari 2048 tidak dianjurkan karena\n"
+#~ "komputasi akan sangat lama!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Apakah anda yakin memerlukan keysize ini? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Oke, tetapi ingat bahwa radiasi monitor dan keyboard anda juga sangat "
+#~ "mudah diserang!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Algoritma eksperimental sebaiknya tidak dipakai!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "algoritma cipher ini didepresiasi; silakan gunakan yang lebih standar!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "menulis ke `%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "maaf, tidak dapat melakukan hal ini dalam mode batch\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "kunci '%s' tidak ditemukan: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "tidak dapat membuat %s: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "tidak dapat membuka file: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "              alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "kunci %08lX: kunci telah dibatalkan!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "kunci %08lX: subkey telah dibatalkan!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: kunci telah berakhir\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Kita TIDAK percaya kunci ini\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (tandai dan enkripsi)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "  (%d) RSA (hanya menandai)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (tandai dan enkripsi)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "  (%d) RSA (hanya enkripsi)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (tandai dan enkripsi)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: tidak dapat membuka: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: PERINGATAN: file kosong\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "tidak dapat membuka %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Saya cukup percaya\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Saya sangat percaya\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "ditandai secara lokal dengan kunci anda %08lX pada %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   ditandai oleh %08lX pada %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: tidak dapat mengakses: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: tidak dapat membuat lock\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: tidak dapat membuat lock\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: tidak dapat membuat: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: tidak dapat membuat direktori: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr "Jika anda ingin menggunakan kunci yang dibatalkan, jawab \"ya\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Tidak dapat membuka foto \"%s\":%s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "tidak dapat membuka file: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "kesalahan: kurang tanda titik dua\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "kesalahan: tidak ada nilai ownertrust\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (ID kunci utama %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! subkey telah dibatalkan: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev - ditemukan pembatalan palsu\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? masalah memeriksa pembatalan: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [berakhir: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [berakhir: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[revoked] "
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "tidak dapat membuat %s: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "PERINGATAN: digest `%s' bukan merupakan bagian OpenPGP.  Gunakan dan "
+#~ "tanggung sendiri risikonya!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[files]|enkripsi file"
+
+#~ msgid "store only"
+#~ msgstr "hanya disimpan"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[files]|dekripsi file"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "tandai kunci tidak dapat di-revoke"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "tandai kunci secara lokal dan tidak dapat di-revoke"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "tampilkan hanya urutan paket"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "ekspor nilai ownertrust"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "perbarui database trust secara otomatis"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "perbaiki database trust yang terkorupsi"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "De-Armor file atau stdin"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "En-Armor file atau stdin"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NAMA|gunakan NAMA sebagai penerima baku"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "gunakan kunci baku sebagai penerima baku"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "jangan menggunakan terminal"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "paksa signature v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "jangan paksa signature v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "paksa signature kunci v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "jangan paksa signature kunci v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "selalu gunakan MDC untuk enkripsi"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "jangan gunakan MDC untuk enkripsi"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "gunakan gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "mode batch: tanpa tanya"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "asumsikan ya untuk seluruh pertanyaan"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "asumsikan tidak untuk seluruh pertanyaan"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "tambah keyring ini ke daftar keyring"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "tambah keyring rahasia ini ke daftar"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NAMA|gunakan NAMA sebagai kunci rahasia baku"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|gunakan keyserver ini utk lihat kunci"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NAMA|set charset terminal ke NAMA"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[file]|tulis status info ke file"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KEYID|sangat percayai kunci ini"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FILE|muat modul ekstensi FILE"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emulasikan mode seperti dalam RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "set pilihan semua paket, cipher, digest ke perilaku OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "set pilihan semua paket, cipher, digest ke perilaku PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|gunakan passphrase mode N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NAMA|gunakan algoritma digest NAMA utk passphrase"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NAMA|gunakan algoritma cipher NAMA untuk passphrase"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NAMA|gunakan algoritma cipher NAMA"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NAMA|gunakan algoritma digest pesan NAMA"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|gunakan algoritma kompresi N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "buang field keyid paket terenkripsi"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Tampilkan Photo IDs"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Jangan tampilkan Photo IDs"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Set perintah baris untuk melihat Photo IDs"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "algoritma kompresi `%s' adalah hanya-baca dalam rilis ini\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "algoritma kompresi harus di antara %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Tidak pasti kunci ini milik pemiliknya\n"
+#~ "tapi tetap diterima\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "preferensi %c%lu tidak valid\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "kunci %08lX: bukan kunci rfc2440 - dilewati\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "CATATAN: Kunci primer Elgamal terdeteksi - mungkin membutuhkan beberapa "
+#~ "saat untuk mengimpor\n"
+
+#~ msgid " (default)"
+#~ msgstr " (default)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "kesalahan mengirim ke `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "success sending to `%s' (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "failed sending to `%s': status=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "keyserver ini tidak mendukung --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "tidak dapat mencari keyserver: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "kunci %08lX: ini adalah kunci ElGamal ciptaan PGP yang tidak aman untuk "
+#~ "signature!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "kunci %08lX telah diciptakan dalam %lu detik mendatang (masalah waktu "
+#~ "atau jam)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "kunci %08lX telah diciptakan dalam %lu detik mendatang (masalah waktu "
+#~ "atau jam)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "kunci %08lX ditandai sebagai sangat dipercaya\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "signature dari kunci penandaan Elgamal %08lX hingga %08lX dilewati\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "signature dari %08lX ke kunci penandaan Elgamal %08lX dilewati\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Pilih algoritma untuk digunakan.\n"
+#~ "\n"
+#~ "DSA (DSS) adalah algoritma signature digital yang hanya dapat digunakan \n"
+#~ "untuk signature. Ia merupakan algoritma yang disarankan karena "
+#~ "verifikasi\n"
+#~ "signature DSA jauh lebih cepat daripada ElGamal.\n"
+#~ "\n"
+#~ "ElGamal adalah suatu algoritma yang dapat digunakan untuk signature dan \n"
+#~ "enkripsi. OpenPGP membedakannya ke dalam dua bentuk yaitu: hanya "
+#~ "enkripsi\n"
+#~ "dan enkripsi+sign; sebenarnya sama, tetapi beberapa parameter harus "
+#~ "dipilih\n"
+#~ "secara khusus untuk membuat kunci yang aman untuk signature; program ini\n"
+#~ "melakukannya tetapi implementasi OpenPGP lain tidak harus memahami "
+#~ "bentuk\n"
+#~ "signature+enkripsi.\n"
+#~ "\n"
+#~ "Kunci pertama (primer) harus selalu merupakan kunci yang mampu men-sign;\n"
+#~ "hal ini merupakan alasan mengapa kunci ElGamal hanya-enkripsi tidak ada\n"
+#~ "di menu ini."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Meskipun kunci ini didefinisikan dalam RFC2440 mereka tidak disarankan\n"
+#~ "karena belum didukung oleh seluruh program dan signature yang dibuat\n"
+#~ "oleh mereka cukup besar dan sangat lambat untuk diverifikasi."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu kunci telah diperiksa (%lu signature)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "kunci tidak lengkap\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "kunci %08lX tidak lengkap\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "keluar"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "  (%d) ElGamal (tandai dan enkripsi)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "Penggunaan algoritma ini hanya didukung oleh GnuPG. Anda tidak dapat\n"
+#~ "menggunakan kunci ini untuk berkomunikasi dengan pengguna PGP.  Algoritma "
+#~ "ini\n"
+#~ "juga sangat lambat, dan mungkin tidak seaman pilihan lainnya.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Tetap dibuat? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "terdeteksi algoritma symkey tidak valid (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "keyserver ini tidak kompatibel penuh dengan HKP\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr "Penggunaan algoritma ini didepresiasi - tetap ciptakan?"
diff --git a/po/insert-header.sin b/po/insert-header.sin
new file mode 100644 (file)
index 0000000..b26de01
--- /dev/null
@@ -0,0 +1,23 @@
+# Sed script that inserts the file called HEADER before the header entry.
+#
+# At each occurrence of a line starting with "msgid ", we execute the following
+# commands. At the first occurrence, insert the file. At the following
+# occurrences, do nothing. The distinction between the first and the following
+# occurrences is achieved by looking at the hold space.
+/^msgid /{
+x
+# Test if the hold space is empty.
+s/m/m/
+ta
+# Yes it was empty. First occurrence. Read the file.
+r HEADER
+# Output the file's contents by reading the next line. But don't lose the
+# current line while doing this.
+g
+N
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/it.gmo b/po/it.gmo
new file mode 100644 (file)
index 0000000..3099978
Binary files /dev/null and b/po/it.gmo differ
diff --git a/po/it.po b/po/it.po
new file mode 100644 (file)
index 0000000..cd35447
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,7236 @@
+# GnuPG italian translation
+# Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc.
+# Marco d'Itri <md@linux.it>, 1998, 1999, 2001, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.1.92\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-06-16 17:01+0200\n"
+"Last-Translator: Marco d'Itri <md@linux.it>\n"
+"Language-Team: Italian <tp@lists.linux.it>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "impossibile generare un numero primo di meno di %d bit\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "impossibile generare un numero primo di meno di %d bit\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "non è stato trovato il modulo per raccogliere l'entropia\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "impossibile aprire `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "impossibile aprire `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "impossibile eseguire stat su `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' non è un file regolare - ignorato\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "nota: il file random_seed è vuoto\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"ATTENZIONE: le dimensioni del file random_seed non sono valide - non usato\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "impossibile leggere `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "nota: il file random_seed non è stato aggiornato\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "impossibile creare `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "impossibile scrivere su `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "impossibile chiudere `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr ""
+"ATTENZIONE: si sta usando un generatore di numeri casuali non sicuro!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Il generatore di numeri casuali è solo un ripiego per fare\n"
+"funzionare il programma - non è assolutamente un RNG forte!\n"
+"\n"
+"NON USARE ALCUN DATO GENERATO DA QUESTO PROGRAMMA!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Attendi, sto raccogliendo entropia. Se può evitare di annoiarti lavora un "
+"po',\n"
+"visto che questo migliorerà la qualità dell'entropia.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Non ci sono abbastanza byte casuali disponibili. Per favore fai qualche\n"
+"altra cosa per dare all'OS la possibilità di raccogliere altra entropia!\n"
+"(Servono altri %d byte)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "inizializzazione del trustdb fallita: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "rebuild della cache del portachiavi fallito: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "cancellazione del keyblock fallita: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "invio al keyserver fallito: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "errore nella creazione della passhprase: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "errore leggendo il keyblock: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: errore durante la lettura del record libero: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' è già compresso\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "genera una nuova coppia di chiavi"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "inizializzazione del trustdb fallita: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "cancellazione del keyblock fallita: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Generazione della chiave fallita: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "Firma %s, algoritmo di digest %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "Non sono stati trovati dati OpenPGP validi.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armatura: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "header dell'armatura non valido: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "header dell'armatura: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "header della firma in chiaro non valido\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "firme in chiaro annidate\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "armatura inaspettata:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "riga protetta con il trattino non valida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "Carattere radix64 non valido %02x saltato\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "eof prematura (nessun CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "eof prematura (nel CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC malformato\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "errore nel CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "eof prematura (nella coda)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "errore nella riga della coda\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "Non sono stati trovati dati OpenPGP validi.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armatura non valida: linea più lunga di %d caratteri\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"carattere quoted printable nell'armatura - probabilmente è stato usato\n"
+"un MTA buggato\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "la chiave segreta non è disponibile"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "impossibile fare questo in modo batch\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Cosa scegli? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "abilita"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "abilita"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Nessuna ragione specificata"
+
+# ??? (Md)
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "non esaminato"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "non c'è una chiave pubblica corrispondente: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "preferenze aggiornate"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "carattere non valido nella stringa delle preferenze\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "carattere non valido nella stringa delle preferenze\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "errore: impronta digitale non valida\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "mostra le impronte digitali"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "errore: impronta digitale non valida\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Generazione della chiave fallita: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "Non sono stati trovati dati OpenPGP validi.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Per favore scegli che tipo di chiave vuoi:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Firma scaduta il %s\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (cifra solo)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Scelta non valida.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Per favore scegli il motivo della revoca:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "algoritmo di protezione sconosciuto\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Parti della chiave segreta non sono disponibili.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "saltata: chiave pubblica già presente\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "abbandona questo menù"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "comandi in conflitto\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "mostra questo aiuto"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Chiave disponibile presso: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "cambia la data di scadenza"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "cambia il valore di fiducia"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "mostra le impronte digitali"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "genera una nuova coppia di chiavi"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Comando> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "comandi in conflitto\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "comandi in conflitto\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Comando non valido  (prova \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "la chiave segreta non è disponibile"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "cancellazione del keyblock fallita: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Ripeti la passphrase: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "passphrase non ripetuta correttamente; prova ancora"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "impossibile aprire `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output non funziona con questo comando\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "chiave `%s' non trovata: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "errore leggendo il keyblock: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(a meno che la chiave sia specificata con il fingerprint)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "impossibile fare questo in modo batch senza \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Vuoi cancellare questa chiave dal portachiavi? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "È una chiave segreta! - Vuoi cancellarla davvero? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "cancellazione del keyblock fallita: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informazioni di fiducia del possessore cancellate\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "c'è una chiave segreta per la chiave pubblica \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "usa prima l'opzione \"--delete-secret-keys\" per cancellarla.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "errore nella creazione della passhprase: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+"impossibile usare un pacchetto ESK simmetrico a causa della modalità S2K\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "uso il cifrario %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' è già compresso\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "ATTENZIONE: `%s' è un file vuoto\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"in modalità --pgp2 puoi cifrare solo per chiavi RSA non più lunghe di 2048 "
+"bit\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "lettura da `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"impossibile usare il cifrario IDEA con tutti i tipi di chiavi per cui\n"
+"stai cifrando.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forzare il cifrario simmetrico %s (%d) viola le preferenze\n"
+"del destinatario\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"forzare l'algoritmo di compressione %s (%d) viola le preferenze\n"
+"del destinatario\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"forzare il cifrario simmetrico %s (%d) viola le preferenze\n"
+"del destinatario\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "non è possibile usare %s in modalità %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s cifrato per: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "dati cifrati con %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "cifrato con l'algoritmo sconosciuto %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ATTENZIONE: il messaggio era stato cifrato usando una chiave debole\n"
+"per il cifrario simmetrico\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problema nella gestione del pacchetto cifrato\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "l'esecuzione remota dei programmi non è gestita\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "impossibile creare la directory `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"le chiamate a programmi esterni sono disattivate a causa dei permessi non\n"
+"sicuri del file delle opzioni\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"questa piattaforma richiede file temporanei quando si chiamano programmi "
+"esterni\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "impossibile eseguire %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "impossibile eseguire %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "errore di sistema chiamando il programma esterno: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "uscita anormale del programma esterno\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "impossibile eseguire il programma esterno\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "impossibile leggere la risposta del programma esterno: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "ATTENZIONE: impossibile rimuovere la directory temporanea `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"La firma sarà marcata come irrevocabile.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "non sono state trovate chiavi di revoca per `%s'\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revoca una chiave secondaria"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "chiave segreta inutilizzabile"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "chiave %08lX: non protetta - saltata\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "chiave %08lX: chiave in stile PGP 2.x - saltata\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "chiave %08lX: firma della subchiave nel posto sbagliato - saltata\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "inizializzazione del trustdb fallita: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "ATTENZIONE: la chiave segreta %08lX non ha un checksum SK semplice\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ATTENZIONE: non è stato esportato nulla\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Comandi:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[file]|fai una firma"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[file]|fai una firma mantenendo il testo in chiaro"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "fai una firma separata"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "cifra dati"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "cifra solo con un cifrario simmetrico"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "decifra dati (predefinito)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifica una firma"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "elenca le chiavi"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "elenca le chiavi e le firme"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "controlla le firme delle chiavi"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "elenca le chiavi e le impronte digitali"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "elenca le chiavi segrete"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "genera una nuova coppia di chiavi"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "rimuove le chiavi dal portachiavi pubblico"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "rimuove le chiavi dal portachiavi privato"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "firma una chiave"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "firma una chiave localmente"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "firma o modifica una chiave"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "genera un certificato di revoca"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "esporta delle chiavi"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "esporta le chiavi a un key server"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importa le chiavi da un key server"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "cerca delle chiavi su un key server"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "aggiorna tutte le chiavi da un key server"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importa/aggiungi delle chiavi"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "aggiorna il database della fiducia"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [files]|stampa tutti i message digests"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opzioni:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "crea un output ascii con armatura"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOME|cifra per NOME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "usa questo user-id per firmare o decifrare"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|imposta il livello di compressione (0 disab.)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "usa il modo testo canonico"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "usa come file di output"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "prolisso"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "non fa cambiamenti"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "chiede prima di sovrascrivere"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Vedi la man page per una lista completa di tutti i comandi e opzioni)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Esempi:\n"
+"\n"
+" -se -r Bob [file]          firma e cifra per l'utente Bob\n"
+" --clearsign [file]         fai una firma mantenendo il testo in chiaro\n"
+" --detach-sign [file]       fai una firma separata\n"
+" --list-keys [nomi]         mostra le chiavi\n"
+" --fingerprint [nomi]       mostra le impronte digitali\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Per favore segnala i bug a <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Uso: gpg [opzioni] [files] (-h per l'aiuto)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintassi: gpg [opzioni] [files]\n"
+"firma, controlla, cifra o decifra\n"
+"l'operazione predefinita dipende dai dati di input\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmi gestiti:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "A chiave pubblica: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cifrari: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compressione: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "uso: gpg [opzioni] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "comandi in conflitto\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "non è stato trovato il segno = nella definizione del gruppo \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "ATTENZIONE: il proprietario \"%s\" di %s è insicuro\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "ATTENZIONE: i permessi \"%s\" di %s sono insicuri\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "elemento della configurazione sconosciuto \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "l'URL della politica di firma indicato non è valido\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "mostra in quali portachiavi sono contenute le chiavi elencate"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr ""
+"NOTA: il vecchio file `%s' con le opzioni predefinite è stato ignorato\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTA: manca il file `%s' con le opzioni predefinite\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "file con le opzioni `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "lettura delle opzioni da `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTA: %s normalmente non deve essere usato!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"l'estensione crittografica \"%s\" non è stata caricata a causa dei\n"
+"permessi insicuri.\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s non è un set di caratteri valido\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s non è un set di caratteri valido\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opzioni di importazione non valide\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opzioni di importazione non valide\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: opzioni di importazione non valide\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "opzioni di importazione non valide\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s non è un set di caratteri valido\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "l'URL della politica di firma indicato non è valido\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s non è un set di caratteri valido\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "impossibile impostare exec-path a %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: opzioni di esportazione non valide\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "ATTENZIONE: il programma potrebbe creare un file core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "ATTENZIONE: %s ha la precedenza su %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "Non è permesso usare %s con %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "Non ha senso usare %s con %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent non è disponibile in questa sessione\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "nella modalità --pgp2 puoi fare solo firme in chiaro o separate\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "nella modalità --pgp2 non puoi firmare e cifrare contemporaneamente\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"devi usare dei file (e non una pipe) quando lavori con --pgp2 attivo.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+"nella modalità --pgp2 è richiesto il cifrario IDEA per cifrare un messaggio\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "l'algoritmo di cifratura selezionato non è valido\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "l'algoritmo di digest selezionato non è valido\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "l'algoritmo di cifratura selezionato non è valido\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "l'algoritmo di digest selezionato non è valido\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed deve essere maggiore di 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed deve essere maggiore di 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth deve essere tra 1 e 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "default-cert-level non valido; deve essere 0, 1, 2 o 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "min-cert-level non valido; deve essere 1, 2 o 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTA: l'uso del modo S2K semplice (0) è fortemente scoraggiato\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "modo S2K non valido; deve essere 0, 1 o 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "preferenze predefinite non valide\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "preferenze personali del cifrario non valide\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "preferenze personali del digest non valide\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "preferenze personali di compressione non valide\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s non funziona ancora con %s\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "non è possibile usare l'algoritmo di cifratura \"%s\" in modalità %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "non è possibile usare l'algoritmo di digest \"%s\" in modalità %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+"non è possibile usare l'algoritmo di compressione \"%s\" in modalità %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "inizializzazione del trustdb fallita: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"ATTENZIONE: sono stati indicati dei destinatari (-r) senza usare la\n"
+"crittografia a chiave pubblica\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nomefile]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nomefile]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "decifratura fallita: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nomefile]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [nomefile]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "non è possibile usare %s in modalità %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nomefile]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nomefile]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [nomefile]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "non è possibile usare %s in modalità %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [nomefile]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nomefile]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nomefile]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [comandi]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [user-id] [portachiavi]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "invio al keyserver fallito: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "ricezione dal keyserver fallita: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "esportazione della chiave fallita: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "ricerca nel keyserver fallita: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "aggiornamento del keyserver fallito: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "rimozione dell'armatura fallita: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "creazione dell'armatura fallita: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritmo di hash non valido `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nomefile]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Vai avanti e scrivi il messaggio...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "l'URL della politica di certificazione indicato non è valido\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "l'URL della politica di firma indicato non è valido\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "l'URL della politica di firma indicato non è valido\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "troppe voci nella pk cache - disabilitata\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[User ID non trovato]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"manca una subchiave segreta per la subchiave pubblica %08lX - ignorata\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "uso la chiave secondaria %08lX invece della chiave primaria %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "chiave %08lX: chiave segreta senza chiave pubblica - saltata\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "meno prolisso"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "prende le chiavi da questo portachiavi"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "segnala i conflitti di data solo con un avvertimento"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|scrivi le informazioni di stato sul FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Uso: gpgv [opzioni] [file] (-h per l'aiuto)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintassi: gpg [opzioni] [file]\n"
+"Controlla le firme con le chiavi affidabili note\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"E compito tuo assegnare un valore; questo valore non sarà mai esportato a\n"
+"terzi. Ci serve per implementare il web-of-trust; non ha nulla a che fare\n"
+"con il web-of-certificates (creato implicitamente)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Per costruire il Web-Of-Trust, GnuPG ha bisogno di sapere quali chiavi sono\n"
+"definitivamente affidabili - di solito quelle per cui hai accesso alla "
+"chiave\n"
+"segreta.\n"
+"Rispondi \"sì\" per impostare questa chiave come definitivamente affidabile\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "Se vuoi usare comunque questa chiave non fidata, rispondi \"si\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Inserisci l'user ID del destinatario a cui vuoi mandare il messaggio."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"In generale non è una buona idea usare la stessa chiave per le firme e la\n"
+"cifratura. Questo algoritmo dovrebbe solo essere usato in determinati "
+"campi.\n"
+"Per favore consulta prima il tuo esperto di sicurezza."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Inserisci le dimensioni della chiave"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Rispondi \"si\" o \"no\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Inserisci il valore richiesto come indicato dal prompt.\n"
+"È possibile inserire una data in formato ISO (YYYY-MM-DD) ma non avrai un\n"
+"messaggio di errore corretto: il sistema cerca di interpretare il valore\n"
+"dato come un intervallo."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Inserisci il nome del proprietario della chiave"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "Inserisci un indirizzo di email opzionale (ma fortemente suggerito)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Inserisci un commento opzionale"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  per cambiare il nome.\n"
+"C  per cambiare il commento.\n"
+"E  per cambiare l'indirizzo di email.\n"
+"O  per continuare con la generazione della chiave.\n"
+"Q  per abbandonare il processo di generazione della chiave."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Rispondi \"si\" (o \"y\") se va bene generare la subchiave."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Quando firmi l'user ID di una chiave dovresti prima verificare che questa\n"
+"appartiene alla persona indicata nell'user ID. È utile agli altri sapere\n"
+"con quanta attenzione lo hai verificato.\n"
+"\n"
+"\"0\" significa che non fai particolari affermazioni sull'attenzione con "
+"cui\n"
+"    hai ferificato la chiave.\n"
+"\n"
+"\"1\" significa che credi che la chiave sia posseduta dalla persona che dice "
+"di\n"
+"    possederla, ma non hai o non hai potuto verificare per niente la "
+"chiave.\n"
+"\n"
+"\"2\" significa che hai fatto una verifica superficiale della chiave. Per "
+"esempio\n"
+"    potrebbe significare che hai verificato l'impronta digitale e "
+"confrontato\n"
+"    l'user ID della chiave con un documento di identità con fotografia.\n"
+"\n"
+"\"3\" significa che hai fatto una verifica approfondita della chiave. Per "
+"esempio\n"
+"    potrebbe significare che hai verificato di persona l'impronta digitale "
+"con\n"
+"    il possessore della chiave e hai controllato, per esempio per mezzo di\n"
+"    un documento di identità con fotografia difficile da falsificare (come\n"
+"    un passaporto), che il nome del proprietario della chiave corrisponde a\n"
+"    quello nell'user ID della chiave, e per finire che hai verificato\n"
+"    (scambiando dei messaggi) che l'indirizzo di email sulla chiave "
+"appartiene\n"
+"    al proprietario.\n"
+"\n"
+"Nota che gli esempi indicati per i livelli 2 e 3 sono *solo* esempi. Alla "
+"fine\n"
+"sta a te decidere cosa significano \"superficiale\" e \"approfondita\" "
+"quando\n"
+"firmi chiavi di altri.\n"
+"\n"
+"Se non sai cosa rispondere, rispondi \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Rispondi \"si\" se vuoi firmare TUTTI gli user ID"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Rispondi \"si\" se vuoi davvero cancellare questo user ID.\n"
+"Tutti i certificati saranno persi!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Rispondi \"si\" se va bene cancellare la subchiave"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Questa è una firma valida per la chiave. Normalmente non vorresti "
+"cancellare\n"
+"questa firma perchè può essere importante per stabilire una connessione di\n"
+"fiducia alla chiave o a un'altra chiave certificata da questa chiave."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Questa firma non può essere verificata perchè non hai la chiave "
+"corrispondente.\n"
+"Dovresti rimandare la sua cancellazione finchè non saprai quale chiave è "
+"stata\n"
+"usata perchè questa chiave potrebbe stabilire una connessione di fiducia\n"
+"attraverso una chiave già certificata."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "La firma non è valida. Ha senso rimuoverla dal tuo portachiavi."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Questa è una firma che collega l'user id alla chiave. Solitamente non è una\n"
+"buona idea rimuovere questo tipo di firma. In realtà GnuPG potrebbe non "
+"essere\n"
+"più in grado di usare questa chiave. Quindi fallo solo se questa autofirma "
+"non\n"
+"è valida per qualche ragione e ne è disponibile un'altra."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Cambia le preferenze di tutti gli user ID (o solo di quelli selezionati) "
+"con\n"
+"la lista di preferenze corrente. L'orario di tutte le autofirme coinvolte\n"
+"sarà aumentato di un secondo.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Inserisci la passphrase, cioè una frase segreta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Ripeti l'ultima passphrase per essere sicuro di cosa hai scritto."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Inserisci il nome del file a cui si riferisce la firma."
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Rispondi \"si\" se va bene sovrascrivere il file."
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Inserisci il nuovo nome del file. Se premi INVIO sarà usato il nome\n"
+"predefinito (quello indicato tra parentesi)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Dovresti specificare un motivo per questa certificazione. A seconda del\n"
+"contesto hai la possibilità di scegliere tra questa lista:\n"
+"  \"Key has been compromised\"\n"
+"      Usa questo se hai un motivo per credere che una persona non "
+"autorizzata\n"
+"      abbia avuto accesso alla tua chiave segreta.\n"
+"  \"Key is superseded\"\n"
+"      Usa questo se hai sostituito questa chiave con una più recente.\n"
+"  \"Key is no longer used\"\n"
+"      Usa questo se hai mandato in pensione questa chiave.\n"
+"  \"User ID is no longer valid\"\n"
+"      Usa questo per affermare che l'user ID non dovrebbe più essere usato;\n"
+"      solitamente è usato per indicare un indirizzo di email non valido.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Se vuoi, puoi digitare un testo che descrive perché hai emesso\n"
+"questo certificato di revoca. Per favore sii conciso.\n"
+"Una riga vuota termina il testo.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Non è disponibile un aiuto"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Non è disponibile un aiuto per `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "aggiorna il database della fiducia"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "la chiave pubblica non corrisponde alla chiave segreta!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "chiave segreta inutilizzabile"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "salto un blocco di tipo %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "Per ora sono state esaminate %lu chiavi\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Numero totale esaminato: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "  nuove chiavi saltate: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "         senza user ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "             importate: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "        non modificate: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "         nuovi user ID: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "       nuove subchiavi: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "           nuove firme: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "nuove revoche di chiavi: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "  chiavi segrete lette: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "chiavi segrete importate: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "chiavi segrete non cambiate: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "             importate: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "           nuove firme: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "  chiavi segrete lette: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Non puoi cancellare l'ultimo user ID!\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "Firma %s, algoritmo di digest %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "chiave %08lX: nessun user ID\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "chiave %08lX: riparati i danni di HKP alla subchiave\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "chiave %08lX: accettato l'user ID non autofirmato '%s'\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "chiave %08lX: nessun user ID valido\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "questo può essere causato da una autofirma mancante\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "chiave %08lX: chiave pubblica non trovata: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "chiave %08lX: nuova chiave - saltata\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "non è stato trovato un portachiavi scrivibile: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "scrittura in `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "errore scrivendo il portachiavi `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "chiave %08lX: importata la chiave pubblica \"%s\"\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "chiave %08lX: non corrisponde alla nostra copia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "chiave %08lX: impossibile individuare il keyblock originale: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "chiave %08lX: impossibile leggere il keyblock originale: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "chiave %08lX: \"%s\" 1 nuovo user ID\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "chiave %08lX: \"%s\" una nuova firma\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "chiave %08lX: \"%s\" %d nuove firme\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "chiave %08lX: \"%s\" una nuova subchiave\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "chiave %08lX: \"%s\" %d nuove subchiavi\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "chiave %08lX: \"%s\" %d nuove firme\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "chiave %08lX: \"%s\" %d nuove firme\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "chiave %08lX: \"%s\" %d nuovi user ID\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "chiave %08lX: \"%s\" non cambiata\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "chiave %08lX: chiave segreta con cifrario %d non valido - saltata\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "nessun portachiavi segreto predefinito: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "chiave %08lX: chiave segreta importata\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "chiave %08lX: già nel portachiavi segreto\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "chiave %08lX: chiave segreta non trovata: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"chiave %08lX: manca la chiave pubblica - impossibile applicare il\n"
+"certificato di revoca\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "chiave %08lX: certificato di revoca non valido: %s - rifiutato\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "chiave %08lX: \"%s\" certificato di revoca importato\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "chiave %08lX: nessun user ID per la firma\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"chiave %08lX: algoritmo a chiave pubblica non gestito sull'user ID \"%s\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "chiave %08lX: autofirma non valida sull'user ID \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "chiave %08lX: non ci sono subchiavi per il legame con la chiave\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "chiave %08lX: algoritmo a chiave pubblica non gestito\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "chiave %08lX: legame con la subchiave non valido:\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "chiave %08lX: rimossi i legami con subochiavi multiple\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "chiave %08lX: non ci sono subchiavi per la revoca della chiave\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "chiave %08lX: revoca della subchiave non valida\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "chiave %08lX: rimosse le revoche di subchiavi multiple\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "chiave %08lX: saltato l'user ID '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "chiave %08lX: saltata la subchiave\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "chiave %08lX: firma non esportabile (classe %02x) - saltata\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "chiave %08lX: certificato di revoca nel posto sbagliato - saltata\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "chiave %08lX: certificato di revoca non valido: %s - saltata\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "chiave %08lX: firma della subchiave nel posto sbagliato - saltata\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "chiave %08lX: classe della firma inaspettata (0x%02x) - saltata\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "chiave %08lX: trovato un user ID duplicato - unito\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"ATTENZIONE: la chiave %08lX può essere stata revocata: scarico la chiave\n"
+"di revoca %08lX.\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"ATTENZIONE: la chiave %08lX può essere stata revocata: la chiave di\n"
+"revoca %08lX non è presente.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "chiave %08lX: certificato di revoca \"%s\" aggiunto\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "chiave %08lX: aggiunta una firma alla chiave diretta\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "la chiave pubblica non corrisponde alla chiave segreta!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "saltata: chiave pubblica già presente\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "saltata: chiave pubblica già presente\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "errore creando il portachiavi `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "portachiavi `%s' creato\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "errore creando `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "rebuild della cache del portachiavi fallito: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revoca]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[autofirma]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "una firma non corretta\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d firme non corrette\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "una firma non controllata per mancanza della chiave\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d firme non controllate per mancanza delle chiavi\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "una firma non controllata a causa di un errore\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d firme non controllate a causa di errori\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "Trovato un user ID senza autofirma valida\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "Trovati %d user ID senza autofirme valide\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Per favore decidi quanto hai fiducia che questo utente firmi correttamente\n"
+"le chiavi di altri utenti (guardando il loro passaporto, controllando le\n"
+"impronte digitali da diverse fonti...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Mi fido marginalmente\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Mi fido completamente\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "L'user ID \"%s\" è stato revocato."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Sei ancora sicuro di volerla firmare? (s/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Impossibile firmarla.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "L'user ID \"%s\" è scaduto."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "L'user ID \"%s\" non è autofirmato."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "L'user ID \"%s\" non è autofirmato."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Firmo davvero? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"L'autofirma su \"%s\"\n"
+"è una firma in stile PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Vuoi promuoverla in una autofirma di OpenPGP? (s/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"La tua firma attuale su \"%s\"\n"
+"è scaduta\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Vuoi fare una nuova firma per sostituire quella scaduta? (s/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"La tua firma attuale su \"%s\"\n"
+"è una firma locale.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Vuoi trasformarla in una firma completa esportabile? (s/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" era già stato firmato localmente dalla chiave %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" era già stato firmato dalla chiave %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Sei ancora sicuro di volerla firmare di nuovo? (s/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Niente da firmare con la chiave %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Questa chiave è scaduta!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Questa chiave scadrà il %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Vuoi che la tua firma scada nello stesso momento? (S/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"In modalità -pgp2 non è possibile fare firme OpenPGP su chiavi in stile PGP "
+"2.x.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Questo renderebbe la chiave non utilizzabile da PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Con quanta attenzione hai verificato che la chiave che stai per firmare\n"
+"appartiene veramente alla persona indicata sopra?\n"
+"Se non sai cosa rispondere digita \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Preferisco non rispondere.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Non l'ho controllata per niente.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) L'ho controllata superficialmente.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) L'ho controllata molto attentamente.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Cosa scegli? (inserisci '?' per ulteriori informazioni): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Sei davvero sicuro di volere firmare questa chiave\n"
+"con la tua chiave: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Questa sarà una autofirma.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"ATTENZIONE: la firma non sarà marcata come non esportabile.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"ATTENZIONE: la firma sarà marcata come irrevocabile.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"La firma sarà marcata come non esportabile.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"La firma sarà marcata come irrevocabile.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Non ho controllato per niente questa chiave.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Ho controllato questa chiave superficialmente.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Ho controllato questa chiave molto attentamente.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Firmo davvero? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "firma fallita: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Questa chiave non è protetta.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Parti della chiave segreta non sono disponibili.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Parti della chiave segreta non sono disponibili.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "La chiave è protetta.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Impossibile modificare questa chiave: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Inserisci la nuova passphrase per questa chiave segreta.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "passphrase non ripetuta correttamente; prova ancora"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Non vuoi una passphrase - questa è probabilmente una *cattiva* idea!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Vuoi veramente farlo?"
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "spostamento della firma di una chiave nel posto corretto\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "salva ed esci"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "mostra le impronte digitali"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "elenca le chiavi e gli user ID"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "scegli l'user ID N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "scegli l'user ID N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revoca firme"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "firma la chiave localmente"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Suggerimento: seleziona gli user ID da firmare\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "aggiungi un user ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "aggiungi un ID fotografico"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "cancella un user ID"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "cancella una chiave secondaria"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "aggiungi una chiave di revoca"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Non è possibile cambiare la data di scadenza di una chiave v3\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "imposta l'user ID come primario"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "cambia tra visualizzare la chiave segreta e la chiave pubblica"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "elenca le preferenze (per esperti)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "elenca le preferenze (prolisso)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "impossibile fare il parsing dell'URI del keyserver\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "cambia la passphrase"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "cambia il valore di fiducia"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Revoco davvero tutti gli user ID selezionati? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "revoca un user ID"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revoca una chiave secondaria"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "abilita una chiave"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "disabilita una chiave"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "mostra l'ID fotografico"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "errore leggendo il keyblock segreto `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "È disponibile una chiave segreta.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Per fare questo serve la chiave segreta.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Per favore usa prima il comando \"toggle\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "La chiave è stata revocata."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Firmo davvero tutti gli user ID? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Suggerimento: seleziona gli user ID da firmare\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "classe della firma sconosciuta"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Questo comando non è permesso in modalità %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Devi selezionare almeno un user ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Non puoi cancellare l'ultimo user ID!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Tolgo davvero tutti gli user ID selezionati? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Tolgo davvero questo user ID? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Tolgo davvero questo user ID? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Devi selezionare almeno una chiave.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "impossibile aprire `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "errore creando il portachiavi `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Devi selezionare almeno una chiave.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Vuoi davvero cancellare le chiavi selezionate? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Vuoi davvero cancellare questa chiave? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Revoco davvero tutti gli user ID selezionati? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Revoco davvero questo user ID? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Vuoi davvero revocare questa chiave? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Vuoi davvero revocare le chiavi selezionate? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Vuoi davvero revocare questa chiave? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "imposta la lista di preferenze"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Aggiorno davvero le preferenze per gli user ID selezionati? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Aggiorno davvero le preferenze? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Salvo i cambiamenti? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Esco senza salvare? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "aggiornamento fallito: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "aggiornamento della chiave segreta fallito: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "La chiave non è cambiata quindi non sono necessari aggiornamenti.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Caratteristiche: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Nota: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Non esistono preferense su un user ID in stile PGP 2.x\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Questa chiave può essere revocata dalla chiave %s "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Questa chiave può essere revocata dalla chiave %s "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (sensibile)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "impossibile creare %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[revocata]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr "[scadenza: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr "[scadenza: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " fiducia: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " fiducia: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Questa chiave è stata disabilitata"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Nota che la validità della chiave indicata non sarà necessariamente "
+"corretta\n"
+"finchè non eseguirai di nuovo il programma.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[revocata]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"ATTENZIONE: nessun user ID è stato indicato come primario. Questo comando\n"
+"            potrebbe fare diventare un altro user ID il primario "
+"predefinito.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"ATTENZIONE: Questa è una chiave in stile PGP2. Aggiungere un ID fotografico\n"
+"            può causarne il rifiuto da parte di alcune versioni di PGP.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Sei ancora sicuro di volerlo aggiungere? (s/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+"Non è possibile aggiungere un ID fotografico a una chiave in stile PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Cancellare questa firma corretta? (s/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Cancellare questa firma non valida? (s/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Cancellare questa firma sconosciuta? (s/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Cancellare davvero questa autofirma? (s/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Cancellata %d firma.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Cancellate %d firme.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Non è stato cancellato nulla.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "armatura non valida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "L'user ID \"%s\" è stato revocato."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "L'user ID \"%s\" è stato revocato."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "L'user ID \"%s\" è stato revocato."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "l'user ID \"%s\" è già stato revocato\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "l'user ID \"%s\" è già stato revocato\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"ATTENZIONE: Questa è una chiave in stile PGP 2.x. Aggiungere un revocatore\n"
+"            designato può causarne il rifiuto da parte di alcune versioni\n"
+"            di PGP.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"Non è possibile aggiungere un revocatore designato a una chiave in stile\n"
+"PGP 2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Inserisci l'user ID del revocatore designato: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"impossibile nominare come revocatore designato una chiave in stile PGP 2.x\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+"impossibile nominare una chiave come revocatore designato di sè stessa\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr ""
+"ATTENZIONE: questa chiave è stata revocata dal suo revocatore designato!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"ATTENZIONE: la nomina di una chiave a revocatrice designata non può essere\n"
+"annullata.\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Sei sicuro di volere nominare questa chiave revocatrice designata? (s/N):"
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Togli le selezioni dalle chiavi segrete.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Seleziona al massimo una chiave secondaria.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Cambio la data di scadenza per una chiave secondaria.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Cambio la data di scadenza per la chiave primaria.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Non è possibile cambiare la data di scadenza di una chiave v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Manca la firma corrispondente nel portachiavi segreto\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"ATTENZIONE: la sottochiave per firme %08lX non ha una certificature "
+"incrociata\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Devi selezionare esattamente un user ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "salto una autofirma v3 sull'user ID \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Sei sicuro di volerla usare? (s/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Sei sicuro di volerla usare? (s/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Annotazione della firma: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Sovrascrivo (s/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Nessun user ID con l'indice %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Nessun user ID con l'indice %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Nessun user ID con l'indice %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "user ID: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   firmata da %08lX il %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (non esportabile)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Questa chiave è scaduta il %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Sei ancora sicuro di volerlo aggiungere? (s/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Creare un certificato di revoca per questa firma? (s/N) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Non puoi cancellare l'ultimo user ID!\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (non esportabile)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revocata da %08lX il %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Stai per revocare queste firme:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Creare davvero i certificati di revoca? (s/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "manca la chiave segreta\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "l'user ID \"%s\" è già stato revocato\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"ATTENZIONE: una firma dell'user ID ha la data di %d secondi nel futuro\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "l'user ID \"%s\" è già stato revocato\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "l'user ID \"%s\" è già stato revocato\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Mostro %s ID fotografici di dimensioni %ld per la chaive 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "la preferenza %c%lu è doppia\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "ci sono troppe preferenze `%c'\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "ci sono troppe preferenze `%c'\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "ci sono troppe preferenze `%c'\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "carattere non valido nella stringa delle preferenze\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "scrittura della firma diretta\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "scrittura della autofirma\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "scrittura della firma di collegamento alla chiave\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "dimensione della chiave non valida; uso %u bit\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "dimensioni della chiave arrotondate a %u bit\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "cifra dati"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (cifra solo)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Per favore scegli che tipo di chiave vuoi:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA e ElGamal (default)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (firma solo)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (cifra solo)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (cifra solo)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (firma solo)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (cifra solo)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (cifra solo)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "La coppia DSA avrà 1024 bit.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Di che dimensioni vuoi la chiave? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "La dimensione richiesta della chiave è %u bit\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "arrotondate a %u bit\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Per favore specifica per quanto tempo la chiave sarà valida.\n"
+"         0 = la chiave non scadrà\n"
+"      <n>  = la chiave scadrà dopo n giorni\n"
+"      <n>w = la chiave scadrà dopo n settimane\n"
+"      <n>m = la chiave scadrà dopo n mesi\n"
+"      <n>y = la chiave scadrà dopo n anni\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Per favore specifica per quanto tempo la firma sarà valida.\n"
+"         0 = la chiave non scadrà\n"
+"      <n>  = la chiave scadrà dopo n giorni\n"
+"      <n>w = la chiave scadrà dopo n settimane\n"
+"      <n>m = la chiave scadrà dopo n mesi\n"
+"      <n>y = la chiave scadrà dopo n anni\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Chiave valida per? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Firma valida per? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valore non valido\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s non ha scadenza\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s non ha scadenza\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s scadrà il %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Questa firma scadrà il %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Il tuo sistema non può mostrare date oltre il 2038.\n"
+"Comunque, sarà gestita correttamente fino al 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "È giusto (s/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Ti serve un User ID per identificare la tua chiave; il software costruisce "
+"l'user id a partire da Nome e Cognome, Commento e Indirizzo di Email "
+"indicati in questa forma:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nome e Cognome: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Carattere non valido nel nome\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Il nome non può iniziare con una cifra\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Il nome deve essere lungo almeno 5 caratteri\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Indirizzo di Email: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "L'indirizzo di email non è valido\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Commento: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Carattere non valido nel commento\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Stai usando il set di caratteri `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Hai selezionato questo User Id:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Per favore non mettere l'indirizzo di email nel nome o nel commento\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (Q)uit? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Modifica (N)ome, (C)ommento, (E)mail oppure (O)kay/(Q)uit? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Per favore correggi prima l'errore\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Dobbiamo generare un mucchio di byte casuali. È una buona idea eseguire\n"
+"qualche altra azione (scrivere sulla tastiera, muovere il mouse, usare i\n"
+"dischi) durante la generazione dei numeri primi; questo da al generatore di\n"
+"numeri casuali migliori possibilità di raccogliere abbastanza entropia.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Generazione della chiave annullata.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "scrittura della chiave pubblica in `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "scrittura della chiave segreta in `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "non è stato trovato un portachiavi pubblico scrivibile: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "non è stato trovato un portachiavi segreto scrivibile: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "errore scrivendo il portachiavi pubblico `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "errore scrivendo il portachiavi segreto `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "chiavi pubbliche e segrete create e firmate.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Nota che questa chiave non può essere usata per cifrare. Forse vorrai usare\n"
+"il comando \"--edit-key\" per generare una chiave secondaria per questo "
+"scopo.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Generazione della chiave fallita: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
+"con l'orologio)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in 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"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NB: la creazione di subchiavi per chiavi v3 non rispetta OpenPGP.\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Crea davvero? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "cancellazione del keyblock fallita: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "impossibile creare `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTA: chiave %08lX scaduta il %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "mai       "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Politica critica di firma: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Politica di firma: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Annotazione critica della firma: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Annotazione della firma: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Portachiavi"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Impronta digitale della chiave primaria:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "    Impronta digitale della subchiave:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Impronta digitale della chiave primaria:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "     Impronta digitale della subchiave:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Impronta digitale ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "creazione dell'armatura fallita: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "ATTENZIONE: esistono due file con informazioni confidenziali.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s è quello non modificato\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s è quello nuovo\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Per favore risolvete questo possibile problema di sicurezza\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "controllo il portachiavi `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "Sono state controllate %lu chiavi (%lu firme)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "Sono state controllate %lu chiavi (%lu firme)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: portachiavi creato\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "l'URL della politica di firma indicato non è valido\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"ATTENZIONE: le opzioni in `%s' non sono ancora attive durante questa\n"
+"esecuzione del programma\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "opzioni di esportazione non valide\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "chiave `%s' non trovata: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "chiave `%s' non trovata: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "richiedo la chiave %08lX a %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "richiedo la chiave %08lX a %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "cerco \"%s\" sul server HKP %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "cerco \"%s\" sul server HKP %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "cerco \"%s\" sul server HKP %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"firmata con la tua chiave %08lX il %s\n"
+"\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "cerco \"%s\" sul server HKP %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "cerco \"%s\" sul server HKP %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "opzioni di esportazione non valide\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "errore del keyserver"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "errore del keyserver"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "ricezione dal keyserver fallita: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "richiedo la chiave %08lX a %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "richiedo la chiave %08lX a %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "ATTENZIONE: impossibile cancellare il file temporaneo (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "la chiave di sessione cifrata ha dimensioni strane (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "chiave di sessione cifrata con %s\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "cifrato con l'algoritmo sconosciuto %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "la chiave pubblica è %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "dati cifrati con la chiave pubblica: DEK corretto\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "cifrato con la chiave %2$s di %1$u bit, ID %3$08lX, creata il %4$s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                alias \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "Cifrato con la chiave %s con ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "decifratura della chiave pubblica fallita: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "cifratto con %lu passphrase\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "cifratto con 1 passphrase\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "suppongo che i dati siano cifrati con %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "Cifrario IDEA non disponibile, ottimisticamente cerco di usare %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "decifratura corretta\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "ATTENZIONE: l'integrità del messaggio non era protetta\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "ATTENZIONE: il messaggio cifrato è stato manipolato!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "decifratura fallita: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTA: il mittente ha richiesto \"solo-per-i-tuoi-occhi\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nome del file originale='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revoca solitaria - usa \"gpg --import\" per applicarla\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Firma valida da \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verifica della firma soppressa\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "impossibile gestire queste firme multiple\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Firma scaduta il %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                alias \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Firma fatta %.*s usando %s con ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Chiave disponibile presso: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Firma NON corretta da \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Firma scaduta da \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Firma valida da \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[incerta]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Firma scaduta il %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Questa firma scadrà il %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "Firma %s, algoritmo di digest %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binario"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "modo testo"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "sconosciuto"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Impossibile controllare la firma: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "non è una firma separata\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "ATTENZIONE: trovate firme multiple. Sarà controllata solo la prima.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "firma solitaria di classe 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "firma vecchio stile (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "individuato un pacchetto radice non valido in proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "impossibile disabilitare i core dump: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "impossibile aprire il file: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "trustdb: read fallita (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "impossibile gestire l'algoritmo a chiave pubblica %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "algoritmo di cifratura non implementato"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "Firma %s, algoritmo di digest %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"forzare l'algoritmo di digest %s (%d) viola le preferenze del destinatario\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "il plugin per il cifrario IDEA non è presente\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = mostrami ulteriori informazioni\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d \"%s\" è una opzione deprecata\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "usa al suo posto \"%s%s\"\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "ATTENZIONE: \"%s\" è una opzione deprecata\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Non compresso"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Non compresso"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "questo messaggio può non essere utilizzabile da %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "lettura delle opzioni da `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "destinatario predefinito `%s' sconosciuto\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Il file `%s' esiste. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Sovrascrivo (s/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: suffisso sconosciuto\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Inserire il nuovo nome del file"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "scrivo su stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "suppongo che i dati firmati siano in `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "creato un nuovo file di configurazione `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"ATTENZIONE: le opzioni in `%s' non sono ancora attive durante questa\n"
+"esecuzione del programma\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: directory creata\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "impossibile gestire l'algoritmo a chiave pubblica %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"ATTENZIONE: la chiave di sessione cifrata simmetricamente è potenzialmente\n"
+"non sicura\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "il sottopacchetto di tipo %d ha un bit critico impostato\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent non è disponibile in questa sessione\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "variabile di ambiente GPG_AGENT_INFO malformata\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "la versione %d del protocollo di gpg-agent non è gestita\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "impossibile connettersi a `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problema con l'agent - uso dell'agent disattivato\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (key ID principale %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Ti serve una passphrase per sbloccare la chiave segreta dell'utente:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %08lX, created %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Ripeti la passphrase\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Inserisci la passphrase\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "interrotto dall'utente\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "impossibile chiedere la password in modo batch\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Inserisci la passphrase: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Ti serve una passphrase per sbloccare la chiave segreta\n"
+"dell'utente: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "chiave %2$s di %1$u bit, ID %3$08lX, creata il %4$s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Ripeti la passphrase: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Scegli un'immagine da usare per l'identificazione fotografica. L'immagine "
+"deve\n"
+"essere un file JPEG. Ricorda che l'immagine è immagazzinata nella tua "
+"chiave\n"
+"pubblica, se usi una immagine molto grande anche la tua chiave diventerà "
+"molto\n"
+"grande! Dimensioni vicine a 240x288 sono una buona scelta.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Inserisci il nome del file JPEG per l'ID fotografico: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "impossibile aprire il file: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Sei sicuro di volerla usare? (s/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\": non è un file JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Questa foto è giusta? (s/N/q) "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "impossibile mostrare l'ID fotografico\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Nessuna ragione specificata"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Questa chiave è stata sostituita"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Questa chiave è stata compromessa"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "La chiave non è più usata"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "L'user ID non è più valido"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "ragione della revoca: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "commento alla revoca: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Nessun valore di fiducia assegnato a:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Questa chiave probabilmente appartiene al proprietario\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Non lo so\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = NON mi fido\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Mi fido definitivamente\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = torna al menù principale\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = salta questa chiave\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = abbandona\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Cosa hai deciso? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Vuoi davvero assegnare fiducia definitiva a questa chiave? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificati che portano a chiavi definitivamente affidabili:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Non ci sono indicazioni che la chiave appartenga al proprietario\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Non ci sono indicazioni che la chiave appartenga al proprietario\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Questa chiave probabilmente appartiene al proprietario\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Questa chiave ci appartiene\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NON è sicuro che la chiave appartenga alla persona indicata.\n"
+"nell'user ID. Se sai *davvero* cosa stai facendo, puoi\n"
+"rispondere sì alla prossima domanda.\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Uso lo stesso questa chiave? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ATTENZIONE: uso di una chiave non fidata!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"ATTENZIONE: questa chiave può essere stata revocata (la chiave di revoca\n"
+"non è presente).\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+"ATTENZIONE: questa chiave è stata revocata dal suo revocatore designato!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ATTENZIONE: questa chiave è stata revocata dal suo proprietario!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Questo può significare che la firma è stata falsificata.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "ATTENZIONE: questa subchiave è stata revocata dal proprietario!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Nota: questa chiave è stata disabilitata.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Nota: questa chiave è scaduta!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "ATTENZIONE: questa chiave non è certificata con una firma fidata!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Non ci sono indicazioni che la firma appartenga al proprietario.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ATTENZIONE: NON ci fidiamo di questa chiave!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "          La firma è probabilmente un FALSO.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"ATTENZIONE: questa chiave non è certificata con firme abbastanza fidate!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Non è sicuro che la firma appartenga al proprietario.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: saltata: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: saltata: chiave pubblica già presente\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Non hai specificato un user ID. (puoi usare \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Inserisci l'user ID. Termina con una riga vuota: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "User ID inesistente.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "saltata: chiave pubblica già impostata come destinatario predefinito\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "La chiave pubblica è disabilitata.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "saltata: chiave pubblica già impostata\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "destinatario predefinito `%s' sconosciuto\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: saltata: chiave pubblica disabilitata\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "nessun indirizzo valido\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "errore creando `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Firma separata.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Inserisci il nome del file di dati: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "viene letto stdin...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "non ci sono dati firmati\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "impossibile aprire i dati firmati `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinatario anonimo; provo la chiave segreta %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "bene, siamo il destinatario anonimo.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "la vecchia codifica del DEK non è gestita\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "l'algoritmo di cifratura %d%s è sconosciuto o disattivato\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+"NOTA: l'algoritmo di cifratura %d non è stato trovato tra le preferenze\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTA: chiave %08lX scaduta il %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTA: la chiave è stata revocata"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet fallito: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "chiave %08lX: nessun user ID\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Revocabile da:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Questa è una chiave di revoca sensibile)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Creare un certificato di revoca per questa chiave? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Forzato l'output con armatura ASCII.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet fallito: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Certificato di revoca creato.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "non sono state trovate chiavi di revoca per `%s'\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "chiave segreta `%s' non trovata: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "non c'è una chiave pubblica corrispondente: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "la chiave pubblica non corrisponde alla chiave segreta!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Creare un certificato di revoca per questa chiave? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "algoritmo di protezione sconosciuto\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTA: Questa chiave non è protetta!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Creato un certificato di revoca.\n"
+"\n"
+"Per favore spostalo su un media che puoi nascondere; se l'uomo nel mezzo\n"
+"riuscirà ad accedere a questo certificato potrà usarlo per rendere\n"
+"inutilizzabile la tua chiave. È una buona idea stamparlo ed archiviarlo,\n"
+"nel caso il media diventasse illeggibile. Ma fai attenzione: il sistema di\n"
+"stampa della tua macchina potrebbe immagazzinare i dati e renderli "
+"disponibili\n"
+"ad altri!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Per favore scegli il motivo della revoca:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Cancella"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Probabilmente volevi scegliere %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Inserisci una descrizione opzionale; terminala con una riga vuota:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Motivo della revoca: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Non è stata data una descrizione)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Va bene così? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "parti della chiave segreta non sono disponibili\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "l'algoritmo di protezione %d%s non è gestito\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Passphrase non valida; riprova"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"ATTENZIONE: Individuata una chiave debole - per favore cambia ancora la\n"
+"passphrase.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"genero il checksum a 16 bit deprecato per la protezione della chiave "
+"segreta\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "creata una chiave debole - riprovo\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"Impossibile evitare una chiave debole per il cifrario simmetrico;\n"
+"ho provato %d volte!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "ATTENZIONE: conflitto del digest delle firme nel messaggio\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+"ATTENZIONE: la sottochiave per firme %08lX non ha una certificature "
+"incrociata\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"ATTENZIONE: la sottochiave per firme %08lX ha una certificature incrociata\n"
+"non valida\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"la chiave è stata creata %lu secondo nel futuro (salto nel tempo o problema\n"
+"con l'orologio)\n"
+
+#: g10/sig-check.c:195
+#, 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"
+"con l'orologio)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTA: chiave per firmare %08lX scaduta il %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"si suppone una firma non valida della chiave %08lX a causa di un\n"
+"bit critico sconosciuto\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+"chiave %08lX: non c'è una subchiave per il pacchetto di revoca della "
+"subchiave\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+"chiave %08lX: non c'è una subchiave per la firma di collegamento della "
+"subchiave\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "impossibile inserire notation data nelle firme v3 (stile PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"impossibile inserire notation data nelle firme di chiavi v3 (stile PGP 2.x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"ATTENZIONE: impossibile espandere i %% nell'URL (troppo lunga). Usata "
+"inespansa.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"impossibile inserire l'URL di una policy nelle firme v3 (stile PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"impossibile inserire l'URL di una policy nelle firme di chiavi v3 (stile\n"
+"PGP 2.x)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"ATTENZIONE: Impossibile espandere i %% nell'URL della policy (troppo "
+"lunga).\n"
+"Usata inespansa.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"ATTENZIONE: Impossibile espandere i %% nell'URL della policy (troppo "
+"lunga).\n"
+"Usata inespansa.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "controllo della firma creata fallito: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "Firma %s da: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"nella modalità --pgp2 puoi fare firme separate solo con chiavi in stile PGP "
+"2.x\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"forzare l'algoritmo di digest %s (%d) viola le preferenze del destinatario\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "firma:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"In modalità -pgp2 puoi firmare in chiaro solo con chiavi in stile PGP 2.x\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "sarà usato il cifrario %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"la chiave non è indicata come insicura - impossibile usarla con il RNG "
+"finto!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "saltata `%s': doppia\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "saltata `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "saltata: chiave pubblica già presente\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"saltata %s: questa è una chiave ElGamal generata da PGP che NON è sicura per "
+"le firme!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "trust record %lu, req type %d: write fallita: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Lista dei valori della fiducia assegnati, creata il %s\n"
+"# (Usa \"gpg --import-ownertrust\" per ripristinarli)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "errore leggendo `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "riga troppo lunga\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "errore: impronta digitale non valida\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importa i valori di fiducia"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "errore cercando il record della fiducia: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "errore di lettura: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: sync fallita: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: lseek fallita: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: scrittura fallita (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transazione del trustdb troppo grande\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "impossibile chiudere `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: la directory non esiste!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "impossibile creare `%s': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "impossibile aprire `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: creazione del record della versione fallita: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: è stato creato un trustdb non valido\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: creato il trustdb\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTA: il trustdb non è scrivibile\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: trustdb non valido\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: creazione della tabella hash fallita: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: errore durante l'aggiornamento del record di versione: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: errore durante la lettura del record di versione: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: errore durante la scrittura del record di versione: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek fallita: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: read fallita (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: non è un file di trustdb\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: record di versione con recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versione %d del file non valida\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: errore durante la lettura del record libero: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: errore durante la scrittura del dir record: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: azzeramento di un record fallito: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: accodatura a un record fallita: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "Il trustdb è danneggiato; eseguire \"gpg --fix-trust-db\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "impossibile gestire linee di testo più lunghe di %d caratteri\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "linea di input più lunga di %d caratteri\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' non è un key ID lungo valido\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "chiave %08lX: accettata come chiave affidabile\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "chiave %08lX: appare nel trustdb più di una volta\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"chiave %08lX: manca la chiave pubblica della chiave fidata - ignorata\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "chiavi marcate definitivamente affidabili.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "trust record %lu, tipo %d: read fallita: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "il trust record %lu non è del tipo richiesto %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[revocata]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[scaduta]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "sconosciuto"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "mai       "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "non è necessario un controllo del trustdb\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "il prossimoi controllo del trustdb sarà fatto il %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "non è necessario un controllo del trustdb\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "non è necessario un controllo del trustdb\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "chiave pubblica %08lX non trovata: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "per favore usa --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "controllo il trustdb\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d chiavi processate (%d conteggi di validità azzerati)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "non è stata trovata alcuna chiave definitivamente affidabile\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "chiave pubblica definitivamente affidabile %08lX non trovata\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "trust record %lu, req type %d: write fallita: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"non è stato possibile verificare la firma.\n"
+"Ricorda che il file con la firma (.sig or .asc) deve\n"
+"essere il primo file indicato sulla riga di comando.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "linea di input %u troppo lunga o LF mancante\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "errore generale"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "pacchetto di tipo sconosciuto"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "versione sconosciuta"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algoritmo della chiave pubblica sconosciuto"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algoritmo del digest sconosciuto"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "chiave pubblica errata"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "chiave segreta errata"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "firma errata"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "codice di controllo errato"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "passphrase errata"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "chiave pubblica non trovata"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algoritmo di cifratura sconosciuto"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "impossibile aprire il portachiavi"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "pacchetto non valido"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armatura non valida"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "l'user id non esiste"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "la chiave segreta non è disponibile"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "è stata usata la chiave segreta sbagliata"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "non gestito"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "chiave sbagliata"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "errore durante la lettura del file"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "errore durante la scrittura del file"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritmo di compressione sconosciuto"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "errore durante l'apertura del file"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "errore durante la creazione del file"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "passphrase non valida"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmo della chiave pubblica non implementato"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritmo di cifratura non implementato"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "classe della firma sconosciuta"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "errore nel database della fiducia"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI danneggiato"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "limite della risorsa"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "portachiavi non valido"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "certificato danneggiato"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "user id malformato"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "errore durante la chiusura del file"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "errore durante la rinominazione del file"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "errore durante la cancellazione del file"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "dati inattesi"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "date in conflitto"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritmo della chiave pubblica non utilizzabile"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "il file esiste"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "chiave debole"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argomento non valido"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI non valida"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI non gestito"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "errore di rete"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "non cifrato"
+
+# ??? (Md)
+#: util/errors.c:104
+msgid "not processed"
+msgstr "non esaminato"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "chiave pubblica inutilizzabile"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "chiave segreta inutilizzabile"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "errore del keyserver"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Cancella"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "non cifrato"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "non ci sono dati firmati\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... questo è un bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "hai trovato un bug... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "si|sì"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "sS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "ATTENZIONE: si sta usando memoria insicura!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "visitare http://www.gnupg.org/faq.html per ulteriori informazioni\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "l'operazione non è possibile senza memoria sicura inizializzata\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(potresti avere usato il programma sbagliato per questa funzione)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA richiede l'uso di un algoritmo di hashing con almeno 160 bit\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "per ulteriori informazioni si veda http://www.gnupg.org/it/why-not-idea."
+#~ "html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "il nome di una nota deve essere formato solo da caratteri stampabili o\n"
+#~ "spazi e terminare con un '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "il valore di una nota dell'utente deve contenere il carattere '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "il valore di una nota dell'utente deve contenere il carattere '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "il valore di una nota non deve usare caratteri di controllo\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "ATTENZIONE: trovati dati di una nota non validi\n"
+
+#~ msgid "not human readable"
+#~ msgstr "non leggibile"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "leggi le opzioni dal file"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "leggi le opzioni dal file"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr "[scadenza: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "chiave %08lX: classe della firma inaspettata (0x%02x) - saltata\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "impossibile eseguire %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "l'user ID \"%s\" è già stato revocato\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "errore nella creazione della passhprase: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "passphrase errata o algoritmo di cifratura sconosciuto (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "impossibile impostare il pid del client dell'agent\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "impossibile ottenere il FD di lettura dell'agent\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "impossibile ottenere il FD di scrittura dell'agent\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problema di comunicazione con gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "passphrase troppo lunga\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "risposta non valida dall'agent\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problema con l'agent: ha restituito 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "scegli la chiave secondaria N"
+
+#~ msgid "list signatures"
+#~ msgstr "elenca le firme"
+
+#~ msgid "sign the key"
+#~ msgstr "firma la chiave"
+
+#~ msgid "add a secondary key"
+#~ msgstr "aggiungi una chiave secondaria"
+
+#~ msgid "delete signatures"
+#~ msgstr "cancella le firme"
+
+#~ msgid "change the expire date"
+#~ msgstr "cambia la data di scadenza"
+
+#~ msgid "set preference list"
+#~ msgstr "imposta la lista di preferenze"
+
+#~ msgid "updated preferences"
+#~ msgstr "preferenze aggiornate"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Nessuna chiave secondaria con l'indice %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key user-id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key user-id"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "fai una firma separata"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "firma la chiave irrevocabilmente"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "firma la chiave localmente e irrevocabilmente"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "abilita"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "errore generale"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsign"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "errore del keyserver"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "abilita"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "in questa versione l'algoritmo digest `%s' è in sola lettura\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Sto per generare una nuova coppia di chiavi %s.\n"
+#~ "               la dimensione minima è  768 bit\n"
+#~ "          la dimensione predefinita è 1024 bit\n"
+#~ "  la dimensione massima consigliata è 2048 bit\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA permette solo chiavi di dimensioni tra 512 e 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "la chiave è troppo corta; 1024 è il minimo valore permesso per RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "la chiave è troppo corta; 768 è il minimo valore permesso.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "la chiave è troppo lunga; %d è il massimo valore permesso.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Chiavi più lunghe di 2048 non sono consigliate perchè i calcoli sono\n"
+#~ "VERAMENTE lunghi!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Sei sicuro di volere una chiave di queste dimensioni? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Va bene, ma ricordati che anche le radiazioni emesse dal tuo monitor e "
+#~ "dalla tua tastiera sono molto vulnerabili ad attacchi!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Gli algoritmi sperimentali non dovrebbero essere usati!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "questo algoritmo di cifratura è deprecato; usane uno più standard!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "scrittura in `%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "mi dispiace, non è possibile fare questo in modo batch\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "chiave `%s' non trovata: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "impossibile creare `%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "impossibile aprire il file: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "chiave %08lX: la chiave è stata revocata!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "chiave %08lX: la subchiave è stata revocata!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: la chiave è scaduta\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: NON ci fidiamo di questa chiave!\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (firma e cifra)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (firma solo)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (firma e cifra)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (cifra solo)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (firma e cifra)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: impossibile aprire: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: ATTENZIONE: file vuoto\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "impossibile aprire `%s': %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Mi fido marginalmente\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Mi fido completamente\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "firmata localmente con la tua chiave %08lX il %s\n"
+#~ "\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   firmata da %08lX il %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: impossibile acedere a: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: impossibile creare il lock\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: impossibile creare il lock\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: impossibile creare: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: impossibile creare la directory: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr "Se vuoi usare comunque questa chiave revocata, rispondi \"si\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Impossibile aprire la foto \"%s\": %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "impossibile aprire il file: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "errore: mancano due punti\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "errore: non c'è il valore della fiducia\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (key ID principale %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! la subchiave è stata revocata: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- trovata una revoca falsificata\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problema controllando la revoca: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr "[scadenza: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr "[scadenza: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[revocata]"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "impossibile creare %s: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "ATTENZIONE: il digest `%s' non fa parte di OpenPGP.\n"
+#~ "Da usare a proprio rischio!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[file]|cifra i file"
+
+#~ msgid "store only"
+#~ msgstr "immagazzina soltanto"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[file]|decifra i file"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "firma una chiave irrevocabilmente"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "firma una chiave localmente e irrevocabilmente"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "elenca solo la sequenza dei pacchetti"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "esporta i valori di fiducia"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "aggiornamento non presidiato del database della fiducia"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "ripara un database della fiducia rovinato"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "rimuovi l'armatura a un file o a stdin"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "crea l'armatura a un file o a stdin"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOME|usa NOME come destinatario predefinito"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "usa la chiave predefinita come destinatario predefinito"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "non usa per niente il terminale"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "forza l'uso di firme v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "non forza l'uso di firme v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "forza l'uso di firme v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "non forza l'uso di firme v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "usa sempre un MDC per cifrare"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "non usa mai un MDC per cifrare"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "usa gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "modo batch: non fa domande"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "risponde \"sì\" a quasi tutte le domande"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "risponde \"no\" a quasi tutte le domande"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "aggiungi questo portachiavi alla lista"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "aggiungi questo portachiavi segreto alla lista"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOME|usa NOME come chiave segreta predefinita"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|cerca le chiavi in questo keyserver"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NOME|imposta NOME come set di caratteri del terminale"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[file]|scrivi le informazioni di stato nel file"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KEYID|assegna fiducia definitiva a questa chiave"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FILE|carica il modulo di estensione FILE"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emula il modo descritto in RFC 1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "imposta tutte le opzioni di pacchetto,\n"
+#~ "cifrario e digest per OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "imposta tutte le opzioni di pacchetto, cifrario e digest per PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|usa il modo N per la passphrase"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NOME|usa l'algoritmo di message digest NOME per le passphrase"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NOME|usa l'alg. di cifratura NOME per le passphrase"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOME|usa l'algoritmo di cifratura NOME"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOME|usa l'algoritmo di message digest NOME"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|usa l'algoritmo di compressione N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "elimina il campo keyid dei pacchetti cifrati"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Mostra le fotografie"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Non mostra le fotografie"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Imposta la riga di comando per vedere le fotografie"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "in questa versione l'algoritmo di compressione `%s' è in sola lettura\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "l'algoritmo di compressione deve essere tra %d e %d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Non è sicuro che questa chiave appartenga veramente al "
+#~ "proprietario\n"
+#~ "ma è accettata comunque\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "la preferenza %c%lu non è valida\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "chiave %08lX: chiave non rfc2440 - saltata\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "NOTA: trovata una chiave primaria Elgamal - importarla può essere lungo\n"
+
+#~ msgid " (default)"
+#~ msgstr " (predefinito)"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  creata: %s scade: %s"
+
+#~ msgid "Policy: "
+#~ msgstr "Policy: "
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "impossibile scaricare la chiave dal keyserver: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "errore leggendo `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "inviata con successo a `%s' (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "invio a `%s' fallito: status=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "questo keyserver non gestisce --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "impossibile cercare sul keyserver: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "chiave %08lX: questa è una chiave ElGamal generata da PGP che NON è "
+#~ "sicura per le firme!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la chiave %08lX è stata creata %lu secondo nel futuro (salto nel tempo\n"
+#~ "o problema con l'orologio)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "la chiave %08lX è stata creata %lu secondi nel futuro (salto nel tempo\n"
+#~ "o problema con l'orologio)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "chiavi %08lX marcate come definitivamente affidabile\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "ignorata la firma dalla chiave per firme Elgamal %08lX a %08lX\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "ignorata la firma da %08lX alla chiave per firme Elgamal %08lX\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "controllo al livello %d firmato=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Seleziona l'algoritmo da usare.\n"
+#~ "\n"
+#~ "DSA (alias DSS) è un algoritmo usabile solo per firmare. E l'algoritmo\n"
+#~ "suggerito perché verificare firme DSA è molto più veloce di quelle "
+#~ "ElGamal.\n"
+#~ "\n"
+#~ "ElGamal è un algoritmo usabile per firmare e cifrare.\n"
+#~ "OpenPGP distingue tra due versioni di questo algoritmo: una solo per "
+#~ "firmare\n"
+#~ "e una per firmare e cifrare. In realtà è sempre lo stesso, ma per creare\n"
+#~ "firme sicure per la cifratura occorre scegliere in un modo particolare "
+#~ "alcuni\n"
+#~ "parametri: questo programma lo fa ma non è richiesto che altre "
+#~ "implementazioni\n"
+#~ "di OpenPGP capiscano la versione per firmare e cifrare.\n"
+#~ "\n"
+#~ "La prima chiave (primaria) deve sempre essere una chiave in grado di "
+#~ "firmare;\n"
+#~ "questo è il motivo per cui le chiavi ElGamal solo per cifrare non sono\n"
+#~ "disponibili in questo menù."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Anche se queste chiavi sono definite da RFC2400 non sono suggerite perché "
+#~ "non\n"
+#~ "sono gestite da tutti i programmi e le firme create sono grandi e lunghe "
+#~ "da\n"
+#~ "verificare."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "Per ora sono state controllate %lu chiavi (%lu firme)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "chiave incompleta\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "chiave %08lX incompleta\n"
diff --git a/po/ja.gmo b/po/ja.gmo
new file mode 100644 (file)
index 0000000..4a76c10
Binary files /dev/null and b/po/ja.gmo differ
diff --git a/po/ja.po b/po/ja.po
new file mode 100644 (file)
index 0000000..e1bcd86
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,6557 @@
+# Japanese messages for GnuPG
+# Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
+# IIDA Yosiaki <iida@gnu.org>, 1999, 2000, 2002, 2003, 2004.
+# Yoshihiro Kajiki <kajiki@ylug.org>, 1999.
+# This file is distributed under the same license as the GnuPG package.
+# Special thanks to "Takashi P.KATOH".
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.3.92\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-11-23 11:14+0900\n"
+"Last-Translator: IIDA Yosiaki <iida@gnu.org>\n"
+"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=EUC-JP\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "pbits=%u qbits=%u¤ÎÁÇ¿ô¤ÏÀ¸À®¤Ç¤­¤Þ¤»¤ó\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "%d ¥Ó¥Ã¥È̤Ëþ¤ÎÁÇ¿ô¤ÏÀ¸À®¤Ç¤­¤Þ¤»¤ó\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "¥¨¥ó¥È¥í¥Ô¡¼¼ý½¸¥â¥¸¥å¡¼¥ë¤¬¡¢¸¡½Ð¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "¡Ö%s¡×¤¬¥í¥Ã¥¯¤Ç¤­¤Þ¤»¤ó\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "¡Ö%s¡×¤ØÈëÌ©¸°¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "¡Ö%s¡×¤¬³«¤±¤Þ¤»¤ó: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "¡Ö%s¡×¤òÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "¡Ö%s¡×¤ÏÉáÄ̤Υե¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó - Ìµ»ë\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "Ãí°Õ: random_seed ¥Õ¥¡¥¤¥ë¤Ï¶õ¤Ç¤¹\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "·Ù¹ð: Ìµ¸ú¤ÊŤµ¤Î random_seed ¥Õ¥¡¥¤¥ë - »È¤¤¤Þ¤»¤ó\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "¡Ö%s¡×¤òÆɤá¤Þ¤»¤ó: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "Ãí°Õ: random_seed ¥Õ¥¡¥¤¥ë¤Î¹¹¿·¤ò¤·¤Þ¤»¤ó\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "¡Ö%s¡×¤¬ºîÀ®¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "¡Ö%s¡×¤Ë½ñ¤­¹þ¤á¤Þ¤»¤ó: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "¡Ö%s¡×¤òÊĤ¸¤é¤ì¤Þ¤»¤ó: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "·Ù¹ð: ·õÆݤÊÍð¿ôÀ¸À®»Ò¤¬»È¤ï¤ì¤Æ¤¤¤Þ¤¹!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"ÅëºÜ¤µ¤ì¤Æ¤¤¤ëÍð¿ôÀ¸À®»Ò¤Ï¡¢°Å¹æÍѤȤ·¤Æ¤Ï¤ª¤½¤Þ¤Ä¤Ç¡¢\n"
+"¶¯¤¤Íð¿ô¤¬¤Ç¤­¤Þ¤»¤ó!\n"
+"\n"
+"¤³¤Î¥×¥í¥°¥é¥à¤ÎÀ¸À®¤·¤¿¥Ç¡¼¥¿¤ò°ìÀڻȤäƤϤ¤¤±¤Þ¤»¤ó!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Í𻨤µ¤ò¼ý½¸¤·¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢¤ªÂÔ¤Á¤¯¤À¤µ¤¤¡£Í𻨤µ¤Î¼Á¤¬¸þ¾å\n"
+"¤·¤Þ¤¹¤Î¤Ç¡¢¤â¤·Ë°¤­¤¿¤é²¿¤«ºî¶È¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"½½Ê¬¤ÊŤµ¤ÎÍð¿ô¤¬ÆÀ¤é¤ì¤Þ¤»¤ó¡£OS¤¬¤â¤Ã¤ÈÍ𻨤µ¤ò¼ý½¸\n"
+"¤Ç¤­¤ë¤è¤¦¡¢²¿¤«¤·¤Æ¤¯¤À¤µ¤¤! (¤¢¤È%d¥Ð¥¤¥È¤¤¤ê¤Þ¤¹)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "»ØÌæ¤ÎÊݴɤ˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "À¸À®Æü¤ÎÊݴɤ˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "¸°¤ÎÆɽФ·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "±þÅú¤Ë¸ø³«¸°¥Ç¡¼¥¿¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "±þÅú¤ËRSA¤ÎË¡(modulus)¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "±þÅú¤ËRSA¸ø³«»Ø¿ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN¥³¡¼¥ë¥Ð¥Ã¥¯¤¬¥¨¥é¡¼¤òÌᤷ¤Þ¤·¤¿: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "CHV%d¤ÎPIN¤¬Ã»¤¹¤®¤Þ¤¹¡£ºÇû¤Ç%d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "CHV%d¤Î¸¡¾Ú¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "´ÉÍý¥³¥Þ¥ó¥É¤Ø¤Î¥¢¥¯¥»¥¹¤¬½é´üÀßÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "¥«¡¼¥É¤«¤é¤ÎCHV¾õÂ֤θ¡º÷¤Ç¥¨¥é¡¼\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "¥«¡¼¥É¤¬±Êµ×¤Ë¥í¥Ã¥¯¤µ¤ì¤Þ¤¹!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr "¥«¡¼¥É¤Î±Êµ×¥í¥Ã¥¯Á°¤Ë%d¤ÎAdmin PIN¤¬»î¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Admin PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+#, fuzzy
+msgid "|AN|New Admin PIN"
+msgstr "|A|¿·¤·¤¤Admin PIN"
+
+#: g10/app-openpgp.c:1492
+#, fuzzy
+msgid "|N|New PIN"
+msgstr "¿·¤·¤¤PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "¿·¤·¤¤PIN¤Î¼èÆÀ¥¨¥é¡¼: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¦¥Ç¡¼¥¿¤ÎÆɽФ·¥¨¥é¡¼\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "»ØÌæ¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ÎÆɽФ·¥¨¥é¡¼\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "¸°¤Ï¤â¤¦¤¢¤ê¤Þ¤¹\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "´û¸¤Î¸°¤Ï¸ò´¹¤µ¤ì¤Þ¤¹\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "¿·¤·¤¤¸°¤òÀ¸À®\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, fuzzy, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "¸ø³«»Ø¿ô¤¬Â礭¤¹¤®¤Þ¤¹ (32¥Ó¥Ã¥È¤è¤êÂç)\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "¸°¤ÎÊݴɤ˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "¸°À¸À®¤Î´Ö¡¢¤ªÂÔ¤Á¤¯¤À¤µ¤¤ ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "¸°¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "¸°¤ÎÀ¸À®¤¬´°Î»¤·¤Þ¤·¤¿ (%dÉÃ)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "OpenPGP¥«¡¼¥É¤Ë̵¸ú¤Ê¹½Â¤ (¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s½ð̾¡¢Í×Ì󥢥르¥ê¥º¥à %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "¤³¤ì¤Þ¤Ç¤ËºîÀ®¤µ¤ì¤¿½ð̾: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, fuzzy, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "PIN [½ð̾ºÑ: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "%s¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó - Ìµ¸ú¤ÊOpenPGP¥«¡¼¥É?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ÊñÁõ: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "̵¸ú¤ÊÊñÁõ¥Ø¥Ã¥À¡¼: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "ÊñÁõ¥Ø¥Ã¥À¡¼: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "̵¸ú¤Ê¥¯¥ê¥¢½ð̾¥Ø¥Ã¥À¡¼\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "Æþ¤ì»Ò¤Î¥¯¥ê¥¢½ð̾\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "ͽ´ü¤»¤ÌÊñÁõ: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "̵¸ú¤Ê¥À¥Ã¥·¥å¤Ç¥¨¥¹¥±¡¼¥×¤µ¤ì¤¿¹Ô: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "̵¸ú¤Ê64¿Êʸ»ú%02X¤ò¤È¤Ð¤·¤Þ¤·¤¿\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "¥Õ¥¡¥¤¥ëËöÈø¤¬Á᤹¤®¤Þ¤¹ (CRC¤¬¤¢¤ê¤Þ¤»¤ó)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "¥Õ¥¡¥¤¥ëËöÈø¤¬Á᤹¤®¤Þ¤¹ (CRC¤ÎÅÓÃæ)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC¤Î½ñ¼°¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC¥¨¥é¡¼¡£%06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "¥Õ¥¡¥¤¥ëËöÈø¤¬Á᤹¤®¤Þ¤¹ (¸åÈøÉô¤ÎÃæ¤Ë¤¢¤ê¤Þ¤¹)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "¸åÈø¤Î¹Ô¤Ë¥¨¥é¡¼¤¬¤¢¤ê¤Þ¤¹\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "Í­¸ú¤ÊOpenPGP¥Ç¡¼¥¿¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "̵¸ú¤ÊÊñÁõ: ¹Ô¤ÎŤµ¤¬%dʸ»ú¤òĶ¤¨¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"ÊñÁõ¤ÎÃæ¤Ëquoted printableʸ»ú¤¬¤¢¤ê¤Þ¤¹¡£¤ª¤½¤é¤¯¥Ð¥°¤Î¤¢¤ë\n"
+"MTA¤ò»È¤Ã¤¿¤Î¤Ç¤·¤ç¤¦\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP¥«¡¼¥É¤¬Ìµ¸ú¤Ç¤¹: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "OpenPGP¥«¡¼¥Éno. %s¤ò¸¡½Ð\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "¤½¤ì¤Ï¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤Ç¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "ÁªÂò¤Ï? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[̤ÀßÄê]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "ÃË"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "½÷"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "̵»ØÄê"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "̤½èÍý"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "¶¯À©"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "¥¨¥é¡¼¡§ ¤Î¤Ù¤¿¤ó¤ÎASCII¤À¤±¤¬º£¡¢µö²Ä¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "¥¨¥é¡¼: ¡È<¡Éʸ»ú¤Ï»È¤¨¤Þ¤»¤ó¡£\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "¥¨¥é¡¼: Æó½Å¤Î¶õÇò¤Ï¶Ø»ß¤Ç¤¹¡£\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "¥«¡¼¥É½êÍ­¼Ô¤ÎÀ« (surname): "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "¥«¡¼¥É½êÍ­¼Ô¤Î̾ (given name): "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "¥¨¥é¡¼: ¤Ä¤Ê¤¤¤À̾Á°¤¬Ä¹¤¹¤®¤Þ¤¹ (¾å¸Â%dʸ»ú)¡£\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "¸ø³«¸°¤òõº÷¤¹¤ëURL: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "¥¨¥é¡¼: URL¤¬Ä¹¤¹¤®¤Þ¤¹ (¾å¸Â%dʸ»ú)¡£\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "¡Ö%s¡×¤ÎÆɽФ·¥¨¥é¡¼: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "¥í¥°¥¤¥ó¡¦¥Ç¡¼¥¿ (¥¢¥«¥¦¥ó¥È̾): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "¥¨¥é¡¼: ¥í¥°¥¤¥ó¡¦¥Ç¡¼¥¿¤¬Ä¹¤¹¤®¤Þ¤¹ (¾å¸Â%dʸ»ú)¡£\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, fuzzy, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "¥¨¥é¡¼: URL¤¬Ä¹¤¹¤®¤Þ¤¹ (¾å¸Â%dʸ»ú)¡£\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "¸À¸ì¤ÎÁª¹¥: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "¥¨¥é¡¼: Áª¹¥Ê¸»úÎó¤ÎŤµ¤¬Ìµ¸ú¤Ç¤¹¡£\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "¥¨¥é¡¼: Áª¹¥Ê¸»úÎó¤Ë̵¸ú¤Êʸ»ú¤¬¤¢¤ê¤Þ¤¹¡£\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "À­ÊÌ ((M)ÃË¡¢(F)½÷¡¢¶õÇò): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "¥¨¥é¡¼: Ìµ¸ú¤Ê±þÅú¡£\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA¤Î»ØÌæ: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "¥¨¥é¡¼: Ìµ¸ú¤Ê·Á¼°¤Î»ØÌæ¡£\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "¸°¤ÏÁàºî¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "OpenPGP¥«¡¼¥É¤Ç¤¢¤ê¤Þ¤»¤ó"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "¸½¹Ô¸°¾ðÊó¤Î¼èÆÀ¥¨¥é¡¼: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "´û¸¤Î¸°¤ò¸ò´¹¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "°Å¹æ¸°¤ò¥«¡¼¥É³°¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤·¤Þ¤¹¤«? (Y/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "´û¸¤Î¸°·²¤ò¸ò´¹¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"½Ð²Ù»þ¤ÎPINÀßÄê¤Ï\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"¼¡¤Î¥³¥Þ¥ó¥É¤ò»È¤Ã¤ÆÊѹ¹¤¹¤Ù¤­¤Ç¤¹ --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "À¸À®¤¹¤ë¸°¤Î·¿¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) ½ð̾¸°\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) °Å¹æ²½¸°\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Ç§¾Ú¸°\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "̵¸ú¤ÊÁªÂò¤Ç¤¹¡£\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "¸°¤ÎÊݴɾì½ê¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "̤ÃΤθ°Êݸ¥ë¥´¥ê¥º¥à¤Ç¤¹\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "¸°¤ÎÈëÌ©Éôʬ¤¬Ìµ¸ú¤Ç¤¹\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "ÈëÌ©¸°¤Ï¤â¤¦¥«¡¼¥É¤ËÊݴɤ·¤Æ¤¢¤ê¤Þ¤¹\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "¤³¤Î¥á¥Ë¥å¡¼¤ò½ªÎ»"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "´ÉÍý¥³¥Þ¥ó¥É¤òɽ¼¨"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "¤³¤Î¥Ø¥ë¥×¤òɽ¼¨"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "Á´Í­¸ú¥Ç¡¼¥¿¤òɽ¼¨"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "¥«¡¼¥É½êÍ­¼Ô¤Î̾Á°¤ÎÊѹ¹"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "¸°¤òõº÷¤¹¤ëURL¤ÎÊѹ¹"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "¥«¡¼¥ÉURL¤Ç»ØÄꤵ¤ì¤¿¸°¤Î°ú¤­½Ð¤·"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "¥í¥°¥¤¥ó̾¤ÎÊѹ¹"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "¸À¸ìÁª¹¥¤ÎÊѹ¹"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "¥«¡¼¥É½êÍ­¼Ô¤ÎÀ­Ê̤ÎÊѹ¹"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "CA»ØÌæ¤ÎÊѹ¹"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "½ð̾¶¯À©PIN¥Õ¥é¥°¤òȿž"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "¿·¤·¤¤¸°·²¤òÀ¸À®"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "PIN¥Ö¥í¥Ã¥¯¤Î²ò½ü¤äÊѹ¹¤Î¥á¥Ë¥å¡¼"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "¥³¥Þ¥ó¥É> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "´ÉÍýÀìÍÑ¥³¥Þ¥ó¥É\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "´ÉÍý¥³¥Þ¥ó¥É¤¬µö²Ä¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "´ÉÍý¥³¥Þ¥ó¥É¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "̵¸ú¤Ê¥³¥Þ¥ó¥É (¡Èhelp¡É¤ò»²¾È)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "ÈëÌ©¸°¤¬ÆÀ¤é¤ì¤Þ¤»¤ó"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "¥«¡¼¥É¤òÁÞÆþ¤·return¤òÂǤĤ«¡¢'c'¤Ç¼è¾Ã¤·: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "¸°¥Ö¥í¥Ã¥¯¤Îºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"º£¤Î¥«¡¼¥É¤òÈ´¤­¡¢¼¡¤ÎÄÌÈ֤Τ½¤ì¤òÆþ¤ì¤Æ¤¯¤À¤µ¤¤:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "ÍÑ°Õ¤·¤Æreturn¤òÂǤĤ«¡¢'c'¤Ç¼è¾Ã¤·: "
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Admin PIN¤ÎÆþÎÏ: "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "PIN¤ÎÆþÎÏ: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Admin PIN¤ÎÆþÎÏ: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "PIN¤ÎÆþÎÏ: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "PIN¤òºÆÆþÎÏ: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN¤ò¤Á¤ã¤ó¤È·«¤êÊÖ¤·¤Æ¤¤¤Þ¤»¤ó¡£ºÆÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "¡Ö%s¡×¤¬³«¤±¤Þ¤»¤ó\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "¤³¤Î¥³¥Þ¥ó¥É¤Ç--output¤Ïµ¡Ç½¤·¤Þ¤»¤ó\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "¸°¡È%s¡É¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "¸°¥Ö¥í¥Ã¥¯¤ÎÆɽФ·¥¨¥é¡¼: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(¤¢¤ë¤¤¤Ï¡¢»ØÌæ¤Ç¸°¤ò»ØÄê)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "¡È--yes¡É¤Î¤Ê¤¤¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤Ç¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "¤³¤Î¸°¤ò¸°Îؤ«¤éºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "¤³¤ì¤ÏÈëÌ©¸°¤Ç¤¹! ËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "¸°¥Ö¥í¥Ã¥¯¤Îºï½ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "½êÍ­¼Ô¿®ÍѾðÊó¤ò¥¯¥ê¥¢¤·¤Þ¤·¤¿\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "¤³¤Î¸ø³«¸°¤Ë¤¿¤¤¤¹¤ëÈëÌ©¸°¡È%s¡É¤¬¤¢¤ê¤Þ¤¹!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "¤Þ¤º¡È--delete-secret-keys¡É¥ª¥×¥·¥ç¥ó¤Ç¤³¤ì¤òºï½ü¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÎºîÀ®¥¨¥é¡¼: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "S2K¥â¡¼¥É¤Î¤¿¤á¡¢ÂоÎESK¥Ñ¥±¥Ã¥È¤ò»È¤¨¤Þ¤»¤ó\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "%s°Å¹æË¡¤ò»È¤¤¤Þ¤¹\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "¡Ö%s¡×¤Ï¤â¤¦°µ½ÌºÑ¤ß¤Ç¤¹\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "·Ù¹ð: ¡Ö%s¡×¤Ï¶õ¤Î¥Õ¥¡¥¤¥ë¤Ç¤¹\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "--pgp2¥â¡¼¥É¤Ç¤Ï2048¥Ó¥Ã¥È°Ê²¼¤ÎRSA¸°¤Ç°Å¹æ²½¤·¤«¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "¡Ö%s¡×¤«¤éÆɤ߽Ф·¤Þ¤¹\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "°Å¹æ²½¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¸°¤ÏÁ´ÉôIDEA°Å¹æ¤ò»È¤¨¤Þ¤»¤ó¡£\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "·Ù¹ð: ÂоΰŹæË¡ %s (%d) ¤Î¶¯À©¤¬¡¢¼õ¼è¿Í¤ÎÁª¹¥¤ÈÂÐΩ¤·¤Þ¤¹\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "·Ù¹ð: °µ½Ì¥¢¥ë¥´¥ê¥º¥à %s (%d) ¤Î¶¯À©¤¬¡¢¼õ¼è¿Í¤ÎÁª¹¥¤ÈÂÐΩ¤·¤Þ¤¹\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "ÂоΰŹæË¡ %s (%d) ¤Î¶¯À©¤¬¡¢¼õ¼è¿Í¤ÎÁª¹¥¤ÈÂÐΩ¤·¤Þ¤¹\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "%s¤ò%s¥â¡¼¥É¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s°Å¹æ²½ ¼õ¿®¼Ô:¡È%s¡É\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s°Å¹æ²½ºÑ¤ß¥Ç¡¼¥¿\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "̤ÃΤΥ¢¥ë¥´¥ê¥º¥à%d¤Ë¤è¤ë°Å¹æ²½\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "·Ù¹ð: ¥á¥Ã¥»¡¼¥¸¤ÏÂоΰŹæË¡¤Î¼å¤¤¸°¤Ç°Å¹æ²½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "°Å¹æ²½¥Ñ¥±¥Ã¥È¤Î¼è°·¤¤¤Ç¾ã³²\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "±ó³Ö¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤Ï¡¢¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¡¼¡Ö%s¡×¤¬ºîÀ®¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"¥ª¥×¥·¥ç¥ó¡¦¥Õ¥¡¥¤¥ë¤Îµö²Ä¥â¡¼¥É¤¬¡¢°ÂÁ´¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¢\n"
+"³°Éô¥×¥í¥°¥é¥à¤Î¸Æ½Ð¤·¤Ï¡¢»ÈÍѶػߤǤ¹¡£\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"¤³¤Î¥×¥é¥Ã¥È¥Û¡¼¥à¤À¤È¡¢³°Éô¥×¥í¥°¥é¥à¤Î¸Æ½Ð¤·¤Ë¤Ï¡¢°ì»þ¥Õ¥¡¥¤¥ë¤¬É¬ÍפǤ¹\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "¡Ö%s¡×¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "¥·¥§¥ë¡Ö%s¡×¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "³°Éô¥×¥í¥°¥é¥à¤Î¸Æ½Ð¤·¤Ç¥·¥¹¥Æ¥à¡¦¥¨¥é¡¼: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "³°Éô¥×¥í¥°¥é¥à¤¬¡¢ÉÔ¼«Á³¤Ë½ªÎ»\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "³°Éô¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "³°Éô¥×¥í¥°¥é¥à¤Î±þÅú¤òÆɤ߽Ф»¤Þ¤»¤ó: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "·Ù¹ð: °ì»þ¥Õ¥¡¥¤¥ë¤òºï½ü¤Ç¤­¤Þ¤»¤ó (%s) ¡Ö%s¡×: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "·Ù¹ð: °ì»þ¥Ç¥£¥ì¥¯¥È¥ê¡¼¡Ö%s¡×¤òºï½ü¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "½ð̾¤Ï¡¢¼º¸úÉԲĤËÀßÄꤵ¤ì¤Þ¤¹¡£\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "¡È%s¡ÉÍѤμº¸ú¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "Éû¸°¤Î¼º¸ú"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "»ÈÍѤǤ­¤Ê¤¤ÈëÌ©¸°¤Ç¤¹"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "ÈëÌ©¸°¤Î½ñ½Ð¤·¤Ï¶Ø»ß¤Ç¤¹\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "¸°%s: Êݸ¤ì¤Æ¤¤¤Þ¤»¤ó - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "¸°%s: PGP 2.x·Á¼°¤Î¸°¤Ç¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "¸°%s: Éû¸°½ð̾¤Î¾ì½ê¤¬¡¢¸í¤Ã¤Æ¤¤¤Þ¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "¸°¤ÎÊݴɤ˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "·Ù¹ð: ÈëÌ©¸°%s¤Ë¤Ï¡¢Ã±½ã¤ÊSK¥Á¥§¥Ã¥¯¥µ¥à¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "·Ù¹ð: ²¿¤â½ñ¤­½Ð¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@¥³¥Þ¥ó¥É:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[¥Õ¥¡¥¤¥ë]|½ð̾¤òºîÀ®"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[¥Õ¥¡¥¤¥ë]|¥¯¥ê¥¢½ð̾¤òºîÀ®"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "ʬΥ½ð̾¤òºîÀ®"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "¥Ç¡¼¥¿¤ò°Å¹æ²½"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "°Å¹æ²½¤Ë¤ÏÂоΰŹæË¡¤Î¤ß¤ò»ÈÍÑ"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "¥Ç¡¼¥¿¤òÉü¹æ (´ûÄê)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "½ð̾¤ò¸¡¾Ú"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "¸°¤Î°ìÍ÷"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "¸°¤È½ð̾¤Î°ìÍ÷"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "¸°½ð̾¤Î¸¡ºº¤È°ìÍ÷"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "¸°¤È»ØÌæ¤Î°ìÍ÷"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "ÈëÌ©¸°¤Î°ìÍ÷"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "¿·¤·¤¤¸°ÂФòÀ¸À®"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "¸ø³«¸°Îؤ«¤é¸°·²¤òºï½ü"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "ÈëÌ©¸°Îؤ«¤é¸°·²¤òºï½ü"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "¸°¤Ë½ð̾"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "¸°¤ØÆâÉôŪ¤Ë½ð̾"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "¸°¤Ø¤Î½ð̾¤äÊÔ½¸"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "¼º¸ú¾ÚÌÀ½ñ¤òÀ¸À®"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "¸°¤ò½ñ¤­½Ð¤¹"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Ë¸°¤ò½ñ¤­½Ð¤¹"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤«¤é¸°¤òÆɤ߹þ¤à"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Î¸°¤ò¸¡º÷¤¹¤ë"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤«¤é¸°¤òÁ´Éô¹¹¿·¤¹¤ë"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "¸°¤ÎÆɹþ¤ß/Ê»¹ç"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "¥«¡¼¥É¾õÂÖ¤òɽ¼¨"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "¥«¡¼¥É¤Î¥Ç¡¼¥¿¤òÊѹ¹"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "¥«¡¼¥É¤ÎPIN¤òÊѹ¹"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|¥¢¥ë¥´¥ê¥º¥à [¥Õ¥¡¥¤¥ë]|¥á¥Ã¥»¡¼¥¸Í×Ìó¤òɽ¼¨"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"¥ª¥×¥·¥ç¥ó:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "ASCII·Á¼°¤ÎÊñÁõ¤òºîÀ®"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|̾Á°|¡Ö̾Á°¡×ÍѤ˰Ź沽"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+"½ð̾¤äÉü¹æ¤Ë¤³¤Î¥æ¡¼¥¶¡¼id\n"
+"¤ò»ÈÍÑ"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+"|N|°µ½Ì¥ì¥Ù¥ë¤òN¤ËÀßÄê\n"
+"(0¤ÏÈó°µ½Ì)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "Àµ½à¥Æ¥­¥¹¥È¡¦¥â¡¼¥É¤ò»ÈÍÑ"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "½ÐÎÏ¥Õ¥¡¥¤¥ë¤È¤·¤Æ»ÈÍÑ"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "¾éĹ"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "̵Êѹ¹"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "¾å½ñ¤­Á°¤Ë³Îǧ"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "¸·Ì©¤ÊOpenPGP¤Î¿¶Éñ¤òºÎÍÑ"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "PGP 2.x¸ß´¹¤Î¥á¥Ã¥»¡¼¥¸¤òÀ¸À®"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(¥³¥Þ¥ó¥É¤È¥ª¥×¥·¥ç¥óÁ´Éô¤Î°ìÍ÷¤Ï¡¢\n"
+"¥Þ¥Ë¥å¥¢¥ë¡¦¥Ú¡¼¥¸¤ò¤´Í÷¤¯¤À¤µ¤¤)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Îã:\n"
+"\n"
+" -se -r Bob [¥Õ¥¡¥¤¥ë]      ½ð̾¤È¥æ¡¼¥¶¡¼Bob¤Ø¤Î°Å¹æ²½\n"
+" --clearsign [¥Õ¥¡¥¤¥ë]     ¥¯¥ê¥¢½ð̾¤òºîÀ®\n"
+" --detach-sign [¥Õ¥¡¥¤¥ë]   Ê¬Î¥½ð̾¤òºîÀ®\n"
+" --list-keys [̾Á°]         ¸°¤òɽ¼¨\n"
+" --fingerprint [̾Á°]       »ØÌæ¤òɽ¼¨\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "¥Ð¥°¤ò¸«¤Ä¤±¤¿¤é <gnupg-bugs@gnu.org> ¤Þ¤Ç¤´Êó¹ð¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "»È¤¤Êý: gpg [¥ª¥×¥·¥ç¥ó] [¥Õ¥¡¥¤¥ë] (¥Ø¥ë¥×¤Ï -h)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"½ñ¼°: gpg [¥ª¥×¥·¥ç¥ó] [¥Õ¥¡¥¤¥ë]\n"
+"½ð̾¡¢¸¡ºº¡¢°Å¹æ²½¤äÉü¹æ\n"
+"´ûÄê¤ÎÁàºî¤Ï¡¢ÆþÎϥǡ¼¥¿¤Ë°Í¸\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¥¢¥ë¥´¥ê¥º¥à:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "¸ø³«¸°: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "°Å¹æË¡: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "¥Ï¥Ã¥·¥å: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "°µ½Ì: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "»È¤¤Êý: gpg [¥ª¥×¥·¥ç¥ó] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "ÂÐΩ¤¹¤ë¥³¥Þ¥ó¥É\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "=µ­¹æ¤¬¡¢¥°¥ë¡¼¥×ÄêµÁ¡Ö%s¡×Æâ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "·Ù¹ð: homedir ¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤½êÍ­¼Ô\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "·Ù¹ð: ¹½À®¥Õ¥¡¥¤¥ë¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤½êÍ­¼Ô\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "·Ù¹ð: ³ÈÄ¥¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤½êÍ­¼Ô\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "·Ù¹ð: homedir ¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤µö²Ä\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "·Ù¹ð: ¹½À®¥Õ¥¡¥¤¥ë¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤µö²Ä\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "·Ù¹ð: ³ÈÄ¥¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤µö²Ä\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "·Ù¹ð: homedir ¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼½êÍ­¼Ô\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "·Ù¹ð: ¹½À®¥Õ¥¡¥¤¥ë¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼½êÍ­¼Ô\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "·Ù¹ð: ³ÈÄ¥¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼½êÍ­¼Ô\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "·Ù¹ð: homedir ¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼µö²Ä\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "·Ù¹ð: ¹½À®¥Õ¥¡¥¤¥ë¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼µö²Ä\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "·Ù¹ð: ³ÈÄ¥¡Ö%s¡×¤Î°ÂÁ´¤Ç¤Ê¤¤¾å°Ì¥Ç¥£¥ì¥¯¥È¥ê¡¼µö²Ä\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "̤ÃΤι½À®¹àÌÜ¡Ö%s¡×\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "ÈëÌ©¸°ÎؤËÂбþ¤¹¤ë½ð̾¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "»ØÄꤵ¤ì¤¿Áª¹¥¸°¥µ¡¼¥Ð¡¼URL¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "ÈëÌ©¸°¤È¸ø³«¸°¤Î°ìÍ÷¤Îȿž"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "ÈëÌ©¸°ÎؤËÂбþ¤¹¤ë½ð̾¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "Ãí°Õ: ÀΡ¢´ûÄê¤À¤Ã¤¿¥ª¥×¥·¥ç¥ó¡¦¥Õ¥¡¥¤¥ë¡Ö%s¡×¤Ï¡¢Ìµ»ë¤µ¤ì¤Þ¤¹\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "Ãí°Õ: ´ûÄê¤Î¥ª¥×¥·¥ç¥ó¡¦¥Õ¥¡¥¤¥ë¡Ö%s¡×¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "¥ª¥×¥·¥ç¥ó¡¦¥Õ¥¡¥¤¥ë¡Ö%s¡×: %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "¡Ö%s¡×¤«¤é¥ª¥×¥·¥ç¥ó¤òÆɤ߽Ф·¤Þ¤¹\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "Ãí°Õ: ÉáÄÌ%s¤Ï»È¤¤¤Þ¤»¤ó!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "°ÂÁ´¤Ç¤Ê¤¤µö²Ä¤Î¤¿¤á¡¢°Å¹æË¡³ÈÄ¥¡Ö%s¡×¤ò¥í¡¼¥É¤·¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "¡Ö%s¡×¤Ï¡¢Í­¸ú¤Êʸ»ú½¸¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "¡Ö%s¡×¤Ï¡¢Í­¸ú¤Êʸ»ú½¸¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤ÎURL¤ò²òÀÏÉÔǽ\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: Ìµ¸ú¤Ê¸°¥µ¡¼¥Ð¡¼¡¦¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "̵¸ú¤Ê¸°¥µ¡¼¥Ð¡¼¡¦¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: Ìµ¸ú¤ÊÆɹþ¤ß¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "̵¸ú¤ÊÆɹþ¤ß¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: Ìµ¸ú¤Ê½ñ½Ð¤·¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "̵¸ú¤Ê½ñ½Ð¤·¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: Ìµ¸ú¤Ê°ìÍ÷¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "̵¸ú¤Ê°ìÍ÷¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "¡Ö%s¡×¤Ï¡¢Í­¸ú¤Êʸ»ú½¸¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "»ØÄꤵ¤ì¤¿Áª¹¥¸°¥µ¡¼¥Ð¡¼URL¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "¡Ö%s¡×¤Ï¡¢Í­¸ú¤Êʸ»ú½¸¹ç¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: Ìµ¸ú¤Ê¸¡¾Ú¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "̵¸ú¤Ê¸¡¾Ú¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "exec-path¤ò%s¤ËÀßÄêÉÔǽ\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: Ìµ¸ú¤Ê¸¡¾Ú¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "·Ù¹ð: ¥×¥í¥°¥é¥à¤Î¥³¥¢¡¦¥Õ¥¡¥¤¥ë¤¬¤Ç¤­¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "·Ù¹ð: %s¤Ï%s¤è¤êÍ¥Àè\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s¤Ï%s¤È¤È¤â¤Ë»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s¤Ï%s¤È¤È¤â¤Ë»È¤Ã¤Æ¤â̵°ÕÌ£¤Ç¤¹!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "¤³¤Î¥»¥Ã¥·¥ç¥ó¤Çgpg-agent¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "¡Ö%s¡×¤ØÈëÌ©¸°¥¹¥¿¥Ö¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "--pgp2¥â¡¼¥É¤Ç¤ÏʬΥ½ð̾¤«¥¯¥ê¥¢½ð̾¤À¤±¤·¤«¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "--pgp2¥â¡¼¥É¤Ç¤Ï½ð̾¤È°Å¹æ²½¤òƱ»þ¤Ë¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "--pgp2¤ò»ØÄꤷ¤¿¤é¡¢(¥Ñ¥¤¥×¤Ç¤Ê¤¯) ¥Õ¥¡¥¤¥ë¤ò»ØÄꤻ¤Í¤Ð¤Ê¤ê¤Þ¤»¤ó¡£\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "--pgp2¥â¡¼¥É¤Î¥á¥Ã¥»¡¼¥¸°Å¹æ²½¤Ç¤Ï¡¢IDEA°Å¹æË¡¤¬É¬ÍפǤ¹\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "ÁªÂò¤µ¤ì¤¿°Å¹æ¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢Ìµ¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "ÁªÂò¤µ¤ì¤¿Í×Ì󥢥르¥ê¥º¥à¤Ï¡¢Ìµ¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "ÁªÂò¤µ¤ì¤¿°µ½Ì¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢Ìµ¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "ÁªÂò¤µ¤ì¤¿¾ÚÌÀ½ñÍ×Ì󥢥르¥ê¥º¥à¤Ï¡¢Ìµ¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed¤ÏÀµ¤ÎÃͤ¬É¬ÍפǤ¹\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed¤Ï1¤è¤êÂ礭¤ÊÃͤ¬É¬ÍפǤ¹\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth¤Ï1¤«¤é255¤ÎÈϰϤǤʤ±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "̵¸ú¤Êdefault-cert-level¡£0¤«1¤«2¤«3¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "̵¸ú¤Êmin-cert-level¡£0¤«1¤«2¤«3¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "Ãí°Õ: Ã±½ã¤ÊS2K¥â¡¼¥É(0)¤Î»ÈÍѤˤ϶¯¤¯È¿ÂФ·¤Þ¤¹\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "̵¸ú¤ÊS2K¥â¡¼¥É¡£0¤«1¤«3¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "̵¸ú¤Ê´ûÄê¤ÎÁª¹¥\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "̵¸ú¤Ê¸Ä¿ÍÍѰŹæË¡¤ÎÁª¹¥\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "̵¸ú¤Ê¸Ä¿ÍÍÑÍ×Ìó¤ÎÁª¹¥\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "̵¸ú¤Ê¸Ä¿ÍÍÑ°µ½Ì¤ÎÁª¹¥\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s¤Ï%s¤Çµ¡Ç½¤·¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "°Å¹æ¥¢¥ë¥´¥ê¥º¥à¡Ö%s¡×¤ò%s¥â¡¼¥É¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "Í×Ì󥢥르¥ê¥º¥à¡Ö%s¡×¤ò%s¥â¡¼¥É¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "°µ½Ì¥¢¥ë¥´¥ê¥º¥à¡Ö%s¡×¤ò%s¥â¡¼¥É¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î½é´ü²½¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr "·Ù¹ð: ¸ø³«¸°°Å¹æ¤ò»È¤ï¤º¤Ë¡¢¼õ¼è¿Í (-r) ¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "¡Ö%s¡×¤ÎÂоΰŹæ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "--symmetric --encrypt¤ò--s2k-mode 0¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "--symmetric --encrypt¤ò%s¥â¡¼¥É¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "--symmetric --sign --encrypt¤ò--s2k-mode 0¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "--symmetric --sign --encrypt¤ò%s¥â¡¼¥É¤Ç»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key ¥æ¡¼¥¶¡¼id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key ¥æ¡¼¥¶¡¼id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key ¥æ¡¼¥¶¡¼id [¥³¥Þ¥ó¥É]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [¥æ¡¼¥¶¡¼id] [¸°ÎØ]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Ø¤ÎÁ÷¿®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤«¤é¤Î¼õ¿®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "¸°¤Î½ñ½Ð¤·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Î¸¡º÷¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Î²óÉü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "ÊñÁõ½üµî¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "ÊñÁõ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "̵¸ú¤Ê¥Ï¥Ã¥·¥å¡¦¥¢¥ë¥´¥ê¥º¥à¡Ö%s¡×¤Ç¤¹\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[¥Õ¥¡¥¤¥ë̾]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "³«»Ï¤·¤Þ¤¹¡£¥á¥Ã¥»¡¼¥¸¤òÂǤäƤ¯¤À¤µ¤¤ ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "¤¢¤¿¤¨¤é¤ì¤¿¾ÚÌÀ½ñ¥Ý¥ê¥·¡¼URL¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "¤¢¤¿¤¨¤é¤ì¤¿½ð̾¥Ý¥ê¥·¡¼URL¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "»ØÄꤵ¤ì¤¿Áª¹¥¸°¥µ¡¼¥Ð¡¼URL¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "pk¥­¥ã¥Ã¥·¥å¤Î¥¨¥ó¥È¥ê¡¼¤¬Â¿¤¹¤®¤Þ¤¹ - »ÈÍѶػß\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[¥æ¡¼¥¶¡¼ID¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "--allow-non-selfsigned-uid¤ÇÍ­¸ú¤Ë¤µ¤ì¤¿Ìµ¸ú¤Ê¸°%s¤Ç¤¹\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "¸ø³«Éû¸°%s¤Ë¤¿¤¤¤¹¤ëÈëÌ©Éû¸°¤¬¤¢¤ê¤Þ¤»¤ó - Ìµ»ë\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "Éû¸°%s¤ò¼ç¸°%s¤ËÂåÍѤ·¤Þ¤¹\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "¸°%s: ¸ø³«¸°¤Î¤Ê¤¤ÈëÌ©¸°¤Ç¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "¤ä¤äÀŤ«"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "¤³¤Î¸°¤ò¸°Îؤ«¤éºï½ü¤·¤Þ¤¹"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "Æü»þ¤ÎÌ·½â¤ò·Ù¹ð¤À¤±¤Ë¤·¤Þ¤¹"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr ""
+"|¥Õ¥¡¥¤¥ëµ­½Ò»Ò|¤³¤Î¥Õ¥¡¥¤¥ëµ­½Ò»Ò¤Ë¾õÂÖ¤ò\n"
+"½ñ¤­¹þ¤à"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "»È¤¤Êý: gpgv [¥ª¥×¥·¥ç¥ó] [¥Õ¥¡¥¤¥ë] (¥Ø¥ë¥×¤Ï -h)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"¹½Ê¸: gpg [¥ª¥×¥·¥ç¥ó] [¥Õ¥¡¥¤¥ë]\n"
+"´ûÃΤο®ÍѤ·¤¿¸°¤Ç½ð̾¤ò¸¡ºº\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"¤³¤ÎÃͤλØÄê¤Ï¡¢¤¢¤Ê¤¿¼¡Âè¤Ç¤¹¡£¤³¤ÎÃͤϡ¢Âè»°¼Ô¤Ë·è¤·\n"
+"¤ÆÄ󶡤µ¤ì¤Þ¤»¤ó¡£¤³¤ì¤Ï¡¢web-of-trust ¤Î¼ÂÁõ¤ËɬÍפǡ¢\n"
+"(°ÅÌÛŪ¤Ë¤Ç¤­¤¿) web-of-certificates ¤È¤Ï̵´Ø·¸¤Ç¤¹¡£"
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Web-of-Trust¤ò¹½ÃÛ¤¹¤ë¤¿¤áGnuPG¤Ï¡¢¤É¤Î¸°¤òÀäÂÐŪ¤Ë¿®ÍѤ¹¤ë\n"
+"¤Î¤«¤òÃΤëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤½¤ì¤Ï¤Õ¤Ä¤¦¡¢ÈëÌ©¸°¤Ë¥¢¥¯¥»¥¹¤Ç¤­\n"
+"¤ë¸°¤Î¤³¤È¤Ç¤¹¡£¤³¤Î¸°¤òÀäÂÐŪ¤Ë¿®ÍѤ¹¤ë¤³¤È¤Ë¤¹¤ë¤Ê¤é¡¢\n"
+"¡Èyes¡É¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "¤³¤Î¿®ÍѤǤ­¤Ê¤¤¸°¤ò»È¤¤¤¿¤¯¤Ê¤±¤ì¤Ð¡¢¡Èno¡É¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "¤¢¤Ê¤¿¤ÎÁ÷¤ë¥á¥Ã¥»¡¼¥¸°¸Àè¤Î¥æ¡¼¥¶¡¼ID¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"»ÈÍѤ¹¤ë¥¢¥ë¥´¥ê¥º¥à¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+"\n"
+"DSA (ÊÌ̾DSS) ¤Ï¡¢½ð̾ÀìÍѤÎÅŻҽð̾¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹¡£\n"
+"\n"
+"Elgamal¤Ï¡¢°Å¹æ²½¤Î¤ß¤Î¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹¡£\n"
+"\n"
+"RSA¤Ï¡¢½ð̾¤Ë¤â°Å¹æ²½¤Ë¤â»È¤¨¤Þ¤¹¡£\n"
+"\n"
+"ºÇ½é¤Î¸°(¼ç¸°)¤Ï¡¢½ð̾¤Ë»ÈÍѤǤ­¤ë¸°¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£"
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"°ìÈ̤ˡ¢½ð̾¤È°Å¹æ²½¤ËƱ¤¸¸°¤ò»È¤¦¤Î¤Ï¡¢¤è¤í¤·¤¯¤¢¤ê¤Þ¤»¤ó¡£\n"
+"¤³¤Î¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢°ìÄê¤ÎÈÏ°ÏÆâ¤À¤±¤Ç»È¤ï¤ì¤ë¤Ù¤­¤Ç¤¹¡£\n"
+"¤Þ¤º¡¢¥»¥­¥å¥ê¥Æ¥£¡¼¤ÎÀìÌç²È¤Ë¤´ÁêÃ̤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "¸°¤ÎŤµ¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "¡Èyes¡É¤«¡Èno¡É¤ÇÅú¤¨¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"¥×¥í¥ó¥×¥È¤Ë¼¨¤¹½ñ¼°¤ÇÃͤòÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+"ISO¤ÎÆüÉդνñ¼° (YYYY-MM-DD) ¤Ç¤âÆþÎϤǤ­¤Þ¤¹¤¬¡¢Àµ¤·¤¤¥¨¥é¡¼¤Ï\n"
+"ɽ¼¨¤µ¤ì¤Ê¤¤¤Ç¤·¤ç¤¦¡£¤½¤ÎÂå¤ï¤ê¡¢¥·¥¹¥Æ¥à¤ÏÆþÎÏÃͤò´ü´Ö¤ØÊÑ´¹\n"
+"¤¹¤ë¤è¤¦¤Ë»î¤ß¤Þ¤¹¡£"
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "¸°½êÍ­¼Ô¤Î̾Á°¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "¥ª¥×¥·¥ç¥ó¤Ç¤¹¤¬¡¢ÅŻҥ᡼¥ë¤Î¥¢¥É¥ì¥¹¤òÆþÎϤ¹¤ë¤³¤È¤ò¶¯¤¯¿ä¾©¤·¤Þ¤¹"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "¥ª¥×¥·¥ç¥ó¤Î¥³¥á¥ó¥È¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  Ì¾Á°¤ÎÊѹ¹¡£\n"
+"C  ¥³¥á¥ó¥È¤ÎÊѹ¹¡£\n"
+"E  ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¤ÎÊѹ¹¡£\n"
+"O  ¸°À¸À®¤Î³¹Ô¡£\n"
+"Q  ¸°À¸À®¤Î½ªÎ»¡£"
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Éû¸°¤òÀ¸À®¤·¤Æ¤è¤±¤ì¤Ð¡¢¡Èyes¡É(¤Þ¤¿¤Ï¡¢Ã±¤Ë¡Èy¡É) ¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"¸°¤Î¥æ¡¼¥¶¡¼ID¤Ë½ð̾¤¹¤ë¤È¤­¤Ï¡¢¸°¤Î¥æ¡¼¥¶¡¼ID¤Î̾Á°¤Î¿Í¤¬¸°\n"
+"¤ò½êÍ­¤·¤Æ¤¤¤ë¡¢¤È¤¤¤¦¤³¤È¤ò¸¡¾Ú¤¹¤ë¤Ù¤­¤Ç¤¹¡£¤¢¤Ê¤¿¤¬¤É¤ÎÄø\n"
+"ÅÙÃí°Õ¿¼¤¯³Îǧ¤·¤¿¤Î¤«¤ò¾¤Î¿Í¤¿¤Á¤ËÃΤ餻¤ë¤È¡¢ÊØÍø¤Ç¤¹¡£\n"
+"\n"
+"\"0\" ¤Ï¡¢¤¢¤Ê¤¿¤¬¤É¤ÎÄøÅÙÃí°Õ¿¼¤¯³Îǧ¤·¤¿¤Î¤«¤ò¡¢Æä˼çÄ¥¤·¤Ê\n"
+"    ¤¤¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£\n"
+"\n"
+"\"1\" ¤Ï¡¢¸°¤Î½êÍ­¼Ô¤È¼çÄ¥¤·¤Æ¤¤¤ë¿Í¤¬¤½¤Î¸°¤ò½êÍ­¤·¤Æ¤¤¤ë¡¢¤È\n"
+"    ¤¢¤Ê¤¿¤Ï¿®¤¸¤Æ¤Ï¤¤¤ë¤â¤Î¤Î¡¢¸¡¾Ú¤ÏÁ´Á³¤·¤Æ¤Ê¤«¤Ã¤¿¡¢¤Þ¤¿\n"
+"    ¤Ï¤Ç¤­¤Ê¤«¤Ã¤¿¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£¤³¤ì¤Ï¡¢¥Ú¥ó¥Í¡¼¥à¤ò»È¤¦\n"
+"    ¥æ¡¼¥¶¡¼¤Î¸°¤Ë½ð̾¤¹¤ë¾ì¹ç¤Î¡¢¡Ö¥Ú¥ë¥½¥Ê¡×³Îǧ¤ËÊØÍø¤Ç¤¹¡£\n"
+"\n"
+"\"2\" ¤Ï¡¢¤¢¤Ê¤¿¤¬°ì±þ¸°¤Î³Îǧ¤ò¤·¤¿¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£¤¿¤È¤¨¤Ð\n"
+"    ¸°¤Î»ØÌæ¤ò¸¡¾Ú¤·¡¢¥Õ¥©¥ÈID¤Ë¤¿¤¤¤·¤Æ¸°¤Î¥æ¡¼¥¶¡¼ID¤ò¸¡ºº\n"
+"    ¤·¤¿¾ì¹ç¤¬¤½¤¦¤Ç¤¹¡£\n"
+"\n"
+"\"3\" ¤Ï¡¢¤¢¤Ê¤¿¤¬¹­ÈϰϤˤ錄¤ê¸°¤ò¸¡¾Ú¤·¤¿¡¢¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£\n"
+"    ¤¿¤È¤¨¤Ð¡¢¸°¤Î½êÍ­¼ÔËܿͤȸ°¤Î»ØÌæ¤ò¸¡¾Ú¤·¡¢(¥Ñ¥¹¥Ý¡¼¥È\n"
+"    ¤Î¤è¤¦¤Ê) µ¶Â¤¤Î¤à¤Ä¤«¤·¤¤¡¢¥Õ¥©¥ÈID¤Ä¤­¤Î¼êÃʤǡ¢¸°¤Î½ê\n"
+"    Í­¼Ô¤Î̾Á°¤¬¡¢¸°¤Î¥æ¡¼¥¶¡¼ID¤Î̾Á°¤È°ìÃפ¹¤ë¤³¤È¤ò¸¡ºº¤·\n"
+"    ¤Æ¡¢(ÅŻҥ᡼¥ë¤Î¸ò´¹¤Ê¤É¤Ç) ¸°¤ÎÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¤¬\n"
+"    ¸°¤Î½êÍ­¼Ô¤Ë°¤·¤Æ¤¤¤ë¤³¤È¤ò¸¡¾Ú¤·¤¿¾ì¹ç¤¬¤½¤¦¤Ç¤¹¡£\n"
+"\n"
+"¾åµ­2¤È3¤ÎÎã¤Ï¡¢*ñ¤Ê¤ë*Îã¤Ë¤¹¤®¤Ê¤¤¡¢¤È¤¤¤¦¤³¤È¤òǰƬ¤Ë¤ª¤¤\n"
+"¤Æ¤¯¤À¤µ¤¤¡£Â¾¤Î¸°¤Ë½ð̾¤¹¤ëºÝ¡¢¡Ø°ì±þ¡Ù¤ä¡Ø¹­ÈÏ°Ï¡Ù¤¬²¿¤ò°Õ\n"
+"Ì£¤¹¤ë¤«¤òºÇ½ªÅª¤Ë·è¤á¤ë¤Î¤Ï¡¢¤¢¤Ê¤¿¤Ç¤¹¡£\n"
+"\n"
+"Àµ¤·¤¤Åú¤Î¤ï¤«¤é¤Ê¤¤¾ì¹ç¤Ï¡¢¡Ö0¡×¤ÇÅú¤¨¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Á´¤Æ¤Î ¥æ¡¼¥¶¡¼ID¤Ë½ð̾¤·¤¿¤±¤ì¤Ð¡¢¡Èyes¡É¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"¤³¤Î¥æ¡¼¥¶¡¼ID¤òËÜÅö¤Ëºï½ü¤·¤¿¤±¤ì¤Ð¡¢¡Èyes¡É¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤¡£\n"
+"¾ÚÌÀ½ñ¤âÁ´ÉôƱ»þ¤Ë¾Ãµî¤·¤Þ¤¹!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "¤³¤ÎÉû¸°¤òºï½ü¤·¤Æ¤è¤±¤ì¤Ð¡¢¡Èyes¡É¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"¤³¤ì¤Ï¸°¤Ë¤¿¤¤¤¹¤ëÍ­¸ú¤Ê½ð̾¤Ç¤¹¡£ÉáÄ̤³¤Î½ð̾¤òºï½ü¤¹¤ë¤Ù¤­¤Ç\n"
+"¤Ï¤Ê¤¤¤Ç¤·¤ç¤¦¡£¤Ê¤¼¤Ê¤é¡¢¤³¤Î½ð̾¤Ï¡¢¸°¤Ø¤Î¿®ÍѤÎÎؤκîÀ®¤ä¡¢\n"
+"¤³¤Î¸°¤Ë¤è¤ë¾ÚÌÀ¤Ë¤È¤Ã¤Æ½ÅÍפÀ¤«¤é¤Ç¤¹¡£"
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"¤³¤Î½ð̾¤È°ìÃפ¹¤ë¸°¤òÊÝÍ­¤·¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¢¤³¤Î½ð̾¤Ï¸¡ºº¤Ç¤­¤Þ¤»¤ó¡£\n"
+"¤½¤Î¸°¤¬»ÈÍѤµ¤ì¤ë¤Þ¤Ç¤Ï¡¢¤¢¤Ê¤¿¤Ï¤³¤Î½ð̾¤Îºï½ü¤òÊÝα¤¹¤ë¤Ù¤­¤Ç¤¹¡£\n"
+"¤Ê¤¼¤Ê¤é¡¢¤³¤Î½ð̾¤Î¸°¤Ï¡¢¤â¤¦¾ÚÌÀ¤µ¤ì¤¿Â¾¤Î¸°¤Ç¿®ÍѤÎÎؤò·ÁÀ®¤¹¤ë\n"
+"¤«¤â¤·¤ì¤Ê¤¤¤«¤é¤Ç¤¹¡£"
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"¤³¤Î½ð̾¤ÏÍ­¸ú¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¤³¤È¤Ï¡¢¤¢¤Ê¤¿¤Î¸°Îؤ«¤éºï½ü¤¹¤Ù¤­¤À\n"
+"¤È¤¤¤¦°ÕÌ£¤Ç¤¹¡£"
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"¤³¤ì¤Ï¡¢¸°¤Î¥æ¡¼¥¶¡¼ID¤ËÂбþ¤·¤¿½ð̾¤Ç¤¹¡£Ä̾¤³¤Î½ð̾¤òºï½ü¤¹¤ë¤Î¤Ï\n"
+"¤¤¤¤¹Í¤¨¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¼ÂºÝ¤Ë¤Ï¡¢GnuPG¤Ï¤â¤Ï¤ä¤³¤Î¸°¤ò»È¤¨¤Ê¤¤¤Î¤«¤â\n"
+"¤·¤ì¤Þ¤»¤ó¡£¤è¤Ã¤Æ¡¢¤³¤Î¼«¸Ê½ð̾¤¬²¿¤é¤«¤ÎÍýͳ¤Ë¤è¤êÍ­¸ú¤Ç¤Ï¤Ê¤¯¤Æ¡¢\n"
+"ÂåÂؤȤʤ븰¤¬¤¢¤ë¾ì¹ç¤Ë¤Î¤ß¡¢ºï½ü¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Á´Éô (¤Þ¤¿¤ÏÁªÂò¤·¤¿) ¥æ¡¼¥¶¡¼ID¤ÎÁª¹¥¤ò¡¢º£¤ÎÁª¹¥°ìÍ÷¤ËÊѹ¹\n"
+"¤·¤Þ¤¹¡£´Ø·¸¤¹¤ë¼«¸Ê½ð̾¤ÎÆü»þ¤Ï¡¢1É乤¹¤ß¤Þ¤¹¡£\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£¤³¤ì¤ÏÈëÌ©¤Îʸ¾Ï¤Î¤³¤È¤Ç¤¹ \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "ÆþÎϤ·¤¿¥Ñ¥¹¥Õ¥ì¡¼¥º¤Î³Îǧ¤Î¤¿¤á¡¢ºÆÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£"
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "½ð̾¤ò¹Ô¤¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "¾å½ñ¤­¤·¤Æ¤è¤±¤ì¤Ð¡¢¡Èyes¡É¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"¿·¤·¤¤¥Õ¥¡¥¤¥ë̾¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£Ã±¤ËRETURN¤òÂǤĤȡ¢\n"
+"(³ç¸Ì¤Ç¼¨¤·¤¿) ´ûÄê¤Î¥Õ¥¡¥¤¥ë̾¤ò»ÈÍѤ·¤Þ¤¹¡£"
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"¾ÚÌÀÍýͳ¤ò»ØÄꤹ¤Ù¤­¤Ç¤¹¡£Á°¸å´Ø·¸¤Ë¤·¤¿¤¬¤Ã¤Æ¡¢\n"
+"°Ê²¼¤Î°ìÍ÷¤«¤éÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\n"
+"  ¡Ö¸°¤¬¥Ñ¥¯¤é¤ì¤Þ¤·¤¿¡×\n"
+"      Ç§¾Ú¤µ¤ì¤Æ¤¤¤Ê¤¤¿Í¤¬ÈëÌ©¸°¤Ø¤Î¥¢¥¯¥»¥¹¤òÆÀ¤¿¡¢¤È¿®¤º¤ë\n"
+"      ¤Ë­¤ëÍýͳ¤Î¤¢¤ë¤È¤­¤Ë¡¢¤³¤ì¤ò»È¤¤¤Þ¤¹¡£\n"
+"  ¡Ö¸°¤¬¤È¤ê¤«¤ï¤Ã¤Æ¤¤¤Þ¤¹¡×\n"
+"      ¤³¤Î¸°¤ò¼«Ê¬¤Ç¿·¤·¤¤¸°¤È¸ò´¹¤·¤¿¤È¤­¤Ë»È¤¤¤Þ¤¹¡£\n"
+"  ¡Ö¸°¤Ï¤â¤¦ÉÔÍѤǤ¹¡×\n"
+"      ¤³¤Î¸°¤ò»È¤¦¤Î¤ò¤ä¤á¤¿¤È¤­¤Ë»È¤¤¤Þ¤¹¡£\n"
+"  ¡Ö¥æ¡¼¥¶¡¼ID¤¬¤â¤¦Ìµ¸ú¤Ç¤¹¡×\n"
+"      ¤â¤¦¤½¤Î¥æ¡¼¥¶¡¼ID¤Ï»È¤¦¤Ù¤­¤Ç¤Ê¤¤¡¢¤È¤¤¤¦¤È¤­¤Ë»È¤¤\n"
+"      ¤Þ¤¹¡£¤³¤ì¤ÏÉáÄÌ¡¢ÅŻҥ᡼¥ë¤Î¥¢¥É¥ì¥¹¤¬Ìµ¸ú¤Ë¤Ê¤Ã¤¿¤È\n"
+"      ¤­¤Ë»È¤¤¤Þ¤¹¡£\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"¤â¤·¤½¤¦¤·¤¿¤±¤ì¤Ð¡¢¤Ê¤¼¼º¸ú¾ÚÌÀ½ñ¤òȯ¹Ô¤¹¤ë¤Î¤«¤òÀâÌÀ¤¹¤ë\n"
+"ʸ¾Ï¤òÆþÎϤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£Ê¸¾Ï¤Ï´Ê·é¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+"¶õ¹Ô¤Ç½ª¤ï¤ê¤Ë¤Ê¤ê¤Þ¤¹¡£\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "¥Ø¥ë¥×¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "¡Ö%s¡×¤Î¥Ø¥ë¥×¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤ò¹¹¿·"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "¸ø³«¸°¤ÈÈëÌ©¸°¤¬¾È¹ç¤·¤Þ¤»¤ó!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "»ÈÍѤǤ­¤Ê¤¤ÈëÌ©¸°¤Ç¤¹"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "·¿%d¤Î¥Ö¥í¥Ã¥¯¤ò¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu¸°¤Þ¤Ç½èÍý\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "    ½èÍý¿ô¤Î¹ç·×: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "¤È¤Ð¤·¤¿¿·¤·¤¤¸°: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "  ¥æ¡¼¥¶¡¼ID¤Ê¤·: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "          Æɹþ¤ß: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "        Êѹ¹¤Ê¤·: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "¿·¤·¤¤¥æ¡¼¥¶¡¼ID: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "      ¿·¤·¤¤Éû¸°: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "      ¿·¤·¤¤½ð̾: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "  ¿·¤·¤¤¸°¤Î¼º¸ú: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "  ÈëÌ©¸°¤ÎÆɽФ·: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  ÈëÌ©¸°¤ÎÆɹþ¤ß: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "  ÌµÊѹ¹¤ÎÈëÌ©¸°: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "        Ì¤Æɹþ¤ß: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "¤³¤ì¤Þ¤Ç¤ËºîÀ®¤µ¤ì¤¿½ð̾: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "  ÈëÌ©¸°¤ÎÆɽФ·: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "·Ù¹ð: ¸°%s¤Ë¤Ï¡¢»ÈÍÑÉԲĤȤ¤¤¦Áª¹¥¤¬¤¢¤ê¤Þ¤¹\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "¤³¤ì¤é¤Î¥æ¡¼¥¶¡¼ID¤Î¥¢¥ë¥´¥ê¥º¥à:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": °Å¹æ¥¢¥ë¥´¥ê¥º¥à¤ÎÁª¹¥ %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": Í×Ì󥢥르¥ê¥º¥à¤ÎÁª¹¥ %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         \"%s\": °µ½Ì¥¢¥ë¥´¥ê¥º¥à¤ÎÁª¹¥ %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "it is strongly suggested that you update your preferences and\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"ÀøºßŪ¤Ê¥¢¥ë¥´¥ê¥º¥àÉÔ°ìÃ×ÌäÂê¤òÈò¤±¤ë¤¿¤á¡¢¤³¤Î¸°¤òºÆÇÛÉÛ¤·¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "°Ê²¼¤Ç¡¢Áª¹¥¤¬¹¹¿·¤Ç¤­¤Þ¤¹: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "¸°%s: ¥æ¡¼¥¶¡¼ID¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "¸°%s: PKS¤ÎÉû¸°ÊѤ¤ò½¤Éü\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "¸°%s: ¼õÍý¤·¤¿Ì¤¼«¸Ê½ð̾¤Î¥æ¡¼¥¶¡¼ID¡È%s¡É\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "¸°%s: Í­¸ú¤Ê¥æ¡¼¥¶¡¼ID¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "¼«¸Ê½ð̾¤Î¤Ê¤¤¤»¤¤¤Ç¤·¤ç¤¦\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "¸°%s: ¸ø³«¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "¸°%s: ¿·¤·¤¤¸°¤Ç¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "½ñ¹þ¤ß²Äǽ¤Ê¸°Îؤ¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "¡Ö%s¡×¤Ø¤Î½ñ¹þ¤ß\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "¸°ÎØ¡Ö%s¡×¤Î½ñ¹þ¤ß¥¨¥é¡¼: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "¸°%s: ¸ø³«¸°¡È%s¡É¤òÆɤ߹þ¤ß¤Þ¤·¤¿\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "¸°%s: ¤³¤Á¤é¤ÎÊ£À½¤È¹ç¤¤¤Þ¤»¤ó\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "¸°%s: ¸µ¤Î¸°¥Ö¥í¥Ã¥¯¤Ë°ÌÃ֤Ť±¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "¸°%s: ¸µ¤Î¸°¥Ö¥í¥Ã¥¯¤òÆɤ߽Ф»¤Þ¤»¤ó: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤¥æ¡¼¥¶¡¼ID¤ò1¸Ä\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤¥æ¡¼¥¶¡¼ID¤ò%d¸Ä\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤½ð̾¤ò1¸Ä\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤½ð̾¤ò%d¸Ä\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤Éû¸°¤ò1¸Ä\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤Éû¸°¤ò%d¸Ä\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤½ð̾¤ò%d¸Ä\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤½ð̾¤ò%d¸Ä\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤¥æ¡¼¥¶¡¼ID¤ò%d¸Ä\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "¸°%s:¡È%s¡É¿·¤·¤¤¥æ¡¼¥¶¡¼ID¤ò%d¸Ä\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "¸°%s:¡È%s¡ÉÊѹ¹¤Ê¤·\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "¸°%s: Ìµ¸ú¤Ê°Å¹æË¡%d¤ÎÈëÌ©¸°¤Ç¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "ÈëÌ©¸°¤ÎÆɹþ¤ß¤Ï¶Ø»ß¤Ç¤¹\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "´ûÄê¤ÎÈëÌ©¸°Îؤ¬¤¢¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "¸°%s: ÈëÌ©¸°¤òÆɤ߹þ¤ß¤Þ¤·¤¿\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "¸°%s: ¤â¤¦ÈëÌ©¸°Îؤˤ¢¤ê¤Þ¤¹\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "¸°%s: ÈëÌ©¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "¸°%s: ¸ø³«¸°¤¬¤¢¤ê¤Þ¤»¤ó - ¼º¸ú¾ÚÌÀ½ñ¤òŬÍѤǤ­¤Þ¤»¤ó\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "¸°%s: Ìµ¸ú¤Ê¼º¸ú¾ÚÌÀ½ñ: %s - µñÈÝ\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "¸°%s:¡È%s¡É¼º¸ú¾ÚÌÀ½ñ¤òÆɤ߹þ¤ß¤Þ¤·¤¿\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "¸°%s: ½ð̾¤ËÂбþ¤¹¤ë¥æ¡¼¥¶¡¼ID¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "¸°%s: ¥æ¡¼¥¶¡¼ID¡È%s¡É¤Î¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¸ø³«¸°¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "¸°%s: ¥æ¡¼¥¶¡¼ID¡È%s¡É¤Î¼«¸Ê½ð̾¤¬¡¢Ìµ¸ú¤Ç¤¹\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "¸°%s: ¸°¤ËÂбþ¤¹¤ëÉû¸°¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "¸°%s: ¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¸ø³«¸°¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "¸°%s: Ìµ¸ú¤ÊÉû¸°¤ÎÂбþ¤Ç¤¹\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "¸°%s: Â¿½ÅÉû¸°¤ÎÂбþ¤òºï½ü¤·¤Þ¤¹\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "¸°%s: ¸°¼º¸ú¤Ë¤¿¤¤¤¹¤ëÉû¸°¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "¸°%s: Ìµ¸ú¤ÊÉû¸°¼º¸ú¤Ç¤¹\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "¸°%s: Ìµ¸ú¤ÊÉû¸°¤Î¿½Å¼º¸ú¤òºï½ü¤·¤Þ¤¹\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "¸°%s: ¤È¤Ð¤·¤¿¥æ¡¼¥¶¡¼ID¡È%s¡É\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "¸°%s: ¤È¤Ð¤·¤¿Éû¸°\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "¸°%s: ½ñ½Ð¤·ÉԲĤʽð̾ (¥¯¥é¥¹%02X) - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "¸°%s: ¼º¸ú¾ÚÌÀ½ñ¤¬¸í¤Ã¤ÆÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "¸°%s: Ìµ¸ú¤Ê¼º¸ú¾ÚÌÀ½ñ: %s - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "¸°%s: Éû¸°½ð̾¤Î¾ì½ê¤¬¡¢¸í¤Ã¤Æ¤¤¤Þ¤¹ - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "¸°%s: Í½´ü¤»¤Ì½ð̾¥¯¥é¥¹ (0x%02X) - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "¸°%s: ½ÅÊ£¤·¤¿¥æ¡¼¥¶¡¼ID¤Î¸¡½Ð - Ê»¹ç\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "·Ù¹ð: ¸°%s¤Ï¼º¸ú¤µ¤ì¤¿¤è¤¦¤Ç¤¹: ¼º¸ú¸°%s¤Î°ú¤­½Ð¤·\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "·Ù¹ð: ¸°%s¤Ï¼º¸ú¤µ¤ì¤¿¤è¤¦¤Ç¤¹: ¼º¸ú¸°%s¤ÏÉԺߡ£\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "¸°%s:¡È%s¡É¼º¸ú¾ÚÌÀ½ñ¤ÎÄɲÃ\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "¸°%s: Ä¾Àܸ°½ð̾¤òÄɲÃ\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "¸ø³«¸°¤ÈÈëÌ©¸°¤¬¾È¹ç¤·¤Þ¤»¤ó!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ÈëÌ©¸°¤Ï¤â¤¦¥«¡¼¥É¤ËÊݴɤ·¤Æ¤¢¤ê¤Þ¤¹\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ÈëÌ©¸°¤Ï¤â¤¦¥«¡¼¥É¤ËÊݴɤ·¤Æ¤¢¤ê¤Þ¤¹\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "¸°ÎØ¡Ö%s¡×¤ÎºîÀ®¥¨¥é¡¼: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "¸°ÎØ¡Ö%s¡×¤¬¤Ç¤­¤Þ¤·¤¿\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "¡Ö%s¡×¤ÎºîÀ®¥¨¥é¡¼: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "¸°ÎØ¥­¥ã¥Ã¥·¥å¤ÎºÆ¹½Ãۤ˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[¼º¸ú]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[¼«¸Ê½ð̾]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "ÉÔÀµ¤Ê½ð̾1¸Ä\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "ÉÔÀµ¤Ê½ð̾%d¸Ä\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "¸°¤¬¤Ê¤¤¤¿¤á1¸Ä¤Î½ð̾¤ò¸¡ºº¤·¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "¸°¤¬¤Ê¤¤¤¿¤á%d¸Ä¤Î½ð̾¤ò¸¡ºº¤·¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "¥¨¥é¡¼¤Î¤¿¤á1¸Ä¤Î½ð̾¤ò¸¡ºº¤·¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "¥¨¥é¡¼¤Î¤¿¤á%d¸Ä¤Î½ð̾¤ò¸¡ºº¤·¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "Í­¸ú¤Ê¼«¸Ê½ð̾¤Î¤Ê¤¤¥æ¡¼¥¶¡¼ID¤ò1¸Ä¸¡½Ð\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "Í­¸ú¤Ê¼«¸Ê½ð̾¤Î¤Ê¤¤¥æ¡¼¥¶¡¼ID¤ò%d¸Ä¸¡½Ð\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"¾¤Î¥æ¡¼¥¶¡¼¤Î¸°¤òÀµ¤·¤¯¸¡¾Ú¤¹¤ë¤¿¤á¤Ë¡¢¤³¤Î¥æ¡¼¥¶¡¼¤Î¿®ÍÑÅÙ¤ò·è¤á¤Æ¤¯¤À¤µ"
+"¤¤\n"
+"(¥Ñ¥¹¥Ý¡¼¥È¤ò¸«¤»¤Æ¤â¤é¤Ã¤¿¤ê¡¢Â¾¤«¤éÆÀ¤¿»ØÌæ¤ò¸¡ºº¤·¤¿¤ê¡¢¤Ê¤É¤Ê¤É)\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = ¤¢¤ëÄøÅÙ¿®ÍѤ¹¤ë\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = ´°Á´¤Ë¿®ÍѤ¹¤ë\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"¿®Íѽð̾¤Î¿¼¤µ¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+"¿¼¤µ¤¬1¤è¤êÂ礭¤¤¤È¡¢½ð̾¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¸°¤Ç¿®Íѽð̾¤òºî¤ì¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "½ð̾¤òÀ©¸Â¤¹¤ë¥É¥á¡¼¥ó¤«¡¢¤½¤ì¤Î¤Ê¤¤¾ì¹ç¤Ïenter¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "¤½¤ì¤Ç¤â¤³¤Î¸°¤Ë½ð̾¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  ½ð̾ÉÔǽ¡£\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢Ëþλ¤Ç¤¹¡£"
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¼«¸Ê½ð̾¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¼«¸Ê½ð̾¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "ËÜÅö¤Ë½ð̾¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"¡È%s¡É¤Ë¤¿¤¤¤¹¤ë¼«¸Ê½ð̾¤Ï¡¢\n"
+"PGP 2.x·Á¼°¤Î½ð̾¤Ç¤¹¡£\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "OpenPGP¤Î¼«¸Ê½ð̾¤Ë³Ê¾å¤²¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"¡È%s¡É¤Ë¤¿¤¤¤¹¤ë¤¢¤Ê¤¿¤Îº£¤Î½ð̾\n"
+"¤ÏËþλ¤Ç¤¹¡£\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "¿·¤·¤¤½ð̾¤òȯ¹Ô¤·¡¢´ü¸ÂÀÚ¤ì½ð̾¤È¸ò´¹¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"¡È%s¡É¤Ë¤¿¤¤¤¹¤ë¤¢¤Ê¤¿¤Îº£¤Î½ð̾\n"
+"¤ÏÆâÉô½ð̾¤Ç¤¹¡£\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "½ñ½Ð¤·²Äǽ¤Ê½ð̾¤Ë³Ê¾å¤²¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "¡È%s¡É¤Ï¸°%s¤Ç¤â¤¦ÆâÉô½ð̾¤·¤Æ¤¢¤ê¤Þ¤¹\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "¡È%s¡É¤Ï¸°%s¤Ç¤â¤¦½ð̾¤·¤Æ¤¢¤ê¤Þ¤¹\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "¤½¤ì¤Ç¤âºÆ½ð̾¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "¸°%s¤Ç½ð̾¤¹¤Ù¤­¤â¤Î¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "¤³¤Î¸°¤ÏËþλ¤Ç¤¹!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "¤³¤Î¸°¤Ï%s¤ÇËþλ¤·¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Ʊ»þ¤Ë½ð̾¤âËþλ¤Ë¤·¤¿¤¤¤Ç¤¹¤«? (Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr "--pgp2¥â¡¼¥É¤Ç¤ÏPGP 2.x¸°¤ÇOpenPGP½ð̾¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "¤³¤Î¸°¤ÏPGP 2.x¤Ç»ÈÍѤǤ­¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"½ð̾¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¸°¤¬¼ÂºÝ¤Ë¾åµ­¤Î̾Á°¤Î¿Í¤Î¤â¤Î¤«¤É¤¦¤«¡¢¤É¤ÎÄøÅÙ\n"
+"Ãí°Õ¤·¤Æ¸¡¾Ú¤·¤Þ¤·¤¿¤«? Åú¤¬¤ï¤«¤é¤Ê¤±¤ì¤Ð¡¢¡È0¡É¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Åú¤¨¤Þ¤»¤ó¡£%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Á´Á³¡¢¸¡ºº¤·¤Æ¤¤¤Þ¤»¤ó¡£%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) °ì±þ¡¢¸¡ºº¤·¤Þ¤·¤¿¡£%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) ¤«¤Ê¤êÃí°Õ¤·¤Æ¸¡ºº¤·¤Þ¤·¤¿¡£%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "ÁªÂò¤Ï? (¾ÜºÙ¤Ï '?' ¤Ç): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"ËÜÅö¤Ë¤³¤Î¸°¤Ë¤¢¤Ê¤¿¤Î¸°¡È%s¡É¤Ç½ð̾¤·¤Æ¤è¤¤¤Ç¤¹¤«\n"
+"(%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "¼«¸Ê½ð̾¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "·Ù¹ð: ½ð̾¤Ï¡¢½ñ½Ð¤·ÉԲĤËÀßÄꤵ¤ì¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "·Ù¹ð: ½ð̾¤Ï¡¢¼º¸úÉԲĤËÀßÄꤵ¤ì¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "½ð̾¤Ï¡¢½ñ½Ð¤·ÉԲĤËÀßÄꤵ¤ì¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "½ð̾¤Ï¡¢¼º¸úÉԲĤËÀßÄꤵ¤ì¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "¤³¤Î¸°¤ÏÁ´Á³¡¢¸¡ºº¤·¤Æ¤¤¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "¤³¤Î¸°¤Ï°ì±þ¡¢¸¡ºº¤·¤Þ¤·¤¿¡£\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "¤³¤Î¸°¤Ï¡¢¤«¤Ê¤êÃí°Õ¤·¤Æ¸¡ºº¤·¤Þ¤·¤¿¡£\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "ËÜÅö¤Ë½ð̾¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "½ð̾¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "¤³¤Î¸°¤ÏÊݸ¤ì¤Æ¤¤¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "¼ç¸°¤ÎÈëÌ©Éôʬ¤¬ÆÀ¤é¤ì¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "¼ç¸°¤ÎÈëÌ©Éôʬ¤¬ÆÀ¤é¤ì¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "¸°¤ÏÊݸ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "¤³¤Î¸°¤ÏÊÔ½¸¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"¤³¤ÎÈëÌ©¸°¤Î¿·¤·¤¤¥Ñ¥¹¥Õ¥ì¡¼¥º¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤¡£\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤ò¤Á¤ã¤ó¤È·«¤êÊÖ¤·¤Æ¤¤¤Þ¤»¤ó¡£ºÆÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬ÉÔɬÍפʤ褦¤Ç¤¹¤¬¡¢\n"
+"¤ª¤½¤é¤¯¤½¤ì¤Ï¡ö¤í¤¯¤Ç¤â¤Ê¤¤¡ö¹Í¤¨¤Ç¤¹!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "ËÜÅö¤Ë¼Â¹Ô¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "¸°¤Î½ð̾¤òÀµ¤·¤¤¾ì½ê¤Ë°ÜÆ°¤·¤Þ¤¹\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "Êݸ¤·¤Æ½ªÎ»"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "»ØÌæ¤òɽ¼¨"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "¸°¤È¥æ¡¼¥¶¡¼ID¤Î°ìÍ÷"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "¥æ¡¼¥¶¡¼ID N¤ÎÁªÂò"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "¥æ¡¼¥¶¡¼ID N¤ÎÁªÂò"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "½ð̾¤Î¼º¸ú"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "¸°¤ØÆâÉôŪ¤Ë½ð̾"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "¥³¥Ä: ¤Þ¤º½ð̾¤¹¤ë¥æ¡¼¥¶¡¼ID¤òÁªÂò¤·¤Þ¤¹\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "¥æ¡¼¥¶¡¼ID¤ÎÄɲÃ"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "¥Õ¥©¥ÈID¤ÎÄɲÃ"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "¥æ¡¼¥¶¡¼ID¤Îºï½ü"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "¥¹¥Þ¡¼¥È¥«¡¼¥É¤Ø¸°¤ÎÄɲÃ"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "¥¹¥Þ¡¼¥È¥«¡¼¥É¤Î¸°¤Ø¤Î°ÜÆ°"
+
+#: g10/keyedit.c:1402
+#, fuzzy
+msgid "move a backup key to a smartcard"
+msgstr "¥¹¥Þ¡¼¥È¥«¡¼¥É¤Î¸°¤Ø¤Î°ÜÆ°"
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "Éû¸°¤Îºï½ü"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "¼º¸ú¸°¤ÎÄɲÃ"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "ÁªÂò¤·¤¿¥æ¡¼¥¶¡¼ID¤ÎÁª¹¥¤òËÜÅö¤Ë¹¹¿·¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "v3¸°¤ÎÍ­¸ú´ü¸Â¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "¥æ¡¼¥¶¡¼ID¤ò¼ç¤Ë¤¹¤ë"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "ÈëÌ©¸°¤È¸ø³«¸°¤Î°ìÍ÷¤Îȿž"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "Áª¹¥¤Î°ìÍ÷ (¥¨¥­¥¹¥Ñ¡¼¥È)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "Áª¹¥¤Î°ìÍ÷ (¾éĹ)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "ÁªÂò¤·¤¿¥æ¡¼¥¶¡¼ID¤ÎÁª¹¥¤òËÜÅö¤Ë¹¹¿·¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "Áª¹¥¸°¥µ¡¼¥Ð¡¼¤ÎURI¤òÀßÄê"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "ÁªÂò¤·¤¿¥æ¡¼¥¶¡¼ID¤ÎÁª¹¥¤òËÜÅö¤Ë¹¹¿·¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÎÊѹ¹"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "½êÍ­¼Ô¿®ÍѤÎÊѹ¹"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "ÁªÂò¤·¤¿Á´¥æ¡¼¥¶¡¼ID¤òËÜÅö¤Ë¼º¸ú¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "¥æ¡¼¥¶¡¼ID¤Î¼º¸ú"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "Éû¸°¤Î¼º¸ú"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "¸°¤Î»ÈÍѤòµö²Ä¤¹¤ë"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "¸°¤Î»ÈÍѤò¶Ø»ß¤¹¤ë"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "¥Õ¥©¥ÈID¤òɽ¼¨"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "ÈëÌ©¸°¥Ö¥í¥Ã¥¯¡È%s¡É¤ÎÆɽФ·¥¨¥é¡¼: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "ÈëÌ©¸°¤¬»ÈÍѤǤ­¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "¤³¤Î¼Â¹Ô¤Ë¤ÏÈëÌ©¸°¤¬¤¤¤ê¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "¤Þ¤º¡Ètoggle¡É¥³¥Þ¥ó¥É¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "¸°¤Ï¡¢¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "ËÜÅö¤ËÁ´¥æ¡¼¥¶¡¼ID¤Ë½ð̾¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "¥³¥Ä: ¤Þ¤º½ð̾¤¹¤ë¥æ¡¼¥¶¡¼ID¤òÁªÂò¤·¤Þ¤¹\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "̤ÃΤνð̾¥¯¥é¥¹¤Ç¤¹"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "%s¥â¡¼¥É¤Ç¤³¤Î¥³¥Þ¥ó¥É¤Ï¶Ø»ß¤Ç¤¹¡£\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "¥æ¡¼¥¶¡¼ID¤ò¾¯¤Ê¤¯¤È¤â¤Ò¤È¤ÄÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "ºÇ¸å¤Î¥æ¡¼¥¶¡¼ID¤Ïºï½ü¤Ç¤­¤Þ¤»¤ó!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "ÁªÂò¤·¤¿Á´¥æ¡¼¥¶¡¼ID¤òËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "¤³¤Î¥æ¡¼¥¶¡¼ID¤òËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "¤³¤Î¼ç¸°¤òËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "¸°¤ò¤­¤Ã¤«¤ê1ËÜÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "¡Ö%s¡×¤¬³«¤±¤Þ¤»¤ó: %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "¸°ÎØ¡Ö%s¡×¤ÎºîÀ®¥¨¥é¡¼: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "¸°¤ò¾¯¤Ê¤¯¤È¤â1ËÜÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "ÁªÂò¤·¤¿¸°¤òËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "¤³¤Î¸°¤òËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "ÁªÂò¤·¤¿Á´¥æ¡¼¥¶¡¼ID¤òËÜÅö¤Ë¼º¸ú¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "¤³¤Î¥æ¡¼¥¶¡¼ID¤òËÜÅö¤Ë¼º¸ú¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "¤³¤Î¸°¤òËÜÅö¤Ë¼º¸ú¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "ÁªÂò¤·¤¿¸°¤òËÜÅö¤Ë¼º¸ú¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "¤³¤Î¸°¤òËÜÅö¤Ë¼º¸ú¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"ÍøÍѼԻØÄê¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤ÎÍøÍÑÃæ¡¢½êÍ­¼Ô¿®ÍѤÏÀßÄꤵ¤ì¤Ê¤¤¤³¤È¤â¤¢¤ê¤Þ"
+"¤¹¡£\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Áª¹¥¤Î°ìÍ÷¤òÀßÄê:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "ÁªÂò¤·¤¿¥æ¡¼¥¶¡¼ID¤ÎÁª¹¥¤òËÜÅö¤Ë¹¹¿·¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Áª¹¥¤òËÜÅö¤Ë¹¹¿·¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Êѹ¹¤òÊݸ¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Êݸ¤»¤º¤Ë½ªÎ»¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "¹¹¿·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "ÈëÌ©¤Î¹¹¿·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "¸°¤Ï̵Êѹ¹¤Ê¤Î¤Ç¹¹¿·¤ÏÉÔÍפǤ¹¡£\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Í×Ìó: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "µ¡Ç½: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "̵½¤Àµ¸°¥µ¡¼¥Ð¡¼"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Áª¹¥¸°¥µ¡¼¥Ð¡¼: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"¥ª¥×¥·¥ç¥ó:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "PGP 2.x·Á¼°¥æ¡¼¥¶¡¼ID¤ÎÁª¹¥¤¬¡¢¤¢¤ê¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "¤³¤Î¸°¤Ï¡¢%s¸°%s¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤¿¤è¤¦¤Ç¤¹"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "¤³¤Î¸°¤Ï¡¢%s¸°%s¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤¿¤è¤¦¤Ç¤¹"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(¥Ç¥ê¥±¡¼¥È)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "ºîÀ®: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "¼º¸ú: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "Ëþλ: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "Ëþλ: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "ÍøÍÑË¡: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "¿®ÍÑ: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "Í­¸úÀ­: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "¤³¤Î¸°¤Ï»ÈÍѶػߤËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "¥«¡¼¥ÉÈÖ¹æ: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"¥×¥í¥°¥é¥à¤òºÆµ¯Æ°¤¹¤ë¤Þ¤Ç¡¢É½¼¨¤µ¤ì¤¿¸°¤ÎÍ­¸úÀ­¤ÏÀµ¤·¤¯¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¡¢\n"
+"¤È¤¤¤¦¤³¤È¤òǰƬ¤Ë¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "¼º¸ú"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "Ëþλ"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"·Ù¹ð: ¼ç¤¿¤ë¥æ¡¼¥¶¡¼ID¤¬¤¢¤ê¤Þ¤»¤ó¡£¤³¤Î¥³¥Þ¥ó¥É¤Ï¡¢Ê̤Ê\n"
+"              ¥æ¡¼¥¶¡¼ID¤¬¼ç¤Ë¤Ê¤ë¤È²¾Äꤹ¤ë¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"·Ù¹ð: ¤³¤ì¤ÏPGP2·Á¼°¤Î¸°¤Ç¤¹¡£¥Õ¥©¥ÈID¤ÎÄɲäǡ¢°ìÉô¤ÎÈǤÎPGP¤Ï¡¢\n"
+"      ¤³¤Î¸°¤òµñÈݤ¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "¤½¤ì¤Ç¤âÄɲä·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "PGP2·Á¼°¤Î¸°¤Ë¤Ï¥Õ¥©¥ÈID¤òÄɲäǤ­¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "¤³¤ÎÀµ¤·¤¤½ð̾¤òºï½ü¤·¤Þ¤¹¤«? (y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "¤³¤Î̵¸ú¤Ê½ð̾¤òºï½ü¤·¤Þ¤¹¤«? (y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "¤³¤Î̤ÃΤνð̾¤òºï½ü¤·¤Þ¤¹¤«? (y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "¤³¤Î¼«¸Ê½ð̾¤òËÜÅö¤Ëºï½ü¤·¤Þ¤¹¤«? (y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d¸Ä¤Î½ð̾¤òºï½ü¤·¤Þ¤·¤¿¡£\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d¸Ä¤Î½ð̾¤òºï½ü¤·¤Þ¤·¤¿¡£\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "²¿¤âºï½ü¤·¤Æ¤¤¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "̵¸ú¤ÊÊñÁõ¤Ç¤¹"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¤â¤¦¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¤â¤¦¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"·Ù¹ð: ¤³¤ì¤ÏPGP 2.x·Á¼°¤Î¸°¤Ç¤¹¡£»Ø̾¼º¸ú¼Ô¤ÎÄɲäǡ¢°ìÉô¤ÎÈǤÎPGP¤Ï¡¢\n"
+"      ¤³¤Î¸°¤òµñÈݤ¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "PGP 2.x·Á¼°¤Î¸°¤Ë¤Ï»Ø̾¼º¸ú¼Ô¤òÄɲäǤ­¤Þ¤»¤ó¡£\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "»Ø̾¼º¸ú¼Ô¤Î¥æ¡¼¥¶¡¼ID¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "PGP 2.x·Á¼°¤Î¸°¤Ï¡¢»Ø̾¼º¸ú¼Ô¤ËǤ̿¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "»Ø̾¼º¸ú¼Ô¤Ë¤Ï¡¢¤½¤Î¸°¼«ÂΤòǤ̿¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "¤³¤Î¸°¤Ï¼º¸ú¼Ô¤È¤·¤Æ¤â¤¦»Ø̾¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "·Ù¹ð: ¤¢¤ë¸°¤ò»Ø̾¼º¸ú¼Ô¤ËÀßÄꤹ¤ë¤È¡¢¸µ¤ËÌ᤻¤Þ¤»¤ó!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "ËÜÅö¤Ë¤³¤Î¸°¤ò»Ø̾¼º¸ú¼Ô¤ËǤ̿¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "ÈëÌ©¸°¤ÎÁªÂò¤ò¤È¤¤¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "¹â¡¹1¸Ä¤ÎÉû¸°¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Éû¸°¤ÎÍ­¸ú´ü¸Â¤òÊѹ¹¤·¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "¼ç¸°¤ÎÍ­¸ú´ü¸Â¤òÊѹ¹¤·¤Þ¤¹¡£\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "v3¸°¤ÎÍ­¸ú´ü¸Â¤ÏÊѹ¹¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "ÈëÌ©¸°ÎؤËÂбþ¤¹¤ë½ð̾¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "·Ù¹ð: ½ð̾Éû¸°%s¤Ï¡¢Áê¸ß¾ÚÌÀ¤Ç¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "¥æ¡¼¥¶¡¼ID¤ò¤­¤Ã¤«¤ê¤Ò¤È¤ÄÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Îv3¼«¸Ê½ð̾¤ò¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Áª¹¥¸°¥µ¡¼¥Ð¡¼URL¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "ËÜÅö¤Ë¸ò´¹¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "ËÜÅö¤Ëºï½ü¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "½ð̾Ãí¼á: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "¾å½ñ¤­¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "%dÈ֤Υ桼¥¶¡¼ID¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "%dÈ֤Υ桼¥¶¡¼ID¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "%dÈ֤Υ桼¥¶¡¼ID¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "¥æ¡¼¥¶¡¼ID:¡È%s¡É\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "%s¤Ç%s%s%s¤Ë½ð̾¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (½ñ½Ð¤·ÉÔ²Ä)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "¤³¤Î½ð̾¤Ï%s¤ÇËþλ¤Ç¤¹¡£\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "¤½¤ì¤Ç¤âËÜÅö¤Ë¼º¸ú¤·¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "¤³¤Î½ð̾¤Ë¤¿¤¤¤¹¤ë¼º¸ú¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "¤³¤ì¤é¤Î¥æ¡¼¥¶¡¼ID¤Ë¸°%s¤Ç½ð̾¤·¤Þ¤·¤¿:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (¼º¸úÉÔ²Ä)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "¤¢¤Ê¤¿¤Î¸°%s¤Ç%s¤Ë¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "¤³¤ì¤é¤Î½ð̾¤ò¼º¸ú¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "¼º¸ú¾ÚÌÀ½ñ¤òËÜÅö¤ËºîÀ®¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "ÈëÌ©¸°¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¤â¤¦¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "·Ù¹ð: ¥æ¡¼¥¶¡¼ID½ð̾¤¬¡¢%dÉÃ̤Íè¤Ç¤¹\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¤â¤¦¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¤â¤¦¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "%s (Â礭¤µ%ld) ¤Î¸°%s (uid %d) ¤Î¥Õ¥©¥ÈID¤È¤·¤Æɽ¼¨\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "Áª¹¥¡Ö%s¡×¤Î½ÅÊ£\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "¿¤¹¤®¤ë°Å¹æË¡Áª¹¥\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "¿¤¹¤®¤ëÍ×ÌóÁª¹¥\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "¿¤¹¤®¤ë°µ½ÌÁª¹¥\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Áª¹¥Ê¸»úÎó¤Ë̵¸ú¤Ê¹àÌÜ¡Ö%s¡×¤¬¤¢¤ê¤Þ¤¹\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "ľÀܽð̾¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "¼«¸Ê½ð̾¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "¸°Âбþ¤Ø¤Î½ð̾¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "̵¸ú¤Ê¸°Ä¹¡£%u¥Ó¥Ã¥È¤Ë¤·¤Þ¤¹\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "¸°Ä¹¤ò%u¥Ó¥Ã¥È¤Ë´Ý¤á¤Þ¤¹\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Encrypt"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Authenticate"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsEeAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "¸°%s¤Ë²Äǽ¤ÊÁàºî: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "º£¡¢²Äǽ¤ÊÁàºî: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) ½ð̾ÎϤÎȿž\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) °Å¹æÎϤÎȿž\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Ç§¾ÚÎϤÎȿž\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) ´°Î»\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "¤´´õ˾¤Î¸°¤Î¼ïÎà¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA¤ÈElgamal (´ûÄê)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (½ð̾¤Î¤ß)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (Æȼ«Ç½ÎϤòÀßÄê)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Elgamal (°Å¹æ²½¤Î¤ß)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (½ð̾¤Î¤ß)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (°Å¹æ²½¤Î¤ß)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (Æȼ«Ç½ÎϤòÀßÄê)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA¸°ÂФÏ1024¥Ó¥Ã¥È¤Ë¤Ê¤ê¤Þ¤¹¡£\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "¤É¤Î¸°Ä¹¤Ë¤·¤Þ¤¹¤«? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Í׵ᤵ¤ì¤¿¸°Ä¹¤Ï%u¥Ó¥Ã¥È\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "%u¥Ó¥Ã¥È¤Ë´Ý¤á¤Þ¤¹\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"¸°¤ÎÍ­¸ú´ü¸Â¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£\n"
+"         0 = ¸°¤Ï̵´ü¸Â\n"
+"      <n>  = ¸°¤Ï n Æü´Ö¤ÇËþλ\n"
+"      <n>w = ¸°¤Ï n ½µ´Ö¤ÇËþλ\n"
+"      <n>m = ¸°¤Ï n ¤«·î´Ö¤ÇËþλ\n"
+"      <n>y = ¸°¤Ï n Ç¯´Ö¤ÇËþλ\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"½ð̾¤ÎÍ­¸ú´ü¸Â¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤¡£\n"
+"         0 = ½ð̾¤Ï̵´ü¸Â\n"
+"      <n>  = ½ð̾¤Ï n Æü´Ö¤ÇËþλ\n"
+"      <n>w = ½ð̾¤Ï n ½µ´Ö¤ÇËþλ\n"
+"      <n>m = ½ð̾¤Ï n ¤«·î´Ö¤ÇËþλ\n"
+"      <n>y = ½ð̾¤Ï n Ç¯´Ö¤ÇËþλ\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "¸°¤ÎÍ­¸ú´ü´Ö¤Ï? (0)"
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "½ð̾¤ÎÍ­¸ú´ü´Ö¤Ï? (0)"
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "̵¸ú¤ÊÃÍ\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s¤Ï̵´ü¸Â¤Ç¤¹\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s¤Ï̵´ü¸Â¤Ç¤¹\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s¤Ï%s¤ÇËþλ¤·¤Þ¤¹\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "¤³¤Î½ð̾¤Ï%s¤ÇËþλ¤Ç¤¹\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"¤³¤Î¥·¥¹¥Æ¥à¤Ç¤Ï¡¢2038ǯ°Ê¹ß¤ÎÆüÉÕ¤òɽ¼¨¤Ç¤­¤Þ¤»¤ó¤¬¡¢\n"
+"2106ǯ¤Þ¤Ç¤Ê¤éÀµ¤·¤¯¼è¤ê°·¤¨¤Þ¤¹¡£\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "¤³¤ì¤ÇÀµ¤·¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"¤¢¤Ê¤¿¤Î¸°¤òƱÄꤹ¤ë¤¿¤á¤Ë¥æ¡¼¥¶¡¼ID¤¬É¬ÍפǤ¹¡£\n"
+"¤³¤Î¥½¥Õ¥È¤ÏËÜ̾¡¢¥³¥á¥ó¥È¡¢ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¤«¤é\n"
+"¼¡¤Î½ñ¼°¤Ç¥æ¡¼¥¶¡¼ID¤ò¹½À®¤·¤Þ¤¹:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "ËÜ̾: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "̾Á°¤Ë̵¸ú¤Êʸ»ú¤¬¤¢¤ê¤Þ¤¹\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "̾Á°¤ò¿ô»ú¤Ç»Ï¤á¤Æ¤Ï¤¤¤±¤Þ¤»¤ó\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "̾Á°¤Ï5ʸ»ú°Ê¾å¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "ÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Í­¸ú¤ÊÅŻҥ᡼¥ë¡¦¥¢¥É¥ì¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "¥³¥á¥ó¥È: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "¥³¥á¥ó¥È¤Ë̵¸ú¤Êʸ»ú¤¬¤¢¤ê¤Þ¤¹\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "¤¢¤Ê¤¿¤Ïʸ»ú½¸¹ç¡Ö%s¡×¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"¼¡¤Î¥æ¡¼¥¶¡¼ID¤òÁªÂò¤·¤Þ¤·¤¿:\n"
+"    ¡È%s¡É\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "ÅŻҥ᡼¥ë¤Î¥¢¥É¥ì¥¹¤òËÜ̾¤ä¥³¥á¥ó¥È¤ËÆþ¤ì¤Ê¤¤¤è¤¦¤Ë\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "̾Á°(N)¡¢¥³¥á¥ó¥È(C)¡¢ÅŻҥ᡼¥ë(E)¤ÎÊѹ¹¡¢¤Þ¤¿¤Ï½ªÎ»(Q)? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "̾Á°(N)¡¢¥³¥á¥ó¥È(C)¡¢ÅŻҥ᡼¥ë(E)¤ÎÊѹ¹¡¢¤Þ¤¿¤ÏOK(O)¤«½ªÎ»(Q)? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "¤Þ¤º¥¨¥é¡¼¤ò½¤Àµ¤·¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"ÈëÌ©¸°¤òÊݸ¤ë¤¿¤á¤Ë¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬¤¤¤ê¤Þ¤¹¡£\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"º£¤«¤éŤ¤Íð¿ô¤òÀ¸À®¤·¤Þ¤¹¡£¥­¡¼¥Ü¡¼¥É¤òÂǤĤȤ«¡¢¥Þ¥¦¥¹¤òÆ°¤«¤¹\n"
+"¤È¤«¡¢¥Ç¥£¥¹¥¯¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤È¤«¤Î¾¤Î¤³¤È¤ò¤¹¤ë¤È¡¢Íð¿ôÀ¸À®»Ò¤Ç\n"
+"Í𻨤µ¤ÎÂ礭¤Ê¤¤¤¤Íð¿ô¤òÀ¸À®¤·¤ä¤¹¤¯¤Ê¤ë¤Î¤Ç¡¢¤ª´«¤á¤¤¤¿¤·¤Þ¤¹¡£\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "¸°¤ÎÀ¸À®¤¬¼è¤ê¾Ã¤µ¤ì¤Þ¤·¤¿¡£\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "¡Ö%s¡×¤Ø¸ø³«¸°¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "¡Ö%s¡×¤ØÈëÌ©¸°¥¹¥¿¥Ö¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "¡Ö%s¡×¤ØÈëÌ©¸°¤ò½ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "½ñ¹þ¤ß²Äǽ¤Ê¸ø³«¸°Îؤ¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "½ñ¹þ¤ß²Äǽ¤ÊÈëÌ©¸°Îؤ¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "¸ø³«¸°ÎØ¡Ö%s¡×¤Î½ñ¹þ¤ß¥¨¥é¡¼: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "ÈëÌ©¸°ÎØ¡Ö%s¡×¤Î½ñ¹þ¤ß¥¨¥é¡¼: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "¸ø³«¸°¤ÈÈëÌ©¸°¤òºîÀ®¤·¡¢½ð̾¤·¤Þ¤·¤¿¡£\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"¤³¤Î¸°¤Ï°Å¹æ²½¤Ë¤Ï»ÈÍѤǤ­¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£°Å¹æ²½¤ò¹Ô¤¦¤Ë¤Ï¡¢\n"
+"¡È--edit-key¡É¥³¥Þ¥ó¥É¤ò»È¤Ã¤ÆÉû¸°¤òÀ¸À®¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "¸°¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr "¸°¤Ï%luÉÃ̤Íè¤Ë¤Ç¤­¤Þ¤·¤¿ (»þ´Öι¹Ô¤«»þ·×¤Î¾ã³²¤Ç¤·¤ç¤¦)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr "¸°¤Ï%luÉÃ̤Íè¤Ë¤Ç¤­¤Þ¤·¤¿ (»þ´Öι¹Ô¤«»þ·×¤Î¾ã³²¤Ç¤·¤ç¤¦)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "Ãí°Õ: v3¸°¤ÎÉû¸°¤ÎºîÀ®¤Ï¡¢OpenPGP¤ËŬ¹ç¤·¤Þ¤»¤ó\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "ËÜÅö¤ËºîÀ®¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "¥«¡¼¥É¤Ø¤Î¸°¤ÎÊݴɤ˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "¥Ð¥Ã¥¯¥¢¥Ã¥×¡¦¥Õ¥¡¥¤¥ë¡Ö%s¡×¤¬ºîÀ®¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "Ãí°Õ: ¥«¡¼¥É¸°¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬¡Ö%s¡×¤ØÊݸ¤µ¤ì¤Þ¤¹\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "̵´ü¸Â    "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "¥¯¥ê¥Æ¥£¥«¥ë¤Ê½ð̾¥Ý¥ê¥·¡¼: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "½ð̾¥Ý¥ê¥·¡¼: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "º£¤ÎÁª¹¥¸°¥µ¡¼¥Ð¡¼: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "¥¯¥ê¥Æ¥£¥«¥ë¤Ê½ð̾Ãí¼á: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "½ð̾Ãí¼á: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "¸°ÎØ"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "¼ç¸°¤Î»ØÌæ:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "Éû¸°¤Î»ØÌæ:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " ¼ç¸°¤Î»ØÌæ:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr " Éû¸°¤Î»ØÌæ:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "                 »ØÌæ ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "         ¥«¡¼¥É¤ÎÄÌÈÖ ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "¡Ö%s¡×¤«¤é¡Ö%s¡×¤Ø¤Î°ÜÆ°¤Ë¼ºÇÔ: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "·Ù¹ð: ¿®ÍѾðÊó¤ò¤â¤Ã¤¿2¤Ä¤Î¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Þ¤¹¡£\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s¤ÏÊѹ¹¤Î¤Ê¤¤Êý¤Ç¤¹\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s¤Ï¿·¤·¤¤Êý¤Ç¤¹\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "¤³¤ÎÀøºßŪ¤Ê°ÂÁ´¾å¤Î·ç´Ù¤ò½¤Àµ¤·¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "¸°ÎØ¡Ö%s¡×¤ò¥­¥ã¥Ã¥·¥å¤·¤Þ¤¹\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu¸Ä¤Î¸°¤Þ¤Ç¥­¥ã¥Ã¥·¥åºÑ (%lu¸Ä¤Î½ð̾)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu¸Ä¤Î¸°¤ò¥­¥ã¥Ã¥·¥åºÑ (%lu¸Ä¤Î½ð̾)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: ¸°Îؤ¬¤Ç¤­¤Þ¤·¤¿\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Áª¹¥¸°¥µ¡¼¥Ð¡¼URL¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"·Ù¹ð: ¸°¥µ¡¼¥Ð¡¼¤Î¥ª¥×¥·¥ç¥ó¡Ö%s¡×¤Ï¡¢¤³¤Î¥×¥é¥Ã¥È¥Û¡¼¥à¤Ç¤Ï»È¤¨¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "disabled"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "ÈÖ¹æ(s)¡¢N)¼¡¡¢¤Þ¤¿¤ÏQ)Ãæ»ß¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤ >"
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "̵¸ú¤Ê¸°¥µ¡¼¥Ð¡¼¡¦¥×¥í¥È¥³¥ë¤Ç¤¹ (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "¸°¡È%s¡É¤¬¸°¥µ¡¼¥Ð¡¼¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "¸°¤¬¸°¥µ¡¼¥Ð¡¼¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "¸°%s¤ò%s¤«¤é¥µ¡¼¥Ð¡¼%s¤ËÍ×µá\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "¸°%s¤ò%s¤ËÍ×µá\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "¡È%s¡É¤ò%s¥µ¡¼¥Ð¡¼%s¤«¤é¸¡º÷\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "¡È%s¡É¤ò¥µ¡¼¥Ð¡¼%s¤«¤é¸¡º÷\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "¸°%s¤ò%s¥µ¡¼¥Ð¡¼%s¤ØÁ÷¿®\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "¸°%s¤ò%s¤ØÁ÷¿®\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "¡È%s¡É¤ò%s¥µ¡¼¥Ð¡¼%s¤«¤é¸¡º÷\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "¡È%s¡É¤ò¥µ¡¼¥Ð¡¼%s¤«¤é¸¡º÷\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¡¦¥¢¥¯¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤»¤ó!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "·Ù¹ð: ÊÌÈÇ (%s) ¤ÎGnuPG¤Î¸°¥µ¡¼¥Ð¡¼¡¦¥Ï¥ó¥É¥é\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤ÏVERSION¤òÁ÷¿®¤·¤Þ¤»¤ó¤Ç¤·¤¿\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "´ûÃΤθ°¥µ¡¼¥Ð¡¼¤¬¤¢¤ê¤Þ¤»¤ó (¥ª¥×¥·¥ç¥ó--keyserver¤ò»È¤¤¤Þ¤·¤ç¤¦)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "¤³¤Î¹½ÃۤǤϡ¢³°Éô¸°¥µ¡¼¥Ð¡¼¤Î¸Æ½Ð¤·¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¡¦¥¹¥­¡¼¥à¡Ö%s¡×ÍѤΥϥó¥É¥é¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "Áàºî¡Ö%s¡×¤Ï¡¢¸°¥µ¡¼¥Ð¡¼¡¦¥¹¥­¡¼¥à¡Ö%s¡×¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:1536
+#, fuzzy, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "gpgkeys_%s¤Ï¡¢¥Ï¥ó¥É¥é%dÈǤò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Î¥¿¥¤¥à¥¢¥¦¥È\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤ÎÆâÉô¥¨¥é¡¼\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "¸°¥µ¡¼¥Ð¡¼ÄÌ¿®¥¨¥é¡¼: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "¡È%s¡É¸°ID¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó: ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "·Ù¹ð: ¸°%s¤ò%s·Ðͳ¤Ç²óÉü¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "1Ëܤθ°¤ò%s¤«¤é²óÉü\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "%dËܤθ°¤ò%s¤«¤é²óÉü\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "·Ù¹ð: ¸°%s¤ò%s·Ðͳ¤Ç²óÉü¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "·Ù¹ð: ¸°%s¤ò%s·Ðͳ¤Ç²óÉü¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "ÊѤÊŤµ¤Î°Å¹æ²½ºÑ¤ß¥»¥Ã¥·¥ç¥ó¸° (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s °Å¹æ²½ºÑ¤ß¥»¥Ã¥·¥ç¥ó¸°\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "̤ÃΤÎÍ×Ì󥢥르¥ê¥º¥à¤ÇÀ¸À®¤µ¤ì¤¿¥Ñ¥¹¥Õ¥ì¡¼¥º %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "¸ø³«¸°¤Ï%s¤Ç¤¹\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "¸ø³«¸°¤Ë¤è¤ë°Å¹æ²½ºÑ¤ß¥Ç¡¼¥¿: Àµ¤·¤¤DEK¤Ç¤¹\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "%u-¥Ó¥Ã¥È%s¸°, ID %s, ÆüÉÕ%s¤Ë°Å¹æ²½¤µ¤ì¤Þ¤·¤¿\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      ¡È%s¡É\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "%s¸°, ID %s¤Ç°Å¹æ²½¤µ¤ì¤Þ¤·¤¿\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "¸ø³«¸°¤ÎÉü¹æ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "%lu ¸Ä¤Î¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ç°Å¹æ²½\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "1 ¸Ä¤Î¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ç°Å¹æ²½\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "%s°Å¹æ²½ºÑ¤ß¥Ç¡¼¥¿¤ò²¾Äê\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA°Å¹æË¡¤ÏÍøÍÑÉÔǽ¤Ê¤Î¤Ç¡¢³ÚŷŪ¤Ç¤¹¤¬%s¤ÇÂåÍѤ·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "Éü¹æ¤ËÀ®¸ù\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "·Ù¹ð: ¥á¥Ã¥»¡¼¥¸¤Î´°Á´À­¤ÏÊݸ¤ì¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "·Ù¹ð: °Å¹æ²½¤µ¤ì¤¿¥á¥Ã¥»¡¼¥¸¤Ï²þã⤵¤ì¤Æ¤¤¤Þ¤¹!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "Éü¹æ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "Ãí°Õ: Á÷¿®¼Ô¤Ï¡ÈÆâ½ï¤Ë¤¹¤ë¡É¤è¤¦¤Ëµá¤á¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "¸µ¤Î¥Õ¥¡¥¤¥ë̾='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "ÆÈΩ¼º¸ú¡£¡Ègpg --import¡É¤ò»È¤Ã¤ÆŬÍѤ·¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "¡È%s¡É¤«¤é¤ÎÀµ¤·¤¤½ð̾"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "½ð̾¤Î¸¡¾Ú¤ò¾Êά\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "¤³¤Î¿½Å½ð̾¤Ï¼è¤ê°·¤¨¤Þ¤»¤ó\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "%s¤Ë»Ü¤µ¤ì¤¿½ð̾\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               %s¸°%s¤ò»ÈÍÑ\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "%s¤Ë%s¸°ID %s¤Ç»Ü¤µ¤ì¤¿½ð̾\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "°Ê²¼¤Ë¸°¤¬¤¢¤ê¤Þ¤¹: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "¡È%s¡É¤«¤é¤Î ÉÔÀµ¤Ê ½ð̾"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "¡È%s¡É¤«¤é¤Î´ü¸ÂÀÚ¤ì¤Î½ð̾"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "¡È%s¡É¤«¤é¤ÎÀµ¤·¤¤½ð̾"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[ÉÔ³ÎÄê]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                ÊÌ̾¡È%s¡É"
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "´ü¸ÂÀÚ¤ì¤Î½ð̾ %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "¤³¤Î½ð̾¤Ï%s¤ÇËþλ¤Ç¤¹\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s½ð̾¡¢Í×Ì󥢥르¥ê¥º¥à %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "¥Ð¥¤¥Ê¥ê¡¼"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "¥Æ¥­¥¹¥È¥â¡¼¥É"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "̤ÃΤÎ"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "½ð̾¤ò¸¡ºº¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "ʬΥ½ð̾¤Ç¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "·Ù¹ð: Â¿½Å½ð̾¤Î¸¡½Ð¡£ºÇ½é¤Î¤â¤Î¤À¤±¸¡ºº¤·¤Þ¤¹¡£\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "¥¯¥é¥¹0x%02x¤ÎÆÈΩ½ð̾\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "¸Å¤¤·Á¼° (PGP 2.x) ¤Î½ð̾\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "proc_tree() ¤ÎÃæ¤Ë̵¸ú¤Ê¥ë¡¼¥È¡¦¥Ñ¥±¥Ã¥È¤ò¸¡½Ð¤·¤Þ¤·¤¿\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "¥³¥¢¡¦¥À¥ó¥×¤ò»ÈÍѶػߤˤǤ­¤Þ¤»¤ó: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "¡Ö%s¡×¤Îfstat¤¬%s¤Ç¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d)¤¬%s¤Ç¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "¸ø³«¸°¤Î¥¢¥ë¥´¥ê¥º¥à%d¤Ï¡¢¼è¤ê°·¤¨¤Þ¤»¤ó\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "̤¼ÂÁõ¤Î°Å¹æ¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s½ð̾¡¢Í×Ì󥢥르¥ê¥º¥à %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "·Ù¹ð: Í×Ì󥢥르¥ê¥º¥à %s (%d) ¤Î¶¯À©¤¬¡¢¼õ¼è¿Í¤ÎÁª¹¥¤ÈÂÐΩ¤·¤Þ¤¹\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA°Å¹æË¡¤Î¥×¥é¥°¥¤¥ó¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "¾ÜºÙ¤Ïhttp://www.gnupg.org/faq.html¤ò¤´Í÷¤¯¤À¤µ¤¤\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: ÌäÂê»ë¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¡È%s¡É\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "·Ù¹ð:¡È%s¡É¤Ï¡¢ÌäÂê»ë¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "¡È%s%s¡É¤òÂå¤ï¤ê¤Ë»È¤Ã¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "·Ù¹ð:¡È%s¡É¤Ï¡¢ÌäÂê»ë¤µ¤ì¤Æ¤¤¤ë¥ª¥×¥·¥ç¥ó¤Ç¤¹\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "̵°µ½Ì"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "̵°µ½Ì|¤Ê¤·"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "¤³¤Î¥á¥Ã¥»¡¼¥¸¤Ï¡¢%s¤Ç¤Ï»ÈÍѤǤ­¤Þ¤»¤ó\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "¤¢¤¤¤Þ¤¤¤Ê¥ª¥×¥·¥ç¥ó¡Ö%s¡×\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "̤ÃΤΥª¥×¥·¥ç¥ó¡Ö%s¡×\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "¥Õ¥¡¥¤¥ë¡Ö%s¡×¤Ï´û¤Ë¸ºß¤·¤Þ¤¹¡£"
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "¾å½ñ¤­¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: Ì¤ÃΤγÈÄ¥»Ò\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "¿·¤·¤¤¥Õ¥¡¥¤¥ë̾¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "ɸ½à½ÐÎϤ˽ñ¤­¹þ¤ß¤Þ¤¹\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "½ð̾¤µ¤ì¤¿¥Ç¡¼¥¿¤¬¡Ö%s¡×¤Ë¤¢¤ë¤ÈÁÛÄꤷ¤Þ¤¹\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "¿·¤·¤¤¹½À®¥Õ¥¡¥¤¥ë¡Ö%s¡×¤¬¤Ç¤­¤Þ¤·¤¿\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "·Ù¹ð: ¡Ö%s¡×¤Î¥ª¥×¥·¥ç¥ó¤Ïµ¯Æ°¤·¤Æ¤¤¤ë´Ö¡¢Í­¸ú¤Ë¤Ê¤ê¤Þ¤»¤ó\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "¥Ç¥£¥ì¥¯¥È¥ê¡¼¡Ö%s¡×¤¬¤Ç¤­¤Þ¤·¤¿\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "¸ø³«¸°¤Î¥¢¥ë¥´¥ê¥º¥à%d¤Ï¡¢¼è¤ê°·¤¨¤Þ¤»¤ó\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "·Ù¹ð: ÀøºßŪ¤Ë·õÆݤÊÂоΰŹ沽¥»¥Ã¥·¥ç¥ó¸°¤Ç¤¹\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "·¿%d¤Î²¼°Ì¥Ñ¥±¥Ã¥È¤Ë¥¯¥ê¥Æ¥£¥«¥ë¡¦¥Ó¥Ã¥È¤òȯ¸«\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "¤³¤Î¥»¥Ã¥·¥ç¥ó¤Çgpg-agent¤Ï̵¸ú¤Ç¤¹\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "GPG_AGENT_INFO´Ä¶­ÊÑ¿ô¤Î½ñ¼°¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent¥×¥í¥È¥³¥ë¡¦¥Ð¡¼¥¸¥ç¥ó%d¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "¡Ö%s¡×¤ØÀܳ¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "¥¨¡¼¥¸¥§¥ó¥È¤Ë¾ã³²: ¥¨¡¼¥¸¥§¥ó¥ÈÍøÍѶػß\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (¼ç¸°ID %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"¼¡¤Î¥æ¡¼¥¶¡¼¤ÎÈëÌ©¸°¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¤Ë¤Ï¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬¤¤¤ê¤Þ¤¹:\n"
+"\"%.*s\"\n"
+"%u¥Ó¥Ã¥È%s¸°, ID %sºîÀ®ÆüÉÕ¤Ï%s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤òºÆÆþÎÏ\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤òÆþÎÏ\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "¥æ¡¼¥¶¡¼¤Ë¤è¤ë¼è¾Ã¤·\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "¥Ð¥Ã¥Á¡¦¥â¡¼¥É¤Ç¥Ñ¥¹¥Õ¥ì¡¼¥º¤ÏÌä¹ç¤»¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤òÆþÎÏ: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"¼¡¤Î¥æ¡¼¥¶¡¼¤ÎÈëÌ©¸°¤Î¥í¥Ã¥¯¤ò²ò½ü¤¹¤ë¤Ë¤Ï\n"
+"¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬¤¤¤ê¤Þ¤¹:¡È%s¡É\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u¥Ó¥Ã¥È%s¸°, ID %sºîÀ®ÆüÉÕ¤Ï%s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (¼ç¸°ID %s ¤ÎÉû¸°)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤òºÆÆþÎÏ: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"¤¢¤Ê¤¿¤Î¥Õ¥©¥ÈID¤Ë»È¤¦²èÁü¤ò·è¤á¤Æ¤¯¤À¤µ¤¤¡£²èÁü¤ÏJPEG¥Õ¥¡¥¤¥ë¤Ç¤¢¤ëɬ\n"
+"Íפ¬¤¢¤ê¤Þ¤¹¡£²èÁü¤Ï¸ø³«¸°¤È¤¤¤Ã¤·¤ç¤Ë³ÊǼ¤µ¤ì¤ë¡¢¤È¤¤¤¦¤³¤È¤òǰƬ¤Ë¤ª\n"
+"¤¤¤Æ¤ª¤­¤Þ¤·¤ç¤¦¡£¤â¤·Â礭¤Ê¼Ì¿¿¤ò»È¤¦¤È¡¢¤¢¤Ê¤¿¤Î¸°¤âƱÍͤËÂ礭¤¯¤Ê¤ê\n"
+"¤Þ¤¹! 240x288¤¯¤é¤¤¤Ë¤ª¤µ¤Þ¤ëÂ礭¤µ¤Î²èÁü¤Ï¡¢»È¤¤¤è¤¤¤Ç¤·¤ç¤¦¡£\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "¥Õ¥©¥ÈIDÍѤÎJPEG¥Õ¥¡¥¤¥ë̾¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "JPEG¥Õ¥¡¥¤¥ë¡Ö%s¡×¤¬³«¤±¤Þ¤»¤ó: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "¤³¤ÎJPEG¤Ï¡¢ËÜÅö¤ËÂ礭¤¤ (%d¥Ð¥¤¥È) !\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "ËÜÅö¤Ë»È¤¤¤¿¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "¡Ö%s¡×¤Ï¡¢JPEG¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "¤³¤Î¼Ì¿¿¤ÏÀµ¤·¤¤¤Ç¤¹¤« (y/N/q)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "¥Õ¥©¥ÈID¤¬É½¼¨ÉÔǽ!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Íýͳ¤Ï»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "¸°¤¬¤È¤ê¤«¤ï¤Ã¤Æ¤¤¤Þ¤¹"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "¸°¤¬¥Ñ¥¯¤é¤ì¤Þ¤·¤¿"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "¸°¤Ï¤â¤¦ÉÔÍѤǤ¹"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "¥æ¡¼¥¶¡¼ID¤¬¤â¤¦Í­¸ú¤Ç¤¢¤ê¤Þ¤»¤ó"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "¼º¸úÍýͳ: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "¼º¸ú¤Î¥³¥á¥ó¥È: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "¿®ÍÑÅÙ¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  ÊÌ̾¡È%s¡É\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"¤³¤Î¸°¤¬¤³¤Î¥æ¡¼¥¶¡¼¤ò¤Ê¤Î¤ëËܿͤΤâ¤Î¤«¤É¤¦¤«¡¢¤É¤ì¤¯¤é¤¤¿®ÍѤǤ­¤Þ¤¹¤«?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = ÃΤé¤Ê¤¤¡¢¤Þ¤¿¤Ï²¿¤È¤â¸À¤¨¤Ê¤¤\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = ¿®ÍѤ· ¤Ê¤¤\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = ÀäÂÐŪ¤Ë¿®ÍѤ¹¤ë\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = ¥á¡¼¥ó¡¦¥á¥Ë¥å¡¼¤ËÌá¤ë\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = ¤³¤Î¸°¤Ï¤È¤Ð¤¹\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = ½ªÎ»\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr "¤³¤Î¸°¤ÎºÇ¾®¿®ÍÑ¥ì¥Ù¥ë: %s\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "¤¢¤Ê¤¿¤Î·èÄê¤Ï? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "ËÜÅö¤Ë¤³¤Î¸°¤òÀäÂÐŪ¤Ë¿®ÍѤ·¤Þ¤¹¤«? (y/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "ÀäÂÐŪ¤Ë¿®ÍѤ·¤¿¸°¤Ø¤Î¾ÚÌÀ½ñ:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%s: ¤³¤Î¸°¤¬ËÜÅö¤ËËܿͤΤâ¤Î¤Ç¤¢¤ë¡¢¤È¤¤¤¦Ãû¸õ¤¬¡¢¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%s: ¤³¤Î¸°¤¬ËÜÅö¤ËËܿͤΤâ¤Î¤Ç¤¢¤ë¡¢¤È¤¤¤¦Ãû¸õ¤¬¡¢¾¯¤·¤·¤«¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "¤³¤Î¸°¤Ï¤¿¤Ö¤óËܿͤΤâ¤Î¤Ç¤¹\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "¤³¤Î¸°¤Ï¼«Ê¬¤Î¤â¤Î¤Ç¤¹\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"¤³¤Î¸°¤Ï¡¢¤³¤Î¥æ¡¼¥¶¡¼ID¤ò¤Ê¤Î¤ëËܿͤΤâ¤Î¤«¤É¤¦¤«³Î¿®¤Ç¤­\n"
+"¤Þ¤»¤ó¡£º£¤«¤é¹Ô¤¦¤³¤È¤ò¡öËÜÅö¤Ë¡öÍý²ò¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢\n"
+"¼¡¤Î¼ÁÌä¤Ë¤Ïno¤ÈÅú¤¨¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "¤½¤ì¤Ç¤â¤³¤Î¸°¤ò»È¤¤¤Þ¤¹¤«? (y/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "·Ù¹ð: ¿®ÍѤǤ­¤Ê¤¤¸°¤ò»È¤Ã¤Æ¤¤¤Þ¤¹!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "·Ù¹ð: ¤³¤Î¸°¤Ï¼º¸ú¤µ¤ì¤¿¤è¤¦¤Ç¤¹ (¼º¸ú¸°¤ÏÉÔºß)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "·Ù¹ð: ¤³¤Î¸°¤Ï»Ø̾¼º¸ú¼Ô¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "·Ù¹ð: ¤³¤Î¸°¤Ï½êÍ­¼Ô¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "      ½ð̾¤¬µ¶Êª¤Ê¤³¤È¤â¤¢¤ë¡¢¤È¤¤¤¦¤³¤È¤Ç¤¹¡£\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "·Ù¹ð: ¤³¤ÎÉû¸°¤Ï½êÍ­¼Ô¤Ë¤è¤Ã¤Æ¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Ãí°Õ: ¤³¤Î¸°¤Ï»ÈÍѶػߤËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Ãí°Õ: ¤³¤Î¸°¤ÏËþλ¤Ç¤¹!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "·Ù¹ð: ¤³¤Î¸°¤Ï¿®ÍѤǤ­¤ë½ð̾¤Ç¾ÚÌÀ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "      ¤³¤Î½ð̾¤¬½êÍ­¼Ô¤Î¤â¤Î¤«¤É¤¦¤«¤Î¸¡¾Ú¼êÃʤ¬¤¢¤ê¤Þ¤»¤ó¡£\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "·Ù¹ð: ¤³¤Î¸°¤Ï¿®ÍѤǤ­¤Þ ¤»¤ó!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "      ¤³¤Î½ð̾¤Ï¤ª¤½¤é¤¯ µ¶Êª ¤Ç¤¹¡£\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr "·Ù¹ð: ¤³¤Î¸°¤Ï½½Ê¬¤Ë¿®ÍѤǤ­¤ë½ð̾¤Ç¾ÚÌÀ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "      ¤³¤Î½ð̾¤¬½êÍ­¼Ô¤Î¤â¤Î¤«¤É¤¦¤«³Î¿®¤Ç¤­¤Þ¤»¤ó¡£\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ¥¹¥­¥Ã¥×: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ¥¹¥­¥Ã¥×: ¸ø³«¸°¤Ï¤â¤¦¤¢¤ê¤Þ¤¹\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "¥æ¡¼¥¶¡¼ID¤ò»ØÄꤷ¤Æ¤¤¤Þ¤»¤ó (¡È-r¡É¤ò»È¤¤¤Þ¤·¤ç¤¦) ¡£\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "º£¤Î¼õ¼è¿Í:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"¥æ¡¼¥¶¡¼ID¤òÆþÎÏ¡£¶õ¹Ô¤Ç½ªÎ»: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "¤½¤Î¥æ¡¼¥¶¡¼ID¤Ï¤¢¤ê¤Þ¤»¤ó¡£\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "¥¹¥­¥Ã¥×: ¸ø³«¸°¤Ï´ûÄê¤Î¼õ¼è¿Í¤È¤·¤Æ¤â¤¦ÀßÄêºÑ¤ß¤Ç¤¹\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "¸ø³«¸°¤Ï»ÈÍѶػߤǤ¹¡£\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "¥¹¥­¥Ã¥×: ¸ø³«¸°¤Ï¤â¤¦ÀßÄêºÑ¤ß¤Ç¤¹\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "´ûÄê¤Î¼õ¼è¿Í¡È%s¡É¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: ¥¹¥­¥Ã¥×: ¸ø³«¸°¤Ï»ÈÍѶػߤǤ¹\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "Í­¸ú¤Ê°¸À褬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+"¥Ç¡¼¥¿¤ÏÊݸ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£\n"
+"Êݸ¤¹¤ë¤Ë¤Ï¡È--output¡É¥ª¥×¥·¥ç¥ó¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "¡Ö%s¡×¤ÎºîÀ®¥¨¥é¡¼: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "ʬΥ½ð̾¡£\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "¥Ç¡¼¥¿¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤òÆþÎÏ: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "ɸ½àÆþÎϤè¤êÆɽФ·Ãæ ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "½ð̾¤µ¤ì¤¿¥Ç¡¼¥¿¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "½ð̾¤µ¤ì¤¿¥Ç¡¼¥¿¡Ö%s¡×¤¬³«¤±¤Þ¤»¤ó\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "ƿ̾¤Î¼õ¼è¿ÍÍѤǤ¹¡£ÈëÌ©¸°%s¤ò»î¤·¤Þ¤¹ ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "½ªÎ»¡£Æ¿Ì¾¤Î¼õ¼è¿ÍÍѤǤ¹¡£\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "µì¼°¤ÎDEKÉä¹æ¤Ï¡¢¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "°Å¹æ¥¢¥ë¥´¥ê¥º¥à%d%s¤Ï̤ÃΤ«»ÈÍѶػߤǤ¹\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "·Ù¹ð: °Å¹æ¥¢¥ë¥´¥ê¥º¥à%s¤Ï¼õ¼è¿Í¤ÎÁª¹¥¤ËÆþ¤Ã¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "Ãí°Õ: ÈëÌ©¸°%s¤Ï%s¤ÇËþλ¤Ç¤¹\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "Ãí°Õ: ¸°¤Ï¼º¸úºÑ¤ß¤Ç¤¹"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "¸°%s¤Ë¤Ï¥æ¡¼¥¶¡¼ID¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "¼º¸ú¼Ô:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(¤³¤ì¤Ï¡¢¥Ç¥ê¥±¡¼¥È¤Ê¼º¸ú¸°¤Ç¤¹)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "¤³¤Î¸°¤Ë¤¿¤¤¤¹¤ë»Ø̾¼º¸ú¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "ASCIIÊñÁõ½ÐÎϤò¶¯À©¤·¤Þ¤¹¡£\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "¼º¸ú¾ÚÌÀ½ñ¤òºîÀ®¡£\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "¡È%s¡ÉÍѤμº¸ú¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "ÈëÌ©¸°¡È%s¡É¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "Âбþ¤¹¤ë¸ø³«¸°¤¬¤¢¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "¸ø³«¸°¤ÈÈëÌ©¸°¤¬¾È¹ç¤·¤Þ¤»¤ó!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "¤³¤Î¸°¤Ë¤¿¤¤¤¹¤ë¼º¸ú¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤¹¤«? (y/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "̤ÃΤÎÊݸ¥ë¥´¥ê¥º¥à¤Ç¤¹\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "Ãí°Õ: ¤³¤Î¸°¤ÏÊݸ¤ì¤Æ¤¤¤Þ¤»¤ó!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"¼º¸ú¾ÚÌÀ½ñ¤òºîÀ®¤·¤Þ¤·¤¿¡£\n"
+"\n"
+"¸«¤Ä¤«¤é¤Ê¤¤¤è¤¦¤ÊÇÞÂΤ˰ÜÆ°¤·¤Æ¤¯¤À¤µ¤¤¡£¤â¤·¥ï¥ë¤¬¤³¤Î¾ÚÌÀ½ñ¤Ø¤Î\n"
+"¥¢¥¯¥»¥¹¤òÆÀ¤ë¤È¡¢¤½¤¤¤Ä¤Ï¤¢¤Ê¤¿¤Î¸°¤ò»È¤¨¤Ê¤¯¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£\n"
+"ÇÞÂΤ¬ÆɽФ·ÉÔǽ¤Ë¤Ê¤Ã¤¿¾ì¹ç¤ËÈ÷¤¨¤Æ¡¢¤³¤Î¾ÚÌÀ½ñ¤ò°õºþ¤·¤ÆÊݴɤ¹¤ë¤Î\n"
+"¤¬¸­ÌÀ¤Ç¤¹¡£¤·¤«¤·¡¢¤´Ãí°Õ¤¯¤À¤µ¤¤¡£¤¢¤Ê¤¿¤Î¥Þ¥·¥ó¤Î°õ»ú¥·¥¹¥Æ¥à¤Ï¡¢\n"
+"¤À¤ì¤Ç¤â¸«¤¨¤ë¾ì½ê¤Ë¥Ç¡¼¥¿¤ò¤ª¤¯¤³¤È¤¬¤¢¤ê¤Þ¤¹!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "¼º¸ú¤ÎÍýͳ¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "¥­¥ã¥ó¥»¥ë"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(¤³¤³¤Ç¤Ï¤¿¤Ö¤ó%d¤òÁª¤Ó¤Þ¤¹)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "ͽÈ÷¤ÎÀâÌÀ¤òÆþÎÏ¡£¶õ¹Ô¤Ç½ªÎ»:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "¼º¸úÍýͳ: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(ÀâÌÀ¤Ï¤¢¤ê¤Þ¤»¤ó)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "¤è¤í¤·¤¤¤Ç¤¹¤«? (y/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "ÈëÌ©Éôʬ¤¬ÆÀ¤é¤ì¤Þ¤»¤ó\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "Êݸ¥ë¥´¥ê¥º¥à%d%s¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "ÊݸîÍ×Ìó%d¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "̵¸ú¤Ê¥Ñ¥¹¥Õ¥ì¡¼¥º¤Ç¤¹¡£ºÆÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "·Ù¹ð: ¼å¤¤¸°¤ò¸¡½Ð¤·¤Þ¤·¤¿¡£¥Ñ¥¹¥Õ¥ì¡¼¥º¤òÊѹ¹¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "ÌäÂê»ë¤µ¤ì¤¿16¥Ó¥Ã¥È¤Î¥Á¥§¥Ã¥¯¥µ¥à¤òÈëÌ©¸°¤ÎÊݸî¤ËÀ¸À®\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "¼å¤¤¸°¤¬¤Ç¤­¤Þ¤·¤¿ - ºÆ¼Â¹Ô\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr "ÂоΰŹæË¡¤Î¼å¤¤¸°¤ò²óÈò¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£%d²ó»î¤ß¤Þ¤·¤¿!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "·Ù¹ð: ½ð̾¤ÎÍ×Ì󤬡¢¥á¥Ã¥»¡¼¥¸¤ÈÌ·½â¤·¤Þ¤¹\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "·Ù¹ð: ½ð̾Éû¸°%s¤Ï¡¢Áê¸ß¾ÚÌÀ¤Ç¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "·Ù¹ð: Ìµ¸ú¤ÊÁê¸ß¾ÚÌÀ¤¬¡¢½ð̾Éû¸°%s¤Ë¤¢¤ê¤Þ¤¹\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "¸ø³«¸°%s¤Ï¡¢½ð̾¤Î%luÉÃÁ°¤Ç¤¹\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "¸ø³«¸°%s¤Ï¡¢½ð̾¤Î%luÉÃÁ°¤Ç¤¹\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr "¸°%s¤Ï%luÉÃ̤Íè¤Ë¤Ç¤­¤Þ¤·¤¿ (»þ´Öι¹Ô¤«»þ·×¤Î¾ã³²¤Ç¤·¤ç¤¦)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr "¸°%s¤Ï%luÉÃ̤Íè¤Ë¤Ç¤­¤Þ¤·¤¿ (»þ´Öι¹Ô¤«»þ·×¤Î¾ã³²¤Ç¤·¤ç¤¦)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "Ãí°Õ: ½ð̾¸°%s¤Ï%s¤ËËþλ¤Ç¤¹\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "̤ÃΤΥ¯¥ê¥Æ¥£¥«¥ë¡¦¥Ó¥Ã¥È¤Ë¤è¤ê¡¢¸°%s¤Î½ð̾¤òÉÔÀµ¤È¤ß¤Ê¤·¤Þ¤¹\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "¸°%s: Éû¸°¼º¸ú½ð̾¤Ë¤¿¤¤¤¹¤ëÉû¸°¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "¸°%s: Éû¸°Âбþ¤Ø¤Î½ð̾¤Ë¤¿¤¤¤¹¤ëÉû¸°¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "Ãí¼á¥Ç¡¼¥¿¤Ï¡¢(PGP 2.x·Á¼°¤Î) v3½ð̾¤Ë¤ÏÆþ¤ê¤Þ¤»¤ó\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "Ãí¼á¥Ç¡¼¥¿¤Ï¡¢(PGP 2.x·Á¼°¤Î) v3¸°½ð̾¤Ë¤ÏÆþ¤ê¤Þ¤»¤ó\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr "·Ù¹ð: É½µ­¤ò%%³ÈÄ¥ÉÔǽ (Â礭¤¹¤®)¡£Èó³ÈÄ¥¤ò»ÈÍÑ¡£\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "¥Ý¥ê¥·¡¼URL¤Ï¡¢(PGP 2.x·Á¼°¤Î) v3½ð̾¤Ë¤ÏÆþ¤ê¤Þ¤»¤ó\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "¥Ý¥ê¥·¡¼URL¤Ï¡¢(PGP 2.x·Á¼°¤Î) v3¸°½ð̾¤Ë¤ÏÆþ¤ê¤Þ¤»¤ó\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr "·Ù¹ð: ¥Ý¥ê¥·¡¼URL¤ò%%³ÈÄ¥ÉÔǽ (Â礭¤¹¤®)¡£Èó³ÈÄ¥¤ò»ÈÍÑ¡£\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr "·Ù¹ð: Áª¹¥¸°¥µ¡¼¥Ð¡¼URL¤ò%%³ÈÄ¥ÉÔǽ (Â礭¤¹¤®)¡£Èó³ÈÄ¥¤ò»ÈÍÑ¡£\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "ºîÀ®¤µ¤ì¤¿½ð̾¤Î¸¡ºº¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s½ð̾¡£½ð̾¼Ô:¡È%s¡É\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "--pgp2¥â¡¼¥É¤Ç¤Ï¡¢PGP 2.x·Á¼°¤Î¸°¤ÇʬΥ½ð̾¤Ç¤­¤ë¤À¤±¤Ç¤¹\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "·Ù¹ð: Í×Ì󥢥르¥ê¥º¥à %s (%d) ¤Î¶¯À©¤¬¡¢¼õ¼è¿Í¤ÎÁª¹¥¤ÈÂÐΩ¤·¤Þ¤¹\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "½ð̾:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "--pgp2¥â¡¼¥É¤Ç¤ÏPGP 2.x·Á¼°¤Î¸°¤Ç¥¯¥ê¥¢½ð̾¤·¤«¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s°Å¹æ²½¤ò»ÈÍѤ·¤Þ¤¹\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"·õÆݤǤ¢¤ë¤È¤¤¤¦¥Õ¥é¥°¤¬¸°¤Ë¤ÏÀßÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£\n"
+"µ¶ÊªÍð¿ôÀ¸À®»Ò¤È¤Ï¤¤¤Ã¤·¤ç¤Ë»È¤¨¤Þ¤»¤ó!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "¡È%s¡É¤ò¤È¤Ð¤·¤Þ¤¹: ½ÅÊ£\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "¡È%s¡É¤ò¤È¤Ð¤·¤Þ¤¹: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "¥¹¥­¥Ã¥×: ÈëÌ©¸°¤Ï¤â¤¦¤¢¤ê¤Þ¤¹\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr "¤³¤ì¤ÏPGP¤ÎÀ¸À®¤·¤¿Elgamal¸°¤Ç¡¢½ð̾ÍѤˤϰÂÁ´¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "¿®Íѥ쥳¡¼¥É%lu, ·¿%d: ½ñ¹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Sitei sareta sin'youdo itiran %s\n"
+"# (\"gpg --import-ownertrust\" wo tukatte hukkyuu dekimasu)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "¡Ö%s¡×¤Ç¥¨¥é¡¼: %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "¹Ô¤¬Ä¹¤¹¤®¤Þ¤¹"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "¥³¥í¥ó¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "̵¸ú¤Ê»ØÌæ"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "½êÍ­¼Ô¿®ÍÑÅÙ¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "¡Ö%s¡×¤Ç¿®Íѥ쥳¡¼¥É¤Î¸¡º÷¥¨¥é¡¼: %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "¡Ö%s¡×¤ÇÆɽФ·¥¨¥é¡¼: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹: Æ±´ü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹ ¥ì¥³¡¼¥É%lu: ¥·¡¼¥¯¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹ ¥ì¥³¡¼¥É%lu: ½ñ¹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·¤¿ (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¥È¥é¥ó¥¶¥¯¥·¥ç¥ó¤¬Â礭¤¹¤®¤Þ¤¹\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "¡Ö%s¡×¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¡¼¤¬¤¢¤ê¤Þ¤»¤ó!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "¡Ö%s¡×¤Î¥í¥Ã¥¯¤òºîÀ®¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "¡Ö%s¡×¤¬¥í¥Ã¥¯¤Ç¤­¤Þ¤»¤ó\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: ¥Ð¡¼¥¸¥ç¥ó¡¦¥ì¥³¡¼¥É¤ÎºîÀ®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: Ìµ¸ú¤Ê¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤òºîÀ®\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: ¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤¬¤Ç¤­¤Þ¤·¤¿\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "Ãí°Õ: ¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤¬¡¢½ñ¹þ¤ßÉÔǽ¤Ç¤¹\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: Ìµ¸ú¤Ê¿®Íѥǡ¼¥¿¥Ù¡¼¥¹\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: ¥Ï¥Ã¥·¥åɽ¤ÎºîÀ®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: ¥Ð¡¼¥¸¥ç¥ó¡¦¥ì¥³¡¼¥É¤Î¹¹¿·¥¨¥é¡¼: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: ¥Ð¡¼¥¸¥ç¥ó¡¦¥ì¥³¡¼¥É¤ÎÆɽФ·¥¨¥é¡¼: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: ¥Ð¡¼¥¸¥ç¥ó¡¦¥ì¥³¡¼¥É¤Î½ñ¹þ¤ß¥¨¥é¡¼: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹: ¥·¡¼¥¯¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹: ÆɽФ·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿ (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: ¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¡¦¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: ¥ì¥³¡¼¥ÉÈÖ¹æ%luÈ֤ΥС¼¥¸¥ç¥ó¡¦¥ì¥³¡¼¥É\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: Ìµ¸ú¤Ê¥Õ¥¡¥¤¥ë¡¦¥Ð¡¼¥¸¥ç¥ó%d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: ¶õ¤­¥ì¥³¡¼¥É¤ÎÆɽФ·¥¨¥é¡¼: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: ¥Ç¥£¥ì¥¯¥È¥ê¡¼¡¦¥ì¥³¡¼¥É¤Î½ñ¹þ¤ß¥¨¥é¡¼: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: ¥ì¥³¡¼¥É¤Î½é´ü²½¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: ¥ì¥³¡¼¥É¤ÎÄɲä˼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤¬²õ¤ì¤Æ¤¤¤Þ¤¹¡£¡Ègpg --fix-trustdb¡É¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "%dʸ»ú°Ê¾å¤ÎŤµ¤Î¥Æ¥­¥¹¥È¹Ô¤Ï¡¢¼è¤ê°·¤¨¤Þ¤»¤ó\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "ÆþÎϹԤÎŤµ¤¬%dʸ»ú¤òĶ¤¨¤Æ¤¤¤Þ¤¹\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "¡Ö%s¡×¤Ï¡¢Í­¸ú¤ÊÂç·¿¸°ID¤Ç¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "¸°%s: ¿®ÍѤ¹¤ë¸°¤È¤·¤Æ¼õÍý¤·¤Þ¤·¤¿\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "¸°%s¤¬¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤ËÊ£¿ô¤¢¤ê¤Þ¤¹\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "¸°%s: ¿®ÍѤµ¤ì¤ë¸°¤Î¸ø³«¸°¤¬¤¢¤ê¤Þ¤»¤ó - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "¸°%s¤òÀäÂÐŪ¤Ë¿®ÍѤ¹¤ë¤è¤¦µ­Ï¿¤·¤Þ¤·¤¿\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "¿®Íѥ쥳¡¼¥É%lu, ¥ê¥¯¥¨¥¹¥È·¿%d: ÆɽФ·¤Ë¼ºÇÔ¤·¤Þ¤·¤¿: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "¿®Íѥ쥳¡¼¥É%lu¤¬Í׵ᤵ¤ì¤¿·¿%d¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr "̤ÃΤο®ÍÑ¥â¥Ç¥ë (%d) ¤Ï»È¤¨¤Þ¤»¤ó - %s¿®ÍÑ¥â¥Ç¥ë¤ò²¾Äê\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "%s¿®ÍÑ¥â¥Ç¥ë¤ò»ÈÍÑ\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "¼º¸ú"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "Ëþλ"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "̤ÃΤÎ"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+#, fuzzy
+msgid "[marginal]"
+msgstr "¤¢¤ëÄøÅÙ"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+#, fuzzy
+msgid "[ultimate]"
+msgstr "ÀäÂÐŪ"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "̤ÄêµÁ"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "̵´ü¸Â"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "¤¢¤ëÄøÅÙ"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "´°Á´"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "ÀäÂÐŪ"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¸¡ºº¤Ï¡¢ÉÔÍפǤ¹\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "¼¡²ó¤Î¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¸¡ºº¤Ï¡¢%s¤Ç¤¹\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "¿®ÍÑ¥â¥Ç¥ë¡Ö%s¡×¤Ç¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¸¡ºº¤Ï¡¢ÉÔÍפǤ¹\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "¿®ÍÑ¥â¥Ç¥ë¡Ö%s¡×¤Ç¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¹¹¿·¤Ï¡¢ÉÔÍפǤ¹\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "¸ø³«¸°%s¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "--check-trustdb¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¸¡ºº\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%dËܤθ°¤ò½èÍý (¤¦¤Á%dËܤÎÍ­¸úÀ­¿ô¤ò¥¯¥ê¥¢)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "ÀäÂÐŪ¤Ë¿®ÍѤ¹¤ë¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "ÀäÂÐŪ¤Ë¿®ÍѤ¹¤ë¸°%s¤Î¸ø³«¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr "ºÇ¾®¤Î¡Ö¤¢¤ëÄøÅ٤ο®ÍÑ¡×%d¡¢ºÇ¾®¤Î¡ÖÁ´ÌÌŪ¿®ÍÑ¡×%d¡¢%s¿®ÍÑ¥â¥Ç¥ë\n"
+
+#: g10/trustdb.c:2283
+#, 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"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¥Ð¡¼¥¸¥ç¥ó¡¦¥ì¥³¡¼¥É¤¬¹¹¿·¤Ç¤­¤Þ¤»¤ó: ½ñ¹þ¤ß¤Ë¼ºÇÔ¤·¤Þ¤·"
+"¤¿: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"½ð̾¤ò¸¡¾Ú¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿¡£½ð̾¥Õ¥¡¥¤¥ë\n"
+"(.sig¤ä.asc)¤¬¥³¥Þ¥ó¥É¹Ô¤ÎºÇ½é¤Ç¤Ê¤±¤ì¤Ð\n"
+"¤Ê¤é¤Ê¤¤¤³¤È¤òǰƬ¤Ë¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "ÆþÎϤÎ%u¹ÔÌܤ¬Ä¹¤¹¤®¤ë¤«¡¢LF¤¬¤Ê¤¤¤è¤¦¤Ç¤¹\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "°ìÈÌŪ¤Ê¥¨¥é¡¼"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "̤ÃΤΥѥ±¥Ã¥È·¿¤Ç¤¹"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "̤ÃΤΥС¼¥¸¥ç¥ó¤Ç¤¹"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "̤ÃΤθø³«¸°¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "̤ÃΤÎÍ×Ì󥢥르¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "¸ø³«¸°¤¬ÉÔÀµ¤Ç¤¹"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "ÈëÌ©¸°¤¬ÉÔÀµ¤Ç¤¹"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "½ð̾¤¬ÉÔÀµ¤Ç¤¹"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "¥Á¥§¥Ã¥¯¥µ¥à¡¦¥¨¥é¡¼"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬ÉÔÀµ¤Ç¤¹"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "¸ø³«¸°¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "̤ÃΤΰŹ楢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "¸°Îؤ¬³«¤±¤Þ¤»¤ó"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "̵¸ú¤Ê¥Ñ¥±¥Ã¥È¤Ç¤¹"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "̵¸ú¤ÊÊñÁõ¤Ç¤¹"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "¤½¤Î¥æ¡¼¥¶¡¼ID¤Ï¤¢¤ê¤Þ¤»¤ó"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "ÈëÌ©¸°¤¬ÆÀ¤é¤ì¤Þ¤»¤ó"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "¸í¤Ã¤¿ÈëÌ©¸°¤¬»È¤ï¤ì¤Æ¤¤¤Þ¤¹"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "¸°¤¬ÉÔÀµ¤Ç¤¹"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "¥Õ¥¡¥¤¥ë¤ÎÆɽФ·¥¨¥é¡¼"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "¥Õ¥¡¥¤¥ë¤Î½ñ¹þ¤ß¥¨¥é¡¼"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "̤ÃΤΰµ½Ì¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "¥Õ¥¡¥¤¥ë¤Î¥ª¡¼¥×¥ó¡¦¥¨¥é¡¼"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "¥Õ¥¡¥¤¥ë¤ÎºîÀ®¥¨¥é¡¼"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬Ìµ¸ú¤Ç¤¹"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "̤¼ÂÁõ¤Î¸ø³«¸°¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "̤¼ÂÁõ¤Î°Å¹æ¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "̤ÃΤνð̾¥¯¥é¥¹¤Ç¤¹"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "¿®Íѥǡ¼¥¿¥Ù¡¼¥¹¤Î¥¨¥é¡¼¤Ç¤¹"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "ÉÔÀµ¤ÊMPI¤Ç¤¹"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "¥ê¥½¡¼¥¹¤¬¸Â³¦¤Ç¤¹"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "̵¸ú¤Ê¸°ÎؤǤ¹"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "ÉÔÀµ¤Ê¾ÚÌÀ½ñ¤Ç¤¹"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "¥æ¡¼¥¶¡¼ID¤Î½ñ¼°¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "¥Õ¥¡¥¤¥ë¤Î¥¯¥í¡¼¥º¡¦¥¨¥é¡¼"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "¥Õ¥¡¥¤¥ë̾¤ÎÊѹ¹¥¨¥é¡¼"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "¥Õ¥¡¥¤¥ë¤Îºï½ü¥¨¥é¡¼"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "ͽ´ü¤»¤Ì¥Ç¡¼¥¿¤Ç¤¹"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "Æü»þ¤¬Ì·½â¤·¤Æ¤¤¤Þ¤¹"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "»ÈÍѤǤ­¤Ê¤¤¸ø³«¸°¥¢¥ë¥´¥ê¥º¥à¤Ç¤¹"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "¥Õ¥¡¥¤¥ë¤¬Â¸ºß¤·¤Æ¤¤¤Þ¤¹"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "¼å¤¤¸°¤Ç¤¹"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "̵¸ú¤Ê»ØÄê¤Ç¤¹"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI¤¬ÉÔÀµ¤Ç¤¹"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "¤½¤ÎURI¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "¥Í¥Ã¥È¥ï¡¼¥¯¡¦¥¨¥é¡¼"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "°Å¹æ²½¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "̤½èÍý"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "»ÈÍѤǤ­¤Ê¤¤¸ø³«¸°¤Ç¤¹"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "»ÈÍѤǤ­¤Ê¤¤ÈëÌ©¸°¤Ç¤¹"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "¸°¥µ¡¼¥Ð¡¼¤Î¥¨¥é¡¼"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "¥­¥ã¥ó¥»¥ë"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "¥«¡¼¥É¤¬¤¢¤ê¤Þ¤»¤ó"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "½ð̾¤µ¤ì¤¿¥Ç¡¼¥¿¤¬¤¢¤ê¤Þ¤»¤ó\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "¥¨¥é¡¼: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "·Ù¹ð: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... ¥Ð¥°¤Ç¤¹ (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "¥Ð¥°¤òȯ¸« ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "yes"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okay|okay"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancel|cancel"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "·Ù¹ð: ·õÆݤʥá¥â¥ê¡¼¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "¾ÜºÙ¤Ïhttp://www.gnupg.org/faq.html¤ò¤´Í÷¤¯¤À¤µ¤¤\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "½é´ü²½ºÑ¤ß¤Î°ÂÁ´¤Ê¥á¥â¥ê¡¼¤¬¤Ê¤¤¾ì¹ç¤Ë¤ÏÁàºî¤Ç¤­¤Þ¤»¤ó\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(¤³¤ÎÌÜŪ¤Ë¤Ï¸í¤Ã¤¿¥×¥í¥°¥é¥à¤ò»È¤Ã¤¿¤Î¤Ç¤·¤ç¤¦)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA¤Ç¤Ï160¥Ó¥Ã¥È¤Î¥Ï¥Ã¥·¥å¡¦¥¢¥ë¥´¥ê¥º¥à¤Î»ÈÍѤ¬É¬ÍפǤ¹\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "¾ÜºÙ¤Ï¡¢http://www.gnupg.org/why-not-idea.html¤ò¤´Í÷¤¯¤À¤µ¤¤\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "Ãí¼á̾¤Ë¤Ï°õ»ú²Äǽ¤Êʸ»ú¤«¶õÇò¤Î¤ß¤ò»È¤¤¡¢'='¤Ç½ª¤ï¤é¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "¥æ¡¼¥¶¡¼Ãí¼á̾¤Ï¡¢'@'ʸ»ú¤ò´Þ¤Þ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "¥æ¡¼¥¶¡¼Ãí¼á̾¤Ï¡¢'@'ʸ»ú¤ò´Þ¤Þ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "Ãí¼á̾¤ÎÃͤËÀ©¸æʸ»ú¤ò»È¤Ã¤Æ¤Ï¤¤¤±¤Þ¤»¤ó\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "·Ù¹ð: Ìµ¸ú¤ÊÃí¼á¥Ç¡¼¥¿¤òȯ¸«\n"
+
+#~ msgid "not human readable"
+#~ msgstr "¿Í¤Ë¤ÏÆɤá¤Þ¤»¤ó"
+
+#~ msgid "expired: %s)"
+#~ msgstr "Ëþλ: %s)"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "¸°%s: Í½´ü¤»¤Ì½ð̾¥¯¥é¥¹ (0x%02X) - ¤È¤Ð¤·¤Þ¤¹\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "¡Ö%s¡×¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "¥æ¡¼¥¶¡¼ID¡È%s¡É¤Ï¡¢¤â¤¦¼º¸ú¤µ¤ì¤Æ¤¤¤Þ¤¹\n"
+
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "ÄÌÈ֤μèÆÀ¥¨¥é¡¼: %s\n"
+
+#~ msgid "length of RSA modulus is not %d\n"
+#~ msgstr "RSA¤ÎË¡(modulus)¤ÎŤµ¤¬%d¤Ç¤¢¤ê¤Þ¤»¤ó\n"
+
+#~ msgid "length of an RSA prime is not %d\n"
+#~ msgstr "RSA¤ÎÁÇ¿ô¤¬%d¤Ç¤¢¤ê¤Þ¤»¤ó\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "ÉÔÀµ¤Ê¥Ñ¥¹¥Õ¥ì¡¼¥º¤Þ¤¿¤Ï̤ÃΤΰŹ楢¥ë¥´¥ê¥º¥à¤Ç¤¹(%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "¥¨¡¼¥¸¥§¥ó¥È¤Î¥¯¥é¥¤¥¢¥ó¥Èpid¤òÀßÄê¤Ç¤­¤Þ¤»¤ó\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "¥¨¡¼¥¸¥§¥ó¥ÈÍѤΥµ¡¼¥Ð¡¼ÆɽФ·FD¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "¥¨¡¼¥¸¥§¥ó¥ÈÍѤΥµ¡¼¥Ð¡¼½ñ¹þ¤ßFD¤ò¼èÆÀ¤Ç¤­¤Þ¤»¤ó\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "gpg-agent¤È¤ÎÄÌ¿®¾ã³²\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "¥Ñ¥¹¥Õ¥ì¡¼¥º¤¬Ä¹¤¹¤®¤Þ¤¹\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "¥¨¡¼¥¸¥§¥ó¥È¤«¤é¤Î̵¸ú¤Ê±þÅú\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "¥¨¡¼¥¸¥§¥ó¥È¤Ë¾ã³²: ¥¨¡¼¥¸¥§¥ó¥È¤¬0x%lx¤òÊÖµÑ\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "Éû¸°N¤ÎÁªÂò"
+
+#~ msgid "list signatures"
+#~ msgstr "½ð̾¤Î°ìÍ÷"
+
+#~ msgid "sign the key"
+#~ msgstr "¸°¤Ø½ð̾"
+
+#~ msgid "add a secondary key"
+#~ msgstr "Éû¸°¤ÎÄɲÃ"
+
+#~ msgid "delete signatures"
+#~ msgstr "½ð̾¤Îºï½ü"
+
+#~ msgid "change the expire date"
+#~ msgstr "ËþλÆü¤ÎÊѹ¹"
+
+#~ msgid "set preference list"
+#~ msgstr "Áª¹¥¤Î°ìÍ÷¤òÀßÄê"
+
+#~ msgid "updated preferences"
+#~ msgstr "Áª¹¥¤Î°ìÍ÷¤ò¹¹¿·"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "%dÈÖ¤ÎÉû¸°¤Ï¤¢¤ê¤Þ¤»¤ó\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key ¥æ¡¼¥¶¡¼id"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key ¥æ¡¼¥¶¡¼id"
+
+#~ msgid "make a trust signature"
+#~ msgstr "¿®Íѽð̾¤òºîÀ®"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "¼º¸ú¤Ç¤­¤Ê¤¤¤è¤¦¸°¤Ø½ð̾"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "¼º¸ú¤Ç¤­¤Ê¤¤¤è¤¦¸°¤ØÆâÉôŪ¤Ë½ð̾"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "admin"
+#~ msgstr "admin"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#~ msgid "name"
+#~ msgstr "name"
+
+#~ msgid "url"
+#~ msgstr "url"
+
+#~ msgid "fetch"
+#~ msgstr "fetch"
+
+#~ msgid "login"
+#~ msgstr "login"
+
+#~ msgid "lang"
+#~ msgstr "lang"
+
+#~ msgid "sex"
+#~ msgstr "sex"
+
+#~ msgid "cafpr"
+#~ msgstr "cafpr"
+
+#~ msgid "forcesig"
+#~ msgstr "forcesig"
+
+#~ msgid "generate"
+#~ msgstr "generate"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "tsign"
+#~ msgstr "tsign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#~ msgid "addcardkey"
+#~ msgstr "addcardkey"
+
+#~ msgid "keytocard"
+#~ msgstr "keytocard"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#~ msgid "keyserver"
+#~ msgstr "keyserver"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "Í×Ì󥢥르¥ê¥º¥à¡Ö%s¡×¤Ï¡¢¤³¤ÎÈǤÀ¤ÈÆɽФ·¤À¤±¤Ç¤¹\n"
+
+#~ msgid "[%8.8s] "
+#~ msgstr "[%8.8s] "
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "¿·¤·¤¤%s¸°ÂФòÀ¸À®¤·¤Þ¤¹¡£\n"
+#~ "        ºÇû¤Î¸°Ä¹¤Ï  768 ¥Ó¥Ã¥È\n"
+#~ "        ´ûÄê¤Î¸°Ä¹¤Ï 1024 ¥Ó¥Ã¥È\n"
+#~ "    ºÇĹ¤Î¿ä¾©¸°Ä¹¤Ï 2048 ¥Ó¥Ã¥È\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA¤Î¸°Ä¹¤Ï512¤«¤é1024¤Þ¤Ç¤Ç¤¹\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "¸°Ä¹¤¬¾®¤µ¤¹¤®¤Þ¤¹¡£RSA¤ÏºÇ¾®¤Ç¤â1024¤Ç¤¹¡£\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "¸°Ä¹¤¬¾®¤µ¤¹¤®¤Þ¤¹¡£ºÇ¾®¤Ç¤â768¤Ç¤¹¡£\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "¸°Ä¹¤¬Â礭¤¹¤®¤Þ¤¹¡£%d¤¬ºÇÂç¤Ç¤¹¡£\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "2048¤è¤êÂ礭¤Ê¸°Ä¹¤Ï¡¢·×»»»þ´Ö¤¬ Èó¾ï¤Ë Ä¹¤¯¤Ê¤ë¤Î¤Ç\n"
+#~ "¿ä¾©¤·¤Þ¤»¤ó!\n"
+
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "¤³¤Î¸°Ä¹¤ÇËÜÅö¤Ë¤è¤¤¤Ç¤¹¤«? (y/N) "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "¤ï¤«¤ê¤Þ¤·¤¿¡£¤·¤«¤·¡¢¤¢¤Ê¤¿¤Î¥â¥Ë¥¿¡¼¤ä¥­¡¼¥Ü¡¼¥Éíռͤϡ¢\n"
+#~ "¹¶·â¤Ë¤¿¤¤¤·¤ÆÀȼå¤Ç¤¢¤ë¤³¤È¤òǰƬ¤Ë¤ª¤¤¤Æ¤¯¤À¤µ¤¤!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "¼Â¸³Ãæ¤Î¥¢¥ë¥´¥ê¥º¥à¤Ï»ÈÍѤ¹¤Ù¤­¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "¤³¤Î°Å¹æ¥¢¥ë¥´¥ê¥º¥à¤Ï¡¢ÌäÂê»ë¤µ¤ì¤Æ¤¤¤Þ¤¹¡£\n"
+#~ "¤â¤Ã¤Èɸ½àŪ¤Ê¥¢¥ë¥´¥ê¥º¥à¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤!\n"
diff --git a/po/nb.gmo b/po/nb.gmo
new file mode 100644 (file)
index 0000000..bebd8c1
Binary files /dev/null and b/po/nb.gmo differ
diff --git a/po/nb.po b/po/nb.po
new file mode 100644 (file)
index 0000000..05f4409
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,6113 @@
+# Norwegian translation (bokmål dialect) of GnuPG.
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# This file is distributed under the same license as the GnuPG package.
+# Trond Endrestøl <Trond.Endrestol@fagskolen.gjovik.no>, 2004.
+#
+# Send this file to:
+# translations@gnupg.org
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.3\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2006-06-13 20:31+0200\n"
+"Last-Translator: Trond Endrestøl <Trond.Endrestol@fagskolen.gjovik.no>\n"
+"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "kan ikke generere et primtall med pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "kan ikke generere et primtall med mindre enn %d bit\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "ingen entropy-innsamlingsmodul ble oppdaget\n"
+
+#: cipher/random.c:403
+#, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "kan ikke låse «%s»: %s\n"
+
+#: cipher/random.c:408
+#, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "venter på låsing av «%s» ...\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "kan ikke åpne «%s»: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "kan ikke stat() «%s»: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "«%s» er ikke en vanlig fil - ignorert\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "merk: random_seed-fila er tom\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "ADVARSEL: ugyldig størrelse på random_seed-fila - ikke brukt\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "kan ikke lese «%s»: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "merk: random_seed-fila ble ikke oppdatert\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "kan ikke opprette «%s»: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "kan ikke skrive «%s»: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "kan ikke lukke «%s»: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "ADVARSEL: bruke usikker tilfeldig-tall-generator!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Denne tilfeldig-tall-generatoren er bare en omvei for å få programmet\n"
+"til å kjøre - den er på ingen måte en sterk RNG!\n"
+"\n"
+"IKKE BRUK NOE DATA GENERERT AV DETTE PROGRAMMET!!\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Vennligst vent, entropy blir innsamlet.  Gjør noe arbeid dersom det\n"
+"hindrer deg fra å kjede deg, fordi arbeidet vil forbedre kvaliteten på\n"
+"entropyen.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Ikke nok tilfeldige byter tilgjengelig.  Vennligst gjør noe annet\n"
+"arbeid for å gi operativsystemet en sjanse til å samle mer entropy!\n"
+"(Trenger %d flere byter)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "klarte ikke å lagre fingeravtrykket: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "klarte ikke å lagre opprettelsesdatoen: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "lesing av offentlig nøkkel mislyktes: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "respons inneholder ikke data om offentlig nøkkel\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "respons inneholder ikke RSA-modulus\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "respons inneholder ikke den offentlige RSA-eksponenten\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN-callback returnerte en feil: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN for CHV%d er for kort; minum lengde er %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "bekreftelse av CHV%d mislyktes: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "tilgang til admin-kommandoer er ikke konfigurert\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "feil ved henting av CHV-status fra kort\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "kort er permanent låst!\n"
+
+#: g10/app-openpgp.c:1336
+#, 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"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Admin PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Ny Admin PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Ny PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "feil ved henting av ny PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "feil ved lesing av applikasjonsdata\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "feil ved lesing av fingeravtrykk DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "nøkkel finnes allerede\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "eksisterende nøkkel vil bli erstattet\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "generere en ny nøkkel\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "tidsstempel for opprettelse mangler\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "RSA-modulus mangler eller har ikke en størrelse på %d bits\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "offentlig RSA-eksponent mangler eller er større enn %d bits\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "RSA-primtall %s mangler eller har ikke en størrelse på %d bits\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "klarte ikke å lagre nøkkelen: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "vennligst vent mens nøkkel blir generert ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "nøkkelgenerering mislyktes\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "nøkkelgenerering fullført (%d sekunder)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "ugyldig struktur i OpenPGP-kort (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "kortet støtter ikke digestalgoritme %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "signaturer opprettet så langt: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Vennligst tast inn PIN%%0A[signaturer utført: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr "bekrefting av Admin PIN er foreløpig nektet gjennom denne kommandoen\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "kan ikke aksere %s - ugyldig OpenPGP-kort?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armor: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "ugyldig armorheader: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "armorheader: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "ugyldig clearsigheader\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "nøstede klartekstsignaturer\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "uforventet armering:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "ugyldig bindestrekbeskyttet linje: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "hoppet over ugyldig radix64-tegn %02x\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "for tidlig eof (ingen CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "for tidlig eof (i CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "misdannet CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC-feil; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "for tidlig eof (i trailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "feil i trailerlinje\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "ingen gyldig OpenPGP-data funnet.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "ugyldig armor: linje lengre enn %d tegn\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"quoted printable-tegn i armor - antakelig har en MTA med feil blitt brukt\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP-kort er ikke tilgjengelig: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "OpenPGP-kortnummer %s oppdaget\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "kan ikke gjøre dette i batchmodus\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Ditt valg? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[ikke satt]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "mann"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "dame"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "uspesifisert"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "ikke tvunget"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "tvunget"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Feil: Bare ren ASCII er foreløpig tillatt.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Feil: Tegnet «<» kan ikke brukes.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Feil: Doble mellomrom er ikke tillatt.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Kortholders etternavn: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Kortholders fornavn: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Feil: Det kombinerte navnet er for langt (grensa går ved %d tegn).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL for å hente offentlig nøkkel: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Feil: URL er for lang (grensa går ved %d tegn).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "feil ved lesing av «%s»: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Logindata (kontonavn): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Feil: Logindata er for langt (grensa går ved %d tegn).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Privat DO-data: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Feil: Privat DO for lang (grensa går ved %d tegn).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Språkpreferanser:"
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Feil: ugyldig lengde på preferansestrengen.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Feil: ugyldig tegn i preferansestrengen.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Kjønn ((M)ale, (F)emale eller mellomrom): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Feil: ugyldig respons.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA-fingeravtrykk: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Feil: ugyldig formattert fingeravtrykk.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "nøkkeloperasjonen er umulig: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "ikke et OpenPGP-kort"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "feil ved henting av nåværende nøkkelinfo: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Erstatte eksisterende nøkkel? (j/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Lage sikkerhetskopi av krypteringsnøkler utenfor kortet? (J/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Erstatte eksisterende nøkler? (j/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Vær obs på at fabrikkinnstilingene for PIN-kodene er\n"
+"   PIN = «%s»     Admin PIN = «%s»\n"
+"Du bør endre dem med kommandoen --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Vennligst velg hvilken type nøkkel du vil generere:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Signaturnøkkel\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Krypteringsnøkkel\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Autentiseringsnøkkel\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Ugyldig valg.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Vennligst velg hvor nøkkelen skal lagres:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "ukjent nøkkelbeskyttelsesalgoritme\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "hemmelige deler av nøkkelen er ikke tilgjengelig.\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "hemmelig nøkkel er allerede lagret på et kort\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "avslutte denne menyen"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "vise admin-kommandoer"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "vise denne hjelpen"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "vis alle tilgjengelige data"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "endre kortholders navn"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "endre URL for å hente nøkkel"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "hente nøkkelen angitt i URL som er lagret i kortet"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "endre loginnavnet"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "endre språkpreferansene"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "endre kortholders kjønn"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "vise et CA-fingeravtrykk"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "veksle tving-signatur-PIN-flagget"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "generere nye nøkler"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "meny for å endre eller fjerne blokkering av PIN"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "bekrefte PIN og vise alle data"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Kommando> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Admin-reservert kommando\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Admin-kommandoer er tillatt\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Admin-kommandoer er ikke tillatt\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Ugyldig kommando  (prøv «help»)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "hemmelig nøkkel er ikke tilgjengelig"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+"Vennligst sett inn kortet og trykk på enter eller tast inn «c» for å "
+"avbryte: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "sleting av nøkkelblokk mislyktes: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Vennligst fjern det nåværende kortet og sett inn kortet med serienummeret:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Trykk på enter når du er klar eller tast «c» for å avbryte: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Tast inn ny Admin-PIN: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Tast inn ny PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Tast inn Admin-PIN: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Tast inn PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Gjenta denne PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN ble ikke gjentatt korrekt; prøv igjen"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "kan ikke åpne «%s»\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output virker ikke for denne kommandoen\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "nøkkelen «%s» ble ikke funnet: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "feil ved lesing av nøkkelblokk: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(med mindre du angir nøkkelen ved hjelp av fingeravtrykk)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "kan ikke gjøre dette i batchmode uten «--yes»\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Slette denne nøkkelen fra nøkkelknippet? (j/N)"
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Dette er en hemmelig nøkkel! - virkelig slette den? (j/N)"
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "sleting av nøkkelblokk mislyktes: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "nullstilt informasjon om eiertillit\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "det finnes en hemmelig nøkkel for offentlig nøkkel «%s»!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "bruk valget «--delete-secret-keys» for å slette den først.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "feil ved opprettelse av passfrase: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "kan ikke bruke en symmetrisk ESK-pakke på grunn av S2K-modusen\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "bruker cipher %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "«%s» er allerede komprimert\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "ADVARSEL: «%s» er en tom fil\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"du kan bare kryptere med RSA-nøkler med lengder på 2048 bits eller mindre i "
+"--pgp2-modus\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "leser fra «%s»\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"klarte ikke å bruke IDEA-algoritmen for alle nøklene du krypterer til.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"ADVARSEL: påtvinging av symmetrisk cipher %s (%d) bryter med mottakerens "
+"preferanser\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"ADVARSEL: tvang av kompresjonsalgoritme %s (%d) bryter med mottakerens "
+"preferanser\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"påtvinging av symmetrisk cipher %s (%d) bryter med mottakerens preferanser\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "du kan ikke bruke %s i %s modus\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s kryptert for: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s krypterte data\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "kryptert med en ukjent algoritme %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ADVARSEL: meldingen er kryptert med en svak nøkkel for den symmetriske "
+"cipher.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problem ved håndtering av kryptert pakke\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "fjernutføring av programmer er ikke støttet\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "kan ikke opprette katalogen «%s»: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"eksterne programkall er utkoblet på grunn av utrygge rettigheter på "
+"konfigurasjonsfila\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"denne plattformen krever midlertidige filer ved kall på eksterne programmer\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "kunne ikke utføre program «%s»: %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "kunne ikke utføre skallet «%s»: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "systemfeil under kall på eksternt program: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "unaturlig avslutning av eksternt program\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "klarte ikke å kjøre eksternt program\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "klarte ikke å lese reponsen fra eksternt program: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "ADVARSEL: klarte ikke å fjerne midlertidig fil (%s) «%s»: %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "ADVARSEL: klarte ikke å fjerne midlertidig katalog «%s»: %s\n"
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr "eksportere signaturer som er markert som bare-lokale"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr ""
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr ""
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "eksportering av hemmelige nøkler er ikke tillatt\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "nøkkel %s: ikke beskyttet - hoppet over\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "nøkkel %s: PGP 2.x-aktig nøkkel - hoppet over\n"
+
+#: g10/export.c:373
+#, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "nøkkel %s: nøkkelmateriell på kort - hoppet over\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "klarte ikke å fjerne beskyttelsen på undernøkkelen: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "ADVARSEL: hemmelig nøkkel %s har ikke en enkel SK-sjekksum\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ADVARSEL: ingenting eksportert\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Kommandoer:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fil]|lage en signatur"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fil]|lage en klartekstsignatur"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "lage en adskilt signatur"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "kryptere data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "kryptering med bare symmetrisk cipher"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "dekryptere data (standard)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "bekrefte en signatur"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "liste nøkler"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "liste nøkler og signaturer"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "vise og sjekke nøkkelsignaturer"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "liste nøkler og fingeravtrykk"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "liste hemmelige nøkler"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "generere et nytt nøkkelpar"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "fjerne nøkler fra det offentlige nøkkelknippet"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "fjerne nøkler fra det hemmelige nøkkelknippet"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "signere en nøkkel"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "signere en nøkkel lokalt"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "signere eller redigere en nøkkel"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "generere et opphevingssertifikat"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "eksportere nøkler"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "eksportere nøkler til en nøkkelserver"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importere nøkler fra en nøkkelserver"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "søke etter nøkler på en nøkkelserver"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "oppdatere alle nøklene fra en nøkkelserver"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importere/flette nøkler"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "vis kortets status"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "endre data på et kort"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "endre PIN på et kort"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "oppdatere tillitsdatabasen"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [filer]|skrive meldingsdigester"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Valg:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "lage ASCII-beskyttet output"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAVN|kryptere for NAVN"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "bruke denne brukeriden for signering eller dekryptering"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|sette kompresjonsnivå til N (0 slår av kompresjon)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "bruk kanonisk tekstmodus"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "bruk som outputfil"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "fyldig output"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "ikke gjør noen endringer"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "spør før overskriving"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "bruk streng OpenPGP-oppførsel"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "generere PGP 2.x-kompatible meldinger"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Se mansiden for en komplett liste over alle kommandoene og valgene)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Eksempler:\n"
+"\n"
+" -se -r Bob [fil]           signere og kryptere for brukeren Bob\n"
+" --clearsign [fil]          lage en klartekstsignatur\n"
+" --detach-sign [fil]        lage en adskilt signatur\n"
+" --list-keys [navn]         vise nøkler\n"
+" --fingerprint [navn]       vise fingeravtrykk\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Vennligst rapporter feil til <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Bruksmåte: gpg [valg] [filer] (-h for hjelp)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Bruksmåte: gpg [valg] [filer]\n"
+"signere, sjekke, kryptere eller dekryptere\n"
+"standard operasjon avhenger av inputdata\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Støttede algoritmer:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Offentlig nøkkel: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cipher: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Kompresjon: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "bruksmåte: gpg [valg] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "motstridende kommandoer\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "fant ingen «=»-tegn i gruppedefinisjonen «%s»\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "ADVARSEL: utrygt eierskap på hjemmekatalogen «%s»\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "ADVARSEL: utrygt eierskap på konfigurasjonsfilen «%s»\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "ADVARSEL: utrygt eierskap på utvidelsen «%s»\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "ADVARSEL: utrygge rettigheter på hjemmekatalogen «%s»\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "ADVARSEL: utrygge rettigheter på konfigurasjonsfilen «%s»\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "ADVARSEL: utrygge rettigheter på utvidelsen «%s»\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"ADVARSEL: utrygt eierskap på katalogene på nivåene over hjemmekatalogen «%"
+"s»\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"ADVARSEL: utrygt eierskap på katalogene på nivåene over konfigurasjonsfilen "
+"«%s»\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"ADVARSEL: utrygt eierskap på katalogene på nivåene over utvidelsen «%s»\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"ADVARSEL: utrygge rettigheter på katalogene på nivåene over hjemmekatalogen "
+"«%s»\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"ADVARSEL: utrygge rettigheter på katalogene på nivåene over "
+"konfigurasjonsfilen «%s»\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"ADVARSEL: utrygge rettigheter på katalogene på nivåene over utvidelsen «%s»\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "ukjent konfigurasjonspunkt «%s»\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr "vise navnet til nøkkelknippene i nøkkellister"
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "MERK: den gamle valgfila «%s» ble ignorert\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "MERK: ingen standard valgfil «%s»\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "valgfil «%s»: %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "leser valg fra «%s»\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "MERK: %s er ikke for vanlig bruk!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "cipherutvidelse «%s» ble ikke lastet på grunn av utrygge rettigheter\n"
+
+# Tenk litt på denne du, Trond.
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "«%s» er ikke en gyldig signaturutgåelse\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "«%s» er ikke et gyldig tegnsett\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "kunne ikke parse nøkkelserverens URL\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: ugyldige valg for nøkkelserver\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "ugyldige valg for nøkkelserver\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: ugyldige importvalg\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "ugyldige importvalg\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: ugyldige eksportvalg\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "ugyldige eksportvalg\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: ugyldige listevalg\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "ugyldige listevalg\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+msgid "show all notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2582
+msgid "show user ID validity during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: ugyldige valg for bekreftelse\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "ugyldige valg for bekreftelse\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "kunne ikke sette exec-path til %s\n"
+
+#: g10/gpg.c:2768
+#, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: ugyldig auto-key-locate-liste\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "ADVARSEL: programmet kan opprette en corefil!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "ADVARSEL: %s overstyrere %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s er ikke tillatt sammen med %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s er ikke fornuftig med %s!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr ""
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "du kan bare lage adskilte eller klare signaturer i --pgp2-modus\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "du kan ikke signere og kryptere samtidig i --pgp2-modus\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "du må bruke filer (og ikke en pipe) når --pgp2 er påslått\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "kryptering en melding i --pgp2-modus krever IDEA-algoritmen\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "valgt krypteringsalgoritme er ugyldig\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "valg digestalgoritme er ugyldig\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "valgt kompresjonsalgoritme er ugyldig\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "valgt sertifikasjondigestalgoritme er ugyldig\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed må være større enn 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-neede må være større enn 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth må være i intervallet fra 1 til 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "ugyldig default-cert-level; må være 0, 1, 2 eller 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "ugyldig min-cert-level; må være 0, 1, 2 eller 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "MERK: enkel S2K-modus (0) er sterkt frarådet\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "ugyldig S2K-modus; må være 0, 1 eller 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "ugyldig standard preferanser\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "ugyldig personlig cipherpreferanser\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "ugyldig personlig digestpreferanser\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "ugyldig personlig kompresjonspreferanser\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s virker ikke ennå med %s\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "du kan ikke bruke cipheralgoritmen «%s» i %s-modus\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "du kan ikke bruke digestalgoritmen «%s» i %s-modus\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "du kan ikke bruke kompresjonsalgoritmen «%s» i %s-modus\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "klarte ikke å initialisere tillitsdatabasen: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"ADVARSEL: mottakere (-r) angitt uten å bruke offentlig nøkkelkryptering\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [filnavn]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [filnavn]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "symmetrisk kryptering av «%s» mislyktes: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [filnavn]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [filnavn]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "du kan ikke bruke --symmtric --encrypt i %s-modus\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [filnavn]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [filnavn]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [filnavn]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "du kan ikke bruke --symmetric --sign --encrypt i %s-modus\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [filnavn]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [filnavn]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [filnavn]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key brukerid"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key brukerid"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key brukerid [kommandoer]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [brukerid] [nøkkelknippe]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "sending til nøkkelserver mislyktes: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "mottak fra nøkkelserver mislyktes: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "nøkkeleksport mislyktes: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "søk på nøkkelserver mislyktes: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "refresh på nøkkelserver mislyktes: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "dearmoring failed: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "enarmoring failed: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "ugyldig hashalgoritme «%s»\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[filnavn]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Sett i gang og tast inn meldingen din ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "den angitte URLen for sertifikasjonspolicyen er ugyldig\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "den angitte URLen for signaturpolicy er ugyldig\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "den angitte URLen for den foretrukkede nøkkelserveren er ugyldig\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "for mange innslag i pk-cachen - utkoblet\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[Brukerid ikke funnet]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "ingen hemmelig undernøkkel for offentlig undernøkkel %s - ignorerer\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "bruker undernøkkel %s i stedet for primærnøkkel %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "nøkkel %s: hemmelig nøkkel uten offentlig nøkkel - hoppet over\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "være noenlunde stille"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "hent nøklene fra dette nøkkelknippet"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "la konflikter mellom tidsstempler bare være en advarsel"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|skrive statusinfo til denne FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Bruksmåte: gpgv [valg] [filer] (-h for hjelp)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Bruksmåte: gpgv [valg] [filer]\n"
+"Sjekke signaturer mot kjente betrodde nøkler\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr ""
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr ""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr ""
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr ""
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Når du signerer en brukerid på en nøkkel, bør du først bekrefte at\n"
+"nøkkelen tilhører den personen som er angitt i brukeriden.  Det er\n"
+"nyttig for andre å vite hvor nøyaktig du bekreftet dette.\n"
+"\n"
+"\"0\" betyr at du forteller hvor nøye du bekreftet nøkkelen.\n"
+"\n"
+"\"1\" betyr at du tror at nøkkelen eies av den personen som påstår å eie\n"
+"    nøkkelen, men du kunne ikke eller bekreftet ikke nøkkelen i det hele\n"
+"    tatt.  Dette er nyttig for en identitetskontroll hvor du signerer\n"
+"    nøkkelen til et pseudonym.\n"
+"\n"
+"\"2\" betyr at du gjorde en vanlig bekreftelse av nøkkelen.  For eksempel,\n"
+"    dette kunne bety at du bekreftet nøkkelens fingeravtrykk og sjekket\n"
+"    brukeriden mot et fotografisk id.\n"
+"\n"
+"\"3\" betyr at du gjorde en utfyllende bekreftelse av nøkkelen.  For\n"
+"    eksempel, dette kunne bety at du og eieren av nøkkelen bekreftet\n"
+"    personlig nøkkelens fingeravtrykk og at du sjekket ved hjelp av et\n"
+"    dokument med fotografi som er vanskelig å forfalske at navnet på\n"
+"    nøkkeleieren stemmer med navnet i brukeriden til nøkkelen og til slutt\n"
+"    at du bekreftet at epostadressen i nøkkelen tilhører nøkkelens eier.\n"
+"\n"
+"Vær obs på at eksemplene gitt over for nivåene 2 og 3 *bare* er\n"
+"eksempler.  Alt i alt er det opp til deg å bestemme hva «vanlig» og\n"
+"«utfyllende» betyr når du signerer andres nøkler.\n"
+"\n"
+"Svar «0» dersom du ikke vet hva det riktige svaret er."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr ""
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr ""
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr ""
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr ""
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr ""
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr ""
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+msgid "do not update the trustdb after import"
+msgstr "ikke oppdatér tillitsdatabasen etter import"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr ""
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+msgid "remove unusable parts from key after import"
+msgstr ""
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "hopper over blokk av typen %d\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu nøkler behandlet hittil\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Totalt antall behandlet: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "nye nøkler som ble hoppet over: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "               uten brukerider: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                     importert: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                       uendret: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "                nye brukerider: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "               nye undernøkler: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "                nye signaturer: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "         nye nøkkelopphevinger: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "        leste hemmelige nøkler: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "   importerte hemmelige nøkler: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "  uforandrede hemmelige nøkler: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "                ikke importert: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "         oppryddete signaturer: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "         oppryddete brukerider: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "                nye brukerider: %lu\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         «%s» preferanse for digestalgoritme %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "nøkkel %s: ingen brukerid\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "nøkkel %s: PKS-undernøkkel reparert\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "nøkkel %s: akseptert ikke-selvsignert brukerid «%s»\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "nøkkel %s: ingen gyldig brukerid\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "dette kan skyldes en manglende selvsignatur\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "nøkkel %s: offentlig nøkkel ikke funnet: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "nøkkel %s: ny nøkkel - hoppet over\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "ingen skrivbart nøkkelknippe funnet: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "skriver til «%s»\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "feil ved skriving av nøkkelknippet «%s»: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "nøkkel %s: offentlig nøkkel «%s» importert\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "nøkkel %s: stemmer ikke med vår kopi\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "nøkkel %s: kan ikke finne original nøkkelblokk: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "nøkkel %s: kan ikke lese original nøkkelblokk: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "nøkkel %s: «%s» 1 ny brukerid\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "nøkkel %s: «%s» %d nye brukerider\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "nøkkel %s: «%s» 1 ny signatur\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "nøkkel %s: «%s» 1 ny undernøkkel\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "nøkkel %s: «%s» %d nye undernøkler\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "nøkkel %s: «%s» %d nye brukerider\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "nøkkel %s: «%s» %d nye brukerider\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "nøkkel %s: «%s» ikke endret\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "nøkkel %s: hemmelig nøkkel med ugyldig cipher %d - hoppet over\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "import av hemmelig nøkkel er ikke tillatt\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "ingen standard hemmelig nøkkelknippe: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "nøkkel %s: hemmelig nøkkel importert\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "nøkkel %s: finnes allerede i hemmelig nøkkelknippe\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "nøkkel %s: hemmelig nøkkel ikke funnet: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"nøkkel %s: ingen offentlig nøkkel - kan ikke anvende opphevingssertifikat\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "nøkkel %s: ugyldig opphevingssertifikat: %s - avvist\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "nøkkel %s: «%s» opphevingssertifikat importert\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "nøkkel %s: ingen brukerid for signatur\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "nøkkel %s: ustøttet offentlig nøkkelalgoritme for brukerid «%s»\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "nøkkel %s: ugyldig selvsignatur for brukerid «%s»\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "nøkkel %s: ingen undernøkkel for nøkkelbinding\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "nøkkel %s: ustøttet offentlig nøkkelalgoritme\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "nøkkel %s: ugyldig undernøkkelbinding\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "nøkkel %s: fjernet flere undernøkkelbindinger\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "nøkkel %s: ingen undernøkkel for nøkkeloppheving\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "nøkkel %s: ugyldig undernøkkeloppheving\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "nøkkel %s: fjernet flere undernøkkelopphevinger\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "nøkkel %s: hoppet over brukerid «%s»\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "nøkkel %s: hoppet over undernøkkel\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "nøkkel %s: ikke-eksporterbar signatur (klasse 0x%02X) - hoppet over\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "nøkkel %s: opphevingssertifikat på feil plass - hoppet over\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "nøkkel %s: ugyldig opphevingssertifikat: %s - hoppet over\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "nøkkel %s: undernøkkelsignatur på feil plass - hoppet over\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "nøkkel %s: uforventet signaturklasse (0x%02X) - hoppet over\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "nøkkel %s: duplikert brukerid oppdaget - flettet sammen\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "ADVARSEL: nøkkel %s kan være opphevet: henter opphevingsnøkkel %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"ADVARSEL: nøkkel %s kan være opphevet: opphevingsnøkkel %s ikke tilstede.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "nøkkel %s: «%s» opphevingssertifikat lagt til\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "nøkkel %s: direkte nøkkelsignatur lagt til\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr ""
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr ""
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr ""
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "feil ved opprettelse av nøkkelknippet «%s»: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "nøkkelknippet «%s» ble opprettet\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "nøkkelblokkressurs «%s»: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr ""
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[oppheving]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[selvsignatur]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 ubrukelig signatur\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d ubrukelige signaturer\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+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"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, 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"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 signatur ble ikke sjekket på grunn av en feil\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signaturer ble ikke sjekket på grunn av feil\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 brukerid uten gyldig selvsignatur ble oppdaget\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d brukerider uten gyldige selvsignaturer ble oppdaget\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Vennligst bestem hvor mye du tiltror denne brukeren korrekt å bekrefte\n"
+"andre brukeres nøkler (ved å se på pass, sjekke fingeravtrykk fra\n"
+"forskjellige kilder, osv.)\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = Jeg stoler marginalt\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = Jeg stoler fullt\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Brukerid «%s» er opphevet."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Er du fortsatt sikker på at du vil signerere den? (j/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Kunne ikke signere.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Brukerid «%s» er utgått."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Brukeriden «%s» er ikke selvsignert."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Brukeriden «%s» er signerbar."
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Signere den? (j/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Selvsignaturen på «%s»\n"
+"er en PGP 2.x-aktig signatur.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Vil du forfremme den til en OpenPGP-selvsignatur? (j/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Din nåværende signatur på «%s»\n"
+"er utgått.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Vil du utstede en ny signatur for å erstatte den som er utgått? (j/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Din nåværede signatur på «%s»\n"
+"er en lokal signatur.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Vil du forfremme den til en fullt eksporterbar signatur? (j/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "«%s» var allerede lokalt signert av nøkkelen %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "«%s» var allerede signert av nøkkelen %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Vil du likevel signere den igjen? (j/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Ingenting å signere med nøkkelen %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Denne nøkkelen er utgått!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Denne nøkkelen utgår den %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Vil du at signaturen skal utgå på samme tidspunkt? (J/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Du kan ikke lage en OpenPGP-signatur på en PGP-2.x-nøkkel i --pgp2-modus.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Dette ville gjøre nøkkelen ubrukelig i PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Hvor nøyaktig har du bekreftet at nøkkelen du skal signere faktisk\n"
+"tilhører den overnevnte personen?  Tast inn «0» dersom du ikke vet\n"
+"svaret.\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Jeg vil ikke svare.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Jeg har ikke sjekket i det hele tatt.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Jeg har gjort en vanlig sjekk.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Jeg har sjekket veldig nøye.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Ditt valg? (angi «?» for mer informasjon): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Er du virkelig sikker på at du vil signerere denne nøkkelen med din\n"
+"nøkkel «%s» (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Dette vil være en selvsignatur.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "ADVARSEL: signaturen vil ikke bli markert som ikke-eksporterbar.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "ADVARSEL: signaturen vil ikke bli markert som ikke-opphevbar.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "Signaturen vil bli markert som ikke-eksporterbar.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "Signaturen vil bli markert som ikke-opphevbar.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "Jeg har ikke sjekket denne nøkkelen i det hele tatt.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "Jeg har sjekket denne nøkkelen på vanlig måte.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "Jeg har sjekket denne nøkkelen veldig nøye.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Virkelig signere? (j/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "signering mislyktes: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Denne nøkkelen er ikke beskyttet.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Hemmelige deler av primærnøkkelen er ikke tilgjengelig.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Hemmelige deler av primærnøkkelen er lagret på kort.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Nøkkelen er beskyttet.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Kan ikke redigere denne nøkkelen: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr "Tast inn den nye passfrasen for denne hemmelige nøkklen.\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "passfrasen ble ikke gjentatt korrekt; prøv igjen"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr "Du ønsker ikke en passfrase - dette er sannsynligvis en *dum* idé!\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Vil du virkelig gjøre dette? (j/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "flytter en nøkkelsignatur til den rette plassen\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "lagre og avslutte"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "vise nøkkelens fingeravtrykk"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "liste nøkler og brukerider"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "velger brukerid N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "velger brukerid N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "sjekke signaturer"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "signerere utvalgte brukerider lokalt"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "signere utvalgte brukerider med en tillitssignatur"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "legge til en brukerid"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "legge til en fotoid"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "slette utvalgte brukerider"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "legge til en undernøkkel"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "slette utvalgte undernøkler"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "legge til en opphevingsnøkkel"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "slette signaturene fra de utvalgte brukeridene"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr ""
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "markere den valgte brukeriden som den primære"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "veksle mellom hemmelig og offentlig nøkkellisting"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "liste preferanser (ekspert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "liste preferanser (fyldig)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "sette preferanseliste for de valgte brukeridene"
+
+#: g10/keyedit.c:1428
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "sette URL for foretrukket nøkkelserver for de valgte brukeridene"
+
+#: g10/keyedit.c:1430
+msgid "set a notation for the selected user IDs"
+msgstr "sette en notasjon for de valgte brukeridene"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "endre passfrasen"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "endre eiertilliten"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "oppheve signaturene på de valgte brukeridene"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "oppheve utvalgte brukerider"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "oppheve nøkkel eller utvalgte undernøkler"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "innkoble en nøkkel"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "utkoble en nøkkel"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "vise utvalgte fotoider"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "feil ved lesing av hemmelig nøkkelblokk «%s»: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Hemmelig nøkkel er tilgjengelig\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Trenger den hemmelige nøkkelen for å gjøre dette.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Vennligst bruk kommandoen «toggle» først.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Nøkkelen er opphevet."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Virkelig signerere alle brukerider? (j/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Tips: Velg brukeriden som skal signeres\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Ukjent signaturtype «%s»\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Denne kommandoen er ikke tillatt i %s-modus.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Du må velge minst en brukerid.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Du kan ikke slette den siste brukeriden!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Virkelig fjerne alle valgte brukerider? (j/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Virkelig fjerne denne brukeriden? (j/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Virkelig flytte primærnøkkelen? (j/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Du må velge minst en nøkkel.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Kan ikke åpne «%s»: %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Feil ved lesing av sikkerhetskopiert nøkkel «%s»: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Du må velge minst en nøkkel.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Vil du virkelig slette den valgte nøkkelen? (j/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Vil du virkelig slette denne nøkkelen? (j/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Virkelig oppheve alle de valgte brukeridene? (j/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Virkelig oppheve denne brukeriden? (j/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Vil du virkelig oppheve hele nøkkelen? (j/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Vil du virkelig oppheve de valgte undernøklene? (j/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Vil du virkelig oppheve denne undernøkkelen? (j/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "sette preferanseliste til:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Virkelig oppdatere preferansene for de valgte brukeridene? (j/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Virkelig oppdatere preferansene? (j/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Lagre endringene? (j/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Avslutte uten å lagre? (j/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "oppdatering mislyktes: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "oppdatering av hemmelig mislyktes: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Nøkkelen ble ikke endret, så ingen oppdatering er nødvendig.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Særtrekk: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+msgid "Notations: "
+msgstr "Notasjoner: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Det er ingen preferanser for en PGP 2.x-aktig brukerid.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Denne nøkkelen ble opphevet den %s av %s med nøkkelen %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Denne nøkkelen kan bli opphevet av %s med nøkkelen %s"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(sensitiv)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "opprettet: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "opphevet: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "utgikk: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "utgår: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "bruksmåte: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "tillit: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "gyldighet: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Denne nøkkelen har blitt utkoblet"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "opphevet"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "utgått"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Er du sikker på at du vil legge den til? (j/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Slette denne gode signaturen? (j/N/a)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr ""
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr ""
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Slettet %d signatur.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Slettet %d signaturer.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Ingen ble slettet.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "ugyldig"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "brukerid «%s»: allerede renset\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "nøkkel: %s: «%s» %d nye signaturer\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "brukerid «%s»: allerede renset\n"
+
+#: g10/keyedit.c:3252
+#, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "brukerid «%s»: allerede renset\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr ""
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Er du fortsatt sikker på at du vil gjøre denne nøkkelen til en opphever? (j/"
+"N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr ""
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Vennligst velg minst en undernøkkel.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr ""
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr ""
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr ""
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "Undernøkkel %s er allerede opphevet.\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "hopper over v3 selvsignatur for brukerid «%s»\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Er du sikker på at du vil erstatte den? (j/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Er du sikker på at du vil slette den? (j/N) "
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr ""
+
+#: g10/keyedit.c:4343
+msgid "Proceed? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr ""
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr ""
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr ""
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr ""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr ""
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (ikke-eksporterbar)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Denne signaturen utgikk den %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr ""
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (ikke-opphevbar)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr ""
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr ""
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "ingen hemmelig nøkkel\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "brukerid «%s» er allerede opphevet\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "ADVARSEL: en brukeridsignatur er datert %d sekunder i fremtiden\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Nøkkelen %s er allerede opphevet.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Undernøkkel %s er allerede opphevet.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preferansen %s er duplisert\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "for mange cipher-preferanser\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "for mange digest-preferanser\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "for mange kompresjons-preferanser\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "ugyldig oppføring «%s» i preferansestreng\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "skriver direkte signatur\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "skriver selvsignatur\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "skriver nøkkelbindende signatur\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "nøkkelstørrelsen er ugyldig; bruker %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "nøkkelstørrelsen ble rundet opp til %u bits\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Signere"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr "Bekrefte"
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Kryptere data"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Autentisere"
+
+# S og s for signering
+# K og k for kryptering
+# A og a for autentisering
+# Q og q for avslutte
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsKkAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr ""
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Vennligst velg hvilken type nøkkel du vil ha:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA og ElGamal (standard)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (bare signering)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (sette dine egne muligheter)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (bare kryptering)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (bare signering)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (bare kryptering)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (sette dine egne muligheter)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA-nøkkelpar vil ha %u bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Hvilken nøkkelstørrelse vil du ha? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Ønsket nøkkelstørrelse er %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "rundet opp til %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Vennligst angi hvor lenge nøkkelen skal være gyldig.\n"
+"         0 = nøkkelen utgår ikke\n"
+"      <n>  = nøkkelen utgår om n days\n"
+"      <n>w = nøkkelen utgår om n weeks\n"
+"      <n>m = nøkkelen utgår om n months\n"
+"      <n>y = nøkkelen utgår om n years\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Vennligst angi hvor lenge signaturen skal være gyldig.\n"
+"         0 = signaturen utgår ikke\n"
+"      <n>  = signaturen utgår om n days\n"
+"      <n>w = signaturen utgår om n weeks\n"
+"      <n>m = signaturen utgår om n months\n"
+"      <n>y = signaturen utgår om n years\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Nøkkelen er gyldig for? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Signaturen er gyldig for? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "ugyldig verdi\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Nøkkel utgår ikke i det hele tatt\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Signaturen utgår ikke i det hele tatt\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Nøkkel utgår den %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Signaturen utgår den %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Systemet ditt kan ikke vise datoer etter 2038.\n"
+"Likevel vil det bli håndtert korrekt opp til 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Er dette korrekt (j/N)? "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Du trenger en brukerid for å identifisere nøkkelen din;\n"
+"programvaren konstruerer brukeriden ut fra fullt navn, kommentar og\n"
+"epostadresse til denne formen:\n"
+"    «Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>»\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Fullt navn: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Ugyldig tegn i navn\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Navnet kan ikke starte med et siffer\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Navnet må være minst 5 tegn langt\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Epostadresse: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Ikke en gyldig epostadresse\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Kommentar: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Ugyldig tegn i kommentar\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Du bruker tegnsettet «%s».\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Du valgte denne brukeriden:\n"
+"    «%s»\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Vennligst ikke putt epostadressen inn i fullt navn eller i kommentaren\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnKeEeRrAa"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Endre (N)avn, (K)ommentar, (E)postadresse eller (A)vslutt? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Endre (N)avn, (K)ommentar, (E)postadresse eller (R)iktig/(A)vslutt? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Vennligst korriger feilen først\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Vi trenger å generere ganske mange tilfeldige byter. Det er en god idé\n"
+"å utføre andre oppgaver (skrive på tastaturet, flytte på musa, la\n"
+"diskene jobbe) under primtallgenereringen; dette gir\n"
+"tilfeldig-tall-generatoren en bedre sjanse til å samle nok entropy.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Nøkkelgenereringen ble avbrutt.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "skriver offentlig nøkkel til «%s»\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "skriver foreløpig hemmelig nøkkel til «%s»\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "skriver hemmelig nøkkel til «%s»\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "ingen skrivbart offentlig nøkkelknippe ble funnet: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "ingen skrivbart hemmelig nøkkelknippe ble funnet: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "feil ved skriving av offentlig nøkkelknippe «%s»: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "feil ved skriving av hemmelig nøkkelknippe «%s»: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "offentlig og hemmelig nøkkel opprettet og signert.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Merk at denne nøkkelen ikke kan brukes for kryptering.  Du ønsker\n"
+"kanskje å bruke kommandoen «--edit-key» for å generere en\n"
+"sekundærnøkkel for dette formålet.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Nøkkelgenerering mislyktes: %s\n"
+
+# Er dette entallsformen av denne strengen?
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"nøkkel har blitt opprettet %lu sekund i fremtiden (time warp eller "
+"klokkeproblem)\n"
+
+# Er dette flertallsformen av denne og den forrige strengen?
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"nøkkel har blitt opprettet %lu sekunder i fremtiden (time warp eller "
+"klokkeproblem)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"MERK: opprettelse av undernøkler for v3-nøkler er ikke i samsvar med "
+"OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Virkelig opprette? (j/N)"
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "lagring av nøkkel på kort mislyktes: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "kan ikke opprette sikkerhetskopifil «%s»: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr ""
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr ""
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr ""
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr ""
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr ""
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Nøkkelknippe"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Fingeravtrykk for primærnøkkel:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Fingeravtrykk for undernøkkel:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Fingeravtrykk for primærnøkkel:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Fingeravstrykk for undernøkkel:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr " Nøkkelfingeravtrykk ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Serienummer for kort ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "omdøping fra «%s» til «%s» mislyktes: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "ADVARSEL: 2 filer med konfidensiell informasjon finnes.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr ""
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr ""
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr ""
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "cacher nøkkelknippet «%s»\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu nøkler cachet så langt (%lu signaturer)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu nøkler cachet (%lu signaturer)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr ""
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+msgid "honor the preferred keyserver URL set on the key"
+msgstr ""
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"ADVARSEL: nøkkelserver-valget «%s» er ikke i bruk på denne plattformen\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "utkoblet"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr ""
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "nøkkelen «%s» ble ikke funnet på nøkkelserveren\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "nøkkelen ble ikke funnet på nøkkelserver\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "ber om nøkkelen %s fra %s server %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "ber om nøkkel %s fra %s\n"
+
+#: g10/keyserver.c:1173
+#, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "søke etter navn fra %s server %s\n"
+
+#: g10/keyserver.c:1176
+#, c-format
+msgid "searching for names from %s\n"
+msgstr "søker etter navn fra %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "søke etter «%s» fra %s server %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "søker etter «%s» fra %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "ingen handling for nøkkelserver!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "nøkkelserver sendte ikke VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "nøkkelserver svarte ikke tidsnok\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "intern feil ved nøkkelserver\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "kommunikasjonsfeil med nøkkelserver: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "oppfrisker 1 nøkkel fra %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "oppfrisker %d nøkler fra %s\n"
+
+#: g10/keyserver.c:1955
+#, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "ADVARSEL: klarte ikke å fange URI %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "ADVARSEL: klarte ikke å parse URI %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "merkelig størrelse for en kryptert sesjonsnøkkel (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr ""
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "passfrase er generert med en ukjent digest-algoritme %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "offentlig nøkkel er %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "offentlig nøkkel-kryptert data: god DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "kryptert med %u-bit %s-nøkkel, ID %s, opprettet %s\n"
+
+# Do we really need to translate this string.
+# The must some bug in the code.
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      «%s»\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "kryptert med %s-nøkkel, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "offentlig nøkkel-dekryptering mislyktes: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr ""
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr ""
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr ""
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr ""
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr ""
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr ""
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "dekryptering mislyktes: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr ""
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "opprinnelig filnavn=«%.*s»\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+
+#: g10/mainproc.c:1165
+msgid "no signature found\n"
+msgstr "ingen signatur ble funnet\n"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr ""
+
+#: g10/mainproc.c:1508
+msgid "can't handle this ambiguous signature data\n"
+msgstr ""
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Signatur opprettet %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               bruker %s nøkkel %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signatur laget %s ved hjelp av %s-nøkkel ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Nøkkel tilgjengelig ved: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "DÅRLIG signatur fra «%s»"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Utgått signatur fra «%s»"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "God signatur fra «%s»"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[usikker]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                aka «%s»"
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Signatur utgått %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Signatur utgår %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s signatur, digestalgoritme %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binær"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "tekstmodus"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "ukjent"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr ""
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr ""
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr ""
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr ""
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr ""
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr ""
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) mislyktes in %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "ADVARSEL: bruker eksperimentell offentlig nøkkel-algoritme %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "ADVARSEL: bruker eksperimentell cipheralgoritme %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "ADVARSEL: bruker eksperimentell digest-algoritme %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "ADVARSEL: digestalgoritmen «%s» er avlegs\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr ""
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, c-format
+msgid "please see %s for more information\n"
+msgstr "vennligst se %s for mer informasjon\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr ""
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr ""
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr ""
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr ""
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr ""
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr ""
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr ""
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "flertydig valg «%s»\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "ukjent valg «%s»\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Fila «%s» finnes. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Overskrive (j/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr ""
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Tast inn nytt filnavn"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "skriver til stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "antar at signert data er i «%s»\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "ny konfigurasjonsfil «%s» ble opprettet\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "ADVARSEL: valgene i «%s» er ikke aktive under denne kjøringen\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "katalogen «%s» ble opprettet\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr ""
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr ""
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr ""
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr ""
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr ""
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr ""
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr ""
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (hovednøkkelid %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Du trenger en passfrase for å låse opp den hemmelige nøkkelen for brukeren:\n"
+"«%.*s»\n"
+"%u-bit %s nøkkel, ID %s, opprettet %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Gjenta passfrase\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Tast inn passfrase\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr ""
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "kan ikke spørre om passfrase i batchmodus\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Tast inn passfrase: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Du trenger en passfrase for å låse opp den hemmelige nøkkelen for\n"
+"brukeren: «%s»\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bit %s-nøkkel, ID %s, opprettet %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Gjenta passfrase: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "kan ikke åpne JPEG-fil «%s»: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Er du sikker på at du vil bruke den? (j/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "«%s» er ikke et JPEG-fil\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr ""
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr ""
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Ingen grunn er angitt"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Nøkkelen er overgått"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Nøkkelen har blitt kompromittert"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Nøkkelen er ikke lengre i bruk"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Brukerid er ikke lengre gyldig"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "grunnen for opphevelse: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "kommentar til opphevelse: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "Ingen tillitsverdi tilordnet til:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  aka «%s»\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"Hvor mye stoler du på at denne nøkkelen faktisk tilhører den angitte "
+"brukeren?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = Jeg vet ikke eller vil ikke uttale meg\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = Jeg stoler IKKE på den\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = Jeg stoler fullstendig på den\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = tilbake til hovedmenyen\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = hopp over denne nøkkelen\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = avslutt\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Valget ditt? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Vil du virkelig sette denne nøkkelen til fullstendig tillit? (j/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Sertifikater som fører til en fullstendig betrodd nøkkel:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Det finnes ingen indikasjon på at denne nøkkelen faktisk tilhører den "
+"angitte eieren\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Det er begrenset indikasjon på at denne nøkkelen faktisk tilhører den "
+"angitte eieren\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Denne nøkkelen tilhører sannsynligvis den angitte eieren\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "denne nøkkelen tilhører oss\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Det er IKKE sikkert at nøkkelen tilhører personen som er angitt i\n"
+"brukeriden.  Dersom du *virkelig* vet hva du gjør, kan du besvare det\n"
+"neste spørsmålet med ja.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Bruke denne nøkkelen likevel? (j/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ADVARSEL: Bruker ubetrodd nøkkel!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"ADVARSEL: nøkkel %s kan være opphevet: opphevingsnøkkel %s ikke tilstede.\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr ""
+"ADVARSEL: Denne nøkkelen har blitt opphevet av den utpekte oppheveren!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ADVARSEL: Denne nøkkelen har blitt opphevet av dens eier!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Dette kan bety at signaturen er falsk.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "ADVARSEL: Denne undernøkkelen har blitt opphevet av eieren!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Merk: Denne nøkkelen har blitt utkoblet.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Merk: Denne nøkkelen er utgått!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"ADVARSEL: Denne nøkkelen er ikke sertifisert med en betrodd signatur!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Det er ingen indikasjon på at signaturen tilhører eieren.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ADVARSEL: Vi stoler IKKE på denne nøkkelen!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Signaturen er sannsynligvis et FALSKNERI.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"ADVARSEL: Denne nøkkelen er ikke sertifisert med tilstrekkelige betrodde "
+"signaturer!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Det er ikke sikkert at signaturen tilhører brukeren.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: hoppet over: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: hoppet over: offentlig nøkkel er allerede tilstede\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Du oppga ikke en brukerid. (Du kan bruke «-r»)\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Tast inn brukeriden.  Avslutt med en blank linje: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Det finnes ingen slik brukerid.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "hoppet over: offentlig nøkkel allerede satt som standard mottaker\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Offentlig nøkkel er utkoblet.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "hoppet over: offentlig nøkkel er allerede satt\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "ukjent standardmottaker «%s»\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: hoppet over: offentlig nøkkel er utkoblet\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "ingen gyldige adressater\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr ""
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr ""
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr ""
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr ""
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr ""
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr ""
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr ""
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+"påtvinging av kompresjonsalgoritme %s bryter med mottakerens preferanser\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTIS: hemmelig nøkkel %s utgikk den %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr ""
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr ""
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "nøkkel %s: ingen brukerid\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Lage et utpekt opphevingssertifikat for denne nøkkelen? (j/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr ""
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr ""
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "hemmelig nøkkel «%s» ble ikke funnet: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr ""
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr ""
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Lage et opphevingssertifikat for denne nøkkelen? (j/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr ""
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr ""
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr ""
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr ""
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Er dette i orden? (j/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr ""
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr ""
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr ""
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Ugyldig passfrase; vennligst prøv igjen"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr ""
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "svak nøkkel ble opprettet - prøver på nytt\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"kan ikke unngå svak nøkkel for symmetrisk krypteringsalgorime; prøvde %d "
+"ganger!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr ""
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr ""
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr ""
+
+# Er dette entallsformen av denne strengen?
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"nøkkel %s ble opprettet %lu sekund i fremtiden (time warp eller "
+"klokkeproblem)\n"
+
+# Er dette flertallsformen av denne og den forrige strengen?
+#: g10/sig-check.c:195
+#, 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 "
+"klokkeproblem)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTIS: signaturnøkkelen %s utgikk %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "nøkkel %s: ingen undernøkkel for undernøkkelopphevingssignatur\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "nøkkel %s: ingen undernøkkel for undernøkkelbindingssignatur\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr ""
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s-signatur fra: «%s»\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"ADVARSEL: påtvinging av kompresjonsalgoritme %s (%d) bryter med mottakerens "
+"preferanser\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr ""
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr ""
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "hoppet over «%s»: er duplikat\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "hoppet over «%s»: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr ""
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr ""
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "feil med «%s»: %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "for lang linje"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "ugyldig fingeravtrykk"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "verdi for eiertillit mangler"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "feil ved søking etter tillitspost i «%s»: %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "lesefeil ved «%s»: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr ""
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "kan ikke aksere «%s»: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr ""
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "kan ikke opprette lås for «%s»\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "kan ikke låse «%s»\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr ""
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr ""
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr ""
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr ""
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr ""
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr ""
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr ""
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr ""
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr ""
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr ""
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "nøkkel %s: godtatt som betrodd nøkkel\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "nøkkel %s: ingen offentlig nøkkel for betrodd nøkkel - hoppet over\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "nøkkel %s markert som endelig betrodd.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr ""
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr ""
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ opphevet]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[ utgått]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[ ukjent]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[ udef ]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr ""
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr ""
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "fant ikke offentlig nøkkel %s: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr ""
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr ""
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "generell feil"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "ukjent pakketype"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "ukjent versjon"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "ukjent pubkey-algoritme"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "ukjent digest-algoritme"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "ugyldig offentlig nøkkel"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "ugyldig hemmelig nøkkel"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "ugyldig signatur"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "sjekksumfeil"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "ugyldig passfrase"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "fant ikke offentlig nøkkel"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "ukjent kryptoalgoritme"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "kan ikke åpne nøkkelknippet"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "ugyldig pakke"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "ugyldig beskyttelse"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "det finnes ingen slik brukerid"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "hemmelig nøkkel er ikke tilgjengelig"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "feil hemmelig nøkkel ble brukt"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "ikke støttet"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "ugyldig nøkkel"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "feil ved lesing av fil"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "feil ved skriving av fil"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "ukjent kompresjonsalgoritme"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "feil ved åpning av fil"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "feil ved opprettelse av fil"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "ugyldig passfrase"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "uimplementert pubkey-algoritme"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "uimplementert kryptoalgoritme"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "ukjent signaturklasse"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "feil med tillitsdatabasen"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "ugyldig MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "ressursgrense"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "ugyldig nøkkelknippe"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "ugyldig sertifikat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "vansired brukerid"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "feil ved lukking av fil"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "feil ved omdøping av fil"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "feil ved sletting av fil"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "uforventet data"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "konflikt mellom tidsstempler"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "ubrukelig pubkey algoritme"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "fila finnes fra før av"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "svak nøkkel"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "ugydig argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "ugyldig URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "ustøttet URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "nettverksfeil"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "ikke kryptert"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "ikke behandlet"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "ubrukelig offentlig nøkkel"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "ubrukelig hemmelig nøkkel"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "feil med nøkkelserver"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr ""
+
+#: util/errors.c:110
+msgid "no card"
+msgstr ""
+
+#: util/errors.c:111
+msgid "no data"
+msgstr "ingen data"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... dette er en feil (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "du fant en feil ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "ja"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "jJ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nei"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "avslutt"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "aA"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okay|okay"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancel|cancel"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "ADVARSEL: bruker usikkert minne!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "vennligst se http://www.gnupg.org/faq.html for mere informasjon\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operasjonen er ikke mulig uten initialisert sikkert minne\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(du kan ha brukt feil program for denne oppgaven)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA krever bruk av en 160-bit hashalgoritme\n"
diff --git a/po/pl.gmo b/po/pl.gmo
new file mode 100644 (file)
index 0000000..015a153
Binary files /dev/null and b/po/pl.gmo differ
diff --git a/po/pl.po b/po/pl.po
new file mode 100644 (file)
index 0000000..70d5883
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,7879 @@
+# Gnu Privacy Guard.
+# Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Janusz A. Urbanowicz <alex@bofh.net.pl>, 1999, 2000, 2001, 2002.
+#
+# To be included in GnuPG 1.2.2
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg-1.2.2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-06-23 15:54+0200\n"
+"Last-Translator: Janusz A. Urbanowicz <alex@bofh.net.pl>\n"
+"Language-Team: Polish <pl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Xgettext-Options: --default-domain=gnupg --directory=.. --add-comments --"
+"keyword=_ --keyword=N_ --files-from=./POTFILES.in\n"
+"Files: util/secmem.c util/argparse.c cipher/random.c cipher/rand-dummy.c "
+"cipher/rand-unix.c cipher/rand-w32.c g10/g10.c g10/pkclist.c g10/keygen.c "
+"g10/decrypt.c g10/encode.c g10/import.c g10/keyedit.c g10/keylist.c g10/"
+"mainproc.c g10/passphrase.c g10/plaintext.c g10/pref.c g10/seckey-cert.c g10/"
+"sig-check.c g10/sign.c g10/trustdb.c g10/verify.c g10/status.c g10/pubkey-"
+"enc.c\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "nie mo¿na wygenerowaæ liczby pierwszej krótszej od %d bitów\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "nie mo¿na wygenerowaæ liczby pierwszej krótszej od %d bitów\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "modu³ gromadzenia entropii nie zosta³ wykryty\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "nie mo¿na otworzyæ ,,%s''\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "nie mo¿na otworzyæ ,,%s'': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "nie mo¿na sprawdziæ ,,%s'': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr ",,%s'' nie jest zwyk³ym plikiem - zostaje pominiêty\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "uwaga: plik random_seed jest pusty\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"OSTRZE¯ENIE: niew³a¶ciwy rozmiar pliku random_seed - nie zostanie u¿yty\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "nie mo¿na odczytaæ ,,%s'': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "uwaga: plik random_seed nie jest uaktualniony\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "nie mo¿na utworzyæ ,,%s'': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "nie mo¿na zapisaæ ,,%s'': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "nie mo¿na zamkn±æ ,,%s'': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr ""
+"OSTRZE¯ENIE: u¿ywany generator liczb losowych\n"
+"nie jest kryptograficznie bezpieczny!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"U¿ywany generator liczb losowych jest atrap± wprowadzon± dla umo¿liwienia\n"
+"normalnej kompilacji - nie jest kryptograficznie bezpieczny!\n"
+"\n"
+"JAKIEKOLWIEK DANE GENEROWANE PRZEZ TEN PROGRAM NIE NADAJ¡ SIÊ DO \n"
+"NORMALNEGO U¯YTKU I NIE ZAPEWNIAJ¡ BEZPIECZEÑSTWA!!\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Proszê czekaæ, prowadzona jest zbiórka losowo¶ci. ¯eby siê nie nudziæ, "
+"mo¿esz\n"
+"popracowaæ w systemie, przy okazji dostarczy to systemowi wiêcej entropii "
+"do\n"
+"tworzenia liczb losowych.\n"
+"\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Brakuje mo¿liwo¶ci wygenerowania odpowiedniej liczby losowych bajtów.\n"
+"Proszê kontynuowaæ inne dzia³ania aby system móg³ zebraæ odpowiedni±\n"
+"ilo¶æ entropii do ich wygenerowania (brakuje %d bajtów).\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "inicjowanie Bazy Zaufania nie powiod³o siê: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "nie powiod³a siê odbudowa bufora bazy: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "usuniêcie bloku klucza nie powiod³o siê: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "wysy³ka do serwera kluczy nie powiod³a siê: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "b³±d podczas tworzenia has³a: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "b³±d odczytu bloku kluczy: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: b³±d odczytu pustego wpisu: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr ",,%s'' ju¿ jest skompresowany\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "generacja nowej pary kluczy"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "inicjowanie Bazy Zaufania nie powiod³o siê: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "usuniêcie bloku klucza nie powiod³o siê: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Generacja klucza nie powiod³a siê: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "podpis %s, skrót %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "nie odnaleziono poprawnych danych w formacie OpenPGP.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "opakowanie: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "niepoprawny nag³ówek opakowania: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "nag³ówek opakowania: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "niew³a¶ciwy nag³ówek dokumentu z podpisem na koñcu\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "zagnie¿d¿one podpisy na koñcu dokumentu\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "nieoczekiwane opakowanie:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "niepoprawne oznaczenie linii minusami: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "niew³a¶ciwy znak formatu radix64: ,,%02x'', zosta³ pominiêty\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "przewczesny koniec pliku (brak CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "przedwczesny koniec pliku (w CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "b³±d formatu CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "B³±d sumy CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "przedwczesny koniec pliku (w linii koñcz±cej)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "b³±d w linii koñcz±cej\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "nie odnaleziono poprawnych danych w formacie OpenPGP.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "b³±d opakowania: linia d³u¿sza ni¿ %d znaków\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"znak kodowania quoted-printable w opakowaniu ASCII - prawdopodobnie\n"
+"przek³amanie wprowadzone przez serwer pocztowy\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "brak klucza prywatnego"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "nie dzia³a w trybie wsadowym\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Twój wybór? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "w³kl"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "w³kl"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "nie podano przyczyny"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "nie zosta³ przetworzony"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "brak odpowiadaj±cego klucza publicznego: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "b³±d odczytu ,,%s'': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "aktualizacja ustawieñ klucza"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "niew³a¶ciwy znak w tek¶cie ustawieñ\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "niew³a¶ciwy znak w tek¶cie ustawieñ\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "b³±d: niew³a¶ciwy odcisk klucza\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "Odcisk klucza:"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "b³±d: niew³a¶ciwy odcisk klucza\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Generacja klucza nie powiod³a siê: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "nie odnaleziono poprawnych danych w formacie OpenPGP.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "b³±d podczas zapisu zbioru kluczy tajnych ,,%s'': %s\n"
+
+#: g10/card-util.c:1033
+#, fuzzy
+msgid "Replace existing key? (y/N) "
+msgstr "Czy na pewno podpisaæ? (t/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+#, fuzzy
+msgid "Replace existing keys? (y/N) "
+msgstr "Czy na pewno podpisaæ? (t/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Proszê wybraæ rodzaj klucza:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Wa¿no¶æ podpisu wygas³a %s.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (tylko do szyfrowania)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Niew³a¶ciwy wybór.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Proszê wybraæ powód uniewa¿nienia:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "nieznany algorytm ochrony\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Czê¶æ tajna g³ównego klucza jest niedostêpna.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "pominiêty: klucz prywatny jest ju¿ wpisany\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "wyj¶cie z tego menu"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "sprzeczne polecenia\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "ten tekst pomocy"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Klucz dostêpny w: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "zmiana daty wa¿no¶ci klucza"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "zmiana zaufania w³a¶ciciela"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "okazanie odcisku klucza"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "generacja nowej pary kluczy"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Polecenie> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "sprzeczne polecenia\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "sprzeczne polecenia\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Niepoprawna komenda  (spróbuj \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "brak klucza prywatnego"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "usuniêcie bloku klucza nie powiod³o siê: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Podaj identyfikator u¿ytkownika (user ID): "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "Podaj identyfikator u¿ytkownika (user ID): "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+#, fuzzy
+msgid "Enter PIN: "
+msgstr "Podaj identyfikator u¿ytkownika (user ID): "
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Powtórz has³o: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "has³o nie zosta³o poprawnie powtórzone; jeszcze jedna próba"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "nie mo¿na otworzyæ ,,%s''\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "opcja --output nie dzia³a z tym poleceniem\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "klucz ,,%s'' nie zosta³ odnaleziony: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "b³±d odczytu bloku kluczy: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(chyba, ¿e klucz zostaje wybrany przez podanie odcisku)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "bez opcji \"--yes\" nie dzia³a w trybie wsadowym\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Usun±æ ten klucz ze zbioru? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "To jest klucz tajny! - czy na pewno go usun±æ? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "usuniêcie bloku klucza nie powiod³o siê: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informacja o zaufaniu dla w³a¶ciciela klucza zosta³a wymazana\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "dla klucza publicznego ,,%s'' istnieje klucz prywatny!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "aby go usun±æ nalezy najpierw u¿yæ opcji \"--delete-secret-key\".\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "b³±d podczas tworzenia has³a: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+"ustawiony tryb S2K nie pozwala u¿yæ pakietu ESK dla szyfru symetrycznego\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "szyfrem %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr ",,%s'' ju¿ jest skompresowany\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "OSTRZE¯ENIE: plik ,,%s'' jest pusty\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"w trybie --pgp2 mo¿na szyfrowaæ dla kluczy RSA krótszych od 2048 bitów\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "odczyt z '%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"nie mo¿na u¿yæ szyfru IDEA z wszystkimi kluczami dla których szyfrujesz.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "wymuszone u¿ycie szyfru %s (%d) k³óci siê z ustawieniami adresata\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "wymuszone u¿ycie kompresji %s (%d) k³óci siê z ustawieniami adresata\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "wymuszone u¿ycie szyfru %s (%d) k³óci siê z ustawieniami adresata\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "%s nie jest dostêpne w trybie %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s zaszyfrowany dla: ,,%s''\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "dane zaszyfrowano za pomoc± %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "dane zaszyfrowano nieznanym algorytmem numer %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"OSTRZE¯ENIE: wiadomo¶æ by³a szyfrowana kluczem s³abym szyfru symetrycznego.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problem podczas obróbki pakietu szyfrowego\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "odwo³ania do zewnêtrznych programów s± wy³±czone\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "nie mo¿na utworzyæ katalogu ,,%s'': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"nieszczelne uprawnienia ustawieñ - wo³anie zewnêtrznych programów wy³±czone\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"platforma wymaga u¿ycia plików tymczasowych do wo³ania zewnêtrznych "
+"programów\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "nie mo¿na wykonaæ %s ,,%s'': %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "nie mo¿na wykonaæ %s ,,%s'': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "b³±d systemu podczas wo³ania programu zewnêtrznego: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "nienaturalne zakoñczenie pracy zewnêtrznego programu\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "nie mo¿na uruchomiæ zewnêtrznego programu\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "nie mo¿na odczytaæ odpowiedzi programu zewnêtrznego: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "OSTRZE¯ENIE: nie mo¿na skasowaæ pliku tymczasowego (%s) ,,%s'': %s.\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "OSTRZE¯ENIE: nie mo¿na skasowaæ tymczasowego katalogu ,,%s'': %s.\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Podpis zostanie oznaczony jako nie podlegaj±cy uniewa¿nieniu.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "brak kluczy uniewa¿niaj±cych dla ,,%s''\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "uniewa¿nienie podklucza"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "bezu¿yteczny klucz prywatny"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "klucz %08lX: nie jest chroniony - pominiêty\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "klucz %08lX: klucz PGP 2.x - pominiêty\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "klucz %08lX: pominiêto - podpis na podkluczu w niew³a¶ciwym miejscu\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "inicjowanie Bazy Zaufania nie powiod³o siê: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "OSTRZE¯ENIE: klucz prywatny %08lX nie ma prostej sumy kontrolnej SK.\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "OSTRZE¯ENIE: nic nie zosta³o wyeksportowane!\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Polecenia:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[plik]|z³o¿enie podpisu"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[plik]|z³o¿enie podpisu pod dokumentem"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "z³o¿enie podpisu oddzielonego od dokumentu"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "szyfrowanie danych"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "szyfrowanie tylko szyfrem symetrycznym"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "odszyfrowywanie danych (domy¶lne)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "sprawdzenie podpisu"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "lista kluczy"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "lista kluczy i podpisów"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "sprawdzenie podpisów kluczy"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "lista kluczy i ich odcisków"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "lista kluczy prywatnych"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "generacja nowej pary kluczy"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "usuniêcie klucza ze zbioru kluczy publicznych"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "usuniêcie klucza ze zbioru kluczy prywatnych"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "z³o¿enie podpisu na kluczu"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "z³o¿enie prywatnego podpisu na kluczu"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "podpisanie lub modyfikacja klucza"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "tworzenie certyfikatu uniewa¿nienia klucza"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "eksport kluczy do pliku"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "eksport kluczy do serwera kluczy"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "import kluczy z serwera kluczy"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "szukanie kluczy na serwerze"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "od¶wie¿enie wszystkich kluczy z serwera"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "import/do³±czenie kluczy"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "uaktualnienie bazy zaufania"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [pliki]|skróty wiadomo¶ci"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opcje:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "opakowanie ASCII pliku wynikowego"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAZWA|szyfrowanie dla odbiorcy NAZWA"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "identyfikator do podpisania lub odszyfrowania"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|poziom kompresji N (0 - bez)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "kanoniczny format tekstowy"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "plik wyj¶ciowy"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "z dodatkowymi informacjami"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "pozostawienie bez zmian"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "pytanie przed nadpisaniem plików"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Pe³n± listê poleceñ i opcji mo¿na znale¼æ w podrêczniku systemowym.)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Przyk³ady:\n"
+"\n"
+" -se -r Bob [plik]          podpisaæ i zaszyfrowaæ kluczem Boba\n"
+" --clearsign [plik]         podpisaæ z pozostawieniem czytelno¶ci dokumentu\n"
+" --detach-sign [plik]       podpisaæ z umieszczeniem podpisu w osobnym "
+"pliku\n"
+" --list-keys [nazwy]        pokazuje klucze\n"
+" --fingerprint [nazwy]      pokazuje odciski kluczy\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "B³êdy prosimy zg³aszaæ na adres <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Wywo³anie: gpg [opcje] [pliki] (-h podaje pomoc)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sk³adnia: gpg [opcje] [pliki]\n"
+"podpisywanie, sprawdzanie podpisów, szyfrowanie, deszyfrowanie\n"
+"domy¶lnie wykonywana operacja zale¿y od danych wej¶ciowych\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Obs³ugiwane algorytmy:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Asymetryczne: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Symetryczne: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Skrótów: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Kompresji: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "wywo³anie: gpg [opcje]"
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "sprzeczne polecenia\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "w definicji grupy ,,%s'' brak znaku ,,=''\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "OSTRZE¯ENIE: niebezpieczne prawa w³asno¶ci do %s ,,%s''.\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "OSTRZE¯ENIE: niebezpieczne prawa w³asno¶ci do %s ,,%s''.\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "OSTRZE¯ENIE: niebezpieczne prawa w³asno¶ci do %s ,,%s''.\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "OSTRZE¯ENIE: niebezpieczne prawa dostêpu do %s ,,%s''.\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "OSTRZE¯ENIE: niebezpieczne prawa dostêpu do %s ,,%s''.\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "OSTRZE¯ENIE: niebezpieczne prawa dostêpu do %s ,,%s''.\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"OSTRZE¯ENIE: niebezpieczne prawa w³asno¶ci do katalogu\n"
+"                  zawieraj±cego %s ,,%s''\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"OSTRZE¯ENIE: niebezpieczne prawa w³asno¶ci do katalogu\n"
+"                  zawieraj±cego %s ,,%s''\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"OSTRZE¯ENIE: niebezpieczne prawa w³asno¶ci do katalogu\n"
+"                  zawieraj±cego %s ,,%s''\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"OSTRZE¯ENIE: niebezpieczne prawa dostêpu do katalogu \n"
+"                  zawieraj±cego %s ,,%s''\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"OSTRZE¯ENIE: niebezpieczne prawa dostêpu do katalogu \n"
+"                  zawieraj±cego %s ,,%s''\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"OSTRZE¯ENIE: niebezpieczne prawa dostêpu do katalogu \n"
+"                  zawieraj±cego %s ,,%s''\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "nieznana opcja ,,%s''\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Brak odpowiadaj±cego podpisu w zbiorze kluczy prywatnych\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "podany URL regulaminu podpisów jest niepoprawny\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "okazanie, w którym zbiorze znajduje siê dany klucz"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Brak odpowiadaj±cego podpisu w zbiorze kluczy prywatnych\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "UWAGA: stary domy¶lny plik opcji ,,%s'' zosta³ zignorowany\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "UWAGA: brak domy¶lnego pliku opcji ,,%s''\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "plik opcji ,,%s'': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "odczyt opcji z ,,%s''\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "UWAGA: %s nie jest do normalnego u¿ytku!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"modu³ szyfru ,,%s'' nie zosta³ za³adowany z powodu niebezpiecznych praw "
+"dostêpu\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s nie jest poprawn± nazw± zestawu znaków\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s nie jest poprawn± nazw± zestawu znaków\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "niezrozuma³y URI serwera kluczy\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: niepoprawne opcje wczytania kluczy\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "niepoprawne opcje wczytania kluczy\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: niepoprawne opcje wczytania kluczy\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "niepoprawne opcje wczytania kluczy\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s nie jest poprawn± nazw± zestawu znaków\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "podany URL regulaminu podpisów jest niepoprawny\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s nie jest poprawn± nazw± zestawu znaków\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "nie mo¿na ustawiæ ¶cie¿ki programów wykonywalnych na %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d niepoprawne opcje eksportu kluczy\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "OSTRZE¯ENIE: program mo¿e stworzyæ plik zrzutu pamiêci!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "OSTRZE¯ENIE: %s powoduje obej¶cie %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "Nie wolno u¿ywaæ %s z %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s nie ma sensu w po³±czeniu z %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent nie jest dostêpny w tej sesji\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"w trybie --pgp2 mo¿na sk³adaæ tylko podpisy oddzielne lub do³±czone do "
+"tekstu\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "w trybie --pgp2 nie mo¿na jednocze¶nie szyfrowaæ i podpisywaæ\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "w trybie --pgp2 trzeba u¿ywaæ plików a nie potoków.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "szyfrowanie wiadomo¶ci w trybie --pgp2 wymaga modu³u szyfru IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "wybrany algorytm szyfruj±cy jest niepoprawny\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "wybrany algorytm skrótów wiadomo¶ci jest niepoprawny\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "wybrany algorytm szyfruj±cy jest niepoprawny\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "wybrany algorytm skrótów po¶wiadczeñ jest niepoprawny\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "warto¶æ completes-needed musi byæ wiêksza od 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "warto¶æ marginals-needed musi byæ wiêksza od 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "warto¶æ max-cert-depth musi mie¶ciæ siê w zakresie od 1 do 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr ""
+"niew³a¶ciwy domy¶lny poziom sprawdzania; musi mieæ warto¶æ 0, 1, 2 lub 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr ""
+"niew³a¶ciwy minimalny poziom sprawdzania; musi mieæ warto¶æ 0, 1, 2 lub 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "UWAGA: prosty tryb S2K (0) jest stanowczo odradzany\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "niepoprawny tryb S2K; musi mieæ warto¶æ 0, 1 lub 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "niew³a¶ciwe domy¶lne ustawienia\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "niew³a¶ciwe ustawienia szyfrów\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "niew³a¶ciwe ustawienia skrótów\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "niew³a¶ciwe ustawienia algorytmów kompresji\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s jeszcze nie dzia³a z %s!\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "szyfr ,,%s'' nie jest dostêpny w trybie %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "skrót ,,%s'' nie jest dostêpny w trybie %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "kompresja ,,%s'' nie jest dostêpna w trybie %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "inicjowanie Bazy Zaufania nie powiod³o siê: %s\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [plik]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [plik]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "b³±d odszyfrowywania: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [plik]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [plik]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "%s nie jest dostêpne w trybie %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [plik]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [plik]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [plik]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "%s nie jest dostêpne w trybie %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [plik]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [plik]\""
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [plik]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key nazwa u¿ytkownika"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key nazwa u¿ytkownika"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key nazwa u¿ytkownika [polecenia]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [identyfikator] [zbiór kluczy]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "wysy³ka do serwera kluczy nie powiod³a siê: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "odbiór z serwera kluczy nie powiód³ siê: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "eksport kluczy nie powiód³ siê: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "szukanie w serwerze kluczy nie powiod³o siê: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "od¶wie¿enie kluczy z serwera nie powiod³o siê: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "zdjêcie opakowania ASCII nie powiod³o siê: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "opakowywanie ASCII nie powiod³o siê: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "niew³a¶ciwy algorytm skrótu ,%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nazwa pliku]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Wpisz tutaj swoj± wiadomo¶æ ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "podany URL regulaminu po¶wiadczania jest niepoprawny\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "podany URL regulaminu podpisów jest niepoprawny\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "podany URL regulaminu podpisów jest niepoprawny\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "zbyt wiele wpisów w buforze kluczy publicznych - wy³±czony\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[brak identyfikatora u¿ytkownika]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, 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 %08lX.\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "brak prywatnego odpowiednika podklucza publicznego %08lX - pominiêty\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "u¿ywany jest podklucz %08lX zamiast klucza g³ównego %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "klucz %08lX: klucz tajny bez klucza jawnego - pominiêty\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "mniej komunikatóww"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "pobieranie kluczy z tego zbioru"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "nie traktowaæ konfliktu datowników jako b³êdu"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|pisanie opisu stanu do deskryptora FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Wywo³anie: gpgv [opcje] [pliki] (-h podaje pomoc)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sk³adnia: gpgm [opcje] [pliki]\n"
+"Sprawdzanie podpisów ze znanych zaufanych kluczy\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Te wartosci u¿ytkownik przydziela wg swojego uznania; nie bêd± nigdy\n"
+"eksportowane poza ten system. Potrzebne s± one do zbudowania sieci\n"
+"zaufania, i nie ma to nic wspólnego z tworzon± automatycznie sieci±\n"
+"certyfikatów."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Aby zbudowaæ Sieæ Zaufania, GnuPG potrzebuje znaæ klucze do których\n"
+"masz absolutne zaufanie. Zwykle s± to klucze do których masz klucze\n"
+"tajne. Odpowiedz ,,tak'', je¶li chcesz okre¶liæ ten klucz jako klucz\n"
+"do którego masz absolutne zaufanie.\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Je¶li mimo wszystko chcesz u¿yæ tego klucza, klucza, co do którego nie ma\n"
+"¿adnej pewno¶ci do kogo nale¿y, odpowiedz ,,tak''."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Podaj adresatów tej wiadomo¶ci."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"U¿ywanie tego samego klucza do podpisywania i szyfrowania nie jest dobrym\n"
+"pomys³em. Mo¿na tak postêpowaæ tylko w niektórych zastosowaniach. Proszê "
+"siê\n"
+"najpierw skonsultowaæ z ekspertem od bezpieczeñstwa. "
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Wprowad¼ rozmiar klucza"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Odpowied¼ \"tak\" lub \"nie\"."
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Wprowad¼ ¿±dan± warto¶æ (jak w znaku zachêty).  \n"
+"Mo¿na tu podaæ datê w formacie ISO (RRRR-MM-DD) ale nie da to\n"
+"w³a¶ciwej obs³ugi b³êdów - system próbuje interpretowaæ podan± warto¶æ\n"
+"jako okres."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Nazwa w³a¶ciciela klucza."
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "proszê wprowadziæ opcjonalny ale wysoce doradzany adres e-mail"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Proszê wprowadziæ opcjonalny komentarz"
+
+# OSTRZE¯ENIE: nic nie zosta³o wyeksportowane!
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N aby zmieniæ nazwê (nazwisko).\n"
+"C aby zmieniæ komentarz.<\n"
+"E aby zmieniæ adres e-mail.\n"
+"O aby kontynuowaæ tworzenie klucza.\n"
+"Q aby zrezygnowaæ z tworzenia klucza."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Je¶li ma zostaæ wygenerowany podklucz, nale¿y odpowiedzieæ \"tak\"."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Przy podpisywaniu identyfikatora u¿ytkownika na kluczu nale¿y sprawdziæ, \n"
+"czy to¿samo¶æ u¿ytkownika odpowiada temu, co jest wpisane w "
+"identyfikatorze.\n"
+"Innym u¿ytkownikom przyda siê informacja, jak dog³êbnie zosta³o to przez\n"
+"Ciebie sprawdzone.\n"
+"\n"
+"\"0\" oznacza, ¿e nie podajesz ¿adnych informacji na temat tego jak "
+"dog³êbnie\n"
+"    to¿samo¶æ u¿ytkownika zosta³a przez Ciebie potwierdzona.\n"
+"\n"
+"\"1\" oznacza, ¿e masz przekonanie, ¿e to¿samo¶æ u¿ytkownka odpowiada\n"
+"    identyfikatorowi klucza, ale nie by³o mo¿liwo¶ci sprawdzenia tego.\n"
+"    Taka sytuacja wystêpuje te¿ kiedy podpisujesz identyfikator bêd±cy\n"
+"    pseudonimem.\n"
+"\n"
+"\"2\" oznacza, ¿e to¿samo¶æ u¿ytkownika zosta³± przez Ciebie potwierdzona\n"
+"    pobie¿nie - sprawdzili¶cie odcisk klucza, sprawdzi³a¶/e¶ to¿samo¶æ\n"
+"    na okazanym dokumencie ze zdjêciem.\n"
+"\n"
+"\"3\" to dog³êbna weryfikacja to¿samo¶ci. Na przyk³ad sprawdzenie odcisku \n"
+"    klucza, sprawdzenie to¿samo¶ci z okazanego oficjalnego dokumentu ze\n"
+"    zdjêciem (np paszportu) i weryfikacja poprawno¶ci adresu poczty\n"
+"    elektronicznej przez wymianê poczty z tym adresem.\n"
+"\n"
+"Zauwa¿, ¿e podane powy¿ej przyk³ady dla poziomów \"2\" i \"3\" to *tylko*\n"
+"przyk³ady. Do Ciebie nale¿y decyzja co oznacza \"pobie¿ny\" i \"dog³êbny\" "
+"w\n"
+"kontek¶cie po¶wiadczania i podpisywania kluczy.\n"
+"\n"
+"Je¶li nie wiesz co odpowiedzieæ, podaj \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Odpowiedz \"tak\", aby podpisaæ WSZYSTKIE identyfikatory u¿ytkownika."
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Aby skasowaæ ten identyfikator u¿ytkownika (co wi±¿e siê ze utrat±\n"
+"wszystkich jego po¶wiadczeñ!) nale¿y odpowiedzieæ ,,tak''."
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Aby skasowaæ podklucz nale¿y odpowiedzieæ \"tak\"."
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"To jest poprawny podpis na tym kluczu; normalnie nie nale¿y go usuwaæ\n"
+"poniewa¿ mo¿e byæ wa¿ny dla zestawienia po³aczenia zaufania do klucza\n"
+"którym go z³o¿ono lub do innego klucza nim po¶wiadczonego."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Ten podpis nie mo¿e zostaæ potwierdzony poniewa¿ nie ma\n"
+"odpowiadaj±cego mu klucza publicznego. Nale¿y od³o¿yæ usuniêcie tego\n"
+"podpisu do czasu, kiedy oka¿e siê który klucz zosta³ u¿yty, poniewa¿\n"
+"w momencie uzyskania tego klucza mo¿e pojawiæ siê ¶cie¿ka zaufania\n"
+"pomiêdzy tym a innym, ju¿ po¶wiadczonym kluczem."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "Ten podpis jest niepoprawny. Mo¿na usuni±æ go ze zbioru kluczy."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"To jest podpis wi±¿±cy identyfikator u¿ytkownika z kluczem. Nie nale¿y\n"
+"go usuwaæ - GnuPG mo¿e nie móc pos³ugiwaæ siê dalej kluczem bez\n"
+"takiego podpisu. Bezpiecznie mo¿na go usun±æ tylko je¶li ten podpis\n"
+"klucza nim samym z jakich¶ przyczyn nie jest poprawny, i klucz jest\n"
+"drugi raz podpisany w ten sam sposób."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Przestawienie wszystkich (lub tylko wybranych) identyfikatorów na aktualne\n"
+"ustawienia. Data na odpowiednich podpisach zostane przesuniêta do przodu o\n"
+"jedn± sekundê. \n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Podaj d³ugie, skomplikowane has³o, np. ca³e zdanie.\n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Proszê powrótrzyæ has³o, aby upewniæ siê ¿e nie by³o pomy³ki."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Podaj nazwê pliku którego dotyczy ten podpis"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Je¶li mo¿na nadpisaæ ten plik, nale¿y odpowiedzieæ ,,tak''"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Nazwa pliku. Naci¶niêcie ENTER potwierdzi nazwê domy¶ln± (w nawiasach)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Nalezy podaæ powód uniewa¿nienia klucza. W zale¿no¶ci od kontekstu mo¿na\n"
+"go wybraæ z listy:\n"
+"  \"Klucz zosta³ skompromitowany\"\n"
+"      Masz powody uwa¿aæ ¿e twój klucz tajny dosta³ siê w niepowo³ane rêce.\n"
+"  \"Klucz zosta³ zast±piony\"\n"
+"      Klucz zosta³ zast±piony nowym.\n"
+"  \"Klucz nie jest ju¿ u¿ywany\"\n"
+"      Klucz zosta³ wycofany z u¿ycia.\n"
+"  \"Identyfikator u¿ytkownika przesta³ byæ poprawny\"\n"
+"      Identyfikator u¿ytkownika (najczê¶ciej adres e-mail przesta³ byæ \n"
+"      poprawny.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Je¶li chcesz, mo¿esz podaæ opis powodu wystawienia certyfikatu\n"
+"uniewa¿nienia. Opis powinien byc zwiêz³y. \n"
+"Pusta linia koñczy wprowadzanie tekstu.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Pomoc niedostêpna"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Brak pomocy o ,,%s''"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "uaktualnienie bazy zaufania"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "klucz publiczny nie pasuje do klucza prywatngeo!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "bezu¿yteczny klucz prywatny"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "blok typu %d zostaje pominiêty\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu kluczy przetworzonych do tej chwili\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Ogó³em przetworzonych kluczy: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "   pominiêtych nowych kluczy: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          bez identyfikatora: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "         do³±czono do zbioru: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                   bez zmian: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "      nowych identyfikatorów: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "            nowych podkluczy: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "             nowych podpisów: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   nowych uniewa¿nieñ kluczy: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "   tajnych kluczy wczytanych: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "     tajnych kluczy dodanych: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "    tajnych kluczy bez zmian: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "      nie w³±czono do zbioru: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "             nowych podpisów: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "   tajnych kluczy wczytanych: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Te identyfikatory s± podpisane przez Ciebie:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "podpis %s, skrót %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "klucz %08lX: brak identyfikatora u¿ytkownika\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "klucz %08lX: podklucz uszkodzony przez serwer zosta³ naprawiony\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "klucz %08lX: przyjêto identyfikator nie podpisany nim samym ,,%s''\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "klucz %08lX: brak poprawnych identyfikatorów u¿ytkownika\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "to mo¿e byæ spowodowane brakiem podpisu klucza nim samym\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "klucz %08lX: brak klucza publicznego: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "klucz %08lX: nowy klucz - pominiêty\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "brak zapisywalnego zbioru kluczy: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "zapis do '%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "b³±d zapisu zbioru kluczy '%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "klucz %08lX: klucz publiczny ,,%s'' wczytano do zbioru\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "klucz %08lX: nie zgadza siê z lokaln± kopi±\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "klucz %08lX: brak oryginalnego bloku klucza; %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "klucz %08lX: nie mo¿na odczytaæ oryginalnego bloku klucza; %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "klucz %08lX: ,,%s'' 1 nowy identyfikator u¿ytkownika\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych identyfikatorów u¿ytkownika\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "klucz %08lX: ,,%s'' 1 nowy podpis\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych podpisów\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "klucz %08lX: ,,%s'' 1 nowy podklucz\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych podkluczy\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych podpisów\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych podpisów\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych identyfikatorów u¿ytkownika\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "klucz %08lX: ,,%s'' %d nowych identyfikatorów u¿ytkownika\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "klucz %08lX: ,,%s'' bez zmian\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "klucz %08lX: klucz tajny z ustawionym szyfrem %d - pominiêty\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "brak domy¶lego zbioru kluczy tajnych: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "Klucz %08lX: klucz tajny wczytany do zbioru\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "Klucz %08lX: ten klucz ju¿ znajduje siê w zbiorze\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "klucz %08lX: brak klucza tajnego: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"klucz %08lX: brak klucza publicznego którego dotyczy wczytany certyfikat\n"
+"              uniwa¿nienia\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "klucz %08lX: niepoprawny certyfikat uniewa¿nienia: %s - odrzucony\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "klucz %08lX: ,,%s'' certyfikat uniewa¿nienia zosta³ ju¿ wczytany\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "klucz %08lX: brak identyfikatora u¿ytkownika do podpisu\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "klucz %08lX: algorytm asymetryczny \"%s\" nie jest obs³ugiwany\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "klucz %08lX: niepoprawny podpis na identyfikatorze \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "klucz %08lX: brak podklucza do dowi±zania\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "klucz %08lX: nie obs³ugiwany algorytm asymetryczny\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "klucz %08lX: niepoprawne dowi±zanie podklucza\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "klucz %08lX: usuniêto wielokrotne dowi±zanie podklucza\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "klucz %08lX: brak podklucza, którego dotyczy uniewa¿nienie\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "klucz %08lX: nieoprawne uniewa¿nienie podklucza\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "klucz %08lX: usuniêto wielokrotne uniewa¿nienie podklucza\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "klucz %08lX: pominiêto identyfikator u¿ytkownika '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "klucz %08lX: podklucz pominiêty\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "klucz %08lX: podpis nieeksportowalny (klasy %02x) - pominiêty\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr ""
+"klucz %08lX: pominiêto certyfikat uniewa¿nienia umieszczony \n"
+"              w niew³a¶ciwym miejscu\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "klucz %08lX: pominiêto -  niepoprawny certyfikat uniewa¿nienia: %s\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "klucz %08lX: pominiêto - podpis na podkluczu w niew³a¶ciwym miejscu\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "klucz %08lX: pominiêto - nieoczekiwana klasa podpisu (%02x)\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "key %08lX: do³±czono powtórzony identyfikator u¿ytkownika\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"OSTRZE¯ENIE: klucz %08lX móg³ zostaæ uniewazniony:\n"
+"             zapytanie o uniewa¿niaj±cy klucz %08lX w serwerze kluczy\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"OSTRZE¯ENIE: klucz %08lX móg³ zostaæ uniewa¿niony:\n"
+"             brak uniewa¿niaj±cego klucza %08lX.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "klucz %08lX: ,,%s'' dodany certyfikat uniewa¿nienia\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "klucz %08lX: dodano bezpo¶redni podpis\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "klucz publiczny nie pasuje do klucza prywatngeo!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "pominiêty: klucz prywatny jest ju¿ wpisany\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "pominiêty: klucz prywatny jest ju¿ wpisany\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "b³±d tworzenia zbioru kluczy `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "zbiór kluczy ,,%s'' zosta³ utworzony\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "b³±d tworzenia `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "nie powiod³a siê odbudowa bufora bazy: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[uniewa¿nienie]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[podpis klucza nim samym]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 niepoprawny podpis\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d niepoprawnych podpisów\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 podpis nie zosta³ sprawdzony z powodu braku klucza\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, 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"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 podpis nie zosta³ sprawdzony z powodu b³êdu\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d podpisów nie sprawdzonych z powodu b³êdów\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "wykryto 1 identyfikator u¿ytkownika niepodpisany tym samym kluczem\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr ""
+"wykryto %d identyfikatorów u¿ytkownika niepodpisanych tym samym kluczem\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Zastanów siê jak bardzo ufasz temu u¿ytkownikowi w kwestii sprawdzania\n"
+"to¿samo¶ci innych u¿ytkowników (czy sprawdzi on odciski kluczy pobrane\n"
+"z ró¿nych ¼róde³, dokumenty potwierdzaj±ce to¿samo¶æ, itd.).\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = mam ograniczone zaufanie\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = mam pe³ne zaufanie\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Identyfikator u¿ytkownika ,,%s'' zosta³ uniewa¿niony."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Czy na pewno chcesz podpisaæ? (t/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr " Nie da siê z³o¿yæ podpisu.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Identyfikator u¿ytkownika ,,%s'' przekroczy³ swój termin wa¿no¶ci."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Identyfikator ,,%s'' nie jest podpisany swoim kluczem."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Identyfikator ,,%s'' nie jest podpisany swoim kluczem."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Czy na pewno podpisaæ? (t/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Podpis klucza nim samym na ,,%s''\n"
+"jest podpisem z³o¿onym przez PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Czy chcesz zamieniæ go na podpis OpenPGP? (t/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Twój podpis na \"%s\"\n"
+"przekroczy³ datê wa¿no¶ci.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Czy chcesz zast±piæ przeterminowany podpis nowym? (t/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Twój podpis na \"%s\"\n"
+"jest podpisem prywatnym (lokalnym).\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+"Czy chcesz zamieniæ go na pe³ny, publiczny, eksportowalny podpis? (t/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" jest ju¿ lokalnie podpisany kluczem %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" jest ju¿ podpisany kluczem %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Czy na pewno chcesz to podpisaæ? (t/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nie ma nic do podpisania kluczem %08lX.\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Data wa¿no¶ci tego klucza up³ynê³a!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Wa¿no¶æ tego klucza wygasa %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+"Czy chcesz ¿eby wa¿no¶æ Twojego podpisu wygasa³a w tej samej chwili? (T/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"W trybie --pgp2 nie mo¿na podpisywaæ kluczy PGP 2.x podpisami OpenPGP.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "To uczyni ten klucz nieuzytecznym dla PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Jak dok³adnie zosta³a przez Ciebie sprawdzona to¿samo¶æ tej osoby?\n"
+"Je¶li nie wiesz co odpowiedzieæ, podaj ,,0''.\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Nie odpowiem na to pytanie. %s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) W ogóle nie.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Pobie¿nie.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Bardzo dok³adnie.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Twój wybór (,,?'' podaje wiêcej informacji): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Czy jeste¶ naprawdê pewien ¿e chcesz podpisaæ ten klucz \n"
+"swoim kluczem: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"To bêdzie podpis klucza nim samym.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"OSTRZE¯ENIE: podpis zostanie oznaczony jako prywatny (nieeksportowalny).\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"OSTRZE¯ENIE: podpis zostanie oznaczony jako nie podlegaj±cy uniewa¿nieniu.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Podpis zostanie oznaczony jako prywatny (nieeksportowalny).\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Podpis zostanie oznaczony jako nie podlegaj±cy uniewa¿nieniu.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"To¿samo¶æ u¿ytkownika nie zosta³a w ogóle sprawdzona.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"To¿samo¶æ u¿ytkownika zosta³a sprawdzona pobie¿nie.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"To¿samo¶æ u¿ytkownika zosta³a dok³adnie sprawdzona.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Czy na pewno podpisaæ? (t/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "z³o¿enie podpisu nie powiod³o siê: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Ten klucz nie jest chroniony.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Czê¶æ tajna g³ównego klucza jest niedostêpna.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Czê¶æ tajna g³ównego klucza jest niedostêpna.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Klucz jest chroniony.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Tego klucza nie mo¿na edytowaæ: %s.\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Wprowad¼ nowe d³ugie, skomplikowane has³o dla tego klucza tajnego.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "has³o nie zosta³o poprawnie powtórzone; jeszcze jedna próba"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Nie chcesz has³a - to *z³y* pomys³!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Czy na pewno chcesz to zrobiæ? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "przenoszê podpis klucza na w³a¶ciwe miejsce\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "zapis zmian i wyj¶cie"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "okazanie odcisku klucza"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "lista kluczy i identyfikatorów u¿ytkowników"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "wybór identyfikatora u¿ytkownika N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "wybór identyfikatora u¿ytkownika N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "uniewa¿nienie podpisu"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "z³o¿enie prywatnego (lokalnego) podpisu na kluczu"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "lid %lu: niepodpisany identyfikator u¿ytkownika\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "dodanie nowego identyfikatora u¿ytkownika do klucza"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "dodanie zdjêcia u¿ytkownika do klucza"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "usuniêcie identyfikatora u¿ytkownika z klucza"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "dodkl"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "usuniêcie podklucza"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "wyznaczenie klucza uniewa¿niaj±cego"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"Czy na pewno zaktualizowaæ ustawienia klucza dla wybranych identyfikatorów? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Nie mo¿na zmieniæ daty wa¿no¶ci klucza w wersji 3.\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "oznaczenie identyfikatora u¿ytkownika jako g³ównego"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "prze³±czenie pomiêdzy list± kluczy publicznych i prywatnych"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "ustawienia (zaawansowane)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "rozbudowana lista ustawieñ"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"Czy na pewno zaktualizowaæ ustawienia klucza dla wybranych identyfikatorów? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "niezrozuma³y URI serwera kluczy\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"Czy na pewno zaktualizowaæ ustawienia klucza dla wybranych identyfikatorów? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "zmiana has³a klucza"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "zmiana zaufania w³a¶ciciela"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Czy na pewno uniewa¿niæ wszystkie wybrane identyfikatory u¿ytkownika? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "uniewa¿nienie identyfikatora u¿ytkownika"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "uniewa¿nienie podklucza"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "w³±czyæ klucz do u¿ycia"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "wy³±czyæ klucz z u¿ycia"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "okazanie identyfikatora - zdjêcia"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "b³±d odczytu bloku klucza tajnego '%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Dostêpny jest klucz tajny.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Do wykonania tej operacji potrzebny jest klucz tajny.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Najpierw trzeba u¿yæ polecenia \"prze³\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Klucz uniewa¿niony."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Podpisaæ wszystkie identyfikatory u¿ytkownika na tym kluczu? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Podpowied¼: wybierz identyfikatory u¿ytkownika do podpisania.\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "nieznana klasa podpisu"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "To polecenie nie jest dostêpne w trybie %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Musisz wybraæ co najmniej jeden identyfikator u¿ytkownika.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Nie mo¿esz usun±æ ostatniego identyfikatora u¿ytkownika!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Czy na pewno usun±æ wszystkie wybrane identyfikatory u¿ytkownika? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Czy na pewno usun±æ ten identyfikator u¿ytkownika? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Czy na pewno usun±æ ten identyfikator u¿ytkownika? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Musisz wybraæ co najmniej jeden klucz.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "nie mo¿na otworzyæ ,,%s'': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "b³±d tworzenia zbioru kluczy `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Musisz wybraæ co najmniej jeden klucz.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Czy na pewno chcesz usun±æ wybrane klucze? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Czy na pewno chcesz usun±æ ten klucz? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Czy na pewno uniewa¿niæ wszystkie wybrane identyfikatory u¿ytkownika? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Czy na pewno uniewa¿niæ ten identyfikator u¿ytkownika? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Czy na pewno chcesz uniewa¿niæ ten klucz? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Czy na pewno chcesz uniewa¿niæ wybrane klucze? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Czy na pewno chcesz uniewa¿niæ ten klucz? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "ustawienie opcji klucza"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Czy na pewno zaktualizowaæ ustawienia klucza dla wybranych identyfikatorów? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Czy na pewno usaktualniæ ustawienia? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Zapisaæ zmiany? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Wyj¶æ bez zapisania zmian? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "zapis zmian nie powiód³ siê: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "zapis zmian na kluczu prywatnym nie powiód³ siê: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Klucz nie zosta³ zmieniony wiêc zapis zmian nie jest konieczny.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Skrót: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Ustawienia: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Adnotacja: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Klucze PGP 2.x nie zawieraj± opisu ustawieñ.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Klucz mo¿e zostaæ uniewa¿niony przez klucz %s "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Klucz mo¿e zostaæ uniewa¿niony przez klucz %s "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (poufne)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "nie mo¿na utworzyæ %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[uniewa¿niony]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [wygasa :%s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [wygasa :%s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " zaufanie: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " zaufanie: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Ten klucz zosta³ wy³±czony z u¿ytku"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Pokazana warto¶æ wiarygodno¶ci klucza mo¿e byæ niepoprawna,\n"
+"dopóki program nie zostanie uruchomiony ponownie.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[uniewa¿niony]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "data"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"OSTRZE¯ENIE: ¿aden identyfikator u¿ytkownika nie zosta³ oznaczony explicite\n"
+"             jako g³ówny. Wykonanie tego polecenie mo¿e wiêc spowodowaæ\n"
+"             wy¶wietlanie innego identyfikatora jako domy¶lnego g³ównego.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"OSTRZE¯ENIE: To jest klucz PGP wersji 2. Dodanie zdjêcia spowoduje, ¿e\n"
+"             niektóre wersje przestan± go rozumieæ.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Czy dalej chcesz je dodaæ? (t/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Do klucza dla PGP 2.x nie mo¿na dodaæ zdjêcia.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Usun±æ ten poprawny podpis? (t/N/w) "
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Usun±æ ten niepoprawny podpis? (t/N/w) "
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Usun±æ ten nieznany podpis? (t/N/w) "
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Na pewno usun±æ ten podpis klucza nim samym? (t/N) "
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d podpis usuniêty.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d podpisów usuniêtych.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nic nie zosta³o usuniête.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "niepoprawny"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Identyfikator u¿ytkownika ,,%s'' zosta³ uniewa¿niony."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Identyfikator u¿ytkownika ,,%s'' zosta³ uniewa¿niony."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Identyfikator u¿ytkownika ,,%s'' zosta³ uniewa¿niony."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "identyfikator u¿ytkownika ,,%s'' zosta³ ju¿ uniewa¿niony\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "identyfikator u¿ytkownika ,,%s'' zosta³ ju¿ uniewa¿niony\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"OSTRZE¯ENIE: To jest klucz PGP wersji 2.x. Wyznaczenie mu klucza\n"
+"             uniewa¿niaj±cego, spowoduje, ¿e niektóre wersje PGP przestan±\n"
+"             go rozumieæ.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Do klucza dla PGP 2.x nie mo¿na wyznaczyæ klucza uniewa¿niaj±cego.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Podaj identyfikator klucza uniewa¿niaj±cego: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "klucza PGP 2.x nie mo¿na wyznaczyæ jako uniewa¿niaj±cego\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "nie mo¿na wyznaczuæ klucza do uniewa¿niania jego samego\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "OSTRZE¯ENIE: Ten klucz zosta³ uniewa¿niony kluczem uniewa¿niaj±cym!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"OSTRZE¯ENIE: nie mo¿na cofn±æ wyznaczenia klucza jako uniewa¿niaj±cego!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Czy na pewno chcesz wyznaczyæ ten klucz jako uniewa¿niaj±cy? (t/N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Proszê usun±æ znacznik wyboru z kluczy prywatnych.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Proszê wybraæ tylko jeden podklucz.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Zmiana daty wa¿no¶ci podklucza.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Zmiana daty wa¿no¶ci g³ównego klucza.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Nie mo¿na zmieniæ daty wa¿no¶ci klucza w wersji 3.\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Brak odpowiadaj±cego podpisu w zbiorze kluczy prywatnych\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "OSTRZE¯ENIE: podklucz podpisuj±cy %08lX nie jest skro¶nie podpisany\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Proszê wybraæ dok³adnie jeden identyfikator u¿ytkownika.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "podpis w wersji 3 na identyfikatorze ,,%s'' zostaje pominiêty\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Czy na pewno chcesz tego u¿yæ? (t/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Czy na pewno chcesz tego u¿yæ? (t/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Adnotacje podpisu: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Nadpisaæ (t/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Brak identyfikatora u¿ytkownika o numerze %d.\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Brak identyfikatora u¿ytkownika o numerze %d.\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Brak identyfikatora u¿ytkownika o numerze %d.\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "Identyfikator u¿ytkownika: "
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "podpisany przez %08lX w %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (podpis nieeksportowalny) "
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Wa¿no¶æ tego klucza wygas³a %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Czy dalej chcesz go uniewa¿niæ? (t/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Stworzyæ certyfikat uniewa¿nienia tego podpisu? (t/N) "
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Te identyfikatory s± podpisane przez Ciebie:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (podpis nieeksportowalny) "
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "uniewa¿niony przez %08lX w %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Czy na pewno chcesz uniewa¿niæ te podpisy:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Na pewno utworzyæ certyfikaty uniewa¿nienia ? (t/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "brak klucza tajnego\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "identyfikator u¿ytkownika ,,%s'' zosta³ ju¿ uniewa¿niony\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"OSTRZE¯ENIE: identyfikator u¿ytkownika podpisany za %d sekund (w "
+"przysz³o¶ci)\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "identyfikator u¿ytkownika ,,%s'' zosta³ ju¿ uniewa¿niony\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "identyfikator u¿ytkownika ,,%s'' zosta³ ju¿ uniewa¿niony\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Zdjêcie w formacie %s, rozmiar %ld bajtów, klucz 0x%08lX (id %d).\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "ustawienie %c%lu powtarza siê\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "zbyt wiele `%c' ustawieñ\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "zbyt wiele `%c' ustawieñ\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "zbyt wiele `%c' ustawieñ\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "niew³a¶ciwy znak w tek¶cie ustawieñ\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "zapis podpisu bezpo¶redniego\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "zapis podpisu klucza nim samym\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "zapis podpisu wi±¿±cego klucz\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "niew³a¶ciwa d³ugo¶æ klucza; wykorzystano %u bitów\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "rozmair klucza zaokr±glony do %u bitów\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "podpis"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "szyfrowanie danych"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) Klucz dla algorytmu ElGamala (tylko do szyfrowania)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Proszê wybraæ rodzaj klucza:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) Para kluczy dla algorytmów DSA i ElGamala (domy¶lne)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (tylko do podpisywania)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (tylko do szyfrowania)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Klucz dla algorytmu ElGamala (tylko do szyfrowania)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (tylko do podpisywania)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (tylko do szyfrowania)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (tylko do szyfrowania)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Para kluczy dla DSA bêdzie mia³a 1024 bity d³ugo¶ci.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Jakiej d³ugo¶ci klucz wygenerowaæ? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "¯±dana d³ugo¶æ klucza to %u bitów.\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "zaokr±glono do %u bitów\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Okres wa¿no¶æi klucza.\n"
+"         0 = klucz nie ma okre¶lonego terminu wa¿no¶ci\n"
+"      <n>  = termin wa¿no¶ci klucza up³ywa za n dni\n"
+"      <n>w = termin wa¿no¶ci klucza up³ywa za n tygodni\n"
+"      <n>m = termin wa¿no¶ci klucza up³ywa za n miesiêcy\n"
+"      <n>y = termin wa¿no¶ci klucza up³ywa za n lat\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Okres wa¿no¶æi podpisu.\n"
+"         0 = klucz nie ma okre¶lonego terminu wa¿no¶ci\n"
+"      <n>  = termin wa¿no¶ci podpisu up³ywa za n dni\n"
+"      <n>w = termin wa¿no¶ci podpisu up³ywa za n tygodni\n"
+"      <n>m = termin wa¿no¶ci podpisu up³ywa za n miesiêcy\n"
+"      <n>y = termin wa¿no¶ci podpisu up³ywa za n lat\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Okres wa¿no¶ci klucza ? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Okres wa¿no¶ci podpisu? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "niepoprawna warto¶æ\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "%s nie ma daty wa¿no¶ci\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "%s nie ma daty wa¿no¶ci\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s traci wa¿no¶æ: %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Wa¿no¶æ podpisu wygasa %s.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Twój system nie potrafi pokazaæ daty po roku 2038.\n"
+"Niemniej daty do roku 2106 bêd± poprawnie obs³ugiwane.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Czy wszystko siê zgadza (t/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Musisz podaæ identyfikator u¿ytkownika aby mo¿na by³o rozpoznaæ twój klucz;\n"
+"program z³o¿y go z twojego imienia i nazwiska, komentarza i adresu poczty\n"
+"elektronicznej. Bêdzie on mia³, na przyk³ad, tak± postaæ:\n"
+"    \"Tadeusz ¯eleñski (Boy) <tzb@ziemianska.pl>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Imiê i nazwisko: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Niew³a¶ciwy znak w imieniu lub nazwisku\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Imiê lub nazwisko nie mo¿e zaczynaæ siê od cyfry\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Imiê i nazwisko musz± mieæ conajmniej 5 znaków d³ugo¶ci.\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Adres poczty elektronicznej: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "To nie jest poprawny adres poczty elektronicznej\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Komentarz: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Niew³a¶ciwy znak w komentarzu\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "U¿ywasz zestawu znaków %s.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Twój identyfikator u¿ytkownika bêdzie wygl±da³ tak:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Nie nalezy umieszczaæ adresu poczty elektronicznej w polu nazwiska czy\n"
+"komentarza.\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "IiKkEeDdWw"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Zmieniæ (I)miê/nazwisko, (K)omentarz, adres (E)mail, czy (W)yj¶æ? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+"Zmieniæ (I)miê/nazwisko, (K)omentarz, adres (E)mail, przej¶æ (D)alej,\n"
+"czy (W)yj¶æ z programu ? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Najpierw trzeba poprawiæ ten b³±d\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Musimy wygenerowaæ du¿o losowych bajtów. Dobrym pomys³em aby pomóc "
+"komputerowi\n"
+"podczas generowania liczb pierszych jest wykonywanie w tym czasie innych\n"
+"dzia³añ (pisanie na klawiaturze, poruszanie myszk±, odwo³anie siê do "
+"dysków);\n"
+"dziêki temu generator liczb losowych ma mo¿liwo¶æ zebrania odpowiedniej "
+"ilo¶ci\n"
+"entropii.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Procedura generacji klucza zosta³a anulowana.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "zapisujê klucz publiczny w '%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "zapisujê klucz tajny w '%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "brak zapisywalnego zbioru kluczy publicznych: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "brak zapisywalnego zbioru kluczy tajnych: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "b³±d podczas zapisu zbioru kluczy publicznych ,,%s'': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "b³±d podczas zapisu zbioru kluczy tajnych ,,%s'': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "klucz publiczny i prywatny (tajny) zosta³y utworzone i podpisane.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Ten klucz nie mo¿e byæ wykorzystany do szyfrowania. Komend± \"--edit-key\"\n"
+"mo¿na dodaæ do niego podklucz szyfruj±cy.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Generacja klucza nie powiod³a siê: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"klucz zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni, lub ¼le ustawiony zegar systemowy)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"klucz zosta³ stworzony %lu sekund w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni, lub ¼le ustawiony zegar systemowy)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"UWAGA: tworzenie podkluczy dla kluczy wersji 3 jest niezgodne z OpenPGP.\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Czy na pewno utworzyæ? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "usuniêcie bloku klucza nie powiod³o siê: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "nie mo¿na utworzyæ ,,%s'': %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "UWAGA: wa¿no¶æ klucza tajnego %08lX wygas³a %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "nigdy     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Krytyczny regulamin podpisu: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Regulamin podpisu: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Krytyczne adnotacje podpisu: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Adnotacje podpisu: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Zbiór kluczy"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Odcisk klucza g³ównego:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "      Odcisk podklucza:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Odcisk klucza g³ównego:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "       Odcisk podklucza:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "     Odcisk klucza ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "opakowywanie ASCII nie powiod³o siê: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "OSTRZE¯ENIE: Istniej± dwa pliki z poufnymi informacjami.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s pozosta³ bez zmian\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s zosta³ utworzony\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Proszê usun±æ to naruszenie zasad bezpieczeñstwa\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "sprawdzanie zbioru kluczy ,,%s''\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu kluczy (%lu podpisów)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu kluczy (%lu podpisów)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: zbiór kluczy utworzony\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "podany URL regulaminu podpisów jest niepoprawny\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "OSTRZE¯ENIE: opcje w ,,%s'' nie s± jeszcze uwzglêdnione.\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "wy³kl"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "niepoprawne opcje eksportu kluczy\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "klucz ,,%s'' nie zosta³ odnaleziony: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "klucz ,,%s'' nie zosta³ odnaleziony: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "zapytanie o klucz %08lX w %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "zapytanie o klucz %08lX w %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"podpisano Twoim kluczem %08lX w %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "zapytanie o ,,%s'' w serwerze HKP %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "niepoprawne opcje eksportu kluczy\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "brak znanyk serwerów kluczy (u¿yj opcji --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "b³±d serwera kluczy"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "b³±d serwera kluczy"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "odbiór z serwera kluczy nie powiód³ siê: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s: nie jest poprawnym identyfikatorem klucza\n"
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "OSTRZE¯ENIE: nie mo¿na skasowaæ pliku tymczasowego (%s) ,,%s'': %s.\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "zapytanie o klucz %08lX w %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "zapytanie o klucz %08lX w %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "OSTRZE¯ENIE: nie mo¿na skasowaæ pliku tymczasowego (%s) ,,%s'': %s.\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "OSTRZE¯ENIE: nie mo¿na skasowaæ pliku tymczasowego (%s) ,,%s'': %s.\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "%d - dziwny rozmiar jak na zaszyfrowany klucz sesyjny\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "klucz sesyjny zaszyfrowany %s\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "dane zaszyfrowano nieznanym algorytmem numer %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "klucz publiczny %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "dane zaszyfrowane kluczem publicznym: poprawny klucz sesyjny\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "zaszyfrowano %u-bitowym kluczem %s, numer %08lX, stworzonym %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                        alias \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "zaszyfrowano kluczem %s, o numerze %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "b³±d odszyfrowywania kluczem publicznym: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "zaszyfrowane za pomoc± %lu hase³\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "zaszyfrowane jednym has³em\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "przyjmuj±c ¿e dane zosta³y zaszyfrowane za pomoc± %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "szyfr IDEA nie jest dostêpny, próba u¿ycia %s zamiast\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "odszyfrowanie poprawne\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "OSTRZE¯ENIE: wiadomo¶æ nie by³a zabezpieczona przed manipulacj±\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "OSTRZE¯ENIE: zaszyfrowana wiadomo¶æ by³a manipulowana!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "b³±d odszyfrowywania: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "UWAGA: nadawca zaznaczy³ ¿e wiadomo¶æ nie powinna byæ zapisywana\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "pierwotna nazwa pliku='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"osobny certyfikat uniewa¿nienia - u¿yj ,,gpg --import'' aby go wczytaæ\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Poprawny podpis z³o¿ony przez \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "wymuszono pominiêcie sprawdzenia podpisu\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "nie mo¿na obs³uzyæ tych wielokrotnych podpisów\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Wa¿no¶æ podpisu wygas³a %s.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                        alias \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Podpisano w %.*s kluczem %s o numerze %08lX.\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Klucz dostêpny w: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "NIEPOPRAWNY podpis z³o¿ony przez \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Przeterminowany podpis z³o¿ony przez \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Poprawny podpis z³o¿ony przez \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[niepewne]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                        alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Wa¿no¶æ podpisu wygas³a %s.\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Wa¿no¶æ podpisu wygasa %s.\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "podpis %s, skrót %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binarny"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "tekstowy"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "nieznany"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Nie mo¿na sprawdziæ podpisu: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "nie jest oddzielonym podpisem.\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"OSTRZE¯ENIE: wielokrotne podpisy. Tylko pierwszy zostanie sprawdzony.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "oddzielony podpis klasy 0x%02x.\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "podpis starego typu (PGP 2.x).\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "wykryto niepoprawny pakiet pierwotny w proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "nie mo¿na wy³±czyæ zrzutów pamiêci: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "naniesienie poprawek bazy zaufania nie powiod³o siê: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "baza zaufania: funkcja read() (n=%d) zawiod³a: %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "nie mo¿na obs³u¿yæ tego algorytmu klucza publicznego: %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "algorytm szyfruj±cy nie jest zaimplementowany"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "podpis %s, skrót %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "wymuszone u¿ycie skrótu %s (%d) k³óci siê z ustawieniami adresata\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "modu³ szyfru IDEA nie jest dostêpny\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = potrzebujê wiêcej informacji\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d jest przestarza³± opcj± ,,%s''\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "OSTRZE¯ENIE: ,,%s'' jest przestarza³± opcj±.\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "w jej miejsce nale¿y u¿yæ ,,%s%s''\"\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "OSTRZE¯ENIE: ,,%s'' jest przestarza³± opcj±.\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Nieskompresowany"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Nieskompresowany"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "ta wiadomo¶æ mo¿e nie daæ siê odczytaæ za pomoc± %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "odczyt opcji z ,,%s''\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "nieznany domy¶lny adresat ,,%s''\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Plik ,,%s'' ju¿ istnieje. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Nadpisaæ (t/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: nieznana koñcówka nazwy\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Nazwa pliku"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "zapisywanie na wyj¶cie standardowe\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "przyjêto obecno¶æ podpisanych danych w '%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "nowy plik ustawieñ ,,%s'' zosta³ utworzony\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "OSTRZE¯ENIE: opcje w ,,%s'' nie s± jeszcze uwzglêdnione.\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: katalog utworzony\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "nie mo¿na obs³u¿yæ tego algorytmu klucza publicznego: %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"OSTRZE¯ENIE: symetrycznie zaszyfrowany klucz sesyjny mo¿e nie byæ "
+"bezpieczny\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "podpakiet typu %d ma ustawiony krytyczny bit\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent nie jest dostêpny w tej sesji\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "z³y format zmiennej ¶rodowiskowej GPG_AGENT_INFO\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "wersja %d protoko³u agenta nie jest obs³ugiwana\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "nie mo¿na siê po³±czyæ z ,,%s'': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problem z agentem - zostaje wy³±czony\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (podklucz %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Musisz podaæ has³o aby odbezpieczyæ klucz tajny u¿ytkownika:\n"
+"\"%.*s\".\n"
+"Klucz o d³ugo¶ci %u bitów, typ %s, numer %08lX, stworzony %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Powtórzone has³o\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Has³o\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "anulowano przez u¿ytkownika\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "pytanie o has³o nie dzia³a w trybie wsadowym\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Podaj has³o: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Musisz podaæ has³o aby odbezpieczyæ klucz prywatny u¿ytkownika:\n"
+"\""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "d³ugo¶æ %u bitów, typ %s, numer %08lX, stworzony %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Powtórz has³o: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Wybierz zdjêcie które chcesz do³±czyæ do swojego klucza jako identyfikator.\n"
+"Musi to byæ plik w formacie JPEG. Zostanie on zapisany w Twoim kluczu\n"
+"publicznym. Je¶li bêdzie du¿y, powiêkszy to tak¿e rozmiar Twojego klucza!\n"
+"Dobry rozmiar to oko³o 240 na 288 pikseli.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Nazwa pliku ze zdjêciem w formacie JPEG: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "nie mo¿na otworzyæ pliku: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Czy na pewno chcesz tego u¿yæ? (t/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr ",,%s'' nie jest plikiem JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Czy zdjêcie jest w porz±dku? (t/N/w) "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "nie mo¿na wy¶wietliæ zdjêcia!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "nie podano przyczyny"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "klucz zosta³ zast±piony"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "klucz zosta³ skompromitowany"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "klucz nie jest ju¿ u¿ywany"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "identyfikator u¿ytkownika przesta³ byæ poprawny"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "powód uniewa¿nienia: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "komentarz do uniewa¿nienia: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMwWpP"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Brak warto¶ci zaufania dla:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                        alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Ten klucz prawdopodobnie nale¿y do tej osoby.\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = nie wiem\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = NIE ufam mu\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = ufam absolutnie\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = powrót do g³ównego menu\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " p = pominiêcie klucza\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " w = wyj¶cie\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Twoja decyzja? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Czy na pewno chcesz przypisaæ absolutne zaufanie temu kluczowi? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certyfikaty prowadz±ce do ostatecznie zaufanego klucza:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%08lX: Nie ma pewno¶ci co do to¿samo¶ci w³a¶ciciela klucza.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%08lX: Nie ma pewno¶ci co do to¿samo¶ci w³a¶ciciela klucza.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Ten klucz prawdopodobnie nale¿y do tej osoby.\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Ten klucz nale¿y do nas\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NIE MA pewno¶ci, czy klucz nale¿y do osoby wymienionej w identyfikatorze.\n"
+"Je¶li nie masz co do tego ¿adnych w±tpliwo¶ci i *naprawdê* wiesz co robisz,\n"
+"mo¿esz odpowiedzieæ ,,tak'' na nastêpne pytanie.\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "U¿yæ tego klucza pomimo to? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "OSTRZE¯ENIE: u¿ywany jest klucz nie obdarzony zaufaniem!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"OSTRZE¯ENIE: klucz %08lX móg³ zostaæ uniewa¿niony\n"
+"             (brak klucza uniewa¿niaj±cego aby to sprawdziæ)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "OSTRZE¯ENIE: Ten klucz zosta³ uniewa¿niony kluczem uniewa¿niaj±cym!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "OSTRZE¯ENIE: Ten klucz zosta³ uniewa¿niony przez w³a¶ciciela!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "             To mo¿e oznaczaæ ¿e podpis jest fa³szerstwem.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "OSTRZE¯ENIE: Ten podklucz zosta³ uniewa¿niony przez w³a¶ciciela!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Uwaga: Ten klucz zosta³ wy³±czony z u¿ytku\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Uwaga: Data wa¿no¶ci tego klucza up³ynê³a!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "OSTRZE¯ENIE: Ten klucz nie jest po¶wiadczony zaufanym podpisem!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"             Nie ma pewno¶ci co do to¿samo¶ci osoby która z³o¿y³a podpis.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "OSTRZE¯ENIE: NIE UFAMY temu kluczowi!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "             Ten podpis prawdopodobnie jest FA£SZYWY.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"OSTRZE¯ENIE: Tego klucza nie po¶wiadczaj± wystarczaj±co zaufane podpisy!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr ""
+"             Nie ma pewno¶ci co do to¿samo¶ci osoby która z³o¿y³a ten "
+"podpis.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: pominiêty: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: pominiêty: zosta³ ju¿ wybrany w innej opcji\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Nie zosta³ podany identyfikatora u¿ytkownika (np za pomoc± ,,-r'')\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Identyfikator u¿ytkownika (pusta linia oznacza koniec): "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Brak takiego identyfikatora u¿ytkownika.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "pominiêty: klucz publiczny ju¿ jest domy¶lnym adresatem\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Klucz publiczny wy³±czony z u¿ycia.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "pominiêty: zosta³ ju¿ wybrany w innej opcji\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "nieznany domy¶lny adresat ,,%s''\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: pominiêty: klucz publiczny wy³±czony z u¿ytku\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "brak poprawnych adresatów\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "b³±d tworzenia `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Podpis oddzielony od danych.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Nazwa pliku danych: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "czytam strumieñ standardowego wej¶cia\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "brak podpisanych danych\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "nie mo¿na otworzyæ podpisanego pliku ,,%s''\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "adresat anonimowy; sprawdzanie %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "OK, to my jeste¶my adresatem anonimowym.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "stary, nie obs³ugiwany algorytm szyfrowania klucza sesyjnego\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "algorytm szyfruj±cy %d%s jest nieznany, lub zosta³ wy³±czony\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "UWAGA: brak algorytmu szyfruj±cego %d w ustawieniach\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "UWAGA: wa¿no¶æ klucza tajnego %08lX wygas³a %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "UWAGA: klucz zosta³ uniewa¿niony"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "wywo³anie funkcji build_packet nie powiod³o siê: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "klucz %08lX: brak identyfikatora u¿ytkownika\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Zostanie uniewa¿niony przez:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(to jest czu³y klucz uniewazniaj±cy)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Stworzyæ certyfikat uniewa¿nienia tego klucza? (t/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "wymuszono opakowanie ASCII wyniku.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "wywo³anie funkcji make_keysig_packet nie powiod³o siê: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Certyfikat uniewa¿nienia zosta³ utworzony.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "brak kluczy uniewa¿niaj±cych dla ,,%s''\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "klucz prywatny ,,%s'' nie zosta³ odnaleziony: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "brak odpowiadaj±cego klucza publicznego: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "klucz publiczny nie pasuje do klucza prywatngeo!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Stworzyæ certyfikat uniewa¿nienia tego klucza? (t/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "nieznany algorytm ochrony\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "UWAGA: Ten klucz nie jest chroniony!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Certyfikat uniewa¿nienia zosta³ utworzony.\n"
+"\n"
+"Nale¿y przenie¶æ go na no¶nik który mo¿na bezpiecznie ukryæ; je¶li ¼li "
+"ludzie\n"
+"dostan± ten certyfikat w swoje rêce, mog± u¿yæ go do uczynienia klucza\n"
+"nieu¿ytecznym.\n"
+"\n"
+"Niez³ym pomys³em jest wydrukowanie certyfikatu uniewa¿nienia i schowanie\n"
+"wydruku w bezpiecznym miejscu, na wypadek gdyby no¶nik z certyfikatem sta³ "
+"siê\n"
+"nieczytelny. Ale nale¿y zachowaæ ostro¿no¶æ, systemy drukowania ró¿nych\n"
+"komputerów mog± zachowaæ tre¶æ wydruku i udostêpniæ j± osobom "
+"nieupowa¿nionym.\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Proszê wybraæ powód uniewa¿nienia:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Prawdopodobnie chcesz tu wybraæ %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Wprowad¼ opis (nieobowi±zkowy) i zakoñcz go pust± lini±:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Powód uniewa¿nienia: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(nie podano)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Informacje poprawne? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "tajne czê¶ci klucza s± niedostêpne\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "algorytm ochrony %d%s nie jest obs³ugiwany\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "algorytm ochrony %d%s nie jest obs³ugiwany\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Niepoprawne has³o; proszê spróbowaæ ponownie"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"OSTRZE¯ENIE: Wykryto klucz s³aby algorytmu - nale¿y ponownie zmieniæ has³o.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"tworzenie przestarza³ej 16-bitowej sumy kontrolnej dla ochrony klucza\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "wygenerowano s³aby klucz - operacja zostaje powtórzona\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"brak mo¿liwo¶ci generacji dobrego klucza dla szyfru symetrycznego;\n"
+"operacja by³a powtarzana %d razy!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "OSTRZE¯ENIE: konflikt skrótów podpisów w wiadomo¶ci\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "OSTRZE¯ENIE: podklucz podpisuj±cy %08lX nie jest skro¶nie podpisany\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"OSTRZE¯ENIE: podklucz podpisuj±cy %08lX jest niepoprawnie skro¶nie "
+"podpisany\n"
+
+#: g10/sig-check.c:181
+#, fuzzy, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "klucz publiczny %08lX jest o %lu sekundê m³odszy od podpisu\n"
+
+#: g10/sig-check.c:182
+#, fuzzy, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "klucz publiczny %08lX jest o %lu sekund(y) m³odszy od podpisu\n"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"klucz zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni, lub ¼le ustawiony zegar systemowy)\n"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"klucz zosta³ stworzony %lu sekund w przysz³o¶ci (zaburzenia\n"
+"czasoprzestrzeni, lub ¼le ustawiony zegar systemowy)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "UWAGA: klucz podpisuj±cy %08lX przekroczy³ datê wa¿no¶ci %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"podpis z³o¿ony kluczem %08lX uznany za niewa¿ny z powodu nieznanego bitu "
+"krytycznego\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "klucz %08lX: brak podklucza, którego dotyczy uniewa¿nienie\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "klucz %08lX: brak podklucza dowi±zywanego podpisem\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "nie mo¿na umie¶ciæ adnotacji w podpisach sk³adanych kluczami PGP 2.x\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"nie mo¿na umie¶ciæ adnotacji w podpisach kluczy sk³adanych kluczami PGP 2.x\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"OSTRZE¯ENIE: nie mo¿na rozwin±æ %% w URL adnotacji (jest zbyt d³ugi).\n"
+"             U¿yty zostanie nie rozwiniêty.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"nie mo¿na umie¶ciæ URL-a regulaminu w podpisach sk³adanych kluczami PGP 2.x\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"w podpisach dla PGP 2.x nie mo¿na umie¶ciæ URL-a do regulaminu podpisu\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"OSTRZE¯ENIE: nie mo¿na rozwin±æ znaczników %% w URL regulaminu\n"
+"           (jest zbyt d³ugi). U¿yty zostanie nie rozwiniêty.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"OSTRZE¯ENIE: nie mo¿na rozwin±æ znaczników %% w URL regulaminu\n"
+"           (jest zbyt d³ugi). U¿yty zostanie nie rozwiniêty.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "sprawdzenie z³o¿onego podpisu nie powiod³o siê: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s podpis z³o¿ony przez: ,,%s''\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"kluczami PGP 2 w trybie --pgp2 mo¿na podpisywaæ tylko do oddzielonych "
+"podpisów\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "wymuszone u¿ycie skrótu %s (%d) k³óci siê z ustawieniami adresata\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "podpis:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "w trybie --pgp2 mo¿na podpisywaæ tylko za pomoc± kluczy z wersji 2.x\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "zostanie u¿yty szyfr %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"klucz nie jest oznaczony jako niepewny - nie mo¿na go u¿yæ z atrap± \n"
+"generatora liczb losowych!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "pominiêty ,,%s'': duplikat\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "pominiêty ,,%s'': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "pominiêty: klucz prywatny jest ju¿ wpisany\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"pominiêty ,,%s'': wygenerowany przez PGP klucz dla algorytmu ElGamala,\n"
+"podpisy sk³adane tym kluczem nie zapewniaj± bezpieczeñstwa!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "wpis zaufania %lu, typ zapytania %d: zapis nie powiód³ siê: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Lista przypisanych warto¶ci zaufania, stworzona %s\n"
+"# (u¿yj \"gpg --import-ownertrust\" aby j± wczytaæ)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "b³±d odczytu ,,%s'': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "linia zbyt d³uga\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "b³±d: niew³a¶ciwy odcisk klucza\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "wczytanie warto¶æi zaufania"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "b³±d podczas odczytu zapisu warto¶ci zaufania: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "b³±d odczytu: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "baza zaufania: synchronizacja nie powiod³a siê %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "baza zaufania, wpis %lu: funkcja lseek() nie powiod³a siê: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "baza zaufania, wpis %lu: zapis nie powiód³ siê (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "zbyt du¿e zlecenie dla bazy zaufania\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "nie mo¿na zamkn±æ ,,%s'': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: katalog nie istnieje!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "nie mo¿na utworzyæ ,,%s'': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "nie mo¿na otworzyæ ,,%s''\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: stworzenie zapisu o wersji nie powiod³o siê: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: stworzony niepoprawny plik bazy zaufania\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: baza zaufania utworzona\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "UWAGA: nie mo¿na zapisywaæ bazy zaufania\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: niepoprawny plik bazy zaufania\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: tworzenie tablicy skrótów nie powiod³o siê: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: b³±d przy uaktualnianiu numeru wersji: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: b³±d odczytu numeru wersji: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: b³±d zapisu numeru wersji: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "baza zaufania: funkcja lseek() zawiod³a: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "baza zaufania: funkcja read() (n=%d) zawiod³a: %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: to nie jest plik bazy zaufania\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: wpis wersji z numerem %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: niew³a¶ciwa wersja pliku %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: b³±d odczytu pustego wpisu: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: b³±d zapisu wpisu katalogowego: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: zerowanie rekordu nie powiod³o siê: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: dopisanie rekordu nie powiod³o siê: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"Baza zaufania jest uszkodzona; proszê uruchomiæ ,,gpg --fix-trustdb''.\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "nie mo¿na obs³u¿yæ linii tekstu d³u¿szej ni¿ %d znaków\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "linia d³u¿sza ni¿ %d znaków\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr ",,%s'' nie jest poprawnym d³ugim numerem klucza\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "klucz %08lX: zaakceptowany jako klucz zaufany\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "klucz %08lX jest wpisany wiêcej ni¿ raz w bazie zaufania\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"klucz %08lX: brak klucza publicznego dla zaufanego klucza - pominiêty\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "klucz zosta³ oznaczony jako obdarzony absolutnym zaufaniem.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "wpis zaufania %lu, typ zapytania %d: odczyt nie powiód³ siê: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "wpis zaufania %lu jest typu innego ni¿ poszukiwany %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[uniewa¿niony]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[przeterminowany]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "nieznany"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "nigdy     "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "sprawdzanie bazy jest niepotrzebne\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "nastêpne sprawdzanie bazy odbêdzie siê %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "sprawdzanie bazy jest niepotrzebne\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "sprawdzanie bazy jest niepotrzebne\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "klucz publiczny %08lX nie odnaleziony: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "nale¿y uruchomiæ gpg z opcj± ,,--check-trustdb''\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "sprawdzanie bazy zaufania\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "przetworzono %d kluczy (rozwi±zano %d przeliczeñ zaufania)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "brak absolutnie zaufanych kluczy\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "klucz publiczny absolutnie zaufanego klucza %08lX nie odnaleziony\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "wpis zaufania %lu, typ zapytania %d: zapis nie powiód³ siê: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"nie mo¿na sprawdziæ podpisu.\n"
+"Nale¿y pamiêtaæ o podawaniu pliku podpisu (.sig lub .asc) jako pierwszego\n"
+"argumentu linii poleceñ.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "linia wej¶cia %u zbyt d³uga lub brak znaku LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "b³±d ogólny"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "nieznany typ pakietu"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "nieznana wersja"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "nieznany algorytm asymetryczny"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "nieznany algorytm skrótu"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "niepoprawny klucz publiczny"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "niepoprawny klucz prywatny"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "niepoprawny podpis"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "b³±d sumy kontrolnej"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "niepoprawne has³o"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "brak klucza publicznego"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "nieznany algorytm szyfruj±cy"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "otwarcie zbioru kluczy jest niemo¿liwe"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "niepoprawny pakiet"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "b³±d w opakowaniu ASCII"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "brak takiego identyfikatora u¿ytkownika."
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "brak klucza prywatnego"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "zosta³ u¿yty niew³a¶ciwy klucz prywatny"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "nie jest obs³ugiwany"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "niepoprawny klucz"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "b³±d przy odczycie pliku"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "b³±d przy zapisie pliku"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "nieznany algorytm kompresji"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "b³±d przy otwieraniu pliku."
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "b³±d przy tworzeniu pliku"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "niepoprawne d³ugie has³o"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algorytm szyfrowania z kluczem publicznym nie jest zaimplementowany"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algorytm szyfruj±cy nie jest zaimplementowany"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "nieznana klasa podpisu"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "b³±d w bazie zaufania"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "b³±d MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "ograniczenie zasobów"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "b³±d w zbiorze kluczy"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "niepoprawny certyfikat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "b³±d formatu identyfikatora u¿ytkownika"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "b³±d przy zamykaniu pliku"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "b³±d przy zmianie nazwy pliku"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "b³±d przy usuwaniu pliku"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "nieoczekiowane dane"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "konflikt datowników"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "nieu¿yteczny algorytm asymetryczny"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "plik ju¿ istnieje"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "klucz s³aby"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "b³êdny argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "niepoprawny URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI nie jest obs³ugiwany"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "b³±d sieci"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "nie zaszyfrowany"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "nie zosta³ przetworzony"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "bezu¿yteczny klucz publiczny"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "bezu¿yteczny klucz prywatny"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "b³±d serwera kluczy"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Anuluj"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "nie zaszyfrowany"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "brak podpisanych danych\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... to jest b³±d programu (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "znalaz³e¶(a¶) b³±d w programie ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "tak"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "tT"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nie"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "wyj¶cie"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "wW"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "l"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "OSTRZE¯ENIE: nie mo¿na zabezpieczyæ u¿ywanej pamiêci!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "obja¶nienie mo¿na przeczytaæ tutaj: http://www.gnupg.org/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "bez zabezpieczenia pamiêci nie mo¿na wykonaæ tej operacji\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(prawdopodobnie u¿ywany program jest niew³a¶ciwy dlatego zadania)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr ""
+#~ "Algorytm DSA wymaga u¿ycia algorytmu skrótu daj±cego 160-bitowy wynik.\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "wiêcej informacji jest tutaj: http://www.gnupg.org/why-not-idea.html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "nazwa adnotacji mo¿e zawieraæ tylko litery, cyfry, kropki i "
+#~ "podkre¶lenia, \n"
+#~ "i musi koñczyæ siê ,,=''\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "adnotacja u¿ytkownika musi zawieraæ znak '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "adnotacja u¿ytkownika musi zawieraæ znak '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "tre¶æ adnotacji nie mo¿e zawieraæ znaków steruj±cych\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "OSTRZE¯ENIE: niepoprawne dane w adnotacji\n"
+
+#~ msgid "not human readable"
+#~ msgstr "nieczytelne dla cz³owieka"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "wczytanie opcji z pliku"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "wczytanie opcji z pliku"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [wygasa :%s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "klucz %08lX: pominiêto - nieoczekiwana klasa podpisu (%02x)\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "nie mo¿na wykonaæ %s ,,%s'': %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Brak identyfikatora u¿ytkownika dla klucza.\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "b³±d podczas tworzenia has³a: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "niepoprawne has³o, lub nieznany algorytm szyfruj±cy (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "nie mo¿na ustawiæ numeru procesu klienckiego agenta\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "serwer nie chce czytaæ deskryptora dla agenta\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "serwer nie chce pisaæ deskryptora dla agenta\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problem z porozumiewaniem siê z agentem\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "has³o zbyt d³ugie\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "b³êdna odpowied¼ agenta\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problem agenta: zwróci³ 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "wybór podklucza N"
+
+#~ msgid "list signatures"
+#~ msgstr "lista podpisów"
+
+#~ msgid "sign the key"
+#~ msgstr "z³o¿enie podpisu na kluczu"
+
+#~ msgid "add a secondary key"
+#~ msgstr "dodanie podklucza"
+
+#~ msgid "delete signatures"
+#~ msgstr "usuniêcie podpisów"
+
+#~ msgid "change the expire date"
+#~ msgstr "zmiana daty wa¿no¶ci klucza"
+
+#~ msgid "set preference list"
+#~ msgstr "ustawienie opcji klucza"
+
+#~ msgid "updated preferences"
+#~ msgstr "aktualizacja ustawieñ klucza"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Brak podklucza o numerze %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key nazwa u¿ytkownika"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrsign-key nazwa u¿ytkownika"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "z³o¿enie podpisu oddzielonego od dokumentu"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "z³o¿enie na kluczu podpisu nie podlegaj±cego uniewa¿nieniu"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr ""
+#~ "z³o¿enie na kluczu prywatnego podpisu nie podlegaj±cego uniewa¿nieniu"
+
+#~ msgid "q"
+#~ msgstr "w"
+
+#~ msgid "help"
+#~ msgstr "pomoc"
+
+#~ msgid "list"
+#~ msgstr "lista"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "¶ledzenia"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "w³kl"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lpodpis"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "odc"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "unpod"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "b³±d ogólny"
+
+#~ msgid "passwd"
+#~ msgstr "has³o"
+
+#~ msgid "save"
+#~ msgstr "zapis"
+
+#~ msgid "fpr"
+#~ msgstr "odc"
+
+#~ msgid "uid"
+#~ msgstr "id"
+
+#~ msgid "key"
+#~ msgstr "klucz"
+
+#~ msgid "check"
+#~ msgstr "lista"
+
+#~ msgid "c"
+#~ msgstr "l"
+
+#~ msgid "sign"
+#~ msgstr "podpis"
+
+#~ msgid "s"
+#~ msgstr "p"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "podpis"
+
+#~ msgid "lsign"
+#~ msgstr "lpodpis"
+
+#~ msgid "nrsign"
+#~ msgstr "nupodpis"
+
+#~ msgid "nrlsign"
+#~ msgstr "nulpodpis"
+
+#~ msgid "adduid"
+#~ msgstr "dodid"
+
+#~ msgid "addphoto"
+#~ msgstr "dodfoto"
+
+#~ msgid "deluid"
+#~ msgstr "usid"
+
+#~ msgid "delphoto"
+#~ msgstr "usfoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "dodkl"
+
+#, fuzzy
+#~ msgid "keytocard"
+#~ msgstr "Podaj \"help\" aby zobaczyæ listê poleceñ."
+
+#~ msgid "delkey"
+#~ msgstr "uskl"
+
+#~ msgid "addrevoker"
+#~ msgstr "dodun"
+
+#~ msgid "delsig"
+#~ msgstr "uspod"
+
+#~ msgid "expire"
+#~ msgstr "data"
+
+#~ msgid "primary"
+#~ msgstr "g³ówny"
+
+#~ msgid "toggle"
+#~ msgstr "prze³"
+
+#~ msgid "t"
+#~ msgstr "p"
+
+#~ msgid "pref"
+#~ msgstr "opcje"
+
+#~ msgid "showpref"
+#~ msgstr "opcje"
+
+#~ msgid "setpref"
+#~ msgstr "ustaw"
+
+#~ msgid "updpref"
+#~ msgstr "aktopc"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "b³±d serwera kluczy"
+
+#~ msgid "trust"
+#~ msgstr "zaufanie"
+
+#~ msgid "revsig"
+#~ msgstr "unpod"
+
+#~ msgid "revuid"
+#~ msgstr "unpod"
+
+#~ msgid "revkey"
+#~ msgstr "unpkl"
+
+#~ msgid "disable"
+#~ msgstr "wy³kl"
+
+#~ msgid "enable"
+#~ msgstr "w³kl"
+
+#~ msgid "showphoto"
+#~ msgstr "foto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "w tej wersji algorytm skrótu ,,%s'' jest tylko do odczytu\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Nast±pi generacja nowej pary kluczy dla algorytmu(ów) %s.\n"
+#~ "               minimalny rozmiar klucza wynosi 768 bitów\n"
+#~ "               domy¶lny rozmiar klucza wynosi 1024 bity\n"
+#~ "  najwiêkszy sugerowany rozmiar klucza wynosi 2048 bitów\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "Klucz dla DSA musi mieæ d³ugo¶æ pomiêdzy 512 i 1024 bitow.\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "D³ugo¶æ klucza zbyt ma³a; minimalna dopuszczalna dla RSA wynosi 1024 "
+#~ "bity.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "D³ugo¶æ klucza zbyt ma³a; minimalna dopuszczona wynosi 768 bitów.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "zbyt du¿y rozmiar klucza, ograniczenie wynosi %d.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Klucze d³u¿sze ni¿ 2048 bitów s± odradzane, poniewa¿ potrzebne\n"
+#~ "obliczenia trwaj± wtedy BARDZO d³ugo!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Na pewno wygenerowaæ klucz takiej d³ugo¶ci? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Nale¿y tak¿e pamiêtaæ o tym, ¿e informacje mog± byæ te¿ wykradzione z\n"
+#~ "komputera przez pods³uch emisji elektromagnetycznej klawiatury i "
+#~ "monitora!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Nie nale¿y u¿ywaæ algorytmów do¶wiadczalnych!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "u¿ywanie tego szyfru jest odradzane; nale¿y u¿ywaæ standardowych "
+#~ "szyfrów!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "zapis do '%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "niestety, to nie dzia³a w trybie wsadowym\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "klucz ,,%s'' nie zosta³ odnaleziony: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "nie mo¿na utworzyæ ,,%s'': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "nie mo¿na otworzyæ pliku: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                        alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "klucz %08lX: klucz zosta³ uniewa¿niony!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "klucz %08lX: podklucz zosta³ uniewa¿niony!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: data wa¿no¶ci klucza up³ynê³a\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: NIE UFAMY temu kluczowi\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) Klucz dla algorytmu RSA (do szyfrowania i podpisywania)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (tylko do podpisywania)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) Klucz dla algorytmu RSA (do szyfrowania i podpisywania)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (tylko do szyfrowania)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) Klucz dla algorytmu RSA (do szyfrowania i podpisywania)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: nie mo¿na otworzyæ: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: OSTRZE¯ENIE: plik jest pusty\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "nie mo¿na otworzyæ %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = mam ograniczone zaufanie\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = mam pe³ne zaufanie\n"
+
+#~ msgid "Really sign? "
+#~ msgstr "Czy na pewno podpisaæ? "
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "data"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "lokalnie podpisano Twoim kluczem %08lX w %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "podpisany przez %08lX w %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: dostêp niemo¿liwy: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: nie mo¿na utworzyæ blokady\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: nie mo¿na utworzyæ blokady\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: nie mo¿na utworzyæ: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: nie mo¿na utworzyæ katalogu: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Je¶li mimo wszystko chcesz u¿yæ tego uniewa¿nionego klucza, odpowiedz ,,"
+#~ "tak''."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Nie mo¿na otworzyæ zdjêcia ,,%s'': %s.\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "nie mo¿na otworzyæ pliku: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "b³±d: brak dwukropka\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "b³±d: brak warto¶æi zaufania w³a¶ciciela\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (podklucz %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "un! podklucz zosta³ uniewa¿niony: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "un- fa³szywy certyfikat uniewa¿nienia\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "un? problem przy sprawdzaniu uniewa¿nienia: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [wygasa :%s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [wygasa :%s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[uniewa¿niony]"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "nie mo¿na utworzyæ %s: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "OSTRZE¯ENIE: algorytm skrótu ,,%s'' nie jest czê¶ci± standardu OpenPGP.\n"
+#~ "             U¿ywasz go na w³asn± odpowiedzialno¶æ!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[pliki]|szyfrowanie plików"
+
+#~ msgid "store only"
+#~ msgstr "zapis danych w formacie OpenPGP"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[pliki]|odszyfrowywanie plików"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr ""
+#~ "z³o¿enie na kluczu podpisu nie podlegaj±cego \n"
+#~ "uniewa¿nieniu"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr ""
+#~ "z³o¿enie na kluczu podpisu prywatnego,\n"
+#~ "nie podlegaj±cego uniewa¿nieniu"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "wypisane sekwencji pakietów"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "eksport warto¶ci zaufania"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "bezobs³ugowe uaktualnienie bazy zaufania"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "naprawa uszkodzonej bazy zaufania"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "zdjêcie opakowania ASCII pliku lub potoku"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "opakowanie ASCII pliku lub potoku"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NAZWA|u¿ycie NAZWA jako domy¶lnego adresata"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "domy¶lny klucz jest domy¶lnym adresatem"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "bez odwo³añ do terminala"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "wymuszenie trzeciej wersji formatu podpisów"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "bez wymuszania trzeciej wersji formatu podpisów"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "wymuszenie czwartej wersji formatu podpisów"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "bez wymuszania czwartej wersji formatu podpisów"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "do szyfrowania bêdzie u¿ywany MDC"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "do szyfrowania nie zostanie u¿yty MDC"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "wykorzystanie agenta zarz±dzania has³ami"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "tryb wsadowy: ¿adnych pytañ"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "automatyczna odpowied¼ tak na wiêkszo¶æ pytañ"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "automatyczna odpowied¼ nie na wiêkszo¶æ pytañ"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "dodanie zbioru kluczy do u¿ywanych"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "dodanie zbioru kluczy tajnych do u¿ywanych"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NAZWA|ustawienie NAZWA jako domy¶lnego klucza prywatnego"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|serwer kluczy w którym bêd± poszukiwane"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NAZWA| strona kodowa wy¶wietlanego tekstu"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[plik]|pisanie opisu stanu do pliku"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KLUCZ|ustawienie klucza jako ca³kowicie zaufanego"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|PLIK|³adowanie modu³u rozszerzenia z PLIK"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emulacja trybu opisanego w RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "tryb zgodno¶ci formatu pakietów, szyfrów i skrótów z OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "tryb zgodno¶ci formatów, szyfrów i skrótów z PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|N-ty tryb obliczania has³a"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|ALG|wymuszenie algorytmu skrótu has³a ALG"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|ALG|wymuszenie algorytmu szyfruj±cego ALG dla has³a"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NAZWA|wymuszenie algorytmu szyfruj±cego NAZWA"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NAZWA|wymuszenie algorytmu skrótu  NAZWA"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|wymuszenie algorytmu kompresji N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "usuniêcie numerów kluczy adresatów z szyfrogramów"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "okazywanie zdjêcia - identyfikatora u¿ytkownika"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "bez pokazywania zdjêæ"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "polecenie wywo³uj±ce przegl±darkê do zdjêæ"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "w tej wersji kompresja ,,%s'' jest tylko do odczytu\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "ustawienie kompresji musi pochodziæ z zakresu %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Nie ma pewne, do do kogo nale¿y ten klucz, ale jest akceptowalny.\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "ustawienie %c%lu jest niepoprawne\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "klucz %08lX: nie jest w formacie RFC 2440 - pominiêty\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "UWAGA: Wykryto klucz g³ówny algorytmu ElGamala. Jego import potrwa jaki¶ "
+#~ "czas.\n"
+
+#~ msgid " (default)"
+#~ msgstr "(domy¶lnie)"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  utworzony: %s, wygasa: %s"
+
+#~ msgid "Policy: "
+#~ msgstr "Regulamin: "
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "nie mo¿na pobraæ klucza z serwera: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "b³±d przy wysy³aniu do ,,%s'': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "wysy³anie do ,,%s'' powiod³o siê (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "wysy³anie do ,,%s'' nie powiod³o siê (status=%u)\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "ten serwer kluczy nie umo¿liwia przeszukiwania\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "nie mo¿na przeszukaæ serwera: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "klucz %08lX: Klucz algorytmu ElGamala wygenerowany przez PGP \n"
+#~ "              - podpisy nim sk³adane nie zapewniaj± bezpieczeñstwa!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "klucz %08lX zosta³ stworzony %lu sekundê w przysz³o¶ci (zaburzenia\n"
+#~ "czasoprzestrzeni, lub ¼le ustawiony zegar systemowy)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "klucz %08lX zosta³ stworzony %lu sekund(y) w przysz³o¶ci (zaburzenia\n"
+#~ "czasoprzestrzeni, lub ¼le ustawiony zegar systemowy)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "klucz %08lX zosta³ oznaczony jako obdarzony absolutnym zaufaniem\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "podpis kluczem podpisuj±cym ElGamala %08lX na %08lX zosta³ pominiêty\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "podpis kluczem %08lX na kluczu podpisuj±cym ElGamala %08lX zosta³ "
+#~ "pominiêty\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "sprawdzanie na g³êboko¶ci %d podpisów =%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%"
+#~ "d)\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Wybór algorytmu.\n"
+#~ "\n"
+#~ "DSA (zwany te¿ DSS) to algorytm podpisu cyfrowego i tylko do sk³adania\n"
+#~ "podpisów mo¿e byæ u¿ywany. Jest to algorytm preferowany, gdy¿\n"
+#~ "sk³adane nim podpisy sprawdza siê du¿o szybciej ni¿ te sk³adane\n"
+#~ "algorytmem ElGamala.\n"
+#~ "\n"
+#~ "Algorytm ElGamala mo¿e byæ u¿ywany zarówno do podpisów jak i do "
+#~ "szyfrowania.\n"
+#~ "Standard OpenPGP rozró¿nia dwa typy tego algorytmu - tylko do "
+#~ "szyfrowania,\n"
+#~ "oraz do szyfrowania i podpisywania. Algorytm pozostaje bez zmian ale "
+#~ "pewne\n"
+#~ "parametry musz± byæ odpowiednio dobrane aby stworzyæ klucz którym mo¿na\n"
+#~ "sk³adaæ bezpieczne podpisy. Ten program obs³uguje oba typy ale inne\n"
+#~ "implementacje nnie musz± rozumieæ kluczy do podpisów i szyfrowania\n"
+#~ "\n"
+#~ "G³ówny klucz musi byæ kluczem podpisuj±cym, jest to powodem dla\n"
+#~ "którego w tym menu nie ma mo¿no¶ci wyboru klucza ElGamala do\n"
+#~ "szyfrowania."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Ten typ klucza jest zdefiniowany w RFC2440, jednak¿e jest on odradzany, "
+#~ "gdy¿\n"
+#~ "nie jest obs³ugiwany przez wszystkie programy zgodne z OpenPGP, a podpisy "
+#~ "nim\n"
+#~ "sk³adane s± du¿e i ich sprawdzanie trwa d³ugo."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu kluczy do tej chwili (%lu podpisów)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "klucz jest niekompletny\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "klucz %08lX nie jest kompletny\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "wyj¶cie"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr ""
+#~ "   (%d) Klucz dla algorytmu ElGamala (do szyfrowania i podpisywania)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "Ten algorytm szyfruj±cy jest u¿ywany tylko przez GnuPG. Tego klucza nie "
+#~ "bêdzie\n"
+#~ "mo¿na u¿yæ do ³±czno¶ci z u¿ytkownikami PGP. Wybrany algorytm jest tak¿e\n"
+#~ "bardzo powolny, oraz mo¿e nie byæ tak bezpieczny jak pozosta³e dostêpne.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Stworzyæ klucz pomimo to? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "odnaleziono odwo³anie do niepoprawnego szyfru (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "serwer kluczy nie jest w pe³ni zgodny z HKP\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr "U¿ywanie tego algorytmu jest odradzane - tworzyæ mimo to? "
+
+#, fuzzy
+#~ msgid ""
+#~ "you have to start GnuPG again, so it can read the new configuration file\n"
+#~ msgstr "aby u¿yæ nowego pliku ustawieñ, nale¿y od nowa uruchomiæ GnuPG\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "zmiana uprawnieñ do `%s' nie powiod³a siê: %s\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "                  Odcisk:"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NAZWA=TRE¦Æ|adnotacje"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr "adnotacja musi zaczynaæ siê od podkre¶lenia lub litery\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr "kropki w adnotacji musz± znajdowaæ siê pomiêdzy innymi znakami\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "OSTRZE¯ENIE: Do tego klucza dodano ju¿ zdjêcie u¿ytkownika.\n"
+#~ "             Dodanie drugiego spowoduje, ¿e niektóre wersje PGP "
+#~ "przestan±\n"
+#~ "             rozumieæ ten klucz.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Do klucza mo¿na do³±czyæ tylko jedno zdjêcie.\n"
+
+#~ msgid "Are you sure you still want to sign it?\n"
+#~ msgstr "Czy na pewno chcesz to podpisaæ?\n"
+
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "  Czy na pewno chcesz go podpisaæ?\n"
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "Czy naprawdê potrzebujesz takiego d³ugiego klucza? "
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "klucz %08lX: dostêpna kopia nie jest podpisana ni± sam±\n"
+
+#~ msgid "   signed by %08lX at %s\n"
+#~ msgstr "podpisany przez %08lX w %s\n"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key nazwa u¿ytkownika"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key nazwa u¿ytkownika"
+
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-and-public-key key nazwa u¿ytkownika"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "pominiêty: klucz publiczny ju¿ wybrany w --encrypt-to\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "WARNING: This is a PGP2-style key\n"
+#~ msgstr ""
+#~ "\n"
+#~ "OSTRZE¯ENIE: Klucz z PGP wersji 2.\n"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "iIpPwW"
+
+#~ msgid "duplicate (short) key ID %08lX\n"
+#~ msgstr "skrócony numer klucza siê powtarza %08lX\n"
+
+#~ msgid "%lu key(s) to refresh\n"
+#~ msgstr "%lu klucz(y) do od¶wie¿enia\n"
+
+#~ msgid "too many random bits requested; the limit is %d\n"
+#~ msgstr "¿±danie zbyt wielu losowych bitów; ograniczenie wynosi %d\n"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NAZWY]|sprawdzenie bazy zaufania"
+
+#~ msgid "For info see http://www.gnupg.org"
+#~ msgstr "Dalsze informacje znajduj± siê na http://www.gnupg.org/"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Niemo¿liwe jest znalezienie poprawnej scie¿ki zaufania do tego klucza.\n"
+#~ "Sprawd¼my czy mo¿na przypisaæ brakuj±ce warto¶ci zaufania.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Brak ¶cie¿ki prowadz±cej do którego¶ z naszych kluczy.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Brak certyfikatów o niezdefiniowanym poziomie zaufania.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Parametry zaufania nie zosta³y zmienione.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr "%08lX: brak informacji aby obliczyæ prawdopodobieñstwo zaufania\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: b³±d podczas sprawdzania klucza: %s\n"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr "Czy na pewno chcesz stworzyæ klucz do szyfrowania i podpisywania? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: nie znaleziono u¿ytkownika %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "b³±d przy odczycie certyfikatu: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr "zbyt wiele wpisów w buforze nieznanych kluczy - wy³±czony\n"
+
+#~ msgid "no default public keyring\n"
+#~ msgstr "brak domy¶lnego zbioru kluczy publicznych\n"
+
+#~ msgid "secret key %08lX not imported (use %s to allow for it)\n"
+#~ msgstr "klucz tajny %08lX nie zosta³ wczytany (aby to zrobiæ u¿yj %s)\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: nie znaleziono u¿ytkownika\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr ""
+#~ "przyjêto niepoprawno¶æ MDC z powonu ustawienia nieznanego bitu "
+#~ "krytycznego\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "b³±d odczytu wpisu katalogowego dla LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr "lid %lu: oczekiwany wpis katalogowy, napotkano typ %d\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "brak klucza g³ównego dla LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "b³±d odczytu g³ównego klucza dla LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "klucz %08lX: wyszukanie zapisu nie powiod³o siê\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "klucz %08lX: ju¿ znajduje siê w tablicy kluczy zaufanych\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "UWAGA: klucz tajny %08lX NIE jest chroniony.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr "klucz %08lX: klucz tajny nie pasuje do klucza jawnego\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "klucz %08lX.%lu Dobre dowi±zanie podklucza\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "klucz %08lX.%lu: Niepoprawne dowi±zanie podklucza %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "klucz %08lX.%lu: Poprawne uniewa¿nienie klucza\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "klucz %08lX.%lu: Niew³a¶ciwe uniewa¿nienie klucza: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Poprawny podpis klucza nim samym"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Niepoprawny podpis klucza nim samym"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr ""
+#~ "Poprawne uniewa¿nienie identyfikatora u¿ytkownika pominiête z powodu\n"
+#~ "nowszego podpisu tym samym kluczem"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Poprawne uniewa¿nienie identyfikatora u¿ytkownika"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Niepoprawne uniewa¿nienie identyfikatora u¿ytkownika"
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Poprawne uniewa¿nienie certyfikatu"
+
+#~ msgid "Good certificate"
+#~ msgstr "Poprawny certyfikat"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Niepoprawne uniewa¿nienie certyfikatu"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Niepoprawny certyfikat"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "zapis o podpisach %lu[%d] wskazuje na z³y wpis.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "podwójny certyfikat - usuniêty"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "Procedura tdbio_search_dir nie powiod³a siê: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: wpisanie nie powiod³o siê: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: wpisanie nie powiod³o siê: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: wpisany\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu kluczy wpisanych\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: wpis katalogowy bez bloku klucza - pominiêty\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "        %lu z powodu nowych podkluczy\n"
+
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu kluczy pominiêtych\n"
+
+#~ msgid "\t%lu keys updated\n"
+#~ msgstr "\t%lu kluczy uaktualnionych\n"
+
+#~ msgid "Ooops, no keys\n"
+#~ msgstr "Oops, brak kluczy\n"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Oops, brak identyfikatorów u¿ytkowników\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr "check_trust: poszukiwanie wpisu katalogowego nie powiod³o siê: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr "klucz %08lX: wprowadzenie wpisu zaufania nie powiod³o siê: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "Klucz %08lX.%lu: wprowadzony do bazy zaufania\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "Klucz %08lX.%lu: stworzony w przysz³o¶ci (zaburzenia czasoprzestrzeni,\n"
+#~ "lub ¼le ustawiony zegar systemowy)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "klucz %08lX.%lu: okres wa¿no¶ci up³yn±³ %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "klucz %08lX.%lu: b³±d przy sprawdzaniu zaufania: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr "problem podczas szukania '%s' w bazie zaufania: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr "brak u¿ytkownika '%s' w bazie zaufania - dodano\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "umieszczenie '%s' w Bazie Zaufania nie powiod³o siê: %s\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr "OSTRZE¯ENIE: d³ugie wpisy ustawieñ jeszcze nie s± obs³ugiwane.\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: stworzenie zbioru kluczy jest niemo¿liwe: %s\n"
+
+#~ msgid "RSA key cannot be used in this version\n"
+#~ msgstr "W tej wersji nie mo¿na u¿ywaæ kluczy RSA\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "Brak klucza z takim identyfikatorem u¿ytkownika.\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "odszyfrowuj±cy klucz tajny do jest niedostêpny\n"
+
+#~ msgid "set debugging flags"
+#~ msgstr "ustawienie opcji ¶ledzenia wykonania programu"
+
+#~ msgid "enable full debugging"
+#~ msgstr "umo¿liwienie pe³nego ¶ledzenia programu"
+
+#~ msgid "do not write comment packets"
+#~ msgstr "nie zapisywaæ pakietów z komentarzem"
+
+#~ msgid "(default is 3)"
+#~ msgstr "(domy¶lnie 3)"
+
+#~ msgid "   (%d) ElGamal in a v3 packet\n"
+#~ msgstr ""
+#~ "   (%d) Klucz dla algorytmu ElGamala w pakiecie w trzeciej wersji "
+#~ "formatu\n"
+
+#~ msgid "Key generation can only be used in interactive mode\n"
+#~ msgstr "Generacjê klucza mo¿na wykonywaæ tylko w trybie interaktywnym\n"
+
+#~ msgid ""
+#~ "RSA keys are deprecated; please consider creating a new key and use this "
+#~ "key in the future\n"
+#~ msgstr ""
+#~ "Odradza siê stosowanie kluczy RSA; proszê rozwa¿yæ przej¶cie na inne "
+#~ "algorytmy\n"
+#~ "po wygenerowaniu odpowiednich kluczy.\n"
+
+#~ msgid "print all message digests"
+#~ msgstr "wszystkie skróty wiadomo¶ci"
+
+#~ msgid "can't lock keyring `%': %s\n"
+#~ msgstr "nie mo¿na zablokowaæ zbioru kluczy publicznych: %s\n"
+
+#~ msgid "error writing keyring `%': %s\n"
+#~ msgstr "b³±d zapisu zbioru kluczy '%': %s\n"
+
+#~ msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but marked as checked\n"
+#~ msgstr ""
+#~ "UWAGA: wpis podpisu %lu[%d] znajduje siê w li¶cie domy¶lnej %lu,\n"
+#~ "ale jest zaznaczony jako sprawdzony.\n"
+
+#~ msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but not marked\n"
+#~ msgstr ""
+#~ "UWAGA: wpis podpisu %lu[%d] znajduje siê w li¶cie domy¶lnej %lu,\n"
+#~ "ale nie jest zaznaczony.\n"
+
+#~ msgid "sig rec %lu[%d] in hintlist of %lu does not point to a dir record\n"
+#~ msgstr ""
+#~ "wpis oi podpisie %lu[%d] w li¶cie domy¶lnej %lu nie wskazuje \n"
+#~ "na wpis katalogowy\n"
+
+#~ msgid "lid %lu: no primary key\n"
+#~ msgstr "lid %lu: brak klucza g³ównego\n"
+
+#~ msgid "lid %lu: user id not found in keyblock\n"
+#~ msgstr ""
+#~ "lid %lu: identyfikator u¿ytkownika nie zosta³ odnaleziony w bloku klucza\n"
+
+#~ msgid "lid %lu: self-signature in hintlist\n"
+#~ msgstr "lid %lu: podpis klucza nim samym w li¶cie domy¶lnej\n"
+
+#~ msgid "very strange: no public key\n"
+#~ msgstr "bardzo dziwne: brak klucza publicznego\n"
+
+#~ msgid "hintlist %lu[%d] of %lu does not point to a dir record\n"
+#~ msgstr "lista domy¶lna %lu[%d] z %lu nie wskazuje na wpis katalogowy\n"
+
+#~ msgid "lid %lu: can't get keyblock: %s\n"
+#~ msgstr "lid %lu: pobranie bloku klucza niemo¿liwe: %s\n"
+
+#~ msgid "Too many preference items"
+#~ msgstr "Zbyt wiele pozycji w ustawieniach"
+
+#~ msgid "public key not anymore available"
+#~ msgstr "klucz publiczny jest ju¿ niedostêpny"
+
+#~ msgid "uid %08lX.%lu/%02X%02X: has shadow dir %lu but is not yet marked.\n"
+#~ msgstr ""
+#~ "identyfikator %08lX.%lu/%02X%02X: ma zdublowany katalog %lu,\n"
+#~ "ale nie jest jeszcze zaznaczony.\n"
+
+#~ msgid "insert_trust_record: keyblock not found: %s\n"
+#~ msgstr "insert_trust_record: brak bloku klucza: %s\n"
+
+#~ msgid "lid %lu: update failed: %s\n"
+#~ msgstr "lid %lu: naniesienie poprawek nie powiod³o siê: %s\n"
+
+#~ msgid "lid %lu: updated\n"
+#~ msgstr "lid %lu: uaktualniony\n"
+
+#~ msgid "lid %lu: okay\n"
+#~ msgstr "lid %lu: OK\n"
+
+#~ msgid "%s: update failed: %s\n"
+#~ msgstr "%s: zapis zmian nie powiod³ siê: %s\n"
+
+#~ msgid "%s: updated\n"
+#~ msgstr "%s: uaktualniony\n"
+
+#~ msgid "%s: okay\n"
+#~ msgstr "%s: OK\n"
+
+#~ msgid "lid %lu: keyblock not found: %s\n"
+#~ msgstr "lid %lu: blok klucza nie zosta³ odnaleziony: %s\n"
+
+#~ msgid "edit_ownertrust.value"
+#~ msgstr ""
+#~ "Przypisanie tych warto¶ci nale¿y do Ciebie, nie bêd± one udostêpnione\n"
+#~ "nikomu innemu. S± one u¿ywane do stworzenia sieci zaufania i nie ma\n"
+#~ "to nic wspólnego z tworzon± sieci± certyfikatów."
+
+#~ msgid "revoked_key.override"
+#~ msgstr ""
+#~ "Je¶li mimo wszystko chcesz u¿yæ tego uniewa¿nionego klucza, odpowiedz "
+#~ "\"tak\"."
+
+#~ msgid "untrusted_key.override"
+#~ msgstr ""
+#~ "Je¶li mimo wszystko chcesz u¿yæ tego klucza, klucza do którego nie masz\n"
+#~ "zaufania, odpowiedz \"tak\"."
+
+#~ msgid "pklist.user_id.enter"
+#~ msgstr "Podaj identyfikator u¿ytkownika adresata tych informacji."
+
+#~ msgid "keygen.algo"
+#~ msgstr ""
+#~ "Wybór algorytmu:\n"
+#~ "DSA (znany te¿ jako DSS) to Algorytm Podpisu Cyfrowego - u¿ywaæ go mo¿na "
+#~ "tylko\n"
+#~ "do tworzenia cyfrowych podpisów. Jego wybór jest sugerowany poniewa¿\n"
+#~ "sprawdzanie podpisów z³o¿onych algorytmem DSA jest du¿o szybsze ni¿ tych\n"
+#~ "z³o¿onych algorytmem ElGamala.\n"
+#~ "Algorytm ElGamala to algorytm klucza publicznego który nadaje mo¿na "
+#~ "stosowaæ\n"
+#~ "zarówno do szyfrowania jak i do tworzenia podpisów cyfrowych\n"
+#~ "W standardzie OpenPGP algorytm ElGamala wystêpuje w dwóch wersjach:\n"
+#~ "obs³uguj±cej podpisywanie, oraz obs³uguj±cej podpisywanie i szyfrowanie; "
+#~ "z\n"
+#~ "technicznego punktu widzenia algorytm dzia³a tak samo, ale pewne "
+#~ "wspó³czynniki\n"
+#~ "musz± byæ dobrane tak aby klucz nadawa³ siê do sk³adania bezpiecznych\n"
+#~ "podpisów. Ten program obs³uguje obie wersje, ale inne implementacje "
+#~ "OpenPGP\n"
+#~ "nie musz± rozumieæ obs³ugiwaæ klucza przeznaczonego jednocze¶nie do\n"
+#~ "podpisywania i szyfrowania.\n"
+#~ "G³ówny klucz musi byæ zawsze kluczem s³u¿±cym umo¿liwiaj±cym "
+#~ "podpisywanie,\n"
+#~ "dlatego te¿ ten program nie obs³uguje osobnych kluczy ElGamala s³u¿±cych "
+#~ "tylko\n"
+#~ "do szyfrowania."
+
+#~ msgid "keygen.algo.elg_se"
+#~ msgstr ""
+#~ "Mimo ¿e ten rodzaj kluczy jest zdefiniowany w RFC 2440, wybór takiego "
+#~ "klucza\n"
+#~ "nie jest sugerowany. Nie wszystkie programy taki klucz s± w stanie "
+#~ "obs³u¿yæ,\n"
+#~ "a podpisy z³o¿one za jego pomoc± s± du¿e i ich sprawdzenie zajmuje du¿o "
+#~ "czasu."
+
+#~ msgid "keygen.size"
+#~ msgstr "Rozmiar klucza"
+
+#~ msgid "keygen.size.huge.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "keygen.size.large.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "keygen.valid"
+#~ msgstr "Podaj ¿±dan± warto¶æ"
+
+#~ msgid "keygen.valid.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "keygen.name"
+#~ msgstr "Podaj nazwê (imiê, nazwisko) w³a¶ciciela klucza"
+
+#~ msgid "keygen.email"
+#~ msgstr "Adres e-mail (opcjonalny ale warto go wpisaæ)"
+
+#~ msgid "keygen.userid.cmd"
+#~ msgstr ""
+#~ "I  - zmiana imienia lub nazwiska.\n"
+#~ "K  - zmiana komentarza.\n"
+#~ "E  - zmiana adresu email.\n"
+#~ "D  - przej¶cie do w³a¶ciwej generacji klucza.\n"
+#~ "W  - wyj¶cie z procedury generacji i z programu."
+
+#~ msgid "keygen.sub.okay"
+#~ msgstr ""
+#~ "Odpowiedz \"tak\" (lub po prostu \"t\") je¶li zgadzasz siê na stworzenie "
+#~ "podklucza."
+
+#~ msgid "sign_uid.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "change_passwd.empty.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "keyedit.save.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "keyedit.cancel.okay"
+#~ msgstr "Odpowiedz \"tak\" lub \"nie\""
+
+#~ msgid "keyedit.sign_all.okay"
+#~ msgstr ""
+#~ "Odpowiedz \"tak\" je¶li chcesz podpisaæ wszystkie identyfikatory klucza"
+
+#~ msgid "keyedit.remove.uid.okay"
+#~ msgstr ""
+#~ "Odpowiedz \"tak\" je¶li na pewno chcesz skasowaæ ten identyfikator "
+#~ "klucza.\n"
+#~ "Utracisz wszystkie podpisy innych u¿ytkowników z³o¿one na tym "
+#~ "identyfikatorze!"
+
+#~ msgid "keyedit.remove.subkey.okay"
+#~ msgstr "Odpowiedz \"tak\" je¶li na pewno chcesz skasowaæ ten podklucz"
+
+#~ msgid "passphrase.enter"
+#~ msgstr ""
+#~ "Proszê wprowadziæ wyra¿enie przej¶ciowe (tajne zdanie)\n"
+#~ "  Bla, bla, bla ..."
+
+#~ msgid "passphrase.repeat"
+#~ msgstr ""
+#~ "Proszê powtórzyæ podane wyra¿enie przej¶ciowe dla wyeliminowania pomy³ek."
+
+#~ msgid "detached_signature.filename"
+#~ msgstr "Nazwa pliku którego dotyczy ten podpis"
+
+#~ msgid "openfile.overwrite.okay"
+#~ msgstr "Odpowiedz \"tak\" je¶li na pewno chcesz nadpisaæ ten plik"
+
+#~ msgid "writing keyblock\n"
+#~ msgstr "zapisujê blok klucza\n"
+
+#~ msgid "can't write keyblock: %s\n"
+#~ msgstr "nie mogê zapisaæ bloku klucza: %s\n"
+
+#~ msgid "encrypted message is valid\n"
+#~ msgstr "zaszyfrowana wiadomo¶æ jest poprawna\n"
+
+#~ msgid "Can't check MDC: %s\n"
+#~ msgstr "Sprawdzenie MDC niemo¿liwe: %s\n"
+
+#~ msgid "Usage: gpgm [options] [files] (-h for help)"
+#~ msgstr "Wywo³anie: gpgm [opcje] [pliki] (-h podaje pomoc)"
+
+#~ msgid "usage: gpgm [options] "
+#~ msgstr "sposób u¿ycia: gpgm [opcje]"
+
+#~ msgid "chained sigrec %lu has a wrong owner\n"
+#~ msgstr "powi±zany rekord podpisu %lu ma niew³a¶ciwego w³a¶ciciela\n"
+
+#~ msgid "lid %lu: read dir record failed: %s\n"
+#~ msgstr "lid %lu: odczyt wpisu katalogowego nie powiód³ siê: %s\n"
+
+#~ msgid "lid %lu: read key record failed: %s\n"
+#~ msgstr "lid %lu: odczyt wpisu klucza nie powiód³ siê: %s\n"
+
+#~ msgid "lid %lu: read uid record failed: %s\n"
+#~ msgstr "lid %lu: odczyt wpisu z identyfikatorem nie powiód³ siê; %s\n"
+
+#~ msgid "lid %lu: read pref record failed: %s\n"
+#~ msgstr "lid %lu: odczyt wpisu ustawieñ nie powiód³ siê: %s\n"
+
+#~ msgid "user '%s' read problem: %s\n"
+#~ msgstr "u¿ytkownik '%s' b³±d przy odczycie: %s\n"
+
+#~ msgid "user '%s' list problem: %s\n"
+#~ msgstr "u¿ytkownik '%s' b³±d listy: %s\n"
+
+#~ msgid "user '%s' not in trustdb\n"
+#~ msgstr "brak u¿ytkownika '%s' w bazie zaufania\n"
+
+#~ msgid "directory record w/o primary key\n"
+#~ msgstr "wpis katalogowy bez klucza g³ównego\n"
+
+#~ msgid "key not in trustdb, searching ring.\n"
+#~ msgstr "brak klucza w bazie zaufania, przeszukiwany jest zbiór kluczy\n"
+
+#~ msgid "key not in ring: %s\n"
+#~ msgstr "klucza nie ma w zbiorze: %s\n"
+
+#~ msgid "Oops: key is now in trustdb???\n"
+#~ msgstr "Oops: klucz ju¿ jest w bazie zaufania???\n"
+
+#~ msgid "Hmmm, public key lost?"
+#~ msgstr "Hmmm, klucz publiczny utracony?"
+
+#~ msgid "did not use primary key for insert_trust_record()\n"
+#~ msgstr "g³owny klucz nie zosta³ u¿yty w procedurze insert_trust_record()\n"
+
+#~ msgid "second"
+#~ msgstr "sekunda"
+
+#~ msgid "seconds"
+#~ msgstr "sekund"
+
+#~ msgid "invalid clear text header: "
+#~ msgstr "niepoprawny nag³ówek tekstu jawnego:"
+
+#~ msgid "This key belongs to us (we have the secret key)\n"
+#~ msgstr "Ten klucz nale¿y do nas (mamy odpowiadaj±cy mu klucz tajny).\n"
+
+# %d niepoprawnych podpisów
+#~ msgid "You will see a list of signators etc. here\n"
+#~ msgstr "Tu uka¿e siê lista podpisów itd.\n"
diff --git a/po/pt.gmo b/po/pt.gmo
new file mode 100644 (file)
index 0000000..a878c39
Binary files /dev/null and b/po/pt.gmo differ
diff --git a/po/pt.po b/po/pt.po
new file mode 100644 (file)
index 0000000..528bebc
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,7207 @@
+# pt messages for gnupg
+# Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Pedro Morais <morais@kde.org>
+#
+# Based on pt_PT work done by:
+# Thiago Jung Bauermann <jungmann@cwb.matrix.com.br>
+# Rafael Caetano dos Santos <rcaetano@linux.ime.usp.br>
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2002-09-13 18:26+0100\n"
+"Last-Translator: Pedro Morais <morais@kde.org>\n"
+"Language-Team: pt <morais@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr ""
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr ""
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "nenhum módulo de recolha de entropia detectado\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "impossível abrir `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "impossível 'stat' a `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' não é um ficheiro normal - ignorado\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "nota: random_seed está vazia\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"AVISO: o ficheiro random_seed tem um tamanho inválido - não utilizado\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "impossível ler `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "nota: ficheiro random_seed não actualizado\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "impossível criar `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "impossível escrever `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "impossível fechar `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "AVISO: a utilizar gerador de números aleatórios inseguro!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"O gerador de números aleatórios é apenas um \"remendo\"\n"
+"para poder funcionar - não é de modo algum um bom gerador!\n"
+"\n"
+"NÃO USE NENHUM DADO GERADO POR ESTE PROGRAMA!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Não há bytes aleatórios suficientes. Por favor, faça outro trabalho para\n"
+"que o sistema possa recolher mais entropia! (São necessários mais %d bytes)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "falha ao inicializar a base de dados de confiança: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "falha ao criar 'cache' do porta-chaves: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "remoção do bloco de chave falhou: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "erro na criação da frase secreta: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "erro na leitura do bloco de chave: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: erro ao ler registo livre: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "%s' já comprimido\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "gerar um novo par de chaves"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "falha ao inicializar a base de dados de confiança: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "remoção do bloco de chave falhou: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "assinatura %s de: \"%s\"\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "nenhum dado OpenPGP válido encontrado.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armadura: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "cabeçalho de armadura inválido: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "cabeçalho de armadura: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "cabeçalho de assinatura em texto puro inválido\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "assinaturas em texto puro aninhadas\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "armadura inesperada:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "linha com hífen inválida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "caracter radix64 inválido %02x ignorado\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "fim de ficheiro prematuro (sem CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "fim de ficheiro prematuro (no CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC malformado\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "erro de CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "fim de ficheiro prematuro (no \"Trailer\")\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "erro na última linha\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "nenhum dado OpenPGP válido encontrado.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armadura inválida: linha maior que %d caracteres\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"caracter \"quoted printable\" na armadura - provavelmente um MTA com bugs "
+"foi usado\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "chave secreta não disponível"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "impossível fazer isso em modo não-interativo\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Opção? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Nenhum motivo especificado"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "não processado"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "a escrever chave pública para `%s'\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "preferências actualizadas"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "caracter inválido na cadeia de caractéres da preferência\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "caracter inválido na cadeia de caractéres da preferência\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "%s: versão de ficheiro inválida %d\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "mostra impressão digital"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "%s: versão de ficheiro inválida %d\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "nenhum dado OpenPGP válido encontrado.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "erro ao escrever no porta-chaves secreto `%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Por favor selecione o tipo de chave desejado:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Esta assinatura expirou em %s.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (apenas cifragem)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Opção inválida.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "motivo da revocação: "
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "algoritmo de compressão desconhecido"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Componentes secretas da chave primária não disponíveis.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "sair deste menu"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "comandos em conflito\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "mostra esta ajuda"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Nenhuma ajuda disponível"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "muda a data de validade"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "muda os valores de confiança"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "mostra impressão digital"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "gerar um novo par de chaves"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Comando> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "comandos em conflito\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "comandos em conflito\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Comando inválido (tente \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "chave secreta não disponível"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "remoção do bloco de chave falhou: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Repita a frase secreta: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "a frase secreta não foi repetida corretamente; tente outra vez"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "impossível abrir `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output não funciona para este comando\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "chave `%s' não encontrada: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "erro na leitura do bloco de chave: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(a não ser que escolha a chave pela sua impressão digital)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "impossível fazer isso em modo não-interactivo sem utilizar \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Remover esta chave do porta-chaves?"
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Esta chave é secreta! - apagar de qualquer modo? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "remoção do bloco de chave falhou: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informações de 'ownertrust' limpas\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "há uma chave secreta para a chave pública \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "utilize a opção \"--delete-secret-keys\" para a apagar primeiro.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "erro na criação da frase secreta: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "não é possível utilizar o pacote ESK simétrico devido ao modo S2K\n"
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "assinatura falhou: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "%s' já comprimido\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVISO: `%s' é um ficheiro vazio\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "no modo --pgp2 só pode cifrar com chaves RSA de 2048 bits ou menos\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "lendo de `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"impossível utilizar a cifra IDEA para todas as chaves para que está a "
+"cifrar.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"ao forçar a cifra simétrica %s (%d) viola as preferências do destinatário\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"ao forçar o algoritmo de compressão %s (%d) viola as preferências do "
+"destinatário\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"ao forçar a cifra simétrica %s (%d) viola as preferências do destinatário\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s cifrado para: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "dados cifrados com %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "cifrado com algoritmo desconhecido %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"AVISO: A mensagem foi cifrada com uma chave fraca na cifragem simétrica.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problema ao tratar pacote cifrado\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr ""
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, fuzzy, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "%s: impossível criar directoria: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr "%s: erro ao ler registo de versão: %s\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "não foi possível alterar o exec-path para %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "não foi possível alterar o exec-path para %s\n"
+
+#: g10/exec.c:513
+#, fuzzy, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "%s: erro ao ler registo de versão: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr ""
+
+#: g10/exec.c:539
+#, fuzzy
+msgid "unable to execute external program\n"
+msgstr "não foi possível alterar o exec-path para %s\n"
+
+#: g10/exec.c:555
+#, fuzzy, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "não foi possível alterar o exec-path para %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:613
+#, fuzzy, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"A assinatura será marcada como não-revocável.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revoga uma chave secundária"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "chave secreta não utilizável"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "chave %08lX: não está protegida - ignorada\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "chave %08lX: tipo PGP 2.x - ignorada\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "chave %08lX: assintura da subchave no local errado - ignorado\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "falha ao inicializar a base de dados de confiança: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "AVISO: nada exportado\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Comandos:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[ficheiro]|fazer uma assinatura"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[ficheiro]|fazer uma assinatura em texto puro"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "fazer uma assinatura separada"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "cifrar dados"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "cifrar apenas com cifra simétrica"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "decifrar dados (acção por omissão)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verificar uma assinatura"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "listar as chaves"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "listar as chaves e as assinaturas"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "verificar as assinaturas das chaves"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "listar as chaves e as impressões digitais"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "listar as chaves secretas"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "gerar um novo par de chaves"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "remover chaves do porta-chaves público"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "remover chaves do porta-chaves secreto"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "assinar uma chave"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "assinar uma chave localmente"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "assinar ou editar uma chave"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "gerar um certificado de revogação"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportar chaves"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportar chaves para um servidor de chaves"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importar chaves de um servidor de chaves"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "procurar chaves num servidor de chaves"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "actualizar todas as chaves a partir de um servidor de chaves"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importar/fundir chaves"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "actualizar a base de dados de confiança"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [ficheiros]|imprimir \"digests\" de mensagens"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opções:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "criar saída com armadura ascii"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOME|cifrar para NOME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+"usar este identificador de utilizador para\n"
+"assinar ou decifrar"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+"|N|estabelecer nível de compressão N\n"
+"(0 desactiva)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "usar modo de texto canônico"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "usar como ficheiro de saída"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "detalhado"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "não fazer alterações"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "perguntar antes de sobrepôr"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Veja a página man para uma lista completa de comandos e opções)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exemplos:\n"
+"\n"
+" -se -r Bob [ficheiro]      assinar e cifrar para o utilizador Bob\n"
+" --clearsign [ficheiro]     criar uma assinatura em texto puro\n"
+" --detach-sign [ficheiro]   criar uma assinatura separada\n"
+" --list-keys [nomes]        mostrar chaves\n"
+" --fingerprint [nomes]      mostrar impressões digitais\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Por favor comunique bugs para <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Uso: gpg [opções] [ficheiros] (-h para ajuda)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaxe: gpg [opções] [ficheiros]\n"
+"assina, verifica, cifra ou decifra\n"
+"a operação por omissão depende dos dados de entrada\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmos suportados:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Chave pública: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cifra: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Dispersão: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compressão: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "uso: gpg [opções] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "comandos em conflito\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "nenhum sinal = encontrada na definição de grupo \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "AVISO: permissões pouco seguras em %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "AVISO: permissões pouco seguras em %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "AVISO: permissões pouco seguras em %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "AVISO: permissões pouco seguras em %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "AVISO: permissões pouco seguras em %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "AVISO: permissões pouco seguras em %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "criado um novo ficheiro de configuração `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Nenhuma assinatura correspondente no porta-chaves secreto\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "a URL de política de assinatura dada é inválida\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "mostrar em que porta-chave a chave está"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Nenhuma assinatura correspondente no porta-chaves secreto\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTA: o ficheiro antigo de opções por omissão `%s' foi ignorado\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTA: ficheiro de opções por omissão `%s' inexistente\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "ficheiro de opções `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "a ler opções de `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTA: %s não é para uso normal!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"a extensão de cifra \"%s\" não foi carregada devido às suas permissões "
+"inseguras\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "não consegui processar a URI do servidor de chaves\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: opções de exportação inválidas\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "opções de exportação inválidas\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opções de importação inválidas\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opções de importação inválidas\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: opções de exportação inválidas\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opções de exportação inválidas\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: opções de importação inválidas\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "opções de importação inválidas\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "a URL de política de assinatura dada é inválida\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: opções de exportação inválidas\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "opções de exportação inválidas\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "não foi possível alterar o exec-path para %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: opções de exportação inválidas\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "AVISO: O programa pode criar um ficheiro core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "AVISO: %s sobrepõe %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s não é permitido com %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s não faz sentido com %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "o gpg-agent não está disponível nesta sessão\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "só pode fazer assinaturas separadas ou em texto puro no modo --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "não pode assinar e cifrar ao mesmo tempo no modo --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"deve utilizar ficheiros (e não um 'pipe') quando trabalho no modo --pgp2.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "cifrar uma mensagem no modo --pgp2 necessita da cifra IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "o algoritmo de cifragem selecionado é inválido\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "o algoritmo de \"digest\" selecionado é inválido\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "o algoritmo de cifragem selecionado é inválido\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "o algoritmo de \"digest\" de certificação selecionado é inválido\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed deve ser maior que 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed deve ser maior que 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth deve estar na entre 1 e 255\n"
+
+#: g10/gpg.c:3025
+#, fuzzy
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "nível de verificação por omissão inválido: deve ser 0, 1, 2 ou 3\n"
+
+#: g10/gpg.c:3027
+#, fuzzy
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "nível de verificação por omissão inválido: deve ser 0, 1, 2 ou 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTA: o modo S2K simples (0) não é recomendável\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "modo S2K inválido: deve ser 0, 1 ou 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "preferências por omissão inválidas\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "preferências pessoais de cifra inválidas\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "preferências pessoais de 'digest' inválidas\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "preferências pessoais de compressão inválidas\n"
+
+#: g10/gpg.c:3091
+#, fuzzy, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s não faz sentido com %s!\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "falha ao inicializar a base de dados de confiança: %s\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nome_do_ficheiro]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nome_do_ficheiro]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "decifragem falhou: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nome_do_ficheiro]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [nome_do_ficheiro]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nome_do_ficheiro]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nome_do_ficheiro]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [nome_do_ficheiro]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "não pode utilizar %s enquanto estiver no modo %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [nome_do_ficheiro]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nome_do_ficheiro]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nome_do_ficheiro]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id-utilizador"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id-utilizador"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id-utilizador [comandos]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id-utilizador] [porta-chaves]"
+
+#: g10/gpg.c:3560
+#, fuzzy, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/gpg.c:3562
+#, fuzzy, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/gpg.c:3564
+#, fuzzy, c-format
+msgid "key export failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/gpg.c:3575
+#, fuzzy, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/gpg.c:3585
+#, fuzzy, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "actualização da chave secreta falhou: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "retirada de armadura falhou: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "criação de armadura falhou: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritmo de dispersão inválido `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nome_do_ficheiro]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Digite a sua mensagem ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "a URL de política de certificação dada é inválida\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "a URL de política de assinatura dada é inválida\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "a URL de política de assinatura dada é inválida\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "entradas demais no cache pk - desactivado\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[Utilizador não encontrado]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "há uma chave secreta para a chave pública \"%s\"!\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "usando chave secundária %08lX ao invés de chave primária %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "chave %08lX: chave secreta sem chave pública - ignorada\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "ser mais silencioso"
+
+#: g10/gpgv.c:75
+#, fuzzy
+msgid "take the keys from this keyring"
+msgstr "Remover esta chave do porta-chaves?"
+
+#: g10/gpgv.c:77
+#, fuzzy
+msgid "make timestamp conflicts only a warning"
+msgstr "conflito de \"timestamp\""
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr ""
+"|DF|escrever informações de estado para o\n"
+"descritor de ficheiro DF"
+
+#: g10/gpgv.c:102
+#, fuzzy
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Uso: gpg [opções] [ficheiros] (-h para ajuda)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Você decide que valor usar aqui; este valor nunca será exportado para\n"
+"terceiros. Precisamos dele implementar a rede de confiança, que não tem\n"
+"nada a ver com a rede de certificados (implicitamente criada)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Para construir a Teia-de-Confiança ('Web-of-Trust'), o GnuPG precisa de\n"
+"saber quais são as chaves em que deposita confiança absoluta - normalmente\n"
+"estas são as chaves a que tem acesso à chave privada.  Responda \"sim\" "
+"para\n"
+"que esta chave seja de confiança absoluta.\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Se você quiser usar esta chave, não de confiança, assim mesmo, responda \"sim"
+"\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"Digite o ID de utilizador do destinatário para quem quer enviar a\n"
+"mensagem."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Em geral não é uma boa ideia utilizar a mesma chave para assinar e para\n"
+"cifrar.  Este algoritmo só deve ser utilizado em alguns domínios.\n"
+"Por favor consulte primeiro o seu perito em segurança."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Insira o tamanho da chave"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Responda \"sim\" ou \"não\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Digite o valor necessário conforme pedido.\n"
+"É possível digitar uma data ISO (AAAA-MM-DD) mas você não terá uma boa\n"
+"reacção a erros - o sistema tentará interpretar o valor dado como um "
+"intervalo."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Digite o nome do possuidor da chave"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "por favor digite um endereço de email (opcional mas recomendado)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Por favor digite um comentário (opcional)"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  para mudar o nome.\n"
+"C  para mudar o comentário.\n"
+"E  para mudar o endereço de email\n"
+"O  para continuar a geração da chave.\n"
+"S  para interromper a geração da chave."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Responda \"sim\" (ou apenas \"s\") se quiser gerar a subchave."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Quando assina uma chave de identificação de um utilizador, deve primeiro\n"
+"verificar que a chave pertence realmente à pessoa em questão. É útil para\n"
+"terceiros saberem com que cuidado é que efectuou esta verificação.\n"
+"\n"
+"\"0\" significa que não deseja declarar a forma com verificou a chave\n"
+"\n"
+"\"1\" significa que acredita que a chave pertence à pessoa em questão, mas\n"
+"    não conseguiu ou não tentou verificar. Este grau é útil para quando\n"
+"    assina a chave de uma utilizador pseudo-anónimo.\n"
+"\n"
+"\"2\" significa que efectuou uma verificação normal da chave. Por exemplo,\n"
+"    isto pode significar que verificou a impressão digital da chave e\n"
+"    verificou o identificador de utilizador da chave contra uma "
+"identificação\n"
+"    fotográfica.\n"
+"\n"
+"\"3\" significa que efectuou uma verificação exaustiva da chave. Por "
+"exemplo,\n"
+"    isto pode significar que efectuou a verificação pessoalmente, e que \n"
+"    utilizou um documento, com fotografia, difícil de falsificar \n"
+"    (como por exemplo um passaporte) que o nome do dono da chave é o\n"
+"    mesmo do que o identificador da chave, e que, finalmente, verificou\n"
+"    (através de troca de e-mail) que o endereço de email da chave pertence\n"
+"    ao done da chave.\n"
+"\n"
+"Atenção: os exemplos dados para os níveis 2 e 3 são *apenas* exemplos.\n"
+"Compete-lhe a si decidir o que considera, ao assinar chaves, uma "
+"verificação\n"
+"\"normal\" e uma verificação \"exaustiva\".\n"
+"\n"
+"Se não sabe qual é a resposta correcta, responda \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Responda \"sim\" se quiser assinar TODOS os IDs de utilizador"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Responda \"sim\" se quiser realmente remover este ID de utilizador.\n"
+"Todos os certificados também serão perdidos!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Responda \"sim\" se quiser remover a subchave"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Esta é uma assinatura válida na chave; normalmente não é desejável\n"
+"remover esta assinatura porque ela pode ser importante para estabelecer\n"
+"uma conexão de confiança à chave ou a outra chave certificada por esta."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Esta assinatura não pode ser verificada porque você não tem a chave\n"
+"correspondente. Você deve adiar sua remoção até saber que chave foi usada\n"
+"porque a chave desta assinatura pode estabelecer uma conexão de confiança\n"
+"através de outra chave já certificada."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "A assinatura não é válida. Faz sentido removê-la do seu porta-chaves."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Esta é uma assinatura que liga o ID de utilizador à chave. Geralmente\n"
+"não é uma boa idéia remover tal assinatura. É possível que o GnuPG\n"
+"não consiga mais usar esta chave. Faça isto apenas se por alguma\n"
+"razão esta auto-assinatura não for válida e há uma segunda disponível."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Muda as preferências de todos os identificadores de utilizadores\n"
+"(ou apenas dos seleccionados) para a lista actual de preferências.\n"
+"O 'timestamp' de todas as auto-assinaturas afectuadas será avançado\n"
+"em um segundo.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Por favor digite a frase secreta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Por favor repita a frase secreta, para ter certeza do que digitou."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Dê o nome para o ficheiro ao qual a assinatura se aplica"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Responda \"sim\" se quiser escrever por cima do ficheiro"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Por favor digite um novo nome de ficheiro. Se você apenas carregar em "
+"RETURN\n"
+"o ficheiro por omissão (que é mostrado entre parênteses) será utilizado."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Deve especificar uma razão para a emissão do certificado. Dependendo no\n"
+"contexto, pode escolher as seguintes opções desta lista:\n"
+"  \"A chave foi comprometida\"\n"
+"     Utilize esta opção se tem razões para acreditar que indivíduos não\n"
+"     autorizados obtiveram acesso à sua chave secreta.\n"
+"  \"A chave foi substituida\"\n"
+"     Utilize esta opção se substituiu esta chave com uma mais recente.\n"
+"  \"A chave já não é utilizada\"\n"
+"     Utilize esta opção se já não utiliza a chave.\n"
+"  \"O identificador do utilizador já não é válido\"\n"
+"     Utilize esta opção para comunicar que o identificador do utilizador\n"
+"     não deve ser mais utilizado; normalmente utilizada para indicar\n"
+"     que um endereço de email é inválido.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Se desejar, pode inserir uma texto descrevendo a razão pela qual criou\n"
+"este certificado de revogação. Por favor mantenha este texto conciso.\n"
+"Uma linha vazia termina o texto.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Nenhuma ajuda disponível"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Nenhuma ajuda disponível para `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "actualizar a base de dados de confiança"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr ""
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "chave secreta não utilizável"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "ignorando bloco do tipo %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu chaves processadas até agora\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Número total processado: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      ignorei novas chaves: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          sem IDs de utilizadores: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              importados: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             não modificados: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          novos IDs de utilizadores: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           novas subchaves: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        novas assinaturas: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   novas revogações de chaves: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      chaves secretas lidas: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  chaves secretas importadas: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " chaves secretas não modificadas: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "        não importadas: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "        novas assinaturas: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      chaves secretas lidas: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Assinou estes identificadores de utilizadores:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "assinatura %s de: \"%s\"\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "chave %08lX: sem ID de utilizador\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "chave %08lX: subchave HKP corrompida foi reparada\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "chave %08lX: aceite ID de utilizador sem auto-assinatura '%s'\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "chave %08lX: sem IDs de utilizadores válidos\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "isto pode ser causado por falta de auto-assinatura\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "chave %08lX: chave pública não encontrada: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "chave %08lX: chave nova - ignorada\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "não foi encontrada nenhum porta-chaves onde escrever: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "a escrever para `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "erro na escrita do porta-chaves `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "chave %08lX: chave pública \"%s\" importada\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "chave %08lX: não corresponde à nossa cópia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "chave %08lX: impossível localizar bloco de chaves original: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "chave %08lX: impossível ler bloco de chaves original: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "chave %8lX: \"%s\" 1 novo ID de utilizador\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "chave %08lX: \"%s\" %d novos IDs de utilizadores\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "chave %08lX: \"%s\" 1 nova assinatura\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "chave %08lX: \"%s\" %d novas assinaturas\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "chave %08lX: \"%s\" 1 nova subchave\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "chave %08lX: \"%s\" %d novas subchaves\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novas assinaturas\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novas assinaturas\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novos IDs de utilizadores\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "chave %08lX: \"%s\" %d novos IDs de utilizadores\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "chave %08lX: \"%s\" não modificada\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "chave %08lX: chave secreta com cifra inválida %d - ignorada\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "sem porta-chaves público por omissão: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "chave %08lX: chave secreta importada\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "chave %08lX: já está no porta-chaves secreto\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "chave %08lX: chave secreta não encontrada: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"chave %08lX: sem chave pública - impossível aplicar certificado\n"
+"de revogação\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "chave %08lX: certificado de revogação inválido: %s - rejeitado\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "chave %08lX: \"%s\" certificado de revogação importado\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "chave %08lX: nenhum ID de utilizador para assinatura\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"chave %08lX: algoritmo de chave pública não suportado no utilizador \"%s\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "chave %08lX: auto-assinatura inválida do utilizador \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "chave %08lX: algoritmo de chave pública não suportado\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "chave %08lX: ligação de subchave inválida\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "chave %08lX: apagada ligação múltipla de subchave \n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "chave %08lX: sem subchave para revocação de chave\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "chave %08lX: revocação de subchave inválida\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "chave %08lX: removida revogação múltiplace de subchaves\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "chave %08lX: ignorado ID de utilizador '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "chave %08lX: subchave ignorada\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "chave %08lX: assinatura não exportável (classe %02x) - ignorada\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "chave %08lX: certificado de revogação no local errado - ignorado\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "chave %08lX: certificado de revogação inválido: %s - ignorado\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "chave %08lX: assintura da subchave no local errado - ignorado\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "chave %08lX: classe de assinatura inesperada (%02x) - ignorada\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "chave %08lX: detectado ID de utilizador duplicado - fundido\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"AVISO: a chave %08lX pode estar revocada: a transferir a chave de revocação %"
+"08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"AVISO: a chave %08lX pode estar revocada: chave de revocação %08lX não "
+"presente.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "chave %08lX: certificado de revogação \"%s\" adicionado\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "chave %08lX: assinatura directa de chave adicionada\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr ""
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "erro ao criar porta-chaves `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "porta-chaves `%s' criado\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "erro ao criar `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "falha ao criar 'cache' do porta-chaves: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revogação]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[auto-assinatura]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 assinatura incorrecta\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d assinaturas incorrectas\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 assinatura não verificada por falta de chave\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d assinaturas não verificadas por falta de chaves\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 assinatura não verificada devido a um erro\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d assinaturas não verificadas devido a erros\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 ID de utilizador sem auto-assinatura válida detectado\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d IDs de utilizadores sem auto-assinaturas válidas detectados\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Por favor decida quanto confia neste utilizador para\n"
+"verificar correctamente as chaves de outros utilizadores\n"
+"(vendo passaportes, verificando impressões digitais...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Confio moderadamente\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Confio plenamente\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Utilizador \"%s\" está revocado."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Você tem certeza de que quer adicioná-la de qualquer forma? (s/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Não foi possível assinar.\n"
+
+#: g10/keyedit.c:627
+#, fuzzy, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Utilizador \"%s\" está revocado."
+
+#: g10/keyedit.c:655
+#, fuzzy, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "AVISO: o ID do utilizador \"%s\" não é auto-assinado.\n"
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "AVISO: o ID do utilizador \"%s\" não é auto-assinado.\n"
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Realmente assinar? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"A sua auto-assinatura em \"%s\"\n"
+"é uma assinatura do tipo PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Quer promovê-la a uma auto-assinatura OpenPGP? (s/N) "
+
+#: g10/keyedit.c:730
+#, fuzzy, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"A sua assinatura actual em \"%s\"\n"
+"é uma assinatura local.\n"
+
+#: g10/keyedit.c:734
+#, fuzzy
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Quer que a sua assinatura expire na mesma altura? (S/n) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"A sua assinatura actual em \"%s\"\n"
+"é uma assinatura local.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Quer promovê-la a uma assinatura exportável? (s/N)"
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" já foi assinado localmente pela chave %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" já foi assinado pela chave %08lX\n"
+
+#: g10/keyedit.c:788
+#, fuzzy
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Você tem certeza de que quer adicioná-la de qualquer forma? (s/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nada para assinar com a chave %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Esta chave expirou!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Esta chave vai expirar em %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Quer que a sua assinatura expire na mesma altura? (S/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Não pode criar uma assinatura OpenPGP numa chave PGP 2.x no modo --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Isto tornaria a chave inutilizável no PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Com que cuidado é que verificou que chave que está prestes a assinar "
+"pertence\n"
+"à pessoa correcta? Se não sabe o que responder, escolha \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Não vou responder.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Não verifiquei.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Verifiquei por alto.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Verifiquei com bastante cuidado.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr ""
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Você tem certeza de que quer assinar esta chave com\n"
+"a sua chave: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Isto será uma auto-assinatura.\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"AVISO: a assinatura não será marcada como não-exportável.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"AVISO: a assinatura não será marcada como não-revocável.\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"A assinatura será marcada como não-exportável.\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"A assinatura será marcada como não-revocável.\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Não verifiquei esta chave.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Verifiquei por alto esta chave.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Verifiquei esta chave com muito cuidado.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Realmente assinar? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "assinatura falhou: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Componentes secretas da chave primária não disponíveis.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Componentes secretas da chave primária não disponíveis.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Impossível editar esta chave: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Digite a nova frase para esta chave secreta.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "a frase secreta não foi repetida corretamente; tente outra vez"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Você não quer uma frase secreta - provavelmente isto é uma *má* idéia!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Você quer realmente fazer isso? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "a mover a assinatura da chave para o local correcto\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "gravar e sair"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "mostra impressão digital"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "lista chave e identificadores de utilizadores"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "seleciona ID de utilizador N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "seleciona ID de utilizador N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revoga assinaturas"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "assina a chave localmente"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Sugestão: Selecione os IDs de utilizador para assinar\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "adiciona um novo ID de utilizador"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "adiciona um identificador fotográfico"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "remove ID de utilizador"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "remove uma chave secundária"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "adiciona uma chave de revocação"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"Realmente actualizar as preferências para os utilizadores seleccionados?"
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Você não pode modificar a data de validade de uma chave v3\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "seleccionar o identificador do utilizador como primário"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "alterna entre listagem de chave secreta e pública"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "lista preferências (perito)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "lista preferências (detalhadamente)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"Realmente actualizar as preferências para os utilizadores seleccionados?"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "não consegui processar a URI do servidor de chaves\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"Realmente actualizar as preferências para os utilizadores seleccionados?"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "muda a frase secreta"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "muda os valores de confiança"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Realmente revocar todos os IDs de utilizador seleccionados? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "revocar um ID de utilizador"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revoga uma chave secundária"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "activa uma chave"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "desactiva uma chave"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "mostrar identificador fotográfico"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "erro na leitura do bloco de chave secreto `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Chave secreta disponível.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "A chave secreta é necessária para fazer isto.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Por favor utilize o comando \"toggle\" primeiro.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "A chave está revogada."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Realmente assinar todos os IDs de utilizador? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Sugestão: Selecione os IDs de utilizador para assinar\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "classe de assinatura desconhecida"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Este comando não é permitido no modo %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Você precisa selecionar pelo menos um ID de utilizador.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Você não pode remover o último ID de utilizador!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Realmente remover todos os IDs de utilizador seleccionados? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Realmente remover este ID de utilizador? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Realmente remover este ID de utilizador? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Você deve selecionar pelo menos uma chave.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "erro ao criar porta-chaves `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Você deve selecionar pelo menos uma chave.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Você quer realmente remover as chaves selecionadas? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Você quer realmente remover esta chave? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Realmente revocar todos os IDs de utilizador seleccionados? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Realmente revocar este ID de utilizador? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Você quer realmente revogar esta chave? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Você quer realmente revogar as chaves selecionadas? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Você quer realmente revogar esta chave? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "configurar lista de preferências"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Realmente actualizar as preferências para os utilizadores seleccionados?"
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Realmente actualizar as preferências?"
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Gravar alterações? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Sair sem gravar? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "actualização falhou: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "actualização da chave secreta falhou: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Chave não alterada, nenhuma actualização é necessária.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "'Digest': "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Características: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notação: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Não há preferências no ID de utilizador tipo PGP 2.x.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Esta chave pode ser revogada pela chave %s "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Esta chave pode ser revogada pela chave %s "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (sensível)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "impossível criar %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "revkey"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr "[expira: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr "[expira: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " confiança: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " confiança: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Esta chave foi desactivada"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Não se esqueça que a validade de chave mostrada não é necessáriamente a\n"
+"correcta a não ser que reinicie o programa.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "revkey"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"AVISO: Esta chave é do tipo PGP2. Se adicionar um identificador fotográfico\n"
+"       algumas versão do PGP podem rejeitá-la.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Tem a certeza de que quer adicioná-la de qualquer forma? (s/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+"Não pode adicionar um identificador fotográfico a uma chave tipo PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Apagar esta assinatura válida? (s/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Apagar esta assinatura inválida? (s/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Apagar esta assinatura desconhecida? (s/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Realmente remover esta auto-assinatura? (s/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d assinatura removida.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d assinaturas removidas.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nada removido.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "armadura inválida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Utilizador \"%s\" está revocado."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Utilizador \"%s\" está revocado."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Utilizador \"%s\" está revocado."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "o utilizador com o id \"%s\" já está revocado\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "o utilizador com o id \"%s\" já está revocado\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVISO: Esta chave é do tipo PGP 2.x. Se adicionar um revogador designado\n"
+"       algumas versão do PGP podem rejeitá-la.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Não pode adicionar um revogador designado a uma chave tipo PGP 2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Insira o ID de utilizador do revogador escolhido: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "não pode escolher uma chave do tipo PGP 2.x como revogadora\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "não pode escolher uma chave como revogadora de si mesmo\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/keyedit.c:3458
+#, fuzzy
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "não pode escolher uma chave como revogadora de si mesmo\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "não pode escolher uma chave como revogadora de si mesmo\n"
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Por favor remova as selecções das chaves secretas.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Por favor seleccione no máximo uma chave secundária.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "A modificar a data de validade para uma chave secundária.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Modificar a data de validade para uma chave primária.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Você não pode modificar a data de validade de uma chave v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Nenhuma assinatura correspondente no porta-chaves secreto\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "não pode escolher uma chave como revogadora de si mesmo\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Seleccione exactamente um identificador de utilizador.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "a ignorar auto-assinatura v3 no utilizar com o id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Você tem certeza de que quer adicioná-la de qualquer forma? (s/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Você tem certeza de que quer adicioná-la de qualquer forma? (s/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notação de assinatura: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Escrever por cima (s/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Nenhum ID de utilizador com índice %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Nenhum ID de utilizador com índice %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Nenhum ID de utilizador com índice %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID de utilizador: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   assinado por %08lX em %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr "  (não-exportável)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Esta assinatura expirou em %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Tem a certeza de que quer revogá-la de qualquer forma? (s/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Assinou estes identificadores de utilizadores:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr "  (não-exportável)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revogado por %08lX em %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Está prestes a revogar estas assinaturas:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Realmente criar os certificados de revogação? (s/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "nenhuma chave secreta\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "o utilizador com o id \"%s\" já está revocado\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"AVISO: a assintura do ID do utilizador tem data %d segundos no futuro\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "o utilizador com o id \"%s\" já está revocado\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "o utilizador com o id \"%s\" já está revocado\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"A mostrar a fotografia %s com o tamanho %ld da chave 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preferência %c%lu duplicada\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "demasiadas preferências `%c'\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "demasiadas preferências `%c'\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "demasiadas preferências `%c'\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "caracter inválido na cadeia de caractéres da preferência\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "a escrever a assinatura directa\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "a escrever a auto-assinatura\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "a escrever a assinatura ligada a uma chave\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "tamanho de chave inválido; a utilizar %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "tamanho da chave arredondado para %u bits\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "cifrar dados"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (apenas cifragem)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Por favor selecione o tipo de chave desejado:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA e ElGamal (por omissão)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (apenas assinatura)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (apenas cifragem)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (apenas cifragem)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (apenas assinatura)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (apenas cifragem)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (apenas cifragem)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "O par de chaves DSA terá 1024 bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Qual o tamanho de chave desejado? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "O tamanho de chave pedido é %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "arredondado para %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Por favor especifique por quanto tempo a chave deve ser válida.\n"
+"         0 = chave não expira\n"
+"      <n>  = chave expira em n dias\n"
+"      <n>w = chave expira em n semanas\n"
+"      <n>m = chave expira em n meses\n"
+"      <n>y = chave expira em n anos\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Por favor especifique por quanto tempo a assinatura deve ser válida.\n"
+"         0 = assinatura não expira\n"
+"      <n>  = assinatura expira em n dias\n"
+"      <n>w = assinatura expira em n semanas\n"
+"      <n>m = assinatura expira em n meses\n"
+"      <n>y = assinatura expira em n anos\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "A chave é valida por? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "A assinatura é valida por? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valor inválido\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "A %s não expira nunca\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "A %s não expira nunca\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "%s expira em %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Esta assinatura expirou em %s.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"O seu sistema não consegue mostrar datas para além de 2038.\n"
+"No entanto, estas vão ser tratadas correctamente até 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Está correto (s/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Você precisa de um identificador de utilizador para identificar sua chave; "
+"o\n"
+"programa constrói o identificador a partir do Nome Completo, Comentário e\n"
+"Endereço Eletrónico desta forma:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nome completo: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Caracter inválido no nome\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "O nome não pode começar com um dígito\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "O nome deve ter pelo menos 5 caracteres\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Endereço de correio eletrónico: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Endereço eletrónico inválido\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comentário: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Caracter inválido no comentário\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Você está usando o conjunto de caracteres `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Você selecionou este identificador de utilizador:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Por favor não coloque o endereço de email no nome verdadeiro ou no "
+"comentário\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoSs"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Mudar (N)ome, (C)omentário, (E)mail ou (S)air? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Mudar (N)ome, (C)omentário, (E)ndereço ou (O)k/(S)air? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Por favor corrija primeiro o erro\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Precisamos gerar muitos bytes aleatórios. É uma boa ideia realizar outra\n"
+"actividade (escrever no teclado, mover o rato, usar os discos) durante a\n"
+"geração dos números primos; isso dá ao gerador de números aleatórios\n"
+"uma hipótese maior de ganhar entropia suficiente.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Geração de chave cancelada.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "a escrever chave pública para `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "a escrever chave privada para `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "nenhum porta-chaves público com permissões de escrita encontrado: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "nenhum porta-chaves secreto com permissões de escrita encontrado: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "erro ao escrever no porta-chaves público `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "erro ao escrever no porta-chaves secreto `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "chaves pública e privada criadas e assinadas.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Note que esta chave não pode ser usada para cifragem. Você pode usar\n"
+"o comando \"--edit-key\" para gerar uma chave secundária para esse fim.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"a chave foi criada %lu segundo no futuro\n"
+"(viagem no tempo ou problema no relógio)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in 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"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTA: a criação de sub-chave para chaves v3 não respeito o OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Realmente criar? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "remoção do bloco de chave falhou: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "impossível criar `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTA: chave secreta %08lX expirou em %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Politica de assinatura crítica: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Politica de assinatura: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notação de assinatura crítica: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notação de assinatura: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Porta-chaves"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Impressão da chave primária:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "      Impressão da subchave:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "Impressão da chave primária:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Impressão da subchave:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "  Impressão da chave ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "criação de armadura falhou: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "AVISO: existem 2 ficheiros com informações confidenciais.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s é o não modificado\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s é o novo\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Por favor conserte esta possível falha de segurança\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "a verificar o porta chaves `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu chave verificadas (%lu assinaturas)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu chave verificadas (%lu assinaturas)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: porta-chaves criado\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "a URL de política de assinatura dada é inválida\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "AVISO: opções em `%s' ainda não estão activas nesta execução\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "opções de exportação inválidas\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "chave `%s' não encontrada: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "chave `%s' não encontrada: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "a pedir a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "a pedir a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"assinado com a sua chave %08lX em %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "a procurar por \"%s\" no servidor HKP %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "opções de exportação inválidas\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "erro do servidor de chaves"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "erro do servidor de chaves"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "a pedir a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "a pedir a chave %08lX de %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "AVISO: dono pouco seguro em %s \"%s\"\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "tamanho estranho para uma chave de sessão cifrada (%d)\n"
+
+#: g10/mainproc.c:291
+#, fuzzy, c-format
+msgid "%s encrypted session key\n"
+msgstr "tamanho estranho para uma chave de sessão cifrada (%d)\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "cifrado com algoritmo desconhecido %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "a chave pública é %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "dados cifrados com chave pública: DEK válido\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "cifrado com chave %u-bit %s, ID %08lX, criada em %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                   ou \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "cifrado com chave %s, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "decifragem de chave pública falhou: %s\n"
+
+#: g10/mainproc.c:508
+#, fuzzy, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "Repita a frase secreta\n"
+
+#: g10/mainproc.c:510
+#, fuzzy
+msgid "encrypted with 1 passphrase\n"
+msgstr "Repita a frase secreta\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "a assumir dados cifrados %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "Cifra IDEO não disponível, a tentar utilizar %s em substituição\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "decifragem correcta\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVISO: a mensagem não tinha a sua integridade protegida\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "CUIDADO: a mensagem cifrada foi manipulada!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "decifragem falhou: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTA: o remetente solicitou \"apenas-para-seus-olhos\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nome do ficheiro original='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revocação solitária - utilize \"gpg --import\" para aplicar\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Assinatura correcta de \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verificação de assinatura suprimida\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "não consigo tratar estas assinaturas múltiplas\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Esta assinatura expirou em %s.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                   ou \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Assinatura feita em %.*s usando %s, ID da chave %08lX\n"
+
+#: g10/mainproc.c:1544
+#, fuzzy
+msgid "Key available at: "
+msgstr "Nenhuma ajuda disponível"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Assinatura INCORRECTA de \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Assinatura expirada de \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Assinatura correcta de \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[incerto]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                   ou \""
+
+#: g10/mainproc.c:1863
+#, fuzzy, c-format
+msgid "Signature expired %s\n"
+msgstr "Esta assinatura expirou em %s.\n"
+
+#: g10/mainproc.c:1868
+#, fuzzy, c-format
+msgid "Signature expires %s\n"
+msgstr "Esta assinatura expirou em %s.\n"
+
+#: g10/mainproc.c:1871
+#, fuzzy, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "assinatura %s de: \"%s\"\n"
+
+#: g10/mainproc.c:1872
+#, fuzzy
+msgid "binary"
+msgstr "primary"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr ""
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+#, fuzzy
+msgid "unknown"
+msgstr "versão desconhecida"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Impossível verificar assinatura: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "não é uma assinatura separada\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"AVISO: várias assinaturas detectadas.  Apenas a primeira será verificada.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "assinatura de classe 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "formato de assinatura antigo (PGP2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "pacote raiz inválido detectado em proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "impossível desactivar core dumps: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "impossível abrir %s: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "base de dados de confiança: leitura falhou (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "impossível manipular algoritmo de chave pública %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "algoritmo de criptografia não implementado"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "assinatura %s de: \"%s\"\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"forçar o algoritmo de 'digest' %s (%d) viola as preferências do "
+"destinatário\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "o 'plugin' com a cifra IDEA não está presente\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = mostrar mais informações\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: opção depreciada \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVISO: \"%s\" é uma opção depreciada\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "por favor utilize \"%s%s\" em vez dela\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "AVISO: \"%s\" é uma opção depreciada\n"
+
+#: g10/misc.c:707
+#, fuzzy
+msgid "Uncompressed"
+msgstr "não processado"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "não processado"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "esta mensagem poderá não ser utilizável pelo %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "a ler opções de `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "destinatário por omissão desconhecido `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Arquivo `%s' já existe. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Escrever por cima (s/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: sufixo desconhecido\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Digite novo nome de ficheiro"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "a escrever em \"stdout\"\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "a assumir dados assinados em `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "criado um novo ficheiro de configuração `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "AVISO: opções em `%s' ainda não estão activas nesta execução\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: directoria criada\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "impossível manipular algoritmo de chave pública %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpacote do tipo %d tem bit crítico ligado\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "o gpg-agent não está disponível nesta sessão\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "variável de ambiente GPG_AGENT_INFO inválida\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "a versão %d do protocolo gpg-agent não é suportada\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "impossível ligar a `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problema com o agente - a desactivar a utilização deste\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (ID principal da chave %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Precisa de uma frase secreta para desbloquear a chave secreta do "
+"utilizador:\n"
+"\n"
+"\"%.*s\"\n"
+"chave %u bits %s, ID %08lx, criada %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repita a frase secreta\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Insira a frase secreta\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "cancelado pelo utilizador\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "impossível pedir senha em modo não-interactivo\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Digite a frase secreta: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Você precisa de uma frase secreta para desbloquear a chave secreta do\n"
+"utilizador: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "chave de %u-bit/%s, ID %08lX, criada em %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repita a frase secreta: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "impossível abrir %s: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Você tem certeza de que quer adicioná-la de qualquer forma? (s/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "%s: não é um base de dados de confiança\n"
+
+#: g10/photoid.c:165
+#, fuzzy
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Está correto (s/n)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+#, fuzzy
+msgid "unable to display photo ID!\n"
+msgstr "não foi possível alterar o exec-path para %s\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Nenhum motivo especificado"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "A chave foi substituída"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "A chave foi comprometida"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "A chave já não é utilizada"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "O identificador do utilizador já não é válido"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "motivo da revocação: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "comentário da revocação: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Nenhum valor de confiança designado para:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                   ou \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Esta chave provavelmente pertence ao dono\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Não sei\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Eu NÃO confio\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Confio de forma total\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = voltar ao menu principal\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = saltar esta chave\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = sair\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Decisão? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Tem a certeza que quer confiar totalmente nesta chave?"
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificados que levam a uma chave confiada plenamente:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lx: Não há indicação de que a assinatura pertence realmente ao dono.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lx: Não há indicação de que a assinatura pertence realmente ao dono.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Esta chave provavelmente pertence ao dono\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Esta chave pertence-nos\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NÃO se tem certeza de que esta chave pertence ao seu dono.\n"
+"Se você *realmente* sabe o que está a fazer, pode responder\n"
+"sim à próxima pergunta\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Usar esta chave de qualquer modo? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "AVISO: A utilizar uma chave que não é de confiança!\n"
+
+#: g10/pkclist.c:509
+#, fuzzy
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"AVISO: a chave %08lX pode estar revocada: chave de revocação %08lX não "
+"presente.\n"
+
+#: g10/pkclist.c:518
+#, fuzzy
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Isto pode significar que a assinatura é falsificada.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "AVISO: Esta subchave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Nota: Esta chave foi desactivada.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Nota: Esta chave expirou!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "AVISO: Esta chave não está certificada com uma assinatura confiável!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Não há indicação de que a assinatura pertence ao dono.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "AVISO: Nós NÃO confiamos nesta chave!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         A assinatura é provavelmente uma FALSIFICAÇÃO.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"AVISO: Esta chave não está certificada com assinaturas suficientemente\n"
+"       confiáveis!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Não se tem certeza de que a assinatura pertence ao dono.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ignorado: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ignorado: a chave pública já está presente\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Insira o identificador do utilizador. Termine com uma linha vazia: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Identificador de utilizador inexistente.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "ignorado: chave pública já colocada como destinatário por omissão\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "A chave pública está desativada.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "ignorado: a chave pública já está presente\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "destinatário por omissão desconhecido `%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: ignorado: a chave pública está desactivada\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "nenhum endereço válido\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "erro ao criar `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Assinatura separada.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Por favor digite o nome do ficheiro de dados: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "lendo do \"stdin\" ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "não há dados assinados\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "impossível abrir dados assinados `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinatário anónimo; a tentar chave secreta %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "certo, nós somos o destinatário anónimo.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "codificação antiga do DEK não suportada\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "algoritmo de cifra %d%s é desconhecido ou foi desactivado\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "NOTA: algoritmo de cifragem %d não encontrado nas preferências\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTA: chave secreta %08lX expirou em %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTA: a chave foi revogada"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, fuzzy, c-format
+msgid "build_packet failed: %s\n"
+msgstr "actualização falhou: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "chave %08lX: sem ID de utilizador\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, fuzzy, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "actualização da chave secreta falhou: %s\n"
+
+#: g10/revoke.c:407
+#, fuzzy
+msgid "Revocation certificate created.\n"
+msgstr "chave %08lX: certificado de revogação \"%s\" adicionado\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "chave `%s' não encontrada: %s\n"
+
+#: g10/revoke.c:500
+#, fuzzy, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "a escrever chave pública para `%s'\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr ""
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
+
+#: g10/revoke.c:535
+#, fuzzy
+msgid "unknown protection algorithm\n"
+msgstr "algoritmo de compressão desconhecido"
+
+#: g10/revoke.c:543
+#, fuzzy
+msgid "NOTE: This key is not protected!\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+#, fuzzy
+msgid "Please select the reason for the revocation:\n"
+msgstr "motivo da revocação: "
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+#, fuzzy
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+"\n"
+"Insira o identificador do utilizador. Termine com uma linha vazia: "
+
+#: g10/revoke.c:716
+#, fuzzy, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "motivo da revocação: "
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Usar esta chave de qualquer modo? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "partes da chave secreta não disponíveis\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "algoritmo de protecção %d%s não é suportado\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "algoritmo de protecção %d%s não é suportado\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Frase secreta inválida; por favor tente novamente"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"AVISO: Chave fraca detectada - por favor mude a frase secreta novamente.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"a gerar a 'checksum' (depreciada) de 16-bit para protecção da chave secreta\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "chave fraca criada - tentando novamente\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"impossível evitar chave fraca para criptografia simétrica;\n"
+"tentei %d vezes!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "AVISO: conflito no 'digest' de assinatura da mensagem\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "não pode escolher uma chave como revogadora de si mesmo\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"a chave foi criada %lu segundo no futuro\n"
+"(viagem no tempo ou problema no relógio)\n"
+
+#: g10/sig-check.c:195
+#, 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"
+"(viagem no tempo ou problema no relógio)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTA: chave de assinatura %08lx expirou %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"assumindo assinatura incorrecta na chave %08lX devido a um bit crítico "
+"desconhecido\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "chave %08lX: sem subchave para o pacote revocação de subchave\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/sign.c:85
+#, fuzzy
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "não pode escolher uma chave do tipo PGP 2.x como revogadora\n"
+
+#: g10/sign.c:93
+#, fuzzy
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "não pode escolher uma chave do tipo PGP 2.x como revogadora\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVISO: impossível expandir-%% a url de política (demasiado grande).  A "
+"utilizar não expandida.\n"
+
+#: g10/sign.c:124
+#, fuzzy
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "não pode escolher uma chave do tipo PGP 2.x como revogadora\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"AVISO: impossível expandir-%% a url de política (demasiado grande).\n"
+"A utilizar não expandida.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"AVISO: impossível expandir-%% a url de política (demasiado grande).\n"
+"A utilizar não expandida.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "verificação da assinatura criada falhou: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "assinatura %s de: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "só pode assinar-desligar com chaves do tipo PGP 2.x no modo --pgp2\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"forçar o algoritmo de 'digest' %s (%d) viola as preferências do "
+"destinatário\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "a assinar:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "só pode assinar à vista com chaves do tipo PGP 2.x no modo --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "será utilizada a cifragem %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"a chave não está marcada insegura - impossível usá-la com o RNG falso!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "ignorado `%s': duplicada\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "ignorado `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"ignorado `%s': esta é uma chave ElGamal gerada pelo PGP que não é segura "
+"para assinaturas!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "registo de confiança %lu, tipo %d: escrita falhou: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "frase secreta demasiado longa\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "%s: versão de ficheiro inválida %d\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importar os valores de confiança"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "%s: erro ao escrever registo de diretório: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "armadura: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "base de dados de confiança: sincronização falhou: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "base de dados de confiança rec %lu: lseek falhou: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "base de dados de confiança rec %lu: escrita falhou (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transação de base de dados de confiança muito grande\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "impossível fechar `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: diretoria inexistente!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "impossível criar `%s': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "impossível abrir `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: falha ao criar registo de versão: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: base de dados de confiança inválida criada\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: base de dados de confiança criada\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTA: não é possível escrever na trustdb\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: base de dados de confiança inválida\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: falha ao criar tabela de dispersão: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: erro a actualizar registo de versão: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: erro ao ler registo de versão: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: erro ao escrever registo de versão: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "base de dados de confiança: lseek falhou: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "base de dados de confiança: leitura falhou (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: não é um base de dados de confiança\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: registo de versão com recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versão de ficheiro inválida %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: erro ao ler registo livre: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: erro ao escrever registo de diretório: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: falha ao zerar um registo: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: falha ao anexar um registo: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"A base de dados de confiança está danificada; por favor execute\n"
+"\"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "impossível manipular linhas de texto maiores que %d caracteres\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "linha de entrada maior que %d caracteres\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' não é um identificador longo de chave válido\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "chave %08lX: aceite como chave de confiança\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "chave %08lX ocrreu mais do que uma vez na base de dados de confiança\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"chave %08lX: nenhuma chave pública para chave de confiança - ignorada\n"
+"\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "chave marcada como de confiança absoluta\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "registo de confiança %lu, tipo req %d: falha na leitura: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "registo de confiança %lu não é do tipo pedido %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "revkey"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "expire"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "versão desconhecida"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "não é necessária uma verificação da base de dados de confiança\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "proxima verificação da base de dados de confiança a %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "não é necessária uma verificação da base de dados de confiança\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+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"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "chave pública %08lX não encontrada: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "a verificar a base de dados de confiança\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+#, fuzzy
+msgid "no ultimately trusted keys found\n"
+msgstr ""
+"chave pública da chave absolutamente de confiança %08lX não encontrada\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+"chave pública da chave absolutamente de confiança %08lX não encontrada\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "registo de confiança %lu, tipo %d: escrita falhou: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"a assinatura não pode ser verificada.\n"
+"Não se esqueça que o ficheiro com a assinatura (.sig ou .asc)\n"
+"deve ser o primeiro a ser dado na linha de comando.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "linha de entrada %u demasiado longa ou falta o LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "erro geral"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "formato de pacote desconhecido"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "versão desconhecida"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algoritmo de chave pública desconhecido"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algoritmo de \"digest\" desconhecido"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "chave pública incorrecta"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "chave secreta incorrecta"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "assinatura incorrecta"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "erro de \"checksum\""
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "frase secreta incorrecta"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "chave pública não encontrada"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algoritmo de criptografia desconhecido"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "não é possível abrir o porta-chaves"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "pacote inválido"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armadura inválida"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "identificador de utilizador inexistente"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "chave secreta não disponível"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "chave secreta incorrecta"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "não suportado"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "chave incorrecta"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "erro de leitura"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "erro de escrita"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritmo de compressão desconhecido"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "erro na abertura do ficheiro"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "erro na criação do ficheiro"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "frase-secreta inválida"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmo de chave pública não implementado"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritmo de criptografia não implementado"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "classe de assinatura desconhecida"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "erro na base de dados de confiança"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI incorreto"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "limite de recursos"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "porta-chaves inválido"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "certificado incorrecto"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "identificador de utilizador malformado"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "erro ao fechar ficheiro"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "erro na renomeação do ficheiro"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "erro na remoção do ficheiro"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "dados inesperados"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflito de \"timestamp\""
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritmo de chave pública inutilizável"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "o ficheiro já existe"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "chave fraca"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argumento inválido"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI incorrecto"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI não suportado"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "erro na rede"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "não cifrado"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "não processado"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "chave pública não utilizável"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "chave secreta não utilizável"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "erro do servidor de chaves"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "cancelado pelo utilizador\n"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "não cifrado"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "não há dados assinados\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... isto é um bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "você encontrou um bug ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+#, fuzzy
+msgid "yes"
+msgstr "sim"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "sS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "não"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "sair"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "AVISO: a utilizar memória insegura!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "por favor veja http://www.gnupg.org/faq.html para mais informações\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "a operação não é possível sem memória segura inicializada\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(você pode ter usado o programa errado para esta tarefa)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr ""
+#~ "DSA necessita de utilização de uma algoritmo de dispersão de 160 bit\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "veja http://www.gnupg.org/why-not-idea.html para mais informações\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "um nome de notação deve ter apenas caracteres imprimíveis ou espaços, e "
+#~ "terminar com um '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "um valor de notação de utilizador não deve conter o caracter '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "um valor de notação de utilizador não deve conter o caracter '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "um valor de notação não deve usar caracteres de controle\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "AVISO: dados de notação inválidos encontrados\n"
+
+#~ msgid "not human readable"
+#~ msgstr "não legível por humanos"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "ler opções do ficheiro"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "ler opções do ficheiro"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr "[expira: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "chave %08lX: classe de assinatura inesperada (%02x) - ignorada\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "não foi possível alterar o exec-path para %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "o utilizador com o id \"%s\" já está revocado\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "erro na criação da frase secreta: %s\n"
+
+#, fuzzy
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "algoritmo de criptografia desconhecido"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "não consegui colocar o pid do cliente no agente\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "não consigo obter FD de leitura no servidor para o agente\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "não consigo obter FD de escrita no servidor para o agente\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problemas na comunicação com o gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "frase secreta demasiado longa\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "resposta do agente inválida\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problema com o agente: o agente returnou 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "seleciona chave secundária N"
+
+#~ msgid "list signatures"
+#~ msgstr "lista assinaturas"
+
+#~ msgid "sign the key"
+#~ msgstr "assina a chave"
+
+#~ msgid "add a secondary key"
+#~ msgstr "adiciona nova chave secundária"
+
+#~ msgid "delete signatures"
+#~ msgstr "remove assinaturas"
+
+#~ msgid "change the expire date"
+#~ msgstr "muda a data de validade"
+
+#~ msgid "set preference list"
+#~ msgstr "configurar lista de preferências"
+
+#~ msgid "updated preferences"
+#~ msgstr "preferências actualizadas"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Nenhuma chave secundária com índice %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key id-utilizador"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key id-utilizador"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "fazer uma assinatura separada"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "assina a chave de forma não-revogável"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "assinar a chave localmente e de forma não revogável"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "erro geral"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "erro do servidor de chaves"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Prestes a gerar um novo par de chaves %s.\n"
+#~ "              tamanho mínimo é  768 bits\n"
+#~ "         tamanho por omissão é 1024 bits\n"
+#~ "     tamanho máximo sugerido é 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA permite apenas tamanhos de 512 a 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "tamanho muito pequeno; 1024 é o valor mínimo permitido para RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "tamanho muito pequeno; 768 é o valor mínimo permitido.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "tamanho muito grande; %d é o valor máximo permitido.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Tamanhos de chave maiores que 2048 não são recomendados\n"
+#~ "porque o tempo de computação é REALMENTE longo!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Tudo bem, mas não se esqueça que a radiação do seu monitor e teclado "
+#~ "também é extremamente vulnerável a ataques!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Algoritmos experimentais não devem ser usados!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "este algoritmo de criptografia está desctualizado; por favor use um "
+#~ "algoritmo mais standard!x\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "a escrever para `%s'\n"
+
+#, fuzzy
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "impossível fazer isso em modo não-interativo\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "chave `%s' não encontrada: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "impossível criar `%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "impossível abrir %s: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                   ou \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "chave %08lX: a chave foi revogada!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "chave %08lX: a subchave foi revogada!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: a chave expirou\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Nós NÃO confiamos nesta chave\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (assinatura e cifragem)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (apenas assinatura)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (assinatura e cifragem)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (apenas cifragem)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (assinatura e cifragem)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: impossível abrir: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: AVISO: ficheiro vazio\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "impossível abrir %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Confio moderadamente\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Confio plenamente\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "assinada localmente com a sua chave %08lX em %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   assinado por %08lX em %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: impossível aceder: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: impossível criar tranca\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: impossível criar tranca\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: impossível criar: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: impossível criar directoria: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Se você quiser usar esta chave revogada assim mesmo, responda \"sim\"."
+
+#, fuzzy
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "não foi possível alterar o exec-path para %s\n"
+
+#, fuzzy
+#~ msgid "can't open file: %s\n"
+#~ msgstr "impossível abrir %s: %s\n"
+
+#, fuzzy
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "exportar os valores de confiança"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (ID principal da chave %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! subchave foi revogada: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- revogação falsa encontrada\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problema ao verificar revogação: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr "[expira: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr "[expira: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "revkey"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "impossível criar %s: %s\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[ficheiros]|cifrar ficheiros"
+
+#~ msgid "store only"
+#~ msgstr "apenas armazenar"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[ficheiros]|decifrar ficheiros"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "assinar uma chave de forma não revocável"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "assinar uma chave localmente e de forma não revocável"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "listar apenas as sequências de pacotes"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "exportar os valores de confiança"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "actualizar automaticamente a base de dados de confiança"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "consertar uma base de dados de confiança"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "retirar armadura de um ficheiro ou do \"stdin\""
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "criar armadura para um ficheiro ou \"stdin\""
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOME|usar NOME como destinatário por omissão"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "usar a chave por omissão como destinatário por omissão"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "nunca usar o terminal"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "forçar assinaturas v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "não forçar assinaturas v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "forçar assinaturas v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "não forçar assinaturas v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "sempre usar um MDC para cifrar"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "nunca usar um MDC para cifrar"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "utilizar o gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "modo não-interactivo: nunca perguntar"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "assumir sim para a maioria das perguntas"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "assumir não para a maioria das perguntas"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr ""
+#~ "adicionar este porta-chaves\n"
+#~ "à lista de porta-chaves"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "adicionar este porta-chaves secreto à lista"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOME|usar NOME como chave secreta por omissão"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|ENDEREÇO|usar este servidor para buscar chaves"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr ""
+#~ "|NOME|definir mapa de caracteres do terminal como\n"
+#~ "NOME"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[ficheiro]|escrever ifnroamções de estado para o ficheiro"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|KEYID|confiar totalmente nesta chave"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FICHEIRO|carregar módulo de extensão FICHEIRO"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emular o modo descrito no RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "configurar todas as opções de pacote, cifragem e \"digest\"\n"
+#~ "para comportamento OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "configurar todas as opções de pacote, cifragem e \"digest\"\n"
+#~ "para comportamento PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|usar mode de frase secreta N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|NOME|usar algoritmo de \"digest\" de mensagens NOME\n"
+#~ "para frases secretas"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|NOME|usar algoritmo de criptografia NOME para\n"
+#~ "frases secretas"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOME|usar algoritmo de criptografia NOME"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOME|usar algoritmo de \"digest\" de mensagens NOME"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|usar algoritmo de compressão N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "eliminar campo keyid dos pacotes cifrados"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Mostrar IDs Fotográficos"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Não mostrar IDs Fotográficos"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Configurar linha de comandos para ver fotografias"
+
+#, fuzzy
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "o algoritmo de compressão deve estar na faixa %d..%d\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "o algoritmo de compressão deve estar na faixa %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Não se tem certeza de que esta chave realmente pertence ao dono,\n"
+#~ "mas é aceite de qualquer modo\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "preferência %c%lu não é válida\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "chave %08lX: não é uma chave rfc2440 - ignorada\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "NOTA: Chave primária Elgamal detectada - pode demorar algum tempo a "
+#~ "importar\n"
+
+#~ msgid " (default)"
+#~ msgstr " (por omissão)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "erro ao enviar para `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "sucesso ao enviar para `%s' (estado=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "erro ao enviar para `%s': estado=%u\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "não consigo procurar no servidor de chaves: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "chave: %08lX: esta é uma chave ElGamal gerada pelo PGP que NÃO é segura "
+#~ "para assinaturas!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "a chave %08lX foi criada %lu segundo no futuro\n"
+#~ "(viagem no tempo ou problema no relógio)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "a chave %08lX foi criada %lu segundos no futuro\n"
+#~ "(viagem no tempo ou problema no relógio)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "chave %08lX marcada como de confiança absoluta\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "a verificar à profundidade %d assinado=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%"
+#~ "d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Seleccione o algoritmo a ser usado.\n"
+#~ "\n"
+#~ "DSA (ou DSS) é o algoritmo de assinatura digital que pode ser usado "
+#~ "apenas\n"
+#~ "para assinaturas. Este é o algoritmo recomendado porque a verificação de\n"
+#~ "assinaturas DSA é muito mais rápida que a verificação de ElGamal.\n"
+#~ "\n"
+#~ "ElGamal é um algoritmo que pode ser usado para assinatura e cifragem.\n"
+#~ "O OpenPGP distingue dois tipos deste algoritmo: um apenas para cifragem\n"
+#~ "e outro para assinatura+cifragem; na verdade são iguais, mas alguns\n"
+#~ "parâmetros precisam ser escolhidos de modo especial para criar uma chave\n"
+#~ "segura para assinatura: este programa faz isso, mas algumas outras\n"
+#~ "implementações do OpenPGP não vão necessariamente entender o tipo\n"
+#~ "assinatura+cifragem.\n"
+#~ "\n"
+#~ "A  chave primária precisa sempre ser uma chave capaz de fazer "
+#~ "assinaturas;\n"
+#~ "este é o motivo pelo qual a chave ElGamal apenas para cifragem não está\n"
+#~ "disponível neste menu."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Apesar de estas chaves estarem definidas no RFC2440, elas não são "
+#~ "recomendadas\n"
+#~ "porque não são suportadas por todos os programas e assinaturas criadas "
+#~ "com\n"
+#~ "elas são grandes e sua verificação é lenta."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu chaves verificadas até agora (%lu assinaturas)\n"
+
+#, fuzzy
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "chave %08lX: sem ID de utilizador\n"
+
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "sair"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (assinatura e cifragem)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "A utilização deste algoritmo só é suportada pelo GnuPG.  Não poderá "
+#~ "utilizar\n"
+#~ "esta chave para comunicar com utilizadores do PGP.  Este algoritmo é "
+#~ "para\n"
+#~ "além disto muito lento, e pode não ser tão seguro como as outras opções.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Criar mesmo assim?"
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "algoritmo de 'symkey' inválido detectado (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "o servidor de chaves não é totalmente compatível com HKP\n"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
new file mode 100644 (file)
index 0000000..052285f
Binary files /dev/null and b/po/pt_BR.gmo differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644 (file)
index 0000000..6a60553
--- /dev/null
@@ -0,0 +1,7575 @@
+# Portuguese (Brazilian) messages for gnupg
+# Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+# Thiago Jung Bauermann <jungmann@cwb.matrix.com.br>, 1999.
+# Revised by Rafael Caetano dos Santos <rcaetano@linux.ime.usp.br>.
+# I tried to make this one close to es_ES by Urko Lusa
+#
+# Rafael Caetano dos Santos <rcaetano@linux.ime.usp.br> used to be 
+# the last translator but he can't continue his work.
+#
+# Designated-Translator: none
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GNU gnupg 1.0\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 1998-11-20 23:46:36-0200\n"
+"Last-Translator:\n"
+"Language-Team: ?\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr ""
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr ""
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr ""
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "impossível abrir `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: cipher/random.c:458
+#, fuzzy, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr ""
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr ""
+
+#: cipher/random.c:474
+#, fuzzy
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "AVISO: dados de notação inválidos encontrados\n"
+
+#: cipher/random.c:482
+#, fuzzy, c-format
+msgid "can't read `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr ""
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, fuzzy, c-format
+msgid "can't create `%s': %s\n"
+msgstr "impossível criar %s: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, fuzzy, c-format
+msgid "can't write `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: cipher/random.c:569
+#, fuzzy, c-format
+msgid "can't close `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "AVISO: usando gerador de números aleatórios inseguro!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"O gerador de números aleatórios é apenas um \"remendo\"\n"
+"para poder funcionar - não é de modo algum um bom gerador!\n"
+"\n"
+"NÃO USE NENHUM DADO GERADO POR ESTE PROGRAMA!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Não há bytes aleatórios suficientes. Por favor, faça algum outro trabalho\n"
+"para que o sistema possa coletar mais entropia!\n"
+"(São necessários mais %d bytes)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "falha ao inicializar o banco de dados de confiabilidade: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "%s: falha ao criar tabela de \"hash\": %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "enumeração de blocos de chaves falhou: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "erro na criação da frase secreta: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: erro lendo registro livre: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "%lu chaves processadas\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "gerar um novo par de chaves"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "falha ao inicializar o banco de dados de confiabilidade: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "enumeração de blocos de chaves falhou: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "assinatura %s de: %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "nenhum dado OpenPGP válido encontrado.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armadura: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "cabeçalho de armadura inválido: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "cabeçalho de armadura: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "cabeçalho de assinatura em texto puro inválido\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "assinaturas em texto puro aninhadas\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "armadura inesperada:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "linha com hífen inválida: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "caractere radix64 inválido %02x ignorado\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "fim de arquivo prematuro (sem CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "fim de arquivo prematuro (no CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC malformado\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "erro de CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "fim de arquivo prematuro (no \"Trailer\")\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "erro na linha \"trailer\"\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "nenhum dado OpenPGP válido encontrado.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armadura inválida: linha maior que %d caracteres\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"caractere \"quoted printable\" na armadura  - provavelmente um MTA com bugs "
+"foi usado\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "chave secreta não disponível"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "impossível fazer isso em modo não-interativo\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Sua opção? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr ""
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "não processado(s)"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "escrevendo certificado público para `%s'\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "lista preferências"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "Caractere inválido no nome\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Caractere inválido no nome\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "erro: impressão digital inválida\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "Impressão digital:"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "erro: impressão digital inválida\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "nenhum dado OpenPGP válido encontrado.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/card-util.c:1033
+#, fuzzy
+msgid "Replace existing key? (y/N) "
+msgstr "Realmente assinar? "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+#, fuzzy
+msgid "Replace existing keys? (y/N) "
+msgstr "Realmente assinar? "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Por favor selecione o tipo de chave desejado:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Opção inválida.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "rev- revogações de chaves incorreta\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "algoritmo de compressão desconhecido"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "chave secreta não disponível"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "sair deste menu"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "comandos conflitantes\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "mostra esta ajuda"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Nenhuma ajuda disponível"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "muda a data de validade"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "muda os valores de confiança"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "mostra impressão digital"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "gerar um novo par de chaves"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Comando> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "comandos conflitantes\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "comandos conflitantes\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+# help ou ajuda ???
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Comando inválido (tente \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "chave secreta não disponível"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "enumeração de blocos de chaves falhou: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+#, fuzzy
+msgid "Enter New Admin PIN: "
+msgstr "Digite o identificador de usuário: "
+
+#: g10/cardglue.c:918
+#, fuzzy
+msgid "Enter New PIN: "
+msgstr "Digite o identificador de usuário: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+#, fuzzy
+msgid "Enter PIN: "
+msgstr "Digite o identificador de usuário: "
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Repita a frase secreta: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "A frase secreta não foi repetida corretamente; tente outra vez.\n"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "impossível abrir `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr ""
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "usuário `%s' não encontrado: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, fuzzy, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr ""
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "impossível fazer isso em modo não-interativo sem \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Deletar esta chave do chaveiro? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Esta é uma chave secreta! - realmente deletar? "
+
+#: g10/delkey.c:165
+#, fuzzy, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "enumeração de blocos de chaves falhou: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr ""
+
+#: g10/delkey.c:206
+#, fuzzy, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "há uma chave secreta para esta chave pública!\n"
+
+#: g10/delkey.c:208
+#, fuzzy
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "use a opção \"--delete-secret-key\" para deletá-la antes.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "erro na criação da frase secreta: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr ""
+
+#: g10/encode.c:231
+#, fuzzy, c-format
+msgid "using cipher %s\n"
+msgstr "assinatura falhou: %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, fuzzy, c-format
+msgid "`%s' already compressed\n"
+msgstr "%lu chaves processadas\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "lendo de `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "NOTA: algoritmo de criptografia %d não encontrado nas preferências\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "NOTA: algoritmo de criptografia %d não encontrado nas preferências\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr ""
+
+#: g10/encode.c:812
+#, fuzzy, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s criptografado para: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "dados criptografados com %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "criptografado com algoritmo desconhecido %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"AVISO: A mensagem foi criptografada com uma chave fraca na criptografia\n"
+"simétrica.\n"
+
+#: g10/encr-data.c:128
+#, fuzzy
+msgid "problem handling encrypted packet\n"
+msgstr "eliminar o campo keyid dos pacotes criptografados\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr ""
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, fuzzy, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "%s: impossível criar diretório: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr "%s: erro lendo registro de versão: %s\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "impossível abrir %s: %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "impossível abrir %s: %s\n"
+
+#: g10/exec.c:513
+#, fuzzy, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "%s: erro lendo registro de versão: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr ""
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr ""
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr ""
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr ""
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr ""
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"A assinatura será marcada como não-exportável.\n"
+"\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr ""
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revoga uma chave secundária"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "chave secreta incorreta"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "chave %08lX: não é uma chave rfc2440 - ignorada\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "chave %08lX: não é uma chave rfc2440 - ignorada\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "chave %08lX: certificado de revogação no local errado - ignorada\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "falha ao inicializar o banco de dados de confiabilidade: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr ""
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "AVISO: nada exportado\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Comandos:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[arquivo]|fazer uma assinatura"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[arquivo]|fazer uma assinatura em texto puro"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "fazer uma assinatura separada"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "criptografar dados"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr ""
+"criptografar apenas com criptografia\n"
+"simétrica"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "descriptografar dados (padrão)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verificar uma assinatura"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "listar as chaves"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "listar as chaves e as assinaturas"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "verificar as assinaturas das chaves"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "listar as chaves e as impressões digitais"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "listar as chaves secretas"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "gerar um novo par de chaves"
+
+#: g10/gpg.c:398
+#, fuzzy
+msgid "remove keys from the public keyring"
+msgstr "remover a chave do chaveiro público"
+
+#: g10/gpg.c:400
+#, fuzzy
+msgid "remove keys from the secret keyring"
+msgstr "remover a chave do chaveiro secreto"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "assinar uma chave"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "assinar uma chave localmente"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "assinar ou editar uma chave"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "gerar um certificado de revogação"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportar chaves"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportar chaves para um servidor"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importar chaves de um servidor"
+
+#: g10/gpg.c:410
+#, fuzzy
+msgid "search for keys on a key server"
+msgstr "exportar chaves para um servidor"
+
+#: g10/gpg.c:412
+#, fuzzy
+msgid "update all keys from a keyserver"
+msgstr "importar chaves de um servidor"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importar/fundir chaves"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "atualizar o banco de dados de confiabilidade"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [arquivos]|imprimir \"digests\" de mensagens"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opções:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "criar saída com armadura ascii"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NOME|criptografar para NOME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+"usar este identificador de usuário para\n"
+"assinar ou descriptografar"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+"|N|estabelecer nível de compressão N\n"
+"(0 desabilita)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "usar modo de texto canônico"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "usar como arquivo de saída"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "detalhado"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "não fazer alterações"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr ""
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exemplos:\n"
+"\n"
+" -se -r Bob [arquivo]       assinar e criptografar para usuário Bob\n"
+" --clearsign [arquivo]      criar uma assinatura em texto puro\n"
+" --detach-sign [arquivo]    criar uma assinatura separada\n"
+" --list-keys [nomes]        mostrar chaves\n"
+" --fingerprint [nomes]      mostrar impressões digitais\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Por favor comunique bugs para <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Uso: gpg [opções] [arquivos] (-h para ajuda)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaxe: gpg [opções] [arquivos]\n"
+"assina, verifica, criptografa ou descriptografa\n"
+"a operação padrão depende dos dados de entrada\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmos suportados:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr ""
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr ""
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr ""
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+#, fuzzy
+msgid "Compression: "
+msgstr "Comentário: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "uso: gpg [opções] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "comandos conflitantes\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr ""
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Nenhuma assinatura correspondente no chaveiro secreto\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "a URL de política dada é inválida\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "alterna entre listagem de chave secreta e pública"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Nenhuma assinatura correspondente no chaveiro secreto\n"
+
+#: g10/gpg.c:1954
+#, fuzzy, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTA: arquivo de opções padrão `%s' inexistente\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTA: arquivo de opções padrão `%s' inexistente\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "arquivo de opções `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "lendo opções de `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTA: %s não é para uso normal!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "impossível escrever para o chaveiro: %s\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "chaveiro inválido"
+
+#: g10/gpg.c:2537
+#, fuzzy, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/gpg.c:2540
+#, fuzzy
+msgid "invalid import options\n"
+msgstr "armadura inválida"
+
+#: g10/gpg.c:2547
+#, fuzzy, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/gpg.c:2550
+#, fuzzy
+msgid "invalid export options\n"
+msgstr "chaveiro inválido"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "armadura inválida"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "a URL de política dada é inválida\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s não é um conjunto de caracteres válido\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "chaveiro inválido"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr ""
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "AVISO: O programa pode criar um arquivo core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr ""
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s não é permitido com %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s não faz sentido com %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "chave RSA não pode ser usada nesta versão\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "o algoritmo de criptografia selecionado não é válido\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "o algoritmo de \"digest\" selecionado não é válido\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "o algoritmo de criptografia selecionado não é válido\n"
+
+#: g10/gpg.c:3004
+#, fuzzy
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "o algoritmo de \"digest\" selecionado não é válido\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed deve ser maior que 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed deve ser maior que 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth deve estar na entre 1 e 255\n"
+
+#: g10/gpg.c:3025
+#, fuzzy
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "modo S2K inválido: deve ser 0, 1 ou 3\n"
+
+#: g10/gpg.c:3027
+#, fuzzy
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "modo S2K inválido: deve ser 0, 1 ou 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTA: o modo S2K simples (0) não é recomendável\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "modo S2K inválido: deve ser 0, 1 ou 3\n"
+
+#: g10/gpg.c:3041
+#, fuzzy
+msgid "invalid default preferences\n"
+msgstr "lista preferências"
+
+#: g10/gpg.c:3050
+#, fuzzy
+msgid "invalid personal cipher preferences\n"
+msgstr "lista preferências"
+
+#: g10/gpg.c:3054
+#, fuzzy
+msgid "invalid personal digest preferences\n"
+msgstr "lista preferências"
+
+#: g10/gpg.c:3058
+#, fuzzy
+msgid "invalid personal compress preferences\n"
+msgstr "lista preferências"
+
+#: g10/gpg.c:3091
+#, fuzzy, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s não faz sentido com %s!\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "o algoritmo de criptografia selecionado não é válido\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "falha ao inicializar o banco de dados de confiabilidade: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nome_do_arquivo]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nome_do_arquivo]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "descriptografia falhou: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nome_do_arquivo]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [nome_do_arquivo]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nome_do_arquivo]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nome_do_arquivo]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [nome_do_arquivo]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr ""
+
+#: g10/gpg.c:3380
+#, fuzzy
+msgid "--sign --symmetric [filename]"
+msgstr "--symmetric [nome_do_arquivo]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nome_do_arquivo]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nome_do_arquivo]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id-usuário"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id-usuário"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id-usuário [comandos]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id-usuário] [chaveiro]"
+
+#: g10/gpg.c:3560
+#, fuzzy, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/gpg.c:3562
+#, fuzzy, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "enumeração de chaves secretas falhou: %s\n"
+
+#: g10/gpg.c:3564
+#, fuzzy, c-format
+msgid "key export failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/gpg.c:3575
+#, fuzzy, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "get_dir_record: search_record falhou: %s\n"
+
+#: g10/gpg.c:3585
+#, fuzzy, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "enumeração de chaves secretas falhou: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "retirada de armadura falhou: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "criação de armadura falhou: %s\n"
+
+# "hash" poderia ser "espalhamento", mas não fica claro
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritmo de hash inválido `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nome_do_arquivo]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Vá em frente e digite sua mensagem ...\n"
+
+#: g10/gpg.c:4162
+#, fuzzy
+msgid "the given certification policy URL is invalid\n"
+msgstr "a URL de política dada é inválida\n"
+
+#: g10/gpg.c:4164
+#, fuzzy
+msgid "the given signature policy URL is invalid\n"
+msgstr "a URL de política dada é inválida\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "a URL de política dada é inválida\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "entradas demais no cache pk - desativado\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[usuário não encontrado]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "há uma chave secreta para esta chave pública!\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "usando chave secundária %08lX ao invés de chave primária %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "chave %08lX: chave secreta sem chave pública - ignorada\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "ser mais silencioso"
+
+#: g10/gpgv.c:75
+#, fuzzy
+msgid "take the keys from this keyring"
+msgstr "Deletar esta chave do chaveiro? "
+
+#: g10/gpgv.c:77
+#, fuzzy
+msgid "make timestamp conflicts only a warning"
+msgstr "conflito de \"timestamp\""
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr ""
+"|DA|escrever informações de estado para o\n"
+"descritor de arquivo DA"
+
+#: g10/gpgv.c:102
+#, fuzzy
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Uso: gpg [opções] [arquivos] (-h para ajuda)"
+
+#: g10/gpgv.c:105
+#, fuzzy
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintaxe: gpgm [opções] [arquivos]\n"
+"Utilitário de manutenção do GnuPG\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Você decide que valor usar aqui; este valor nunca será exportado para\n"
+"terceiros. Precisamos dele implementar a rede de confiança, que não tem\n"
+"nada a ver com a rede de certificados (implicitamente criada)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Se você quiser usar esta chave não confiável assim mesmo, responda \"sim\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr ""
+"Digite o ID de usuário do destinatário para o qual você quer enviar a\n"
+"mensagem."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Digite o tamanho da chave"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Responda \"sim\" ou \"não\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Digite o valor necessário conforme pedido.\n"
+"É possível digitar uma data ISO (AAAA-MM-DD) mas você não terá uma boa\n"
+"reação a erros - o sistema tentará interpretar o valor dado como um "
+"intervalo."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Digite o nome do possuidor da chave"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "por favor digite um endereço de email (opcional mas recomendado)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Por favor digite um comentário (opcional)"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  para mudar o nome.\n"
+"C  para mudar o comentário.\n"
+"E  para mudar o endereço de correio eletrônico.\n"
+"O  para continuar a geração da chave.\n"
+"S  para interromper a geração da chave."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Responda \"sim\" (ou apenas \"s\") se quiser gerar a subchave."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Responda \"sim\" se quiser assinar TODOS os IDs de usuário"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Responda \"sim\" se quiser realmente remover este ID de usuário.\n"
+"Todos os certificados também serão perdidos!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Responda \"sim\" se quiser remover a subchave"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Esta é uma assinatura válida na chave; normalmente não é desejável\n"
+"remover esta assinatura porque ela pode ser importante para estabelecer\n"
+"uma conexão de confiança à chave ou a outra chave certificada por esta."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Esta assinatura não pode ser verificada porque você não tem a chave\n"
+"correspondente. Você deve adiar sua remoção até saber que chave foi usada\n"
+"porque a chave desta assinatura pode estabelecer uma conexão de confiança\n"
+"através de outra chave já certificada."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "A assinatura não é válida. Faz sentido removê-la de seu chaveiro."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Esta é uma assinatura que liga o ID de usuário à chave. Geralmente\n"
+"não é uma boa idéia remover tal assinatura. É possível que o GnuPG\n"
+"não consiga mais usar esta chave. Faça isto apenas se por alguma\n"
+"razão esta auto-assinatura não for válida e há uma segunda disponível."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+
+#: g10/helptext.c:230
+#, fuzzy
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Por favor digite a frase secreta"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Por favor repita a última frase secreta, para ter certeza do que você "
+"digitou."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Dê o nome para o arquivo ao qual a assinatura se aplica"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Responda \"sim\" se quiser sobrescrever o arquivo"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Por favor digite um novo nome de arquivo. Se você apenas apertar RETURN o\n"
+"arquivo padrão (que é mostrado em colchetes) será usado."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Nenhuma ajuda disponível"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Nenhuma ajuda disponível para `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "atualizar o banco de dados de confiabilidade"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "lid %lu não tem chave\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "chave secreta incorreta"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "ignorando bloco do tipo %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu chaves processadas até agora\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Número total processado: %lu\n"
+
+#: g10/import.c:295
+#, fuzzy, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "           novas subchaves: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "          sem IDs de usuários: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "              importados: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             não modificados: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          novos IDs de usuários: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "           novas subchaves: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        novas assinaturas: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "   novas revogações de chaves: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      chaves secretas lidas: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  chaves secretas importadas: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " chaves secretas não modificadas: %lu\n"
+
+#: g10/import.c:322
+#, fuzzy, c-format
+msgid "          not imported: %lu\n"
+msgstr "              importados: %lu"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "        novas assinaturas: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      chaves secretas lidas: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Você assinou estes IDs de usuário:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "assinatura %s de: %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "chave %08lX: sem ID de usuário\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "chave %08lX: aceito ID de usuário sem auto-assinatura '"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "chave %08lX: sem IDs de usuários válidos\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "isto pode ser causado por falta de auto-assinatura\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "chave %08lX: chave pública não encontrada: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "chave %08lX: não é uma chave rfc2440 - ignorada\n"
+
+#: g10/import.c:798
+#, fuzzy, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "impossível escrever chaveiro: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "escrevendo para `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "chave %08lX: chave pública importada\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "chave %08lX: não corresponde à nossa cópia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "chave %08lX: impossível localizar bloco de chaves original: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "chave %08lX: impossível ler bloco de chaves original: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "chave %8lX: 1 novo ID de usuário\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "chave %08lX: %d novos IDs de usuários\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "chave %08lX: 1 nova assinatura\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "chave %08lX: %d novas assinaturas\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "chave %08lX: 1 nova subchave\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "chave %08lX: %d novas subchaves\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "chave %08lX: %d novas assinaturas\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "chave %08lX: %d novas assinaturas\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "chave %08lX: %d novos IDs de usuários\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "chave %08lX: %d novos IDs de usuários\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "chave %08lX: não modificada\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "chave %08lX: chave secreta sem chave pública - ignorada\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, fuzzy, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "impossível bloquear chaveiro secreto: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "chave %08lX: chave secreta importada\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "chave %08lX: já está no chaveiro secreto\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "chave %08lX: chave secreta não encontrada: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"chave %08lX: sem chave pública - impossível aplicar certificado\n"
+"de revogação\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "chave %08lX: certificado de revogação inválido: %s - rejeitado\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "chave %08lX: certificado de revogação importado\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "chave %08lX: nenhum ID de usuário para assinatura\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "chave %08lX: algoritmo de chave pública não suportado\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "chave %08lX: auto-assinatura inválida\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "chave %08lX: algoritmo de chave pública não suportado\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "chave %08lX: ligação de subchave inválida\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "chave %08lX: ligação de subchave inválida\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "chave %08lX.%lu: Revogação de subchave válida\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "chave %08lX: ligação de subchave inválida\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "chave %08lX: ignorado ID de usuário '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "chave %08lX: subchave ignorada\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "chave %08lX: assinatura não exportável (classe %02x) - ignorada\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "chave %08lX: certificado de revogação no local errado - ignorada\n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "chave %08lX: certificado de revogação inválido: %s - ignorada\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "chave %08lX: certificado de revogação no local errado - ignorada\n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "chave %08lX: assinatura não exportável (classe %02x) - ignorada\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "chave %08lX: detectado ID de usuário duplicado - unido\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "chave %08lX: certificado de revogação adicionado\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "chave %08lX: %d novas assinaturas\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "lid %lu não tem chave\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/keydb.c:168
+#, fuzzy, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/keydb.c:175
+#, fuzzy, c-format
+msgid "keyring `%s' created\n"
+msgstr "%s: chaveiro criado\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "%s: erro de leitura de bloco de chaves: %s\n"
+
+#: g10/keydb.c:698
+#, fuzzy, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "%s: falha ao criar tabela de \"hash\": %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revogação]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[auto-assinatura]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 assinatura incorreta\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d assinaturas incorretas\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 assinatura não verificada por falta de chave\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d assinaturas não verificadas por falta de chaves\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 assinatura não verificada devido a um erro\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d assinaturas não verificadas devido a erros\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 ID de usuário sem auto-assinatura válida detectado\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d IDs de usuários sem auto-assinaturas válidas detectados\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Por favor decida quanto você confia neste usuário para\n"
+"verificar corretamente as chaves de outros usuários\n"
+"(olhando em passaportes, checando impressões digitais\n"
+"de outras fontes...)?\n"
+"\n"
+" 1 = Não sei\n"
+" 2 = Eu NÃO confio\n"
+" 3 = Eu confio moderadamente\n"
+" 4 = Eu confio completamente\n"
+" s = Mostrar mais informações\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, fuzzy, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+#, fuzzy
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr ""
+
+#: g10/keyedit.c:627
+#, fuzzy, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:655
+#, fuzzy, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Realmente assinar? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "Já assinado pela chave %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "Já assinado pela chave %08lX\n"
+
+#: g10/keyedit.c:788
+#, fuzzy
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nada para assinar com a chave %08lX\n"
+
+#: g10/keyedit.c:825
+#, fuzzy
+msgid "This key has expired!"
+msgstr "Nota: Esta chave expirou!\n"
+
+#: g10/keyedit.c:843
+#, fuzzy, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr ""
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr ""
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr ""
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Você tem certeza de que quer assinar esta chave com\n"
+"sua chave: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr "isto pode ser causado por falta de auto-assinatura\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"A assinatura será marcada como não-exportável.\n"
+"\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"A assinatura será marcada como não-exportável.\n"
+"\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"A assinatura será marcada como não-exportável.\n"
+"\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"A assinatura será marcada como não-exportável.\n"
+"\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr ""
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr ""
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Realmente assinar? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "assinatura falhou: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+#, fuzzy
+msgid "Secret parts of primary key are not available.\n"
+msgstr "chave secreta não disponível"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "chave secreta não disponível"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Impossível editar esta chave: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Digite a nova frase para esta chave secreta.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+#, fuzzy
+msgid "passphrase not correctly repeated; try again"
+msgstr "A frase secreta não foi repetida corretamente; tente outra vez.\n"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Você não quer uma frase secreta - provavelmente isto é uma *má* idéia!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Você realmente quer fazer isso? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "movendo a assinatura da chave para o local correto\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "gravar e sair"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "mostra impressão digital"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "lista chave e identificadores de usuários"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "seleciona ID de usuário N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "seleciona ID de usuário N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revoga assinaturas"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "assina a chave localmente"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "lid %lu: id de usuário sem assinatura\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "adiciona um novo ID de usuário"
+
+#: g10/keyedit.c:1387
+#, fuzzy
+msgid "add a photo ID"
+msgstr "adiciona um novo ID de usuário"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "remove ID de usuário"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "remove uma chave secundária"
+
+#: g10/keyedit.c:1408
+#, fuzzy
+msgid "add a revocation key"
+msgstr "adiciona nova chave secundária"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Você não pode modificar a data de validade de uma chave v3\n"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr ""
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "alterna entre listagem de chave secreta e pública"
+
+#: g10/keyedit.c:1419
+#, fuzzy
+msgid "list preferences (expert)"
+msgstr "lista preferências"
+
+#: g10/keyedit.c:1421
+#, fuzzy
+msgid "list preferences (verbose)"
+msgstr "lista preferências"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "muda a frase secreta"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "muda os valores de confiança"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "adiciona um novo ID de usuário"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revoga uma chave secundária"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "ativa uma chave"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "desativa uma chave"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr ""
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Chave secreta disponível.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "A chave secreta é necessária para fazer isto.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr ""
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+#, fuzzy
+msgid "Key is revoked."
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Realmente assinar todos os IDs de usuário? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Sugestão: Selecione os IDs de usuário para assinar\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "classe de assinatura desconhecida"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr ""
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Você precisa selecionar pelo menos um ID de usuário.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Você não pode remover o último ID de usuário!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Realmente remover este ID de usuário? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Realmente remover este ID de usuário? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Você deve selecionar pelo menos uma chave.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Você deve selecionar pelo menos uma chave.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Você realmente quer remover as chaves selecionadas? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Você realmente quer remover esta chave? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Realmente remover este ID de usuário? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Você realmente quer revogar esta chave? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Você realmente quer revogar as chaves selecionadas? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Você realmente quer revogar esta chave? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "lista preferências"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Realmente remover todos os IDs de usuário selecionados? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Realmente gerar os certificados de revogação? (s/N)"
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Salvar alterações? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Sair sem salvar? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "atualização falhou: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "atualização da chave secreta falhou: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Chave não alterada, nenhuma atualização é necessária.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr ""
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr ""
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notação: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr ""
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "impossível criar %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "revkey"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr "A chave expira em %s\n"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr "A chave expira em %s\n"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr "trust"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr "trust"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Esta chave foi desativada"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "revkey"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+#, fuzzy
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Deletar esta assinatura válida? (s/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Deletar esta assinatura inválida? (s/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Deletar esta assinatura desconhecida? (s/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Realmente remover esta auto-assinatura? (s/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d assinatura removida.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d assinaturas removidas.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nada removido.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "armadura inválida"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+
+#: g10/keyedit.c:3377
+#, fuzzy
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Digite o tamanho da chave"
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Por favor remova as seleções das chaves secretas.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Por favor selecione no máximo uma chave secundária.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Modificando a data de validade para uma chave secundária.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Modificando a data de validade para uma chave primária.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Você não pode modificar a data de validade de uma chave v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Nenhuma assinatura correspondente no chaveiro secreto\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+#, fuzzy
+msgid "Please select exactly one user ID.\n"
+msgstr "Você precisa selecionar pelo menos um ID de usuário.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "chave %08lX: auto-assinatura inválida\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notação: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Sobrescrever (s/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Nenhum ID de usuário com índice %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Nenhum ID de usuário com índice %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Nenhum ID de usuário com índice %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID de usuário: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   assinado por %08lX em %s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr ""
+
+#: g10/keyedit.c:4636
+#, fuzzy, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/keyedit.c:4640
+#, fuzzy
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/keyedit.c:4644
+#, fuzzy
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Você assinou estes IDs de usuário:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr "assinar uma chave localmente"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revogado por %08lX em %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Você está prestes a revogar estas assinaturas:\n"
+
+#: g10/keyedit.c:4746
+#, fuzzy
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Realmente gerar os certificados de revogação? (s/N)"
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "nenhuma chave secreta\n"
+
+#: g10/keyedit.c:4846
+#, fuzzy, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "A chave é protegida.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "ignorado `%s': duplicado\n"
+
+# muitas ou demais ???
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "Preferências demais"
+
+# muitas ou demais ???
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "Preferências demais"
+
+# muitas ou demais ???
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "Preferências demais"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "Caractere inválido no nome\n"
+
+#: g10/keygen.c:872
+#, fuzzy
+msgid "writing direct signature\n"
+msgstr "escrevendo auto-assinatura\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "escrevendo auto-assinatura\n"
+
+# key binding ???
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "escrevendo assinatura ligada a uma chave\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, fuzzy, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "O tamanho de chave pedido é %u bits\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, fuzzy, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "arredondado para %u bits\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "criptografar dados"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Por favor selecione o tipo de chave desejado:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA e ElGamal (padrão)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (apenas assinatura)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#: g10/keygen.c:1441
+#, fuzzy, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) DSA (apenas assinatura)\n"
+
+#: g10/keygen.c:1443
+#, fuzzy, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "O par de chaves DSA terá 1024 bits.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Que tamanho de chave você quer? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "O tamanho de chave pedido é %u bits\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "arredondado para %u bits\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Por favor especifique por quanto tempo a chave deve ser válida.\n"
+"         0 = chave não expira\n"
+"      <n>  = chave expira em n dias\n"
+"      <n>w = chave expira em n semanas\n"
+"      <n>m = chave expira em n meses\n"
+"      <n>y = chave expira em n anos\n"
+
+#: g10/keygen.c:1621
+#, fuzzy
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Por favor especifique por quanto tempo a chave deve ser válida.\n"
+"         0 = chave não expira\n"
+"      <n>  = chave expira em n dias\n"
+"      <n>w = chave expira em n semanas\n"
+"      <n>m = chave expira em n meses\n"
+"      <n>y = chave expira em n anos\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "A chave é valida por? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "A chave é valida por? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valor inválido\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "A chave não expira nunca\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "A chave não expira nunca\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "A chave expira em %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Seu sistema não consegue mostrar datas além de 2038.\n"
+"Apesar disso, elas serão corretamente manipuladas até 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Está correto (s/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Você precisa de um identificador de usuário para identificar sua chave; o\n"
+"programa constrói o identificador a partir do Nome Completo, Comentário e\n"
+"Endereço Eletrônico desta forma:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nome completo: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Caractere inválido no nome\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "O nome não pode começar com um dígito\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "O nome deve ter pelo menos 5 caracteres\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Endereço de correio eletrônico: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Endereço eletrônico inválido\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comentário: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Caractere inválido no comentário\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Você está usando o conjunto de caracteres `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Você selecionou este identificador de usuário:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoSs"
+
+#: g10/keygen.c:1828
+#, fuzzy
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Muda (N)ome, (C)omentário, (E)ndereço ou (O)k/(S)air? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Muda (N)ome, (C)omentário, (E)ndereço ou (O)k/(S)air? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr ""
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Você precisa de uma frase secreta para proteger sua chave.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr ""
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Precisamos gerar muitos bytes aleatórios. É uma boa idéia realizar outra\n"
+"atividade (digitar no teclado, mover o mouse, usar os discos) durante a\n"
+"geração dos números primos; isso dá ao gerador de números aleatórios\n"
+"uma chance melhor de conseguir entropia suficiente.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Geração de chave cancelada.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, fuzzy, c-format
+msgid "writing public key to `%s'\n"
+msgstr "escrevendo certificado público para `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, fuzzy, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "escrevendo certificado privado para `%s'\n"
+
+#: g10/keygen.c:3041
+#, fuzzy, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "chave %08lX: chave pública não encontrada: %s\n"
+
+#: g10/keygen.c:3047
+#, fuzzy, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "impossível bloquear chaveiro secreto: %s\n"
+
+#: g10/keygen.c:3065
+#, fuzzy, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, fuzzy, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "chaves pública e privada criadas e assinadas.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Note que esta chave não pode ser usada para criptografia. Você pode usar\n"
+"o comando \"--edit-key\" para gerar uma chave secundária para esse fim.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "A geração de chaves falhou: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"a chave foi criada %lu segundo no futuro\n"
+"(viagem no tempo ou problema no relógio)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in 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"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Realmente criar? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "enumeração de blocos de chaves falhou: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "impossível criar %s: %s\n"
+
+#: g10/keygen.c:3582
+#, fuzzy, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTA: chave secreta %08lX expirou %s\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr ""
+
+#: g10/keylist.c:265
+#, fuzzy
+msgid "Critical signature policy: "
+msgstr "assinatura %s de: %s\n"
+
+#: g10/keylist.c:267
+#, fuzzy
+msgid "Signature policy: "
+msgstr "assinatura %s de: %s\n"
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+#, fuzzy
+msgid "Critical signature notation: "
+msgstr "Notação: "
+
+#: g10/keylist.c:361
+#, fuzzy
+msgid "Signature notation: "
+msgstr "Notação: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr ""
+
+#: g10/keylist.c:1505
+#, fuzzy
+msgid "Primary key fingerprint:"
+msgstr "listar as chaves e as impressões digitais"
+
+#: g10/keylist.c:1507
+#, fuzzy
+msgid "     Subkey fingerprint:"
+msgstr "       Impressão digital:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+#, fuzzy
+msgid " Primary key fingerprint:"
+msgstr "       Impressão digital:"
+
+#: g10/keylist.c:1516
+#, fuzzy
+msgid "      Subkey fingerprint:"
+msgstr "       Impressão digital:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "       Impressão digital:"
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "criação de armadura falhou: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "AVISO: existem 2 arquivos com informações confidenciais.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s é o não modificado\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s é o novo\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Por favor conserte este possível furo de segurança\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "erro na escrita do chaveiro `%s': %s\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "listar as chaves e as assinaturas"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "listar as chaves e as assinaturas"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: chaveiro criado\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "a URL de política dada é inválida\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "chaveiro inválido"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "usuário `%s' não encontrado: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "usuário `%s' não encontrado: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "impossível escrever para o chaveiro: %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "impossível escrever para o chaveiro: %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "exportar chaves para um servidor"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "lendo opções de `%s'\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr ""
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"assinado com sua chave %08lX em %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "exportar chaves para um servidor"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "lendo opções de `%s'\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "chaveiro inválido"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "erro geral"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "erro geral"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "enumeração de chaves secretas falhou: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, fuzzy, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "%s não é um mapa de caracteres válido\n"
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "impossível escrever para o chaveiro: %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "impossível escrever para o chaveiro: %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr ""
+
+#: g10/mainproc.c:291
+#, fuzzy, c-format
+msgid "%s encrypted session key\n"
+msgstr "dados criptografados com %s\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "criptografado com algoritmo desconhecido %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "a chave pública é %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "dados criptografados com chave pública: DEK válido\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "criptografado com chave %u-bit %s, ID %08lX, criada em %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                   ou \""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "criptografado com chave %s, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "descriptografia de chave pública falhou: %s\n"
+
+#: g10/mainproc.c:508
+#, fuzzy, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "Repita a frase secreta: "
+
+#: g10/mainproc.c:510
+#, fuzzy
+msgid "encrypted with 1 passphrase\n"
+msgstr "Repita a frase secreta: "
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, fuzzy, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "dados criptografados com %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "descriptografia correta\n"
+
+#: g10/mainproc.c:585
+#, fuzzy
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVISO: nada exportado\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "CUIDADO: a mensagem criptografada foi manipulada!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "descriptografia falhou: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTA: o remetente solicitou \"apenas-para-seus-olhos\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nome de arquivo original='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revogação isolada - use \"gpg --import\" para aplicá-la\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Assinatura correta de \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verificação de assinatura suprimida\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "fazer uma assinatura separada"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                   ou \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Assinatura feita em %.*s usando %s, ID da chave %08lX\n"
+
+#: g10/mainproc.c:1544
+#, fuzzy
+msgid "Key available at: "
+msgstr "Nenhuma ajuda disponível"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Assinatura INCORRETA de \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Assinatura correta de \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Assinatura correta de \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr ""
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                   ou \""
+
+#: g10/mainproc.c:1863
+#, fuzzy, c-format
+msgid "Signature expired %s\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/mainproc.c:1868
+#, fuzzy, c-format
+msgid "Signature expires %s\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/mainproc.c:1871
+#, fuzzy, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "assinatura %s de: %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr ""
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr ""
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+#, fuzzy
+msgid "unknown"
+msgstr "versão desconhecida"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Impossível verificar assinatura: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+#, fuzzy
+msgid "not a detached signature\n"
+msgstr "fazer uma assinatura separada"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "assinatura isolada da classe 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "formato de assinatura antigo (PGP2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "pacote raiz inválido detectado em proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "impossível desativar core dumps: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "atualização do banco de dados de confiabilidade falhou: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "banco de dados de confiabilidade: leitura falhou (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "impossível manipular algoritmo de chave pública %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "algoritmo de criptografia não implementado"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "assinatura %s de: %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "NOTA: algoritmo de criptografia %d não encontrado nas preferências\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr ""
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "rev- revogações de chaves incorreta\n"
+
+#: g10/misc.c:681
+#, fuzzy, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/misc.c:685
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr ""
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#: g10/misc.c:707
+#, fuzzy
+msgid "Uncompressed"
+msgstr "não processado(s)"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "não processado(s)"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr ""
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "lendo opções de `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "destinatário padrão desconhecido `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Arquivo `%s' já existe. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Sobrescrever (s/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: sufixo desconhecido\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Digite novo nome de arquivo"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "escrevendo em \"stdout\"\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "assumindo dados assinados em `%s'\n"
+
+#: g10/openfile.c:390
+#, fuzzy, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "%s: novo arquivo de opções criado\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: diretório criado\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "impossível manipular algoritmo de chave pública %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpacote do tipo %d tem bit crítico ligado\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr ""
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr ""
+
+#: g10/passphrase.c:345
+#, fuzzy, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "algoritmo de proteção %d não é suportado\n"
+
+#: g10/passphrase.c:362
+#, fuzzy, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr ""
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (ID principal da chave %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"\n"
+"Você precisa de uma frase secreta para desbloquear a chave secreta do\n"
+"usuário: \"%.*s\"\n"
+"%u-bit %s chave, ID %08lX, criada %s%s\n"
+
+#: g10/passphrase.c:571
+#, fuzzy
+msgid "Repeat passphrase\n"
+msgstr "Repita a frase secreta: "
+
+#: g10/passphrase.c:573
+#, fuzzy
+msgid "Enter passphrase\n"
+msgstr "Digite a frase secreta: "
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr ""
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "impossível pedir senha em modo não-interativo\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Digite a frase secreta: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Você precisa de uma frase secreta para desbloquear a chave secreta do\n"
+"usuário: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "chave de %u-bit/%s, ID %08lX, criada em %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repita a frase secreta: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr ""
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "impossível abrir arquivo: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/photoid.c:165
+#, fuzzy
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Está correto (s/n)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+#, fuzzy
+msgid "unable to display photo ID!\n"
+msgstr "impossível abrir %s: %s\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr ""
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+#, fuzzy
+msgid "Key is superseded"
+msgstr "A chave é protegida.\n"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+#, fuzzy
+msgid "Key has been compromised"
+msgstr "Esta chave foi desativada"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr ""
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr ""
+
+#: g10/pkclist.c:74
+#, fuzzy
+msgid "reason for revocation: "
+msgstr "rev- revogações de chaves incorreta\n"
+
+#: g10/pkclist.c:91
+#, fuzzy
+msgid "revocation comment: "
+msgstr "[revogação]"
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr ""
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Nenhum valor de confiança designado para %lu:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                   ou \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Esta chave provavelmente pertence ao dono\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr ""
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "%08lX: Nós NÃO confiamos nesta chave\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = voltar ao menu principal\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr "chave %08lX: subchave ignorada\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " q = sair\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Sua decisão? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Você realmente quer remover esta chave? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificados que levam a uma chave confiada plenamente:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "       Não há indicação de que a assinatura pertence ao dono.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "       Não há indicação de que a assinatura pertence ao dono.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Esta chave provavelmente pertence ao dono\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Esta chave pertence a nós\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Não se tem certeza de que esta chave pertence a seu dono.\n"
+"Se você *realmente* sabe o que está fazendo, pode responder\n"
+"sim à próxima pergunta\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Usa esta chave de qualquer modo? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "AVISO: Usando chave não confiável!\n"
+
+#: g10/pkclist.c:509
+#, fuzzy
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:518
+#, fuzzy
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "AVISO: Esta chave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "       Isto pode significar que a assinatura é falsificada.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "AVISO: Esta subchave foi revogada pelo seu dono!\n"
+
+#: g10/pkclist.c:533
+#, fuzzy
+msgid "Note: This key has been disabled.\n"
+msgstr "Esta chave foi desativada"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Nota: Esta chave expirou!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "AVISO: Esta chave não está certificada com uma assinatura confiável!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "       Não há indicação de que a assinatura pertence ao dono.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "AVISO: Nós NÃO confiamos nesta chave!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "       A assinatura é provavelmente uma FALSIFICAÇÃO.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"AVISO: Esta chave não está certificada com assinaturas suficientemente\n"
+"       confiáveis!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "       Não se tem certeza de que a assinatura pertence ao dono.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: ignorado: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: ignorado: a chave pública já está presente\n"
+
+#: g10/pkclist.c:885
+#, fuzzy
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr ""
+"Você não especificou um identificador de usuário. (pode-se usar \"-r\")\n"
+"\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Identificador de usuário inexistente.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "ignorado: chave pública já marcada como destinatário padrão\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "A chave pública está desativada.\n"
+
+#: g10/pkclist.c:999
+#, fuzzy
+msgid "skipped: public key already set\n"
+msgstr "%s: ignorado: a chave pública já está presente\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "destinatário padrão desconhecido `%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: ignorado: a chave pública está desativada\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "nenhum endereço válido\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "dados não salvos; use a opção \"--output\" para salvá-los\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, fuzzy, c-format
+msgid "error creating `%s': %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Assinatura separada.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Por favor digite o nome do arquivo de dados: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "lendo de \"stdin\" ...\n"
+
+#: g10/plaintext.c:524
+#, fuzzy
+msgid "no signed data\n"
+msgstr "no dados assinados\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "impossível abrir dados assinados `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinatário anônimo; tentando chave secreta %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "certo, nós somos o destinatário anônimo.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "codificação antiga do DEK não suportada\n"
+
+#: g10/pubkey-enc.c:244
+#, fuzzy, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "algoritmo de proteção %d não é suportado\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "NOTA: algoritmo de criptografia %d não encontrado nas preferências\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTA: chave secreta %08lX expirou %s\n"
+
+#: g10/pubkey-enc.c:308
+#, fuzzy
+msgid "NOTE: key has been revoked"
+msgstr "chave %08lX: a chave foi revogada!\n"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, fuzzy, c-format
+msgid "build_packet failed: %s\n"
+msgstr "atualização falhou: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "chave %08lX: sem ID de usuário\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr ""
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr ""
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr ""
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, fuzzy, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "enumeração de blocos de chaves falhou: %s\n"
+
+#: g10/revoke.c:407
+#, fuzzy
+msgid "Revocation certificate created.\n"
+msgstr "chave %08lX: certificado de revogação adicionado\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr ""
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "usuário `%s' não encontrado: %s\n"
+
+#: g10/revoke.c:500
+#, fuzzy, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "escrevendo certificado público para `%s'\n"
+
+#: g10/revoke.c:511
+#, fuzzy
+msgid "public key does not match secret key!\n"
+msgstr "lid %lu não tem chave\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Gerar um certificado de revogação para esta assinatura? (s/N)"
+
+#: g10/revoke.c:535
+#, fuzzy
+msgid "unknown protection algorithm\n"
+msgstr "algoritmo de compressão desconhecido"
+
+#: g10/revoke.c:543
+#, fuzzy
+msgid "NOTE: This key is not protected!\n"
+msgstr "Esta chave não é protegida.\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+
+#: g10/revoke.c:635
+#, fuzzy
+msgid "Please select the reason for the revocation:\n"
+msgstr "rev- revogações de chaves incorreta\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr ""
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr ""
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+
+#: g10/revoke.c:716
+#, fuzzy, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "rev- revogações de chaves incorreta\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr ""
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Usa esta chave de qualquer modo? "
+
+#: g10/seckey-cert.c:55
+#, fuzzy
+msgid "secret key parts are not available\n"
+msgstr "chave secreta não disponível"
+
+#: g10/seckey-cert.c:61
+#, fuzzy, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "algoritmo de proteção %d não é suportado\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "algoritmo de proteção %d não é suportado\n"
+
+#: g10/seckey-cert.c:266
+#, fuzzy
+msgid "Invalid passphrase; please try again"
+msgstr "Frase secreta inválida; por favor tente novamente ...\n"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr ""
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"AVISO: Chave fraca detectada - por favor mude a frase secreta novamente.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "chave fraca criada - tentando novamente\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"impossível evitar chave fraca para criptografia simétrica;\n"
+"%d tentativas!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr ""
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+
+#: g10/sig-check.c:181
+#, fuzzy, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "a chave pública é %lu segundo mais nova que a assinatura\n"
+
+#: g10/sig-check.c:182
+#, fuzzy, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "a chave pública é %lu segundos mais nova que a assinatura\n"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"a chave foi criada %lu segundo no futuro\n"
+"(viagem no tempo ou problema no relógio)\n"
+
+#: g10/sig-check.c:195
+#, 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"
+"(viagem no tempo ou problema no relógio)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTA: chave de assinatura %08lX expirou %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "assumindo assinatura incorreta devido a um bit crítico desconhecido\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "chave %08lX: sem subchave para ligação de chaves\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+
+#: g10/sign.c:347
+#, fuzzy, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "leitura de registro de assinatura falhou: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "assinatura %s de: %s\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "NOTA: algoritmo de criptografia %d não encontrado nas preferências\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "assinando:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+
+#: g10/sign.c:1278
+#, fuzzy, c-format
+msgid "%s encryption will be used\n"
+msgstr "descriptografia falhou: %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"a chave não está marcada como insegura - impossível usá-la com o pseudo "
+"RNG!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "ignorado `%s': duplicado\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "ignorado `%s': %s\n"
+
+#: g10/skclist.c:172
+#, fuzzy
+msgid "skipped: secret key already present\n"
+msgstr "ignorado: a chave secreta já está presente\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"ignorado `%s': esta é uma chave ElGamal gerada pelo PGP que não é segura "
+"para assinaturas!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "registro de confiança %lu, tipo %d: escrita falhou: %s\n"
+
+#: g10/tdbdump.c:105
+#, fuzzy, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Lista de valores de confiança designados, criada em %s\n"
+"# (Use \"gpgm --import-ownertrust\" para restaurá-los)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "erro na leitura de `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "linha muito longa\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "erro: impressão digital inválida\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importar os valores de confiança"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "erro lendo registro de diretório: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "erro de leitura: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "banco de dados de confiabilidade: sincronização falhou: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "banco de dados de confiabilidade rec %lu: lseek falhou: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "banco de dados de confiabilidade rec %lu: escrita falhou (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transação de banco de dados de confiabilidade muito grande\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "impossível abrir `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: diretório inexistente!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "impossível criar %s: %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "impossível abrir `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: falha ao criar registro de versão: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: banco de dados de confiabilidade inválido criado\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: banco de dados de confiabilidade criado\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr ""
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: banco de dados de confiabilidade inválido\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: falha ao criar tabela de \"hash\": %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: erro atualizando registro de versão: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: erro lendo registro de versão: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: erro escrevendo registro de versão: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "banco de dados de confiabilidade: lseek falhou: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "banco de dados de confiabilidade: leitura falhou (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: registro de versão com recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versão de arquivo inválida %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: erro lendo registro livre: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: erro escrevendo registro de diretório: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: falha ao zerar um registro: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: falha ao anexar um registro: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"O banco de dados de confiabilidade está danificado; por favor rode\n"
+"\"gpg --fix-trust-db\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "impossível manipular linhas de texto maiores que %d caracteres\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "linha de entrada maior que %d caracteres\n"
+
+#: g10/trustdb.c:227
+#, fuzzy, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "%s não é um mapa de caracteres válido\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "chave %08lX: aceita como chave confiável.\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr ""
+"chave %08lX: impossível colocá-la no banco de dados de confiabilidade\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "chave %08lX: chave secreta sem chave pública - ignorada\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "Certificados que levam a uma chave confiada plenamente:\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "registro de confiança %lu, tipo req %d: falha na leitura: %s\n"
+
+#: g10/trustdb.c:351
+#, fuzzy, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "registro de confiança %lu: remoção falhou: %s\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "revkey"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "expire"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "versão desconhecida"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr ""
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+#, fuzzy
+msgid "no need for a trustdb check\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, fuzzy, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "inserção de registro de confiança falhou: %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "chave pública não encontrada"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr ""
+
+#: g10/trustdb.c:1038
+#, fuzzy
+msgid "checking the trustdb\n"
+msgstr "muda os valores de confiança"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr ""
+
+#: g10/trustdb.c:2160
+#, fuzzy
+msgid "no ultimately trusted keys found\n"
+msgstr "Certificados que levam a uma chave confiada plenamente:\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "Certificados que levam a uma chave confiada plenamente:\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "registro de confiança %lu, tipo %d: escrita falhou: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"a assinatura não pôde ser verificada.\n"
+"Por favor lembre-se de que o arquivo com a assinatura (.sig ou .asc)\n"
+"deve ser o primeiro arquivo dado na linha de comando.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "linha %u muito longa ou sem LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "erro geral"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "formato de pacote desconhecido"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "versão desconhecida"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algoritmo de chave pública desconhecido"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algoritmo de \"digest\" desconhecido"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "chave pública incorreta"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "chave secreta incorreta"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "assinatura incorreta"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "erro de \"checksum\""
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "frase secreta incorreta"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "chave pública não encontrada"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algoritmo de criptografia desconhecido"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "não é possível abrir o chaveiro"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "pacote inválido"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armadura inválida"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "identificador de usuário inexistente"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "chave secreta não disponível"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "chave secreta incorreta"
+
+# suportado ???
+#: util/errors.c:73
+msgid "not supported"
+msgstr "não suportado"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "chave incorreta"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "erro de leitura"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "erro de escrita"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritmo de compressão desconhecido"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "erro na abertura de arquivo"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "erro na criação de arquivo"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "frase secreta inválida"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmo de chave pública não implementado"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritmo de criptografia não implementado"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "classe de assinatura desconhecida"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "erro no banco de dados de confiabilidade"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI incorreto"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "limite de recurso"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "chaveiro inválido"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "certificado incorreto"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "identificador de usuário malformado"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "erro no fechamento de arquivo"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "erro na renomeação de arquivo"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "erro na remoção de arquivo"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "dados inesperados"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflito de \"timestamp\""
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritmo de chave pública inutilizável"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "o arquivo já existe"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "chave fraca"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argumento inválido"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI incorreto"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI não suportado"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "erro na rede"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "não criptografado"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "não processado(s)"
+
+#: util/errors.c:106
+#, fuzzy
+msgid "unusable public key"
+msgstr "chave pública incorreta"
+
+#: util/errors.c:107
+#, fuzzy
+msgid "unusable secret key"
+msgstr "chave secreta incorreta"
+
+#: util/errors.c:108
+#, fuzzy
+msgid "keyserver error"
+msgstr "erro geral"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr ""
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "não criptografado"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "no dados assinados\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... isto é um bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "você encontrou um bug ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+#, fuzzy
+msgid "yes"
+msgstr "sim"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "sS"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "não"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+# INICIO MENU
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "sair"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+#, fuzzy
+msgid "WARNING: using insecure memory!\n"
+msgstr "Aviso: usando memória insegura!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "a operação não é possível sem memória segura inicializada\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(você pode ter usado o programa errado para esta tarefa)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "um nome de notação deve ter apenas letras, dígitos, pontos ou sublinhados "
+#~ "e terminar com '='\n"
+
+#, fuzzy
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "um valor de notação não deve usar caracteres de controle\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "um valor de notação não deve usar caracteres de controle\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "um valor de notação não deve usar caracteres de controle\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "AVISO: dados de notação inválidos encontrados\n"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "ler opções do arquivo"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "ler opções do arquivo"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr "A chave expira em %s\n"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "chave %08lX: assinatura não exportável (classe %02x) - ignorada\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "impossível abrir %s: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Nenhum identificador de usuário para chave\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "erro na criação da frase secreta: %s\n"
+
+#, fuzzy
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "algoritmo de criptografia desconhecido"
+
+#, fuzzy
+#~ msgid "passphrase too long\n"
+#~ msgstr "linha muito longa\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "seleciona chave secundária N"
+
+#~ msgid "list signatures"
+#~ msgstr "lista assinaturas"
+
+#~ msgid "sign the key"
+#~ msgstr "assina a chave"
+
+#~ msgid "add a secondary key"
+#~ msgstr "adiciona nova chave secundária"
+
+#~ msgid "delete signatures"
+#~ msgstr "remove assinaturas"
+
+#~ msgid "change the expire date"
+#~ msgstr "muda a data de validade"
+
+#, fuzzy
+#~ msgid "set preference list"
+#~ msgstr "lista preferências"
+
+#, fuzzy
+#~ msgid "updated preferences"
+#~ msgstr "lista preferências"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Nenhuma chave secundária com índice %d\n"
+
+#, fuzzy
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--sign-key id-usuário"
+
+#, fuzzy
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--sign-key id-usuário"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "fazer uma assinatura separada"
+
+#, fuzzy
+#~ msgid "sign the key non-revocably"
+#~ msgstr "assina a chave localmente"
+
+#, fuzzy
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "assina a chave localmente"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "erro geral"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "nrsign"
+#~ msgstr "sign"
+
+#, fuzzy
+#~ msgid "nrlsign"
+#~ msgstr "sign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#, fuzzy
+#~ msgid "addrevoker"
+#~ msgstr "revkey"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#, fuzzy
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#, fuzzy
+#~ msgid "setpref"
+#~ msgstr "pref"
+
+#, fuzzy
+#~ msgid "updpref"
+#~ msgstr "pref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "erro geral"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "revuid"
+#~ msgstr "revsig"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Prestes a gerar novo par de chaves %s.\n"
+#~ "              tamanho mínimo é  768 bits\n"
+#~ "              tamanho padrão é 1024 bits\n"
+#~ "     tamanho máximo sugerido é 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA permite apenas tamanhos de 512 a 1024\n"
+
+#, fuzzy
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr "tamanho muito pequeno; 768 é o valor mínimo permitido.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "tamanho muito pequeno; 768 é o valor mínimo permitido.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "tamanho muito grande; %d é o valor máximo permitido.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Tamanhos de chave maiores que 2048 não são recomendados\n"
+#~ "porque o tempo de computação é REALMENTE longo!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Tudo bem, mas tenha em mente que a radiação de seu monitor e teclado "
+#~ "também é vulnerável a ataques!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Algoritmos experimentais não devem ser usados!\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "este algoritmo de criptografia é depreciado; por favor use algum\n"
+#~ "algoritmo padrão!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "escrevendo para `%s'\n"
+
+#, fuzzy
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "impossível fazer isso em modo não-interativo\n"
+
+#, fuzzy
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "usuário `%s' não encontrado: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "impossível criar %s: %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "impossível abrir arquivo: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                   ou \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "chave %08lX: a chave foi revogada!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "chave %08lX: a subchave foi revogada!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: a chave expirou\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Nós NÃO confiamos nesta chave\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (assinatura e criptografia)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) DSA (apenas assinatura)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) ElGamal (assinatura e criptografia)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) ElGamal (apenas criptografia)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) ElGamal (assinatura e criptografia)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: impossível abrir: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: AVISO: arquivo vazio\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "impossível abrir %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr "%s: não é um banco de dados de confiabilidade\n"
+
+#~ msgid "Really sign? "
+#~ msgstr "Realmente assinar? "
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "assinado com sua chave %08lX em %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   assinado por %08lX em %s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: impossível acessar: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: impossível criar trava\n"
+
+#, fuzzy
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: impossível criar trava\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: impossível criar: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: impossível criar diretório: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Se você quiser usar esta chave revogada assim mesmo, responda \"sim\"."
+
+#, fuzzy
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "impossível abrir %s: %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "impossível abrir arquivo: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "erro: falta dois pontos\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "erro: nenhum valor de confiança\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (ID principal da chave %08lX)"
+
+#, fuzzy
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! a subchave foi revogada: %s\n"
+
+#, fuzzy
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- revogações de chaves incorreta\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr "A chave expira em %s\n"
+
+#, fuzzy
+#~ msgid " [expires: %s]"
+#~ msgstr "A chave expira em %s\n"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "revkey"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "impossível criar %s: %s\n"
+
+#~ msgid "store only"
+#~ msgstr "apenas armazenar"
+
+#, fuzzy
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "assinar uma chave localmente"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "listar apenas as seqüências de pacotes"
+
+# ownertrust ???
+#~ msgid "export the ownertrust values"
+#~ msgstr "exportar os valores de confiança"
+
+#, fuzzy
+#~ msgid "unattended trust database update"
+#~ msgstr "atualizar o banco de dados de confiabilidade"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr ""
+#~ "consertar um banco de dados de confiabilidade\n"
+#~ "danificado"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "retirar a armadura de um arquivo ou de \"stdin\""
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "criar armadura para um arquivo ou \"stdin\""
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NOME|usar NOME como destinatário padrão"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "usar a chave padrão como destinatário padrão"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "nunca usar o terminal"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "forçar assinaturas v3"
+
+#, fuzzy
+#~ msgid "do not force v3 signatures"
+#~ msgstr "forçar assinaturas v3"
+
+#, fuzzy
+#~ msgid "force v4 key signatures"
+#~ msgstr "forçar assinaturas v3"
+
+#, fuzzy
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "forçar assinaturas v3"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "sempre usar um MDC para criptografar"
+
+#, fuzzy
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "sempre usar um MDC para criptografar"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "modo não-interativo: nunca perguntar"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "assumir sim para a maioria das perguntas"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "assumir não para a maioria das perguntas"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "adicionar este chaveiro à lista de chaveiros"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "adicionar este chaveiro secreto à lista"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NOME|usar NOME como chave secreta padrão"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|ENDEREÇO|usar este servidor para buscar chaves"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr ""
+#~ "|NOME|definir mapa de caracteres do terminal como\n"
+#~ "NOME"
+
+#, fuzzy
+#~ msgid "|[file]|write status info to file"
+#~ msgstr ""
+#~ "|DA|escrever informações de estado para o\n"
+#~ "descritor de arquivo DA"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|ARQUIVO|carregar módulo de extensão ARQUIVO"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emular o modo descrito no RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "configurar todas as opções de pacote,\n"
+#~ "criptografia e \"digest\" para comportamento\n"
+#~ "OpenPGP"
+
+#, fuzzy
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "configurar todas as opções de pacote,\n"
+#~ "criptografia e \"digest\" para comportamento\n"
+#~ "OpenPGP"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|usar frase secreta modo N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|NOME|usar algoritmo de \"digest\" de mensagens NOME\n"
+#~ "para frases secretas"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|NOME|usar algoritmo de criptografia NOME para\n"
+#~ "frases secretas"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NOME|usar algoritmo de criptografia NOME"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NOME|usar algoritmo de \"digest\" de mensagens NOME"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|usar algoritmo de compressão N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr ""
+#~ "eliminar o campo keyid dos pacotes\n"
+#~ "criptografados"
+
+#, fuzzy
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "o algoritmo de compressão deve estar na faixa %d..%d\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "o algoritmo de compressão deve estar na faixa %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Não se tem certeza de que esta chave realmente pertence ao dono,\n"
+#~ "mas é aceita de qualquer modo\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "chave %08lX: não é uma chave rfc2440 - ignorada\n"
+
+#, fuzzy
+#~ msgid " (default)"
+#~ msgstr "(o padrão é 1)"
+
+#~ msgid "Policy: "
+#~ msgstr "Política: "
+
+#, fuzzy
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "impossível escrever para o chaveiro: %s\n"
+
+#, fuzzy
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "erro na leitura de `%s': %s\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "esta é uma chave ElGamal gerada pelo PGP que NÃO é segura para "
+#~ "assinaturas!\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "a chave foi criada %lu segundo no futuro\n"
+#~ "(viagem no tempo ou problema no relógio)\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in 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 "key %08lX marked as ultimately trusted\n"
+#~ msgstr "Certificados que levam a uma chave confiada plenamente:\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Selecione o algoritmo a ser usado.\n"
+#~ "\n"
+#~ "DSA (ou DSS) é o algoritmo de assinatura digital que pode ser usado "
+#~ "apenas\n"
+#~ "para assinaturas. Este é o algoritmo recomendado porque a verificação de\n"
+#~ "assinaturas DSA é muito mais rápida que a verificação de ElGamal.\n"
+#~ "\n"
+#~ "ElGamal é um algoritmo que pode ser usado para assinatura e "
+#~ "criptografia.\n"
+#~ "O OpenPGP distingue dois tipos deste algoritmo: um apenas para "
+#~ "criptografia\n"
+#~ "e outro para assinatura+criptografia; na verdade são iguais, mas alguns\n"
+#~ "parâmetros precisam ser escolhidos de modo especial para criar uma chave\n"
+#~ "segura para asssinatura: este programa faz isso, mas algumas outras\n"
+#~ "implementações do OpenPGP não vão necessariamente entender o tipo\n"
+#~ "assinatura+criptografia.\n"
+#~ "\n"
+#~ "A  chave primária precisa sempre ser uma chave capaz de fazer "
+#~ "assinaturas;\n"
+#~ "este é o motivo pelo qual a chave ElGamal apenas para criptografia não "
+#~ "está\n"
+#~ "disponível neste menu."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Apesar de estas chaves estarem definidas no RFC2440, elas não são "
+#~ "recomendadas\n"
+#~ "porque não são suportadas por todos os programas e assinaturas criadas "
+#~ "com\n"
+#~ "elas são grandes e sua verificação é lenta."
+
+#, fuzzy
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu chaves processadas até agora\n"
+
+#, fuzzy
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "chave %08lX: sem ID de usuário\n"
+
+# INICIO MENU
+#, fuzzy
+#~ msgid "quit|quit"
+#~ msgstr "sair"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (assinatura e criptografia)\n"
+
+#, fuzzy
+#~ msgid "Create anyway? "
+#~ msgstr "Usa esta chave de qualquer modo? "
+
+# "hash" poderia ser "espalhamento", mas não fica claro
+#, fuzzy
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "algoritmo de hash inválido `%s'\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "you have to start GnuPG again, so it can read the new configuration file\n"
+#~ msgstr ""
+#~ "você deve reiniciar o GnuPG, para que ele possa ler o novo arquivo\n"
+#~ "de opções\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "       Impressão digital:"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|NOME=VALOR|usar estes dados de notação"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr ""
+#~ "o primeiro caractere de um nome de notação deve ser uma letra ou um "
+#~ "sublinhado\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr ""
+#~ "pontos em um nome de notação devem estar cercados por outros caracteres\n"
+
+#, fuzzy
+#~ msgid "Are you sure you still want to sign it?\n"
+#~ msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#, fuzzy
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "Você tem certeza de que quer este tamanho de chave? "
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "chave %08lX: nossa cópia não tem auto-assinatura\n"
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "Você realmente precisa de uma chave tão grande? "
+
+#~ msgid "   signed by %08lX at %s\n"
+#~ msgstr "   assinado por %08lX em %s\n"
+
+#~ msgid "--delete-secret-key user-id"
+#~ msgstr "--delete-secret-key id-usuário"
+
+#~ msgid "--delete-key user-id"
+#~ msgstr "--delete-key id-usuário"
+
+#, fuzzy
+#~ msgid "--delete-secret-and-public-key user-id"
+#~ msgstr "--delete-secret-and-public-key id-usuário"
+
+#~ msgid "skipped: public key already set with --encrypt-to\n"
+#~ msgstr "ignorado: chave pública já marcada com --encrypt-to\n"
+
+#, fuzzy
+#~ msgid ""
+#~ "\n"
+#~ "WARNING: This is a PGP2-style key\n"
+#~ msgstr "AVISO: `%s' é um arquivo vazio\n"
+
+#~ msgid "sSmMqQ"
+#~ msgstr "sSmMqQ"
+
+#, fuzzy
+#~ msgid "duplicate (short) key ID %08lX\n"
+#~ msgstr "a chave pública é %08lX\n"
+
+#, fuzzy
+#~ msgid "%lu key(s) to refresh\n"
+#~ msgstr "\t%lu chaves com erros\n"
+
+#~ msgid "|[NAMES]|check the trust database"
+#~ msgstr "|[NOMES]|verificar o banco de dados de confiabilidade"
+
+#~ msgid ""
+#~ "Could not find a valid trust path to the key.  Let's see whether we\n"
+#~ "can assign some missing owner trust values.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Não foi possível encontrar uma rota de confiança válida para a chave.\n"
+#~ "Vamos ver se é possível designar alguns valores de confiança ausentes.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No path leading to one of our keys found.\n"
+#~ "\n"
+#~ msgstr "Nenhuma rota encontrada que leve a uma de nossas chaves.\n"
+
+#~ msgid ""
+#~ "No certificates with undefined trust found.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nenhum certificado com confiança indefinida encontrado.\n"
+#~ "\n"
+
+#~ msgid ""
+#~ "No trust values changed.\n"
+#~ "\n"
+#~ msgstr ""
+#~ "Nenhum valor de confiança modificado.\n"
+#~ "\n"
+
+#~ msgid "%08lX: no info to calculate a trust probability\n"
+#~ msgstr "%08lX: sem informação para calcular probabilidade de confiança\n"
+
+#~ msgid "%s: error checking key: %s\n"
+#~ msgstr "%s: erro na verificação da chave: %s\n"
+
+#~ msgid "too many entries in unk cache - disabled\n"
+#~ msgstr "entradas demais no cache unk - desativado\n"
+
+#~ msgid "assuming bad MDC due to an unknown critical bit\n"
+#~ msgstr "assumindo MDC incorreto devido a um bit crítico desconhecido\n"
+
+#~ msgid "error reading dir record for LID %lu: %s\n"
+#~ msgstr "erro lendo registro de diretório para LID %lu: %s\n"
+
+#~ msgid "lid %lu: expected dir record, got type %d\n"
+#~ msgstr "lid %lu: registro de diretório esperado, tipo %d recebido\n"
+
+#~ msgid "no primary key for LID %lu\n"
+#~ msgstr "nenhuma chave primária para LID %lu\n"
+
+#~ msgid "error reading primary key for LID %lu: %s\n"
+#~ msgstr "erro lendo chave primária para LID %lu: %s\n"
+
+#~ msgid "key %08lX: query record failed\n"
+#~ msgstr "chave %08lX: pedido de registro falhou\n"
+
+#~ msgid "key %08lX: already in trusted key table\n"
+#~ msgstr "chave %08lX: já está na tabela de chaves confiáveis\n"
+
+#~ msgid "NOTE: secret key %08lX is NOT protected.\n"
+#~ msgstr "NOTA: a chave secreta %08lX NÃO está protegida.\n"
+
+#~ msgid "key %08lX: secret and public key don't match\n"
+#~ msgstr "chave %08lX: chaves secreta e pública não são correspondentes\n"
+
+#~ msgid "key %08lX.%lu: Good subkey binding\n"
+#~ msgstr "chave %08lX.%lu: Ligação de subchave válida\n"
+
+#~ msgid "key %08lX.%lu: Invalid subkey binding: %s\n"
+#~ msgstr "chave %08lX.%lu: Ligação de subchave inválida: %s\n"
+
+#~ msgid "key %08lX.%lu: Valid key revocation\n"
+#~ msgstr "chave %08lX.%lu: Revogação de chave válida\n"
+
+#~ msgid "key %08lX.%lu: Invalid key revocation: %s\n"
+#~ msgstr "chave %08lX.%lu: Revogação de chave inválida: %s\n"
+
+#~ msgid "Good self-signature"
+#~ msgstr "Auto-assinatura válida"
+
+#~ msgid "Invalid self-signature"
+#~ msgstr "Auto-assinatura inválida"
+
+#~ msgid "Valid user ID revocation skipped due to a newer self signature"
+#~ msgstr ""
+#~ "Revogação válida de ID de usuário ignorada devido a nova auto-assinatura"
+
+#~ msgid "Valid user ID revocation"
+#~ msgstr "Revogação de ID de usuário válida"
+
+#~ msgid "Invalid user ID revocation"
+#~ msgstr "Revogação de ID de usuário inválida"
+
+#~ msgid "Valid certificate revocation"
+#~ msgstr "Certificado de revogação válido"
+
+#~ msgid "Good certificate"
+#~ msgstr "Certificado correto"
+
+#~ msgid "Invalid certificate revocation"
+#~ msgstr "Certificado de revogação inválido"
+
+#~ msgid "Invalid certificate"
+#~ msgstr "Certificado inválido"
+
+#~ msgid "sig record %lu[%d] points to wrong record.\n"
+#~ msgstr "registro de assinatura %lu[%d] aponta para registro errado.\n"
+
+#~ msgid "duplicated certificate - deleted"
+#~ msgstr "certificado duplicado - removido"
+
+#~ msgid "tdbio_search_dir failed: %s\n"
+#~ msgstr "tdbio_search_dir falhou: %s\n"
+
+#~ msgid "lid ?: insert failed: %s\n"
+#~ msgstr "lid ?: inserção falhou: %s\n"
+
+#~ msgid "lid %lu: insert failed: %s\n"
+#~ msgstr "lid %lu: inserção falhou: %s\n"
+
+#~ msgid "lid %lu: inserted\n"
+#~ msgstr "lid %lu: inserido\n"
+
+#~ msgid "\t%lu keys inserted\n"
+#~ msgstr "\t%lu chaves inseridas\n"
+
+#~ msgid "lid %lu: dir record w/o key - skipped\n"
+#~ msgstr "lid %lu: registro de diretório sem chave - ignorado\n"
+
+#~ msgid "\t%lu due to new pubkeys\n"
+#~ msgstr "\t%lu devido a novas chaves públicas\n"
+
+#~ msgid "\t%lu keys skipped\n"
+#~ msgstr "\t%lu chaves ignoradas\n"
+
+#~ msgid "\t%lu keys updated\n"
+#~ msgstr "\t%lu chaves atualizadas\n"
+
+#~ msgid "Ooops, no keys\n"
+#~ msgstr "Ooops, nenhuma chave\n"
+
+#~ msgid "Ooops, no user IDs\n"
+#~ msgstr "Ooops, nenhum ID de usuário\n"
+
+#~ msgid "check_trust: search dir record failed: %s\n"
+#~ msgstr "check_trust: busca de registro de diretório falhou: %s\n"
+
+#~ msgid "key %08lX: insert trust record failed: %s\n"
+#~ msgstr "chave %08lX: inserção de registro de confiança falhou: %s\n"
+
+#~ msgid "key %08lX.%lu: inserted into trustdb\n"
+#~ msgstr "chave %08lX.%lu: inserida no banco de dados de confiabilidade\n"
+
+#~ msgid "key %08lX.%lu: created in future (time warp or clock problem)\n"
+#~ msgstr ""
+#~ "chave %08lX.%lu: criada no futuro (viagem no tempo ou problema no "
+#~ "relogio)\n"
+
+#~ msgid "key %08lX.%lu: expired at %s\n"
+#~ msgstr "chave %08lX.%lu: expirou em %s\n"
+
+#~ msgid "key %08lX.%lu: trust check failed: %s\n"
+#~ msgstr "chave %08lX.%lu: verificação de confiança falhou: %s\n"
+
+#~ msgid "user '%s' not found: %s\n"
+#~ msgstr "usuário `%s' não encontrado: %s\n"
+
+#~ msgid "problem finding '%s' in trustdb: %s\n"
+#~ msgstr ""
+#~ "problemas na procura de `%s' no banco de dados de confiabilidade: %s\n"
+
+#~ msgid "user '%s' not in trustdb - inserting\n"
+#~ msgstr ""
+#~ "usuário `%s' não encontrado no banco de dados de confiabilidade - "
+#~ "inserindo\n"
+
+#~ msgid "failed to put '%s' into trustdb: %s\n"
+#~ msgstr "falha ao colocar `%s' no banco de dados de confiabilidade: %s\n"
+
+#~ msgid "Do you really want to create a sign and encrypt key? "
+#~ msgstr ""
+#~ "Você realmente quer criar uma chave para assinatura e criptografia? "
+
+#~ msgid "%s: user not found: %s\n"
+#~ msgstr "%s: usuário não encontrado: %s\n"
+
+#~ msgid "certificate read problem: %s\n"
+#~ msgstr "erro de leitura do certificado: %s\n"
+
+#~ msgid "no default public keyring\n"
+#~ msgstr "sem chaveiro público padrão\n"
+
+#~ msgid "can't lock keyring `%s': %s\n"
+#~ msgstr "impossível bloquear chaveiro `%s': %s\n"
+
+#~ msgid "%s: user not found\n"
+#~ msgstr "%s: usuário não encontrado\n"
+
+#~ msgid "WARNING: can't yet handle long pref records\n"
+#~ msgstr ""
+#~ "AVISO: ainda é impossível manipular registros de preferências longos\n"
+
+#~ msgid "%s: can't create keyring: %s\n"
+#~ msgstr "%s: impossível criar chaveiro: %s\n"
+
+#~ msgid "No key for user ID\n"
+#~ msgstr "Nenhuma chave para identificador de usuário\n"
+
+#~ msgid "no secret key for decryption available\n"
+#~ msgstr "nenhuma chave secreta para descriptografia disponível\n"
+
+#~ msgid ""
+#~ "RSA keys are deprecated; please consider creating a new key and use this "
+#~ "key in the future\n"
+#~ msgstr ""
+#~ "Chaves RSA não são recomendáveis; por favor considere criar uma nova "
+#~ "chave e usá-la no futuro\n"
+
+#~ msgid "set debugging flags"
+#~ msgstr "definir parâmetros de depuração"
+
+#~ msgid "enable full debugging"
+#~ msgstr "habilitar depuração completa"
+
+#~ msgid "do not write comment packets"
+#~ msgstr "não escrever pacotes de comentário"
+
+#~ msgid "(default is 3)"
+#~ msgstr "(o padrão é 3)"
+
+#~ msgid "   (%d) ElGamal in a v3 packet\n"
+#~ msgstr "   (%d) ElGamal em um pacote v3\n"
+
+#~ msgid "Key generation can only be used in interactive mode\n"
+#~ msgstr "A geração de chaves só pode ser feita em modo interativo\n"
+
+#, fuzzy
+#~ msgid "tdbio_search_sdir failed: %s\n"
+#~ msgstr "tdbio_search_dir falhou: %s\n"
+
+#~ msgid "print all message digests"
+#~ msgstr "imprime todos os \"digests\" de mensagens"
+
+#~ msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but marked as checked\n"
+#~ msgstr ""
+#~ "NOTA: assinatura rec %lu[%d] está na lista de sugestões de %lu mas está\n"
+#~ "      marcada como verificada\n"
+
+#~ msgid "NOTE: sig rec %lu[%d] in hintlist of %lu but not marked\n"
+#~ msgstr ""
+#~ "NOTA: assinatura rec %lu[%d] está na lista de sugestões de %lu mas não "
+#~ "está\n"
+#~ "      marcada\n"
+
+#~ msgid "sig rec %lu[%d] in hintlist of %lu does not point to a dir record\n"
+#~ msgstr ""
+#~ "assinatura rec %lu[%d] na lista de sugestões de %lu não aponta para\n"
+#~ "um registro de diretório\n"
+
+#~ msgid "lid %lu: no primary key\n"
+#~ msgstr "lid %lu: nenhuma chave primária\n"
+
+#~ msgid "lid %lu: user id not found in keyblock\n"
+#~ msgstr "lid %lu: id de usuário não encontrado no bloco de chaves\n"
+
+#~ msgid "lid %lu: self-signature in hintlist\n"
+#~ msgstr "lid %lu: auto-assinatura na lista de sugestões\n"
+
+#~ msgid "very strange: no public key\n"
+#~ msgstr "muito estranho: nenhuma chave pública\n"
+
+#~ msgid "hintlist %lu[%d] of %lu does not point to a dir record\n"
+#~ msgstr ""
+#~ "lista de sugestões %lu[%d] de %lu não aponta para registro de diretório\n"
+
+#~ msgid "lid %lu: can't get keyblock: %s\n"
+#~ msgstr "lid %lu: impossível pegar bloco de chaves: %s\n"
+
+#~ msgid "Too many preference items"
+#~ msgstr "Muitos itens de preferência"
+
+#~ msgid "public key not anymore available"
+#~ msgstr "a chave pública não está mais disponível"
+
+# trauzir sombra ???
+#~ msgid "uid %08lX.%lu/%02X%02X: has shadow dir %lu but is not yet marked.\n"
+#~ msgstr ""
+#~ "uid %08lX.%lu/%02X%02X: tem diretório \"shadow\" %lu mas ainda não está\n"
+#~ "marcado\n"
+
+#~ msgid "insert_trust_record: keyblock not found: %s\n"
+#~ msgstr "insert_trust_record: bloco de chaves não encontrado: %s\n"
+
+#~ msgid "lid %lu: update failed: %s\n"
+#~ msgstr "lid %lu: atualização falhou %s\n"
+
+#~ msgid "lid %lu: updated\n"
+#~ msgstr "lid %lu: atualizado\n"
+
+#~ msgid "lid %lu: okay\n"
+#~ msgstr "lid %lu: correto\n"
+
+#~ msgid "%s: update failed: %s\n"
+#~ msgstr "%s: atualização falhou: %s\n"
+
+#~ msgid "%s: updated\n"
+#~ msgstr "%s: atualizado\n"
+
+#~ msgid "%s: okay\n"
+#~ msgstr "%s: correto\n"
+
+#~ msgid "lid %lu: keyblock not found: %s\n"
+#~ msgstr "lid %lu: bloco de chaves não encontrado: %s\n"
+
+#~ msgid "can't lock keyring `%': %s\n"
+#~ msgstr "impossível bloquear chaveiro `%': %s\n"
+
+#~ msgid "error writing keyring `%': %s\n"
+#~ msgstr "erro na escrita do chaveiro `%': %s\n"
+
+#~ msgid "writing keyblock\n"
+#~ msgstr "escrevendo bloco de chaves\n"
+
+#~ msgid "can't write keyblock: %s\n"
+#~ msgstr "impossível escrever bloco de chaves: %s\n"
+
+#, fuzzy
+#~ msgid "encrypted message is valid\n"
+#~ msgstr "algoritmo de \"digest\" selecionado não é válido\n"
+
+#, fuzzy
+#~ msgid "Can't check MDC: %s\n"
+#~ msgstr "Impossível verificar assinatura: %s\n"
+
+#~ msgid "Usage: gpgm [options] [files] (-h for help)"
+#~ msgstr "Uso: gpgm [opções] [arquivos] (-h para ajuda)"
+
+#~ msgid "usage: gpgm [options] "
+#~ msgstr "Uso: gpgm [opções] "
+
+#, fuzzy
+#~ msgid "chained sigrec %lu has a wrong owner\n"
+#~ msgstr "sigrec em cadeia %lu possui dono errado\n"
+
+#, fuzzy
+#~ msgid "lid %lu: read dir record failed: %s\n"
+#~ msgstr "lid %lu: leitura de registro de diretório falhou: %s\n"
+
+#~ msgid "lid %lu: read key record failed: %s\n"
+#~ msgstr "lid %lu: leitura de registro de chave falhou: %s\n"
+
+#~ msgid "lid %lu: read uid record failed: %s\n"
+#~ msgstr "lid %lu: leitura de registro de uid falhou: %s\n"
+
+#, fuzzy
+#~ msgid "lid %lu: read pref record failed: %s\n"
+#~ msgstr "lid %lu: leitura de registro de preferências falhou: %s\n"
+
+#, fuzzy
+#~ msgid "user '%s' read problem: %s\n"
+#~ msgstr "erro de leitura do usuário `%s': %s\n"
+
+#, fuzzy
+#~ msgid "user '%s' list problem: %s\n"
+#~ msgstr "erro de listagem do usuário `%s': %s\n"
+
+#, fuzzy
+#~ msgid "user '%s' not in trustdb\n"
+#~ msgstr "usuário `%s' não está no banco de dados de confiabilidade\n"
+
+#~ msgid "directory record w/o primary key\n"
+#~ msgstr "registro de diretório sem chave primária\n"
+
+#~ msgid "key not in trustdb, searching ring.\n"
+#~ msgstr ""
+#~ "chave não encontrada no banco de dados de confiabilidade, procurando no "
+#~ "chaveiro\n"
+
+#~ msgid "key not in ring: %s\n"
+#~ msgstr "chave não encontrada no chaveiro: %s\n"
+
+#~ msgid "Oops: key is now in trustdb???\n"
+#~ msgstr "Oops: agora a chave está no banco de dados de confiabilidade???\n"
+
+#~ msgid "Hmmm, public key lost?"
+#~ msgstr "Hmmm, chave pública perdida?"
+
+#~ msgid "did not use primary key for insert_trust_record()\n"
+#~ msgstr "você usou a chave primária para insert_trust_record()\n"
+
+#~ msgid "invalid clear text header: "
+#~ msgstr "cabeçalho de texto puro inválido: "
+
+#~ msgid "LID %lu: changing trust from %u to %u\n"
+#~ msgstr "LID %lu: mudando confiança de %u para %u\n"
+
+#~ msgid "LID %lu: setting trust to %u\n"
+#~ msgstr "LID %lu: estabelecendo confiança para %u\n"
diff --git a/po/quot.sed b/po/quot.sed
new file mode 100644 (file)
index 0000000..0122c46
--- /dev/null
@@ -0,0 +1,6 @@
+s/"\([^"]*\)"/“\1”/g
+s/`\([^`']*\)'/‘\1’/g
+s/ '\([^`']*\)' / ‘\1’ /g
+s/ '\([^`']*\)'$/ ‘\1’/g
+s/^'\([^`']*\)' /‘\1’ /g
+s/“”/""/g
diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin
new file mode 100644 (file)
index 0000000..2436c49
--- /dev/null
@@ -0,0 +1,19 @@
+# Sed script that remove the POT-Creation-Date line in the header entry
+# from a POT file.
+#
+# The distinction between the first and the following occurrences of the
+# pattern is achieved by looking at the hold space.
+/^"POT-Creation-Date: .*"$/{
+x
+# Test if the hold space is empty.
+s/P/P/
+ta
+# Yes it was empty. First occurrence. Remove the line.
+g
+d
+bb
+:a
+# The hold space was nonempty. Following occurrences. Do nothing.
+x
+:b
+}
diff --git a/po/ro.gmo b/po/ro.gmo
new file mode 100644 (file)
index 0000000..3a9f5c7
Binary files /dev/null and b/po/ro.gmo differ
diff --git a/po/ro.po b/po/ro.po
new file mode 100644 (file)
index 0000000..ba2e2cc
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,7001 @@
+# Mesajele în limba românã pentru gnupg.
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+# Acest fiºier este distribuit sub aceeaºi licenþã ca ºi pachetul gnupg.
+# Laurentiu Buzdugan <lbuz@rolix.org>, 2003, 2004, 2005.
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.2rc1\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-05-31 22:00-0500\n"
+"Last-Translator: Laurentiu Buzdugan <lbuz@rolix.org>\n"
+"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "nu pot genera un numãr prim cu  pbiþi=%u qbiþi=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "nu pot genera un numãr prim cu mai puþin de %d biþi\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "nu a fost gãsit nici un modul de adunare a entropiei\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "nu pot încuia (lock) `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "scriu cheia secretã în `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "nu pot deschide `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "nu pot obþine statistici `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' nu este un fiºier normal - ignorat\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "notã: fiºier random_seed este gol\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr ""
+"AVERTISMENT: dimensiune invalidã pentru fiºierul random_seed - nu va fi "
+"folositã\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "nu pot citi `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "notã: fiºierul random_seed nu a fost actualizat\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "nu pot crea `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "nu pot scrie `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "nu pot închide `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr ""
+"AVERISMENT: este folosit un generator de numere aleatoare nesigur "
+"(insecure)!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Generatorul de numere aleatoare este doar ceva temporar pentru\n"
+"a-l face sã meargã - nu este nicidecum un GNA sigur (secure)!\n"
+"\n"
+"NU FOLOSIÞI NICI O DATàGENERATàDE ACEST PROGRAM!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Vã rugãm aºteptaþi, este adunatã entropia. Faceþi ceva dacã vã ajutã sã\n"
+"nu vã plictisiþi, pentru cã va îmbunãtãþi calitatea entropiei.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Nu sunt disponibili destui octeþi aleatori.  Vã rugãm faceþi ceva pentru\n"
+"a da sistemului de operare o ºansã de a colecta mai multã entropie\n"
+"(Mai sunt necesari %d octeþi)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "am eºuat sã stochez amprenta: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "am eºuat sã stochez data creãrii: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "citirea cheii publice a eºuat: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "rãspunsul nu conþine datele cheii publice\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "rãspunsul nu conþine modulul RSA\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "rãspunsul nu conþine exponentul public RSA\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "apelul PIN a returnat eroare: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN-ul pentru CHV%d este prea scurt; lungimea minimã este %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "verificarea CHV%d a eºuat: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "accesul la comenzile de administrare nu este configuratã\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "eroare la recuperarea stãrii CHV de pe card\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "cardul este încuiat permanent!\n"
+
+#: g10/app-openpgp.c:1336
+#, 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"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|PIN Admin"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|PIN Admin Nou"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|PIN Nou"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "eroare la obþinere noului PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "eroare la citirea datelor aplicaþiei\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "eroare la citirea amprentei DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "cheia existã deja\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "cheia existentã va fi înlocuitã\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "generez o nouã cheie\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "timestamp-ul de creare lipseºte\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "modulus-ul RSA lipseºte sau nu are %d biþi\n"
+
+#: g10/app-openpgp.c:1749
+#, fuzzy, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "exponentul public RSA lipseºte sau are mai mult de %d biþi\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "prime-ul RSA %s lipseºte sau nu are %d biþi\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "am eºuat sã stochez cheia: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "vã rugãm aºteptaþi câtã vreme este creatã noua cheie ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "generarea cheii a eºuat\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "generarea cheii este completã (%d secunde)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "structurã invalidã a cardului OpenPGP (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "semnãturã %s, algoritm rezumat %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "semnãturi create pânã acum: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Vã rugãm introduceþi PIN%%0A[semnãturi fãcute: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+"verificarea PIN-ului Admin este deocamdatã interzisã prin aceastã comandã\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "nu pot accesa %s - card OpenPGP invalid?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "armurã: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "header armurã invalid: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "header armurã: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "header clearsig invalid\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "semnãturi text în clar încuibãrite\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "armurã neaºteptatã: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "linie cu liniuþã escape invalidã: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "caracter radix64 invalid %02X sãrit\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "eof prematur (nici un CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "eof prematur (în CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC anormal\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "eroare CRC; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "eof prematur (în trailer)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "eroare linia de trailer\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "nici o datã OpenPGP validã gãsitã.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "armurã invalidã: linie mai lungã de %d caractere\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"caracter printabil în ghilimele în armurã - probabil a fost folosit un MTA "
+"cu bug-uri\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "cardul OpenPGP nu e disponibil: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "cardul OpenPGP nr. %s detectat\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "nu pot face acest lucru în modul batch\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Selecþia d-voastrã? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[nesetat(ã)]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "masculin"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "feminin"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "nespecificat(ã)"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "neforþat(ã)"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "forþat(ã)"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Eroare: Deocamdatã sunt permise numai caractere ASCII.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Eroare: Caracterul \"<\" nu poate fi folosit.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Eroare: Spaþiile duble nu sunt permise.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Numele de familie al proprietarului cardului: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Prenumele proprietarului cardului: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Eroare: Nume combinat prea lung (limita este de %d caractere).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL pentru a aduce cheia publicã: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Eroare: URL prea lung (limita este de %d caractere).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "eroare la citire `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Date login (nume cont): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Eroare: datele de login prea lungi (limita este de %d caractere).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Date DO personale: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Eroare DO personal pre lung (limita este de %d caractere).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Preferinþe limbã: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Eroare: lungime invalidã pentru ºir preferinþe.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Eroare: caractere invalide în ºir preferinþe.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Sex ((M)asculin, (F)eminin sau spaþiu): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Eroare: rãspuns invalid.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "Amprenta CA: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Eroare: amprentã formatatã invalid.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "operaþia pe cheie nu e posibilã: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "nu este un card OpenPGP"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "eroare la obþinerea informaþiei pentru cheia curentã: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Înlocuiesc cheia existentã? (d/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Creez copie de rezervã a cheii de cifrare în afara cardului? (d/N) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Înlocuiesc cheile existente? (d/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Vã rugãm sã observaþi cã setãrile din fabricã ale PIN-urilor sunt\n"
+"   PIN = `%s'     PIN Admin = `%s'\n"
+"Ar trebui sã le schimbaþi folosind comanda --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Vã rugãm selectaþi tipul de cheie de generat:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Cheie de semnare\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Cheie de cifrare\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Cheie de autentificare\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Selecþie invalidã.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Vã rugãm selectaþi unde sã fie stocatã cheia:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "algoritm de protecþie a cheii necunoscut\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "pãrþi secrete ale cheii nu sunt disponibile\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "cheia secretã deja stocatã pe un card\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "ieºi din acest meniu"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "aratã comenzi administrare"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "afiºeazã acest mesaj"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "afiºeazã toate datele disponibile"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "schimbã numele purtãtorului cardului"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "schimbã URL-ul de unde sã fie adusã cheia"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "adu cheia specificatã de URL-ul de pe card"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "schimbã numele de login"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "schimbã preferinþele de limbã"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "schimbã sexul purtãtorului cardului"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "schimbã o amprentã CA"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "comutã fanionul PIN de forþare a semnãturii"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "genereazã noi chei"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "meniu pentru a schimba sau debloca PIN-ul"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "verificã PIN-ul ºi listeazã toate datele"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Comandã> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Comandã numai-administrare\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Sunt permise comenzi administrare\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Nu sunt permise comenzi administrare\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Comandã invalidã  (încercaþi \"ajutor\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "cheia secretã nu e disponibilã"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+"Vã rugãm introduceþi cardul ºi apãsaþi return sau apãsaþi 'c' pentru a "
+"renunþa: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "stergere keyblock a eºuat: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Vã rugãm scoateþi cardul curent ºi introducaþi unul cu numãr de serie:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Apãsaþi return când sunteþi gata sau apãsaþi 'c' pentru a renunþa: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Introduceþi noul PIN Admin: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "introduceþi noul PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Introduceþi PIN Admin: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Introduceþi PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Repetaþi acest PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN-ul nu a fost repetat corect; mai încercaþi o datã"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "nu pot deschide `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output nu merge pentru aceastã comandã\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "cheia \"%s\" nu a fost gãsitã: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "eroare la citire keyblock: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(dacã nu specificaþi cheia prin amprentã)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "nu pot face acest lucru în mod batch fãrã \"--yes\"\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "ªterge aceastã cheie din inelul de chei? (d/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Aceasta este o cheie secretã! - chiar doriþi sã o ºtergeþi? (d/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "stergere keyblock a eºuat: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informaþii încredere-proprietar curãþate\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "existã o cheie secretã pentru cheia publicã \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr ""
+"folosiþi opþiunea \"--delete-secret-keys\" pentru a o ºterge pe aceasta mai "
+"întâi.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "eroare la crearea frazei-parolã: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "nu pot crea un pachet ESK simetric datoritã modului S2K\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "folosesc cifrul %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' deja compresat\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "AVERTISMENT: `%s' este un fiºier gol\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"în modul --pgp2 puteþi cifra numai cu chei RSA de 2048 biþi sau mai puþin\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "citesc din `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr ""
+"nu pot folosi cifrul IDEA pentru pentru toate cheile pentru care cifraþi.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"AVERTISMENT: forþând cifrul simetric %s (%d) violaþi preferinþele "
+"destinatarului\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"AVERTISMENT: forþând algoritmul de compresie %s (%d) violaþi preferinþele "
+"destinatarului\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "forþând cifrul simetric %s (%d) violaþi preferinþele destinatarului\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "nu puteþi folosi %s câtã vreme în modul %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s cifrat pentru: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s date cifrate\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "cifrat cu un algoritm necunoscut %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"AVERTISMENT: mesajul a fost cifrat cu o cheie slabã din cifrul simetric.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problemã cu mânuirea pachetului cifrat\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "nu este suportatã execuþia nici unui program la distanþã\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "nu pot crea directorul `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"chemarea programelor externe sunt deactivate datoritã opþiunilor nesigure "
+"pentru permisiunile fiºierului\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"aceastã platformã necesitã fiºiere temporare când sunt chemate programe "
+"externe\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "nu pot executa programul `%s': %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "nu pot executa shell-ul `%s': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "eroare de sistem la chemarea programului extern: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "ieºire nenaturalã a programului extern\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "nu pot executa programul extern\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "nu pot citi rãspunsul programului extern: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "AVERTISMENT: nu pot ºterge fiºierul temporar (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "AVERTISMENT: nu pot ºterge directorul temporar `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "Semnãtura va fi marcatã ca non-revocabilã.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "nici o cheie de revocare gãsitã pentru \"%s\"\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revocã cheia sau subcheile selectate"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "cheie secretã de nefolosit"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "exportul cheilor secrete nu este permis\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "cheia %s: nu e protejatã - sãritã\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "cheia %s: cheie stil PGP 2.x - sãritã\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "cheia %s: semnãturã subcheie într-un loc greºit - sãritã\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "am eºuat sã stochez cheia: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "AVERTISMENT: cheia secretã %s nu are un checksum SK simplu\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "AVERTISMENT: nimic exportat\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Comenzi:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fiºier]|creazã o semnãturã"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fiºier]|creazã o semnãturã text în clar"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "creazã o semnãturã detaºatã"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "cifreazã datele"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "cifreazã numai cu cifru simetric"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "decripteazã datele (implicit)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verificã o semnãturã"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "enumerã chei"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "enumerã chei ºi semnãturi"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "enumerã ºi verificã semnãturile cheii"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "enumerã chei ºi amprente"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "enumerã chei secrete"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "genereazã o nouã perechi de chei"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "ºterge chei de pe inelul de chei public"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "ºterge chei de pe inelul de chei secret"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "semneazã o cheie"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "semneazã o cheie local"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "semneazã sau editeazã o cheie"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "genereazã un certificat de revocare"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportã chei"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportã chei pentru un server de chei"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importã chei de la un server de chei"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "cautã pentru chei pe un server de chei"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "actualizeazã toate cheile de la un server de chei"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importã/combinã chei"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "afiºeazã starea cardului"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "schimbã data de pe card"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "schimbã PIN-ul unui card"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "actualizeazã baza de date de încredere"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [fiºiere]|afiºeazã rezumate mesaje"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Opþiuni:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "creazã ieºire în armurã ascii"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NUME|cifrare pentru NUME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "foloseºte acest id-utilizator pentru a semna sau decripta"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|seteazã nivel de compresie N (0 deactiveazã)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "foloseºte modul text canonic"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "foloseºte ca fiºier ieºire"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "locvace"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "nu face nici o schimbare"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "întreabã înainte de a suprascrie"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "foloseºte comportament strict OpenPGP"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "genereazã mesaje compatibile cu PGP 2.x"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Aratã pagina man pentru o listã completã a comenzilor ºi opþiunilor)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exemple:\n"
+"\n"
+" -se -r Dan [fiºier]        semneazã ºi cifreazã pentru utilizatorul Dan\n"
+" --clearsign [fiºier]       creazã o semnãturã text în clar\n"
+" --detach-sign [fiºier]     creazã o semnãturã detaºatã\n"
+" --list-keys [nume]         aratã chei\n"
+" --fingerprint [nume]       aratã amprente\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "Raportaþi bug-uri la <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Folosire: gpg [opþiuni] [fiºiere] (-h pentru ajutor)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Sintaxã: gpg [opþiuni] [fiºiere]\n"
+"sign, check, encrypt sau decrypt\n"
+"operaþiunea implicitã depinde de datele de intrare\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Algoritmuri suportate:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Pubkey: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Cifru: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Compresie: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "folosire: gpg [opþiuni] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "comenzi în conflict\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "nu am gãsit nici un semn = în definiþia grupului `%s'\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr ""
+"AVERTISMENT: proprietate nesigurã (unsafe) pentru directorul home `%s'\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr ""
+"AVERTISMENT: proprietate nesigurã (unsafe) pentru fiºier configurare `%s'\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "AVERTISMENT: proprietate nesigurã (unsafe) pentru extensia `%s'\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr ""
+"AVERTISMENT: permisiuni nesigure (unsafe) pentru directorul home `%s'\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr ""
+"AVERTISMENT: permisiuni nesigure (unsafe) pentru fiºier configurare `%s'\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "AVERTISMENT: permisiuni nesigure (unsafe) pentru extensia `%s'\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"AVERTISMENT: proprietate director incluziuni nesigur (unsafe) pentru "
+"directorul home `%s'\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"AVERTISMENT: proprietate director incluziuni nesigur (unsafe) pentru fiºier "
+"configurare `%s'\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"AVERTISMENT: proprietate director incluziuni nesigur (unsafe) pentru "
+"extensia `%s'\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"AVERTISMENT: permisiuni director incluziuni nesigure (unsafe) pentru "
+"directorul home `%s'\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"AVERTISMENT: permisiuni director incluziuni nesigure (unsafe) pentru fiºier "
+"configurare `%s'\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"AVERTISMENT: permisiuni director incluziuni nesigure (unsafe) pentru "
+"extensia `%s'\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "articol configurare necunoscut `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Nici o semnãturã corespunzãtoare în inelul secret\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "URL-ul serverului de chei preferat furnizat este invalid\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "aratã cãruia dintre inelele de chei îi aparþine o cheie enumeratã"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Nici o semnãturã corespunzãtoare în inelul secret\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "NOTÃ: fisier opþiuni implicite vechi `%s' ignorat\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "NOTÃ: nici un fiºier opþiuni implicit `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "fiºier opþiuni `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "citesc opþiuni din `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "NOTÃ: %s nu este pentru o folosire normalã!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"extensie cifru `%s' nu a fost încãrcat din cauza permisiunilor nesigure "
+"(unsafe)\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' nu este expirare de semnãturã validã\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' nu este un set de carectere valid\n"
+
+#
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "nu am putut interpreta URL-ul serverului de chei\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: opþiuni server de chei invalide\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "opþiuni server de chei invalide\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: opþiuni import invalide\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "opþiuni import invalide\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: opþiuni export invalide\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "opþiuni export invalide\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: opþiuni enumerare invalide\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "opþiuni enumerare invalide\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "`%s' nu este expirare de semnãturã validã\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "URL-ul serverului de chei preferat furnizat este invalid\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "`%s' nu este expirare de semnãturã validã\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: opþiuni verificare invalide\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "opþiuni verificare invalide\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "nu pot seta cale-execuþie ca %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: opþiuni verificare invalide\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "AVERTISMENT: programul ar putea crea un fiºier core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "AVERTISMENT: %s înlocuieºte %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s nu este permis cu %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s nu are sens cu %s!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "NOTÃ: %s nu este disponibil în aceastã sesiune\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "nu va rula cu memorie neprotejatã (insecure) pentru cã %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"puteþi crea doar semnãturi detaºate sau în clar câtã vreme sunteþi în modul "
+"--pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr ""
+"nu puteþi semna ºi cifra în acelaºi timp câtã vreme sunteþi în modul --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr ""
+"trebuie sã folosiþi fiºiere (ºi nu un pipe) când lucraþi cu modul --pgp2 "
+"activat.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "cifrarea unui mesaj în modul --pgp2 necesitã un cifru IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "algoritm cifrare selectat este invalid\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "algoritm rezumat selectat este invalid\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "algoritm compresie selectat este invalid\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "algoritm rezumat certificare selectat este invalid\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed trebuie sã fie mai mare decât 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed trebuie sã fie mai mare decât 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth trebuie sã fie în intervalul de la 1 la 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "default-cert-level invalid; trebuie sã fie 0, 1, 2 sau 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "min-cert-level invalid; trebuie sã fie 0, 1, 2 sau 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "NOTÃ: modul S2K simplu (0) este contraindicat cu insistenþã\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "mod S2K invalid; trebuie sã fie 0, 1 sau 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "preferinþe implicite invalide\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "preferinþe cifrare personale invalide\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "preferinþe rezumat personale invalide\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "preferinþe compresie personale invalide\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s nu merge încã cu %s!\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "nu puteþi folosi algoritmul de cifrare `%s' câtã vreme în modul %s\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "nu puteþi folosi algorimul de rezumat `%s' câtã vreme în modul %s\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "nu puteþi folosi algoritmul de compresie `%s' câtã vreme în modul %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "am eºuat sã iniþializez TrustDB:%s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"AVERTISMENT: destinatari (-r) furnizaþi fãrã a folosi cifrare cu cheie "
+"publicã\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [nume_fiºier]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [nume_fiºier]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "cifrarea simetricã a lui `%s' a eºuat: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [nume_fiºier]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [nume_fiºier]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "nu puteþi folosi --symmetric --encrypt cu --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "nu puteþi folosi --symmetric --encrypt câtã vreme în modul %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [nume_fiºier]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [nume_fiºier]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [nume_fiºier]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "nu puteþi folosi --symmetric --sign --encrypt cu --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "nu puteþi folosi --symmetric --sign --encrypt câtã vreme în modul %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [nume_fiºier]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [nume_fiºier]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [nume_fiºier]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id-utilizator"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id-utilizator"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id-utilizator [comenzi]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id-utilizator] [inel_chei]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "trimitere server de chei eºuatã: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "recepþie server de chei eºuatã: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "export cheie eºuat: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "cãutare server de chei eºuatã: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "actualizare server de chei eºuatã: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "eliminarea armurii a eºuat: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "punerea armurii a eºuat: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "algoritm hash invalid `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[nume_fiºier]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Daþi-i drumul ºi scrieþi mesajul ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "URL-ul politicii de certificare furnizat este invalid\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "URL-ul politicii de semnãturi furnizat este invalid\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "URL-ul serverului de chei preferat furnizat este invalid\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "prea multe intrãri în cache-ul pk - deactivat\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[ID utilizator nu a fost gãsit]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "nici o subcheie secretã pentru subcheia publicã %s - ignoratã\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "folosim subcheia %s în loc de cheia primarã %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "cheia %s: cheie secretã fãrã cheie publicã - sãritã\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "fii oarecum mai tãcut"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "ia cheile de pe acest inel de chei"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "dã numai un avertisment la conflicte de timestamp"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|scrie informaþii de stare în acest FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Folosire: gpgv [opþiuni] [fiºiere] (-h pentru ajutor)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Sintaxã: gpg [opþiuni] [fiºiere]\n"
+"Verificã semnãturi folosind cheile cunoscute ca fiind de încredere\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Este sarcina d-voastrã sã atribuiþi o valoare aici; aceastã valoare\n"
+"nu va fi niciodatã exportatã pentru o terþã parte.  Trebuie sã\n"
+"implementãm reþeaua-de-încredere; aceasta nu are nimic în comun cu\n"
+"certificatele-de-reþea (create implicit)."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Pentru a construi Reþeaua-de-Încredere, GnuPG trebuie sã ºtie care chei\n"
+"au nivel de încredere suprem - acestea de obicei sunt cheile pentru care\n"
+"aveþi acces la cheia secretã.  Rãspundeþi \"da\" pentru a seta\n"
+"aceastã cheie cu nivel de încredere suprem\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Dacã doriþi oricum sã folosiþi aceastã cheie fãrã încredere, rãspundeþi \"da"
+"\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Introduceþi ID-ul utilizator al destinatarului mesajului."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Selectaþi algoritmul de folosit.\n"
+"\n"
+"DSA (aka DSS) este Digital Signature Algorithm ºi poate fi folosit numai\n"
+"pentru semnãturi.\n"
+"\n"
+"Elgamal este un algoritm numai pentru cifrare.\n"
+"\n"
+"RSA poate fi folosit pentru semnãturi sau cifrare.\n"
+"\n"
+"Prima cheie (primarã) trebuie sã fie întotdeauna o cheie cu care se poate "
+"semna."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"În general nu este o idee bunã sã folosiþi aceeaºi cheie ºi pentru\n"
+"semnare ºi pentru cifrare.  Acest algoritm ar trebui folosit numai\n"
+"în anumite domenii.  Vã rugãm consultaþi mai întâi un expert în domeniu."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Introduceþi lungimea cheii"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Rãspundeþi \"da\" sau \"nu\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Introduceþi valoarea cerutã precum a arãtat la prompt.\n"
+"Este posibil sã introduceþi o datã ISO (AAAA-LL-ZZ) dar nu veþi\n"
+"obþine un rãspuns de eroare bun - în loc sistemul încearcã sã\n"
+"interpreteze valoare datã ca un interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Introduceþi numele deþinãtorului cheii"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "vã rugãm introduceþi o adresã de email (opþionalã dar recomandatã)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Vã rugãm introduceþi un comentriu opþional"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  pentru a schimba numele.\n"
+"C  pentru a schimba comentariul.\n"
+"E  pentru a schimba adresa de email.\n"
+"O  pentru a continua cu generarea cheii.\n"
+"T  pentru a termina generarea cheii."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr ""
+"Rãspundeþi \"da\" (sau numai \"d\") dacã sunteþi OK sã generaþi subcheia."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Când semnaþi un ID utilizator pe o cheie ar trebui sã verificaþi mai întâi\n"
+"cã cheia aparþine persoanei numite în ID-ul utilizator.  Este util ºi "
+"altora\n"
+"sã ºtie cât de atent aþi verificat acest lucru.\n"
+"\n"
+"\"0\" înseamnã cã nu pretindeþi nimic despre cât de atent aþi verificat "
+"cheia\n"
+"\"1\" înseamnã cã credeþi cã cheia este a persoanei ce pretinde cã este\n"
+"    proprietarul ei, dar n-aþi putut, sau nu aþi verificat deloc cheia.\n"
+"    Aceasta este utilã pentru verificare \"persona\", unde semnaþi cheia\n"
+"    unui utilizator pseudonim.\n"
+"\n"
+"\"2\" înseamnã cã aþi fãcut o verificare supericialã a cheii.  De exemplu,\n"
+"    aceasta ar putea însemna cã aþi verificat amprenta cheii ºi aþi "
+"verificat\n"
+"    ID-ul utilizator de pe cheie cu un ID cu pozã.\n"
+"\n"
+"\"3\" înseamnã cã aþi fãcut o verificare extensivã a cheii.  De exemplu,\n"
+"    aceasta ar putea însemna cã aþi verificat amprenta cheii cu "
+"proprietarul\n"
+"    cheii în persoanã, cã aþi verificat folosind un document dificil de\n"
+"    falsificat cu pozã (cum ar fi un paºaport) cã numele proprietarului "
+"cheii\n"
+"    este acelaºi cu numele ID-ului utilizator al cheii ºi cã aþi verificat\n"
+"    (schimbând emailuri) cã adresa de email de pe cheie aparþine "
+"proprietarului\n"
+"cheii.\n"
+"\n"
+"De notat cã exemplele date pentru nivelele 2 ºi 3 ceva mai sus sunt *numai*\n"
+"exemple. La urma urmei, d-voastrã decideþi ce înseamnã \"superficial\" ºi\n"
+"\"extensiv\" pentru d-voastrã când semnaþi alte chei.\n"
+"\n"
+"Dacã nu ºtiþi care este rãspunsul, rãspundeþi \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Rãspundeþi \"da\" dacã doriþi sã semnaþi TOATE ID-urile utilizator"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Rãspundeþi \"da\" dacã într-adevãr doriþi sã ºtergeþi acest ID utilizator.\n"
+"Toate certificatele sunt de asemenea pierdute!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Rãspundeþi \"da\" dacã este OK sã ºtergeþi subcheia"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Aceasta este o semnãturã validã pe cheie; în mod normal n-ar trebui\n"
+"sã ºtergeþi aceastã semnãturã pentru cã aceasta ar putea fi importantãla "
+"stabilirea conexiunii de încredere la cheie sau altã cheie certificatã\n"
+"de aceastã cheie."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Aceastã semnãturã nu poate fi verificatã pentru cã nu aveþi cheia\n"
+"corespunzãtoare.  Ar trebui sã amânaþi ºtergerea sa pânã ºtiþi care\n"
+"cheie a fost folositã pentru cã aceastã cheie de semnare ar putea\n"
+"constitui o conexiune de încredere spre o altã cheie deja certificatã."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Semnãtura nu este validã.  Aceasta ar trebui ºtearsã de pe inelul\n"
+"d-voastrã de chei."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Aceasta este o semnãturã care leagã ID-ul utilizator de cheie.\n"
+"De obicei nu este o idee bunã sã ºtergeþi o asemenea semnãturã.\n"
+"De fapt, GnuPG ar putea sã nu mai poatã folosi aceastã cheie.\n"
+"Aºa cã faceþi acest lucru numai dacã aceastã auto-semnãturã este\n"
+"dintr-o oarecare cauzã invalidã ºi o a doua este disponibilã."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Schimbaþi toate preferinþele ale tuturor ID-urilor utilizator (sau doar\n"
+"cele selectate) conform cu lista curentã de preferinþe.  Timestamp-urile\n"
+"tuturor auto-semnãturilor afectate vor fi avansate cu o secundã.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr ""
+"Vã rugãm introduceþi fraza-parolã; aceasta este o propoziþie secretã \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Vã rugãm repetaþi ultima frazã-parolã, pentru a fi sigur(ã) ce aþi tastat."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Daþi numele fiºierului la care se aplicã semnãtura"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Rãspundeþi \"da\" dacã este OK sã suprascrieþi fiºierul"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Vã rugãm introduceþi un nou nume-fiºier. Dacã doar apãsaþi RETURN,\n"
+"va fi folosit fiºierul implicit (arãtat în paranteze)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Ar trebui sã specificaþi un motiv pentru certificare.  În funcþie de\n"
+"context aveþi posibilitatea sã alegeþi din aceastã listã:\n"
+"  \"Cheia a fost compromisã\"\n"
+"      Folosiþi aceastã opþiune dacã aveþi un motiv sã credeþi cã persoane\n"
+"      neautorizate au avut acces la cheia d-voastrã secretã.\n"
+"  \"Cheia este înlocuitã\"\n"
+"      Folosiþi aceastã opþiune dacã înlocuiþi cheia cu una nouã.\n"
+"  \"Cheia nu mai este folositã\"\n"
+"      Folosiþi aceastã opþiune dacã pensionaþi cheia.\n"
+"  \"ID-ul utilizator nu mai este valid\"\n"
+"      Folosiþi aceastã opþiune dacã ID-ul utilizator nu mai trebuie "
+"folosit;\n"
+"      de obicei folositã pentru a marca o adresã de email ca invalidã.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Dacã doriþi, puteþi introduce un text descriind de ce publicaþi acest\n"
+"certificat de revocare.  Vã rugãm fiþi concis.\n"
+"O linie goalã terminã textul.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Nici un ajutor disponibil"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Nici un disponibil disponibil pentru `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "actualizeazã baza de date de încredere"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "cheia publicã nu se potriveºte cu cheia secretã!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "cheie secretã de nefolosit"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "bloc de tip %d sãrit\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu chei procesate pânã acum\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Numãr total procesate: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      chei noi sãrite: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "  fãrã ID-uri utilizator: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "               importate: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "             neschimbate: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "   noi ID-uri utilizator: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "             noi subchei: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "           noi semnãturi: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "    noi revocãri de chei: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "     chei secrete citite: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  chei secrete importate: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "chei secrete neschimbate: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "            ne importate: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "semnãturi create pânã acum: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "     chei secrete citite: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "AVERTISMENT: cheia %s conþine preferinþe pentru indisponibil\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "algoritmuri pentru aceste ID-uri utilizator:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": preferinþã pentru algoritm de cifrare %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": preferinþã pentru algoritm rezumat %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         \"%s\": preferinþã pentru algoritm compresie %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+"este puternic sugerat sã vã actualizaþi preferinþele ºi re-distribuiþi\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"aceastã cheie pentru a avita probleme potenþiale de ne-potrivire de "
+"algoritm\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "vã puteþi actualiza preferinþele cu: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "cheia %s: nici un ID utilizator\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "cheia %s: subcheia HPK coruptã a fost reparatã\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "cheia %s: am acceptat ID-ul utilizator ce nu e auto-semnat \"%s\"\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "cheia %s: nici un ID utilizator valid\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "aceasta poate fi cauzatã de o auto-semnãturã ce lipseºte\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "cheia %s: cheia publicã nu a fost gãsitã: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "cheia %s: cheie nouã - sãritã\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "n-am gãsit nici un inel de chei ce poate fi scris: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "scriu în `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "eroare la scrierea inelului de chei `%s': %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "cheia %s: cheia publicã \"%s\" importatã\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "cheia %s: nu se potriveºte cu copia noastrã\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "cheia %s: nu pot gãsi keyblock-ul original: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "cheia %s: nu pot citi keyblock-ul original: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "cheia %s: \"%s\" 1 nou ID utilizator\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "cheia %s: \"%s\" %d noi ID-uri utilizator\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "cheia %s: \"%s\" 1 nouã semnãturã\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "cheia %s: \"%s\" %d noi semnãturi\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "cheia %s: \"%s\" 1 nouã subcheie\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "cheia %s: \"%s\" %d noi subchei\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "cheia %s: \"%s\" %d noi semnãturi\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "cheia %s: \"%s\" %d noi semnãturi\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "cheia %s: \"%s\" %d noi ID-uri utilizator\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "cheia %s: \"%s\" %d noi ID-uri utilizator\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "cheia %s: \"%s\" nu a fost schimbatã\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "cheia %s: cheie secretã cu cifru invalid %d - sãritã\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "importul de chei secrete nu este permis\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "nici un inel de chei secrete implicit: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "cheia %s: cheie secretã importatã\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "cheia %s: deja în inelul de chei secrete\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "cheia %s: cheia secretã nu a fost gãsitã: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"cheia %s: nici o cheie publicã - nu pot aplica certificatul de revocare\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "cheia %s: certificat de revocare invalid: %s - respins\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "cheia %s: certificatul de revocare \"%s\" importat\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "cheia %s: nici un ID utilizator pentru semnãturã\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"cheia %s: algoritm cu cheie publicã nesuportat pentru ID-ul utilizator \"%s"
+"\"\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "cheia %s: auto-semnãturã invalidã pentru ID-ul utilizator \"%s\"\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "cheia %s: nici o subcheie pentru legarea cheii\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "cheia %s: algoritm cu cheie publicã nesuportat\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "cheia %s: legare subcheie invalidã\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "cheia %s: am ºters multiple legãturi de subchei\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "cheia %s: nici o subcheie pentru revocare de cheie\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "cheia %s: revocare de subcheie invalidã\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "cheia %s: am ºters multiple revocãri de subcheie\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "cheia %s: am sãrit ID-ul utilizator \"%s\"\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "cheia %s: am sãrit subcheia\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "cheia %s: semnãtura nu poate fi exportatã (clasa 0x%02X) - sãritã\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "cheia %s: certificat de revocare într-un loc greºit - sãrit\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "cheia %s: certificat de revocare invalid: %s - sãrit\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "cheia %s: semnãturã subcheie într-un loc greºit - sãritã\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "cheia %s: clasã de semnãturã neaºteptatã (0x%02X) - sãritã\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "cheia %s: am detectat un ID utilizator duplicat - combinate\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "AVERTISMENT: cheia %s poate fi revocatã: aduc revocarea cheii %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"AVERTISMENT: cheia %s poate fi revocatã: cheia de revocare %s nu este "
+"prezentã.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "cheia %s: am adãugat certificatul de revocare \"%s\"\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "cheia %s: am adãugat semnãtura de cheie directã\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "NOTÃ: S/N-ul unei chei nu se potriveºte cu cel al cardului\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "NOTÃ: cheia primarã este online ºi stocatã pe card\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "NOTÃ: cheia secundarã este online ºi stocatã pe card\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "eroare la crearea inelului de chei `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "inelul de chei `%s' creat\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "resursã keyblock `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "am eºuat sã reconstruiesc cache-ul inelului de chei: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revocare]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[auto-semnãturã]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 semnãturã incorectã\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d semnãturi incorecte\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+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"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, 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"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 semnãturã nu a fost verificatã din cauza unei erori\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d semnãturi nu au fost verificate din cauza unor erori\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "am gãsit 1 ID utilizator fãrã auto-semnãturã validã\n"
+
+#: g10/keyedit.c:359
+#, 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"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Vã rugãm decideþi cât de multã încredere aveþi în acest utilizator\n"
+"pentru a verifica cheile altor utilizatori (folosind paºapoarte,\n"
+"verificând amprentele din diferite surse, etc.)\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = Am o încredere marginalã\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = Am toatã încrederea\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Vã rugãm sã introduceþi adâncimea acestei semnãturi de încredere.\n"
+"O adâncime mai mare de 1 permite ca cheia pe care o semnaþi sã facã\n"
+"semnãturi de încredere în numele d-voastrã.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+"Vã rugãm sã introduceþi domeniul de restricþionare al acestei semnãturi, sau "
+"apãsaþi enter pentru niciunul.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "ID utilizator \"%s\" a fost revocat."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Sunteþi sigur(ã) cã doriþi sã ºtergeþi permanent \"%s\"? (d/N)"
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Nu pot semna.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "ID utilizator \"%s\" este expirat."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "ID-ul utilizator \"%s\" nu este auto-semnat."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "ID-ul utilizator \"%s\" poate fi semnat.  "
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Doriþi sã-l semnaþi? (d/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Auto-semnãtura pe \"%s\"\n"
+"este o semnãturã stil PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Doriþi sã o promovaþi la o auto-semnãturã OpenPGP? (d/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Semnãtura d-voastrã curentã pe \"%s\"\n"
+"a expirat.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Doriþi sã creaþi o nouã semnãturã pentru a o înlocui pe cea expiratã? (d/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Semnãtura d-voastrã curentã pe \"%s\"\n"
+"semnãturã localã.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Doriþi sã o promovaþi la o semnãturã total exportabilã? (d/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" a fost deja semnatã local de cheia %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" a fost deja semnatã de cheia %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Doriþi sã o semnaþi oricum din nou? (d/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Nimic de semnat cu cheia %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Aceastã cheie a expirat!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Aceastã cheie va expira pe %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Doriþi ca semnãtura d-voastrã sã expire în acelaºi timp? (D/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Nu puteþi crea o semnãturã OpenPGP pe o cheie PGP 2.x câtã vreme sunteþi în "
+"modul --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Aceasta va face cheia de nefolosit în PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Cât de atent aþi verificat cã cheia pe care sunteþi pe cale a o semna "
+"aparþine\n"
+"într-adevãr persoanei numite deasupra?  Dacã nu ºtiþi ce sã rãspundeþi,\n"
+"introduceþi \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Nu voi rãspunde.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Nu am verificat deloc.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Am fãcut ceva verificãri superficiale.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Am fãcut verificãri foarte atente.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Selecþia dvs.? (introduceþi `?' pentru informaþii suplimentare): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Sunteþi într-adevãr sigur(ã) cã doriþi sã semnaþi\n"
+"aceastã cheie cu cheia d-voastrã \"%s\" (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Aceasta va fi o auto-semnãturã.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "AVERTISMENT: semnãtura nu va fi marcatã ca non-exportabilã.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "AVERTISMENT: semnãtura nu va fi marcatã ca non-revocabilã.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "Semnãtura va fi marcatã ca non-exportabilã.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "Semnãtura va fi marcatã ca non-revocabilã.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "Nu am verificat aceastã cheie deloc.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "Am verificat aceastã cheie superficial.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "Am verificat aceastã cheie foarte atent.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Doriþi cu adevãrat sã semnaþi? (d/N) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "semnarea a eºuat: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+"Cheia are numai articole de cheie sau talon (stub) pe card - nici o frazã "
+"parolã de schimbat.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Aceastã cheie nu este protejatã.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Pãrþile secrete ale cheii primare nu sunt disponibile.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Pãrþi secrete ale cheii primare sunt stacate pe card.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Cheia este protejatã.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Nu pot edita aceastã cheie: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Introduceþi noua frazã-parolã pentru acestã cheie secretã.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "fraza-parolã nu a fost repetatã corect; mai încercaþi o datã"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Nu doriþi o frazã-parolã - aceasta este probabil o idee *proastã*!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Doriþi într-adevãr sã faceþi acest lucru? (d/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "mut o semnãturã de cheie în locul corect\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "salveazã ºi terminã"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "afiºeazã amprenta cheii"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "enumerã chei ºi ID-uri utilizator"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "selecteazã ID utilizator N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "selecteazã subcheia N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "verificã semnãturi"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+"semneazã ID-urile utilizator selectate [* vezi mai jos pentru comenzi "
+"relevante]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "semneazã ID-urile utilizatorilor selectaþi local"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "semneazã ID-urile utilizatorilor selectaþi cu o semnãturã de încredere"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "semneazã ID-urile utilizatorilor selectaþi cu o semnãturã irevocabilã"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "adaugã un ID utilizator"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "adaugã o pozã ID"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "ºterge ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "adaugã o subcheie"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "adaugã o cheie la un smartcard"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "mutã o cheie pe un smartcard"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "mutã o cheie de rezervã pe un smartcard"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "ºterge subcheile selectate"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "adaugã o cheie de revocare"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "ºterge semnãturile de pe ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "schimbã data de expirare pentru cheia sau subcheile selectate"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "marcheazã ID-ul utilizator selectat ca primar"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "comutã între listele de chei secrete ºi publice"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "enumerã preferinþele (expert)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "afiºeazã preferinþele (detaliat)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "seteazã lista de preferinþe pentru ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr ""
+"seteazã URL-ul serverului de chei preferat pentru ID-urile utilizator "
+"selectate"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "seteazã lista de preferinþe pentru ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "schimbã fraza-parolã"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "schimbã încrederea pentru proprietar"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "revocã semnãturile pentru ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "revocã ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "revocã cheia sau subcheile selectate"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "activeazã cheia"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "deactiveazã cheia"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "aratã pozele pentru ID-urile utilizator selectate"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "eroare la citire keyblock secret \"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Cheia secretã este disponibilã.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Aveþi nevoie de cheia secretã pentru a face aceasta.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Vã rugãm folosiþi mai întâi comanda \"toggle\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* Comanda `sign' (semneazã) poate fi prefixatã cu un `l' pentru semnãturi\n"
+"  locale (lsign), un `t' pentru semnãturi de încredere (tsign), un `nr'\n"
+"  pentru semnãturi irevocabile (nrsign), sau orice combinaþie a acestora\n"
+"  (ltsign, tnrsign, etc.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Cheia este revocatã."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Semnaþi într-adevãr toate ID-urile utilizator? (d/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Sugestie: Selectaþi ID-ul utilizator de semnat\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "Tip de semnãturã necunoscut `%s'\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Aceastã comandã nu este permisã în modul %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Trebuie mai întâi sã selectaþi cel puþin un ID utilizator.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Nu puteþi ºterge ultimul ID utilizator!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "ªtergeþi într-adevãr toate ID-urile utilizator selectate? (d/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "ªtergeþi într-adevãr acest ID utilizator? (d/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Mutaþi într-adevãr cheia primarã? (d/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Trebuie sã selectaþi exact o cheie.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "Comanda aºteaptã un nume de fiºier ca argument\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Nu pot deschide `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "Eroare citind cheia de rezervã de pe `%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Trebuie sã selectaþi cel puþin o cheie.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Doriþi într-adevãr sã ºtergeþi cheile selectate? (d/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Doriþi într-adevãr sã ºtergeþi aceastã cheie? (d/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr ""
+"Doriþi într-adevãr sã revocaþi toate ID-urile utilizator selectate? (d/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Doriþi într-adevãr sã revocaþi acest ID utilizator? (d/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Doriþi într-adevãr sã revocaþi toatã cheia? (d/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Doriþi într-adevãr sã revocaþi subcheile selectate? (d/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Doriþi într-adevãr sã revocaþi aceastã subcheie? (d/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"Încrederea proprietar nu poate fi setatã când este folositã o bazã de date "
+"de încredere furnizatã de utilizator\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Seteazã lista de preferinþe ca:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Doriþi într-adevãr sã actualizaþi preferinþele pentru ID-urile utilizator "
+"selectate? (d/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Doriþi într-adevãr sã actualizaþi preferinþele? (d/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Salvaþi schimbãrile?  (d/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Terminaþi fãrã a salva?  (d/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "actualizarea a eºuat: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "actualizarea secretului a eºuat: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Cheia nu a fost schimbatã aºa cã nici o actualizare a fost necesarã.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Rezumat: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Capabilitãþi: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Server de chei no-modify"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Server de chei preferat: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notaþie:"
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Nu existã nici o preferinþã pentru un ID utilizator stil PGP 2.x.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Aceastã cheie a fost revocatã pe %s de %s cheia %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Aceastã cheie poate fi revocatã de %s cheia %s"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr " (senzitiv)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "creatã: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "revocatã: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "expiratã: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "expirã: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "folosire: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "încredere: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "validitate: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Aceastã cheie a fost deactivatã"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "nr-card: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Vã rugãm observaþi cã validitatea cheii arãtate nu este în mod necesar\n"
+"corectã dacã nu reporniþi programul.\n"
+
+#
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "revocatã"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "expiratã"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"AVERTISMENT: nici un ID utilizator nu a fost marcat ca primar.\n"
+"              Aceastã comandã poate cauza ca un alt ID utilizator\n"
+"              sã devinã ID-ul utilizator primar presupus.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"AVERTISMENT: Aceasta este o cheie stil PGP2.  Adãugarea unei poze ID poate\n"
+"         cauza unele versiuni de PGP sã respingã aceastã cheie.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Sunteþi încã sigur(ã) cã doriþi sã o adãugaþi? (d/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Nu puteþi adãuga o pozã ID la o cheie stil PGP2.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "ªtergeþi aceastã semnãturã bunã? (d/N/t)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "ªtergeþi aceastã semnãturã invalidã? (d/N/t)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "ªtergeþi aceastã semnãturã necunoscutã? (d/N/t)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "ªtergeþi într-adevãr aceastã auto-semnãturã? (d/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Am ºters %d semnãturi.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Am ºters %d semnãturi.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Nu am ºters nimic.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "invalid(ã)"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "ID utilizator \"%s\" a fost revocat."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "ID utilizator \"%s\" a fost revocat."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "ID utilizator \"%s\" a fost revocat."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "ID-ul utilizator \"%s\": este deja curat.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "ID-ul utilizator \"%s\": este deja curat.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"AVERTISMENT: Aceasta este o cheie stil PGP 2.x.  Adãugarea unui revocator\n"
+"             desemnat poate face ca unele versiuni de PGP sã respingã "
+"cheia.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Nu puteþi adãuga un revocator desemnat la o cheie stil PGP 2.x.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Introduceþi ID-ul utilizator al revocatorului desemnat: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "nu pot desemna o cheie stil PGP 2.x ca un revocator desemnat\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "nu puteþi desemna o cheie ca propriul sãu revocator desemnat\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "aceastã cheie a fost deja desemnatã ca un revocator\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"AVERTISMENT: desemnarea unei chei ca un revocator desemnat nu poate fi "
+"anulatã!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Sunteþi sigur(ã) cã doriþi sã desemnaþi aceastã cheie ca ºi un revocator "
+"desemnat? (d/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Vã rugãm ºtergeþi selecþiile din cheile secrete.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Vã rugãm selectaþi cel mult o subcheie.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Schimb timpul de expirare pentru o subcheie.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Schimb timpul de expirare pentru cheia primarã.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Nu puteþi schimba data de expirare a unei chei v3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Nici o semnãturã corespunzãtoare în inelul secret\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"AVERTISMENT: subcheia de semnare %s nu este certificatã reciproc (cross-"
+"certified)\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Vã rugãm selectaþi exact un ID utilizator.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "auto-semnãturã v3 sãritã pentru ID-ul utilizator \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Introduceþi URL-ul serverului de chei preferat: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Sunteþi sigur(ã) cã doriþi sã o folosiþi? (d/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Sunteþi sigur(ã) cã doriþi sã o folosiþi? (d/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Notare semnãturã: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Suprascriu? (d/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Nici un ID utilizator cu indicele %d\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Nici un ID utilizator cu hash-ul %s\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "Nici o subcheie cu indicele %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "ID utilizator: \"%s\"\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "semnatã de cheia d-voastrã %s la %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (non-exportabilã)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Aceastã semnãturã a expirat pe %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Sunteþi încã sigur(ã) cã doriþi sã o revocaþi? (d/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Creaþi un certificat de revocare pentru aceastã semnãturã? (d/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Aþi semnat aceste ID-uri utilizator pe cheia %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (non-revocabilã)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "revocatã de cheia d-voastrã %s pe %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Sunteþi pe cale sã revocaþi aceste semnãturi:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Doriþi într-adevãr sã creaþi certificatele de revocare? (d/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "nici o cheie secretã\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "ID-ul utilizator \"%s\" este deja revocat\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"AVERTISMENT: o semnãturã ID utilizator este datatã %d secunde în viitor\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Cheia %s este deja revocatã.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Subcheia %s este deja revocatã.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Afiºez poza ID %s de dimensiune %ld pentru cheia %s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "preferinþa `%s' duplicatã\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "prea multe preferinþe de cifrare\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "prea multe preferinþe de rezumat\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "prea multe preferinþe de compresie\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "articol invalid `%s' în ºirul de preferinþe\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "scriu semnãturã directã\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "scriu auto semnãturã\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "scriu semnãturã legatã de cheie\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "lungime cheie invalidã; folosesc %u biþi\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "lungime cheie rotunjitã la %u biþi\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "Semneazã"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Cifreazã"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Autentificã"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsCcAaTt"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Acþiuni posibile pentru o cheie %s: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Acþiuni permise curent: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Comutã capabilitatea de semnare\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Comutã capabilitatea de cifrare\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Comutã capabilitatea de autentificare\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Terminat\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Selectaþi ce fel de cheie doriþi:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA ºi Elgamal (implicit)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (numai semnare)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (seteazã singur capabilitãþile)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Elgamal (numai cifrare)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (numai semnare)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (numai cifrare)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (seteazã singur capabilitãþile)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Perechea de chei DSA va avea %u biþi.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "cheile %s pot avea lungimea între %u ºi %u biþi.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Ce lungime de cheie doriþi? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "dimensiunile cheii %s trebuie sã fie în intervalul %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Lungimea cheii necesarã este %u biþi\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "rotunjitã prin adaos la %u biþi\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Specificaþi cât de mult timp doriþi sã fie validã cheia.\n"
+"         0 = cheia nu expirã\n"
+"      <n>  = cheia expirã în n zile\n"
+"      <n>w = cheia expirã în n sãptãmâni\n"
+"      <n>m = cheia expirã în n luni\n"
+"      <n>y = cheia expirã în n ani\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Specificaþi cât de mult timp doriþi sã fie validã semnãtura.\n"
+"         0 = semnãtura nu expirã\n"
+"      <n>  = semnãtura expirã în n zile\n"
+"      <n>w = semnãtura expirã în n sãptãmâni\n"
+"      <n>m = semnãtura expirã în n luni\n"
+"      <n>y = semnãtura expirã în n ani\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Cheia este validã pentru? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Semnãtura este validã pentru? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "valoare invalidã\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Cheia nu expirã deloc\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Semnãtura nu expirã deloc\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Cheia expirã pe %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Semnãtura expirã pe %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Sistemul d-voastrã nu poate afiºa date dupã 2038.\n"
+"Totuºi, acestea vor fi corect mânuite pânã în 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Este aceasta corect? (d/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Aveþi nevoie de un ID utilizator pentru a identifica cheia; software-ul\n"
+"construieºte ID-ul utilizator din Numele Real, Comentariul ºi Adresa de "
+"Email\n"
+"în aceastã formã:\n"
+"    \"Popa Ioan (popicã) <popa.ioan@compania.ro>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Nume real: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Caracter invalid în nume\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Numele nu poate începe cu o cifrã\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Numele trebuie sã fie de cel puþin 5 caractere\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Adresã de email: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Nu este o adresã de email validã\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Comentariu: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Caracter invalid în comentariu\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Folosiþi setul de caractere `%s'\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Aþi selectat acest ID-UTILIZATOR:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Vã rugãm nu puneþi adresa de email în numele real sau comentariu\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoTt"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Schimbã (N)ume, (C)omentariu, (E)mail sau (T)Terminã? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Schimbã (N)ume, (C)omentariu, (E)mail sau (O)K/(T)Terminã? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Vã rugãm corectaþi mai întâi eroarea\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Trebuie sã generãm o grãmadã de octeþi aleatori. Este o idee bunã sã faceþi\n"
+"altceva (tastaþi la tastaturã, miºcaþi mausul, utilizaþi discurile)\n"
+"în timpul generãrii numerelor prime; aceasta dã o ºansã generatorului de\n"
+"numere aleatoare o ºansã mai bunã de a aduna destulã entropie.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Generarea cheii a fost anulatã.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "scriu cheia publicã în `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "scriu talonul (stub) cheii secrete în `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "scriu cheia secretã în `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "nu am gãsit nici un inel de chei public de scris: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "nu am gãsit nici un inel de chei secret de scris: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "eroare la scrierea inelului de chei public `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "eroare la scrierea inelului de chei secret `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "cheile secretã ºi publicã au fost create ºi semnate.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"De notat cã aceastã cheie nu poate fi folositã pentru cifrare.  Poate "
+"doriþi\n"
+"sã folosiþi comanda \"--edit-key\" pentru a genera o subcheie secundarã\n"
+"pentru acest scop.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Generarea cheii a eºuat: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"cheia a fost creatã %lu secundã în viitor (warp în timp sau probleme cu "
+"ceasul)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"cheia a fost creatã %lu secunde în viitor (warp în timp sau probleme cu "
+"ceasul)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "NOTÃ: crearea de subchei pentru chei v3 nu este conform OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Creaþi într-adevãr? (d/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "stocarea cheii pe card a eºuat: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "nu pot crea fiºier de rezervã `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "NOTÃ: copia de siguranþa a cheii cardului salvatã la `%s'\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "niciodatã "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Politicã de semnãturi criticã: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Politicã de semnãturi: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Server de chei preferat critic: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Notare semnãturã criticã: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Notare semnãturã: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Inel de chei"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Amprentã cheie primarã:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Amprentã subcheie:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Amprentã cheie primarã:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Amprentã subcheie:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "      Amprentã cheie ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Card nr. serie ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "redenumirea `%s' ca `%s' a eºuat: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "AVERTISMENT: existã 2 fiºiere cu informaþii confidenþiale.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s este cel neschimbat\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s este cel nou\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Vã rugãm reparaþi aceastã deficienþã posibilã de securitate\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "pun în cache inelul de chei `%s'\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu chei puse în cache pânã acum (%lu semnãturi)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu chei puse în cache (%lu semnãturi)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: inelul de chei creat\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Introduceþi URL-ul serverului de chei preferat: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"AVERTISMENT: opþiunile serverului de chei `%s' nu sunt folosite pe aceastã "
+"platformã\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "deactivat(ã)"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Introduceþi numãr/numere, N)ext (urmãtor), sau Q)uit (terminã) > "
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "protocol server de chei invalid (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "cheia \"%s\" nu a fost gãsitã pe serverul de chei\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "cheia nu a fost gãsitã pe serverul de chei\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "cer cheia %s de la serverul %s %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "cer cheia %s de la %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "caut \"%s\" de pe serverul %s %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "caut \"%s\" de pe %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "trimit cheia %s serverului %s %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "trimit cheia %s lui %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "caut \"%s\" de pe serverul %s %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "caut \"%s\" de pe %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "nici o acþiune pentru serverul de chei!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+"AVERTISMENT: manipulator server de chei dintr-o versiune diferitã de GnuPG (%"
+"s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "serverul de chei nu a trimis VERSION (versiune)\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "nici un server de chei cunoscut (folosiþi opþiunea --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+"apeluri cãtre server de chei extern nu este suportat de acest program\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "nici un manipulator (handler) pentru schema serverului de chei `%s'\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "acþiunea `%s' nu este suportatã cu schema serverului de chei `%s'\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s nu suportã versiunea de manipulator (handler) %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "serverul de chei a epuizat timpul de aºteptare (timed out)\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "eroare internã server de chei\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "eroare de comunicare server de chei: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "\"%s\" nu este un ID de cheie: sãrit\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "AVERTISMENT: nu pot reactualiza cheia %s via %s: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "reactualizez 1 cheie de la %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "reactualizez %d chei de la %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "AVERTISMENT: nu pot reactualiza cheia %s via %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "AVERTISMENT: nu pot reactualiza cheia %s via %s: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "dimensiune ciudatã pentru o cheie de sesiune cifratã (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s cheie de sesiune cifratã\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "fraza-parolã generatã cu un algoritm rezumat necunoscut %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "cheia publicã este %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "date cigrate cu cheie publicã: DEK bun\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "cifrat cu cheia %u-bit %s, ID %s, creatã %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      \"%s\"\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "cifrat cu cheia %s, ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "decriptarea cu cheie publicã a eºuat: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "cifratã cu %lu fraze-parolã\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "cifratã cu 1 frazã-parolã\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "presupunem date cifrate %s\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "cifru IDEA indisponibil, vom încerca sã folosim %s în loc\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "decriptare OK\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "AVERTISMENT: mesajul nu a avut integritatea protejatã\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "AVERTISMENT: mesajul cifrat a fost manipulat!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "decriptarea a eºuat: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "NOTÃ: expeditorul a cerut \"doar-pentru-ochii-d-voastrã\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "nume fiºier original='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "revocare standalone - folosiþi \"gpg --import\" pentru a aplica\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Semnãturã bunã din \"%s\""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verificare semnãturã eliminatã\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "nu pot mânui aceste semnãturi multiple\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Semnãturã fãcutã %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               folosind cheia %s %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Semnãturã fãcutã %s folosind cheia %s cu ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Cheie disponibilã la: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "Semnãturã INCORECTàdin \"%s\""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Semnãturã expiratã din \"%s\""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Semnãturã bunã din \"%s\""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[nesigur]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                aka \"%s\""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Semnãturã expiratã %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Semnãtura expirã %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "semnãturã %s, algoritm rezumat %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binar"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "modtext"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "necunoscut"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Nu pot verifica semnãtura: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "nu o semnãturã detaºatã\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"AVERTISMENT: am detectat multiple semnãturi.  Numai prima va fi verificatã.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "semnãturã de sine stãtãtoare (standalone) de clasã 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "semnãturã de stil vechi (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "pachet root invalid detectat în proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "nu pot deactiva generarea fiºierelor core: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "fstat pentru `%s' a eºuat în %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) a eºuat în %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "AVERTISMENT: folosesc algoritmul cu cheie publicã experimental %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "AVERTISMENT: folosesc algoritmul de cifrare experimental %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "AVERTISMENT: folosesc algoritmul rezumat experimental %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "AVERTISMENT: algoritmul rezumat %s este prea vechi (deprecated)\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "plugin-ul pentru cifrare IDEA nu este prezent\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = aratã-mi mai multe informaþii\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: opþiune învechitã \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "AVERTISMENT: \"%s\" este o opþiune învechitã\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "vã rugãm folosiþi \"%s%s\" în loc\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "AVERTISMENT: \"%s\" este o comandã învechitã - nu o folosiþi\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Necompresat"
+
+#
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "necompresat|niciunul"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "acest mesaj s-ar putea sã nu poatã fi folosit de %s\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "opþiune ambiguã `%s'\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "opþiune necunoscutã `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Fiºierul `%s' existã. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Suprascriu? (d/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: sufix necunoscut\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Introduceþi un nou nume-fiºier"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "scriu la stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "presupun date semnate în `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "fiºier de configurare nou `%s' creat\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"AVERTISMENT: opþiunile din %s nu sunt încã active în timpul acestei rulãri\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "director `%s' creat\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "nu pot mânui algoritmul cu cheie publicã %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"AVERTISMENT: cheie de sesiune cifratã simetric potenþial nesigurã "
+"(insecure)\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "subpachetul de tip %d are bitul critic setat\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent nu este disponibil în aceastã sesiune\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "variabila de mediu GPG_AGENT_INFO anormalã\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent versiune protocol %d nu este suportat\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "nu mã pot conecta la `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problemã cu agentul - deactivez  folosirea agentului\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (ID cheie principalã %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Aveþi nevoie de o frazã-parolã pentru a descuia cheia secretã pt. "
+"utilizator:\n"
+"\"%.*s\"\n"
+"cheia %u-bit %s, ID %s, creatã %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repetaþi fraza-parolã\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Introduceþi fraza-parolã\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "anulatã de utilizator\n"
+
+#
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "nu pot cere fraza-parolã în modul batch\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Introduceþi fraza-parolã: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Aveþi nevoie de o frazã-parolã pentru a descuia cheia secretã pentru\n"
+"utilizator: \"%s\"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "cheia %u-bit %s, ID %s, creatã %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (subcheie pe cheia principalã ID %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repetaþi fraza-parolã: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Alegeþi o imagine pentru a o folosi ca pozã ID.  Imaginea trebuie sã fie un\n"
+"fiºier JPEG.  Amintiþi-vã cã imaginea este pãstratã în cheia d-voastrã "
+"publicã.\n"
+"Dacã folosiþi o imagine foarte largã, cheia d-voastrã va deveni de asemenea\n"
+"foarte largã!\n"
+"Încercaþi sã folosiþi o imagine de aproximativ 240x288 pixeli.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Introduceþi nume-fiºier JPEG pentru pozã ID: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "nu pot deschide fiºierul JPEG `%s': %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "Acest JPEG este foarte mare (%d octeþi) !\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Sunteþi sigur(ã) cã doriþi sã îl folosiþi? (d/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' nu este un fiºier JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Este aceastã pozã corectã (d/N/t)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "nu pot afiºa poza ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Nici un motiv specificat"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Cheia este înlocuitã"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Cheia a fost compromisã"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Cheia nu mai este folositã"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "ID utilizator nu mai este valid"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "motiv pentru revocare: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "comentariu revocare: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMtTsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "Nici o valoare de încredere atribuitã lui:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  aka \"%s\"\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"Cât de mult credeþi cã aceastã cheie aparþine într-adevãr utilizatorului "
+"numit?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = Nu ºtiu sau nu vreau sã mã pronunþ\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = NU am încredere\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = Am încredere supremã\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = înapoi la meniul principal\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = sãri peste cheia asta\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  t = terminã\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"Nivelul minim de încredere pentru aceastã cheie este: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Decizia d-voastrã? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr ""
+"Doriþi într-adevãr sã setaþi aceastã cheie cu încredere supremã? (d/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certificatele ce conduc la o cheie cu încredere supremã:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Nu existã nici o indicaþie cã aceastã cheie aparþine într-adevãr "
+"utilizatorului numit\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Nu existã nici o indicaþie cã aceastã cheie aparþine într-adevãr "
+"utilizatorului numit\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Aceastã cheie aparþine probabil utilizatorului numit\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Aceastã cheie ne aparþine\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NU este sigur cã cheia aparþine persoanei numite în ID-ul\n"
+"utilizator.  Dacã ºtiþi *cu adevãrat* ce faceþi, puteþi\n"
+"rãspunde cu da la urmãtoarea întrebare.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Folosiþi oricum aceastã cheie? (d/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "AVERTISMENT: Folosiþi o cheie fãrã încredere!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"AVERTISMENT: aceastã cheie poate fi revocatã (cheia de revocare nu este "
+"prezentã)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "AVERTISMENT: Aceastã cheie a fost revocatã revocatorul desemnat!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "AVERTISMENT: Aceastã cheie a fost revocatã de proprietarul ei!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Aceasta ar putea însemna cã semnãtura e falsificatã.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "AVERTISMENT: Aceastã cheie a fost revocatã de proprietarul ei!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Notã: Aceastã cheie a fost deactivatã.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Notã: Aceastã cheie a expirat!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr ""
+"AVERTISMENT: Aceastã cheie nu este certificatã de o semnãturã de încredere!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Nu existã nici o indicaþie cã semnãtura aparþine proprietarului.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "AVERTISMENT: Noi NU avem încredere în aceastã cheie!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Semnãtura este probabil un FALS.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"AVERTISMENT: Aceastã cheie nu este certificatã cu suficiente semnãturi de "
+"încredere!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Nu este sigur cã semnãtura aparþine proprietarului.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: sãritã: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: sãritã: cheia publicã este deja prezentã\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Destinatari curenþi:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Introduceþi ID-ul utilizator.  Terminaþi cu o linie nouã: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Nu existã acest ID utilizator.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "sãritã: cheia publicã setatã deja ca destinatar implicit\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Cheia publicã este deactivatã.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "sãritã: cheia publicã setatã deja\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "destinatar implicit necunoscut \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: sãritã: cheia publicã este deactivatã\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "nici un destinatar valid\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "eroare la creearea `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Semnãturã detaºatã.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Vã rugãm introduceþi numele fiºierului de date: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "citesc stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "nici o datã semnatã\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "nu pot deschide date semnate `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "destinator anonim; încerc cheia secretã %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "OK, noi suntem destinatarul anonim.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "vechea encodare a lui DEK nu este suportatã\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "algoritm cifrare %d%s este necunoscut sau deactivat\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+"AVERTISMENT: algoritm cifrare %s nu a fost gãsit în preferinþele "
+"destinatarului\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "NOTÃ: cheia secretã %s a expirat la %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "NOTÃ: cheia a fost revocatã"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet a eºuat: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "cheia %s nu are nici un ID utilizator\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Pentru a fi revocat de:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Aceasta este o cheie de revocare senzitivã)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Creaþi un certificat de revocare desemnat pentru aceastã cheie? (d/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Ieºire în armurã ASCII forþatã.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet a eºuat: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Certificat de revocare creat.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "nici o cheie de revocare gãsitã pentru \"%s\"\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "cheia secretã \"%s\" nu a fost gãsitã: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "nici o cheie publicã corespunzãtoare: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "cheia publicã nu se potriveºte cu cheia secretã!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Creaþi un certificat de revocare pentru aceastã cheie? (d/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "algoritm de protecþie necunoscut\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "NOTÃ: Aceastã cheie nu este protejatã!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Certificat de revocare creat.\n"
+"\n"
+"Vã rugãm mutaþi-l pe un medium pe care îl puteþi ascunde; dacã cineva pune\n"
+"mâna pe acest certificat l-ar putea folosi sã vã facã cheia inutilizabilã.\n"
+"Este indicat sã tipãriþi acest certificat ºi sã-l pãstraþi undeva sigur, în\n"
+"caz cã mediumul este deteriorat.  Dar fiþi atent: sistemul de tipãrire al\n"
+"maºinii d-voastrã ar putea pãstra datele ºi sã le facã accesibile altora!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Vã rugãm selectaþi motivul pentru revocare:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Renunþã"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Probabil doriþi sã selectaþi %d aici)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Introduceþi o descriere opþionalã; terminaþi cu o linie goalã:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Motiv pentru revocare: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Nici o descriere datã)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Este aceasta OK? (d/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "pãrþi ale cheii secrete nu sunt disponibile\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "algoritm de protecþie %d%s nu este suportat\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "algoritm rezumat %d nu este suportat\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Frazã-parolã invalidã; vã rugãm mai încercaþi o datã"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"AVERTISMENT: Cheie slabã detectatã - vã rugãm schimbaþi din nou fraza-"
+"parolã.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "generez învechitul checksum de 16-bit pentru protecþia cheii secrete\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "cheie slabã creatã - reîncerc\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr "nu pot evita cheie slabã pentru cifru simetric; am încercat %d ori!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "AVERTISMENT: conflict pentru rezumat semnãturã în mesaj\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+"AVERTISMENT: subcheia de semnare %s nu este certificatã reciproc (cross-"
+"certified)\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"AVERTISMENT: subcheia de semnare %s are o certificare-reciprocã invalidã "
+"(invalid cross-certification)\n"
+
+#: g10/sig-check.c:181
+#, c-format
+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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"cheia %s a fost creatã %lu secundã în viitor (warp în timp sau probleme cu "
+"ceasul)\n"
+
+#: g10/sig-check.c:195
+#, 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 "
+"ceasul)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "NOTÃ: cheia semnãturii %s a expirat %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"presupun semnãturã incorectã din cheia %s datoritã unui bit critic "
+"necunoscut\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "cheia %s: nici o subcheie pentru semnãtura de revocare a subcheii\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "cheia %s: nici o subcheie pentru semnãtura legatã de subcheie\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "nu pot pune date notare în semnãturi v3 (stil PGP 2.x)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "nu pot pune date notare în semnãturi de chei v3 (stil PGP 2.x)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"AVERTISMENT: nu pot %%-expanda notarea (prea mare).  Folosesc neexpandat.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "nu pot pune un URL de politicã în semnãturi v3 (stil PGP 2.x)\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"nu pot pune un URL de politicã în semnãturi de chei v3 (stil PGP 2.x)\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"AVERTISMENT: nu pot %%-expanda URL-ul de politici (prea mare).  Îl folosesc "
+"neexpandat.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"AVERTISMENT: nu pot %%-expanda URL-ul serverului de chei (prea mare).  Îl "
+"folosesc neexpandat.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "verificarea semnãturii create a eºuat: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s semnãturã de la: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "puteþi semna-dataºat cu chei stil PGP 2.x numai în modul --pgp2\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"AVERTISMENT: forþarea algoritmului rezumat %s (%d) violeazã preferinþele "
+"destinatarului\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "semnare:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "puteþi semna-în-clar cu chei stil PGP 2.x în modul --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "va fi folositã cifrarea %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "cheia nu este marcatã ca sigurã - nu o pot folosi cu GNA falsificat!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "sãritã \"%s\": duplicatã\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "sãritã \"%s\": %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "sãritã: cheia secretã deja prezentã\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"aceasta este o cheie ElGamal generatã de PGP care nu e sigurã pentru "
+"semnãturi!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "înregistrare încredere %lu, tip %d: scrierea a eºuat: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Listã cu valori de încredere atribuite, creatã %s\n"
+"# (Folosiþi \"gpg --import-ownertrust\" pentru a le reface)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "eroare în `%s': %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "linie prea lungã"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "caracter : lipsã"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "amprentã invalidã"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "lipseºte valorea încrederii în proprietari (ownertrust)"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "eroare gãsire înregistrare încredere în `%s': %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "eroare citire în `%s': %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "trustdb: sincronizarea a eºuat: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "trustdb rec %lu: lseek a eºuat: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "trustdb rec %lu: scrierea a eºuat (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "tranzacþia trustdb prea mare\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "nu pot accesa `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: directorul nu existã!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "nu pot crea încuietoare (lock) pentru `%s'\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "nu pot încuia (lock) `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: am eºuat sã creez înregistrare versiune: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: a fost creat trustdb invalid\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: a fost creat trustdb\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "NOTÃ: nu poate fi scris în trustdb\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: trustdb invalid\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: am eºuat sã creez hashtable: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: eroare actualizare înregistrare versiune: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: eroare citire înregistrare versiune: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: eroare scriere înregistrare versiune: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "trustdb: lseek a eºuat: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "trustdb: citirea a eºuat (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: nu e un fiºier trustdb\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: înregistrare versiune cu recnum %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: versiune fiºier invalidã %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: eroare citire înregistrare liberã: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: eroare scriere înregistrare dir: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: eroare setere la zero a înregistrãrii: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: adãugarea unei înregistrãri a eºuat: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "trustdb este coruptã; rulaþi \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "nu pot mânui linii de text mai lungi de %d caractere\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "linii de intrare mai lungi de %d caractere\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' nu este un ID-cheie de lungime validã\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "cheia %s: acceptatã ca cheie de încredere\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "cheia %s apare de mai multe ori în trustdb\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "cheia %s: nici o cheie publicã pentru cheia de încredere - sãritã\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "cheia %s marcatã ca având încredere supremã\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "înregistrare încredere %lu, tip req %d: citirea a eºuat: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "înregistrare încredere %lu nu este de tipul cerut %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+"nu pot folosi model de încredere (%d) - presupun model de încredere %s\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "folosesc model de încredere %s\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "10 traducãtor vezi trustdb.c:uid_trust_string_fixed"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[revocatã]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[expiratã] "
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[necunoscutã]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[  nedef ]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[marginal]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[ deplinã]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[ supremã]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "nedefinitã"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "niciodatã"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "marginal"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "deplinã"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "supremã"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "nu e nevoie de o verificare trustdb\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "urmãtoarea verificare trustdb programatã pe %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "nu e nevoie de o verificare trustdb cu modelul de încredere `%s'\n"
+
+#: g10/trustdb.c:607
+#, c-format
+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"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "cheia publicã %s nu a fost gãsitã: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "vã rugãm faceþi un --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "verific trustdb\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d chei procesate (%d numãrãtori valide anulate)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "nu am gãsit nici o cheie cu încredere supremã\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+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"
+
+#: g10/trustdb.c:2197
+#, 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"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"adânc: %d  valid: %3d  semnat: %3d  încredere: %d-, %dq, %dn, %dm, %df, %du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"nu pot actualiza înregistrare versiunii trustdb: scrierea a eºuat: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"semnãtura nu a putut fi verificatã.\n"
+"Vã rugãm amintiþi-vã cã fiºierul de semnãturã (.sig sau .asc)\n"
+"ar trebui sã fie primul dat în linia de comandã.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "linia de intrare %u prea lungã sau lipseºte LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "eroare generalã"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "tip de pachet necunoscut"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "versiune necunoscutã"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "algoritm pubkey necunoscut"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "algoritm rezumat necunoscut"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "cheie publicã incorectã"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "cheie secretã incorectã"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "semnãturã incorectã"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "eroare checksum"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "frazã-parolã incorectã"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "cheia publicã nu a fost gãsitã"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "algoritm cifrare necunoscut"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "nu pot deschide inelul de chei"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "pachet invalid"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "armurã invalidã"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "nu existã acest id utilizator"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "cheia secretã nu e disponibilã"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "a fost folositã o cheie secretã greºitã"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "nu este suportat(ã)"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "cheie incorectã"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "eroare citire fiºier"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "eroare scriere fiºier"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "algoritm compresie necunoscut"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "eroare deschidere fiºier"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "eroare creare fiºier"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "frazã-parolã invalidã"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritm pubkey neimplementat"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "algoritm cifrare neimplementat"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "clasã semnãturi necunoscutã"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "eroare bazã de date încredere"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI incorect"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "limitã resurse"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "inel de chei invalid"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "certificat incorect"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "id utilizator anormal"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "eroare închidere fiºier"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "eroare redenumire fiºier"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "eroare ºtergere fiºier"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "date neaºteptate"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "conflict timestamp"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "algoritm pubkey nefolosibil"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "fiºierul existã"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "cheie slabã"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "argument invalid"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI incorect"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "URI nesuportat"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "eroare reþea"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "necifrat"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "neprocesat"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "cheie publicã de nefolosit"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "cheie secretã de nefolosit"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "eroare server de chei"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "anulatã"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "nici un card"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "nici o datã semnatã\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "EROARE: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "AVERTISMENT: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... acesta este un bug (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "aþi gãsit un bug ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "da"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "dD"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nu"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "terminã"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "tT"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "OK|OK"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "renunþã|renunþã"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "AVERTISMENT: este folositã memorie neprotejatã (insecure)!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "vedeþi http://www.gnupg.org/faq.html pentru informaþii suplimentare\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr ""
+"operaþia nu este posibilã fãrã memorie protejatã (secure) iniþializatã\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(aþi folosit probabil un program nepotrivit pentru aceastã sarcinã)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA necesitã folosirea unui algoritm cu hash de 160 biþi\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "vedeþi http://www.gnupg.org/why-not-idea.html pentru informaþii "
+#~ "suplimentare\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "un nume de notaþie trebuie sã conþinã numai caractere imprimabile sau "
+#~ "spaþii ºi sã se termine cu un '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "un nume de notaþie utilizator trebuie sã conþinã caracterul '@'\n"
+
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr ""
+#~ "un nume de notaþie trebuie sã nu conþinã mai mult de un caracter '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr ""
+#~ "o valoare de notaþie trebuie sã nu foloseascã nici un caracter de "
+#~ "control\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "AVERTISMENT: am gãsit date de notare invalide\n"
+
+#~ msgid "not human readable"
+#~ msgstr "ilizibil"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "citeºte opþiuni din fiºier"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "citeºte opþiuni din fiºier"
+
+#~ msgid "expired: %s)"
+#~ msgstr "expirat: %s)"
+
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "cheia %s: semnãturã expiratã de la cheia %s - sãritã\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "nu pot executa programul `%s': %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "ID-ul utilizator \"%s\" este deja revocat\n"
+
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "eroare la obþinerea numãrului serial: %s\n"
+
+#~ msgid "length of RSA modulus is not %d\n"
+#~ msgstr "lungimea modulului RSA nu este %d\n"
+
+#~ msgid "length of an RSA prime is not %d\n"
+#~ msgstr "lungimea unui prim RSA nu este %d\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "frazã=parolã greºitã sau algoritm cifrare necunoscut (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "nu pot seta pid-ul client pentru agent\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "nu pot convinge serverul sã citeascã FD pentru agent\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "nu pot convinge serverul sã scrie FD pentru agent\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "probleme de comunicare cu gpg-agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "frazã-parolã prea lungã\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "rãspuns invalid de la agent\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problemã cu agentul: agentul returneazã 0x%lx\n"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "algoritm rezumat `%s' este numai-citire în acestã ediþie\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "AVERTISMENT: rezumatul `%s' nu este parte din OpenPGP.  Folosiþi-l pe "
+#~ "riscul dvs.!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[fiºiere]|cifreazã fiºiere"
+
+#~ msgid "store only"
+#~ msgstr "doar pãstreazã"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[fiºiere]|decripteazã fiºiere"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "semneazã o cheie irevocabil"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "semneazã o cheie local ºi irevocabil"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "enumerã numai secvenþa de pachete"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "exportã valorile încrederii în proprietari"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "actualizare fãrã supraveghere a bazei de date de încredere"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "reparã o bazã de date de încredere coruptã"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Eliminã armura unui fiºier sau intrãrii standard (stdin)"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Pune armura unui fiºier sau intrãrii standard (stdin)"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NUME|foloseºte NUME ca destinatar implicit"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "foloseºte cheia implicitã ca destinatar implicit"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "nu folosi deloc terminalul"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "forþeazã semnãturi v3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "nu forþa semnãturi v3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "forþeazã semnãturi de chei v4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "nu forþa semnãturi de chei v4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "foloseºte întotdeauna un MDC pentru cifrare"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "nu folosi niciodatã un MDC pentru cifrare"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "foloseºte gpg-agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "modul batch: nu întreba niciodatã"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "presupune da la cele mai multe întrebãri"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "presupune nu la cele mai multe întrebãri"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "adaugã acest inel de chei la lista inelelor de chei"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "adaugã acest inel de chei secret la listã"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NUME|foloseºte NUME ca cheie secretã implicitã"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|HOST|foloseºte acest server de chei pentru a cãuta chei"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NUME|seteazã charset-ul pentru terminal ca NUME"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[fiºier]|scrie informaþii de stare în fiºier"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|IDCHEIE|ai încredere deplinã în aceastã cheie"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FIªIER|încarcã modulul extensie FIªIER"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emuleazã modul descris în RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "seteazã toate opþiunile pentru pachete, cifru ºi rezumat ca pentru "
+#~ "comportamentul OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "seteazã toate opþiunile pentru pachete, cifru ºi rezumat ca pentru "
+#~ "comportamentul PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|foloseºte modul frazã-parolã N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NUME|foloseºte algoritm rezumat mesaj NUME pentru fraza-parolã"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NUME|foloseºte algoritm cifrare NUME pentru fraza-parolã"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NUME|foloseºte algoritm cifrare NUME"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NUME|foloseºte algoritm rezumat mesaj NUME"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|foloseºte algoritm compresie N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "ignorã câmp keyid pentru pachete cifrate"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Aratã poze ID-uri"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Nu arãta poze ID-uri"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Seteazã linia de comandã pentru a vedea poze ID-uri"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "algoritm compresie `%s' este numai-citire în acestã ediþie\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "algoritm compresie trebuie sã fie în intervalul %d..%d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key id-utilizator"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key id-utilizator"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "nu pot deschide %s: %s\n"
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "cheia %08lX: cheia a fost revocatã!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "cheie %08lX: subcheia a fost revocatã!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: cheia a expirat\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Noi NU avem încredere în acestã cheie\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Nu este sigur dacã aceastã cheie aparþine într-adevãr\n"
+#~ "proprietarului, dar este oricum acceptatã\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "preferinþa %c%lu nu este validã\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (semnare ºi cifrare)\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Pe cale sã generaþi o nouã pereche de chei %s.\n"
+#~ "              lungimea minimã este  768 bits\n"
+#~ "           lungimea implicitã este 1024 bits\n"
+#~ " cea mai lungã cheie sugeratã este 2048 bits\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA permite numai chei de la 512 la 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "lungime cheie prea micã; 1024 este cea mai micã valoare permisã pentru "
+#~ "RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "lungime cheie prea micã; 768 este cea mai micã valoare permisã.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "lungime cheie prea mare; %d este cea mai mare valoare permisã.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Lungimi pentru chei mai mari de 2048 nu sunt sugerate\n"
+#~ "deoarece calculele iau FOARTE MULT timp!\n"
+
+#~ msgid "Are you sure that you want this keysize? "
+#~ msgstr "Sunteþi sigur(ã) cã doriþi aceastã lungime de cheie? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Bine, dar þineþi minte cã radiaþia monitorului ºi tastaturii d-voastrã "
+#~ "este de asemenea vulnerabilã la atacuri!\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: nu pot deschide: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: AVERTISMENT: fiºier gol\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "cheia %08lX: nu e o cheie rfc2440 - sãritã\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "NOTÃ: cheie primarã Elgamal detectatã - poate lua ceva timp pentru a "
+#~ "importa\n"
+
+#~ msgid " (default)"
+#~ msgstr "(implicit)"
+
+#~ msgid "q"
+#~ msgstr "t"
+
+#~ msgid "save"
+#~ msgstr "salveazã"
+
+#~ msgid "help"
+#~ msgstr "ajutor"
+
+#~ msgid "fpr"
+#~ msgstr "ampr"
+
+#~ msgid "list"
+#~ msgstr "enumerã"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "cheie"
+
+#~ msgid "select secondary key N"
+#~ msgstr "selecteazã cheie secundarã N"
+
+#~ msgid "check"
+#~ msgstr "verificã"
+
+#~ msgid "list signatures"
+#~ msgstr "enumerã semnãturi"
+
+#~ msgid "sign the key"
+#~ msgstr "semneazã cheia"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "semneazã cheia irevocabil"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "semneazã cheia local ºi irevocabil"
+
+#~ msgid "debug"
+#~ msgstr "depanare"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#~ msgid "add a secondary key"
+#~ msgstr "adaugã o cheie secundarã"
+
+#~ msgid "delkey"
+#~ msgstr "stecheie"
+
+#~ msgid "addrevoker"
+#~ msgstr "adarev"
+
+#~ msgid "delsig"
+#~ msgstr "stesem"
+
+#~ msgid "delete signatures"
+#~ msgstr "ºterge semnãturi"
+
+#~ msgid "primary"
+#~ msgstr "primar"
+
+#~ msgid "toggle"
+#~ msgstr "comuta"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#~ msgid "passwd"
+#~ msgstr "parola"
+
+#~ msgid "trust"
+#~ msgstr "încredere"
+
+#~ msgid "revsig"
+#~ msgstr "revsem"
+
+#~ msgid "revoke signatures"
+#~ msgstr "revocã semnãturi"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revoke a user ID"
+#~ msgstr "revocã un ID utilizator"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  creatã: %s expirã: %s"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! subcheia a fost revocatã: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- a fost gãsitã o revocare falsificatã\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? probleme la verificare revocãrii: %s\n"
+
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %08lX at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "semnatã local cu cheie d-voastrã %08lX pe %s\n"
+
+#~ msgid "   signed by %08lX at %s%s%s\n"
+#~ msgstr "   semnatã de %08lX pe %s%s%s\n"
+
+#~ 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"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "acest algoritm de cifrare este învechit; vã rugãm folosiþi unul "
+#~ "standard!\n"
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "nu pot obþine cheia de la serverul de chei: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "eroare trimitere la `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "succes trimitere la `%s' (stare=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "a eºuat trimiterea la `%s': stare=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "acest sercer de chei nu suportã --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "nu pot cãuta serverul de chei: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "cheie %08lX: aceasta este o cheie ElGamal generatã de PGP care NU este "
+#~ "sigurã pentru semnãturi!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "cheia %08lX a fost creatã %lu secundã în viitor (warp în timp sau "
+#~ "probleme cu ceasul)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "cheia %08lX a fost creatã %lu secunde în viitor (warp în timp sau "
+#~ "probleme cu ceasul)\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: nu pot accesa: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: nu pot crea încuietoare(lock)\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: nu pot crea încuietoare(lock)\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: nu pot crea: %s\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "cheia %08lX marcatã ca având încredere supremã\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "semnãturã de la cheia de semnare Elgamal %08lX la %08lX sãritã\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "semnãturã de la %08lX la cheia de semnare Elgamal %08lX sãritã\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "verificare la nivel %d semnat=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: nu pot crea director: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Dacã doriþi oricum sã folosiþi aceastã cheie revocatã, rãspundeþi \"da\"."
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Selectaþi algoritmul de folosit.\n"
+#~ "\n"
+#~ "DSA (sau DSS) este algoritmul de semnãturã digitalã care poate fi "
+#~ "folosit\n"
+#~ "doar pentru semnãturi.  Acesta este algoritmul sugerat pentru cã "
+#~ "verificarea\n"
+#~ "semnãturilor DSA este mult mai rapidã decât a celor ElGamal.\n"
+#~ "\n"
+#~ "ElGamal este un algoritm ce poate fi folosit pentru semnãturi ºi "
+#~ "cifrare.\n"
+#~ "OpenPGP face distincþie între cele douã variante ale acestui algoritm: "
+#~ "cel\n"
+#~ "numai pentru cifrare ºi cel pentru semnare+cifrare; algoritmul este "
+#~ "acelaºi\n"
+#~ "dar câþiva parametrii trebuie selectaþi într-un mod special pentru a "
+#~ "crea\n"
+#~ "o cheie sigurã pentru semnãturi: acest program face acest lucru, dar "
+#~ "alte\n"
+#~ "implementãri OpenPGP ar putea sã nu înþeleagã varianta de semnare"
+#~ "+cifrare.\n"
+#~ "\n"
+#~ "Prima cheie (primarã) trebuie sã fie întotdeauna capabilã de semnare;\n"
+#~ "acesta este motivul pentru care cheia ElGamal nu este disponibilã în\n"
+#~ "acest meniu."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Deºî aceste chei sunt definite în RFC2440 ele nu sunt sugerate pentru\n"
+#~ "cã nu sunt suportate de toate programele ºi semnãturile create cu ele\n"
+#~ "sunt destul de lungi ºi verificarea lor este foarte lentã."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu chei pânã acum verificate (%lu semnãturi)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "cheie incompletã\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "cheie %08lX incompletã\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "îmi pare rãu, nu pot face acest lucru în modul batch\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "nu pot deschide fiºierul: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "eroare: `:' lipsã\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "eroare: nici o valoare încredere pentru proprietar\n"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (semnare ºi cifrare)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "Folosirea acestui algoritm este suportatã numai de GnuPG.  Nu veþi putea\n"
+#~ "folosi aceastã cheie pentru a comunica cu alþi utilizatori PGP.  Mai "
+#~ "mult,\n"
+#~ "acest algoritm este foarte lent ºi ar putea fi mai puþin sigur decât\n"
+#~ "celelalte opþiuni.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Creaþi oricum? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "am detectat algoritm symkey invalid (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "acest server de chei nu este în totalitate compatibil cu HKP\n"
diff --git a/po/ru.gmo b/po/ru.gmo
new file mode 100644 (file)
index 0000000..5b943ea
Binary files /dev/null and b/po/ru.gmo differ
diff --git a/po/ru.po b/po/ru.po
new file mode 100644 (file)
index 0000000..95b1c0c
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,6310 @@
+# GnuPG Russian Translation
+# Copyright (C)2003 Free Software Foundation, Inc.
+# This file is distributed under the same license as the GnuPG package.
+# Maxim Britov <maxbritov@tut.by>, 2003.
+# Thanks a lot to Pawel I. Shajdo <zwon@e-mail.ru>.
+# Thanks to Golubev Eugeny (my CIO). He takes notebook for this translation.
+msgid ""
+msgstr ""
+"Project-Id-Version: GnuPG 1.4.2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-06-22 02:53+0200\n"
+"Last-Translator: Maxim Britov <maxbritov@tut.by>\n"
+"Language-Team: Russian <gnupg-ru@gnupg.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "не могу сгенерировать простое число с pbits=%u qbits=%u\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "не могу сгенерировать простое число меньше чем с %d битами\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "не найден модуль накопления энтропии\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "невозможно заблокировать `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "сохранение секретного ключа в `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "не могу открыть `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "не могу выполнить stat `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' не регулярный файл - проигнорирован\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "замечание: файл random_seed пуст\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "ВНИМАНИЕ: недопустимый размер файла random_seed - не использую\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "не могу прочитать `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "замечание: файл random_seed не обновлен\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "не могу создать `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "не могу записать `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "не могу закрыть `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "ВНИМАНИЕ: используется небезопасный генератор случайных чисел!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Генератор случайных чисел - это только заглушка для того,\n"
+"чтобы программа могла работать и он НЕ МОЖЕТ применяться\n"
+"для генерации надежных случайных чисел!\n"
+"\n"
+"НЕ ПОЛЬЗУЙТЕСЬ ДАННЫМИ СОЗДАННЫМИ ЭТОЙ ВЕРСИЕЙ ПРОГРАММЫ!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Программа собирает случайные данные. Это может занять некоторое время.\n"
+"Вы можете выполнять в это время какую-нибудь работу, это спасет от скуки\n"
+"и увеличит качество и скорость сбора случайных данных.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Недостаточно случайных чисел.  Выполняйте какие-либо действия для того,\n"
+"чтобы ОС могла получить больше случайных данных! (Необходимо ещё %d байт)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "сбой сохранения отпечатка: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "сбой сохранения даты создания: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "сбой при чтении ключа: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "ответ не содержит данных открытого ключа\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "в ответе отсутствует модуль RSA\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "в ответе отсутствует открытая экспонента RSA\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "PIN для CHV%d слишком короток, минимальная длина %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "при проверке CHV%d сбой: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "доступ к командам управления не настроен\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "ошибка получения статуса CHV с карты\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "карта заблокирована!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+"осталось %d попыток ввода административного PIN перед блокировкой карты\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Административный PID"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Новый административный PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Новый PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "ошибка при получении нового PIN: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "ошибка чтения данных приложения\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "ошибка чтения отпечатка DO\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "ключ уже существует\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "существующий ключ будет заменен\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "генерация нового ключа\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "пропущен штамп создания создания\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "Модули RSA пропущены или не имеют размер %d бит\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "отсутствует открытая экспонента RSA или превышает %d бит\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "Простое число RSA %s пропущено или не имеет размер %d бит\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "сбой сохранения ключа: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "пожалуйста, подождите, пока будет генерироваться ключ ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "сбой при генерации ключа\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "ключ сгенерирован (%d секунд)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "недопутимая структура OpenPGP карты (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s подпись, хэш-функция %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "подписей создано: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||Введите PIN%%0A[подписей: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+"проверка административного PIN в данный момент запрещен этой командой\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "нет доступа %s - неработоспособная карта OpenPGP?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "формат ASCII: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "неправильный заголовок ASCII: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "заголовок ASCII: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "неправильный заголовок прозрачной подписи\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "вложенные прозрачные подписи\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "неожиданный формат ASCII:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "неправильный отступ из минусов: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "недопустимый символ radix64 %02X пропущен\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "преждевременный конец файла (нет CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "преждевременный конец файла (в CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "поврежденный CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "ошибка CRC; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "преждевременный конец файла (в дополнении)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "ошибка в строке дополнения\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "не найдено данных формата OpenPGP.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "неправильный ASCII формат: строка длиннее %d символов\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"символы quoted printable в кодировке ASCII - вероятно использовался плохой "
+"MTA\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "Карта OpenPGP недоступна: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "Обнаружена карта OpenPGP номер %s \n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "невозможно сделать это в пакетном режиме\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Ваш выбор (?-подробнее)? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[не установлено]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "мужской"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "женский"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "не задан"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr ""
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Ошибка:Допустим только чистый ASCII.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Ошибка: Нельзя использовать символ \"<\"\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Ошибка: Двойные пробелы недопустимы.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Фамилия владельца карты:"
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Имя влдаельца карты:"
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Ошибка: Скомбинированное имя слишком длинное (предел %d символов).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "URL для получения открытого ключа: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Ошибка: URL слишком длинный (предел - %d символов).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "ошибка чтения `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Учетная запись (имя):"
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Ошибка: Данные учетной записи слишком длинные (предел %d символов).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Секретные DO данные:"
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Ошибка: Секретные DO данные слишком длинные (предел %d символов).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Предпочитаемый язык: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Ошибка: недопустимая длина строки предпочтений.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Ошибка: недопустимые символы в строке предпочтений.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Пол ((M)Мужской, (F)Женский или пробел): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Ошибка: недопустимый ответ.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "отпечаток CA: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Ошибка: неправильный формат отпечатка.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "операция с ключом невозможна: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "карта не OpenPGP"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "ошибка при считывании информации ключа: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Заменить существующий ключ? (y/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Заменить существующие ключи? (y/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Учтите, что заводские установки PIN кодов\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"Вы должны изменить их используя команду --change-pin\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Выберите тип создаваемого ключа:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) Ключ подписи\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Ключ шифрования\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Ключ аутентификации\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Неправильный выбор.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Выберите, где сохранить ключ:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "неизвестный алгоритм защиты ключа\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "секретные части ключа недоступны\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "секретный ключ уже сохранен в карте\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "выйти из этого меню"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "показать управляющие команды"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "показать данную справку"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "вывести все доступные данные"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "изменить имя владельца карты"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "изменить URL получения ключа"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "запросить ключ, указанный по заданному картой URL"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "изменить учетное имя"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "изменить языковые предпочтения"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "изменение пола владельца карты"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "сменить отпечаток CA"
+
+#: g10/card-util.c:1334
+#, fuzzy
+msgid "toggle the signature force PIN flag"
+msgstr "переключение флага force PIN"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "сгенерировать новые ключи"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "меню изменения или разблокировки PIN"
+
+#: g10/card-util.c:1337
+#, fuzzy
+msgid "verify the PIN and list all data"
+msgstr "проверить PIN  и показать все данные"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Команда> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Команды администратора\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Команды администрирования разрешены\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Команды администрирования не разрешены\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Недопустимая команда  (список команд: \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "секретный ключ не найден"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "Вставьте карту и нажмите Enter или введите 'c' для отмены: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "сбой при удалении блока ключа: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Извлеките текущую карту и вставьте карту с серийным номером:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Нажмите Enter, когда будете готовы или введите 'c' для отмены: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Введите новый Admin PIN: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Введите новый PIN: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Введите Admin PIN: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "Введите PIN: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Повторите ввод PIN: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "повторный ввод PIN некорректен; попробуйте еще раз"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "не могу открыть `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output не работает для данной команды\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "ключ \"%s\" не найден: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "ошибка чтения блока ключей: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(если только Вы не задали ключ отпечатком)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "не могу выполнить в пакетном режиме без \"--yes\"\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Удалить данный ключ из таблицы ключей? (y/N)"
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Это секретный ключ! - действительно удалить? (y/N)"
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "сбой при удалении блока ключа: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "информация о доверии владельцу очищена\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "имеется секретный ключ для открытого ключа \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "сначала используйте опцию \"--delete-secret-keys\".\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "ошибка при создании ключевой фразы (пароля): %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "не могу использовать симметричный пакет ESK в S2K режиме\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "используемый алгоритм шифрования %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' уже сжат\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "ВНИМАНИЕ: `%s' пустой файл\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "в режиме --pgp2 ключ RSA для ширования должен быть не более 2048 бит\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "читаю из `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "не могу использовать шифр IDEA для всех ключей.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"ВНИМАНИЕ: использование шифра %s (%d) противоречит предпочтениям получателя\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "ВНИМАНИЕ: сжатие алгоритмом %s (%d) нарушает предпочтения получателя\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "использование шифра %s (%d) противоречит предпочтениям получателя\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "Вы не можете использовать %s в режиме %s\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s зашифровано для: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "Данные зашифрованы алгоритмом %s\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "зашифровано неизвестным алгоритмом %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"ВНИМАНИЕ: сообщение было зашифровано слабым ключом симметричного шифра.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "проблема обработки зашифрованного пакета\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "удаленный запуск программы не поддерживается\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "не могу создать каталог `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr "вызов внешних программ отключен из-за небезопасных прав доступа\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"на данной платформе требуется использование временных файлов при вызове "
+"внешних программ\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "не могу запустить программу `%s': %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "не могу запустить оболочку `%s': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "ошибка системы при вызове внешней программы: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "ненормальное завершение внешней программы\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "не могу запустить внешнюю программу\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "не могу прочитать ответ внешней программы: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "ВНИМАНИЕ: не могу удалить временный файл (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "ВНИМАНИЕ: не могу удалить временный каталог `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "Подпись будет помечена как не отзываемая.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "ключи отзыва для \"%s\" не найдены\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "отзыв ключа или выбранных подключей"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "удаление неиспользуемых частей из ключа"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "экспорт секретных ключей не разрешен\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "ключ %s: не защищен - пропущен\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "ключ %s: стиля PGP 2.x - пропущен\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "ключ %s: подпись подключа в неправильном месте - пропущена\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "сбой сохранения ключа: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "ВНИМАНИЕ: секретный ключ %s не имеет простой контрольной суммы SK\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "ВНИМАНИЕ: нечего экспортировать\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Команды:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[file]|создать подпись к файлу"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[file]|создать прозрачную подпись к файлу"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "создать отделенную подпись"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "зашифровать данные"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "зашифровать только симметричным шифром"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "расшифровать данные (по умолчанию)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "проверить подпись"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "вывести список ключей"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "вывести список ключей и подписей"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "вывести и проверить подписи ключей"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "вывести список ключей и их отпечатков"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "вывести список секретных ключей"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "создать новую пару ключей"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "удалить ключи из таблицы открытых ключей"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "удалить ключи из таблицы закрытых ключей"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "подписать ключ"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "подписать ключ локально"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "подписать или редактировать ключ"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "создать сертификат отзыва"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "экспортировать ключи"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "экспортировать ключи на сервер ключей"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "импортировать ключи с сервера ключей"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "искать ключи на сервере ключей"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "обновить все ключи с сервера ключей"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "импортировать/объединить ключи"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "показать состояние карты"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "изменить данные на карте"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "сменить PIN карты"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "обновить таблицу доверий"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [files]|вывести хэши файлов"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Параметры:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "вывод в ASCII формате"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAME|зашифровать для получателя NAME"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "использовать данный User ID для подписывания и расшифрования"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|установить уровень сжатия N (по умолчанию - 0)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "использовать канонический текстовый режим"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "вывод в указанный файл"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "подробно"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "не делать никаких изменений"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "спросить перед перезаписью"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "строго следовать стандарту OpenPGP"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "создает сообщение совместимым с PGP 2.x"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(См. документацию для более полного ознакомления с командами и параметрами)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Примеры:\n"
+"\n"
+" -se -r Bob [файл]          подписать и зашифровать для получателя Bob\n"
+" --clearsign [файл]         создать прозрачную подпись\n"
+" --detach-sign [файл]       создать отделенную подпись\n"
+" --list-keys [имена]        показать ключи\n"
+" --fingerprint [имена]      показать отпечатки\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "О найденных ошибка сообщайте <gnupg-bugs@gnu.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Использование: gpg [параметры] [файлы] (-h для подсказки)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Синтаксис: gpg [параметры] [файлы]\n"
+"подписать и проверить, зашифровать или расшифровать\n"
+"операция по умолчанию зависит от входных данных\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Поддерживаются следующие алгоритмы:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "С открытым ключом: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Симметричные шифры: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Хэш-функции: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Алгоритмы сжатия: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "использование: gpg [опции] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "несовместимые команды\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "отсутствует знак = в определении группы `%s'\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "ВНИМАНИЕ: небезопасный владелец домашнего каталога `%s'\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "ВНИМАНИЕ: небезопасный владелец файла конфигурации `%s'\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "ВНИМАНИЕ: небезопасный владелец файла модуля расширения `%s'\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "ВНИМАНИЕ: небезопасные права доступа к домашнему каталогу `%s'\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "ВНИМАНИЕ: небезопасные права доступа к файлу конфигурации `%s'\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "ВНИМАНИЕ: небезопасные права доступа к файлу модуля расширения `%s'\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr ""
+"ВНИМАНИЕ: небезопасный владелец каталога содержащего домашний каталог `%s'\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr ""
+"ВНИМАНИЕ: небезопасный владелец каталога содержащего файл конфигурации `%s'\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr ""
+"ВНИМАНИЕ: небезопасный владелец каталога содержащего модуль расширения `%s'\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"ВНИМАНИЕ: небезопасные права доступа к каталогу содержащему домашний каталог "
+"`%s'\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"ВНИМАНИЕ: небезопасные права доступа к каталогу содержащему файл "
+"конфигурации `%s'\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"ВНИМАНИЕ: небезопасные права доступа к каталогу содержащему файл модуля "
+"расширения `%s'\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "неизвестный параметр в файле конфигурации `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Нет соответствующей подписи в связке секретных\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "заданный URL предпочитаемого сервера ключей неправилен\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "переключение между просмотром открытых и закрытых ключей"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Нет соответствующей подписи в связке секретных\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "ЗАМЕЧАНИЕ: старый файл конфигурации по умолчанию `%s' проигнорирован\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "ЗАМЕЧАНИЕ: файл конфигурации `%s' не обнаружен\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "файл конфигурации `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "параметры конфигурации взяты из файла `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "ЗАМЕЧАНИЕ: %s не предназначен для нормального применения!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"расширение шифра `%s' не загружено вследствие небезопасных прав доступа\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' недопустимый срок действия подписи\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' недопустимая таблица символов\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "не могу проанализировать URL сервера ключей\n"
+
+# test it
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: недопустимые параметры для сервера ключей\n"
+
+# test it
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "недопустимые параметры для сервера ключей\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: недопустимые параметры импорта\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "недопустимые параметры импорта\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: недопустимые параметры экспорта\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "недопустимые параметры экспорта\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: недопустимый список параметров\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "недопустимый список параметров\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "`%s' недопустимый срок действия подписи\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "заданный URL предпочитаемого сервера ключей неправилен\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "`%s' недопустимый срок действия подписи\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+# test it
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: недопустимые параметры проверки \n"
+
+# test it
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "недопустимые параметры проверки\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "не могу определить путь запуска для %s\n"
+
+# test it
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: недопустимые параметры проверки \n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "ВНИМАНИЕ: возможно создание файла дампа памяти!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "ВНИМАНИЕ: %s заместит %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s не допускается использовать с %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s не имеет смысла совместно с %s!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "ПРЕДУПРЕЖДАЮ: %s недоступен в данной версии\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "не будет работать с небезопасной памятью из-за %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"можно сделать только отделенную или прозрачную подпись в режиме --pgp2\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "Вы не можете одновременно подписать и зашифровать в режиме --pgp2\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "Вы должны использовать файлы (а не каналы (pipe)) в режиме --pgp2.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "для зашифрования сообщения в режиме --pgp2 требуется шифр IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "выбран неверный алгоритм шифрования\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "выбрана неверная хэш-функция\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "выбран неверный алгоритм сжатия\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "выбрана неверная хэш-функция для сертификации\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed должен быть больше 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed должен быть больше 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth должен быть в диапазоне от 1 до 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "недопустимый default-cert-level; должен быть 0, 1, 2 или 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "недопустимый min-cert-level; должен быть 0, 1, 2 или 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "ЗАМЕЧАНИЕ: простой режим S2K (0) строго не рекомендуется\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "недопустимый режим S2K; должно быть 0, 1 или 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "недопустимые предпочтения по умолчанию\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "недопустимые персональные предпочтения шифра\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "недопустимые персональные предпочтения хэш-функции\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "недопустимые персональные предпочтения алгоритмов сжатия\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s пока не работает совместно с %s!\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "Вы не можете использовать шифрование `%s' в режиме %s\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "Вы не можете использовать хэш-функцию `%s' в режиме %s\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "Вы не можете использовать сжатие `%s' в режиме %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "сбой инициализации таблицы доверий: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"ВНИМАНИЕ: получатели (-r) заданы без использования шифрования с открытым "
+"ключом\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [filename]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [filename]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "симметричное шифрование `%s' не удалось: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [filename]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [имяфайла]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "нельзя использовать --symmetric --encrypt совместно с --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "невозможно использовать --symmetric --encrypt в режиме %s\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [filename]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [filename]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [имяфайла]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+"нельзя использовать --symmetric --sign --encrypt совместно с --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "невозможно использовать --symmetric --sign --encrypt в режиме %s\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [filename]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [filename]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [filename]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key user-id"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key user-id"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key user-id [commands]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [user-id] [keyring]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "сбой при отправке на сервер ключей: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "сбой при получении с сервера ключей: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "сбой при экспорте ключа: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "сбой при поиске на сервере ключей: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "сбой при обновлении с сервера ключей: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "ошибка преобразования из ASCII формата: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "ошибка преобразования в ASCII формат: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "недопустимая хэш-функция `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[filename]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Набирайте Ваше сообщение ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "заданный URL политики сертификации неверен\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "заданный URL политики подписи неверен\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "заданный URL предпочитаемого сервера ключей неправилен\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "слишком много входов в pk кэше - отключено\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[User ID не найден]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Дефектный ключ %s признан пригодным согласно параметра --allow-non-"
+"selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "нет секретного подключа для открытого подключа %s - игнорируем\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "использую подклключ %s вместо главного ключа %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "ключ %s: секретный ключ без открытого ключа - пропущен\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "уменьшить количество выводимой информации"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "используются ключи из этой таблицы ключей"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "при несоответствии отметки времени - только предупреждением"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|выводить инфромацию в файл с дескриптором FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Использовать: gpgv [параметры] [файлы] (-h для подсказки)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Синтаксис: gpg [параметры] [файлы]\n"
+"Проверка подписей сделанных доверяемыми ключами\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Вы должны ввести здесь значение; оно никогда не будет экспортировано\n"
+"третьей стороне.  Это необходимо для реализации сети доверия web-of-trust;\n"
+" и не имеет ничего общего с (неявно созданной) сетью сертификатов."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Для построения Сети Доверия, GnuPG должен знать, к каким ключам\n"
+"имеется абсолютное доверие - обычно это ключи для которых у Вас есть\n"
+"секретный ключ.  Ответьте \"yes\" для присвоения абсолютного доверия\n"
+"данному ключу\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Если Вы хотите использовать данный недоверяемый ключ - ответьте \"yes\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Введите User ID адресата, которому Вы хотите отправить сообщение."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Выберите алгоритм.\n"
+"\n"
+"DSA (aka DSS) - Digital Signature Algorithm может использоваться\n"
+"только для подписей.\n"
+"\n"
+"Elgamal - алгоритм используемый только для шифрования.\n"
+"\n"
+"RSA может использоваться и для подписи, и для шифрования.\n"
+"\n"
+"Первый (главный) ключ всегда должен быть подписывающим."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Обычно не рекомендуется использовать один ключ для подписи и шифрования\n"
+"Данный алгоритм может использоваться только в некоторых случаях.\n"
+"Проконсультируйтесь с Вашим экспертом по безопасности перед тем,\n"
+"как использовать данный ключ."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Введите размер ключа"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Ответьте \"yes\" или \"no\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Введите требуемое значение, как показано в подсказке.\n"
+"Можно ввести дату в ISO формате (YYYY-MM-DD), но Вы не получите\n"
+"уведомление при ошибке в формате - вместо этого система попробует\n"
+"интерпретировать введенное Вами значение как интервал."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Введите имя владельца ключа"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "введите необязательный, но очень рекомендуемый email адрес"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Введите необязательный комментарий"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  изменить имя.\n"
+"C  изменить комментарий.\n"
+"E  изменить email адрес.\n"
+"O  продолжить создание ключа.\n"
+"Q  выйти и прервать создание ключа."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Ответьте \"yes\" (или только \"y\"), если Вы готовы создавать подключ."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Когда Вы подписываете User ID ключа, Вы должны сначала удостовериться, что\n"
+"ключ принадлежит человеку указанному в User ID.  Это нужно для тех,\n"
+"кто знает как хорошо Вы проверяете достоверность User ID.\n"
+"\n"
+"\"0\" означает, что Вы не можете сказать, как хорошо Вы проверили ключ.\n"
+"\"1\" означает, что Вы полагаете, что ключ принадлежит человеку, который\n"
+"    указан в нем, но Вы не могли или не проводили проверку ключа совсем.\n"
+"    Это полезно, когда Вы подписываете ключ с псевдонимом человека.\n"
+"\n"
+"\"2\" означает, что Вы делали неаккуратную проверку ключа.  Например, это "
+"может\n"
+"    означать, что Вы проверили отпечаток ключа и проверили User ID на\n"
+"    ключе на основании фото ID.\n"
+"\n"
+"\"3\" означает, что Вы выполнили всестороннюю проверку ключа.  Например, это "
+"может\n"
+"    означать, что Вы сверили отпечаток ключа с владельцем ключа лично\n"
+"    и что Вы сверили всё посредством трудноподделываемого документа с\n"
+"    фотографией (таким как паспорт), что имя владельца ключа совпадает с\n"
+"    именем в User ID ключа и наконец, что Вы проверили (обменом\n"
+"    письмами), что email адрес на ключе принадлежит владельцу ключа.\n"
+"\n"
+"Учтите, что примеры данные для уровней 2 и 3 - только примеры.\n"
+"В конечном итоге, Вам решать, как классифицировать \"неаккуратно\" и "
+"\"всесторонне\",\n"
+"при подписывании чужих ключей.\n"
+"\n"
+"Если Вы не можете определиться с правильным ответом, ответьте \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Ответьте \"yes\", если Вы хотите подписать ВСЕ User ID"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Ответьте \"yes\", если Вы действительно хотите удалить данный User ID.\n"
+"Все сертификаты также будут потеряны!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Ответьте \"yes\", если Вы готовы удалить подключ"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Это действительная подпись на ключе; обычно не желательно\n"
+"удалять такие подписи, потому, что она может быть важна для установления\n"
+"достоверности ключа или других ключей подписанных данным ключом."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Данная подпись не может быть проверена потому, что Вы не имеете\n"
+"соответствующего ключа.  Вы можете отложить ее удаление, пока Вы не\n"
+"узнаете, какой ключ был использован, т.к. эта подпись может\n"
+"устанавливать достоверность через другие уже удостоверенные ключи."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Подпись недействительна.  Это дает основания удалить ее из\n"
+"Вашей связки ключей."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Данная подпись является самоподписью и привязывает User ID к ключу.\n"
+"Обычно плохая идея удалять такую подпись.  На самом деле\n"
+"GnuPG может не позволить использовать такой ключ далее.\n"
+"Делайте это только если данная самоподпись не действительна по\n"
+"каким-то причинам и существует доступная вторая."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Изменение предпочтений для всех User ID (или только для выбранных)\n"
+"на текущий список предпочтений.  Отметка времени на всех затронутых\n"
+"самоподписях будет увеличена на одну секунду\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Введите парольную фразу (это секретная строка) \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Повторите парольную фразу, чтобы убедиться в том, что она набрана правильно."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Введите имя файла, к которому относится данная подпись"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Ответьте \"yes\", если Вы хотите перезаписать файл"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Введите новое имя файла. Если Вы нажмете только RETURN будет использован\n"
+"по умолчанию тот файл, который показан в квадратных скобках."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Вы можете указать причину отзыва ключа.  Основываясь на \n"
+"контексте Вы можете выбрать один из следующих вариантов:\n"
+"  \"Ключ был скомпрометирован\"\n"
+"      Выберите, если Вы полагаете, что посторонний человек\n"
+"      получил доступ к Вашему секретному ключу.\n"
+"  \"Ключ заменен другим\"\n"
+"      Выберите, если Вы заменили данный ключ на другой.\n"
+"  \"Ключ больше не используется\"\n"
+"      Выберите, если Вы отказались от использования данного ключа.\n"
+"  \"User ID больше не действителен\"\n"
+"      Выберите, если Вы больше не используете данный User ID.\n"
+"      Обычно используется, для указания, что данный e-mail больше\n"
+"      не используется\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Если хотите, Вы можете ввести здесь текст с указанием\n"
+"причины создания сертификата отзыва.  Будьте кратки.\n"
+"Для завершения введите пустую строку.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Нет доступной справки"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Нет справки для `%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "обновить таблицу доверий"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "открытый ключ не соотвествует секретному!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "удаление неиспользуемых частей из ключа"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "пропущен блок типа %d\n"
+
+# test it
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu ключей обработано\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Всего обработано: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "        пропущено новых ключей: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "                   без User ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                 импортировано: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                  неизмененных: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "                 новых User ID: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "               новых подключей: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "                новых подписей: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "          новых отзывов ключей: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "    прочитано секретных ключей: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "импортировано секретных ключей: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr " неизменённых секретных ключей: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "              не импортировано: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "    подписей очищено: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      очищено User ID: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "ВНИМАНИЕ: ключ %s содержит недопустимые предпочтения\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "алгоритмы для этих User ID:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": предпочитает шифр %s\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": предпочитает хеш-функцию %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         \"%s\": предпочитает сжатие %s\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "крайне желательно, чтобы Вы обновили Ваши предпочтения и\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"распространили этот ключ, чтобы избежать потенциальных проблем несовпадения "
+"алгоритмов\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+"Вы можете обновить список предпочтений используя:\n"
+"\tgpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "ключ %s: не имеет User ID\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "ключ %s: PKS повреждение ключа исправлено\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "ключ %s: принят без самоподписанного User ID \"%s\"\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "ключ %s: нет действительных User ID\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "причиной этого может быть отсутствие самоподписи\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "ключ %s: не найден открытый ключ: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "ключ %s: новый ключ - пропущен\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "нет доступной для записи таблицы ключей: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "сохраняю в `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "ошибка записи таблицы ключей `%s': %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "ключ %s: открытый ключ \"%s\" импортирован\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "ключ %s: не совпадает с копией хранимой у нас\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "ключ %s: не нахожу оригинальный блок ключей: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "ключ %s: не могу прочитать оригинальный блок ключей: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "ключ %s: \"%s\" 1 новый User ID\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "ключ %s: \"%s\" %d новых User ID\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "ключ %s: \"%s\" 1 новая подпись\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "ключ %s: \"%s\" %d новых подписей\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "ключ %s: \"%s\" 1 новый подключ\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "ключ %s: \"%s\" %d новых подключей\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "ключ %s: \"%s\" %d подпись очищена\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "ключ %s: \"%s\" %d очищеных подписей\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "ключ %s: \"%s\" %d User ID очищен\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "ключ %s: \"%s\" %d  очищенных User ID\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "ключ %s: \"%s\" не изменен\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "ключ %s: секретный ключ с недопустимым шифром %d - пропущен\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "импортирование секретного ключа не позволено\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "нет основной таблицы секретных ключей: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "ключ %s: секретный ключ импортирован\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "ключ %s: уже есть в таблице секретных ключей\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "ключ %s: не найден секретный ключ: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "ключ %s: нет открытого ключа - не могу применить сертификат отзыва\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "ключ %s: неправильный сертификат отзыва: %s - отвергнут\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "ключ %s: \"%s\" сертификат отзыва импортирован\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "ключ %s: нет User ID для подписи\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"ключ %s: неподдерживаемый алгоритм с открытым ключом у User ID \"%s\" \n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "ключ %s: неправильная самоподпись на User ID \"%s\"\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "ключ %s: нет подключа для связывания подключей\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "ключ %s: неподдерживаемый алгоритм с открытым ключом\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "ключ %s: неправильная связь подключей\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "ключ %s: удалено многократное связывание подключей\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "ключ %s: нет подключа для отзывающего ключа\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "ключ %s: неправильный отзыв подключа\n"
+
+# test it
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "ключ %s: удалена многожественность подключей отзыва\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "ключ %s: пропущен User ID \"%s\"\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "ключ %s: пропущен подключ\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "ключ %s: не экспортируемая подпись (класс 0x%02X) - пропущена\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "ключ %s: сертификат отзыва в неправильном месте - пропущен\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "ключ %s: неправильный сертификат отзыва: %s - пропущен\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "ключ %s: подпись подключа в неправильном месте - пропущена\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "ключ %s: неизвестный класс подписи (0x%02X) - пропущена\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "ключ %s: обнаружено дублирование User ID - объединены\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "ВНИМАНИЕ: ключ %s возможно отозван: запрашиваю ключ отзыва %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "ВНИМАНИЕ: ключ %s возможно отозван: ключ отзыва %s не получен.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "ключ %s: \"%s\" добавлен сертификат отзыва\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "ключ %s: direct key signature добавлена\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "ПРЕДУПРЕЖДАЮ: S/N ключа не соответствует S/N ключа на карте\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "ПРЕДУПРЕЖДАЮ: главный ключ готов и сохранен в карте\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "ПРЕДУПРЕЖДАЮ: вторичный ключ готов и сохранен в карте\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "ошибка создания таблицы ключей `%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "создана таблица ключей `%s'\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr ""
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "сбой перестройки кэша таблицы ключей: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[отозван]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[самоподпись]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 плохая подпись\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d плохих подписей\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 подпись не проверена за отсутствием ключа\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d подписей не проверено за отсутствием ключей\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 подпись не проверена из-за ошибки\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d подписей не проверено из-за ошибок\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "обнаружен 1 User ID без действительной самоподписи\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "обнаружено %d User ID без действительной самоподписи\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Укажите насколько Вы доверяете данному пользователю в\n"
+"вопросах проверки достоверности ключей других пользователей.\n"
+"Проверяет паспорт, сверяет отпечатки ключей и т.п.?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Доверяю ограниченно\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Полностью доверяю\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+
+# check it
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+"Введите домен, ограничивающий использование данной подписи, или пустую "
+"строку, если нет ограничений.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "User ID \"%s\" отозван."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Вы уверены, что хотите это подписать? (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Не могу подписать.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "User ID \"%s\" просрочен."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "User ID \"%s\" без самоподписи."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "User ID \"%s\"  подписываем."
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "Действительно подписать? (y/N)"
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Самоподпись у \"%s\"\n"
+"это подпись PGP 2.x -стиля.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Вы хотите сделать это OpenPGP самоподписью? (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Ваша текущая подпись на  \"%s\"\n"
+"просрочена.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Вы хотите сделать новую подпись для замены просроченной? (y/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Ваша текущая подпись на \"%s\"\n"
+"является локальной.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Вы хотите сделать это полностью экспортируемой подписью? (y/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" уже локально подписан ключом %s\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" уже подписан ключом %s\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Вы действительно хотите снова подписать это? (y/N)"
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Нечего подписывать ключом %s\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Данный ключ просрочен!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Срок действительности данного ключа истекает %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+"Вы хотите, чтобы Ваша подпись была действительна до того же времени?(Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Вы не можете сделать OpenPGP подпись на PGP 2.x ключе в режиме --pgp2.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Это сделает ключ несовместимым с PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Как хорошо Вы проверили то, что ключ действительно принадлежит человеку,\n"
+"чье имя указано в User ID ключа?\n"
+"  Если Вы не знаете что ответить, введите \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Не буду отвечать.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Я не проверял совсем.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Я проверил частично.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Я проверил очень тщательно.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Ваше решение? (введите '?' для получения информации)"
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Вы уверены, что хотите подписать этот ключ\n"
+"своим ключом: \"%s\" (%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Это будет самоподпись.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "ВНИМАНИЕ: подпись не будет помечена как не экспортируемая.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "ВНИМАНИЕ: подпись не будет помечена как не отзываемая.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "Подпись будет помечена как не экспортируемая.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "Подпись будет помечена как не отзываемая.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "Я совсем не проверял этот ключ.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "Я проверил этот ключ только частично.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "Я очень тщательно проверил этот ключ.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Действительно подписать? (y/N)"
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "не удалось подписать: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Данный ключ не защищен.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Секретная часть главного ключа отсутствует.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Секретная часть главного ключа сохранена на карте.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Ключ защищен.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Не могу редактировать данный ключ: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Введите новый пароль для данного секретного ключа.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "повторный ввод пароля некорректен; попробуйте еще раз"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Вы не хотите задать пароль? Это очень ПЛОХАЯ идея!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Вы действительно хотите сделать это? (y/N)"
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "перемещение подписи ключа в правильное место\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "сохранить и выйти"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "показать отпечаток ключа"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "вывести список ключей и User ID"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "выбрать User ID N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "выбрать подключ N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "проверка подписей"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "подписать выбранные User ID [* описание соотв. команд см. ниже]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "локально подписать выбранные User ID"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "подписать выбранные User ID - trust подписью"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "подписать выбранные User ID без возможности отзыва"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "добавить User ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "добавить фото ID"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "удалить выбранные User ID"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "добавить подключ"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "добавить ключ на карту"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "переместить ключ на карту"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "удалить выбранные подключи"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "добавить ключ отзыва"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "удалить подписи у выбранных User ID"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "сменить срок действительности ключа или выбранных подключей"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "пометить выбранные User ID как главные"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "переключение между просмотром открытых и закрытых ключей"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "список предпочтений (экспертам)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "список предпочтений (подробный)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "установить список предпочтений для выбранных User ID"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "установить URL предпочитаемого сервера ключей для выбранных User ID"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "установить список предпочтений для выбранных User ID"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "сменить пароль"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "изменить уровень доверия владельцу"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "отозвать подписи у выбранных User ID"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "отзыв выбранных User ID"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "отзыв ключа или выбранных подключей"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "включить ключ"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "отключить ключ"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "показать выбранные фото ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "ошибка чтения секретного блока ключа \"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Секретный ключ доступен.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Для данного действия нужен секретный ключ.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Сначала воспользуйтесь командой \"toggle\".\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* Команда `sign' может быть дополнена префиксом: `l' - локально подписать "
+"lsign),\n"
+"  `t' - trust подпись (tsign), `nr' - без возможности отзыва\n"
+"  (nrsign) или любым их сочетанием (ltsign, tnrsign и т.д.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Ключ отозван."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Вы действительно хотите подписать ВСЕ User ID? (y/N)"
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Подсказка: Выберите User IDs для подписи\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "неизвестный тип подписи `%s'\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Данная команда не допустима в режиме %s.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Вы должны выбрать хотя бы один User ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Вы не можете удалить последний User ID!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Вы действительно хотите удалить ВСЕ выбранные User IDs? (y/N)"
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Вы действительно хотите удалить данный User ID? (y/N)"
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Действительно удалить главный ключ? (y/N)"
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Вы должны выбрать хотя бы один ключ.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "Команда ожидает аргумент - имя файла\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "Не могу открыть `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr ""
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Вы должны выбрать хотя бы один ключ.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Вы действительно хотите удалить выбранные ключи? (y/N)"
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Вы действительно хотите удалить данный ключ? (y/N)"
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Действительно отозвать ВСЕ выбранные User ID? (y/N)"
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Действительно отозвать данный User ID? (y/N)"
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Вы действительно хотите отозвать ключ целиком? (y/N)"
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Вы действительно хотите отозвать выбранные подключи? (y/N)"
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Вы действительно хотите отозвать данный подключ? (y/N)"
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"Невозможно присвоить степень доверия пока используется указанная "
+"пользователем таблица доверий\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "установить предпочтения в:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Действительно обновить предпочтения для выбранных User ID? (y/N)"
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Действительно обновить предпочтения? (y/N)"
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Сохранить изменения? (y/N)"
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Выйти без сохранения? (y/N)"
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "сбой при обновлении: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "сбой при обновлений секретного ключа: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "ключ не изменялся - обновление не нужно.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Хэш-функции: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Опции: "
+
+# check it
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Предпочитаемый сервер ключей: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"Параметры:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Не может быть предпочтений в PGP 2.x-стиле User ID.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Данный ключ был отозван %s - %s ключом %s\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Данный ключ может быть отозван %s ключом %s "
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr ""
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "создан: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "отозван: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "просрочен с: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "годен до: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "применяемость: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "доверие: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "достоверность: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Данный ключ отключен"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Учтите, что показанные степени достоверности могут быть неверными,\n"
+"пока Вы не перезапустите программу.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "отозван"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "просрочен с"
+
+# check it
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"ВНИМАНИЕ: нет User ID помеченного как главный.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"ВНИМАНИЕ: Это ключ PGP2.  Добавление фото ID может в некоторых версиях\n"
+"         PGP вызвать выбраковку ключа.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Вы уверены, что хотите добавить это? (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Вы не можете добавить фото ID в ключ PGP2-типа.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Удалить данную действительную подпись? (y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Удалить данную недействительную подпись? (y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Удалить данную неизвестную подпись? (y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Действительно удалить данную самоподпись? (y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Удалена %d подпись.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Удалено %d подписи.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Ничего не удалено.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "недопустимый"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "User ID \"%s\" уже очищен\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "ключ %s: \"%s\" %d подпись очищена\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "ключ %s: \"%s\" %d очищеных подписей\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "User ID \"%s\" уже очищен\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "User ID \"%s\" уже очищен\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"ВНИМАНИЕ: Это ключ PGP 2.x. Добавление назначенного отзывающим ключа\n"
+"          может в некоторых версиях PGP вызвать выбраковку ключа.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Вы не можете добавить назначенный отзывающим ключ в PGP 2.x ключ.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Укажите User ID ключа, назначенного отзывающим: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "нельзя назначить ключ PGP 2.x отзывающим\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "ключ не может быть назначен отзывающим сам себя\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "этот ключ уже назначен отзывающим\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "ВНИМАНИЕ: назначение ключа отзывающим невозможно будет отменить!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Вы уверены, что хотите назначить данный ключ отзывающим? (y/N)"
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Снимите выделение с секретного ключа.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Выделите не менее одного подключа.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Смена срока действительности подключа.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Смена срока действия главного ключа\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Вы не можете изменить срок действия v3 ключа\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Нет соответствующей подписи в связке секретных\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr ""
+"ВНИМАНИЕ: подписываемый подключ %s не имеет перекрестной сертификации\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Выберите только один User ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "пропуск v3 самоподписи на User ID \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Введите URL предпочтаемого сервера ключей: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Вы действительно хотите заменить его? (y/N)"
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Вы действительно хотите удалить его? (y/N)"
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Примечание к подписи"
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Перезаписать (y/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Нет User ID с индексом %d\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Нет User ID с хешем %s\n"
+
+# c-format
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "Нет подключа с индексом %d\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "User ID: \"%s\"\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "подписано Вашим ключом %s от %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (не экспортируемая)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Срок действительности подписи закончился %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Вы уверены, что хотите отозвать? (y/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Создать сертификат отзыва для данной подписи? (y/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Вы подписали данные User ID на ключе %s:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (не отзываемая)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "отзыв Вашим ключом %s от %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Вы отзываете следующие подписи:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Действительно создать сертификат отзыва? (y/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "нет секретного ключа\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "User ID \"%s\" уже отозван\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "ВНИМАНИЕ: User ID подпись датирована %d секундами в будущем\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Ключ %s уже отозван\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Подключ %s уже отозван\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Показ %s фото ID размера %ld для ключа %s (uid %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "предпочтение `%s' дублируется\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "слишком много предпочтений для шифра\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "слишком много предпочтений для хэш-функций\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "слишком много предпочтений для методов сжатия\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "недопустимое вхождение `%s' в строке предпочтений\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "writing direct signature\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "сохраняем самоподпись\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "сохраняем объединяющую подпись\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "неверный размер ключа; используется %u бит\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "размер ключа приведен к %u битам\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr ""
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr ""
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "Возможные действия для ключа %s:"
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Допустимы действия:"
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) Переключить возможность использования для подписи\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Переключить возможность использования для шифрования\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Переключить возможность использования для аутентификации\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Завершено\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Выберите тип ключа:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA и ElGamal (по умолчанию)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (только для подписи)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (с требуемыми возможностями)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (только для шифрования)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (только для подписи)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (только для шифрования)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (с требуемыми возможностями)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Пара ключей DSA будет иметь длину %u бит.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "ключи %s могут иметь длину от %u до %u бит.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Какой размер ключа Вам необходим? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "размер ключей %s должен быть в пределах %u-%u\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Запрашиваемый размер ключа %u бит\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "округлен до %u бит\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Выберите срок действия ключа.\n"
+"         0 = без ограничения срока действительности\n"
+"      <n>  = срок действительности n дней\n"
+"      <n>w = срок действительности n недель\n"
+"      <n>m = срок действительности n месяцев\n"
+"      <n>y = срок действительности n лет\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Выберите срок действия подписи.\n"
+"         0 = подпись без ограничения срока действительности\n"
+"      <n>  = срок действительности подписи n дней\n"
+"      <n>w = срок действительности подписи n недель\n"
+"      <n>m = срок действительности подписи n месяцев\n"
+"      <n>y = срок действительности подписи n лет\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Ключ действителен до? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Подпись действительна до? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "недопустимое значение\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Ключ не имеет ограничения срока действительности\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "Подпись не имеет ограничения срока действительности\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Ключ действителен до: %s\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "Подпись действительна до %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Ваша система не может корректно отображать даты после 2038.\n"
+"Однако, корректно обрабатываются даты до 2106.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Все верно? (y/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Для идентификации Вашего ключа необходим User ID\n"
+"Программа создаст его из Вашего имени, комментария и адреса e-mail в виде:\n"
+"    \"Baba Yaga (pensioner) <yaga@deepforest.ru>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Ваше настоящее имя: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Недопустимый символ в Имени\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Имя не должно начинаться с цифры\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Имя не должно быть короче 5 символов\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "Email-адрес: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Неправильный e-mail адрес\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Комментарий: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Недопустимый символ в комментарии\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Используется таблица символов: `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Вы выбрали следующий User ID:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Не вставляйте email-адрес в имя пользователя или комментарий\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Сменить (N)Имя, (C)Комментарий, (E)email-адрес или (Q)Выход? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+"Сменить (N)Имя, (C)Комментарий, (E)email-адрес или (O)Принять/(Q)Выход? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Сначала исправьте ошибку\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Для защиты секретного ключа необходим пароль.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Необходимо сгенерировать много случайных чисел. Желательно, что бы Вы\n"
+"выполняли некоторые другие действия (печать на клавиатуре, движения мыши,\n"
+"обращения к дискам) в процессе генерации; это даст генератору\n"
+"случайных чисел возможность получить лучшую энтропию.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Создание ключа прервано.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "сохранение открытого ключа в `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "сохранение заглушки секретного ключа в `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "сохранение секретного ключа в `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "нет доступной для записи таблицы открытых ключей: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "нет доступной для записи таблицы закрытых ключей: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "ошибка записи таблицы открытых ключей `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "ошибка записи таблицы секретных ключей `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "открытый и закрытый ключи созданы и подписаны.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Учтите, что данный ключ не может использоваться для шифрования.  Вы можете\n"
+"воспользоваться командой \"--edit-key\" и создать подключ для этих целей.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Сбой при создании ключа: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"ключ был создан на %lu секунд в будущем (time warp или проблемы с часами)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"ключ был создан на %lu секунд в будущем (time warp или проблемы с часами)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"ПРЕДУПРЕЖДАЮ: создание подключа для ключей v3 не совместимо с OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Действительно создать? (y/N)"
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "сбой сохранения ключа на карту: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "не могу создать резервную копию, файл `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "ЗАМЕТЬТЕ: архивная копия ключа на карте сохранена в `%s'\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "неогранич "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Критические правила для подписи: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Политика подписи: "
+
+# check it
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Критическое примечание к подписи: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Примечание к подписи"
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Таблица ключей"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr " Отпечаток главного ключа:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "         Отпечаток подключа:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Отпечаток главного ключа:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "         Отпечаток подключа:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "Отпечаток ключа ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "при переименовании `%s' в `%s' произошел сбой: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "ВНИМАНИЕ: Существуют 2 файла с конфиденциальной информацией.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s осталось без изменений\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s новых\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Исправьте эту прореху безопасности\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "кеширую связки ключей `%s'\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu ключей закешировано за это время (%lu подписей)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu ключей закешированно (%lu подписей)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: таблица ключей создана\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Введите URL предпочтаемого сервера ключей: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"ВНИМАНИЕ: параметр сервера ключей `%s' не используется на данной платформе\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Введите число(а), N) Следующий или Q) Выход> "
+
+# test it
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "invalid keyserver protocol (us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "ключ \"%s\" не найден на сервере ключей\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "ключ не найден на сервере ключей\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "запрашиваю ключ %s с %s сервера %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "получение ключа %s с %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "поиск \"%s\" на %s сервере %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "поиск \"%s\" на %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "отправляю ключ %s на %s сервер %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "отправка ключа %s на %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "поиск \"%s\" на %s сервере %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "поиск \"%s\" на %s\n"
+
+# test it
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr ""
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "ВНИМАНИЕ: обработчик сервера ключей от другой версии GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "сервер ключей не прислал VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "не заданы серверы ключей (используйте --keyserver)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "Данная сборка не поддерживает внешние вызовы для сервера ключей.\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "нет обработчика для схемы сервера ключей `%s'\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "действие `%s' не поддерживается серверами ключей `%s'\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s не поддерживает версию обработчика %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "превышено время ожидания сервера ключей\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "ошибка сервера ключей\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "ошибка связи с сервером ключей: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "\"%s\" не идентификатор ключа: пропущен\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "ВНИМАНИЕ: невозможно обновить ключ %s с %s: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "обновление 1 ключа из %s\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "обновление %d ключей из %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "ВНИМАНИЕ: невозможно обновить ключ %s с %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "ВНИМАНИЕ: невозможно обновить ключ %s с %s: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "странный размер зашифрованного сеансового ключа (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "сеансовый ключ зашифрован %s \n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "пароль создан с незнакомой хеш-фкнкцией %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "открытый ключ %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "данные зашифрованы открытым ключом: правильный DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "зашифровано %u-битным ключом %s, с ID %s, созданным %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      \"%s\"\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "зашифровано ключом %s с ID %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "сбой расшифрования с открытым ключом: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "зашифровано с %lu паролями\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "зашифровано с 1 паролем\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "принятие %s зашифрованных данных\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "шифр IDEA недоступен, попробуйте использовать взамен %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "Расшифровано\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "ВНИМАНИЕ: целостность сообщения не защищена\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "ВНИМАНИЕ: зашифрованное сообщение было изменено!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "сбой расшифрования: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "ЗАМЕТЬТЕ: отправитель требует \"только для просмотра Вами\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "оригинальное имя файла='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "самостоятельный сертификат отзыва: \"gpg --import\" для применения\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Действительная подпись от \"%s\""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "проверка подписи подавлена\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "не могу обработать эти множественные подписи\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "Подпись сделана %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               ключом %s с ID %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Подпись создана %s ключом %s с ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Ключ доступен на:"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "ПЛОХАЯ подпись от  \"%s\""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Просроченная подпись от \"%s\""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "Действительная подпись от \"%s\""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[сомнительно]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                aka \"%s\""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Подпись просрочена %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Подпись действительна до %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s подпись, хэш-функция %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "двоичный"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "текстовый"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "неизвестно"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Не могу проверить подпись: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "не отделенная подпись\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"ВНИМАНИЕ: обнаружено множество подписей.  Только первая будет проверена.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "самостоятельная подпись класса 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "старый (PGP 2.x) стиль подписи\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "обнаружен недопустимый корневой пакет в proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "не могу отключить создание файла копии образа памяти: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr ""
+"ВНИМАНИЕ: используется экспериментальный алгоритм %s шифрования с открытым "
+"ключом\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr ""
+"ВНИМАНИЕ: используется экспериментальный алгоритм симметричного шифрования %"
+"s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "ВНИМАНИЕ: используется экспериментальная хеш-функция %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "ВНИМАНИЕ: хеш-функция %s считается устаревшей\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "модуль поддержки шифра IDEA не обнаружен\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "Для дополнительной информации см. http://www.gnupg.org/faq.html\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: не рекомендуемая опция \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "ВНИМАНИЕ: \"%s\" не рекомендуемая опция\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "используйте \"%s%s\" взамен\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr ""
+"ВНИМАНИЕ: команда \"%s\" является устаревшей - не следует применять ее\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Без сжатия"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr ""
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "данное сообщение может быть не пригодно для %s\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "двусмысленный параметр `%s'\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "неизвестный параметр `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Файл `%s' существует. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Перезаписать (y/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: неизвестное окончание\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Введите новое имя файла"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "Вывод в stdout\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "принятие подписанных данных в `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "создан новый файл настроек `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "ВНИМАНИЕ: параметры в `%s' еще не активны при этом запуске\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "создан каталог `%s'\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "не могу использовать алгоритм с открытым ключом %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"ВНИМАНИЕ: потенциально небезопасный сеансовый ключ, зашифрованный "
+"симметричным шифром\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "подпакет типа %d имеет выставленный критический бит\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent недоступен в данной сессии\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "неправильная переменная окружения GPG_AGENT_INFO\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "протокол gpg-agent версии %d не поддерживается\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "не могу подключиться к `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "проблема с агентом - использование агента отключено\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (главный ключ ID %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Необходим пароль для доступа к секретному ключу пользователя:\n"
+"\"%.*s\"\n"
+"%u-бит %s ключ, ID %s, создан %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Повторите пароль\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Введите пароль\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "прервано пользователем\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "не могу получить пароль в пакетном режиме\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Введите пароль: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr "Необходим пароль для доступа к секретному ключу пользователя: \"%s\"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-бит %s ключ, ID %s, создан %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (подключ на главном ключе %s)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Повторите пароль: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Выберите изображение для использования в качестве Вашего Фото ID.\n"
+"Изображение должно быть в формате JPEG. Помните, что оно будет храниться\n"
+"с Вашим открытым ключом и увеличит его размер, т.е. не следует брать очень\n"
+"большое изображение. Рекомендуемый размер около 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Введите имя JPEG файла для Фото ID: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "Не могу открыть JPEG файл `%s': %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "Этот JPEG очень велик (%d байт)!\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Вы действительно хотите использовать его? (y/N)"
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' - не JPEG файл\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Данное фото правильное (y/N/q)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "не могу отобразить Фото ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Без указания причины"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Ключ заменён другим"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Ключ был скомпрометирован"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Ключ больше не используется"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "User ID больше не действителен"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "причина отзыва: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "прокомментируйте отзыв: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "Не задано значение доверия для:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  aka \"%s\"\n"
+
+# test it
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"Насколько Вы уверены, что данный ключ принадлежит пользователю указанному в "
+"User ID ключа?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Не знаю или не буду отвечать\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Не доверяю\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Абсолютно доверяю\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr " m = вернуться в главное меню\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr " s = пропустить этот ключ\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr " q = выход\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"Минимальный уровень доверия данному ключу: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Ваше решение (?-подробнее)? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr ""
+"Вы действительно хотите установить АБСОЛЮТНОЕ доверие владельцу данного "
+"ключа? (y/N)"
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Сертификаты, приводящие к абсолютно доверяемому ключу:\n"
+
+# test it
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Нет свидетельств того, что данный ключ принадлежит пользователю "
+"указанному в User ID ключа\n"
+
+# test it
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Мало свидетельств того, что данный ключ принадлежит пользователю "
+"указанному в User ID ключа\n"
+
+# test it
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Этот ключ вероятно принадлежит названному владельцу\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Данный ключ принадлежит нам\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Нет уверенности в том, что ключ принадлежит человеку указанному\n"
+"в User ID ключа.  Если Вы ТОЧНО знаете, что Вы делаете,\n"
+"можете ответить на следующий вопрос утвердительно.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Все равно использовать данный ключ? (y/N)"
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "ВНИМАНИЕ: Использование недоверяемого ключа!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "ВНИМАНИЕ: возможно данный ключ отозван (ключ отзыва отсутвтует)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "ВНИМАНИЕ: Данный ключ отозван ключом назначенным отзывающим!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "ВНИМАНИЕ: Данный ключ отозван его владельцем!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Это может означать, что подпись поддельная.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "ВНИМАНИЕ: Данный подключ был отозван его владельцем!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Замечание: Данный ключ отключен.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Замечание: Данный ключ просрочен!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "ВНИМАНИЕ: Данный ключ не заверен доверенной подписью!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Нет указаний на то, что подпись принадлежит владельцу.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "ВНИМАНИЕ: НЕТ ДОВЕРИЯ данному ключу!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Возможно, что подпись ПОДДЕЛАНА.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"ВНИМАНИЕ: Этот ключ не заверен достаточным количеством доверяемых подписей!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Нет уверенности в том, что подпись принадлежит владельцу.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: пропущено: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: пропущено: открытый ключ уже существует\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Не задан User ID. (можете использовать \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Текущие получатели:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Введите User ID.  Пустая строка для завершения: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Нет такого User ID.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "пропущено: открытый ключ уже установлен для получателя по умолчанию\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Открытый ключ отключен.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "пропущено: открытый ключ уже установлен\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "неизвестный получатель по умолчанию \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: пропущено: открытый ключ отключен\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "нет действительных адресов\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "данные не сохранены; используйте \"--output\" для сохранения\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "ошибка создания `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Отделенная подпись.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Введите имя файла с данными: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "читаю stdin ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "не подписанные данные\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "не могу открыть подписанные данные `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "анонимный получатель; пробую секретный ключ %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "Отлично, мы анонимный получатель.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "старое шифрование DEK не поддерживается\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "алгоритм шифрования %d%s неизвестен или отключен\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr ""
+"ВНИМАНИЕ: алгоритм шифрования %s не найден в списке предпочтений получателя\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "ЗАМЕТЬТЕ: секретный ключ %s просрочен с %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "ЗАМЕТЬТЕ: ключ был отозван"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr ""
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "ключ %s не имеет User ID\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Будет отозван:\n"
+
+# check it
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Это - sensitive ключ отзыва)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Создать сертификат отзыва данного ключа? (y/N)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Для вывода использован ASCII формат.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr ""
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Сертификат отзыва создан.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "ключи отзыва для \"%s\" не найдены\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "секретный ключ \"%s\" не найден: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "нет соотвествующего открытого ключа: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "открытый ключ не соотвествует секретному!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Создать сертификат отзыва данного ключа? (y/N)"
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "неизвестный алгоритм защиты\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "ЗАМЕЧАНИЕ: Данный ключ не защищен!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Сертификат отзыва создан.\n"
+"\n"
+"Поместите его в скрытое место;  если посторонний получит доступ\n"
+"к данному сертификату, он может использовать его, чтобы сделать\n"
+"Ваш ключ непригодным к использованию. Можно распечатьтать данный\n"
+"сертификат и спрятать подальше,  на случай если Ваш основной\n"
+"носитель будет повреждён, но будьте осторожны: система печати\n"
+"Вашей машины может сохранить данные и сделать их доступными для других!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Укажите причину отзыва:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Отмена"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Возможно Вы хотите выбрать здесь %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Введите необязательное пояснение; закончите пустой строкой:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Причина отзыва: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Пояснения отсутствуют)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Все правильно? (y/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "секретная часть ключ не доступна\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "метод защиты %d%s не поддерживается\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "метод защиты %d не поддерживается\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Неверный пароль; попробуйте еще раз"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "ВНИМАНИЕ: обнаружен слабый ключ - смените пароль еще раз.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"создание нерекомендуемой 16-битной контрольной суммы для защиты ключа\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "создан слабый ключ - повторение\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"невозможно избежать слабого ключа для симметричного шифра; %d попыток!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "ВНИМАНИЕ: конфликт хэшей подписей в сообщении\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr ""
+"ВНИМАНИЕ: подписываемый подключ %s не имеет перекрестной сертификации\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"ВНИМАНИЕ: подписываемый подключ %s имеет недостоверную перекрестную "
+"сертификацию\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "открытый ключ %s на %lu секунд моложе подписи\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "открытый ключ %s на %lu секунд моложе подписи\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"ключ %s был создан на %lu секунд в будущем (time warp или проблемы с "
+"часами)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"ключ %s был создан на %lu секунд в будущем (time warp или проблемы с "
+"часами)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "ЗАМЕТЬТЕ: подписавший ключ %s - просрочен %s\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "принята плохая подпись ключа %s с неизвестным критическим битом\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "ключ %s: нет подключа для подключа отзывающей подписи\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "ключ %s: нет подключа для подписи связи подключей\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "невозможно добавить примечение в v3 (PGP 2.x стиля) подпись\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "невозможно добавить примечание в v3 (PGP 2.x стиля) подпись ключа\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"ВНИМАНИЕ: не могу развернуть %% запись (длинный). Использую неразвернутым.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "невозможно добавить URL правил в v3 (PGP 2.x стиля) подпись\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "нельзя ставить URL правил в v3 (PGP 2.x стиля) подписи\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"ВНИМАНИЕ: не могу развернуть %% url правил (длинный). Использую "
+"неразвернутым.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"ВНИМАНИЕ: невозможно развернуть %% URL предпочитаемого сервера ключей "
+"(слишком длинно). Использую неразвернутым.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "сбой проверки созданной подписи: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s подпись от: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "только отделенная подпись доступна с PGP 2.x ключом в режиме --pgp2\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"ВНИМАНИЕ: использование хэш-функции %s (%d) нарушает предпочтения "
+"получателя\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "подпись:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "только прозрачная подпись доступна с PGP 2.x ключом в режиме --pgp2\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "будет использовано %s шифрование\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"ключ не помечен как ненадежный - не могу использовать его с ненадёжным RNG!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "пропущено \"%s\": дубликат\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "пропущено \"%s\": %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "пропущено: секретный ключ уже имеется\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"это созданный PGP ElGamal ключ, не обеспечивающий безопасность подписи!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "запись о доверии %lu, тип %d: ошибка записи: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Список присвоенных значений доверия создан %s\n"
+"# (Используйте \"gpg --import-ownertrust\" для их восстановления)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "ошибка в `%s': %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "строка слишком длинная"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "пропущено двоеточие"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "неверный отпечаток"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "пропущено значение степени доверия владельцу"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "ошибка при поиске записи о доверии в `%s': %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "ошибка чтения в `%s': %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "trustdb транзакция слишком длинная\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "нет доступа к `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: каталог не существует!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "невозможно создать блокировку для `%s'\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "невозможно заблокировать `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: сбой создания записи о версии: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: создана недействительная таблица доверий\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: создана таблица доверий\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "ЗАМЕТЬТЕ: таблица доверий доступна только для чтения\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: недействительная таблица доверий\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: сбой создания таблицы хэшей: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: ошибка обновления записи о версии: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: ошибка чтения записи о версии: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: ошибка сохранения записи о версии: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr ""
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: не является файлом таблицы доверий\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: запись о версии с номером записи %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: неправильная версия файла %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: ошибка чтения свободной записи: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: ошибка внесения записи каталога: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: сбой обнуления записи: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: сбой добавления записи: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "таблица доверий повреждена; запустите \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "не могу обработать строки текста длиннее %d символов\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "строка ввода длиннее %d символов\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' не является допустимым длинным ID ключа\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "ключ %s: принят как доверяемый ключ\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "ключ %s встречается более одного раза в таблице доверий\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "ключ %s: нет открытого ключа для доверяемого ключа - пропущен\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "ключ %s помечен как абсолютно доверяемый.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "запись о доверии %lu, тип запроса %d: сбой чтения: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "запись о доверии %lu не запрашиваемого типа %d\n"
+
+# check it
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+"не могу использовать неизвестную модель (%d) - использую %s модель доверий\n"
+
+# check it
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "использую %s модель доверий\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ отозван]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[просрочн]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[неизвстн]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[неопредл]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[ограничн]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[ полное ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[абсолютн]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "неопределено"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "никогда"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "ограниченно"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "полное"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "абсолютное"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "нет необходимости в проверке таблицы доверий\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "срок следующей проверки таблицы доверий %s\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "нет необходимости проверять таблицу доверий при `%s' модели доверий\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "нет необходимости обновлять таблицу доверий при '%s' модели доверий\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "открытый ключ %s не найден: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "выполните --check-trustdb, пожалуйста\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "проверка таблицы доверий\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d ключей обработано (%d дейсвующих записей очищено)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "не найдено абсолютно доверяемых ключей\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "открытый ключ для абсолютно доверяемого ключа %s не найден\n"
+
+# check it
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+"%d ограниченных необходимо, %d выполненных необходимо, %s модель доверия\n"
+
+#: g10/trustdb.c:2283
+#, 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"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"невозможно обновить запись о версии таблицы доверий: ошибка записи: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"Не могу проверить подпись.\n"
+"Файл подписи (.sig или .asc) должен быть\n"
+"первым указан в командной строке.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "входная строка %u слишком длинная или пропущен LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "глобальная ошибка"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "неизвестный тип пакета"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "неизвестная версия"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "неизвестный алгоритм с открытым ключом"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "неизвестная хэш-функция"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "неправильный открытый ключ"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "неправильный секретный ключ"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "подпись неверна"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "несоответствие контрольной сумме"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "неправильный пароль"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "открытый ключ не найден"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "неизвестный алгоритм шифрования"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "не могу открыть таблицу ключей"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "неправильный пакет"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "неправильный ASCII формат"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "нет такого User ID"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "секретный ключ не найден"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "использован неправильный секретный ключ"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "не поддерживается"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "неправильный ключ"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "ошибка чтения файла"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "ошибка записи файла"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "неизвестный алгоритм сжатия"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "ошибка открытия файла"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "ошибка создания файла"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "неправильный пароль"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "нереализованный алгоритм с открытым ключом"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "нереализованный алгоритм шифрования"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "неизвестный класс подписи"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "ошибка в таблице доверий"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "неверный MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "нехватка ресурсов"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "неправильная связка ключей"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "неправильный сертификат"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "деформированный User ID"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "ошибка закрытия файла"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "ошибка переименования файла"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "ошибка удаления файла"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "неожидавшиеся данные"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "конфликт с меткой времени"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "неприменимый алгоритм открытого ключа"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "файл существует"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "слабый ключ"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "недопустимый аргумент"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "плохой URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "неподдерживаемый URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "ошибка сети"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "не зашифровано"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "не выполнено"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "непригодный открытый ключ"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "непригодный закрытый ключ"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "ошибка сервера ключей"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "отменено"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "нет карты"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "не подписанные данные\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "ОШИБКА:"
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "ВНИМАНИЕ:"
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr " ... это ошибка (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "Вы нашли ошибку ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "да"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "нет"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr ""
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "ВНИМАНИЕ: используется незащищенная память!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "Для дополнительной информации см. http://www.gnupg.org/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "операция невозможна без инициализации защищенной памяти\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr ""
+"(возможно, Вы используете неподходящее программное обеспечение\n"
+"для данной задачи)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA требует использования 160 битной хэш-функции\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "смотрите подробности на http://www.gnupg.org/why-not-idea.html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "имя примечания должно содержать только печатные символы или пробелы,и "
+#~ "заканчиваться знаком '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "имя примечания пользователя должно содержать '@' символ\n"
+
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "имя пользователя не должно содержать более одного символа '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "значение примечания не должно содержать управляющие символы\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "ВНИМАНИЕ: найдена недопустимая форма записи данных\n"
+
+#~ msgid "not human readable"
+#~ msgstr "нечитаемо для человека"
+
+#~ msgid "expired: %s)"
+#~ msgstr "просрочен с: %s)"
diff --git a/po/sk.gmo b/po/sk.gmo
new file mode 100644 (file)
index 0000000..5a4ffd4
Binary files /dev/null and b/po/sk.gmo differ
diff --git a/po/sk.po b/po/sk.po
new file mode 100644 (file)
index 0000000..9245690
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,7209 @@
+# GnuPG Slovak translation
+# Copyright (C) 1998 - 2004 Free Software Foundation, Inc.
+# Michal Majer <mmajer@econ.umb.sk>, 2002 - 2004
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.5\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-07-20 15:52+0200\n"
+"Last-Translator: Michal Majer <mmajer@econ.umb.sk>\n"
+"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "nemô¾em vytvori» prvoèíslo s då¾kou menej ako %d bitov\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "nemô¾em vytvori» prvoèíslo s då¾kou menej ako %d bitov\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "nebol detekovaný ¾iadny modul na získanie entropie\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "nemo¾no otvori» `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "nemô¾em otvori» `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "nemô¾em pou¾i» príkaz stat na `%s': %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' nie je normálny súbor - ignorované\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "poznámka: súbor random_seed je prázdny\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "varovanie: neplatná veµkos» random_seed - súbor nepou¾itý\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "nemô¾em èíta» `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "poznámka: súbor random_seed nie je aktualizovaný\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "nemô¾em vytvori» `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "nemô¾em zapisova» do `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "nemô¾em zavrie» `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "VAROVANIE: pou¾itý generátor náhodných èísel nie je bezpeèný!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Generátor náhodných èísel je len atrapa, aby program mohol be¾a»,\n"
+"v ¾iadnom prípade nie je kryptograficky bezpeèný!\n"
+"\n"
+"NEPOU®ÍVAJTE ®IADNE DÁTA VYTVORENÉ TÝMTO PROGRAMOM!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Prosím èakajte, získava sa entropia. Robte zatiaµ nejakú inú prácu\n"
+"aby ste sa nenudili a zvý¹ite tým kvalitu entropie.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Nedostatok náhodných bajtov. Prosím, pracujte s operaèným systémom, aby\n"
+"ste mu umo¾nili získa» viac entropie (je potrebných %d bajtov).\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "nemô¾em inicializova» databázu dôvery: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "zlyhalo obnovenie vyrovnávacej pamäti kµúèov: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "zmazanie bloku kµúèa sa nepodarilo:  %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "nepodarilo posla» kµúè na server: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "chyba pri vytváraní hesla: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "chyba pri èítaní bloku kµúèa: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "%s: chyba pri èítaní voµného záznamu: %s\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' je u¾ skomprimovaný\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "vytvori» nový pár kµúèov"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "nemô¾em inicializova» databázu dôvery: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "zmazanie bloku kµúèa sa nepodarilo:  %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Vytvorenie kµúèa sa nepodarilo: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s podpis, hashovací algoritmus %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, fuzzy, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "nenájdené ¾iadne platné dáta vo formáte OpenPGP.\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ASCII kódovanie: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "neplatná hlavièka ASCII kódovania: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "ASCII hlavièka: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "neplatná hlavièka podpisu v èitateµnom formáte\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "vnorené podpisy v èitateµnom formátu\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "neoèakávané kódovanie ASCII:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "nesprávne oznaèenie riadku mínusmi: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "neplatný znak vo formáte radix64 %02x bol preskoèený\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "predèasný koniec súboru (¾iadne CRC)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "predèasný koniec súboru (v CRC)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "nesprávny formát CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "Chyba CRC; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "predèasný koniec súboru (v pätièke)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "chyba v pätièke\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "nenájdené ¾iadne platné dáta vo formáte OpenPGP.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "neplatné kódovanie ASCII: riadok je dlh¹í ako %d znakov\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"neplatný znak (quoted-printable) v ASCII kódovaní - pravdepodobne bol "
+"pou¾itý nesprávny MTA\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "tajný kµúè nie je dostupný"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "nemo¾no previes» v dávkovom móde\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Vá¹ výber? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Dôvod nebol ¹pecifikovaný"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "nespracované"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "¾iadny zodpovedajúci verejný kµúè: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "chyba pri èítaní `%s': %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "aktualizova» predvoµby"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "neplatný znak v re»azci s predvoµbami\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "neplatný znak v re»azci s predvoµbami\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "chyba: neplatný odtlaèok\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "vypísa» fingerprint"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "chyba: neplatný odtlaèok\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Vytvorenie kµúèa sa nepodarilo: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "nenájdené ¾iadne platné dáta vo formáte OpenPGP.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "chyba pri zápise do súboru tajných kµúèov `%s': %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Prosím, vyberte druh kµúèa, ktorý chcete:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+#, fuzzy
+msgid "   (1) Signature key\n"
+msgstr "Platnos» podpisu vypr¹ala %s\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (len na ¹ifrovanie)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Neplatný výber.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Prosím výberte dôvod na revokáciu:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "neznámy ochranný algoritmus\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "Tajné èasti primárneho kµúèa nie sú dostupné.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "preskoèené: tajný kµúè je u¾ v databáze\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "ukonèi» toto menu"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "konfliktné príkazy\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "ukáza» túto pomoc"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Kµúè k dispozícii na: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "zmeni» dobu platnosti"
+
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "zmeni» dôveryhodnos» vlastníka kµúèa"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "vypísa» fingerprint"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "vytvori» nový pár kµúèov"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Príkaz> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "konfliktné príkazy\n"
+
+#: g10/card-util.c:1526
+#, fuzzy
+msgid "Admin commands are allowed\n"
+msgstr "konfliktné príkazy\n"
+
+#: g10/card-util.c:1528
+#, fuzzy
+msgid "Admin commands are not allowed\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Neplatný príkaz (skúste \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "tajný kµúè nie je dostupný"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "zmazanie bloku kµúèa sa nepodarilo:  %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Opakujte heslo: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "heslo nie je zopakované správne; skúste to znovu"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "nemo¾no otvori» `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output pre tento príkaz nefunguje\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "kµúè `%s' nebol nájdený: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "chyba pri èítaní bloku kµúèa: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(pokiaµ neurèíte kµúè jeho fingerprintom)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "bez parametra \"--yes\" to nemo¾no v dávkovom móde previes»\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Zmaza» tento kµúè zo súboru kµúèov? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Toto je tajný kµúè! - skutoène zmaza»? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "zmazanie bloku kµúèa sa nepodarilo:  %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "informácie o dôveryhodnosti vlastníka kµúèa vymazané\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "existuje tajný kµúè pre tento verejný kµúè \"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "aby ste ho zmazali, pou¾ite najprv prepínaè \"--delete-secret-key\".\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "chyba pri vytváraní hesla: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "v móde S2K nemo¾no pou¾i» symetrický ESK paket\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "pou¾itá ¹ifra %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' je u¾ skomprimovaný\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "VAROVANIE: súbor `%s' je prázdny\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"v móde --pgp2 mô¾ete ¹ifrova» len RSA kµúèom s då¾kou 2048 bitov a menej\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "èítam z `%s'\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "algoritmus IDEA nemo¾no pou¾i» na v¹etky kµúèe, pre ktoré ¹ifrujete.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "vy¾iadaná symetrická ¹ifra %s (%d) nevyhovuje predvoµbám príjemcu\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"vy¾iadaný kompresný algoritmus %s (%d) nevyhovuje predvoµbám príjemcu\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "vy¾iadaná symetrická ¹ifra %s (%d) nevyhovuje predvoµbám príjemcu\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr ""
+"pou¾itie %s nie je v móde %s dovolené\n"
+"\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s za¹ifrovaný pre: %s\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s za¹ifrované dáta\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "za¹ifrované neznámym algoritmom %d\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"VAROVANIE: správa bola za¹ifrovaná slabým kµúèom v symetrickej ¹ifre.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problém so za¹ifrovaným paketom\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "¾iadne vzialené vykonávanie programu nie je podporované\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "nemô¾em vytvori» adresár `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"volanie externého programu zru¹ené kvôli nebezpeèným právam súboru "
+"nastavení\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"táto platforma potrebuje doèasné súbory na spustenie externého programu\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "nemo¾no spusti» %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "nemo¾no spusti» %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "systémová chyba pri volaní externého programu: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "nekorektné ukonèenie externého programu\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "nemo¾no spusti» externý program\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "nemo¾no cíta» odozvu externého programu: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "VAROVANIE: nemô¾em vymaza» doèasný súbor (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "VAROVANIE: nemô¾em vymaza» doèasný adresár `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Podpis bude oznaèený ako neodvolateµný (non-revocable).\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "¾iadne revokaèné kµúèe pre `%s' nenájdené\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "revokova» sekundárny kµúè"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "nepou¾iteµný tajný kµúè"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "kµúè %08lX: nie je chránený - preskoèené\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "kµúè %08lX: PGP 2.x kµúè - preskoèené\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "kµúè %08lX: podpis subkµúèa na zlom mieste - preskoèené \n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "nemô¾em inicializova» databázu dôvery: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "VAROVANIE: tajný kµúè %08lX nemá jednoduchý SK kontrolný súèet\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "VAROVANIE: niè nebolo vyexportované\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Príkazy:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[súbor]|vytvori» podpis"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[súbor]|vytvori» podpis v èitateµnom dokumente"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "vytvori» podpis oddelený od dokumentu"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "¹ifrova» dáta"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "¹ifrovanie len so symetrickou ¹ifrou"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "de¹ifrova» dáta (implicitne)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifikova» podpis"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "vypísa» zoznam kµúèov"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "vypísa» zoznam kµúèov a podpisov"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "skontrolova» podpisy kµúèov"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "vypísa» zoznam kµúèov a fingerprintov"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "vypísa» zoznam tajných kµúèov"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "vytvori» nový pár kµúèov"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "odstráni» kµúè zo súboru verejných kµúèov"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "odstráni» kµúè zo súboru tajných kµúèov"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "podpísa» kµúè"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "podpísa» kµúè lokálne"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "podpísa» alebo modifikova» kµúè"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "vytvori» revokaèný certifikát"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportova» kµúèe"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportova» kµúèe na server kµúèov"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importova» kµúèe zo servera kµúèov"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "vyhµada» kµúèe na serveri kµúèov"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "aktualizova» v¹etky kµúèe zo servera kµúèov"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importova»/zlúèi» kµúèe"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "aktualizova» databázu dôvery"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [súbory]|vypí¹ hash"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Mo¾nosti:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "vytvor výstup zakódovaný pomocou ASCII"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|MENO|¹ifrova» pre MENO"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr ""
+"pou¾i» toto id u¾ívateµa na podpísanie\n"
+" alebo de¹ifrovanie"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr ""
+"|N|nastavi» úroveò komprimácie N (0 - ¾iadna\n"
+" komprimácia)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "pou¾i» kánonický textový mód"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "pou¾i» ako výstupný súbor"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "s dodatoènými informáciami"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "nevykona» ¾iadne zmeny"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "vy¾iada» potvrdenie pred prepísaním"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Pou¾ite manuálové stránky pre kompletný zoznam v¹etkých príkazov a "
+"mo¾ností)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Príklady:\n"
+"\n"
+" -se -r Bob [súbor]        podpísa» a za¹ifrova» pre u¾ívateµa Bob\n"
+" --clearsign [súbor]       vytvori» podpis èitateµného dokumentu\n"
+" --detach-sign [súbor]     vytvori» podpis oddelený od dokumentu\n"
+" --list-keys [mená]        vypísa» kµúèe\n"
+" --fingerprint [mená]      vypísa» fingerprinty\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Chyby oznámte, prosím, na adresu <gnupg-bugs@gnu.org>.\n"
+"Pripomienky k prekladu <sk-i18n@lists.linux.sk>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Pou¾itie: gpg [mo¾nosti] [súbory] (-h pre pomoc)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntax: gpg [mo¾nosti] [súbory]\n"
+"podpísa», overi», ¹ifrova» alebo de¹ifrova»\n"
+"implicitné operácie závisia od vstupných dát\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Podporované algoritmy:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "Verejné kµúèe: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "©ifry: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Kompresia: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "pou¾itie: gpg [mo¾nosti] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "konfliktné príkazy\n"
+
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no = podpis nájdený v definícii skupiny \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "VAROVANIE: vlastníctvo pre %s nastavené nebezpeène \"%s\"\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "VAROVANIE: vlastníctvo pre %s nastavené nebezpeène \"%s\"\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "VAROVANIE: vlastníctvo pre %s nastavené nebezpeène \"%s\"\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "VAROVANIE: prístupové práva pre %s nie sú nastavené bezpeène \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "VAROVANIE: prístupové práva pre %s nie sú nastavené bezpeène \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "VAROVANIE: prístupové práva pre %s nie sú nastavené bezpeène \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "VAROVANIE: vlastníctvo adresára %s nastavené nebezpeène \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "VAROVANIE: vlastníctvo adresára %s nastavené nebezpeène \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "VAROVANIE: vlastníctvo adresára %s nastavené nebezpeène \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr ""
+"VAROVANIE: prístupové práva adresára %s nie sú nastavené bezpeène \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr ""
+"VAROVANIE: prístupové práva adresára %s nie sú nastavené bezpeène \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr ""
+"VAROVANIE: prístupové práva adresára %s nie sú nastavené bezpeène \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "neznáma polo¾ka konfigurácie \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "V súbore tajných kµúèov chýba zodpovedajúci podpis\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "zadané URL pre podpisovú politiku je neplatné\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "uká¾ v ktorom súbore kµúèov je vypísaný kµúè"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "V súbore tajných kµúèov chýba zodpovedajúci podpis\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "POZNÁMKA: starý implicitný súbor s mo¾nos»ami `%s ignorovaný'\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "POZNÁMKA: neexistuje implicitný súbor s mo¾nos»ami `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "súbor s mo¾nos»ami `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "èítam mo¾nosti z `%s'\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "POZNÁMKA: %s nie je pre normálne pou¾itie!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr ""
+"¹ifra \"%s\" nebola nahraná, preto¾e prístupové práva nie sú nastavené "
+"bezpeène\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s nie je platná znaková sada\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s nie je platná znaková sada\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "nemo¾no pou¾i» URI servera kµúèov - chyba analýzy URI\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: neplatný parameter pre export\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "neplatný parameter pre export\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: neplatný parameter pre import\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "neplatný parameter pre import\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: neplatný parameter pre export\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "neplatný parameter pre export\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: neplatný parameter pre import\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "neplatný parameter pre import\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s nie je platná znaková sada\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "zadané URL pre podpisovú politiku je neplatné\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s nie je platná znaková sada\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: neplatný parameter pre export\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "neplatný parameter pre export\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "nemo¾no nastavi» exec-path na %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: neplatný parameter pre export\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "VAROVANIE: program mô¾e vytvori» súbor core!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "VAROVANIE: %s prepí¹e %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "Nie je dovolené pou¾íva» %s s %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s nedáva s %s zmysel!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent nie je v tomto sedení dostupný\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"v móde --pgp2 mô¾ete vytvára» len oddelené podpisy alebo podpisy èitateµné "
+"ako text\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "v móde --pgp2 nemo¾no súèasne ¹ifrova» a podpisova»\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "v móde --pgp2 musíte pou¾i» súbor (nie rúru).\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "¹ifrovanie správ v móde --pgp2 vy¾aduje algoritmus IDEA\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "vybraný ¹ifrovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "vybraný hashovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "vybraný ¹ifrovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "vybraný hashovací algoritmus je neplatný\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "polo¾ka completes-needed musí by» väè¹ia ako 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "polo¾ka marginals-needed musí by» väè¹ia ako 1\n"
+
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "polo¾ka max-cert-depth musí by» v rozmedzí od 1 do 255\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "neplatná implicitná úroveò certifikácie; musí by» 0, 1, 2 alebo 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "neplatná minimálna úroveò certifikácie; musí by» 0, 1, 2 alebo 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "POZNÁMKA: jednoduchý mód S2K (0) je dôrazne nedoporuèovaný\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "neplatný mód S2K; musí by» 0, 1 alebo 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "neplatné defaultné predvoµby\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "neplatné u¾ívateµské predvoµby pre ¹ifrovanie\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "neplatné u¾ívateµské predvoµby pre hashovanie\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "neplatné u¾ívateµské predvoµby pre kompresiu\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s e¹te nepracuje s %s\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "nemô¾ete pou¾i» ¹ifrovací algoritmus \"%s\" v móde %s\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "nemô¾ete pou¾i» hashovací algoritmus \"%s\" v móde %s\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "nemô¾ete pou¾i» kompresný algoritmus \"%s\" v móde %s\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "nemô¾em inicializova» databázu dôvery: %s\n"
+
+#: g10/gpg.c:3261
+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"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [meno súboru]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [meno súboru]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "de¹ifrovanie zlyhalo: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [meno súboru]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [meno súboru]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr ""
+"pou¾itie %s nie je v móde %s dovolené\n"
+"\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [meno súboru]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [meno súboru]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [meno súboru]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr ""
+"pou¾itie %s nie je v móde %s dovolené\n"
+"\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [meno súboru]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [meno súboru]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [meno súboru]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key id u¾ívateµa"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key id u¾ívateµa"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key id u¾ívateµa [príkazy]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [id u¾ívateµa] [súbor s kµúèmi (keyring)]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "nepodarilo posla» kµúè na server: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "nepodarilo sa prija» kµúè zo servera: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "nepodaril sa export kµúèa: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "nepodarilo sa nájs» server: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "aktualizácia servera zlyhala: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "dekódovanie z ASCII formátu zlyhalo: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "kódovanie do ASCII formátu zlyhalo: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "neplatný hashovací algoritmus `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[meno súboru]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Zaènite písa» svoju správu ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "zadané URL pre certifikaènú politiku je neplatné\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "zadané URL pre podpisovú politiku je neplatné\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "zadané URL pre podpisovú politiku je neplatné\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "príli¹ veµa polo¾iek v bufferi verejných kµúèov - vypnuté\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[User id not found]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+# c-format
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr ""
+"Neplatný kµúè %08lX zmenený na platný pomocou --always-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "existuje tajný kµúè pre tento verejný kµúè %08lX!\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "pou¾ívam sekundárny kµúè %08lX namiesto primárneho kµúèa %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "kµúè %08lX: tajný kµúè bez verejného kµúèa - preskoèené\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "by» o trochu tich¹í"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "Zmaza» tento kµúè zo súboru kµúèov? "
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "konflikt èasového razítka"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|zapísa» informácie o stave do tohto FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Pou¾itie: gpgv [mo¾nosti] [súbory] (-h pre pomoc)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Syntax: gpg [nastavenia] [súbory]\n"
+"Skontroluje podpisy oproti známym dôveryhodným kµúèom\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Je na Vás, aby ste sem priradili hodnotu; táto hodnota nebude nikdy\n"
+"exportovaná tretej strane. Potrebujeme ju k implementácii \"pavuèiny\n"
+"dôvery\"; nemá to niè spoloèné s (implicitne vytvorenou) \"pavuèinou\n"
+"certifikátov\"."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Aby bolo mo¾né vybudova» pavuèinu dôvery, musí GnuPG vedie», ktorým kµúèom\n"
+"dôverujete absolútne - obyèajne sú to tie kµúèe, pre ktoré máte prístup\n"
+"k tajným kµúèom. Odpovedzte \"ano\", aby ste nastavili tieto kµúèe\n"
+"ako absolútne dôveryhodné\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Pokiaµ aj tak chcete pou¾i» tento nedôveryhodný kµúè, odpovedzte \"ano\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Vlo¾te identifikátor adresáta, ktorému chcete posla» správu."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"V¹ebecne nemo¾no odporúèa» pou¾íva» rovnaký kµúè na ¹ifrovanie a "
+"podeisovanie\n"
+"Tento algoritmus je vhodné pou¾i» len za urèitých podmienok.\n"
+"Kontaktujte prosím najprv bezpeènostného ¹pecialistu."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Vlo¾te då¾ku kµúèa"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Odpovedzte \"ano\" alebo \"nie\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Vlo¾te po¾adovanú hodnotu tak, ako je uvedené v príkazovom riadku.\n"
+"Je mo¾né vlo¾i» dátum vo formáte ISO (RRRR-MM-DD), ale nedostanete\n"
+"správnu chybovú hlá¹ku - miesto toho systém skúsi interpretova»\n"
+"zadanú hodnotu ako interval."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Vlo¾te meno dr¾iteµa kµúèa"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "prosím, vlo¾te e-mailovú adresu (nepovinné, ale veµmi odporúèané)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Prosím, vlo¾te nepovinný komentár"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  pre zmenu názvu.\n"
+"C  pre zmenu komentára.\n"
+"E  pre zmenu e-mailovej adresy.\n"
+"O  pre pokraèovanie generovania kµúèa.\n"
+"Q  pre ukonèenie generovania kµúèa."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Ak chcete generova» podkµúè, odpovedzte \"ano\" (alebo len \"a\")."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Skôr ako podpí¹ete id u¾ívateµa, mali by ste najprv overi», èi kµúè\n"
+"patrí osobe, ktorej meno je uvedené v identifikátore u¾ívateµa.\n"
+"Je veµmi u¾itoèné, keï ostatní vedia, ako dôsledne ste previedli\n"
+"takéto overenie.\n"
+"\n"
+"\"0\" znamená, ¾e neuvádzate, ako dôsledne ste pravos» kµúèa overili\n"
+"\n"
+"\"1\" znamená, ¾e veríte tomu, ¾e kµúè patrí osobe, ktorá je uvedená,\n"
+"    v u¾ívateµskom ID, ale nemohli ste alebo jste nepreverili túto "
+"skutoènos».\n"
+"    To je u¾itoèné pre \"osobnú\" verifikáciu, keï podpisujete kµúèe, ktoré\n"
+"    pou¾ívajú pseudonym u¾ívateµa.\n"
+"\n"
+"\"2\" znamená, ¾e ste èiastoène overili pravos» kµúèa. Napr. ste overili\n"
+"    fingerprint kµúèa a skontrolovali identifikátor u¾ívateµa\n"
+"    uvedený na kµúèi s fotografickým id.\n"
+"\n"
+"\"3\" Znamená, ¾e ste vykonali veµmi dôkladné overenie pravosti kµúèa.\n"
+"    To mô¾e napríklad znamena», ¾e ste overili fingerprint kµúèa \n"
+"    jeho vlastníka osobne a ïalej ste pomocou ta¾ko fal¹ovateµného \n"
+"    dokumentu s fotografiou (napríklad pasu) overili, ¾e meno majiteµa\n"
+"    kµúèa sa zhoduje s menom uvedeným v u¾ívateµskom ID a ïalej ste \n"
+"    overili (výmenou elektronických dopisov), ¾e elektronická adresa "
+"uvedená \n"
+"    v ID u¾ívateµa patrí majiteµovi kµúèa.\n"
+"\n"
+"Prosím nezabúdajte, ¾e príklady uvedené pre úroveò 2 a 3 sú *len*\n"
+"príklady.\n"
+"Je len na Va¹om rozhodnutí, èo \"èiastoèné\" a \"dôkladné\" overenie "
+"znamená\n"
+"keï budete podpisova» kµúèe iným u¾ívateµom.\n"
+"\n"
+"Pokiaµ neviete, aká je správna odpoveï, odpovedzte \"0\"."
+
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+"Pokiaµ chcete podpísa» V©ETKY identifikátory u¾ívateµov, odpovedzte \"ano\""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Pokiaµ skutoène chcete zmaza» tento identifikátor u¾ívateµa, odpovedzte \"ano"
+"\".\n"
+"V¹etky certifikáty budú tie¾ stratené!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Odpovedzte \"ano\", pokiaµ chcete zmaza» podkµúè"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Toto je platný podpis kµúèa; normálne nechcete tento podpis zmaza»,\n"
+"preto¾e mô¾e by» dôle¾itý pri vytváraní dôvery kµúèa alebo iného kµúèa\n"
+"ceritifikovaného týmto kµúèom."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Tento podpis nemô¾e by» overený, preto¾e nemáte zodpovedajúci verejný kµúè.\n"
+"Jeho zmazanie by ste mali odlo¾i» do èasu, keï budete vedie», ktorý kµúè\n"
+"bol pou¾itý, preto¾e tento podpisovací kµúè mô¾e vytvori» dôveru\n"
+"prostredníctvom iného u¾ certifikovaného kµúèa."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "Podpis je neplatný. Je rozumné ho odstráni» z Vá¹ho súboru kµúèov."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Toto je podpis, ktorý via¾e identifikátor u¾ívateµa ku kµúèu. Zvyèajne\n"
+"nie je dobré takýto podpis odstráni». GnuPG nemô¾e tento kµúè naïalej\n"
+"pou¾íva». Urobte to len v prípade, keï je tento podpis kµúèa\n"
+"ním samým z nejakého dôvodu neplatný a keï je k dispozícii iný kµúè."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Zmeni» predvoµby pre v¹etky u¾ívateµské ID (alebo len pre oznaèené)\n"
+"na aktuálny zoznam predvolieb. Èasové razítka v¹etkých dotknutých podpisov\n"
+"kµúèov nimi samotnými budú posunuté o jednu sekundu dopredu.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Prosím, vlo¾te heslo; toto je tajná veta \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr ""
+"Prosím, zopakujte posledné heslo, aby ste si boli istý, èo ste napísali."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Zadajte názov súboru, ku ktorému sa podpis vz»ahuje"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Ak si prajete prepísanie súboru, odpovedzte \"ano\""
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Prosím, vlo¾te nový názov súboru. Ak len stlaèíte RETURN, bude\n"
+"pou¾itý implicitný súbor (ktorý je zobrazený v zátvorkách)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Mali by ste ¹pecifikova» dôvod certifikácie. V závislosti na kontexte\n"
+"máte mo¾nos» si vybra» zo zoznamu:\n"
+"  \"kµúè bol kompromitovaný\"\n"
+"      Toto pou¾ite, pokiaµ si myslíte, ¾e k Vá¹mu tajnému kµúèu získali\n"
+"       prístup neoprávnené osoby.\n"
+"  \"kµúè je nahradený\"\n"
+"      Toto pou¾ite, pokiaµ ste tento kµúè nahradili nov¹ím kµúèom.\n"
+"  \"kµúè sa u¾ nepou¾íva\"\n"
+"      Toto pou¾ite, pokiaµ tento kµúè u¾ nepou¾ívate.\n"
+"  \"Identifikátor u¾ívateµa u¾ nie je platný\"\n"
+"      Toto pou¾ite, pokiaµ by sa identifikátor u¾ívateµa u¾ nemal pou¾íva»;\n"
+"      normálne sa pou¾íva na oznaèenie neplatnej e-mailové adresy.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Ak chcete, mô¾ete vlo¾i» text popisujúcí pôvod vzniku tohto revokaèného\n"
+"ceritifikátu. Prosím, struène. \n"
+"Text konèí prázdnym riadkom.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Pomoc nie je k dispozícii"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Pomoc nie je dostupná pre '%s'"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "aktualizova» databázu dôvery"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "verejný kµúè nesúhlasí s tajným!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "nepou¾iteµný tajný kµúè"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "blok typu %d bol preskoèený\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "%lu kµúèe boli doteraz spracované\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "Celkovo spracovaných kµúèov: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "      preskoèené nové kµúèe: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "        bez identifikátorov: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                importované: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                  bez zmien: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "         nové id u¾ívateµov: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "              nové podkµúèe: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "               nové podpisy: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "      nové revokácie kµúèov: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      preèítané tajné kµúèe: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "    importované tajné kµúèe: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "      tajné kµúèe nezmenené: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "           neimportované: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "               nové podpisy: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      preèítané tajné kµúèe: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Podpísali ste nasledujúce identifikátory u¾ívateµa:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s podpis, hashovací algoritmus %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "kµúè %08lX: chyba identifikátor u¾ívateµa\n"
+
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "kµúè %08lX: HKP po¹kodenie podkµúèa opravené\n"
+
+# c-format
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr ""
+"kµúè %08lX: prijaté id u¾ívateµa '%s', ktorý nie je podpísaný ním samým\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "kµúè %08lX: chýba platný identifikátor u¾ívateµa\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "mô¾e to by» spôsobené chýbajúcim podpisom kµúèa ním samým\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "kµúè %08lX: verejný kµúè nenájdený: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "kµúè %08lX: nový kµúè - preskoèený\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "nenájdený zapisovateµný súbor kµúèov (keyring): %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "zapisujem do '%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "chyba pri zápise súboru kµúèov (keyring)  `%s': %s\n"
+
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "kµúè %08lX: verejný kµúè \"%s\" importovaný\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "kµúè %08lX: nezodpovedá na¹ej kópii\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "kµúè %08lX: nemô¾em nájs» originálny blok kµúèa: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "kµúè %08lX: nemô¾em èíta» originálny blok kµúèa: %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "kµúè %08lX: \"%s\" 1 nový identifikátor u¾ívateµa\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "kµúè %08lX: \"%s\" %d nových identifikátorov u¾ívateµa\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "kµúè %08lX: \"%s\" 1 nový podpis\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "kµúè %08lX: \"%s\" %d nových podpisov\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "kµúè %08lX: \"%s\" 1 nový podkµúè\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "kµúè %08lX: \"%s\" %d nových podkµúèov\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "kµúè %08lX: \"%s\" %d nových podpisov\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "kµúè %08lX: \"%s\" %d nových podpisov\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "kµúè %08lX: \"%s\" %d nových identifikátorov u¾ívateµa\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "kµúè %08lX: \"%s\" %d nových identifikátorov u¾ívateµa\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "kµúè %08lX: \"%s\" bez zmeny\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "kµúè %08lX: tajný kµúè bez verejného kµúèa %d - preskoèené\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "nie je nastavený implicitný súbor tajných kµúèov %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "kµúè %08lX: tajný kµúè importovaný\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "kµúè %08lX: je u¾ v súbore tajných kµúèov\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "kµúè %08lX: nebol nájdený tajný kµúè: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"kµúè %08lX: chýba verejný kµúè - nemô¾em aplikova» revokaèný certifikát\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "kµúè %08lX: neplatný revokaèný certifikát: %s - zamietnuté\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "kµúè %08lX: \"%s\" revokaèný certifikát importovaný\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "kµúè %08lX: neexistuje id u¾ívateµa pre podpis\n"
+
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"kµúè %08lX: nepodporovaný algoritmus verejného kµúèa u u¾ívateµského id \"%s"
+"\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr ""
+"kµúè %08lX: neplatný podpis kµúèa ním samým u u¾ívateµského id \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "kµúè %08lX: neexistuje podkµúè pre viazanie kµúèov\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "kµúè %08lX: nepodporovaný algoritmus verejného kµúèa\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "kµúè %08lX: neplatná väzba podkµúèa\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "kµúè %08lX: zmazaná viacnásobná väzba podkµúèa\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "kµúè %08lX: neexistuje podkµúè na revokáciu kµúèa\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "kµúè %08lX: neplatný revokaèný podkµúè\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "kµúè %08lX: zmazaná viacnásobná revokácia podkµúèa\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "kµúè %08lX: identifikátor u¾ívateµa preskoèený '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "kµúè %08lX: podkµúè preskoèený\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "kµúè %08lX: podpis nie je exportovateµný (trieda %02x) - preskoèené\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "kµúè %08lX: revokaèný certifikát na zlom mieste - preskoèené \n"
+
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "kµúè %08lX: neplatný revokaèný certifikát: %s - preskoèené\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "kµúè %08lX: podpis subkµúèa na zlom mieste - preskoèené \n"
+
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "kµúè %08lX: neoèakávaná podpisová trieda (0x%02X) - preskoèené\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "kµúè %08lX: zistený duplikovaný identifikátor u¾ívateµa - zlúèený\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"VAROVANIE: kµúè %08lX mô¾e by» revokovaný: skú¹am získa» revokaèný kµúè %"
+"08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"VAROVANIE: kµúè %08lX mô¾e by» revokovaný: revokaèný kµúè %08lX nenájdený.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "kµúè %08lX: pridaný revokaèný certifikát \"%s\"\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "kµúè %08lX: podpis kµúèa ním samým (direct key signature)\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "verejný kµúè nesúhlasí s tajným!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "preskoèené: tajný kµúè je u¾ v databáze\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "preskoèené: tajný kµúè je u¾ v databáze\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "chyba pri vytváraní súboru kµúèov (keyring)`%s': %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "súbor kµúèov (keyring) `%s' vytvorený\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "chyba pri vytváraní `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "zlyhalo obnovenie vyrovnávacej pamäti kµúèov: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[revokácia]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[podpis kµúèa ním samým]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 zlý podpis\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d zlých podpisov\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 podpis neoverený, preto¾e chýba kµúè\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d podpisov neoverených, preto¾e chýba kµúè\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 podpis neoverený, preto¾e vznikla chyba\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d podpisov neoverených, preto¾e vznikli chyby\n"
+
+#: g10/keyedit.c:357
+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"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr ""
+"zistených %d identifikátorov u¾ívateµa bez platného podpisu ním samým\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Prosím rozhodnite, nakoµko dôverujete tomuto u¾ívateµovi, ¾e správne\n"
+"verifikuje kµúèe iných u¾ívateµov (prezretím cestovných pasov,\n"
+"kontrolou fingerprintov z rôznych zdrojov...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Dôverujem èiastoène\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Dôverujem úplne\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "U¾ívateµské ID \"%s\" je revokované."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Ste si istý, ¾e stále chcete podpísa» tento kµúè? (a/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Nemo¾no podpísa».\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "U¾ívateµské ID \"%s\" je revokované."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "ID u¾ívateµa \"%s\" nie je podpísané ním samým."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "ID u¾ívateµa \"%s\" nie je podpísané ním samým."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Skutoène podpísa»? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Podpis kµúèa \"%s\" ním samým je\n"
+"podpis vo formáte PGP 2.x.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Prajete si ho zmeni» na formát OpenPGP? (a/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Vá¹ súèasný podpis na \"%s\"\n"
+"je len lokálny.\n"
+"\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "Chcete, aby platnos» Vá¹ho podpisu vypr¹ala v rovnakom èase? (A/n) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Vá¹ súèasný podpis na \"%s\"\n"
+"je len lokálny.\n"
+"\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Prajete si ho zmeni» na plne exportovateµný podpis? (a/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" je u¾ lokálne podpísaný kµúèom %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" je u¾ podpísaný kµúèom %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Ste si istý, ¾e stále chcete podpísa» tento kµúè? (a/N) "
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Niè na podpísanie kµúèom %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Platnos» kµúèa vypr¹ala!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Platnos» kµúèa vypr¹í %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "Chcete, aby platnos» Vá¹ho podpisu vypr¹ala v rovnakom èase? (A/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Nemô¾ete vytvori» OpenPGP podpis kµúèa typu PGP 2.x, keï ste v --pgp2 móde.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "To by spôsobilo nepou¾itelnos» kµúèa v PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"S akou istotou ste preverili, ¾e kµúè, ktorý chcete podpísa»\n"
+"patrí vy¹¹ie uvedenej osobe?\n"
+"Pokiaµ nepoznáte odpoveï, zadajte \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Neodpoviem.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Vôbec som to nekontroloval(a).%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) Èiastoène som to overil(a).%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Veµmi dôkladne som to overil(a).%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Vá¹ výber? ('?' - viac informácií): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Ste si istý, ¾e chcete podpísa» tento kµúè\n"
+"svojím kµúèom: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Ide o podpis kµúèa ním samým\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"VAROVANIE: podpis nebude oznaèený ako neexportovateµný.\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"VAROVANIE: podpis nebude oznaèený ako neodvolateµný (non-revocable).\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Podpis bude oznaèený ako neexportovateµný.\n"
+"\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Podpis bude oznaèený ako neodvolateµný (non-revocable).\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Vôbec som tento kµúè neoveril.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Èiastoène som overil tento kµúè.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Velmi dôkladne som overil tento kµúè.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Skutoène podpísa»? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "podpisovanie zlyhalo: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Tento kµúè nie je chránený.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Tajné èasti primárneho kµúèa nie sú dostupné.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Tajné èasti primárneho kµúèa nie sú dostupné.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "kµúè je chránený.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Nie je mo¾né editova» tento kµúè: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Vlo¾te nové heslo (passphrase) pre tento tajný kµúè.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "heslo nie je zopakované správne; skúste to znovu"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Nechcete heslo - to je *zlý* nápad!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Skutoène to chcete urobi»? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "presúvam podpis kµúèa na správne miesto\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "ulo¾i» a ukonèi»"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "vypísa» fingerprint"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "vypísa» zoznam kµúèov a id u¾ívateµov"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "vyberte identifikátor u¾ívateµa N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "vyberte identifikátor u¾ívateµa N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "revokova» podpisy"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "podpísa» kµúè lokálne"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Nápoveda: Vyberte id u¾ívateµa na podpísanie\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "prida» identifikátor u¾ívateµa"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "prida» fotografické ID"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "zmaza» identifikátor u¾ívateµa"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "zmaza» sekundárny kµúè"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "prida» revokaèný kµúè"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr "Skutoène aktualizova» predvoµby pre vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Nemô¾ete zmeni» dobu platnosti kµúèa verzie 3\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "oznaèi» u¾ívateµské ID ako primárne"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "prepnú» medzi vypísaním zoznamu tajných a verejných kµúèov"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "vypísa» zoznam predvolieb (pre expertov)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "vypísa» zoznam predvolieb (podrobne)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr "Skutoène aktualizova» predvoµby pre vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "nemo¾no pou¾i» URI servera kµúèov - chyba analýzy URI\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Skutoène aktualizova» predvoµby pre vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "zmeni» heslo"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "zmeni» dôveryhodnos» vlastníka kµúèa"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Skutoène revokova» v¹etky vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "revokova» identifikátor u¾ívateµa"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "revokova» sekundárny kµúè"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "nastavi» kµúè ako platný (enable)"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "nastavi» kµúè ako neplatný (disable)"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "ukáza» fotografické ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "chyba pri èítaní bloku tajného kµúèa `%s': %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Tajný kµúè je dostupný.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Na vykonanie tejto operácie je potrebný tajný kµúè.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Prosím, najskôr pou¾ite príkaz \"toggle\" (prepnú»).\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Kµúè revokovaný."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Skutoène podpísa» v¹etky id u¾ívateµa? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Nápoveda: Vyberte id u¾ívateµa na podpísanie\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "neznáma trieda podpisu"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Tento príkaz nie je v módoch %s dovolený.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Musíte vybra» aspoò jedno id u¾ívateµa.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Nemô¾ete zmaza» posledné id u¾ívateµa!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Skutoène odstráni» v¹etky vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Skutoène odstráni» toto id u¾ívateµa? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Skutoène odstráni» toto id u¾ívateµa? "
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Musíte vybra» aspoò jeden kµúè.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "nemô¾em otvori» `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "chyba pri vytváraní súboru kµúèov (keyring)`%s': %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Musíte vybra» aspoò jeden kµúè.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Skutoène chcete zmaza» vybrané kµúèe? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Skutoène chcete zmaza» tento kµúè? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Skutoène revokova» v¹etky vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Skutoène revokova» toto id u¾ívateµa? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Skutoène chcete revokova» tento kµúè? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Skutoène chcete revokova» vybrané kµúèe? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Skutoène chcete revokova» tento kµúè? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "nastavi» zoznam predvolieb"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "Skutoène aktualizova» predvoµby pre vybrané id u¾ívateµa? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Skutoène aktualizova» predvoµby? "
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Ulo¾i» zmeny? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Ukonèi» bez ulo¾enia? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "aktualizácia zlyhala: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "aktualizácia tajného kµúèa zlyhala: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "kµúè nebol zmenený, tak¾e nie je potrebné ho aktualizova».\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Digest: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Charakteristiky: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notácie: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "U¾ívateµské ID vo formáte PGP 2.x nemá ¾iadne predvoµby\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Tento kµúè mô¾e by» revokovaný kµúèom %s "
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Tento kµúè mô¾e by» revokovaný kµúèom %s "
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr "(citlivá informácia)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "%s: nemô¾em vytvori»: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[revokované]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr " [platnos» skonèí: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr " [platnos» skonèí: %s]"
+
+#: g10/keyedit.c:2741
+#, fuzzy, c-format
+msgid "usage: %s"
+msgstr " dôvera: %c/%c"
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " dôvera: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Tento kµúè bol oznaèený za neplatný (disabled)"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Prosím nezabúdajte, ¾e zobrazované údaje o platnosti kµúèov nemusia\n"
+"by» správne, pokiaµ znovu nespustíte program.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[revokované]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"VAROVANIE: ¾iadne ID u¾ívateµa nebolo oznaèené ako primárne. Tento príkaz\n"
+"spôsobí, ¾e iné ID u¾ívateµa sa bude pova¾ova» primárne.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"VAROVANIE: Toto je PGP2 kµúè. Pridanie fotografického ID mô¾e v niektorých\n"
+"           verziách PGP vies» k odmietnutiu tohto kµúèa.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Ste si istý, ¾e ho chcete stále prida»? (a/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Nemali by ste pridáva» fotografické ID k PGP2 kµúèu.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Zmaza» tento dobrý podpis? (a/N/u)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Zmaza» tento neplatný podpis? (a/N/u)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Zmaza» tento neznámy podpis? (a/N/u)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Skutoène zmaza» tento podpis podpísaný sebou samým? (a/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Zmazaný %d podpis.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Zmazaných %d podpisov.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Niè nebolo zmaznané.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "neplatný spôsob reprezentácie v ASCII"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "U¾ívateµské ID \"%s\" je revokované."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "U¾ívateµské ID \"%s\" je revokované."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "U¾ívateµské ID \"%s\" je revokované."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "u¾ívateµské ID \"%s\" je u¾ revokované\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "u¾ívateµské ID \"%s\" je u¾ revokované\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"VAROVANIE: Toto je PGP2 kµúè. Pridanie fotografického ID mô¾e v niektorých\n"
+"           verziách PGP vies» k odmietnutiu tohoto kµúèa.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Nemali by ste pridáva» fotografické ID k PGP2 kµúèu.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Vlo¾te identifikátor u¾ívateµa povereného revokáciou: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "kµúè vo formáte PGP 2.x nemo¾no poveri» revokáciou\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "kµúè nemo¾no poveri» revokáciou ním samým\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "VAROVANIE: Tento kµúè bol revokovaný jeho urèeným revokátorom/!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "VAROVANIE: oznaèenie kµúèa ako revokovací u¾ nemô¾e by» zru¹ené!\n"
+
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "Ste si istý, ¾e chcete oznaèi» tento kµúè ako revokovací? (a/N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Prosím, odstráòte výber z tajných kµúèov.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Prosím, vyberte najviac jeden sekundárny kµúè.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Mením dobu platnosti sekundárneho kµúèa.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Mením dobu platnosti primárneho kµúèa.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Nemô¾ete zmeni» dobu platnosti kµúèa verzie 3\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "V súbore tajných kµúèov chýba zodpovedajúci podpis\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "VAROVANIE: podpisovací podkµúè %08lX nie je krí¾ovo certifikovaný\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Prosím, vyberte práve jedno id u¾ívateµa.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "preskoèený v3 podpis kµúèa ním samým u u¾ívateµského id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Ste si istý, ¾e ho chcete pou¾i»? (a/N) "
+
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Ste si istý, ¾e ho chcete pou¾i»? (a/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Podpisová notácia: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Prepísa» (a/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Neexistuje identifikátor u¾ívateµa s indexom %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Neexistuje identifikátor u¾ívateµa s indexom %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Neexistuje identifikátor u¾ívateµa s indexom %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "id u¾ívateµa: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "   podpísané %08lX v %s%s%s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (nexeportovateµné)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Platnos» podpisu vypr¹í %s.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Ste si istý, ¾e ho chcete stále revokova»? (a/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Vytvori» pre tento podpis revokaèný certifikát? (a/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Podpísali ste nasledujúce identifikátory u¾ívateµa:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr " (nexeportovateµné)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   revokované %08lX v %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Chystáte sa revokova» tieto podpisy:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Skutoène vytvori» revokaèné certifikáty? (a/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "neexistuje tajný kµúè\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "u¾ívateµské ID \"%s\" je u¾ revokované\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "VAROVANIE: podpis pou¾ivateµkého ID vznikol %d sekund v budúcnosti\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "u¾ívateµské ID \"%s\" je u¾ revokované\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "u¾ívateµské ID \"%s\" je u¾ revokované\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Zobrazujem %s fotografické ID s veµkos»ou %ld pre kµúè 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "duplicita predvoµby %c%lu\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "príli¹ veµa `%c' predvolieb\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "príli¹ veµa `%c' predvolieb\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "príli¹ veµa `%c' predvolieb\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "neplatný znak v re»azci s predvoµbami\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "zapisujem podpis kµúèa ním samým (direct signature)\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "zapisujem podpis kµúèa sebou samým\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "zapisujem \"key-binding\" podpis\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "neplatná då¾ka kµúèa; pou¾ijem %u bitov\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "då¾ka kµúèa zaokrúhlená na %u bitov\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "¹ifrova» dáta"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, fuzzy, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%d) ElGamal (len na ¹ifrovanie)\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Prosím, vyberte druh kµúèa, ktorý chcete:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA a ElGamal (implicitný)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (len na podpis)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (len na ¹ifrovanie)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (len na ¹ifrovanie)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (len na podpis)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (len na ¹ifrovanie)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (len na ¹ifrovanie)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "Pár kµúèov DSA bude ma» då¾ku 1024 bitov.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Akú veµkos» kµúèa si prajete? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Po¾adovaná då¾ka kµúèa je %u bitov.\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "zaokrúhlené na %u bitov\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Prosím urète, ako dlho by mal kµúè platit.\n"
+"         0 = doba platnosti kµúèa nie je obmedzená\n"
+"      <n>  = doba platnosti kµúèa skonèí za n dní\n"
+"      <n>w = doba platnosti kµúèa skonèí za n tý¾dòov\n"
+"      <n>m = doba platnosti kµúèa skonèí za n mesiacov\n"
+"      <n>y = doba platnosti kµúèa skonèí za n rokov\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Prosím urète, ako dlho by mal podpis platit.\n"
+"         0 = doba platnosti podpisu nie je onmedzená\n"
+"      <n>  = doba platnosti podpisu skonèí za n dní\n"
+"      <n>w = doba platnosti podpisu skonèí za n tý¾dòov\n"
+"      <n>m = doba platnosti podpisu skonèí za n mesiacov\n"
+"      <n>y = doba platnosti podpisu skonèí za n rokov\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Kµúè je platný na? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "Podpis je platný na? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "neplatná hodnota\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "platnos» %s neskonèí\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "platnos» %s neskonèí\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "platnos» %s skonèí %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Platnos» podpisu vypr¹í %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Vá¹ systém nevie zobrazi» dátumy po roku 2038.\n"
+"V ka¾dom prípade budú dátumy korektne spracovávané do roku 2106.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Je to správne (a/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Aby bolo mo¾né rozpozna» Vá¹ kµúè, musíte pozna» identifikátor u¾ívateµa;\n"
+"program ho zlo¾í z Vá¹ho mena a priezviska, komentára a e-mailu v tomto "
+"tvare:\n"
+"    \"Jozko Mrkvicka (student) <jozko@mrkvicka.sk>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Meno a priezvisko: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Neplatný znak ve mene\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Meno nemô¾e zaèína» èíslicou\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Meno musí by» dlhé aspoò 5 znakov\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "E-mailová adresa: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "Neplatná e-mailová adresa\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Komentár: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Neplatný znak v komentári\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Pou¾ívate znakovú sadu `%s'.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Zvolili ste tento identifikátor u¾ívateµa:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Do poµa meno alebo komentár nepí¹te, prosím, e-mailovú adresu.\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "mMkKeEPpUu"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Zmeni» (M)eno, (K)omentár, (E)-mail alebo (U)konèi»? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Zmeni» (M)eno, (K)omentár, (E)-mail alebo (P)okraèova»/(U)konèi»? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Najskôr, prosím, opravte chybu\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Je potrebné vytvori» veµa náhodných bajtov. Poèas vytvárania mô¾ete\n"
+"vykonáva» inú prácu na poèítaèi (písa» na klávesnici, pohybova» my¹ou,\n"
+"pou¾íva» disky); vïaka tomu má generátor lep¹iu ¹ancu získa» dostatok "
+"entropie.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Vytváranie kµúèa bolo zru¹ené.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "zapisujem verejný kµúè do `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "zapisujem tajný kµúè do `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "nenájdený zapisovateµný súbor verejných kµúèov (pubring): %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "nenájdený zapisovateµný súbor tajných kµúèov (secring): %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "chyba pri zápise do súboru verejných kµúèov `%s': %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "chyba pri zápise do súboru tajných kµúèov `%s': %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "verejný a tajný kµúè boli vytvorené a podpísané.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Tento kµúè nemô¾e by» pou¾itý na ¹ifrovanie. Pre vytvorenie\n"
+"sekundárneho kµúèa na tento úèel mô¾ete pou¾i» príkaz \"--edit-key\".\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Vytvorenie kµúèa sa nepodarilo: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in 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"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in 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"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "POZNÁMKA: vytvorenie podkµúèa pre kµúèe v3 nie je v súlade s OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Skutoène vytvori»? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "zmazanie bloku kµúèa sa nepodarilo:  %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "nemô¾em vytvori» `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, 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"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "nikdy     "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kritická podpisová politika: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Podpisová politika: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Kritická podpisová notácia: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Podpisová notácia: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "súbor kµúèov (keyring)"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Primárny fingerprint kµúèa:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "     Fingerprint podkµúèa:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " Primárny fingerprint kµúèa:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "      Fingerprint podkµúèa:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "   Fingerprint kµúèa ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "kódovanie do ASCII formátu zlyhalo: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "VAROVANIE: Existujú dva súbory s tajnými informáciami.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s je bez zmeny\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s je nový\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Prosím, opravte tento mo¾ný bezpeènostný problém\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "kontrolujem súbor kµúèov (keyring) `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu kµúèov skontrolovaných (%lu podpisov)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: súbor kµúèov (keyring) vytvorený\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "zadané URL pre podpisovú politiku je neplatné\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "VAROVANIE: nastavenie v `%s' e¹te nie je aktívne\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, fuzzy, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "neplatný parameter pre export\n"
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "kµúè `%s' nebol nájdený: %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "kµúè `%s' nebol nájdený: %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "po¾adujem kµúè %08lX z %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "po¾adujem kµúè %08lX z %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr ""
+"\"\n"
+"podpísané Va¹ím kµúèom %08lX v %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "vyhµadávam \"%s\" na HKP serveri %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "neplatný parameter pre export\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "chyba servera kµúèov"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "chyba servera kµúèov"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "nepodarilo sa prija» kµúè zo servera: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, 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"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "po¾adujem kµúè %08lX z %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "po¾adujem kµúè %08lX z %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "VAROVANIE: nemô¾em vymaza» doèasný súbor (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "VAROVANIE: nemô¾em vymaza» doèasný súbor (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "zvlá¹tna veµkos» ¹ifrovacieho kµúèa pre sedenie (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s kµúè ¹ifrovaného sedenia\n"
+
+#: g10/mainproc.c:301
+#, fuzzy, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "za¹ifrované neznámym algoritmom %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "verejný kµúè je %08lX\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "dáta za¹ifrované verejným kµúèom: správny DEK\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "za¹ifrované %u-bitovým %s kµúèom, ID %08lX, vytvoreným %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, fuzzy, c-format
+msgid "      \"%s\"\n"
+msgstr "                alias \""
+
+# Scripte scannen lt. dl1bke auf "ID (0-9A-F)+" deswegen muß "ID" rein :-(
+# [kw]
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "za¹ifrovaná %s kµúèom, ID %08lX\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "de¹ifrovanie verejným kµúèom zlyhalo: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "za¹ifrované s %lu heslami\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "za¹ifrované jedným heslom\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "predpokladám %s ¹ifrovaných dát\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"algoritmus IDEA nie je dostupný; optimisticky sa ho pokúsime nahradi» "
+"algoritmom %s\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "de¹ifrovanie o.k.\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "VAROVANIE: správa nemá ochranu integrity\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "VAROVANIE: so za¹ifrovanou správou bolo manipulované!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "de¹ifrovanie zlyhalo: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "POZNÁMKA: odosielateµ po¾adoval (\"for-your-eyes-only\")\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "pôvodné meno súboru='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"samostatný revokaèný certifikát -  pou¾ite \"gpg --import\", ak ho chcete "
+"vyu¾i»\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Dobrý podpis od \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "verifikácia podpisu potlaèená\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "neviem pracova» s týmito násobnými podpismi\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Platnos» podpisu vypr¹ala %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "                alias \""
+
+# Scripte scannen lt. dl1bke auf "ID (0-9A-F)+" deswegen muß "ID" rein :-(
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Podpis vytvorený %.*s pomocou %s kµúèa ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Kµúè k dispozícii na: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "ZLÝ podpis od \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Podpis s vypr¹anou platnos»ou od \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Dobrý podpis od \""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[neistý]  "
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "                alias \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Platnos» podpisu vypr¹ala %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Platnos» podpisu vypr¹í %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s podpis, hashovací algoritmus %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binárne"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "textový mód"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "neznáme"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Nemô¾em overi» podpis: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "toto nie je podpis oddelený od dokumentu\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "VAROVANIE: Nájdené viacnásobne podpisy. Skontrolovaný bude len prvý.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "samostatný podpis triedy 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "podpis starého typu (PGP 2.x)\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "nájdený neplatný koreòový paket v proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "nemô¾em vypnú» vytváranie core súborov: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, fuzzy, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "nemo¾no otvori» súbor: %s\n"
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "databáza dôvery: procedúra read() (n=%d) zlyhala: %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "nemô¾em pracova» s algoritmom verejného kµúèa %d\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "¹ifrovací algoritmus nie je implementovaný"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s podpis, hashovací algoritmus %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr ""
+"vy¾iadaný hashovací algoritmus %s (%d) nevyhovuje predvoµbám príjemcu\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA modul pre GnuPG nenájdený\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = prosím o viac informácíi\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: pou¾itie parametra \"%s\" sa neodporúèa\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "VAROVÁNÍ: pou¾itie parametra \"%s\" sa neodporúèa\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "pou¾ite namiesto neho \"%s%s\" \n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "VAROVÁNÍ: pou¾itie parametra \"%s\" sa neodporúèa\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Nekomprimované"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Nekomprimované"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "táto správa nemusí pou¾iteµná s %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "èítam mo¾nosti z `%s'\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "neznámy implicitný adresát `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Súbor `%s' existuje. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Prepísa» (a/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: neznáma prípona\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Vlo¾te nový názov súboru"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "zapisujem na ¹tandardný výstup (stdout)\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "predpokladám podpísané dáta v `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "vytvorený nový konfiguraèný súbor `%s'\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "VAROVANIE: nastavenie v `%s' e¹te nie je aktívne\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: adresár vytvorený\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "nemô¾em pracova» s algoritmom verejného kµúèa %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr ""
+"VAROVANIE: pravdepodobne nebezpeèný symetricky ¹ifrovaný kµúè sedenia\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "podpaket typu %d má nastavený kritický bit\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent nie je v tomto sedení dostupný\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "zlý formát premennej prostredia GPG_AGENT_INFO\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent protokol verzie %d nie je podporovaný\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "nemô¾em sa pripoji» k `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problém s agentom - pou¾ívanie agenta vypnuté\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (hlavné ID kµúèa %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Potrebujete heslo, aby ste odomkli tajný kµúè pre u¾ívateµa:\n"
+"\"%.*s\"\n"
+"kµúè s då¾kou %u bitov, typ %s, ID %08lX, vytvorený %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Opakova» heslo\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Vlo¾i» heslo\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "zru¹ené u¾ívateµom\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "v dávkovom re¾ime sa nemô¾em pýta» na heslo\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Vlo¾te heslo: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Musíte pozna» heslo, aby ste odomkli tajný kµúè pre\n"
+"u¾ívateµa: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "då¾ka %u bitov, typ %s, ID %08lX, vytvorený %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Opakujte heslo: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Vyberte si obrázok, ktorý bude pou¾itý ako fotografické ID. Tento obrázok\n"
+"musí by» vo formáte JPEG. Pamätajte, ¾e bude ulo¾ený vo Va¹om verejnom "
+"kµúèi.\n"
+"Ak pou¾ijete veµmi veµký obrázok, kµúè bude tie¾ veµký! Odporúèaná veµkos»\n"
+"obrázka je okolo 240x288.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Meno súbor s fotografiou vo formáte JPEG: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "nemo¾no otvori» súbor: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Ste si istý, ¾e ho chcete pou¾i»? (a/N) "
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" nie je súbor JPEG\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Je táto fotografia správna (a/N/u)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "nemo¾no nastavi» exec-path na %s\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Dôvod nebol ¹pecifikovaný"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Kµúè je nahradený"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Kµúè bol skompromitovaný"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Kµúè sa u¾ nepou¾íva"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Identifikátor u¾ívateµa u¾ neplatí"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "dôvod na revokáciu: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "revokaèná poznámka: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMuUsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Nie je priradená ¾iadna hodnota dôvery k:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, fuzzy, c-format
+msgid "  aka \"%s\"\n"
+msgstr "                alias \""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "Tento kµúè pravdepodobne patrí jeho majiteµovi\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Neviem\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Nedôverujem\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Dôverujem absolútne\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = spä» do hlavného menu\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = preskoèi» tento kµúè\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr " u = ukonèi»\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Va¹e rozhodnutie? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Skutoène chcete nastavi» pre tento kµúè absolútnu dôveru? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certifikáty vedúce k finálnemu dôveryhodnému kµúèu:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Niè nenaznaèuje tomu, ¾e tento podpis patrí vlastníkovi kµúèa.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Niè nenaznaèuje tomu, ¾e tento podpis patrí vlastníkovi kµúèa.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Tento kµúè pravdepodobne patrí jeho majiteµovi\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Tento kµúè patrí nám (máme zodpovedajúci tajný kµúè)\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"NIE JE isté, ¾e tento kµúè patrí osobe, ktorá sa vydáva za jeho\n"
+"vlastníka. Pokiaµ *skutoène* viete, èo robíte, mô¾ete na otázku\n"
+"odpoveda» áno\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Pou¾i» napriek tomu tento kµúè? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "VAROVANIE: Je pou¾itý nedôveryhodný kµúè!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "VAROVANIE: kµúè mô¾e by» revokovaný (revokaèný kµúè neexistuje)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "VAROVANIE: Tento kµúè bol revokovaný jeho urèeným revokátorom/!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "VAROVANIE: Tento kµúè bol revokovaný jeho vlastníkom!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         To mô¾e znamena», ¾e podpis je falo¹ný.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "VAROVANIE: Tento podkµúè bol revokovaný jeho vlastníkom!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Poznámka: Tento kµúè bol oznaèený ako neplatný (disabled).\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Poznámka: Skonèila platnos» tohto kµúèa!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "VAROVANIE: Tento kµúè nie certifikovaný dôveryhodným podpisom!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Niè nenaznaèuje tomu, ¾e tento podpis patrí vlastníkovi kµúèa.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "VAROVANIE: NEdôverujeme tomuto kµúèu!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Tento podpis je pravdepodobne FALO©NÝ.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"VAROVANIE: Tento kµúè nie je certifikovaný dostatoène dôveryhodnými "
+"podpismi!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Nie je isté, ¾e tento podpis patrí vlastníkovi.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: preskoèené: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: preskoèené: verejný kµúè je u¾ obsiahnutý v databáze\n"
+
+#: g10/pkclist.c:885
+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"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Napí¹te identifikátor u¾ívateµa (user ID). Ukonèite prázdnym riadkom: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Takýto identifikátor u¾ívateµa neexistuje.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "preskoèené: verejný kµúè je u¾ nastavený podµa implicitného adresáta\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Verejný kµúè je neplatný (disabled).\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "preskoèené: verejný kµúè je u¾ nastavený\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "neznámy implicitný adresát `%s'\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: preskoèené: verejný kµúè je neplatný (disabled)\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "¾iadne platné adresy\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "chyba pri vytváraní `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Podpis oddelený od dokumentu.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Prosím, vlo¾te názov dátového súboru: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "èítam ¹tandardný vstup (stdin) ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "chýbajú podpísané dáta\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "nemô¾em otvori» podpísané dáta '%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonymný adresát; skú¹am tajný kµúè %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "o.k., my sme anonymný adresát.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "staré kódovanie DEK nie je podporováné\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "¹ifrovací algoritmus %d%s je neznamý alebo je zakázaný\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "POZNÁMKA: v predvoµbách nenájdený ¹ifrovací algoritmus %d\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "POZNÁMKA: platnos» tajného kµúèa %08lX skonèila %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "POZNÁMKA: kµúè bol revokovaný"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet zlyhala: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "kµúè %08lX: chyba identifikátor u¾ívateµa\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Bude revokovaný:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Toto je citlivý revokaèný kµúè)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Vytvori» pre tento podpis revokaèný certifikát? "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "Vynútený ASCII textový výstup.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet zlyhala: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Revokaèný certifikát bol vytvorený.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "¾iadne revokaèné kµúèe pre `%s' nenájdené\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "tajný kµúè `%s' nebol nájdený: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "¾iadny zodpovedajúci verejný kµúè: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "verejný kµúè nesúhlasí s tajným!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Vytvori» pre tento podpis revokaèný certifikát? "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "neznámy ochranný algoritmus\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "POZNÁMKA: Tento kµúè nie je chránený!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Bol vytvorený revokaèný certifikát.\n"
+"\n"
+"Presuòte ho na médium, ktoré mô¾ete schova»; ak Mallory získa k\n"
+"tomuto certifikátu prístup, mô¾e znefunkèni» Vá¹ kµúè. Jednoduché je\n"
+"vytlaèi» certifikát a schova» ho, pre prípad ¾e by médium bolo neèitateµné.\n"
+"Ale hrozí nebezpeèenstvo: Tlaèový systém Vá¹ho poèítaèa mô¾e uklada» dáta a\n"
+"sprístupni» ich iným!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Prosím výberte dôvod na revokáciu:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Zru¹i»"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Pravdepodobne ste chceli vybra» %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Ak chcete, napí¹te popis; ukonèite prázdnym riadkom:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Dôvod na revokáciu: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(®iadny popis)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Je to v poriadku? "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "tajné èasti kµúèa nie sú dostupné\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "ochranný algoritmus %d%s nie je podporováný\n"
+
+#: g10/seckey-cert.c:72
+#, fuzzy, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "ochranný algoritmus %d%s nie je podporováný\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Neplatné heslo; prosím, skúste to znovu"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "VAROVANIE: Zistený slabý kµúè - zmeòte, prosím, znovu heslo.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"generujem zastaralý 16 bitový kontrolný súèet na ochranu tajného kµúèa\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "vytvorený slabý kµúè - skú¹am znovu\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"nemô¾em sa vyvarova» slabého kµúèa pre symetrickú ¹ifru; operáciu som skúsil "
+"%d krát!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "VAROVANIE: konflikt hashu podpisu v správe\n"
+
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "VAROVANIE: podpisovací podkµúè %08lX nie je krí¾ovo certifikovaný\n"
+
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"VAROVANIE: podpisovací podkµúè %08lX má neplatnú krí¾ovú certifikáciu\n"
+
+#: g10/sig-check.c:181
+#, 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"
+
+#: g10/sig-check.c:182
+#, 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"
+
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second 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"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+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"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "POZNÁMKA: podpisovému kµúèu %08lX skonèila platnos» %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"predpokladám neplatný podpis kµúèom %08lX, preto¾e je nastavený neznámy "
+"kritický bit\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "kµúè %08lX: neexistuje podkµúè pre revokáciu kµúèa\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "kµúè %08lX: neexistuje podkµúè pre viazanie podkµúèov\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "nemô¾em prida» dodatoèné údaje do v3 (PGP 2.x ¹týl) podpisov\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "nemô¾em prida» dodatoèné údaje do v3 (PGP 2.x ¹týl) podpisov kµúèov\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"VAROVANIE: nemo¾no %%-expandova» notácie (príli¹ dlhé). Pou¾ité "
+"neexpandované.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "nemô¾em prida» politiku URL do v3 (PGP 2.x ¹týl) podpisov\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "nemô¾em prida» politiku URL do v3 (PGP 2.x ¹týl) podpisov kµúèov\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"VAROVANIE: nemô¾em %%-expandova» URL politiky (príli¹ dlhé). Pou¾ité "
+"neexpandované.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"VAROVANIE: nemô¾em %%-expandova» URL politiky (príli¹ dlhé). Pou¾ité "
+"neexpandované.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "kontrola vytvoreného podpisu sa nepodarila: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s podpis od: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"v móde --pgp2 mô¾ete vytvori» len oddelený podpis kµúèa vo formáte PGP-2.x\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"vy¾iadaný hashovací algoritmus %s (%d) nevyhovuje predvoµbám príjemcu\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "podpisujem:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"v móde --pgp2 mô¾ete vytvára» èitateµné podpisy len s kµúèmi formátu PGP-2."
+"x\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "bude pou¾ité ¹ifrovanie %s\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"kµúè nie je oznaèený ako nedostatoène bezpeèný - nemô¾em ho pou¾i» s "
+"falo¹ným RNG!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "preskoèený `%s': duplikovaný\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "preskoèený `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "preskoèené: tajný kµúè je u¾ v databáze\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"preskoèený `%s': toto je vygenerovaný PGP kµúè podµa algoritmu ElGamal,\n"
+"podpisy vytvorené týmto kµúèom nie sú bezpeèné!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "záznam dôvery %lu, typ %d: zápis zlyhal: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Zoznam pridelených hodnôt dôveryhodnosti, vytvorený %s\n"
+"# (Pou¾ite \"gpg --import-ownertrust\" na obnovenie)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "chyba pri èítaní `%s': %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "riadok je príli¹ dlhý\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "chyba: neplatný odtlaèok\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr ""
+"importova» hodnoty dôveryhodnosti\n"
+" vlastníka kµúèa"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "chyba pri hµadaní záznamu dôvery: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "chyba pri èítaní: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "databáza dôvery: synchronizácia zlyhala %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "záznam v databáze dôvery %lu: lseek() sa nepodaril: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "záznam v databáze dôvery %lu: zápis sa nepodaril (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "transakcia s databázou dôvery je príli¹ dlhá\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "nemô¾em zavrie» `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: adresár neexistuje!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "nemô¾em vytvori» `%s': %s\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "nemo¾no otvori» `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: nepodarilo sa vytvori» záznam verzie: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: vytvorená neplatná databáza dôvery\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: databáza dôvery vytvorená\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "POZNÁMKA: do trustdb nemo¾no zapisova»\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: neplatná databáze dôvery\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: nepodarilo sa vytvori» hashovaciu tabuµku: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: chyba pri aktualizácii záznamu verzie: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: chyba pri èítaní záznamu verzie: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: chyba pri zápise záznamu verzie: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "databáze dôvery: procedúra lseek() zlyhala: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "databáza dôvery: procedúra read() (n=%d) zlyhala: %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: nie je súbor databázy dôvery\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: záznam verzie s èíslom %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: neplatná verzia súboru %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: chyba pri èítaní voµného záznamu: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: chyba pri zápise adresárového záznamu: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: vynulovanie záznamu zlyhalo: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: pridanie záznamu zlyhalo: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "databáza dôvery je po¹kodená; prosím spustite \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "nemô¾em pracova» s riadkami dlh¹ími ako %d znakov\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "vstupný riadok je dlh¹í ako %d znakov\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' nie je platné dlhé keyID\n"
+
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "kµúè %08lX: akceptovaný ako dôveryhodný kµúè\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "kµúè %08lX sa v databáze dôvery vyskytuje viac ako raz\n"
+
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr ""
+"kµúè %08lX: nenájdený verejný kµúè k dôveryhodnému kµúèu - preskoèené\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "kµúè oznaèený ako absolútne dôveryhodný.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "záznam dôvery %lu, typ po¾. %d: èítanie zlyhalo: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "záznam dôvery %lu nie je po¾adovaného typu %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[revokované]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[expirované]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "neznáme"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "nikdy     "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "nie je nutné kontrolova» databázu dôvery\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "dal¹ia kontrola databázy dôvery %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "nie je nutné kontrolova» databázu dôvery\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "nie je nutné kontrolova» databázu dôvery\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "verejný kµúè %08lX nebol nájdený: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "prosím vykonajte --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "kontrolujem databázu dôvery\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d kµúèov spracovaných (%d poètov platnosti vymazaných)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "neboli nájdené ¾iadne absolútne dôveryhodné kµúèe\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+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"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "záznam dôvery %lu, typ %d: zápis zlyhal: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"podpis nebolo mo¾né overi».\n"
+"Prosím, nezabúdajte, ¾e súbor s podpisom (.sig alebo .asc)\n"
+"by mal by» prvým súborom zadaným na príkazovom riadku.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "vstupný riadok %u je príli¹ dlhý alebo na konci chýba znak LF\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "v¹eobecná chyba"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "neznámy typ paketu"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "neznáma verzia"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "neznámy algoritmus verejného kµúèa"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "neznámy hashovací algoritmus"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "neplatný verejný kµúè"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "neplatný tajný kµúè"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "neplatný podpis"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "chyba kontrolného súètu"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "nesprávne heslo"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "verejný kµúè nenájdený"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "neznámy ¹ifrovací algoritmus"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "nemô¾em otvori» súbor kµúèov"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "neplatný paket"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "neplatný spôsob reprezentácie v ASCII"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "u¾ívateµ s týmto id neexistuje"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "tajný kµúè nie je dostupný"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "bol pou¾itý nesprávny tajný kµúè"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "nepodporované"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "nesprávny kµúè"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "chyba pri èítaní súboru"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "chyba pri zápise súboru"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "neznámy kompresný algoritmus"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "chyba pri otváraní súboru"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "chyba pri vytváraní súboru"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "nesprávne heslo"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmus verejného kµúèa nie je implementovaný"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "¹ifrovací algoritmus nie je implementovaný"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "neznáma trieda podpisu"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "chyba v databáze dôvery"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "nesprávne MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "obmedzenie zdrojov"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "neplatný súbor kµúèov"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "nesprávny certifikát"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "nesprávny formát id u¾ívateµa"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "chyba pri zatváraní súboru"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "chyba pri premenovávaní súboru"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "chyba pri mazaní súboru"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "neoèakávané dáta"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "konflikt èasového razítka"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "nepou¾iteµný algoritmus s verejným kµúèom"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "súbor existuje"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "slabý kµúè"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "neplatný argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "nesprávne URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "toto URI nie je podporované"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "chyba siete"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "neza¹ifrované"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "nespracované"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "nepou¾iteµný verejný kµúè"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "nepou¾iteµný tajný kµúè"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "chyba servera kµúèov"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Zru¹i»"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "neza¹ifrované"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "chýbajú podpísané dáta\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... toto je chyba v programe (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "nájdená chyba v programe ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "ano"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "aAyY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nie"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "ukonèi»"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "uUqQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "VAROVANIE: Pou¾ívaná pamä» nie je bezpeèná!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "Viac informácií nájdete na adrese http://www.gnupg.org/faq.html\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "vykonanie operácie nie je mo¾né bez inicializovanej bezpeènej pamäte\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(pravdepodobne ste na túto úlohu pou¾ili nesprávny program)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA po¾aduje pou¾itie 160 bitového hashovacieho algoritmu\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "viac informácií nájdete v dokumente http://www.gnupg.cz/why-not-idea."
+#~ "html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "meno mô¾e obsahova» len písmená, èíslice, bodky, podèiarníky alebo "
+#~ "medzery a konèi» s '='\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "hodnota musí obsahova» znak '@'\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "hodnota musí obsahova» znak '@'\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "hodnota nesmie obsahova» ¾iadne kontrolné znaky\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "VAROVANIE: nájdený neplatný formát zápisu dátumu\n"
+
+#~ msgid "not human readable"
+#~ msgstr "nie je v priamo èitateµnom formáte"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "èíta» nastavenia zo súboru"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "èíta» nastavenia zo súboru"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr " [platnos» skonèí: %s]"
+
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "kµúè %08lX: neoèakávaná podpisová trieda (0x%02X) - preskoèené\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "nemo¾no spusti» %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "u¾ívateµské ID \"%s\" je u¾ revokované\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "chyba pri vytváraní hesla: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "nesprávne heslo alebo neznámy ¹ifrovací algoritmus (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "nemô¾em nastavi» PID klienta pre gpg-agenta\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "nemo¾no získa» server read file descriptor pre agenta\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "nemo¾no získa» server write file descriptor pre agenta\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problém v komunikácii s gpg-agentom\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "heslo je príli¹ dlhé\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "neplatná reakcia od agenta\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problém s agentom: agent vracia 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "vyberte sekundárny kµúè N"
+
+#~ msgid "list signatures"
+#~ msgstr "vypísa» zoznam podpisov"
+
+#~ msgid "sign the key"
+#~ msgstr "podpísa» kµúè"
+
+#~ msgid "add a secondary key"
+#~ msgstr "prida» sekundárny kµúè"
+
+#~ msgid "delete signatures"
+#~ msgstr "zmaza» podpisy"
+
+#~ msgid "change the expire date"
+#~ msgstr "zmeni» dobu platnosti"
+
+#~ msgid "set preference list"
+#~ msgstr "nastavi» zoznam predvolieb"
+
+#~ msgid "updated preferences"
+#~ msgstr "aktualizova» predvoµby"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Neexistuje sekundárny kµúè s indexom %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key id u¾ívateµa"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key id u¾ívateµa"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "vytvori» podpis oddelený od dokumentu"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "podpísa» kµúè bez mo¾nosti odvola» podpis (non-revocably)"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "podpísa» kµúè lokálne a bez mo¾nosti odvola» podpis (non-revocably)"
+
+#~ msgid "q"
+#~ msgstr "u"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "v¹eobecná chyba"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "ulo¾i»"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "chyba servera kµúèov"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revuid"
+#~ msgstr "revsig"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "hashovací algoritmus `%s' je len na èítanie v tejto verzii\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Chystám sa vytvori» nový pár kµúèov %s.\n"
+#~ "                       minimálna veµkos» kµúèa je  768 bitov\n"
+#~ "                      implicitná veµkos» kµúèa je 1024 bitov\n"
+#~ "            najvy¹¹ia navrhovaná veµkos» kµúèa je 2048 bitov\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "kµúè DSA musí ma» veµkos» od 512 do 1024 bitov.\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "veµkos» kµúèa je príli¹ malá; minimálna povolená veµkos» pre RSA je 1024 "
+#~ "bitov.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr ""
+#~ "veµkos» kµúèa je príli¹ malá; minimálna povolená veµkos» je 768 bitov.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "veµkos» kµúèa je príli¹ veµká; maximálna povolená hodnota je %d.\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Veµkosti kµúèov väè¹ie ako 2048 bitov se neodporúèajú, preto¾e\n"
+#~ "výpoèty potom trvajú VE¥MI dlho!\n"
+
+#, fuzzy
+#~ msgid "Are you sure that you want this keysize? (y/N) "
+#~ msgstr "Skutoène chcete vytvori» kµúè tejto då¾ky? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Dobre, ale nezabúdajte, ¾e informácie mô¾u by» vyzradené z poèítaèa aj "
+#~ "elektromagnetickým vy¾arovaním monitora alebo klávesnice!\n"
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Experimentálne algoritmy by sa nemali pou¾íva»!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "tento ¹ifrovací algoritmus je zastaralý; prosím, pou¾ite nejaký "
+#~ "¹tandardnej¹í!\n"
+
+#, fuzzy
+#~ msgid "writing to file `%s'\n"
+#~ msgstr "zapisujem do '%s'\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "nemo¾no previes» v dávkovom móde\n"
+
+#~ msgid "key `%s' not found: %s\n"
+#~ msgstr "kµúè `%s' nebol nájdený: %s\n"
+
+#, fuzzy
+#~ msgid "can't create file `%s': %s\n"
+#~ msgstr "nemô¾em vytvori» `%s': %s\n"
+
+#, fuzzy
+#~ msgid "can't open file `%s': %s\n"
+#~ msgstr "nemo¾no otvori» súbor: %s\n"
+
+#, fuzzy
+#~ msgid "          \""
+#~ msgstr "                alias \""
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "kµúè %08lX: kµúè bol revokovaný\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "kµúè %08lX: podkµúè bol revokovaný!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: skonèila platnos» kµúèa\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: NEdôverujeme tomuto kµúèu!\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (pro ¹ifrování a podpis)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (auth only)\n"
+#~ msgstr "   (%d) RSA (len na podpis)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (sign and auth)\n"
+#~ msgstr "   (%d) RSA (pro ¹ifrování a podpis)\n"
+
+#, fuzzy
+#~ msgid "   (%d) RSA (encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (len na ¹ifrovanie)\n"
+
+#, fuzzy
+#~ msgid "  (%d) RSA (sign, encrypt and auth)\n"
+#~ msgstr "   (%d) RSA (pro ¹ifrování a podpis)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: nemô¾em otvori»: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: VAROVANIE: súbor je prázdny\n"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "nemo¾no otvori» %s: %s\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust marginally\n"
+#~ msgstr " %d = Dôverujem èiastoène\n"
+
+#, fuzzy
+#~ msgid "   (%d) I trust fully\n"
+#~ msgstr " %d = Dôverujem úplne\n"
+
+#, fuzzy
+#~ msgid "expires"
+#~ msgstr "expire"
+
+#, fuzzy
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %s at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "lokálne podpísané Va¹ím kµúèom %08lX v %s\n"
+
+#, fuzzy
+#~ msgid "   signed by %s on %s%s\n"
+#~ msgstr "   podpísané %08lX v %s%s\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: nemô¾em pristupova» k: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: nemô¾em vytvori» zámok\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: nemô¾em zamknú»\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: nemô¾em vytvori»: %s\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: nemô¾em vytvori» adresár: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Pokiaµ aj tak chcete pou¾i» tento revokovaný kµúè, odpovedzte \"ano\"."
+
+#~ msgid "Unable to open photo \"%s\": %s\n"
+#~ msgstr "Nemo¾no otvori» fotografiu \"%s\": %s\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "nemo¾no otvori» súbor: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "chyba: chýba èiarka\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "chyba: ¾iadna úroveò dôveryhodnosti\n"
+
+#~ msgid " (main key ID %08lX)"
+#~ msgstr " (hlavné ID kµúèa %08lX)"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! podkµúè bol revokovaný: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- nájdená falo¹ná revokácia\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problém overenia revokácie: %s\n"
+
+#, fuzzy
+#~ msgid " [expired: %s]"
+#~ msgstr " [platnos» skonèí: %s]"
+
+#~ msgid " [expires: %s]"
+#~ msgstr " [platnos» skonèí: %s]"
+
+#, fuzzy
+#~ msgid " [revoked: %s]"
+#~ msgstr "[revokované]"
+
+#~ msgid "can't create %s: %s\n"
+#~ msgstr "%s: nemô¾em vytvori»: %s\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "VAROVANIE: hash `%s' nie je súèas»ou OpenPGP. Pou¾itie na vlastné "
+#~ "nebezpeèie!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[súbor]|¹ifrova» súbor"
+
+#~ msgid "store only"
+#~ msgstr "len ulo¾enie"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[súbor]|de¹ifrova» súbor"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "podpísa» kµúè bez mo¾nosti revokácie podpisu"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr ""
+#~ "podpísa» kµúè lokálne a bez mo¾nosti\n"
+#~ " revokácie podpisu"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "vypísa» len poradie paketov"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr ""
+#~ "exportova» hodnoty dôveryhodnosti\n"
+#~ " vlastníka kµúèa"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "neinteraktívna aktualizácia databázy dôvery"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "opravi» naru¹enú databázu dôvery"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Dekódova» ASCII súbor alebo std. vstup"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Zakódova» súbor alebo std. vstup do ASCII"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|MENO|pou¾i» MENO ako implicitného adresáta"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr ""
+#~ "pou¾i» implicitný kµúè ako implicitného\n"
+#~ " adresáta"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "vôbec nepou¾íva» terminál"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "vynúti» podpisy verzie 3"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "nevynucova» podpisy verzie 3"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "vynúti» podpisy verzie 4"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "nevynucova» podpisy verzie 4"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "na ¹ifrovanie v¾dy pou¾i» MDC"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "na ¹ifrovanie nikdy nepou¾i» MDC"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "pou¾ite gpg-agenta"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "dávkový re¾im: nikdy sa na niè nepýta»"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "automaticky odpoveda» áno na väè¹inu otázok"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "automaticky odpoveda» NIE na väè¹inu otázok"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr ""
+#~ "prida» tento súbor kµúèov do zoznamu\n"
+#~ " pou¾ívaných súborov kµúèov"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "prida» tento súbor tajných kµúèov do zoznamu"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|MENO|pou¾i MENO ako implicitný tajný kµúè"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr ""
+#~ "|POÈÍTAÈ|pou¾i tento server kµúèov na vyhµadávanie\n"
+#~ " kµúèov"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|MENO|nastav znakovú sadu terminálu na MENO"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[súbor]|zapí¹ informáciu o stave do súboru"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|kµúè|úplne dôverova» tomuto kµúèu"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|SÚBOR|nahra» roz¹irujúci modul SÚBOR"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "emulova» mód popísaný v RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "nastav v¹etky vlastnosti paketov, ¹ifier\n"
+#~ " a hashov ako v OpenPGP"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "nastav v¹etky vlastnosti paketov, ¹ifier\n"
+#~ " a hashov ako v PGP 2.x"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|pou¾i» mód hesla N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|ALG|pou¾i» hashovací algoritmus ALG pre heslá"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|ALG|pou¾i» ¹ifrovací algoritmus ALG pre heslá"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|ALG|pou¾i» ¹ifrovací algoritmus ALG"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|ALG|pou¾i» hashovací algoritmus ALG"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|pou¾i» kompresný algoritmus N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr ""
+#~ "zahodi» identifikátor kµúèa zo ¹ifrovaných\n"
+#~ " paketov"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Zobrazi» fotografické ID"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Nezobrazova» fotografické ID"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr ""
+#~ "Nastavi» príkazový riadok na prehliadanie\n"
+#~ " fotografického ID"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "hashovací algoritmus `%s' je len na èítanie v tejto verzii\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "kompresný algoritmus musí by» v rozmedzí %d..%d\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Nie je isté, èi tento podpis patrí vlastníkovi, napriek\n"
+#~ "tomu je akceptovaný\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "predvoµba %c%lu nie je platná\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "kµúè %08lX: nie je vo formáte RFC 2440 - preskoèené\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "POZNÁMKA: Nájdený primárny kµúè Elgamal - import mô¾e chvíµu trva»\n"
+
+#~ msgid " (default)"
+#~ msgstr "de¹ifrova» dáta (implicitne)"
+
+#~ 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"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "chyba pri posielaní na `%s': %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "úspe¹né odoslanie na `%s' (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "zlyhalo posielanie na `%s': (status=%u)\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "tento server kµúèov nepodporuje --search-keys\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "nemô¾em prehµadáva» server kµúèov: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "kµúè %08lX: toto je kµúè algoritmu ElGamal vygenerovaný v PGP - podpisy "
+#~ "ním vytvorené NIE SÚ bezpeèné!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "kµúè %08lX bol vytvorený %lu sekund v budúcnosti (do¹lo ku zmene èasu "
+#~ "alebo\n"
+#~ "je problém so systémovým èasom)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "kµúè %08lX bol vytvorený %lu sekund v budúcnosti (do¹lo ke zmene èasu "
+#~ "alebo\n"
+#~ "je problém so systémovým èasom)\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "kµúè %08lX oznaèený ako absolútne dôveryhodný.\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr "podpis od podpisového kµúèa Elgamal %08lX po %08lX preskoèený\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr "podpis od %08lX po podpisový kµúè Elgamal %08lX preskoèený\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "kontrola v håbke %d podpísané=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Vyberte algoritmus.\n"
+#~ "\n"
+#~ "DSA (nazývaný tie¾ DSS) je algoritmus digitálneho podpisu, ktorý mô¾e "
+#~ "by»\n"
+#~ "pou¾itý len pre podpisy. Je to odporúèaný algoritmus, preto¾e overenie\n"
+#~ "DSA podpisov je oveµa rýchlej¹í ako v algoritme ElGamal.\n"
+#~ "\n"
+#~ "Algoritmus ElGamal mô¾e by» pou¾ívaný ako na podpisy tak na ¹ifrovanie.\n"
+#~ "©tandard OpenPGP rozli¹uje medzi dvoma re¾imami tohto algoritmu:\n"
+#~ "len ¹ifrovanie a ¹ifrovanie+podpis; v podstate je to rovnaké, ale "
+#~ "niekoµko\n"
+#~ "parametrov musí by» vybraných ¹peciálnym spôsobom pre vytvorenie "
+#~ "bezpeèného kµúèa\n"
+#~ "pre podpisy: tento program to vie, ale nie je vy¾adované, aby aj iné\n"
+#~ "implementácie OpenPGP pracovali v re¾ime podpis+¹ifrovanie.\n"
+#~ "\n"
+#~ "Prvý (primárny) kµúè musí by» v¾dy kµúè, ktorý je schopný podpisova»;\n"
+#~ "to je dôvod, preèo v tomto menu nie je k dispozícii kµúè algoritmu "
+#~ "ElGamal\n"
+#~ "urèený len na ¹ifrovanie."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Hoci sú tieto kµúèe definované v RFC2440, nie sú odporúèané,\n"
+#~ "preto¾e nie sú podporováné v¹etkými programami a podpisy nimi vytvorené\n"
+#~ "sú dos» veµké a na overenie veµmi pomalé."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "%lu kµúèov u¾ skontrolovaných (%lu podpisov)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "kµúè nekompletný\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "kµúè %08lX: nekompletný\n"
diff --git a/po/stamp-po b/po/stamp-po
new file mode 100644 (file)
index 0000000..9788f70
--- /dev/null
@@ -0,0 +1 @@
+timestamp
diff --git a/po/sv.gmo b/po/sv.gmo
new file mode 100644 (file)
index 0000000..63fadab
Binary files /dev/null and b/po/sv.gmo differ
diff --git a/po/sv.po b/po/sv.po
new file mode 100644 (file)
index 0000000..52e8049
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,7305 @@
+# Swedish messages for gnupg
+# Copyright (C) 1999 Free Software Foundation, Inc.
+#
+# Per Tunedal <info@clipanish.com>, 2004
+#
+# ===================================================
+# This a completely revised and extended translation.
+# All translations have been revised and updated 2002.
+# In 2004 new strings where translated and most errors
+# where corrected. The translations were checked for
+# consistency and some expressions where given new
+# translations.
+# 2004/12/01 Per Tunedal
+# ===================================================
+#
+# First translator Daniel Resare <daniel@resare.com>, 1999-2002,
+# who sends his thanks to André Dahlqvist <andre@beta.telenordia.se>
+# and to his wife Olivia <olivia@resare.com>. 
+#
+# $Id: sv.po 4365 2006-12-06 09:52:40Z wk $
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.2.6\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2004-12-01 17:49+0100\n"
+"Last-Translator: Per Tunedal <info@clipanish.com>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, fuzzy, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "kan inte skapa ett primtal med mindre än %d bitar\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "kan inte skapa ett primtal med mindre än %d bitar\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "ingen demon för entropisamling hittad\n"
+
+# se förra kommentaren
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "kan inte öppna \"%s\"\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "skriver hemlig nyckel till \"%s\"\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "kan inte öppna \"%s\": %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "kan inte ta status på \"%s\": %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "\"%s\" är inte än vanlig fil - ignorerad\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "Obs: filen random_seed är tom\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "VARNING: slumpkärnan har en felaktig storlek och används därför inte\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "kan inte läsa \"%s\": %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "Obs: random_seed uppdaterades inte\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "kan inte skapa \"%s\": %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "kan inte skriva till \"%s\": %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "kan inte stänga \"%s\": %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "VARNING: använder en osäker slumptalsgenerator!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Slumptalsgeneratorn är bara ett lappverk för att\n"
+"få programmet att fungera - den är inte på något sätt en\n"
+"stark slumptalsgenerator!\n"
+"\n"
+"ANVÄND INGEN DATA GENERERAD AV DETTA PROGRAM!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Vänta tills tillräckligt med entropi har samlats in. Fortsätt arbeta om\n"
+"det hindra dig att bli uttråkad, eftersom det förbättrar kvaliteten\n"
+"på entropin.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Otillräcklig mängd slumpdata tillgängliga. Jobba med andra saker\n"
+"en stund för att ge operativsystemet en chans att samla mer entropi!\n"
+"(Behöver %d fler byte)\n"
+
+#: g10/app-openpgp.c:596
+#, fuzzy, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "misslyckades med att initialisera tillitsdatabasen: %s\n"
+
+#: g10/app-openpgp.c:609
+#, fuzzy, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "misslyckades med att återskapa nyckelringscache: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "misslyckades med att radera nyckelblock: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr ""
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, fuzzy, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "Sändning till nyckelservern misslyckades: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr ""
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr ""
+
+#: g10/app-openpgp.c:1496
+#, fuzzy, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "Fel vid skapande av `%s': %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+#, fuzzy
+msgid "error reading application data\n"
+msgstr "fel vid läsning av nyckelblock: %s\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+#, fuzzy
+msgid "error reading fingerprint DO\n"
+msgstr "fel: ogiltigt fingeravtryck\n"
+
+#: g10/app-openpgp.c:1562
+#, fuzzy
+msgid "key already exists\n"
+msgstr "`%s' är redan komprimerad\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1568
+#, fuzzy
+msgid "generating new key\n"
+msgstr "generera ett nytt nyckelpar"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, fuzzy, c-format
+msgid "failed to store the key: %s\n"
+msgstr "misslyckades med att initialisera tillitsdatabasen: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1901
+#, fuzzy
+msgid "generating key failed\n"
+msgstr "Nyckelgenereringen misslyckades: %s\n"
+
+#: g10/app-openpgp.c:1904
+#, fuzzy, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "Nyckelgenereringen misslyckades: %s\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s signatur, sammandragsalgoritm %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr ""
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr ""
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ASCII-skal: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "felaktig rubrikrad i ASCII-skalet: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "rad i ASCII-skalet: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "felaktig rubrikrad i klartextsignatur\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "flera klartextsignaturer går in i varandra\n"
+
+#: g10/armor.c:620
+#, fuzzy
+msgid "unexpected armor: "
+msgstr "oväntat ASCII-skal:"
+
+# rader i klartexten som inleds med bindestreck får ett extra bindestreck vid klartextsignatur (för att lättare hitta "---- Begin ..."
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "felaktig rad som börjar med bindestreck: "
+
+# överhoppad eller hoppades över?
+#: g10/armor.c:786 g10/armor.c:1396
+#, fuzzy, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "hoppade över felaktigt radix64-tecken %02x \n"
+
+# CRC Cyclic Redundancy Checksum används för att upptäcka fel i ascii-skalet. Används allmänt, trots att det inte höjer säkerheten.
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "för tidigt filslut (ingen CRC-summa)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "för tidigt filslut (i CRC-summan)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "felformaterad CRC-summa\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, fuzzy, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC-fel; %06lx - %06lx\n"
+
+#: g10/armor.c:895
+#, fuzzy
+msgid "premature eof (in trailer)\n"
+msgstr "för tidigt filslut (i den avslutande raden)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "fel i avslutande rad\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "hittade ingen giltig OpenPGP-data.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "felaktigt ASCII-skal: raden är längre än %d tecken\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"tecken kodade enligt \"quoted printable\"-standarden funna i skalet - detta\n"
+"beror sannolikt på att en felaktig e-postserver eller e-postklient har "
+"använts\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, fuzzy, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "den hemliga nyckeln är inte tillgänglig"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr ""
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+#, fuzzy
+msgid "can't do this in batch mode\n"
+msgstr "kan inte göra detta i batch-läge\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Vad väljer du? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr ""
+
+#: g10/card-util.c:413
+#, fuzzy
+msgid "male"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "female"
+msgstr "enable"
+
+#: g10/card-util.c:414
+#, fuzzy
+msgid "unspecified"
+msgstr "Ingen anledning har angivits"
+
+#: g10/card-util.c:441
+#, fuzzy
+msgid "not forced"
+msgstr "inte behandlade"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr ""
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr ""
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr ""
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr ""
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr ""
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:581
+#, fuzzy
+msgid "URL to retrieve public key: "
+msgstr "ingen tillhörande öppen nyckel: %s\n"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "fel vid läsning av \"%s\": %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr ""
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr ""
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr ""
+
+#: g10/card-util.c:794
+#, fuzzy
+msgid "Language preferences: "
+msgstr "uppdaterat inställningar"
+
+#: g10/card-util.c:802
+#, fuzzy
+msgid "Error: invalid length of preference string.\n"
+msgstr "felaktigt tecken i inställningssträngen\n"
+
+#: g10/card-util.c:811
+#, fuzzy
+msgid "Error: invalid characters in preference string.\n"
+msgstr "felaktigt tecken i inställningssträngen\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr ""
+
+#: g10/card-util.c:846
+#, fuzzy
+msgid "Error: invalid response.\n"
+msgstr "fel: ogiltigt fingeravtryck\n"
+
+#: g10/card-util.c:867
+#, fuzzy
+msgid "CA fingerprint: "
+msgstr "visa fingeravtryck"
+
+#: g10/card-util.c:890
+#, fuzzy
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "fel: ogiltigt fingeravtryck\n"
+
+#: g10/card-util.c:938
+#, fuzzy, c-format
+msgid "key operation not possible: %s\n"
+msgstr "Nyckelgenereringen misslyckades: %s\n"
+
+#: g10/card-util.c:939
+#, fuzzy
+msgid "not an OpenPGP card"
+msgstr "hittade ingen giltig OpenPGP-data.\n"
+
+#: g10/card-util.c:948
+#, fuzzy, c-format
+msgid "error getting current key info: %s\n"
+msgstr "fel vid skrivning av hemliga nyckelringen \"%s\": %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr ""
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr ""
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+
+#: g10/card-util.c:1123
+#, fuzzy
+msgid "Please select the type of key to generate:\n"
+msgstr "Välj vilken typ av nyckel du vill ha:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr ""
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+#, fuzzy
+msgid "   (2) Encryption key\n"
+msgstr "   (%d) RSA (endast kryptering)\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr ""
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Felaktigt val.\n"
+
+#: g10/card-util.c:1203
+#, fuzzy
+msgid "Please select where to store the key:\n"
+msgstr "Välj anledning till att nyckeln spärras:\n"
+
+#: g10/card-util.c:1238
+#, fuzzy
+msgid "unknown key protection algorithm\n"
+msgstr "okänd krypteringsalgoritm\n"
+
+#: g10/card-util.c:1243
+#, fuzzy
+msgid "secret parts of key are not available\n"
+msgstr "De hemliga delarna av den huvudnyckeln är inte tillgängliga.\n"
+
+#: g10/card-util.c:1248
+#, fuzzy
+msgid "secret key already stored on a card\n"
+msgstr "hoppade över: hemlig nyckel finns redan\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "avsluta denna meny"
+
+#: g10/card-util.c:1321
+#, fuzzy
+msgid "show admin commands"
+msgstr "motstridiga kommandon\n"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "visa denna hjälp"
+
+#: g10/card-util.c:1324
+#, fuzzy
+msgid "list all available data"
+msgstr "Nyckeln tillgänglig hos: "
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr ""
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr ""
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr ""
+
+#: g10/card-util.c:1330
+#, fuzzy
+msgid "change the login name"
+msgstr "ändra utgångsdatum"
+
+# originalet borde ha ett value
+#: g10/card-util.c:1331
+#, fuzzy
+msgid "change the language preferences"
+msgstr "ändra ägartillitsvärdet"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr ""
+
+#: g10/card-util.c:1333
+#, fuzzy
+msgid "change a CA fingerprint"
+msgstr "visa fingeravtryck"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr ""
+
+#: g10/card-util.c:1335
+#, fuzzy
+msgid "generate new keys"
+msgstr "generera ett nytt nyckelpar"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr ""
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Kommando> "
+
+#: g10/card-util.c:1495
+#, fuzzy
+msgid "Admin-only command\n"
+msgstr "motstridiga kommandon\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr ""
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr ""
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Felaktigt kommando (försök med \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "den hemliga nyckeln är inte tillgänglig"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "misslyckades med att radera nyckelblock: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr ""
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr ""
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr ""
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr ""
+
+#: g10/cardglue.c:937
+#, fuzzy
+msgid "Repeat this PIN: "
+msgstr "Repetera lösenmeningen: "
+
+#: g10/cardglue.c:952
+#, fuzzy
+msgid "PIN not correctly repeated; try again"
+msgstr "lösenmeningen upprepades inte korrekt; försök igen."
+
+# se förra kommentaren
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "kan inte öppna \"%s\"\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output kan inte användas för detta kommando\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, fuzzy, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "hittade inte nyckeln  `%s': %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "fel vid läsning av nyckelblock: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(om du inte anger nyckeln med hjälp av fingeravtrycket)\n"
+
+#: g10/delkey.c:135
+#, fuzzy
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "kan inte göra så i batch-läge utan flaggan \"--yes\"\n"
+
+#: g10/delkey.c:147
+#, fuzzy
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Vill du ta bort denna nyckel från nyckelringen? "
+
+#: g10/delkey.c:155
+#, fuzzy
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Detta är en hemlig nyckel! - vill du verkligen ta bort den? "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "misslyckades med att radera nyckelblock: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "raderat information om ägartillit\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "det finns en hemlig nyckel tillhörande denna öppna nyckel!\"%s\"!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "använd flaggan \"--delete-secret-keys\"för att ta bort den först.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "fel vid skapandet av lösenmening: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "kan inte använda symmetriska ESK-paket pga S2K-läge\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "använderchiffer %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' är redan komprimerad\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "VARNING: \"%s\" är en tom fil\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"du kan endast kryptera till RSA nycklar som är högst 2048 bitar långa i --"
+"pgp2-läge\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "läser från \"%s\"\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "kan inte använda IDEA-kryptering för alla nycklar du krypterar till.\n"
+
+#: g10/encode.c:518
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"att genomdriva symmetrisk kryptering med %s (%d) strider mot mottagarnas "
+"inställningar\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"att genomdriva komprimeringsalgoritm %s (%d) strider mot mottagarens "
+"inställningar\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"att genomdriva symmetrisk kryptering med %s (%d) strider mot mottagarnas "
+"inställningar\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "du kan inte använda %s när du är i %s läge\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s krypterad för: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s krypterad data\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "krypterad med en okänd algoritm %d\n"
+
+# I vissa algoritmer kan svaga nycklar förekomma. Dessa ska inte användas.
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr ""
+"VARNING: meddelandet krypterades med en svag nyckel\n"
+"i den symmetriska krypteringen.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "problem vid hanteringen av krypterat paket\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "ingen körning av fjärrprogram stöds\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "%s: kan inte skapa katalog: %s\n"
+
+# Behörighet att komma åt inställningarna, tror jag. Inte behörigheter i inställningsfilen.
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"anrop av externa program är avstängt pga osäkra behörigheter för\n"
+"inställningsfilen\n"
+
+#: g10/exec.c:347
+#, fuzzy
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr "denna plattform kräver temp-filer vid anrop av externa program\n"
+
+#: g10/exec.c:425
+#, fuzzy, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "Kunde inte köra %s \"%s\": %s\n"
+
+#: g10/exec.c:428
+#, fuzzy, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "Kunde inte köra %s \"%s\": %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "systemfel när externa program anropades: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "externa program avslutades felaktigt\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "Kunde inte köra det externa programmet\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "kan inte läsa svaret från det externa programmet: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "VARNING: kan inte ta bort tempfil (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "VARNING: kunde inte ta bort temp-katalogen `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr ""
+"\n"
+"Signaturen kommer att markeras som icke möjlig att återkalla.\n"
+"\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "hittade inga spärrnycklar till `%s'\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "spärra en undernyckel"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "oanvändbar hemlig nyckel"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+#, fuzzy
+msgid "exporting secret keys not allowed\n"
+msgstr "skriver hemlig nyckel till \"%s\"\n"
+
+#: g10/export.c:354
+#, fuzzy, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "nyckeln %08lX är inte skyddad - hoppade över den\n"
+
+#: g10/export.c:362
+#, fuzzy, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "nyckeln %08lX: nyckel av PGP 2.x-typ - hoppade över den\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr ""
+"nyckel %08lX: signatur på undernyckel på fel plats - hoppade över "
+"signaturen\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "misslyckades med att initialisera tillitsdatabasen: %s\n"
+
+#: g10/export.c:565
+#, fuzzy, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "VARNING: hemliga nyckeln %08lX har ingen enkel SK-kontrollsumma\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "VARNING: exporterade ingenting\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Kommandon:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[fil]|skapa en signatur"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[fil]|skapa en klartext-signatur"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "skapa signatur i en separat fil"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "kryptera data"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "endast symmetrisk kryptering"
+
+# gnupg dekrypterar data om inget kommando anges dvs. kommandot "decrypt" behöver inte användas.
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "dekryptera data (standard)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "verifiera en signatur"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "visa en lista på nycklar"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "visa en lista på nycklar och signaturer"
+
+#: g10/gpg.c:394
+#, fuzzy
+msgid "list and check key signatures"
+msgstr "verifiera nyckelsignaturer"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "visa en lista på nycklar och fingeravtryck"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "visa en lista på hemliga nycklar"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "generera ett nytt nyckelpar"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "ta bort nycklar från den öppna nyckelringen"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "ta bort nycklar från den hemliga nyckelringen"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "signera en nyckel"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "signera en nyckel lokalt"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "signera eller redigera en nyckel"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "generera ett spärrcertifikat"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "exportera nycklar"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "exportera nycklar till en nyckelserver"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "importera nycklar från en nyckelserver"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "sök efter nycklar hos en nyckelserver"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "uppdatera alla nycklar nycklar från en nyckelserver"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "importera/slå ihop nycklar"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr ""
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr ""
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr ""
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "uppdatera tillitsdatabasen"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [filer]|skriv ut kontrollsummor"
+
+# Här bruksanvisning för kommandoraden. Resultatet har jag översatt med "inställningar", eftersom flaggorna även kan förekomma i en inställningsfil.
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Flaggor:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "skapa utdata med ett ascii-skal"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|NAMN|kryptera för NAMN"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "använd denna användaridentitet för att signera eller dekryptera"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|sätt kompressionsnivån till N (0 för att stänga av kompression)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "använd \"ursprunglig text\"-läget"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "använd som fil för utdata"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "utförlig"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "gör inga ändringar"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "Fråga före ersättning"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr ""
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr ""
+
+# inställningar istället för flaggor?
+# Nej, här är det bruksanvisningen för kommandoraden.
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Se manualsidan för en komplett lista på alla kommandon och flaggor)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Exempel:\n"
+"\n"
+"-se -r Bo [fil]             signera och kryptera för användaren Bo\n"
+"--clearsign [fil]           skapa en klartextsignatur\n"
+"--detach-sign [fil]         skapa signatur i en separat fil\n"
+"--list-keys [namn]          visa nycklar\n"
+"--fingerprint [namn]        visa fingeravtryck\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Rapportera gärna fel till <gnupg-bugs@gnu.org>.\n"
+"Rapportera gärna fel eller synpunkter på översättningen till <sv@li.org>.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Användning: gpg [flaggor] [filer] (-h för hjälp)"
+
+# Om inget kommando anges (decrypt/encrypt etc) väljs åtgärd efter indata.
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Syntax: gpg [flaggor] [filer]\n"
+"signera, kontrollera, kryptera eller dekryptera\n"
+"vilken operation som utförs beror på programmets indata\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Stödda algoritmer:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "öppen nyckel: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Chiffer: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Kontrollsumma: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Komprimering: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "användning: gpg [flaggor] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "motstridiga kommandon\n"
+
+# Vad betyder detta?
+#: g10/gpg.c:1064
+#, fuzzy, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "no = signatur hittad i gruppdefinitionen \"%s\"\n"
+
+#: g10/gpg.c:1261
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "VARNING: %s osäker ägare till %s\n"
+
+#: g10/gpg.c:1264
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "VARNING: %s osäker ägare till %s\n"
+
+#: g10/gpg.c:1267
+#, fuzzy, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "VARNING: %s osäker ägare till %s\n"
+
+#: g10/gpg.c:1273
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "WARNING: osäkra befogenheter för %s \"%s\"\n"
+
+#: g10/gpg.c:1276
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "WARNING: osäkra befogenheter för %s \"%s\"\n"
+
+#: g10/gpg.c:1279
+#, fuzzy, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "WARNING: osäkra befogenheter för %s \"%s\"\n"
+
+#: g10/gpg.c:1285
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "VARNING:  osäkert att infoga katalogägarskap till %s \"%s\"\n"
+
+#: g10/gpg.c:1288
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "VARNING:  osäkert att infoga katalogägarskap till %s \"%s\"\n"
+
+#: g10/gpg.c:1291
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "VARNING:  osäkert att infoga katalogägarskap till %s \"%s\"\n"
+
+#: g10/gpg.c:1297
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "VARNING:  osäkert att infoga katalogägarskap till %s \"%s\"\n"
+
+#: g10/gpg.c:1300
+#, fuzzy, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "VARNING:  osäkert att infoga katalogägarskap till %s \"%s\"\n"
+
+#: g10/gpg.c:1303
+#, fuzzy, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "VARNING:  osäkert att infoga katalogägarskap till %s \"%s\"\n"
+
+#: g10/gpg.c:1444
+#, fuzzy, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "okänt configurationspost \"%s\"\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Det finns ingen motsvarande signatur i den hemliga nyckelringen\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "visa vilken nyckelring den listade nyckeln hör till"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Det finns ingen motsvarande signatur i den hemliga nyckelringen\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "OBS: den gamla inställningsfilen \"%s\" används inte\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "OBS: inställningsfilen \"%s\" saknas\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "inställningsfil \"%s\": %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "läser inställningar från \"%s\"\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "OBS: %s är inte för normal användning!\n"
+
+#: g10/gpg.c:2236
+#, fuzzy, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "chiffertillägget \"%s\" laddades inte pga osäkra behörigheter\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "%s är ingen giltig teckentabell\n"
+
+#: g10/gpg.c:2491
+#, fuzzy, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "%s är ingen giltig teckentabell\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+#, fuzzy
+msgid "could not parse keyserver URL\n"
+msgstr "kunde inte tolka nyckelserver-URI\n"
+
+#: g10/gpg.c:2527
+#, fuzzy, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s: felaktiga exportinställningar %d\n"
+
+#: g10/gpg.c:2530
+#, fuzzy
+msgid "invalid keyserver options\n"
+msgstr "felaktiga exportinställningar\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s: felaktiga importinställningar %d\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "felaktiga importinställningar\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s: felaktiga exportinställningar %d\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "felaktiga exportinställningar\n"
+
+#: g10/gpg.c:2557
+#, fuzzy, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s: felaktiga importinställningar %d\n"
+
+#: g10/gpg.c:2560
+#, fuzzy
+msgid "invalid list options\n"
+msgstr "felaktiga importinställningar\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "%s är ingen giltig teckentabell\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "%s är ingen giltig teckentabell\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, fuzzy, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s: felaktiga exportinställningar %d\n"
+
+#: g10/gpg.c:2598
+#, fuzzy
+msgid "invalid verify options\n"
+msgstr "felaktiga exportinställningar\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "kunde inte sätta exec-sökvägen till %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s: felaktiga exportinställningar %d\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+# Programmet skapar en avbildning (image) av minnet för att lättare kunna spåra fel.
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "VARNING: programmet kan komma att skapa en minnesutskrift!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "VARNING: %s gäller istället för %s\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s är inte tillåten tillsammans med %s!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "det är ingen poäng att använda %s tillsammans med %s!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "kunde inte få tillgång till GPG-Agent i denna session\n"
+
+#: g10/gpg.c:2880
+#, fuzzy, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "skriver hemlig nyckel till \"%s\"\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr ""
+"du kan bara göra signaturer i en separat fil eller klartextsignaturer\n"
+"i --pgp2-läge\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "du kan inte signera och kryptera samtidigt i --pgp2-läge\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "du måste använda filer (och inte rör) i --pgp2-läge\n"
+
+# IDEA-algoritmen är patenterat i flera länder och finns därför inte med i GnuPG som standard.
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr ""
+"för att kryptera meddelanden i --pgp2-läge krävs IDEA-insticksprogrammet\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "den valda krypteringsalgoritmen är felaktig\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "den valda kontrollsummealgoritmen är felaktig\n"
+
+#: g10/gpg.c:2998
+#, fuzzy
+msgid "selected compression algorithm is invalid\n"
+msgstr "den valda krypteringsalgoritmen är felaktig\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "den valda kontrollsummealgoritmen är felaktig\n"
+
+# antalet betrodda signaturer som behövs (1-3) för att du ska lita på en nyckel du inte själv verifierat.
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "variabeln \"completes-needed\" måste ha ett värde som är större än 0\n"
+
+# antalet delvis betrodda signaturer som behövs (1-3) för att du ska lita på en nyckel du inte själv verifierat.
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "variabeln \"marginals-needed\" måste vara större än 1\n"
+
+# Hur djupt GnuPG ska leta i Web-of-trust.
+#: g10/gpg.c:3023
+#, fuzzy
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "variabeln \"max-cert-depth\" måste ha ett värde mellan 1 och 255\n"
+
+# Det är nivån för hurväl du har kontrollerat att nyckeln tillhör innehavaren.
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr ""
+"felaktigt standardvärde för certifieringsnivån; måste vara 0, 1, 2 eller 3\n"
+
+# Det är nivån för hurväl du har kontrollerat att nyckeln tillhör innehavaren.
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr ""
+"felaktigt minimivärde för certifieringsnivån; måste vara 0, 1, 2 eller 3\n"
+
+# S2K har med krypteringen av hemliga nyckeln att göra
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "OBS: enkelt S2K-läge (0) rekommenderas inte\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "felaktigt S2K-läge; måste vara 0, 1 eller 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "felaktiga standardinställningar\n"
+
+# Du kan ange de algoritmer du föredrar i prioritetsordning. Då avgör inte enbart standard (symmetrisk kryptering) eller mottagarens preferenser (kryptering till öppen nyckel).
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "felaktig inställning av vilka krypteringsalgoritmer du föredrar\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "felaktig inställning av vilka checksummealgoritmer du föredrar\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "felaktig inställning av vilka kompressionsalgoritmer du föredrar\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s fungerar ännu inte med  %s\n"
+
+#: g10/gpg.c:3138
+#, fuzzy, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "du kan inte använda chifferalgoritmen \"%s\" när du är i %s läge\n"
+
+#: g10/gpg.c:3143
+#, fuzzy, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "du kan inte använda sammandragsalgoritmen \"%s\" när du är i %s läge\n"
+
+#: g10/gpg.c:3148
+#, fuzzy, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr ""
+"du kan inte använda komprimeringsalgoritmen \"%s\" när du är i %s läge\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "misslyckades med att initialisera tillitsdatabasen: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"VARNING: Du har valt mottagare (-r) trots att symmetrisk kryptering valts\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [filnamn]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [filnamn]"
+
+#: g10/gpg.c:3281
+#, fuzzy, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "dekrypteringen misslyckades: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [filnamn]"
+
+#: g10/gpg.c:3304
+#, fuzzy
+msgid "--symmetric --encrypt [filename]"
+msgstr "--sign --encrypt [filnamn]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3309
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "du kan inte använda %s när du är i %s läge\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [filnamn]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [filnamn]"
+
+#: g10/gpg.c:3355
+#, fuzzy
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--sign --encrypt [filnamn]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr ""
+
+#: g10/gpg.c:3360
+#, fuzzy, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "du kan inte använda %s när du är i %s läge\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [filnamn]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [filnamn]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [filnamn]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key användaridentitet"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key användaridentitet"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key användaridentitet [kommandon]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [användaridentitet] [nyckelring]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "Sändning till nyckelservern misslyckades: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "Hämtning från nyckelservern misslyckades: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "Export av nyckeln misslyckades: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "Sökning på nyckelservern misslyckades: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "Uppdatering av  nyckeln från en nyckelserver misslyckades: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "misslyckades med att ta bort ASCII-skalet: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "misslyckades med att skapa ASCII-skal: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "felaktig kontrollsummealgoritm `%s'\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[filnamn]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "Skriv ditt meddelande här ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "den angivna URL som beskriver certifikationspolicy är felaktig\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n"
+
+#: g10/gpg.c:4197
+#, fuzzy
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "för många poster i pk-cachen - avstängd\n"
+
+#: g10/getkey.c:175
+#, fuzzy
+msgid "[User ID not found]"
+msgstr "[Hittade inte användaridentiteten]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, fuzzy, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "Ogiltig nyckel %08lX  tvingat giltig med --allow-non-selfsigned-uid\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, fuzzy, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"det finns ingen hemlig undernyckel tillhörande den öppna undernyckeln %08lX "
+"- hoppar över\n"
+
+#: g10/getkey.c:2611
+#, fuzzy, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "använder undernyckeln %08lX istället för huvudnyckeln %08lX\n"
+
+#: g10/getkey.c:2658
+#, fuzzy, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "nyckel %08lX: hemlig nyckel utan öppen nyckel - hoppade över den\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "var något tystare"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "ta nycklarna från denna nyckelring "
+
+# Med detta kommando ger gnupg enbart en varning när ett meddelande är tidsstämplat i framtiden. Annars avslutas gnupg med ett felmeddelande.
+# Kommandot är avsett att användas i "near online system".
+# Krav från RIPE.
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "utfärda enbart en varning när tidsstämpeln är orimlig"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|skriv statusinformation till denna FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Användning: gpgv [flaggor] [filer] (-h för hjälp)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Syntax: gpg [flaggor] [filer]\n"
+"Kolla signaturerna mot betrodda nycklar\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Det är upp till dig att ange ett värde här. Detta värde kommer aldrig att\n"
+"exporteras till någon tredje part. Vi behöver det för att implementera\n"
+"\"nätet av tillit\". Det har inget att göra med det (implicit skapade)\n"
+"nätet av certifikat."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"För att kunna bygga förtroendeväven \"Web-of-Trust\",\n"
+"måste GnuPG veta vilka nycklar som du litar förbehållslöst på\n"
+"- det är vanligen de nycklar som du disponerar den hemliga nyckeln för.\n"
+"Svara  \"ja\" för att markera att du litar förbehållslöst på denna nyckel.\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "Om du vill använda denna otillförlitliga nyckel ändå, svara \"ja\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Ange användaridentiteten till vilken du vill skicka meddelandet."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Som regel är det ingen bra idé att använda samma nyckel för signering\n"
+"och kryptering. Denna algoritm ska endast användas inom särskilda\n"
+"områden. Rådgör med din egen säkerhetsexpert first!"
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Ange storleken på nyckeln"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Svara \"ja\" eller \"nej\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"Ange värdet som krävs som det visas vid prompten.\n"
+"Det är möjligt att ange ett ISO-datum (ÅÅÅÅ-MM-DD) men du kommer\n"
+"inte att få något vettigt felmeddelande - istället kommer systemet\n"
+"att försöka tolka det angivna värdet som ett intervall."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Ange namnet på nyckelns ägare"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "ange en e-postadress. Detta är frivilligt, men rekommenderas varmt"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Ange en kommentar (frivilligt)"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  för att ändra namnet.\n"
+"C  för att ändra kommentaren.\n"
+"E  för att ändra e-postadressen.\n"
+"O  för att fortsätta med nyckelgenerering.\n"
+"Q  för att avsluta nyckelgenereringen."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Svara \"ja\" (eller bara \"j\") om du vill generera denna undernyckel."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"När du signerar ett användar-ID på en nyckel, måste du först kontrollera att "
+"nyckeln\n"
+"verkligen tillhör den person som nämns i användar-ID:t.  Det är viktigt för "
+"andra att\n"
+"få veta hur noga du har kontrollerat detta.\n"
+"\n"
+"\"0\" betyder att du inte påstår någonting om hur noga du "
+"kontrolleratnyckeln.\n"
+"\n"
+"\"1\" betyder att du tror att nyckeln tillhör den person som påstår sig göra "
+"det\n"
+"    men du kunde inte, eller ville inte kontrollera nyckeln alls.  Detta är "
+"användbartför\n"
+"    en \"persona\" kontroll, där du signerar nyckeln för en användare med "
+"pseudonym.\n"
+"\n"
+"\"2\" betyder att du gjorde viss kontroll av nyckeln. Det kan t.ex. betyda "
+"att\n"
+"    du kontrollerade fingeravtrycket och kontrollerade användar-ID:t för "
+"nyckeln\n"
+"    mot en fotolegitimation.\n"
+"\n"
+"\"3\" betyder att du gjorde en noggrann och uttömmande kontroll av nyckeln.  "
+"Detta kan t.ex.\n"
+"    betyda att du kontrollerade nyckelns fingeravtryck direkt med "
+"nyckelinnehavaren\n"
+"    och att du kontrollerade, med hjälp av svårförfalskade "
+"identitetsdokument\n"
+"a\n"
+"    med foto (tex ett körkort) att namnet på innehavaren stämmer med\n"
+"    namnet i användar-ID:t på nyckeln, och slutligen att du kontrollerade att"
+"(genom att utväxla\n"
+"    e-postmeddelanden) att e-postadressen på nyckeln tillhör "
+"nyckelinnehavaren.\n"
+"\n"
+"Obs! Ovanstående exempel för nivåerna 2 och 3 är bara förslag.\n"
+"Slutligen är det bara du själv som avgör vad \"viss\" and \"noggrann\"\n"
+"betyder när du signerar andras nycklar.\n"
+"\n"
+"Om du inte vet vad du ska svara, så svara \"0\"."
+
+# felstavat original meddelat till Werner.
+#: g10/helptext.c:186
+#, fuzzy
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "Svara \"ja\" om du vill signera ALLA användaridentiteter"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Svara \"ja\" om du verkligen vill ta bort denna användaridentitet.\n"
+"Alla certifikat kommer att gå förlorade!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Svara \"ja\" om du vill ta bort denna undernyckel"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Detta är en giltig signatur på nyckeln. Normalt sett vill du inte\n"
+"ta bort denna signatur eftersom den kan vara viktig för att skapa\n"
+"en tillitskoppling till nyckeln eller en annan nyckel som är\n"
+"certifierad av denna nyckel."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Denna signatur kan inte verifieras eftersom du inte har den\n"
+"motsvarande nyckeln. Du bör vänta med att ta bort den tills du\n"
+"vet vilken nyckel som användes eftersom den nyckeln kanske upprättar\n"
+"en tillitskoppling genom en annan redan certifierad nyckel."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr ""
+"Denna signatur är inte giltig. Det är rimligt att ta bort den från\n"
+"din nyckelring."
+
+# borde inge GnuPG bytas ut mot gpg eller ännu bättre %s?
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Detta är en signatur som knyter användaridentiteten till denna nyckel.\n"
+"Det är oftast inte en bra idé att ta bort en sådan signatur. Till\n"
+"och med kan det bli så att GnuPG kanske inte kan använda denna nyckel\n"
+"mer. Så gör bara detta om denna egensignatur av någon anledning är\n"
+"ogiltig och det finns en andra signatur som tillgänglig."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Ändra dina inställningar för alla användar-ID:n (eller enbart för en av de "
+"valda)\n"
+"till den aktuella listan på inställningar. Tidsstämplingen för alla "
+"påverkade\n"
+"egensignaturer kommer att flyttas fram en sekund.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Ange en lösenmening. Detta är en hemlig mening\n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Reptera lösenmeningen, så du är säker på vad du skrev in."
+
+# # felstavat/ologiskt original
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "Ange namnet på den fil signaturen gäller"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Svara \"ja\" om det du vill skriva över filen"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Ange ett nytt filnamn. Om du bara trycker RETUR kommer standarfilnamnet\n"
+"(som anges i hakparenteser) att användas."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Du borde ange en anledning till spärren. Beroende på sammanhanget\n"
+"har du möjlighet att välja från följande lista:\n"
+"  \"Nyckeln har tappat sin säkerhet\"\n"
+"     Använd denna om du har anledning att tro att icke auktoriserade "
+"personer\n"
+"     har fått tillgång till din hemliga nyckel.\n"
+"  \"Nyckeln har ersatts\"\n"
+"     Använd denna om du har ersatt denna nyckel med en nyare.\n"
+"  \"Nyckeln används inte längre\"\n"
+"     Använd denna om du har pensionerat denna nyckel.\n"
+"  \"Användaridentiteten är inte längre giltig\"\n"
+"     Använd denna för att visa att denna användaridentitet inte längre\n"
+"     skall användas. Detta används normalt för att visa att en e-postadress\n"
+"     är ogiltig.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"Om du vill kan du ange en text som beskriver varför du utfärdar\n"
+"detta spärrcertifikat (revocation certificate). Försök att hålla texten kort "
+"och koncis.\n"
+"En tom rad avslutar texten.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "Det finns ingen hjälp tillgänglig"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "Det finns ingen hjälp tillgänglig för \"%s\""
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "uppdatera tillitsdatabasen"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "den öppna nyckel passar inte ihop med den hemliga nyckeln!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "oanvändbar hemlig nyckel"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "hoppar över block av typen %d\n"
+
+#: g10/import.c:276
+#, fuzzy, c-format
+msgid "%lu keys processed so far\n"
+msgstr "har behandlat %lu nycklar hittills\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "  Totalt antal behandlade enheter: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "          överhoppade nya nycklar: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "         utan användaridentiteter: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                      importerade: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                      oförändrade: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "          nya användaridentiteter: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "                 nya undernycklar: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "                   nya signaturer: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "  nya spärrar av nycklar: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      antal lästa hemliga nycklar: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "antal importerade hemliga nycklar: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "antal oförändrade hemliga nycklar: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "                   inte importerade: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "                   nya signaturer: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "      antal lästa hemliga nycklar: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr ""
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Du har signerat följande användaridentiteter:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:620
+#, fuzzy, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "%s signatur, sammandragsalgoritm %s\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr ""
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+
+#: g10/import.c:721 g10/import.c:1119
+#, fuzzy, c-format
+msgid "key %s: no user ID\n"
+msgstr "nyckel %08lX: ingen användaridentitet\n"
+
+# Undernyckeln är skadad på HKP-servern. Vanligt fel vid många undernycklar.
+#: g10/import.c:750
+#, fuzzy, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "nyckeln %08lX: HKP-skadad undernyckel har reparerats!\n"
+
+# vad innebär fnutten i slutet?
+#: g10/import.c:765
+#, fuzzy, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr ""
+"nyckel %08lX: accepterade användaridentitet ID '%s' som saknar egensignatur\n"
+
+#: g10/import.c:771
+#, fuzzy, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "nyckel %08lX: inga giltiga användaridentiteter\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "detta kan bero på att det saknas en egensignatur\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, fuzzy, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "nyckel %08lX: hittade ingen öppen nyckel: %s\n"
+
+#: g10/import.c:789
+#, fuzzy, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "nyckel %08lX: ny nyckel - hoppade över den\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "hittade ingen nyckelring som gick att skriva till: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "skriver till \"%s\"\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "fel vid skrivning av nyckelringen \"%s\": %s\n"
+
+# fixme: I appended the %s -wk
+#: g10/import.c:826
+#, fuzzy, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "nyckel %08lX: importerade öppen nyckel \"%s\"\n"
+
+#: g10/import.c:850
+#, fuzzy, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "nyckel %08lX: matchar inte vår lokala kopia\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, fuzzy, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "nyckel %08lX: kan inte hitta det ursprungliga nyckelblocket: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, fuzzy, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "nyckel %08lX: kan inte läsa det ursprungliga nyckelblocket %s\n"
+
+#: g10/import.c:912
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "nyckel %08lX: \"%s\" 1 ny användaridentitet\n"
+
+#: g10/import.c:915
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "nyckel %08lX: \"%s\" %d nya användar-IDn\n"
+
+#: g10/import.c:918
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "nyckel %08lX: \"%s\" 1 ny signatur\n"
+
+#: g10/import.c:921
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "nyckel %08lX: \"%s\" %d nya signaturer\n"
+
+#: g10/import.c:924
+#, fuzzy, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "nyckel %08lX: \"%s\" 1 ny undernyckel\n"
+
+#: g10/import.c:927
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "nyckel %08lX: \"%s\" %d nya undernycklar\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "nyckel %08lX: \"%s\" %d nya signaturer\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "nyckel %08lX: \"%s\" %d nya signaturer\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "nyckel %08lX: \"%s\" %d nya användar-IDn\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "nyckel %08lX: \"%s\" %d nya användar-IDn\n"
+
+#: g10/import.c:962
+#, fuzzy, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "nyckel %08lX: \"%s\" inte ändrad\n"
+
+#: g10/import.c:1125
+#, fuzzy, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr ""
+"nyckel %08lX: hemlig nyckel med ogiltig krypteringsalgoritm %d - hoppade "
+"över den\n"
+
+#: g10/import.c:1136
+#, fuzzy
+msgid "importing secret keys not allowed\n"
+msgstr "skriver hemlig nyckel till \"%s\"\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "ingen hemlig nyckelring angiven som standard: %s\n"
+
+#: g10/import.c:1164
+#, fuzzy, c-format
+msgid "key %s: secret key imported\n"
+msgstr "nyckel %08lX: den hemliga nyckeln är importerad\n"
+
+#: g10/import.c:1194
+#, fuzzy, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "nyckel %08lX: finns redan i den hemliga nyckelringen\n"
+
+#: g10/import.c:1204
+#, fuzzy, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "nyckel %08lX: hittade inte den hemliga nyckeln: %s\n"
+
+#: g10/import.c:1234
+#, fuzzy, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"nyckel %08lX: öppen nyckel saknas - kan inte spärra nyckeln med "
+"spärrcertifikatet\n"
+
+#: g10/import.c:1277
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "nyckel %08lX: ogiltigt spärrcertifikat: %s - avvisat\n"
+
+#: g10/import.c:1309
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "nyckel %08lX: \"%s\" spärrcertifikat importerat\n"
+
+#: g10/import.c:1375
+#, fuzzy, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "nyckel %08lX: ingen användaridentitet för signaturen\n"
+
+# fixme: I appended the %s -wk
+#: g10/import.c:1390
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"nyckel %08lX: algoritmen för öppna nycklar stöds inte för användar-ID  \"%s"
+"\"\n"
+
+#: g10/import.c:1392
+#, fuzzy, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "nyckel %08lX: ogiltig egensignatur på användar-id \"%s\"\n"
+
+#: g10/import.c:1410
+#, fuzzy, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "nyckel %08lX: ingen undernyckel för nyckelbindning\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, fuzzy, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "nyckel %08lX: algoritmen för öppna nycklar stöds inte\n"
+
+#: g10/import.c:1423
+#, fuzzy, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "nyckel %08lX: ogiltig undernyckelbindning\n"
+
+#: g10/import.c:1438
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "nyckel %08lX: tog bort multipla bindningar av undernyckel\n"
+
+#: g10/import.c:1460
+#, fuzzy, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "nyckel %08lX: ingen undernyckel för spärr av nyckeln\n"
+
+#: g10/import.c:1473
+#, fuzzy, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "nyckel %08lX: ogiltig spärr av undernyckel\n"
+
+#: g10/import.c:1488
+#, fuzzy, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "nyckel %08lX: tog bort multipla spärrar av undernyckel\n"
+
+#: g10/import.c:1530
+#, fuzzy, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "nyckel %08lX: hoppade över användaridentitet '"
+
+#: g10/import.c:1551
+#, fuzzy, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "nyckel %08lX: hoppade över undernyckel\n"
+
+#: g10/import.c:1578
+#, fuzzy, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr ""
+"nyckel %08lX: icke exporterbar signatur (klass %02x) - hoppade över den\n"
+
+#: g10/import.c:1588
+#, fuzzy, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr ""
+"nyckel %08lX: spärrcertifikat på fel plats - hoppade över certifikatet\n"
+
+# nyckeln eller certifikatet??
+#: g10/import.c:1605
+#, fuzzy, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "nyckel %08lX: ogiltigt spärrcertifikat: %s - hoppade över det\n"
+
+#: g10/import.c:1619
+#, fuzzy, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr ""
+"nyckel %08lX: signatur på undernyckel på fel plats - hoppade över "
+"signaturen\n"
+
+# nyckeln eller klassen?
+#: g10/import.c:1627
+#, fuzzy, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr ""
+"nyckel %08lX: oväntad signaturklass  (0x%02X) - hoppade över signaturen\n"
+
+#: g10/import.c:1727
+#, fuzzy, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr ""
+"nyckel %08lX: användaridentitet hittades flera gånger - slog ihop till en\n"
+
+#: g10/import.c:1789
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "VARNING: nyckeln %08lX kan ha spärrats: Hämtar spärrnyckel %08lX\n"
+
+#: g10/import.c:1803
+#, fuzzy, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "VARNING: nyckeln %08lX kan ha spärrats: Spärrnyckeln %08lX saknas.\n"
+
+#: g10/import.c:1862
+#, fuzzy, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "nyckel %08lX: \"%s\" spärrcertifikat importerat\n"
+
+#: g10/import.c:1896
+#, fuzzy, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "nyckel %08lX: lagt till direkt nyckelsignatur\n"
+
+#: g10/import.c:2285
+#, fuzzy
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "den öppna nyckel passar inte ihop med den hemliga nyckeln!\n"
+
+#: g10/import.c:2293
+#, fuzzy
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "hoppade över: hemlig nyckel finns redan\n"
+
+#: g10/import.c:2295
+#, fuzzy
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "hoppade över: hemlig nyckel finns redan\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "fel vid skapande av nyckelringen \"%s\": %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "%s: nyckelring skapad\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "Fel vid skapande av `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "misslyckades med att återskapa nyckelringscache: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[spärrad]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[egensignatur]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 felaktig signatur\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d felaktiga signaturer\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 signatur verifierades inte eftersom nyckeln saknades\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "%d signaturer verifierades inte eftersom nycklar saknades\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 signatur verifierades inte eftersom ett fel uppstod\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d signaturer verifierades inte eftersom fel uppstod\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 användaridentitet utan giltig egensignatur hittades\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d användaridentiteter utan giltig egensignatur hittades\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+#, fuzzy
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Var god bestäm hur mycket du litar på denna användare\n"
+"när det gäller att korrekt verifiera andra användares nycklar\n"
+"(genom att undersöka pass, undersöka fingeravtryck från olika\n"
+"källor...)?\n"
+"\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, fuzzy, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Jag litar marginellt på denna användare\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, fuzzy, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Jag litar fullständigt på denna användare\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr ""
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Användar-ID \"%s\" är spärrat."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Vill du verkligen fortfarande signera den? (j/N)"
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  Kan inte signera.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Giltighetstiden för nvändar-ID \"%s\" har gått ut.."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Användar-ID \"%s\" saknar egensignatur."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Användar-ID \"%s\" saknar egensignatur."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Vill du verkligen signera? "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"Egensignaturen på \"%s\"\n"
+"är en signatur av PGP 2.x-typ.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Will du göra om den till en egensignatur av OpenPGP-typ? (j/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"Giltighetstiden för din nuvarande signatur på \"%s\"\n"
+"har gått ut.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Vill du skapa en ny signatur som ersätter den vars giltighetstid gått ut? (J/"
+"n) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"Din nuvarande signatur på \"%s\"\n"
+"är en lokal signatur.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "Vill du ändra den till en fullständigt exporterbar signatur? (j/N) "
+
+#: g10/keyedit.c:780
+#, fuzzy, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" var redan signerad lokalt av nyckeln %08lX\n"
+
+#: g10/keyedit.c:783
+#, fuzzy, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" var redan signerad av nyckeln %08lX\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Vill du verkligen signera den igen ändå?(j/N)"
+
+#: g10/keyedit.c:810
+#, fuzzy, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "Det finns inget att signera med nyckeln %08lX\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Giltighetstiden för denna nyckel har gått ut!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Denna nyckels giltighetstid går ut vid %s.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr ""
+"Vill du att giltighetstiden för signaturen ska upphöra vid samma tid? (J/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"Du kan inte göra en OpenPGP-signatur på en PGP 2.x-nyckel när du är i --pgp2-"
+"läge\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Detta skulle göra nyckeln oanvändbar i PGP 2.x.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Hur noga har du kontrollerat att nyckeln du ska signera verkligen tillhör\n"
+"personen som nämns ovan?  Om du inte vet vad du ska svara, svara \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr ""
+"     (0) Jag vill inte ange hur noga jag har kontrollerat identiteten.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "     (1) Jag har inte kontrollerat identiteten alls.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "     (2) Jag har gjort viss kontroll av identiteten.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "     (3) Jag har gjort en noggrann kontroll av identiteten.%s\n"
+
+#: g10/keyedit.c:933
+#, fuzzy
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Ditt val? (skriv '?' för mer information): "
+
+#: g10/keyedit.c:957
+#, fuzzy, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Är du verkligen säker på att du vill signera denna nyckel\n"
+"med din nyckel: \""
+
+#: g10/keyedit.c:964
+#, fuzzy
+msgid "This will be a self-signature.\n"
+msgstr ""
+"\n"
+"Detta kommer att bli en egensignatur\n"
+
+#: g10/keyedit.c:970
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"VARNING: signaturen kommer att markeras som exporterbar.\n"
+"\n"
+
+#: g10/keyedit.c:978
+#, fuzzy
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"VARNING: Signaturen kommer att markeras som möjlig att spärra.\n"
+"\n"
+
+#: g10/keyedit.c:988
+#, fuzzy
+msgid "The signature will be marked as non-exportable.\n"
+msgstr ""
+"\n"
+"Signaturen kommer att markeras som icke exporterbar.\n"
+"\n"
+
+#: g10/keyedit.c:995
+#, fuzzy
+msgid "The signature will be marked as non-revocable.\n"
+msgstr ""
+"\n"
+"Signaturen kommer att markeras som icke möjlig att återkalla.\n"
+"\n"
+
+#: g10/keyedit.c:1002
+#, fuzzy
+msgid "I have not checked this key at all.\n"
+msgstr ""
+"\n"
+"Jag har inte kontrollerat identiteten alls.\n"
+
+#: g10/keyedit.c:1007
+#, fuzzy
+msgid "I have checked this key casually.\n"
+msgstr ""
+"\n"
+"Jag har gjort viss kontroll av identiteten.\n"
+
+#: g10/keyedit.c:1012
+#, fuzzy
+msgid "I have checked this key very carefully.\n"
+msgstr ""
+"\n"
+"Jag har gjort en noggrann kontroll av identiteten.\n"
+
+#: g10/keyedit.c:1022
+#, fuzzy
+msgid "Really sign? (y/N) "
+msgstr "Vill du verkligen signera? "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "signeringen misslyckades: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Denna nyckel är inte skyddad.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "De hemliga delarna av den huvudnyckeln är inte tillgängliga.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+#, fuzzy
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "De hemliga delarna av den huvudnyckeln är inte tillgängliga.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Nyckeln är skyddad.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Kan inte redigera denna nyckel: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Skriv in den nya lösenmening för denna hemliga nyckel.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "lösenmeningen upprepades inte korrekt; försök igen."
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Du vill inte ha någon lösenmening - detta är sannolikt en *dålig* idé!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+#, fuzzy
+msgid "Do you really want to do this? (y/N) "
+msgstr "Vill du verkligen göra detta? "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "flyttar en nyckelsignatur till den rätta platsen\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "spara och avsluta"
+
+#: g10/keyedit.c:1362
+#, fuzzy
+msgid "show key fingerprint"
+msgstr "visa fingeravtryck"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "visa en lista på nycklar och användaridentiteter"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "välj användaridentitet N"
+
+#: g10/keyedit.c:1366
+#, fuzzy
+msgid "select subkey N"
+msgstr "välj användaridentitet N"
+
+#: g10/keyedit.c:1367
+#, fuzzy
+msgid "check signatures"
+msgstr "återkalla signaturer"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+
+#: g10/keyedit.c:1377
+#, fuzzy
+msgid "sign selected user IDs locally"
+msgstr "signera nyckeln lokalt"
+
+#: g10/keyedit.c:1379
+#, fuzzy
+msgid "sign selected user IDs with a trust signature"
+msgstr "Tips: Välj de användarID:n du vill signera\n"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "lägg till en användaridentitet"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "lägg till ett foto som användaridentitet"
+
+#: g10/keyedit.c:1389
+#, fuzzy
+msgid "delete selected user IDs"
+msgstr "ta bort en användaridentitet"
+
+#: g10/keyedit.c:1394
+#, fuzzy
+msgid "add a subkey"
+msgstr "addkey"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr ""
+
+#: g10/keyedit.c:1406
+#, fuzzy
+msgid "delete selected subkeys"
+msgstr "ta bort en undernyckel"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "lägg till en spärrnyckel"
+
+#: g10/keyedit.c:1410
+#, fuzzy
+msgid "delete signatures from the selected user IDs"
+msgstr ""
+"Vill du verkligen ändra inställningarna för de valda användaridentiteterna? "
+
+#: g10/keyedit.c:1412
+#, fuzzy
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "Du kan inte ändra giltighetsdatum för en v3-nyckel\n"
+
+#: g10/keyedit.c:1414
+#, fuzzy
+msgid "flag the selected user ID as primary"
+msgstr "markera användaridentiteten som huvudidentitet"
+
+#: g10/keyedit.c:1416
+#, fuzzy
+msgid "toggle between the secret and public key listings"
+msgstr "hoppa mellan att visa en lista på hemliga eller öppna nycklar"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "visa en lista på  inställningar (expertläge)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "visa en lista på inställningar (utförligt)"
+
+#: g10/keyedit.c:1423
+#, fuzzy
+msgid "set preference list for the selected user IDs"
+msgstr ""
+"Vill du verkligen ändra inställningarna för de valda användaridentiteterna? "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "kunde inte tolka nyckelserver-URI\n"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr ""
+"Vill du verkligen ändra inställningarna för de valda användaridentiteterna? "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "ändra lösenmening"
+
+# originalet borde ha ett value
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "ändra ägartillitsvärdet"
+
+#: g10/keyedit.c:1438
+#, fuzzy
+msgid "revoke signatures on the selected user IDs"
+msgstr "Vill du verkligen spärra alla valda användaridentiteter? "
+
+#: g10/keyedit.c:1440
+#, fuzzy
+msgid "revoke selected user IDs"
+msgstr "spärra en användaridentitet"
+
+#: g10/keyedit.c:1445
+#, fuzzy
+msgid "revoke key or selected subkeys"
+msgstr "spärra en undernyckel"
+
+#: g10/keyedit.c:1446
+#, fuzzy
+msgid "enable key"
+msgstr "aktivera en nyckel"
+
+#: g10/keyedit.c:1447
+#, fuzzy
+msgid "disable key"
+msgstr "stäng av en nyckel"
+
+#: g10/keyedit.c:1448
+#, fuzzy
+msgid "show selected photo IDs"
+msgstr "visa foto-ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, fuzzy, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "fel vid läsning av hemligt nyckelblock\"%s\": %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Den hemliga nyckeln finns tillgänglig.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Den hemliga nyckeln behövs för att göra detta.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "Använd kommandot \"toggle\" först.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Nyckeln är spärrad."
+
+#: g10/keyedit.c:1755
+#, fuzzy
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Vill du verkligen signera alla användaridentiteter? "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "Tips: Välj de användarID:n du vill signera\n"
+
+#: g10/keyedit.c:1771
+#, fuzzy, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "okänd signaturklass"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "Detta kommando är inte tillåtet när du är i %s-läge.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "Du måste välja åtminstone en användaridentitet.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Du kan inte ta bort den sista användaridentiteten!\n"
+
+#: g10/keyedit.c:1820
+#, fuzzy
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "Vill du verkligen ta bort alla valda användaridentiteter? "
+
+#: g10/keyedit.c:1821
+#, fuzzy
+msgid "Really remove this user ID? (y/N) "
+msgstr "Vill du verkligen ta bort denna användaridentitet? "
+
+#: g10/keyedit.c:1871
+#, fuzzy
+msgid "Really move the primary key? (y/N) "
+msgstr "Vill du verkligen radera denna egensignatur? (j/N)"
+
+#: g10/keyedit.c:1883
+#, fuzzy
+msgid "You must select exactly one key.\n"
+msgstr "Du måste välja åtminstone en nyckel.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr ""
+
+#: g10/keyedit.c:1925
+#, fuzzy, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "kan inte öppna \"%s\": %s\n"
+
+#: g10/keyedit.c:1942
+#, fuzzy, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "fel vid skapande av nyckelringen \"%s\": %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "Du måste välja åtminstone en nyckel.\n"
+
+#: g10/keyedit.c:1969
+#, fuzzy
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Vill du verkligen ta bort valda nycklar? "
+
+#: g10/keyedit.c:1970
+#, fuzzy
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Vill du verkligen ta bort denna nyckel? "
+
+#: g10/keyedit.c:2005
+#, fuzzy
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "Vill du verkligen spärra alla valda användaridentiteter? "
+
+#: g10/keyedit.c:2006
+#, fuzzy
+msgid "Really revoke this user ID? (y/N) "
+msgstr "Vill du verkligen spärra denna användaridentitet? "
+
+#: g10/keyedit.c:2024
+#, fuzzy
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "Vill du verkligen spärra denna nyckel? "
+
+#: g10/keyedit.c:2035
+#, fuzzy
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "Vill du verkligen spärra de valda nycklarna? "
+
+#: g10/keyedit.c:2037
+#, fuzzy
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "Vill du verkligen spärra denna nyckel? "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+
+#: g10/keyedit.c:2129
+#, fuzzy
+msgid "Set preference list to:\n"
+msgstr "ange inställningslista"
+
+#: g10/keyedit.c:2135
+#, fuzzy
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Vill du verkligen ändra inställningarna för de valda användaridentiteterna? "
+
+#: g10/keyedit.c:2137
+#, fuzzy
+msgid "Really update the preferences? (y/N) "
+msgstr "Vill du verkligen ändra inställningarna?"
+
+#: g10/keyedit.c:2205
+#, fuzzy
+msgid "Save changes? (y/N) "
+msgstr "Spara ändringarna? "
+
+#: g10/keyedit.c:2208
+#, fuzzy
+msgid "Quit without saving? (y/N) "
+msgstr "Avsluta utan att spara? "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "uppdateringen misslyckades: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "misslyckades med att uppdatera hemligheten: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Nyckeln är oförändrad så det behövs ingen uppdatering.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Sammandrag: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Funktioner: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr ""
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr ""
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Notering: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr ""
+"Du kan inte ange några inställningar för ett användar-ID av PGP 2.x-typ.\n"
+
+#: g10/keyedit.c:2689
+#, fuzzy, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "Denna nyckel kan spärras av nyckeln %s"
+
+#: g10/keyedit.c:2710
+#, fuzzy, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "Denna nyckel kan spärras av nyckeln %s"
+
+#: g10/keyedit.c:2716
+#, fuzzy
+msgid "(sensitive)"
+msgstr " (känsligt)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, fuzzy, c-format
+msgid "created: %s"
+msgstr "kan inte skapa %s: %s\n"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, fuzzy, c-format
+msgid "revoked: %s"
+msgstr "[spärrad]"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, fuzzy, c-format
+msgid "expired: %s"
+msgstr "[går ut: %s]"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, fuzzy, c-format
+msgid "expires: %s"
+msgstr "[går ut: %s]"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr ""
+
+#: g10/keyedit.c:2756
+#, fuzzy, c-format
+msgid "trust: %s"
+msgstr " tillit: %c/%c"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr ""
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Denna nyckel har stängts av"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr ""
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Obs! Den visade nyckelgiltigheten kan vara felaktig\n"
+"om du inte startar om programmet.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+#, fuzzy
+msgid "revoked"
+msgstr "[spärrad]"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+#, fuzzy
+msgid "expired"
+msgstr "expire"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"VARNING: ingen användaridentitet har markerats som huvudidentitet.\n"
+"Detta kommando kan göra att ett annat användar-ID antas\n"
+"vara huvudidentitet.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"VARNING: Detta är en nyckel av PGP2-typ.  Om du lägger till ett foto- ID kan "
+"vissa versioner\n"
+"         av PGP avvisa denna nyckel.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Vill du verkligen fortfarande lägga till den? (j/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "Du kan inte lägga till ett fofo-ID till en nyckel av PGP 2-typ.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Vill du radera denna korrekta signatur? (j/N/a)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Vill du radera denna ogiltiga signatur? (j/N/a)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Vill du radera denna okända signatur? (j/N/a)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Vill du verkligen radera denna egensignatur? (j/N)"
+
+# skulle lika gärna kunna heta 1 signatur va?
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "Raderade %d signatur.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "Raderade %d signaturer.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Ingenting raderat.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "felaktigt skal"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Användar-ID \"%s\" är spärrat."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Användar-ID \"%s\" är spärrat."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Användar-ID \"%s\" är spärrat."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "Användar-ID \"%s\" är redan spärrad\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "Användar-ID \"%s\" är redan spärrad\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"VARNING: Detta är en PGP 2-nyckel. Om du anger en spärrnyckel kan denna "
+"nyckel inte användas i vissa versioner av PGP.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "Du får inte ange en spärrnyckel för en PGP 2-nyckel.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "Ange användar-ID för spärrnyckeln: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "det går inte att använda en PGP 2-nyckel som spärrnyckel\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "Du kan inte ange en nyckel som sin egen spärrnyckel\n"
+
+#: g10/keyedit.c:3439
+#, fuzzy
+msgid "this key has already been designated as a revoker\n"
+msgstr "VARNING: Denna nyckel har spärrats med sin spärrnyckel!\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "VARNING: det går aldrig att ändra om du utser en spärrnyckel!\n"
+
+# designated = angiven (utnämnd, utpekad, bestämd, utsedd, avsedd, angiven, designerad)
+#: g10/keyedit.c:3464
+#, fuzzy
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"Är du verkligen säker på att du vill utse denna nyckel till spärrnyckel? (j/"
+"N): "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Tag bort markeringar från de hemliga nycklarna.\n"
+
+#: g10/keyedit.c:3531
+#, fuzzy
+msgid "Please select at most one subkey.\n"
+msgstr "Välj som högst en undernyckel.\n"
+
+#: g10/keyedit.c:3535
+#, fuzzy
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Ändrar giltighetstid för en undernyckel.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Ändrar giltighetstid för huvudnyckeln.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Du kan inte ändra giltighetsdatum för en v3-nyckel\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Det finns ingen motsvarande signatur i den hemliga nyckelringen\n"
+
+# Vad betyder det?
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "VARNING: Signeringsundernyckeln %08lX är inte korscertifierad\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Du måste välja bara en användaridentitet.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, fuzzy, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "hoppar över v3 egensignatur på användar-id \"%s\"\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr ""
+
+# Obs! Syftar på bildfilen med ditt foto. Meddelandet visas om du valt en mycket stor fil.
+#: g10/keyedit.c:4131
+#, fuzzy
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Vill du verkligen använda det (j/N)?"
+
+# Obs! Syftar på bildfilen med ditt foto. Meddelandet visas om du valt en mycket stor fil.
+#: g10/keyedit.c:4132
+#, fuzzy
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Vill du verkligen använda det (j/N)?"
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "Signaturnotering: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Skriv över (j/N)? "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "Ingen användaridentitet med index %d\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "Ingen användaridentitet med index %d\n"
+
+#: g10/keyedit.c:4492
+#, fuzzy, c-format
+msgid "No subkey with index %d\n"
+msgstr "Ingen användaridentitet med index %d\n"
+
+#: g10/keyedit.c:4627
+#, fuzzy, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "användaridentitet: \""
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, fuzzy, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr ""
+"\"\n"
+"signerad med din nyckel %08lX %s\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr "  (icke exporterbar)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Denna signatur gick ut den %s.\n"
+
+# nyckel? signatur?
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Vill du verkligen spärra denna nyckel? (j/N)"
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "Vill du skapa ett spärrcertifikat för denna signatur? (j/N)"
+
+#: g10/keyedit.c:4671
+#, fuzzy, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Du har signerat följande användaridentiteter:\n"
+
+#: g10/keyedit.c:4697
+#, fuzzy
+msgid " (non-revocable)"
+msgstr "  (icke exporterbar)"
+
+#: g10/keyedit.c:4704
+#, fuzzy, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "   spärrad av %08lX %s\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Du står i begrepp att återkalla dessa signaturer:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "Vill du verkligen skapa spärrcertifikatet? (y/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "ingen hemlig nyckel\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "Användar-ID \"%s\" är redan spärrad\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr ""
+"VARNING: en signatur på ett användar-ID är daterad %d sekunder in i "
+"framtiden\n"
+
+#: g10/keyedit.c:4927
+#, fuzzy, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Användar-ID \"%s\" är redan spärrad\n"
+
+#: g10/keyedit.c:4989
+#, fuzzy, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Användar-ID \"%s\" är redan spärrad\n"
+
+#: g10/keyedit.c:5084
+#, fuzzy, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "Visar %s foto-ID med storleken %ld för nyckeln 0x%08lX (uid %d)\n"
+
+#: g10/keygen.c:262
+#, fuzzy, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "inställningen %c%lu förekommer flera gånger\n"
+
+#: g10/keygen.c:269
+#, fuzzy
+msgid "too many cipher preferences\n"
+msgstr "för många `%c' inställningar\n"
+
+#: g10/keygen.c:271
+#, fuzzy
+msgid "too many digest preferences\n"
+msgstr "för många `%c' inställningar\n"
+
+#: g10/keygen.c:273
+#, fuzzy
+msgid "too many compression preferences\n"
+msgstr "för många `%c' inställningar\n"
+
+#: g10/keygen.c:398
+#, fuzzy, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "felaktigt tecken i inställningssträngen\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "skriver direkt signatur\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "skriver egensignatur\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "skriver signatur knuten till nyckeln\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "felaktig nyckelstorlek; använder %u bitar\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "nyckelstorleken avrundad uppåt till %u bitar\n"
+
+#: g10/keygen.c:1323
+#, fuzzy
+msgid "Sign"
+msgstr "sign"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+#, fuzzy
+msgid "Encrypt"
+msgstr "kryptera data"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr ""
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr ""
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr ""
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr ""
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr ""
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr ""
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr ""
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr ""
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Välj vilken typ av nyckel du vill ha:\n"
+
+#: g10/keygen.c:1435
+#, fuzzy, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA och ElGamal (standardvalet)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (endast signering)\n"
+
+#: g10/keygen.c:1438
+#, fuzzy, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (endast signering)\n"
+
+#: g10/keygen.c:1440
+#, fuzzy, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (endast kryptering)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (endast signering)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (endast kryptering)\n"
+
+#: g10/keygen.c:1445
+#, fuzzy, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (endast kryptering)\n"
+
+#: g10/keygen.c:1514
+#, fuzzy, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA-nyckelparet kommer att ha 1024 bitar.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr ""
+
+#: g10/keygen.c:1531
+#, fuzzy, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "Vilken nyckelstorlek vill du ha? (1024) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr ""
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "Den efterfrågade nyckelstorleken är %u bitar\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "avrundade uppåt till %u bitar\n"
+
+# borde kolla upp möjligheterna i källkoden att använda v m å istället för wmy
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Specificera hur länge nyckeln skall vara giltig.\n"
+"         0 = nyckeln blir aldrig ogiltig\n"
+"      <n>  = nyckeln blir ogiltig efter n dagar\n"
+"      <n>w = nyckeln blir ogiltig efter n veckor\n"
+"      <n>m = nyckeln blir ogiltig efter n månader\n"
+"      <n>y = nyckeln blir ogiltig efter n år\n"
+
+# borde kolla upp möjligheterna i källkoden att använda v m å istället för wmy
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Specificera hur länge nyckeln skall vara giltig.\n"
+"         0 = signaturen blir aldrig ogiltig\n"
+"      <n>  = signaturen blir ogiltig efter n dagar\n"
+"      <n>w = signaturen blir ogiltig efter n veckor\n"
+"      <n>m = signaturen blir ogiltig efter n månader\n"
+"      <n>y = signaturen blir ogiltig efter n år\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "För hur lång tid ska nyckeln vara giltig? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "För hur lång tid ska signaturen vara giltig? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "felaktigt värde\n"
+
+#: g10/keygen.c:1674
+#, fuzzy
+msgid "Key does not expire at all\n"
+msgstr "Giltighetstiden för %s går aldrig ut\n"
+
+#: g10/keygen.c:1675
+#, fuzzy
+msgid "Signature does not expire at all\n"
+msgstr "Giltighetstiden för %s går aldrig ut\n"
+
+#: g10/keygen.c:1680
+#, fuzzy, c-format
+msgid "Key expires at %s\n"
+msgstr "Giltighetstiden för %s går ut vid följande tidpunkt: %s\n"
+
+#: g10/keygen.c:1681
+#, fuzzy, c-format
+msgid "Signature expires at %s\n"
+msgstr "Giltighetstiden för signaturen går ut %s\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Ditt system kan inte visa datum senare än år 2038.\n"
+"Datum fram till år 2106 kommer dock att hanteras korrekt.\n"
+
+#: g10/keygen.c:1692
+#, fuzzy
+msgid "Is this correct? (y/N) "
+msgstr "Stämmer detta (j/n)? "
+
+#: g10/keygen.c:1715
+#, fuzzy
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Du behöver en användaridentitet för att identifiera din nyckel; mjukvaran\n"
+"konstruerar en användaridentitet från namn, kommentar och e-postadress\n"
+"enligt följande form: \n"
+"     \"Gustav Vasa (Brutal kung) <gustav@trekronor.se>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Namn: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Felaktigt tecken i namnet\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Namnet får inte börja med en siffra\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Namnet måste vara åtminstone 5 tecken långt\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "E-postadress: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "E-postadressen är ogiltig\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Kommentar: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Felaktigt tecken i kommentaren\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "Du använder teckenuppsättningen \"%s\"\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Du valde följande användaridentitet:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "Ange inte e-postadressen som namn eller kommentar\n"
+
+# Ej solklart vad förkortningarna står för
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnKkEeOoAa"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "Ändra (N)amn, (K)ommentar, (E)post eller (A)vsluta? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "Ändra (N)amn, (K)ommentar, (E)post eller (O)k/(A)vsluta? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Rätta först felet\n"
+
+# fel kapitalisering i originalet?
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"Du behöver en lösenmening för att skydda din hemliga nyckel\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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ösenmening - det är sannolikt en *dålig* idé!\n"
+"Jag kommer att göra det ändå. Du kan ändra din lösenmening när som helst\n"
+"om du använder detta program med flaggan \"--edit-key\".\n"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Vi behöver generera ett stor mängd slumpmässig data. Det är en bra idé\n"
+"att göra något annat (skriva på tangentbordet, röra musen, använda\n"
+"hårddisken) under primtalsgenereringen; detta ger slumptalsgeneratorn\n"
+"en större chans att samla ihop en tillräcklig mängd entropi.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Skapandet av nycklar avbröts.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "skriver den öppna nyckeln till \"%s\"\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, fuzzy, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "skriver hemlig nyckel till \"%s\"\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "skriver hemlig nyckel till \"%s\"\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "hittade ingen öppen nyckelring att skriva till: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "hittade ingen hemlig nyckelring som gick att skriva till: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "fel vid skrivning av öppna nyckelringen \"%s\": %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "fel vid skrivning av hemliga nyckelringen \"%s\": %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "den öppna och den  hemliga nyckeln är skapade och signerade.\n"
+
+#: g10/keygen.c:3106
+#, fuzzy
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Observera att denna nyckel inte kan användas för kryptering. Du kommer\n"
+"kanske att vilja använda kommandot \"--edit-key\" för att skapa en\n"
+"undernyckel för detta syfte.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Nyckelgenereringen misslyckades: %s\n"
+
+# c-format behövs inte i singularis
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"nyckeln är skapad %lu sekund in i framtiden (problemet är\n"
+"relaterat till tidsresande eller en felställd klocka)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"nyckeln är skapad %lu sekunder in i framtiden (problemet är\n"
+"relaterat till tidsresande eller en felställd klocka)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "OBS: att skapa undernycklar till v3-nycklar bryter mot OpenPGP\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+#, fuzzy
+msgid "Really create? (y/N) "
+msgstr "Vill du verkligen skapa? "
+
+#: g10/keygen.c:3509
+#, fuzzy, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "misslyckades med att radera nyckelblock: %s\n"
+
+#: g10/keygen.c:3556
+#, fuzzy, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "kan inte skapa \"%s\": %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr ""
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "aldrig"
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Viktig signaturpolicy: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "Signaturpolicy: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr ""
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Viktig signaturnotation: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "Signaturnotering: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Nyckelring"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Huvudnyckelns fingeravtryck:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "    Undernyckelns fingeravtryck:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "Huvudnyckelns fingeravtryck:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "     Undernyckelns fingeravtryck:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+#, fuzzy
+msgid "      Key fingerprint ="
+msgstr "Nyckelns fingeravtryck ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr ""
+
+#: g10/keyring.c:1246
+#, fuzzy, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "misslyckades med att skapa ASCII-skal: %s\n"
+
+# Enligt Werner uppstår detta om något går snett när den hemliga nyckeln uppdateras.
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "VARNING: det finns 2 filer med konfidentiell information.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s är den oförändrade\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s är den nya\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Lös detta potentiella säkerhetsproblem\n"
+
+#: g10/keyring.c:1376
+#, fuzzy, c-format
+msgid "caching keyring `%s'\n"
+msgstr "kontrollerar nyckelringen `%s'\n"
+
+#: g10/keyring.c:1422
+#, fuzzy, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "%lu nycklar och %lu signaturer har kontrollerats\n"
+
+#: g10/keyring.c:1434
+#, fuzzy, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu nycklar och %lu signaturer har kontrollerats\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: nyckelring skapad\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "den angivna URL som beskriver signaturpolicy är felaktig\n"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, fuzzy, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr ""
+"VARNING: inställningar i `%s' är ännu inte aktiva under denna körning\n"
+
+#: g10/keyserver.c:523
+#, fuzzy
+msgid "disabled"
+msgstr "disable"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr ""
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr ""
+
+#: g10/keyserver.c:906
+#, fuzzy, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "hittade inte nyckeln  `%s': %s\n"
+
+#: g10/keyserver.c:908
+#, fuzzy
+msgid "key not found on keyserver\n"
+msgstr "hittade inte nyckeln  `%s': %s\n"
+
+#: g10/keyserver.c:1145
+#, fuzzy, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "begär nyckel %08lX från %s\n"
+
+#: g10/keyserver.c:1149
+#, fuzzy, c-format
+msgid "requesting key %s from %s\n"
+msgstr "begär nyckel %08lX från %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "söker \"%s\" från HKP-server %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "söker \"%s\" från HKP-server %s\n"
+
+#: g10/keyserver.c:1329
+#, fuzzy, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "söker \"%s\" från HKP-server %s\n"
+
+#: g10/keyserver.c:1333
+#, fuzzy, c-format
+msgid "sending key %s to %s\n"
+msgstr "begär nyckel %08lX från %s\n"
+
+#: g10/keyserver.c:1376
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "söker \"%s\" från HKP-server %s\n"
+
+#: g10/keyserver.c:1379
+#, fuzzy, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "söker \"%s\" från HKP-server %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+#, fuzzy
+msgid "no keyserver action!\n"
+msgstr "nyckelserverfel"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr ""
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr ""
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr ""
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr ""
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr ""
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr ""
+
+#: g10/keyserver.c:1543
+#, fuzzy
+msgid "keyserver timed out\n"
+msgstr "nyckelserverfel"
+
+#: g10/keyserver.c:1548
+#, fuzzy
+msgid "keyserver internal error\n"
+msgstr "nyckelserverfel"
+
+#: g10/keyserver.c:1557
+#, fuzzy, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "Hämtning från nyckelservern misslyckades: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr ""
+
+#: g10/keyserver.c:1875
+#, fuzzy, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "VARNING: kan inte ta bort tempfil (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1897
+#, fuzzy, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "begär nyckel %08lX från %s\n"
+
+#: g10/keyserver.c:1899
+#, fuzzy, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "begär nyckel %08lX från %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "VARNING: kan inte ta bort tempfil (%s) `%s': %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "VARNING: kan inte ta bort tempfil (%s) `%s': %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "egendomlig storlek på en krypterad sessionsnyckel (%d)\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s  krypterad sessionsnyckel\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "lösenmening skapad  med okänd sammandragsalgoritm %d\n"
+
+#: g10/mainproc.c:382
+#, fuzzy, c-format
+msgid "public key is %s\n"
+msgstr "den öppna nyckeln är %08lX\n"
+
+# Men jag ändrade så det blev närmare originalet. Per
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "Data krypterat till öppen nyckel: Giltig DEK\n"
+
+#: g10/mainproc.c:472
+#, fuzzy, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "krypterad med %u-bitars %s-nyckel, ID %08lX, skapad %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr ""
+
+#: g10/mainproc.c:480
+#, fuzzy, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "krypterad med %s-nyckel, ID %08lX\n"
+
+# Motsatsen till kryptering med symmetrisk nyckel.
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "öppen nyckel-dekryptering misslyckades: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "krypterad med %lu lösenmeningar\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "krypterad med with 1 lösenmening\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "antar att %s krypterade data\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"IDEA-kryptering inte installerad. Optimistiskt försök att använda %s "
+"istället\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "dekrypteringen lyckades\n"
+
+# Äldre krypteringalgoritmer skapar ingen mdc dvs. "minisignatur" som skyddar mot att delar av den krypterade texten byts ut/tas bort. Alla nya 128-bitars algoritmer använder mdc: AES, AES192, AES256, BLOWFISH.
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "VARNING: detta meddelande var inte integritetsskyddat\n"
+
+# Meddelandet innebär alltså att kontrollen av mdc visade att meddelandet förändrats/manipulerats sedan det krypterades. Block kan ha tagits bort eller bytts ut.
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "VARNING: det krypterade meddelandet har ändrats!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "dekrypteringen misslyckades: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "OBS: avsändaren begärde \"endast-för-dina-ögon\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "ursprungligt filnamn=\"%.*s\"\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"fristående spärrcertifikat - använd \"gpg --import\" för\n"
+"att applicera\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "Korrekt signatur från \""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "signaturen verifierades inte\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "kan inte hantera dessa multipla signaturer\n"
+
+#: g10/mainproc.c:1519
+#, fuzzy, c-format
+msgid "Signature made %s\n"
+msgstr "Giltighetstiden för signaturen har upphört %s\n"
+
+#: g10/mainproc.c:1520
+#, fuzzy, c-format
+msgid "               using %s key %s\n"
+msgstr "      även känd som \""
+
+#: g10/mainproc.c:1524
+#, fuzzy, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "Signerades %.*s med hjälp av %s-nyckeln med ID %08lX\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Nyckeln tillgänglig hos: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, fuzzy, c-format
+msgid "BAD signature from \"%s\""
+msgstr "FELAKTIG signatur från \""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, fuzzy, c-format
+msgid "Expired signature from \"%s\""
+msgstr "Giltighetstiden har upphört för signatur från \""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, fuzzy, c-format
+msgid "Good signature from \"%s\""
+msgstr "Korrekt signatur från \""
+
+# Visas vid ogiltig signatur:
+# Eftersom signaturen är ogiltig kan man inte vara säker på att angivet namn och nyckel-id är riktigt.
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[osäkert]"
+
+#: g10/mainproc.c:1765
+#, fuzzy, c-format
+msgid "                aka \"%s\""
+msgstr "      även känd som \""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Giltighetstiden för signaturen har upphört %s\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Giltighetstiden för signaturen går ut %s\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s signatur, sammandragsalgoritm %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "binär"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "textläge"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "okänd"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "Kan inte verifiera signaturen: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "detta är inte någon signatur i en separat fil\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr ""
+"VARNING: multipla signaturer upptäckta. Endast den första kommer att "
+"kontrolleras.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "fristående signatur av klassen 0x%02x\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "signatur av den gamla (PGP 2.x) typen\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "felaktigt rotpaket hittades i proc_tree()\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "kan inte stänga av minnesutskrifter: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr ""
+
+#: g10/misc.c:207
+#, fuzzy, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "tillitsdatabas: läsning misslyckades (n=%d): %s\n"
+
+#: g10/misc.c:316
+#, fuzzy, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "kan inte hantera algoritm %d för öppna nycklar\n"
+
+#: g10/misc.c:331
+#, fuzzy, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "krypteringsalgorimten är inte införd"
+
+#: g10/misc.c:346
+#, fuzzy, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "%s signatur, sammandragsalgoritm %s\n"
+
+#: g10/misc.c:351
+#, fuzzy, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "VARNING: inställningen \"%s\" är föråldrad\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "Insticksprogram för IDEA-kryptering är inte installerat\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " i = visa mer information\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: alternativet är föråldrat\"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "VARNING: inställningen \"%s\" är föråldrad\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "Använd \"%s%s\" istället\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "VARNING: inställningen \"%s\" är föråldrad\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Okomprimerad"
+
+#: g10/misc.c:732
+#, fuzzy
+msgid "uncompressed|none"
+msgstr "Okomprimerad"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "detta meddelande kanske inte kan användas av %s\n"
+
+#: g10/misc.c:1017
+#, fuzzy, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "läser inställningar från \"%s\"\n"
+
+#: g10/misc.c:1042
+#, fuzzy, c-format
+msgid "unknown option `%s'\n"
+msgstr "den förvalda mottagaren \"%s\" är okänd\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "Filen \"%s\" finns. "
+
+#: g10/openfile.c:90
+#, fuzzy
+msgid "Overwrite? (y/N) "
+msgstr "Skriv över (j/N)? "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: okänt suffix\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Ange nytt filnamn"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "skriver till standard ut\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "antar att signera data finns i filen \"%s\"\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "ny konfigurationsfil `%s'skapad\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"VARNING: inställningar i `%s' är ännu inte aktiva under denna körning\n"
+
+#: g10/openfile.c:424
+#, fuzzy, c-format
+msgid "directory `%s' created\n"
+msgstr "%s: katalog skapad\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "kan inte hantera algoritm %d för öppna nycklar\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "VARNING: potentiellt osäker symmetriskt krypterad sessionsnyckel\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "underpaket av typen %d har den bit satt som markerar den som kritisk\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "kunde inte få tillgång till GPG-Agent i denna session\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "miljövariabeln GPG_AGENT_INFO är felformaterad\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "GPG-Agent protokoll version %d stöds inte\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "kan inte ansluta till \"%s\": %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "problem med GPG-Agent, stänger av den\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, fuzzy, c-format
+msgid " (main key ID %s)"
+msgstr " (huvudnyckelns identitet %08lX)"
+
+#: g10/passphrase.c:546
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"Du behöver en lösenmening för att låsa upp den hemliga nyckeln för\n"
+"användaren: \"%.*s\"\n"
+"%u-bitars %s-nyckel, ID %08lX, skapad %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Repetera lösenmeningen\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Ange lösenmening\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "avbruten av användaren\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+#, fuzzy
+msgid "can't query passphrase in batch mode\n"
+msgstr "kan inte fråga efter lösenmening i batch-läge\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Ange lösenmening: "
+
+#: g10/passphrase.c:895
+#, fuzzy, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"\n"
+"Du behöver en lösenmening för att låsa upp den hemliga nyckeln för\n"
+"användaren: \""
+
+#: g10/passphrase.c:901
+#, fuzzy, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u-bits  %s-nyckel, ID %08lX, skapad %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr ""
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Repetera lösenmeningen: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Välj en bild att använda som ditt foto-ID. Bilden måste vara en JPEG-fil.\n"
+"Kom ihåg att bilden sparas inuti din öppna nyckel: Om du väljer\n"
+"en mycket stor bild, så blir din nyckel också väldigt stor!\n"
+"Försök att använda en bild som har ungefär  formatet 240x288 pixlar.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Skriv JPEG-filnamnet för foto-ID: "
+
+#: g10/photoid.c:116
+#, fuzzy, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "Kan inte öppna fotot \"%s\": %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr ""
+
+# Obs! Syftar på bildfilen med ditt foto. Meddelandet visas om du valt en mycket stor fil.
+#: g10/photoid.c:129
+#, fuzzy
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Vill du verkligen använda det (j/N)?"
+
+#: g10/photoid.c:146
+#, fuzzy, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "\"%s\" är inte en  JPEG-fil\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Är detta foto korrekt (j/N/a)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "kan inte visa foto-ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Ingen anledning har angivits"
+
+# tveksam översättning. funderar på "ersatt av något bättre" men det
+# känns inte heller bra. Betyder att nyckeln inte används längre, utan användaren har skapat en ny nyckel som ersätter den gamla.
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Nyckeln är ersatt"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Nyckeln har tappat sin säkerhet"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Nyckeln används inte längre"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Användaridentiteten är inte längre giltig"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "anledning till spärren: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "spärrkommentar: "
+
+# ej kristallklart vad förkortningarna står för
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMaAsS"
+
+#: g10/pkclist.c:214
+#, fuzzy
+msgid "No trust value assigned to:\n"
+msgstr ""
+"Inget tillitsvärde tilldelat till:\n"
+"%4u%c/%08lX %s \""
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr ""
+
+#: g10/pkclist.c:256
+#, fuzzy
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"%08lX: Det finns inget som tyder på att signaturen verkligen tillhör "
+"ägaren.\n"
+
+#: g10/pkclist.c:271
+#, fuzzy, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = Vet inte\n"
+
+#: g10/pkclist.c:273
+#, fuzzy, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = Jag litar INTE på denna användare\n"
+
+#: g10/pkclist.c:279
+#, fuzzy, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Jag litar förbehållslöst på denna användare\n"
+
+#: g10/pkclist.c:285
+#, fuzzy
+msgid "  m = back to the main menu\n"
+msgstr " m = gå tillbaka till huvudmenyn\n"
+
+#: g10/pkclist.c:288
+#, fuzzy
+msgid "  s = skip this key\n"
+msgstr " s = hoppa över denna nyckel\n"
+
+#: g10/pkclist.c:289
+#, fuzzy
+msgid "  q = quit\n"
+msgstr "a = avsluta\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Vad väljer du? "
+
+#: g10/pkclist.c:320
+#, fuzzy
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "Vill du verkligen ge denna nyckel förbehållslöst förtroende? "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Certifikat som leder till en nyckel med förbehållslöst förtroende:\n"
+
+#: g10/pkclist.c:419
+#, fuzzy, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Det finns inget som tyder på att signaturen verkligen tillhör "
+"ägaren.\n"
+
+#: g10/pkclist.c:424
+#, fuzzy, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%08lX: Det finns inget som tyder på att signaturen verkligen tillhör "
+"ägaren.\n"
+
+#: g10/pkclist.c:430
+#, fuzzy
+msgid "This key probably belongs to the named user\n"
+msgstr "Denna nyckel tillhör sannolikt ägaren\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Denna nyckel tillhör oss\n"
+
+#: g10/pkclist.c:461
+#, fuzzy
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Det är INTE säkert att nyckeln tillhör den uppgivna personen. Om du\n"
+"*verkligen* vet vad du gör, kan du svara ja på nästa fråga\n"
+"\n"
+
+#: g10/pkclist.c:468
+#, fuzzy
+msgid "Use this key anyway? (y/N) "
+msgstr "Vill du använda nyckeln trots det? "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "VARNING: Använder en nyckel som inte är betrodd!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "VARNING: denna nyckel kan ha spärrats: Spärrnyckeln saknas.\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "VARNING: Denna nyckel har spärrats med sin spärrnyckel!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "VARNING: Denna nyckel har spärrats av sin ägare!\n"
+
+#: g10/pkclist.c:522
+#, fuzzy
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Detta kan betyda att signaturen är en förfalskning.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "VARNING: Denna undernyckel har spärrats av sin ägare!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Obs: Denna nyckel har stängts av.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Obs: Giltighetstiden för denna nyckel har gått ut!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "VARNING: Denna nyckel är inte certifierad med en pålitlig signatur!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr ""
+"         Det finns inget som indikerar att signaturen tillhör ägaren.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "VARNING: Vi litar INTE på denna nyckel!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Signaturen är sannolikt en FÖRFALSKNING.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"VARNING: Denna nyckel är inte certifierad med signaturer med ett\n"
+"tillräckligt högt tillitsvärde!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Det är inte säkert att signaturen tillhör ägaren.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: hoppade över: %s\n"
+
+# överhoppad?
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "hoppade över %s: öppen nyckel finns redan\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr ""
+"Du specificerade ingen användaridentitet. (du kan använda \"-r\") för detta\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr ""
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Skriv användar-ID.  Avsluta med en tom rad: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Hittade inte användaridentiteten.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "hoppade över: den öppna nyckeln är redan satt som förvald mottagare\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Den öppna nyckeln är avstängd.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "hoppade över: öppen nyckel redan angiven\n"
+
+#: g10/pkclist.c:1034
+#, fuzzy, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "den förvalda mottagaren \"%s\" är okänd\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "hoppade över %s: den öppna nyckeln är avstängd\n"
+
+# plural av adressee
+# dvs. den som meddelandet är adresserat till.
+# Åtskillnad görs mellan adressee och receiver.
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "inga giltiga adressater\n"
+
+#: g10/plaintext.c:91
+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"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "Fel vid skapande av `%s': %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Signatur i en separat fil.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Ange namnet på datafilen: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "läser från standard in ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "ingen signerad data\n"
+
+# se förra kommentaren
+#: g10/plaintext.c:538
+#, fuzzy, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "kan inte öppna \"%s\"\n"
+
+#: g10/pubkey-enc.c:104
+#, fuzzy, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonym mottagare; försöker med den hemliga nyckeln %08lX ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "ok, vi är den hemliga mottagaren.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "gammal kodning av krypteringsnyckeln stöds inte\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "krypteringsalgoritmen %d%s är okänd eller avstängd\n"
+
+#: g10/pubkey-enc.c:282
+#, fuzzy, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "OBS: krypteringsalgoritmen %d finns inte i inställningarna\n"
+
+#: g10/pubkey-enc.c:302
+#, fuzzy, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "OBS: den hemliga nyckeln %08lX gick ut %s\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "OBS: nyckeln har spärrats"
+
+# Vad?
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet misslyckades: %s\n"
+
+#: g10/revoke.c:147
+#, fuzzy, c-format
+msgid "key %s has no user IDs\n"
+msgstr "nyckel %08lX: ingen användaridentitet\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Att spärras av:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Detta är en känslig spärrnyckel)\n"
+
+#: g10/revoke.c:316
+#, fuzzy
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "Vill du skapa ett spärrcertifikat för denna nyckel?"
+
+# --force översatt med:
+# genomdriv (använd alltid?)
+# -do-not-force översatt med:
+# genomdriv inte
+# I detta fall gäller det ett revokeringscertifikat, som gnupg alltid skapar i ASCII-format för att det ska gå att skriva ut.
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "utdata med ett ascii-skal genomdrivet.\n"
+
+# Vad menas???
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet misslyckades: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Spärrcertifikat skapat.\n"
+
+#: g10/revoke.c:413
+#, fuzzy, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "hittade inga spärrnycklar till `%s'\n"
+
+#: g10/revoke.c:471
+#, fuzzy, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "den hemliga nyckeln `%s' hittades inte: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "ingen tillhörande öppen nyckel: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "den öppna nyckel passar inte ihop med den hemliga nyckeln!\n"
+
+#: g10/revoke.c:518
+#, fuzzy
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "Vill du skapa ett spärrcertifikat för denna nyckel?"
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "okänd krypteringsalgoritm\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "OBS: Denna nyckel är oskyddad!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Spärrcertifikat skapat.\n"
+"\n"
+"Var vänlig flytta det till ett media du kan gömma; om Mallory får\n"
+"får tillgång till detta certificate kan han göra din nyckel oanvändbar.\n"
+"Det är klokt att skriva ut detta certifikat och gömma det, ifall ditt\n"
+"media blir oläsligt.  Men se upp:  Utskriftsfunktionen på\n"
+"din dator kan spara data så att det blir åtkomligt för andra!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Välj anledning till att nyckeln spärras:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Troligen vill du välja %d här)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "Ange en beskrivning (frivilligt); avsluta med en tom rad:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Anledning till spärren: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(Ingen beskrivning angiven)\n"
+
+#: g10/revoke.c:723
+#, fuzzy
+msgid "Is this okay? (y/N) "
+msgstr "Är detta OK?"
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "de hemliga nyckeldelarna är inte tillgänliga\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "skyddsalgoritmen %d%s stöds inte\n"
+
+# Skyddssammandraget låter underligt
+# Kontrollsumma?
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "skyddssammandraget %d stöds inte\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Fel lösenmening; försök igen!"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+# För vissa krypteringsalgoritmer är det känt att vissa svaga nycklar kan förekomma. Dessa ska aldrig användas. GnuPG vill på detta sätt hindra dig från att skapa en sådan nyckel.
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "VARNING: Upptäckte en svag nyckel - byt lösenmening igen.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"skapar den föråldrade 16-bit kontrollsumman för skydd av den hemliga "
+"nyckeln\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "skapade en svag nyckel - försöker igen\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"kan inte undvika en svag nyckel för symmetrisk kryptering; försökte\n"
+"%d gånger!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "VARNING: konflikt mellan signatursammandrag i meddelandet\n"
+
+# Vad betyder det?
+#: g10/sig-check.c:101
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "VARNING: Signeringsundernyckeln %08lX är inte korscertifierad\n"
+
+# cross-certification?
+#: g10/sig-check.c:113
+#, fuzzy, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"VARNING signeringsundernyckel  %08lX har en ogiltig korscertiifiering\n"
+
+# behövs verkligen c-format här?
+#: g10/sig-check.c:181
+#, fuzzy, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "den öppna nyckeln %08lX är %lu sekund nyare än signaturen\n"
+
+#: g10/sig-check.c:182
+#, fuzzy, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "den öppna nyckeln %08lX är %lu sekunder nyare än signaturen\n"
+
+# c-format behövs inte i singularis
+#: g10/sig-check.c:193
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"nyckeln är skapad %lu sekund in i framtiden (problemet är\n"
+"relaterat till tidsresande eller en felställd klocka)\n"
+
+#: g10/sig-check.c:195
+#, fuzzy, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"nyckeln är skapad %lu sekunder in i framtiden (problemet är\n"
+"relaterat till tidsresande eller en felställd klocka)\n"
+
+#: g10/sig-check.c:205
+#, fuzzy, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "OBS: signaturnyckeln %08lX, gick ut vid %s\n"
+
+#: g10/sig-check.c:287
+#, fuzzy, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"antar att signaturen gjord med nyckel %08lX är felaktig eftersom en okänd "
+"kritisk bit är satt\n"
+
+#: g10/sig-check.c:544
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "nyckel %08lX: ingen undernyckel till paket för spärr av undernyckel\n"
+
+#: g10/sig-check.c:570
+#, fuzzy, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+"nyckel %08lX: ingen undernyckel till signatur för bindning av undernyckel\n"
+
+# notation data?
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr ""
+"kan inte lägga till noteringar i signaturer gjorda med en v3-nyckel\n"
+"(PGP 2.x-typ)\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr ""
+"kan inte lägga till noteringar i nyckelsignaturer signaturer gjorda med en "
+"v3-nyckel (PGP 2.x-typ)\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"VARNING: kan inte %%-expandera anteckning (för stor).  Använder den utan "
+"expansion.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "kan inte ange en policy-URL i v3 (PGP 2.x style) signaturer\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr ""
+"kan inte lägga till en policy-URL i signaturer gjorda med en v3-nyckel (PGP "
+"2.x-typ)\n"
+
+#: g10/sign.c:145
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"VARNING: kan inte %%-expandera policy-url (för stor).  Använder den utan "
+"expansion.\n"
+
+#: g10/sign.c:173
+#, fuzzy, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"VARNING: kan inte %%-expandera policy-url (för stor).  Använder den utan "
+"expansion.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "försök att verifiera den skapade signaturen misslyckades: %s\n"
+
+#: g10/sign.c:356
+#, fuzzy, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s signatur från: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"du kan bara skapa signaturer i en separat fil med nycklar av PGP 2.x-typ\n"
+"när du är i --pgp2-läge\n"
+
+#: g10/sign.c:862
+#, fuzzy, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"att genomdriva komprimeringsalgoritm %s (%d) strider mot mottagarens inst?"
+"llningar\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "signerar:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"du kan bara göra klartextsignaturer med en PGP 2.x-nyckel\n"
+"när du är i --pgp2-läge\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "krypteringen %s kommer att användas\n"
+
+# Slumptalsgenerator: Random Number Generator
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr ""
+"nyckeln är inte markerad som osäker - det går inte att använda den med "
+"fejkad slumptalsgenerator!\n"
+
+#: g10/skclist.c:159
+#, fuzzy, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "hoppade över \"%s\": förekommer flera gånger\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, fuzzy, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "hoppade över  `%s': %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "hoppade över: hemlig nyckel finns redan\n"
+
+#: g10/skclist.c:187
+#, fuzzy
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr ""
+"hoppade över  `%s': detta är en nyckel av ElGamal-typ genererad av PGP\n"
+"som inte är säker för signaturer!\n"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "tillitspost: %lu, typ %d: kunde inte skriva: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Skapat lista över tilldelade tillitsvärden %s\n"
+"# (Använd \"gpg --import-ownertrust\" för att återställa dem)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, fuzzy, c-format
+msgid "error in `%s': %s\n"
+msgstr "fel vid läsning av \"%s\": %s\n"
+
+#: g10/tdbdump.c:160
+#, fuzzy
+msgid "line too long"
+msgstr "raden är för lång\n"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ""
+
+#: g10/tdbdump.c:174
+#, fuzzy
+msgid "invalid fingerprint"
+msgstr "fel: ogiltigt fingeravtryck\n"
+
+#: g10/tdbdump.c:179
+#, fuzzy
+msgid "ownertrust value missing"
+msgstr "importera värden som representerar ägartillit"
+
+#: g10/tdbdump.c:215
+#, fuzzy, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "fel vid sökning av tillitsvärde: %s\n"
+
+#: g10/tdbdump.c:219
+#, fuzzy, c-format
+msgid "read error in `%s': %s\n"
+msgstr "läsfel:  %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "tillitsdatabas: synkronisering misslyckades: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "tillitsdatabasposten %lu: lseek misslyckades: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "tillitsdatabasposten %lu: skrivning misslyckades (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "tillitsdatabastransaktion för stor\n"
+
+#: g10/tdbio.c:498
+#, fuzzy, c-format
+msgid "can't access `%s': %s\n"
+msgstr "kan inte stänga \"%s\": %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: katalogen finns inte!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, fuzzy, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "%s: kan inte skapa katalog: %s\n"
+
+# se förra kommentaren
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, fuzzy, c-format
+msgid "can't lock `%s'\n"
+msgstr "kan inte öppna \"%s\"\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: misslyckades med att skapa versionspost: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: ogiltig tillitsdatabas skapad\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: tillitsdatabas skapad\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "OBS: det går inte att skriva till tillitsdatabasen\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: ogiltig tillitsdatabas\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: misslyckades med att skapa kontrollsummetabell: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: fel vid uppdatering av versionspost: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: fel vid läsning av versionspost: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: fel vid skrivning av versionspost: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "tillitsdatabas: lseek misslyckades: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "tillitsdatabas: läsning misslyckades (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: detta är inte en tillitsdatabasfil\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: versionspost med postnummer %lu\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: ogiltig filversion %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: fel vid läsning av ledig post: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: fel vid läsning av katalogpost: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: misslyckades med att nollställa en post: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: misslyckades med att lägga till en post: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "tillitsdatabasen är trasig, kör \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "kan inte hantera text med rader längre än %d tecken\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "indataraden är längre än %d tecken\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "%s ?r ingen giltig teckentabell\n"
+
+# trusted??
+#: g10/trustdb.c:258
+#, fuzzy, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "nyckel %08lX: accepterad som betrodd nyckel\n"
+
+#: g10/trustdb.c:296
+#, fuzzy, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "nyckel %08lX förekommer mer än en gång i tillitsdatabasen\n"
+
+# nyckeln?
+#: g10/trustdb.c:311
+#, fuzzy, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "nyckel %08lX: hittade ingen motsvarande öppen nyckel - överhoppad\n"
+
+#: g10/trustdb.c:321
+#, fuzzy, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "Nyckeln har förbehållslöst förtroende.\n"
+
+# req står för request
+# kollat med Werner. Per
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "tillitspost %lu, begäran av typ %d: kunde inte läsa: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "tillitsvärdet %lu är inte av begärd typ %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+#, fuzzy
+msgid "[ revoked]"
+msgstr "[spärrad]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+#, fuzzy
+msgid "[ expired]"
+msgstr "[Giltighetstiden har gått ut]"
+
+#: g10/trustdb.c:513
+#, fuzzy
+msgid "[ unknown]"
+msgstr "okänd"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr ""
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr ""
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr ""
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr ""
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr ""
+
+#: g10/trustdb.c:534
+#, fuzzy
+msgid "never"
+msgstr "aldrig"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr ""
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr ""
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr ""
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "det behövs ingen kontroll av tillitsdatabasen\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "nästa kontroll av tillitsdatabasen kommer att äga rum %s\n"
+
+#: g10/trustdb.c:592
+#, fuzzy, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "det behövs ingen kontroll av tillitsdatabasen\n"
+
+#: g10/trustdb.c:607
+#, fuzzy, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "det behövs ingen kontroll av tillitsdatabasen\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, fuzzy, c-format
+msgid "public key %s not found: %s\n"
+msgstr "hittade inte den öppna nyckeln %08lX :%s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "gör en kontroll av tillitsdatabasen --check-trustdb\n"
+
+# originalet borde ha ett value
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "kontrollerar  tillitsdatabasen\n"
+
+# Vad är detta!?
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d nycklar behandlade (%d validity counts rensade)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "hittade inga nycklar med förbehållslöst förtroende\n"
+
+#: g10/trustdb.c:2174
+#, fuzzy, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr ""
+"Hittar inte den öppna nyckeln tillhörande den förbehållslöst betrodda "
+"nyckeln %08lX \n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr ""
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+
+#: g10/trustdb.c:2358
+#, fuzzy, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "tillitspost: %lu, typ %d: kunde inte skriva: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"signaturen kunde inte verifieras.\n"
+"Kom ihåg att signaturfilen (.sig eller .asc)\n"
+"ska vara den först angivna filen på kommandoraden\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "raden %u är för lång, eller saknar nyradstecken\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "allmänt fel"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "okänd pakettyp"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "okänd version"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "okänd algoritm för publik nyckel"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "okänd algoritm för beräkning av sammandrag"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "felaktig öppen nyckel"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "felaktig hemlig nyckel"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "felaktig signatur"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "fel vid beräkning av kontrollsumma"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "felaktig lösenmening"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "hittade inte den öppna nyckeln"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "okänd krypteringsalgoritm"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "kan inte öppna nyckelringen"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "felaktigt paket"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "felaktigt skal"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "okänd användaridentitet"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "den hemliga nyckeln är inte tillgänglig"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "fel hemlig nyckel har använts"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "inte stödd"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "felaktig nyckel"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "fel vid läsning av fil"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "fel vid skrivning av fil"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "okänd komprimeringsalgoritm"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "fel vid öppnande av fil"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "fel vid skapande av fil"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "fel lösenmening"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "algoritmen för publik nyckel är inte införd"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "krypteringsalgorimten är inte införd"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "okänd signaturklass"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "fel i tillitsdatabasen"
+
+# MPI står för Multiple Precision Integer (tror jag)
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "felaktig MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "resursbegränsning"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "felaktig nyckelring"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "felaktigt certifikat"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "felformaterad användaridentitet"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "fel vid stängning av fil"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "fel vid namnbyte av fil"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "fel vid borttagande av fil"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "oväntad data"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "konflikt mellan tidsstämplar"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "oanvändbar algoritm för publika nycklar"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "filen finns"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "svag nyckel"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "felaktigt argument"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "felaktig URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "denna URI stöds inte"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "nätverksfel"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "inte krypterad"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "inte behandlade"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "oanvändbar öppen nyckel"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "oanvändbar hemlig nyckel"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "nyckelserverfel"
+
+#: util/errors.c:109
+#, fuzzy
+msgid "canceled"
+msgstr "Avbryt"
+
+#: util/errors.c:110
+#, fuzzy
+msgid "no card"
+msgstr "inte krypterad"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "ingen signerad data\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr ""
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr ""
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... detta är ett fel i programmet (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "du har hittat ett fel i programmet ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "ja"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "jJ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "nej"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "avsluta"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "aA"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr ""
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr ""
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr ""
+
+#: util/miscutil.c:411
+#, fuzzy
+msgid "cC"
+msgstr "c"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "Varning: använder osäkert minne!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "se http://www.gnupg.org/faq.html för mer information\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "operationen är inte möjlig utan tillgång till säkert minne\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(du kan ha använt fel program för denna uppgift)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA kräver att du använder en 160-bitars kontrollsummealgoritm\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "Mer information finns på: http://www.gnupg.org/why-not-idea.html\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "ett notationsnamn kan bara innehålla bokstäver, siffror, punkter eller\n"
+#~ "understrykningstecken och sluta med ett likhetstecken\n"
+
+# user notation name??
+# Werner:
+# That is an OpenPGP notation name not registered with IANA.
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "ett användarnoteringsnamn måste innehålla '@'-tecknet\n"
+
+# user notation name??
+# Werner:
+# That is an OpenPGP notation name not registered with IANA.
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "ett användarnoteringsnamn måste innehålla '@'-tecknet\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "ett notationsvärde får inte inehålla några kontrolltecken\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "VARNING: ogiltig noteringsdata hittades\n"
+
+#~ msgid "not human readable"
+#~ msgstr "inte möjlig att läsa för människor"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "läs inställningar från fil"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "läs inställningar från fil"
+
+#, fuzzy
+#~ msgid "expired: %s)"
+#~ msgstr "[går ut: %s]"
+
+# nyckeln eller klassen?
+#, fuzzy
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr ""
+#~ "nyckel %08lX: oväntad signaturklass  (0x%02X) - hoppade över signaturen\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr "Kunde inte köra %s \"%s\": %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "Användar-ID \"%s\" är redan spärrad\n"
+
+#, fuzzy
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "fel vid skapandet av lösenmening: %s\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "Fel lösenmening eller okänd krypteringsalgoritm (%d)\n"
+
+# vad är detta?
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "kan inte ange pid för GPG-Agent\n"
+
+# FD?
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "kan inte få server-läs FD för GPG-Agent\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "kan inte få server-skriv FD för GPG-Agent\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "problem vid kommunikation med GPG-Agent\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "lösenmeningen är för lång\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "felaktigt svar från GPG-Agent\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "problem med GPG-Agent: programmet svarar 0x%lx\n"
+
+#~ msgid "select secondary key N"
+#~ msgstr "välj undernyckel N"
+
+#~ msgid "list signatures"
+#~ msgstr "visa en lista på signaturer"
+
+#~ msgid "sign the key"
+#~ msgstr "signera nyckeln"
+
+#~ msgid "add a secondary key"
+#~ msgstr "lägg till en undernyckel"
+
+#~ msgid "delete signatures"
+#~ msgstr "ta bort signaturer"
+
+#~ msgid "change the expire date"
+#~ msgstr "ändra utgångsdatum"
+
+#~ msgid "set preference list"
+#~ msgstr "ange inställningslista"
+
+#~ msgid "updated preferences"
+#~ msgstr "uppdaterat inställningar"
+
+#~ msgid "No secondary key with index %d\n"
+#~ msgstr "Ingen undernyckel med index %d\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key användaridentitet"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key användaridentitet"
+
+#, fuzzy
+#~ msgid "make a trust signature"
+#~ msgstr "skapa signatur i en separat fil"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "signera nyckeln utan möjlighet att återkalla signaturen"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "signera en nyckel lokalt utan möjlighet till återkallelse"
+
+#~ msgid "q"
+#~ msgstr "q"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "list"
+#~ msgstr "visa en lista"
+
+# ???
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "debug"
+#~ msgstr "avlusa"
+
+#, fuzzy
+#~ msgid "name"
+#~ msgstr "enable"
+
+#, fuzzy
+#~ msgid "login"
+#~ msgstr "lsign"
+
+# skall dessa översättas?
+#, fuzzy
+#~ msgid "cafpr"
+#~ msgstr "fpr"
+
+#, fuzzy
+#~ msgid "forcesig"
+#~ msgstr "revsig"
+
+#, fuzzy
+#~ msgid "generate"
+#~ msgstr "allmänt fel"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+# skall dessa översättas?
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "c"
+#~ msgstr "c"
+
+#~ msgid "sign"
+#~ msgstr "sign"
+
+#~ msgid "s"
+#~ msgstr "s"
+
+#, fuzzy
+#~ msgid "tsign"
+#~ msgstr "sign"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#, fuzzy
+#~ msgid "addcardkey"
+#~ msgstr "addkey"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "expire"
+#~ msgstr "expire"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "t"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#, fuzzy
+#~ msgid "keyserver"
+#~ msgstr "nyckelserverfel"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+# ska detta översättas? Verkar vara ett kommando.
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "disable"
+#~ msgstr "disable"
+
+#~ msgid "enable"
+#~ msgstr "enable"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "sammandragsalgoritmen `%s' kan endast läsas i denna programutgåva\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "VARNING: sammandraget `%s' ingår inte i OpenPGP. Användes på din egen "
+#~ "risk!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[filer]|kryptera filer"
+
+#~ msgid "store only"
+#~ msgstr "endast lagring"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[files]|dekryptera filer"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "signera en nyckel utan möjlighet till återkallelse"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "signera en nyckel lokalt utan möjlighet till återkallelse"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "visa endast paketsekvensen"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "exportera de värden som representerar ägartillit"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "uppdaterar tillitsdatabasen utan mänsklig tillsyn"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "reparera en korrupt tillitsdatabas"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Skala av en fil eller standard in"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Skapa ett skal för en fil eller standard in"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|NAMN|använd NAMN som förvald mottagare"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "använd standardnyckeln som förvald mottagare"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "använd inte terminalen alls"
+
+# Alltså även för V4-nycklar. För att vara PGP-kompatibel.
+#~ msgid "force v3 signatures"
+#~ msgstr "använd alltid v3-signaturer"
+
+# motsatsen översatt med:
+# använd alltid v3-signaturer
+#~ msgid "do not force v3 signatures"
+#~ msgstr "genomdriv inte användning av v3-signaturer"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "använd alltid v4-nyckelsignaturer"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "genomdriv inte användning av v4-nyckelsignaturer"
+
+# Framtvingar användning av mdc även vid äldre chiffer. Ej kompatibelt med pgp.
+# Cast-5 används som standard  vid symmetrisk kryptering. Detta kommando integritetskyddar då den krypterade filen. Onödigt om nyare chiffer angivits med --personal-cipher-preferences
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "använd alltid en MDC vid kryptering"
+
+# mdc är standard för de nyare algoritmerna AES, TWOFISH
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "använd aldrig en MDC vid kryptering"
+
+# syftar på ett användargränsnitt i ett separat program, till exempel gpa
+#~ msgid "use the gpg-agent"
+#~ msgstr "använd GPG-Agent"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "batch-läge: fråga aldrig"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "anta att svaret är ja på de flesta frågor"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "anta att svaret är nej på de flesta frågor"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "lägg till denna nyckelring till listan över nyckelringar"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "lägg till denna hemliga nyckelring till listan"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|NAMN|använd NAMN som förvald hemlig nyckel"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|VÄRD|använd denna nyckelserver för att slå upp nycklar"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|NAMN|sätt teckentabellen för terminalen till NAMN"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[fil]|skriv statusinformation till fil"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|NYCKELID|lita förbehållslöst på denna nyckel"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|FIL|ladda tilläggsmodul FIL"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "imitera läget som beskrivs i RFC1991"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr ""
+#~ "ändra inställningarna för paket, krypteringsalgoritm och kontrollsumma så "
+#~ "att gpg följer OpenPGP-standarden"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr ""
+#~ "ändra inställningarna för paket, krypteringsalgoritm och kontrollsumma så "
+#~ "att gpg härmar PGP 2.x-beteende"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|använd lösenmeningsläget N"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr "|NAMN|använd kontrollsummealgoritmen NAMN för lösenmeningar"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr "|NAMN|använd krypteringsalgoritmen NAMN för lösenmeningar"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|NAMN|använd krypteringsalgoritmen NAMN"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|NAMN|använd kontrollsummealgoritmen NAMN"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|använd komprimeringsalgoritmen N"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "släng bort nyckelidentitetsfältet från krypterade paket"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Visa foto-ID:n"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Visa inte foto-ID:n"
+
+# Här anges alltså med vilket program som ska visa foto-ID:n
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Ange kommandoraden för att visa foto-ID:n"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr ""
+#~ "komprimeringsalgoritmen `%s' kan endast läsas i denna programutgåva\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "kompressionsalgoritmen måste vara i intervallet %d..%d\n"
+
+# Filnamn både med och utan fnuttar finns. lite ologiskt. Vill någon
+# fixa en patch?
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "kan inte öppna %s: %s\n"
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "nyckeln %08lX: nyckeln har spärrats!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "nyckeln %08lX: en undernyckel har spärrats!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX:giltighetstiden har gått ut för nyckeln\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Vi litar INTE på denna nyckel\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Det är inte säkert att denna nyckel verkligen tillhör ägaren\n"
+#~ "men den accepteras trots detta\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "inställningen %c%lu är inte giltig\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (signering och kryptering)\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Kommer att generera ett nytt %s nyckelpar.\n"
+#~ "              den minimala nyckelstorleken är  768 bitar\n"
+#~ "              den förvalda nyckelstorleken är 1024 bitar\n"
+#~ "    den största föreslagna nyckelstorleken är 2048 bitar\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA tillåter bara nyckelstorlekar från 512 till 1024\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "nyckelstorleken är för liten; 1024 är det minsta tillåtna värdet för "
+#~ "RSA.\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr "nyckelstorleken är för liten; 768 är det minsta tillåtna värdet.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "nyckelstorleken är för stor; %d är det största tillåtna värdet\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Nyckelstorlekar större än 2048 är inte att rekommendera\n"
+#~ "eftersom beräkningar tar MYCKET lång tid!\n"
+
+#~ msgid "Are you sure that you want this keysize? "
+#~ msgstr "Är du säker på att du vill ha denna nyckelstorlek? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Ok, men kom ihåg att din bildskärm och ditt tangentbord också sänder\n"
+#~ "avslöjande strålning som kan avlyssnas!\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: kan inte öppna: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: VARNING: tom fil\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "hoppade över nyckeln %08lX - den följer inte standarden RFC2440\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr "OBS: Elgamal-huvdnyckel upptäckt- denna kan ta tid att importera\n"
+
+#~ msgid " (default)"
+#~ msgstr " (standard)"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  skapad: %s går ut: %s"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "rev! undernyckeln har spärrats: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "rev- hittade förfalskad spärr av nyckeln\n"
+
+# betydelse?
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "rev? problem vid kontroll av spärren: %s\n"
+
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %08lX at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "lokalt signerad med din nyckel %08lX vid %s\n"
+
+#~ msgid "   signed by %08lX at %s%s%s\n"
+#~ msgstr "   signerad av %08lX den %s%s%s\n"
+
+#~ msgid "   signed by %08lX at %s%s\n"
+#~ msgstr "  signerad av %08lX at %s%s\n"
+
+# finns det någon bra svensk översättning av policy?
+#~ msgid "Policy: "
+#~ msgstr "Policy: "
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Experimentella algoritmer bör inte användas!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "denna krypteringsalgoritm är föråldrad, använd istället en mer normal "
+#~ "algoritm!\n"
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "kan inte hämta nyckeln från en nyckelserver: %s\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "fel vid sändning till \"%s\": %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "lyckades sända till \"%s\" (status=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "misslyckades sända till \"%s\": status=%u\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "Servern stöder inte sökning efter nycklar.\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "kan inte söka på nyckelservern: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "nyckel %08lX:: detta är en nyckel av ElGamal-typ genererad av PGP\n"
+#~ "som inte är säker för signaturer!\n"
+
+# c-format behövs inte i singularis
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "nyckel  %08lX är skapad %lu sekund in i framtiden (problemet är\n"
+#~ "relaterat till tidsresande eller en felställd klocka)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "nyckel %08lX är skapad %lu sekunder in i framtiden (problemet är\n"
+#~ "relaterat till tidsresande eller en felställd klocka)\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: ingen åtkomst: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: kan inte skapa lås\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: kan inte skapa lås\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: kan inte skapa: %s\n"
+
+# är det en bekräftelse av en förändring eller ett konstaterande?
+# Jfr nyckeln %08lX är förbehållslöst betrodd\n
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "nyckeln %08lX är markerad som förbehållslöst betrodd\n"
+
+# to? signerad till? signerad av?
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "hoppade över signatur med Elgamal signeringsnyckel %08lX till %08lX \n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "hoppade över signatur med %08lX till Elgamal signeringsnyckel %08lX \n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "kontrollerar vid djupet %d signerad=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: kan inte skapa katalog: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr "Om du vill använda denna spärrade nyckel ändå, svara \"ja\"."
+
+# Ska inte avsnittet om ElGAmal -signaturer utgå! Sådana signaturer knäcktes 2004.
+# Jo, enligt Werner ska avsnittet bort till nästa version.
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Välj vilken algoritm du vill använda.\n"
+#~ "\n"
+#~ "DSA (även känd som DSS) är den algoritm för digitala signaturer som bara\n"
+#~ "kan användas för just signaturer. Detta är den rekommenderade algoritmen\n"
+#~ "eftersom verifiering av DSA-signaturer är mycket snabbare än\n"
+#~ "ElGamal-signaturer.\n"
+#~ "\n"
+#~ "ElGamal är en algoritm som kan användas för signaturer och kryptering.\n"
+#~ "OpenPGP-standarden skiljer på två varianter av denna algoritm: en som "
+#~ "bara\n"
+#~ "kan användas för kryptering och en som både kan signera och kryptera.\n"
+#~ "Egentligen är det samma algoritm, men vissa parametrar måste väljas på\n"
+#~ "ett speciellt sätt för att skapa en säker nyckel för signaturer: detta "
+#~ "program\n"
+#~ "gör detta men andra OpenPGP-implementationer behöver inte förstå\n"
+#~ "signatur+kryptering varianten.\n"
+#~ "\n"
+#~ "Den första nyckeln (huvudnyckeln) måste alltid vara en nyckel som kan "
+#~ "användas\n"
+#~ "för att skapa signaturer. Detta är anledningen till att den ElGamal-"
+#~ "variant\n"
+#~ "som bara krypterar inte är tillgänglig i denna meny"
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Trots att dessa nycklar är definierade i RFC2440 är det inte "
+#~ "rekommenderat\n"
+#~ "att använda dem eftersom de inte stöds i alla program och signaturer\n"
+#~ "skapade med dem är stora och mycket långsamma att verifiera."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "har behandlat %lu nycklar hittills (% lu signaturer)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "ofullständing nyckel\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "nyckel %08lX är inte komplett\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "kan inte göra detta i batch-läge\n"
+
+# Filnamn både med och utan fnuttar finns. lite ologiskt. Vill någon
+# fixa en patch?
+#~ msgid "can't open file: %s\n"
+#~ msgstr "Kan inte öppna fil: %s\n"
+
+# Det ska vara ett kolon på denna plats, men det saknas!
+#~ msgid "error: missing colon\n"
+#~ msgstr "fel: kolonet saknas\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "fel: förtroende för innehavaren (tillit) inte angivet\n"
diff --git a/po/tr.gmo b/po/tr.gmo
new file mode 100644 (file)
index 0000000..e18a15d
Binary files /dev/null and b/po/tr.gmo differ
diff --git a/po/tr.po b/po/tr.po
new file mode 100644 (file)
index 0000000..a4f36e1
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,7030 @@
+# Turkish translations for GnuPG messages.
+# Copyright (C) 2005 Free Software Foundation, Inc.
+# Nilgün Belma Bugüner <nilgun@superonline.com>, 2001, ..., 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.1\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-03-16 07:30+0300\n"
+"Last-Translator: Nilgün Belma Bugüner <nilgun@superonline.com>\n"
+"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "pbits=%u qbits=%u ile bir asal sayı üretilemez\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "%d bitten daha küçük bir asal sayı ürtilemez\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "rasgele bayt elde etme modülü bulunamadı\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "`%s' kiltlenemedi\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "gizli anahtarı `%s'e yazıyor\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "`%s' açılamıyor: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "`%s' durumlanamıyor: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' düzenli bir dosya değil - görülmedi\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "not: \"random_seed\" dosyası boş\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "UYARI: random_seed dosyasının boyu hatalı - kullanılmadı\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "\"%s\" okunamıyor: %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "bilgi: \"random_seed\" dosyası güncel değil\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "\"%s\" oluşturulamıyor: %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "\"%s\" yazılamıyor: %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "\"%s\" kapatılamıyor: %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "UYARI: kullanılan rasgele sayı üreteci güvenli değil!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"Rasgele sayı üreteci kendi halinde çalışan\n"
+"bir kukla - güvenilir bir RSÜ değil!\n"
+"\n"
+"BU PROGRAMLA ÜRETİLMİŞ HİÇBİR VERİYİ KULLANMAYIN!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"Lütfen bekleyin rasgele baytlar toplanıyor. Bu işlem sırasında başka\n"
+"işlere bakın, çünkü bu anahtarınızın daha kaliteli olmasını sağlayacak.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"Rasgele üretilen baytlar yetersiz. Lütfen bazı işlemler yaparak\n"
+"daha fazla rasgele bayt toplayabilmesi için işletim sistemine\n"
+"yardımcı olun! (%d bayt daha gerekiyor)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "parmakizinin saklanması başarısız oldu: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "oluşturma tarihinin saklanması başarısız oldu: %s\n"
+
+#: g10/app-openpgp.c:977
+#, fuzzy, c-format
+msgid "reading public key failed: %s\n"
+msgstr "anahtar okuması başarısız\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "yanıt genel anahtar verisi içermiyor\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "yanıt RSA modülü içermiyor\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "yanıt RSA genel bileşenini içermiyor\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN eylemcisi hata döndürdü: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "CHV%d için PIN çok kısa; asgari uzunluk: %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "CHV%d doğrulaması başarısız oldu: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "yönetici komutlarına erişim yapılandırılmamış\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "karttan CHV durumu alınırken hata\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "kart kalıcı olarak kilitli!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr ""
+"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 the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Yönetici PIN'i"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|Yeni Yönetici PIN'i"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|Yeni PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "yeni PIN alınırken hata: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "uygulama verisi okunurken hata\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "parmakizi DO okunurken hata\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "anahtar zaten mevcut\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "mevcut anahtar konulacak\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "yeni anahtar üretiliyor\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1749
+#, fuzzy, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "genel üs çok büyük (32 bitten fazla)\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr ""
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "anahtarın saklanması başarısız: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "anahtar üretilene kadar lütfen bekleyiniz ....\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "anahtar üretimi başarısızlığa uğradı\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "anahtar üretimi tamamlandı (%d saniye)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "OpenPGP kartının yapısı geçersiz (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s imzası, %s özümleme algoritması\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "şu ana kadar oluşturulan imzalar: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, fuzzy, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "PIN [yapılan imza: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr ""
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "%s erişilebilir değil - OpenPGP kartı geçersiz olabilir mi?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "zırh: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "zırh başlığı geçersiz: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "zırh başlığı: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "açıkça okunabilen imza başlığı geçersiz\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "açıkça okunabilen imzalar dahil edildi\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "beklenmeyen zırh: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "araçizgisi escape'lı satır geçersiz: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "geçersiz radix64 karakteri %02X atlandı\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "dosya sonu belirsiz (CRC yok)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "dosya sonu belirsiz (CRC içinde)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC bozulmuş\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC hatası; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "dosya sonu belirsiz (kuyruk içinde)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "kuyruk satırında hata\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "geçerli OpenPGP verisi yok\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "geçersiz zırh: satır %d karakterden uzun\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr ""
+"zırh içinde uluslararası karakterler - büyük olasılıkla hatalı bir e-posta "
+"sunucusu kullanılmış\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP anahtarı kullanılabilir değil: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "%s numaralı OpenPGP kartı saptandı\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "bu önceden betik kipinde yapılamaz\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "Seçiminiz? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[belirtilmedi]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "erkek"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "dişi"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "belirtilmemiş"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "zorlanmadı"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "zorlandı"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "Hata: Şimdilik sadece US-ASCII mümkün.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "Hata: \"<\" karakteri kullanılmamalı.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "Hata: Çift boşluğa izin verilmez.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "Kart sahibinin soyadı: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "Kart sahibinin adı: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "Hata: İsimler birlikte çok uzun oluyor (sınır: %d karakter).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "genel anahtarın alınacağı URL: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "Hata: URL çok uzun (sınır: %d karakter).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "\"%s\" okunurken hata: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "Oturum açma verisi (hesap adı): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "Hata: Oturum açma verisi çok uzun (sınır: %d karakter).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "Özel DO verisi: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "Hata: Özel DO çok uzun (sınır: %d karakter).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "Dil tercihleri: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "Hata: tercih dizgesinin uzunluğu geçersiz.\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "Hata: tercih dizgesindeki karakterler geçersiz.\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "Cinsiyet ((E)rkek, (D)işi veya boşluk): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "Hata: yanıt geçersiz.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA parmak izi: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "Hata: biçimli parmakizi geçersiz\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "anahtar işlemi mümkün değil: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "bir OpenPGP kartı değil"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "geçerli anahtar bilgisi alınırken hata: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "Mevcut anahtar değiştirilsin mi? (e/H ya da y/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "Şifreli anahtarın kartsız yedeği yapılsın mı? (E/h ya da Y/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "Mevcut anahtarlar değiştirilsin mi? (e/H ya da y/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"Lütfen dikkat edin, PIN'lerin öntanımlı ayarları böyledir:\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"Bunları --change-pin komutunu kullanarak değiştirmelisiniz\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "Lütfen üretilecek anahtar türünü seçiniz:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) İmzalama anahtarı\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) Şifreleme anahtarı\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) Kimlik kanıtlama anahtarı\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "Seçim geçersiz.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "Lütfen anahtarın saklanacağı yeri seçiniz:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "bilinmeyen anahtar koruma algoritması\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "anahtarın gizli parçaları kullanılabilir değil\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "gizli anahtar zaten bir kartın üzerinde saklı\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "bu menüden çık"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "yönetici komutlarını gösterir"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "bunu gösterir"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "tüm kullanılabilir veriyi listeler"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "kart sahibinin ismini değiştirir"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "anahtarın alınacağı URL değiştirilir"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "kart URL'sinde belirtilmiş anahtarı alır"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "oturum açma ismini değiştirir"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "dil tercihlerini değiştirir"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "kart sahibinin cinsiyetini değiştirir"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "bir CA parmakizini değiştirir"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "imza zorlama PIN'i bayrağını değiştirir"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "yeni anahtarlar üretir"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "PIN değiştirmek için menü"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr ""
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "Komut> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "Yöneticiye özel komut\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "Yönetici komutlarına izin verilir\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "Yönetici komutlarına izin verilmez\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "Komut geçersiz (\"help\" komutunu deneyin)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "gizli anahtar kullanışsız"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr ""
+"Lüthen kartı yerleştirdikten sonra ya <enter> ya da iptal için 'c' tuşlayın: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "anahtar bloğu silinemedi: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"Mevcut kartı kaldırdıktan sonra lütfen seri numarası\n"
+"   %.*s\n"
+"olan kartı yerleştirin.\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "Hazır olunca <enter> ya da iptal etmek için 'c' tuşlayın: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "Yeni Yönetici PIN'ini girin: "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "Yeni PIN'i girin: "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "Yönetici PIN'ini girin: "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "PIN'i girin: "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "Bu PIN'i tekrarlayın: "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN doğru tekrarlanmadı; tekrar deneyin"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "`%s' açılamadı\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output seçeneği bu komutla çalışmaz\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "anahtar \"%s\" yok: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "anahtar bloğu okunurken hata: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(anahtarı parmak izi ile belirtmedikçe)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "betik kipinde \"--yes\" olmaksızın bu yapılamaz\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "Bu anahtar, anahtar zincirinden silinsin mi? (e/H ya da y/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "Bu bir gizli anahtar! - gerçekten silinecek mi? (e/H veya y/N)"
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "anahtar bloğu silinemedi: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "sahibinin güvencesi bilgisi temizlendi\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "genel anahtar \"%s\" için bir gizli anahtar var!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "onu önce \"--delete-secret-keys\" ile silmelisiniz.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "anahtar parolası oluşturulurken hata: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "S2K kipi sayesinde bir simetrik ESK paketi kullanılamıyor\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "%s şifrelemesi kullanılıyor\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' zaten sıkıştırılmış\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "UYARI: \"%s\" dosyası boş\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr ""
+"--pgp2 kipinde sadece 2048 bitlik RSA anahtarları ile şifreleme "
+"yapabilirsiniz\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "`%s'den okunuyor\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "tüm anahtarları şifrelemek için IDEA şifresi kullanılamaz.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"UYARI: alıcının tercihleriyle çelişen %s (%d) simetrik şifre kullanımı "
+"zorlanıyor\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr ""
+"UYARI: alıcının tercihleriyle çelişen %s (%d) sıkıştırma algoritması "
+"kullanılmak isteniyor\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr ""
+"alıcının tercihleriyle çelişen %s (%d) simetrik şifre kullanımı zorlanıyor\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "%2$s kipindeyken %1$s kullanılamayabilir.\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s \"%s\" için şifrelendi\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s şifreli veri\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "bilinmeyen algoritma %d ile şifrelenmiş\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "UYARI: ileti simetrik şifre içindeki zayıf bir anahtarla şifrelendi.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "şifreli paketin elde edilmesinde sorun var\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "uzaktan uygulama çalıştırılması desteklenmiyor\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "`%s' dizini oluşturulamıyor: %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr ""
+"güvensiz options dosyası yetkilerinden dolayı dış program çağrıları iptal\n"
+"edildi\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr ""
+"bu platformda, dış uygulamalar çalıştırılırken geçici dosyalar gerekiyor\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr " '%s' çalıştırılamıyor: %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "'%s' kabuğu çalıştırılamıyor: %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "dış uygulama çalıştırılırken sistem hatası: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "Dış uygulamamnın doğal olmayan çıkışı\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "dış uygulama çalıştırılamıyor\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "dış uygulamanın yanıtı okunamıyor: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "UYARI: geçici dosya silinemiyor (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "UYARI: %s geçici dizini silinemiyor: %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "İmza yürürlükten kaldırılamaz olarak imlenecek.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "\"%s\" için yürürlükten kaldırma anahtarları yok\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "anahtarı ya da seçili yardımcı anahtarları yürürlükten kaldırır"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "gizli anahtar kullanımdışı"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "gizli anahtarların ihracına izin verilmez\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "anahtar %s: korunmamış - atlandı\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "anahtar %s: PGP 2.x tarzı bir anahtar - atlandı\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "anahtar %s: yardımcı anahtar imzası yanlış yerde - atlandı\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "anahtarın saklanması başarısız: %s\n"
+
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "UYARI: gizli anahtar %s basit bir SK sağlamasına sahip değil\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "UYARI: hiçbir şey dışarı aktarılmadı\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@Komutlar:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[dosya]|bir imza yapar"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[dosya]|açıkça okunabilen bir imza yapar"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "bağımsız bir imza yapar"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "veriyi şifreler"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "sadece simetrik şifre ile şifreler"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "veri şifresini açar (öntanımlı)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "bir imzayı doğrular"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "anahtarları listeler"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "anahtarları ve imzaları listeler"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "anahtar imzalarını listeler ve sınar"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "anahtarları ve parmak izlerini listeler"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "gizli anahtarları listeler"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "yeni bir anahtar çifti üretir"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "anahtarları genel anahtar zincirinden siler"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "anahtarları gizli anahtar zincirinden siler"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "bir anahtarı imzalar"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "bir anahtarı yerel olarak imzalar"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "bir anahtarı düzenler ve imzalar"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "bir yürürlükten kaldırma sertifikası üretir"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "anahtarları gönderir"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "anahtarları bir anahtar sunucusuna gönderir"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "anahtarları bir anahtar sunucusundan indirir"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "bir anahtar sunucusunda anahtarları arar"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "anahtarları bir anahtar sunucusundan günceller"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "anahtarları indirir/katıştırır"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "kart durumunu basar"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "kart üzerindeki veriyi değiştirir"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "bir kartın PIN'ini değiştirir"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "güvence veritabanını günceller"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|algo [dosyalar]|ileti özümlemelerini gösterir"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"Seçenekler:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "ascii zırhlı çıktı oluşturur"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|İSİM|İSİM için şifreleme yapar"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "imzalamak ya da şifre çözmek için bu kullanıcı kimliği kullanılır"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|sıkıştırma seviyesi N olarak ayarlanır (0 ise sıkıştırma yapılmaz)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "kurallı metin kipini kullanır"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "çıktı dosyası olarak kullanılır"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "çok detaylı"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "hiçbir değişiklik yapmaz"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "üzerine yazmadan önce sorar"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "kesin OpenPGP davranışı etkin olur"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "PGP 2.x uyumlu iletiler üretilir"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(Tüm komut ve seçeneklerin komple listesi için man sayfalarına bakın)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"Örnekler:\n"
+"\n"
+" -se -r Ali [dosya]         kullanıcı Ali için imzalar ve şifreler\n"
+" --clearsign [dosya]        açıkça okunabilir bir imza yapar\n"
+" --detach-sign [dosya]      bağımsız bir imza yapar\n"
+" --list-keys [isimler]      anahtarları listeler\n"
+" --fingerprint [isimler]    parmak izlerini gösterir\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"Yazılım hatalarını lütfen <gnupg-bugs@gnu.org> adresine,\n"
+"çeviri hatalarını ise <gnu-tr@belgeler.org> adresine bildiriniz.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "Kullanımı: gpg [seçenekler] [dosyalar] (yardım için -h)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"Yazılışı: gpg [seçenekler] [dosyalar]\n"
+"imzalama, kontrol, şifreleme veya çözme\n"
+"öntanımlı işlem girilen veriye bağımlıdır\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"Desteklenen algoritmalar:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "GenAnah: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "Şifre: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "Hash: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "Sıkıştırma: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "kullanımı: gpg [seçenekler] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "çelişen komutlar\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "grup tanımı '%s' içinde = işareti yok\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "UYARI: '%s' evdizininde güvensiz iyelik\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "UYARI: '%s' yapılandırma dosyasında güvensiz iyelik\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "UYARI: '%s' eklentisinde güvensiz iyelik\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "UYARI: UYARI: '%s' evdizininde güvensiz izinler\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "UYARI: '%s' yapılandırma dosyasında güvensiz izinler\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "UYARI: '%s' eklentisinde güvensiz izinler\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "UYARI: '%s' evdizinindeki ilgili dizinin iyeliği güvensiz\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "UYARI: '%s' yapılandırma dosyasını içeren dizinin iyeliği güvensiz\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "UYARI: '%s' eklentisini içeren dizinin iyeliği güvensiz\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "UYARI: '%s' evdizinindeki ilgili dizinin izinleri güvensiz\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "UYARI: '%s' yapılandırma dosyasını içeren dizinin izinleri güvensiz\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "UYARI: '%s' eklentisini içeren dizinin izinleri güvensiz\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "yapılandırma öğesi '%s' bilinmiyor\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "Gizli anahtar demetinde uygun/benzer imza yok\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "belirtilen anahtar sunucusu adresi geçersiz\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "listedeki bir anahtarın hangi anahtar zincirinde olduğunu gösterir"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "Gizli anahtar demetinde uygun/benzer imza yok\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "BİLGİ: eski öntanımlı seçenekler dosyası `%s' yoksayıldı\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "BİLGİ: \"%s\" öntanımlı seçenek dosyası yok\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "seçenek dosyası \"%s\": %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "\"%s\"den seçenekler okunuyor\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "BİLGİ: %s normal kullanım için değil!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "şifre eklentisi '%s' güvensiz izinlerden dolayı yüklenmedi\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, fuzzy, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "'%s' geçerli bir karakter kümesi değil\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "'%s' geçerli bir karakter kümesi değil\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "anahtar sunucusunun adresi çözümlenemedi\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: anahtar sunucusu seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "anahtar sunucusu seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: geçersiz içselleştirme seçenekleri\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "içselleştirme seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d geçersiz dışsallaştırma seçenekleri\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "dışsallaştırma seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: liste seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "liste seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "'%s' geçerli bir karakter kümesi değil\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "belirtilen anahtar sunucusu adresi geçersiz\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "'%s' geçerli bir karakter kümesi değil\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d doğrulama seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "doğrulama seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "çalıştırılabilirlerin patikası %s yapılamıyor\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d doğrulama seçenekleri geçersiz\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "UYARI: program bir \"core\" dosyası oluşturabilir!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "UYARI: %s %s'i aşıyor\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s ile %s birlikte kullanılmaz!\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s, %s ile etkisiz olur!\n"
+
+#: g10/gpg.c:2865
+#, fuzzy, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "gpg-agent bu oturumda kullanılamaz\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "%s olmasından dolayı güvensiz bellekle çalıştırılmayacak\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "--pgp2 kipindeyken sadece ayrık veya sade imzalar yapabilirsiniz\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "--pgp2 kipinde aynı anda hem imzalama hem de şifreleme yapamazsınız\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "--pgp2 ile çalışırken veri yolu yerine dosyaları kullanmalısınız.\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "--pgp2 kipinde ileti şifrelemesi IDEA şifresi gerektirir\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "seçilen şifre algoritması geçersiz\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "seçilen özümleme algoritması geçersiz\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "seçilen şifre algoritması geçersiz\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "seçilen sertifikalama özümleme algoritması geçersiz\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "\"completes-needed\" 0 dan büyük olmalı\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "\"marginals-needed\" 1 den büyük olmalı\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "\"max-cert-depth\" 1 ile 255 arasında olmalı\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "öntanımlı sertifika seviyesi geçersiz; 0, 1, 2, ya da 3 olabilir\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "asgari sertifika seviyesi geçersiz; 1, 2, ya da 3 olabilir\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "BİLGİ: basit S2K kipi (0) kesinlikle tavsiye edilmez\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "S2K kipi geçersiz; 0, 1 veya 3 olmalı\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "öntanımlı tercihler geçersiz\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "kişisel şifre tercihleri geçersiz\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "kişisel özümleme tercihleri geçersiz\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "kişisel sıkıştırma tercihleri geçersiz\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s, %s ile henüz çalışmıyor\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "%2$s kipindeyken '%1$s' şifreleme algoritması kullanılamaz\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "%2$s kipindeyken '%1$s' özümleme algoritması kullanılamaz\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "%2$s kipindeyken '%1$s' sıkıştırma algoritması kullanılamaz\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "\"TrustDB\" güvence veritabanı başlangıç aşamasında başarısız: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr ""
+"UYARI: alıcılar (-r) genel anahtar şifrelemesi kullanılmadan belirtilmiş\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [dosyaismi]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [dosyaismi]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "`%s' için simetrik şifreleme başarısız: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [dosyaismi]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [dosyaismi]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "--s2k-mode 0 ile  --symmetric --encrypt kullanamazsınız\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "%s kipindeyken  --symmetric --encrypt kullanamazsınız\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [dosyaismi]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [dosyaismi]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [dosyaismi]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "--s2k-mode 0 ile --symmetric --sign --encrypt kullanamazsınız\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "%s kipindeyken --symmetric --sign --encrypt kullanamazsınız.\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [DOSYA]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [dosyaismi]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [dosyaismi]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key kullanıcı-kimliği"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key kullanıcı-kimliği"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key kullanıcı-kimliği [komutlar]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [kullanıcı-kimliği] [anahtar-zinciri]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "anahtar sunucusuna gönderim başarısızlığa uğradı: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "anahtar sunucusundan alım başarısızlığa uğradı: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "anahtar ihracı başarısızlığa uğradı: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "anahtar sunucusunda arama başarısız: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "anahtar sunucusunda tazeleme başarısız: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "zırhın kaldırılması başarısız: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "zırhlama başarısız: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "`%s' hash algoritması geçersiz\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[dosyaismi]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "İletinizi yazın ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "belirtilen sertifika güvence adresi geçersiz\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "belirtilen imza güvence adresi geçersiz\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "belirtilen anahtar sunucusu adresi geçersiz\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "pk belleğinde çok fazla girdi - iptal edildi\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[Kullanıcı kimliği yok]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, 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"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr ""
+"yardımcı genel anahtar %s için gizli yardımcı anahtar yok - yoksayılıyor\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "yardımcı anahtar %s, asıl anahtar %s yerine kullanılıyor\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "anahtar %s: genel anahtarsız gizli anahtar - atlandı\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "daha az detaylı"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "anahtarlar bu anahtarlıktan alınır"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "zaman damgası çelişkilerini uyarı olarak bildirir"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|durum bilgisini bu FD'ye yazar"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "Kullanımı: gpgv [seçenekler] [dosyalar] (yardım için -h)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"Kullanımı: gpg [seçenekler] [dosyalar]\n"
+"Bilinen güvenli anahtarlara göre imzaları kontrol eder\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"Bir değeri buraya işaretlemek size kalmış; bu değer herhangi bir 3. şahsa\n"
+"gönderilmeyecek. Bir güvence ağı sağlamak için bizim buna ihtiyacımız var;\n"
+"bunun (açıkça belirtilmeden oluşturulmuş) sertifikalar ağıyla\n"
+"hiçbir alakası yok."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"Web-of-Trust oluşturulabilmesi için GnuPG'ye hangi anahtarların son derece\n"
+"güvenli (bunlar gizli anahtarlarına erişiminiz olan anahtarlardır) "
+"olduğunun\n"
+"bildirilmesi gerekir. \"evet\" yanıtı bu anahtarın son derece güvenli\n"
+"olduğunun belirtilmesi için yeterlidir.\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr ""
+"Bu güvencesiz anahtarı yine de kullanmak istiyorsanız cevap olarak\n"
+" \"evet\" yazın."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "Bu iletiyi göndereceğiniz adresin kullanıcı kimliğini giriniz."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"Kullanılacak algoritmayı seçiniz.\n"
+"\n"
+"DSA (nam-ı diğer DSS) Sayısal İmza Algortimasıdır ve\n"
+"sadece imzalar için kullanılabilir.\n"
+"\n"
+"Elgamal sadece şifreleme amacıyla kullanılabilen bir algoritmadır.\n"
+"\n"
+"RSA hem imzalamak hem de şifrelemek amacıyla kullanılabilir.\n"
+"\n"
+"İlk (asıl) anahtar daima imzalama yeteneğine sahip bir anahtar olmalıdır."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"Genelde imzalama ve şifreleme için aynı anahtarı kullanmak iyi bir fikir\n"
+"değildir. Bu algoritma sadece belli alanlarda kullanılabilir.\n"
+"Lütfen güvenlik uzmanınıza danışın."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "Anahtar uzunluğunu giriniz"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "Cevap \"evet\" ya da \"hayır\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"İstenen değeri girin. ISO tarihi (YYYY-AA-GG) girmeniz mümkündür fakat\n"
+"iyi bir hata cevabı alamazsınız -- onun yerine sistem verilen değeri\n"
+"bir zaman aralığı olarak çözümlemeyi dener."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "Anahtar tutucunun ismini giriniz"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr ""
+"lütfen bir E-posta adresi girin (isteğe bağlı ancak kuvvetle tavsiye edilir)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "Lütfen önbilgi girin (isteğe bağlı)"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"S iSim değiştirmek için.\n"
+"B önBilgiyi değiştirmek için.\n"
+"P e-Posta adresini değiştirmek için.\n"
+"D anahtar üretimine Devam etmek için.\n"
+"K anahtar üretiminden çıKmak için."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "Yardımcı anahtarı üretmek istiyorsanız \"evet\" ya da \"e\" girin."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"Bir anahtarı bir kullanıcı kimlikle imzalamadan önce kullanıcı kimliğin\n"
+"içindeki ismin, anahtarın sahibine ait olup olmadığını kontrol etmelisiniz.\n"
+"\n"
+"\"0\" bu kontrolu yapmadığınız ve yapmayı da bilmediğiniz anlamındadır.\n"
+"\"1\" anahtar size sahibi tarafından gönderildi ama siz bu anahtarı başka\n"
+"      kaynaklardan doğrulamadınız anlamındadır. Bu kişisel doğrulama için\n"
+"      yeterlidir. En azında yarı anonim bir anahtar imzalaması yapmış\n"
+"      olursunuz.\n"
+"\"2\" ayrıntılı bir inceleme yapıldığı anlamındadır. Örneğin parmakizi ve\n"
+"      bir anahtarın foto kimliğiyle kullanıcı kimliğini karşılaştırmak\n"
+"      gibi denetimleri yapmışsınızdır.\n"
+"\"3\" inceden inceye bir doğrulama anlatır. Örneğin, şahıstaki anahtarın\n"
+"      sahibi ile anahtar parmak izini karşılaştırmışsınızdır ve anahtardaki\n"
+"      kullanıcı kimlikte belirtilen isme ait bir basılı kimlik belgesindeki\n"
+"      bir fotoğrafla şahsı karşılaştırmışsınızdır ve son olarak anahtar\n"
+"      sahibinin e-posta adresini kendisinin kullanmakta olduğunu da\n"
+"      denetlemişsinizdir.\n"
+"Burada 2 ve 3 için verilen örnekler *sadece* örnektir.\n"
+"Eninde sonunda bir anahtarı imzalarken \"ayrıntılı\" ve \"inceden inceye\" "
+"kontroller arasındaki ayrıma siz karar vereceksiniz.\n"
+"Bu kararı verebilecek durumda değilseniz \"0\" cevabını verin."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr ""
+"Kullanıcı kimliklerinin TÜMünü imzalamak istiyorsanız \"evet\" ya da \"yes\" "
+"yazın"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"Bu kullanıcı kimliğini gerçekten silmek istiyorsanız \"evet\" girin.\n"
+"Böylece bütün sertifikaları kaybedeceksiniz!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "Bu yardımcı anahtarı silme izni vermek istiyorsanız \"evet\" girin"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"Bu, anahtar üzerinde geçerli bir imzadır; anahtara ya da bu anahtarla\n"
+"sertifikalanmış bir diğer anahtara bir güvence bağlantısı sağlamakta\n"
+"önemli olabileceğinden normalde bu imzayı silmek istemezsiniz."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"Bu imza, anahtarına sahip olmadığınızdan, kontrol edilemez. Bu imzanın\n"
+"silinmesini hangi anahtarın kullanıldığını bilene kadar\n"
+"ertelemelisiniz çünkü bu imzalama anahtarı başka bir sertifikalı\n"
+"anahtar vasıtası ile bir güvence bağlantısı sağlayabilir."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "İmza geçersiz. Onu anahtar zincirinizden kaldırmak uygun olacak."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"Bu imza kullanıcı kimliğini anahtara bağlar. Öz-imzayı silmek hiç iyi\n"
+"bir fikir değil. GnuPG bu anahtarı bir daha hiç kullanamayabilir.\n"
+"Bunu sadece, eğer bu öz-imza bazı durumlarda geçerli değilse ya da\n"
+"kullanılabilir bir ikincisi var ise yapın."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"Tüm kullanıcı kimlik tercihlerini (ya da seçilen birini) mevcut tercihler\n"
+"listesine çevirir. Tüm etkilenen öz-imzaların zaman damgaları bir sonraki\n"
+"tarafından öne alınacaktır.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "Lütfen bir anahtar parolası giriniz; yazdıklarınız görünmeyecek\n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "Lütfen son parolayı tekrarlayarak ne yazdığınızdan emin olun."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "İmzanın uygulanacağı dosyanın ismini verin"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "Dosyanın üzerine yazılacaksa lütfen \"evet\" yazın"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"Lütfen yeni dosya ismini girin. Dosya ismini yazmadan RETURN tuşlarsanız\n"
+"parantez içinde gösterilen öntanımlı dosya kullanılacak."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"Sertifikalama için bir sebep belirtmelisiniz. İçeriğine bağlı olarak\n"
+"bu listeden seçebilirsiniz:\n"
+"  \"Anahtar tehlikede\"\n"
+"\tYetkisiz kişilerin gizli anahtarınıza erişebildiğine inanıyorsanız\n"
+"\tbunu seçin.\n"
+"  \"Anahtar geçici\"\n"
+"\tMevcut anahtarı daha yeni bir anahtar ile değiştirmişseniz bunu seçin.\n"
+"  \"Anahtar artık kullanılmayacak\"\n"
+"\tAnahtarı emekliye ayıracaksanız bunu seçin.\n"
+"  \"Kullanıcı kimliği artık geçersiz\"\n"
+"\tKullanıcı kimliği artık kullanılamayacak durumdaysa bunu\n"
+"\tseçin; genelde Eposta adresi geçersiz olduğunda kullanılır.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"İsterseniz, neden bu yürürlükten kaldırma sertifikasını\n"
+"verdiğinizi açıklayan bir metin girebilirsiniz.\n"
+"Lütfen bu metin kısa olsun. Bir boş satır metni bitirir.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "yardım mevcut değil"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "\"%s\" için yardım mevcut değil"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "güvence veritabanını günceller"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "genel anahtar gizli anahtarla uyuşmuyor!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "gizli anahtar kullanımdışı"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "%d. tür blok atlandı\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "şu ana kadar %lu anahtar işlendi\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "İşlenmiş toplam miktar: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "     yeni anahtarlar atlandı: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "         kullanıcı kimliksiz: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                      alınan: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "                   değişmedi: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "      yeni kullanıcı kimliği: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "    yeni yardımcı anahtarlar: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "                yeni imzalar: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "      yeni anahtar iptalleri: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "     gizli anahtarlar okundu: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "  gizli anahtarlar indirildi: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "  gizli anahtarlar değişmedi: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "             alınamadı: %lu\n"
+
+#: g10/import.c:324
+#, fuzzy, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "şu ana kadar oluşturulan imzalar: %lu\n"
+
+#: g10/import.c:326
+#, fuzzy, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "     gizli anahtarlar okundu: %lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "UYARI: anahtar %s kullanılabilir olmayan tercihler içeriyor\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "Bu kullanıcı kimlikler için algoritmalar:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": şifreleme algoritması %s için tercih edilir\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": özümleme algoritması %s için tercih edilir\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr ""
+"         \"%s\": sıkıştırma algoritması %s için tercih edilir\n"
+"\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "tercihlerinizi güncellemenizi ve\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr ""
+"olası algoritma uyuşmazlığı sorunlarından kaçınmak için bu anahtarı\n"
+"tekrar dağıtmanızı şiddetle öneririz.\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr ""
+"tercihlerinizi böyle güncelleyemezsiniz: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "anahtar %s: kullanıcı kimliği yok\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "anahtar %s: PKS yardımcı anahtar bozulması giderildi\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "anahtar %s: öz-imzalı olmayan kullanıcı kimliği \"%s\" kabul edildi\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "anahtar %s: geçerli kullanıcı kimliği yok\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "bu kayıp bir öz-imza yüzünden meydana gelebilir\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "anahtar %s: genel anahtar yok: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "anahtar %s: yeni anahtar - atlandı\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "yazılabilir bir anahtar zinciri yok: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "\"%s\"e yazıyor\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "\"%s\" anahtar zincirine yazarken hata oluştu: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "anahtar %s: genel anahtar \"%s\" alındı\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "anahtar %s: bizim kopyamızla eşleşmiyor\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "anahtar %s: özgün anahtar bloku bulunamadı: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "anahtar %s: özgün anahtar bloku okunamadı: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "anahtar %s: \"%s\" 1 yeni kullanıcı kimliği\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "anahtar %s: \"%s\" %d yeni kullanıcı kimliği\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "anahtar %s: \"%s\" 1 yeni imza\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "anahtar %s: \"%s\" %d yeni imza\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "anahtar %s: %s 1 yeni yardımcı anahtar\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "anahtar %s: \"%s\" %d yeni yardımcı anahtar\n"
+
+#: g10/import.c:930
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "anahtar %s: \"%s\" %d yeni imza\n"
+
+#: g10/import.c:933
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "anahtar %s: \"%s\" %d yeni imza\n"
+
+#: g10/import.c:936
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "anahtar %s: \"%s\" %d yeni kullanıcı kimliği\n"
+
+#: g10/import.c:939
+#, fuzzy, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "anahtar %s: \"%s\" %d yeni kullanıcı kimliği\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "anahtar %s: \"%s\" değişmedi\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "anahtar %s: geçersiz şifreli (%d) gizli anahtar - atlandı\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "gizli anahtarı alımına izin verilmez\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "öntanımlı gizli anahtar zinciri yok: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "anahtar %s: gizli anahtar alındı\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "anahtar %s: zaten gizli anahtar zincirinde\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "anahtar %s: gizli anahtar yok: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr ""
+"anahtar %s: genel anahtar değil - yürürlükten kaldırma sertifikası "
+"uygulanamaz\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr ""
+"anahtar %s: yürürlükten kaldırma sertifikası geçersiz: %s - reddedildi\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "anahtar %s: \"%s\" yürürlükten kaldırma sertifikası alındı\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "anahtar %s: imza için kullanıcı kimliği yok\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr ""
+"anahtar %s: genel anahtar algoritması, kullanıcı kimliği \"%s\" için "
+"desteklenmiyor\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "anahtar %s: kullanıcı kimliği \"%s\" için öz-imza geçersiz\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "anahtar %s: anahtarı garantilemek için yardımcı anahtar yok\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "anahtar %s: genel anahtar algoritması desteklenmiyor\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "anahtar %s: yardımcı anahtar garantileme geçersiz\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "anahtar %s: çok sayıda yardımcı anahtar bağlantısı silindi\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "anahtar %s: anahtarı yürürlükten kaldırılacak yardımcı anahtar yok\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "anahtar %s: yardımcı anahtar yürürlükten kaldırması geçersiz\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr ""
+"anahtar %s: çok sayıda yardımcı anahtar yürürlükten kaldırması silindi\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "anahtar %s: kullanıcı kimliği \"%s\" atlandı\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "anahtar %s: yardımcı anahtar atlandı\n"
+
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "anahtar %s: imza gönderilebilir değil (0x%02X sınıfı) - atlandı\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "anahtar %s: yürürlükten kaldırma sertifikası yanlış yerde - atlandı\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "anahtar %s: yürürlükten kaldırma sertifikası geçersiz: %s - atlandı\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "anahtar %s: yardımcı anahtar imzası yanlış yerde - atlandı\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "anahtar %s: umulmayan imza sınıfı (0x%02X) - atlandı\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "anahtar %s: çift kullanıcı kimliği saptandı - birleştirildi\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr ""
+"UYARI: anahtar %s yürürlükten kaldırılmış olmalı: yürürlükten kaldırma "
+"anahtarı %s alınıyor\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr ""
+"UYARI: anahtar %s yürürlükten kaldırılmış olabilir: yürürlükten kaldırma "
+"anahtarı %s mevcut değil.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "anahtar %s: \"%s\" yürürlükten kaldırma sertifikası eklendi\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "anahtar %s: doğrudan anahtar imzası eklendi\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "BİLGİ: bir anahtarın seri numarası kartlardan biriyle uyuşmuyor\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "BİLGİ: asıl anahtar kart üzerinde saklı ve kullanılabilir\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "BİLGİ: ikincil anahtar kart üzerinde saklı ve kullanılabilir\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "`%s' anahtar zinciri oluşturulurken hata: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "`%s' anahtar zinciri oluşturuldu\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, fuzzy, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "`%s' oluşturulurken hata: %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "anahtar zinciri belleği yeniden oluşturulurken hata: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[yürürlükten kaldırma]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[öz-imza]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 kötü imza\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d kötü imza\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "1 imza kayıp bir anahtar yüzünden kontrol edilmedi\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, 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"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "1 imza bir hata yüzünden kontrol edilmedi\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "%d imza hatalardan dolayı kontrol edilmedi\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "1 öz-imzası geçersiz kullanıcı kimliği saptandı\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "%d öz-imzası geçersiz kullanıcı kimliği saptandı\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"Diğer kullanıcıların anahtarlarını doğrulayacak bu kullanıcının güven\n"
+"derecesine lütfen karar verin. (pasportuna mı bakarsınız yoksa farklı\n"
+"kaynaklardan parmakizlerini mi kontrol edersiniz...) kararınızı verin\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr " %d = Şöyle böyle güveniyorum\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr " %d = Tamamen güveniyorum\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"Lütfen bu güvence imzasının derinliğini belirtin.\n"
+"1'den büyük bir derinlik, imzaladığınız anhatarın kendi yararınıza\n"
+"güvence imzaları yapmayı mümkün kılar.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "Bu imzayı kısıtlayacak bir etki alanı girin, yoksa <enter> tuşlayın.\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "Onu yine de imzalamak istiyor musunuz? (e/H) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  İmzalanamıyor.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "Kullanıcı kimliği \"%s\" zamanaşımına uğradı."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "Kullanıcı kimliği \"%s\" öz-imzalı değil."
+
+#: g10/keyedit.c:683
+#, fuzzy, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "Kullanıcı kimliği \"%s\" öz-imzalı değil."
+
+#: g10/keyedit.c:685
+#, fuzzy
+msgid "Sign it? (y/N) "
+msgstr "Gerçekten imzalayacak mısınız? (e/H) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"\"%s\" üzerindeki öz-imza\n"
+"bir PGP 2.x tarzı imza.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "Bir OpenPGP öz-imzası haline getirilmesini istiyor musunuz? (e/H) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"\"%s\" üzerindeki imzanızın\n"
+"kullanım süresi dolmuş.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr ""
+"Yeni imzanızın süresi dolmuş biriyle değiştirilmesini ister misiniz? (e/H) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"\"%s\" üzerindeki imzanız\n"
+"dahili bir imza.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr ""
+"Bu imzanın dışarda da geçerli hale getirilmesini istiyor musunuz? (e/H) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" zaten %s anahtarıyla yerel olarak imzalanmış\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" zaten %s anahtarıyla imzalanmış\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "Onu yine de imzalamak istiyor musunuz? (e/H) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "%s anahtarı ile imzalanacak hiçbir şey yok\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "Bu anahtarın kullanım süresi dolmuş!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "Bu anahtarın geçerliliği %s de bitiyor.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "İmzanızın da bu kadar süre geçerli olmasını ister misiniz? (E/h) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr ""
+"--pgp2 kipinde bir PGP 2.x anahtarlara bir OpenPGP imzası "
+"uygulanamayabilir.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "Bu, anahtarı PGP 2.x için kullanışsız yapacak.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"Bu anahtarın ismi yukarda yazılı kişiye ait olduğunu ne kadar dikkatli\n"
+"doğruladınız?  Bu sorunun cevabını bilmiyorsanız \"0\" yazın.\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) Cevabı bilmiyorum. %s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) Tamamen kontrol edildi.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) İlişkisel denetim yaptım.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) Çok dikkatli bir denetim yaptım.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "Seçiminiz? (daha fazla bilgi için: '?'): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"Bu anahtarı kendi \"%s\" (%s) anahtarınızla imzalamak istediğinize "
+"gerçekten\n"
+"emin misiniz?\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "Bu bir öz-imza olacak.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "UYARI: imza dışarı gönderilemez olarak imlenmeyecek.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "UYARI: imza yürürlükten kaldırılamaz olarak imlenmeyecek.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "İmza dışarı gönderilemez olarak imlenecek.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "İmza yürürlükten kaldırılamaz olarak imlenecek.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "Her şeyiyle bu anahtarı sınayamadım.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "Bu anahtarı karşılaştırmalı olarak sınadım.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "Bu anahtarı çok dikkatle sınadım.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "Gerçekten imzalayacak mısınız? (e/H) "
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "imzalama başarısız: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr ""
+"Anahtar sadece kısa veya karta özel öğeler içeriyor,\n"
+"değiştirilecek bir anahtar parolası yok.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "Bu anahtar korunmamış.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "Asıl anahtarın gizli parçaları kullanılamaz.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "Asıl anahtarın gizli parçaları kart üzerinde saklı.\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "Anahtar korunmuş.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "Bu anahtar üzerinde düzenleme yapılamaz: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"Bu gizli anahtar için yeni anahtar parolasını giriniz.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr ""
+"ikinci kez yazdığınız anahtar parolası ilkiyle aynı değil; işlem "
+"tekrarlanacak"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"Bir anahtar parolası vermediniz - bu çok *kötü* bir fikir!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "Gerçekten bunu yapmak istiyor musunuz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "bir anahtar imzası doğru yere taşınıyor\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "kaydet ve çık"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "parmakizini gösterir"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "anahtarı ve kullanıcı kimliğini gösterir"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "N kullanıcı kimliğini seçer"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "N yardımcı anahtarını"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "imzaları sınar"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr ""
+"seçilen kullanıcı kimliği imzalar [* ilgili komutlar için aşağıya bakın]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "kullanıcı kimlikleri yerel olarak imzalar"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "seçili kullanıcı kimlikleri bir güvence imzasıyla imzalar"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr ""
+"seçili kullanıcı kimlikleri yürürlükten kaldırılamayan bir imzayla imzalar"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "bir kullanıcı kimliği ekler"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "bir foto kimliği ekler"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "seçili kullanıcı kimlikleri siler"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "bir yardımcı anahtar ekler"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "bir akıllı karta bir anahtar ekler"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "bir akıllı karttan bir anahtarı taşır"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "bir akıllı karttan bir yedekleme anahtarını taşır"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "seçili yardımcı anahtarları siler"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "bir yürürlükten kaldırma anahtarı ekler"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "seçili kullanıcı kimliklerden imzaları siler"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr ""
+"anahtar için ya da seçili yardımcı anahtarlar için zamanaşımı tarihini "
+"değiştirir"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "seçili kullanıcı kimliğini asıl olarak imler"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "genel ve gizli anahtar listeleri arasında yer değiştirir"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "tercihleri listeler (uzman)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "tercihleri listeler (ayrıntılı)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "Seçili kullanıcı kimlikler için tercih listesini belirler "
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr ""
+"Seçili kullanıcı kimlikler için tercih edilen anahtar sunucu adresini "
+"belirler"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "Seçili kullanıcı kimlikler için tercih listesini belirler "
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "anahtar parolasını değiştirir"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "sahibiningüvencesini değiştirir"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "Seçili tüm kullanıcı kimliklerdeki imzaları yürürlükten kaldırır"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "Seçili tüm kullanıcı kimlikleri yürürlükten kaldırır"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "anahtarı ya da seçili yardımcı anahtarları yürürlükten kaldırır"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "anahtarı kullanıma sokar"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "anahtarı iptal eder"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "seçili foto kimlikleri gösterir"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "gizli anahtar bloğu \"%s\" okunurken hata oluştu: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "Gizli anahtar mevcut.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "Bunu yapmak için gizli anahtar gerekli.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "lütfen önce \"seçmece\" komutunu kullanın.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* `sign' komutu şu harflerden bir veya birkaçı ile başlayabilir:\n"
+"  güvence imzaları için 't' (tsign), yürürlükten kaldırılmayan imzalar\n"
+"  için 'nr', yerel imzalar için 'l' (lsign) veya buların karışımı   olarak "
+"(ltsign, tnrsign gibi).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "Anahtar yürürlükten kaldırıldı."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "Tüm kullanıcı kimlikler gerçekten imzalanacak mı? (e/H ya da y/N)"
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "İpucu: İmzalamak için bir kullanıcı kimliği seçiniz\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "imza türü `%s' bilinmiyor\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "%s kipindeyken bu komut kullanılamaz.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "En az bir kullanıcı kimliği seçmelisiniz.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "Son kullanıcı kimliğini silemezsiniz!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr ""
+"Seçilen tüm kullanıcı kimlikler gerçekten silinecek mi? (e/H ya da y/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "Bu kullanıcı kimliği gerçekten silinecek mi? (e/H ya da y/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "Bu öz-imza gerçekten taşınacak mı?  (e/H ya da y/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "Sadece ve sadece bir anahtar seçmelisiniz.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "Komut argüman olarak bir dosya ismi gerektiriyor\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "`%s' açılamıyor: %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "yedekleme anahtarı `%s' den okunurken hata oluştu: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "En az bir anahtar seçmelisiniz.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "Seçilen anahtarları gerçekten silmek istiyor musunuz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "Bu anahtarı gerçekten silmek istiyor musunuz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr ""
+"Seçilen tüm kullanıcı kimlikleri gerçekten yürülükten kaldırılacak mı? (e/H "
+"ya da y/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr ""
+"Bu kullanıcı kimliği gerçekten yürürlükten kaldırılacak mı? (e/H ya da y/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr ""
+"Anahtarın tamamını yürürlükten kaldırmayı gerçekten istiyor musunuz? (e/H ya "
+"da y/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr ""
+"Seçili yardımcı anahtarları gerçekten yürürlükten kaldırmak istiyor musunuz? "
+"(e/H ya da y/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr ""
+"Bu yardımcı anahtarı gerçekten yürürlükten kaldırmak istiyor musunuz? (e/H "
+"ya da y/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr ""
+"Kullanıcı taraından sağlanmış bir güvence veritabanı kullanılarak "
+"sahibiningüvencesi belirlenemez\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "Belirlenecek tercih listesi:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr ""
+"Seçili kullanıcı kimlikler için tercihleri gerçekten güncellemek istiyor "
+"musunuz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "Tercihleri gerçekten güncellemek istiyor musunuz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "Değişiklikler kaydedilecek mi? (e/H ya da y/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "Kaydetmeden çıkılsın mı? (e/H ya da y/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "güncelleme başarısız: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "gizliyi güncelleme başarısız: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "Güncelleme gereği olmadığından anahtar değişmedi.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "Özümlenen: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "Özellikler: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "Anahtar sunucusu değişmez"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "Tercih edilen anahtar sunucusu: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr "Niteleme: "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "Bir PGP 2.x tarzı kullanıcı kimliğine uygun tercih yok.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr ""
+"Bu anahtar %2$s tarafından %3$s anahtarıyla %1$s üzerinde yürürlükten "
+"kaldırılmış\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr ""
+"Bu anahtar %s tarafından %s anahtarıyla yürürlükten kaldırılmış olabilir"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(duyarlı)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "oluşturuldu: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "yürürlükten kaldırıldı: %s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "son kullanma tarihi: %s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "son kullanma tarihi: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "kullanımı: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "güvencesi: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "geçerliliği: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "Bu anahtar iptal edilmişti"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "kart-no: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"Gösterilen anahtarın, uygulamayı yeniden başlatıncaya kadar, gerekli\n"
+"doğrulukta olmayacağını lütfen gözönüne alınız.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "yürürlükten kaldırıldı"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "zamanaşımına uğradı"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"UYARI: birincil olarak imlenmiş bir kullanıcı kimlik yok. Bu komutla\n"
+"       farklı bir kullanıcı kimliğin birincil kullanıcı kimlik olarak\n"
+"       kabul edilmesini sağlayabilirsiniz.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"UYARI: Bu PGP-2 tarzı bir anahtar. Bir foto kimliği eklenmesi bu anahtarın\n"
+"       bazı PGP sürümleri tarafından reddedilmesi ile sonuçlanabilir.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "Onu yine de eklemek istiyor musunuz? (e/H) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "PGP2 tarzı bir anahtara bir foto kimliği ekleyemeyebilirsiniz.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "Bu doğru imza silinsin mi? (e/H/k)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "Bu geçersiz imza silinsin mi? (e/H/k)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "Bu bilinmeyen imza silinsin mi? (e/H/k)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "Bu öz-imza gerçekten silinecek mi? (e/H)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "%d imza silindi.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "%d imza silindi.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "Hiçbir şey silinmedi.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+#, fuzzy
+msgid "invalid"
+msgstr "geçersiz zırh"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı."
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı."
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "Kullanıcı kimliği \"%s\" yürürlükten kaldırıldı."
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "kullanıcı kimliği \"%s\" zaten iptal edilmişti\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "kullanıcı kimliği \"%s\" zaten iptal edilmişti\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"UYARI: Bu PGP-2 tarzı bir anahtar. Tasarlanmış bir yürürlükten kaldırıcı\n"
+"       eklenmesi bu anahtarın bazı PGP sürümleri tarafından reddedilmesi\n"
+"       ile sonuçlanabilir.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr ""
+"PGP2 tarzı bir anahtara tasarlanmış bir yürürlükten kaldırıcı "
+"ekleyemeyebilirsiniz.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr ""
+"Tasarlanmış yürürlükten kaldırma anahtarının kullanıcı kimliğini giriniz: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr ""
+"bir PGP 2.x tarzı anahtar bir tasarlanmış yürürlükten kaldırma anahtarı "
+"olarak atanamaz\n"
+
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr ""
+"bir anahtarı kendisini yürürlükten kaldıracak anahtar olarak "
+"kullanamazsınız\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "bu anahtar zaten onu üreten tarafından yürürlükten kaldırılmıştı\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr ""
+"UYARI: yürürlükten kaldıran olarak tasarlanmış bir anahtar başka amaçla\n"
+"       kullanılamaz!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr ""
+"bir anahtarın, yürürlükten kaldıran anahtar olmasını istediğinizden emin "
+"misiniz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "Lütfen gizli anahtarlardan seçilenleri silin.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "Lütfen en fazla bir yardımcı anahtar seçin.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "Bir yardımcı anahtar için son kullanma tarihi değiştiriliyor.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "Asıl anahtar için son kullanma tarihi değiştiriliyor.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "Bir v3 anahtarının son kullanma tarihini değiştiremezsiniz\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "Gizli anahtar demetinde uygun/benzer imza yok\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "UYARI: yardımcı imzalama anahtarı %s çapraz sertifikalı değil\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "Lütfen sadece ve sadece bir kullanıcı kimlik seçiniz.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "kullanıcı kimliği \"%s\" için v3 öz-imzası atlanıyor\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "Tercih ettiğiniz sunucunun adresini girin: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "Onu değiştirmek istediğinizden emin misiniz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "Onu silmek istediğinizden emin misiniz? (e/H ya da y/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "imza niteleyici: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "Üzerine yazılsın mı? (e/H ya da y/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "%d endeksine sahip kullanıcı kimliği yok\n"
+
+#: g10/keyedit.c:4465
+#, fuzzy, c-format
+msgid "No user ID with hash %s\n"
+msgstr "%d endeksine sahip kullanıcı kimliği yok\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "%d indisli bir yardımcı anahtar yok\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "Kullanıcı kimliği: \"%s\"\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "%s anahtarınızla %s%s%s de imzalandı\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (dışarda geçersiz)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "Bu anahtarın geçerliliği %s de bitti.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "Onu yine de yürürlükten kaldırmak istiyor musunuz? (e/H) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr ""
+"Bu imza için bir yürürlükten kaldırma sertifikası oluşturulsun mu? (e/H) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "Bu kullanıcı kimliklerini %s anahtarı üzerinde imzalamışsınız:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (yürülükten kaldırılmaz)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "%s tarafından %s de yürürlükten kaldırılmış\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "Bu imzaları yürürlükten kaldırmak üzeresiniz:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr ""
+"Bu yürürlükten kaldırma sertifikalarını gerçekten oluşturacak mısınız? (e/H) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "gizli anahtar yok\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "kullanıcı kimliği \"%s\" zaten iptal edilmişti\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "UYARI: bir kullanıcı kimliği imzası %d saniye gelecekte oluşturuldu\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "Anahtar %s zaten yürürlükten kaldırılmış.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "Yardımcı anahtar %s zaten yürürlükten kaldırılmış.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr ""
+"Anahtar 0x%3$s (kull-kiml %4$d) için %2$ld uzunluktaki %1$s foto kimliği "
+"gösteriliyor\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "'%s' tercihi yinelendi\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "çok fazla şifreleme tercihi\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "çok fazla özümleme tercihi\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "çok fazla sıkıştırma tercihi\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "tercih dizgesindeki '%s' öğesi geçersiz\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "doğrudan imza yazılıyor\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "öz-imza yazılıyor\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "anahtarı garantileyen imzayı yazıyor\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "anahtar uzunluğu geçersiz; %u bit kullanılıyor\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "anahtar uzunluğu %u bite yuvarlandı\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "İmzalama"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "Şifreleme"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "Kimlik kanıtlama"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "İiŞşKkçÇ"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "bir %s anahtarı için olası eylemler: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "Şimdilik mümkün eylemler: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) İmzalama yeteneğini açar/kapar\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) Şifreleme yeteneğini açar/kapar\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) Kimlik kanıtlama yeteneğini açar/kapar\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) Bitti\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "Lütfen istediğiniz anahtarı seçiniz:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "  (%d) DSA ve ElGamal (öntanımlı)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (yalnız imzalamak için)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (yeteneklerini belirtin)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (yalnız şifrelemek için)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (sadece imzalamak için)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (sadece şifrelemek için)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (yeteneklerini belirtin)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA anahtar çifti %u bit olacak.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "%s anahtarları %u bit ile %u bit arasında olmalı.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "İstediğiniz anahtar uzunluğu nedir? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "%s anahtar uzunlukları %u-%u aralığında olmalı\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "İstenen anahtar uzunluğu: %u bit\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "%u bite yuvarlandı\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"Lütfen anahtarın ne kadar süreyle geçerli olacağını belirtin.\n"
+"         0 = anahtar süresiz geçerli\n"
+"      <n>  = anahtar n gün geçerli\n"
+"      <n>w = anahtar n hafta geçerli\n"
+"      <n>m = anahtar n ay geçerli\n"
+"      <n>y = anahtar n yıl geçerli\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"Lütfen imzanınn ne kadar süreyle geçerli olacağını belirtin.\n"
+"         0 = imza süresiz geçerli\n"
+"      <n>  = imza n gün geçerli\n"
+"      <n>w = imza n hafta geçerli\n"
+"      <n>m = imza n ay geçerli\n"
+"      <n>y = imza n yıl geçerli\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "Anahtar ne kadar geçerli olacak? (0) "
+
+#: g10/keygen.c:1649
+#, fuzzy, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "İmza ne kadar geçerli olacak? (0) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "değer hatalı\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "Anahtar hep geçerli olacak\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "İmza hep geçerli olacak\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "Anahtarın geçerliliği %s de bitecek.\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "İmzanın geçerliliği %s de bitecek.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"Sisteminiz 2038 yılından sonraki tarihleri gösteremiyor.\n"
+"Ama emin olun ki 2106 yılına kadar elde edilebilecek.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "Bu doğru mu? (e/H ya da y/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"Anahtarınızın size ait olduğunu belirten bir Kullanıcı-Kimliği olmalı;\n"
+"Kullanıcı-Kimliği, Gerçek İsminiz, Bir Önbilgi ve e-Posta Adresiniz\n"
+"alanlarının birleşiminden oluşur. Örneğin:\n"
+"\t\"Fatih Sultan Mehmed (Padisah) <padisah@ottoman.gov>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "Adınız ve Soyadınız: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "Ad ve soyadınızda geçersiz karakter var\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "Ad ve soyadınız bir rakamla başlamamalı\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "Ad ve soyadınız en az 5 harfli olmalı\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "E-posta adresiniz: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "geçerli bir E-posta adresi değil\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "Önbilgi: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "Önbilgi alanında geçersiz karakter var\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "`%s' karakter kümesini kullanıyorsunuz.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"Seçtiğiniz KULLANICI-KİMLİĞİ:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr ""
+"Lütfen E-posta adresinizi Adı ve Soyadı veya Açıklama alanı içine koymayın\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "AaYyEeTtKk"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "(A)dı ve Soyadı, (Y)orum, (E)posta alanlarını değiştir ya da Çı(k)? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr ""
+"(A)dı ve Soyadı, (Y)orum, (E)posta alanlarını değiştir ya da (T)amam/Çı(k)? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "Lütfen önce hatayı düzeltin\n"
+
+#: g10/keygen.c:1888
+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"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"Bir miktar rasgele bayt üretilmesi gerekiyor. İlk üretim sırasında biraz\n"
+"hareket (klavyeyi kullanmak, fareyi hareket ettirmek, disklerden "
+"yararlanmak)\n"
+"iyi olacaktır; bu yeterli rasgele bayt kazanmak için rasgele sayı\n"
+"üretecine yardımcı olur. \n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "Anahtar üretimi durduruldu.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "genel anahtarı `%s'e yazıyor\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "gizli anahtar koçanı `%s'e yazılıyor\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "gizli anahtarı `%s'e yazıyor\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "yazılabilir bir genel anahtar zinciri yok: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "yazılabilir bir gizli anahtar zinciri yok: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "`%s' genel anahtar zincirine yazılırken hata oluştu: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "`%s' gixli anahtar zincirine yazılırken hata oluştu: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "genel ve gizli anahtar üretildi ve imzalandı.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"Bu anahtar şifreleme için kullanılamaz. Şifreleme için yardımcı anahtarı\n"
+"\"--edit-key\" seçeneğini kullanarak üretebilirsiniz.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "Anahtar üretimi başarısızlığa uğradı: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr ""
+"anahtar %lu saniye sonra üretilmiş (zaman sapması veya saat problemi)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr ""
+"anahtar bundan %lu saniye sonra üretilmiş (zaman sapması veya saat "
+"problemi)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr ""
+"BİLGİ: v3 anahtarları için yardımcı anahtar üretimi OpenPGP uyumlu değildir\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "Gerçekten oluşturulsun mu? (e/H ya da y/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "anahtarın kart üzerinde saklanması başarısız: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "'%s' yedek dosyası oluşturulamıyor: %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "BİLGİ: kart anahtarının yedeklemesi '%s' e kaydedildi\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "asla    "
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "Kritik imza guvencesi: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "imza guvencesi: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "Kritik tercihli anahtar sunucusu: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "Kritik imza niteleyici: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "imza niteleyici: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "Anahtar Zinciri"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "Birincil anahtar parmak izi:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "Yardımcı anahtar parmak izi:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "Birincil anahtar parmak izi:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "Yardımcı anahtar parmak izi:"
+
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "     Anahtar parmakizi ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      Kart seri no. ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "`%s' > `%s' isim değişikliği başarısız: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "UYARI: gizli bilgi içeren 2 dosya mevcut.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s değişmeyenlerden\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s yenilerden\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "Lütfen bu güvenlik çatlağını giderin\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "%s' anahtar zinciri arabellekleniyor\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "şimdiye kadar %lu anahtar arabelleklendi (%lu imza)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "%lu anahtar arabelleklendi (%lu imza)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: anahtar zinciri oluşturuldu\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "Tercih ettiğiniz sunucunun adresini girin: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "UYARI: anahtar sunucusu seçeneği `%s' bu platformda kullanımda değil\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "iptal edildi"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "Sayıyı/sayıları girin veya S)onraki ya da Ç)ık >"
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "anahtar sunucu protokolü geçersiz (bizimki %d!=eylemci %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "anahtar \"%s\" anahtar sunucusunda yok\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "anahtar, anahtar sunucusunda yok\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "%1$s anahtarı %3$s sunucusunun %2$s adresinden isteniyor\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "%s anahtarı %s adresinden isteniyor\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "%3$s sunucusunun %2$s adresinde \"%1$s\" aranıyor\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "%2$s adresinde \"%1$s\" aranıyor\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "anahtar %1$s, %3$s sunucusunun %2$s adresine gönderiliyor\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "%s anahtarı %s adresine gönderiliyor\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "%3$s sunucusunun %2$s adresinde \"%1$s\" aranıyor\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "%2$s adresinde \"%1$s\" aranıyor\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "bir anahtar sunucusu eylemi yok!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+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"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "anahtar sunucusu VERSION göndermiyor\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "bilinen bir anahtar sunucusu yok (--keyserver seçeneğini kullanın)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "harici anahtar sunucusu çağrıları bu kurulumda desteklenmiyor\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "`%s' anahtar sunucusu şeması için eylemci yok\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "`%s' eylemi `%s' anahtar sunucusu şeması ile desteklenmiyor\n"
+
+#: g10/keyserver.c:1536
+#, fuzzy, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "gpgkeys_%s  %d sürümü eylemciyi desteklemiyor\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "anahtar sunucusu zamanaşımına uğradı\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "anahtar sunucusu iç hatası\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "anahtar sunucusuyla iletişim hatası: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "\"%s\" bir anahtar kimliği değil: atlanıyor\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "UYARI: %s anahtarı %s üzerinden tazelenemiyor: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "1 anahtar %s adresinden tazeleniyor\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "%d anahtar %s adresinden tazeleniyor\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "UYARI: %s anahtarı %s üzerinden tazelenemiyor: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "UYARI: %s anahtarı %s üzerinden tazelenemiyor: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "bir şifreli oturum anahtarı (%d) için tuhaf uzunluk\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s şifreli oturum anahtarı\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "bilinmeyen özümleme algoritması ile üretilmiş anahtar parolası %d\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "genel anahtar: %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "genel anahtarla şifreli veri: doğru DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr ""
+"%u bitlik %s anahtarı ve %s kullanıcı kimliği ile şifrelendi, %s tarihinde "
+"oluşturuldu\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      \"%s\"\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "%s anahtarı ve %s kullanıcı kimliği ile şifrelenmiş\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "genel anahtar şifre çözümü başarısız: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "%lu anahtar parolası ile şifrelenmiş\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "1 anahtar parolası ile şifrelenmiş\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "%s şifreli veri varsayılıyor\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr ""
+"IDEA şifre kullanışsız, iyimserlikle yerine %s kullanılmaya çalışılıyor\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "Şifre çözme tamam\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "UYARI: ileti bütünlük korumalı değildi\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "UYARI: şifreli ileti tahrip edilmiş!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "şifre çözme başarısız: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "BİLGİ: gönderen \"yalnız-gözleriniz-için\" ricasında bulundu\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "özgün dosya adı = '%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr ""
+"tek başına yürürlükten kaldırma - uygulamak için \"gpg --import\" kullanın\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "\"%s\" deki imza iyi"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "imza doğrulama engellendi\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "bu çoklu imzalar elde edilemiyor\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "İmza %s de\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               %s kullanılarak anahtar %s ile yapılmış\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "%s imzası, %s anahtarı ve %s kullanıcı kimliği ile yapılmış\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "Anahtar burada:"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "\"%s\" deki imza KÖTÜ"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "\"%s\" deki imza zamanaşımına uğramış"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "\"%s\" deki imza iyi"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[şüpheli]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                nam-ı diğer \"%s\""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "Bu imzanın geçerliliği %s de bitti.\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "Bu imzanın geçerliliği %s de bitecek.\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s imzası, %s özümleme algoritması\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "ikili"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "metinkipi"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "bilinmeyen"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "İmza kontrol edilemedi: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "bir bağımsız imza değil\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "UYARI: çoklu imzalar saptandı. Sadece ilki denetlenecek.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "0x%02x sınıfı tek başına imza\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "eski stil (PGP 2.x) imza\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "proc_tree() içinde geçersiz kök paket saptandı\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "\"core\" oluşumu iptal edilemedi: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "`%s' için %s de durum bilgisi alınamıyor: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) %s de başarısız: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "UYARI: deneysel %s genel anahtar algoritması kullanılıyor\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "UYARI: deneysel %s şifreleme algoritması kullanılıyor\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "UYARI: deneysel %s özümleme algoritması kullanılıyor\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "UYARI: %s özümleme algoritması artık önerilmiyor.\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA şifre eklentisi yok\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr " b = Daha fazla bilgi gerekli\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: \"%s\" seçeneği kullanımdan kaldırılmak üzere.\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "UYARI: %s seçeneği kullanımdan kaldırılmak üzere.\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "lütfen yerine \"%s%s\" kullanınız\n"
+
+#: g10/misc.c:694
+#, fuzzy, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "UYARI: %s seçeneği kullanımdan kaldırılmak üzere.\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "Sıkıştırılmamış"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "Sıkıştırılmamış|yok"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "bu ileti %s tarafından kullanılamayabilir\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "`%s' seçeneği belirsiz\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "`%s' seçeneği bilinmiyor\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "\"%s\" dosyası var. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "Üzerine yazılsın mı? (e/H ya da y/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: bilinmeyen sonek\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "Yeni dosya ismini giriniz"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "standart çıktıya yazıyor\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "\"%s\" içindeki veri imzalı kabul ediliyor\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "yeni yapılandırma dosyası `%s' oluşturuldu\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr ""
+"UYARI: `%s' deki seçenekler bu çalıştırma sırasında henüz etkin değil\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "dizin `%s' oluşturuldu\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "%d genel anahtar algoritması kullanılamadı\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "UYARI: simetrik şifreli oturum anahtarı potansiyel olarak güvensiz\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "%d tipi alt paket kritik bit kümesine sahip\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent bu oturumda kullanılamaz\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "GPG_AGENT_INFO çevre değişkeni hatalı\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent protokolü sürüm %d desteklenmiyor\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "\"%s\" sunucusuna bağlanılamadı: %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "vekil ile problem - vekil kullanımı iptal ediliyor\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (asıl anahtar kimliği %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"\"%.*s\"\n"
+"kullanıcısının gizli anahtarını açacak bir anahtar parolasına ihtiyaç var.\n"
+"%u bitlik %s anahtarı, kimlik %s, oluşturma tarihi %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "Parolayı tekrar yazınız\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "Anahtar parolasını giriniz\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "kullanıcı tarafından durduruldu\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "betik kipinde parola sorgulanamaz\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "Anahtar parolasını girin: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"Gizli anahtarın kilidini açmak için bir anahtar parolasına ihtiyacınız var.\n"
+"Anahtarın sahibi: \"%s\"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u bitlik %s anahtarı, %s kimliği ile %s tarihinde üretilmiş"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (asıl anahtar kimliği %s üzerinde yardımcı anahtar)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "Tekrar: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"Foto kimliği olarak kullanılmak üzere bir resim seçiniz. Resim bir JPEG\n"
+"dosyası olmalıdır. Bu resim genel anahtarınızda saklanacağından, çok büyük\n"
+"bir resim kullanırsanız genel anahtarınız da çok büyük olacaktır. Resim\n"
+"boyutlarının 240x288 civarında seçilmesi uygun olacaktır.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "Foto kimliği için JPEG dosya ismini giriniz: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "JPEG dosyası `%s' açılamıyor: %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "Bu JPEG gerçekten büyük (%d bayt)!\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "Onu kullanmak istediğinizden emin misiniz? (e/H ya da y/N)  "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "'%s' bir JPEG dosyası değil\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "Bu foto doğru mu? (e/H/ç)? "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "foto kimliği gösterilemiyor!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "Belirtilmiş bir neden yok"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "Anahtarın yerine başkası konulmuş ve iptal edilmiştir"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "Anahtar tehlikede"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "Anahtar artık kullanılmayacak"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "Kullanıcı kimliği artık geçersiz"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "yürürlükten kaldırma sebebi: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "yürürlükten kaldırma açıklaması: "
+
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "bBmMaAkK"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "Güven değeri belirtilmemiş:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  namı-diğer \"%s\"\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr ""
+"%s: Bu anahtarın gerçekten sahibine ait olduğuna dair bir belirti yok\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = bilmiyorum, kem küm\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr " %d = güvence vermem\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr " %d = Son derece güveniyorum\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr " m = ana menüye dön\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr " a = bu anahtarı atla\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr " ç = çık\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"Bu anahtar için asgari güvence seviyesi: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "Kararınız? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr ""
+"Bu anahtarı gerçekten son derece güvenli yapmak istiyor musunuz?  (e/H ya da "
+"y/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "Son derece güvenli bir anahtarla sonuçlanan sertifikalar:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Bu anahtarın gerçekten ismi belirtilen şahsa ait olduğuna dair bir "
+"belirti yok\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr ""
+"%s: Bu anahtarın gerçekten ismi belirtilen şahsa ait olduğuna dair sınırlı "
+"bir belirti var\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "Bu anahtarın ismi belirtilen şahsa ait olduğu umuluyor\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "Bu anahtar bizim\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"Bu anahtarın kullanıcı kimliğinde ismi belirtilen şahsa ait\n"
+"olduğu kesin DEĞİL. *Gerçekten* ne yaptığınızı biliyorsanız,\n"
+"sonraki soruya da evet cevabı verebilirsiniz.\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "Bu anahtar yine de kullanılsın mı? (e/H ya da y/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "UYARI: Güven derecesiz anahtar kullanılıyor!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr ""
+"UYARI: bu anahtar yürürlükten kaldırılmamış olabilir (yürürlükten kaldırma "
+"anahtarı mevcut değil)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "UYARI: Bu anahtar onu üreten tarafından yürürlükten kaldırılmıştı!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "UYARI: Bu anahtar sahibi tarafından yürürlükten kaldırılmıştı!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         Bu imza sahte anlamına gelebilir.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr ""
+"UYARI: Bu yardımcı anahtar sahibi tarafından yürürlükten kaldırılmıştı!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "Bilgi: Bu anahtar iptal edildi.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "Bilgi: Bu anahtarın kullanım süresi dolmuştu!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "UYARI: Bu anahtar güven dereceli bir imza ile sertifikalanmamış!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         Bu imzanın sahibine ait olduğuna dair bir belirti yok.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "UYARI: Bu anahtara güven-mi-yoruz!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         Bu imza SAHTE olabilir.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr ""
+"UYARI: Bu anahtar yeterli güven derecesine sahip imzalarla "
+"sertifikalanmamış!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         Bu imzanın sahibine ait olduğu kesin değil.\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: atlandı: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: atlandı: genel anahtar zaten var\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "Bir kullanıcı kimliği belirtmediniz. (\"-r\" kullanabilirsiniz)\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "Şimdiki alıcılar:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"Kullanıcı kimliğini girin. Boş bir satır işlemi sonlandırır:"
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "Böyle bir kullanıcı kimliği yok.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "atlandı: genel anahtar zaten öntanımlı alıcı olarak ayarlanmış\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "Genel anahtar iptal edildi.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "atlandı: genel anahtar zaten belirtilmiş\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "öntanımlı alıcı \"%s\" bilinmiyor\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: atlandı: genel anahtar iptal edildi\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "geçerli adresler yok\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "veri kaydedilmedi; kaydetmek için \"--output\" seçeneğini kullanın\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "`%s' oluşturulurken hata: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "Bağımsız imza.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "Lütfen veri dosyasının ismini girin: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "standart girdiden okuyor ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "imzalı veri yok\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "imzalı veri '%s'  açılamadı\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "anonim alıcı: %s gizli anahtarı deneniyor ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "tamam, biz anonim alıcıyız.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "DEK'in eski kodlaması desteklenmiyor\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "şifre algoritması %d%s bilinmiyor ya da iptal edilmiş\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "UYARI: %s şifre algoritması alıcı tercihlerinde yok\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "BİLGİ: %s gizli anahtarının %s tarihinde kullanım süresi doldu\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "BİLGİ: anahtar yürürlükten kaldırılmıştı"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet başarısız: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "anahtar %s: kullanıcı kimliği yok\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "Yürürlükten kaldıran:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(Bu bir duyarlı yürürlükten kaldırma anahtarı)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr ""
+"Bu imza için bir yürürlükten kaldırma sertifikası oluşturulsun mu? (e/H ya "
+"da y/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "ASCII zırhlı çıktı istendi.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet başarısız: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "Yürürlükten kaldırma sertifikası üretildi.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "\"%s\" için yürürlükten kaldırma anahtarları yok\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "gizli anahtar \"%s\" yok: %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "karşılığı olan genel anahtar yok: `%s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "genel anahtar gizli anahtarla uyuşmuyor!\n"
+
+#: g10/revoke.c:518
+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 "
+"ya da y/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "bilinmeyen sıkıştırma algoritması\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "BİLGİ: Bu anahtar korunmamış!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"Yürürlükten kaldırma sertifikası üretildi.\n"
+"\n"
+"Sertifika başkalarının kolayca erişebileceği yerlerde saklanmamalıdır.\n"
+"Aksi takdirde, yürürlükten kaldırma sertifikanız bilginiz dışında\n"
+"yayınlandığında geçerli olan genel anahtarınızın geçersiz hale gelebilir.\n"
+"Sertifika kısa olacağından isterseniz, bir yazıcı çıktısı olarak alıp\n"
+"bir kasada da muhafaza edebilirsiniz.\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "Lütfen bir yürürlükten kaldırma sebebi seçiniz:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "İptal"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(Burada %d seçtiğiniz varsayılıyor)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr ""
+"İsteğe bağlı açıklamayı girebilirsiniz; Boş bir satır işlemi sonlandırır:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "Yürürlükten kaldırma sebebi: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(açıklama verilmedi)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "Bu tamam mı? (e/H ya da y/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "gizli anahtar parçaları kullanım dışı\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "koruma algoritması %d%s desteklenmiyor\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "koruma algoritması %d desteklenmiyor\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "Anahtar parolası geçersiz; lütfen tekrar deneyin"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr ""
+"UYARI: Zayıf anahtar saptandı - lütfen anahtar parolasını tekrar "
+"değiştirin.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr ""
+"gizli anahtarın güvenliği için eski tarz 16 bitlik sağlama toplamı "
+"üretiliyor\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "zayıf anahtar oluşturuldu - yeniden deneniyor\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr ""
+"simetrik şifre için zayıf anahtarın önlenmesi mümkün olamadı: %d kere "
+"denendi!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "UYARI: iletideki imza özümlemesi çelişkili\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "UYARI: yardımcı imzalama anahtarı %s çapraz sertifikalı değil\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr ""
+"UYARI: yardımcı imzalama anahtarı %s geçersiz çapraz sertifikalamaya sahip\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "genel anahtar %s imzadan %lu saniye daha yeni\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "genel anahtar %s imzadan %lu saniye daha yeni.\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"anahtar %s %lu saniye sonra üretilmiş (zaman sapması veya saat problemi)\n"
+
+#: g10/sig-check.c:195
+#, 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"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "BİLGİ: %s imza anahtarının kullanım süresi %s sularında dolmuş\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr ""
+"hatalı imzanın bilinmeyen bir kritik bitten dolayı %s anahtarından "
+"kaynaklandığı sanılıyor\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr ""
+"anahtar %s: anahtarı yürürlükten kaldırma imzası için yardımcı anahtar yok\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr ""
+"anahtar %s: yardımcı anahtarı garantileme imzası için yardımcı anahtar yok\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "niteleme verisi v3 (PGP 2.x tarzı) imzalara konulamaz\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "niteleme verisi v3 (PGP 2.x tarzı) anahtar imzalarına konulamaz\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr ""
+"UYARI: %%-genişletmesi imkansız (çok büyük).\n"
+"Uzatılmadan kullanılıyor.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "poliçe URL'si v3 (PGP 2.x tarzı) imzalara konulamaz\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "poliçe URL'si v3 (PGP 2.x tarzı) anahtar imzalarına konulamaz\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr ""
+"UYARI: güvence adresi için %%lik uzatma imkansız (çok büyük).\n"
+"Uzatılmadan kullanılıyor.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr ""
+"UYARI: tercih edilen anahtar sunucu adresi için %%lik uzatma imkansız\n"
+"(çok büyük). Uzatılmadan kullanılıyor.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "oluşturulan imzanın denetimi başarısız: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s imza: \"%s\" den\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"--pgp2 kipinde sadece PGP 2.x tarzı anahtarlarla ayrık imza yapabilirsiniz\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr ""
+"UYARI: alıcının tercihleriyle çelişen %s (%d) özümleme algoritması "
+"kullanılmak isteniyor\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "imzalanıyor:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr ""
+"--pgp2 kipinde sadece PGP 2.x tarzı anahtarlarla açık imzalama "
+"yapabilirsiniz\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s şifrelemesi kullanılmayacak\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "anahtar güvenli olarak imlenmemiş - onu sahte RSÜ ile kullanmayın!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "\"%s\" atlandı: tekrarlanmış\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "\"%s\" atlandı: %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "atlandı: gizli anahtar zaten var\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr "bu, imzalar için güvenli olmayan PGP üretimi bir ElGamal anahtarı!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "güvence veritabanının %lu. kaydı, %d türünde: yazma başarısız: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# Atanan güvencedeğerlerinin listesi %s oluşturuldu\n"
+"# (Eski haline getirmek için \"gpg --import-ownertrust\" kullanın\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "'%s' de hata: %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "satır çok uzun"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr ": imi eksik"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "parmakizi geçersiz"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "sahibiningüvencesi değeri kayıp"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "`%s' deki güvence kaydını ararken hata: %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "`%s' için okuma hatası: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "güvence veritabanı: eşzamanlama başarısız: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "güvence veritabanı %lu kaydı: erişim başarısız: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "güvence veritabanı %lu kaydı: yazma başarısız (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "güvence veritabanı işlemi çok uzun\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "'%s' erişilemiyor: %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: dizin yok!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "`%s' için kilit oluşturulamıyor\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "`%s' kiltlenemedi\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: sürüm kaydı oluşturmada başarısız: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: geçersiz güvence veritabanı oluşturuldu\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: güvence veritabanı oluşturuldu\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "BİLGİ: güvence veritabanına yazılamıyor\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: güvence veritabanı geçersiz\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: nitelemeli tablo oluşturulamadı: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: sürüm kaydının güncellenmesinde hata: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: sürüm kaydının okunmasında hata: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: sürüm kaydının yazılmasında hata: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "güvence veritabanı: erişim başarısız: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "güvence veritabanı: okuma başarısız (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: bir güvence veritabanı dosyası değil\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: %lu kayıt numarası ile sürüm kaydı\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: dosya sürümü %d geçersiz\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: serbest kaydı okuma hatası: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: dizin kaydını yazma hatası: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: kayıt sıfırlama başarısız: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: kayıt ekleme başarısız: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr ""
+"güvence veritabanı bozulmuş; lütfen \"gpg --fix-trustdb\" çalıştırın.\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "%d karakterden daha uzun metin satırları okunamıyor\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "girdi satırı %d karakterden daha uzun\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' geçerli bir anahtar kimliği değil\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "anahtar %s: güvenli anahtar olarak kabul edildi\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "anahtar %s güvence veritabanında birden fazla görünüyor\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "anahtar %s: güvenli anahtar için genel anahtar yok - atlandı\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "anahtar %s son derece güvenli olarak imlendi.\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "güvence veritabanı kaydı %lu, istek tipi %d: okuma başarısız: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "güvence veritabanının %lu. kaydı %d istek türünde değil\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr ""
+"bilinmeyen güvence modeli (%d) kullanılamıyor - %s güvence modeli "
+"varsayılıyor\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "%s güvence modeli kullanılıyor\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr ""
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[yürürlükten kaldırıldı] "
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[süresi doldu] "
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[bilinmeyen]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[tanımsız]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[şöyle böyle]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[tamamen]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[son derece]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "tanımsız"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "asla    "
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "şöyle böyle"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "tamamen"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "son derece"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "bir güvence veritabanı denetimi gereksiz\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "sonraki güvence veritabanı denetimi %s de\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "`%s' güvence modelli güvence veritabanı sınaması için gereksiz\n"
+
+#: g10/trustdb.c:607
+#, c-format
+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"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "genel anahtar %s yok: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "lütfen bir --check-trustdb yapın\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "güvence veritabanı denetleniyor\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "%d anahtar işlendi (%d doğrulama temizlendi)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "son derece güvenli bir anahtar yok\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "son derece güvenli %s için genel anahtar yok\n"
+
+#: g10/trustdb.c:2197
+#, 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"
+
+#: g10/trustdb.c:2283
+#, c-format
+msgid ""
+"depth: %d  valid: %3d  signed: %3d  trust: %d-, %dq, %dn, %dm, %df, %du\n"
+msgstr ""
+"derinlik: %d  geçerli: %3d  imzalı: %3d  güvenilir: %d-, %dq, %dn, %dm, %df, "
+"%du\n"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr ""
+"güvence veritabanının sürüm kaydı güncellenemedi: yazma başarısız: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"imza doğrulanamadı.\n"
+"İmza dosyasının (.sig veya .asc) komut satırında verilecek\n"
+"ilk dosya olması gerektiğini lütfen hatırlayın.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "girdi satırı %u ya çok uzun ya da sonunda satırsonu karakteri yok\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "genel hata"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "bilinmeyen paket tipi"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "bilinmeyen sürüm"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "bilinmeyen genel anahtar algoritması"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "bilinmeyen özümleme algoritması"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "genel anahtar hatalı"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "gizli anahtar hatalı"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "imza hatalı"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "\"checksum\" hatası"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "anahtar parolası hatalı"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "genel anahtar bulunamadı"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "bilinmeyen şifre algoritması"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "anahtar zinciri açılamadı"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "geçersiz paket"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "geçersiz zırh"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "böyle bir kullanıcı kimliği yok"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "gizli anahtar kullanışsız"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "yanlış gizli anahtar kullanılmış"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "desteklenmiyor"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "anahtar hatalı"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "dosya okuma hatası"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "dosya yazma hatası"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "bilinmeyen sıkıştırma algoritması"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "dosya açma hatası"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "dosya oluşturma hatası"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "anahtar parolası geçersiz"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "tamamlanmamış genel anahtar algoritması"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "tamamlanmamış şifre algoritması"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "bilinmeyen imza sınıfı"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "güvence veritabanı hatası"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "MPI hatalı"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "iç kaynak sınırı"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "anahtar zinciri geçersiz"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "sertifika hatalı"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "kullanıcı kimliği bozuk"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "dosya kapama hatası"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "dosya isim değiştirme hatası"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "dosya silme hatası"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "beklenmeyen veri"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "zaman damgası çelişkili"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "genel anahtar algoritması kullanışsız"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "dosya mevcut"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "anahtar zayıf"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "geçersiz argüman"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI hatalı"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "desteklenmeyen URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "ağ hatası"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "şifrelenemedi"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "işlenemedi"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "genel anahtar kullanımdışı"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "gizli anahtar kullanımdışı"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "anahtar sunucusu hatası"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "iptal edildi"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "kat yok"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "imzalı veri yok\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "HATA: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "UYARI: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... bu bir yazılım hatası (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "bir yazılım hatası buldunuz ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "evet"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "eE"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "hayır"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "hH"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "çık"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "çÇ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "tamam|tamam"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "iptal|iptal"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "tT"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "iİ"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "UYARI: kullanılan bellek güvenli değil!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr ""
+"Daha geniş bilgi edinmek için http://www.gnupg.org/faq.html adresine "
+"bakınız\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "güvenli bellek hazırlanmadan işlem yapmak mümkün değil\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(bu görev için yanlış program kullanmış olabilirsiniz)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA, 160 bitlik bir hash algoritması kullanılmasını gerektiriyor\n"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr ""
+#~ "Daha fazla bilgi için lütfen http://www.gnupg.org/why-not-idea.html "
+#~ "adresine\n"
+#~ "bakınız.\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr ""
+#~ "bir niteleme ismi sadece harfler, rakamlar ve altçizgiler içerebilir ve "
+#~ "sonuna bir '=' gelir.\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "bir kullanıcı niteleme ismi '@' karakteri içermeli\n"
+
+#, fuzzy
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "bir kullanıcı niteleme ismi '@' karakteri içermeli\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "bir niteleme değerinde kontrol karakterleri kullanılamaz\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "UYARI: geçersiz niteleme verisi bulundu\n"
+
+#~ msgid "not human readable"
+#~ msgstr "insan okuyabilir değil"
+
+#, fuzzy
+#~ msgid "all export-clean-* options from above"
+#~ msgstr "seçenekleri dosyadan okur"
+
+#, fuzzy
+#~ msgid "all import-clean-* options from above"
+#~ msgstr "seçenekleri dosyadan okur"
+
+#~ msgid "expired: %s)"
+#~ msgstr "[son kullanma tarihi: %s]"
+
+#~ msgid "key %s: expired signature from key %s - skipped\n"
+#~ msgstr "anahtar %s: %s anahatarındaki imza zamanaşımına uğramış - atlandı\n"
+
+#, fuzzy
+#~ msgid "Unable to clean `%s'\n"
+#~ msgstr " '%s' çalıştırılamıyor: %s\n"
+
+#, fuzzy
+#~ msgid "No user IDs are removable.\n"
+#~ msgstr "kullanıcı kimliği \"%s\" zaten iptal edilmişti\n"
+
+#~ msgid "error getting serial number: %s\n"
+#~ msgstr "seri numarası alınırken hata: %s\n"
+
+#~ msgid "length of RSA modulus is not %d\n"
+#~ msgstr "RSA modülünün uzunluğu %d değildir\n"
+
+#~ msgid "length of an RSA prime is not %d\n"
+#~ msgstr "bir RSA asal sayısının uzunluğu %d değildir\n"
+
+#~ msgid "bad passphrase or unknown cipher algorithm (%d)\n"
+#~ msgstr "ya anahtar parosı yanlış ya da şifre algoritması bilinmiyor (%d)\n"
+
+#~ msgid "can't set client pid for the agent\n"
+#~ msgstr "istemci pid'i belirlenemiyor\n"
+
+#~ msgid "can't get server read FD for the agent\n"
+#~ msgstr "sunucu okuma dosya tanıtıcısı alınamadı\n"
+
+#~ msgid "can't get server write FD for the agent\n"
+#~ msgstr "sunucu yazma dosya tanıtıcısı alınamadı\n"
+
+#~ msgid "communication problem with gpg-agent\n"
+#~ msgstr "gpg-agent ile haberleşme problemi\n"
+
+#~ msgid "passphrase too long\n"
+#~ msgstr "Parola çok uzun\n"
+
+#~ msgid "invalid response from agent\n"
+#~ msgstr "yanıt geçersiz\n"
+
+#~ msgid "problem with the agent: agent returns 0x%lx\n"
+#~ msgstr "vekil ile sorun var: vekil 0x%lx ile sonuçlandı\n"
+
+#~ msgid "digest algorithm `%s' is read-only in this release\n"
+#~ msgstr "bu dağıtımda özümleme algoritması %s salt-okunurdur\n"
+
+#~ msgid ""
+#~ "WARNING: digest `%s' is not part of OpenPGP.  Use at your own risk!\n"
+#~ msgstr ""
+#~ "UYARI: `%s' özümleyici OpenPGP'ye ait değil. Kullanmak riskli olabilir!\n"
+
+#~ msgid "|[files]|encrypt files"
+#~ msgstr "|[dosyalar]|dosyalar şifrelenir"
+
+#~ msgid "store only"
+#~ msgstr "sadece saklar"
+
+#~ msgid "|[files]|decrypt files"
+#~ msgstr "|[dosyalar]|dosyaların şifresi açılır"
+
+#~ msgid "sign a key non-revocably"
+#~ msgstr "bir anahtarı iptal edilemez olarak imzalar"
+
+#~ msgid "sign a key locally and non-revocably"
+#~ msgstr "bir anahtarı yerel ve iptal edilemez olarak imzalar"
+
+#~ msgid "list only the sequence of packets"
+#~ msgstr "sadece paketlerin silsilesini listeler"
+
+#~ msgid "export the ownertrust values"
+#~ msgstr "sahibiningüvencesi değerlerini gönderir"
+
+#~ msgid "unattended trust database update"
+#~ msgstr "bakımsız güvence veritabanının güncellemesi"
+
+#~ msgid "fix a corrupted trust database"
+#~ msgstr "bozulan güvence veritabanını onarır"
+
+#~ msgid "De-Armor a file or stdin"
+#~ msgstr "Bir dosya veya standart girdinin zırhını kaldırır"
+
+#~ msgid "En-Armor a file or stdin"
+#~ msgstr "Bir dosya veya standart girdiyi zırhlar"
+
+#~ msgid "|NAME|use NAME as default recipient"
+#~ msgstr "|İSİM|öntanımlı alıcı olarak İSİM kullanılır"
+
+#~ msgid "use the default key as default recipient"
+#~ msgstr "öntanımlı alıcı olarak öntanımlı anahtar kullanılır"
+
+#~ msgid "don't use the terminal at all"
+#~ msgstr "terminali hiç kullanma"
+
+#~ msgid "force v3 signatures"
+#~ msgstr "v3 imzalarına zorlar"
+
+#~ msgid "do not force v3 signatures"
+#~ msgstr "v3 imzalara zorlamaz"
+
+#~ msgid "force v4 key signatures"
+#~ msgstr "v4 imzalara zorlar"
+
+#~ msgid "do not force v4 key signatures"
+#~ msgstr "v4 imzalara zorlamaz"
+
+#~ msgid "always use a MDC for encryption"
+#~ msgstr "şifreleme için daima bir MDC kullanılır"
+
+#~ msgid "never use a MDC for encryption"
+#~ msgstr "şifreleme için asla bir MDC kullanılmaz"
+
+#~ msgid "use the gpg-agent"
+#~ msgstr "gpg-agent kullan"
+
+#~ msgid "batch mode: never ask"
+#~ msgstr "önceden belirlenmiş işlemler kipi: hiç sormaz"
+
+#~ msgid "assume yes on most questions"
+#~ msgstr "soruların çoğunda cevap evet farzedilir"
+
+#~ msgid "assume no on most questions"
+#~ msgstr "soruların çoğunda cevap hayır farzedilir"
+
+#~ msgid "add this keyring to the list of keyrings"
+#~ msgstr "bu anahtar zincirini anahtar zincirleri listesine ekler"
+
+#~ msgid "add this secret keyring to the list"
+#~ msgstr "bu gizli anahtar zincirini listeye ekler"
+
+#~ msgid "|NAME|use NAME as default secret key"
+#~ msgstr "|İSİM|öntanımlı gizli anahtar olarak İSİM kullanılır"
+
+#~ msgid "|HOST|use this keyserver to lookup keys"
+#~ msgstr "|MAKİNA|anahtarları aramak için bu anahtar sunucusu kullanılır"
+
+#~ msgid "|NAME|set terminal charset to NAME"
+#~ msgstr "|İSİM|terminal karakter setini İSİM olarak ayarlar"
+
+#~ msgid "|[file]|write status info to file"
+#~ msgstr "|[DOSYA]|durum bilgisini DOSYAya yazar"
+
+#~ msgid "|KEYID|ultimately trust this key"
+#~ msgstr "|ANHKİML|bu anahtar son derece güvenli"
+
+#~ msgid "|FILE|load extension module FILE"
+#~ msgstr "|DOSYA|genişletme modülü olarak DOSYA yüklenir"
+
+#~ msgid "emulate the mode described in RFC1991"
+#~ msgstr "RFC1991 de açıklanan kipi uygular"
+
+#~ msgid "set all packet, cipher and digest options to OpenPGP behavior"
+#~ msgstr "tüm paket, şifre ve özümleme seçeneklerini OpenPGP tarzında ayarlar"
+
+#~ msgid "set all packet, cipher and digest options to PGP 2.x behavior"
+#~ msgstr "tüm paket, şifre ve özümleme seçeneklerini PGP 2.x'e göre ayarlar"
+
+#~ msgid "|N|use passphrase mode N"
+#~ msgstr "|N|anahtar parolası kipi olarak N kullanılır"
+
+#~ msgid "|NAME|use message digest algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|İSİM|anahtar parolaları için ileti özümleme algoritması olarak İSİM "
+#~ "kullanılır"
+
+#~ msgid "|NAME|use cipher algorithm NAME for passphrases"
+#~ msgstr ""
+#~ "|İSİM|anahtar parolaları için şifre algoritması olarak İSİM kullanılır"
+
+#~ msgid "|NAME|use cipher algorithm NAME"
+#~ msgstr "|İSİM|şifre algoritması olarak İSİM kullanılır"
+
+#~ msgid "|NAME|use message digest algorithm NAME"
+#~ msgstr "|İSİM|özümleme algoritması olarak İSİM kullanılır"
+
+#~ msgid "|N|use compress algorithm N"
+#~ msgstr "|N|sıkıştırma algoritması olarak N kullanılır"
+
+#~ msgid "throw keyid field of encrypted packets"
+#~ msgstr "şifreli paketlerin anahtar-kimlik alanlarını atar"
+
+#~ msgid "Show Photo IDs"
+#~ msgstr "Foto kimliklerini gösterir"
+
+#~ msgid "Don't show Photo IDs"
+#~ msgstr "Foto kimliklerini göstermez"
+
+#~ msgid "Set command line to view Photo IDs"
+#~ msgstr "Komut satırını foto kimliklerini göstermeye ayarlar"
+
+#~ msgid "compress algorithm `%s' is read-only in this release\n"
+#~ msgstr "bu dağıtımda sıkıştırma algoritması %s salt-okunurdur\n"
+
+#~ msgid "compress algorithm must be in range %d..%d\n"
+#~ msgstr "sıkıştırma algoritması %d..%d aralığında olmalı\n"
+
+#~ msgid "--nrsign-key user-id"
+#~ msgstr "--nrsign-key KULL-KML"
+
+#~ msgid "--nrlsign-key user-id"
+#~ msgstr "--nrlsign-key KULL-KML"
+
+#~ msgid "can't open %s: %s\n"
+#~ msgstr "%s açılamadı: %s\n"
+
+#~ msgid "key %08lX: key has been revoked!\n"
+#~ msgstr "anahtar %08lX: anahtar yürürlükten kaldırılmıştı!\n"
+
+#~ msgid "key %08lX: subkey has been revoked!\n"
+#~ msgstr "anahtar %08lX: yardımcı anahtar yürürlükten kaldırılmıştı!\n"
+
+#~ msgid "%08lX: key has expired\n"
+#~ msgstr "%08lX: anahtarın kullanım süresi dolmuş\n"
+
+#~ msgid "%08lX: We do NOT trust this key\n"
+#~ msgstr "%08lX: Bu anahtara güven-mi-yoruz\n"
+
+#~ msgid ""
+#~ "%08lX: It is not sure that this key really belongs to the owner\n"
+#~ "but it is accepted anyway\n"
+#~ msgstr ""
+#~ "%08lX: Bu anahtarın gerçekten sahibine ait olup olmadığından emin\n"
+#~ "olunamadı fakat yine de kabul edildi.\n"
+
+#~ msgid "preference %c%lu is not valid\n"
+#~ msgstr "%c%lu tercihi geçersiz\n"
+
+#~ msgid "   (%d) RSA (sign and encrypt)\n"
+#~ msgstr "   (%d) RSA (imzalamak ve şifrelemek için)\n"
+
+#~ msgid ""
+#~ "About to generate a new %s keypair.\n"
+#~ "              minimum keysize is  768 bits\n"
+#~ "              default keysize is 1024 bits\n"
+#~ "    highest suggested keysize is 2048 bits\n"
+#~ msgstr ""
+#~ "Yeni bir %s anahtar çifti üretmek üzeresiniz.\n"
+#~ "                   en küçük anahtar uzunluğu:  768 bit\n"
+#~ "                  öntanımlı anahtar uzunluğu: 1024 bit\n"
+#~ "    önerilebilecek en büyük anahtar uzunluğu: 2048 bit\n"
+
+#~ msgid "DSA only allows keysizes from 512 to 1024\n"
+#~ msgstr "DSA anahtarının uzunluğu 512 ile 1024 bit arasında olabilir\n"
+
+#~ msgid "keysize too small; 1024 is smallest value allowed for RSA.\n"
+#~ msgstr ""
+#~ "anahtar uzunluğu çok küçük; RSA anahtarı için en küçük uzunluk: 1024 bit\n"
+
+#~ msgid "keysize too small; 768 is smallest value allowed.\n"
+#~ msgstr ""
+#~ "anahtar uzunluğu çok küçük; en küçük anahtar uzunluğu 768 bit'tir.\n"
+
+#~ msgid "keysize too large; %d is largest value allowed.\n"
+#~ msgstr "anahtar uzunluğu çok büyük; izin verilen en büyük değer: %d bit\n"
+
+#~ msgid ""
+#~ "Keysizes larger than 2048 are not suggested because\n"
+#~ "computations take REALLY long!\n"
+#~ msgstr ""
+#~ "Hesaplama EPEYCE UZUN zaman alacağından anahtar uzunluklarında\n"
+#~ "2048 bitten fazlası tavsiye edilmez.\n"
+
+#~ msgid "Are you sure that you want this keysize? "
+#~ msgstr "Bu anahtar uzunluğunu istediğinizden emin misiniz? "
+
+#~ msgid ""
+#~ "Okay, but keep in mind that your monitor and keyboard radiation is also "
+#~ "very vulnerable to attacks!\n"
+#~ msgstr ""
+#~ "Tamam, ama saldırılara çok duyarlı olan monitör ve klavye ışınımlarından "
+#~ "kendinizi uzak tutun! (ne demekse...)\n"
+
+#~ msgid "%s: can't open: %s\n"
+#~ msgstr "%s: açılamıyor: %s\n"
+
+#~ msgid "%s: WARNING: empty file\n"
+#~ msgstr "%s: UYARI: dosya boş\n"
+
+#~ msgid "key %08lX: not a rfc2440 key - skipped\n"
+#~ msgstr "%08lX anahtarı: bir RFC2440 anahtarı değil - atlandı\n"
+
+#~ msgid ""
+#~ "NOTE: Elgamal primary key detected - this may take some time to import\n"
+#~ msgstr ""
+#~ "BİLGİ: Elgamal birincil anahtarı saptandı - alınması biraz zaman alacak\n"
+
+#~ msgid " (default)"
+#~ msgstr " (öntanımlı)"
+
+#~ msgid "Really sign? "
+#~ msgstr "Gerçekten imzalayacak mısınız? "
+
+#~ msgid "q"
+#~ msgstr "k"
+
+#~ msgid "save"
+#~ msgstr "save"
+
+#~ msgid "help"
+#~ msgstr "help"
+
+#~ msgid "fpr"
+#~ msgstr "fpr"
+
+#~ msgid "list"
+#~ msgstr "list"
+
+#~ msgid "l"
+#~ msgstr "l"
+
+#~ msgid "uid"
+#~ msgstr "uid"
+
+#~ msgid "key"
+#~ msgstr "key"
+
+#~ msgid "select secondary key N"
+#~ msgstr "N yardımcı anahtarını seçer"
+
+#~ msgid "check"
+#~ msgstr "check"
+
+#~ msgid "list signatures"
+#~ msgstr "imzaları listeler"
+
+#~ msgid "sign the key"
+#~ msgstr "anahtarı imzalar"
+
+#~ msgid "s"
+#~ msgstr "i"
+
+#~ msgid "lsign"
+#~ msgstr "lsign"
+
+#~ msgid "nrsign"
+#~ msgstr "nrsign"
+
+#~ msgid "sign the key non-revocably"
+#~ msgstr "yürürlükten kaldırılamayan imza yapar"
+
+#~ msgid "nrlsign"
+#~ msgstr "nrlsign"
+
+#~ msgid "sign the key locally and non-revocably"
+#~ msgstr "yürürlükten kaldırılamayan yerel imza yapar"
+
+#~ msgid "debug"
+#~ msgstr "debug"
+
+#~ msgid "adduid"
+#~ msgstr "adduid"
+
+#~ msgid "addphoto"
+#~ msgstr "addphoto"
+
+#~ msgid "deluid"
+#~ msgstr "deluid"
+
+#~ msgid "delphoto"
+#~ msgstr "delphoto"
+
+#~ msgid "add a secondary key"
+#~ msgstr "bir yardımcı anahtar ekler"
+
+#~ msgid "delkey"
+#~ msgstr "delkey"
+
+#~ msgid "addrevoker"
+#~ msgstr "addrevoker"
+
+#~ msgid "delsig"
+#~ msgstr "delsig"
+
+#~ msgid "delete signatures"
+#~ msgstr "imzaları siler"
+
+#~ msgid "primary"
+#~ msgstr "primary"
+
+#~ msgid "toggle"
+#~ msgstr "toggle"
+
+#~ msgid "t"
+#~ msgstr "b"
+
+#~ msgid "pref"
+#~ msgstr "pref"
+
+#~ msgid "showpref"
+#~ msgstr "showpref"
+
+#~ msgid "setpref"
+#~ msgstr "setpref"
+
+#~ msgid "updpref"
+#~ msgstr "updpref"
+
+#~ msgid "passwd"
+#~ msgstr "passwd"
+
+#~ msgid "trust"
+#~ msgstr "trust"
+
+#~ msgid "revsig"
+#~ msgstr "revsig"
+
+#~ msgid "revoke signatures"
+#~ msgstr "imzaları yürürlükten kaldırır"
+
+#~ msgid "revuid"
+#~ msgstr "revuid"
+
+#~ msgid "revoke a user ID"
+#~ msgstr "bir kullanıcı kimliği yürürlükten kaldırır"
+
+#~ msgid "revkey"
+#~ msgstr "revkey"
+
+#~ msgid "showphoto"
+#~ msgstr "showphoto"
+
+#~ msgid "%s%c %4u%c/%08lX  created: %s expires: %s"
+#~ msgstr "%s%c %4u%c/%08lX  üretildi: %s zamanaşımı: %s"
+
+#~ msgid "rev! subkey has been revoked: %s\n"
+#~ msgstr "yürkal! yardımcı anahtar yürürlülükten kaldırıldı: %s\n"
+
+#~ msgid "rev- faked revocation found\n"
+#~ msgstr "yürkal- sahte yürürlükten kaldırma sertifikası bulundu\n"
+
+#~ msgid "rev? problem checking revocation: %s\n"
+#~ msgstr "yürkal? Yürürlükten kaldırma denetlenirken problem: %s\n"
+
+#~ msgid ""
+#~ "\"\n"
+#~ "locally signed with your key %08lX at %s\n"
+#~ msgstr ""
+#~ "\"\n"
+#~ "%08lX anahtarınızla %s de yerel olarak imzalı\n"
+
+#~ msgid "   signed by %08lX at %s%s%s\n"
+#~ msgstr "   %08lX ile %s%s%s de imzalanmış\n"
+
+#~ msgid "   signed by %08lX at %s%s\n"
+#~ msgstr "   %08lX ile %s%s de imzalanmış\n"
+
+#~ msgid "Policy: "
+#~ msgstr "Güvence: "
+
+#~ msgid "Experimental algorithms should not be used!\n"
+#~ msgstr "Deneysel algoritmalar kullanılmamalı!\n"
+
+#~ msgid ""
+#~ "this cipher algorithm is deprecated; please use a more standard one!\n"
+#~ msgstr ""
+#~ "bu şifre algoritması standart dışı; lütfen daha standart birini "
+#~ "kullanın!\n"
+
+#~ msgid "can't get key from keyserver: %s\n"
+#~ msgstr "anahtar sunucusunun %s adresinden anahtar alınamadı\n"
+
+#~ msgid "error sending to `%s': %s\n"
+#~ msgstr "\"%s\" adresine gönderme hatası: %s\n"
+
+#~ msgid "success sending to `%s' (status=%u)\n"
+#~ msgstr "\"%s\" adresine gönderme işlemi başarılı (durum=%u)\n"
+
+#~ msgid "failed sending to `%s': status=%u\n"
+#~ msgstr "\"%s\" adresine gönderme işlemi başarısız (durum=%u)\n"
+
+#~ msgid "this keyserver does not support --search-keys\n"
+#~ msgstr "bu anahtar sunucusu --search-keys işlemini desteklemiyor\n"
+
+#~ msgid "can't search keyserver: %s\n"
+#~ msgstr "anahtar sunucusu aranamıyor: %s\n"
+
+#~ msgid ""
+#~ "key %08lX: this is a PGP generated ElGamal key which is NOT secure for "
+#~ "signatures!\n"
+#~ msgstr ""
+#~ "anahtar %08lX: Bu, imzalar için güvenli olmayan PGP üretimi bir ElGamal "
+#~ "anahtarı!\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu second in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "%08lX anahtarı %lu saniye gelecekte üretilmiş (zaman sapması veya saat "
+#~ "problemi)\n"
+
+#~ msgid ""
+#~ "key %08lX has been created %lu seconds in future (time warp or clock "
+#~ "problem)\n"
+#~ msgstr ""
+#~ "%08lX anahtarı %lu saniye gelecekte üretilmiş (zaman sapması veya saat "
+#~ "problemi)\n"
+
+#~ msgid "%s: can't access: %s\n"
+#~ msgstr "%s: erişilemedi: %s\n"
+
+#~ msgid "%s: can't create lock\n"
+#~ msgstr "%s: kilit oluşturulamadı\n"
+
+#~ msgid "%s: can't make lock\n"
+#~ msgstr "%s: kilitleme yapılamadı\n"
+
+#~ msgid "%s: can't create: %s\n"
+#~ msgstr "%s: oluşturulamadı: %s\n"
+
+#~ msgid "key %08lX marked as ultimately trusted\n"
+#~ msgstr "anahtar %08lX son derece güvenli olarak imlendi.\n"
+
+#~ msgid "signature from Elgamal signing key %08lX to %08lX skipped\n"
+#~ msgstr ""
+#~ "%08lX Elgamal imzalama anahtarından %08lX anahtarına imzalama atlandı\n"
+
+#~ msgid "signature from %08lX to Elgamal signing key %08lX skipped\n"
+#~ msgstr ""
+#~ "%08lX anahtarından %08lX Elgamal imzalama anahtarına imzalama atlandı\n"
+
+#~ msgid "checking at depth %d signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/%d\n"
+#~ msgstr ""
+#~ "denetim %d derinlikte yapılıyor: signed=%d ot(-/q/n/m/f/u)=%d/%d/%d/%d/%d/"
+#~ "%d\n"
+
+#~ msgid "%s: can't create directory: %s\n"
+#~ msgstr "%s: dizin oluşturulamıyor: %s\n"
+
+#~ msgid "If you want to use this revoked key anyway, answer \"yes\"."
+#~ msgstr ""
+#~ "Bu yürürlükten kaldırılmış anahtarı yine de kullanmak istiyorsanız\n"
+#~ "cevap olarak \"evet\" yazın."
+
+#~ msgid ""
+#~ "Select the algorithm to use.\n"
+#~ "\n"
+#~ "DSA (aka DSS) is the digital signature algorithm which can only be used\n"
+#~ "for signatures.  This is the suggested algorithm because verification of\n"
+#~ "DSA signatures are much faster than those of ElGamal.\n"
+#~ "\n"
+#~ "ElGamal is an algorithm which can be used for signatures and encryption.\n"
+#~ "OpenPGP distinguishs between two flavors of this algorithms: an encrypt "
+#~ "only\n"
+#~ "and a sign+encrypt; actually it is the same, but some parameters must be\n"
+#~ "selected in a special way to create a safe key for signatures: this "
+#~ "program\n"
+#~ "does this but other OpenPGP implementations are not required to "
+#~ "understand\n"
+#~ "the signature+encryption flavor.\n"
+#~ "\n"
+#~ "The first (primary) key must always be a key which is capable of "
+#~ "signing;\n"
+#~ "this is the reason why the encryption only ElGamal key is not available "
+#~ "in\n"
+#~ "this menu."
+#~ msgstr ""
+#~ "Kullanılacak algoritmayı seçiniz.\n"
+#~ "\n"
+#~ "DSA (DSS olarak da bilinir) sadece imzalar için kullanılan bir sayısal\n"
+#~ "imza algoritmasıdır. Bu algoritma ElGamal algoritmasından çok daha hızlı\n"
+#~ "doğrulandığı için önerilmektedir.\n"
+#~ "\n"
+#~ "ElGamal imzalar ve şifreleme için kullanılan bir algoritmadır.\n"
+#~ "OpenPGP bu algoritmanın bu iki kullanımını birbirinden ayırır:\n"
+#~ "sadece şifreleme ve imza+şifreleme; esas olarak aynı gibi görünmekle "
+#~ "beraber\n"
+#~ "imzalar için kullanılacak anahtarı oluşturacak bazı özel parametrelerin\n"
+#~ "seçilmesini gerektirir: bu program bunu yapar ama diğer OpenPGP\n"
+#~ "gerçeklemelerinin imza+şifreleme olayını anlaması gerekmiyorsa kullanmak\n"
+#~ "anlamlı olur.\n"
+#~ "\n"
+#~ "İlk (asıl) anahtar imzalama yeteneğine sahip bir anahtar olmalıdır;\n"
+#~ "bu durum, sadece şifreleme yapabilen ElGamal anahtarlarının neden menüde\n"
+#~ "bulunmadığını açıklar."
+
+#~ msgid ""
+#~ "Although these keys are defined in RFC2440 they are not suggested\n"
+#~ "because they are not supported by all programs and signatures created\n"
+#~ "with them are quite large and very slow to verify."
+#~ msgstr ""
+#~ "Bu anahtarlar tüm programlar tarafından desteklenmediği için ve\n"
+#~ "onlarla oluşturulan imzalar gereğinden büyük ve doğrulanması çok yavaş\n"
+#~ "olduğundan RFC2440 standardında tanımlı olmalarına rağmen tavsiye\n"
+#~ "edilmezler."
+
+#~ msgid "%lu keys so far checked (%lu signatures)\n"
+#~ msgstr "şimdiye dek %lu anahtar denetlendi (%lu imza)\n"
+
+#~ msgid "key incomplete\n"
+#~ msgstr "anahtarın içi boş\n"
+
+#~ msgid "key %08lX incomplete\n"
+#~ msgstr "anahtar %08lX: içi boş\n"
+
+#~ msgid "sorry, can't do this in batch mode\n"
+#~ msgstr "pardon, bu betik kipinde yapılamaz\n"
+
+#~ msgid "can't open file: %s\n"
+#~ msgstr "dosya açılamadı: %s\n"
+
+#~ msgid "error: missing colon\n"
+#~ msgstr "hata: \":\" eksik\n"
+
+#~ msgid "error: no ownertrust value\n"
+#~ msgstr "hata: hiç sahibiningüvencesi değeri yok\n"
+
+#~ msgid "   (%d) ElGamal (sign and encrypt)\n"
+#~ msgstr "   (%d) ElGamal (imzalamak ve şifrelemek için)\n"
+
+#~ msgid ""
+#~ "The use of this algorithm is only supported by GnuPG.  You will not be\n"
+#~ "able to use this key to communicate with PGP users.  This algorithm is "
+#~ "also\n"
+#~ "very slow, and may not be as secure as the other choices.\n"
+#~ msgstr ""
+#~ "Bu algoritmanın kullanımı sadece GnuPG tarafından desteklenmektedir.\n"
+#~ "Bu anahtarı PGP kullanıcıları ile haberleşmek için kullanamayacaksınız\n"
+#~ "Bu algoritma ayrıca çok yavaş ve diğer seçimler kadar güvenli "
+#~ "olmayabilir.\n"
+
+#~ msgid "Create anyway? "
+#~ msgstr "Yine de oluşturulsun mu? "
+
+#~ msgid "invalid symkey algorithm detected (%d)\n"
+#~ msgstr "geçersiz symkey algoritması saptandı (%d)\n"
+
+#~ msgid "this keyserver is not fully HKP compatible\n"
+#~ msgstr "bu anahtar sunucusu tamamen HKP uyumlu değil\n"
+
+#~ msgid "The use of this algorithm is deprecated - create anyway? "
+#~ msgstr "Bu algoritmanın kullanımı uygun değil - Yine de oluşturulsun mu?"
+
+#~ msgid "|NAME=VALUE|use this notation data"
+#~ msgstr "|İSİM=DEĞER|veri bu nitelemeyle kullanılır"
+
+#~ msgid ""
+#~ "the first character of a notation name must be a letter or an underscore\n"
+#~ msgstr "bir niteleme isminin ilk karakteri bir harf ya da altçizgi olmalı\n"
+
+#~ msgid "dots in a notation name must be surrounded by other characters\n"
+#~ msgstr ""
+#~ "bir niteleme isminde noktalar diğer karakterler tarafından kuşatılmış "
+#~ "olmalıdır\n"
+
+#~ msgid ""
+#~ "WARNING: This key already has a photo ID.\n"
+#~ "         Adding another photo ID may confuse some versions of PGP.\n"
+#~ msgstr ""
+#~ "UYARI: Bu anahtarın zaten bir foto kimliği var.\n"
+#~ "    Başka bir foto kimliği eklemek PGP'in bazı sürümleriyle uyumsuz "
+#~ "olabilir.\n"
+
+#~ msgid "You may only have one photo ID on a key.\n"
+#~ msgstr "Bir anahtarın sadece bir foto kimliği olabilir.\n"
+
+#~ msgid "             Fingerprint:"
+#~ msgstr "              Parmak izi:"
+
+#~ msgid "you have to start GnuPG again, so it can read the new options file\n"
+#~ msgstr ""
+#~ "Yeni seçenekler dosyasının okunabilmesi için GnuPG yeniden "
+#~ "başlatılmalıdır\n"
+
+#~ msgid "changing permission of  `%s' failed: %s\n"
+#~ msgstr "`%s' izinleri değiştirilemedi: %s\n"
+
+#~ msgid "Are you sure you still want to sign it?\n"
+#~ msgstr "Onu yine de imzalamak istiyor musunuz?\n"
+
+#~ msgid "  Are you sure you still want to sign it?\n"
+#~ msgstr "  Onu yine de imzalamak istiyor musunuz?\n"
+
+#~ msgid "key %08lX: our copy has no self-signature\n"
+#~ msgstr "anahtar %08lX: bizim kopyanın öz-imzası yok\n"
+
+#~ msgid "Do you really need such a large keysize? "
+#~ msgstr "Bu kadar büyük anahtar uzunluğuna gerçekten ihtiyacınız var mı?"
+
+#~ msgid "   signed by %08lX at %s\n"
+#~ msgstr "   %08lX tarafından %s de imzalanmış\n"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
new file mode 100644 (file)
index 0000000..8146175
Binary files /dev/null and b/po/zh_CN.gmo differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644 (file)
index 0000000..d673316
--- /dev/null
@@ -0,0 +1,6126 @@
+# Simplified Chinese(zh-CN) messages for GnuPG
+# Copyright (C) 2006 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Meng Jie <zuxyhere@eastday.com>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.4\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2006-07-02 10:58+0800\n"
+"Last-Translator: Meng Jie <zuxyhere@eastday.com>\n"
+"Language-Team: Chinese (simplified) <i18n-translation@lists.linux.net.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: CHINA\n"
+"X-Poedit-SourceCharset: iso-8859-1\n"
+"X-Poedit-Basepath: d:\\msys\\source\\gnupg-1.4.3\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "当 pbits=%u 而 qbits=%u 时不能生成质数\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "少于 %d 位时不能生成质数\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "检测不到熵搜集模块\n"
+
+#: cipher/random.c:403
+#, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "无法锁定‘%s’:%s\n"
+
+#: cipher/random.c:408
+#, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "等待‘%s’上的锁\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "无法打开‘%s’: %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "无法获得文件‘%s’的信息: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "‘%s’不是一个普通文件――已忽略\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "注意:随机数种子文件为空\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "警告:随机数种子文件大小无效――未使用\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "无法读取‘%s’:%s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "注意:随机数种子文件未被更新\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "无法建立‘%s’:%s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "无法写入‘%s’:%s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "无法关闭‘%s’:%s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "警告:正在使用不安全的随机数发生器!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"使用这个随机数字发生器纯粹是为了使程序编译通过──它\n"
+"根本就不是真正意义上的强随机数发生器!\n"
+"\n"
+"绝对不要在现实世界中使用这个程序产生的任何数据!!\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"请稍待片刻,系统此时正在搜集熵。如果您觉得无聊的话,不妨做些\n"
+"别的事——事实上这甚至能够让熵数的品质更好。\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"随机字节不够多。请再做一些其他的琐事,以使操作系统能搜集到更多的熵!\n"
+"(还需要%d字节)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "无法存储指纹:%s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "无法存储创建日期:%s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "无法读出公钥:%s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "响应未包含公钥数据\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "响应未包含 RSA 余数\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "响应未包含 RSA 公钥指数\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "PIN 回调返回错误:%s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "CHV%d 的 PIN 太短;最小长度为 %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "验证 CHV%d 失败:%s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "尚未配置管理员命令的权限\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "从卡中获取 CHV 状态时出错\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "卡被永久锁定!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr "尝试管理员 PIN %d 次后,卡将被永久锁定!\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|管理员 PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|新的管理员 PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "新的 PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "获取新 PIN 时出错:%s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "读取应用程序数据时出错\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "读取指纹 D0 出错\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "密钥已存在\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "现有的密钥将被替换\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "生成新密钥\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "缺少创建时间戳\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "RSA 余数缺失或者不是 %d 位长\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "RSA 公钥指数缺失或长于 %d 位\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "RSA 质数 %s 缺失或者不是 %d 位长\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "无法存储密钥:%s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "请稍候,正在生成密钥……\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "生成密钥失败\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "密钥已生成(耗时 %d 秒)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "无效的 OpenPGP 卡结构(D0 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "卡不支持散列算法 %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "目前已创建的签名:%lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||请输入 PIN%%0A[完成的签字:%lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr "目前禁止通过此命令验证管理员 PIN\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "不能存取 %s――无效的 OpenPGP 卡?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "ASCII 封装:%s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "无效的 ASCII 封装头:"
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "ASCII 封装头:"
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "无效的明文签名头\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "多层明文签名\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "与预期不符的 ASCII 封装:"
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "以连字符开头的行格式错误:"
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "跳过无效的 64 进制字符 %02x\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "文件先于预期结束(没有 CRC 部分)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "文件先于预期结束(CRC 部分未结束)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "异常的 CRC\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC 错误:%06lx - %06lx\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "文件先于预期结束(于结尾处)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "结尾行有问题\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "找不到有效的 OpenPGP 数据。\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "无效的 ASCII 封装:一行超过 %d 字符\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr "封装里出现括上的可打印字符――可能是有缺陷的信件传输程序造成的\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "OpenPGP 卡不可用:%s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "检测到 OpenPGP 卡号 %s\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "在批处理模式中无法完成此操作\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "您的选择? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[未设定]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "男性"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "女性"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "未定义"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "可选"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "必须"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "错误:目前只允许使用 ASCII 字符。\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "错误:不能使用字符“<”。\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "错误:不允许出现两个空格。\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "卡持有人的姓:"
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "卡持有人的名:"
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "错误:合成的姓名太长(至多 %d 个字符)。\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "获取公钥的 URL:"
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "错误:URL 太长(至多 %d 个字符)\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "读取‘%s’时出错:%s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr "登录数据(帐号名):"
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "错误:登录数据太长(至多 %d 个字符)。\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "个人 DO 数据:"
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "错误:个人 DO 太长(至多 %d 个字符)。\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "首选语言:"
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "错误:首选项字符串长度无效。\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "错误:首选项字符串里有无效字符。\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "性别(男性输入 M,女性输入 F,不指定输入空格):"
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "错误:无效的响应。\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "CA 指纹:"
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "错误:指纹格式无效。\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "针对密钥的操作无法实现:%s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "不是一个 OpenPGP 卡"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "取得当前密钥信息时出错:%s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "替换已有的密钥?(y/N)"
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "是否为加密密钥创建卡外的备份?(Y/n)"
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "替换已有的密钥?(y/N)"
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"请注意,PIN 在出厂时被设置为:\n"
+"  PIN = ‘%s’    管理员 PIN = ‘%s’\n"
+"您应当使用 --change-pin 命令来更改它们\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "请选择您要使用的密钥种类:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "  (1) 签名密钥\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "  (2) 加密密钥\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "  (3) 认证密钥\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "无效的选择。\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "请选择在哪里存储密钥:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "不支持的密钥保护算法\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "私钥部分不可用\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "私钥已存储在卡上\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "离开这个菜单"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "显示管理员命令"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "显示这份在线说明"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "列出所有可用数据"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "更改卡持有人的姓名"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "更改获取密钥的 URL"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "根据卡中指定的 URL 获取密钥"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "更改登录名"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "更改首选语言首选"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "更改卡持有人的性别"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "更改一个 CA 指纹"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "设定 PIN 签名是否必须"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "生成新的密钥"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "更改或解锁 PIN 的菜单"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "验证 PIN 并列出所有数据"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "命令> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "仅供管理员使用的命令\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "允许使用管理员命令\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "不允许使用管理员命令\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "无效的指令(尝试“help”)\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "私钥不可用"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "请插入卡并回车,或输入‘c’来取消:"
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "删除密钥区块时失败:%s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"请取出当前的卡,并插入有下列序列号的卡:\n"
+"  %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "就绪后请回车,或输入‘c’取消"
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "输入新的管理员 PIN:"
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "输入新的 PIN:"
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "输入管理员 PIN:"
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "输入 PIN:"
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "再次输入此 PIN:"
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "PIN 再次输入时与首次输入不符;请再试一次"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "无法打开‘%s’\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output 在这个命令中不起作用\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "密钥‘%s’找不到:%s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "读取密钥区块时发生错误:%s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(除非您用指纹指定密钥)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "在批处理模式中,没有“--yes”就无法这么做\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "要从钥匙环里删除这把密钥吗?(y/N)"
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "这是一把私钥!――真的要删除吗?(y/N)"
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "删除密钥区块时失败:%s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "信任度信息已被清除\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "公钥“%s”有对应的私钥!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "请先使用“--delete-secret-keys”选项来删除它。\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "生成密码的时候发生错误:%s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "在此 S2K 模式下无法使用对称的 ESK 包\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "使用对称加密算法 %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "‘%s’已被压缩\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "警告:‘%s’是一个空文件\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "在 --pgp2 模式中,您只能使用 2048 位及以下的 RSA 密钥加密\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "正在从‘%s’读取\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "您正要用来加密的所有密钥都不能使用 IDEA 算法。\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "警告:强行使用的 %s (%d)对称加密算法不在收件者的首选项中\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "警告:强行使用的 %s (%d)压缩算法不在收件者的首选项中\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "强行使用的 %s (%d)对称加密算法不在收件者的首选项中\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "您不该将 %s 用于 %s 模式中\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s 已经加密给:“%s”\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s 加密过的数据\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "以未知的算法 %d 加密\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "警告:报文被使用对称加密算法的弱密钥加密。\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "处理加密包有问题\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "不支持远程调用\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "无法建立目录‘%s’:%s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr "由于配置文件权限不安全,外部程序调用被禁用\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr "在这个操作平台上调用外部程序时需要临时文件\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "无法执行程序‘%s’:%s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "无法在命令解释环境中执行‘%s’:%s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "调用外部程序时发生系统错误:%s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "外部程序异常退出\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "无法执行外部程序\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "无法读取外部程序响应:%s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "警告:无法删除临时文件(%s)‘%s’:%s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "警告:无法删除临时目录‘%s’:%s\n"
+
+#: g10/export.c:61
+msgid "export signatures that are marked as local-only"
+msgstr "导出被标记为局部的密名"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr "导出属性用户标识(一般为照片标识)"
+
+#: g10/export.c:65
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "导出被标记为“敏感”的吊销密钥"
+
+#: g10/export.c:67
+msgid "remove the passphrase from exported subkeys"
+msgstr "从导出的子钥中删除所有密码"
+
+#: g10/export.c:69
+msgid "remove unusable parts from key during export"
+msgstr "导出时清除密钥中的不可用部分"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr "导出时尽可能清除密钥中的可选部分"
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "不允许导出私钥\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "密钥 %s:未被保护――已跳过\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "密钥 %s:PGP 2.x 样式的密钥――已跳过\n"
+
+#: g10/export.c:373
+#, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "密钥 %s:密钥在卡上——已跳过\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr "准备导出一把不受保护的子钥\n"
+
+#: g10/export.c:544
+#, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "无法取消保护子钥:%s\n"
+
+#  I hope this warning doesn't confuse people.
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "警告:私钥 %s 不存在简单 SK 检验和\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "警告:没有导出任何东西\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@指令:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[文件名]|生成一份签名"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[文件名]|生成一份明文签名"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "生成一份分离的签名"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "加密数据"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "仅使用对称加密"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "解密数据(默认)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "验证签名"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "列出密钥"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "列出密钥和签名"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "列出并检查密钥签名"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "列出密钥和指纹"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "列出私钥"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "生成一副新的密钥对"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "从公钥钥匙环里删除密钥"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "从私钥钥匙环里删除密钥"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "为某把密钥添加签名"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "为某把密钥添加本地签名"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "编辑某把密钥或为其添加签名"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "生成一份吊销证书"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "导出密钥"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "把密钥导出到某个公钥服务器上"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "从公钥服务器上导入密钥"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "在公钥服务器上搜寻密钥"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "从公钥服务器更新所有的本地密钥"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "导入/合并密钥"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "打印卡状态"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "更改卡上的数据"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "更改卡的 PIN"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "更新信任度数据库"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|算法 [文件]|使用指定的散列算法打印报文散列值"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"选项:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "输出经 ASCII 封装"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|某甲|为收件者“某甲”加密"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "使用这个用户标识来签名或解密"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|设定压缩等级为 N (0 表示不压缩)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "使用标准的文本模式"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "指定输出文件"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "详细模式"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "不做任何改变"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "覆盖前先询问"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "行为严格遵循 OpenPGP 定义"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "生成与 PGP 2.x 兼容的报文"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(请参考在线说明以获得所有命令和选项的完整清单)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"范例:\n"
+"\n"
+" -se -r Bob [文件名]          为 Bob 这个收件人签名及加密\n"
+" --clearsign [文件名]         做出明文签名\n"
+" --detach-sign [文件名]       做出分离式签名\n"
+" --list-keys [某甲]           显示密钥\n"
+" --fingerprint [某甲]         显示指纹\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr ""
+"请向 <gnupg-bugs@gnu.org> 报告程序缺陷。\n"
+"请向 <zuxyhere@eastday.com> 反映简体中文翻译的问题。\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "用法: gpg [选项] [文件] (用 -h 求助)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"语法:gpg [选项] [文件名]\n"
+"签名、检查、加密或解密\n"
+"默认的操作依输入数据而定\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"支持的算法:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "公钥:"
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "对称加密:"
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "散列:"
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "压缩:"
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "用法:gpg [选项] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "冲突的指令\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "在‘%s’组定义里找不到等号(=)\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "警告:用户目录‘%s’所有权不安全\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "警告:配置文件‘%s’所有权不安全\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "警告:扩展模块‘%s’所有权不安全\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "警告:用户目录‘%s’权限不安全\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "警告:配置文件‘%s’权限不安全\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "警告:扩展模块‘%s’权限不安全\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "警告:用户目录‘%s’的关闭目录所有权不安全\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "警告:配置文件‘%s’的关闭目录所有权不安全\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "警告:扩展模块‘%s’的关闭目录所有权不安全\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "警告:用户目录‘%s’的关闭目录权限不安全\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "警告:配置文件‘%s’的关闭目录权限不安全\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "警告:扩展模块‘%s’的关闭目录权限不安全\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "未知的配置项‘%s’\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr "列出密钥时显示用户标识"
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr "列出签名时显示策略 URL"
+
+#: g10/gpg.c:1541
+msgid "show all notations during signature listings"
+msgstr "列出签名时显示 IETF 标准注记"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr "列出签名时显示 IETF 标准注记"
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr "列出签名时显示用户提供的注记"
+
+#: g10/gpg.c:1549
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "列出密钥时显示首选公钥服务器 URL"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr "列出密钥时显示用户标识的有效性"
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr "列出密钥时显示已吊销或已过期的用户标识"
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr "列出密钥时显示已吊销或已过期的子钥"
+
+#: g10/gpg.c:1557
+msgid "show the keyring name in key listings"
+msgstr "列出密钥时显示钥匙环的名称"
+
+#: g10/gpg.c:1559
+msgid "show expiration dates during signature listings"
+msgstr "列出签名时显示过期日期"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "注意:旧式的默认配置文件‘%s’已被忽略\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "注意:没有默认配置文件‘%s’\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "配置文件‘%s’:%s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "从‘%s’读取选项\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "注意:一般情况下不会用到 %s!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "对称加算密法扩展模块‘%s’因为权限不安全而未被载入\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "‘%s’不是一个有效的签名过期日期\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "‘%s’不是一个有效的字符集\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "无法解析公钥服务器 URL\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d:无效的公钥服务器选项\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "无效的公钥服务器选项\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d:无效的导入选项\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "无效的导入选项\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d:无效的导出选项\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "无效的导出选项\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d:无效的列表选项\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "无效的列表选项\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr "验证签名时显示照片标识"
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr "验证签名时显示策略 URL"
+
+#: g10/gpg.c:2572
+msgid "show all notations during signature verification"
+msgstr "验证签名时显示所有注记"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr "验证签名时显示 IETF 标准注记"
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr "验证签名时显示用户提供的注记"
+
+#: g10/gpg.c:2580
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "验证签名时显示首选公钥服务器 URL"
+
+#: g10/gpg.c:2582
+msgid "show user ID validity during signature verification"
+msgstr "验证签名时显示用户标识的有效性"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr "验证密钥时显示已吊销或已过期的子钥"
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr "使用 PKA 数据验证签名的有效性"
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr "提升带有有效 PKA 数据的签名的信任度"
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d:无效的校验选项\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "无效的校验选项\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "无法把运行路径设成 %s\n"
+
+#: g10/gpg.c:2768
+#, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d:无效的 auto-key-locate 清单\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr "无效的 auto-key-locate 清单\n"
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "警告:程序可能会创建核心内存转储!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "警告:%s 会使得 %s 失效\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s 不可与 %s 并用\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s 与 %s 并用无意义!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "注意:%s 本版本中不可用\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "不会在内存不安全的情况下运行,原因是 %s\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "您只有在 --pgp2 模式下才能做分离式或明文签名\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "您在 --pgp2 模式下时,不能同时签名和加密\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "启用 --pgp2 时您应该只使用文件,而非管道\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "在 --pgp2 模式下加密报文需要 IDEA 算法\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "所选的对称加密算法无效\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "所选的散列算法无效\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "所选的压缩算法无效\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "所选的证书散列算法无效\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "需要的完全可信签名数一定要大于 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "需要的勉强可信签名数一定要大于 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "最大验证深度一定要介于 1 和 255 之间\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "无效的默认验证级别;一定要是 0,1,2 或 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "无效的最小验证级别;一定要是 1,2 或 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "注意:强烈不建议使用简单的 S2K 模式(0)\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "无效的 S2K 模式;必须是 0,1 或 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "无效的默认首选项\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "无效的个人对称加密算法首选项\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "无效的个人散列算法首选项\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "无效的个人压缩算法首选项\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s 尚不能和 %s 并用\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "您不能在 %s 模式下使用‘%s’对称加密算法\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "您不能在 %s 模式下使用‘%s’散列算法\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "您不能在 %s 模式下使用‘%s’压缩算法\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "初始化信任度数据库失败:%s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr "警告:给定了收件人(-r)但并未使用公钥加密\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [文件名]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [文件名]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "对称加密‘%s’失败:%s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [文件名]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [文件名]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "使用 --symmetric --encrypt 时不能使用 --s2k-mode 0\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "您不能在 %s 模式下使用 --symmetric -encrypt\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [文件名]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [文件名]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [文件名]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "使用 --symmetric --sign --encrypt 时不能使用 --s2k-mode 0\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "您不能在 %s 模式下使用 --symmetric --sign -encrypt\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [文件名]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [文件名]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [文件名]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key 用户标识"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key 用户标识"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key 用户标识 [指令]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [用户标识] [钥匙环]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "上传至公钥服务器失败:%s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "从公钥服务器接收失败:%s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "导出密钥失败:%s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "搜寻公钥服务器失败:%s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "从公钥服务器更新失败:%s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "解开 ASCII 封装失败:%s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "进行 ASCII 封装失败:%s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "无效的‘%s’散列算法\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[文件名]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "请开始键入您的报文……\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "给定的的验证策略 URL 无效\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "给定的签名策略 URL 无效\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "给定的首选公钥服务器 URL 无效\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "pk 缓存里项目太多――已禁用\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[找不到用户标识]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr "自动获取‘%s’,通过 %s\n"
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "--allow-non-selfsigned-uid 使无效密钥 %s 生效\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "公钥 %s 没有相对应的私钥――忽略\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "使用子钥 %s 而非主钥 %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "密钥 %s:无相应公钥的私钥――已跳过\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "尽量减少提示信息"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "从这个钥匙环里取用密钥"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "把时间戳矛盾仅视为警告"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|FD|把状态信息写入文件描述符 FD"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "用法:gpgv [选项] [文件] (用 -h 求助)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"语法:gpg [选项] [文件]\n"
+"用已知的受信任密钥来检查签名\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"在这里指定的数值完全由您自己决定;这些数值永远不会被输出给任何第三方。\n"
+"我们需要它来实现“信任网络”;这跟隐含建立起来的“验证网络”无关。"
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"要建立起信任网络,GnuPG 需要知道哪些密钥是可绝对信任的――通常\n"
+"就是您拥有私钥的那些密钥。回答“yes”将此密钥设成可绝对信任的\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "如果您无论如何要使用这把未被信任的密钥,请回答“yes”。"
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "输入您要递送的报文的接收者的用户标识。"
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"选择使用的算法。\n"
+"\n"
+"DSA (也叫 DSS)即“数字签名算法”(美国国家标准),只能够用作签名。\n"
+"\n"
+"Elgamal 是一种只能用作加密的算法。\n"
+"\n"
+"RSA 可以用作签名或加密。\n"
+"\n"
+"第一把密钥(主钥)必须具有签名的能力。"
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"通常来说用同一把密钥签名及加密并不是个好主意。这个算法只在特定的情况\n"
+"下使用。请先咨询安全方面的专家。"
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "请输入密钥的尺寸"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "请回答“yes”或“no”"
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"请输入提示所要求的数值。\n"
+"您可以输入 ISO 日期格式(YYYY-MM-DD),但是出错时您不会得到友好的响应\n"
+"――系统会尝试将给定值解释为时间间隔。"
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "请输入密钥持有人的名字"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "请输入电子邮件地址(可选项,但强烈推荐使用)"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "请输入注释(可选项)"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  修改姓名。\n"
+"C  修改注释。\n"
+"E  修改电子邮件地址。\n"
+"O  继续产生密钥。\n"
+"Q  中止产生密钥。"
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "如果您允许生成子钥,请回答“yes”(或者“y”)。"
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"当您为某把密钥上某个用户标识添加签名时,您必须首先验证这把密钥确实属于\n"
+"署名于它的用户标识上的那个人。了解到您曾多么谨慎地对此进行过验证,对其\n"
+"他人是非常有用的\n"
+"\n"
+"“0” 表示您对您有多么仔细地验证这把密钥的问题不表态。\n"
+"\n"
+"“1” 表示您相信这把密钥属于那个声明是主人的人,但是您不能或根本没有验\n"
+"      证过。如果您为一把属于类似虚拟人物的密钥签名,这个选择很有用。\n"
+"\n"
+"“2” 表示您随意地验证了那把密钥。例如,您验证了这把密钥的指纹,或比对\n"
+"      照片验证了用户标识。\n"
+"\n"
+"“3” 表示您做了大量而详尽的验证密钥工作。例如,您同密钥持有人验证了密\n"
+"      钥指纹,而且通过查验附带照片而难以伪造的证件(如护照)确认了密钥持\n"
+"      有人的姓名与密钥上的用户标识一致,最后您还(通过电子邮件往来)验证\n"
+"      了密钥上的电子邮件地址确实属于密钥持有人。\n"
+"\n"
+"请注意上述关于验证级别 2 和 3 的说明仅是例子而已。最终还是由您自己决定\n"
+"当您为其他密钥签名时,什么是“随意”,而什么是“大量而详尽”。\n"
+"\n"
+"如果您不知道应该选什么答案的话,就选“0”。"
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "如果您想要为所有用户标识签名的话就选“yes”"
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"如果您真的想要删除这个用户标识的话就回答“yes”。\n"
+"所有相关认证在此之后也会丢失!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "如果可以删除这把子钥,请回答“yes”"
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"这是一份在这把密钥上有效的签名;通常您不会想要删除这份签名,\n"
+"因为要与这把密钥或拥有这把密钥的签名的密钥建立认证关系可能\n"
+"相当重要。"
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"这份签名无法被检验,因为您没有相应的密钥。您应该暂缓删除它,\n"
+"直到您知道此签名使用了哪一把密钥;因为用来签名的密钥可能与\n"
+"其他已经验证的密钥存在信任关系。"
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "这份签名无效。应当把它从您的钥匙环里删除。"
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"这是一份将密钥与用户标识相联系的签名。通常不应删除这样的签名。\n"
+"事实上,一旦删除,GnuPG可能从此就不能再使用这把密钥了。因此,\n"
+"只有在这把密钥的第一个自身签名因某些原因失效,而有第二个自身签\n"
+"字可用的情况下才这么做。"
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"用现有的首选项更新所有(或选定的)用户标识的首选项。所有受影响的自身签\n"
+"字的时间戳都会增加一秒钟。\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "请输入密码:这是一个秘密的句子 \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "请再次输入上次的密码,以确定您到底键入了些什么。"
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "请给定要添加签名的文件名"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "如果可以覆盖这个文件,请回答“yes”"
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"请输入一个新的文件名。如果您直接按下了回车,那么就会使用显示在括\n"
+"号中的默认的文件名。"
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"您应该为这份吊销证书指定一个原因。根据情境的不同,您可以从下列清单中\n"
+"选出一项:\n"
+"  “密钥已泄漏”\n"
+"      如果您相信有某个未经许可的人已取得了您的私钥,请选此项。\n"
+"  “密钥已替换”\n"
+"      如果您已用一把新密钥代替旧的,请选此项。\n"
+"  “密钥不再被使用”\n"
+"      如果您已决定让这把密钥退休,请选此项\n"
+"  “用户标识不再有效”\n"
+"      如果这个用户标识不再被使用了,请选此项;这通常用表明某个电子邮\n"
+"      件地址已不再有效。\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"您也可以输入一串文字,描述发布这份吊销证书的理由。请尽量使这段文\n"
+"字简明扼要。\n"
+"键入一空行以结束输入。\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "没有可用的帮助"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "‘%s’没有可用的帮助"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr "导入被标记为局部的签名"
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr "导入时修复 PKS 公钥服务器导致的损坏"
+
+#: g10/import.c:100
+msgid "do not update the trustdb after import"
+msgstr "导入后不更新信任度数据库"
+
+#: g10/import.c:102
+msgid "create a public key when importing a secret key"
+msgstr "导入私钥时创建对应的公钥"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr "只接受对已有密钥的更新"
+
+#: g10/import.c:106
+msgid "remove unusable parts from key after import"
+msgstr "导入后清除密钥中无用的部分"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr "导入后尽可能清除密钥中的可选部分"
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "跳过 %d 样式的区块\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "目前已处理 %lu 把密钥\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "合计被处理的数量:%lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "  已跳过的新密钥:%lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "    遗失用户标识:%lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "          已导入:%lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "          未改变:%lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "      新用户标识:%lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "        新的子钥:%lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "        新的签名:%lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "    新的密钥吊销:%lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "      读取的私钥:%lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "      导入的私钥:%lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "    未改变的私钥:%lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "        未被导入:%lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "      清除的签名:%lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr "  清除的用户标识:%lu\n"
+
+#: g10/import.c:567
+#, fuzzy, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "警告:密钥 %s 下列用户标识的首选项中包含不可用的算法:\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "      新用户标识:%lu\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         “%s”:对称加密算法 %s 对应首选项\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         “%s”:散列算法 %s 对应首选项\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         “%s”:压缩算法 %s 对应首选项\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "强烈建议您更新您的首选项并重新分发这把密钥,\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr "以避免可能的算法不匹配问题\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "您可以这样更新您的首选项:gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "密钥 %s:没有用户标识\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "密钥 %s:PKS 子钥破损已修复\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "密钥 %s:已接受不含自身签名的用户标识“%s”\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "密钥 %s:没有有效的用户标识\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "这可能由于遗失自身签名所致\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "密钥 %s:找不到公钥:%s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "密钥 %s:新密钥――已跳过\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "找不到可写的钥匙环:%s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "正在写入‘%s’\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "写入钥匙环‘%s’时出错: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "密钥 %s:公钥“%s”已导入\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "密钥 %s:与我们的副本不吻合\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "密钥 %s:无法定位原始的密钥区块:%s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "密钥 %s:无法读取原始的密钥区块: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "密钥 %s:“%s”一个新的用户标识\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "密钥 %s:“%s”%d 个新的用户标识\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "密钥 %s:“%s”1 个新的签名\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "密钥 %s:“%s”%d 个新的签名\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "密钥 %s:“%s”1 个新的子钥\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "密钥 %s:“%s”%d 个新的子钥\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "密钥 %s:“%s”%d 个签名被清除\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "密钥 %s:“%s”%d 个签名被清除\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "密钥 %s:“%s”%d 个用户标识被清除\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "密钥 %s:“%s”%d 个用户标识被清除\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "密钥 %s:“%s”未改变\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "密钥 %s:私钥使用了无效的加密算法 %d――已跳过\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "不允许导入私钥\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "没有默认的私钥钥匙环: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "密钥 %s:私钥已导入\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "密钥 %s:已在私钥钥匙环中\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "密钥 %s:找不到私钥:%s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "密钥 %s:没有公钥――无法应用吊销证书\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "密钥 %s:无效的吊销证书:%s――已拒绝\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "密钥 %s:“%s”吊销证书已被导入\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "密钥 %s:签名没有用户标识\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "密钥 %s:用户标识“%s”使用了不支持的公钥算法\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "密钥 %s:用户标识“%s”自身签名无效\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "密钥 %s:没有可供绑定的子钥\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "密钥 %s:不支持的公钥算法\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "密钥 %s:无效的子钥绑定\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "密钥 %s:已删除多重子钥绑定\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "密钥 %s:没有用于密钥吊销的子钥\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "密钥 %s:无效的子钥吊销\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "密钥 %s:已删除多重子钥吊销\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "密钥 %s:已跳过用户标识“%s”\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "密钥 %s:已跳过子钥\n"
+
+#  here we violate the rfc a bit by still allowing
+#  * to import non-exportable signature when we have the
+#  * the secret key used to create this signature - it
+#  * seems that this makes sense
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "密钥 %s:不可导出的签名(验证级别 0x%02X)――已跳过\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "密钥 %s:吊销证书位置错误――已跳过\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "密钥 %s:无效的吊销证书:%s――已跳过\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "密钥 %s:子钥签名位置错误――已跳过\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "密钥 %s:与预期不符的签名验证级别(0x%02X)――已跳过\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "密钥 %s:检测到重复的用户标识――已合并\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "警告:密钥 %s 可能已被吊销:正在取回吊销密钥 %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "警告:密钥 %s 可能已被吊销:吊销密钥 %s 不存在。\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "密钥 %s:已新增吊销证书“%s”\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "密钥 %s:已新增直接密钥签名\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "注意:密钥的序列号与卡的不符\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "注意:主钥在线,存储在卡上\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "注意:子钥在线,存储在卡上\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "建立钥匙环‘%s’时发生错误:%s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "钥匙环‘%s’已建立\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "密钥块资源‘%s’:%s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "重新建立钥匙环缓存失败: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[吊销]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[自身签名]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 个损坏的签名\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d 个损坏的签名\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "有 1 份签名因为遗失密钥而未被检查\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "有 %d 份签名因为遗失密钥而未被检查\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "有 1 份签名因为某个错误而未被检查\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "有 %d 份签名因为某些错误而未被检查\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "检测到 1 个没有有效自身签名的用户标识\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "检测到 %d 个没有有效自身签名的用户标识\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"您是否相信这位用户有能力验证其他用户密钥的有效性(查对身份证、通过不同的渠道检"
+"查\n"
+"指纹等)?\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = 我勉强相信\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = 我完全相信\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"请输入这份信任签名的深度。\n"
+"深度若大于 1 则您将签名的这把密钥将可以以您的名义做出信任签名。\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "请输入这份签名的限制域,如果没有请按回车。\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "用户标识“%s”已被吊销。"
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "您仍然想要为它签名吗?(y/N)"
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  无法添加签名。\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "用户标识“%s”已过期。"
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "警告:用户标识“%s”不含自身签名。"
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "可以为用户标识“%s”添加签名。"
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "为其添加签名吗?(y/N)"
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"“%s”的自身签名是 PGP 2.x 样\n"
+"式的签名。\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "您是否想要将它升级成 OpenPGP 的自身签名?(y/N)"
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr "您目前为“%s”的签名已经过期了。\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "您想要发布一份新的签名来取代已过期的那一个吗?(y/N)"
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr "您目前为“%s”的签名是一份本地签名。\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "您是否想要把它升级成可以完全导出的签名?(y/N)"
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "“%s”已由密钥 %s 在本地签名\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "“%s”已由密钥 %s 签名\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "您仍然想要为它再次签名吗?(y/N)"
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "没有东西可以让密钥 %s 签名\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "这把密钥已经过期!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "这把密钥将在 %s 过期。\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "您想要让您的签名也同时过期吗? (Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr "您不能在 --pgp2 模式下,用 PGP 2.x 密钥生成 OpenPGP 签名。\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "这会让这把密钥在 PGP 2.x 模式下不可使用。\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"您是否谨慎地检查过,确认正要签名的密钥的确属于以上它所声称的所有者呢?\n"
+"如果您不知道这个问题的答案,请输入“0”。\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) 我不作答。 %s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) 我根本没有检查过。 %s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) 我随意检查过。 %s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) 我非常小心地检查过。 %s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "您的选择?(输入‘?’以获得更多的信息):"
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"您真的确定要签名这把密钥,使用您的密钥\n"
+"“%s”(%s)\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "这将是一个自身签名。\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "警告:这份签名不会被标记为不可导出。\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "警告:这份签名不会被标记成不可吊销。\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "这份签名会被标记成不可导出。\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "这份签名会被标记成不可吊销。\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "我根本没有检查过这把密钥。\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "我随意检查过这把密钥。\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "我非常小心地检查过这把密钥。\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "真的要签名吗?(y/N)"
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "签名时失败: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr "只有占位密钥,或者密钥存储在卡上——没有密码可以更改。\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "这把密钥没有被保护。\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "主钥的私钥部分无法取用。\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "主钥的私钥部分存储在卡上。\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "密钥受保护。\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "无法编辑这把密钥: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"输入要给这把私钥用的新密码。\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "密码再次输入时与首次输入不符;请再试一次"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"您不想要用密码――这大概是个坏主意!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "您真的想要这么做吗?(y/N)"
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "正在把密钥的签名移动到正确的位置去\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "保存并离开"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "显示密钥指纹"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "列出密钥和用户标识"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "选择用户标识 N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "选择子钥 N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "检查签名"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "为所选用户标识添加签名[* 参见下面的相关命令]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "为所选用户标识添加本地签名"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "为所选用户标识添加信任签名"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "为所选用户标识添加不可吊销签名"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "增加一个用户标识"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "增加一个照片标识"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "删除选定的用户标识"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "添加一个子钥"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "在智能卡上添加一把密钥"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "将一把密钥移动到智能卡上"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "将备份密钥转移到卡上"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "删除选定的子钥"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "增加一把吊销密钥"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "删除所选用户标识上的签名"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "变更密钥或所选子钥的使用期限"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "将所选的用户标识设为首选用户标识"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "在私钥和公钥清单间切换"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "列出首选项(专家模式)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "列出首选项(详细模式)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "设定所选用户标识的首选项"
+
+#: g10/keyedit.c:1428
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "设定所选用户标识的首选公钥服务器的 URL"
+
+#: g10/keyedit.c:1430
+msgid "set a notation for the selected user IDs"
+msgstr "为所选用户标识的设定注记"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "更改密码"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "更改信任度"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "吊销所选用户标识上的签名"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "吊销选定的用户标识"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "吊销密钥或选定的子钥"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "启用密钥"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "禁用密钥"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "显示选定的照片标识"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr "压缩不可用的用户标识并删除不可用的签名"
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr "压缩不可用的用户标识并删除所有签名"
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "读取私钥区块“%s”时出错:%s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "私钥可用。\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "要有私钥才能这么做。\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "请先使用“toggle”指令。\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* ‘sign’命令可以带‘l’前缀(lsign)以添加本地签名,或‘t’前缀(tsign)以添加\n"
+"  信任签名,或‘nr’前缀(nrsign)以添加不可吊销签名,或者以上三种前缀的任何组\n"
+"  合(ltsign、tnrsign 等)。\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "密钥已被吊销。"
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "真的为所有的用户标识签名吗?(y/N)"
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "提示:选择要添加签名的用户标识\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "未知的签名类型‘%s’\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "在 %s 模式中不允许使用这个指令。\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "您至少得选择一个用户标识。\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "您不能删除最后一个用户标识!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "真的要删除所有选定的用户标识吗?(y/N)"
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "真的要删除这个用户标识吗?(y/N)"
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "真的要删除主钥吗?(y/N)"
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "您必须指定一把密钥。\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "命令需要一个文件名作为参数\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "无法打开‘%s’:%s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "从‘%s’读取备份密钥时出错:%s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "您必须选择至少一把密钥。\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "您真的想要删除选定的密钥吗?(y/N)"
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "您真的要删除这把密钥吗?(y/N)"
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "真的要吊销所有选定的用户标识吗?(y/N)"
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "真的要吊销这个用户标识吗?(y/N)"
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "您真的要吊销整把密钥吗?(y/N)"
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "您真的要吊销选定的子钥吗?(y/N)"
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "您真的要吊销这把子钥吗?(y/N)"
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr "使用用户提供的信任度数据库时信任度可能并未被设定\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "设为首选项列表为:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "真的要更新所选用户标识的首选项吗?(y/N)"
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "真的要更新首选项吗?(y/N)"
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "要保存变动吗?(y/N)"
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "要不保存而离开吗?(y/N)"
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "更新失败:%s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "更新私钥失败:%s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "密钥没有变动所以不需要更新。\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "散列:"
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "特点:"
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "公钥服务器不可变造"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "首选公钥服务器:"
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+msgid "Notations: "
+msgstr "注记:"
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "PGP 2.x 样式的用户标识没有首选项。\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "此密钥已于 %s 被 %s 密钥 %s 所吊销\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "这把密钥可被 %s 密钥 %s 吊销"
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr " (敏感的)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "创建于:%s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "已吊销:%s"
+
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "已过期:%s"
+
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "有效至:%s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "可用于:%s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "信任度:%s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "有效性:%s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "这把密钥已经被禁用"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "卡号:"
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr "请注意,在您重启程序之前,显示的密钥有效性未必正确,\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "已吊销"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "已过期"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"警告:没有首选用户标识。此指令可能假定一个不同的用户标识为首选用户标识。\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"警告:这是一把 PGP2 样式的密钥。\n"
+"      增加照片标识可能会导致某些版本的 PGP 不能识别这把密钥。\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "您确定仍然想要增加吗?(y/N)"
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "您不可以把照片标识增加到 PGP2 样式的密钥里。\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "删除这个完好的签名吗?(y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "删除这个无效的签名吗?(y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "删除这个未知的签名吗?(y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "真的要删除这个自身签名吗?(y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "已经删除了 %d 个签名。\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "已经删除了 %d 个签名。\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "没有东西被删除。\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "无效"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "用户标识“%s”:无用部分已清除\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "密钥 %s:“%s”%d 个签名被清除\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "密钥 %s:“%s”%d 个签名被清除\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "用户标识“%s”:无用部分已清除\n"
+
+#: g10/keyedit.c:3252
+#, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "用户标识“%s”:无用部分已清除\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"警告:这是一把 PGP2 样式的密钥。\n"
+"      增加指定吊销者可能会导致某些版本的 PGP 无法识别这把密钥。\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "您不可以为 PGP 2.x 样式的密钥添加指定吊销者。\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "输入指定吊销者的用户标识:"
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "无法将 PGP 2.x 样式的密钥设为指定吊销者\n"
+
+#  This actually causes no harm (after all, a key that
+#  designates itself as a revoker is the same as a
+#  regular key), but it's easy enough to check.
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "您不能将某把密钥设为它自己的指定吊销者\n"
+
+#  This actually causes no harm (after all, a key that
+#  designates itself as a revoker is the same as a
+#  regular key), but it's easy enough to check.
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "这把密钥已被指定为一个吊销者\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "警告:将某把密钥指派为指定吊销者的操作无法撤销!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "您确定要将这把密钥设为指定吊销者吗?(y/N):"
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "请从私钥中删除选择。\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "请至多选择一个子钥。\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "将要变更子钥的使用期限。\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "将要变更主钥的使用期限。\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "您不能变更 v3 密钥的使用期限\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "在私钥环里没有相应的签名\n"
+
+#: g10/keyedit.c:3673
+#, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "签名的子钥 %s 已经交叉验证\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr "子钥 %s 不签名,因此不需要交叉验证\n"
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "请精确地选择一个用户标识。\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "跳过用户标识“%s”的 v3 自身签名\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "输入您首选的公钥服务器的 URL:"
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "您确定要替换它吗?(y/N)"
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "您确定要删除它吗?(y/N)"
+
+#: g10/keyedit.c:4194
+msgid "Enter the notation: "
+msgstr "输入注记:"
+
+#: g10/keyedit.c:4343
+msgid "Proceed? (y/N) "
+msgstr "继续?(y/N)"
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "没有索引为 %d 的用户标识\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "没有散列值为 %s 的用户标识\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "没有索引为 %d 的子钥\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "用户标识:“%s”\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "由您的密钥 %s 于 %s%s%s 签名\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (不可导出)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "这份签名已在 %s 过期。\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "您确定您仍然想要吊销它吗?(y/N)"
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "要为这份签名生成一份吊销证书吗?(y/N)"
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "您已经为这些密钥 %s 上的这些用户标识添加签名:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (不可吊销)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "由您的密钥 %s 于 %s 吊销\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "您正在吊销这些签名:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "真的要生成吊销证书吗?(y/N)"
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "没有私钥\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "用户标识“%s”已经被吊销。\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "警告:有一份用户标识签名的日期标记为 %d 秒后的未来\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "密钥 %s 已被吊销。\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "子钥 %s 已被吊销。\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "正在显示 %s 照片标识(大小为 %ld,属于密钥 %s,用户标识 %d)\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "首选项‘%s’重复\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "太多对称加密算法首选项\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "太多散列算法首选项\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "太多首选压缩算法\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "首选项字符串里有无效项‘%s’\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "正在写入直接签名\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "正在写入自身签名\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "正在写入密钥绑定签名\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "密钥尺寸无效:改用 %u 位\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "密钥尺寸舍入到 %u 位\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "签名"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr "验证"
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "加密"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "认证"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsEeAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "%s 密钥可能的操作:"
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "目前允许的操作:"
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) 选择是否用于签名\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) 选择是否用于加密\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) 选择是否用于认证\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) 已完成\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "请选择您要使用的密钥种类:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA 和 ElGamal (默认)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (仅用于签名)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (自定义用途)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) ElGamal (仅用于加密)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (仅用于签名)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (仅用于加密)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (自定义用途)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA 密钥对会有 %u 位。\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "%s 密钥长度应在 %u 位与 %u 位之间。\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "您想要用多大的密钥尺寸?(%u)"
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "%s 密钥尺寸必须在 %u 与 %u 间\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "您所要求的密钥尺寸是 %u 位\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "舍入到 %u 位\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"请设定这把密钥的有效期限。\n"
+"         0 = 密钥永不过期\n"
+"      <n>  = 密钥在 n 天后过期\n"
+"      <n>w = 密钥在 n 周后过期\n"
+"      <n>m = 密钥在 n 月后过期\n"
+"      <n>y = 密钥在 n 年后过期\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"请设定这份签名的有效期限。\n"
+"         0 = 签名永不过期\n"
+"      <n>  = 签名在 n 天后过期\n"
+"      <n>w = 签名在 n 周后过期\n"
+"      <n>m = 签名在 n 月后过期\n"
+"      <n>y = 签名在 n 年后过期\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "密钥的有效期限是?(0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "签名的有效期限是多久?(%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "无效的数值\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "密钥永远不会过期\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "签名永远不会过期\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "密钥于 %s 过期\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "签名于 %s 过期\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"您的系统无法显示 2038 年以后的日期。\n"
+"不过,它可以正确处理 2106 年之前的年份。\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "以上正确吗?(y/n)"
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组"
+"合\n"
+"成用户标识,如下所示:\n"
+"    “Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>”\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "真实姓名:"
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "姓名含有无效的字符\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "姓名不可以用数字开头\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "姓名至少要有五个字符长\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "电子邮件地址:"
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "电子邮件地址无效\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "注释:"
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "注释含有无效的字符\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "您正在使用‘%s’字符集。\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"您选定了这个用户标识:\n"
+"    “%s”\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "请不要把电子邮件地址放进您的真实姓名或注释里\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "更改姓名(N)、注释(C)、电子邮件地址(E)或退出(Q)?"
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?"
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "请先改正错误\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"您需要一个密码来保护您的私钥。\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动\n"
+"鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "密钥生成已取消。\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "正在将公钥写至`%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "向‘%s’写入私钥占位符\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "正在将私钥写至`%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "找不到可写的公钥钥匙环:%s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "找不到可写的私钥钥匙环:%s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "写入公钥钥匙环‘%s’时发生错误: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "写入私钥钥匙环‘%s’时发生错误: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "公钥和私钥已经生成并经签名。\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"请注意这把密钥还不能用来加密,您必须先用“--edit-key”指令\n"
+"生成用于加密的子钥。\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "生成密钥失败:%s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr "密钥是在 %lu 秒后的未来生成的(可能是因为时空扭曲或时钟的问题)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr "密钥是在 %lu 秒后的未来生成的(可能是因为时空扭曲或时钟的问题)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "注意:为 v3 密钥生成子钥会失去 OpenPGP 兼容性\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "真的要建立吗?(y/N)"
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "向卡上存储密钥时失败:%s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "不能创建备份文件‘%s’:%s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "注意:卡密钥的备份已保存到‘%s’\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "永不过期"
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "关键签名策略:"
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "签名策略:"
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "关键首选公钥服务器:"
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "关键签名注记:"
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "签名注记:"
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "钥匙环"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "主钥指纹:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "子钥指纹:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr " 主钥指纹:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr " 子钥指纹:"
+
+#  use tty
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "密钥指纹 ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "卡序列号 ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "将‘%s’重命名为‘%s’时失败:%s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "警告:两个文件存在有互相矛盾的信息。\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s 是没有改变的那一个\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s 是新的那一个\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "请修补这个可能的安全性漏洞\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "缓存钥匙环‘%s’\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "目前已缓存 %lu 把密钥(%lu 份签名)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "缓存了 %lu 把密钥(%lu 份签名)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s:钥匙环已建立\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr "在搜索结果中包含已吊销的密钥"
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr "按钥匙号搜索时包含子钥"
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr "向公钥服务器辅助程序传递数据时使用临时文件"
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr "不删除使用过的临时文件"
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr "验证签名时自动下载密钥"
+
+#: g10/keyserver.c:72
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "使用密钥中指定的首选公钥服务器 URL"
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr "获取密钥时使用密钥上的 PKA 记录"
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "警告:公钥服务器选项‘%s’在此平台上没有被使用\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "已禁用"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "输入数字以选择,输入 N 翻页,输入 Q 退出 >"
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "无效的公钥服务器协议(us %d!=handler %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "在公钥服务器上找不到密钥“%s”\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "在公钥服务器上找不到密钥\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "下载密钥‘%s’,从 %s 服务器 %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "下载密钥 %s,从 %s\n"
+
+#: g10/keyserver.c:1173
+#, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "在 %s 服务器 %s 上搜索名字\n"
+
+#: g10/keyserver.c:1176
+#, c-format
+msgid "searching for names from %s\n"
+msgstr "在 %s 上搜索名字\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "将密钥‘%s’上传到 %s 服务器 %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "将密钥‘%s’上传到 %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "搜索“%s”,在 %s 服务器 %s 上\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "搜索“%s”,在 %s 上\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "公钥服务器无动作!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "警告:处理公钥服务器的程序来自不同版本的 GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "公钥服务器未发送 VERSION\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "未给出公钥服务器(使用 --keyserver 选项)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "这一编译版本不支持外部调用公钥服务器\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "没有处理‘%s’公钥服务器的程序\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "‘%s’操作不为‘%s’公钥服务器所支持\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s 不支持对版本 %d 的处理\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "公钥服务器超时\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "公钥服务器内部错误\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "公钥服务器通讯错误:%s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "“%s”不是一个用户标识:跳过\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "警告:无法更新密钥 %s,通过 %s:%s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "1 个密钥正从 %s 得到更新\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "%d 个密钥正从 %s 得到更新\n"
+
+#: g10/keyserver.c:1955
+#, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "警告:无法获取 URI %s:%s\n"
+
+#: g10/keyserver.c:1961
+#, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "不能解析 URI %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "加密过的会话密钥尺寸(%d)诡异\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s 加密过的会话密钥\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "密码由未知的散列算法 %d 生成\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "公钥是 %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "公钥加密过的数据:完好的数据加密密钥\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "由 %u 位的 %s 密钥加密,钥匙号为 %s、生成于 %s\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      “%s”\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "由 %s 密钥加密、钥匙号为 %s\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "公钥解密失败:%s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "以 %lu 个密码加密\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "以 1 个密码加密\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "假定 %s 为加密过的数据\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA 算法不可用,试以 %s 代替\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "解密成功\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "警告:报文未受到完整的保护\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "警告:加密过的报文已经变造!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "解密失败:%s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "注意:发件者要求您“只阅读不存盘”\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "原始文件名 =‘%.*s’\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "独立的吊销证书――请用“gpg --import”来应用\n"
+
+#: g10/mainproc.c:1165
+msgid "no signature found\n"
+msgstr "未找到签名\n"
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "签名验证已被抑制\n"
+
+#: g10/mainproc.c:1508
+msgid "can't handle this ambiguous signature data\n"
+msgstr "无法处理这些有歧义的签名\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "签名建立于 %s\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "              使用 %s 密钥 %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "于 %s 创建的签名,使用 %s,钥匙号 %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "可用的密钥在:"
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "已损坏的签名,来自于“%s”"
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "过期的签名,来自于“%s”"
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "完好的签名,来自于“%s”"
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[不确定]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "              亦即“%s”"
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "这份签名已于 %s 过期。\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "这份签名在 %s 过期。\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s 签名,散列算法 %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "二进制"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "文本模式"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "未知"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "无法检查签名:%s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "不是一份分离的签名\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "警告:检测到多重签名。只检查第一个签名。\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "等级 0x%02x 的独立签名\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "旧式(PGP 2.x)签名\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "在 proc_tree() 中检测到无效的根包\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "无法禁用核心内存转储:%s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "‘%s’的 fstat 在 %s 中出错:%s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) 在 %s 中出错:%s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "警告: 使用试验性质的公钥算法 %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "警告:使用试验性质的对称加密算法 %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "警告:使用试验性质的散列算法 %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "警告:不建议使用散列算法 %s\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA 算法插件不存在\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, c-format
+msgid "please see %s for more information\n"
+msgstr "请参见 %s 以得到更多信息。\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d:不建议使用该选项“%s”\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "警告:“%s”选项已不建议使用\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "请以“%s%s”代替\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "警告:“%s”命令已不建议使用——不要使用它\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "不压缩"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "未压缩|无"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "%s 也许不能使用这个报文\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "有歧义的选项‘%s’\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "未知的选项 '%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "文件‘%s’已存在。 "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "是否覆盖?(y/N)"
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s:未知的后缀名\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "请输入新的文件名"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "正在写入到标准输出\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "假定被签名的数据是‘%s’\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "新的配置文件‘%s’已建立\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "警告:在‘%s’里的选项于此次运行期间未被使用\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "已创建目录‘%s’\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "无法操作公钥算法 %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "警告:潜在不安全的对称加密会话密钥\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "%d 类别的子包设定了关键位\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent 在此次舍话中无法使用\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "GPG_AGENT_INFO 环境变量格式错误\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "不支持 gpg-agent 协议版本 %d\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "无法连接至‘%s’:%s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "代理程序有问题――正在停用代理程序\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (主钥匙号 %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"您需要这个用户的密码来解开私钥:\n"
+"“%.*s”\n"
+"%u 位的 %s 密钥,钥匙号 %s,建立于 %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "请再输入一次密码\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "请输入密码\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "用户取消\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "在批处理模式中无法查询密码\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "请输入密码:"
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr "您需要输入密码,才能解开这个用户的私钥:“%s”\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u 位的 %s 密钥,钥匙号 %s,建立于 %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (主钥 %s 的子钥)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "请再输入一次密码:"
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"请挑选一张图片作为您的照片标识 。这张图片一定要是JPEG文件。请记住这张图\n"
+"片会被存放在您的公钥里。如果您挑了非常大的图片的话,您的密钥也会变得非\n"
+"常大!请尽量把图片尺寸控制在240x288左右,这是个理想的尺寸。\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "输入要当作相片标识的JPEG文件名: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "无法打开 JPEG 文件‘%s’:%s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "这个 JPEG 文件太大了(%d 字节)!\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "您确定要用它吗?(y/N)"
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "“%s”不是一个 JPEG 文件\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "这张照片正确吗?(y/N/q)"
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr "没有设置照片查看程序\n"
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "无法显示照片标识!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "未指定原因"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "密钥被替换"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "密钥已泄漏"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "密钥不再使用"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "用户标识不再有效"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "吊销原因:"
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "吊销注释:"
+
+#  a string with valid answers
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "下列项目没有指定信任度:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  亦即“%s”\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "您是否相信这把密钥属于它所声称的持有者?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr "  %d = 我不知道或我不作答\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = 我不相信\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = 我绝对相信\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr "  m = 回到主菜单\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr "  s = 跳过这把密钥\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = 退出\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"这把密钥的最小信任等级为:%s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "您的决定是什么?"
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "您真的要把这把密钥设成绝对信任?(y/N)"
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "被绝对信任的密钥的证书:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%s:没有证据表明这把密钥真的属于它所声称的持有者\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%s:只有有限的证据表明这把密钥属于它所声称的持有者\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "这把密钥有可能属于它所声称的持有者\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "这把密钥是属于我们的\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"这把密钥并不一定属于用户标识声称的那个人。如果您真的知道自\n"
+"己在做什么,您可以在下一个问题回答 yes。\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "无论如何还是使用这把密钥吗?(y/N)"
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "警告:正在使用不被信任的密钥!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "警告:此密钥可能已被吊销(吊销密钥不存在)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "警告:这把密钥已经被它的指定吊销者吊销了!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "警告:这把密钥已经被它的持有者吊销了!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "      这表明这个签名有可能是伪造的。\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "警告:这把子钥已经被它的持有者吊销了!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "注意:这把密钥已经被禁用了。\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr "注意:验证过的签名者的地址是‘%s’\n"
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr "注意:签名者的地址‘%s’不匹配任何 DNS 记录\n"
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr "PKA 信息有效,信任级别调整到“完全”\n"
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr "PKA 信息无效,信任级别调整到“从不”\n"
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "注意:这把密钥已经过期了!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "警告:这把密钥未经受信任的签名认证!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "      没有证据表明这个签名属于它所声称的持有者。\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "警告:我们不信任这把密钥!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "      这个签名很有可能是伪造的。\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr "警告:这把密钥未经有足够信任度的签名所认证。\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "      这份签名并不一定属于它所声称的持有者\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s:已跳过:%s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: 已跳过:公钥已存在\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "您没有指定用户标识。(您可以在命令行中用“-r”指定)\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "当前收件人:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"输入用户标识。以空白行结束:"
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "没有这个用户标识。\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "已跳过:公钥已被设为默认收件者\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "公钥被禁用。\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "已跳过:公钥已被设定\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "未知的默认收件者“%s”\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s:已跳过:公钥已被禁用\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "没有有效的地址\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "数据未被保存;请用“--output”选项来保存它们\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "建立‘%s’时发生错误:%s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "分离的签名。\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "请输入数据文件的名称: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "正在从标准输入读取 ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "不含签名的数据\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "无法打开有签名的数据‘%s’\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "匿名收件者;正在尝试使用私钥 %s ……\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "很好,我们就是匿名收件者。\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "不支持旧式的 DEK 编码\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "对称加密算法 %d%s 未知或已停用\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "注意:收件人的首选项中找不到加密算法 %s\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "注意:私钥 %s 已于 %s 过期\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "注意:密钥已被吊销"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet 失败:%s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "密钥 %s:没有有效的用户标识\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "将被吊销,吊销者:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(这是一把敏感的吊销密钥)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "要为这把密钥建立一份指定吊销者证书吗?(y/N)"
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "已强行使用 ASCII 封装过的输出。\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet 失败: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "已建立吊销证书。\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "没有找到“%s”的吊销密钥\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "找不到私钥“%s”:%s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "没有相对应的公钥:%s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "公钥与私钥不吻合!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "要为这把密钥建立一份吊销证书吗?(y/N)"
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "未知的保护算法\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "注意:这把密钥没有被保护!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"已建立吊销证书。\n"
+"\n"
+"请把这个文件转移到一个可隐藏起来的介质(如软盘)上;如果坏人能够取得这\n"
+"份证书的话,那么他就能让您的密钥无法继续使用。把这份凭证打印出来再藏\n"
+"到安全的地方也是很好的方法,以免您的保存媒体损毁而无法读取。但是千万\n"
+"小心:您的机器上的打印系统可能会在打印过程中把这些数据临时在某个其他\n"
+"人也能够看得到的地方!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "请选择吊销的原因:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "取消"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(也许您会想要在这里选择 %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "请输入描述(可选);以空白行结束:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "吊销原因:%s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(不给定描述)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "这样可以吗? (y/N)"
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "私钥部分不可用\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "保护算法 %d%s 未被支持\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "不支持保护散列 %d\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "无效的密码;请再试一次"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s……\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "警告:检测到弱密钥――请更换密码。\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "正在产生私钥保护使用的旧式 16 位校验和\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "建立了弱密钥――正在重试\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr "对称加密无法避免生成弱密钥;已经尝试 %d 次!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr "DSA 需要散列值长度为 8 位的倍数\n"
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr "DSA 密钥 %s 使用不安全的(%u 位)的散列\n"
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr "DSA 密钥 %s 需要 %u 位或更长的散列\n"
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "警告:签名散列值与报文不一致\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "警告:签名的子钥 %s 未经交叉验证\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "警告:签名的子钥 %s 交叉验证无效\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "公钥 %s 在其签名后 %lu 秒生成\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "公钥 %s 在其签名后 %lu 秒生成\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr "密钥 %s 是在 %lu 秒后的未来生成的(可能是因为时空扭曲或时钟的问题)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr "密钥 %s 是在 %lu 秒后的未来生成的(可能是因为时空扭曲或时钟的问题)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "注意:签名密钥 %s 已于 %s 过期\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "假定密钥 %s 的签名由于某个未知的关键位出错而损坏\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "密钥 %s:没有子钥吊销签名所需的子钥\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "密钥 %s:没有子钥绑定签名所需的子钥\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "无法在 v3 (PGP 2.x样式)的签名内放入注记数据\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "无法在 v3 (PGP 2.x样式)的密钥签名内放入注记数据\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr "警告:注记 %% 无法扩展(太大了)。现在使用未扩展的。\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "无法在 v3 (PGP 2.x样式)的签名内放入策略 URL\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "无法在 v3 (PGP 2.x样式)的密钥签名内放入策略 URL\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr "警告:无法 %%-扩展策略 URL (太大了)。现在使用未扩展的。\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr "警告:无法 %%-扩展首选公钥服务器 URL (太大了)。现在使用未扩展的。\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "检查已建立的签名时发生错误: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s 签名来自:“%s”\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "您在 --pgp2 模式下只能够使用 PGP 2.x 样式的密钥来做分离签名\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "警告:强行使用的 %s (%d)散列算法不在收件者的首选项中\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "正在签名:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "您在 --pgp2 模式下只能够使用 PGP 2.x 样式的密钥来做明文签名\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s 加密将被采用\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "密钥未被标示为不安全――不能与假的随机数发生器共同使用!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "“%s”已跳过:重复\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "“%s”已跳过:%s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "已跳过:私钥已存在\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr "这是一把由 PGP 生成的 ElGamal 密钥,用于签名不安全!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "信任记录 %lu,类别 %d:写入失败:%s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# 已指定的信任度的清单,建立于 %s \n"
+"# (请用“gpg --import-ownertrust”导入这些信任度)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "‘%s’中出错:%s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "列太长"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "冒号缺失"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "指纹无效"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "没有信任度"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "在‘%s’中寻找信任度记录时出错:%s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "读取‘%s’错误:%s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "信任度数据库:同步失败:%s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "信任度数据库记录 %lu:lseek 失败:%s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "信任度数据库记录 %lu:write 失败 (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "信任度数据库处理量过大\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "无法存取‘%s’:%s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s:目录不存在!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "不能为‘%s’创建锁定\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "无法锁定‘%s’\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s:建立版本记录失败:%s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s:建立了无效的信任度数据库\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s:建立了信任度数据库\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "注意:信任度数据库不可写入\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s:无效的信任度数据库\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s:建立散列表失败:%s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s:更新版本记录时出错: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s:读取版本记录时出错: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s:写入版本记录时出错:%s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "信任度数据库:lseek 失败:%s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "信任度数据库:read 失败(n=%d):%s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s:不是一个信任度数据库文件\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s:记录编号为%lu的版本记录\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s:无效的文件版本%d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s:读取自由记录时出错:%s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s:写入目录记录时出错:%s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s:记录归零时失败:%s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s:附加记录时失败:%s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "信任度数据库已损坏;请执行“gpg --fix-trustdb”。\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "无法处理长于 %d 字符的文本行\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "输入行长度超过 %d 字符\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "‘%s’不是一个有效的长式钥匙号\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "密钥 %s:受信任,已接受\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "密钥 %s 在信任度数据库中重复出现\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "密钥 %s:受信任的密钥没有公钥――已跳过\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "密钥 %s 被标记为绝对信任\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "信任记录 %lu,请求类别 %d:读取失败:%s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "信任记录 %lu 不属于所请求的类别 %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr "无法使用未知的信任模型(%d)――假定使用 %s 信任模型\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "使用 %s 信任模型\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "10 translator see trustdb.c:uid_trust_string_fixed"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[已吊销]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[已过期]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[ 未知 ]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[未定义]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[ 勉强 ]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[ 完全 ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[ 绝对 ]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "未定义"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "从不"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "勉强"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "完全"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "绝对"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "不需要检查信任度数据库\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "下次信任度数据库检查将于 %s 进行\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "使用‘%s’信任模型时不需要检查信任度数据库\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "使用‘%s’信任模型时不需要更新信任度数据库\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "找不到公钥 %s:%s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "请执行一次 --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "正在检查信任度数据库\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "已经处理了 %d 把密钥(共计已解决了 %d 份的有效性)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "没有找到任何绝对信任的密钥\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "绝对信任的密钥 %s 的公钥未被找到\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr "需要 %d 份勉强信任和 %d 份完全信任,%s 信任模型\n"
+
+#: g10/trustdb.c:2283
+#, 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"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "无法更新信任度数据库版本记录:写入失败:%s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"签名无法被验证。\n"
+"请记住签名文件(.sig或.asc)\n"
+"应该是在命令行中给定的第一个文件。\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "输入行 %u 太长或者行末的换行符 LF 遗失\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "常规错误"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "未知的包类型"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "未知的版本"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "未知的公钥算法"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "未知的散列算法"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "公钥已经损坏"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "私钥已经损坏"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "签名已经损坏"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "校验和错误"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "错误的密码"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "找不到公钥"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "未知的对称加密算法"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "无法打开钥匙环"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "无效包"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "无效的 ASCII 封装格式"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "没有这个用户标识"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "私钥不可用"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "使用了错误的私钥"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "未被支持"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "密钥已损坏"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "文件读取错误"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "文件写入错误"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "未知的压缩算法"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "文件打开错误"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "文件建立错误"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "无效的密码"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "未实现的公钥算法"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "未实现的对称加密算法"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "未知的签名等级"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "信任度数据库错误"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "损坏的多精度整数(MPI)"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "资源限制"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "无效的钥匙环"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "证书已损坏"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "被变造过的用户标识"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "文件关闭错误"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "文件重命名错误"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "文件删除错误"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "非预期的数据"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "时间戳冲突"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "无法使用的公钥算法"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "文件已存在"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "弱密钥"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "无效的参数"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "URI 已损坏"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "未被支持的 URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "网络错误"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "未被加密"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "未被处理"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "不可用的公钥"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "不可用的私钥"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "公钥服务器错误"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "已取消"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "没有卡"
+
+#: util/errors.c:111
+msgid "no data"
+msgstr "无数据"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "错误:"
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "警告:"
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "……这是个程序缺陷(%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "您找到一个程序缺陷了……(%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "yes"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okay|ok"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancel|cancel"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "警告:正在使用不安全的内存!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "请访问 http://www.gnupg.org/faq.html 以获得更详细的信息\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "安全内存未初始化,不能进行操作\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(您可能使用了错误的程序来完成此项任务)\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA 要求使用 160 位的散列算法\n"
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
new file mode 100644 (file)
index 0000000..7e40860
Binary files /dev/null and b/po/zh_TW.gmo differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644 (file)
index 0000000..5fdd3e6
--- /dev/null
@@ -0,0 +1,6196 @@
+# Traditional Chinese(zh-tw) messages for GnuPG
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# This file is distributed under the same license as the PACKAGE package.
+# Jedi <Jedi@Jedi.org>, 2003, 2004, 2005.
+# 
+# Special thanks to "Autrijus Tang <autrijus@autrijus.org>".
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: gnupg 1.4.2\n"
+"Report-Msgid-Bugs-To: gnupg-i18n@gnupg.org\n"
+"POT-Creation-Date: 2006-12-04 15:05+0100\n"
+"PO-Revision-Date: 2005-07-29 09:49+0800\n"
+"Last-Translator: Jedi <Jedi@Jedi.org>\n"
+"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cipher/primegen.c:121
+#, c-format
+msgid "can't gen prime with pbits=%u qbits=%u\n"
+msgstr "無法以 %u 位元長的 p 以及 %u 位元長的 q 產生質數\n"
+
+#: cipher/primegen.c:312
+#, c-format
+msgid "can't generate a prime with less than %d bits\n"
+msgstr "無法產生少於 %d 位元的質數\n"
+
+#: cipher/random.c:173
+msgid "no entropy gathering module detected\n"
+msgstr "偵測不到亂數蒐集模組\n"
+
+#: cipher/random.c:403
+#, fuzzy, c-format
+msgid "can't lock `%s': %s\n"
+msgstr "無法鎖定 `%s'\n"
+
+#: cipher/random.c:408
+#, fuzzy, c-format
+msgid "waiting for lock on `%s'...\n"
+msgstr "正在將私鑰寫至 `%s'\n"
+
+#: cipher/random.c:448 g10/card-util.c:678 g10/card-util.c:747
+#: g10/dearmor.c:61 g10/dearmor.c:110 g10/encode.c:184 g10/encode.c:474
+#: g10/gpg.c:1009 g10/gpg.c:3503 g10/import.c:195 g10/keygen.c:2385
+#: g10/keyring.c:1525 g10/openfile.c:186 g10/openfile.c:348
+#: g10/plaintext.c:481 g10/sign.c:808 g10/sign.c:1001 g10/sign.c:1114
+#: g10/sign.c:1264 g10/tdbdump.c:141 g10/tdbdump.c:149 g10/tdbio.c:540
+#: g10/tdbio.c:605
+#, c-format
+msgid "can't open `%s': %s\n"
+msgstr "無法開啟 `%s': %s\n"
+
+#: cipher/random.c:458
+#, c-format
+msgid "can't stat `%s': %s\n"
+msgstr "無法取得檔案 `%s' 的資訊: %s\n"
+
+#: cipher/random.c:463
+#, c-format
+msgid "`%s' is not a regular file - ignored\n"
+msgstr "`%s' 不是一個標準的檔案 - 已略過\n"
+
+#: cipher/random.c:468
+msgid "note: random_seed file is empty\n"
+msgstr "請注意: random_seed 檔案是空的\n"
+
+#: cipher/random.c:474
+msgid "WARNING: invalid size of random_seed file - not used\n"
+msgstr "警告: random_seed 檔案大小無效 - 不予採用\n"
+
+#: cipher/random.c:482
+#, c-format
+msgid "can't read `%s': %s\n"
+msgstr "無法讀取 `%s': %s\n"
+
+#: cipher/random.c:520
+msgid "note: random_seed file not updated\n"
+msgstr "請注意: random_seed 檔案未被更新\n"
+
+#: cipher/random.c:544 g10/exec.c:481 g10/gpg.c:1008 g10/keygen.c:2864
+#: g10/keygen.c:2894 g10/keyring.c:1201 g10/keyring.c:1501 g10/openfile.c:269
+#: g10/openfile.c:363 g10/sign.c:826 g10/sign.c:1130 g10/tdbio.c:536
+#, c-format
+msgid "can't create `%s': %s\n"
+msgstr "無法建立 `%s': %s\n"
+
+#: cipher/random.c:556 cipher/random.c:566
+#, c-format
+msgid "can't write `%s': %s\n"
+msgstr "無法寫入 `%s': %s\n"
+
+#: cipher/random.c:569
+#, c-format
+msgid "can't close `%s': %s\n"
+msgstr "無法關閉 `%s': %s\n"
+
+#: cipher/random.c:814
+msgid "WARNING: using insecure random number generator!!\n"
+msgstr "警告: 正在使用不安全的隨機數字產生器!!\n"
+
+#: cipher/random.c:815
+msgid ""
+"The random number generator is only a kludge to let\n"
+"it run - it is in no way a strong RNG!\n"
+"\n"
+"DON'T USE ANY DATA GENERATED BY THIS PROGRAM!!\n"
+"\n"
+msgstr ""
+"這個隨機數字產生器根本就是七拼八湊出來的鳥東西 -\n"
+"它根本就不是強而有力的亂數產生器!\n"
+"\n"
+"*** 絕對不要把這個程式產生的任何資料拿來用!! ***\n"
+"\n"
+
+#: cipher/rndegd.c:202
+msgid ""
+"Please wait, entropy is being gathered. Do some work if it would\n"
+"keep you from getting bored, because it will improve the quality\n"
+"of the entropy.\n"
+msgstr ""
+"請稍待片刻, 系統此時正在蒐集亂數. 如果妳會覺得無聊的話,\n"
+"不妨做些別的事, 這樣子甚至能夠讓亂數的品質更好.\n"
+
+#: cipher/rndlinux.c:132
+#, c-format
+msgid ""
+"\n"
+"Not enough random bytes available.  Please do some other work to give\n"
+"the OS a chance to collect more entropy! (Need %d more bytes)\n"
+msgstr ""
+"\n"
+"隨機位元組不夠多. 請多做一些有的沒的事情, \n"
+"這樣作業系統纔能蒐集到更多的亂數! (還需要 %d 位元組)\n"
+
+#: g10/app-openpgp.c:596
+#, c-format
+msgid "failed to store the fingerprint: %s\n"
+msgstr "存放指紋失敗: %s\n"
+
+#: g10/app-openpgp.c:609
+#, c-format
+msgid "failed to store the creation date: %s\n"
+msgstr "存放創生資料失敗: %s\n"
+
+#: g10/app-openpgp.c:977
+#, c-format
+msgid "reading public key failed: %s\n"
+msgstr "讀取公鑰時失敗: %s\n"
+
+#: g10/app-openpgp.c:985 g10/app-openpgp.c:1910
+msgid "response does not contain the public key data\n"
+msgstr "回應中未包含公鑰資料\n"
+
+#: g10/app-openpgp.c:993 g10/app-openpgp.c:1918
+msgid "response does not contain the RSA modulus\n"
+msgstr "回應中未包含 RSA 系數\n"
+
+#: g10/app-openpgp.c:1002 g10/app-openpgp.c:1928
+msgid "response does not contain the RSA public exponent\n"
+msgstr "回應中未包含 RSA 公用指數\n"
+
+#: g10/app-openpgp.c:1258 g10/app-openpgp.c:1346 g10/app-openpgp.c:2154
+#, c-format
+msgid "PIN callback returned error: %s\n"
+msgstr "個人識別碼 (PIN) 收回時傳回錯誤: %s\n"
+
+#: g10/app-openpgp.c:1264 g10/app-openpgp.c:1352 g10/app-openpgp.c:2160
+#, c-format
+msgid "PIN for CHV%d is too short; minimum length is %d\n"
+msgstr "用於 CHV %d 的個人識別碼 (PIN) 太短; 長度最少要有 %d\n"
+
+#: g10/app-openpgp.c:1273 g10/app-openpgp.c:1287 g10/app-openpgp.c:1362
+#: g10/app-openpgp.c:2169 g10/app-openpgp.c:2183
+#, c-format
+msgid "verify CHV%d failed: %s\n"
+msgstr "驗證 CHV %d 失敗: %s\n"
+
+#: g10/app-openpgp.c:1310
+msgid "access to admin commands is not configured\n"
+msgstr "取用管理者指令尚未被組態過\n"
+
+#: g10/app-openpgp.c:1325 g10/app-openpgp.c:2389
+msgid "error retrieving CHV status from card\n"
+msgstr "從卡片取回 CHV 狀態時出錯\n"
+
+#: g10/app-openpgp.c:1331 g10/app-openpgp.c:2398
+msgid "card is permanently locked!\n"
+msgstr "卡片已被永久鎖住了!!\n"
+
+#: g10/app-openpgp.c:1336
+#, c-format
+msgid "%d Admin PIN attempts remaining before card is permanently locked\n"
+msgstr "%d 管理者個人識別碼 (PIN) 試圖在卡片被永久鎖定前遺留下來\n"
+
+#. TRANSLATORS: Do not translate the "|A|" prefix but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1343
+msgid "|A|Admin PIN"
+msgstr "|A|Admin PIN"
+
+#. TRANSLATORS: Do not translate the "|*|" prefixes but
+#. keep it at the start of the string.  We need this elsewhere
+#. to get some infos on the string.
+#: g10/app-openpgp.c:1492
+msgid "|AN|New Admin PIN"
+msgstr "|AN|New Admin PIN"
+
+#: g10/app-openpgp.c:1492
+msgid "|N|New PIN"
+msgstr "|N|New PIN"
+
+#: g10/app-openpgp.c:1496
+#, c-format
+msgid "error getting new PIN: %s\n"
+msgstr "取得新的個人識別碼 (PIN) 時出錯: %s\n"
+
+#: g10/app-openpgp.c:1546 g10/app-openpgp.c:1996
+msgid "error reading application data\n"
+msgstr "讀取應用程式資料時出錯\n"
+
+#: g10/app-openpgp.c:1552 g10/app-openpgp.c:2003
+msgid "error reading fingerprint DO\n"
+msgstr "讀取指紋 DO 時出錯\n"
+
+#: g10/app-openpgp.c:1562
+msgid "key already exists\n"
+msgstr "金鑰已存在\n"
+
+#: g10/app-openpgp.c:1566
+msgid "existing key will be replaced\n"
+msgstr "既有的金鑰將被取代\n"
+
+#: g10/app-openpgp.c:1568
+msgid "generating new key\n"
+msgstr "正在產生新的金鑰\n"
+
+#: g10/app-openpgp.c:1735
+msgid "creation timestamp missing\n"
+msgstr "建立的時間戳印缺漏\n"
+
+#: g10/app-openpgp.c:1742
+#, c-format
+msgid "RSA modulus missing or not of size %d bits\n"
+msgstr "RSA 模組缺漏或者尺寸並非 %d 位元\n"
+
+#: g10/app-openpgp.c:1749
+#, c-format
+msgid "RSA public exponent missing or larger than %d bits\n"
+msgstr "RSA 公用指數缺漏或者大於 %d 位元\n"
+
+#: g10/app-openpgp.c:1757 g10/app-openpgp.c:1764
+#, c-format
+msgid "RSA prime %s missing or not of size %d bits\n"
+msgstr "RSA 質數 %s 缺漏或者尺寸並非 %d 位元\n"
+
+#: g10/app-openpgp.c:1827
+#, c-format
+msgid "failed to store the key: %s\n"
+msgstr "存放金鑰失敗: %s\n"
+
+#: g10/app-openpgp.c:1886
+msgid "please wait while key is being generated ...\n"
+msgstr "公鑰正被產生中, 請稍候 ...\n"
+
+#: g10/app-openpgp.c:1901
+msgid "generating key failed\n"
+msgstr "產生金鑰時失敗\n"
+
+#: g10/app-openpgp.c:1904
+#, c-format
+msgid "key generation completed (%d seconds)\n"
+msgstr "金鑰產生已完工 (%d 秒)\n"
+
+#: g10/app-openpgp.c:1961
+msgid "invalid structure of OpenPGP card (DO 0x93)\n"
+msgstr "OpenPGP 卡片的格式無效 (DO 0x93)\n"
+
+#: g10/app-openpgp.c:2087
+#, fuzzy, c-format
+msgid "card does not support digest algorithm %s\n"
+msgstr "%s 簽章, 摘要演算法 %s\n"
+
+#: g10/app-openpgp.c:2134
+#, c-format
+msgid "signatures created so far: %lu\n"
+msgstr "目前建立的簽章: %lu\n"
+
+#: g10/app-openpgp.c:2142
+#, c-format
+msgid "||Please enter the PIN%%0A[sigs done: %lu]"
+msgstr "||請輸入 PIN%%0A[簽署完成: %lu]"
+
+#: g10/app-openpgp.c:2403
+msgid ""
+"verification of Admin PIN is currently prohibited through this command\n"
+msgstr "管理者個人識別碼 (PIN) 之驗證目前在此指令中被禁止了\n"
+
+#: g10/app-openpgp.c:2474 g10/app-openpgp.c:2484
+#, c-format
+msgid "can't access %s - invalid OpenPGP card?\n"
+msgstr "無法存取 %s - 無效的 OpenPGP 卡片?\n"
+
+#: g10/armor.c:372
+#, c-format
+msgid "armor: %s\n"
+msgstr "封裝: %s\n"
+
+#: g10/armor.c:411
+msgid "invalid armor header: "
+msgstr "無效的封裝檔頭: "
+
+#: g10/armor.c:422
+msgid "armor header: "
+msgstr "封裝檔頭: "
+
+#: g10/armor.c:433
+msgid "invalid clearsig header\n"
+msgstr "無效的明文簽章檔頭\n"
+
+#: g10/armor.c:485
+msgid "nested clear text signatures\n"
+msgstr "多層明文簽章\n"
+
+#: g10/armor.c:620
+msgid "unexpected armor: "
+msgstr "未預期的封裝: "
+
+#: g10/armor.c:632
+msgid "invalid dash escaped line: "
+msgstr "無效的破折號逸出列: "
+
+#: g10/armor.c:786 g10/armor.c:1396
+#, c-format
+msgid "invalid radix64 character %02X skipped\n"
+msgstr "無效的 64 進位字符 %02x 被跳過了\n"
+
+#: g10/armor.c:829
+msgid "premature eof (no CRC)\n"
+msgstr "檔案未預期的結束 (沒有 CRC 的部分)\n"
+
+#: g10/armor.c:863
+msgid "premature eof (in CRC)\n"
+msgstr "檔案未預期的結束 (CRC 的部分未結束)\n"
+
+#: g10/armor.c:871
+msgid "malformed CRC\n"
+msgstr "CRC 被變造過\n"
+
+#: g10/armor.c:875 g10/armor.c:1433
+#, c-format
+msgid "CRC error; %06lX - %06lX\n"
+msgstr "CRC 錯誤; %06lX - %06lX\n"
+
+#: g10/armor.c:895
+msgid "premature eof (in trailer)\n"
+msgstr "檔案未預期的結束 (於結尾處)\n"
+
+#: g10/armor.c:899
+msgid "error in trailer line\n"
+msgstr "結尾列有問題\n"
+
+#: g10/armor.c:1210
+msgid "no valid OpenPGP data found.\n"
+msgstr "找不到有效的 OpenPGP 資料.\n"
+
+#: g10/armor.c:1215
+#, c-format
+msgid "invalid armor: line longer than %d characters\n"
+msgstr "無效的封裝: 列長超出 %d 字符\n"
+
+#: g10/armor.c:1219
+msgid ""
+"quoted printable character in armor - probably a buggy MTA has been used\n"
+msgstr "封裝裡出現被引號括住的可列印字符 - 可能是有瑕疵的送信程式造成的\n"
+
+#: g10/card-util.c:63 g10/card-util.c:306
+#, c-format
+msgid "OpenPGP card not available: %s\n"
+msgstr "沒有可用的 OpenPGP 卡片: %s\n"
+
+#: g10/card-util.c:68
+#, c-format
+msgid "OpenPGP card no. %s detected\n"
+msgstr "偵測到 OpenPGP 卡片編號 %s\n"
+
+#: g10/card-util.c:76 g10/card-util.c:1406 g10/delkey.c:128 g10/keyedit.c:1524
+#: g10/keygen.c:2569 g10/revoke.c:218 g10/revoke.c:456
+msgid "can't do this in batch mode\n"
+msgstr "無法在批次模式中這樣做\n"
+
+#: g10/card-util.c:103 g10/card-util.c:1132 g10/card-util.c:1215
+#: g10/keyedit.c:425 g10/keyedit.c:446 g10/keyedit.c:460 g10/keygen.c:1381
+#: g10/keygen.c:1448
+msgid "Your selection? "
+msgstr "妳要選哪一個? "
+
+#: g10/card-util.c:216 g10/card-util.c:266
+msgid "[not set]"
+msgstr "[未設定]"
+
+#: g10/card-util.c:413
+msgid "male"
+msgstr "男性"
+
+#: g10/card-util.c:414
+msgid "female"
+msgstr "女性"
+
+#: g10/card-util.c:414
+msgid "unspecified"
+msgstr "未特定"
+
+#: g10/card-util.c:441
+msgid "not forced"
+msgstr "不強迫使用"
+
+#: g10/card-util.c:441
+msgid "forced"
+msgstr "強迫使用"
+
+#: g10/card-util.c:519
+msgid "Error: Only plain ASCII is currently allowed.\n"
+msgstr "錯誤: 目前祇允許使用單純的 ASCII 字元.\n"
+
+#: g10/card-util.c:521
+msgid "Error: The \"<\" character may not be used.\n"
+msgstr "錯誤: 不能使用 \"<\" 字元.\n"
+
+#: g10/card-util.c:523
+msgid "Error: Double spaces are not allowed.\n"
+msgstr "錯誤: 並不允許使用連續兩個以上的空格.\n"
+
+#: g10/card-util.c:540
+msgid "Cardholder's surname: "
+msgstr "卡片持有者的姓氏: "
+
+#: g10/card-util.c:542
+msgid "Cardholder's given name: "
+msgstr "卡片持有者的教名: "
+
+#: g10/card-util.c:560
+#, c-format
+msgid "Error: Combined name too long (limit is %d characters).\n"
+msgstr "錯誤: 合併後的名字太長 (上限是 %d 個字元).\n"
+
+#: g10/card-util.c:581
+msgid "URL to retrieve public key: "
+msgstr "取回公鑰的 URL: "
+
+#: g10/card-util.c:589
+#, c-format
+msgid "Error: URL too long (limit is %d characters).\n"
+msgstr "錯誤: URL 太長 (上限是 %d 個字元).\n"
+
+#: g10/card-util.c:687 g10/card-util.c:756 g10/import.c:281
+#, c-format
+msgid "error reading `%s': %s\n"
+msgstr "讀取 `%s' 時發生錯誤: %s\n"
+
+#: g10/card-util.c:695
+msgid "Login data (account name): "
+msgstr " 登入資料 (帳號名稱): "
+
+#: g10/card-util.c:705
+#, c-format
+msgid "Error: Login data too long (limit is %d characters).\n"
+msgstr "錯誤: 登入資料太長 (上限是 %d 個字元).\n"
+
+#: g10/card-util.c:764
+msgid "Private DO data: "
+msgstr "私人的 DO 資料: "
+
+#: g10/card-util.c:774
+#, c-format
+msgid "Error: Private DO too long (limit is %d characters).\n"
+msgstr "錯誤: 私人的 DO 太長 (上限是 %d 個字元).\n"
+
+#: g10/card-util.c:794
+msgid "Language preferences: "
+msgstr "介面語言偏好設定: "
+
+#: g10/card-util.c:802
+msgid "Error: invalid length of preference string.\n"
+msgstr "錯誤: 偏好設定字串的長度無效\n"
+
+#: g10/card-util.c:811
+msgid "Error: invalid characters in preference string.\n"
+msgstr "錯誤: 偏好設定字串中含有無效的字元\n"
+
+#: g10/card-util.c:832
+msgid "Sex ((M)ale, (F)emale or space): "
+msgstr "性別 ((M)ale, (F)emale 或留空): "
+
+#: g10/card-util.c:846
+msgid "Error: invalid response.\n"
+msgstr "錯誤: 無效的回應.\n"
+
+#: g10/card-util.c:867
+msgid "CA fingerprint: "
+msgstr "憑證中心 (CA) 指紋: "
+
+#: g10/card-util.c:890
+msgid "Error: invalid formatted fingerprint.\n"
+msgstr "錯誤: 指紋格式化無效.\n"
+
+#: g10/card-util.c:938
+#, c-format
+msgid "key operation not possible: %s\n"
+msgstr "不可能進行金鑰操作: %s\n"
+
+#: g10/card-util.c:939
+msgid "not an OpenPGP card"
+msgstr "這不是 OpenPGP 卡片"
+
+#: g10/card-util.c:948
+#, c-format
+msgid "error getting current key info: %s\n"
+msgstr "取得現用金鑰資訊時發生錯誤: %s\n"
+
+#: g10/card-util.c:1033
+msgid "Replace existing key? (y/N) "
+msgstr "是否要取代既有的金鑰? (y/N) "
+
+#: g10/card-util.c:1054 g10/card-util.c:1063
+msgid "Make off-card backup of encryption key? (Y/n) "
+msgstr "是否要為加密用金鑰建立卡外備份? (Y/n) "
+
+#: g10/card-util.c:1075
+msgid "Replace existing keys? (y/N) "
+msgstr "是否要取代既有的金鑰? (y/N) "
+
+#: g10/card-util.c:1084
+#, c-format
+msgid ""
+"Please note that the factory settings of the PINs are\n"
+"   PIN = `%s'     Admin PIN = `%s'\n"
+"You should change them using the command --change-pin\n"
+msgstr ""
+"請注意個人識別碼 (PIN) 的出廠設定值為\n"
+"   PIN = `%s'     管理者 (Admin) PIN = `%s'\n"
+"妳應該用 --change-pin 指令來加以變更\n"
+
+#: g10/card-util.c:1123
+msgid "Please select the type of key to generate:\n"
+msgstr "請選擇妳要產生的金鑰種類:\n"
+
+#: g10/card-util.c:1125 g10/card-util.c:1206
+msgid "   (1) Signature key\n"
+msgstr "   (1) 簽署用金鑰\n"
+
+#: g10/card-util.c:1126 g10/card-util.c:1208
+msgid "   (2) Encryption key\n"
+msgstr "   (2) 加密用金鑰\n"
+
+#: g10/card-util.c:1127 g10/card-util.c:1210
+msgid "   (3) Authentication key\n"
+msgstr "   (3) 憑證用金鑰\n"
+
+#: g10/card-util.c:1143 g10/card-util.c:1226 g10/keyedit.c:946
+#: g10/keygen.c:1385 g10/keygen.c:1413 g10/keygen.c:1487 g10/revoke.c:685
+msgid "Invalid selection.\n"
+msgstr "無效的選擇.\n"
+
+#: g10/card-util.c:1203
+msgid "Please select where to store the key:\n"
+msgstr "請選擇要把金鑰存放在哪裡:\n"
+
+#: g10/card-util.c:1238
+msgid "unknown key protection algorithm\n"
+msgstr "未知的金鑰保護演算法\n"
+
+#: g10/card-util.c:1243
+msgid "secret parts of key are not available\n"
+msgstr "私鑰部分無法取用\n"
+
+#: g10/card-util.c:1248
+msgid "secret key already stored on a card\n"
+msgstr "私鑰已經存放於卡片上了\n"
+
+#: g10/card-util.c:1319 g10/keyedit.c:1357
+msgid "quit this menu"
+msgstr "離開這個選單"
+
+#: g10/card-util.c:1321
+msgid "show admin commands"
+msgstr "顯示管理者指令"
+
+#: g10/card-util.c:1322 g10/keyedit.c:1360
+msgid "show this help"
+msgstr "顯示這份線上說明"
+
+#: g10/card-util.c:1324
+msgid "list all available data"
+msgstr "列出所有可用的資料"
+
+#: g10/card-util.c:1327
+msgid "change card holder's name"
+msgstr "變更卡片持有人的名字"
+
+#: g10/card-util.c:1328
+msgid "change URL to retrieve key"
+msgstr "變更要取回金鑰的 URL"
+
+#: g10/card-util.c:1329
+msgid "fetch the key specified in the card URL"
+msgstr "從卡片 URL 取回指定的金鑰"
+
+#: g10/card-util.c:1330
+msgid "change the login name"
+msgstr "變更登入姓名"
+
+#: g10/card-util.c:1331
+msgid "change the language preferences"
+msgstr "變更介面語言偏好設定"
+
+#: g10/card-util.c:1332
+msgid "change card holder's sex"
+msgstr "變更卡片持有者的性別"
+
+#: g10/card-util.c:1333
+msgid "change a CA fingerprint"
+msgstr "變更某個憑證中心 (CA) 指紋"
+
+#: g10/card-util.c:1334
+msgid "toggle the signature force PIN flag"
+msgstr "切換簽章強制個人識別碼 (PIN) 的旗標"
+
+#: g10/card-util.c:1335
+msgid "generate new keys"
+msgstr "產生新的金鑰"
+
+#: g10/card-util.c:1336
+msgid "menu to change or unblock the PIN"
+msgstr "變更或解凍個人識別碼 (PIN) 的選單"
+
+#: g10/card-util.c:1337
+msgid "verify the PIN and list all data"
+msgstr "驗證個人識別碼 (PIN) 並列出所有的資料"
+
+#: g10/card-util.c:1457 g10/keyedit.c:1623
+msgid "Command> "
+msgstr "指令> "
+
+#: g10/card-util.c:1495
+msgid "Admin-only command\n"
+msgstr "限管理者使用的指令\n"
+
+#: g10/card-util.c:1526
+msgid "Admin commands are allowed\n"
+msgstr "允許使用管理者指令\n"
+
+#: g10/card-util.c:1528
+msgid "Admin commands are not allowed\n"
+msgstr "未允許使用管理者指令\n"
+
+#: g10/card-util.c:1602 g10/keyedit.c:2244
+msgid "Invalid command  (try \"help\")\n"
+msgstr "無效的指令  (試試看 \"help\")\n"
+
+#: g10/cardglue.c:416
+#, fuzzy
+msgid "card reader not available\n"
+msgstr "無法取用私鑰"
+
+#: g10/cardglue.c:434
+msgid "Please insert the card and hit return or enter 'c' to cancel: "
+msgstr "請插入卡片並按下 [Enter], 或者輸入 'c' 以取消: "
+
+#: g10/cardglue.c:446
+#, fuzzy, c-format
+msgid "selecting openpgp failed: %s\n"
+msgstr "刪除金鑰區塊時失敗了: %s\n"
+
+#: g10/cardglue.c:573
+#, c-format
+msgid ""
+"Please remove the current card and insert the one with serial number:\n"
+"   %.*s\n"
+msgstr ""
+"請移除現用中的卡片並插入下列序號的卡片:\n"
+"   %.*s\n"
+
+#: g10/cardglue.c:582
+msgid "Hit return when ready or enter 'c' to cancel: "
+msgstr "準備好時請按下 [Enter], 或者輸入 'c' 以取消: "
+
+#: g10/cardglue.c:917
+msgid "Enter New Admin PIN: "
+msgstr "請輸入新的管理者個人識別碼 (PIN): "
+
+#: g10/cardglue.c:918
+msgid "Enter New PIN: "
+msgstr "請輸入新的個人識別碼 (PIN): "
+
+#: g10/cardglue.c:919
+msgid "Enter Admin PIN: "
+msgstr "請輸入管理者個人識別碼 (PIN): "
+
+#: g10/cardglue.c:920
+msgid "Enter PIN: "
+msgstr "請輸入個人識別碼 (PIN): "
+
+#: g10/cardglue.c:937
+msgid "Repeat this PIN: "
+msgstr "請再次輸入個人識別碼 (PIN): "
+
+#: g10/cardglue.c:952
+msgid "PIN not correctly repeated; try again"
+msgstr "個人識別碼 (PIN) 再次輸入時沒有正確重複; 請再試一次"
+
+#: g10/decrypt.c:69 g10/decrypt.c:160 g10/gpg.c:3868 g10/keyring.c:377
+#: g10/keyring.c:663 g10/verify.c:102 g10/verify.c:157
+#, c-format
+msgid "can't open `%s'\n"
+msgstr "無法開啟 `%s'\n"
+
+#: g10/decrypt.c:105 g10/encode.c:839
+msgid "--output doesn't work for this command\n"
+msgstr "--output 在這個命令中沒有作用\n"
+
+#: g10/delkey.c:75 g10/export.c:311 g10/keyedit.c:3392 g10/keyserver.c:1705
+#: g10/revoke.c:228
+#, c-format
+msgid "key \"%s\" not found: %s\n"
+msgstr "金鑰 \"%s\" 找不到: %s\n"
+
+#: g10/delkey.c:83 g10/export.c:341 g10/import.c:2350 g10/keyserver.c:1719
+#: g10/revoke.c:234 g10/revoke.c:478
+#, c-format
+msgid "error reading keyblock: %s\n"
+msgstr "讀取金鑰區塊時發生錯誤: %s\n"
+
+#: g10/delkey.c:129 g10/delkey.c:136
+msgid "(unless you specify the key by fingerprint)\n"
+msgstr "(除非妳用指紋指定了金鑰)\n"
+
+#: g10/delkey.c:135
+msgid "can't do this in batch mode without \"--yes\"\n"
+msgstr "沒有 \"--yes\" 就沒辦法在批次模式中這麼做\n"
+
+#: g10/delkey.c:147
+msgid "Delete this key from the keyring? (y/N) "
+msgstr "要從鑰匙圈裡刪除這把金鑰嗎? (y/N) "
+
+#: g10/delkey.c:155
+msgid "This is a secret key! - really delete? (y/N) "
+msgstr "這是一把私鑰! - 真的要刪除嗎? (y/N) "
+
+#: g10/delkey.c:165
+#, c-format
+msgid "deleting keyblock failed: %s\n"
+msgstr "刪除金鑰區塊時失敗了: %s\n"
+
+#: g10/delkey.c:175
+msgid "ownertrust information cleared\n"
+msgstr "主觀信任資訊已經被清除\n"
+
+#: g10/delkey.c:206
+#, c-format
+msgid "there is a secret key for public key \"%s\"!\n"
+msgstr "公鑰 \"%s\" 有相對應的私鑰!\n"
+
+#: g10/delkey.c:208
+msgid "use option \"--delete-secret-keys\" to delete it first.\n"
+msgstr "請先以 \"--delete-secret-keys\" 選項來刪除它.\n"
+
+#: g10/encode.c:213 g10/sign.c:1284
+#, c-format
+msgid "error creating passphrase: %s\n"
+msgstr "建立密語的時候發生錯誤: %s\n"
+
+#: g10/encode.c:218
+msgid "can't use a symmetric ESK packet due to the S2K mode\n"
+msgstr "因為處於 S2K 模式下而無法使用對稱式 ESK 封包\n"
+
+#: g10/encode.c:231
+#, c-format
+msgid "using cipher %s\n"
+msgstr "正在使用編密法 %s\n"
+
+#: g10/encode.c:241 g10/encode.c:536
+#, c-format
+msgid "`%s' already compressed\n"
+msgstr "`%s' 已經被壓縮了\n"
+
+#: g10/encode.c:292 g10/encode.c:584 g10/sign.c:593
+#, c-format
+msgid "WARNING: `%s' is an empty file\n"
+msgstr "警告: `%s' 是一個空檔案\n"
+
+#: g10/encode.c:456
+msgid "you can only encrypt to RSA keys of 2048 bits or less in --pgp2 mode\n"
+msgstr "在 --pgp2 模式中, 妳祇能以 2048 位元以下的 RSA 金鑰加密\n"
+
+#: g10/encode.c:480
+#, c-format
+msgid "reading from `%s'\n"
+msgstr "正在從 `%s' 讀取中\n"
+
+#: g10/encode.c:508
+msgid ""
+"unable to use the IDEA cipher for all of the keys you are encrypting to.\n"
+msgstr "妳正要用來加密的所有金鑰都不能使用 IDEA 編密法.\n"
+
+#: g10/encode.c:518
+#, c-format
+msgid ""
+"WARNING: forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "警告: 強迫使用對稱式編密法 %s (%d) 會違反收件者偏好設定\n"
+
+#: g10/encode.c:628 g10/sign.c:963
+#, c-format
+msgid ""
+"WARNING: forcing compression algorithm %s (%d) violates recipient "
+"preferences\n"
+msgstr "警告: 強迫使用壓縮演算法 %s (%d) 會違反收件者偏好設定\n"
+
+#: g10/encode.c:715
+#, c-format
+msgid "forcing symmetric cipher %s (%d) violates recipient preferences\n"
+msgstr "強迫使用 %s (%d) 對稱式編密法會違反收件者偏好設定\n"
+
+#: g10/encode.c:785 g10/pkclist.c:803 g10/pkclist.c:851
+#, c-format
+msgid "you may not use %s while in %s mode\n"
+msgstr "妳不能夠將 %s 用於 %s 模式中\n"
+
+#: g10/encode.c:812
+#, c-format
+msgid "%s/%s encrypted for: \"%s\"\n"
+msgstr "%s/%s 已經加密給: \"%s\"\n"
+
+#: g10/encr-data.c:91 g10/mainproc.c:293
+#, c-format
+msgid "%s encrypted data\n"
+msgstr "%s 加密過的資料\n"
+
+#: g10/encr-data.c:93 g10/mainproc.c:297
+#, c-format
+msgid "encrypted with unknown algorithm %d\n"
+msgstr "以未知的演算法 %d 加密過\n"
+
+#: g10/encr-data.c:117
+msgid ""
+"WARNING: message was encrypted with a weak key in the symmetric cipher.\n"
+msgstr "警告: 訊息被以對稱式編密法的弱金鑰加密了.\n"
+
+#: g10/encr-data.c:128
+msgid "problem handling encrypted packet\n"
+msgstr "處理加密的封包有問題\n"
+
+#: g10/exec.c:49
+msgid "no remote program execution supported\n"
+msgstr "沒有已支援的遠端程式執行\n"
+
+#: g10/exec.c:176 g10/openfile.c:421
+#, c-format
+msgid "can't create directory `%s': %s\n"
+msgstr "無法建立目錄 `%s': %s\n"
+
+#: g10/exec.c:317
+msgid ""
+"external program calls are disabled due to unsafe options file permissions\n"
+msgstr "因為不安全的檔案權限選項, 而禁用了外部程式叫用\n"
+
+#: g10/exec.c:347
+msgid "this platform requires temporary files when calling external programs\n"
+msgstr "在這個作業平台上叫用外部程式時需要暫存檔\n"
+
+#: g10/exec.c:425
+#, c-format
+msgid "unable to execute program `%s': %s\n"
+msgstr "無法執行程式 `%s': %s\n"
+
+#: g10/exec.c:428
+#, c-format
+msgid "unable to execute shell `%s': %s\n"
+msgstr "無法執行 shell `%s': %s\n"
+
+#: g10/exec.c:513
+#, c-format
+msgid "system error while calling external program: %s\n"
+msgstr "叫用外部程式時發生系統錯誤: %s\n"
+
+#: g10/exec.c:524 g10/exec.c:590
+msgid "unnatural exit of external program\n"
+msgstr "外部程式不自然地離開\n"
+
+#: g10/exec.c:539
+msgid "unable to execute external program\n"
+msgstr "無法執行外部程式\n"
+
+#: g10/exec.c:555
+#, c-format
+msgid "unable to read external program response: %s\n"
+msgstr "無法讀取外部程式回應: %s\n"
+
+#: g10/exec.c:601 g10/exec.c:608
+#, c-format
+msgid "WARNING: unable to remove tempfile (%s) `%s': %s\n"
+msgstr "警告: 無法移除暫存檔 (%s) `%s': %s\n"
+
+#: g10/exec.c:613
+#, c-format
+msgid "WARNING: unable to remove temp directory `%s': %s\n"
+msgstr "警告: 無法移除暫存目錄 `%s': %s\n"
+
+#: g10/export.c:61
+#, fuzzy
+msgid "export signatures that are marked as local-only"
+msgstr "這份簽章會被標記成不可撤銷.\n"
+
+#: g10/export.c:63
+msgid "export attribute user IDs (generally photo IDs)"
+msgstr ""
+
+#: g10/export.c:65
+#, fuzzy
+msgid "export revocation keys marked as \"sensitive\""
+msgstr "沒有找到 \"%s\" 用的撤銷金鑰\n"
+
+#: g10/export.c:67
+#, fuzzy
+msgid "remove the passphrase from exported subkeys"
+msgstr "撤銷金鑰或所選的次鑰"
+
+#: g10/export.c:69
+#, fuzzy
+msgid "remove unusable parts from key during export"
+msgstr "從金鑰中清除無法使用的部分"
+
+#: g10/export.c:71
+msgid "remove as much as possible from key during export"
+msgstr ""
+
+#: g10/export.c:325
+msgid "exporting secret keys not allowed\n"
+msgstr "未被允許匯出私鑰\n"
+
+#: g10/export.c:354
+#, c-format
+msgid "key %s: not protected - skipped\n"
+msgstr "金鑰 %s: 未被保護 - 已跳過\n"
+
+#: g10/export.c:362
+#, c-format
+msgid "key %s: PGP 2.x style key - skipped\n"
+msgstr "金鑰 %s: PGP 2.x 樣式的金鑰 - 已跳過\n"
+
+#: g10/export.c:373
+#, fuzzy, c-format
+msgid "key %s: key material on-card - skipped\n"
+msgstr "金鑰 %s: 子鑰簽章在錯誤的地方 - 已跳過\n"
+
+#: g10/export.c:521
+msgid "about to export an unprotected subkey\n"
+msgstr ""
+
+#: g10/export.c:544
+#, fuzzy, c-format
+msgid "failed to unprotect the subkey: %s\n"
+msgstr "存放金鑰失敗: %s\n"
+
+#  I hope this warning doesn't confuse people.
+#: g10/export.c:565
+#, c-format
+msgid "WARNING: secret key %s does not have a simple SK checksum\n"
+msgstr "警告: 私鑰 %s 並沒有任的何單一 SK 加總檢查\n"
+
+#: g10/export.c:598
+msgid "WARNING: nothing exported\n"
+msgstr "警告: 沒有匯出任何東西\n"
+
+#: g10/gpg.c:378
+msgid ""
+"@Commands:\n"
+" "
+msgstr ""
+"@指令:\n"
+" "
+
+#: g10/gpg.c:380
+msgid "|[file]|make a signature"
+msgstr "|[檔案]|建立一份簽章"
+
+#: g10/gpg.c:381
+msgid "|[file]|make a clear text signature"
+msgstr "|[檔案]|建立一份明文簽章"
+
+#: g10/gpg.c:382
+msgid "make a detached signature"
+msgstr "建立一份分離式簽章"
+
+#: g10/gpg.c:383
+msgid "encrypt data"
+msgstr "加密資料"
+
+#: g10/gpg.c:385
+msgid "encryption only with symmetric cipher"
+msgstr "僅使用對稱式編密法來加密"
+
+#: g10/gpg.c:387
+msgid "decrypt data (default)"
+msgstr "資料解密 (預設)"
+
+#: g10/gpg.c:389
+msgid "verify a signature"
+msgstr "驗證某份簽章"
+
+#: g10/gpg.c:391
+msgid "list keys"
+msgstr "列出金鑰"
+
+#: g10/gpg.c:393
+msgid "list keys and signatures"
+msgstr "列出金鑰和簽章"
+
+#: g10/gpg.c:394
+msgid "list and check key signatures"
+msgstr "列出並檢查金鑰簽章"
+
+#: g10/gpg.c:395
+msgid "list keys and fingerprints"
+msgstr "列出金鑰和指紋"
+
+#: g10/gpg.c:396
+msgid "list secret keys"
+msgstr "列出私鑰"
+
+#: g10/gpg.c:397
+msgid "generate a new key pair"
+msgstr "產生一份新的金鑰對"
+
+#: g10/gpg.c:398
+msgid "remove keys from the public keyring"
+msgstr "從公鑰鑰匙圈裡移去金鑰"
+
+#: g10/gpg.c:400
+msgid "remove keys from the secret keyring"
+msgstr "從私鑰鑰匙圈裡移去金鑰"
+
+#: g10/gpg.c:401
+msgid "sign a key"
+msgstr "簽署某把金鑰"
+
+#: g10/gpg.c:402
+msgid "sign a key locally"
+msgstr "僅在本地簽署某把金鑰"
+
+#: g10/gpg.c:403
+msgid "sign or edit a key"
+msgstr "簽署或編輯某把金鑰"
+
+#: g10/gpg.c:404
+msgid "generate a revocation certificate"
+msgstr "產生一份撤銷憑證"
+
+#: g10/gpg.c:406
+msgid "export keys"
+msgstr "匯出金鑰"
+
+#: g10/gpg.c:407
+msgid "export keys to a key server"
+msgstr "把金鑰匯出至某個金鑰伺服器上"
+
+#: g10/gpg.c:408
+msgid "import keys from a key server"
+msgstr "從某個金鑰伺服器上匯入金鑰"
+
+#: g10/gpg.c:410
+msgid "search for keys on a key server"
+msgstr "在某個金鑰伺服器上搜尋金鑰"
+
+#: g10/gpg.c:412
+msgid "update all keys from a keyserver"
+msgstr "從某個金鑰伺服器上更新所有的金鑰"
+
+#: g10/gpg.c:416
+msgid "import/merge keys"
+msgstr "匯入/合併金鑰"
+
+#: g10/gpg.c:419
+msgid "print the card status"
+msgstr "列印卡片狀態"
+
+#: g10/gpg.c:420
+msgid "change data on a card"
+msgstr "變更卡片上的資料"
+
+#: g10/gpg.c:421
+msgid "change a card's PIN"
+msgstr "變更某張卡片的個人識別碼 (PIN)"
+
+#: g10/gpg.c:430
+msgid "update the trust database"
+msgstr "更新信任資料庫"
+
+#: g10/gpg.c:437
+msgid "|algo [files]|print message digests"
+msgstr "|演算法 [檔案]|印出訊息摘要"
+
+#: g10/gpg.c:441 g10/gpgv.c:71
+msgid ""
+"@\n"
+"Options:\n"
+" "
+msgstr ""
+"@\n"
+"選項:\n"
+" "
+
+#: g10/gpg.c:443
+msgid "create ascii armored output"
+msgstr "建立以 ASCII 封裝過的輸出"
+
+#: g10/gpg.c:445
+msgid "|NAME|encrypt for NAME"
+msgstr "|名字|以「名字」作為加密對象"
+
+#: g10/gpg.c:456
+msgid "use this user-id to sign or decrypt"
+msgstr "使用這個使用者 ID 來簽署或解密"
+
+#: g10/gpg.c:457
+msgid "|N|set compress level N (0 disables)"
+msgstr "|N|設定壓縮等級為 N (0 表示不壓縮)"
+
+#: g10/gpg.c:462
+msgid "use canonical text mode"
+msgstr "使用標準的文字模式"
+
+#: g10/gpg.c:476
+msgid "use as output file"
+msgstr "當作輸出檔案來使用"
+
+#: g10/gpg.c:478 g10/gpgv.c:73
+msgid "verbose"
+msgstr "囉唆模式"
+
+#: g10/gpg.c:489
+msgid "do not make any changes"
+msgstr "不要做任何改變"
+
+#: g10/gpg.c:490
+msgid "prompt before overwriting"
+msgstr "覆寫前先詢問"
+
+#: g10/gpg.c:531
+msgid "use strict OpenPGP behavior"
+msgstr "使用嚴謹的 OpenPGP 行為"
+
+#: g10/gpg.c:532
+msgid "generate PGP 2.x compatible messages"
+msgstr "產生 PGP 2.x 相容性訊息"
+
+#: g10/gpg.c:561
+msgid ""
+"@\n"
+"(See the man page for a complete listing of all commands and options)\n"
+msgstr ""
+"@\n"
+"(請參照線上說明頁面來取得所有命令和選項的完整清單)\n"
+
+#: g10/gpg.c:564
+msgid ""
+"@\n"
+"Examples:\n"
+"\n"
+" -se -r Bob [file]          sign and encrypt for user Bob\n"
+" --clearsign [file]         make a clear text signature\n"
+" --detach-sign [file]       make a detached signature\n"
+" --list-keys [names]        show keys\n"
+" --fingerprint [names]      show fingerprints\n"
+msgstr ""
+"@\n"
+"範例:\n"
+"\n"
+" -se -r Bob [檔案]          對 Bob 這個使用者簽署及加密\n"
+" --clearsign [檔案]         做出明文簽章\n"
+" --detach-sign [檔案]       做出分離式簽章\n"
+" --list-keys [名字]         顯示金鑰\n"
+" --fingerprint [名字]       顯示指紋\n"
+
+#: g10/gpg.c:763 g10/gpgv.c:98
+msgid "Please report bugs to <gnupg-bugs@gnu.org>.\n"
+msgstr "請向 <gnupg-bugs@gnu.org> 回報程式瑕疵.\n"
+
+#: g10/gpg.c:780
+msgid "Usage: gpg [options] [files] (-h for help)"
+msgstr "用法: gpg [選項] [檔案] (或用 -h 求助)"
+
+#: g10/gpg.c:783
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"sign, check, encrypt or decrypt\n"
+"default operation depends on the input data\n"
+msgstr ""
+"語法: gpg [選項] [檔案]\n"
+"簽署, 檢查, 加密或解密\n"
+"預設的操作會依輸入資料而定\n"
+
+#: g10/gpg.c:794
+msgid ""
+"\n"
+"Supported algorithms:\n"
+msgstr ""
+"\n"
+"已被支援的演算法:\n"
+
+#: g10/gpg.c:797
+msgid "Pubkey: "
+msgstr "公鑰: "
+
+#: g10/gpg.c:803 g10/keyedit.c:2310
+msgid "Cipher: "
+msgstr "編密法: "
+
+#: g10/gpg.c:809
+msgid "Hash: "
+msgstr "雜湊: "
+
+#: g10/gpg.c:815 g10/keyedit.c:2356
+msgid "Compression: "
+msgstr "壓縮: "
+
+#: g10/gpg.c:898
+msgid "usage: gpg [options] "
+msgstr "用法: gpg [選項] "
+
+#: g10/gpg.c:1046
+msgid "conflicting commands\n"
+msgstr "指令彼此矛盾\n"
+
+#: g10/gpg.c:1064
+#, c-format
+msgid "no = sign found in group definition `%s'\n"
+msgstr "在群組定義 `%s' 裡找不到 = 記號\n"
+
+#: g10/gpg.c:1261
+#, c-format
+msgid "WARNING: unsafe ownership on homedir `%s'\n"
+msgstr "警告: 家目錄 `%s' 的所有權並不安全\n"
+
+#: g10/gpg.c:1264
+#, c-format
+msgid "WARNING: unsafe ownership on configuration file `%s'\n"
+msgstr "警告: 組態檔案 `%s' 的所有權並不安全\n"
+
+#: g10/gpg.c:1267
+#, c-format
+msgid "WARNING: unsafe ownership on extension `%s'\n"
+msgstr "警告: 延伸模組 `%s' 的所有權並不安全\n"
+
+#: g10/gpg.c:1273
+#, c-format
+msgid "WARNING: unsafe permissions on homedir `%s'\n"
+msgstr "警告: 家目錄 `%s' 的權限並不安全\n"
+
+#: g10/gpg.c:1276
+#, c-format
+msgid "WARNING: unsafe permissions on configuration file `%s'\n"
+msgstr "警告: 組態檔案 `%s' 的權限並不安全\n"
+
+#: g10/gpg.c:1279
+#, c-format
+msgid "WARNING: unsafe permissions on extension `%s'\n"
+msgstr "警告: 延伸模組 `%s' 的權限並不安全\n"
+
+#: g10/gpg.c:1285
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on homedir `%s'\n"
+msgstr "警告: 家目錄 `%s' 的封入目錄所有權並不安全\n"
+
+#: g10/gpg.c:1288
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory ownership on configuration file `%s'\n"
+msgstr "警告: 組態檔案 `%s' 的封入目錄所有權並不安全\n"
+
+#: g10/gpg.c:1291
+#, c-format
+msgid "WARNING: unsafe enclosing directory ownership on extension `%s'\n"
+msgstr "警告: 延伸模組 `%s' 的封入目錄所有權並不安全\n"
+
+#: g10/gpg.c:1297
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on homedir `%s'\n"
+msgstr "警告: 家目錄 `%s' 的封入目錄權限並不安全\n"
+
+#: g10/gpg.c:1300
+#, c-format
+msgid ""
+"WARNING: unsafe enclosing directory permissions on configuration file `%s'\n"
+msgstr "警告: 組態檔案 `%s' 的封入目錄權限並不安全\n"
+
+#: g10/gpg.c:1303
+#, c-format
+msgid "WARNING: unsafe enclosing directory permissions on extension `%s'\n"
+msgstr "警告: 延伸模組 `%s' 的封入目錄權限並不安全\n"
+
+#: g10/gpg.c:1444
+#, c-format
+msgid "unknown configuration item `%s'\n"
+msgstr "未知的組態項目 `%s'\n"
+
+#: g10/gpg.c:1537
+msgid "display photo IDs during key listings"
+msgstr ""
+
+#: g10/gpg.c:1539
+msgid "show policy URLs during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1541
+#, fuzzy
+msgid "show all notations during signature listings"
+msgstr "在私鑰圈裡沒有一致的簽章\n"
+
+#: g10/gpg.c:1543
+msgid "show IETF standard notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1547
+msgid "show user-supplied notations during signature listings"
+msgstr ""
+
+#: g10/gpg.c:1549
+#, fuzzy
+msgid "show preferred keyserver URLs during signature listings"
+msgstr "給定的偏好金鑰伺服器 URL 無效\n"
+
+#: g10/gpg.c:1551
+msgid "show user ID validity during key listings"
+msgstr ""
+
+#: g10/gpg.c:1553
+msgid "show revoked and expired user IDs in key listings"
+msgstr ""
+
+#: g10/gpg.c:1555
+msgid "show revoked and expired subkeys in key listings"
+msgstr ""
+
+#: g10/gpg.c:1557
+#, fuzzy
+msgid "show the keyring name in key listings"
+msgstr "在私鑰清單和公鑰清單間切換"
+
+#: g10/gpg.c:1559
+#, fuzzy
+msgid "show expiration dates during signature listings"
+msgstr "在私鑰圈裡沒有一致的簽章\n"
+
+#: g10/gpg.c:1954
+#, c-format
+msgid "NOTE: old default options file `%s' ignored\n"
+msgstr "請注意: 舊有的預設選項檔 `%s' 已被忽略\n"
+
+#: g10/gpg.c:1996
+#, c-format
+msgid "NOTE: no default option file `%s'\n"
+msgstr "請注意: 沒有預設選項檔 `%s'\n"
+
+#: g10/gpg.c:2000
+#, c-format
+msgid "option file `%s': %s\n"
+msgstr "選項檔 `%s': %s\n"
+
+#: g10/gpg.c:2007
+#, c-format
+msgid "reading options from `%s'\n"
+msgstr "從 `%s' 讀取選項\n"
+
+#: g10/gpg.c:2223 g10/gpg.c:2853 g10/gpg.c:2872
+#, c-format
+msgid "NOTE: %s is not for normal use!\n"
+msgstr "請注意: 一般情況下不會用到 %s!\n"
+
+#: g10/gpg.c:2236
+#, c-format
+msgid "cipher extension `%s' not loaded due to unsafe permissions\n"
+msgstr "編密法延伸模組 `%s' 因為權限不安全而未被載入\n"
+
+#: g10/gpg.c:2402 g10/gpg.c:2414
+#, c-format
+msgid "`%s' is not a valid signature expiration\n"
+msgstr "`%s' 不是一個有效的簽章使用期限\n"
+
+#: g10/gpg.c:2491
+#, c-format
+msgid "`%s' is not a valid character set\n"
+msgstr "`%s' 不是一個有效的字元集\n"
+
+#: g10/gpg.c:2515 g10/gpg.c:2702 g10/keyedit.c:4069
+msgid "could not parse keyserver URL\n"
+msgstr "無法剖析金鑰伺服器 URI\n"
+
+#: g10/gpg.c:2527
+#, c-format
+msgid "%s:%d: invalid keyserver options\n"
+msgstr "%s:%d: 無效的金鑰伺服器選項\n"
+
+#: g10/gpg.c:2530
+msgid "invalid keyserver options\n"
+msgstr "無效的金鑰伺服器選項\n"
+
+#: g10/gpg.c:2537
+#, c-format
+msgid "%s:%d: invalid import options\n"
+msgstr "%s:%d: 無效的匯入選項\n"
+
+#: g10/gpg.c:2540
+msgid "invalid import options\n"
+msgstr "無效的匯入選項\n"
+
+#: g10/gpg.c:2547
+#, c-format
+msgid "%s:%d: invalid export options\n"
+msgstr "%s:%d: 無效的匯出選項\n"
+
+#: g10/gpg.c:2550
+msgid "invalid export options\n"
+msgstr "無效的匯出選項\n"
+
+#: g10/gpg.c:2557
+#, c-format
+msgid "%s:%d: invalid list options\n"
+msgstr "%s:%d: 無效的清單選項\n"
+
+#: g10/gpg.c:2560
+msgid "invalid list options\n"
+msgstr "無效的清單選項\n"
+
+#: g10/gpg.c:2568
+msgid "display photo IDs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2570
+msgid "show policy URLs during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2572
+#, fuzzy
+msgid "show all notations during signature verification"
+msgstr "`%s' 不是一個有效的簽章使用期限\n"
+
+#: g10/gpg.c:2574
+msgid "show IETF standard notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2578
+msgid "show user-supplied notations during signature verification"
+msgstr ""
+
+#: g10/gpg.c:2580
+#, fuzzy
+msgid "show preferred keyserver URLs during signature verification"
+msgstr "給定的偏好金鑰伺服器 URL 無效\n"
+
+#: g10/gpg.c:2582
+#, fuzzy
+msgid "show user ID validity during signature verification"
+msgstr "`%s' 不是一個有效的簽章使用期限\n"
+
+#: g10/gpg.c:2584
+msgid "show revoked and expired user IDs in signature verification"
+msgstr ""
+
+#: g10/gpg.c:2586
+msgid "validate signatures with PKA data"
+msgstr ""
+
+#: g10/gpg.c:2588
+msgid "elevate the trust of signatures with valid PKA data"
+msgstr ""
+
+#: g10/gpg.c:2595
+#, c-format
+msgid "%s:%d: invalid verify options\n"
+msgstr "%s:%d: 無效的驗證選項\n"
+
+#: g10/gpg.c:2598
+msgid "invalid verify options\n"
+msgstr "無效的驗證選項\n"
+
+#: g10/gpg.c:2605
+#, c-format
+msgid "unable to set exec-path to %s\n"
+msgstr "無法把執行檔路徑設成 %s\n"
+
+#: g10/gpg.c:2768
+#, fuzzy, c-format
+msgid "%s:%d: invalid auto-key-locate list\n"
+msgstr "%s:%d: 無效的驗證選項\n"
+
+#: g10/gpg.c:2771
+msgid "invalid auto-key-locate list\n"
+msgstr ""
+
+#: g10/gpg.c:2842
+msgid "WARNING: program may create a core file!\n"
+msgstr "警告: 程式可能會傾印出核心檔!\n"
+
+#: g10/gpg.c:2846
+#, c-format
+msgid "WARNING: %s overrides %s\n"
+msgstr "警告: %s 會使得 %s 失效\n"
+
+#: g10/gpg.c:2855
+#, c-format
+msgid "%s not allowed with %s!\n"
+msgstr "%s 不被允許跟 %s 併用\n"
+
+#: g10/gpg.c:2858
+#, c-format
+msgid "%s makes no sense with %s!\n"
+msgstr "%s 跟 %s 放在一起沒有意義!\n"
+
+#: g10/gpg.c:2865
+#, c-format
+msgid "NOTE: %s is not available in this version\n"
+msgstr "注意: %s 在本版中無法使用\n"
+
+#: g10/gpg.c:2880
+#, c-format
+msgid "will not run with insecure memory due to %s\n"
+msgstr "因為 %s 而不會在不安全的記憶體中執行\n"
+
+#: g10/gpg.c:2894
+msgid "you can only make detached or clear signatures while in --pgp2 mode\n"
+msgstr "妳祇有在 --pgp2 模式下纔能做出分離式或明文簽章\n"
+
+#: g10/gpg.c:2900
+msgid "you can't sign and encrypt at the same time while in --pgp2 mode\n"
+msgstr "妳在 --pgp2 模式下時, 不能同時簽署和加密\n"
+
+#: g10/gpg.c:2906
+msgid "you must use files (and not a pipe) when working with --pgp2 enabled.\n"
+msgstr "啟用 --pgp2 時妳祇應該使用檔案, 而非管道\n"
+
+#: g10/gpg.c:2919
+msgid "encrypting a message in --pgp2 mode requires the IDEA cipher\n"
+msgstr "在 --pgp2 模式下加密訊息需要 IDEA 編密法\n"
+
+#: g10/gpg.c:2986 g10/gpg.c:3010
+msgid "selected cipher algorithm is invalid\n"
+msgstr "所選的編密演算法無效\n"
+
+#: g10/gpg.c:2992 g10/gpg.c:3016
+msgid "selected digest algorithm is invalid\n"
+msgstr "所選的摘要演算法無效\n"
+
+#: g10/gpg.c:2998
+msgid "selected compression algorithm is invalid\n"
+msgstr "所選的壓縮演算法無效\n"
+
+#: g10/gpg.c:3004
+msgid "selected certification digest algorithm is invalid\n"
+msgstr "所選的憑證摘要演算法無效\n"
+
+#: g10/gpg.c:3019
+msgid "completes-needed must be greater than 0\n"
+msgstr "completes-needed 一定要大於 0\n"
+
+#: g10/gpg.c:3021
+msgid "marginals-needed must be greater than 1\n"
+msgstr "marginals-needed 一定要大於 1\n"
+
+#: g10/gpg.c:3023
+msgid "max-cert-depth must be in the range from 1 to 255\n"
+msgstr "max-cert-depth 一定要介於 1 和 255 之間\n"
+
+#: g10/gpg.c:3025
+msgid "invalid default-cert-level; must be 0, 1, 2, or 3\n"
+msgstr "無效的 default-cert-level; 一定要是 0, 1, 2 或 3\n"
+
+#: g10/gpg.c:3027
+msgid "invalid min-cert-level; must be 1, 2, or 3\n"
+msgstr "無效的 min-cert-level; 一定要是 1, 2 或 3\n"
+
+#: g10/gpg.c:3030
+msgid "NOTE: simple S2K mode (0) is strongly discouraged\n"
+msgstr "請注意: 強烈不建議使用單純的 S2K 模式 (0)\n"
+
+#: g10/gpg.c:3034
+msgid "invalid S2K mode; must be 0, 1 or 3\n"
+msgstr "無效的 S2K 模式; 一定要是 0, 1 或 3\n"
+
+#: g10/gpg.c:3041
+msgid "invalid default preferences\n"
+msgstr "無效的預設偏好\n"
+
+#: g10/gpg.c:3050
+msgid "invalid personal cipher preferences\n"
+msgstr "無效的個人編密法偏好\n"
+
+#: g10/gpg.c:3054
+msgid "invalid personal digest preferences\n"
+msgstr "無效的個人摘要偏好\n"
+
+#: g10/gpg.c:3058
+msgid "invalid personal compress preferences\n"
+msgstr "無效的個人壓縮偏好\n"
+
+#: g10/gpg.c:3091
+#, c-format
+msgid "%s does not yet work with %s\n"
+msgstr "%s 還沒辦法跟 %s 一起運作\n"
+
+#: g10/gpg.c:3138
+#, c-format
+msgid "you may not use cipher algorithm `%s' while in %s mode\n"
+msgstr "妳不該將編密演算法 `%s' 用於 %s 模式中\n"
+
+#: g10/gpg.c:3143
+#, c-format
+msgid "you may not use digest algorithm `%s' while in %s mode\n"
+msgstr "妳不該將摘要演算法 `%s' 用於 %s 模式中\n"
+
+#: g10/gpg.c:3148
+#, c-format
+msgid "you may not use compression algorithm `%s' while in %s mode\n"
+msgstr "妳不該將壓縮演算法 `%s' 用於 %s 模式中\n"
+
+#: g10/gpg.c:3250
+#, c-format
+msgid "failed to initialize the TrustDB: %s\n"
+msgstr "信任資料庫啟始失敗: %s\n"
+
+#: g10/gpg.c:3261
+msgid "WARNING: recipients (-r) given without using public key encryption\n"
+msgstr "警告: 給定的收件者 (-r) 未使用公鑰加密\n"
+
+#: g10/gpg.c:3272
+msgid "--store [filename]"
+msgstr "--store [檔名]"
+
+#: g10/gpg.c:3279
+msgid "--symmetric [filename]"
+msgstr "--symmetric [檔名]"
+
+#: g10/gpg.c:3281
+#, c-format
+msgid "symmetric encryption of `%s' failed: %s\n"
+msgstr "`%s' 的對稱式加密失敗: %s\n"
+
+#: g10/gpg.c:3291
+msgid "--encrypt [filename]"
+msgstr "--encrypt [檔名]"
+
+#: g10/gpg.c:3304
+msgid "--symmetric --encrypt [filename]"
+msgstr "--symmetric --encrypt [檔名]"
+
+#: g10/gpg.c:3306
+msgid "you cannot use --symmetric --encrypt with --s2k-mode 0\n"
+msgstr "妳不能在 --s2k-mode 0 中使用 --symmetric --encrypt\n"
+
+#: g10/gpg.c:3309
+#, c-format
+msgid "you cannot use --symmetric --encrypt while in %s mode\n"
+msgstr "妳不能在 %s 模式中使用 --symmetric --encrypt\n"
+
+#: g10/gpg.c:3327
+msgid "--sign [filename]"
+msgstr "--sign [檔名]"
+
+#: g10/gpg.c:3340
+msgid "--sign --encrypt [filename]"
+msgstr "--sign --encrypt [檔名]"
+
+#: g10/gpg.c:3355
+msgid "--symmetric --sign --encrypt [filename]"
+msgstr "--symmetric --sign --encrypt [檔名]"
+
+#: g10/gpg.c:3357
+msgid "you cannot use --symmetric --sign --encrypt with --s2k-mode 0\n"
+msgstr "妳不能在 --s2k-mode 0 中使用 --symmetric --sign --encrypt\n"
+
+#: g10/gpg.c:3360
+#, c-format
+msgid "you cannot use --symmetric --sign --encrypt while in %s mode\n"
+msgstr "妳不能在 %s 模式中使用 --symmetric --sign --encrypt\n"
+
+#: g10/gpg.c:3380
+msgid "--sign --symmetric [filename]"
+msgstr "--sign --symmetric [檔名]"
+
+#: g10/gpg.c:3389
+msgid "--clearsign [filename]"
+msgstr "--clearsign [檔名]"
+
+#: g10/gpg.c:3414
+msgid "--decrypt [filename]"
+msgstr "--decrypt [檔名]"
+
+#: g10/gpg.c:3422
+msgid "--sign-key user-id"
+msgstr "--sign-key 使用者ID"
+
+#: g10/gpg.c:3426
+msgid "--lsign-key user-id"
+msgstr "--lsign-key 使用者ID"
+
+#: g10/gpg.c:3447
+msgid "--edit-key user-id [commands]"
+msgstr "--edit-key 使用者ID [指令]"
+
+#: g10/gpg.c:3518
+msgid "-k[v][v][v][c] [user-id] [keyring]"
+msgstr "-k[v][v][v][c] [使用者ID] [鑰匙圈]"
+
+#: g10/gpg.c:3560
+#, c-format
+msgid "keyserver send failed: %s\n"
+msgstr "送至金鑰伺服器時失敗: %s\n"
+
+#: g10/gpg.c:3562
+#, c-format
+msgid "keyserver receive failed: %s\n"
+msgstr "從金鑰伺服器接收時失敗: %s\n"
+
+#: g10/gpg.c:3564
+#, c-format
+msgid "key export failed: %s\n"
+msgstr "金鑰匯出時失敗: %s\n"
+
+#: g10/gpg.c:3575
+#, c-format
+msgid "keyserver search failed: %s\n"
+msgstr "從金鑰伺服器中搜尋時失敗: %s\n"
+
+#: g10/gpg.c:3585
+#, c-format
+msgid "keyserver refresh failed: %s\n"
+msgstr "從金鑰伺服器更新時失敗: %s\n"
+
+#: g10/gpg.c:3636
+#, c-format
+msgid "dearmoring failed: %s\n"
+msgstr "解開封裝失敗: %s\n"
+
+#: g10/gpg.c:3644
+#, c-format
+msgid "enarmoring failed: %s\n"
+msgstr "進行封裝失敗: %s\n"
+
+#: g10/gpg.c:3731
+#, c-format
+msgid "invalid hash algorithm `%s'\n"
+msgstr "無效的 `%s' 雜湊演算法\n"
+
+#: g10/gpg.c:3854
+msgid "[filename]"
+msgstr "[檔名]"
+
+#: g10/gpg.c:3858
+msgid "Go ahead and type your message ...\n"
+msgstr "請開始鍵入妳的訊息 ...\n"
+
+#: g10/gpg.c:4162
+msgid "the given certification policy URL is invalid\n"
+msgstr "給定的的憑證原則 URL 無效\n"
+
+#: g10/gpg.c:4164
+msgid "the given signature policy URL is invalid\n"
+msgstr "給定的簽章原則 URL 無效\n"
+
+#: g10/gpg.c:4197
+msgid "the given preferred keyserver URL is invalid\n"
+msgstr "給定的偏好金鑰伺服器 URL 無效\n"
+
+#: g10/getkey.c:152
+msgid "too many entries in pk cache - disabled\n"
+msgstr "pk 快取裡有太多項目 - 已禁用\n"
+
+#: g10/getkey.c:175
+msgid "[User ID not found]"
+msgstr "[找不到使用者 ID]"
+
+#: g10/getkey.c:948 g10/getkey.c:958 g10/getkey.c:968 g10/getkey.c:984
+#: g10/getkey.c:999
+#, c-format
+msgid "automatically retrieved `%s' via %s\n"
+msgstr ""
+
+#: g10/getkey.c:1826
+#, c-format
+msgid "Invalid key %s made valid by --allow-non-selfsigned-uid\n"
+msgstr "無效的金鑰 %s 可以藉由 --allow-non-selfsigned-uid 而生效\n"
+
+#: g10/getkey.c:2380 g10/keyedit.c:3712
+#, c-format
+msgid "no secret subkey for public subkey %s - ignoring\n"
+msgstr "公鑰 %s 沒有相對應的私鑰 - 正在忽略\n"
+
+#: g10/getkey.c:2611
+#, c-format
+msgid "using subkey %s instead of primary key %s\n"
+msgstr "正在使用次鑰 %s 來替換主鑰 %s\n"
+
+#: g10/getkey.c:2658
+#, c-format
+msgid "key %s: secret key without public key - skipped\n"
+msgstr "金鑰 %s: 祇有私鑰而沒有公鑰 - 已跳過\n"
+
+#: g10/gpgv.c:74
+msgid "be somewhat more quiet"
+msgstr "盡量安靜些"
+
+#: g10/gpgv.c:75
+msgid "take the keys from this keyring"
+msgstr "從這個鑰匙圈裡取用金鑰"
+
+#: g10/gpgv.c:77
+msgid "make timestamp conflicts only a warning"
+msgstr "僅把時間戳印矛盾視為警告"
+
+#: g10/gpgv.c:78
+msgid "|FD|write status info to this FD"
+msgstr "|檔案描述|把狀態資訊寫入此檔案描述"
+
+#: g10/gpgv.c:102
+msgid "Usage: gpgv [options] [files] (-h for help)"
+msgstr "用法: gpgv [選項] [檔案] (或用 -h 求助)"
+
+#: g10/gpgv.c:105
+msgid ""
+"Syntax: gpg [options] [files]\n"
+"Check signatures against known trusted keys\n"
+msgstr ""
+"語法: gpg [選項] [檔案]\n"
+"用已知的受信任金鑰來檢查簽章\n"
+
+#: g10/helptext.c:49
+msgid ""
+"It's up to you to assign a value here; this value will never be exported\n"
+"to any 3rd party.  We need it to implement the web-of-trust; it has nothing\n"
+"to do with the (implicitly created) web-of-certificates."
+msgstr ""
+"在這裡指派的數值完全是看妳自己決定; 這些數值永遠不會被匯出給其他人.\n"
+"我們需要它來實施信任網絡; 這跟 (自動建立起的) 憑證網絡一點關係也沒有."
+
+#: g10/helptext.c:55
+msgid ""
+"To build the Web-of-Trust, GnuPG needs to know which keys are\n"
+"ultimately trusted - those are usually the keys for which you have\n"
+"access to the secret key.  Answer \"yes\" to set this key to\n"
+"ultimately trusted\n"
+msgstr ""
+"要建立起信任網絡, GnuPG 需要知道哪些金鑰是被徹底信任的 -\n"
+"那些金鑰通常就是妳有辦法存取到私鑰的. 回答 \"yes\" 來將這些\n"
+"金鑰設成被徹底信任的\n"
+
+#: g10/helptext.c:62
+msgid "If you want to use this untrusted key anyway, answer \"yes\"."
+msgstr "如果妳無論如何想要使用這把未被信任的金鑰, 請回答 \"yes\"."
+
+#: g10/helptext.c:66
+msgid ""
+"Enter the user ID of the addressee to whom you want to send the message."
+msgstr "輸入妳要遞送的訊息接收者的使用者 ID."
+
+#: g10/helptext.c:70
+msgid ""
+"Select the algorithm to use.\n"
+"\n"
+"DSA (aka DSS) is the Digital Signature Algorithm and can only be used\n"
+"for signatures.\n"
+"\n"
+"Elgamal is an encrypt-only algorithm.\n"
+"\n"
+"RSA may be used for signatures or encryption.\n"
+"\n"
+"The first (primary) key must always be a key which is capable of signing."
+msgstr ""
+"請選擇要使用的演算法.\n"
+"\n"
+"DSA (亦即 DSS) 是數位簽章演算法 (Digital Signature Algorithm),\n"
+"祇能用於簽署.\n"
+"\n"
+"Elgamal 是祇能用於加密的演算法.\n"
+"\n"
+"RSA 可以被用來簽署及加密.\n"
+"\n"
+"第一把 (主要的) 金鑰一定要含有能用於簽署的金鑰."
+
+#: g10/helptext.c:84
+msgid ""
+"In general it is not a good idea to use the same key for signing and\n"
+"encryption.  This algorithm should only be used in certain domains.\n"
+"Please consult your security expert first."
+msgstr ""
+"通常來說用同一把金鑰簽署及加密並不是個好主意.\n"
+"這個演算法應該祇被用於特定的情況下.\n"
+"請先聯絡妳的安全專家."
+
+#: g10/helptext.c:91
+msgid "Enter the size of the key"
+msgstr "請輸入金鑰的尺寸"
+
+#: g10/helptext.c:95 g10/helptext.c:100 g10/helptext.c:112 g10/helptext.c:144
+#: g10/helptext.c:172 g10/helptext.c:177 g10/helptext.c:182
+msgid "Answer \"yes\" or \"no\""
+msgstr "請回答 \"yes\" 或 \"no\""
+
+#: g10/helptext.c:105
+msgid ""
+"Enter the required value as shown in the prompt.\n"
+"It is possible to enter a ISO date (YYYY-MM-DD) but you won't\n"
+"get a good error response - instead the system tries to interpret\n"
+"the given value as an interval."
+msgstr ""
+"請輸入提示裡所要求的數值.\n"
+"妳可以輸入 ISO 日期格式 (YYYY-MM-DD), 但是不會得到良好的錯誤回應 -\n"
+"反之, 系統會試著把給定的數值中斷成若干片段."
+
+#: g10/helptext.c:117
+msgid "Enter the name of the key holder"
+msgstr "請輸入金鑰持有人的名字"
+
+#: g10/helptext.c:122
+msgid "please enter an optional but highly suggested email address"
+msgstr "請輸入選用 (但強烈建議使用) 的電子郵件位址"
+
+#: g10/helptext.c:126
+msgid "Please enter an optional comment"
+msgstr "請輸入選用的註釋"
+
+#: g10/helptext.c:131
+msgid ""
+"N  to change the name.\n"
+"C  to change the comment.\n"
+"E  to change the email address.\n"
+"O  to continue with key generation.\n"
+"Q  to to quit the key generation."
+msgstr ""
+"N  修改姓名.\n"
+"C  修改註釋.\n"
+"E  修改電子郵件位址.\n"
+"O  繼續產生金鑰.\n"
+"Q  中止產生金鑰."
+
+#: g10/helptext.c:140
+msgid "Answer \"yes\" (or just \"y\") if it is okay to generate the sub key."
+msgstr "如果妳覺得產生子鑰可以的話, 就回答 \"yes\" (或者祇要 \"y\")."
+
+#: g10/helptext.c:148
+msgid ""
+"When you sign a user ID on a key, you should first verify that the key\n"
+"belongs to the person named in the user ID.  It is useful for others to\n"
+"know how carefully you verified this.\n"
+"\n"
+"\"0\" means you make no particular claim as to how carefully you verified "
+"the\n"
+"    key.\n"
+"\n"
+"\"1\" means you believe the key is owned by the person who claims to own it\n"
+"    but you could not, or did not verify the key at all.  This is useful "
+"for\n"
+"    a \"persona\" verification, where you sign the key of a pseudonymous "
+"user.\n"
+"\n"
+"\"2\" means you did casual verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint and checked the user ID on "
+"the\n"
+"    key against a photo ID.\n"
+"\n"
+"\"3\" means you did extensive verification of the key.  For example, this "
+"could\n"
+"    mean that you verified the key fingerprint with the owner of the key in\n"
+"    person, and that you checked, by means of a hard to forge document with "
+"a\n"
+"    photo ID (such as a passport) that the name of the key owner matches "
+"the\n"
+"    name in the user ID on the key, and finally that you verified (by "
+"exchange\n"
+"    of email) that the email address on the key belongs to the key owner.\n"
+"\n"
+"Note that the examples given above for levels 2 and 3 are *only* examples.\n"
+"In the end, it is up to you to decide just what \"casual\" and \"extensive"
+"\"\n"
+"mean to you when you sign other keys.\n"
+"\n"
+"If you don't know what the right answer is, answer \"0\"."
+msgstr ""
+"當妳在某把金鑰上簽署某個使用者 ID, 妳首先必須先驗證那把\n"
+"金鑰確實屬於那個使用者 ID 上叫那個名字的人. 這對那些知道\n"
+"妳多小心驗證的人來說很有用.\n"
+"\n"
+"\"0\" 表示妳不能提出任何特別的主張來表明\n"
+"    妳多仔細驗證那把金鑰\n"
+"\n"
+"\"1\" 表示妳相信這把金鑰屬於那個主張是主人的人,\n"
+"    但是妳不能或沒有驗證那把金鑰.\n"
+"    這對那些祇想要 \"個人的\" 驗證的人來說很有用,\n"
+"    因為妳簽署了一把擬似匿名使用者的金鑰.\n"
+"\n"
+"\"2\" 表示妳真的仔細驗證了那把金鑰.\n"
+"    例如說, 這能表示妳驗證了這把金鑰的指紋和\n"
+"    使用者 ID, 並比對了照片 ID.\n"
+"\n"
+"\"3\" 表示妳真的做了大規模的驗證金鑰工作.\n"
+"    例如說, 這能表示妳向金鑰持有人驗證了金鑰指紋,\n"
+"    而且妳透過附帶照片而難以偽造的文件 (像是護照)\n"
+"    確認了金鑰持有人的姓名與金鑰上使用者 ID 的一致,\n"
+"    最後妳還 (透過電子郵件往來) 驗證了金鑰上的\n"
+"    電子郵件位址確實屬於金鑰持有人.\n"
+"\n"
+"請注意上述關於等級 2 和 3 的例子 \"祇是\" 例子而已.\n"
+"最後, 還是得由妳自己決定當妳簽署其他金鑰時,\n"
+"甚麼是 \"漫不經心\", 而甚麼是 \"超級謹慎\".\n"
+"\n"
+"如果妳不知道應該選甚麼答案的話, 就選 \"0\"."
+
+#: g10/helptext.c:186
+msgid "Answer \"yes\" if you want to sign ALL the user IDs"
+msgstr "如果妳想要簽署 *所有* 使用者 ID 的話就回答 \"yes\""
+
+#: g10/helptext.c:190
+msgid ""
+"Answer \"yes\" if you really want to delete this user ID.\n"
+"All certificates are then also lost!"
+msgstr ""
+"如果妳真的想要刪除這個使用者 ID 的話就回答 \"yes\".\n"
+"所有的憑證在那之後也都會失去!"
+
+#: g10/helptext.c:195
+msgid "Answer \"yes\" if it is okay to delete the subkey"
+msgstr "如果刪除這把子鑰沒問題的話就回答 \"yes\""
+
+#: g10/helptext.c:200
+msgid ""
+"This is a valid signature on the key; you normally don't want\n"
+"to delete this signature because it may be important to establish a\n"
+"trust connection to the key or another key certified by this key."
+msgstr ""
+"這是一份在這把金鑰上有效的簽章; 通常妳不會想要刪除這份簽章,\n"
+"因為要跟別的金鑰建立起信任連結, 或由這把金鑰所簽署的金鑰憑證\n"
+"會是一件相當重要的事."
+
+#: g10/helptext.c:205
+msgid ""
+"This signature can't be checked because you don't have the\n"
+"corresponding key.  You should postpone its deletion until you\n"
+"know which key was used because this signing key might establish\n"
+"a trust connection through another already certified key."
+msgstr ""
+"這份簽章無法被檢驗, 因為妳沒有符合的金鑰. 妳應該延緩刪除它,\n"
+"直到妳知道哪一把金鑰被使用了; 因為這把來簽署的金鑰可能透過\n"
+"其他已經驗證的金鑰建立了一個信任連結."
+
+#: g10/helptext.c:211
+msgid ""
+"The signature is not valid.  It does make sense to remove it from\n"
+"your keyring."
+msgstr "這份簽章無效. 把它從妳的鑰匙圈裡移去相當合理."
+
+#: g10/helptext.c:215
+msgid ""
+"This is a signature which binds the user ID to the key. It is\n"
+"usually not a good idea to remove such a signature.  Actually\n"
+"GnuPG might not be able to use this key anymore.  So do this\n"
+"only if this self-signature is for some reason not valid and\n"
+"a second one is available."
+msgstr ""
+"這是一份和這個金鑰使用者 ID 相繫的簽章. 通常\n"
+"把這樣的簽章移除不會是個好點子. 事實上 GnuPG\n"
+"可能從此就不能再使用這把金鑰了. 所以祇有在這\n"
+"把金鑰的第一個自我簽章因某些原因無效, 而第二\n"
+"個還可用的情況下纔這麼做."
+
+#: g10/helptext.c:223
+msgid ""
+"Change the preferences of all user IDs (or just of the selected ones)\n"
+"to the current list of preferences.  The timestamp of all affected\n"
+"self-signatures will be advanced by one second.\n"
+msgstr ""
+"變更所有 (或祇有被選取的那幾個) 使用者 ID 的偏好成現用的偏好清單.\n"
+"所有受到影響的自我簽章的時間戳記都會增加一秒鐘.\n"
+
+#: g10/helptext.c:230
+msgid "Please enter the passhrase; this is a secret sentence \n"
+msgstr "請輸入密語; 這是一個秘密的句子 \n"
+
+#: g10/helptext.c:236
+msgid "Please repeat the last passphrase, so you are sure what you typed in."
+msgstr "請再次輸入最後的密語, 以確定妳到底鍵進了些甚麼."
+
+#: g10/helptext.c:240
+msgid "Give the name of the file to which the signature applies"
+msgstr "請給定簽章所要套用的檔案名稱"
+
+#: g10/helptext.c:245
+msgid "Answer \"yes\" if it is okay to overwrite the file"
+msgstr "如果覆寫這個檔案沒有問題的話就回答 \"yes\""
+
+#: g10/helptext.c:250
+msgid ""
+"Please enter a new filename. If you just hit RETURN the default\n"
+"file (which is shown in brackets) will be used."
+msgstr ""
+"請輸入一個新的檔名. 如果妳直接按下了 Enter, 那麼\n"
+"就會使用預設的檔案 (顯示在括號中)."
+
+#: g10/helptext.c:256
+msgid ""
+"You should specify a reason for the certification.  Depending on the\n"
+"context you have the ability to choose from this list:\n"
+"  \"Key has been compromised\"\n"
+"      Use this if you have a reason to believe that unauthorized persons\n"
+"      got access to your secret key.\n"
+"  \"Key is superseded\"\n"
+"      Use this if you have replaced this key with a newer one.\n"
+"  \"Key is no longer used\"\n"
+"      Use this if you have retired this key.\n"
+"  \"User ID is no longer valid\"\n"
+"      Use this to state that the user ID should not longer be used;\n"
+"      this is normally used to mark an email address invalid.\n"
+msgstr ""
+"妳應該為這份憑證指定一個原因.\n"
+"根據情境的不同, 妳應該可以從這個清單中選出一項:\n"
+"  \"金鑰已經被洩漏了\"\n"
+"      如果妳相信有某個未經許可的傢伙取得了妳的私鑰的話,\n"
+"      就選這個.\n"
+"  \"金鑰被代換了\"\n"
+"      如果妳把妳的金鑰換成新的了, 就選這個.\n"
+"  \"金鑰不再被使用了\"\n"
+"      如果妳已經撤回了這把金鑰, 就選這個.\n"
+"  \"使用者 ID 不再有效了\"\n"
+"      如果這個使用者 ID 不再被使用了, 就選這個;\n"
+"      這通常用來表示某個電子郵件位址不再有效了.\n"
+
+#: g10/helptext.c:272
+msgid ""
+"If you like, you can enter a text describing why you issue this\n"
+"revocation certificate.  Please keep this text concise.\n"
+"An empty line ends the text.\n"
+msgstr ""
+"妳也可以輸入一串文字來描述為甚麼發佈這份撤銷憑證的理由.\n"
+"請讓這段文字保持簡明扼要.\n"
+"鍵入空白列以結束這段文字.\n"
+
+#: g10/helptext.c:287
+msgid "No help available"
+msgstr "沒有可用的說明"
+
+#: g10/helptext.c:295
+#, c-format
+msgid "No help available for `%s'"
+msgstr "`%s' 沒有可用的說明"
+
+#: g10/import.c:96
+msgid "import signatures that are marked as local-only"
+msgstr ""
+
+#: g10/import.c:98
+msgid "repair damage from the pks keyserver during import"
+msgstr ""
+
+#: g10/import.c:100
+#, fuzzy
+msgid "do not update the trustdb after import"
+msgstr "更新信任資料庫"
+
+#: g10/import.c:102
+#, fuzzy
+msgid "create a public key when importing a secret key"
+msgstr "公鑰與私鑰並不吻合!\n"
+
+#: g10/import.c:104
+msgid "only accept updates to existing keys"
+msgstr ""
+
+#: g10/import.c:106
+#, fuzzy
+msgid "remove unusable parts from key after import"
+msgstr "從金鑰中清除無法使用的部分"
+
+#: g10/import.c:108
+msgid "remove as much as possible from key after import"
+msgstr ""
+
+#: g10/import.c:267
+#, c-format
+msgid "skipping block of type %d\n"
+msgstr "正在跳過 %d 型態的區塊\n"
+
+#: g10/import.c:276
+#, c-format
+msgid "%lu keys processed so far\n"
+msgstr "已有 %lu 把金鑰被處理了\n"
+
+#: g10/import.c:293
+#, c-format
+msgid "Total number processed: %lu\n"
+msgstr "總共被處理的數量: %lu\n"
+
+#: g10/import.c:295
+#, c-format
+msgid "      skipped new keys: %lu\n"
+msgstr "        已跳過的新金鑰: %lu\n"
+
+#: g10/import.c:298
+#, c-format
+msgid "          w/o user IDs: %lu\n"
+msgstr "       沒有使用者的 ID: %lu\n"
+
+#: g10/import.c:300
+#, c-format
+msgid "              imported: %lu"
+msgstr "                已匯入: %lu"
+
+#: g10/import.c:306
+#, c-format
+msgid "             unchanged: %lu\n"
+msgstr "              未改變的: %lu\n"
+
+#: g10/import.c:308
+#, c-format
+msgid "          new user IDs: %lu\n"
+msgstr "         新的使用者 ID: %lu\n"
+
+#: g10/import.c:310
+#, c-format
+msgid "           new subkeys: %lu\n"
+msgstr "              新的子鑰: %lu\n"
+
+#: g10/import.c:312
+#, c-format
+msgid "        new signatures: %lu\n"
+msgstr "              新的簽章: %lu\n"
+
+#: g10/import.c:314
+#, c-format
+msgid "   new key revocations: %lu\n"
+msgstr "          新的金鑰撤銷: %lu\n"
+
+#: g10/import.c:316
+#, c-format
+msgid "      secret keys read: %lu\n"
+msgstr "          被讀取的私鑰: %lu\n"
+
+#: g10/import.c:318
+#, c-format
+msgid "  secret keys imported: %lu\n"
+msgstr "          已匯入的私鑰: %lu\n"
+
+#: g10/import.c:320
+#, c-format
+msgid " secret keys unchanged: %lu\n"
+msgstr "          未改變的私鑰: %lu\n"
+
+#: g10/import.c:322
+#, c-format
+msgid "          not imported: %lu\n"
+msgstr "              未被匯入: %lu\n"
+
+#: g10/import.c:324
+#, c-format
+msgid "    signatures cleaned: %lu\n"
+msgstr "      已被清除掉的簽章: %lu\n"
+
+#: g10/import.c:326
+#, c-format
+msgid "      user IDs cleaned: %lu\n"
+msgstr " 已被清除掉的使用者 ID: %lu\n"
+
+#: g10/import.c:567
+#, c-format
+msgid "WARNING: key %s contains preferences for unavailable\n"
+msgstr "警告: 金鑰 %s 含有不可用的偏好設定\n"
+
+#. TRANSLATORS: This string is belongs to the previous one.  They are
+#. only split up to allow printing of a common prefix.
+#: g10/import.c:571
+#, fuzzy
+msgid "         algorithms on these user IDs:\n"
+msgstr "這些使用者 ID 上的演算法:\n"
+
+#: g10/import.c:608
+#, c-format
+msgid "         \"%s\": preference for cipher algorithm %s\n"
+msgstr "         \"%s\": 編密演算法 %s 的偏好設定\n"
+
+#: g10/import.c:620
+#, c-format
+msgid "         \"%s\": preference for digest algorithm %s\n"
+msgstr "         \"%s\": 摘要演算法 %s 的偏好設定\n"
+
+#: g10/import.c:632
+#, c-format
+msgid "         \"%s\": preference for compression algorithm %s\n"
+msgstr "         \"%s\": 壓縮演算法 %s 的偏好設定\n"
+
+#: g10/import.c:645
+msgid "it is strongly suggested that you update your preferences and\n"
+msgstr "我們強烈建議妳更新妳的偏好設定, 並\n"
+
+#: g10/import.c:647
+msgid "re-distribute this key to avoid potential algorithm mismatch problems\n"
+msgstr "重新散佈此金鑰, 以避免潛在的演算法不一致問題.\n"
+
+#: g10/import.c:671
+#, c-format
+msgid "you can update your preferences with: gpg --edit-key %s updpref save\n"
+msgstr "妳可以像這樣更新妳的偏好設定: gpg --edit-key %s updpref save\n"
+
+#: g10/import.c:721 g10/import.c:1119
+#, c-format
+msgid "key %s: no user ID\n"
+msgstr "金鑰 %s: 沒有使用者 ID\n"
+
+#: g10/import.c:750
+#, c-format
+msgid "key %s: PKS subkey corruption repaired\n"
+msgstr "金鑰 %s: PKS 子鑰的訛誤已被修復\n"
+
+#: g10/import.c:765
+#, c-format
+msgid "key %s: accepted non self-signed user ID \"%s\"\n"
+msgstr "金鑰 %s: 非自我簽署的使用者 ID \"%s\" 已被接受\n"
+
+#: g10/import.c:771
+#, c-format
+msgid "key %s: no valid user IDs\n"
+msgstr "金鑰 %s: 沒有有效的使用者 ID\n"
+
+#: g10/import.c:773
+msgid "this may be caused by a missing self-signature\n"
+msgstr "這可能是由於遺失自我簽章所導致的後果\n"
+
+#: g10/import.c:783 g10/import.c:1241
+#, c-format
+msgid "key %s: public key not found: %s\n"
+msgstr "金鑰 %s: 找不到公鑰: %s\n"
+
+#: g10/import.c:789
+#, c-format
+msgid "key %s: new key - skipped\n"
+msgstr "金鑰 %s: 新的金鑰 - 已跳過\n"
+
+#: g10/import.c:798
+#, c-format
+msgid "no writable keyring found: %s\n"
+msgstr "找不到可寫的鑰匙圈: %s\n"
+
+#: g10/import.c:803 g10/openfile.c:273 g10/sign.c:831 g10/sign.c:1135
+#, c-format
+msgid "writing to `%s'\n"
+msgstr "正在寫到 `%s'\n"
+
+#: g10/import.c:807 g10/import.c:902 g10/import.c:1159 g10/import.c:1302
+#: g10/import.c:2364 g10/import.c:2386
+#, c-format
+msgid "error writing keyring `%s': %s\n"
+msgstr "寫到鑰匙圈 `%s' 時發生錯誤: %s\n"
+
+#: g10/import.c:826
+#, c-format
+msgid "key %s: public key \"%s\" imported\n"
+msgstr "金鑰 %s: 公鑰 \"%s\" 已被匯入\n"
+
+#: g10/import.c:850
+#, c-format
+msgid "key %s: doesn't match our copy\n"
+msgstr "金鑰 %s: 跟我們的副本不吻合\n"
+
+#: g10/import.c:867 g10/import.c:1259
+#, c-format
+msgid "key %s: can't locate original keyblock: %s\n"
+msgstr "金鑰 %s: 無法定位原始的金鑰區塊: %s\n"
+
+#: g10/import.c:875 g10/import.c:1266
+#, c-format
+msgid "key %s: can't read original keyblock: %s\n"
+msgstr "金鑰 %s: 無法讀取原始的金鑰區塊: %s\n"
+
+#: g10/import.c:912
+#, c-format
+msgid "key %s: \"%s\" 1 new user ID\n"
+msgstr "金鑰 %s: \"%s\" 1 個新的使用者 ID\n"
+
+#: g10/import.c:915
+#, c-format
+msgid "key %s: \"%s\" %d new user IDs\n"
+msgstr "金鑰 %s: \"%s\" %d 個新的使用者 ID\n"
+
+#: g10/import.c:918
+#, c-format
+msgid "key %s: \"%s\" 1 new signature\n"
+msgstr "金鑰 %s: \"%s\" 1 個新的簽章\n"
+
+#: g10/import.c:921
+#, c-format
+msgid "key %s: \"%s\" %d new signatures\n"
+msgstr "金鑰 %s: \"%s\" %d 個新的簽章\n"
+
+#: g10/import.c:924
+#, c-format
+msgid "key %s: \"%s\" 1 new subkey\n"
+msgstr "金鑰 %s: \"%s\" 1 個新的子鑰\n"
+
+#: g10/import.c:927
+#, c-format
+msgid "key %s: \"%s\" %d new subkeys\n"
+msgstr "金鑰 %s: \"%s\" %d 個新的子鑰\n"
+
+#: g10/import.c:930
+#, c-format
+msgid "key %s: \"%s\" %d signature cleaned\n"
+msgstr "金鑰 %s: \"%s\" 已清除掉 %d 份簽章\n"
+
+#: g10/import.c:933
+#, c-format
+msgid "key %s: \"%s\" %d signatures cleaned\n"
+msgstr "金鑰 %s: \"%s\" 已清除掉 %d 份簽章\n"
+
+#: g10/import.c:936
+#, c-format
+msgid "key %s: \"%s\" %d user ID cleaned\n"
+msgstr "金鑰 %s: \"%s\" 已清除掉 %d 個使用者 ID\n"
+
+#: g10/import.c:939
+#, c-format
+msgid "key %s: \"%s\" %d user IDs cleaned\n"
+msgstr "金鑰 %s: \"%s\" 已清除掉 %d 個使用者 ID\n"
+
+#: g10/import.c:962
+#, c-format
+msgid "key %s: \"%s\" not changed\n"
+msgstr "金鑰 %s: \"%s\" 沒有被改變\n"
+
+#: g10/import.c:1125
+#, c-format
+msgid "key %s: secret key with invalid cipher %d - skipped\n"
+msgstr "金鑰 %s: 私鑰使用了無效的編密法 %d - 已跳過\n"
+
+#: g10/import.c:1136
+msgid "importing secret keys not allowed\n"
+msgstr "未被允許匯入私鑰\n"
+
+#: g10/import.c:1153 g10/import.c:2379
+#, c-format
+msgid "no default secret keyring: %s\n"
+msgstr "沒有預設的私鑰鑰匙圈: %s\n"
+
+#: g10/import.c:1164
+#, c-format
+msgid "key %s: secret key imported\n"
+msgstr "金鑰 %s: 私鑰被匯入了\n"
+
+#: g10/import.c:1194
+#, c-format
+msgid "key %s: already in secret keyring\n"
+msgstr "金鑰 %s: 已經在私鑰鑰匙圈中了\n"
+
+#: g10/import.c:1204
+#, c-format
+msgid "key %s: secret key not found: %s\n"
+msgstr "金鑰 %s: 找不到私鑰: %s\n"
+
+#: g10/import.c:1234
+#, c-format
+msgid "key %s: no public key - can't apply revocation certificate\n"
+msgstr "金鑰 %s: 沒有公鑰 - 無法套用撤銷憑證\n"
+
+#: g10/import.c:1277
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - rejected\n"
+msgstr "金鑰 %s: 無效的撤銷憑證: %s - 已駁回\n"
+
+#: g10/import.c:1309
+#, c-format
+msgid "key %s: \"%s\" revocation certificate imported\n"
+msgstr "金鑰 %s: \"%s\" 撤銷憑證已被匯入\n"
+
+#: g10/import.c:1375
+#, c-format
+msgid "key %s: no user ID for signature\n"
+msgstr "金鑰 %s: 簽章沒有使用者 ID\n"
+
+#: g10/import.c:1390
+#, c-format
+msgid "key %s: unsupported public key algorithm on user ID \"%s\"\n"
+msgstr "金鑰 %s: 使用者 ID \"%s\" 使用了未被支援的公鑰演算法\n"
+
+#: g10/import.c:1392
+#, c-format
+msgid "key %s: invalid self-signature on user ID \"%s\"\n"
+msgstr "金鑰 %s: 使用者 ID \"%s\" 有無效的自我簽章\n"
+
+#: g10/import.c:1410
+#, c-format
+msgid "key %s: no subkey for key binding\n"
+msgstr "金鑰 %s: 沒有子鑰可供附帶\n"
+
+#: g10/import.c:1421 g10/import.c:1471
+#, c-format
+msgid "key %s: unsupported public key algorithm\n"
+msgstr "金鑰 %s: 未被支援的公鑰演算法\n"
+
+#: g10/import.c:1423
+#, c-format
+msgid "key %s: invalid subkey binding\n"
+msgstr "金鑰 %s: 無效的附帶子鑰\n"
+
+#: g10/import.c:1438
+#, c-format
+msgid "key %s: removed multiple subkey binding\n"
+msgstr "金鑰 %s: 多重附帶子鑰已被移除\n"
+
+#: g10/import.c:1460
+#, c-format
+msgid "key %s: no subkey for key revocation\n"
+msgstr "金鑰 %s: 沒有子鑰可供金鑰撤銷\n"
+
+#: g10/import.c:1473
+#, c-format
+msgid "key %s: invalid subkey revocation\n"
+msgstr "金鑰 %s: 無效的子鑰撤銷\n"
+
+#: g10/import.c:1488
+#, c-format
+msgid "key %s: removed multiple subkey revocation\n"
+msgstr "金鑰 %s: 多重子鑰撤銷已移除\n"
+
+#: g10/import.c:1530
+#, c-format
+msgid "key %s: skipped user ID \"%s\"\n"
+msgstr "金鑰 %s: 使用者 ID \"%s\" 已跳過\n"
+
+#: g10/import.c:1551
+#, c-format
+msgid "key %s: skipped subkey\n"
+msgstr "金鑰 %s: 子鑰已跳過\n"
+
+#  here we violate the rfc a bit by still allowing
+#  * to import non-exportable signature when we have the
+#  * the secret key used to create this signature - it
+#  * seems that this makes sense
+#: g10/import.c:1578
+#, c-format
+msgid "key %s: non exportable signature (class 0x%02X) - skipped\n"
+msgstr "金鑰 %s: 不可匯出的簽章 (等級 0x%02X) - 已跳過\n"
+
+#: g10/import.c:1588
+#, c-format
+msgid "key %s: revocation certificate at wrong place - skipped\n"
+msgstr "金鑰 %s: 撤銷憑證在錯誤的地方 - 已跳過\n"
+
+#: g10/import.c:1605
+#, c-format
+msgid "key %s: invalid revocation certificate: %s - skipped\n"
+msgstr "金鑰 %s: 無效的撤銷憑證: %s - 已跳過\n"
+
+#: g10/import.c:1619
+#, c-format
+msgid "key %s: subkey signature in wrong place - skipped\n"
+msgstr "金鑰 %s: 子鑰簽章在錯誤的地方 - 已跳過\n"
+
+#: g10/import.c:1627
+#, c-format
+msgid "key %s: unexpected signature class (0x%02X) - skipped\n"
+msgstr "金鑰 %s: 非預期的簽章等級 (0x%02X) - 已跳過\n"
+
+#: g10/import.c:1727
+#, c-format
+msgid "key %s: duplicated user ID detected - merged\n"
+msgstr "金鑰 %s: 偵測到重複的使用者 ID - 已合併\n"
+
+#: g10/import.c:1789
+#, c-format
+msgid "WARNING: key %s may be revoked: fetching revocation key %s\n"
+msgstr "警告: 金鑰 %s 可能被撤銷了: 正在取回撤銷金鑰 %s\n"
+
+#: g10/import.c:1803
+#, c-format
+msgid "WARNING: key %s may be revoked: revocation key %s not present.\n"
+msgstr "警告: 金鑰 %s 可能被撤銷了: 撤銷金鑰 %s 未出現.\n"
+
+#: g10/import.c:1862
+#, c-format
+msgid "key %s: \"%s\" revocation certificate added\n"
+msgstr "金鑰 %s: 已新增 \"%s\" 撤銷憑證\n"
+
+#: g10/import.c:1896
+#, c-format
+msgid "key %s: direct key signature added\n"
+msgstr "金鑰 %s: 已新增直接金鑰簽章\n"
+
+#: g10/import.c:2285
+msgid "NOTE: a key's S/N does not match the card's one\n"
+msgstr "請注意: 某份金鑰的序號 (S/N) 與卡片的序號並不吻合\n"
+
+#: g10/import.c:2293
+msgid "NOTE: primary key is online and stored on card\n"
+msgstr "請注意: 主鑰在線上且已存放於卡片上了\n"
+
+#: g10/import.c:2295
+msgid "NOTE: secondary key is online and stored on card\n"
+msgstr "請注意: 次鑰在線上且已存放於卡片上了\n"
+
+#: g10/keydb.c:168
+#, c-format
+msgid "error creating keyring `%s': %s\n"
+msgstr "建立鑰匙圈 `%s' 時發生錯誤: %s\n"
+
+#: g10/keydb.c:175
+#, c-format
+msgid "keyring `%s' created\n"
+msgstr "鑰匙圈 `%s' 已建立\n"
+
+#: g10/keydb.c:316 g10/keydb.c:319
+#, c-format
+msgid "keyblock resource `%s': %s\n"
+msgstr "金鑰區塊資源 `%s': %s\n"
+
+#: g10/keydb.c:698
+#, c-format
+msgid "failed to rebuild keyring cache: %s\n"
+msgstr "重新建立鑰匙圈快取失敗: %s\n"
+
+#: g10/keyedit.c:266
+msgid "[revocation]"
+msgstr "[撤銷]"
+
+#: g10/keyedit.c:267
+msgid "[self-signature]"
+msgstr "[自我簽章]"
+
+#: g10/keyedit.c:345 g10/keylist.c:390
+msgid "1 bad signature\n"
+msgstr "1 個損壞的簽章\n"
+
+#: g10/keyedit.c:347 g10/keylist.c:392
+#, c-format
+msgid "%d bad signatures\n"
+msgstr "%d 個損壞的簽章\n"
+
+#: g10/keyedit.c:349 g10/keylist.c:394
+msgid "1 signature not checked due to a missing key\n"
+msgstr "有 1 份簽章因為遺失金鑰而未被檢查\n"
+
+#: g10/keyedit.c:351 g10/keylist.c:396
+#, c-format
+msgid "%d signatures not checked due to missing keys\n"
+msgstr "有 %d 份簽章因為遺失金鑰而未被檢查\n"
+
+#: g10/keyedit.c:353 g10/keylist.c:398
+msgid "1 signature not checked due to an error\n"
+msgstr "有 1 份簽章因為某個錯誤而未被檢查\n"
+
+#: g10/keyedit.c:355 g10/keylist.c:400
+#, c-format
+msgid "%d signatures not checked due to errors\n"
+msgstr "有 %d 份簽章因為某些錯誤而未被檢查\n"
+
+#: g10/keyedit.c:357
+msgid "1 user ID without valid self-signature detected\n"
+msgstr "偵測到 1 個沒有有效自我簽章的使用者 ID\n"
+
+#: g10/keyedit.c:359
+#, c-format
+msgid "%d user IDs without valid self-signatures detected\n"
+msgstr "偵測到 %d 個沒有有效自我簽章的使用者 ID\n"
+
+#: g10/keyedit.c:415 g10/pkclist.c:263
+msgid ""
+"Please decide how far you trust this user to correctly verify other users' "
+"keys\n"
+"(by looking at passports, checking fingerprints from different sources, "
+"etc.)\n"
+msgstr ""
+"請判斷妳有多信任這位使用者確實驗證其他使用者的金鑰\n"
+"(像是查對身份證, 或從不同的來源檢查指紋等...)的能力\n"
+
+#: g10/keyedit.c:419 g10/pkclist.c:275
+#, c-format
+msgid "  %d = I trust marginally\n"
+msgstr "  %d = 我勉強信任\n"
+
+#: g10/keyedit.c:420 g10/pkclist.c:277
+#, c-format
+msgid "  %d = I trust fully\n"
+msgstr "  %d = 我完全信任\n"
+
+#: g10/keyedit.c:439
+msgid ""
+"Please enter the depth of this trust signature.\n"
+"A depth greater than 1 allows the key you are signing to make\n"
+"trust signatures on your behalf.\n"
+msgstr ""
+"請輸入此信任簽章的深度.\n"
+"深度大於 1 的話就表示妳信任這把正被簽署的金鑰,\n"
+"同時也信任這把金鑰所簽署的信任簽章.\n"
+
+#: g10/keyedit.c:455
+msgid "Please enter a domain to restrict this signature, or enter for none.\n"
+msgstr "請輸入約束此簽章的網域, 若無請直接按下 [Enter].\n"
+
+#: g10/keyedit.c:599
+#, c-format
+msgid "User ID \"%s\" is revoked."
+msgstr "使用者 ID \"%s\" 已經被撤銷了."
+
+#: g10/keyedit.c:608 g10/keyedit.c:636 g10/keyedit.c:663 g10/keyedit.c:831
+#: g10/keyedit.c:896 g10/keyedit.c:1742
+msgid "Are you sure you still want to sign it? (y/N) "
+msgstr "妳仍然想要簽署它嗎? (y/N) "
+
+#: g10/keyedit.c:622 g10/keyedit.c:650 g10/keyedit.c:677 g10/keyedit.c:837
+#: g10/keyedit.c:1748
+msgid "  Unable to sign.\n"
+msgstr "  無法簽署.\n"
+
+#: g10/keyedit.c:627
+#, c-format
+msgid "User ID \"%s\" is expired."
+msgstr "使用者 ID \"%s\" 已經過期了."
+
+#: g10/keyedit.c:655
+#, c-format
+msgid "User ID \"%s\" is not self-signed."
+msgstr "使用者 ID \"%s\" 未經自我簽署."
+
+#: g10/keyedit.c:683
+#, c-format
+msgid "User ID \"%s\" is signable.  "
+msgstr "使用者 ID \"%s\" 可被簽署."
+
+#: g10/keyedit.c:685
+msgid "Sign it? (y/N) "
+msgstr "是否要簽署? (y/N) "
+
+#: g10/keyedit.c:707
+#, c-format
+msgid ""
+"The self-signature on \"%s\"\n"
+"is a PGP 2.x-style signature.\n"
+msgstr ""
+"\"%s\" 裡的自我簽章\n"
+"是 PGP 2.x 型態的簽章.\n"
+
+#: g10/keyedit.c:716
+msgid "Do you want to promote it to an OpenPGP self-signature? (y/N) "
+msgstr "妳是否想要將它升級成 OpenPGP 自我簽章? (y/N) "
+
+#: g10/keyedit.c:730
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"has expired.\n"
+msgstr ""
+"妳目前在 \"%s\" 的簽章\n"
+"已經過期了.\n"
+
+#: g10/keyedit.c:734
+msgid "Do you want to issue a new signature to replace the expired one? (y/N) "
+msgstr "妳想要發佈一份新的簽章來取代已過期的那一個嗎? (y/N) "
+
+#: g10/keyedit.c:755
+#, c-format
+msgid ""
+"Your current signature on \"%s\"\n"
+"is a local signature.\n"
+msgstr ""
+"妳目前在 \"%s\" 的簽章\n"
+"是一份本地簽章.\n"
+
+#: g10/keyedit.c:759
+msgid "Do you want to promote it to a full exportable signature? (y/N) "
+msgstr "妳是否想要把他升級成可以完全匯出的簽章? (y/N) "
+
+#: g10/keyedit.c:780
+#, c-format
+msgid "\"%s\" was already locally signed by key %s\n"
+msgstr "\"%s\" 已經被金鑰 %s 在本地簽署了\n"
+
+#: g10/keyedit.c:783
+#, c-format
+msgid "\"%s\" was already signed by key %s\n"
+msgstr "\"%s\" 已經被金鑰 %s 簽署了\n"
+
+#: g10/keyedit.c:788
+msgid "Do you want to sign it again anyway? (y/N) "
+msgstr "妳仍然想要再次簽署它嗎? (y/N) "
+
+#: g10/keyedit.c:810
+#, c-format
+msgid "Nothing to sign with key %s\n"
+msgstr "沒有東西可以讓金鑰 %s 簽署\n"
+
+#: g10/keyedit.c:825
+msgid "This key has expired!"
+msgstr "這把金鑰已經過期了!"
+
+#: g10/keyedit.c:843
+#, c-format
+msgid "This key is due to expire on %s.\n"
+msgstr "這把金鑰將在 %s 過期.\n"
+
+#: g10/keyedit.c:849
+msgid "Do you want your signature to expire at the same time? (Y/n) "
+msgstr "妳想要讓妳的簽章也在同一個時候過期嗎? (Y/n) "
+
+#: g10/keyedit.c:889
+msgid ""
+"You may not make an OpenPGP signature on a PGP 2.x key while in --pgp2 "
+"mode.\n"
+msgstr "妳不能在 --pgp2 模式下, 拿 PGP 2.x 金鑰做出 OpenPGP 簽章.\n"
+
+#: g10/keyedit.c:891
+msgid "This would make the key unusable in PGP 2.x.\n"
+msgstr "這會讓這把金鑰在 PGP 2.x 模式下不可使用.\n"
+
+#: g10/keyedit.c:916
+msgid ""
+"How carefully have you verified the key you are about to sign actually "
+"belongs\n"
+"to the person named above?  If you don't know what to answer, enter \"0\".\n"
+msgstr ""
+"妳有多謹慎檢查正要簽署的金鑰確實屬於上面那個人的名字呢?\n"
+"如果妳不知道這個問題的答案, 請輸入 \"0\".\n"
+
+#: g10/keyedit.c:921
+#, c-format
+msgid "   (0) I will not answer.%s\n"
+msgstr "   (0) 我不作答.%s\n"
+
+#: g10/keyedit.c:923
+#, c-format
+msgid "   (1) I have not checked at all.%s\n"
+msgstr "   (1) 我根本沒有檢查過.%s\n"
+
+#: g10/keyedit.c:925
+#, c-format
+msgid "   (2) I have done casual checking.%s\n"
+msgstr "   (2) 我隨意檢查過了.%s\n"
+
+#: g10/keyedit.c:927
+#, c-format
+msgid "   (3) I have done very careful checking.%s\n"
+msgstr "   (3) 我非常小心地檢查過了.%s\n"
+
+#: g10/keyedit.c:933
+msgid "Your selection? (enter `?' for more information): "
+msgstr "妳的選擇是? (輸入 `?' 以取得更多資訊): "
+
+#: g10/keyedit.c:957
+#, c-format
+msgid ""
+"Are you sure that you want to sign this key with your\n"
+"key \"%s\" (%s)\n"
+msgstr ""
+"妳真的確定要用妳的金鑰 \"%s\" (%s)\n"
+"來簽署這把金鑰嗎\n"
+
+#: g10/keyedit.c:964
+msgid "This will be a self-signature.\n"
+msgstr "這將會是一份自我簽章.\n"
+
+#: g10/keyedit.c:970
+msgid "WARNING: the signature will not be marked as non-exportable.\n"
+msgstr "警告: 這份簽章不會被標記為不可匯出.\n"
+
+#: g10/keyedit.c:978
+msgid "WARNING: the signature will not be marked as non-revocable.\n"
+msgstr "警告: 這份簽章不會被標記成不可撤銷.\n"
+
+#: g10/keyedit.c:988
+msgid "The signature will be marked as non-exportable.\n"
+msgstr "這份簽章會被標記成不可匯出.\n"
+
+#: g10/keyedit.c:995
+msgid "The signature will be marked as non-revocable.\n"
+msgstr "這份簽章會被標記成不可撤銷.\n"
+
+#: g10/keyedit.c:1002
+msgid "I have not checked this key at all.\n"
+msgstr "我根本沒有檢查過這把金鑰.\n"
+
+#: g10/keyedit.c:1007
+msgid "I have checked this key casually.\n"
+msgstr "我隨意檢查過這把金鑰了.\n"
+
+#: g10/keyedit.c:1012
+msgid "I have checked this key very carefully.\n"
+msgstr "我非常小心地檢查過這把金鑰了.\n"
+
+#: g10/keyedit.c:1022
+msgid "Really sign? (y/N) "
+msgstr "真的要簽署嗎? (y/N)"
+
+#: g10/keyedit.c:1067 g10/keyedit.c:4788 g10/keyedit.c:4879 g10/keyedit.c:4943
+#: g10/keyedit.c:5004 g10/sign.c:352
+#, c-format
+msgid "signing failed: %s\n"
+msgstr "簽署時失敗了: %s\n"
+
+#: g10/keyedit.c:1132
+msgid "Key has only stub or on-card key items - no passphrase to change.\n"
+msgstr "金鑰祇剩下殘骸或者祇含有卡上 (on-card) 金鑰項目 - 沒有可變更的密語.\n"
+
+#: g10/keyedit.c:1143 g10/keygen.c:3199
+msgid "This key is not protected.\n"
+msgstr "這把金鑰沒有被保護.\n"
+
+#: g10/keyedit.c:1147 g10/keygen.c:3187 g10/revoke.c:539
+msgid "Secret parts of primary key are not available.\n"
+msgstr "主鑰的私鑰部分沒辦法取用.\n"
+
+#: g10/keyedit.c:1151 g10/keygen.c:3202
+msgid "Secret parts of primary key are stored on-card.\n"
+msgstr "主鑰的私鑰部分存放於卡上 (on-card).\n"
+
+#: g10/keyedit.c:1155 g10/keygen.c:3206
+msgid "Key is protected.\n"
+msgstr "金鑰被保護了.\n"
+
+#: g10/keyedit.c:1179
+#, c-format
+msgid "Can't edit this key: %s\n"
+msgstr "無法編輯這把金鑰: %s\n"
+
+#: g10/keyedit.c:1185
+msgid ""
+"Enter the new passphrase for this secret key.\n"
+"\n"
+msgstr ""
+"輸入要給這把私鑰用的新密語.\n"
+"\n"
+
+#: g10/keyedit.c:1194 g10/keygen.c:1897
+msgid "passphrase not correctly repeated; try again"
+msgstr "密語再次輸入時沒有正確重複; 請再試一次"
+
+#: g10/keyedit.c:1199
+msgid ""
+"You don't want a passphrase - this is probably a *bad* idea!\n"
+"\n"
+msgstr ""
+"妳不想要用密語 - 這大概是個 *糟* 點子!\n"
+"\n"
+
+#: g10/keyedit.c:1202
+msgid "Do you really want to do this? (y/N) "
+msgstr "妳真的想要這麼做嗎? (y/N) "
+
+#: g10/keyedit.c:1273
+msgid "moving a key signature to the correct place\n"
+msgstr "正在把金鑰的簽章搬移到正確的位置去\n"
+
+#: g10/keyedit.c:1359
+msgid "save and quit"
+msgstr "儲存並離開"
+
+#: g10/keyedit.c:1362
+msgid "show key fingerprint"
+msgstr "顯示金鑰指紋"
+
+#: g10/keyedit.c:1363
+msgid "list key and user IDs"
+msgstr "列出金鑰和使用者 ID"
+
+#: g10/keyedit.c:1365
+msgid "select user ID N"
+msgstr "使用者 ID 選了 N"
+
+#: g10/keyedit.c:1366
+msgid "select subkey N"
+msgstr "選擇次鑰 N"
+
+#: g10/keyedit.c:1367
+msgid "check signatures"
+msgstr "檢查簽章"
+
+#: g10/keyedit.c:1372
+msgid "sign selected user IDs [* see below for related commands]"
+msgstr "簽署所選的使用者 ID [* 請參見底下有關的註解]"
+
+#: g10/keyedit.c:1377
+msgid "sign selected user IDs locally"
+msgstr "僅在本地簽署所選的使用者 ID"
+
+#: g10/keyedit.c:1379
+msgid "sign selected user IDs with a trust signature"
+msgstr "用信任簽章來簽署所選的使用者 ID"
+
+#: g10/keyedit.c:1381
+msgid "sign selected user IDs with a non-revocable signature"
+msgstr "用不可撤銷的簽章來簽署所選的使用者 ID"
+
+#: g10/keyedit.c:1385
+msgid "add a user ID"
+msgstr "增加一個使用者 ID"
+
+#: g10/keyedit.c:1387
+msgid "add a photo ID"
+msgstr "增加一個照片 ID"
+
+#: g10/keyedit.c:1389
+msgid "delete selected user IDs"
+msgstr "刪除所選的使用者 ID"
+
+#: g10/keyedit.c:1394
+msgid "add a subkey"
+msgstr "增加一把次鑰"
+
+#: g10/keyedit.c:1398
+msgid "add a key to a smartcard"
+msgstr "加入某把金鑰至智慧卡"
+
+#: g10/keyedit.c:1400
+msgid "move a key to a smartcard"
+msgstr "移動某把金鑰至智慧卡"
+
+#: g10/keyedit.c:1402
+msgid "move a backup key to a smartcard"
+msgstr "移動某把備份金鑰至智慧卡"
+
+#: g10/keyedit.c:1406
+msgid "delete selected subkeys"
+msgstr "刪除所選的次鑰"
+
+#: g10/keyedit.c:1408
+msgid "add a revocation key"
+msgstr "增加一把撤銷金鑰"
+
+#: g10/keyedit.c:1410
+msgid "delete signatures from the selected user IDs"
+msgstr "從所選的使用者 ID 中刪除簽章"
+
+#: g10/keyedit.c:1412
+msgid "change the expiration date for the key or selected subkeys"
+msgstr "從金鑰或所選的次鑰中變更使用期限"
+
+#: g10/keyedit.c:1414
+msgid "flag the selected user ID as primary"
+msgstr "把所選的使用者 ID 標為主要"
+
+#: g10/keyedit.c:1416
+msgid "toggle between the secret and public key listings"
+msgstr "在私鑰清單和公鑰清單間切換"
+
+#: g10/keyedit.c:1419
+msgid "list preferences (expert)"
+msgstr "列出偏好 (專家模式)"
+
+#: g10/keyedit.c:1421
+msgid "list preferences (verbose)"
+msgstr "列出偏好 (囉唆模式)"
+
+#: g10/keyedit.c:1423
+msgid "set preference list for the selected user IDs"
+msgstr "設定所選使用者 ID 的偏好清單"
+
+#: g10/keyedit.c:1428
+#, fuzzy
+msgid "set the preferred keyserver URL for the selected user IDs"
+msgstr "設定所選使用者 ID 的偏好金鑰伺服器 URL"
+
+#: g10/keyedit.c:1430
+#, fuzzy
+msgid "set a notation for the selected user IDs"
+msgstr "設定所選使用者 ID 的偏好清單"
+
+#: g10/keyedit.c:1432
+msgid "change the passphrase"
+msgstr "更改密語"
+
+#: g10/keyedit.c:1436
+msgid "change the ownertrust"
+msgstr "更改主觀信任"
+
+#: g10/keyedit.c:1438
+msgid "revoke signatures on the selected user IDs"
+msgstr "從所選的使用者 ID 上撤銷簽章"
+
+#: g10/keyedit.c:1440
+msgid "revoke selected user IDs"
+msgstr "撤銷所選的使用者 ID"
+
+#: g10/keyedit.c:1445
+msgid "revoke key or selected subkeys"
+msgstr "撤銷金鑰或所選的次鑰"
+
+#: g10/keyedit.c:1446
+msgid "enable key"
+msgstr "啟用金鑰"
+
+#: g10/keyedit.c:1447
+msgid "disable key"
+msgstr "禁用金鑰"
+
+#: g10/keyedit.c:1448
+msgid "show selected photo IDs"
+msgstr "顯示所選的照片 ID"
+
+#: g10/keyedit.c:1450
+msgid "compact unusable user IDs and remove unusable signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1452
+msgid "compact unusable user IDs and remove all signatures from key"
+msgstr ""
+
+#: g10/keyedit.c:1570
+#, c-format
+msgid "error reading secret keyblock \"%s\": %s\n"
+msgstr "讀取私鑰區塊 \"%s\" 時出錯: %s\n"
+
+#: g10/keyedit.c:1588
+msgid "Secret key is available.\n"
+msgstr "私鑰可用.\n"
+
+#: g10/keyedit.c:1669
+msgid "Need the secret key to do this.\n"
+msgstr "要有私鑰纔能這麼做.\n"
+
+#: g10/keyedit.c:1677
+msgid "Please use the command \"toggle\" first.\n"
+msgstr "請先使用 \"toggle\" 指令.\n"
+
+#: g10/keyedit.c:1696
+msgid ""
+"* The `sign' command may be prefixed with an `l' for local signatures "
+"(lsign),\n"
+"  a `t' for trust signatures (tsign), an `nr' for non-revocable signatures\n"
+"  (nrsign), or any combination thereof (ltsign, tnrsign, etc.).\n"
+msgstr ""
+"* 這個 `sign' 指令也可以在前面加上一個 `l' 字母, 來表示本地簽章 (lsign),\n"
+"  加上 `t' 的話就是信任簽章 (tsign), 加上 `nr' 的話就是不可撤銷簽章\n"
+"  (nrsign), 當然也可以任意組合這些選項 (像是 ltsign, tnrsign 等等.).\n"
+
+#: g10/keyedit.c:1736
+msgid "Key is revoked."
+msgstr "金鑰已經被撤銷了."
+
+#: g10/keyedit.c:1755
+msgid "Really sign all user IDs? (y/N) "
+msgstr "真的要簽署所有的使用者 ID 嗎? (y/N) "
+
+#: g10/keyedit.c:1762
+msgid "Hint: Select the user IDs to sign\n"
+msgstr "提示: 選擇使用者 ID 來加以簽署\n"
+
+#: g10/keyedit.c:1771
+#, c-format
+msgid "Unknown signature type `%s'\n"
+msgstr "未知的簽章種類 `%s'\n"
+
+#: g10/keyedit.c:1794
+#, c-format
+msgid "This command is not allowed while in %s mode.\n"
+msgstr "在 %s 模式中不允許使用這個指令.\n"
+
+#: g10/keyedit.c:1816 g10/keyedit.c:1836 g10/keyedit.c:2002
+msgid "You must select at least one user ID.\n"
+msgstr "妳至少得選擇一個使用者 ID.\n"
+
+#: g10/keyedit.c:1818
+msgid "You can't delete the last user ID!\n"
+msgstr "妳不能刪除最後一個使用者 ID!\n"
+
+#: g10/keyedit.c:1820
+msgid "Really remove all selected user IDs? (y/N) "
+msgstr "真的要移除所有被選擇的使用者 ID 嗎? (y/N) "
+
+#: g10/keyedit.c:1821
+msgid "Really remove this user ID? (y/N) "
+msgstr "真的要移除這個使用者 ID 嗎? (y/N) "
+
+#: g10/keyedit.c:1871
+msgid "Really move the primary key? (y/N) "
+msgstr "真的要移動主要金鑰嗎? (y/N) "
+
+#: g10/keyedit.c:1883
+msgid "You must select exactly one key.\n"
+msgstr "妳一定祇得選擇一把金鑰.\n"
+
+#: g10/keyedit.c:1911
+msgid "Command expects a filename argument\n"
+msgstr "這項指令應該要拿一個檔名當作參數\n"
+
+#: g10/keyedit.c:1925
+#, c-format
+msgid "Can't open `%s': %s\n"
+msgstr "無法開啟 `%s': %s\n"
+
+#: g10/keyedit.c:1942
+#, c-format
+msgid "Error reading backup key from `%s': %s\n"
+msgstr "從 `%s' 讀取備份金鑰時發生錯誤: %s\n"
+
+#: g10/keyedit.c:1966
+msgid "You must select at least one key.\n"
+msgstr "妳至少必須選擇一把金鑰.\n"
+
+#: g10/keyedit.c:1969
+msgid "Do you really want to delete the selected keys? (y/N) "
+msgstr "妳真的想要刪除被選擇的金鑰嗎? (y/N) "
+
+#: g10/keyedit.c:1970
+msgid "Do you really want to delete this key? (y/N) "
+msgstr "妳真的要刪除這把金鑰嗎? (y/N) "
+
+#: g10/keyedit.c:2005
+msgid "Really revoke all selected user IDs? (y/N) "
+msgstr "真的要撤銷所有被選擇的使用者 ID 嗎? (y/N) "
+
+#: g10/keyedit.c:2006
+msgid "Really revoke this user ID? (y/N) "
+msgstr "真的要撤銷這個使用者 ID 嗎? (y/N) "
+
+#: g10/keyedit.c:2024
+msgid "Do you really want to revoke the entire key? (y/N) "
+msgstr "妳真的想要撤銷這整把金鑰嗎? (y/N) "
+
+#: g10/keyedit.c:2035
+msgid "Do you really want to revoke the selected subkeys? (y/N) "
+msgstr "妳真的想要撤銷這些被選擇的次鑰嗎? (y/N) "
+
+#: g10/keyedit.c:2037
+msgid "Do you really want to revoke this subkey? (y/N) "
+msgstr "妳真的想要撤銷這把次鑰嗎? (y/N) "
+
+#: g10/keyedit.c:2087
+msgid ""
+"Owner trust may not be set while using an user provided trust database\n"
+msgstr "使用使用者所提供的信任資料庫時可能無法設定主觀信任\n"
+
+#: g10/keyedit.c:2129
+msgid "Set preference list to:\n"
+msgstr "設定偏好清單至:\n"
+
+#: g10/keyedit.c:2135
+msgid "Really update the preferences for the selected user IDs? (y/N) "
+msgstr "真的要更新所選使用者 ID 的偏好嗎? (y/N) "
+
+#: g10/keyedit.c:2137
+msgid "Really update the preferences? (y/N) "
+msgstr "真的要更新偏好嗎? (y/N) "
+
+#: g10/keyedit.c:2205
+msgid "Save changes? (y/N) "
+msgstr "要儲存變更嗎? (y/N) "
+
+#: g10/keyedit.c:2208
+msgid "Quit without saving? (y/N) "
+msgstr "要不儲存就離開嗎? (y/N) "
+
+#: g10/keyedit.c:2218
+#, c-format
+msgid "update failed: %s\n"
+msgstr "更新失敗: %s\n"
+
+#: g10/keyedit.c:2225
+#, c-format
+msgid "update secret failed: %s\n"
+msgstr "更新私鑰失敗: %s\n"
+
+#: g10/keyedit.c:2232
+msgid "Key not changed so no update needed.\n"
+msgstr "金鑰沒有變更所以不需要更新.\n"
+
+#: g10/keyedit.c:2333
+msgid "Digest: "
+msgstr "摘要: "
+
+#: g10/keyedit.c:2385
+msgid "Features: "
+msgstr "特點: "
+
+#: g10/keyedit.c:2396
+msgid "Keyserver no-modify"
+msgstr "金鑰伺服器無修改"
+
+#: g10/keyedit.c:2411 g10/keylist.c:308
+msgid "Preferred keyserver: "
+msgstr "偏好的金鑰伺服器: "
+
+#: g10/keyedit.c:2419 g10/keyedit.c:2420
+#, fuzzy
+msgid "Notations: "
+msgstr ""
+"@\n"
+"選項:\n"
+" "
+
+#: g10/keyedit.c:2630
+msgid "There are no preferences on a PGP 2.x-style user ID.\n"
+msgstr "PGP 2.x 型態的使用者 ID 沒有偏好.\n"
+
+#: g10/keyedit.c:2689
+#, c-format
+msgid "This key was revoked on %s by %s key %s\n"
+msgstr "這把金鑰已經在 %s 時被 %s 金鑰 %s 給撤銷了\n"
+
+#: g10/keyedit.c:2710
+#, c-format
+msgid "This key may be revoked by %s key %s"
+msgstr "這把金鑰可能被 %s 金鑰 %s 撤銷了 "
+
+#: g10/keyedit.c:2716
+msgid "(sensitive)"
+msgstr "(機密的)"
+
+#: g10/keyedit.c:2732 g10/keyedit.c:2788 g10/keyedit.c:2849 g10/keyedit.c:2864
+#: g10/keylist.c:194 g10/keyserver.c:511
+#, c-format
+msgid "created: %s"
+msgstr "建立於: %s"
+
+#: g10/keyedit.c:2735 g10/keylist.c:771 g10/keylist.c:865 g10/mainproc.c:964
+#, c-format
+msgid "revoked: %s"
+msgstr "已撤銷: %s"
+
+#  of subkey
+#: g10/keyedit.c:2737 g10/keylist.c:742 g10/keylist.c:777 g10/keylist.c:871
+#, c-format
+msgid "expired: %s"
+msgstr "已過期: %s"
+
+#  of subkey
+#: g10/keyedit.c:2739 g10/keyedit.c:2790 g10/keyedit.c:2851 g10/keyedit.c:2866
+#: g10/keylist.c:196 g10/keylist.c:748 g10/keylist.c:783 g10/keylist.c:877
+#: g10/keylist.c:898 g10/keyserver.c:517 g10/mainproc.c:970
+#, c-format
+msgid "expires: %s"
+msgstr "過期: %s"
+
+#: g10/keyedit.c:2741
+#, c-format
+msgid "usage: %s"
+msgstr "用法: %s"
+
+#: g10/keyedit.c:2756
+#, c-format
+msgid "trust: %s"
+msgstr "信任: %s"
+
+#: g10/keyedit.c:2760
+#, c-format
+msgid "validity: %s"
+msgstr "有效性: %s"
+
+#: g10/keyedit.c:2767
+msgid "This key has been disabled"
+msgstr "這把金鑰已經被禁用了"
+
+#: g10/keyedit.c:2795 g10/keylist.c:200
+msgid "card-no: "
+msgstr "卡片編號: "
+
+#: g10/keyedit.c:2819
+msgid ""
+"Please note that the shown key validity is not necessarily correct\n"
+"unless you restart the program.\n"
+msgstr ""
+"請注意顯示出來的金鑰有效性不需要更正,\n"
+"除非妳重新執行程式.\n"
+
+#: g10/keyedit.c:2883 g10/keyedit.c:3229 g10/keyserver.c:521
+#: g10/mainproc.c:1772 g10/trustdb.c:1179 g10/trustdb.c:1699
+msgid "revoked"
+msgstr "已撤銷"
+
+#: g10/keyedit.c:2885 g10/keyedit.c:3231 g10/keyserver.c:525
+#: g10/mainproc.c:1774 g10/trustdb.c:532 g10/trustdb.c:1701
+msgid "expired"
+msgstr "已過期"
+
+#: g10/keyedit.c:2950
+msgid ""
+"WARNING: no user ID has been marked as primary.  This command may\n"
+"              cause a different user ID to become the assumed primary.\n"
+msgstr ""
+"警告: 沒有任何使用者 ID 已被標示為主要 ID. 這項指令可能\n"
+"      會導致不同的使用者 ID 被當成主要 ID.\n"
+
+#: g10/keyedit.c:3011
+msgid ""
+"WARNING: This is a PGP2-style key.  Adding a photo ID may cause some "
+"versions\n"
+"         of PGP to reject this key.\n"
+msgstr ""
+"警告: 這是一把 PGP2 型態的金鑰.\n"
+"      增加照片 ID 可能會導致某些版本的 PGP 駁回這把金鑰.\n"
+
+#: g10/keyedit.c:3016 g10/keyedit.c:3351
+msgid "Are you sure you still want to add it? (y/N) "
+msgstr "妳確定仍然想要增加嗎? (y/N) "
+
+#: g10/keyedit.c:3022
+msgid "You may not add a photo ID to a PGP2-style key.\n"
+msgstr "妳不可以把照片 ID 增加到 PGP2 型態的金鑰裡.\n"
+
+#: g10/keyedit.c:3162
+msgid "Delete this good signature? (y/N/q)"
+msgstr "刪除這個完好的簽章嗎? (y/N/q)"
+
+#: g10/keyedit.c:3172
+msgid "Delete this invalid signature? (y/N/q)"
+msgstr "刪除這個無效的簽章嗎? (y/N/q)"
+
+#: g10/keyedit.c:3176
+msgid "Delete this unknown signature? (y/N/q)"
+msgstr "刪除這個未知的簽章嗎? (y/N/q)"
+
+#: g10/keyedit.c:3182
+msgid "Really delete this self-signature? (y/N)"
+msgstr "真的要刪除這個自我簽章嗎? (y/N)"
+
+#: g10/keyedit.c:3196
+#, c-format
+msgid "Deleted %d signature.\n"
+msgstr "已經刪除了 %d 個簽章.\n"
+
+#: g10/keyedit.c:3197
+#, c-format
+msgid "Deleted %d signatures.\n"
+msgstr "已經刪除了 %d 個簽章.\n"
+
+#: g10/keyedit.c:3200
+msgid "Nothing deleted.\n"
+msgstr "沒有東西被刪除.\n"
+
+#: g10/keyedit.c:3233 g10/trustdb.c:1703
+msgid "invalid"
+msgstr "無效"
+
+#: g10/keyedit.c:3235
+#, fuzzy, c-format
+msgid "User ID \"%s\" compacted: %s\n"
+msgstr "使用者 ID \"%s\": 已經是乾淨的了.\n"
+
+#: g10/keyedit.c:3242
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signature removed\n"
+msgstr "金鑰 %s: \"%s\" 已清除掉 %d 份簽章\n"
+
+#: g10/keyedit.c:3243
+#, fuzzy, c-format
+msgid "User ID \"%s\": %d signatures removed\n"
+msgstr "金鑰 %s: \"%s\" 已清除掉 %d 份簽章\n"
+
+#: g10/keyedit.c:3251
+#, fuzzy, c-format
+msgid "User ID \"%s\": already minimized\n"
+msgstr "使用者 ID \"%s\": 已經是乾淨的了.\n"
+
+#: g10/keyedit.c:3252
+#, fuzzy, c-format
+msgid "User ID \"%s\": already clean\n"
+msgstr "使用者 ID \"%s\": 已經是乾淨的了.\n"
+
+#: g10/keyedit.c:3346
+msgid ""
+"WARNING: This is a PGP 2.x-style key.  Adding a designated revoker may "
+"cause\n"
+"         some versions of PGP to reject this key.\n"
+msgstr ""
+"警告: 這是一把 PGP2 型態的金鑰.\n"
+"      增加指定撤銷者可能會導致某些版本的 PGP 駁回這把金鑰.\n"
+
+#: g10/keyedit.c:3357
+msgid "You may not add a designated revoker to a PGP 2.x-style key.\n"
+msgstr "妳不可以把指定撤銷者增加到 PGP2 型態的金鑰裡.\n"
+
+#: g10/keyedit.c:3377
+msgid "Enter the user ID of the designated revoker: "
+msgstr "輸入指定撤銷者的使用者 ID: "
+
+#: g10/keyedit.c:3402
+msgid "cannot appoint a PGP 2.x style key as a designated revoker\n"
+msgstr "無法將 PGP 2.x 型態的金鑰指派為指定撤銷者\n"
+
+#  This actually causes no harm (after all, a key that
+#  designates itself as a revoker is the same as a
+#  regular key), but it's easy enough to check.
+#: g10/keyedit.c:3417
+msgid "you cannot appoint a key as its own designated revoker\n"
+msgstr "妳不能指派某把金鑰為它自己的指定撤銷者\n"
+
+#: g10/keyedit.c:3439
+msgid "this key has already been designated as a revoker\n"
+msgstr "這把金鑰已被指定為撤銷者了\n"
+
+#: g10/keyedit.c:3458
+msgid "WARNING: appointing a key as a designated revoker cannot be undone!\n"
+msgstr "警告: 一旦把某把金鑰指派為指定撤銷者後, 就無法反悔了!\n"
+
+#: g10/keyedit.c:3464
+msgid ""
+"Are you sure you want to appoint this key as a designated revoker? (y/N) "
+msgstr "妳確定要指派這把金鑰為指定撤銷者嗎? (y/N) "
+
+#: g10/keyedit.c:3525
+msgid "Please remove selections from the secret keys.\n"
+msgstr "請從私鑰中移除選擇.\n"
+
+#: g10/keyedit.c:3531
+msgid "Please select at most one subkey.\n"
+msgstr "請至多選擇一把次鑰.\n"
+
+#: g10/keyedit.c:3535
+msgid "Changing expiration time for a subkey.\n"
+msgstr "正在變更某把次鑰的使用期限.\n"
+
+#: g10/keyedit.c:3538
+msgid "Changing expiration time for the primary key.\n"
+msgstr "正在變更主鑰的使用期限.\n"
+
+#: g10/keyedit.c:3584
+msgid "You can't change the expiration date of a v3 key\n"
+msgstr "妳不能變更 v3 金鑰的使用期限\n"
+
+#: g10/keyedit.c:3600
+msgid "No corresponding signature in secret ring\n"
+msgstr "在私鑰圈裡沒有一致的簽章\n"
+
+#: g10/keyedit.c:3673
+#, fuzzy, c-format
+msgid "signing subkey %s is already cross-certified\n"
+msgstr "警告: 正要簽署的子鑰 %s 未經交叉認證\n"
+
+#: g10/keyedit.c:3679
+#, c-format
+msgid "subkey %s does not sign and so does not need to be cross-certified\n"
+msgstr ""
+
+#: g10/keyedit.c:3841
+msgid "Please select exactly one user ID.\n"
+msgstr "請精確地選擇一個使用者 ID.\n"
+
+#: g10/keyedit.c:3880 g10/keyedit.c:3990 g10/keyedit.c:4110 g10/keyedit.c:4251
+#, c-format
+msgid "skipping v3 self-signature on user ID \"%s\"\n"
+msgstr "正在跳過使用者 ID \"%s\" 的 v3 自我簽章\n"
+
+#: g10/keyedit.c:4051
+msgid "Enter your preferred keyserver URL: "
+msgstr "請輸入妳的偏好金鑰伺服器 URL: "
+
+#: g10/keyedit.c:4131
+msgid "Are you sure you want to replace it? (y/N) "
+msgstr "妳確定要取代它嗎? (y/N) "
+
+#: g10/keyedit.c:4132
+msgid "Are you sure you want to delete it? (y/N) "
+msgstr "妳確定要刪除它嗎? (y/N) "
+
+#: g10/keyedit.c:4194
+#, fuzzy
+msgid "Enter the notation: "
+msgstr "簽章標記: "
+
+#: g10/keyedit.c:4343
+#, fuzzy
+msgid "Proceed? (y/N) "
+msgstr "是否覆寫? (y/N) "
+
+#: g10/keyedit.c:4407
+#, c-format
+msgid "No user ID with index %d\n"
+msgstr "索引 %d 沒有對應到使用者 ID\n"
+
+#: g10/keyedit.c:4465
+#, c-format
+msgid "No user ID with hash %s\n"
+msgstr "雜湊 %s 沒有對應到使用者 ID\n"
+
+#: g10/keyedit.c:4492
+#, c-format
+msgid "No subkey with index %d\n"
+msgstr "索引 %d 沒有對應到次鑰\n"
+
+#: g10/keyedit.c:4627
+#, c-format
+msgid "user ID: \"%s\"\n"
+msgstr "使用者 ID: \"%s\"\n"
+
+#: g10/keyedit.c:4630 g10/keyedit.c:4694 g10/keyedit.c:4737
+#, c-format
+msgid "signed by your key %s on %s%s%s\n"
+msgstr "已被妳的金鑰 %s 於 %s%s%s 簽署了\n"
+
+#: g10/keyedit.c:4632 g10/keyedit.c:4696 g10/keyedit.c:4739
+msgid " (non-exportable)"
+msgstr " (不可匯出)"
+
+#: g10/keyedit.c:4636
+#, c-format
+msgid "This signature expired on %s.\n"
+msgstr "這份簽署已經在 %s 過期了.\n"
+
+#: g10/keyedit.c:4640
+msgid "Are you sure you still want to revoke it? (y/N) "
+msgstr "妳確定妳仍然想要撤銷它嗎? (y/N) "
+
+#: g10/keyedit.c:4644
+msgid "Create a revocation certificate for this signature? (y/N) "
+msgstr "要為這份簽章建立一份撤銷憑證嗎? (y/N) "
+
+#: g10/keyedit.c:4671
+#, c-format
+msgid "You have signed these user IDs on key %s:\n"
+msgstr "妳已經簽署了金鑰 %s 上的這些使用者 ID:\n"
+
+#: g10/keyedit.c:4697
+msgid " (non-revocable)"
+msgstr " (不可撤銷)"
+
+#: g10/keyedit.c:4704
+#, c-format
+msgid "revoked by your key %s on %s\n"
+msgstr "被妳的金鑰 %s 於 %s 所撤銷了\n"
+
+#: g10/keyedit.c:4726
+msgid "You are about to revoke these signatures:\n"
+msgstr "妳正在撤銷這些簽章:\n"
+
+#: g10/keyedit.c:4746
+msgid "Really create the revocation certificates? (y/N) "
+msgstr "真的要建立撤銷憑證嗎? (y/N) "
+
+#: g10/keyedit.c:4776
+msgid "no secret key\n"
+msgstr "沒有私鑰\n"
+
+#: g10/keyedit.c:4846
+#, c-format
+msgid "user ID \"%s\" is already revoked\n"
+msgstr "使用者 ID \"%s\" 已經被撤銷了\n"
+
+#: g10/keyedit.c:4863
+#, c-format
+msgid "WARNING: a user ID signature is dated %d seconds in the future\n"
+msgstr "警告: 有一份使用者 ID 簽章的日期標記為 %d 秒後的未來\n"
+
+#: g10/keyedit.c:4927
+#, c-format
+msgid "Key %s is already revoked.\n"
+msgstr "金鑰 %s 已經被撤銷了.\n"
+
+#: g10/keyedit.c:4989
+#, c-format
+msgid "Subkey %s is already revoked.\n"
+msgstr "次鑰 %s 已經被撤銷了.\n"
+
+#: g10/keyedit.c:5084
+#, c-format
+msgid "Displaying %s photo ID of size %ld for key %s (uid %d)\n"
+msgstr "正在顯示 %s 照片 ID, 其尺寸為 %ld, 屬於金鑰 %s (uid %d) 的照片\n"
+
+#: g10/keygen.c:262
+#, c-format
+msgid "preference `%s' duplicated\n"
+msgstr "偏好設定 `%s' 重複了\n"
+
+#: g10/keygen.c:269
+msgid "too many cipher preferences\n"
+msgstr "編密偏好過多\n"
+
+#: g10/keygen.c:271
+msgid "too many digest preferences\n"
+msgstr "摘要偏好過多\n"
+
+#: g10/keygen.c:273
+msgid "too many compression preferences\n"
+msgstr "壓縮偏好過多\n"
+
+#: g10/keygen.c:398
+#, c-format
+msgid "invalid item `%s' in preference string\n"
+msgstr "偏好字串中含有無效的 `%s' 項目\n"
+
+#: g10/keygen.c:872
+msgid "writing direct signature\n"
+msgstr "正在寫入直接簽章\n"
+
+#: g10/keygen.c:911
+msgid "writing self signature\n"
+msgstr "正在寫入自我簽章\n"
+
+#: g10/keygen.c:961
+msgid "writing key binding signature\n"
+msgstr "正在寫入附鑰簽章\n"
+
+#: g10/keygen.c:1022 g10/keygen.c:1104 g10/keygen.c:1109 g10/keygen.c:1225
+#: g10/keygen.c:2762
+#, c-format
+msgid "keysize invalid; using %u bits\n"
+msgstr "金鑰尺寸無效; 改用 %u 位元\n"
+
+#: g10/keygen.c:1027 g10/keygen.c:1115 g10/keygen.c:1230 g10/keygen.c:2768
+#, c-format
+msgid "keysize rounded up to %u bits\n"
+msgstr "金鑰尺寸增大到 %u 位元\n"
+
+#: g10/keygen.c:1323
+msgid "Sign"
+msgstr "簽署"
+
+#: g10/keygen.c:1326
+msgid "Certify"
+msgstr ""
+
+#: g10/keygen.c:1329
+msgid "Encrypt"
+msgstr "加密"
+
+#: g10/keygen.c:1332
+msgid "Authenticate"
+msgstr "鑑定"
+
+#: g10/keygen.c:1340
+msgid "SsEeAaQq"
+msgstr "SsEeAaQq"
+
+#: g10/keygen.c:1359
+#, c-format
+msgid "Possible actions for a %s key: "
+msgstr "%s 金鑰可能的動作: "
+
+#: g10/keygen.c:1363
+msgid "Current allowed actions: "
+msgstr "目前可進行的動作: "
+
+#: g10/keygen.c:1368
+#, c-format
+msgid "   (%c) Toggle the sign capability\n"
+msgstr "   (%c) 切換簽署性能\n"
+
+#: g10/keygen.c:1371
+#, c-format
+msgid "   (%c) Toggle the encrypt capability\n"
+msgstr "   (%c) 切換加密性能\n"
+
+#: g10/keygen.c:1374
+#, c-format
+msgid "   (%c) Toggle the authenticate capability\n"
+msgstr "   (%c) 切換鑑定性能\n"
+
+#: g10/keygen.c:1377
+#, c-format
+msgid "   (%c) Finished\n"
+msgstr "   (%c) 已完成\n"
+
+#: g10/keygen.c:1433
+msgid "Please select what kind of key you want:\n"
+msgstr "請選擇妳要使用的金鑰種類:\n"
+
+#: g10/keygen.c:1435
+#, c-format
+msgid "   (%d) DSA and Elgamal (default)\n"
+msgstr "   (%d) DSA 和 Elgamal (預設)\n"
+
+#: g10/keygen.c:1436
+#, c-format
+msgid "   (%d) DSA (sign only)\n"
+msgstr "   (%d) DSA (僅能簽署用)\n"
+
+#: g10/keygen.c:1438
+#, c-format
+msgid "   (%d) DSA (set your own capabilities)\n"
+msgstr "   (%d) DSA (妳自己設定性能)\n"
+
+#: g10/keygen.c:1440
+#, c-format
+msgid "   (%d) Elgamal (encrypt only)\n"
+msgstr "   (%d) Elgamal (僅能加密用)\n"
+
+#: g10/keygen.c:1441
+#, c-format
+msgid "   (%d) RSA (sign only)\n"
+msgstr "   (%d) RSA (僅能簽署用)\n"
+
+#: g10/keygen.c:1443
+#, c-format
+msgid "   (%d) RSA (encrypt only)\n"
+msgstr "   (%d) RSA (僅能加密用)\n"
+
+#: g10/keygen.c:1445
+#, c-format
+msgid "   (%d) RSA (set your own capabilities)\n"
+msgstr "   (%d) RSA (妳自己設定性能)\n"
+
+#: g10/keygen.c:1514
+#, c-format
+msgid "DSA keypair will have %u bits.\n"
+msgstr "DSA 金鑰對會有 %u 位元長.\n"
+
+#: g10/keygen.c:1524
+#, c-format
+msgid "%s keys may be between %u and %u bits long.\n"
+msgstr "%s 金鑰的長度可能介於 %u 位元和 %u 位元之間.\n"
+
+#: g10/keygen.c:1531
+#, c-format
+msgid "What keysize do you want? (%u) "
+msgstr "妳想要用多大的金鑰尺寸? (%u) "
+
+#: g10/keygen.c:1545
+#, c-format
+msgid "%s keysizes must be in the range %u-%u\n"
+msgstr "%s 金鑰尺寸一定要介於 %u 到 %u 之間\n"
+
+#: g10/keygen.c:1551
+#, c-format
+msgid "Requested keysize is %u bits\n"
+msgstr "妳所要求的金鑰尺寸是 %u 位元\n"
+
+#: g10/keygen.c:1556 g10/keygen.c:1561
+#, c-format
+msgid "rounded up to %u bits\n"
+msgstr "加大到 %u 位元\n"
+
+#: g10/keygen.c:1610
+msgid ""
+"Please specify how long the key should be valid.\n"
+"         0 = key does not expire\n"
+"      <n>  = key expires in n days\n"
+"      <n>w = key expires in n weeks\n"
+"      <n>m = key expires in n months\n"
+"      <n>y = key expires in n years\n"
+msgstr ""
+"請指定這把金鑰的有效期限是多久.\n"
+"         0 = 金鑰不會過期\n"
+"      <n>  = 金鑰在 n 天後會過期\n"
+"      <n>w = 金鑰在 n 週後會過期\n"
+"      <n>m = 金鑰在 n 月後會過期\n"
+"      <n>y = 金鑰在 n 年後會過期\n"
+
+#: g10/keygen.c:1621
+msgid ""
+"Please specify how long the signature should be valid.\n"
+"         0 = signature does not expire\n"
+"      <n>  = signature expires in n days\n"
+"      <n>w = signature expires in n weeks\n"
+"      <n>m = signature expires in n months\n"
+"      <n>y = signature expires in n years\n"
+msgstr ""
+"請指定這份簽章的有效期限是多久.\n"
+"         0 = 簽章不會過期\n"
+"      <n>  = 簽章在 n 天後會過期\n"
+"      <n>w = 簽章在 n 週後會過期\n"
+"      <n>m = 簽章在 n 月後會過期\n"
+"      <n>y = 簽章在 n 年後會過期\n"
+
+#: g10/keygen.c:1644
+msgid "Key is valid for? (0) "
+msgstr "金鑰的有效期限是多久? (0) "
+
+#: g10/keygen.c:1649
+#, c-format
+msgid "Signature is valid for? (%s) "
+msgstr "簽章的有效期限是多久? (%s) "
+
+#: g10/keygen.c:1667
+msgid "invalid value\n"
+msgstr "無效的數值\n"
+
+#: g10/keygen.c:1674
+msgid "Key does not expire at all\n"
+msgstr "金鑰完全不會過期\n"
+
+#: g10/keygen.c:1675
+msgid "Signature does not expire at all\n"
+msgstr "簽章完全不會過期\n"
+
+#: g10/keygen.c:1680
+#, c-format
+msgid "Key expires at %s\n"
+msgstr "金鑰將會在 %s 過期\n"
+
+#: g10/keygen.c:1681
+#, c-format
+msgid "Signature expires at %s\n"
+msgstr "簽章將會在 %s 過期.\n"
+
+#: g10/keygen.c:1687
+msgid ""
+"Your system can't display dates beyond 2038.\n"
+"However, it will be correctly handled up to 2106.\n"
+msgstr ""
+"妳的系統無法顯示 2038 年以後的日期.\n"
+"不過, 它可以正確處理直到 2106 年之前的年份.\n"
+
+#: g10/keygen.c:1692
+msgid "Is this correct? (y/N) "
+msgstr "以上正確嗎? (y/N) "
+
+#: g10/keygen.c:1715
+msgid ""
+"\n"
+"You need a user ID to identify your key; the software constructs the user "
+"ID\n"
+"from the Real Name, Comment and Email Address in this form:\n"
+"    \"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>\"\n"
+"\n"
+msgstr ""
+"\n"
+"妳需要一個使用者 ID 來辨識妳的金鑰; 這個軟體會用真實姓名,\n"
+"註釋和電子郵件地址組合成使用者 ID 如下:\n"
+"    \"Ke-Huan Lin (Jedi) <Jedi@Jedi.org>\"\n"
+"\n"
+
+#: g10/keygen.c:1728
+msgid "Real name: "
+msgstr "真實姓名: "
+
+#: g10/keygen.c:1736
+msgid "Invalid character in name\n"
+msgstr "姓名含有無效的字符\n"
+
+#: g10/keygen.c:1738
+msgid "Name may not start with a digit\n"
+msgstr "姓名不可以用數字開頭\n"
+
+#: g10/keygen.c:1740
+msgid "Name must be at least 5 characters long\n"
+msgstr "姓名至少要有五個字符長\n"
+
+#: g10/keygen.c:1748
+msgid "Email address: "
+msgstr "電子郵件地址: "
+
+#: g10/keygen.c:1754
+msgid "Not a valid email address\n"
+msgstr "不是有效的電子郵件地址\n"
+
+#: g10/keygen.c:1762
+msgid "Comment: "
+msgstr "註釋: "
+
+#: g10/keygen.c:1768
+msgid "Invalid character in comment\n"
+msgstr "註釋含有無效的字符\n"
+
+#: g10/keygen.c:1791
+#, c-format
+msgid "You are using the `%s' character set.\n"
+msgstr "妳正在使用 `%s' 字元集.\n"
+
+#: g10/keygen.c:1797
+#, c-format
+msgid ""
+"You selected this USER-ID:\n"
+"    \"%s\"\n"
+"\n"
+msgstr ""
+"妳選擇了這個使用者 ID:\n"
+"    \"%s\"\n"
+"\n"
+
+#: g10/keygen.c:1802
+msgid "Please don't put the email address into the real name or the comment\n"
+msgstr "請不要把電子郵件地址放進妳的真實姓名或註釋裡\n"
+
+#. TRANSLATORS: These are the allowed answers in
+#. lower and uppercase.  Below you will find the matching
+#. string which should be translated accordingly and the
+#. letter changed to match the one in the answer string.
+#.
+#. n = Change name
+#. c = Change comment
+#. e = Change email
+#. o = Okay (ready, continue)
+#. q = Quit
+#.
+#: g10/keygen.c:1818
+msgid "NnCcEeOoQq"
+msgstr "NnCcEeOoQq"
+
+#: g10/keygen.c:1828
+msgid "Change (N)ame, (C)omment, (E)mail or (Q)uit? "
+msgstr "變更姓名(N), 註釋(C), 電子郵件地址(E)或退出(Q)? "
+
+#: g10/keygen.c:1829
+msgid "Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? "
+msgstr "變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? "
+
+#: g10/keygen.c:1848
+msgid "Please correct the error first\n"
+msgstr "請先訂正錯誤\n"
+
+#: g10/keygen.c:1888
+msgid ""
+"You need a Passphrase to protect your secret key.\n"
+"\n"
+msgstr ""
+"妳需要一個密語來保護妳的私鑰.\n"
+"\n"
+
+#: g10/keygen.c:1898 g10/passphrase.c:810
+#, c-format
+msgid "%s.\n"
+msgstr "%s.\n"
+
+#: g10/keygen.c:1904
+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"
+
+#: g10/keygen.c:1926
+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"
+"generator a better chance to gain enough entropy.\n"
+msgstr ""
+"我們需要產生大量的隨機位元組. 這個時候妳可以多做一些事情\n"
+"(像是敲打鍵盤, 移動滑鼠, 讀寫硬碟之類的)\n"
+"這會讓隨機數字產生器有更多的機會獲得夠多的亂數.\n"
+
+#: g10/keygen.c:2708
+msgid "Key generation canceled.\n"
+msgstr "已取消金鑰產生.\n"
+
+#: g10/keygen.c:2907 g10/keygen.c:3052
+#, c-format
+msgid "writing public key to `%s'\n"
+msgstr "正在將公鑰寫至 `%s'\n"
+
+#: g10/keygen.c:2909 g10/keygen.c:3055
+#, c-format
+msgid "writing secret key stub to `%s'\n"
+msgstr "正在寫入私鑰 stub 至 `%s'\n"
+
+#: g10/keygen.c:2912 g10/keygen.c:3058
+#, c-format
+msgid "writing secret key to `%s'\n"
+msgstr "正在將私鑰寫至 `%s'\n"
+
+#: g10/keygen.c:3041
+#, c-format
+msgid "no writable public keyring found: %s\n"
+msgstr "找不到可寫的公鑰鑰匙圈: %s\n"
+
+#: g10/keygen.c:3047
+#, c-format
+msgid "no writable secret keyring found: %s\n"
+msgstr "找不到可寫的私鑰鑰匙圈: %s\n"
+
+#: g10/keygen.c:3065
+#, c-format
+msgid "error writing public keyring `%s': %s\n"
+msgstr "寫入公鑰鑰匙圈 `%s' 時發生錯誤: %s\n"
+
+#: g10/keygen.c:3072
+#, c-format
+msgid "error writing secret keyring `%s': %s\n"
+msgstr "寫入私鑰鑰匙圈 `%s' 時發生錯誤: %s\n"
+
+#: g10/keygen.c:3095
+msgid "public and secret key created and signed.\n"
+msgstr "公鑰和私鑰已經被建立及簽署了.\n"
+
+#: g10/keygen.c:3106
+msgid ""
+"Note that this key cannot be used for encryption.  You may want to use\n"
+"the command \"--edit-key\" to generate a subkey for this purpose.\n"
+msgstr ""
+"請注意這把金鑰不能用於加密之用.  也許妳會想藉由 \"--edit-key\" \n"
+"指令來產生加密用的次鑰.\n"
+
+#: g10/keygen.c:3118 g10/keygen.c:3247 g10/keygen.c:3363
+#, c-format
+msgid "Key generation failed: %s\n"
+msgstr "產生金鑰失敗: %s\n"
+
+#: g10/keygen.c:3170 g10/keygen.c:3298 g10/sign.c:276
+#, c-format
+msgid ""
+"key has been created %lu second in future (time warp or clock problem)\n"
+msgstr "金鑰已經在 %lu 秒後的未來製造出來了 (可能是因為時光旅行或時鐘的問題)\n"
+
+#: g10/keygen.c:3172 g10/keygen.c:3300 g10/sign.c:278
+#, c-format
+msgid ""
+"key has been created %lu seconds in future (time warp or clock problem)\n"
+msgstr "金鑰已經在 %lu 秒後的未來製造出來了 (可能是因為時光旅行或時鐘的問題)\n"
+
+#: g10/keygen.c:3181 g10/keygen.c:3311
+msgid "NOTE: creating subkeys for v3 keys is not OpenPGP compliant\n"
+msgstr "請注意: 對 v3 金鑰製造子鑰會失去 OpenPGP 相容性\n"
+
+#: g10/keygen.c:3220 g10/keygen.c:3344
+msgid "Really create? (y/N) "
+msgstr "真的要建立嗎? (y/N) "
+
+#: g10/keygen.c:3509
+#, c-format
+msgid "storing key onto card failed: %s\n"
+msgstr "儲存金鑰到卡片上時失敗: %s\n"
+
+#: g10/keygen.c:3556
+#, c-format
+msgid "can't create backup file `%s': %s\n"
+msgstr "無法建立備份檔案 `%s': %s\n"
+
+#: g10/keygen.c:3582
+#, c-format
+msgid "NOTE: backup of card key saved to `%s'\n"
+msgstr "請注意: 卡片金鑰的備份已儲存至 `%s'\n"
+
+#: g10/keyid.c:498 g10/keyid.c:510 g10/keyid.c:522 g10/keyid.c:534
+msgid "never     "
+msgstr "永遠不過期"
+
+#: g10/keylist.c:265
+msgid "Critical signature policy: "
+msgstr "關鍵簽章原則: "
+
+#: g10/keylist.c:267
+msgid "Signature policy: "
+msgstr "簽章原則: "
+
+#: g10/keylist.c:306
+msgid "Critical preferred keyserver: "
+msgstr "執意偏好的金鑰伺服器: "
+
+#: g10/keylist.c:359
+msgid "Critical signature notation: "
+msgstr "關鍵簽章標記: "
+
+#: g10/keylist.c:361
+msgid "Signature notation: "
+msgstr "簽章標記: "
+
+#: g10/keylist.c:471
+msgid "Keyring"
+msgstr "鑰匙圈"
+
+#: g10/keylist.c:1505
+msgid "Primary key fingerprint:"
+msgstr "               主鑰指紋:"
+
+#: g10/keylist.c:1507
+msgid "     Subkey fingerprint:"
+msgstr "               子鑰指紋:"
+
+#. TRANSLATORS: this should fit into 24 bytes to that the
+#. * fingerprint data is properly aligned with the user ID
+#: g10/keylist.c:1514
+msgid " Primary key fingerprint:"
+msgstr "                主鑰指紋:"
+
+#: g10/keylist.c:1516
+msgid "      Subkey fingerprint:"
+msgstr "                子鑰指紋:"
+
+#  use tty
+#: g10/keylist.c:1520 g10/keylist.c:1524
+msgid "      Key fingerprint ="
+msgstr "      金鑰指紋 ="
+
+#: g10/keylist.c:1591
+msgid "      Card serial no. ="
+msgstr "      卡片序號 ="
+
+#: g10/keyring.c:1246
+#, c-format
+msgid "renaming `%s' to `%s' failed: %s\n"
+msgstr "把 `%s' 重新新命成 `%s' 時失敗: %s\n"
+
+#: g10/keyring.c:1252
+msgid "WARNING: 2 files with confidential information exists.\n"
+msgstr "警告: 2 個檔案存在有互相矛盾的資訊.\n"
+
+#: g10/keyring.c:1254
+#, c-format
+msgid "%s is the unchanged one\n"
+msgstr "%s 是沒有改變的那一個\n"
+
+#: g10/keyring.c:1255
+#, c-format
+msgid "%s is the new one\n"
+msgstr "%s 是新的那一個\n"
+
+#: g10/keyring.c:1256
+msgid "Please fix this possible security flaw\n"
+msgstr "請修補這個可能的安全性裂縫\n"
+
+#: g10/keyring.c:1376
+#, c-format
+msgid "caching keyring `%s'\n"
+msgstr "正在快取鑰匙圈 `%s'\n"
+
+#: g10/keyring.c:1422
+#, c-format
+msgid "%lu keys cached so far (%lu signatures)\n"
+msgstr "目前檢查了 %lu 份金鑰 (共 %lu 份簽章)\n"
+
+#: g10/keyring.c:1434
+#, c-format
+msgid "%lu keys cached (%lu signatures)\n"
+msgstr "檢查了 %lu 份金鑰 (共 %lu 份簽章)\n"
+
+#: g10/keyring.c:1505
+#, c-format
+msgid "%s: keyring created\n"
+msgstr "%s: 鑰匙圈已建立\n"
+
+#: g10/keyserver.c:61
+msgid "include revoked keys in search results"
+msgstr ""
+
+#: g10/keyserver.c:62
+msgid "include subkeys when searching by key ID"
+msgstr ""
+
+#: g10/keyserver.c:64
+msgid "use temporary files to pass data to keyserver helpers"
+msgstr ""
+
+#: g10/keyserver.c:66
+msgid "do not delete temporary files after using them"
+msgstr ""
+
+#: g10/keyserver.c:70
+msgid "automatically retrieve keys when verifying signatures"
+msgstr ""
+
+#: g10/keyserver.c:72
+#, fuzzy
+msgid "honor the preferred keyserver URL set on the key"
+msgstr "請輸入妳的偏好金鑰伺服器 URL: "
+
+#: g10/keyserver.c:74
+msgid "honor the PKA record set on a key when retrieving keys"
+msgstr ""
+
+#: g10/keyserver.c:140
+#, c-format
+msgid "WARNING: keyserver option `%s' is not used on this platform\n"
+msgstr "警告: 金鑰伺服器選項 `%s' 並未用於此平台\n"
+
+#: g10/keyserver.c:523
+msgid "disabled"
+msgstr "已禁用"
+
+#: g10/keyserver.c:724
+msgid "Enter number(s), N)ext, or Q)uit > "
+msgstr "請輸入數字, N)ext, 或 Q)uit > "
+
+#: g10/keyserver.c:808 g10/keyserver.c:1426
+#, c-format
+msgid "invalid keyserver protocol (us %d!=handler %d)\n"
+msgstr "無效的金鑰伺服器協定 (我們用 %d != 經手程式 %d)\n"
+
+#: g10/keyserver.c:906
+#, c-format
+msgid "key \"%s\" not found on keyserver\n"
+msgstr "在金鑰伺服器上找不到金鑰 \"%s\"\n"
+
+#: g10/keyserver.c:908
+msgid "key not found on keyserver\n"
+msgstr "在金鑰伺服器上找不到金鑰\n"
+
+#: g10/keyserver.c:1145
+#, c-format
+msgid "requesting key %s from %s server %s\n"
+msgstr "正在請求金鑰 %s 自 %s 伺服器 %s\n"
+
+#: g10/keyserver.c:1149
+#, c-format
+msgid "requesting key %s from %s\n"
+msgstr "正在請求金鑰 %s 自 %s\n"
+
+#: g10/keyserver.c:1173
+#, fuzzy, c-format
+msgid "searching for names from %s server %s\n"
+msgstr "正在搜尋 \"%s\" 於 %s 伺服器 %s\n"
+
+#: g10/keyserver.c:1176
+#, fuzzy, c-format
+msgid "searching for names from %s\n"
+msgstr "正在搜尋 \"%s\" 於 %s\n"
+
+#: g10/keyserver.c:1329
+#, c-format
+msgid "sending key %s to %s server %s\n"
+msgstr "遞送金鑰 %s 至 %s 伺服器 %s\n"
+
+#: g10/keyserver.c:1333
+#, c-format
+msgid "sending key %s to %s\n"
+msgstr "遞送金鑰 %s 至 %s\n"
+
+#: g10/keyserver.c:1376
+#, c-format
+msgid "searching for \"%s\" from %s server %s\n"
+msgstr "正在搜尋 \"%s\" 於 %s 伺服器 %s\n"
+
+#: g10/keyserver.c:1379
+#, c-format
+msgid "searching for \"%s\" from %s\n"
+msgstr "正在搜尋 \"%s\" 於 %s\n"
+
+#: g10/keyserver.c:1386 g10/keyserver.c:1482
+msgid "no keyserver action!\n"
+msgstr "沒有金鑰伺服器動作!\n"
+
+#: g10/keyserver.c:1434
+#, c-format
+msgid "WARNING: keyserver handler from a different version of GnuPG (%s)\n"
+msgstr "警告: 金鑰伺服器經手程式 (handler) 係來自不同版本的 GnuPG (%s)\n"
+
+#: g10/keyserver.c:1443
+msgid "keyserver did not send VERSION\n"
+msgstr "金鑰伺服器並未送出版本 (VERSION)\n"
+
+#: g10/keyserver.c:1505 g10/keyserver.c:2033
+msgid "no keyserver known (use option --keyserver)\n"
+msgstr "沒有已知的金鑰伺服器 (使用 --keyserver 選項)\n"
+
+#: g10/keyserver.c:1511
+msgid "external keyserver calls are not supported in this build\n"
+msgstr "本版並不支援外部金鑰伺服器叫用\n"
+
+#: g10/keyserver.c:1523
+#, c-format
+msgid "no handler for keyserver scheme `%s'\n"
+msgstr "沒有金鑰伺服器方案 (scheme) `%s' 的經手程式 (handler)\n"
+
+#: g10/keyserver.c:1528
+#, c-format
+msgid "action `%s' not supported with keyserver scheme `%s'\n"
+msgstr "動作 `%s' 並未被金鑰伺服器方案 (scheme) `%s' 所支援\n"
+
+#: g10/keyserver.c:1536
+#, c-format
+msgid "%s does not support handler version %d\n"
+msgstr "%s 並不支援經手程式 (handler) 版本 %d\n"
+
+#: g10/keyserver.c:1543
+msgid "keyserver timed out\n"
+msgstr "金鑰伺服器逾時\n"
+
+#: g10/keyserver.c:1548
+msgid "keyserver internal error\n"
+msgstr "金鑰伺服器內部出錯\n"
+
+#: g10/keyserver.c:1557
+#, c-format
+msgid "keyserver communications error: %s\n"
+msgstr "金鑰伺服器通訊出錯: %s\n"
+
+#: g10/keyserver.c:1582 g10/keyserver.c:1616
+#, c-format
+msgid "\"%s\" not a key ID: skipping\n"
+msgstr "\"%s\" 並非金鑰 ID: 正跳過\n"
+
+#: g10/keyserver.c:1875
+#, c-format
+msgid "WARNING: unable to refresh key %s via %s: %s\n"
+msgstr "警告: 無法更新金鑰 %s 於 %s: %s\n"
+
+#: g10/keyserver.c:1897
+#, c-format
+msgid "refreshing 1 key from %s\n"
+msgstr "正從 %s 更新 1 份金鑰\n"
+
+#: g10/keyserver.c:1899
+#, c-format
+msgid "refreshing %d keys from %s\n"
+msgstr "正在更新 %d 份金鑰自 %s\n"
+
+#: g10/keyserver.c:1955
+#, fuzzy, c-format
+msgid "WARNING: unable to fetch URI %s: %s\n"
+msgstr "警告: 無法更新金鑰 %s 於 %s: %s\n"
+
+#: g10/keyserver.c:1961
+#, fuzzy, c-format
+msgid "WARNING: unable to parse URI %s\n"
+msgstr "警告: 無法更新金鑰 %s 於 %s: %s\n"
+
+#: g10/mainproc.c:240
+#, c-format
+msgid "weird size for an encrypted session key (%d)\n"
+msgstr "加密過的階段金鑰 (%d) 尺寸詭異\n"
+
+#: g10/mainproc.c:291
+#, c-format
+msgid "%s encrypted session key\n"
+msgstr "%s 加密過的階段金鑰\n"
+
+#: g10/mainproc.c:301
+#, c-format
+msgid "passphrase generated with unknown digest algorithm %d\n"
+msgstr "密語係以未知的摘要演算法 %d 所產生\n"
+
+#: g10/mainproc.c:382
+#, c-format
+msgid "public key is %s\n"
+msgstr "公鑰為 %s\n"
+
+#: g10/mainproc.c:439
+msgid "public key encrypted data: good DEK\n"
+msgstr "公鑰加密過的資料: 完好的 DEK\n"
+
+#: g10/mainproc.c:472
+#, c-format
+msgid "encrypted with %u-bit %s key, ID %s, created %s\n"
+msgstr "已用 %u 位元長的 %s 金鑰,  ID %s, 建立於 %s 加密了\n"
+
+#: g10/mainproc.c:476 g10/pkclist.c:219
+#, c-format
+msgid "      \"%s\"\n"
+msgstr "      \"%s\"\n"
+
+#: g10/mainproc.c:480
+#, c-format
+msgid "encrypted with %s key, ID %s\n"
+msgstr "已用 %s 金鑰, ID %s 加密了\n"
+
+#: g10/mainproc.c:494
+#, c-format
+msgid "public key decryption failed: %s\n"
+msgstr "公鑰解密失敗: %s\n"
+
+#: g10/mainproc.c:508
+#, c-format
+msgid "encrypted with %lu passphrases\n"
+msgstr "已用 %lu 個密語加密了\n"
+
+#: g10/mainproc.c:510
+msgid "encrypted with 1 passphrase\n"
+msgstr "已用 1 個密語加密了\n"
+
+#: g10/mainproc.c:541 g10/mainproc.c:563
+#, c-format
+msgid "assuming %s encrypted data\n"
+msgstr "假定 %s 為加密過的資料\n"
+
+#: g10/mainproc.c:549
+#, c-format
+msgid "IDEA cipher unavailable, optimistically attempting to use %s instead\n"
+msgstr "IDEA 編密法不可用, 我們樂觀地試著改以 %s 代替\n"
+
+#: g10/mainproc.c:581
+msgid "decryption okay\n"
+msgstr "解密成功\n"
+
+#: g10/mainproc.c:585
+msgid "WARNING: message was not integrity protected\n"
+msgstr "警告: 訊息未受到完整的保護\n"
+
+#: g10/mainproc.c:598
+msgid "WARNING: encrypted message has been manipulated!\n"
+msgstr "警告: 加密過的訊息已經被變造了!\n"
+
+#: g10/mainproc.c:604
+#, c-format
+msgid "decryption failed: %s\n"
+msgstr "解密失敗: %s\n"
+
+#: g10/mainproc.c:623
+msgid "NOTE: sender requested \"for-your-eyes-only\"\n"
+msgstr "請注意: 寄件者要求了 \"妳應該祇用眼睛看\"\n"
+
+#: g10/mainproc.c:625
+#, c-format
+msgid "original file name='%.*s'\n"
+msgstr "原始的檔名 ='%.*s'\n"
+
+#: g10/mainproc.c:817
+msgid "standalone revocation - use \"gpg --import\" to apply\n"
+msgstr "獨立撤銷 - 請用 \"gpg --import\" 來套用\n"
+
+#: g10/mainproc.c:1165
+#, fuzzy
+msgid "no signature found\n"
+msgstr "完好的簽章來自於 \"%s\""
+
+#: g10/mainproc.c:1408
+msgid "signature verification suppressed\n"
+msgstr "簽章驗證已被抑制\n"
+
+#: g10/mainproc.c:1508
+#, fuzzy
+msgid "can't handle this ambiguous signature data\n"
+msgstr "無法處理這些多重簽章\n"
+
+#: g10/mainproc.c:1519
+#, c-format
+msgid "Signature made %s\n"
+msgstr "由 %s 建立的簽章\n"
+
+#: g10/mainproc.c:1520
+#, c-format
+msgid "               using %s key %s\n"
+msgstr "               使用 %s 金鑰 %s\n"
+
+#: g10/mainproc.c:1524
+#, c-format
+msgid "Signature made %s using %s key ID %s\n"
+msgstr "由 %s 建立的簽章, 使用 %s 金鑰 ID %s\n"
+
+#: g10/mainproc.c:1544
+msgid "Key available at: "
+msgstr "可用的金鑰於: "
+
+#: g10/mainproc.c:1677 g10/mainproc.c:1725
+#, c-format
+msgid "BAD signature from \"%s\""
+msgstr "*損壞* 的簽章來自於 \"%s\""
+
+#: g10/mainproc.c:1679 g10/mainproc.c:1727
+#, c-format
+msgid "Expired signature from \"%s\""
+msgstr "過期的簽章來自於 \"%s\""
+
+#: g10/mainproc.c:1681 g10/mainproc.c:1729
+#, c-format
+msgid "Good signature from \"%s\""
+msgstr "完好的簽章來自於 \"%s\""
+
+#: g10/mainproc.c:1733
+msgid "[uncertain]"
+msgstr "[ 不確定 ]"
+
+#: g10/mainproc.c:1765
+#, c-format
+msgid "                aka \"%s\""
+msgstr "                亦即 \"%s\""
+
+#: g10/mainproc.c:1863
+#, c-format
+msgid "Signature expired %s\n"
+msgstr "這份簽署已經在 %s 過期了\n"
+
+#: g10/mainproc.c:1868
+#, c-format
+msgid "Signature expires %s\n"
+msgstr "這份簽署在 %s 過期\n"
+
+#: g10/mainproc.c:1871
+#, c-format
+msgid "%s signature, digest algorithm %s\n"
+msgstr "%s 簽章, 摘要演算法 %s\n"
+
+#: g10/mainproc.c:1872
+msgid "binary"
+msgstr "二進制"
+
+#: g10/mainproc.c:1873
+msgid "textmode"
+msgstr "文字模式"
+
+#: g10/mainproc.c:1873 g10/trustdb.c:531
+msgid "unknown"
+msgstr "未知"
+
+#: g10/mainproc.c:1893
+#, c-format
+msgid "Can't check signature: %s\n"
+msgstr "無法檢查簽章: %s\n"
+
+#: g10/mainproc.c:1962 g10/mainproc.c:1978 g10/mainproc.c:2064
+msgid "not a detached signature\n"
+msgstr "不是一份分離的簽章\n"
+
+#: g10/mainproc.c:2005
+msgid ""
+"WARNING: multiple signatures detected.  Only the first will be checked.\n"
+msgstr "警告: 偵測到多重簽章. 祇有第一個簽章纔會被核選.\n"
+
+#: g10/mainproc.c:2013
+#, c-format
+msgid "standalone signature of class 0x%02x\n"
+msgstr "等級 0x%02x 的獨立簽章\n"
+
+#: g10/mainproc.c:2070
+msgid "old style (PGP 2.x) signature\n"
+msgstr "舊型 (PGP 2.x) 簽章\n"
+
+#: g10/mainproc.c:2080
+msgid "invalid root packet detected in proc_tree()\n"
+msgstr "在 proc_tree() 中偵測到無效的 root 封包\n"
+
+#: g10/misc.c:122
+#, c-format
+msgid "can't disable core dumps: %s\n"
+msgstr "無法讓系統停止傾印核心檔: %s\n"
+
+#: g10/misc.c:142 g10/misc.c:170 g10/misc.c:242
+#, c-format
+msgid "fstat of `%s' failed in %s: %s\n"
+msgstr "`%s' 的 fstat 失敗於 %s: %s\n"
+
+#: g10/misc.c:207
+#, c-format
+msgid "fstat(%d) failed in %s: %s\n"
+msgstr "fstat(%d) 失敗於 %s: %s\n"
+
+#: g10/misc.c:316
+#, c-format
+msgid "WARNING: using experimental public key algorithm %s\n"
+msgstr "警告: 正在使用實驗性的公鑰演算法 %s\n"
+
+#: g10/misc.c:331
+#, c-format
+msgid "WARNING: using experimental cipher algorithm %s\n"
+msgstr "警告: 正在使用實驗性的編密演算法 %s\n"
+
+#: g10/misc.c:346
+#, c-format
+msgid "WARNING: using experimental digest algorithm %s\n"
+msgstr "警告: 正在使用實驗性的摘要演算法 %s\n"
+
+#: g10/misc.c:351
+#, c-format
+msgid "WARNING: digest algorithm %s is deprecated\n"
+msgstr "警告: 摘要演算法 %s 已不建議使用\n"
+
+#: g10/misc.c:447
+msgid "the IDEA cipher plugin is not present\n"
+msgstr "IDEA 編密法外掛模組不存在\n"
+
+#: g10/misc.c:448 g10/sig-check.c:103
+#, fuzzy, c-format
+msgid "please see %s for more information\n"
+msgstr "請參考 http://www.gnupg.org/faq.html 上進一步的資訊\n"
+
+#: g10/misc.c:681
+#, c-format
+msgid "%s:%d: deprecated option \"%s\"\n"
+msgstr "%s:%d: 不建議使用的選項 \"%s\"\n"
+
+#: g10/misc.c:685
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated option\n"
+msgstr "警告: \"%s\" 選項已不建議使用\n"
+
+#: g10/misc.c:687
+#, c-format
+msgid "please use \"%s%s\" instead\n"
+msgstr "請改以 \"%s%s\" 代替\n"
+
+#: g10/misc.c:694
+#, c-format
+msgid "WARNING: \"%s\" is a deprecated command - do not use it\n"
+msgstr "警告: \"%s\" 是個被反對使用的指令 - 別再用了\n"
+
+#: g10/misc.c:707
+msgid "Uncompressed"
+msgstr "未被壓縮"
+
+#: g10/misc.c:732
+msgid "uncompressed|none"
+msgstr "uncompressed|none|未被壓縮|無"
+
+#: g10/misc.c:842
+#, c-format
+msgid "this message may not be usable by %s\n"
+msgstr "這個訊息對 %s 來說無法使用\n"
+
+#: g10/misc.c:1017
+#, c-format
+msgid "ambiguous option `%s'\n"
+msgstr "不明確的選項 `%s'\n"
+
+#: g10/misc.c:1042
+#, c-format
+msgid "unknown option `%s'\n"
+msgstr "未知的選項 `%s'\n"
+
+#: g10/openfile.c:86
+#, c-format
+msgid "File `%s' exists. "
+msgstr "檔案 `%s' 存在. "
+
+#: g10/openfile.c:90
+msgid "Overwrite? (y/N) "
+msgstr "是否覆寫? (y/N) "
+
+#: g10/openfile.c:123
+#, c-format
+msgid "%s: unknown suffix\n"
+msgstr "%s: 未知的副檔名\n"
+
+#: g10/openfile.c:145
+msgid "Enter new filename"
+msgstr "請輸入新的檔名"
+
+#: g10/openfile.c:190
+msgid "writing to stdout\n"
+msgstr "正在寫入到標準輸出\n"
+
+#: g10/openfile.c:311
+#, c-format
+msgid "assuming signed data in `%s'\n"
+msgstr "假設被簽署的資料在 `%s'\n"
+
+#: g10/openfile.c:390
+#, c-format
+msgid "new configuration file `%s' created\n"
+msgstr "新的設定檔 `%s' 被建立了\n"
+
+#: g10/openfile.c:392
+#, c-format
+msgid "WARNING: options in `%s' are not yet active during this run\n"
+msgstr "警告: 在 `%s' 裡的選項於這次執行期間並沒有被啟用\n"
+
+#: g10/openfile.c:424
+#, c-format
+msgid "directory `%s' created\n"
+msgstr "目錄 `%s' 已建立\n"
+
+#: g10/parse-packet.c:138
+#, c-format
+msgid "can't handle public key algorithm %d\n"
+msgstr "無法操作公開金鑰演算法 %d\n"
+
+#: g10/parse-packet.c:708
+msgid "WARNING: potentially insecure symmetrically encrypted session key\n"
+msgstr "警告: 以可能並不安全的對稱式加密過的階段金鑰\n"
+
+#: g10/parse-packet.c:1159
+#, c-format
+msgid "subpacket of type %d has critical bit set\n"
+msgstr "%d 類別的子封包設定了關鍵位元\n"
+
+#: g10/passphrase.c:310
+msgid "gpg-agent is not available in this session\n"
+msgstr "gpg-agent 在此階段無法使用\n"
+
+#: g10/passphrase.c:326
+msgid "malformed GPG_AGENT_INFO environment variable\n"
+msgstr "被變造的 GPG_AGENT_INFO 環境變數\n"
+
+#: g10/passphrase.c:345
+#, c-format
+msgid "gpg-agent protocol version %d is not supported\n"
+msgstr "gpg-agent 協定版本 %d 未被支援\n"
+
+#: g10/passphrase.c:362
+#, c-format
+msgid "can't connect to `%s': %s\n"
+msgstr "無法連接至 `%s': %s\n"
+
+#: g10/passphrase.c:379 g10/passphrase.c:655 g10/passphrase.c:745
+msgid "problem with the agent - disabling agent use\n"
+msgstr "代理程式的問題 - 正在停用代理程式\n"
+
+#: g10/passphrase.c:532 g10/passphrase.c:914
+#, c-format
+msgid " (main key ID %s)"
+msgstr " (主要金鑰 ID %s)"
+
+#: g10/passphrase.c:546
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for user:\n"
+"\"%.*s\"\n"
+"%u-bit %s key, ID %s, created %s%s\n"
+msgstr ""
+"妳需要用密語來解開下列使用者的私鑰:\n"
+"\"%.*s\"\n"
+"%u 位元長的 %s 金鑰, ID %s, 建立於 %s%s\n"
+
+#: g10/passphrase.c:571
+msgid "Repeat passphrase\n"
+msgstr "請再輸入一次密語\n"
+
+#: g10/passphrase.c:573
+msgid "Enter passphrase\n"
+msgstr "請輸入密語\n"
+
+#: g10/passphrase.c:649
+msgid "cancelled by user\n"
+msgstr "由使用者取消了\n"
+
+#: g10/passphrase.c:805 g10/passphrase.c:974
+msgid "can't query passphrase in batch mode\n"
+msgstr "無法在批次模式中查詢密語\n"
+
+#: g10/passphrase.c:812 g10/passphrase.c:979
+msgid "Enter passphrase: "
+msgstr "請輸入密語: "
+
+#: g10/passphrase.c:895
+#, c-format
+msgid ""
+"You need a passphrase to unlock the secret key for\n"
+"user: \"%s\"\n"
+msgstr ""
+"妳需要用密語來解開下列使用者的\n"
+"私鑰: \"%s\"\n"
+
+#: g10/passphrase.c:901
+#, c-format
+msgid "%u-bit %s key, ID %s, created %s"
+msgstr "%u 位元長的 %s 金鑰, ID %s, 建立於 %s"
+
+#: g10/passphrase.c:910
+#, c-format
+msgid "         (subkey on main key ID %s)"
+msgstr "         (在主鑰 ID %s 上的子鑰)"
+
+#: g10/passphrase.c:987
+msgid "Repeat passphrase: "
+msgstr "請再輸入一次密語: "
+
+#: g10/photoid.c:73
+msgid ""
+"\n"
+"Pick an image to use for your photo ID.  The image must be a JPEG file.\n"
+"Remember that the image is stored within your public key.  If you use a\n"
+"very large picture, your key will become very large as well!\n"
+"Keeping the image close to 240x288 is a good size to use.\n"
+msgstr ""
+"\n"
+"請挑選一張圖片來當成妳的照片 ID. 這張圖片一定要是 JPEG 圖檔纔行.\n"
+"請記住這張圖片會被存放在妳的公鑰裡. 如果妳挑了非常大的圖片的話,\n"
+"妳的金鑰也會變成非常地大!\n"
+"盡量把圖片尺寸控制在 240x288 左右, 會是個非常理想的大小.\n"
+
+#: g10/photoid.c:95
+msgid "Enter JPEG filename for photo ID: "
+msgstr "輸入要當作相片 ID 的 JPEG 檔名: "
+
+#: g10/photoid.c:116
+#, c-format
+msgid "unable to open JPEG file `%s': %s\n"
+msgstr "無法開啟 JPEG 圖檔 `%s': %s\n"
+
+#: g10/photoid.c:127
+#, c-format
+msgid "This JPEG is really large (%d bytes) !\n"
+msgstr "這個 JPEG 檔案真的很大 (%d 位元組) !\n"
+
+#: g10/photoid.c:129
+msgid "Are you sure you want to use it? (y/N) "
+msgstr "妳確定要用它嗎? (y/N) "
+
+#: g10/photoid.c:146
+#, c-format
+msgid "`%s' is not a JPEG file\n"
+msgstr "`%s' 不是一個 JPEG 圖檔\n"
+
+#: g10/photoid.c:165
+msgid "Is this photo correct (y/N/q)? "
+msgstr "這張照片正確嗎? (y/N/q) "
+
+#: g10/photoid.c:329
+msgid "no photo viewer set\n"
+msgstr ""
+
+#: g10/photoid.c:383
+msgid "unable to display photo ID!\n"
+msgstr "無法顯示照片 ID!\n"
+
+#: g10/pkclist.c:62 g10/revoke.c:623
+msgid "No reason specified"
+msgstr "未指定原因"
+
+#: g10/pkclist.c:64 g10/revoke.c:625
+msgid "Key is superseded"
+msgstr "金鑰被代換了"
+
+#: g10/pkclist.c:66 g10/revoke.c:624
+msgid "Key has been compromised"
+msgstr "金鑰已經被洩漏了"
+
+#: g10/pkclist.c:68 g10/revoke.c:626
+msgid "Key is no longer used"
+msgstr "金鑰不再被使用了"
+
+#: g10/pkclist.c:70 g10/revoke.c:627
+msgid "User ID is no longer valid"
+msgstr "使用者 ID 不再有效了"
+
+#: g10/pkclist.c:74
+msgid "reason for revocation: "
+msgstr "撤銷原因: "
+
+#: g10/pkclist.c:91
+msgid "revocation comment: "
+msgstr "撤銷註釋: "
+
+#  a string with valid answers
+#: g10/pkclist.c:206
+msgid "iImMqQsS"
+msgstr "iImMqQsS"
+
+#: g10/pkclist.c:214
+msgid "No trust value assigned to:\n"
+msgstr "下列項目沒有對應的信任值:\n"
+
+#: g10/pkclist.c:246
+#, c-format
+msgid "  aka \"%s\"\n"
+msgstr "  亦即 \"%s\"\n"
+
+#: g10/pkclist.c:256
+msgid ""
+"How much do you trust that this key actually belongs to the named user?\n"
+msgstr "妳有多信任這把金鑰真的屬於叫這個名字的使用者?\n"
+
+#: g10/pkclist.c:271
+#, c-format
+msgid "  %d = I don't know or won't say\n"
+msgstr " %d = 我不知道或不想說\n"
+
+#: g10/pkclist.c:273
+#, c-format
+msgid "  %d = I do NOT trust\n"
+msgstr "  %d = 我*不*信任\n"
+
+#: g10/pkclist.c:279
+#, c-format
+msgid "  %d = I trust ultimately\n"
+msgstr "  %d = 我徹底信任\n"
+
+#: g10/pkclist.c:285
+msgid "  m = back to the main menu\n"
+msgstr " m = 回到主選單\n"
+
+#: g10/pkclist.c:288
+msgid "  s = skip this key\n"
+msgstr " s = 跳過這把金鑰\n"
+
+#: g10/pkclist.c:289
+msgid "  q = quit\n"
+msgstr "  q = 離開\n"
+
+#: g10/pkclist.c:293
+#, c-format
+msgid ""
+"The minimum trust level for this key is: %s\n"
+"\n"
+msgstr ""
+"這把金鑰的最小信任等級為: %s\n"
+"\n"
+
+#: g10/pkclist.c:299 g10/revoke.c:652
+msgid "Your decision? "
+msgstr "妳的決定是甚麼? "
+
+#: g10/pkclist.c:320
+msgid "Do you really want to set this key to ultimate trust? (y/N) "
+msgstr "請問妳是否真的想把這把金鑰設成徹底信任呢? (y/N) "
+
+#: g10/pkclist.c:334
+msgid "Certificates leading to an ultimately trusted key:\n"
+msgstr "被徹底信任金鑰的憑證:\n"
+
+#: g10/pkclist.c:419
+#, c-format
+msgid "%s: There is no assurance this key belongs to the named user\n"
+msgstr "%s: 沒法保證這把金鑰真的屬於叫這個名字的使用者\n"
+
+#: g10/pkclist.c:424
+#, c-format
+msgid "%s: There is limited assurance this key belongs to the named user\n"
+msgstr "%s: 祇能有限的保證這把金鑰真的屬於叫這個名字的使用者\n"
+
+#: g10/pkclist.c:430
+msgid "This key probably belongs to the named user\n"
+msgstr "這把金鑰很可能屬於叫這個名字的使用者\n"
+
+#: g10/pkclist.c:435
+msgid "This key belongs to us\n"
+msgstr "這把金鑰是屬於我們自己的\n"
+
+#: g10/pkclist.c:461
+msgid ""
+"It is NOT certain that the key belongs to the person named\n"
+"in the user ID.  If you *really* know what you are doing,\n"
+"you may answer the next question with yes.\n"
+msgstr ""
+"這把金鑰並 *不* 確定屬於使用者 ID 裡的那個人.\n"
+"除非妳 **真的** 知道自己在做甚麼,\n"
+"否則妳最好在下一個問題回答 no\n"
+
+#: g10/pkclist.c:468
+msgid "Use this key anyway? (y/N) "
+msgstr "無論如何還是使用這把金鑰嗎? (y/N) "
+
+#: g10/pkclist.c:502
+msgid "WARNING: Using untrusted key!\n"
+msgstr "警告: 正在使用不被信任的金鑰!\n"
+
+#: g10/pkclist.c:509
+msgid "WARNING: this key might be revoked (revocation key not present)\n"
+msgstr "警告: 這把金鑰可能已被撤銷了 (撤銷金鑰未出現)\n"
+
+#: g10/pkclist.c:518
+msgid "WARNING: This key has been revoked by its designated revoker!\n"
+msgstr "警告: 這把金鑰已經被它的指定撤銷者給撤銷了!\n"
+
+#: g10/pkclist.c:521
+msgid "WARNING: This key has been revoked by its owner!\n"
+msgstr "警告: 這把金鑰已經被它的持有人撤銷了!\n"
+
+#: g10/pkclist.c:522
+msgid "         This could mean that the signature is forged.\n"
+msgstr "         這很有可能表示這個簽章是被偽造的.\n"
+
+#: g10/pkclist.c:528
+msgid "WARNING: This subkey has been revoked by its owner!\n"
+msgstr "警告: 這把子鑰已經被它的持有人撤銷了!\n"
+
+#: g10/pkclist.c:533
+msgid "Note: This key has been disabled.\n"
+msgstr "請注意: 這把金鑰已經被禁用了.\n"
+
+#: g10/pkclist.c:553
+#, c-format
+msgid "Note: Verified signer's address is `%s'\n"
+msgstr ""
+
+#: g10/pkclist.c:560
+#, c-format
+msgid "Note: Signer's address `%s' does not match DNS entry\n"
+msgstr ""
+
+#: g10/pkclist.c:572
+msgid "trustlevel adjusted to FULL due to valid PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:580
+msgid "trustlevel adjusted to NEVER due to bad PKA info\n"
+msgstr ""
+
+#: g10/pkclist.c:591
+msgid "Note: This key has expired!\n"
+msgstr "請注意: 這把金鑰已經過期了!\n"
+
+#: g10/pkclist.c:602
+msgid "WARNING: This key is not certified with a trusted signature!\n"
+msgstr "警告: 這把金鑰並非以受信任的簽章所認證!\n"
+
+#: g10/pkclist.c:604
+msgid ""
+"         There is no indication that the signature belongs to the owner.\n"
+msgstr "         沒有證據指出這個簽章屬於這個持有者.\n"
+
+#: g10/pkclist.c:612
+msgid "WARNING: We do NOT trust this key!\n"
+msgstr "警告: 我們 *不* 信任這把金鑰!\n"
+
+#: g10/pkclist.c:613
+msgid "         The signature is probably a FORGERY.\n"
+msgstr "         這個簽章很有可能是 *偽造的*.\n"
+
+#: g10/pkclist.c:621
+msgid ""
+"WARNING: This key is not certified with sufficiently trusted signatures!\n"
+msgstr "警告: 這把金鑰並非以足夠信任的簽章所認證!\n"
+
+#: g10/pkclist.c:623
+msgid "         It is not certain that the signature belongs to the owner.\n"
+msgstr "         這份簽章並不屬於這個持有者\n"
+
+#: g10/pkclist.c:822 g10/pkclist.c:864 g10/pkclist.c:1076 g10/pkclist.c:1146
+#, c-format
+msgid "%s: skipped: %s\n"
+msgstr "%s: 已跳過: %s\n"
+
+#: g10/pkclist.c:834 g10/pkclist.c:1114
+#, c-format
+msgid "%s: skipped: public key already present\n"
+msgstr "%s: 已跳過: 公鑰已經存在了\n"
+
+#: g10/pkclist.c:885
+msgid "You did not specify a user ID. (you may use \"-r\")\n"
+msgstr "妳沒有指定一個使用者 ID. (妳可能得用 \"-r\")\n"
+
+#: g10/pkclist.c:909
+msgid "Current recipients:\n"
+msgstr "目前的收件者:\n"
+
+#: g10/pkclist.c:935
+msgid ""
+"\n"
+"Enter the user ID.  End with an empty line: "
+msgstr ""
+"\n"
+"輸入使用者 ID. 以空白列結束: "
+
+#: g10/pkclist.c:960
+msgid "No such user ID.\n"
+msgstr "沒有這個使用者 ID.\n"
+
+#: g10/pkclist.c:969 g10/pkclist.c:1043
+msgid "skipped: public key already set as default recipient\n"
+msgstr "已跳過: 公鑰已經被設成預設收件者\n"
+
+#: g10/pkclist.c:990
+msgid "Public key is disabled.\n"
+msgstr "公鑰被禁用了.\n"
+
+#: g10/pkclist.c:999
+msgid "skipped: public key already set\n"
+msgstr "已跳過: 公鑰已經被設過了\n"
+
+#: g10/pkclist.c:1034
+#, c-format
+msgid "unknown default recipient \"%s\"\n"
+msgstr "未知的預設收件者 \"%s\"\n"
+
+#: g10/pkclist.c:1092
+#, c-format
+msgid "%s: skipped: public key is disabled\n"
+msgstr "%s: 已跳過: 公鑰已經被禁用了\n"
+
+#: g10/pkclist.c:1154
+msgid "no valid addressees\n"
+msgstr "沒有有效的地址\n"
+
+#: g10/plaintext.c:91
+msgid "data not saved; use option \"--output\" to save it\n"
+msgstr "資料未被儲存; 請用 \"--output\" 選項來儲存它們\n"
+
+#: g10/plaintext.c:135 g10/plaintext.c:140 g10/plaintext.c:158
+#, c-format
+msgid "error creating `%s': %s\n"
+msgstr "建立 `%s' 時發生錯誤: %s\n"
+
+#: g10/plaintext.c:452
+msgid "Detached signature.\n"
+msgstr "分離的簽章.\n"
+
+#: g10/plaintext.c:458
+msgid "Please enter name of data file: "
+msgstr "請輸入資料檔的名稱: "
+
+#: g10/plaintext.c:490
+msgid "reading stdin ...\n"
+msgstr "正在從標準輸入讀取 ...\n"
+
+#: g10/plaintext.c:524
+msgid "no signed data\n"
+msgstr "沒有被簽署過的資料\n"
+
+#: g10/plaintext.c:538
+#, c-format
+msgid "can't open signed data `%s'\n"
+msgstr "無法開啟被簽署過的資料 `%s'\n"
+
+#: g10/pubkey-enc.c:104
+#, c-format
+msgid "anonymous recipient; trying secret key %s ...\n"
+msgstr "匿名收件者; 正在嘗試使用私鑰 %s ...\n"
+
+#: g10/pubkey-enc.c:135
+msgid "okay, we are the anonymous recipient.\n"
+msgstr "很好, 我們就是匿名收件者.\n"
+
+#: g10/pubkey-enc.c:223
+msgid "old encoding of the DEK is not supported\n"
+msgstr "不支援舊式的 DEK 編碼\n"
+
+#: g10/pubkey-enc.c:244
+#, c-format
+msgid "cipher algorithm %d%s is unknown or disabled\n"
+msgstr "編密演算法 %d%s 未知或已停用了\n"
+
+#: g10/pubkey-enc.c:282
+#, c-format
+msgid "WARNING: cipher algorithm %s not found in recipient preferences\n"
+msgstr "警告: 收件者偏好設定中找不到編密演算法 %s\n"
+
+#: g10/pubkey-enc.c:302
+#, c-format
+msgid "NOTE: secret key %s expired at %s\n"
+msgstr "請注意: 私鑰 %s 在 %s 過期了\n"
+
+#: g10/pubkey-enc.c:308
+msgid "NOTE: key has been revoked"
+msgstr "請注意: 金鑰已經被撤銷了"
+
+#: g10/revoke.c:104 g10/revoke.c:118 g10/revoke.c:130 g10/revoke.c:176
+#: g10/revoke.c:188 g10/revoke.c:588
+#, c-format
+msgid "build_packet failed: %s\n"
+msgstr "build_packet 失敗: %s\n"
+
+#: g10/revoke.c:147
+#, c-format
+msgid "key %s has no user IDs\n"
+msgstr "金鑰 %s 沒有使用者 ID\n"
+
+#: g10/revoke.c:308
+msgid "To be revoked by:\n"
+msgstr "將被撤銷:\n"
+
+#: g10/revoke.c:312
+msgid "(This is a sensitive revocation key)\n"
+msgstr "(這是把機密的撤銷金鑰)\n"
+
+#: g10/revoke.c:316
+msgid "Create a designated revocation certificate for this key? (y/N) "
+msgstr "要為這把金鑰建立一份指定撤銷憑證嗎? (y/N) "
+
+#: g10/revoke.c:329 g10/revoke.c:554
+msgid "ASCII armored output forced.\n"
+msgstr "已強迫使用 ASCII 封裝過的輸出.\n"
+
+#: g10/revoke.c:344 g10/revoke.c:568
+#, c-format
+msgid "make_keysig_packet failed: %s\n"
+msgstr "make_keysig_packet 失敗: %s\n"
+
+#: g10/revoke.c:407
+msgid "Revocation certificate created.\n"
+msgstr "已建立撤銷憑證.\n"
+
+#: g10/revoke.c:413
+#, c-format
+msgid "no revocation keys found for \"%s\"\n"
+msgstr "沒有找到 \"%s\" 用的撤銷金鑰\n"
+
+#: g10/revoke.c:471
+#, c-format
+msgid "secret key \"%s\" not found: %s\n"
+msgstr "找不到私鑰 \"%s\": %s\n"
+
+#: g10/revoke.c:500
+#, c-format
+msgid "no corresponding public key: %s\n"
+msgstr "沒有相對應的公鑰: %s\n"
+
+#: g10/revoke.c:511
+msgid "public key does not match secret key!\n"
+msgstr "公鑰與私鑰並不吻合!\n"
+
+#: g10/revoke.c:518
+msgid "Create a revocation certificate for this key? (y/N) "
+msgstr "要為這把金鑰建立一份撤銷憑證嗎? (y/N) "
+
+#: g10/revoke.c:535
+msgid "unknown protection algorithm\n"
+msgstr "未知的保護演算法\n"
+
+#: g10/revoke.c:543
+msgid "NOTE: This key is not protected!\n"
+msgstr "注意: 這把金鑰沒有被保護!\n"
+
+#: g10/revoke.c:594
+msgid ""
+"Revocation certificate created.\n"
+"\n"
+"Please move it to a medium which you can hide away; if Mallory gets\n"
+"access to this certificate he can use it to make your key unusable.\n"
+"It is smart to print this certificate and store it away, just in case\n"
+"your media become unreadable.  But have some caution:  The print system of\n"
+"your machine might store the data and make it available to others!\n"
+msgstr ""
+"已建立撤銷憑證.\n"
+"\n"
+"請把這個檔案搬移到另一個妳能夠將之藏起來的媒介上;\n"
+"如果有人能夠取得這份憑證的話, 那麼他也能夠讓妳的\n"
+"金鑰無法繼續使用. 把這份憑證列印出來再藏到別的地\n"
+"方也是很好的方法, 以免妳的儲存媒介損毀而無法讀取.\n"
+"但是千萬小心: 妳的機器上的列印系統可能會在列印過\n"
+"程中把這些資料暫存在某個其他人也能夠看得到的地方!\n"
+
+#: g10/revoke.c:635
+msgid "Please select the reason for the revocation:\n"
+msgstr "請選擇撤銷的原因:\n"
+
+#: g10/revoke.c:645
+msgid "Cancel"
+msgstr "取消"
+
+#: g10/revoke.c:647
+#, c-format
+msgid "(Probably you want to select %d here)\n"
+msgstr "(也許妳會想要在這裡選擇 %d)\n"
+
+#: g10/revoke.c:688
+msgid "Enter an optional description; end it with an empty line:\n"
+msgstr "請輸入選用的描述; 以空白列結束:\n"
+
+#: g10/revoke.c:716
+#, c-format
+msgid "Reason for revocation: %s\n"
+msgstr "撤銷原因: %s\n"
+
+#: g10/revoke.c:718
+msgid "(No description given)\n"
+msgstr "(沒有給定描述)\n"
+
+#: g10/revoke.c:723
+msgid "Is this okay? (y/N) "
+msgstr "這樣可以嗎? (y/N) "
+
+#: g10/seckey-cert.c:55
+msgid "secret key parts are not available\n"
+msgstr "私鑰部分無法取用\n"
+
+#: g10/seckey-cert.c:61
+#, c-format
+msgid "protection algorithm %d%s is not supported\n"
+msgstr "保護演算法 %d%s 未被支援\n"
+
+#: g10/seckey-cert.c:72
+#, c-format
+msgid "protection digest %d is not supported\n"
+msgstr "保護摘要 %d 未被支援\n"
+
+#: g10/seckey-cert.c:266
+msgid "Invalid passphrase; please try again"
+msgstr "無效的密語; 請再試一次"
+
+#: g10/seckey-cert.c:267
+#, c-format
+msgid "%s ...\n"
+msgstr "%s ...\n"
+
+#: g10/seckey-cert.c:328
+msgid "WARNING: Weak key detected - please change passphrase again.\n"
+msgstr "警告: 偵測到金鑰薄弱 - 請再更換密語一次.\n"
+
+#: g10/seckey-cert.c:366
+msgid "generating the deprecated 16-bit checksum for secret key protection\n"
+msgstr "正在產生私鑰保護會用到的舊式 16 位元加總檢查\n"
+
+#: g10/seskey.c:54
+msgid "weak key created - retrying\n"
+msgstr "建立了弱金鑰 - 正在重試\n"
+
+#: g10/seskey.c:59
+#, c-format
+msgid "cannot avoid weak key for symmetric cipher; tried %d times!\n"
+msgstr "無法避免對稱式編密法的弱金鑰; 已經試了 %d 次了!\n"
+
+#: g10/seskey.c:222
+msgid "DSA requires the hash length to be a multiple of 8 bits\n"
+msgstr ""
+
+#: g10/seskey.c:236
+#, c-format
+msgid "DSA key %s uses an unsafe (%u bit) hash\n"
+msgstr ""
+
+#: g10/seskey.c:248
+#, c-format
+msgid "DSA key %s requires a %u bit or larger hash\n"
+msgstr ""
+
+#: g10/sig-check.c:76
+msgid "WARNING: signature digest conflict in message\n"
+msgstr "警告: 簽章摘要與訊息不一致\n"
+
+#: g10/sig-check.c:101
+#, c-format
+msgid "WARNING: signing subkey %s is not cross-certified\n"
+msgstr "警告: 正要簽署的子鑰 %s 未經交叉認證\n"
+
+#: g10/sig-check.c:113
+#, c-format
+msgid "WARNING: signing subkey %s has an invalid cross-certification\n"
+msgstr "警告: 正要簽署的子鑰 %s 有無效的交叉憑證\n"
+
+#: g10/sig-check.c:181
+#, c-format
+msgid "public key %s is %lu second newer than the signature\n"
+msgstr "公鑰 %s 比簽章還要新了 %lu 秒\n"
+
+#: g10/sig-check.c:182
+#, c-format
+msgid "public key %s is %lu seconds newer than the signature\n"
+msgstr "公鑰 %s 比簽章還要新了 %lu 秒\n"
+
+#: g10/sig-check.c:193
+#, c-format
+msgid ""
+"key %s was created %lu second in the future (time warp or clock problem)\n"
+msgstr ""
+"金鑰 %s 已經在 %lu 秒後的未來製造出來了 (可能是因為時光旅行或時鐘的問題)\n"
+
+#: g10/sig-check.c:195
+#, c-format
+msgid ""
+"key %s was created %lu seconds in the future (time warp or clock problem)\n"
+msgstr ""
+"金鑰 %s 已經在 %lu 秒後的未來製造出來了 (可能是因為時光旅行或時鐘的問題)\n"
+
+#: g10/sig-check.c:205
+#, c-format
+msgid "NOTE: signature key %s expired %s\n"
+msgstr "請注意: 簽章金鑰 %s 已於 %s 過期\n"
+
+#: g10/sig-check.c:287
+#, c-format
+msgid "assuming bad signature from key %s due to an unknown critical bit\n"
+msgstr "假設金鑰 %s 的損壞簽章導因於某個未知的關鍵位元\n"
+
+#: g10/sig-check.c:544
+#, c-format
+msgid "key %s: no subkey for subkey revocation signature\n"
+msgstr "金鑰 %s: 沒有子鑰可供子鑰撤銷簽章使用\n"
+
+#: g10/sig-check.c:570
+#, c-format
+msgid "key %s: no subkey for subkey binding signature\n"
+msgstr "金鑰 %s: 沒有子鑰可供附子鑰簽章之用\n"
+
+#: g10/sign.c:85
+msgid "can't put notation data into v3 (PGP 2.x style) signatures\n"
+msgstr "無法在 v3 (PGP 2.x 型態) 的簽章內放入標記資料\n"
+
+#: g10/sign.c:93
+msgid "can't put notation data into v3 (PGP 2.x style) key signatures\n"
+msgstr "無法在 v3 (PGP 2.x 型態) 的金鑰簽章內放入標記資料\n"
+
+#: g10/sign.c:107
+#, c-format
+msgid "WARNING: unable to %%-expand notation (too large).  Using unexpanded.\n"
+msgstr "警告: 標記 %% 無法擴張 (太大了). 現在使用未擴張的.\n"
+
+#: g10/sign.c:124
+msgid "can't put a policy URL into v3 (PGP 2.x style) signatures\n"
+msgstr "無法在 v3 (PGP 2.x 型態) 的簽章內放入原則 URL\n"
+
+#: g10/sign.c:132
+msgid "can't put a policy URL into v3 key (PGP 2.x style) signatures\n"
+msgstr "無法在 v3 (PGP 2.x 型態) 的金鑰簽章內放入原則 URL\n"
+
+#: g10/sign.c:145
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand policy URL (too large).  Using unexpanded.\n"
+msgstr "警告: 原則 URL 的 %% 無法擴張 (太大了). 現在使用未擴張的.\n"
+
+#: g10/sign.c:173
+#, c-format
+msgid ""
+"WARNING: unable to %%-expand preferred keyserver URL (too large).  Using "
+"unexpanded.\n"
+msgstr "警告: 偏好金鑰伺服器 URL 的 %% 無法擴張 (太大了). 現在使用未擴張的.\n"
+
+#: g10/sign.c:347
+#, c-format
+msgid "checking created signature failed: %s\n"
+msgstr "檢查已建立的簽章時發生錯誤: %s\n"
+
+#: g10/sign.c:356
+#, c-format
+msgid "%s/%s signature from: \"%s\"\n"
+msgstr "%s/%s 簽章來自: \"%s\"\n"
+
+#: g10/sign.c:788
+msgid "you can only detach-sign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "妳在 --pgp2 模式下祇能夠使用 PGP 2.x 型態的金鑰來做分離簽署\n"
+
+#: g10/sign.c:862
+#, c-format
+msgid ""
+"WARNING: forcing digest algorithm %s (%d) violates recipient preferences\n"
+msgstr "警告: 強迫使用 %s (%d) 摘要演算法會違反收件者偏好設定\n"
+
+#: g10/sign.c:988
+msgid "signing:"
+msgstr "簽署:"
+
+#: g10/sign.c:1100
+msgid "you can only clearsign with PGP 2.x style keys while in --pgp2 mode\n"
+msgstr "妳在 --pgp2 模式下祇能夠使用 PGP 2.x 型態的金鑰來做明文簽署\n"
+
+#: g10/sign.c:1278
+#, c-format
+msgid "%s encryption will be used\n"
+msgstr "%s 加密將被採用\n"
+
+#: g10/skclist.c:128 g10/skclist.c:192
+msgid "key is not flagged as insecure - can't use it with the faked RNG!\n"
+msgstr "金鑰未被標示為不安全 - 不能夠拿來跟假的隨機數字產生器併用!\n"
+
+#: g10/skclist.c:159
+#, c-format
+msgid "skipped \"%s\": duplicated\n"
+msgstr "已跳過 \"%s\": 重複了\n"
+
+#: g10/skclist.c:167 g10/skclist.c:177 g10/skclist.c:186
+#, c-format
+msgid "skipped \"%s\": %s\n"
+msgstr "已跳過 \"%s\": %s\n"
+
+#: g10/skclist.c:172
+msgid "skipped: secret key already present\n"
+msgstr "已跳過: 私鑰已經存在\n"
+
+#: g10/skclist.c:187
+msgid "this is a PGP generated Elgamal key which is not secure for signatures!"
+msgstr "這是由 PGP 產生的 ElGamal 金鑰, 用於簽章並不安全!"
+
+#: g10/tdbdump.c:60 g10/trustdb.c:366
+#, c-format
+msgid "trust record %lu, type %d: write failed: %s\n"
+msgstr "信任記錄 %lu, 類別 %d: 寫入失敗: %s\n"
+
+#: g10/tdbdump.c:105
+#, c-format
+msgid ""
+"# List of assigned trustvalues, created %s\n"
+"# (Use \"gpg --import-ownertrust\" to restore them)\n"
+msgstr ""
+"# 相對應的信任值清單被建立於 %s\n"
+"# (請用 \"gpg --import-ownertrust\" 來取回它們)\n"
+
+#: g10/tdbdump.c:160 g10/tdbdump.c:168 g10/tdbdump.c:173 g10/tdbdump.c:178
+#, c-format
+msgid "error in `%s': %s\n"
+msgstr "在 `%s' 中出錯: %s\n"
+
+#: g10/tdbdump.c:160
+msgid "line too long"
+msgstr "列太長"
+
+#: g10/tdbdump.c:168
+msgid "colon missing"
+msgstr "冒號缺漏"
+
+#: g10/tdbdump.c:174
+msgid "invalid fingerprint"
+msgstr "無效的指紋"
+
+#: g10/tdbdump.c:179
+msgid "ownertrust value missing"
+msgstr "主觀信任值缺漏"
+
+#: g10/tdbdump.c:215
+#, c-format
+msgid "error finding trust record in `%s': %s\n"
+msgstr "在 `%s' 中尋找信任記錄時出錯: %s\n"
+
+#: g10/tdbdump.c:219
+#, c-format
+msgid "read error in `%s': %s\n"
+msgstr "讀取 `%s' 錯誤: %s\n"
+
+#: g10/tdbdump.c:228 g10/trustdb.c:381
+#, c-format
+msgid "trustdb: sync failed: %s\n"
+msgstr "信任資料庫: 同步化失敗: %s\n"
+
+#: g10/tdbio.c:129 g10/tdbio.c:1445
+#, c-format
+msgid "trustdb rec %lu: lseek failed: %s\n"
+msgstr "信任資料庫記錄 %lu: 本地搜尋失敗: %s\n"
+
+#: g10/tdbio.c:135 g10/tdbio.c:1452
+#, c-format
+msgid "trustdb rec %lu: write failed (n=%d): %s\n"
+msgstr "信任資料庫記錄 %lu: 寫入失敗 (n=%d): %s\n"
+
+#: g10/tdbio.c:245
+msgid "trustdb transaction too large\n"
+msgstr "信任資料庫更動量過大\n"
+
+#: g10/tdbio.c:498
+#, c-format
+msgid "can't access `%s': %s\n"
+msgstr "無法存取 `%s': %s\n"
+
+#: g10/tdbio.c:513
+#, c-format
+msgid "%s: directory does not exist!\n"
+msgstr "%s: 目錄不存在!\n"
+
+#: g10/tdbio.c:523 g10/tdbio.c:546 g10/tdbio.c:589
+#, c-format
+msgid "can't create lock for `%s'\n"
+msgstr "無法為 `%s' 建立鎖定\n"
+
+#: g10/tdbio.c:525 g10/tdbio.c:592
+#, c-format
+msgid "can't lock `%s'\n"
+msgstr "無法鎖定 `%s'\n"
+
+#: g10/tdbio.c:551
+#, c-format
+msgid "%s: failed to create version record: %s"
+msgstr "%s: 建立版本記錄失敗: %s"
+
+#: g10/tdbio.c:555
+#, c-format
+msgid "%s: invalid trustdb created\n"
+msgstr "%s: 建立了無效的信任資料庫\n"
+
+#: g10/tdbio.c:558
+#, c-format
+msgid "%s: trustdb created\n"
+msgstr "%s: 建立了信任資料庫\n"
+
+#: g10/tdbio.c:602
+msgid "NOTE: trustdb not writable\n"
+msgstr "請注意: 信任資料庫不可寫入\n"
+
+#: g10/tdbio.c:619
+#, c-format
+msgid "%s: invalid trustdb\n"
+msgstr "%s: 無效的信任資料庫\n"
+
+#: g10/tdbio.c:651
+#, c-format
+msgid "%s: failed to create hashtable: %s\n"
+msgstr "%s: 建立雜湊表失敗: %s\n"
+
+#: g10/tdbio.c:659
+#, c-format
+msgid "%s: error updating version record: %s\n"
+msgstr "%s: 更新版本記錄時錯誤: %s\n"
+
+#: g10/tdbio.c:676 g10/tdbio.c:696 g10/tdbio.c:712 g10/tdbio.c:726
+#: g10/tdbio.c:756 g10/tdbio.c:1378 g10/tdbio.c:1405
+#, c-format
+msgid "%s: error reading version record: %s\n"
+msgstr "%s: 讀取版本記錄時錯誤: %s\n"
+
+#: g10/tdbio.c:735
+#, c-format
+msgid "%s: error writing version record: %s\n"
+msgstr "%s: 寫入版本記錄時錯誤: %s\n"
+
+#: g10/tdbio.c:1174
+#, c-format
+msgid "trustdb: lseek failed: %s\n"
+msgstr "信任資料庫: 本地搜尋失敗: %s\n"
+
+#: g10/tdbio.c:1182
+#, c-format
+msgid "trustdb: read failed (n=%d): %s\n"
+msgstr "信任資料庫: 讀取失敗 (n=%d): %s\n"
+
+#: g10/tdbio.c:1203
+#, c-format
+msgid "%s: not a trustdb file\n"
+msgstr "%s: 不是一個信任資料庫檔案\n"
+
+#: g10/tdbio.c:1221
+#, c-format
+msgid "%s: version record with recnum %lu\n"
+msgstr "%s: 記錄編號為 %lu 的版本記錄\n"
+
+#: g10/tdbio.c:1226
+#, c-format
+msgid "%s: invalid file version %d\n"
+msgstr "%s: 無效的檔案版本 %d\n"
+
+#: g10/tdbio.c:1411
+#, c-format
+msgid "%s: error reading free record: %s\n"
+msgstr "%s: 讀取自由記錄時錯誤: %s\n"
+
+#: g10/tdbio.c:1419
+#, c-format
+msgid "%s: error writing dir record: %s\n"
+msgstr "%s: 寫入目錄記錄時錯誤: %s\n"
+
+#: g10/tdbio.c:1429
+#, c-format
+msgid "%s: failed to zero a record: %s\n"
+msgstr "%s: 記錄歸零時失敗: %s\n"
+
+#: g10/tdbio.c:1459
+#, c-format
+msgid "%s: failed to append a record: %s\n"
+msgstr "%s: 附加某筆記錄時失敗: %s\n"
+
+#: g10/tdbio.c:1504
+msgid "the trustdb is corrupted; please run \"gpg --fix-trustdb\".\n"
+msgstr "信任資料庫損毀了; 請執行 \"gpg --fix-trustdb\".\n"
+
+#: g10/textfilter.c:149
+#, c-format
+msgid "can't handle text lines longer than %d characters\n"
+msgstr "無法處理長於 %d 字符的文字列\n"
+
+#: g10/textfilter.c:248
+#, c-format
+msgid "input line longer than %d characters\n"
+msgstr "輸入列比 %d 字符還長\n"
+
+#: g10/trustdb.c:227
+#, c-format
+msgid "`%s' is not a valid long keyID\n"
+msgstr "`%s' 不是一個有效的長式金鑰 ID\n"
+
+#: g10/trustdb.c:258
+#, c-format
+msgid "key %s: accepted as trusted key\n"
+msgstr "金鑰 %s: 如受信任的金鑰般被接受了\n"
+
+#: g10/trustdb.c:296
+#, c-format
+msgid "key %s occurs more than once in the trustdb\n"
+msgstr "金鑰 %s 在信任資料庫中出現了不止一次\n"
+
+#: g10/trustdb.c:311
+#, c-format
+msgid "key %s: no public key for trusted key - skipped\n"
+msgstr "金鑰 %s: 受信任的金鑰沒有公鑰 - 已跳過\n"
+
+#: g10/trustdb.c:321
+#, c-format
+msgid "key %s marked as ultimately trusted\n"
+msgstr "金鑰 %s 已被標記成徹底信任了\n"
+
+#: g10/trustdb.c:345
+#, c-format
+msgid "trust record %lu, req type %d: read failed: %s\n"
+msgstr "信任記錄 %lu, 請求類別 %d: 讀取失敗: %s\n"
+
+#: g10/trustdb.c:351
+#, c-format
+msgid "trust record %lu is not of requested type %d\n"
+msgstr "信任記錄 %lu 不是所請求的類別 %d\n"
+
+#: g10/trustdb.c:447
+#, c-format
+msgid "unable to use unknown trust model (%d) - assuming %s trust model\n"
+msgstr "無法使用未知的信任模型 (%d) - 現在採用 %s 信任模型\n"
+
+#: g10/trustdb.c:453
+#, c-format
+msgid "using %s trust model\n"
+msgstr "正在使用 %s 信任模型\n"
+
+#: g10/trustdb.c:505
+msgid "10 translator see trustdb.c:uid_trust_string_fixed"
+msgstr "10 譯者請參見 trustdb.c:uid_trust_string_fixed"
+
+#: g10/trustdb.c:507
+msgid "[ revoked]"
+msgstr "[ 已撤銷 ]"
+
+#: g10/trustdb.c:509 g10/trustdb.c:514
+msgid "[ expired]"
+msgstr "[ 已過期 ]"
+
+#: g10/trustdb.c:513
+msgid "[ unknown]"
+msgstr "[  未知  ]"
+
+#: g10/trustdb.c:515
+msgid "[  undef ]"
+msgstr "[ 未定義 ]"
+
+#: g10/trustdb.c:516
+msgid "[marginal]"
+msgstr "[  勉強  ]"
+
+#: g10/trustdb.c:517
+msgid "[  full  ]"
+msgstr "[  完全  ]"
+
+#: g10/trustdb.c:518
+msgid "[ultimate]"
+msgstr "[  徹底  ]"
+
+#: g10/trustdb.c:533
+msgid "undefined"
+msgstr "未定義"
+
+#: g10/trustdb.c:534
+msgid "never"
+msgstr "永遠不會"
+
+#: g10/trustdb.c:535
+msgid "marginal"
+msgstr "勉強"
+
+#: g10/trustdb.c:536
+msgid "full"
+msgstr "完全"
+
+#: g10/trustdb.c:537
+msgid "ultimate"
+msgstr "徹底"
+
+#: g10/trustdb.c:577
+msgid "no need for a trustdb check\n"
+msgstr "不需要檢查信任資料庫\n"
+
+#: g10/trustdb.c:583 g10/trustdb.c:2352
+#, c-format
+msgid "next trustdb check due at %s\n"
+msgstr "下次信任資料庫檢查將於 %s 進行\n"
+
+#: g10/trustdb.c:592
+#, c-format
+msgid "no need for a trustdb check with `%s' trust model\n"
+msgstr "在 `%s' 信任模型中並不需要檢查信任資料庫\n"
+
+#: g10/trustdb.c:607
+#, c-format
+msgid "no need for a trustdb update with `%s' trust model\n"
+msgstr "在 `%s' 信任模型中並不需要更新信任資料庫\n"
+
+#: g10/trustdb.c:839 g10/trustdb.c:1277
+#, c-format
+msgid "public key %s not found: %s\n"
+msgstr "找不到公鑰 %s: %s\n"
+
+#: g10/trustdb.c:1034
+msgid "please do a --check-trustdb\n"
+msgstr "請做一次 --check-trustdb\n"
+
+#: g10/trustdb.c:1038
+msgid "checking the trustdb\n"
+msgstr "正在檢查信任資料庫\n"
+
+#: g10/trustdb.c:2095
+#, c-format
+msgid "%d keys processed (%d validity counts cleared)\n"
+msgstr "已經處理了 %d 把金鑰 (共計已解決了 %d 份有效性)\n"
+
+#: g10/trustdb.c:2160
+msgid "no ultimately trusted keys found\n"
+msgstr "沒有找到任何徹底信任的金鑰\n"
+
+#: g10/trustdb.c:2174
+#, c-format
+msgid "public key of ultimately trusted key %s not found\n"
+msgstr "徹底信任金鑰 %s 的公鑰沒有被找到\n"
+
+#: g10/trustdb.c:2197
+#, c-format
+msgid "%d marginal(s) needed, %d complete(s) needed, %s trust model\n"
+msgstr "%d 個勉強信任以及 %d 個完全信任是 %s 信任模型的最小需求\n"
+
+#: g10/trustdb.c:2283
+#, 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"
+
+#: g10/trustdb.c:2358
+#, c-format
+msgid "unable to update trustdb version record: write failed: %s\n"
+msgstr "無法更新信任資料庫版本記錄: 寫入失敗: %s\n"
+
+#: g10/verify.c:117
+msgid ""
+"the signature could not be verified.\n"
+"Please remember that the signature file (.sig or .asc)\n"
+"should be the first file given on the command line.\n"
+msgstr ""
+"簽章無法被驗證.\n"
+"請記住簽章檔 (.sig 或 .asc)\n"
+"應該是第一個命令列給定的檔案.\n"
+
+#: g10/verify.c:192
+#, c-format
+msgid "input line %u too long or missing LF\n"
+msgstr "輸入列 %u 太長或者列末的 LF 遺失了\n"
+
+#: util/errors.c:55
+msgid "general error"
+msgstr "一般性錯誤"
+
+#: util/errors.c:56
+msgid "unknown packet type"
+msgstr "未知的封包型態"
+
+#: util/errors.c:57
+msgid "unknown version"
+msgstr "未知的版本"
+
+#: util/errors.c:58
+msgid "unknown pubkey algorithm"
+msgstr "未知的公鑰演算法"
+
+#: util/errors.c:59
+msgid "unknown digest algorithm"
+msgstr "未知的摘要演算法"
+
+#: util/errors.c:60
+msgid "bad public key"
+msgstr "損壞的公鑰"
+
+#: util/errors.c:61
+msgid "bad secret key"
+msgstr "損壞的私鑰"
+
+#: util/errors.c:62
+msgid "bad signature"
+msgstr "損壞的簽章"
+
+#: util/errors.c:63
+msgid "checksum error"
+msgstr "加總檢查錯誤"
+
+#: util/errors.c:64
+msgid "bad passphrase"
+msgstr "錯誤的密語"
+
+#: util/errors.c:65
+msgid "public key not found"
+msgstr "找不到公鑰"
+
+#: util/errors.c:66
+msgid "unknown cipher algorithm"
+msgstr "未知的編密演算法"
+
+#: util/errors.c:67
+msgid "can't open the keyring"
+msgstr "沒辦法開啟鑰匙圈"
+
+#: util/errors.c:68
+msgid "invalid packet"
+msgstr "無效的封包"
+
+#: util/errors.c:69
+msgid "invalid armor"
+msgstr "無效的封裝"
+
+#: util/errors.c:70
+msgid "no such user id"
+msgstr "沒有這個使用者 ID"
+
+#: util/errors.c:71
+msgid "secret key not available"
+msgstr "無法取用私鑰"
+
+#: util/errors.c:72
+msgid "wrong secret key used"
+msgstr "用了錯誤的私鑰"
+
+#: util/errors.c:73
+msgid "not supported"
+msgstr "未被支援"
+
+#: util/errors.c:74
+msgid "bad key"
+msgstr "損壞的金鑰"
+
+#: util/errors.c:75
+msgid "file read error"
+msgstr "檔案讀取錯誤"
+
+#: util/errors.c:76
+msgid "file write error"
+msgstr "檔案寫入錯誤"
+
+#: util/errors.c:77
+msgid "unknown compress algorithm"
+msgstr "未知的壓縮演算法"
+
+#: util/errors.c:78
+msgid "file open error"
+msgstr "檔案開啟錯誤"
+
+#: util/errors.c:79
+msgid "file create error"
+msgstr "檔案建立錯誤"
+
+#: util/errors.c:80
+msgid "invalid passphrase"
+msgstr "無效的密語"
+
+#: util/errors.c:81
+msgid "unimplemented pubkey algorithm"
+msgstr "未被採用的公鑰演算法"
+
+#: util/errors.c:82
+msgid "unimplemented cipher algorithm"
+msgstr "未被採用的編密演算法"
+
+#: util/errors.c:83
+msgid "unknown signature class"
+msgstr "未知的簽章層級"
+
+#: util/errors.c:84
+msgid "trust database error"
+msgstr "信任資料庫錯誤"
+
+#: util/errors.c:85
+msgid "bad MPI"
+msgstr "損壞的 MPI"
+
+#: util/errors.c:86
+msgid "resource limit"
+msgstr "資源限制"
+
+#: util/errors.c:87
+msgid "invalid keyring"
+msgstr "無效的鑰匙圈"
+
+#: util/errors.c:88
+msgid "bad certificate"
+msgstr "損壞的憑證"
+
+#: util/errors.c:89
+msgid "malformed user id"
+msgstr "被變造過的使用者 ID"
+
+#: util/errors.c:90
+msgid "file close error"
+msgstr "檔案關閉錯誤"
+
+#: util/errors.c:91
+msgid "file rename error"
+msgstr "檔案更名錯誤"
+
+#: util/errors.c:92
+msgid "file delete error"
+msgstr "檔案刪除錯誤"
+
+#: util/errors.c:93
+msgid "unexpected data"
+msgstr "未預期的資料"
+
+#: util/errors.c:94
+msgid "timestamp conflict"
+msgstr "時間戳印有矛盾"
+
+#: util/errors.c:95
+msgid "unusable pubkey algorithm"
+msgstr "無法使用的公鑰演算法"
+
+#: util/errors.c:96
+msgid "file exists"
+msgstr "檔案已存在"
+
+#: util/errors.c:97
+msgid "weak key"
+msgstr "金鑰薄弱"
+
+#: util/errors.c:98
+msgid "invalid argument"
+msgstr "無效的參數"
+
+#: util/errors.c:99
+msgid "bad URI"
+msgstr "損壞的 URI"
+
+#: util/errors.c:100
+msgid "unsupported URI"
+msgstr "未被支援的 URI"
+
+#: util/errors.c:101
+msgid "network error"
+msgstr "網路錯誤"
+
+#: util/errors.c:103
+msgid "not encrypted"
+msgstr "未被加密"
+
+#: util/errors.c:104
+msgid "not processed"
+msgstr "未被處理"
+
+#: util/errors.c:106
+msgid "unusable public key"
+msgstr "不可用的公鑰"
+
+#: util/errors.c:107
+msgid "unusable secret key"
+msgstr "不可用的私鑰"
+
+#: util/errors.c:108
+msgid "keyserver error"
+msgstr "金鑰伺服器錯誤"
+
+#: util/errors.c:109
+msgid "canceled"
+msgstr "已取消"
+
+#: util/errors.c:110
+msgid "no card"
+msgstr "沒有卡片"
+
+#: util/errors.c:111
+#, fuzzy
+msgid "no data"
+msgstr "沒有被簽署過的資料\n"
+
+#: util/logger.c:158
+msgid "ERROR: "
+msgstr "錯誤: "
+
+#: util/logger.c:161
+msgid "WARNING: "
+msgstr "警告: "
+
+#: util/logger.c:224
+#, c-format
+msgid "... this is a bug (%s:%d:%s)\n"
+msgstr "... 這是個瑕疵 (%s:%d:%s)\n"
+
+#: util/logger.c:230
+#, c-format
+msgid "you found a bug ... (%s:%d)\n"
+msgstr "妳找到一個瑕疵了 ... (%s:%d)\n"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:330 util/miscutil.c:367
+msgid "yes"
+msgstr "yes"
+
+#: util/miscutil.c:331 util/miscutil.c:372
+msgid "yY"
+msgstr "yY"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:333 util/miscutil.c:369
+msgid "no"
+msgstr "no"
+
+#: util/miscutil.c:334 util/miscutil.c:373
+msgid "nN"
+msgstr "nN"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:371
+msgid "quit"
+msgstr "quit"
+
+#: util/miscutil.c:374
+msgid "qQ"
+msgstr "qQ"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:407
+msgid "okay|okay"
+msgstr "okay|okay"
+
+#. TRANSLATORS: See doc/TRANSLATE about this string.
+#: util/miscutil.c:409
+msgid "cancel|cancel"
+msgstr "cancel|cancel"
+
+#: util/miscutil.c:410
+msgid "oO"
+msgstr "oO"
+
+#: util/miscutil.c:411
+msgid "cC"
+msgstr "cC"
+
+#: util/secmem.c:97
+msgid "WARNING: using insecure memory!\n"
+msgstr "警告: 正在使用不安全的記憶體!\n"
+
+#: util/secmem.c:98
+msgid "please see http://www.gnupg.org/faq.html for more information\n"
+msgstr "請參考 http://www.gnupg.org/faq.html 上進一步的資訊\n"
+
+#: util/secmem.c:351
+msgid "operation is not possible without initialized secure memory\n"
+msgstr "尚未啟用安全的記憶體前, 不可能進行操作\n"
+
+#: util/secmem.c:352
+msgid "(you may have used the wrong program for this task)\n"
+msgstr "(也許妳選錯程式來做這件事了)\n"
+
+#~ msgid ""
+#~ "a notation name must have only printable characters or spaces, and end "
+#~ "with an '='\n"
+#~ msgstr "標記名稱一定要採用可印出的字符或空白, 並以一個 '=' 來結尾\n"
+
+#~ msgid "a user notation name must contain the '@' character\n"
+#~ msgstr "使用者標記名稱一定要含有 '@' 字符\n"
+
+#~ msgid "a notation name must not contain more than one '@' character\n"
+#~ msgstr "使用者標記名稱不得含有兩個或更多的 '@' 字符\n"
+
+#~ msgid "a notation value must not use any control characters\n"
+#~ msgstr "標記值一定不能使用任何的控制字符\n"
+
+#~ msgid "WARNING: invalid notation data found\n"
+#~ msgstr "警告: 找到無效的標記資料\n"
+
+#~ msgid "not human readable"
+#~ msgstr "不是人類能讀得懂的"
+
+#~ msgid ""
+#~ "please see http://www.gnupg.org/why-not-idea.html for more information\n"
+#~ msgstr "請參考 http://www.gnupg.org/why-not-idea.html 取得更多資訊\n"
+
+#~ msgid "DSA requires the use of a 160 bit hash algorithm\n"
+#~ msgstr "DSA 要求使用 160 位元的雜湊演算法\n"
diff --git a/scripts/ChangeLog b/scripts/ChangeLog
new file mode 100644 (file)
index 0000000..a27ca1c
--- /dev/null
@@ -0,0 +1,503 @@
+2006-12-04  Werner Koch  <wk@g10code.com>
+
+       * mk-gpg-texi: Removed.
+
+2006-10-02  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: Don't uninstall winpt if the installer comes
+       without it.  I fixed it despite of what I said in bug 521.
+
+2006-09-13  Werner Koch  <wk@g10code.com>
+
+       * autogen.sh: Better detection of the cross compiler.
+
+2006-04-03  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: Install curl and not http keyserver helper.
+
+2006-04-03  Werner Koch  <wk@g10code.com>
+
+       * autogen.sh: Unsupport mingw32/cpd.
+
+2006-03-09  Werner Koch  <wk@g10code.com>
+
+       * config.sub, config.guess: Updated.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * w32installer.nsi: Don't use System.dll.
+
+       * autogen.sh (DIE): Add lost exit for --build-w32.
+
+2005-10-02  Marcus Brinkmann  <marcus@g10code.de>
+
+       * autogen.sh (DIE): Remove ugly hack for po dir suppression.
+
+2005-08-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Distribute gpg-zip.
+
+2005-05-31  Werner Koch  <wk@g10code.com>
+
+       * config.guess, config.sub, config.rpath: Updated from todays
+       gnulib CVS.
+
+2005-04-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: No longer any need to override libexecdir.  The
+       makefiles now calculate this correctly internally.
+
+2005-03-30  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: Allow including of WINPT source.  Include
+       libiconv source. 
+       * mk-w32-dist: Add code to detect presence of source.  Calculate a
+       build number; add option --build-number to overide.
+
+2005-03-14  Werner Koch  <wk@g10code.com>
+
+       * mk-w32-dist: Check for patch files.
+       * w32installer.nsi: Translated a few more strings.  Print a
+       warning if permssions are not suitable for the installation.
+       Add Uninstaller entries.
+
+2005-02-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Fix problem with storing the gpgkeys helpers in
+       libexec, but calling them in libexec/gnupg.
+
+2005-02-16  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: Added page to select the language.
+       * mk-w32-dist: Create the opt.ini using the available languages.
+
+2005-02-03  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: Display README.W32 at the end of the
+       installation.
+       * mk-w32-dist: Append .txt to README.W32.
+
+2005-01-26  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: Create a start menu entry and enhanced the
+       build environment.
+       * mk-w32-dist: Add more support for above.
+
+2005-01-11  Werner Koch  <wk@g10code.com>
+
+       * w32installer.nsi: New.
+       * mk-w32-dist: Append ".txt" to some files.  Call makensis if
+       available.
+
+2004-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * autogen.sh: automake needs --add-missing for conditional
+       CPPFLAGS build in keyserver/Makefile.am.
+
+2004-11-26  Werner Koch  <wk@g10code.com>
+
+       * autogen.sh (gettext_vers_num): Fix aclocal test.
+
+2004-10-27  Werner Koch  <wk@g10code.com>
+
+       * mk-w32-dist: Use utf-8 encoding for all MO files.
+
+2004-10-26  Werner Koch  <wk@g10code.com>
+
+       * autogen.sh: Detect the Debian mingw32 package.
+
+2004-10-18  Werner Koch  <wk@g10code.com>
+
+       * mk-gpg-texi: More fixups to help Debian's install-info.
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * mk-gpg-texi: Fix up the @setfilename lines.
+
+2004-10-01  Werner Koch  <wk@g10code.com>
+
+       * mk-w32-dist: Updated from stable branch. 
+
+       * mk-gpg-texi: Changed to use the newer docbook2x-texi utility.
+
+       * config.guess, config.sub, mkinstalldirs, missing
+       * depcomp, install-sh: Upgraded.
+
+2004-07-27  Werner Koch  <wk@g10code.de>
+
+       * autogen.sh: Updated to the moder version, grepping the required
+       tool versions from configure.ac.
+
+2004-06-14  Werner Koch  <wk@gnupg.org>
+
+       * mk-w32-dist: Do not include the en@* po files.
+
+       * autogen.sh <--build-w32>: Build keyserver helpers again.
+
+2004-04-02  Thomas Schwinge  <schwinge@nic-nac-project.de>
+
+       * autogen.sh: Added ACLOCAL_FLAGS.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * build-riscos, conf-riscos/*: Updated to reflect latest changes.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Updated required versions and add -I m4 to aclocal.
+
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * autogen.sh: Touch po/all for --build-w32.  From Werner on stable
+       branch.
+
+2003-08-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Rework much of the spec to use %-macros
+       throughout.  Fix to work properly with RPM 4.1 (all files in
+       buildroot must be packaged). Package and install info files. Tweak
+       the English description.  Do not install gpgv and gpgsplit setuid
+       root. Make sure that install-info is called in such a way that
+       doesn't bork the RPM install if it cannot complete (necessary for
+       some upgrade scenarios).
+
+2003-05-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * mk-w32-dist: Don't iconv {hu,sk,zh_TW}.po. (From wk on stable
+       branch)
+
+2003-04-08  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Add options to build for coldfire and uClinux.
+
+2003-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * distfiles, gnupg.spec.in: convert-from-106 is in the tools
+       directory now.
+
+       * convert-from-106: Move to the tools directory.
+
+2002-12-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * distfiles, gnupg.spec.in: Include convert-from-106.
+
+       * convert-from-106: Script to automate the 1.0.6->later
+       conversion.  It marks all secret keys as ultimately trusted, adds
+       the signature caches, and checks the trustdb.
+
+2002-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * mk-w32-dist: Don't use iconv for pl.po.  From Werner on stable
+       branch.
+
+       * mk-w32-dist: Include gpgkeys_ldap and gpgkeys_hkp.
+
+2002-11-12  Werner Koch  <wk@gnupg.org>
+
+       * config.sub, config.guess: Updated from ftp.gnu.org/gnu/config
+       to version 2002-11-08.
+
+2002-10-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Update source ftp path.
+
+2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/Makefile: Updated to reflect latest changes.
+
+2002-10-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/include/config.h: Updated to reflect latest changes.
+
+2002-10-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Use new path for keyserver helpers, /usr/lib is
+       no longer used for cipher/hash plugins, and include gpgv,
+       gpgsplit, and the new gnupg.7 man page.
+
+2002-10-17  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Allow env variables to override the auto* tool
+       names.  Suggested by Simon Josefsson.
+
+2002-09-11  Werner Koch  <wk@gnupg.org>
+
+       * distfiles: Include mk-w32-dist.
+
+       * mk-w32-dist: Convert the character sets on a per language base.
+
+2002-09-02  Werner Koch  <wk@gnupg.org>
+
+       * mk-w32-dist: Include more man pages and gpg split.  Changed name
+       of ZIP file to better indicate that this is a command line version.
+
+2002-08-23  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh : Don't run gettextize.
+
+2002-08-06  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/include/config.h: Changed #define FOO to
+       #define FOO 1.
+       * conf-riscos/include/g10defs.h: Likewise.
+
+2002-08-03  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/include/g10defs.h: Added GNUPG_LIBEXECDIR.
+       * conf-riscos/include/config.h: Changes due to dynload removal and
+       minor changes to avoid some warnings.
+       * conf-riscos/Makefile: Changes due to dynload removal.
+       * conf-riscos/cipher/*: Not needed anymore due to dynload removal.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupgbug: "Warning" -> "WARNING"
+
+2002-07-01  Werner Koch  <wk@gnupg.org>
+
+       * mk-gpg-texi: New.
+
+2002-06-30  Werner Koch  <wk@gnupg.org>
+
+       * mk-w32-dist (bindir): Fixes vor VPATH builds in a subdir,
+       include gpgv.
+
+2002-06-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/Makefile: Changes due to moving around RISC OS
+       specific stuff in the code.
+
+2002-06-07  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/include/config.h [__riscos__]: Fixed macro bug.
+
+2002-05-10  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/include/config.h [__riscos__]: Changes for later
+       Norcroft compilers.
+
+       * conf-riscos/Makefile [__riscos__]: Updated.
+
+2002-04-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * conf-riscos/include/config.h [__riscos__]: Development
+       versions automatically define DEBUG from now on.
+
+       * conf-riscos/Makefile [__riscos__]: Updated for LDAP keyserver
+       code.
+
+2002-04-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Removed pubring.asc and OPTIONS.  Added
+       samplekeys.asc.
+
+2002-03-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * gnupg.spec.in: Added the gpgkeys_xxx keyserver helpers.  Added a
+       * to catch variations on the basic gpg man page (gpg, gpgv).  Mark
+       options.skel as a config file.  Do not include the FAQ/faq.html
+       twice (in /doc/ and /share/).
+       
+2002-01-02  Stefan Bellon  <sbellon@sbellon.de>
+
+       * build-riscos [__riscos__]: Set filetype of Makefile correctly.
+
+       * conf-riscos/include/g10defs.h [__riscos__]: Added GNU GPL
+       header and exec code defines.
+
+       * conf-riscos/include/config.h [__riscos__]: Moved parts to
+       include/util.h where they really belong to.
+
+       * conf-riscos/Makefile [__riscos__]: Updated for new keyserver,
+       exec and photo id code.
+
+2001-12-22  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Fixed last change.
+
+2001-12-21  Werner Koch  <wk@gnupg.org>
+
+       * distfiles: Removed those files which which automake installs by
+       default.
+
+       * autogen.sh: Replaced $() by backticks for system without a posix
+       shell.  Removed gawk specific quoting. By David Champion.
+
+2001-10-22  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh (aclocal_vers): Require automalke 1.5.
+
+2001-08-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * build-riscos [__riscos__]: New.
+       * conf-riscos [__riscos__]: Ditto.
+
+2001-08-13  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Test on gettext 0.10.38. By Michael Engels.
+
+2001-08-07  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Adjusted --build-w32 for autoconf 2.52 
+
+2001-07-09  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh (autoconf_vers): Require autoconf 2.50
+
+2001-05-06  Werner Koch  <wk@gnupg.org>
+
+       * config.guess, config.sub: Add updates from subversions.gnu.org.
+
+2001-04-19  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: Add VPATH build support for option --build-w32. 
+
+2001-03-12  Werner Koch  <wk@gnupg.org>
+
+       * config.guess, config.sub: Replaced with the current GNU CVS ones. 
+
+2001-01-18  Werner Koch  <wk@gnupg.org>
+
+       * autogen.sh: New options --build-w32
+       * build-w32: Does now call autogen.sh
+
+2000-11-24  Werner Koch  <wk@gnupg.org>
+
+       * build-w32: New script to build the W32 version.
+       * distfiles: And put it into the distribution
+
+Thu Sep 14 17:45:11 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * gnupg.spec.in: Updated.
+
+Wed Sep  6 17:55:47 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * config.guess, config.sub: Replaced with the latest version from the
+        CVS archive.  Hope that does not break too much.
+
+Fri May 12 14:01:20 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * gnupg.spec.in: New version from Fabio with some updated descriptions.
+
+Mon May  1 15:38:04 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * gnupg.spec.in: New version from Fabio.
+
+Fri Mar 17 16:26:05 CET 2000  Werner Koch  <wk@openit.de>
+
+       * config.gues, config.sub: Support for s390-ibm-linux-gnu. Thanks
+       to Holger Smolinski.
+
+Thu Mar  2 15:37:46 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * config.guess: Add support for QNX.  By Sam Roberts.
+       * config.sub: Ditto.
+
+Thu Sep 23 09:49:25 1999  Werner Koch  (wk@gnupg.org)
+
+       * commit: Remove leading and trailing empty lines when copying
+       Changes to Changelog
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * gnupg.spec: Add Portuguese description
+
+Thu Sep  2 16:40:55 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mkdiff: changed format of diff file name and made script more
+       general.
+
+Wed Aug  4 10:34:18 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.guess: Updated from gnu/common and applied my emx patch again.
+       * config.sub: Updated from gnu/common.
+
+Wed Jul 14 19:42:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * ltmain.sh, ltconfig.sh : Updated to libtool 1.3.3
+
+Mon Jul 12 14:55:34 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * autogen.sh: Run libtoolize
+
+Sat May 22 22:47:26 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * autogen.sh: Fixed the error message for a missing libtool.
+
+Sat May  8 19:28:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mkinstalldirs, install-sh: New from GNU repository
+       * config.sub, config.guess: Merged with rep version.
+
+Sun Mar 14 19:34:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * autogen.sh: Add a check for libtool because some autoconf macros
+       are needed.
+
+Mon Feb 22 20:04:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * autogen.sh: Enhanced the version testing code (Philippe Laliberte)
+
+       * mkwebpage: Edits the buglist.
+
+Sat Feb 13 12:04:43 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * autogen.sh: Now uses gettextize
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.sub, config.guess: Support i386-emx-os2
+
+Sun Jan 17 11:04:33 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * autogen.sh: Now checks for installed gettext
+
+Sat Jan 16 09:27:30 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * config.guess (m68k-atari-mint): New.
+       * config.sub: Add support for atarist-MiNT
+
+Wed Jan 13 12:49:36 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * gnupg.spec.in: New
+       * gnupg.spec: Removed
+
+Wed Dec 23 13:18:14 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * gnupg.spec: Updated version by Fabio Coatti
+
+Thu Dec 17 18:31:15 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * gnupg.spec: New version by Reuben Sumner and did some more
+       changes.
+
+Fri Nov 27 12:39:29 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * commit: New
+
+
+Fri Nov 20 12:01:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mkdiff: signs the patch file
+
+Sat Oct 17 16:10:16 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * autogen.sh: New.
+
+Wed Oct 14 09:55:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * config.guess (FreeBSD): Changes from Jun Kuriyama to support ELF
+       * config.sub: (freebsd): Add to maybe_os
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+          2005  Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
diff --git a/scripts/autogen.sh b/scripts/autogen.sh
new file mode 100755 (executable)
index 0000000..232de14
--- /dev/null
@@ -0,0 +1,270 @@
+#!/bin/sh
+# Run this to generate all the initial makefiles, etc.
+#
+# Copyright (C) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+configure_ac="configure.ac"
+
+cvtver () {
+  awk 'NR==1 {split($NF,A,".");X=1000000*A[1]+1000*A[2]+A[3];print X;exit 0}'
+}
+
+check_version () {
+    if [ `("$1" --version || echo "0") | cvtver` -ge "$2" ]; then
+       return 0
+    fi
+    echo "**Error**: "\`$1\'" not installed or too old." >&2
+    echo '           Version '$3' or newer is required.' >&2
+    [ -n "$4" ] && echo '           Note that this is part of '\`$4\''.' >&2
+    DIE="yes"
+    return 1
+}
+
+# Allow to override the default tool names
+AUTOCONF=${AUTOCONF_PREFIX}${AUTOCONF:-autoconf}${AUTOCONF_SUFFIX}
+AUTOHEADER=${AUTOCONF_PREFIX}${AUTOHEADER:-autoheader}${AUTOCONF_SUFFIX}
+
+AUTOMAKE=${AUTOMAKE_PREFIX}${AUTOMAKE:-automake}${AUTOMAKE_SUFFIX}
+ACLOCAL=${AUTOMAKE_PREFIX}${ACLOCAL:-aclocal}${AUTOMAKE_SUFFIX}
+
+GETTEXT=${GETTEXT_PREFIX}${GETTEXT:-gettext}${GETTEXT_SUFFIX}
+MSGMERGE=${GETTEXT_PREFIX}${MSGMERGE:-msgmerge}${GETTEXT_SUFFIX}
+
+DIE=no
+
+# Used to cross-compile GnuPG for Windows.
+if test "$1" = "--build-w32"; then
+    tmp=`dirname $0`
+    tsdir=`cd "$tmp"; cd ..; pwd`
+    shift
+    if [ ! -f $tsdir/scripts/config.guess ]; then
+        echo "$tsdir/scripts/config.guess not found" >&2
+        exit 1
+    fi
+    build=`$tsdir/scripts/config.guess`
+
+    # Locate the cross compiler
+    crossbindir=
+    for host in i586-mingw32msvc i386-mingw32msvc; do
+        if ${host}-gcc --version >/dev/null 2>&1 ; then
+            crossbindir=/usr/${host}/bin
+            conf_CC="CC=${host}-gcc"
+            break;
+        fi
+    done
+    if [ -z "$crossbindir" ]; then
+        echo "Cross compiler kit not installed" >&2
+        echo "Under Debian GNU/Linux, you may install it using" >&2
+        echo "  apt-get install mingw32 mingw32-runtime mingw32-binutils" >&2 
+        echo "Stop." >&2
+        exit 1
+    fi
+   
+    if [ -f "$tsdir/config.log" ]; then
+        if ! head $tsdir/config.log | grep "$host" >/dev/null; then
+            echo "Please run a 'make distclean' first" >&2
+            exit 1
+        fi
+    fi
+
+    disable_foo_tests=""
+    if [ -n "$lib_config_files" ]; then
+        for i in $lib_config_files; do
+            j=`echo $i | tr '[a-z-]' '[A-Z_]'`
+            eval "$j=${crossbindir}/$i"
+            export $j
+            disable_foo_tests="$disable_foo_tests --disable-`echo $i| \
+                           sed 's,-config$,,'`-test"
+            if [ ! -f "${crossbindir}/$i" ]; then                   
+                echo "$i not installed for MingW32" >&2
+                DIE=yes
+            fi
+        done
+    fi
+    [ $DIE = yes ] && exit 1
+
+    $tsdir/configure ${conf_CC} --build=${build} --host=${host} \
+                ${disable_foo_tests}  $*
+    exit $?
+fi
+
+
+# This is the special case to build on a ColdFire platform under 
+# the uClinux kernel.  Tested on a MCF4249C3 board.
+if test "$1" = "--build-coldfire"; then
+    tmp=`dirname $0`
+    tsdir=`cd "$tmp"; cd ..; pwd`
+    shift
+    if [ $# -lt 1 ]; then
+      echo "usage: autogen.sh --build-coldfire <crossroot>" >&2
+      exit 1
+    fi
+    crossdir="$1"
+    shift
+
+    host=m68k-elf
+    crossprefix=${host}-
+    if [ ! -f $tsdir/scripts/config.guess ]; then
+        echo "$tsdir/scripts/config.guess not found" >&2
+        exit 1
+    fi
+    build=`$tsdir/scripts/config.guess`
+        
+    if [ -f "$tsdir/config.log" ]; then
+        if ! head $tsdir/config.log | grep m68k-elf >/dev/null; then
+            echo "Pease run a 'make distclean' first" >&2
+            exit 1
+        fi
+    fi
+
+    crossbindir=$crossdir/bin
+    CC=${crossbindir}/${crossprefix}gcc
+    CPP=${crossbindir}/cpp
+    AR=${crossbindir}/${crossprefix}ar
+    RANLIB=${crossbindir}/${crossprefix}ranlib
+
+    CFLAGS="-Os -g -fomit-frame-pointer"
+    CFLAGS="$CFLAGS -m5307 -DCONFIG_COLDFIRE"
+    CFLAGS="$CFLAGS -Dlinux -D__linux__ -Dunix -D__uClinux__ -DEMBED"
+    CFLAGS="$CFLAGS -fno-builtin -msep-data"
+    LDFLAGS="-Wl,-elf2flt -Wl,-move-rodata -nostartfiles"
+    LDFLAGS="$LDFLAGS ${crossdir}/m68k-elf/lib/crt0.o"
+    LIBS="-lc"
+
+    disable_foo_tests=""
+    if [ -n "$lib_config_files" ]; then
+        for i in $lib_config_files; do
+            j=`echo $i | tr '[a-z-]' '[A-Z_]'`
+            eval "$j=${crossbindir}/$i"
+            export $j
+            disable_foo_tests="$disable_foo_tests --disable-`echo $i| \
+                           sed 's,-config$,,'`-test"
+            if [ ! -f "${crossbindir}/$i" ]; then                   
+                echo "$i not installed for ColdFire" >&2
+                DIE=yes
+            fi
+        done
+    fi
+    [ $DIE = yes ] && exit 1
+
+    $tsdir/configure --build=${build} --host=${host} \
+                ${disable_foo_tests} \
+                --disable-dynload \
+                --disable-exec \
+                --disable-photo-viewers \
+                --disable-keyserver-helpers \
+                --disable-ldap \
+                --disable-mailto \
+                --disable-largefile \
+                --disable-asm \
+                --disable-nls $* \
+                CC="$CC" CPP="$CPP" AR="$AR" RANLIB="$RANLIB" \
+                CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" LIBS="$LIBS"
+    exit $?
+fi
+
+
+# This is the special case to build on a ColdFire platform under 
+# the uClinux kernel with uClinux-dist.  Tested on a MCF4249C3 board.
+if test "$1" = "--build-uclinux"; then
+    tmp=`dirname $0`
+    tsdir=`cd "$tmp"; cd ..; pwd`
+    shift
+
+    if [ ! -f $tsdir/scripts/config.guess ]; then
+        echo "$tsdir/scripts/config.guess not found" >&2
+        exit 1
+    fi
+    build=`$tsdir/scripts/config.guess`
+    host=m68k-elf
+        
+    if [ -f "$tsdir/config.log" ]; then
+        if ! head $tsdir/config.log | grep m68k-elf >/dev/null; then
+            echo "Please run a 'make distclean' first" >&2
+            exit 1
+        fi
+    fi
+
+    $tsdir/configure --build=${build} --host=${host} \
+                ${disable_foo_tests} \
+                --disable-dynload \
+                --disable-exec \
+                --disable-photo-viewers \
+                --disable-keyserver-helpers \
+                --disable-ldap \
+                --disable-mailto \
+                --disable-largefile \
+                --disable-asm \
+               --disable-nls $* \
+                CC="$CC" CPP="$CPP" AR="$AR" RANLIB="$RANLIB" \
+                CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" LIBS="$LDLIBS"
+    exit $?
+fi
+
+
+# Grep the required versions from configure.ac
+autoconf_vers=`sed -n '/^AC_PREREQ(/ { 
+s/^.*(\(.*\))/\1/p
+q
+}' ${configure_ac}`
+autoconf_vers_num=`echo "$autoconf_vers" | cvtver`
+
+automake_vers=`sed -n '/^min_automake_version=/ { 
+s/^.*="\(.*\)"/\1/p
+q
+}' ${configure_ac}`
+automake_vers_num=`echo "$automake_vers" | cvtver`
+
+gettext_vers=`sed -n '/^AM_GNU_GETTEXT_VERSION(/ { 
+s/^.*(\(.*\))/\1/p
+q
+}' ${configure_ac}`
+gettext_vers_num=`echo "$gettext_vers" | cvtver`
+
+
+if [ -z "$autoconf_vers" -o -z "$automake_vers" -o -z "$gettext_vers" ]
+then
+  echo "**Error**: version information not found in "\`${configure_ac}\'"." >&2
+  exit 1
+fi
+
+
+if check_version $AUTOCONF $autoconf_vers_num $autoconf_vers ; then
+    check_version $AUTOHEADER $autoconf_vers_num $autoconf_vers autoconf
+fi
+if check_version $AUTOMAKE $automake_vers_num $automake_vers; then
+  check_version $ACLOCAL $automake_vers_num $automake_vers automake
+fi
+if check_version $GETTEXT $gettext_vers_num $gettext_vers; then
+  check_version $MSGMERGE $gettext_vers_num $gettext_vers gettext
+fi
+
+if test "$DIE" = "yes"; then
+    cat <<EOF
+
+Note that you may use alternative versions of the tools by setting 
+the corresponding environment variables; see README.CVS for details.
+                   
+EOF
+    exit 1
+fi
+
+
+echo "Running aclocal -I m4 ${ACLOCAL_FLAGS:+$ACLOCAL_FLAGS }..."
+$ACLOCAL -I m4 $ACLOCAL_FLAGS
+echo "Running autoheader..."
+$AUTOHEADER
+echo "Running automake --gnu --add-missing..."
+$AUTOMAKE --gnu --add-missing;
+echo "Running autoconf..."
+$AUTOCONF
+
+echo "You may now run \"./configure --enable-maintainer-mode && make\"."
diff --git a/scripts/build-w32 b/scripts/build-w32
new file mode 100755 (executable)
index 0000000..9995a48
--- /dev/null
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+exec scripts/autogen.sh --build-w32
+
+
+
diff --git a/scripts/compile b/scripts/compile
new file mode 100755 (executable)
index 0000000..3d21703
--- /dev/null
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2004-10-12.08
+
+# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program 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 2, or (at your option)
+# any later version.
+#
+# This program 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand `-c -o'.
+Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file `INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit 0
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit 0
+    ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+       # configure might choose to run compile as `compile cc -o foo foo.c'.
+       # So we strip `-o arg' only if arg is an object.
+       eat=1
+       case $2 in
+         *.o | *.obj)
+           ofile=$2
+           ;;
+         *)
+           set x "$@" -o "$2"
+           shift
+           ;;
+       esac
+       ;;
+      *.c)
+       cfile=$1
+       set x "$@" "$1"
+       shift
+       ;;
+      *)
+       set x "$@" "$1"
+       shift
+       ;;
+    esac
+  fi
+  shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+  # If no `-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # `.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use `[/.-]' here to ensure that we don't use the same name
+# that we are using for the .o file.  Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
+while true; do
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+  mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/scripts/config.guess b/scripts/config.guess
new file mode 100755 (executable)
index 0000000..c38553d
--- /dev/null
@@ -0,0 +1,1497 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2006-02-23'
+
+# This file 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; break ;
+         fi ;
+       done ;
+       if test x"$CC_FOR_BUILD" = x ; then
+         CC_FOR_BUILD=no_compiler_found ;
+       fi
+       ;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+       # NetBSD (nbsd) targets should (where applicable) match one or
+       # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+       # *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+       # switched to ELF, *-*-netbsd* would select the old
+       # object file format.  This provides both forward
+       # compatibility and a consistent mechanism for selecting the
+       # object file format.
+       #
+       # Note: NetBSD doesn't particularly care about the vendor
+       # portion of the name.  We always set it to "unknown".
+       sysctl="sysctl -n hw.machine_arch"
+       UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-unknown ;;
+           *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+       esac
+       # The Operating System including object format, if it has switched
+       # to ELF recently, or will in the future.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               then
+                   # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+                   # Return netbsd for either.  FIX?
+                   os=netbsd
+               else
+                   os=netbsdelf
+               fi
+               ;;
+           *)
+               os=netbsd
+               ;;
+       esac
+       # The OS release
+       # Debian GNU/NetBSD machines have a different userland, and
+       # thus, need a distinct triplet. However, they do not need
+       # kernel version information, so it can be replaced with a
+       # suitable tag, in the style of linux-gnu.
+       case "${UNAME_VERSION}" in
+           Debian*)
+               release='-gnu'
+               ;;
+           *)
+               release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+               ;;
+       esac
+       # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+       # contains redundant information, the shorter form:
+       # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+       echo "${machine}-${os}${release}"
+       exit ;;
+    *:OpenBSD:*:*)
+       UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+       echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+       exit ;;
+    *:ekkoBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+       exit ;;
+    *:SolidBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+       exit ;;
+    macppc:MirBSD:*:*)
+       echo powerppc-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    *:MirBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+       exit ;;
+    alpha:OSF1:*:*)
+       case $UNAME_RELEASE in
+       *4.0)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+               ;;
+       *5.*)
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+               ;;
+       esac
+       # According to Compaq, /usr/sbin/psrinfo has been available on
+       # OSF/1 and Tru64 systems produced since 1995.  I hope that
+       # covers most systems running today.  This code pipes the CPU
+       # types through head -n 1, so we only detect the type of CPU 0.
+       ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+       case "$ALPHA_CPU_TYPE" in
+           "EV4 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "EV4.5 (21064)")
+               UNAME_MACHINE="alpha" ;;
+           "LCA4 (21066/21068)")
+               UNAME_MACHINE="alpha" ;;
+           "EV5 (21164)")
+               UNAME_MACHINE="alphaev5" ;;
+           "EV5.6 (21164A)")
+               UNAME_MACHINE="alphaev56" ;;
+           "EV5.6 (21164PC)")
+               UNAME_MACHINE="alphapca56" ;;
+           "EV5.7 (21164PC)")
+               UNAME_MACHINE="alphapca57" ;;
+           "EV6 (21264)")
+               UNAME_MACHINE="alphaev6" ;;
+           "EV6.7 (21264A)")
+               UNAME_MACHINE="alphaev67" ;;
+           "EV6.8CB (21264C)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8AL (21264B)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.8CX (21264D)")
+               UNAME_MACHINE="alphaev68" ;;
+           "EV6.9A (21264/EV69A)")
+               UNAME_MACHINE="alphaev69" ;;
+           "EV7 (21364)")
+               UNAME_MACHINE="alphaev7" ;;
+           "EV7.9 (21364A)")
+               UNAME_MACHINE="alphaev79" ;;
+       esac
+       # A Pn.n version is a patched version.
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit ;;
+    *:z/VM:*:*)
+       echo s390-ibm-zvmoe
+       exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+       exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+       echo arm-unknown-riscos
+       exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit ;;
+    DRS?6000:unix:4.0:6*)
+       echo sparc-icl-nx6
+       exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7; exit ;;
+       esac ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+       echo m68k-apple-machten${UNAME_RELEASE}
+       exit ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+       int main (int argc, char *argv[]) {
+#else
+       int main (argc, argv) int argc; char *argv[]; {
+#endif
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c &&
+         dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+         SYSTEM_NAME=`$dummy $dummyarg` &&
+           { echo "$SYSTEM_NAME"; exit; }
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${TARGET_BINARY_INTERFACE}x = x ]
+           then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+           else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+           fi
+       else
+           echo i586-dg-dgux${UNAME_RELEASE}
+       fi
+       exit ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+       exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit ;;
+    ia64:AIX:*:*)
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $set_cc_for_build
+               sed 's/^                //' << EOF >$dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+               then
+                       echo "$SYSTEM_NAME"
+               else
+                       echo rs6000-ibm-aix3.2.5
+               fi
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit ;;
+    *:AIX:*:[45])
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit ;;
+    9000/[34678]??:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/[678][0-9][0-9])
+               if [ -x /usr/bin/getconf ]; then
+                   sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                         '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+               fi
+               if [ "${HP_ARCH}" = "" ]; then
+                   eval $set_cc_for_build
+                   sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #include <stdlib.h>
+              #include <unistd.h>
+
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+
+                  switch (cpu)
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0:
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits)
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+                   (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+                   test -z "$HP_ARCH" && HP_ARCH=hppa
+               fi ;;
+       esac
+       if [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           eval $set_cc_for_build
+
+           # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+           # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+           # generating 64-bit code.  GNU and HP use different nomenclature:
+           #
+           # $ CC_FOR_BUILD=cc ./config.guess
+           # => hppa2.0w-hp-hpux11.23
+           # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+           # => hppa64-hp-hpux11.23
+
+           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+               grep __LP64__ >/dev/null
+           then
+               HP_ARCH="hppa2.0w"
+           else
+               HP_ARCH="hppa64"
+           fi
+       fi
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit ;;
+    3050*:HI-UX:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+               { echo "$SYSTEM_NAME"; exit; }
+       echo unknown-hitachi-hiuxwe2
+       exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+             -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    *:UNICOS/mp:*:*)
+       echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+       FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+       exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit ;;
+    *:FreeBSD:*:*)
+       case ${UNAME_MACHINE} in
+           pc98)
+               echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+           *)
+               echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+       esac
+       exit ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit ;;
+    i*:MSYS_NT-*:*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit ;;
+    i*:windows32*:*)
+       # uname -m includes "-pc" on this system.
+       echo ${UNAME_MACHINE}-mingw32
+       exit ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit ;;
+    x86:Interix*:[345]*)
+       echo i586-pc-interix${UNAME_RELEASE}
+       exit ;;
+    EM64T:Interix*:[345]*)
+       echo x86_64-unknown-interix${UNAME_RELEASE}
+       exit ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+       echo x86_64-unknown-cygwin
+       exit ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit ;;
+    *:GNU:*:*)
+       # the GNU system
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit ;;
+    *:GNU/*:*:*)
+       # other systems with GNU libc and userland
+       echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+       exit ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    cris:Linux:*:*)
+       echo cris-axis-linux-gnu
+       exit ;;
+    crisv32:Linux:*:*)
+       echo crisv32-axis-linux-gnu
+       exit ;;
+    frv:Linux:*:*)
+       echo frv-unknown-linux-gnu
+       exit ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m32r*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    mips:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mipsel
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+           /^CPU/{
+               s: ::g
+               p
+           }'`"
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       ;;
+    mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips64
+       #undef mips64el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mips64el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips64
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+           /^CPU/{
+               s: ::g
+               p
+           }'`"
+       test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+       ;;
+    or32:Linux:*:*)
+       echo or32-unknown-linux-gnu
+       exit ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+         EV5)   UNAME_MACHINE=alphaev5 ;;
+         EV56)  UNAME_MACHINE=alphaev56 ;;
+         PCA56) UNAME_MACHINE=alphapca56 ;;
+         PCA57) UNAME_MACHINE=alphapca56 ;;
+         EV6)   UNAME_MACHINE=alphaev6 ;;
+         EV67)  UNAME_MACHINE=alphaev67 ;;
+         EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+       objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+       # Look for CPU level
+       case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+         PA7*) echo hppa1.1-unknown-linux-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit ;;
+    sh64*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit ;;
+    vax:Linux:*:*)
+       echo ${UNAME_MACHINE}-dec-linux-gnu
+       exit ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit ;;
+    i*86:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us. cd to the root directory to prevent
+       # problems with other programs or directories called `ld' in the path.
+       # Set LC_ALL=C to ensure ld outputs messages in English.
+       ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+                        | sed -ne '/supported targets:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported targets: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_targets" in
+         elf32-i386)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         a.out-i386-linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit ;;
+         coff-i386)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit ;;
+         "")
+               # Either a pre-BFD a.out linker (linux-gnuoldld) or
+               # one that does not give us useful --help.
+               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+               exit ;;
+       esac
+       # Determine whether the default compiler is a.out or elf
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #ifdef __ELF__
+       # ifdef __GLIBC__
+       #  if __GLIBC__ >= 2
+       LIBC=gnu
+       #  else
+       LIBC=gnulibc1
+       #  endif
+       # else
+       LIBC=gnulibc1
+       # endif
+       #else
+       #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+       LIBC=gnu
+       #else
+       LIBC=gnuaout
+       #endif
+       #endif
+       #ifdef __dietlibc__
+       LIBC=dietlibc
+       #endif
+EOF
+       eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+           /^LIBC/{
+               s: ::g
+               p
+           }'`"
+       test x"${LIBC}" != x && {
+               echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+               exit
+       }
+       test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+       ;;
+    i*86:DYNIX/ptx:4*:*)
+       # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+       # earlier versions are messed up and put the nodename in both
+       # sysname and nodename.
+       echo i386-sequent-sysv4
+       exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit ;;
+    i*86:OS/2:*:*)
+       # If we were able to find `uname', then EMX Unix compatibility
+       # is probably installed.
+       echo ${UNAME_MACHINE}-pc-os2-emx
+       exit ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit ;;
+    i*86:syllable:*:*)
+       echo ${UNAME_MACHINE}-pc-syllable
+       exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+       UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+       fi
+       exit ;;
+    i*86:*:5:[678]*)
+       # UnixWare 7.x, OpenUNIX and OpenServer 6.
+       case `/bin/uname -X | grep "^Machine"` in
+           *486*)           UNAME_MACHINE=i486 ;;
+           *Pentium)        UNAME_MACHINE=i586 ;;
+           *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+       esac
+       echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+       exit ;;
+    i*86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+                       && UNAME_MACHINE=i686
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit ;;
+    pc:*:*:*)
+       # Left here for compatibility:
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit ;;
+    M68*:*:R3V[5678]*:*)
+       test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit ;;
+    i*86:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo ${UNAME_MACHINE}-stratus-vos
+       exit ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit ;;
+    *:Darwin:*:*)
+       UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+       case $UNAME_PROCESSOR in
+           unknown) UNAME_PROCESSOR=powerpc ;;
+       esac
+       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+       exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+       UNAME_PROCESSOR=`uname -p`
+       if test "$UNAME_PROCESSOR" = "x86"; then
+               UNAME_PROCESSOR=i386
+               UNAME_MACHINE=pc
+       fi
+       echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+       exit ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+       echo nse-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+       exit ;;
+    *:DragonFly:*:*)
+       echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit ;;
+    *:*VMS:*:*)
+       UNAME_MACHINE=`(uname -p) 2>/dev/null`
+       case "${UNAME_MACHINE}" in
+           A*) echo alpha-dec-vms ; exit ;;
+           I*) echo ia64-dec-vms ; exit ;;
+           V*) echo vax-dec-vms ; exit ;;
+       esac ;;
+    *:XENIX:*:SysV)
+       echo i386-pc-xenix
+       exit ;;
+    i*86:skyos:*:*)
+       echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+       exit ;;
+    i*86:rdos:*:*)
+       echo ${UNAME_MACHINE}-pc-rdos
+       exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+       { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit ;;
+    c34*)
+       echo c34-convex-bsd
+       exit ;;
+    c38*)
+       echo c38-convex-bsd
+       exit ;;
+    c4*)
+       echo c4-convex-bsd
+       exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/scripts/config.rpath b/scripts/config.rpath
new file mode 100755 (executable)
index 0000000..3f1bef3
--- /dev/null
@@ -0,0 +1,571 @@
+#! /bin/sh
+# Output a system dependent set of variables, describing how to set the
+# run time search path of shared libraries in an executable.
+#
+#   Copyright 1996-2005 Free Software Foundation, Inc.
+#   Taken from GNU libtool, 2001
+#   Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+#   This file is free software; the Free Software Foundation gives
+#   unlimited permission to copy and/or distribute it, with or without
+#   modifications, as long as this notice is preserved.
+#
+# The first argument passed to this file is the canonical host specification,
+#    CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or
+#    CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
+# should be set by the caller.
+#
+# The set of defined variables is at the end of this script.
+
+# Known limitations:
+# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
+#   than 256 bytes, otherwise the compiler driver will dump core. The only
+#   known workaround is to choose shorter directory names for the build
+#   directory and/or the installation directory.
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+shrext=.so
+
+host="$1"
+host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+cc_basename=`echo "$CC" | sed -e 's%^.*/%%'`
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+  wl='-Wl,'
+else
+  case "$host_os" in
+    aix*)
+      wl='-Wl,'
+      ;;
+    darwin*)
+      case "$cc_basename" in
+        xlc*)
+          wl='-Wl,'
+          ;;
+      esac
+      ;;
+    mingw* | pw32* | os2*)
+      ;;
+    hpux9* | hpux10* | hpux11*)
+      wl='-Wl,'
+      ;;
+    irix5* | irix6* | nonstopux*)
+      wl='-Wl,'
+      ;;
+    newsos6)
+      ;;
+    linux*)
+      case $cc_basename in
+        icc* | ecc*)
+          wl='-Wl,'
+          ;;
+        pgcc | pgf77 | pgf90)
+          wl='-Wl,'
+          ;;
+        ccc*)
+          wl='-Wl,'
+          ;;
+        como)
+          wl='-lopt='
+          ;;
+      esac
+      ;;
+    osf3* | osf4* | osf5*)
+      wl='-Wl,'
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      wl='-Wl,'
+      ;;
+    sunos4*)
+      wl='-Qoption ld '
+      ;;
+    sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+      wl='-Wl,'
+      ;;
+    sysv4*MP*)
+      ;;
+    unicos*)
+      wl='-Wl,'
+      ;;
+    uts4*)
+      ;;
+  esac
+fi
+
+# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS.
+
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+
+case "$host_os" in
+  cygwin* | mingw* | pw32*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+  case "$host_os" in
+    aix3* | aix4* | aix5*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+        ld_shlibs=no
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+      # that the semantics of dynamic libraries on AmigaOS, at least up
+      # to version 4, is to share data among multiple programs linked
+      # with the same dynamic library.  Since this doesn't match the
+      # behavior of shared libraries on other platforms, we cannot use
+      # them.
+      ld_shlibs=no
+      ;;
+    beos*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    cygwin* | mingw* | pw32*)
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    netbsd*)
+      ;;
+    solaris* | sysv5*)
+      if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+        ld_shlibs=no
+      elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    sunos4*)
+      hardcode_direct=yes
+      ;;
+    linux*)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+    *)
+      if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+        :
+      else
+        ld_shlibs=no
+      fi
+      ;;
+  esac
+  if test "$ld_shlibs" = yes; then
+    # Unlike libtool, we use -rpath here, not --rpath, since the documented
+    # option of GNU ld is called -rpath, not --rpath.
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+  fi
+else
+  case "$host_os" in
+    aix3*)
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes; then
+        # Neither direct hardcoding nor static linking is supported with a
+        # broken collect2.
+        hardcode_direct=unsupported
+      fi
+      ;;
+    aix4* | aix5*)
+      if test "$host_cpu" = ia64; then
+        # On IA64, the linker does run time linking by default, so we don't
+        # have to do anything special.
+        aix_use_runtimelinking=no
+      else
+        aix_use_runtimelinking=no
+        # Test if we are trying to use run time linking or normal
+        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+        # need to do runtime linking.
+        case $host_os in aix4.[23]|aix4.[23].*|aix5*)
+          for ld_flag in $LDFLAGS; do
+            if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+              aix_use_runtimelinking=yes
+              break
+            fi
+          done
+        esac
+      fi
+      hardcode_direct=yes
+      hardcode_libdir_separator=':'
+      if test "$GCC" = yes; then
+        case $host_os in aix4.[012]|aix4.[012].*)
+          collect2name=`${CC} -print-prog-name=collect2`
+          if test -f "$collect2name" && \
+            strings "$collect2name" | grep resolve_lib_name >/dev/null
+          then
+            # We have reworked collect2
+            hardcode_direct=yes
+          else
+            # We have old collect2
+            hardcode_direct=unsupported
+            hardcode_minus_L=yes
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_libdir_separator=
+          fi
+        esac
+      fi
+      # Begin _LT_AC_SYS_LIBPATH_AIX.
+      echo 'int main () { return 0; }' > conftest.c
+      ${CC} ${LDFLAGS} conftest.c -o conftest
+      aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      if test -z "$aix_libpath"; then
+        aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
+}'`
+      fi
+      if test -z "$aix_libpath"; then
+        aix_libpath="/usr/lib:/lib"
+      fi
+      rm -f conftest.c conftest
+      # End _LT_AC_SYS_LIBPATH_AIX.
+      if test "$aix_use_runtimelinking" = yes; then
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+      else
+        if test "$host_cpu" = ia64; then
+          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+        else
+          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        fi
+      fi
+      ;;
+    amigaos*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      # see comment about different semantics on the GNU ld section
+      ld_shlibs=no
+      ;;
+    bsdi[45]*)
+      ;;
+    cygwin* | mingw* | pw32*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      hardcode_libdir_flag_spec=' '
+      libext=lib
+      ;;
+    darwin* | rhapsody*)
+      hardcode_direct=no
+      if test "$GCC" = yes ; then
+        :
+      else
+        case "$cc_basename" in
+          xlc*)
+            ;;
+          *)
+            ld_shlibs=no
+            ;;
+        esac
+      fi
+      ;;
+    dgux*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    freebsd1*)
+      ld_shlibs=no
+      ;;
+    freebsd2.2*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    freebsd2*)
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    freebsd* | kfreebsd*-gnu | dragonfly*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    hpux9*)
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      ;;
+    hpux10* | hpux11*)
+      if test "$with_gnu_ld" = no; then
+        case "$host_cpu" in
+          hppa*64*)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=no
+            ;;
+          ia64*)
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_direct=no
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+            hardcode_libdir_separator=:
+            hardcode_direct=yes
+            # hardcode_minus_L: Not really in the search PATH,
+            # but as the default location of the library.
+            hardcode_minus_L=yes
+            ;;
+        esac
+      fi
+      ;;
+    irix5* | irix6* | nonstopux*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    netbsd*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      ;;
+    newsos6)
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    openbsd*)
+      hardcode_direct=yes
+      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      else
+        case "$host_os" in
+          openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+            hardcode_libdir_flag_spec='-R$libdir'
+            ;;
+          *)
+            hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+            ;;
+        esac
+      fi
+      ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      ;;
+    osf3*)
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+    osf4* | osf5*)
+      if test "$GCC" = yes; then
+        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+        # Both cc and cxx compiler support -rpath directly
+        hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      hardcode_libdir_separator=:
+      ;;
+    sco3.2v5*)
+      ;;
+    solaris*)
+      hardcode_libdir_flag_spec='-R$libdir'
+      ;;
+    sunos4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      ;;
+    sysv4)
+      case $host_vendor in
+        sni)
+          hardcode_direct=yes # is this really true???
+          ;;
+        siemens)
+          hardcode_direct=no
+          ;;
+        motorola)
+          hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+          ;;
+      esac
+      ;;
+    sysv4.3*)
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+        ld_shlibs=yes
+      fi
+      ;;
+    sysv4.2uw2*)
+      hardcode_direct=yes
+      hardcode_minus_L=no
+      ;;
+    sysv5OpenUNIX8* | sysv5UnixWare7* |  sysv5uw[78]* | unixware7*)
+      ;;
+    sysv5*)
+      hardcode_libdir_flag_spec=
+      ;;
+    uts4*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      ;;
+    *)
+      ld_shlibs=no
+      ;;
+  esac
+fi
+
+# Check dynamic linker characteristics
+# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER.
+libname_spec='lib$name'
+case "$host_os" in
+  aix3*)
+    ;;
+  aix4* | aix5*)
+    ;;
+  amigaos*)
+    ;;
+  beos*)
+    ;;
+  bsdi[45]*)
+    ;;
+  cygwin* | mingw* | pw32*)
+    shrext=.dll
+    ;;
+  darwin* | rhapsody*)
+    shrext=.dylib
+    ;;
+  dgux*)
+    ;;
+  freebsd1*)
+    ;;
+  kfreebsd*-gnu)
+    ;;
+  freebsd*)
+    ;;
+  gnu*)
+    ;;
+  hpux9* | hpux10* | hpux11*)
+    case "$host_cpu" in
+      ia64*)
+        shrext=.so
+        ;;
+      hppa*64*)
+        shrext=.sl
+        ;;
+      *)
+        shrext=.sl
+        ;;
+    esac
+    ;;
+  irix5* | irix6* | nonstopux*)
+    case "$host_os" in
+      irix5* | nonstopux*)
+        libsuff= shlibsuff=
+        ;;
+      *)
+        case $LD in
+          *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
+          *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
+          *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
+          *) libsuff= shlibsuff= ;;
+        esac
+        ;;
+    esac
+    ;;
+  linux*oldld* | linux*aout* | linux*coff*)
+    ;;
+  linux*)
+    ;;
+  knetbsd*-gnu)
+    ;;
+  netbsd*)
+    ;;
+  newsos6)
+    ;;
+  nto-qnx*)
+    ;;
+  openbsd*)
+    ;;
+  os2*)
+    libname_spec='$name'
+    shrext=.dll
+    ;;
+  osf3* | osf4* | osf5*)
+    ;;
+  sco3.2v5*)
+    ;;
+  solaris*)
+    ;;
+  sunos4*)
+    ;;
+  sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+    ;;
+  sysv4*MP*)
+    ;;
+  uts4*)
+    ;;
+esac
+
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
+shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
+escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
+
+# How to pass a linker flag through the compiler.
+wl="$escaped_wl"
+
+# Static library suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally "so").
+shlibext="$shlibext"
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct="$hardcode_direct"
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L="$hardcode_minus_L"
+
+EOF
diff --git a/scripts/config.sub b/scripts/config.sub
new file mode 100755 (executable)
index 0000000..ad9f395
--- /dev/null
@@ -0,0 +1,1608 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+
+timestamp='2006-02-23'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple | -axis | -knuth | -cray)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco6)
+               os=-sco5v6
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco5v6*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | am33_2.0 \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | bfin \
+       | c4x | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k | iq2000 \
+       | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64vr | mips64vrel \
+       | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mips64vr5900 | mips64vr5900el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64r2 | mipsisa64r2el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | mt \
+       | msp430 \
+       | nios | nios2 \
+       | ns16k | ns32k \
+       | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \
+       | sparcv8 | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | tic4x | tic80 | tron \
+       | v850 | v850e \
+       | we32k \
+       | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+       | z8k)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m32c)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+       ms1)
+               basic_machine=mt-unknown
+               ;;
+
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i*86 | x86_64)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* \
+       | bfin-* | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+       | clipper-* | craynv-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* | iq2000-* \
+       | m32r-* | m32rle-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | maxq-* | mcore-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mips64vr5900-* | mips64vr5900el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64r2-* | mipsisa64r2el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | mmix-* \
+       | mt-* \
+       | msp430-* \
+       | nios-* | nios2-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \
+       | sparclite-* \
+       | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+       | tahoe-* | thumb-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tron-* \
+       | v850-* | v850e-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+       | xstormy16-* | xtensa-* \
+       | ymp-* \
+       | z8k-*)
+               ;;
+       m32c-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       abacus)
+               basic_machine=abacus-unknown
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amd64)
+               basic_machine=x86_64-pc
+               ;;
+       amd64-*)
+               basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       craynv)
+               basic_machine=craynv-cray
+               os=-unicosmp
+               ;;
+       cr16c)
+               basic_machine=cr16c-unknown
+               os=-elf
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       crisv32 | crisv32-* | etraxfs*)
+               basic_machine=crisv32-axis
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       crx)
+               basic_machine=crx-unknown
+               os=-elf
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       djgpp)
+               basic_machine=i586-pc
+               os=-msdosdjgpp
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       ms1-*)
+               basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       openrisc | openrisc-*)
+               basic_machine=or32-unknown
+               ;;
+       os400)
+               basic_machine=powerpc-ibm
+               os=-os400
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pc98)
+               basic_machine=i386-pc
+               ;;
+       pc98-*)
+               basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2 | pentiumiii | pentium3)
+               basic_machine=i686-pc
+               ;;
+       pentium4)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentium4-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rdos)
+               basic_machine=i386-pc
+               os=-rdos
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sei)
+               basic_machine=mips-sei
+               os=-seiux
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tic55x | c55x*)
+               basic_machine=tic55x-unknown
+               os=-coff
+               ;;
+       tic6x | c6x*)
+               basic_machine=tic6x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       tpf)
+               basic_machine=s390x-ibm
+               os=-tpf
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xbox)
+               basic_machine=i686-pc
+               os=-mingw32
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       w89k)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       mmix)
+               basic_machine=mmix-knuth
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
+               ;;
+       sparc | sparcv8 | sparcv9 | sparcv9b)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+             | -openbsd* | -solidbsd* \
+             | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+             | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+             | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+             | -skyos* | -haiku* | -rdos*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux-dietlibc)
+               os=-linux-dietlibc
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+        -os400*)
+               os=-os400
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -syllable*)
+               os=-syllable
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+        -tpf*)
+               os=-tpf
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -aros*)
+               os=-aros
+               ;;
+       -kaos*)
+               os=-kaos
+               ;;
+       -zvmoe)
+               os=-zvmoe
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+    c4x-* | tic4x-*)
+        os=-coff
+        ;;
+       # This must come before the *-dec entry.
+       pdp10-*)
+               os=-tops20
+               ;;
+       pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       mips*-cisco)
+               os=-elf
+               ;;
+       mips*-*)
+               os=-elf
+               ;;
+       or32-*)
+               os=-coff
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-haiku)
+               os=-haiku
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-knuth)
+               os=-mmixware
+               ;;
+       *-wec)
+               os=-proelf
+               ;;
+       *-winbond)
+               os=-proelf
+               ;;
+       *-oki)
+               os=-proelf
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-gould)
+               os=-sysv
+               ;;
+       *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+       *-sgi)
+               os=-irix
+               ;;
+       *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f30[01]-fujitsu | f700-fujitsu)
+               os=-uxpv
+               ;;
+       *-rom68k)
+               os=-coff
+               ;;
+       *-*bug)
+               os=-coff
+               ;;
+       *-apple)
+               os=-macos
+               ;;
+       *-atari*)
+               os=-mint
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -beos*)
+                               vendor=be
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -mpeix*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -os400*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -tpf*)
+                               vendor=ibm
+                               ;;
+                       -vxsim* | -vxworks* | -windiss*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+                       -hms*)
+                               vendor=hitachi
+                               ;;
+                       -mpw* | -macos*)
+                               vendor=apple
+                               ;;
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+                               vendor=atari
+                               ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/scripts/depcomp b/scripts/depcomp
new file mode 100755 (executable)
index 0000000..eed3cc9
--- /dev/null
@@ -0,0 +1,522 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2004-05-31.23
+
+# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+
+# This program 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 2, or (at your option)
+# any later version.
+
+# This program 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputing dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+    exit 0
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit 0
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> $depfile
+    echo >> $depfile
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> $depfile
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+  tmpdepfile="$stripped.u"
+  if test "$libtool" = yes; then
+    "$@" -Wc,-M
+  else
+    "$@" -M
+  fi
+  stat=$?
+
+  if test -f "$tmpdepfile"; then :
+  else
+    stripped=`echo "$stripped" | sed 's,^.*/,,'`
+    tmpdepfile="$stripped.u"
+  fi
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+
+  if test -f "$tmpdepfile"; then
+    outname="$stripped.o"
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # Dependencies are output in .lo.d with libtool 1.4.
+      # With libtool 1.5 they are output both in $dir.libs/$base.o.d
+      # and in $dir.libs/$base.o.d and $dir$base.o.d.  We process the
+      # latter, because the former will be cleaned when $dir.libs is
+      # erased.
+      tmpdepfile1="$dir.libs/$base.lo.d"
+      tmpdepfile2="$dir$base.o.d"
+      tmpdepfile3="$dir.libs/$base.d"
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1="$dir$base.o.d"
+      tmpdepfile2="$dir$base.d"
+      tmpdepfile3="$dir$base.d"
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+      exit $stat
+   fi
+
+   if test -f "$tmpdepfile1"; then
+      tmpdepfile="$tmpdepfile1"
+   elif test -f "$tmpdepfile2"; then
+      tmpdepfile="$tmpdepfile2"
+   else
+      tmpdepfile="$tmpdepfile3"
+   fi
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[   ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no
+  for arg in "$@"; do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test $1 != '--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o,
+  # because we must use -o when running libtool.
+  "$@" || exit $?
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+       set fnord "$@"
+       shift
+       shift
+       ;;
+    *)
+       set fnord "$@" "$arg"
+       shift
+       shift
+       ;;
+    esac
+  done
+  "$@" -E |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::   \1 \\:p' >> "$depfile"
+  echo "       " >> "$depfile"
+  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/scripts/distfiles b/scripts/distfiles
new file mode 100644 (file)
index 0000000..ddf15cd
--- /dev/null
@@ -0,0 +1,7 @@
+mkdiff
+build-w32
+gnupg.spec.in
+autogen.sh
+mk-w32-dist
+w32installer.nsi
+
diff --git a/scripts/gnupg.spec.in b/scripts/gnupg.spec.in
new file mode 100644 (file)
index 0000000..d4457cb
--- /dev/null
@@ -0,0 +1,212 @@
+#
+# gnupg -- gnu privacy guard
+# This is a template.  The dist target uses it to create the real file.
+#
+%define version @pkg_version@
+%define name gnupg
+Summary: GNU Utility for data encryption and digital signatures
+Summary(it): Utility GNU per la sicurezza nelle comunicazioni e nell'archiviazione dei dati.
+Summary(cs): GNU nástroj pro ¹ifrovanou komunikaci a bezpeèné ukládání dat
+Summary(fr): Utilitaire GNU de chiffrement et d'authentification des communications et des données
+Summary(pl): Narzedzie GNU do szyfrowania i podpisywania danych
+Vendor: GNU Privacy Guard Project
+Name: %{name}
+Version: %{version}
+Release: 1
+Copyright: GPL
+Group: Applications/Cryptography
+Group(cs): Aplikace/©ifrování
+Group(fr): Applications/Cryptographie
+Group(it): Applicazioni/Crittografia
+Source: ftp://ftp.gnupg.org/gcrypt/gnupg/%{name}-%{version}.tar.gz
+URL: http://www.gnupg.org/
+Provides: gpg openpgp
+Requires(post,preun): /sbin/install-info
+BuildRoot: %{_tmppath}/rpmbuild_%{name}-%{version}
+
+%changelog
+* Sun Aug 21 2005 David Shaw <dshaw@jabberwocky.com>
+- Distribute gpg-zip.
+
+* Fri Apr 22 2005 David Shaw <dshaw@jabberwocky.com>
+- No longer any need to override libexecdir.  The makefiles now
+  calculate this correctly internally.
+
+* Wed Feb 16 2005 David Shaw <dshaw@jabberwocky.com>
+- Fix problem with storing the gpgkeys helpers in libexec, but calling
+  them in libexec/gnupg.
+
+* Wed Jul 30 2003 David Shaw <dshaw@jabberwocky.com>
+- Rework much of the spec to use %-macros throughout.
+- Fix to work properly with RPM 4.1 (all files in buildroot must be packaged)
+- Package and install info files.
+- Tweak the English description.
+- There is no need to install gpgv and gpgsplit setuid root.
+
+* Sat Nov 30 2002 David Shaw <dshaw@jabberwocky.com>
+- Add convert-from-106 script
+
+* Sat Oct 26 2002 David Shaw <dshaw@jabberwocky.com>
+- Use new path for keyserver helpers.
+- /usr/lib is no longer used for cipher/hash plugins.
+- Include gpgv, gpgsplit, and the new gnupg.7 man page.
+
+* Fri Apr 19 2002 David Shaw <dshaw@jabberwocky.com>
+- Removed OPTIONS and pubring.asc - no longer used
+- Added doc/samplekeys.asc
+
+* Sun Mar 31 2002 David Shaw <dshaw@jabberwocky.com>
+- Added the gpgkeys_xxx keyserver helpers.
+- Added a * to catch variations on the basic gpg man page (gpg, gpgv).
+- Mark options.skel as a config file.
+- Do not include the FAQ/faq.html twice (in /doc/ and /share/).
+
+* Wed Sep 06 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Added Polish description and summary (Kindly provided by  
+  Lukasz Stelmach <stelmacl@ee.pw.edu.pl>)
+  
+* Thu Jul 13 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Added a * to catch all formats for man pages (plain, gz, bz2...)    
+
+* Mon May 01 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Some corrections in French description, thanks to Gaël Quéri
+  <gqueri@mail.dotcom.fr>; Some corrections to Italian descriptions.
+
+* Tue Apr 25 2000 Fabio Coatti <cova@ferrara.linux.it>
+- Removed the no longer needed patch for man page by Keith Owens
+
+* Wed Mar 1 2000 Petr Kri¹tof <Petr@Kristof.CZ> 
+- Czech descriptions added; some fixes and updates.
+
+* Sat Jan 15 2000 Keith Owens <kaos@ocs.com.au>
+- Add missing man page as separate patch instead of updating the tar file.
+
+* Mon Dec 27 1999 Fabio Coatti <cova@ferrara.linux.it> 
+- Upgraded for 1.0.1 (added missing gpg.1 man page)
+
+* Sat May 29 1999 Fabio Coatti <cova@ferrara.linux.it>
+- Some corrections in French description, thanks to Gaël Quéri <gqueri@mail.dotcom.fr>  
+
+* Mon May 17 1999 Fabio Coatti <cova@felix.unife.it>
+- Added French description, provided by 
+  Christophe Labouisse <labouiss@cybercable.fr>
+
+* Thu May 06 1999 Fabio Coatti <cova@felix.unife.it> 
+- Upgraded for 0.9.6 (removed gpgm)
+
+* Tue Jan 12 1999 Fabio Coatti <cova@felix.unife.it>
+- LINGUAS variable is now unset in configure to ensure that all languages will be built. (Thanks to Luca Olivetti <luca@luca.ddns.org>)
+* Sat Jan 02 1999 Fabio Coatti <cova@felix.unife.it>
+- Added pl language file.
+- Included g10/pubring.asc in documentation files.
+
+* Sat Dec 19 1998 Fabio Coatti <cova@felix.unife.it>
+- Modified the spec file provided by Caskey L. Dickson <caskey-at-technocage.com>
+- Now it can be built also by non-root. Installation has to be done as
+  root, gpg is suid.
+- Added some changes by  Ross Golder <rossigee@bigfoot.com>
+- Updates for version 0.4.5 of GnuPG (.mo files)
+
+%description
+
+GnuPG (GNU Privacy Guard) is a GNU utility for encrypting data and
+creating digital signatures. GnuPG has advanced key management
+capabilities and is compliant with the proposed OpenPGP Internet
+standard described in RFC-2440.  Since GnuPG doesn't use any patented
+algorithms, it is not compatible with some versions of PGP 2 which use
+only the patented IDEA algorithm.  See
+http://www.gnupg.org/why-not-idea.html for information on using IDEA
+if the patent does not apply to you and you need to be compatible with
+these versions of PGP 2.
+
+%description -l it
+GnuPG (GNU Privacy Guard) è una utility GNU per la cifratura di dati e
+la creazione di firme digitali. Possiede una gestione avanzata delle
+chiavi ed è conforme allo standard Internet OpenPGP, descritto nella
+RFC 2440. Non utilizzando algoritmi brevettati, non è compatibile con
+PGP2 (PGP2.x usa solo IDEA, coperto da brevetto mondiale, ed RSA,
+brevettato negli USA con scadenza 20/09/2000). Questi algoritmi sono
+utilizzabili da GnuPG tramite moduli esterni.
+
+%description -l fr
+GnuPG est un utilitaire GNU destiné à chiffrer des données et à créer
+des signatures électroniques. Il a des capacités avancées de gestion de
+clés et il est conforme à la norme proposée OpenPGP décrite dans la
+RFC2440. Comme GnuPG n'utilise pas d'algorithme breveté, il n'est
+compatible avec aucune version de PGP2 (PGP2.x ne sait utiliser que
+l'IDEA breveté dans le monde entier et RSA, breveté aux États-Unis
+jusqu'au 20 septembre 2000). 
+
+%description -l cs
+GnuPG je GNU nástroj pro bezpeènou komunikaci a ukládání dat. Mù¾e být
+pou¾it na ¹ifrování dat a vytváøení digitálních podpisù. Obsahuje
+funkce pro pokroèilou správu klíèù a vyhovuje navrhovanému OpenPGP
+Internet standardu podle RFC2440. Byl vytvoøen jako kompletní
+náhrada za PGP. Proto¾e neobsahuje ¹ifrovací algoritmy IDEA nebo RSA,
+mù¾e být pou¾íván bez omezení.
+Proto¾e GnuPG nepou¾ívá ¾ádný patentovaný algoritmus, nemù¾e být úplnì
+kompatibilní s PGP verze 2. PGP 2.x pou¾ívá algoritmy IDEA (patentováno
+celosvìtovì) a RSA (patentováno ve Spojených státech do 20. záøí
+2000). Tyto algoritmy lze zavést do GnuPG pomocí externích modulù.
+
+%description -l pl
+GnuPG (GNU Privacy Guard) jest nazedziem do szfrowania danych i tworzenia
+cyfrowych podpisów. GnuPG posiada zaawansowane mozliwosci obslugi kluczy
+i jest zgodne z OpenPGP, proponowanym standardem internetowym opisanym
+w RFC2440. Poniewaz GnuPG nie uzywa zadnych opatentowanych algorytmów
+nie jest wiec zgodne z jaka kolwiek wersja PGP2 (PGP2.x kozysta jedynie
+z algorytmów: IDEA, opatentowanego na calym swiecie, oraz RSA, którego
+patent na terenie Stanów Zjednoczonych wygasa 20 wrzesnia 2000).         
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+
+%setup
+
+%build
+if test -n "$LINGUAS"; then
+ unset LINGUAS
+fi    
+%configure --program-prefix=%{?_program_prefix:%{_program_prefix}}
+make
+
+%install
+%makeinstall
+%find_lang %{name}
+rm %{buildroot}%{_datadir}/%{name}/FAQ
+rm %{buildroot}%{_datadir}/%{name}/faq.html
+rm -f %{buildroot}%{_infodir}/dir
+
+%files -f %{name}.lang
+%defattr (-,root,root)
+
+%doc INSTALL AUTHORS COPYING NEWS README THANKS TODO PROJECTS doc/DETAILS
+%doc doc/FAQ doc/faq.html doc/HACKING doc/OpenPGP doc/samplekeys.asc
+%doc %attr (0755,root,root) tools/convert-from-106
+%config %{_datadir}/%{name}/options.skel
+%{_mandir}/man1/*
+%{_mandir}/man7/*
+%{_infodir}/gpg.info*
+%{_infodir}/gpgv.info*
+%attr (4755,root,root) %{_bindir}/gpg
+%attr (0755,root,root) %{_bindir}/gpgv
+%attr (0755,root,root) %{_bindir}/gpgsplit
+%attr (0755,root,root) %{_bindir}/gpg-zip
+%attr (0755,root,root) %{_libexecdir}/gnupg/*
+
+%post
+/sbin/install-info %{_infodir}/gpg.info %{_infodir}/dir 2>/dev/null || :
+/sbin/install-info %{_infodir}/gpgv.info %{_infodir}/dir 2>/dev/null || :
+
+%preun
+if [ $1 = 0 ]; then
+   /sbin/install-info --delete %{_infodir}/gpg.info \
+       %{_infodir}/dir 2>/dev/null || :
+   /sbin/install-info --delete %{_infodir}/gpgv.info \
+       %{_infodir}/dir 2>/dev/null || :
+fi
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+rm -rf $RPM_BUILD_DIR/%{name}-%{version}
diff --git a/scripts/install-sh b/scripts/install-sh
new file mode 100755 (executable)
index 0000000..0b65ee8
--- /dev/null
@@ -0,0 +1,323 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2004-10-22.00
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+chmodcmd="$chmodprog 0755"
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+no_target_directory=
+
+usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+-c         (ignored)
+-d         create directories instead of installing files.
+-g GROUP   $chgrpprog installed files to GROUP.
+-m MODE    $chmodprog installed files to MODE.
+-o USER    $chownprog installed files to USER.
+-s         $stripprog installed files.
+-t DIRECTORY  install into DIRECTORY.
+-T         report an error if DSTFILE is a directory.
+--help     display this help and exit.
+--version  display version info and exit.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+  case $1 in
+    -c) shift
+        continue;;
+
+    -d) dir_arg=true
+        shift
+        continue;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+        shift
+        shift
+        continue;;
+
+    --help) echo "$usage"; exit 0;;
+
+    -m) chmodcmd="$chmodprog $2"
+        shift
+        shift
+        continue;;
+
+    -o) chowncmd="$chownprog $2"
+        shift
+        shift
+        continue;;
+
+    -s) stripcmd=$stripprog
+        shift
+        continue;;
+
+    -t) dstarg=$2
+       shift
+       shift
+       continue;;
+
+    -T) no_target_directory=true
+       shift
+       continue;;
+
+    --version) echo "$0 $scriptversion"; exit 0;;
+
+    *)  # When -d is used, all remaining arguments are directories to create.
+       # When -t is used, the destination is already specified.
+       test -n "$dir_arg$dstarg" && break
+        # Otherwise, the last argument is the destination.  Remove it from $@.
+       for arg
+       do
+          if test -n "$dstarg"; then
+           # $@ is not empty: it contains at least $arg.
+           set fnord "$@" "$dstarg"
+           shift # fnord
+         fi
+         shift # arg
+         dstarg=$arg
+       done
+       break;;
+  esac
+done
+
+if test -z "$1"; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+for src
+do
+  # Protect names starting with `-'.
+  case $src in
+    -*) src=./$src ;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    src=
+
+    if test -d "$dst"; then
+      mkdircmd=:
+      chmodcmd=
+    else
+      mkdircmd=$mkdirprog
+    fi
+  else
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dstarg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+
+    dst=$dstarg
+    # Protect names starting with `-'.
+    case $dst in
+      -*) dst=./$dst ;;
+    esac
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dstarg: Is a directory" >&2
+       exit 1
+      fi
+      dst=$dst/`basename "$src"`
+    fi
+  fi
+
+  # This sed command emulates the dirname command.
+  dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
+
+  # Make sure that the destination directory exists.
+
+  # Skip lots of stat calls in the usual case.
+  if test ! -d "$dstdir"; then
+    defaultIFS='
+        '
+    IFS="${IFS-$defaultIFS}"
+
+    oIFS=$IFS
+    # Some sh's can't handle IFS=/ for some reason.
+    IFS='%'
+    set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+    shift
+    IFS=$oIFS
+
+    pathcomp=
+
+    while test $# -ne 0 ; do
+      pathcomp=$pathcomp$1
+      shift
+      if test ! -d "$pathcomp"; then
+        $mkdirprog "$pathcomp"
+       # mkdir can fail with a `File exist' error in case several
+       # install-sh are creating the directory concurrently.  This
+       # is OK.
+       test -d "$pathcomp" || exit
+      fi
+      pathcomp=$pathcomp/
+    done
+  fi
+
+  if test -n "$dir_arg"; then
+    $doit $mkdircmd "$dst" \
+      && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
+
+  else
+    dstfile=`basename "$dst"`
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+    trap '(exit $?); exit' 1 2 13 15
+
+    # Copy the file name to the temp name.
+    $doit $cpprog "$src" "$dsttmp" &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
+      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
+      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
+      && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
+
+    # Now rename the file to the real destination.
+    { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
+      || {
+          # The rename failed, perhaps because mv can't rename something else
+          # to itself, or perhaps because mv is so ancient that it does not
+          # support -f.
+
+          # Now remove or move aside any old file at destination location.
+          # We try this two ways since rm can't unlink itself on some
+          # systems and the destination file might be busy for other
+          # reasons.  In this case, the final cleanup might fail but the new
+          # file should still install successfully.
+          {
+            if test -f "$dstdir/$dstfile"; then
+              $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
+              || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
+              || {
+                echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+                (exit 1); exit
+              }
+            else
+              :
+            fi
+          } &&
+
+          # Now rename the file to the real destination.
+          $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+        }
+    }
+  fi || { (exit 1); exit; }
+done
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+{
+  (exit 0); exit
+}
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/scripts/mdate-sh b/scripts/mdate-sh
new file mode 100755 (executable)
index 0000000..b610b47
--- /dev/null
@@ -0,0 +1,133 @@
+#!/bin/sh
+# Get modification time of a file or directory and pretty-print it.
+# Copyright (C) 1995, 1996, 1997, 2003  Free Software Foundation, Inc.
+# written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, June 1995
+#
+# This program 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 2, or (at your option)
+# any later version.
+#
+# This program 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, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Prevent date giving response in another language.
+LANG=C
+export LANG
+LC_ALL=C
+export LC_ALL
+LC_TIME=C
+export LC_TIME
+
+save_arg1="$1"
+
+# Find out how to get the extended ls output of a file or directory.
+if ls -L /dev/null 1>/dev/null 2>&1; then
+  ls_command='ls -L -l -d'
+else
+  ls_command='ls -l -d'
+fi
+
+# A `ls -l' line looks as follows on OS/2.
+#  drwxrwx---        0 Aug 11  2001 foo
+# This differs from Unix, which adds ownership information.
+#  drwxrwx---   2 root  root      4096 Aug 11  2001 foo
+#
+# To find the date, we split the line on spaces and iterate on words
+# until we find a month.  This cannot work with files whose owner is a
+# user named `Jan', or `Feb', etc.  However, it's unlikely that `/'
+# will be owned by a user whose name is a month.  So we first look at
+# the extended ls output of the root directory to decide how many
+# words should be skipped to get the date.
+
+# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below.
+set - x`$ls_command /`
+
+# Find which argument is the month.
+month=
+command=
+until test $month
+do
+  shift
+  # Add another shift to the command.
+  command="$command shift;"
+  case $1 in
+    Jan) month=January; nummonth=1;;
+    Feb) month=February; nummonth=2;;
+    Mar) month=March; nummonth=3;;
+    Apr) month=April; nummonth=4;;
+    May) month=May; nummonth=5;;
+    Jun) month=June; nummonth=6;;
+    Jul) month=July; nummonth=7;;
+    Aug) month=August; nummonth=8;;
+    Sep) month=September; nummonth=9;;
+    Oct) month=October; nummonth=10;;
+    Nov) month=November; nummonth=11;;
+    Dec) month=December; nummonth=12;;
+  esac
+done
+
+# Get the extended ls output of the file or directory.
+set - x`eval "$ls_command \"\$save_arg1\""`
+
+# Remove all preceding arguments
+eval $command
+
+# Get the month.  Next argument is day, followed by the year or time.
+case $1 in
+  Jan) month=January; nummonth=1;;
+  Feb) month=February; nummonth=2;;
+  Mar) month=March; nummonth=3;;
+  Apr) month=April; nummonth=4;;
+  May) month=May; nummonth=5;;
+  Jun) month=June; nummonth=6;;
+  Jul) month=July; nummonth=7;;
+  Aug) month=August; nummonth=8;;
+  Sep) month=September; nummonth=9;;
+  Oct) month=October; nummonth=10;;
+  Nov) month=November; nummonth=11;;
+  Dec) month=December; nummonth=12;;
+esac
+
+day=$2
+
+# Here we have to deal with the problem that the ls output gives either
+# the time of day or the year.
+case $3 in
+  *:*) set `date`; eval year=\$$#
+       case $2 in
+        Jan) nummonthtod=1;;
+        Feb) nummonthtod=2;;
+        Mar) nummonthtod=3;;
+        Apr) nummonthtod=4;;
+        May) nummonthtod=5;;
+        Jun) nummonthtod=6;;
+        Jul) nummonthtod=7;;
+        Aug) nummonthtod=8;;
+        Sep) nummonthtod=9;;
+        Oct) nummonthtod=10;;
+        Nov) nummonthtod=11;;
+        Dec) nummonthtod=12;;
+       esac
+       # For the first six month of the year the time notation can also
+       # be used for files modified in the last year.
+       if (expr $nummonth \> $nummonthtod) > /dev/null;
+       then
+        year=`expr $year - 1`
+       fi;;
+  *) year=$3;;
+esac
+
+# The result.
+echo $day $month $year
diff --git a/scripts/missing b/scripts/missing
new file mode 100755 (executable)
index 0000000..3392b9e
--- /dev/null
@@ -0,0 +1,353 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2004-09-07.08
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004
+#   Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program 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 2, or (at your option)
+# any later version.
+
+# This program 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  tar          try tar, gnutar, gtar, then tar without non-portable flags
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Send bug reports to <bug-automake@gnu.org>."
+    exit 0
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit 0
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+  lex|yacc)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  tar)
+    if test -n "$run"; then
+       echo 1>&2 "ERROR: \`tar' requires --run"
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       exit 1
+    fi
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  autom4te)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+    test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+    if test -f "$file"; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo "#! /bin/sh"
+       echo "# Created by GNU Automake missing as a replacement of"
+       echo "#  $ $@"
+       echo "exit 0"
+       chmod +x $file
+       exit 1
+    fi
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+        you modified a dependency of a manual page.  You may need the
+        \`Help2man' package in order for those modifications to take
+        effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+       file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+    fi
+    if [ -f "$file" ]; then
+       touch $file
+    else
+       test -z "$file" || exec >$file
+       echo ".ab help2man is required to generate this page"
+       exit 1
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  tar)
+    shift
+
+    # We have already tried tar in the generic part.
+    # Look for gnutar/gtar before invocation to avoid ugly error
+    # messages.
+    if (gnutar --version > /dev/null 2>&1); then
+       gnutar "$@" && exit 0
+    fi
+    if (gtar --version > /dev/null 2>&1); then
+       gtar "$@" && exit 0
+    fi
+    firstarg="$1"
+    if shift; then
+       case "$firstarg" in
+       *o*)
+           firstarg=`echo "$firstarg" | sed s/o//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+       case "$firstarg" in
+       *h*)
+           firstarg=`echo "$firstarg" | sed s/h//`
+           tar "$firstarg" "$@" && exit 0
+           ;;
+       esac
+    fi
+
+    echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+         You may want to install GNU tar or Free paxutils, or check the
+         command line arguments."
+    exit 1
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/scripts/mk-w32-dist b/scripts/mk-w32-dist
new file mode 100755 (executable)
index 0000000..3f687ca
--- /dev/null
@@ -0,0 +1,301 @@
+#!/bin/sh
+#
+# Copyright (C) 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+set -e
+cd dist-w32
+
+tmp="`echo $0 | sed 's,.*gnupg-\([^/]*\)/.*,\1,'`"
+
+topdir=
+bindir=..
+
+if [ -f "../gnupg-$tmp/README" ]; then
+    srcdir="../gnupg-$tmp"
+    bindir="../gnupg-$tmp"
+    topdir=".."
+elif [ -f ../README ]; then
+    srcdir=..
+elif [ -f ../../README ]; then
+    srcdir=../..
+    bindir=..
+elif [ -f ../../gnupg-stable/README ]; then
+    srcdir=../../gnupg-stable
+elif [ -f ../../../gnupg-stable/README ]; then
+    srcdir=../../../gnupg-stable
+else
+    echo "cannot figure out the source dir" >&2
+    exit 1
+fi
+
+# Windows uses an internal build number.  We use the last day of the
+# year concatenated with the hour. for it.  If it happens that a new
+# release of the same version is to be made in the next year, the
+# build number must be given manually by adding the appropriate number
+# of days.
+if [ "$1" = "--build-number" -a -n "$2" ]; then
+   build_number="$2"
+   shift 
+   shift
+else
+   build_number=$(date -u '+%j%k' | sed 's/^0*\(.*\)/\1/')
+fi
+
+
+if i586-mingw32msvc-strip --version >/dev/null 2>&1 ; then
+   STRIP=i586-mingw32msvc-strip
+else
+   STRIP="mingw32 strip"
+fi
+
+# If we don't have an installer we don't need to prepare for it.
+if ! makensis -version >/dev/null 2>&1 ; then
+    topdir=
+fi
+
+
+# A function to return a plain ASCII (or Latin-1) encoded description
+# text for a language identifier.  We need this to display the list of
+# available languages in the installer.  NSIS does not support utf-8
+# so we need to standardize on one character set.  Note that this
+# script itself is written in utf-8 but the resulting file will get
+# converted to Latin-1
+get_langname () {
+    case "$1" in
+        be)    r="Belarusian"; ;;
+        ca)    r="Català"; ;;
+        cs)    r="Cesky"; ;;
+        da)    r="Danish"; ;;
+        de)    r="Deutsch"; ;;
+        el)    r="Greek"; ;;
+        en|en@*)  r="English"; ;;
+        eo)    r="Esperanto"; ;;
+        es)    r="Español"; ;;
+        et)    r="Eesti keel"; ;;
+        fi)    r="Suomi"; ;;
+        fr)    r="Français"; ;;
+        gl)    r="Galician"; ;;
+        hu)    r="Magyar"; ;;
+        id)    r="Indonesian"; ;;
+        it)    r="Italiano"; ;;
+        ja)    r="Japanese"; ;;
+        pl)    r="Polski"; ;;
+        pt)    r="Português"; ;;
+        pt_BR) r="Português (do Brasil)"; ;;
+        ro)    r="Romana"; ;;
+        ru)    r="Russian"; ;;
+        sk)    r="Slovensky"; ;;
+        sv)    r="Svenska"; ;;
+        tr)    r="Türkçe"; ;;
+        zh_CN) r="Chinese (simplified)"; ;;
+        zh_TW) r="Chinese (traditional)"; ;;
+
+        *) r="" ;;
+    esac
+    echo "$r"
+}
+
+
+# Figure out the version
+version=$(sed -n 's/^#[ ]*define[ ][ ]*VERSION[ ][ ]*\"\([0-9.a-z-]*\)\"/\1/p' $bindir/config.h)
+prod_version=$(echo "$version"|awk -F'[^0-9]' '{print $1 "." $2 "." $3 }')
+prod_version="${prod_version}.${build_number}"
+echo "building version $version ($prod_version)"
+
+rm * >/dev/null 2>/dev/null || true
+
+cp ${bindir}/g10/gpg.exe gpg.exe
+$STRIP gpg.exe
+cp ${bindir}/g10/gpgv.exe gpgv.exe
+$STRIP gpgv.exe
+for name in hkp curl ldap finger; do 
+  cp ${bindir}/keyserver/gpgkeys_$name.exe gpgkeys_$name.exe
+  $STRIP gpgkeys_$name.exe
+done
+cp ${bindir}/tools/gpgsplit.exe gpgsplit.exe
+$STRIP gpgsplit.exe
+
+for i in FAQ; do
+  cp ${bindir}/doc/$i $i.txt
+  todos $i.txt
+done
+man -Tlatin1 -l ${srcdir}/doc/gpg.1 | sed `printf "s/\b.//g"`  >gpg.man
+todos gpg.man
+man -Tlatin1 -l ${srcdir}/doc/gpgv.1 | sed `printf "s/\b.//g"`  >gpgv.man
+todos gpgv.man
+man -Tlatin1 -l ${srcdir}/doc/gnupg.7 | sed `printf "s/\b.//g"`  >gnupg.man
+todos gnupg.man
+for i in README COPYING NEWS; do
+  cp ${srcdir}/$i $i.txt
+  todos $i.txt
+done
+
+cp ${srcdir}/doc/README.W32 README-W32.txt
+todos README-W32.txt
+
+patches_defs=
+for i in `find "$topdir/patches" -type f -name '*.diff'`; do
+  cp $i .
+  patches_defs="-DWITH_PATCHES"
+done
+
+
+# We must distribute the MO files in UTF-8, the conversion is done by
+# gpg at runtime.  To include English at the right position in the list we 
+# need a special case.
+langlist=""
+langdesclist=""
+for i in `(ls ${srcdir}/po/*.po; echo ${srcdir}/po/en.po) | sort`; do
+   lang=$(basename $i .po)
+   if [ $lang != "en" ]; then
+       grep -s $lang ${srcdir}/po/LINGUAS >/dev/null || continue
+       [ -f$lang.mo -a $lang.mo -nt $i ] && continue
+    
+       fromset=`sed -n '/^"Content-Type:/ s/.*charset=\([a-zA-Z0-9_-]*\).*/\1/p' $i`
+       case "$fromset" in 
+         utf8|utf-8|UTF8|UTF-8) 
+           echo "$lang: keeping $fromset" >&2 
+           msgfmt --output-file=$lang.mo $i
+           ;;
+         *)
+           echo "$lang: converting from $fromset to utf-8" >&2 
+           iconv --silent --from-code=$fromset --to-code=utf-8 < $i | \
+             sed "/^\"Content-Type:/ s/charset=[a-zA-Z0-9_-]*/charset=utf-8/"|\
+             msgfmt --output-file=$lang.mo -
+           ;;
+       esac
+   fi
+   langlist="$langlist $lang"
+   langname="`get_langname $lang`"
+   [ -n "$langdesclist" ] && langdesclist="${langdesclist}|"
+   langdesclist="${langdesclist}${lang} - ${langname}"
+done
+
+
+# Create the option file for use with the NSIS installer.
+cat <<EOF | iconv --silent --from-code=utf-8 --to-code=latin1 >opt.ini
+[Settings]
+NumFields=1
+
+[Field 1]
+Type=DropList
+Left=0
+Right=130
+Top=20
+Bottom=100
+ListItems="$langdesclist"
+EOF
+
+
+# If we have a topdir, assume the full build environment and 
+# prepare the installer
+if [ -n "$topdir" ]; then
+  winpt_defs=
+  src_defs=
+  buildinfo="`date -u '+%Y-%m-%d %H:%M UTC'`"
+
+  # iconv.dll is a hard requirement
+  if [ ! -f "$topdir/iconv/iconv.dll" ]; then
+    echo "iconv.dll not available" >&2
+    exit 1
+  fi
+  ln "$topdir/iconv/iconv.dll" iconv.dll
+  for i in COPYING.LIB README.iconv; do
+     cp ${topdir}/iconv/$i $i.txt
+     todos $i.txt
+  done
+  
+  # WinPT is optional
+  if [ -f "$topdir/winpt/WinPT.exe" ]; then
+     ln "$topdir/winpt/WinPT.exe"      WinPT.exe
+     ln "$topdir/winpt/PTD.dll"        PTD.dll
+     cp "$topdir/winpt/README-0.9.txt" README.winpt.txt
+     cp "$topdir/winpt/NEWS-0.9.txt"   NEWS.winpt.txt
+     cp "$topdir/winpt/keyserver.conf" keyserver.conf
+     winpt_defs="-DWITH_WINPT"
+  fi
+
+  # See whether we should include the source and figure out the
+  # version numbers of the source files.
+  if [ -d "$topdir/tarballs" ]; then
+    have_gnupg_src=no
+    have_libiconv_src=no
+    have_winpt_src=no
+    for i in `find "$topdir/tarballs" -type f -name '*.tar.gz'`; do
+       fname=$(basename "$i" .gz)
+       zcat "$i" > "$fname"
+       case "$fname" in
+           gnupg-*)
+               tmp=$(echo "$fname" | \
+                     sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p')
+               echo "gnupg source version is $tmp" >&2
+               if [ "$version" != "$tmp" ]; then
+                   echo "gnupg source version does not match" >&2
+                   exit 1
+               fi
+               have_gnupg_src=yes
+               ;;
+           libiconv-*)
+               tmp=$(echo "$fname" | \
+                     sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p')
+               echo "libiconv source version is $tmp" >&2
+               src_defs="$src_defs -DLIBICONV_VERSION=$tmp"
+               have_libiconv_src=yes
+               ;;
+           winpt-*)
+               tmp=$(echo "$fname" | \
+                     sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p')
+               echo "winpt source version is $tmp" >&2
+               src_defs="$src_defs -DWINPT_VERSION=$tmp"
+               have_winpt_src=yes
+               ;;
+               
+           *) 
+               echo "WARNING: unknown source file $fname ignored" >&2
+               ;;
+       esac
+    done
+    if [ -n "$src_defs" ]; then
+        if [ $have_gnupg_src = "no" ]; then
+            echo "gnupg source missing" >&2
+            exit 1
+        fi
+        if [ $have_libiconv_src = "no" ]; then
+            echo "libiconv source missing" >&2
+            exit 1
+        fi
+        if [ -n "$winpt_defs" ]; then
+            if [ $have_winpt_src = "no" ]; then
+                echo "winpt source missing" >&2
+                exit 1
+            fi
+        fi
+
+        src_defs="$src_defs -DWITH_SOURCE"
+    fi
+
+  fi
+
+  # Now run the installer
+  echo "invoking installer as:"
+  echo makensis -v0  -nocd -DVERSION="${version}" \
+           -DPROD_VERSION="${prod_version}" \
+           -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \
+           ${patches_defs} ${srcdir}/scripts/w32installer.nsi
+  BUILDINFO=$buildinfo makensis -v0 -nocd -DVERSION="${version}" \
+           -DPROD_VERSION="${prod_version}" \
+           -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \
+           ${patches_defs} ${srcdir}/scripts/w32installer.nsi
+  echo "Installer created" >&2
+else
+  zip -9 "gnupg-w32cli-${version}.zip" *
+  echo "ZIP archive created" >&2
+fi
diff --git a/scripts/mkdiff b/scripts/mkdiff
new file mode 100755 (executable)
index 0000000..f179793
--- /dev/null
@@ -0,0 +1,115 @@
+#!/bin/sh
+# Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# Please note that this script is now maintained outside of GNUPG.
+# To get the most up to date version use
+# cvs -d :pserver:anoncvs@cvs.gnupg.org:/cvs/wk checkout misc-scripts/mkdiff
+
+if [ $# != 1 ] ; then
+    echo "usage: mkdiff package-name" >&2
+    exit 1
+fi
+
+pack="$1"
+
+set -e
+
+curr_ver=$(ls $pack-*.tar.gz 2>/dev/null | sed "s/^$pack-\(.*\)\.tar\.gz/\1/"\
+          | sort -r -t '.' -n +0 -1 +1 -2 +2 | head -1 )
+if [ ! -f $pack-$curr_ver.tar.gz ]; then
+    echo "mkdiff: no current version of package $pack found" >&2
+    exit 1
+fi
+prev_ver=$(ls $pack-*.tar.gz 2>/dev/null | sed "s/^$pack-\(.*\)\.tar\.gz/\1/"\
+          | sort -r -t '.' -n +0 -1 +1 -2 +2 | head -2 | tail -1 )
+if [ "$prev_ver" = "$curr_ver"  ]; then
+    echo "mkdiff: no previous version of package $pack found" >&2
+    exit 1
+fi
+
+echo "Current  is: $pack-$curr_ver"
+echo "Previous is: $pack-$prev_ver"
+
+
+echo "Removing old directories"
+[ -d "$pack-$curr_ver" ] && rm -rf "$pack-$curr_ver"
+[ -d "$pack-$prev_ver" ] && rm -rf "$pack-$prev_ver"
+
+echo "Unpacking previous and current tar"
+tar xzf "$pack-$curr_ver.tar.gz"
+rm -f $pack-${curr_ver}/po/*.gmo
+tar xzf "$pack-$prev_ver.tar.gz"
+rm -f $pack-${prev_ver}/po/*.gmo
+
+
+echo "Diffing"
+tmp_name="$pack-$prev_ver-$curr_ver.diff.tmp"
+diff_name="$pack-$prev_ver-$curr_ver.diff"
+
+diff -urN "$pack-$prev_ver/" "$pack-$curr_ver/"  > $tmp_name || true
+
+echo "Making patch file"
+
+cat <<EOF > $diff_name
+
+This is a patch file to create version $curr_ver from $prev_ver.
+
+Please check the signature of this patch file:
+
+    zcat somepath/$pack-$prev_ver-$curr_ver.diff.gz | gpg --verify
+
+Change to directory $pack-$prev_ver (or however you renamed it)
+and give this command:
+
+     zcat somepath/$pack-$prev_ver-$curr_ver.diff.gz | patch -p1
+
+It is a good idea to rename your current directory to $pack-$curr_ver now.
+
+
+
+Prereq: $prev_ver
+
+EOF
+
+sed -ne '/^diff.*VERSION/,/^+[0-9][0-9]*/ p' $tmp_name >> $diff_name
+echo  >> $diff_name
+sed -e '/^diff.*VERSION/,/^+[0-9][0-9]*/ d'  $tmp_name >> $diff_name
+
+rm $tmp_name
+
+echo "Signing and compressing patch file"
+gpg --clearsign --not-dash-escaped -u 57548DCD \
+    < $diff_name | gzip --best > $diff_name.gz
+rm $diff_name
+
+echo "Checking patch file"
+cd $pack-$prev_ver
+zcat ../$diff_name.gz | patch -s -p1
+rm $(find . -name "*.orig") 2>/dev/null || true
+cd ..
+
+if ! diff -urN "$pack-$prev_ver/" "$pack-$curr_ver/" >/dev/null ; then
+   echo "compare failed"
+   exit 1
+fi
+
+if ! zcat $diff_name.gz | gpg --batch --verify ; then
+    exit 1
+fi
+
+
+echo "cleaning up"
+
+rm -rf "$pack-$curr_ver"
+rm -rf "$pack-$prev_ver"
+
+echo "Patch file $diff_name.gz is good."
+
diff --git a/scripts/mkinstalldirs b/scripts/mkinstalldirs
new file mode 100755 (executable)
index 0000000..6fbe5e1
--- /dev/null
@@ -0,0 +1,150 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2004-02-15.20
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+errstatus=0
+dirmode=""
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage"
+      exit 0
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --version)
+      echo "$0 $scriptversion"
+      exit 0
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error.  This is a problem when calling mkinstalldirs
+# from a parallel make.  We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+  '')
+    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    else
+      # On NextStep and OpenStep, the `mkdir' command does not
+      # recognize any option.  It will interpret all options as
+      # directories to create, and then abort because `.' already
+      # exists.
+      test -d ./-p && rmdir ./-p
+      test -d ./--version && rmdir ./--version
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+       test ! -d ./--version; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    else
+      # Clean up after NextStep and OpenStep mkdir.
+      for d in ./-m ./-p ./--version "./$dirmode";
+      do
+        test -d $d && rmdir $d
+      done
+    fi
+    ;;
+esac
+
+for file
+do
+  set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+  shift
+
+  pathcomp=
+  for d
+  do
+    pathcomp="$pathcomp$d"
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+       errstatus=$lasterr
+      else
+       if test ! -z "$dirmode"; then
+         echo "chmod $dirmode $pathcomp"
+         lasterr=""
+         chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+         if test ! -z "$lasterr"; then
+           errstatus=$lasterr
+         fi
+       fi
+      fi
+    fi
+
+    pathcomp="$pathcomp/"
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/scripts/texinfo.tex b/scripts/texinfo.tex
new file mode 100644 (file)
index 0000000..e9293f3
--- /dev/null
@@ -0,0 +1,6773 @@
+% texinfo.tex -- TeX macros to handle Texinfo files.
+%
+% Load plain if necessary, i.e., if running under initex.
+\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
+%
+\def\texinfoversion{2003-05-04.08}
+%
+% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
+% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+%
+% This texinfo.tex file 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 2, or (at
+% your option) any later version.
+%
+% This texinfo.tex 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 texinfo.tex file; see the file COPYING.  If not, write
+% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+% Boston, MA 02111-1307, USA.
+%
+% In other words, you are welcome to use, share and improve this program.
+% You are forbidden to forbid anyone else to use, share and improve
+% what you give them.   Help stamp out software-hoarding!
+%
+% Please try the latest version of texinfo.tex before submitting bug
+% reports; you can get the latest version from:
+%   ftp://ftp.gnu.org/gnu/texinfo/texinfo.tex
+%     (and all GNU mirrors, see http://www.gnu.org/order/ftp.html)
+%   ftp://tug.org/tex/texinfo.tex
+%     (and all CTAN mirrors, see http://www.ctan.org),
+%   and /home/gd/gnu/doc/texinfo.tex on the GNU machines.
+%
+% The GNU Texinfo home page is http://www.gnu.org/software/texinfo.
+%
+% The texinfo.tex in any given Texinfo distribution could well be out
+% of date, so if that's what you're using, please check.
+%
+% Send bug reports to bug-texinfo@gnu.org.  Please include including a
+% complete document in each bug report with which we can reproduce the
+% problem.  Patches are, of course, greatly appreciated.
+%
+% To process a Texinfo manual with TeX, it's most reliable to use the
+% texi2dvi shell script that comes with the distribution.  For a simple
+% manual foo.texi, however, you can get away with this:
+%   tex foo.texi
+%   texindex foo.??
+%   tex foo.texi
+%   tex foo.texi
+%   dvips foo.dvi -o  # or whatever; this makes foo.ps.
+% The extra TeX runs get the cross-reference information correct.
+% Sometimes one run after texindex suffices, and sometimes you need more
+% than two; texi2dvi does it as many times as necessary.
+%
+% It is possible to adapt texinfo.tex for other languages, to some
+% extent.  You can get the existing language-specific files from the
+% full Texinfo distribution.
+
+\message{Loading texinfo [version \texinfoversion]:}
+
+% If in a .fmt file, print the version number
+% and turn on active characters that we couldn't do earlier because
+% they might have appeared in the input file name.
+\everyjob{\message{[Texinfo version \texinfoversion]}%
+  \catcode`+=\active \catcode`\_=\active}
+
+\message{Basics,}
+\chardef\other=12
+
+% We never want plain's \outer definition of \+ in Texinfo.
+% For @tex, we can use \tabalign.
+\let\+ = \relax
+
+% Save some plain tex macros whose names we will redefine.
+\let\ptexb=\b
+\let\ptexbullet=\bullet
+\let\ptexc=\c
+\let\ptexcomma=\,
+\let\ptexdot=\.
+\let\ptexdots=\dots
+\let\ptexend=\end
+\let\ptexequiv=\equiv
+\let\ptexexclam=\!
+\let\ptexgtr=>
+\let\ptexhat=^
+\let\ptexi=\i
+\let\ptexindent=\indent
+\let\ptexlbrace=\{
+\let\ptexless=<
+\let\ptexplus=+
+\let\ptexrbrace=\}
+\let\ptexslash=\/
+\let\ptexstar=\*
+\let\ptext=\t
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English if not already set.
+\ifx\putwordAppendix\undefined  \gdef\putwordAppendix{Appendix}\fi
+\ifx\putwordChapter\undefined   \gdef\putwordChapter{Chapter}\fi
+\ifx\putwordfile\undefined      \gdef\putwordfile{file}\fi
+\ifx\putwordin\undefined        \gdef\putwordin{in}\fi
+\ifx\putwordIndexIsEmpty\undefined     \gdef\putwordIndexIsEmpty{(Index is empty)}\fi
+\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi
+\ifx\putwordInfo\undefined      \gdef\putwordInfo{Info}\fi
+\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi
+\ifx\putwordMethodon\undefined  \gdef\putwordMethodon{Method on}\fi
+\ifx\putwordNoTitle\undefined   \gdef\putwordNoTitle{No Title}\fi
+\ifx\putwordof\undefined        \gdef\putwordof{of}\fi
+\ifx\putwordon\undefined        \gdef\putwordon{on}\fi
+\ifx\putwordpage\undefined      \gdef\putwordpage{page}\fi
+\ifx\putwordsection\undefined   \gdef\putwordsection{section}\fi
+\ifx\putwordSection\undefined   \gdef\putwordSection{Section}\fi
+\ifx\putwordsee\undefined       \gdef\putwordsee{see}\fi
+\ifx\putwordSee\undefined       \gdef\putwordSee{See}\fi
+\ifx\putwordShortTOC\undefined  \gdef\putwordShortTOC{Short Contents}\fi
+\ifx\putwordTOC\undefined       \gdef\putwordTOC{Table of Contents}\fi
+%
+\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi
+\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi
+\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi
+\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi
+\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi
+\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi
+\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi
+\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi
+\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi
+\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi
+\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi
+\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi
+%
+\ifx\putwordDefmac\undefined    \gdef\putwordDefmac{Macro}\fi
+\ifx\putwordDefspec\undefined   \gdef\putwordDefspec{Special Form}\fi
+\ifx\putwordDefvar\undefined    \gdef\putwordDefvar{Variable}\fi
+\ifx\putwordDefopt\undefined    \gdef\putwordDefopt{User Option}\fi
+\ifx\putwordDeftypevar\undefined\gdef\putwordDeftypevar{Variable}\fi
+\ifx\putwordDeffunc\undefined   \gdef\putwordDeffunc{Function}\fi
+\ifx\putwordDeftypefun\undefined\gdef\putwordDeftypefun{Function}\fi
+
+% In some macros, we cannot use the `\? notation---the left quote is
+% in some cases the escape char.
+\chardef\colonChar = `\:
+\chardef\commaChar = `\,
+\chardef\dotChar   = `\.
+\chardef\equalChar = `\=
+\chardef\exclamChar= `\!
+\chardef\questChar = `\?
+\chardef\semiChar  = `\;
+\chardef\spaceChar = `\ %
+\chardef\underChar = `\_
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+% True if #1 is the empty string, i.e., called like `\ifempty{}'.
+%
+\def\ifempty#1{\ifemptyx #1\emptymarkA\emptymarkB}%
+\def\ifemptyx#1#2\emptymarkB{\ifx #1\emptymarkA}%
+
+% Hyphenation fixes.
+\hyphenation{ap-pen-dix}
+\hyphenation{eshell}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{time-stamp}
+\hyphenation{white-space}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen\bindingoffset
+\newdimen\normaloffset
+\newdimen\pagewidth \newdimen\pageheight
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.  We also make
+% some effort to order the tracing commands to reduce output in the log
+% file; cf. trace.sty in LaTeX.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{%
+  \tracingstats2
+  \tracingpages1
+  \tracinglostchars2  % 2 gives us more in etex
+  \tracingparagraphs1
+  \tracingoutput1
+  \tracingmacros2
+  \tracingrestores1
+  \showboxbreadth\maxdimen \showboxdepth\maxdimen
+  \ifx\eTeXversion\undefined\else % etex gives us more logging
+    \tracingscantokens1
+    \tracingifs1
+    \tracinggroups1
+    \tracingnesting2
+    \tracingassigns1
+  \fi
+  \tracingcommands3  % 3 gives us more in etex
+  \errorcontextlines\maxdimen
+}%
+
+% add check for \lastpenalty to plain's definitions.  If the last thing
+% we did was a \nobreak, we don't want to insert more space.
+%
+\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount
+  \removelastskip\penalty-50\smallskip\fi\fi}
+\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount
+  \removelastskip\penalty-100\medskip\fi\fi}
+\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount
+  \removelastskip\penalty-200\bigskip\fi\fi}
+
+% For @cropmarks command.
+% Do @cropmarks to get crop marks.
+%
+\newif\ifcropmarks
+\let\cropmarks = \cropmarkstrue
+%
+% Dimensions to add cropmarks at corners.
+% Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines
+\newdimen\cornerlong  \cornerlong=1pc
+\newdimen\cornerthick \cornerthick=.3pt
+\newdimen\topandbottommargin \topandbottommargin=.75in
+
+% Main output routine.
+\chardef\PAGE = 255
+\output = {\onepageout{\pagecontents\PAGE}}
+
+\newbox\headlinebox
+\newbox\footlinebox
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions, but you have to call it yourself.
+\def\onepageout#1{%
+  \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi
+  %
+  \ifodd\pageno  \advance\hoffset by \bindingoffset
+  \else \advance\hoffset by -\bindingoffset\fi
+  %
+  % Do this outside of the \shipout so @code etc. will be expanded in
+  % the headline as they should be, not taken literally (outputting ''code).
+  \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}%
+  \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}%
+  %
+  {%
+    % Have to do this stuff outside the \shipout because we want it to
+    % take effect in \write's, yet the group defined by the \vbox ends
+    % before the \shipout runs.
+    %
+    \escapechar = `\\     % use backslash in output files.
+    \indexdummies         % don't expand commands in the output.
+    \normalturnoffactive  % \ in index entries must not stay \, e.g., if
+                   % the page break happens to be in the middle of an example.
+    \shipout\vbox{%
+      % Do this early so pdf references go to the beginning of the page.
+      \ifpdfmakepagedest \pdfmkdest{\the\pageno} \fi
+      %
+      \ifcropmarks \vbox to \outervsize\bgroup
+        \hsize = \outerhsize
+        \vskip-\topandbottommargin
+        \vtop to0pt{%
+          \line{\ewtop\hfil\ewtop}%
+          \nointerlineskip
+          \line{%
+            \vbox{\moveleft\cornerthick\nstop}%
+            \hfill
+            \vbox{\moveright\cornerthick\nstop}%
+          }%
+          \vss}%
+        \vskip\topandbottommargin
+        \line\bgroup
+          \hfil % center the page within the outer (page) hsize.
+          \ifodd\pageno\hskip\bindingoffset\fi
+          \vbox\bgroup
+      \fi
+      %
+      \unvbox\headlinebox
+      \pagebody{#1}%
+      \ifdim\ht\footlinebox > 0pt
+        % Only leave this space if the footline is nonempty.
+        % (We lessened \vsize for it in \oddfootingxxx.)
+        % The \baselineskip=24pt in plain's \makefootline has no effect.
+        \vskip 2\baselineskip
+        \unvbox\footlinebox
+      \fi
+      %
+      \ifcropmarks
+          \egroup % end of \vbox\bgroup
+        \hfil\egroup % end of (centering) \line\bgroup
+        \vskip\topandbottommargin plus1fill minus1fill
+        \boxmaxdepth = \cornerthick
+        \vbox to0pt{\vss
+          \line{%
+            \vbox{\moveleft\cornerthick\nsbot}%
+            \hfill
+            \vbox{\moveright\cornerthick\nsbot}%
+          }%
+          \nointerlineskip
+          \line{\ewbot\hfil\ewbot}%
+        }%
+      \egroup % \vbox from first cropmarks clause
+      \fi
+    }% end of \shipout\vbox
+  }% end of group with \normalturnoffactive
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi
+}
+
+\newinsert\margin \dimen\margin=\maxdimen
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+% marginal hacks, juha@viisa.uucp (Juha Takala)
+\ifvoid\margin\else % marginal info is present
+  \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+  \let\next = #1%
+  \begingroup
+    \obeylines
+    \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse.  Otherwise, we're done.
+\def\parseargx{%
+  % \obeyedspace is defined far below, after the definition of \sepspaces.
+  \ifx\obeyedspace\temp
+    \expandafter\parseargdiscardspace
+  \else
+    \expandafter\parseargline
+  \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    %
+    % First remove any @c comment, then any @comment.
+    % Result of each macro is put in \toks0.
+    \argremovec #1\c\relax %
+    \expandafter\argremovecomment \the\toks0 \comment\relax %
+    %
+    % Call the caller's macro, saved as \next in \parsearg.
+    \expandafter\next\expandafter{\the\toks0}%
+  }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us.  The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+%    @end itemize  @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'.  Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands.  (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.)  But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+  \begingroup
+    \ignoreactivespaces
+    \edef\temp{#1}%
+    \global\toks0 = \expandafter{\temp}%
+  \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+  \obeyspaces
+  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment; press RETURN to continue}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo  is the same as @foo, for now.
+\newhelp\EMsimple{Press RETURN to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+  \removeactivespaces{#1}%
+  \edef\endthing{\the\toks0}%
+  %
+  \expandafter\ifx\csname E\endthing\endcsname\relax
+    \expandafter\ifx\csname \endthing\endcsname\relax
+      % There's no \foo, i.e., no ``environment'' foo.
+      \errhelp = \EMsimple
+      \errmessage{Undefined command `@end \endthing'}%
+    \else
+      \unmatchedenderror\endthing
+    \fi
+  \else
+    % Everything's ok; the right environment has been started.
+    \csname E\endthing\endcsname
+  \fi
+}
+
+% There is an environment #1, but it hasn't been started.  Give an error.
+%
+\def\unmatchedenderror#1{%
+  \errhelp = \EMsimple
+  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt\char64}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+\def\mylbrace {{\tt\char123}}
+\def\myrbrace {{\tt\char125}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+\begingroup
+  % Definitions to produce \{ and \} commands for indices,
+  % and @{ and @} for the aux file.
+  \catcode`\{ = \other \catcode`\} = \other
+  \catcode`\[ = 1 \catcode`\] = 2
+  \catcode`\! = 0 \catcode`\\ = \other
+  !gdef!lbracecmd[\{]%
+  !gdef!rbracecmd[\}]%
+  !gdef!lbraceatcmd[@{]%
+  !gdef!rbraceatcmd[@}]%
+!endgroup
+
+% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent
+% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H.
+\let\, = \c
+\let\dotaccent = \.
+\def\ringaccent#1{{\accent23 #1}}
+\let\tieaccent = \t
+\let\ubaraccent = \b
+\let\udotaccent = \d
+
+% Other special characters: @questiondown @exclamdown
+% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss.
+\def\questiondown{?`}
+\def\exclamdown{!`}
+
+% Dotless i and dotless j, used for accents.
+\def\imacro{i}
+\def\jmacro{j}
+\def\dotless#1{%
+  \def\temp{#1}%
+  \ifx\temp\imacro \ptexi
+  \else\ifx\temp\jmacro \j
+  \else \errmessage{@dotless can be used only with i or j}%
+  \fi\fi
+}
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ % Avoid using \@M directly, because that causes trouble
+ % if the definition is written into an index file.
+ \global\let\tiepenalty = \@M
+ \gdef\tie{\leavevmode\penalty\tiepenalty\ }
+}
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @/ allows a line break.
+\let\/=\allowbreak
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @! is an end-of-sentence bang.
+\def\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\def\?{?\spacefactor=3000 }
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+% Another complication is that the group might be very large.  This can
+% cause the glue on the previous page to be unduly stretched, because it
+% does not have much material.  In this case, it's better to add an
+% explicit \vfill so that the extra space is at the bottom.  The
+% threshold for doing this is if the group is more than \vfilllimit
+% percent of a page (\vfilllimit can be changed inside of @tex).
+%
+\newbox\groupbox
+\def\vfilllimit{0.7}
+%
+\def\group{\begingroup
+  \ifnum\catcode13=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  %
+  % The \vtop we start below produces a box with normal height and large
+  % depth; thus, TeX puts \baselineskip glue before it, and (when the
+  % next line of text is done) \lineskip glue after it.  (See p.82 of
+  % the TeXbook.)  Thus, space below is not quite equal to space
+  % above.  But it's pretty close.
+  \def\Egroup{%
+    \egroup           % End the \vtop.
+    % \dimen0 is the vertical size of the group's box.
+    \dimen0 = \ht\groupbox  \advance\dimen0 by \dp\groupbox
+    % \dimen2 is how much space is left on the page (more or less).
+    \dimen2 = \pageheight   \advance\dimen2 by -\pagetotal
+    % if the group doesn't fit on the current page, and it's a big big
+    % group, force a page break.
+    \ifdim \dimen0 > \dimen2
+      \ifdim \pagetotal < \vfilllimit\pageheight
+        \page
+      \fi
+    \fi
+    \copy\groupbox
+    \endgroup         % End the \group.
+  }%
+  %
+  \setbox\groupbox = \vtop\bgroup
+    % We have to put a strut on the last line in case the @group is in
+    % the midst of an example, rather than completely enclosing it.
+    % Otherwise, the interline space between the last line of the group
+    % and the first line afterwards is too small.  But we can't put the
+    % strut in \Egroup, since there it would be on a line by itself.
+    % Hence this just inserts a strut at the beginning of each line.
+    \everypar = {\strut}%
+    %
+    % Since we have a strut on every line, we don't need any of TeX's
+    % normal interline spacing.
+    \offinterlineskip
+    %
+    % OK, but now we have to do something about blank
+    % lines in the input in @example-like environments, which normally
+    % just turn into \lisppar, which will insert no space now that we've
+    % turned off the interline space.  Simplest is to make them be an
+    % empty paragraph.
+    \ifx\par\lisppar
+      \edef\par{\leavevmode \par}%
+      %
+      % Reset ^^M's definition to new definition of \par.
+      \obeylines
+    \fi
+    %
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+  % Ensure vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % If the @need value is less than one line space, it's useless.
+  \dimen0 = #1\mil
+  \dimen2 = \ht\strutbox
+  \advance\dimen2 by \dp\strutbox
+  \ifdim\dimen0 > \dimen2
+    %
+    % Do a \strut just to make the height of this box be normal, so the
+    % normal leading is inserted relative to the preceding line.
+    % And a page break here is fine.
+    \vtop to #1\mil{\strut\vfil}%
+    %
+    % TeX does not even consider page breaks if a penalty added to the
+    % main vertical list is 10000 or more.  But in order to see if the
+    % empty box we just added fits on the page, we must make it consider
+    % page breaks.  On the other hand, we don't want to actually break the
+    % page after the empty box.  So we use a penalty of 9999.
+    %
+    % There is an extremely small chance that TeX will actually break the
+    % page at this \penalty, if there are no other feasible breakpoints in
+    % sight.  (If the user is using lots of big @group commands, which
+    % almost-but-not-quite fill up a page, TeX will have a hard time doing
+    % good page breaking, for example.)  However, I could not construct an
+    % example where a page broke at this \penalty; if it happens in a real
+    % document, then we can reconsider our strategy.
+    \penalty9999
+    %
+    % Back up by the size of the box, whether we did a page break or not.
+    \kern -#1\mil
+    %
+    % Do not allow a page break right after this kern.
+    \nobreak
+  \fi
+}
+
+% @br   forces paragraph break
+
+\let\br = \par
+
+% @dots{} output an ellipsis using the current font.
+% We do .5em per period so that it has the same spacing in a typewriter
+% font as three actual period characters.
+%
+\def\dots{%
+  \leavevmode
+  \hbox to 1.5em{%
+    \hskip 0pt plus 0.25fil minus 0.25fil
+    .\hss.\hss.%
+    \hskip 0pt plus 0.5fil minus 0.5fil
+  }%
+}
+
+% @enddots{} is an end-of-sentence ellipsis.
+%
+\def\enddots{%
+  \leavevmode
+  \hbox to 2em{%
+    \hskip 0pt plus 0.25fil minus 0.25fil
+    .\hss.\hss.\hss.%
+    \hskip 0pt plus 0.5fil minus 0.5fil
+  }%
+  \spacefactor=3000
+}
+
+% @page forces the start of a new page.
+%
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current
+% paragraph.  For more general purposes, use the \margin insertion
+% class.  WHICH is `l' or `r'.
+%
+\newskip\inmarginspacing \inmarginspacing=1cm
+\def\strutdepth{\dp\strutbox}
+%
+\def\doinmargin#1#2{\strut\vadjust{%
+  \nobreak
+  \kern-\strutdepth
+  \vtop to \strutdepth{%
+    \baselineskip=\strutdepth
+    \vss
+    % if you have multiple lines of stuff to put here, you'll need to
+    % make the vbox yourself of the appropriate size.
+    \ifx#1l%
+      \llap{\ignorespaces #2\hskip\inmarginspacing}%
+    \else
+      \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}%
+    \fi
+    \null
+  }%
+}}
+\def\inleftmargin{\doinmargin l}
+\def\inrightmargin{\doinmargin r}
+%
+% @inmargin{TEXT [, RIGHT-TEXT]}
+% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right;
+% else use TEXT for both).
+%
+\def\inmargin#1{\parseinmargin #1,,\finish}
+\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing.
+  \setbox0 = \hbox{\ignorespaces #2}%
+  \ifdim\wd0 > 0pt
+    \def\lefttext{#1}%  have both texts
+    \def\righttext{#2}%
+  \else
+    \def\lefttext{#1}%  have only one text
+    \def\righttext{#1}%
+  \fi
+  %
+  \ifodd\pageno
+    \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin
+  \else
+    \def\temp{\inleftmargin\lefttext}%
+  \fi
+  \temp
+}
+
+% @include file    insert text of that file as input.
+% Allow normal characters that  we make active in the argument (a file name).
+\def\include{\begingroup
+  \catcode`\\=\other
+  \catcode`~=\other
+  \catcode`^=\other
+  \catcode`_=\other
+  \catcode`|=\other
+  \catcode`<=\other
+  \catcode`>=\other
+  \catcode`+=\other
+  \parsearg\includezzz}
+% Restore active chars for included file.
+\def\includezzz#1{\endgroup\begingroup
+  % Read the included file in a group so nested @include's work.
+  \def\thisfile{#1}%
+  \let\value=\expandablevalue
+  \input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line
+% outputs that line, centered.
+%
+\def\center{\parsearg\docenter}
+\def\docenter#1{{%
+  \ifhmode \hfil\break \fi
+  \advance\hsize by -\leftskip
+  \advance\hsize by -\rightskip
+  \line{\hfil \ignorespaces#1\unskip \hfil}%
+  \ifhmode \break \fi
+}}
+
+% @sp n   outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\begingroup \catcode`\^^M=\other%
+\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
+\commentxxx}
+{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}}
+
+\let\c=\comment
+
+% @paragraphindent NCHARS
+% We'll use ems for NCHARS, close enough.
+% NCHARS can also be the word `asis' or `none'.
+% We cannot feasibly implement @paragraphindent asis, though.
+%
+\def\asisword{asis} % no translation, these are keywords
+\def\noneword{none}
+%
+\def\paragraphindent{\parsearg\doparagraphindent}
+\def\doparagraphindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \defaultparindent = 0pt
+    \else
+      \defaultparindent = #1em
+    \fi
+  \fi
+  \parindent = \defaultparindent
+}
+
+% @exampleindent NCHARS
+% We'll use ems for NCHARS like @paragraphindent.
+% It seems @exampleindent asis isn't necessary, but
+% I preserve it to make it similar to @paragraphindent.
+\def\exampleindent{\parsearg\doexampleindent}
+\def\doexampleindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\asisword
+  \else
+    \ifx\temp\noneword
+      \lispnarrowing = 0pt
+    \else
+      \lispnarrowing = #1em
+    \fi
+  \fi
+}
+
+% @firstparagraphindent WORD
+% If WORD is `none', then suppress indentation of the first paragraph
+% after a section heading.  If WORD is `insert', then do indentat such
+% paragraphs.
+%
+% The paragraph indentation is suppressed or not by calling
+% \suppressfirstparagraphindent, which the sectioning commands do.  We
+% switch the definition of this back and forth according to WORD.  By
+% default, we suppress indentation.
+%
+\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent}
+\newdimen\currentparindent
+%
+\def\insertword{insert}
+%
+\def\firstparagraphindent{\parsearg\dofirstparagraphindent}
+\def\dofirstparagraphindent#1{%
+  \def\temp{#1}%
+  \ifx\temp\noneword
+    \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent
+  \else\ifx\temp\insertword
+    \let\suppressfirstparagraphindent = \relax
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @firstparagraphindent option `\temp'}%
+  \fi\fi
+}
+
+% Here is how we actually suppress indentation.  Redefine \everypar to
+% \kern backwards by \parindent, and then reset itself to empty.
+%
+% We also make \indent itself not actually do anything until the next
+% paragraph.
+%
+\gdef\dosuppressfirstparagraphindent{%
+  \gdef\indent{%
+    \global\let\indent=\ptexindent
+    \global\everypar = {}%
+  }%
+  \global\everypar = {%
+    \kern-\parindent
+    \global\let\indent=\ptexindent
+    \global\everypar = {}%
+  }%
+}%
+
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math outputs its argument in math mode.
+% We don't use $'s directly in the definition of \math because we need
+% to set catcodes according to plain TeX first, to allow for subscripts,
+% superscripts, special math chars, etc.
+%
+\let\implicitmath = $%$ font-lock fix
+%
+% One complication: _ usually means subscripts, but it could also mean
+% an actual _ character, as in @math{@var{some_variable} + 1}.  So make
+% _ within @math be active (mathcode "8000), and distinguish by seeing
+% if the current family is \slfam, which is what @var uses.
+%
+{\catcode\underChar = \active
+\gdef\mathunderscore{%
+  \catcode\underChar=\active
+  \def_{\ifnum\fam=\slfam \_\else\sb\fi}%
+}}
+%
+% Another complication: we want \\ (and @\) to output a \ character.
+% FYI, plain.tex uses \\ as a temporary control sequence (why?), but
+% this is not advertised and we don't care.  Texinfo does not
+% otherwise define @\.
+%
+% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\.
+\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi}
+%
+\def\math{%
+  \tex
+  \mathcode`\_="8000 \mathunderscore
+  \let\\ = \mathbackslash
+  \mathactive
+  \implicitmath\finishmath}
+\def\finishmath#1{#1\implicitmath\Etex}
+
+% Some active characters (such as <) are spaced differently in math.
+% We have to reset their definitions in case the @math was an
+% argument to a command which set the catcodes (such as @item or @section).
+%
+{
+  \catcode`^ = \active
+  \catcode`< = \active
+  \catcode`> = \active
+  \catcode`+ = \active
+  \gdef\mathactive{%
+    \let^ = \ptexhat
+    \let< = \ptexless
+    \let> = \ptexgtr
+    \let+ = \ptexplus
+  }
+}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+% @refill is a no-op.
+\let\refill=\relax
+
+% If working on a large document in chapters, it is convenient to
+% be able to disable indexing, cross-referencing, and contents, for test runs.
+% This is done with @novalidate (before @setfilename).
+%
+\newif\iflinks \linkstrue % by default we want the aux files.
+\let\novalidate = \linksfalse
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \iflinks
+     \readauxfile
+   \fi % \openindices needs to do some work in any case.
+   \openindices
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   %
+   % If texinfo.cnf is present on the system, read it.
+   % Useful for site-wide @afourpaper, etc.
+   % Just to be on the safe side, close the input stream before the \input.
+   \openin 1 texinfo.cnf
+   \ifeof1 \let\temp=\relax \else \def\temp{\input texinfo.cnf }\fi
+   \closein1
+   \temp
+   %
+   \comment % Ignore the actual filename.
+}
+
+% Called from \setfilename.
+%
+\def\openindices{%
+  \newindex{cp}%
+  \newcodeindex{fn}%
+  \newcodeindex{vr}%
+  \newcodeindex{tp}%
+  \newcodeindex{ky}%
+  \newcodeindex{pg}%
+}
+
+% @bye.
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+
+\message{pdf,}
+% adobe `portable' document format
+\newcount\tempnum
+\newcount\lnkcount
+\newtoks\filename
+\newcount\filenamelength
+\newcount\pgn
+\newtoks\toksA
+\newtoks\toksB
+\newtoks\toksC
+\newtoks\toksD
+\newbox\boxA
+\newcount\countA
+\newif\ifpdf
+\newif\ifpdfmakepagedest
+
+\ifx\pdfoutput\undefined
+  \pdffalse
+  \let\pdfmkdest = \gobble
+  \let\pdfurl = \gobble
+  \let\endlink = \relax
+  \let\linkcolor = \relax
+  \let\pdfmakeoutlines = \relax
+\else
+  \pdftrue
+  \pdfoutput = 1
+  \input pdfcolor
+  \def\dopdfimage#1#2#3{%
+    \def\imagewidth{#2}%
+    \def\imageheight{#3}%
+    % without \immediate, pdftex seg faults when the same image is
+    % included twice.  (Version 3.14159-pre-1.0-unofficial-20010704.)
+    \ifnum\pdftexversion < 14
+      \immediate\pdfimage
+    \else
+      \immediate\pdfximage
+    \fi
+      \ifx\empty\imagewidth\else width \imagewidth \fi
+      \ifx\empty\imageheight\else height \imageheight \fi
+      \ifnum\pdftexversion<13
+         #1.pdf%
+       \else
+         {#1.pdf}%
+       \fi
+    \ifnum\pdftexversion < 14 \else
+      \pdfrefximage \pdflastximage
+    \fi}
+  \def\pdfmkdest#1{{\normalturnoffactive \pdfdest name{#1} xyz}}
+  \def\pdfmkpgn#1{#1}
+  \let\linkcolor = \Blue  % was Cyan, but that seems light?
+  \def\endlink{\Black\pdfendlink}
+  % Adding outlines to PDF; macros for calculating structure of outlines
+  % come from Petr Olsak
+  \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0%
+    \else \csname#1\endcsname \fi}
+  \def\advancenumber#1{\tempnum=\expnumber{#1}\relax
+    \advance\tempnum by1
+    \expandafter\xdef\csname#1\endcsname{\the\tempnum}}
+  \def\pdfmakeoutlines{{%
+    \openin 1 \jobname.toc
+    \ifeof 1\else\begingroup
+      \closein 1
+      % Thanh's hack / proper braces in bookmarks
+      \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace
+      \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace
+      %
+      \def\chapentry ##1##2##3{}
+      \def\secentry ##1##2##3##4{\advancenumber{chap##2}}
+      \def\subsecentry ##1##2##3##4##5{\advancenumber{sec##2.##3}}
+      \def\subsubsecentry ##1##2##3##4##5##6{\advancenumber{subsec##2.##3.##4}}
+      \let\appendixentry = \chapentry
+      \let\unnumbchapentry = \chapentry
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      \input \jobname.toc
+      \def\chapentry ##1##2##3{%
+        \pdfoutline goto name{\pdfmkpgn{##3}}count-\expnumber{chap##2}{##1}}
+      \def\secentry ##1##2##3##4{%
+        \pdfoutline goto name{\pdfmkpgn{##4}}count-\expnumber{sec##2.##3}{##1}}
+      \def\subsecentry ##1##2##3##4##5{%
+        \pdfoutline goto name{\pdfmkpgn{##5}}count-\expnumber{subsec##2.##3.##4}{##1}}
+      \def\subsubsecentry ##1##2##3##4##5##6{%
+        \pdfoutline goto name{\pdfmkpgn{##6}}{##1}}
+      \let\appendixentry = \chapentry
+      \let\unnumbchapentry = \chapentry
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      %
+      % Make special characters normal for writing to the pdf file.
+      %
+      \indexnofonts
+      \let\tt=\relax
+      \turnoffactive
+      \input \jobname.toc
+    \endgroup\fi
+  }}
+  \def\makelinks #1,{%
+    \def\params{#1}\def\E{END}%
+    \ifx\params\E
+      \let\nextmakelinks=\relax
+    \else
+      \let\nextmakelinks=\makelinks
+      \ifnum\lnkcount>0,\fi
+      \picknum{#1}%
+      \startlink attr{/Border [0 0 0]}
+        goto name{\pdfmkpgn{\the\pgn}}%
+      \linkcolor #1%
+      \advance\lnkcount by 1%
+      \endlink
+    \fi
+    \nextmakelinks
+  }
+  \def\picknum#1{\expandafter\pn#1}
+  \def\pn#1{%
+    \def\p{#1}%
+    \ifx\p\lbrace
+      \let\nextpn=\ppn
+    \else
+      \let\nextpn=\ppnn
+      \def\first{#1}
+    \fi
+    \nextpn
+  }
+  \def\ppn#1{\pgn=#1\gobble}
+  \def\ppnn{\pgn=\first}
+  \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\skipspaces#1{\def\PP{#1}\def\D{|}%
+    \ifx\PP\D\let\nextsp\relax
+    \else\let\nextsp\skipspaces
+      \ifx\p\space\else\addtokens{\filename}{\PP}%
+        \advance\filenamelength by 1
+      \fi
+    \fi
+    \nextsp}
+  \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax}
+  \ifnum\pdftexversion < 14
+    \let \startlink \pdfannotlink
+  \else
+    \let \startlink \pdfstartlink
+  \fi
+  \def\pdfurl#1{%
+    \begingroup
+      \normalturnoffactive\def\@{@}%
+      \let\value=\expandablevalue
+      \leavevmode\Red
+      \startlink attr{/Border [0 0 0]}%
+        user{/Subtype /Link /A << /S /URI /URI (#1) >>}%
+        % #1
+    \endgroup}
+  \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}}
+  \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks}
+  \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks}
+  \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}}
+  \def\maketoks{%
+    \expandafter\poptoks\the\toksA|ENDTOKS|
+    \ifx\first0\adn0
+    \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3
+    \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6
+    \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9
+    \else
+      \ifnum0=\countA\else\makelink\fi
+      \ifx\first.\let\next=\done\else
+        \let\next=\maketoks
+        \addtokens{\toksB}{\the\toksD}
+        \ifx\first,\addtokens{\toksB}{\space}\fi
+      \fi
+    \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+    \next}
+  \def\makelink{\addtokens{\toksB}%
+    {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0}
+  \def\pdflink#1{%
+    \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}}
+    \linkcolor #1\endlink}
+  \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st}
+\fi % \ifx\pdfoutput
+
+
+\message{fonts,}
+% Font-change commands.
+
+% Texinfo sort of supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+% We don't need math for this one.
+\def\ttsl{\tenttsl}
+
+% Default leading.
+\newdimen\textleading  \textleading = 13.2pt
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+% #3 is the font's design size, #4 is a scale factor
+\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4}
+
+% Use cm as the default font prefix.
+% To specify the font prefix, you must define \fontprefix
+% before you read in texinfo.tex.
+\ifx\fontprefix\undefined
+\def\fontprefix{cm}
+\fi
+% Support font families that don't use the same naming scheme as CM.
+\def\rmshape{r}
+\def\rmbshape{bx}               %where the normal face is bold
+\def\bfshape{b}
+\def\bxshape{bx}
+\def\ttshape{tt}
+\def\ttbshape{tt}
+\def\ttslshape{sltt}
+\def\itshape{ti}
+\def\itbshape{bxti}
+\def\slshape{sl}
+\def\slbshape{bxsl}
+\def\sfshape{ss}
+\def\sfbshape{ss}
+\def\scshape{csc}
+\def\scbshape{csc}
+
+\newcount\mainmagstep
+\ifx\bigger\relax
+  % not really supported.
+  \mainmagstep=\magstep1
+  \setfont\textrm\rmshape{12}{1000}
+  \setfont\texttt\ttshape{12}{1000}
+\else
+  \mainmagstep=\magstephalf
+  \setfont\textrm\rmshape{10}{\mainmagstep}
+  \setfont\texttt\ttshape{10}{\mainmagstep}
+\fi
+% Instead of cmb10, you may want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10
+% (in Bob's opinion).
+\setfont\textbf\bfshape{10}{\mainmagstep}
+\setfont\textit\itshape{10}{\mainmagstep}
+\setfont\textsl\slshape{10}{\mainmagstep}
+\setfont\textsf\sfshape{10}{\mainmagstep}
+\setfont\textsc\scshape{10}{\mainmagstep}
+\setfont\textttsl\ttslshape{10}{\mainmagstep}
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\setfont\defbf\bxshape{10}{\magstep1} %was 1314
+\setfont\deftt\ttshape{10}{\magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices, footnotes, small examples (9pt).
+\setfont\smallrm\rmshape{9}{1000}
+\setfont\smalltt\ttshape{9}{1000}
+\setfont\smallbf\bfshape{10}{900}
+\setfont\smallit\itshape{9}{1000}
+\setfont\smallsl\slshape{9}{1000}
+\setfont\smallsf\sfshape{9}{1000}
+\setfont\smallsc\scshape{10}{900}
+\setfont\smallttsl\ttslshape{10}{900}
+\font\smalli=cmmi9
+\font\smallsy=cmsy9
+
+% Fonts for small examples (8pt).
+\setfont\smallerrm\rmshape{8}{1000}
+\setfont\smallertt\ttshape{8}{1000}
+\setfont\smallerbf\bfshape{10}{800}
+\setfont\smallerit\itshape{8}{1000}
+\setfont\smallersl\slshape{8}{1000}
+\setfont\smallersf\sfshape{8}{1000}
+\setfont\smallersc\scshape{10}{800}
+\setfont\smallerttsl\ttslshape{10}{800}
+\font\smalleri=cmmi8
+\font\smallersy=cmsy8
+
+% Fonts for title page:
+\setfont\titlerm\rmbshape{12}{\magstep3}
+\setfont\titleit\itbshape{10}{\magstep4}
+\setfont\titlesl\slbshape{10}{\magstep4}
+\setfont\titlett\ttbshape{12}{\magstep3}
+\setfont\titlettsl\ttslshape{10}{\magstep4}
+\setfont\titlesf\sfbshape{17}{\magstep1}
+\let\titlebf=\titlerm
+\setfont\titlesc\scbshape{10}{\magstep4}
+\font\titlei=cmmi12 scaled \magstep3
+\font\titlesy=cmsy10 scaled \magstep4
+\def\authorrm{\secrm}
+\def\authortt{\sectt}
+
+% Chapter (and unnumbered) fonts (17.28pt).
+\setfont\chaprm\rmbshape{12}{\magstep2}
+\setfont\chapit\itbshape{10}{\magstep3}
+\setfont\chapsl\slbshape{10}{\magstep3}
+\setfont\chaptt\ttbshape{12}{\magstep2}
+\setfont\chapttsl\ttslshape{10}{\magstep3}
+\setfont\chapsf\sfbshape{17}{1000}
+\let\chapbf=\chaprm
+\setfont\chapsc\scbshape{10}{\magstep3}
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+% Section fonts (14.4pt).
+\setfont\secrm\rmbshape{12}{\magstep1}
+\setfont\secit\itbshape{10}{\magstep2}
+\setfont\secsl\slbshape{10}{\magstep2}
+\setfont\sectt\ttbshape{12}{\magstep1}
+\setfont\secttsl\ttslshape{10}{\magstep2}
+\setfont\secsf\sfbshape{12}{\magstep1}
+\let\secbf\secrm
+\setfont\secsc\scbshape{10}{\magstep2}
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% Subsection fonts (13.15pt).
+\setfont\ssecrm\rmbshape{12}{\magstephalf}
+\setfont\ssecit\itbshape{10}{1315}
+\setfont\ssecsl\slbshape{10}{1315}
+\setfont\ssectt\ttbshape{12}{\magstephalf}
+\setfont\ssecttsl\ttslshape{10}{1315}
+\setfont\ssecsf\sfbshape{12}{\magstephalf}
+\let\ssecbf\ssecrm
+\setfont\ssecsc\scbshape{10}{\magstep1}
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled 1315
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts except
+% in the main text, we don't bother to reset \scriptfont and
+% \scriptscriptfont (which would also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy
+  \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf
+  \textfont\ttfam=\tentt \textfont\sffam=\tensf
+}
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current font.  Plain TeX does \def\bf{\fam=\bffam
+% \tenbf}, for example.  By redefining \tenbf, we obviate the need to
+% redefine \bf itself.
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl
+  \resetmathfonts \setleading{\textleading}}
+\def\titlefonts{%
+  \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl
+  \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc
+  \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy
+  \let\tenttsl=\titlettsl
+  \resetmathfonts \setleading{25pt}}
+\def\titlefont#1{{\titlefonts\rm #1}}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl
+  \resetmathfonts \setleading{19pt}}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl
+  \resetmathfonts \setleading{16pt}}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl
+  \resetmathfonts \setleading{15pt}}
+\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf?
+\def\smallfonts{%
+  \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl
+  \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc
+  \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy
+  \let\tenttsl=\smallttsl
+  \resetmathfonts \setleading{10.5pt}}
+\def\smallerfonts{%
+  \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl
+  \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc
+  \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy
+  \let\tenttsl=\smallerttsl
+  \resetmathfonts \setleading{9.5pt}}
+
+% Set the fonts to use with the @small... environments.
+\let\smallexamplefonts = \smallfonts
+
+% About \smallexamplefonts.  If we use \smallfonts (9pt), @smallexample
+% can fit this many characters:
+%   8.5x11=86   smallbook=72  a4=90  a5=69
+% If we use \smallerfonts (8pt), then we can fit this many characters:
+%   8.5x11=90+  smallbook=80  a4=90+  a5=77
+% For me, subjectively, the few extra characters that fit aren't worth
+% the additional smallness of 8pt.  So I'm making the default 9pt.
+%
+% By the way, for comparison, here's what fits with @example (10pt):
+%   8.5x11=71  smallbook=60  a4=75  a5=58
+%
+% I wish we used A4 paper on this side of the Atlantic.
+%
+% --karl, 24jan03.
+
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Define these so they can be easily changed for other fonts.
+\def\angleleft{$\langle$}
+\def\angleright{$\rangle$}
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm\rmshape{12}{1000}
+\setfont\shortcontbf\bxshape{12}{1000}
+\setfont\shortcontsl\slshape{12}{1000}
+\setfont\shortconttt\ttshape{12}{1000}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else
+                    \ptexslash\fi\fi\fi}
+\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx}
+\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartslanted
+\let\dfn=\smartslanted
+\let\emph=\smartitalic
+\let\cite=\smartslanted
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+% Set sfcode to normal for the chars that usually have another value.
+% Can't use plain's \frenchspacing because it uses the `\x notation, and
+% sometimes \x has an active definition that messes things up.
+%
+\catcode`@=11
+  \def\frenchspacing{%
+    \sfcode\dotChar  =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m
+    \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m
+  }
+\catcode`@=\other
+
+\def\t#1{%
+  {\tt \rawbackslash \frenchspacing #1}%
+  \null
+}
+\let\ttfont=\t
+\def\samp#1{`\tclose{#1}'\null}
+\setfont\keyrm\rmshape{8}{1000}
+\font\keysy=cmsy9
+\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{%
+  \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{%
+    \vbox{\hrule\kern-0.4pt
+     \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}%
+    \kern-0.4pt\hrule}%
+  \kern-.06em\raise0.4pt\hbox{\angleright}}}}
+% The old definition, with no lozenge:
+%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+% @file, @option are the same as @samp.
+\let\file=\samp
+\let\option=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \frenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overfull hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate at a dash.
+%  -- rms.
+{
+  \catcode`\-=\active
+  \catcode`\_=\active
+  %
+  \global\def\code{\begingroup
+    \catcode`\-=\active \let-\codedash
+    \catcode`\_=\active \let_\codeunder
+    \codex
+  }
+  %
+  % If we end up with any active - characters when handling the index,
+  % just treat them as a normal -.
+  \global\def\indexbreaks{\catcode`\-=\active \let-\realdash}
+}
+
+\def\realdash{-}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{%
+  % this is all so @math{@code{var_name}+1} can work.  In math mode, _
+  % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.)
+  % will therefore expand the active definition of _, which is us
+  % (inside @code that is), therefore an endless loop.
+  \ifusingtt{\ifmmode
+               \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_.
+             \else\normalunderscore \fi
+             \discretionary{}{}{}}%
+            {\_}%
+}
+\def\codex #1{\tclose{#1}\endgroup}
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always),
+%   `example' (@kbd uses ttsl only inside of @example and friends),
+%   or `code' (@kbd uses normal tty font always).
+\def\kbdinputstyle{\parsearg\kbdinputstylexxx}
+\def\kbdinputstylexxx#1{%
+  \def\arg{#1}%
+  \ifx\arg\worddistinct
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}%
+  \else\ifx\arg\wordexample
+    \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}%
+  \else\ifx\arg\wordcode
+    \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}%
+  \else
+    \errhelp = \EMsimple
+    \errmessage{Unknown @kbdinputstyle option `\arg'}%
+  \fi\fi\fi
+}
+\def\worddistinct{distinct}
+\def\wordexample{example}
+\def\wordcode{code}
+
+% Default is `distinct.'
+\kbdinputstyle distinct
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else{\tclose{\kbdfont\look}}\fi
+\else{\tclose{\kbdfont\look}}\fi}
+
+% For @url, @env, @command quotes seem unnecessary, so use \code.
+\let\url=\code
+\let\env=\code
+\let\command=\code
+
+% @uref (abbreviation for `urlref') takes an optional (comma-separated)
+% second argument specifying the text to display and an optional third
+% arg as text to display instead of (rather than in addition to) the url
+% itself.  First (mandatory) arg is the url.  Perhaps eventually put in
+% a hypertex \special here.
+%
+\def\uref#1{\douref #1,,,\finish}
+\def\douref#1,#2,#3,#4\finish{\begingroup
+  \unsepspaces
+  \pdfurl{#1}%
+  \setbox0 = \hbox{\ignorespaces #3}%
+  \ifdim\wd0 > 0pt
+    \unhbox0 % third arg given, show only that
+  \else
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0 > 0pt
+      \ifpdf
+        \unhbox0             % PDF: 2nd arg given, show only it
+      \else
+        \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url
+      \fi
+    \else
+      \code{#1}% only url given, so show it
+    \fi
+  \fi
+  \endlink
+\endgroup}
+
+% rms does not like angle brackets --karl, 17may97.
+% So now @email is just like @uref, unless we are pdf.
+%
+%\def\email#1{\angleleft{\tt #1}\angleright}
+\ifpdf
+  \def\email#1{\doemail#1,,\finish}
+  \def\doemail#1,#2,#3\finish{\begingroup
+    \unsepspaces
+    \pdfurl{mailto:#1}%
+    \setbox0 = \hbox{\ignorespaces #2}%
+    \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi
+    \endlink
+  \endgroup}
+\else
+  \let\email=\uref
+\fi
+
+% Check if we are currently using a typewriter font.  Since all the
+% Computer Modern typewriter fonts have zero interword stretch (and
+% shrink), and it is reasonable to expect all typewriter fonts to have
+% this property, we can check that font parameter.
+%
+\def\ifmonospace{\ifdim\fontdimen3\font=0pt }
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+% @l was never documented to mean ``switch to the Lisp font'',
+% and it is not used as such in any manual I can find.  We need it for
+% Polish suppressed-l.  --karl, 22sep96.
+%\def\l#1{{\li #1}\null}
+
+% Explicit font changes: @r, @sc, undocumented @ii.
+\def\r#1{{\rm #1}}              % roman font
+\def\sc#1{{\smallcaps#1}}       % smallcaps font
+\def\ii#1{{\it #1}}             % italic font
+
+% @acronym downcases the argument and prints in smallcaps.
+\def\acronym#1{{\smallcaps \lowercase{#1}}}
+
+% @pounds{} is a sterling sign.
+\def\pounds{{\it\$}}
+
+% @registeredsymbol - R in a circle.  For now, only works in text size;
+% we'd have to redo the font mechanism to change the \scriptstyle and
+% \scriptscriptstyle font sizes to make it look right in headings.
+% Adapted from the plain.tex definition of \copyright.
+%
+\def\registeredsymbol{%
+  $^{{\ooalign{\hfil\raise.07ex\hbox{$\scriptstyle\rm R$}\hfil\crcr\Orb}}%
+    }$%
+}
+
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+% Do an implicit @contents or @shortcontents after @end titlepage if the
+% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage.
+%
+\newif\ifsetcontentsaftertitlepage
+ \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue
+\newif\ifsetshortcontentsaftertitlepage
+ \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+        \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+   \let\subtitlerm=\tenrm
+   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+   %
+   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines
+                   \let\tt=\authortt}%
+   %
+   % Leave some space at the very top of the page.
+   \vglue\titlepagetopglue
+   %
+   % Now you can print the title using @title.
+   \def\title{\parsearg\titlezzz}%
+   \def\titlezzz##1{\leftline{\titlefonts\rm ##1}
+                    % print a rule at the page bottom also.
+                    \finishedtitlepagefalse
+                    \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+   % No rule at page bottom unless we print one at the top with @title.
+   \finishedtitlepagetrue
+   %
+   % Now you can put text using @subtitle.
+   \def\subtitle{\parsearg\subtitlezzz}%
+   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+   %
+   % @author should come last, but may come many times.
+   \def\author{\parsearg\authorzzz}%
+   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+      {\authorfont \leftline{##1}}}%
+   %
+   % Most title ``pages'' are actually two pages long, with space
+   % at the top of the second.  We don't want the ragged left on the second.
+   \let\oldpage = \page
+   \def\page{%
+      \iffinishedtitlepage\else
+         \finishtitlepage
+      \fi
+      \oldpage
+      \let\page = \oldpage
+      \hbox{}}%
+%   \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+   \iffinishedtitlepage\else
+      \finishtitlepage
+   \fi
+   % It is important to do the page break before ending the group,
+   % because the headline and footline are only empty inside the group.
+   % If we use the new definition of \page, we always get a blank page
+   % after the title page, which we certainly don't want.
+   \oldpage
+   \endgroup
+   %
+   % Need this before the \...aftertitlepage checks so that if they are
+   % in effect the toc pages will come out with page numbers.
+   \HEADINGSon
+   %
+   % If they want short, they certainly want long too.
+   \ifsetshortcontentsaftertitlepage
+     \shortcontents
+     \contents
+     \global\let\shortcontents = \relax
+     \global\let\contents = \relax
+   \fi
+   %
+   \ifsetcontentsaftertitlepage
+     \contents
+     \global\let\contents = \relax
+     \global\let\shortcontents = \relax
+   \fi
+}
+
+\def\finishtitlepage{%
+   \vskip4pt \hrule height 2pt width \hsize
+   \vskip\titlepagebottomglue
+   \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks\evenheadline    % headline on even pages
+\newtoks\oddheadline     % headline on odd pages
+\newtoks\evenfootline    % footline on even pages
+\newtoks\oddfootline     % footline on odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx#1{\oddheadingxxx{#1}\evenheadingxxx{#1}}%
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+  \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}%
+  %
+  % Leave some space for the footline.  Hopefully ok to assume
+  % @evenfooting will not be used by itself.
+  \global\advance\pageheight by -\baselineskip
+  \global\advance\vsize by -\baselineskip
+}
+
+\gdef\everyfootingxxx#1{\oddfootingxxx{#1}\evenfootingxxx{#1}}
+%
+}% unbind the catcode of @.
+
+% @headings double      turns headings on for double-sided printing.
+% @headings single      turns headings on for single-sided printing.
+% @headings off         turns them off.
+% @headings on          same as @headings double, retained for compatibility.
+% @headings after       turns on double-sided headings after this page.
+% @headings doubleafter turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off at the start of a document,
+% and turned `on' after @end titlepage.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+\let\contentsalignmacro = \chappager
+
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chapoddpage
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+\global\let\contentsalignmacro = \chappager
+}
+
+% Subroutines used in generating headings
+% This produces Day Month Year style of output.
+% Only define if not already defined, in case a txi-??.tex file has set
+% up a different format (e.g., txi-cs.tex does this).
+\ifx\today\undefined
+\def\today{%
+  \number\day\space
+  \ifcase\month
+  \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr
+  \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug
+  \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec
+  \fi
+  \space\number\year}
+\fi
+
+% @settitle line...  specifies the title of the document, for headings.
+% It generates no output of its own.
+\def\thistitle{\putwordNoTitle}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+
+\message{tables,}
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+                 \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+                 \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemfont{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  (Unfortunately
+    % we can't prevent a possible page break at the following
+    % \baselineskip glue.)  However, if what follows is an environment
+    % such as @example, there will be no \parskip glue; then
+    % the negative vskip we just would cause the example and the item to
+    % crash together.  So we use this bizarre value of 10001 as a signal
+    % to \aboveenvbreak to insert \parskip glue after all.
+    % (Possibly there are other commands that could be followed by
+    % @example which need the same treatment, but not section titles; or
+    % maybe section titles are the only special case and they should be
+    % penalty 10001...)
+    \penalty 10001
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.
+    \noindent
+    % Do this with kerns and \unhbox so that if there is a footnote in
+    % the item text, it can migrate to the main vertical list and
+    % eventually be printed.
+    \nobreak\kern-\tableindent
+    \dimen0 = \itemmax  \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0
+    \unhbox0
+    \nobreak\kern\dimen0
+    \endgroup
+    \itemxneedsnegativevskiptrue
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+% Contains a kludge to get @end[description] to work.
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+% @table, @ftable, @vtable.
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1        \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1        \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1        \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Necessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+  \begingroup % ended by the @end itemize
+  \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey#1#2{%
+  \aboveenvbreak
+  \itemmax=\itemindent
+  \advance\itemmax by -\itemmargin
+  \advance\leftskip by \itemindent
+  \exdentamount=\itemindent
+  \parindent=0pt
+  \parskip=\smallskipamount
+  \ifdim\parskip=0pt \parskip=2pt \fi
+  \def#2{\endgraf\afterenvbreak\endgroup}%
+  \def\itemcontents{#1}%
+  % @itemize with no arg is equivalent to @itemize @bullet.
+  \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi
+  \let\item=\itemizeitem
+}
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  \begingroup % ended by the @end enumerate
+  %
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{In hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94, 3/6/96
+%
+% @multitable ... @end multitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble.  Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize:
+%   @multitable @columnfractions .25 .3 .45
+%   @item ...
+%
+%   Numbers following @columnfractions are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+%
+% For those who want to use more than one line's worth of words in
+% the preamble, break the line within one argument and it
+% will parse correctly, i.e.,
+%
+%     @multitable {Column 1 template} {Column 2 template} {Column 3
+%      template}
+% Not:
+%     @multitable {Column 1 template} {Column 2 template}
+%      {Column 3 template}
+
+% Each new table line starts with @item, each subsequent new column
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multitable or @end multitable do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item
+%   first col stuff
+%   @tab
+%   second col stuff
+%   @tab
+%   third col
+%   @item first col stuff @tab second col stuff
+%   @tab Many paragraphs of text may be used in any column.
+%
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @end multitable
+
+% Default dimensions may be reset by user.
+% @multitableparskip is vertical space between paragraphs in table.
+% @multitableparindent is paragraph indent in table.
+% @multitablecolmargin is horizontal space to be left between columns.
+% @multitablelinespace is space to leave between table items, baseline
+%                                                            to baseline.
+%   0pt means it depends on current normal line spacing.
+%
+\newskip\multitableparskip
+\newskip\multitableparindent
+\newdimen\multitablecolspace
+\newskip\multitablelinespace
+\multitableparskip=0pt
+\multitableparindent=6pt
+\multitablecolspace=12pt
+\multitablelinespace=0pt
+
+% Macros used to set up halign preamble:
+%
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\columnfractions\relax
+\def\xcolumnfractions{\columnfractions}
+\newif\ifsetpercent
+
+% #1 is the part of the @columnfraction before the decimal point, which
+% is presumably either 0 or the empty string (but we don't check, we
+% just throw it away).  #2 is the decimal part, which we use as the
+% percent of \hsize for this column.
+\def\pickupwholefraction#1.#2 {%
+  \global\advance\colcount by 1
+  \expandafter\xdef\csname col\the\colcount\endcsname{.#2\hsize}%
+  \setuptable
+}
+
+\newcount\colcount
+\def\setuptable#1{%
+  \def\firstarg{#1}%
+  \ifx\firstarg\xendsetuptable
+    \let\go = \relax
+  \else
+    \ifx\firstarg\xcolumnfractions
+      \global\setpercenttrue
+    \else
+      \ifsetpercent
+         \let\go\pickupwholefraction
+      \else
+         \global\advance\colcount by 1
+         \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a
+                   % separator; typically that is always in the input, anyway.
+         \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+      \fi
+    \fi
+    \ifx\go\pickupwholefraction
+      % Put the argument back for the \pickupwholefraction call, so
+      % we'll always have a period there to be parsed.
+      \def\go{\pickupwholefraction#1}%
+    \else
+      \let\go = \setuptable
+    \fi%
+  \fi
+  \go
+}
+
+% @multitable ... @end multitable definitions:
+%
+\def\multitable{\parsearg\dotable}
+\def\dotable#1{\bgroup
+  \vskip\parskip
+  \let\item=\crcrwithfootnotes
+  % A \tab used to include \hskip1sp.  But then the space in a template
+  % line is not enough.  That is bad.  So let's go back to just & until
+  % we encounter the problem it was intended to solve again.  --karl,
+  % nathan@acm.org, 20apr99.
+  \let\tab=&%
+  \let\startfootins=\startsavedfootnote
+  \tolerance=9500
+  \hbadness=9500
+  \setmultitablespacing
+  \parskip=\multitableparskip
+  \parindent=\multitableparindent
+  \overfullrule=0pt
+  \global\colcount=0
+  \def\Emultitable{%
+    \global\setpercentfalse
+    \crcrwithfootnotes\crcr
+    \egroup\egroup
+  }%
+  %
+  % To parse everything between @multitable and @item:
+  \setuptable#1 \endsetuptable
+  %
+  % \everycr will reset column counter, \colcount, at the end of
+  % each line. Every column entry will cause \colcount to advance by one.
+  % The table preamble
+  % looks at the current \colcount to find the correct column width.
+  \everycr{\noalign{%
+  %
+  % \filbreak%% keeps underfull box messages off when table breaks over pages.
+  % Maybe so, but it also creates really weird page breaks when the table
+  % breaks over pages. Wouldn't \vfil be better?  Wait until the problem
+  % manifests itself, so it can be fixed for real --karl.
+    \global\colcount=0\relax}}%
+  %
+  % This preamble sets up a generic column definition, which will
+  % be used as many times as user calls for columns.
+  % \vtop will set a single line and will also let text wrap and
+  % continue for many paragraphs if desired.
+  \halign\bgroup&\global\advance\colcount by 1\relax
+    \multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+  %
+  % In order to keep entries from bumping into each other
+  % we will add a \leftskip of \multitablecolspace to all columns after
+  % the first one.
+  %
+  % If a template has been used, we will add \multitablecolspace
+  % to the width of each template entry.
+  %
+  % If the user has set preamble in terms of percent of \hsize we will
+  % use that dimension as the width of the column, and the \leftskip
+  % will keep entries from bumping into each other.  Table will start at
+  % left margin and final column will justify at right margin.
+  %
+  % Make sure we don't inherit \rightskip from the outer environment.
+  \rightskip=0pt
+  \ifnum\colcount=1
+    % The first column will be indented with the surrounding text.
+    \advance\hsize by\leftskip
+  \else
+    \ifsetpercent \else
+      % If user has not set preamble in terms of percent of \hsize
+      % we will advance \hsize by \multitablecolspace.
+      \advance\hsize by \multitablecolspace
+    \fi
+   % In either case we will make \leftskip=\multitablecolspace:
+  \leftskip=\multitablecolspace
+  \fi
+  % Ignoring space at the beginning and end avoids an occasional spurious
+  % blank line, when TeX decides to break the line at the space before the
+  % box from the multistrut, so the strut ends up on a line by itself.
+  % For example:
+  % @multitable @columnfractions .11 .89
+  % @item @code{#}
+  % @tab Legal holiday which is valid in major parts of the whole country.
+  % Is automatically provided with highlighting sequences respectively marking
+  % characters.
+  \noindent\ignorespaces##\unskip\multistrut}\cr
+}
+
+\def\setmultitablespacing{% test to see if user has set \multitablelinespace.
+% If so, do nothing. If not, give it an appropriate dimension based on
+% current baselineskip.
+\ifdim\multitablelinespace=0pt
+\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip
+\global\advance\multitablelinespace by-\ht0
+%% strut to put in table in case some entry doesn't have descenders,
+%% to keep lines equally spaced
+\let\multistrut = \strut
+\else
+%% FIXME: what is \box0 supposed to be?
+\gdef\multistrut{\vrule height\multitablelinespace depth\dp0
+width0pt\relax} \fi
+%% Test to see if parskip is larger than space between lines of
+%% table. If not, do nothing.
+%%        If so, set to same dimension as multitablelinespace.
+\ifdim\multitableparskip>\multitablelinespace
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi%
+\ifdim\multitableparskip=0pt
+\global\multitableparskip=\multitablelinespace
+\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller
+                                      %% than skip between lines in the table.
+\fi}
+
+% In case a @footnote appears inside an alignment, save the footnote
+% text to a box and make the \insert when a row of the table is
+% finished.  Otherwise, the insertion is lost, it never migrates to the
+% main vertical list.  --kasal, 22jan03.
+%
+\newbox\savedfootnotes
+%
+% \dotable \let's \startfootins to this, so that \dofootnote will call
+% it instead of starting the insertion right away.
+\def\startsavedfootnote{%
+  \global\setbox\savedfootnotes = \vbox\bgroup
+    \unvbox\savedfootnotes
+}
+\def\crcrwithfootnotes{%
+  \crcr
+  \ifvoid\savedfootnotes \else
+    \noalign{\insert\footins{\box\savedfootnotes}}%
+  \fi
+}
+
+\message{conditionals,}
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+  \let\chapter=\relax
+  \let\unnumbered=\relax
+  \let\top=\relax
+  \let\unnumberedsec=\relax
+  \let\unnumberedsection=\relax
+  \let\unnumberedsubsec=\relax
+  \let\unnumberedsubsection=\relax
+  \let\unnumberedsubsubsec=\relax
+  \let\unnumberedsubsubsection=\relax
+  \let\section=\relax
+  \let\subsec=\relax
+  \let\subsubsec=\relax
+  \let\subsection=\relax
+  \let\subsubsection=\relax
+  \let\appendix=\relax
+  \let\appendixsec=\relax
+  \let\appendixsection=\relax
+  \let\appendixsubsec=\relax
+  \let\appendixsubsection=\relax
+  \let\appendixsubsubsec=\relax
+  \let\appendixsubsubsection=\relax
+  \let\contents=\relax
+  \let\smallbook=\relax
+  \let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+% We use \empty instead of \relax for the @def... commands, so that \end
+% doesn't throw an error.  For instance:
+% @ignore
+% @deffn ...
+% @end deffn
+% @end ignore
+%
+% The @end deffn is going to get expanded, because we're trying to allow
+% nested conditionals.  But we don't want to expand the actual @deffn,
+% since it might be syntactically correct and intended to be ignored.
+% Since \end checks for \relax, using \empty does not cause an error.
+%
+\def\ignoremorecommands{%
+  \let\defcodeindex = \relax
+  \let\defcv = \empty
+  \let\defcvx = \empty
+  \let\Edefcv = \empty
+  \let\deffn = \empty
+  \let\deffnx = \empty
+  \let\Edeffn = \empty
+  \let\defindex = \relax
+  \let\defivar = \empty
+  \let\defivarx = \empty
+  \let\Edefivar = \empty
+  \let\defmac = \empty
+  \let\defmacx = \empty
+  \let\Edefmac = \empty
+  \let\defmethod = \empty
+  \let\defmethodx = \empty
+  \let\Edefmethod = \empty
+  \let\defop = \empty
+  \let\defopx = \empty
+  \let\Edefop = \empty
+  \let\defopt = \empty
+  \let\defoptx = \empty
+  \let\Edefopt = \empty
+  \let\defspec = \empty
+  \let\defspecx = \empty
+  \let\Edefspec = \empty
+  \let\deftp = \empty
+  \let\deftpx = \empty
+  \let\Edeftp = \empty
+  \let\deftypefn = \empty
+  \let\deftypefnx = \empty
+  \let\Edeftypefn = \empty
+  \let\deftypefun = \empty
+  \let\deftypefunx = \empty
+  \let\Edeftypefun = \empty
+  \let\deftypeivar = \empty
+  \let\deftypeivarx = \empty
+  \let\Edeftypeivar = \empty
+  \let\deftypemethod = \empty
+  \let\deftypemethodx = \empty
+  \let\Edeftypemethod = \empty
+  \let\deftypeop = \empty
+  \let\deftypeopx = \empty
+  \let\Edeftypeop = \empty
+  \let\deftypevar = \empty
+  \let\deftypevarx = \empty
+  \let\Edeftypevar = \empty
+  \let\deftypevr = \empty
+  \let\deftypevrx = \empty
+  \let\Edeftypevr = \empty
+  \let\defun = \empty
+  \let\defunx = \empty
+  \let\Edefun = \empty
+  \let\defvar = \empty
+  \let\defvarx = \empty
+  \let\Edefvar = \empty
+  \let\defvr = \empty
+  \let\defvrx = \empty
+  \let\Edefvr = \empty
+  \let\clear = \relax
+  \let\down = \relax
+  \let\evenfooting = \relax
+  \let\evenheading = \relax
+  \let\everyfooting = \relax
+  \let\everyheading = \relax
+  \let\headings = \relax
+  \let\include = \relax
+  \let\item = \relax
+  \let\lowersections = \relax
+  \let\oddfooting = \relax
+  \let\oddheading = \relax
+  \let\printindex = \relax
+  \let\pxref = \relax
+  \let\raisesections = \relax
+  \let\ref = \relax
+  \let\set = \relax
+  \let\setchapternewpage = \relax
+  \let\setchapterstyle = \relax
+  \let\settitle = \relax
+  \let\up = \relax
+  \let\verbatiminclude = \relax
+  \let\xref = \relax
+}
+
+% Ignore @ignore, @ifhtml, @ifinfo, and the like.
+%
+\def\direntry{\doignore{direntry}}
+\def\documentdescriptionword{documentdescription}
+\def\documentdescription{\doignore{documentdescription}}
+\def\html{\doignore{html}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifnottex{\doignore{ifnottex}}
+\def\ifplaintext{\doignore{ifplaintext}}
+\def\ifxml{\doignore{ifxml}}
+\def\ignore{\doignore{ignore}}
+\def\menu{\doignore{menu}}
+\def\xml{\doignore{xml}}
+
+% @dircategory CATEGORY  -- specify a category of the dir file
+% which this file should belong to.  Ignore this in TeX.
+\let\dircategory = \comment
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+  % Don't complain about control sequences we have declared \outer.
+  \ignoresections
+  %
+  % Define a command to swallow text until we reach `@end #1'.
+  % This @ is a catcode 12 token (that is the normal catcode of @ in
+  % this texinfo.tex file).  We change the catcode of @ below to match.
+  \long\def\doignoretext##1@end #1{\enddoignore}%
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \catcode\spaceChar = 10
+  %
+  % Ignore braces, too, so mismatched braces don't cause trouble.
+  \catcode`\{ = 9
+  \catcode`\} = 9
+  %
+  % We must not have @c interpreted as a control sequence.
+  \catcode`\@ = 12
+  %
+  \def\ignoreword{#1}%
+  \ifx\ignoreword\documentdescriptionword
+    % The c kludge breaks documentdescription, since
+    % `documentdescription' contains a `c'.  Means not everything will
+    % be ignored inside @documentdescription, but oh well...
+  \else
+    % Make the letter c a comment character so that the rest of the line
+    % will be ignored. This way, the document can have (for example)
+    %   @c @end ifinfo
+    % and the @end ifinfo will be properly ignored.
+    % (We've just changed @ to catcode 12.)
+    \catcode`\c = 14
+  \fi
+  %
+  % And now expand the command defined above.
+  \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+  \ifwarnedobs\relax\else
+  % We need to warn folks that they may have trouble with TeX 3.0.
+  % This uses \immediate\write16 rather than \message to get newlines.
+    \immediate\write16{}
+    \immediate\write16{WARNING: for users of Unix TeX 3.0!}
+    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+    \immediate\write16{If you are running another version of TeX, relax.}
+    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+    \immediate\write16{  Then upgrade your TeX installation if you can.}
+    \immediate\write16{  (See ftp://ftp.gnu.org/non-gnu/TeX.README.)}
+    \immediate\write16{If you are stuck with version 3.0, run the}
+    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
+    \immediate\write16{  to use a workaround.}
+    \immediate\write16{}
+    \global\warnedobstrue
+    \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+  \obstexwarn
+  % We must actually expand the ignored text to look for the @end
+  % command, so that nested ignore constructs work.  Thus, we put the
+  % text into a \vbox and then do nothing with the result.  To minimize
+  % the chance of memory overflow, we follow the approach outlined on
+  % page 401 of the TeXbook.
+  %
+  \setbox0 = \vbox\bgroup
+    % Don't complain about control sequences we have declared \outer.
+    \ignoresections
+    %
+    % Define `@end #1' to end the box, which will in turn undefine the
+    % @end command again.
+    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+    %
+    % We are going to be parsing Texinfo commands.  Most cause no
+    % trouble when they are used incorrectly, but some commands do
+    % complicated argument parsing or otherwise get confused, so we
+    % undefine them.
+    %
+    % We can't do anything about stray @-signs, unfortunately;
+    % they'll produce `undefined control sequence' errors.
+    \ignoremorecommands
+    %
+    % Set the current font to be \nullfont, a TeX primitive, and define
+    % all the font commands to also use \nullfont.  We don't use
+    % dummy.tfm, as suggested in the TeXbook, because some sites
+    % might not have that installed.  Therefore, math mode will still
+    % produce output, but that should be an extremely small amount of
+    % stuff compared to the main input.
+    %
+    \nullfont
+    \let\tenrm=\nullfont \let\tenit=\nullfont \let\tensl=\nullfont
+    \let\tenbf=\nullfont \let\tentt=\nullfont \let\smallcaps=\nullfont
+    \let\tensf=\nullfont
+    % Similarly for index fonts.
+    \let\smallrm=\nullfont \let\smallit=\nullfont \let\smallsl=\nullfont
+    \let\smallbf=\nullfont \let\smalltt=\nullfont \let\smallsc=\nullfont
+    \let\smallsf=\nullfont
+    % Similarly for smallexample fonts.
+    \let\smallerrm=\nullfont \let\smallerit=\nullfont \let\smallersl=\nullfont
+    \let\smallerbf=\nullfont \let\smallertt=\nullfont \let\smallersc=\nullfont
+    \let\smallersf=\nullfont
+    %
+    % Don't complain when characters are missing from the fonts.
+    \tracinglostchars = 0
+    %
+    % Don't bother to do space factor calculations.
+    \frenchspacing
+    %
+    % Don't report underfull hboxes.
+    \hbadness = 10000
+    %
+    % Do minimal line-breaking.
+    \pretolerance = 10000
+    %
+    % Do not execute instructions in @tex.
+    \def\tex{\doignore{tex}}%
+    % Do not execute macro definitions.
+    % `c' is a comment character, so the word `macro' will get cut off.
+    \def\macro{\doignore{ma}}%
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.  Make sure the catcode of space is correct to avoid
+% losing inside @example, for instance.
+%
+\def\set{\begingroup\catcode` =10
+  \catcode`\-=12 \catcode`\_=12 % Allow - and _ in VAR.
+  \parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  \def\temp{#2}%
+  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+  \fi
+  \endgroup
+}
+% Can't use \xdef to pre-expand #2 and save some time, since \temp or
+% \next or other control sequences that we've defined might get us into
+% an infinite loop. Consider `@set foo @cite{bar}'.
+\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+{
+  \catcode`\_ = \active
+  %
+  % We might end up with active _ or - characters in the argument if
+  % we're called from @code, as @code{@value{foo-bar_}}.  So \let any
+  % such active characters to their normal equivalents.
+  \gdef\value{\begingroup
+    \catcode`\-=\other \catcode`\_=\other
+    \indexbreaks \let_\normalunderscore
+    \valuexxx}
+}
+\def\valuexxx#1{\expandablevalue{#1}\endgroup}
+
+% We have this subroutine so that we can handle at least some @value's
+% properly in indexes (we \let\value to this in \indexdummies).  Ones
+% whose names contain - or _ still won't work, but we can't do anything
+% about that.  The command has to be fully expandable (if the variable
+% is set), since the result winds up in the index file.  This means that
+% if the variable's value contains other Texinfo commands, it's almost
+% certain it will fail (although perhaps we could fix that with
+% sufficient work to do a one-level expansion on the result, instead of
+% complete).
+%
+\def\expandablevalue#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    {[No value for ``#1'']}%
+    \message{Variable `#1', used in @value, is not set.}%
+  \else
+    \csname SET#1\endcsname
+  \fi
+}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\doifset}
+\def\doifset#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \let\next=\ifsetfail
+  \else
+    \let\next=\ifsetsucceed
+  \fi
+  \next
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\doifclear}
+\def\doifclear#1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \let\next=\ifclearsucceed
+  \else
+    \let\next=\ifclearfail
+  \fi
+  \next
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex, @ifnothtml, @ifnotinfo, @ifnotplaintext always succeed; we
+% read the text following, through the first @end iftex (etc.).  Make
+% `@end iftex' (etc.) valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\def\ifnothtml{\conditionalsucceed{ifnothtml}}
+\def\ifnotinfo{\conditionalsucceed{ifnotinfo}}
+\def\ifnotplaintext{\conditionalsucceed{ifnotplaintext}}
+\defineunmatchedend{iftex}
+\defineunmatchedend{ifnothtml}
+\defineunmatchedend{ifnotinfo}
+\defineunmatchedend{ifnotplaintext}
+
+% True conditional.  Since \set globally defines its variables, we can
+% just start and end a group (to keep the @end definition undefined at
+% the outer level).
+%
+\def\conditionalsucceed#1{\begingroup
+  \expandafter\def\csname E#1\endcsname{\endgroup}%
+}
+
+% @defininfoenclose.
+\let\definfoenclose=\comment
+
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+%
+\def\newindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1 % Open the file
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%     % Define @#1index
+    \noexpand\doindex{#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+%
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+%
+\def\defcodeindex{\parsearg\newcodeindex}
+%
+\def\newcodeindex#1{%
+  \iflinks
+    \expandafter\newwrite \csname#1indfile\endcsname
+    \openout \csname#1indfile\endcsname \jobname.#1
+  \fi
+  \expandafter\xdef\csname#1index\endcsname{%
+    \noexpand\docodeindex{#1}}%
+}
+
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+%
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+%
+\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}}
+\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}}
+
+% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo),
+% #3 the target index (bar).
+\def\dosynindex#1#2#3{%
+  % Only do \closeout if we haven't already done it, else we'll end up
+  % closing the target index.
+  \expandafter \ifx\csname donesynindex#2\endcsname \undefined
+    % The \closeout helps reduce unnecessary open files; the limit on the
+    % Acorn RISC OS is a mere 16 files.
+    \expandafter\closeout\csname#2indfile\endcsname
+    \expandafter\let\csname\donesynindex#2\endcsname = 1
+  \fi
+  % redefine \fooindfile:
+  \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname
+  \expandafter\let\csname#2indfile\endcsname=\temp
+  % redefine \fooindex:
+  \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+% Take care of Texinfo commands that can appear in an index entry.
+% Since there are some commands we want to expand, and others we don't,
+% we have to laboriously prevent expansion for those that we don't.
+%
+\def\indexdummies{%
+  \def\@{@}% change to @@ when we switch to @ as escape char in index files.
+  \def\ {\realbackslash\space }%
+  % Need these in case \tex is in effect and \{ is a \delimiter again.
+  % But can't use \lbracecmd and \rbracecmd because texindex assumes
+  % braces and backslashes are used only as delimiters.
+  \let\{ = \mylbrace
+  \let\} = \myrbrace
+  %
+  % \definedummyword defines \#1 as \realbackslash #1\space, thus
+  % effectively preventing its expansion.  This is used only for control
+  % words, not control letters, because the \space would be incorrect
+  % for control characters, but is needed to separate the control word
+  % from whatever follows.
+  %
+  % For control letters, we have \definedummyletter, which omits the
+  % space.
+  %
+  % These can be used both for control words that take an argument and
+  % those that do not.  If it is followed by {arg} in the input, then
+  % that will dutifully get written to the index (or wherever).
+  %
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{\realbackslash ##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% For the aux file, @ is the escape character.  So we want to redefine
+% everything using @ instead of \realbackslash.  When everything uses
+% @, this will be simpler.
+%
+\def\atdummies{%
+  \def\@{@@}%
+  \def\ {@ }%
+  \let\{ = \lbraceatcmd
+  \let\} = \rbraceatcmd
+  %
+  % (See comments in \indexdummies.)
+  \def\definedummyword##1{%
+    \expandafter\def\csname ##1\endcsname{@##1\space}%
+  }%
+  \def\definedummyletter##1{%
+    \expandafter\def\csname ##1\endcsname{@##1}%
+  }%
+  %
+  % Do the redefinitions.
+  \commondummies
+}
+
+% Called from \indexdummies and \atdummies.  \definedummyword and
+% \definedummyletter must be defined first.
+%
+\def\commondummies{%
+  %
+  \normalturnoffactive
+  %
+  % Control letters and accents.
+  \definedummyletter{_}%
+  \definedummyletter{,}%
+  \definedummyletter{"}%
+  \definedummyletter{`}%
+  \definedummyletter{'}%
+  \definedummyletter{^}%
+  \definedummyletter{~}%
+  \definedummyletter{=}%
+  \definedummyword{u}%
+  \definedummyword{v}%
+  \definedummyword{H}%
+  \definedummyword{dotaccent}%
+  \definedummyword{ringaccent}%
+  \definedummyword{tieaccent}%
+  \definedummyword{ubaraccent}%
+  \definedummyword{udotaccent}%
+  \definedummyword{dotless}%
+  %
+  % Other non-English letters.
+  \definedummyword{AA}%
+  \definedummyword{AE}%
+  \definedummyword{L}%
+  \definedummyword{OE}%
+  \definedummyword{O}%
+  \definedummyword{aa}%
+  \definedummyword{ae}%
+  \definedummyword{l}%
+  \definedummyword{oe}%
+  \definedummyword{o}%
+  \definedummyword{ss}%
+  %
+  % Although these internal commands shouldn't show up, sometimes they do.
+  \definedummyword{bf}%
+  \definedummyword{gtr}%
+  \definedummyword{hat}%
+  \definedummyword{less}%
+  \definedummyword{sf}%
+  \definedummyword{sl}%
+  \definedummyword{tclose}%
+  \definedummyword{tt}%
+  %
+  % Texinfo font commands.
+  \definedummyword{b}%
+  \definedummyword{i}%
+  \definedummyword{r}%
+  \definedummyword{sc}%
+  \definedummyword{t}%
+  %
+  \definedummyword{TeX}%
+  \definedummyword{acronym}%
+  \definedummyword{cite}%
+  \definedummyword{code}%
+  \definedummyword{command}%
+  \definedummyword{dfn}%
+  \definedummyword{dots}%
+  \definedummyword{emph}%
+  \definedummyword{env}%
+  \definedummyword{file}%
+  \definedummyword{kbd}%
+  \definedummyword{key}%
+  \definedummyword{math}%
+  \definedummyword{option}%
+  \definedummyword{samp}%
+  \definedummyword{strong}%
+  \definedummyword{uref}%
+  \definedummyword{url}%
+  \definedummyword{var}%
+  \definedummyword{w}%
+  %
+  % Assorted special characters.
+  \definedummyword{bullet}%
+  \definedummyword{copyright}%
+  \definedummyword{dots}%
+  \definedummyword{enddots}%
+  \definedummyword{equiv}%
+  \definedummyword{error}%
+  \definedummyword{expansion}%
+  \definedummyword{minus}%
+  \definedummyword{pounds}%
+  \definedummyword{point}%
+  \definedummyword{print}%
+  \definedummyword{result}%
+  %
+  % Handle some cases of @value -- where the variable name does not
+  % contain - or _, and the value does not contain any
+  % (non-fully-expandable) commands.
+  \let\value = \expandablevalue
+  %
+  % Normal spaces, not active ones.
+  \unsepspaces
+  %
+  % No macro expansion.
+  \turnoffmacros
+}
+
+% If an index command is used in an @example environment, any spaces
+% therein should become regular spaces in the raw index file, not the
+% expansion of \tie (\leavevmode \penalty \@M \ ).
+{\obeyspaces
+ \gdef\unsepspaces{\obeyspaces\let =\space}}
+
+
+% \indexnofonts is used when outputting the strings to sort the index
+% by, and when constructing control sequence names.  It eliminates all
+% control sequences and just writes whatever the best ASCII sort string
+% would be for a given command (usually its argument).
+%
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+%
+\def\indexnofonts{%
+  \def\ { }%
+  \def\@{@}%
+  % how to handle braces?
+  \def\_{\normalunderscore}%
+  %
+  \let\,=\asis
+  \let\"=\asis
+  \let\`=\asis
+  \let\'=\asis
+  \let\^=\asis
+  \let\~=\asis
+  \let\==\asis
+  \let\u=\asis
+  \let\v=\asis
+  \let\H=\asis
+  \let\dotaccent=\asis
+  \let\ringaccent=\asis
+  \let\tieaccent=\asis
+  \let\ubaraccent=\asis
+  \let\udotaccent=\asis
+  \let\dotless=\asis
+  %
+  % Other non-English letters.
+  \def\AA{AA}%
+  \def\AE{AE}%
+  \def\L{L}%
+  \def\OE{OE}%
+  \def\O{O}%
+  \def\aa{aa}%
+  \def\ae{ae}%
+  \def\l{l}%
+  \def\oe{oe}%
+  \def\o{o}%
+  \def\ss{ss}%
+  \def\exclamdown{!}%
+  \def\questiondown{?}%
+  %
+  % Don't no-op \tt, since it isn't a user-level command
+  % and is used in the definitions of the active chars like <, >, |, etc.
+  % Likewise with the other plain tex font commands.
+  %\let\tt=\asis
+  %
+  % Texinfo font commands.
+  \let\b=\asis
+  \let\i=\asis
+  \let\r=\asis
+  \let\sc=\asis
+  \let\t=\asis
+  %
+  \let\TeX=\indexdummytex
+  \let\acronym=\asis
+  \let\cite=\asis
+  \let\code=\asis
+  \let\command=\asis
+  \let\dfn=\asis
+  \let\dots=\indexdummydots
+  \let\emph=\asis
+  \let\env=\asis
+  \let\file=\asis
+  \let\kbd=\asis
+  \let\key=\asis
+  \let\math=\asis
+  \let\option=\asis
+  \let\samp=\asis
+  \let\strong=\asis
+  \let\uref=\asis
+  \let\url=\asis
+  \let\var=\asis
+  \let\w=\asis
+}
+
+\let\indexbackslash=0  %overridden during \printindex.
+\let\SETmarginindex=\relax % put index entries in margin (undocumented)?
+
+% For \ifx comparisons.
+\def\emptymacro{\empty}
+
+% Most index entries go through here, but \dosubind is the general case.
+%
+\def\doind#1#2{\dosubind{#1}{#2}\empty}
+
+% Workhorse for all \fooindexes.
+% #1 is name of index, #2 is stuff to put there, #3 is subentry --
+% \empty if called from \doind, as we usually are.  The main exception
+% is with defuns, which call us directly.
+%
+\def\dosubind#1#2#3{%
+  % Put the index entry in the margin if desired.
+  \ifx\SETmarginindex\relax\else
+    \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}%
+  \fi
+  {%
+    \count255=\lastpenalty
+    {%
+      \indexdummies % Must do this here, since \bf, etc expand at this stage
+      \escapechar=`\\
+      {%
+        \let\folio = 0% We will expand all macros now EXCEPT \folio.
+        \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+        % so it will be output as is; and it will print as backslash.
+        %
+        % The main index entry text.
+        \toks0 = {#2}%
+        %
+        % If third arg is present, precede it with space in sort key.
+        \def\thirdarg{#3}%
+        \ifx\thirdarg\emptymacro \else
+           % If the third (subentry) arg is present, add it to the index
+           % line to write.
+          \toks0 = \expandafter{\the\toks0 \space #3}%
+        \fi
+        %
+        % Process the index entry with all font commands turned off, to
+        % get the string to sort by.
+        {\indexnofonts
+         \edef\temp{\the\toks0}% need full expansion
+         \xdef\indexsorttmp{\temp}%
+        }%
+        %
+        % Set up the complete index entry, with both the sort key and
+        % the original text, including any font commands.  We write
+        % three arguments to \entry to the .?? file (four in the
+        % subentry case), texindex reduces to two when writing the .??s
+        % sorted result.
+        \edef\temp{%
+          \write\csname#1indfile\endcsname{%
+            \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}%
+        }%
+        %
+        % If a skip is the last thing on the list now, preserve it
+        % by backing up by \lastskip, doing the \write, then inserting
+        % the skip again.  Otherwise, the whatsit generated by the
+        % \write will make \lastskip zero.  The result is that sequences
+        % like this:
+        % @end defun
+        % @tindex whatever
+        % @defun ...
+        % will have extra space inserted, because the \medbreak in the
+        % start of the @defun won't see the skip inserted by the @end of
+        % the previous defun.
+        %
+        % But don't do any of this if we're not in vertical mode.  We
+        % don't want to do a \vskip and prematurely end a paragraph.
+        %
+        % Avoid page breaks due to these extra skips, too.
+        %
+        \iflinks
+          \ifvmode
+            \skip0 = \lastskip
+            \ifdim\lastskip = 0pt \else \nobreak\vskip-\skip0 \fi
+          \fi
+          %
+          \temp % do the write
+          %
+          \ifvmode \ifdim\skip0 = 0pt \else \nobreak\vskip\skip0 \fi \fi
+        \fi
+      }%
+    }%
+    \penalty\count255
+  }%
+}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% @printindex causes a particular index (the ??s file) to get printed.
+% It does not print any chapter heading (usually an @unnumbered).
+%
+\def\printindex{\parsearg\doprintindex}
+\def\doprintindex#1{\begingroup
+  \dobreak \chapheadingskip{10000}%
+  %
+  \smallfonts \rm
+  \tolerance = 9500
+  \everypar = {}% don't want the \kern\-parindent from indentation suppression.
+  \indexbreaks
+  %
+  % See if the index file exists and is nonempty.
+  % Change catcode of @ here so that if the index file contains
+  % \initial {@}
+  % as its first line, TeX doesn't complain about mismatched braces
+  % (because it thinks @} is a control sequence).
+  \catcode`\@ = 11
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    \putwordIndexNonexistent
+  \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      \putwordIndexIsEmpty
+    \else
+      % Index files are almost Texinfo source, but we use \ as the escape
+      % character.  It would be better to use @, but that's too big a change
+      % to make right now.
+      \def\indexbackslash{\rawbackslashxx}%
+      \catcode`\\ = 0
+      \escapechar = `\\
+      \begindoublecolumns
+      \input \jobname.#1s
+      \enddoublecolumns
+    \fi
+  \fi
+  \closein 1
+\endgroup}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+\def\initial#1{{%
+  % Some minor font changes for the special characters.
+  \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+  %
+  % Remove any glue we may have, we'll be inserting our own.
+  \removelastskip
+  %
+  % We like breaks before the index initials, so insert a bonus.
+  \penalty -300
+  %
+  % Typeset the initial.  Making this add up to a whole number of
+  % baselineskips increases the chance of the dots lining up from column
+  % to column.  It still won't often be perfect, because of the stretch
+  % we need before each entry, but it's better.
+  %
+  % No shrink because it confuses \balancecolumns.
+  \vskip 1.67\baselineskip plus .5\baselineskip
+  \leftline{\secbf #1}%
+  \vskip .33\baselineskip plus .1\baselineskip
+  %
+  % Do our best not to break after the initial.
+  \nobreak
+}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin.  It is used for index and table of contents
+% entries.  The paragraph is indented by \leftskip.
+%
+\def\entry#1#2{\begingroup
+  %
+  % Start a new paragraph if necessary, so our assignments below can't
+  % affect previous text.
+  \par
+  %
+  % Do not fill out the last line with white space.
+  \parfillskip = 0in
+  %
+  % No extra space above this paragraph.
+  \parskip = 0in
+  %
+  % Do not prefer a separate line ending with a hyphen to fewer lines.
+  \finalhyphendemerits = 0
+  %
+  % \hangindent is only relevant when the entry text and page number
+  % don't both fit on one line.  In that case, bob suggests starting the
+  % dots pretty far over on the line.  Unfortunately, a large
+  % indentation looks wrong when the entry text itself is broken across
+  % lines.  So we use a small indentation and put up with long leaders.
+  %
+  % \hangafter is reset to 1 (which is the value we want) at the start
+  % of each paragraph, so we need not do anything with that.
+  \hangindent = 2em
+  %
+  % When the entry text needs to be broken, just fill out the first line
+  % with blank space.
+  \rightskip = 0pt plus1fil
+  %
+  % A bit of stretch before each entry for the benefit of balancing columns.
+  \vskip 0pt plus1pt
+  %
+  % Start a ``paragraph'' for the index entry so the line breaking
+  % parameters we've set above will have an effect.
+  \noindent
+  %
+  % Insert the text of the index entry.  TeX will do line-breaking on it.
+  #1%
+  % The following is kludged to not output a line of dots in the index if
+  % there are no page numbers.  The next person who breaks this will be
+  % cursed by a Unix daemon.
+  \def\tempa{{\rm }}%
+  \def\tempb{#2}%
+  \edef\tempc{\tempa}%
+  \edef\tempd{\tempb}%
+  \ifx\tempc\tempd\ \else%
+    %
+    % If we must, put the page number on a line of its own, and fill out
+    % this line with blank space.  (The \hfil is overwhelmed with the
+    % fill leaders glue in \indexdotfill if the page number does fit.)
+    \hfil\penalty50
+    \null\nobreak\indexdotfill % Have leaders before the page number.
+    %
+    % The `\ ' here is removed by the implicit \unskip that TeX does as
+    % part of (the primitive) \par.  Without it, a spurious underfull
+    % \hbox ensues.
+    \ifpdf
+      \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+    \else
+      \ #2% The page number ends the paragraph.
+    \fi
+  \fi%
+  \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+\def\secondary#1#2{{%
+  \parfillskip=0in
+  \parskip=0in
+  \hangindent=1in
+  \hangafter=1
+  \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill
+  \ifpdf
+    \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph.
+  \else
+    #2
+  \fi
+  \par
+}}
+
+% Define two-column mode, which we use to typeset indexes.
+% Adapted from the TeXbook, page 416, which is to say,
+% the manmac.tex format used to print the TeXbook itself.
+\catcode`\@=11
+
+\newbox\partialpage
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns
+  % Grab any single-column material above us.
+  \output = {%
+    %
+    % Here is a possibility not foreseen in manmac: if we accumulate a
+    % whole lot of material, we might end up calling this \output
+    % routine twice in a row (see the doublecol-lose test, which is
+    % essentially a couple of indexes with @setchapternewpage off).  In
+    % that case we just ship out what is in \partialpage with the normal
+    % output routine.  Generally, \partialpage will be empty when this
+    % runs and this will be a no-op.  See the indexspread.tex test case.
+    \ifvoid\partialpage \else
+      \onepageout{\pagecontents\partialpage}%
+    \fi
+    %
+    \global\setbox\partialpage = \vbox{%
+      % Unvbox the main output page.
+      \unvbox\PAGE
+      \kern-\topskip \kern\baselineskip
+    }%
+  }%
+  \eject % run that output routine to set \partialpage
+  %
+  % Use the double-column output routine for subsequent pages.
+  \output = {\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it in one place.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +-<1pt)
+  % as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+}
+
+% The double-column output routine for all double-column pages except
+% the last.
+%
+\def\doublecolumnout{%
+  \splittopskip=\topskip \splitmaxdepth=\maxdepth
+  % Get the available space for the double columns -- the normal
+  % (undoubled) page height minus any material left over from the
+  % previous page.
+  \dimen@ = \vsize
+  \divide\dimen@ by 2
+  \advance\dimen@ by -\ht\partialpage
+  %
+  % box0 will be the left-hand column, box2 the right.
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar
+  \unvbox255
+  \penalty\outputpenalty
+}
+%
+% Re-output the contents of the output page -- any previous material,
+% followed by the two boxes we just split, in box0 and box2.
+\def\pagesofar{%
+  \unvbox\partialpage
+  %
+  \hsize = \doublecolumnhsize
+  \wd0=\hsize \wd2=\hsize
+  \hbox to\pagewidth{\box0\hfil\box2}%
+}
+%
+% All done with double columns.
+\def\enddoublecolumns{%
+  \output = {%
+    % Split the last of the double-column material.  Leave it on the
+    % current page, no automatic page break.
+    \balancecolumns
+    %
+    % If we end up splitting too much material for the current page,
+    % though, there will be another page break right after this \output
+    % invocation ends.  Having called \balancecolumns once, we do not
+    % want to call it again.  Therefore, reset \output to its normal
+    % definition right away.  (We hope \balancecolumns will never be
+    % called on to balance too much material, but if it is, this makes
+    % the output somewhat more palatable.)
+    \global\output = {\onepageout{\pagecontents\PAGE}}%
+  }%
+  \eject
+  \endgroup % started in \begindoublecolumns
+  %
+  % \pagegoal was set to the doubled \vsize above, since we restarted
+  % the current page.  We're now back to normal single-column
+  % typesetting, so reset \pagegoal to the normal \vsize (after the
+  % \endgroup where \vsize got restored).
+  \pagegoal = \vsize
+}
+%
+% Called at the end of the double column material.
+\def\balancecolumns{%
+  \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120.
+  \dimen@ = \ht0
+  \advance\dimen@ by \topskip
+  \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by 2 % target to split to
+  %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}%
+  \splittopskip = \topskip
+  % Loop until we get a decent breakpoint.
+  {%
+    \vbadness = 10000
+    \loop
+      \global\setbox3 = \copy0
+      \global\setbox1 = \vsplit3 to \dimen@
+    \ifdim\ht3>\dimen@
+      \global\advance\dimen@ by 1pt
+    \repeat
+  }%
+  %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}%
+  \setbox0=\vbox to\dimen@{\unvbox1}%
+  \setbox2=\vbox to\dimen@{\unvbox3}%
+  %
+  \pagesofar
+}
+\catcode`\@ = \other
+
+
+\message{sectioning,}
+% Chapters, sections, etc.
+
+\newcount\chapno
+\newcount\secno        \secno=0
+\newcount\subsecno     \subsecno=0
+\newcount\subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount\appendixno  \appendixno = `\@
+% \def\appendixletter{\char\the\appendixno}
+% We do the following for the sake of pdftex, which needs the actual
+% letter in the expansion, not just typeset.
+\def\appendixletter{%
+  \ifnum\appendixno=`A A%
+  \else\ifnum\appendixno=`B B%
+  \else\ifnum\appendixno=`C C%
+  \else\ifnum\appendixno=`D D%
+  \else\ifnum\appendixno=`E E%
+  \else\ifnum\appendixno=`F F%
+  \else\ifnum\appendixno=`G G%
+  \else\ifnum\appendixno=`H H%
+  \else\ifnum\appendixno=`I I%
+  \else\ifnum\appendixno=`J J%
+  \else\ifnum\appendixno=`K K%
+  \else\ifnum\appendixno=`L L%
+  \else\ifnum\appendixno=`M M%
+  \else\ifnum\appendixno=`N N%
+  \else\ifnum\appendixno=`O O%
+  \else\ifnum\appendixno=`P P%
+  \else\ifnum\appendixno=`Q Q%
+  \else\ifnum\appendixno=`R R%
+  \else\ifnum\appendixno=`S S%
+  \else\ifnum\appendixno=`T T%
+  \else\ifnum\appendixno=`U U%
+  \else\ifnum\appendixno=`V V%
+  \else\ifnum\appendixno=`W W%
+  \else\ifnum\appendixno=`X X%
+  \else\ifnum\appendixno=`Y Y%
+  \else\ifnum\appendixno=`Z Z%
+  % The \the is necessary, despite appearances, because \appendixletter is
+  % expanded while writing the .toc file.  \char\appendixno is not
+  % expandable, thus it is written literally, thus all appendixes come out
+  % with the same letter (or @) in the toc without it.
+  \else\char\the\appendixno
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise.
+\def\thischapter{}
+\def\thissection{}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \chapterzzz{#2}
+\or
+  \seczzz{#2}
+\or
+  \numberedsubseczzz{#2}
+\or
+  \numberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \chapterzzz{#2}
+  \else
+    \numberedsubsubseczzz{#2}
+  \fi
+\fi
+\suppressfirstparagraphindent
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \appendixzzz{#2}
+\or
+  \appendixsectionzzz{#2}
+\or
+  \appendixsubseczzz{#2}
+\or
+  \appendixsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \appendixzzz{#2}
+  \else
+    \appendixsubsubseczzz{#2}
+  \fi
+\fi
+\suppressfirstparagraphindent
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \unnumberedzzz{#2}
+\or
+  \unnumberedseczzz{#2}
+\or
+  \unnumberedsubseczzz{#2}
+\or
+  \unnumberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \unnumberedzzz{#2}
+  \else
+    \unnumberedsubsubseczzz{#2}
+  \fi
+\fi
+\suppressfirstparagraphindent
+}
+
+% @chapter, @appendix, @unnumbered.
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  \global\advance \chapno by 1 \message{\putwordChapter\space \the\chapno}%
+  \chapmacro {#1}{\the\chapno}%
+  \gdef\thissection{#1}%
+  \gdef\thischaptername{#1}%
+  % We don't substitute the actual chapter name into \thischapter
+  % because we don't want its macros evaluated now.
+  \xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+  \writetocentry{chap}{#1}{{\the\chapno}}
+  \donoderef
+  \global\let\section = \numberedsec
+  \global\let\subsection = \numberedsubsec
+  \global\let\subsubsection = \numberedsubsubsec
+}
+
+% we use \chapno to avoid indenting back
+\def\appendixbox#1{%
+  \setbox0 = \hbox{\putwordAppendix{} \the\chapno}%
+  \hbox to \wd0{#1\hss}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  \global\advance \appendixno by 1
+  \message{\putwordAppendix\space \appendixletter}%
+  \chapmacro {#1}{\appendixbox{\putwordAppendix{} \appendixletter}}%
+  \gdef\thissection{#1}%
+  \gdef\thischaptername{#1}%
+  \xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+  \writetocentry{appendix}{#1}{{\appendixletter}}
+  \appendixnoderef
+  \global\let\section = \appendixsec
+  \global\let\subsection = \appendixsubsec
+  \global\let\subsubsection = \appendixsubsubsec
+}
+
+% @centerchap is like @unnumbered, but the heading is centered.
+\outer\def\centerchap{\parsearg\centerchapyyy}
+\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}}
+
+% @top is like @unnumbered.
+\outer\def\top{\parsearg\unnumberedyyy}
+
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{%
+  \secno=0 \subsecno=0 \subsubsecno=0
+  %
+  % This used to be simply \message{#1}, but TeX fully expands the
+  % argument to \message.  Therefore, if #1 contained @-commands, TeX
+  % expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+  % expanded @cite (which turns out to cause errors because \cite is meant
+  % to be executed, not expanded).
+  %
+  % Anyway, we don't want the fully-expanded definition of @cite to appear
+  % as a result of the \message, we just want `@cite' itself.  We use
+  % \the<toks register> to achieve this: TeX expands \the<toks> only once,
+  % simply yielding the contents of <toks register>.  (We also do this for
+  % the toc entries.)
+  \toks0 = {#1}\message{(\the\toks0)}%
+  %
+  \unnumbchapmacro {#1}%
+  \gdef\thischapter{#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbchap}{#1}{{\the\chapno}}
+  \unnumbnoderef
+  \global\let\section = \unnumberedsec
+  \global\let\subsection = \unnumberedsubsec
+  \global\let\subsubsection = \unnumberedsubsubsec
+}
+
+% Sections.
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{%
+  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+  \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+  \writetocentry{sec}{#1}{{\the\chapno}{\the\secno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{%
+  \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+  \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+  \writetocentry{sec}{#1}{{\appendixletter}{\the\secno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{%
+  \plainsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsec}{#1}{{\the\chapno}{\the\secno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% Subsections.
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{%
+  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+  \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+  \writetocentry{subsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{%
+  \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+  \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+  \writetocentry{subsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{%
+  \plainsubsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% Subsubsections.
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{%
+  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+  \subsubsecheading {#1}
+    {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+  \writetocentry{subsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \donoderef
+  \nobreak
+}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{%
+  \gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+  \subsubsecheading {#1}
+    {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+  \writetocentry{subsubsec}{#1}{{\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \appendixnoderef
+  \nobreak
+}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{%
+  \plainsubsubsecheading {#1}\gdef\thissection{#1}%
+  \writetocentry{unnumbsubsubsec}{#1}{{\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}}
+  \unnumbnoderef
+  \nobreak
+}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and such:
+%       1) We use \vbox rather than the earlier \line to permit
+%          overlong headings to fold.
+%       2) \hyphenpenalty is set to 10000 because hyphenation in a
+%          heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+  {\advance\chapheadingskip by 10pt \chapbreak }%
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+  {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                    \parindent=0pt\raggedright
+                    \rm #1\hfill}}\bigskip \par\penalty 200}
+
+% @heading, @subheading, @subsubheading.
+\def\heading{\parsearg\plainsecheading}
+\def\subheading{\parsearg\plainsubsecheading}
+\def\subsubheading{\parsearg\plainsubsubsecheading}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip\chapheadingskip
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{%
+\global\let\contentsalignmacro = \chappager
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\contentsalignmacro = \chapoddpage
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain
+\global\let\centerchapmacro=\centerchfplain}
+
+% Plain chapter opening.
+% #1 is the text, #2 the chapter number or empty if unnumbered.
+\def\chfplain#1#2{%
+  \pchapsepmacro
+  {%
+    \chapfonts \rm
+    \def\chapnum{#2}%
+    \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}%
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 \centerparametersmaybe
+          \unhbox0 #1\par}%
+  }%
+  \nobreak\bigskip % no page break after a chapter title
+  \nobreak
+}
+
+% Plain opening for unnumbered.
+\def\unnchfplain#1{\chfplain{#1}{}}
+
+% @centerchap -- centered and unnumbered.
+\let\centerparametersmaybe = \relax
+\def\centerchfplain#1{{%
+  \def\centerparametersmaybe{%
+    \advance\rightskip by 3\rightskip
+    \leftskip = \rightskip
+    \parfillskip = 0pt
+  }%
+  \chfplain{#1}{}%
+}}
+
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\nobreak
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\centerchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt
+                       \hfill {\rm #1}\hfill}}\bigskip \par\nobreak
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen
+\global\let\centerchapmacro=\centerchfopen}
+
+
+% Section titles.
+\newskip\secheadingskip
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}}
+\def\plainsecheading#1{\sectionheading{sec}{}{#1}}
+
+% Subsection titles.
+\newskip \subsecheadingskip
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}}
+\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}}
+
+% Subsubsection titles.
+\let\subsubsecheadingskip = \subsecheadingskip
+\let\subsubsecheadingbreak = \subsecheadingbreak
+\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}}
+\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}}
+
+
+% Print any size section title.
+%
+% #1 is the section type (sec/subsec/subsubsec), #2 is the section
+% number (maybe empty), #3 the text.
+\def\sectionheading#1#2#3{%
+  {%
+    \expandafter\advance\csname #1headingskip\endcsname by \parskip
+    \csname #1headingbreak\endcsname
+  }%
+  {%
+    % Switch to the right set of fonts.
+    \csname #1fonts\endcsname \rm
+    %
+    % Only insert the separating space if we have a section number.
+    \def\secnum{#2}%
+    \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}%
+    %
+    \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright
+          \hangindent = \wd0 % zero if no section number
+          \unhbox0 #3}%
+  }%
+  % Add extra space after the heading -- either a line space or a
+  % paragraph space, whichever is more.  (Some people like to set
+  % \parskip to large values for some reason.)  Don't allow stretch, though.
+  \nobreak
+  \ifdim\parskip>\normalbaselineskip
+    \kern\parskip
+  \else
+    \kern\normalbaselineskip
+  \fi
+  \nobreak
+}
+
+
+\message{toc,}
+% Table of contents.
+\newwrite\tocfile
+
+% Write an entry to the toc file, opening it if necessary.
+% Called from @chapter, etc.  We supply {\folio} at the end of the
+% argument, which will end up as the last argument to the \...entry macro.
+%
+% Usage: \writetocentry{chap}{The Name of The Game}{{\the\chapno}}
+% We open the .toc file for writing here instead of at @setfilename (or
+% any other fixed time) so that @contents can be anywhere in the document.
+%
+\newif\iftocfileopened
+\def\writetocentry#1#2#3{%
+  \iftocfileopened\else
+    \immediate\openout\tocfile = \jobname.toc
+    \global\tocfileopenedtrue
+  \fi
+  %
+  \iflinks
+    \toks0 = {#2}%
+    \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}#3{\folio}}}%
+    \temp
+  \fi
+  %
+  % Tell \shipout to create a page destination if we're doing pdf, which
+  % will be the target of the links in the table of contents.  We can't
+  % just do it on every page because the title pages are numbered 1 and
+  % 2 (the page numbers aren't printed), and so are the first two pages
+  % of the document.  Thus, we'd have two destinations named `1', and
+  % two named `2'.
+  \ifpdf \pdfmakepagedesttrue \fi
+}
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\newcount\savepageno
+\newcount\lastnegativepageno \lastnegativepageno = -1
+
+% Finish up the main text and prepare to read what we've written
+% to \tocfile.
+%
+\def\startcontents#1{%
+   % If @setchapternewpage on, and @headings double, the contents should
+   % start on an odd page, unlike chapters.  Thus, we maintain
+   % \contentsalignmacro in parallel with \pagealignmacro.
+   % From: Torbjorn Granlund <tege@matematik.su.se>
+   \contentsalignmacro
+   \immediate\closeout\tocfile
+   %
+   % Don't need to put `Contents' or `Short Contents' in the headline.
+   % It is abundantly clear what they are.
+   \unnumbchapmacro{#1}\def\thischapter{}%
+   \savepageno = \pageno
+   \begingroup                  % Set up to handle contents files properly.
+      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
+      % We can't do this, because then an actual ^ in a section
+      % title fails, e.g., @chapter ^ -- exponentiation.  --karl, 9jul97.
+      %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+      \raggedbottom             % Worry more about breakpoints than the bottom.
+      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+      %
+      % Roman numerals for page numbers.
+      \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi
+}
+
+
+% Normal (long) toc.
+\def\contents{%
+   \startcontents{\putwordTOC}%
+     \openin 1 \jobname.toc
+     \ifeof 1 \else
+       \closein 1
+       \input \jobname.toc
+     \fi
+     \vfill \eject
+     \contentsalignmacro % in case @setchapternewpage odd is in effect
+     \pdfmakeoutlines
+   \endgroup
+   \lastnegativepageno = \pageno
+   \global\pageno = \savepageno
+}
+
+% And just the chapters.
+\def\summarycontents{%
+   \startcontents{\putwordShortTOC}%
+      %
+      \let\chapentry = \shortchapentry
+      \let\appendixentry = \shortappendixentry
+      \let\unnumbchapentry = \shortunnumberedentry
+      % We want a true roman here for the page numbers.
+      \secfonts
+      \let\rm=\shortcontrm \let\bf=\shortcontbf
+      \let\sl=\shortcontsl \let\tt=\shortconttt
+      \rm
+      \hyphenpenalty = 10000
+      \advance\baselineskip by 1pt % Open it up a little.
+      \def\secentry ##1##2##3##4{}
+      \def\subsecentry ##1##2##3##4##5{}
+      \def\subsubsecentry ##1##2##3##4##5##6{}
+      \let\unnumbsecentry = \secentry
+      \let\unnumbsubsecentry = \subsecentry
+      \let\unnumbsubsubsecentry = \subsubsecentry
+      \openin 1 \jobname.toc
+      \ifeof 1 \else
+        \closein 1
+        \input \jobname.toc
+      \fi
+     \vfill \eject
+     \contentsalignmacro % in case @setchapternewpage odd is in effect
+   \endgroup
+   \lastnegativepageno = \pageno
+   \global\pageno = \savepageno
+}
+\let\shortcontents = \summarycontents
+
+\ifpdf
+  \pdfcatalog{/PageMode /UseOutlines}%
+\fi
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapters, in the main contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+%
+% Chapters, in the short toc.
+% See comments in \dochapentry re vbox and related settings.
+\def\shortchapentry#1#2#3{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#3\egroup}%
+}
+
+% Appendices, in the main contents.
+\def\appendixentry#1#2#3{%
+  \dochapentry{\appendixbox{\putwordAppendix{} #2}\labelspace#1}{#3}}
+%
+% Appendices, in the short toc.
+\let\shortappendixentry = \shortchapentry
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g., `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+%
+\newdimen\shortappendixwidth
+%
+\def\shortchaplabel#1{%
+  % This space should be enough, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % But use \hss just in case.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in by \shortchapentry above.)
+  \dimen0 = 1em
+  \hbox to \dimen0{#1\hss}%
+}
+
+% Unnumbered chapters.
+\def\unnumbchapentry#1#2#3{\dochapentry{#1}{#3}}
+\def\shortunnumberedentry#1#2#3{\tocentry{#1}{\doshortpageno\bgroup#3\egroup}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2#3#4{\dosecentry{#1}{#4}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2#3#4#5{\dosubsecentry{#1}{#5}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2#3#4#5#6{\dosubsubsecentry{#1}{#6}}
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we want it to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip plus.1\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno\bgroup#2\egroup}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here.  (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+\def\tocentry#1#2{\begingroup
+  \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks
+  % Do not use \turnoffactive in these arguments.  Since the toc is
+  % typeset in cmr, characters such as _ would come out wrong; we
+  % have to do the usual translation tricks.
+  \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+% @foo ... @end foo.
+
+% @point{}, @result{}, @expansion{}, @print{}, @equiv{}.
+%
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+%
+\def\point{$\star$}
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% The @error{} command.
+% Adapted from the TeXbook's \boxit.
+%
+\newbox\errorbox
+%
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+%
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+%
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+  \catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+  \catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+  \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie
+  \catcode `\%=14
+  \catcode `\+=\other
+  \catcode `\"=\other
+  \catcode `\==\other
+  \catcode `\|=\other
+  \catcode `\<=\other
+  \catcode `\>=\other
+  \escapechar=`\\
+  %
+  \let\b=\ptexb
+  \let\bullet=\ptexbullet
+  \let\c=\ptexc
+  \let\,=\ptexcomma
+  \let\.=\ptexdot
+  \let\dots=\ptexdots
+  \let\equiv=\ptexequiv
+  \let\!=\ptexexclam
+  \let\i=\ptexi
+  \let\indent=\ptexindent
+  \let\{=\ptexlbrace
+  \let\+=\tabalign
+  \let\}=\ptexrbrace
+  \let\/=\ptexslash
+  \let\*=\ptexstar
+  \let\t=\ptext
+  %
+  \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}%
+  \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}%
+  \def\@{@}%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @end lisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @end lisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output.  Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is.  This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip.
+%
+\def\aboveenvbreak{{%
+  % =10000 instead of <10000 because of a special case in \itemzzz, q.v.
+  \ifnum \lastpenalty=10000 \else
+    \advance\envskipamount by \parskip
+    \endgraf
+    \ifdim\lastskip<\envskipamount
+      \removelastskip
+      % it's not a good place to break if the last penalty was \nobreak
+      % or better ...
+      \ifnum\lastpenalty>10000 \else \penalty-50 \fi
+      \vskip\envskipamount
+    \fi
+  \fi
+}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+% @cartouche ... @end cartouche: draw rectangle w/rounded corners around
+% environment contents.
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+        \ctl\leaders\hrule height\circthick\hfil\ctr
+        \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+        \cbl\leaders\hrule height\circthick\hfil\cbr
+        \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\def\cartouche{%
+\par  % can't be in the midst of a paragraph.
+\begingroup
+        \lskip=\leftskip \rskip=\rightskip
+        \leftskip=0pt\rightskip=0pt %we want these *outside*.
+        \cartinner=\hsize \advance\cartinner by-\lskip
+                          \advance\cartinner by-\rskip
+        \cartouter=\hsize
+        \advance\cartouter by 18.4pt % allow for 3pt kerns on either
+%                                    side, and for 6pt waste from
+%                                    each corner char, and rule thickness
+        \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+        % Flag to tell @lisp, etc., not to narrow margin.
+        \let\nonarrowing=\comment
+        \vbox\bgroup
+                \baselineskip=0pt\parskip=0pt\lineskip=0pt
+                \carttop
+                \hbox\bgroup
+                        \hskip\lskip
+                        \vrule\kern3pt
+                        \vbox\bgroup
+                                \hsize=\cartinner
+                                \kern3pt
+                                \begingroup
+                                        \baselineskip=\normbskip
+                                        \lineskip=\normlskip
+                                        \parskip=\normpskip
+                                        \vskip -\parskip
+\def\Ecartouche{%
+                                \endgroup
+                                \kern3pt
+                        \egroup
+                        \kern3pt\vrule
+                        \hskip\rskip
+                \egroup
+                \cartbot
+        \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \inENV % This group ends at the end of the body
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  % @cartouche defines \nonarrowing to inhibit narrowing
+  % at next level down.
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+    \let\exdent=\nofillexdent
+    \let\nonarrowing=\relax
+  \fi
+}
+
+% Define the \E... control sequence only if we are inside the particular
+% environment, so the error checking in \end will work.
+%
+% To end an @example-like environment, we first end the paragraph (via
+% \afterenvbreak's vertical glue), and then the group.  That way we keep
+% the zero \parskip that the environments set -- \parskip glue will be
+% inserted at the beginning of the next paragraph in the document, after
+% the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}
+
+% @lisp: indented, narrowed, typewriter font.
+\def\lisp{\begingroup
+  \nonfillstart
+  \let\Elisp = \nonfillfinish
+  \tt
+  \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special.
+  \gobble       % eat return
+}
+
+% @example: Same as @lisp.
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp: use smaller fonts.
+% Originally contributed by Pavel@xerox.
+\def\smalllisp{\begingroup
+  \def\Esmalllisp{\nonfillfinish\endgroup}%
+  \def\Esmallexample{\nonfillfinish\endgroup}%
+  \smallexamplefonts
+  \lisp
+}
+\let\smallexample = \smalllisp
+
+
+% @display: same as @lisp except keep current font.
+%
+\def\display{\begingroup
+  \nonfillstart
+  \let\Edisplay = \nonfillfinish
+  \gobble
+}
+%
+% @smalldisplay: @display plus smaller fonts.
+%
+\def\smalldisplay{\begingroup
+  \def\Esmalldisplay{\nonfillfinish\endgroup}%
+  \smallexamplefonts \rm
+  \display
+}
+
+% @format: same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eformat = \nonfillfinish
+  \gobble
+}
+%
+% @smallformat: @format plus smaller fonts.
+%
+\def\smallformat{\begingroup
+  \def\Esmallformat{\nonfillfinish\endgroup}%
+  \smallexamplefonts \rm
+  \format
+}
+
+% @flushleft (same as @format).
+%
+\def\flushleft{\begingroup \def\Eflushleft{\nonfillfinish\endgroup}\format}
+
+% @flushright.
+%
+\def\flushright{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eflushright = \nonfillfinish
+  \advance\leftskip by 0pt plus 1fill
+  \gobble
+}
+
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+  \begingroup\inENV %This group ends at the end of the @quotation body
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \parindent=0pt
+  % We have retained a nonzero parskip for the environment, since we're
+  % doing normal filling. So to avoid extra space below the environment...
+  \def\Equotation{\parskip = 0pt \nonfillfinish}%
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+    \let\nonarrowing = \relax
+  \fi
+}
+
+
+% LaTeX-like @verbatim...@end verbatim and @verb{<char>...<char>}
+% If we want to allow any <char> as delimiter,
+% we need the curly braces so that makeinfo sees the @verb command, eg:
+% `@verbx...x' would look like the '@verbx' command.  --janneke@gnu.org
+%
+% [Knuth]: Donald Ervin Knuth, 1996.  The TeXbook.
+%
+% [Knuth] p.344; only we need to do the other characters Texinfo sets
+% active too.  Otherwise, they get lost as the first character on a
+% verbatim line.
+\def\dospecials{%
+  \do\ \do\\\do\{\do\}\do\$\do\&%
+  \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~%
+  \do\<\do\>\do\|\do\@\do+\do\"%
+}
+%
+% [Knuth] p. 380
+\def\uncatcodespecials{%
+  \def\do##1{\catcode`##1=12}\dospecials}
+%
+% [Knuth] pp. 380,381,391
+% Disable Spanish ligatures ?` and !` of \tt font
+\begingroup
+  \catcode`\`=\active\gdef`{\relax\lq}
+\endgroup
+%
+% Setup for the @verb command.
+%
+% Eight spaces for a tab
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }}
+\endgroup
+%
+\def\setupverb{%
+  \tt  % easiest (and conventionally used) font for verbatim
+  \def\par{\leavevmode\endgraf}%
+  \catcode`\`=\active
+  \tabeightspaces
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+}
+
+% Setup for the @verbatim environment
+%
+% Real tab expansion
+\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount
+%
+\def\starttabbox{\setbox0=\hbox\bgroup}
+\begingroup
+  \catcode`\^^I=\active
+  \gdef\tabexpand{%
+    \catcode`\^^I=\active
+    \def^^I{\leavevmode\egroup
+      \dimen0=\wd0 % the width so far, or since the previous tab
+      \divide\dimen0 by\tabw
+      \multiply\dimen0 by\tabw % compute previous multiple of \tabw
+      \advance\dimen0 by\tabw  % advance to next multiple of \tabw
+      \wd0=\dimen0 \box0 \starttabbox
+    }%
+  }
+\endgroup
+\def\setupverbatim{%
+  % Easiest (and conventionally used) font for verbatim
+  \tt
+  \def\par{\leavevmode\egroup\box0\endgraf}%
+  \catcode`\`=\active
+  \tabexpand
+  % Respect line breaks,
+  % print special symbols as themselves, and
+  % make each space count
+  % must do in this order:
+  \obeylines \uncatcodespecials \sepspaces
+  \everypar{\starttabbox}%
+}
+
+% Do the @verb magic: verbatim text is quoted by unique
+% delimiter characters.  Before first delimiter expect a
+% right brace, after last delimiter expect closing brace:
+%
+%    \def\doverb'{'<char>#1<char>'}'{#1}
+%
+% [Knuth] p. 382; only eat outer {}
+\begingroup
+  \catcode`[=1\catcode`]=2\catcode`\{=12\catcode`\}=12
+  \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next]
+\endgroup
+%
+\def\verb{\begingroup\setupverb\doverb}
+%
+%
+% Do the @verbatim magic: define the macro \doverbatim so that
+% the (first) argument ends when '@end verbatim' is reached, ie:
+%
+%     \def\doverbatim#1@end verbatim{#1}
+%
+% For Texinfo it's a lot easier than for LaTeX,
+% because texinfo's \verbatim doesn't stop at '\end{verbatim}':
+% we need not redefine '\', '{' and '}'.
+%
+% Inspired by LaTeX's verbatim command set [latex.ltx]
+%% Include LaTeX hack for completeness -- never know
+%% \begingroup
+%% \catcode`|=0 \catcode`[=1
+%% \catcode`]=2\catcode`\{=12\catcode`\}=12\catcode`\ =\active
+%% \catcode`\\=12|gdef|doverbatim#1@end verbatim[
+%% #1|endgroup|def|Everbatim[]|end[verbatim]]
+%% |endgroup
+%
+\begingroup
+  \catcode`\ =\active
+  \obeylines %
+  % ignore everything up to the first ^^M, that's the newline at the end
+  % of the @verbatim input line itself.  Otherwise we get an extra blank
+  % line in the output.
+  \gdef\doverbatim#1^^M#2@end verbatim{#2\end{verbatim}}%
+\endgroup
+%
+\def\verbatim{%
+  \def\Everbatim{\nonfillfinish\endgroup}%
+  \begingroup
+    \nonfillstart
+    \advance\leftskip by -\defbodyindent
+    \begingroup\setupverbatim\doverbatim
+}
+
+% @verbatiminclude FILE - insert text of file in verbatim environment.
+%
+% Allow normal characters that we make active in the argument (a file name).
+\def\verbatiminclude{%
+  \begingroup
+    \catcode`\\=\other
+    \catcode`~=\other
+    \catcode`^=\other
+    \catcode`_=\other
+    \catcode`|=\other
+    \catcode`<=\other
+    \catcode`>=\other
+    \catcode`+=\other
+    \parsearg\doverbatiminclude
+}
+\def\setupverbatiminclude{%
+  \begingroup
+    \nonfillstart
+    \advance\leftskip by -\defbodyindent
+    \begingroup\setupverbatim
+}
+%
+\def\doverbatiminclude#1{%
+     % Restore active chars for included file.
+  \endgroup
+  \begingroup
+    \let\value=\expandablevalue
+    \def\thisfile{#1}%
+    \expandafter\expandafter\setupverbatiminclude\input\thisfile
+  \endgroup
+  \nonfillfinish
+  \endgroup
+}
+
+% @copying ... @end copying.
+% Save the text away for @insertcopying later.  Many commands won't be
+% allowed in this context, but that's ok.
+%
+% We save the uninterpreted tokens, rather than creating a box.
+% Saving the text in a box would be much easier, but then all the
+% typesetting commands (@smallbook, font changes, etc.) have to be done
+% beforehand -- and a) we want @copying to be done first in the source
+% file; b) letting users define the frontmatter in as flexible order as
+% possible is very desirable.
+%
+\def\copying{\begingroup
+  % Define a command to swallow text until we reach `@end copying'.
+  % \ is the escape char in this texinfo.tex file, so it is the
+  % delimiter for the command; @ will be the escape char when we read
+  % it, but that doesn't matter.
+  \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}%
+  %
+  % We must preserve ^^M's in the input file; see \insertcopying below.
+  \catcode`\^^M = \active
+  \docopying
+}
+
+% What we do to finish off the copying text.
+%
+\def\enddocopying{\endgroup\ignorespaces}
+
+% @insertcopying.  Here we must play games with ^^M's.  On the one hand,
+% we need them to delimit commands such as `@end quotation', so they
+% must be active.  On the other hand, we certainly don't want every
+% end-of-line to be a \par, as would happen with the normal active
+% definition of ^^M.  On the third hand, two ^^M's in a row should still
+% generate a \par.
+%
+% Our approach is to make ^^M insert a space and a penalty1 normally;
+% then it can also check if \lastpenalty=1.  If it does, then manually
+% do \par.
+%
+% This messes up the normal definitions of @c[omment], so we redefine
+% it.  Similarly for @ignore.  (These commands are used in the gcc
+% manual for man page generation.)
+%
+% Seems pretty fragile, most line-oriented commands will presumably
+% fail, but for the limited use of getting the copying text (which
+% should be quite simple) inserted, we can hope it's ok.
+%
+{\catcode`\^^M=\active %
+\gdef\insertcopying{\begingroup %
+  \parindent = 0pt  % looks wrong on title page
+  \def^^M{%
+    \ifnum \lastpenalty=1 %
+      \par %
+    \else %
+      \space \penalty 1 %
+    \fi %
+  }%
+  %
+  % Fix @c[omment] for catcode 13 ^^M's.
+  \def\c##1^^M{\ignorespaces}%
+  \let\comment = \c %
+  %
+  % Don't bother jumping through all the hoops that \doignore does, it
+  % would be very hard since the catcodes are already set.
+  \long\def\ignore##1\end ignore{\ignorespaces}%
+  %
+  \copyingtext %
+\endgroup}%
+}
+
+\message{defuns,}
+% @defun etc.
+
+% Allow user to change definition object font (\df) internally
+\def\setdeffont#1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+
+% We want ()&[] to print specially on the defun line.
+%
+\def\activeparens{%
+  \catcode`\(=\active \catcode`\)=\active
+  \catcode`\&=\active
+  \catcode`\[=\active \catcode`\]=\active
+}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+% This is used to turn on special parens
+% but make & act ordinary (given that it's active).
+\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested
+  \global\advance\parencount by 1
+}
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+  % also in that case restore the outer-level definition of (.
+  \ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+  \global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text.  This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}\global\advance\parencount by 1 }
+\def\clnr{{\sf\char`\)}\global\advance\parencount by -1 }
+\let\ampnr = \&
+\def\lbrb{{\bf\char`\[}}
+\def\rbrb{{\bf\char`\]}}
+
+% Active &'s sneak into the index arguments, so make sure it's defined.
+{
+  \catcode`& = \active
+  \global\let& = \ampnr
+}
+
+% \defname, which formats the name of the @def (not the args).
+% #1 is the function name.
+% #2 is the type of definition, such as "Function".
+%
+\def\defname#1#2{%
+  % How we'll output the type name.  Putting it in brackets helps
+  % distinguish it from the body text that may end up on the next line
+  % just below it.
+  \ifempty{#2}%
+    \def\defnametype{}%
+  \else
+    \def\defnametype{[\rm #2]}%
+  \fi
+  %
+  % Get the values of \leftskip and \rightskip as they were outside the @def...
+  \dimen2=\leftskip
+  \advance\dimen2 by -\defbodyindent
+  %
+  % Figure out values for the paragraph shape.
+  \setbox0=\hbox{\hskip \deflastargmargin{\defnametype}}%
+  \dimen0=\hsize \advance \dimen0 by -\wd0  % compute size for first line
+  \dimen1=\hsize \advance \dimen1 by -\defargsindent  % size for continuations
+  \parshape 2 0in \dimen0 \defargsindent \dimen1
+  %
+  % Output arg 2 ("Function" or some such) but stuck inside a box of
+  % width 0 so it does not interfere with linebreaking.
+  \noindent
+  %
+  {% Adjust \hsize to exclude the ambient margins,
+   % so that \rightline will obey them.
+   \advance \hsize by -\dimen2
+   \dimen3 = 0pt  % was -1.25pc
+   \rlap{\rightline{\defnametype\kern\dimen3}}%
+  }%
+  %
+  % Allow all lines to be underfull without complaint:
+  \tolerance=10000 \hbadness=10000
+  \advance\leftskip by -\defbodyindent
+  \exdentamount=\defbodyindent
+  {\df #1}\enskip        % output function name
+  % \defunargs will be called next to output the arguments, if any.
+}
+
+% Common pieces to start any @def...
+% #1 is the \E... control sequence to end the definition (which we define).
+% #2 is the \...x control sequence (which our caller defines).
+% #3 is the control sequence to process the header, such as \defunheader.
+%
+\def\parsebodycommon#1#2#3{%
+  \begingroup\inENV
+  % If there are two @def commands in a row, we'll have a \nobreak,
+  % which is there to keep the function description together with its
+  % header.  But if there's nothing but headers, we want to allow a
+  % break after all.  Check for penalty 10002 (inserted by
+  % \defargscommonending) instead of 10000, since the sectioning
+  % commands insert a \penalty10000, and we don't want to allow a break
+  % between a section heading and a defun.
+  \ifnum\lastpenalty=10002 \penalty0 \fi
+  \medbreak
+  %
+  % Define the \E... end token that this defining construct specifies
+  % so that it will exit this group.
+  \def#1{\endgraf\endgroup\medbreak}%
+  %
+  \parindent=0in
+  \advance\leftskip by \defbodyindent
+  \exdentamount=\defbodyindent
+}
+
+% Common part of the \...x definitions.
+%
+\def\defxbodycommon{%
+  % As with \parsebodycommon above, allow line break if we have multiple
+  % x headers in a row.  It's not a great place, though.
+  \ifnum\lastpenalty=10000 \penalty1000 \fi
+  %
+  \begingroup\obeylines
+}
+
+% Process body of @defun, @deffn, @defmac, etc.
+%
+\def\defparsebody#1#2#3{%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2{\defxbodycommon \activeparens \spacesplit#3}%
+  \catcode\equalChar=\active
+  \begingroup\obeylines\activeparens
+  \spacesplit#3%
+}
+
+% #1, #2, #3 are the common arguments (see \parsebodycommon above).
+% #4, delimited by the space, is the class name.
+%
+\def\defmethparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \activeparens \spacesplit{#3{##1}}}%
+  \begingroup\obeylines\activeparens
+  % The \empty here prevents misinterpretation of a construct such as
+  %   @deffn {whatever} {Enharmonic comma}
+  % See comments at \deftpparsebody, although in our case we don't have
+  % to remove the \empty afterwards, since it is empty.
+  \spacesplit{#3{#4}}\empty
+}
+
+% Used for @deftypemethod and @deftypeivar.
+% #1, #2, #3 are the common arguments (see \defparsebody).
+% #4, delimited by a space, is the class name.
+% #5 is the method's return type.
+%
+\def\deftypemethparsebody#1#2#3#4 #5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\defxbodycommon \activeparens \spacesplit{#3{##1}{##2}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#4}{#5}}%
+}
+
+% Used for @deftypeop.  The change from \deftypemethparsebody is an
+% extra argument at the beginning which is the `category', instead of it
+% being the hardwired string `Method' or `Instance Variable'.  We have
+% to account for this both in the \...x definition and in parsing the
+% input at hand.  Thus also need a control sequence (passed as #5) for
+% the \E... definition to assign the category name to.
+%
+\def\deftypeopparsebody#1#2#3#4#5 #6 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 ##3 {\def#4{##1}%
+    \defxbodycommon \activeparens \spacesplit{#3{##2}{##3}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#5}{#6}}%
+}
+
+% For @defop.
+\def\defopparsebody #1#2#3#4#5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\def#4{##1}%
+    \defxbodycommon \activeparens \spacesplit{#3{##2}}}%
+  \begingroup\obeylines\activeparens
+  \spacesplit{#3{#5}}%
+}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+%
+\def\defvarparsebody #1#2#3{%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2{\defxbodycommon \spacesplit#3}%
+  \catcode\equalChar=\active
+  \begingroup\obeylines
+  \spacesplit#3%
+}
+
+% @defopvar.
+\def\defopvarparsebody #1#2#3#4#5 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 ##2 {\def#4{##1}%
+    \defxbodycommon \spacesplit{#3{##2}}}%
+  \begingroup\obeylines
+  \spacesplit{#3{#5}}%
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+  \begingroup\obeylines
+  \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument.  Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name.  That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \def#2##1 {\defxbodycommon \spacesplit{#3{##1}}}%
+  \begingroup\obeylines
+  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any).  That's what this does.
+%
+\def\removeemptybraces\empty#1\relax{#1}
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+%
+\def\parsetpheaderline#1#2#3{%
+  #1{\removeemptybraces#2\relax}{#3}%
+}%
+
+% Split up #2 (the rest of the input line) at the first space token.
+% call #1 with two arguments:
+%  the first is all of #2 before the space token,
+%  the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+%
+{\obeylines %
+ \gdef\spacesplit#1#2^^M{\endgroup\spacesplitx{#1}#2 \relax\spacesplitx}%
+ \long\gdef\spacesplitx#1#2 #3#4\spacesplitx{%
+   \ifx\relax #3%
+     #1{#2}{}%
+   \else %
+     #1{#2}{#3#4}%
+   \fi}%
+}
+
+% Define @defun.
+
+% This is called to end the arguments processing for all the @def... commands.
+%
+\def\defargscommonending{%
+  \interlinepenalty = 10000
+  \advance\rightskip by 0pt plus 1fil
+  \endgraf
+  \nobreak\vskip -\parskip
+  \penalty 10002  % signal to \parsebodycommon.
+}
+
+% This expands the args and terminates the paragraph they comprise.
+%
+\def\defunargs#1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Set the font temporarily and use \font in case \setfont made \tensl a macro.
+{\tensl\hyphenchar\font=0}%
+#1%
+{\tensl\hyphenchar\font=45}%
+\ifnum\parencount=0 \else \errmessage{Unbalanced parentheses in @def}\fi%
+  \defargscommonending
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+% Use \boldbraxnoamp, not \functionparens, so that & is not special.
+\boldbraxnoamp
+\tclose{#1}% avoid \code because of side effects on active chars
+  \defargscommonending
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDeffunc}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type.  #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypefun}%
+\deftypefunargs {#3}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$.$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$.${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification.  #2 is the data type.  #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+%               at least some C++ text from working
+\defname {\defheaderxcond#2\relax$.$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefmac}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{\putwordDefspec}%
+\defunargs {#2}\endgroup %
+\catcode\equalChar=\other % Turn off change made in \defparsebody
+}
+
+% @defop CATEGORY CLASS OPERATION ARG...
+%
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+%
+\def\defopheader#1#2#3{%
+  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% function index entry
+  \begingroup
+    \defname{#2}{\defoptype\ \putwordon\ #1}%
+    \defunargs{#3}%
+  \endgroup
+}
+
+% @deftypeop CATEGORY CLASS TYPE OPERATION ARG...
+%
+\def\deftypeop #1 {\def\deftypeopcategory{#1}%
+  \deftypeopparsebody\Edeftypeop\deftypeopx\deftypeopheader
+                       \deftypeopcategory}
+%
+% #1 is the class name, #2 the data type, #3 the operation name, #4 the args.
+\def\deftypeopheader#1#2#3#4{%
+  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}
+            {\deftypeopcategory\ \putwordon\ \code{#1}}%
+    \deftypefunargs{#4}%
+  \endgroup
+}
+
+% @deftypemethod CLASS TYPE METHOD ARG...
+%
+\def\deftypemethod{%
+  \deftypemethparsebody\Edeftypemethod\deftypemethodx\deftypemethodheader}
+%
+% #1 is the class name, #2 the data type, #3 the method name, #4 the args.
+\def\deftypemethodheader#1#2#3#4{%
+  \dosubind{fn}{\code{#3}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}{\putwordMethodon\ \code{#1}}%
+    \deftypefunargs{#4}%
+  \endgroup
+}
+
+% @deftypeivar CLASS TYPE VARNAME
+%
+\def\deftypeivar{%
+  \deftypemethparsebody\Edeftypeivar\deftypeivarx\deftypeivarheader}
+%
+% #1 is the class name, #2 the data type, #3 the variable name.
+\def\deftypeivarheader#1#2#3{%
+  \dosubind{vr}{\code{#3}}{\putwordof\ \code{#1}}% entry in variable index
+  \begingroup
+    \defname{\defheaderxcond#2\relax$.$#3}
+            {\putwordInstanceVariableof\ \code{#1}}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defmethod == @defop Method
+%
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+%
+% #1 is the class name, #2 the method name, #3 the args.
+\def\defmethodheader#1#2#3{%
+  \dosubind{fn}{\code{#2}}{\putwordon\ \code{#1}}% entry in function index
+  \begingroup
+    \defname{#2}{\putwordMethodon\ \code{#1}}%
+    \defunargs{#3}%
+  \endgroup
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% variable index entry
+  \begingroup
+    \defname{#2}{\defcvtype\ \putwordof\ #1}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defivar CLASS VARNAME == @defcv {Instance Variable} CLASS VARNAME
+%
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+%
+\def\defivarheader#1#2#3{%
+  \dosubind{vr}{\code{#2}}{\putwordof\ \code{#1}}% entry in var index
+  \begingroup
+    \defname{#2}{\putwordInstanceVariableof\ #1}%
+    \defvarargs{#3}%
+  \endgroup
+}
+
+% @defvar
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+  \defargscommonending
+}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefvar}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{\putwordDefopt}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type.  #2 is the name, perhaps followed by text that
+% is actually part of the data type, which should not be put into the index.
+\def\deftypevarheader #1#2{%
+\dovarind#2 \relax% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$.$#2}{\putwordDeftypevar}%
+  \defargscommonending
+\endgroup}
+\def\dovarind#1 #2\relax{\doind{vr}{\code{#1}}}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\dovarind#3 \relax%
+\begingroup\defname {\defheaderxcond#2\relax$.$#3}{#1}
+  \defargscommonending
+\endgroup}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% These definitions are used if you use @defunx (etc.)
+% anywhere other than immediately after a @defun or @defunx.
+%
+\def\defcvx#1 {\errmessage{@defcvx in invalid context}}
+\def\deffnx#1 {\errmessage{@deffnx in invalid context}}
+\def\defivarx#1 {\errmessage{@defivarx in invalid context}}
+\def\defmacx#1 {\errmessage{@defmacx in invalid context}}
+\def\defmethodx#1 {\errmessage{@defmethodx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\defopx#1 {\errmessage{@defopx in invalid context}}
+\def\defspecx#1 {\errmessage{@defspecx in invalid context}}
+\def\deftpx#1 {\errmessage{@deftpx in invalid context}}
+\def\deftypefnx#1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypefunx#1 {\errmessage{@deftypefunx in invalid context}}
+\def\deftypeivarx#1 {\errmessage{@deftypeivarx in invalid context}}
+\def\deftypemethodx#1 {\errmessage{@deftypemethodx in invalid context}}
+\def\deftypeopx#1 {\errmessage{@deftypeopx in invalid context}}
+\def\deftypevarx#1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx#1 {\errmessage{@deftypevrx in invalid context}}
+\def\defunx#1 {\errmessage{@defunx in invalid context}}
+\def\defvarx#1 {\errmessage{@defvarx in invalid context}}
+\def\defvrx#1 {\errmessage{@defvrx in invalid context}}
+
+
+\message{macros,}
+% @macro.
+
+% To do this right we need a feature of e-TeX, \scantokens,
+% which we arrange to emulate with a temporary file in ordinary TeX.
+\ifx\eTeXversion\undefined
+ \newwrite\macscribble
+ \def\scanmacro#1{%
+   \begingroup \newlinechar`\^^M
+   % Undo catcode changes of \startcontents and \doprintindex
+   \catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+   % Append \endinput to make sure that TeX does not see the ending newline.
+   \toks0={#1\endinput}%
+   \immediate\openout\macscribble=\jobname.tmp
+   \immediate\write\macscribble{\the\toks0}%
+   \immediate\closeout\macscribble
+   \let\xeatspaces\eatspaces
+   \input \jobname.tmp
+   \endgroup
+}
+\else
+\def\scanmacro#1{%
+\begingroup \newlinechar`\^^M
+% Undo catcode changes of \startcontents and \doprintindex
+\catcode`\@=0 \catcode`\\=\other \escapechar=`\@
+\let\xeatspaces\eatspaces\scantokens{#1\endinput}\endgroup}
+\fi
+
+\newcount\paramno   % Count of parameters
+\newtoks\macname    % Macro name
+\newif\ifrecursive  % Is it recursive?
+\def\macrolist{}    % List of all defined macros in the form
+                    % \do\macro1\do\macro2...
+
+% Utility routines.
+% Thisdoes \let #1 = #2, except with \csnames.
+\def\cslet#1#2{%
+\expandafter\expandafter
+\expandafter\let
+\expandafter\expandafter
+\csname#1\endcsname
+\csname#2\endcsname}
+
+% Trim leading and trailing spaces off a string.
+% Concepts from aro-bend problem 15 (see CTAN).
+{\catcode`\@=11
+\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }}
+\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@}
+\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @}
+\def\unbrace#1{#1}
+\unbrace{\gdef\trim@@@ #1 } #2@{#1}
+}
+
+% Trim a single trailing ^^M off a string.
+{\catcode`\^^M=\other \catcode`\Q=3%
+\gdef\eatcr #1{\eatcra #1Q^^MQ}%
+\gdef\eatcra#1^^MQ{\eatcrb#1Q}%
+\gdef\eatcrb#1Q#2Q{#1}%
+}
+
+% Macro bodies are absorbed as an argument in a context where
+% all characters are catcode 10, 11 or 12, except \ which is active
+% (as in normal texinfo). It is necessary to change the definition of \.
+
+% It's necessary to have hard CRs when the macro is executed. This is
+% done by  making ^^M (\endlinechar) catcode 12 when reading the macro
+% body, and then making it the \newlinechar in \scanmacro.
+
+\def\macrobodyctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\{=\other
+  \catcode`\}=\other
+  \catcode`\@=\other
+  \catcode`\^^M=\other
+  \usembodybackslash}
+
+\def\macroargctxt{%
+  \catcode`\~=\other
+  \catcode`\^=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\+=\other
+  \catcode`\@=\other
+  \catcode`\\=\other}
+
+% \mbodybackslash is the definition of \ in @macro bodies.
+% It maps \foo\ => \csname macarg.foo\endcsname => #N
+% where N is the macro parameter number.
+% We define \csname macarg.\endcsname to be \realbackslash, so
+% \\ in macro replacement text gets you a backslash.
+
+{\catcode`@=0 @catcode`@\=@active
+ @gdef@usembodybackslash{@let\=@mbodybackslash}
+ @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname}
+}
+\expandafter\def\csname macarg.\endcsname{\realbackslash}
+
+\def\macro{\recursivefalse\parsearg\macroxxx}
+\def\rmacro{\recursivetrue\parsearg\macroxxx}
+
+\def\macroxxx#1{%
+  \getargs{#1}%           now \macname is the macname and \argl the arglist
+  \ifx\argl\empty       % no arguments
+     \paramno=0%
+  \else
+     \expandafter\parsemargdef \argl;%
+  \fi
+  \if1\csname ismacro.\the\macname\endcsname
+     \message{Warning: redefining \the\macname}%
+  \else
+     \expandafter\ifx\csname \the\macname\endcsname \relax
+     \else \errmessage{Macro name \the\macname\space already defined}\fi
+     \global\cslet{macsave.\the\macname}{\the\macname}%
+     \global\expandafter\let\csname ismacro.\the\macname\endcsname=1%
+     % Add the macroname to \macrolist
+     \toks0 = \expandafter{\macrolist\do}%
+     \xdef\macrolist{\the\toks0
+       \expandafter\noexpand\csname\the\macname\endcsname}%
+  \fi
+  \begingroup \macrobodyctxt
+  \ifrecursive \expandafter\parsermacbody
+  \else \expandafter\parsemacbody
+  \fi}
+
+\def\unmacro{\parsearg\dounmacro}
+\def\dounmacro#1{%
+  \if1\csname ismacro.#1\endcsname
+    \global\cslet{#1}{macsave.#1}%
+    \global\expandafter\let \csname ismacro.#1\endcsname=0%
+    % Remove the macro name from \macrolist:
+    \begingroup
+      \expandafter\let\csname#1\endcsname \relax
+      \let\do\unmacrodo
+      \xdef\macrolist{\macrolist}%
+    \endgroup
+  \else
+    \errmessage{Macro #1 not defined}%
+  \fi
+}
+
+% Called by \do from \dounmacro on each macro.  The idea is to omit any
+% macro definitions that have been changed to \relax.
+%
+\def\unmacrodo#1{%
+  \ifx#1\relax
+    % remove this
+  \else
+    \noexpand\do \noexpand #1%
+  \fi
+}
+
+% This makes use of the obscure feature that if the last token of a
+% <parameter list> is #, then the preceding argument is delimited by
+% an opening brace, and that opening brace is not consumed.
+\def\getargs#1{\getargsxxx#1{}}
+\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs}
+\def\getmacname #1 #2\relax{\macname={#1}}
+\def\getmacargs#1{\def\argl{#1}}
+
+% Parse the optional {params} list.  Set up \paramno and \paramlist
+% so \defmacro knows what to do.  Define \macarg.blah for each blah
+% in the params list, to be ##N where N is the position in that list.
+% That gets used by \mbodybackslash (above).
+
+% We need to get `macro parameter char #' into several definitions.
+% The technique used is stolen from LaTeX:  let \hash be something
+% unexpandable, insert that wherever you need a #, and then redefine
+% it to # just before using the token list produced.
+%
+% The same technique is used to protect \eatspaces till just before
+% the macro is used.
+
+\def\parsemargdef#1;{\paramno=0\def\paramlist{}%
+        \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,}
+\def\parsemargdefxxx#1,{%
+  \if#1;\let\next=\relax
+  \else \let\next=\parsemargdefxxx
+    \advance\paramno by 1%
+    \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname
+        {\xeatspaces{\hash\the\paramno}}%
+    \edef\paramlist{\paramlist\hash\the\paramno,}%
+  \fi\next}
+
+% These two commands read recursive and nonrecursive macro bodies.
+% (They're different since rec and nonrec macros end differently.)
+
+\long\def\parsemacbody#1@end macro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+\long\def\parsermacbody#1@end rmacro%
+{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}%
+
+% This defines the macro itself. There are six cases: recursive and
+% nonrecursive macros of zero, one, and many arguments.
+% Much magic with \expandafter here.
+% \xdef is used so that macro definitions will survive the file
+% they're defined in; @include reads the file inside a group.
+\def\defmacro{%
+  \let\hash=##% convert placeholders to macro parameter chars
+  \ifrecursive
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\scanmacro{\temp}}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+         \egroup\noexpand\scanmacro{\temp}}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+        \csname\the\macname xxx\endcsname
+          \paramlist{\egroup\noexpand\scanmacro{\temp}}%
+    \fi
+  \else
+    \ifcase\paramno
+    % 0
+      \expandafter\xdef\csname\the\macname\endcsname{%
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \or % 1
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \noexpand\braceorline
+         \expandafter\noexpand\csname\the\macname xxx\endcsname}%
+      \expandafter\xdef\csname\the\macname xxx\endcsname##1{%
+        \egroup
+        \noexpand\norecurse{\the\macname}%
+        \noexpand\scanmacro{\temp}\egroup}%
+    \else % many
+      \expandafter\xdef\csname\the\macname\endcsname{%
+         \bgroup\noexpand\macroargctxt
+         \expandafter\noexpand\csname\the\macname xx\endcsname}%
+      \expandafter\xdef\csname\the\macname xx\endcsname##1{%
+          \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}%
+      \expandafter\expandafter
+      \expandafter\xdef
+      \expandafter\expandafter
+      \csname\the\macname xxx\endcsname
+      \paramlist{%
+          \egroup
+          \noexpand\norecurse{\the\macname}%
+          \noexpand\scanmacro{\temp}\egroup}%
+    \fi
+  \fi}
+
+\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}}
+
+% \braceorline decides whether the next nonwhitespace character is a
+% {.  If so it reads up to the closing }, if not, it reads the whole
+% line.  Whatever was read is then fed to the next control sequence
+% as an argument (by \parsebrace or \parsearg)
+\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx}
+\def\braceorlinexxx{%
+  \ifx\nchar\bgroup\else
+    \expandafter\parsearg
+  \fi \next}
+
+% We mant to disable all macros during \shipout so that they are not
+% expanded by \write.
+\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}%
+  \edef\next{\macrolist}\expandafter\endgroup\next}
+
+
+% @alias.
+% We need some trickery to remove the optional spaces around the equal
+% sign.  Just make them active and then expand them all to nothing.
+\def\alias{\begingroup\obeyspaces\parsearg\aliasxxx}
+\def\aliasxxx #1{\aliasyyy#1\relax}
+\def\aliasyyy #1=#2\relax{\ignoreactivespaces
+\edef\next{\global\let\expandafter\noexpand\csname#1\endcsname=%
+           \expandafter\noexpand\csname#2\endcsname}%
+\expandafter\endgroup\next}
+
+
+\message{cross references,}
+% @xref etc.
+
+\newwrite\auxfile
+
+\newif\ifhavexrefs    % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% @inforef is relatively simple.
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+% @node's job is to define \lastnode.
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx #1,\finishnodeparse}
+\def\nodexxx#1,#2\finishnodeparse{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+% The sectioning commands (@chapter, etc.) call these.
+\def\donoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}%
+      {Ysectionnumberandtype}%
+    \global\let\lastnode=\relax
+  \fi
+}
+\def\unnumbnoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}{Ynothing}%
+    \global\let\lastnode=\relax
+  \fi
+}
+\def\appendixnoderef{%
+  \ifx\lastnode\relax\else
+    \expandafter\expandafter\expandafter\setref{\lastnode}%
+      {Yappendixletterandtype}%
+    \global\let\lastnode=\relax
+  \fi
+}
+
+
+% @anchor{NAME} -- define xref target at arbitrary point.
+%
+\newcount\savesfregister
+\gdef\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi}
+\gdef\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi}
+\gdef\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces}
+
+% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an
+% anchor), namely NAME-title (the corresponding @chapter/etc. name),
+% NAME-pg (the page number), and NAME-snt (section number and type).
+% Called from \foonoderef.
+%
+% We have to set \indexdummies so commands such as @code in a section
+% title aren't expanded.  It would be nicer not to expand the titles in
+% the first place, but there's so many layers that that is hard to do.
+%
+% Likewise, use \turnoffactive so that punctuation chars such as underscore
+% and backslash work in node names.
+%
+\def\setref#1#2{{%
+  \atdummies
+  \pdfmkdest{#1}%
+  %
+  \turnoffactive
+  \dosetq{#1-title}{Ytitle}%
+  \dosetq{#1-pg}{Ypagenumber}%
+  \dosetq{#1-snt}{#2}%
+}}
+
+% @xref, @pxref, and @ref generate cross-references.  For \xrefX, #1 is
+% the node name, #2 the name of the Info cross-reference, #3 the printed
+% node name, #4 the name of the Info file, #5 the name of the printed
+% manual.  All but the node name can be omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \unsepspaces
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printednodename{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual}%
+  \setbox0=\hbox{\printednodename}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax
+      % Use the node name inside the square brackets.
+      \def\printednodename{\ignorespaces #1}%
+    \else
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1 > 0pt
+        % It is in another manual, so we don't have it.
+        \def\printednodename{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printednodename{\refx{#1-title}{}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printednodename{\ignorespaces #1}%
+        \fi%
+      \fi
+    \fi
+  \fi
+  %
+  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+  % insert empty discretionaries after hyphens, which means that it will
+  % not find a line break at a hyphen in a node names.  Since some manuals
+  % are best written with fairly long node names, containing hyphens, this
+  % is a loss.  Therefore, we give the text of the node name again, so it
+  % is as if TeX is seeing it for the first time.
+  \ifpdf
+    \leavevmode
+    \getfilename{#4}%
+    {\turnoffactive \otherbackslash
+     \ifnum\filenamelength>0
+       \startlink attr{/Border [0 0 0]}%
+         goto file{\the\filename.pdf} name{#1}%
+     \else
+       \startlink attr{/Border [0 0 0]}%
+         goto name{#1}%
+     \fi
+    }%
+    \linkcolor
+  \fi
+  %
+  \ifdim \wd1 > 0pt
+    \putwordsection{} ``\printednodename'' \putwordin{} \cite{\printedmanual}%
+  \else
+    % _ (for example) has to be the character _ for the purposes of the
+    % control sequence corresponding to the node, but it has to expand
+    % into the usual \leavevmode...\vrule stuff for purposes of
+    % printing. So we \turnoffactive for the \refx-snt, back on for the
+    % printing, back off for the \refx-pg.
+    {\turnoffactive \otherbackslash
+     % Only output a following space if the -snt ref is nonempty; for
+     % @unnumbered and @anchor, it won't be.
+     \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}%
+     \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi
+    }%
+    % output the `[mynode]' via a macro.
+    \xrefprintnodename\printednodename
+    %
+    % But we always want a comma and a space:
+    ,\space
+    %
+    % output the `page 3'.
+    \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}%
+  \fi
+  \endlink
+\endgroup}
+
+% This macro is called from \xrefX for the `[nodename]' part of xref
+% output.  It's a separate macro only so it can be changed more easily,
+% since not square brackets don't work in some documents.  Particularly
+% one that Bob is working on :).
+%
+\def\xrefprintnodename#1{[#1]}
+
+% \dosetq is called from \setref to do the actual \write (\iflinks).
+%
+\def\dosetq#1#2{%
+  {\let\folio=0%
+   \edef\next{\write\auxfile{\internalsetq{#1}{#2}}}%
+   \iflinks \next \fi
+  }%
+}
+
+% \internalsetq{foo}{page} expands into
+%   CHARACTERS @xrdef{foo}{...expansion of \page...}
+\def\internalsetq#1#2{@xrdef{#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq.
+%
+\def\Ypagenumber{\folio}
+\def\Ytitle{\thissection}
+\def\Ynothing{}
+\def\Ysectionnumberandtype{%
+  \ifnum\secno=0
+    \putwordChapter@tie \the\chapno
+  \else \ifnum\subsecno=0
+    \putwordSection@tie \the\chapno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+\def\Yappendixletterandtype{%
+  \ifnum\secno=0
+     \putwordAppendix@tie @char\the\appendixno{}%
+  \else \ifnum\subsecno=0
+     \putwordSection@tie @char\the\appendixno.\the\secno
+  \else \ifnum\subsubsecno=0
+    \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno
+  \else
+    \putwordSection@tie
+      @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno
+  \fi\fi\fi
+}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Pre-3.0.
+\else
+  \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+%
+\def\refx#1#2{%
+  {%
+    \indexnofonts
+    \otherbackslash
+    \expandafter\global\expandafter\let\expandafter\thisrefX
+      \csname X#1\endcsname
+  }%
+  \ifx\thisrefX\relax
+    % If not defined, say something at least.
+    \angleleft un\-de\-fined\angleright
+    \iflinks
+      \ifhavexrefs
+        \message{\linenumber Undefined cross reference `#1'.}%
+      \else
+        \ifwarnedxrefs\else
+          \global\warnedxrefstrue
+          \message{Cross reference values unknown; you must run TeX again.}%
+        \fi
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \thisrefX
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% This is the macro invoked by entries in the aux file.
+%
+\def\xrdef#1{\expandafter\gdef\csname X#1\endcsname}
+
+% Read the last existing aux file, if any.  No error if none exists.
+\def\readauxfile{\begingroup
+  \catcode`\^^@=\other
+  \catcode`\^^A=\other
+  \catcode`\^^B=\other
+  \catcode`\^^C=\other
+  \catcode`\^^D=\other
+  \catcode`\^^E=\other
+  \catcode`\^^F=\other
+  \catcode`\^^G=\other
+  \catcode`\^^H=\other
+  \catcode`\^^K=\other
+  \catcode`\^^L=\other
+  \catcode`\^^N=\other
+  \catcode`\^^P=\other
+  \catcode`\^^Q=\other
+  \catcode`\^^R=\other
+  \catcode`\^^S=\other
+  \catcode`\^^T=\other
+  \catcode`\^^U=\other
+  \catcode`\^^V=\other
+  \catcode`\^^W=\other
+  \catcode`\^^X=\other
+  \catcode`\^^Z=\other
+  \catcode`\^^[=\other
+  \catcode`\^^\=\other
+  \catcode`\^^]=\other
+  \catcode`\^^^=\other
+  \catcode`\^^_=\other
+  % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc.
+  % in xref tags, i.e., node names.  But since ^^e4 notation isn't
+  % supported in the main text, it doesn't seem desirable.  Furthermore,
+  % that is not enough: for node names that actually contain a ^
+  % character, we would end up writing a line like this: 'xrdef {'hat
+  % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first
+  % argument, and \hat is not an expandable control sequence.  It could
+  % all be worked out, but why?  Either we support ^^ or we don't.
+  %
+  % The other change necessary for this was to define \auxhat:
+  % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter
+  % and then to call \auxhat in \setq.
+  %
+  \catcode`\^=\other
+  %
+  % Special characters.  Should be turned off anyway, but...
+  \catcode`\~=\other
+  \catcode`\[=\other
+  \catcode`\]=\other
+  \catcode`\"=\other
+  \catcode`\_=\other
+  \catcode`\|=\other
+  \catcode`\<=\other
+  \catcode`\>=\other
+  \catcode`\$=\other
+  \catcode`\#=\other
+  \catcode`\&=\other
+  \catcode`\%=\other
+  \catcode`+=\other % avoid \+ for paranoia even though we've turned it off
+  %
+  % Make the characters 128-255 be printing characters
+  {%
+    \count 1=128
+    \def\loop{%
+      \catcode\count 1=\other
+      \advance\count 1 by 1
+      \ifnum \count 1<256 \loop \fi
+    }%
+  }%
+  %
+  % Turn off \ as an escape so we do not lose on
+  % entries which were dumped with control sequences in their names.
+  % For example, @xrdef{$\leq $-fun}{page ...} made by @defun ^^
+  % Reference to such entries still does not work the way one would wish,
+  % but at least they do not bomb out when the aux file is read in.
+  \catcode`\\=\other
+  %
+  % @ is our escape character in .aux files.
+  \catcode`\{=1
+  \catcode`\}=2
+  \catcode`\@=0
+  %
+  \openin 1 \jobname.aux
+  \ifeof 1 \else
+    \closein 1
+    \input \jobname.aux
+    \global\havexrefstrue
+    \global\warnedobstrue
+  \fi
+  % Open the new aux file.  TeX will close it automatically at exit.
+  \openout\auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed. (Generally, numeric constants should always be followed by a
+% space to prevent strange expansion errors.)
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only.
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \let\indent=\ptexindent
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \dofootnote
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+% Oh yes, they do; otherwise, @ifset and anything else that uses
+% \parseargline fail inside footnotes because the tokens are fixed when
+% the footnote is read.  --karl, 16nov96.
+%
+% The start of the footnote looks usually like this:
+\gdef\startfootins{\insert\footins\bgroup}
+%
+% ... but this macro is redefined inside @multitable.
+%
+\gdef\dofootnote{%
+  \startfootins
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \hsize=\pagewidth
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  \smallfonts \rm
+  %
+  % Because we use hanging indentation in footnotes, a @noindent appears
+  % to exdent this text, so make it be a no-op.  makeinfo does not use
+  % hanging indentation so @noindent can still be needed within footnote
+  % text after an @example or the like (not that this is good style).
+  \let\noindent = \relax
+  %
+  % Hang the footnote text off the number.  Use \everypar in case the
+  % footnote extends for more than one paragraph.
+  \everypar = {\hang}%
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  \futurelet\next\fo@t
+}
+}%end \catcode `\@=11
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+% @image.  We use the macros from epsf.tex to support this.
+% If epsf.tex is not installed and @image is used, we complain.
+%
+% Check for and read epsf.tex up front.  If we read it only at @image
+% time, we might be inside a group, and then its definitions would get
+% undone and the next image would fail.
+\openin 1 = epsf.tex
+\ifeof 1 \else
+  \closein 1
+  % Do not bother showing banner with epsf.tex v2.7k (available in
+  % doc/epsf.tex and on ctan).
+  \def\epsfannounce{\toks0 = }%
+  \input epsf.tex
+\fi
+%
+% We will only complain once about lack of epsf.tex.
+\newif\ifwarnednoepsf
+\newhelp\noepsfhelp{epsf.tex must be installed for images to
+  work.  It is also included in the Texinfo distribution, or you can get
+  it from ftp://tug.org/tex/epsf.tex.}
+%
+\def\image#1{%
+  \ifx\epsfbox\undefined
+    \ifwarnednoepsf \else
+      \errhelp = \noepsfhelp
+      \errmessage{epsf.tex not found, images will be ignored}%
+      \global\warnednoepsftrue
+    \fi
+  \else
+    \imagexxx #1,,,,,\finish
+  \fi
+}
+%
+% Arguments to @image:
+% #1 is (mandatory) image filename; we tack on .eps extension.
+% #2 is (optional) width, #3 is (optional) height.
+% #4 is (ignored optional) html alt text.
+% #5 is (ignored optional) extension.
+% #6 is just the usual extra ignored arg for parsing this stuff.
+\newif\ifimagevmode
+\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup
+  \catcode`\^^M = 5     % in case we're inside an example
+  \normalturnoffactive  % allow _ et al. in names
+  % If the image is by itself, center it.
+  \ifvmode
+    \imagevmodetrue
+    \nobreak\bigskip
+    % Usually we'll have text after the image which will insert
+    % \parskip glue, so insert it here too to equalize the space
+    % above and below.
+    \nobreak\vskip\parskip
+    \nobreak
+    \line\bgroup\hss
+  \fi
+  %
+  % Output the image.
+  \ifpdf
+    \dopdfimage{#1}{#2}{#3}%
+  \else
+    % \epsfbox itself resets \epsf?size at each figure.
+    \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi
+    \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi
+    \epsfbox{#1.eps}%
+  \fi
+  %
+  \ifimagevmode \hss \egroup \bigbreak \fi  % space after the image
+\endgroup}
+
+
+\message{localization,}
+% and i18n.
+
+% @documentlanguage is usually given very early, just after
+% @setfilename.  If done too late, it may not override everything
+% properly.  Single argument is the language abbreviation.
+% It would be nice if we could set up a hyphenation file here.
+%
+\def\documentlanguage{\parsearg\dodocumentlanguage}
+\def\dodocumentlanguage#1{%
+  \tex % read txi-??.tex file in plain TeX.
+  % Read the file if it exists.
+  \openin 1 txi-#1.tex
+  \ifeof1
+    \errhelp = \nolanghelp
+    \errmessage{Cannot read language file txi-#1.tex}%
+    \let\temp = \relax
+  \else
+    \def\temp{\input txi-#1.tex }%
+  \fi
+  \temp
+  \endgroup
+}
+\newhelp\nolanghelp{The given language definition file cannot be found or
+is empty.  Maybe you need to install it?  In the current directory
+should work if nowhere else does.}
+
+
+% @documentencoding should change something in TeX eventually, most
+% likely, but for now just recognize it.
+\let\documentencoding = \comment
+
+
+% Page size parameters.
+%
+\newdimen\defaultparindent \defaultparindent = 15pt
+
+\chapheadingskip = 15pt plus 4pt minus 2pt
+\secheadingskip = 12pt plus 3pt minus 2pt
+\subsecheadingskip = 9pt plus 2pt minus 2pt
+
+% Prevent underfull vbox error messages.
+\vbadness = 10000
+
+% Don't be so finicky about underfull hboxes, either.
+\hbadness = 2000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  We call this whenever the paper size is set.
+%
+\def\setemergencystretch{%
+  \ifx\emergencystretch\thisisundefined
+    % Allow us to assign to \emergencystretch anyway.
+    \def\emergencystretch{\dimen0}%
+  \else
+    \emergencystretch = .15\hsize
+  \fi
+}
+
+% Parameters in order: 1) textheight; 2) textwidth; 3) voffset;
+% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8)
+% physical page width.
+%
+% We also call \setleading{\textleading}, so the caller should define
+% \textleading.  The caller should also set \parskip.
+%
+\def\internalpagesizes#1#2#3#4#5#6#7#8{%
+  \voffset = #3\relax
+  \topskip = #6\relax
+  \splittopskip = \topskip
+  %
+  \vsize = #1\relax
+  \advance\vsize by \topskip
+  \outervsize = \vsize
+  \advance\outervsize by 2\topandbottommargin
+  \pageheight = \vsize
+  %
+  \hsize = #2\relax
+  \outerhsize = \hsize
+  \advance\outerhsize by 0.5in
+  \pagewidth = \hsize
+  %
+  \normaloffset = #4\relax
+  \bindingoffset = #5\relax
+  %
+  \ifpdf
+    \pdfpageheight #7\relax
+    \pdfpagewidth #8\relax
+  \fi
+  %
+  \setleading{\textleading}
+  %
+  \parindent = \defaultparindent
+  \setemergencystretch
+}
+
+% @letterpaper (the default).
+\def\letterpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % If page is nothing but text, make it come out even.
+  \internalpagesizes{46\baselineskip}{6in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{36pt}%
+                    {11in}{8.5in}%
+}}
+
+% Use @smallbook to reset parameters for 7x9.5 (or so) format.
+\def\smallbook{{\globaldefs = 1
+  \parskip = 2pt plus 1pt
+  \textleading = 12pt
+  %
+  \internalpagesizes{7.5in}{5in}%
+                    {\voffset}{.25in}%
+                    {\bindingoffset}{16pt}%
+                    {9.25in}{7in}%
+  %
+  \lispnarrowing = 0.3in
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = .5cm
+}}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{{\globaldefs = 1
+  \parskip = 3pt plus 2pt minus 1pt
+  \textleading = 13.2pt
+  %
+  % Double-side printing via postscript on Laserjet 4050
+  % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm.
+  % To change the settings for a different printer or situation, adjust
+  % \normaloffset until the front-side and back-side texts align.  Then
+  % do the same for \bindingoffset.  You can set these for testing in
+  % your texinfo source file like this:
+  % @tex
+  % \global\normaloffset = -6mm
+  % \global\bindingoffset = 10mm
+  % @end tex
+  \internalpagesizes{51\baselineskip}{160mm}
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{44pt}%
+                    {297mm}{210mm}%
+  %
+  \tolerance = 700
+  \hfuzz = 1pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 5mm
+}}
+
+% Use @afivepaper to print on European A5 paper.
+% From romildo@urano.iceb.ufop.br, 2 July 2000.
+% He also recommends making @example and @lisp be small.
+\def\afivepaper{{\globaldefs = 1
+  \parskip = 2pt plus 1pt minus 0.1pt
+  \textleading = 12.5pt
+  %
+  \internalpagesizes{160mm}{120mm}%
+                    {\voffset}{\hoffset}%
+                    {\bindingoffset}{8pt}%
+                    {210mm}{148mm}%
+  %
+  \lispnarrowing = 0.2in
+  \tolerance = 800
+  \hfuzz = 1.2pt
+  \contentsrightmargin = 0pt
+  \defbodyindent = 2mm
+  \tableindent = 12mm
+}}
+
+% A specific text layout, 24x15cm overall, intended for A4 paper.
+\def\afourlatex{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{237mm}{150mm}%
+                    {\voffset}{4.6mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  %
+  % Must explicitly reset to 0 because we call \afourpaper.
+  \globaldefs = 0
+}}
+
+% Use @afourwide to print on A4 paper in landscape format.
+\def\afourwide{{\globaldefs = 1
+  \afourpaper
+  \internalpagesizes{241mm}{165mm}%
+                    {\voffset}{-2.95mm}%
+                    {\bindingoffset}{7mm}%
+                    {297mm}{210mm}%
+  \globaldefs = 0
+}}
+
+% @pagesizes TEXTHEIGHT[,TEXTWIDTH]
+% Perhaps we should allow setting the margins, \topskip, \parskip,
+% and/or leading, also. Or perhaps we should compute them somehow.
+%
+\def\pagesizes{\parsearg\pagesizesxxx}
+\def\pagesizesxxx#1{\pagesizesyyy #1,,\finish}
+\def\pagesizesyyy#1,#2,#3\finish{{%
+  \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi
+  \globaldefs = 1
+  %
+  \parskip = 3pt plus 2pt minus 1pt
+  \setleading{\textleading}%
+  %
+  \dimen0 = #1
+  \advance\dimen0 by \voffset
+  %
+  \dimen2 = \hsize
+  \advance\dimen2 by \normaloffset
+  %
+  \internalpagesizes{#1}{\hsize}%
+                    {\voffset}{\normaloffset}%
+                    {\bindingoffset}{44pt}%
+                    {\dimen0}{\dimen2}%
+}}
+
+% Set default to letter.
+%
+\letterpaper
+
+
+\message{and turning on texinfo input format.}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\catcode`\$=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+\def\normaldollar{$}%$ font-lock fix
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi}
+
+% Same as above, but check for italic font.  Actually this also catches
+% non-italic slanted fonts since it is impossible to distinguish them from
+% italic fonts.  But since this is only used by $ and it uses \sl anyway
+% this is not a problem.
+\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt\char34}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt\char126}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }
+
+\catcode`\|=\active
+\def|{{\tt\char124}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+\catcode`\$=\active
+\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`+=\active
+\catcode`\_=\active
+
+% If a .fmt file is being used, characters that might appear in a file
+% name cannot be active until we have parsed the command line.
+% So turn them off again, and have \everyjob (or @setfilename) turn them on.
+% \otherifyactive is called near the end of this file.
+\def\otherifyactive{\catcode`+=\other \catcode`\_=\other}
+
+\catcode`\@=0
+
+% \rawbackslashxx outputs one backslash character in current font,
+% as in \char`\\.
+\global\chardef\rawbackslashxx=`\\
+
+% \rawbackslash defines an active \ to do \rawbackslashxx.
+% \otherbackslash defines an active \ to be a literal `\' character with
+% catcode other.
+{\catcode`\\=\active
+ @gdef@rawbackslash{@let\=@rawbackslashxx}
+ @gdef@otherbackslash{@let\=@realbackslash}
+}
+
+% \realbackslash is an actual character `\' with catcode other.
+{\catcode`\\=\other @gdef@realbackslash{\}}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{%
+  @let"=@normaldoublequote
+  @let\=@realbackslash
+  @let~=@normaltilde
+  @let^=@normalcaret
+  @let_=@normalunderscore
+  @let|=@normalverticalbar
+  @let<=@normalless
+  @let>=@normalgreater
+  @let+=@normalplus
+  @let$=@normaldollar %$ font-lock fix
+}
+
+% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of
+% the literal character `\'.  (Thus, \ is not expandable when this is in
+% effect.)
+%
+@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash}
+
+% Make _ and + \other characters, temporarily.
+% This is canceled by @fixbackslash.
+@otherifyactive
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+% Also back turn on active characters that might appear in the input
+% file name, in case not using a pre-dumped format.
+%
+@gdef@fixbackslash{%
+  @ifx\@eatinput @let\ = @normalbackslash @fi
+  @catcode`+=@active
+  @catcode`@_=@active
+}
+
+% Say @foo, not \foo, in error messages.
+@escapechar = `@@
+
+% These look ok in all fonts, so just make them not special.
+@catcode`@& = @other
+@catcode`@# = @other
+@catcode`@% = @other
+
+@c Set initial fonts.
+@textfonts
+@rm
+
+
+@c Local variables:
+@c eval: (add-hook 'write-file-hooks 'time-stamp)
+@c page-delimiter: "^\\\\message"
+@c time-stamp-start: "def\\\\texinfoversion{"
+@c time-stamp-format: "%:y-%02m-%02d.%02H"
+@c time-stamp-end: "}"
+@c End:
diff --git a/scripts/w32installer.nsi b/scripts/w32installer.nsi
new file mode 100644 (file)
index 0000000..5a8c668
--- /dev/null
@@ -0,0 +1,677 @@
+; w32installer.nsi                                  -*- coding: latin-1; -*-
+;                   W32 Installer script
+; Copyright (C) 2005 Free Software Foundation, Inc.
+;
+; This file is free software; as a special exception the author gives
+; unlimited permission to copy and/or distribute it, with or without
+; modifications, as long as this notice is preserved.
+;
+; This program is distributed in the hope that it will be useful, but
+; WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+;----------------------------------------------------------------------
+; This is an installer script used to create a W32 installer "exe" file
+; using NSIS.  It is usually used by the mk-w32-dist script.
+;----------------------------------------------------------------------
+
+; We use the modern UI.
+!include "MUI.nsh"
+!include "StrFunc.nsh"
+!include "Sections.nsh"
+
+; -------------
+; General stuff
+; -------------
+Name "GNU Privacy Guard"
+
+!ifdef WITH_WINPT
+OutFile "gnupg-w32-${VERSION}.exe"
+!else
+OutFile "gnupg-w32cli-${VERSION}.exe"
+!endif
+
+InstallDir "$PROGRAMFILES\GNU\GnuPG"
+
+InstallDirRegKey HKLM "Software\GNU\GnuPG" "Install Directory"
+
+SetCompressor lzma
+
+VIProductVersion "${PROD_VERSION}"
+VIAddVersionKey "ProductName" "GNU Privacy Guard (${VERSION})"
+VIAddVersionKey "Comments" \
+   "GnuPG is Free Software; you can redistribute it and/or modify  \
+    it under the terms of the GNU General Public License. You should  \
+    have received a copy of the GNU General Public License along with  \
+    this software; if not, write to the Free Software Foundation, Inc.,  \
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA"
+VIAddVersionKey "CompanyName" "Free Software Foundation"
+VIAddVersionKey "LegalTrademarks" ""
+VIAddVersionKey "LegalCopyright" \
+    "Copyright (C) 2005 Free Software Foundation, Inc."
+VIAddVersionKey "FileDescription" \
+    "GnuPG: Encryption and digital signature tool"
+VIAddVersionKey "FileVersion" "${PROD_VERSION}"
+
+; ----------------------
+; Variable declarations
+; ----------------------
+
+Var MYTMP
+Var STARTMENU_FOLDER
+
+; ------------------
+; Interface Settings
+; ------------------
+
+;;;!define MUI_ABORTWARNING
+!define MUI_FINISHPAGE_NOAUTOCLOSE
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE
+
+; Remember the installer language
+!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" 
+!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\GnuPG" 
+!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
+
+; -----
+; Pages      
+; -----
+
+!define MUI_WELCOMEPAGE_TEXT "$(T_About)"
+
+!insertmacro MUI_PAGE_WELCOME
+
+
+!define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
+
+!define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
+
+!define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
+
+!insertmacro MUI_PAGE_LICENSE "COPYING.txt"
+
+!define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
+!insertmacro MUI_PAGE_COMPONENTS
+
+Page custom CustomPageOptions
+
+!insertmacro MUI_PAGE_DIRECTORY
+
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" 
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\GnuPG" 
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
+  
+!insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
+
+!insertmacro MUI_PAGE_INSTFILES
+
+!define MUI_FINISHPAGE_SHOWREADME "README-W32.txt"
+!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
+!define MUI_FINISHPAGE_LINK "$(T_FiniLink)"
+!define MUI_FINISHPAGE_LINK_LOCATION "http://www.gnupg.org/"
+!insertmacro MUI_PAGE_FINISH
+
+  
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+
+; -----------------
+; i18n Declarations
+; -----------------
+
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "German"
+
+; ------------------
+; Installer Sections
+; ------------------
+
+!insertmacro MUI_RESERVEFILE_LANGDLL
+!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
+ReserveFile "opt.ini" 
+ReserveFile "COPYING.txt"
+ReserveFile "README-W32.txt"
+#ReserveFile "${NSISDIR}/Plugins/System.dll"
+ReserveFile "${NSISDIR}/Plugins/UserInfo.dll"
+
+
+${StrStr} # Supportable for Install Sections and Functions
+${StrTok} # Supportable for Install Sections and Functions
+
+
+
+;InstType "full"
+;InstType "minimal"
+
+
+;----------------------
+Section "Base" SecBase
+;  SectionIn 1 2 RO
+  SectionIn RO
+
+  SetOutPath "$INSTDIR"
+
+  File "gpg.exe"
+  File "gpgkeys_finger.exe"
+  File "gpgkeys_hkp.exe"
+  File "gpgkeys_curl.exe"
+  File "gpgkeys_ldap.exe"
+
+  SetOutPath "$INSTDIR\Doc"
+
+  File "README.txt"
+  File "README-W32.txt"
+  File "COPYING.txt"
+
+  Call InstallIconv
+
+  WriteRegStr HKLM "Software\GNU\GnuPG" "Install Directory" $INSTDIR
+
+SectionEnd ; Section Base
+
+;----------------------
+Section "NLS" SecNLS
+;  SectionIn 1
+
+  SetOutPath "$INSTDIR\gnupg.nls"
+
+  File "*.mo"
+
+SectionEnd ; Section NLS
+
+;------------------------
+Section "Tools" SecTools
+;  SectionIn 1
+
+  SetOutPath "$INSTDIR"
+  File "gpgsplit.exe"
+  File "gpgv.exe"
+
+SectionEnd ; Section Tools
+
+;------------------
+!ifdef WITH_WINPT
+Section "WinPT" SecWinPT
+;  SectionIn 1
+
+  SetOutPath "$INSTDIR"
+
+  File "WinPT.exe"
+  File "PTD.dll"
+  File "keyserver.conf"
+
+  SetOutPath "$INSTDIR\Doc"
+
+  File "README.winpt.txt"
+
+  WriteRegStr HKCU "Software\GNU\GnuPG" "gpgProgram" "$INSTDIR\gpg.exe"
+
+SectionEnd ; Section WinPT
+!endif
+
+
+;----------------------
+Section "Documentation" SecDoc
+;  SectionIn 1
+
+  SetOutPath "$INSTDIR\Doc"
+
+  File "gnupg.man"
+  File "gpg.man"
+  File "gpgv.man"
+  File "NEWS.txt"
+  File "FAQ.txt"
+
+!ifdef WITH_WINPT
+  File "NEWS.winpt.txt"
+!endif ; WITH_WINPT
+
+!ifdef WITH_PATCHES
+  SetOutPath "$INSTDIR\Src"
+  File '*.diff'
+!endif
+
+SectionEnd ; Section Documentation
+
+
+;------------------
+!ifdef WITH_SOURCE
+Section /o "Source" SecSource
+
+  SetOutPath "$INSTDIR\Src"
+
+  ; Note that we include the uncompressed tarballs because this allows
+  ; far better compression results for the distribution.  We might
+  ; want to compress it again after installation.
+
+  File "gnupg-${VERSION}.tar"
+
+  File "libiconv-${LIBICONV_VERSION}.tar"
+
+!ifdef WITH_WINPT
+  File "winpt-${WINPT_VERSION}.tar"
+!endif ; WITH_WINPT
+
+SectionEnd ; Section Source
+!endif
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; The last section is a hidden one; used to finish up things.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Section "-Finish"
+
+  ;;--------------------------
+  ;;  Create the uninstaller
+  ;;--------------------------
+  WriteUninstaller "$INSTDIR\uninst-gnupg.exe"
+
+  StrCpy $MYTMP "Software\Microsoft\Windows\CurrentVersion\Uninstall\GnuPG"
+  WriteRegExpandStr HKLM $MYTMP "UninstallString" '"$INSTDIR\uninst-gnupg.exe"'
+  WriteRegExpandStr HKLM $MYTMP "InstallLocation" "$INSTDIR"
+  WriteRegStr       HKLM $MYTMP "DisplayName"     "GNU Privacy Guard"
+  WriteRegStr       HKLM $MYTMP "DisplayIcon"     "$INSTDIR\gpg.exe,0"
+  WriteRegStr       HKLM $MYTMP "DisplayVersion"  "${VERSION}"
+  WriteRegStr       HKLM $MYTMP "Publisher"       "Free Software Foundation"
+  WriteRegStr       HKLM $MYTMP "URLInfoAbout"    "http://www.gnupg.org/"
+  WriteRegDWORD     HKLM $MYTMP "NoModify"        "1"
+  WriteRegDWORD     HKLM $MYTMP "NoRepair"        "1"
+
+
+  ;;---------------------
+  ;; Create Menu entries
+  ;;---------------------
+  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+    
+  CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER"
+
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG README.lnk" \
+                 "$INSTDIR\Doc\README.txt"
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG README.Windows.lnk" \
+                 "$INSTDIR\Doc\README-W32.txt"
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG NEWS.lnk" \
+                 "$INSTDIR\Doc\NEWS.txt"
+
+  SectionGetFlags ${SecDoc} $R0 
+  IntOp $R0 $R0 & ${SF_SELECTED} 
+  IntCmp $R0 ${SF_SELECTED} 0 +2 
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG Manual Page.lnk" \
+                 "$INSTDIR\Doc\gpg.man"
+
+
+!ifdef WITH_WINPT
+  SectionGetFlags ${SecWinPT} $R0 
+  IntOp $R0 $R0 & ${SF_SELECTED} 
+  IntCmp $R0 ${SF_SELECTED} 0 no_winpt_menu 
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\winpt.lnk" \
+                 "$INSTDIR\winpt.exe"
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\WinPT README.lnk" \
+                 "$INSTDIR\Doc\README.winpt.txt"
+
+  SectionGetFlags ${SecDoc} $R0 
+  IntOp $R0 $R0 & ${SF_SELECTED} 
+  IntCmp $R0 ${SF_SELECTED} 0 +2 
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\WinPT NEWS.lnk" \
+                 "$INSTDIR\Doc\NEWS.winpt.txt"
+
+ no_winpt_menu:
+!endif
+
+  CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\uninst-gnupg.lnk" \
+                 "$INSTDIR\uninst-gnupg.exe"
+
+
+  !insertmacro MUI_STARTMENU_WRITE_END
+
+
+  ;;-----------------
+  ;; Set the language
+  ;;-----------------
+  SectionGetFlags ${SecNLS} $R0 
+  IntOp $R0 $R0 & ${SF_SELECTED} 
+  IntCmp $R0 ${SF_SELECTED} 0 lang_none
+  
+  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "opt.ini" "Field 1" "ListItems"
+  DetailPrint "Available languages: $R0"
+  !insertmacro MUI_INSTALLOPTIONS_READ $R1 "opt.ini" "Field 1" "State"
+  DetailPrint "Selected language: $R1"
+
+  StrCmp $R1 "" lang_none +1
+  ${StrStr} $R2 $R0 $R1 
+  StrCmp $R2 "" lang_none +1
+  ${StrTok} $R3 $R2 " " "0" "1"
+  goto lang_set_finish
+ lang_none:
+  DetailPrint "No language selected - using default"
+  StrCpy $R3 ""
+ lang_set_finish:
+  DetailPrint "Setting language to: $R3"
+  WriteRegStr HKCU "Software\GNU\GnuPG" "Lang" $R3
+  ;;
+
+
+SectionEnd ; "-Finish"
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Create the section for the uninstaller
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+Section "Uninstall"
+
+  ;;------------------------
+  ;; Delete files
+  ;;------------------------
+  Delete "$INSTDIR\gpg.exe"
+  Delete "$INSTDIR\gpgkeys_finger.exe"
+  Delete "$INSTDIR\gpgkeys_hkp.exe"
+  Delete "$INSTDIR\gpgkeys_curl.exe"
+  Delete "$INSTDIR\gpgkeys_ldap.exe"
+
+  Delete "$INSTDIR\Doc\README.txt"
+  Delete "$INSTDIR\Doc\README-W32.txt"
+  Delete "$INSTDIR\Doc\COPYING.txt"
+  Delete "$INSTDIR\Doc\COPYING.LIB.txt"
+  Delete "$INSTDIR\Doc\README.iconv.txt"
+
+  Delete "$INSTDIR\iconv.dll"
+
+  Delete "$INSTDIR\gnupg.nls\*.mo"
+
+  Delete "$INSTDIR\gpgsplit.exe"
+  Delete "$INSTDIR\gpgv.exe"
+
+!ifdef WITH_WINPT
+  Delete "$INSTDIR\WinPT.exe"
+  Delete "$INSTDIR\PTD.dll"
+  Delete "$INSTDIR\Doc\README.winpt.txt"
+  Delete "$INSTDIR\Doc\NEWS.winpt.txt"
+  Delete "$INSTDIR\Doc\keyserver.conf"
+!endif
+
+  Delete "$INSTDIR\Doc\gnupg.man"
+  Delete "$INSTDIR\Doc\gpg.man"
+  Delete "$INSTDIR\Doc\gpgv.man"
+  Delete "$INSTDIR\Doc\NEWS.txt"
+  Delete "$INSTDIR\Doc\FAQ.txt"
+
+  Delete "$INSTDIR\Src\gnupg-${VERSION}.tar"
+  Delete "$INSTDIR\Src\libiconv-${LIBICONV_VERSION}.tar"
+  Delete "$INSTDIR\Src\winpt-${WINPT_VERSION}.tar"
+  Delete "$INSTDIR\Src\*.diff"
+
+  Delete "$INSTDIR\uninst-gnupg.exe"
+
+  ;;------------------------
+  ;; Delete directories
+  ;;------------------------
+  RMDir "$INSTDIR\Doc"
+  RMDir "$INSTDIR\Src"
+  RMDir "$INSTDIR\gnupg.nls"
+  RMDir "$INSTDIR"
+
+
+  ;;---------------------------------------------------
+  ;; Delete the menu entries and any empty parent menus
+  ;;---------------------------------------------------
+  !insertmacro MUI_STARTMENU_GETFOLDER Application $MYTMP
+  Delete "$SMPROGRAMS\$MYTMP\*.lnk"
+  StrCpy $MYTMP "$SMPROGRAMS\$MYTMP"
+  startMenuDeleteLoop:
+    ClearErrors
+    RMDir $MYTMP
+    GetFullPathName $MYTMP "$MYTMP\.."
+    IfErrors startMenuDeleteLoopDone
+    StrCmp $MYTMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
+  startMenuDeleteLoopDone:
+
+
+  ;;-----------------------
+  ;;  Cleanup the registry
+  ;;-----------------------
+  DeleteRegValue HKCU "Software\GNU\GnuPG" "Start Menu Folder"
+  DeleteRegValue HKLM "Software\GNU\GnuPG" "Install Directory"
+  DeleteRegKey /ifempty HKLM "Software\GNU\GnuPG"
+  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GnuPG"
+
+SectionEnd ; Uninstall
+
+
+; ---------
+; Functions
+; ---------
+
+Function .onInit
+  # We can't use System.dll anymore becuase it has bee removed from
+  # Debian due to an inability to build using FS.  We should use the
+  # use our own DLL as we do with gpg4win.
+  #System::Call 'kernel32::CreateMutexA(i 0, i 0, t "GnuPGInst") i .r1 ?e'
+  #Pop $R0
+  #StrCmp $R0 0 +3
+  # MessageBox MB_OK "An instance of the installer is already running."
+  # Abort
+
+  ;;!define MUI_LANGDLL_ALWAYSSHOW
+  !insertmacro MUI_LANGDLL_DISPLAY
+
+  !insertmacro MUI_INSTALLOPTIONS_EXTRACT "opt.ini"
+
+FunctionEnd 
+
+
+Function un.onInit 
+
+  !insertmacro MUI_UNGETLANGUAGE
+  
+FunctionEnd
+
+
+;; Check whether the current user is in the Administrator group or
+;; an OS version without the need for an Administrator is in use.
+;; Print a warning if this is not the case.
+Function PrintNonAdminWarning
+  ClearErrors
+  UserInfo::GetName
+  IfErrors leave
+  Pop $0
+  UserInfo::GetAccountType
+  Pop $1
+  StrCmp $1 "Admin" leave +1
+  MessageBox MB_OK "$(T_AdminNeeded)"
+
+ leave:
+FunctionEnd
+
+
+Function CustomPageOptions  
+  SectionGetFlags ${SecNLS} $R0 
+  IntOp $R0 $R0 & ${SF_SELECTED} 
+  IntCmp $R0 ${SF_SELECTED} show 
+  Abort 
+ show: 
+  !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_SelectLanguage)"
+  !insertmacro MUI_INSTALLOPTIONS_READ $R0 "opt.ini" "Field 1" "ListItems"
+  ReadRegStr $R1 HKCU "Software\GNU\GnuPG" "Lang" 
+  StrCmp $R1 "" use_default +1
+  ${StrStr} $R2 $R0 "$R1 - " 
+  StrCmp $R2 "" +1 set_lang
+ use_default:
+  StrCpy $R2 "$(T_langid) - $(T_langname)"
+ set_lang:
+  ${StrTok} $R3 $R2 "|" "0" "1"
+  !insertmacro MUI_INSTALLOPTIONS_WRITE "opt.ini" "Field 1" "State" $R3
+
+  !insertmacro MUI_INSTALLOPTIONS_DISPLAY "opt.ini"
+
+FunctionEnd
+
+
+; Install iconv.dll if it has not been installed on the system.
+Function InstallIconv
+
+  ; First delete a iconv DLL already installed in the target directory.
+  ; This is required to detect a meanwhile globally installed dll.
+  Delete "$INSTDIR\iconv.dll"
+  ClearErrors
+  GetDllVersion "iconv.dll" $R0 $R1
+  IfErrors 0 +3
+    DetailPrint "iconv.dll is not installed."
+    goto InstallIconv
+
+  IntOp $R2 $R0 / 0x00010000
+  IntOp $R3 $R0 & 0x0000FFFF
+  IntOp $R4 $R1 / 0x00010000
+  IntOp $R5 $R1 & 0x0000FFFF
+  StrCpy $0 "$R2.$R3.$R4.$R5"
+
+  DetailPrint "iconv.dll version is $0"
+
+  IntCmp $R2 1 0 IconvTooOld
+  IntCmp $R3 9 0 IconvTooOld
+  return
+
+ IconvTooOld:
+    DetailPrint "The installed iconv.dll is too old."
+
+ InstallIconv:
+  SetOutPath "$INSTDIR"
+  File "iconv.dll"
+
+  SetOutPath "$INSTDIR\doc"
+  File "COPYING.LIB.txt"
+  File "README.iconv.txt"
+
+FunctionEnd
+
+
+; ------------
+; Descriptions
+; ------------
+
+; The list of language IDs and corresponding Latin-1 names.  Note that
+; this mapping needs to match the one in the mk-w32-dist script, so
+; that they are usable to get a default value for then ListItems of
+; opt.ini.
+LangString T_langid   ${LANG_ENGLISH} "en"
+LangString T_langname ${LANG_ENGLISH} "English"
+LangString T_langid   ${LANG_GERMAN}  "de"
+LangString T_langname ${LANG_GERMAN}  "Deutsch"
+
+; The About string as displayed on the first page.
+LangString T_About ${LANG_ENGLISH} \
+  "GnuPG is GNU's tool for secure communication and data storage. \
+  It can be used to encrypt data and to create digital signatures. \
+  It includes an advanced key management facility and is compliant \
+  with the proposed OpenPGP Internet standard as described in RFC2440. \
+  \r\n\r\n$_CLICK \
+  \r\n\r\n\r\n\r\n\r\nThis is GnuPG version ${VERSION}\r\n\
+  built on $%BUILDINFO%\r\n\
+  file version ${PROD_VERSION}"
+LangString T_About ${LANG_GERMAN} \
+  "GnuPG is das Werkzeug aus dem GNU Projekt zur sicheren Kommunikation \
+   sowie zum sicheren Speichern von Daten. \
+   \r\n\r\n$_CLICK \
+   \r\n\r\n\r\n\r\n\r\nDies ist GnuPG Version ${VERSION}\r\n\
+   erstellt am $%BUILDINFO%\r\n\
+   Dateiversion ${PROD_VERSION}"
+
+; Startup page
+LangString T_GPLHeader ${LANG_ENGLISH} \
+  "This software is licensed under the terms of the GNU General Public \
+   License (GPL) which guarantees your freedom to share and change Free \
+   Software."
+LangString T_GPLHeader ${LANG_GERMAN}} \
+  "Diese Software ist unter der GNU General Public License \
+   (GPL) lizensiert; dies gibt Ihnen die Freiheit, sie \
+   zu ändern und weiterzugeben."
+
+LangString T_GPLShort ${LANG_ENGLISH} \
+  "In short: You are allowed to run this software for any purpose. \
+   You may distribute it as long as you give the recipients the same \
+   rights you have received."
+LangString T_GPLShort ${LANG_GERMAN} \
+  "In aller Kürze: Sie haben das Recht, die Software zu jedem Zweck \
+   einzusetzen.  Sie können die Software weitergeben, sofern Sie dem \
+   Empfänger dieselben Rechte einräumen, die auch Sie erhalten haben."
+
+
+; Finish page
+LangString T_FiniLink ${LANG_ENGLISH} \
+  "Visit the GnuPG website for latest news and support"
+LangString T_FiniLink ${LANG_GERMAN}} \
+  "Zur GnuPG Website mit Neuigkeiten und Hilfsangeboten"
+
+; From Function PrintNonAdminWarning
+LangString T_AdminNeeded ${LANG_ENGLISH} \
+   "Warning: Administrator permissions required for a successful installation"
+LangString T_AdminNeeded ${LANG_GERMAN} \
+   "Warnung: Administrator Reche werden für eine erfolgreiche \
+    Installation benötigt."
+
+
+; Installation options like language used for GnuPG
+LangString T_InstallOptions ${LANG_ENGLISH} "Install Options"
+LangString T_InstallOptions ${LANG_GERMAN}  "Installationsoptionen"
+
+LangString T_SelectLanguage ${LANG_ENGLISH} "GnuPG Language Selection"
+LangString T_SelectLanguage ${LANG_German}  "Auswahl der Sprache für GnuPG"
+
+; This text is used on the finish page.
+LangString T_ShowReadme ${LANG_ENGLISH} "Show the README file"
+LangString T_ShowReadme ${LANG_GERMAN} "Die README Datei anzeigen"
+
+; Section names
+LangString DESC_SecBase ${LANG_ENGLISH} \
+      "The basic files used for the standard OpenPGP protocol"
+LangString DESC_SecBase ${LANG_GERMAN} \
+      "Die Basis Dateien zur Benutzung des OpenPGP Protokolls"
+
+Langstring DESC_SecNLS ${LANG_ENGLISH} \
+      "Support for languages other than English"
+LangString DESC_SecNLS ${LANG_GERMAN} \
+      "Unterstützung für weitere Sprachen neben Englisch"
+
+LangString DESC_SecTools ${LANG_ENGLISH} \
+      "Extra tools like gpgv and gpgsplit"
+LangString DESC_SecTools ${LANG_GERMAN} \
+      "Weitere Tools wie gpgv und gpgsplit"
+
+!ifdef WITH_WINPT
+LangString DESC_SecWinPT ${LANG_ENGLISH} \
+      "The Windows Privacy Tray (WinPT)"
+LangString DESC_SecWinPT ${LANG_GERMAN} \
+      "Der Windows Privacy Tray (WinPT)"
+!endif
+
+LangString DESC_SecDoc ${LANG_ENGLISH} \
+      "Manual pages and a FAQ"
+LangString DESC_SecDoc ${LANG_GERMAN} \
+      "Handbuchseiten und eine FAQ"
+
+LangString DESC_SecSource ${LANG_ENGLISH} \
+      "Quelltextdateien"
+LangString DESC_SecSource ${LANG_GERMAN} \
+      "Source files"
+
+
+
+;-------------------------------------
+; Associate section names with strings
+;--------------------------------------
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+  !insertmacro MUI_DESCRIPTION_TEXT ${SecBase} $(DESC_SecBase)
+  !insertmacro MUI_DESCRIPTION_TEXT ${SecNLS} $(DESC_SecNLS)
+  !insertmacro MUI_DESCRIPTION_TEXT ${SecTools} $(DESC_SecTools)
+!ifdef WITH_WINPT
+  !insertmacro MUI_DESCRIPTION_TEXT ${SecWinPT} $(DESC_SecWinPT)
+!endif
+  !insertmacro MUI_DESCRIPTION_TEXT ${SecDoc} $(DESC_SecDoc)
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
diff --git a/tools/ChangeLog b/tools/ChangeLog
new file mode 100644 (file)
index 0000000..00455c6
--- /dev/null
@@ -0,0 +1,226 @@
+2006-04-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * make-dns-cert.c (main): Small exit code tweak from Peter
+       Palfrader.
+
+2006-04-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * make-dns-cert.c: Some changes from Peter Palfrader to send
+       errors to stderr and allow spaces in a fingerprint.  Also warn
+       when a key is over 16k (as that is the default max-cert-size) and
+       fail when a key is over 64k as that is the DNS limit in many
+       places.
+
+2006-04-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * make-dns-cert.c: New program to generate properly formatted CERT
+       records so people don't have to do it manually.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * mk-tdata.c (main): Implement option --char.
+
+2005-08-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg-zip.in: Add --decrypt functionality.  Fix quoting so
+       filenames with spaces work properly.
+
+2005-08-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpg-zip.in: New.  Script wrapper to work with encrypted tar
+       files, a la PGP Zip.
+
+       * Makefile.am: Use it if we have a USTAR compatible tar.
+
+2004-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Link with readline where needed.
+
+2004-10-28  Werner Koch  <wk@g10code.com>
+
+       * Makefile.am (other_libs): New.  Also include LIBICONV.  Noted by
+       Tim Mooney.
+
+2004-10-01  Werner Koch  <wk@g10code.com>
+
+       * bftest.c (i18n_init): Always use LC_ALL.
+       * shmtest.c (i18n_init): Ditto.
+       * mpicalc.c (i18n_init): Ditto.
+
+2004-09-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * pgpgroup-to-gpggroup: New perl script to take groups from PGP
+       command line and write out GnuPG 'group' config lines.
+
+2004-07-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * ring-a-party: ElGamal -> Elgamal
+
+2004-01-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * convert-from-106, lspgpot: Check for gpg binary before
+       proceeding.  Don't hardcode the path to gpg.
+
+       * gpgsplit.c (handle_bzip2): Remove two cut and paste typecast
+       errors.  Noted by Stefan Bellon.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgsplit.c [__riscos__]: Removal of unnecessary #ifdef
+       __riscos__ sections.
+
+2003-12-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgsplit.c (write_part): Split off decompression code.
+       (handle_zlib): Move it here.
+       (handle_bzip2): Add this to handle BZIP2 compressed messages.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Replaced INTLLIBS by LIBINTL.
+
+2003-08-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use NETLIBS instead of EGDLIBS.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use W32LIBS where appropriate.
+
+2003-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Some cleanup, and use DLLIBS for -ldl.
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * bftest.c, crlf.c, mk-tdata.c, mpicalc.c, shmtest.c: Edit all
+       preprocessor instructions to remove whitespace before the
+       '#'. This is not required by C89, but there are some compilers out
+       there that don't like it.
+
+2003-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Use @CAPLIBS@ to link in -lcap if we are using
+       capabilities.
+
+2003-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Distribute convert-from-106.
+
+       * convert-from-106: Script to automate the 1.0.6->later
+       conversion.  It marks all secret keys as ultimately trusted, adds
+       the signature caches, and checks the trustdb.  Moved from the
+       scripts directory.
+
+2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgsplit.c (write_part) [__riscos__]: Use riscos_load_module()
+       to load ZLib module.
+
+2002-10-23  Werner Koch  <wk@gnupg.org>
+
+       * gpgsplit.c: New options --secret-to-public and --no-split.
+       GNUified the indentation style.
+
+2002-09-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Link bftest with EGDLIBS (i.e. NETLIBS) as EGD uses
+       sockets.
+
+2002-05-07  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgsplit.c (create_filename): Use EXTSEP_S instead of ".".
+
+2002-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Do not list libraries in -lxxx format in a
+       dependency line.
+
+2002-01-02  Stefan Bellon  <sbellon@sbellon.de>
+
+       * gpgsplit.c [__riscos__]: Added RISC OS specific file name
+       code.
+
+       * gpgsplit.c (write_part): Introduced two explicit casts.
+
+2001-12-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * gpgsplit.c (pkttype_to_string): PKT_PHOTO_ID -> PKT_ATTRIBUTE
+
+2001-10-23  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am (gpgsplit_LDADD): Add ZLIBS.
+
+2001-09-18  Werner Koch  <wk@gnupg.org>
+
+       * gpgsplit.c: New option --uncompress.
+       (write_part): Handle old style uncompressing.
+
+2001-06-20  Werner Koch  <wk@gnupg.org>
+
+       * gpgsplit.c: New.
+       * Makefile.am (bin_PROGRAMS): Install gpgsplit.
+
+2001-03-27  Werner Koch  <wk@gnupg.org>
+
+       * mail-signed-keys: Add option --dry-run.
+
+2001-03-21  Werner Koch  <wk@gnupg.org>
+
+       * shmtest.c: Add sys/types.h
+
+Fri Sep 15 18:40:36 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * ring-a-party: An array start at offset 1 no 0.  Many thanks to Mike
+        for finding this bug.
+
+Thu Sep 14 14:20:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * ring-a-party: Flush the last key.
+
+Wed Jul  5 13:28:45 CEST 2000  Werner Koch  <wk@>
+
+        * mail-signed-keys: New.
+
+Tue May 23 09:19:00 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * ring-a-party: New.
+
+Thu Jul  8 16:21:27 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * lspgpot: New
+
+Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Support for libtool.
+
+Tue Jun  8 13:36:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpicalc.c (main): hex digits may now be lowercase
+       (do_mulm): new.
+
+Thu Dec 10 20:15:36 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * mpicalc.c (main): Moved initialization out of definition.
+
+Mon May 18 15:39:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * mk-tdata.c: New.
+
+Tue Apr  7 19:50:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * bftest.c: Now supports all availabe ciphers.
+
+
+
+ Copyright 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
+
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644 (file)
index 0000000..5efe2c1
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (C) 1998, 1999, 2000, 2001, 2003,
+#               2004  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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+EXTRA_DIST = lspgpot ring-a-party mail-signed-keys convert-from-106
+INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl
+needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a 
+other_libs = $(LIBICONV) $(LIBINTL) $(CAPLIBS)
+
+bin_PROGRAMS    = gpgsplit
+noinst_PROGRAMS = mpicalc bftest clean-sat mk-tdata shmtest make-dns-cert
+
+if HAVE_USTAR
+bin_SCRIPTS = gpg-zip
+endif
+
+gpgsplit_LDADD  = $(needed_libs) $(other_libs) @ZLIBS@
+mpicalc_LDADD   = $(needed_libs) $(other_libs) @W32LIBS@
+bftest_LDADD    = $(needed_libs) $(other_libs) @W32LIBS@ @DLLIBS@ @NETLIBS@ @LIBREADLINE@
+shmtest_LDADD   = $(needed_libs) $(other_libs) @LIBREADLINE@
+
+gpgsplit mpicalc bftest shmtest: $(needed_libs)
diff --git a/tools/Makefile.in b/tools/Makefile.in
new file mode 100644 (file)
index 0000000..a5a20c0
--- /dev/null
@@ -0,0 +1,675 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001, 2003,
+#               2004  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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = gpgsplit$(EXEEXT)
+noinst_PROGRAMS = mpicalc$(EXEEXT) bftest$(EXEEXT) clean-sat$(EXEEXT) \
+       mk-tdata$(EXEEXT) shmtest$(EXEEXT) make-dns-cert$(EXEEXT)
+subdir = tools
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/gpg-zip.in ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES = gpg-zip
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+bftest_SOURCES = bftest.c
+bftest_OBJECTS = bftest.$(OBJEXT)
+am__DEPENDENCIES_1 = ../cipher/libcipher.a ../mpi/libmpi.a \
+       ../util/libutil.a
+am__DEPENDENCIES_2 =
+am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_2) \
+       $(am__DEPENDENCIES_2)
+bftest_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+clean_sat_SOURCES = clean-sat.c
+clean_sat_OBJECTS = clean-sat.$(OBJEXT)
+clean_sat_LDADD = $(LDADD)
+gpgsplit_SOURCES = gpgsplit.c
+gpgsplit_OBJECTS = gpgsplit.$(OBJEXT)
+gpgsplit_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+make_dns_cert_SOURCES = make-dns-cert.c
+make_dns_cert_OBJECTS = make-dns-cert.$(OBJEXT)
+make_dns_cert_LDADD = $(LDADD)
+mk_tdata_SOURCES = mk-tdata.c
+mk_tdata_OBJECTS = mk-tdata.$(OBJEXT)
+mk_tdata_LDADD = $(LDADD)
+mpicalc_SOURCES = mpicalc.c
+mpicalc_OBJECTS = mpicalc.$(OBJEXT)
+mpicalc_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+shmtest_SOURCES = shmtest.c
+shmtest_OBJECTS = shmtest.$(OBJEXT)
+shmtest_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_3)
+binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
+SCRIPTS = $(bin_SCRIPTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = bftest.c clean-sat.c gpgsplit.c make-dns-cert.c mk-tdata.c \
+       mpicalc.c shmtest.c
+DIST_SOURCES = bftest.c clean-sat.c gpgsplit.c make-dns-cert.c \
+       mk-tdata.c mpicalc.c shmtest.c
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = lspgpot ring-a-party mail-signed-keys convert-from-106
+INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/intl
+needed_libs = ../cipher/libcipher.a ../mpi/libmpi.a ../util/libutil.a 
+other_libs = $(LIBICONV) $(LIBINTL) $(CAPLIBS)
+@HAVE_USTAR_TRUE@bin_SCRIPTS = gpg-zip
+gpgsplit_LDADD = $(needed_libs) $(other_libs) @ZLIBS@
+mpicalc_LDADD = $(needed_libs) $(other_libs) @W32LIBS@
+bftest_LDADD = $(needed_libs) $(other_libs) @W32LIBS@ @DLLIBS@ @NETLIBS@ @LIBREADLINE@
+shmtest_LDADD = $(needed_libs) $(other_libs) @LIBREADLINE@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  tools/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  tools/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+gpg-zip: $(top_builddir)/config.status $(srcdir)/gpg-zip.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+         if test -f $$p \
+         ; then \
+           f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+          echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+          $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+         rm -f "$(DESTDIR)$(bindir)/$$f"; \
+       done
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+installcheck-binPROGRAMS: $(bin_PROGRAMS)
+       bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \
+         case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+          *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+         esac; \
+         f=`echo "$$p" | \
+            sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+         for opt in --help --version; do \
+           if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \
+                2>c$${pid}_.err </dev/null \
+                && test -n "`cat c$${pid}_.out`" \
+                && test -z "`cat c$${pid}_.err`"; then :; \
+           else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+         done; \
+       done; rm -f c$${pid}_.???; exit $$bad
+
+clean-noinstPROGRAMS:
+       -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+bftest$(EXEEXT): $(bftest_OBJECTS) $(bftest_DEPENDENCIES) 
+       @rm -f bftest$(EXEEXT)
+       $(LINK) $(bftest_LDFLAGS) $(bftest_OBJECTS) $(bftest_LDADD) $(LIBS)
+clean-sat$(EXEEXT): $(clean_sat_OBJECTS) $(clean_sat_DEPENDENCIES) 
+       @rm -f clean-sat$(EXEEXT)
+       $(LINK) $(clean_sat_LDFLAGS) $(clean_sat_OBJECTS) $(clean_sat_LDADD) $(LIBS)
+gpgsplit$(EXEEXT): $(gpgsplit_OBJECTS) $(gpgsplit_DEPENDENCIES) 
+       @rm -f gpgsplit$(EXEEXT)
+       $(LINK) $(gpgsplit_LDFLAGS) $(gpgsplit_OBJECTS) $(gpgsplit_LDADD) $(LIBS)
+make-dns-cert$(EXEEXT): $(make_dns_cert_OBJECTS) $(make_dns_cert_DEPENDENCIES) 
+       @rm -f make-dns-cert$(EXEEXT)
+       $(LINK) $(make_dns_cert_LDFLAGS) $(make_dns_cert_OBJECTS) $(make_dns_cert_LDADD) $(LIBS)
+mk-tdata$(EXEEXT): $(mk_tdata_OBJECTS) $(mk_tdata_DEPENDENCIES) 
+       @rm -f mk-tdata$(EXEEXT)
+       $(LINK) $(mk_tdata_LDFLAGS) $(mk_tdata_OBJECTS) $(mk_tdata_LDADD) $(LIBS)
+mpicalc$(EXEEXT): $(mpicalc_OBJECTS) $(mpicalc_DEPENDENCIES) 
+       @rm -f mpicalc$(EXEEXT)
+       $(LINK) $(mpicalc_LDFLAGS) $(mpicalc_OBJECTS) $(mpicalc_LDADD) $(LIBS)
+shmtest$(EXEEXT): $(shmtest_OBJECTS) $(shmtest_DEPENDENCIES) 
+       @rm -f shmtest$(EXEEXT)
+       $(LINK) $(shmtest_LDFLAGS) $(shmtest_OBJECTS) $(shmtest_LDADD) $(LIBS)
+install-binSCRIPTS: $(bin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+       @list='$(bin_SCRIPTS)'; for p in $$list; do \
+         if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+         if test -f $$d$$p; then \
+           f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+           echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+           $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \
+         else :; fi; \
+       done
+
+uninstall-binSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       @list='$(bin_SCRIPTS)'; for p in $$list; do \
+         f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
+         echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+         rm -f "$(DESTDIR)$(bindir)/$$f"; \
+       done
+
+installcheck-binSCRIPTS: $(bin_SCRIPTS)
+       bad=0; pid=$$$$; list="$(bin_SCRIPTS)"; for p in $$list; do \
+         case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \
+          *" $$p "* | *" $(srcdir)/$$p "*) continue;; \
+         esac; \
+         f=`echo "$$p" | sed 's,^.*/,,;$(transform)'`; \
+         for opt in --help --version; do \
+           if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \
+                2>c$${pid}_.err </dev/null \
+                && test -n "`cat c$${pid}_.out`" \
+                && test -z "`cat c$${pid}_.err`"; then :; \
+           else echo "$$f does not support $$opt" 1>&2; bad=1; fi; \
+         done; \
+       done; rm -f c$${pid}_.???; exit $$bad
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bftest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clean-sat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsplit.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make-dns-cert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mk-tdata.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpicalc.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shmtest.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(SCRIPTS)
+installdirs:
+       for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \
+         test -z "$$dir" || $(mkdir_p) "$$dir"; \
+       done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-noinstPROGRAMS \
+       mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS install-binSCRIPTS
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am: installcheck-binPROGRAMS installcheck-binSCRIPTS
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+       uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+       clean-generic clean-noinstPROGRAMS ctags distclean \
+       distclean-compile distclean-generic distclean-tags distdir dvi \
+       dvi-am html html-am info info-am install install-am \
+       install-binPROGRAMS install-binSCRIPTS install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installcheck-binPROGRAMS \
+       installcheck-binSCRIPTS installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \
+       uninstall-info-am
+
+
+gpgsplit mpicalc bftest shmtest: $(needed_libs)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tools/bftest.c b/tools/bftest.c
new file mode 100644 (file)
index 0000000..829c429
--- /dev/null
@@ -0,0 +1,108 @@
+/* bftest.c - Blowfish test program
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_DOSISH_SYSTEM
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+#include "util.h"
+#include "cipher.h"
+#include "i18n.h"
+
+static void
+my_usage(void)
+{
+    fprintf(stderr, "usage: bftest [-e][-d] algo key\n");
+    exit(1);
+}
+
+const char *
+strusage( int level )
+{
+    return default_strusage(level);
+}
+
+static void
+i18n_init(void)
+{
+#ifdef ENABLE_NLS
+  setlocale( LC_ALL, "" );
+  bindtextdomain( PACKAGE, G10_LOCALEDIR );
+  textdomain( PACKAGE );
+#endif
+}
+
+int
+main(int argc, char **argv)
+{
+    int encode=0;
+    CIPHER_HANDLE hd;
+    char buf[4096];
+    int n, size=4096;
+    int algo;
+
+#ifdef HAVE_DOSISH_SYSTEM
+    setmode( fileno(stdin), O_BINARY );
+    setmode( fileno(stdout), O_BINARY );
+#endif
+
+    i18n_init();
+    if( argc > 1 && !strcmp(argv[1], "-e") ) {
+       encode++;
+       argc--; argv++;
+    }
+    else if( argc > 1 && !strcmp(argv[1], "-E") ) {
+       encode++;
+       argc--; argv++;
+       size = 10;
+    }
+    else if( argc > 1 && !strcmp(argv[1], "-d") ) {
+       argc--; argv++;
+    }
+    else if( argc > 1 && !strcmp(argv[1], "-D") ) {
+       argc--; argv++;
+       size = 10;
+    }
+    if( argc != 3 )
+       my_usage();
+    argc--; argv++;
+    algo = string_to_cipher_algo( *argv );
+    argc--; argv++;
+
+    hd = cipher_open( algo, CIPHER_MODE_CFB, 0 );
+    cipher_setkey( hd, *argv, strlen(*argv) );
+    cipher_setiv( hd, NULL, 0 );
+    while( (n = fread( buf, 1, size, stdin )) > 0 ) {
+       if( encode )
+           cipher_encrypt( hd, buf, buf, n );
+       else
+           cipher_decrypt( hd, buf, buf, n );
+       if( fwrite( buf, 1, n, stdout) != n )
+           log_fatal("write error\n");
+    }
+    cipher_close(hd);
+    return 0;
+}
diff --git a/tools/clean-sat.c b/tools/clean-sat.c
new file mode 100644 (file)
index 0000000..8b6bfd7
--- /dev/null
@@ -0,0 +1,34 @@
+/* clean-sat.c
+ * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include <stdio.h>
+
+int
+main(int argc, char **argv)
+{
+    int c;
+
+    if( argc > 1 ) {
+       fprintf(stderr, "no arguments, please\n");
+       return 1;
+    }
+
+    while( (c=getchar()) == '\n' )
+       ;
+    while( c != EOF ) {
+       putchar(c);
+       c = getchar();
+    }
+
+    return 0;
+}
+
diff --git a/tools/convert-from-106 b/tools/convert-from-106
new file mode 100755 (executable)
index 0000000..634152b
--- /dev/null
@@ -0,0 +1,57 @@
+#!/bin/sh
+# Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+if ! gpg --version > /dev/null 2>&1 ; then
+   echo "GnuPG not available!"
+   exit 1
+fi
+
+gpg="gpg --no-greeting --no-secmem-warning"
+
+echo "This script converts your public keyring and trustdb from GnuPG"
+echo "1.0.6 or earlier to the 1.0.7 and later format."
+
+echo "If you have already done this, there is no harm (but no point)"
+echo "in doing it again."
+
+echo -n "Continue? (y/N)"
+
+read answer
+
+if test "x$answer" != "xy" ; then
+  exit 0
+fi
+
+echo
+echo "Marking your keys as ultimately trusted"
+for key in `$gpg --with-colons --list-secret-keys | grep sec: | cut -d: -f5`
+do
+  $gpg --trusted-key $key --with-colons --list-keys $key > /dev/null 2>&1
+  echo -n "."
+done
+echo
+
+echo
+echo "Adding signature caches"
+$gpg --rebuild-keydb-caches
+
+echo
+echo "Checking trustdb"
+$gpg --check-trustdb
+
+echo
+echo "Done!"
diff --git a/tools/gpg-zip.in b/tools/gpg-zip.in
new file mode 100644 (file)
index 0000000..8b4ccfb
--- /dev/null
@@ -0,0 +1,142 @@
+#!/bin/sh
+
+# gpg-archive - gpg-ized tar using the same format as PGP's PGP Zip.
+# 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+# Despite the name, PGP Zip format is actually an OpenPGP-wrapped tar
+# file.  To be compatible with PGP itself, this must be a USTAR format
+# tar file.  Unclear on whether there is a distinction here between
+# the GNU or POSIX variant of USTAR.
+
+VERSION=@VERSION@
+TAR=@TAR@
+GPG=gpg
+
+usage="\
+Usage: gpg-zip [--help] [--version] [--encrypt] [--decrypt] [--symmetric]
+       [--list-archive] [--output FILE] [--gpg GPG] [--gpg-args ARGS]
+       [--tar TAR] [--tar-args ARGS] filename1 [filename2, ...]
+       directory1 [directory2, ...]
+
+Encrypt or sign files into an archive."
+
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)
+      echo "$usage"
+      exit 0
+      ;;
+    --list-archive)
+      list=yes
+      create=no
+      unpack=no
+      shift
+      ;;
+    --encrypt | -e)
+      gpg_args="$gpg_args --encrypt"
+      list=no
+      create=yes
+      unpack=no
+      shift
+      ;;
+    --decrypt | -d)
+      gpg_args="$gpg_args --decrypt"
+      list=no
+      create=no
+      unpack=yes
+      shift
+      ;;
+    --symmetric | -c)
+      gpg_args="$gpg_args --symmetric"
+      list=no
+      create=yes
+      unpack=no
+      shift
+      ;;
+    --sign | -s)
+      gpg_args="$gpg_args --sign"
+      list=no
+      create=yes
+      unpack=no
+      shift
+      ;;
+    --recipient | -r)
+      gpg_args="$gpg_args --recipient $2"
+      shift
+      shift
+      ;;
+    --local-user | -u)
+      gpg_args="$gpg_args --local-user $2"
+      shift
+      shift
+      ;;
+    --output | -o)
+      gpg_args="$gpg_args --output $2"
+      shift
+      shift
+      ;;
+    --version)
+      echo "gpg-zip (GnuPG) $VERSION"
+      exit 0
+      ;;
+    --gpg)
+      GPG=$1
+      shift
+      ;;
+    --gpg-args)
+      gpg_args="$gpg_args $2"
+      shift
+      shift
+      ;;
+    --tar)
+      TAR=$1
+      shift
+      ;;
+    --tar-args)
+      tar_args="$tar_args $2"
+      shift
+      shift
+      ;;
+    --)
+      shift
+      break
+      ;;
+    -*)
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)
+      break
+      ;;
+  esac
+done
+
+if test x$create = xyes ; then
+#   echo "$TAR -cf - "$@" | $GPG --set-filename x.tar $gpg_args" 1>&2
+   $TAR -cf - "$@" | $GPG --set-filename x.tar $gpg_args
+elif test x$list = xyes ; then
+#   echo "cat \"$1\" | $GPG $gpg_args | $TAR $tar_args -tf -" 1>&2
+   cat "$1" | $GPG $gpg_args | $TAR $tar_args -tf -
+elif test x$unpack = xyes ; then
+#   echo "cat \"$1\" | $GPG $gpg_args | $TAR $tar_args -xvf -" 1>&2
+   cat "$1" | $GPG $gpg_args | $TAR $tar_args -xvf -
+else
+   echo "$usage" 1>&2
+   exit 1
+fi
diff --git a/tools/gpgsplit.c b/tools/gpgsplit.c
new file mode 100644 (file)
index 0000000..3cdae05
--- /dev/null
@@ -0,0 +1,879 @@
+/* gpgsplit.c - An OpenPGP packet splitting tool
+ * Copyright (C) 2001, 2002, 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* 
+ * TODO: Add an option to uncompress packets.  This should come quite handy.
+ */
+
+#include <config.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <assert.h>
+#ifdef HAVE_DOSISH_SYSTEM
+# include <fcntl.h> /* for setmode() */
+#endif
+#include <zlib.h>
+#ifdef HAVE_BZIP2
+#include <bzlib.h>
+#endif /* HAVE_BZIP2 */
+#if defined(__riscos__) && defined(USE_ZLIBRISCOS)
+# include "zlib-riscos.h"
+#endif
+
+#define INCLUDED_BY_MAIN_MODULE 1
+#include "../g10/packet.h"
+#include "util.h"
+
+static int opt_verbose;
+static const char *opt_prefix = "";
+static int opt_uncompress;
+static int opt_secret_to_public;
+static int opt_no_split;
+
+static void g10_exit( int rc );
+static void split_packets (const char *fname);
+
+
+enum cmd_and_opt_values {
+  aNull = 0,
+  oVerbose       = 'v',
+  oPrefix       = 'p',                          
+  oUncompress   = 500,                      
+  oSecretToPublic,                      
+  oNoSplit,
+
+  aTest
+};
+
+
+static ARGPARSE_OPTS opts[] = {
+
+    { 301, NULL, 0, "@Options:\n " },
+
+    { oVerbose, "verbose",   0, "verbose" },
+    { oPrefix,  "prefix",    2, "|STRING|Prepend filenames with STRING" },
+    { oUncompress, "uncompress", 0, "uncompress a packet"},
+    { oSecretToPublic, "secret-to-public", 0, "convert secret keys to public keys"},
+    { oNoSplit, "no-split", 0, "write to stdout and don't actually split"},
+{0} };
+
+
+const char *
+strusage( int level )
+{
+  const char *p;
+  switch (level)
+    {
+    case 11: p = "gpgsplit (GnuPG)";
+      break;
+    case 13: p = VERSION; break;
+    case 17: p = PRINTABLE_OS_NAME; break;
+    case 19: p =
+               "Please report bugs to <bug-gnupg@gnu.org>.\n";
+    break;
+    case 1:
+    case 40:   p =
+                  "Usage: gpgsplit [options] [files] (-h for help)";
+    break;
+    case 41:   p =
+                  "Syntax: gpgsplit [options] [files]\n"
+                  "Split an OpenPGP message into packets\n";
+    break;
+    
+    default:   p = default_strusage(level);
+    }
+  return p;
+}
+
+
+
+int
+main( int argc, char **argv )
+{
+  ARGPARSE_ARGS pargs;
+
+#ifdef HAVE_DOSISH_SYSTEM
+  setmode( fileno(stdin), O_BINARY );
+  setmode( fileno(stdout), O_BINARY );
+#endif
+  log_set_name("gpgsplit");
+  
+  pargs.argc = &argc;
+  pargs.argv = &argv;
+  pargs.flags=  1;  /* do not remove the args */
+  while (optfile_parse( NULL, NULL, NULL, &pargs, opts))
+    {
+      switch (pargs.r_opt)
+        {
+        case oVerbose: opt_verbose = 1; break;
+        case oPrefix: opt_prefix = pargs.r.ret_str; break;
+        case oUncompress: opt_uncompress = 1; break;
+        case oSecretToPublic: opt_secret_to_public = 1; break;
+        case oNoSplit: opt_no_split = 1; break;
+        default : pargs.err = 2; break;
+       }
+    }
+  
+  if (log_get_errorcount(0))
+    g10_exit (2);
+
+  if (!argc)
+    split_packets (NULL);
+  else
+    {
+      for ( ;argc; argc--, argv++) 
+        split_packets (*argv);
+    }
+  
+  g10_exit (0);
+  return 0; 
+}
+
+
+static void
+g10_exit (int rc)
+{
+  rc = rc? rc : log_get_errorcount(0)? 2 : 0;
+  exit(rc );
+}
+
+static const char *
+pkttype_to_string (int pkttype)
+{
+  const char *s;
+
+  switch (pkttype)
+    {
+    case PKT_PUBKEY_ENC    : s = "pk_enc"; break;
+    case PKT_SIGNATURE     : s = "sig"; break;
+    case PKT_SYMKEY_ENC    : s = "sym_enc"; break;
+    case PKT_ONEPASS_SIG   : s = "onepass_sig"; break;
+    case PKT_SECRET_KEY    : s = "secret_key"; break;
+    case PKT_PUBLIC_KEY    : s = "public_key"; break;
+    case PKT_SECRET_SUBKEY : s = "secret_subkey"; break;
+    case PKT_COMPRESSED    : 
+      s = opt_uncompress? "uncompressed":"compressed";
+      break;
+    case PKT_ENCRYPTED     : s = "encrypted"; break;
+    case PKT_MARKER           : s = "marker"; break;
+    case PKT_PLAINTEXT     : s = "plaintext"; break;
+    case PKT_RING_TRUST    : s = "ring_trust"; break;
+    case PKT_USER_ID       : s = "user_id"; break;
+    case PKT_PUBLIC_SUBKEY : s = "public_subkey"; break;
+    case PKT_OLD_COMMENT   : s = "old_comment"; break;
+    case PKT_ATTRIBUTE     : s = "attribute"; break;
+    case PKT_ENCRYPTED_MDC : s = "encrypted_mdc"; break;
+    case PKT_MDC              : s = "mdc"; break;
+    case PKT_COMMENT       : s = "comment"; break;
+    case PKT_GPG_CONTROL   : s = "gpg_control"; break;
+    default: s = "unknown"; break;
+    }
+  return s;
+}
+
+
+/*
+ * Create a new filename and a return a pointer to a statically
+ * allocated buffer 
+ */
+static char *
+create_filename (int pkttype)
+{
+  static unsigned int partno = 0;
+  static char *name;
+  
+  if (!name) 
+    name = xmalloc (strlen (opt_prefix) + 100 );
+  
+  assert (pkttype < 1000 && pkttype >= 0 );
+  partno++;
+  sprintf (name, "%s%06u-%03d" EXTSEP_S "%.40s",
+           opt_prefix, partno, pkttype, pkttype_to_string (pkttype));
+  return name;
+}
+
+static int
+read_u16 (FILE *fp, size_t *rn)
+{
+  int c;
+
+  if ( (c = getc (fp)) == EOF )
+    return -1;
+  *rn = c << 8;
+  if ( (c = getc (fp)) == EOF )
+    return -1;
+  *rn |= c;
+  return 0;
+}
+
+static int
+read_u32 (FILE *fp, unsigned long *rn)
+{
+  size_t tmp;
+  
+  if (read_u16 (fp, &tmp))
+    return -1;
+  *rn = tmp << 16;
+  if (read_u16 (fp, &tmp))
+    return -1;
+  *rn |= tmp;
+  return 0;
+}
+
+static int
+write_old_header (FILE *fp, int pkttype, unsigned int len)
+{     
+  int ctb = (0x80 | ((pkttype & 15)<<2));
+  
+  if (len < 256)
+    ;
+  else if (len < 65536)
+    ctb |= 1;
+  else
+    ctb |= 2;
+
+  if ( putc ( ctb, fp) == EOF )
+    return -1;
+
+  if ( (ctb & 2) )
+    {
+      if (putc ((len>>24), fp) == EOF)
+        return -1;
+      if (putc ((len>>16), fp) == EOF)
+        return -1;
+    }
+  if ( (ctb & 3) )
+    {
+      if (putc ((len>>8), fp) == EOF)
+        return -1;
+    }
+  if (putc ((len&0xff), fp) == EOF)
+    return -1;
+  return 0;
+}
+
+static int
+write_new_header (FILE *fp, int pkttype, unsigned int len)
+{     
+  if ( putc ((0xc0 | (pkttype & 0x3f)), fp) == EOF )
+    return -1;
+
+  if (len < 192)
+    {
+      if (putc (len, fp) == EOF)
+        return -1;
+    }
+  else if (len < 8384)
+    {
+      len -= 192;
+      if (putc ((len/256)+192, fp) == EOF)
+        return -1;
+      if (putc ((len%256), fp) == EOF)
+        return -1;
+    }
+  else
+    {
+      if (putc ( 0xff, fp) == EOF)
+        return -1;
+      if (putc ( (len >> 24), fp) == EOF)
+        return -1;
+      if (putc ( (len >> 16), fp) == EOF)
+        return -1;
+      if (putc ( (len >> 8), fp) == EOF)
+        return -1;
+      if (putc ( (len & 0xff), fp) == EOF)
+        return -1;
+    }
+  return 0;
+}
+
+/* Return the length of the public key given BUF of BUFLEN with a
+   secret key. */
+static int
+public_key_length (const unsigned char *buf, size_t buflen)
+{
+  const unsigned char *s;
+  int nmpis;
+
+  /*   byte version number (3 or 4)
+       u32  creation time 
+       [u16  valid days (version 3 only)]
+       byte algorithm 
+       n    MPIs (n and e) */
+  if (!buflen)
+    return 0;
+  if (buf[0] < 2 || buf[0] > 4)
+    return 0; /* wrong version number */
+  if (buflen < (buf[0] == 4? 6:8))
+    return 0;
+  s = buf + (buf[0] == 4? 6:8);
+  buflen -= (buf[0] == 4? 6:8);
+  switch (s[-1])
+    {
+    case 1:
+    case 2:
+    case 3:
+      nmpis = 2;
+      break;
+    case 16:
+    case 20:
+      nmpis = 3;
+      break;
+    case 17:
+      nmpis = 4;
+      break;
+    default:
+      return 0;
+    }
+
+  for (; nmpis; nmpis--)
+    {
+      unsigned int nbits, nbytes;
+
+      if (buflen < 2)
+        return 0;
+      nbits = (s[0] << 8) | s[1];
+      s += 2; buflen -= 2;
+      nbytes = (nbits+7) / 8;
+      if (buflen < nbytes)
+        return 0;
+      s += nbytes; buflen -= nbytes;
+    }
+
+  return s - buf;
+}
+
+static int
+handle_zlib(int algo,FILE *fpin,FILE *fpout)
+{
+  z_stream zs;
+  byte *inbuf, *outbuf;
+  unsigned int inbufsize, outbufsize;
+  int c,zinit_done, zrc, nread, count;
+  size_t n;
+              
+  memset (&zs, 0, sizeof zs);
+  inbufsize = 2048;
+  inbuf = xmalloc (inbufsize);
+  outbufsize = 8192;
+  outbuf = xmalloc (outbufsize);
+  zs.avail_in = 0;
+  zinit_done = 0;
+              
+  do
+    {
+      if (zs.avail_in < inbufsize)
+       {
+         n = zs.avail_in;
+         if (!n)
+           zs.next_in = (Bytef *) inbuf;
+         count = inbufsize - n;
+         for (nread=0;
+              nread < count && (c=getc (fpin)) != EOF;
+              nread++) 
+           inbuf[n+nread] = c;
+                      
+         n += nread;
+         if (nread < count && algo == 1) 
+           {
+             inbuf[n] = 0xFF; /* chew dummy byte */
+             n++;
+           }
+         zs.avail_in = n;
+       }
+      zs.next_out = (Bytef *) outbuf;
+      zs.avail_out = outbufsize;
+                    
+      if (!zinit_done) 
+       {
+         zrc = (algo == 1? inflateInit2 ( &zs, -13)
+                : inflateInit ( &zs ));
+         if (zrc != Z_OK) 
+           {
+             log_fatal ("zlib problem: %s\n", zs.msg? zs.msg :
+                        zrc == Z_MEM_ERROR ? "out of core" :
+                        zrc == Z_VERSION_ERROR ?
+                        "invalid lib version" :
+                        "unknown error" );
+           }
+         zinit_done = 1;
+       }
+      else
+       {
+#ifdef Z_SYNC_FLUSH
+         zrc = inflate (&zs, Z_SYNC_FLUSH);
+#else
+         zrc = inflate (&zs, Z_PARTIAL_FLUSH);
+#endif
+         if (zrc == Z_STREAM_END)
+           ; /* eof */
+         else if (zrc != Z_OK && zrc != Z_BUF_ERROR)
+           {
+             if (zs.msg)
+               log_fatal ("zlib inflate problem: %s\n", zs.msg );
+             else
+               log_fatal ("zlib inflate problem: rc=%d\n", zrc );
+           }
+         for (n=0; n < outbufsize - zs.avail_out; n++) 
+           {
+             if (putc (outbuf[n], fpout) == EOF )
+               return 1;
+           }
+       }
+    } 
+  while (zrc != Z_STREAM_END && zrc != Z_BUF_ERROR);
+  inflateEnd (&zs);
+
+  return 0;
+}
+
+#ifdef HAVE_BZIP2
+static int
+handle_bzip2(int algo,FILE *fpin,FILE *fpout)
+{
+  bz_stream bzs;
+  byte *inbuf, *outbuf;
+  unsigned int inbufsize, outbufsize;
+  int c,zinit_done, zrc, nread, count;
+  size_t n;
+              
+  memset (&bzs, 0, sizeof bzs);
+  inbufsize = 2048;
+  inbuf = xmalloc (inbufsize);
+  outbufsize = 8192;
+  outbuf = xmalloc (outbufsize);
+  bzs.avail_in = 0;
+  zinit_done = 0;
+              
+  do
+    {
+      if (bzs.avail_in < inbufsize)
+       {
+         n = bzs.avail_in;
+         if (!n)
+           bzs.next_in = inbuf;
+         count = inbufsize - n;
+         for (nread=0;
+              nread < count && (c=getc (fpin)) != EOF;
+              nread++) 
+           inbuf[n+nread] = c;
+                      
+         n += nread;
+         if (nread < count && algo == 1) 
+           {
+             inbuf[n] = 0xFF; /* chew dummy byte */
+             n++;
+           }
+         bzs.avail_in = n;
+       }
+      bzs.next_out = outbuf;
+      bzs.avail_out = outbufsize;
+                    
+      if (!zinit_done) 
+       {
+         zrc = BZ2_bzDecompressInit(&bzs,0,0);
+         if (zrc != BZ_OK) 
+           log_fatal ("bz2lib problem: %d\n",zrc);
+         zinit_done = 1;
+       }
+      else
+       {
+         zrc = BZ2_bzDecompress(&bzs);
+         if (zrc == BZ_STREAM_END)
+           ; /* eof */
+         else if (zrc != BZ_OK && zrc != BZ_PARAM_ERROR)
+           log_fatal ("bz2lib inflate problem: %d\n", zrc );
+         for (n=0; n < outbufsize - bzs.avail_out; n++) 
+           {
+             if (putc (outbuf[n], fpout) == EOF )
+               return 1;
+           }
+       }
+    } 
+  while (zrc != BZ_STREAM_END && zrc != BZ_PARAM_ERROR);
+  BZ2_bzDecompressEnd(&bzs);
+
+  return 0;
+}
+#endif /* HAVE_BZIP2 */
+
+/* hdr must point to a buffer large enough to hold all header bytes */
+static int
+write_part ( const char *fname, FILE *fpin, unsigned long pktlen,
+             int pkttype, int partial, unsigned char *hdr, size_t hdrlen)
+{
+  FILE *fpout;
+  int c, first;
+  unsigned char *p;
+  const char *outname = create_filename (pkttype);
+  
+#if defined(__riscos__) && defined(USE_ZLIBRISCOS)
+  static int initialized = 0;
+
+  if (!initialized)
+      initialized = riscos_load_module("ZLib", zlib_path, 1);
+#endif
+  if (opt_no_split)
+    fpout = stdout;
+  else
+    {
+      if (opt_verbose)
+        log_info ("writing `%s'\n", outname);
+      fpout = fopen (outname, "wb");
+      if (!fpout) 
+        {
+          log_error ("error creating `%s': %s\n", outname, strerror(errno));
+          /* stop right now, otherwise we would mess up the sequence
+             of the part numbers */
+          g10_exit (1);
+        }
+    }
+
+  if (opt_secret_to_public
+      && (pkttype == PKT_SECRET_KEY || pkttype == PKT_SECRET_SUBKEY))
+    {
+      unsigned char *blob = xmalloc (pktlen);
+      int i, len;
+
+      pkttype = pkttype == PKT_SECRET_KEY? PKT_PUBLIC_KEY:PKT_PUBLIC_SUBKEY;
+
+      for (i=0; i < pktlen; i++) 
+        {
+          c = getc (fpin);
+          if (c == EOF) 
+            goto read_error;
+          blob[i] = c;
+        }
+      len = public_key_length (blob, pktlen);
+      if (!len)
+        {
+          log_error ("error calcualting public key length\n");
+          g10_exit (1);
+        }
+      if ( (hdr[0] & 0x40) )
+        { 
+          if (write_new_header (fpout, pkttype, len))
+            goto write_error;
+        }
+      else
+        { 
+          if (write_old_header (fpout, pkttype, len))
+            goto write_error;
+        }
+
+      for (i=0; i < len; i++) 
+        {
+          if ( putc (blob[i], fpout) == EOF )
+            goto write_error;
+        }
+
+      goto ready;
+    }
+
+
+  if (!opt_uncompress)
+    {
+      for (p=hdr; hdrlen; p++, hdrlen--)
+        {
+          if ( putc (*p, fpout) == EOF )
+            goto write_error;
+        }
+    }
+  
+  first = 1;
+  while (partial)
+    {
+      size_t partlen;
+      
+      if (partial == 1)
+        { /* openpgp */
+          if (first )
+            {
+              c = pktlen;
+              assert( c >= 224 && c < 255 );
+              first = 0;
+            }
+          else if ((c = getc (fpin)) == EOF ) 
+            goto read_error;
+          else
+            hdr[hdrlen++] = c;
+            
+          if (c < 192)
+            {
+              pktlen = c;
+              partial = 0; /* (last segment may follow) */
+            }
+          else if (c < 224 )
+            {
+              pktlen = (c - 192) * 256;
+              if ((c = getc (fpin)) == EOF) 
+                goto read_error;
+              hdr[hdrlen++] = c;
+              pktlen += c + 192;
+              partial = 0;
+            }
+          else if (c == 255)
+            {
+              if (read_u32 (fpin, &pktlen))
+                goto read_error;
+              hdr[hdrlen++] = pktlen >> 24;
+              hdr[hdrlen++] = pktlen >> 16;
+              hdr[hdrlen++] = pktlen >> 8;
+              hdr[hdrlen++] = pktlen;
+              partial = 0;
+            }
+          else
+            { /* next partial body length */
+              for (p=hdr; hdrlen; p++, hdrlen--)
+                {
+                  if ( putc (*p, fpout) == EOF )
+                    goto write_error;
+                }
+              partlen = 1 << (c & 0x1f);
+              for (; partlen; partlen--) 
+                {
+                  if ((c = getc (fpin)) == EOF) 
+                    goto read_error;
+                  if ( putc (c, fpout) == EOF )
+                    goto write_error;
+                }
+            }
+        }
+      else if (partial == 2)
+        { /* old gnupg */
+          assert (!pktlen);
+          if ( read_u16 (fpin, &partlen) )
+            goto read_error;
+          hdr[hdrlen++] = partlen >> 8;
+          hdr[hdrlen++] = partlen;
+          for (p=hdr; hdrlen; p++, hdrlen--) 
+            {
+              if ( putc (*p, fpout) == EOF )
+                goto write_error;
+            }
+          if (!partlen)
+            partial = 0; /* end of packet */
+          for (; partlen; partlen--) 
+            {
+              c = getc (fpin);
+              if (c == EOF) 
+                goto read_error;
+              if ( putc (c, fpout) == EOF )
+                goto write_error;
+            }
+        }
+      else
+        { /* compressed: read to end */
+          pktlen = 0;
+          partial = 0;
+          hdrlen = 0;
+          if (opt_uncompress) 
+            {
+              if ((c = getc (fpin)) == EOF)
+                goto read_error;
+
+             if(c==1 || c==2)
+               {
+                 if(handle_zlib(c,fpin,fpout))
+                   goto write_error;
+               }
+#ifdef HAVE_BZIP2
+             else if(c==3)
+               {
+                 if(handle_bzip2(c,fpin,fpout))
+                   goto write_error;
+               }
+#endif /* HAVE_BZIP2 */
+             else
+               {
+                 log_error("invalid compression algorithm (%d)\n",c);
+                 goto read_error;
+               }
+            }
+          else
+            {
+              while ( (c=getc (fpin)) != EOF ) 
+                {
+                  if ( putc (c, fpout) == EOF )
+                    goto write_error;
+                }
+            }
+          if (!feof (fpin))
+            goto read_error;
+       }
+    }
+
+  for (p=hdr; hdrlen; p++, hdrlen--) 
+    {
+      if ( putc (*p, fpout) == EOF )
+        goto write_error;
+    }
+  
+  /* standard packet or last segment of partial length encoded packet */
+  for (; pktlen; pktlen--) 
+    {
+      c = getc (fpin);
+      if (c == EOF) 
+        goto read_error;
+      if ( putc (c, fpout) == EOF )
+        goto write_error;
+    }
+  
+ ready:
+  if ( !opt_no_split && fclose (fpout) )
+    log_error ("error closing `%s': %s\n", outname, strerror (errno));
+  return 0;
+  
+ write_error:    
+  log_error ("error writing `%s': %s\n", outname, strerror (errno));
+  if (!opt_no_split)
+    fclose (fpout);
+  return 2;
+  
+ read_error:
+  if (!opt_no_split)
+    {
+      int save = errno;
+      fclose (fpout);
+      errno = save;
+    }
+  return -1;
+}
+
+
+
+static int
+do_split (const char *fname, FILE *fp)
+{
+  int c, ctb, pkttype;
+  unsigned long pktlen = 0;
+  int partial = 0;
+  unsigned char header[20];
+  int header_idx = 0;
+  
+  ctb = getc (fp);
+  if (ctb == EOF)
+    return 3; /* ready */
+  header[header_idx++] = ctb;
+  
+  if (!(ctb & 0x80))
+    {
+      log_error("invalid CTB %02x\n", ctb );
+      return 1;
+    }
+  if ( (ctb & 0x40) )
+    { /* new CTB */
+      pkttype =  (ctb & 0x3f);
+      if( (c = getc (fp)) == EOF )
+        return -1;
+      header[header_idx++] = c;
+
+      if ( c < 192 )
+        pktlen = c;
+      else if ( c < 224 )
+        {
+          pktlen = (c - 192) * 256;
+          if( (c = getc (fp)) == EOF ) 
+            return -1;
+          header[header_idx++] = c;
+          pktlen += c + 192;
+       }
+      else if ( c == 255 ) 
+        {
+          if (read_u32 (fp, &pktlen))
+            return -1;
+          header[header_idx++] = pktlen >> 24;
+          header[header_idx++] = pktlen >> 16;
+          header[header_idx++] = pktlen >> 8;
+          header[header_idx++] = pktlen; 
+       }
+      else
+        { /* partial body length */
+          pktlen = c;
+          partial = 1;
+       }
+    }
+  else
+    {
+      int lenbytes;
+      
+      pkttype = (ctb>>2)&0xf;
+      lenbytes = ((ctb&3)==3)? 0 : (1<<(ctb & 3));
+      if (!lenbytes )
+        {
+          pktlen = 0; /* don't know the value */
+          if( pkttype == PKT_COMPRESSED )
+            partial = 3;
+          else
+            partial = 2; /* the old GnuPG partial length encoding */
+       }
+      else
+        {
+          for ( ; lenbytes; lenbytes-- ) 
+            {
+              pktlen <<= 8;
+              if( (c = getc (fp)) == EOF ) 
+                return -1;
+              header[header_idx++] = c;
+              
+              pktlen |= c;
+           }
+       }
+    }
+
+  return write_part (fname, fp, pktlen, pkttype, partial,
+                     header, header_idx);
+}
+
+
+static void
+split_packets (const char *fname)
+{
+  FILE *fp;
+  int rc;
+  
+  if (!fname || !strcmp (fname, "-"))
+    {
+      fp = stdin;
+      fname = "-";
+    }
+  else if ( !(fp = fopen (fname,"rb")) ) 
+    {
+      log_error ("can't open `%s': %s\n", fname, strerror (errno));
+      return;
+    }
+  
+  while ( !(rc = do_split (fname, fp)) )
+    ;
+  if ( rc > 0 )
+    ; /* error already handled */
+  else if ( ferror (fp) )
+    log_error ("error reading `%s': %s\n", fname, strerror (errno));
+  else
+    log_error ("premature EOF while reading `%s'\n", fname );
+  
+  if ( fp != stdin )
+    fclose (fp);
+}
diff --git a/tools/lspgpot b/tools/lspgpot
new file mode 100755 (executable)
index 0000000..f406392
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+# lspgpot - script to extract the ownertrust values
+# from PGP keyrings and list them in GnuPG ownertrust format.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+if ! gpg --version > /dev/null 2>&1 ; then
+   echo "GnuPG not available!"
+   exit 1
+fi
+
+gpg --dry-run --with-fingerprint --with-colons $* | awk '
+BEGIN { FS=":"
+       printf "# Ownertrust listing generated by lspgpot\n"
+       printf "# This can be imported using the command:\n"
+       printf "#    gpg --import-ownertrust\n\n"  }
+$1 == "fpr" { fpr = $10 }
+$1 == "rtv" && $2 == 1 && $3 == 2 { printf "%s:3:\n", fpr; next }
+$1 == "rtv" && $2 == 1 && $3 == 5 { printf "%s:4:\n", fpr; next }
+$1 == "rtv" && $2 == 1 && $3 == 6 { printf "%s:5:\n", fpr; next }
+'
diff --git a/tools/mail-signed-keys b/tools/mail-signed-keys
new file mode 100755 (executable)
index 0000000..80fbb34
--- /dev/null
@@ -0,0 +1,114 @@
+#!/bin/sh
+# Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# FIXME: Add --dry-run,  use only valid email addreses, extract only given keys
+
+dryrun=0
+if [ "$1" = "--dry-run" ]; then
+   dryrun=1
+   shift
+fi
+
+if [ -z "$1" -o -z "$2" -o -z "$3" ]; then
+   echo "usage: mail-signed-keys keyring signedby signame" >&2
+   exit 1
+fi
+
+signame="$3"
+
+if [ ! -f $1 ]; then
+    echo "mail-signed-keys: '$1': no such file" >&2
+    exit 1
+fi
+
+[ -f '.#tdb.tmp' ] && rm '.#tdb.tmp'
+ro="--homedir . --no-options --trustdb-name=./.#tdb.tmp --dry-run --lock-never --no-default-keyring --keyring $1"
+
+signedby=`gpg $ro --list-keys --with-colons $2 \
+         2>/dev/null | awk -F: '$1=="pub" {print $5; exit 0}'`
+
+if [ -z "$signedby" ]; then
+    echo "mail-signed-keys: '$2': no such signator" >&2
+    exit 1
+fi
+
+if [ "$dryrun" = "0" ]; then
+  echo "About to send the the keys signed by $signedby" >&2
+  echo -n "to their owners.  Do you really want to do this? (y/N)" >&2
+  read
+  [ "$REPLY" != "y" -a "$REPLY" != "Y" ] && exit 0
+fi
+
+gpg $ro --check-sigs --with-colons 2>/dev/null \
+     | awk -F: -v signedby="$signedby" -v gpgopt="$ro" \
+       -v dryrun="$dryrun" -v signame="$signame"  '
+BEGIN        { sendmail="/usr/lib/sendmail -oi -t " }
+$1 == "pub"   { nextkid=$5; nextuid=$10
+               if( uidcount > 0 ) { myflush() }
+               kid=nextkid; uid=nextuid; next
+             }
+$1 == "uid"   { uid=$10 ; next }
+$1 == "sig" && $2 == "!" && $5 == signedby  { uids[uidcount++] = uid; next }
+END          {  if( uidcount > 0 ) { myflush() } }
+
+function myflush()
+{
+       if ( kid == signedby ) { uidcount=0; return }
+       print "sending key " substr(kid,9) " to" | "cat >&2"
+       for(i=0; i < 1; i++ ) {  
+          print "    " uids[i] | "cat >&2"
+           if( dryrun == 0 ) {
+             if( i == 0 ) {
+                printf "To: %s", uids[i]   | sendmail
+             }
+             else {
+                printf ",\n    %s", uids[i]   | sendmail
+             }
+           }
+       }
+       if(dryrun == 0) {  
+         printf "\n"                                        | sendmail
+         print "Subject: I signed your key " substr(kid,9)  | sendmail
+         print ""                                           | sendmail
+         print "Hi,"                                        | sendmail
+         print ""                                           | sendmail
+         print "Here you get back the signed key."          | sendmail
+        print "Please send it yourself to a keyserver."    | sendmail
+         print ""                                           | sendmail
+         print "Peace,"                                     | sendmail
+         print "      " signame                             | sendmail
+         print ""                                           | sendmail
+         cmd = "gpg " gpgopt " --export -a " kid " 2>/dev/null"
+         while( (cmd | getline) > 0 ) {
+             print | sendmail
+         }
+         print ""                                           | sendmail
+         close(cmd)
+         close( sendmail )
+       }
+       uidcount=0
+}
+'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/make-dns-cert.c b/tools/make-dns-cert.c
new file mode 100644 (file)
index 0000000..496b63b
--- /dev/null
@@ -0,0 +1,239 @@
+/* make-dns-cert.c - An OpenPGP-to-DNS CERT conversion tool
+ * Copyright (C) 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <unistd.h>
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+/* We use TYPE37 instead of CERT since not all nameservers can handle
+   CERT yet... */
+
+static int
+cert_key(const char *name,const char *keyfile)
+{
+  int fd,ret=1,err,i;
+  struct stat statbuf;
+
+  fd=open(keyfile,O_RDONLY);
+  if(fd==-1)
+    {
+      fprintf(stderr,"Cannot open key file %s: %s\n",keyfile,strerror(errno));
+      return 1;
+    }
+
+  err=fstat(fd,&statbuf);
+  if(err==-1)
+    {
+      fprintf(stderr,"Unable to stat key file %s: %s\n",
+             keyfile,strerror(errno));
+      goto fail;
+    }
+
+  if(statbuf.st_size>65536)
+    {
+      fprintf(stderr,"Key %s too large for CERT encoding\n",keyfile);
+      goto fail;
+    }
+
+  if(statbuf.st_size>16384)
+    fprintf(stderr,"Warning: key file %s is larger than the default"
+           " GnuPG max-cert-size\n",keyfile);
+
+  printf("%s\tTYPE37\t\\# %u 0003 0000 00 ",
+        name,(unsigned int)statbuf.st_size+5);
+
+  err=1;
+  while(err!=0)
+    {
+      unsigned char buffer[1024];
+
+      err=read(fd,buffer,1024);
+      if(err==-1)
+       {
+         fprintf(stderr,"Unable to read key file %s: %s\n",
+                 keyfile,strerror(errno));
+         goto fail;
+       }
+
+      for(i=0;i<err;i++)
+       printf("%02X",buffer[i]);
+    }
+
+  printf("\n");
+
+  ret=0;
+
+ fail:
+  close(fd);
+
+  return ret;
+}
+
+static int
+url_key(const char *name,const char *fpr,const char *url)
+{
+  int len=6,fprlen=0;
+
+  if(fpr)
+    {
+      const char *tmp = fpr;
+      while (*tmp)
+       {
+         if ((*tmp >= 'A' && *tmp <= 'F') ||
+             (*tmp >= 'a' && *tmp <= 'f') ||
+             (*tmp >= '0' && *tmp <= '9'))
+           {
+             fprlen++;
+           }
+         else if (*tmp != ' ' && *tmp != '\t')
+           {
+             fprintf(stderr,"Fingerprint must consist of only hex digits"
+                     " and whitespace\n");
+             return 1;
+           }
+
+         tmp++;
+       }
+
+      if(fprlen%2)
+       {
+         fprintf(stderr,"Fingerprint must be an even number of characters\n");
+         return 1;
+       }
+
+      fprlen/=2;
+      len+=fprlen;
+    }
+
+  if(url)
+    len+=strlen(url);
+
+  if(!fpr && !url)
+    {
+      fprintf(stderr,
+             "Cannot generate a CERT without either a fingerprint or URL\n");
+      return 1;
+    }
+
+  printf("%s\tTYPE37\t\\# %d 0006 0000 00 %02X",name,len,fprlen);
+
+  if(fpr)
+    printf(" %s",fpr);
+
+  if(url)
+    {
+      const char *c;
+      printf(" ");
+      for(c=url;*c;c++)
+       printf("%02X",*c);
+    }
+
+  printf("\n");
+
+  return 0;
+}
+
+static void
+usage(FILE *stream)
+{
+  fprintf(stream,"make-dns-cert\n");
+  fprintf(stream,"\t-f\tfingerprint\n");
+  fprintf(stream,"\t-u\tURL\n");
+  fprintf(stream,"\t-k\tkey file\n");
+  fprintf(stream,"\t-n\tDNS name\n");
+}
+
+int
+main(int argc,char *argv[])
+{
+  int arg,err=1;
+  char *fpr=NULL,*url=NULL,*keyfile=NULL,*name=NULL;
+
+  if(argc==1)
+    {
+      usage(stderr);
+      return 1;
+    }
+  else if(argc>1 && strcmp(argv[1],"--version")==0)
+    {
+      printf("make-dns-cert (GnuPG) " VERSION "\n");
+      return 0;
+    }
+  else if(argc>1 && strcmp(argv[1],"--help")==0)
+    {
+      usage(stdout);
+      return 0;
+    }
+
+  while((arg=getopt(argc,argv,"hf:u:k:n:"))!=-1)
+    switch(arg)
+      {
+      default:
+      case 'h':
+       usage(stdout);
+       exit(0);
+
+      case 'f':
+       fpr=optarg;
+       break;
+
+      case 'u':
+       url=optarg;
+       break;
+
+      case 'k':
+       keyfile=optarg;
+       break;
+
+      case 'n':
+       name=optarg;
+       break;
+      }
+
+  if(!name)
+    {
+      fprintf(stderr,"No name provided\n");
+      return 1;
+    }
+
+  if(keyfile && (fpr || url))
+    {
+      fprintf(stderr,"Cannot generate a CERT record with both a keyfile and"
+             " a fingerprint or URL\n");
+      return 1;
+    }
+
+  if(keyfile)
+    err=cert_key(name,keyfile);
+  else
+    err=url_key(name,fpr,url);
+
+  return err;
+}
diff --git a/tools/mk-tdata.c b/tools/mk-tdata.c
new file mode 100644 (file)
index 0000000..833875d
--- /dev/null
@@ -0,0 +1,67 @@
+/* mk-tdata.c -  Create some simple random testdata
+ * Copyright (C) 1998, 1999, 2000, 2001, 2006 Free Software Foundation, Inc.
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+#ifndef RAND_MAX   /* for SunOS */
+#define RAND_MAX 32767
+#endif
+
+int
+main(int argc, char **argv)
+{
+  int i, c = 0;
+  int limit =0;
+  int char_mode = 0;
+
+  if (argc)
+    {
+      argc--;
+      argv++;
+    }
+
+  /* Check for option --char N */
+  if (argc > 1 && !strcmp (argv[0], "--char"))
+    {
+      char_mode = 1;
+      c = strtol (argv[1], NULL, 0);
+      argc -= 2;
+      argv += 2;
+    }
+      
+  limit = argc ? atoi(argv[0]) : 0;
+
+  srand(getpid());
+
+  for (i=0; !limit || i < limit; i++ ) 
+    {
+      if (char_mode)
+        {
+          putchar (c);
+        }
+      else
+        {
+#ifdef HAVE_RAND
+          c = ((unsigned)(1 + (int) (256.0*rand()/(RAND_MAX+1.0)))-1);
+#else
+          c = ((unsigned)(1 + (int) (256.0*random()/(RAND_MAX+1.0)))-1);
+#endif
+          putchar (c);
+        }
+    }
+  return 0;
+}
diff --git a/tools/mpicalc.c b/tools/mpicalc.c
new file mode 100644 (file)
index 0000000..915dcc3
--- /dev/null
@@ -0,0 +1,385 @@
+/* mpitest.c - test the mpi functions
+ *     Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ *
+ * This is an RPN calculator; values must be given in hex.
+ * Operation is like dc(1) except that the input/output radix is
+ * always 16 and you can use a '-' to prefix a negative number.
+ * Addition operators: ++ and --. All operators must be delimited by a blank
+ *
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "util.h"
+#include "mpi.h"
+#include "i18n.h"
+
+#define STACKSIZE  100
+static MPI stack[STACKSIZE];
+static int stackidx;
+
+
+const char *
+strusage( int level )
+{
+    const char *p;
+    switch( level ) {
+      case 10:
+      case 0:  p = "mpicalc - v" VERSION "; "
+                   "Copyright 1997 Werner Koch (dd9jn)" ; break;
+      case 13: p = "mpicalc"; break;
+      case 14: p = VERSION; break;
+      case 1:
+      case 11: p = "Usage: mpicalc (-h for help)";
+               break;
+      case 2:
+      case 12: p =
+    "\nSyntax: mpicalc [options] [files]\n"
+    "MPI RPN calculator\n";
+       break;
+      default: p = default_strusage(level);
+    }
+    return p;
+}
+
+
+static void
+i18n_init(void)
+{
+#ifdef ENABLE_NLS
+  setlocale( LC_ALL, "" );
+  bindtextdomain( PACKAGE, G10_LOCALEDIR );
+  textdomain( PACKAGE );
+#endif
+}
+
+
+static void
+do_add(void)
+{
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n",stderr);
+       return;
+    }
+    mpi_add( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] );
+    stackidx--;
+}
+
+static void
+do_sub(void)
+{
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_sub( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] );
+    stackidx--;
+}
+
+static void
+do_inc(void)
+{
+    if( stackidx < 1 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_add_ui( stack[stackidx-1], stack[stackidx-1], 1 );
+}
+
+static void
+do_dec(void)
+{
+    if( stackidx < 1 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+ /* mpi_sub_ui( stack[stackidx-1], stack[stackidx-1], 1 ); */
+}
+
+static void
+do_mul(void)
+{
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_mul( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] );
+    stackidx--;
+}
+
+static void
+do_mulm(void)
+{
+    if( stackidx < 3 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_mulm( stack[stackidx-3], stack[stackidx-3],
+                                stack[stackidx-2], stack[stackidx-1] );
+    stackidx -= 2;
+}
+
+static void
+do_div(void)
+{
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_fdiv_q( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] );
+    stackidx--;
+}
+
+static void
+do_rem(void)
+{
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_fdiv_r( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] );
+    stackidx--;
+}
+
+static void
+do_powm(void)
+{
+    MPI a;
+    if( stackidx < 3 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    a= mpi_alloc(10);
+    mpi_powm( a, stack[stackidx-3], stack[stackidx-2], stack[stackidx-1] );
+    mpi_free(stack[stackidx-3]);
+    stack[stackidx-3] = a;
+    stackidx -= 2;
+}
+
+static void
+do_inv(void)
+{
+    MPI a = mpi_alloc(40);
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_invm( a, stack[stackidx-2], stack[stackidx-1] );
+    mpi_set(stack[stackidx-2],a);
+    mpi_free(a);
+    stackidx--;
+}
+
+static void
+do_gcd(void)
+{
+    MPI a = mpi_alloc(40);
+    if( stackidx < 2 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_gcd( a, stack[stackidx-2], stack[stackidx-1] );
+    mpi_set(stack[stackidx-2],a);
+    mpi_free(a);
+    stackidx--;
+}
+
+static void
+do_rshift(void)
+{
+    if( stackidx < 1 ) {
+       fputs("stack underflow\n", stderr);
+       return;
+    }
+    mpi_rshift( stack[stackidx-1],stack[stackidx-1], 1 );
+}
+
+
+int
+main(int argc, char **argv)
+{
+    static ARGPARSE_OPTS opts[] = {
+    {0} };
+    ARGPARSE_ARGS pargs;
+    int i, c;
+    int state = 0;
+    char strbuf[1000];
+    int stridx=0;
+
+    pargs.argc = &argc;
+    pargs.argv = &argv;
+    pargs.flags = 0;
+
+    i18n_init();
+    while( arg_parse( &pargs, opts) ) {
+       switch( pargs.r_opt ) {
+         default : pargs.err = 2; break;
+       }
+    }
+    if( argc )
+       usage(1);
+
+
+    for(i=0; i < STACKSIZE; i++ )
+       stack[i] = NULL;
+    stackidx =0;
+
+    while( (c=getc(stdin)) != EOF ) {
+       if( !state ) {  /* waiting */
+           if( isdigit(c) ) {
+               state = 1;
+               ungetc(c, stdin);
+               strbuf[0] = '0';
+               strbuf[1] = 'x';
+               stridx=2;
+           }
+           else if( isspace(c) )
+               ;
+           else {
+               switch(c) {
+                 case '+':
+                   if( (c=getc(stdin)) == '+' )
+                       do_inc();
+                   else {
+                       ungetc(c, stdin);
+                       do_add();
+                   }
+                   break;
+                 case '-':
+                   if( (c=getc(stdin)) == '-' )
+                       do_dec();
+                   else if( isdigit(c) || (c >='A' && c <= 'F') ) {
+                       state = 1;
+                       ungetc(c, stdin);
+                       strbuf[0] = '-';
+                       strbuf[1] = '0';
+                       strbuf[2] = 'x';
+                       stridx=3;
+                   }
+                   else {
+                       ungetc(c, stdin);
+                       do_sub();
+                   }
+                   break;
+                 case '*':
+                   do_mul();
+                   break;
+                 case 'm':
+                   do_mulm();
+                   break;
+                 case '/':
+                   do_div();
+                   break;
+                 case '%':
+                   do_rem();
+                   break;
+                 case '^':
+                   do_powm();
+                   break;
+                 case 'I':
+                   do_inv();
+                   break;
+                 case 'G':
+                   do_gcd();
+                   break;
+                 case '>':
+                   do_rshift();
+                   break;
+                 case 'i': /* dummy */
+                   if( !stackidx )
+                       fputs("stack underflow\n", stderr);
+                   else {
+                       mpi_free(stack[stackidx-1]);
+                       stackidx--;
+                   }
+                   break;
+                 case 'd': /* duplicate the tos */
+                   if( !stackidx )
+                       fputs("stack underflow\n", stderr);
+                   else if( stackidx < STACKSIZE ) {
+                       mpi_free(stack[stackidx]);
+                       stack[stackidx] = mpi_copy( stack[stackidx-1] );
+                       stackidx++;
+                   }
+                   else
+                       fputs("stack overflow\n", stderr);
+                   break;
+                 case 'c':
+                   for(i=0; i < stackidx; i++ )
+                       mpi_free(stack[i]), stack[i] = NULL;
+                   stackidx = 0;
+                   break;
+                 case 'p': /* print the tos */
+                   if( !stackidx )
+                       puts("stack is empty");
+                   else {
+                       mpi_print(stdout, stack[stackidx-1], 1 );
+                       putchar('\n');
+                   }
+                   break;
+                 case 'f': /* print the stack */
+                   for( i = stackidx-1 ; i >= 0; i-- ) {
+                       printf("[%2d]: ", i );
+                       mpi_print(stdout, stack[i], 1 );
+                       putchar('\n');
+                   }
+                   break;
+                 default:
+                   fputs("invalid operator\n", stderr);
+               }
+           }
+       }
+       else if( state == 1 ) { /* in a number */
+           if( !isxdigit(c) ) { /* store the number */
+               state = 0;
+               ungetc(c, stdin);
+               if( stridx < 1000 )
+                   strbuf[stridx] = 0;
+
+               if( stackidx < STACKSIZE ) {
+                   if( !stack[stackidx] )
+                       stack[stackidx] = mpi_alloc(10);
+                   if( mpi_fromstr(stack[stackidx], strbuf) )
+                       fputs("invalid number\n", stderr);
+                   else
+                       stackidx++;
+               }
+               else
+                   fputs("stack overflow\n", stderr);
+           }
+           else { /* store digit */
+               if( stridx < 999 )
+                   strbuf[stridx++] = c;
+               else if( stridx == 999 ) {
+                   strbuf[stridx] = 0;
+                   fputs("string too large - truncated\n", stderr);
+                   stridx++;
+               }
+           }
+       }
+
+    }
+    for(i=0; i < stackidx; i++ )
+       mpi_free(stack[i]);
+    return 0;
+}
diff --git a/tools/ring-a-party b/tools/ring-a-party
new file mode 100755 (executable)
index 0000000..01e0f3f
--- /dev/null
@@ -0,0 +1,114 @@
+#!/bin/sh
+# ring-a-party - print a keyring suitable for a key signing party
+# Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+#
+# This file is free software; as a special exception the author gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+if [ $# -lt 1 ]; then
+    echo "usage: ring-a-party keyring [headerline]" >&2
+    exit 1
+fi
+
+keyring="$1"
+hdrline="$1"
+if [ $# -gt 1 ]; then
+    hdrline="$2"
+fi
+
+if [ ! -f $keyring ]; then
+    echo "ring-a-party: '$keyring': no such file" >&2
+    exit 1
+fi
+
+echo "ring-a-party: output will be written to 'a.pub'" >&2
+
+
+gpg --dry-run --with-fingerprint --with-colons $keyring \
+    | gawk -v "KEYRING=$hdrline" '
+BEGIN { FS=":"
+       algos[1] = "RSA";
+       algos[16] = "Elgamal";
+       algos[17] = "DSA";
+       any = 0;
+       lines = -1;
+       page = 0;
+       now = strftime("%b %d %H:%M %Y");
+      }
+END { 
+    if (any) myflush(); 
+}
+$1 == "pub" {
+             if( any ) myflush();
+             uidcount = 0;
+             signencrypt = 0;
+             uids[uidcount++] = $10;
+             nbits = $3;
+             keyid = substr($5,9);
+             created = $6;
+             expires = $7;
+             algostr = mapalgo($4);
+             if( $4 == 20 || $4 == 1 ) signencrypt = 1;
+             any = 1;
+           }
+$1 == "fpr" { fpr = $10 }
+$1 == "uid" { uids[uidcount++] = $10 }
+$1 == "sub" { if( $4 != 17 && $4 != 3 )  signencrypt=1 }
+
+function myflush()
+{
+    # fixme: take lines to print here into account
+    if( lines > 45 || lines == -1 ) {
+       if( lines != -1 ) printf "\f";
+       page++;
+       printf "%s  %-50.50s Page %d\n\n", now, KEYRING, page ;
+       printf "    Type Bits KeyID      Created    Expires    Algorithm                 Use\n\n";
+       lines = 1;
+    }
+    printf "[ ] pub  %04d 0x%s %10s %10s %-10s     %15s\n",
+         nbits, keyid, created, expires == ""? "----------":expires, algostr,
+                       signencrypt == 1? "Sign & Encrypt":"Sign only";
+    length(fpr) == 40 ? printfpr20( fpr ) : printfpr16( fpr );
+    lnes += 2;
+    for( i=0; i < uidcount; i++ ) {
+       printf "( ) uid  %s\n", uids[i];
+       lines++;
+    }
+    printf "\n\n";
+    lines += 2;
+}
+
+function mapalgo( no )
+{
+    if( no in algos )
+       return algos[no];
+    return sprintf( "algoID=%ds", no );
+}
+
+
+function printfpr16( s )
+{
+    printf "    f16    Fingerprint16 =";
+    for(i=0; i < 16; i++ ) {
+       if( i == 8 ) printf " ";
+       printf " %s", substr( s, i*2+1, 2 );
+    }
+    printf "\n"
+}
+
+function printfpr20( s )
+{
+    printf "    f20    Fingerprint20 =";
+    for(i=0; i < 10; i++ ) {
+       if( i == 5 ) printf " ";
+       printf " %s", substr( s, i*4+1, 4 );
+    }
+    printf "\n"
+}
+
+' | tee a.pub | gpg --print-mds
diff --git a/tools/shmtest.c b/tools/shmtest.c
new file mode 100644 (file)
index 0000000..f483405
--- /dev/null
@@ -0,0 +1,201 @@
+/* shmtest.c
+ * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ *
+ * This file is free software; as a special exception the author gives
+ * unlimited permission to copy and/or distribute it, with or without
+ * modifications, as long as this notice is preserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+#include <unistd.h>
+#ifdef HAVE_SYS_IPC_H
+#include <sys/types.h>
+#include <sys/ipc.h>
+#endif
+#ifdef HAVE_SYS_SHM_H
+#include <sys/shm.h>
+#endif
+#include "util.h"
+#include "ttyio.h"
+#include "i18n.h"
+
+#ifdef HAVE_DOSISH_SYSTEM
+int main( int argc, char **argv )
+{
+    fprintf(stderr, "Sorry, not yet available for DOSish systems\n");
+    exit(1);
+}
+#else
+
+static int serverpid = -1;
+
+static void
+my_usage(void)
+{
+    fprintf(stderr, "usage: shmtest gpg-command-line\n");
+    exit(1);
+}
+
+const char *
+strusage( int level )
+{
+    return default_strusage(level);
+}
+
+static void
+i18n_init(void)
+{
+#ifdef ENABLE_NLS
+    setlocale( LC_ALL, "" );
+    bindtextdomain( PACKAGE, G10_LOCALEDIR );
+    textdomain( PACKAGE );
+#endif
+}
+
+
+static void
+do_get_string( int mode, const char *keyword, byte *area, size_t areasize )
+{
+    size_t n, len;
+    char *p=NULL;
+    int yes=0;
+
+    n = area[0] << 8 | area[1];
+    /* fixme: do some sanity checks here */
+    if( mode == 1 )
+       p = tty_get( keyword );
+    else if( mode == 3 )
+       p = tty_get_hidden( keyword );
+    else
+       yes = tty_get_answer_is_yes( keyword );
+    if( p ) {
+       len = strlen(p);
+       memcpy( area+n+2, p, len );
+       area[n] = len >> 8;
+       area[n+1] = len;
+       xfree(p);
+    }
+    else { /* bool */
+       area[n] = 0;
+       area[n+1] = 1;
+       area[n+2] = yes;
+    }
+    area[3] = 1; /* we should better use a semaphore */
+    kill( serverpid, SIGUSR1 );
+}
+
+
+
+int
+main(int argc, char **argv)
+{
+    void  *area = NULL;
+    size_t areasize = 4096;
+    int shm_id = -1;
+    FILE *fp;
+    char buf[200];
+    char *p, *p2;
+    size_t n;
+    int i;
+
+    log_set_name("shmtest");
+    i18n_init();
+#ifndef USE_SHM_COPROCESSING
+    log_info("SHM_COPRPOCESSING is not available\n");
+#else
+    if( argc < 1 )
+       my_usage();
+
+    for(n=0,i=1; i < argc; i++ )
+       n += strlen(argv[i]) + 1;
+    p = xmalloc( 100 + n );
+    strcpy( p, "../g10/gpg --status-fd 1 --run-as-shm-coprocess 0");
+    for(i=1; i < argc; i++ ) {
+       strcat(p, " " );
+       strcat(p, argv[i] );
+    }
+
+    fp = popen( p, "r" );
+    xfree( p );
+    if( !fp )
+       log_error("popen failed: %s\n", strerror(errno));
+
+    while ( fgets (buf, sizeof (buf) - 1, fp ) != NULL ) {
+       size_t len = strlen(buf);
+       if( len >= 9 && !memcmp( buf, "[GNUPG:] ", 9 ) ) {
+           int word=0;
+           int is_info = 0, is_get = 0;
+
+           for( p = strtok(buf+9, " \n"); p ; p = strtok(NULL, " \n")) {
+               word++;
+               if( word==1 && !strcmp(p,"SHM_INFO") ) {
+                   if( !area )
+                       is_info=1;
+                   else
+                       log_error("duplicate SHM_INFO ignored\n" );
+               }
+               else if( is_info && (p2 = strchr(p, '=' )) ) {
+                   int val;
+                   *p2++ = 0;
+                   val = atoi(p2); /* should be atou() for some values */
+                   if( !strcmp(p, "pv" ) ) {
+                       if( atoi(p2) != 1 )
+                           log_fatal("invalid protocol version %d\n", val );
+                       is_info = 2;
+                   }
+                   else if( !strcmp(p, "pid" ) )
+                       serverpid = val;
+                   else if( !strcmp(p, "shmid" ) )
+                       shm_id = val;
+               }
+               else if( word == 1 && !strcmp(p,"SHM_GET") )
+                   is_get = 1;
+               else if( word == 1 && !strcmp(p,"SHM_GET_BOOL") )
+                   is_get = 2;
+               else if( word == 1 && !strcmp(p,"SHM_GET_HIDDEN") )
+                   is_get = 3;
+               else if( word == 2 && is_get )  {
+                   do_get_string( is_get, p, area, areasize );
+                   break;
+               }
+               else if( word == 1 )
+                   log_info("Status: %s\n", p);
+           }
+           if( is_info ) {
+               if( is_info < 2 )
+                   log_fatal("SHM info without protocol version\n");
+               if( serverpid == -1 )
+                   log_fatal("SHM info without server's pid\n");
+               if( shm_id == -1 )
+                   log_fatal("SHM info without id\n");
+               log_info("Shared memory info: server=%d shm_id=%d\n",
+                                                           serverpid, shm_id);
+               area = shmat( shm_id, 0, 0 );
+               if( area == (void*)-1 )
+                   log_fatal("attach to shared memory failed: %s\n",
+                                                           strerror(errno));
+           }
+       }
+       else
+           fputs (buf, stdout);
+    }
+
+
+    if( pclose(fp) )
+       log_error("pclose failed\n");
+
+    return 0;
+#endif
+}
+
+#endif
diff --git a/util/ChangeLog b/util/ChangeLog
new file mode 100644 (file)
index 0000000..29ba476
--- /dev/null
@@ -0,0 +1,1710 @@
+2006-10-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * strsep.c (strsep): It's strsep, not strsep2 from testing.  (If I
+       had a dollar for every time I've done that...)
+
+2006-09-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * strgutil.c (strsep): Move to strsep.c for AC_REPLACE_FUNCS.
+
+       * Makefile.am: Build libcompat.a for keyserver helpers.  libutil.a
+       always contains everything in libcompat.a, so we only need to link
+       to one or the other.
+
+       * miscutil.c: Move hextobyte to new file compat.c.
+
+2006-07-31  Werner Koch  <wk@g10code.com>
+
+       * iobuf.c (iobuf_ioctl, fd_cache_invalidate): Allow closing all
+       open files.
+
+2006-07-29  Marcus Brinkmann  <marcus@g10code.de>
+
+       * secmem.c (init_pool): Close FD after establishing the mapping.
+
+2006-07-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (send_request): A zero-length proxy is the same as no
+       proxy at all.  Suggested by J. Scott Berg.
+
+2006-04-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c (make_printable_string): Fix bug where some control
+       characters lose part of their ASCII representation.
+
+2006-04-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * memory.c (realloc): Revert m_guard fix and stick an #error in
+       there to inform people not to use it.
+
+2006-04-11  Werner Koch  <wk@g10code.com>
+
+       * iobuf.c (IOBUF_BUFFER_SIZE): New to replace hardwired 8192.
+
+2006-04-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * memory.c (realloc): Fix compile problem with --enable-m-guard.
+
+2006-03-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * cert.c (main): Fix test program build warning on OSX.
+
+2006-03-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * cert.c (get_cert): Handle the fixed IPGP type with fingerprint.
+
+2006-03-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * argparse.c (default_strusage): Update copyright year to 2006.
+
+2006-02-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (send_request): A zero length proxy is the same as no
+       proxy.
+
+2006-02-14  Werner Koch  <wk@gnupg.org>
+
+       * errors.c (g10_errstr): Add NO_DATA.
+
+2006-01-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * cert.c (get_cert): Disable IPGP types for now until the format
+       questions in the draft are settled.
+
+       * srv.c (getsrv): Error on oversize SRV responses.
+
+2005-12-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * cert.c (get_cert): Properly chase down CNAMEs pointing to CERTs.
+
+2005-12-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * cert.c, Makefile.am: New code to do DNS CERT queries.
+
+2005-12-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.c, Makefile.am: Only build srv.c if we need to.
+
+2005-12-10  Ryan Lortie  <desrt@desrt.ca> (dshaw)
+
+       * ttyio.c (tty_enable_completion, tty_disable_completion): Add
+       checks for no_terminal so we don't try to open("/dev/tty") when
+       invoked with --no-tty.
+
+2005-12-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am: Some cleanup so we don't build files that are
+       completely ifdeffed out.  This causes a warning on Sun's cc.  Do
+       the internal regex code as well for consistency.
+
+       * mkdtemp.c (mkdtemp): Fix warning.
+
+       * secmem.c, assuan-buffer.c, dotlock.c: Fix a few warnings from
+       printf-ing %p where the arg wasn't void *.
+
+2005-11-02  David Shaw  <dshaw@jabberwocky.com>
+
+       * util.c [!HAVE_DECL_GETPAGESIZE]: Prototype getpagesize() if
+       unistd.h doesn't have it (for MinGW).
+
+2005-09-22  Werner Koch  <wk@g10code.com>
+
+       * iobuf.c (iobuf_get_filelength): New arg OVERFLOW.
+       (iobuf_get_filelength) [W32]:  Use GetFileSizeEx if available.
+       * fileutil.c (is_file_compressed): Take care of the OVERFLOW
+
+2005-08-31  David Shaw  <dshaw@jabberwocky.com>
+
+       * fileutil.c (untilde): New.  Expand ~/foo and ~username/foo
+       filenames into full paths using $HOME if possible, or
+       getpwuid/getpwnam if necessary.
+       (make_filename): Use it here.
+
+2005-07-28  Werner Koch  <wk@g10code.com>
+
+       * pka.c: New.
+       (parse_txt_record): Changed from v=1 to v=pka1.
+
+       * Makefile.am (pka-test): new.
+
+2005-07-27  Werner Koch  <wk@g10code.com>
+
+       * memory.c (FNAMEX, FNAMEXM): New macros to cope with the now used
+       names xmalloc style names.
+
+2005-07-18  Werner Koch  <wk@g10code.com>
+
+       * ttyio.c (do_get): Move printing of the prompt after disabling
+       echo.  Suggested by Scott Worley.
+
+2005-06-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (make_radix64_string): Add '=' padding as per standard.
+       (send_request, http_open, http_open_document): Clean up auth code.
+       Can now support different auth for a proxy and the file being
+       requested via that proxy.  Unescape auth strings.
+
+2005-06-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * memrchr.c (memrchr): Not all compilers allow initializing based
+       on a variable that is also being initialized.  Noted by Nelson
+       H. F. Beebe.
+
+2005-06-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (send_request, http_open, http_open_document): Pass in
+       auth and proxyauth that can override the in-url auth.
+
+       * http.c (send_request): Need == after the radix64-encoded basic
+       auth string.
+
+2005-06-08  David Shaw  <dshaw@jabberwocky.com>
+
+       * dotlock.c [HAVE_DOSISH_SYSTEM]: Fix unused function warnings on
+       mingw32.  Noted by Joe Vender.
+
+2005-05-31  Werner Koch  <wk@g10code.com>
+
+       * regcomp.c (MB_CUR_MAX) [_WIN32]: Define it only if not defined.
+
+2005-05-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * strgutil.c (set_native_charset) [_WIN32]: Add alias for codepage
+       CP65001 to utf-8.
+
+2005-05-19  Werner Koch  <wk@g10code.com>
+
+       * membuf.c: New.  Taken from gnupg 1.9.
+
+2005-05-05  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c (add_days_to_timestamp): Remove as unused.
+
+2005-04-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * assuan-client.c: Fix warning on OSX.
+
+       * memrchr.c: New replacement function.
+
+       * assuan-buffer.c: Use it here.
+
+2005-04-04  Werner Koch  <wk@g10code.com>
+
+       * memory.c (xcalloc, xcalloc_secure): New wrappers.
+
+       * assuan-client.c (assuan_transact): Factored all code out to ..
+       (assuan_transact2): .. new.  Add arg OKAY_CB.  Wipe the memory
+       processed though that callback.
+
+2005-03-31  Werner Koch  <wk@g10code.com>
+
+       * isascii.c: New.  This is an autoconf replacement function.
+
+       * Makefile.am (assuan_source): New.  Only used when agent support
+       has been requested.
+       * assuan-buffer.c, assuan-client.c, assuan-defs.h,
+       * assuan-errors.c, assuan-logging.c, assuan-socket-connect.c,
+       * assuan-socket.c, assuan-util.c, assuan-connect.c: New.  Taken
+       from libassuan 0.6.9 and adjusted for our limited use of Assuan.
+
+2005-03-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * ttyio.c (tty_enable_completion, tty_disable_completion): Enable
+       and disable readline completion.
+       (init_ttyfp): Completion is disabled by default.
+
+2005-03-14  Werner Koch  <wk@g10code.com>
+
+       * miscutil.c (isotimestamp): New.
+
+2005-03-10  Werner Koch  <wk@g10code.com>
+
+       * secmem.c (secmem_realloc): Take control information into account
+       when checking whether a resize is needed.
+
+2005-03-08  Werner Koch  <wk@g10code.com>
+
+       * miscutil.c (asctimestamp) [W32]: Don't use %Z.
+
+2005-02-03  Werner Koch  <wk@g10code.com>
+
+       * w32reg.c (read_w32_registry_string): Fallback to HKLM also for a
+       missing name.
+
+       * http.c (connect_server): Define ERR outside of the !W32 block.
+
+2005-02-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Fix fd leak when connecting to a
+       round-robin server set that has some down servers.  Noted by Phil
+       Pennock.
+
+2005-01-20  Werner Koch  <wk@g10code.com>
+
+       * simple-gettext.c (set_gettext_file): Use MO files depending on
+       the installation directory.  Add new arg REGKEY.
+       
+2005-01-18  Werner Koch  <wk@g10code.com>
+
+       * argparse.c (default_strusage): Changed default copyright year to
+       2005.
+
+       * strgutil.c (handle_iconv_error): Print error messages only once.
+       (native_to_utf8, utf8_to_native): Ditto.
+
+2005-01-11  Werner Koch  <wk@g10code.com>
+
+       * strgutil.c (set_native_charset) [W32]: Use the alias table from
+       libiconv 1.9.2. 
+
+2005-01-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Use INADDR_NONE instead of
+       SOCKET_ERROR.  Noted by Timo.
+
+2005-01-06  Werner Koch  <wk@g10code.com>
+
+       * strgutil.c (set_native_charset): Assume that ASCII,
+       ANSI_X3.4-1968 and 646 are actually meant as Latin-1.  If
+       nl_langinfo is not available get the charset from environment
+       variables. For W32 use GetACP as error fallback.  Removed Latin-15
+       to Latin-1 aliasing.
+
+2004-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.h: Better implementation for the SRV check.  We don't need
+       to actually check all the header files individually since the SRV
+       test compile uses them together.
+
+2004-12-20  Werner Koch  <wk@g10code.com>
+
+       * strgutil.c (handle_iconv_error): Turn diagnostics into warnings
+       so that gpg does not return with failure.
+       (native_to_utf8, utf8_to_native): Ditto.
+
+2004-12-16  Werner Koch  <wk@g10code.com>
+
+       * iobuf.c (fd_cache_strcmp) [W32]: Casting is a Bad Thing. Cast to
+       an unsigned char pointer and to an unsigned integer.
+
+2004-12-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * ttyio.c: Use only HAVE_LIBREADLINE to detect readline
+       availability.
+
+2004-12-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.h: Don't include arpa/nameser.h unless we have it.  Include
+       "types.h" for u16.
+
+       * secmem.c (secmem_init): Return a flag to indicate whether we got
+       the lock.
+
+2004-12-06  Werner Koch  <wk@g10code.com>
+
+       * iobuf.c (fd_cache_strcmp): New. Use whenever we compare
+       filenames for the fd_cache. This is needed because the backslash
+       is an alias for a slash under W32. Reported by Tobias Winkler.
+
+2004-12-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (send_request): Include the port if non-80 in the Host:
+       header.  Noted by Jason Harris.
+
+2004-11-03  Timo Schulz  <twoaday@g10code.com>
+       
+       * strgutil.c (w32_strerror): New.
+       * ttyio.c (init_ttyfp, tty_printf, do_get): Use it here.
+       * iobuf.c (fd_cache_open, file_filter): Likewise.
+       (iobuf_seek, translate_file_handle): Likewise.
+       
+2004-11-02  Werner Koch  <wk@g10code.com>
+
+       * strgutil.c (load_libiconv): Use log_info to avoid failures when
+       iconv.dll is not installed.
+
+2004-10-31  Werner Koch  <wk@g10code.com>
+
+       * simple-gettext.c (get_string): Removed debugging hack.
+
+2004-10-27  Werner Koch  <wk@g10code.com>
+
+       * simple-gettext.c: Removed windows.h.
+       (get_string): On the fly translation from utf-8 to active
+       character set.
+
+       * strgutil.c (load_libiconv) [_WIN32]: new.
+       (set_native_charset) [_WIN32]: Call it here and autodetect the
+       used code page.
+       (native_to_utf8, utf8_to_native): Reverted arguments for
+       iconv_open.
+       (handle_iconv_error): Made this function match iconv_open argumnet
+       ordering.
+       (utf8_to_native): Disable all quoting for DELIM == -1.
+
+2004-10-26  Werner Koch  <wk@g10code.com>
+
+       * strgutil.c (mem2str): Translated comment to English.
+       (handle_iconv_error) [USE_GNUPG_ICONV]: New.
+       (set_native_charset) [USE_GNUPG_ICONV]: Added iconv based
+       conversion checks.
+       (native_to_utf8, utf8_to_native): Added iconv based conversion.
+
+2004-10-21  Werner Koch  <wk@g10code.com>
+
+       * vasprintf.c: Removed. It was used only at one place and I don't
+       want to get into build problems in 1.4. 
+
+2004-10-18  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server, send_request): Use the URI scheme as the
+       SRV tag rather than hard-coding _hkp.
+
+2004-10-16  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): [_WIN32] actually fill in the sin_addr
+       so we aren't always talking to localhost.  Add some general sanity
+       checking of parameters learned from gethostbyname().
+
+2004-10-15  Werner Koch  <wk@g10code.com>
+
+       * vasprintf.c: New.  Taken from gnupg 1.9.
+
+2004-10-14  Werner Koch  <wk@g10code.com>
+
+       * iobuf.c (iobuf_get_fd): Removed double check on directfp and
+       cats it to FILEP becuase directfp is actually a void *.  Notes by
+       Stefan.
+
+2004-10-13  Werner Koch  <wk@g10code.com>
+
+       * logger.c (g10_log_error_f, g10_log_fatal_f, g10_log_info_f)
+       (g10_log_debug_f, print_prefix_f): Removed.
+
+       * iobuf.c (iobuf_is_pipe_filename): New.
+       (iobuf_get_fd): New.
+
+       * fileutil.c (is_file_compressed): Use it here.
+
+2004-09-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * iobuf.c (pop_filter): Make static.
+
+       * dotlock.c (destroy_dotlock): New.  Remove the handle from the
+       list of locks.
+       (release_dotlock): Don't act if we don't have any locks at all.
+       From Werner on stable branch.
+
+2004-09-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (make_radix64_string, do_parse_uri, send_request): Add
+       basic auth for proxies and direct requests.  Suggested by Florent
+       Thoumie.
+
+       * http.c (main): Fix test code for http-test.
+
+2004-09-09  Werner Koch  <wk@g10code.com>
+
+       * errors.c (g10_errstr): New error codes G10ERR_NO_CARD,
+       G10ERR_CANCELED.
+
+       * ttyio.c (tty_get): Add readline support.
+
+       * iobuf.c (iobuf_skip_rest): New.  Orginal patch by Florian
+       Weimer.  Added new argument PARTIAL.
+
+2004-08-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (insert_escapes): Fix encoding problem for non-URI-safe
+       characters.  Noted by Vladimir Novak.
+
+2004-05-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * timegm.c: New replacement function.  Removes the need for
+       setenv.c and unsetenv.c.
+
+       * setenv.c: Removed.
+
+       * unsetenv.c: Removed.
+
+2004-03-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * iobuf.c (block_filter): Remove the old gpg indeterminate length
+       mode.
+       (iobuf_set_block_mode, iobuf_in_block_mode): Removed as
+       superfluous.
+
+2004-03-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * iobuf.c (block_filter): Properly handle a partial body stream
+       that ends with a 5-byte length that happens to be zero.
+
+2004-02-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * unsetenv.c: Fixed debugging typo.
+
+2004-02-24  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (lock_pool) [_AIX]: Also set errno.
+
+2004-02-21  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c (hextobyte): Moved here from g10/misc.c so I can use
+       it in the keyserver helpers.
+
+2004-02-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * mkdtemp.c: New (moved from g10/), setenv.c: New, unsetenv.c:
+       New.
+
+       * Makefile.am: Include @LIBOBJS@ for replacement functions.
+
+2004-01-15  David Shaw  <dshaw@jabberwocky.com>
+
+       * argparse.c (default_strusage): Update copyright date.
+       (initialize): Avoid a number of -Wformat-nonliteral warnings.
+       These aren't actual problems, but the warnings bothered me.
+
+       * miscutil.c (print_string2): New variation on print_string that
+       allows two delimiters.
+       (print_string): Call print_string2 to do work.
+
+2003-12-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * g10u.c: Dead code.  Remove.
+
+       * Makefile.am: Don't compile g10u.c.
+
+       * iobuf.c (block_filter): Properly handle a partial body stream
+       that ends with a 5-byte length.
+
+2003-12-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (send_request, http_open_document, http_open): Pass the
+       http proxy from outside rather than pulling it from the
+       evironment.
+
+2003-12-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * riscos.c [__riscos__]: Better filetype handling (use a
+       different SWI) and removal of unnecessary function.
+
+       * memory.c (out_of_core) [__riscos__]: Produce stack backtrace on
+       RISC OS if out_of_core() is called and M_GUARD is compiled in.
+
+2003-12-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (send_request): Add a Host: header for virtual hosts.
+
+2003-12-04  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c (answer_is_yes_no_default, answer_is_yes_no_quit):
+       Don't use alternate strings when not needed so we don't have to
+       re-translate them. Hopefully the comment will be enough to
+       indicate multiple match strings.
+
+2003-11-20  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c (match_multistr): New.  Match against each segment in
+       a string with tokens separated by |.
+       (answer_is_yes_no_default, answer_is_yes_no_quit,
+       answer_is_okay_cancel): Use it here to enable alternate
+       translations.
+
+2003-11-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Differentiate between generic "can't
+       connect" errors and the more specific "host not found". Suggested
+       by Samuel Tardieu.
+
+2003-10-29  Werner Koch  <wk@gnupg.org>
+
+       * miscutil.c (answer_is_okay_cancel): New.
+
+2003-10-25  Werner Koch  <wk@gnupg.org>
+
+       * Makefile.am: Replaced INTLLIBS by LIBINTL.
+
+2003-10-23  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (lock_pool) [_AIX]: Don't use plock.
+
+2003-10-12  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.c: OSX 10.2.8/Darwin 6.8 seems to have some #include
+       ordering issues?  Move sys/types.h up higher to work around.
+
+2003-10-08  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.c (tty_print_string, tty_print_utf8_string2)
+       (tty_print_utf8_string): Made string arg const.
+
+2003-09-28  Timo Schulz  <twoaday@freakmail.de>
+
+       * strgutil.c [WIN32] (asprintf): New.
+       
+2003-09-28  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.c (tty_fprintf): New.
+
+2003-09-21  Timo Schulz  <twoaday@freakmail.de>
+
+       * http.c [WIN32]: Define MB_CUR_MAX.
+       (connect_server): use unsigned long since W32 does not have in_addr_t.
+       
+2003-08-28  David Shaw  <dshaw@jabberwocky.com>
+
+       * dotlock.c, http.c, iobuf.c, simple-gettext.c, srv.c, srv.h,
+       strgutil.c, ttyio.c, w32reg.c: s/__MINGW32__/_WIN32/ to help
+       building on native Windows compilers.  Requested by Brian Gladman.
+       From Werner on stable branch.
+       
+       * http.c (connect_server): Oops - forgot to freeaddrinfo().
+
+2003-08-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Try and use getaddrinfo if it is
+       available.  Try for IPv6 via getaddrinfo() or a IPv6-ized
+       gethostbyname().  Suggested by Jun-ichiro itojun Hagino.
+
+2003-07-10  David Shaw  <dshaw@jabberwocky.com> (from Werner on stable branch)
+
+       * iobuf.c (check_special_filename): Replaced is isdigit by digitp
+       to avoid passing negative values and potential locale problems.
+       Problem noted by Christian Biere.
+       * strgutil.c (strlwr,strcasecmp,strncasecmp): Make sure we don't
+       pass a negative value.
+       * miscutil.c (scan_isodatestr): Ditto.
+
+2003-05-30  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.h, srv.c: Include windows.h with MINGW32.
+
+2003-05-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * argparse.c, dotlock.c, fileutil.c, iobuf.c, miscutil.c,
+       simple-gettext.c, errors.c, http.c, memory.c, secmem.c, ttyio.c:
+       Edit all preprocessor instructions to remove whitespace before the
+       '#'.  This is not required by C89, but there are some compilers
+       out there that don't like it.
+
+2003-05-21  Werner Koch  <wk@gnupg.org>
+
+       * fileutil.c (is_file_compressed): Fixed checking for "-" filename.
+
+2003-04-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.c (main): Test against wwwkeys.pgp.net.
+
+       * srv.h: Grr. The RH7.3 Linux man page defines the fourth arg of
+       dn_expand as unsigned char*, but it is really char* according to
+       resolv.h.
+
+2003-03-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * argparse.c (default_strusage): Change copyright date.
+
+2003-03-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * srv.h, srv.c (getsrv): Use unsigned char rather than char.
+       Noted by Stefan Bellon.
+
+2003-03-11  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Use DNS SRV to get a server list.  Fail
+       over to A records if necessary.
+
+       * Makefile.am, srv.h, srv.c: New DNS SRV handling code.
+
+2003-02-22  David Shaw  <dshaw@jabberwocky.com>
+
+       * ttyio.c (tty_print_utf8_string, tty_print_utf8_string2): Use 0
+       to indicate a string with no maximum size.  This prevents early
+       truncation of strings that contain control chars which are
+       expanded into \xXX form.
+
+2002-12-26  David Shaw  <dshaw@jabberwocky.com>
+
+       * iobuf.c (iobuf_flush): Only print debug info if debugging is on.
+
+2002-11-13  David Shaw  <dshaw@jabberwocky.com>
+
+       * secmem.c (lock_pool) [__CYGWIN__]: Don't print secmem warning.
+       From Werner on stable branch.
+
+2002-11-09  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.c (TERMDEVICE): Removed.
+       (tty_get_ttyname): New.
+       (init_ttyfp): Use it here instead of the TERMDEVICE macro.
+
+2002-11-06  David Shaw  <dshaw@jabberwocky.com>
+
+       * w32reg.c (read_w32_registry_string): Fixed expanding of the
+       environment buffer; didn't worked at all.  Reported by Thijmen
+       Klok.  From Werner on stable branch.
+
+       * secmem.c (secmem_free, secmem_term): Use wipememory2() instead
+       of memset() to overwrite secure memory
+
+       * iobuf.c (direct_open): Handle mode 'b' if O_BINARY is available.
+       From Werner on stable branch.
+
+       * fileutil.c: Comment from stable branch.
+
+2002-10-31  Stefan Bellon  <sbellon@sbellon.de>
+
+       * riscos.c (riscos_load_module, riscos_check_regexp): New.
+       (riscos_set_filetype_by_mimetype, riscos_dump_fdlist)
+       (riscos_fdopenfile, riscos_close_fds, riscos_renamefile)
+       (riscos_gstrans, riscos_list_openfiles, riscos_not_implemented):
+       Renamed functions to contain riscos prefix.
+       * dotlock.c [__riscos__]: Renames due to changes in riscos.c.
+       * fileutil.c [__riscos__]: Likewise.
+
+2002-10-29  Stefan Bellon  <sbellon@sbellon.de>
+
+       * fileutil.c: Removed unnecessary left-over includes for RISC OS.
+       (make_filename): Tidied up RISC OS stuff.
+       (compare_filenames) [__riscos__]: Compare with ascii_strcasecmp().
+       (make_basename) [__riscos__]: Branch to own RISC OS routine from
+       here.
+
+       * riscos.c (riscos_make_basename): New.
+
+2002-10-28  Stefan Bellon  <sbellon@sbellon.de>
+
+       * fileutil.c (make_basename) [__riscos__]: Cut off RISC OS' filing
+       systems from filepath.
+
+       * riscos.c (riscos_get_filetype_from_string, riscos_get_filetype):
+       Added.
+       (riscos_set_filetype_by_number): Made public.
+
+2002-10-19  David Shaw  <dshaw@jabberwocky.com>
+
+       * Makefile.am, regcomp.c, regex.c, regex_internal.c,
+       regex_internal.h, regexec.c: Add new regex files from glibc 2.3.1.
+
+2002-10-17  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Try all A records for names with
+       multiple addresses until one answers for both MINGW32 and not
+       MINGW32.
+
+2002-10-10  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Properly handle a single A record that
+       fails connect().
+
+2002-10-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * logger.c (g10_log_warning, log_set_strict): Add new log_warning
+       logger command which can be switched between log_info and
+       log_error via log_set_strict.
+
+2002-09-24  David Shaw  <dshaw@jabberwocky.com>
+
+       * http.c (connect_server): Try all A records for names with
+       multiple addresses until one answers (not MINGW32).
+
+2002-09-16  Werner Koch  <wk@gnupg.org>
+
+       * w32reg.c (read_w32_registry_string): Fallback to HLM.
+
+2002-09-12  Stefan Bellon  <sbellon@sbellon.de>
+
+       * fileutil.c (make_filename): Removed variable for RISC OS to
+       avoid compiler warning.
+
+       * secmem.c: Removed static variable for RISC OS to avoid
+       compiler warning.
+
+2002-09-11  Werner Koch  <wk@gnupg.org>
+
+       * simple-gettext.c: Disable charset mappings.  We do it now when
+       installing the files.
+
+2002-09-09  Werner Koch  <wk@gnupg.org>
+
+       * w32reg.c (read_w32_registry_string): Handle REG_EXPAND_SZ.
+       Suggested by Ryan Malayter.
+
+       * strgutil.c (ascii_strcasecmp): Replaced by code from gnulib.
+       (ascii_strncasecmp): New.
+
+2002-09-02  Werner Koch  <wk@gnupg.org>
+
+       * simple-gettext.c (set_gettext_file): Make sure that we only use
+       backslashes.
+
+       * strgutil.c (set_native_charset): Allow NULL as argument to use
+       nl_langinfo for selection.  Mapped latin-15 to latin-1.
+
+2002-08-30  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c (block_filter): Removed the assert, so that one can pass
+       the first character of a message and use the block filter for
+       non partial length encoded packets.
+
+2002-08-06  Stefan Bellon  <sbellon@sbellon.de>
+
+       * ttyio.c [__riscos__]: Moved low-level RISC OS stuff to riscos.c.
+       * riscos.c: Use new SWI calling mechanism of UnixLib.
+
+2002-08-03  Stefan Bellon  <sbellon@sbellon.de>
+
+       * secmem.c (init_pool, secmem_term): Changed #if to #ifdef in
+       order to avoid warning with RISC OS' Norcroft C.
+
+2002-07-25  David Shaw  <dshaw@jabberwocky.com>
+
+       * secmem.c: "Warning" -> "WARNING"
+
+2002-07-05  Werner Koch  <wk@gnupg.org>
+
+       * argparse.c (initialize): We better exit after a read error so
+       that we don't run into an endless loop when reading a directory.
+       Noted by Andrew Suffield.
+
+2002-07-01  David Shaw  <dshaw@jabberwocky.com>
+
+       * argparse.c (optfile_parse): Fix variable typo - 'p2' should be
+       'p' :)
+
+2002-06-29  Werner Koch  <wk@gnupg.org>
+
+       * argparse.c (optfile_parse): Renamed an auto I to P2 to avoid
+       shadowing warning.
+
+2002-06-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * riscos.c (riscos_global_defaults): New.
+
+2002-06-20  Stefan Bellon  <sbellon@sbellon.de>
+
+       * riscos.c (riscos_set_filetype_by_number, riscos_set_filetype):
+       New. Set RISC OS filetype according to MIME type.
+
+2002-06-14  David Shaw  <dshaw@jabberwocky.com>
+
+       * strgutil.c (pop_strlist): New function to pop the head off of a
+       strlist.
+
+2002-06-05  Timo Schulz  <ts@winpt.org>
+
+       * fileutil.c (is_file_compressed): Corrected the magic values
+       for bzip2 and gzip. Noted by David.
+       
+2002-05-22  Werner Koch  <wk@gnupg.org>
+
+       * fileutil.c (compare_filenames): Replaced stricmp by strcasecmp.
+       * miscutil.c (answer_is_yes_no_quit,answer_is_yes_no_default): Ditto.
+
+       * strgutil.c (strncasecmp): New.
+       (memicmp): Removed.
+
+2002-05-10  Stefan Bellon  <sbellon@sbellon.de>
+
+       * memory.c (add_entry) [M_DEBUG]: Added some missing EXTRA_ALIGN.
+       (free_entry) [M_DEBUG]: Free secure memory via secmem_free.
+       (alloc_secure): Malloc at least 1 byte.
+       (realloc) [M_GUARD]: Added missing FNAMEARG to function call.
+
+       * logger.c (g10_log_bug0) [__riscos__]: Make use of first
+       g10_log_bug0 function for later Norcroft compiler.
+
+       * riscos.c: Added stdlib.h include.
+
+2002-05-04  Werner Koch  <wk@gnupg.org>
+
+       * http.c (write_server) [__MINGW32__]: Replaced WriteFile by send
+       because sockets don't work with WriteFile under NT anymore.
+
+2002-05-03  David Shaw  <dshaw@jabberwocky.com>
+
+       * argparse.c (optfile_parse): Remove quotes only if they totally
+       enclose the string, and do not occur within the string.  This
+       makes specifying a program under Win32 easier when you need quotes
+       around part of a string, but not around the whole string.
+       
+2002-05-02  Werner Koch  <wk@gnupg.org>
+
+       * memory.c (alloc): Malloc at least 1 byte.  Noted by Winona Brown. 
+
+2002-04-23  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c: New function answer_is_yes_no_default() to give a
+       default answer.
+
+2002-04-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * riscos.c (riscos_open, riscos_fopen, riscos_fstat, set_filetype):
+       Removed as they're not needed anymore.
+
+       * iobuf.c (direct_open) [__riscos__]: Don't allow opening of
+       directories.
+
+2002-04-08  Werner Koch  <wk@gnupg.org>
+
+       Fixed filename of last entry.
+
+2002-03-29  David Shaw  <dshaw@jabberwocky.com>
+
+       * miscutil.c (print_string, utf8_to_native): If a delimiter is
+       used, then quote the backslash character as well.  Problem noted
+       by Rainer Perske.
+
+2002-03-15  Werner Koch  <wk@gnupg.org>
+
+       * argparse.c (optfile_parse): Fixed missing argument handling.
+
+2002-02-28  Timo Schulz  <ts@winpt.org>
+
+       * http.c (write_server): Convert integer to a HANDLE for W32.
+       
+2002-01-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * iobuf.c (iobuf_fdopen, iobuf_sockopen): Do not cache fdopened
+       fds on close.
+
+2002-01-08  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (print_warn): Print a pointer to the FAQ.
+
+2002-01-05  Werner Koch  <wk@gnupg.org>
+
+       * argparse.c (default_strusage): Set default copyright date to 2002.
+
+2002-01-02  Stefan Bellon  <sbellon@sbellon.de>
+
+       * iobuf.c [__riscos__]: Updated include file name.
+
+       * fileutil.c [__riscos__]: Ditto.
+
+       * ttyio.d [__riscos__]: Ditto.
+
+       * riscos.c [__riscos__]: Ditto. Added debugging code and
+       unified error messages.
+
+2001-12-27  David Shaw  <dshaw@jabberwocky.com>
+
+       * errors.c (g10_errstr): Added G10ERR_KEYSERVER
+
+2001-12-27  Werner Koch  <wk@gnupg.org>
+
+       * simple-gettext.c [MINGW32]: Fixed last changed.
+
+2001-12-22  Stefan Bellon  <sbellon@sbellon.de>
+
+       * memory.c (realloc): Fixed realloc not working when M_GUARD is
+       defined and first parameter is NULL.
+
+2001-12-22  Timo Schulz <ts@winpt.org>
+
+        * fileutil.c (is_file_compressed): New.
+
+2001-12-19  Werner Koch  <wk@gnupg.org>
+
+       * simple-gettext.c, w32reg.c [CYGWIN32]: Allow to use this file
+
+2001-10-11  Werner Koch  <wk@gnupg.org>
+
+       * http.c (do_parse_uri): Changed initialization of the port number
+       so that it does also work with x-hkp.  By David Shaw.
+
+2001-09-19  Werner Koch  <wk@gnupg.org>
+
+       * w32reg.c (get_root_key): New.
+       (read_w32_registry_string): Use it here.
+       (write_w32_registry_string): New.  Contributed by Timo.
+
+       * iobuf.c (iobuf_ioctl): New command to disable fd
+       caching. Implemented no_cache flag where needed.
+       (iobuf_sockopen): Always set no_cache flag.
+
+       * strgutil.c (utf8_to_native): Add a delim arg and changed all
+       callers. Make sure that quoting is done when translation is
+       disabled.
+       * miscutil.c (print_utf8_string2): New.
+
+2001-09-17  Werner Koch  <wk@gnupg.org>
+
+       * miscutil.c (print_string): Use explicit ranges and not iscntrl().  
+       (make_printable_string): Ditto.
+
+2001-09-07  Werner Koch  <wk@gnupg.org>
+
+       * strgutil.c (strsep): New, taken from glibc 2.2.1.
+
+2001-09-03  Werner Koch  <wk@gnupg.org>
+
+       * miscutil.c (strtimestamp,asctimestamp): Avoid trigraphs.
+
+2001-08-21  Stefan Bellon  <sbellon@sbellon.de>
+
+       * riscos.c [__riscos__] (close_fds): Fixed possible endless loop.
+
+2001-08-20  Werner Koch  <wk@gnupg.org>
+
+       Applied patches from Stefan Bellon <sbellon@sbellon.de> to support
+       RISC OS.  Nearly all of these patches are identified by the
+       __riscos__ macro.
+       * secmem.c [__riscos__]: Disabled secure memory stuff.
+       * dotlock.c, ttyio.c [__riscos__]: Adapted for RISC OS
+       * fileutil.c, iobuf.c: Adapted for RISC OS;  mainly replaced
+       hardcoded path separators with EXTSEP_S like macros. 
+       * http.c (send_request): Use macros for the env-var name.
+       * logger.c [__riscos__]: Do an fflush at the end of each log
+       function. 
+       * memory.c [__riscos__]: Minor patches
+       * riscos.c (set_filetype): New.
+
+       * secmem.c (lock_pool): Under HPUX mlock is broken but we might
+       have plock, so we use this to lock the entire process.  By Albert
+       Chin.
+       
+2001-07-03  Werner Koch  <wk@gnupg.org>
+
+       * strgutil.c (utf8_to_native): Fixed printing of invalid utf-8
+       characters.  Thomas Roessler reported that the escaping didn't work
+       correct.
+
+2001-06-12  Werner Koch  <wk@gnupg.org>
+
+       * strgutil.c (ascii_memistr,ascii_isupper,ascii_islower,
+       ascii_toupper,ascii_tolower, ascii_strcasecmp, ascii_memcasecmp): New.
+       (set_native_charset): Use ascii_strcasecmp()
+       * fileutil.c (compare_filenames): Ditto
+       * miscutil.c (answer_is_yes): Ditto.
+       (answer_is_yes_no_quit): Ditto.
+
+2001-06-06  Werner Koch  <wk@gnupg.org>
+
+       * strgutil.c (vasprintf) [__MINGW32__]: New. Taken from libiberty.
+       * ttyio.c (tty_printf) [__MINGW32__]:  Replaced the sprintf with
+       the new vasprintf. 
+
+2001-06-05  Werner Koch  <wk@gnupg.org>
+
+       * dotlock.c (make_dotlock): Typo fixes. 
+
+2001-05-25  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.c (do_get): Fixed a serious format string bug.  Thanks to
+       fish stiqz.
+
+2001-05-23  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (EPERM): Try to work around a Slackware problem.
+
+2001-05-05  Werner Koch  <wk@gnupg.org>
+
+       * http.c (http_start_data): Flush before writing.
+       (http_wait_response): No need to flush here.
+
+2001-04-27  Werner Koch  <wk@gnupg.org>
+
+       * memory.c (out_of_core): Print an explanation on reasons why
+       secret memory can get exhausted.
+
+2001-04-23  Werner Koch  <wk@gnupg.org>
+
+       * http.c (http_wait_response): Implement new flag to inhibit the
+       TCP shutdown.
+
+2001-04-20  Werner Koch  <wk@gnupg.org>
+
+       * http.c (http_start_data): Use write_server and not the iobuf
+       stuff.  I wonder why we are at all using write_server - shouldn't
+       it be handled by iobuf?
+
+       * strgutil.c (set_native_charset): Allow utf-8 by introducing the
+       new no_translation variable.
+       (native_to_utf8): Handle no_translation.
+       (utf8_to_native): Ditto.
+
+2001-04-19  Werner Koch  <wk@gnupg.org>
+
+       * miscutil.c (asctimestamp): Handle negative times.  We must do
+       this because Windoze segvs on negative times passed to gmtime().
+       (strtimestamp): Ditto.
+
+2001-04-14  Werner Koch  <wk@gnupg.org>
+
+       * strgutil.c (utf8_to_native): Fixed a segv.  Thanks to Keith Clayton.
+
+2001-04-13  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c (iobuf_fopen): Removed because it is not used and
+       furthermore mode is ignored for an fname of "-".  Suggested by
+       Florian Weimer.
+
+2001-04-02  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c (translate_file_handle): New. Use this function
+       everywhere in this file.
+       (iobuf_translate_file_handle): Always use the osfhandle stuff here
+       because callers don't know the implementation details of iobuf and
+       they expect that the handles are translated. 
+
+2001-03-29  Werner Koch  <wk@gnupg.org>
+
+       * miscutil.c (answer_is_yes): An empty string does now return no.
+       (answer_is_yes_no_quit): Likewise.
+
+       * iobuf.c (iobuf_close): Burn the buffers.
+
+2001-03-26  Werner Koch  <wk@gnupg.org>
+
+       * ttyio.c: Define TERMDEVICE depending on OS.
+
+       * http.c (http_start_data): send a CRLF and not just a LF.
+       Pointed out by Steven Murdoch.
+
+2001-03-13  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c (iobuf_sockopen): New.
+       (sock_filter) [__MINGW32__]: New.
+       (iobuf_ioctl): New.
+       (file_filter): Implemented keep_open mode.
+       * http.c (http_open, http_wait_response): Replaced iobuf_fdopen by
+       iobuf_sockopen and use an iobuf_ioctl to avoid the dup().
+       (deinit_sockets, init_sockets) [__MINGW32__]: New.
+       (connect_server, write_server): Add code to work with W32 sockets.
+
+2001-03-12  Werner Koch  <wk@gnupg.org>
+
+       * strgutil.c (check_trailing_chars,check_trailing_ws): New.
+
+2001-03-08  Werner Koch  <wk@gnupg.org>
+
+       * argparse.c (default_strusage): Changed year of printed copyright
+       to 2001.
+
+       * iobuf.c (fd_cache_invalidate, fd_cache_close, fd_cache_open): New. 
+       (direct_open): Invalidate the fd_cache for read access.
+       (file_filter): Cache the close here.
+       (iobuf_open): Use new my_fopen_ro macro to try the cache first.
+
+2001-03-07  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c: Made the old stdio file handling cpp conditional
+       controlled by FILE_FILTER_USES_STDIO and added a new
+       open/read/close based one.  We don't need the stdio buffering
+       becuase we are doing our own buffering anyway.  And it is a
+       prerequesite to allow the use of ReadFile et al for W32 which in
+       turn is needed to make the http stuff work there. The new W32
+       stuff has also been implemented. Minor changes to all open functions.
+       (direct_open): New.
+       (file_filter): Core of the new read/write handling.
+       (iobuf_get_filelength): Use W32 API function here. But it is
+       currently limited to 2GB files.
+       (iobuf_seek): Ditto.
+
+2001-03-01  Werner Koch  <wk@gnupg.org>
+
+       * errors.c (g10_errstr): New codes UNU_SECKEY and UNU_PUBKEY.
+
+2000-12-28  Werner Koch  <wk@gnupg.org>
+
+       * dotlock.c: Made all_lockfiles volatile.
+       (remove_lockfiles): Made public.
+
+2000-11-30  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c (iobuf_translate_file_handle): New.
+       (iobuf_open, iobuf_create): Use it for special filenames
+
+2000-11-11  Paul Eggert  <eggert@twinsun.com>
+
+        * iobuf.c (iobuf_get_filelength): Now returns off_t, not u32.
+        Remove kludges to worry about large files; the callers check
+        for files that are too large, and they should already be doing
+        the right thing in an implementation-independent way.
+        (fopen, fstat): Remove macros.
+
+        * iobuf.c (iobuf_set_limit, iobuf_tell, iobuf_seek): 
+        Use off_t, not ulong, for file offsets.
+        (<limits.h>): Include if needed.
+        (LONG_MAX, LONG_MIN): Define a substitute if needed.
+        (fseeko): Define a substitute if needed.
+
+        * iobuf.c (iobuf_seek):  Do not use %lu to report file
+
+2000-11-09  Werner Koch  <wk@gnupg.org>
+
+       * iobuf.c (iobuf_enable_special_filenames): New.
+       (check_special_filename): New.
+       (iobuf_open): check for special filenames.
+       (iobuf_create): Ditto.
+
+2000-10-23  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (lock_pool): Don't print warning for Windows.
+
+2000-10-16  Werner Koch  <wk@gnupg.org>
+
+       * secmem.c (lock_pool): Fixed error checking for Linux.
+       By James Troup.
+
+Thu Sep 14 14:20:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * miscutil.c (answer_is_yes_no_quit): Swapped order of yes/no test
+        so that no is returned for an empty input. By David Champion.
+
+Wed Sep  6 17:55:47 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * iobuf.c: Use fopen64 insead of fopen when available.
+        (iobuf_get_filelength): Use fstat64 when available but return
+        2^32-1 if the file is larger than this value.
+
+Wed Sep  6 14:59:09 CEST 2000  Werner Koch  <wk@openit.de>
+
+        * secmem.c (secmem_realloc): check for failed secmem_malloc.  By
+        Matt Kraai.
+
+        * strgutil.c (utf8_to_native): Fixed null ptr problem.  By
+        Giampaolo Tomassoni.
+
+Thu Jul 27 10:02:38 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * iobuf.c: Use setmode() at several places to set stdin and stdout
+  to binary mode for MSDOS based systems
+
+  * iobuf.c (underflow): Initialize dummy_len to keep memory checker happy.
+
+Fri Jun  9 10:09:52 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * ttyio.c: Simulate termios with termios.  By Dave Dykstra.
+
+Thu Jun  8 20:22:00 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * secmem.c (lock_pool,secmem_init): Additional check for dropped privs.
+
+Tue May 30 16:37:55 CEST 2000  Werner Koch  <wk@openit.de>
+
+  * iobuf.c (iobuf_cancel): Fix for MSDOS.
+
+Fri Apr 14 19:37:08 CEST 2000  Werner Koch  <wk@openit.de>
+
+       * dotlock.c (disable_dotlock): New.  Implmented this in the module.
+
+2000-03-09 14:04:22  Werner Koch  (wk@habibti.openit.de)
+
+       * argparse.c (default_strusage): Changed year of default copyright.
+
+Tue Mar  7 18:45:31 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * secmem.c (lock_pool): No more warning for QNX. By Sam Roberts.
+
+2000-03-02 15:51:04  Werner Koch  (wk@habibti.gnupg.de)
+
+       * ttyio.c (tty_print_utf8_string): Oops.
+
+Thu Mar  2 15:37:46 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * ttyio.c (tty_print_utf8_string2): New to allow a max output size.
+
+Wed Feb 23 10:07:57 CET 2000  Werner Koch  <wk@gnupg.de>
+
+       * miscutil.c (asctimestamp): Fix for possible buffer overflow by
+       large system returned date format string.
+
+Fri Dec 31 14:08:15 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * logger.c (log_inc_errorcount): New.
+
+Sat Dec  4 12:30:28 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * iobuf.c (iobuf_cancel): Broadcast the new Cancel mesaage to all
+       filters.
+
+Mon Nov 22 11:14:53 CET 1999  Werner Koch  <wk@gnupg.de>
+
+       * strgutil.c (strcasecmp): New.
+
+       * secmem.c (pool_is_mmapped): Made volatile.
+
+Sat Oct  9 20:34:41 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * Makefile.am:  Removed libtool.
+
+Fri Oct  8 20:32:01 CEST 1999  Werner Koch  <wk@gnupg.de>
+
+       * w32reg.c: New.
+       * simple-gettext.c: Use the Registry to locate the mo file.
+
+       * http.c (send_request): Add support for proxys; suggested by
+       Walter Hofmann.
+       (http_open_document): Pass flags to http_open.
+
+Fri Sep 17 12:56:42 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * secmem.c (lock_pool): Check for ENOSYS return my mlock() on
+       old SCOs.
+
+       * ttyio.c (do_get): Replaced #if __MINGW32__ by #ifdef becuase
+       gcc 2.95.1 assigns a floating point value (0.2) to this macro,
+       which in turn can't be used in an expression.
+
+Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * simple-gettext.c: New.
+
+Wed Sep  1 15:30:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * argparse.c (arg_parse): Add standard options to the dump-options
+       output.
+
+Tue Aug 31 17:20:44 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * strgutil (utf8_to_native): Implemented.
+       (check_utf8_string): Removed.
+
+       * miscutil.c (make_printable_string): Fixed possible buffer overflow.
+       (print_utf8_string): New.
+
+       * ttyio.c (tty_print_utf8_string): New.
+
+Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * secmem.c (pool_okay): declared volatile.
+
+       * miscutil.c (answer_is_yes): Always check for plain "yes".
+       (answer_is_yes_no_quit): Likewise.
+
+       * dotlock.c (create_dotlock): Fixed segv during cleanup.
+
+Mon Jul 12 14:55:34 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * argparse.c (initialize): Init ret_xxx.
+       (optfile_parse): Remove quotes from arguments.
+
+Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * memory.c (membug): Use if either M_DEBUG or M_GUARD is used.
+
+       * miscutil.c (scan_isodatestr): New.
+
+       * logger.c (g10_log_mpidump): Moved to ../mpi/mpicoder.c
+       (g10_log_print_prefix): Renamed from print_prefix and made global.
+
+       * Makefile.am: Support for libtool.
+
+Thu Jul  1 12:47:31 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * miscutil.c (make_printable_string): New.
+
+       * strgutil.c (add_to_strlist2,append_to_strlist2): New.
+
+Tue Jun 29 21:44:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * secmem.c (USE_CAPABILITIES): Capabilities support (Remi).
+
+Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+
+       * dotlock.c (create_dotlock): s/uts/utsbuf/ cause there an Amdahl
+       system with the name UTS (Dave Dykstra).
+
+       * secmem.c (DEFAULT_POOLSIZE): Doubled the size.
+
+Fri Jun 18 00:18:02 CEST 1999 Michael Roth <mroth@nessie.de>
+
+       * iobuf.c: file_filter() Detection of EOF on terminals
+         improved/fixed (see Bug #21).
+
+Mon Jun 14 21:18:54 CEST 1999 Michael Roth <mroth@nessie.de>
+
+       * ttyio.c: tty_no_terminal() new.
+
+Sat Jun  5 15:30:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * strgutil.c (set_native_charset): Support Latin-2
+
+Tue Jun  1 16:01:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * iobuf.c (iobuf_get_real_fname): Made global and now keep a
+       copy of the name in the iobuf struct.
+
+Mon May 31 19:41:10 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * iobuf.c (file_filter,block_filter): Speed patches (Rémi).
+
+Thu May 27 09:40:55 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * miscutil.c (answer_is_yes_no_quit): New.
+
+Sun May 23 14:20:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dotlock.c: Tweaked to make it compile under mingw32
+       * http.c: Disabled for mingw32.
+
+Sat May 22 22:47:26 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * logger.c (log_set_logfile): New.
+
+Thu May 20 14:04:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * memory.c (membug): Nanu, there was a const instead of a static.
+
+       * strgutil.c (trim_trailing_chars): New.
+
+Mon May 17 21:54:43 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * logger.c (g10_log_hexdump): Made 2nd arg a const.
+
+Wed Apr 28 13:03:03 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * miscutil.c (asctimestamp): Use nl_langinfo (Gaël Quéri).
+
+Sun Apr 18 10:11:28 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * argparse.c (store_alias): Disabled becuase it is not used.
+
+       * ttyio.c (tty_batchmode): New
+
+Sat Mar 20 11:44:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * http.c: Swapped to includes.
+
+Tue Mar  2 16:44:57 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * strgutil.c (get_native_charset): New.
+
+Fri Feb 26 17:55:41 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * secmem.c (memblock_struct): Force align (Rémi Guyomarch)
+
+Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * iobuf.c (block_filter): Fixed the oscillating partial packet chunks.
+
+Fri Feb 19 15:49:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * iobuf.c (iobuf_push_filter2): New to allow transer of context
+       ownership to the iobuf. Released the context where needed.
+
+Tue Feb 16 14:10:02 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * strgutil.c (add_to_strglist): Clear the new flags field
+       (append_to_strglist): Ditto.
+
+       * dotlock.c (read_lockfile): terminate pidstr (Michael).
+
+Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dotlock.c (remove_lockfiles): Add cleanup function.
+       (make_dotlock): Add deadlock check.
+
+       * secmem.c (secmem_malloc): Changed error message.
+
+Wed Jan 20 21:40:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * http.c (http_wait_response): Moved the shutdown behind the dup
+
+Wed Jan 20 18:59:49 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * http.c (send_request): Removed double LF
+
+Tue Jan 19 19:34:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * * iobuf.c (iobuf_push_filter): Allow filters for temp streams
+
+       (iobuf_write_temp): Ditto.
+       (iobuf_flush_temp): New.
+       (iobuf_unget_and_close_temp): Removed.
+
+       * http.c (close_http_document): Renamed to http_close().
+       (open_http_document): Renamed to http_open_document().
+       (http_open): New.
+       (http_start_data): New.
+       (http_wait_response): New.
+
+
+Sun Jan 17 11:04:33 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * strgutil.c (trim_trailing_ws): New.
+
+Sat Jan 16 12:03:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * http.c (connect_server): Fixed stupid bug.
+
+Sat Jan 16 09:27:30 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * http.c: New
+
+
+Wed Jan 13 14:10:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * iobuf.c (iobuf_fdopen): New.
+
+Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * secmem.c (lock_pool): add another check that setuid() worked.
+       (secmem_init): Ditto.
+
+Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * iobuf.c (iobuf_clear_eof): Removed.
+       (underflow): Changed the eof handling.
+       (iobuf_pop_filter): Made static and renamed to pop_filter.
+
+       * iobuf.c (iobuf_read_line): New.
+
+Sun Jan  3 15:28:44 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dotlock.c (make_dotlock): print another informal message.
+
+       (make_dotlock): Removed the cpp checks.
+
+
+Tue Dec 29 14:41:47 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * secmem.c: Moved unistd.h out of the #ifdef
+
+       * dotlock.c (make_dotlock): Sun has no SYS_NMLN
+
+       * iobuf.c (iobuf_unget_and_close_temp): Reset .start
+
+Sat Dec 12 18:40:32 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * argparse.c (arg_pars): fixed opts[i] with negative index.
+
+Fri Nov 27 21:37:41 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * dotlock.c: Implemented
+
+Wed Nov 25 11:30:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.c (iobuf_pop_filter): Fixed sigsegv after error.
+
+Thu Nov 19 07:09:55 1998  Werner Koch  <werner.koch@guug.de>
+
+       * miscutil.c (strtimevalue): New.
+
+Tue Nov 10 10:01:53 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * strgutil.c (set_native_charset): New.
+       (native_to_utf8): Now handles koi8-r.
+
+Tue Nov  3 16:17:56 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * strgutil.c (native_to_utf8): New.
+       (utf8_to_native): New, but only as a stub.
+
+       * argparse.c (optfile_parse): Trimmed spaces from args.
+
+
+Wed Oct 28 08:01:49 1998  me,,,  (wk@tobold)
+
+       * argparse.c (find_long_option): New.
+       (arg_parse): option=value is now allowed. Add a new internal
+       option "--dump-options".
+
+Thu Oct 22 16:25:49 1998  Michael Roth (mroth@nessie.de)
+
+       * fileutil.c (make_basename): New.
+       (make_dirname): New.
+
+Wed Oct 21 12:20:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * util.c (iobuf_flush): autoincreasing of a temp. iobuf
+       (iobuf_temp_with_content): New.
+
+Tue Oct 13 12:40:13 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * util.c (.nofast): set this variable
+
+Wed Oct  7 19:27:50 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * memory.c (m_print_stats): New.
+
+Tue Oct  6 09:53:56 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * strgutil.c (memicmp): Add HAVE_MEMICMP.
+
+Mon Sep 21 19:45:01 1998  Werner Koch  (wk@(none))
+
+       * secmem.c: New flags to allow suspend/resume of warnings.
+
+Fri Sep 18 16:25:47 1998  Werner Koch  (wk@(none))
+
+       * secmem.c (lock_pool): Kludge for broken mlock on HPUX 10.20
+
+Tue Sep 15 17:52:21 1998  Werner Koch  (wk@(none))
+
+       * miscutil.c (asctimestamp): New.
+
+Mon Sep 14 09:38:18 1998  Werner Koch  (wk@(none))
+
+       * secmem.c (init_pool): Now mmaps /dev/zero if we do not have MAP_ANON.
+
+Wed Sep  9 13:52:28 1998  Werner Koch  (wk@(none))
+
+       * ttyio.c (do_get): Ctrl-D is now a valid but special character
+
+Mon Sep  7 13:52:41 1998  Werner Koch  (wk@(none))
+
+       * iobuf.c (get_real_fname): New and changed file_filter datastructures
+       and their initialization.
+
+Tue Aug 11 15:12:35 1998  Werner Koch  (wk@(none))
+
+       * miscutil.c (answer_is_yes): i18ned
+
+Sat Aug  8 18:35:00 1998  Werner Koch  (wk@(none))
+
+       * ttyio.c (cleanup): New.
+
+Mon Aug  3 17:06:00 1998  Werner Koch  (wk@(none))
+
+       * secmem.c (MAP_ANON): Add a macro test
+
+Wed Jul 29 14:53:34 1998  Werner Koch  (wk@(none))
+
+       * ttyio.c (tty_get_answer_is_yes): New.
+
+Tue Jul 21 10:35:48 1998  Werner Koch  (wk@(none))
+
+       * argparse.c: New option flag to distinguish options and commands.
+
+Sat Jul 18 19:49:30 1998  Werner Koch  (wk@(none))
+
+       * argparse.c (arg_parse): Added -? as alias for -h
+
+Thu Jul  9 14:47:20 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * secmem.c (secmem_init): Drops setuid if called with 0.
+
+Tue Jul  7 11:49:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * logger.c (log_set_filename): New.
+
+Mon Jul  6 09:03:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * strgutil.c (append_to_strlist): New.
+
+Thu Jul  2 15:55:44 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.c (block_filter): Add writing of OP partial length headers.
+
+Fri Jun 26 10:38:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ttyio.c (do_get): all iso8859-1 characters are now allowed.
+
+Thu Jun 25 15:57:21 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * secmem.c (lock_pool): Removed left over test code.
+
+Wed Jun 10 07:39:41 1998  Werner Koch,mobil,,, (wk@tobold)
+
+       * fileutil.c (compare_filenames): New.
+
+       * argparse.c (arg_parse): New flag bit 6 to ignore --version
+
+Thu May 14 16:45:13 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * argparse.c (show_help): Add some formatting stuff
+
+Fri May  8 17:06:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * errors.c (strerror): New if !HAVE_STRERROR
+
+Mon May  4 19:48:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.c (iobuf_read): Code is now faster.
+       * (iobuf_write): ditto.
+
+Mon Apr 27 11:01:32 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * strgutil.c (memicmp): New.
+
+Thu Mar 19 11:29:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * strgutil.c (memistr): Add const to return and first arg.
+
+Sat Mar  7 11:54:35 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * miscutil.c (print_string): New arg delim; changed all callers.
+
+Thu Mar  5 12:19:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * errors.c: New strings.
+
+Thu Mar  5 12:06:31 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.c (iobuf_open): A name of "-" now opens stdin.
+       * fileutil.c (print_fname_stdout, print_fname_stdin): New.
+
+Fri Feb 27 10:20:03 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * memory.c (m_is_secure): Removed.
+       * secmem.c (m_is_secure): Moved to here.
+
+       * secmem.c (secmem_realloc): New.
+       * memory.c (M_GUARD,EXTRA_ALIGN): New (all functions).
+
+Thu Feb 26 14:36:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * secmem.c (lock_pool): No error if EAGAIN is returned instead
+       of EPERM.
+
+Fri Feb 20 17:43:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * ttyio.c [MINGW32]: Add support for mingw32.
+
+Tue Feb 17 19:43:44 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * memory.c (dump_table_at_exit): New.
+
+Mon Feb 16 10:07:28 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * argparse.c (show_version, show_help, default_strusage): Changed
+       according to GNU standards.
+
+Mon Feb 16 08:58:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.c (iobuf_peek): New
+
+Fri Feb 13 19:34:59 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * iobuf.c (iobuf_seek): Set counters to new offset.
+
+Fri Feb 13 17:13:04 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * logger.c (log_set_name, log_get_name): New.
+       (print_prefix, pgm_name): New, changed all function to make use it.
+       (log_mpidump): Removed the "DBG" prefix.
+       (log_hexdump): Ditto.
+
+       * logger.c (printstr): Removed.
+
+Fri Feb 13 15:14:13 1998  Werner Koch  (wk@isil.d.shuttle.de)
+
+       * argparse.c (show_help): New '\v' kludge.
+
+
+
+ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+          2005 Free Software Foundation, Inc.
+
+ This file is free software; as a special exception the author gives
+ unlimited permission to copy and/or distribute it, with or without
+ modifications, as long as this notice is preserved.
+
+ This 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.
+
+
diff --git a/util/Makefile.am b/util/Makefile.am
new file mode 100644 (file)
index 0000000..1da5a10
--- /dev/null
@@ -0,0 +1,82 @@
+# Copyright (C) 1998, 1999, 2000, 2001, 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I.. -I$(top_srcdir)/include -I$(top_srcdir)/intl
+
+noinst_LIBRARIES = libutil.a libcompat.a
+
+libutil_a_SOURCES = logger.c fileutil.c miscutil.c strgutil.c \
+                   ttyio.c argparse.c memory.c secmem.c errors.c iobuf.c \
+                   dotlock.c http.c pka.c membuf.c cert.c \
+                   $(libcompat_a_SOURCES)
+
+if USE_SIMPLE_GETTEXT
+libutil_a_SOURCES+=simple-gettext.c
+endif
+
+if HAVE_W32_SYSTEM
+libutil_a_SOURCES+=w32reg.c
+endif
+
+if ENABLE_AGENT_SUPPORT
+libutil_a_SOURCES+=assuan-buffer.c assuan-client.c assuan-defs.h \
+                   assuan-errors.c assuan-logging.c assuan-socket-connect.c \
+                  assuan-connect.c assuan-socket.c assuan-util.c
+endif
+
+if USE_INTERNAL_REGEX
+libutil_a_SOURCES+=regex.c
+endif
+
+if USE_DNS_SRV
+libutil_a_SOURCES+=srv.c srv.h
+endif
+
+# The internal regex code #includes these.
+EXTRA_libutil_a_SOURCES = regcomp.c regexec.c regex_internal.c \
+                         regex_internal.h
+
+# LIBOBJS and libcompat.a are for the replacement functions and
+# similar simple stuff.  They're segregated in libcompat so we can
+# link it to the keyserver helpers which have different licensing.
+# libutil.a, by definition, includes everything that libcompat.a does.
+
+libutil_a_DEPENDENCIES = @LIBOBJS@
+libutil_a_LIBADD = @LIBOBJS@
+
+libcompat_a_SOURCES=compat.c
+libcompat_a_DEPENDENCIES = @LIBOBJS@
+libcompat_a_LIBADD = @LIBOBJS@
+
+http-test:  http.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+           -DTEST -o http-test http.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+
+srv-test:  srv.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+           -DTEST -o srv-test srv.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+
+pka-test:  pka.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+          -DTEST -o pka-test pka.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+
+cert-test:  cert.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+          -DTEST -o cert-test cert.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
diff --git a/util/Makefile.in b/util/Makefile.in
new file mode 100644 (file)
index 0000000..2c41844
--- /dev/null
@@ -0,0 +1,641 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Copyright (C) 1998, 1999, 2000, 2001, 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 2 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@USE_SIMPLE_GETTEXT_TRUE@am__append_1 = simple-gettext.c
+@HAVE_W32_SYSTEM_TRUE@am__append_2 = w32reg.c
+@ENABLE_AGENT_SUPPORT_TRUE@am__append_3 = assuan-buffer.c assuan-client.c assuan-defs.h \
+@ENABLE_AGENT_SUPPORT_TRUE@                   assuan-errors.c assuan-logging.c assuan-socket-connect.c \
+@ENABLE_AGENT_SUPPORT_TRUE@               assuan-connect.c assuan-socket.c assuan-util.c
+
+@USE_INTERNAL_REGEX_TRUE@am__append_4 = regex.c
+@USE_DNS_SRV_TRUE@am__append_5 = srv.c srv.h
+subdir = util
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog \
+       isascii.c memrchr.c mkdtemp.c strsep.c timegm.c
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libcompat_a_AR = $(AR) $(ARFLAGS)
+am_libcompat_a_OBJECTS = compat.$(OBJEXT)
+libcompat_a_OBJECTS = $(am_libcompat_a_OBJECTS)
+libutil_a_AR = $(AR) $(ARFLAGS)
+am__libutil_a_SOURCES_DIST = logger.c fileutil.c miscutil.c strgutil.c \
+       ttyio.c argparse.c memory.c secmem.c errors.c iobuf.c \
+       dotlock.c http.c pka.c membuf.c cert.c compat.c \
+       simple-gettext.c w32reg.c assuan-buffer.c assuan-client.c \
+       assuan-defs.h assuan-errors.c assuan-logging.c \
+       assuan-socket-connect.c assuan-connect.c assuan-socket.c \
+       assuan-util.c regex.c srv.c srv.h
+am__objects_1 = compat.$(OBJEXT)
+@USE_SIMPLE_GETTEXT_TRUE@am__objects_2 = simple-gettext.$(OBJEXT)
+@HAVE_W32_SYSTEM_TRUE@am__objects_3 = w32reg.$(OBJEXT)
+@ENABLE_AGENT_SUPPORT_TRUE@am__objects_4 = assuan-buffer.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-client.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-errors.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-logging.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-socket-connect.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-connect.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-socket.$(OBJEXT) \
+@ENABLE_AGENT_SUPPORT_TRUE@    assuan-util.$(OBJEXT)
+@USE_INTERNAL_REGEX_TRUE@am__objects_5 = regex.$(OBJEXT)
+@USE_DNS_SRV_TRUE@am__objects_6 = srv.$(OBJEXT)
+am_libutil_a_OBJECTS = logger.$(OBJEXT) fileutil.$(OBJEXT) \
+       miscutil.$(OBJEXT) strgutil.$(OBJEXT) ttyio.$(OBJEXT) \
+       argparse.$(OBJEXT) memory.$(OBJEXT) secmem.$(OBJEXT) \
+       errors.$(OBJEXT) iobuf.$(OBJEXT) dotlock.$(OBJEXT) \
+       http.$(OBJEXT) pka.$(OBJEXT) membuf.$(OBJEXT) cert.$(OBJEXT) \
+       $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+       $(am__objects_4) $(am__objects_5) $(am__objects_6)
+libutil_a_OBJECTS = $(am_libutil_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libcompat_a_SOURCES) $(libutil_a_SOURCES) \
+       $(EXTRA_libutil_a_SOURCES)
+DIST_SOURCES = $(libcompat_a_SOURCES) $(am__libutil_a_SOURCES_DIST) \
+       $(EXTRA_libutil_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+INCLUDES = -I.. -I$(top_srcdir)/include -I$(top_srcdir)/intl
+noinst_LIBRARIES = libutil.a libcompat.a
+libutil_a_SOURCES = logger.c fileutil.c miscutil.c strgutil.c ttyio.c \
+       argparse.c memory.c secmem.c errors.c iobuf.c dotlock.c http.c \
+       pka.c membuf.c cert.c $(libcompat_a_SOURCES) $(am__append_1) \
+       $(am__append_2) $(am__append_3) $(am__append_4) \
+       $(am__append_5)
+
+# The internal regex code #includes these.
+EXTRA_libutil_a_SOURCES = regcomp.c regexec.c regex_internal.c \
+                         regex_internal.h
+
+
+# LIBOBJS and libcompat.a are for the replacement functions and
+# similar simple stuff.  They're segregated in libcompat so we can
+# link it to the keyserver helpers which have different licensing.
+# libutil.a, by definition, includes everything that libcompat.a does.
+libutil_a_DEPENDENCIES = @LIBOBJS@
+libutil_a_LIBADD = @LIBOBJS@
+libcompat_a_SOURCES = compat.c
+libcompat_a_DEPENDENCIES = @LIBOBJS@
+libcompat_a_LIBADD = @LIBOBJS@
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  util/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  util/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libcompat.a: $(libcompat_a_OBJECTS) $(libcompat_a_DEPENDENCIES) 
+       -rm -f libcompat.a
+       $(libcompat_a_AR) libcompat.a $(libcompat_a_OBJECTS) $(libcompat_a_LIBADD)
+       $(RANLIB) libcompat.a
+libutil.a: $(libutil_a_OBJECTS) $(libutil_a_DEPENDENCIES) 
+       -rm -f libutil.a
+       $(libutil_a_AR) libutil.a $(libutil_a_OBJECTS) $(libutil_a_LIBADD)
+       $(RANLIB) libutil.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/isascii.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memrchr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkdtemp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strsep.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/timegm.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-buffer.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-client.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-connect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-errors.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-logging.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-socket-connect.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-socket.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assuan-util.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cert.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compat.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dotlock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errors.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fileutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iobuf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logger.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/membuf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miscutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pka.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regcomp.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex_internal.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexec.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/secmem.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple-gettext.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/srv.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strgutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ttyio.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/w32reg.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf $(DEPDIR) ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf $(DEPDIR) ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+
+http-test:  http.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+           -DTEST -o http-test http.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+
+srv-test:  srv.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+           -DTEST -o srv-test srv.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+
+pka-test:  pka.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+          -DTEST -o pka-test pka.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+
+cert-test:  cert.c
+       cc -DHAVE_CONFIG_H -I. -I. -I.. $(INCLUDES) $(LDFLAGS) -g -Wall \
+          -DTEST -o cert-test cert.c libutil.a @LIBINTL@ @DNSLIBS@ @CAPLIBS@
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/util/argparse.c b/util/argparse.c
new file mode 100644 (file)
index 0000000..cdc56bf
--- /dev/null
@@ -0,0 +1,1004 @@
+/* [argparse.c wk 17.06.97] Argument Parser for option handling
+ *  Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *                2004 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 2 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, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ *
+ * Note: This is an independent version of the one in WkLib
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "util.h"
+#include "i18n.h"
+
+
+/*********************************
+ * @Summary arg_parse
+ *  #include <wk/lib.h>
+ *
+ *  typedef struct {
+ *     char *argc;               pointer to argc (value subject to change)
+ *     char ***argv;             pointer to argv (value subject to change)
+ *     unsigned flags;           Global flags (DO NOT CHANGE)
+ *     int err;                  print error about last option
+ *                               1 = warning, 2 = abort
+ *     int r_opt;                return option
+ *     int r_type;               type of return value (0 = no argument found)
+ *     union {
+ *         int   ret_int;
+ *         long  ret_long
+ *         ulong ret_ulong;
+ *         char *ret_str;
+ *     } r;                      Return values
+ *     struct {
+ *         int idx;
+ *         const char *last;
+ *         void *aliases;
+ *     } internal;               DO NOT CHANGE
+ *  } ARGPARSE_ARGS;
+ *
+ *  typedef struct {
+ *     int         short_opt;
+ *     const char *long_opt;
+ *     unsigned flags;
+ *  } ARGPARSE_OPTS;
+ *
+ *  int arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts );
+ *
+ * @Description
+ *  This is my replacement for getopt(). See the example for a typical usage.
+ *  Global flags are:
+ *     Bit 0 : Do not remove options form argv
+ *     Bit 1 : Do not stop at last option but return other args
+ *            with r_opt set to -1.
+ *     Bit 2 : Assume options and real args are mixed.
+ *     Bit 3 : Do not use -- to stop option processing.
+ *     Bit 4 : Do not skip the first arg.
+ *     Bit 5 : allow usage of long option with only one dash
+ *     Bit 6 : ignore --version and --help
+ *     all other bits must be set to zero, this value is modified by the
+ *     function, so assume this is write only.
+ *  Local flags (for each option):
+ *     Bit 2-0 : 0 = does not take an argument
+ *              1 = takes int argument
+ *              2 = takes string argument
+ *              3 = takes long argument
+ *              4 = takes ulong argument
+ *     Bit 3 : argument is optional (r_type will the be set to 0)
+ *     Bit 4 : allow 0x etc. prefixed values.
+ *     Bit 7 : this is a command and not an option
+ *  You stop the option processing by setting opts to NULL, the function will
+ *  then return 0.
+ * @Return Value
+ *   Returns the args.r_opt or 0 if ready
+ *   r_opt may be -2/-7 to indicate an unknown option/command.
+ * @See Also
+ *   ArgExpand
+ * @Notes
+ *  You do not need to process the options 'h', '--help' or '--version'
+ *  because this function includes standard help processing; but if you
+ *  specify '-h', '--help' or '--version' you have to do it yourself.
+ *  The option '--' stops argument processing; if bit 1 is set the function
+ *  continues to return normal arguments.
+ *  To process float args or unsigned args you must use a string args and do
+ *  the conversion yourself.
+ * @Example
+ *
+ *     ARGPARSE_OPTS opts[] = {
+ *     { 'v', "verbose",   0 },
+ *     { 'd', "debug",     0 },
+ *     { 'o', "output",    2 },
+ *     { 'c', "cross-ref", 2|8 },
+ *     { 'm', "my-option", 1|8 },
+ *     { 500, "have-no-short-option-for-this-long-option", 0 },
+ *     {0} };
+ *     ARGPARSE_ARGS pargs = { &argc, &argv, 0 }
+ *
+ *     while( ArgParse( &pargs, &opts) ) {
+ *        switch( pargs.r_opt ) {
+ *          case 'v': opt.verbose++; break;
+ *          case 'd': opt.debug++; break;
+ *          case 'o': opt.outfile = pargs.r.ret_str; break;
+ *          case 'c': opt.crf = pargs.r_type? pargs.r.ret_str:"a.crf"; break;
+ *          case 'm': opt.myopt = pargs.r_type? pargs.r.ret_int : 1; break;
+ *          case 500: opt.a_long_one++;  break
+ *          default : pargs.err = 1; break; -- force warning output --
+ *        }
+ *     }
+ *     if( argc > 1 )
+ *        log_fatal( "Too many args");
+ *
+ */
+
+typedef struct alias_def_s *ALIAS_DEF;
+struct alias_def_s {
+    ALIAS_DEF next;
+    char *name;   /* malloced buffer with name, \0, value */
+    const char *value; /* ptr into name */
+};
+
+static int  set_opt_arg(ARGPARSE_ARGS *arg, unsigned flags, char *s);
+static void show_help(ARGPARSE_OPTS *opts, unsigned flags);
+static void show_version(void);
+
+static void
+initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno )
+{
+    if( !(arg->flags & (1<<15)) ) { /* initialize this instance */
+       arg->internal.idx = 0;
+       arg->internal.last = NULL;
+       arg->internal.inarg = 0;
+       arg->internal.stopped = 0;
+       arg->internal.aliases = NULL;
+       arg->internal.cur_alias = NULL;
+       arg->err = 0;
+       arg->flags |= 1<<15; /* mark initialized */
+       if( *arg->argc < 0 )
+           log_bug("Invalid argument for ArgParse\n");
+    }
+
+
+    if( arg->err ) { /* last option was erroneous */
+
+       if( filename ) {
+           if( arg->r_opt == -6 )
+             log_error("%s:%u: argument not expected\n", filename, *lineno );
+           else if( arg->r_opt == -5 )
+             log_error("%s:%u: read error\n", filename, *lineno );
+           else if( arg->r_opt == -4 )
+             log_error("%s:%u: keyword too long\n", filename, *lineno );
+           else if( arg->r_opt == -3 )
+             log_error("%s:%u: missing argument\n", filename, *lineno );
+           else if( arg->r_opt == -7 )
+             log_error("%s:%u: invalid command\n", filename, *lineno );
+           else if( arg->r_opt == -10 )
+             log_error("%s:%u: invalid alias definition\n",filename,*lineno);
+           else
+             log_error("%s:%u: invalid option\n", filename, *lineno );
+       }
+       else {
+           if( arg->r_opt == -3 )
+             log_error("Missing argument for option \"%.50s\"\n",
+                       arg->internal.last? arg->internal.last:"[??]" );
+           else if( arg->r_opt == -6 )
+             log_error("Option \"%.50s\" does not expect an argument\n",
+                       arg->internal.last? arg->internal.last:"[??]" );
+           else if( arg->r_opt == -7 )
+             log_error("Invalid command \"%.50s\"\n",
+                       arg->internal.last? arg->internal.last:"[??]" );
+           else if( arg->r_opt == -8 )
+             log_error("Option \"%.50s\" is ambiguous\n",
+                       arg->internal.last? arg->internal.last:"[??]" );
+           else if( arg->r_opt == -9 )
+             log_error("Command \"%.50s\" is ambiguous\n",
+                       arg->internal.last? arg->internal.last:"[??]" );
+           else
+             log_error("Invalid option \"%.50s\"\n",
+                       arg->internal.last? arg->internal.last:"[??]" );
+       }
+       if( arg->err != 1 || arg->r_opt == -5 )
+           exit(2);
+       arg->err = 0;
+    }
+
+    /* clearout the return value union */
+    arg->r.ret_str = NULL;
+    arg->r.ret_long= 0;
+}
+
+
+static void
+store_alias( ARGPARSE_ARGS *arg, char *name, char *value )
+{
+    /* TODO: replace this dummy function with a rea one
+     * and fix the probelms IRIX has with (ALIAS_DEV)arg..
+     * used as lvalue
+     */
+#if 0
+    ALIAS_DEF a = xmalloc( sizeof *a );
+    a->name = name;
+    a->value = value;
+    a->next = (ALIAS_DEF)arg->internal.aliases;
+    (ALIAS_DEF)arg->internal.aliases = a;
+#endif
+}
+
+/****************
+ * Get options from a file.
+ * Lines starting with '#' are comment lines.
+ * Syntax is simply a keyword and the argument.
+ * Valid keywords are all keywords from the long_opt list without
+ * the leading dashes. The special keywords "help", "warranty" and "version"
+ * are not valid here.
+ * The special keyword "alias" may be used to store alias definitions,
+ * which are later expanded like long options.
+ * Caller must free returned strings.
+ * If called with FP set to NULL command line args are parse instead.
+ *
+ * Q: Should we allow the syntax
+ *     keyword = value
+ *    and accept for boolean options a value of 1/0, yes/no or true/false?
+ * Note: Abbreviation of options is here not allowed.
+ */
+int
+optfile_parse( FILE *fp, const char *filename, unsigned *lineno,
+              ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts)
+{
+    int state, i, c;
+    int idx=0;
+    char keyword[100];
+    char *buffer = NULL;
+    size_t buflen = 0;
+    int inverse=0;
+    int in_alias=0;
+
+    if( !fp ) /* same as arg_parse() in this case */
+       return arg_parse( arg, opts );
+
+    initialize( arg, filename, lineno );
+
+    /* find the next keyword */
+    state = i = 0;
+    for(;;) {
+       c=getc(fp);
+       if( c == '\n' || c== EOF ) {
+           if( c != EOF )
+               ++*lineno;
+           if( state == -1 )
+               break;
+           else if( state == 2 ) {
+               keyword[i] = 0;
+               for(i=0; opts[i].short_opt; i++ )
+                   if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
+                       break;
+               idx = i;
+               arg->r_opt = opts[idx].short_opt;
+               if( inverse ) /* this does not have an effect, hmmm */
+                   arg->r_opt = -arg->r_opt;
+               if( !opts[idx].short_opt )   /* unknown command/option */
+                   arg->r_opt = (opts[idx].flags & 256)? -7:-2;
+               else if( !(opts[idx].flags & 7) ) /* does not take an arg */
+                   arg->r_type = 0;           /* okay */
+               else if( (opts[idx].flags & 8) )  /* argument is optional */
+                    arg->r_type = 0;          /* okay */
+               else                           /* required argument */
+                   arg->r_opt = -3;           /* error */
+               break;
+           }
+           else if( state == 3 ) {            /* no argument found */
+               if( in_alias )
+                   arg->r_opt = -3;           /* error */
+               else if( !(opts[idx].flags & 7) ) /* does not take an arg */
+                   arg->r_type = 0;           /* okay */
+               else if( (opts[idx].flags & 8) )  /* no optional argument */
+                   arg->r_type = 0;           /* okay */
+               else                           /* no required argument */
+                   arg->r_opt = -3;           /* error */
+               break;
+           }
+           else if( state == 4 ) {     /* have an argument */
+               if( in_alias ) {
+                   if( !buffer )
+                       arg->r_opt = -6;
+                   else {
+                       char *p;
+
+                       buffer[i] = 0;
+                       p = strpbrk( buffer, " \t" );
+                       if( p ) {
+                           *p++ = 0;
+                           trim_spaces( p );
+                       }
+                       if( !p || !*p ) {
+                           xfree( buffer );
+                           arg->r_opt = -10;
+                       }
+                       else {
+                           store_alias( arg, buffer, p );
+                       }
+                   }
+               }
+               else if( !(opts[idx].flags & 7) )  /* does not take an arg */
+                   arg->r_opt = -6;        /* error */
+               else {
+                   char *p;
+                   if( !buffer ) {
+                       keyword[i] = 0;
+                       buffer = xstrdup(keyword);
+                   }
+                   else
+                       buffer[i] = 0;
+
+                   trim_spaces( buffer );
+                   p = buffer;
+                   /* remove quotes if they totally enclose the
+                       string, and do not occur within the string */
+                   if( *p == '"' && p[strlen(p)-1]=='"') {
+                       char *p2=p;
+
+                       while(*(++p2))
+                         if(*p2=='"')
+                           break;
+
+                       if(*p2=='"' && *(p2+1)=='\0') {
+                         p[strlen(p)-1] = 0;
+                         p++;
+                       }
+                   }
+                   if( !set_opt_arg(arg, opts[idx].flags, p) )
+                       xfree(buffer);
+               }
+               break;
+           }
+           else if( c == EOF ) {
+               if( ferror(fp) )
+                   arg->r_opt = -5;   /* read error */
+               else
+                   arg->r_opt = 0;    /* eof */
+               break;
+           }
+           state = 0;
+           i = 0;
+       }
+       else if( state == -1 )
+           ; /* skip */
+       else if( !state && isspace(c) )
+           ; /* skip leading white space */
+       else if( !state && c == '#' )
+           state = 1;  /* start of a comment */
+       else if( state == 1 )
+           ; /* skip comments */
+       else if( state == 2 && isspace(c) ) {
+           keyword[i] = 0;
+           for(i=0; opts[i].short_opt; i++ )
+               if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
+                   break;
+           idx = i;
+           arg->r_opt = opts[idx].short_opt;
+           if( !opts[idx].short_opt ) {
+               if( !strcmp( keyword, "alias" ) ) {
+                   in_alias = 1;
+                   state = 3;
+               }
+               else {
+                   arg->r_opt = (opts[idx].flags & 256)? -7:-2;
+                   state = -1;        /* skip rest of line and leave */
+               }
+           }
+           else
+               state = 3;
+       }
+       else if( state == 3 ) { /* skip leading spaces of the argument */
+           if( !isspace(c) ) {
+               i = 0;
+               keyword[i++] = c;
+               state = 4;
+           }
+       }
+       else if( state == 4 ) { /* collect the argument */
+           if( buffer ) {
+               if( i < buflen-1 )
+                   buffer[i++] = c;
+               else {
+                   buflen += 50;
+                   buffer = xrealloc(buffer, buflen);
+                   buffer[i++] = c;
+               }
+           }
+           else if( i < DIM(keyword)-1 )
+               keyword[i++] = c;
+           else {
+               buflen = DIM(keyword)+50;
+               buffer = xmalloc(buflen);
+               memcpy(buffer, keyword, i);
+               buffer[i++] = c;
+           }
+       }
+       else if( i >= DIM(keyword)-1 ) {
+           arg->r_opt = -4;   /* keyword to long */
+           state = -1;        /* skip rest of line and leave */
+       }
+       else {
+           keyword[i++] = c;
+           state = 2;
+       }
+    }
+
+    return arg->r_opt;
+}
+
+
+
+static int
+find_long_option( ARGPARSE_ARGS *arg,
+                 ARGPARSE_OPTS *opts, const char *keyword )
+{
+    int i;
+    size_t n;
+
+    /* Would be better if we can do a binary search, but it is not
+       possible to reorder our option table because we would mess
+       up our help strings - What we can do is: Build a nice option
+       lookup table wehn this function is first invoked */
+    if( !*keyword )
+       return -1;
+    for(i=0; opts[i].short_opt; i++ )
+       if( opts[i].long_opt && !strcmp( opts[i].long_opt, keyword) )
+           return i;
+#if 0
+    {
+       ALIAS_DEF a;
+       /* see whether it is an alias */
+       for( a = args->internal.aliases; a; a = a->next ) {
+           if( !strcmp( a->name, keyword) ) {
+               /* todo: must parse the alias here */
+               args->internal.cur_alias = a;
+               return -3; /* alias available */
+           }
+       }
+    }
+#endif
+    /* not found, see whether it is an abbreviation */
+    /* aliases may not be abbreviated */
+    n = strlen( keyword );
+    for(i=0; opts[i].short_opt; i++ ) {
+       if( opts[i].long_opt && !strncmp( opts[i].long_opt, keyword, n ) ) {
+           int j;
+           for(j=i+1; opts[j].short_opt; j++ ) {
+               if( opts[j].long_opt
+                   && !strncmp( opts[j].long_opt, keyword, n ) )
+                   return -2;  /* abbreviation is ambiguous */
+           }
+           return i;
+       }
+    }
+    return -1;
+}
+
+int
+arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts)
+{
+    int idx;
+    int argc;
+    char **argv;
+    char *s, *s2;
+    int i;
+
+    initialize( arg, NULL, NULL );
+    argc = *arg->argc;
+    argv = *arg->argv;
+    idx = arg->internal.idx;
+
+    if( !idx && argc && !(arg->flags & (1<<4)) ) { /* skip the first entry */
+       argc--; argv++; idx++;
+    }
+
+  next_one:
+    if( !argc ) { /* no more args */
+       arg->r_opt = 0;
+       goto leave; /* ready */
+    }
+
+    s = *argv;
+    arg->internal.last = s;
+
+    if( arg->internal.stopped && (arg->flags & (1<<1)) ) {
+       arg->r_opt = -1;  /* not an option but a argument */
+       arg->r_type = 2;
+       arg->r.ret_str = s;
+       argc--; argv++; idx++; /* set to next one */
+    }
+    else if( arg->internal.stopped ) { /* ready */
+       arg->r_opt = 0;
+       goto leave;
+    }
+    else if( *s == '-' && s[1] == '-' ) { /* long option */
+       char *argpos;
+
+       arg->internal.inarg = 0;
+       if( !s[2] && !(arg->flags & (1<<3)) ) { /* stop option processing */
+           arg->internal.stopped = 1;
+           argc--; argv++; idx++;
+           goto next_one;
+       }
+
+       argpos = strchr( s+2, '=' );
+       if( argpos )
+           *argpos = 0;
+       i = find_long_option( arg, opts, s+2 );
+       if( argpos )
+           *argpos = '=';
+
+       if( i < 0 && !strcmp( "help", s+2) ) {
+           if( !(arg->flags & (1<<6)) ) {
+               show_help(opts, arg->flags);
+           }
+       }
+       else if( i < 0 && !strcmp( "version", s+2) ) {
+           if( !(arg->flags & (1<<6)) ) {
+               show_version();
+               exit(0);
+           }
+       }
+       else if( i < 0 && !strcmp( "warranty", s+2) ) {
+           puts( strusage(16) );
+           exit(0);
+       }
+       else if( i < 0 && !strcmp( "dump-options", s+2) ) {
+           for(i=0; opts[i].short_opt; i++ ) {
+               if( opts[i].long_opt )
+                   printf( "--%s\n", opts[i].long_opt );
+           }
+           fputs("--dump-options\n--help\n--version\n--warranty\n", stdout );
+           exit(0);
+       }
+
+       if( i == -2 ) /* ambiguous option */
+           arg->r_opt = -8;
+       else if( i == -1 ) {
+           arg->r_opt = -2;
+           arg->r.ret_str = s+2;
+       }
+       else
+           arg->r_opt = opts[i].short_opt;
+       if( i < 0 )
+           ;
+       else if( (opts[i].flags & 7) ) {
+           if( argpos ) {
+               s2 = argpos+1;
+               if( !*s2 )
+                   s2 = NULL;
+           }
+           else
+               s2 = argv[1];
+           if( !s2 && (opts[i].flags & 8) ) { /* no argument but it is okay*/
+               arg->r_type = 0;               /* because it is optional */
+           }
+           else if( !s2 ) {
+               arg->r_opt = -3; /* missing argument */
+           }
+           else if( !argpos && *s2 == '-' && (opts[i].flags & 8) ) {
+               /* the argument is optional and the next seems to be
+                * an option. We do not check this possible option
+                * but assume no argument */
+               arg->r_type = 0;
+           }
+           else {
+               set_opt_arg(arg, opts[i].flags, s2);
+               if( !argpos ) {
+                   argc--; argv++; idx++; /* skip one */
+               }
+           }
+       }
+       else { /* does not take an argument */
+           if( argpos )
+               arg->r_type = -6; /* argument not expected */
+           else
+               arg->r_type = 0;
+       }
+       argc--; argv++; idx++; /* set to next one */
+    }
+    else if( (*s == '-' && s[1]) || arg->internal.inarg ) { /* short option */
+       int dash_kludge = 0;
+       i = 0;
+       if( !arg->internal.inarg ) {
+           arg->internal.inarg++;
+           if( arg->flags & (1<<5) ) {
+               for(i=0; opts[i].short_opt; i++ )
+                   if( opts[i].long_opt && !strcmp( opts[i].long_opt, s+1)) {
+                       dash_kludge=1;
+                       break;
+                   }
+           }
+       }
+       s += arg->internal.inarg;
+
+       if( !dash_kludge ) {
+           for(i=0; opts[i].short_opt; i++ )
+               if( opts[i].short_opt == *s )
+                   break;
+       }
+
+       if( !opts[i].short_opt && ( *s == 'h' || *s == '?' ) ) {
+           if( !(arg->flags & (1<<6)) ) {
+               show_help(opts, arg->flags);
+           }
+       }
+
+       arg->r_opt = opts[i].short_opt;
+       if( !opts[i].short_opt ) {
+           arg->r_opt = (opts[i].flags & 256)? -7:-2;
+           arg->internal.inarg++; /* point to the next arg */
+           arg->r.ret_str = s;
+       }
+       else if( (opts[i].flags & 7) ) {
+           if( s[1] && !dash_kludge ) {
+               s2 = s+1;
+               set_opt_arg(arg, opts[i].flags, s2);
+           }
+           else {
+               s2 = argv[1];
+               if( !s2 && (opts[i].flags & 8) ) { /* no argument but it is okay*/
+                   arg->r_type = 0;               /* because it is optional */
+               }
+               else if( !s2 ) {
+                   arg->r_opt = -3; /* missing argument */
+               }
+               else if( *s2 == '-' && s2[1] && (opts[i].flags & 8) ) {
+                   /* the argument is optional and the next seems to be
+                    * an option. We do not check this possible option
+                    * but assume no argument */
+                   arg->r_type = 0;
+               }
+               else {
+                   set_opt_arg(arg, opts[i].flags, s2);
+                   argc--; argv++; idx++; /* skip one */
+               }
+           }
+           s = "x"; /* so that !s[1] yields false */
+       }
+       else { /* does not take an argument */
+           arg->r_type = 0;
+           arg->internal.inarg++; /* point to the next arg */
+       }
+       if( !s[1] || dash_kludge ) { /* no more concatenated short options */
+           arg->internal.inarg = 0;
+           argc--; argv++; idx++;
+       }
+    }
+    else if( arg->flags & (1<<2) ) {
+       arg->r_opt = -1;  /* not an option but a argument */
+       arg->r_type = 2;
+       arg->r.ret_str = s;
+       argc--; argv++; idx++; /* set to next one */
+    }
+    else {
+       arg->internal.stopped = 1; /* stop option processing */
+       goto next_one;
+    }
+
+  leave:
+    *arg->argc = argc;
+    *arg->argv = argv;
+    arg->internal.idx = idx;
+    return arg->r_opt;
+}
+
+
+
+static int
+set_opt_arg(ARGPARSE_ARGS *arg, unsigned flags, char *s)
+{
+    int base = (flags & 16)? 0 : 10;
+
+    switch( arg->r_type = (flags & 7) ) {
+      case 1: /* takes int argument */
+       arg->r.ret_int = (int)strtol(s,NULL,base);
+       return 0;
+      case 3: /* takes long argument   */
+       arg->r.ret_long= strtol(s,NULL,base);
+       return 0;
+      case 4: /* takes ulong argument  */
+       arg->r.ret_ulong= strtoul(s,NULL,base);
+       return 0;
+      case 2: /* takes string argument */
+      default:
+       arg->r.ret_str = s;
+       return 1;
+    }
+}
+
+
+static size_t
+long_opt_strlen( ARGPARSE_OPTS *o )
+{
+    size_t n = strlen(o->long_opt);
+
+    if( o->description && *o->description == '|' ) {
+       const char *s;
+
+       s=o->description+1;
+       if( *s != '=' )
+           n++;
+       for(; *s && *s != '|'; s++ )
+           n++;
+    }
+    return n;
+}
+
+/****************
+ * Print formatted help. The description string has some special
+ * meanings:
+ *  - A description string which is "@" suppresses help output for
+ *    this option
+ *  - a description,ine which starts with a '@' and is followed by
+ *    any other characters is printed as is; this may be used for examples
+ *    ans such.
+ *  - A description which starts with a '|' outputs the string between this
+ *    bar and the next one as arguments of the long option.
+ */
+static void
+show_help( ARGPARSE_OPTS *opts, unsigned flags )
+{
+    const char *s;
+
+    show_version();
+    putchar('\n');
+    s = strusage(41);
+    puts(s);
+    if( opts[0].description ) { /* auto format the option description */
+       int i,j, indent;
+       /* get max. length of long options */
+       for(i=indent=0; opts[i].short_opt; i++ ) {
+           if( opts[i].long_opt )
+               if( !opts[i].description || *opts[i].description != '@' )
+                   if( (j=long_opt_strlen(opts+i)) > indent && j < 35 )
+                        indent = j;
+       }
+       /* example: " -v, --verbose   Viele Sachen ausgeben" */
+       indent += 10;
+       if( *opts[0].description != '@' )
+           puts("Options:");
+       for(i=0; opts[i].short_opt; i++ ) {
+           s = _( opts[i].description );
+           if( s && *s== '@' && !s[1] ) /* hide this line */
+               continue;
+           if( s && *s == '@' ) { /* unindented comment only line */
+               for(s++; *s; s++ ) {
+                   if( *s == '\n' ) {
+                       if( s[1] )
+                           putchar('\n');
+                   }
+                   else
+                       putchar(*s);
+               }
+               putchar('\n');
+               continue;
+           }
+
+           j = 3;
+           if( opts[i].short_opt < 256 ) {
+               printf(" -%c", opts[i].short_opt );
+               if( !opts[i].long_opt ) {
+                   if(s && *s == '|' ) {
+                       putchar(' '); j++;
+                       for(s++ ; *s && *s != '|'; s++, j++ )
+                           putchar(*s);
+                       if( *s )
+                           s++;
+                   }
+               }
+           }
+           else
+               fputs("   ", stdout);
+           if( opts[i].long_opt ) {
+               j += printf("%c --%s", opts[i].short_opt < 256?',':' ',
+                                      opts[i].long_opt );
+               if(s && *s == '|' ) {
+                   if( *++s != '=' ) {
+                       putchar(' ');
+                       j++;
+                   }
+                   for( ; *s && *s != '|'; s++, j++ )
+                       putchar(*s);
+                   if( *s )
+                       s++;
+               }
+               fputs("   ", stdout);
+               j += 3;
+           }
+           for(;j < indent; j++ )
+               putchar(' ');
+           if( s ) {
+               if( *s && j > indent ) {
+                   putchar('\n');
+                   for(j=0;j < indent; j++ )
+                       putchar(' ');
+               }
+               for(; *s; s++ ) {
+                   if( *s == '\n' ) {
+                       if( s[1] ) {
+                           putchar('\n');
+                           for(j=0;j < indent; j++ )
+                               putchar(' ');
+                       }
+                   }
+                   else
+                       putchar(*s);
+               }
+           }
+           putchar('\n');
+       }
+       if( flags & 32 )
+           puts("\n(A single dash may be used instead of the double ones)");
+    }
+    if( (s=strusage(19)) ) {  /* bug reports to ... */
+       putchar('\n');
+       fputs(s, stdout);
+    }
+    fflush(stdout);
+    exit(0);
+}
+
+static void
+show_version()
+{
+    const char *s;
+    int i;
+    /* version line */
+    fputs(strusage(11), stdout);
+    if( (s=strusage(12)) )
+       printf(" (%s)", s );
+    printf(" %s\n", strusage(13) );
+    /* additional version lines */
+    for(i=20; i < 30; i++ )
+       if( (s=strusage(i)) )
+           printf("%s\n", s );
+    /* copyright string */
+    if( (s=strusage(14)) )
+       printf("%s\n", s );
+    /* copying conditions */
+    if( (s=strusage(15)) )
+       fputs(s, stdout);
+    /* thanks */
+    if( (s=strusage(18)) )
+       fputs(s, stdout);
+    /* additional program info */
+    for(i=30; i < 40; i++ )
+       if( (s=strusage(i)) )
+           fputs( (const byte*)s, stdout);
+    fflush(stdout);
+}
+
+
+void
+usage( int level )
+{
+    if( !level ) {
+       fprintf(stderr,"%s %s; %s\n", strusage(11), strusage(13),
+                                                    strusage(14) );
+       fflush(stderr);
+    }
+    else if( level == 1 ) {
+       fputs(strusage(40),stderr);
+       exit(2);
+    }
+    else if( level == 2 ) {
+       puts(strusage(41));
+       exit(0);
+    }
+}
+
+/* Level
+ *     0: Copyright String auf stderr ausgeben
+ *     1: Kurzusage auf stderr ausgeben und beenden
+ *     2: Langusage auf stdout ausgeben und beenden
+ *    11: name of program
+ *    12: optional name of package which includes this program.
+ *    13: version  string
+ *    14: copyright string
+ *    15: Short copying conditions (with LFs)
+ *    16: Long copying conditions (with LFs)
+ *    17: Optional printable OS name
+ *    18: Optional thanks list  (with LFs)
+ *    19: Bug report info
+ *20..29: Additional lib version strings.
+ *30..39: Additional program info (with LFs)
+ *    40: short usage note (with LF)
+ *    41: long usage note (with LF)
+ */
+const char *
+default_strusage( int level )
+{
+    const char *p = NULL;
+    switch( level ) {
+      case 11: p = "foo"; break;
+      case 13: p = "0.0"; break;
+      case 14: p = "Copyright (C) 2006 Free Software Foundation, Inc."; break;
+      case 15: p =
+"This program comes with ABSOLUTELY NO WARRANTY.\n"
+"This is free software, and you are welcome to redistribute it\n"
+"under certain conditions. See the file COPYING for details.\n"; break;
+      case 16: p =
+"This is free software; you can redistribute it and/or modify\n"
+"it under the terms of the GNU General Public License as published by\n"
+"the Free Software Foundation; either version 2 of the License, or\n"
+"(at your option) any later version.\n\n"
+"It is distributed in the hope that it will be useful,\n"
+"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+"GNU General Public License for more details.\n\n"
+"You should have received a copy of the GNU General Public License\n"
+"along with this program; if not, write to the Free Software\n"
+"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n";
+       break;
+      case 40: /* short and long usage */
+      case 41: p = ""; break;
+    }
+
+    return p;
+}
+
+
+
+#ifdef TEST
+static struct {
+    int verbose;
+    int debug;
+    char *outfile;
+    char *crf;
+    int myopt;
+    int echo;
+    int a_long_one;
+}opt;
+
+int
+main(int argc, char **argv)
+{
+    ARGPARSE_OPTS opts[] = {
+    { 'v', "verbose",   0 , "Laut sein"},
+    { 'e', "echo"   ,   0 , "Zeile ausgeben, damit wir sehen, was wir einegegeben haben"},
+    { 'd', "debug",     0 , "Debug\nfalls mal etasws\nSchief geht"},
+    { 'o', "output",    2   },
+    { 'c', "cross-ref", 2|8, "cross-reference erzeugen\n" },
+    { 'm', "my-option", 1|8 },
+    { 500, "a-long-option", 0 },
+    {0} };
+    ARGPARSE_ARGS pargs = { &argc, &argv, 2|4|32 };
+    int i;
+
+    while( ArgParse( &pargs, opts) ) {
+       switch( pargs.r_opt ) {
+         case -1 : printf( "arg=`%s'\n", pargs.r.ret_str); break;
+         case 'v': opt.verbose++; break;
+         case 'e': opt.echo++; break;
+         case 'd': opt.debug++; break;
+         case 'o': opt.outfile = pargs.r.ret_str; break;
+         case 'c': opt.crf = pargs.r_type? pargs.r.ret_str:"a.crf"; break;
+         case 'm': opt.myopt = pargs.r_type? pargs.r.ret_int : 1; break;
+         case 500: opt.a_long_one++;  break;
+         default : pargs.err = 1; break; /* force warning output */
+       }
+    }
+    for(i=0; i < argc; i++ )
+       printf("%3d -> (%s)\n", i, argv[i] );
+    puts("Options:");
+    if( opt.verbose )
+       printf("  verbose=%d\n", opt.verbose );
+    if( opt.debug )
+       printf("  debug=%d\n", opt.debug );
+    if( opt.outfile )
+       printf("  outfile=`%s'\n", opt.outfile );
+    if( opt.crf )
+       printf("  crffile=`%s'\n", opt.crf );
+    if( opt.myopt )
+       printf("  myopt=%d\n", opt.myopt );
+    if( opt.a_long_one )
+       printf("  a-long-one=%d\n", opt.a_long_one );
+    if( opt.echo       )
+       printf("  echo=%d\n", opt.echo );
+    return 0;
+}
+#endif
+
+/**** bottom of file ****/
diff --git a/util/assuan-buffer.c b/util/assuan-buffer.c
new file mode 100644 (file)
index 0000000..3c01086
--- /dev/null
@@ -0,0 +1,485 @@
+/* assuan-buffer.c - read and send data
+ *     Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <assert.h>
+#ifdef HAVE_W32_SYSTEM
+#include <process.h>
+#endif
+#include "assuan-defs.h"
+
+#ifndef HAVE_MEMRCHR
+void *memrchr(const void *s, int c, size_t n);
+#endif
+
+static int
+writen (assuan_context_t ctx, const char *buffer, size_t length)
+{
+  while (length)
+    {
+      ssize_t nwritten = ctx->io->writefnc (ctx, buffer, length);
+      
+      if (nwritten < 0)
+        {
+          if (errno == EINTR)
+            continue;
+          return -1; /* write error */
+        }
+      length -= nwritten;
+      buffer += nwritten;
+    }
+  return 0;  /* okay */
+}
+
+/* Read an entire line.  */
+static int
+readaline (assuan_context_t ctx, char *buf, size_t buflen,
+         int *r_nread, int *r_eof)
+{
+  size_t nleft = buflen;
+  char *p;
+
+  *r_eof = 0;
+  *r_nread = 0;
+  while (nleft > 0)
+    {
+      ssize_t n = ctx->io->readfnc (ctx, buf, nleft);
+
+      if (n < 0)
+        {
+          if (errno == EINTR)
+            continue;
+          return -1; /* read error */
+        }
+      else if (!n)
+        {
+          *r_eof = 1;
+          break; /* allow incomplete lines */
+        }
+      p = buf;
+      nleft -= n;
+      buf += n;
+      *r_nread += n;
+
+      p = memrchr (p, '\n', n);
+      if (p)
+        break; /* at least one full line available - that's enough for now */
+    }
+
+  return 0;
+}
+
+
+int
+_assuan_read_line (assuan_context_t ctx)
+{
+  char *line = ctx->inbound.line;
+  int nread, atticlen;
+  int rc;
+  char *endp = 0;
+
+  if (ctx->inbound.eof)
+    return -1;
+
+  atticlen = ctx->inbound.attic.linelen;
+  if (atticlen)
+    {
+      memcpy (line, ctx->inbound.attic.line, atticlen);
+      ctx->inbound.attic.linelen = 0;
+
+      endp = memchr (line, '\n', atticlen);
+      if (endp)
+       /* Found another line in the attic.  */
+       {
+         rc = 0;
+         nread = atticlen;
+         atticlen = 0;
+       }
+      else
+       /* There is pending data but not a full line.  */
+        {
+          assert (atticlen < LINELENGTH);
+          rc = readaline (ctx, line + atticlen,
+                        LINELENGTH - atticlen, &nread, &ctx->inbound.eof);
+        }
+    }
+  else
+    /* No pending data.  */
+    rc = readaline (ctx, line, LINELENGTH,
+                   &nread, &ctx->inbound.eof);
+  if (rc)
+    {
+      if (ctx->log_fp)
+       fprintf (ctx->log_fp, "%s[%u.%p] DBG: <- [Error: %s]\n",
+                assuan_get_assuan_log_prefix (),
+                 (unsigned int)getpid (), (void *)ctx, strerror (errno));
+      return ASSUAN_Read_Error;
+    }
+  if (!nread)
+    {
+      assert (ctx->inbound.eof);
+      if (ctx->log_fp)
+       fprintf (ctx->log_fp, "%s[%u.%p] DBG: <- [EOF]\n",
+                assuan_get_assuan_log_prefix (),
+                 (unsigned int)getpid (), (void *)ctx);
+      return -1;
+    }
+
+  ctx->inbound.attic.pending = 0;
+  nread += atticlen;
+
+  if (! endp)
+    endp = memchr (line, '\n', nread);
+
+  if (endp)
+    {
+      int n = endp - line + 1;
+      if (n < nread)
+       /* LINE contains more than one line.  We copy it to the attic
+          now as handlers are allowed to modify the passed
+          buffer.  */
+       {
+         int len = nread - n;
+         memcpy (ctx->inbound.attic.line, endp + 1, len);
+         ctx->inbound.attic.pending = memrchr (endp + 1, '\n', len) ? 1 : 0;
+         ctx->inbound.attic.linelen = len;
+       }
+
+      if (endp != line && endp[-1] == '\r')
+       endp --;
+      *endp = 0;
+
+      ctx->inbound.linelen = endp - line;
+      if (ctx->log_fp)
+       {
+         fprintf (ctx->log_fp, "%s[%u.%p] DBG: <- ",
+                  assuan_get_assuan_log_prefix (),
+                   (unsigned int)getpid (), (void *)ctx);
+         if (ctx->confidential)
+           fputs ("[Confidential data not shown]", ctx->log_fp);
+         else
+           _assuan_log_print_buffer (ctx->log_fp,
+                                     ctx->inbound.line,
+                                     ctx->inbound.linelen);
+         putc ('\n', ctx->log_fp);
+       }
+      return 0;
+    }
+  else
+    {
+      if (ctx->log_fp)
+       fprintf (ctx->log_fp, "%s[%u.%p] DBG: <- [Invalid line]\n",
+                assuan_get_assuan_log_prefix (),
+                 (unsigned int)getpid (), (void *)ctx);
+      *line = 0;
+      ctx->inbound.linelen = 0;
+      return ctx->inbound.eof ? ASSUAN_Line_Not_Terminated
+       : ASSUAN_Line_Too_Long;
+    }
+}
+
+
+/* Read the next line from the client or server and return a pointer
+   in *LINE to a buffer holding the line.  LINELEN is the length of
+   *LINE.  The buffer is valid until the next read operation on it.
+   The caller may modify the buffer.  The buffer is invalid (i.e. must
+   not be used) if an error is returned.
+
+   Returns 0 on success or an assuan error code.
+   See also: assuan_pending_line().
+*/
+assuan_error_t
+assuan_read_line (assuan_context_t ctx, char **line, size_t *linelen)
+{
+  assuan_error_t err;
+
+  if (!ctx)
+    return ASSUAN_Invalid_Value;
+
+  err = _assuan_read_line (ctx);
+  *line = ctx->inbound.line;
+  *linelen = ctx->inbound.linelen;
+  return err;
+}
+
+
+/* Return true if a full line is buffered (i.e. an entire line may be
+   read without any I/O).  */
+int
+assuan_pending_line (assuan_context_t ctx)
+{
+  return ctx && ctx->inbound.attic.pending;
+}
+
+
+assuan_error_t 
+_assuan_write_line (assuan_context_t ctx, const char *prefix,
+                    const char *line, size_t len)
+{
+  int rc = 0;
+  size_t prefixlen = prefix? strlen (prefix):0;
+
+  /* Make sure that the line is short enough. */
+  if (len + prefixlen + 2 > ASSUAN_LINELENGTH)
+    {
+      if (ctx->log_fp)
+        fprintf (ctx->log_fp, "%s[%u.%p] DBG: -> "
+                 "[supplied line too long -truncated]\n",
+                 assuan_get_assuan_log_prefix (),
+                 (unsigned int)getpid (), (void *)ctx);
+      if (prefixlen > 5)
+        prefixlen = 5;
+      if (len > ASSUAN_LINELENGTH - prefixlen - 2)
+        len = ASSUAN_LINELENGTH - prefixlen - 2 - 1;
+    }
+
+  /* Fixme: we should do some kind of line buffering.  */
+  if (ctx->log_fp)
+    {
+      fprintf (ctx->log_fp, "%s[%u.%p] DBG: -> ",
+              assuan_get_assuan_log_prefix (),
+               (unsigned int)getpid (), (void *)ctx);
+      if (ctx->confidential)
+       fputs ("[Confidential data not shown]", ctx->log_fp);
+      else
+       _assuan_log_print_buffer (ctx->log_fp, line, len);
+      putc ('\n', ctx->log_fp);
+    }
+
+  if (prefixlen)
+    {
+      rc = writen (ctx, prefix, prefixlen);
+      if (rc)
+        rc = ASSUAN_Write_Error;
+    }
+  if (!rc)
+    {
+      rc = writen (ctx, line, len);
+      if (rc)
+        rc = ASSUAN_Write_Error;
+      if (!rc)
+        {
+          rc = writen (ctx, "\n", 1);
+          if (rc)
+            rc = ASSUAN_Write_Error;
+        }
+    }
+  return rc;
+}
+
+
+assuan_error_t 
+assuan_write_line (assuan_context_t ctx, const char *line)
+{
+  size_t len;
+  const char *s;
+
+  if (!ctx)
+    return ASSUAN_Invalid_Value;
+
+  /* Make sure that we never take a LF from the user - this might
+     violate the protocol. */
+  s = strchr (line, '\n');
+  len = s? (s-line) : strlen (line);
+
+  if (ctx->log_fp && s)
+    fprintf (ctx->log_fp, "%s[%u.%p] DBG: -> "
+             "[supplied line contained a LF -truncated]\n",
+             assuan_get_assuan_log_prefix (),
+             (unsigned int)getpid (), (void *)ctx);
+
+  return _assuan_write_line (ctx, NULL, line, len);
+}
+
+
+\f
+/* Write out the data in buffer as datalines with line wrapping and
+   percent escaping.  This function is used for GNU's custom streams */
+int
+_assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size)
+{
+  assuan_context_t ctx = cookie;
+  size_t size = orig_size;
+  char *line;
+  size_t linelen;
+
+  if (ctx->outbound.data.error)
+    return 0;
+
+  line = ctx->outbound.data.line;
+  linelen = ctx->outbound.data.linelen;
+  line += linelen;
+  while (size)
+    {
+      /* insert data line header */
+      if (!linelen)
+        {
+          *line++ = 'D';
+          *line++ = ' ';
+          linelen += 2;
+        }
+      
+      /* copy data, keep some space for the CRLF and to escape one character */
+      while (size && linelen < LINELENGTH-2-2)
+        {
+          if (*buffer == '%' || *buffer == '\r' || *buffer == '\n')
+            {
+              sprintf (line, "%%%02X", *(unsigned char*)buffer);
+              line += 3;
+              linelen += 3;
+              buffer++;
+            }
+          else
+            {
+              *line++ = *buffer++;
+              linelen++;
+            }
+          size--;
+        }
+      
+      if (linelen >= LINELENGTH-2-2)
+        {
+          if (ctx->log_fp)
+            {
+             fprintf (ctx->log_fp, "%s[%u.%p] DBG: -> ",
+                      assuan_get_assuan_log_prefix (),
+                       (unsigned int)getpid (), (void *)ctx);
+
+              if (ctx->confidential)
+                fputs ("[Confidential data not shown]", ctx->log_fp);
+              else 
+                _assuan_log_print_buffer (ctx->log_fp, 
+                                          ctx->outbound.data.line,
+                                          linelen);
+              putc ('\n', ctx->log_fp);
+            }
+          *line++ = '\n';
+          linelen++;
+          if (writen (ctx, ctx->outbound.data.line, linelen))
+            {
+              ctx->outbound.data.error = ASSUAN_Write_Error;
+              return 0;
+            }
+          line = ctx->outbound.data.line;
+          linelen = 0;
+        }
+    }
+
+  ctx->outbound.data.linelen = linelen;
+  return (int)orig_size;
+}
+
+
+/* Write out any buffered data 
+   This function is used for GNU's custom streams */
+int
+_assuan_cookie_write_flush (void *cookie)
+{
+  assuan_context_t ctx = cookie;
+  char *line;
+  size_t linelen;
+
+  if (ctx->outbound.data.error)
+    return 0;
+
+  line = ctx->outbound.data.line;
+  linelen = ctx->outbound.data.linelen;
+  line += linelen;
+  if (linelen)
+    {
+      if (ctx->log_fp)
+       {
+         fprintf (ctx->log_fp, "%s[%u.%p] DBG: -> ",
+                  assuan_get_assuan_log_prefix (),
+                   (unsigned int)getpid (), (void *)ctx);
+         if (ctx->confidential)
+           fputs ("[Confidential data not shown]", ctx->log_fp);
+         else
+           _assuan_log_print_buffer (ctx->log_fp,
+                                     ctx->outbound.data.line, linelen);
+         putc ('\n', ctx->log_fp);
+       }
+      *line++ = '\n';
+      linelen++;
+      if (writen (ctx, ctx->outbound.data.line, linelen))
+        {
+          ctx->outbound.data.error = ASSUAN_Write_Error;
+          return 0;
+        }
+      ctx->outbound.data.linelen = 0;
+    }
+  return 0;
+}
+
+
+/**
+ * assuan_send_data:
+ * @ctx: An assuan context
+ * @buffer: Data to send or NULL to flush
+ * @length: length of the data to send/
+ * 
+ * This function may be used by the server or the client to send data
+ * lines.  The data will be escaped as required by the Assuan protocol
+ * and may get buffered until a line is full.  To force sending the
+ * data out @buffer may be passed as NULL (in which case @length must
+ * also be 0); however when used by a client this flush operation does
+ * also send the terminating "END" command to terminate the reponse on
+ * a INQUIRE response.  However, when assuan_transact() is used, this
+ * function takes care of sending END itself.
+ * 
+ * Return value: 0 on success or an error code
+ **/
+\f
+assuan_error_t
+assuan_send_data (assuan_context_t ctx, const void *buffer, size_t length)
+{
+  if (!ctx)
+    return ASSUAN_Invalid_Value;
+  if (!buffer && length)
+    return ASSUAN_Invalid_Value;
+
+  if (!buffer)
+    { /* flush what we have */
+      _assuan_cookie_write_flush (ctx);
+      if (ctx->outbound.data.error)
+        return ctx->outbound.data.error;
+      if (!ctx->is_server)
+        return assuan_write_line (ctx, "END");
+    }
+  else
+    {
+      _assuan_cookie_write_data (ctx, buffer, length);
+      if (ctx->outbound.data.error)
+        return ctx->outbound.data.error;
+    }
+
+  return 0;
+}
+
diff --git a/util/assuan-client.c b/util/assuan-client.c
new file mode 100644 (file)
index 0000000..0467f6d
--- /dev/null
@@ -0,0 +1,282 @@
+/* assuan-client.c - client functions
+ *     Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ *     Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <assert.h>
+#include <string.h>
+
+#include "assuan-defs.h"
+
+#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \
+                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10))
+#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1))
+
+
+assuan_error_t
+_assuan_read_from_server (assuan_context_t ctx, int *okay, int *off)
+{
+  char *line;
+  int linelen;
+  assuan_error_t rc;
+
+  *okay = 0;
+  *off = 0;
+  do 
+    {
+      rc = _assuan_read_line (ctx);
+      if (rc)
+        return rc;
+      line = ctx->inbound.line;
+      linelen = ctx->inbound.linelen;
+    }    
+  while (*line == '#' || !linelen);
+
+  if (linelen >= 1
+      && line[0] == 'D' && line[1] == ' ')
+    {
+      *okay = 2; /* data line */
+      *off = 2;
+    }
+  else if (linelen >= 1
+           && line[0] == 'S' 
+           && (line[1] == '\0' || line[1] == ' '))
+    {
+      *okay = 4;
+      *off = 1;
+      while (line[*off] == ' ')
+        ++*off;
+    }  
+  else if (linelen >= 2
+           && line[0] == 'O' && line[1] == 'K'
+           && (line[2] == '\0' || line[2] == ' '))
+    {
+      *okay = 1;
+      *off = 2;
+      while (line[*off] == ' ')
+        ++*off;
+    }
+  else if (linelen >= 3
+           && line[0] == 'E' && line[1] == 'R' && line[2] == 'R'
+           && (line[3] == '\0' || line[3] == ' '))
+    {
+      *okay = 0;
+      *off = 3;
+      while (line[*off] == ' ')
+        ++*off;
+    }  
+  else if (linelen >= 7
+           && line[0] == 'I' && line[1] == 'N' && line[2] == 'Q'
+           && line[3] == 'U' && line[4] == 'I' && line[5] == 'R'
+           && line[6] == 'E' 
+           && (line[7] == '\0' || line[7] == ' '))
+    {
+      *okay = 3;
+      *off = 7;
+      while (line[*off] == ' ')
+        ++*off;
+    }
+  else if (linelen >= 3
+           && line[0] == 'E' && line[1] == 'N' && line[2] == 'D'
+           && (line[3] == '\0' || line[3] == ' '))
+    {
+      *okay = 5; /* end line */
+      *off = 3;
+    }
+  else
+    rc = ASSUAN_Invalid_Response;
+  return rc;
+}
+
+
+\f
+assuan_error_t
+assuan_transact (assuan_context_t ctx,
+                 const char *command,
+                 assuan_error_t (*data_cb)(void *, const void *, size_t),
+                 void *data_cb_arg,
+                 assuan_error_t (*inquire_cb)(void*, const char *),
+                 void *inquire_cb_arg,
+                 assuan_error_t (*status_cb)(void*, const char *),
+                 void *status_cb_arg)
+{
+  return assuan_transact2 (ctx, command,
+                           data_cb, data_cb_arg,
+                           inquire_cb, inquire_cb_arg,
+                           status_cb, status_cb_arg,
+                           NULL, NULL);
+}
+
+
+/**
+ * assuan_transact2:
+ * @ctx: The Assuan context
+ * @command: Coimmand line to be send to server
+ * @data_cb: Callback function for data lines
+ * @data_cb_arg: first argument passed to @data_cb
+ * @inquire_cb: Callback function for a inquire response
+ * @inquire_cb_arg: first argument passed to @inquire_cb
+ * @status_cb: Callback function for a status response
+ * @status_cb_arg: first argument passed to @status_cb
+ * @okay_cb: Callback function for the final  OK response
+ * @okay_cb_arg: first argument passed to @okay_cb
+ * 
+ * FIXME: Write documentation
+ * 
+ * Return value: 0 on success or error code.  The error code may be
+ * the one one returned by the server in error lines or from the
+ * callback functions.
+ **/
+assuan_error_t
+assuan_transact2 (assuan_context_t ctx,
+                  const char *command,
+                  assuan_error_t (*data_cb)(void *, const void *, size_t),
+                  void *data_cb_arg,
+                  assuan_error_t (*inquire_cb)(void*, const char *),
+                  void *inquire_cb_arg,
+                  assuan_error_t (*status_cb)(void*, const char *),
+                  void *status_cb_arg,
+                  assuan_error_t (*okay_cb)(void*, const char *),
+                  void *okay_cb_arg)
+{
+  int rc, okay, off;
+  unsigned char *line;
+  int linelen;
+
+  rc = assuan_write_line (ctx, command);
+  if (rc)
+    return rc;
+
+  if (*command == '#' || !*command)
+    return 0; /* Don't expect a response for a comment line.  */
+
+ again:
+  rc = _assuan_read_from_server (ctx, &okay, &off);
+  if (rc)
+    return rc; /* error reading from server */
+
+  line = ctx->inbound.line + off;
+  linelen = ctx->inbound.linelen - off;
+
+  if (!okay)
+    {
+      rc = atoi (line);
+      if (rc < 100)
+        rc = ASSUAN_Server_Fault;
+    }
+  else if (okay == 1) /* Received OK. */
+    {
+      if (okay_cb)
+        {
+          rc = okay_cb (okay_cb_arg, line);
+          /* We better wipe out the buffer after processing it.  This
+             is no real guarantee that it won't get swapped out but at
+             least for the standard cases we can make sure that a
+             passphrase returned with the OK line is rendered
+             unreadable.  In fact the current Assuan interface suffers
+             from the problem that it is not possible to do assuan I/O
+             through secure memory.  There is no easy solution given
+             the current implementation but we need to address it
+             sooner or later.  The problem was introduced with
+             gpg-agent's GET_PASPHRASE command but it might also make
+             sense to have a way to convey sessions keys through
+             secured memory.  Note that the old implementation in gpg
+             for accessing the passphrase in fact used secure memory
+             but had the drawback of using a limited and not fully
+             conforming Assuan implementation - given that pinentry
+             and gpg-agent neither use secured memory for Assuan I/O,
+             it is negligible to drop the old implementation in gpg's
+             passphrase.c and use the wipememory workaround here.  */
+          memset (line, 0, strlen (line));
+        }
+    }
+  else if (okay == 2)
+    {
+      if (!data_cb)
+        rc = ASSUAN_No_Data_Callback;
+      else 
+        {
+          unsigned char *s, *d;
+
+          for (s=d=line; linelen; linelen--)
+            {
+              if (*s == '%' && linelen > 2)
+                { /* handle escaping */
+                  s++;
+                  *d++ = xtoi_2 (s);
+                  s += 2;
+                  linelen -= 2;
+                }
+              else
+                *d++ = *s++;
+            }
+          *d = 0; /* add a hidden string terminator */
+          rc = data_cb (data_cb_arg, line, d - line);
+          if (!rc)
+            goto again;
+        }
+    }
+  else if (okay == 3)
+    {
+      if (!inquire_cb)
+        {
+          assuan_write_line (ctx, "END"); /* get out of inquire mode */
+          _assuan_read_from_server (ctx, &okay, &off); /* dummy read */
+          rc = ASSUAN_No_Inquire_Callback;
+        }
+      else
+        {
+          rc = inquire_cb (inquire_cb_arg, line);
+          if (!rc)
+            rc = assuan_send_data (ctx, NULL, 0); /* flush and send END */
+          if (!rc)
+            goto again;
+        }
+    }
+  else if (okay == 4)
+    {
+      if (status_cb)
+        rc = status_cb (status_cb_arg, line);
+      if (!rc)
+        goto again;
+    }
+  else if (okay == 5)
+    {
+      if (!data_cb)
+        rc = ASSUAN_No_Data_Callback;
+      else 
+        {
+          rc = data_cb (data_cb_arg, NULL, 0);
+          if (!rc)
+            goto again;
+        }
+    }
+
+  return rc;
+}
+
diff --git a/util/assuan-connect.c b/util/assuan-connect.c
new file mode 100644 (file)
index 0000000..9952b44
--- /dev/null
@@ -0,0 +1,96 @@
+/* assuan-connect.c - Establish a connection (client) 
+ *     Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
+#ifndef HAVE_W32_SYSTEM
+#include <sys/wait.h>
+#endif
+
+#include "assuan-defs.h"
+
+/* Create a new context.  */
+int
+_assuan_new_context (assuan_context_t *r_ctx)
+{
+  assuan_context_t ctx;
+
+  *r_ctx = NULL;
+  ctx = xcalloc (1, sizeof *ctx);
+
+  ctx->input_fd = -1;
+  ctx->output_fd = -1;
+
+  ctx->inbound.fd = -1;
+  ctx->outbound.fd = -1;
+  ctx->io = NULL;
+
+  ctx->listen_fd = -1;
+  *r_ctx = ctx;
+  return 0;
+}
+
+
+void
+_assuan_release_context (assuan_context_t ctx)
+{
+  if (ctx)
+    {
+      xfree (ctx->hello_line);
+      xfree (ctx->okay_line);
+      xfree (ctx);
+    }
+}
+
+
+/* Disconnect and release the context CTX. */
+void
+assuan_disconnect (assuan_context_t ctx)
+{
+  if (ctx)
+    {
+      assuan_write_line (ctx, "BYE");
+      ctx->finish_handler (ctx);
+      ctx->deinit_handler (ctx);
+      ctx->deinit_handler = NULL;
+      _assuan_release_context (ctx);
+    }
+}
+
+/* Return the PID of the peer or -1 if not known. */
+pid_t
+assuan_get_pid (assuan_context_t ctx)
+{
+  return (ctx && ctx->pid)? ctx->pid : -1;
+}
+
diff --git a/util/assuan-defs.h b/util/assuan-defs.h
new file mode 100644 (file)
index 0000000..67c4e13
--- /dev/null
@@ -0,0 +1,244 @@
+/* assuan-defs.c - Internal definitions to Assuan
+ *     Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+ *     Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+
+#ifndef ASSUAN_DEFS_H
+#define ASSUAN_DEFS_H
+
+#include <sys/types.h>
+#ifndef HAVE_W32_SYSTEM
+#include <sys/socket.h>
+#include <sys/un.h>
+#else
+#include <windows.h>
+#endif
+#include <unistd.h>
+
+#include "assuan.h"
+#include "memory.h"
+
+#ifndef HAVE_W32_SYSTEM
+#define DIRSEP_C '/'
+#else
+#define DIRSEP_C '\\'
+#endif
+
+#ifdef HAVE_W32_SYSTEM
+#define AF_LOCAL AF_UNIX
+/* We need to prefix the structure with a sockaddr_in header so we can
+   use it later for sendto and recvfrom. */
+struct sockaddr_un
+{
+  short          sun_family;
+  unsigned short sun_port;
+  struct         in_addr sun_addr;
+  char           sun_path[108-2-4]; /* Path name.  */
+};
+
+/* Not needed anymore because the current mingw32 defines this in
+   sys/types.h */
+/* typedef int ssize_t; */
+
+/* Missing W32 functions */
+int putc_unlocked (int c, FILE *stream);
+void * memrchr (const void *block, int c, size_t size);
+char * stpcpy (char *dest, const char *src);
+#endif
+
+#define LINELENGTH ASSUAN_LINELENGTH
+
+struct cmdtbl_s
+{
+  const char *name;
+  int (*handler)(assuan_context_t, char *line);
+};
+
+struct assuan_io
+{
+  /* Routine to read from input_fd.  */
+  ssize_t (*readfnc) (assuan_context_t, void *, size_t);
+  /* Routine to write to output_fd.  */
+  ssize_t (*writefnc) (assuan_context_t, const void *, size_t);
+  /* Send a file descriptor.  */
+  assuan_error_t (*sendfd) (assuan_context_t, int);
+  /* Receive a file descriptor.  */
+  assuan_error_t (*receivefd) (assuan_context_t, int *);
+};  
+
+struct assuan_context_s
+{
+  assuan_error_t err_no;
+  const char *err_str;
+  int os_errno;  /* last system error number used with certain error codes*/
+
+  int confidential;
+  int is_server;  /* set if this is context belongs to a server */
+  int in_inquire;
+  char *hello_line;
+  char *okay_line; /* see assan_set_okay_line() */
+  
+  void *user_pointer;  /* for assuan_[gs]et_pointer () */
+
+  FILE *log_fp;
+
+  struct {
+    int fd;
+    int eof;
+    char line[LINELENGTH];
+    int linelen;  /* w/o CR, LF - might not be the same as
+                     strlen(line) due to embedded nuls. However a nul
+                     is always written at this pos */
+    struct {
+      char line[LINELENGTH];
+      int linelen ;
+      int pending; /* i.e. at least one line is available in the attic */
+    } attic;
+  } inbound;
+
+  struct {
+    int fd;
+    struct {
+      FILE *fp;
+      char line[LINELENGTH];
+      int linelen; 
+      int error;
+    } data; 
+  } outbound;
+
+  int pipe_mode;  /* We are in pipe mode, i.e. we can handle just one
+                     connection and must terminate then */
+  pid_t pid;     /* The the pid of the peer. */
+  int listen_fd;  /* The fd we are listening on (used by socket servers) */
+  int connected_fd; /* helper */
+
+  /* Used for Unix domain sockets.  */
+  struct sockaddr_un myaddr;
+  struct sockaddr_un serveraddr;
+  /* When reading from datagram sockets, we must read an entire
+     message at a time.  This means that we have to do our own
+     buffering to be able to get the semantics of read.  */
+  void *domainbuffer;
+  /* Offset of start of buffer.  */
+  int domainbufferoffset;
+  /* Bytes buffered.  */
+  int domainbuffersize;
+  /* Memory allocated.  */
+  int domainbufferallocated;
+
+  int *pendingfds;
+  int pendingfdscount;
+
+  void (*deinit_handler)(assuan_context_t);  
+  int (*accept_handler)(assuan_context_t);
+  int (*finish_handler)(assuan_context_t);
+
+  struct cmdtbl_s *cmdtbl;
+  size_t cmdtbl_used; /* used entries */
+  size_t cmdtbl_size; /* allocated size of table */
+
+  void (*bye_notify_fnc)(assuan_context_t);
+  void (*reset_notify_fnc)(assuan_context_t);
+  void (*cancel_notify_fnc)(assuan_context_t);
+  int  (*option_handler_fnc)(assuan_context_t,const char*, const char*);
+  void (*input_notify_fnc)(assuan_context_t, const char *);
+  void (*output_notify_fnc)(assuan_context_t, const char *);
+
+  int input_fd;   /* set by INPUT command */
+  int output_fd;  /* set by OUTPUT command */
+
+  /* io routines.  */
+  struct assuan_io *io;
+};
+
+/*-- assuan-pipe-server.c --*/
+int _assuan_new_context (assuan_context_t *r_ctx);
+void _assuan_release_context (assuan_context_t ctx);
+
+/*-- assuan-domain-connect.c --*/
+/* Make a connection to the Unix domain socket NAME and return a new
+   Assuan context in CTX.  SERVER_PID is currently not used but may
+   become handy in the future.  */
+assuan_error_t _assuan_domain_init (assuan_context_t *r_ctx,
+                                int rendezvousfd,
+                                pid_t peer);
+
+/*-- assuan-handler.c --*/
+int _assuan_register_std_commands (assuan_context_t ctx);
+
+/*-- assuan-buffer.c --*/
+int _assuan_read_line (assuan_context_t ctx);
+int _assuan_cookie_write_data (void *cookie, const char *buffer, size_t size);
+int _assuan_cookie_write_flush (void *cookie);
+assuan_error_t _assuan_write_line (assuan_context_t ctx, const char *prefix,
+                                   const char *line, size_t len);
+
+/*-- assuan-client.c --*/
+assuan_error_t _assuan_read_from_server (assuan_context_t ctx, int *okay, int *off);
+
+
+/*-- assuan-util.c --*/
+
+#define set_error(c,e,t) assuan_set_error ((c), ASSUAN_ ## e, (t))
+
+void _assuan_log_print_buffer (FILE *fp, const void *buffer, size_t  length);
+void _assuan_log_sanitized_string (const char *string);
+
+#ifdef HAVE_W32_SYSTEM
+const char *_assuan_w32_strerror (int ec);
+#define w32_strerror(e) _assuan_w32_strerror ((e))
+#endif /*HAVE_W32_SYSTEM*/
+
+
+/*-- assuan-logging.c --*/
+void _assuan_set_default_log_stream (FILE *fp);
+
+void _assuan_log_printf (const char *format, ...)
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 )
+ __attribute__ ((format (printf,1,2)))
+#endif
+     ;
+
+/*-- assuan-io.c --*/
+ssize_t _assuan_simple_read (assuan_context_t ctx, void *buffer, size_t size);
+ssize_t _assuan_simple_write (assuan_context_t ctx, const void *buffer,
+                             size_t size);
+
+/*-- assuan-socket.c --*/
+int _assuan_close (int fd);
+int _assuan_sock_new (int domain, int type, int proto);
+int _assuan_sock_connect (int sockfd, struct sockaddr *addr, int addrlen);
+
+#ifdef HAVE_FOPENCOOKIE
+/* We have to implement funopen in terms of glibc's fopencookie. */
+FILE *_assuan_funopen(void *cookie,
+                      cookie_read_function_t *readfn,
+                      cookie_write_function_t *writefn,
+                      cookie_seek_function_t *seekfn,
+                      cookie_close_function_t *closefn);
+#define funopen(a,r,w,s,c) _assuan_funopen ((a), (r), (w), (s), (c))
+#endif /*HAVE_FOPENCOOKIE*/
+
+#endif /*ASSUAN_DEFS_H*/
+
diff --git a/util/assuan-errors.c b/util/assuan-errors.c
new file mode 100644 (file)
index 0000000..c3a8770
--- /dev/null
@@ -0,0 +1,105 @@
+/* assuan-errors.c - error codes
+ *     Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+ *     Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */ 
+
+#include <stdio.h>
+#include "assuan.h"
+
+/* This function returns a textual representaion of the given error
+   code.  If this is an unknown value, a string with the value is
+   returned (Beware: it is hold in a static buffer).  Return value:
+   String with the error description.
+ */
+const char *
+assuan_strerror (assuan_error_t err)
+{
+  const char *s;
+  static char buf[50];
+
+  switch (err)
+    {
+    case ASSUAN_No_Error: s="no error"; break;
+    case ASSUAN_General_Error: s="general error"; break;
+    case ASSUAN_Out_Of_Core: s="out of core"; break;
+    case ASSUAN_Invalid_Value: s="invalid value"; break;
+    case ASSUAN_Timeout: s="timeout"; break;
+    case ASSUAN_Read_Error: s="read error"; break;
+    case ASSUAN_Write_Error: s="write error"; break;
+    case ASSUAN_Problem_Starting_Server: s="problem starting server"; break;
+    case ASSUAN_Not_A_Server: s="not a server"; break;
+    case ASSUAN_Not_A_Client: s="not a client"; break;
+    case ASSUAN_Nested_Commands: s="nested commands"; break;
+    case ASSUAN_Invalid_Response: s="invalid response"; break;
+    case ASSUAN_No_Data_Callback: s="no data callback"; break;
+    case ASSUAN_No_Inquire_Callback: s="no inquire callback"; break;
+    case ASSUAN_Connect_Failed: s="connect failed"; break;
+    case ASSUAN_Accept_Failed: s="accept failed"; break;
+    case ASSUAN_Not_Implemented: s="not implemented"; break;
+    case ASSUAN_Server_Fault: s="server fault"; break;
+    case ASSUAN_Invalid_Command: s="invalid command"; break;
+    case ASSUAN_Unknown_Command: s="unknown command"; break;
+    case ASSUAN_Syntax_Error: s="syntax error"; break;
+    case ASSUAN_Parameter_Error: s="parameter error"; break;
+    case ASSUAN_Parameter_Conflict: s="parameter conflict"; break;
+    case ASSUAN_Line_Too_Long: s="line too long"; break;
+    case ASSUAN_Line_Not_Terminated: s="line not terminated"; break;
+    case ASSUAN_No_Input: s="no input"; break;
+    case ASSUAN_No_Output: s="no output"; break;
+    case ASSUAN_Canceled: s="canceled"; break;
+    case ASSUAN_Unsupported_Algorithm: s="unsupported algorithm"; break;
+    case ASSUAN_Server_Resource_Problem: s="server resource problem"; break;
+    case ASSUAN_Server_IO_Error: s="server io error"; break;
+    case ASSUAN_Server_Bug: s="server bug"; break;
+    case ASSUAN_No_Data_Available: s="no data available"; break;
+    case ASSUAN_Invalid_Data: s="invalid data"; break;
+    case ASSUAN_Unexpected_Command: s="unexpected command"; break;
+    case ASSUAN_Too_Much_Data: s="too much data"; break;
+    case ASSUAN_Inquire_Unknown: s="inquire unknown"; break;
+    case ASSUAN_Inquire_Error: s="inquire error"; break;
+    case ASSUAN_Invalid_Option: s="invalid option"; break;
+    case ASSUAN_Invalid_Index: s="invalid index"; break;
+    case ASSUAN_Unexpected_Status: s="unexpected status"; break;
+    case ASSUAN_Unexpected_Data: s="unexpected data"; break;
+    case ASSUAN_Invalid_Status: s="invalid status"; break;
+    case ASSUAN_Locale_Problem: s="locale problem"; break;
+    case ASSUAN_Not_Confirmed: s="not confirmed"; break;
+    case ASSUAN_USER_ERROR_FIRST: s="user error first"; break;
+    case ASSUAN_USER_ERROR_LAST: s="user error last"; break;
+    default: 
+      {
+        unsigned int source, code;
+
+        source = ((err >> 24) & 0xff);
+        code = (err & 0x00ffffff);
+        if (source) /* Assume this is an libgpg-error. */
+          sprintf (buf, "ec=%u.%u", source, code ); 
+        else
+          sprintf (buf, "ec=%d", err ); 
+        s=buf; break;
+      }
+    }
+
+  return s;
+}
+
diff --git a/util/assuan-logging.c b/util/assuan-logging.c
new file mode 100644 (file)
index 0000000..f2d6c87
--- /dev/null
@@ -0,0 +1,116 @@
+/* assuan-logging.c - Default logging function.
+ *     Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#ifdef HAVE_W32_SYSTEM
+#include <windows.h>
+#endif /*HAVE_W32_SYSTEM*/
+
+#include "assuan-defs.h"
+
+static char prefix_buffer[80];
+static FILE *_assuan_log;
+
+void
+_assuan_set_default_log_stream (FILE *fp)
+{
+  if (!_assuan_log)
+    _assuan_log = fp;
+}
+
+void
+assuan_set_assuan_log_stream (FILE *fp)
+{
+  _assuan_log = fp;
+}
+
+FILE *
+assuan_get_assuan_log_stream (void)
+{
+  return _assuan_log ? _assuan_log : stderr;
+}
+
+
+/* Set the prefix to be used for logging to TEXT or
+   resets it to the default if TEXT is NULL. */
+void
+assuan_set_assuan_log_prefix (const char *text)
+{
+  if (text)
+    {
+      strncpy (prefix_buffer, text, sizeof (prefix_buffer)-1);
+      prefix_buffer[sizeof (prefix_buffer)-1] = 0;
+    }
+  else
+    *prefix_buffer = 0;
+}
+
+const char *
+assuan_get_assuan_log_prefix (void)
+{
+  return prefix_buffer;
+}
+
+
+void
+_assuan_log_printf (const char *format, ...)
+{
+  va_list arg_ptr;
+  FILE *fp;
+  const char *prf;
+
+  fp = assuan_get_assuan_log_stream ();
+  prf = assuan_get_assuan_log_prefix ();
+  if (*prf)
+    {
+      fputs (prf, fp);
+      fputs (": ", fp);
+    }
+
+  va_start (arg_ptr, format);
+  vfprintf (fp, format, arg_ptr );
+  va_end (arg_ptr);
+}
+
+
+
+#ifdef HAVE_W32_SYSTEM
+const char *
+_assuan_w32_strerror (int ec)
+{
+  static char strerr[256];
+  
+  if (ec == -1)
+    ec = (int)GetLastError ();
+  FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, ec,
+                 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+                 strerr, sizeof (strerr)-1, NULL);
+  return strerr;    
+}
+#endif /*HAVE_W32_SYSTEM*/
diff --git a/util/assuan-socket-connect.c b/util/assuan-socket-connect.c
new file mode 100644 (file)
index 0000000..0c580cd
--- /dev/null
@@ -0,0 +1,191 @@
+/* assuan-socket-connect.c - Assuan socket based client
+ *     Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#ifndef HAVE_W32_SYSTEM
+#include <sys/socket.h>
+#include <sys/un.h>
+#else
+#include <windows.h>
+#endif
+
+#include "assuan-defs.h"
+
+/* Hacks for Slowaris.  */
+#ifndef PF_LOCAL
+# ifdef PF_UNIX
+#  define PF_LOCAL PF_UNIX
+# else
+#  define PF_LOCAL AF_UNIX
+# endif
+#endif
+#ifndef AF_LOCAL
+# define AF_LOCAL AF_UNIX
+#endif
+
+#ifndef SUN_LEN
+# define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
+                      + strlen ((ptr)->sun_path))
+#endif
+
+static int
+do_finish (assuan_context_t ctx)
+{
+  if (ctx->inbound.fd != -1)
+    {
+      _assuan_close (ctx->inbound.fd);
+    }
+  ctx->inbound.fd = -1;
+  ctx->outbound.fd = -1;
+  return 0;
+}
+
+static void
+do_deinit (assuan_context_t ctx)
+{
+  do_finish (ctx);
+}
+
+
+static ssize_t
+simple_read (assuan_context_t ctx, void *buffer, size_t size)
+{
+#ifndef HAVE_W32_SYSTEM
+  return read (ctx->inbound.fd, buffer, size);
+#else
+  return recv (ctx->inbound.fd, buffer, size, 0);
+#endif
+}
+
+static ssize_t
+simple_write (assuan_context_t ctx, const void *buffer, size_t size)
+{
+#ifndef HAVE_W32_SYSTEM
+  return write (ctx->outbound.fd, buffer, size);
+#else
+  return send (ctx->outbound.fd, buffer, size, 0);
+#endif
+}
+
+
+/* Make a connection to the Unix domain socket NAME and return a new
+   Assuan context in CTX.  SERVER_PID is currently not used but may
+   become handy in the future.  */
+assuan_error_t
+assuan_socket_connect (assuan_context_t *r_ctx,
+                       const char *name, pid_t server_pid)
+{
+  static struct assuan_io io = { simple_read, simple_write };
+
+  assuan_error_t err;
+  assuan_context_t ctx;
+  int fd;
+  struct sockaddr_un srvr_addr;
+  size_t len;
+  const char *s;
+
+  if (!r_ctx || !name)
+    return ASSUAN_Invalid_Value;
+  *r_ctx = NULL;
+
+  /* We require that the name starts with a slash, so that we can
+     alter reuse this function for other socket types.  To make things
+     easier we allow an optional dirver prefix.  */
+  s = name;
+  if (*s && s[1] == ':')
+    s += 2;
+  if (*s != DIRSEP_C && *s != '/')
+    return ASSUAN_Invalid_Value;
+
+  if (strlen (name)+1 >= sizeof srvr_addr.sun_path)
+    return ASSUAN_Invalid_Value;
+
+  err = _assuan_new_context (&ctx); 
+  if (err)
+      return err;
+  ctx->deinit_handler = do_deinit;
+  ctx->finish_handler = do_finish;
+
+
+  fd = _assuan_sock_new (PF_LOCAL, SOCK_STREAM, 0);
+  if (fd == -1)
+    {
+      _assuan_log_printf ("can't create socket: %s\n", strerror (errno));
+      _assuan_release_context (ctx);
+      return ASSUAN_General_Error;
+    }
+
+  memset (&srvr_addr, 0, sizeof srvr_addr);
+  srvr_addr.sun_family = AF_LOCAL;
+  strncpy (srvr_addr.sun_path, name, sizeof (srvr_addr.sun_path) - 1);
+  srvr_addr.sun_path[sizeof (srvr_addr.sun_path) - 1] = 0;
+  len = SUN_LEN (&srvr_addr);
+
+
+  if (_assuan_sock_connect (fd, (struct sockaddr *) &srvr_addr, len) == -1)
+    {
+      _assuan_log_printf ("can't connect to `%s': %s\n",
+                          name, strerror (errno));
+      _assuan_release_context (ctx);
+      _assuan_close (fd);
+      return ASSUAN_Connect_Failed;
+    }
+
+  ctx->inbound.fd = fd;
+  ctx->outbound.fd = fd;
+  ctx->io = &io;
+
+  /* initial handshake */
+  {
+    int okay, off;
+
+    err = _assuan_read_from_server (ctx, &okay, &off);
+    if (err)
+      _assuan_log_printf ("can't connect to server: %s\n",
+                          assuan_strerror (err));
+    else if (okay != 1)
+      {
+        /*LOG ("can't connect to server: `");*/
+       _assuan_log_sanitized_string (ctx->inbound.line);
+       fprintf (assuan_get_assuan_log_stream (), "'\n");
+       err = ASSUAN_Connect_Failed;
+      }
+  }
+
+  if (err)
+    {
+      assuan_disconnect (ctx); 
+    }
+  else
+    *r_ctx = ctx;
+  return 0;
+}
diff --git a/util/assuan-socket.c b/util/assuan-socket.c
new file mode 100644 (file)
index 0000000..4d79792
--- /dev/null
@@ -0,0 +1,97 @@
+/* assuan-socket.c
+ * Copyright (C) 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+#include <config.h>
+#include <stdio.h>
+#ifdef HAVE_W32_SYSTEM
+#include <windows.h>
+#include <io.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#endif
+#include "assuan-defs.h"
+
+int
+_assuan_close (int fd)
+{
+#ifndef HAVE_W32_SYSTEM
+  return close (fd);
+#else
+  int rc = closesocket (fd);
+  if (rc && WSAGetLastError () == WSAENOTSOCK)
+      rc = close (fd);
+  return rc;
+#endif
+}
+
+
+int
+_assuan_sock_new (int domain, int type, int proto)
+{
+#ifndef HAVE_W32_SYSTEM
+  return socket (domain, type, proto);
+#else
+  if (domain == AF_UNIX || domain == AF_LOCAL)
+    domain = AF_INET;
+  return socket (domain, type, proto);
+#endif
+}
+
+
+int
+_assuan_sock_connect (int sockfd, struct sockaddr * addr, int addrlen)
+{
+#ifndef HAVE_W32_SYSTEM
+  return connect (sockfd, addr, addrlen);
+#else
+  struct sockaddr_in myaddr;
+  struct sockaddr_un * unaddr;
+  FILE * fp;
+  int port = 0;
+  
+  unaddr = (struct sockaddr_un *)addr;
+  fp = fopen (unaddr->sun_path, "rb");
+  if (!fp)
+      return -1;
+  fscanf (fp, "%d", &port);
+  fclose (fp);
+  /* XXX: set errno in this case */
+  if (port < 0 || port > 65535)
+      return -1;
+  
+  myaddr.sin_family = AF_INET;
+  myaddr.sin_port = port; 
+  myaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
+
+  /* we need this later. */
+  unaddr->sun_family = myaddr.sin_family;
+  unaddr->sun_port = myaddr.sin_port;
+  unaddr->sun_addr.s_addr = myaddr.sin_addr.s_addr;
+  
+  return connect (sockfd, (struct sockaddr *)&myaddr, sizeof myaddr);
+#endif
+}
+
+
diff --git a/util/assuan-util.c b/util/assuan-util.c
new file mode 100644 (file)
index 0000000..db3cb72
--- /dev/null
@@ -0,0 +1,171 @@
+/* assuan-util.c - Utility functions for Assuan 
+ * Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ * Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of Assuan.
+ *
+ * Assuan is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Assuan 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+/* Please note that this is a stripped down and modified version of
+   the orginal Assuan code from libassuan. */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "assuan-defs.h"
+
+
+\f
+/* Store the error in the context so that the error sending function
+  can take out a descriptive text.  Inside the assuan code, use the
+  macro set_error instead of this function. */
+int
+assuan_set_error (assuan_context_t ctx, int err, const char *text)
+{
+  ctx->err_no = err;
+  ctx->err_str = text;
+  return err;
+}
+
+void
+assuan_set_pointer (assuan_context_t ctx, void *pointer)
+{
+  if (ctx)
+    ctx->user_pointer = pointer;
+}
+
+void *
+assuan_get_pointer (assuan_context_t ctx)
+{
+  return ctx? ctx->user_pointer : NULL;
+}
+
+
+void
+assuan_set_log_stream (assuan_context_t ctx, FILE *fp)
+{
+  if (ctx)
+    {
+      if (ctx->log_fp)
+        fflush (ctx->log_fp);
+      ctx->log_fp = fp;
+      _assuan_set_default_log_stream (fp);
+    }
+}
+
+
+void
+assuan_begin_confidential (assuan_context_t ctx)
+{
+  if (ctx)
+    {
+      ctx->confidential = 1;
+    }
+}
+
+void
+assuan_end_confidential (assuan_context_t ctx)
+{
+  if (ctx)
+    {
+      ctx->confidential = 0;
+    }
+}
+
+/* Dump a possibly binary string (used for debugging).  Distinguish
+   ascii text from binary and print it accordingly.  */
+void
+_assuan_log_print_buffer (FILE *fp, const void *buffer, size_t length)
+{
+  const unsigned char *s;
+  int n;
+
+  for (n=length,s=buffer; n; n--, s++)
+    if  ((!isascii (*s) || iscntrl (*s) || !isprint (*s)) && !(*s >= 0x80))
+      break;
+
+  s = buffer;
+  if (!n && *s != '[')
+    fwrite (buffer, length, 1, fp);
+  else
+    {
+      putc ('[', fp);
+      for (n=0; n < length; n++, s++)
+          fprintf (fp, " %02x", *s);
+      putc (' ', fp);
+      putc (']', fp);
+    }
+}
+
+/* Log a user supplied string.  Escapes non-printable before
+   printing.  */
+void
+_assuan_log_sanitized_string (const char *string)
+{
+  const unsigned char *s = string;
+  FILE *fp = assuan_get_assuan_log_stream ();
+
+  if (! *s)
+    return;
+
+  for (; *s; s++)
+    {
+      int c = 0;
+
+      switch (*s)
+       {
+       case '\r':
+         c = 'r';
+         break;
+
+       case '\n':
+         c = 'n';
+         break;
+
+       case '\f':
+         c = 'f';
+         break;
+
+       case '\v':
+         c = 'v';
+         break;
+
+       case '\b':
+         c = 'b';
+         break;
+
+       default:
+         if ((isascii (*s) && isprint (*s)) || (*s >= 0x80))
+           putc (*s, fp);
+         else
+           {
+             putc ('\\', fp);
+             fprintf (fp, "x%02x", *s);
+           }
+       }
+
+      if (c)
+       {
+         putc ('\\', fp);
+         putc (c, fp);
+       }
+    }
+}
+
diff --git a/util/cert.c b/util/cert.c
new file mode 100644 (file)
index 0000000..1b3390b
--- /dev/null
@@ -0,0 +1,251 @@
+/* cert.c - DNS CERT code
+ * Copyright (C) 2005, 2006 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <sys/types.h>
+#ifdef USE_DNS_CERT
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#endif
+#include <string.h>
+#include "memory.h"
+#endif
+#include "iobuf.h"
+#include "util.h"
+
+/* Not every installation has gotten around to supporting CERTs
+   yet... */
+#ifndef T_CERT
+#define T_CERT 37
+#endif
+
+#ifdef USE_DNS_CERT
+
+/* Returns -1 on error, 0 for no answer, 1 for PGP provided and 2 for
+   IPGP provided. */
+int
+get_cert(const char *name,size_t max_size,IOBUF *iobuf,
+        unsigned char **fpr,size_t *fpr_len,char **url)
+{
+  unsigned char *answer;
+  int r,ret=-1;
+  u16 count;
+
+  if(fpr)
+    *fpr=NULL;
+
+  if(url)
+    *url=NULL;
+
+  answer=xmalloc(max_size);
+
+  r=res_query(name,C_IN,T_CERT,answer,max_size);
+  /* Not too big, not too small, no errors and at least 1 answer. */
+  if(r>=sizeof(HEADER) && r<=max_size
+     && (((HEADER *)answer)->rcode)==NOERROR
+     && (count=ntohs(((HEADER *)answer)->ancount)))
+    {
+      int rc;
+      unsigned char *pt,*emsg;
+
+      emsg=&answer[r];
+
+      pt=&answer[sizeof(HEADER)];
+
+      /* Skip over the query */
+
+      rc=dn_skipname(pt,emsg);
+      if(rc==-1)
+       goto fail;
+
+      pt+=rc+QFIXEDSZ;
+
+      /* There are several possible response types for a CERT request.
+        We're interested in the PGP (a key) and IPGP (a URI) types.
+        Skip all others.  TODO: A key is better than a URI since
+        we've gone through all this bother to fetch it, so favor that
+        if we have both PGP and IPGP? */
+
+      while(count-->0 && pt<emsg)
+       {
+         u16 type,class,dlen,ctype;
+
+         rc=dn_skipname(pt,emsg); /* the name we just queried for */
+         if(rc==-1)
+           break;
+
+         pt+=rc;
+
+         /* Truncated message? 15 bytes takes us to the point where
+            we start looking at the ctype. */
+         if((emsg-pt)<15)
+           break;
+
+         type=*pt++ << 8;
+         type|=*pt++;
+
+         class=*pt++ << 8;
+         class|=*pt++;
+         /* We asked for IN and got something else !? */
+         if(class!=C_IN)
+           break;
+
+         /* ttl */
+         pt+=4;
+
+         /* data length */
+         dlen=*pt++ << 8;
+         dlen|=*pt++;
+
+         /* We asked for CERT and got something else - might be a
+            CNAME, so loop around again. */
+         if(type!=T_CERT)
+           {
+             pt+=dlen;
+             continue;
+           }
+
+         /* The CERT type */
+         ctype=*pt++ << 8;
+         ctype|=*pt++;
+
+         /* Skip the CERT key tag and algo which we don't need. */
+         pt+=3;
+
+         dlen-=5;
+
+         /* 15 bytes takes us to here */
+
+         if(ctype==3 && iobuf && dlen)
+           {
+             /* PGP type */
+             *iobuf=iobuf_temp_with_content((char *)pt,dlen);
+             ret=1;
+             break;
+           }
+         else if(ctype==6 && dlen && dlen<1023 && dlen>=pt[0]+1
+                 && fpr && fpr_len && url)
+           {
+             /* IPGP type */
+             *fpr_len=pt[0];
+
+             if(*fpr_len)
+               {
+                 *fpr=xmalloc(*fpr_len);
+                 memcpy(*fpr,&pt[1],*fpr_len);
+               }
+             else
+               *fpr=NULL;
+
+             if(dlen>*fpr_len+1)
+               {
+                 *url=xmalloc(dlen-(*fpr_len+1)+1);
+                 memcpy(*url,&pt[*fpr_len+1],dlen-(*fpr_len+1));
+                 (*url)[dlen-(*fpr_len+1)]='\0';
+               }
+             else
+               *url=NULL;
+
+             ret=2;
+             break;
+           }
+
+         /* Neither type matches, so go around to the next answer. */
+         pt+=dlen;
+       }
+    }
+
+ fail:
+  xfree(answer);
+
+  return ret;
+}
+
+#else /* !USE_DNS_CERT */
+
+int
+get_cert(const char *name,size_t max_size,IOBUF *iobuf,
+        unsigned char **fpr,size_t *fpr_len,char **url)
+{
+  return -1;
+}
+
+#endif
+
+/* Test with simon.josefsson.org */
+
+#ifdef TEST
+int
+main(int argc,char *argv[])
+{
+  unsigned char *fpr;
+  size_t fpr_len;
+  char *url;
+  int rc;
+  IOBUF iobuf;
+
+  if(argc!=2)
+    {
+      printf("cert-test [name]\n");
+      return 1;
+    }
+
+  printf("CERT lookup on %s\n",argv[1]);
+
+  rc=get_cert(argv[1],16384,&iobuf,&fpr,&fpr_len,&url);
+  if(rc==-1)
+    printf("error\n");
+  else if(rc==0)
+    printf("no answer\n");
+  else if(rc==1)
+    {
+      printf("key found: %d bytes\n",(int)iobuf_get_temp_length(iobuf));
+      iobuf_close(iobuf);
+    }
+  else if(rc==2)
+    {
+      if(fpr)
+       {
+         size_t i;
+         printf("Fingerprint found (%d bytes): ",(int)fpr_len);
+         for(i=0;i<fpr_len;i++)
+           printf("%02X",fpr[i]);
+         printf("\n");
+       }
+      else
+       printf("No fingerprint found\n");
+
+      if(url)
+       printf("URL found: %s\n",url);
+      else
+       printf("No URL found\n");
+
+      xfree(fpr);
+      xfree(url);
+    }
+
+  return 0;
+}
+#endif /* TEST */
diff --git a/util/compat.c b/util/compat.c
new file mode 100644 (file)
index 0000000..aca558a
--- /dev/null
@@ -0,0 +1,24 @@
+int
+hextobyte (const char *s)
+{
+  int c;
+
+  if ( *s >= '0' && *s <= '9' )
+    c = 16 * (*s - '0');
+  else if ( *s >= 'A' && *s <= 'F' )
+    c = 16 * (10 + *s - 'A');
+  else if ( *s >= 'a' && *s <= 'f' )
+    c = 16 * (10 + *s - 'a');
+  else
+    return -1;
+  s++;
+  if ( *s >= '0' && *s <= '9' )
+    c += *s - '0';
+  else if ( *s >= 'A' && *s <= 'F' )
+    c += 10 + *s - 'A';
+  else if ( *s >= 'a' && *s <= 'f' )
+    c += 10 + *s - 'a';
+  else
+    return -1;
+  return c;
+}
diff --git a/util/dotlock.c b/util/dotlock.c
new file mode 100644 (file)
index 0000000..9edac57
--- /dev/null
@@ -0,0 +1,454 @@
+/* dotlock.c - dotfile locking
+ * Copyright (C) 1998, 1999, 2000, 2001, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <errno.h>
+#include <unistd.h>
+#if !defined (HAVE_DOSISH_SYSTEM)
+#include <sys/utsname.h>
+#endif
+#include <sys/types.h>
+#ifndef _WIN32
+#include <sys/time.h>
+#endif
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <signal.h>
+#include "types.h"
+#include "util.h"
+#include "memory.h"
+
+struct dotlock_handle {
+    struct dotlock_handle *next;
+    char *tname;    /* name of lockfile template */
+    char *lockname; /* name of the real lockfile */
+    int locked;     /* lock status */
+    int disable;    /* locking */
+};
+
+
+static volatile DOTLOCK all_lockfiles;
+static int never_lock;
+
+void
+disable_dotlock(void)
+{
+    never_lock = 1;
+}
+
+/****************
+ * Create a lockfile with the given name and return an object of
+ * type DOTLOCK which may be used later to actually do the lock.
+ * A cleanup routine gets installed to cleanup left over locks
+ * or other files used together with the lockmechanism.
+ * Althoug the function is called dotlock, this does not necessarily
+ * mean that real lockfiles are used - the function may decide to
+ * use fcntl locking.  Calling the function with NULL only install
+ * the atexit handler and maybe used to assure that the cleanup
+ * is called after all other atexit handlers.
+ *
+ * Notes: This function creates a lock file in the same directory
+ *       as file_to_lock with the name "file_to_lock.lock"
+ *       A temporary file ".#lk.<hostname>.pid[.threadid] is used.
+ *       This function does nothing for Windoze.
+ */
+DOTLOCK
+create_dotlock( const char *file_to_lock )
+{
+    static int initialized;
+    DOTLOCK h;
+#if !defined (HAVE_DOSISH_SYSTEM)
+    int fd = -1;
+    char pidstr[16];
+    struct utsname utsbuf;
+    const char *nodename;
+    const char *dirpart;
+    int dirpartlen;
+#endif
+
+    if( !initialized ) {
+       atexit( remove_lockfiles );
+       initialized = 1;
+    }
+    if( !file_to_lock )
+       return NULL;
+
+    h = xmalloc_clear( sizeof *h );
+    if( never_lock ) {
+       h->disable = 1;
+#ifdef _REENTRANT
+       /* fixme: aquire mutex on all_lockfiles */
+#endif
+       h->next = all_lockfiles;
+       all_lockfiles = h;
+       return h;
+    }
+
+
+#if !defined (HAVE_DOSISH_SYSTEM)
+    sprintf( pidstr, "%10d\n", (int)getpid() );
+    /* fixme: add the hostname to the second line (FQDN or IP addr?) */
+
+    /* create a temporary file */
+    if( uname( &utsbuf ) )
+       nodename = "unknown";
+    else
+       nodename = utsbuf.nodename;
+
+#ifdef __riscos__
+    {
+        char *iter = (char *) nodename;
+        for (; iter[0]; iter++)
+            if (iter[0] == '.')
+                iter[0] = '/';
+    }
+#endif /* __riscos__ */
+
+    if( !(dirpart = strrchr( file_to_lock, DIRSEP_C )) ) {
+       dirpart = EXTSEP_S;
+       dirpartlen = 1;
+    }
+    else {
+       dirpartlen = dirpart - file_to_lock;
+       dirpart = file_to_lock;
+    }
+
+#ifdef _REENTRANT
+    /* fixme: aquire mutex on all_lockfiles */
+#endif
+    h->next = all_lockfiles;
+    all_lockfiles = h;
+
+    h->tname = xmalloc( dirpartlen + 6+30+ strlen(nodename) + 11 );
+#ifndef __riscos__
+    sprintf( h->tname, "%.*s/.#lk%p.%s.%d",
+            dirpartlen, dirpart, (void *)h, nodename, (int)getpid() );
+#else /* __riscos__ */
+    sprintf( h->tname, "%.*s.lk%p/%s/%d",
+            dirpartlen, dirpart, (void *)h, nodename, (int)getpid() );
+#endif /* __riscos__ */
+
+    do {
+       errno = 0;
+       fd = open( h->tname, O_WRONLY|O_CREAT|O_EXCL,
+                         S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR );
+    } while( fd == -1 && errno == EINTR );
+    if( fd == -1 ) {
+       all_lockfiles = h->next;
+       log_error( "failed to create temporary file `%s': %s\n",
+                                           h->tname, strerror(errno));
+       xfree(h->tname);
+       xfree(h);
+       return NULL;
+    }
+    if( write(fd, pidstr, 11 ) != 11 ) {
+       all_lockfiles = h->next;
+#ifdef _REENTRANT
+       /* release mutex */
+#endif
+       log_fatal( "error writing to `%s': %s\n", h->tname, strerror(errno) );
+       close(fd);
+       unlink(h->tname);
+       xfree(h->tname);
+       xfree(h);
+       return NULL;
+    }
+    if( close(fd) ) {
+       all_lockfiles = h->next;
+#ifdef _REENTRANT
+       /* release mutex */
+#endif
+       log_error( "error closing `%s': %s\n", h->tname, strerror(errno));
+       unlink(h->tname);
+       xfree(h->tname);
+       xfree(h);
+       return NULL;
+    }
+
+#ifdef _REENTRANT
+    /* release mutex */
+#endif
+#endif
+    h->lockname = xmalloc( strlen(file_to_lock) + 6 );
+    strcpy(stpcpy(h->lockname, file_to_lock), EXTSEP_S "lock");
+    return h;
+}
+
+
+void
+destroy_dotlock ( DOTLOCK h )
+{
+#if !defined (HAVE_DOSISH_SYSTEM)
+    if ( h )
+      {
+        DOTLOCK hprev, htmp;
+
+        /* First remove the handle from our global list of all locks. */
+        for (hprev=NULL, htmp=all_lockfiles; htmp; hprev=htmp, htmp=htmp->next)
+          if (htmp == h)
+            {
+              if (hprev)
+                hprev->next = htmp->next;
+              else
+                all_lockfiles = htmp->next;
+              h->next = NULL;
+              break;
+            }
+
+        /* Second destroy the lock. */
+       if (!h->disable)
+          {
+           if (h->locked && h->lockname)
+              unlink (h->lockname);
+            if (h->tname)
+              unlink (h->tname);
+           xfree (h->tname);
+           xfree (h->lockname);
+          }
+       xfree(h);
+
+      }
+#endif
+}
+
+#ifndef HAVE_DOSISH_SYSTEM
+
+static int
+maybe_deadlock( DOTLOCK h )
+{
+    DOTLOCK r;
+
+    for( r=all_lockfiles; r; r = r->next ) {
+       if( r != h && r->locked )
+           return 1;
+    }
+    return 0;
+}
+
+/****************
+ * Read the lock file and return the pid, returns -1 on error.
+ */
+static int
+read_lockfile( const char *name )
+{
+    int fd, pid;
+    char pidstr[16];
+
+    if( (fd = open(name, O_RDONLY)) == -1 ) {
+       int e = errno;
+       log_debug("error opening lockfile `%s': %s\n", name, strerror(errno) );
+       errno = e;
+       return -1;
+    }
+    if( read(fd, pidstr, 10 ) != 10 ) {  /* Read 10 digits w/o newline */
+       log_debug("error reading lockfile `%s'", name );
+       close(fd);
+       errno = 0;
+       return -1;
+    }
+    pidstr[10] = 0;  /* terminate pid string */
+    close(fd);
+    pid = atoi(pidstr);
+#ifndef __riscos__
+    if( !pid || pid == -1 ) {
+#else /* __riscos__ */
+    if( (!pid && riscos_getpid()) || pid == -1 ) {
+#endif /* __riscos__ */
+       log_error("invalid pid %d in lockfile `%s'", pid, name );
+       errno = 0;
+       return -1;
+    }
+    return pid;
+}
+#endif /* !HAVE_DOSISH_SYSTEM */
+
+/****************
+ * Do a lock on H. A TIMEOUT of 0 returns immediately,
+ * -1 waits forever (hopefully not), other
+ * values are timeouts in milliseconds.
+ * Returns: 0 on success
+ */
+int
+make_dotlock( DOTLOCK h, long timeout )
+{
+#if defined (HAVE_DOSISH_SYSTEM)
+    return 0;
+#else
+    int  pid;
+    const char *maybe_dead="";
+    int backoff=0;
+
+    if( h->disable ) {
+       return 0;
+    }
+
+    if( h->locked ) {
+#ifndef __riscos__
+       log_debug("oops, `%s' is already locked\n", h->lockname );
+#endif /* !__riscos__ */
+       return 0;
+    }
+
+    for(;;) {
+#ifndef __riscos__
+       if( !link(h->tname, h->lockname) ) {
+           /* fixme: better use stat to check the link count */
+           h->locked = 1;
+           return 0; /* okay */
+       }
+       if( errno != EEXIST ) {
+           log_error( "lock not made: link() failed: %s\n", strerror(errno) );
+           return -1;
+       }
+#else /* __riscos__ */
+        if( !riscos_renamefile(h->tname, h->lockname) ) {
+            h->locked = 1;
+            return 0; /* okay */
+        }
+        if( errno != EEXIST ) {
+           log_error( "lock not made: rename() failed: %s\n", strerror(errno) );
+           return -1;
+        }
+#endif /* __riscos__ */
+       if( (pid = read_lockfile(h->lockname)) == -1 ) {
+           if( errno != ENOENT ) {
+               log_info("cannot read lockfile\n");
+               return -1;
+           }
+           log_info( "lockfile disappeared\n");
+           continue;
+       }
+       else if( pid == getpid() ) {
+           log_info( "Oops: lock already held by us\n");
+           h->locked = 1;
+           return 0; /* okay */
+       }
+       else if( kill(pid, 0) && errno == ESRCH ) {
+#ifndef __riscos__
+           maybe_dead = " - probably dead";
+#if 0 /* we should not do this without checking the permissions */
+              /* and the hostname */
+           log_info( "removing stale lockfile (created by %d)", pid );
+#endif
+#else /* __riscos__ */
+            /* we are *pretty* sure that the other task is dead and therefore
+               we remove the other lock file */
+            maybe_dead = " - probably dead - removing lock";
+            unlink(h->lockname);
+#endif /* __riscos__ */
+       }
+       if( timeout == -1 ) {
+           struct timeval tv;
+           log_info( "waiting for lock (held by %d%s) %s...\n",
+                     pid, maybe_dead, maybe_deadlock(h)? "(deadlock?) ":"");
+
+
+           /* can't use sleep, cause signals may be blocked */
+           tv.tv_sec = 1 + backoff;
+           tv.tv_usec = 0;
+           select(0, NULL, NULL, NULL, &tv);
+           if( backoff < 10 )
+               backoff++ ;
+       }
+       else
+           return -1;
+    }
+    /*not reached */
+#endif
+}
+
+
+/****************
+ * release a lock
+ * Returns: 0 := success
+ */
+int
+release_dotlock( DOTLOCK h )
+{
+#if defined (HAVE_DOSISH_SYSTEM)
+    return 0;
+#else
+    int pid;
+
+    /* To avoid atexit race conditions we first check whether there
+       are any locks left.  It might happen that another atexit
+       handler tries to release the lock while the atexit handler of
+       this module already ran and thus H is undefined.  */
+    if(!all_lockfiles)
+        return 0;
+
+    if( h->disable ) 
+       return 0;
+
+    if( !h->locked ) {
+       log_debug("oops, `%s' is not locked\n", h->lockname );
+       return 0;
+    }
+
+    pid = read_lockfile( h->lockname );
+    if( pid == -1 ) {
+       log_error( "release_dotlock: lockfile error\n");
+       return -1;
+    }
+    if( pid != getpid() ) {
+       log_error( "release_dotlock: not our lock (pid=%d)\n", pid);
+       return -1;
+    }
+#ifndef __riscos__
+    if( unlink( h->lockname ) ) {
+       log_error( "release_dotlock: error removing lockfile `%s'",
+                                                       h->lockname);
+       return -1;
+    }
+#else /* __riscos__ */
+    if( riscos_renamefile(h->lockname, h->tname) ) {
+       log_error( "release_dotlock: error renaming lockfile `%s' to `%s'",
+                                                       h->lockname, h->tname);
+       return -1;
+    }
+#endif /* __riscos__ */
+    /* fixme: check that the link count is now 1 */
+    h->locked = 0;
+    return 0;
+#endif
+}
+
+void
+remove_lockfiles()
+{
+#if !defined (HAVE_DOSISH_SYSTEM)
+    DOTLOCK h, h2;
+
+    h = all_lockfiles;
+    all_lockfiles = NULL;
+
+    while( h ) {
+       h2 = h->next;
+        destroy_dotlock (h);
+       h = h2;
+    }
+#endif
+}
diff --git a/util/errors.c b/util/errors.c
new file mode 100644 (file)
index 0000000..75498f8
--- /dev/null
@@ -0,0 +1,116 @@
+/* errors.c  - error strings
+ *     Copyright (C) 1998, 1999, 2000, 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include "errors.h"
+#include "i18n.h"
+
+#ifndef HAVE_STRERROR
+char *
+strerror( int n )
+{
+    extern char *sys_errlist[];
+    extern int sys_nerr;
+    static char buf[15];
+
+    if( n >= 0 && n < sys_nerr )
+       return sys_errlist[n];
+    strcpy( buf, "Unknown error" );
+    return buf;
+}
+#endif /* !HAVE_STRERROR */
+
+const char *
+g10_errstr( int err )
+{
+    static char buf[50];
+    const char *p;
+
+#define X(n,s) case G10ERR_##n : p = s; break;
+    switch( err ) {
+      case -1:         p = "eof"; break;
+      case 0:          p = "okay"; break;
+      X(GENERAL,       N_("general error"))
+      X(UNKNOWN_PACKET, N_("unknown packet type"))
+      X(UNKNOWN_VERSION,N_("unknown version"))
+      X(PUBKEY_ALGO    ,N_("unknown pubkey algorithm"))
+      X(DIGEST_ALGO    ,N_("unknown digest algorithm"))
+      X(BAD_PUBKEY     ,N_("bad public key"))
+      X(BAD_SECKEY     ,N_("bad secret key"))
+      X(BAD_SIGN       ,N_("bad signature"))
+      X(CHECKSUM   ,   N_("checksum error"))
+      X(BAD_PASS     , N_("bad passphrase"))
+      X(NO_PUBKEY      ,N_("public key not found"))
+      X(CIPHER_ALGO    ,N_("unknown cipher algorithm"))
+      X(KEYRING_OPEN   ,N_("can't open the keyring"))
+      X(INVALID_PACKET ,N_("invalid packet"))
+      X(INVALID_ARMOR  ,N_("invalid armor"))
+      X(NO_USER_ID     ,N_("no such user id"))
+      X(NO_SECKEY      ,N_("secret key not available"))
+      X(WRONG_SECKEY   ,N_("wrong secret key used"))
+      X(UNSUPPORTED    ,N_("not supported"))
+      X(BAD_KEY        ,N_("bad key"))
+      X(READ_FILE      ,N_("file read error"))
+      X(WRITE_FILE     ,N_("file write error"))
+      X(COMPR_ALGO     ,N_("unknown compress algorithm"))
+      X(OPEN_FILE      ,N_("file open error"))
+      X(CREATE_FILE    ,N_("file create error"))
+      X(PASSPHRASE     ,N_("invalid passphrase"))
+      X(NI_PUBKEY      ,N_("unimplemented pubkey algorithm"))
+      X(NI_CIPHER      ,N_("unimplemented cipher algorithm"))
+      X(SIG_CLASS      ,N_("unknown signature class"))
+      X(TRUSTDB        ,N_("trust database error"))
+      X(BAD_MPI        ,N_("bad MPI"))
+      X(RESOURCE_LIMIT ,N_("resource limit"))
+      X(INV_KEYRING    ,N_("invalid keyring"))
+      X(BAD_CERT       ,N_("bad certificate"))
+      X(INV_USER_ID    ,N_("malformed user id"))
+      X(CLOSE_FILE     ,N_("file close error"))
+      X(RENAME_FILE    ,N_("file rename error"))
+      X(DELETE_FILE    ,N_("file delete error"))
+      X(UNEXPECTED     ,N_("unexpected data"))
+      X(TIME_CONFLICT  ,N_("timestamp conflict"))
+      X(WR_PUBKEY_ALGO ,N_("unusable pubkey algorithm"))
+      X(FILE_EXISTS    ,N_("file exists"))
+      X(WEAK_KEY       ,N_("weak key"))
+      X(INV_ARG        ,N_("invalid argument"))
+      X(BAD_URI        ,N_("bad URI"))
+      X(INVALID_URI    ,N_("unsupported URI"))
+      X(NETWORK        ,N_("network error"))
+      X(SELFTEST_FAILED,"selftest failed")
+      X(NOT_ENCRYPTED  ,N_("not encrypted"))
+      X(NOT_PROCESSED  ,N_("not processed"))
+      /* the key cannot be used for a specific usage */
+      X(UNU_PUBKEY     ,N_("unusable public key"))
+      X(UNU_SECKEY     ,N_("unusable secret key"))
+      X(KEYSERVER      ,N_("keyserver error"))
+      X(CANCELED       ,N_("canceled"))
+      X(NO_CARD        ,N_("no card"))
+      X(NO_DATA        ,N_("no data"))
+      default: p = buf; sprintf(buf, "g10err=%d", err); break;
+    }
+#undef X
+    return _(p);
+}
diff --git a/util/fileutil.c b/util/fileutil.c
new file mode 100644 (file)
index 0000000..5834e3d
--- /dev/null
@@ -0,0 +1,297 @@
+/* fileutil.c -  file utilities
+ * Copyright (C) 1998, 2003, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+#include <sys/types.h>
+#ifdef HAVE_PWD_H
+#include <pwd.h>
+#endif
+#include "util.h"
+#include "memory.h"
+#include "ttyio.h"
+
+
+/***************
+ * Extract from a given path the filename component.
+ *
+ */
+char *
+make_basename(const char *filepath, const char *inputpath)
+{
+#ifdef __riscos__
+    return riscos_make_basename(filepath, inputpath);
+#endif
+
+    char *p;
+
+    if ( !(p=strrchr(filepath, DIRSEP_C)) )
+#ifdef HAVE_DRIVE_LETTERS
+       if ( !(p=strrchr(filepath, '\\')) )
+           if ( !(p=strrchr(filepath, ':')) )
+#endif
+             {
+               return xstrdup(filepath);
+             }
+
+    return xstrdup(p+1);
+}
+
+
+
+/***************
+ * Extract from a given filename the path prepended to it.
+ * If their isn't a path prepended to the filename, a dot
+ * is returned ('.').
+ *
+ */
+char *
+make_dirname(const char *filepath)
+{
+    char *dirname;
+    int  dirname_length;
+    char *p;
+
+    if ( !(p=strrchr(filepath, DIRSEP_C)) )
+#ifdef HAVE_DRIVE_LETTERS
+       if ( !(p=strrchr(filepath, '\\')) )
+           if ( !(p=strrchr(filepath, ':')) )
+#endif
+             {
+               return xstrdup(EXTSEP_S);
+             }
+
+    dirname_length = p-filepath;
+    dirname = xmalloc(dirname_length+1);
+    strncpy(dirname, filepath, dirname_length);
+    dirname[dirname_length] = 0;
+
+    return dirname;
+}
+
+/* Expand tildes.  Handles both the ~/foo and ~username/foo cases.
+   Returns what the tilde expands to.  *name is advanced to be past
+   the tilde expansion. */
+static char *
+untilde(const char **name)
+{
+  char *home=NULL;
+
+  assert((*name)[0]=='~');
+
+  if((*name)[1]==DIRSEP_C || (*name)[1]=='\0')
+    {
+      /* This is the "~/foo" or "~" case. */
+      char *tmp=getenv("HOME");
+      if(tmp)
+       home=xstrdup(tmp);
+
+#ifdef HAVE_GETPWUID
+      if(!home)
+       {
+         struct passwd *pwd;
+
+         pwd=getpwuid(getuid());
+         if(pwd)
+           home=xstrdup(pwd->pw_dir);
+       }
+#endif
+      if(home)
+       (*name)++;
+    }
+#ifdef HAVE_GETPWNAM
+  else
+    {
+      /* This is the "~username" case. */
+      char *user,*sep;
+      struct passwd *pwd;
+
+      user=xstrdup((*name)+1);
+
+      sep=strchr(user,DIRSEP_C);
+      if(sep)
+       *sep='\0';
+
+      pwd=getpwnam(user);
+      if(pwd)
+       {
+         home=xstrdup(pwd->pw_dir);
+         (*name)+=1+strlen(user);
+       }
+
+      xfree(user);
+    }
+#endif
+
+  return home;
+}
+
+/*
+  Construct a filename from the NULL terminated list of parts.  Tilde
+  expansion is done here.  Note that FIRST_PART must never be NULL and
+  that this function is guaranteed to return an allocated string.  */
+char *
+make_filename( const char *first_part, ... )
+{
+    va_list arg_ptr ;
+    size_t n;
+    const char *s;
+    char *name, *p, *home=NULL;
+
+    va_start( arg_ptr, first_part ) ;
+    n = strlen(first_part)+1;
+    while( (s=va_arg(arg_ptr, const char *)) )
+       n += strlen(s) + 1;
+    va_end(arg_ptr);
+
+#ifndef __riscos__
+    if(*first_part=='~')
+      {
+       home=untilde(&first_part);
+       if(home)
+         n+=strlen(home);
+      }
+#endif
+    name = xmalloc(n);
+    p = home ? stpcpy(stpcpy(name,home), first_part)
+            : stpcpy(name, first_part);
+    va_start( arg_ptr, first_part ) ;
+    while( (s=va_arg(arg_ptr, const char *)) )
+       p = stpcpy(stpcpy(p, DIRSEP_S), s);
+    va_end(arg_ptr);
+    xfree(home);
+
+#ifndef __riscos__
+    return name;
+#else /* __riscos__ */
+    p = riscos_gstrans(name);
+    xfree(name);
+    return p;
+#endif /* __riscos__ */
+}
+
+
+int
+compare_filenames( const char *a, const char *b )
+{
+    /* ? check whether this is an absolute filename and
+     * resolve symlinks?
+     */
+#ifndef __riscos__
+#ifdef HAVE_DRIVE_LETTERS
+    return ascii_strcasecmp(a,b);
+#else
+    return strcmp(a,b);
+#endif
+#else /* __riscos__ */
+    int c = 0;
+    char *abuf, *bbuf;
+
+    abuf = riscos_gstrans(a);
+    bbuf = riscos_gstrans(b);
+
+    c = ascii_strcasecmp (abuf, bbuf);
+
+    xfree(abuf);
+    xfree(bbuf);
+
+    return c;
+#endif /* __riscos__ */
+}
+
+
+/****************
+ * A simple function to decide whether the filename is stdout
+ * or a real filename.
+ */
+const char *
+print_fname_stdout( const char *s )
+{
+    if( !s || (*s == '-' && !s[1]) )
+       return "[stdout]";
+    return s;
+}
+
+
+const char *
+print_fname_stdin( const char *s )
+{
+    if( !s || (*s == '-' && !s[1]) )
+       return "[stdin]";
+    return s;
+}
+
+/****************
+ * Check if the file is compressed.
+ **/
+int
+is_file_compressed( const char *s, int *ret_rc )
+{
+    IOBUF a;
+    byte buf[4];
+    int i, rc = 0;
+    int overflow;
+
+    struct magic_compress_s {
+        size_t len;
+        byte magic[4];
+    } magic[] = {
+        { 3, { 0x42, 0x5a, 0x68, 0x00 } }, /* bzip2 */
+        { 3, { 0x1f, 0x8b, 0x08, 0x00 } }, /* gzip */
+        { 4, { 0x50, 0x4b, 0x03, 0x04 } }, /* (pk)zip */
+    };
+    
+    if ( iobuf_is_pipe_filename (s) || !ret_rc )
+        return 0; /* We can't check stdin or no file was given */
+
+    a = iobuf_open( s );
+    if ( a == NULL ) {
+        *ret_rc = G10ERR_OPEN_FILE;
+        return 0;
+    }
+
+    if ( iobuf_get_filelength( a, &overflow ) < 4 && !overflow) {
+        *ret_rc = 0;
+        goto leave;
+    }
+
+    if ( iobuf_read( a, buf, 4 ) == -1 ) {
+        *ret_rc = G10ERR_READ_FILE;
+        goto leave;
+    }
+
+    for ( i = 0; i < DIM( magic ); i++ ) {
+        if ( !memcmp( buf, magic[i].magic, magic[i].len ) ) {
+            *ret_rc = 0;
+            rc = 1;
+            break;
+        }
+    }
+
+leave:    
+    iobuf_close( a );
+    return rc;
+}
diff --git a/util/http.c b/util/http.c
new file mode 100644 (file)
index 0000000..4100002
--- /dev/null
@@ -0,0 +1,1076 @@
+/* http.c  -  HTTP protocol handler
+ * Copyright (C) 1999, 2001, 2002, 2003, 2004,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <time.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#endif
+
+#include "util.h"
+#include "iobuf.h"
+#include "i18n.h"
+#include "http.h"
+#include "srv.h"
+
+#ifdef _WIN32
+#define sock_close(a)  closesocket(a)
+#else
+#define sock_close(a)  close(a)
+#endif
+
+#define MAX_LINELEN 20000  /* max. length of a HTTP line */
+#define VALID_URI_CHARS "abcdefghijklmnopqrstuvwxyz"   \
+                       "ABCDEFGHIJKLMNOPQRSTUVWXYZ"   \
+                       "01234567890@"                 \
+                       "!\"#$%&'()*+,-./:;<=>?[\\]^_{|}~"
+
+#ifndef EAGAIN
+#define EAGAIN  EWOULDBLOCK
+#endif
+
+static int parse_uri( PARSED_URI *ret_uri, const char *uri );
+static void release_parsed_uri( PARSED_URI uri );
+static int do_parse_uri( PARSED_URI uri, int only_local_part );
+static int remove_escapes( byte *string );
+static int insert_escapes( byte *buffer, const byte *string,
+                                        const byte *special );
+static URI_TUPLE parse_tuple( byte *string );
+static int send_request( HTTP_HD hd, const char *auth, const char *proxy );
+static byte *build_rel_path( PARSED_URI uri );
+static int parse_response( HTTP_HD hd );
+
+static int connect_server( const char *server, ushort port, unsigned int flags,
+                          const char *srvtag );
+static int write_server( int sock, const char *data, size_t length );
+
+#ifdef _WIN32
+static void
+deinit_sockets (void)
+{
+    WSACleanup();
+}
+
+static void
+init_sockets (void)
+{
+    static int initialized;
+    static WSADATA wsdata;
+
+    if (initialized)
+        return;
+
+    if( WSAStartup( 0x0101, &wsdata ) ) {
+        log_error ("error initializing socket library: ec=%d\n", 
+                    (int)WSAGetLastError () );
+        return;
+    }
+    if( wsdata.wVersion < 0x0001 ) {
+        log_error ("socket library version is %x.%x - but 1.1 needed\n",
+                   LOBYTE(wsdata.wVersion), HIBYTE(wsdata.wVersion));
+        WSACleanup();
+        return;
+    }
+    atexit ( deinit_sockets );
+    initialized = 1;
+}
+#endif /*_WIN32*/
+
+static byte bintoasc[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                        "abcdefghijklmnopqrstuvwxyz"
+                        "0123456789+/";
+
+/****************
+ * create a radix64 encoded string.
+ */
+
+/* TODO: This is a duplicate of code in g10/armor.c modified to do the
+   "=" padding.  Better to use a single copy in strgutil.c ? */
+static char *
+make_radix64_string( const byte *data, size_t len )
+{
+    char *buffer, *p;
+
+    buffer = p = xmalloc( (len+2)/3*4 + 1 );
+    for( ; len >= 3 ; len -= 3, data += 3 ) {
+       *p++ = bintoasc[(data[0] >> 2) & 077];
+       *p++ = bintoasc[(((data[0] <<4)&060)|((data[1] >> 4)&017))&077];
+       *p++ = bintoasc[(((data[1]<<2)&074)|((data[2]>>6)&03))&077];
+       *p++ = bintoasc[data[2]&077];
+    }
+    if( len == 2 ) {
+       *p++ = bintoasc[(data[0] >> 2) & 077];
+       *p++ = bintoasc[(((data[0] <<4)&060)|((data[1] >> 4)&017))&077];
+       *p++ = bintoasc[((data[1]<<2)&074)];
+       *p++ = '=';
+    }
+    else if( len == 1 ) {
+       *p++ = bintoasc[(data[0] >> 2) & 077];
+       *p++ = bintoasc[(data[0] <<4)&060];
+       *p++ = '=';
+       *p++ = '=';
+    }
+    *p = 0;
+    return buffer;
+}
+
+int
+http_open( HTTP_HD hd, HTTP_REQ_TYPE reqtype, const char *url,
+          char *auth, unsigned int flags, const char *proxy )
+{
+    int rc;
+
+    if( !(reqtype == HTTP_REQ_GET || reqtype == HTTP_REQ_POST) )
+       return G10ERR_INV_ARG;
+
+    /* initialize the handle */
+    memset( hd, 0, sizeof *hd );
+    hd->sock = -1;
+    hd->initialized = 1;
+    hd->req_type = reqtype;
+    hd->flags = flags;
+
+    rc = parse_uri( &hd->uri, url );
+    if( !rc ) {
+       rc = send_request( hd, auth, proxy );
+       if( !rc ) {
+           hd->fp_write = iobuf_sockopen( hd->sock , "w" );
+           if( hd->fp_write )
+               return 0;
+           rc = G10ERR_GENERAL;
+       }
+    }
+
+    if( !hd->fp_read && !hd->fp_write && hd->sock != -1 )
+       sock_close( hd->sock );
+    iobuf_close( hd->fp_read );
+    iobuf_close( hd->fp_write);
+    release_parsed_uri( hd->uri );
+    hd->initialized = 0;
+
+    return rc;
+}
+
+
+void
+http_start_data( HTTP_HD hd )
+{
+    iobuf_flush ( hd->fp_write );
+    if( !hd->in_data ) {
+        write_server (hd->sock, "\r\n", 2);
+       hd->in_data = 1;
+    }
+}
+
+
+int
+http_wait_response( HTTP_HD hd, unsigned int *ret_status )
+{
+    int rc;
+
+    http_start_data( hd ); /* make sure that we are in the data */
+
+#if 0
+    hd->sock = dup( hd->sock ); 
+    if( hd->sock == -1 )
+       return G10ERR_GENERAL;
+#endif
+    iobuf_ioctl (hd->fp_write, 1, 1, NULL); /* keep the socket open */
+    iobuf_close (hd->fp_write);
+    hd->fp_write = NULL;
+    if ( !(hd->flags & HTTP_FLAG_NO_SHUTDOWN) )
+        shutdown( hd->sock, 1 );
+    hd->in_data = 0;
+
+    hd->fp_read = iobuf_sockopen( hd->sock , "r" );
+    if( !hd->fp_read )
+       return G10ERR_GENERAL;
+
+    rc = parse_response( hd );
+    if( !rc && ret_status )
+       *ret_status = hd->status_code;
+
+    return rc;
+}
+
+
+int
+http_open_document( HTTP_HD hd, const char *document, char *auth,
+                   unsigned int flags, const char *proxy )
+{
+    int rc;
+
+    rc = http_open(hd, HTTP_REQ_GET, document, auth, flags, proxy );
+    if( rc )
+       return rc;
+
+    rc = http_wait_response( hd, NULL );
+    if( rc )
+       http_close( hd );
+
+    return rc;
+}
+
+
+void
+http_close( HTTP_HD hd )
+{
+    if( !hd || !hd->initialized )
+       return;
+    if( !hd->fp_read && !hd->fp_write && hd->sock != -1 )
+       sock_close( hd->sock );
+    iobuf_close( hd->fp_read );
+    iobuf_close( hd->fp_write );
+    release_parsed_uri( hd->uri );
+    xfree( hd->buffer );
+    hd->initialized = 0;
+}
+
+
+
+/****************
+ * Parse an URI and put the result into the newly allocated ret_uri.
+ * The caller must always use release_parsed_uri to releases the
+ * resources (even on an error).
+ */
+static int
+parse_uri( PARSED_URI *ret_uri, const char *uri )
+{
+   *ret_uri = xmalloc_clear( sizeof(**ret_uri) + strlen(uri) );
+   strcpy( (*ret_uri)->buffer, uri );
+   return do_parse_uri( *ret_uri, 0 );
+}
+
+static void
+release_parsed_uri( PARSED_URI uri )
+{
+    if( uri )
+    {
+       URI_TUPLE r, r2;
+
+       for( r = uri->query; r; r = r2 ) {
+           r2 = r->next;
+           xfree( r );
+       }
+       xfree( uri );
+    }
+}
+
+static int
+do_parse_uri( PARSED_URI uri, int only_local_part )
+{
+    URI_TUPLE *tail;
+    char *p, *p2, *p3;
+    int n;
+
+    p = uri->buffer;
+    n = strlen( uri->buffer );
+    /* initialize all fields to an empty string or an empty list */
+    uri->scheme = uri->host = uri->path = p + n;
+    uri->port = 0;
+    uri->params = uri->query = NULL;
+
+    /* a quick validity check */
+    if( strspn( p, VALID_URI_CHARS) != n )
+       return G10ERR_BAD_URI; /* invalid characters found */
+
+    if( !only_local_part ) {
+       /* find the scheme */
+       if( !(p2 = strchr( p, ':' ) ) || p2 == p )
+          return G10ERR_BAD_URI; /* No scheme */
+       *p2++ = 0;
+       strlwr( p );
+       uri->scheme = p;
+       if(strcmp(uri->scheme,"http")==0)
+         uri->port = 80;
+       else if(strcmp(uri->scheme,"hkp")==0)
+         uri->port = 11371;
+       else
+         return G10ERR_INVALID_URI; /* Unsupported scheme */
+
+       p = p2;
+
+       /* find the hostname */
+       if( *p != '/' )
+           return G10ERR_INVALID_URI; /* does not start with a slash */
+
+       p++;
+       if( *p == '/' ) {  /* there seems to be a hostname */
+           p++;
+           if( (p2 = strchr(p, '/')) )
+               *p2++ = 0;
+
+           /* Check for username/password encoding */
+           if((p3=strchr(p,'@')))
+             {
+               uri->auth=p;
+               *p3++='\0';
+               p=p3;
+             }
+
+           strlwr( p );
+           uri->host = p;
+           if( (p3=strchr( p, ':' )) ) {
+               *p3++ = 0;
+               uri->port = atoi( p3 );
+           }
+
+           uri->host = p;
+           if( (n = remove_escapes( uri->host )) < 0 )
+               return G10ERR_BAD_URI;
+           if( n != strlen( p ) )
+               return G10ERR_BAD_URI; /* hostname with a Nul in it */
+           p = p2 ? p2 : NULL;
+       }
+    } /* end global URI part */
+
+    /* parse the pathname part */
+    if( !p || !*p ) /* we don't have a path */
+       return 0; /* and this is okay */
+
+    /* todo: here we have to check params */
+
+    /* do we have a query part */
+    if( (p2 = strchr( p, '?' )) )
+       *p2++ = 0;
+
+    uri->path = p;
+    if( (n = remove_escapes( p )) < 0 )
+       return G10ERR_BAD_URI;
+    if( n != strlen( p ) )
+       return G10ERR_BAD_URI; /* path with a Nul in it */
+    p = p2 ? p2 : NULL;
+
+    if( !p || !*p ) /* we don't have a query string */
+       return 0;   /* okay */
+
+    /* now parse the query string */
+    tail = &uri->query;
+    for(;;) {
+       URI_TUPLE elem;
+
+       if( (p2 = strchr( p, '&' )) )
+           *p2++ = 0;
+       if( !(elem = parse_tuple( p )) )
+           return G10ERR_BAD_URI;
+       *tail = elem;
+       tail = &elem->next;
+
+       if( !p2 )
+          break; /* ready */
+       p = p2;
+    }
+
+    return 0;
+}
+
+
+
+/****************
+ * Remove all %xx escapes; this is done inplace.
+ * Returns: new length of the string.
+ */
+static int
+remove_escapes( byte *string )
+{
+    int n = 0;
+    byte *p, *s;
+
+    for(p=s=string; *s ; s++ ) {
+       if( *s == '%' ) {
+           if( s[1] && s[2] && isxdigit(s[1]) && isxdigit(s[2]) ) {
+               s++;
+               *p  = *s >= '0' && *s <= '9' ? *s - '0' :
+                     *s >= 'A' && *s <= 'F' ? *s - 'A' + 10 : *s - 'a' + 10 ;
+               *p <<= 4;
+               s++;
+               *p |= *s >= '0' && *s <= '9' ? *s - '0' :
+                     *s >= 'A' && *s <= 'F' ? *s - 'A' + 10 : *s - 'a' + 10 ;
+               p++;
+               n++;
+           }
+           else {
+               *p++ = *s++;
+               if( *s )
+                  *p++ = *s++;
+               if( *s )
+                  *p++ = *s++;
+               if( *s )
+                  *p = 0;
+               return -1; /* bad URI */
+           }
+       }
+       else
+       {
+           *p++ = *s;
+           n++;
+       }
+    }
+    *p = 0; /* always keep a string terminator */
+    return n;
+}
+
+
+static int
+insert_escapes( byte *buffer, const byte *string, const byte *special )
+{
+    int n = 0;
+
+    for( ; *string; string++ ) {
+       if( strchr( VALID_URI_CHARS, *string )
+           && !strchr( special, *string ) )  {
+           if( buffer )
+               *buffer++ = *string;
+           n++;
+       }
+       else {
+           if( buffer ) {
+               sprintf( buffer, "%%%02X", *string );
+               buffer += 3;
+           }
+           n += 3;
+       }
+    }
+    return n;
+}
+
+
+static URI_TUPLE
+parse_tuple( byte *string )
+{
+    byte *p = string;
+    byte *p2;
+    int n;
+    URI_TUPLE tuple;
+
+    if( (p2 = strchr( p, '=' )) )
+       *p2++ = 0;
+    if( (n = remove_escapes( p )) < 0 )
+       return NULL; /* bad URI */
+    if( n != strlen( p ) )
+       return NULL; /* name with a Nul in it */
+    tuple = xmalloc_clear( sizeof *tuple );
+    tuple->name = p;
+    if( !p2 )  {
+       /* we have only the name, so we assume an empty value string */
+       tuple->value = p + strlen(p);
+       tuple->valuelen = 0;
+    }
+    else { /* name and value */
+       if( (n = remove_escapes( p2 )) < 0 ) {
+           xfree( tuple );
+           return NULL; /* bad URI */
+       }
+       tuple->value = p2;
+       tuple->valuelen = n;
+    }
+    return tuple;
+}
+
+
+/****************
+ * Send a HTTP request to the server
+ * Returns 0 if the request was successful
+ */
+static int
+send_request( HTTP_HD hd, const char *auth, const char *proxy )
+{
+    const byte *server;
+    byte *request, *p;
+    ushort port;
+    int rc;
+    char *proxy_authstr=NULL,*authstr=NULL;
+
+    server = *hd->uri->host? hd->uri->host : "localhost";
+    port   = hd->uri->port?  hd->uri->port : 80;
+
+    if(proxy && *proxy)
+      {
+       PARSED_URI uri;
+
+       rc = parse_uri( &uri, proxy );
+       if (rc)
+         {
+           log_error("invalid HTTP proxy (%s): %s\n",proxy,g10_errstr(rc));
+           release_parsed_uri( uri );
+           return G10ERR_NETWORK;
+         }
+       hd->sock = connect_server( *uri->host? uri->host : "localhost",
+                                  uri->port? uri->port : 80, 0, NULL );
+       if(uri->auth)
+         {
+           char *x;
+           remove_escapes(uri->auth);
+           x=make_radix64_string(uri->auth,strlen(uri->auth));
+           proxy_authstr=xmalloc(52+strlen(x));
+           sprintf(proxy_authstr,"Proxy-Authorization: Basic %s\r\n",x);
+           xfree(x);
+         }
+
+       release_parsed_uri( uri );
+      }
+    else
+      hd->sock = connect_server( server, port, hd->flags, hd->uri->scheme );
+
+    if(auth || hd->uri->auth)
+      {
+       char *x,*tempauth=NULL;
+
+       if(auth)
+         {
+           tempauth=xstrdup(auth);
+           remove_escapes(tempauth);
+         }
+       else if(hd->uri->auth)
+         remove_escapes(hd->uri->auth);
+
+       x=make_radix64_string(tempauth?tempauth:hd->uri->auth,
+                             strlen(tempauth?tempauth:hd->uri->auth));
+       authstr=xmalloc(52+strlen(x));
+       sprintf(authstr,"Authorization: Basic %s\r\n",x);
+       xfree(x);
+       xfree(tempauth);
+      }
+
+    if( hd->sock == -1 )
+       return G10ERR_NETWORK;
+
+    p = build_rel_path( hd->uri );
+
+    request=xmalloc(strlen(server)*2 + strlen(p)
+                   + (authstr?strlen(authstr):0)
+                   + (proxy_authstr?strlen(proxy_authstr):0) + 65);
+    if( proxy && *proxy )
+      sprintf( request, "%s http://%s:%hu%s%s HTTP/1.0\r\n%s%s",
+              hd->req_type == HTTP_REQ_GET ? "GET" :
+              hd->req_type == HTTP_REQ_HEAD? "HEAD":
+              hd->req_type == HTTP_REQ_POST? "POST": "OOPS",
+              server, port,  *p == '/'? "":"/", p,
+              authstr?authstr:"",proxy_authstr?proxy_authstr:"" );
+    else
+      {
+       char portstr[15];
+
+       if(port!=80)
+         sprintf(portstr,":%u",port);
+
+       sprintf( request, "%s %s%s HTTP/1.0\r\nHost: %s%s\r\n%s",
+                hd->req_type == HTTP_REQ_GET ? "GET" :
+                hd->req_type == HTTP_REQ_HEAD? "HEAD":
+                hd->req_type == HTTP_REQ_POST? "POST": "OOPS",
+                *p == '/'? "":"/", p, server, (port!=80)?portstr:"",
+                authstr?authstr:"");
+      }
+
+    xfree(p);
+
+    rc = write_server( hd->sock, request, strlen(request) );
+    xfree( request );
+    xfree(proxy_authstr);
+    xfree(authstr);
+
+    return rc;
+}
+
+
+/****************
+ * Build the relative path from the parsed URI.
+ * Minimal implementation.
+ */
+static byte*
+build_rel_path( PARSED_URI uri )
+{
+    URI_TUPLE r;
+    byte *rel_path, *p;
+    int n;
+
+    /* count the needed space */
+    n = insert_escapes( NULL, uri->path, "%;?&" );
+    /* todo: build params */
+    for( r=uri->query; r; r = r->next ) {
+       n++; /* '?'/'&' */
+       n += insert_escapes( NULL, r->name, "%;?&=" );
+       n++; /* '='*/
+       n += insert_escapes( NULL, r->value, "%;?&=" );
+    }
+    n++;
+
+    /* now  allocate and copy */
+    p = rel_path = xmalloc( n );
+    n = insert_escapes( p, uri->path, "%;?&" );
+    p += n;
+    /* todo: add params */
+    for( r=uri->query; r; r = r->next ) {
+       *p++ = r == uri->query? '?':'&';
+       n = insert_escapes( p, r->name, "%;?&=" );
+       p += n;
+       *p++ = '=';
+       /* todo: use valuelen */
+       n = insert_escapes( p, r->value, "%;?&=" );
+       p += n;
+    }
+    *p = 0;
+    return rel_path;
+}
+
+
+
+/***********************
+ * Parse the response from a server.
+ * Returns: errorcode and sets some fileds in the handle
+ */
+static int
+parse_response( HTTP_HD hd )
+{
+    byte *line, *p, *p2;
+    unsigned maxlen, len;
+
+    /* Wait for the status line */
+    do {
+       maxlen = MAX_LINELEN;
+       len = iobuf_read_line( hd->fp_read, &hd->buffer,
+                                           &hd->buffer_size, &maxlen );
+       line = hd->buffer;
+       if( !maxlen )
+           return -1; /* line has been truncated */
+       if( !len )
+           return -1; /* eof */
+    } while( !*line  );
+
+    if( (p = strchr( line, '/')) )
+       *p++ = 0;
+    if( !p || strcmp( line, "HTTP" ) )
+       return 0; /* assume http 0.9 */
+
+    if( (p2 = strpbrk( p, " \t" ) ) ) {
+       *p2++ = 0;
+       p2 += strspn( p2, " \t" );
+    }
+    if( !p2 )
+       return 0; /* assume http 0.9 */
+    p = p2;
+    /* todo: add HTTP version number check here */
+    if( (p2 = strpbrk( p, " \t" ) ) )
+       *p2++ = 0;
+    if( !isdigit(p[0]) || !isdigit(p[1]) || !isdigit(p[2]) || p[3] ) {
+        /* malformed HTTP statuscode - assume HTTP 0.9 */
+       hd->is_http_0_9 = 1;
+       hd->status_code = 200;
+       return 0;
+    }
+    hd->status_code = atoi( p );
+
+    /* skip all the header lines and wait for the empty line */
+    do {
+       maxlen = MAX_LINELEN;
+       len = iobuf_read_line( hd->fp_read, &hd->buffer,
+                              &hd->buffer_size, &maxlen );
+       line = hd->buffer;
+       /* we ignore truncated lines */
+       if( !len )
+           return -1; /* eof */
+       /* time lineendings */
+       if( (*line == '\r' && line[1] == '\n') || *line == '\n' )
+           *line = 0;
+    } while( len && *line  );
+
+    return 0;
+}
+
+#ifdef TEST
+static int
+start_server()
+{
+    struct sockaddr_in mya;
+    struct sockaddr_in peer;
+    int fd, client;
+    fd_set rfds;
+    int addrlen;
+    int i;
+
+    if( (fd=socket(AF_INET,SOCK_STREAM, 0)) == -1 ) {
+       log_error("socket() failed: %s\n", strerror(errno));
+       return -1;
+    }
+    i = 1;
+    if( setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, (byte*)&i, sizeof(i) ) )
+       log_info("setsockopt(SO_REUSEADDR) failed: %s\n", strerror(errno) );
+
+    mya.sin_family=AF_INET;
+    memset(&mya.sin_addr, 0, sizeof(mya.sin_addr));
+    mya.sin_port=htons(11371);
+
+    if( bind( fd, (struct sockaddr *)&mya, sizeof(mya)) ) {
+       log_error("bind to port 11371 failed: %s\n", strerror(errno) );
+       sock_close( fd );
+       return -1;
+    }
+
+    if( listen( fd, 5 ) ) {
+       log_error("listen failed: %s\n", strerror(errno) );
+       sock_close( fd );
+       return -1;
+    }
+
+    for(;;) {
+       FD_ZERO(&rfds);
+       FD_SET( fd, &rfds );
+
+       if( select( fd+1, &rfds, NULL, NULL, NULL) <= 0 )
+           continue; /* ignore any errors */
+
+       if( !FD_ISSET( fd, &rfds ) )
+           continue;
+
+       addrlen = sizeof peer;
+       client = accept( fd, (struct sockaddr *)&peer, &addrlen);
+       if( client == -1 )
+           continue; /* oops */
+
+       log_info("connect from %s\n", inet_ntoa( peer.sin_addr ) );
+
+       fflush(stdout);
+       fflush(stderr);
+       if( !fork() ) {
+           int c;
+           FILE *fp;
+
+           fp = fdopen( client , "r" );
+           while( (c=getc(fp)) != EOF )
+               putchar(c);
+           fclose(fp);
+           exit(0);
+       }
+       sock_close( client );
+    }
+
+
+    return 0;
+}
+#endif
+
+
+static int
+connect_server( const char *server, ushort port, unsigned int flags,
+               const char *srvtag )
+{
+  int sock=-1,srv,srvcount=0,connected=0,hostfound=0;
+  struct srventry *srvlist=NULL;
+
+#ifdef _WIN32
+  unsigned long inaddr;
+
+  init_sockets();
+  /* Win32 gethostbyname doesn't handle IP addresses internally, so we
+     try inet_addr first on that platform only. */
+  if((inaddr=inet_addr(server))!=INADDR_NONE)
+    {
+      struct sockaddr_in addr;
+
+      memset(&addr,0,sizeof(addr));
+
+      if((sock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET)
+       {
+         log_error("error creating socket: ec=%d\n",(int)WSAGetLastError());
+         return -1;
+       }
+
+      addr.sin_family=AF_INET; 
+      addr.sin_port=htons(port);
+      memcpy(&addr.sin_addr,&inaddr,sizeof(inaddr));      
+
+      if(connect(sock,(struct sockaddr *)&addr,sizeof(addr))==0)
+       return sock;
+      else
+       {
+         sock_close(sock);
+         return -1;
+       }
+    }
+#endif
+
+#ifdef USE_DNS_SRV
+  /* Do the SRV thing */
+  if(flags&HTTP_FLAG_TRY_SRV && srvtag)
+    {
+      /* We're using SRV, so append the tags */
+      if(1+strlen(srvtag)+6+strlen(server)+1<=MAXDNAME)
+       {
+         char srvname[MAXDNAME];
+
+         strcpy(srvname,"_");
+         strcat(srvname,srvtag);
+         strcat(srvname,"._tcp.");
+         strcat(srvname,server);
+         srvcount=getsrv(srvname,&srvlist);
+       }
+    }
+#endif
+
+  if(srvlist==NULL)
+    {
+      /* Either we're not using SRV, or the SRV lookup failed.  Make
+        up a fake SRV record. */
+      srvlist=xmalloc_clear(sizeof(struct srventry));
+      srvlist->port=port;
+      strncpy(srvlist->target,server,MAXDNAME);
+      srvlist->target[MAXDNAME-1]='\0';
+      srvcount=1;
+    }
+
+#ifdef HAVE_GETADDRINFO
+
+  for(srv=0;srv<srvcount;srv++)
+    {
+      struct addrinfo hints,*res,*ai;
+      char portstr[6];
+
+      sprintf(portstr,"%u",srvlist[srv].port);
+      memset(&hints,0,sizeof(hints));
+      hints.ai_socktype=SOCK_STREAM;
+      if(getaddrinfo(srvlist[srv].target,portstr,&hints,&res)==0)
+       hostfound=1;
+      else
+       continue;
+
+      for(ai=res;ai;ai=ai->ai_next)
+       {
+         if((sock=socket(ai->ai_family,ai->ai_socktype,ai->ai_protocol))==-1)
+           {
+             log_error("error creating socket: %s\n",strerror(errno));
+             freeaddrinfo(res);
+             return -1;
+           }
+
+         if(connect(sock,ai->ai_addr,ai->ai_addrlen)==0)
+           {
+             connected=1;
+             break;
+           }
+
+         sock_close(sock);
+       }
+
+      freeaddrinfo(res);
+
+      if(ai)
+       break;
+    }
+
+#else /* !HAVE_GETADDRINFO */
+
+  for(srv=0;srv<srvcount;srv++)
+    {
+      int i=0;
+      struct hostent *host=NULL;
+      struct sockaddr_in addr;
+
+      memset(&addr,0,sizeof(addr));
+
+      if((host=gethostbyname(srvlist[srv].target))==NULL)
+       continue;
+
+      hostfound=1;
+
+      if((sock=socket(host->h_addrtype,SOCK_STREAM,0))==-1)
+       {
+         log_error("error creating socket: %s\n",strerror(errno));
+         return -1;
+       }
+
+      addr.sin_family=host->h_addrtype;
+      if(addr.sin_family!=AF_INET)
+       {
+         log_error("%s: unknown address family\n",srvlist[srv].target);
+         return -1;
+       }
+
+      addr.sin_port=htons(srvlist[srv].port);
+
+      /* Try all A records until one responds. */
+      while(host->h_addr_list[i])
+       {
+         if(host->h_length!=4)
+           {
+             log_error("%s: illegal address length\n",srvlist[srv].target);
+             return -1;
+           }
+
+         memcpy(&addr.sin_addr,host->h_addr_list[i],host->h_length);
+
+         if(connect(sock,(struct sockaddr *)&addr,sizeof(addr))==0)
+           {
+             connected=1;
+             break;
+           }
+
+         i++;
+       }
+
+      if(host->h_addr_list[i])
+       break;
+
+      sock_close(sock);
+    }
+#endif /* !HAVE_GETADDRINFO */
+
+  xfree(srvlist);
+
+  if(!connected)
+    {
+      int err=errno;
+#ifdef _WIN32
+      if(hostfound)
+       log_error("%s: Unable to connect: ec=%d\n",server,(int)WSAGetLastError());
+      else
+       log_error("%s: Host not found: ec=%d\n",server,(int)WSAGetLastError());
+#else
+      if(hostfound)
+       log_error("%s: %s\n",server,strerror(err));
+      else
+       log_error("%s: Host not found\n",server);
+#endif
+      if(sock!=-1)
+       sock_close(sock);
+      errno=err;
+      return -1;
+    }
+
+  return sock;
+}
+
+
+static int
+write_server( int sock, const char *data, size_t length )
+{
+    int nleft;
+
+    nleft = length;
+    while( nleft > 0 ) {
+#ifdef _WIN32  
+        int nwritten;
+
+        nwritten = send (sock, data, nleft, 0);
+        if ( nwritten == SOCKET_ERROR ) {
+           log_info ("write failed: ec=%d\n", (int)WSAGetLastError ());
+           return G10ERR_NETWORK;
+        }
+#else
+       int nwritten = write( sock, data, nleft );
+       if( nwritten == -1 ) {
+           if( errno == EINTR )
+               continue;
+           if( errno == EAGAIN ) {
+               struct timeval tv;
+
+               tv.tv_sec =  0;
+               tv.tv_usec = 50000;
+               select(0, NULL, NULL, NULL, &tv);
+               continue;
+           }
+           log_info("write failed: %s\n", strerror(errno));
+           return G10ERR_NETWORK;
+       }
+#endif
+       nleft -=nwritten;
+       data += nwritten;
+    }
+
+    return 0;
+}
+
+/**** Test code ****/
+#ifdef TEST
+
+int
+main(int argc, char **argv)
+{
+    int rc;
+    PARSED_URI uri;
+    URI_TUPLE r;
+    struct http_context hd;
+    int c;
+
+    log_set_name("http-test");
+    if( argc == 1 ) {
+       start_server();
+       return 0;
+    }
+
+    if( argc != 2 ) {
+       fprintf(stderr,"usage: http-test uri\n");
+       return 1;
+    }
+    argc--; argv++;
+
+    rc = parse_uri( &uri, *argv );
+    if( rc ) {
+       log_error("`%s': %s\n", *argv, g10_errstr(rc));
+       release_parsed_uri( uri );
+       return 1;
+    }
+
+    printf("Scheme: %s\n", uri->scheme );
+    printf("Host  : %s\n", uri->host );
+    printf("Port  : %u\n", uri->port );
+    printf("Path  : %s\n", uri->path );
+    for( r=uri->params; r; r = r->next ) {
+       printf("Params: %s=%s", r->name, r->value );
+       if( strlen( r->value ) != r->valuelen )
+           printf(" [real length=%d]", (int)r->valuelen );
+       putchar('\n');
+    }
+    for( r=uri->query; r; r = r->next ) {
+       printf("Query : %s=%s", r->name, r->value );
+       if( strlen( r->value ) != r->valuelen )
+           printf(" [real length=%d]", (int)r->valuelen );
+       putchar('\n');
+    }
+    release_parsed_uri( uri ); uri = NULL;
+
+    rc = http_open_document( &hd, *argv, 0, NULL );
+    if( rc ) {
+       log_error("can't get `%s': %s\n", *argv, g10_errstr(rc));
+       return 1;
+    }
+    log_info("open_http_document succeeded; status=%u\n", hd.status_code );
+    while( (c=iobuf_get( hd.fp_read)) != -1 )
+       putchar(c);
+    http_close( &hd );
+    return 0;
+}
+#endif /*TEST*/
diff --git a/util/iobuf.c b/util/iobuf.c
new file mode 100644 (file)
index 0000000..f6e817c
--- /dev/null
@@ -0,0 +1,2276 @@
+/* iobuf.c  -  file handling
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <assert.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h> 
+#include <unistd.h>
+#ifdef HAVE_DOSISH_SYSTEM
+#include <windows.h>
+#endif
+#ifdef __riscos__
+#include <kernel.h>
+#include <swis.h>
+#endif /* __riscos__ */
+
+#include "memory.h"
+#include "util.h"
+#include "dynload.h"
+#include "iobuf.h"
+
+/* The size of the internal buffers. 
+   NOTE: If you change this value you MUST also adjust the regression
+   test "armored_key_8192" in armor.test! */
+#define IOBUF_BUFFER_SIZE  8192
+
+
+#undef FILE_FILTER_USES_STDIO
+
+#ifdef HAVE_DOSISH_SYSTEM
+#define USE_SETMODE 1
+#endif
+
+#ifdef FILE_FILTER_USES_STDIO
+#define my_fileno(a)  fileno ((a))
+#define my_fopen_ro(a,b) fopen ((a),(b))
+#define my_fopen(a,b)    fopen ((a),(b))
+typedef FILE *FILEP_OR_FD;
+#define INVALID_FP    NULL
+#define FILEP_OR_FD_FOR_STDIN  (stdin)
+#define FILEP_OR_FD_FOR_STDOUT  (stdout)
+typedef struct {
+     FILE *fp;    /* open file handle */
+     int keep_open;
+     int no_cache;
+     int  print_only_name; /* flags indicating that fname is not a real file*/
+     char fname[1]; /* name of the file */
+ } file_filter_ctx_t ;
+#else
+#define my_fileno(a)  (a)
+#define my_fopen_ro(a,b) fd_cache_open ((a),(b)) 
+#define my_fopen(a,b) direct_open ((a),(b)) 
+#ifdef HAVE_DOSISH_SYSTEM
+typedef HANDLE FILEP_OR_FD;
+#define INVALID_FP  ((HANDLE)-1)
+#define FILEP_OR_FD_FOR_STDIN  (GetStdHandle (STD_INPUT_HANDLE))
+#define FILEP_OR_FD_FOR_STDOUT (GetStdHandle (STD_OUTPUT_HANDLE))
+#undef USE_SETMODE
+#else
+typedef int FILEP_OR_FD;
+#define INVALID_FP  (-1)
+#define FILEP_OR_FD_FOR_STDIN  (0)
+#define FILEP_OR_FD_FOR_STDOUT (1)
+#endif
+typedef struct {
+     FILEP_OR_FD  fp;     /* open file handle */
+     int keep_open;
+     int no_cache;
+     int eof_seen;
+     int  print_only_name; /* flags indicating that fname is not a real file*/
+     char fname[1]; /* name of the file */
+ } file_filter_ctx_t ;
+
+ struct close_cache_s { 
+    struct close_cache_s *next;
+    FILEP_OR_FD fp;
+    char fname[1];
+ };
+ typedef struct close_cache_s *CLOSE_CACHE;
+ static CLOSE_CACHE close_cache;
+#endif
+
+#ifdef _WIN32
+typedef struct {
+    int sock;
+    int keep_open;
+    int no_cache;
+    int eof_seen;
+    int  print_only_name; /* flags indicating that fname is not a real file*/
+    char fname[1]; /* name of the file */
+} sock_filter_ctx_t ;
+#endif /*_WIN32*/
+
+/* The first partial length header block must be of size 512
+ * to make it easier (and efficienter) we use a min. block size of 512
+ * for all chunks (but the last one) */
+#define OP_MIN_PARTIAL_CHUNK     512
+#define OP_MIN_PARTIAL_CHUNK_2POW 9
+
+typedef struct {
+    int use;
+    size_t size;
+    size_t count;
+    int partial;  /* 1 = partial header, 2 in last partial packet */
+    char *buffer;    /* used for partial header */
+    size_t buflen;   /* used size of buffer */
+    int first_c;     /* of partial header (which is > 0)*/
+    int eof;
+} block_filter_ctx_t;
+
+static int special_names_enabled;
+
+static int underflow(IOBUF a);
+static int translate_file_handle ( int fd, int for_write );
+
+
+\f
+#ifndef FILE_FILTER_USES_STDIO
+
+/* This is a replacement for strcmp.  Under W32 it does not
+   distinguish between backslash and slash.  */
+static int
+fd_cache_strcmp (const char *a, const char *b)
+{
+#ifdef HAVE_DOSISH_SYSTEM
+  for (; *a && *b; a++, b++)
+    {
+      if (*a != *b && !((*a == '/' && *b == '\\') 
+                        || (*a == '\\' && *b == '/')) )
+        break;
+    }
+  return *(const unsigned char *)a - *(const unsigned char *)b;
+#else
+  return strcmp (a, b);
+#endif
+}
+
+/*
+ * Invalidate (i.e. close) a cached iobuf or all iobufs if NULL is
+ * used for FNAME.
+ */
+static void
+fd_cache_invalidate (const char *fname)
+{
+    CLOSE_CACHE cc;
+
+    if (!fname) {
+        if( DBG_IOBUF )
+            log_debug ("fd_cache_invalidate (all)\n");
+
+        for (cc=close_cache; cc; cc = cc->next ) {
+            if ( cc->fp != INVALID_FP ) {
+#ifdef HAVE_DOSISH_SYSTEM
+                CloseHandle (cc->fp);
+#else
+                close(cc->fp);
+#endif
+                cc->fp = INVALID_FP;
+            }
+        }
+        return;
+    }
+
+    if( DBG_IOBUF )
+        log_debug ("fd_cache_invalidate (%s)\n", fname);
+
+    for (cc=close_cache; cc; cc = cc->next ) {
+        if ( cc->fp != INVALID_FP && !fd_cache_strcmp (cc->fname, fname) ) {
+            if( DBG_IOBUF )
+                log_debug ("                did (%s)\n", cc->fname);
+#ifdef HAVE_DOSISH_SYSTEM
+            CloseHandle (cc->fp);
+#else
+           close(cc->fp);
+#endif
+            cc->fp = INVALID_FP;
+        }
+    }
+}
+
+
+
+static FILEP_OR_FD
+direct_open (const char *fname, const char *mode)
+{
+#ifdef HAVE_DOSISH_SYSTEM
+    unsigned long da, cd, sm;
+    HANDLE hfile;
+
+    /* Note, that we do not handle all mode combinations */
+
+    /* According to the ReactOS source it seems that open() of the
+     * standard MSW32 crt does open the file in share mode which is
+     * something new for MS applications ;-)
+     */
+    if ( strchr (mode, '+') ) {
+        fd_cache_invalidate (fname);
+        da = GENERIC_READ|GENERIC_WRITE;
+        cd = OPEN_EXISTING;
+        sm = FILE_SHARE_READ | FILE_SHARE_WRITE;
+    }
+    else if ( strchr (mode, 'w') ) {
+        fd_cache_invalidate (fname);
+        da = GENERIC_WRITE;
+        cd = CREATE_ALWAYS;
+        sm = FILE_SHARE_WRITE;
+    }
+    else {
+        da = GENERIC_READ;
+        cd = OPEN_EXISTING;
+        sm = FILE_SHARE_READ;
+    }
+
+    hfile = CreateFile (fname, da, sm, NULL, cd, FILE_ATTRIBUTE_NORMAL, NULL);
+    return hfile;
+#else
+    int oflag;
+    int cflag = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH;
+
+    /* Note, that we do not handle all mode combinations */
+    if ( strchr (mode, '+') ) {
+        fd_cache_invalidate (fname);
+        oflag = O_RDWR;
+    }
+    else if ( strchr (mode, 'w') ) {
+        fd_cache_invalidate (fname);
+        oflag = O_WRONLY | O_CREAT | O_TRUNC;
+    }
+    else {
+        oflag = O_RDONLY;
+    }
+#ifdef O_BINARY
+    if (strchr (mode, 'b'))
+      oflag |= O_BINARY;
+#endif
+#ifndef __riscos__
+    return open (fname, oflag, cflag );
+#else
+    {
+        struct stat buf;
+        int rc = stat( fname, &buf );
+        
+        /* Don't allow iobufs on directories */
+        if( !rc && S_ISDIR(buf.st_mode) && !S_ISREG(buf.st_mode) )
+            return __set_errno( EISDIR );
+        else
+            return open( fname, oflag, cflag );
+    }
+#endif
+#endif
+}
+
+
+/*
+ * Instead of closing an FD we keep it open and cache it for later reuse 
+ * Note that this caching strategy only works if the process does not chdir.
+ */
+static void
+fd_cache_close (const char *fname, FILEP_OR_FD fp)
+{
+    CLOSE_CACHE cc;
+
+    assert (fp);
+    if ( !fname || !*fname ) {
+#ifdef HAVE_DOSISH_SYSTEM
+        CloseHandle (fp);
+#else
+        close(fp);
+#endif
+        if( DBG_IOBUF )
+            log_debug ("fd_cache_close (%p) real\n", (void*)fp);
+        return;
+    }
+    /* try to reuse a slot */
+    for (cc=close_cache; cc; cc = cc->next ) {
+        if ( cc->fp == INVALID_FP && !fd_cache_strcmp (cc->fname, fname) ) {
+            cc->fp = fp;
+            if( DBG_IOBUF )
+                log_debug ("fd_cache_close (%s) used existing slot\n", fname);
+            return;
+        }
+    }
+    /* add a new one */
+    if( DBG_IOBUF )
+        log_debug ("fd_cache_close (%s) new slot created\n", fname);
+    cc = xmalloc_clear (sizeof *cc + strlen (fname));
+    strcpy (cc->fname, fname);
+    cc->fp = fp;
+    cc->next = close_cache;
+    close_cache = cc;
+}
+
+/*
+ * Do an direct_open on FNAME but first try to reuse one from the fd_cache
+ */
+static FILEP_OR_FD
+fd_cache_open (const char *fname, const char *mode)
+{
+    CLOSE_CACHE cc;
+
+    assert (fname);
+    for (cc=close_cache; cc; cc = cc->next ) {
+        if ( cc->fp != INVALID_FP && !fd_cache_strcmp (cc->fname, fname) ) {
+            FILEP_OR_FD fp = cc->fp;
+            cc->fp = INVALID_FP;
+            if( DBG_IOBUF )
+                log_debug ("fd_cache_open (%s) using cached fp\n", fname);
+#ifdef HAVE_DOSISH_SYSTEM
+            if (SetFilePointer (fp, 0, NULL, FILE_BEGIN) == 0xffffffff ) {
+                log_error ("rewind file failed on handle %p: %s\n",
+                           fp, w32_strerror (errno));
+                fp = INVALID_FP;
+            }
+#else
+            if ( lseek (fp, 0, SEEK_SET) == (off_t)-1 ) {
+                log_error("can't rewind fd %d: %s\n", fp, strerror(errno) );
+                fp = INVALID_FP;
+            }
+#endif
+            return fp;
+        }
+    }
+    if( DBG_IOBUF )
+        log_debug ("fd_cache_open (%s) not cached\n", fname);
+    return direct_open (fname, mode);
+}
+
+
+#endif /*FILE_FILTER_USES_STDIO*/
+
+
+/****************
+ * Read data from a file into buf which has an allocated length of *LEN.
+ * return the number of read bytes in *LEN. OPAQUE is the FILE * of
+ * the stream. A is not used.
+ * control may be:
+ * IOBUFCTRL_INIT: called just before the function is linked into the
+ *                list of function. This can be used to prepare internal
+ *                data structures of the function.
+ * IOBUFCTRL_FREE: called just before the function is removed from the
+ *                 list of functions and can be used to release internal
+ *                 data structures or close a file etc.
+ * IOBUFCTRL_UNDERFLOW: called by iobuf_underflow to fill the buffer
+ *                 with new stuff. *RET_LEN is the available size of the
+ *                 buffer, and should be set to the number of bytes
+ *                 which were put into the buffer. The function
+ *                 returns 0 to indicate success, -1 on EOF and
+ *                 G10ERR_xxxxx for other errors.
+ *
+ * IOBUFCTRL_FLUSH: called by iobuf_flush() to write out the collected stuff.
+ *                 *RET_LAN is the number of bytes in BUF.
+ *
+ * IOBUFCTRL_CANCEL: send to all filters on behalf of iobuf_cancel.  The
+ *                 filter may take appropriate action on this message.
+ */
+static int
+file_filter(void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len)
+{
+    file_filter_ctx_t *a = opaque;
+    FILEP_OR_FD f = a->fp;
+    size_t size = *ret_len;
+    size_t nbytes = 0;
+    int rc = 0;
+
+#ifdef FILE_FILTER_USES_STDIO
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       assert( size ); /* need a buffer */
+       if ( feof(f)) { /* On terminals you could easiely read as many EOFs as you call         */
+           rc = -1;            /* fread() or fgetc() repeatly. Every call will block until you press   */
+           *ret_len = 0;       /* CTRL-D. So we catch this case before we call fread() again.          */
+       }
+       else {
+           clearerr( f );
+           nbytes = fread( buf, 1, size, f );
+           if( feof(f) && !nbytes ) {
+               rc = -1; /* okay: we can return EOF now. */
+            }
+           else if( ferror(f) && errno != EPIPE  ) {
+               log_error("%s: read error: %s\n",
+                         a->fname, strerror(errno));
+               rc = G10ERR_READ_FILE;
+           }
+           *ret_len = nbytes;
+       }
+    }
+    else if( control == IOBUFCTRL_FLUSH ) {
+       if( size ) {
+           clearerr( f );
+           nbytes = fwrite( buf, 1, size, f );
+           if( ferror(f) ) {
+               log_error("%s: write error: %s\n", a->fname, strerror(errno));
+               rc = G10ERR_WRITE_FILE;
+           }
+       }
+       *ret_len = nbytes;
+    }
+    else if( control == IOBUFCTRL_INIT ) {
+        a->keep_open = a->no_cache = 0;
+    }
+    else if( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "file_filter";
+    }
+    else if( control == IOBUFCTRL_FREE ) {
+       if( f != stdin && f != stdout ) {
+           if( DBG_IOBUF )
+               log_debug("%s: close fd %d\n", a->fname, fileno(f) );
+            if (!a->keep_open)
+                fclose(f);
+       }
+       f = NULL;
+       xfree(a); /* we can free our context now */
+    }
+#else /* !stdio implementation */
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       assert( size ); /* need a buffer */
+       if ( a->eof_seen) {
+           rc = -1;            
+           *ret_len = 0;       
+       }
+       else {
+#ifdef HAVE_DOSISH_SYSTEM
+            unsigned long nread;
+
+            nbytes = 0;
+            if ( !ReadFile ( f, buf, size, &nread, NULL ) ) {
+                if ((int)GetLastError () != ERROR_BROKEN_PIPE) {
+                    log_error ("%s: read error: %s\n", a->fname,
+                               w32_strerror (0));
+                    rc = G10ERR_READ_FILE;
+                }
+            }
+            else if ( !nread ) {
+                a->eof_seen = 1;
+                rc = -1;
+            }
+            else {
+                nbytes = nread;
+            }
+
+#else
+
+            int n;
+
+            nbytes = 0;
+            do {
+                n = read ( f, buf, size );
+            } while (n == -1 && errno == EINTR );
+            if ( n == -1 ) { /* error */
+                if (errno != EPIPE) {
+                    log_error("%s: read error: %s\n",
+                              a->fname, strerror(errno));
+                    rc = G10ERR_READ_FILE;
+                }
+            }
+            else if ( !n ) { /* eof */
+                a->eof_seen = 1;
+                rc = -1;
+            }
+            else {
+                nbytes = n;
+            }
+#endif
+           *ret_len = nbytes;
+       }
+    }
+    else if( control == IOBUFCTRL_FLUSH ) {
+       if( size ) {
+#ifdef HAVE_DOSISH_SYSTEM
+            byte *p = buf;
+            unsigned long n;
+
+            nbytes = size;
+            do {
+                if (size && !WriteFile (f,  p, nbytes, &n, NULL)) {
+                    log_error ("%s: write error: %s\n", a->fname,
+                               w32_strerror (0));
+                    rc = G10ERR_WRITE_FILE;
+                    break;
+                }
+                p += n;
+                nbytes -= n;
+            } while ( nbytes );
+            nbytes = p - buf;
+#else
+            byte *p = buf;
+            int n;
+
+            nbytes = size;
+            do {
+                do {
+                    n = write ( f, p, nbytes );
+                } while ( n == -1 && errno == EINTR );
+                if ( n > 0 ) {
+                    p += n;
+                    nbytes -= n;
+                }
+            } while ( n != -1 && nbytes );
+           if( n == -1 ) {
+               log_error("%s: write error: %s\n", a->fname, strerror(errno));
+               rc = G10ERR_WRITE_FILE;
+           }
+            nbytes = p - buf;
+#endif
+       }
+       *ret_len = nbytes;
+    }
+    else if ( control == IOBUFCTRL_INIT ) {
+        a->eof_seen = 0;
+        a->keep_open = 0;
+        a->no_cache = 0;
+    }
+    else if ( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "file_filter(fd)";
+    }
+    else if ( control == IOBUFCTRL_FREE ) {
+#ifdef HAVE_DOSISH_SYSTEM
+        if ( f != FILEP_OR_FD_FOR_STDIN && f != FILEP_OR_FD_FOR_STDOUT ) {
+           if( DBG_IOBUF )
+               log_debug("%s: close handle %p\n", a->fname, f );
+            if (!a->keep_open)
+                fd_cache_close (a->no_cache?NULL:a->fname, f);
+        }
+#else
+       if ( (int)f != 0 && (int)f != 1 ) {
+           if( DBG_IOBUF )
+               log_debug("%s: close fd %d\n", a->fname, f );
+            if (!a->keep_open)
+                fd_cache_close (a->no_cache?NULL:a->fname, f);
+       }
+       f = INVALID_FP;
+#endif
+       xfree (a); /* we can free our context now */
+    }
+#endif /* !stdio implementation */
+    return rc;
+}
+
+#ifdef _WIN32
+/* Becuase sockets are an special object under Lose32 we have to
+ * use a special filter */
+static int
+sock_filter (void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len)
+{
+    sock_filter_ctx_t *a = opaque;
+    size_t size = *ret_len;
+    size_t nbytes = 0;
+    int rc = 0;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       assert( size ); /* need a buffer */
+       if ( a->eof_seen) {
+           rc = -1;            
+           *ret_len = 0;       
+       }
+       else {
+            int nread;
+
+            nread = recv ( a->sock, buf, size, 0 );
+            if ( nread == SOCKET_ERROR ) {
+                int ec = (int)WSAGetLastError ();
+                log_error("socket read error: ec=%d\n", ec);
+                rc = G10ERR_READ_FILE;
+            }
+            else if ( !nread ) {
+                a->eof_seen = 1;
+                rc = -1;
+            }
+            else {
+                nbytes = nread;
+            }
+           *ret_len = nbytes;
+       }
+    }
+    else if( control == IOBUFCTRL_FLUSH ) {
+       if( size ) {
+            byte *p = buf;
+            int n;
+
+            nbytes = size;
+            do {
+                n = send (a->sock, p, nbytes, 0);
+                if ( n == SOCKET_ERROR ) {
+                    int ec = (int)WSAGetLastError ();
+                    log_error("socket write error: ec=%d\n", ec);
+                    rc = G10ERR_WRITE_FILE;
+                    break;
+                }
+                p += n;
+                nbytes -= n;
+            } while ( nbytes );
+            nbytes = p - buf;
+       }
+       *ret_len = nbytes;
+    }
+    else if ( control == IOBUFCTRL_INIT ) {
+        a->eof_seen = 0;
+        a->keep_open = 0;
+        a->no_cache = 0;
+    }
+    else if ( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "sock_filter";
+    }
+    else if ( control == IOBUFCTRL_FREE ) {
+        if (!a->keep_open)
+            closesocket (a->sock);
+       xfree (a); /* we can free our context now */
+    }
+    return rc;
+}
+#endif /*_WIN32*/
+
+/****************
+ * This is used to implement the block write mode.
+ * Block reading is done on a byte by byte basis in readbyte(),
+ * without a filter
+ */
+static int
+block_filter(void *opaque, int control, IOBUF chain, byte *buf, size_t *ret_len)
+{
+    block_filter_ctx_t *a = opaque;
+    size_t size = *ret_len;
+    int c, needed, rc = 0;
+    char *p;
+
+    if( control == IOBUFCTRL_UNDERFLOW ) {
+       size_t n=0;
+
+       p = buf;
+       assert( size ); /* need a buffer */
+       if( a->eof ) /* don't read any further */
+           rc = -1;
+       while( !rc && size ) {
+           if( !a->size ) { /* get the length bytes */
+               if( a->partial == 2 ) {
+                   a->eof = 1;
+                   if( !n )
+                       rc = -1;
+                   break;
+               }
+               else if( a->partial ) {
+                   /* These OpenPGP introduced huffman like encoded length
+                    * bytes are really a mess :-( */
+                   if( a->first_c ) {
+                       c = a->first_c;
+                       a->first_c = 0;
+                   }
+                   else if( (c = iobuf_get(chain)) == -1 ) {
+                       log_error("block_filter: 1st length byte missing\n");
+                       rc = G10ERR_READ_FILE;
+                       break;
+                   }
+                   if( c < 192 ) {
+                       a->size = c;
+                       a->partial = 2;
+                       if( !a->size ) {
+                           a->eof = 1;
+                           if( !n )
+                               rc = -1;
+                           break;
+                       }
+                   }
+                   else if( c < 224 ) {
+                       a->size = (c - 192) * 256;
+                       if( (c = iobuf_get(chain)) == -1 ) {
+                           log_error("block_filter: 2nd length byte missing\n");
+                           rc = G10ERR_READ_FILE;
+                           break;
+                       }
+                       a->size += c + 192;
+                       a->partial = 2;
+                       if( !a->size ) {
+                           a->eof = 1;
+                           if( !n )
+                               rc = -1;
+                           break;
+                       }
+                   }
+                   else if( c == 255 ) {
+                       a->size  = iobuf_get(chain) << 24;
+                       a->size |= iobuf_get(chain) << 16;
+                       a->size |= iobuf_get(chain) << 8;
+                       if( (c = iobuf_get(chain)) == -1 ) {
+                           log_error("block_filter: invalid 4 byte length\n");
+                           rc = G10ERR_READ_FILE;
+                           break;
+                       }
+                       a->size |= c;
+                       a->partial = 2;
+                       if( !a->size ) {
+                           a->eof = 1;
+                           if( !n )
+                               rc = -1;
+                           break;
+                       }
+                   }
+                   else { /* next partial body length */
+                       a->size = 1 << (c & 0x1f);
+                   }
+           /*  log_debug("partial: ctx=%p c=%02x size=%u\n", a, c, a->size);*/
+               }
+               else
+                 BUG();
+           }
+
+           while( !rc && size && a->size ) {
+               needed = size < a->size ? size : a->size;
+               c = iobuf_read( chain, p, needed );
+               if( c < needed ) {
+                   if( c == -1 ) c = 0;
+                   log_error("block_filter %p: read error (size=%lu,a->size=%lu)\n",
+                             a,  (ulong)size+c, (ulong)a->size+c);
+                   rc = G10ERR_READ_FILE;
+               }
+               else {
+                   size -= c;
+                   a->size -= c;
+                   p += c;
+                   n += c;
+               }
+           }
+       }
+       *ret_len = n;
+    }
+    else if( control == IOBUFCTRL_FLUSH ) {
+       if( a->partial ) { /* the complicated openpgp scheme */
+           size_t blen, n, nbytes = size + a->buflen;
+
+           assert( a->buflen <= OP_MIN_PARTIAL_CHUNK );
+           if( nbytes < OP_MIN_PARTIAL_CHUNK ) {
+               /* not enough to write a partial block out; so we store it*/
+               if( !a->buffer )
+                   a->buffer = xmalloc( OP_MIN_PARTIAL_CHUNK );
+               memcpy( a->buffer + a->buflen, buf, size );
+               a->buflen += size;
+           }
+           else { /* okay, we can write out something */
+               /* do this in a loop to use the most efficient block lengths */
+               p = buf;
+               do {
+                   /* find the best matching block length - this is limited
+                    * by the size of the internal buffering */
+                   for( blen=OP_MIN_PARTIAL_CHUNK*2,
+                           c=OP_MIN_PARTIAL_CHUNK_2POW+1; blen <= nbytes;
+                                                           blen *=2, c++ )
+                       ;
+                   blen /= 2; c--;
+                   /* write the partial length header */
+                   assert( c <= 0x1f ); /*;-)*/
+                   c |= 0xe0;
+                   iobuf_put( chain, c );
+                   if( (n=a->buflen) ) { /* write stuff from the buffer */
+                       assert( n == OP_MIN_PARTIAL_CHUNK);
+                       if( iobuf_write(chain, a->buffer, n ) )
+                           rc = G10ERR_WRITE_FILE;
+                       a->buflen = 0;
+                       nbytes -= n;
+                   }
+                   if( (n = nbytes) > blen )
+                       n = blen;
+                   if( n && iobuf_write(chain, p, n ) )
+                       rc = G10ERR_WRITE_FILE;
+                   p += n;
+                   nbytes -= n;
+               } while( !rc && nbytes >= OP_MIN_PARTIAL_CHUNK );
+               /* store the rest in the buffer */
+               if( !rc && nbytes ) {
+                   assert( !a->buflen );
+                   assert( nbytes < OP_MIN_PARTIAL_CHUNK );
+                   if( !a->buffer )
+                       a->buffer = xmalloc( OP_MIN_PARTIAL_CHUNK );
+                   memcpy( a->buffer, p, nbytes );
+                   a->buflen = nbytes;
+               }
+           }
+       }
+       else
+         BUG();
+    }
+    else if( control == IOBUFCTRL_INIT ) {
+       if( DBG_IOBUF )
+           log_debug("init block_filter %p\n", a );
+       if( a->partial )
+           a->count = 0;
+       else if( a->use == 1 )
+           a->count = a->size = 0;
+       else
+           a->count = a->size; /* force first length bytes */
+       a->eof = 0;
+       a->buffer = NULL;
+       a->buflen = 0;
+    }
+    else if( control == IOBUFCTRL_DESC ) {
+       *(char**)buf = "block_filter";
+    }
+    else if( control == IOBUFCTRL_FREE ) {
+       if( a->use == 2 ) { /* write the end markers */
+           if( a->partial ) {
+               u32 len;
+               /* write out the remaining bytes without a partial header
+                * the length of this header may be 0 - but if it is
+                * the first block we are not allowed to use a partial header
+                * and frankly we can't do so, because this length must be
+                * a power of 2. This is _really_ complicated because we
+                * have to check the possible length of a packet prior
+                * to it's creation: a chain of filters becomes complicated
+                * and we need a lot of code to handle compressed packets etc.
+                *   :-(((((((
+                */
+               /* construct header */
+               len = a->buflen;
+               /*log_debug("partial: remaining length=%u\n", len );*/
+               if( len < 192 )
+                   rc = iobuf_put(chain, len );
+               else if( len < 8384 ) {
+                   if( !(rc=iobuf_put( chain, ((len-192) / 256) + 192)) )
+                       rc = iobuf_put( chain, ((len-192) % 256));
+               }
+               else { /* use a 4 byte header */
+                   if( !(rc=iobuf_put( chain, 0xff )) )
+                       if( !(rc=iobuf_put( chain, (len >> 24)&0xff )) )
+                           if( !(rc=iobuf_put( chain, (len >> 16)&0xff )) )
+                               if( !(rc=iobuf_put( chain, (len >> 8)&0xff )))
+                                   rc=iobuf_put( chain, len & 0xff );
+               }
+               if( !rc && len )
+                   rc = iobuf_write(chain, a->buffer, len );
+               if( rc ) {
+                   log_error("block_filter: write error: %s\n",strerror(errno));
+                   rc = G10ERR_WRITE_FILE;
+               }
+               xfree( a->buffer ); a->buffer = NULL; a->buflen = 0;
+           }
+           else
+             BUG();
+       }
+       else if( a->size ) {
+           log_error("block_filter: pending bytes!\n");
+       }
+       if( DBG_IOBUF )
+           log_debug("free block_filter %p\n", a );
+       xfree(a); /* we can free our context now */
+    }
+
+    return rc;
+}
+
+
+static void
+print_chain( IOBUF a )
+{
+    if( !DBG_IOBUF )
+       return;
+    for(; a; a = a->chain ) {
+       size_t dummy_len = 0;
+       const char *desc = "[none]";
+
+       if( a->filter )
+           a->filter( a->filter_ov, IOBUFCTRL_DESC, NULL,
+                                               (byte*)&desc, &dummy_len );
+
+       log_debug("iobuf chain: %d.%d `%s' filter_eof=%d start=%d len=%d\n",
+                  a->no, a->subno, desc, a->filter_eof,
+                  (int)a->d.start, (int)a->d.len );
+    }
+}
+
+int
+iobuf_print_chain( IOBUF a )
+{
+    print_chain(a);
+    return 0;
+}
+
+/****************
+ * Allocate a new io buffer, with no function assigned.
+ * Use is the desired usage: 1 for input, 2 for output, 3 for temp buffer
+ * BUFSIZE is a suggested buffer size.
+ */
+IOBUF
+iobuf_alloc(int use, size_t bufsize)
+{
+    IOBUF a;
+    static int number=0;
+
+    a = xmalloc_clear(sizeof *a);
+    a->use = use;
+    a->d.buf = xmalloc( bufsize );
+    a->d.size = bufsize;
+    a->no = ++number;
+    a->subno = 0;
+    a->opaque = NULL;
+    a->real_fname = NULL;
+    return a;
+}
+
+int
+iobuf_close ( IOBUF a )
+{
+    IOBUF a2;
+    size_t dummy_len=0;
+    int rc=0;
+
+    if( a && a->directfp ) {
+       fclose( a->directfp );
+       xfree( a->real_fname );
+       if( DBG_IOBUF )
+           log_debug("iobuf_close -> %p\n", a->directfp );
+       return 0;
+    }
+
+    for( ; a && !rc ; a = a2 ) {
+       a2 = a->chain;
+       if( a->use == 2 && (rc=iobuf_flush(a)) )
+           log_error("iobuf_flush failed on close: %s\n", g10_errstr(rc));
+
+       if( DBG_IOBUF )
+           log_debug("iobuf-%d.%d: close `%s'\n", a->no, a->subno, a->desc );
+       if( a->filter && (rc = a->filter(a->filter_ov, IOBUFCTRL_FREE,
+                                        a->chain, NULL, &dummy_len)) )
+           log_error("IOBUFCTRL_FREE failed on close: %s\n", g10_errstr(rc) );
+       xfree(a->real_fname);
+        if (a->d.buf) {
+            memset (a->d.buf, 0, a->d.size); /* erase the buffer */
+            xfree(a->d.buf);
+        }
+       xfree(a);
+    }
+    return rc;
+}
+
+int
+iobuf_cancel( IOBUF a )
+{
+    const char *s;
+    IOBUF a2;
+    int rc;
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+    char *remove_name = NULL;
+#endif
+
+    if( a && a->use == 2 ) {
+       s = iobuf_get_real_fname(a);
+       if( s && *s ) {
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+           remove_name = xstrdup ( s );
+#else
+           remove(s);
+#endif
+       }
+    }
+
+    /* send a cancel message to all filters */
+    for( a2 = a; a2 ; a2 = a2->chain ) {
+       size_t dummy;
+       if( a2->filter )
+           a2->filter( a2->filter_ov, IOBUFCTRL_CANCEL, a2->chain,
+                                                        NULL, &dummy );
+    }
+
+    rc = iobuf_close(a);
+#if defined(HAVE_DOSISH_SYSTEM) || defined(__riscos__)
+    if ( remove_name ) {
+       /* Argg, MSDOS does not allow to remove open files.  So
+        * we have to do it here */
+       remove ( remove_name );
+       xfree ( remove_name );
+    }
+#endif
+    return rc;
+}
+
+
+/****************
+ * create a temporary iobuf, which can be used to collect stuff
+ * in an iobuf and later be written by iobuf_write_temp() to another
+ * iobuf.
+ */
+IOBUF
+iobuf_temp()
+{
+    IOBUF a;
+
+    a = iobuf_alloc(3, IOBUF_BUFFER_SIZE );
+
+    return a;
+}
+
+IOBUF
+iobuf_temp_with_content( const char *buffer, size_t length )
+{
+    IOBUF a;
+
+    a = iobuf_alloc(3, length );
+    memcpy( a->d.buf, buffer, length );
+    a->d.len = length;
+
+    return a;
+}
+
+void
+iobuf_enable_special_filenames ( int yes )
+{
+    special_names_enabled = yes;
+}
+
+/*
+ * see whether the filename has the for "-&nnnn", where n is a
+ * non-zero number.
+ * Returns this number or -1 if it is not the case.
+ */
+static int
+check_special_filename ( const char *fname )
+{
+    if ( special_names_enabled
+         && fname && *fname == '-' && fname[1] == '&' ) {
+        int i;
+
+        fname += 2;
+        for (i=0; digitp (fname+i); i++ )
+            ;
+        if ( !fname[i] ) 
+            return atoi (fname);
+    }
+    return -1;
+}
+
+/* This fucntion returns true if FNAME indicates a PIPE (stdout or
+   stderr) or a special file name if those are enabled. */
+int
+iobuf_is_pipe_filename (const char *fname)
+{
+  if (!fname || (*fname=='-' && !fname[1]) )
+    return 1;
+  return check_special_filename (fname) != -1;
+}
+
+/****************
+ * Create a head iobuf for reading from a file
+ * returns: NULL if an error occures and sets errno
+ */
+IOBUF
+iobuf_open( const char *fname )
+{
+    IOBUF a;
+    FILEP_OR_FD fp;
+    file_filter_ctx_t *fcx;
+    size_t len;
+    int print_only = 0;
+    int fd;
+
+    if( !fname || (*fname=='-' && !fname[1])  ) {
+       fp = FILEP_OR_FD_FOR_STDIN;
+#ifdef USE_SETMODE
+       setmode ( my_fileno(fp) , O_BINARY );
+#endif
+       fname = "[stdin]";
+       print_only = 1;
+    }
+    else if ( (fd = check_special_filename ( fname )) != -1 )
+        return iobuf_fdopen ( translate_file_handle (fd,0), "rb" );
+    else if( (fp = my_fopen_ro(fname, "rb")) == INVALID_FP )
+       return NULL;
+    a = iobuf_alloc(1, IOBUF_BUFFER_SIZE );
+    fcx = xmalloc( sizeof *fcx + strlen(fname) );
+    fcx->fp = fp;
+    fcx->print_only_name = print_only;
+    strcpy(fcx->fname, fname );
+    if( !print_only )
+       a->real_fname = xstrdup( fname );
+    a->filter = file_filter;
+    a->filter_ov = fcx;
+    file_filter( fcx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len );
+    file_filter( fcx, IOBUFCTRL_INIT, NULL, NULL, &len );
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: open `%s' fd=%d\n",
+                  a->no, a->subno, fname, (int)my_fileno(fcx->fp) );
+
+    return a;
+}
+
+/****************
+ * Create a head iobuf for reading from a file
+ * returns: NULL if an error occures and sets errno
+ */
+IOBUF
+iobuf_fdopen( int fd, const char *mode )
+{
+    IOBUF a;
+    FILEP_OR_FD fp;
+    file_filter_ctx_t *fcx;
+    size_t len;
+
+#ifdef FILE_FILTER_USES_STDIO
+    if( !(fp = fdopen(fd, mode)) )
+       return NULL;
+#else
+    fp = (FILEP_OR_FD)fd;
+#endif
+    a = iobuf_alloc( strchr( mode, 'w')? 2:1, IOBUF_BUFFER_SIZE );
+    fcx = xmalloc( sizeof *fcx + 20 );
+    fcx->fp = fp;
+    fcx->print_only_name = 1;
+    sprintf(fcx->fname, "[fd %d]", fd );
+    a->filter = file_filter;
+    a->filter_ov = fcx;
+    file_filter( fcx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len );
+    file_filter( fcx, IOBUFCTRL_INIT, NULL, NULL, &len );
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: fdopen `%s'\n", a->no, a->subno, fcx->fname );
+    iobuf_ioctl (a,3,1,NULL); /* disable fd caching */
+    return a;
+}
+
+
+IOBUF
+iobuf_sockopen ( int fd, const char *mode )
+{
+    IOBUF a;
+#ifdef _WIN32
+    sock_filter_ctx_t *scx;
+    size_t len;
+
+    a = iobuf_alloc( strchr( mode, 'w')? 2:1, IOBUF_BUFFER_SIZE );
+    scx = xmalloc( sizeof *scx + 25 );
+    scx->sock = fd;
+    scx->print_only_name = 1;
+    sprintf(scx->fname, "[sock %d]", fd );
+    a->filter = sock_filter;
+    a->filter_ov = scx;
+    sock_filter( scx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len );
+    sock_filter( scx, IOBUFCTRL_INIT, NULL, NULL, &len );
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: sockopen `%s'\n", a->no, a->subno, scx->fname);
+    iobuf_ioctl (a,3,1,NULL); /* disable fd caching */ 
+#else
+    a = iobuf_fdopen (fd, mode);
+#endif
+    return a;
+}
+
+/****************
+ * create an iobuf for writing to a file; the file will be created.
+ */
+IOBUF
+iobuf_create( const char *fname )
+{
+    IOBUF a;
+    FILEP_OR_FD fp;
+    file_filter_ctx_t *fcx;
+    size_t len;
+    int print_only = 0;
+    int fd;
+
+    if( !fname || (*fname=='-' && !fname[1]) ) {
+       fp = FILEP_OR_FD_FOR_STDOUT;
+#ifdef USE_SETMODE
+       setmode ( my_fileno(fp) , O_BINARY );
+#endif
+       fname = "[stdout]";
+       print_only = 1;
+    }
+    else if ( (fd = check_special_filename ( fname )) != -1 )
+        return iobuf_fdopen ( translate_file_handle (fd, 1), "wb" );
+    else if( (fp = my_fopen(fname, "wb")) == INVALID_FP )
+       return NULL;
+    a = iobuf_alloc(2, IOBUF_BUFFER_SIZE );
+    fcx = xmalloc( sizeof *fcx + strlen(fname) );
+    fcx->fp = fp;
+    fcx->print_only_name = print_only;
+    strcpy(fcx->fname, fname );
+    if( !print_only )
+       a->real_fname = xstrdup( fname );
+    a->filter = file_filter;
+    a->filter_ov = fcx;
+    file_filter( fcx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len );
+    file_filter( fcx, IOBUFCTRL_INIT, NULL, NULL, &len );
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: create `%s'\n", a->no, a->subno, a->desc );
+
+    return a;
+}
+
+/****************
+ * append to an iobuf; if the file does not exist, create it.
+ * cannot be used for stdout.
+ * Note: This is not used.
+ */
+#if 0 /* not used */
+IOBUF
+iobuf_append( const char *fname )
+{
+    IOBUF a;
+    FILE *fp;
+    file_filter_ctx_t *fcx;
+    size_t len;
+
+    if( !fname )
+       return NULL;
+    else if( !(fp = my_fopen(fname, "ab")) )
+       return NULL;
+    a = iobuf_alloc(2, IOBUF_BUFFER_SIZE );
+    fcx = xmalloc( sizeof *fcx + strlen(fname) );
+    fcx->fp = fp;
+    strcpy(fcx->fname, fname );
+    a->real_fname = xstrdup( fname );
+    a->filter = file_filter;
+    a->filter_ov = fcx;
+    file_filter( fcx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len );
+    file_filter( fcx, IOBUFCTRL_INIT, NULL, NULL, &len );
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: append `%s'\n", a->no, a->subno, a->desc );
+
+    return a;
+}
+#endif
+
+IOBUF
+iobuf_openrw( const char *fname )
+{
+    IOBUF a;
+    FILEP_OR_FD fp;
+    file_filter_ctx_t *fcx;
+    size_t len;
+
+    if( !fname )
+       return NULL;
+    else if( (fp = my_fopen(fname, "r+b")) == INVALID_FP )
+       return NULL;
+    a = iobuf_alloc(2, IOBUF_BUFFER_SIZE );
+    fcx = xmalloc( sizeof *fcx + strlen(fname) );
+    fcx->fp = fp;
+    strcpy(fcx->fname, fname );
+    a->real_fname = xstrdup( fname );
+    a->filter = file_filter;
+    a->filter_ov = fcx;
+    file_filter( fcx, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &len );
+    file_filter( fcx, IOBUFCTRL_INIT, NULL, NULL, &len );
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: openrw `%s'\n", a->no, a->subno, a->desc );
+
+    return a;
+}
+
+
+int
+iobuf_ioctl ( IOBUF a, int cmd, int intval, void *ptrval )
+{
+    if ( cmd == 1 ) {  /* keep system filepointer/descriptor open */
+        if( DBG_IOBUF )
+            log_debug("iobuf-%d.%d: ioctl `%s' keep=%d\n",
+                      a? a->no:-1, a?a->subno:-1, a?a->desc:"?", intval );
+        for( ; a; a = a->chain )
+            if( !a->chain && a->filter == file_filter ) {
+                file_filter_ctx_t *b = a->filter_ov;
+                b->keep_open = intval;
+                return 0;
+            }
+#ifdef _WIN32
+            else if( !a->chain && a->filter == sock_filter ) {
+                sock_filter_ctx_t *b = a->filter_ov;
+                b->keep_open = intval;
+                return 0;
+            }
+#endif
+    }
+    else if ( cmd == 2 ) {  /* invalidate cache */
+        if( DBG_IOBUF )
+            log_debug("iobuf-*.*: ioctl `%s' invalidate\n",
+                      ptrval? (char*)ptrval:"[all]");
+        if ( !a && !intval ) {
+#ifndef FILE_FILTER_USES_STDIO
+            fd_cache_invalidate (ptrval);
+#endif
+            return 0;
+        }
+    }
+    else if ( cmd == 3 ) {  /* disallow/allow caching */
+        if( DBG_IOBUF )
+            log_debug("iobuf-%d.%d: ioctl `%s' no_cache=%d\n",
+                      a? a->no:-1, a?a->subno:-1, a?a->desc:"?", intval );
+        for( ; a; a = a->chain )
+            if( !a->chain && a->filter == file_filter ) {
+                file_filter_ctx_t *b = a->filter_ov;
+                b->no_cache = intval;
+                return 0;
+            }
+#ifdef _WIN32
+            else if( !a->chain && a->filter == sock_filter ) {
+                sock_filter_ctx_t *b = a->filter_ov;
+                b->no_cache = intval;
+                return 0;
+            }
+#endif
+    }
+
+    return -1;
+}
+
+
+/****************
+ * Register an i/o filter.
+ */
+int
+iobuf_push_filter( IOBUF a,
+                  int (*f)(void *opaque, int control,
+                  IOBUF chain, byte *buf, size_t *len), void *ov )
+{
+    return iobuf_push_filter2( a, f, ov, 0 );
+}
+
+int
+iobuf_push_filter2( IOBUF a,
+                   int (*f)(void *opaque, int control,
+                   IOBUF chain, byte *buf, size_t *len),
+                   void *ov, int rel_ov )
+{
+    IOBUF b;
+    size_t dummy_len=0;
+    int rc=0;
+
+    if( a->directfp )
+       BUG();
+
+    if( a->use == 2 && (rc=iobuf_flush(a)) )
+       return rc;
+    /* make a copy of the current stream, so that
+     * A is the new stream and B the original one.
+     * The contents of the buffers are transferred to the
+     * new stream.
+     */
+    b = xmalloc(sizeof *b);
+    memcpy(b, a, sizeof *b );
+    /* fixme: it is stupid to keep a copy of the name at every level
+     * but we need the name somewhere because the name known by file_filter
+     * may have been released when we need the name of the file */
+    b->real_fname = a->real_fname? xstrdup(a->real_fname):NULL;
+    /* remove the filter stuff from the new stream */
+    a->filter = NULL;
+    a->filter_ov = NULL;
+    a->filter_ov_owner = 0;
+    a->filter_eof = 0;
+    if( a->use == 3 )
+       a->use = 2;  /* make a write stream from a temp stream */
+
+    if( a->use == 2 ) { /* allocate a fresh buffer for the original stream */
+       b->d.buf = xmalloc( a->d.size );
+       b->d.len = 0;
+       b->d.start = 0;
+    }
+    else { /* allocate a fresh buffer for the new stream */
+       a->d.buf = xmalloc( a->d.size );
+       a->d.len = 0;
+       a->d.start = 0;
+    }
+    /* disable nlimit for the new stream */
+    a->ntotal = b->ntotal + b->nbytes;
+    a->nlimit = a->nbytes = 0;
+    a->nofast &= ~1;
+    /* make a link from the new stream to the original stream */
+    a->chain = b;
+    a->opaque = b->opaque;
+
+    /* setup the function on the new stream */
+    a->filter = f;
+    a->filter_ov = ov;
+    a->filter_ov_owner = rel_ov;
+
+    a->subno = b->subno + 1;
+    f( ov, IOBUFCTRL_DESC, NULL, (byte*)&a->desc, &dummy_len );
+
+    if( DBG_IOBUF ) {
+       log_debug("iobuf-%d.%d: push `%s'\n", a->no, a->subno, a->desc );
+       print_chain( a );
+    }
+
+    /* now we can initialize the new function if we have one */
+    if( a->filter && (rc = a->filter(a->filter_ov, IOBUFCTRL_INIT, a->chain,
+                      NULL, &dummy_len)) )
+       log_error("IOBUFCTRL_INIT failed: %s\n", g10_errstr(rc) );
+    return rc;
+}
+
+/****************
+ * Remove an i/o filter.
+ */
+static int
+pop_filter( IOBUF a, int (*f)(void *opaque, int control,
+                     IOBUF chain, byte *buf, size_t *len), void *ov )
+{
+    IOBUF b;
+    size_t dummy_len=0;
+    int rc=0;
+
+    if( a->directfp )
+       BUG();
+
+    if( DBG_IOBUF )
+       log_debug("iobuf-%d.%d: pop `%s'\n", a->no, a->subno, a->desc );
+    if( !a->filter ) { /* this is simple */
+       b = a->chain;
+       assert(b);
+       xfree(a->d.buf);
+       xfree(a->real_fname);
+       memcpy(a,b, sizeof *a);
+       xfree(b);
+       return 0;
+    }
+    for(b=a ; b; b = b->chain )
+       if( b->filter == f && (!ov || b->filter_ov == ov) )
+           break;
+    if( !b )
+       log_bug("pop_filter(): filter function not found\n");
+
+    /* flush this stream if it is an output stream */
+    if( a->use == 2 && (rc=iobuf_flush(b)) ) {
+       log_error("iobuf_flush failed in pop_filter: %s\n", g10_errstr(rc));
+       return rc;
+    }
+    /* and tell the filter to free it self */
+    if( b->filter && (rc = b->filter(b->filter_ov, IOBUFCTRL_FREE, b->chain,
+                      NULL, &dummy_len)) ) {
+       log_error("IOBUFCTRL_FREE failed: %s\n", g10_errstr(rc) );
+       return rc;
+    }
+    if( b->filter_ov && b->filter_ov_owner ) {
+       xfree( b->filter_ov );
+       b->filter_ov = NULL;
+    }
+
+
+    /* and see how to remove it */
+    if( a == b && !b->chain )
+       log_bug("can't remove the last filter from the chain\n");
+    else if( a == b ) { /* remove the first iobuf from the chain */
+       /* everything from b is copied to a. This is save because
+        * a flush has been done on the to be removed entry
+        */
+       b = a->chain;
+       xfree(a->d.buf);
+       xfree(a->real_fname);
+       memcpy(a,b, sizeof *a);
+       xfree(b);
+       if( DBG_IOBUF )
+          log_debug("iobuf-%d.%d: popped filter\n", a->no, a->subno );
+    }
+    else if( !b->chain ) { /* remove the last iobuf from the chain */
+       log_bug("Ohh jeee, trying to remove a head filter\n");
+    }
+    else {  /* remove an intermediate iobuf from the chain */
+       log_bug("Ohh jeee, trying to remove an intermediate filter\n");
+    }
+
+    return rc;
+}
+
+
+/****************
+ * read underflow: read more bytes into the buffer and return
+ * the first byte or -1 on EOF.
+ */
+static int
+underflow(IOBUF a)
+{
+    size_t len;
+    int rc;
+
+    assert( a->d.start == a->d.len );
+    if( a->use == 3 )
+       return -1; /* EOF because a temp buffer can't do an underflow */
+
+    if( a->filter_eof ) {
+       if( a->chain ) {
+           IOBUF b = a->chain;
+           if( DBG_IOBUF )
+               log_debug("iobuf-%d.%d: pop `%s' in underflow\n",
+                                       a->no, a->subno, a->desc );
+           xfree(a->d.buf);
+           xfree(a->real_fname);
+           memcpy(a, b, sizeof *a);
+           xfree(b);
+           print_chain(a);
+       }
+       else
+             a->filter_eof = 0;  /* for the top level filter */
+       if( DBG_IOBUF )
+           log_debug("iobuf-%d.%d: underflow: eof (due to filter eof)\n",
+                                                   a->no, a->subno );
+       return -1; /* return one(!) EOF */
+    }
+    if( a->error ) {
+       if( DBG_IOBUF )
+           log_debug("iobuf-%d.%d: error\n", a->no, a->subno );
+       return -1;
+    }
+
+    if( a->directfp ) {
+       FILE *fp = a->directfp;
+
+       len = fread( a->d.buf, 1, a->d.size, fp);
+       if( len < a->d.size ) {
+           if( ferror(fp) )
+               a->error = 1;
+       }
+       a->d.len = len;
+       a->d.start = 0;
+       return len? a->d.buf[a->d.start++] : -1;
+    }
+
+
+    if( a->filter ) {
+       len = a->d.size;
+       if( DBG_IOBUF )
+           log_debug("iobuf-%d.%d: underflow: req=%lu\n",
+                      a->no, a->subno, (ulong)len );
+       rc = a->filter( a->filter_ov, IOBUFCTRL_UNDERFLOW, a->chain,
+                       a->d.buf, &len );
+       if( DBG_IOBUF ) {
+           log_debug("iobuf-%d.%d: underflow: got=%lu rc=%d\n",
+                   a->no, a->subno, (ulong)len, rc );
+/*         if( a->no == 1 ) */
+/*                   log_hexdump ("     data:", a->d.buf, len); */
+       }
+       if( a->use == 1 && rc == -1 ) { /* EOF: we can remove the filter */
+           size_t dummy_len=0;
+
+           /* and tell the filter to free itself */
+           if( (rc = a->filter(a->filter_ov, IOBUFCTRL_FREE, a->chain,
+                              NULL, &dummy_len)) )
+               log_error("IOBUFCTRL_FREE failed: %s\n", g10_errstr(rc) );
+           if( a->filter_ov && a->filter_ov_owner ) {
+               xfree( a->filter_ov );
+               a->filter_ov = NULL;
+           }
+           a->filter = NULL;
+           a->desc = NULL;
+           a->filter_ov = NULL;
+           a->filter_eof = 1;
+           if( !len && a->chain ) {
+               IOBUF b = a->chain;
+               if( DBG_IOBUF )
+                   log_debug("iobuf-%d.%d: pop `%s' in underflow (!len)\n",
+                                              a->no, a->subno, a->desc );
+               xfree(a->d.buf);
+               xfree(a->real_fname);
+               memcpy(a,b, sizeof *a);
+               xfree(b);
+               print_chain(a);
+           }
+       }
+       else if( rc )
+           a->error = 1;
+
+       if( !len ) {
+           if( DBG_IOBUF )
+               log_debug("iobuf-%d.%d: underflow: eof\n", a->no, a->subno );
+           return -1;
+       }
+       a->d.len = len;
+       a->d.start = 0;
+       return a->d.buf[a->d.start++];
+    }
+    else {
+       if( DBG_IOBUF )
+           log_debug("iobuf-%d.%d: underflow: eof (no filter)\n",
+                                                   a->no, a->subno );
+       return -1;  /* no filter; return EOF */
+    }
+}
+
+
+int
+iobuf_flush(IOBUF a)
+{
+    size_t len;
+    int rc;
+
+    if( a->directfp )
+       return 0;
+
+    if( a->use == 3 ) { /* increase the temp buffer */
+       char *newbuf;
+       size_t newsize = a->d.size + IOBUF_BUFFER_SIZE;
+
+       if( DBG_IOBUF )
+         log_debug("increasing temp iobuf from %lu to %lu\n",
+                   (ulong)a->d.size, (ulong)newsize );
+       newbuf = xmalloc( newsize );
+       memcpy( newbuf, a->d.buf, a->d.len );
+       xfree(a->d.buf);
+       a->d.buf = newbuf;
+       a->d.size = newsize;
+       return 0;
+    }
+    else if( a->use != 2 )
+       log_bug("flush on non-output iobuf\n");
+    else if( !a->filter )
+       log_bug("iobuf_flush: no filter\n");
+    len = a->d.len;
+    rc = a->filter( a->filter_ov, IOBUFCTRL_FLUSH, a->chain, a->d.buf, &len );
+    if( !rc && len != a->d.len ) {
+       log_info("iobuf_flush did not write all!\n");
+       rc = G10ERR_WRITE_FILE;
+    }
+    else if( rc )
+       a->error = 1;
+    a->d.len = 0;
+
+    return rc;
+}
+
+
+/****************
+ * Read a byte from the iobuf; returns -1 on EOF
+ */
+int
+iobuf_readbyte(IOBUF a)
+{
+    int c;
+
+    /* nlimit does not work together with unget */
+    /* nbytes is also not valid! */
+    if( a->unget.buf ) {
+       if( a->unget.start < a->unget.len )
+           return a->unget.buf[a->unget.start++];
+       xfree(a->unget.buf);
+       a->unget.buf = NULL;
+       a->nofast &= ~2;
+    }
+
+    if( a->nlimit && a->nbytes >= a->nlimit )
+       return -1; /* forced EOF */
+
+    if( a->d.start < a->d.len ) {
+       c = a->d.buf[a->d.start++];
+    }
+    else if( (c=underflow(a)) == -1 )
+       return -1; /* EOF */
+
+    a->nbytes++;
+    return c;
+}
+
+
+int
+iobuf_read(IOBUF a, byte *buf, unsigned buflen )
+{
+    int c, n;
+
+    if( a->unget.buf || a->nlimit ) {
+       /* handle special cases */
+       for(n=0 ; n < buflen; n++ ) {
+           if( (c = iobuf_readbyte(a)) == -1 ) {
+               if( !n )
+                   return -1; /* eof */
+               break;
+           }
+           else
+               if( buf ) *buf = c;
+           if( buf ) buf++;
+       }
+       return n;
+    }
+
+    n = 0;
+    do {
+       if( n < buflen && a->d.start < a->d.len ) {
+           unsigned size = a->d.len - a->d.start;
+           if( size > buflen - n )
+               size = buflen - n;
+           if( buf )
+               memcpy( buf, a->d.buf + a->d.start, size );
+           n += size;
+           a->d.start += size;
+           if( buf )
+               buf += size;
+       }
+       if( n < buflen ) {
+           if( (c=underflow(a)) == -1 ) {
+               a->nbytes += n;
+               return n? n : -1/*EOF*/;
+           }
+           if( buf )
+               *buf++ = c;
+           n++;
+       }
+    } while( n < buflen );
+    a->nbytes += n;
+    return n;
+}
+
+
+/****************
+ * Have a look at the iobuf.
+ * NOTE: This only works in special cases.
+ */
+int
+iobuf_peek(IOBUF a, byte *buf, unsigned buflen )
+{
+    int n=0;
+
+    if( a->filter_eof )
+       return -1;
+
+    if( !(a->d.start < a->d.len) ) {
+       if( underflow(a) == -1 )
+           return -1;
+       /* and unget this character */
+       assert(a->d.start == 1);
+       a->d.start = 0;
+    }
+
+    for(n=0 ; n < buflen && (a->d.start+n) < a->d.len ; n++, buf++ )
+       *buf = a->d.buf[n];
+    return n;
+}
+
+
+
+
+int
+iobuf_writebyte(IOBUF a, unsigned c)
+{
+
+    if( a->directfp )
+       BUG();
+
+    if( a->d.len == a->d.size )
+       if( iobuf_flush(a) )
+           return -1;
+
+    assert( a->d.len < a->d.size );
+    a->d.buf[a->d.len++] = c;
+    return 0;
+}
+
+
+int
+iobuf_write(IOBUF a, byte *buf, unsigned buflen )
+{
+
+    if( a->directfp )
+       BUG();
+
+    do {
+       if( buflen && a->d.len < a->d.size ) {
+           unsigned size = a->d.size - a->d.len;
+           if( size > buflen ) size = buflen;
+           memcpy( a->d.buf + a->d.len, buf, size );
+           buflen -= size;
+           buf += size;
+           a->d.len += size;
+       }
+       if( buflen ) {
+           if( iobuf_flush(a) )
+               return -1;
+       }
+    } while( buflen );
+    return 0;
+}
+
+
+int
+iobuf_writestr(IOBUF a, const char *buf )
+{
+    for( ; *buf; buf++ )
+       if( iobuf_writebyte(a, *buf) )
+           return -1;
+    return 0;
+}
+
+
+
+/****************
+ * copy the contents of TEMP to A.
+ */
+int
+iobuf_write_temp( IOBUF a, IOBUF temp )
+{
+    while( temp->chain )
+       pop_filter( temp, temp->filter, NULL );
+    return iobuf_write(a, temp->d.buf, temp->d.len );
+}
+
+/****************
+ * copy the contents of the temp io stream to BUFFER.
+ */
+size_t
+iobuf_temp_to_buffer( IOBUF a, byte *buffer, size_t buflen )
+{
+    size_t n = a->d.len;
+
+    if( n > buflen )
+       n = buflen;
+    memcpy( buffer, a->d.buf, n );
+    return n;
+}
+
+
+/****************
+ * Call this function to terminate processing of the temp stream
+ * without closing it. This removes all filters from the stream
+ * makes sure that iobuf_get_temp_{buffer,length}() returns correct
+ * values.
+ */
+void
+iobuf_flush_temp( IOBUF temp )
+{
+    while( temp->chain )
+       pop_filter( temp, temp->filter, NULL );
+}
+
+
+/****************
+ * Set a limit on how many bytes may be read from the input stream A.
+ * Setting the limit to 0 disables this feature.
+ */
+void
+iobuf_set_limit( IOBUF a, off_t nlimit )
+{
+    if( nlimit )
+       a->nofast |= 1;
+    else
+       a->nofast &= ~1;
+    a->nlimit = nlimit;
+    a->ntotal += a->nbytes;
+    a->nbytes = 0;
+}
+
+
+
+/* Return the length of an open file A.  IF OVERFLOW is not NULL it
+   will be set to true if the file is larger than what off_t can cope
+   with.  The function return 0 on error or on overflow condition.  */
+off_t
+iobuf_get_filelength (IOBUF a, int *overflow )
+{
+    struct stat st;
+
+    if (overflow)
+      *overflow = 0;
+
+    if( a->directfp )  {
+       FILE *fp = a->directfp;
+
+       if( !fstat(fileno(fp), &st) )
+           return st.st_size;
+       log_error("fstat() failed: %s\n", strerror(errno) );
+       return 0;
+    }
+
+    /* Hmmm: file_filter may have already been removed */
+    for( ; a; a = a->chain )
+       if( !a->chain && a->filter == file_filter ) {
+           file_filter_ctx_t *b = a->filter_ov;
+           FILEP_OR_FD fp = b->fp;
+
+#if defined(HAVE_DOSISH_SYSTEM) && !defined(FILE_FILTER_USES_STDIO)
+            ulong size;
+            static int (* __stdcall get_file_size_ex) 
+              (void *handle, LARGE_INTEGER *size);
+            static int get_file_size_ex_initialized;
+
+            if (!get_file_size_ex_initialized)
+              {
+                void *handle;
+                
+                handle = dlopen ("kernel32.dll", RTLD_LAZY);
+                if (handle)
+                  {
+                    get_file_size_ex = dlsym (handle, "GetFileSizeEx");
+                    if (!get_file_size_ex)
+                    dlclose (handle);
+                  }
+                get_file_size_ex_initialized = 1;
+              }
+
+            if (get_file_size_ex)
+              {
+                /* This is a newer system with GetFileSizeEx; we use
+                   this then becuase it seem that GetFileSize won't
+                   return a proper error in case a file is larger than
+                   4GB. */
+                LARGE_INTEGER size;
+                
+                if (get_file_size_ex (fp, &size))
+                  {
+                    if (!size.u.HighPart)
+                      return size.u.LowPart;
+                    if (overflow)
+                      *overflow = 1;
+                    return 0; 
+                  }
+              }
+            else
+              {
+                if  ((size=GetFileSize (fp, NULL)) != 0xffffffff)
+                  return size;
+              }
+            log_error ("GetFileSize for handle %p failed: %s\n",
+                       fp, w32_strerror (0));
+#else
+            if( !fstat(my_fileno(fp), &st) )
+               return st.st_size;
+           log_error("fstat() failed: %s\n", strerror(errno) );
+#endif
+           break;
+       }
+
+    return 0;
+}
+
+
+/* Return the file descriptor of the underlying file or -1 if it is
+   not available.  */
+int 
+iobuf_get_fd (IOBUF a)
+{
+  if (a->directfp)
+    return fileno ( (FILE*)a->directfp );
+
+  for ( ; a; a = a->chain )
+    if (!a->chain && a->filter == file_filter)
+      {
+        file_filter_ctx_t *b = a->filter_ov;
+        FILEP_OR_FD fp = b->fp;
+
+        return my_fileno (fp);
+      }
+
+  return -1;
+}
+
+
+/****************
+ * Tell the file position, where the next read will take place
+ */
+off_t
+iobuf_tell( IOBUF a )
+{
+    return a->ntotal + a->nbytes;
+}
+
+
+#if !defined(HAVE_FSEEKO) && !defined(fseeko)
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#ifndef LONG_MAX
+# define LONG_MAX ((long) ((unsigned long) -1 >> 1))
+#endif
+#ifndef LONG_MIN
+# define LONG_MIN (-1 - LONG_MAX)
+#endif
+
+/****************
+ * A substitute for fseeko, for hosts that don't have it.
+ */
+static int
+fseeko( FILE *stream, off_t newpos, int whence )
+{
+    while( newpos != (long) newpos ) {
+       long pos = newpos < 0 ? LONG_MIN : LONG_MAX;
+       if( fseek( stream, pos, whence ) != 0 )
+           return -1;
+       newpos -= pos;
+       whence = SEEK_CUR;
+    }
+    return fseek( stream, (long)newpos, whence );
+}
+#endif
+
+/****************
+ * This is a very limited implementation. It simply discards all internal
+ * buffering and removes all filters but the first one.
+ */
+int
+iobuf_seek( IOBUF a, off_t newpos )
+{
+    file_filter_ctx_t *b = NULL;
+
+    if( a->directfp ) {
+       FILE *fp = a->directfp;
+        if( fseeko( fp, newpos, SEEK_SET ) ) {
+            log_error("can't seek: %s\n", strerror(errno) );
+           return -1;
+       }
+       clearerr(fp);
+    }
+    else {
+       for( ; a; a = a->chain ) {
+           if( !a->chain && a->filter == file_filter ) {
+               b = a->filter_ov;
+               break;
+           }
+       }
+       if( !a )
+           return -1;
+#ifdef FILE_FILTER_USES_STDIO
+       if( fseeko( b->fp, newpos, SEEK_SET ) ) {
+           log_error("can't fseek: %s\n", strerror(errno) );
+           return -1;
+       }
+#else
+#ifdef HAVE_DOSISH_SYSTEM
+       if (SetFilePointer (b->fp, newpos, NULL, FILE_BEGIN) == 0xffffffff ) {
+           log_error ("SetFilePointer failed on handle %p: %s\n",
+                      b->fp, w32_strerror (0));
+           return -1;
+       }
+#else
+       if ( lseek (b->fp, newpos, SEEK_SET) == (off_t)-1 ) {
+           log_error("can't lseek: %s\n", strerror(errno) );
+           return -1;
+       }
+#endif
+#endif
+    }
+    a->d.len = 0;   /* discard buffer */
+    a->d.start = 0;
+    a->nbytes = 0;
+    a->nlimit = 0;
+    a->nofast &= ~1;
+    a->ntotal = newpos;
+    a->error = 0;
+    /* remove filters, but the last */
+    if( a->chain )
+       log_debug("pop_filter called in iobuf_seek - please report\n");
+    while( a->chain )
+       pop_filter( a, a->filter, NULL );
+
+    return 0;
+}
+
+
+
+
+
+
+/****************
+ * Retrieve the real filename
+ */
+const char *
+iobuf_get_real_fname( IOBUF a )
+{
+    if( a->real_fname )
+       return a->real_fname;
+
+    /* the old solution */
+    for( ; a; a = a->chain )
+       if( !a->chain && a->filter == file_filter ) {
+           file_filter_ctx_t *b = a->filter_ov;
+           return b->print_only_name? NULL : b->fname;
+       }
+
+    return NULL;
+}
+
+
+/****************
+ * Retrieve the filename
+ */
+const char *
+iobuf_get_fname( IOBUF a )
+{
+    for( ; a; a = a->chain )
+       if( !a->chain && a->filter == file_filter ) {
+           file_filter_ctx_t *b = a->filter_ov;
+           return b->fname;
+       }
+
+    return NULL;
+}
+
+
+/****************
+ * enable partial block mode as described in the OpenPGP draft.
+ * LEN is the first length byte on read, but ignored on writes.
+ */
+void
+iobuf_set_partial_block_mode( IOBUF a, size_t len )
+{
+    block_filter_ctx_t *ctx = xmalloc_clear( sizeof *ctx );
+
+    assert( a->use == 1 || a->use == 2 );
+    ctx->use = a->use;
+    if( !len ) {
+       if( a->use == 1 )
+           log_debug("pop_filter called in set_partial_block_mode"
+                                                   " - please report\n");
+       pop_filter(a, block_filter, NULL );
+    }
+    else {
+       ctx->partial = 1;
+       ctx->size = 0;
+       ctx->first_c = len;
+       iobuf_push_filter(a, block_filter, ctx );
+    }
+}
+
+
+/****************
+ * Same as fgets() but if the buffer is too short a larger one will
+ * be allocated up to some limit *max_length.
+ * A line is considered a byte stream ending in a LF.
+ * Returns the length of the line. EOF is indicated by a line of
+ * length zero. The last LF may be missing due to an EOF.
+ * is max_length is zero on return, the line has been truncated.
+ *
+ * Note: The buffer is allocated with enough space to append a CR,LF,EOL
+ */
+unsigned
+iobuf_read_line( IOBUF a, byte **addr_of_buffer,
+                         unsigned *length_of_buffer, unsigned *max_length )
+{
+    int c;
+    char *buffer = *addr_of_buffer;
+    unsigned length = *length_of_buffer;
+    unsigned nbytes = 0;
+    unsigned maxlen = *max_length;
+    char *p;
+
+    if( !buffer ) { /* must allocate a new buffer */
+       length = 256;
+       buffer = xmalloc( length );
+       *addr_of_buffer = buffer;
+       *length_of_buffer = length;
+    }
+
+    length -= 3; /* reserve 3 bytes (cr,lf,eol) */
+    p = buffer;
+    while( (c=iobuf_get(a)) != -1 ) {
+       if( nbytes == length ) { /* increase the buffer */
+           if( length > maxlen  ) { /* this is out limit */
+               /* skip the rest of the line */
+               while( c != '\n' && (c=iobuf_get(a)) != -1 )
+                   ;
+               *p++ = '\n'; /* always append a LF (we have reserved space) */
+               nbytes++;
+               *max_length = 0; /* indicate truncation */
+               break;
+           }
+           length += 3; /* correct for the reserved byte */
+           length += length < 1024? 256 : 1024;
+           buffer = xrealloc( buffer, length );
+           *addr_of_buffer = buffer;
+           *length_of_buffer = length;
+           length -= 3; /* and reserve again */
+           p = buffer + nbytes;
+       }
+       *p++ = c;
+       nbytes++;
+       if( c == '\n' )
+           break;
+    }
+    *p = 0; /* make sure the line is a string */
+
+    return nbytes;
+}
+
+/* This is the non iobuf specific function */
+int
+iobuf_translate_file_handle ( int fd, int for_write )
+{
+#ifdef _WIN32
+    {
+        int x;
+            
+        if  ( fd <= 2 )
+            return fd; /* do not do this for error, stdin, stdout, stderr */
+
+        x = _open_osfhandle ( fd, for_write? 1:0 );
+        if (x==-1 )
+            log_error ("failed to translate osfhandle %p\n", (void*)fd );
+        else {
+            /*log_info ("_open_osfhandle %p yields %d%s\n",
+              (void*)fd, x, for_write? " for writing":"" );*/
+            fd = x;
+        }
+    }
+#endif
+    return fd;
+}
+
+static int
+translate_file_handle ( int fd, int for_write )
+{
+#ifdef _WIN32
+#ifdef FILE_FILTER_USES_STDIO  
+    fd = iobuf_translate_file_handle (fd, for_write);
+#else
+    {
+        int x;
+
+        if  ( fd == 0 ) 
+            x = (int)GetStdHandle (STD_INPUT_HANDLE);
+        else if (fd == 1)    
+            x = (int)GetStdHandle (STD_OUTPUT_HANDLE);
+        else if (fd == 2)    
+            x = (int)GetStdHandle (STD_ERROR_HANDLE);
+        else
+            x = fd;
+
+        if (x == -1)
+            log_debug ("GetStdHandle(%d) failed: %s\n",
+                       fd, w32_strerror (0));
+
+        fd = x;
+    }
+#endif
+#endif
+    return fd;
+}
+
+
+void
+iobuf_skip_rest(IOBUF a, unsigned long n, int partial)
+{
+    if ( partial ) {
+       for (;;) {
+           if (a->nofast || a->d.start >= a->d.len) {
+               if (iobuf_readbyte (a) == -1) {
+                   break;
+               }
+           } else {
+               unsigned long count = a->d.len - a->d.start;
+               a->nbytes += count;
+               a->d.start = a->d.len;
+           }
+       }
+    } else {
+       unsigned long remaining = n;
+       while (remaining > 0) {
+           if (a->nofast || a->d.start >= a->d.len) {
+               if (iobuf_readbyte (a) == -1) {
+                   break;
+               }
+               --remaining;
+           } else {
+               unsigned long count = a->d.len - a->d.start;
+               if (count > remaining) {
+                   count = remaining;
+               }
+               a->nbytes += count;
+               a->d.start += count;
+               remaining -= count;
+           }
+       }
+    }
+}
diff --git a/util/isascii.c b/util/isascii.c
new file mode 100644 (file)
index 0000000..b71febe
--- /dev/null
@@ -0,0 +1,30 @@
+/* isascii.c - Replacement for isascii.
+ * Copyright (C) 2002 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+int
+isascii (int c)
+{
+  return (((c) & ~0x7f) == 0);
+}
diff --git a/util/logger.c b/util/logger.c
new file mode 100644 (file)
index 0000000..857436c
--- /dev/null
@@ -0,0 +1,265 @@
+/* logger.c  - log functions
+ *     Copyright (C) 1998, 1999 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+
+#include "util.h"
+#include "i18n.h"
+
+static char pidstring[15];
+static char *pgm_name;
+static int errorcount;
+static int strict;
+static FILE *logfp;
+
+/****************
+ * Set the logfile to use (not yet implemneted) or, if logfile is NULL,
+ * the Fd where logoutputs should go.
+ */
+void
+log_set_logfile( const char *name, int fd )
+{
+    if( name )
+       BUG();
+
+    if( logfp && logfp != stderr && logfp != stdout )
+       fclose( logfp );
+    if( fd == 1 )
+       logfp = stdout;
+    else if( fd == 2 )
+       logfp = stderr;
+    else
+       logfp = fdopen( fd, "a" );
+    if( !logfp ) {
+       logfp = stderr;
+       log_fatal("can't open fd %d for logging: %s\n", fd, strerror(errno));
+    }
+}
+
+FILE *
+log_stream()
+{
+    if( !logfp )
+       logfp = stderr;
+    return logfp;
+}
+
+
+void
+log_set_name( const char *name )
+{
+    xfree(pgm_name);
+    if( name )
+       pgm_name = xstrdup(name);
+    else
+       pgm_name = NULL;
+}
+
+const char *
+log_get_name(void)
+{
+    return pgm_name? pgm_name : "";
+}
+
+
+void
+log_set_pid( int pid )
+{
+    if( pid )
+       sprintf(pidstring,"[%u]", (unsigned)pid );
+    else
+       *pidstring = 0;
+}
+
+int
+log_get_errorcount( int clear)
+{
+    int n = errorcount;
+    if( clear )
+       errorcount = 0;
+    return n;
+}
+
+void
+log_inc_errorcount()
+{
+    errorcount++;
+}
+
+int
+log_set_strict(int val)
+{
+  int old=strict;
+  strict=val;
+  return old;
+}
+
+void
+g10_log_print_prefix(const char *text)
+{
+    if( !logfp )
+       logfp = stderr;
+    if( pgm_name )
+       fprintf(logfp, "%s%s: %s", pgm_name, pidstring, text );
+    else
+       fprintf(logfp, "?%s: %s", pidstring, text );
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+}
+
+
+void
+g10_log_info( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    g10_log_print_prefix("");
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(logfp,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+}
+
+
+void
+g10_log_warning( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    if(strict)
+      {
+       errorcount++;
+       g10_log_print_prefix(_("ERROR: "));
+      }
+    else
+      g10_log_print_prefix(_("WARNING: "));
+
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(logfp,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+}
+
+
+void
+g10_log_error( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    g10_log_print_prefix("");
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(logfp,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+    errorcount++;
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+}
+
+
+void
+g10_log_fatal( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    g10_log_print_prefix("fatal: ");
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(logfp,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+    secmem_dump_stats();
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+    exit(2);
+}
+
+void
+g10_log_bug( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    putc('\n', stderr );
+    g10_log_print_prefix("Ohhhh jeeee: ");
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(stderr,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+    fflush(stderr);
+    secmem_dump_stats();
+    abort();
+}
+
+#if defined (__riscos__) \
+    || ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5 ))
+void
+g10_log_bug0( const char *file, int line, const char *func )
+{
+    log_bug(_("... this is a bug (%s:%d:%s)\n"), file, line, func );
+}
+#else
+void
+g10_log_bug0( const char *file, int line )
+{
+    log_bug(_("you found a bug ... (%s:%d)\n"), file, line);
+}
+#endif
+
+void
+g10_log_debug( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    g10_log_print_prefix("DBG: ");
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(logfp,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+}
+
+
+
+void
+g10_log_hexdump( const char *text, const char *buf, size_t len )
+{
+    int i;
+
+    g10_log_print_prefix(text);
+    for(i=0; i < len; i++ )
+       fprintf(logfp, " %02X", ((const byte*)buf)[i] );
+    fputc('\n', logfp);
+#ifdef __riscos__
+    fflush( logfp );
+#endif /* __riscos__ */
+}
+
+
+
diff --git a/util/membuf.c b/util/membuf.c
new file mode 100644 (file)
index 0000000..44347fa
--- /dev/null
@@ -0,0 +1,84 @@
+/* membuf.c - A simple implementation of a dynamic buffer
+ *     Copyright (C) 2001, 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#include "util.h"
+
+
+/* A simple implementation of a dynamic buffer.  Use init_membuf() to
+   create a buffer, put_membuf to append bytes and get_membuf to
+   release and return the buffer.  Allocation errors are detected but
+   only returned at the final get_membuf(), this helps not to clutter
+   the code with out of core checks.  */
+
+void
+init_membuf (membuf_t *mb, int initiallen)
+{
+  mb->len = 0;
+  mb->size = initiallen;
+  mb->out_of_core = 0;
+  mb->buf = xmalloc (initiallen);
+  if (!mb->buf)
+      mb->out_of_core = errno;
+}
+
+
+void
+put_membuf (membuf_t *mb, const void *buf, size_t len)
+{
+  if (mb->out_of_core)
+    return;
+
+  if (mb->len + len >= mb->size)
+    {
+      char *p;
+      
+      mb->size += len + 1024;
+      p = xrealloc (mb->buf, mb->size);
+      mb->buf = p;
+    }
+  memcpy (mb->buf + mb->len, buf, len);
+  mb->len += len;
+}
+
+
+void *
+get_membuf (membuf_t *mb, size_t *len)
+{
+  char *p;
+
+  if (mb->out_of_core)
+    {
+      xfree (mb->buf);
+      mb->buf = NULL;
+      return NULL;
+    }
+
+  p = mb->buf;
+  *len = mb->len;
+  mb->buf = NULL;
+  mb->out_of_core = ENOMEM; /* hack to make sure it won't get reused. */
+  return p;
+}
diff --git a/util/memory.c b/util/memory.c
new file mode 100644 (file)
index 0000000..e16c3d8
--- /dev/null
@@ -0,0 +1,647 @@
+/* memory.c  - memory allocation
+ * Copyright (C) 1998, 1999, 2001, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ *
+ * We use our own memory allocation functions instead of plain malloc(),
+ * so that we can provide some special enhancements:
+ *  a) functions to provide memory from a secure memory.
+ *  b) by looking at the requested allocation size we
+ *     can reuse memory very quickly (e.g. MPI storage)
+ *     (really needed?)
+ *  c) memory usage reporting if compiled with M_DEBUG
+ *  d) memory checking if compiled with M_GUARD
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "types.h"
+#include "memory.h"
+#include "util.h"
+
+
+#define MAGIC_NOR_BYTE 0x55
+#define MAGIC_SEC_BYTE 0xcc
+#define MAGIC_END_BYTE 0xaa
+
+/* This is a very crude alignment check which does not work on all CPUs
+ * IIRC, I once introduced it for testing on an Alpha.  We should better
+ * replace this guard stuff with one provided by a modern malloc library
+ */
+#if SIZEOF_UNSIGNED_LONG == 8
+#define EXTRA_ALIGN 4
+#else
+#define EXTRA_ALIGN 0
+#endif
+
+#if defined(M_DEBUG) || defined(M_GUARD)
+  static void membug( const char *fmt, ... );
+#endif
+
+#ifdef M_DEBUG
+
+#ifndef M_GUARD
+#define M_GUARD 1
+#endif
+#undef xmalloc
+#undef xmalloc_clear
+#undef xmalloc_secure
+#undef xmalloc_secure_clear
+#undef xrealloc
+#undef xfree
+#undef m_check
+#undef xstrdup
+#define FNAME(a)   m_debug_ ##a
+#define FNAMEX(a)  m_debug_ ##a
+#define FNAMEXM(a) m_debug_ ##a
+#define FNAMEPRT  , const char *info
+#define FNAMEARG  , info
+#ifndef __riscos__
+#define store_len(p,n,m) do { add_entry(p,n,m, \
+                                       info, __FUNCTION__);  } while(0)
+#else
+#define store_len(p,n,m) do { add_entry(p,n,m, \
+                 info, __func__ );  } while(0)
+#endif
+#else
+#define FNAME(a)   m_ ##a
+#define FNAMEX(a)  x ##a
+#define FNAMEXM(a) xm ##a
+#define FNAMEPRT
+#define FNAMEARG
+#define store_len(p,n,m) do { ((byte*)p)[EXTRA_ALIGN+0] = n;                 \
+                               ((byte*)p)[EXTRA_ALIGN+1] = n >> 8 ;          \
+                               ((byte*)p)[EXTRA_ALIGN+2] = n >> 16 ;         \
+                               ((byte*)p)[EXTRA_ALIGN+3] = m? MAGIC_SEC_BYTE \
+                                                : MAGIC_NOR_BYTE;  \
+                             } while(0)
+#endif
+
+
+#ifdef M_GUARD
+static long used_memory;
+#endif
+
+#ifdef M_DEBUG /* stuff used for memory debuging */
+
+struct info_entry {
+    struct info_entry *next;
+    unsigned count;    /* call count */
+    const char *info;  /* the reference to the info string */
+};
+
+struct memtbl_entry {
+    const void *user_p;  /* for reference: the pointer given to the user */
+    size_t     user_n;  /* length requested by the user */
+    struct memtbl_entry *next; /* to build a list of unused entries */
+    const struct info_entry *info; /* points into the table with */
+                                  /* the info strings */
+    unsigned inuse:1; /* this entry is in use */
+    unsigned count:31;
+};
+
+
+#define INFO_BUCKETS 53
+#define info_hash(p)  ( *(u32*)((p)) % INFO_BUCKETS )
+static struct info_entry *info_strings[INFO_BUCKETS]; /* hash table */
+
+static struct memtbl_entry *memtbl;  /* the table with the memory info */
+static unsigned memtbl_size;   /* number of allocated entries */
+static unsigned memtbl_len;    /* number of used entries */
+static struct memtbl_entry *memtbl_unused;/* to keep track of unused entries */
+
+static void dump_table_at_exit(void);
+static void dump_table(void);
+static void check_allmem( const char *info );
+
+/****************
+ * Put the new P into the debug table and return a pointer to the table entry.
+ * mode is true for security. BY is the name of the function which called us.
+ */
+static void
+add_entry( byte *p, unsigned n, int mode, const char *info, const char *by )
+{
+    unsigned index;
+    struct memtbl_entry *e;
+    struct info_entry *ie;
+
+    if( memtbl_len < memtbl_size  )
+       index = memtbl_len++;
+    else {
+       struct memtbl_entry *e;
+       /* look for a used entry in the table.  We take the first one,
+        * so that freed entries remain as long as possible in the table
+        * (free appends a new one)
+        */
+       if( (e = memtbl_unused) ) {
+           index = e - memtbl;
+           memtbl_unused = e->next;
+           e->next = NULL;
+       }
+       else { /* no free entries in the table: extend the table */
+           if( !memtbl_size ) { /* first time */
+               memtbl_size = 100;
+               if( !(memtbl = calloc( memtbl_size, sizeof *memtbl )) )
+                   membug("memory debug table malloc failed\n");
+               index = 0;
+               memtbl_len = 1;
+               atexit( dump_table_at_exit );
+           }
+           else { /* realloc */
+               unsigned n = memtbl_size / 4; /* enlarge by 25% */
+               if(!(memtbl = realloc(memtbl, (memtbl_size+n)*sizeof *memtbl)))
+                   membug("memory debug table realloc failed\n");
+               memset(memtbl+memtbl_size, 0, n*sizeof *memtbl );
+               memtbl_size += n;
+               index = memtbl_len++;
+           }
+       }
+    }
+    e = memtbl+index;
+    if( e->inuse )
+       membug("Ooops: entry %u is flagged as in use\n", index);
+    e->user_p = p + EXTRA_ALIGN + 4;
+    e->user_n = n;
+    e->count++;
+    if( e->next )
+       membug("Ooops: entry is in free entry list\n");
+    /* do we already have this info string */
+    for( ie = info_strings[info_hash(info)]; ie; ie = ie->next )
+       if( ie->info == info )
+           break;
+    if( !ie ) { /* no: make a new entry */
+       if( !(ie = malloc( sizeof *ie )) )
+           membug("can't allocate info entry\n");
+       ie->next = info_strings[info_hash(info)];
+       info_strings[info_hash(info)] = ie;
+       ie->info = info;
+       ie->count = 0;
+    }
+    ie->count++;
+    e->info = ie;
+    e->inuse = 1;
+
+    /* put the index at the start of the memory */
+    p[EXTRA_ALIGN+0] = index;
+    p[EXTRA_ALIGN+1] = index >> 8 ;
+    p[EXTRA_ALIGN+2] = index >> 16 ;
+    p[EXTRA_ALIGN+3] = mode? MAGIC_SEC_BYTE : MAGIC_NOR_BYTE  ;
+    if( DBG_MEMORY )
+       log_debug( "%s allocates %u bytes using %s\n", info, e->user_n, by );
+}
+
+
+
+/****************
+ * Check that the memory block is correct. The magic byte has already been
+ * checked. Checks which are done here:
+ *    - see whether the index points into our memory table
+ *    - see whether P is the same as the one stored in the table
+ *    - see whether we have already freed this block.
+ */
+struct memtbl_entry *
+check_mem( const byte *p, const char *info )
+{
+    unsigned n;
+    struct memtbl_entry *e;
+
+    n  = p[EXTRA_ALIGN+0];
+    n |= p[EXTRA_ALIGN+1] << 8;
+    n |= p[EXTRA_ALIGN+2] << 16;
+
+    if( n >= memtbl_len )
+       membug("memory at %p corrupted: index=%u table_len=%u (%s)\n",
+                                     p+EXTRA_ALIGN+4, n, memtbl_len, info );
+    e = memtbl+n;
+
+    if( e->user_p != p+EXTRA_ALIGN+4 )
+       membug("memory at %p corrupted: reference mismatch (%s)\n",
+                                                       p+EXTRA_ALIGN+4, info );
+    if( !e->inuse )
+       membug("memory at %p corrupted: marked as free (%s)\n",
+                                                       p+EXTRA_ALIGN+4, info );
+
+    if( !(p[EXTRA_ALIGN+3] == MAGIC_NOR_BYTE
+       || p[EXTRA_ALIGN+3] == MAGIC_SEC_BYTE) )
+       membug("memory at %p corrupted: underflow=%02x (%s)\n",
+                                p+EXTRA_ALIGN+4, p[EXTRA_ALIGN+3], info );
+    if( p[EXTRA_ALIGN+4+e->user_n] != MAGIC_END_BYTE )
+       membug("memory at %p corrupted: overflow=%02x (%s)\n",
+                    p+EXTRA_ALIGN+4, p[EXTRA_ALIGN+4+e->user_n], info );
+    return e;
+}
+
+
+/****************
+ * free the entry and the memory (replaces free)
+ */
+static void
+free_entry( byte *p, const char *info )
+{
+    struct memtbl_entry *e, *e2;
+
+    check_allmem("add_entry");
+
+    e = check_mem(p, info);
+    if( DBG_MEMORY )
+       log_debug( "%s frees %u bytes alloced by %s\n",
+                               info, e->user_n, e->info->info );
+    if( !e->inuse ) {
+       if( e->user_p == p + EXTRA_ALIGN+ 4 )
+           membug("freeing an already freed pointer at %p\n", p+EXTRA_ALIGN+4 );
+       else
+           membug("freeing pointer %p which is flagged as freed\n", p+EXTRA_ALIGN+4 );
+    }
+
+    e->inuse = 0;
+    e->next = NULL;
+    if( !memtbl_unused )
+       memtbl_unused = e;
+    else {
+       for(e2=memtbl_unused; e2->next; e2 = e2->next )
+           ;
+       e2->next = e;
+    }
+    if( m_is_secure(p+EXTRA_ALIGN+4) )
+       secmem_free(p);
+    else {
+        memset(p,'f', e->user_n+5);
+       free(p);
+    }
+}
+
+static void
+dump_entry(struct memtbl_entry *e )
+{
+    unsigned n = e - memtbl;
+
+    fprintf(stderr, "mem %4u%c %5u %p %5u %s (%u)\n",
+        n, e->inuse?'a':'u', e->count,  e->user_p, e->user_n,
+                             e->info->info, e->info->count );
+
+
+}
+
+
+static void
+dump_table_at_exit( void)
+{
+    if( DBG_MEMSTAT )
+       dump_table();
+}
+
+static void
+dump_table( void)
+{
+    unsigned n;
+    struct memtbl_entry *e;
+    ulong sum = 0, chunks =0;
+
+    for( e = memtbl, n = 0; n < memtbl_len; n++, e++ ) {
+       if(e->inuse) {
+           dump_entry(e);
+           sum += e->user_n;
+           chunks++;
+       }
+    }
+    fprintf(stderr, "          memory used: %8lu bytes in %ld chunks\n",
+                                                          sum, chunks );
+}
+
+
+static void
+check_allmem( const char *info )
+{
+    unsigned n;
+    struct memtbl_entry *e;
+
+    for( e = memtbl, n = 0; n < memtbl_len; n++, e++ ) {
+       if( e->inuse ) {
+#ifndef __riscos__
+           check_mem(e->user_p-4-EXTRA_ALIGN, info);
+#else 
+           check_mem((const byte *) e->user_p-4-EXTRA_ALIGN, info);
+#endif
+        }
+    }
+}
+
+#endif /* M_DEBUG */
+
+#if defined(M_DEBUG) || defined(M_GUARD)
+static void
+membug( const char *fmt, ... )
+{
+    va_list arg_ptr ;
+
+    fprintf(stderr, "\nMemory Error: " ) ;
+    va_start( arg_ptr, fmt ) ;
+    vfprintf(stderr,fmt,arg_ptr) ;
+    va_end(arg_ptr);
+    fflush(stderr);
+#ifdef M_DEBUG
+    if( DBG_MEMSTAT )
+       dump_table();
+#endif
+    abort();
+}
+#endif
+
+void
+m_print_stats( const char *prefix )
+{
+#ifdef M_DEBUG
+    unsigned n;
+    struct memtbl_entry *e;
+    ulong sum = 0, chunks =0;
+
+    for( e = memtbl, n = 0; n < memtbl_len; n++, e++ ) {
+       if(e->inuse) {
+           sum += e->user_n;
+           chunks++;
+       }
+    }
+
+    log_debug( "%s%smemstat: %8lu bytes in %ld chunks used\n",
+               prefix? prefix:"", prefix? ": ":"", sum, chunks );
+#elif defined(M_GUARD)
+    log_debug( "%s%smemstat: %8ld bytes\n",
+               prefix? prefix:"", prefix? ": ":"", used_memory );
+#endif
+}
+
+void
+m_dump_table( const char *prefix )
+{
+#ifdef M_DEBUG
+    fprintf(stderr,"Memory-Table-Dump: %s\n", prefix);
+    dump_table();
+#endif
+    m_print_stats( prefix );
+}
+
+
+static void
+out_of_core(size_t n, int secure)
+{
+    log_error ("out of %s memory while allocating %u bytes\n",
+               secure? "secure":"" ,(unsigned)n );
+    if (secure) {
+        /*secmem_dump_stats ();*/
+        log_info ("(this may be caused by too many secret keys used "
+                  "simultaneously or due to excessive large key sizes)\n");
+    }
+#if defined(M_GUARD) && defined(__riscos__)
+    abort();
+#endif
+    exit (2);
+}
+
+/****************
+ * Allocate memory of size n.
+ * This function gives up if we do not have enough memory
+ */
+void *
+FNAMEXM(alloc)( size_t n FNAMEPRT )
+{
+    char *p;
+
+#ifdef M_GUARD
+    if(!n)
+      out_of_core(n,0); /* should never happen */
+    if( !(p = malloc( n + EXTRA_ALIGN+5 )) )
+       out_of_core(n,0);
+    store_len(p,n,0);
+    used_memory += n;
+    p[4+EXTRA_ALIGN+n] = MAGIC_END_BYTE;
+    return p+EXTRA_ALIGN+4;
+#else
+    /* mallocing zero bytes is undefined by ISO-C, so we better make
+       sure that it won't happen */
+    if (!n)
+      n = 1;
+    if( !(p = malloc( n )) )
+       out_of_core(n,0);
+    return p;
+#endif
+}
+
+/****************
+ * Allocate memory of size n from the secure memory pool.
+ * This function gives up if we do not have enough memory
+ */
+void *
+FNAMEXM(alloc_secure)( size_t n FNAMEPRT )
+{
+    char *p;
+
+#ifdef M_GUARD
+    if(!n)
+      out_of_core(n,1); /* should never happen */
+    if( !(p = secmem_malloc( n +EXTRA_ALIGN+ 5 )) )
+       out_of_core(n,1);
+    store_len(p,n,1);
+    p[4+EXTRA_ALIGN+n] = MAGIC_END_BYTE;
+    return p+EXTRA_ALIGN+4;
+#else
+    /* mallocing zero bytes is undefined by ISO-C, so we better make
+       sure that it won't happen */
+    if (!n)
+      n = 1;
+    if( !(p = secmem_malloc( n )) )
+       out_of_core(n,1);
+    return p;
+#endif
+}
+
+void *
+FNAMEXM(alloc_clear)( size_t n FNAMEPRT )
+{
+    void *p;
+    p = FNAMEXM(alloc)( n FNAMEARG );
+    memset(p, 0, n );
+    return p;
+}
+
+void *
+FNAMEXM(alloc_secure_clear)( size_t n FNAMEPRT)
+{
+    void *p;
+    p = FNAMEXM(alloc_secure)( n FNAMEARG );
+    memset(p, 0, n );
+    return p;
+}
+
+
+/****************
+ * realloc and clear the old space
+ */
+void *
+FNAMEX(realloc)( void *a, size_t n FNAMEPRT )
+{
+    void *b;
+
+#ifdef M_GUARD
+    if( a ) {
+#error "--enable-m-guard does not currently work"
+        unsigned char *p = a;
+        size_t len = m_size(a);
+
+        if( len >= n ) /* we don't shrink for now */
+            return a;
+        if( p[-1] == MAGIC_SEC_BYTE )
+            b = FNAME(alloc_secure_clear)(n FNAMEARG);
+        else
+            b = FNAME(alloc_clear)(n FNAMEARG);
+        FNAME(check)(NULL FNAMEARG);
+        memcpy(b, a, len );
+        FNAME(free)(p FNAMEARG);
+    }
+    else
+        b = FNAME(alloc)(n FNAMEARG);
+#else
+    if( m_is_secure(a) ) {
+       if( !(b = secmexrealloc( a, n )) )
+           out_of_core(n,1);
+    }
+    else {
+       if( !(b = realloc( a, n )) )
+           out_of_core(n,0);
+    }
+#endif
+
+    return b;
+}
+
+
+
+/****************
+ * Free a pointer
+ */
+void
+FNAMEX(free)( void *a FNAMEPRT )
+{
+    byte *p = a;
+
+    if( !p )
+       return;
+#ifdef M_DEBUG
+    free_entry(p-EXTRA_ALIGN-4, info);
+#elif defined M_GUARD
+    m_check(p);
+    if( m_is_secure(a) )
+       secmem_free(p-EXTRA_ALIGN-4);
+    else {
+       used_memory -= m_size(a);
+       free(p-EXTRA_ALIGN-4);
+    }
+#else
+    if( m_is_secure(a) )
+       secmem_free(p);
+    else
+       free(p);
+#endif
+}
+
+
+void
+FNAME(check)( const void *a FNAMEPRT )
+{
+#ifdef M_GUARD
+    const byte *p = a;
+
+#ifdef M_DEBUG
+    if( p )
+       check_mem(p-EXTRA_ALIGN-4, info);
+    else
+       check_allmem(info);
+#else
+    if( !p )
+       return;
+    if( !(p[-1] == MAGIC_NOR_BYTE || p[-1] == MAGIC_SEC_BYTE) )
+       membug("memory at %p corrupted (underflow=%02x)\n", p, p[-1] );
+    else if( p[m_size(p)] != MAGIC_END_BYTE )
+       membug("memory at %p corrupted (overflow=%02x)\n", p, p[-1] );
+#endif
+#endif
+}
+
+
+size_t
+m_size( const void *a )
+{
+#ifndef M_GUARD
+    log_debug("dummy m_size called\n");
+    return 0;
+#else
+    const byte *p = a;
+    size_t n;
+
+#ifdef M_DEBUG
+    n = check_mem(p-EXTRA_ALIGN-4, "m_size")->user_n;
+#else
+    n  = ((byte*)p)[-4];
+    n |= ((byte*)p)[-3] << 8;
+    n |= ((byte*)p)[-2] << 16;
+#endif
+    return n;
+#endif
+}
+
+
+char *
+FNAMEX(strdup)( const char *a FNAMEPRT )
+{
+    size_t n = strlen(a);
+    char *p = FNAMEXM(alloc)(n+1 FNAMEARG);
+    strcpy(p, a);
+    return p;
+}
+
+
+/* Wrapper around xmalloc_clear to take the usual 2 arguments of a
+   calloc style function. */
+void *
+xcalloc (size_t n, size_t m)
+{
+  size_t nbytes;
+
+  nbytes = n * m; 
+  if (m && nbytes / m != n) 
+    out_of_core (nbytes, 0);
+  return xmalloc_clear (nbytes);
+}
+
+/* Wrapper around xmalloc_csecure_lear to take the usual 2 arguments
+   of a calloc style function. */
+void *
+xcalloc_secure (size_t n, size_t m)
+{
+  size_t nbytes;
+
+  nbytes = n * m; 
+  if (m && nbytes / m != n) 
+    out_of_core (nbytes, 1);
+  return xmalloc_secure_clear (nbytes);
+}
+
diff --git a/util/memrchr.c b/util/memrchr.c
new file mode 100644 (file)
index 0000000..5621f73
--- /dev/null
@@ -0,0 +1,49 @@
+/* memrchr.c - libc replacement function
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/*
+  memrchr() is a GNU function that might not be available everywhere.
+  It's basically the inverse of memchr() - search backwards in a
+  memory block for a particular character.
+*/
+
+#include <config.h>
+#include <string.h>
+
+/* There are many ways to optimize this, but this is a simple
+   unoptimized implementation. */
+void *
+memrchr(const void *s, int c, size_t n)
+{
+  const unsigned char *start=s,*end=s;
+
+  end+=n-1;
+
+  while(end>=start)
+    {
+      if(*end==c)
+       return (void *)end;
+      else
+       end--;
+    }
+
+  return NULL;
+}
diff --git a/util/miscutil.c b/util/miscutil.c
new file mode 100644 (file)
index 0000000..01241bc
--- /dev/null
@@ -0,0 +1,455 @@
+/* miscutil.c -  miscellaneous utilities
+ * Copyright (C) 1998, 1999, 2000, 2001, 2003,
+ *               2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#ifdef HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
+#include "types.h"
+#include "util.h"
+#include "i18n.h"
+
+/****************
+ * I know that the OpenPGP protocol has a Y2106 problem ;-)
+ */
+u32
+make_timestamp()
+{
+    return time(NULL);
+}
+
+/****************
+ * Scan a date string and return a timestamp.
+ * The only supported format is "yyyy-mm-dd"
+ * Returns 0 for an invalid date.
+ */
+u32
+scan_isodatestr( const char *string )
+{
+    int year, month, day;
+    struct tm tmbuf;
+    time_t stamp;
+    int i;
+
+    if( strlen(string) != 10 || string[4] != '-' || string[7] != '-' )
+       return 0;
+    for( i=0; i < 4; i++ )
+       if( !digitp(string+i) )
+           return 0;
+    if( !digitp(string+5) || !digitp(string+6) )
+       return 0;
+    if( !digitp(string+8) || !digitp(string+9) )
+       return 0;
+    year = atoi(string);
+    month = atoi(string+5);
+    day = atoi(string+8);
+    /* some basic checks */
+    if( year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 )
+       return 0;
+    memset( &tmbuf, 0, sizeof tmbuf );
+    tmbuf.tm_mday = day;
+    tmbuf.tm_mon = month-1;
+    tmbuf.tm_year = year - 1900;
+    tmbuf.tm_isdst = -1;
+    stamp = mktime( &tmbuf );
+    if( stamp == (time_t)-1 )
+       return 0;
+    return stamp;
+}
+
+
+/****************
+ * Return a string with a time value in the form: x Y, n D, n H
+ */
+
+const char *
+strtimevalue( u32 value )
+{
+    static char buffer[30];
+    unsigned int years, days, hours, minutes;
+
+    value /= 60;
+    minutes = value % 60;
+    value /= 60;
+    hours = value % 24;
+    value /= 24;
+    days = value % 365;
+    value /= 365;
+    years = value;
+
+    sprintf(buffer,"%uy%ud%uh%um", years, days, hours, minutes );
+    if( years )
+       return buffer;
+    if( days )
+       return strchr( buffer, 'y' ) + 1;
+    return strchr( buffer, 'd' ) + 1;
+}
+
+
+/****************
+ * Note: this function returns GMT
+ */
+const char *
+strtimestamp( u32 stamp )
+{
+    static char buffer[11+5];
+    struct tm *tp;
+    time_t atime = stamp;
+    
+    if (atime < 0) {
+        strcpy (buffer, "????" "-??" "-??");
+    }
+    else {
+        tp = gmtime( &atime );
+        sprintf(buffer,"%04d-%02d-%02d",
+                1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday );
+    }
+    return buffer;
+}
+
+
+/****************
+ * Note: this function returns GMT
+ */
+const char *
+isotimestamp (u32 stamp)
+{
+    static char buffer[25+5];
+    struct tm *tp;
+    time_t atime = stamp;
+    
+    if (atime < 0) {
+        strcpy (buffer, "????" "-??" "-??" " " "??" ":" "??" ":" "??");
+    }
+    else {
+        tp = gmtime( &atime );
+        sprintf(buffer,"%04d-%02d-%02d %02d:%02d:%02d",
+                1900+tp->tm_year, tp->tm_mon+1, tp->tm_mday,
+                tp->tm_hour, tp->tm_min, tp->tm_sec);
+    }
+    return buffer;
+}
+
+/****************
+ * Note: this function returns local time
+ */
+const char *
+asctimestamp( u32 stamp )
+{
+    static char buffer[50];
+#if defined (HAVE_STRFTIME) && defined (HAVE_NL_LANGINFO)
+      static char fmt[50];
+#endif
+    struct tm *tp;
+    time_t atime = stamp;
+
+    if (atime < 0) {
+        strcpy (buffer, "????" "-??" "-??");
+        return buffer;
+    }
+
+    tp = localtime( &atime );
+#ifdef HAVE_STRFTIME
+#if defined(HAVE_NL_LANGINFO)
+      mem2str( fmt, nl_langinfo(D_T_FMT), DIM(fmt)-3 );
+      if( strstr( fmt, "%Z" ) == NULL )
+       strcat( fmt, " %Z");
+      strftime( buffer, DIM(buffer)-1, fmt, tp );
+#else
+      /* fixme: we should check whether the locale appends a " %Z"
+       * These locales from glibc don't put the " %Z":
+       * fi_FI hr_HR ja_JP lt_LT lv_LV POSIX ru_RU ru_SU sv_FI sv_SE zh_CN
+       */
+      strftime( buffer, DIM(buffer)-1, 
+#ifdef HAVE_W32_SYSTEM                
+                "%c"
+#else
+                "%c %Z"
+#endif
+                , tp );
+#endif
+    buffer[DIM(buffer)-1] = 0;
+#else
+    mem2str( buffer, asctime(tp), DIM(buffer) );
+#endif
+    return buffer;
+}
+
+
+/****************
+ * Print a string to FP, but filter all control characters out.
+ */
+void
+print_string2( FILE *fp, const byte *p, size_t n, int delim, int delim2 )
+{
+    for( ; n; n--, p++ )
+       if( *p < 0x20 || (*p >= 0x7f && *p < 0xa0)
+           || *p == delim || *p == delim2
+           || ((delim || delim2) && *p=='\\'))
+         {
+           putc('\\', fp);
+           if( *p == '\n' )
+               putc('n', fp);
+           else if( *p == '\r' )
+               putc('r', fp);
+           else if( *p == '\f' )
+               putc('f', fp);
+           else if( *p == '\v' )
+               putc('v', fp);
+           else if( *p == '\b' )
+               putc('b', fp);
+           else if( !*p )
+               putc('0', fp);
+           else
+               fprintf(fp, "x%02x", *p );
+         }
+       else
+         putc(*p, fp);
+}
+
+void
+print_string( FILE *fp, const byte *p, size_t n, int delim )
+{
+  print_string2(fp,p,n,delim,0);
+}
+
+/****************
+ * Print an UTF8 string to FP and filter all control characters out.
+ */
+void
+print_utf8_string2 ( FILE *fp, const byte *p, size_t n, int delim )
+{
+    size_t i;
+    char *buf;
+
+    /* we can handle plain ascii simpler, so check for it first */
+    for(i=0; i < n; i++ ) {
+       if( p[i] & 0x80 )
+           break;
+    }
+    if( i < n ) {
+       buf = utf8_to_native ( p, n, delim );
+       /*(utf8 conversion already does the control character quoting)*/
+       fputs( buf, fp );
+       xfree( buf );
+    }
+    else
+       print_string( fp, p, n, delim );
+}
+
+void
+print_utf8_string( FILE *fp, const byte *p, size_t n )
+{
+    print_utf8_string2 (fp, p, n, 0);
+}
+
+/****************
+ * This function returns a string which is suitable for printing
+ * Caller must release it with xfree()
+ */
+char *
+make_printable_string( const byte *p, size_t n, int delim )
+{
+    size_t save_n, buflen;
+    const byte *save_p;
+    char *buffer, *d;
+
+    /* first count length */
+    for(save_n = n, save_p = p, buflen=1 ; n; n--, p++ ) {
+       if( *p < 0x20 || (*p >= 0x7f && *p < 0xa0) || *p == delim ||
+           (delim && *p=='\\')) {
+           if( *p=='\n' || *p=='\r' || *p=='\f'
+               || *p=='\v' || *p=='\b' || !*p )
+               buflen += 2;
+           else
+               buflen += 4;
+       }
+       else
+           buflen++;
+    }
+    p = save_p;
+    n = save_n;
+    /* and now make the string */
+    d = buffer = xmalloc( buflen );
+    for( ; n; n--, p++ ) {
+       if( *p < 0x20 || (*p >= 0x7f && *p < 0xa0) || *p == delim ||
+           (delim && *p=='\\')) {
+           *d++ = '\\';
+           if( *p == '\n' )
+               *d++ = 'n';
+           else if( *p == '\r' )
+               *d++ = 'r';
+           else if( *p == '\f' )
+               *d++ = 'f';
+           else if( *p == '\v' )
+               *d++ = 'v';
+           else if( *p == '\b' )
+               *d++ = 'b';
+           else if( !*p )
+               *d++ = '0';
+           else {
+               sprintf(d, "x%02x", *p );
+               d += 3;
+           }
+       }
+       else
+           *d++ = *p;
+    }
+    *d = 0;
+    return buffer;
+}
+
+int
+answer_is_yes_no_default( const char *s, int def_answer )
+{
+    /* TRANSLATORS: See doc/TRANSLATE about this string. */
+    const char *long_yes = _("yes");
+    const char *short_yes = _("yY");
+    /* TRANSLATORS: See doc/TRANSLATE about this string. */
+    const char *long_no = _("no");
+    const char *short_no = _("nN");
+
+    /* Note: we have to use the local dependent strcasecmp here */
+    if( match_multistr(long_yes,s) )
+       return 1;
+    if( *s && strchr( short_yes, *s ) && !s[1] )
+       return 1;
+    /* test for no strings to catch ambiguities for the next test */
+    if( match_multistr(long_no,s) )
+       return 0;
+    if( *s && strchr( short_no, *s ) && !s[1] )
+       return 0;
+    /* test for the english version (for those who are used to type yes) */
+    if( !ascii_strcasecmp(s, "yes" ) )
+       return 1;
+    if( *s && strchr( "yY", *s ) && !s[1] )
+       return 1;
+    return def_answer;
+}
+
+int
+answer_is_yes( const char *s )
+{
+  return answer_is_yes_no_default(s,0);
+}
+
+/****************
+ * Return 1 for yes, -1 for quit, or 0 for no
+ */
+int
+answer_is_yes_no_quit( const char *s )
+{
+    /* TRANSLATORS: See doc/TRANSLATE about this string. */
+    const char *long_yes = _("yes");
+    /* TRANSLATORS: See doc/TRANSLATE about this string. */
+    const char *long_no = _("no");
+    /* TRANSLATORS: See doc/TRANSLATE about this string. */
+    const char *long_quit = _("quit");
+    const char *short_yes = _("yY");
+    const char *short_no = _("nN");
+    const char *short_quit = _("qQ");
+
+    if( match_multistr(long_no,s) )
+       return 0;
+    if( match_multistr(long_yes,s) )
+       return 1;
+    if( match_multistr(long_quit,s) )
+       return -1;
+    if( *s && strchr( short_no, *s ) && !s[1] )
+       return 0;
+    if( *s && strchr( short_yes, *s ) && !s[1] )
+       return 1;
+    if( *s && strchr( short_quit, *s ) && !s[1] )
+       return -1;
+    /* but not here */
+    if( !ascii_strcasecmp(s, "yes" ) )
+       return 1;
+    if( !ascii_strcasecmp(s, "quit" ) )
+       return -1;
+    if( *s && strchr( "yY", *s ) && !s[1] )
+       return 1;
+    if( *s && strchr( "qQ", *s ) && !s[1] )
+       return -1;
+    return 0;
+}
+
+/*
+   Return 1 for okay, 0 for for cancel or DEF_ANSWER for default. 
+ */
+int
+answer_is_okay_cancel (const char *s, int def_answer)
+{
+  /* TRANSLATORS: See doc/TRANSLATE about this string. */
+  const char *long_okay = _("okay|okay");
+  /* TRANSLATORS: See doc/TRANSLATE about this string. */
+  const char *long_cancel = _("cancel|cancel");
+  const char *short_okay = _("oO");
+  const char *short_cancel = _("cC");
+  
+  /* Note: We have to use the locale dependent strcasecmp */
+  if ( match_multistr(long_okay,s) )
+    return 1;
+  if ( match_multistr(long_cancel,s) )
+    return 0;
+  if ( *s && strchr( short_okay, *s ) && !s[1] )
+    return 1;
+  if ( *s && strchr( short_cancel, *s ) && !s[1] )
+    return 0;
+  /* Always test for the English values (not locale here) */
+  if ( !ascii_strcasecmp(s, "okay" ) )
+    return 1;
+  if ( !ascii_strcasecmp(s, "ok" ) )
+    return 1;
+  if ( !ascii_strcasecmp(s, "cancel" ) )
+    return 0;
+  if ( *s && strchr( "oO", *s ) && !s[1] )
+    return 1;
+  if ( *s && strchr( "cC", *s ) && !s[1] )
+    return 0;
+  return def_answer;
+}
+
+/* Try match against each substring of multistr, delimited by | */
+int
+match_multistr(const char *multistr,const char *match)
+{
+  do
+    {
+      size_t seglen=strcspn(multistr,"|");
+      if(!seglen)
+       break;
+      /* Using the localized strncasecmp */
+      if(strncasecmp(multistr,match,seglen)==0)
+       return 1;
+      multistr+=seglen;
+      if(*multistr=='|')
+       multistr++;
+    }
+  while(*multistr);
+
+  return 0;
+}
diff --git a/util/mkdtemp.c b/util/mkdtemp.c
new file mode 100644 (file)
index 0000000..c0ee0bb
--- /dev/null
@@ -0,0 +1,99 @@
+/* mkdtemp.c - libc replacement function
+ * Copyright (C) 2001 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* This is a replacement function for mkdtemp in case the platform
+   we're building on (like mine!) doesn't have it. */
+
+#include <config.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "types.h"
+#include "cipher.h"
+
+#ifdef MKDIR_TAKES_ONE_ARG
+# undef mkdir
+# define mkdir(a,b) mkdir(a)
+#endif
+
+char *mkdtemp(char *template)
+{
+  unsigned int attempts,idx,count=0;
+  char *ch;
+
+  idx=strlen(template);
+
+  /* Walk backwards to count all the Xes */
+  while(idx>0 && template[idx-1]=='X')
+    {
+      count++;
+      idx--;
+    }
+
+  if(count==0)
+    {
+      errno=EINVAL;
+      return NULL;
+    }
+
+  ch=&template[idx];
+
+  /* Try 4 times to make the temp directory */
+  for(attempts=0;attempts<4;attempts++)
+    {
+      unsigned int remaining=count;
+      char *marker=ch;
+      byte *randombits;
+
+      idx=0;
+
+      /* Using really random bits is probably overkill here.  The
+        worst thing that can happen with a directory name collision
+        is that the function will return an error. */
+
+      randombits=get_random_bits(4*remaining,0,0);
+
+      while(remaining>1)
+       {
+         sprintf(marker,"%02X",randombits[idx++]);
+         marker+=2;
+         remaining-=2;
+       }
+
+      /* Any leftover Xes?  get_random_bits rounds up to full bytes,
+         so this is safe. */
+      if(remaining>0)
+       sprintf(marker,"%X",randombits[idx]&0xF);
+
+      xfree(randombits);
+
+      if(mkdir(template,0700)==0)
+       break;
+    }
+
+  if(attempts==4)
+    return NULL; /* keeps the errno from mkdir, whatever it is */
+
+  return template;
+}
diff --git a/util/pka.c b/util/pka.c
new file mode 100644 (file)
index 0000000..3c9e5c4
--- /dev/null
@@ -0,0 +1,254 @@
+/* pka.c - DNS Public Key Association RR access
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef USE_DNS_PKA
+#include <sys/types.h>
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#endif
+#endif /* USE_DNS_PKA */
+
+#include "memory.h"
+#include "types.h"
+#include "util.h"
+
+
+#ifdef USE_DNS_PKA
+/* Parse the TXT resource record. Format is:
+
+   v=pka1;fpr=a4d94e92b0986ab5ee9dcd755de249965b0358a2;uri=string
+   
+   For simplicity white spaces are not allowed.  Because we expect to
+   use a new RRTYPE for this in the future we define the TXT really
+   strict for simplicity: No white spaces, case sensitivity of the
+   names, order must be as given above.  Only URI is optional.
+
+   This function modifies BUFFER.  On success 0 is returned, the 20
+   byte fingerprint stored at FPR and BUFFER contains the URI or an
+   empty string.
+*/
+static int
+parse_txt_record (char *buffer, unsigned char *fpr)
+{
+  char *p, *pend;
+  int i;
+
+  p = buffer;
+  pend = strchr (p, ';');
+  if (!pend)
+    return -1;
+  *pend++ = 0;
+  if (strcmp (p, "v=pka1"))
+    return -1; /* Wrong or missing version. */
+  
+  p = pend;
+  pend = strchr (p, ';');
+  if (pend)
+    *pend++ = 0;
+  if (strncmp (p, "fpr=", 4))
+    return -1; /* Missing fingerprint part. */
+  p += 4;
+  for (i=0; i < 20 && hexdigitp (p) && hexdigitp (p+1); i++, p += 2)
+    fpr[i] = xtoi_2 (p);
+  if (i != 20)
+    return -1; /* Fingerprint consists not of exactly 40 hexbytes. */
+    
+  p = pend;
+  if (!p || !*p)
+    {
+      *buffer = 0;  
+      return 0; /* Success (no URI given). */
+    }
+  if (strncmp (p, "uri=", 4))
+    return -1; /* Unknown part. */
+  p += 4;
+  /* There is an URI, copy it to the start of the buffer. */
+  while (*p)
+    *buffer++ = *p++;
+  *buffer = 0;
+  return 0;
+}
+
+
+/* For the given email ADDRESS lookup the PKA information in the DNS.
+
+   On success the 20 byte SHA-1 fingerprint is stored at FPR and the
+   URI will be returned in an allocated buffer.  Note that the URI
+   might be an zero length string as this information is optiobnal.
+   Caller must xfree the returned string.
+
+   On error NULL is returned and the 20 bytes at FPR are not
+   defined. */
+char *
+get_pka_info (const char *address, unsigned char *fpr)
+{
+  unsigned char answer[PACKETSZ];
+  int anslen;
+  int qdcount, ancount, nscount, arcount;
+  int rc;
+  unsigned char *p, *pend;
+  const char *domain;
+  char *name;
+
+
+  domain = strrchr (address, '@');
+  if (!domain || domain == address || !domain[1])
+    return NULL; /* invalid mail address given. */
+
+  name = malloc (strlen (address) + 5 + 1);
+  memcpy (name, address, domain - address);
+  strcpy (stpcpy (name + (domain-address), "._pka."), domain+1);
+
+  anslen = res_query (name, C_IN, T_TXT, answer, PACKETSZ);
+  xfree (name);
+  if (anslen < sizeof(HEADER))
+    return NULL; /* DNS resolver returned a too short answer. */
+  if ( (rc=((HEADER*)answer)->rcode) != NOERROR )
+    return NULL; /* DNS resolver returned an error. */
+
+  /* We assume that PACKETSZ is large enough and don't do dynmically
+     expansion of the buffer. */
+  if (anslen > PACKETSZ)
+    return NULL; /* DNS resolver returned a too long answer */
+
+  qdcount = ntohs (((HEADER*)answer)->qdcount);
+  ancount = ntohs (((HEADER*)answer)->ancount);
+  nscount = ntohs (((HEADER*)answer)->nscount);
+  arcount = ntohs (((HEADER*)answer)->arcount);
+
+  if (!ancount)
+    return NULL; /* Got no answer. */
+
+  p = answer + sizeof (HEADER);
+  pend = answer + anslen; /* Actually points directly behind the buffer. */
+
+  while (qdcount-- && p < pend)
+    {
+      rc = dn_skipname (p, pend);
+      if (rc == -1)
+        return NULL;
+      p += rc + QFIXEDSZ; 
+    }
+
+  if (ancount > 1)
+    return NULL; /* more than one possible gpg trustdns record - none used. */
+
+  while (ancount-- && p <= pend)
+    {
+      unsigned int type, class, txtlen, n;
+      char *buffer, *bufp;
+
+      rc = dn_skipname (p, pend);
+      if (rc == -1)
+        return NULL;
+      p += rc;
+      if (p >= pend - 10)
+        return NULL; /* RR too short. */
+
+      type = *p++ << 8;
+      type |= *p++;
+      class = *p++ << 8;
+      class |= *p++;
+      p += 4;
+      txtlen = *p++ << 8;
+      txtlen |= *p++;
+      if (type != T_TXT || class != C_IN)
+        return NULL; /* Answer does not match the query. */
+
+      buffer = bufp = xmalloc (txtlen + 1);
+      while (txtlen && p < pend)
+        {
+          for (n = *p++, txtlen--; txtlen && n && p < pend; txtlen--, n--)
+            *bufp++ = *p++;
+        }
+      *bufp = 0;
+      if (parse_txt_record (buffer, fpr))
+        {
+          xfree (buffer);
+          return NULL; /* Not a valid gpg trustdns RR. */
+        }
+      return buffer;
+    }
+
+  return NULL;
+}
+#else /* !USE_DNS_PKA */
+
+/* Dummy version of the function if we can't use the resolver
+   functions. */
+char *
+get_pka_info (const char *address, unsigned char *fpr)
+{
+  return NULL;
+}
+#endif /* !USE_DNS_PKA */
+
+
+#ifdef TEST
+int
+main(int argc,char *argv[])
+{
+  unsigned char fpr[20];
+  char *uri;
+  int i;
+
+  if (argc < 2)
+    {
+      fprintf (stderr, "usage: pka mail-addresses\n");
+      return 1;
+    }
+  argc--;
+  argv++;
+
+  for (; argc; argc--, argv++)
+    {
+      uri = get_pka_info ( *argv, fpr );
+      printf ("%s", *argv);
+      if (uri)
+        {
+          putchar (' ');
+          for (i=0; i < 20; i++)
+            printf ("%02X", fpr[i]);
+          if (*uri)
+            printf (" %s", uri);
+          xfree (uri);
+        }
+      putchar ('\n');
+    }
+  return 0;
+}
+#endif /* TEST */
+
+/*
+Local Variables:
+compile-command: "cc -DUSE_DNS_PKA -DTEST -I.. -I../include -Wall -g -o pka pka.c -lresolv libutil.a"
+End:
+*/
diff --git a/util/regcomp.c b/util/regcomp.c
new file mode 100644 (file)
index 0000000..7663399
--- /dev/null
@@ -0,0 +1,3495 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02110-1301 USA.  */
+
+#include <assert.h>
+#include <ctype.h>
+#include <limits.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(_WIN32) && !defined (MB_CUR_MAX)
+#define MB_CUR_MAX 2
+#endif
+
+#if defined HAVE_WCHAR_H || defined _LIBC
+# include <wchar.h>
+#endif /* HAVE_WCHAR_H || _LIBC */
+#if defined HAVE_WCTYPE_H || defined _LIBC
+# include <wctype.h>
+#endif /* HAVE_WCTYPE_H || _LIBC */
+
+/* In case that the system doesn't have isblank().  */
+#if !defined _LIBC && !defined HAVE_ISBLANK && !defined isblank
+# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
+#endif
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+#  define _RE_DEFINE_LOCALE_FUNCTIONS 1
+#   include <locale/localeinfo.h>
+#   include <locale/elem-hash.h>
+#   include <locale/coll-lookup.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages.  */
+#if HAVE_LIBINTL_H || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+#  undef gettext
+#  define gettext(msgid) \
+  INTUSE(__dcgettext) (INTUSE(_libc_intl_domainname), msgid, LC_MESSAGES)
+# endif
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+   strings.  */
+# define gettext_noop(String) String
+#endif
+
+#include "_regex.h" /* gnupg */
+#include "regex_internal.h"
+
+static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
+                                          int length, reg_syntax_t syntax);
+static void re_compile_fastmap_iter (regex_t *bufp,
+                                     const re_dfastate_t *init_state,
+                                     char *fastmap);
+static reg_errcode_t init_dfa (re_dfa_t *dfa, int pat_len);
+static reg_errcode_t init_word_char (re_dfa_t *dfa);
+#ifdef RE_ENABLE_I18N
+static void free_charset (re_charset_t *cset);
+#endif /* RE_ENABLE_I18N */
+static void free_workarea_compile (regex_t *preg);
+static reg_errcode_t create_initial_state (re_dfa_t *dfa);
+static reg_errcode_t analyze (re_dfa_t *dfa);
+static reg_errcode_t analyze_tree (re_dfa_t *dfa, bin_tree_t *node);
+static void calc_first (re_dfa_t *dfa, bin_tree_t *node);
+static void calc_next (re_dfa_t *dfa, bin_tree_t *node);
+static void calc_epsdest (re_dfa_t *dfa, bin_tree_t *node);
+static reg_errcode_t duplicate_node (int *new_idx, re_dfa_t *dfa, int org_idx,
+                                     unsigned int constraint);
+static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
+static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
+                                         int node, int root);
+static void calc_inveclosure (re_dfa_t *dfa);
+static int fetch_number (re_string_t *input, re_token_t *token,
+                         reg_syntax_t syntax);
+static re_token_t fetch_token (re_string_t *input, reg_syntax_t syntax);
+static int peek_token (re_token_t *token, re_string_t *input,
+                        reg_syntax_t syntax);
+static int peek_token_bracket (re_token_t *token, re_string_t *input,
+                               reg_syntax_t syntax);
+static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
+                          reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
+                                  re_token_t *token, reg_syntax_t syntax,
+                                  int nest, reg_errcode_t *err);
+static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
+                                 re_token_t *token, reg_syntax_t syntax,
+                                 int nest, reg_errcode_t *err);
+static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
+                                     re_token_t *token, reg_syntax_t syntax,
+                                     int nest, reg_errcode_t *err);
+static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
+                                  re_token_t *token, reg_syntax_t syntax,
+                                  int nest, reg_errcode_t *err);
+static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
+                                 re_dfa_t *dfa, re_token_t *token,
+                                 reg_syntax_t syntax, reg_errcode_t *err);
+static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
+                                      re_token_t *token, reg_syntax_t syntax,
+                                      reg_errcode_t *err);
+static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
+                                            re_string_t *regexp,
+                                            re_token_t *token, int token_len,
+                                            re_dfa_t *dfa,
+                                            reg_syntax_t syntax);
+static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
+                                          re_string_t *regexp,
+                                          re_token_t *token);
+#ifndef _LIBC
+# ifdef RE_ENABLE_I18N
+static reg_errcode_t build_range_exp (re_bitset_ptr_t sbcset,
+                                      re_charset_t *mbcset, int *range_alloc,
+                                      bracket_elem_t *start_elem,
+                                      bracket_elem_t *end_elem);
+static reg_errcode_t build_collating_symbol (re_bitset_ptr_t sbcset,
+                                             re_charset_t *mbcset,
+                                             int *coll_syxmalloc,
+                                             const unsigned char *name);
+# else /* not RE_ENABLE_I18N */
+static reg_errcode_t build_range_exp (re_bitset_ptr_t sbcset,
+                                      bracket_elem_t *start_elem,
+                                      bracket_elem_t *end_elem);
+static reg_errcode_t build_collating_symbol (re_bitset_ptr_t sbcset,
+                                             const unsigned char *name);
+# endif /* not RE_ENABLE_I18N */
+#endif /* not _LIBC */
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t build_equiv_class (re_bitset_ptr_t sbcset,
+                                        re_charset_t *mbcset,
+                                        int *equiv_class_alloc,
+                                        const unsigned char *name);
+static reg_errcode_t build_charclass (re_bitset_ptr_t sbcset,
+                                      re_charset_t *mbcset,
+                                      int *char_class_alloc,
+                                      const unsigned char *class_name,
+                                      reg_syntax_t syntax);
+#else  /* not RE_ENABLE_I18N */
+static reg_errcode_t build_equiv_class (re_bitset_ptr_t sbcset,
+                                        const unsigned char *name);
+static reg_errcode_t build_charclass (re_bitset_ptr_t sbcset,
+                                      const unsigned char *class_name,
+                                      reg_syntax_t syntax);
+#endif /* not RE_ENABLE_I18N */
+static bin_tree_t *build_word_op (re_dfa_t *dfa, int not, reg_errcode_t *err);
+static void free_bin_tree (bin_tree_t *tree);
+static bin_tree_t *create_tree (bin_tree_t *left, bin_tree_t *right,
+                                re_token_type_t type, int index);
+static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
+\f
+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.
+   POSIX doesn't require that we do anything for REG_NOERROR,
+   but why not be nice?  */
+
+const char __re_error_msgid[] attribute_hidden =
+  {
+#define REG_NOERROR_IDX        0
+    gettext_noop ("Success")   /* REG_NOERROR */
+    "\0"
+#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
+    gettext_noop ("No match")  /* REG_NOMATCH */
+    "\0"
+#define REG_BADPAT_IDX (REG_NOMATCH_IDX + sizeof "No match")
+    gettext_noop ("Invalid regular expression") /* REG_BADPAT */
+    "\0"
+#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
+    gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
+    "\0"
+#define REG_ECTYPE_IDX (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
+    gettext_noop ("Invalid character class name") /* REG_ECTYPE */
+    "\0"
+#define REG_EESCAPE_IDX        (REG_ECTYPE_IDX + sizeof "Invalid character class name")
+    gettext_noop ("Trailing backslash") /* REG_EESCAPE */
+    "\0"
+#define REG_ESUBREG_IDX        (REG_EESCAPE_IDX + sizeof "Trailing backslash")
+    gettext_noop ("Invalid back reference") /* REG_ESUBREG */
+    "\0"
+#define REG_EBRACK_IDX (REG_ESUBREG_IDX + sizeof "Invalid back reference")
+    gettext_noop ("Unmatched [ or [^") /* REG_EBRACK */
+    "\0"
+#define REG_EPAREN_IDX (REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
+    gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
+    "\0"
+#define REG_EBRACE_IDX (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
+    gettext_noop ("Unmatched \\{") /* REG_EBRACE */
+    "\0"
+#define REG_BADBR_IDX  (REG_EBRACE_IDX + sizeof "Unmatched \\{")
+    gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
+    "\0"
+#define REG_ERANGE_IDX (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
+    gettext_noop ("Invalid range end") /* REG_ERANGE */
+    "\0"
+#define REG_ESPACE_IDX (REG_ERANGE_IDX + sizeof "Invalid range end")
+    gettext_noop ("Memory exhausted") /* REG_ESPACE */
+    "\0"
+#define REG_BADRPT_IDX (REG_ESPACE_IDX + sizeof "Memory exhausted")
+    gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
+    "\0"
+#define REG_EEND_IDX   (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
+    gettext_noop ("Premature end of regular expression") /* REG_EEND */
+    "\0"
+#define REG_ESIZE_IDX  (REG_EEND_IDX + sizeof "Premature end of regular expression")
+    gettext_noop ("Regular expression too big") /* REG_ESIZE */
+    "\0"
+#define REG_ERPAREN_IDX        (REG_ESIZE_IDX + sizeof "Regular expression too big")
+    gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
+  };
+
+const size_t __re_error_msgid_idx[] attribute_hidden =
+  {
+    REG_NOERROR_IDX,
+    REG_NOMATCH_IDX,
+    REG_BADPAT_IDX,
+    REG_ECOLLATE_IDX,
+    REG_ECTYPE_IDX,
+    REG_EESCAPE_IDX,
+    REG_ESUBREG_IDX,
+    REG_EBRACK_IDX,
+    REG_EPAREN_IDX,
+    REG_EBRACE_IDX,
+    REG_BADBR_IDX,
+    REG_ERANGE_IDX,
+    REG_ESPACE_IDX,
+    REG_BADRPT_IDX,
+    REG_EEND_IDX,
+    REG_ESIZE_IDX,
+    REG_ERPAREN_IDX
+  };
+\f
+/* Entry points for GNU code.  */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length LENGTH) and puts the result in BUFP.
+   Returns 0 if the pattern was valid, otherwise an error string.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+   are set in BUFP on entry.  */
+
+const char *
+re_compile_pattern (pattern, length, bufp)
+    const char *pattern;
+    size_t length;
+    struct re_pattern_buffer *bufp;
+{
+  reg_errcode_t ret;
+
+  /* GNU code is written to assume at least RE_NREGS registers will be set
+     (and at least one extra will be -1).  */
+  bufp->regs_allocated = REGS_UNALLOCATED;
+
+  /* And GNU code determines whether or not to get register information
+     by passing null for the REGS argument to re_match, etc., not by
+     setting no_sub.  */
+  bufp->no_sub = 0;
+
+  /* Match anchors at newline.  */
+  bufp->newline_anchor = 1;
+
+  ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
+
+  if (!ret)
+    return NULL;
+  return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+#ifdef _LIBC
+weak_alias (__re_compile_pattern, re_compile_pattern)
+#endif
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+/* This has no initializer because initialized variables in Emacs
+   become read-only after dumping.  */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+reg_syntax_t
+re_set_syntax (syntax)
+    reg_syntax_t syntax;
+{
+  reg_syntax_t ret = re_syntax_options;
+
+  re_syntax_options = syntax;
+  return ret;
+}
+#ifdef _LIBC
+weak_alias (__re_set_syntax, re_set_syntax)
+#endif
+
+int
+re_compile_fastmap (bufp)
+    struct re_pattern_buffer *bufp;
+{
+  re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+  char *fastmap = bufp->fastmap;
+
+  memset (fastmap, '\0', sizeof (char) * SBC_MAX);
+  re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
+  if (dfa->init_state != dfa->init_state_word)
+    re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
+  if (dfa->init_state != dfa->init_state_nl)
+    re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
+  if (dfa->init_state != dfa->init_state_begbuf)
+    re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
+  bufp->fastmap_accurate = 1;
+  return 0;
+}
+#ifdef _LIBC
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+#endif
+
+/* Helper function for re_compile_fastmap.
+   Compile fastmap for the initial_state INIT_STATE.  */
+
+static void
+re_compile_fastmap_iter (bufp, init_state, fastmap)
+     regex_t *bufp;
+     const re_dfastate_t *init_state;
+     char *fastmap;
+{
+  re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
+  int node_cnt;
+  for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
+    {
+      int node = init_state->nodes.elems[node_cnt];
+      re_token_type_t type = dfa->nodes[node].type;
+      if (type == OP_CONTEXT_NODE)
+        {
+          node = dfa->nodes[node].opr.ctx_info->entity;
+          type = dfa->nodes[node].type;
+        }
+
+      if (type == CHARACTER)
+        fastmap[dfa->nodes[node].opr.c] = 1;
+      else if (type == SIMPLE_BRACKET)
+        {
+          int i, j, ch;
+          for (i = 0, ch = 0; i < BITSET_UINTS; ++i)
+            for (j = 0; j < UINT_BITS; ++j, ++ch)
+              if (dfa->nodes[node].opr.sbcset[i] & (1 << j))
+                fastmap[ch] = 1;
+        }
+#ifdef RE_ENABLE_I18N
+      else if (type == COMPLEX_BRACKET)
+        {
+          int i;
+          re_charset_t *cset = dfa->nodes[node].opr.mbcset;
+          if (cset->non_match || cset->ncoll_syms || cset->nequiv_classes
+              || cset->nranges || cset->nchar_classes)
+            {
+# ifdef _LIBC
+              if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0)
+                {
+                  /* In this case we want to catch the bytes which are
+                     the first byte of any collation elements.
+                     e.g. In da_DK, we want to catch 'a' since "aa"
+                          is a valid collation element, and don't catch
+                          'b' since 'b' is the only collation element
+                          which starts from 'b'.  */
+                  int j, ch;
+                  const int32_t *table = (const int32_t *)
+                    _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+                  for (i = 0, ch = 0; i < BITSET_UINTS; ++i)
+                    for (j = 0; j < UINT_BITS; ++j, ++ch)
+                      if (table[ch] < 0)
+                        fastmap[ch] = 1;
+                }
+# else
+              if (MB_CUR_MAX > 1)
+                for (i = 0; i < SBC_MAX; ++i)
+                  if (__btowc (i) == WEOF)
+                    fastmap[i] = 1;
+# endif /* not _LIBC */
+            }
+          for (i = 0; i < cset->nmbchars; ++i)
+            {
+              char buf[256];
+              wctomb (buf, cset->mbchars[i]);
+              fastmap[*(unsigned char *) buf] = 1;
+            }
+        }
+#endif /* RE_ENABLE_I18N */
+      else if (type == END_OF_RE || type == OP_PERIOD
+#ifdef RE_ENABLE_I18N
+               || type == COMPLEX_BRACKET
+#endif /* RE_ENABLE_I18N */
+              )
+        {
+          memset (fastmap, '\1', sizeof (char) * SBC_MAX);
+          if (type == END_OF_RE)
+            bufp->can_be_null = 1;
+          return;
+        }
+    }
+}
+\f
+/* Entry point for POSIX code.  */
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     `buffer' to the compiled pattern;
+     `used' to the length of the compiled pattern;
+     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     `fastmap' to an allocated space for the fastmap;
+     `fastmap_accurate' to zero;
+     `re_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+int
+regcomp (preg, pattern, cflags)
+    regex_t *__restrict preg;
+    const char *__restrict pattern;
+    int cflags;
+{
+  reg_errcode_t ret;
+  reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
+                         : RE_SYNTAX_POSIX_BASIC);
+
+  preg->buffer = NULL;
+  preg->allocated = 0;
+  preg->used = 0;
+
+  /* Try to allocate space for the fastmap.  */
+  preg->fastmap = re_malloc (char, SBC_MAX);
+  if (BE (preg->fastmap == NULL, 0))
+    return REG_ESPACE;
+
+  syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
+
+  /* If REG_NEWLINE is set, newlines are treated differently.  */
+  if (cflags & REG_NEWLINE)
+    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+      syntax &= ~RE_DOT_NEWLINE;
+      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+      /* It also changes the matching behavior.  */
+      preg->newline_anchor = 1;
+    }
+  else
+    preg->newline_anchor = 0;
+  preg->no_sub = !!(cflags & REG_NOSUB);
+  preg->translate = NULL;
+
+  ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
+
+  /* POSIX doesn't distinguish between an unmatched open-group and an
+     unmatched close-group: both are REG_EPAREN.  */
+  if (ret == REG_ERPAREN)
+    ret = REG_EPAREN;
+
+  /* We have already checked preg->fastmap != NULL.  */
+  if (BE (ret == REG_NOERROR, 1))
+    {
+      /* Compute the fastmap now, since regexec cannot modify the pattern
+        buffer.  */
+      if (BE (re_compile_fastmap (preg) == -2, 0))
+       {
+         /* Some error occurred while computing the fastmap, just forget
+            about it.  */
+         re_free (preg->fastmap);
+         preg->fastmap = NULL;
+       }
+    }
+
+  return (int) ret;
+}
+#ifdef _LIBC
+weak_alias (__regcomp, regcomp)
+#endif
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   We don't use PREG here.  */
+
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+    int errcode;
+    const regex_t *preg;
+    char *errbuf;
+    size_t errbuf_size;
+{
+  const char *msg;
+  size_t msg_size;
+
+  if (BE (errcode < 0
+          || errcode >= (int) (sizeof (__re_error_msgid_idx)
+                               / sizeof (__re_error_msgid_idx[0])), 0))
+    /* Only error codes returned by the rest of the code should be passed
+       to this routine.  If we are given anything else, or if other regex
+       code generates an invalid error code, then the program has a bug.
+       Dump core so we can fix it.  */
+    abort ();
+
+  msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
+
+  msg_size = strlen (msg) + 1; /* Includes the null.  */
+
+  if (BE (errbuf_size != 0, 1))
+    {
+      if (BE (msg_size > errbuf_size, 0))
+        {
+#if defined HAVE_MEMPCPY || defined _LIBC
+         *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0';
+#else
+          memcpy (errbuf, msg, errbuf_size - 1);
+          errbuf[errbuf_size - 1] = 0;
+#endif
+        }
+      else
+        memcpy (errbuf, msg, msg_size);
+    }
+
+  return msg_size;
+}
+#ifdef _LIBC
+weak_alias (__regerror, regerror)
+#endif
+
+/* Free dynamically allocated space used by PREG.  */
+
+void
+regfree (preg)
+    regex_t *preg;
+{
+  int i, j;
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  if (BE (dfa != NULL, 1))
+    {
+      re_free (dfa->subexps);
+
+      for (i = 0; i < dfa->nodes_len; ++i)
+        {
+          re_token_t *node = dfa->nodes + i;
+#ifdef RE_ENABLE_I18N
+          if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
+            free_charset (node->opr.mbcset);
+          else
+#endif /* RE_ENABLE_I18N */
+          if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
+            re_free (node->opr.sbcset);
+          else if (node->type == OP_CONTEXT_NODE)
+            {
+              if (dfa->nodes[node->opr.ctx_info->entity].type == OP_BACK_REF)
+                {
+                  if (node->opr.ctx_info->bkref_eclosure != NULL)
+                    re_node_set_free (node->opr.ctx_info->bkref_eclosure);
+                  re_free (node->opr.ctx_info->bkref_eclosure);
+                }
+              re_free (node->opr.ctx_info);
+            }
+        }
+      re_free (dfa->firsts);
+      re_free (dfa->nexts);
+      for (i = 0; i < dfa->nodes_len; ++i)
+        {
+          if (dfa->eclosures != NULL)
+            re_node_set_free (dfa->eclosures + i);
+          if (dfa->inveclosures != NULL)
+            re_node_set_free (dfa->inveclosures + i);
+          if (dfa->edests != NULL)
+            re_node_set_free (dfa->edests + i);
+        }
+      re_free (dfa->edests);
+      re_free (dfa->eclosures);
+      re_free (dfa->inveclosures);
+      re_free (dfa->nodes);
+
+      for (i = 0; i <= dfa->state_hash_mask; ++i)
+        {
+          struct re_state_table_entry *entry = dfa->state_table + i;
+          for (j = 0; j < entry->num; ++j)
+            {
+              re_dfastate_t *state = entry->array[j];
+              if (state->entrance_nodes != &state->nodes)
+                {
+                  re_node_set_free (state->entrance_nodes);
+                  re_free (state->entrance_nodes);
+                }
+              re_node_set_free (&state->nodes);
+              re_free (state->trtable);
+              re_free (state->trtable_search);
+              re_free (state);
+            }
+          re_free (entry->array);
+        }
+      re_free (dfa->state_table);
+
+      if (dfa->word_char != NULL)
+        re_free (dfa->word_char);
+#ifdef DEBUG
+      re_free (dfa->re_str);
+#endif
+      re_free (dfa);
+    }
+  re_free (preg->fastmap);
+}
+#ifdef _LIBC
+weak_alias (__regfree, regfree)
+#endif
+\f
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them unless specifically requested.  */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+# ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+   these names if they don't use our functions, and still use
+   regcomp/regexec above without link errors.  */
+weak_function
+# endif
+re_comp (s)
+     const char *s;
+{
+  reg_errcode_t ret;
+
+  if (!s)
+    {
+      if (!re_comp_buf.buffer)
+       return gettext ("No previous regular expression");
+      return 0;
+    }
+
+  if (!re_comp_buf.buffer)
+    {
+      re_comp_buf.fastmap = (char *) malloc (SBC_MAX);
+      if (re_comp_buf.fastmap == NULL)
+       return (char *) gettext (__re_error_msgid
+                                + __re_error_msgid_idx[(int) REG_ESPACE]);
+    }
+
+  /* Since `re_exec' always passes NULL for the `regs' argument, we
+     don't need to initialize the pattern buffer fields which affect it.  */
+
+  /* Match anchors at newlines.  */
+  re_comp_buf.newline_anchor = 1;
+
+  ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
+
+  if (!ret)
+    return NULL;
+
+  /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
+  return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
+}
+#endif /* _REGEX_RE_COMP */
+\f
+/* Internal entry point.
+   Compile the regular expression PATTERN, whose length is LENGTH.
+   SYNTAX indicate regular expression's syntax.  */
+
+static reg_errcode_t
+re_compile_internal (preg, pattern, length, syntax)
+     regex_t *preg;
+     const char * pattern;
+     int length;
+     reg_syntax_t syntax;
+{
+  reg_errcode_t err = REG_NOERROR;
+  re_dfa_t *dfa;
+  re_string_t regexp;
+
+  /* Initialize the pattern buffer.  */
+  preg->fastmap_accurate = 0;
+  preg->syntax = syntax;
+  preg->not_bol = preg->not_eol = 0;
+  preg->used = 0;
+  preg->re_nsub = 0;
+
+  /* Initialize the dfa.  */
+  dfa = (re_dfa_t *) preg->buffer;
+  if (preg->allocated < sizeof (re_dfa_t))
+    {
+      /* If zero allocated, but buffer is non-null, try to realloc
+        enough space.  This loses if buffer's address is bogus, but
+        that is the user's responsibility.  If ->buffer is NULL this
+        is a simple allocation.  */
+      dfa = re_realloc (preg->buffer, re_dfa_t, 1);
+      if (dfa == NULL)
+       return REG_ESPACE;
+      preg->allocated = sizeof (re_dfa_t);
+    }
+  preg->buffer = (unsigned char *) dfa;
+  preg->used = sizeof (re_dfa_t);
+
+  err = init_dfa (dfa, length);
+  if (BE (err != REG_NOERROR, 0))
+    {
+      re_free (dfa);
+      preg->buffer = NULL;
+      return err;
+    }
+#ifdef DEBUG
+  dfa->re_str = re_malloc (char, length + 1);
+  strncpy (dfa->re_str, pattern, length + 1);
+#endif
+
+  err = re_string_construct (&regexp, pattern, length, preg->translate,
+                             syntax & RE_ICASE);
+  if (BE (err != REG_NOERROR, 0))
+    {
+      re_free (dfa);
+      preg->buffer = NULL;
+      return err;
+    }
+
+  /* Parse the regular expression, and build a structure tree.  */
+  preg->re_nsub = 0;
+  dfa->str_tree = parse (&regexp, preg, syntax, &err);
+  if (BE (dfa->str_tree == NULL, 0))
+    goto re_compile_internal_free_return;
+
+  /* Analyze the tree and collect information which is necessary to
+     create the dfa.  */
+  err = analyze (dfa);
+  if (BE (err != REG_NOERROR, 0))
+    goto re_compile_internal_free_return;
+
+  /* Then create the initial state of the dfa.  */
+  err = create_initial_state (dfa);
+  if (BE (err != REG_NOERROR, 0))
+    goto re_compile_internal_free_return;
+
+ re_compile_internal_free_return:
+  /* Release work areas.  */
+  free_workarea_compile (preg);
+  re_string_destruct (&regexp);
+
+  return err;
+}
+
+/* Initialize DFA.  We use the length of the regular expression PAT_LEN
+   as the initial length of some arrays.  */
+
+static reg_errcode_t
+init_dfa (dfa, pat_len)
+     re_dfa_t *dfa;
+     int pat_len;
+{
+  int table_size;
+
+  memset (dfa, '\0', sizeof (re_dfa_t));
+
+  dfa->nodes_alloc = pat_len + 1;
+  dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
+
+  dfa->states_alloc = pat_len + 1;
+
+  /*  table_size = 2 ^ ceil(log pat_len) */
+  for (table_size = 1; table_size > 0; table_size <<= 1)
+    if (table_size > pat_len)
+      break;
+
+  dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
+  dfa->state_hash_mask = table_size - 1;
+
+  dfa->subexps_alloc = 1;
+  dfa->subexps = re_malloc (re_subexp_t, dfa->subexps_alloc);
+  dfa->word_char = NULL;
+
+  if (BE (dfa->nodes == NULL || dfa->state_table == NULL
+          || dfa->subexps == NULL, 0))
+    {
+      /* We don't bother to free anything which was allocated.  Very
+        soon the process will go down anyway.  */
+      dfa->subexps = NULL;
+      dfa->state_table = NULL;
+      dfa->nodes = NULL;
+      return REG_ESPACE;
+    }
+  return REG_NOERROR;
+}
+
+/* Initialize WORD_CHAR table, which indicate which character is
+   "word".  In this case "word" means that it is the word construction
+   character used by some operators like "\<", "\>", etc.  */
+
+static reg_errcode_t
+init_word_char (dfa)
+     re_dfa_t *dfa;
+{
+  int i, j, ch;
+  dfa->word_char = (re_bitset_ptr_t) calloc (sizeof (bitset), 1);
+  if (BE (dfa->word_char == NULL, 0))
+    return REG_ESPACE;
+  for (i = 0, ch = 0; i < BITSET_UINTS; ++i)
+    for (j = 0; j < UINT_BITS; ++j, ++ch)
+      if (isalnum (ch) || ch == '_')
+        dfa->word_char[i] |= 1 << j;
+  return REG_NOERROR;
+}
+
+/* Free the work area which are only used while compiling.  */
+
+static void
+free_workarea_compile (preg)
+     regex_t *preg;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  free_bin_tree (dfa->str_tree);
+  dfa->str_tree = NULL;
+}
+
+/* Create initial states for all contexts.  */
+
+static reg_errcode_t
+create_initial_state (dfa)
+     re_dfa_t *dfa;
+{
+  int first, i;
+  reg_errcode_t err;
+  re_node_set init_nodes;
+
+  /* Initial states have the epsilon closure of the node which is
+     the first node of the regular expression.  */
+  first = dfa->str_tree->first;
+  dfa->init_node = first;
+  err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+
+  /* The back-references which are in initial states can epsilon transit,
+     since in this case all of the subexpressions can be null.
+     Then we add epsilon closures of the nodes which are the next nodes of
+     the back-references.  */
+  if (dfa->nbackref > 0)
+    for (i = 0; i < init_nodes.nelem; ++i)
+      {
+        int node_idx = init_nodes.elems[i];
+        re_token_type_t type = dfa->nodes[node_idx].type;
+
+        int clexp_idx;
+        int entity = (type != OP_CONTEXT_NODE ? node_idx
+                      : dfa->nodes[node_idx].opr.ctx_info->entity);
+        if ((type != OP_CONTEXT_NODE
+             || (dfa->nodes[entity].type != OP_BACK_REF))
+            && (type != OP_BACK_REF))
+          continue;
+        for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
+          {
+            re_token_t *clexp_node;
+            clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
+            if (clexp_node->type == OP_CLOSE_SUBEXP
+                && clexp_node->opr.idx + 1 == dfa->nodes[entity].opr.idx)
+              break;
+          }
+        if (clexp_idx == init_nodes.nelem)
+          continue;
+
+        if (type == OP_CONTEXT_NODE
+            && (dfa->nodes[dfa->nodes[node_idx].opr.ctx_info->entity].type
+                == OP_BACK_REF))
+          {
+            int prev_nelem = init_nodes.nelem;
+            re_node_set_merge (&init_nodes,
+                           dfa->nodes[node_idx].opr.ctx_info->bkref_eclosure);
+            if (prev_nelem < init_nodes.nelem)
+              i = 0;
+          }
+        else if (type == OP_BACK_REF)
+          {
+            int next_idx = dfa->nexts[node_idx];
+            if (!re_node_set_contains (&init_nodes, next_idx))
+              {
+                re_node_set_merge (&init_nodes, dfa->eclosures + next_idx);
+                i = 0;
+              }
+          }
+      }
+
+  /* It must be the first time to invoke acquire_state.  */
+  dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
+  /* We don't check ERR here, since the initial state must not be NULL.  */
+  if (BE (dfa->init_state == NULL, 0))
+    return err;
+  if (dfa->init_state->has_constraint)
+    {
+      dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
+                                                       CONTEXT_WORD);
+      dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
+                                                     CONTEXT_NEWLINE);
+      dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
+                                                         &init_nodes,
+                                                         CONTEXT_NEWLINE
+                                                         | CONTEXT_BEGBUF);
+      if (BE (dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+              || dfa->init_state_begbuf == NULL, 0))
+        return err;
+    }
+  else
+    dfa->init_state_word = dfa->init_state_nl
+      = dfa->init_state_begbuf = dfa->init_state;
+
+  re_node_set_free (&init_nodes);
+  return REG_NOERROR;
+}
+\f
+/* Analyze the structure tree, and calculate "first", "next", "edest",
+   "eclosure", and "inveclosure".  */
+
+static reg_errcode_t
+analyze (dfa)
+     re_dfa_t *dfa;
+{
+  int i;
+  reg_errcode_t ret;
+
+  /* Allocate arrays.  */
+  dfa->firsts = re_malloc (int, dfa->nodes_alloc);
+  dfa->nexts = re_malloc (int, dfa->nodes_alloc);
+  dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
+  dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
+  dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_alloc);
+  if (BE (dfa->firsts == NULL || dfa->nexts == NULL || dfa->edests == NULL
+          || dfa->eclosures == NULL || dfa->inveclosures == NULL, 0))
+    return REG_ESPACE;
+  /* Initialize them.  */
+  for (i = 0; i < dfa->nodes_len; ++i)
+    {
+      dfa->firsts[i] = -1;
+      dfa->nexts[i] = -1;
+      re_node_set_init_empty (dfa->edests + i);
+      re_node_set_init_empty (dfa->eclosures + i);
+      re_node_set_init_empty (dfa->inveclosures + i);
+    }
+
+  ret = analyze_tree (dfa, dfa->str_tree);
+  if (BE (ret == REG_NOERROR, 1))
+    {
+      ret = calc_eclosure (dfa);
+      if (ret == REG_NOERROR)
+       calc_inveclosure (dfa);
+    }
+  return ret;
+}
+
+/* Helper functions for analyze.
+   This function calculate "first", "next", and "edest" for the subtree
+   whose root is NODE.  */
+
+static reg_errcode_t
+analyze_tree (dfa, node)
+     re_dfa_t *dfa;
+     bin_tree_t *node;
+{
+  reg_errcode_t ret;
+  if (node->first == -1)
+    calc_first (dfa, node);
+  if (node->next == -1)
+    calc_next (dfa, node);
+  if (node->eclosure.nelem == 0)
+    calc_epsdest (dfa, node);
+  /* Calculate "first" etc. for the left child.  */
+  if (node->left != NULL)
+    {
+      ret = analyze_tree (dfa, node->left);
+      if (BE (ret != REG_NOERROR, 0))
+        return ret;
+    }
+  /* Calculate "first" etc. for the right child.  */
+  if (node->right != NULL)
+    {
+      ret = analyze_tree (dfa, node->right);
+      if (BE (ret != REG_NOERROR, 0))
+        return ret;
+    }
+  return REG_NOERROR;
+}
+
+/* Calculate "first" for the node NODE.  */
+static void
+calc_first (dfa, node)
+     re_dfa_t *dfa;
+     bin_tree_t *node;
+{
+  int idx, type;
+  idx = node->node_idx;
+  type = (node->type == 0) ? dfa->nodes[idx].type : node->type;
+
+  switch (type)
+    {
+#ifdef DEBUG
+    case OP_OPEN_BRACKET:
+    case OP_CLOSE_BRACKET:
+    case OP_OPEN_DUP_NUM:
+    case OP_CLOSE_DUP_NUM:
+    case OP_NON_MATCH_LIST:
+    case OP_OPEN_COLL_ELEM:
+    case OP_CLOSE_COLL_ELEM:
+    case OP_OPEN_EQUIV_CLASS:
+    case OP_CLOSE_EQUIV_CLASS:
+    case OP_OPEN_CHAR_CLASS:
+    case OP_CLOSE_CHAR_CLASS:
+      /* These must not be appeared here.  */
+      assert (0);
+#endif
+    case END_OF_RE:
+    case CHARACTER:
+    case OP_PERIOD:
+    case OP_DUP_ASTERISK:
+    case OP_DUP_QUESTION:
+#ifdef RE_ENABLE_I18N
+    case COMPLEX_BRACKET:
+#endif /* RE_ENABLE_I18N */
+    case SIMPLE_BRACKET:
+    case OP_BACK_REF:
+    case ANCHOR:
+    case OP_OPEN_SUBEXP:
+    case OP_CLOSE_SUBEXP:
+      node->first = idx;
+      break;
+    case OP_DUP_PLUS:
+#ifdef DEBUG
+      assert (node->left != NULL);
+#endif
+      if (node->left->first == -1)
+        calc_first (dfa, node->left);
+      node->first = node->left->first;
+      break;
+    case OP_ALT:
+      node->first = idx;
+      break;
+      /* else fall through */
+    default:
+#ifdef DEBUG
+      assert (node->left != NULL);
+#endif
+      if (node->left->first == -1)
+        calc_first (dfa, node->left);
+      node->first = node->left->first;
+      break;
+    }
+  if (node->type == 0)
+    dfa->firsts[idx] = node->first;
+}
+
+/* Calculate "next" for the node NODE.  */
+
+static void
+calc_next (dfa, node)
+     re_dfa_t *dfa;
+     bin_tree_t *node;
+{
+  int idx, type;
+  bin_tree_t *parent = node->parent;
+  if (parent == NULL)
+    {
+      node->next = -1;
+      idx = node->node_idx;
+      if (node->type == 0)
+        dfa->nexts[idx] = node->next;
+      return;
+    }
+
+  idx = parent->node_idx;
+  type = (parent->type == 0) ? dfa->nodes[idx].type : parent->type;
+
+  switch (type)
+    {
+    case OP_DUP_ASTERISK:
+    case OP_DUP_PLUS:
+      node->next = idx;
+      break;
+    case CONCAT:
+      if (parent->left == node)
+        {
+          if (parent->right->first == -1)
+            calc_first (dfa, parent->right);
+          node->next = parent->right->first;
+          break;
+        }
+      /* else fall through */
+    default:
+      if (parent->next == -1)
+        calc_next (dfa, parent);
+      node->next = parent->next;
+      break;
+    }
+  idx = node->node_idx;
+  if (node->type == 0)
+    dfa->nexts[idx] = node->next;
+}
+
+/* Calculate "edest" for the node NODE.  */
+
+static void
+calc_epsdest (dfa, node)
+     re_dfa_t *dfa;
+     bin_tree_t *node;
+{
+  int idx;
+  idx = node->node_idx;
+  if (node->type == 0)
+    {
+      if (dfa->nodes[idx].type == OP_DUP_ASTERISK
+          || dfa->nodes[idx].type == OP_DUP_PLUS
+          || dfa->nodes[idx].type == OP_DUP_QUESTION)
+        {
+          if (node->left->first == -1)
+            calc_first (dfa, node->left);
+          if (node->next == -1)
+            calc_next (dfa, node);
+          re_node_set_init_2 (dfa->edests + idx, node->left->first,
+                              node->next);
+        }
+      else if (dfa->nodes[idx].type == OP_ALT)
+        {
+          int left, right;
+          if (node->left != NULL)
+            {
+              if (node->left->first == -1)
+                calc_first (dfa, node->left);
+              left = node->left->first;
+            }
+          else
+            {
+              if (node->next == -1)
+                calc_next (dfa, node);
+              left = node->next;
+            }
+          if (node->right != NULL)
+            {
+              if (node->right->first == -1)
+                calc_first (dfa, node->right);
+              right = node->right->first;
+            }
+          else
+            {
+              if (node->next == -1)
+                calc_next (dfa, node);
+              right = node->next;
+            }
+          re_node_set_init_2 (dfa->edests + idx, left, right);
+        }
+      else if (dfa->nodes[idx].type == ANCHOR
+               || dfa->nodes[idx].type == OP_OPEN_SUBEXP
+               || dfa->nodes[idx].type == OP_CLOSE_SUBEXP)
+        re_node_set_init_1 (dfa->edests + idx, node->next);
+    }
+}
+
+/* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
+   The new index will be stored in NEW_IDX and return REG_NOERROR if succeeded,
+   otherwise return the error code.  */
+
+static reg_errcode_t
+duplicate_node (new_idx, dfa, org_idx, constraint)
+     re_dfa_t *dfa;
+     int *new_idx, org_idx;
+     unsigned int constraint;
+{
+  re_token_t dup;
+  int dup_idx;
+  reg_errcode_t err;
+
+  dup.type = OP_CONTEXT_NODE;
+  if (dfa->nodes[org_idx].type == OP_CONTEXT_NODE)
+    {
+      /* If the node whose index is ORG_IDX is the same as the intended
+         node, use it.  */
+      if (dfa->nodes[org_idx].constraint == constraint)
+        {
+          *new_idx = org_idx;
+          return REG_NOERROR;
+        }
+      dup.constraint = constraint |
+        dfa->nodes[org_idx].constraint;
+    }
+  else
+    dup.constraint = constraint;
+
+  /* In case that `entity' points OP_CONTEXT_NODE,
+     we correct `entity' to real entity in calc_inveclosures(). */
+  dup.opr.ctx_info = malloc (sizeof (*dup.opr.ctx_info));
+  dup_idx = re_dfa_add_node (dfa, dup, 1);
+  if (BE (dup.opr.ctx_info == NULL || dup_idx == -1, 0))
+    return REG_ESPACE;
+  dup.opr.ctx_info->entity = org_idx;
+  dup.opr.ctx_info->bkref_eclosure = NULL;
+
+  dfa->nodes[dup_idx].duplicated = 1;
+  dfa->firsts[dup_idx] = dfa->firsts[org_idx];
+  dfa->nexts[dup_idx] = dfa->nexts[org_idx];
+  err = re_node_set_init_copy (dfa->edests + dup_idx, dfa->edests + org_idx);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+  /* Since we don't duplicate epsilon nodes, epsilon closure have
+     only itself.  */
+  err = re_node_set_init_1 (dfa->eclosures + dup_idx, dup_idx);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+  err = re_node_set_init_1 (dfa->inveclosures + dup_idx, dup_idx);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+  /* Then we must update inveclosure for this node.
+     We process them at last part of calc_eclosure(),
+     since we don't complete to calculate them here.  */
+
+  *new_idx = dup_idx;
+  return REG_NOERROR;
+}
+
+static void
+calc_inveclosure (dfa)
+     re_dfa_t *dfa;
+{
+  int src, idx, dest, entity;
+  for (src = 0; src < dfa->nodes_len; ++src)
+    {
+      for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
+        {
+          dest = dfa->eclosures[src].elems[idx];
+          re_node_set_insert (dfa->inveclosures + dest, src);
+        }
+
+      entity = src;
+      while (dfa->nodes[entity].type == OP_CONTEXT_NODE)
+        {
+          entity = dfa->nodes[entity].opr.ctx_info->entity;
+          re_node_set_merge (dfa->inveclosures + src,
+                             dfa->inveclosures + entity);
+          dfa->nodes[src].opr.ctx_info->entity = entity;
+        }
+    }
+}
+
+/* Calculate "eclosure" for all the node in DFA.  */
+
+static reg_errcode_t
+calc_eclosure (dfa)
+     re_dfa_t *dfa;
+{
+  int idx, node_idx, max, incomplete = 0;
+#ifdef DEBUG
+  assert (dfa->nodes_len > 0);
+#endif
+  /* For each nodes, calculate epsilon closure.  */
+  for (node_idx = 0, max = dfa->nodes_len; ; ++node_idx)
+    {
+      reg_errcode_t err;
+      re_node_set eclosure_elem;
+      if (node_idx == max)
+        {
+          if (!incomplete)
+            break;
+          incomplete = 0;
+          node_idx = 0;
+        }
+
+#ifdef DEBUG
+      assert (dfa->nodes[node_idx].type != OP_CONTEXT_NODE);
+      assert (dfa->eclosures[node_idx].nelem != -1);
+#endif
+      /* If we have already calculated, skip it.  */
+      if (dfa->eclosures[node_idx].nelem != 0)
+        continue;
+      /* Calculate epsilon closure of `node_idx'.  */
+      err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, 1);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+
+      if (dfa->eclosures[node_idx].nelem == 0)
+        {
+          incomplete = 1;
+          re_node_set_free (&eclosure_elem);
+        }
+    }
+
+  /* for duplicated nodes.  */
+  for (idx = max; idx < dfa->nodes_len; ++idx)
+    {
+      int entity, i, constraint;
+      re_node_set *bkref_eclosure;
+      entity = dfa->nodes[idx].opr.ctx_info->entity;
+      re_node_set_merge (dfa->inveclosures + idx, dfa->inveclosures + entity);
+      if (dfa->nodes[entity].type != OP_BACK_REF)
+        continue;
+
+      /* If the node is backreference, duplicate the epsilon closure of
+         the next node. Since it may epsilon transit.  */
+      /* Note: duplicate_node() may realloc dfa->eclosures, etc.  */
+      bkref_eclosure = re_malloc (re_node_set, 1);
+      if (BE (bkref_eclosure == NULL, 0))
+       return REG_ESPACE;
+      re_node_set_init_empty (bkref_eclosure);
+      constraint = dfa->nodes[idx].constraint;
+      for (i = 0; i < dfa->eclosures[dfa->nexts[idx]].nelem; ++i)
+        {
+          int dest_node_idx = dfa->eclosures[dfa->nexts[idx]].elems[i];
+          if (!IS_EPSILON_NODE (dfa->nodes[dest_node_idx].type))
+            {
+              reg_errcode_t err;
+              err = duplicate_node (&dest_node_idx, dfa, dest_node_idx,
+                                    constraint);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+            }
+          re_node_set_insert (bkref_eclosure, dest_node_idx);
+        }
+      dfa->nodes[idx].opr.ctx_info->bkref_eclosure = bkref_eclosure;
+    }
+
+  return REG_NOERROR;
+}
+
+/* Calculate epsilon closure of NODE.  */
+
+static reg_errcode_t
+calc_eclosure_iter (new_set, dfa, node, root)
+     re_node_set *new_set;
+     re_dfa_t *dfa;
+     int node, root;
+{
+  reg_errcode_t err;
+  unsigned int constraint;
+  int i, max, incomplete = 0;
+  re_node_set eclosure;
+  err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+
+  /* This indicates that we are calculating this node now.
+     We reference this value to avoid infinite loop.  */
+  dfa->eclosures[node].nelem = -1;
+
+  constraint = ((dfa->nodes[node].type == ANCHOR)
+                ? dfa->nodes[node].opr.ctx_type : 0);
+
+  /* Expand each epsilon destination nodes.  */
+  if (dfa->edests[node].nelem != 0)
+    for (i = 0; i < dfa->edests[node].nelem; ++i)
+      {
+        re_node_set eclosure_elem;
+        int edest = dfa->edests[node].elems[i];
+        /* If calculating the epsilon closure of `edest' is in progress,
+           return intermediate result.  */
+        if (dfa->eclosures[edest].nelem == -1)
+          {
+            incomplete = 1;
+            continue;
+          }
+        /* If we haven't calculated the epsilon closure of `edest' yet,
+           calculate now. Otherwise use calculated epsilon closure.  */
+        if (dfa->eclosures[edest].nelem == 0)
+          {
+            err = calc_eclosure_iter (&eclosure_elem, dfa, edest, 0);
+            if (BE (err != REG_NOERROR, 0))
+              return err;
+          }
+        else
+          eclosure_elem = dfa->eclosures[edest];
+        /* Merge the epsilon closure of `edest'.  */
+        re_node_set_merge (&eclosure, &eclosure_elem);
+        /* If the epsilon closure of `edest' is incomplete,
+           the epsilon closure of this node is also incomplete.  */
+        if (dfa->eclosures[edest].nelem == 0)
+          {
+            incomplete = 1;
+            re_node_set_free (&eclosure_elem);
+          }
+      }
+
+  /* If the current node has constraints, duplicate all non-epsilon nodes.
+     Since they must inherit the constraints.  */
+  if (constraint)
+    for (i = 0, max = eclosure.nelem; i < max; ++i)
+      {
+        int dest = eclosure.elems[i];
+        if (!IS_EPSILON_NODE (dfa->nodes[dest].type))
+          {
+            int dup_dest;
+            reg_errcode_t err;
+            err = duplicate_node (&dup_dest, dfa, dest, constraint);
+            if (BE (err != REG_NOERROR, 0))
+              return err;
+            if (dest != dup_dest)
+              {
+                re_node_set_remove_at (&eclosure, i--);
+                re_node_set_insert (&eclosure, dup_dest);
+                --max;
+              }
+          }
+      }
+
+  /* Epsilon closures include itself.  */
+  re_node_set_insert (&eclosure, node);
+  if (incomplete && !root)
+    dfa->eclosures[node].nelem = 0;
+  else
+    dfa->eclosures[node] = eclosure;
+  *new_set = eclosure;
+  return REG_NOERROR;
+}
+\f
+/* Functions for token which are used in the parser.  */
+
+/* Fetch a token from INPUT.
+   We must not use this function inside bracket expressions.  */
+
+static re_token_t
+fetch_token (input, syntax)
+     re_string_t *input;
+     reg_syntax_t syntax;
+{
+  re_token_t token;
+  int consumed_byte;
+  consumed_byte = peek_token (&token, input, syntax);
+  re_string_skip_bytes (input, consumed_byte);
+  return token;
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+   We must not use this function inside bracket expressions.  */
+
+static int
+peek_token (token, input, syntax)
+     re_token_t *token;
+     re_string_t *input;
+     reg_syntax_t syntax;
+{
+  unsigned char c;
+
+  if (re_string_eoi (input))
+    {
+      token->type = END_OF_RE;
+      return 0;
+    }
+
+  c = re_string_peek_byte (input, 0);
+  token->opr.c = c;
+
+#ifdef RE_ENABLE_I18N
+  token->mb_partial = 0;
+  if (MB_CUR_MAX > 1 &&
+      !re_string_first_byte (input, re_string_cur_idx (input)))
+    {
+      token->type = CHARACTER;
+      token->mb_partial = 1;
+      return 1;
+    }
+#endif
+  if (c == '\\')
+    {
+      unsigned char c2;
+      if (re_string_cur_idx (input) + 1 >= re_string_length (input))
+        {
+          token->type = BACK_SLASH;
+          return 1;
+        }
+
+      c2 = re_string_peek_byte_case (input, 1);
+      token->opr.c = c2;
+      token->type = CHARACTER;
+      switch (c2)
+        {
+        case '|':
+          if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
+            token->type = OP_ALT;
+          break;
+        case '1': case '2': case '3': case '4': case '5':
+        case '6': case '7': case '8': case '9':
+          if (!(syntax & RE_NO_BK_REFS))
+            {
+              token->type = OP_BACK_REF;
+              token->opr.idx = c2 - '0';
+            }
+          break;
+        case '<':
+          if (!(syntax & RE_NO_GNU_OPS))
+            {
+              token->type = ANCHOR;
+              token->opr.idx = WORD_FIRST;
+            }
+          break;
+        case '>':
+          if (!(syntax & RE_NO_GNU_OPS))
+            {
+              token->type = ANCHOR;
+              token->opr.idx = WORD_LAST;
+            }
+          break;
+        case 'b':
+          if (!(syntax & RE_NO_GNU_OPS))
+            {
+              token->type = ANCHOR;
+              token->opr.idx = WORD_DELIM;
+            }
+          break;
+        case 'B':
+          if (!(syntax & RE_NO_GNU_OPS))
+            {
+              token->type = ANCHOR;
+              token->opr.idx = INSIDE_WORD;
+            }
+          break;
+        case 'w':
+          if (!(syntax & RE_NO_GNU_OPS))
+            token->type = OP_WORD;
+          break;
+        case 'W':
+          if (!(syntax & RE_NO_GNU_OPS))
+            token->type = OP_NOTWORD;
+          break;
+        case '`':
+          if (!(syntax & RE_NO_GNU_OPS))
+            {
+              token->type = ANCHOR;
+              token->opr.idx = BUF_FIRST;
+            }
+          break;
+        case '\'':
+          if (!(syntax & RE_NO_GNU_OPS))
+            {
+              token->type = ANCHOR;
+              token->opr.idx = BUF_LAST;
+            }
+          break;
+        case '(':
+          if (!(syntax & RE_NO_BK_PARENS))
+            token->type = OP_OPEN_SUBEXP;
+          break;
+        case ')':
+          if (!(syntax & RE_NO_BK_PARENS))
+            token->type = OP_CLOSE_SUBEXP;
+          break;
+        case '+':
+          if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+            token->type = OP_DUP_PLUS;
+          break;
+        case '?':
+          if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
+            token->type = OP_DUP_QUESTION;
+          break;
+        case '{':
+          if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+            token->type = OP_OPEN_DUP_NUM;
+          break;
+        case '}':
+          if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
+            token->type = OP_CLOSE_DUP_NUM;
+          break;
+        default:
+          break;
+        }
+      return 2;
+    }
+
+  token->type = CHARACTER;
+  switch (c)
+    {
+    case '\n':
+      if (syntax & RE_NEWLINE_ALT)
+        token->type = OP_ALT;
+      break;
+    case '|':
+      if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
+        token->type = OP_ALT;
+      break;
+    case '*':
+      token->type = OP_DUP_ASTERISK;
+      break;
+    case '+':
+      if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+        token->type = OP_DUP_PLUS;
+      break;
+    case '?':
+      if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
+        token->type = OP_DUP_QUESTION;
+      break;
+    case '{':
+      if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+        token->type = OP_OPEN_DUP_NUM;
+      break;
+    case '}':
+      if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+        token->type = OP_CLOSE_DUP_NUM;
+      break;
+    case '(':
+      if (syntax & RE_NO_BK_PARENS)
+        token->type = OP_OPEN_SUBEXP;
+      break;
+    case ')':
+      if (syntax & RE_NO_BK_PARENS)
+        token->type = OP_CLOSE_SUBEXP;
+      break;
+    case '[':
+      token->type = OP_OPEN_BRACKET;
+      break;
+    case '.':
+      token->type = OP_PERIOD;
+      break;
+    case '^':
+      if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) &&
+          re_string_cur_idx (input) != 0)
+        {
+          char prev = re_string_peek_byte (input, -1);
+          if (prev != '|' && prev != '(' &&
+              (!(syntax & RE_NEWLINE_ALT) || prev != '\n'))
+            break;
+        }
+      token->type = ANCHOR;
+      token->opr.idx = LINE_FIRST;
+      break;
+    case '$':
+      if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) &&
+          re_string_cur_idx (input) + 1 != re_string_length (input))
+        {
+          re_token_t next;
+          re_string_skip_bytes (input, 1);
+          peek_token (&next, input, syntax);
+          re_string_skip_bytes (input, -1);
+          if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
+            break;
+        }
+      token->type = ANCHOR;
+      token->opr.idx = LINE_LAST;
+      break;
+    default:
+      break;
+    }
+  return 1;
+}
+
+/* Peek a token from INPUT, and return the length of the token.
+   We must not use this function out of bracket expressions.  */
+
+static int
+peek_token_bracket (token, input, syntax)
+     re_token_t *token;
+     re_string_t *input;
+     reg_syntax_t syntax;
+{
+  unsigned char c;
+  if (re_string_eoi (input))
+    {
+      token->type = END_OF_RE;
+      return 0;
+    }
+  c = re_string_peek_byte (input, 0);
+  token->opr.c = c;
+
+#ifdef RE_ENABLE_I18N
+  if (MB_CUR_MAX > 1 &&
+      !re_string_first_byte (input, re_string_cur_idx (input)))
+    {
+      token->type = CHARACTER;
+      return 1;
+    }
+#endif /* RE_ENABLE_I18N */
+
+  if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS))
+    {
+      /* In this case, '\' escape a character.  */
+      unsigned char c2;
+      c2 = re_string_peek_byte (input, 1);
+      token->opr.c = c2;
+      token->type = CHARACTER;
+      return 1;
+    }
+  if (c == '[') /* '[' is a special char in a bracket exps.  */
+    {
+      unsigned char c2;
+      int token_len;
+      c2 = re_string_peek_byte (input, 1);
+      token->opr.c = c2;
+      token_len = 2;
+      switch (c2)
+        {
+        case '.':
+          token->type = OP_OPEN_COLL_ELEM;
+          break;
+        case '=':
+          token->type = OP_OPEN_EQUIV_CLASS;
+          break;
+        case ':':
+          if (syntax & RE_CHAR_CLASSES)
+            {
+              token->type = OP_OPEN_CHAR_CLASS;
+              break;
+            }
+          /* else fall through.  */
+        default:
+          token->type = CHARACTER;
+          token->opr.c = c;
+          token_len = 1;
+          break;
+        }
+      return token_len;
+    }
+  switch (c)
+    {
+    case '-':
+      token->type = OP_CHARSET_RANGE;
+      break;
+    case ']':
+      token->type = OP_CLOSE_BRACKET;
+      break;
+    case '^':
+      token->type = OP_NON_MATCH_LIST;
+      break;
+    default:
+      token->type = CHARACTER;
+    }
+  return 1;
+}
+\f
+/* Functions for parser.  */
+
+/* Entry point of the parser.
+   Parse the regular expression REGEXP and return the structure tree.
+   If an error is occured, ERR is set by error code, and return NULL.
+   This function build the following tree, from regular expression <reg_exp>:
+           CAT
+           / \
+          /   \
+   <reg_exp>  EOR
+
+   CAT means concatenation.
+   EOR means end of regular expression.  */
+
+static bin_tree_t *
+parse (regexp, preg, syntax, err)
+     re_string_t *regexp;
+     regex_t *preg;
+     reg_syntax_t syntax;
+     reg_errcode_t *err;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  bin_tree_t *tree, *eor, *root;
+  re_token_t current_token;
+  int new_idx;
+  current_token = fetch_token (regexp, syntax);
+  tree = parse_reg_exp (regexp, preg, &current_token, syntax, 0, err);
+  if (BE (*err != REG_NOERROR && tree == NULL, 0))
+    return NULL;
+  new_idx = re_dfa_add_node (dfa, current_token, 0);
+  eor = create_tree (NULL, NULL, 0, new_idx);
+  if (tree != NULL)
+    root = create_tree (tree, eor, CONCAT, 0);
+  else
+    root = eor;
+  if (BE (new_idx == -1 || eor == NULL || root == NULL, 0))
+    return *err = REG_ESPACE, NULL;
+  return root;
+}
+
+/* This function build the following tree, from regular expression
+   <branch1>|<branch2>:
+           ALT
+           / \
+          /   \
+   <branch1> <branch2>
+
+   ALT means alternative, which represents the operator `|'.  */
+
+static bin_tree_t *
+parse_reg_exp (regexp, preg, token, syntax, nest, err)
+     re_string_t *regexp;
+     regex_t *preg;
+     re_token_t *token;
+     reg_syntax_t syntax;
+     int nest;
+     reg_errcode_t *err;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  bin_tree_t *tree, *branch = NULL;
+  int new_idx;
+  tree = parse_branch (regexp, preg, token, syntax, nest, err);
+  if (BE (*err != REG_NOERROR && tree == NULL, 0))
+    return NULL;
+
+  while (token->type == OP_ALT)
+    {
+      re_token_t alt_token = *token;
+      new_idx = re_dfa_add_node (dfa, alt_token, 0);
+      *token = fetch_token (regexp, syntax);
+      if (token->type != OP_ALT && token->type != END_OF_RE
+          && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+        {
+          branch = parse_branch (regexp, preg, token, syntax, nest, err);
+          if (BE (*err != REG_NOERROR && branch == NULL, 0))
+            {
+              free_bin_tree (tree);
+              return NULL;
+            }
+        }
+      else
+       branch = NULL;
+      tree = create_tree (tree, branch, 0, new_idx);
+      if (BE (new_idx == -1 || tree == NULL, 0))
+        return *err = REG_ESPACE, NULL;
+      dfa->has_plural_match = 1;
+    }
+  return tree;
+}
+
+/* This function build the following tree, from regular expression
+   <exp1><exp2>:
+        CAT
+        / \
+       /   \
+   <exp1> <exp2>
+
+   CAT means concatenation.  */
+
+static bin_tree_t *
+parse_branch (regexp, preg, token, syntax, nest, err)
+     re_string_t *regexp;
+     regex_t *preg;
+     re_token_t *token;
+     reg_syntax_t syntax;
+     int nest;
+     reg_errcode_t *err;
+{
+  bin_tree_t *tree, *exp;
+  tree = parse_expression (regexp, preg, token, syntax, nest, err);
+  if (BE (*err != REG_NOERROR && tree == NULL, 0))
+    return NULL;
+
+  while (token->type != OP_ALT && token->type != END_OF_RE
+         && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
+    {
+      exp = parse_expression (regexp, preg, token, syntax, nest, err);
+      if (BE (*err != REG_NOERROR && exp == NULL, 0))
+        {
+          free_bin_tree (tree);
+          return NULL;
+        }
+      if (tree != NULL && exp != NULL)
+        {
+          tree = create_tree (tree, exp, CONCAT, 0);
+          if (tree == NULL)
+            return *err = REG_ESPACE, NULL;
+        }
+      else if (tree == NULL)
+        tree = exp;
+      /* Otherwise exp == NULL, we don't need to create new tree.  */
+    }
+  return tree;
+}
+
+/* This function build the following tree, from regular expression a*:
+         *
+         |
+         a
+*/
+
+static bin_tree_t *
+parse_expression (regexp, preg, token, syntax, nest, err)
+     re_string_t *regexp;
+     regex_t *preg;
+     re_token_t *token;
+     reg_syntax_t syntax;
+     int nest;
+     reg_errcode_t *err;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  bin_tree_t *tree;
+  int new_idx;
+  switch (token->type)
+    {
+    case CHARACTER:
+      new_idx = re_dfa_add_node (dfa, *token, 0);
+      tree = create_tree (NULL, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || tree == NULL, 0))
+        return *err = REG_ESPACE, NULL;
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+       {
+         while (!re_string_eoi (regexp)
+                && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
+           {
+              bin_tree_t *mbc_remain;
+              *token = fetch_token (regexp, syntax);
+              new_idx = re_dfa_add_node (dfa, *token, 0);
+              mbc_remain = create_tree (NULL, NULL, 0, new_idx);
+              tree = create_tree (tree, mbc_remain, CONCAT, 0);
+              if (BE (new_idx == -1 || mbc_remain == NULL || tree == NULL, 0))
+                return *err = REG_ESPACE, NULL;
+            }
+       }
+#endif
+      break;
+    case OP_OPEN_SUBEXP:
+      tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
+      if (BE (*err != REG_NOERROR && tree == NULL, 0))
+        return NULL;
+      break;
+    case OP_OPEN_BRACKET:
+      tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
+      if (BE (*err != REG_NOERROR && tree == NULL, 0))
+        return NULL;
+      break;
+    case OP_BACK_REF:
+      if (BE (preg->re_nsub < token->opr.idx
+              || dfa->subexps[token->opr.idx - 1].end == -1, 0))
+        {
+          *err = REG_ESUBREG;
+          return NULL;
+        }
+      new_idx = re_dfa_add_node (dfa, *token, 0);
+      tree = create_tree (NULL, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || tree == NULL, 0))
+        return *err = REG_ESPACE, NULL;
+      ++dfa->nbackref;
+      dfa->has_mb_node = 1;
+      break;
+    case OP_DUP_ASTERISK:
+    case OP_DUP_PLUS:
+    case OP_DUP_QUESTION:
+    case OP_OPEN_DUP_NUM:
+      if (syntax & RE_CONTEXT_INVALID_OPS)
+        return *err = REG_BADRPT, NULL;
+      else if (syntax & RE_CONTEXT_INDEP_OPS)
+        {
+          *token = fetch_token (regexp, syntax);
+          return parse_expression (regexp, preg, token, syntax, nest, err);
+        }
+      /* else fall through  */
+    case OP_CLOSE_SUBEXP:
+      if ((token->type == OP_CLOSE_SUBEXP) &&
+          !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
+        return *err = REG_ERPAREN, NULL;
+      /* else fall through  */
+    case OP_CLOSE_DUP_NUM:
+      /* We treat it as a normal character.  */
+
+      /* Then we can these characters as normal characters.  */
+      token->type = CHARACTER;
+      new_idx = re_dfa_add_node (dfa, *token, 0);
+      tree = create_tree (NULL, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || tree == NULL, 0))
+        return *err = REG_ESPACE, NULL;
+      break;
+    case ANCHOR:
+      if (dfa->word_char == NULL)
+        {
+          *err = init_word_char (dfa);
+          if (BE (*err != REG_NOERROR, 0))
+            return NULL;
+        }
+      if (token->opr.ctx_type == WORD_DELIM)
+        {
+          bin_tree_t *tree_first, *tree_last;
+          int idx_first, idx_last;
+          token->opr.ctx_type = WORD_FIRST;
+          idx_first = re_dfa_add_node (dfa, *token, 0);
+          tree_first = create_tree (NULL, NULL, 0, idx_first);
+          token->opr.ctx_type = WORD_LAST;
+          idx_last = re_dfa_add_node (dfa, *token, 0);
+          tree_last = create_tree (NULL, NULL, 0, idx_last);
+          token->type = OP_ALT;
+          new_idx = re_dfa_add_node (dfa, *token, 0);
+          tree = create_tree (tree_first, tree_last, 0, new_idx);
+          if (BE (idx_first == -1 || idx_last == -1 || new_idx == -1
+                  || tree_first == NULL || tree_last == NULL
+                  || tree == NULL, 0))
+            return *err = REG_ESPACE, NULL;
+        }
+      else
+        {
+          new_idx = re_dfa_add_node (dfa, *token, 0);
+          tree = create_tree (NULL, NULL, 0, new_idx);
+          if (BE (new_idx == -1 || tree == NULL, 0))
+            return *err = REG_ESPACE, NULL;
+        }
+      /* We must return here, since ANCHORs can't be followed
+         by repetition operators.
+         eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
+             it must not be "<ANCHOR(^)><REPEAT(*)>".  */
+      *token = fetch_token (regexp, syntax);
+      return tree;
+    case OP_PERIOD:
+      new_idx = re_dfa_add_node (dfa, *token, 0);
+      tree = create_tree (NULL, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || tree == NULL, 0))
+        return *err = REG_ESPACE, NULL;
+      if (MB_CUR_MAX > 1)
+        dfa->has_mb_node = 1;
+      break;
+    case OP_WORD:
+      tree = build_word_op (dfa, 0, err);
+      if (BE (*err != REG_NOERROR && tree == NULL, 0))
+        return NULL;
+      break;
+    case OP_NOTWORD:
+      tree = build_word_op (dfa, 1, err);
+      if (BE (*err != REG_NOERROR && tree == NULL, 0))
+        return NULL;
+      break;
+    case OP_ALT:
+    case END_OF_RE:
+      return NULL;
+    case BACK_SLASH:
+      *err = REG_EESCAPE;
+      return NULL;
+    default:
+      /* Must not happen?  */
+#ifdef DEBUG
+      assert (0);
+#endif
+      return NULL;
+    }
+  *token = fetch_token (regexp, syntax);
+
+  while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
+         || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
+    {
+      tree = parse_dup_op (tree, regexp, dfa, token, syntax, err);
+      if (BE (*err != REG_NOERROR && tree == NULL, 0))
+        return NULL;
+      dfa->has_plural_match = 1;
+    }
+
+  return tree;
+}
+
+/* This function build the following tree, from regular expression
+   (<reg_exp>):
+         SUBEXP
+            |
+        <reg_exp>
+*/
+
+static bin_tree_t *
+parse_sub_exp (regexp, preg, token, syntax, nest, err)
+     re_string_t *regexp;
+     regex_t *preg;
+     re_token_t *token;
+     reg_syntax_t syntax;
+     int nest;
+     reg_errcode_t *err;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  bin_tree_t *tree, *left_par, *right_par;
+  size_t cur_nsub;
+  int new_idx;
+  cur_nsub = preg->re_nsub++;
+  if (dfa->subexps_alloc < preg->re_nsub)
+    {
+      re_subexp_t *new_array;
+      dfa->subexps_alloc *= 2;
+      new_array = re_realloc (dfa->subexps, re_subexp_t, dfa->subexps_alloc);
+      if (BE (new_array == NULL, 0))
+       {
+         dfa->subexps_alloc /= 2;
+         *err = REG_ESPACE;
+         return NULL;
+       }
+      dfa->subexps = new_array;
+    }
+  dfa->subexps[cur_nsub].start = dfa->nodes_len;
+  dfa->subexps[cur_nsub].end = -1;
+
+  new_idx = re_dfa_add_node (dfa, *token, 0);
+  left_par = create_tree (NULL, NULL, 0, new_idx);
+  if (BE (new_idx == -1 || left_par == NULL, 0))
+    return *err = REG_ESPACE, NULL;
+  dfa->nodes[new_idx].opr.idx = cur_nsub;
+  *token = fetch_token (regexp, syntax);
+
+  /* The subexpression may be a null string.  */
+  if (token->type == OP_CLOSE_SUBEXP)
+    tree = NULL;
+  else
+    {
+      tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
+      if (BE (*err != REG_NOERROR && tree == NULL, 0))
+        return NULL;
+    }
+  if (BE (token->type != OP_CLOSE_SUBEXP, 0))
+    {
+      free_bin_tree (tree);
+      *err = REG_BADPAT;
+      return NULL;
+    }
+  new_idx = re_dfa_add_node (dfa, *token, 0);
+  dfa->subexps[cur_nsub].end = dfa->nodes_len;
+  right_par = create_tree (NULL, NULL, 0, new_idx);
+  tree = ((tree == NULL) ? right_par
+          : create_tree (tree, right_par, CONCAT, 0));
+  tree = create_tree (left_par, tree, CONCAT, 0);
+  if (BE (new_idx == -1 || right_par == NULL || tree == NULL, 0))
+    return *err = REG_ESPACE, NULL;
+  dfa->nodes[new_idx].opr.idx = cur_nsub;
+
+  return tree;
+}
+
+/* This function parse repetition operators like "*", "+", "{1,3}" etc.  */
+
+static bin_tree_t *
+parse_dup_op (dup_elem, regexp, dfa, token, syntax, err)
+     bin_tree_t *dup_elem;
+     re_string_t *regexp;
+     re_dfa_t *dfa;
+     re_token_t *token;
+     reg_syntax_t syntax;
+     reg_errcode_t *err;
+{
+  re_token_t dup_token;
+  bin_tree_t *tree = dup_elem, *work_tree;
+  int new_idx, start_idx = re_string_cur_idx (regexp);
+  re_token_t start_token = *token;
+  if (token->type == OP_OPEN_DUP_NUM)
+    {
+      int i;
+      int end = 0;
+      int start = fetch_number (regexp, token, syntax);
+      bin_tree_t *elem;
+      if (start == -1)
+        {
+          if (token->type == CHARACTER && token->opr.c == ',')
+            start = 0; /* We treat "{,m}" as "{0,m}".  */
+          else
+            {
+              *err = REG_BADBR; /* <re>{} is invalid.  */
+              return NULL;
+            }
+        }
+      if (BE (start != -2, 1))
+        {
+          /* We treat "{n}" as "{n,n}".  */
+          end = ((token->type == OP_CLOSE_DUP_NUM) ? start
+                 : ((token->type == CHARACTER && token->opr.c == ',')
+                    ? fetch_number (regexp, token, syntax) : -2));
+        }
+      if (BE (start == -2 || end == -2, 0))
+        {
+          /* Invalid sequence.  */
+          if (token->type == OP_CLOSE_DUP_NUM)
+            goto parse_dup_op_invalid_interval;
+          else
+            goto parse_dup_op_ebrace;
+        }
+      if (BE (start == 0 && end == 0, 0))
+        {
+          /* We treat "<re>{0}" and "<re>{0,0}" as null string.  */
+          *token = fetch_token (regexp, syntax);
+          free_bin_tree (dup_elem);
+          return NULL;
+        }
+
+      /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}".  */
+      elem = tree;
+      for (i = 0; i < start; ++i)
+        if (i != 0)
+          {
+            work_tree = duplicate_tree (elem, dfa);
+            tree = create_tree (tree, work_tree, CONCAT, 0);
+            if (BE (work_tree == NULL || tree == NULL, 0))
+              goto parse_dup_op_espace;
+          }
+
+      if (end == -1)
+        {
+          /* We treat "<re>{0,}" as "<re>*".  */
+          dup_token.type = OP_DUP_ASTERISK;
+          if (start > 0)
+            {
+              elem = duplicate_tree (elem, dfa);
+              new_idx = re_dfa_add_node (dfa, dup_token, 0);
+              work_tree = create_tree (elem, NULL, 0, new_idx);
+              tree = create_tree (tree, work_tree, CONCAT, 0);
+              if (BE (elem == NULL || new_idx == -1 || work_tree == NULL
+                      || tree == NULL, 0))
+                goto parse_dup_op_espace;
+            }
+          else
+            {
+              new_idx = re_dfa_add_node (dfa, dup_token, 0);
+              tree = create_tree (elem, NULL, 0, new_idx);
+              if (BE (new_idx == -1 || tree == NULL, 0))
+                goto parse_dup_op_espace;
+            }
+        }
+      else if (end - start > 0)
+        {
+          /* Then extract "<re>{0,m}" to "<re>?<re>?...<re>?".  */
+          dup_token.type = OP_DUP_QUESTION;
+          if (start > 0)
+            {
+              elem = duplicate_tree (elem, dfa);
+              new_idx = re_dfa_add_node (dfa, dup_token, 0);
+              elem = create_tree (elem, NULL, 0, new_idx);
+              tree = create_tree (tree, elem, CONCAT, 0);
+              if (BE (elem == NULL || new_idx == -1 || tree == NULL, 0))
+                goto parse_dup_op_espace;
+            }
+          else
+            {
+              new_idx = re_dfa_add_node (dfa, dup_token, 0);
+              tree = elem = create_tree (elem, NULL, 0, new_idx);
+              if (BE (new_idx == -1 || tree == NULL, 0))
+                goto parse_dup_op_espace;
+            }
+          for (i = 1; i < end - start; ++i)
+            {
+              work_tree = duplicate_tree (elem, dfa);
+              tree = create_tree (tree, work_tree, CONCAT, 0);
+              if (BE (work_tree == NULL || tree == NULL, 0))
+                return *err = REG_ESPACE, NULL;
+            }
+        }
+    }
+  else
+    {
+      new_idx = re_dfa_add_node (dfa, *token, 0);
+      tree = create_tree (tree, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || tree == NULL, 0))
+        return *err = REG_ESPACE, NULL;
+    }
+  *token = fetch_token (regexp, syntax);
+  return tree;
+
+ parse_dup_op_espace:
+  free_bin_tree (tree);
+  *err = REG_ESPACE;
+  return NULL;
+
+ parse_dup_op_ebrace:
+  if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0))
+    {
+      *err = REG_EBRACE;
+      return NULL;
+    }
+  goto parse_dup_op_rollback;
+ parse_dup_op_invalid_interval:
+  if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0))
+    {
+      *err = REG_BADBR;
+      return NULL;
+    }
+ parse_dup_op_rollback:
+  re_string_set_index (regexp, start_idx);
+  *token = start_token;
+  token->type = CHARACTER;
+  return dup_elem;
+}
+
+/* Size of the names for collating symbol/equivalence_class/character_class.
+   I'm not sure, but maybe enough.  */
+#define BRACKET_NAME_BUF_SIZE 32
+
+#ifndef _LIBC
+  /* Local function for parse_bracket_exp only used in case of NOT _LIBC.
+     Build the range expression which starts from START_ELEM, and ends
+     at END_ELEM.  The result are written to MBCSET and SBCSET.
+     RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+     mbcset->range_ends, is a pointer argument sinse we may
+     update it.  */
+
+static reg_errcode_t
+# ifdef RE_ENABLE_I18N
+build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
+     re_charset_t *mbcset;
+     int *range_alloc;
+# else /* not RE_ENABLE_I18N */
+build_range_exp (sbcset, start_elem, end_elem)
+# endif /* not RE_ENABLE_I18N */
+     re_bitset_ptr_t sbcset;
+     bracket_elem_t *start_elem, *end_elem;
+{
+  unsigned int start_ch, end_ch;
+  /* Equivalence Classes and Character Classes can't be a range start/end.  */
+  if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+          || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+          0))
+    return REG_ERANGE;
+
+  /* We can handle no multi character collating elements without libc
+     support.  */
+  if (BE ((start_elem->type == COLL_SYM
+           && strlen ((char *) start_elem->opr.name) > 1)
+          || (end_elem->type == COLL_SYM
+              && strlen ((char *) end_elem->opr.name) > 1), 0))
+    return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+  {
+    wchar_t wc, start_wc, end_wc;
+    wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+
+    start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
+                : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+                   : 0));
+    end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
+              : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+                 : 0));
+    start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
+                ? __btowc (start_ch) : start_elem->opr.wch);
+    end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
+              ? __btowc (end_ch) : end_elem->opr.wch);
+    cmp_buf[0] = start_wc;
+    cmp_buf[4] = end_wc;
+    if (wcscoll (cmp_buf, cmp_buf + 4) > 0)
+      return REG_ERANGE;
+
+    /* Check the space of the arrays.  */
+    if (*range_alloc == mbcset->nranges)
+      {
+        /* There are not enough space, need realloc.  */
+        wchar_t *new_array_start, *new_array_end;
+        int new_nranges;
+
+        /* +1 in case of mbcset->nranges is 0.  */
+        new_nranges = 2 * mbcset->nranges + 1;
+        /* Use realloc since mbcset->range_starts and mbcset->range_ends
+           are NULL if *range_alloc == 0.  */
+        new_array_start = re_realloc (mbcset->range_starts, wchar_t,
+                                      new_nranges);
+        new_array_end = re_realloc (mbcset->range_ends, wchar_t,
+                                    new_nranges);
+
+        if (BE (new_array_start == NULL || new_array_end == NULL, 0))
+          return REG_ESPACE;
+
+        mbcset->range_starts = new_array_start;
+        mbcset->range_ends = new_array_end;
+        *range_alloc = new_nranges;
+      }
+
+    mbcset->range_starts[mbcset->nranges] = start_wc;
+    mbcset->range_ends[mbcset->nranges++] = end_wc;
+
+    /* Build the table for single byte characters.  */
+    for (wc = 0; wc <= SBC_MAX; ++wc)
+      {
+        cmp_buf[2] = wc;
+        if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+            && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+          bitset_set (sbcset, wc);
+      }
+  }
+# else /* not RE_ENABLE_I18N */
+  {
+    unsigned int ch;
+    start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch
+                : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
+                   : 0));
+    end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch
+              : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
+                 : 0));
+    if (start_ch > end_ch)
+      return REG_ERANGE;
+    /* Build the table for single byte characters.  */
+    for (ch = 0; ch <= SBC_MAX; ++ch)
+      if (start_ch <= ch  && ch <= end_ch)
+        bitset_set (sbcset, ch);
+  }
+# endif /* not RE_ENABLE_I18N */
+  return REG_NOERROR;
+}
+#endif /* not _LIBC */
+
+#ifndef _LIBC
+/* Helper function for parse_bracket_exp only used in case of NOT _LIBC..
+   Build the collating element which is represented by NAME.
+   The result are written to MBCSET and SBCSET.
+   COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+   pointer argument since we may update it.  */
+
+static reg_errcode_t
+# ifdef RE_ENABLE_I18N
+build_collating_symbol (sbcset, mbcset, coll_syxmalloc, name)
+     re_charset_t *mbcset;
+     int *coll_syxmalloc;
+# else /* not RE_ENABLE_I18N */
+build_collating_symbol (sbcset, name)
+# endif /* not RE_ENABLE_I18N */
+     re_bitset_ptr_t sbcset;
+     const unsigned char *name;
+{
+  size_t name_len = strlen ((const char *) name);
+  if (BE (name_len != 1, 0))
+    return REG_ECOLLATE;
+  else
+    {
+      bitset_set (sbcset, name[0]);
+      return REG_NOERROR;
+    }
+}
+#endif /* not _LIBC */
+
+/* This function parse bracket expression like "[abc]", "[a-c]",
+   "[[.a-a.]]" etc.  */
+
+static bin_tree_t *
+parse_bracket_exp (regexp, dfa, token, syntax, err)
+     re_string_t *regexp;
+     re_dfa_t *dfa;
+     re_token_t *token;
+     reg_syntax_t syntax;
+     reg_errcode_t *err;
+{
+#ifdef _LIBC
+  const unsigned char *collseqmb;
+  const char *collseqwc;
+  uint32_t nrules;
+  int32_t table_size;
+  const int32_t *symb_table;
+  const unsigned char *extra;
+
+  /* Local function for parse_bracket_exp used in _LIBC environement.
+     Seek the collating symbol entry correspondings to NAME.
+     Return the index of the symbol in the SYMB_TABLE.  */
+
+  static inline int32_t
+  seek_collating_symbol_entry (name, name_len)
+         const unsigned char *name;
+         size_t name_len;
+    {
+      int32_t hash = elem_hash ((const char *) name, name_len);
+      int32_t elem = hash % table_size;
+      int32_t second = hash % (table_size - 2);
+      while (symb_table[2 * elem] != 0)
+        {
+          /* First compare the hashing value.  */
+          if (symb_table[2 * elem] == hash
+              /* Compare the length of the name.  */
+              && name_len == extra[symb_table[2 * elem + 1]]
+              /* Compare the name.  */
+              && memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
+                         name_len) == 0)
+            {
+              /* Yep, this is the entry.  */
+              break;
+            }
+
+          /* Next entry.  */
+          elem += second;
+        }
+      return elem;
+    }
+
+  /* Local function for parse_bracket_exp used in _LIBC environement.
+     Look up the collation sequence value of BR_ELEM.
+     Return the value if succeeded, UINT_MAX otherwise.  */
+
+  static inline unsigned int
+  lookup_collation_sequence_value (br_elem)
+         bracket_elem_t *br_elem;
+    {
+      if (br_elem->type == SB_CHAR)
+        {
+          /*
+          if (MB_CUR_MAX == 1)
+          */
+          if (nrules == 0)
+            return collseqmb[br_elem->opr.ch];
+          else
+            {
+              wint_t wc = __btowc (br_elem->opr.ch);
+              return collseq_table_lookup (collseqwc, wc);
+            }
+        }
+      else if (br_elem->type == MB_CHAR)
+        {
+          return collseq_table_lookup (collseqwc, br_elem->opr.wch);
+        }
+      else if (br_elem->type == COLL_SYM)
+        {
+          size_t sym_name_len = strlen ((char *) br_elem->opr.name);
+          if (nrules != 0)
+            {
+              int32_t elem, idx;
+              elem = seek_collating_symbol_entry (br_elem->opr.name,
+                                                  sym_name_len);
+              if (symb_table[2 * elem] != 0)
+                {
+                  /* We found the entry.  */
+                  idx = symb_table[2 * elem + 1];
+                  /* Skip the name of collating element name.  */
+                  idx += 1 + extra[idx];
+                  /* Skip the byte sequence of the collating element.  */
+                  idx += 1 + extra[idx];
+                  /* Adjust for the alignment.  */
+                  idx = (idx + 3) & ~3;
+                  /* Skip the multibyte collation sequence value.  */
+                  idx += sizeof (unsigned int);
+                  /* Skip the wide char sequence of the collating element.  */
+                  idx += sizeof (unsigned int) *
+                    (1 + *(unsigned int *) (extra + idx));
+                  /* Return the collation sequence value.  */
+                  return *(unsigned int *) (extra + idx);
+                }
+              else if (symb_table[2 * elem] == 0 && sym_name_len == 1)
+                {
+                  /* No valid character.  Match it as a single byte
+                     character.  */
+                  return collseqmb[br_elem->opr.name[0]];
+                }
+            }
+          else if (sym_name_len == 1)
+            return collseqmb[br_elem->opr.name[0]];
+        }
+      return UINT_MAX;
+    }
+
+  /* Local function for parse_bracket_exp used in _LIBC environement.
+     Build the range expression which starts from START_ELEM, and ends
+     at END_ELEM.  The result are written to MBCSET and SBCSET.
+     RANGE_ALLOC is the allocated size of mbcset->range_starts, and
+     mbcset->range_ends, is a pointer argument sinse we may
+     update it.  */
+
+  static inline reg_errcode_t
+# ifdef RE_ENABLE_I18N
+  build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
+         re_charset_t *mbcset;
+         int *range_alloc;
+# else /* not RE_ENABLE_I18N */
+  build_range_exp (sbcset, start_elem, end_elem)
+# endif /* not RE_ENABLE_I18N */
+         re_bitset_ptr_t sbcset;
+         bracket_elem_t *start_elem, *end_elem;
+    {
+      unsigned int ch;
+      uint32_t start_collseq;
+      uint32_t end_collseq;
+
+# ifdef RE_ENABLE_I18N
+      /* Check the space of the arrays.  */
+      if (*range_alloc == mbcset->nranges)
+        {
+          /* There are not enough space, need realloc.  */
+          uint32_t *new_array_start;
+          uint32_t *new_array_end;
+         int new_nranges;
+
+          /* +1 in case of mbcset->nranges is 0.  */
+          new_nranges = 2 * mbcset->nranges + 1;
+         /* Use realloc since mbcset->range_starts and mbcset->range_ends
+             are NULL if *range_alloc == 0.  */
+          new_array_start = re_realloc (mbcset->range_starts, uint32_t,
+                                        new_nranges);
+          new_array_end = re_realloc (mbcset->range_ends, uint32_t,
+                                      new_nranges);
+
+          if (BE (new_array_start == NULL || new_array_end == NULL, 0))
+            return REG_ESPACE;
+
+          mbcset->range_starts = new_array_start;
+          mbcset->range_ends = new_array_end;
+         *range_alloc = new_nranges;
+        }
+# endif /* RE_ENABLE_I18N */
+
+      /* Equivalence Classes and Character Classes can't be a range
+         start/end.  */
+      if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
+              || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
+              0))
+        return REG_ERANGE;
+
+      start_collseq = lookup_collation_sequence_value (start_elem);
+      end_collseq = lookup_collation_sequence_value (end_elem);
+      /* Check start/end collation sequence values.  */
+      if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0))
+        return REG_ECOLLATE;
+      if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0))
+        return REG_ERANGE;
+
+# ifdef RE_ENABLE_I18N
+      /* Got valid collation sequence values, add them as a new entry.  */
+      mbcset->range_starts[mbcset->nranges] = start_collseq;
+      mbcset->range_ends[mbcset->nranges++] = end_collseq;
+# endif /* RE_ENABLE_I18N */
+
+      /* Build the table for single byte characters.  */
+      for (ch = 0; ch <= SBC_MAX; ch++)
+        {
+          uint32_t ch_collseq;
+          /*
+          if (MB_CUR_MAX == 1)
+          */
+          if (nrules == 0)
+            ch_collseq = collseqmb[ch];
+          else
+            ch_collseq = collseq_table_lookup (collseqwc, __btowc (ch));
+          if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
+            bitset_set (sbcset, ch);
+        }
+      return REG_NOERROR;
+    }
+
+  /* Local function for parse_bracket_exp used in _LIBC environement.
+     Build the collating element which is represented by NAME.
+     The result are written to MBCSET and SBCSET.
+     COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
+     pointer argument sinse we may update it.  */
+
+  static inline reg_errcode_t
+# ifdef RE_ENABLE_I18N
+  build_collating_symbol (sbcset, mbcset, coll_syxmalloc, name)
+         re_charset_t *mbcset;
+         int *coll_syxmalloc;
+# else /* not RE_ENABLE_I18N */
+  build_collating_symbol (sbcset, name)
+# endif /* not RE_ENABLE_I18N */
+         re_bitset_ptr_t sbcset;
+         const unsigned char *name;
+    {
+      int32_t elem, idx;
+      size_t name_len = strlen ((const char *) name);
+      if (nrules != 0)
+        {
+          elem = seek_collating_symbol_entry (name, name_len);
+          if (symb_table[2 * elem] != 0)
+            {
+              /* We found the entry.  */
+              idx = symb_table[2 * elem + 1];
+              /* Skip the name of collating element name.  */
+              idx += 1 + extra[idx];
+            }
+          else if (symb_table[2 * elem] == 0 && name_len == 1)
+            {
+              /* No valid character, treat it as a normal
+                 character.  */
+              bitset_set (sbcset, name[0]);
+              return REG_NOERROR;
+            }
+          else
+            return REG_ECOLLATE;
+
+# ifdef RE_ENABLE_I18N
+          /* Got valid collation sequence, add it as a new entry.  */
+          /* Check the space of the arrays.  */
+          if (*coll_syxmalloc == mbcset->ncoll_syms)
+            {
+              /* Not enough, realloc it.  */
+              /* +1 in case of mbcset->ncoll_syms is 0.  */
+              *coll_syxmalloc = 2 * mbcset->ncoll_syms + 1;
+              /* Use realloc since mbcset->coll_syms is NULL
+                 if *alloc == 0.  */
+              mbcset->coll_syms = re_realloc (mbcset->coll_syms, int32_t,
+                                              *coll_syxmalloc);
+              if (BE (mbcset->coll_syms == NULL, 0))
+                return REG_ESPACE;
+            }
+          mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
+# endif /* RE_ENABLE_I18N */
+          return REG_NOERROR;
+        }
+      else
+        {
+          if (BE (name_len != 1, 0))
+            return REG_ECOLLATE;
+          else
+            {
+              bitset_set (sbcset, name[0]);
+              return REG_NOERROR;
+            }
+        }
+    }
+#endif
+
+  re_token_t br_token;
+  re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+  re_charset_t *mbcset;
+  int coll_syxmalloc = 0, range_alloc = 0, mbchar_alloc = 0;
+  int equiv_class_alloc = 0, char_class_alloc = 0;
+#else /* not RE_ENABLE_I18N */
+  int non_match = 0;
+#endif /* not RE_ENABLE_I18N */
+  bin_tree_t *work_tree;
+  int token_len, new_idx;
+#ifdef _LIBC
+  collseqmb = (const unsigned char *)
+    _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+  nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+  if (nrules)
+    {
+      /*
+      if (MB_CUR_MAX > 1)
+      */
+        collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+      table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
+      symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+                                                  _NL_COLLATE_SYMB_TABLEMB);
+      extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+                                                   _NL_COLLATE_SYMB_EXTRAMB);
+    }
+#endif
+  sbcset = (re_bitset_ptr_t) calloc (sizeof (unsigned int), BITSET_UINTS);
+#ifdef RE_ENABLE_I18N
+  mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+#ifdef RE_ENABLE_I18N
+  if (BE (sbcset == NULL || mbcset == NULL, 0))
+#else
+  if (BE (sbcset == NULL, 0))
+#endif /* RE_ENABLE_I18N */
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+
+  token_len = peek_token_bracket (token, regexp, syntax);
+  if (BE (token->type == END_OF_RE, 0))
+    {
+      *err = REG_BADPAT;
+      goto parse_bracket_exp_free_return;
+    }
+  if (token->type == OP_NON_MATCH_LIST)
+    {
+#ifdef RE_ENABLE_I18N
+      int i;
+      mbcset->non_match = 1;
+#else /* not RE_ENABLE_I18N */
+      non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+      if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+        bitset_set (sbcset, '\0');
+      re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
+      token_len = peek_token_bracket (token, regexp, syntax);
+      if (BE (token->type == END_OF_RE, 0))
+        {
+          *err = REG_BADPAT;
+          goto parse_bracket_exp_free_return;
+        }
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+        for (i = 0; i < SBC_MAX; ++i)
+          if (__btowc (i) == WEOF)
+            bitset_set (sbcset, i);
+#endif /* RE_ENABLE_I18N */
+    }
+
+  /* We treat the first ']' as a normal character.  */
+  if (token->type == OP_CLOSE_BRACKET)
+    token->type = CHARACTER;
+
+  while (1)
+    {
+      bracket_elem_t start_elem, end_elem;
+      unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
+      unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
+      reg_errcode_t ret;
+      int token_len2 = 0, is_range_exp = 0;
+      re_token_t token2;
+
+      start_elem.opr.name = start_name_buf;
+      ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
+                                   syntax);
+      if (BE (ret != REG_NOERROR, 0))
+        {
+          *err = ret;
+          goto parse_bracket_exp_free_return;
+        }
+
+      token_len = peek_token_bracket (token, regexp, syntax);
+      if (BE (token->type == END_OF_RE, 0))
+        {
+          *err = REG_BADPAT;
+          goto parse_bracket_exp_free_return;
+        }
+      if (token->type == OP_CHARSET_RANGE)
+        {
+          re_string_skip_bytes (regexp, token_len); /* Skip '-'.  */
+          token_len2 = peek_token_bracket (&token2, regexp, syntax);
+          if (BE (token->type == END_OF_RE, 0))
+            {
+              *err = REG_BADPAT;
+              goto parse_bracket_exp_free_return;
+            }
+          if (token2.type == OP_CLOSE_BRACKET)
+            {
+              /* We treat the last '-' as a normal character.  */
+              re_string_skip_bytes (regexp, -token_len);
+              token->type = CHARACTER;
+            }
+          else
+            is_range_exp = 1;
+        }
+
+      if (is_range_exp == 1)
+        {
+          end_elem.opr.name = end_name_buf;
+          ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
+                                       dfa, syntax);
+          if (BE (ret != REG_NOERROR, 0))
+            {
+              *err = ret;
+              goto parse_bracket_exp_free_return;
+            }
+
+          token_len = peek_token_bracket (token, regexp, syntax);
+          if (BE (token->type == END_OF_RE, 0))
+            {
+              *err = REG_BADPAT;
+              goto parse_bracket_exp_free_return;
+            }
+          *err = build_range_exp (sbcset,
+#ifdef RE_ENABLE_I18N
+                                  mbcset, &range_alloc,
+#endif /* RE_ENABLE_I18N */
+                                  &start_elem, &end_elem);
+          if (BE (*err != REG_NOERROR, 0))
+            goto parse_bracket_exp_free_return;
+        }
+      else
+        {
+          switch (start_elem.type)
+            {
+            case SB_CHAR:
+              bitset_set (sbcset, start_elem.opr.ch);
+              break;
+#ifdef RE_ENABLE_I18N
+            case MB_CHAR:
+              /* Check whether the array has enough space.  */
+              if (mbchar_alloc == mbcset->nmbchars)
+                {
+                  /* Not enough, realloc it.  */
+                  /* +1 in case of mbcset->nmbchars is 0.  */
+                  mbchar_alloc = 2 * mbcset->nmbchars + 1;
+                  /* Use realloc since array is NULL if *alloc == 0.  */
+                  mbcset->mbchars = re_realloc (mbcset->mbchars, wchar_t,
+                                                mbchar_alloc);
+                  if (BE (mbcset->mbchars == NULL, 0))
+                    goto parse_bracket_exp_espace;
+                }
+              mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
+              break;
+#endif /* RE_ENABLE_I18N */
+            case EQUIV_CLASS:
+              *err = build_equiv_class (sbcset,
+#ifdef RE_ENABLE_I18N
+                                        mbcset, &equiv_class_alloc,
+#endif /* RE_ENABLE_I18N */
+                                       start_elem.opr.name);
+              if (BE (*err != REG_NOERROR, 0))
+                goto parse_bracket_exp_free_return;
+              break;
+            case COLL_SYM:
+              *err = build_collating_symbol (sbcset,
+#ifdef RE_ENABLE_I18N
+                                             mbcset, &coll_syxmalloc,
+#endif /* RE_ENABLE_I18N */
+                                            start_elem.opr.name);
+              if (BE (*err != REG_NOERROR, 0))
+                goto parse_bracket_exp_free_return;
+              break;
+            case CHAR_CLASS:
+              ret = build_charclass (sbcset,
+#ifdef RE_ENABLE_I18N
+                                     mbcset, &char_class_alloc,
+#endif /* RE_ENABLE_I18N */
+                                     start_elem.opr.name, syntax);
+              if (BE (ret != REG_NOERROR, 0))
+               goto parse_bracket_exp_espace;
+              break;
+            default:
+              assert (0);
+              break;
+            }
+        }
+      if (token->type == OP_CLOSE_BRACKET)
+        break;
+    }
+
+  re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
+
+  /* If it is non-matching list.  */
+#ifdef RE_ENABLE_I18N
+  if (mbcset->non_match)
+#else /* not RE_ENABLE_I18N */
+  if (non_match)
+#endif /* not RE_ENABLE_I18N */
+    bitset_not (sbcset);
+
+  /* Build a tree for simple bracket.  */
+  br_token.type = SIMPLE_BRACKET;
+  br_token.opr.sbcset = sbcset;
+  new_idx = re_dfa_add_node (dfa, br_token, 0);
+  work_tree = create_tree (NULL, NULL, 0, new_idx);
+  if (BE (new_idx == -1 || work_tree == NULL, 0))
+    goto parse_bracket_exp_espace;
+
+#ifdef RE_ENABLE_I18N
+  if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
+      || mbcset->nranges || (MB_CUR_MAX > 1 && (mbcset->nchar_classes
+                                                || mbcset->non_match)))
+    {
+      re_token_t alt_token;
+      bin_tree_t *mbc_tree;
+      /* Build a tree for complex bracket.  */
+      br_token.type = COMPLEX_BRACKET;
+      br_token.opr.mbcset = mbcset;
+      dfa->has_mb_node = 1;
+      new_idx = re_dfa_add_node (dfa, br_token, 0);
+      mbc_tree = create_tree (NULL, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || mbc_tree == NULL, 0))
+        goto parse_bracket_exp_espace;
+      /* Then join them by ALT node.  */
+      dfa->has_plural_match = 1;
+      alt_token.type = OP_ALT;
+      new_idx = re_dfa_add_node (dfa, alt_token, 0);
+      work_tree = create_tree (work_tree, mbc_tree, 0, new_idx);
+      if (BE (new_idx != -1 && mbc_tree != NULL, 1))
+        return work_tree;
+    }
+  else
+    {
+      free_charset (mbcset);
+      return work_tree;
+    }
+#else /* not RE_ENABLE_I18N */
+  return work_tree;
+#endif /* not RE_ENABLE_I18N */
+
+ parse_bracket_exp_espace:
+  *err = REG_ESPACE;
+ parse_bracket_exp_free_return:
+  re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+  free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+  return NULL;
+}
+
+/* Parse an element in the bracket expression.  */
+
+static reg_errcode_t
+parse_bracket_element (elem, regexp, token, token_len, dfa, syntax)
+     bracket_elem_t *elem;
+     re_string_t *regexp;
+     re_token_t *token;
+     int token_len;
+     re_dfa_t *dfa;
+     reg_syntax_t syntax;
+{
+#ifdef RE_ENABLE_I18N
+  int cur_char_size;
+  cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
+  if (cur_char_size > 1)
+    {
+      elem->type = MB_CHAR;
+      elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
+      re_string_skip_bytes (regexp, cur_char_size);
+      return REG_NOERROR;
+    }
+#endif /* RE_ENABLE_I18N */
+  re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
+  if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
+      || token->type == OP_OPEN_EQUIV_CLASS)
+    return parse_bracket_symbol (elem, regexp, token);
+  elem->type = SB_CHAR;
+  elem->opr.ch = token->opr.c;
+  return REG_NOERROR;
+}
+
+/* Parse a bracket symbol in the bracket expression.  Bracket symbols are
+   such as [:<character_class>:], [.<collating_element>.], and
+   [=<equivalent_class>=].  */
+
+static reg_errcode_t
+parse_bracket_symbol (elem, regexp, token)
+     bracket_elem_t *elem;
+     re_string_t *regexp;
+     re_token_t *token;
+{
+  unsigned char ch, delim = token->opr.c;
+  int i = 0;
+  for (;; ++i)
+    {
+      if (re_string_eoi(regexp) || i >= BRACKET_NAME_BUF_SIZE)
+        return REG_EBRACK;
+      if (token->type == OP_OPEN_CHAR_CLASS)
+        ch = re_string_fetch_byte_case (regexp);
+      else
+        ch = re_string_fetch_byte (regexp);
+      if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
+        break;
+      elem->opr.name[i] = ch;
+    }
+  re_string_skip_bytes (regexp, 1);
+  elem->opr.name[i] = '\0';
+  switch (token->type)
+    {
+    case OP_OPEN_COLL_ELEM:
+      elem->type = COLL_SYM;
+      break;
+    case OP_OPEN_EQUIV_CLASS:
+      elem->type = EQUIV_CLASS;
+      break;
+    case OP_OPEN_CHAR_CLASS:
+      elem->type = CHAR_CLASS;
+      break;
+    default:
+      break;
+    }
+  return REG_NOERROR;
+}
+
+  /* Helper function for parse_bracket_exp.
+     Build the equivalence class which is represented by NAME.
+     The result are written to MBCSET and SBCSET.
+     EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
+     is a pointer argument sinse we may update it.  */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_equiv_class (sbcset, mbcset, equiv_class_alloc, name)
+     re_charset_t *mbcset;
+     int *equiv_class_alloc;
+#else /* not RE_ENABLE_I18N */
+build_equiv_class (sbcset, name)
+#endif /* not RE_ENABLE_I18N */
+     re_bitset_ptr_t sbcset;
+     const unsigned char *name;
+{
+#if defined _LIBC && defined RE_ENABLE_I18N
+  uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+  if (nrules != 0)
+    {
+      const int32_t *table, *indirect;
+      const unsigned char *weights, *extra, *cp;
+      unsigned char char_buf[2];
+      int32_t idx1, idx2;
+      unsigned int ch;
+      size_t len;
+      /* This #include defines a local function!  */
+# include <locale/weight.h>
+      /* Calculate the index for equivalence class.  */
+      cp = name;
+      table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+      weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+                                              _NL_COLLATE_WEIGHTMB);
+      extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+                                                   _NL_COLLATE_EXTRAMB);
+      indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+                                                _NL_COLLATE_INDIRECTMB);
+      idx1 = findidx (&cp);
+      if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0))
+        /* This isn't a valid character.  */
+        return REG_ECOLLATE;
+
+      /* Build single byte matcing table for this equivalence class.  */
+      char_buf[1] = (unsigned char) '\0';
+      len = weights[idx1];
+      for (ch = 0; ch < SBC_MAX; ++ch)
+        {
+          char_buf[0] = ch;
+          cp = char_buf;
+          idx2 = findidx (&cp);
+/*
+          idx2 = table[ch];
+*/
+          if (idx2 == 0)
+            /* This isn't a valid character.  */
+            continue;
+          if (len == weights[idx2])
+            {
+              int cnt = 0;
+              while (cnt <= len &&
+                     weights[idx1 + 1 + cnt] == weights[idx2 + 1 + cnt])
+                ++cnt;
+
+              if (cnt > len)
+                bitset_set (sbcset, ch);
+            }
+        }
+      /* Check whether the array has enough space.  */
+      if (*equiv_class_alloc == mbcset->nequiv_classes)
+        {
+          /* Not enough, realloc it.  */
+          /* +1 in case of mbcset->nequiv_classes is 0.  */
+          *equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
+          /* Use realloc since the array is NULL if *alloc == 0.  */
+          mbcset->equiv_classes = re_realloc (mbcset->equiv_classes, int32_t,
+                                              *equiv_class_alloc);
+          if (BE (mbcset->equiv_classes == NULL, 0))
+            return REG_ESPACE;
+        }
+      mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
+    }
+  else
+#endif /* _LIBC && RE_ENABLE_I18N */
+    {
+      if (BE (strlen ((const char *) name) != 1, 0))
+        return REG_ECOLLATE;
+      bitset_set (sbcset, *name);
+    }
+  return REG_NOERROR;
+}
+
+  /* Helper function for parse_bracket_exp.
+     Build the character class which is represented by NAME.
+     The result are written to MBCSET and SBCSET.
+     CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
+     is a pointer argument sinse we may update it.  */
+
+static reg_errcode_t
+#ifdef RE_ENABLE_I18N
+build_charclass (sbcset, mbcset, char_class_alloc, class_name, syntax)
+     re_charset_t *mbcset;
+     int *char_class_alloc;
+#else /* not RE_ENABLE_I18N */
+build_charclass (sbcset, class_name, syntax)
+#endif /* not RE_ENABLE_I18N */
+     re_bitset_ptr_t sbcset;
+     const unsigned char *class_name;
+     reg_syntax_t syntax;
+{
+  int i;
+  const char *name = (const char *) class_name;
+
+  /* In case of REG_ICASE "upper" and "lower" match the both of
+     upper and lower cases.  */
+  if ((syntax & RE_ICASE)
+      && (strcmp (name, "upper") == 0 || strcmp (name, "lower") == 0))
+    name = "alpha";
+
+#ifdef RE_ENABLE_I18N
+  /* Check the space of the arrays.  */
+  if (*char_class_alloc == mbcset->nchar_classes)
+    {
+      /* Not enough, realloc it.  */
+      /* +1 in case of mbcset->nchar_classes is 0.  */
+      *char_class_alloc = 2 * mbcset->nchar_classes + 1;
+      /* Use realloc since array is NULL if *alloc == 0.  */
+      mbcset->char_classes = re_realloc (mbcset->char_classes, wctype_t,
+                                         *char_class_alloc);
+      if (BE (mbcset->char_classes == NULL, 0))
+        return REG_ESPACE;
+    }
+  mbcset->char_classes[mbcset->nchar_classes++] = __wctype (name);
+#endif /* RE_ENABLE_I18N */
+
+#define BUILD_CHARCLASS_LOOP(ctype_func)\
+    for (i = 0; i < SBC_MAX; ++i)      \
+      {                                        \
+        if (ctype_func (i))            \
+          bitset_set (sbcset, i);      \
+      }
+
+  if (strcmp (name, "alnum") == 0)
+    BUILD_CHARCLASS_LOOP (isalnum)
+  else if (strcmp (name, "cntrl") == 0)
+    BUILD_CHARCLASS_LOOP (iscntrl)
+  else if (strcmp (name, "lower") == 0)
+    BUILD_CHARCLASS_LOOP (islower)
+  else if (strcmp (name, "space") == 0)
+    BUILD_CHARCLASS_LOOP (isspace)
+  else if (strcmp (name, "alpha") == 0)
+    BUILD_CHARCLASS_LOOP (isalpha)
+  else if (strcmp (name, "digit") == 0)
+    BUILD_CHARCLASS_LOOP (isdigit)
+  else if (strcmp (name, "print") == 0)
+    BUILD_CHARCLASS_LOOP (isprint)
+  else if (strcmp (name, "upper") == 0)
+    BUILD_CHARCLASS_LOOP (isupper)
+  else if (strcmp (name, "blank") == 0)
+    BUILD_CHARCLASS_LOOP (isblank)
+  else if (strcmp (name, "graph") == 0)
+    BUILD_CHARCLASS_LOOP (isgraph)
+  else if (strcmp (name, "punct") == 0)
+    BUILD_CHARCLASS_LOOP (ispunct)
+  else if (strcmp (name, "xdigit") == 0)
+    BUILD_CHARCLASS_LOOP (isxdigit)
+  else
+    return REG_ECTYPE;
+
+  return REG_NOERROR;
+}
+
+static bin_tree_t *
+build_word_op (dfa, not, err)
+     re_dfa_t *dfa;
+     int not;
+     reg_errcode_t *err;
+{
+  re_bitset_ptr_t sbcset;
+#ifdef RE_ENABLE_I18N
+  re_charset_t *mbcset;
+  int alloc = 0;
+#else /* not RE_ENABLE_I18N */
+  int non_match = 0;
+#endif /* not RE_ENABLE_I18N */
+  reg_errcode_t ret;
+  re_token_t br_token;
+  bin_tree_t *tree;
+  int new_idx;
+
+  sbcset = (re_bitset_ptr_t) calloc (sizeof (unsigned int), BITSET_UINTS);
+#ifdef RE_ENABLE_I18N
+  mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
+#endif /* RE_ENABLE_I18N */
+
+#ifdef RE_ENABLE_I18N
+  if (BE (sbcset == NULL || mbcset == NULL, 0))
+#else /* not RE_ENABLE_I18N */
+  if (BE (sbcset == NULL, 0))
+#endif /* not RE_ENABLE_I18N */
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+
+  if (not)
+    {
+#ifdef RE_ENABLE_I18N
+      int i;
+      /*
+      if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+        bitset_set(cset->sbcset, '\0');
+      */
+      mbcset->non_match = 1;
+      if (MB_CUR_MAX > 1)
+        for (i = 0; i < SBC_MAX; ++i)
+          if (__btowc (i) == WEOF)
+            bitset_set (sbcset, i);
+#else /* not RE_ENABLE_I18N */
+      non_match = 1;
+#endif /* not RE_ENABLE_I18N */
+    }
+
+  /* We don't care the syntax in this case.  */
+  ret = build_charclass (sbcset,
+#ifdef RE_ENABLE_I18N
+                         mbcset, &alloc,
+#endif /* RE_ENABLE_I18N */
+                         (const unsigned char *) "alpha", 0);
+
+  if (BE (ret != REG_NOERROR, 0))
+    {
+      re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+      free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+      *err = REG_ESPACE;
+      return NULL;
+    }
+  /* \w match '_' also.  */
+  bitset_set (sbcset, '_');
+
+  /* If it is non-matching list.  */
+#ifdef RE_ENABLE_I18N
+  if (mbcset->non_match)
+#else /* not RE_ENABLE_I18N */
+  if (non_match)
+#endif /* not RE_ENABLE_I18N */
+    bitset_not (sbcset);
+
+  /* Build a tree for simple bracket.  */
+  br_token.type = SIMPLE_BRACKET;
+  br_token.opr.sbcset = sbcset;
+  new_idx = re_dfa_add_node (dfa, br_token, 0);
+  tree = create_tree (NULL, NULL, 0, new_idx);
+  if (BE (new_idx == -1 || tree == NULL, 0))
+    goto build_word_op_espace;
+
+#ifdef RE_ENABLE_I18N
+  if (MB_CUR_MAX > 1)
+    {
+      re_token_t alt_token;
+      bin_tree_t *mbc_tree;
+      /* Build a tree for complex bracket.  */
+      br_token.type = COMPLEX_BRACKET;
+      br_token.opr.mbcset = mbcset;
+      dfa->has_mb_node = 1;
+      new_idx = re_dfa_add_node (dfa, br_token, 0);
+      mbc_tree = create_tree (NULL, NULL, 0, new_idx);
+      if (BE (new_idx == -1 || mbc_tree == NULL, 0))
+        goto build_word_op_espace;
+      /* Then join them by ALT node.  */
+      alt_token.type = OP_ALT;
+      new_idx = re_dfa_add_node (dfa, alt_token, 0);
+      tree = create_tree (tree, mbc_tree, 0, new_idx);
+      if (BE (new_idx != -1 && mbc_tree != NULL, 1))
+        return tree;
+    }
+  else
+    {
+      free_charset (mbcset);
+      return tree;
+    }
+#else /* not RE_ENABLE_I18N */
+  return tree;
+#endif /* not RE_ENABLE_I18N */
+
+ build_word_op_espace:
+  re_free (sbcset);
+#ifdef RE_ENABLE_I18N
+  free_charset (mbcset);
+#endif /* RE_ENABLE_I18N */
+  *err = REG_ESPACE;
+  return NULL;
+}
+
+/* This is intended for the expressions like "a{1,3}".
+   Fetch a number from `input', and return the number.
+   Return -1, if the number field is empty like "{,1}".
+   Return -2, If an error is occured.  */
+
+static int
+fetch_number (input, token, syntax)
+     re_string_t *input;
+     re_token_t *token;
+     reg_syntax_t syntax;
+{
+  int num = -1;
+  unsigned char c;
+  while (1)
+    {
+      *token = fetch_token (input, syntax);
+      c = token->opr.c;
+      if (BE (token->type == END_OF_RE, 0))
+        return -2;
+      if (token->type == OP_CLOSE_DUP_NUM || c == ',')
+        break;
+      num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2)
+             ? -2 : ((num == -1) ? c - '0' : num * 10 + c - '0'));
+      num = (num > RE_DUP_MAX) ? -2 : num;
+    }
+  return num;
+}
+\f
+#ifdef RE_ENABLE_I18N
+static void
+free_charset (re_charset_t *cset)
+{
+  re_free (cset->mbchars);
+# ifdef _LIBC
+  re_free (cset->coll_syms);
+  re_free (cset->equiv_classes);
+  re_free (cset->range_starts);
+  re_free (cset->range_ends);
+# endif
+  re_free (cset->char_classes);
+  re_free (cset);
+}
+#endif /* RE_ENABLE_I18N */
+\f
+/* Functions for binary tree operation.  */
+
+/* Create a node of tree.
+   Note: This function automatically free left and right if malloc fails.  */
+
+static bin_tree_t *
+create_tree (left, right, type, index)
+     bin_tree_t *left;
+     bin_tree_t *right;
+     re_token_type_t type;
+     int index;
+{
+  bin_tree_t *tree;
+  tree = re_malloc (bin_tree_t, 1);
+  if (BE (tree == NULL, 0))
+    {
+      free_bin_tree (left);
+      free_bin_tree (right);
+      return NULL;
+    }
+  tree->parent = NULL;
+  tree->left = left;
+  tree->right = right;
+  tree->type = type;
+  tree->node_idx = index;
+  tree->first = -1;
+  tree->next = -1;
+  re_node_set_init_empty (&tree->eclosure);
+
+  if (left != NULL)
+    left->parent = tree;
+  if (right != NULL)
+    right->parent = tree;
+  return tree;
+}
+
+/* Free the sub tree pointed by TREE.  */
+
+static void
+free_bin_tree (tree)
+     bin_tree_t *tree;
+{
+  if (tree == NULL)
+    return;
+  /*re_node_set_free (&tree->eclosure);*/
+  free_bin_tree (tree->left);
+  free_bin_tree (tree->right);
+  re_free (tree);
+}
+
+/* Duplicate the node SRC, and return new node.  */
+
+static bin_tree_t *
+duplicate_tree (src, dfa)
+     const bin_tree_t *src;
+     re_dfa_t *dfa;
+{
+  bin_tree_t *left = NULL, *right = NULL, *new_tree;
+  int new_node_idx;
+  /* Since node indies must be according to Post-order of the tree,
+     we must duplicate the left at first.  */
+  if (src->left != NULL)
+    {
+      left = duplicate_tree (src->left, dfa);
+      if (left == NULL)
+        return NULL;
+    }
+
+  /* Secondaly, duplicate the right.  */
+  if (src->right != NULL)
+    {
+      right = duplicate_tree (src->right, dfa);
+      if (right == NULL)
+        {
+          free_bin_tree (left);
+          return NULL;
+        }
+    }
+
+  /* At last, duplicate itself.  */
+  if (src->type == NON_TYPE)
+    {
+      new_node_idx = re_dfa_add_node (dfa, dfa->nodes[src->node_idx], 0);
+      dfa->nodes[new_node_idx].duplicated = 1;
+      if (BE (new_node_idx == -1, 0))
+        {
+          free_bin_tree (left);
+          free_bin_tree (right);
+          return NULL;
+        }
+    }
+  else
+    new_node_idx = src->type;
+
+  new_tree = create_tree (left, right, src->type, new_node_idx);
+  if (BE (new_tree == NULL, 0))
+    {
+      free_bin_tree (left);
+      free_bin_tree (right);
+    }
+  return new_tree;
+}
diff --git a/util/regex.c b/util/regex.c
new file mode 100644 (file)
index 0000000..34d4120
--- /dev/null
@@ -0,0 +1,62 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02110-1301 USA.  */
+
+#ifdef _LIBC
+/* We have to keep the namespace clean.  */
+#  define regfree(preg) __regfree (preg)
+#  define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
+#  define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
+#  define regerror(errcode, preg, errbuf, errbuf_size) \
+       __regerror(errcode, preg, errbuf, errbuf_size)
+#  define re_set_registers(bu, re, nu, st, en) \
+       __re_set_registers (bu, re, nu, st, en)
+#  define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
+       __re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+#  define re_match(bufp, string, size, pos, regs) \
+       __re_match (bufp, string, size, pos, regs)
+#  define re_search(bufp, string, size, startpos, range, regs) \
+       __re_search (bufp, string, size, startpos, range, regs)
+#  define re_compile_pattern(pattern, length, bufp) \
+       __re_compile_pattern (pattern, length, bufp)
+#  define re_set_syntax(syntax) __re_set_syntax (syntax)
+#  define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
+       __re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
+#  define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
+#endif
+
+#if _LIBC || __GNUC__ >= 3
+# define BE(expr, val) __builtin_expect (expr, val)
+#else
+# define BE(expr, val) (expr)
+# define inline
+#endif
+
+#include "regcomp.c"
+#include "regexec.c"
+#include "regex_internal.c"
+
+/* Binary backward compatibility.  */
+#if _LIBC
+# include <shlib-compat.h>
+# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
+link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
+int re_max_failures = 2000;
+# endif
+#endif
diff --git a/util/regex_internal.c b/util/regex_internal.c
new file mode 100644 (file)
index 0000000..0f8b897
--- /dev/null
@@ -0,0 +1,1229 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02110-1301 USA.  */
+
+#include <assert.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_WCHAR_H || defined _LIBC
+# include <wchar.h>
+#endif /* HAVE_WCHAR_H || _LIBC */
+#if defined HAVE_WCTYPE_H || defined _LIBC
+# include <wctype.h>
+#endif /* HAVE_WCTYPE_H || _LIBC */
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+#  define _RE_DEFINE_LOCALE_FUNCTIONS 1
+#  include <locale/localeinfo.h>
+#  include <locale/elem-hash.h>
+#  include <locale/coll-lookup.h>
+# endif
+#endif
+
+/* This is for other GNU distributions with internationalized messages.  */
+#if HAVE_LIBINTL_H || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+#  undef gettext
+#  define gettext(msgid) \
+  INTUSE(__dcgettext) (_libc_intl_domainname_internal, msgid, LC_MESSAGES)
+# endif
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+   strings.  */
+# define gettext_noop(String) String
+#endif
+
+#include "_regex.h" /* gnupg */
+#include "regex_internal.h"
+
+static void re_string_construct_common (const char *str, int len,
+                                        re_string_t *pstr,
+                                        RE_TRANSLATE_TYPE trans, int icase);
+#ifdef RE_ENABLE_I18N
+static int re_string_skip_chars (re_string_t *pstr, int new_raw_idx);
+#endif /* RE_ENABLE_I18N */
+static re_dfastate_t *create_newstate_common (re_dfa_t *dfa,
+                                              const re_node_set *nodes,
+                                              unsigned int hash);
+static reg_errcode_t register_state (re_dfa_t *dfa, re_dfastate_t *newstate,
+                                     unsigned int hash);
+static re_dfastate_t *create_ci_newstate (re_dfa_t *dfa,
+                                          const re_node_set *nodes,
+                                          unsigned int hash);
+static re_dfastate_t *create_cd_newstate (re_dfa_t *dfa,
+                                          const re_node_set *nodes,
+                                          unsigned int context,
+                                          unsigned int hash);
+static unsigned int inline calc_state_hash (const re_node_set *nodes,
+                                            unsigned int context);
+\f
+/* Functions for string operation.  */
+
+/* This function allocate the buffers.  It is necessary to call
+   re_string_reconstruct before using the object.  */
+
+static reg_errcode_t
+re_string_allocate (pstr, str, len, init_len, trans, icase)
+     re_string_t *pstr;
+     const char *str;
+     int len, init_len, icase;
+     RE_TRANSLATE_TYPE trans;
+{
+  reg_errcode_t ret;
+  int init_buf_len = (len + 1 < init_len) ? len + 1: init_len;
+  re_string_construct_common (str, len, pstr, trans, icase);
+  pstr->stop = pstr->len;
+
+  ret = re_string_realloc_buffers (pstr, init_buf_len);
+  if (BE (ret != REG_NOERROR, 0))
+    return ret;
+
+  pstr->mbs_case = (MBS_CASE_ALLOCATED (pstr) ? pstr->mbs_case
+                    : (unsigned char *) str);
+  pstr->mbs = MBS_ALLOCATED (pstr) ? pstr->mbs : pstr->mbs_case;
+  pstr->valid_len = (MBS_CASE_ALLOCATED (pstr) || MBS_ALLOCATED (pstr)
+                     || MB_CUR_MAX > 1) ? pstr->valid_len : len;
+  return REG_NOERROR;
+}
+
+/* This function allocate the buffers, and initialize them.  */
+
+static reg_errcode_t
+re_string_construct (pstr, str, len, trans, icase)
+     re_string_t *pstr;
+     const char *str;
+     int len, icase;
+     RE_TRANSLATE_TYPE trans;
+{
+  reg_errcode_t ret;
+  re_string_construct_common (str, len, pstr, trans, icase);
+  pstr->stop = pstr->len;
+  /* Set 0 so that this function can initialize whole buffers.  */
+  pstr->valid_len = 0;
+
+  if (len > 0)
+    {
+      ret = re_string_realloc_buffers (pstr, len + 1);
+      if (BE (ret != REG_NOERROR, 0))
+        return ret;
+    }
+  pstr->mbs_case = (MBS_CASE_ALLOCATED (pstr) ? pstr->mbs_case
+                    : (unsigned char *) str);
+  pstr->mbs = MBS_ALLOCATED (pstr) ? pstr->mbs : pstr->mbs_case;
+
+  if (icase)
+    {
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+        build_wcs_upper_buffer (pstr);
+      else
+#endif /* RE_ENABLE_I18N  */
+        build_upper_buffer (pstr);
+    }
+  else
+    {
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+        build_wcs_buffer (pstr);
+      else
+#endif /* RE_ENABLE_I18N  */
+        {
+          if (trans != NULL)
+            re_string_translate_buffer (pstr);
+          else
+            pstr->valid_len = len;
+        }
+    }
+
+  /* Initialized whole buffers, then valid_len == bufs_len.  */
+  pstr->valid_len = pstr->bufs_len;
+  return REG_NOERROR;
+}
+
+/* Helper functions for re_string_allocate, and re_string_construct.  */
+
+static reg_errcode_t
+re_string_realloc_buffers (pstr, new_buf_len)
+     re_string_t *pstr;
+     int new_buf_len;
+{
+#ifdef RE_ENABLE_I18N
+  if (MB_CUR_MAX > 1)
+    {
+      pstr->wcs = re_realloc (pstr->wcs, wint_t, new_buf_len);
+      if (BE (pstr->wcs == NULL, 0))
+        return REG_ESPACE;
+    }
+#endif /* RE_ENABLE_I18N  */
+  if (MBS_ALLOCATED (pstr))
+    {
+      pstr->mbs = re_realloc (pstr->mbs, unsigned char, new_buf_len);
+      if (BE (pstr->mbs == NULL, 0))
+        return REG_ESPACE;
+    }
+  if (MBS_CASE_ALLOCATED (pstr))
+    {
+      pstr->mbs_case = re_realloc (pstr->mbs_case, unsigned char, new_buf_len);
+      if (BE (pstr->mbs_case == NULL, 0))
+        return REG_ESPACE;
+      if (!MBS_ALLOCATED (pstr))
+        pstr->mbs = pstr->mbs_case;
+    }
+  pstr->bufs_len = new_buf_len;
+  return REG_NOERROR;
+}
+
+
+static void
+re_string_construct_common (str, len, pstr, trans, icase)
+     const char *str;
+     int len;
+     re_string_t *pstr;
+     RE_TRANSLATE_TYPE trans;
+     int icase;
+{
+  memset (pstr, '\0', sizeof (re_string_t));
+  pstr->raw_mbs = (const unsigned char *) str;
+  pstr->len = len;
+  pstr->trans = trans;
+  pstr->icase = icase ? 1 : 0;
+}
+
+#ifdef RE_ENABLE_I18N
+
+/* Build wide character buffer PSTR->WCS.
+   If the byte sequence of the string are:
+     <mb1>(0), <mb1>(1), <mb2>(0), <mb2>(1), <sb3>
+   Then wide character buffer will be:
+     <wc1>   , WEOF    , <wc2>   , WEOF    , <wc3>
+   We use WEOF for padding, they indicate that the position isn't
+   a first byte of a multibyte character.
+
+   Note that this function assumes PSTR->VALID_LEN elements are already
+   built and starts from PSTR->VALID_LEN.  */
+
+static void
+build_wcs_buffer (pstr)
+     re_string_t *pstr;
+{
+  mbstate_t prev_st;
+  int byte_idx, end_idx, mbclen, remain_len;
+  /* Build the buffers from pstr->valid_len to either pstr->len or
+     pstr->bufs_len.  */
+  end_idx = (pstr->bufs_len > pstr->len)? pstr->len : pstr->bufs_len;
+  for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
+    {
+      wchar_t wc;
+      remain_len = end_idx - byte_idx;
+      prev_st = pstr->cur_state;
+      mbclen = mbrtowc (&wc, ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
+                              + byte_idx), remain_len, &pstr->cur_state);
+      if (BE (mbclen == (size_t) -2, 0))
+        {
+          /* The buffer doesn't have enough space, finish to build.  */
+          pstr->cur_state = prev_st;
+          break;
+        }
+      else if (BE (mbclen == (size_t) -1 || mbclen == 0, 0))
+        {
+          /* We treat these cases as a singlebyte character.  */
+          mbclen = 1;
+          wc = (wchar_t) pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+          pstr->cur_state = prev_st;
+        }
+
+      /* Apply the translateion if we need.  */
+      if (pstr->trans != NULL && mbclen == 1)
+        {
+          int ch = pstr->trans[pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx]];
+          pstr->mbs_case[byte_idx] = ch;
+        }
+      /* Write wide character and padding.  */
+      pstr->wcs[byte_idx++] = wc;
+      /* Write paddings.  */
+      for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+        pstr->wcs[byte_idx++] = WEOF;
+    }
+  pstr->valid_len = byte_idx;
+}
+
+/* Build wide character buffer PSTR->WCS like build_wcs_buffer,
+   but for REG_ICASE.  */
+
+static void
+build_wcs_upper_buffer (pstr)
+     re_string_t *pstr;
+{
+  mbstate_t prev_st;
+  int byte_idx, end_idx, mbclen, remain_len;
+  /* Build the buffers from pstr->valid_len to either pstr->len or
+     pstr->bufs_len.  */
+  end_idx = (pstr->bufs_len > pstr->len)? pstr->len : pstr->bufs_len;
+  for (byte_idx = pstr->valid_len; byte_idx < end_idx;)
+    {
+      wchar_t wc;
+      remain_len = end_idx - byte_idx;
+      prev_st = pstr->cur_state;
+      mbclen = mbrtowc (&wc, ((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
+                              + byte_idx), remain_len, &pstr->cur_state);
+      if (BE (mbclen == (size_t) -2, 0))
+        {
+          /* The buffer doesn't have enough space, finish to build.  */
+          pstr->cur_state = prev_st;
+          break;
+        }
+      else if (mbclen == 1 || mbclen == (size_t) -1 || mbclen == 0)
+        {
+          /* In case of a singlebyte character.  */
+          int ch = pstr->raw_mbs[pstr->raw_mbs_idx + byte_idx];
+          /* Apply the translateion if we need.  */
+          if (pstr->trans != NULL && mbclen == 1)
+            {
+              ch = pstr->trans[ch];
+              pstr->mbs_case[byte_idx] = ch;
+            }
+          pstr->wcs[byte_idx] = iswlower (wc) ? toupper (wc) : wc;
+          pstr->mbs[byte_idx++] = islower (ch) ? toupper (ch) : ch;
+          if (BE (mbclen == (size_t) -1, 0))
+            pstr->cur_state = prev_st;
+        }
+      else /* mbclen > 1 */
+        {
+          if (iswlower (wc))
+            wcrtomb ((char *) pstr->mbs + byte_idx, towupper (wc), &prev_st);
+          else
+            memcpy (pstr->mbs + byte_idx,
+                    pstr->raw_mbs + pstr->raw_mbs_idx + byte_idx, mbclen);
+          pstr->wcs[byte_idx++] = iswlower (wc) ? toupper (wc) : wc;
+          /* Write paddings.  */
+          for (remain_len = byte_idx + mbclen - 1; byte_idx < remain_len ;)
+            pstr->wcs[byte_idx++] = WEOF;
+        }
+    }
+  pstr->valid_len = byte_idx;
+}
+
+/* Skip characters until the index becomes greater than NEW_RAW_IDX.
+   Return the index.  */
+
+static int
+re_string_skip_chars (pstr, new_raw_idx)
+     re_string_t *pstr;
+     int new_raw_idx;
+{
+  mbstate_t prev_st;
+  int rawbuf_idx, mbclen;
+
+  /* Skip the characters which are not necessary to check.  */
+  for (rawbuf_idx = pstr->raw_mbs_idx + pstr->valid_len;
+       rawbuf_idx < new_raw_idx;)
+    {
+      int remain_len = pstr->len - rawbuf_idx;
+      prev_st = pstr->cur_state;
+      mbclen = mbrlen ((const char *) pstr->raw_mbs + rawbuf_idx, remain_len,
+                       &pstr->cur_state);
+      if (BE (mbclen == (size_t) -2 || mbclen == (size_t) -1 || mbclen == 0, 0))
+        {
+          /* We treat these cases as a singlebyte character.  */
+          mbclen = 1;
+          pstr->cur_state = prev_st;
+        }
+      /* Then proceed the next character.  */
+      rawbuf_idx += mbclen;
+    }
+  return rawbuf_idx;
+}
+#endif /* RE_ENABLE_I18N  */
+
+/* Build the buffer PSTR->MBS, and apply the translation if we need.  
+   This function is used in case of REG_ICASE.  */
+
+static void
+build_upper_buffer (pstr)
+     re_string_t *pstr;
+{
+  int char_idx, end_idx;
+  end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+  for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
+    {
+      int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
+      if (pstr->trans != NULL)
+        {
+          ch =  pstr->trans[ch];
+          pstr->mbs_case[char_idx] = ch;
+        }
+      if (islower (ch))
+        pstr->mbs[char_idx] = toupper (ch);
+      else
+        pstr->mbs[char_idx] = ch;
+    }
+  pstr->valid_len = char_idx;
+}
+
+/* Apply TRANS to the buffer in PSTR.  */
+
+static void
+re_string_translate_buffer (pstr)
+     re_string_t *pstr;
+{
+  int buf_idx, end_idx;
+  end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
+
+  for (buf_idx = pstr->valid_len; buf_idx < end_idx; ++buf_idx)
+    {
+      int ch = pstr->raw_mbs[pstr->raw_mbs_idx + buf_idx];
+      pstr->mbs_case[buf_idx] = pstr->trans[ch];
+    }
+
+  pstr->valid_len = buf_idx;
+}
+
+/* This function re-construct the buffers.
+   Concretely, convert to wide character in case of MB_CUR_MAX > 1,
+   convert to upper case in case of REG_ICASE, apply translation.  */
+
+static reg_errcode_t
+re_string_reconstruct (pstr, idx, eflags, newline)
+     re_string_t *pstr;
+     int idx, eflags, newline;
+{
+  int offset = idx - pstr->raw_mbs_idx;
+  if (offset < 0)
+    {
+      /* Reset buffer.  */
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+        memset (&pstr->cur_state, '\0', sizeof (mbstate_t));
+#endif /* RE_ENABLE_I18N */
+      pstr->len += pstr->raw_mbs_idx;
+      pstr->stop += pstr->raw_mbs_idx;
+      pstr->valid_len = pstr->raw_mbs_idx = 0;
+      pstr->tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+                           : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
+      if (!MBS_CASE_ALLOCATED (pstr))
+        pstr->mbs_case = (unsigned char *) pstr->raw_mbs;
+      if (!MBS_ALLOCATED (pstr) && !MBS_CASE_ALLOCATED (pstr))
+        pstr->mbs = (unsigned char *) pstr->raw_mbs;
+      offset = idx;
+    }
+
+  if (offset != 0)
+    {
+      pstr->tip_context = re_string_context_at (pstr, offset - 1, eflags,
+                                                newline);
+      /* Are the characters which are already checked remain?  */
+      if (offset < pstr->valid_len)
+        {
+          /* Yes, move them to the front of the buffer.  */
+#ifdef RE_ENABLE_I18N
+          if (MB_CUR_MAX > 1)
+            memmove (pstr->wcs, pstr->wcs + offset,
+                     (pstr->valid_len - offset) * sizeof (wint_t));
+#endif /* RE_ENABLE_I18N */
+          if (MBS_ALLOCATED (pstr))
+            memmove (pstr->mbs, pstr->mbs + offset,
+                     pstr->valid_len - offset);
+          if (MBS_CASE_ALLOCATED (pstr))
+            memmove (pstr->mbs_case, pstr->mbs_case + offset,
+                     pstr->valid_len - offset);
+          pstr->valid_len -= offset;
+#if DEBUG
+          assert (pstr->valid_len > 0);
+#endif
+        }
+      else
+        {
+          /* No, skip all characters until IDX.  */
+          pstr->valid_len = 0;
+#ifdef RE_ENABLE_I18N
+          if (MB_CUR_MAX > 1)
+            {
+              int wcs_idx;
+              pstr->valid_len = re_string_skip_chars (pstr, idx) - idx;
+              for (wcs_idx = 0; wcs_idx < pstr->valid_len; ++wcs_idx)
+                pstr->wcs[wcs_idx] = WEOF;
+            }
+#endif /* RE_ENABLE_I18N */
+        }
+      if (!MBS_CASE_ALLOCATED (pstr))
+        {
+          pstr->mbs_case += offset; 
+          /* In case of !MBS_ALLOCATED && !MBS_CASE_ALLOCATED.  */
+          if (!MBS_ALLOCATED (pstr))
+            pstr->mbs += offset; 
+        }
+    }
+  pstr->raw_mbs_idx = idx;
+  pstr->len -= offset;
+  pstr->stop -= offset;
+
+  /* Then build the buffers.  */
+#ifdef RE_ENABLE_I18N
+  if (MB_CUR_MAX > 1)
+    {
+      if (pstr->icase)
+        build_wcs_upper_buffer (pstr);
+      else
+        build_wcs_buffer (pstr);
+    }
+  else
+#endif /* RE_ENABLE_I18N */
+    {
+      if (pstr->icase)
+        build_upper_buffer (pstr);
+      else if (pstr->trans != NULL)
+        re_string_translate_buffer (pstr);
+    }
+  pstr->cur_idx = 0;
+
+  return REG_NOERROR;
+}
+
+static void
+re_string_destruct (pstr)
+     re_string_t *pstr;
+{
+#ifdef RE_ENABLE_I18N
+  re_free (pstr->wcs);
+#endif /* RE_ENABLE_I18N  */
+  if (MBS_ALLOCATED (pstr))
+    re_free (pstr->mbs);
+  if (MBS_CASE_ALLOCATED (pstr))
+    re_free (pstr->mbs_case);
+}
+
+/* Return the context at IDX in INPUT.  */
+
+static unsigned int
+re_string_context_at (input, idx, eflags, newline_anchor)
+     const re_string_t *input;
+     int idx, eflags, newline_anchor;
+{
+  int c;
+  if (idx < 0 || idx == input->len)
+    {
+      if (idx < 0)
+        /* In this case, we use the value stored in input->tip_context,
+           since we can't know the character in input->mbs[-1] here.  */
+        return input->tip_context;
+      else /* (idx == input->len) */
+        return ((eflags & REG_NOTEOL) ? CONTEXT_ENDBUF
+                : CONTEXT_NEWLINE | CONTEXT_ENDBUF);
+    }
+  c = re_string_byte_at (input, idx);
+  if (IS_WORD_CHAR (c))
+    return CONTEXT_WORD;
+  return (newline_anchor && IS_NEWLINE (c)) ? CONTEXT_NEWLINE : 0;
+}
+\f
+/* Functions for set operation.  */
+
+static reg_errcode_t
+re_node_set_alloc (set, size)
+     re_node_set *set;
+     int size;
+{
+  set->alloc = size;
+  set->nelem = 0;
+  set->elems = re_malloc (int, size);
+  if (BE (set->elems == NULL, 0))
+    return REG_ESPACE;
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+re_node_set_init_1 (set, elem)
+     re_node_set *set;
+     int elem;
+{
+  set->alloc = 1;
+  set->nelem = 1;
+  set->elems = re_malloc (int, 1);
+  if (BE (set->elems == NULL, 0))
+    return REG_ESPACE;
+  set->elems[0] = elem;
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+re_node_set_init_2 (set, elem1, elem2)
+     re_node_set *set;
+     int elem1, elem2;
+{
+  set->alloc = 2;
+  set->elems = re_malloc (int, 2);
+  if (BE (set->elems == NULL, 0))
+    return REG_ESPACE;
+  if (elem1 == elem2)
+    {
+      set->nelem = 1;
+      set->elems[0] = elem1;
+    }
+  else
+    {
+      set->nelem = 2;
+      if (elem1 < elem2)
+        {
+          set->elems[0] = elem1;
+          set->elems[1] = elem2;
+        }
+      else
+        {
+          set->elems[0] = elem2;
+          set->elems[1] = elem1;
+        }
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+re_node_set_init_copy (dest, src)
+     re_node_set *dest;
+     const re_node_set *src;
+{
+  dest->nelem = src->nelem;
+  if (src->nelem > 0)
+    {
+      dest->alloc = dest->nelem;
+      dest->elems = re_malloc (int, dest->alloc);
+      if (BE (dest->elems == NULL, 0))
+        return REG_ESPACE;
+      memcpy (dest->elems, src->elems, src->nelem * sizeof (int));
+    }
+  else
+    re_node_set_init_empty (dest);
+  return REG_NOERROR;
+}
+
+/* Calculate the intersection of the sets SRC1 and SRC2. And merge it to
+   DEST. Return value indicate the error code or REG_NOERROR if succeeded.
+   Note: We assume dest->elems is NULL, when dest->alloc is 0.  */
+
+static reg_errcode_t
+re_node_set_add_intersect (dest, src1, src2)
+     re_node_set *dest;
+     const re_node_set *src1, *src2;
+{
+  int i1, i2, id;
+  if (src1->nelem > 0 && src2->nelem > 0)
+    {
+      if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
+        {
+          dest->alloc = src1->nelem + src2->nelem + dest->nelem;
+          dest->elems = re_realloc (dest->elems, int, dest->alloc);
+          if (BE (dest->elems == NULL, 0))
+            return REG_ESPACE;
+        }
+    }
+  else
+    return REG_NOERROR;
+
+  for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
+    {
+      if (src1->elems[i1] > src2->elems[i2])
+        {
+          ++i2;
+          continue;
+        }
+      if (src1->elems[i1] == src2->elems[i2])
+        {
+          while (id < dest->nelem && dest->elems[id] < src2->elems[i2])
+            ++id;
+          if (id < dest->nelem && dest->elems[id] == src2->elems[i2])
+            ++id;
+          else
+            {
+              memmove (dest->elems + id + 1, dest->elems + id,
+                       sizeof (int) * (dest->nelem - id));
+              dest->elems[id++] = src2->elems[i2++];
+              ++dest->nelem;
+            }
+        }
+      ++i1;
+    }
+  return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets SRC1 and SRC2. And store it to
+   DEST. Return value indicate the error code or REG_NOERROR if succeeded.  */
+
+static reg_errcode_t
+re_node_set_init_union (dest, src1, src2)
+     re_node_set *dest;
+     const re_node_set *src1, *src2;
+{
+  int i1, i2, id;
+  if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
+    {
+      dest->alloc = src1->nelem + src2->nelem;
+      dest->elems = re_malloc (int, dest->alloc);
+      if (BE (dest->elems == NULL, 0))
+        return REG_ESPACE;
+    }
+  else
+    {
+      if (src1 != NULL && src1->nelem > 0)
+        return re_node_set_init_copy (dest, src1);
+      else if (src2 != NULL && src2->nelem > 0)
+        return re_node_set_init_copy (dest, src2);
+      else
+        re_node_set_init_empty (dest);
+      return REG_NOERROR;
+    }
+  for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
+    {
+      if (src1->elems[i1] > src2->elems[i2])
+        {
+          dest->elems[id++] = src2->elems[i2++];
+          continue;
+        }
+      if (src1->elems[i1] == src2->elems[i2])
+        ++i2;
+      dest->elems[id++] = src1->elems[i1++];
+    }
+  if (i1 < src1->nelem)
+    {
+      memcpy (dest->elems + id, src1->elems + i1,
+             (src1->nelem - i1) * sizeof (int));
+      id += src1->nelem - i1;
+    }
+  else if (i2 < src2->nelem)
+    {
+      memcpy (dest->elems + id, src2->elems + i2,
+             (src2->nelem - i2) * sizeof (int));
+      id += src2->nelem - i2;
+    }
+  dest->nelem = id;
+  return REG_NOERROR;
+}
+
+/* Calculate the union set of the sets DEST and SRC. And store it to
+   DEST. Return value indicate the error code or REG_NOERROR if succeeded.  */
+
+static reg_errcode_t
+re_node_set_merge (dest, src)
+     re_node_set *dest;
+     const re_node_set *src;
+{
+  int si, di;
+  if (src == NULL || src->nelem == 0)
+    return REG_NOERROR;
+  if (dest->alloc < src->nelem + dest->nelem)
+    {
+      dest->alloc = 2 * (src->nelem + dest->alloc);
+      dest->elems = re_realloc (dest->elems, int, dest->alloc);
+      if (BE (dest->elems == NULL, 0))
+        return REG_ESPACE;
+    }
+
+  for (si = 0, di = 0 ; si < src->nelem && di < dest->nelem ;)
+    {
+      int cp_from, ncp, mid, right, src_elem = src->elems[si];
+      /* Binary search the spot we will add the new element.  */
+      right = dest->nelem;
+      while (di < right)
+        {
+          mid = (di + right) / 2;
+          if (dest->elems[mid] < src_elem)
+            di = mid + 1;
+          else
+            right = mid;
+        }
+      if (di >= dest->nelem)
+        break;
+
+      if (dest->elems[di] == src_elem)
+        {
+          /* Skip since, DEST already has the element.  */
+          ++di;
+          ++si;
+          continue;
+        }
+
+      /* Skip the src elements which are less than dest->elems[di].  */
+      cp_from = si;
+      while (si < src->nelem && src->elems[si] < dest->elems[di])
+        ++si;
+      /* Copy these src elements.  */
+      ncp = si - cp_from;
+      memmove (dest->elems + di + ncp, dest->elems + di,
+               sizeof (int) * (dest->nelem - di));
+      memcpy (dest->elems + di, src->elems + cp_from,
+              sizeof (int) * ncp);
+      /* Update counters.  */
+      di += ncp;
+      dest->nelem += ncp;
+    }
+
+  /* Copy remaining src elements.  */
+  if (si < src->nelem)
+    {
+      memcpy (dest->elems + di, src->elems + si,
+              sizeof (int) * (src->nelem - si));
+      dest->nelem += src->nelem - si;
+    }
+  return REG_NOERROR;
+}
+
+/* Insert the new element ELEM to the re_node_set* SET.
+   return 0 if SET already has ELEM,
+   return -1 if an error is occured, return 1 otherwise.  */
+
+static int
+re_node_set_insert (set, elem)
+     re_node_set *set;
+     int elem;
+{
+  int idx, right, mid;
+  /* In case of the set is empty.  */
+  if (set->elems == NULL || set->alloc == 0)
+    {
+      if (BE (re_node_set_init_1 (set, elem) == REG_NOERROR, 1))
+        return 1;
+      else
+        return -1;
+    }
+
+  /* Binary search the spot we will add the new element.  */
+  idx = 0;
+  right = set->nelem;
+  while (idx < right)
+    {
+      mid = (idx + right) / 2;
+      if (set->elems[mid] < elem)
+        idx = mid + 1;
+      else
+        right = mid;
+    }
+
+  /* Realloc if we need.  */
+  if (set->alloc < set->nelem + 1)
+    {
+      int *new_array;
+      set->alloc = set->alloc * 2;
+      new_array = re_malloc (int, set->alloc);
+      if (BE (new_array == NULL, 0))
+        return -1;
+      /* Copy the elements they are followed by the new element.  */
+      if (idx > 0)
+        memcpy (new_array, set->elems, sizeof (int) * (idx));
+      /* Copy the elements which follows the new element.  */
+      if (set->nelem - idx > 0)
+        memcpy (new_array + idx + 1, set->elems + idx,
+               sizeof (int) * (set->nelem - idx));
+      re_free (set->elems);
+      set->elems = new_array;
+    }
+  else
+    {
+      /* Move the elements which follows the new element.  */
+      if (set->nelem - idx > 0)
+        memmove (set->elems + idx + 1, set->elems + idx,
+                 sizeof (int) * (set->nelem - idx));
+    }
+  /* Insert the new element.  */
+  set->elems[idx] = elem;
+  ++set->nelem;
+  return 1;
+}
+
+/* Compare two node sets SET1 and SET2.
+   return 1 if SET1 and SET2 are equivalent, retrun 0 otherwise.  */
+
+static int
+re_node_set_compare (set1, set2)
+     const re_node_set *set1, *set2;
+{
+  int i;
+  if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
+    return 0;
+  for (i = 0 ; i < set1->nelem ; i++)
+    if (set1->elems[i] != set2->elems[i])
+      return 0;
+  return 1;
+}
+
+/* Return (idx + 1) if SET contains the element ELEM, return 0 otherwise.  */
+
+static int
+re_node_set_contains (set, elem)
+     const re_node_set *set;
+     int elem;
+{
+  int idx, right, mid;
+  if (set->nelem <= 0)
+    return 0;
+
+  /* Binary search the element.  */
+  idx = 0;
+  right = set->nelem - 1;
+  while (idx < right)
+    {
+      mid = (idx + right) / 2;
+      if (set->elems[mid] < elem)
+        idx = mid + 1;
+      else
+        right = mid;
+    }
+  return set->elems[idx] == elem ? idx + 1 : 0;
+}
+
+static void
+re_node_set_remove_at (set, idx)
+     re_node_set *set;
+     int idx;
+{
+  if (idx < 0 || idx >= set->nelem)
+    return;
+  if (idx < set->nelem - 1)
+    memmove (set->elems + idx, set->elems + idx + 1,
+             sizeof (int) * (set->nelem - idx - 1));
+  --set->nelem;
+}
+\f
+
+/* Add the token TOKEN to dfa->nodes, and return the index of the token.
+   Or return -1, if an error will be occured.  */
+
+static int
+re_dfa_add_node (dfa, token, mode)
+     re_dfa_t *dfa;
+     re_token_t token;
+     int mode;
+{
+  if (dfa->nodes_len >= dfa->nodes_alloc)
+    {
+      re_token_t *new_array;
+      dfa->nodes_alloc *= 2;
+      new_array = re_realloc (dfa->nodes, re_token_t, dfa->nodes_alloc);
+      if (BE (new_array == NULL, 0))
+        return -1;
+      else
+        dfa->nodes = new_array;
+      if (mode)
+        {
+          int *new_firsts, *new_nexts;
+          re_node_set *new_edests, *new_eclosures, *new_inveclosures;
+
+          new_firsts = re_realloc (dfa->firsts, int, dfa->nodes_alloc);
+          new_nexts = re_realloc (dfa->nexts, int, dfa->nodes_alloc);
+          new_edests = re_realloc (dfa->edests, re_node_set, dfa->nodes_alloc);
+          new_eclosures = re_realloc (dfa->eclosures, re_node_set,
+                                      dfa->nodes_alloc);
+          new_inveclosures = re_realloc (dfa->inveclosures, re_node_set,
+                                         dfa->nodes_alloc);
+          if (BE (new_firsts == NULL || new_nexts == NULL || new_edests == NULL
+                  || new_eclosures == NULL || new_inveclosures == NULL, 0))
+            return -1;
+          dfa->firsts = new_firsts;
+          dfa->nexts = new_nexts;
+          dfa->edests = new_edests;
+          dfa->eclosures = new_eclosures;
+          dfa->inveclosures = new_inveclosures;
+        }
+    }
+  dfa->nodes[dfa->nodes_len] = token;
+  dfa->nodes[dfa->nodes_len].duplicated = 0;
+  return dfa->nodes_len++;
+}
+
+static unsigned int inline
+calc_state_hash (nodes, context)
+     const re_node_set *nodes;
+     unsigned int context;
+{
+  unsigned int hash = nodes->nelem + context;
+  int i;
+  for (i = 0 ; i < nodes->nelem ; i++)
+    hash += nodes->elems[i];
+  return hash;
+}
+
+/* Search for the state whose node_set is equivalent to NODES.
+   Return the pointer to the state, if we found it in the DFA.
+   Otherwise create the new one and return it.  In case of an error
+   return NULL and set the error code in ERR.
+   Note: - We assume NULL as the invalid state, then it is possible that
+           return value is NULL and ERR is REG_NOERROR.
+         - We never return non-NULL value in case of any errors, it is for
+           optimization.  */
+
+static re_dfastate_t*
+re_acquire_state (err, dfa, nodes)
+     reg_errcode_t *err;
+     re_dfa_t *dfa;
+     const re_node_set *nodes;
+{
+  unsigned int hash;
+  re_dfastate_t *new_state;
+  struct re_state_table_entry *spot;
+  int i;
+  if (BE (nodes->nelem == 0, 0))
+    {
+      *err = REG_NOERROR;
+      return NULL;
+    }
+  hash = calc_state_hash (nodes, 0);
+  spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+  for (i = 0 ; i < spot->num ; i++)
+    {
+      re_dfastate_t *state = spot->array[i];
+      if (hash != state->hash)
+        continue;
+      if (re_node_set_compare (&state->nodes, nodes))
+        return state;
+    }
+
+  /* There are no appropriate state in the dfa, create the new one.  */
+  new_state = create_ci_newstate (dfa, nodes, hash);
+  if (BE (new_state != NULL, 1))
+    return new_state;
+  else
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+}
+
+/* Search for the state whose node_set is equivalent to NODES and
+   whose context is equivalent to CONTEXT.
+   Return the pointer to the state, if we found it in the DFA.
+   Otherwise create the new one and return it.  In case of an error
+   return NULL and set the error code in ERR.
+   Note: - We assume NULL as the invalid state, then it is possible that
+           return value is NULL and ERR is REG_NOERROR.
+         - We never return non-NULL value in case of any errors, it is for
+           optimization.  */
+
+static re_dfastate_t*
+re_acquire_state_context (err, dfa, nodes, context)
+     reg_errcode_t *err;
+     re_dfa_t *dfa;
+     const re_node_set *nodes;
+     unsigned int context;
+{
+  unsigned int hash;
+  re_dfastate_t *new_state;
+  struct re_state_table_entry *spot;
+  int i;
+  if (nodes->nelem == 0)
+    {
+      *err = REG_NOERROR;
+      return NULL;
+    }
+  hash = calc_state_hash (nodes, context);
+  spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+  for (i = 0 ; i < spot->num ; i++)
+    {
+      re_dfastate_t *state = spot->array[i];
+      if (hash != state->hash)
+        continue;
+      if (re_node_set_compare (state->entrance_nodes, nodes)
+          && state->context == context)
+        return state;
+    }
+  /* There are no appropriate state in `dfa', create the new one.  */
+  new_state = create_cd_newstate (dfa, nodes, context, hash);
+  if (BE (new_state != NULL, 1))
+    return new_state;
+  else
+    {
+      *err = REG_ESPACE;
+      return NULL;
+    }
+}
+
+/* Allocate memory for DFA state and initialize common properties.
+   Return the new state if succeeded, otherwise return NULL.  */
+
+static re_dfastate_t *
+create_newstate_common (dfa, nodes, hash)
+     re_dfa_t *dfa;
+     const re_node_set *nodes;
+     unsigned int hash;
+{
+  re_dfastate_t *newstate;
+  newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
+  if (BE (newstate == NULL, 0))
+    return NULL;
+  re_node_set_init_copy (&newstate->nodes, nodes);
+  newstate->trtable = NULL;
+  newstate->trtable_search = NULL;
+  newstate->hash = hash;
+  return newstate;
+}
+
+/* Store the new state NEWSTATE whose hash value is HASH in appropriate
+   position.  Return value indicate the error code if failed.  */
+
+static reg_errcode_t
+register_state (dfa, newstate, hash)
+     re_dfa_t *dfa;
+     re_dfastate_t *newstate;
+     unsigned int hash;
+{
+  struct re_state_table_entry *spot;
+  spot = dfa->state_table + (hash & dfa->state_hash_mask);
+
+  if (spot->alloc <= spot->num)
+    {
+      spot->alloc = 2 * spot->num + 2;
+      spot->array = re_realloc (spot->array, re_dfastate_t *, spot->alloc);
+      if (BE (spot->array == NULL, 0))
+        return REG_ESPACE;
+    }
+  spot->array[spot->num++] = newstate;
+  return REG_NOERROR;
+}
+
+/* Create the new state which is independ of contexts.
+   Return the new state if succeeded, otherwise return NULL.  */
+
+static re_dfastate_t *
+create_ci_newstate (dfa, nodes, hash)
+     re_dfa_t *dfa;
+     const re_node_set *nodes;
+     unsigned int hash;
+{
+  int i;
+  reg_errcode_t err;
+  re_dfastate_t *newstate;
+  newstate = create_newstate_common (dfa, nodes, hash);
+  if (BE (newstate == NULL, 0))
+    return NULL;
+  newstate->entrance_nodes = &newstate->nodes;
+
+  for (i = 0 ; i < nodes->nelem ; i++)
+    {
+      re_token_t *node = dfa->nodes + nodes->elems[i];
+      re_token_type_t type = node->type;
+      if (type == CHARACTER)
+        continue;
+
+      /* If the state has the halt node, the state is a halt state.  */
+      else if (type == END_OF_RE)
+        newstate->halt = 1;
+#ifdef RE_ENABLE_I18N
+      else if (type == COMPLEX_BRACKET
+               || (type == OP_PERIOD && MB_CUR_MAX > 1))
+        newstate->accept_mb = 1;
+#endif /* RE_ENABLE_I18N */
+      else if (type == OP_BACK_REF)
+        newstate->has_backref = 1;
+      else if (type == ANCHOR || OP_CONTEXT_NODE)
+        {
+          newstate->has_constraint = 1;
+          if (type == OP_CONTEXT_NODE
+              && dfa->nodes[node->opr.ctx_info->entity].type == END_OF_RE)
+            newstate->halt = 1;
+        }
+    }
+  err = register_state (dfa, newstate, hash);
+  return (err != REG_NOERROR) ? NULL : newstate;
+}
+
+/* Create the new state which is depend on the context CONTEXT.
+   Return the new state if succeeded, otherwise return NULL.  */
+
+static re_dfastate_t *
+create_cd_newstate (dfa, nodes, context, hash)
+     re_dfa_t *dfa;
+     const re_node_set *nodes;
+     unsigned int context, hash;
+{
+  int i, nctx_nodes = 0;
+  reg_errcode_t err;
+  re_dfastate_t *newstate;
+
+  newstate = create_newstate_common (dfa, nodes, hash);
+  if (BE (newstate == NULL, 0))
+    return NULL;
+  newstate->context = context;
+  newstate->entrance_nodes = &newstate->nodes;
+
+  for (i = 0 ; i < nodes->nelem ; i++)
+    {
+      unsigned int constraint = 0;
+      re_token_t *node = dfa->nodes + nodes->elems[i];
+      re_token_type_t type = node->type;
+      if (type == CHARACTER)
+        continue;
+
+      /* If the state has the halt node, the state is a halt state.  */
+      else if (type == END_OF_RE)
+        newstate->halt = 1;
+#ifdef RE_ENABLE_I18N
+      else if (type == COMPLEX_BRACKET
+               || (type == OP_PERIOD && MB_CUR_MAX > 1))
+        newstate->accept_mb = 1;
+#endif /* RE_ENABLE_I18N */
+      else if (type == OP_BACK_REF)
+        newstate->has_backref = 1;
+      else if (type == ANCHOR)
+        constraint = node->opr.ctx_type;
+      else if (type == OP_CONTEXT_NODE)
+        {
+          re_token_type_t ctype = dfa->nodes[node->opr.ctx_info->entity].type;
+          constraint = node->constraint;
+          if (ctype == END_OF_RE)
+            newstate->halt = 1;
+          else if (ctype == OP_BACK_REF)
+            newstate->has_backref = 1;
+#ifdef RE_ENABLE_I18N
+          else if (ctype == COMPLEX_BRACKET
+                   || (type == OP_PERIOD && MB_CUR_MAX > 1))
+            newstate->accept_mb = 1;
+#endif /* RE_ENABLE_I18N */
+        }
+
+      if (constraint)
+        {
+          if (newstate->entrance_nodes == &newstate->nodes)
+            {
+              newstate->entrance_nodes = re_malloc (re_node_set, 1);
+             if (BE (newstate->entrance_nodes == NULL, 0))
+               return NULL;
+              re_node_set_init_copy (newstate->entrance_nodes, nodes);
+              nctx_nodes = 0;
+              newstate->has_constraint = 1;
+            }
+
+          if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
+            {
+              re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
+              ++nctx_nodes;
+            }
+        }
+    }
+  err = register_state (dfa, newstate, hash);
+  return (err != REG_NOERROR) ? NULL : newstate;
+}
diff --git a/util/regex_internal.h b/util/regex_internal.h
new file mode 100644 (file)
index 0000000..679bea1
--- /dev/null
@@ -0,0 +1,643 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02110-1301 USA.  */
+
+#ifndef _REGEX_INTERNAL_H
+#define _REGEX_INTERNAL_H 1
+
+/* Number of bits in a byte.  */
+#define BYTE_BITS 8
+/* Number of single byte character.  */
+#define SBC_MAX 256
+
+#define COLL_ELEM_LEN_MAX 8
+
+/* The character which represents newline.  */
+#define NEWLINE_CHAR '\n'
+
+/* Rename to standard API for using out of glibc.  */
+#ifndef _LIBC
+# define __wctype wctype
+# define __iswctype iswctype
+# define __btowc btowc
+# define __mempcpy memcpy
+# define attribute_hidden
+#endif /* not _LIBC */
+
+extern const char __re_error_msgid[] attribute_hidden;
+extern const size_t __re_error_msgid_idx[] attribute_hidden;
+
+/* Number of bits in an unsinged int.  */
+#define UINT_BITS (sizeof (unsigned int) * BYTE_BITS)
+/* Number of unsigned int in an bit_set.  */
+#define BITSET_UINTS ((SBC_MAX + UINT_BITS - 1) / UINT_BITS)
+typedef unsigned int bitset[BITSET_UINTS];
+typedef unsigned int *re_bitset_ptr_t;
+
+#define bitset_set(set,i) (set[i / UINT_BITS] |= 1 << i % UINT_BITS)
+#define bitset_clear(set,i) (set[i / UINT_BITS] &= ~(1 << i % UINT_BITS))
+#define bitset_contain(set,i) (set[i / UINT_BITS] & (1 << i % UINT_BITS))
+#define bitset_empty(set) memset (set, 0, sizeof (unsigned int) * BITSET_UINTS)
+#define bitset_set_all(set) \
+  memset (set, 255, sizeof (unsigned int) * BITSET_UINTS)
+#define bitset_copy(dest,src) \
+  memcpy (dest, src, sizeof (unsigned int) * BITSET_UINTS)
+static inline void bitset_not (bitset set);
+static inline void bitset_merge (bitset dest, const bitset src);
+#if 0 /* gnupg */
+static inline void bitset_not_merge (bitset dest, const bitset src);
+#endif
+
+#define PREV_WORD_CONSTRAINT 0x0001
+#define PREV_NOTWORD_CONSTRAINT 0x0002
+#define NEXT_WORD_CONSTRAINT 0x0004
+#define NEXT_NOTWORD_CONSTRAINT 0x0008
+#define PREV_NEWLINE_CONSTRAINT 0x0010
+#define NEXT_NEWLINE_CONSTRAINT 0x0020
+#define PREV_BEGBUF_CONSTRAINT 0x0040
+#define NEXT_ENDBUF_CONSTRAINT 0x0080
+#define DUMMY_CONSTRAINT 0x0100
+
+typedef enum
+{
+  INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+  WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
+  WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
+  LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
+  LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
+  BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
+  BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
+  WORD_DELIM = DUMMY_CONSTRAINT
+} re_context_type;
+
+typedef struct
+{
+  int alloc;
+  int nelem;
+  int *elems;
+} re_node_set;
+
+typedef enum
+{
+  NON_TYPE = 0,
+
+  /* Token type, these are used only by token.  */
+  OP_OPEN_BRACKET,
+  OP_CLOSE_BRACKET,
+  OP_CHARSET_RANGE,
+  OP_OPEN_DUP_NUM,
+  OP_CLOSE_DUP_NUM,
+  OP_NON_MATCH_LIST,
+  OP_OPEN_COLL_ELEM,
+  OP_CLOSE_COLL_ELEM,
+  OP_OPEN_EQUIV_CLASS,
+  OP_CLOSE_EQUIV_CLASS,
+  OP_OPEN_CHAR_CLASS,
+  OP_CLOSE_CHAR_CLASS,
+  OP_WORD,
+  OP_NOTWORD,
+  BACK_SLASH,
+
+  /* Tree type, these are used only by tree. */
+  CONCAT,
+  ALT,
+  SUBEXP,
+  SIMPLE_BRACKET,
+#ifdef RE_ENABLE_I18N
+  COMPLEX_BRACKET,
+#endif /* RE_ENABLE_I18N */
+
+  /* Node type, These are used by token, node, tree.  */
+  OP_OPEN_SUBEXP,
+  OP_CLOSE_SUBEXP,
+  OP_PERIOD,
+  CHARACTER,
+  END_OF_RE,
+  OP_ALT,
+  OP_DUP_ASTERISK,
+  OP_DUP_PLUS,
+  OP_DUP_QUESTION,
+  OP_BACK_REF,
+  ANCHOR,
+  OP_CONTEXT_NODE,
+
+  /* Dummy marker.  */
+  END_OF_RE_TOKEN_T
+} re_token_type_t;
+
+#ifdef RE_ENABLE_I18N
+typedef struct
+{
+  /* Multibyte characters.  */
+  wchar_t *mbchars;
+
+  /* Collating symbols.  */
+# ifdef _LIBC
+  int32_t *coll_syms;
+# endif
+
+  /* Equivalence classes. */
+# ifdef _LIBC
+  int32_t *equiv_classes;
+# endif
+
+  /* Range expressions. */
+# ifdef _LIBC
+  uint32_t *range_starts;
+  uint32_t *range_ends;
+# else /* not _LIBC */
+  wchar_t *range_starts;
+  wchar_t *range_ends;
+# endif /* not _LIBC */
+
+  /* Character classes. */
+  wctype_t *char_classes;
+
+  /* If this character set is the non-matching list.  */
+  unsigned int non_match : 1;
+
+  /* # of multibyte characters.  */
+  int nmbchars;
+
+  /* # of collating symbols.  */
+  int ncoll_syms;
+
+  /* # of equivalence classes. */
+  int nequiv_classes;
+
+  /* # of range expressions. */
+  int nranges;
+
+  /* # of character classes. */
+  int nchar_classes;
+} re_charset_t;
+#endif /* RE_ENABLE_I18N */
+
+typedef struct
+{
+  union
+  {
+    unsigned char c;           /* for CHARACTER */
+    re_bitset_ptr_t sbcset;    /* for SIMPLE_BRACKET */
+#ifdef RE_ENABLE_I18N
+    re_charset_t *mbcset;      /* for COMPLEX_BRACKET */
+#endif /* RE_ENABLE_I18N */
+    int idx;                   /* for BACK_REF */
+    re_context_type ctx_type;  /* for ANCHOR */
+    struct
+    {
+      int entity;              /* for OP_CONTEXT_NODE, index of the entity */
+      re_node_set *bkref_eclosure;
+    } *ctx_info;
+  } opr;
+#if __GNUC__ >= 2
+  re_token_type_t type : 8;
+#else
+  re_token_type_t type;
+#endif
+  unsigned int constraint : 10;        /* context constraint */
+  unsigned int duplicated : 1;
+#ifdef RE_ENABLE_I18N
+  unsigned int mb_partial : 1;
+#endif
+} re_token_t;
+
+#define IS_EPSILON_NODE(type) \
+  ((type) == OP_ALT || (type) == OP_DUP_ASTERISK || (type) == OP_DUP_PLUS \
+   || (type) == OP_DUP_QUESTION || (type) == ANCHOR \
+   || (type) == OP_OPEN_SUBEXP || (type) == OP_CLOSE_SUBEXP)
+
+#define ACCEPT_MB_NODE(type) \
+  ((type) == COMPLEX_BRACKET || (type) == OP_PERIOD)
+
+struct re_string_t
+{
+  /* Indicate the raw buffer which is the original string passed as an
+     argument of regexec(), re_search(), etc..  */
+  const unsigned char *raw_mbs;
+  /* Store the multibyte string.  In case of "case insensitive mode" like
+     REG_ICASE, upper cases of the string are stored, otherwise MBS points
+     the same address that RAW_MBS points.  */
+  unsigned char *mbs;
+  /* Store the case sensitive multibyte string.  In case of
+     "case insensitive mode", the original string are stored,
+     otherwise MBS_CASE points the same address that MBS points.  */
+  unsigned char *mbs_case;
+#ifdef RE_ENABLE_I18N
+  /* Store the wide character string which is corresponding to MBS.  */
+  wint_t *wcs;
+  mbstate_t cur_state;
+#endif
+  /* Index in RAW_MBS.  Each character mbs[i] corresponds to
+     raw_mbs[raw_mbs_idx + i].  */
+  int raw_mbs_idx;
+  /* The length of the valid characters in the buffers.  */
+  int valid_len;
+  /* The length of the buffers MBS, MBS_CASE, and WCS.  */
+  int bufs_len;
+  /* The index in MBS, which is updated by re_string_fetch_byte.  */
+  int cur_idx;
+  /* This is length_of_RAW_MBS - RAW_MBS_IDX.  */
+  int len;
+  /* End of the buffer may be shorter than its length in the cases such
+     as re_match_2, re_search_2.  Then, we use STOP for end of the buffer
+     instead of LEN.  */
+  int stop;
+
+  /* The context of mbs[0].  We store the context independently, since
+     the context of mbs[0] may be different from raw_mbs[0], which is
+     the beginning of the input string.  */
+  unsigned int tip_context;
+  /* The translation passed as a part of an argument of re_compile_pattern.  */
+  RE_TRANSLATE_TYPE trans;
+  /* 1 if REG_ICASE.  */
+  unsigned int icase : 1;
+};
+typedef struct re_string_t re_string_t;
+/* In case of REG_ICASE, we allocate the buffer dynamically for mbs.  */
+#define MBS_ALLOCATED(pstr) (pstr->icase)
+/* In case that we need translation, we allocate the buffer dynamically
+   for mbs_case.  Note that mbs == mbs_case if not REG_ICASE.  */
+#define MBS_CASE_ALLOCATED(pstr) (pstr->trans != NULL)
+
+
+static reg_errcode_t re_string_allocate (re_string_t *pstr, const char *str,
+                                         int len, int init_len,
+                                         RE_TRANSLATE_TYPE trans, int icase);
+static reg_errcode_t re_string_construct (re_string_t *pstr, const char *str,
+                                          int len, RE_TRANSLATE_TYPE trans,
+                                          int icase);
+static reg_errcode_t re_string_reconstruct (re_string_t *pstr, int idx,
+                                            int eflags, int newline);
+static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
+                                                int new_buf_len);
+#ifdef RE_ENABLE_I18N
+static void build_wcs_buffer (re_string_t *pstr);
+static void build_wcs_upper_buffer (re_string_t *pstr);
+#endif /* RE_ENABLE_I18N */
+static void build_upper_buffer (re_string_t *pstr);
+static void re_string_translate_buffer (re_string_t *pstr);
+static void re_string_destruct (re_string_t *pstr);
+#ifdef RE_ENABLE_I18N
+static int re_string_elem_size_at (const re_string_t *pstr, int idx);
+static inline int re_string_char_size_at (const re_string_t *pstr, int idx);
+static inline wint_t re_string_wchar_at (const re_string_t *pstr, int idx);
+#endif /* RE_ENABLE_I18N */
+static unsigned int re_string_context_at (const re_string_t *input, int idx,
+                                         int eflags, int newline_anchor);
+#define re_string_peek_byte(pstr, offset) \
+  ((pstr)->mbs[(pstr)->cur_idx + offset])
+#define re_string_peek_byte_case(pstr, offset) \
+  ((pstr)->mbs_case[(pstr)->cur_idx + offset])
+#define re_string_fetch_byte(pstr) \
+  ((pstr)->mbs[(pstr)->cur_idx++])
+#define re_string_fetch_byte_case(pstr) \
+  ((pstr)->mbs_case[(pstr)->cur_idx++])
+#define re_string_first_byte(pstr, idx) \
+  ((idx) == (pstr)->len || (pstr)->wcs[idx] != WEOF)
+#define re_string_is_single_byte_char(pstr, idx) \
+  ((pstr)->wcs[idx] != WEOF && ((pstr)->len == (idx) \
+                                || (pstr)->wcs[(idx) + 1] != WEOF))
+#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
+#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
+#define re_string_get_buffer(pstr) ((pstr)->mbs)
+#define re_string_length(pstr) ((pstr)->len)
+#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
+#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
+#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
+
+#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
+#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
+#define re_free(p) free (p)
+
+struct bin_tree_t
+{
+  struct bin_tree_t *parent;
+  struct bin_tree_t *left;
+  struct bin_tree_t *right;
+
+  /* `node_idx' is the index in dfa->nodes, if `type' == 0.
+     Otherwise `type' indicate the type of this node.  */
+  re_token_type_t type;
+  int node_idx;
+
+  int first;
+  int next;
+  re_node_set eclosure;
+};
+typedef struct bin_tree_t bin_tree_t;
+
+
+#define CONTEXT_WORD 1
+#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
+#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
+#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
+
+#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
+#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
+#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
+#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
+#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
+
+#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
+#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
+
+#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
+ ((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+  || ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+  || ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
+  || ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
+
+#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
+ ((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
+  || (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
+  || (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
+  || (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
+
+struct re_dfastate_t
+{
+  unsigned int hash;
+  re_node_set nodes;
+  re_node_set *entrance_nodes;
+  struct re_dfastate_t **trtable;
+  struct re_dfastate_t **trtable_search;
+  /* If this state is a special state.
+     A state is a special state if the state is the halt state, or
+     a anchor.  */
+  unsigned int context : 2;
+  unsigned int halt : 1;
+  /* If this state can accept `multi byte'.
+     Note that we refer to multibyte characters, and multi character
+     collating elements as `multi byte'.  */
+  unsigned int accept_mb : 1;
+  /* If this state has backreference node(s).  */
+  unsigned int has_backref : 1;
+  unsigned int has_constraint : 1;
+};
+typedef struct re_dfastate_t re_dfastate_t;
+
+typedef struct
+{
+  /* start <= node < end  */
+  int start;
+  int end;
+} re_subexp_t;
+
+struct re_state_table_entry
+{
+  int num;
+  int alloc;
+  re_dfastate_t **array;
+};
+
+struct re_backref_cache_entry
+{
+  int node;
+  int str_idx;
+  int subexp_from;
+  int subexp_to;
+  int flag;
+};
+
+typedef struct
+{
+  /* EFLAGS of the argument of regexec.  */
+  int eflags;
+  /* Where the matching ends.  */
+  int match_last;
+  int last_node;
+  /* The string object corresponding to the input string.  */
+  re_string_t *input;
+  /* The state log used by the matcher.  */
+  re_dfastate_t **state_log;
+  int state_log_top;
+  /* Back reference cache.  */
+  int nbkref_ents;
+  int abkref_ents;
+  struct re_backref_cache_entry *bkref_ents;
+  int max_mb_elem_len;
+} re_match_context_t;
+
+typedef struct
+{
+  int cur_bkref;
+  int cls_subexp_idx;
+
+  re_dfastate_t **sifted_states;
+  re_dfastate_t **limited_states;
+
+  re_node_set limits;
+
+  int last_node;
+  int last_str_idx;
+  int check_subexp;
+} re_sift_context_t;
+
+struct re_fail_stack_ent_t
+{
+  int idx;
+  int node;
+  regmatch_t *regs;
+  re_node_set eps_via_nodes;
+};
+
+struct re_fail_stack_t
+{
+  int num;
+  int alloc;
+  struct re_fail_stack_ent_t *stack;
+};
+
+struct re_dfa_t
+{
+  re_bitset_ptr_t word_char;
+
+  /* number of subexpressions `re_nsub' is in regex_t.  */
+  int subexps_alloc;
+  re_subexp_t *subexps;
+
+  re_token_t *nodes;
+  int nodes_alloc;
+  int nodes_len;
+  bin_tree_t *str_tree;
+  int *firsts;
+  int *nexts;
+  re_node_set *edests;
+  re_node_set *eclosures;
+  re_node_set *inveclosures;
+  struct re_state_table_entry *state_table;
+  unsigned int state_hash_mask;
+  re_dfastate_t *init_state;
+  re_dfastate_t *init_state_word;
+  re_dfastate_t *init_state_nl;
+  re_dfastate_t *init_state_begbuf;
+  int states_alloc;
+  int init_node;
+  int nbackref; /* The number of backreference in this dfa.  */
+  /* If this dfa has "multibyte node", which is a backreference or
+     a node which can accept multibyte character or multi character
+     collating element.  */
+#ifdef DEBUG
+  char* re_str;
+#endif
+  unsigned int has_plural_match : 1;
+  unsigned int has_mb_node : 1;
+};
+typedef struct re_dfa_t re_dfa_t;
+
+static reg_errcode_t re_node_set_alloc (re_node_set *set, int size);
+static reg_errcode_t re_node_set_init_1 (re_node_set *set, int elem);
+static reg_errcode_t re_node_set_init_2 (re_node_set *set, int elem1,
+                                         int elem2);
+#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
+static reg_errcode_t re_node_set_init_copy (re_node_set *dest,
+                                            const re_node_set *src);
+static reg_errcode_t re_node_set_add_intersect (re_node_set *dest,
+                                                const re_node_set *src1,
+                                                const re_node_set *src2);
+static reg_errcode_t re_node_set_init_union (re_node_set *dest,
+                                             const re_node_set *src1,
+                                             const re_node_set *src2);
+static reg_errcode_t re_node_set_merge (re_node_set *dest,
+                                        const re_node_set *src);
+static int re_node_set_insert (re_node_set *set, int elem);
+static int re_node_set_compare (const re_node_set *set1,
+                                const re_node_set *set2);
+static int re_node_set_contains (const re_node_set *set, int elem);
+static void re_node_set_remove_at (re_node_set *set, int idx);
+#define re_node_set_empty(p) ((p)->nelem = 0)
+#define re_node_set_free(set) re_free ((set)->elems)
+static int re_dfa_add_node (re_dfa_t *dfa, re_token_t token, int mode);
+static re_dfastate_t *re_acquire_state (reg_errcode_t *err, re_dfa_t *dfa,
+                                        const re_node_set *nodes);
+static re_dfastate_t *re_acquire_state_context (reg_errcode_t *err,
+                                                re_dfa_t *dfa,
+                                                const re_node_set *nodes,
+                                                unsigned int context);
+\f
+
+typedef enum
+{
+  SB_CHAR,
+  MB_CHAR,
+  EQUIV_CLASS,
+  COLL_SYM,
+  CHAR_CLASS
+} bracket_elem_type;
+
+typedef struct
+{
+  bracket_elem_type type;
+  union
+  {
+    unsigned char ch;
+    unsigned char *name;
+    wchar_t wch;
+  } opr;
+} bracket_elem_t;
+
+
+/* Inline functions for bitset operation.  */
+static inline void
+bitset_not (set)
+     bitset set;
+{
+  int bitset_i;
+  for (bitset_i = 0; bitset_i < BITSET_UINTS; ++bitset_i)
+    set[bitset_i] = ~set[bitset_i];
+}
+
+static inline void
+bitset_merge (dest, src)
+     bitset dest;
+     const bitset src;
+{
+  int bitset_i;
+  for (bitset_i = 0; bitset_i < BITSET_UINTS; ++bitset_i)
+    dest[bitset_i] |= src[bitset_i];
+}
+
+#if 0 /* gnupg */
+static inline void
+bitset_not_merge (dest, src)
+     bitset dest;
+     const bitset src;
+{
+  int i;
+  for (i = 0; i < BITSET_UINTS; ++i)
+    dest[i] |= ~src[i];
+}
+#endif
+
+#ifdef RE_ENABLE_I18N
+/* Inline functions for re_string.  */
+static inline int
+re_string_char_size_at (pstr, idx)
+     const re_string_t *pstr;
+     int idx;
+{
+  int byte_idx;
+  if (MB_CUR_MAX == 1)
+    return 1;
+  for (byte_idx = 1; idx + byte_idx < pstr->len; ++byte_idx)
+    if (pstr->wcs[idx + byte_idx] != WEOF)
+      break;
+  return byte_idx;
+}
+
+static inline wint_t
+re_string_wchar_at (pstr, idx)
+     const re_string_t *pstr;
+     int idx;
+{
+  if (MB_CUR_MAX == 1)
+    return (wint_t) pstr->mbs[idx];
+  return (wint_t) pstr->wcs[idx];
+}
+
+static int
+re_string_elem_size_at (pstr, idx)
+     const re_string_t *pstr;
+     int idx;
+{
+#ifdef _LIBC
+  const unsigned char *p, *extra;
+  const int32_t *table, *indirect;
+  int32_t tmp;
+# include <locale/weight.h>
+  uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+
+  if (nrules != 0)
+    {
+      table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+      extra = (const unsigned char *)
+        _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+      indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
+                                               _NL_COLLATE_INDIRECTMB);
+      p = pstr->mbs + idx;
+      tmp = findidx (&p);
+      return p - pstr->mbs - idx;
+    }
+  else
+#endif /* _LIBC */
+    return 1;
+}
+#endif /* RE_ENABLE_I18N */
+
+#endif /*  _REGEX_INTERNAL_H */
diff --git a/util/regexec.c b/util/regexec.c
new file mode 100644 (file)
index 0000000..40d3058
--- /dev/null
@@ -0,0 +1,3225 @@
+/* Extended regular expression matching and search library.
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02110-1301 USA.  */
+
+#include <assert.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined HAVE_WCHAR_H || defined _LIBC
+# include <wchar.h>
+#endif /* HAVE_WCHAR_H || _LIBC */
+#if defined HAVE_WCTYPE_H || defined _LIBC
+# include <wctype.h>
+#endif /* HAVE_WCTYPE_H || _LIBC */
+
+#ifdef _LIBC
+# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
+#  define _RE_DEFINE_LOCALE_FUNCTIONS 1
+#  include <locale/localeinfo.h>
+#  include <locale/elem-hash.h>
+#  include <locale/coll-lookup.h>
+# endif
+#endif
+
+#include "_regex.h" /* gnupg */
+#include "regex_internal.h"
+
+static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
+                                    re_string_t *input, int n);
+static void match_ctx_free (re_match_context_t *cache);
+static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, int node,
+                                          int str_idx, int from, int to);
+static void match_ctx_clear_flag (re_match_context_t *mctx);
+static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
+                           re_dfastate_t **limited_sts, int last_node,
+                           int last_str_idx, int check_subexp);
+static reg_errcode_t re_search_internal (const regex_t *preg,
+                                         const char *string, int length,
+                                         int start, int range, int stop,
+                                         size_t nmatch, regmatch_t pmatch[],
+                                         int eflags);
+static int re_search_2_stub (struct re_pattern_buffer *bufp,
+                             const char *string1, int length1,
+                             const char *string2, int length2,
+                             int start, int range, struct re_registers *regs,
+                             int stop, int ret_len);
+static int re_search_stub (struct re_pattern_buffer *bufp,
+                           const char *string, int length, int start,
+                           int range, int stop, struct re_registers *regs,
+                           int ret_len);
+static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
+                              int nregs, int regs_allocated);
+static inline re_dfastate_t *acquire_init_state_context (reg_errcode_t *err,
+                                                         const regex_t *preg,
+                                                         const re_match_context_t *mctx,
+                                                         int idx);
+static int check_matching (const regex_t *preg, re_match_context_t *mctx,
+                           int fl_search, int fl_longest_match);
+static int check_halt_node_context (const re_dfa_t *dfa, int node,
+                                    unsigned int context);
+static int check_halt_state_context (const regex_t *preg,
+                                     const re_dfastate_t *state,
+                                     const re_match_context_t *mctx, int idx);
+static void update_regs (re_dfa_t *dfa, regmatch_t *pmatch, int cur_node,
+                         int cur_idx, int nmatch);
+static int proceed_next_node (const regex_t *preg, int nregs, regmatch_t *regs,
+                              const re_match_context_t *mctx,
+                              int *pidx, int node, re_node_set *eps_via_nodes,
+                              struct re_fail_stack_t *fs);
+static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs, 
+                                      int str_idx, int *dests, int nregs,
+                                      regmatch_t *regs,
+                                      re_node_set *eps_via_nodes);
+static int pop_fail_stack (struct re_fail_stack_t *fs, int *pidx, int nregs,
+                           regmatch_t *regs, re_node_set *eps_via_nodes);
+static reg_errcode_t set_regs (const regex_t *preg,
+                               const re_match_context_t *mctx,
+                               size_t nmatch, regmatch_t *pmatch,
+                               int fl_backtrack);
+#ifdef RE_ENABLE_I18N
+static int sift_states_iter_mb (const regex_t *preg,
+                                const re_match_context_t *mctx,
+                                re_sift_context_t *sctx,
+                                int node_idx, int str_idx, int max_str_idx);
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t sift_states_backward (const regex_t *preg,
+                                           re_match_context_t *mctx,
+                                           re_sift_context_t *sctx);
+static reg_errcode_t update_cur_sifted_state (const regex_t *preg,
+                                              re_match_context_t *mctx,
+                                              re_sift_context_t *sctx,
+                                              int str_idx,
+                                              re_node_set *dest_nodes);
+static reg_errcode_t add_epsilon_src_nodes (re_dfa_t *dfa,
+                                            re_node_set *dest_nodes,
+                                            const re_node_set *candidates);
+static reg_errcode_t sub_epsilon_src_nodes (re_dfa_t *dfa, int node,
+                                            re_node_set *dest_nodes,
+                                            const re_node_set *and_nodes);
+static int check_dst_limits (re_dfa_t *dfa, re_node_set *limits,
+                             re_match_context_t *mctx, int dst_node,
+                             int dst_idx, int src_node, int src_idx);
+static int check_dst_limits_calc_pos (re_dfa_t *dfa, re_match_context_t *mctx,
+                                      int limit, re_node_set *eclosures,
+                                      int subexp_idx, int node, int str_idx);
+static reg_errcode_t check_subexp_limits (re_dfa_t *dfa,
+                                          re_node_set *dest_nodes,
+                                          const re_node_set *candidates,
+                                          re_node_set *limits,
+                                          struct re_backref_cache_entry *bkref_ents,
+                                          int str_idx);
+static reg_errcode_t search_subexp (const regex_t *preg,
+                                    re_match_context_t *mctx,
+                                    re_sift_context_t *sctx, int str_idx,
+                                    re_node_set *dest_nodes);
+static reg_errcode_t sift_states_bkref (const regex_t *preg,
+                                        re_match_context_t *mctx,
+                                        re_sift_context_t *sctx,
+                                        int str_idx, re_node_set *dest_nodes);
+static reg_errcode_t clean_state_log_if_need (re_match_context_t *mctx,
+                                              int next_state_log_idx);
+static reg_errcode_t merge_state_array (re_dfa_t *dfa, re_dfastate_t **dst,
+                                        re_dfastate_t **src, int num);
+static re_dfastate_t *transit_state (reg_errcode_t *err, const regex_t *preg,
+                                     re_match_context_t *mctx,
+                                     re_dfastate_t *state, int fl_search);
+static re_dfastate_t *transit_state_sb (reg_errcode_t *err, const regex_t *preg,
+                                        re_dfastate_t *pstate,
+                                        int fl_search,
+                                        re_match_context_t *mctx);
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t transit_state_mb (const regex_t *preg,
+                                       re_dfastate_t *pstate,
+                                       re_match_context_t *mctx);
+#endif /* RE_ENABLE_I18N */
+static reg_errcode_t transit_state_bkref (const regex_t *preg,
+                                          re_dfastate_t *pstate,
+                                          re_match_context_t *mctx);
+static reg_errcode_t transit_state_bkref_loop (const regex_t *preg,
+                                               re_node_set *nodes,
+                                               re_dfastate_t **work_state_log,
+                                               re_match_context_t *mctx);
+static re_dfastate_t **build_trtable (const regex_t *dfa,
+                                      const re_dfastate_t *state,
+                                      int fl_search);
+#ifdef RE_ENABLE_I18N
+static int check_node_accept_bytes (const regex_t *preg, int node_idx,
+                                    const re_string_t *input, int idx);
+# ifdef _LIBC
+static unsigned int find_collation_sequence_value (const unsigned char *mbs,
+                                                   size_t name_len);
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+static int group_nodes_into_DFAstates (const regex_t *dfa,
+                                       const re_dfastate_t *state,
+                                       re_node_set *states_node,
+                                       bitset *states_ch);
+static int check_node_accept (const regex_t *preg, const re_token_t *node,
+                              const re_match_context_t *mctx, int idx);
+static reg_errcode_t extend_buffers (re_match_context_t *mctx);
+\f
+/* Entry point for POSIX code.  */
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+
+   EFLAGS specifies `execution flags' which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+    const regex_t *__restrict preg;
+    const char *__restrict string;
+    size_t nmatch;
+    regmatch_t pmatch[];
+    int eflags;
+{
+  reg_errcode_t err;
+  int length = strlen (string);
+  if (preg->no_sub)
+    err = re_search_internal (preg, string, length, 0, length, length, 0,
+                              NULL, eflags);
+  else
+    err = re_search_internal (preg, string, length, 0, length, length, nmatch,
+                              pmatch, eflags);
+  return err != REG_NOERROR;
+}
+#ifdef _LIBC
+weak_alias (__regexec, regexec)
+#endif
+
+/* Entry points for GNU code.  */
+
+/* re_match, re_search, re_match_2, re_search_2
+
+   The former two functions operate on STRING with length LENGTH,
+   while the later two operate on concatenation of STRING1 and STRING2
+   with lengths LENGTH1 and LENGTH2, respectively.
+
+   re_match() matches the compiled pattern in BUFP against the string,
+   starting at index START.
+
+   re_search() first tries matching at index START, then it tries to match
+   starting from index START + 1, and so on.  The last start position tried
+   is START + RANGE.  (Thus RANGE = 0 forces re_search to operate the same
+   way as re_match().)
+
+   The parameter STOP of re_{match,search}_2 specifies that no match exceeding
+   the first STOP characters of the concatenation of the strings should be
+   concerned.
+
+   If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
+   and all groups is stroed in REGS.  (For the "_2" variants, the offsets are
+   computed relative to the concatenation, not relative to the individual
+   strings.)
+
+   On success, re_match* functions return the length of the match, re_search*
+   return the position of the start of the match.  Return value -1 means no
+   match was found and -2 indicates an internal error.  */
+
+int
+re_match (bufp, string, length, start, regs)
+    struct re_pattern_buffer *bufp;
+    const char *string;
+    int length, start;
+    struct re_registers *regs;
+{
+  return re_search_stub (bufp, string, length, start, 0, length, regs, 1);
+}
+#ifdef _LIBC
+weak_alias (__re_match, re_match)
+#endif
+
+int
+re_search (bufp, string, length, start, range, regs)
+    struct re_pattern_buffer *bufp;
+    const char *string;
+    int length, start, range;
+    struct re_registers *regs;
+{
+  return re_search_stub (bufp, string, length, start, range, length, regs, 0);
+}
+#ifdef _LIBC
+weak_alias (__re_search, re_search)
+#endif
+
+int
+re_match_2 (bufp, string1, length1, string2, length2, start, regs, stop)
+    struct re_pattern_buffer *bufp;
+    const char *string1, *string2;
+    int length1, length2, start, stop;
+    struct re_registers *regs;
+{
+  return re_search_2_stub (bufp, string1, length1, string2, length2,
+                           start, 0, regs, stop, 1);
+}
+#ifdef _LIBC
+weak_alias (__re_match_2, re_match_2)
+#endif
+
+int
+re_search_2 (bufp, string1, length1, string2, length2, start, range, regs, stop)
+    struct re_pattern_buffer *bufp;
+    const char *string1, *string2;
+    int length1, length2, start, range, stop;
+    struct re_registers *regs;
+{
+  return re_search_2_stub (bufp, string1, length1, string2, length2,
+                           start, range, regs, stop, 0);
+}
+#ifdef _LIBC
+weak_alias (__re_search_2, re_search_2)
+#endif
+
+static int
+re_search_2_stub (bufp, string1, length1, string2, length2, start, range, regs,
+                  stop, ret_len)
+    struct re_pattern_buffer *bufp;
+    const char *string1, *string2;
+    int length1, length2, start, range, stop, ret_len;
+    struct re_registers *regs;
+{
+  const char *str;
+  int rval;
+  int len = length1 + length2;
+  int free_str = 0;
+
+  if (BE (length1 < 0 || length2 < 0 || stop < 0, 0))
+    return -2;
+
+  /* Concatenate the strings.  */
+  if (length2 > 0)
+    if (length1 > 0)
+      {
+        char *s = re_malloc (char, len);
+
+        if (BE (s == NULL, 0))
+          return -2;
+        memcpy (s, string1, length1);
+        memcpy (s + length1, string2, length2);
+        str = s;
+        free_str = 1;
+      }
+    else
+      str = string2;
+  else
+    str = string1;
+
+  rval = re_search_stub (bufp, str, len, start, range, stop, regs,
+                         ret_len);
+  if (free_str)
+      re_free ((char *) str);
+  return rval;
+}
+
+/* The parameters have the same meaning as those of re_search.
+   Additional parameters:
+   If RET_LEN is nonzero the length of the match is returned (re_match style);
+   otherwise the position of the match is returned.  */
+
+static int
+re_search_stub (bufp, string, length, start, range, stop, regs, ret_len)
+    struct re_pattern_buffer *bufp;
+    const char *string;
+    int length, start, range, stop, ret_len;
+    struct re_registers *regs;
+{
+  reg_errcode_t result;
+  regmatch_t *pmatch;
+  int nregs, rval;
+  int eflags = 0;
+
+  /* Check for out-of-range.  */
+  if (BE (start < 0 || start > length, 0))
+    return -1;
+  if (BE (start + range > length, 0))
+    range = length - start;
+  else if (BE (start + range < 0, 0))
+    range = -start;
+
+  eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
+  eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
+
+  /* Compile fastmap if we haven't yet.  */
+  if (range > 0 && bufp->fastmap != NULL && !bufp->fastmap_accurate)
+    re_compile_fastmap (bufp);
+
+  if (BE (bufp->no_sub, 0))
+    regs = NULL;
+
+  /* We need at least 1 register.  */
+  if (regs == NULL)
+    nregs = 1;
+  else if (BE (bufp->regs_allocated == REGS_FIXED &&
+               regs->num_regs < bufp->re_nsub + 1, 0))
+    {
+      nregs = regs->num_regs;
+      if (BE (nregs < 1, 0))
+        {
+          /* Nothing can be copied to regs.  */
+          regs = NULL;
+          nregs = 1;
+        }
+    }
+  else
+    nregs = bufp->re_nsub + 1;
+  pmatch = re_malloc (regmatch_t, nregs);
+  if (BE (pmatch == NULL, 0))
+    return -2;
+
+  result = re_search_internal (bufp, string, length, start, range, stop,
+                               nregs, pmatch, eflags);
+
+  rval = 0;
+
+  /* I hope we needn't fill ther regs with -1's when no match was found.  */
+  if (result != REG_NOERROR)
+    rval = -1;
+  else if (regs != NULL)
+    {
+      /* If caller wants register contents data back, copy them.  */
+      bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
+                                           bufp->regs_allocated);
+      if (BE (bufp->regs_allocated == REGS_UNALLOCATED, 0))
+        rval = -2;
+    }
+
+  if (BE (rval == 0, 1))
+    {
+      if (ret_len)
+        {
+          assert (pmatch[0].rm_so == start);
+          rval = pmatch[0].rm_eo - start;
+        }
+      else
+        rval = pmatch[0].rm_so;
+    }
+  re_free (pmatch);
+  return rval;
+}
+
+static unsigned
+re_copy_regs (regs, pmatch, nregs, regs_allocated)
+    struct re_registers *regs;
+    regmatch_t *pmatch;
+    int nregs, regs_allocated;
+{
+  int rval = REGS_REALLOCATE;
+  int i;
+  int need_regs = nregs + 1;
+  /* We need one extra element beyond `num_regs' for the `-1' marker GNU code
+     uses.  */
+
+  /* Have the register data arrays been allocated?  */
+  if (regs_allocated == REGS_UNALLOCATED)
+    { /* No.  So allocate them with malloc.  */
+      regs->start = re_malloc (regoff_t, need_regs);
+      if (BE (regs->start == NULL, 0))
+        return REGS_UNALLOCATED;
+      regs->end = re_malloc (regoff_t, need_regs);
+      if (BE (regs->end == NULL, 0))
+        {
+          re_free (regs->start);
+          return REGS_UNALLOCATED;
+        }
+      regs->num_regs = need_regs;
+    }
+  else if (regs_allocated == REGS_REALLOCATE)
+    { /* Yes.  If we need more elements than were already
+         allocated, reallocate them.  If we need fewer, just
+         leave it alone.  */
+      if (need_regs > regs->num_regs)
+        {
+          regs->start = re_realloc (regs->start, regoff_t, need_regs);
+          if (BE (regs->start == NULL, 0))
+            {
+              if (regs->end != NULL)
+                re_free (regs->end);
+              return REGS_UNALLOCATED;
+            }
+          regs->end = re_realloc (regs->end, regoff_t, need_regs);
+          if (BE (regs->end == NULL, 0))
+            {
+              re_free (regs->start);
+              return REGS_UNALLOCATED;
+            }
+          regs->num_regs = need_regs;
+        }
+    }
+  else
+    {
+      assert (regs_allocated == REGS_FIXED);
+      /* This function may not be called with REGS_FIXED and nregs too big.  */
+      assert (regs->num_regs >= nregs);
+      rval = REGS_FIXED;
+    }
+
+  /* Copy the regs.  */
+  for (i = 0; i < nregs; ++i)
+    {
+      regs->start[i] = pmatch[i].rm_so;
+      regs->end[i] = pmatch[i].rm_eo;
+    }
+  for ( ; i < regs->num_regs; ++i)
+    regs->start[i] = regs->end[i] = -1;
+
+  return rval;
+}
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+    struct re_pattern_buffer *bufp;
+    struct re_registers *regs;
+    unsigned num_regs;
+    regoff_t *starts, *ends;
+{
+  if (num_regs)
+    {
+      bufp->regs_allocated = REGS_REALLOCATE;
+      regs->num_regs = num_regs;
+      regs->start = starts;
+      regs->end = ends;
+    }
+  else
+    {
+      bufp->regs_allocated = REGS_UNALLOCATED;
+      regs->num_regs = 0;
+      regs->start = regs->end = (regoff_t *) 0;
+    }
+}
+#ifdef _LIBC
+weak_alias (__re_set_registers, re_set_registers)
+#endif
+\f
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them unless specifically requested.  */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+int
+# ifdef _LIBC
+weak_function
+# endif
+re_exec (s)
+     const char *s;
+{
+  return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
+}
+#endif /* _REGEX_RE_COMP */
+\f
+static re_node_set empty_set;
+
+/* Internal entry point.  */
+
+/* Searches for a compiled pattern PREG in the string STRING, whose
+   length is LENGTH.  NMATCH, PMATCH, and EFLAGS have the same
+   mingings with regexec.  START, and RANGE have the same meanings
+   with re_search.
+   Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
+   otherwise return the error code.
+   Note: We assume front end functions already check ranges.
+   (START + RANGE >= 0 && START + RANGE <= LENGTH)  */
+
+static reg_errcode_t
+re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
+                    eflags)
+    const regex_t *preg;
+    const char *string;
+    int length, start, range, stop, eflags;
+    size_t nmatch;
+    regmatch_t pmatch[];
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  re_string_t input;
+  int left_lim, right_lim, incr;
+  int fl_longest_match, match_first, match_last = -1;
+  re_match_context_t mctx;
+  char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate)
+                   ? preg->fastmap : NULL);
+
+  /* Check if the DFA haven't been compiled.  */
+  if (BE (preg->used == 0 || dfa->init_state == NULL
+          || dfa->init_state_word == NULL || dfa->init_state_nl == NULL
+          || dfa->init_state_begbuf == NULL, 0))
+    return REG_NOMATCH;
+
+  re_node_set_init_empty (&empty_set);
+
+  /* We must check the longest matching, if nmatch > 0.  */
+  fl_longest_match = (nmatch != 0);
+
+  err = re_string_allocate (&input, string, length, dfa->nodes_len + 1,
+                            preg->translate, preg->syntax & RE_ICASE);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+  input.stop = stop;
+
+  err = match_ctx_init (&mctx, eflags, &input, dfa->nbackref * 2);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+
+  /* We will log all the DFA states through which the dfa pass,
+     if nmatch > 1, or this dfa has "multibyte node", which is a
+     back-reference or a node which can accept multibyte character or
+     multi character collating element.  */
+  if (nmatch > 1 || dfa->has_mb_node)
+    {
+      mctx.state_log = re_malloc (re_dfastate_t *, dfa->nodes_len + 1);
+      if (BE (mctx.state_log == NULL, 0))
+        return REG_ESPACE;
+    }
+  else
+    mctx.state_log = NULL;
+
+#ifdef DEBUG
+  /* We assume front-end functions already check them.  */
+  assert (start + range >= 0 && start + range <= length);
+#endif
+
+  match_first = start;
+  input.tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
+                       : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
+
+  /* Check incrementally whether of not the input string match.  */
+  incr = (range < 0) ? -1 : 1;
+  left_lim = (range < 0) ? start + range : start;
+  right_lim = (range < 0) ? start : start + range;
+
+  for (;;)
+    {
+      /* At first get the current byte from input string.  */
+      int ch;
+      if (MB_CUR_MAX > 1 && (preg->syntax & RE_ICASE || preg->translate))
+        {
+          /* In this case, we can't determin easily the current byte,
+             since it might be a component byte of a multibyte character.
+             Then we use the constructed buffer instead.  */
+          /* If MATCH_FIRST is out of the valid range, reconstruct the
+             buffers.  */
+          if (input.raw_mbs_idx + input.valid_len <= match_first)
+            re_string_reconstruct (&input, match_first, eflags,
+                                   preg->newline_anchor);
+          /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
+             Note that MATCH_FIRST must not be smaller than 0.  */
+          ch = ((match_first >= length) ? 0
+                : re_string_byte_at (&input, match_first - input.raw_mbs_idx));
+        }
+      else
+        {
+          /* We apply translate/conversion manually, since it is trivial
+             in this case.  */
+          /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
+             Note that MATCH_FIRST must not be smaller than 0.  */
+          ch = (match_first < length) ? (unsigned char)string[match_first] : 0;
+          /* Apply translation if we need.  */
+          ch = preg->translate ? preg->translate[ch] : ch;
+          /* In case of case insensitive mode, convert to upper case.  */
+          ch = ((preg->syntax & RE_ICASE) && islower (ch)) ? toupper (ch) : ch;
+        }
+
+      /* Eliminate inappropriate one by fastmap.  */
+      if (preg->can_be_null || fastmap == NULL || fastmap[ch])
+        {
+          /* Reconstruct the buffers so that the matcher can assume that
+             the matching starts from the begining of the buffer.  */
+          re_string_reconstruct (&input, match_first, eflags,
+                                 preg->newline_anchor);
+#ifdef RE_ENABLE_I18N
+          /* Eliminate it when it is a component of a multibyte character
+             and isn't the head of a multibyte character.  */
+          if (MB_CUR_MAX == 1 || re_string_first_byte (&input, 0))
+#endif
+            {
+              /* It seems to be appropriate one, then use the matcher.  */
+              /* We assume that the matching starts from 0.  */
+              mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
+              match_last = check_matching (preg, &mctx, 0, fl_longest_match);
+              if (match_last != -1)
+                {
+                  if (BE (match_last == -2, 0))
+                    return REG_ESPACE;
+                  else
+                    break; /* We found a matching.  */
+                }
+            }
+        }
+      /* Update counter.  */
+      match_first += incr;
+      if (match_first < left_lim || right_lim < match_first)
+        break;
+    }
+
+  /* Set pmatch[] if we need.  */
+  if (match_last != -1 && nmatch > 0)
+    {
+      int reg_idx;
+
+      /* Initialize registers.  */
+      for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+        pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
+
+      /* Set the points where matching start/end.  */
+      pmatch[0].rm_so = 0;
+      mctx.match_last = pmatch[0].rm_eo = match_last;
+
+      if (!preg->no_sub && nmatch > 1)
+        {
+          /* We need the ranges of all the subexpressions.  */
+          int halt_node;
+          re_dfastate_t **sifted_states;
+          re_dfastate_t **lim_states = NULL;
+          re_dfastate_t *pstate = mctx.state_log[match_last];
+          re_sift_context_t sctx;
+#ifdef DEBUG
+          assert (mctx.state_log != NULL);
+#endif
+          halt_node = check_halt_state_context (preg, pstate, &mctx,
+                                                match_last);
+          if (dfa->has_plural_match)
+            {
+              match_ctx_clear_flag (&mctx);
+              sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
+              if (BE (sifted_states == NULL, 0))
+                return REG_ESPACE;
+              if (dfa->nbackref)
+                {
+                  lim_states = calloc (sizeof (re_dfastate_t *),
+                                       match_last + 1);
+                  if (BE (lim_states == NULL, 0))
+                    return REG_ESPACE;
+                }
+              sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
+                             mctx.match_last, 0);
+              err = sift_states_backward (preg, &mctx, &sctx);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+              if (lim_states != NULL)
+                {
+                  err = merge_state_array (dfa, sifted_states, lim_states,
+                                           match_last + 1);
+                  if (BE (err != REG_NOERROR, 0))
+                    return err;
+                  re_free (lim_states);
+                }
+              re_node_set_free (&sctx.limits);
+              re_free (mctx.state_log);
+              mctx.state_log = sifted_states;
+            }
+          mctx.last_node = halt_node;
+          err = set_regs (preg, &mctx, nmatch, pmatch,
+                          dfa->has_plural_match && dfa->nbackref > 0);
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+        }
+
+      /* At last, add the offset to the each registers, since we slided
+         the buffers so that We can assume that the matching starts from 0.  */
+      for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+        if (pmatch[reg_idx].rm_so != -1)
+          {
+            pmatch[reg_idx].rm_so += match_first;
+            pmatch[reg_idx].rm_eo += match_first;
+          }
+    }
+
+  re_free (mctx.state_log);
+  if (dfa->nbackref)
+    match_ctx_free (&mctx);
+  re_string_destruct (&input);
+
+  return (match_last == -1) ? REG_NOMATCH : REG_NOERROR;
+}
+
+/* Acquire an initial state and return it.
+   We must select appropriate initial state depending on the context,
+   since initial states may have constraints like "\<", "^", etc..  */
+
+static inline re_dfastate_t *
+acquire_init_state_context (err, preg, mctx, idx)
+     reg_errcode_t *err;
+     const regex_t *preg;
+     const re_match_context_t *mctx;
+     int idx;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+
+  *err = REG_NOERROR;
+  if (dfa->init_state->has_constraint)
+    {
+      unsigned int context;
+      context =  re_string_context_at (mctx->input, idx - 1, mctx->eflags,
+                                       preg->newline_anchor);
+      if (IS_WORD_CONTEXT (context))
+        return dfa->init_state_word;
+      else if (IS_ORDINARY_CONTEXT (context))
+        return dfa->init_state;
+      else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
+        return dfa->init_state_begbuf;
+      else if (IS_NEWLINE_CONTEXT (context))
+        return dfa->init_state_nl;
+      else if (IS_BEGBUF_CONTEXT (context))
+        {
+          /* It is relatively rare case, then calculate on demand.  */
+          return  re_acquire_state_context (err, dfa,
+                                            dfa->init_state->entrance_nodes,
+                                            context);
+        }
+      else
+        /* Must not happen?  */
+        return dfa->init_state;
+    }
+  else
+    return dfa->init_state;
+}
+
+/* Check whether the regular expression match input string INPUT or not,
+   and return the index where the matching end, return -1 if not match,
+   or return -2 in case of an error.
+   FL_SEARCH means we must search where the matching starts,
+   FL_LONGEST_MATCH means we want the POSIX longest matching.
+   Note that the matcher assume that the maching starts from the current
+   index of the buffer.  */
+
+static int
+check_matching (preg, mctx, fl_search, fl_longest_match)
+    const regex_t *preg;
+    re_match_context_t *mctx;
+    int fl_search, fl_longest_match;
+{
+  reg_errcode_t err;
+  int match = 0;
+  int match_last = -1;
+  int cur_str_idx = re_string_cur_idx (mctx->input);
+  re_dfastate_t *cur_state;
+
+  cur_state = acquire_init_state_context (&err, preg, mctx, cur_str_idx);
+  /* An initial state must not be NULL(invalid state).  */
+  if (BE (cur_state == NULL, 0))
+    return -2;
+  if (mctx->state_log != NULL)
+    mctx->state_log[cur_str_idx] = cur_state;
+
+  if (cur_state->has_backref)
+    {
+      int i;
+      re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+      for (i = 0; i < cur_state->nodes.nelem; ++i)
+        {
+          re_token_type_t type;
+          int node = cur_state->nodes.elems[i];
+          int entity = (dfa->nodes[node].type != OP_CONTEXT_NODE ? node
+                        : dfa->nodes[node].opr.ctx_info->entity);
+          type = dfa->nodes[entity].type;
+          if (type == OP_BACK_REF)
+            {
+              int clexp_idx;
+              for (clexp_idx = 0; clexp_idx < cur_state->nodes.nelem;
+                   ++clexp_idx)
+                {
+                  re_token_t *clexp_node;
+                  clexp_node = dfa->nodes + cur_state->nodes.elems[clexp_idx];
+                  if (clexp_node->type == OP_CLOSE_SUBEXP
+                      && clexp_node->opr.idx + 1== dfa->nodes[entity].opr.idx)
+                    {
+                      err = match_ctx_add_entry (mctx, node, 0, 0, 0);
+                      if (BE (err != REG_NOERROR, 0))
+                        return -2;
+                      break;
+                    }
+                }
+            }
+        }
+    }
+
+  /* If the RE accepts NULL string.  */
+  if (cur_state->halt)
+    {
+      if (!cur_state->has_constraint
+          || check_halt_state_context (preg, cur_state, mctx, cur_str_idx))
+        {
+          if (!fl_longest_match)
+            return cur_str_idx;
+          else
+            {
+              match_last = cur_str_idx;
+              match = 1;
+            }
+        }
+    }
+
+  while (!re_string_eoi (mctx->input))
+    {
+      cur_state = transit_state (&err, preg, mctx, cur_state,
+                                 fl_search && !match);
+      if (cur_state == NULL) /* Reached at the invalid state or an error.  */
+        {
+          cur_str_idx = re_string_cur_idx (mctx->input);
+          if (BE (err != REG_NOERROR, 0))
+            return -2;
+          if (fl_search && !match)
+            {
+              /* Restart from initial state, since we are searching
+                 the point from where matching start.  */
+#ifdef RE_ENABLE_I18N
+              if (MB_CUR_MAX == 1
+                  || re_string_first_byte (mctx->input, cur_str_idx))
+#endif /* RE_ENABLE_I18N */
+                cur_state = acquire_init_state_context (&err, preg, mctx,
+                                                        cur_str_idx);
+              if (BE (cur_state == NULL && err != REG_NOERROR, 0))
+                return -2;
+              if (mctx->state_log != NULL)
+                mctx->state_log[cur_str_idx] = cur_state;
+            }
+          else if (!fl_longest_match && match)
+            break;
+          else /* (fl_longest_match && match) || (!fl_search && !match)  */
+            {
+              if (mctx->state_log == NULL)
+                break;
+              else
+                {
+                  int max = mctx->state_log_top;
+                  for (; cur_str_idx <= max; ++cur_str_idx)
+                    if (mctx->state_log[cur_str_idx] != NULL)
+                      break;
+                  if (cur_str_idx > max)
+                    break;
+                }
+            }
+        }
+
+      if (cur_state != NULL && cur_state->halt)
+        {
+          /* Reached at a halt state.
+             Check the halt state can satisfy the current context.  */
+          if (!cur_state->has_constraint
+              || check_halt_state_context (preg, cur_state, mctx,
+                                           re_string_cur_idx (mctx->input)))
+            {
+              /* We found an appropriate halt state.  */
+              match_last = re_string_cur_idx (mctx->input);
+              match = 1;
+              if (!fl_longest_match)
+                break;
+            }
+        }
+   }
+  return match_last;
+}
+
+/* Check NODE match the current context.  */
+
+static int check_halt_node_context (dfa, node, context)
+    const re_dfa_t *dfa;
+    int node;
+    unsigned int context;
+{
+  int entity;
+  re_token_type_t type = dfa->nodes[node].type;
+  if (type == END_OF_RE)
+    return 1;
+  if (type != OP_CONTEXT_NODE)
+    return 0;
+  entity = dfa->nodes[node].opr.ctx_info->entity;
+  if (dfa->nodes[entity].type != END_OF_RE
+      || NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[node].constraint, context))
+    return 0;
+  return 1;
+}
+
+/* Check the halt state STATE match the current context.
+   Return 0 if not match, if the node, STATE has, is a halt node and
+   match the context, return the node.  */
+
+static int
+check_halt_state_context (preg, state, mctx, idx)
+    const regex_t *preg;
+    const re_dfastate_t *state;
+    const re_match_context_t *mctx;
+    int idx;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  int i;
+  unsigned int context;
+#ifdef DEBUG
+  assert (state->halt);
+#endif
+  context = re_string_context_at (mctx->input, idx, mctx->eflags,
+                                  preg->newline_anchor);
+  for (i = 0; i < state->nodes.nelem; ++i)
+    if (check_halt_node_context (dfa, state->nodes.elems[i], context))
+      return state->nodes.elems[i];
+  return 0;
+}
+
+/* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
+   corresponding to the DFA).
+   Return the destination node, and update EPS_VIA_NODES, return -1 in case
+   of errors.  */
+
+static int
+proceed_next_node (preg, nregs, regs, mctx, pidx, node, eps_via_nodes, fs)
+    const regex_t *preg;
+    regmatch_t *regs;
+    const re_match_context_t *mctx;
+    int nregs, *pidx, node;
+    re_node_set *eps_via_nodes;
+    struct re_fail_stack_t *fs;
+{
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  int i, err, dest_node, cur_entity;
+  dest_node = -1;
+  cur_entity = ((dfa->nodes[node].type == OP_CONTEXT_NODE)
+                ? dfa->nodes[node].opr.ctx_info->entity : node);
+  if (IS_EPSILON_NODE (dfa->nodes[node].type))
+    {
+      int ndest, dest_nodes[2], dest_entities[2];
+      err = re_node_set_insert (eps_via_nodes, node);
+      if (BE (err < 0, 0))
+        return -1;
+      /* Pick up valid destinations.  */
+      for (ndest = 0, i = 0; i < mctx->state_log[*pidx]->nodes.nelem; ++i)
+        {
+          int candidate = mctx->state_log[*pidx]->nodes.elems[i];
+          int entity;
+          entity = ((dfa->nodes[candidate].type == OP_CONTEXT_NODE)
+                    ? dfa->nodes[candidate].opr.ctx_info->entity : candidate);
+          if (!re_node_set_contains (dfa->edests + node, entity))
+            continue;
+          dest_nodes[0] = (ndest == 0) ? candidate : dest_nodes[0];
+          dest_entities[0] = (ndest == 0) ? entity : dest_entities[0];
+          dest_nodes[1] = (ndest == 1) ? candidate : dest_nodes[1];
+          dest_entities[1] = (ndest == 1) ? entity : dest_entities[1];
+          ++ndest;
+        }
+      if (ndest <= 1)
+        return ndest == 0 ? -1 : (ndest == 1 ? dest_nodes[0] : 0);
+      if (dest_entities[0] > dest_entities[1])
+        {
+          int swap_work = dest_nodes[0];
+          dest_nodes[0] = dest_nodes[1];
+          dest_nodes[1] = swap_work;
+        }
+      /* In order to avoid infinite loop like "(a*)*".  */
+      if (re_node_set_contains (eps_via_nodes, dest_nodes[0]))
+        return dest_nodes[1];
+      if (fs != NULL)
+        push_fail_stack (fs, *pidx, dest_nodes, nregs, regs, eps_via_nodes);
+      return dest_nodes[0];
+    }
+  else
+    {
+      int naccepted = 0, entity = node;
+      re_token_type_t type = dfa->nodes[node].type;
+      if (type == OP_CONTEXT_NODE)
+        {
+          entity = dfa->nodes[node].opr.ctx_info->entity;
+          type = dfa->nodes[entity].type;
+        }
+
+#ifdef RE_ENABLE_I18N
+      if (ACCEPT_MB_NODE (type))
+        naccepted = check_node_accept_bytes (preg, entity, mctx->input, *pidx);
+      else
+#endif /* RE_ENABLE_I18N */
+      if (type == OP_BACK_REF)
+        {
+          int subexp_idx = dfa->nodes[entity].opr.idx;
+          naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
+          if (fs != NULL)
+            {
+              if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1)
+                return -1;
+              else if (naccepted)
+                {
+                  char *buf = re_string_get_buffer (mctx->input);
+                  if (strncmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
+                               naccepted) != 0)
+                    return -1;
+                }
+            }
+
+          if (naccepted == 0)
+            {
+              err = re_node_set_insert (eps_via_nodes, node);
+              if (BE (err < 0, 0))
+                return -2;
+              dest_node = dfa->nexts[node];
+              if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+                                        dest_node))
+                return dest_node;
+              for (i = 0; i < mctx->state_log[*pidx]->nodes.nelem; ++i)
+                {
+                  dest_node = mctx->state_log[*pidx]->nodes.elems[i];
+                  if ((dfa->nodes[dest_node].type == OP_CONTEXT_NODE
+                       && (dfa->nexts[node]
+                           == dfa->nodes[dest_node].opr.ctx_info->entity)))
+                    return dest_node;
+                }
+            }
+        }
+
+      if (naccepted != 0
+          || check_node_accept (preg, dfa->nodes + node, mctx, *pidx))
+        {
+          dest_node = dfa->nexts[node];
+          *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
+          if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
+                     || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
+                                               dest_node)))
+            return -1;
+          re_node_set_empty (eps_via_nodes);
+          return dest_node;
+        }
+    }
+  return -1;
+}
+
+static reg_errcode_t
+push_fail_stack (fs, str_idx, dests, nregs, regs, eps_via_nodes)
+     struct re_fail_stack_t *fs;
+     int str_idx, *dests, nregs;
+     regmatch_t *regs;
+     re_node_set *eps_via_nodes;
+{
+  reg_errcode_t err;
+  int num = fs->num++;
+  if (fs->num == fs->alloc)
+    {
+      fs->alloc *= 2;
+      fs->stack = realloc (fs->stack, (sizeof (struct re_fail_stack_ent_t)
+                                       * fs->alloc));
+      if (fs->stack == NULL)
+        return REG_ESPACE;
+    }
+  fs->stack[num].idx = str_idx;
+  fs->stack[num].node = dests[1];
+  fs->stack[num].regs = re_malloc (regmatch_t, nregs);
+  memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
+  err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
+  return err;
+}
+static int
+pop_fail_stack (fs, pidx, nregs, regs, eps_via_nodes)
+     struct re_fail_stack_t *fs;
+     int *pidx, nregs;
+     regmatch_t *regs;
+     re_node_set *eps_via_nodes;
+{
+  int num = --fs->num;
+  assert (num >= 0);
+ *pidx = fs->stack[num].idx;
+  memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
+  re_node_set_free (eps_via_nodes);
+  *eps_via_nodes = fs->stack[num].eps_via_nodes;
+  return fs->stack[num].node;
+}
+
+/* Set the positions where the subexpressions are starts/ends to registers
+   PMATCH.
+   Note: We assume that pmatch[0] is already set, and
+   pmatch[i].rm_so == pmatch[i].rm_eo == -1 (i > 1).  */
+
+static reg_errcode_t
+set_regs (preg, mctx, nmatch, pmatch, fl_backtrack)
+     const regex_t *preg;
+     const re_match_context_t *mctx;
+     size_t nmatch;
+     regmatch_t *pmatch;
+     int fl_backtrack;
+{
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  int idx, cur_node, real_nmatch;
+  re_node_set eps_via_nodes;
+  struct re_fail_stack_t *fs;
+  struct re_fail_stack_t fs_body = {0, 2, NULL};
+#ifdef DEBUG
+  assert (nmatch > 1);
+  assert (mctx->state_log != NULL);
+#endif
+  if (fl_backtrack)
+    {
+      fs = &fs_body;
+      fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
+    }
+  else
+    fs = NULL;
+  cur_node = dfa->init_node;
+  real_nmatch = (nmatch <= preg->re_nsub) ? nmatch : preg->re_nsub + 1;
+  re_node_set_init_empty (&eps_via_nodes);
+  for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
+    {
+      update_regs (dfa, pmatch, cur_node, idx, real_nmatch);
+      if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
+        {
+          int reg_idx;
+          if (fs)
+            {
+              for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
+                if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
+                  break;
+              if (reg_idx == nmatch)
+                return REG_NOERROR;
+              cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+                                         &eps_via_nodes);
+            }
+          else
+            return REG_NOERROR;
+        }
+
+      /* Proceed to next node.  */
+      cur_node = proceed_next_node (preg, nmatch, pmatch, mctx, &idx, cur_node,
+                                    &eps_via_nodes, fs);
+
+      if (BE (cur_node < 0, 0))
+        {
+          if (cur_node == -2)
+            return REG_ESPACE;
+          if (fs)
+            cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
+                                       &eps_via_nodes);
+          else
+            return REG_NOMATCH;
+        }
+    }
+  re_node_set_free (&eps_via_nodes);
+  return REG_NOERROR;
+}
+
+static void
+update_regs (dfa, pmatch, cur_node, cur_idx, nmatch)
+     re_dfa_t *dfa;
+     regmatch_t *pmatch;
+     int cur_node, cur_idx, nmatch;
+{
+  int type = dfa->nodes[cur_node].type;
+  int reg_num;
+  if (type != OP_OPEN_SUBEXP && type != OP_CLOSE_SUBEXP)
+    return;
+  reg_num = dfa->nodes[cur_node].opr.idx + 1;
+  if (reg_num >= nmatch)
+    return;
+  if (type == OP_OPEN_SUBEXP)
+    {
+      /* We are at the first node of this sub expression.  */
+      pmatch[reg_num].rm_so = cur_idx;
+      pmatch[reg_num].rm_eo = -1;
+    }
+  else if (type == OP_CLOSE_SUBEXP)
+    /* We are at the first node of this sub expression.  */
+    pmatch[reg_num].rm_eo = cur_idx;
+}
+
+#define NUMBER_OF_STATE 1
+
+/* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
+   and sift the nodes in each states according to the following rules.
+   Updated state_log will be wrote to STATE_LOG.
+
+   Rules: We throw away the Node `a' in the STATE_LOG[STR_IDX] if...
+     1. When STR_IDX == MATCH_LAST(the last index in the state_log):
+        If `a' isn't the LAST_NODE and `a' can't epsilon transit to
+        the LAST_NODE, we throw away the node `a'.
+     2. When 0 <= STR_IDX < MATCH_LAST and `a' accepts
+        string `s' and transit to `b':
+        i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
+           away the node `a'.
+        ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
+            throwed away, we throw away the node `a'.
+     3. When 0 <= STR_IDX < n and 'a' epsilon transit to 'b':
+        i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
+           node `a'.
+        ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is throwed away,
+            we throw away the node `a'.  */
+
+#define STATE_NODE_CONTAINS(state,node) \
+  ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
+
+static reg_errcode_t
+sift_states_backward (preg, mctx, sctx)
+     const regex_t *preg;
+     re_match_context_t *mctx;
+     re_sift_context_t *sctx;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  int null_cnt = 0;
+  int str_idx = sctx->last_str_idx;
+  re_node_set cur_dest;
+  re_node_set *cur_src; /* Points the state_log[str_idx]->nodes  */
+
+#ifdef DEBUG
+  assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
+#endif
+  cur_src = &mctx->state_log[str_idx]->nodes;
+
+  /* Build sifted state_log[str_idx].  It has the nodes which can epsilon
+     transit to the last_node and the last_node itself.  */
+  err = re_node_set_init_1 (&cur_dest, sctx->last_node);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+  err = update_cur_sifted_state (preg, mctx, sctx, str_idx, &cur_dest);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+
+  /* Then check each states in the state_log.  */
+  while (str_idx > 0)
+    {
+      int i, ret;
+      /* Update counters.  */
+      null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
+      if (null_cnt > mctx->max_mb_elem_len)
+        {
+          memset (sctx->sifted_states, '\0',
+                  sizeof (re_dfastate_t *) * str_idx);
+          return REG_NOERROR;
+        }
+      re_node_set_empty (&cur_dest);
+      --str_idx;
+      cur_src = ((mctx->state_log[str_idx] == NULL) ? &empty_set
+                 : &mctx->state_log[str_idx]->nodes);
+
+      /* Then build the next sifted state.
+         We build the next sifted state on `cur_dest', and update
+         `sifted_states[str_idx]' with `cur_dest'.
+         Note:
+         `cur_dest' is the sifted state from `state_log[str_idx + 1]'.
+         `cur_src' points the node_set of the old `state_log[str_idx]'.  */
+      for (i = 0; i < cur_src->nelem; i++)
+        {
+          int prev_node = cur_src->elems[i];
+          int entity = prev_node;
+          int naccepted = 0;
+          re_token_type_t type = dfa->nodes[prev_node].type;
+
+          if (IS_EPSILON_NODE(type))
+            continue;
+          if (type == OP_CONTEXT_NODE)
+            {
+              entity = dfa->nodes[prev_node].opr.ctx_info->entity;
+              type = dfa->nodes[entity].type;
+            }
+#ifdef RE_ENABLE_I18N
+          /* If the node may accept `multi byte'.  */
+          if (ACCEPT_MB_NODE (type))
+            naccepted = sift_states_iter_mb (preg, mctx, sctx, entity, str_idx,
+                                             sctx->last_str_idx);
+
+#endif /* RE_ENABLE_I18N */
+          /* We don't check backreferences here.
+             See update_cur_sifted_state().  */
+
+          if (!naccepted
+              && check_node_accept (preg, dfa->nodes + prev_node, mctx,
+                                    str_idx)
+              && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
+                                      dfa->nexts[prev_node]))
+            naccepted = 1;
+
+          if (naccepted == 0)
+            continue;
+
+          if (sctx->limits.nelem)
+            {
+              int to_idx = str_idx + naccepted;
+              if (check_dst_limits (dfa, &sctx->limits, mctx,
+                                    dfa->nexts[prev_node], to_idx,
+                                    prev_node, str_idx))
+                continue;
+            }
+          ret = re_node_set_insert (&cur_dest, prev_node);
+          if (BE (ret == -1, 0))
+            return err;
+        }
+
+      /* Add all the nodes which satisfy the following conditions:
+         - It can epsilon transit to a node in CUR_DEST.
+         - It is in CUR_SRC.
+         And update state_log.  */
+      err = update_cur_sifted_state (preg, mctx, sctx, str_idx, &cur_dest);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+
+  re_node_set_free (&cur_dest);
+  return REG_NOERROR;
+}
+
+/* Helper functions.  */
+
+static inline reg_errcode_t
+clean_state_log_if_need (mctx, next_state_log_idx)
+    re_match_context_t *mctx;
+    int next_state_log_idx;
+{
+  int top = mctx->state_log_top;
+
+  if (next_state_log_idx >= mctx->input->bufs_len
+      || (next_state_log_idx >= mctx->input->valid_len
+          && mctx->input->valid_len < mctx->input->len))
+    {
+      reg_errcode_t err;
+      err = extend_buffers (mctx);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+
+  if (top < next_state_log_idx)
+    {
+      memset (mctx->state_log + top + 1, '\0',
+              sizeof (re_dfastate_t *) * (next_state_log_idx - top));
+      mctx->state_log_top = next_state_log_idx;
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t merge_state_array (dfa, dst, src, num)
+     re_dfa_t *dfa;
+     re_dfastate_t **dst;
+     re_dfastate_t **src;
+     int num;
+{
+  int st_idx;
+  reg_errcode_t err;
+  for (st_idx = 0; st_idx < num; ++st_idx)
+    {
+      if (dst[st_idx] == NULL)
+        dst[st_idx] = src[st_idx];
+      else if (src[st_idx] != NULL)
+        {
+          re_node_set merged_set;
+          err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
+                                        &src[st_idx]->nodes);
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+          dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+          re_node_set_free (&merged_set);
+        }
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+update_cur_sifted_state (preg, mctx, sctx, str_idx, dest_nodes)
+     const regex_t *preg;
+     re_match_context_t *mctx;
+     re_sift_context_t *sctx;
+     int str_idx;
+     re_node_set *dest_nodes;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  const re_node_set *candidates;
+  candidates = ((mctx->state_log[str_idx] == NULL) ? &empty_set
+                : &mctx->state_log[str_idx]->nodes);
+
+  /* At first, add the nodes which can epsilon transit to a node in
+     DEST_NODE.  */
+  err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+
+  /* Then, check the limitations in the current sift_context.  */
+  if (sctx->limits.nelem)
+    {
+      err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
+                                 mctx->bkref_ents, str_idx);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+
+  /* Update state_log.  */
+  sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+  if (BE (sctx->sifted_states[str_idx] == NULL && err != REG_NOERROR, 0))
+    return err;
+
+  /* If we are searching for the subexpression candidates.
+     Note that we were from transit_state_bkref_loop() in this case.  */
+  if (sctx->check_subexp)
+    {
+      err = search_subexp (preg, mctx, sctx, str_idx, dest_nodes);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+
+  if ((mctx->state_log[str_idx] != NULL
+       && mctx->state_log[str_idx]->has_backref))
+    {
+      err = sift_states_bkref (preg, mctx, sctx, str_idx, dest_nodes);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+add_epsilon_src_nodes (dfa, dest_nodes, candidates)
+     re_dfa_t *dfa;
+     re_node_set *dest_nodes;
+     const re_node_set *candidates;
+{
+  reg_errcode_t err;
+  int src_idx;
+  re_node_set src_copy;
+
+  err = re_node_set_init_copy (&src_copy, dest_nodes);
+  if (BE (err != REG_NOERROR, 0))
+    return err;
+  for (src_idx = 0; src_idx < src_copy.nelem; ++src_idx)
+    {
+      err = re_node_set_add_intersect (dest_nodes, candidates,
+                                       dfa->inveclosures
+                                       + src_copy.elems[src_idx]);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+  re_node_set_free (&src_copy);
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+sub_epsilon_src_nodes (dfa, node, dest_nodes, candidates)
+     re_dfa_t *dfa;
+     int node;
+     re_node_set *dest_nodes;
+     const re_node_set *candidates;
+{
+    int ecl_idx;
+    reg_errcode_t err;
+    re_node_set *inv_eclosure = dfa->inveclosures + node;
+    re_node_set except_nodes;
+    re_node_set_init_empty (&except_nodes);
+    for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+      {
+        int cur_node = inv_eclosure->elems[ecl_idx];
+        if (cur_node == node)
+          continue;
+        if (dfa->edests[cur_node].nelem)
+          {
+            int edst1 = dfa->edests[cur_node].elems[0];
+            int edst2 = ((dfa->edests[cur_node].nelem > 1)
+                         ? dfa->edests[cur_node].elems[1] : -1);
+            if ((!re_node_set_contains (inv_eclosure, edst1)
+                 && re_node_set_contains (dest_nodes, edst1))
+                || (edst2 > 0
+                    && !re_node_set_contains (inv_eclosure, edst2)
+                    && re_node_set_contains (dest_nodes, edst2)))
+              {
+                err = re_node_set_add_intersect (&except_nodes, candidates,
+                                                 dfa->inveclosures + cur_node);
+                if (BE (err != REG_NOERROR, 0))
+                  return err;
+              }
+          }
+      }
+    for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
+      {
+        int cur_node = inv_eclosure->elems[ecl_idx];
+        if (!re_node_set_contains (&except_nodes, cur_node))
+          {
+            int idx = re_node_set_contains (dest_nodes, cur_node) - 1;
+            re_node_set_remove_at (dest_nodes, idx);
+          }
+      }
+    re_node_set_free (&except_nodes);
+    return REG_NOERROR;
+}
+
+static int
+check_dst_limits (dfa, limits, mctx, dst_node, dst_idx, src_node, src_idx)
+     re_dfa_t *dfa;
+     re_node_set *limits;
+     re_match_context_t *mctx;
+     int dst_node, dst_idx, src_node, src_idx;
+{
+  int lim_idx, src_pos, dst_pos;
+
+  for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+    {
+      int bkref, subexp_idx/*, node_idx, cls_node*/;
+      struct re_backref_cache_entry *ent;
+      ent = mctx->bkref_ents + limits->elems[lim_idx];
+      bkref = (dfa->nodes[ent->node].type == OP_CONTEXT_NODE
+               ? dfa->nodes[ent->node].opr.ctx_info->entity : ent->node);
+      subexp_idx = dfa->nodes[bkref].opr.idx - 1;
+
+      dst_pos = check_dst_limits_calc_pos (dfa, mctx, limits->elems[lim_idx],
+                                           dfa->eclosures + dst_node,
+                                           subexp_idx, dst_node, dst_idx);
+      src_pos = check_dst_limits_calc_pos (dfa, mctx, limits->elems[lim_idx],
+                                           dfa->eclosures + src_node,
+                                           subexp_idx, src_node, src_idx);
+
+      /* In case of:
+         <src> <dst> ( <subexp> )
+         ( <subexp> ) <src> <dst>
+         ( <subexp1> <src> <subexp2> <dst> <subexp3> )  */
+      if (src_pos == dst_pos)
+        continue; /* This is unrelated limitation.  */
+      else
+        return 1;
+    }
+  return 0;
+}
+
+static int
+check_dst_limits_calc_pos (dfa, mctx, limit, eclosures, subexp_idx, node,
+                           str_idx)
+     re_dfa_t *dfa;
+     re_match_context_t *mctx;
+     re_node_set *eclosures;
+     int limit, subexp_idx, node, str_idx;
+{
+  struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
+  int pos = (str_idx < lim->subexp_from ? -1
+             : (lim->subexp_to < str_idx ? 1 : 0));
+  if (pos == 0
+      && (str_idx == lim->subexp_from || str_idx == lim->subexp_to))
+    {
+      int node_idx;
+      for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
+        {
+          int node = eclosures->elems[node_idx];
+          int entity = node;
+          re_token_type_t type= dfa->nodes[node].type;
+          if (type == OP_CONTEXT_NODE)
+            {
+              entity = dfa->nodes[node].opr.ctx_info->entity;
+              type = dfa->nodes[entity].type;
+            }
+          if (type == OP_BACK_REF)
+            {
+              int bi;
+              for (bi = 0; bi < mctx->nbkref_ents; ++bi)
+                {
+                  struct re_backref_cache_entry *ent = mctx->bkref_ents + bi;
+                  if (ent->node == node && ent->subexp_from == ent->subexp_to
+                      && ent->str_idx == str_idx)
+                    {
+                      int cpos, dst;
+                      dst = dfa->nexts[node];
+                      cpos = check_dst_limits_calc_pos (dfa, mctx, limit,
+                                                        dfa->eclosures + dst,
+                                                        subexp_idx, dst,
+                                                        str_idx);
+                      if ((str_idx == lim->subexp_from && cpos == -1)
+                          || (str_idx == lim->subexp_to && cpos == 0))
+                        return cpos;
+                    }
+                }
+            }
+          if (type == OP_OPEN_SUBEXP && subexp_idx == dfa->nodes[node].opr.idx
+              && str_idx == lim->subexp_from)
+            {
+              pos = -1;
+              break;
+            }
+          if (type == OP_CLOSE_SUBEXP && subexp_idx == dfa->nodes[node].opr.idx
+              && str_idx == lim->subexp_to)
+            break;
+        }
+      if (node_idx == eclosures->nelem && str_idx == lim->subexp_to)
+        pos = 1;
+    }
+  return pos;
+}
+
+/* Check the limitations of sub expressions LIMITS, and remove the nodes
+   which are against limitations from DEST_NODES. */
+
+static reg_errcode_t
+check_subexp_limits (dfa, dest_nodes, candidates, limits, bkref_ents, str_idx)
+     re_dfa_t *dfa;
+     re_node_set *dest_nodes;
+     const re_node_set *candidates;
+     re_node_set *limits;
+     struct re_backref_cache_entry *bkref_ents;
+     int str_idx;
+{
+  reg_errcode_t err;
+  int node_idx, lim_idx;
+
+  for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
+    {
+      int bkref, subexp_idx;
+      struct re_backref_cache_entry *ent;
+      ent = bkref_ents + limits->elems[lim_idx];
+
+      if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
+        continue; /* This is unrelated limitation.  */
+
+      bkref = (dfa->nodes[ent->node].type == OP_CONTEXT_NODE
+               ? dfa->nodes[ent->node].opr.ctx_info->entity : ent->node);
+      subexp_idx = dfa->nodes[bkref].opr.idx - 1;
+
+      if (ent->subexp_to == str_idx)
+        {
+          int ops_node = -1;
+          int cls_node = -1;
+          for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+            {
+              int node = dest_nodes->elems[node_idx];
+              re_token_type_t type= dfa->nodes[node].type;
+              if (type == OP_OPEN_SUBEXP
+                  && subexp_idx == dfa->nodes[node].opr.idx)
+                ops_node = node;
+              else if (type == OP_CLOSE_SUBEXP
+                       && subexp_idx == dfa->nodes[node].opr.idx)
+                cls_node = node;
+            }
+
+          /* Check the limitation of the open subexpression.  */
+          /* Note that (ent->subexp_to = str_idx != ent->subexp_from).  */
+          if (ops_node >= 0)
+            {
+              err = sub_epsilon_src_nodes(dfa, ops_node, dest_nodes,
+                                          candidates);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+            }
+          /* Check the limitation of the close subexpression.  */
+          for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+            {
+              int node = dest_nodes->elems[node_idx];
+              if (!re_node_set_contains (dfa->inveclosures + node, cls_node)
+                  && !re_node_set_contains (dfa->eclosures + node, cls_node))
+                {
+                  /* It is against this limitation.
+                     Remove it form the current sifted state.  */
+                  err = sub_epsilon_src_nodes(dfa, node, dest_nodes,
+                                              candidates);
+                  if (BE (err != REG_NOERROR, 0))
+                    return err;
+                  --node_idx;
+                }
+            }
+        }
+      else /* (ent->subexp_to != str_idx)  */
+        {
+          for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+            {
+              int node = dest_nodes->elems[node_idx];
+              re_token_type_t type= dfa->nodes[node].type;
+              if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
+                {
+                  if (subexp_idx != dfa->nodes[node].opr.idx)
+                    continue;
+                  if ((type == OP_CLOSE_SUBEXP && ent->subexp_to != str_idx)
+                      || (type == OP_OPEN_SUBEXP))
+                    {
+                      /* It is against this limitation.
+                         Remove it form the current sifted state.  */
+                      err = sub_epsilon_src_nodes(dfa, node, dest_nodes,
+                                                  candidates);
+                      if (BE (err != REG_NOERROR, 0))
+                        return err;
+                    }
+                }
+            }
+        }
+    }
+  return REG_NOERROR;
+}
+
+/* Search for the top (in case of sctx->check_subexp < 0) or the
+   bottom (in case of sctx->check_subexp > 0) of the subexpressions
+   which the backreference sctx->cur_bkref can match.  */
+
+static reg_errcode_t
+search_subexp (preg, mctx, sctx, str_idx, dest_nodes)
+     const regex_t *preg;
+     re_match_context_t *mctx;
+     re_sift_context_t *sctx;
+     int str_idx;
+     re_node_set *dest_nodes;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  re_sift_context_t local_sctx;
+  int node_idx, node=0; /* gnupg */
+  const re_node_set *candidates;
+  re_dfastate_t **lim_states = NULL;
+  candidates = ((mctx->state_log[str_idx] == NULL) ? &empty_set
+                : &mctx->state_log[str_idx]->nodes);
+  local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized.  */
+
+  for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
+    {
+      re_token_type_t type;
+      int entity;
+      node = dest_nodes->elems[node_idx];
+      type = dfa->nodes[node].type;
+      entity = (type != OP_CONTEXT_NODE ? node
+                : dfa->nodes[node].opr.ctx_info->entity);
+      type = (type != OP_CONTEXT_NODE ? type : dfa->nodes[entity].type);
+
+      if (type == OP_CLOSE_SUBEXP
+          && sctx->check_subexp == dfa->nodes[node].opr.idx + 1)
+        {
+          re_dfastate_t *cur_state;
+          /* Found the bottom of the subexpression, then search for the
+             top of it.  */
+          if (local_sctx.sifted_states == NULL)
+            {
+              /* It hasn't been initialized yet, initialize it now.  */
+              local_sctx = *sctx;
+              err = re_node_set_init_copy (&local_sctx.limits, &sctx->limits);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+            }
+          local_sctx.check_subexp = -sctx->check_subexp;
+          local_sctx.limited_states = sctx->limited_states;
+          local_sctx.last_node = node;
+          local_sctx.last_str_idx = local_sctx.cls_subexp_idx = str_idx;
+          cur_state = local_sctx.sifted_states[str_idx];
+          err = sift_states_backward (preg, mctx, &local_sctx);
+          local_sctx.sifted_states[str_idx] = cur_state;
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+          /* There must not 2 same node in a node set.  */
+          break;
+        }
+      else if (type == OP_OPEN_SUBEXP
+               && -sctx->check_subexp == dfa->nodes[node].opr.idx + 1)
+        {
+          /* Found the top of the subexpression, check that the
+             backreference can match the input string.  */
+          char *buf;
+          int dest_str_idx;
+          int bkref_str_idx = re_string_cur_idx (mctx->input);
+          int subexp_len = sctx->cls_subexp_idx - str_idx;
+          if (subexp_len < 0 || bkref_str_idx + subexp_len > mctx->input->len)
+            break;
+
+          if (bkref_str_idx + subexp_len > mctx->input->valid_len
+              && mctx->input->valid_len < mctx->input->len)
+            {
+              reg_errcode_t err;
+              err = extend_buffers (mctx);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+            }
+          buf = (char *) re_string_get_buffer (mctx->input);
+          if (strncmp (buf + str_idx, buf + bkref_str_idx, subexp_len) != 0)
+            break;
+
+          if (sctx->limits.nelem && str_idx > 0)
+            {
+              re_dfastate_t *cur_state = sctx->sifted_states[str_idx];
+              if (lim_states == NULL)
+                {
+                  lim_states = re_malloc (re_dfastate_t *, str_idx + 1);
+                }
+              if (local_sctx.sifted_states == NULL)
+                {
+                  /* It hasn't been initialized yet, initialize it now.  */
+                  local_sctx = *sctx;
+                  if (BE (lim_states == NULL, 0))
+                    return REG_ESPACE;
+                  err = re_node_set_init_copy (&local_sctx.limits,
+                                               &sctx->limits);
+                  if (BE (err != REG_NOERROR, 0))
+                    return err;
+                }
+              local_sctx.check_subexp = 0;
+              local_sctx.last_node = node;
+              local_sctx.last_str_idx = str_idx;
+              local_sctx.limited_states = lim_states;
+              memset (lim_states, '\0',
+                      sizeof (re_dfastate_t*) * (str_idx + 1));
+              err = sift_states_backward (preg, mctx, &local_sctx);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+              if (local_sctx.sifted_states[0] == NULL
+                  && local_sctx.limited_states[0] == NULL)
+                {
+                  sctx->sifted_states[str_idx] = cur_state;
+                  break;
+                }
+              sctx->sifted_states[str_idx] = cur_state;
+            }
+          /* Successfully matched, add a new cache entry.  */
+          dest_str_idx = bkref_str_idx + subexp_len;
+          err = match_ctx_add_entry (mctx, sctx->cur_bkref, bkref_str_idx,
+                                     str_idx, sctx->cls_subexp_idx);
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+          err = clean_state_log_if_need (mctx, dest_str_idx);
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+          break;
+        }
+    }
+
+  /* Remove the top/bottom of the sub expression we processed.  */
+  if (node_idx < dest_nodes->nelem)
+    {
+      err = sub_epsilon_src_nodes(dfa, node, dest_nodes, candidates);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+      /* Update state_log.  */
+      sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+    }
+
+  if (local_sctx.sifted_states != NULL)
+    re_node_set_free (&local_sctx.limits);
+  if (lim_states != NULL)
+    re_free (lim_states);
+  return REG_NOERROR;
+}
+
+static reg_errcode_t
+sift_states_bkref (preg, mctx, sctx, str_idx, dest_nodes)
+     const regex_t *preg;
+     re_match_context_t *mctx;
+     re_sift_context_t *sctx;
+     int str_idx;
+     re_node_set *dest_nodes;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
+  int node_idx, node;
+  re_sift_context_t local_sctx;
+  const re_node_set *candidates;
+  candidates = ((mctx->state_log[str_idx] == NULL) ? &empty_set
+                : &mctx->state_log[str_idx]->nodes);
+  local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized.  */
+
+  for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
+    {
+      int entity;
+      int cur_bkref_idx = re_string_cur_idx (mctx->input);
+      re_token_type_t type;
+      node = candidates->elems[node_idx];
+      type = dfa->nodes[node].type;
+      entity = (type != OP_CONTEXT_NODE ? node
+                : dfa->nodes[node].opr.ctx_info->entity);
+      type = (type != OP_CONTEXT_NODE ? type : dfa->nodes[entity].type);
+      if (node == sctx->cur_bkref && str_idx == cur_bkref_idx)
+        continue;
+      /* Avoid infinite loop for the REs like "()\1+".  */
+      if (node == sctx->last_node && str_idx == sctx->last_str_idx)
+        continue;
+      if (type == OP_BACK_REF)
+        {
+          int enabled_idx;
+          for (enabled_idx = 0; enabled_idx < mctx->nbkref_ents; ++enabled_idx)
+            {
+              int disabled_idx, subexp_len, to_idx;
+              struct re_backref_cache_entry *entry;
+              entry = mctx->bkref_ents + enabled_idx;
+              subexp_len = entry->subexp_to - entry->subexp_from;
+              to_idx = str_idx + subexp_len;
+
+              if (entry->node != node || entry->str_idx != str_idx
+                  || to_idx > sctx->last_str_idx
+                  || sctx->sifted_states[to_idx] == NULL)
+                continue;
+              if (!STATE_NODE_CONTAINS (sctx->sifted_states[to_idx],
+                                        dfa->nexts[node]))
+                {
+                  int dst_idx;
+                  re_node_set *dsts = &sctx->sifted_states[to_idx]->nodes;
+                  for (dst_idx = 0; dst_idx < dsts->nelem; ++dst_idx)
+                    {
+                      int dst_node = dsts->elems[dst_idx];
+                      if (dfa->nodes[dst_node].type == OP_CONTEXT_NODE
+                          && (dfa->nodes[dst_node].opr.ctx_info->entity
+                              == dfa->nexts[node]))
+                        break;
+                    }
+                  if (dst_idx == dsts->nelem)
+                    continue;
+                }
+
+              if (check_dst_limits (dfa, &sctx->limits, mctx, node,
+                                    str_idx, dfa->nexts[node], to_idx))
+                continue;
+              if (sctx->check_subexp == dfa->nodes[entity].opr.idx)
+                {
+                  char *buf;
+                  buf = (char *) re_string_get_buffer (mctx->input);
+                  if (strncmp (buf + entry->subexp_from,
+                               buf + cur_bkref_idx, subexp_len) != 0)
+                    continue;
+                  err = match_ctx_add_entry (mctx, sctx->cur_bkref,
+                                             cur_bkref_idx, entry->subexp_from,
+                                             entry->subexp_to);
+                  if (BE (err != REG_NOERROR, 0))
+                    return err;
+                  err = clean_state_log_if_need (mctx, cur_bkref_idx
+                                                 + subexp_len);
+                  if (BE (err != REG_NOERROR, 0))
+                    return err;
+                }
+              else
+                {
+                  re_dfastate_t *cur_state;
+                  entry->flag = 0;
+                  for (disabled_idx = enabled_idx + 1;
+                       disabled_idx < mctx->nbkref_ents; ++disabled_idx)
+                    {
+                      struct re_backref_cache_entry *entry2;
+                      entry2 = mctx->bkref_ents + disabled_idx;
+                      if (entry2->node != node || entry2->str_idx != str_idx)
+                        continue;
+                      entry2->flag = 1;
+                    }
+
+                  if (local_sctx.sifted_states == NULL)
+                    {
+                      local_sctx = *sctx;
+                      err = re_node_set_init_copy (&local_sctx.limits,
+                                                   &sctx->limits);
+                      if (BE (err != REG_NOERROR, 0))
+                        return err;
+                    }
+                  local_sctx.last_node = node;
+                  local_sctx.last_str_idx = str_idx;
+                  err = re_node_set_insert (&local_sctx.limits, enabled_idx);
+                  if (BE (err < 0, 0))
+                    return REG_ESPACE;
+                  cur_state = local_sctx.sifted_states[str_idx];
+                  err = sift_states_backward (preg, mctx, &local_sctx);
+                  if (BE (err != REG_NOERROR, 0))
+                    return err;
+                  if (sctx->limited_states != NULL)
+                    {
+                      err = merge_state_array (dfa, sctx->limited_states,
+                                               local_sctx.sifted_states,
+                                               str_idx + 1);
+                      if (BE (err != REG_NOERROR, 0))
+                        return err;
+                    }
+                  local_sctx.sifted_states[str_idx] = cur_state;
+                  re_node_set_remove_at (&local_sctx.limits,
+                                         local_sctx.limits.nelem - 1);
+                  entry->flag = 1;
+                }
+            }
+          for (enabled_idx = 0; enabled_idx < mctx->nbkref_ents; ++enabled_idx)
+            {
+              struct re_backref_cache_entry *entry;
+              entry = mctx->bkref_ents + enabled_idx;
+              if (entry->node == node && entry->str_idx == str_idx)
+                entry->flag = 0;
+            }
+        }
+    }
+  if (local_sctx.sifted_states != NULL)
+    {
+      re_node_set_free (&local_sctx.limits);
+    }
+
+  return REG_NOERROR;
+}
+
+
+#ifdef RE_ENABLE_I18N
+static int
+sift_states_iter_mb (preg, mctx, sctx, node_idx, str_idx, max_str_idx)
+    const regex_t *preg;
+    const re_match_context_t *mctx;
+    re_sift_context_t *sctx;
+    int node_idx, str_idx, max_str_idx;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  int naccepted;
+  /* Check the node can accept `multi byte'.  */
+  naccepted = check_node_accept_bytes (preg, node_idx, mctx->input, str_idx);
+  if (naccepted > 0 && str_idx + naccepted <= max_str_idx &&
+      !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
+                            dfa->nexts[node_idx]))
+    /* The node can't accept the `multi byte', or the
+       destination was already throwed away, then the node
+       could't accept the current input `multi byte'.   */
+    naccepted = 0;
+  /* Otherwise, it is sure that the node could accept
+     `naccepted' bytes input.  */
+  return naccepted;
+}
+#endif /* RE_ENABLE_I18N */
+
+\f
+/* Functions for state transition.  */
+
+/* Return the next state to which the current state STATE will transit by
+   accepting the current input byte, and update STATE_LOG if necessary.
+   If STATE can accept a multibyte char/collating element/back reference
+   update the destination of STATE_LOG.  */
+
+static re_dfastate_t *
+transit_state (err, preg, mctx, state, fl_search)
+     reg_errcode_t *err;
+     const regex_t *preg;
+     re_match_context_t *mctx;
+     re_dfastate_t *state;
+     int fl_search;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  re_dfastate_t **trtable, *next_state;
+  unsigned char ch;
+
+  if (re_string_cur_idx (mctx->input) + 1 >= mctx->input->bufs_len
+      || (re_string_cur_idx (mctx->input) + 1 >= mctx->input->valid_len
+          && mctx->input->valid_len < mctx->input->len))
+    {
+      *err = extend_buffers (mctx);
+      if (BE (*err != REG_NOERROR, 0))
+        return NULL;
+    }
+
+  *err = REG_NOERROR;
+  if (state == NULL)
+    {
+      next_state = state;
+      re_string_skip_bytes (mctx->input, 1);
+    }
+  else
+    {
+#ifdef RE_ENABLE_I18N
+      /* If the current state can accept multibyte.  */
+      if (state->accept_mb)
+        {
+          *err = transit_state_mb (preg, state, mctx);
+          if (BE (*err != REG_NOERROR, 0))
+            return NULL;
+        }
+#endif /* RE_ENABLE_I18N */
+
+      /* Then decide the next state with the single byte.  */
+      if (1)
+        {
+          /* Use transition table  */
+          ch = re_string_fetch_byte (mctx->input);
+          trtable = fl_search ? state->trtable_search : state->trtable;
+          if (trtable == NULL)
+            {
+              trtable = build_trtable (preg, state, fl_search);
+              if (fl_search)
+                state->trtable_search = trtable;
+              else
+                state->trtable = trtable;
+            }
+          next_state = trtable[ch];
+        }
+      else
+        {
+          /* don't use transition table  */
+          next_state = transit_state_sb (err, preg, state, fl_search, mctx);
+          if (BE (next_state == NULL && err != REG_NOERROR, 0))
+            return NULL;
+        }
+    }
+
+  /* Update the state_log if we need.  */
+  if (mctx->state_log != NULL)
+    {
+      int cur_idx = re_string_cur_idx (mctx->input);
+      if (cur_idx > mctx->state_log_top)
+        {
+          mctx->state_log[cur_idx] = next_state;
+          mctx->state_log_top = cur_idx;
+        }
+      else if (mctx->state_log[cur_idx] == 0)
+        {
+          mctx->state_log[cur_idx] = next_state;
+        }
+      else
+        {
+          re_dfastate_t *pstate;
+          unsigned int context;
+          re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
+          /* If (state_log[cur_idx] != 0), it implies that cur_idx is
+             the destination of a multibyte char/collating element/
+             back reference.  Then the next state is the union set of
+             these destinations and the results of the transition table.  */
+          pstate = mctx->state_log[cur_idx];
+          log_nodes = pstate->entrance_nodes;
+          if (next_state != NULL)
+            {
+              table_nodes = next_state->entrance_nodes;
+              *err = re_node_set_init_union (&next_nodes, table_nodes,
+                                             log_nodes);
+              if (BE (*err != REG_NOERROR, 0))
+                return NULL;
+            }
+          else
+            next_nodes = *log_nodes;
+          /* Note: We already add the nodes of the initial state,
+                   then we don't need to add them here.  */
+
+          context = re_string_context_at (mctx->input,
+                                          re_string_cur_idx (mctx->input) - 1,
+                                          mctx->eflags, preg->newline_anchor);
+          next_state = mctx->state_log[cur_idx]
+            = re_acquire_state_context (err, dfa, &next_nodes, context);
+          /* We don't need to check errors here, since the return value of
+             this function is next_state and ERR is already set.  */
+
+          if (table_nodes != NULL)
+            re_node_set_free (&next_nodes);
+        }
+      /* If the next state has back references.  */
+      if (next_state != NULL && next_state->has_backref)
+        {
+          *err = transit_state_bkref (preg, next_state, mctx);
+          if (BE (*err != REG_NOERROR, 0))
+            return NULL;
+          next_state = mctx->state_log[cur_idx];
+        }
+    }
+  return next_state;
+}
+
+/* Helper functions for transit_state.  */
+
+/* Return the next state to which the current state STATE will transit by
+   accepting the current input byte.  */
+
+static re_dfastate_t *
+transit_state_sb (err, preg, state, fl_search, mctx)
+     reg_errcode_t *err;
+     const regex_t *preg;
+     re_dfastate_t *state;
+     int fl_search;
+     re_match_context_t *mctx;
+{
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  re_node_set next_nodes;
+  re_dfastate_t *next_state;
+  int node_cnt, cur_str_idx = re_string_cur_idx (mctx->input);
+  unsigned int context;
+
+  *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
+  if (BE (*err != REG_NOERROR, 0))
+    return NULL;
+  for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
+    {
+      int cur_node = state->nodes.elems[node_cnt];
+      if (check_node_accept (preg, dfa->nodes + cur_node, mctx, cur_str_idx))
+        {
+          *err = re_node_set_merge (&next_nodes,
+                                    dfa->eclosures + dfa->nexts[cur_node]);
+          if (BE (*err != REG_NOERROR, 0))
+            return NULL;
+        }
+    }
+  if (fl_search)
+    {
+#ifdef RE_ENABLE_I18N
+      int not_initial = 0;
+      if (MB_CUR_MAX > 1)
+        for (node_cnt = 0; node_cnt < next_nodes.nelem; ++node_cnt)
+          if (dfa->nodes[next_nodes.elems[node_cnt]].type == CHARACTER)
+            {
+              not_initial = dfa->nodes[next_nodes.elems[node_cnt]].mb_partial;
+              break;
+            }
+      if (!not_initial)
+#endif
+        {
+          *err = re_node_set_merge (&next_nodes,
+                                    dfa->init_state->entrance_nodes);
+          if (BE (*err != REG_NOERROR, 0))
+            return NULL;
+        }
+    }
+  context = re_string_context_at (mctx->input, cur_str_idx, mctx->eflags,
+                                  preg->newline_anchor);
+  next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
+  /* We don't need to check errors here, since the return value of
+     this function is next_state and ERR is already set.  */
+
+  re_node_set_free (&next_nodes);
+  re_string_skip_bytes (mctx->input, 1);
+  return next_state;
+}
+
+#ifdef RE_ENABLE_I18N
+static reg_errcode_t
+transit_state_mb (preg, pstate, mctx)
+    const regex_t *preg;
+    re_dfastate_t *pstate;
+    re_match_context_t *mctx;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  int i;
+
+  for (i = 0; i < pstate->nodes.nelem; ++i)
+    {
+      re_node_set dest_nodes, *new_nodes;
+      int cur_node_idx = pstate->nodes.elems[i];
+      int naccepted = 0, dest_idx;
+      unsigned int context;
+      re_dfastate_t *dest_state;
+
+      if (dfa->nodes[cur_node_idx].type == OP_CONTEXT_NODE)
+        {
+          context = re_string_context_at (mctx->input,
+                                          re_string_cur_idx (mctx->input),
+                                          mctx->eflags, preg->newline_anchor);
+          if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
+                                        context))
+            continue;
+          cur_node_idx = dfa->nodes[cur_node_idx].opr.ctx_info->entity;
+        }
+
+      /* How many bytes the node can accepts?  */
+      if (ACCEPT_MB_NODE (dfa->nodes[cur_node_idx].type))
+        naccepted = check_node_accept_bytes (preg, cur_node_idx, mctx->input,
+                                             re_string_cur_idx (mctx->input));
+      if (naccepted == 0)
+        continue;
+
+      /* The node can accepts `naccepted' bytes.  */
+      dest_idx = re_string_cur_idx (mctx->input) + naccepted;
+      mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
+                               : mctx->max_mb_elem_len);
+      err = clean_state_log_if_need (mctx, dest_idx);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+#ifdef DEBUG
+      assert (dfa->nexts[cur_node_idx] != -1);
+#endif
+      /* `cur_node_idx' may point the entity of the OP_CONTEXT_NODE,
+         then we use pstate->nodes.elems[i] instead.  */
+      new_nodes = dfa->eclosures + dfa->nexts[pstate->nodes.elems[i]];
+
+      dest_state = mctx->state_log[dest_idx];
+      if (dest_state == NULL)
+        dest_nodes = *new_nodes;
+      else
+        {
+          err = re_node_set_init_union (&dest_nodes,
+                                        dest_state->entrance_nodes, new_nodes);
+          if (BE (err != REG_NOERROR, 0))
+            return err;
+        }
+      context = re_string_context_at (mctx->input, dest_idx - 1, mctx->eflags,
+                                      preg->newline_anchor);
+      mctx->state_log[dest_idx]
+        = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+      if (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0))
+        return err;
+      if (dest_state != NULL)
+        re_node_set_free (&dest_nodes);
+    }
+  return REG_NOERROR;
+}
+#endif /* RE_ENABLE_I18N */
+
+static reg_errcode_t
+transit_state_bkref (preg, pstate, mctx)
+    const regex_t *preg;
+    re_dfastate_t *pstate;
+    re_match_context_t *mctx;
+{
+  reg_errcode_t err;
+  re_dfastate_t **work_state_log;
+
+  work_state_log = re_malloc (re_dfastate_t *,
+                              re_string_cur_idx (mctx->input) + 1);
+  if (BE (work_state_log == NULL, 0))
+    return REG_ESPACE;
+
+  err = transit_state_bkref_loop (preg, &pstate->nodes, work_state_log, mctx);
+  re_free (work_state_log);
+  return err;
+}
+
+/* Caller must allocate `work_state_log'.  */
+
+static reg_errcode_t
+transit_state_bkref_loop (preg, nodes, work_state_log, mctx)
+    const regex_t *preg;
+    re_node_set *nodes;
+    re_dfastate_t **work_state_log;
+    re_match_context_t *mctx;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  int i;
+  regmatch_t *cur_regs = re_malloc (regmatch_t, preg->re_nsub + 1);
+  int cur_str_idx = re_string_cur_idx (mctx->input);
+  if (BE (cur_regs == NULL, 0))
+    return REG_ESPACE;
+
+  for (i = 0; i < nodes->nelem; ++i)
+    {
+      int dest_str_idx, subexp_idx, prev_nelem, bkc_idx;
+      int node_idx = nodes->elems[i];
+      unsigned int context;
+      re_token_t *node = dfa->nodes + node_idx;
+      re_node_set *new_dest_nodes;
+      re_sift_context_t sctx;
+
+      /* Check whether `node' is a backreference or not.  */
+      if (node->type == OP_BACK_REF)
+        subexp_idx = node->opr.idx;
+      else if (node->type == OP_CONTEXT_NODE &&
+               dfa->nodes[node->opr.ctx_info->entity].type == OP_BACK_REF)
+        {
+          context = re_string_context_at (mctx->input, cur_str_idx,
+                                          mctx->eflags, preg->newline_anchor);
+          if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+            continue;
+          subexp_idx = dfa->nodes[node->opr.ctx_info->entity].opr.idx;
+        }
+      else
+        continue;
+
+      /* `node' is a backreference.
+         Check the substring which the substring matched.  */
+      sift_ctx_init (&sctx, work_state_log, NULL, node_idx, cur_str_idx,
+                     subexp_idx);
+      sctx.cur_bkref = node_idx;
+      match_ctx_clear_flag (mctx);
+      err = sift_states_backward (preg, mctx, &sctx);
+      if (BE (err != REG_NOERROR, 0))
+        return err;
+
+      /* And add the epsilon closures (which is `new_dest_nodes') of
+         the backreference to appropriate state_log.  */
+#ifdef DEBUG
+      assert (dfa->nexts[node_idx] != -1);
+#endif
+      for (bkc_idx = 0; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
+        {
+          int subexp_len;
+          re_dfastate_t *dest_state;
+          struct re_backref_cache_entry *bkref_ent;
+          bkref_ent = mctx->bkref_ents + bkc_idx;
+          if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
+            continue;
+          subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
+          new_dest_nodes = ((node->type == OP_CONTEXT_NODE && subexp_len == 0)
+                            ? dfa->nodes[node_idx].opr.ctx_info->bkref_eclosure
+                            : dfa->eclosures + dfa->nexts[node_idx]);
+          dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
+                          - bkref_ent->subexp_from);
+          context = (IS_WORD_CHAR (re_string_byte_at (mctx->input,
+                                                      dest_str_idx - 1))
+                     ? CONTEXT_WORD : 0);
+          dest_state = mctx->state_log[dest_str_idx];
+          prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
+                        : mctx->state_log[cur_str_idx]->nodes.nelem);
+          /* Add `new_dest_node' to state_log.  */
+          if (dest_state == NULL)
+            {
+              mctx->state_log[dest_str_idx]
+                = re_acquire_state_context (&err, dfa, new_dest_nodes,
+                                            context);
+              if (BE (mctx->state_log[dest_str_idx] == NULL
+                      && err != REG_NOERROR, 0))
+                return err;
+            }
+          else
+            {
+              re_node_set dest_nodes;
+              err = re_node_set_init_union (&dest_nodes,
+                                            dest_state->entrance_nodes,
+                                            new_dest_nodes);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+              mctx->state_log[dest_str_idx]
+                = re_acquire_state_context (&err, dfa, &dest_nodes, context);
+              if (BE (mctx->state_log[dest_str_idx] == NULL
+                      && err != REG_NOERROR, 0))
+                return err;
+              re_node_set_free (&dest_nodes);
+            }
+          /* We need to check recursively if the backreference can epsilon
+             transit.  */
+          if (subexp_len == 0
+              && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
+            {
+              err = transit_state_bkref_loop (preg, new_dest_nodes,
+                                              work_state_log, mctx);
+              if (BE (err != REG_NOERROR, 0))
+                return err;
+            }
+        }
+    }
+  re_free (cur_regs);
+  return REG_NOERROR;
+}
+
+/* Build transition table for the state.
+   Return the new table if succeeded, otherwise return NULL.  */
+
+static re_dfastate_t **
+build_trtable (preg, state, fl_search)
+    const regex_t *preg;
+    const re_dfastate_t *state;
+    int fl_search;
+{
+  reg_errcode_t err;
+  re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  int i, j, k, ch;
+  int ndests; /* Number of the destination states from `state'.  */
+  re_dfastate_t **trtable, **dest_states, **dest_states_word, **dest_states_nl;
+  re_node_set follows, *dests_node;
+  bitset *dests_ch;
+  bitset acceptable;
+
+  /* We build DFA states which corresponds to the destination nodes
+     from `state'.  `dests_node[i]' represents the nodes which i-th
+     destination state contains, and `dests_ch[i]' represents the
+     characters which i-th destination state accepts.  */
+  dests_node = re_malloc (re_node_set, SBC_MAX);
+  dests_ch = re_malloc (bitset, SBC_MAX);
+
+  /* Initialize transiton table.  */
+  trtable = (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
+  if (BE (dests_node == NULL || dests_ch == NULL || trtable == NULL, 0))
+    return NULL;
+
+  /* At first, group all nodes belonging to `state' into several
+     destinations.  */
+  ndests = group_nodes_into_DFAstates (preg, state, dests_node, dests_ch);
+  if (BE (ndests <= 0, 0))
+    {
+      re_free (dests_node);
+      re_free (dests_ch);
+      /* Return NULL in case of an error, trtable otherwise.  */
+      return (ndests < 0) ? NULL : trtable;
+    }
+
+  dest_states = re_malloc (re_dfastate_t *, ndests);
+  dest_states_word = re_malloc (re_dfastate_t *, ndests);
+  dest_states_nl = re_malloc (re_dfastate_t *, ndests);
+  bitset_empty (acceptable);
+
+  err = re_node_set_alloc (&follows, ndests + 1);
+  if (BE (dest_states == NULL || dest_states_word == NULL
+          || dest_states_nl == NULL || err != REG_NOERROR, 0))
+    return NULL;
+
+  /* Then build the states for all destinations.  */
+  for (i = 0; i < ndests; ++i)
+    {
+      int next_node;
+      re_node_set_empty (&follows);
+      /* Merge the follows of this destination states.  */
+      for (j = 0; j < dests_node[i].nelem; ++j)
+        {
+          next_node = dfa->nexts[dests_node[i].elems[j]];
+          if (next_node != -1)
+            {
+              err = re_node_set_merge (&follows, dfa->eclosures + next_node);
+              if (BE (err != REG_NOERROR, 0))
+                return NULL;
+            }
+        }
+      /* If search flag is set, merge the initial state.  */
+      if (fl_search)
+        {
+#ifdef RE_ENABLE_I18N
+          int not_initial = 0;
+          for (j = 0; j < follows.nelem; ++j)
+            if (dfa->nodes[follows.elems[j]].type == CHARACTER)
+              {
+                not_initial = dfa->nodes[follows.elems[j]].mb_partial;
+                break;
+              }
+          if (!not_initial)
+#endif
+            {
+              err = re_node_set_merge (&follows,
+                                       dfa->init_state->entrance_nodes);
+              if (BE (err != REG_NOERROR, 0))
+                return NULL;
+            }
+        }
+      dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
+      if (BE (dest_states[i] == NULL && err != REG_NOERROR, 0))
+        return NULL;
+      /* If the new state has context constraint,
+         build appropriate states for these contexts.  */
+      if (dest_states[i]->has_constraint)
+        {
+          dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
+                                                          CONTEXT_WORD);
+          if (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0))
+            return NULL;
+          dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
+                                                        CONTEXT_NEWLINE);
+          if (BE (dest_states_nl[i] == NULL && err != REG_NOERROR, 0))
+            return NULL;
+        }
+      else
+        {
+          dest_states_word[i] = dest_states[i];
+          dest_states_nl[i] = dest_states[i];
+        }
+      bitset_merge (acceptable, dests_ch[i]);
+    }
+
+  /* Update the transition table.  */
+  /* For all characters ch...:  */
+  for (i = 0, ch = 0; i < BITSET_UINTS; ++i)
+    for (j = 0; j < UINT_BITS; ++j, ++ch)
+      if ((acceptable[i] >> j) & 1)
+        {
+          /* The current state accepts the character ch.  */
+          if (IS_WORD_CHAR (ch))
+            {
+              for (k = 0; k < ndests; ++k)
+                if ((dests_ch[k][i] >> j) & 1)
+                  {
+                    /* k-th destination accepts the word character ch.  */
+                    trtable[ch] = dest_states_word[k];
+                    /* There must be only one destination which accepts
+                       character ch.  See group_nodes_into_DFAstates.  */
+                    break;
+                  }
+            }
+          else /* not WORD_CHAR */
+            {
+              for (k = 0; k < ndests; ++k)
+                if ((dests_ch[k][i] >> j) & 1)
+                  {
+                    /* k-th destination accepts the non-word character ch.  */
+                    trtable[ch] = dest_states[k];
+                    /* There must be only one destination which accepts
+                       character ch.  See group_nodes_into_DFAstates.  */
+                    break;
+                  }
+            }
+        }
+  /* new line */
+  if (bitset_contain (acceptable, NEWLINE_CHAR))
+    {
+      /* The current state accepts newline character.  */
+      for (k = 0; k < ndests; ++k)
+        if (bitset_contain (dests_ch[k], NEWLINE_CHAR))
+          {
+            /* k-th destination accepts newline character.  */
+            trtable[NEWLINE_CHAR] = dest_states_nl[k];
+            /* There must be only one destination which accepts
+               newline.  See group_nodes_into_DFAstates.  */
+            break;
+          }
+    }
+
+  re_free (dest_states_nl);
+  re_free (dest_states_word);
+  re_free (dest_states);
+
+  re_node_set_free (&follows);
+  for (i = 0; i < ndests; ++i)
+    re_node_set_free (dests_node + i);
+
+  re_free (dests_ch);
+  re_free (dests_node);
+
+  return trtable;
+}
+
+/* Group all nodes belonging to STATE into several destinations.
+   Then for all destinations, set the nodes belonging to the destination
+   to DESTS_NODE[i] and set the characters accepted by the destination
+   to DEST_CH[i].  This function return the number of destinations.  */
+
+static int
+group_nodes_into_DFAstates (preg, state, dests_node, dests_ch)
+    const regex_t *preg;
+    const re_dfastate_t *state;
+    re_node_set *dests_node;
+    bitset *dests_ch;
+{
+  reg_errcode_t err;
+  const re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  int i, j, k;
+  int ndests; /* Number of the destinations from `state'.  */
+  bitset accepts; /* Characters a node can accept.  */
+  const re_node_set *cur_nodes = &state->nodes;
+  bitset_empty (accepts);
+  ndests = 0;
+
+  /* For all the nodes belonging to `state',  */
+  for (i = 0; i < cur_nodes->nelem; ++i)
+    {
+      unsigned int constraint = 0;
+      re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
+      re_token_type_t type = node->type;
+
+      if (type == OP_CONTEXT_NODE)
+        {
+          constraint = node->constraint;
+          node = dfa->nodes + node->opr.ctx_info->entity;
+          type = node->type;
+        }
+
+      /* Enumerate all single byte character this node can accept.  */
+      if (type == CHARACTER)
+        bitset_set (accepts, node->opr.c);
+      else if (type == SIMPLE_BRACKET)
+        {
+          bitset_merge (accepts, node->opr.sbcset);
+        }
+      else if (type == OP_PERIOD)
+        {
+          bitset_set_all (accepts);
+          if (!(preg->syntax & RE_DOT_NEWLINE))
+            bitset_clear (accepts, '\n');
+          if (preg->syntax & RE_DOT_NOT_NULL)
+            bitset_clear (accepts, '\0');
+        }
+      else
+        continue;
+
+      /* Check the `accepts' and sift the characters which are not
+         match it the context.  */
+      if (constraint)
+        {
+          if (constraint & NEXT_WORD_CONSTRAINT)
+            for (j = 0; j < BITSET_UINTS; ++j)
+              accepts[j] &= dfa->word_char[j];
+          else if (constraint & NEXT_NOTWORD_CONSTRAINT)
+            for (j = 0; j < BITSET_UINTS; ++j)
+              accepts[j] &= ~dfa->word_char[j];
+          else if (constraint & NEXT_NEWLINE_CONSTRAINT)
+            {
+              int accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
+              bitset_empty (accepts);
+              if (accepts_newline)
+                bitset_set (accepts, NEWLINE_CHAR);
+              else
+                continue;
+            }
+        }
+
+      /* Then divide `accepts' into DFA states, or create a new
+         state.  */
+      for (j = 0; j < ndests; ++j)
+        {
+          bitset intersec; /* Intersection sets, see below.  */
+          bitset remains;
+          /* Flags, see below.  */
+          int has_intersec, not_subset, not_consumed;
+
+          /* Optimization, skip if this state doesn't accept the character.  */
+          if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
+            continue;
+
+          /* Enumerate the intersection set of this state and `accepts'.  */
+          has_intersec = 0;
+          for (k = 0; k < BITSET_UINTS; ++k)
+            has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
+          /* And skip if the intersection set is empty.  */
+          if (!has_intersec)
+            continue;
+
+          /* Then check if this state is a subset of `accepts'.  */
+          not_subset = not_consumed = 0;
+          for (k = 0; k < BITSET_UINTS; ++k)
+            {
+              not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
+              not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
+            }
+
+          /* If this state isn't a subset of `accepts', create a
+             new group state, which has the `remains'. */
+          if (not_subset)
+            {
+              bitset_copy (dests_ch[ndests], remains);
+              bitset_copy (dests_ch[j], intersec);
+              err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
+              if (BE (err != REG_NOERROR, 0))
+                return -1;
+              ++ndests;
+            }
+
+          /* Put the position in the current group. */
+          err = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
+          if (BE (err < 0, 0))
+            return -1;
+
+          /* If all characters are consumed, go to next node. */
+          if (!not_consumed)
+            break;
+        }
+      /* Some characters remain, create a new group. */
+      if (j == ndests)
+        {
+          bitset_copy (dests_ch[ndests], accepts);
+          err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
+          if (BE (err != REG_NOERROR, 0))
+            return -1;
+          ++ndests;
+          bitset_empty (accepts);
+        }
+    }
+  return ndests;
+}
+
+#ifdef RE_ENABLE_I18N
+/* Check how many bytes the node `dfa->nodes[node_idx]' accepts.
+   Return the number of the bytes the node accepts.
+   STR_IDX is the current index of the input string.
+
+   This function handles the nodes which can accept one character, or
+   one collating element like '.', '[a-z]', opposite to the other nodes
+   can only accept one byte.  */
+
+static int
+check_node_accept_bytes (preg, node_idx, input, str_idx)
+    const regex_t *preg;
+    int node_idx, str_idx;
+    const re_string_t *input;
+{
+  const re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  const re_token_t *node = dfa->nodes + node_idx;
+  int elem_len = re_string_elem_size_at (input, str_idx);
+  int char_len = re_string_char_size_at (input, str_idx);
+  int i;
+# ifdef _LIBC
+  int j;
+  uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+# endif /* _LIBC */
+  if (elem_len <= 1 && char_len <= 1)
+    return 0;
+  if (node->type == OP_PERIOD)
+    {
+      /* '.' accepts any one character except the following two cases.  */
+      if ((!(preg->syntax & RE_DOT_NEWLINE) &&
+           re_string_byte_at (input, str_idx) == '\n') ||
+          ((preg->syntax & RE_DOT_NOT_NULL) &&
+           re_string_byte_at (input, str_idx) == '\0'))
+        return 0;
+      return char_len;
+    }
+  else if (node->type == COMPLEX_BRACKET)
+    {
+      const re_charset_t *cset = node->opr.mbcset;
+# ifdef _LIBC
+      const unsigned char *pin = re_string_get_buffer (input) + str_idx;
+# endif /* _LIBC */
+      int match_len = 0;
+      wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
+                    ? re_string_wchar_at (input, str_idx) : 0);
+
+      /* match with multibyte character?  */
+      for (i = 0; i < cset->nmbchars; ++i)
+        if (wc == cset->mbchars[i])
+          {
+            match_len = char_len;
+            goto check_node_accept_bytes_match;
+          }
+      /* match with character_class?  */
+      for (i = 0; i < cset->nchar_classes; ++i)
+        {
+          wctype_t wt = cset->char_classes[i];
+          if (__iswctype (wc, wt))
+            {
+              match_len = char_len;
+              goto check_node_accept_bytes_match;
+            }
+        }
+
+# ifdef _LIBC
+      if (nrules != 0)
+        {
+          unsigned int in_collseq = 0;
+          const int32_t *table, *indirect;
+          const unsigned char *weights, *extra;
+          const char *collseqwc;
+          int32_t idx;
+          /* This #include defines a local function!  */
+#  include <locale/weight.h>
+
+          /* match with collating_symbol?  */
+          if (cset->ncoll_syms)
+            extra = (const unsigned char *)
+              _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+          for (i = 0; i < cset->ncoll_syms; ++i)
+            {
+              const unsigned char *coll_sym = extra + cset->coll_syms[i];
+              /* Compare the length of input collating element and
+                 the length of current collating element.  */
+              if (*coll_sym != elem_len)
+                continue;
+              /* Compare each bytes.  */
+              for (j = 0; j < *coll_sym; j++)
+                if (pin[j] != coll_sym[1 + j])
+                  break;
+              if (j == *coll_sym)
+                {
+                  /* Match if every bytes is equal.  */
+                  match_len = j;
+                  goto check_node_accept_bytes_match;
+                }
+            }
+
+          if (cset->nranges)
+            {
+              if (elem_len <= char_len)
+                {
+                  collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
+                  in_collseq = collseq_table_lookup (collseqwc, wc);
+                }
+              else
+                in_collseq = find_collation_sequence_value (pin, elem_len);
+            }
+          /* match with range expression?  */
+          for (i = 0; i < cset->nranges; ++i)
+            if (cset->range_starts[i] <= in_collseq
+                && in_collseq <= cset->range_ends[i])
+              {
+                match_len = elem_len;
+                goto check_node_accept_bytes_match;
+              }
+
+          /* match with equivalence_class?  */
+          if (cset->nequiv_classes)
+            {
+              const unsigned char *cp = pin;
+              table = (const int32_t *)
+                _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+              weights = (const unsigned char *)
+                _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+              extra = (const unsigned char *)
+                _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+              indirect = (const int32_t *)
+                _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+              idx = findidx (&cp);
+              if (idx > 0)
+                for (i = 0; i < cset->nequiv_classes; ++i)
+                  {
+                    int32_t equiv_class_idx = cset->equiv_classes[i];
+                    size_t weight_len = weights[idx];
+                    if (weight_len == weights[equiv_class_idx])
+                      {
+                        int cnt = 0;
+                        while (cnt <= weight_len
+                               && (weights[equiv_class_idx + 1 + cnt]
+                                   == weights[idx + 1 + cnt]))
+                          ++cnt;
+                        if (cnt > weight_len)
+                          {
+                            match_len = elem_len;
+                            goto check_node_accept_bytes_match;
+                          }
+                      }
+                  }
+            }
+        }
+      else
+# endif /* _LIBC */
+        {
+          /* match with range expression?  */
+#if __GNUC__ >= 2
+          wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
+#else
+          wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
+          cmp_buf[2] = wc;
+#endif
+          for (i = 0; i < cset->nranges; ++i)
+            {
+              cmp_buf[0] = cset->range_starts[i];
+              cmp_buf[4] = cset->range_ends[i];
+              if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
+                  && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
+                {
+                  match_len = char_len;
+                  goto check_node_accept_bytes_match;
+                }
+            }
+        }
+    check_node_accept_bytes_match:
+      if (!cset->non_match)
+        return match_len;
+      else
+        {
+          if (match_len > 0)
+            return 0;
+          else
+            return (elem_len > char_len) ? elem_len : char_len;
+        }
+    }
+  return 0;
+}
+
+# ifdef _LIBC
+static unsigned int
+find_collation_sequence_value (mbs, mbs_len)
+    const unsigned char *mbs;
+    size_t mbs_len;
+{
+  uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+  if (nrules == 0)
+    {
+      if (mbs_len == 1)
+        {
+          /* No valid character.  Match it as a single byte character.  */
+          const unsigned char *collseq = (const unsigned char *)
+            _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
+          return collseq[mbs[0]];
+        }
+      return UINT_MAX;
+    }
+  else
+    {
+      int32_t idx;
+      const unsigned char *extra = (const unsigned char *)
+        _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
+
+      for (idx = 0; ;)
+        {
+          int mbs_cnt, found = 0;
+          int32_t elem_mbs_len;
+          /* Skip the name of collating element name.  */
+          idx = idx + extra[idx] + 1;
+          elem_mbs_len = extra[idx++];
+          if (mbs_len == elem_mbs_len)
+            {
+              for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
+                if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
+                  break;
+              if (mbs_cnt == elem_mbs_len)
+                /* Found the entry.  */
+                found = 1;
+            }
+          /* Skip the byte sequence of the collating element.  */
+          idx += elem_mbs_len;
+          /* Adjust for the alignment.  */
+          idx = (idx + 3) & ~3;
+          /* Skip the collation sequence value.  */
+          idx += sizeof (uint32_t);
+          /* Skip the wide char sequence of the collating element.  */
+          idx = idx + sizeof (uint32_t) * (extra[idx] + 1);
+          /* If we found the entry, return the sequence value.  */
+          if (found)
+            return *(uint32_t *) (extra + idx);
+          /* Skip the collation sequence value.  */
+          idx += sizeof (uint32_t);
+        }
+    }
+}
+# endif /* _LIBC */
+#endif /* RE_ENABLE_I18N */
+
+/* Check whether the node accepts the byte which is IDX-th
+   byte of the INPUT.  */
+
+static int
+check_node_accept (preg, node, mctx, idx)
+    const regex_t *preg;
+    const re_token_t *node;
+    const re_match_context_t *mctx;
+    int idx;
+{
+  const re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
+  const re_token_t *cur_node;
+  unsigned char ch;
+  if (node->type == OP_CONTEXT_NODE)
+    {
+      /* The node has constraints.  Check whether the current context
+         satisfies the constraints.  */
+      unsigned int context = re_string_context_at (mctx->input, idx,
+                                                   mctx->eflags,
+                                                   preg->newline_anchor);
+      if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
+        return 0;
+      cur_node = dfa->nodes + node->opr.ctx_info->entity;
+    }
+  else
+    cur_node = node;
+
+  ch = re_string_byte_at (mctx->input, idx);
+  if (cur_node->type == CHARACTER)
+    return cur_node->opr.c == ch;
+  else if (cur_node->type == SIMPLE_BRACKET)
+    return bitset_contain (cur_node->opr.sbcset, ch);
+  else if (cur_node->type == OP_PERIOD)
+    return !((ch == '\n' && !(preg->syntax & RE_DOT_NEWLINE))
+             || (ch == '\0' && (preg->syntax & RE_DOT_NOT_NULL)));
+  else
+    return 0;
+}
+
+/* Extend the buffers, if the buffers have run out.  */
+
+static reg_errcode_t
+extend_buffers (mctx)
+     re_match_context_t *mctx;
+{
+  reg_errcode_t ret;
+  re_string_t *pstr = mctx->input;
+
+  /* Double the lengthes of the buffers.  */
+  ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
+  if (BE (ret != REG_NOERROR, 0))
+    return ret;
+
+  if (mctx->state_log != NULL)
+    {
+      /* And double the length of state_log.  */
+      mctx->state_log = re_realloc (mctx->state_log, re_dfastate_t *,
+                                    pstr->bufs_len * 2);
+      if (BE (mctx->state_log == NULL, 0))
+        return REG_ESPACE;
+    }
+
+  /* Then reconstruct the buffers.  */
+  if (pstr->icase)
+    {
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+        build_wcs_upper_buffer (pstr);
+      else
+#endif /* RE_ENABLE_I18N  */
+        build_upper_buffer (pstr);
+    }
+  else
+    {
+#ifdef RE_ENABLE_I18N
+      if (MB_CUR_MAX > 1)
+        build_wcs_buffer (pstr);
+      else
+#endif /* RE_ENABLE_I18N  */
+        {
+          if (pstr->trans != NULL)
+            re_string_translate_buffer (pstr);
+          else
+            pstr->valid_len = pstr->bufs_len;
+        }
+    }
+  return REG_NOERROR;
+}
+
+\f
+/* Functions for matching context.  */
+
+static reg_errcode_t
+match_ctx_init (mctx, eflags, input, n)
+    re_match_context_t *mctx;
+    int eflags, n;
+    re_string_t *input;
+{
+  mctx->eflags = eflags;
+  mctx->input = input;
+  mctx->match_last = -1;
+  if (n > 0)
+    {
+      mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
+      if (BE (mctx->bkref_ents == NULL, 0))
+        return REG_ESPACE;
+    }
+  else
+    mctx->bkref_ents = NULL;
+  mctx->nbkref_ents = 0;
+  mctx->abkref_ents = n;
+  mctx->max_mb_elem_len = 0;
+  return REG_NOERROR;
+}
+
+static void
+match_ctx_free (mctx)
+    re_match_context_t *mctx;
+{
+  re_free (mctx->bkref_ents);
+}
+
+/* Add a new backreference entry to the cache.  */
+
+static reg_errcode_t
+match_ctx_add_entry (mctx, node, str_idx, from, to)
+    re_match_context_t *mctx;
+    int node, str_idx, from, to;
+{
+  if (mctx->nbkref_ents >= mctx->abkref_ents)
+    {
+      mctx->bkref_ents = re_realloc (mctx->bkref_ents,
+                                     struct re_backref_cache_entry,
+                                     mctx->abkref_ents * 2);
+      if (BE (mctx->bkref_ents == NULL, 0))
+        return REG_ESPACE;
+      memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
+             sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
+      mctx->abkref_ents *= 2;
+    }
+  mctx->bkref_ents[mctx->nbkref_ents].node = node;
+  mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
+  mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
+  mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
+  mctx->bkref_ents[mctx->nbkref_ents++].flag = 0;
+  if (mctx->max_mb_elem_len < to - from)
+    mctx->max_mb_elem_len = to - from;
+  return REG_NOERROR;
+}
+
+static void
+match_ctx_clear_flag (mctx)
+     re_match_context_t *mctx;
+{
+  int i;
+  for (i = 0; i < mctx->nbkref_ents; ++i)
+    {
+      mctx->bkref_ents[i].flag = 0;
+    }
+}
+
+static void
+sift_ctx_init (sctx, sifted_sts, limited_sts, last_node, last_str_idx,
+               check_subexp)
+    re_sift_context_t *sctx;
+    re_dfastate_t **sifted_sts, **limited_sts;
+    int last_node, last_str_idx, check_subexp;
+{
+  sctx->sifted_states = sifted_sts;
+  sctx->limited_states = limited_sts;
+  sctx->last_node = last_node;
+  sctx->last_str_idx = last_str_idx;
+  sctx->check_subexp = check_subexp;
+  re_node_set_init_empty (&sctx->limits);
+}
diff --git a/util/secmem.c b/util/secmem.c
new file mode 100644 (file)
index 0000000..5ffbfc6
--- /dev/null
@@ -0,0 +1,499 @@
+/* secmem.c  - memory allocation from a secure heap
+ *     Copyright (C) 1998, 1999, 2000 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <unistd.h>
+#if defined(HAVE_MLOCK) || defined(HAVE_MMAP)
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#ifdef USE_CAPABILITIES
+#include <sys/capability.h>
+#endif
+#ifdef HAVE_PLOCK
+#include <sys/lock.h>
+#endif
+#endif
+
+#include "types.h"
+#include "memory.h"
+#include "util.h"
+#include "i18n.h"
+
+/* MinGW doesn't seem to prototype getpagesize, though it does have
+   it. */
+#if !HAVE_DECL_GETPAGESIZE
+int getpagesize(void);
+#endif
+
+#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+/* It seems that Slackware 7.1 does not know about EPERM */
+#if !defined(EPERM) && defined(ENOMEM)
+#define EPERM  ENOMEM
+#endif
+
+
+#define DEFAULT_POOLSIZE 16384
+
+typedef struct memblock_struct MEMBLOCK;
+struct memblock_struct {
+    unsigned size;
+    union {
+       MEMBLOCK *next;
+       PROPERLY_ALIGNED_TYPE aligned;
+    } u;
+};
+
+
+
+static void  *pool;
+static volatile int pool_okay; /* may be checked in an atexit function */
+#ifdef HAVE_MMAP
+static volatile int pool_is_mmapped;
+#endif
+static size_t poolsize; /* allocated length */
+static size_t poollen; /* used length */
+static MEMBLOCK *unused_blocks;
+static unsigned max_alloced;
+static unsigned cur_alloced;
+static unsigned max_blocks;
+static unsigned cur_blocks;
+static int disable_secmem;
+static int show_warning;
+static int no_warning;
+static int suspend_warning;
+
+
+static void
+print_warn(void)
+{
+  if (!no_warning)
+    {
+      log_info(_("WARNING: using insecure memory!\n"));
+      log_info(_("please see http://www.gnupg.org/faq.html"
+                " for more information\n"));
+    }
+}
+
+
+static void
+lock_pool( void *p, size_t n )
+{
+#if defined(USE_CAPABILITIES) && defined(HAVE_MLOCK)
+    int err;
+
+    cap_set_proc( cap_from_text("cap_ipc_lock+ep") );
+    err = mlock( p, n );
+    if( err && errno )
+       err = errno;
+    cap_set_proc( cap_from_text("cap_ipc_lock+p") );
+
+    if( err ) {
+       if( errno != EPERM
+#ifdef EAGAIN  /* OpenBSD returns this */
+           && errno != EAGAIN
+#endif
+#ifdef ENOSYS  /* Some SCOs return this (function not implemented) */
+           && errno != ENOSYS
+#endif
+#ifdef ENOMEM  /* Linux can return this */
+            && errno != ENOMEM
+#endif
+         )
+           log_error("can't lock memory: %s\n", strerror(err));
+       show_warning = 1;
+    }
+
+#elif defined(HAVE_MLOCK)
+    uid_t uid;
+    int err;
+
+    uid = getuid();
+
+#ifdef HAVE_BROKEN_MLOCK
+    /* ick. but at least we get secured memory. about to lock
+       entire data segment. */
+#ifdef HAVE_PLOCK
+# ifdef _AIX
+    /* The configure for AIX returns broken mlock but the plock has
+       the strange requirement to somehow set the stack limit first.
+       The problem might turn out in indeterministic program behaviour
+       and hanging processes which can somehow be solved when enough
+       processes are clogging up the memory.  To get this problem out
+       of the way we simply don't try to lock the memory at all.
+       */    
+    errno = EPERM;
+    err = errno;
+# else /* !_AIX */
+    err = plock( DATLOCK );
+    if( err && errno )
+        err = errno;
+# endif /*_AIX*/
+#else /*!HAVE_PLOCK*/
+    if( uid ) {
+       errno = EPERM;
+       err = errno;
+    }
+    else {
+       err = mlock( p, n );
+       if( err && errno )
+           err = errno;
+    }
+#endif /*!HAVE_PLOCK*/
+#else
+    err = mlock( p, n );
+    if( err && errno )
+       err = errno;
+#endif
+
+    if( uid && !geteuid() ) {
+       /* check that we really dropped the privs.
+        * Note: setuid(0) should always fail */
+       if( setuid( uid ) || getuid() != geteuid() || !setuid(0) )
+           log_fatal("failed to reset uid: %s\n", strerror(errno));
+    }
+
+    if( err ) {
+       if( errno != EPERM
+#ifdef EAGAIN  /* OpenBSD returns this */
+           && errno != EAGAIN
+#endif
+#ifdef ENOSYS  /* Some SCOs return this (function not implemented) */
+           && errno != ENOSYS
+#endif
+#ifdef ENOMEM  /* Linux can return this */
+            && errno != ENOMEM
+#endif
+         )
+           log_error("can't lock memory: %s\n", strerror(err));
+       show_warning = 1;
+    }
+
+#elif defined ( __QNX__ )
+    /* QNX does not page at all, so the whole secure memory stuff does
+     * not make much sense.  However it is still of use because it
+     * wipes out the memory on a free().
+     * Therefore it is sufficient to suppress the warning
+     */
+#elif defined (HAVE_DOSISH_SYSTEM) || defined (__CYGWIN__)
+    /* It does not make sense to print such a warning, given the fact that 
+     * this whole Windows !@#$% and their user base are inherently insecure
+     */
+#elif defined (__riscos__)
+    /* no virtual memory on RISC OS, so no pages are swapped to disc,
+     * besides we don't have mmap, so we don't use it! ;-)
+     * But don't complain, as explained above.
+     */
+#else
+    log_info("Please note that you don't have secure memory on this system\n");
+#endif
+}
+
+
+static void
+init_pool( size_t n)
+{
+    size_t pgsize;
+
+    poolsize = n;
+
+    if( disable_secmem )
+       log_bug("secure memory is disabled");
+
+#ifdef HAVE_GETPAGESIZE
+    pgsize = getpagesize();
+#else
+    pgsize = 4096;
+#endif
+
+#ifdef HAVE_MMAP
+    poolsize = (poolsize + pgsize -1 ) & ~(pgsize-1);
+#ifdef MAP_ANONYMOUS
+       pool = mmap( 0, poolsize, PROT_READ|PROT_WRITE,
+                                MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+#else /* map /dev/zero instead */
+    {  int fd;
+
+       fd = open("/dev/zero", O_RDWR);
+       if( fd == -1 ) {
+           log_error("can't open /dev/zero: %s\n", strerror(errno) );
+           pool = (void*)-1;
+       }
+       else {
+           pool = mmap( 0, poolsize, PROT_READ|PROT_WRITE,
+                                     MAP_PRIVATE, fd, 0);
+           close (fd);
+       }
+    }
+#endif
+    if( pool == (void*)-1 )
+       log_info("can't mmap pool of %u bytes: %s - using malloc\n",
+                           (unsigned)poolsize, strerror(errno));
+    else {
+       pool_is_mmapped = 1;
+       pool_okay = 1;
+    }
+
+#endif
+    if( !pool_okay ) {
+       pool = malloc( poolsize );
+       if( !pool )
+           log_fatal("can't allocate memory pool of %u bytes\n",
+                                                      (unsigned)poolsize);
+       else
+           pool_okay = 1;
+    }
+    lock_pool( pool, poolsize );
+    poollen = 0;
+}
+
+
+/* concatenate unused blocks */
+static void
+compress_pool(void)
+{
+    /* fixme: we really should do this */
+}
+
+void
+secmem_set_flags( unsigned flags )
+{
+    int was_susp = suspend_warning;
+
+    no_warning = flags & 1;
+    suspend_warning = flags & 2;
+
+    /* and now issue the warning if it is not longer suspended */
+    if( was_susp && !suspend_warning && show_warning ) {
+       show_warning = 0;
+       print_warn();
+    }
+}
+
+unsigned
+secmem_get_flags(void)
+{
+    unsigned flags;
+
+    flags  = no_warning      ? 1:0;
+    flags |= suspend_warning ? 2:0;
+    return flags;
+}
+
+/* Returns 1 if memory was locked, 0 if not. */
+int
+secmem_init( size_t n )
+{
+    if( !n ) {
+#ifndef __riscos__
+#ifdef USE_CAPABILITIES
+       /* drop all capabilities */
+       cap_set_proc( cap_from_text("all-eip") );
+
+#elif !defined(HAVE_DOSISH_SYSTEM)
+       uid_t uid;
+
+       disable_secmem=1;
+       uid = getuid();
+       if( uid != geteuid() ) {
+           if( setuid( uid ) || getuid() != geteuid() || !setuid(0) )
+               log_fatal("failed to drop setuid\n" );
+       }
+#endif
+#endif /* !__riscos__ */
+    }
+    else {
+       if( n < DEFAULT_POOLSIZE )
+           n = DEFAULT_POOLSIZE;
+       if( !pool_okay )
+           init_pool(n);
+       else
+           log_error("Oops, secure memory pool already initialized\n");
+    }
+
+    return !show_warning;
+}
+
+
+void *
+secmem_malloc( size_t size )
+{
+    MEMBLOCK *mb, *mb2;
+    int compressed=0;
+
+    if( !pool_okay ) {
+       log_info(
+        _("operation is not possible without initialized secure memory\n"));
+       log_info(_("(you may have used the wrong program for this task)\n"));
+       exit(2);
+    }
+    if( show_warning && !suspend_warning ) {
+       show_warning = 0;
+       print_warn();
+    }
+
+    /* Blocks are always a multiple of 32.  Note that we allocate an
+       extra of the size of an entire MEMBLOCK.  This is required
+       becuase we do not only need the SIZE info but also extra space
+       to chain up unused memory blocks.  */
+    size += sizeof(MEMBLOCK);
+    size = ((size + 31) / 32) * 32;
+
+  retry:
+    /* try to get it from the used blocks */
+    for(mb = unused_blocks,mb2=NULL; mb; mb2=mb, mb = mb->u.next )
+       if( mb->size >= size ) {
+           if( mb2 )
+               mb2->u.next = mb->u.next;
+           else
+               unused_blocks = mb->u.next;
+           goto leave;
+       }
+    /* allocate a new block */
+    if( (poollen + size <= poolsize) ) {
+       mb = (void*)((char*)pool + poollen);
+       poollen += size;
+       mb->size = size;
+    }
+    else if( !compressed ) {
+       compressed=1;
+       compress_pool();
+       goto retry;
+    }
+    else
+       return NULL;
+
+  leave:
+    cur_alloced += mb->size;
+    cur_blocks++;
+    if( cur_alloced > max_alloced )
+       max_alloced = cur_alloced;
+    if( cur_blocks > max_blocks )
+       max_blocks = cur_blocks;
+
+    return &mb->u.aligned.c;
+}
+
+
+void *
+secmexrealloc( void *p, size_t newsize )
+{
+    MEMBLOCK *mb;
+    size_t size;
+    void *a;
+
+    mb = (MEMBLOCK*)((char*)p - ((size_t) &((MEMBLOCK*)0)->u.aligned.c));
+    size = mb->size;
+    if (size < sizeof(MEMBLOCK))
+      log_bug ("secure memory corrupted at block %p\n", (void *)mb);
+    size -= ((size_t) &((MEMBLOCK*)0)->u.aligned.c);
+
+    if( newsize <= size )
+       return p; /* It is easier not to shrink the memory.  */
+    a = secmem_malloc( newsize );
+    if ( a ) {
+        memcpy(a, p, size);
+        memset((char*)a+size, 0, newsize-size);
+        secmem_free(p);
+    }
+    return a;
+}
+
+
+void
+secmem_free( void *a )
+{
+    MEMBLOCK *mb;
+    size_t size;
+
+    if( !a )
+       return;
+
+    mb = (MEMBLOCK*)((char*)a - ((size_t) &((MEMBLOCK*)0)->u.aligned.c));
+    size = mb->size;
+    /* This does not make much sense: probably this memory is held in the
+     * cache. We do it anyway: */
+    wipememory2(mb, 0xff, size );
+    wipememory2(mb, 0xaa, size );
+    wipememory2(mb, 0x55, size );
+    wipememory2(mb, 0x00, size );
+    mb->size = size;
+    mb->u.next = unused_blocks;
+    unused_blocks = mb;
+    cur_blocks--;
+    cur_alloced -= size;
+}
+
+int
+m_is_secure( const void *p )
+{
+    return p >= pool && p < (void*)((char*)pool+poolsize);
+}
+
+
+
+/****************
+ * Warning:  This code might be called by an interrupt handler
+ *          and frankly, there should really be such a handler,
+ *          to make sure that the memory is wiped out.
+ *          We hope that the OS wipes out mlocked memory after
+ *          receiving a SIGKILL - it really should do so, otherwise
+ *          there is no chance to get the secure memory cleaned.
+ */
+void
+secmem_term()
+{
+    if( !pool_okay )
+       return;
+
+    wipememory2( pool, 0xff, poolsize);
+    wipememory2( pool, 0xaa, poolsize);
+    wipememory2( pool, 0x55, poolsize);
+    wipememory2( pool, 0x00, poolsize);
+#ifdef HAVE_MMAP
+    if( pool_is_mmapped )
+       munmap( pool, poolsize );
+#endif
+    pool = NULL;
+    pool_okay = 0;
+    poolsize=0;
+    poollen=0;
+    unused_blocks=NULL;
+}
+
+
+void
+secmem_dump_stats()
+{
+    if( disable_secmem )
+       return;
+    fprintf(stderr,
+               "secmem usage: %u/%u bytes in %u/%u blocks of pool %lu/%lu\n",
+               cur_alloced, max_alloced, cur_blocks, max_blocks,
+               (ulong)poollen, (ulong)poolsize );
+}
diff --git a/util/simple-gettext.c b/util/simple-gettext.c
new file mode 100644 (file)
index 0000000..3249775
--- /dev/null
@@ -0,0 +1,467 @@
+/* simple-gettext.c  - a simplified version of gettext.
+ * Copyright (C) 1995, 1996, 1997, 1999,
+ *               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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/* This is a simplified version of gettext written by Ulrich Drepper.
+ * It is used for the Win32 version of GnuPG beucase all the overhead
+ * of gettext is not needed and we have to do some special Win32 stuff.
+ * I decided that this is far easier than to tweak gettext for the special
+ * cases (I tried it but it is a lot of code). wk 15.09.99
+ */
+
+#include <config.h>
+#ifdef USE_SIMPLE_GETTEXT
+#if !defined (_WIN32) && !defined (__CYGWIN32__)
+#error This file can only be used under Windows or Cygwin32
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "types.h"
+#include "util.h"
+
+
+/* The magic number of the GNU message catalog format. */
+#define MAGIC        0x950412de
+#define MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format.  */
+#define MO_REVISION_NUMBER 0
+
+
+/* Header for binary .mo file format.  */
+struct mo_file_header
+{
+  /* The magic number. */
+  u32 magic;
+  /* The revision number of the file format.  */
+  u32 revision;
+  /* The number of strings pairs.  */
+  u32 nstrings;
+  /* Offset of table with start offsets of original strings.  */
+  u32 orig_tab_offset;
+  /* Offset of table with start offsets of translation strings.  */
+  u32 trans_tab_offset;
+  /* Size of hashing table.  */
+  u32 hash_tab_size;
+  /* Offset of first hashing entry.  */
+  u32 hash_tab_offset;
+};
+
+struct string_desc
+{
+  /* Length of addressed string.  */
+  u32 length;
+  /* Offset of string in file. */
+  u32 offset;
+};
+
+
+struct overflow_space_s
+{
+  struct overflow_space_s *next;
+  u32 idx;
+  char d[1];
+};
+
+struct loaded_domain
+{
+  char *data;
+  int must_swap;
+  u32 nstrings;
+  char *mapped;  /* 0 = not yet mapped, 1 = mapped,
+                    2 = mapped to
+                    overflow space */
+  struct overflow_space_s *overflow_space;
+  struct string_desc *orig_tab;
+  struct string_desc *trans_tab;
+  u32 hash_size;
+  u32 *hash_tab;
+};
+
+
+static struct loaded_domain *the_domain;
+
+static __inline__ u32
+do_swap_u32( u32 i )
+{
+  return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+
+#define SWAPIT(flag, data) ((flag) ? do_swap_u32(data) : (data) )
+
+
+/* We assume to have `unsigned long int' value with at least 32 bits.  */
+#define HASHWORDBITS 32
+
+/* The so called `hashpjw' function by P.J. Weinberger
+   [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+   1986, 1987 Bell Telephone Laboratories, Inc.]  */
+
+static __inline__ ulong
+hash_string( const char *str_param )
+{
+    unsigned long int hval, g;
+    const char *str = str_param;
+
+    hval = 0;
+    while (*str != '\0')
+    {
+       hval <<= 4;
+       hval += (unsigned long int) *str++;
+       g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+       if (g != 0)
+       {
+         hval ^= g >> (HASHWORDBITS - 8);
+         hval ^= g;
+       }
+    }
+    return hval;
+}
+
+
+static struct loaded_domain *
+load_domain( const char *filename )
+{
+    FILE *fp;
+    size_t size;
+    struct stat st;
+    struct mo_file_header *data = NULL;
+    struct loaded_domain *domain = NULL;
+    size_t to_read;
+    char *read_ptr;
+
+    fp = fopen( filename, "rb" );
+    if( !fp )
+       return NULL; /* can't open the file */
+    /* we must know about the size of the file */
+    if( fstat( fileno(fp ), &st )
+       || (size = (size_t)st.st_size) != st.st_size
+       || size < sizeof (struct mo_file_header) ) {
+       fclose( fp );
+       return NULL;
+    }
+
+    data = malloc( size );
+    if( !data ) {
+       fclose( fp );
+       return NULL; /* out of memory */
+    }
+
+    to_read = size;
+    read_ptr = (char *) data;
+    do {
+       long int nb = fread( read_ptr, 1, to_read, fp );
+       if( nb < to_read ) {
+           fclose (fp);
+           free(data);
+           return NULL; /* read error */
+       }
+       read_ptr += nb;
+       to_read -= nb;
+    } while( to_read > 0 );
+    fclose (fp);
+
+    /* Using the magic number we can test whether it really is a message
+     * catalog file.  */
+    if( data->magic != MAGIC && data->magic != MAGIC_SWAPPED ) {
+       /* The magic number is wrong: not a message catalog file.  */
+       free( data );
+       return NULL;
+    }
+
+    domain = calloc( 1, sizeof *domain );
+    if( !domain )  {
+       free( data );
+       return NULL;
+    }
+    domain->data = (char *) data;
+    domain->must_swap = data->magic != MAGIC;
+
+    /* Fill in the information about the available tables.  */
+    switch( SWAPIT(domain->must_swap, data->revision) ) {
+      case 0:
+       domain->nstrings = SWAPIT(domain->must_swap, data->nstrings);
+       domain->orig_tab = (struct string_desc *)
+         ((char *) data + SWAPIT(domain->must_swap, data->orig_tab_offset));
+       domain->trans_tab = (struct string_desc *)
+         ((char *) data + SWAPIT(domain->must_swap, data->trans_tab_offset));
+       domain->hash_size = SWAPIT(domain->must_swap, data->hash_tab_size);
+       domain->hash_tab = (u32 *)
+         ((char *) data + SWAPIT(domain->must_swap, data->hash_tab_offset));
+      break;
+
+      default: /* This is an invalid revision. */
+       free( data );
+       free( domain );
+       return NULL;
+    }
+
+    /* Allocate an array to keep track of code page mappings. */
+    domain->mapped = calloc( 1, domain->nstrings );
+    if( !domain->mapped ) {
+        free( data );
+        free( domain );
+        return NULL;
+    }
+
+    return domain;
+}
+
+
+/****************
+ * Set the file used for translations. Pass a NULL to disable
+ * translation.  A new filename may be set at anytime.  If REGKEY is
+ * not NULL, the function tries to selected the language the registry
+ * key "Lang" below that key.  WARNING: After changing the filename you
+ * should not access any data retrieved by gettext().
+ */
+int
+set_gettext_file ( const char *filename, const char *regkey )
+{
+    struct loaded_domain *domain = NULL;
+
+    if( filename && *filename ) {
+       if( filename[0] == '/'
+#ifdef HAVE_DRIVE_LETTERS
+           || ( isalpha(filename[0])
+                && filename[1] == ':'
+                && (filename[2] == '/' || filename[2] == '\\') )
+#endif
+          ) {
+           /* absolute path - use it as is */
+           domain = load_domain( filename );
+       }
+       else if (regkey) { /* Standard.  */
+            char *instdir, *langid, *fname;
+            char *p;
+
+            instdir = read_w32_registry_string ("HKEY_LOCAL_MACHINE",
+                                                regkey,
+                                                "Install Directory");
+            if (!instdir)
+                return -1;
+            langid = read_w32_registry_string (NULL, /* HKCU then HKLM */
+                                               regkey,
+                                               "Lang");
+            if (!langid) {
+                free (instdir);
+                return -1;
+            }
+            /* Strip stuff after a dot in case the user tried to enter
+             * the entire locale synatcs as usual for POSIX. */
+            p = strchr (langid, '.');
+            if (p)
+                *p = 0;
+                
+            /* Build the key: "<instdir>/<domain>.nls/<langid>.mo" We
+               use a directory below the installation directory with
+               the domain included in case the software has been
+               insalled with other software altogether at the same
+               place. */
+            fname = malloc (strlen (instdir) + 1 + strlen (filename) + 5
+                            + strlen (langid) + 3 + 1);
+            if (!fname) {
+                free (instdir);
+                free (langid);
+                return -1;
+            }
+            strcpy (stpcpy (stpcpy (stpcpy (stpcpy ( stpcpy (fname,
+                   instdir),"\\"), filename), ".nls\\"), langid), ".mo");
+            free (instdir);
+            free (langid);
+
+            /* Better make sure that we don't mix forward and
+               backward slashes.  It seems that some Windoze
+               versions don't accept this. */
+            for (p=fname; *p; p++) {
+                if (*p == '/')
+                    *p = '\\';
+            }
+            domain = load_domain (fname);
+            free(fname);
+       }
+
+       if (!domain)
+           return -1;
+    }
+
+    if( the_domain ) {
+        struct overflow_space_s *os, *os2;
+       free( the_domain->data );
+       free( the_domain->mapped );
+        for (os=the_domain->overflow_space; os; os = os2) {
+            os2 = os->next;
+            free (os);
+        }
+       free( the_domain );
+       the_domain = NULL;
+    }
+    the_domain = domain;
+    return 0;
+}
+
+
+static const char*
+get_string( struct loaded_domain *domain, u32 idx )
+{
+  struct overflow_space_s *os;
+  char *p;
+
+  p = domain->data + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset);
+  if (!domain->mapped[idx]) 
+    {
+      size_t plen, buflen;
+      char *buf;
+
+      domain->mapped[idx] = 1;
+
+      plen = strlen (p);
+      buf = utf8_to_native (p, plen, -1);
+      buflen = strlen (buf);
+      if (buflen <= plen)
+        strcpy (p, buf);
+      else
+        {
+          /* There is not enough space for the translation - store it
+             in the overflow_space else and mark that in the mapped
+             array.  Because we expect that this won't happen too
+             often, we use a simple linked list.  */
+          os = malloc (sizeof *os + buflen);
+          if (os)
+            {
+              os->idx = idx;
+              strcpy (os->d, buf);
+              os->next = domain->overflow_space;
+              domain->overflow_space = os;
+              p = os->d;
+            }
+          else
+            p = "ERROR in GETTEXT MALLOC";
+        }
+      xfree (buf);
+    }
+  else if (domain->mapped[idx] == 2) 
+    { /* We need to get the string from the overflow_space. */
+      for (os=domain->overflow_space; os; os = os->next)
+        if (os->idx == idx)
+          return (const char*)os->d;
+      p = "ERROR in GETTEXT\n";
+    }
+  return (const char*)p;
+}
+
+
+
+const char *
+gettext( const char *msgid )
+{
+    struct loaded_domain *domain;
+    size_t act = 0;
+    size_t top, bottom;
+
+    if( !(domain = the_domain) )
+       goto not_found;
+
+    /* Locate the MSGID and its translation.  */
+    if( domain->hash_size > 2 && domain->hash_tab ) {
+       /* Use the hashing table.  */
+       u32 len = strlen (msgid);
+       u32 hash_val = hash_string (msgid);
+       u32 idx = hash_val % domain->hash_size;
+       u32 incr = 1 + (hash_val % (domain->hash_size - 2));
+       u32 nstr = SWAPIT (domain->must_swap, domain->hash_tab[idx]);
+
+       if ( !nstr ) /* Hash table entry is empty.  */
+           goto not_found;
+
+       if( SWAPIT(domain->must_swap,
+                   domain->orig_tab[nstr - 1].length) == len
+           && !strcmp( msgid,
+                      domain->data + SWAPIT(domain->must_swap,
+                                   domain->orig_tab[nstr - 1].offset)) )
+           return get_string( domain, nstr - 1 );
+
+       for(;;) {
+           if (idx >= domain->hash_size - incr)
+               idx -= domain->hash_size - incr;
+           else
+               idx += incr;
+
+           nstr = SWAPIT(domain->must_swap, domain->hash_tab[idx]);
+           if( !nstr )
+               goto not_found; /* Hash table entry is empty.  */
+
+           if ( SWAPIT(domain->must_swap,
+                               domain->orig_tab[nstr - 1].length) == len
+                && !strcmp (msgid,
+                        domain->data + SWAPIT(domain->must_swap,
+                                          domain->orig_tab[nstr - 1].offset)))
+               return get_string( domain, nstr-1 );
+       }
+       /* NOTREACHED */
+    }
+
+    /* Now we try the default method:  binary search in the sorted
+       array of messages.  */
+    bottom = 0;
+    top = domain->nstrings;
+    while( bottom < top ) {
+       int cmp_val;
+
+       act = (bottom + top) / 2;
+       cmp_val = strcmp(msgid, domain->data
+                              + SWAPIT(domain->must_swap,
+                                       domain->orig_tab[act].offset));
+       if (cmp_val < 0)
+           top = act;
+       else if (cmp_val > 0)
+           bottom = act + 1;
+       else
+           return get_string( domain, act );
+    }
+
+  not_found:
+    return msgid;
+}
+
+#if 0
+       unsigned int cp1, cp2;
+
+       cp1 = GetConsoleCP();
+       cp2 = GetConsoleOutputCP();
+
+       log_info("InputCP=%u  OutputCP=%u\n", cp1, cp2 );
+
+       if( !SetConsoleOutputCP( 1252 ) )
+            log_info("SetConsoleOutputCP failed: %s\n", w32_strerror (0));
+
+       cp1 = GetConsoleCP();
+       cp2 = GetConsoleOutputCP();
+       log_info("InputCP=%u  OutputCP=%u after switch1\n", cp1, cp2 );
+#endif
+
+#endif /* USE_SIMPLE_GETTEXT */
diff --git a/util/srv.c b/util/srv.c
new file mode 100644 (file)
index 0000000..95187db
--- /dev/null
@@ -0,0 +1,257 @@
+/* srv.c - DNS SRV code
+ * Copyright (C) 2003 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <sys/types.h>
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#endif
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "memory.h"
+#include "types.h"
+#include "srv.h"
+
+/* Not every installation has gotten around to supporting SRVs
+   yet... */
+#ifndef T_SRV
+#define T_SRV 33
+#endif
+
+static int
+priosort(const void *a,const void *b)
+{
+  const struct srventry *sa=a,*sb=b;
+  if(sa->priority>sb->priority)
+    return 1;
+  else if(sa->priority<sb->priority)
+    return -1;
+  else
+    return 0;
+}
+
+int
+getsrv(const char *name,struct srventry **list)
+{
+  unsigned char answer[PACKETSZ];
+  int r,srvcount=0;
+  unsigned char *pt,*emsg;
+  u16 count,dlen;
+
+  *list=NULL;
+
+  r=res_query(name,C_IN,T_SRV,answer,PACKETSZ);
+  if(r<sizeof(HEADER) || r>PACKETSZ)
+    return -1;
+
+  if((((HEADER *)answer)->rcode)==NOERROR &&
+     (count=ntohs(((HEADER *)answer)->ancount)))
+    {
+      int i,rc;
+
+      emsg=&answer[r];
+      pt=&answer[sizeof(HEADER)];
+
+      /* Skip over the query */
+
+      rc=dn_skipname(pt,emsg);
+      if(rc==-1)
+       goto fail;
+
+      pt+=rc+QFIXEDSZ;
+
+      while(count-->0 && pt<emsg)
+       {
+         struct srventry *srv=NULL;
+         u16 type,class;
+
+         *list=xrealloc(*list,(srvcount+1)*sizeof(struct srventry));
+         memset(&(*list)[srvcount],0,sizeof(struct srventry));
+         srv=&(*list)[srvcount];
+         srvcount++;
+
+         rc=dn_skipname(pt,emsg); /* the name we just queried for */
+         if(rc==-1)
+           goto fail;
+         pt+=rc;
+
+         /* Truncated message? */
+         if((emsg-pt)<16)
+           goto fail;
+
+         type=*pt++ << 8;
+         type|=*pt++;
+         /* We asked for SRV and got something else !? */
+         if(type!=T_SRV)
+           goto fail;
+
+         class=*pt++ << 8;
+         class|=*pt++;
+         /* We asked for IN and got something else !? */
+         if(class!=C_IN)
+           goto fail;
+
+         pt+=4; /* ttl */
+         dlen=*pt++ << 8;
+         dlen|=*pt++;
+         srv->priority=*pt++ << 8;
+         srv->priority|=*pt++;
+         srv->weight=*pt++ << 8;
+         srv->weight|=*pt++;
+         srv->port=*pt++ << 8;
+         srv->port|=*pt++;
+
+         /* Get the name.  2782 doesn't allow name compression, but
+            dn_expand still works to pull the name out of the
+            packet. */
+         rc=dn_expand(answer,emsg,pt,srv->target,MAXDNAME);
+         if(rc==1 && srv->target[0]==0) /* "." */
+           goto noanswer;
+         if(rc==-1)
+           goto fail;
+         pt+=rc;
+         /* Corrupt packet? */
+         if(dlen!=rc+6)
+           goto fail;
+
+#if 0
+         printf("count=%d\n",srvcount);
+         printf("priority=%d\n",srv->priority);
+         printf("weight=%d\n",srv->weight);
+         printf("port=%d\n",srv->port);
+         printf("target=%s\n",srv->target);
+#endif
+       }
+
+      /* Now we have an array of all the srv records. */
+
+      /* Order by priority */
+      qsort(*list,srvcount,sizeof(struct srventry),priosort);
+
+      /* For each priority, move the zero-weighted items first. */
+      for(i=0;i<srvcount;i++)
+       {
+         int j;
+
+         for(j=i;j<srvcount && (*list)[i].priority==(*list)[j].priority;j++)
+           {
+             if((*list)[j].weight==0)
+               {
+                 /* Swap j with i */
+                 if(j!=i)
+                   {
+                     struct srventry temp;
+
+                     memcpy(&temp,&(*list)[j],sizeof(struct srventry));
+                     memcpy(&(*list)[j],&(*list)[i],sizeof(struct srventry));
+                     memcpy(&(*list)[i],&temp,sizeof(struct srventry));
+                   }
+
+                 break;
+               }
+           }
+       }
+
+      /* Run the RFC-2782 weighting algorithm.  We don't need very
+        high quality randomness for this, so regular libc srand/rand
+        is sufficient. */
+      srand(time(NULL)*getpid());
+
+      for(i=0;i<srvcount;i++)
+       {
+         int j;
+         float prio_count=0,chose;
+
+         for(j=i;j<srvcount && (*list)[i].priority==(*list)[j].priority;j++)
+           {
+             prio_count+=(*list)[j].weight;
+             (*list)[j].run_count=prio_count;
+           }
+
+         chose=prio_count*rand()/RAND_MAX;
+
+         for(j=i;j<srvcount && (*list)[i].priority==(*list)[j].priority;j++)
+           {
+             if(chose<=(*list)[j].run_count)
+               {
+                 /* Swap j with i */
+                 if(j!=i)
+                   {
+                     struct srventry temp;
+
+                     memcpy(&temp,&(*list)[j],sizeof(struct srventry));
+                     memcpy(&(*list)[j],&(*list)[i],sizeof(struct srventry));
+                     memcpy(&(*list)[i],&temp,sizeof(struct srventry));
+                   }
+                 break;
+               }
+           }
+       }
+    }
+  
+  return srvcount;
+
+ noanswer:
+  xfree(*list);
+  *list=NULL;
+  return 0;
+
+ fail:
+  xfree(*list);
+  *list=NULL;
+  return -1;
+}
+
+#ifdef TEST
+int
+main(int argc,char *argv[])
+{
+  struct srventry *srv;
+  int rc,i;
+
+  rc=getsrv("_hkp._tcp.wwwkeys.pgp.net",&srv);
+  printf("Count=%d\n\n",rc);
+  for(i=0;i<rc;i++)
+    {
+      printf("priority=%d\n",srv[i].priority);
+      printf("weight=%d\n",srv[i].weight);
+      printf("port=%d\n",srv[i].port);
+      printf("target=%s\n",srv[i].target);
+      printf("\n");
+    }
+
+  xfree(srv);
+
+  return 0;
+}
+#endif /* TEST */
+
+/*
+Local Variables:
+compile-command: "cc -DTEST -I.. -I../include -Wall -g -o srv srv.c -lresolv libutil.a"
+End:
+*/
diff --git a/util/srv.h b/util/srv.h
new file mode 100644 (file)
index 0000000..a81ebd5
--- /dev/null
@@ -0,0 +1,51 @@
+/* srv.h
+ * Copyright (C) 2003, 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#ifndef _SRV_H_
+#define _SRV_H_
+
+#ifdef USE_DNS_SRV
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#endif /* !_WIN32 */
+#endif /* USE_DNS_SRV */
+#include "types.h"
+
+#ifndef MAXDNAME
+#define MAXDNAME 1025
+#endif
+
+struct srventry
+{
+  u16 priority;
+  u16 weight;
+  u16 port;
+  int run_count;
+  char target[MAXDNAME];
+};
+
+int getsrv(const char *name,struct srventry **list);
+
+#endif /* !_SRV_H_ */
diff --git a/util/strgutil.c b/util/strgutil.c
new file mode 100644 (file)
index 0000000..95cb0f2
--- /dev/null
@@ -0,0 +1,1323 @@
+/* strgutil.c -  string utilities
+ * Copyright (C) 1994, 1998, 1999, 2000, 2001,
+ *               2003, 2004, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#ifdef HAVE_LANGINFO_CODESET
+#include <langinfo.h>
+#endif
+
+/* For W32 we use dynamic loading of the iconv dll and don't need any
+ * iconv headers at all. */
+#ifndef _WIN32
+# ifndef HAVE_ICONV
+#  undef USE_GNUPG_ICONV
+# endif
+#endif
+
+#ifdef USE_GNUPG_ICONV
+# include <limits.h>
+# ifndef _WIN32
+#  include <iconv.h>
+# endif
+#endif
+
+#include "types.h"
+#include "util.h"
+#include "memory.h"
+#include "i18n.h"
+#include "dynload.h"
+
+
+#ifndef USE_GNUPG_ICONV
+static ushort koi8_unicode[128] = {
+    0x2500,0x2502,0x250c,0x2510,0x2514,0x2518,0x251c,0x2524,
+    0x252c,0x2534,0x253c,0x2580,0x2584,0x2588,0x258c,0x2590,
+    0x2591,0x2592,0x2593,0x2320,0x25a0,0x2219,0x221a,0x2248,
+    0x2264,0x2265,0x00a0,0x2321,0x00b0,0x00b2,0x00b7,0x00f7,
+    0x2550,0x2551,0x2552,0x0451,0x2553,0x2554,0x2555,0x2556,
+    0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,
+    0x255f,0x2560,0x2561,0x0401,0x2562,0x2563,0x2564,0x2565,
+    0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x00a9,
+    0x044e,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433,
+    0x0445,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,
+    0x043f,0x044f,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432,
+    0x044c,0x044b,0x0437,0x0448,0x044d,0x0449,0x0447,0x044a,
+    0x042e,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413,
+    0x0425,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,
+    0x041f,0x042f,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412,
+    0x042c,0x042b,0x0417,0x0428,0x042d,0x0429,0x0427,0x042a
+};
+
+static ushort latin2_unicode[128] = {
+    0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
+    0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
+    0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
+    0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
+    0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7,
+    0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B,
+    0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7,
+    0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C,
+    0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,
+    0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
+    0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,
+    0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
+    0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,
+    0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
+    0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,
+    0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9
+};
+#endif /*!USE_GNUPG_ICONV*/
+
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 16
+#endif
+
+
+static const char *active_charset_name = "iso-8859-1";
+static ushort *active_charset = NULL;
+static int no_translation = 0;
+static int use_iconv = 0;
+
+
+#ifdef _WIN32
+typedef void* iconv_t;
+#ifndef ICONV_CONST
+#define ICONV_CONST const 
+#endif
+
+iconv_t (* __stdcall iconv_open) (const char *tocode, const char *fromcode);
+size_t  (* __stdcall iconv) (iconv_t cd,
+                             const char **inbuf, size_t *inbytesleft,
+                             char **outbuf, size_t *outbytesleft);
+int     (* __stdcall iconv_close) (iconv_t cd);
+
+#endif /*_WIN32*/
+
+
+
+#ifdef _WIN32
+static int 
+load_libiconv (void)
+{
+  static int done;
+  
+  if (!done)
+    {
+      void *handle;
+
+      done = 1; /* Do it right now because we might get called recursivly
+                   through gettext.  */
+    
+      handle = dlopen ("iconv.dll", RTLD_LAZY);
+      if (handle)
+        {
+          iconv_open  = dlsym (handle, "libiconv_open");
+          if (iconv_open)
+            iconv      = dlsym (handle, "libiconv");
+          if (iconv)    
+            iconv_close = dlsym (handle, "libiconv_close");
+        }
+      if (!handle || !iconv_close)
+        {
+          log_info (_("error loading `%s': %s\n"),
+                     "iconv.dll",  dlerror ());
+          log_info(_("please see http://www.gnupg.org/download/iconv.html "
+                     "for more information\n"));
+          iconv_open = NULL;
+          iconv = NULL;
+          iconv_close = NULL;
+          if (handle)
+              dlclose (handle);
+        }
+    }
+  return iconv_open? 0: -1;
+}    
+#endif /* _WIN32 */
+
+
+
+
+void
+free_strlist( STRLIST sl )
+{
+    STRLIST sl2;
+
+    for(; sl; sl = sl2 ) {
+       sl2 = sl->next;
+       xfree(sl);
+    }
+}
+
+
+STRLIST
+add_to_strlist( STRLIST *list, const char *string )
+{
+    STRLIST sl;
+
+    sl = xmalloc( sizeof *sl + strlen(string));
+    sl->flags = 0;
+    strcpy(sl->d, string);
+    sl->next = *list;
+    *list = sl;
+    return sl;
+}
+
+/****************
+ * Same as add_to_strlist() but if is_utf8 is *not* set a conversion
+ * to UTF8 is done
+ */
+STRLIST
+add_to_strlist2( STRLIST *list, const char *string, int is_utf8 )
+{
+    STRLIST sl;
+
+    if( is_utf8 )
+       sl = add_to_strlist( list, string );
+    else {
+       char *p = native_to_utf8( string );
+       sl = add_to_strlist( list, p );
+       xfree( p );
+    }
+    return sl;
+}
+
+STRLIST
+append_to_strlist( STRLIST *list, const char *string )
+{
+    STRLIST r, sl;
+
+    sl = xmalloc( sizeof *sl + strlen(string));
+    sl->flags = 0;
+    strcpy(sl->d, string);
+    sl->next = NULL;
+    if( !*list )
+       *list = sl;
+    else {
+       for( r = *list; r->next; r = r->next )
+           ;
+       r->next = sl;
+    }
+    return sl;
+}
+
+STRLIST
+append_to_strlist2( STRLIST *list, const char *string, int is_utf8 )
+{
+    STRLIST sl;
+
+    if( is_utf8 )
+       sl = append_to_strlist( list, string );
+    else {
+       char *p = native_to_utf8( string );
+       sl = append_to_strlist( list, p );
+       xfree( p );
+    }
+    return sl;
+}
+
+
+STRLIST
+strlist_prev( STRLIST head, STRLIST node )
+{
+    STRLIST n;
+
+    for(n=NULL; head && head != node; head = head->next )
+       n = head;
+    return n;
+}
+
+STRLIST
+strlist_last( STRLIST node )
+{
+    if( node )
+       for( ; node->next ; node = node->next )
+           ;
+    return node;
+}
+
+char *
+pop_strlist( STRLIST *list )
+{
+  char *str=NULL;
+  STRLIST sl=*list;
+
+  if(sl)
+    {
+      str=xmalloc(strlen(sl->d)+1);
+      strcpy(str,sl->d);
+
+      *list=sl->next;
+      xfree(sl);
+    }
+
+  return str;
+}
+
+/****************
+ * Look for the substring SUB in buffer and return a pointer to that
+ * substring in BUF or NULL if not found.
+ * Comparison is case-insensitive.
+ */
+const char *
+memistr( const char *buf, size_t buflen, const char *sub )
+{
+    const byte *t, *s ;
+    size_t n;
+
+    for( t=buf, n=buflen, s=sub ; n ; t++, n-- )
+       if( toupper(*t) == toupper(*s) ) {
+           for( buf=t++, buflen = n--, s++;
+                n && toupper(*t) == toupper(*s); t++, s++, n-- )
+               ;
+           if( !*s )
+               return buf;
+           t = buf; n = buflen; s = sub ;
+       }
+
+    return NULL ;
+}
+
+const char *
+ascii_memistr( const char *buf, size_t buflen, const char *sub )
+{
+    const byte *t, *s ;
+    size_t n;
+
+    for( t=buf, n=buflen, s=sub ; n ; t++, n-- )
+       if( ascii_toupper(*t) == ascii_toupper(*s) ) {
+           for( buf=t++, buflen = n--, s++;
+                n && ascii_toupper(*t) == ascii_toupper(*s); t++, s++, n-- )
+               ;
+           if( !*s )
+               return buf;
+           t = buf; n = buflen; s = sub ;
+       }
+
+    return NULL ;
+}
+
+
+/* Like strncpy() but copy at max N-1 bytes and append a '\0'.  With
+ * N given as 0 nothing is copied at all. With DEST given as NULL
+ * sufficient memory is allocated using xmalloc (note that xmalloc is
+ * guaranteed to succeed or to abort the process).  */
+char *
+mem2str( char *dest , const void *src , size_t n )
+{
+    char *d;
+    const char *s;
+
+    if( n ) {
+       if( !dest )
+           dest = xmalloc( n ) ;
+       d = dest;
+       s = src ;
+       for(n--; n && *s; n-- )
+           *d++ = *s++;
+       *d = '\0' ;
+    }
+
+    return dest ;
+}
+
+
+/*
+ * Remove leading and trailing white spaces
+ */
+char *
+trim_spaces( char *str )
+{
+    char *string, *p, *mark;
+
+    string = str;
+    /* Find first non space character. */
+    for( p=string; *p && isspace( *(byte*)p ) ; p++ )
+       ;
+    /* Move characters. */
+    for( (mark = NULL); (*string = *p); string++, p++ )
+       if( isspace( *(byte*)p ) ) {
+           if( !mark )
+               mark = string ;
+       }
+       else
+           mark = NULL ;
+    if( mark )
+       *mark = '\0' ;  /* Remove trailing spaces.  */
+
+    return str ;
+}
+
+
+
+unsigned int
+trim_trailing_chars( byte *line, unsigned len, const char *trimchars )
+{
+    byte *p, *mark;
+    unsigned n;
+
+    for(mark=NULL, p=line, n=0; n < len; n++, p++ ) {
+       if( strchr(trimchars, *p ) ) {
+           if( !mark )
+               mark = p;
+       }
+       else
+           mark = NULL;
+    }
+
+    if( mark ) {
+       *mark = 0;
+       return mark - line;
+    }
+    return len;
+}
+
+/****************
+ * Remove trailing white spaces and return the length of the buffer
+ */
+unsigned
+trim_trailing_ws( byte *line, unsigned len )
+{
+    return trim_trailing_chars( line, len, " \t\r\n" );
+}
+
+
+unsigned int
+check_trailing_chars( const byte *line, unsigned int len,
+                      const char *trimchars )
+{
+    const byte *p, *mark;
+    unsigned int n;
+
+    for(mark=NULL, p=line, n=0; n < len; n++, p++ ) {
+       if( strchr(trimchars, *p ) ) {
+           if( !mark )
+               mark = p;
+       }
+       else
+           mark = NULL;
+    }
+
+    if( mark ) {
+       return mark - line;
+    }
+    return len;
+}
+
+
+/****************
+ * Remove trailing white spaces and return the length of the buffer
+ */
+unsigned int
+check_trailing_ws( const byte *line, unsigned int len )
+{
+    return check_trailing_chars( line, len, " \t\r\n" );
+}
+
+
+
+int
+string_count_chr( const char *string, int c )
+{
+    int count;
+    for(count=0; *string; string++ )
+       if( *string == c )
+           count++;
+    return count;
+}
+
+#ifdef USE_GNUPG_ICONV
+static void
+handle_iconv_error (const char *to, const char *from, int use_fallback)
+{
+  if (errno == EINVAL)
+    {
+      static int shown1, shown2;
+      int x;
+
+      if (to && !strcmp (to, "utf-8"))
+        {
+          x = shown1;
+          shown1 = 1;
+        }
+      else
+        {
+          x = shown2;
+          shown2 = 1;
+        }
+
+      if (!x)
+        log_info (_("conversion from `%s' to `%s' not available\n"),
+                  from, to);
+    }
+  else
+    {
+      static int shown;
+
+      if (!shown)
+        log_info (_("iconv_open failed: %s\n"), strerror (errno));
+      shown = 1;
+    }
+
+  if (use_fallback)
+    {
+      /* To avoid further error messages we fallback to Latin-1 for the
+         native encoding.  This is justified as one can expect that on a
+         utf-8 enabled system nl_langinfo() will work and thus we won't
+         never get to here.  Thus Latin-1 seems to be a reasonable
+         default.  */
+      active_charset_name = "iso-8859-1";
+      no_translation = 0;
+      active_charset = NULL;
+      use_iconv = 0;
+    }
+}
+#endif /*USE_GNUPG_ICONV*/
+
+int
+set_native_charset( const char *newset )
+{
+    const char *full_newset;
+
+    if (!newset) {
+#ifdef _WIN32
+        static char codepage[30];
+        unsigned int cpno;
+        const char *aliases;
+
+        /* We are a console program thus we need to use the
+           GetConsoleOutputCP function and not the the GetACP which
+           would give the codepage for a GUI program.  Note this is
+           not a bulletproof detection because GetConsoleCP might
+           return a different one for console input.  Not sure how to
+           cope with that.  If the console Code page is not known we
+           fall back to the system code page.  */
+        cpno = GetConsoleOutputCP ();
+        if (!cpno)
+          cpno = GetACP ();
+        sprintf (codepage, "CP%u", cpno );
+        /* Resolve alias.  We use a long string string and not the
+           usual array to optimize if the code is taken to a DSO.
+           Taken from libiconv 1.9.2. */
+        newset = codepage;
+        for (aliases = ("CP936"   "\0" "GBK" "\0"
+                        "CP1361"  "\0" "JOHAB" "\0"
+                        "CP20127" "\0" "ASCII" "\0"
+                        "CP20866" "\0" "KOI8-R" "\0"
+                        "CP21866" "\0" "KOI8-RU" "\0"
+                        "CP28591" "\0" "ISO-8859-1" "\0"
+                        "CP28592" "\0" "ISO-8859-2" "\0"
+                        "CP28593" "\0" "ISO-8859-3" "\0"
+                        "CP28594" "\0" "ISO-8859-4" "\0"
+                        "CP28595" "\0" "ISO-8859-5" "\0"
+                        "CP28596" "\0" "ISO-8859-6" "\0"
+                        "CP28597" "\0" "ISO-8859-7" "\0"
+                        "CP28598" "\0" "ISO-8859-8" "\0"
+                        "CP28599" "\0" "ISO-8859-9" "\0"
+                        "CP28605" "\0" "ISO-8859-15" "\0"
+                       "CP65001" "\0" "UTF-8" "\0");
+             *aliases;
+             aliases += strlen (aliases) + 1, aliases += strlen (aliases) + 1)
+          {
+            if (!strcmp (codepage, aliases) ||(*aliases == '*' && !aliases[1]))
+              {
+                newset = aliases + strlen (aliases) + 1;
+                break;
+              }
+          }
+
+#else
+#ifdef HAVE_LANGINFO_CODESET
+        newset = nl_langinfo (CODESET);
+#else /* !HAVE_LANGINFO_CODESET */
+        /* Try to get the used charset from environment variables.  */
+        static char codepage[30];
+        const char *lc, *dot, *mod;
+
+        strcpy (codepage, "iso-8859-1");
+        lc = getenv ("LC_ALL");
+        if (!lc || !*lc) {
+            lc = getenv ("LC_CTYPE");
+            if (!lc || !*lc)
+                lc = getenv ("LANG");
+        }
+        if (lc && *lc) {
+            dot = strchr (lc, '.');
+            if (dot) {
+                mod = strchr (++dot, '@');
+                if (!mod)
+                    mod = dot + strlen (dot);
+                if (mod - dot < sizeof codepage && dot != mod) {
+                    memcpy (codepage, dot, mod - dot);
+                    codepage [mod - dot] = 0;
+                }
+            }
+        }
+        newset = codepage;
+#endif  /* !HAVE_LANGINFO_CODESET */
+#endif
+    }
+
+    full_newset = newset;
+    if (strlen (newset) > 3 && !ascii_memcasecmp (newset, "iso", 3)) {
+        newset += 3;
+        if (*newset == '-' || *newset == '_')
+            newset++;
+    }
+
+    /* Note that we silently assume that plain ASCII is actually meant
+       as Latin-1.  This makes sense because many Unix system don't
+       have their locale set up properly and thus would get annoying
+       error messages and we have to handle all the "bug"
+       reports. Latin-1 has always been the character set used for 8
+       bit characters on Unix systems. */
+    if( !*newset
+        || !ascii_strcasecmp (newset, "8859-1" )
+        || !ascii_strcasecmp (newset, "646" )
+        || !ascii_strcasecmp (newset, "ASCII" )
+        || !ascii_strcasecmp (newset, "ANSI_X3.4-1968" )
+        ) {
+        active_charset_name = "iso-8859-1";
+        no_translation = 0;
+       active_charset = NULL;
+        use_iconv = 0;
+    }
+    else if( !ascii_strcasecmp (newset, "utf8" )
+             || !ascii_strcasecmp(newset, "utf-8") ) {
+       active_charset_name = "utf-8";
+        no_translation = 1;
+       active_charset = NULL;
+        use_iconv = 0;
+    }
+#ifdef USE_GNUPG_ICONV
+    else {
+      iconv_t cd;
+
+#ifdef _WIN32
+      if (load_libiconv ())
+          return G10ERR_GENERAL;
+#endif /*_WIN32*/      
+
+      cd = iconv_open (full_newset, "utf-8");
+      if (cd == (iconv_t)-1) {
+          handle_iconv_error (full_newset, "utf-8", 0);
+          return G10ERR_GENERAL;
+      }
+      iconv_close (cd);
+      cd = iconv_open ("utf-8", full_newset);
+      if (cd == (iconv_t)-1) {
+          handle_iconv_error ("utf-8", full_newset, 0);
+          return G10ERR_GENERAL;
+      }
+      iconv_close (cd);
+      active_charset_name = full_newset;
+      no_translation = 0;
+      active_charset = NULL; 
+      use_iconv = 1;
+    }
+#else /*!USE_GNUPG_ICONV*/
+    else if( !ascii_strcasecmp( newset, "8859-2" ) ) {
+       active_charset_name = "iso-8859-2";
+        no_translation = 0;
+       active_charset = latin2_unicode;
+        use_iconv = 0;
+    }
+    else if( !ascii_strcasecmp( newset, "koi8-r" ) ) {
+       active_charset_name = "koi8-r";
+        no_translation = 0;
+       active_charset = koi8_unicode;
+        use_iconv = 0;
+    }
+    else
+       return G10ERR_GENERAL;
+#endif /*!USE_GNUPG_ICONV*/
+    return 0;
+}
+
+const char*
+get_native_charset()
+{
+    return active_charset_name;
+}
+
+/****************
+ * Convert string, which is in native encoding to UTF8 and return the
+ * new allocated UTF8 string.
+ */
+char *
+native_to_utf8( const char *string )
+{
+  const byte *s;
+  char *buffer;
+  byte *p;
+  size_t length=0;
+  
+  if (no_translation)
+    { /* Already utf-8 encoded. */
+      buffer = xstrdup (string);
+    }
+  else if( !active_charset && !use_iconv) /* Shortcut implementation
+                                             for Latin-1.  */
+    { 
+      for(s=string; *s; s++ ) 
+        {
+          length++;
+          if( *s & 0x80 )
+            length++;
+       }
+      buffer = xmalloc( length + 1 );
+      for(p=buffer, s=string; *s; s++ )
+        {
+          if( *s & 0x80 )
+            {
+              *p++ = 0xc0 | ((*s >> 6) & 3);
+              *p++ = 0x80 | ( *s & 0x3f );
+            }
+          else
+            *p++ = *s;
+        }
+      *p = 0;
+    }
+  else       /* Need to use a translation table. */
+    { 
+#ifdef USE_GNUPG_ICONV
+      iconv_t cd;
+      const char *inptr;
+      char *outptr;
+      size_t inbytes, outbytes;
+     
+      cd = iconv_open ("utf-8", active_charset_name);
+      if (cd == (iconv_t)-1)
+        {
+          handle_iconv_error ("utf-8", active_charset_name, 1);
+          return native_to_utf8 (string);
+        }
+
+      for (s=string; *s; s++ ) 
+        {
+          length++;
+          if ((*s & 0x80))
+            length += 5; /* We may need up to 6 bytes for the utf8 output. */
+        }
+      buffer = xmalloc (length + 1);
+
+      inptr = string;
+      inbytes = strlen (string);
+      outptr = buffer;
+      outbytes = length;
+      if ( iconv (cd, (ICONV_CONST char **)&inptr, &inbytes,
+                  &outptr, &outbytes) == (size_t)-1)
+        {
+          static int shown;
+
+          if (!shown)
+            log_info (_("conversion from `%s' to `%s' failed: %s\n"),
+                      active_charset_name, "utf-8", strerror (errno));
+          shown = 1;
+          /* We don't do any conversion at all but use the strings as is. */
+          strcpy (buffer, string);
+        }
+      else /* Success.  */
+        {
+          *outptr = 0;
+          /* We could realloc the buffer now but I doubt that it makes
+             much sense given that it will get freed anyway soon
+             after.  */
+        }
+      iconv_close (cd);
+
+#else /*!USE_GNUPG_ICONV*/
+      for(s=string; *s; s++ ) 
+        {
+          length++;
+          if( *s & 0x80 )
+            length += 2; /* We may need up to 3 bytes. */
+        }
+      buffer = xmalloc( length + 1 );
+      for(p=buffer, s=string; *s; s++ ) {
+        if( *s & 0x80 ) {
+          ushort val = active_charset[ *s & 0x7f ];
+          if( val < 0x0800 ) {
+            *p++ = 0xc0 | ( (val >> 6) & 0x1f );
+            *p++ = 0x80 | (  val & 0x3f );
+          }
+          else {
+            *p++ = 0xe0 | ( (val >> 12) & 0x0f );
+            *p++ = 0x80 | ( (val >>  6) & 0x3f );
+            *p++ = 0x80 | (  val & 0x3f );
+          }
+        }
+        else
+          *p++ = *s;
+      }
+      *p = 0;
+#endif /*!USE_GNUPG_ICONV*/
+
+    }
+  return buffer;
+}
+
+
+/****************
+ * Convert string, which is in UTF8 to native encoding.  illegal
+ * encodings by some "\xnn" and quote all control characters. A
+ * character with value DELIM will always be quoted, it must be a
+ * vanilla ASCII character.  A DELIM value of -1 is special: it disables 
+ * all quoting of control characters.
+ */
+char *
+utf8_to_native( const char *string, size_t length, int delim )
+{
+    int nleft;
+    int i;
+    byte encbuf[8];
+    int encidx;
+    const byte *s;
+    size_t n;
+    byte *buffer = NULL, *p = NULL;
+    unsigned long val = 0;
+    size_t slen;
+    int resync = 0;
+
+    /* 1. pass (p==NULL): count the extended utf-8 characters */
+    /* 2. pass (p!=NULL): create string */
+    for( ;; ) {
+       for( slen=length, nleft=encidx=0, n=0, s=string; slen; s++, slen-- ) {
+           if( resync ) {
+               if( !(*s < 128 || (*s >= 0xc0 && *s <= 0xfd)) ) {
+                   /* still invalid */
+                   if( p ) {
+                       sprintf(p, "\\x%02x", *s );
+                       p += 4;
+                   }
+                   n += 4;
+                   continue;
+               }
+               resync = 0;
+           }
+           if( !nleft ) {
+               if( !(*s & 0x80) ) { /* plain ascii */
+                   if( delim != -1 
+                        && (*s < 0x20 || *s == 0x7f || *s == delim
+                            || (delim && *s=='\\'))) {
+                       n++;
+                       if( p )
+                           *p++ = '\\';
+                       switch( *s ) {
+                         case '\n': n++; if( p ) *p++ = 'n'; break;
+                         case '\r': n++; if( p ) *p++ = 'r'; break;
+                         case '\f': n++; if( p ) *p++ = 'f'; break;
+                         case '\v': n++; if( p ) *p++ = 'v'; break;
+                         case '\b': n++; if( p ) *p++ = 'b'; break;
+                         case   0 : n++; if( p ) *p++ = '0'; break;
+                         default:
+                            n += 3;
+                            if ( p ) {
+                                sprintf( p, "x%02x", *s );
+                                p += 3;
+                            }
+                            break;
+                       }
+                   }
+                   else {
+                       if( p ) *p++ = *s;
+                       n++;
+                   }
+               }
+               else if( (*s & 0xe0) == 0xc0 ) { /* 110x xxxx */
+                   val = *s & 0x1f;
+                   nleft = 1;
+                    encidx = 0;
+                   encbuf[encidx++] = *s;
+               }
+               else if( (*s & 0xf0) == 0xe0 ) { /* 1110 xxxx */
+                   val = *s & 0x0f;
+                   nleft = 2;
+                    encidx = 0;
+                   encbuf[encidx++] = *s;
+               }
+               else if( (*s & 0xf8) == 0xf0 ) { /* 1111 0xxx */
+                   val = *s & 0x07;
+                   nleft = 3;
+                    encidx = 0;
+                   encbuf[encidx++] = *s;
+               }
+               else if( (*s & 0xfc) == 0xf8 ) { /* 1111 10xx */
+                   val = *s & 0x03;
+                   nleft = 4;
+                    encidx = 0;
+                   encbuf[encidx++] = *s;
+               }
+               else if( (*s & 0xfe) == 0xfc ) { /* 1111 110x */
+                   val = *s & 0x01;
+                   nleft = 5;
+                    encidx = 0;
+                   encbuf[encidx++] = *s;
+               }
+               else {  /* invalid encoding: print as \xnn */
+                   if( p ) {
+                       sprintf(p, "\\x%02x", *s );
+                       p += 4;
+                   }
+                   n += 4;
+                   resync = 1;
+               }
+           }
+           else if( *s < 0x80 || *s >= 0xc0 ) { /* invalid */
+               if( p ) {
+                    for(i=0; i < encidx; i++ ) {
+                        sprintf(p, "\\x%02x", encbuf[i] );
+                        p += 4;
+                    }
+                   sprintf(p, "\\x%02x", *s );
+                   p += 4;
+               }
+               n += 4 + 4*encidx;
+               nleft = 0;
+                encidx = 0;
+               resync = 1;
+           }
+           else {
+               encbuf[encidx++] = *s;
+               val <<= 6;
+               val |= *s & 0x3f;
+               if( !--nleft ) { /* ready */
+                    if (no_translation) {
+                        if( p ) {
+                            for(i=0; i < encidx; i++ )
+                                *p++ = encbuf[i];
+                        }
+                        n += encidx;
+                        encidx = 0;
+                    }
+#ifdef USE_GNUPG_ICONV
+                    else if(use_iconv) {
+                        /* Our strategy for using iconv is a bit
+                         * strange but it better keeps compatibility
+                         * with previous versions in regard to how
+                         * invalid encodings are displayed.  What we
+                         * do is to keep the utf-8 as is and have the
+                         * real translation step then at the end.
+                         * Yes, I know that this is ugly.  However we
+                         * are short of the 1.4 release and for this
+                         * branch we should not mee too much around
+                         * with iconv things.  One reason for this is
+                         * that we don't know enough about non-GNU
+                         * iconv implementation and want to minimize
+                         * the risk of breaking the code on too many
+                         * platforms.  */
+                        if( p ) {
+                            for(i=0; i < encidx; i++ )
+                                *p++ = encbuf[i];
+                        }
+                        n += encidx;
+                        encidx = 0;
+                    }
+#endif /*USE_GNUPG_ICONV*/
+                   else if( active_charset ) { /* table lookup */
+                       for(i=0; i < 128; i++ ) {
+                           if( active_charset[i] == val )
+                               break;
+                       }
+                       if( i < 128 ) { /* we can print this one */
+                           if( p ) *p++ = i+128;
+                           n++;
+                       }
+                       else { /* we do not have a translation: print utf8 */
+                           if( p ) {
+                               for(i=0; i < encidx; i++ ) {
+                                   sprintf(p, "\\x%02x", encbuf[i] );
+                                   p += 4;
+                               }
+                           }
+                           n += encidx*4;
+                            encidx = 0;
+                       }
+                   }
+                   else { /* native set */
+                       if( val >= 0x80 && val < 256 ) {
+                           n++;    /* we can simply print this character */
+                           if( p ) *p++ = val;
+                       }
+                       else { /* we do not have a translation: print utf8 */
+                           if( p ) {
+                               for(i=0; i < encidx; i++ ) {
+                                   sprintf(p, "\\x%02x", encbuf[i] );
+                                   p += 4;
+                               }
+                           }
+                           n += encidx*4;
+                            encidx = 0;
+                       }
+                   }
+               }
+
+           }
+       }
+       if( !buffer ) { /* allocate the buffer after the first pass */
+           buffer = p = xmalloc( n + 1 );
+       }
+#ifdef USE_GNUPG_ICONV
+        else if(use_iconv) {
+            /* Note: See above for comments.  */
+            iconv_t cd;
+            const char *inptr;
+            char *outbuf, *outptr;
+            size_t inbytes, outbytes;
+            
+            *p = 0;  /* Terminate the buffer. */
+
+            cd = iconv_open (active_charset_name, "utf-8");
+            if (cd == (iconv_t)-1)
+                {
+                    handle_iconv_error (active_charset_name, "utf-8", 1);
+                    xfree (buffer);
+                    return utf8_to_native (string, length, delim);
+                }
+
+            /* Allocate a new buffer large enough to hold all possible
+             * encodings. */
+            n = p - buffer + 1;
+            inbytes = n - 1;;
+            inptr = buffer;
+            outbytes = n * MB_LEN_MAX;
+            if (outbytes / MB_LEN_MAX != n) 
+                BUG (); /* Actually an overflow. */
+            outbuf = outptr = xmalloc (outbytes);
+            if ( iconv (cd, (ICONV_CONST char **)&inptr, &inbytes,
+                        &outptr, &outbytes) == (size_t)-1) {
+                static int shown;
+                
+                if (!shown)
+                  log_info (_("conversion from `%s' to `%s' failed: %s\n"),
+                            "utf-8", active_charset_name, strerror (errno));
+                shown = 1;
+                /* Didn't worked out.  Temporary disable the use of
+                 * iconv and fall back to our old code. */
+                xfree (buffer);
+                buffer = NULL;
+                xfree (outbuf);
+                use_iconv = 0;
+                outbuf = utf8_to_native (string, length, delim);
+                use_iconv = 1;
+            }
+            else { /* Success.  */
+                *outptr = 0;
+                /* We could realloc the buffer now but I doubt that it makes
+                   much sense given that it will get freed anyway soon
+                   after.  */
+                xfree (buffer);
+            }
+            iconv_close (cd);
+            return outbuf;
+        }
+#endif /*USE_GNUPG_ICONV*/
+       else {
+           *p = 0; /* make a string */
+           return buffer;
+       }
+    }
+}
+
+/****************************************************
+ ******** locale insensitive ctype functions ********
+ ****************************************************/
+/* FIXME: replace them by a table lookup and macros */
+int
+ascii_isupper (int c)
+{
+    return c >= 'A' && c <= 'Z';
+}
+
+int
+ascii_islower (int c)
+{
+    return c >= 'a' && c <= 'z';
+}
+
+int 
+ascii_toupper (int c)
+{
+    if (c >= 'a' && c <= 'z')
+        c &= ~0x20;
+    return c;
+}
+
+int 
+ascii_tolower (int c)
+{
+    if (c >= 'A' && c <= 'Z')
+        c |= 0x20;
+    return c;
+}
+
+
+int
+ascii_strcasecmp (const char *a, const char *b)
+{
+  const unsigned char *p1 = (const unsigned char *)a;
+  const unsigned char *p2 = (const unsigned char *)b;
+  unsigned char c1, c2;
+
+  if (p1 == p2)
+    return 0;
+
+  do
+    {
+      c1 = ascii_tolower (*p1);
+      c2 = ascii_tolower (*p2);
+
+      if (c1 == '\0')
+       break;
+
+      ++p1;
+      ++p2;
+    }
+  while (c1 == c2);
+  
+  return c1 - c2;
+}
+
+int 
+ascii_strncasecmp (const char *a, const char *b, size_t n)
+{
+  const unsigned char *p1 = (const unsigned char *)a;
+  const unsigned char *p2 = (const unsigned char *)b;
+  unsigned char c1, c2;
+
+  if (p1 == p2 || !n )
+    return 0;
+
+  do
+    {
+      c1 = ascii_tolower (*p1);
+      c2 = ascii_tolower (*p2);
+
+      if ( !--n || c1 == '\0')
+       break;
+
+      ++p1;
+      ++p2;
+    }
+  while (c1 == c2);
+  
+  return c1 - c2;
+}
+
+
+int
+ascii_memcasecmp( const char *a, const char *b, size_t n )
+{
+    if (a == b)
+        return 0;
+    for ( ; n; n--, a++, b++ ) {
+       if( *a != *b  && ascii_toupper (*a) != ascii_toupper (*b) )
+            return *a == *b? 0 : (ascii_toupper (*a) - ascii_toupper (*b));
+    }
+    return 0;
+}
+
+
+
+/*********************************************
+ ********** missing string functions *********
+ *********************************************/
+
+#ifndef HAVE_STPCPY
+char *
+stpcpy(char *a,const char *b)
+{
+    while( *b )
+       *a++ = *b++;
+    *a = 0;
+
+    return (char*)a;
+}
+#endif
+
+#ifndef HAVE_STRLWR
+char *
+strlwr(char *s)
+{
+    char *p;
+    for(p=s; *p; p++ )
+       *p = tolower(*(unsigned char *)p);
+    return s;
+}
+#endif
+
+#ifndef HAVE_STRCASECMP
+int
+strcasecmp( const char *a, const char *b )
+{
+    for( ; *a && *b; a++, b++ ) {
+       if( *a != *b
+            && toupper(*(const byte *)a) != toupper(*(const byte *)b) )
+           break;
+    }
+    return *(const byte*)a - *(const byte*)b;
+}
+#endif
+
+#ifndef HAVE_STRNCASECMP
+int
+strncasecmp( const char *a, const char *b, size_t n )
+{
+    for( ; n && *a && *b; a++, b++, n--) {
+       if( *a != *b
+            && toupper(*(const byte *)a) != toupper(*(const byte *)b) )
+           break;
+    }
+    if (!n)
+      return 0;
+    return *(const byte*)a - *(const byte*)b;
+}
+#endif
+
+
+#ifdef _WIN32
+/* 
+ * Like vsprintf but provides a pointer to malloc'd storage, which
+ * must be freed by the caller (xfree).  Taken from libiberty as
+ * found in gcc-2.95.2 and a little bit modernized.
+ * FIXME: Write a new CRT for W32.
+ */
+int
+vasprintf (char **result, const char *format, va_list args)
+{
+  const char *p = format;
+  /* Add one to make sure that it is never zero, which might cause malloc
+     to return NULL.  */
+  int total_width = strlen (format) + 1;
+  va_list ap;
+
+  /* this is not really portable but works under Windows */
+  memcpy ( &ap, &args, sizeof (va_list));
+
+  while (*p != '\0')
+    {
+      if (*p++ == '%')
+       {
+         while (strchr ("-+ #0", *p))
+           ++p;
+         if (*p == '*')
+           {
+             ++p;
+             total_width += abs (va_arg (ap, int));
+           }
+         else
+            {
+              char *endp;  
+              total_width += strtoul (p, &endp, 10);
+              p = endp;
+            }
+         if (*p == '.')
+           {
+             ++p;
+             if (*p == '*')
+               {
+                 ++p;
+                 total_width += abs (va_arg (ap, int));
+               }
+             else
+                {
+                  char *endp;
+                  total_width += strtoul (p, &endp, 10);
+                  p = endp;
+                }
+           }
+         while (strchr ("hlL", *p))
+           ++p;
+         /* Should be big enough for any format specifier except %s
+             and floats.  */
+         total_width += 30;
+         switch (*p)
+           {
+           case 'd':
+           case 'i':
+           case 'o':
+           case 'u':
+           case 'x':
+           case 'X':
+           case 'c':
+             (void) va_arg (ap, int);
+             break;
+           case 'f':
+           case 'e':
+           case 'E':
+           case 'g':
+           case 'G':
+             (void) va_arg (ap, double);
+             /* Since an ieee double can have an exponent of 307, we'll
+                make the buffer wide enough to cover the gross case. */
+             total_width += 307;
+           
+           case 's':
+             total_width += strlen (va_arg (ap, char *));
+             break;
+           case 'p':
+           case 'n':
+             (void) va_arg (ap, char *);
+             break;
+           }
+       }
+    }
+  *result = xmalloc (total_width);
+  if (*result != NULL)
+    return vsprintf (*result, format, args);
+  else
+    return 0;
+}
+
+int
+asprintf (char **buf, const char *fmt, ...)
+{
+  int status;
+  va_list ap;
+
+  va_start (ap, fmt);
+  status = vasprintf (buf, fmt, ap);
+  va_end (ap);
+  return status;  
+}
+
+const char *
+w32_strerror (int w32_errno)
+{
+  static char strerr[256];
+  int ec = (int)GetLastError ();
+  
+  if (w32_errno == 0)
+    w32_errno = ec;
+  FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, w32_errno,
+                 MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+                 strerr, DIM (strerr)-1, NULL);
+  return strerr;    
+}
+#endif /*_WIN32*/
+
+
+
diff --git a/util/strsep.c b/util/strsep.c
new file mode 100644 (file)
index 0000000..dae7902
--- /dev/null
@@ -0,0 +1,48 @@
+#include <config.h>
+#include <string.h>
+
+/* code taken from glibc-2.2.1/sysdeps/generic/strsep.c */
+char *
+strsep (char **stringp, const char *delim)
+{
+  char *begin, *end;
+
+  begin = *stringp;
+  if (begin == NULL)
+    return NULL;
+
+  /* A frequent case is when the delimiter string contains only one
+     character.  Here we don't need to call the expensive `strpbrk'
+     function and instead work using `strchr'.  */
+  if (delim[0] == '\0' || delim[1] == '\0')
+    {
+      char ch = delim[0];
+
+      if (ch == '\0')
+        end = NULL;
+      else
+        {
+          if (*begin == ch)
+            end = begin;
+          else if (*begin == '\0')
+            end = NULL;
+          else
+            end = strchr (begin + 1, ch);
+        }
+    }
+  else
+    /* Find the end of the token.  */
+    end = strpbrk (begin, delim);
+
+  if (end)
+    {
+      /* Terminate the token and set *STRINGP past NUL character.  */
+      *end++ = '\0';
+      *stringp = end;
+    }
+  else
+    /* No more delimiters; this is the last token.  */
+    *stringp = NULL;
+
+  return begin;
+}
diff --git a/util/timegm.c b/util/timegm.c
new file mode 100644 (file)
index 0000000..3b7931e
--- /dev/null
@@ -0,0 +1,68 @@
+/* timegm.c - libc replacement function
+ * Copyright (C) 2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+/*
+  timegm() is a GNU function that might not be available everywhere.
+  It's basically the inverse of gmtime() - you give it a struct tm,
+  and get back a time_t.  It differs from mktime() in that it handles
+  the case where the struct tm is UTC and the local environment isn't.
+
+  Some BSDs don't handle the putenv("foo") case properly, so we use
+  unsetenv if the platform has it to remove environment variables.
+*/
+
+#include <config.h>
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+
+time_t
+timegm(struct tm *tm)
+{
+  time_t answer;
+  char *zone;
+
+  zone=getenv("TZ");
+  putenv("TZ=UTC");
+  tzset();
+  answer=mktime(tm);
+  if(zone)
+    {
+      char *old_zone;
+
+      old_zone=malloc(3+strlen(zone)+1);
+      if(old_zone)
+       {
+         strcpy(old_zone,"TZ=");
+         strcat(old_zone,zone);
+         putenv(old_zone);     
+       }
+    }
+  else
+#ifdef HAVE_UNSETENV
+    unsetenv("TZ");
+#else
+    putenv("TZ");
+#endif
+
+  tzset();
+  return answer;
+}
diff --git a/util/ttyio.c b/util/ttyio.c
new file mode 100644 (file)
index 0000000..97b160e
--- /dev/null
@@ -0,0 +1,629 @@
+/* ttyio.c -  tty i/O functions
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2004 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#ifdef HAVE_TCGETATTR
+#include <termios.h>
+#else
+#ifdef HAVE_TERMIO_H
+/* simulate termios with termio */
+#include <termio.h>
+#define termios termio
+#define tcsetattr ioctl
+#define TCSAFLUSH TCSETAF
+#define tcgetattr(A,B) ioctl(A,TCGETA,B)
+#define HAVE_TCGETATTR
+#endif
+#endif
+#ifdef _WIN32 /* use the odd Win32 functions */
+#include <windows.h>
+#ifdef HAVE_TCGETATTR
+#error windows and termios
+#endif
+#endif
+#include <errno.h>
+#include <ctype.h>
+#ifdef HAVE_LIBREADLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+#include "util.h"
+#include "memory.h"
+#include "ttyio.h"
+
+#define CONTROL_D ('D' - 'A' + 1)
+
+#ifdef _WIN32 /* use the odd Win32 functions */
+static struct {
+    HANDLE in, out;
+} con;
+#define DEF_INPMODE  (ENABLE_LINE_INPUT|ENABLE_ECHO_INPUT    \
+                                       |ENABLE_PROCESSED_INPUT )
+#define HID_INPMODE  (ENABLE_LINE_INPUT|ENABLE_PROCESSED_INPUT )
+#define DEF_OUTMODE  (ENABLE_WRAP_AT_EOL_OUTPUT|ENABLE_PROCESSED_OUTPUT)
+
+#else /* yeah, we have a real OS */
+static FILE *ttyfp = NULL;
+#endif
+
+static int initialized;
+static int last_prompt_len;
+static int batchmode;
+static int no_terminal;
+
+#ifdef HAVE_TCGETATTR
+    static struct termios termsave;
+    static int restore_termios;
+#endif
+
+
+
+/* This is a wrapper around ttyname so that we can use it even when
+   the standard streams are redirected.  It figures the name out the
+   first time and returns it in a statically allocated buffer. */
+const char *
+tty_get_ttyname (void)
+{
+  static char *name;
+
+  /* On a GNU system ctermid() always return /dev/tty, so this does
+     not make much sense - however if it is ever changed we do the
+     Right Thing now. */
+#ifdef HAVE_CTERMID
+  static int got_name;
+
+  if (!got_name)
+    {
+      const char *s;
+      s = ctermid (NULL);
+      if (s)
+        name = strdup (s);
+      got_name = 1;
+    }
+#endif
+  /* Assume the standard tty on memory error or when there is no
+     ctermid. */
+  return name? name : "/dev/tty";
+}
+
+
+#ifdef HAVE_TCGETATTR
+static void
+cleanup(void)
+{
+    if( restore_termios ) {
+       restore_termios = 0; /* do it prios in case it is interrupted again */
+       if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) )
+           log_error("tcsetattr() failed: %s\n", strerror(errno) );
+    }
+}
+#endif
+
+static void
+init_ttyfp(void)
+{
+    if( initialized )
+       return;
+
+#if defined(_WIN32)
+    {
+       SECURITY_ATTRIBUTES sa;
+
+       memset(&sa, 0, sizeof(sa));
+       sa.nLength = sizeof(sa);
+       sa.bInheritHandle = TRUE;
+       con.out = CreateFileA( "CONOUT$", GENERIC_READ|GENERIC_WRITE,
+                              FILE_SHARE_READ|FILE_SHARE_WRITE,
+                              &sa, OPEN_EXISTING, 0, 0 );
+       if( con.out == INVALID_HANDLE_VALUE )
+           log_fatal ("open(CONOUT$) failed: %s", w32_strerror (0));
+       memset(&sa, 0, sizeof(sa));
+       sa.nLength = sizeof(sa);
+       sa.bInheritHandle = TRUE;
+       con.in = CreateFileA( "CONIN$", GENERIC_READ|GENERIC_WRITE,
+                              FILE_SHARE_READ|FILE_SHARE_WRITE,
+                              &sa, OPEN_EXISTING, 0, 0 );
+       if (con.in == INVALID_HANDLE_VALUE)
+            log_fatal ("open(CONIN$) failed: %s", w32_strerror (0));
+    }
+    SetConsoleMode(con.in, DEF_INPMODE );
+    SetConsoleMode(con.out, DEF_OUTMODE );
+
+#elif defined(__EMX__)
+    ttyfp = stdout; /* Fixme: replace by the real functions: see wklib */
+#else
+    ttyfp = batchmode? stderr : fopen( tty_get_ttyname (), "r+");
+    if( !ttyfp ) {
+       log_error("cannot open `%s': %s\n",
+                  tty_get_ttyname (), strerror(errno) );
+       exit(2);
+    }
+#ifdef HAVE_LIBREADLINE
+    rl_catch_signals = 0;
+    rl_instream = rl_outstream = ttyfp;
+    rl_inhibit_completion = 1;
+#endif
+#endif
+#ifdef HAVE_TCGETATTR
+    atexit( cleanup );
+#endif
+    initialized = 1;
+}
+
+#ifdef HAVE_LIBREADLINE
+void
+tty_enable_completion(rl_completion_func_t *completer)
+{
+  if( no_terminal )
+    return;
+
+  if( !initialized )
+    init_ttyfp();
+
+  rl_attempted_completion_function=completer;
+  rl_inhibit_completion=0;
+}
+
+void
+tty_disable_completion(void)
+{
+  if( no_terminal )
+    return;
+
+  if( !initialized )
+    init_ttyfp();
+
+  rl_inhibit_completion=1;
+}
+#endif /*HAVE_LIBREADLINE*/
+
+int
+tty_batchmode( int onoff )
+{
+    int old = batchmode;
+    if( onoff != -1 )
+       batchmode = onoff;
+    return old;
+}
+
+int
+tty_no_terminal(int onoff)
+{
+    int old = no_terminal;
+    no_terminal = onoff ? 1 : 0;
+    return old;
+}
+
+void
+tty_printf( const char *fmt, ... )
+{
+    va_list arg_ptr;
+
+    if (no_terminal)
+       return;
+
+    if( !initialized )
+       init_ttyfp();
+
+    va_start( arg_ptr, fmt ) ;
+#ifdef _WIN32
+    {   
+        char *buf = NULL;
+        int n;
+       DWORD nwritten;
+
+       n = vasprintf(&buf, fmt, arg_ptr);
+       if( !buf )
+           log_bug("vasprintf() failed\n");
+        
+       if (!WriteConsoleA (con.out, buf, n, &nwritten, NULL))
+           log_fatal ("WriteConsole failed: %s", w32_strerror (0));
+       if( n != nwritten )
+           log_fatal ("WriteConsole failed: %d != %d\n", n, (int)nwritten );
+       last_prompt_len += n;
+        xfree (buf);
+    }
+#else
+    last_prompt_len += vfprintf(ttyfp,fmt,arg_ptr) ;
+    fflush(ttyfp);
+#endif
+    va_end(arg_ptr);
+}
+
+
+/* Same as tty_printf but if FP is not NULL, behave like the standard
+   fprintf. */
+void
+tty_fprintf (FILE *fp, const char *fmt, ... )
+{
+  va_list arg_ptr;
+
+  if (fp)
+    {
+      va_start (arg_ptr, fmt) ;
+      vfprintf (fp, fmt, arg_ptr );
+      va_end (arg_ptr);
+      return;
+    }
+
+  if (no_terminal)
+    return;
+
+  if( !initialized )
+    init_ttyfp();
+
+    va_start( arg_ptr, fmt ) ;
+#ifdef _WIN32
+    {   
+        char *buf = NULL;
+        int n;
+       DWORD nwritten;
+
+       n = vasprintf(&buf, fmt, arg_ptr);
+       if( !buf )
+           log_bug("vasprintf() failed\n");
+        
+       if (!WriteConsoleA (con.out, buf, n, &nwritten, NULL))
+           log_fatal ("WriteConsole failed: %s", w32_strerror (0));
+       if (n != nwritten)
+           log_fatal ("WriteConsole failed: %d != %d\n", n, (int)nwritten);
+       last_prompt_len += n;
+        xfree (buf);
+    }
+#else
+    last_prompt_len += vfprintf(ttyfp,fmt,arg_ptr) ;
+    fflush(ttyfp);
+#endif
+    va_end(arg_ptr);
+}
+
+
+/****************
+ * Print a string, but filter all control characters out.
+ */
+void
+tty_print_string( const byte *p, size_t n )
+{
+    if (no_terminal)
+       return;
+
+    if( !initialized )
+       init_ttyfp();
+
+#ifdef _WIN32
+    /* not so effective, change it if you want */
+    for( ; n; n--, p++ )
+       if( iscntrl( *p ) ) {
+           if( *p == '\n' )
+               tty_printf("\\n");
+           else if( !*p )
+               tty_printf("\\0");
+           else
+               tty_printf("\\x%02x", *p);
+       }
+       else
+           tty_printf("%c", *p);
+#else
+    for( ; n; n--, p++ )
+       if( iscntrl( *p ) ) {
+           putc('\\', ttyfp);
+           if( *p == '\n' )
+               putc('n', ttyfp);
+           else if( !*p )
+               putc('0', ttyfp);
+           else
+               fprintf(ttyfp, "x%02x", *p );
+       }
+       else
+           putc(*p, ttyfp);
+#endif
+}
+
+void
+tty_print_utf8_string2 (const byte *p, size_t n, size_t max_n )
+{
+    size_t i;
+    char *buf;
+
+    if (no_terminal)
+       return;
+
+    /* we can handle plain ascii simpler, so check for it first */
+    for(i=0; i < n; i++ ) {
+       if( p[i] & 0x80 )
+           break;
+    }
+    if( i < n ) {
+       buf = utf8_to_native( p, n, 0 );
+       if( max_n && (strlen( buf ) > max_n )) {
+           buf[max_n] = 0;
+       }
+       /*(utf8 conversion already does the control character quoting)*/
+       tty_printf("%s", buf );
+       xfree( buf );
+    }
+    else {
+       if( max_n && (n > max_n) ) {
+           n = max_n;
+       }
+       tty_print_string( p, n );
+    }
+}
+
+void
+tty_print_utf8_string( const byte *p, size_t n )
+{
+    tty_print_utf8_string2( p, n, 0 );
+}
+
+
+static char *
+do_get( const char *prompt, int hidden )
+{
+    char *buf;
+#ifndef __riscos__
+    byte cbuf[1];
+#endif
+    int c, n, i;
+
+    if( batchmode ) {
+       log_error("Sorry, we are in batchmode - can't get input\n");
+       exit(2);
+    }
+
+    if (no_terminal) {
+       log_error("Sorry, no terminal at all requested - can't get input\n");
+       exit(2);
+    }
+
+    if( !initialized )
+       init_ttyfp();
+
+    last_prompt_len = 0;
+    buf = xmalloc(n=50);
+    i = 0;
+
+#ifdef _WIN32 /* windoze version */
+    if( hidden )
+       SetConsoleMode(con.in, HID_INPMODE );
+
+    tty_printf( "%s", prompt );
+
+    for(;;) {
+       DWORD nread;
+
+       if (!ReadConsoleA (con.in, cbuf, 1, &nread, NULL))
+           log_fatal ("ReadConsole failed: %s", w32_strerror (0));
+       if( !nread )
+           continue;
+       if( *cbuf == '\n' )
+           break;
+
+       if( !hidden )
+           last_prompt_len++;
+       c = *cbuf;
+       if( c == '\t' )
+           c = ' ';
+       else if( c > 0xa0 )
+           ; /* we don't allow 0xa0, as this is a protected blank which may
+              * confuse the user */
+       else if( iscntrl(c) )
+           continue;
+       if( !(i < n-1) ) {
+           n += 50;
+           buf = xrealloc( buf, n );
+       }
+       buf[i++] = c;
+    }
+
+    if( hidden )
+       SetConsoleMode(con.in, DEF_INPMODE );
+
+#elif defined(__riscos__)
+    tty_printf( "%s", prompt );
+    do {
+        c = riscos_getchar();
+        if (c == 0xa || c == 0xd) { /* Return || Enter */
+            c = (int) '\n';
+        } else if (c == 0x8 || c == 0x7f) { /* Backspace || Delete */
+            if (i>0) {
+                i--;
+                if (!hidden) {
+                    last_prompt_len--;
+                    fputc(8, ttyfp);
+                    fputc(32, ttyfp);
+                    fputc(8, ttyfp);
+                    fflush(ttyfp);
+                }
+            } else {
+                fputc(7, ttyfp);
+                fflush(ttyfp);
+            }
+            continue;
+        } else if (c == (int) '\t') { /* Tab */
+            c = ' ';
+        } else if (c > 0xa0) {
+            ; /* we don't allow 0xa0, as this is a protected blank which may
+               * confuse the user */
+        } else if (iscntrl(c)) {
+            continue;
+        }
+        if(!(i < n-1)) {
+            n += 50;
+            buf = xrealloc(buf, n);
+        }
+        buf[i++] = c;
+        if (!hidden) {
+           last_prompt_len++;
+            fputc(c, ttyfp);
+            fflush(ttyfp);
+        }
+    } while (c != '\n');
+    i = (i>0) ? i-1 : 0;
+#else /* unix version */
+    if( hidden ) {
+#ifdef HAVE_TCGETATTR
+       struct termios term;
+
+       if( tcgetattr(fileno(ttyfp), &termsave) )
+           log_fatal("tcgetattr() failed: %s\n", strerror(errno) );
+       restore_termios = 1;
+       term = termsave;
+       term.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
+       if( tcsetattr( fileno(ttyfp), TCSAFLUSH, &term ) )
+           log_fatal("tcsetattr() failed: %s\n", strerror(errno) );
+#endif
+    }
+
+    tty_printf( "%s", prompt );
+
+    /* fixme: How can we avoid that the \n is echoed w/o disabling
+     * canonical mode - w/o this kill_prompt can't work */
+    while( read(fileno(ttyfp), cbuf, 1) == 1 && *cbuf != '\n' ) {
+       if( !hidden )
+           last_prompt_len++;
+       c = *cbuf;
+       if( c == CONTROL_D )
+           log_info("control d found\n");
+       if( c == '\t' )
+           c = ' ';
+       else if( c > 0xa0 )
+           ; /* we don't allow 0xa0, as this is a protected blank which may
+              * confuse the user */
+       else if( iscntrl(c) )
+           continue;
+       if( !(i < n-1) ) {
+           n += 50;
+           buf = xrealloc( buf, n );
+       }
+       buf[i++] = c;
+    }
+    if( *cbuf != '\n' ) {
+       buf[0] = CONTROL_D;
+       i = 1;
+    }
+
+
+    if( hidden ) {
+#ifdef HAVE_TCGETATTR
+       if( tcsetattr(fileno(ttyfp), TCSAFLUSH, &termsave) )
+           log_error("tcsetattr() failed: %s\n", strerror(errno) );
+       restore_termios = 0;
+#endif
+    }
+#endif /* end unix version */
+    buf[i] = 0;
+    return buf;
+}
+
+
+char *
+tty_get( const char *prompt )
+{
+#ifdef HAVE_LIBREADLINE
+    if (!batchmode && !no_terminal) {
+      char *line;
+      char *buf;
+
+      if( !initialized )
+       init_ttyfp();
+
+      last_prompt_len = 0;
+
+      line = readline (prompt?prompt:"");
+
+      /* We need to copy it to memory controlled by our malloc
+         implementations; further we need to convert an EOF to our
+         convention. */
+      buf = xmalloc(line? strlen(line)+1:2);
+      if (line)
+        {
+          strcpy (buf, line);
+          trim_spaces (buf);
+          if (strlen (buf) > 2 )
+            add_history (line); /* Note that we test BUF but add LINE. */
+          free (line);
+        }
+      else
+        {
+          buf[0] = CONTROL_D;
+          buf[1] = 0;
+        }
+      return buf;
+    }
+    else
+#endif /* HAVE_LIBREADLINE */
+      return do_get( prompt, 0 );
+}
+
+char *
+tty_get_hidden( const char *prompt )
+{
+    return do_get( prompt, 1 );
+}
+
+
+void
+tty_kill_prompt()
+{
+    if ( no_terminal )
+       return;
+
+    if( !initialized )
+       init_ttyfp();
+
+    if( batchmode )
+       last_prompt_len = 0;
+    if( !last_prompt_len )
+       return;
+#ifdef _WIN32
+    tty_printf("\r%*s\r", last_prompt_len, "");
+#else
+    {
+       int i;
+       putc('\r', ttyfp);
+       for(i=0; i < last_prompt_len; i ++ )
+           putc(' ', ttyfp);
+       putc('\r', ttyfp);
+       fflush(ttyfp);
+    }
+#endif
+    last_prompt_len = 0;
+}
+
+
+int
+tty_get_answer_is_yes( const char *prompt )
+{
+    int yes;
+    char *p = tty_get( prompt );
+    tty_kill_prompt();
+    yes = answer_is_yes(p);
+    xfree(p);
+    return yes;
+}
diff --git a/util/w32reg.c b/util/w32reg.c
new file mode 100644 (file)
index 0000000..f65c954
--- /dev/null
@@ -0,0 +1,181 @@
+/* w32reg.c -  MS-Windows Registry access
+ *     Copyright (C) 1999, 2002, 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+#include <config.h>
+#if defined (_WIN32) || defined (__CYGWIN32__)
+ /* This module is only used in this environment */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <windows.h>
+#include "util.h"
+#include "memory.h"
+
+static HKEY
+get_root_key(const char *root)
+{
+    HKEY root_key;
+       
+    if( !root )
+        root_key = HKEY_CURRENT_USER;
+    else if( !strcmp( root, "HKEY_CLASSES_ROOT" ) )
+       root_key = HKEY_CLASSES_ROOT;
+    else if( !strcmp( root, "HKEY_CURRENT_USER" ) )
+       root_key = HKEY_CURRENT_USER;
+    else if( !strcmp( root, "HKEY_LOCAL_MACHINE" ) )
+       root_key = HKEY_LOCAL_MACHINE;
+    else if( !strcmp( root, "HKEY_USERS" ) )
+       root_key = HKEY_USERS;
+    else if( !strcmp( root, "HKEY_PERFORMANCE_DATA" ) )
+       root_key = HKEY_PERFORMANCE_DATA;
+    else if( !strcmp( root, "HKEY_CURRENT_CONFIG" ) )
+       root_key = HKEY_CURRENT_CONFIG;
+    else
+        return NULL;
+       
+    return root_key;
+}
+
+
+/****************
+ * Return a string from the Win32 Registry or NULL in case of
+ * error.  Caller must release the return value.   A NULL for root
+ * is an alias for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn.
+ * NOTE: The value is allocated with a plain malloc() - use free() and not
+ * the usual xfree()!!!
+ */
+char *
+read_w32_registry_string( const char *root, const char *dir, const char *name )
+{
+    HKEY root_key, key_handle;
+    DWORD n1, nbytes, type;
+    char *result = NULL;
+
+    if ( !(root_key = get_root_key(root) ) )
+       return NULL;
+
+    if( RegOpenKeyEx( root_key, dir, 0, KEY_READ, &key_handle ) )
+      {
+        if (root)
+          return NULL; /* no need for a RegClose, so return direct */
+        /* It seems to be common practise to fall back to HKLM. */
+        if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
+          return NULL; /* still no need for a RegClose, so return direct */
+      }
+
+    nbytes = 1;
+    if( RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes ) ) {
+        if (root)
+            goto leave;
+        /* Try to fallback to HKLM also vor a missing value.  */
+        RegCloseKey (key_handle);
+        if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, dir, 0, KEY_READ, &key_handle) )
+            return NULL; /* Nope.  */
+        if (RegQueryValueEx( key_handle, name, 0, NULL, NULL, &nbytes))
+            goto leave;
+    }
+    result = malloc( (n1=nbytes+1) );
+    if( !result )
+       goto leave;
+    if( RegQueryValueEx( key_handle, name, 0, &type, result, &n1 ) ) {
+       free(result); result = NULL;
+       goto leave;
+    }
+    result[nbytes] = 0; /* make sure it is really a string  */
+    if (type == REG_EXPAND_SZ && strchr (result, '%')) {
+        char *tmp;
+        
+        n1 += 1000;
+        tmp = malloc (n1+1);
+        if (!tmp)
+            goto leave;
+        nbytes = ExpandEnvironmentStrings (result, tmp, n1);
+        if (nbytes && nbytes > n1) {
+            free (tmp);
+            n1 = nbytes;
+            tmp = malloc (n1 + 1);
+            if (!tmp)
+                goto leave;
+            nbytes = ExpandEnvironmentStrings (result, tmp, n1);
+            if (nbytes && nbytes > n1) {
+                free (tmp); /* oops - truncated, better don't expand at all */
+                goto leave;
+            }
+            tmp[nbytes] = 0;
+            free (result);
+            result = tmp;
+        }
+        else if (nbytes) { /* okay, reduce the length */
+            tmp[nbytes] = 0;
+            free (result);
+            result = malloc (strlen (tmp)+1);
+            if (!result)
+                result = tmp;
+            else {
+                strcpy (result, tmp);
+                free (tmp);
+            }
+        }
+        else {  /* error - don't expand */
+            free (tmp);
+        }
+    }
+
+  leave:
+    RegCloseKey( key_handle );
+    return result;
+}
+
+
+int
+write_w32_registry_string(const char *root, const char *dir, 
+                          const char *name, const char *value)
+{
+    HKEY root_key, reg_key;
+       
+    if ( !(root_key = get_root_key(root) ) )
+       return -1;
+
+    if ( RegOpenKeyEx( root_key, dir, 0, KEY_WRITE, &reg_key ) 
+         != ERROR_SUCCESS )
+       return -1;
+       
+    if ( RegSetValueEx( reg_key, name, 0, REG_SZ, (BYTE *)value, 
+                        strlen( value ) ) != ERROR_SUCCESS ) {
+        if ( RegCreateKey( root_key, name, &reg_key ) != ERROR_SUCCESS ) {
+            RegCloseKey(reg_key);
+            return -1;
+        }
+        if ( RegSetValueEx( reg_key, name, 0, REG_SZ, (BYTE *)value,
+                            strlen( value ) ) != ERROR_SUCCESS ) {
+            RegCloseKey(reg_key);
+            return -1;
+        }
+    }
+
+    RegCloseKey( reg_key );
+       
+    return 0;
+}
+
+#endif /* __MINGW32__ || __CYGWIN32__ */
diff --git a/zlib/ChangeLog b/zlib/ChangeLog
new file mode 100644 (file)
index 0000000..3c82d50
--- /dev/null
@@ -0,0 +1,505 @@
+2002-03-12  Werner Koch  <wk@gnupg.org>
+
+       Merged changes from zlib 1.1.4. 
+
+Sat Feb 13 12:04:43 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Removed -Wall
+
+Wed Jan 20 21:40:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       * Makefile.am: Corrected the list of sources
+
+Wed Jan 13 14:10:15 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
+
+       Merged version 1.1.3 with the previousy used 1.0.4
+
+Thu Feb 12 12:20:45 1998  Werner Koch  (wk@frodo)
+
+        Removed a couple of files, as this is only used if zlib is
+        missing on a system.  Added automake stuff
+
+
+               ChangeLog file for zlib
+
+
+Changes in 1.1.4 (11 March 2002)
+- ZFREE was repeated on same allocation on some error conditions.
+  This creates a security problem described in
+  http://www.zlib.org/advisory-2002-03-11.txt
+- Returned incorrect error (Z_MEM_ERROR) on some invalid data
+- Avoid accesses before window for invalid distances with inflate window
+  less than 32K.
+- force windowBits > 8 to avoid a bug in the encoder for a window size
+  of 256 bytes. (A complete fix will be available in 1.1.5).
+
+Changes in 1.1.3 (9 July 1998)
+- fix "an inflate input buffer bug that shows up on rare but persistent
+  occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+  (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+  See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+- Support gzdopen on Mac with Metrowerks (Jason Linhart)
+- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)
+- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)
+- avoid some warnings with Borland C (Tom Tanner)
+- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)
+- emulate utime() for WIN32 in contrib/untgz  (Gilles Vollant)
+- allow several arguments to configure (Tim Mooney, Frodo Looijaard)
+- use libdir and includedir in Makefile.in (Tim Mooney)
+- support shared libraries on OSF1 V4 (Tim Mooney)
+- remove so_locations in "make clean"  (Tim Mooney)
+- fix maketree.c compilation error (Glenn, Mark)
+- Python interface to zlib now in Python 1.5 (Jeremy Hylton)
+- new Makefile.riscos (Rich Walker)
+- initialize static descriptors in trees.c for embedded targets (Nick Smith)
+- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)
+- add the OS/2 files in Makefile.in too (Andrew Zabolotny)
+- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)
+- fix maketree.c to allow clean compilation of inffixed.h (Mark)
+- fix parameter check in deflateCopy (Gunther Nikl)
+- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)
+- Many portability patches by Christian Spieler:
+  . zutil.c, zutil.h: added "const" for zmem*
+  . Make_vms.com: fixed some typos
+  . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists
+  . msdos/Makefile.msc: remove "default rtl link library" info from obj files
+  . msdos/Makefile.*: use model-dependent name for the built zlib library
+  . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:
+     new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)
+- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)
+- replace __far with _far for better portability (Christian Spieler, Tom Lane)
+- fix test for errno.h in configure (Tim Newsham)
+
+Changes in 1.1.2 (19 March 98)
+- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)
+  See http://www.winimage.com/zLibDll/unzip.html
+- preinitialize the inflate tables for fixed codes, to make the code
+  completely thread safe (Mark)
+- some simplifications and slight speed-up to the inflate code (Mark)
+- fix gzeof on non-compressed files (Allan Schrum)
+- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)
+- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)
+- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)
+- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)
+- do not wrap extern "C" around system includes (Tom Lane)
+- mention zlib binding for TCL in README (Andreas Kupries)
+- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)
+- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)
+- allow "configure --prefix $HOME" (Tim Mooney)
+- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)
+- move Makefile.sas to amiga/Makefile.sas
+
+Changes in 1.1.1 (27 Feb 98)
+- fix macros _tr_tally_* in deflate.h for debug mode  (Glenn Randers-Pehrson)
+- remove block truncation heuristic which had very marginal effect for zlib
+  (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
+  compression ratio on some files. This also allows inlining _tr_tally for
+  matches in deflate_slow.
+- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
+
+Changes in 1.1.0 (24 Feb 98)
+- do not return STREAM_END prematurely in inflate (John Bowler)
+- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)
+- compile with -DFASTEST to get compression code optimized for speed only
+- in minigzip, try mmap'ing the input file first (Miguel Albrecht)
+- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain
+  on Sun but significant on HP)
+
+- add a pointer to experimental unzip library in README (Gilles Vollant)
+- initialize variable gcc in configure (Chris Herborth)
+
+Changes in 1.0.9 (17 Feb 1998)
+- added gzputs and gzgets functions
+- do not clear eof flag in gzseek (Mark Diekhans)
+- fix gzseek for files in transparent mode (Mark Diekhans)
+- do not assume that vsprintf returns the number of bytes written (Jens Krinke)
+- replace EXPORT with ZEXPORT to avoid conflict with other programs
+- added compress2 in zconf.h, zlib.def, zlib.dnt
+- new asm code from Gilles Vollant in contrib/asm386
+- simplify the inflate code (Mark):
+ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()
+ . ZALLOC the length list in inflate_trees_fixed() instead of using stack
+ . ZALLOC the value area for huft_build() instead of using stack
+ . Simplify Z_FINISH check in inflate()
+
+- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
+- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
+- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
+  the declaration of FAR (Gilles VOllant)
+- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
+- read_buf buf parameter of type Bytef* instead of charf*
+- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
+- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)
+- fix check for presence of directories in "make install" (Ian Willis)
+
+Changes in 1.0.8 (27 Jan 1998)
+- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)
+- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)
+- added compress2() to allow setting the compression level
+- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
+- use constant arrays for the static trees in trees.c instead of computing
+  them at run time (thanks to Ken Raeburn for this suggestion). To create
+  trees.h, compile with GEN_TREES_H and run "make test".
+- check return code of example in "make test" and display result
+- pass minigzip command line options to file_compress
+- simplifying code of inflateSync to avoid gcc 2.8 bug
+
+- support CC="gcc -Wall" in configure -s (QingLong)
+- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)
+- fix test for shared library support to avoid compiler warnings
+- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)
+- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)
+- do not use fdopen for Metrowerks on Mac (Brad Pettit))
+- add checks for gzputc and gzputc in example.c
+- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)
+- use const for the CRC table (Ken Raeburn)
+- fixed "make uninstall" for shared libraries
+- use Tracev instead of Trace in infblock.c
+- in example.c use correct compressed length for test_sync
+- suppress +vnocompatwarnings in configure for HPUX (not always supported)
+
+Changes in 1.0.7 (20 Jan 1998)
+- fix gzseek which was broken in write mode
+- return error for gzseek to negative absolute position
+- fix configure for Linux (Chun-Chung Chen)
+- increase stack space for MSC (Tim Wegner)
+- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)
+- define EXPORTVA for gzprintf (Gilles Vollant)
+- added man page zlib.3 (Rick Rodgers)
+- for contrib/untgz, fix makedir() and improve Makefile
+
+- check gzseek in write mode in example.c
+- allocate extra buffer for seeks only if gzseek is actually called
+- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)
+- add inflateSyncPoint in zconf.h
+- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def
+
+Changes in 1.0.6 (19 Jan 1998)
+- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
+  gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
+- Fix a deflate bug occuring only with compression level 0 (thanks to
+  Andy Buckler for finding this one).
+- In minigzip, pass transparently also the first byte for .Z files.
+- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
+- check Z_FINISH in inflate (thanks to Marc Schluper)
+- Implement deflateCopy (thanks to Adam Costello)
+- make static libraries by default in configure, add --shared option.
+- move MSDOS or Windows specific files to directory msdos
+- suppress the notion of partial flush to simplify the interface
+  (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
+- suppress history buffer provided by application to simplify the interface
+  (this feature was not implemented anyway in 1.0.4)
+- next_in and avail_in must be initialized before calling inflateInit or
+  inflateInit2
+- add EXPORT in all exported functions (for Windows DLL)
+- added Makefile.nt (thanks to Stephen Williams)
+- added the unsupported "contrib" directory:
+   contrib/asm386/ by Gilles Vollant <info@winimage.com>
+       386 asm code replacing longest_match().
+   contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
+       A C++ I/O streams interface to the zlib gz* functions
+   contrib/iostream2/  by Tyge Løvset <Tyge.Lovset@cmr.no>
+       Another C++ I/O streams interface
+   contrib/untgz/  by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+       A very simple tar.gz file extractor using zlib
+   contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
+       How to use compress(), uncompress() and the gz* functions from VB.
+- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
+  level) in minigzip (thanks to Tom Lane)
+
+- use const for rommable constants in deflate
+- added test for gzseek and gztell in example.c
+- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
+- add undocumented function zError to convert error code to string
+  (for Tim Smithers)
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
+- Use default memcpy for Symantec MSDOS compiler.
+- Add EXPORT keyword for check_func (needed for Windows DLL)
+- add current directory to LD_LIBRARY_PATH for "make test"
+- create also a link for libz.so.1
+- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)
+- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)
+- added -soname for Linux in configure (Chun-Chung Chen,
+- assign numbers to the exported functions in zlib.def (for Windows DLL)
+- add advice in zlib.h for best usage of deflateSetDictionary
+- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)
+- allow compilation with ANSI keywords only enabled for TurboC in large model
+- avoid "versionString"[0] (Borland bug)
+- add NEED_DUMMY_RETURN for Borland
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
+- allow compilation with CC
+- defined STDC for OS/2 (David Charlap)
+- limit external names to 8 chars for MVS (Thomas Lund)
+- in minigzip.c, use static buffers only for 16-bit systems
+- fix suffix check for "minigzip -d foo.gz"
+- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)
+- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
+- added makelcc.bat for lcc-win32 (Tom St Denis)
+- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
+- Avoid expanded $Id: ChangeLog 1262 2002-06-29 13:31:13Z dshaw $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- check for unistd.h in configure (for off_t)
+- remove useless check parameter in inflate_blocks_free
+- avoid useless assignment of s->check to itself in inflate_blocks_new
+- do not flush twice in gzclose (thanks to Ken Raeburn)
+- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h
+- use NO_ERRNO_H instead of enumeration of operating systems with errno.h
+- work around buggy fclose on pipes for HP/UX
+- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)
+- fix configure if CC is already equal to gcc
+
+Changes in 1.0.5 (3 Jan 98)
+- Fix inflate to terminate gracefully when fed corrupted or invalid data
+- Use const for rommable constants in inflate
+- Eliminate memory leaks on error conditions in inflate
+- Removed some vestigial code in inflate
+- Update web address in README
+
+Changes in 1.0.4 (24 Jul 96)
+- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
+  bit, so the decompressor could decompress all the correct data but went
+  on to attempt decompressing extra garbage data. This affected minigzip too.
+- zlibVersion and gzerror return const char* (needed for DLL)
+- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
+- use z_error only for DEBUG (avoid problem with DLLs)
+
+Changes in 1.0.3 (2 Jul 96)
+- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
+  small and medium models; this makes the library incompatible with previous
+  versions for these models. (No effect in large model or on other systems.)
+- return OK instead of BUF_ERROR if previous deflate call returned with
+  avail_out as zero but there is nothing to do
+- added memcmp for non STDC compilers
+- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
+- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
+- better check for 16-bit mode MSC (avoids problem with Symantec)
+
+Changes in 1.0.2 (23 May 96)
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
+- Bytef is define's instead of typedef'd only for Borland C
+- avoid reading uninitialized memory in example.c
+- mention in README that the zlib format is now RFC1950
+- updated Makefile.dj2
+- added algorithm.doc
+
+Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
+- fix array overlay in deflate.c which sometimes caused bad compressed data
+- fix inflate bug with empty stored block
+- fix MSDOS medium model which was broken in 0.99
+- fix deflateParams() which could generated bad compressed data.
+- Bytef is define'd instead of typedef'ed (work around Borland bug)
+- added an INDEX file
+- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
+  Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
+- speed up adler32 for modern machines without auto-increment
+- added -ansi for IRIX in configure
+- static_init_done in trees.c is an int
+- define unlink as delete for VMS
+- fix configure for QNX
+- add configure branch for SCO and HPUX
+- avoid many warnings (unused variables, dead assignments, etc...)
+- no fdopen for BeOS
+- fix the Watcom fix for 32 bit mode (define FAR as empty)
+- removed redefinition of Byte for MKWERKS
+- work around an MWKERKS bug (incorrect merge of all .h files)
+
+Changes in 0.99 (27 Jan 96)
+- allow preset dictionary shared between compressor and decompressor
+- allow compression level 0 (no compression)
+- add deflateParams in zlib.h: allow dynamic change of compression level
+  and compression strategy.
+- test large buffers and deflateParams in example.c
+- add optional "configure" to build zlib as a shared library
+- suppress Makefile.qnx, use configure instead
+- fixed deflate for 64-bit systems (detected on Cray)
+- fixed inflate_blocks for 64-bit systems (detected on Alpha)
+- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
+- always return Z_BUF_ERROR when deflate() has nothing to do
+- deflateInit and inflateInit are now macros to allow version checking
+- prefix all global functions and types with z_ with -DZ_PREFIX
+- make falloc completely reentrant (inftrees.c)
+- fixed very unlikely race condition in ct_static_init
+- free in reverse order of allocation to help memory manager
+- use zlib-1.0/* instead of zlib/* inside the tar.gz
+- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
+  -Wconversion -Wstrict-prototypes -Wmissing-prototypes"
+- allow gzread on concatenated .gz files
+- deflateEnd now returns Z_DATA_ERROR if it was premature
+- deflate is finally (?) fully deterministic (no matches beyond end of input)
+- Document Z_SYNC_FLUSH
+- add uninstall in Makefile
+- Check for __cpluplus in zlib.h
+- Better test in ct_align for partial flush
+- avoid harmless warnings for Borland C++
+- initialize hash_head in deflate.c
+- avoid warning on fdopen (gzio.c) for HP cc -Aa
+- include stdlib.h for STDC compilers
+- include errno.h for Cray
+- ignore error if ranlib doesn't exist
+- call ranlib twice for NeXTSTEP
+- use exec_prefix instead of prefix for libz.a
+- renamed ct_* as _tr_* to avoid conflict with applications
+- clear z->msg in inflateInit2 before any error return
+- initialize opaque in example.c, gzio.c, deflate.c and inflate.c
+- fixed typo in zconf.h (_GNUC__ => __GNUC__)
+- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)
+- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
+- in fcalloc, normalize pointer if size > 65520 bytes
+- don't use special fcalloc for 32 bit Borland C++
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use Z_BINARY instead of BINARY
+- document that gzclose after gzdopen will close the file
+- allow "a" as mode in gzopen.
+- fix error checking in gzread
+- allow skipping .gz extra-field on pipes
+- added reference to Perl interface in README
+- put the crc table in FAR data (I dislike more and more the medium model :)
+- added get_crc_table
+- added a dimension to all arrays (Borland C can't count).
+- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
+- guard against multiple inclusion of *.h (for precompiled header on Mac)
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
+- don't use unsized arrays to avoid silly warnings by Visual C++:
+     warning C4746: 'inflate_mask' : unsized array treated as  '__far'
+     (what's wrong with far data in far model?).
+- define enum out of inflate_blocks_state to allow compilation with C++
+
+Changes in 0.95 (16 Aug 95)
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+  not completely flushed in rare occasions).
+- default window size is same for compression and decompression
+  (it's now sufficient to set MAX_WBITS in zconf.h).
+- voidp -> voidpf and voidnp -> voidp (for consistency with other
+  typedefs and because voidnp was not near in large model).
+
+Changes in 0.94 (13 Aug 95)
+- support MSDOS medium model
+- fix deflate with flush (could sometimes generate bad output)
+- fix deflateReset (zlib header was incorrectly suppressed)
+- added support for VMS
+- allow a compression level in gzopen()
+- gzflush now calls fflush
+- For deflate with flush, flush even if no more input is provided.
+- rename libgz.a as libz.a
+- avoid complex expression in infcodes.c triggering Turbo C bug
+- work around a problem with gcc on Alpha (in INSERT_STRING)
+- don't use inline functions (problem with some gcc versions)
+- allow renaming of Byte, uInt, etc... with #define.
+- avoid warning about (unused) pointer before start of array in deflate.c
+- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
+- avoid reserved word 'new' in trees.c
+
+Changes in 0.93 (25 June 95)
+- temporarily disable inline functions
+- make deflate deterministic
+- give enough lookahead for PARTIAL_FLUSH
+- Set binary mode for stdin/stdout in minigzip.c for OS/2
+- don't even use signed char in inflate (not portable enough)
+- fix inflate memory leak for segmented architectures
+
+Changes in 0.92 (3 May 95)
+- don't assume that char is signed (problem on SGI)
+- Clear bit buffer when starting a stored block
+- no memcpy on Pyramid
+- suppressed inftest.c
+- optimized fill_window, put longest_match inline for gcc
+- optimized inflate on stored blocks.
+- untabify all sources to simplify patches
+
+Changes in 0.91 (2 May 95)
+- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h
+- Document the memory requirements in zconf.h
+- added "make install"
+- fix sync search logic in inflateSync
+- deflate(Z_FULL_FLUSH) now works even if output buffer too short
+- after inflateSync, don't scare people with just "lo world"
+- added support for DJGPP
+
+Changes in 0.9 (1 May 95)
+- don't assume that zalloc clears the allocated memory (the TurboC bug
+  was Mark's bug after all :)
+- let again gzread copy uncompressed data unchanged (was working in 0.71)
+- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
+- added a test of inflateSync in example.c
+- moved MAX_WBITS to zconf.h because users might want to change that.
+- document explicitly that zalloc(64K) on MSDOS must return a normalized
+  pointer (zero offset)
+- added Makefiles for Microsoft C, Turbo C, Borland C++
+- faster crc32()
+
+Changes in 0.8 (29 April 95)
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+  is incompatible with previous versions of zlib which returned Z_OK.
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
+  (actually that was not a compiler bug, see 0.81 above)
+- gzread no longer reads one extra byte in certain cases
+- In gzio destroy(), don't reference a freed structure
+- avoid many warnings for MSDOS
+- avoid the ERROR symbol which is used by MS Windows
+
+Changes in 0.71 (14 April 95)
+- Fixed more MSDOS compilation problems :( There is still a bug with
+  TurboC large model.
+
+Changes in 0.7 (14 April 95)
+- Added full inflate support.
+- Simplified the crc32() interface. The pre- and post-conditioning
+  (one's complement) is now done inside crc32(). WARNING: this is
+  incompatible with previous versions; see zlib.h for the new usage.
+
+Changes in 0.61 (12 April 95)
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
+
+Changes in 0.6 (11 April 95)
+- added minigzip.c
+- added gzdopen to reopen a file descriptor as gzFile
+- added transparent reading of non-gziped files in gzread.
+- fixed bug in gzread (don't read crc as data)
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
+- don't allocate big arrays in the stack (for MSDOS)
+- fix some MSDOS compilation problems
+
+Changes in 0.5:
+- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
+  not yet Z_FULL_FLUSH.
+- support decompression but only in a single step (forced Z_FINISH)
+- added opaque object for zalloc and zfree.
+- added deflateReset and inflateReset
+- added a variable zlib_version for consistency checking.
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
+  Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
+
+Changes in 0.4:
+- avoid "zip" everywhere, use zlib instead of ziplib.
+- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
+  if compression method == 8.
+- added adler32 and crc32
+- renamed deflateOptions as deflateInit2, call one or the other but not both
+- added the method parameter for deflateInit2.
+- added inflateInit2
+- simplied considerably deflateInit and inflateInit by not supporting
+  user-provided history buffer. This is supported only in deflateInit2
+  and inflateInit2.
+
+Changes in 0.3:
+- prefix all macro names with Z_
+- use Z_FINISH instead of deflateEnd to finish compression.
+- added Z_HUFFMAN_ONLY
+- added gzerror()
+
+
diff --git a/zlib/Makefile.am b/zlib/Makefile.am
new file mode 100644 (file)
index 0000000..2c1e9cd
--- /dev/null
@@ -0,0 +1,28 @@
+# Process this file with automake to produce Makefile.in
+# Copyright (C) 1995-1996 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+# This is used if a systems lacks support of zlib
+
+EXTRA_DIST = README algorithm.doc ChangeLog
+
+# I found no other easy way to use this only if zlib is neede
+# doing this with SUBDIR = @xxx@  in the top Makefile.am does not
+# work because automake doesn't scan this Makefile.am here.
+if ENABLE_LOCAL_ZLIB
+noinst_LIBRARIES = libzlib.a
+endif
+
+
+libzlib_a_SOURCES = adler32.c compress.c crc32.c \
+                   uncompr.c deflate.c trees.c zutil.c \
+                   inflate.c infblock.c inftrees.c \
+                   infcodes.c infutil.c inffast.c \
+                   deflate.h infblock.h infcodes.h inffast.h \
+                   inffixed.h inftrees.h infutil.h trees.h \
+                   zconf.h zlib.h zutil.h
+
+
+CLEANFILES = foo.gz
+
+
+
diff --git a/zlib/Makefile.in b/zlib/Makefile.in
new file mode 100644 (file)
index 0000000..f54e090
--- /dev/null
@@ -0,0 +1,545 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+# Process this file with automake to produce Makefile.in
+# Copyright (C) 1995-1996 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+# This is used if a systems lacks support of zlib
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = zlib
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/zconf.h $(srcdir)/zlib.h ChangeLog
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/autobuild.m4 \
+       $(top_srcdir)/m4/codeset.m4 $(top_srcdir)/m4/gettext.m4 \
+       $(top_srcdir)/m4/glibc21.m4 $(top_srcdir)/m4/iconv.m4 \
+       $(top_srcdir)/m4/intdiv0.m4 $(top_srcdir)/m4/intmax.m4 \
+       $(top_srcdir)/m4/inttypes-pri.m4 $(top_srcdir)/m4/inttypes.m4 \
+       $(top_srcdir)/m4/inttypes_h.m4 $(top_srcdir)/m4/isc-posix.m4 \
+       $(top_srcdir)/m4/lcmessage.m4 $(top_srcdir)/m4/ldap.m4 \
+       $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+       $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libcurl.m4 \
+       $(top_srcdir)/m4/libusb.m4 $(top_srcdir)/m4/longdouble.m4 \
+       $(top_srcdir)/m4/longlong.m4 $(top_srcdir)/m4/nls.m4 \
+       $(top_srcdir)/m4/noexecstack.m4 $(top_srcdir)/m4/po.m4 \
+       $(top_srcdir)/m4/printf-posix.m4 $(top_srcdir)/m4/progtest.m4 \
+       $(top_srcdir)/m4/readline.m4 $(top_srcdir)/m4/signed.m4 \
+       $(top_srcdir)/m4/size_max.m4 $(top_srcdir)/m4/stdint_h.m4 \
+       $(top_srcdir)/m4/tar-ustar.m4 $(top_srcdir)/m4/uintmax_t.m4 \
+       $(top_srcdir)/m4/ulonglong.m4 $(top_srcdir)/m4/wchar_t.m4 \
+       $(top_srcdir)/m4/wint_t.m4 $(top_srcdir)/m4/xsize.m4 \
+       $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+       $(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+libzlib_a_AR = $(AR) $(ARFLAGS)
+libzlib_a_LIBADD =
+am_libzlib_a_OBJECTS = adler32.$(OBJEXT) compress.$(OBJEXT) \
+       crc32.$(OBJEXT) uncompr.$(OBJEXT) deflate.$(OBJEXT) \
+       trees.$(OBJEXT) zutil.$(OBJEXT) inflate.$(OBJEXT) \
+       infblock.$(OBJEXT) inftrees.$(OBJEXT) infcodes.$(OBJEXT) \
+       infutil.$(OBJEXT) inffast.$(OBJEXT)
+libzlib_a_OBJECTS = $(am_libzlib_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+       $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libzlib_a_SOURCES)
+DIST_SOURCES = $(libzlib_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ALLOCA = @ALLOCA@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CAPLIBS = @CAPLIBS@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+CCAS = @CCAS@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CROSS_COMPILING_FALSE = @CROSS_COMPILING_FALSE@
+CROSS_COMPILING_TRUE = @CROSS_COMPILING_TRUE@
+CYGPATH_W = @CYGPATH_W@
+DATADIRNAME = @DATADIRNAME@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLIBS = @DLLIBS@
+DNSLIBS = @DNSLIBS@
+DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
+DOCBOOK_TO_TEXI = @DOCBOOK_TO_TEXI@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_AGENT_SUPPORT_FALSE = @ENABLE_AGENT_SUPPORT_FALSE@
+ENABLE_AGENT_SUPPORT_TRUE = @ENABLE_AGENT_SUPPORT_TRUE@
+ENABLE_BZIP2_SUPPORT_FALSE = @ENABLE_BZIP2_SUPPORT_FALSE@
+ENABLE_BZIP2_SUPPORT_TRUE = @ENABLE_BZIP2_SUPPORT_TRUE@
+ENABLE_CARD_SUPPORT_FALSE = @ENABLE_CARD_SUPPORT_FALSE@
+ENABLE_CARD_SUPPORT_TRUE = @ENABLE_CARD_SUPPORT_TRUE@
+ENABLE_LOCAL_ZLIB_FALSE = @ENABLE_LOCAL_ZLIB_FALSE@
+ENABLE_LOCAL_ZLIB_TRUE = @ENABLE_LOCAL_ZLIB_TRUE@
+EXEEXT = @EXEEXT@
+FAKE_CURL_FALSE = @FAKE_CURL_FALSE@
+FAKE_CURL_TRUE = @FAKE_CURL_TRUE@
+FAQPROG = @FAQPROG@
+GENCAT = @GENCAT@
+GETOPT = @GETOPT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GPGKEYS_CURL = @GPGKEYS_CURL@
+GPGKEYS_FINGER = @GPGKEYS_FINGER@
+GPGKEYS_HKP = @GPGKEYS_HKP@
+GPGKEYS_LDAP = @GPGKEYS_LDAP@
+GPGKEYS_MAILTO = @GPGKEYS_MAILTO@
+GREP = @GREP@
+HAVE_ASPRINTF = @HAVE_ASPRINTF@
+HAVE_DOCBOOK_TO_MAN_FALSE = @HAVE_DOCBOOK_TO_MAN_FALSE@
+HAVE_DOCBOOK_TO_MAN_TRUE = @HAVE_DOCBOOK_TO_MAN_TRUE@
+HAVE_DOCBOOK_TO_TEXI_FALSE = @HAVE_DOCBOOK_TO_TEXI_FALSE@
+HAVE_DOCBOOK_TO_TEXI_TRUE = @HAVE_DOCBOOK_TO_TEXI_TRUE@
+HAVE_DOSISH_SYSTEM_FALSE = @HAVE_DOSISH_SYSTEM_FALSE@
+HAVE_DOSISH_SYSTEM_TRUE = @HAVE_DOSISH_SYSTEM_TRUE@
+HAVE_POSIX_PRINTF = @HAVE_POSIX_PRINTF@
+HAVE_SNPRINTF = @HAVE_SNPRINTF@
+HAVE_USTAR_FALSE = @HAVE_USTAR_FALSE@
+HAVE_USTAR_TRUE = @HAVE_USTAR_TRUE@
+HAVE_W32_SYSTEM_FALSE = @HAVE_W32_SYSTEM_FALSE@
+HAVE_W32_SYSTEM_TRUE = @HAVE_W32_SYSTEM_TRUE@
+HAVE_WPRINTF = @HAVE_WPRINTF@
+IDEA_O = @IDEA_O@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LDAPLIBS = @LDAPLIBS@
+LDAP_CPPFLAGS = @LDAP_CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBCURL = @LIBCURL@
+LIBCURL_CPPFLAGS = @LIBCURL_CPPFLAGS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LIBREADLINE = @LIBREADLINE@
+LIBS = @LIBS@
+LIBUSB = @LIBUSB@
+LIBUSB_CPPFLAGS = @LIBUSB_CPPFLAGS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
+MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+MPI_EXTRA_ASM_OBJS = @MPI_EXTRA_ASM_OBJS@
+MPI_OPT_FLAGS = @MPI_OPT_FLAGS@
+MPI_SFLAGS = @MPI_SFLAGS@
+MSGFMT = @MSGFMT@
+MSGMERGE = @MSGMERGE@
+NETLIBS = @NETLIBS@
+NM = @NM@
+NOEXECSTACK_FLAGS = @NOEXECSTACK_FLAGS@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+SENDMAIL = @SENDMAIL@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+TAR = @TAR@
+USE_DNS_SRV_FALSE = @USE_DNS_SRV_FALSE@
+USE_DNS_SRV_TRUE = @USE_DNS_SRV_TRUE@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_INTERNAL_REGEX_FALSE = @USE_INTERNAL_REGEX_FALSE@
+USE_INTERNAL_REGEX_TRUE = @USE_INTERNAL_REGEX_TRUE@
+USE_NLS = @USE_NLS@
+USE_RNDEGD_FALSE = @USE_RNDEGD_FALSE@
+USE_RNDEGD_TRUE = @USE_RNDEGD_TRUE@
+USE_RNDLINUX_FALSE = @USE_RNDLINUX_FALSE@
+USE_RNDLINUX_TRUE = @USE_RNDLINUX_TRUE@
+USE_RNDUNIX_FALSE = @USE_RNDUNIX_FALSE@
+USE_RNDUNIX_TRUE = @USE_RNDUNIX_TRUE@
+USE_RNDW32_FALSE = @USE_RNDW32_FALSE@
+USE_RNDW32_TRUE = @USE_RNDW32_TRUE@
+USE_SHA512_FALSE = @USE_SHA512_FALSE@
+USE_SHA512_TRUE = @USE_SHA512_TRUE@
+USE_SIMPLE_GETTEXT_FALSE = @USE_SIMPLE_GETTEXT_FALSE@
+USE_SIMPLE_GETTEXT_TRUE = @USE_SIMPLE_GETTEXT_TRUE@
+VERSION = @VERSION@
+W32LIBS = @W32LIBS@
+WORKING_FAQPROG_FALSE = @WORKING_FAQPROG_FALSE@
+WORKING_FAQPROG_TRUE = @WORKING_FAQPROG_TRUE@
+XGETTEXT = @XGETTEXT@
+ZLIBS = @ZLIBS@
+_libcurl_config = @_libcurl_config@
+_usb_config = @_usb_config@
+ac_ct_CC = @ac_ct_CC@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+EXTRA_DIST = README algorithm.doc ChangeLog
+
+# I found no other easy way to use this only if zlib is neede
+# doing this with SUBDIR = @xxx@  in the top Makefile.am does not
+# work because automake doesn't scan this Makefile.am here.
+@ENABLE_LOCAL_ZLIB_TRUE@noinst_LIBRARIES = libzlib.a
+libzlib_a_SOURCES = adler32.c compress.c crc32.c \
+                   uncompr.c deflate.c trees.c zutil.c \
+                   inflate.c infblock.c inftrees.c \
+                   infcodes.c infutil.c inffast.c \
+                   deflate.h infblock.h infcodes.h inffast.h \
+                   inffixed.h inftrees.h infutil.h trees.h \
+                   zconf.h zlib.h zutil.h
+
+CLEANFILES = foo.gz
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+       @for dep in $?; do \
+         case '$(am__configure_deps)' in \
+           *$$dep*) \
+             cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+               && exit 0; \
+             exit 1;; \
+         esac; \
+       done; \
+       echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  zlib/Makefile'; \
+       cd $(top_srcdir) && \
+         $(AUTOMAKE) --gnu  zlib/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+       @case '$?' in \
+         *config.status*) \
+           cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+         *) \
+           echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+           cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+       esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+       cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+clean-noinstLIBRARIES:
+       -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libzlib.a: $(libzlib_a_OBJECTS) $(libzlib_a_DEPENDENCIES) 
+       -rm -f libzlib.a
+       $(libzlib_a_AR) libzlib.a $(libzlib_a_OBJECTS) $(libzlib_a_LIBADD)
+       $(RANLIB) libzlib.a
+
+mostlyclean-compile:
+       -rm -f *.$(OBJEXT)
+
+distclean-compile:
+       -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adler32.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compress.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deflate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infblock.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infcodes.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inffast.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inflate.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inftrees.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/infutil.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trees.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uncompr.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zutil.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@   if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+@am__fastdepCC_TRUE@   then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(COMPILE) -c `$(CYGPATH_W) '$<'`
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+       list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+         test -n "$$unique" || unique=$$empty_fix; \
+         $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+           $$tags $$unique; \
+       fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+               $(TAGS_FILES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
+       unique=`for i in $$list; do \
+           if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+         done | \
+         $(AWK) '    { files[$$0] = 1; } \
+              END { for (i in files) print i; }'`; \
+       test -z "$(CTAGS_ARGS)$$tags$$unique" \
+         || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+            $$tags $$unique
+
+GTAGS:
+       here=`$(am__cd) $(top_builddir) && pwd` \
+         && cd $(top_srcdir) \
+         && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+       -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+       @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+       topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+       list='$(DISTFILES)'; for file in $$list; do \
+         case $$file in \
+           $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+           $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+         esac; \
+         if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+         dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+         if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+           dir="/$$dir"; \
+           $(mkdir_p) "$(distdir)$$dir"; \
+         else \
+           dir=''; \
+         fi; \
+         if test -d $$d/$$file; then \
+           if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+             cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+           fi; \
+           cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+         else \
+           test -f $(distdir)/$$file \
+           || cp -p $$d/$$file $(distdir)/$$file \
+           || exit 1; \
+         fi; \
+       done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+       @echo "This command is intended for maintainers to use"
+       @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+       distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+       -rm -rf ./$(DEPDIR)
+       -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+       clean-noinstLIBRARIES ctags distclean distclean-compile \
+       distclean-generic distclean-tags distdir dvi dvi-am html \
+       html-am info info-am install install-am install-data \
+       install-data-am install-exec install-exec-am install-info \
+       install-info-am install-man install-strip installcheck \
+       installcheck-am installdirs maintainer-clean \
+       maintainer-clean-generic mostlyclean mostlyclean-compile \
+       mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
+       uninstall-am uninstall-info-am
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/zlib/README b/zlib/README
new file mode 100644 (file)
index 0000000..8ff4587
--- /dev/null
@@ -0,0 +1,148 @@
+zlib 1.1.3 is a general purpose data compression library.  All the code
+is thread safe.  The data format used by the zlib library
+is described by RFCs (Request for Comments) 1950 to 1952 in the files 
+ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
+format) and rfc1952.txt (gzip format). These documents are also available in
+other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
+
+All functions of the compression library are documented in the file zlib.h
+(volunteer to write man pages welcome, contact jloup@gzip.org). A usage
+example of the library is given in the file example.c which also tests that
+the library is working correctly. Another example is given in the file
+minigzip.c. The compression library itself is composed of all source files
+except example.c and minigzip.c.
+
+To compile all files and run the test program, follow the instructions
+given at the top of Makefile. In short "make test; make install"
+should work for most machines. For Unix: "configure; make test; make install"
+For MSDOS, use one of the special makefiles such as Makefile.msc.
+For VMS, use Make_vms.com or descrip.mms.
+
+Questions about zlib should be sent to <zlib@quest.jpl.nasa.gov>, or to
+Gilles Vollant <info@winimage.com> for the Windows DLL version.
+The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
+The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/
+Before reporting a problem, please check those sites to verify that
+you have the latest version of zlib; otherwise get the latest version and
+check whether the problem still exists or not.
+
+Mark Nelson <markn@tiny.com> wrote an article about zlib for the Jan. 1997
+issue of  Dr. Dobb's Journal; a copy of the article is available in
+http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+
+The changes made in version 1.1.3 are documented in the file ChangeLog.
+The main changes since 1.1.2 are:
+
+- fix "an inflate input buffer bug that shows up on rare but persistent
+  occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+  (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+  See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+plus many changes for portability.
+
+Unsupported third party contributions are provided in directory "contrib".
+
+A Java implementation of zlib is available in the Java Development Kit 1.1
+http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
+See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details.
+
+A Perl interface to zlib written by Paul Marquess <pmarquess@bfsec.bt.co.uk>
+is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
+ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+
+A Python interface to zlib written by A.M. Kuchling <amk@magnet.com>
+is available in Python 1.5 and later versions, see
+http://www.python.org/doc/lib/module-zlib.html
+
+A zlib binding for TCL written by Andreas Kupries <a.kupries@westend.com>
+is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
+
+An experimental package to read and write files in .zip format,
+written on top of zlib by Gilles Vollant <info@winimage.com>, is
+available at http://www.winimage.com/zLibDll/unzip.html
+and also in the contrib/minizip directory of zlib.
+
+
+Notes for some targets:
+
+- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
+  and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
+  The zlib DLL support was initially done by Alessandro Iacopetti and is
+  now maintained by Gilles Vollant <info@winimage.com>. Check the zlib DLL
+  home page at http://www.winimage.com/zLibDll
+
+  From Visual Basic, you can call the DLL functions which do not take
+  a structure as argument: compress, uncompress and all gz* functions.
+  See contrib/visual-basic.txt for more information, or get
+  http://www.tcfb.com/dowseware/cmp-z-it.zip
+
+- For 64-bit Irix, deflate.c must be compiled without any optimization.
+  With -O, one libpng test fails. The test works in 32 bit mode (with
+  the -n32 compiler flag). The compiler bug has been reported to SGI.
+
+- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1   
+  it works when compiled with cc.
+
+- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
+  is necessary to get gzprintf working correctly. This is done by configure.
+
+- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
+  with other compilers. Use "make test" to check your compiler.
+
+- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
+
+- For Turbo C the small model is supported only with reduced performance to
+  avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+
+- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
+  Per Harald Myrvang <perm@stud.cs.uit.no>
+
+
+Acknowledgments:
+
+  The deflate format used by zlib was defined by Phil Katz. The deflate
+  and zlib specifications were written by L. Peter Deutsch. Thanks to all the
+  people who reported problems and suggested various improvements in zlib;
+  they are too numerous to cite here.
+
+Copyright notice:
+
+ (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
+
+If you use the zlib library in a product, we would appreciate *not*
+receiving lengthy legal documents to sign. The sources are provided
+for free but without warranty of any kind.  The library has been
+entirely written by Jean-loup Gailly and Mark Adler; it does not
+include third-party code.
+
+If you redistribute modified sources, we would appreciate that you include
+in the file ChangeLog history information documenting your changes.
diff --git a/zlib/adler32.c b/zlib/adler32.c
new file mode 100644 (file)
index 0000000..7a01bc8
--- /dev/null
@@ -0,0 +1,48 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: adler32.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#include "zlib.h"
+
+#define BASE 65521L /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
+#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf)   DO8(buf,0); DO8(buf,8);
+
+/* ========================================================================= */
+uLong ZEXPORT adler32(adler, buf, len)
+    uLong adler;
+    const Bytef *buf;
+    uInt len;
+{
+    unsigned long s1 = adler & 0xffff;
+    unsigned long s2 = (adler >> 16) & 0xffff;
+    int k;
+
+    if (buf == Z_NULL) return 1L;
+
+    while (len > 0) {
+        k = len < NMAX ? len : NMAX;
+        len -= k;
+        while (k >= 16) {
+            DO16(buf);
+           buf += 16;
+            k -= 16;
+        }
+        if (k != 0) do {
+            s1 += *buf++;
+           s2 += s1;
+        } while (--k);
+        s1 %= BASE;
+        s2 %= BASE;
+    }
+    return (s2 << 16) | s1;
+}
diff --git a/zlib/algorithm.doc b/zlib/algorithm.doc
new file mode 100644 (file)
index 0000000..01902af
--- /dev/null
@@ -0,0 +1,105 @@
+1. Compression algorithm (deflate)
+
+The deflation algorithm used by zlib (also zip and gzip) is a variation of
+LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
+the input data.  The second occurrence of a string is replaced by a
+pointer to the previous string, in the form of a pair (distance,
+length).  Distances are limited to 32K bytes, and lengths are limited
+to 258 bytes. When a string does not occur anywhere in the previous
+32K bytes, it is emitted as a sequence of literal bytes.  (In this
+description, `string' must be taken as an arbitrary sequence of bytes,
+and is not restricted to printable characters.)
+
+Literals or match lengths are compressed with one Huffman tree, and
+match distances are compressed with another tree. The trees are stored
+in a compact form at the start of each block. The blocks can have any
+size (except that the compressed data for one block must fit in
+available memory). A block is terminated when deflate() determines that
+it would be useful to start another block with fresh trees. (This is
+somewhat similar to the behavior of LZW-based _compress_.)
+
+Duplicated strings are found using a hash table. All input strings of
+length 3 are inserted in the hash table. A hash index is computed for
+the next 3 bytes. If the hash chain for this index is not empty, all
+strings in the chain are compared with the current input string, and
+the longest match is selected.
+
+The hash chains are searched starting with the most recent strings, to
+favor small distances and thus take advantage of the Huffman encoding.
+The hash chains are singly linked. There are no deletions from the
+hash chains, the algorithm simply discards matches that are too old.
+
+To avoid a worst-case situation, very long hash chains are arbitrarily
+truncated at a certain length, determined by a runtime option (level
+parameter of deflateInit). So deflate() does not always find the longest
+possible match but generally finds a match which is long enough.
+
+deflate() also defers the selection of matches with a lazy evaluation
+mechanism. After a match of length N has been found, deflate() searches for a
+longer match at the next input byte. If a longer match is found, the
+previous match is truncated to a length of one (thus producing a single
+literal byte) and the longer match is emitted afterwards.  Otherwise,
+the original match is kept, and the next match search is attempted only
+N steps later.
+
+The lazy match evaluation is also subject to a runtime parameter. If
+the current match is long enough, deflate() reduces the search for a longer
+match, thus speeding up the whole process. If compression ratio is more
+important than speed, deflate() attempts a complete second search even if
+the first match is already long enough.
+
+The lazy match evaluation is not performed for the fastest compression
+modes (level parameter 1 to 3). For these fast modes, new strings
+are inserted in the hash table only when no match was found, or
+when the match is not too long. This degrades the compression ratio
+but saves time since there are both fewer insertions and fewer searches.
+
+
+2. Decompression algorithm (inflate)
+
+The real question is, given a Huffman tree, how to decode fast.  The most
+important realization is that shorter codes are much more common than
+longer codes, so pay attention to decoding the short codes fast, and let
+the long codes take longer to decode.
+
+inflate() sets up a first level table that covers some number of bits of
+input less than the length of longest code.  It gets that many bits from the
+stream, and looks it up in the table.  The table will tell if the next
+code is that many bits or less and how many, and if it is, it will tell
+the value, else it will point to the next level table for which inflate()
+grabs more bits and tries to decode a longer code.
+
+How many bits to make the first lookup is a tradeoff between the time it
+takes to decode and the time it takes to build the table.  If building the
+table took no time (and if you had infinite memory), then there would only
+be a first level table to cover all the way to the longest code.  However,
+building the table ends up taking a lot longer for more bits since short
+codes are replicated many times in such a table.  What inflate() does is
+simply to make the number of bits in the first table a variable, and set it
+for the maximum speed.
+
+inflate() sends new trees relatively often, so it is possibly set for a
+smaller first level table than an application that has only one tree for
+all the data.  For inflate, which has 286 possible codes for the
+literal/length tree, the size of the first table is nine bits.  Also the
+distance trees have 30 possible values, and the size of the first table is
+six bits.  Note that for each of those cases, the table ended up one bit
+longer than the ``average'' code length, i.e. the code length of an
+approximately flat code which would be a little more than eight bits for
+286 symbols and a little less than five bits for 30 symbols.  It would be
+interesting to see if optimizing the first level table for other
+applications gave values within a bit or two of the flat code size.
+
+
+Jean-loup Gailly        Mark Adler
+gzip@prep.ai.mit.edu    madler@alumni.caltech.edu
+
+
+References:
+
+[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
+Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
+pp. 337-343.
+
+``DEFLATE Compressed Data Format Specification'' available in
+ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/zlib/compress.c b/zlib/compress.c
new file mode 100644 (file)
index 0000000..3e60b4f
--- /dev/null
@@ -0,0 +1,68 @@
+/* compress.c -- compress a memory buffer
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: compress.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#include "zlib.h"
+
+/* ===========================================================================
+     Compresses the source buffer into the destination buffer. The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer. Upon entry, destLen is the total size of the
+   destination buffer, which must be at least 0.1% larger than sourceLen plus
+   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
+    Bytef *dest;
+    uLongf *destLen;
+    const Bytef *source;
+    uLong sourceLen;
+    int level;
+{
+    z_stream stream;
+    int err;
+
+    stream.next_in = (Bytef*)source;
+    stream.avail_in = (uInt)sourceLen;
+#ifdef MAXSEG_64K
+    /* Check for source > 64K on 16-bit machine: */
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+#endif
+    stream.next_out = dest;
+    stream.avail_out = (uInt)*destLen;
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+    stream.zalloc = (alloc_func)0;
+    stream.zfree = (free_func)0;
+    stream.opaque = (voidpf)0;
+
+    err = deflateInit(&stream, level);
+    if (err != Z_OK) return err;
+
+    err = deflate(&stream, Z_FINISH);
+    if (err != Z_STREAM_END) {
+        deflateEnd(&stream);
+        return err == Z_OK ? Z_BUF_ERROR : err;
+    }
+    *destLen = stream.total_out;
+
+    err = deflateEnd(&stream);
+    return err;
+}
+
+/* ===========================================================================
+ */
+int ZEXPORT compress (dest, destLen, source, sourceLen)
+    Bytef *dest;
+    uLongf *destLen;
+    const Bytef *source;
+    uLong sourceLen;
+{
+    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
+}
diff --git a/zlib/crc32.c b/zlib/crc32.c
new file mode 100644 (file)
index 0000000..ee8dcd6
--- /dev/null
@@ -0,0 +1,162 @@
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: crc32.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#include "zlib.h"
+
+#define local static
+
+#ifdef DYNAMIC_CRC_TABLE
+
+local int crc_table_empty = 1;
+local uLongf crc_table[256];
+local void make_crc_table OF((void));
+
+/*
+  Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
+  x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+  Polynomials over GF(2) are represented in binary, one bit per coefficient,
+  with the lowest powers in the most significant bit.  Then adding polynomials
+  is just exclusive-or, and multiplying a polynomial by x is a right shift by
+  one.  If we call the above polynomial p, and represent a byte as the
+  polynomial q, also with the lowest power in the most significant bit (so the
+  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+  where a mod b means the remainder after dividing a by b.
+
+  This calculation is done using the shift-register method of multiplying and
+  taking the remainder.  The register is initialized to zero, and for each
+  incoming bit, x^32 is added mod p to the register if the bit is a one (where
+  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+  x (which is shifting right by one and adding x^32 mod p if the bit shifted
+  out is a one).  We start with the highest power (least significant bit) of
+  q and repeat for all eight bits of q.
+
+  The table is simply the CRC of all possible eight bit values.  This is all
+  the information needed to generate CRC's on data a byte at a time for all
+  combinations of CRC register values and incoming bytes.
+*/
+local void make_crc_table()
+{
+  uLong c;
+  int n, k;
+  uLong poly;            /* polynomial exclusive-or pattern */
+  /* terms of polynomial defining this crc (except x^32): */
+  static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+  /* make exclusive-or pattern from polynomial (0xedb88320L) */
+  poly = 0L;
+  for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
+    poly |= 1L << (31 - p[n]);
+  for (n = 0; n < 256; n++)
+  {
+    c = (uLong)n;
+    for (k = 0; k < 8; k++)
+      c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+    crc_table[n] = c;
+  }
+  crc_table_empty = 0;
+}
+#else
+/* ========================================================================
+ * Table of CRC-32's of all single-byte values (made by make_crc_table)
+ */
+local const uLongf crc_table[256] = {
+  0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
+  0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
+  0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
+  0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
+  0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
+  0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
+  0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
+  0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
+  0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
+  0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
+  0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
+  0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
+  0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
+  0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
+  0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
+  0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
+  0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
+  0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
+  0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
+  0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
+  0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
+  0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
+  0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
+  0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
+  0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
+  0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
+  0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
+  0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
+  0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
+  0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
+  0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
+  0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
+  0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
+  0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
+  0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
+  0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
+  0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
+  0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
+  0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
+  0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
+  0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
+  0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
+  0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
+  0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
+  0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
+  0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
+  0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
+  0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
+  0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
+  0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
+  0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
+  0x2d02ef8dL
+};
+#endif
+
+/* =========================================================================
+ * This function can be used by asm versions of crc32()
+ */
+const uLongf * ZEXPORT get_crc_table()
+{
+#ifdef DYNAMIC_CRC_TABLE
+  if (crc_table_empty) make_crc_table();
+#endif
+  return (const uLongf *)crc_table;
+}
+
+/* ========================================================================= */
+#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
+#define DO2(buf)  DO1(buf); DO1(buf);
+#define DO4(buf)  DO2(buf); DO2(buf);
+#define DO8(buf)  DO4(buf); DO4(buf);
+
+/* ========================================================================= */
+uLong ZEXPORT crc32(crc, buf, len)
+    uLong crc;
+    const Bytef *buf;
+    uInt len;
+{
+    if (buf == Z_NULL) return 0L;
+#ifdef DYNAMIC_CRC_TABLE
+    if (crc_table_empty)
+      make_crc_table();
+#endif
+    crc = crc ^ 0xffffffffL;
+    while (len >= 8)
+    {
+      DO8(buf);
+      len -= 8;
+    }
+    if (len) do {
+      DO1(buf);
+    } while (--len);
+    return crc ^ 0xffffffffL;
+}
diff --git a/zlib/deflate.c b/zlib/deflate.c
new file mode 100644 (file)
index 0000000..db4292d
--- /dev/null
@@ -0,0 +1,1350 @@
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/*
+ *  ALGORITHM
+ *
+ *      The "deflation" process depends on being able to identify portions
+ *      of the input text which are identical to earlier input (within a
+ *      sliding window trailing behind the input currently being processed).
+ *
+ *      The most straightforward technique turns out to be the fastest for
+ *      most input files: try all possible matches and select the longest.
+ *      The key feature of this algorithm is that insertions into the string
+ *      dictionary are very simple and thus fast, and deletions are avoided
+ *      completely. Insertions are performed at each input character, whereas
+ *      string matches are performed only when the previous match ends. So it
+ *      is preferable to spend more time in matches to allow very fast string
+ *      insertions and avoid deletions. The matching algorithm for small
+ *      strings is inspired from that of Rabin & Karp. A brute force approach
+ *      is used to find longer strings when a small match has been found.
+ *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ *      (by Leonid Broukhis).
+ *         A previous version of this file used a more sophisticated algorithm
+ *      (by Fiala and Greene) which is guaranteed to run in linear amortized
+ *      time, but has a larger average cost, uses more memory and is patented.
+ *      However the F&G algorithm may be faster for some highly redundant
+ *      files if the parameter max_chain_length (described below) is too large.
+ *
+ *  ACKNOWLEDGEMENTS
+ *
+ *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ *      I found it in 'freeze' written by Leonid Broukhis.
+ *      Thanks to many people for bug reports and testing.
+ *
+ *  REFERENCES
+ *
+ *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
+ *      Available in ftp://ds.internic.net/rfc/rfc1951.txt
+ *
+ *      A description of the Rabin and Karp algorithm is given in the book
+ *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ *      Fiala,E.R., and Greene,D.H.
+ *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ */
+
+/* @(#) $Id: deflate.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#include "deflate.h"
+
+const char deflate_copyright[] =
+   " deflate 1.1.4 Copyright 1995-2002 Jean-loup Gailly ";
+/*
+  If you use the zlib library in a product, an acknowledgment is welcome
+  in the documentation of your product. If for some reason you cannot
+  include such an acknowledgment, I would appreciate that you keep this
+  copyright string in the executable of your product.
+ */
+
+/* ===========================================================================
+ *  Function prototypes.
+ */
+typedef enum {
+    need_more,      /* block not completed, need more input or more output */
+    block_done,     /* block flush performed */
+    finish_started, /* finish started, need only more output at next deflate */
+    finish_done     /* finish done, accept no more input or output */
+} block_state;
+
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+/* Compression function. Returns the block state after the call. */
+
+local void fill_window    OF((deflate_state *s));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast   OF((deflate_state *s, int flush));
+local block_state deflate_slow   OF((deflate_state *s, int flush));
+local void lm_init        OF((deflate_state *s));
+local void putShortMSB    OF((deflate_state *s, uInt b));
+local void flush_pending  OF((z_streamp strm));
+local int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));
+#ifdef ASMV
+      void match_init OF((void)); /* asm code initialization */
+      uInt longest_match  OF((deflate_state *s, IPos cur_match));
+#else
+local uInt longest_match  OF((deflate_state *s, IPos cur_match));
+#endif
+
+#ifdef DEBUG
+local  void check_match OF((deflate_state *s, IPos start, IPos match,
+                            int length));
+#endif
+
+/* ===========================================================================
+ * Local data
+ */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#ifndef TOO_FAR
+#  define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+typedef struct config_s {
+   ush good_length; /* reduce lazy search above this match length */
+   ush max_lazy;    /* do not perform lazy search above this match length */
+   ush nice_length; /* quit search above this match length */
+   ush max_chain;
+   compress_func func;
+} config;
+
+local const config configuration_table[10] = {
+/*      good lazy nice chain */
+/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */
+/* 1 */ {4,    4,  8,    4, deflate_fast}, /* maximum speed, no lazy matches */
+/* 2 */ {4,    5, 16,    8, deflate_fast},
+/* 3 */ {4,    6, 32,   32, deflate_fast},
+
+/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */
+/* 5 */ {8,   16, 32,   32, deflate_slow},
+/* 6 */ {8,   16, 128, 128, deflate_slow},
+/* 7 */ {8,   32, 128, 256, deflate_slow},
+/* 8 */ {32, 128, 258, 1024, deflate_slow},
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN  assertion: all calls to to UPDATE_HASH are made with consecutive
+ *    input characters, so that a running hash key can be computed from the
+ *    previous key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN  assertion: all calls to to INSERT_STRING are made with consecutive
+ *    input characters and the first MIN_MATCH bytes of str are valid
+ *    (except for the last MIN_MATCH-1 bytes of the input file).
+ */
+#ifdef FASTEST
+#define INSERT_STRING(s, str, match_head) \
+   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+    match_head = s->head[s->ins_h], \
+    s->head[s->ins_h] = (Pos)(str))
+#else
+#define INSERT_STRING(s, str, match_head) \
+   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+    s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
+    s->head[s->ins_h] = (Pos)(str))
+#endif
+
+/* ===========================================================================
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
+ * prev[] will be initialized on the fly.
+ */
+#define CLEAR_HASH(s) \
+    s->head[s->hash_size-1] = NIL; \
+    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
+
+/* ========================================================================= */
+int ZEXPORT deflateInit_(strm, level, version, stream_size)
+    z_streamp strm;
+    int level;
+    const char *version;
+    int stream_size;
+{
+    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
+                        Z_DEFAULT_STRATEGY, version, stream_size);
+    /* To do: ignore strm->next_in if we use it as window */
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+                 version, stream_size)
+    z_streamp strm;
+    int  level;
+    int  method;
+    int  windowBits;
+    int  memLevel;
+    int  strategy;
+    const char *version;
+    int stream_size;
+{
+    deflate_state *s;
+    int noheader = 0;
+    static const char* my_version = ZLIB_VERSION;
+
+    ushf *overlay;
+    /* We overlay pending_buf and d_buf+l_buf. This works since the average
+     * output size for (length,distance) codes is <= 24 bits.
+     */
+
+    if (version == Z_NULL || version[0] != my_version[0] ||
+        stream_size != sizeof(z_stream)) {
+       return Z_VERSION_ERROR;
+    }
+    if (strm == Z_NULL) return Z_STREAM_ERROR;
+
+    strm->msg = Z_NULL;
+    if (strm->zalloc == Z_NULL) {
+       strm->zalloc = zcalloc;
+       strm->opaque = (voidpf)0;
+    }
+    if (strm->zfree == Z_NULL) strm->zfree = zcfree;
+
+    if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#ifdef FASTEST
+    level = 1;
+#endif
+
+    if (windowBits < 0) { /* undocumented feature: suppress zlib header */
+        noheader = 1;
+        windowBits = -windowBits;
+    }
+    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
+        windowBits < 9 || windowBits > 15 || level < 0 || level > 9 ||
+       strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
+        return Z_STREAM_ERROR;
+    }
+    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
+    if (s == Z_NULL) return Z_MEM_ERROR;
+    strm->state = (struct internal_state FAR *)s;
+    s->strm = strm;
+
+    s->noheader = noheader;
+    s->w_bits = windowBits;
+    s->w_size = 1 << s->w_bits;
+    s->w_mask = s->w_size - 1;
+
+    s->hash_bits = memLevel + 7;
+    s->hash_size = 1 << s->hash_bits;
+    s->hash_mask = s->hash_size - 1;
+    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+
+    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
+    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));
+    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+    s->pending_buf = (uchf *) overlay;
+    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
+
+    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
+        s->pending_buf == Z_NULL) {
+        strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
+        deflateEnd (strm);
+        return Z_MEM_ERROR;
+    }
+    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+
+    s->level = level;
+    s->strategy = strategy;
+    s->method = (Byte)method;
+
+    return deflateReset(strm);
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
+    z_streamp strm;
+    const Bytef *dictionary;
+    uInt  dictLength;
+{
+    deflate_state *s;
+    uInt length = dictLength;
+    uInt n;
+    IPos hash_head = 0;
+
+    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
+        strm->state->status != INIT_STATE) return Z_STREAM_ERROR;
+
+    s = strm->state;
+    strm->adler = adler32(strm->adler, dictionary, dictLength);
+
+    if (length < MIN_MATCH) return Z_OK;
+    if (length > MAX_DIST(s)) {
+       length = MAX_DIST(s);
+#ifndef USE_DICT_HEAD
+       dictionary += dictLength - length; /* use the tail of the dictionary */
+#endif
+    }
+    zmemcpy(s->window, dictionary, length);
+    s->strstart = length;
+    s->block_start = (long)length;
+
+    /* Insert all strings in the hash table (except for the last two bytes).
+     * s->lookahead stays null, so s->ins_h will be recomputed at the next
+     * call of fill_window.
+     */
+    s->ins_h = s->window[0];
+    UPDATE_HASH(s, s->ins_h, s->window[1]);
+    for (n = 0; n <= length - MIN_MATCH; n++) {
+       INSERT_STRING(s, n, hash_head);
+    }
+    if (hash_head) hash_head = 0;  /* to make compiler happy */
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateReset (strm)
+    z_streamp strm;
+{
+    deflate_state *s;
+    
+    if (strm == Z_NULL || strm->state == Z_NULL ||
+        strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR;
+
+    strm->total_in = strm->total_out = 0;
+    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
+    strm->data_type = Z_UNKNOWN;
+
+    s = (deflate_state *)strm->state;
+    s->pending = 0;
+    s->pending_out = s->pending_buf;
+
+    if (s->noheader < 0) {
+        s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */
+    }
+    s->status = s->noheader ? BUSY_STATE : INIT_STATE;
+    strm->adler = 1;
+    s->last_flush = Z_NO_FLUSH;
+
+    _tr_init(s);
+    lm_init(s);
+
+    return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateParams(strm, level, strategy)
+    z_streamp strm;
+    int level;
+    int strategy;
+{
+    deflate_state *s;
+    compress_func func;
+    int err = Z_OK;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+    s = strm->state;
+
+    if (level == Z_DEFAULT_COMPRESSION) {
+       level = 6;
+    }
+    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
+       return Z_STREAM_ERROR;
+    }
+    func = configuration_table[s->level].func;
+
+    if (func != configuration_table[level].func && strm->total_in != 0) {
+       /* Flush the last buffer: */
+       err = deflate(strm, Z_PARTIAL_FLUSH);
+    }
+    if (s->level != level) {
+       s->level = level;
+       s->max_lazy_match   = configuration_table[level].max_lazy;
+       s->good_match       = configuration_table[level].good_length;
+       s->nice_match       = configuration_table[level].nice_length;
+       s->max_chain_length = configuration_table[level].max_chain;
+    }
+    s->strategy = strategy;
+    return err;
+}
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+local void putShortMSB (s, b)
+    deflate_state *s;
+    uInt b;
+{
+    put_byte(s, (Byte)(b >> 8));
+    put_byte(s, (Byte)(b & 0xff));
+}   
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->next_out buffer and copying into it.
+ * (See also read_buf()).
+ */
+local void flush_pending(strm)
+    z_streamp strm;
+{
+    unsigned len = strm->state->pending;
+
+    if (len > strm->avail_out) len = strm->avail_out;
+    if (len == 0) return;
+
+    zmemcpy(strm->next_out, strm->state->pending_out, len);
+    strm->next_out  += len;
+    strm->state->pending_out  += len;
+    strm->total_out += len;
+    strm->avail_out  -= len;
+    strm->state->pending -= len;
+    if (strm->state->pending == 0) {
+        strm->state->pending_out = strm->state->pending_buf;
+    }
+}
+
+/* ========================================================================= */
+int ZEXPORT deflate (strm, flush)
+    z_streamp strm;
+    int flush;
+{
+    int old_flush; /* value of flush param for previous deflate call */
+    deflate_state *s;
+
+    if (strm == Z_NULL || strm->state == Z_NULL ||
+       flush > Z_FINISH || flush < 0) {
+        return Z_STREAM_ERROR;
+    }
+    s = strm->state;
+
+    if (strm->next_out == Z_NULL ||
+        (strm->next_in == Z_NULL && strm->avail_in != 0) ||
+       (s->status == FINISH_STATE && flush != Z_FINISH)) {
+        ERR_RETURN(strm, Z_STREAM_ERROR);
+    }
+    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
+
+    s->strm = strm; /* just in case */
+    old_flush = s->last_flush;
+    s->last_flush = flush;
+
+    /* Write the zlib header */
+    if (s->status == INIT_STATE) {
+
+        uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+        uInt level_flags = (s->level-1) >> 1;
+
+        if (level_flags > 3) level_flags = 3;
+        header |= (level_flags << 6);
+       if (s->strstart != 0) header |= PRESET_DICT;
+        header += 31 - (header % 31);
+
+        s->status = BUSY_STATE;
+        putShortMSB(s, header);
+
+       /* Save the adler32 of the preset dictionary: */
+       if (s->strstart != 0) {
+           putShortMSB(s, (uInt)(strm->adler >> 16));
+           putShortMSB(s, (uInt)(strm->adler & 0xffff));
+       }
+       strm->adler = 1L;
+    }
+
+    /* Flush as much pending output as possible */
+    if (s->pending != 0) {
+        flush_pending(strm);
+        if (strm->avail_out == 0) {
+           /* Since avail_out is 0, deflate will be called again with
+            * more output space, but possibly with both pending and
+            * avail_in equal to zero. There won't be anything to do,
+            * but this is not an error situation so make sure we
+            * return OK instead of BUF_ERROR at next call of deflate:
+             */
+           s->last_flush = -1;
+           return Z_OK;
+       }
+
+    /* Make sure there is something to do and avoid duplicate consecutive
+     * flushes. For repeated and useless calls with Z_FINISH, we keep
+     * returning Z_STREAM_END instead of Z_BUFF_ERROR.
+     */
+    } else if (strm->avail_in == 0 && flush <= old_flush &&
+              flush != Z_FINISH) {
+        ERR_RETURN(strm, Z_BUF_ERROR);
+    }
+
+    /* User must not provide more input after the first FINISH: */
+    if (s->status == FINISH_STATE && strm->avail_in != 0) {
+        ERR_RETURN(strm, Z_BUF_ERROR);
+    }
+
+    /* Start a new block or continue the current one.
+     */
+    if (strm->avail_in != 0 || s->lookahead != 0 ||
+        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
+        block_state bstate;
+
+       bstate = (*(configuration_table[s->level].func))(s, flush);
+
+        if (bstate == finish_started || bstate == finish_done) {
+            s->status = FINISH_STATE;
+        }
+        if (bstate == need_more || bstate == finish_started) {
+           if (strm->avail_out == 0) {
+               s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
+           }
+           return Z_OK;
+           /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+            * of deflate should use the same flush parameter to make sure
+            * that the flush is complete. So we don't have to output an
+            * empty block here, this will be done at next call. This also
+            * ensures that for a very small output buffer, we emit at most
+            * one empty block.
+            */
+       }
+        if (bstate == block_done) {
+            if (flush == Z_PARTIAL_FLUSH) {
+                _tr_align(s);
+            } else { /* FULL_FLUSH or SYNC_FLUSH */
+                _tr_stored_block(s, (char*)0, 0L, 0);
+                /* For a full flush, this empty block will be recognized
+                 * as a special marker by inflate_sync().
+                 */
+                if (flush == Z_FULL_FLUSH) {
+                    CLEAR_HASH(s);             /* forget history */
+                }
+            }
+            flush_pending(strm);
+           if (strm->avail_out == 0) {
+             s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+             return Z_OK;
+           }
+        }
+    }
+    Assert(strm->avail_out > 0, "bug2");
+
+    if (flush != Z_FINISH) return Z_OK;
+    if (s->noheader) return Z_STREAM_END;
+
+    /* Write the zlib trailer (adler32) */
+    putShortMSB(s, (uInt)(strm->adler >> 16));
+    putShortMSB(s, (uInt)(strm->adler & 0xffff));
+    flush_pending(strm);
+    /* If avail_out is zero, the application will call deflate again
+     * to flush the rest.
+     */
+    s->noheader = -1; /* write the trailer only once! */
+    return s->pending != 0 ? Z_OK : Z_STREAM_END;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateEnd (strm)
+    z_streamp strm;
+{
+    int status;
+
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+
+    status = strm->state->status;
+    if (status != INIT_STATE && status != BUSY_STATE &&
+       status != FINISH_STATE) {
+      return Z_STREAM_ERROR;
+    }
+
+    /* Deallocate in reverse order of allocations: */
+    TRY_FREE(strm, strm->state->pending_buf);
+    TRY_FREE(strm, strm->state->head);
+    TRY_FREE(strm, strm->state->prev);
+    TRY_FREE(strm, strm->state->window);
+
+    ZFREE(strm, strm->state);
+    strm->state = Z_NULL;
+
+    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+}
+
+/* =========================================================================
+ * Copy the source state to the destination state.
+ * To simplify the source, this is not supported for 16-bit MSDOS (which
+ * doesn't have enough memory anyway to duplicate compression states).
+ */
+int ZEXPORT deflateCopy (dest, source)
+    z_streamp dest;
+    z_streamp source;
+{
+#ifdef MAXSEG_64K
+    return Z_STREAM_ERROR;
+#else
+    deflate_state *ds;
+    deflate_state *ss;
+    ushf *overlay;
+
+
+    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
+        return Z_STREAM_ERROR;
+    }
+
+    ss = source->state;
+
+    *dest = *source;
+
+    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
+    if (ds == Z_NULL) return Z_MEM_ERROR;
+    dest->state = (struct internal_state FAR *) ds;
+    *ds = *ss;
+    ds->strm = dest;
+
+    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
+    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));
+    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));
+    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
+    ds->pending_buf = (uchf *) overlay;
+
+    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
+        ds->pending_buf == Z_NULL) {
+        deflateEnd (dest);
+        return Z_MEM_ERROR;
+    }
+    /* following zmemcpy do not work for 16-bit MSDOS */
+    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
+    zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
+    zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
+    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+
+    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
+    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
+
+    ds->l_desc.dyn_tree = ds->dyn_ltree;
+    ds->d_desc.dyn_tree = ds->dyn_dtree;
+    ds->bl_desc.dyn_tree = ds->bl_tree;
+
+    return Z_OK;
+#endif
+}
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read.  All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local int read_buf(strm, buf, size)
+    z_streamp strm;
+    Bytef *buf;
+    unsigned size;
+{
+    unsigned len = strm->avail_in;
+
+    if (len > size) len = size;
+    if (len == 0) return 0;
+
+    strm->avail_in  -= len;
+
+    if (!strm->state->noheader) {
+        strm->adler = adler32(strm->adler, strm->next_in, len);
+    }
+    zmemcpy(buf, strm->next_in, len);
+    strm->next_in  += len;
+    strm->total_in += len;
+
+    return (int)len;
+}
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init (s)
+    deflate_state *s;
+{
+    s->window_size = (ulg)2L*s->w_size;
+
+    CLEAR_HASH(s);
+
+    /* Set the default configuration parameters:
+     */
+    s->max_lazy_match   = configuration_table[s->level].max_lazy;
+    s->good_match       = configuration_table[s->level].good_length;
+    s->nice_match       = configuration_table[s->level].nice_length;
+    s->max_chain_length = configuration_table[s->level].max_chain;
+
+    s->strstart = 0;
+    s->block_start = 0L;
+    s->lookahead = 0;
+    s->match_length = s->prev_length = MIN_MATCH-1;
+    s->match_available = 0;
+    s->ins_h = 0;
+#ifdef ASMV
+    match_init(); /* initialize the asm code */
+#endif
+}
+
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+#ifndef ASMV
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
+ * match.S. The code will be functionally equivalent.
+ */
+#ifndef FASTEST
+local uInt longest_match(s, cur_match)
+    deflate_state *s;
+    IPos cur_match;                             /* current match */
+{
+    unsigned chain_length = s->max_chain_length;/* max hash chain length */
+    register Bytef *scan = s->window + s->strstart; /* current string */
+    register Bytef *match;                       /* matched string */
+    register int len;                           /* length of current match */
+    int best_len = s->prev_length;              /* best match length so far */
+    int nice_match = s->nice_match;             /* stop if match long enough */
+    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+        s->strstart - (IPos)MAX_DIST(s) : NIL;
+    /* Stop when cur_match becomes <= limit. To simplify the code,
+     * we prevent matches with the string of window index 0.
+     */
+    Posf *prev = s->prev;
+    uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+    /* Compare two bytes at a time. Note: this is not always beneficial.
+     * Try with and without -DUNALIGNED_OK to check.
+     */
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+    register ush scan_start = *(ushf*)scan;
+    register ush scan_end   = *(ushf*)(scan+best_len-1);
+#else
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+    register Byte scan_end1  = scan[best_len-1];
+    register Byte scan_end   = scan[best_len];
+#endif
+
+    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+     * It is easy to get rid of this optimization if necessary.
+     */
+    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+    /* Do not waste too much time if we already have a good match: */
+    if (s->prev_length >= s->good_match) {
+        chain_length >>= 2;
+    }
+    /* Do not look for matches beyond the end of the input. This is necessary
+     * to make deflate deterministic.
+     */
+    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+    do {
+        Assert(cur_match < s->strstart, "no future");
+        match = s->window + cur_match;
+
+        /* Skip to next match if the match length cannot increase
+         * or if the match length is less than 2:
+         */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+        /* This code assumes sizeof(unsigned short) == 2. Do not use
+         * UNALIGNED_OK if your compiler uses a different size.
+         */
+        if (*(ushf*)(match+best_len-1) != scan_end ||
+            *(ushf*)match != scan_start) continue;
+
+        /* It is not necessary to compare scan[2] and match[2] since they are
+         * always equal when the other bytes match, given that the hash keys
+         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+         * strstart+3, +5, ... up to strstart+257. We check for insufficient
+         * lookahead only every 4th comparison; the 128th check will be made
+         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+         * necessary to put more guard bytes at the end of the window, or
+         * to check more often for insufficient lookahead.
+         */
+        Assert(scan[2] == match[2], "scan[2]?");
+        scan++, match++;
+        do {
+        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+                 scan < strend);
+        /* The funny "do {}" generates better code on most compilers */
+
+        /* Here, scan <= window+strstart+257 */
+        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+        if (*scan == *match) scan++;
+
+        len = (MAX_MATCH - 1) - (int)(strend-scan);
+        scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+        if (match[best_len]   != scan_end  ||
+            match[best_len-1] != scan_end1 ||
+            *match            != *scan     ||
+            *++match          != scan[1])      continue;
+
+        /* The check at best_len-1 can be removed because it will be made
+         * again later. (This heuristic is not always a win.)
+         * It is not necessary to compare scan[2] and match[2] since they
+         * are always equal when the other bytes match, given that
+         * the hash keys are equal and that HASH_BITS >= 8.
+         */
+        scan += 2, match++;
+        Assert(*scan == *match, "match[2]?");
+
+        /* We check for insufficient lookahead only every 8th comparison;
+         * the 256th check will be made at strstart+258.
+         */
+        do {
+        } while (*++scan == *++match && *++scan == *++match &&
+                 *++scan == *++match && *++scan == *++match &&
+                 *++scan == *++match && *++scan == *++match &&
+                 *++scan == *++match && *++scan == *++match &&
+                 scan < strend);
+
+        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+        len = MAX_MATCH - (int)(strend - scan);
+        scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+        if (len > best_len) {
+            s->match_start = cur_match;
+            best_len = len;
+            if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+            scan_end = *(ushf*)(scan+best_len-1);
+#else
+            scan_end1  = scan[best_len-1];
+            scan_end   = scan[best_len];
+#endif
+        }
+    } while ((cur_match = prev[cur_match & wmask]) > limit
+             && --chain_length != 0);
+
+    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+    return s->lookahead;
+}
+
+#else /* FASTEST */
+/* ---------------------------------------------------------------------------
+ * Optimized version for level == 1 only
+ */
+local uInt longest_match(s, cur_match)
+    deflate_state *s;
+    IPos cur_match;                             /* current match */
+{
+    register Bytef *scan = s->window + s->strstart; /* current string */
+    register Bytef *match;                       /* matched string */
+    register int len;                           /* length of current match */
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+
+    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+     * It is easy to get rid of this optimization if necessary.
+     */
+    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+    Assert(cur_match < s->strstart, "no future");
+
+    match = s->window + cur_match;
+
+    /* Return failure if the match length is less than 2:
+     */
+    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
+
+    /* The check at best_len-1 can be removed because it will be made
+     * again later. (This heuristic is not always a win.)
+     * It is not necessary to compare scan[2] and match[2] since they
+     * are always equal when the other bytes match, given that
+     * the hash keys are equal and that HASH_BITS >= 8.
+     */
+    scan += 2, match += 2;
+    Assert(*scan == *match, "match[2]?");
+
+    /* We check for insufficient lookahead only every 8th comparison;
+     * the 256th check will be made at strstart+258.
+     */
+    do {
+    } while (*++scan == *++match && *++scan == *++match &&
+            *++scan == *++match && *++scan == *++match &&
+            *++scan == *++match && *++scan == *++match &&
+            *++scan == *++match && *++scan == *++match &&
+            scan < strend);
+
+    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+    len = MAX_MATCH - (int)(strend - scan);
+
+    if (len < MIN_MATCH) return MIN_MATCH - 1;
+
+    s->match_start = cur_match;
+    return len <= s->lookahead ? len : s->lookahead;
+}
+#endif /* FASTEST */
+#endif /* ASMV */
+
+#ifdef DEBUG
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(s, start, match, length)
+    deflate_state *s;
+    IPos start, match;
+    int length;
+{
+    /* check that the match is indeed a match */
+    if (zmemcmp(s->window + match,
+                s->window + start, length) != EQUAL) {
+        fprintf(stderr, " start %u, match %u, length %d\n",
+               start, match, length);
+        do {
+           fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
+       } while (--length != 0);
+        z_error("invalid match");
+    }
+    if (z_verbose > 1) {
+        fprintf(stderr,"\\[%d,%d]", start-match, length);
+        do { putc(s->window[start++], stderr); } while (--length != 0);
+    }
+}
+#else
+#  define check_match(s, start, match, length)
+#endif
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ *    At least one byte has been read, or avail_in == 0; reads are
+ *    performed for at least two bytes (required for the zip translate_eol
+ *    option -- not supported here).
+ */
+local void fill_window(s)
+    deflate_state *s;
+{
+    register unsigned n, m;
+    register Posf *p;
+    unsigned more;    /* Amount of free space at the end of the window. */
+    uInt wsize = s->w_size;
+
+    do {
+        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+        /* Deal with !@#$% 64K limit: */
+        if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+            more = wsize;
+
+        } else if (more == (unsigned)(-1)) {
+            /* Very unlikely, but possible on 16 bit machine if strstart == 0
+             * and lookahead == 1 (input done one byte at time)
+             */
+            more--;
+
+        /* If the window is almost full and there is insufficient lookahead,
+         * move the upper half to the lower one to make room in the upper half.
+         */
+        } else if (s->strstart >= wsize+MAX_DIST(s)) {
+
+            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
+            s->match_start -= wsize;
+            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */
+            s->block_start -= (long) wsize;
+
+            /* Slide the hash table (could be avoided with 32 bit values
+               at the expense of memory usage). We slide even when level == 0
+               to keep the hash table consistent if we switch back to level > 0
+               later. (Using level 0 permanently is not an optimal usage of
+               zlib, so we don't care about this pathological case.)
+             */
+           n = s->hash_size;
+           p = &s->head[n];
+           do {
+               m = *--p;
+               *p = (Pos)(m >= wsize ? m-wsize : NIL);
+           } while (--n);
+
+           n = wsize;
+#ifndef FASTEST
+           p = &s->prev[n];
+           do {
+               m = *--p;
+               *p = (Pos)(m >= wsize ? m-wsize : NIL);
+               /* If n is not on any hash chain, prev[n] is garbage but
+                * its value will never be used.
+                */
+           } while (--n);
+#endif
+            more += wsize;
+        }
+        if (s->strm->avail_in == 0) return;
+
+        /* If there was no sliding:
+         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+         *    more == window_size - lookahead - strstart
+         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+         * => more >= window_size - 2*WSIZE + 2
+         * In the BIG_MEM or MMAP case (not yet supported),
+         *   window_size == input_size + MIN_LOOKAHEAD  &&
+         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+         * Otherwise, window_size == 2*WSIZE so more >= 2.
+         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+         */
+        Assert(more >= 2, "more < 2");
+
+        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+        s->lookahead += n;
+
+        /* Initialize the hash value now that we have some input: */
+        if (s->lookahead >= MIN_MATCH) {
+            s->ins_h = s->window[s->strstart];
+            UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+            Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+        }
+        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+         * but this is not important since only literal bytes will be emitted.
+         */
+
+    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK_ONLY(s, eof) { \
+   _tr_flush_block(s, (s->block_start >= 0L ? \
+                   (charf *)&s->window[(unsigned)s->block_start] : \
+                   (charf *)Z_NULL), \
+               (ulg)((long)s->strstart - s->block_start), \
+               (eof)); \
+   s->block_start = s->strstart; \
+   flush_pending(s->strm); \
+   Tracev((stderr,"[FLUSH]")); \
+}
+
+/* Same but force premature exit if necessary. */
+#define FLUSH_BLOCK(s, eof) { \
+   FLUSH_BLOCK_ONLY(s, eof); \
+   if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+local block_state deflate_stored(s, flush)
+    deflate_state *s;
+    int flush;
+{
+    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+     * to pending_buf_size, and each stored block has a 5 byte header:
+     */
+    ulg max_block_size = 0xffff;
+    ulg max_start;
+
+    if (max_block_size > s->pending_buf_size - 5) {
+        max_block_size = s->pending_buf_size - 5;
+    }
+
+    /* Copy as much as possible from input to output: */
+    for (;;) {
+        /* Fill the window as much as possible: */
+        if (s->lookahead <= 1) {
+
+            Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+                  s->block_start >= (long)s->w_size, "slide too late");
+
+            fill_window(s);
+            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
+
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+       Assert(s->block_start >= 0L, "block gone");
+
+       s->strstart += s->lookahead;
+       s->lookahead = 0;
+
+       /* Emit a stored block if pending_buf will be full: */
+       max_start = s->block_start + max_block_size;
+        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
+           /* strstart == 0 is possible when wraparound on 16-bit machine */
+           s->lookahead = (uInt)(s->strstart - max_start);
+           s->strstart = (uInt)max_start;
+            FLUSH_BLOCK(s, 0);
+       }
+       /* Flush if we may have to slide, otherwise block_start may become
+         * negative and the data will be gone:
+         */
+        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
+            FLUSH_BLOCK(s, 0);
+       }
+    }
+    FLUSH_BLOCK(s, flush == Z_FINISH);
+    return flush == Z_FINISH ? finish_done : block_done;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local block_state deflate_fast(s, flush)
+    deflate_state *s;
+    int flush;
+{
+    IPos hash_head = NIL; /* head of the hash chain */
+    int bflush;           /* set if current block must be flushed */
+
+    for (;;) {
+        /* Make sure that we always have enough lookahead, except
+         * at the end of the input file. We need MAX_MATCH bytes
+         * for the next match, plus MIN_MATCH bytes to insert the
+         * string following the next match.
+         */
+        if (s->lookahead < MIN_LOOKAHEAD) {
+            fill_window(s);
+            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+               return need_more;
+           }
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+
+        /* Insert the string window[strstart .. strstart+2] in the
+         * dictionary, and set hash_head to the head of the hash chain:
+         */
+        if (s->lookahead >= MIN_MATCH) {
+            INSERT_STRING(s, s->strstart, hash_head);
+        }
+
+        /* Find the longest match, discarding those <= prev_length.
+         * At this point we have always match_length < MIN_MATCH
+         */
+        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
+            /* To simplify the code, we prevent matches with the string
+             * of window index 0 (in particular we have to avoid a match
+             * of the string with itself at the start of the input file).
+             */
+            if (s->strategy != Z_HUFFMAN_ONLY) {
+                s->match_length = longest_match (s, hash_head);
+            }
+            /* longest_match() sets match_start */
+        }
+        if (s->match_length >= MIN_MATCH) {
+            check_match(s, s->strstart, s->match_start, s->match_length);
+
+            _tr_tally_dist(s, s->strstart - s->match_start,
+                           s->match_length - MIN_MATCH, bflush);
+
+            s->lookahead -= s->match_length;
+
+            /* Insert new strings in the hash table only if the match length
+             * is not too large. This saves time but degrades compression.
+             */
+#ifndef FASTEST
+            if (s->match_length <= s->max_insert_length &&
+                s->lookahead >= MIN_MATCH) {
+                s->match_length--; /* string at strstart already in hash table */
+                do {
+                    s->strstart++;
+                    INSERT_STRING(s, s->strstart, hash_head);
+                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+                     * always MIN_MATCH bytes ahead.
+                     */
+                } while (--s->match_length != 0);
+                s->strstart++; 
+            } else
+#endif
+           {
+                s->strstart += s->match_length;
+                s->match_length = 0;
+                s->ins_h = s->window[s->strstart];
+                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+                Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+                 * matter since it will be recomputed at next deflate call.
+                 */
+            }
+        } else {
+            /* No match, output a literal byte */
+            Tracevv((stderr,"%c", s->window[s->strstart]));
+            _tr_tally_lit (s, s->window[s->strstart], bflush);
+            s->lookahead--;
+            s->strstart++; 
+        }
+        if (bflush) FLUSH_BLOCK(s, 0);
+    }
+    FLUSH_BLOCK(s, flush == Z_FINISH);
+    return flush == Z_FINISH ? finish_done : block_done;
+}
+
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+local block_state deflate_slow(s, flush)
+    deflate_state *s;
+    int flush;
+{
+    IPos hash_head = NIL;    /* head of hash chain */
+    int bflush;              /* set if current block must be flushed */
+
+    /* Process the input block. */
+    for (;;) {
+        /* Make sure that we always have enough lookahead, except
+         * at the end of the input file. We need MAX_MATCH bytes
+         * for the next match, plus MIN_MATCH bytes to insert the
+         * string following the next match.
+         */
+        if (s->lookahead < MIN_LOOKAHEAD) {
+            fill_window(s);
+            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+               return need_more;
+           }
+            if (s->lookahead == 0) break; /* flush the current block */
+        }
+
+        /* Insert the string window[strstart .. strstart+2] in the
+         * dictionary, and set hash_head to the head of the hash chain:
+         */
+        if (s->lookahead >= MIN_MATCH) {
+            INSERT_STRING(s, s->strstart, hash_head);
+        }
+
+        /* Find the longest match, discarding those <= prev_length.
+         */
+        s->prev_length = s->match_length, s->prev_match = s->match_start;
+        s->match_length = MIN_MATCH-1;
+
+        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+            s->strstart - hash_head <= MAX_DIST(s)) {
+            /* To simplify the code, we prevent matches with the string
+             * of window index 0 (in particular we have to avoid a match
+             * of the string with itself at the start of the input file).
+             */
+            if (s->strategy != Z_HUFFMAN_ONLY) {
+                s->match_length = longest_match (s, hash_head);
+            }
+            /* longest_match() sets match_start */
+
+            if (s->match_length <= 5 && (s->strategy == Z_FILTERED ||
+                 (s->match_length == MIN_MATCH &&
+                  s->strstart - s->match_start > TOO_FAR))) {
+
+                /* If prev_match is also MIN_MATCH, match_start is garbage
+                 * but we will ignore the current match anyway.
+                 */
+                s->match_length = MIN_MATCH-1;
+            }
+        }
+        /* If there was a match at the previous step and the current
+         * match is not better, output the previous match:
+         */
+        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
+            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+            /* Do not insert strings in hash table beyond this. */
+
+            check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+
+            _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+                          s->prev_length - MIN_MATCH, bflush);
+
+            /* Insert in hash table all strings up to the end of the match.
+             * strstart-1 and strstart are already inserted. If there is not
+             * enough lookahead, the last two strings are not inserted in
+             * the hash table.
+             */
+            s->lookahead -= s->prev_length-1;
+            s->prev_length -= 2;
+            do {
+                if (++s->strstart <= max_insert) {
+                    INSERT_STRING(s, s->strstart, hash_head);
+                }
+            } while (--s->prev_length != 0);
+            s->match_available = 0;
+            s->match_length = MIN_MATCH-1;
+            s->strstart++;
+
+            if (bflush) FLUSH_BLOCK(s, 0);
+
+        } else if (s->match_available) {
+            /* If there was no match at the previous position, output a
+             * single literal. If there was a match but the current match
+             * is longer, truncate the previous match to a single literal.
+             */
+            Tracevv((stderr,"%c", s->window[s->strstart-1]));
+           _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+           if (bflush) {
+                FLUSH_BLOCK_ONLY(s, 0);
+            }
+            s->strstart++;
+            s->lookahead--;
+            if (s->strm->avail_out == 0) return need_more;
+        } else {
+            /* There is no previous match to compare with, wait for
+             * the next step to decide.
+             */
+            s->match_available = 1;
+            s->strstart++;
+            s->lookahead--;
+        }
+    }
+    Assert (flush != Z_NO_FLUSH, "no flush?");
+    if (s->match_available) {
+        Tracevv((stderr,"%c", s->window[s->strstart-1]));
+        _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+        s->match_available = 0;
+    }
+    FLUSH_BLOCK(s, flush == Z_FINISH);
+    return flush == Z_FINISH ? finish_done : block_done;
+}
diff --git a/zlib/deflate.h b/zlib/deflate.h
new file mode 100644 (file)
index 0000000..81f0e7a
--- /dev/null
@@ -0,0 +1,318 @@
+/* deflate.h -- internal compression state
+ * Copyright (C) 1995-2002 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id: deflate.h 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#ifndef _DEFLATE_H
+#define _DEFLATE_H
+
+#include "zutil.h"
+
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS  256
+/* number of literal bytes 0..255 */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES   30
+/* number of distance codes */
+
+#define BL_CODES  19
+/* number of codes used to transfer the bit lengths */
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define INIT_STATE    42
+#define BUSY_STATE   113
+#define FINISH_STATE 666
+/* Stream status */
+
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data_s {
+    union {
+        ush  freq;       /* frequency count */
+        ush  code;       /* bit string */
+    } fc;
+    union {
+        ush  dad;        /* father node in Huffman tree */
+        ush  len;        /* length of bit string */
+    } dl;
+} FAR ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad  dl.dad
+#define Len  dl.len
+
+typedef struct static_tree_desc_s  static_tree_desc;
+
+typedef struct tree_desc_s {
+    ct_data *dyn_tree;           /* the dynamic tree */
+    int     max_code;            /* largest code with non zero frequency */
+    static_tree_desc *stat_desc; /* the corresponding static tree */
+} FAR tree_desc;
+
+typedef ush Pos;
+typedef Pos FAR Posf;
+typedef unsigned IPos;
+
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+typedef struct internal_state {
+    z_streamp strm;      /* pointer back to this zlib stream */
+    int   status;        /* as the name implies */
+    Bytef *pending_buf;  /* output still pending */
+    ulg   pending_buf_size; /* size of pending_buf */
+    Bytef *pending_out;  /* next pending byte to output to the stream */
+    int   pending;       /* nb of bytes in the pending buffer */
+    int   noheader;      /* suppress zlib header and adler32 */
+    Byte  data_type;     /* UNKNOWN, BINARY or ASCII */
+    Byte  method;        /* STORED (for zip only) or DEFLATED */
+    int   last_flush;    /* value of flush param for previous deflate call */
+
+                /* used by deflate.c: */
+
+    uInt  w_size;        /* LZ77 window size (32K by default) */
+    uInt  w_bits;        /* log2(w_size)  (8..16) */
+    uInt  w_mask;        /* w_size - 1 */
+
+    Bytef *window;
+    /* Sliding window. Input bytes are read into the second half of the window,
+     * and move to the first half later to keep a dictionary of at least wSize
+     * bytes. With this organization, matches are limited to a distance of
+     * wSize-MAX_MATCH bytes, but this ensures that IO is always
+     * performed with a length multiple of the block size. Also, it limits
+     * the window size to 64K, which is quite useful on MSDOS.
+     * To do: use the user input buffer as sliding window.
+     */
+
+    ulg window_size;
+    /* Actual size of window: 2*wSize, except when the user input buffer
+     * is directly used as sliding window.
+     */
+
+    Posf *prev;
+    /* Link to older string with same hash index. To limit the size of this
+     * array to 64K, this link is maintained only for the last 32K strings.
+     * An index in this array is thus a window index modulo 32K.
+     */
+
+    Posf *head; /* Heads of the hash chains or NIL. */
+
+    uInt  ins_h;          /* hash index of string to be inserted */
+    uInt  hash_size;      /* number of elements in hash table */
+    uInt  hash_bits;      /* log2(hash_size) */
+    uInt  hash_mask;      /* hash_size-1 */
+
+    uInt  hash_shift;
+    /* Number of bits by which ins_h must be shifted at each input
+     * step. It must be such that after MIN_MATCH steps, the oldest
+     * byte no longer takes part in the hash key, that is:
+     *   hash_shift * MIN_MATCH >= hash_bits
+     */
+
+    long block_start;
+    /* Window position at the beginning of the current output block. Gets
+     * negative when the window is moved backwards.
+     */
+
+    uInt match_length;           /* length of best match */
+    IPos prev_match;             /* previous match */
+    int match_available;         /* set if previous match exists */
+    uInt strstart;               /* start of string to insert */
+    uInt match_start;            /* start of matching string */
+    uInt lookahead;              /* number of valid bytes ahead in window */
+
+    uInt prev_length;
+    /* Length of the best match at previous step. Matches not greater than this
+     * are discarded. This is used in the lazy match evaluation.
+     */
+
+    uInt max_chain_length;
+    /* To speed up deflation, hash chains are never searched beyond this
+     * length.  A higher limit improves compression ratio but degrades the
+     * speed.
+     */
+
+    uInt max_lazy_match;
+    /* Attempt to find a better match only when the current match is strictly
+     * smaller than this value. This mechanism is used only for compression
+     * levels >= 4.
+     */
+#   define max_insert_length  max_lazy_match
+    /* Insert new strings in the hash table only if the match length is not
+     * greater than this length. This saves time but degrades compression.
+     * max_insert_length is used only for compression levels <= 3.
+     */
+
+    int level;    /* compression level (1..9) */
+    int strategy; /* favor or force Huffman coding*/
+
+    uInt good_match;
+    /* Use a faster search when the previous match is longer than this */
+
+    int nice_match; /* Stop searching when current match exceeds this */
+
+                /* used by trees.c: */
+    /* Didn't use ct_data typedef below to supress compiler warning */
+    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */
+    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */
+
+    struct tree_desc_s l_desc;               /* desc. for literal tree */
+    struct tree_desc_s d_desc;               /* desc. for distance tree */
+    struct tree_desc_s bl_desc;              /* desc. for bit length tree */
+
+    ush bl_count[MAX_BITS+1];
+    /* number of codes at each bit length for an optimal tree */
+
+    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */
+    int heap_len;               /* number of elements in the heap */
+    int heap_max;               /* element of largest frequency */
+    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+     * The same heap array is used to build all trees.
+     */
+
+    uch depth[2*L_CODES+1];
+    /* Depth of each subtree used as tie breaker for trees of equal frequency
+     */
+
+    uchf *l_buf;          /* buffer for literals or lengths */
+
+    uInt  lit_bufsize;
+    /* Size of match buffer for literals/lengths.  There are 4 reasons for
+     * limiting lit_bufsize to 64K:
+     *   - frequencies can be kept in 16 bit counters
+     *   - if compression is not successful for the first block, all input
+     *     data is still in the window so we can still emit a stored block even
+     *     when input comes from standard input.  (This can also be done for
+     *     all blocks if lit_bufsize is not greater than 32K.)
+     *   - if compression is not successful for a file smaller than 64K, we can
+     *     even emit a stored file instead of a stored block (saving 5 bytes).
+     *     This is applicable only for zip (not gzip or zlib).
+     *   - creating new Huffman trees less frequently may not provide fast
+     *     adaptation to changes in the input data statistics. (Take for
+     *     example a binary file with poorly compressible code followed by
+     *     a highly compressible string table.) Smaller buffer sizes give
+     *     fast adaptation but have of course the overhead of transmitting
+     *     trees more frequently.
+     *   - I can't count above 4
+     */
+
+    uInt last_lit;      /* running index in l_buf */
+
+    ushf *d_buf;
+    /* Buffer for distances. To simplify the code, d_buf and l_buf have
+     * the same number of elements. To use different lengths, an extra flag
+     * array would be necessary.
+     */
+
+    ulg opt_len;        /* bit length of current block with optimal trees */
+    ulg static_len;     /* bit length of current block with static trees */
+    uInt matches;       /* number of string matches in current block */
+    int last_eob_len;   /* bit length of EOB code for last block */
+
+#ifdef DEBUG
+    ulg compressed_len; /* total bit length of compressed file mod 2^32 */
+    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */
+#endif
+
+    ush bi_buf;
+    /* Output buffer. bits are inserted starting at the bottom (least
+     * significant bits).
+     */
+    int bi_valid;
+    /* Number of valid bits in bi_buf.  All bits above the last valid bit
+     * are always zero.
+     */
+
+} FAR deflate_state;
+
+/* Output a byte on the stream.
+ * IN assertion: there is enough room in pending_buf.
+ */
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
+
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+        /* in trees.c */
+void _tr_init         OF((deflate_state *s));
+int  _tr_tally        OF((deflate_state *s, unsigned dist, unsigned lc));
+void _tr_flush_block  OF((deflate_state *s, charf *buf, ulg stored_len,
+                         int eof));
+void _tr_align        OF((deflate_state *s));
+void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
+                          int eof));
+
+#define d_code(dist) \
+   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never
+ * used.
+ */
+
+#ifndef DEBUG
+/* Inline versions of _tr_tally for speed: */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+  extern uch _length_code[];
+  extern uch _dist_code[];
+#else
+  extern const uch _length_code[];
+  extern const uch _dist_code[];
+#endif
+
+# define _tr_tally_lit(s, c, flush) \
+  { uch cc = (c); \
+    s->d_buf[s->last_lit] = 0; \
+    s->l_buf[s->last_lit++] = cc; \
+    s->dyn_ltree[cc].Freq++; \
+    flush = (s->last_lit == s->lit_bufsize-1); \
+   }
+# define _tr_tally_dist(s, distance, length, flush) \
+  { uch len = (length); \
+    ush dist = (distance); \
+    s->d_buf[s->last_lit] = dist; \
+    s->l_buf[s->last_lit++] = len; \
+    dist--; \
+    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+    s->dyn_dtree[d_code(dist)].Freq++; \
+    flush = (s->last_lit == s->lit_bufsize-1); \
+  }
+#else
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+# define _tr_tally_dist(s, distance, length, flush) \
+              flush = _tr_tally(s, distance, length) 
+#endif
+
+#endif
diff --git a/zlib/infblock.c b/zlib/infblock.c
new file mode 100644 (file)
index 0000000..dd7a6d4
--- /dev/null
@@ -0,0 +1,403 @@
+/* infblock.c -- interpret and process block types to last block
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+#include "inftrees.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+/* Table for deflate from PKZIP's appnote.txt. */
+local const uInt border[] = { /* Order of the bit length code lengths */
+        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+/*
+   Notes beyond the 1.93a appnote.txt:
+
+   1. Distance pointers never point before the beginning of the output
+      stream.
+   2. Distance pointers can point back across blocks, up to 32k away.
+   3. There is an implied maximum of 7 bits for the bit length table and
+      15 bits for the actual data.
+   4. If only one code exists, then it is encoded using one bit.  (Zero
+      would be more efficient, but perhaps a little confusing.)  If two
+      codes exist, they are coded using one bit each (0 and 1).
+   5. There is no way of sending zero distance codes--a dummy must be
+      sent if there are none.  (History: a pre 2.0 version of PKZIP would
+      store blocks with no distance codes, but this was discovered to be
+      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
+      zero distance codes, which is sent as one code of zero bits in
+      length.
+   6. There are up to 286 literal/length codes.  Code 256 represents the
+      end-of-block.  Note however that the static length tree defines
+      288 codes just to fill out the Huffman codes.  Codes 286 and 287
+      cannot be used though, since there is no length base or extra bits
+      defined for them.  Similarily, there are up to 30 distance codes.
+      However, static trees define 32 codes (all 5 bits) to fill out the
+      Huffman codes, but the last two had better not show up in the data.
+   7. Unzip can check dynamic Huffman blocks for complete code sets.
+      The exception is that a single code would not be complete (see #4).
+   8. The five bits following the block type is really the number of
+      literal codes sent minus 257.
+   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
+      (1+6+6).  Therefore, to output three times the length, you output
+      three codes (1+1+1), whereas to output four times the same length,
+      you only need two codes (1+3).  Hmm.
+  10. In the tree reconstruction algorithm, Code = Code + Increment
+      only if BitLength(i) is not zero.  (Pretty obvious.)
+  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
+  12. Note: length code 284 can represent 227-258, but length code 285
+      really is 258.  The last length deserves its own, short code
+      since it gets used a lot in very redundant files.  The length
+      258 is special since 258 - 3 (the min match length) is 255.
+  13. The literal/length and distance code bit lengths are read as a
+      single stream of lengths.  It is possible (and advantageous) for
+      a repeat code (16, 17, or 18) to go across the boundary between
+      the two sets of lengths.
+ */
+
+
+void inflate_blocks_reset(s, z, c)
+inflate_blocks_statef *s;
+z_streamp z;
+uLongf *c;
+{
+  if (c != Z_NULL)
+    *c = s->check;
+  if (s->mode == BTREE || s->mode == DTREE)
+    ZFREE(z, s->sub.trees.blens);
+  if (s->mode == CODES)
+    inflate_codes_free(s->sub.decode.codes, z);
+  s->mode = TYPE;
+  s->bitk = 0;
+  s->bitb = 0;
+  s->read = s->write = s->window;
+  if (s->checkfn != Z_NULL)
+    z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
+  Tracev((stderr, "inflate:   blocks reset\n"));
+}
+
+
+inflate_blocks_statef *inflate_blocks_new(z, c, w)
+z_streamp z;
+check_func c;
+uInt w;
+{
+  inflate_blocks_statef *s;
+
+  if ((s = (inflate_blocks_statef *)ZALLOC
+       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
+    return s;
+  if ((s->hufts =
+       (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
+  {
+    ZFREE(z, s);
+    return Z_NULL;
+  }
+  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
+  {
+    ZFREE(z, s->hufts);
+    ZFREE(z, s);
+    return Z_NULL;
+  }
+  s->end = s->window + w;
+  s->checkfn = c;
+  s->mode = TYPE;
+  Tracev((stderr, "inflate:   blocks allocated\n"));
+  inflate_blocks_reset(s, z, Z_NULL);
+  return s;
+}
+
+
+int inflate_blocks(s, z, r)
+inflate_blocks_statef *s;
+z_streamp z;
+int r;
+{
+  uInt t;               /* temporary storage */
+  uLong b;              /* bit buffer */
+  uInt k;               /* bits in bit buffer */
+  Bytef *p;             /* input data pointer */
+  uInt n;               /* bytes available there */
+  Bytef *q;             /* output window write pointer */
+  uInt m;               /* bytes to end of window or read pointer */
+
+  /* copy input/output information to locals (UPDATE macro restores) */
+  LOAD
+
+  /* process input based on current state */
+  while (1) switch (s->mode)
+  {
+    case TYPE:
+      NEEDBITS(3)
+      t = (uInt)b & 7;
+      s->last = t & 1;
+      switch (t >> 1)
+      {
+        case 0:                         /* stored */
+          Tracev((stderr, "inflate:     stored block%s\n",
+                 s->last ? " (last)" : ""));
+          DUMPBITS(3)
+          t = k & 7;                    /* go to byte boundary */
+          DUMPBITS(t)
+          s->mode = LENS;               /* get length of stored block */
+          break;
+        case 1:                         /* fixed */
+          Tracev((stderr, "inflate:     fixed codes block%s\n",
+                 s->last ? " (last)" : ""));
+          {
+            uInt bl, bd;
+            inflate_huft *tl, *td;
+
+            inflate_trees_fixed(&bl, &bd, &tl, &td, z);
+            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
+            if (s->sub.decode.codes == Z_NULL)
+            {
+              r = Z_MEM_ERROR;
+              LEAVE
+            }
+          }
+          DUMPBITS(3)
+          s->mode = CODES;
+          break;
+        case 2:                         /* dynamic */
+          Tracev((stderr, "inflate:     dynamic codes block%s\n",
+                 s->last ? " (last)" : ""));
+          DUMPBITS(3)
+          s->mode = TABLE;
+          break;
+        case 3:                         /* illegal */
+          DUMPBITS(3)
+          s->mode = BAD;
+          z->msg = (char*)"invalid block type";
+          r = Z_DATA_ERROR;
+          LEAVE
+      }
+      break;
+    case LENS:
+      NEEDBITS(32)
+      if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
+      {
+        s->mode = BAD;
+        z->msg = (char*)"invalid stored block lengths";
+        r = Z_DATA_ERROR;
+        LEAVE
+      }
+      s->sub.left = (uInt)b & 0xffff;
+      b = k = 0;                      /* dump bits */
+      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
+      s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
+      break;
+    case STORED:
+      if (n == 0)
+        LEAVE
+      NEEDOUT
+      t = s->sub.left;
+      if (t > n) t = n;
+      if (t > m) t = m;
+      zmemcpy(q, p, t);
+      p += t;  n -= t;
+      q += t;  m -= t;
+      if ((s->sub.left -= t) != 0)
+        break;
+      Tracev((stderr, "inflate:       stored end, %lu total out\n",
+              z->total_out + (q >= s->read ? q - s->read :
+              (s->end - s->read) + (q - s->window))));
+      s->mode = s->last ? DRY : TYPE;
+      break;
+    case TABLE:
+      NEEDBITS(14)
+      s->sub.trees.table = t = (uInt)b & 0x3fff;
+#ifndef PKZIP_BUG_WORKAROUND
+      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
+      {
+        s->mode = BAD;
+        z->msg = (char*)"too many length or distance symbols";
+        r = Z_DATA_ERROR;
+        LEAVE
+      }
+#endif
+      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
+      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
+      {
+        r = Z_MEM_ERROR;
+        LEAVE
+      }
+      DUMPBITS(14)
+      s->sub.trees.index = 0;
+      Tracev((stderr, "inflate:       table sizes ok\n"));
+      s->mode = BTREE;
+    case BTREE:
+      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
+      {
+        NEEDBITS(3)
+        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
+        DUMPBITS(3)
+      }
+      while (s->sub.trees.index < 19)
+        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
+      s->sub.trees.bb = 7;
+      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
+                             &s->sub.trees.tb, s->hufts, z);
+      if (t != Z_OK)
+      {
+        r = t;
+        if (r == Z_DATA_ERROR)
+        {
+          ZFREE(z, s->sub.trees.blens);
+          s->mode = BAD;
+        }
+        LEAVE
+      }
+      s->sub.trees.index = 0;
+      Tracev((stderr, "inflate:       bits tree ok\n"));
+      s->mode = DTREE;
+    case DTREE:
+      while (t = s->sub.trees.table,
+             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
+      {
+        inflate_huft *h;
+        uInt i, j, c;
+
+        t = s->sub.trees.bb;
+        NEEDBITS(t)
+        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
+        t = h->bits;
+        c = h->base;
+        if (c < 16)
+        {
+          DUMPBITS(t)
+          s->sub.trees.blens[s->sub.trees.index++] = c;
+        }
+        else /* c == 16..18 */
+        {
+          i = c == 18 ? 7 : c - 14;
+          j = c == 18 ? 11 : 3;
+          NEEDBITS(t + i)
+          DUMPBITS(t)
+          j += (uInt)b & inflate_mask[i];
+          DUMPBITS(i)
+          i = s->sub.trees.index;
+          t = s->sub.trees.table;
+          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
+              (c == 16 && i < 1))
+          {
+            ZFREE(z, s->sub.trees.blens);
+            s->mode = BAD;
+            z->msg = (char*)"invalid bit length repeat";
+            r = Z_DATA_ERROR;
+            LEAVE
+          }
+          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
+          do {
+            s->sub.trees.blens[i++] = c;
+          } while (--j);
+          s->sub.trees.index = i;
+        }
+      }
+      s->sub.trees.tb = Z_NULL;
+      {
+        uInt bl, bd;
+        inflate_huft *tl, *td;
+        inflate_codes_statef *c;
+
+        bl = 9;         /* must be <= 9 for lookahead assumptions */
+        bd = 6;         /* must be <= 9 for lookahead assumptions */
+        t = s->sub.trees.table;
+        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
+                                  s->sub.trees.blens, &bl, &bd, &tl, &td,
+                                  s->hufts, z);
+        if (t != Z_OK)
+        {
+          if (t == (uInt)Z_DATA_ERROR)
+          {
+            ZFREE(z, s->sub.trees.blens);
+            s->mode = BAD;
+          }
+          r = t;
+          LEAVE
+        }
+        Tracev((stderr, "inflate:       trees ok\n"));
+        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
+        {
+          r = Z_MEM_ERROR;
+          LEAVE
+        }
+        s->sub.decode.codes = c;
+      }
+      ZFREE(z, s->sub.trees.blens);
+      s->mode = CODES;
+    case CODES:
+      UPDATE
+      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
+        return inflate_flush(s, z, r);
+      r = Z_OK;
+      inflate_codes_free(s->sub.decode.codes, z);
+      LOAD
+      Tracev((stderr, "inflate:       codes end, %lu total out\n",
+              z->total_out + (q >= s->read ? q - s->read :
+              (s->end - s->read) + (q - s->window))));
+      if (!s->last)
+      {
+        s->mode = TYPE;
+        break;
+      }
+      s->mode = DRY;
+    case DRY:
+      FLUSH
+      if (s->read != s->write)
+        LEAVE
+      s->mode = DONE;
+    case DONE:
+      r = Z_STREAM_END;
+      LEAVE
+    case BAD:
+      r = Z_DATA_ERROR;
+      LEAVE
+    default:
+      r = Z_STREAM_ERROR;
+      LEAVE
+  }
+}
+
+
+int inflate_blocks_free(s, z)
+inflate_blocks_statef *s;
+z_streamp z;
+{
+  inflate_blocks_reset(s, z, Z_NULL);
+  ZFREE(z, s->window);
+  ZFREE(z, s->hufts);
+  ZFREE(z, s);
+  Tracev((stderr, "inflate:   blocks freed\n"));
+  return Z_OK;
+}
+
+
+void inflate_set_dictionary(s, d, n)
+inflate_blocks_statef *s;
+const Bytef *d;
+uInt  n;
+{
+  zmemcpy(s->window, d, n);
+  s->read = s->write = s->window + n;
+}
+
+
+/* Returns true if inflate is currently at the end of a block generated
+ * by Z_SYNC_FLUSH or Z_FULL_FLUSH. 
+ * IN assertion: s != Z_NULL
+ */
+int inflate_blocks_sync_point(s)
+inflate_blocks_statef *s;
+{
+  return s->mode == LENS;
+}
diff --git a/zlib/infblock.h b/zlib/infblock.h
new file mode 100644 (file)
index 0000000..173b226
--- /dev/null
@@ -0,0 +1,39 @@
+/* infblock.h -- header to use infblock.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+struct inflate_blocks_state;
+typedef struct inflate_blocks_state FAR inflate_blocks_statef;
+
+extern inflate_blocks_statef * inflate_blocks_new OF((
+    z_streamp z,
+    check_func c,               /* check function */
+    uInt w));                   /* window size */
+
+extern int inflate_blocks OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    int));                      /* initial return code */
+
+extern void inflate_blocks_reset OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    uLongf *));                  /* check value on output */
+
+extern int inflate_blocks_free OF((
+    inflate_blocks_statef *,
+    z_streamp));
+
+extern void inflate_set_dictionary OF((
+    inflate_blocks_statef *s,
+    const Bytef *d,  /* dictionary */
+    uInt  n));       /* dictionary length */
+
+extern int inflate_blocks_sync_point OF((
+    inflate_blocks_statef *s));
diff --git a/zlib/infcodes.c b/zlib/infcodes.c
new file mode 100644 (file)
index 0000000..9abe541
--- /dev/null
@@ -0,0 +1,251 @@
+/* infcodes.c -- process literals and length/distance pairs
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "infblock.h"
+#include "infcodes.h"
+#include "infutil.h"
+#include "inffast.h"
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+typedef enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
+      START,    /* x: set up for LEN */
+      LEN,      /* i: get length/literal/eob next */
+      LENEXT,   /* i: getting length extra (have base) */
+      DIST,     /* i: get distance next */
+      DISTEXT,  /* i: getting distance extra */
+      COPY,     /* o: copying bytes in window, waiting for space */
+      LIT,      /* o: got literal, waiting for output space */
+      WASH,     /* o: got eob, possibly still output waiting */
+      END,      /* x: got eob and all data flushed */
+      BADCODE}  /* x: got error */
+inflate_codes_mode;
+
+/* inflate codes private state */
+struct inflate_codes_state {
+
+  /* mode */
+  inflate_codes_mode mode;      /* current inflate_codes mode */
+
+  /* mode dependent information */
+  uInt len;
+  union {
+    struct {
+      inflate_huft *tree;       /* pointer into tree */
+      uInt need;                /* bits needed */
+    } code;             /* if LEN or DIST, where in tree */
+    uInt lit;           /* if LIT, literal */
+    struct {
+      uInt get;                 /* bits to get for extra */
+      uInt dist;                /* distance back to copy from */
+    } copy;             /* if EXT or COPY, where and how much */
+  } sub;                /* submode */
+
+  /* mode independent information */
+  Byte lbits;           /* ltree bits decoded per branch */
+  Byte dbits;           /* dtree bits decoder per branch */
+  inflate_huft *ltree;          /* literal/length/eob tree */
+  inflate_huft *dtree;          /* distance tree */
+
+};
+
+
+inflate_codes_statef *inflate_codes_new(bl, bd, tl, td, z)
+uInt bl, bd;
+inflate_huft *tl;
+inflate_huft *td; /* need separate declaration for Borland C++ */
+z_streamp z;
+{
+  inflate_codes_statef *c;
+
+  if ((c = (inflate_codes_statef *)
+       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
+  {
+    c->mode = START;
+    c->lbits = (Byte)bl;
+    c->dbits = (Byte)bd;
+    c->ltree = tl;
+    c->dtree = td;
+    Tracev((stderr, "inflate:       codes new\n"));
+  }
+  return c;
+}
+
+
+int inflate_codes(s, z, r)
+inflate_blocks_statef *s;
+z_streamp z;
+int r;
+{
+  uInt j;               /* temporary storage */
+  inflate_huft *t;      /* temporary pointer */
+  uInt e;               /* extra bits or operation */
+  uLong b;              /* bit buffer */
+  uInt k;               /* bits in bit buffer */
+  Bytef *p;             /* input data pointer */
+  uInt n;               /* bytes available there */
+  Bytef *q;             /* output window write pointer */
+  uInt m;               /* bytes to end of window or read pointer */
+  Bytef *f;             /* pointer to copy strings from */
+  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */
+
+  /* copy input/output information to locals (UPDATE macro restores) */
+  LOAD
+
+  /* process input and output based on current state */
+  while (1) switch (c->mode)
+  {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
+    case START:         /* x: set up for LEN */
+#ifndef SLOW
+      if (m >= 258 && n >= 10)
+      {
+        UPDATE
+        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
+        LOAD
+        if (r != Z_OK)
+        {
+          c->mode = r == Z_STREAM_END ? WASH : BADCODE;
+          break;
+        }
+      }
+#endif /* !SLOW */
+      c->sub.code.need = c->lbits;
+      c->sub.code.tree = c->ltree;
+      c->mode = LEN;
+    case LEN:           /* i: get length/literal/eob next */
+      j = c->sub.code.need;
+      NEEDBITS(j)
+      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
+      DUMPBITS(t->bits)
+      e = (uInt)(t->exop);
+      if (e == 0)               /* literal */
+      {
+        c->sub.lit = t->base;
+        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+                 "inflate:         literal '%c'\n" :
+                 "inflate:         literal 0x%02x\n", t->base));
+        c->mode = LIT;
+        break;
+      }
+      if (e & 16)               /* length */
+      {
+        c->sub.copy.get = e & 15;
+        c->len = t->base;
+        c->mode = LENEXT;
+        break;
+      }
+      if ((e & 64) == 0)        /* next table */
+      {
+        c->sub.code.need = e;
+        c->sub.code.tree = t + t->base;
+        break;
+      }
+      if (e & 32)               /* end of block */
+      {
+        Tracevv((stderr, "inflate:         end of block\n"));
+        c->mode = WASH;
+        break;
+      }
+      c->mode = BADCODE;        /* invalid code */
+      z->msg = (char*)"invalid literal/length code";
+      r = Z_DATA_ERROR;
+      LEAVE
+    case LENEXT:        /* i: getting length extra (have base) */
+      j = c->sub.copy.get;
+      NEEDBITS(j)
+      c->len += (uInt)b & inflate_mask[j];
+      DUMPBITS(j)
+      c->sub.code.need = c->dbits;
+      c->sub.code.tree = c->dtree;
+      Tracevv((stderr, "inflate:         length %u\n", c->len));
+      c->mode = DIST;
+    case DIST:          /* i: get distance next */
+      j = c->sub.code.need;
+      NEEDBITS(j)
+      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
+      DUMPBITS(t->bits)
+      e = (uInt)(t->exop);
+      if (e & 16)               /* distance */
+      {
+        c->sub.copy.get = e & 15;
+        c->sub.copy.dist = t->base;
+        c->mode = DISTEXT;
+        break;
+      }
+      if ((e & 64) == 0)        /* next table */
+      {
+        c->sub.code.need = e;
+        c->sub.code.tree = t + t->base;
+        break;
+      }
+      c->mode = BADCODE;        /* invalid code */
+      z->msg = (char*)"invalid distance code";
+      r = Z_DATA_ERROR;
+      LEAVE
+    case DISTEXT:       /* i: getting distance extra */
+      j = c->sub.copy.get;
+      NEEDBITS(j)
+      c->sub.copy.dist += (uInt)b & inflate_mask[j];
+      DUMPBITS(j)
+      Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist));
+      c->mode = COPY;
+    case COPY:          /* o: copying bytes in window, waiting for space */
+      f = q - c->sub.copy.dist;
+      while (f < s->window)             /* modulo window size-"while" instead */
+        f += s->end - s->window;        /* of "if" handles invalid distances */
+      while (c->len)
+      {
+        NEEDOUT
+        OUTBYTE(*f++)
+        if (f == s->end)
+          f = s->window;
+        c->len--;
+      }
+      c->mode = START;
+      break;
+    case LIT:           /* o: got literal, waiting for output space */
+      NEEDOUT
+      OUTBYTE(c->sub.lit)
+      c->mode = START;
+      break;
+    case WASH:          /* o: got eob, possibly more output */
+      if (k > 7)        /* return unused byte, if any */
+      {
+        Assert(k < 16, "inflate_codes grabbed too many bytes")
+        k -= 8;
+        n++;
+        p--;            /* can always return one */
+      }
+      FLUSH
+      if (s->read != s->write)
+        LEAVE
+      c->mode = END;
+    case END:
+      r = Z_STREAM_END;
+      LEAVE
+    case BADCODE:       /* x: got error */
+      r = Z_DATA_ERROR;
+      LEAVE
+    default:
+      r = Z_STREAM_ERROR;
+      LEAVE
+  }
+#ifdef NEED_DUMMY_RETURN
+  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */
+#endif
+}
+
+
+void inflate_codes_free(c, z)
+inflate_codes_statef *c;
+z_streamp z;
+{
+  ZFREE(z, c);
+  Tracev((stderr, "inflate:       codes free\n"));
+}
diff --git a/zlib/infcodes.h b/zlib/infcodes.h
new file mode 100644 (file)
index 0000000..46821a0
--- /dev/null
@@ -0,0 +1,27 @@
+/* infcodes.h -- header to use infcodes.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+struct inflate_codes_state;
+typedef struct inflate_codes_state FAR inflate_codes_statef;
+
+extern inflate_codes_statef *inflate_codes_new OF((
+    uInt, uInt,
+    inflate_huft *, inflate_huft *,
+    z_streamp ));
+
+extern int inflate_codes OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    int));
+
+extern void inflate_codes_free OF((
+    inflate_codes_statef *,
+    z_streamp ));
+
diff --git a/zlib/inffast.c b/zlib/inffast.c
new file mode 100644 (file)
index 0000000..aa7f1d4
--- /dev/null
@@ -0,0 +1,183 @@
+/* inffast.c -- process literals and length/distance pairs fast
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "infblock.h"
+#include "infcodes.h"
+#include "infutil.h"
+#include "inffast.h"
+
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+/* macros for bit input with no checking and for returning unused bytes */
+#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;}
+
+/* Called with number of bytes left to write in window at least 258
+   (the maximum string length) and number of input bytes available
+   at least ten.  The ten bytes are six bytes for the longest length/
+   distance pair plus four bytes for overloading the bit buffer. */
+
+int inflate_fast(bl, bd, tl, td, s, z)
+uInt bl, bd;
+inflate_huft *tl;
+inflate_huft *td; /* need separate declaration for Borland C++ */
+inflate_blocks_statef *s;
+z_streamp z;
+{
+  inflate_huft *t;      /* temporary pointer */
+  uInt e;               /* extra bits or operation */
+  uLong b;              /* bit buffer */
+  uInt k;               /* bits in bit buffer */
+  Bytef *p;             /* input data pointer */
+  uInt n;               /* bytes available there */
+  Bytef *q;             /* output window write pointer */
+  uInt m;               /* bytes to end of window or read pointer */
+  uInt ml;              /* mask for literal/length tree */
+  uInt md;              /* mask for distance tree */
+  uInt c;               /* bytes to copy */
+  uInt d;               /* distance back to copy from */
+  Bytef *r;             /* copy source pointer */
+
+  /* load input, output, bit values */
+  LOAD
+
+  /* initialize masks */
+  ml = inflate_mask[bl];
+  md = inflate_mask[bd];
+
+  /* do until not enough input or output space for fast loop */
+  do {                          /* assume called with m >= 258 && n >= 10 */
+    /* get literal/length code */
+    GRABBITS(20)                /* max bits for literal/length code */
+    if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
+    {
+      DUMPBITS(t->bits)
+      Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+                "inflate:         * literal '%c'\n" :
+                "inflate:         * literal 0x%02x\n", t->base));
+      *q++ = (Byte)t->base;
+      m--;
+      continue;
+    }
+    do {
+      DUMPBITS(t->bits)
+      if (e & 16)
+      {
+        /* get extra bits for length */
+        e &= 15;
+        c = t->base + ((uInt)b & inflate_mask[e]);
+        DUMPBITS(e)
+        Tracevv((stderr, "inflate:         * length %u\n", c));
+
+        /* decode distance base of block to copy */
+        GRABBITS(15);           /* max bits for distance code */
+        e = (t = td + ((uInt)b & md))->exop;
+        do {
+          DUMPBITS(t->bits)
+          if (e & 16)
+          {
+            /* get extra bits to add to distance base */
+            e &= 15;
+            GRABBITS(e)         /* get extra bits (up to 13) */
+            d = t->base + ((uInt)b & inflate_mask[e]);
+            DUMPBITS(e)
+            Tracevv((stderr, "inflate:         * distance %u\n", d));
+
+            /* do the copy */
+            m -= c;
+            r = q - d;
+            if (r < s->window)                  /* wrap if needed */
+            {
+              do {
+                r += s->end - s->window;        /* force pointer in window */
+              } while (r < s->window);          /* covers invalid distances */
+              e = s->end - r;
+              if (c > e)
+              {
+                c -= e;                         /* wrapped copy */
+                do {
+                    *q++ = *r++;
+                } while (--e);
+                r = s->window;
+                do {
+                    *q++ = *r++;
+                } while (--c);
+              }
+              else                              /* normal copy */
+              {
+                *q++ = *r++;  c--;
+                *q++ = *r++;  c--;
+                do {
+                    *q++ = *r++;
+                } while (--c);
+              }
+            }
+            else                                /* normal copy */
+            {
+              *q++ = *r++;  c--;
+              *q++ = *r++;  c--;
+              do {
+                *q++ = *r++;
+              } while (--c);
+            }
+            break;
+          }
+          else if ((e & 64) == 0)
+          {
+            t += t->base;
+            e = (t += ((uInt)b & inflate_mask[e]))->exop;
+          }
+          else
+          {
+            z->msg = (char*)"invalid distance code";
+            UNGRAB
+            UPDATE
+            return Z_DATA_ERROR;
+          }
+        } while (1);
+        break;
+      }
+      if ((e & 64) == 0)
+      {
+        t += t->base;
+        if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0)
+        {
+          DUMPBITS(t->bits)
+          Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+                    "inflate:         * literal '%c'\n" :
+                    "inflate:         * literal 0x%02x\n", t->base));
+          *q++ = (Byte)t->base;
+          m--;
+          break;
+        }
+      }
+      else if (e & 32)
+      {
+        Tracevv((stderr, "inflate:         * end of block\n"));
+        UNGRAB
+        UPDATE
+        return Z_STREAM_END;
+      }
+      else
+      {
+        z->msg = (char*)"invalid literal/length code";
+        UNGRAB
+        UPDATE
+        return Z_DATA_ERROR;
+      }
+    } while (1);
+  } while (m >= 258 && n >= 10);
+
+  /* not enough input or output--restore pointers and return */
+  UNGRAB
+  UPDATE
+  return Z_OK;
+}
diff --git a/zlib/inffast.h b/zlib/inffast.h
new file mode 100644 (file)
index 0000000..a31a4bb
--- /dev/null
@@ -0,0 +1,17 @@
+/* inffast.h -- header to use inffast.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+extern int inflate_fast OF((
+    uInt,
+    uInt,
+    inflate_huft *,
+    inflate_huft *,
+    inflate_blocks_statef *,
+    z_streamp ));
diff --git a/zlib/inffixed.h b/zlib/inffixed.h
new file mode 100644 (file)
index 0000000..77f7e76
--- /dev/null
@@ -0,0 +1,151 @@
+/* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by the maketree.c program
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+local uInt fixed_bl = 9;
+local uInt fixed_bd = 5;
+local inflate_huft fixed_tl[] = {
+    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
+    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},
+    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},
+    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},
+    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},
+    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},
+    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},
+    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},
+    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
+    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},
+    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},
+    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},
+    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},
+    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},
+    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},
+    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},
+    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
+    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},
+    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},
+    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},
+    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},
+    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},
+    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},
+    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},
+    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},
+    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},
+    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},
+    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},
+    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},
+    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188},
+    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252},
+    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
+    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},
+    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},
+    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},
+    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},
+    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},
+    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},
+    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},
+    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
+    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},
+    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},
+    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},
+    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},
+    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},
+    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},
+    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},
+    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
+    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},
+    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},
+    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},
+    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},
+    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},
+    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},
+    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},
+    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},
+    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},
+    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},
+    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},
+    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},
+    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190},
+    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254},
+    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
+    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},
+    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},
+    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},
+    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},
+    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},
+    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},
+    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},
+    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
+    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
+    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},
+    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},
+    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},
+    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},
+    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},
+    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},
+    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
+    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},
+    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
+    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
+    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
+    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
+    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
+    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
+    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
+    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
+    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
+    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
+    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
+    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},
+    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},
+    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
+    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
+    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
+    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
+    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
+    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
+    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
+    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
+    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
+    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
+    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
+    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
+    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
+    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
+    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
+    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
+    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
+    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
+    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
+    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
+    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
+    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
+    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
+    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
+    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
+    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
+    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
+    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
+    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
+    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
+    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
+  };
+local inflate_huft fixed_td[] = {
+    {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
+    {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
+    {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
+    {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
+    {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
+    {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
+    {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
+    {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
+  };
diff --git a/zlib/inflate.c b/zlib/inflate.c
new file mode 100644 (file)
index 0000000..dfb2e86
--- /dev/null
@@ -0,0 +1,366 @@
+/* inflate.c -- zlib interface to inflate modules
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+
+struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
+
+typedef enum {
+      METHOD,   /* waiting for method byte */
+      FLAG,     /* waiting for flag byte */
+      DICT4,    /* four dictionary check bytes to go */
+      DICT3,    /* three dictionary check bytes to go */
+      DICT2,    /* two dictionary check bytes to go */
+      DICT1,    /* one dictionary check byte to go */
+      DICT0,    /* waiting for inflateSetDictionary */
+      BLOCKS,   /* decompressing blocks */
+      CHECK4,   /* four check bytes to go */
+      CHECK3,   /* three check bytes to go */
+      CHECK2,   /* two check bytes to go */
+      CHECK1,   /* one check byte to go */
+      DONE,     /* finished check, done */
+      BAD}      /* got an error--stay here */
+inflate_mode;
+
+/* inflate private state */
+struct internal_state {
+
+  /* mode */
+  inflate_mode  mode;   /* current inflate mode */
+
+  /* mode dependent information */
+  union {
+    uInt method;        /* if FLAGS, method byte */
+    struct {
+      uLong was;                /* computed check value */
+      uLong need;               /* stream check value */
+    } check;            /* if CHECK, check values to compare */
+    uInt marker;        /* if BAD, inflateSync's marker bytes count */
+  } sub;        /* submode */
+
+  /* mode independent information */
+  int  nowrap;          /* flag for no wrapper */
+  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */
+  inflate_blocks_statef 
+    *blocks;            /* current inflate_blocks state */
+
+};
+
+
+int ZEXPORT inflateReset(z)
+z_streamp z;
+{
+  if (z == Z_NULL || z->state == Z_NULL)
+    return Z_STREAM_ERROR;
+  z->total_in = z->total_out = 0;
+  z->msg = Z_NULL;
+  z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
+  inflate_blocks_reset(z->state->blocks, z, Z_NULL);
+  Tracev((stderr, "inflate: reset\n"));
+  return Z_OK;
+}
+
+
+int ZEXPORT inflateEnd(z)
+z_streamp z;
+{
+  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
+    return Z_STREAM_ERROR;
+  if (z->state->blocks != Z_NULL)
+    inflate_blocks_free(z->state->blocks, z);
+  ZFREE(z, z->state);
+  z->state = Z_NULL;
+  Tracev((stderr, "inflate: end\n"));
+  return Z_OK;
+}
+
+
+int ZEXPORT inflateInit2_(z, w, version, stream_size)
+z_streamp z;
+int w;
+const char *version;
+int stream_size;
+{
+  if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+      stream_size != sizeof(z_stream))
+      return Z_VERSION_ERROR;
+
+  /* initialize state */
+  if (z == Z_NULL)
+    return Z_STREAM_ERROR;
+  z->msg = Z_NULL;
+  if (z->zalloc == Z_NULL)
+  {
+    z->zalloc = zcalloc;
+    z->opaque = (voidpf)0;
+  }
+  if (z->zfree == Z_NULL) z->zfree = zcfree;
+  if ((z->state = (struct internal_state FAR *)
+       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
+    return Z_MEM_ERROR;
+  z->state->blocks = Z_NULL;
+
+  /* handle undocumented nowrap option (no zlib header or check) */
+  z->state->nowrap = 0;
+  if (w < 0)
+  {
+    w = - w;
+    z->state->nowrap = 1;
+  }
+
+  /* set window size */
+  if (w < 8 || w > 15)
+  {
+    inflateEnd(z);
+    return Z_STREAM_ERROR;
+  }
+  z->state->wbits = (uInt)w;
+
+  /* create inflate_blocks state */
+  if ((z->state->blocks =
+      inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
+      == Z_NULL)
+  {
+    inflateEnd(z);
+    return Z_MEM_ERROR;
+  }
+  Tracev((stderr, "inflate: allocated\n"));
+
+  /* reset state */
+  inflateReset(z);
+  return Z_OK;
+}
+
+
+int ZEXPORT inflateInit_(z, version, stream_size)
+z_streamp z;
+const char *version;
+int stream_size;
+{
+  return inflateInit2_(z, DEF_WBITS, version, stream_size);
+}
+
+
+#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
+#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
+
+int ZEXPORT inflate(z, f)
+z_streamp z;
+int f;
+{
+  int r;
+  uInt b;
+
+  if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
+    return Z_STREAM_ERROR;
+  f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
+  r = Z_BUF_ERROR;
+  while (1) switch (z->state->mode)
+  {
+    case METHOD:
+      NEEDBYTE
+      if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"unknown compression method";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"invalid window size";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      z->state->mode = FLAG;
+    case FLAG:
+      NEEDBYTE
+      b = NEXTBYTE;
+      if (((z->state->sub.method << 8) + b) % 31)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"incorrect header check";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      Tracev((stderr, "inflate: zlib header ok\n"));
+      if (!(b & PRESET_DICT))
+      {
+        z->state->mode = BLOCKS;
+        break;
+      }
+      z->state->mode = DICT4;
+    case DICT4:
+      NEEDBYTE
+      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
+      z->state->mode = DICT3;
+    case DICT3:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
+      z->state->mode = DICT2;
+    case DICT2:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
+      z->state->mode = DICT1;
+    case DICT1:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE;
+      z->adler = z->state->sub.check.need;
+      z->state->mode = DICT0;
+      return Z_NEED_DICT;
+    case DICT0:
+      z->state->mode = BAD;
+      z->msg = (char*)"need dictionary";
+      z->state->sub.marker = 0;       /* can try inflateSync */
+      return Z_STREAM_ERROR;
+    case BLOCKS:
+      r = inflate_blocks(z->state->blocks, z, r);
+      if (r == Z_DATA_ERROR)
+      {
+        z->state->mode = BAD;
+        z->state->sub.marker = 0;       /* can try inflateSync */
+        break;
+      }
+      if (r == Z_OK)
+        r = f;
+      if (r != Z_STREAM_END)
+        return r;
+      r = f;
+      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
+      if (z->state->nowrap)
+      {
+        z->state->mode = DONE;
+        break;
+      }
+      z->state->mode = CHECK4;
+    case CHECK4:
+      NEEDBYTE
+      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
+      z->state->mode = CHECK3;
+    case CHECK3:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
+      z->state->mode = CHECK2;
+    case CHECK2:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
+      z->state->mode = CHECK1;
+    case CHECK1:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE;
+
+      if (z->state->sub.check.was != z->state->sub.check.need)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"incorrect data check";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      Tracev((stderr, "inflate: zlib check ok\n"));
+      z->state->mode = DONE;
+    case DONE:
+      return Z_STREAM_END;
+    case BAD:
+      return Z_DATA_ERROR;
+    default:
+      return Z_STREAM_ERROR;
+  }
+#ifdef NEED_DUMMY_RETURN
+  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */
+#endif
+}
+
+
+int ZEXPORT inflateSetDictionary(z, dictionary, dictLength)
+z_streamp z;
+const Bytef *dictionary;
+uInt  dictLength;
+{
+  uInt length = dictLength;
+
+  if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
+    return Z_STREAM_ERROR;
+
+  if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
+  z->adler = 1L;
+
+  if (length >= ((uInt)1<<z->state->wbits))
+  {
+    length = (1<<z->state->wbits)-1;
+    dictionary += dictLength - length;
+  }
+  inflate_set_dictionary(z->state->blocks, dictionary, length);
+  z->state->mode = BLOCKS;
+  return Z_OK;
+}
+
+
+int ZEXPORT inflateSync(z)
+z_streamp z;
+{
+  uInt n;       /* number of bytes to look at */
+  Bytef *p;     /* pointer to bytes */
+  uInt m;       /* number of marker bytes found in a row */
+  uLong r, w;   /* temporaries to save total_in and total_out */
+
+  /* set up */
+  if (z == Z_NULL || z->state == Z_NULL)
+    return Z_STREAM_ERROR;
+  if (z->state->mode != BAD)
+  {
+    z->state->mode = BAD;
+    z->state->sub.marker = 0;
+  }
+  if ((n = z->avail_in) == 0)
+    return Z_BUF_ERROR;
+  p = z->next_in;
+  m = z->state->sub.marker;
+
+  /* search */
+  while (n && m < 4)
+  {
+    static const Byte mark[4] = {0, 0, 0xff, 0xff};
+    if (*p == mark[m])
+      m++;
+    else if (*p)
+      m = 0;
+    else
+      m = 4 - m;
+    p++, n--;
+  }
+
+  /* restore */
+  z->total_in += p - z->next_in;
+  z->next_in = p;
+  z->avail_in = n;
+  z->state->sub.marker = m;
+
+  /* return no joy or set up to restart on a new block */
+  if (m != 4)
+    return Z_DATA_ERROR;
+  r = z->total_in;  w = z->total_out;
+  inflateReset(z);
+  z->total_in = r;  z->total_out = w;
+  z->state->mode = BLOCKS;
+  return Z_OK;
+}
+
+
+/* Returns true if inflate is currently at the end of a block generated
+ * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
+ * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH
+ * but removes the length bytes of the resulting empty stored block. When
+ * decompressing, PPP checks that at the end of input packet, inflate is
+ * waiting for these length bytes.
+ */
+int ZEXPORT inflateSyncPoint(z)
+z_streamp z;
+{
+  if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL)
+    return Z_STREAM_ERROR;
+  return inflate_blocks_sync_point(z->state->blocks);
+}
diff --git a/zlib/inftrees.c b/zlib/inftrees.c
new file mode 100644 (file)
index 0000000..4c32ca3
--- /dev/null
@@ -0,0 +1,454 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#if !defined(BUILDFIXED) && !defined(STDC)
+#  define BUILDFIXED   /* non ANSI compilers may not accept inffixed.h */
+#endif
+
+const char inflate_copyright[] =
+   " inflate 1.1.4 Copyright 1995-2002 Mark Adler ";
+/*
+  If you use the zlib library in a product, an acknowledgment is welcome
+  in the documentation of your product. If for some reason you cannot
+  include such an acknowledgment, I would appreciate that you keep this
+  copyright string in the executable of your product.
+ */
+struct internal_state  {int dummy;}; /* for buggy compilers */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+
+local int huft_build OF((
+    uIntf *,            /* code lengths in bits */
+    uInt,               /* number of codes */
+    uInt,               /* number of "simple" codes */
+    const uIntf *,      /* list of base values for non-simple codes */
+    const uIntf *,      /* list of extra bits for non-simple codes */
+    inflate_huft * FAR*,/* result: starting table */
+    uIntf *,            /* maximum lookup bits (returns actual) */
+    inflate_huft *,     /* space for trees */
+    uInt *,             /* hufts used in space */
+    uIntf * ));         /* space for values */
+
+/* Tables for deflate from PKZIP's appnote.txt. */
+local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
+        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+        /* see note #13 above about 258 */
+local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
+        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
+local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
+        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+        8193, 12289, 16385, 24577};
+local const uInt cpdext[30] = { /* Extra bits for distance codes */
+        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+        7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+        12, 12, 13, 13};
+
+/*
+   Huffman code decoding is performed using a multi-level table lookup.
+   The fastest way to decode is to simply build a lookup table whose
+   size is determined by the longest code.  However, the time it takes
+   to build this table can also be a factor if the data being decoded
+   is not very long.  The most common codes are necessarily the
+   shortest codes, so those codes dominate the decoding time, and hence
+   the speed.  The idea is you can have a shorter table that decodes the
+   shorter, more probable codes, and then point to subsidiary tables for
+   the longer codes.  The time it costs to decode the longer codes is
+   then traded against the time it takes to make longer tables.
+
+   This results of this trade are in the variables lbits and dbits
+   below.  lbits is the number of bits the first level table for literal/
+   length codes can decode in one step, and dbits is the same thing for
+   the distance codes.  Subsequent tables are also less than or equal to
+   those sizes.  These values may be adjusted either when all of the
+   codes are shorter than that, in which case the longest code length in
+   bits is used, or when the shortest code is *longer* than the requested
+   table size, in which case the length of the shortest code in bits is
+   used.
+
+   There are two different values for the two tables, since they code a
+   different number of possibilities each.  The literal/length table
+   codes 286 possible values, or in a flat code, a little over eight
+   bits.  The distance table codes 30 possible values, or a little less
+   than five bits, flat.  The optimum values for speed end up being
+   about one bit more than those, so lbits is 8+1 and dbits is 5+1.
+   The optimum values may differ though from machine to machine, and
+   possibly even between compilers.  Your mileage may vary.
+ */
+
+
+/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
+#define BMAX 15         /* maximum bit length of any code */
+
+local int huft_build(b, n, s, d, e, t, m, hp, hn, v)
+uIntf *b;               /* code lengths in bits (all assumed <= BMAX) */
+uInt n;                 /* number of codes (assumed <= 288) */
+uInt s;                 /* number of simple-valued codes (0..s-1) */
+const uIntf *d;         /* list of base values for non-simple codes */
+const uIntf *e;         /* list of extra bits for non-simple codes */
+inflate_huft * FAR *t;  /* result: starting table */
+uIntf *m;               /* maximum lookup bits, returns actual */
+inflate_huft *hp;       /* space for trees */
+uInt *hn;               /* hufts used in space */
+uIntf *v;               /* working area: values in order of bit length */
+/* Given a list of code lengths and a maximum table size, make a set of
+   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR
+   if the given code set is incomplete (the tables are still built in this
+   case), or Z_DATA_ERROR if the input is invalid. */
+{
+
+  uInt a;                       /* counter for codes of length k */
+  uInt c[BMAX+1];               /* bit length count table */
+  uInt f;                       /* i repeats in table every f entries */
+  int g;                        /* maximum code length */
+  int h;                        /* table level */
+  register uInt i;              /* counter, current code */
+  register uInt j;              /* counter */
+  register int k;               /* number of bits in current code */
+  int l;                        /* bits per table (returned in m) */
+  uInt mask;                    /* (1 << w) - 1, to avoid cc -O bug on HP */
+  register uIntf *p;            /* pointer into c[], b[], or v[] */
+  inflate_huft *q;              /* points to current table */
+  struct inflate_huft_s r;      /* table entry for structure assignment */
+  inflate_huft *u[BMAX];        /* table stack */
+  register int w;               /* bits before this table == (l * h) */
+  uInt x[BMAX+1];               /* bit offsets, then code stack */
+  uIntf *xp;                    /* pointer into x */
+  int y;                        /* number of dummy codes added */
+  uInt z;                       /* number of entries in current table */
+
+
+  /* Generate counts for each bit length */
+  p = c;
+#define C0 *p++ = 0;
+#define C2 C0 C0 C0 C0
+#define C4 C2 C2 C2 C2
+  C4                            /* clear c[]--assume BMAX+1 is 16 */
+  p = b;  i = n;
+  do {
+    c[*p++]++;                  /* assume all entries <= BMAX */
+  } while (--i);
+  if (c[0] == n)                /* null input--all zero length codes */
+  {
+    *t = (inflate_huft *)Z_NULL;
+    *m = 0;
+    return Z_OK;
+  }
+
+
+  /* Find minimum and maximum length, bound *m by those */
+  l = *m;
+  for (j = 1; j <= BMAX; j++)
+    if (c[j])
+      break;
+  k = j;                        /* minimum code length */
+  if ((uInt)l < j)
+    l = j;
+  for (i = BMAX; i; i--)
+    if (c[i])
+      break;
+  g = i;                        /* maximum code length */
+  if ((uInt)l > i)
+    l = i;
+  *m = l;
+
+
+  /* Adjust last length count to fill out codes, if needed */
+  for (y = 1 << j; j < i; j++, y <<= 1)
+    if ((y -= c[j]) < 0)
+      return Z_DATA_ERROR;
+  if ((y -= c[i]) < 0)
+    return Z_DATA_ERROR;
+  c[i] += y;
+
+
+  /* Generate starting offsets into the value table for each length */
+  x[1] = j = 0;
+  p = c + 1;  xp = x + 2;
+  while (--i) {                 /* note that i == g from above */
+    *xp++ = (j += *p++);
+  }
+
+
+  /* Make a table of values in order of bit lengths */
+  p = b;  i = 0;
+  do {
+    if ((j = *p++) != 0)
+      v[x[j]++] = i;
+  } while (++i < n);
+  n = x[g];                     /* set n to length of v */
+
+
+  /* Generate the Huffman codes and for each, make the table entries */
+  x[0] = i = 0;                 /* first Huffman code is zero */
+  p = v;                        /* grab values in bit order */
+  h = -1;                       /* no tables yet--level -1 */
+  w = -l;                       /* bits decoded == (l * h) */
+  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */
+  q = (inflate_huft *)Z_NULL;   /* ditto */
+  z = 0;                        /* ditto */
+
+  /* go through the bit lengths (k already is bits in shortest code) */
+  for (; k <= g; k++)
+  {
+    a = c[k];
+    while (a--)
+    {
+      /* here i is the Huffman code of length k bits for value *p */
+      /* make tables up to required level */
+      while (k > w + l)
+      {
+        h++;
+        w += l;                 /* previous table always l bits */
+
+        /* compute minimum size table less than or equal to l bits */
+        z = g - w;
+        z = z > (uInt)l ? l : z;        /* table size upper limit */
+        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
+        {                       /* too few codes for k-w bit table */
+          f -= a + 1;           /* deduct codes from patterns left */
+          xp = c + k;
+          if (j < z)
+            while (++j < z)     /* try smaller tables up to z bits */
+            {
+              if ((f <<= 1) <= *++xp)
+                break;          /* enough codes to use up j bits */
+              f -= *xp;         /* else deduct codes from patterns */
+            }
+        }
+        z = 1 << j;             /* table entries for j-bit table */
+
+        /* allocate new table */
+        if (*hn + z > MANY)     /* (note: doesn't matter for fixed) */
+          return Z_DATA_ERROR;  /* overflow of MANY */
+        u[h] = q = hp + *hn;
+        *hn += z;
+
+        /* connect to last table, if there is one */
+        if (h)
+        {
+          x[h] = i;             /* save pattern for backing up */
+          r.bits = (Byte)l;     /* bits to dump before this table */
+          r.exop = (Byte)j;     /* bits in this table */
+          j = i >> (w - l);
+          r.base = (uInt)(q - u[h-1] - j);   /* offset to this table */
+          u[h-1][j] = r;        /* connect to last table */
+        }
+        else
+          *t = q;               /* first table is returned result */
+      }
+
+      /* set up table entry in r */
+      r.bits = (Byte)(k - w);
+      if (p >= v + n)
+        r.exop = 128 + 64;      /* out of values--invalid code */
+      else if (*p < s)
+      {
+        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */
+        r.base = *p++;          /* simple code is just the value */
+      }
+      else
+      {
+        r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
+        r.base = d[*p++ - s];
+      }
+
+      /* fill code-like entries with r */
+      f = 1 << (k - w);
+      for (j = i >> w; j < z; j += f)
+        q[j] = r;
+
+      /* backwards increment the k-bit code i */
+      for (j = 1 << (k - 1); i & j; j >>= 1)
+        i ^= j;
+      i ^= j;
+
+      /* backup over finished tables */
+      mask = (1 << w) - 1;      /* needed on HP, cc -O bug */
+      while ((i & mask) != x[h])
+      {
+        h--;                    /* don't need to update q */
+        w -= l;
+        mask = (1 << w) - 1;
+      }
+    }
+  }
+
+
+  /* Return Z_BUF_ERROR if we were given an incomplete table */
+  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
+}
+
+
+int inflate_trees_bits(c, bb, tb, hp, z)
+uIntf *c;               /* 19 code lengths */
+uIntf *bb;              /* bits tree desired/actual depth */
+inflate_huft * FAR *tb; /* bits tree result */
+inflate_huft *hp;       /* space for trees */
+z_streamp z;            /* for messages */
+{
+  int r;
+  uInt hn = 0;          /* hufts used in space */
+  uIntf *v;             /* work area for huft_build */
+
+  if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
+    return Z_MEM_ERROR;
+  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
+                 tb, bb, hp, &hn, v);
+  if (r == Z_DATA_ERROR)
+    z->msg = (char*)"oversubscribed dynamic bit lengths tree";
+  else if (r == Z_BUF_ERROR || *bb == 0)
+  {
+    z->msg = (char*)"incomplete dynamic bit lengths tree";
+    r = Z_DATA_ERROR;
+  }
+  ZFREE(z, v);
+  return r;
+}
+
+
+int inflate_trees_dynamic(nl, nd, c, bl, bd, tl, td, hp, z)
+uInt nl;                /* number of literal/length codes */
+uInt nd;                /* number of distance codes */
+uIntf *c;               /* that many (total) code lengths */
+uIntf *bl;              /* literal desired/actual bit depth */
+uIntf *bd;              /* distance desired/actual bit depth */
+inflate_huft * FAR *tl; /* literal/length tree result */
+inflate_huft * FAR *td; /* distance tree result */
+inflate_huft *hp;       /* space for trees */
+z_streamp z;            /* for messages */
+{
+  int r;
+  uInt hn = 0;          /* hufts used in space */
+  uIntf *v;             /* work area for huft_build */
+
+  /* allocate work area */
+  if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+    return Z_MEM_ERROR;
+
+  /* build literal/length tree */
+  r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
+  if (r != Z_OK || *bl == 0)
+  {
+    if (r == Z_DATA_ERROR)
+      z->msg = (char*)"oversubscribed literal/length tree";
+    else if (r != Z_MEM_ERROR)
+    {
+      z->msg = (char*)"incomplete literal/length tree";
+      r = Z_DATA_ERROR;
+    }
+    ZFREE(z, v);
+    return r;
+  }
+
+  /* build distance tree */
+  r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
+  if (r != Z_OK || (*bd == 0 && nl > 257))
+  {
+    if (r == Z_DATA_ERROR)
+      z->msg = (char*)"oversubscribed distance tree";
+    else if (r == Z_BUF_ERROR) {
+#ifdef PKZIP_BUG_WORKAROUND
+      r = Z_OK;
+    }
+#else
+      z->msg = (char*)"incomplete distance tree";
+      r = Z_DATA_ERROR;
+    }
+    else if (r != Z_MEM_ERROR)
+    {
+      z->msg = (char*)"empty distance tree with lengths";
+      r = Z_DATA_ERROR;
+    }
+    ZFREE(z, v);
+    return r;
+#endif
+  }
+
+  /* done */
+  ZFREE(z, v);
+  return Z_OK;
+}
+
+
+/* build fixed tables only once--keep them here */
+#ifdef BUILDFIXED
+local int fixed_built = 0;
+#define FIXEDH 544      /* number of hufts used by fixed tables */
+local inflate_huft fixed_mem[FIXEDH];
+local uInt fixed_bl;
+local uInt fixed_bd;
+local inflate_huft *fixed_tl;
+local inflate_huft *fixed_td;
+#else
+#include "inffixed.h"
+#endif
+
+
+int inflate_trees_fixed(bl, bd, tl, td, z)
+uIntf *bl;               /* literal desired/actual bit depth */
+uIntf *bd;               /* distance desired/actual bit depth */
+inflate_huft * FAR *tl;  /* literal/length tree result */
+inflate_huft * FAR *td;  /* distance tree result */
+z_streamp z;             /* for memory allocation */
+{
+#ifdef BUILDFIXED
+  /* build fixed tables if not already */
+  if (!fixed_built)
+  {
+    int k;              /* temporary variable */
+    uInt f = 0;         /* number of hufts used in fixed_mem */
+    uIntf *c;           /* length list for huft_build */
+    uIntf *v;           /* work area for huft_build */
+
+    /* allocate memory */
+    if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+      return Z_MEM_ERROR;
+    if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+    {
+      ZFREE(z, c);
+      return Z_MEM_ERROR;
+    }
+
+    /* literal table */
+    for (k = 0; k < 144; k++)
+      c[k] = 8;
+    for (; k < 256; k++)
+      c[k] = 9;
+    for (; k < 280; k++)
+      c[k] = 7;
+    for (; k < 288; k++)
+      c[k] = 8;
+    fixed_bl = 9;
+    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
+               fixed_mem, &f, v);
+
+    /* distance table */
+    for (k = 0; k < 30; k++)
+      c[k] = 5;
+    fixed_bd = 5;
+    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
+               fixed_mem, &f, v);
+
+    /* done */
+    ZFREE(z, v);
+    ZFREE(z, c);
+    fixed_built = 1;
+  }
+#endif
+  *bl = fixed_bl;
+  *bd = fixed_bd;
+  *tl = fixed_tl;
+  *td = fixed_td;
+  return Z_OK;
+}
diff --git a/zlib/inftrees.h b/zlib/inftrees.h
new file mode 100644 (file)
index 0000000..04b73b7
--- /dev/null
@@ -0,0 +1,58 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* Huffman code lookup table entry--this entry is four bytes for machines
+   that have 16-bit pointers (e.g. PC's in the small or medium model). */
+
+typedef struct inflate_huft_s FAR inflate_huft;
+
+struct inflate_huft_s {
+  union {
+    struct {
+      Byte Exop;        /* number of extra bits or operation */
+      Byte Bits;        /* number of bits in this code or subcode */
+    } what;
+    uInt pad;           /* pad structure to a power of 2 (4 bytes for */
+  } word;               /*  16-bit, 8 bytes for 32-bit int's) */
+  uInt base;            /* literal, length base, distance base,
+                           or table offset */
+};
+
+/* Maximum size of dynamic tree.  The maximum found in a long but non-
+   exhaustive search was 1004 huft structures (850 for length/literals
+   and 154 for distances, the latter actually the result of an
+   exhaustive search).  The actual maximum is not known, but the
+   value below is more than safe. */
+#define MANY 1440
+
+extern int inflate_trees_bits OF((
+    uIntf *,                    /* 19 code lengths */
+    uIntf *,                    /* bits tree desired/actual depth */
+    inflate_huft * FAR *,       /* bits tree result */
+    inflate_huft *,             /* space for trees */
+    z_streamp));                /* for messages */
+
+extern int inflate_trees_dynamic OF((
+    uInt,                       /* number of literal/length codes */
+    uInt,                       /* number of distance codes */
+    uIntf *,                    /* that many (total) code lengths */
+    uIntf *,                    /* literal desired/actual bit depth */
+    uIntf *,                    /* distance desired/actual bit depth */
+    inflate_huft * FAR *,       /* literal/length tree result */
+    inflate_huft * FAR *,       /* distance tree result */
+    inflate_huft *,             /* space for trees */
+    z_streamp));                /* for messages */
+
+extern int inflate_trees_fixed OF((
+    uIntf *,                    /* literal desired/actual bit depth */
+    uIntf *,                    /* distance desired/actual bit depth */
+    inflate_huft * FAR *,       /* literal/length tree result */
+    inflate_huft * FAR *,       /* distance tree result */
+    z_streamp));                /* for memory allocation */
diff --git a/zlib/infutil.c b/zlib/infutil.c
new file mode 100644 (file)
index 0000000..9a07622
--- /dev/null
@@ -0,0 +1,87 @@
+/* inflate_util.c -- data and routines common to blocks and codes
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+#include "inftrees.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+struct inflate_codes_state {int dummy;}; /* for buggy compilers */
+
+/* And'ing with mask[n] masks the lower n bits */
+uInt inflate_mask[17] = {
+    0x0000,
+    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
+    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
+};
+
+
+/* copy as much as possible from the sliding window to the output area */
+int inflate_flush(s, z, r)
+inflate_blocks_statef *s;
+z_streamp z;
+int r;
+{
+  uInt n;
+  Bytef *p;
+  Bytef *q;
+
+  /* local copies of source and destination pointers */
+  p = z->next_out;
+  q = s->read;
+
+  /* compute number of bytes to copy as far as end of window */
+  n = (uInt)((q <= s->write ? s->write : s->end) - q);
+  if (n > z->avail_out) n = z->avail_out;
+  if (n && r == Z_BUF_ERROR) r = Z_OK;
+
+  /* update counters */
+  z->avail_out -= n;
+  z->total_out += n;
+
+  /* update check information */
+  if (s->checkfn != Z_NULL)
+    z->adler = s->check = (*s->checkfn)(s->check, q, n);
+
+  /* copy as far as end of window */
+  zmemcpy(p, q, n);
+  p += n;
+  q += n;
+
+  /* see if more to copy at beginning of window */
+  if (q == s->end)
+  {
+    /* wrap pointers */
+    q = s->window;
+    if (s->write == s->end)
+      s->write = s->window;
+
+    /* compute bytes to copy */
+    n = (uInt)(s->write - q);
+    if (n > z->avail_out) n = z->avail_out;
+    if (n && r == Z_BUF_ERROR) r = Z_OK;
+
+    /* update counters */
+    z->avail_out -= n;
+    z->total_out += n;
+
+    /* update check information */
+    if (s->checkfn != Z_NULL)
+      z->adler = s->check = (*s->checkfn)(s->check, q, n);
+
+    /* copy */
+    zmemcpy(p, q, n);
+    p += n;
+    q += n;
+  }
+
+  /* update pointers */
+  z->next_out = p;
+  s->read = q;
+
+  /* done */
+  return r;
+}
diff --git a/zlib/infutil.h b/zlib/infutil.h
new file mode 100644 (file)
index 0000000..4401df8
--- /dev/null
@@ -0,0 +1,98 @@
+/* infutil.h -- types and macros common to blocks and codes
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _INFUTIL_H
+#define _INFUTIL_H
+
+typedef enum {
+      TYPE,     /* get type bits (3, including end bit) */
+      LENS,     /* get lengths for stored */
+      STORED,   /* processing stored block */
+      TABLE,    /* get table lengths */
+      BTREE,    /* get bit lengths tree for a dynamic block */
+      DTREE,    /* get length, distance trees for a dynamic block */
+      CODES,    /* processing fixed or dynamic block */
+      DRY,      /* output remaining window bytes */
+      DONE,     /* finished last block, done */
+      BAD}      /* got a data error--stuck here */
+inflate_block_mode;
+
+/* inflate blocks semi-private state */
+struct inflate_blocks_state {
+
+  /* mode */
+  inflate_block_mode  mode;     /* current inflate_block mode */
+
+  /* mode dependent information */
+  union {
+    uInt left;          /* if STORED, bytes left to copy */
+    struct {
+      uInt table;               /* table lengths (14 bits) */
+      uInt index;               /* index into blens (or border) */
+      uIntf *blens;             /* bit lengths of codes */
+      uInt bb;                  /* bit length tree depth */
+      inflate_huft *tb;         /* bit length decoding tree */
+    } trees;            /* if DTREE, decoding info for trees */
+    struct {
+      inflate_codes_statef 
+         *codes;
+    } decode;           /* if CODES, current state */
+  } sub;                /* submode */
+  uInt last;            /* true if this block is the last block */
+
+  /* mode independent information */
+  uInt bitk;            /* bits in bit buffer */
+  uLong bitb;           /* bit buffer */
+  inflate_huft *hufts;  /* single malloc for tree space */
+  Bytef *window;        /* sliding window */
+  Bytef *end;           /* one byte after sliding window */
+  Bytef *read;          /* window read pointer */
+  Bytef *write;         /* window write pointer */
+  check_func checkfn;   /* check function */
+  uLong check;          /* check on output */
+
+};
+
+
+/* defines for inflate input/output */
+/*   update pointers and return */
+#define UPDBITS {s->bitb=b;s->bitk=k;}
+#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
+#define UPDOUT {s->write=q;}
+#define UPDATE {UPDBITS UPDIN UPDOUT}
+#define LEAVE {UPDATE return inflate_flush(s,z,r);}
+/*   get bytes and bits */
+#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
+#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
+#define NEXTBYTE (n--,*p++)
+#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#define DUMPBITS(j) {b>>=(j);k-=(j);}
+/*   output bytes */
+#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
+#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
+#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
+#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
+#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
+#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
+/*   load local pointers */
+#define LOAD {LOADIN LOADOUT}
+
+/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
+extern uInt inflate_mask[17];
+
+/* copy as much as possible from the sliding window to the output area */
+extern int inflate_flush OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    int));
+
+struct internal_state      {int dummy;}; /* for buggy compilers */
+
+#endif
diff --git a/zlib/trees.c b/zlib/trees.c
new file mode 100644 (file)
index 0000000..33fbb71
--- /dev/null
@@ -0,0 +1,1214 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1995-2002 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/*
+ *  ALGORITHM
+ *
+ *      The "deflation" process uses several Huffman trees. The more
+ *      common source values are represented by shorter bit sequences.
+ *
+ *      Each code tree is stored in a compressed form which is itself
+ * a Huffman encoding of the lengths of all the code strings (in
+ * ascending order by source values).  The actual code strings are
+ * reconstructed from the lengths in the inflate process, as described
+ * in the deflate specification.
+ *
+ *  REFERENCES
+ *
+ *      Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
+ *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
+ *
+ *      Storer, James A.
+ *          Data Compression:  Methods and Theory, pp. 49-50.
+ *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.
+ *
+ *      Sedgewick, R.
+ *          Algorithms, p290.
+ *          Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ */
+
+/* @(#) $Id: trees.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+/* #define GEN_TREES_H */
+
+#include "deflate.h"
+
+#ifdef DEBUG
+#  include <ctype.h>
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define REP_3_6      16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10    17
+/* repeat a zero length 3-10 times  (3 bits of repeat count) */
+
+#define REPZ_11_138  18
+/* repeat a zero length 11-138 times  (7 bits of repeat count) */
+
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */
+   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
+   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+local const uch bl_order[BL_CODES]
+   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+#define Buf_size (8 * 2*sizeof(char))
+/* Number of bits used within bi_buf. (bi_buf might be implemented on
+ * more than 16 bits on some systems.)
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+#define DIST_CODE_LEN  512 /* see definition of array dist_code below */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+/* non ANSI compilers may not accept trees.h */
+
+local ct_data static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+local ct_data static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+uch _dist_code[DIST_CODE_LEN];
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+uch _length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local int base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#else
+#  include "trees.h"
+#endif /* GEN_TREES_H */
+
+struct static_tree_desc_s {
+    const ct_data *static_tree;  /* static tree or NULL */
+    const intf *extra_bits;      /* extra bits for each code or NULL */
+    int     extra_base;          /* base index for extra_bits */
+    int     elems;               /* max number of elements in the tree */
+    int     max_length;          /* max bit length for the codes */
+};
+
+local static_tree_desc  static_l_desc =
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
+
+local static_tree_desc  static_d_desc =
+{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};
+
+local static_tree_desc  static_bl_desc =
+{(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void tr_static_init OF((void));
+local void init_block     OF((deflate_state *s));
+local void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));
+local void gen_bitlen     OF((deflate_state *s, tree_desc *desc));
+local void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));
+local void build_tree     OF((deflate_state *s, tree_desc *desc));
+local void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));
+local void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));
+local int  build_bl_tree  OF((deflate_state *s));
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
+                              int blcodes));
+local void compress_block OF((deflate_state *s, ct_data *ltree,
+                              ct_data *dtree));
+local void set_data_type  OF((deflate_state *s));
+local unsigned bi_reverse OF((unsigned value, int length));
+local void bi_windup      OF((deflate_state *s));
+local void bi_flush       OF((deflate_state *s));
+local void copy_block     OF((deflate_state *s, charf *buf, unsigned len,
+                              int header));
+
+#ifdef GEN_TREES_H
+local void gen_trees_header OF((void));
+#endif
+
+#ifndef DEBUG
+#  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
+   /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* DEBUG */
+#  define send_code(s, c, tree) \
+     { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
+       send_bits(s, tree[c].Code, tree[c].Len); }
+#endif
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+    put_byte(s, (uch)((w) & 0xff)); \
+    put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef DEBUG
+local void send_bits      OF((deflate_state *s, int value, int length));
+
+local void send_bits(s, value, length)
+    deflate_state *s;
+    int value;  /* value to send */
+    int length; /* number of bits */
+{
+    Tracevv((stderr," l %2d v %4x ", length, value));
+    Assert(length > 0 && length <= 15, "invalid length");
+    s->bits_sent += (ulg)length;
+
+    /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+     * unused bits in value.
+     */
+    if (s->bi_valid > (int)Buf_size - length) {
+        s->bi_buf |= (value << s->bi_valid);
+        put_short(s, s->bi_buf);
+        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+        s->bi_valid += length - Buf_size;
+    } else {
+        s->bi_buf |= value << s->bi_valid;
+        s->bi_valid += length;
+    }
+}
+#else /* !DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+  if (s->bi_valid > (int)Buf_size - len) {\
+    int val = value;\
+    s->bi_buf |= (val << s->bi_valid);\
+    put_short(s, s->bi_buf);\
+    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+    s->bi_valid += len - Buf_size;\
+  } else {\
+    s->bi_buf |= (value) << s->bi_valid;\
+    s->bi_valid += len;\
+  }\
+}
+#endif /* DEBUG */
+
+
+#define MAX(a,b) (a >= b ? a : b)
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+local void tr_static_init()
+{
+#if defined(GEN_TREES_H) || !defined(STDC)
+    static int static_init_done = 0;
+    int n;        /* iterates over tree elements */
+    int bits;     /* bit counter */
+    int length;   /* length value */
+    int code;     /* code value */
+    int dist;     /* distance index */
+    ush bl_count[MAX_BITS+1];
+    /* number of codes at each bit length for an optimal tree */
+
+    if (static_init_done) return;
+
+    /* For some embedded targets, global variables are not initialized: */
+    static_l_desc.static_tree = static_ltree;
+    static_l_desc.extra_bits = extra_lbits;
+    static_d_desc.static_tree = static_dtree;
+    static_d_desc.extra_bits = extra_dbits;
+    static_bl_desc.extra_bits = extra_blbits;
+
+    /* Initialize the mapping length (0..255) -> length code (0..28) */
+    length = 0;
+    for (code = 0; code < LENGTH_CODES-1; code++) {
+        base_length[code] = length;
+        for (n = 0; n < (1<<extra_lbits[code]); n++) {
+            _length_code[length++] = (uch)code;
+        }
+    }
+    Assert (length == 256, "tr_static_init: length != 256");
+    /* Note that the length 255 (match length 258) can be represented
+     * in two different ways: code 284 + 5 bits or code 285, so we
+     * overwrite length_code[255] to use the best encoding:
+     */
+    _length_code[length-1] = (uch)code;
+
+    /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+    dist = 0;
+    for (code = 0 ; code < 16; code++) {
+        base_dist[code] = dist;
+        for (n = 0; n < (1<<extra_dbits[code]); n++) {
+            _dist_code[dist++] = (uch)code;
+        }
+    }
+    Assert (dist == 256, "tr_static_init: dist != 256");
+    dist >>= 7; /* from now on, all distances are divided by 128 */
+    for ( ; code < D_CODES; code++) {
+        base_dist[code] = dist << 7;
+        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+            _dist_code[256 + dist++] = (uch)code;
+        }
+    }
+    Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+    /* Construct the codes of the static literal tree */
+    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+    n = 0;
+    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+    /* Codes 286 and 287 do not exist, but we must include them in the
+     * tree construction to get a canonical Huffman tree (longest code
+     * all ones)
+     */
+    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
+
+    /* The static distance tree is trivial: */
+    for (n = 0; n < D_CODES; n++) {
+        static_dtree[n].Len = 5;
+        static_dtree[n].Code = bi_reverse((unsigned)n, 5);
+    }
+    static_init_done = 1;
+
+#  ifdef GEN_TREES_H
+    gen_trees_header();
+#  endif
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
+}
+
+/* ===========================================================================
+ * Genererate the file trees.h describing the static trees.
+ */
+#ifdef GEN_TREES_H
+#  ifndef DEBUG
+#    include <stdio.h>
+#  endif
+
+#  define SEPARATOR(i, last, width) \
+      ((i) == (last)? "\n};\n\n" :    \
+       ((i) % (width) == (width)-1 ? ",\n" : ", "))
+
+void gen_trees_header()
+{
+    FILE *header = fopen("trees.h", "w");
+    int i;
+
+    Assert (header != NULL, "Can't open trees.h");
+    fprintf(header,
+           "/* header created automatically with -DGEN_TREES_H */\n\n");
+
+    fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
+    for (i = 0; i < L_CODES+2; i++) {
+       fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
+               static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
+    }
+
+    fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
+    for (i = 0; i < D_CODES; i++) {
+       fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
+               static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
+    }
+
+    fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
+    for (i = 0; i < DIST_CODE_LEN; i++) {
+       fprintf(header, "%2u%s", _dist_code[i],
+               SEPARATOR(i, DIST_CODE_LEN-1, 20));
+    }
+
+    fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+    for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
+       fprintf(header, "%2u%s", _length_code[i],
+               SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
+    }
+
+    fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
+    for (i = 0; i < LENGTH_CODES; i++) {
+       fprintf(header, "%1u%s", base_length[i],
+               SEPARATOR(i, LENGTH_CODES-1, 20));
+    }
+
+    fprintf(header, "local const int base_dist[D_CODES] = {\n");
+    for (i = 0; i < D_CODES; i++) {
+       fprintf(header, "%5u%s", base_dist[i],
+               SEPARATOR(i, D_CODES-1, 10));
+    }
+
+    fclose(header);
+}
+#endif /* GEN_TREES_H */
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+void _tr_init(s)
+    deflate_state *s;
+{
+    tr_static_init();
+
+    s->l_desc.dyn_tree = s->dyn_ltree;
+    s->l_desc.stat_desc = &static_l_desc;
+
+    s->d_desc.dyn_tree = s->dyn_dtree;
+    s->d_desc.stat_desc = &static_d_desc;
+
+    s->bl_desc.dyn_tree = s->bl_tree;
+    s->bl_desc.stat_desc = &static_bl_desc;
+
+    s->bi_buf = 0;
+    s->bi_valid = 0;
+    s->last_eob_len = 8; /* enough lookahead for inflate */
+#ifdef DEBUG
+    s->compressed_len = 0L;
+    s->bits_sent = 0L;
+#endif
+
+    /* Initialize the first block of the first file: */
+    init_block(s);
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(s)
+    deflate_state *s;
+{
+    int n; /* iterates over tree elements */
+
+    /* Initialize the trees. */
+    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;
+    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;
+    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+    s->dyn_ltree[END_BLOCK].Freq = 1;
+    s->opt_len = s->static_len = 0L;
+    s->last_lit = s->matches = 0;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(s, tree, top) \
+{\
+    top = s->heap[SMALLEST]; \
+    s->heap[SMALLEST] = s->heap[s->heap_len--]; \
+    pqdownheap(s, tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m, depth) \
+   (tree[n].Freq < tree[m].Freq || \
+   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(s, tree, k)
+    deflate_state *s;
+    ct_data *tree;  /* the tree to restore */
+    int k;               /* node to move down */
+{
+    int v = s->heap[k];
+    int j = k << 1;  /* left son of k */
+    while (j <= s->heap_len) {
+        /* Set j to the smallest of the two sons: */
+        if (j < s->heap_len &&
+            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+            j++;
+        }
+        /* Exit if v is smaller than both sons */
+        if (smaller(tree, v, s->heap[j], s->depth)) break;
+
+        /* Exchange v with the smallest son */
+        s->heap[k] = s->heap[j];  k = j;
+
+        /* And continue down the tree, setting j to the left son of k */
+        j <<= 1;
+    }
+    s->heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ *    above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ *     array bl_count contains the frequencies for each bit length.
+ *     The length opt_len is updated; static_len is also updated if stree is
+ *     not null.
+ */
+local void gen_bitlen(s, desc)
+    deflate_state *s;
+    tree_desc *desc;    /* the tree descriptor */
+{
+    ct_data *tree        = desc->dyn_tree;
+    int max_code         = desc->max_code;
+    const ct_data *stree = desc->stat_desc->static_tree;
+    const intf *extra    = desc->stat_desc->extra_bits;
+    int base             = desc->stat_desc->extra_base;
+    int max_length       = desc->stat_desc->max_length;
+    int h;              /* heap index */
+    int n, m;           /* iterate over the tree elements */
+    int bits;           /* bit length */
+    int xbits;          /* extra bits */
+    ush f;              /* frequency */
+    int overflow = 0;   /* number of elements with bit length too large */
+
+    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
+
+    /* In a first pass, compute the optimal bit lengths (which may
+     * overflow in the case of the bit length tree).
+     */
+    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
+
+    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+        n = s->heap[h];
+        bits = tree[tree[n].Dad].Len + 1;
+        if (bits > max_length) bits = max_length, overflow++;
+        tree[n].Len = (ush)bits;
+        /* We overwrite tree[n].Dad which is no longer needed */
+
+        if (n > max_code) continue; /* not a leaf node */
+
+        s->bl_count[bits]++;
+        xbits = 0;
+        if (n >= base) xbits = extra[n-base];
+        f = tree[n].Freq;
+        s->opt_len += (ulg)f * (bits + xbits);
+        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
+    }
+    if (overflow == 0) return;
+
+    Trace((stderr,"\nbit length overflow\n"));
+    /* This happens for example on obj2 and pic of the Calgary corpus */
+
+    /* Find the first bit length which could increase: */
+    do {
+        bits = max_length-1;
+        while (s->bl_count[bits] == 0) bits--;
+        s->bl_count[bits]--;      /* move one leaf down the tree */
+        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+        s->bl_count[max_length]--;
+        /* The brother of the overflow item also moves one step up,
+         * but this does not affect bl_count[max_length]
+         */
+        overflow -= 2;
+    } while (overflow > 0);
+
+    /* Now recompute all bit lengths, scanning in increasing frequency.
+     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+     * lengths instead of fixing only the wrong ones. This idea is taken
+     * from 'ar' written by Haruhiko Okumura.)
+     */
+    for (bits = max_length; bits != 0; bits--) {
+        n = s->bl_count[bits];
+        while (n != 0) {
+            m = s->heap[--h];
+            if (m > max_code) continue;
+            if (tree[m].Len != (unsigned) bits) {
+                Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+                s->opt_len += ((long)bits - (long)tree[m].Len)
+                              *(long)tree[m].Freq;
+                tree[m].Len = (ush)bits;
+            }
+            n--;
+        }
+    }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ *     zero code length.
+ */
+local void gen_codes (tree, max_code, bl_count)
+    ct_data *tree;             /* the tree to decorate */
+    int max_code;              /* largest code with non zero frequency */
+    ushf *bl_count;            /* number of codes at each bit length */
+{
+    ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+    ush code = 0;              /* running code value */
+    int bits;                  /* bit index */
+    int n;                     /* code index */
+
+    /* The distribution counts are first used to generate the code values
+     * without bit reversal.
+     */
+    for (bits = 1; bits <= MAX_BITS; bits++) {
+        next_code[bits] = code = (code + bl_count[bits-1]) << 1;
+    }
+    /* Check that the bit counts in bl_count are consistent. The last code
+     * must be all ones.
+     */
+    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+            "inconsistent bit counts");
+    Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+    for (n = 0;  n <= max_code; n++) {
+        int len = tree[n].Len;
+        if (len == 0) continue;
+        /* Now reverse the bits */
+        tree[n].Code = bi_reverse(next_code[len]++, len);
+
+        Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+    }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ *     and corresponding code. The length opt_len is updated; static_len is
+ *     also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(s, desc)
+    deflate_state *s;
+    tree_desc *desc; /* the tree descriptor */
+{
+    ct_data *tree         = desc->dyn_tree;
+    const ct_data *stree  = desc->stat_desc->static_tree;
+    int elems             = desc->stat_desc->elems;
+    int n, m;          /* iterate over heap elements */
+    int max_code = -1; /* largest code with non zero frequency */
+    int node;          /* new node being created */
+
+    /* Construct the initial heap, with least frequent element in
+     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+     * heap[0] is not used.
+     */
+    s->heap_len = 0, s->heap_max = HEAP_SIZE;
+
+    for (n = 0; n < elems; n++) {
+        if (tree[n].Freq != 0) {
+            s->heap[++(s->heap_len)] = max_code = n;
+            s->depth[n] = 0;
+        } else {
+            tree[n].Len = 0;
+        }
+    }
+
+    /* The pkzip format requires that at least one distance code exists,
+     * and that at least one bit should be sent even if there is only one
+     * possible code. So to avoid special checks later on we force at least
+     * two codes of non zero frequency.
+     */
+    while (s->heap_len < 2) {
+        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
+        tree[node].Freq = 1;
+        s->depth[node] = 0;
+        s->opt_len--; if (stree) s->static_len -= stree[node].Len;
+        /* node is 0 or 1 so it does not have extra bits */
+    }
+    desc->max_code = max_code;
+
+    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+     * establish sub-heaps of increasing lengths:
+     */
+    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
+
+    /* Construct the Huffman tree by repeatedly combining the least two
+     * frequent nodes.
+     */
+    node = elems;              /* next internal node of the tree */
+    do {
+        pqremove(s, tree, n);  /* n = node of least frequency */
+        m = s->heap[SMALLEST]; /* m = node of next least frequency */
+
+        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
+        s->heap[--(s->heap_max)] = m;
+
+        /* Create a new node father of n and m */
+        tree[node].Freq = tree[n].Freq + tree[m].Freq;
+        s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1);
+        tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+        if (tree == s->bl_tree) {
+            fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+        }
+#endif
+        /* and insert the new node in the heap */
+        s->heap[SMALLEST] = node++;
+        pqdownheap(s, tree, SMALLEST);
+
+    } while (s->heap_len >= 2);
+
+    s->heap[--(s->heap_max)] = s->heap[SMALLEST];
+
+    /* At this point, the fields freq and dad are set. We can now
+     * generate the bit lengths.
+     */
+    gen_bitlen(s, (tree_desc *)desc);
+
+    /* The field len is now set, we can generate the bit codes */
+    gen_codes ((ct_data *)tree, max_code, s->bl_count);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+local void scan_tree (s, tree, max_code)
+    deflate_state *s;
+    ct_data *tree;   /* the tree to be scanned */
+    int max_code;    /* and its largest code of non zero frequency */
+{
+    int n;                     /* iterates over all tree elements */
+    int prevlen = -1;          /* last emitted length */
+    int curlen;                /* length of current code */
+    int nextlen = tree[0].Len; /* length of next code */
+    int count = 0;             /* repeat count of the current code */
+    int max_count = 7;         /* max repeat count */
+    int min_count = 4;         /* min repeat count */
+
+    if (nextlen == 0) max_count = 138, min_count = 3;
+    tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+    for (n = 0; n <= max_code; n++) {
+        curlen = nextlen; nextlen = tree[n+1].Len;
+        if (++count < max_count && curlen == nextlen) {
+            continue;
+        } else if (count < min_count) {
+            s->bl_tree[curlen].Freq += count;
+        } else if (curlen != 0) {
+            if (curlen != prevlen) s->bl_tree[curlen].Freq++;
+            s->bl_tree[REP_3_6].Freq++;
+        } else if (count <= 10) {
+            s->bl_tree[REPZ_3_10].Freq++;
+        } else {
+            s->bl_tree[REPZ_11_138].Freq++;
+        }
+        count = 0; prevlen = curlen;
+        if (nextlen == 0) {
+            max_count = 138, min_count = 3;
+        } else if (curlen == nextlen) {
+            max_count = 6, min_count = 3;
+        } else {
+            max_count = 7, min_count = 4;
+        }
+    }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (s, tree, max_code)
+    deflate_state *s;
+    ct_data *tree; /* the tree to be scanned */
+    int max_code;       /* and its largest code of non zero frequency */
+{
+    int n;                     /* iterates over all tree elements */
+    int prevlen = -1;          /* last emitted length */
+    int curlen;                /* length of current code */
+    int nextlen = tree[0].Len; /* length of next code */
+    int count = 0;             /* repeat count of the current code */
+    int max_count = 7;         /* max repeat count */
+    int min_count = 4;         /* min repeat count */
+
+    /* tree[max_code+1].Len = -1; */  /* guard already set */
+    if (nextlen == 0) max_count = 138, min_count = 3;
+
+    for (n = 0; n <= max_code; n++) {
+        curlen = nextlen; nextlen = tree[n+1].Len;
+        if (++count < max_count && curlen == nextlen) {
+            continue;
+        } else if (count < min_count) {
+            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
+
+        } else if (curlen != 0) {
+            if (curlen != prevlen) {
+                send_code(s, curlen, s->bl_tree); count--;
+            }
+            Assert(count >= 3 && count <= 6, " 3_6?");
+            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+
+        } else if (count <= 10) {
+            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+
+        } else {
+            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+        }
+        count = 0; prevlen = curlen;
+        if (nextlen == 0) {
+            max_count = 138, min_count = 3;
+        } else if (curlen == nextlen) {
+            max_count = 6, min_count = 3;
+        } else {
+            max_count = 7, min_count = 4;
+        }
+    }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree(s)
+    deflate_state *s;
+{
+    int max_blindex;  /* index of last bit length code of non zero freq */
+
+    /* Determine the bit length frequencies for literal and distance trees */
+    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
+    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
+
+    /* Build the bit length tree: */
+    build_tree(s, (tree_desc *)(&(s->bl_desc)));
+    /* opt_len now includes the length of the tree representations, except
+     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+     */
+
+    /* Determine the number of bit length codes to send. The pkzip format
+     * requires that at least 4 bit length codes be sent. (appnote.txt says
+     * 3 but the actual value used is 4.)
+     */
+    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
+    }
+    /* Update opt_len to include the bit length tree and counts */
+    s->opt_len += 3*(max_blindex+1) + 5+5+4;
+    Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+            s->opt_len, s->static_len));
+
+    return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(s, lcodes, dcodes, blcodes)
+    deflate_state *s;
+    int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+    int rank;                    /* index in bl_order */
+
+    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+            "too many codes");
+    Tracev((stderr, "\nbl counts: "));
+    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
+    send_bits(s, dcodes-1,   5);
+    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */
+    for (rank = 0; rank < blcodes; rank++) {
+        Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
+    }
+    Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+    Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+    Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+/* ===========================================================================
+ * Send a stored block
+ */
+void _tr_stored_block(s, buf, stored_len, eof)
+    deflate_state *s;
+    charf *buf;       /* input block */
+    ulg stored_len;   /* length of input block */
+    int eof;          /* true if this is the last block for a file */
+{
+    send_bits(s, (STORED_BLOCK<<1)+eof, 3);  /* send block type */
+#ifdef DEBUG
+    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
+    s->compressed_len += (stored_len + 4) << 3;
+#endif
+    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
+}
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ * The current inflate code requires 9 bits of lookahead. If the
+ * last two codes for the previous block (real code plus EOB) were coded
+ * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
+ * the last real code. In this case we send two empty static blocks instead
+ * of one. (There are no problems if the previous block is stored or fixed.)
+ * To simplify the code, we assume the worst case of last real code encoded
+ * on one bit only.
+ */
+void _tr_align(s)
+    deflate_state *s;
+{
+    send_bits(s, STATIC_TREES<<1, 3);
+    send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+#endif
+    bi_flush(s);
+    /* Of the 10 bits for the empty block, we have already sent
+     * (10 - bi_valid) bits. The lookahead for the last real code (before
+     * the EOB of the previous block) was thus at least one plus the length
+     * of the EOB plus what we have just sent of the empty static block.
+     */
+    if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
+        send_bits(s, STATIC_TREES<<1, 3);
+        send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+        s->compressed_len += 10L;
+#endif
+        bi_flush(s);
+    }
+    s->last_eob_len = 7;
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+void _tr_flush_block(s, buf, stored_len, eof)
+    deflate_state *s;
+    charf *buf;       /* input block, or NULL if too old */
+    ulg stored_len;   /* length of input block */
+    int eof;          /* true if this is the last block for a file */
+{
+    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+    int max_blindex = 0;  /* index of last bit length code of non zero freq */
+
+    /* Build the Huffman trees unless a stored block is forced */
+    if (s->level > 0) {
+
+        /* Check if the file is ascii or binary */
+       if (s->data_type == Z_UNKNOWN) set_data_type(s);
+
+       /* Construct the literal and distance trees */
+       build_tree(s, (tree_desc *)(&(s->l_desc)));
+       Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+               s->static_len));
+
+       build_tree(s, (tree_desc *)(&(s->d_desc)));
+       Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+               s->static_len));
+       /* At this point, opt_len and static_len are the total bit lengths of
+        * the compressed block data, excluding the tree representations.
+        */
+
+       /* Build the bit length tree for the above two trees, and get the index
+        * in bl_order of the last bit length code to send.
+        */
+       max_blindex = build_bl_tree(s);
+
+       /* Determine the best encoding. Compute first the block length in bytes*/
+       opt_lenb = (s->opt_len+3+7)>>3;
+       static_lenb = (s->static_len+3+7)>>3;
+
+       Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+               opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+               s->last_lit));
+
+       if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+    } else {
+        Assert(buf != (char*)0, "lost buf");
+       opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+    }
+
+#ifdef FORCE_STORED
+    if (buf != (char*)0) { /* force stored block */
+#else
+    if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+                       /* 4: two words for the lengths */
+#endif
+        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+         * Otherwise we can't have processed more than WSIZE input bytes since
+         * the last block flush, because compression would have been
+         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+         * transform a block into a stored block.
+         */
+        _tr_stored_block(s, buf, stored_len, eof);
+
+#ifdef FORCE_STATIC
+    } else if (static_lenb >= 0) { /* force static trees */
+#else
+    } else if (static_lenb == opt_lenb) {
+#endif
+        send_bits(s, (STATIC_TREES<<1)+eof, 3);
+        compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
+#ifdef DEBUG
+        s->compressed_len += 3 + s->static_len;
+#endif
+    } else {
+        send_bits(s, (DYN_TREES<<1)+eof, 3);
+        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
+                       max_blindex+1);
+        compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
+#ifdef DEBUG
+        s->compressed_len += 3 + s->opt_len;
+#endif
+    }
+    Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+    /* The above check is made mod 2^32, for files larger than 512 MB
+     * and uLong implemented on 32 bits.
+     */
+    init_block(s);
+
+    if (eof) {
+        bi_windup(s);
+#ifdef DEBUG
+        s->compressed_len += 7;  /* align on byte boundary */
+#endif
+    }
+    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+           s->compressed_len-7*eof));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int _tr_tally (s, dist, lc)
+    deflate_state *s;
+    unsigned dist;  /* distance of matched string */
+    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+    s->d_buf[s->last_lit] = (ush)dist;
+    s->l_buf[s->last_lit++] = (uch)lc;
+    if (dist == 0) {
+        /* lc is the unmatched char */
+        s->dyn_ltree[lc].Freq++;
+    } else {
+        s->matches++;
+        /* Here, lc is the match length - MIN_MATCH */
+        dist--;             /* dist = match distance - 1 */
+        Assert((ush)dist < (ush)MAX_DIST(s) &&
+               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+               (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");
+
+        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+        s->dyn_dtree[d_code(dist)].Freq++;
+    }
+
+#ifdef TRUNCATE_BLOCK
+    /* Try to guess if it is profitable to stop the current block here */
+    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
+        /* Compute an upper bound for the compressed length */
+        ulg out_length = (ulg)s->last_lit*8L;
+        ulg in_length = (ulg)((long)s->strstart - s->block_start);
+        int dcode;
+        for (dcode = 0; dcode < D_CODES; dcode++) {
+            out_length += (ulg)s->dyn_dtree[dcode].Freq *
+                (5L+extra_dbits[dcode]);
+        }
+        out_length >>= 3;
+        Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+               s->last_lit, in_length, out_length,
+               100L - out_length*100L/in_length));
+        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
+    }
+#endif
+    return (s->last_lit == s->lit_bufsize-1);
+    /* We avoid equality with lit_bufsize because of wraparound at 64K
+     * on 16 bit machines and because stored blocks are restricted to
+     * 64K-1 bytes.
+     */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(s, ltree, dtree)
+    deflate_state *s;
+    ct_data *ltree; /* literal tree */
+    ct_data *dtree; /* distance tree */
+{
+    unsigned dist;      /* distance of matched string */
+    int lc;             /* match length or unmatched char (if dist == 0) */
+    unsigned lx = 0;    /* running index in l_buf */
+    unsigned code;      /* the code to send */
+    int extra;          /* number of extra bits to send */
+
+    if (s->last_lit != 0) do {
+        dist = s->d_buf[lx];
+        lc = s->l_buf[lx++];
+        if (dist == 0) {
+            send_code(s, lc, ltree); /* send a literal byte */
+            Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+        } else {
+            /* Here, lc is the match length - MIN_MATCH */
+            code = _length_code[lc];
+            send_code(s, code+LITERALS+1, ltree); /* send the length code */
+            extra = extra_lbits[code];
+            if (extra != 0) {
+                lc -= base_length[code];
+                send_bits(s, lc, extra);       /* send the extra length bits */
+            }
+            dist--; /* dist is now the match distance - 1 */
+            code = d_code(dist);
+            Assert (code < D_CODES, "bad d_code");
+
+            send_code(s, code, dtree);       /* send the distance code */
+            extra = extra_dbits[code];
+            if (extra != 0) {
+                dist -= base_dist[code];
+                send_bits(s, dist, extra);   /* send the extra distance bits */
+            }
+        } /* literal or match pair ? */
+
+        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+        Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
+
+    } while (lx < s->last_lit);
+
+    send_code(s, END_BLOCK, ltree);
+    s->last_eob_len = ltree[END_BLOCK].Len;
+}
+
+/* ===========================================================================
+ * Set the data type to ASCII or BINARY, using a crude approximation:
+ * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
+ * IN assertion: the fields freq of dyn_ltree are set and the total of all
+ * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
+ */
+local void set_data_type(s)
+    deflate_state *s;
+{
+    int n = 0;
+    unsigned ascii_freq = 0;
+    unsigned bin_freq = 0;
+    while (n < 7)        bin_freq += s->dyn_ltree[n++].Freq;
+    while (n < 128)    ascii_freq += s->dyn_ltree[n++].Freq;
+    while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
+    s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+local unsigned bi_reverse(code, len)
+    unsigned code; /* the value to invert */
+    int len;       /* its bit length */
+{
+    register unsigned res = 0;
+    do {
+        res |= code & 1;
+        code >>= 1, res <<= 1;
+    } while (--len > 0);
+    return res >> 1;
+}
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(s)
+    deflate_state *s;
+{
+    if (s->bi_valid == 16) {
+        put_short(s, s->bi_buf);
+        s->bi_buf = 0;
+        s->bi_valid = 0;
+    } else if (s->bi_valid >= 8) {
+        put_byte(s, (Byte)s->bi_buf);
+        s->bi_buf >>= 8;
+        s->bi_valid -= 8;
+    }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(s)
+    deflate_state *s;
+{
+    if (s->bi_valid > 8) {
+        put_short(s, s->bi_buf);
+    } else if (s->bi_valid > 0) {
+        put_byte(s, (Byte)s->bi_buf);
+    }
+    s->bi_buf = 0;
+    s->bi_valid = 0;
+#ifdef DEBUG
+    s->bits_sent = (s->bits_sent+7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
+ */
+local void copy_block(s, buf, len, header)
+    deflate_state *s;
+    charf    *buf;    /* the input data */
+    unsigned len;     /* its length */
+    int      header;  /* true if block header must be written */
+{
+    bi_windup(s);        /* align on byte boundary */
+    s->last_eob_len = 8; /* enough lookahead for inflate */
+
+    if (header) {
+        put_short(s, (ush)len);   
+        put_short(s, (ush)~len);
+#ifdef DEBUG
+        s->bits_sent += 2*16;
+#endif
+    }
+#ifdef DEBUG
+    s->bits_sent += (ulg)len<<3;
+#endif
+    while (len--) {
+        put_byte(s, *buf++);
+    }
+}
diff --git a/zlib/trees.h b/zlib/trees.h
new file mode 100644 (file)
index 0000000..72facf9
--- /dev/null
@@ -0,0 +1,128 @@
+/* header created automatically with -DGEN_TREES_H */
+
+local const ct_data static_ltree[L_CODES+2] = {
+{{ 12},{  8}}, {{140},{  8}}, {{ 76},{  8}}, {{204},{  8}}, {{ 44},{  8}},
+{{172},{  8}}, {{108},{  8}}, {{236},{  8}}, {{ 28},{  8}}, {{156},{  8}},
+{{ 92},{  8}}, {{220},{  8}}, {{ 60},{  8}}, {{188},{  8}}, {{124},{  8}},
+{{252},{  8}}, {{  2},{  8}}, {{130},{  8}}, {{ 66},{  8}}, {{194},{  8}},
+{{ 34},{  8}}, {{162},{  8}}, {{ 98},{  8}}, {{226},{  8}}, {{ 18},{  8}},
+{{146},{  8}}, {{ 82},{  8}}, {{210},{  8}}, {{ 50},{  8}}, {{178},{  8}},
+{{114},{  8}}, {{242},{  8}}, {{ 10},{  8}}, {{138},{  8}}, {{ 74},{  8}},
+{{202},{  8}}, {{ 42},{  8}}, {{170},{  8}}, {{106},{  8}}, {{234},{  8}},
+{{ 26},{  8}}, {{154},{  8}}, {{ 90},{  8}}, {{218},{  8}}, {{ 58},{  8}},
+{{186},{  8}}, {{122},{  8}}, {{250},{  8}}, {{  6},{  8}}, {{134},{  8}},
+{{ 70},{  8}}, {{198},{  8}}, {{ 38},{  8}}, {{166},{  8}}, {{102},{  8}},
+{{230},{  8}}, {{ 22},{  8}}, {{150},{  8}}, {{ 86},{  8}}, {{214},{  8}},
+{{ 54},{  8}}, {{182},{  8}}, {{118},{  8}}, {{246},{  8}}, {{ 14},{  8}},
+{{142},{  8}}, {{ 78},{  8}}, {{206},{  8}}, {{ 46},{  8}}, {{174},{  8}},
+{{110},{  8}}, {{238},{  8}}, {{ 30},{  8}}, {{158},{  8}}, {{ 94},{  8}},
+{{222},{  8}}, {{ 62},{  8}}, {{190},{  8}}, {{126},{  8}}, {{254},{  8}},
+{{  1},{  8}}, {{129},{  8}}, {{ 65},{  8}}, {{193},{  8}}, {{ 33},{  8}},
+{{161},{  8}}, {{ 97},{  8}}, {{225},{  8}}, {{ 17},{  8}}, {{145},{  8}},
+{{ 81},{  8}}, {{209},{  8}}, {{ 49},{  8}}, {{177},{  8}}, {{113},{  8}},
+{{241},{  8}}, {{  9},{  8}}, {{137},{  8}}, {{ 73},{  8}}, {{201},{  8}},
+{{ 41},{  8}}, {{169},{  8}}, {{105},{  8}}, {{233},{  8}}, {{ 25},{  8}},
+{{153},{  8}}, {{ 89},{  8}}, {{217},{  8}}, {{ 57},{  8}}, {{185},{  8}},
+{{121},{  8}}, {{249},{  8}}, {{  5},{  8}}, {{133},{  8}}, {{ 69},{  8}},
+{{197},{  8}}, {{ 37},{  8}}, {{165},{  8}}, {{101},{  8}}, {{229},{  8}},
+{{ 21},{  8}}, {{149},{  8}}, {{ 85},{  8}}, {{213},{  8}}, {{ 53},{  8}},
+{{181},{  8}}, {{117},{  8}}, {{245},{  8}}, {{ 13},{  8}}, {{141},{  8}},
+{{ 77},{  8}}, {{205},{  8}}, {{ 45},{  8}}, {{173},{  8}}, {{109},{  8}},
+{{237},{  8}}, {{ 29},{  8}}, {{157},{  8}}, {{ 93},{  8}}, {{221},{  8}},
+{{ 61},{  8}}, {{189},{  8}}, {{125},{  8}}, {{253},{  8}}, {{ 19},{  9}},
+{{275},{  9}}, {{147},{  9}}, {{403},{  9}}, {{ 83},{  9}}, {{339},{  9}},
+{{211},{  9}}, {{467},{  9}}, {{ 51},{  9}}, {{307},{  9}}, {{179},{  9}},
+{{435},{  9}}, {{115},{  9}}, {{371},{  9}}, {{243},{  9}}, {{499},{  9}},
+{{ 11},{  9}}, {{267},{  9}}, {{139},{  9}}, {{395},{  9}}, {{ 75},{  9}},
+{{331},{  9}}, {{203},{  9}}, {{459},{  9}}, {{ 43},{  9}}, {{299},{  9}},
+{{171},{  9}}, {{427},{  9}}, {{107},{  9}}, {{363},{  9}}, {{235},{  9}},
+{{491},{  9}}, {{ 27},{  9}}, {{283},{  9}}, {{155},{  9}}, {{411},{  9}},
+{{ 91},{  9}}, {{347},{  9}}, {{219},{  9}}, {{475},{  9}}, {{ 59},{  9}},
+{{315},{  9}}, {{187},{  9}}, {{443},{  9}}, {{123},{  9}}, {{379},{  9}},
+{{251},{  9}}, {{507},{  9}}, {{  7},{  9}}, {{263},{  9}}, {{135},{  9}},
+{{391},{  9}}, {{ 71},{  9}}, {{327},{  9}}, {{199},{  9}}, {{455},{  9}},
+{{ 39},{  9}}, {{295},{  9}}, {{167},{  9}}, {{423},{  9}}, {{103},{  9}},
+{{359},{  9}}, {{231},{  9}}, {{487},{  9}}, {{ 23},{  9}}, {{279},{  9}},
+{{151},{  9}}, {{407},{  9}}, {{ 87},{  9}}, {{343},{  9}}, {{215},{  9}},
+{{471},{  9}}, {{ 55},{  9}}, {{311},{  9}}, {{183},{  9}}, {{439},{  9}},
+{{119},{  9}}, {{375},{  9}}, {{247},{  9}}, {{503},{  9}}, {{ 15},{  9}},
+{{271},{  9}}, {{143},{  9}}, {{399},{  9}}, {{ 79},{  9}}, {{335},{  9}},
+{{207},{  9}}, {{463},{  9}}, {{ 47},{  9}}, {{303},{  9}}, {{175},{  9}},
+{{431},{  9}}, {{111},{  9}}, {{367},{  9}}, {{239},{  9}}, {{495},{  9}},
+{{ 31},{  9}}, {{287},{  9}}, {{159},{  9}}, {{415},{  9}}, {{ 95},{  9}},
+{{351},{  9}}, {{223},{  9}}, {{479},{  9}}, {{ 63},{  9}}, {{319},{  9}},
+{{191},{  9}}, {{447},{  9}}, {{127},{  9}}, {{383},{  9}}, {{255},{  9}},
+{{511},{  9}}, {{  0},{  7}}, {{ 64},{  7}}, {{ 32},{  7}}, {{ 96},{  7}},
+{{ 16},{  7}}, {{ 80},{  7}}, {{ 48},{  7}}, {{112},{  7}}, {{  8},{  7}},
+{{ 72},{  7}}, {{ 40},{  7}}, {{104},{  7}}, {{ 24},{  7}}, {{ 88},{  7}},
+{{ 56},{  7}}, {{120},{  7}}, {{  4},{  7}}, {{ 68},{  7}}, {{ 36},{  7}},
+{{100},{  7}}, {{ 20},{  7}}, {{ 84},{  7}}, {{ 52},{  7}}, {{116},{  7}},
+{{  3},{  8}}, {{131},{  8}}, {{ 67},{  8}}, {{195},{  8}}, {{ 35},{  8}},
+{{163},{  8}}, {{ 99},{  8}}, {{227},{  8}}
+};
+
+local const ct_data static_dtree[D_CODES] = {
+{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
+{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
+{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
+{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
+{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
+{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
+};
+
+const uch _dist_code[DIST_CODE_LEN] = {
+ 0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,
+ 8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 16, 17,
+18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
+};
+
+const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {
+ 0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 12, 12,
+13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
+19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
+};
+
+local const int base_length[LENGTH_CODES] = {
+0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
+64, 80, 96, 112, 128, 160, 192, 224, 0
+};
+
+local const int base_dist[D_CODES] = {
+    0,     1,     2,     3,     4,     6,     8,    12,    16,    24,
+   32,    48,    64,    96,   128,   192,   256,   384,   512,   768,
+ 1024,  1536,  2048,  3072,  4096,  6144,  8192, 12288, 16384, 24576
+};
+
diff --git a/zlib/uncompr.c b/zlib/uncompr.c
new file mode 100644 (file)
index 0000000..adac8ea
--- /dev/null
@@ -0,0 +1,58 @@
+/* uncompr.c -- decompress a memory buffer
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: uncompr.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#include "zlib.h"
+
+/* ===========================================================================
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be large enough to hold the
+   entire uncompressed data. (The size of the uncompressed data must have
+   been saved previously by the compressor and transmitted to the decompressor
+   by some mechanism outside the scope of this compression library.)
+   Upon exit, destLen is the actual size of the compressed buffer.
+     This function can be used to decompress a whole file at once if the
+   input file is mmap'ed.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+int ZEXPORT uncompress (dest, destLen, source, sourceLen)
+    Bytef *dest;
+    uLongf *destLen;
+    const Bytef *source;
+    uLong sourceLen;
+{
+    z_stream stream;
+    int err;
+
+    stream.next_in = (Bytef*)source;
+    stream.avail_in = (uInt)sourceLen;
+    /* Check for source > 64K on 16-bit machine: */
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
+
+    stream.next_out = dest;
+    stream.avail_out = (uInt)*destLen;
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
+
+    stream.zalloc = (alloc_func)0;
+    stream.zfree = (free_func)0;
+
+    err = inflateInit(&stream);
+    if (err != Z_OK) return err;
+
+    err = inflate(&stream, Z_FINISH);
+    if (err != Z_STREAM_END) {
+        inflateEnd(&stream);
+        return err == Z_OK ? Z_BUF_ERROR : err;
+    }
+    *destLen = stream.total_out;
+
+    err = inflateEnd(&stream);
+    return err;
+}
diff --git a/zlib/zconf.h b/zlib/zconf.h
new file mode 100644 (file)
index 0000000..5484757
--- /dev/null
@@ -0,0 +1,279 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: zconf.h 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#ifndef _ZCONF_H
+#define _ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+#  define deflateInit_ z_deflateInit_
+#  define deflate      z_deflate
+#  define deflateEnd   z_deflateEnd
+#  define inflateInit_         z_inflateInit_
+#  define inflate      z_inflate
+#  define inflateEnd   z_inflateEnd
+#  define deflateInit2_        z_deflateInit2_
+#  define deflateSetDictionary z_deflateSetDictionary
+#  define deflateCopy  z_deflateCopy
+#  define deflateReset z_deflateReset
+#  define deflateParams        z_deflateParams
+#  define inflateInit2_        z_inflateInit2_
+#  define inflateSetDictionary z_inflateSetDictionary
+#  define inflateSync  z_inflateSync
+#  define inflateSyncPoint z_inflateSyncPoint
+#  define inflateReset z_inflateReset
+#  define compress     z_compress
+#  define compress2    z_compress2
+#  define uncompress   z_uncompress
+#  define adler32      z_adler32
+#  define crc32                z_crc32
+#  define get_crc_table z_get_crc_table
+
+#  define Byte         z_Byte
+#  define uInt         z_uInt
+#  define uLong                z_uLong
+#  define Bytef                z_Bytef
+#  define charf                z_charf
+#  define intf         z_intf
+#  define uIntf                z_uIntf
+#  define uLongf       z_uLongf
+#  define voidpf       z_voidpf
+#  define voidp                z_voidp
+#endif
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
+#  define WIN32
+#endif
+#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
+#  ifndef __32BIT__
+#    define __32BIT__
+#  endif
+#endif
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#if defined(MSDOS) && !defined(__32BIT__)
+#  define MAXSEG_64K
+#endif
+#ifdef MSDOS
+#  define UNALIGNED_OK
+#endif
+
+#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
+#  define STDC
+#endif
+#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
+#  ifndef STDC
+#    define STDC
+#  endif
+#endif
+
+#ifndef STDC
+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+#    define const
+#  endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+#  define NO_DUMMY_DECL
+#endif
+
+/* Old Borland C incorrectly complains about missing returns: */
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
+#  define NEED_DUMMY_RETURN
+#endif
+
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+#  ifdef MAXSEG_64K
+#    define MAX_MEM_LEVEL 8
+#  else
+#    define MAX_MEM_LEVEL 9
+#  endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+#  define MAX_WBITS   15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+            (1 << (windowBits+2)) +  (1 << (memLevel+9))
+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+   The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+                        /* Type declarations */
+
+#ifndef OF /* function prototypes */
+#  ifdef STDC
+#    define OF(args)  args
+#  else
+#    define OF(args)  ()
+#  endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
+   /* MSC small or medium model */
+#  define SMALL_MEDIUM
+#  ifdef _MSC_VER
+#    define FAR _far
+#  else
+#    define FAR far
+#  endif
+#endif
+#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+#  ifndef __32BIT__
+#    define SMALL_MEDIUM
+#    define FAR _far
+#  endif
+#endif
+
+/* Compile with -DZLIB_DLL for Windows DLL support */
+#if defined(ZLIB_DLL)
+#  if defined(_WINDOWS) || defined(WINDOWS)
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+#    define ZEXPORT  WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA  WINAPIV
+#    else
+#      define ZEXPORTVA  FAR _cdecl _export
+#    endif
+#  endif
+#  if defined (__BORLANDC__)
+#    if (__BORLANDC__ >= 0x0500) && defined (WIN32)
+#      include <windows.h>
+#      define ZEXPORT __declspec(dllexport) WINAPI
+#      define ZEXPORTRVA __declspec(dllexport) WINAPIV
+#    else
+#      if defined (_Windows) && defined (__DLL__)
+#        define ZEXPORT _export
+#        define ZEXPORTVA _export
+#      endif
+#    endif
+#  endif
+#endif
+
+#if defined (__BEOS__)
+#  if defined (ZLIB_DLL)
+#    define ZEXTERN extern __declspec(dllexport)
+#  else
+#    define ZEXTERN extern __declspec(dllimport)
+#  endif
+#endif
+
+#ifndef ZEXPORT
+#  define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+#  define ZEXPORTVA
+#endif
+#ifndef ZEXTERN
+#  define ZEXTERN extern
+#endif
+
+#ifndef FAR
+#   define FAR
+#endif
+
+#if !defined(MACOS) && !defined(TARGET_OS_MAC)
+typedef unsigned char  Byte;  /* 8 bits */
+#endif
+typedef unsigned int   uInt;  /* 16 bits or more */
+typedef unsigned long  uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+#  define Bytef Byte FAR
+#else
+   typedef Byte  FAR Bytef;
+#endif
+typedef char  FAR charf;
+typedef int   FAR intf;
+typedef uInt  FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+   typedef void FAR *voidpf;
+   typedef void     *voidp;
+#else
+   typedef Byte FAR *voidpf;
+   typedef Byte     *voidp;
+#endif
+
+#ifdef HAVE_UNISTD_H
+#  include <sys/types.h> /* for off_t */
+#  include <unistd.h>    /* for SEEK_* and off_t */
+#  define z_off_t  off_t
+#endif
+#ifndef SEEK_SET
+#  define SEEK_SET        0       /* Seek from beginning of file.  */
+#  define SEEK_CUR        1       /* Seek from current position.  */
+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+#  define  z_off_t long
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+#   pragma map(deflateInit_,"DEIN")
+#   pragma map(deflateInit2_,"DEIN2")
+#   pragma map(deflateEnd,"DEEND")
+#   pragma map(inflateInit_,"ININ")
+#   pragma map(inflateInit2_,"ININ2")
+#   pragma map(inflateEnd,"INEND")
+#   pragma map(inflateSync,"INSY")
+#   pragma map(inflateSetDictionary,"INSEDI")
+#   pragma map(inflate_blocks,"INBL")
+#   pragma map(inflate_blocks_new,"INBLNE")
+#   pragma map(inflate_blocks_free,"INBLFR")
+#   pragma map(inflate_blocks_reset,"INBLRE")
+#   pragma map(inflate_codes_free,"INCOFR")
+#   pragma map(inflate_codes,"INCO")
+#   pragma map(inflate_fast,"INFA")
+#   pragma map(inflate_flush,"INFLU")
+#   pragma map(inflate_mask,"INMA")
+#   pragma map(inflate_set_dictionary,"INSEDI2")
+#   pragma map(inflate_copyright,"INCOPY")
+#   pragma map(inflate_trees_bits,"INTRBI")
+#   pragma map(inflate_trees_dynamic,"INTRDY")
+#   pragma map(inflate_trees_fixed,"INTRFI")
+#   pragma map(inflate_trees_free,"INTRFR")
+#endif
+
+#endif /* _ZCONF_H */
diff --git a/zlib/zlib.h b/zlib/zlib.h
new file mode 100644 (file)
index 0000000..52cb529
--- /dev/null
@@ -0,0 +1,893 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+  version 1.1.4, March 11th, 2002
+
+  Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
+
+
+  The data format used by the zlib library is described by RFCs (Request for
+  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
+  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef _ZLIB_H
+#define _ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.1.4"
+
+/* 
+     The 'zlib' compression library provides in-memory compression and
+  decompression functions, including integrity checks of the uncompressed
+  data.  This version of the library supports only one compression method
+  (deflation) but other algorithms will be added later and will have the same
+  stream interface.
+
+     Compression can be done in a single step if the buffers are large
+  enough (for example if an input file is mmap'ed), or can be done by
+  repeated calls of the compression function.  In the latter case, the
+  application must provide more input and/or consume the output
+  (providing more output space) before each call.
+
+     The library also supports reading and writing files in gzip (.gz) format
+  with an interface similar to that of stdio.
+
+     The library does not install any signal handler. The decoder checks
+  the consistency of the compressed data, so the library should never
+  crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+    Bytef    *next_in;  /* next input byte */
+    uInt     avail_in;  /* number of bytes available at next_in */
+    uLong    total_in;  /* total nb of input bytes read so far */
+
+    Bytef    *next_out; /* next output byte should be put there */
+    uInt     avail_out; /* remaining free space at next_out */
+    uLong    total_out; /* total nb of bytes output so far */
+
+    char     *msg;      /* last error message, NULL if no error */
+    struct internal_state FAR *state; /* not visible by applications */
+
+    alloc_func zalloc;  /* used to allocate the internal state */
+    free_func  zfree;   /* used to free the internal state */
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */
+
+    int     data_type;  /* best guess about the data type: ascii or binary */
+    uLong   adler;      /* adler32 value of the uncompressed data */
+    uLong   reserved;   /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+   The application must update next_in and avail_in when avail_in has
+   dropped to zero. It must update next_out and avail_out when avail_out
+   has dropped to zero. The application must initialize zalloc, zfree and
+   opaque before calling the init function. All other fields are set by the
+   compression library and must not be updated by the application.
+
+   The opaque value provided by the application will be passed as the first
+   parameter for calls of zalloc and zfree. This can be useful for custom
+   memory management. The compression library attaches no meaning to the
+   opaque value.
+
+   zalloc must return Z_NULL if there is not enough memory for the object.
+   If zlib is used in a multi-threaded application, zalloc and zfree must be
+   thread safe.
+
+   On 16-bit systems, the functions zalloc and zfree must be able to allocate
+   exactly 65536 bytes, but will not be required to allocate more than this
+   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+   pointers returned by zalloc for objects of exactly 65536 bytes *must*
+   have their offset normalized to zero. The default allocation function
+   provided by this library ensures this (see zutil.c). To reduce memory
+   requirements and avoid any allocation of 64K objects, at the expense of
+   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+   The fields total_in and total_out can be used for statistics or
+   progress reports. After compression, total_in holds the total size of
+   the uncompressed data and may be saved for use in the decompressor
+   (particularly if the decompressor wants to decompress everything in
+   a single step).
+*/
+
+                        /* constants */
+
+#define Z_NO_FLUSH      0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH    2
+#define Z_FULL_FLUSH    3
+#define Z_FINISH        4
+/* Allowed flush values; see deflate() below for details */
+
+#define Z_OK            0
+#define Z_STREAM_END    1
+#define Z_NEED_DICT     2
+#define Z_ERRNO        (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR   (-3)
+#define Z_MEM_ERROR    (-4)
+#define Z_BUF_ERROR    (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION         0
+#define Z_BEST_SPEED             1
+#define Z_BEST_COMPRESSION       9
+#define Z_DEFAULT_COMPRESSION  (-1)
+/* compression levels */
+
+#define Z_FILTERED            1
+#define Z_HUFFMAN_ONLY        2
+#define Z_DEFAULT_STRATEGY    0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY   0
+#define Z_ASCII    1
+#define Z_UNKNOWN  2
+/* Possible values of the data_type field */
+
+#define Z_DEFLATED   8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+                        /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+   If the first character differs, the library code actually used is
+   not compatible with the zlib.h header file used by the application.
+   This check is automatically made by deflateInit and inflateInit.
+ */
+
+/* 
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+     Initializes the internal stream state for compression. The fields
+   zalloc, zfree and opaque must be initialized before by the caller.
+   If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+   use default allocation functions.
+
+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+   1 gives best speed, 9 gives best compression, 0 gives no compression at
+   all (the input data is simply copied a block at a time).
+   Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+   compression (currently equivalent to level 6).
+
+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+   with the version assumed by the caller (ZLIB_VERSION).
+   msg is set to null if there is no error message.  deflateInit does not
+   perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+    deflate compresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may introduce some
+  output latency (reading input without producing any output) except when
+  forced to flush.
+
+    The detailed semantics are as follows. deflate performs one or both of the
+  following actions:
+
+  - Compress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in and avail_in are updated and
+    processing will resume at this point for the next call of deflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly. This action is forced if the parameter flush is non zero.
+    Forcing flush frequently degrades the compression ratio, so this parameter
+    should be set only when necessary (in interactive applications).
+    Some output may be provided even if flush is not set.
+
+  Before the call of deflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating avail_in or avail_out accordingly; avail_out
+  should never be zero before the call. The application can consume the
+  compressed output when it wants, for example when the output buffer is full
+  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+  and with zero avail_out, it must be called again after making room in the
+  output buffer because there might be more output pending.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+  flushed to the output buffer and the output is aligned on a byte boundary, so
+  that the decompressor can get all input data available so far. (In particular
+  avail_in is zero after the call if enough output space has been provided
+  before the call.)  Flushing may degrade compression for some compression
+  algorithms and so it should be used only when necessary.
+
+    If flush is set to Z_FULL_FLUSH, all output is flushed as with
+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+  restart from this point if previous compressed data has been damaged or if
+  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+  the compression.
+
+    If deflate returns with avail_out == 0, this function must be called again
+  with the same value of the flush parameter and more output space (updated
+  avail_out), until the flush is complete (deflate returns with non-zero
+  avail_out).
+
+    If the parameter flush is set to Z_FINISH, pending input is processed,
+  pending output is flushed and deflate returns with Z_STREAM_END if there
+  was enough output space; if deflate returns with Z_OK, this function must be
+  called again with Z_FINISH and more output space (updated avail_out) but no
+  more input data, until it returns with Z_STREAM_END or an error. After
+  deflate has returned Z_STREAM_END, the only possible operations on the
+  stream are deflateReset or deflateEnd.
+  
+    Z_FINISH can be used immediately after deflateInit if all the compression
+  is to be done in a single step. In this case, avail_out must be at least
+  0.1% larger than avail_in plus 12 bytes.  If deflate does not return
+  Z_STREAM_END, then it must be called again as described above.
+
+    deflate() sets strm->adler to the adler32 checksum of all input read
+  so far (that is, total_in bytes).
+
+    deflate() may update data_type if it can make a good guess about
+  the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
+  binary. This field is only for information purposes and does not affect
+  the compression algorithm in any manner.
+
+    deflate() returns Z_OK if some progress has been made (more input
+  processed or more output produced), Z_STREAM_END if all input has been
+  consumed and all output has been produced (only when flush is set to
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+  (for example avail_in or avail_out was zero).
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+   prematurely (some input or output was discarded). In the error case,
+   msg may be set but then points to a static string (which must not be
+   deallocated).
+*/
+
+
+/* 
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+     Initializes the internal stream state for decompression. The fields
+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+   value depends on the compression method), inflateInit determines the
+   compression method from the zlib header and allocates all data structures
+   accordingly; otherwise the allocation will be deferred to the first call of
+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+   use default allocation functions.
+
+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+   version assumed by the caller.  msg is set to null if there is no error
+   message. inflateInit does not perform any decompression apart from reading
+   the zlib header if present: this will be done by inflate().  (So next_in and
+   avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+    inflate decompresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may some
+  introduce some output latency (reading input without producing any output)
+  except when forced to flush.
+
+  The detailed semantics are as follows. inflate performs one or both of the
+  following actions:
+
+  - Decompress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in is updated and processing
+    will resume at this point for the next call of inflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly.  inflate() provides as much output as possible, until there
+    is no more input data or no more space in the output buffer (see below
+    about the flush parameter).
+
+  Before the call of inflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating the next_* and avail_* values accordingly.
+  The application can consume the uncompressed output when it wants, for
+  example when the output buffer is full (avail_out == 0), or after each
+  call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+  must be called again after making room in the output buffer because there
+  might be more output pending.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
+  output as possible to the output buffer. The flushing behavior of inflate is
+  not specified for values of the flush parameter other than Z_SYNC_FLUSH
+  and Z_FINISH, but the current implementation actually flushes as much output
+  as possible anyway.
+
+    inflate() should normally be called until it returns Z_STREAM_END or an
+  error. However if all decompression is to be performed in a single step
+  (a single call of inflate), the parameter flush should be set to
+  Z_FINISH. In this case all pending input is processed and all pending
+  output is flushed; avail_out must be large enough to hold all the
+  uncompressed data. (The size of the uncompressed data may have been saved
+  by the compressor for this purpose.) The next operation on this stream must
+  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+  is never required, but can be used to inform inflate that a faster routine
+  may be used for the single inflate() call.
+
+     If a preset dictionary is needed at this point (see inflateSetDictionary
+  below), inflate sets strm-adler to the adler32 checksum of the
+  dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise 
+  it sets strm->adler to the adler32 checksum of all output produced
+  so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
+  an error code as described below. At the end of the stream, inflate()
+  checks that its computed adler32 checksum is equal to that saved by the
+  compressor and returns Z_STREAM_END only if the checksum is correct.
+
+    inflate() returns Z_OK if some progress has been made (more input processed
+  or more output produced), Z_STREAM_END if the end of the compressed data has
+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+  corrupted (input stream not conforming to the zlib format or incorrect
+  adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
+  (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
+  enough memory, Z_BUF_ERROR if no progress is possible or if there was not
+  enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
+  case, the application may then call inflateSync to look for a good
+  compression block.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+   was inconsistent. In the error case, msg may be set but then points to a
+   static string (which must not be deallocated).
+*/
+
+                        /* Advanced functions */
+
+/*
+    The following functions are needed only in some special applications.
+*/
+
+/*   
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+                                     int  level,
+                                     int  method,
+                                     int  windowBits,
+                                     int  memLevel,
+                                     int  strategy));
+
+     This is another version of deflateInit with more compression options. The
+   fields next_in, zalloc, zfree and opaque must be initialized before by
+   the caller.
+
+     The method parameter is the compression method. It must be Z_DEFLATED in
+   this version of the library.
+
+     The windowBits parameter is the base two logarithm of the window size
+   (the size of the history buffer).  It should be in the range 8..15 for this
+   version of the library. Larger values of this parameter result in better
+   compression at the expense of memory usage. The default value is 15 if
+   deflateInit is used instead.
+
+     The memLevel parameter specifies how much memory should be allocated
+   for the internal compression state. memLevel=1 uses minimum memory but
+   is slow and reduces compression ratio; memLevel=9 uses maximum memory
+   for optimal speed. The default value is 8. See zconf.h for total memory
+   usage as a function of windowBits and memLevel.
+
+     The strategy parameter is used to tune the compression algorithm. Use the
+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+   filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
+   string match).  Filtered data consists mostly of small values with a
+   somewhat random distribution. In this case, the compression algorithm is
+   tuned to compress them better. The effect of Z_FILTERED is to force more
+   Huffman coding and less string matching; it is somewhat intermediate
+   between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
+   the compression ratio but not the correctness of the compressed output even
+   if it is not set appropriately.
+
+      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+   method). msg is set to null if there is no error message.  deflateInit2 does
+   not perform any compression: this will be done by deflate().
+*/
+                            
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the compression dictionary from the given byte sequence
+   without producing any compressed output. This function must be called
+   immediately after deflateInit, deflateInit2 or deflateReset, before any
+   call of deflate. The compressor and decompressor must use exactly the same
+   dictionary (see inflateSetDictionary).
+
+     The dictionary should consist of strings (byte sequences) that are likely
+   to be encountered later in the data to be compressed, with the most commonly
+   used strings preferably put towards the end of the dictionary. Using a
+   dictionary is most useful when the data to be compressed is short and can be
+   predicted with good accuracy; the data can then be compressed better than
+   with the default empty dictionary.
+
+     Depending on the size of the compression data structures selected by
+   deflateInit or deflateInit2, a part of the dictionary may in effect be
+   discarded, for example if the dictionary is larger than the window size in
+   deflate or deflate2. Thus the strings most likely to be useful should be
+   put at the end of the dictionary, not at the front.
+
+     Upon return of this function, strm->adler is set to the Adler32 value
+   of the dictionary; the decompressor may later use this value to determine
+   which dictionary has been used by the compressor. (The Adler32 value
+   applies to the whole dictionary even if only a subset of the dictionary is
+   actually used by the compressor.)
+
+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent (for example if deflate has already been called for this stream
+   or if the compression method is bsort). deflateSetDictionary does not
+   perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+                                    z_streamp source));
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when several compression strategies will be
+   tried, for example when there are several ways of pre-processing the input
+   data with a filter. The streams that will be discarded should then be freed
+   by calling deflateEnd.  Note that deflateCopy duplicates the internal
+   compression state which can be quite large, so this strategy is slow and
+   can consume lots of memory.
+
+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being NULL). msg is left unchanged in both source and
+   destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to deflateEnd followed by deflateInit,
+   but does not free and reallocate all the internal compression state.
+   The stream will keep the same compression level and any other attributes
+   that may have been set by deflateInit2.
+
+      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+                                     int level,
+                                     int strategy));
+/*
+     Dynamically update the compression level and compression strategy.  The
+   interpretation of level and strategy is as in deflateInit2.  This can be
+   used to switch between compression and straight copy of the input data, or
+   to switch to a different kind of input data requiring a different
+   strategy. If the compression level is changed, the input available so far
+   is compressed with the old level (and may be flushed); the new level will
+   take effect only at the next call of deflate().
+
+     Before the call of deflateParams, the stream state must be set as for
+   a call of deflate(), since the currently available input may have to
+   be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+   if strm->avail_out was zero.
+*/
+
+/*   
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+                                     int  windowBits));
+
+     This is another version of inflateInit with an extra parameter. The
+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+   before by the caller.
+
+     The windowBits parameter is the base two logarithm of the maximum window
+   size (the size of the history buffer).  It should be in the range 8..15 for
+   this version of the library. The default value is 15 if inflateInit is used
+   instead. If a compressed stream with a larger window size is given as
+   input, inflate() will return with the error code Z_DATA_ERROR instead of
+   trying to allocate a larger window.
+
+      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
+   memLevel). msg is set to null if there is no error message.  inflateInit2
+   does not perform any decompression apart from reading the zlib header if
+   present: this will be done by inflate(). (So next_in and avail_in may be
+   modified, but next_out and avail_out are unchanged.)
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the decompression dictionary from the given uncompressed byte
+   sequence. This function must be called immediately after a call of inflate
+   if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
+   can be determined from the Adler32 value returned by this call of
+   inflate. The compressor and decompressor must use exactly the same
+   dictionary (see deflateSetDictionary).
+
+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+   expected one (incorrect Adler32 value). inflateSetDictionary does not
+   perform any decompression: this will be done by subsequent calls of
+   inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/* 
+    Skips invalid compressed data until a full flush point (see above the
+  description of deflate with Z_FULL_FLUSH) can be found, or until all
+  available input is skipped. No output is provided.
+
+    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+  if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+  case, the application may save the current current value of total_in which
+  indicates where valid compressed data was found. In the error case, the
+  application may repeatedly call inflateSync, providing more input each time,
+  until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to inflateEnd followed by inflateInit,
+   but does not free and reallocate all the internal decompression state.
+   The stream will keep attributes that may have been set by inflateInit2.
+
+      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+
+                        /* utility functions */
+
+/*
+     The following utility functions are implemented on top of the
+   basic stream-oriented functions. To simplify the interface, some
+   default options are assumed (compression level and memory usage,
+   standard memory allocation functions). The source code of these
+   utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
+                                 const Bytef *source, uLong sourceLen));
+/*
+     Compresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be at least 0.1% larger than
+   sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
+   compressed buffer.
+     This function can be used to compress a whole file at once if the
+   input file is mmap'ed.
+     compress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
+                                  const Bytef *source, uLong sourceLen,
+                                  int level));
+/*
+     Compresses the source buffer into the destination buffer. The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer. Upon entry, destLen is the total size of the
+   destination buffer, which must be at least 0.1% larger than sourceLen plus
+   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
+                                   const Bytef *source, uLong sourceLen));
+/*
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be large enough to hold the
+   entire uncompressed data. (The size of the uncompressed data must have
+   been saved previously by the compressor and transmitted to the decompressor
+   by some mechanism outside the scope of this compression library.)
+   Upon exit, destLen is the actual size of the compressed buffer.
+     This function can be used to decompress a whole file at once if the
+   input file is mmap'ed.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile ZEXPORT gzopen  OF((const char *path, const char *mode));
+/*
+     Opens a gzip (.gz) file for reading or writing. The mode parameter
+   is as in fopen ("rb" or "wb") but can also include a compression level
+   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+   Huffman only compression as in "wb1h". (See the description
+   of deflateInit2 for more information about the strategy parameter.)
+
+     gzopen can be used to read a file which is not in gzip format; in this
+   case gzread will directly read from the file without decompression.
+
+     gzopen returns NULL if the file could not be opened or if there was
+   insufficient memory to allocate the (de)compression state; errno
+   can be checked to distinguish the two cases (if errno is zero, the
+   zlib error is Z_MEM_ERROR).  */
+
+ZEXTERN gzFile ZEXPORT gzdopen  OF((int fd, const char *mode));
+/*
+     gzdopen() associates a gzFile with the file descriptor fd.  File
+   descriptors are obtained from calls like open, dup, creat, pipe or
+   fileno (in the file has been previously opened with fopen).
+   The mode parameter is as in gzopen.
+     The next call of gzclose on the returned gzFile will also close the
+   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+     gzdopen returns NULL if there was insufficient memory to allocate
+   the (de)compression state.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+     Dynamically update the compression level or strategy. See the description
+   of deflateInit2 for the meaning of these parameters.
+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+   opened for writing.
+*/
+
+ZEXTERN int ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));
+/*
+     Reads the given number of uncompressed bytes from the compressed file.
+   If the input file was not in gzip format, gzread copies the given number
+   of bytes into the buffer.
+     gzread returns the number of uncompressed bytes actually read (0 for
+   end of file, -1 for error). */
+
+ZEXTERN int ZEXPORT    gzwrite OF((gzFile file, 
+                                  const voidp buf, unsigned len));
+/*
+     Writes the given number of uncompressed bytes into the compressed file.
+   gzwrite returns the number of uncompressed bytes actually written
+   (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORTVA   gzprintf OF((gzFile file, const char *format, ...));
+/*
+     Converts, formats, and writes the args to the compressed file under
+   control of the format string, as in fprintf. gzprintf returns the number of
+   uncompressed bytes actually written (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+      Writes the given null-terminated string to the compressed file, excluding
+   the terminating null character.
+      gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+      Reads bytes from the compressed file until len-1 characters are read, or
+   a newline character is read and transferred to buf, or an end-of-file
+   condition is encountered.  The string is then terminated with a null
+   character.
+      gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int ZEXPORT    gzputc OF((gzFile file, int c));
+/*
+      Writes c, converted to an unsigned char, into the compressed file.
+   gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT    gzgetc OF((gzFile file));
+/*
+      Reads one byte from the compressed file. gzgetc returns this byte
+   or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT    gzflush OF((gzFile file, int flush));
+/*
+     Flushes all pending output into the compressed file. The parameter
+   flush is as in the deflate() function. The return value is the zlib
+   error number (see function gzerror below). gzflush returns Z_OK if
+   the flush parameter is Z_FINISH and all output could be flushed.
+     gzflush should be called only when strictly necessary because it can
+   degrade compression.
+*/
+
+ZEXTERN z_off_t ZEXPORT    gzseek OF((gzFile file,
+                                     z_off_t offset, int whence));
+/* 
+      Sets the starting position for the next gzread or gzwrite on the
+   given compressed file. The offset represents a number of bytes in the
+   uncompressed data stream. The whence parameter is defined as in lseek(2);
+   the value SEEK_END is not supported.
+     If the file is opened for reading, this function is emulated but can be
+   extremely slow. If the file is opened for writing, only forward seeks are
+   supported; gzseek then compresses a sequence of zeroes up to the new
+   starting position.
+
+      gzseek returns the resulting offset location as measured in bytes from
+   the beginning of the uncompressed stream, or -1 in case of error, in
+   particular if the file is opened for writing and the new starting position
+   would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
+/*
+     Rewinds the given file. This function is supported only for reading.
+
+   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
+/*
+     Returns the starting position for the next gzread or gzwrite on the
+   given compressed file. This position represents a number of bytes in the
+   uncompressed data stream.
+
+   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+     Returns 1 when EOF has previously been detected reading the given
+   input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
+/*
+     Flushes all pending output if necessary, closes the compressed file
+   and deallocates all the (de)compression state. The return value is the zlib
+   error number (see function gzerror below).
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+     Returns the error message for the last error which occurred on the
+   given compressed file. errnum is set to zlib error number. If an
+   error occurred in the file system and not in the compression library,
+   errnum is set to Z_ERRNO and the application may consult errno
+   to get the exact error code.
+*/
+
+                        /* checksum functions */
+
+/*
+     These functions are not related to compression but are exported
+   anyway because they might be useful in applications using the
+   compression library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+
+/*
+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+   return the updated checksum. If buf is NULL, this function returns
+   the required initial value for the checksum.
+   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+   much faster. Usage example:
+
+     uLong adler = adler32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       adler = adler32(adler, buffer, length);
+     }
+     if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
+/*
+     Update a running crc with the bytes buf[0..len-1] and return the updated
+   crc. If buf is NULL, this function returns the required initial value
+   for the crc. Pre- and post-conditioning (one's complement) is performed
+   within this function so it shouldn't be done by the application.
+   Usage example:
+
+     uLong crc = crc32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       crc = crc32(crc, buffer, length);
+     }
+     if (crc != original_crc) error();
+*/
+
+
+                        /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+                                     const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+                                     const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
+                                      int windowBits, int memLevel,
+                                      int strategy, const char *version,
+                                      int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
+                                      const char *version, int stream_size));
+#define deflateInit(strm, level) \
+        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+                      (strategy),           ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
+    struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN const char   * ZEXPORT zError           OF((int err));
+ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN const uLongf * ZEXPORT get_crc_table    OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZLIB_H */
diff --git a/zlib/zutil.c b/zlib/zutil.c
new file mode 100644 (file)
index 0000000..2696ae8
--- /dev/null
@@ -0,0 +1,225 @@
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: zutil.c 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#include "zutil.h"
+
+struct internal_state      {int dummy;}; /* for buggy compilers */
+
+#ifndef STDC
+extern void exit OF((int));
+#endif
+
+const char *z_errmsg[10] = {
+"need dictionary",     /* Z_NEED_DICT       2  */
+"stream end",          /* Z_STREAM_END      1  */
+"",                    /* Z_OK              0  */
+"file error",          /* Z_ERRNO         (-1) */
+"stream error",        /* Z_STREAM_ERROR  (-2) */
+"data error",          /* Z_DATA_ERROR    (-3) */
+"insufficient memory", /* Z_MEM_ERROR     (-4) */
+"buffer error",        /* Z_BUF_ERROR     (-5) */
+"incompatible version",/* Z_VERSION_ERROR (-6) */
+""};
+
+
+const char * ZEXPORT zlibVersion()
+{
+    return ZLIB_VERSION;
+}
+
+#ifdef DEBUG
+
+#  ifndef verbose
+#    define verbose 0
+#  endif
+int z_verbose = verbose;
+
+void z_error (m)
+    char *m;
+{
+    fprintf(stderr, "%s\n", m);
+    exit(1);
+}
+#endif
+
+/* exported to allow conversion of error code to string for compress() and
+ * uncompress()
+ */
+const char * ZEXPORT zError(err)
+    int err;
+{
+    return ERR_MSG(err);
+}
+
+
+#ifndef HAVE_MEMCPY
+
+void zmemcpy(dest, source, len)
+    Bytef* dest;
+    const Bytef* source;
+    uInt  len;
+{
+    if (len == 0) return;
+    do {
+        *dest++ = *source++; /* ??? to be unrolled */
+    } while (--len != 0);
+}
+
+int zmemcmp(s1, s2, len)
+    const Bytef* s1;
+    const Bytef* s2;
+    uInt  len;
+{
+    uInt j;
+
+    for (j = 0; j < len; j++) {
+        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+    }
+    return 0;
+}
+
+void zmemzero(dest, len)
+    Bytef* dest;
+    uInt  len;
+{
+    if (len == 0) return;
+    do {
+        *dest++ = 0;  /* ??? to be unrolled */
+    } while (--len != 0);
+}
+#endif
+
+#ifdef __TURBOC__
+#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
+/* Small and medium model in Turbo C are for now limited to near allocation
+ * with reduced MAX_WBITS and MAX_MEM_LEVEL
+ */
+#  define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+    voidpf org_ptr;
+    voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+    voidpf buf = opaque; /* just to make some compilers happy */
+    ulg bsize = (ulg)items*size;
+
+    /* If we allocate less than 65520 bytes, we assume that farmalloc
+     * will return a usable pointer which doesn't have to be normalized.
+     */
+    if (bsize < 65520L) {
+        buf = farmalloc(bsize);
+        if (*(ush*)&buf != 0) return buf;
+    } else {
+        buf = farmalloc(bsize + 16L);
+    }
+    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+    table[next_ptr].org_ptr = buf;
+
+    /* Normalize the pointer to seg:0 */
+    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+    *(ush*)&buf = 0;
+    table[next_ptr++].new_ptr = buf;
+    return buf;
+}
+
+void  zcfree (voidpf opaque, voidpf ptr)
+{
+    int n;
+    if (*(ush*)&ptr != 0) { /* object < 64K */
+        farfree(ptr);
+        return;
+    }
+    /* Find the original pointer */
+    for (n = 0; n < next_ptr; n++) {
+        if (ptr != table[n].new_ptr) continue;
+
+        farfree(table[n].org_ptr);
+        while (++n < next_ptr) {
+            table[n-1] = table[n];
+        }
+        next_ptr--;
+        return;
+    }
+    ptr = opaque; /* just to make some compilers happy */
+    Assert(0, "zcfree: ptr not found");
+}
+#endif
+#endif /* __TURBOC__ */
+
+
+#if defined(M_I86) && !defined(__32BIT__)
+/* Microsoft C in 16-bit mode */
+
+#  define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+#  define _halloc  halloc
+#  define _hfree   hfree
+#endif
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+    if (opaque) opaque = 0; /* to make compiler happy */
+    return _halloc((long)items, size);
+}
+
+void  zcfree (voidpf opaque, voidpf ptr)
+{
+    if (opaque) opaque = 0; /* to make compiler happy */
+    _hfree(ptr);
+}
+
+#endif /* MSC */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp  calloc OF((uInt items, uInt size));
+extern void   free   OF((voidpf ptr));
+#endif
+
+voidpf zcalloc (opaque, items, size)
+    voidpf opaque;
+    unsigned items;
+    unsigned size;
+{
+    if (opaque) items += size - size; /* make compiler happy */
+    return (voidpf)calloc(items, size);
+}
+
+void  zcfree (opaque, ptr)
+    voidpf opaque;
+    voidpf ptr;
+{
+    free(ptr);
+    if (opaque) return; /* make compiler happy */
+}
+
+#endif /* MY_ZCALLOC */
diff --git a/zlib/zutil.h b/zlib/zutil.h
new file mode 100644 (file)
index 0000000..3a7eb52
--- /dev/null
@@ -0,0 +1,220 @@
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id: zutil.h 1262 2002-06-29 13:31:13Z dshaw $ */
+
+#ifndef _Z_UTIL_H
+#define _Z_UTIL_H
+
+#include "zlib.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+typedef unsigned char  uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long  ulg;
+
+extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
+/* (size given to avoid silly warnings with Visual C++) */
+
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+
+#define ERR_RETURN(strm,err) \
+  return (strm->msg = (char*)ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+        /* common constants */
+
+#ifndef DEF_WBITS
+#  define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES    2
+/* The three kinds of block type */
+
+#define MIN_MATCH  3
+#define MAX_MATCH  258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+        /* target dependencies */
+
+#ifdef MSDOS
+#  define OS_CODE  0x00
+#  if defined(__TURBOC__) || defined(__BORLANDC__)
+#    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+       /* Allow compilation with ANSI keywords only enabled */
+       void _Cdecl farfree( void *block );
+       void *_Cdecl farmalloc( unsigned long nbytes );
+#    else
+#     include <alloc.h>
+#    endif
+#  else /* MSC or DJGPP */
+#    include <malloc.h>
+#  endif
+#endif
+
+#ifdef OS2
+#  define OS_CODE  0x06
+#endif
+
+#ifdef WIN32 /* Window 95 & Windows NT */
+#  define OS_CODE  0x0b
+#endif
+
+#if defined(VAXC) || defined(VMS)
+#  define OS_CODE  0x02
+#  define F_OPEN(name, mode) \
+     fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#ifdef AMIGA
+#  define OS_CODE  0x01
+#endif
+
+#if defined(ATARI) || defined(atarist)
+#  define OS_CODE  0x05
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+#  define OS_CODE  0x07
+#  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+#    include <unix.h> /* for fdopen */
+#  else
+#    ifndef fdopen
+#      define fdopen(fd,mode) NULL /* No fdopen() */
+#    endif
+#  endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+#  define OS_CODE  0x0F
+#endif
+
+#ifdef TOPS20
+#  define OS_CODE  0x0a
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+#  define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600))
+#  define fdopen(fd,type)  _fdopen(fd,type)
+#endif
+
+
+        /* Common defaults */
+
+#ifndef OS_CODE
+#  define OS_CODE  0x03  /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+#  define F_OPEN(name, mode) fopen((name), (mode))
+#endif
+
+         /* functions */
+
+#ifdef HAVE_STRERROR
+   extern char *strerror OF((int));
+#  define zstrerror(errnum) strerror(errnum)
+#else
+#  define zstrerror(errnum) ""
+#endif
+
+#if defined(pyr)
+#  define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+  * You may have to use the same strategy for Borland C (untested).
+  * The __SC__ check is for Symantec.
+  */
+#  define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+#  define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+#    define zmemcpy _fmemcpy
+#    define zmemcmp _fmemcmp
+#    define zmemzero(dest, len) _fmemset(dest, 0, len)
+#  else
+#    define zmemcpy memcpy
+#    define zmemcmp memcmp
+#    define zmemzero(dest, len) memset(dest, 0, len)
+#  endif
+#else
+   extern void zmemcpy  OF((Bytef* dest, const Bytef* source, uInt len));
+   extern int  zmemcmp  OF((const Bytef* s1, const Bytef* s2, uInt len));
+   extern void zmemzero OF((Bytef* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef DEBUG
+#  include <stdio.h>
+   extern int z_verbose;
+   extern void z_error    OF((char *m));
+#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+#  define Trace(x) {if (z_verbose>=0) fprintf x ;}
+#  define Tracev(x) {if (z_verbose>0) fprintf x ;}
+#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}
+#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
+#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
+#else
+#  define Assert(cond,msg)
+#  define Trace(x)
+#  define Tracev(x)
+#  define Tracevv(x)
+#  define Tracec(c,x)
+#  define Tracecv(c,x)
+#endif
+
+
+typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
+                                      uInt len));
+voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
+void   zcfree  OF((voidpf opaque, voidpf ptr));
+
+#define ZALLOC(strm, items, size) \
+           (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+#endif /* _Z_UTIL_H */